ZGlmZiAtLWdpdCBhL0RvYy9NYWtlZmlsZS5kZXBzIGIvRG9jL01ha2VmaWxlLmRlcHMKaW5kZXggYzhlMDY0Mi4uNTY1NGI2YyAxMDA2NDQKLS0tIGEvRG9jL01ha2VmaWxlLmRlcHMKKysrIGIvRG9jL01ha2VmaWxlLmRlcHMKQEAgLTMyOSw2ICszMjksNyBAQAogCWxpYi9saWJtbWFwLnRleCBcCiAJbGliL3RraW50ZXIudGV4IFwKIAlsaWIvbGlidHVydGxlLnRleCBcCisJbGliL2xpYnRhcmZpbGUudGV4IFwKIAlsaWIvbGliY2ZncGFyc2VyLnRleAogCiAjIExhVGVYIHNvdXJjZSBmaWxlcyBmb3IgTWFjaW50b3NoIExpYnJhcnkgTW9kdWxlcy4KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliLnRleCBiL0RvYy9saWIvbGliLnRleAppbmRleCAwZDIwMmFjLi5mZjRmZjk4IDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYi50ZXgKKysrIGIvRG9jL2xpYi9saWIudGV4CkBAIC0xMjgsNiArMTI4LDcgQEAKIFxpbnB1dHtsaWJjZmdwYXJzZXJ9CiBcaW5wdXR7bGliZmlsZWlucHV0fQogXGlucHV0e2xpYnhyZWFkbGluZXN9CitcaW5wdXR7bGlidGFyZmlsZX0KIFxpbnB1dHtsaWJjYWxlbmRhcn0KIFxpbnB1dHtsaWJjbWR9CiBcaW5wdXR7bGlic2hsZXh9CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnRhcmZpbGUudGV4IGIvRG9jL2xpYi9saWJ0YXJmaWxlLnRleApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDVhOWY0Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jL2xpYi9saWJ0YXJmaWxlLnRleApAQCAtMCwwICsxLDQ1MCBAQAorXHNlY3Rpb257XG1vZHVsZXt0YXJmaWxlfSAtLS0gUmVhZCBhbmQgd3JpdGUgdGFyIGFyY2hpdmUgZmlsZXN9CisKK1xkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXt0YXJmaWxlfQorXG1vZHVsZXN5bm9wc2lze1JlYWQgYW5kIHdyaXRlIHRhci1mb3JtYXQgYXJjaGl2ZSBmaWxlcy59CitcdmVyc2lvbmFkZGVkezIuM30KKworXG1vZHVsZWF1dGhvcntMYXJzIEd1c3RcImFiZWx9e2xhcnNAZ3VzdGFlYmVsLmRlfQorXHNlY3Rpb25hdXRob3J7TGFycyBHdXN0XCJhYmVsfXtsYXJzQGd1c3RhZWJlbC5kZX0KKworVGhlIFxtb2R1bGV7dGFyZmlsZX0gbW9kdWxlIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHJlYWQgYW5kIGNyZWF0ZSB0YXIgYXJjaGl2ZXMuCitTb21lIGZhY3RzIGFuZCBmaWd1cmVzOgorCitcYmVnaW57aXRlbWl6ZX0KK1xpdGVtIHJlYWRzIGFuZCB3cml0ZXMgXG1vZHVsZXtnemlwfSBhbmQgXG1vZHVsZXtiemlwMn0gY29tcHJlc3NlZCBhcmNoaXZlcy4KK1xpdGVtIGNyZWF0ZXMgUE9TSVggMTAwMy4xLTE5OTAgY29tcGxpYW50IG9yIEdOVSB0YXIgY29tcGF0aWJsZSBhcmNoaXZlcy4KK1xpdGVtIHJlYWRzIEdOVSB0YXIgZXh0ZW5zaW9ucyBcZW1waHtsb25nbmFtZX0sIFxlbXBoe2xvbmdsaW5rfSBhbmQKKyAgICAgIFxlbXBoe3NwYXJzZX0uCitcaXRlbSBzdG9yZXMgcGF0aG5hbWVzIG9mIHVubGltaXRlZCBsZW5ndGggdXNpbmcgR05VIHRhciBleHRlbnNpb25zLgorXGl0ZW0gaGFuZGxlcyBkaXJlY3RvcmllcywgcmVndWxhciBmaWxlcywgaGFyZGxpbmtzLCBzeW1ib2xpYyBsaW5rcywgZmlmb3MsCisgICAgICBjaGFyYWN0ZXIgZGV2aWNlcyBhbmQgYmxvY2sgZGV2aWNlcyBhbmQgaXMgYWJsZSB0byBhY3F1aXJlIGFuZAorICAgICAgcmVzdG9yZSBmaWxlIGluZm9ybWF0aW9uIGxpa2UgdGltZXN0YW1wLCBhY2Nlc3MgcGVybWlzc2lvbnMgYW5kIG93bmVyLgorXGl0ZW0gY2FuIGhhbmRsZSB0YXBlIGRldmljZXMuCitcZW5ke2l0ZW1pemV9CisKK1xiZWdpbntmdW5jZGVzY317b3Blbn17XG9wdGlvbmFse25hbWVcb3B0aW9uYWx7LCBtb2RlCisgICAgICAgICAgICAgICAgICAgICAgIFxvcHRpb25hbHssIGZpbGVvYmpcb3B0aW9uYWx7LCBidWZzaXplfX19fX0KKyAgICBSZXR1cm4gYSBcY2xhc3N7VGFyRmlsZX0gb2JqZWN0IGZvciB0aGUgcGF0aG5hbWUgXHZhcntuYW1lfS4KKyAgICBGb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gXGNsYXNze1RhckZpbGV9IG9iamVjdHMsCisgICAgc2VlIFxjaXRldGl0bGV7VGFyRmlsZSBPYmplY3RzfSAoc2VjdGlvbiBccmVme3RhcmZpbGUtb2JqZWN0c30pLgorCisgICAgXHZhcnttb2RlfSBoYXMgdG8gYmUgYSBzdHJpbmcgb2YgdGhlIGZvcm0gXGNvZGV7J2ZpbGVtb2RlWzpjb21wcmVzc2lvbl0nfSwKKyAgICBpdCBkZWZhdWx0cyB0byBcY29kZXsncid9LiBIZXJlIGlzIGEgZnVsbCBsaXN0IG9mIG1vZGUgY29tYmluYXRpb25zOgorCisgICAgXGJlZ2lue3RhYmxlaWl9e2N8bH17Y29kZX17bW9kZX17YWN0aW9ufQorICAgIFxsaW5laWl7J3InfXtPcGVuIGZvciByZWFkaW5nIHdpdGggdHJhbnNwYXJlbnQgY29tcHJlc3Npb24gKHJlY29tbWVuZGVkKS59CisgICAgXGxpbmVpaXsncjonfXtPcGVuIGZvciByZWFkaW5nIGV4Y2x1c2l2ZWx5IHdpdGhvdXQgY29tcHJlc3Npb24ufQorICAgIFxsaW5laWl7J3I6Z3onfXtPcGVuIGZvciByZWFkaW5nIHdpdGggZ3ppcCBjb21wcmVzc2lvbi59CisgICAgXGxpbmVpaXsncjpiejInfXtPcGVuIGZvciByZWFkaW5nIHdpdGggYnppcDIgY29tcHJlc3Npb24ufQorICAgIFxsaW5laWl7J2EnIG9yICdhOid9e09wZW4gZm9yIGFwcGVuZGluZyB3aXRoIG5vIGNvbXByZXNzaW9uLn0KKyAgICBcbGluZWlpeyd3JyBvciAndzonfXtPcGVuIGZvciB1bmNvbXByZXNzZWQgd3JpdGluZy59CisgICAgXGxpbmVpaXsndzpneid9e09wZW4gZm9yIGd6aXAgY29tcHJlc3NlZCB3cml0aW5nLn0KKyAgICBcbGluZWlpeyd3OmJ6Mid9e09wZW4gZm9yIGJ6aXAyIGNvbXByZXNzZWQgd3JpdGluZy59CisgICAgXGVuZHt0YWJsZWlpfQorCisgICAgTm90ZSB0aGF0IFxjb2RleydhOmd6J30gb3IgXGNvZGV7J2E6YnoyJ30gaXMgbm90IHBvc3NpYmxlLgorICAgIElmIFx2YXJ7bW9kZX0gaXMgbm90IHN1aXRhYmxlIHRvIG9wZW4gYSBjZXJ0YWluIChjb21wcmVzc2VkKSBmaWxlIGZvcgorICAgIHJlYWRpbmcsIFxleGNlcHRpb257UmVhZEVycm9yfSBpcyByYWlzZWQuIFVzZSBcdmFye21vZGV9IFxjb2RleydyJ30gdG8KKyAgICBhdm9pZCB0aGlzLiAgSWYgYSBjb21wcmVzc2lvbiBtZXRob2QgaXMgbm90IHN1cHBvcnRlZCwKKyAgICBcZXhjZXB0aW9ue0NvbXByZXNzaW9uRXJyb3J9IGlzIHJhaXNlZC4KKworICAgIElmIFx2YXJ7ZmlsZW9ian0gaXMgc3BlY2lmaWVkLCBpdCBpcyB1c2VkIGFzIGFuIGFsdGVybmF0aXZlIHRvCisgICAgYSBmaWxlIG9iamVjdCBvcGVuZWQgZm9yIFx2YXJ7bmFtZX0uCisKKyAgICBGb3Igc3BlY2lhbCBwdXJwb3NlcywgdGhlcmUgaXMgYSBzZWNvbmQgZm9ybWF0IGZvciBcdmFye21vZGV9OgorICAgIFxjb2RleydmaWxlbW9kZXxbY29tcHJlc3Npb25dJ30uICBcY29kZXtvcGVufSB3aWxsIHJldHVybiBhIFxjbGFzc3tUYXJGaWxlfQorICAgIG9iamVjdCB0aGF0IHByb2Nlc3NlcyBpdHMgZGF0YSBhcyBhIHN0cmVhbSBvZiBibG9ja3MuIE5vIHJhbmRvbQorICAgIHNlZWtpbmcgd2lsbCBiZSBkb25lIG9uIHRoZSBmaWxlLiBJZiBnaXZlbiwgXHZhcntmaWxlb2JqfSBtYXkgYmUgYW55CisgICAgb2JqZWN0IHRoYXQgaGFzIGEgXGNvZGV7cmVhZCgpfSByZXNwLiBcY29kZXt3cml0ZSgpfSBtZXRob2QuCisgICAgXHZhcntidWZzaXplfSBzcGVjaWZpZXMgdGhlIGJsb2Nrc2l6ZSBhbmQgZGVmYXVsdHMgdG8gXGNvZGV7MjAgKiA1MTJ9CisgICAgYnl0ZXMuIFVzZSB0aGlzIHZhcmlhbnQgaW4gY29tYmluYXRpb24gd2l0aCBlLmcuIFxjb2Rle3N5cy5zdGRpbn0sIGEgc29ja2V0CisgICAgZmlsZSBvYmplY3Qgb3IgYSB0YXBlIGRldmljZS4KKyAgICBIb3dldmVyLCBzdWNoIGEgXGNsYXNze1RhckZpbGV9IG9iamVjdCBpcyBsaW1pdGVkIGluIHRoYXQgaXQgZG9lcyBub3QgYWxsb3cKKyAgICB0byBiZSBhY2Nlc3NlZCByYW5kb21seSwgc2VlIFxjaXRldGl0bGV7RXhhbXBsZXN9IChzZWN0aW9uCisgICAgXHJlZnt0YXItZXhhbXBsZXN9KS4KKyAgICBUaGUgY3VycmVudGx5IHBvc3NpYmxlIG1vZGVzOgorCisgICAgXGJlZ2lue3RhYmxlaWl9e2N8bH17Y29kZX17bW9kZX17YWN0aW9ufQorICAgIFxsaW5laWl7J3J8J317T3BlbiBhIFxlbXBoe3N0cmVhbX0gb2YgdW5jb21wcmVzc2VkIHRhciBibG9ja3MgZm9yIHJlYWRpbmcufQorICAgIFxsaW5laWl7J3J8Z3onfXtPcGVuIGEgZ3ppcCBjb21wcmVzc2VkIFxlbXBoe3N0cmVhbX0gZm9yIHJlYWRpbmcufQorICAgIFxsaW5laWl7J3J8YnoyJ317T3BlbiBhIGJ6aXAyIGNvbXByZXNzZWQgXGVtcGh7c3RyZWFtfSBmb3IgcmVhZGluZy59CisgICAgXGxpbmVpaXsnd3wnfXtPcGVuIGFuIHVuY29tcHJlc3NlZCBcZW1waHtzdHJlYW19IGZvciB3cml0aW5nLn0KKyAgICBcbGluZWlpeyd3fGd6J317T3BlbiBhbiBnemlwIGNvbXByZXNzZWQgXGVtcGh7c3RyZWFtfSBmb3Igd3JpdGluZy59CisgICAgXGxpbmVpaXsnd3xiejInfXtPcGVuIGFuIGJ6aXAyIGNvbXByZXNzZWQgXGVtcGh7c3RyZWFtfSBmb3Igd3JpdGluZy59CisgICAgXGVuZHt0YWJsZWlpfQorXGVuZHtmdW5jZGVzY30KKworXGJlZ2lue2NsYXNzZGVzYyp9e1RhckZpbGV9CisgICAgQ2xhc3MgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcgdGFyIGFyY2hpdmVzLiBEbyBub3QgdXNlIHRoaXMKKyAgICBjbGFzcyBkaXJlY3RseSwgYmV0dGVyIHVzZSBcZnVuY3Rpb257b3BlbigpfSBpbnN0ZWFkLgorICAgIFNlZSBcY2l0ZXRpdGxle1RhckZpbGUgT2JqZWN0c30gKHNlY3Rpb24gXHJlZnt0YXJmaWxlLW9iamVjdHN9KS4KK1xlbmR7Y2xhc3NkZXNjKn0KKworXGJlZ2lue2Z1bmNkZXNjfXtpc190YXJmaWxlfXtuYW1lfQorICAgIFJldHVybiBcY29kZXtUcnVlfSBpZiBcdmFye25hbWV9IGlzIGEgdGFyIGFyY2hpdmUgZmlsZSwgdGhhdCB0aGUKKyAgICBcbW9kdWxle3RhcmZpbGV9IG1vZHVsZSBjYW4gcmVhZC4KK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntjbGFzc2Rlc2N9e1RhckZpbGVDb21wYXR9e2ZpbGVuYW1lXG9wdGlvbmFseywgbW9kZVxvcHRpb25hbHssCisgICAgY29tcHJlc3Npb259fX0KKworICAgIENsYXNzIGZvciBsaW1pdGVkIGFjY2VzcyB0byB0YXIgYXJjaGl2ZXMgd2l0aCBhIFxjb2Rle3ppcGZpbGV9LWxpa2UKKyAgICBpbnRlcmZhY2UuIFBsZWFzZSBjb25zdWx0IHRoZSBkb2N1bWVudGF0aW9uIG9mIFxjb2Rle3ppcGZpbGV9IGZvciBtb3JlCisgICAgZGV0YWlscy4KKyAgICBcY29kZXtjb21wcmVzc2lvbn0gbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25zdGFudHM6CisgICAgXGJlZ2lue2RhdGFkZXNjfXtUQVJfUExBSU59CisgICAgICAgIENvbnN0YW50IGZvciBhbiB1bmNvbXByZXNzZWQgdGFyIGFyY2hpdmUuCisgICAgXGVuZHtkYXRhZGVzY30KKyAgICBcYmVnaW57ZGF0YWRlc2N9e1RBUl9HWklQUEVEfQorICAgICAgICBDb25zdGFudCBmb3IgYSBcY29kZXtnemlwfSBjb21wcmVzc2VkIHRhciBhcmNoaXZlLgorICAgIFxlbmR7ZGF0YWRlc2N9CitcZW5ke2NsYXNzZGVzY30KKworXGJlZ2lue2V4Y2Rlc2N9e1RhckVycm9yfQorICAgIEJhc2UgY2xhc3MgZm9yIGFsbCBcbW9kdWxle3RhcmZpbGV9IGV4Y2VwdGlvbnMuCitcZW5ke2V4Y2Rlc2N9CisKK1xiZWdpbntleGNkZXNjfXtSZWFkRXJyb3J9CisgICAgSXMgcmFpc2VkIHdoZW4gYSB0YXIgYXJjaGl2ZSBpcyBvcGVuZWQsIHRoYXQgZWl0aGVyIGNhbm5vdCBiZSBoYW5kbGVkIGJ5CisgICAgdGhlIFxtb2R1bGV7dGFyZmlsZX0gbW9kdWxlIG9yIGlzIHNvbWVob3cgaW52YWxpZC4KK1xlbmR7ZXhjZGVzY30KKworXGJlZ2lue2V4Y2Rlc2N9e0NvbXByZXNzaW9uRXJyb3J9CisgICAgSXMgcmFpc2VkIHdoZW4gYSBjb21wcmVzc2lvbiBtZXRob2QgaXMgbm90IHN1cHBvcnRlZCBvciB3aGVuIHRoZSBkYXRhCisgICAgY2Fubm90IGJlIGRlY29kZWQgcHJvcGVybHkuCitcZW5ke2V4Y2Rlc2N9CisKK1xiZWdpbntleGNkZXNjfXtTdHJlYW1FcnJvcn0KKyAgICBJcyByYWlzZWQgZm9yIHRoZSBsaW1pdGF0aW9ucyB0aGF0IGFyZSB0eXBpY2FsIGZvciBzdHJlYW0tbGlrZQorICAgIFxjbGFzc3tUYXJGaWxlfSBvYmplY3RzLgorXGVuZHtleGNkZXNjfQorCitcYmVnaW57ZXhjZGVzY317RXh0cmFjdEVycm9yfQorICAgIElzIHJhaXNlZCBmb3IgXGVtcGh7bm9uLWZhdGFsfSBlcnJvcnMgd2hlbiB1c2luZyBcbWV0aG9ke2V4dHJhY3QoKX0sIGJ1dAorICAgIG9ubHkgaWYgXG1lbWJlcntUYXJGaWxlLmVycm9ybGV2ZWx9XGNvZGV7ID09IDJ9LgorXGVuZHtleGNkZXNjfQorCitcYmVnaW57c2VlYWxzb30KKyAgICBcc2VlbW9kdWxlW21vZHVsZS16aXBmaWxlXXt6aXBmaWxlfXtEb2N1bWVudGF0aW9uIG9mIHRoZSBcY29kZXt6aXBmaWxlfQorICAgIHN0YW5kYXJkIG1vZHVsZS59CisKKyAgICBcc2VldGl0bGVbaHR0cDovL3d3dy5nbnUub3JnL21hbnVhbC90YXIvaHRtbF9jaGFwdGVyL3Rhcl84Lmh0bWxcI1NFQzExOF0KKyAgICB7R05VIHRhciBtYW51YWwsIFN0YW5kYXJkIFNlY3Rpb259e0RvY3VtZW50YXRpb24gZm9yIHRhciBhcmNoaXZlIGZpbGVzLAorICAgIGluY2x1ZGluZyBHTlUgdGFyIGV4dGVuc2lvbnMufQorXGVuZHtzZWVhbHNvfQorCislLS0tLS0tLS0tLS0tLS0tLS0KKyUgVGFyRmlsZSBPYmplY3RzCislLS0tLS0tLS0tLS0tLS0tLS0KKworXHN1YnNlY3Rpb257VGFyRmlsZSBPYmplY3RzIFxsYWJlbHt0YXJmaWxlLW9iamVjdHN9fQorCitUaGUgXGNsYXNze1RhckZpbGV9IG9iamVjdCBwcm92aWRlcyBhbiBpbnRlcmZhY2UgdG8gYSB0YXIgYXJjaGl2ZS4gQSB0YXIKK2FyY2hpdmUgaXMgYSBzZXF1ZW5jZSBvZiBibG9ja3MuIEFuIGFyY2hpdmUgbWVtYmVyIChhIHN0b3JlZCBmaWxlKSBpcyBtYWRlIHVwCitvZiBhIGhlYWRlciBibG9jayBmb2xsb3dlZCBieSBkYXRhIGJsb2Nrcy4gSXQgaXMgcG9zc2libGUsIHRvIHN0b3JlIGEgZmlsZSBpbiBhCit0YXIgYXJjaGl2ZSBzZXZlcmFsIHRpbWVzLiBFYWNoIGFyY2hpdmUgbWVtYmVyIGlzIHJlcHJlc2VudGVkIGJ5IGEKK1xjbGFzc3tUYXJJbmZvfSBvYmplY3QsIHNlZSBcY2l0ZXRpdGxle1RhckluZm8gT2JqZWN0c30gKHNlY3Rpb24KK1xyZWZ7dGFyaW5mby1vYmplY3RzfSkgZm9yIGRldGFpbHMuCisKK1xiZWdpbntjbGFzc2Rlc2N9e1RhckZpbGV9e1xvcHRpb25hbHtuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICBcb3B0aW9uYWx7LCBtb2RlXG9wdGlvbmFseywgZmlsZW9ian19fX0KKyAgICBPcGVuIGFuIFxlbXBoeyh1bmNvbXByZXNzZWQpfSB0YXIgYXJjaGl2ZSBcdmFye25hbWV9LgorICAgIFx2YXJ7bW9kZX0gaXMgZWl0aGVyIFxjb2RleydyJ30gdG8gcmVhZCBmcm9tIGFuIGV4aXN0aW5nIGFyY2hpdmUsCisgICAgXGNvZGV7J2EnfSB0byBhcHBlbmQgZGF0YSB0byBhbiBleGlzdGluZyBmaWxlIG9yIFxjb2Rleyd3J30gdG8gY3JlYXRlIGEgbmV3CisgICAgZmlsZSBvdmVyd3JpdGluZyBhbiBleGlzdGluZyBvbmUuIFx2YXJ7bW9kZX0gZGVmYXVsdHMgdG8gXGNvZGV7J3InfS4KKworICAgIElmIFx2YXJ7ZmlsZW9ian0gaXMgZ2l2ZW4sIGl0IGlzIHVzZWQgZm9yIHJlYWRpbmcgb3Igd3JpdGluZyBkYXRhLgorICAgIElmIGl0IGNhbiBiZSBkZXRlcm1pbmVkLCBcdmFye21vZGV9IGlzIG92ZXJyaWRkZW4gYnkgXHZhcntmaWxlb2JqfSdzIG1vZGUuCisgICAgXGJlZ2lue25vdGljZX0KKyAgICAgICAgXHZhcntmaWxlb2JqfSBpcyBub3QgY2xvc2VkLCB3aGVuIFxjbGFzc3tUYXJGaWxlfSBpcyBjbG9zZWQuCisgICAgXGVuZHtub3RpY2V9CitcZW5ke2NsYXNzZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e29wZW59ey4uLn0KKyAgICBBbHRlcm5hdGl2ZSBjb25zdHJ1Y3Rvci4gVGhlIFxmdW5jdGlvbntvcGVuKCl9IGZ1bmN0aW9uIG9uIG1vZHVsZSBsZXZlbCBpcworICAgIGFjdHVhbGx5IGEgc2hvcnRjdXQgdG8gdGhpcyBjbGFzc21ldGhvZC4gU2VlIHNlY3Rpb24gXHJlZnttb2R1bGUtdGFyZmlsZX0KKyAgICBmb3IgZGV0YWlscy4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e2dldG1lbWJlcn17bmFtZX0KKyAgICBSZXR1cm4gYSBcY2xhc3N7VGFySW5mb30gb2JqZWN0IGZvciBtZW1iZXIgXHZhcntuYW1lfS4gSWYgXHZhcntuYW1lfSBjYW4KKyAgICBub3QgYmUgZm91bmQgaW4gdGhlIGFyY2hpdmUsIFxleGNlcHRpb257S2V5RXJyb3J9IGlzIHJhaXNlZC4KKyAgICBcYmVnaW57bm90aWNlfQorICAgICAgICBJZiBhIG1lbWJlciBvY2N1cnMgbW9yZSB0aGFuIG9uY2UgaW4gdGhlIGFyY2hpdmUsIGl0cyBsYXN0CisgICAgICAgIG9jY3VyZW5jZSBpcyBhc3N1bWVkIHRvIGJlIHRoZSBtb3N0IHVwLXRvLWRhdGUgdmVyc2lvbi4KKyAgICBcZW5ke25vdGljZX0KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e2dldG1lbWJlcnN9e30KKyAgICBSZXR1cm4gdGhlIG1lbWJlcnMgb2YgdGhlIGFyY2hpdmUgYXMgYSBsaXN0IG9mIFxjbGFzc3tUYXJJbmZvfSBvYmplY3RzLgorICAgIFRoZSBsaXN0IGhhcyB0aGUgc2FtZSBvcmRlciBhcyB0aGUgbWVtYmVycyBpbiB0aGUgYXJjaGl2ZS4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e2dldG5hbWVzfXt9CisgICAgUmV0dXJuIHRoZSBtZW1iZXJzIGFzIGEgbGlzdCBvZiB0aGVpciBuYW1lcy4gSXQgaGFzIHRoZSBzYW1lIG9yZGVyIGFzCisgICAgdGhlIGxpc3QgcmV0dXJuZWQgYnkgXG1ldGhvZHtnZXRtZW1iZXJzKCl9LgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317bGlzdH17dmVyYm9zZT1UcnVlfQorICAgIFByaW50IGEgdGFibGUgb2YgY29udGVudHMgdG8gXGNvZGV7c3lzLnN0ZG91dH0uIElmIFx2YXJ7dmVyYm9zZX0gaXMKKyAgICBcY29kZXtGYWxzZX0sIG9ubHkgdGhlIG5hbWVzIG9mIHRoZSBtZW1iZXJzIGFyZSBwcmludGVkLiBJZiBpdCBpcworICAgIFxjb2Rle1RydWV9LCBhbiBcY29kZXsibHMgLWwifS1saWtlIG91dHB1dCBpcyBwcm9kdWNlZC4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e25leHR9e30KKyAgICBSZXR1cm4gdGhlIG5leHQgbWVtYmVyIG9mIHRoZSBhcmNoaXZlIGFzIGEgXGNsYXNze1RhckluZm99IG9iamVjdCwgd2hlbgorICAgIFxjbGFzc3tUYXJGaWxlfSBpcyBvcGVuZWQgZm9yIHJlYWRpbmcuIFJldHVybiBcY29kZXtOb25lfSBpZiB0aGVyZSBpcyBubworICAgIG1vcmUgYXZhaWxhYmxlLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317ZXh0cmFjdH17bWVtYmVyXG9wdGlvbmFseywgcGF0aH19CisgICAgRXh0cmFjdCBhIG1lbWJlciBmcm9tIHRoZSBhcmNoaXZlIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LAorICAgIHVzaW5nIGl0cyBmdWxsIG5hbWUuIEl0cyBmaWxlIGluZm9ybWF0aW9uIGlzIGV4dHJhY3RlZCBhcyBhY2N1cmF0ZWx5IGFzCisgICAgcG9zc2libGUuCisgICAgXHZhcnttZW1iZXJ9IG1heSBiZSBhIGZpbGVuYW1lIG9yIGEgXGNsYXNze1RhckluZm99IG9iamVjdC4KKyAgICBZb3UgY2FuIHNwZWNpZnkgYSBkaWZmZXJlbnQgZGlyZWN0b3J5IHVzaW5nIFx2YXJ7cGF0aH0uCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfXtleHRyYWN0ZmlsZX17bWVtYmVyfQorICAgIEV4dHJhY3QgYSBtZW1iZXIgZnJvbSB0aGUgYXJjaGl2ZSBhcyBhIGZpbGUgb2JqZWN0LgorICAgIFx2YXJ7bWVtYmVyfSBtYXkgYmUgYSBmaWxlbmFtZSBvciBhIFxjbGFzc3tUYXJJbmZvfSBvYmplY3QuCisgICAgSWYgXHZhcnttZW1iZXJ9IGlzIGEgcmVndWxhciBmaWxlLCBhIGZpbGUtbGlrZSBvYmplY3QgaXMgcmV0dXJuZWQuCisgICAgSWYgXHZhcnttZW1iZXJ9IGlzIGEgbGluaywgYSBmaWxlLWxpa2Ugb2JqZWN0IGlzIGNvbnN0cnVjdGVkIGZyb20gdGhlCisgICAgbGluaydzIHRhcmdldC4KKyAgICBJZiBcdmFye21lbWJlcn0gaXMgbm9uZSBvZiB0aGUgYWJvdmUsIFxjb2Rle05vbmV9IGlzIHJldHVybmVkLgorICAgIFxiZWdpbntub3RpY2V9CisgICAgICAgIFRoZSBmaWxlLWxpa2Ugb2JqZWN0IGlzIHJlYWQtb25seSBhbmQgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBtZXRob2RzOgorICAgICAgICBcbWV0aG9ke3JlYWQoKX0sIFxtZXRob2R7cmVhZGxpbmUoKX0sIFxtZXRob2R7cmVhZGxpbmVzKCl9LAorICAgICAgICBcbWV0aG9ke3NlZWsoKX0sIFxtZXRob2R7dGVsbCgpfS4KKyAgICBcZW5ke25vdGljZX0KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e2FkZH17bmFtZVxvcHRpb25hbHssIGFyY25hbWVcb3B0aW9uYWx7LCByZWN1cnNpdmU9VHJ1ZX19fQorICAgIEFkZCB0aGUgZmlsZSBcdmFye25hbWV9IHRvIHRoZSBhcmNoaXZlLiBcdmFye25hbWV9IG1heSBiZSBhbnkgdHlwZQorICAgIG9mIGZpbGUgKGRpcmVjdG9yeSwgZmlmbywgc3ltYm9saWMgbGluaywgZXRjLikuCisgICAgSWYgZ2l2ZW4sIFx2YXJ7YXJjbmFtZX0gc3BlY2lmaWVzIGFuIGFsdGVybmF0aXZlIG5hbWUgZm9yIHRoZSBmaWxlIGluIHRoZQorICAgIGFyY2hpdmUuIERpcmVjdG9yaWVzIGFyZSBhZGRlZCByZWN1cnNpdmVseSBieSBkZWZhdWx0LgorICAgIFRoaXMgY2FuIGJlIGF2b2lkZWQgYnkgc2V0dGluZyBcdmFye3JlY3Vyc2l2ZX0gdG8gXGNvZGV7RmFsc2V9LgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317YWRkZmlsZX17dGFyaW5mb1xvcHRpb25hbHssIGZpbGVvYmp9fQorICAgIEFkZCB0aGUgXGNsYXNze1RhckluZm99IG9iamVjdCBcdmFye3RhcmluZm99IHRvIHRoZSBhcmNoaXZlLgorICAgIElmIFx2YXJ7ZmlsZW9ian0gaXMgZ2l2ZW4sIFxjb2Rle3RhcmluZm8uc2l6ZX0gYnl0ZXMgYXJlIHJlYWQKKyAgICBmcm9tIGl0IGFuZCBhZGRlZCB0byB0aGUgYXJjaGl2ZS4gIFlvdSBjYW4gY3JlYXRlIFxjbGFzc3tUYXJJbmZvfSBvYmplY3RzCisgICAgdXNpbmcgXG1ldGhvZHtnZXR0YXJpbmZvKCl9LgorICAgIFxiZWdpbntub3RpY2V9CisgICAgT24gV2luZG93cyBwbGF0Zm9ybXMsIFx2YXJ7ZmlsZW9ian0gc2hvdWxkIGFsd2F5cyBiZSBvcGVuZWQgd2l0aCBtb2RlCisgICAgXGNvZGV7J3JiJ30gdG8gYXZvaWQgaXJyaXRhdGlvbiBhYm91dCB0aGUgZmlsZSBzaXplLgorICAgIFxlbmR7bm90aWNlfQorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317Z2V0dGFyaW5mb317XG9wdGlvbmFse25hbWVcb3B0aW9uYWx7LCBhcmNuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG9wdGlvbmFseywgZmlsZW9ian19fX0KKyAgICBDcmVhdGUgYSBcY2xhc3N7VGFySW5mb30gb2JqZWN0IGZvciBlaXRoZXIgdGhlIGZpbGUgXHZhcntuYW1lfSBvciB0aGUKKyAgICBmaWxlIG9iamVjdCBcdmFye2ZpbGVvYmp9ICh1c2luZyBcY29kZXtvcy5mc3RhdCgpfSBvbiBpdHMgZmlsZSBkZXNjcmlwdG9yKS4KKyAgICBZb3UgY2FuIG1vZGlmeSBzb21lIG9mIHRoZSBcY2xhc3N7VGFySW5mb30ncyBhdHRyaWJ1dGVzIGJlZm9yZSB5b3UgYWRkIGl0CisgICAgdXNpbmcgXG1ldGhvZHthZGRmaWxlKCl9LgorICAgIElmIGdpdmVuLCBcdmFye2FyY25hbWV9IHNwZWNpZmllcyBhbiBhbHRlcm5hdGl2ZSBuYW1lIGZvciB0aGUgZmlsZSBpbiB0aGUKKyAgICBhcmNoaXZlLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317Y2xvc2V9e30KKyAgICBDbG9zZSB0aGUgXGNsYXNze1RhckZpbGV9LiBJbiB3cml0ZS1tb2RlLCB0d28gZmluaXNoaW5nIHplcm8gYmxvY2tzIGFyZQorICAgIGFwcGVuZGVkIHRvIHRoZSBhcmNoaXZlLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWVtYmVyZGVzY317cG9zaXg9VHJ1ZX0KKyAgICBJZiBcY29kZXtUcnVlfSwgY3JlYXRlIGEgUE9TSVggMTAwMy4xLTE5OTAgY29tcGxpYW50IGFyY2hpdmUuIEdOVQorICAgIGV4dGVuc2lvbnMgYXJlIG5vdCB1c2VkLCBiZWNhdXNlIHRoZXkgYXJlIG5vdCBwYXJ0IG9mIHRoZSBQT1NJWCBzdGFuZGFyZC4KKyAgICBUaGlzIGxpbWl0cyB0aGUgbGVuZ3RoIG9mIGZpbGVuYW1lcyB0byBhdCBtb3N0IDI1NiBhbmQgbGlua25hbWVzIHRvIDEwMAorICAgIGNoYXJhY3RlcnMuIEEgXGV4Y2VwdGlvbntWYWx1ZUVycm9yfSBpcyByYWlzZWQsIGlmIGEgcGF0aG5hbWUgZXhjZWVkcyB0aGlzCisgICAgbGltaXQuCisgICAgSWYgXGNvZGV7RmFsc2V9LCBjcmVhdGUgYSBHTlUgdGFyIGNvbXBhdGlibGUgYXJjaGl2ZS4gSXQgd2lsbCBub3QgYmUgUE9TSVgKKyAgICBjb21wbGlhbnQsIGJ1dCBjYW4gc3RvcmUgcGF0aG5hbWVzIG9mIHVubGltaXRlZCBsZW5ndGguCitcZW5ke21lbWJlcmRlc2N9CisKK1xiZWdpbnttZW1iZXJkZXNjfXtkZXJlZmVyZW5jZT1GYWxzZX0KKyAgICBJZiBcY29kZXtGYWxzZX0sIGFkZCBzeW1ib2xpYyBhbmQgaGFyZCBsaW5rcyB0byBhcmNoaXZlLiBJZiBcY29kZXtUcnVlfSwKKyAgICBhZGQgdGhlIGNvbnRlbnQgb2YgdGhlIHRhcmdldCBmaWxlcyB0byB0aGUgYXJjaGl2ZS4gVGhpcyBoYXMgbm8gZWZmZWN0IG9uCisgICAgc3lzdGVtcyB0aGF0IGRvIG5vdCBzdXBwb3J0IGxpbmtzLgorXGVuZHttZW1iZXJkZXNjfQorCitcYmVnaW57bWVtYmVyZGVzY317aWdub3JlX3plcm9zPUZhbHNlfQorICAgIElmIFxjb2Rle0ZhbHNlfSwgdHJlYXQgYW4gZW1wdHkgYmxvY2sgYXMgdGhlIGVuZCBvZiB0aGUgYXJjaGl2ZS4gSWYKKyAgICBcY29kZXtUcnVlfSwgc2tpcCBlbXB0eSAoYW5kIGludmFsaWQpIGJsb2NrcyBhbmQgdHJ5IHRvIGdldCBhcyBtYW55CisgICAgbWVtYmVycyBhcyBwb3NzaWJsZS4gVGhpcyBpcyBvbmx5IHVzZWZ1bCBmb3IgY29uY2F0ZW5hdGVkIG9yIGRhbWFnZWQKKyAgICBhcmNoaXZlcy4KK1xlbmR7bWVtYmVyZGVzY30KKworXGJlZ2lue21lbWJlcmRlc2N9e2RlYnVnPTB9CisgICAgVG8gYmUgc2V0IGZyb20gXGNvZGV7MH0obm8gZGVidWcgbWVzc2FnZXMpIHVwIHRvIFxjb2RlezN9KGFsbCBkZWJ1ZworICAgIG1lc3NhZ2VzKS4gVGhlIG1lc3NhZ2VzIGFyZSB3cml0dGVuIHRvIFxjb2Rle3N5cy5zdGRvdXR9LgorXGVuZHttZW1iZXJkZXNjfQorCitcYmVnaW57bWVtYmVyZGVzY317ZXJyb3JsZXZlbD0wfQorICAgIElmIFxjb2RlezB9LCBhbGwgZXJyb3JzIGFyZSBpZ25vcmVkIHdoZW4gdXNpbmcgXG1ldGhvZHtleHRyYWN0KCl9LgorICAgIE5ldmVydGhlbGVzcywgdGhleSBhcHBlYXIgYXMgZXJyb3IgbWVzc2FnZXMgaW4gdGhlIGRlYnVnIG91dHB1dCwgd2hlbgorICAgIGRlYnVnZ2luZyBpcyBlbmFibGVkLgorICAgIElmIFxjb2RlezF9LCBhbGwgXGVtcGh7ZmF0YWx9IGVycm9ycyBhcmUgcmFpc2VkIGFzIFxleGNlcHRpb257T1NFcnJvcn0KKyAgICBvciBcZXhjZXB0aW9ue0lPRXJyb3J9IGV4Y2VwdGlvbnMuCisgICAgSWYgXGNvZGV7Mn0sIGFsbCBcZW1waHtub24tZmF0YWx9IGVycm9ycyBhcmUgcmFpc2VkIGFzIFxleGNlcHRpb257VGFyRXJyb3J9CisgICAgZXhjZXB0aW9ucyBhcyB3ZWxsLgorXGVuZHttZW1iZXJkZXNjfQorCislLS0tLS0tLS0tLS0tLS0tLS0KKyUgVGFySW5mbyBPYmplY3RzCislLS0tLS0tLS0tLS0tLS0tLS0KKworXHN1YnNlY3Rpb257VGFySW5mbyBPYmplY3RzIFxsYWJlbHt0YXJpbmZvLW9iamVjdHN9fQorCitBIFxjbGFzc3tUYXJJbmZvfSBvYmplY3QgcmVwcmVzZW50cyBvbmUgbWVtYmVyIGluIGEgXGNsYXNze1RhckZpbGV9LiBBc2lkZSBmcm9tCitzdG9yaW5nIGFsbCByZXF1aXJlZCBhdHRyaWJ1dGVzIG9mIGEgZmlsZSAobGlrZSBmaWxlIHR5cGUsIHNpemUsIHRpbWUsCitwZXJtaXNzaW9ucywgb3duZXIgZXRjLiksIGl0IHByb3ZpZGVzIHNvbWUgdXNlZnVsIG1ldGhvZHMgdG8gZGV0ZXJtaW5lIGl0cwordHlwZS4gSXQgZG9lcyBcZW1waHtub3R9IGNvbnRhaW4gdGhlIGZpbGUncyBkYXRhIGl0c2VsZi4KKworXGNsYXNze1RhckluZm99IG9iamVjdHMgYXJlIHJldHVybmVkIGJ5IFxjb2Rle1RhckZpbGV9J3MgbWV0aG9kcworXGNvZGV7Z2V0bWVtYmVyKCl9LCBcY29kZXtnZXRtZW1iZXJzKCl9IGFuZCBcY29kZXtnZXR0YXJpbmZvKCl9LgorCitcYmVnaW57Y2xhc3NkZXNjfXtUYXJJbmZvfXtcb3B0aW9uYWx7bmFtZX19CisgICAgQ3JlYXRlIGEgXGNsYXNze1RhckluZm99IG9iamVjdC4KK1xlbmR7Y2xhc3NkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317ZnJvbWJ1Zn17fQorICAgIENyZWF0ZSBhbmQgcmV0dXJuIGEgXGNsYXNze1RhckluZm99IG9iamVjdCBmcm9tIGEgc3RyaW5nIGJ1ZmZlci4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e3RvYnVmfXt9CisgICAgQ3JlYXRlIGEgc3RyaW5nIGJ1ZmZlciBmcm9tIGEgXGNsYXNze1RhckluZm99IG9iamVjdC4KK1xlbmR7bWV0aG9kZGVzY30KKworQSBcY29kZXtUYXJJbmZvfSBvYmplY3QgaGFzIHRoZSBmb2xsb3dpbmcgcHVibGljIGRhdGEgYXR0cmlidXRlczoKK1xiZWdpbnttZW1iZXJkZXNjfXtuYW1lfQorICAgIE5hbWUgb2YgdGhlIGFyY2hpdmUgbWVtYmVyLgorXGVuZHttZW1iZXJkZXNjfQorCitcYmVnaW57bWVtYmVyZGVzY317c2l6ZX0KKyAgICBTaXplIGluIGJ5dGVzLgorXGVuZHttZW1iZXJkZXNjfQorCitcYmVnaW57bWVtYmVyZGVzY317bXRpbWV9CisgICAgVGltZSBvZiBsYXN0IG1vZGlmaWNhdGlvbi4KK1xlbmR7bWVtYmVyZGVzY30KKworXGJlZ2lue21lbWJlcmRlc2N9e21vZGV9CisgICAgUGVybWlzc2lvbiBiaXRzLgorXGVuZHttZW1iZXJkZXNjfQorCitcYmVnaW57bWVtYmVyZGVzY317dHlwZX0KKyAgICBGaWxlIHR5cGUuCisgICAgXHZhcnt0eXBlfSBpcyB1c3VhbGx5IG9uZSBvZiB0aGVzZSBjb25zdGFudHM6CisgICAgXGNvZGV7UkVHVFlQRSwgQVJFR1RZUEUsIExOS1RZUEUsIFNZTVRZUEUsIERJUlRZUEUsIEZJRk9UWVBFLCBDT05UVFlQRSwKKyAgICBDSFJUWVBFLCBCTEtUWVBFLCBHTlVUWVBFX1NQQVJTRX0uCisgICAgVG8gZGV0ZXJtaW5lIHRoZSB0eXBlIG9mIGEgXGNsYXNze1RhckluZm99IG9iamVjdCBtb3JlIGNvbnZlbmllbnRseSwgdXNlCisgICAgdGhlIFxjb2Rle2lzXyooKX0gbWV0aG9kcyBiZWxvdy4KK1xlbmR7bWVtYmVyZGVzY30KKworXGJlZ2lue21lbWJlcmRlc2N9e2xpbmtuYW1lfQorICAgIE5hbWUgb2YgdGhlIHRhcmdldCBmaWxlIG5hbWUsIHdoaWNoIGlzIG9ubHkgcHJlc2VudCBpbiBcY2xhc3N7VGFySW5mb30KKyAgICBvYmplY3RzIG9mIHR5cGUgTE5LVFlQRSBhbmQgU1lNVFlQRS4KK1xlbmR7bWVtYmVyZGVzY30KKworXGJlZ2lue21lbWJlcmRlc2N9e3VpZCwgZ2lkfQorICAgIFVzZXIgYW5kIGdyb3VwIElEIG9mIHdobyBvcmlnaW5hbGx5IHN0b3JlZCB0aGlzIG1lbWJlci4KK1xlbmR7bWVtYmVyZGVzY30KKworXGJlZ2lue21lbWJlcmRlc2N9e3VuYW1lLCBnbmFtZX0KKyAgICBVc2VyIGFuZCBncm91cCBuYW1lLgorXGVuZHttZW1iZXJkZXNjfQorCitBIFxjbGFzc3tUYXJJbmZvfSBvYmplY3QgYWxzbyBwcm92aWRlcyBzb21lIGNvbnZlbmllbnQgcXVlcnkgbWV0aG9kczoKK1xiZWdpbnttZXRob2RkZXNjfXtpc2ZpbGV9e30KKyAgICBSZXR1cm4gXGNvZGV7VHJ1ZX0gaWYgdGhlIFxjbGFzc3tUYXJpbmZvfSBvYmplY3QgaXMgYSByZWd1bGFyIGZpbGUuCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfXtpc3JlZ317fQorICAgIFNhbWUgYXMgXG1ldGhvZHtpc2ZpbGUoKX0uCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfXtpc2Rpcn17fQorICAgIFJldHVybiBcY29kZXtUcnVlfSBpZiBpdCBpcyBhIGRpcmVjdG9yeS4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e2lzc3ltfXt9CisgICAgUmV0dXJuIFxjb2Rle1RydWV9IGlmIGl0IGlzIGEgc3ltYm9saWMgbGluay4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e2lzbG5rfXt9CisgICAgUmV0dXJuIFxjb2Rle1RydWV9IGlmIGl0IGlzIGEgaGFyZCBsaW5rLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317aXNjaHJ9e30KKyAgICBSZXR1cm4gXGNvZGV7VHJ1ZX0gaWYgaXQgaXMgYSBjaGFyYWN0ZXIgZGV2aWNlLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317aXNibGt9e30KKyAgICBSZXR1cm4gXGNvZGV7VHJ1ZX0gaWYgaXQgaXMgYSBibG9jayBkZXZpY2UuCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfXtpc2ZpZm99e30KKyAgICBSZXR1cm4gXGNvZGV7VHJ1ZX0gaWYgaXQgaXMgYSBGSUZPLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317aXNkZXZ9e30KKyAgICBSZXR1cm4gXGNvZGV7VHJ1ZX0gaWYgaXQgaXMgb25lIG9mIGNoYXJhY3RlciBkZXZpY2UsIGJsb2NrIGRldmljZSBvciBGSUZPLgorXGVuZHttZXRob2RkZXNjfQorCislLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCislIEV4YW1wbGVzCislLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1xzdWJzZWN0aW9ue0V4YW1wbGVzIFxsYWJlbHt0YXItZXhhbXBsZXN9fQorCitIb3cgdG8gY3JlYXRlIGFuIHVuY29tcHJlc3NlZCB0YXIgYXJjaGl2ZSBmcm9tIGEgbGlzdCBvZiBmaWxlbmFtZXM6CitcYmVnaW57dmVyYmF0aW19CitpbXBvcnQgdGFyZmlsZQordGFyID0gdGFyZmlsZS5vcGVuKCJzYW1wbGUudGFyIiwgInciKQorZm9yIG5hbWUgaW4gWyJmb28iLCAiYmFyIiwgInF1dXgiXToKKyAgICB0YXIuYWRkKG5hbWUpCit0YXIuY2xvc2UoKQorXGVuZHt2ZXJiYXRpbX0KKworSG93IHRvIHJlYWQgYSBnemlwIGNvbXByZXNzZWQgdGFyIGFyY2hpdmUgYW5kIGRpc3BsYXkgc29tZSBtZW1iZXIgaW5mb3JtYXRpb246CitcYmVnaW57dmVyYmF0aW19CitpbXBvcnQgdGFyZmlsZQordGFyID0gdGFyZmlsZS5vcGVuKCJzYW1wbGUudGFyLmd6IiwgInI6Z3oiKQorZm9yIHRhcmluZm8gaW4gdGFyOgorICAgIHByaW50IHRhcmluZm8ubmFtZSwgImlzIiwgdGFyaW5mby5zaXplLCAiYnl0ZXMgaW4gc2l6ZSBhbmQgaXMiLAorICAgIGlmIHRhcmluZm8uaXNyZWcoKToKKyAgICAgICAgcHJpbnQgImEgcmVndWxhciBmaWxlLiIKKyAgICBlbGlmIHRhcmluZm8uaXNkaXIoKToKKyAgICAgICAgcHJpbnQgImEgZGlyZWN0b3J5LiIKKyAgICBlbHNlOgorICAgICAgICBwcmludCAic29tZXRoaW5nIGVsc2UuIgordGFyLmNsb3NlKCkKK1xlbmR7dmVyYmF0aW19CisKK0hvdyB0byBjcmVhdGUgYSB0YXIgYXJjaGl2ZSB3aXRoIGZha2VkIGluZm9ybWF0aW9uOgorXGJlZ2lue3ZlcmJhdGltfQoraW1wb3J0IHRhcmZpbGUKK3RhciA9IHRhcmZpbGUub3Blbigic2FtcGxlLnRhci5neiIsICJ3Omd6IikKK2ZvciBuYW1lIGluIG5hbWVsaXN0OgorICAgIHRhcmluZm8gPSB0YXIuZ2V0dGFyaW5mbyhuYW1lLCAiZmFrZXByb2otMS4wLyIgKyBuYW1lKQorICAgIHRhcmluZm8udWlkID0gMTIzCisgICAgdGFyaW5mby5naWQgPSA0NTYKKyAgICB0YXJpbmZvLnVuYW1lID0gImpvaG5kb2UiCisgICAgdGFyaW5mby5nbmFtZSA9ICJmYWtlIgorICAgIHRhci5hZGRmaWxlKHRhcmluZm8sIGZpbGUobmFtZSkpCit0YXIuY2xvc2UoKQorXGVuZHt2ZXJiYXRpbX0KKworVGhlIFxlbXBoe29ubHl9IHdheSB0byBleHRyYWN0IGFuIHVuY29tcHJlc3NlZCB0YXIgc3RyZWFtIGZyb20KK1xjb2Rle3N5cy5zdGRpbn06CitcYmVnaW57dmVyYmF0aW19CitpbXBvcnQgc3lzCitpbXBvcnQgdGFyZmlsZQordGFyID0gdGFyZmlsZS5vcGVuKG1vZGU9InJ8IiwgZmlsZW9iaj1zeXMuc3RkaW4pCitmb3IgdGFyaW5mbyBpbiB0YXI6CisgICAgdGFyLmV4dHJhY3QodGFyaW5mbykKK3Rhci5jbG9zZSgpCitcZW5ke3ZlcmJhdGltfQorCmRpZmYgLS1naXQgYS9MaWIvdGFyZmlsZS5weSBiL0xpYi90YXJmaWxlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMzM0YmUKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGFyZmlsZS5weQpAQCAtMCwwICsxLDE5MjcgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyAtKi0gY29kaW5nOiBpc28tODg1OS0xIC0qLQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgdGFyZmlsZS5weQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29weXJpZ2h0IChDKSAyMDAyIExhcnMgR3VzdORiZWwgPGxhcnNAZ3VzdGFlYmVsLmRlPgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBQZXJtaXNzaW9uICBpcyAgaGVyZWJ5IGdyYW50ZWQsICBmcmVlICBvZiBjaGFyZ2UsICB0byAgYW55IHBlcnNvbgorIyBvYnRhaW5pbmcgYSAgY29weSBvZiAgdGhpcyBzb2Z0d2FyZSAgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorIyBmaWxlcyAgKHRoZSAgIlNvZnR3YXJlIiksICB0byAgIGRlYWwgIGluICB0aGUgIFNvZnR3YXJlICAgd2l0aG91dAorIyByZXN0cmljdGlvbiwgIGluY2x1ZGluZyAgd2l0aG91dCBsaW1pdGF0aW9uICB0aGUgIHJpZ2h0cyB0byAgdXNlLAorIyBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorIyBjb3BpZXMgIG9mICB0aGUgIFNvZnR3YXJlLCAgYW5kIHRvICBwZXJtaXQgIHBlcnNvbnMgIHRvICB3aG9tIHRoZQorIyBTb2Z0d2FyZSAgaXMgIGZ1cm5pc2hlZCAgdG8gIGRvICBzbywgIHN1YmplY3QgIHRvICB0aGUgIGZvbGxvd2luZworIyBjb25kaXRpb25zOgorIworIyBUaGUgYWJvdmUgY29weXJpZ2h0ICBub3RpY2UgYW5kIHRoaXMgIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsICBiZQorIyBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyMKKyMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyAgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSAgS0lORCwKKyMgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgIEJVVCBOT1QgTElNSVRFRCBUTyAgVEhFIFdBUlJBTlRJRVMKKyMgT0YgIE1FUkNIQU5UQUJJTElUWSwgIEZJVE5FU1MgICBGT1IgIEEgIFBBUlRJQ1VMQVIgICBQVVJQT1NFICBBTkQKKyMgTk9OSU5GUklOR0VNRU5ULiAgSU4gIE5PICBFVkVOVCBTSEFMTCAgVEhFICBBVVRIT1JTICBPUiBDT1BZUklHSFQKKyMgSE9MREVSUyAgQkUgTElBQkxFICBGT1IgQU5ZICBDTEFJTSwgREFNQUdFUyAgT1IgT1RIRVIgIExJQUJJTElUWSwKKyMgV0hFVEhFUiAgSU4gQU4gIEFDVElPTiBPRiAgQ09OVFJBQ1QsIFRPUlQgIE9SIE9USEVSV0lTRSwgIEFSSVNJTkcKKyMgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorIyBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisjCisiIiJSZWFkIGZyb20gYW5kIHdyaXRlIHRvIHRhciBmb3JtYXQgYXJjaGl2ZXMuCisiIiIKKworX192ZXJzaW9uX18gPSAiJFJldmlzaW9uJCIKKyMgJFNvdXJjZSQKKwordmVyc2lvbiAgICAgPSAiMC42LjQiCitfX2F1dGhvcl9fICA9ICJMYXJzIEd1c3TkYmVsIChsYXJzQGd1c3RhZWJlbC5kZSkiCitfX2RhdGVfXyAgICA9ICIkRGF0ZSQiCitfX2N2c2lkX18gICA9ICIkSWQkIgorX19jcmVkaXRzX18gPSAiR3VzdGF2byBOaWVtZXllciwgTmllbHMgR3VzdORiZWwsIFJpY2hhcmQgVG93bnNlbmQuIgorCisjLS0tLS0tLS0tCisjIEltcG9ydHMKKyMtLS0tLS0tLS0KK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworaW1wb3J0IHNodXRpbAoraW1wb3J0IHN0YXQKK2ltcG9ydCBlcnJubworaW1wb3J0IHRpbWUKK2ltcG9ydCBzdHJ1Y3QKKwordHJ5OgorICAgIGltcG9ydCBncnAsIHB3ZAorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGdycCA9IHB3ZCA9IE5vbmUKKworIyBmcm9tIHRhcmZpbGUgaW1wb3J0ICoKK19fYWxsX18gPSBbIlRhckZpbGUiLCAiVGFySW5mbyIsICJpc190YXJmaWxlIiwgIlRhckVycm9yIl0KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyB0YXIgY29uc3RhbnRzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitOVUwgICAgICAgID0gIlwwIiAgICAgICAgICAgICAgICMgdGhlIG51bGwgY2hhcmFjdGVyCitCTE9DS1NJWkUgID0gNTEyICAgICAgICAgICAgICAgICMgbGVuZ3RoIG9mIHByb2Nlc3NpbmcgYmxvY2tzCitSRUNPUkRTSVpFID0gQkxPQ0tTSVpFICogMjAgICAgICMgbGVuZ3RoIG9mIHJlY29yZHMKK01BR0lDICAgICAgPSAidXN0YXIiICAgICAgICAgICAgIyBtYWdpYyB0YXIgc3RyaW5nCitWRVJTSU9OICAgID0gIjAwIiAgICAgICAgICAgICAgICMgdmVyc2lvbiBudW1iZXIKKworTEVOR1RIX05BTUUgICAgPSAxMDAgICAgICAgICAgICAjIG1heGltdW0gbGVuZ3RoIG9mIGEgZmlsZW5hbWUKK0xFTkdUSF9MSU5LICAgID0gMTAwICAgICAgICAgICAgIyBtYXhpbXVtIGxlbmd0aCBvZiBhIGxpbmtuYW1lCitMRU5HVEhfUFJFRklYICA9IDE1NSAgICAgICAgICAgICMgbWF4aW11bSBsZW5ndGggb2YgdGhlIHByZWZpeCBmaWVsZAorTUFYU0laRV9NRU1CRVIgPSAwNzc3Nzc3Nzc3NzdMICAjIG1heGltdW0gc2l6ZSBvZiBhIGZpbGUgKDExIG9jdGFsIGRpZ2l0cykKKworUkVHVFlQRSAgPSAiMCIgICAgICAgICAgICAgICAgICAjIHJlZ3VsYXIgZmlsZQorQVJFR1RZUEUgPSAiXDAiICAgICAgICAgICAgICAgICAjIHJlZ3VsYXIgZmlsZQorTE5LVFlQRSAgPSAiMSIgICAgICAgICAgICAgICAgICAjIGxpbmsgKGluc2lkZSB0YXJmaWxlKQorU1lNVFlQRSAgPSAiMiIgICAgICAgICAgICAgICAgICAjIHN5bWJvbGljIGxpbmsKK0NIUlRZUEUgID0gIjMiICAgICAgICAgICAgICAgICAgIyBjaGFyYWN0ZXIgc3BlY2lhbCBkZXZpY2UKK0JMS1RZUEUgID0gIjQiICAgICAgICAgICAgICAgICAgIyBibG9jayBzcGVjaWFsIGRldmljZQorRElSVFlQRSAgPSAiNSIgICAgICAgICAgICAgICAgICAjIGRpcmVjdG9yeQorRklGT1RZUEUgPSAiNiIgICAgICAgICAgICAgICAgICAjIGZpZm8gc3BlY2lhbCBkZXZpY2UKK0NPTlRUWVBFID0gIjciICAgICAgICAgICAgICAgICAgIyBjb250aWd1b3VzIGZpbGUKKworR05VVFlQRV9MT05HTkFNRSA9ICJMIiAgICAgICAgICAjIEdOVSB0YXIgZXh0ZW5zaW9uIGZvciBsb25nbmFtZXMKK0dOVVRZUEVfTE9OR0xJTksgPSAiSyIgICAgICAgICAgIyBHTlUgdGFyIGV4dGVuc2lvbiBmb3IgbG9uZ2xpbmsKK0dOVVRZUEVfU1BBUlNFICAgPSAiUyIgICAgICAgICAgIyBHTlUgdGFyIGV4dGVuc2lvbiBmb3Igc3BhcnNlIGZpbGUKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyB0YXJmaWxlIGNvbnN0YW50cworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU1VQUE9SVEVEX1RZUEVTID0gKFJFR1RZUEUsIEFSRUdUWVBFLCBMTktUWVBFLCAgIyBmaWxlIHR5cGVzIHRoYXQgdGFyZmlsZQorICAgICAgICAgICAgICAgICAgIFNZTVRZUEUsIERJUlRZUEUsIEZJRk9UWVBFLCAgIyBjYW4gY29wZSB3aXRoLgorICAgICAgICAgICAgICAgICAgIENPTlRUWVBFLCBDSFJUWVBFLCBCTEtUWVBFLAorICAgICAgICAgICAgICAgICAgIEdOVVRZUEVfTE9OR05BTUUsIEdOVVRZUEVfTE9OR0xJTkssCisgICAgICAgICAgICAgICAgICAgR05VVFlQRV9TUEFSU0UpCisKK1JFR1VMQVJfVFlQRVMgPSAoUkVHVFlQRSwgQVJFR1RZUEUsICAgICAgICAgICAgICMgZmlsZSB0eXBlcyB0aGF0IHNvbWVob3cKKyAgICAgICAgICAgICAgICAgQ09OVFRZUEUsIEdOVVRZUEVfU1BBUlNFKSAgICAgICMgcmVwcmVzZW50IHJlZ3VsYXIgZmlsZXMKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBCaXRzIHVzZWQgaW4gdGhlIG1vZGUgZmllbGQsIHZhbHVlcyBpbiBvY3RhbC4KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NfSUZMTksgPSAwMTIwMDAwICAgICAgICAjIHN5bWJvbGljIGxpbmsKK1NfSUZSRUcgPSAwMTAwMDAwICAgICAgICAjIHJlZ3VsYXIgZmlsZQorU19JRkJMSyA9IDAwNjAwMDAgICAgICAgICMgYmxvY2sgZGV2aWNlCitTX0lGRElSID0gMDA0MDAwMCAgICAgICAgIyBkaXJlY3RvcnkKK1NfSUZDSFIgPSAwMDIwMDAwICAgICAgICAjIGNoYXJhY3RlciBkZXZpY2UKK1NfSUZJRk8gPSAwMDEwMDAwICAgICAgICAjIGZpZm8KKworVFNVSUQgICA9IDA0MDAwICAgICAgICAgICMgc2V0IFVJRCBvbiBleGVjdXRpb24KK1RTR0lEICAgPSAwMjAwMCAgICAgICAgICAjIHNldCBHSUQgb24gZXhlY3V0aW9uCitUU1ZUWCAgID0gMDEwMDAgICAgICAgICAgIyByZXNlcnZlZAorCitUVVJFQUQgID0gMDQwMCAgICAgICAgICAgIyByZWFkIGJ5IG93bmVyCitUVVdSSVRFID0gMDIwMCAgICAgICAgICAgIyB3cml0ZSBieSBvd25lcgorVFVFWEVDICA9IDAxMDAgICAgICAgICAgICMgZXhlY3V0ZS9zZWFyY2ggYnkgb3duZXIKK1RHUkVBRCAgPSAwMDQwICAgICAgICAgICAjIHJlYWQgYnkgZ3JvdXAKK1RHV1JJVEUgPSAwMDIwICAgICAgICAgICAjIHdyaXRlIGJ5IGdyb3VwCitUR0VYRUMgID0gMDAxMCAgICAgICAgICAgIyBleGVjdXRlL3NlYXJjaCBieSBncm91cAorVE9SRUFEICA9IDAwMDQgICAgICAgICAgICMgcmVhZCBieSBvdGhlcgorVE9XUklURSA9IDAwMDIgICAgICAgICAgICMgd3JpdGUgYnkgb3RoZXIKK1RPRVhFQyAgPSAwMDAxICAgICAgICAgICAjIGV4ZWN1dGUvc2VhcmNoIGJ5IG90aGVyCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU29tZSB1c2VmdWwgZnVuY3Rpb25zCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitkZWYgbnRzKHMpOgorICAgICIiIkNvbnZlcnQgYSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIGJ1ZmZlciB0byBhIHB5dGhvbiBzdHJpbmcuCisgICAgIiIiCisgICAgcmV0dXJuIHMuc3BsaXQoTlVMLCAxKVswXQorCitkZWYgY2FsY19jaGtzdW0oYnVmKToKKyAgICAiIiJDYWxjdWxhdGUgdGhlIGNoZWNrc3VtIGZvciBhIG1lbWJlcidzIGhlYWRlci4gSXQncyBhIHNpbXBsZSBhZGRpdGlvbgorICAgICAgIG9mIGFsbCBieXRlcywgdHJlYXRpbmcgdGhlIGNoa3N1bSBmaWVsZCBhcyBpZiBmaWxsZWQgd2l0aCBzcGFjZXMuCisgICAgICAgYnVmIGlzIGEgNTEyIGJ5dGUgbG9uZyBzdHJpbmcgYnVmZmVyIHdoaWNoIGhvbGRzIHRoZSBoZWFkZXIuCisgICAgIiIiCisgICAgY2hrID0gMjU2ICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBjaGtzdW0gZmllbGQgaXMgdHJlYXRlZCBhcyBibGFua3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzbyB0aGUgaW5pdGlhbCB2YWx1ZSBpcyA4ICogb3JkKCIgIikKKyAgICBmb3IgYyBpbiBidWZbOjE0OF06IGNoayArPSBvcmQoYykgICAjIHN1bSB1cCBhbGwgYnl0ZXMgYmVmb3JlIGNoa3N1bQorICAgIGZvciBjIGluIGJ1ZlsxNTY6XTogY2hrICs9IG9yZChjKSAgICMgc3VtIHVwIGFsbCBieXRlcyBhZnRlciBjaGtzdW0KKyAgICByZXR1cm4gY2hrCisKK2RlZiBjb3B5ZmlsZW9iaihzcmMsIGRzdCwgbGVuZ3RoPU5vbmUpOgorICAgICIiIkNvcHkgbGVuZ3RoIGJ5dGVzIGZyb20gZmlsZW9iaiBzcmMgdG8gZmlsZW9iaiBkc3QuCisgICAgICAgSWYgbGVuZ3RoIGlzIE5vbmUsIGNvcHkgdGhlIGVudGlyZSBjb250ZW50LgorICAgICIiIgorICAgIGlmIGxlbmd0aCA9PSAwOgorICAgICAgICByZXR1cm4KKyAgICBpZiBsZW5ndGggaXMgTm9uZToKKyAgICAgICAgc2h1dGlsLmNvcHlmaWxlb2JqKHNyYywgZHN0KQorICAgICAgICByZXR1cm4KKworICAgIEJVRlNJWkUgPSAxNiAqIDEwMjQKKyAgICBibG9ja3MsIHJlbWFpbmRlciA9IGRpdm1vZChsZW5ndGgsIEJVRlNJWkUpCisgICAgZm9yIGIgaW4geHJhbmdlKGJsb2Nrcyk6CisgICAgICAgIGJ1ZiA9IHNyYy5yZWFkKEJVRlNJWkUpCisgICAgICAgIGlmIGxlbihidWYpIDwgQlVGU0laRToKKyAgICAgICAgICAgIHJhaXNlIElPRXJyb3IsICJlbmQgb2YgZmlsZSByZWFjaGVkIgorICAgICAgICBkc3Qud3JpdGUoYnVmKQorCisgICAgaWYgcmVtYWluZGVyICE9IDA6CisgICAgICAgIGJ1ZiA9IHNyYy5yZWFkKHJlbWFpbmRlcikKKyAgICAgICAgaWYgbGVuKGJ1ZikgPCByZW1haW5kZXI6CisgICAgICAgICAgICByYWlzZSBJT0Vycm9yLCAiZW5kIG9mIGZpbGUgcmVhY2hlZCIKKyAgICAgICAgZHN0LndyaXRlKGJ1ZikKKyAgICByZXR1cm4KKworZmlsZW1vZGVfdGFibGUgPSAoCisgICAgKFNfSUZMTkssICJsIiwKKyAgICAgU19JRlJFRywgIi0iLAorICAgICBTX0lGQkxLLCAiYiIsCisgICAgIFNfSUZESVIsICJkIiwKKyAgICAgU19JRkNIUiwgImMiLAorICAgICBTX0lGSUZPLCAicCIpLAorICAgIChUVVJFQUQsICAiciIpLAorICAgIChUVVdSSVRFLCAidyIpLAorICAgIChUVUVYRUMsICAieCIsIFRTVUlELCAiUyIsIFRVRVhFQ3xUU1VJRCwgInMiKSwKKyAgICAoVEdSRUFELCAgInIiKSwKKyAgICAoVEdXUklURSwgInciKSwKKyAgICAoVEdFWEVDLCAgIngiLCBUU0dJRCwgIlMiLCBUR0VYRUN8VFNHSUQsICJzIiksCisgICAgKFRPUkVBRCwgICJyIiksCisgICAgKFRPV1JJVEUsICJ3IiksCisgICAgKFRPRVhFQywgICJ4IiwgVFNWVFgsICJUIiwgVE9FWEVDfFRTVlRYLCAidCIpKQorCitkZWYgZmlsZW1vZGUobW9kZSk6CisgICAgIiIiQ29udmVydCBhIGZpbGUncyBtb2RlIHRvIGEgc3RyaW5nIG9mIHRoZSBmb3JtCisgICAgICAgLXJ3eHJ3eHJ3eC4KKyAgICAgICBVc2VkIGJ5IFRhckZpbGUubGlzdCgpCisgICAgIiIiCisgICAgcyA9ICIiCisgICAgZm9yIHQgaW4gZmlsZW1vZGVfdGFibGU6CisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBpZiBtb2RlICYgdFswXSA9PSB0WzBdOgorICAgICAgICAgICAgICAgIHMgKz0gdFsxXQorICAgICAgICAgICAgZWxpZiBsZW4odCkgPiAyOgorICAgICAgICAgICAgICAgIHQgPSB0WzI6XQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHMgKz0gIi0iCisgICAgICAgICAgICBicmVhaworICAgIHJldHVybiBzCisKK2lmIG9zLnNlcCAhPSAiLyI6CisgICAgbm9ybXBhdGggPSBsYW1iZGEgcGF0aDogb3MucGF0aC5ub3JtcGF0aChwYXRoKS5yZXBsYWNlKG9zLnNlcCwgIi8iKQorZWxzZToKKyAgICBub3JtcGF0aCA9IG9zLnBhdGgubm9ybXBhdGgKKworY2xhc3MgVGFyRXJyb3IoRXhjZXB0aW9uKToKKyAgICAiIiJCYXNlIGV4Y2VwdGlvbi4iIiIKKyAgICBwYXNzCitjbGFzcyBFeHRyYWN0RXJyb3IoVGFyRXJyb3IpOgorICAgICIiIkdlbmVyYWwgZXhjZXB0aW9uIGZvciBleHRyYWN0IGVycm9ycy4iIiIKKyAgICBwYXNzCitjbGFzcyBSZWFkRXJyb3IoVGFyRXJyb3IpOgorICAgICIiIkV4Y2VwdGlvbiBmb3IgdW5yZWFkYmxlIHRhciBhcmNoaXZlcy4iIiIKKyAgICBwYXNzCitjbGFzcyBDb21wcmVzc2lvbkVycm9yKFRhckVycm9yKToKKyAgICAiIiJFeGNlcHRpb24gZm9yIHVuYXZhaWxhYmxlIGNvbXByZXNzaW9uIG1ldGhvZHMuIiIiCisgICAgcGFzcworY2xhc3MgU3RyZWFtRXJyb3IoVGFyRXJyb3IpOgorICAgICIiIkV4Y2VwdGlvbiBmb3IgdW5zdXBwb3J0ZWQgb3BlcmF0aW9ucyBvbiBzdHJlYW0tbGlrZSBUYXJGaWxlcy4iIiIKKyAgICBwYXNzCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgaW50ZXJuYWwgc3RyZWFtIGludGVyZmFjZQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY2xhc3MgX0xvd0xldmVsRmlsZToKKyAgICAiIiJMb3ctbGV2ZWwgZmlsZSBvYmplY3QuIFN1cHBvcnRzIHJlYWRpbmcgYW5kIHdyaXRpbmcuCisgICAgICAgSXQgaXMgdXNlZCBpbnN0ZWFkIG9mIGEgcmVndWxhciBmaWxlIG9iamVjdCBmb3Igc3RyZWFtaW5nCisgICAgICAgYWNjZXNzLgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIG1vZGUpOgorICAgICAgICBtb2RlID0geworICAgICAgICAgICAgInIiOiBvcy5PX1JET05MWSwKKyAgICAgICAgICAgICJ3Ijogb3MuT19XUk9OTFkgfCBvcy5PX0NSRUFUIHwgb3MuT19UUlVOQywKKyAgICAgICAgfVttb2RlXQorICAgICAgICBpZiBoYXNhdHRyKG9zLCAiT19CSU5BUlkiKToKKyAgICAgICAgICAgIG1vZGUgfD0gb3MuT19CSU5BUlkKKyAgICAgICAgc2VsZi5mZCA9IG9zLm9wZW4obmFtZSwgbW9kZSkKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgb3MuY2xvc2Uoc2VsZi5mZCkKKworICAgIGRlZiByZWFkKHNlbGYsIHNpemUpOgorICAgICAgICByZXR1cm4gb3MucmVhZChzZWxmLmZkLCBzaXplKQorCisgICAgZGVmIHdyaXRlKHNlbGYsIHMpOgorICAgICAgICBvcy53cml0ZShzZWxmLmZkLCBzKQorCitjbGFzcyBfU3RyZWFtOgorICAgICIiIkNsYXNzIHRoYXQgc2VydmVzIGFzIGFuIGFkYXB0ZXIgYmV0d2VlbiBUYXJGaWxlIGFuZAorICAgICAgIGEgc3RyZWFtLWxpa2Ugb2JqZWN0LiAgVGhlIHN0cmVhbS1saWtlIG9iamVjdCBvbmx5CisgICAgICAgbmVlZHMgdG8gaGF2ZSBhIHJlYWQoKSBvciB3cml0ZSgpIG1ldGhvZCBhbmQgaXMgYWNjZXNzZWQKKyAgICAgICBibG9ja3dpc2UuICBVc2Ugb2YgZ3ppcCBvciBiemlwMiBjb21wcmVzc2lvbiBpcyBwb3NzaWJsZS4KKyAgICAgICBBIHN0cmVhbS1saWtlIG9iamVjdCBjb3VsZCBiZSBmb3IgZXhhbXBsZTogc3lzLnN0ZGluLAorICAgICAgIHN5cy5zdGRvdXQsIGEgc29ja2V0LCBhIHRhcGUgZGV2aWNlIGV0Yy4KKworICAgICAgIF9TdHJlYW0gaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbmx5IGludGVybmFsbHkuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgbW9kZSwgdHlwZSwgZmlsZW9iaiwgYnVmc2l6ZSk6CisgICAgICAgICIiIkNvbnN0cnVjdCBhIF9TdHJlYW0gb2JqZWN0LgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fZXh0ZmlsZW9iaiA9IFRydWUKKyAgICAgICAgaWYgZmlsZW9iaiBpcyBOb25lOgorICAgICAgICAgICAgZmlsZW9iaiA9IF9Mb3dMZXZlbEZpbGUobmFtZSwgbW9kZSkKKyAgICAgICAgICAgIHNlbGYuX2V4dGZpbGVvYmogPSBGYWxzZQorCisgICAgICAgIHNlbGYubmFtZSAgICA9IG5hbWUgb3IgIiIKKyAgICAgICAgc2VsZi5tb2RlICAgID0gbW9kZQorICAgICAgICBzZWxmLnR5cGUgICAgPSB0eXBlCisgICAgICAgIHNlbGYuZmlsZW9iaiA9IGZpbGVvYmoKKyAgICAgICAgc2VsZi5idWZzaXplID0gYnVmc2l6ZQorICAgICAgICBzZWxmLmJ1ZiAgICAgPSAiIgorICAgICAgICBzZWxmLnBvcyAgICAgPSAwTAorICAgICAgICBzZWxmLmNsb3NlZCAgPSBGYWxzZQorCisgICAgICAgIGlmIHR5cGUgPT0gImd6IjoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpbXBvcnQgemxpYgorICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgICAgIHJhaXNlIENvbXByZXNzaW9uRXJyb3IsICJ6bGliIG1vZHVsZSBpcyBub3QgYXZhaWxhYmxlIgorICAgICAgICAgICAgc2VsZi56bGliID0gemxpYgorICAgICAgICAgICAgc2VsZi5jcmMgPSB6bGliLmNyYzMyKCIiKQorICAgICAgICAgICAgaWYgbW9kZSA9PSAiciI6CisgICAgICAgICAgICAgICAgc2VsZi5faW5pdF9yZWFkX2d6KCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5faW5pdF93cml0ZV9neigpCisKKyAgICAgICAgaWYgdHlwZSA9PSAiYnoyIjoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpbXBvcnQgYnoyCisgICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICAgICAgcmFpc2UgQ29tcHJlc3Npb25FcnJvciwgImJ6MiBtb2R1bGUgaXMgbm90IGF2YWlsYWJsZSIKKyAgICAgICAgICAgIGlmIG1vZGUgPT0gInIiOgorICAgICAgICAgICAgICAgIHNlbGYuZGJ1ZiA9ICIiCisgICAgICAgICAgICAgICAgc2VsZi5jbXAgPSBiejIuQloyRGVjb21wcmVzc29yKCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5jbXAgPSBiejIuQloyQ29tcHJlc3NvcigpCisKKyAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuY2xvc2VkOgorICAgICAgICAgICAgc2VsZi5jbG9zZSgpCisKKyAgICBkZWYgX2luaXRfd3JpdGVfZ3ooc2VsZik6CisgICAgICAgICIiIkluaXRpYWxpemUgZm9yIHdyaXRpbmcgd2l0aCBnemlwIGNvbXByZXNzaW9uLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jbXAgPSBzZWxmLnpsaWIuY29tcHJlc3NvYmooOSwgc2VsZi56bGliLkRFRkxBVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtc2VsZi56bGliLk1BWF9XQklUUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi56bGliLkRFRl9NRU1fTEVWRUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApCisgICAgICAgIHRpbWVzdGFtcCA9IHN0cnVjdC5wYWNrKCI8TCIsIGxvbmcodGltZS50aW1lKCkpKQorICAgICAgICBzZWxmLl9fd3JpdGUoIlwwMzdcMjEzXDAxMFwwMTAlc1wwMDJcMzc3IiAlIHRpbWVzdGFtcCkKKyAgICAgICAgaWYgc2VsZi5uYW1lLmVuZHN3aXRoKCIuZ3oiKToKKyAgICAgICAgICAgIHNlbGYubmFtZSA9IHNlbGYubmFtZVs6LTNdCisgICAgICAgIHNlbGYuX193cml0ZShzZWxmLm5hbWUgKyBOVUwpCisKKyAgICBkZWYgd3JpdGUoc2VsZiwgcyk6CisgICAgICAgICIiIldyaXRlIHN0cmluZyBzIHRvIHRoZSBzdHJlYW0uCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLnR5cGUgPT0gImd6IjoKKyAgICAgICAgICAgIHNlbGYuY3JjID0gc2VsZi56bGliLmNyYzMyKHMsIHNlbGYuY3JjKQorICAgICAgICBzZWxmLnBvcyArPSBsZW4ocykKKyAgICAgICAgaWYgc2VsZi50eXBlICE9ICJ0YXIiOgorICAgICAgICAgICAgcyA9IHNlbGYuY21wLmNvbXByZXNzKHMpCisgICAgICAgIHNlbGYuX193cml0ZShzKQorCisgICAgZGVmIF9fd3JpdGUoc2VsZiwgcyk6CisgICAgICAgICIiIldyaXRlIHN0cmluZyBzIHRvIHRoZSBzdHJlYW0gaWYgYSB3aG9sZSBuZXcgYmxvY2sKKyAgICAgICAgICAgaXMgcmVhZHkgdG8gYmUgd3JpdHRlbi4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuYnVmICs9IHMKKyAgICAgICAgd2hpbGUgbGVuKHNlbGYuYnVmKSA+IHNlbGYuYnVmc2l6ZToKKyAgICAgICAgICAgIHNlbGYuZmlsZW9iai53cml0ZShzZWxmLmJ1Zls6c2VsZi5idWZzaXplXSkKKyAgICAgICAgICAgIHNlbGYuYnVmID0gc2VsZi5idWZbc2VsZi5idWZzaXplOl0KKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgIiIiQ2xvc2UgdGhlIF9TdHJlYW0gb2JqZWN0LiBObyBvcGVyYXRpb24gc2hvdWxkIGJlCisgICAgICAgICAgIGRvbmUgb24gaXQgYWZ0ZXJ3YXJkcy4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuY2xvc2VkOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgc2VsZi5tb2RlID09ICJ3IiBhbmQgc2VsZi5idWY6CisgICAgICAgICAgICBpZiBzZWxmLnR5cGUgIT0gInRhciI6CisgICAgICAgICAgICAgICAgc2VsZi5idWYgKz0gc2VsZi5jbXAuZmx1c2goKQorICAgICAgICAgICAgc2VsZi5maWxlb2JqLndyaXRlKHNlbGYuYnVmKQorICAgICAgICAgICAgc2VsZi5idWYgPSAiIgorICAgICAgICAgICAgaWYgc2VsZi50eXBlID09ICJneiI6CisgICAgICAgICAgICAgICAgc2VsZi5maWxlb2JqLndyaXRlKHN0cnVjdC5wYWNrKCI8bCIsIHNlbGYuY3JjKSkKKyAgICAgICAgICAgICAgICBzZWxmLmZpbGVvYmoud3JpdGUoc3RydWN0LnBhY2soIjxMIiwgc2VsZi5wb3MpKQorCisgICAgICAgIGlmIG5vdCBzZWxmLl9leHRmaWxlb2JqOgorICAgICAgICAgICAgc2VsZi5maWxlb2JqLmNsb3NlKCkKKworICAgICAgICBzZWxmLmNsb3NlZCA9IFRydWUKKworICAgIGRlZiBfaW5pdF9yZWFkX2d6KHNlbGYpOgorICAgICAgICAiIiJJbml0aWFsaXplIGZvciByZWFkaW5nIGEgZ3ppcCBjb21wcmVzc2VkIGZpbGVvYmouCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmNtcCA9IHNlbGYuemxpYi5kZWNvbXByZXNzb2JqKC1zZWxmLnpsaWIuTUFYX1dCSVRTKQorICAgICAgICBzZWxmLmRidWYgPSAiIgorCisgICAgICAgICMgdGFrZW4gZnJvbSBnemlwLkd6aXBGaWxlIHdpdGggc29tZSBhbHRlcmF0aW9ucworICAgICAgICBpZiBzZWxmLl9fcmVhZCgyKSAhPSAiXDAzN1wyMTMiOgorICAgICAgICAgICAgcmFpc2UgUmVhZEVycm9yLCAibm90IGEgZ3ppcCBmaWxlIgorICAgICAgICBpZiBzZWxmLl9fcmVhZCgxKSAhPSAiXDAxMCI6CisgICAgICAgICAgICByYWlzZSBDb21wcmVzc2lvbkVycm9yLCAidW5zdXBwb3J0ZWQgY29tcHJlc3Npb24gbWV0aG9kIgorCisgICAgICAgIGZsYWcgPSBvcmQoc2VsZi5fX3JlYWQoMSkpCisgICAgICAgIHNlbGYuX19yZWFkKDYpCisKKyAgICAgICAgaWYgZmxhZyAmIDQ6CisgICAgICAgICAgICB4bGVuID0gb3JkKHNlbGYuX19yZWFkKDEpKSArIDI1NiAqIG9yZChzZWxmLl9fcmVhZCgxKSkKKyAgICAgICAgICAgIHNlbGYucmVhZCh4bGVuKQorICAgICAgICBpZiBmbGFnICYgODoKKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgcyA9IHNlbGYuX19yZWFkKDEpCisgICAgICAgICAgICAgICAgaWYgbm90IHMgb3IgcyA9PSBOVUw6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGlmIGZsYWcgJiAxNjoKKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgcyA9IHNlbGYuX19yZWFkKDEpCisgICAgICAgICAgICAgICAgaWYgbm90IHMgb3IgcyA9PSBOVUw6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGlmIGZsYWcgJiAyOgorICAgICAgICAgICAgc2VsZi5fX3JlYWQoMikKKworICAgIGRlZiB0ZWxsKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHN0cmVhbSdzIGZpbGUgcG9pbnRlciBwb3NpdGlvbi4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLnBvcworCisgICAgZGVmIHNlZWsoc2VsZiwgcG9zPTApOgorICAgICAgICAiIiJTZXQgdGhlIHN0cmVhbSdzIGZpbGUgcG9pbnRlciB0byBwb3MuIE5lZ2F0aXZlIHNlZWtpbmcKKyAgICAgICAgICAgaXMgZm9yYmlkZGVuLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgcG9zIC0gc2VsZi5wb3MgPj0gMDoKKyAgICAgICAgICAgIGJsb2NrcywgcmVtYWluZGVyID0gZGl2bW9kKHBvcyAtIHNlbGYucG9zLCBzZWxmLmJ1ZnNpemUpCisgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoYmxvY2tzKToKKyAgICAgICAgICAgICAgICBzZWxmLnJlYWQoc2VsZi5idWZzaXplKQorICAgICAgICAgICAgc2VsZi5yZWFkKHJlbWFpbmRlcikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFN0cmVhbUVycm9yLCAic2Vla2luZyBiYWNrd2FyZHMgaXMgbm90IGFsbG93ZWQiCisgICAgICAgIHJldHVybiBzZWxmLnBvcworCisgICAgZGVmIHJlYWQoc2VsZiwgc2l6ZT1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBuZXh0IHNpemUgbnVtYmVyIG9mIGJ5dGVzIGZyb20gdGhlIHN0cmVhbS4KKyAgICAgICAgICAgSWYgc2l6ZSBpcyBub3QgZGVmaW5lZCwgcmV0dXJuIGFsbCBieXRlcyBvZiB0aGUgc3RyZWFtCisgICAgICAgICAgIHVwIHRvIEVPRi4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNpemUgaXMgTm9uZToKKyAgICAgICAgICAgIHQgPSBbXQorICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICBidWYgPSBzZWxmLl9yZWFkKHNlbGYuYnVmc2l6ZSkKKyAgICAgICAgICAgICAgICBpZiBub3QgYnVmOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIHQuYXBwZW5kKGJ1ZikKKyAgICAgICAgICAgIGJ1ZiA9ICIiLmpvaW4odCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGJ1ZiA9IHNlbGYuX3JlYWQoc2l6ZSkKKyAgICAgICAgc2VsZi5wb3MgKz0gbGVuKGJ1ZikKKyAgICAgICAgcmV0dXJuIGJ1ZgorCisgICAgZGVmIF9yZWFkKHNlbGYsIHNpemUpOgorICAgICAgICAiIiJSZXR1cm4gc2l6ZSBieXRlcyBmcm9tIHRoZSBzdHJlYW0uCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLnR5cGUgPT0gInRhciI6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fX3JlYWQoc2l6ZSkKKworICAgICAgICBjID0gbGVuKHNlbGYuZGJ1ZikKKyAgICAgICAgdCA9IFtzZWxmLmRidWZdCisgICAgICAgIHdoaWxlIGMgPCBzaXplOgorICAgICAgICAgICAgYnVmID0gc2VsZi5fX3JlYWQoc2VsZi5idWZzaXplKQorICAgICAgICAgICAgaWYgbm90IGJ1ZjoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgYnVmID0gc2VsZi5jbXAuZGVjb21wcmVzcyhidWYpCisgICAgICAgICAgICB0LmFwcGVuZChidWYpCisgICAgICAgICAgICBjICs9IGxlbihidWYpCisgICAgICAgIHQgPSAiIi5qb2luKHQpCisgICAgICAgIHNlbGYuZGJ1ZiA9IHRbc2l6ZTpdCisgICAgICAgIHJldHVybiB0WzpzaXplXQorCisgICAgZGVmIF9fcmVhZChzZWxmLCBzaXplKToKKyAgICAgICAgIiIiUmV0dXJuIHNpemUgYnl0ZXMgZnJvbSBzdHJlYW0uIElmIGludGVybmFsIGJ1ZmZlciBpcyBlbXB0eSwKKyAgICAgICAgICAgcmVhZCBhbm90aGVyIGJsb2NrIGZyb20gdGhlIHN0cmVhbS4KKyAgICAgICAgIiIiCisgICAgICAgIGMgPSBsZW4oc2VsZi5idWYpCisgICAgICAgIHQgPSBbc2VsZi5idWZdCisgICAgICAgIHdoaWxlIGMgPCBzaXplOgorICAgICAgICAgICAgYnVmID0gc2VsZi5maWxlb2JqLnJlYWQoc2VsZi5idWZzaXplKQorICAgICAgICAgICAgaWYgbm90IGJ1ZjoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgdC5hcHBlbmQoYnVmKQorICAgICAgICAgICAgYyArPSBsZW4oYnVmKQorICAgICAgICB0ID0gIiIuam9pbih0KQorICAgICAgICBzZWxmLmJ1ZiA9IHRbc2l6ZTpdCisgICAgICAgIHJldHVybiB0WzpzaXplXQorIyBjbGFzcyBfU3RyZWFtCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRXh0cmFjdGlvbiBmaWxlIG9iamVjdAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY2xhc3MgRXhGaWxlT2JqZWN0KG9iamVjdCk6CisgICAgIiIiRmlsZS1saWtlIG9iamVjdCBmb3IgcmVhZGluZyBhbiBhcmNoaXZlIG1lbWJlci4KKyAgICAgICBJcyByZXR1cm5lZCBieSBUYXJGaWxlLmV4dHJhY3RmaWxlKCkuIFN1cHBvcnQgZm9yCisgICAgICAgc3BhcnNlIGZpbGVzIGluY2x1ZGVkLgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRhcmZpbGUsIHRhcmluZm8pOgorICAgICAgICBzZWxmLmZpbGVvYmogPSB0YXJmaWxlLmZpbGVvYmoKKyAgICAgICAgc2VsZi5uYW1lICAgID0gdGFyaW5mby5uYW1lCisgICAgICAgIHNlbGYubW9kZSAgICA9ICJyIgorICAgICAgICBzZWxmLmNsb3NlZCAgPSBGYWxzZQorICAgICAgICBzZWxmLm9mZnNldCAgPSB0YXJpbmZvLm9mZnNldF9kYXRhCisgICAgICAgIHNlbGYuc2l6ZSAgICA9IHRhcmluZm8uc2l6ZQorICAgICAgICBzZWxmLnBvcyAgICAgPSAwTAorICAgICAgICBzZWxmLmxpbmVidWZmZXIgPSAiIgorICAgICAgICBpZiB0YXJpbmZvLmlzc3BhcnNlKCk6CisgICAgICAgICAgICBzZWxmLnNwYXJzZSA9IHRhcmluZm8uc3BhcnNlCisgICAgICAgICAgICBzZWxmLnJlYWQgPSBzZWxmLl9yZWFkc3BhcnNlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnJlYWQgPSBzZWxmLl9yZWFkbm9ybWFsCisKKyAgICBkZWYgX19yZWFkKHNlbGYsIHNpemUpOgorICAgICAgICAiIiJPdmVybG9hZGFibGUgcmVhZCBtZXRob2QuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5maWxlb2JqLnJlYWQoc2l6ZSkKKworICAgIGRlZiByZWFkbGluZShzZWxmLCBzaXplPS0xKToKKyAgICAgICAgIiIiUmVhZCBhIGxpbmUgd2l0aCBhcHByb3guIHNpemUuIElmIHNpemUgaXMgbmVnYXRpdmUsCisgICAgICAgICAgIHJlYWQgYSB3aG9sZSBsaW5lLiByZWFkbGluZSgpIGFuZCByZWFkKCkgbXVzdCBub3QKKyAgICAgICAgICAgYmUgbWl4ZWQgdXAgKCEpLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2l6ZSA8IDA6CisgICAgICAgICAgICBzaXplID0gc3lzLm1heGludAorCisgICAgICAgIG5sID0gc2VsZi5saW5lYnVmZmVyLmZpbmQoIlxuIikKKyAgICAgICAgaWYgbmwgPj0gMDoKKyAgICAgICAgICAgIG5sID0gbWluKG5sLCBzaXplKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2l6ZSAtPSBsZW4oc2VsZi5saW5lYnVmZmVyKQorICAgICAgICAgICAgd2hpbGUgbmwgPCAwOgorICAgICAgICAgICAgICAgIGJ1ZiA9IHNlbGYucmVhZChtaW4oc2l6ZSwgMTAwKSkKKyAgICAgICAgICAgICAgICBpZiBub3QgYnVmOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIHNlbGYubGluZWJ1ZmZlciArPSBidWYKKyAgICAgICAgICAgICAgICBzaXplIC09IGxlbihidWYpCisgICAgICAgICAgICAgICAgaWYgc2l6ZSA8PSAwOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIG5sID0gc2VsZi5saW5lYnVmZmVyLmZpbmQoIlxuIikKKyAgICAgICAgICAgIGlmIG5sID09IC0xOgorICAgICAgICAgICAgICAgIHMgPSBzZWxmLmxpbmVidWZmZXIKKyAgICAgICAgICAgICAgICBzZWxmLmxpbmVidWZmZXIgPSAiIgorICAgICAgICAgICAgICAgIHJldHVybiBzCisgICAgICAgIGJ1ZiA9IHNlbGYubGluZWJ1ZmZlcls6bmxdCisgICAgICAgIHNlbGYubGluZWJ1ZmZlciA9IHNlbGYubGluZWJ1ZmZlcltubCArIDE6XQorICAgICAgICB3aGlsZSBidWZbLTE6XSA9PSAiXHIiOgorICAgICAgICAgICAgYnVmID0gYnVmWzotMV0KKyAgICAgICAgcmV0dXJuIGJ1ZiArICJcbiIKKworICAgIGRlZiByZWFkbGluZXMoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIGxpc3Qgd2l0aCBhbGwgKGZvbGxvd2luZykgbGluZXMuCisgICAgICAgICIiIgorICAgICAgICByZXN1bHQgPSBbXQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgbGluZSA9IHNlbGYucmVhZGxpbmUoKQorICAgICAgICAgICAgaWYgbm90IGxpbmU6IGJyZWFrCisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGxpbmUpCisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiBfcmVhZG5vcm1hbChzZWxmLCBzaXplPU5vbmUpOgorICAgICAgICAiIiJSZWFkIG9wZXJhdGlvbiBmb3IgcmVndWxhciBmaWxlcy4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuY2xvc2VkOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgImZpbGUgaXMgY2xvc2VkIgorICAgICAgICBzZWxmLmZpbGVvYmouc2VlayhzZWxmLm9mZnNldCArIHNlbGYucG9zKQorICAgICAgICBieXRlc2xlZnQgPSBzZWxmLnNpemUgLSBzZWxmLnBvcworICAgICAgICBpZiBzaXplIGlzIE5vbmU6CisgICAgICAgICAgICBieXRlc3RvcmVhZCA9IGJ5dGVzbGVmdAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYnl0ZXN0b3JlYWQgPSBtaW4oc2l6ZSwgYnl0ZXNsZWZ0KQorICAgICAgICBzZWxmLnBvcyArPSBieXRlc3RvcmVhZAorICAgICAgICByZXR1cm4gc2VsZi5fX3JlYWQoYnl0ZXN0b3JlYWQpCisKKyAgICBkZWYgX3JlYWRzcGFyc2Uoc2VsZiwgc2l6ZT1Ob25lKToKKyAgICAgICAgIiIiUmVhZCBvcGVyYXRpb24gZm9yIHNwYXJzZSBmaWxlcy4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuY2xvc2VkOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgImZpbGUgaXMgY2xvc2VkIgorCisgICAgICAgIGlmIHNpemUgaXMgTm9uZToKKyAgICAgICAgICAgIHNpemUgPSBzZWxmLnNpemUgLSBzZWxmLnBvcworCisgICAgICAgIGRhdGEgPSBbXQorICAgICAgICB3aGlsZSBzaXplID4gMDoKKyAgICAgICAgICAgIGJ1ZiA9IHNlbGYuX3JlYWRzcGFyc2VzZWN0aW9uKHNpemUpCisgICAgICAgICAgICBpZiBub3QgYnVmOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBzaXplIC09IGxlbihidWYpCisgICAgICAgICAgICBkYXRhLmFwcGVuZChidWYpCisgICAgICAgIHJldHVybiAiIi5qb2luKGRhdGEpCisKKyAgICBkZWYgX3JlYWRzcGFyc2VzZWN0aW9uKHNlbGYsIHNpemUpOgorICAgICAgICAiIiJSZWFkIGEgc2luZ2xlIHNlY3Rpb24gb2YgYSBzcGFyc2UgZmlsZS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlY3Rpb24gPSBzZWxmLnNwYXJzZS5maW5kKHNlbGYucG9zKQorCisgICAgICAgIGlmIHNlY3Rpb24gaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiAiIgorCisgICAgICAgIHRvcmVhZCA9IG1pbihzaXplLCBzZWN0aW9uLm9mZnNldCArIHNlY3Rpb24uc2l6ZSAtIHNlbGYucG9zKQorICAgICAgICBpZiBpc2luc3RhbmNlKHNlY3Rpb24sIF9kYXRhKToKKyAgICAgICAgICAgIHJlYWxwb3MgPSBzZWN0aW9uLnJlYWxwb3MgKyBzZWxmLnBvcyAtIHNlY3Rpb24ub2Zmc2V0CisgICAgICAgICAgICBzZWxmLnBvcyArPSB0b3JlYWQKKyAgICAgICAgICAgIHNlbGYuZmlsZW9iai5zZWVrKHNlbGYub2Zmc2V0ICsgcmVhbHBvcykKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9fcmVhZCh0b3JlYWQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnBvcyArPSB0b3JlYWQKKyAgICAgICAgICAgIHJldHVybiBOVUwgKiB0b3JlYWQKKworICAgIGRlZiB0ZWxsKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGN1cnJlbnQgZmlsZSBwb3NpdGlvbi4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLnBvcworCisgICAgZGVmIHNlZWsoc2VsZiwgcG9zLCB3aGVuY2U9MCk6CisgICAgICAgICIiIlNlZWsgdG8gYSBwb3NpdGlvbiBpbiB0aGUgZmlsZS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYubGluZWJ1ZmZlciA9ICIiCisgICAgICAgIGlmIHdoZW5jZSA9PSAwOgorICAgICAgICAgICAgc2VsZi5wb3MgPSBtaW4obWF4KHBvcywgMCksIHNlbGYuc2l6ZSkKKyAgICAgICAgaWYgd2hlbmNlID09IDE6CisgICAgICAgICAgICBpZiBwb3MgPCAwOgorICAgICAgICAgICAgICAgIHNlbGYucG9zID0gbWF4KHNlbGYucG9zICsgcG9zLCAwKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnBvcyA9IG1pbihzZWxmLnBvcyArIHBvcywgc2VsZi5zaXplKQorICAgICAgICBpZiB3aGVuY2UgPT0gMjoKKyAgICAgICAgICAgIHNlbGYucG9zID0gbWF4KG1pbihzZWxmLnNpemUgKyBwb3MsIHNlbGYuc2l6ZSksIDApCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgICIiIkNsb3NlIHRoZSBmaWxlIG9iamVjdC4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuY2xvc2VkID0gVHJ1ZQorI2NsYXNzIEV4RmlsZU9iamVjdAorCisjLS0tLS0tLS0tLS0tLS0tLS0tCisjIEV4cG9ydGVkIENsYXNzZXMKKyMtLS0tLS0tLS0tLS0tLS0tLS0KK2NsYXNzIFRhckluZm8ob2JqZWN0KToKKyAgICAiIiJJbmZvcm1hdGlvbmFsIGNsYXNzIHdoaWNoIGhvbGRzIHRoZSBkZXRhaWxzIGFib3V0IGFuCisgICAgICAgYXJjaGl2ZSBtZW1iZXIgZ2l2ZW4gYnkgYSB0YXIgaGVhZGVyIGJsb2NrLgorICAgICAgIFRhckluZm8gb2JqZWN0cyBhcmUgcmV0dXJuZWQgYnkgVGFyRmlsZS5nZXRtZW1iZXIoKSwKKyAgICAgICBUYXJGaWxlLmdldG1lbWJlcnMoKSBhbmQgVGFyRmlsZS5nZXR0YXJpbmZvKCkgYW5kIGFyZQorICAgICAgIHVzdWFsbHkgY3JlYXRlZCBpbnRlcm5hbGx5LgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWU9IiIpOgorICAgICAgICAiIiJDb25zdHJ1Y3QgYSBUYXJJbmZvIG9iamVjdC4gbmFtZSBpcyB0aGUgb3B0aW9uYWwgbmFtZQorICAgICAgICAgICBvZiB0aGUgbWVtYmVyLgorICAgICAgICAiIiIKKworICAgICAgICBzZWxmLm5hbWUgICAgID0gbmFtZSAgICAgICAjIG1lbWJlciBuYW1lIChkaXJuYW1lcyBtdXN0IGVuZCB3aXRoICcvJykKKyAgICAgICAgc2VsZi5tb2RlICAgICA9IDA2NjYgICAgICAgIyBmaWxlIHBlcm1pc3Npb25zCisgICAgICAgIHNlbGYudWlkICAgICAgPSAwICAgICAgICAgICMgdXNlciBpZAorICAgICAgICBzZWxmLmdpZCAgICAgID0gMCAgICAgICAgICAjIGdyb3VwIGlkCisgICAgICAgIHNlbGYuc2l6ZSAgICAgPSAwICAgICAgICAgICMgZmlsZSBzaXplCisgICAgICAgIHNlbGYubXRpbWUgICAgPSAwICAgICAgICAgICMgbW9kaWZpY2F0aW9uIHRpbWUKKyAgICAgICAgc2VsZi5jaGtzdW0gICA9IDAgICAgICAgICAgIyBoZWFkZXIgY2hlY2tzdW0KKyAgICAgICAgc2VsZi50eXBlICAgICA9IFJFR1RZUEUgICAgIyBtZW1iZXIgdHlwZQorICAgICAgICBzZWxmLmxpbmtuYW1lID0gIiIgICAgICAgICAjIGxpbmsgbmFtZQorICAgICAgICBzZWxmLnVuYW1lICAgID0gInVzZXIiICAgICAjIHVzZXIgbmFtZQorICAgICAgICBzZWxmLmduYW1lICAgID0gImdyb3VwIiAgICAjIGdyb3VwIG5hbWUKKyAgICAgICAgc2VsZi5kZXZtYWpvciA9IDAgICAgICAgICAgIy0KKyAgICAgICAgc2VsZi5kZXZtaW5vciA9IDAgICAgICAgICAgIy1mb3IgdXNlIHdpdGggQ0hSVFlQRSBhbmQgQkxLVFlQRQorICAgICAgICBzZWxmLnByZWZpeCAgID0gIiIgICAgICAgICAjIHByZWZpeCB0byBmaWxlbmFtZSBvciBob2xkaW5nIGluZm9ybWF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYWJvdXQgc3BhcnNlIGZpbGVzCisKKyAgICAgICAgc2VsZi5vZmZzZXQgICA9IDAgICAgICAgICAgIyB0aGUgdGFyIGhlYWRlciBzdGFydHMgaGVyZQorICAgICAgICBzZWxmLm9mZnNldF9kYXRhID0gMCAgICAgICAjIHRoZSBmaWxlJ3MgZGF0YSBzdGFydHMgaGVyZQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIjwlcyAlciBhdCAlI3g+IiAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXyxzZWxmLm5hbWUsaWQoc2VsZikpCisKKyAgICBkZWYgZnJvbWJ1ZihjbHMsIGJ1Zik6CisgICAgICAgICIiIkNvbnN0cnVjdCBhIFRhckluZm8gb2JqZWN0IGZyb20gYSA1MTIgYnl0ZSBzdHJpbmcgYnVmZmVyLgorICAgICAgICAiIiIKKyAgICAgICAgdGFyaW5mbyA9IGNscygpCisgICAgICAgIHRhcmluZm8ubmFtZSAgID0gIG50cyhidWZbMDoxMDBdKQorICAgICAgICB0YXJpbmZvLm1vZGUgICA9IGludChidWZbMTAwOjEwOF0sIDgpCisgICAgICAgIHRhcmluZm8udWlkICAgID0gaW50KGJ1ZlsxMDg6MTE2XSw4KQorICAgICAgICB0YXJpbmZvLmdpZCAgICA9IGludChidWZbMTE2OjEyNF0sOCkKKyAgICAgICAgdGFyaW5mby5zaXplICAgPSBsb25nKGJ1ZlsxMjQ6MTM2XSwgOCkKKyAgICAgICAgdGFyaW5mby5tdGltZSAgPSBsb25nKGJ1ZlsxMzY6MTQ4XSwgOCkKKyAgICAgICAgdGFyaW5mby5jaGtzdW0gPSBpbnQoYnVmWzE0ODoxNTZdLCA4KQorICAgICAgICB0YXJpbmZvLnR5cGUgICA9IGJ1ZlsxNTY6MTU3XQorICAgICAgICB0YXJpbmZvLmxpbmtuYW1lID0gbnRzKGJ1ZlsxNTc6MjU3XSkKKyAgICAgICAgdGFyaW5mby51bmFtZSAgPSBudHMoYnVmWzI2NToyOTddKQorICAgICAgICB0YXJpbmZvLmduYW1lICA9IG50cyhidWZbMjk3OjMyOV0pCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRhcmluZm8uZGV2bWFqb3IgPSBpbnQoYnVmWzMyOTozMzddLCA4KQorICAgICAgICAgICAgdGFyaW5mby5kZXZtaW5vciA9IGludChidWZbMzM3OjM0NV0sIDgpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgdGFyaW5mby5kZXZtYWpvciA9IHRhcmluZm8uZGV2bWFqb3IgPSAwCisKKyAgICAgICAgIyBUaGUgcHJlZml4IGZpZWxkIGlzIHVzZWQgZm9yIGZpbGVuYW1lcyA+IDEwMCBpbgorICAgICAgICAjIHRoZSBQT1NJWCBzdGFuZGFyZC4KKyAgICAgICAgIyBuYW1lID0gcHJlZml4ICsgIi8iICsgbmFtZQorICAgICAgICBwcmVmaXggPSBidWZbMzQ1OjUwMF0KKyAgICAgICAgd2hpbGUgcHJlZml4IGFuZCBwcmVmaXhbLTFdID09IE5VTDoKKyAgICAgICAgICAgIHByZWZpeCA9IHByZWZpeFs6LTFdCisgICAgICAgIGlmIGxlbihwcmVmaXguc3BsaXQoTlVMKSkgPT0gMToKKyAgICAgICAgICAgIHRhcmluZm8ucHJlZml4ID0gcHJlZml4CisgICAgICAgICAgICB0YXJpbmZvLm5hbWUgPSBub3JtcGF0aChvcy5wYXRoLmpvaW4odGFyaW5mby5wcmVmaXgsIHRhcmluZm8ubmFtZSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0YXJpbmZvLnByZWZpeCA9IGJ1ZlszNDU6NTAwXQorCisgICAgICAgICMgRGlyZWN0b3J5IG5hbWVzIHNob3VsZCBoYXZlIGEgJy8nIGF0IHRoZSBlbmQuCisgICAgICAgIGlmIHRhcmluZm8uaXNkaXIoKSBhbmQgdGFyaW5mby5uYW1lWy0xOl0gIT0gIi8iOgorICAgICAgICAgICAgdGFyaW5mby5uYW1lICs9ICIvIgorICAgICAgICByZXR1cm4gdGFyaW5mbworCisgICAgZnJvbWJ1ZiA9IGNsYXNzbWV0aG9kKGZyb21idWYpCisKKyAgICBkZWYgdG9idWYoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIHRhciBoZWFkZXIgYmxvY2sgYXMgYSA1MTIgYnl0ZSBzdHJpbmcuCisgICAgICAgICIiIgorICAgICAgICBuYW1lID0gc2VsZi5uYW1lCisKKyAgICAgICAgIyBUaGUgZm9sbG93aW5nIGNvZGUgd2FzIGNvbnRyaWJ1dGVkIGJ5IERldGxlZiBMYW5uZXJ0LgorICAgICAgICBwYXJ0cyA9IFtdCisgICAgICAgIGZvciB2YWx1ZSwgZmllbGRzaXplIGluICgKKyAgICAgICAgICAgICAgICAobmFtZSwgMTAwKSwKKyAgICAgICAgICAgICAgICAoIiUwN28iICUgKHNlbGYubW9kZSAmIDA3Nzc3KSwgOCksCisgICAgICAgICAgICAgICAgKCIlMDdvIiAlIHNlbGYudWlkLCA4KSwKKyAgICAgICAgICAgICAgICAoIiUwN28iICUgc2VsZi5naWQsIDgpLAorICAgICAgICAgICAgICAgICgiJTAxMW8iICUgc2VsZi5zaXplLCAxMiksCisgICAgICAgICAgICAgICAgKCIlMDExbyIgJSBzZWxmLm10aW1lLCAxMiksCisgICAgICAgICAgICAgICAgKCIgICAgICAgICIsIDgpLAorICAgICAgICAgICAgICAgIChzZWxmLnR5cGUsIDEpLAorICAgICAgICAgICAgICAgIChzZWxmLmxpbmtuYW1lLCAxMDApLAorICAgICAgICAgICAgICAgIChNQUdJQywgNiksCisgICAgICAgICAgICAgICAgKFZFUlNJT04sIDIpLAorICAgICAgICAgICAgICAgIChzZWxmLnVuYW1lLCAzMiksCisgICAgICAgICAgICAgICAgKHNlbGYuZ25hbWUsIDMyKSwKKyAgICAgICAgICAgICAgICAoIiUwN28iICUgc2VsZi5kZXZtYWpvciwgOCksCisgICAgICAgICAgICAgICAgKCIlMDdvIiAlIHNlbGYuZGV2bWlub3IsIDgpLAorICAgICAgICAgICAgICAgIChzZWxmLnByZWZpeCwgMTU1KQorICAgICAgICAgICAgKToKKyAgICAgICAgICAgIGwgPSBsZW4odmFsdWUpCisgICAgICAgICAgICBwYXJ0cy5hcHBlbmQodmFsdWUgKyAoZmllbGRzaXplIC0gbCkgKiBOVUwpCisKKyAgICAgICAgYnVmID0gIiIuam9pbihwYXJ0cykKKyAgICAgICAgY2hrc3VtID0gY2FsY19jaGtzdW0oYnVmKQorICAgICAgICBidWYgPSBidWZbOjE0OF0gKyAiJTA2b1wwIiAlIGNoa3N1bSArIGJ1ZlsxNTU6XQorICAgICAgICBidWYgKz0gKEJMT0NLU0laRSAtIGxlbihidWYpKSAqIE5VTAorICAgICAgICBzZWxmLmJ1ZiA9IGJ1ZgorICAgICAgICByZXR1cm4gYnVmCisKKyAgICBkZWYgaXNyZWcoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnR5cGUgaW4gUkVHVUxBUl9UWVBFUworICAgIGRlZiBpc2ZpbGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmlzcmVnKCkKKyAgICBkZWYgaXNkaXIoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnR5cGUgPT0gRElSVFlQRQorICAgIGRlZiBpc3N5bShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudHlwZSA9PSBTWU1UWVBFCisgICAgZGVmIGlzbG5rKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi50eXBlID09IExOS1RZUEUKKyAgICBkZWYgaXNjaHIoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnR5cGUgPT0gQ0hSVFlQRQorICAgIGRlZiBpc2JsayhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudHlwZSA9PSBCTEtUWVBFCisgICAgZGVmIGlzZmlmbyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudHlwZSA9PSBGSUZPVFlQRQorICAgIGRlZiBpc3NwYXJzZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudHlwZSA9PSBHTlVUWVBFX1NQQVJTRQorICAgIGRlZiBpc2RldihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudHlwZSBpbiAoQ0hSVFlQRSwgQkxLVFlQRSwgRklGT1RZUEUpCisjIGNsYXNzIFRhckluZm8KKworY2xhc3MgVGFyRmlsZShvYmplY3QpOgorICAgICIiIlRoZSBUYXJGaWxlIENsYXNzIHByb3ZpZGVzIGFuIGludGVyZmFjZSB0byB0YXIgYXJjaGl2ZXMuCisgICAgIiIiCisKKyAgICBkZWJ1ZyA9IDAgICAgICAgICAgICAgICAgICAgIyBNYXkgYmUgc2V0IGZyb20gMCAobm8gbXNncykgdG8gMyAoYWxsIG1zZ3MpCisKKyAgICBkZXJlZmVyZW5jZSA9IEZhbHNlICAgICAgICAgIyBJZiB0cnVlLCBhZGQgY29udGVudCBvZiBsaW5rZWQgZmlsZSB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0YXIgZmlsZSwgZWxzZSB0aGUgbGluay4KKworICAgIGlnbm9yZV96ZXJvcyA9IEZhbHNlICAgICAgICAjIElmIHRydWUsIHNraXBzIGVtcHR5IG9yIGludmFsaWQgYmxvY2tzIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGNvbnRpbnVlcyBwcm9jZXNzaW5nLgorCisgICAgZXJyb3JsZXZlbCA9IDAgICAgICAgICAgICAgICMgSWYgMCwgZmF0YWwgZXJyb3JzIG9ubHkgYXBwZWFyIGluIGRlYnVnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbWVzc2FnZXMgKGlmIGRlYnVnID49IDApLiBJZiA+IDAsIGVycm9ycworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFyZSBwYXNzZWQgdG8gdGhlIGNhbGxlciBhcyBleGNlcHRpb25zLgorCisgICAgcG9zaXggPSBUcnVlICAgICAgICAgICAgICAgICMgSWYgVHJ1ZSwgZ2VuZXJhdGVzIFBPU0lYLjEtMTk5MC1jb21wbGlhbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhcmNoaXZlcyAobm8gR05VIGV4dGVuc2lvbnMhKQorCisgICAgZmlsZW9iamVjdCA9IEV4RmlsZU9iamVjdAorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWU9Tm9uZSwgbW9kZT0iciIsIGZpbGVvYmo9Tm9uZSk6CisgICAgICAgICIiIk9wZW4gYW4gKHVuY29tcHJlc3NlZCkgdGFyIGFyY2hpdmUgYG5hbWUnLiBgbW9kZScgaXMgZWl0aGVyICdyJyB0bworICAgICAgICAgICByZWFkIGZyb20gYW4gZXhpc3RpbmcgYXJjaGl2ZSwgJ2EnIHRvIGFwcGVuZCBkYXRhIHRvIGFuIGV4aXN0aW5nCisgICAgICAgICAgIGZpbGUgb3IgJ3cnIHRvIGNyZWF0ZSBhIG5ldyBmaWxlIG92ZXJ3cml0aW5nIGFuIGV4aXN0aW5nIG9uZS4gYG1vZGUnCisgICAgICAgICAgIGRlZmF1bHRzIHRvICdyJy4KKyAgICAgICAgICAgSWYgYGZpbGVvYmonIGlzIGdpdmVuLCBpdCBpcyB1c2VkIGZvciByZWFkaW5nIG9yIHdyaXRpbmcgZGF0YS4gSWYgaXQKKyAgICAgICAgICAgY2FuIGJlIGRldGVybWluZWQsIGBtb2RlJyBpcyBvdmVycmlkZGVuIGJ5IGBmaWxlb2JqJ3MgbW9kZS4KKyAgICAgICAgICAgYGZpbGVvYmonIGlzIG5vdCBjbG9zZWQsIHdoZW4gVGFyRmlsZSBpcyBjbG9zZWQuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisKKyAgICAgICAgaWYgbGVuKG1vZGUpID4gMSBvciBtb2RlIG5vdCBpbiAicmF3IjoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJtb2RlIG11c3QgYmUgJ3InLCAnYScgb3IgJ3cnIgorICAgICAgICBzZWxmLl9tb2RlID0gbW9kZQorICAgICAgICBzZWxmLm1vZGUgPSB7InIiOiAicmIiLCAiYSI6ICJyK2IiLCAidyI6ICJ3YiJ9W21vZGVdCisKKyAgICAgICAgaWYgbm90IGZpbGVvYmo6CisgICAgICAgICAgICBmaWxlb2JqID0gZmlsZShzZWxmLm5hbWUsIHNlbGYubW9kZSkKKyAgICAgICAgICAgIHNlbGYuX2V4dGZpbGVvYmogPSBGYWxzZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgc2VsZi5uYW1lIGlzIE5vbmUgYW5kIGhhc2F0dHIoZmlsZW9iaiwgIm5hbWUiKToKKyAgICAgICAgICAgICAgICBzZWxmLm5hbWUgPSBmaWxlb2JqLm5hbWUKKyAgICAgICAgICAgIGlmIGhhc2F0dHIoZmlsZW9iaiwgIm1vZGUiKToKKyAgICAgICAgICAgICAgICBzZWxmLm1vZGUgPSBmaWxlb2JqLm1vZGUKKyAgICAgICAgICAgIHNlbGYuX2V4dGZpbGVvYmogPSBUcnVlCisgICAgICAgIHNlbGYuZmlsZW9iaiA9IGZpbGVvYmoKKworICAgICAgICAjIEluaXQgZGF0YXN0cnVjdHVyZXMKKyAgICAgICAgc2VsZi5jbG9zZWQgICAgICA9IEZhbHNlCisgICAgICAgIHNlbGYubWVtYmVycyAgICAgPSBbXSAgICAgICAjIGxpc3Qgb2YgbWVtYmVycyBhcyBUYXJJbmZvIG9iamVjdHMKKyAgICAgICAgc2VsZi5tZW1iZXJuYW1lcyA9IFtdICAgICAgICMgbmFtZXMgb2YgbWVtYmVycworICAgICAgICBzZWxmLmNodW5rcyAgICAgID0gWzBdICAgICAgIyBjaHVuayBjYWNoZQorICAgICAgICBzZWxmLl9sb2FkZWQgICAgID0gRmFsc2UgICAgIyBmbGFnIGlmIGFsbCBtZW1iZXJzIGhhdmUgYmVlbiByZWFkCisgICAgICAgIHNlbGYub2Zmc2V0ICAgICAgPSAwTCAgICAgICAjIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIGFyY2hpdmUgZmlsZQorICAgICAgICBzZWxmLmlub2RlcyAgICAgID0ge30gICAgICAgIyBkaWN0aW9uYXJ5IGNhY2hpbmcgdGhlIGlub2RlcyBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhcmNoaXZlIG1lbWJlcnMgYWxyZWFkeSBhZGRlZAorCisgICAgICAgIGlmIHNlbGYuX21vZGUgPT0gInIiOgorICAgICAgICAgICAgc2VsZi5maXJzdG1lbWJlciA9IE5vbmUKKyAgICAgICAgICAgIHNlbGYuZmlyc3RtZW1iZXIgPSBzZWxmLm5leHQoKQorCisgICAgICAgIGlmIHNlbGYuX21vZGUgPT0gImEiOgorICAgICAgICAgICAgIyBNb3ZlIHRvIHRoZSBlbmQgb2YgdGhlIGFyY2hpdmUsCisgICAgICAgICAgICAjIGJlZm9yZSB0aGUgZmlyc3QgZW1wdHkgYmxvY2suCisgICAgICAgICAgICBzZWxmLmZpcnN0bWVtYmVyID0gTm9uZQorICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLm5leHQoKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBSZWFkRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZW9iai5zZWVrKDApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgaWYgdGFyaW5mbyBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbGVvYmouc2VlaygtIEJMT0NLU0laRSwgMSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICBpZiBzZWxmLl9tb2RlIGluICJhdyI6CisgICAgICAgICAgICBzZWxmLl9sb2FkZWQgPSBUcnVlCisKKyAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIEJlbG93IGFyZSB0aGUgY2xhc3NtZXRob2RzIHdoaWNoIGFjdCBhcyBhbHRlcm5hdGUgY29uc3RydWN0b3JzIHRvIHRoZQorICAgICMgVGFyRmlsZSBjbGFzcy4gVGhlIG9wZW4oKSBtZXRob2QgaXMgdGhlIG9ubHkgb25lIHRoYXQgaXMgbmVlZGVkIGZvcgorICAgICMgcHVibGljIHVzZTsgaXQgaXMgdGhlICJzdXBlciItY29uc3RydWN0b3IgYW5kIGlzIGFibGUgdG8gc2VsZWN0IGFuCisgICAgIyBhZGVxdWF0ZSAic3ViIi1jb25zdHJ1Y3RvciBmb3IgYSBwYXJ0aWN1bGFyIGNvbXByZXNzaW9uIHVzaW5nIHRoZSBtYXBwaW5nCisgICAgIyBmcm9tIE9QRU5fTUVUSC4KKyAgICAjCisgICAgIyBUaGlzIGNvbmNlcHQgYWxsb3dzIG9uZSB0byBzdWJjbGFzcyBUYXJGaWxlIHdpdGhvdXQgbG9zaW5nIHRoZSBjb21mb3J0IG9mCisgICAgIyB0aGUgc3VwZXItY29uc3RydWN0b3IuIEEgc3ViLWNvbnN0cnVjdG9yIGlzIHJlZ2lzdGVyZWQgYW5kIG1hZGUgYXZhaWxhYmxlCisgICAgIyBieSBhZGRpbmcgaXQgdG8gdGhlIG1hcHBpbmcgaW4gT1BFTl9NRVRILgorCisgICAgZGVmIG9wZW4oY2xzLCBuYW1lPU5vbmUsIG1vZGU9InIiLCBmaWxlb2JqPU5vbmUsIGJ1ZnNpemU9MjAqNTEyKToKKyAgICAgICAgIiIiT3BlbiBhIHRhciBhcmNoaXZlIGZvciByZWFkaW5nLCB3cml0aW5nIG9yIGFwcGVuZGluZy4gUmV0dXJuCisgICAgICAgICAgIGFuIGFwcHJvcHJpYXRlIFRhckZpbGUgY2xhc3MuCisKKyAgICAgICAgICAgbW9kZToKKyAgICAgICAgICAgJ3InICAgICAgICAgIG9wZW4gZm9yIHJlYWRpbmcgd2l0aCB0cmFuc3BhcmVudCBjb21wcmVzc2lvbgorICAgICAgICAgICAncjonICAgICAgICAgb3BlbiBmb3IgcmVhZGluZyBleGNsdXNpdmVseSB1bmNvbXByZXNzZWQKKyAgICAgICAgICAgJ3I6Z3onICAgICAgIG9wZW4gZm9yIHJlYWRpbmcgd2l0aCBnemlwIGNvbXByZXNzaW9uCisgICAgICAgICAgICdyOmJ6MicgICAgICBvcGVuIGZvciByZWFkaW5nIHdpdGggYnppcDIgY29tcHJlc3Npb24KKyAgICAgICAgICAgJ2EnIG9yICdhOicgIG9wZW4gZm9yIGFwcGVuZGluZworICAgICAgICAgICAndycgb3IgJ3c6JyAgb3BlbiBmb3Igd3JpdGluZyB3aXRob3V0IGNvbXByZXNzaW9uCisgICAgICAgICAgICd3Omd6JyAgICAgICBvcGVuIGZvciB3cml0aW5nIHdpdGggZ3ppcCBjb21wcmVzc2lvbgorICAgICAgICAgICAndzpiejInICAgICAgb3BlbiBmb3Igd3JpdGluZyB3aXRoIGJ6aXAyIGNvbXByZXNzaW9uCisgICAgICAgICAgICdyfCcgICAgICAgICBvcGVuIGFuIHVuY29tcHJlc3NlZCBzdHJlYW0gb2YgdGFyIGJsb2NrcyBmb3IgcmVhZGluZworICAgICAgICAgICAncnxneicgICAgICAgb3BlbiBhIGd6aXAgY29tcHJlc3NlZCBzdHJlYW0gb2YgdGFyIGJsb2NrcworICAgICAgICAgICAncnxiejInICAgICAgb3BlbiBhIGJ6aXAyIGNvbXByZXNzZWQgc3RyZWFtIG9mIHRhciBibG9ja3MKKyAgICAgICAgICAgJ3d8JyAgICAgICAgIG9wZW4gYW4gdW5jb21wcmVzc2VkIHN0cmVhbSBmb3Igd3JpdGluZworICAgICAgICAgICAnd3xneicgICAgICAgb3BlbiBhIGd6aXAgY29tcHJlc3NlZCBzdHJlYW0gZm9yIHdyaXRpbmcKKyAgICAgICAgICAgJ3d8YnoyJyAgICAgIG9wZW4gYSBiemlwMiBjb21wcmVzc2VkIHN0cmVhbSBmb3Igd3JpdGluZworICAgICAgICAiIiIKKworICAgICAgICBpZiBub3QgbmFtZSBhbmQgbm90IGZpbGVvYmo6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAibm90aGluZyB0byBvcGVuIgorCisgICAgICAgIGlmICI6IiBpbiBtb2RlOgorICAgICAgICAgICAgZmlsZW1vZGUsIGNvbXB0eXBlID0gbW9kZS5zcGxpdCgiOiIsIDEpCisgICAgICAgICAgICBmaWxlbW9kZSA9IGZpbGVtb2RlIG9yICJyIgorICAgICAgICAgICAgY29tcHR5cGUgPSBjb21wdHlwZSBvciAidGFyIgorCisgICAgICAgICAgICAjIFNlbGVjdCB0aGUgKm9wZW4oKSBmdW5jdGlvbiBhY2NvcmRpbmcgdG8KKyAgICAgICAgICAgICMgZ2l2ZW4gY29tcHJlc3Npb24uCisgICAgICAgICAgICBpZiBjb21wdHlwZSBpbiBjbHMuT1BFTl9NRVRIOgorICAgICAgICAgICAgICAgIGZ1bmMgPSBnZXRhdHRyKGNscywgY2xzLk9QRU5fTUVUSFtjb21wdHlwZV0pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIENvbXByZXNzaW9uRXJyb3IsICJ1bmtub3duIGNvbXByZXNzaW9uIHR5cGUgJXIiICUgY29tcHR5cGUKKyAgICAgICAgICAgIHJldHVybiBmdW5jKG5hbWUsIGZpbGVtb2RlLCBmaWxlb2JqKQorCisgICAgICAgIGVsaWYgInwiIGluIG1vZGU6CisgICAgICAgICAgICBmaWxlbW9kZSwgY29tcHR5cGUgPSBtb2RlLnNwbGl0KCJ8IiwgMSkKKyAgICAgICAgICAgIGZpbGVtb2RlID0gZmlsZW1vZGUgb3IgInIiCisgICAgICAgICAgICBjb21wdHlwZSA9IGNvbXB0eXBlIG9yICJ0YXIiCisKKyAgICAgICAgICAgIGlmIGZpbGVtb2RlIG5vdCBpbiAicnciOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJtb2RlIG11c3QgYmUgJ3InIG9yICd3JyIKKworICAgICAgICAgICAgdCA9IGNscyhuYW1lLCBmaWxlbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgX1N0cmVhbShuYW1lLCBmaWxlbW9kZSwgY29tcHR5cGUsIGZpbGVvYmosIGJ1ZnNpemUpKQorICAgICAgICAgICAgdC5fZXh0ZmlsZW9iaiA9IEZhbHNlCisgICAgICAgICAgICByZXR1cm4gdAorCisgICAgICAgIGVsaWYgbW9kZSA9PSAiciI6CisgICAgICAgICAgICAjIEZpbmQgb3V0IHdoaWNoICpvcGVuKCkgaXMgYXBwcm9wcmlhdGUgZm9yIG9wZW5pbmcgdGhlIGZpbGUuCisgICAgICAgICAgICBmb3IgY29tcHR5cGUgaW4gY2xzLk9QRU5fTUVUSDoKKyAgICAgICAgICAgICAgICBmdW5jID0gZ2V0YXR0cihjbHMsIGNscy5PUEVOX01FVEhbY29tcHR5cGVdKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmMobmFtZSwgInIiLCBmaWxlb2JqKQorICAgICAgICAgICAgICAgIGV4Y2VwdCAoUmVhZEVycm9yLCBDb21wcmVzc2lvbkVycm9yKToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHJhaXNlIFJlYWRFcnJvciwgImZpbGUgY291bGQgbm90IGJlIG9wZW5lZCBzdWNjZXNzZnVsbHkiCisKKyAgICAgICAgZWxpZiBtb2RlIGluICJhdyI6CisgICAgICAgICAgICByZXR1cm4gY2xzLnRhcm9wZW4obmFtZSwgbW9kZSwgZmlsZW9iaikKKworICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAidW5kaXNjZXJuaWJsZSBtb2RlIgorCisgICAgb3BlbiA9IGNsYXNzbWV0aG9kKG9wZW4pCisKKyAgICBkZWYgdGFyb3BlbihjbHMsIG5hbWUsIG1vZGU9InIiLCBmaWxlb2JqPU5vbmUpOgorICAgICAgICAiIiJPcGVuIHVuY29tcHJlc3NlZCB0YXIgYXJjaGl2ZSBuYW1lIGZvciByZWFkaW5nIG9yIHdyaXRpbmcuCisgICAgICAgICIiIgorICAgICAgICBpZiBsZW4obW9kZSkgPiAxIG9yIG1vZGUgbm90IGluICJyYXciOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgIm1vZGUgbXVzdCBiZSAncicsICdhJyBvciAndyciCisgICAgICAgIHJldHVybiBjbHMobmFtZSwgbW9kZSwgZmlsZW9iaikKKworICAgIHRhcm9wZW4gPSBjbGFzc21ldGhvZCh0YXJvcGVuKQorCisgICAgZGVmIGd6b3BlbihjbHMsIG5hbWUsIG1vZGU9InIiLCBmaWxlb2JqPU5vbmUsIGNvbXByZXNzbGV2ZWw9OSk6CisgICAgICAgICIiIk9wZW4gZ3ppcCBjb21wcmVzc2VkIHRhciBhcmNoaXZlIG5hbWUgZm9yIHJlYWRpbmcgb3Igd3JpdGluZy4KKyAgICAgICAgICAgQXBwZW5kaW5nIGlzIG5vdCBhbGxvd2VkLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgbGVuKG1vZGUpID4gMSBvciBtb2RlIG5vdCBpbiAicnciOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgIm1vZGUgbXVzdCBiZSAncicgb3IgJ3cnIgorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGltcG9ydCBnemlwCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIENvbXByZXNzaW9uRXJyb3IsICJnemlwIG1vZHVsZSBpcyBub3QgYXZhaWxhYmxlIgorCisgICAgICAgIHByZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChuYW1lKQorICAgICAgICBwcmUgPSBvcy5wYXRoLmJhc2VuYW1lKHByZSkKKyAgICAgICAgaWYgZXh0ID09ICIudGd6IjoKKyAgICAgICAgICAgIGV4dCA9ICIudGFyIgorICAgICAgICBpZiBleHQgPT0gIi5neiI6CisgICAgICAgICAgICBleHQgPSAiIgorICAgICAgICB0YXJuYW1lID0gcHJlICsgZXh0CisKKyAgICAgICAgaWYgZmlsZW9iaiBpcyBOb25lOgorICAgICAgICAgICAgZmlsZW9iaiA9IGZpbGUobmFtZSwgbW9kZSArICJiIikKKworICAgICAgICBpZiBtb2RlICE9ICJyIjoKKyAgICAgICAgICAgIG5hbWUgPSB0YXJuYW1lCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdCA9IGNscy50YXJvcGVuKHRhcm5hbWUsIG1vZGUsCisgICAgICAgICAgICAgICAgZ3ppcC5HemlwRmlsZShuYW1lLCBtb2RlLCBjb21wcmVzc2xldmVsLCBmaWxlb2JqKQorICAgICAgICAgICAgKQorICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIFJlYWRFcnJvciwgIm5vdCBhIGd6aXAgZmlsZSIKKyAgICAgICAgdC5fZXh0ZmlsZW9iaiA9IEZhbHNlCisgICAgICAgIHJldHVybiB0CisKKyAgICBnem9wZW4gPSBjbGFzc21ldGhvZChnem9wZW4pCisKKyAgICBkZWYgYnoyb3BlbihjbHMsIG5hbWUsIG1vZGU9InIiLCBmaWxlb2JqPU5vbmUsIGNvbXByZXNzbGV2ZWw9OSk6CisgICAgICAgICIiIk9wZW4gYnppcDIgY29tcHJlc3NlZCB0YXIgYXJjaGl2ZSBuYW1lIGZvciByZWFkaW5nIG9yIHdyaXRpbmcuCisgICAgICAgICAgIEFwcGVuZGluZyBpcyBub3QgYWxsb3dlZC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGxlbihtb2RlKSA+IDEgb3IgbW9kZSBub3QgaW4gInJ3IjoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJtb2RlIG11c3QgYmUgJ3InIG9yICd3Jy4iCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW1wb3J0IGJ6MgorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICByYWlzZSBDb21wcmVzc2lvbkVycm9yLCAiYnoyIG1vZHVsZSBpcyBub3QgYXZhaWxhYmxlIgorCisgICAgICAgIHByZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChuYW1lKQorICAgICAgICBwcmUgPSBvcy5wYXRoLmJhc2VuYW1lKHByZSkKKyAgICAgICAgaWYgZXh0ID09ICIudGJ6MiI6CisgICAgICAgICAgICBleHQgPSAiLnRhciIKKyAgICAgICAgaWYgZXh0ID09ICIuYnoyIjoKKyAgICAgICAgICAgIGV4dCA9ICIiCisgICAgICAgIHRhcm5hbWUgPSBwcmUgKyBleHQKKworICAgICAgICBpZiBmaWxlb2JqIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgIm5vIHN1cHBvcnQgZm9yIGV4dGVybmFsIGZpbGUgb2JqZWN0cyIKKworICAgICAgICB0cnk6CisgICAgICAgICAgICB0ID0gY2xzLnRhcm9wZW4odGFybmFtZSwgbW9kZSwgYnoyLkJaMkZpbGUobmFtZSwgbW9kZSwgY29tcHJlc3NsZXZlbD1jb21wcmVzc2xldmVsKSkKKyAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICByYWlzZSBSZWFkRXJyb3IsICJub3QgYSBiemlwMiBmaWxlIgorICAgICAgICB0Ll9leHRmaWxlb2JqID0gRmFsc2UKKyAgICAgICAgcmV0dXJuIHQKKworICAgIGJ6Mm9wZW4gPSBjbGFzc21ldGhvZChiejJvcGVuKQorCisgICAgIyBBbGwgKm9wZW4oKSBtZXRob2RzIGFyZSByZWdpc3RlcmVkIGhlcmUuCisgICAgT1BFTl9NRVRIID0geworICAgICAgICAidGFyIjogInRhcm9wZW4iLCAgICMgdW5jb21wcmVzc2VkIHRhcgorICAgICAgICAiZ3oiOiAgImd6b3BlbiIsICAgICMgZ3ppcCBjb21wcmVzc2VkIHRhcgorICAgICAgICAiYnoyIjogImJ6Mm9wZW4iICAgICMgYnppcDIgY29tcHJlc3NlZCB0YXIKKyAgICB9CisKKyAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIFRoZSBwdWJsaWMgbWV0aG9kcyB3aGljaCBUYXJGaWxlIHByb3ZpZGVzOgorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICAiIiJDbG9zZSB0aGUgVGFyRmlsZS4gSW4gd3JpdGUtbW9kZSwgdHdvIGZpbmlzaGluZyB6ZXJvIGJsb2NrcyBhcmUKKyAgICAgICAgICAgYXBwZW5kZWQgdG8gdGhlIGFyY2hpdmUuCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLmNsb3NlZDoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGlmIHNlbGYuX21vZGUgaW4gImF3IjoKKyAgICAgICAgICAgIHNlbGYuZmlsZW9iai53cml0ZShOVUwgKiAoQkxPQ0tTSVpFICogMikpCisgICAgICAgICAgICBzZWxmLm9mZnNldCArPSAoQkxPQ0tTSVpFICogMikKKyAgICAgICAgICAgICMgZmlsbCB1cCB0aGUgZW5kIHdpdGggemVyby1ibG9ja3MKKyAgICAgICAgICAgICMgKGxpa2Ugb3B0aW9uIC1iMjAgZm9yIHRhciBkb2VzKQorICAgICAgICAgICAgYmxvY2tzLCByZW1haW5kZXIgPSBkaXZtb2Qoc2VsZi5vZmZzZXQsIFJFQ09SRFNJWkUpCisgICAgICAgICAgICBpZiByZW1haW5kZXIgPiAwOgorICAgICAgICAgICAgICAgIHNlbGYuZmlsZW9iai53cml0ZShOVUwgKiAoUkVDT1JEU0laRSAtIHJlbWFpbmRlcikpCisKKyAgICAgICAgaWYgbm90IHNlbGYuX2V4dGZpbGVvYmo6CisgICAgICAgICAgICBzZWxmLmZpbGVvYmouY2xvc2UoKQorICAgICAgICBzZWxmLmNsb3NlZCA9IFRydWUKKworICAgIGRlZiBnZXRtZW1iZXIoc2VsZiwgbmFtZSk6CisgICAgICAgICIiIlJldHVybiBhIFRhckluZm8gb2JqZWN0IGZvciBtZW1iZXIgYG5hbWUnLiBJZiBgbmFtZScgY2FuIG5vdCBiZQorICAgICAgICAgICBmb3VuZCBpbiB0aGUgYXJjaGl2ZSwgS2V5RXJyb3IgaXMgcmFpc2VkLiBJZiBhIG1lbWJlciBvY2N1cnMgbW9yZQorICAgICAgICAgICB0aGFuIG9uY2UgaW4gdGhlIGFyY2hpdmUsIGl0cyBsYXN0IG9jY3VyZW5jZSBpcyBhc3N1bWVkIHRvIGJlIHRoZQorICAgICAgICAgICBtb3N0IHVwLXRvLWRhdGUgdmVyc2lvbi4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX2NoZWNrKCkKKyAgICAgICAgaWYgbmFtZSBub3QgaW4gc2VsZi5tZW1iZXJuYW1lcyBhbmQgbm90IHNlbGYuX2xvYWRlZDoKKyAgICAgICAgICAgIHNlbGYuX2xvYWQoKQorICAgICAgICBpZiBuYW1lIG5vdCBpbiBzZWxmLm1lbWJlcm5hbWVzOgorICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IsICJmaWxlbmFtZSAlciBub3QgZm91bmQiICUgbmFtZQorICAgICAgICByZXR1cm4gc2VsZi5fZ2V0bWVtYmVyKG5hbWUpCisKKyAgICBkZWYgZ2V0bWVtYmVycyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBtZW1iZXJzIG9mIHRoZSBhcmNoaXZlIGFzIGEgbGlzdCBvZiBUYXJJbmZvIG9iamVjdHMuIFRoZQorICAgICAgICAgICBsaXN0IGhhcyB0aGUgc2FtZSBvcmRlciBhcyB0aGUgbWVtYmVycyBpbiB0aGUgYXJjaGl2ZS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX2NoZWNrKCkKKyAgICAgICAgaWYgbm90IHNlbGYuX2xvYWRlZDogICAgIyBpZiB3ZSB3YW50IHRvIG9idGFpbiBhIGxpc3Qgb2YKKyAgICAgICAgICAgIHNlbGYuX2xvYWQoKSAgICAgICAgIyBhbGwgbWVtYmVycywgd2UgZmlyc3QgaGF2ZSB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNjYW4gdGhlIHdob2xlIGFyY2hpdmUuCisgICAgICAgIHJldHVybiBzZWxmLm1lbWJlcnMKKworICAgIGRlZiBnZXRuYW1lcyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBtZW1iZXJzIG9mIHRoZSBhcmNoaXZlIGFzIGEgbGlzdCBvZiB0aGVpciBuYW1lcy4gSXQgaGFzCisgICAgICAgICAgIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBsaXN0IHJldHVybmVkIGJ5IGdldG1lbWJlcnMoKS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX2NoZWNrKCkKKyAgICAgICAgaWYgbm90IHNlbGYuX2xvYWRlZDoKKyAgICAgICAgICAgIHNlbGYuX2xvYWQoKQorICAgICAgICByZXR1cm4gc2VsZi5tZW1iZXJuYW1lcworCisgICAgZGVmIGdldHRhcmluZm8oc2VsZiwgbmFtZT1Ob25lLCBhcmNuYW1lPU5vbmUsIGZpbGVvYmo9Tm9uZSk6CisgICAgICAgICIiIkNyZWF0ZSBhIFRhckluZm8gb2JqZWN0IGZvciBlaXRoZXIgdGhlIGZpbGUgYG5hbWUnIG9yIHRoZSBmaWxlCisgICAgICAgICAgIG9iamVjdCBgZmlsZW9iaicgKHVzaW5nIG9zLmZzdGF0IG9uIGl0cyBmaWxlIGRlc2NyaXB0b3IpLiBZb3UgY2FuCisgICAgICAgICAgIG1vZGlmeSBzb21lIG9mIHRoZSBUYXJJbmZvJ3MgYXR0cmlidXRlcyBiZWZvcmUgeW91IGFkZCBpdCB1c2luZworICAgICAgICAgICBhZGRmaWxlKCkuIElmIGdpdmVuLCBgYXJjbmFtZScgc3BlY2lmaWVzIGFuIGFsdGVybmF0aXZlIG5hbWUgZm9yIHRoZQorICAgICAgICAgICBmaWxlIGluIHRoZSBhcmNoaXZlLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fY2hlY2soImF3IikKKworICAgICAgICAjIFdoZW4gZmlsZW9iaiBpcyBnaXZlbiwgcmVwbGFjZSBuYW1lIGJ5CisgICAgICAgICMgZmlsZW9iaidzIHJlYWwgbmFtZS4KKyAgICAgICAgaWYgZmlsZW9iaiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIG5hbWUgPSBmaWxlb2JqLm5hbWUKKworICAgICAgICAjIEJ1aWxkaW5nIHRoZSBuYW1lIG9mIHRoZSBtZW1iZXIgaW4gdGhlIGFyY2hpdmUuCisgICAgICAgICMgQmFja3dhcmQgc2xhc2hlcyBhcmUgY29udmVydGVkIHRvIGZvcndhcmQgc2xhc2hlcywKKyAgICAgICAgIyBBYnNvbHV0ZSBwYXRocyBhcmUgdHVybmVkIHRvIHJlbGF0aXZlIHBhdGhzLgorICAgICAgICBpZiBhcmNuYW1lIGlzIE5vbmU6CisgICAgICAgICAgICBhcmNuYW1lID0gbmFtZQorICAgICAgICBhcmNuYW1lID0gbm9ybXBhdGgoYXJjbmFtZSkKKyAgICAgICAgZHJ2LCBhcmNuYW1lID0gb3MucGF0aC5zcGxpdGRyaXZlKGFyY25hbWUpCisgICAgICAgIHdoaWxlIGFyY25hbWVbMDoxXSA9PSAiLyI6CisgICAgICAgICAgICBhcmNuYW1lID0gYXJjbmFtZVsxOl0KKworICAgICAgICAjIE5vdywgZmlsbCB0aGUgVGFySW5mbyBvYmplY3Qgd2l0aAorICAgICAgICAjIGluZm9ybWF0aW9uIHNwZWNpZmljIGZvciB0aGUgZmlsZS4KKyAgICAgICAgdGFyaW5mbyA9IFRhckluZm8oKQorCisgICAgICAgICMgVXNlIG9zLnN0YXQgb3Igb3MubHN0YXQsIGRlcGVuZGluZyBvbiBwbGF0Zm9ybQorICAgICAgICAjIGFuZCBpZiBzeW1saW5rcyBzaGFsbCBiZSByZXNvbHZlZC4KKyAgICAgICAgaWYgZmlsZW9iaiBpcyBOb25lOgorICAgICAgICAgICAgaWYgaGFzYXR0cihvcywgImxzdGF0IikgYW5kIG5vdCBzZWxmLmRlcmVmZXJlbmNlOgorICAgICAgICAgICAgICAgIHN0YXRyZXMgPSBvcy5sc3RhdChuYW1lKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzdGF0cmVzID0gb3Muc3RhdChuYW1lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3RhdHJlcyA9IG9zLmZzdGF0KGZpbGVvYmouZmlsZW5vKCkpCisgICAgICAgIGxpbmtuYW1lID0gIiIKKworICAgICAgICBzdG1kID0gc3RhdHJlcy5zdF9tb2RlCisgICAgICAgIGlmIHN0YXQuU19JU1JFRyhzdG1kKToKKyAgICAgICAgICAgIGlub2RlID0gKHN0YXRyZXMuc3RfaW5vLCBzdGF0cmVzLnN0X2RldikKKyAgICAgICAgICAgIGlmIGlub2RlIGluIHNlbGYuaW5vZGVzIGFuZCBub3Qgc2VsZi5kZXJlZmVyZW5jZToKKyAgICAgICAgICAgICAgICAjIElzIGl0IGEgaGFyZGxpbmsgdG8gYW4gYWxyZWFkeQorICAgICAgICAgICAgICAgICMgYXJjaGl2ZWQgZmlsZT8KKyAgICAgICAgICAgICAgICB0eXBlID0gTE5LVFlQRQorICAgICAgICAgICAgICAgIGxpbmtuYW1lID0gc2VsZi5pbm9kZXNbaW5vZGVdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgVGhlIGlub2RlIGlzIGFkZGVkIG9ubHkgaWYgaXRzIHZhbGlkLgorICAgICAgICAgICAgICAgICMgRm9yIHdpbjMyIGl0IGlzIGFsd2F5cyAwLgorICAgICAgICAgICAgICAgIHR5cGUgPSBSRUdUWVBFCisgICAgICAgICAgICAgICAgaWYgaW5vZGVbMF06CisgICAgICAgICAgICAgICAgICAgIHNlbGYuaW5vZGVzW2lub2RlXSA9IGFyY25hbWUKKyAgICAgICAgZWxpZiBzdGF0LlNfSVNESVIoc3RtZCk6CisgICAgICAgICAgICB0eXBlID0gRElSVFlQRQorICAgICAgICAgICAgaWYgYXJjbmFtZVstMTpdICE9ICIvIjoKKyAgICAgICAgICAgICAgICBhcmNuYW1lICs9ICIvIgorICAgICAgICBlbGlmIHN0YXQuU19JU0ZJRk8oc3RtZCk6CisgICAgICAgICAgICB0eXBlID0gRklGT1RZUEUKKyAgICAgICAgZWxpZiBzdGF0LlNfSVNMTksoc3RtZCk6CisgICAgICAgICAgICB0eXBlID0gU1lNVFlQRQorICAgICAgICAgICAgbGlua25hbWUgPSBvcy5yZWFkbGluayhuYW1lKQorICAgICAgICBlbGlmIHN0YXQuU19JU0NIUihzdG1kKToKKyAgICAgICAgICAgIHR5cGUgPSBDSFJUWVBFCisgICAgICAgIGVsaWYgc3RhdC5TX0lTQkxLKHN0bWQpOgorICAgICAgICAgICAgdHlwZSA9IEJMS1RZUEUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgIyBGaWxsIHRoZSBUYXJJbmZvIG9iamVjdCB3aXRoIGFsbAorICAgICAgICAjIGluZm9ybWF0aW9uIHdlIGNhbiBnZXQuCisgICAgICAgIHRhcmluZm8ubmFtZSAgPSBhcmNuYW1lCisgICAgICAgIHRhcmluZm8ubW9kZSAgPSBzdG1kCisgICAgICAgIHRhcmluZm8udWlkICAgPSBzdGF0cmVzLnN0X3VpZAorICAgICAgICB0YXJpbmZvLmdpZCAgID0gc3RhdHJlcy5zdF9naWQKKyAgICAgICAgdGFyaW5mby5zaXplICA9IHN0YXRyZXMuc3Rfc2l6ZQorICAgICAgICB0YXJpbmZvLm10aW1lID0gc3RhdHJlcy5zdF9tdGltZQorICAgICAgICB0YXJpbmZvLnR5cGUgID0gdHlwZQorICAgICAgICB0YXJpbmZvLmxpbmtuYW1lID0gbGlua25hbWUKKyAgICAgICAgaWYgcHdkOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHRhcmluZm8udW5hbWUgPSBwd2QuZ2V0cHd1aWQodGFyaW5mby51aWQpWzBdCisgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBpZiBncnA6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdGFyaW5mby5nbmFtZSA9IGdycC5nZXRncmdpZCh0YXJpbmZvLmdpZClbMF0KKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgaWYgdHlwZSBpbiAoQ0hSVFlQRSwgQkxLVFlQRSk6CisgICAgICAgICAgICBpZiBoYXNhdHRyKG9zLCAibWFqb3IiKSBhbmQgaGFzYXR0cihvcywgIm1pbm9yIik6CisgICAgICAgICAgICAgICAgdGFyaW5mby5kZXZtYWpvciA9IG9zLm1ham9yKHN0YXRyZXMuc3RfcmRldikKKyAgICAgICAgICAgICAgICB0YXJpbmZvLmRldm1pbm9yID0gb3MubWlub3Ioc3RhdHJlcy5zdF9yZGV2KQorICAgICAgICByZXR1cm4gdGFyaW5mbworCisgICAgZGVmIGxpc3Qoc2VsZiwgdmVyYm9zZT1UcnVlKToKKyAgICAgICAgIiIiUHJpbnQgYSB0YWJsZSBvZiBjb250ZW50cyB0byBzeXMuc3Rkb3V0LiBJZiBgdmVyYm9zZScgaXMgRmFsc2UsIG9ubHkKKyAgICAgICAgICAgdGhlIG5hbWVzIG9mIHRoZSBtZW1iZXJzIGFyZSBwcmludGVkLiBJZiBpdCBpcyBUcnVlLCBhbiBgbHMgLWwnLWxpa2UKKyAgICAgICAgICAgb3V0cHV0IGlzIHByb2R1Y2VkLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fY2hlY2soKQorCisgICAgICAgIGZvciB0YXJpbmZvIGluIHNlbGY6CisgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgIHByaW50IGZpbGVtb2RlKHRhcmluZm8ubW9kZSksCisgICAgICAgICAgICAgICAgcHJpbnQgIiVzLyVzIiAlICh0YXJpbmZvLnVuYW1lIG9yIHRhcmluZm8udWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyaW5mby5nbmFtZSBvciB0YXJpbmZvLmdpZCksCisgICAgICAgICAgICAgICAgaWYgdGFyaW5mby5pc2NocigpIG9yIHRhcmluZm8uaXNibGsoKToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgIiUxMHMiICUgKCIlZCwlZCIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAodGFyaW5mby5kZXZtYWpvciwgdGFyaW5mby5kZXZtaW5vcikpLAorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICIlMTBkIiAlIHRhcmluZm8uc2l6ZSwKKyAgICAgICAgICAgICAgICBwcmludCAiJWQtJTAyZC0lMDJkICUwMmQ6JTAyZDolMDJkIiBcCisgICAgICAgICAgICAgICAgICAgICAgJSB0aW1lLmxvY2FsdGltZSh0YXJpbmZvLm10aW1lKVs6Nl0sCisKKyAgICAgICAgICAgIHByaW50IHRhcmluZm8ubmFtZSwKKworICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBpZiB0YXJpbmZvLmlzc3ltKCk6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICItPiIsIHRhcmluZm8ubGlua25hbWUsCisgICAgICAgICAgICAgICAgaWYgdGFyaW5mby5pc2xuaygpOgorICAgICAgICAgICAgICAgICAgICBwcmludCAibGluayB0byIsIHRhcmluZm8ubGlua25hbWUsCisgICAgICAgICAgICBwcmludAorCisgICAgZGVmIGFkZChzZWxmLCBuYW1lLCBhcmNuYW1lPU5vbmUsIHJlY3Vyc2l2ZT1UcnVlKToKKyAgICAgICAgIiIiQWRkIHRoZSBmaWxlIGBuYW1lJyB0byB0aGUgYXJjaGl2ZS4gYG5hbWUnIG1heSBiZSBhbnkgdHlwZSBvZiBmaWxlCisgICAgICAgICAgIChkaXJlY3RvcnksIGZpZm8sIHN5bWJvbGljIGxpbmssIGV0Yy4pLiBJZiBnaXZlbiwgYGFyY25hbWUnCisgICAgICAgICAgIHNwZWNpZmllcyBhbiBhbHRlcm5hdGl2ZSBuYW1lIGZvciB0aGUgZmlsZSBpbiB0aGUgYXJjaGl2ZS4KKyAgICAgICAgICAgRGlyZWN0b3JpZXMgYXJlIGFkZGVkIHJlY3Vyc2l2ZWx5IGJ5IGRlZmF1bHQuIFRoaXMgY2FuIGJlIGF2b2lkZWQgYnkKKyAgICAgICAgICAgc2V0dGluZyBgcmVjdXJzaXZlJyB0byBGYWxzZS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX2NoZWNrKCJhdyIpCisKKyAgICAgICAgaWYgYXJjbmFtZSBpcyBOb25lOgorICAgICAgICAgICAgYXJjbmFtZSA9IG5hbWUKKworICAgICAgICAjIFNraXAgaWYgc29tZWJvZHkgdHJpZXMgdG8gYXJjaGl2ZSB0aGUgYXJjaGl2ZS4uLgorICAgICAgICBpZiBzZWxmLm5hbWUgaXMgbm90IE5vbmUgXAorICAgICAgICAgICAgYW5kIG9zLnBhdGguYWJzcGF0aChuYW1lKSA9PSBvcy5wYXRoLmFic3BhdGgoc2VsZi5uYW1lKToKKyAgICAgICAgICAgIHNlbGYuX2RiZygyLCAidGFyZmlsZTogU2tpcHBlZCAlciIgJSBuYW1lKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBTcGVjaWFsIGNhc2U6IFRoZSB1c2VyIHdhbnRzIHRvIGFkZCB0aGUgY3VycmVudAorICAgICAgICAjIHdvcmtpbmcgZGlyZWN0b3J5LgorICAgICAgICBpZiBuYW1lID09ICIuIjoKKyAgICAgICAgICAgIGlmIHJlY3Vyc2l2ZToKKyAgICAgICAgICAgICAgICBpZiBhcmNuYW1lID09ICIuIjoKKyAgICAgICAgICAgICAgICAgICAgYXJjbmFtZSA9ICIiCisgICAgICAgICAgICAgICAgZm9yIGYgaW4gb3MubGlzdGRpcigiLiIpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZChmLCBvcy5wYXRoLmpvaW4oYXJjbmFtZSwgZikpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBzZWxmLl9kYmcoMSwgbmFtZSkKKworICAgICAgICAjIENyZWF0ZSBhIFRhckluZm8gb2JqZWN0IGZyb20gdGhlIGZpbGUuCisgICAgICAgIHRhcmluZm8gPSBzZWxmLmdldHRhcmluZm8obmFtZSwgYXJjbmFtZSkKKworICAgICAgICBpZiB0YXJpbmZvIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLl9kYmcoMSwgInRhcmZpbGU6IFVuc3VwcG9ydGVkIHR5cGUgJXIiICUgbmFtZSkKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgQXBwZW5kIHRoZSB0YXIgaGVhZGVyIGFuZCBkYXRhIHRvIHRoZSBhcmNoaXZlLgorICAgICAgICBpZiB0YXJpbmZvLmlzcmVnKCk6CisgICAgICAgICAgICBmID0gZmlsZShuYW1lLCAicmIiKQorICAgICAgICAgICAgc2VsZi5hZGRmaWxlKHRhcmluZm8sIGYpCisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICBpZiB0YXJpbmZvLnR5cGUgaW4gKExOS1RZUEUsIFNZTVRZUEUsIEZJRk9UWVBFLCBDSFJUWVBFLCBCTEtUWVBFKToKKyAgICAgICAgICAgIHRhcmluZm8uc2l6ZSA9IDBMCisgICAgICAgICAgICBzZWxmLmFkZGZpbGUodGFyaW5mbykKKworICAgICAgICBpZiB0YXJpbmZvLmlzZGlyKCk6CisgICAgICAgICAgICBzZWxmLmFkZGZpbGUodGFyaW5mbykKKyAgICAgICAgICAgIGlmIHJlY3Vyc2l2ZToKKyAgICAgICAgICAgICAgICBmb3IgZiBpbiBvcy5saXN0ZGlyKG5hbWUpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZChvcy5wYXRoLmpvaW4obmFtZSwgZiksIG9zLnBhdGguam9pbihhcmNuYW1lLCBmKSkKKworICAgIGRlZiBhZGRmaWxlKHNlbGYsIHRhcmluZm8sIGZpbGVvYmo9Tm9uZSk6CisgICAgICAgICIiIkFkZCB0aGUgVGFySW5mbyBvYmplY3QgYHRhcmluZm8nIHRvIHRoZSBhcmNoaXZlLiBJZiBgZmlsZW9iaicgaXMKKyAgICAgICAgICAgZ2l2ZW4sIHRhcmluZm8uc2l6ZSBieXRlcyBhcmUgcmVhZCBmcm9tIGl0IGFuZCBhZGRlZCB0byB0aGUgYXJjaGl2ZS4KKyAgICAgICAgICAgWW91IGNhbiBjcmVhdGUgVGFySW5mbyBvYmplY3RzIHVzaW5nIGdldHRhcmluZm8oKS4KKyAgICAgICAgICAgT24gV2luZG93cyBwbGF0Zm9ybXMsIGBmaWxlb2JqJyBzaG91bGQgYWx3YXlzIGJlIG9wZW5lZCB3aXRoIG1vZGUKKyAgICAgICAgICAgJ3JiJyB0byBhdm9pZCBpcnJpdGF0aW9uIGFib3V0IHRoZSBmaWxlIHNpemUuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9jaGVjaygiYXciKQorCisgICAgICAgIHRhcmluZm8ubmFtZSA9IG5vcm1wYXRoKHRhcmluZm8ubmFtZSkKKyAgICAgICAgaWYgdGFyaW5mby5pc2RpcigpOgorICAgICAgICAgICAgIyBkaXJlY3RvcmllcyBzaG91bGQgZW5kIHdpdGggJy8nCisgICAgICAgICAgICB0YXJpbmZvLm5hbWUgKz0gIi8iCisKKyAgICAgICAgaWYgdGFyaW5mby5saW5rbmFtZToKKyAgICAgICAgICAgIHRhcmluZm8ubGlua25hbWUgPSBub3JtcGF0aCh0YXJpbmZvLmxpbmtuYW1lKQorCisgICAgICAgIGlmIHRhcmluZm8uc2l6ZSA+IE1BWFNJWkVfTUVNQkVSOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgImZpbGUgaXMgdG9vIGxhcmdlICg+OEdCKSIKKworICAgICAgICBpZiBsZW4odGFyaW5mby5saW5rbmFtZSkgPiBMRU5HVEhfTElOSzoKKyAgICAgICAgICAgIGlmIHNlbGYucG9zaXg6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgImxpbmtuYW1lIGlzIHRvbyBsb25nICg+JWQpIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAoTEVOR1RIX0xJTkspCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuX2NyZWF0ZV9nbnVsb25nKHRhcmluZm8ubGlua25hbWUsIEdOVVRZUEVfTE9OR0xJTkspCisgICAgICAgICAgICAgICAgdGFyaW5mby5saW5rbmFtZSA9IHRhcmluZm8ubGlua25hbWVbOkxFTkdUSF9MSU5LIC0xXQorICAgICAgICAgICAgICAgIHNlbGYuX2RiZygyLCAidGFyZmlsZTogQ3JlYXRlZCBHTlUgdGFyIGV4dGVuc2lvbiBMT05HTElOSyIpCisKKyAgICAgICAgaWYgbGVuKHRhcmluZm8ubmFtZSkgPiBMRU5HVEhfTkFNRToKKyAgICAgICAgICAgIGlmIHNlbGYucG9zaXg6CisgICAgICAgICAgICAgICAgcHJlZml4ID0gdGFyaW5mby5uYW1lWzpMRU5HVEhfUFJFRklYICsgMV0KKyAgICAgICAgICAgICAgICB3aGlsZSBwcmVmaXggYW5kIHByZWZpeFstMV0gIT0gIi8iOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcHJlZml4WzotMV0KKworICAgICAgICAgICAgICAgIG5hbWUgPSB0YXJpbmZvLm5hbWVbbGVuKHByZWZpeCk6XQorICAgICAgICAgICAgICAgIHByZWZpeCA9IHByZWZpeFs6LTFdCisKKyAgICAgICAgICAgICAgICBpZiBub3QgcHJlZml4IG9yIGxlbihuYW1lKSA+IExFTkdUSF9OQU1FOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAibmFtZSBpcyB0b28gbG9uZyAoPiVkKSIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChMRU5HVEhfTkFNRSkKKworICAgICAgICAgICAgICAgIHRhcmluZm8ubmFtZSAgID0gbmFtZQorICAgICAgICAgICAgICAgIHRhcmluZm8ucHJlZml4ID0gcHJlZml4CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuX2NyZWF0ZV9nbnVsb25nKHRhcmluZm8ubmFtZSwgR05VVFlQRV9MT05HTkFNRSkKKyAgICAgICAgICAgICAgICB0YXJpbmZvLm5hbWUgPSB0YXJpbmZvLm5hbWVbOkxFTkdUSF9OQU1FIC0gMV0KKyAgICAgICAgICAgICAgICBzZWxmLl9kYmcoMiwgInRhcmZpbGU6IENyZWF0ZWQgR05VIHRhciBleHRlbnNpb24gTE9OR05BTUUiKQorCisgICAgICAgIHNlbGYuZmlsZW9iai53cml0ZSh0YXJpbmZvLnRvYnVmKCkpCisgICAgICAgIHNlbGYub2Zmc2V0ICs9IEJMT0NLU0laRQorCisgICAgICAgICMgSWYgdGhlcmUncyBkYXRhIHRvIGZvbGxvdywgYXBwZW5kIGl0LgorICAgICAgICBpZiBmaWxlb2JqIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgY29weWZpbGVvYmooZmlsZW9iaiwgc2VsZi5maWxlb2JqLCB0YXJpbmZvLnNpemUpCisgICAgICAgICAgICBibG9ja3MsIHJlbWFpbmRlciA9IGRpdm1vZCh0YXJpbmZvLnNpemUsIEJMT0NLU0laRSkKKyAgICAgICAgICAgIGlmIHJlbWFpbmRlciA+IDA6CisgICAgICAgICAgICAgICAgc2VsZi5maWxlb2JqLndyaXRlKE5VTCAqIChCTE9DS1NJWkUgLSByZW1haW5kZXIpKQorICAgICAgICAgICAgICAgIGJsb2NrcyArPSAxCisgICAgICAgICAgICBzZWxmLm9mZnNldCArPSBibG9ja3MgKiBCTE9DS1NJWkUKKworICAgICAgICBzZWxmLm1lbWJlcnMuYXBwZW5kKHRhcmluZm8pCisgICAgICAgIHNlbGYubWVtYmVybmFtZXMuYXBwZW5kKHRhcmluZm8ubmFtZSkKKyAgICAgICAgc2VsZi5jaHVua3MuYXBwZW5kKHNlbGYub2Zmc2V0KQorCisgICAgZGVmIGV4dHJhY3Qoc2VsZiwgbWVtYmVyLCBwYXRoPSIiKToKKyAgICAgICAgIiIiRXh0cmFjdCBhIG1lbWJlciBmcm9tIHRoZSBhcmNoaXZlIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LAorICAgICAgICAgICB1c2luZyBpdHMgZnVsbCBuYW1lLiBJdHMgZmlsZSBpbmZvcm1hdGlvbiBpcyBleHRyYWN0ZWQgYXMgYWNjdXJhdGVseQorICAgICAgICAgICBhcyBwb3NzaWJsZS4gYG1lbWJlcicgbWF5IGJlIGEgZmlsZW5hbWUgb3IgYSBUYXJJbmZvIG9iamVjdC4gWW91IGNhbgorICAgICAgICAgICBzcGVjaWZ5IGEgZGlmZmVyZW50IGRpcmVjdG9yeSB1c2luZyBgcGF0aCcuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9jaGVjaygiciIpCisKKyAgICAgICAgaWYgaXNpbnN0YW5jZShtZW1iZXIsIFRhckluZm8pOgorICAgICAgICAgICAgdGFyaW5mbyA9IG1lbWJlcgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdGFyaW5mbyA9IHNlbGYuZ2V0bWVtYmVyKG1lbWJlcikKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9leHRyYWN0X21lbWJlcih0YXJpbmZvLCBvcy5wYXRoLmpvaW4ocGF0aCwgdGFyaW5mby5uYW1lKSkKKyAgICAgICAgZXhjZXB0IEVudmlyb25tZW50RXJyb3IsIGU6CisgICAgICAgICAgICBpZiBzZWxmLmVycm9ybGV2ZWwgPiAwOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIGUuZmlsZW5hbWUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fZGJnKDEsICJ0YXJmaWxlOiAlcyIgJSBlLnN0cmVycm9yKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2RiZygxLCAidGFyZmlsZTogJXMgJXIiICUgKGUuc3RyZXJyb3IsIGUuZmlsZW5hbWUpKQorICAgICAgICBleGNlcHQgRXh0cmFjdEVycm9yLCBlOgorICAgICAgICAgICAgaWYgc2VsZi5lcnJvcmxldmVsID4gMToKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLl9kYmcoMSwgInRhcmZpbGU6ICVzIiAlIGUpCisKKyAgICBkZWYgZXh0cmFjdGZpbGUoc2VsZiwgbWVtYmVyKToKKyAgICAgICAgIiIiRXh0cmFjdCBhIG1lbWJlciBmcm9tIHRoZSBhcmNoaXZlIGFzIGEgZmlsZSBvYmplY3QuIGBtZW1iZXInIG1heSBiZQorICAgICAgICAgICBhIGZpbGVuYW1lIG9yIGEgVGFySW5mbyBvYmplY3QuIElmIGBtZW1iZXInIGlzIGEgcmVndWxhciBmaWxlLCBhCisgICAgICAgICAgIGZpbGUtbGlrZSBvYmplY3QgaXMgcmV0dXJuZWQuIElmIGBtZW1iZXInIGlzIGEgbGluaywgYSBmaWxlLWxpa2UKKyAgICAgICAgICAgb2JqZWN0IGlzIGNvbnN0cnVjdGVkIGZyb20gdGhlIGxpbmsncyB0YXJnZXQuIElmIGBtZW1iZXInIGlzIG5vbmUgb2YKKyAgICAgICAgICAgdGhlIGFib3ZlLCBOb25lIGlzIHJldHVybmVkLgorICAgICAgICAgICBUaGUgZmlsZS1saWtlIG9iamVjdCBpcyByZWFkLW9ubHkgYW5kIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcKKyAgICAgICAgICAgbWV0aG9kczogcmVhZCgpLCByZWFkbGluZSgpLCByZWFkbGluZXMoKSwgc2VlaygpIGFuZCB0ZWxsKCkKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX2NoZWNrKCJyIikKKworICAgICAgICBpZiBpc2luc3RhbmNlKG1lbWJlciwgVGFySW5mbyk6CisgICAgICAgICAgICB0YXJpbmZvID0gbWVtYmVyCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0YXJpbmZvID0gc2VsZi5nZXRtZW1iZXIobWVtYmVyKQorCisgICAgICAgIGlmIHRhcmluZm8uaXNyZWcoKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmZpbGVvYmplY3Qoc2VsZiwgdGFyaW5mbykKKworICAgICAgICBlbGlmIHRhcmluZm8udHlwZSBub3QgaW4gU1VQUE9SVEVEX1RZUEVTOgorICAgICAgICAgICAgIyBJZiBhIG1lbWJlcidzIHR5cGUgaXMgdW5rbm93biwgaXQgaXMgdHJlYXRlZCBhcyBhCisgICAgICAgICAgICAjIHJlZ3VsYXIgZmlsZS4KKyAgICAgICAgICAgIHJldHVybiBzZWxmLmZpbGVvYmplY3Qoc2VsZiwgdGFyaW5mbykKKworICAgICAgICBlbGlmIHRhcmluZm8uaXNsbmsoKSBvciB0YXJpbmZvLmlzc3ltKCk6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYuZmlsZW9iaiwgX1N0cmVhbSk6CisgICAgICAgICAgICAgICAgIyBBIHNtYWxsIGJ1dCB1Z2x5IHdvcmthcm91bmQgZm9yIHRoZSBjYXNlIHRoYXQgc29tZW9uZSB0cmllcworICAgICAgICAgICAgICAgICMgdG8gZXh0cmFjdCBhIChzeW0pbGluayBhcyBhIGZpbGUtb2JqZWN0IGZyb20gYSBub24tc2Vla2FibGUKKyAgICAgICAgICAgICAgICAjIHN0cmVhbSBvZiB0YXIgYmxvY2tzLgorICAgICAgICAgICAgICAgIHJhaXNlIFN0cmVhbUVycm9yLCAiY2Fubm90IGV4dHJhY3QgKHN5bSlsaW5rIGFzIGZpbGUgb2JqZWN0IgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIEEgKHN5bSlsaW5rJ3MgZmlsZSBvYmplY3QgaXMgaXQncyB0YXJnZXQncyBmaWxlIG9iamVjdC4KKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5leHRyYWN0ZmlsZShzZWxmLl9nZXRtZW1iZXIodGFyaW5mby5saW5rbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyaW5mbykpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIElmIHRoZXJlJ3Mgbm8gZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIG1lbWJlciAoZGlyZWN0b3J5LCBjaHJkZXYsCisgICAgICAgICAgICAjIGJsa2RldiwgZXRjLiksIHJldHVybiBOb25lIGluc3RlYWQgb2YgYSBmaWxlIG9iamVjdC4KKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgX2V4dHJhY3RfbWVtYmVyKHNlbGYsIHRhcmluZm8sIHRhcmdldHBhdGgpOgorICAgICAgICAiIiJFeHRyYWN0IHRoZSBUYXJJbmZvIG9iamVjdCB0YXJpbmZvIHRvIGEgcGh5c2ljYWwKKyAgICAgICAgICAgZmlsZSBjYWxsZWQgdGFyZ2V0cGF0aC4KKyAgICAgICAgIiIiCisgICAgICAgICMgRmV0Y2ggdGhlIFRhckluZm8gb2JqZWN0IGZvciB0aGUgZ2l2ZW4gbmFtZQorICAgICAgICAjIGFuZCBidWlsZCB0aGUgZGVzdGluYXRpb24gcGF0aG5hbWUsIHJlcGxhY2luZworICAgICAgICAjIGZvcndhcmQgc2xhc2hlcyB0byBwbGF0Zm9ybSBzcGVjaWZpYyBzZXBhcmF0b3JzLgorICAgICAgICBpZiB0YXJnZXRwYXRoWy0xOl0gPT0gIi8iOgorICAgICAgICAgICAgdGFyZ2V0cGF0aCA9IHRhcmdldHBhdGhbOi0xXQorICAgICAgICB0YXJnZXRwYXRoID0gb3MucGF0aC5ub3JtcGF0aCh0YXJnZXRwYXRoKQorCisgICAgICAgICMgQ3JlYXRlIGFsbCB1cHBlciBkaXJlY3Rvcmllcy4KKyAgICAgICAgdXBwZXJkaXJzID0gb3MucGF0aC5kaXJuYW1lKHRhcmdldHBhdGgpCisgICAgICAgIGlmIHVwcGVyZGlycyBhbmQgbm90IG9zLnBhdGguZXhpc3RzKHVwcGVyZGlycyk6CisgICAgICAgICAgICB0aSA9IFRhckluZm8oKQorICAgICAgICAgICAgdGkubmFtZSAgPSB1cHBlcmRpcnMKKyAgICAgICAgICAgIHRpLnR5cGUgID0gRElSVFlQRQorICAgICAgICAgICAgdGkubW9kZSAgPSAwNzc3CisgICAgICAgICAgICB0aS5tdGltZSA9IHRhcmluZm8ubXRpbWUKKyAgICAgICAgICAgIHRpLnVpZCAgID0gdGFyaW5mby51aWQKKyAgICAgICAgICAgIHRpLmdpZCAgID0gdGFyaW5mby5naWQKKyAgICAgICAgICAgIHRpLnVuYW1lID0gdGFyaW5mby51bmFtZQorICAgICAgICAgICAgdGkuZ25hbWUgPSB0YXJpbmZvLmduYW1lCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5fZXh0cmFjdF9tZW1iZXIodGksIHRpLm5hbWUpCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIGlmIHRhcmluZm8uaXNsbmsoKSBvciB0YXJpbmZvLmlzc3ltKCk6CisgICAgICAgICAgICBzZWxmLl9kYmcoMSwgIiVzIC0+ICVzIiAlICh0YXJpbmZvLm5hbWUsIHRhcmluZm8ubGlua25hbWUpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fZGJnKDEsIHRhcmluZm8ubmFtZSkKKworICAgICAgICBpZiB0YXJpbmZvLmlzcmVnKCk6CisgICAgICAgICAgICBzZWxmLm1ha2VmaWxlKHRhcmluZm8sIHRhcmdldHBhdGgpCisgICAgICAgIGVsaWYgdGFyaW5mby5pc2RpcigpOgorICAgICAgICAgICAgc2VsZi5tYWtlZGlyKHRhcmluZm8sIHRhcmdldHBhdGgpCisgICAgICAgIGVsaWYgdGFyaW5mby5pc2ZpZm8oKToKKyAgICAgICAgICAgIHNlbGYubWFrZWZpZm8odGFyaW5mbywgdGFyZ2V0cGF0aCkKKyAgICAgICAgZWxpZiB0YXJpbmZvLmlzY2hyKCkgb3IgdGFyaW5mby5pc2JsaygpOgorICAgICAgICAgICAgc2VsZi5tYWtlZGV2KHRhcmluZm8sIHRhcmdldHBhdGgpCisgICAgICAgIGVsaWYgdGFyaW5mby5pc2xuaygpIG9yIHRhcmluZm8uaXNzeW0oKToKKyAgICAgICAgICAgIHNlbGYubWFrZWxpbmsodGFyaW5mbywgdGFyZ2V0cGF0aCkKKyAgICAgICAgZWxpZiB0YXJpbmZvLnR5cGUgbm90IGluIFNVUFBPUlRFRF9UWVBFUzoKKyAgICAgICAgICAgIHNlbGYubWFrZXVua25vd24odGFyaW5mbywgdGFyZ2V0cGF0aCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYubWFrZWZpbGUodGFyaW5mbywgdGFyZ2V0cGF0aCkKKworICAgICAgICBzZWxmLmNob3duKHRhcmluZm8sIHRhcmdldHBhdGgpCisgICAgICAgIGlmIG5vdCB0YXJpbmZvLmlzc3ltKCk6CisgICAgICAgICAgICBzZWxmLmNobW9kKHRhcmluZm8sIHRhcmdldHBhdGgpCisgICAgICAgICAgICBzZWxmLnV0aW1lKHRhcmluZm8sIHRhcmdldHBhdGgpCisKKyAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIEJlbG93IGFyZSB0aGUgZGlmZmVyZW50IGZpbGUgbWV0aG9kcy4gVGhleSBhcmUgY2FsbGVkIHZpYQorICAgICMgX2V4dHJhY3RfbWVtYmVyKCkgd2hlbiBleHRyYWN0KCkgaXMgY2FsbGVkLiBUaGV5IGNhbiBiZSByZXBsYWNlZCBpbiBhCisgICAgIyBzdWJjbGFzcyB0byBpbXBsZW1lbnQgb3RoZXIgZnVuY3Rpb25hbGl0eS4KKworICAgIGRlZiBtYWtlZGlyKHNlbGYsIHRhcmluZm8sIHRhcmdldHBhdGgpOgorICAgICAgICAiIiJNYWtlIGEgZGlyZWN0b3J5IGNhbGxlZCB0YXJnZXRwYXRoLgorICAgICAgICAiIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3MubWtkaXIodGFyZ2V0cGF0aCkKKyAgICAgICAgZXhjZXB0IEVudmlyb25tZW50RXJyb3IsIGU6CisgICAgICAgICAgICBpZiBlLmVycm5vICE9IGVycm5vLkVFWElTVDoKKyAgICAgICAgICAgICAgICByYWlzZQorCisgICAgZGVmIG1ha2VmaWxlKHNlbGYsIHRhcmluZm8sIHRhcmdldHBhdGgpOgorICAgICAgICAiIiJNYWtlIGEgZmlsZSBjYWxsZWQgdGFyZ2V0cGF0aC4KKyAgICAgICAgIiIiCisgICAgICAgIHNvdXJjZSA9IHNlbGYuZXh0cmFjdGZpbGUodGFyaW5mbykKKyAgICAgICAgdGFyZ2V0ID0gZmlsZSh0YXJnZXRwYXRoLCAid2IiKQorICAgICAgICBjb3B5ZmlsZW9iaihzb3VyY2UsIHRhcmdldCkKKyAgICAgICAgc291cmNlLmNsb3NlKCkKKyAgICAgICAgdGFyZ2V0LmNsb3NlKCkKKworICAgIGRlZiBtYWtldW5rbm93bihzZWxmLCB0YXJpbmZvLCB0YXJnZXRwYXRoKToKKyAgICAgICAgIiIiTWFrZSBhIGZpbGUgZnJvbSBhIFRhckluZm8gb2JqZWN0IHdpdGggYW4gdW5rbm93biB0eXBlCisgICAgICAgICAgIGF0IHRhcmdldHBhdGguCisgICAgICAgICIiIgorICAgICAgICBzZWxmLm1ha2VmaWxlKHRhcmluZm8sIHRhcmdldHBhdGgpCisgICAgICAgIHNlbGYuX2RiZygxLCAidGFyZmlsZTogVW5rbm93biBmaWxlIHR5cGUgJXIsICIgXAorICAgICAgICAgICAgICAgICAgICAgImV4dHJhY3RlZCBhcyByZWd1bGFyIGZpbGUuIiAlIHRhcmluZm8udHlwZSkKKworICAgIGRlZiBtYWtlZmlmbyhzZWxmLCB0YXJpbmZvLCB0YXJnZXRwYXRoKToKKyAgICAgICAgIiIiTWFrZSBhIGZpZm8gY2FsbGVkIHRhcmdldHBhdGguCisgICAgICAgICIiIgorICAgICAgICBpZiBoYXNhdHRyKG9zLCAibWtmaWZvIik6CisgICAgICAgICAgICBvcy5ta2ZpZm8odGFyZ2V0cGF0aCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIEV4dHJhY3RFcnJvciwgImZpZm8gbm90IHN1cHBvcnRlZCBieSBzeXN0ZW0iCisKKyAgICBkZWYgbWFrZWRldihzZWxmLCB0YXJpbmZvLCB0YXJnZXRwYXRoKToKKyAgICAgICAgIiIiTWFrZSBhIGNoYXJhY3RlciBvciBibG9jayBkZXZpY2UgY2FsbGVkIHRhcmdldHBhdGguCisgICAgICAgICIiIgorICAgICAgICBpZiBub3QgaGFzYXR0cihvcywgIm1rbm9kIikgb3Igbm90IGhhc2F0dHIob3MsICJtYWtlZGV2Iik6CisgICAgICAgICAgICByYWlzZSBFeHRyYWN0RXJyb3IsICJzcGVjaWFsIGRldmljZXMgbm90IHN1cHBvcnRlZCBieSBzeXN0ZW0iCisKKyAgICAgICAgbW9kZSA9IHRhcmluZm8ubW9kZQorICAgICAgICBpZiB0YXJpbmZvLmlzYmxrKCk6CisgICAgICAgICAgICBtb2RlIHw9IHN0YXQuU19JRkJMSworICAgICAgICBlbHNlOgorICAgICAgICAgICAgbW9kZSB8PSBzdGF0LlNfSUZDSFIKKworICAgICAgICBvcy5ta25vZCh0YXJnZXRwYXRoLCBtb2RlLAorICAgICAgICAgICAgICAgICBvcy5tYWtlZGV2KHRhcmluZm8uZGV2bWFqb3IsIHRhcmluZm8uZGV2bWlub3IpKQorCisgICAgZGVmIG1ha2VsaW5rKHNlbGYsIHRhcmluZm8sIHRhcmdldHBhdGgpOgorICAgICAgICAiIiJNYWtlIGEgKHN5bWJvbGljKSBsaW5rIGNhbGxlZCB0YXJnZXRwYXRoLiBJZiBpdCBjYW5ub3QgYmUgY3JlYXRlZAorICAgICAgICAgIChwbGF0Zm9ybSBsaW1pdGF0aW9uKSwgd2UgdHJ5IHRvIG1ha2UgYSBjb3B5IG9mIHRoZSByZWZlcmVuY2VkIGZpbGUKKyAgICAgICAgICBpbnN0ZWFkIG9mIGEgbGluay4KKyAgICAgICAgIiIiCisgICAgICAgIGxpbmtwYXRoID0gdGFyaW5mby5saW5rbmFtZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiB0YXJpbmZvLmlzc3ltKCk6CisgICAgICAgICAgICAgICAgb3Muc3ltbGluayhsaW5rcGF0aCwgdGFyZ2V0cGF0aCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgb3MubGluayhsaW5rcGF0aCwgdGFyZ2V0cGF0aCkKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgaWYgdGFyaW5mby5pc3N5bSgpOgorICAgICAgICAgICAgICAgIGxpbmtwYXRoID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZSh0YXJpbmZvLm5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtwYXRoKQorICAgICAgICAgICAgICAgIGxpbmtwYXRoID0gbm9ybXBhdGgobGlua3BhdGgpCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLl9leHRyYWN0X21lbWJlcihzZWxmLmdldG1lbWJlcihsaW5rcGF0aCksIHRhcmdldHBhdGgpCisgICAgICAgICAgICBleGNlcHQgKEVudmlyb25tZW50RXJyb3IsIEtleUVycm9yKSwgZToKKyAgICAgICAgICAgICAgICBsaW5rcGF0aCA9IG9zLnBhdGgubm9ybXBhdGgobGlua3BhdGgpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBzaHV0aWwuY29weTIobGlua3BhdGgsIHRhcmdldHBhdGgpCisgICAgICAgICAgICAgICAgZXhjZXB0IEVudmlyb25tZW50RXJyb3IsIGU6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIElPRXJyb3IsICJsaW5rIGNvdWxkIG5vdCBiZSBjcmVhdGVkIgorCisgICAgZGVmIGNob3duKHNlbGYsIHRhcmluZm8sIHRhcmdldHBhdGgpOgorICAgICAgICAiIiJTZXQgb3duZXIgb2YgdGFyZ2V0cGF0aCBhY2NvcmRpbmcgdG8gdGFyaW5mby4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHB3ZCBhbmQgaGFzYXR0cihvcywgImdldGV1aWQiKSBhbmQgb3MuZ2V0ZXVpZCgpID09IDA6CisgICAgICAgICAgICAjIFdlIGhhdmUgdG8gYmUgcm9vdCB0byBkbyBzby4KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBnID0gZ3JwLmdldGdybmFtKHRhcmluZm8uZ25hbWUpWzJdCisgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBnID0gZ3JwLmdldGdyZ2lkKHRhcmluZm8uZ2lkKVsyXQorICAgICAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgZyA9IG9zLmdldGdpZCgpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdSA9IHB3ZC5nZXRwd25hbSh0YXJpbmZvLnVuYW1lKVsyXQorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgdSA9IHB3ZC5nZXRwd3VpZCh0YXJpbmZvLnVpZClbMl0KKyAgICAgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHUgPSBvcy5nZXR1aWQoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGlmIHRhcmluZm8uaXNzeW0oKSBhbmQgaGFzYXR0cihvcywgImxjaG93biIpOgorICAgICAgICAgICAgICAgICAgICBvcy5sY2hvd24odGFyZ2V0cGF0aCwgdSwgZykKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBvcy5jaG93bih0YXJnZXRwYXRoLCB1LCBnKQorICAgICAgICAgICAgZXhjZXB0IEVudmlyb25tZW50RXJyb3IsIGU6CisgICAgICAgICAgICAgICAgcmFpc2UgRXh0cmFjdEVycm9yLCAiY291bGQgbm90IGNoYW5nZSBvd25lciIKKworICAgIGRlZiBjaG1vZChzZWxmLCB0YXJpbmZvLCB0YXJnZXRwYXRoKToKKyAgICAgICAgIiIiU2V0IGZpbGUgcGVybWlzc2lvbnMgb2YgdGFyZ2V0cGF0aCBhY2NvcmRpbmcgdG8gdGFyaW5mby4KKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLmNobW9kKHRhcmdldHBhdGgsIHRhcmluZm8ubW9kZSkKKyAgICAgICAgZXhjZXB0IEVudmlyb25tZW50RXJyb3IsIGU6CisgICAgICAgICAgICByYWlzZSBFeHRyYWN0RXJyb3IsICJjb3VsZCBub3QgY2hhbmdlIG1vZGUiCisKKyAgICBkZWYgdXRpbWUoc2VsZiwgdGFyaW5mbywgdGFyZ2V0cGF0aCk6CisgICAgICAgICIiIlNldCBtb2RpZmljYXRpb24gdGltZSBvZiB0YXJnZXRwYXRoIGFjY29yZGluZyB0byB0YXJpbmZvLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICJ3aW4zMiIgYW5kIHRhcmluZm8uaXNkaXIoKToKKyAgICAgICAgICAgICMgQWNjb3JkaW5nIHRvIG1zZG4ubWljcm9zb2Z0LmNvbSwgaXQgaXMgYW4gZXJyb3IgKEVBQ0NFUykKKyAgICAgICAgICAgICMgdG8gdXNlIHV0aW1lKCkgb24gZGlyZWN0b3JpZXMuCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3MudXRpbWUodGFyZ2V0cGF0aCwgKHRhcmluZm8ubXRpbWUsIHRhcmluZm8ubXRpbWUpKQorICAgICAgICBleGNlcHQgRW52aXJvbm1lbnRFcnJvciwgZToKKyAgICAgICAgICAgIHJhaXNlIEV4dHJhY3RFcnJvciwgImNvdWxkIG5vdCBjaGFuZ2UgbW9kaWZpY2F0aW9uIHRpbWUiCisKKyAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIG5leHQgbWVtYmVyIG9mIHRoZSBhcmNoaXZlIGFzIGEgVGFySW5mbyBvYmplY3QsIHdoZW4KKyAgICAgICAgICAgVGFyRmlsZSBpcyBvcGVuZWQgZm9yIHJlYWRpbmcuIFJldHVybiBOb25lIGlmIHRoZXJlIGlzIG5vIG1vcmUKKyAgICAgICAgICAgYXZhaWxhYmxlLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fY2hlY2soInJhIikKKyAgICAgICAgaWYgc2VsZi5maXJzdG1lbWJlciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIG0gPSBzZWxmLmZpcnN0bWVtYmVyCisgICAgICAgICAgICBzZWxmLmZpcnN0bWVtYmVyID0gTm9uZQorICAgICAgICAgICAgcmV0dXJuIG0KKworICAgICAgICAjIFJlYWQgdGhlIG5leHQgYmxvY2suCisgICAgICAgIHNlbGYuZmlsZW9iai5zZWVrKHNlbGYuY2h1bmtzWy0xXSkKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGJ1ZiA9IHNlbGYuZmlsZW9iai5yZWFkKEJMT0NLU0laRSkKKyAgICAgICAgICAgIGlmIG5vdCBidWY6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0YXJpbmZvID0gVGFySW5mby5mcm9tYnVmKGJ1ZikKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuaWdub3JlX3plcm9zOgorICAgICAgICAgICAgICAgICAgICBpZiBidWYuY291bnQoTlVMKSA9PSBCTE9DS1NJWkU6CisgICAgICAgICAgICAgICAgICAgICAgICBhZGogPSAiZW1wdHkiCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBhZGogPSAiaW52YWxpZCIKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fZGJnKDIsICIweCVYOiAlcyBibG9jayIgJSAoc2VsZi5vZmZzZXQsIGFkaikpCisgICAgICAgICAgICAgICAgICAgIHNlbGYub2Zmc2V0ICs9IEJMT0NLU0laRQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICMgQmxvY2sgaXMgZW1wdHkgb3IgdW5yZWFkYWJsZS4KKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5jaHVua3NbLTFdID09IDA6CisgICAgICAgICAgICAgICAgICAgICAgICAjIElmIHRoZSBmaXJzdCBibG9jayBpcyBpbnZhbGlkLiBUaGF0IGRvZXMgbm90CisgICAgICAgICAgICAgICAgICAgICAgICAjIGxvb2sgbGlrZSBhIHRhciBhcmNoaXZlIHdlIGNhbiBoYW5kbGUuCisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBSZWFkRXJyb3IsImVtcHR5LCB1bnJlYWRhYmxlIG9yIGNvbXByZXNzZWQgZmlsZSIKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgIyBXZSBzaG91bGRuJ3QgcmVseSBvbiB0aGlzIGNoZWNrc3VtLCBiZWNhdXNlIHNvbWUgdGFyIHByb2dyYW1zCisgICAgICAgICMgY2FsY3VsYXRlIGl0IGRpZmZlcmVudGx5IGFuZCBpdCBpcyBtZXJlbHkgdmFsaWRhdGluZyB0aGUKKyAgICAgICAgIyBoZWFkZXIgYmxvY2suIFdlIGNvdWxkIGp1c3QgYXMgd2VsbCBza2lwIHRoaXMgcGFydCwgd2hpY2ggd291bGQKKyAgICAgICAgIyBoYXZlIGEgc2xpZ2h0IGVmZmVjdCBvbiBwZXJmb3JtYW5jZS4uLgorICAgICAgICBpZiB0YXJpbmZvLmNoa3N1bSAhPSBjYWxjX2Noa3N1bShidWYpOgorICAgICAgICAgICAgc2VsZi5fZGJnKDEsICJ0YXJmaWxlOiBCYWQgQ2hlY2tzdW0gJXIiICUgdGFyaW5mby5uYW1lKQorCisgICAgICAgICMgU2V0IHRoZSBUYXJJbmZvIG9iamVjdCdzIG9mZnNldCB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUKKyAgICAgICAgIyBUYXJGaWxlIGFuZCBzZXQgc2VsZi5vZmZzZXQgdG8gdGhlIHBvc2l0aW9uIHdoZXJlIHRoZSBkYXRhIGJsb2NrcworICAgICAgICAjIHNob3VsZCBiZWdpbi4KKyAgICAgICAgdGFyaW5mby5vZmZzZXQgPSBzZWxmLm9mZnNldAorICAgICAgICBzZWxmLm9mZnNldCArPSBCTE9DS1NJWkUKKworICAgICAgICAjIENoZWNrIGlmIHRoZSBUYXJJbmZvIG9iamVjdCBoYXMgYSB0eXBlZmxhZyBmb3Igd2hpY2ggYSBjYWxsYmFjaworICAgICAgICAjIG1ldGhvZCBpcyByZWdpc3RlcmVkIGluIHRoZSBUWVBFX01FVEguIElmIHNvLCB0aGVuIGNhbGwgaXQuCisgICAgICAgIGlmIHRhcmluZm8udHlwZSBpbiBzZWxmLlRZUEVfTUVUSDoKKyAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLlRZUEVfTUVUSFt0YXJpbmZvLnR5cGVdKHNlbGYsIHRhcmluZm8pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0YXJpbmZvLm9mZnNldF9kYXRhID0gc2VsZi5vZmZzZXQKKyAgICAgICAgICAgIGlmIHRhcmluZm8uaXNyZWcoKSBvciB0YXJpbmZvLnR5cGUgbm90IGluIFNVUFBPUlRFRF9UWVBFUzoKKyAgICAgICAgICAgICAgICAjIFNraXAgdGhlIGZvbGxvd2luZyBkYXRhIGJsb2Nrcy4KKyAgICAgICAgICAgICAgICBzZWxmLm9mZnNldCArPSBzZWxmLl9ibG9jayh0YXJpbmZvLnNpemUpCisKKyAgICAgICAgaWYgdGFyaW5mby5pc3JlZygpIGFuZCB0YXJpbmZvLm5hbWVbOi0xXSA9PSAiLyI6CisgICAgICAgICAgICAjIHNvbWUgb2xkIHRhciBwcm9ncmFtcyBkb24ndCBrbm93IERJUlRZUEUKKyAgICAgICAgICAgIHRhcmluZm8udHlwZSA9IERJUlRZUEUKKworICAgICAgICBzZWxmLm1lbWJlcnMuYXBwZW5kKHRhcmluZm8pCisgICAgICAgIHNlbGYubWVtYmVybmFtZXMuYXBwZW5kKHRhcmluZm8ubmFtZSkKKyAgICAgICAgc2VsZi5jaHVua3MuYXBwZW5kKHNlbGYub2Zmc2V0KQorICAgICAgICByZXR1cm4gdGFyaW5mbworCisgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBCZWxvdyBhcmUgc29tZSBtZXRob2RzIHdoaWNoIGFyZSBjYWxsZWQgZm9yIHNwZWNpYWwgdHlwZWZsYWdzIGluIHRoZQorICAgICMgbmV4dCgpIG1ldGhvZCwgZS5nLiBmb3IgdW53cmFwcGluZyBHTlUgbG9uZ25hbWUvbG9uZ2xpbmsgYmxvY2tzLiBUaGV5CisgICAgIyBhcmUgcmVnaXN0ZXJlZCBpbiBUWVBFX01FVEggYmVsb3cuIFlvdSBjYW4gcmVnaXN0ZXIgeW91ciBvd24gbWV0aG9kcworICAgICMgd2l0aCB0aGlzIG1hcHBpbmcuCisgICAgIyBBIHJlZ2lzdGVyZWQgbWV0aG9kIGlzIGNhbGxlZCB3aXRoIGEgVGFySW5mbyBvYmplY3QgYXMgb25seSBhcmd1bWVudC4KKyAgICAjCisgICAgIyBEdXJpbmcgaXRzIGV4ZWN1dGlvbiB0aGUgbWV0aG9kIE1VU1QgcGVyZm9ybSB0aGUgZm9sbG93aW5nIHRhc2tzOgorICAgICMgMS4gc2V0IHRhcmluZm8ub2Zmc2V0X2RhdGEgdG8gdGhlIHBvc2l0aW9uIHdoZXJlIHRoZSBkYXRhIGJsb2NrcyBiZWdpbiwKKyAgICAjICAgIGlmIHRoZXJlIGlzIGRhdGEgdG8gZm9sbG93LgorICAgICMgMi4gc2V0IHNlbGYub2Zmc2V0IHRvIHRoZSBwb3NpdGlvbiB3aGVyZSB0aGUgbmV4dCBtZW1iZXIncyBoZWFkZXIgd2lsbAorICAgICMgICAgYmVnaW4uCisgICAgIyAzLiByZXR1cm4gYSB2YWxpZCBUYXJJbmZvIG9iamVjdC4KKworICAgIGRlZiBwcm9jX2dudWxvbmcoc2VsZiwgdGFyaW5mbyk6CisgICAgICAgICIiIkV2YWx1YXRlIHRoZSBibG9ja3MgdGhhdCBob2xkIGEgR05VIGxvbmduYW1lCisgICAgICAgICAgIG9yIGxvbmdsaW5rIG1lbWJlci4KKyAgICAgICAgIiIiCisgICAgICAgIGJ1ZiA9ICIiCisgICAgICAgIG5hbWUgPSBOb25lCisgICAgICAgIGxpbmtuYW1lID0gTm9uZQorICAgICAgICBjb3VudCA9IHRhcmluZm8uc2l6ZQorICAgICAgICB3aGlsZSBjb3VudCA+IDA6CisgICAgICAgICAgICBibG9jayA9IHNlbGYuZmlsZW9iai5yZWFkKEJMT0NLU0laRSkKKyAgICAgICAgICAgIGJ1ZiArPSBibG9jaworICAgICAgICAgICAgc2VsZi5vZmZzZXQgKz0gQkxPQ0tTSVpFCisgICAgICAgICAgICBjb3VudCAtPSBCTE9DS1NJWkUKKworICAgICAgICBpZiB0YXJpbmZvLnR5cGUgPT0gR05VVFlQRV9MT05HTkFNRToKKyAgICAgICAgICAgIG5hbWUgPSBudHMoYnVmKQorICAgICAgICBpZiB0YXJpbmZvLnR5cGUgPT0gR05VVFlQRV9MT05HTElOSzoKKyAgICAgICAgICAgIGxpbmtuYW1lID0gbnRzKGJ1ZikKKworICAgICAgICBidWYgPSBzZWxmLmZpbGVvYmoucmVhZChCTE9DS1NJWkUpCisKKyAgICAgICAgdGFyaW5mbyA9IFRhckluZm8uZnJvbWJ1ZihidWYpCisgICAgICAgIHRhcmluZm8ub2Zmc2V0ID0gc2VsZi5vZmZzZXQKKyAgICAgICAgc2VsZi5vZmZzZXQgKz0gQkxPQ0tTSVpFCisgICAgICAgIHRhcmluZm8ub2Zmc2V0X2RhdGEgPSBzZWxmLm9mZnNldAorICAgICAgICB0YXJpbmZvLm5hbWUgPSBuYW1lIG9yIHRhcmluZm8ubmFtZQorICAgICAgICB0YXJpbmZvLmxpbmtuYW1lID0gbGlua25hbWUgb3IgdGFyaW5mby5saW5rbmFtZQorCisgICAgICAgIGlmIHRhcmluZm8uaXNyZWcoKSBvciB0YXJpbmZvLnR5cGUgbm90IGluIFNVUFBPUlRFRF9UWVBFUzoKKyAgICAgICAgICAgICMgU2tpcCB0aGUgZm9sbG93aW5nIGRhdGEgYmxvY2tzLgorICAgICAgICAgICAgc2VsZi5vZmZzZXQgKz0gc2VsZi5fYmxvY2sodGFyaW5mby5zaXplKQorICAgICAgICByZXR1cm4gdGFyaW5mbworCisgICAgZGVmIHByb2Nfc3BhcnNlKHNlbGYsIHRhcmluZm8pOgorICAgICAgICAiIiJBbmFseXplIGEgR05VIHNwYXJzZSBoZWFkZXIgcGx1cyBleHRyYSBoZWFkZXJzLgorICAgICAgICAiIiIKKyAgICAgICAgYnVmID0gdGFyaW5mby50b2J1ZigpCisgICAgICAgIHNwID0gX3JpbmdidWZmZXIoKQorICAgICAgICBwb3MgPSAzODYKKyAgICAgICAgbGFzdHBvcyA9IDBMCisgICAgICAgIHJlYWxwb3MgPSAwTAorICAgICAgICAjIFRoZXJlIGFyZSA0IHBvc3NpYmxlIHNwYXJzZSBzdHJ1Y3RzIGluIHRoZQorICAgICAgICAjIGZpcnN0IGhlYWRlci4KKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKDQpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG9mZnNldCA9IGludChidWZbcG9zOnBvcyArIDEyXSwgOCkKKyAgICAgICAgICAgICAgICBudW1ieXRlcyA9IGludChidWZbcG9zICsgMTI6cG9zICsgMjRdLCA4KQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIG9mZnNldCA+IGxhc3Rwb3M6CisgICAgICAgICAgICAgICAgc3AuYXBwZW5kKF9ob2xlKGxhc3Rwb3MsIG9mZnNldCAtIGxhc3Rwb3MpKQorICAgICAgICAgICAgc3AuYXBwZW5kKF9kYXRhKG9mZnNldCwgbnVtYnl0ZXMsIHJlYWxwb3MpKQorICAgICAgICAgICAgcmVhbHBvcyArPSBudW1ieXRlcworICAgICAgICAgICAgbGFzdHBvcyA9IG9mZnNldCArIG51bWJ5dGVzCisgICAgICAgICAgICBwb3MgKz0gMjQKKworICAgICAgICBpc2V4dGVuZGVkID0gb3JkKGJ1Zls0ODJdKQorICAgICAgICBvcmlnc2l6ZSA9IGludChidWZbNDgzOjQ5NV0sIDgpCisKKyAgICAgICAgIyBJZiB0aGUgaXNleHRlbmRlZCBmbGFnIGlzIGdpdmVuLAorICAgICAgICAjIHRoZXJlIGFyZSBleHRyYSBoZWFkZXJzIHRvIHByb2Nlc3MuCisgICAgICAgIHdoaWxlIGlzZXh0ZW5kZWQgPT0gMToKKyAgICAgICAgICAgIGJ1ZiA9IHNlbGYuZmlsZW9iai5yZWFkKEJMT0NLU0laRSkKKyAgICAgICAgICAgIHNlbGYub2Zmc2V0ICs9IEJMT0NLU0laRQorICAgICAgICAgICAgcG9zID0gMAorICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKDIxKToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IGludChidWZbcG9zOnBvcyArIDEyXSwgOCkKKyAgICAgICAgICAgICAgICAgICAgbnVtYnl0ZXMgPSBpbnQoYnVmW3BvcyArIDEyOnBvcyArIDI0XSwgOCkKKyAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBpZiBvZmZzZXQgPiBsYXN0cG9zOgorICAgICAgICAgICAgICAgICAgICBzcC5hcHBlbmQoX2hvbGUobGFzdHBvcywgb2Zmc2V0IC0gbGFzdHBvcykpCisgICAgICAgICAgICAgICAgc3AuYXBwZW5kKF9kYXRhKG9mZnNldCwgbnVtYnl0ZXMsIHJlYWxwb3MpKQorICAgICAgICAgICAgICAgIHJlYWxwb3MgKz0gbnVtYnl0ZXMKKyAgICAgICAgICAgICAgICBsYXN0cG9zID0gb2Zmc2V0ICsgbnVtYnl0ZXMKKyAgICAgICAgICAgICAgICBwb3MgKz0gMjQKKyAgICAgICAgICAgIGlzZXh0ZW5kZWQgPSBvcmQoYnVmWzUwNF0pCisKKyAgICAgICAgaWYgbGFzdHBvcyA8IG9yaWdzaXplOgorICAgICAgICAgICAgc3AuYXBwZW5kKF9ob2xlKGxhc3Rwb3MsIG9yaWdzaXplIC0gbGFzdHBvcykpCisKKyAgICAgICAgdGFyaW5mby5zcGFyc2UgPSBzcAorCisgICAgICAgIHRhcmluZm8ub2Zmc2V0X2RhdGEgPSBzZWxmLm9mZnNldAorICAgICAgICBzZWxmLm9mZnNldCArPSBzZWxmLl9ibG9jayh0YXJpbmZvLnNpemUpCisgICAgICAgIHRhcmluZm8uc2l6ZSA9IG9yaWdzaXplCisgICAgICAgIHJldHVybiB0YXJpbmZvCisKKyAgICAjIFRoZSB0eXBlIG1hcHBpbmcgZm9yIHRoZSBuZXh0KCkgbWV0aG9kLiBUaGUga2V5cyBhcmUgc2luZ2xlIGNoYXJhY3RlcgorICAgICMgc3RyaW5ncywgdGhlIHR5cGVmbGFnLiBUaGUgdmFsdWVzIGFyZSBtZXRob2RzIHdoaWNoIGFyZSBjYWxsZWQgd2hlbgorICAgICMgbmV4dCgpIGVuY291bnRlcnMgc3VjaCBhIHR5cGVmbGFnLgorICAgIFRZUEVfTUVUSCA9IHsKKyAgICAgICAgR05VVFlQRV9MT05HTkFNRTogcHJvY19nbnVsb25nLAorICAgICAgICBHTlVUWVBFX0xPTkdMSU5LOiBwcm9jX2dudWxvbmcsCisgICAgICAgIEdOVVRZUEVfU1BBUlNFOiAgIHByb2Nfc3BhcnNlCisgICAgfQorCisgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBMaXR0bGUgaGVscGVyIG1ldGhvZHM6CisKKyAgICBkZWYgX2Jsb2NrKHNlbGYsIGNvdW50KToKKyAgICAgICAgIiIiUm91bmQgdXAgYSBieXRlIGNvdW50IGJ5IEJMT0NLU0laRSBhbmQgcmV0dXJuIGl0LAorICAgICAgICAgICBlLmcuIF9ibG9jayg4MzQpID0+IDEwMjQuCisgICAgICAgICIiIgorICAgICAgICBibG9ja3MsIHJlbWFpbmRlciA9IGRpdm1vZChjb3VudCwgQkxPQ0tTSVpFKQorICAgICAgICBpZiByZW1haW5kZXI6CisgICAgICAgICAgICBibG9ja3MgKz0gMQorICAgICAgICByZXR1cm4gYmxvY2tzICogQkxPQ0tTSVpFCisKKyAgICBkZWYgX2dldG1lbWJlcihzZWxmLCBuYW1lLCB0YXJpbmZvPU5vbmUpOgorICAgICAgICAiIiJGaW5kIGFuIGFyY2hpdmUgbWVtYmVyIGJ5IG5hbWUgZnJvbSBib3R0b20gdG8gdG9wLgorICAgICAgICAgICBJZiB0YXJpbmZvIGlzIGdpdmVuLCBpdCBpcyB1c2VkIGFzIHRoZSBzdGFydGluZyBwb2ludC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHRhcmluZm8gaXMgTm9uZToKKyAgICAgICAgICAgIGVuZCA9IGxlbihzZWxmLm1lbWJlcnMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBlbmQgPSBzZWxmLm1lbWJlcnMuaW5kZXgodGFyaW5mbykKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoZW5kIC0gMSwgLTEsIC0xKToKKyAgICAgICAgICAgIGlmIG5hbWUgPT0gc2VsZi5tZW1iZXJuYW1lc1tpXToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5tZW1iZXJzW2ldCisKKyAgICBkZWYgX2xvYWQoc2VsZik6CisgICAgICAgICIiIlJlYWQgdGhyb3VnaCB0aGUgZW50aXJlIGFyY2hpdmUgZmlsZSBhbmQgbG9vayBmb3IgcmVhZGFibGUKKyAgICAgICAgICAgbWVtYmVycy4KKyAgICAgICAgIiIiCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICB0YXJpbmZvID0gc2VsZi5uZXh0KCkKKyAgICAgICAgICAgIGlmIHRhcmluZm8gaXMgTm9uZToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBzZWxmLl9sb2FkZWQgPSBUcnVlCisKKyAgICBkZWYgX2NoZWNrKHNlbGYsIG1vZGU9Tm9uZSk6CisgICAgICAgICIiIkNoZWNrIGlmIFRhckZpbGUgaXMgc3RpbGwgb3BlbiwgYW5kIGlmIHRoZSBvcGVyYXRpb24ncyBtb2RlCisgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIFRhckZpbGUncyBtb2RlLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CisgICAgICAgICAgICByYWlzZSBJT0Vycm9yLCAiJXMgaXMgY2xvc2VkIiAlIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fCisgICAgICAgIGlmIG1vZGUgaXMgbm90IE5vbmUgYW5kIHNlbGYuX21vZGUgbm90IGluIG1vZGU6CisgICAgICAgICAgICByYWlzZSBJT0Vycm9yLCAiYmFkIG9wZXJhdGlvbiBmb3IgbW9kZSAlciIgJSBzZWxmLl9tb2RlCisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgICIiIlByb3ZpZGUgYW4gaXRlcmF0b3Igb2JqZWN0LgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5fbG9hZGVkOgorICAgICAgICAgICAgcmV0dXJuIGl0ZXIoc2VsZi5tZW1iZXJzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIFRhckl0ZXIoc2VsZikKKworICAgIGRlZiBfY3JlYXRlX2dudWxvbmcoc2VsZiwgbmFtZSwgdHlwZSk6CisgICAgICAgICIiIldyaXRlIGEgR05VIGxvbmduYW1lL2xvbmdsaW5rIG1lbWJlciB0byB0aGUgVGFyRmlsZS4KKyAgICAgICAgICAgSXQgY29uc2lzdHMgb2YgYW4gZXh0ZW5kZWQgdGFyIGhlYWRlciwgd2l0aCB0aGUgbGVuZ3RoCisgICAgICAgICAgIG9mIHRoZSBsb25nbmFtZSBhcyBzaXplLCBmb2xsb3dlZCBieSBkYXRhIGJsb2NrcywKKyAgICAgICAgICAgd2hpY2ggY29udGFpbiB0aGUgbG9uZ25hbWUgYXMgYSBudWxsIHRlcm1pbmF0ZWQgc3RyaW5nLgorICAgICAgICAiIiIKKyAgICAgICAgdGFyaW5mbyA9IFRhckluZm8oKQorICAgICAgICB0YXJpbmZvLm5hbWUgPSAiLi8uL0BMb25nTGluayIKKyAgICAgICAgdGFyaW5mby50eXBlID0gdHlwZQorICAgICAgICB0YXJpbmZvLm1vZGUgPSAwCisgICAgICAgIHRhcmluZm8uc2l6ZSA9IGxlbihuYW1lKQorCisgICAgICAgICMgd3JpdGUgZXh0ZW5kZWQgaGVhZGVyCisgICAgICAgIHNlbGYuZmlsZW9iai53cml0ZSh0YXJpbmZvLnRvYnVmKCkpCisgICAgICAgICMgd3JpdGUgbmFtZSBibG9ja3MKKyAgICAgICAgc2VsZi5maWxlb2JqLndyaXRlKG5hbWUpCisgICAgICAgIGJsb2NrcywgcmVtYWluZGVyID0gZGl2bW9kKHRhcmluZm8uc2l6ZSwgQkxPQ0tTSVpFKQorICAgICAgICBpZiByZW1haW5kZXIgPiAwOgorICAgICAgICAgICAgc2VsZi5maWxlb2JqLndyaXRlKE5VTCAqIChCTE9DS1NJWkUgLSByZW1haW5kZXIpKQorICAgICAgICAgICAgYmxvY2tzICs9IDEKKyAgICAgICAgc2VsZi5vZmZzZXQgKz0gYmxvY2tzICogQkxPQ0tTSVpFCisKKyAgICBkZWYgX2RiZyhzZWxmLCBsZXZlbCwgbXNnKToKKyAgICAgICAgIiIiV3JpdGUgZGVidWdnaW5nIG91dHB1dCB0byBzeXMuc3RkZXJyLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgbGV2ZWwgPD0gc2VsZi5kZWJ1ZzoKKyAgICAgICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsIG1zZworIyBjbGFzcyBUYXJGaWxlCisKK2NsYXNzIFRhckl0ZXI6CisgICAgIiIiSXRlcmF0b3IgQ2xhc3MuCisKKyAgICAgICBmb3IgdGFyaW5mbyBpbiBUYXJGaWxlKC4uLik6CisgICAgICAgICAgIHN1aXRlLi4uCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGFyZmlsZSk6CisgICAgICAgICIiIkNvbnN0cnVjdCBhIFRhckl0ZXIgb2JqZWN0LgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi50YXJmaWxlID0gdGFyZmlsZQorICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGl0ZXJhdG9yIG9iamVjdC4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmCisgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgbmV4dCBpdGVtIHVzaW5nIFRhckZpbGUncyBuZXh0KCkgbWV0aG9kLgorICAgICAgICAgICBXaGVuIGFsbCBtZW1iZXJzIGhhdmUgYmVlbiByZWFkLCBzZXQgVGFyRmlsZSBhcyBfbG9hZGVkLgorICAgICAgICAiIiIKKyAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyZmlsZS5uZXh0KCkKKyAgICAgICAgaWYgbm90IHRhcmluZm86CisgICAgICAgICAgICBzZWxmLnRhcmZpbGUuX2xvYWRlZCA9IFRydWUKKyAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAgICAgcmV0dXJuIHRhcmluZm8KKworIyBIZWxwZXIgY2xhc3NlcyBmb3Igc3BhcnNlIGZpbGUgc3VwcG9ydAorY2xhc3MgX3NlY3Rpb246CisgICAgIiIiQmFzZSBjbGFzcyBmb3IgX2RhdGEgYW5kIF9ob2xlLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvZmZzZXQsIHNpemUpOgorICAgICAgICBzZWxmLm9mZnNldCA9IG9mZnNldAorICAgICAgICBzZWxmLnNpemUgPSBzaXplCisgICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBvZmZzZXQpOgorICAgICAgICByZXR1cm4gc2VsZi5vZmZzZXQgPD0gb2Zmc2V0IDwgc2VsZi5vZmZzZXQgKyBzZWxmLnNpemUKKworY2xhc3MgX2RhdGEoX3NlY3Rpb24pOgorICAgICIiIlJlcHJlc2VudCBhIGRhdGEgc2VjdGlvbiBpbiBhIHNwYXJzZSBmaWxlLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvZmZzZXQsIHNpemUsIHJlYWxwb3MpOgorICAgICAgICBfc2VjdGlvbi5fX2luaXRfXyhzZWxmLCBvZmZzZXQsIHNpemUpCisgICAgICAgIHNlbGYucmVhbHBvcyA9IHJlYWxwb3MKKworY2xhc3MgX2hvbGUoX3NlY3Rpb24pOgorICAgICIiIlJlcHJlc2VudCBhIGhvbGUgc2VjdGlvbiBpbiBhIHNwYXJzZSBmaWxlLgorICAgICIiIgorICAgIHBhc3MKKworY2xhc3MgX3JpbmdidWZmZXIobGlzdCk6CisgICAgIiIiUmluZ2J1ZmZlciBjbGFzcyB3aGljaCBpbmNyZWFzZXMgcGVyZm9ybWFuY2UKKyAgICAgICBvdmVyIGEgcmVndWxhciBsaXN0LgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5pZHggPSAwCisgICAgZGVmIGZpbmQoc2VsZiwgb2Zmc2V0KToKKyAgICAgICAgaWR4ID0gc2VsZi5pZHgKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGl0ZW0gPSBzZWxmW2lkeF0KKyAgICAgICAgICAgIGlmIG9mZnNldCBpbiBpdGVtOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpZHggKz0gMQorICAgICAgICAgICAgaWYgaWR4ID09IGxlbihzZWxmKToKKyAgICAgICAgICAgICAgICBpZHggPSAwCisgICAgICAgICAgICBpZiBpZHggPT0gc2VsZi5pZHg6CisgICAgICAgICAgICAgICAgIyBFbmQgb2YgRmlsZQorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIHNlbGYuaWR4ID0gaWR4CisgICAgICAgIHJldHVybiBpdGVtCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgemlwZmlsZSBjb21wYXRpYmxlIFRhckZpbGUgY2xhc3MKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RBUl9QTEFJTiA9IDAgICAgICAgICAgICMgemlwZmlsZS5aSVBfU1RPUkVECitUQVJfR1pJUFBFRCA9IDggICAgICAgICAjIHppcGZpbGUuWklQX0RFRkxBVEVECitjbGFzcyBUYXJGaWxlQ29tcGF0OgorICAgICIiIlRhckZpbGUgY2xhc3MgY29tcGF0aWJsZSB3aXRoIHN0YW5kYXJkIG1vZHVsZSB6aXBmaWxlJ3MKKyAgICAgICBaaXBGaWxlIGNsYXNzLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlLCBtb2RlPSJyIiwgY29tcHJlc3Npb249VEFSX1BMQUlOKToKKyAgICAgICAgaWYgY29tcHJlc3Npb24gPT0gVEFSX1BMQUlOOgorICAgICAgICAgICAgc2VsZi50YXJmaWxlID0gVGFyRmlsZS50YXJvcGVuKGZpbGUsIG1vZGUpCisgICAgICAgIGVsaWYgY29tcHJlc3Npb24gPT0gVEFSX0daSVBQRUQ6CisgICAgICAgICAgICBzZWxmLnRhcmZpbGUgPSBUYXJGaWxlLmd6b3BlbihmaWxlLCBtb2RlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgInVua25vd24gY29tcHJlc3Npb24gY29uc3RhbnQiCisgICAgICAgIGlmIG1vZGVbMDoxXSA9PSAiciI6CisgICAgICAgICAgICBtZW1iZXJzID0gc2VsZi50YXJmaWxlLmdldG1lbWJlcnMoKQorICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKGxlbihtZW1iZXJzKSk6CisgICAgICAgICAgICAgICAgbSA9IG1lbWJlcnNbaV0KKyAgICAgICAgICAgICAgICBtLmZpbGVuYW1lID0gbS5uYW1lCisgICAgICAgICAgICAgICAgbS5maWxlX3NpemUgPSBtLnNpemUKKyAgICAgICAgICAgICAgICBtLmRhdGVfdGltZSA9IHRpbWUuZ210aW1lKG0ubXRpbWUpWzo2XQorICAgIGRlZiBuYW1lbGlzdChzZWxmKToKKyAgICAgICAgcmV0dXJuIG1hcChsYW1iZGEgbTogbS5uYW1lLCBzZWxmLmluZm9saXN0KCkpCisgICAgZGVmIGluZm9saXN0KHNlbGYpOgorICAgICAgICByZXR1cm4gZmlsdGVyKGxhbWJkYSBtOiBtLnR5cGUgaW4gUkVHVUxBUl9UWVBFUywKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRhcmZpbGUuZ2V0bWVtYmVycygpKQorICAgIGRlZiBwcmludGRpcihzZWxmKToKKyAgICAgICAgc2VsZi50YXJmaWxlLmxpc3QoKQorICAgIGRlZiB0ZXN0emlwKHNlbGYpOgorICAgICAgICByZXR1cm4KKyAgICBkZWYgZ2V0aW5mbyhzZWxmLCBuYW1lKToKKyAgICAgICAgcmV0dXJuIHNlbGYudGFyZmlsZS5nZXRtZW1iZXIobmFtZSkKKyAgICBkZWYgcmVhZChzZWxmLCBuYW1lKToKKyAgICAgICAgcmV0dXJuIHNlbGYudGFyZmlsZS5leHRyYWN0ZmlsZShzZWxmLnRhcmZpbGUuZ2V0bWVtYmVyKG5hbWUpKS5yZWFkKCkKKyAgICBkZWYgd3JpdGUoc2VsZiwgZmlsZW5hbWUsIGFyY25hbWU9Tm9uZSwgY29tcHJlc3NfdHlwZT1Ob25lKToKKyAgICAgICAgc2VsZi50YXJmaWxlLmFkZChmaWxlbmFtZSwgYXJjbmFtZSkKKyAgICBkZWYgd3JpdGVzdHIoc2VsZiwgemluZm8sIGJ5dGVzKToKKyAgICAgICAgaW1wb3J0IFN0cmluZ0lPCisgICAgICAgIGltcG9ydCBjYWxlbmRhcgorICAgICAgICB6aW5mby5uYW1lID0gemluZm8uZmlsZW5hbWUKKyAgICAgICAgemluZm8uc2l6ZSA9IHppbmZvLmZpbGVfc2l6ZQorICAgICAgICB6aW5mby5tdGltZSA9IGNhbGVuZGFyLnRpbWVnbSh6aW5mby5kYXRlX3RpbWUpCisgICAgICAgIHNlbGYudGFyZmlsZS5hZGRmaWxlKHppbmZvLCBTdHJpbmdJTy5TdHJpbmdJTyhieXRlcykpCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLnRhcmZpbGUuY2xvc2UoKQorI2NsYXNzIFRhckZpbGVDb21wYXQKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGV4cG9ydGVkIGZ1bmN0aW9ucworIy0tLS0tLS0tLS0tLS0tLS0tLS0tCitkZWYgaXNfdGFyZmlsZShuYW1lKToKKyAgICAiIiJSZXR1cm4gVHJ1ZSBpZiBuYW1lIHBvaW50cyB0byBhIHRhciBhcmNoaXZlIHRoYXQgd2UKKyAgICAgICBhcmUgYWJsZSB0byBoYW5kbGUsIGVsc2UgcmV0dXJuIEZhbHNlLgorICAgICIiIgorICAgIHRyeToKKyAgICAgICAgdCA9IG9wZW4obmFtZSkKKyAgICAgICAgdC5jbG9zZSgpCisgICAgICAgIHJldHVybiBUcnVlCisgICAgZXhjZXB0IFRhckVycm9yOgorICAgICAgICByZXR1cm4gRmFsc2UKKworb3BlbiA9IFRhckZpbGUub3BlbgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90YXJmaWxlLnB5IGIvTGliL3Rlc3QvdGVzdF90YXJmaWxlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYzA2ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC90ZXN0X3RhcmZpbGUucHkKQEAgLTAsMCArMSwyNTMgQEAKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworaW1wb3J0IHNodXRpbAorCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCB0YXJmaWxlCisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKKyMgQ2hlY2sgZm9yIG91ciBjb21wcmVzc2lvbiBtb2R1bGVzLgordHJ5OgorICAgIGltcG9ydCBnemlwCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgZ3ppcCA9IE5vbmUKK3RyeToKKyAgICBpbXBvcnQgYnoyCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgYnoyID0gTm9uZQorCitkZWYgcGF0aChwYXRoKToKKyAgICByZXR1cm4gdGVzdF9zdXBwb3J0LmZpbmRmaWxlKHBhdGgpCisKK3Rlc3R0YXIgPSBwYXRoKCJ0ZXN0dGFyLnRhciIpCit0ZW1wZGlyID0gcGF0aCgidGVzdHRhci5kaXIiKQordGVtcG5hbWUgPSBwYXRoKCJ0ZXN0dGFyLnRtcCIpCittZW1iZXJjb3VudCA9IDEwCisKK2RlZiB0YXJuYW1lKGNvbXA9IiIpOgorICAgIGlmIG5vdCBjb21wOgorICAgICAgICByZXR1cm4gdGVzdHRhcgorICAgIHJldHVybiAiJXMuJXMiICUgKHRlc3R0YXIsIGNvbXApCisKK2RlZiBkaXJuYW1lKCk6CisgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHRlbXBkaXIpOgorICAgICAgICBvcy5ta2Rpcih0ZW1wZGlyKQorICAgIHJldHVybiB0ZW1wZGlyCisKK2RlZiB0bXBuYW1lKCk6CisgICAgcmV0dXJuIHRlbXBuYW1lCisKKworY2xhc3MgQmFzZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGNvbXAgPSAnJworICAgIG1vZGUgPSAncicKKyAgICBzZXAgPSAnOicKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgbW9kZSA9IHNlbGYubW9kZSArIHNlbGYuc2VwICsgc2VsZi5jb21wCisgICAgICAgIHNlbGYudGFyID0gdGFyZmlsZS5vcGVuKHRhcm5hbWUoc2VsZi5jb21wKSwgbW9kZSkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi50YXIuY2xvc2UoKQorCitjbGFzcyBSZWFkVGVzdChCYXNlVGVzdCk6CisKKyAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgIiIiVGVzdCBtZW1iZXIgZXh0cmFjdGlvbi4KKyAgICAgICAgIiIiCisgICAgICAgIG1lbWJlcnMgPSAwCisgICAgICAgIGZvciB0YXJpbmZvIGluIHNlbGYudGFyOgorICAgICAgICAgICAgbWVtYmVycyArPSAxCisgICAgICAgICAgICBpZiBub3QgdGFyaW5mby5pc3JlZygpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBmID0gc2VsZi50YXIuZXh0cmFjdGZpbGUodGFyaW5mbykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oZi5yZWFkKCkpID09IHRhcmluZm8uc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAic2l6ZSByZWFkIGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkIHNpemUiKQorICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRfKG1lbWJlcnMgPT0gbWVtYmVyY291bnQsCisgICAgICAgICAgICAgICAgICAgICAiY291bGQgbm90IGZpbmQgYWxsIG1lbWJlcnMiKQorCisgICAgZGVmIHRlc3Rfc3BhcnNlKHNlbGYpOgorICAgICAgICAiIiJUZXN0IHNwYXJzZSBtZW1iZXIgZXh0cmFjdGlvbi4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuc2VwICE9ICJ8IjoKKyAgICAgICAgICAgIGYxID0gc2VsZi50YXIuZXh0cmFjdGZpbGUoIlMtU1BBUlNFIikKKyAgICAgICAgICAgIGYyID0gc2VsZi50YXIuZXh0cmFjdGZpbGUoIlMtU1BBUlNFLVdJVEgtTlVMTFMiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGYxLnJlYWQoKSA9PSBmMi5yZWFkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIl9GaWxlT2JqZWN0IGZhaWxlZCBvbiBzcGFyc2UgZmlsZSBtZW1iZXIiKQorCisgICAgZGVmIHRlc3RfcmVhZGxpbmVzKHNlbGYpOgorICAgICAgICAiIiJUZXN0IHJlYWRsaW5lcygpIG1ldGhvZCBvZiBfRmlsZU9iamVjdC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuc2VwICE9ICJ8IjoKKyAgICAgICAgICAgIGZpbGVuYW1lID0gIjAtUkVHVFlQRS1URVhUIgorICAgICAgICAgICAgc2VsZi50YXIuZXh0cmFjdChmaWxlbmFtZSwgZGlybmFtZSgpKQorICAgICAgICAgICAgbGluZXMxID0gZmlsZShvcy5wYXRoLmpvaW4oZGlybmFtZSgpLCBmaWxlbmFtZSksICJyIikucmVhZGxpbmVzKCkKKyAgICAgICAgICAgIGxpbmVzMiA9IHNlbGYudGFyLmV4dHJhY3RmaWxlKGZpbGVuYW1lKS5yZWFkbGluZXMoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGxpbmVzMSA9PSBsaW5lczIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIl9GaWxlT2JqZWN0LnJlYWRsaW5lKCkgZG9lcyBub3Qgd29yayBjb3JyZWN0bHkiKQorCisgICAgZGVmIHRlc3Rfc2VlayhzZWxmKToKKyAgICAgICAgIiIiVGVzdCBzZWVrKCkgbWV0aG9kIG9mIF9GaWxlT2JqZWN0LCBpbmNsLiByYW5kb20gcmVhZGluZy4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuc2VwICE9ICJ8IjoKKyAgICAgICAgICAgIGZpbGVuYW1lID0gIjAtUkVHVFlQRSIKKyAgICAgICAgICAgIHNlbGYudGFyLmV4dHJhY3QoZmlsZW5hbWUsIGRpcm5hbWUoKSkKKyAgICAgICAgICAgIGRhdGEgPSBmaWxlKG9zLnBhdGguam9pbihkaXJuYW1lKCksIGZpbGVuYW1lKSwgInJiIikucmVhZCgpCisKKyAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIoZmlsZW5hbWUpCisgICAgICAgICAgICBmb2JqID0gc2VsZi50YXIuZXh0cmFjdGZpbGUodGFyaW5mbykKKworICAgICAgICAgICAgdGV4dCA9IGZvYmoucmVhZCgpCisgICAgICAgICAgICBmb2JqLnNlZWsoMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygwID09IGZvYmoudGVsbCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJzZWVrKCkgdG8gZmlsZSdzIHN0YXJ0IGZhaWxlZCIpCisgICAgICAgICAgICBmb2JqLnNlZWsoMjA0OCwgMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygyMDQ4ID09IGZvYmoudGVsbCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJzZWVrKCkgdG8gYWJzb2x1dGUgcG9zaXRpb24gZmFpbGVkIikKKyAgICAgICAgICAgIGZvYmouc2VlaygtMTAyNCwgMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygxMDI0ID09IGZvYmoudGVsbCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJzZWVrKCkgdG8gbmVnYXRpdmUgcmVsYXRpdmUgcG9zaXRpb24gZmFpbGVkIikKKyAgICAgICAgICAgIGZvYmouc2VlaygxMDI0LCAxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRfKDIwNDggPT0gZm9iai50ZWxsKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgInNlZWsoKSB0byBwb3NpdGl2ZSByZWxhdGl2ZSBwb3NpdGlvbiBmYWlsZWQiKQorICAgICAgICAgICAgcyA9IGZvYmoucmVhZCgxMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhzID09IGRhdGFbMjA0ODoyMDU4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAicmVhZCgpIGFmdGVyIHNlZWsgZmFpbGVkIikKKyAgICAgICAgICAgIGZvYmouc2VlaygwLCAyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHRhcmluZm8uc2l6ZSA9PSBmb2JqLnRlbGwoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAic2VlaygpIHRvIGZpbGUncyBlbmQgZmFpbGVkIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhmb2JqLnJlYWQoKSA9PSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAicmVhZCgpIGF0IGZpbGUncyBlbmQgZGlkIG5vdCByZXR1cm4gZW1wdHkgc3RyaW5nIikKKyAgICAgICAgICAgIGZvYmouc2VlaygtdGFyaW5mby5zaXplLCAyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRfKDAgPT0gZm9iai50ZWxsKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgInJlbGF0aXZlIHNlZWsoKSB0byBmaWxlJ3Mgc3RhcnQgZmFpbGVkIikKKyAgICAgICAgICAgIGZvYmouc2Vlayg1MTIpCisgICAgICAgICAgICBzMSA9IGZvYmoucmVhZGxpbmVzKCkKKyAgICAgICAgICAgIGZvYmouc2Vlayg1MTIpCisgICAgICAgICAgICBzMiA9IGZvYmoucmVhZGxpbmVzKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhzMSA9PSBzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAicmVhZGxpbmVzKCkgYWZ0ZXIgc2VlayBmYWlsZWQiKQorICAgICAgICAgICAgZm9iai5jbG9zZSgpCisKK2NsYXNzIFJlYWRTdHJlYW1UZXN0KFJlYWRUZXN0KToKKyAgICBzZXAgPSAifCIKKworICAgIGRlZiB0ZXN0KHNlbGYpOgorICAgICAgICAiIiJUZXN0IG1lbWJlciBleHRyYWN0aW9uLCBhbmQgZm9yIFN0cmVhbUVycm9yIHdoZW4KKyAgICAgICAgICAgc2Vla2luZyBiYWNrd2FyZHMuCisgICAgICAgICIiIgorICAgICAgICBSZWFkVGVzdC50ZXN0KHNlbGYpCisgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXJzKClbMF0KKyAgICAgICAgZiA9IHNlbGYudGFyLmV4dHJhY3RmaWxlKHRhcmluZm8pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRhcmZpbGUuU3RyZWFtRXJyb3IsIGYucmVhZCkKKworICAgIGRlZiB0ZXN0X3N0cmVhbShzZWxmKToKKyAgICAgICAgIiIiQ29tcGFyZSB0aGUgbm9ybWFsIHRhciBhbmQgdGhlIHN0cmVhbSB0YXIuCisgICAgICAgICIiIgorICAgICAgICBzdHJlYW0gPSBzZWxmLnRhcgorICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odGFybmFtZSgpLCAncicpCisKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIHQxID0gdGFyLm5leHQoKQorICAgICAgICAgICAgdDIgPSBzdHJlYW0ubmV4dCgpCisgICAgICAgICAgICBpZiB0MSBpcyBOb25lOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBzZWxmLmFzc2VydF8odDIgaXMgbm90IE5vbmUsICJzdHJlYW0ubmV4dCgpIGZhaWxlZC4iKQorCisgICAgICAgICAgICBpZiB0Mi5pc2xuaygpIG9yIHQyLmlzc3ltKCk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModGFyZmlsZS5TdHJlYW1FcnJvciwgc3RyZWFtLmV4dHJhY3RmaWxlLCB0MikKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgdjEgPSB0YXIuZXh0cmFjdGZpbGUodDEpCisgICAgICAgICAgICB2MiA9IHN0cmVhbS5leHRyYWN0ZmlsZSh0MikKKyAgICAgICAgICAgIGlmIHYxIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh2MiBpcyBub3QgTm9uZSwgInN0cmVhbS5leHRyYWN0ZmlsZSgpIGZhaWxlZCIpCisgICAgICAgICAgICBzZWxmLmFzc2VydF8odjEucmVhZCgpID09IHYyLnJlYWQoKSwgInN0cmVhbSBleHRyYWN0aW9uIGZhaWxlZCIpCisKKyAgICAgICAgc3RyZWFtLmNsb3NlKCkKKworY2xhc3MgV3JpdGVUZXN0KEJhc2VUZXN0KToKKyAgICBtb2RlID0gJ3cnCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIG1vZGUgPSBzZWxmLm1vZGUgKyBzZWxmLnNlcCArIHNlbGYuY29tcAorICAgICAgICBzZWxmLnNyYyA9IHRhcmZpbGUub3Blbih0YXJuYW1lKHNlbGYuY29tcCksICdyJykKKyAgICAgICAgc2VsZi5kc3QgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSgpLCBtb2RlKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLnNyYy5jbG9zZSgpCisgICAgICAgIHNlbGYuZHN0LmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X3Bvc2l4KHNlbGYpOgorICAgICAgICBzZWxmLmRzdC5wb3NpeCA9IDEKKyAgICAgICAgc2VsZi5fdGVzdCgpCisKKyAgICBkZWYgdGVzdF9ub25wb3NpeChzZWxmKToKKyAgICAgICAgc2VsZi5kc3QucG9zaXggPSAwCisgICAgICAgIHNlbGYuX3Rlc3QoKQorCisgICAgZGVmIF90ZXN0KHNlbGYpOgorICAgICAgICBmb3IgdGFyaW5mbyBpbiBzZWxmLnNyYzoKKyAgICAgICAgICAgIGlmIG5vdCB0YXJpbmZvLmlzcmVnKCk6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGYgPSBzZWxmLnNyYy5leHRyYWN0ZmlsZSh0YXJpbmZvKQorICAgICAgICAgICAgaWYgc2VsZi5kc3QucG9zaXggYW5kIGxlbih0YXJpbmZvLm5hbWUpID4gdGFyZmlsZS5MRU5HVEhfTkFNRToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLmRzdC5hZGRmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyaW5mbywgZikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5kc3QuYWRkZmlsZSh0YXJpbmZvLCBmKQorCitjbGFzcyBXcml0ZVN0cmVhbVRlc3QoV3JpdGVUZXN0KToKKyAgICBzZXAgPSAnfCcKKworIyBHemlwIFRlc3RDYXNlcworY2xhc3MgUmVhZFRlc3RHemlwKFJlYWRUZXN0KToKKyAgICBjb21wID0gImd6IgorY2xhc3MgUmVhZFN0cmVhbVRlc3RHemlwKFJlYWRTdHJlYW1UZXN0KToKKyAgICBjb21wID0gImd6IgorY2xhc3MgV3JpdGVUZXN0R3ppcChXcml0ZVRlc3QpOgorICAgIGNvbXAgPSAiZ3oiCitjbGFzcyBXcml0ZVN0cmVhbVRlc3RHemlwKFdyaXRlU3RyZWFtVGVzdCk6CisgICAgY29tcCA9ICJneiIKKworaWYgYnoyOgorICAgICMgQnppcDIgVGVzdENhc2VzCisgICAgY2xhc3MgUmVhZFRlc3RCemlwMihSZWFkVGVzdEd6aXApOgorICAgICAgICBjb21wID0gImJ6MiIKKyAgICBjbGFzcyBSZWFkU3RyZWFtVGVzdEJ6aXAyKFJlYWRTdHJlYW1UZXN0R3ppcCk6CisgICAgICAgIGNvbXAgPSAiYnoyIgorICAgIGNsYXNzIFdyaXRlVGVzdEJ6aXAyKFdyaXRlVGVzdCk6CisgICAgICAgIGNvbXAgPSAiYnoyIgorICAgIGNsYXNzIFdyaXRlU3RyZWFtVGVzdEJ6aXAyKFdyaXRlU3RyZWFtVGVzdEd6aXApOgorICAgICAgICBjb21wID0gImJ6MiIKKworIyBJZiBpbXBvcnRpbmcgZ3ppcCBmYWlsZWQsIGRpc2NhcmQgdGhlIEd6aXAgVGVzdENhc2VzLgoraWYgbm90IGd6aXA6CisgICAgZGVsIFJlYWRUZXN0R3ppcAorICAgIGRlbCBSZWFkU3RyZWFtVGVzdEd6aXAKKyAgICBkZWwgV3JpdGVUZXN0R3ppcAorICAgIGRlbCBXcml0ZVN0cmVhbVRlc3RHemlwCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgaWYgZ3ppcDoKKyAgICAgICAgIyBjcmVhdGUgdGVzdHRhci50YXIuZ3oKKyAgICAgICAgZ3ppcC5vcGVuKHRhcm5hbWUoImd6IiksICJ3YiIpLndyaXRlKGZpbGUodGFybmFtZSgpLCAicmIiKS5yZWFkKCkpCisgICAgaWYgYnoyOgorICAgICAgICAjIGNyZWF0ZSB0ZXN0dGFyLnRhci5iejIKKyAgICAgICAgYnoyLkJaMkZpbGUodGFybmFtZSgiYnoyIiksICJ3YiIpLndyaXRlKGZpbGUodGFybmFtZSgpLCAicmIiKS5yZWFkKCkpCisKKyAgICB0cnk6CisgICAgICAgIHVuaXR0ZXN0Lm1haW4oKQorICAgIGZpbmFsbHk6CisgICAgICAgIGlmIGd6aXA6CisgICAgICAgICAgICBvcy5yZW1vdmUodGFybmFtZSgiZ3oiKSkKKyAgICAgICAgaWYgYnoyOgorICAgICAgICAgICAgb3MucmVtb3ZlKHRhcm5hbWUoImJ6MiIpKQorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyh0ZW1wZGlyKToKKyAgICAgICAgICAgIHNodXRpbC5ybXRyZWUodGVtcGRpcikKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHModGVtcG5hbWUpOgorICAgICAgICAgICAgb3MucmVtb3ZlKHRlbXBuYW1lKQorCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0dGFyLnRhciBiL0xpYi90ZXN0L3Rlc3R0YXIudGFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMTI1YjMKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC90ZXN0dGFyLnRhcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9NaXNjL0FDS1MgYi9NaXNjL0FDS1MKaW5kZXggODM5ZjhlZC4uYTk3NzNkOCAxMDA2NDQKLS0tIGEvTWlzYy9BQ0tTCisrKyBiL01pc2MvQUNLUwpAQCAtMTk2LDYgKzE5Niw3IEBACiBEdW5jYW4gR3Jpc2J5CiBEYWcgR3J1bmVhdQogTWljaGFlbCBHdXJhdmFnZQorTGFycyBHdXN05GJlbAogQmFycnkgSGFkZG93CiBQYXVsIHRlbiBIYWdlbgogUmFzbXVzIEhhaG4KZGlmZiAtLWdpdCBhL01pc2MvTkVXUyBiL01pc2MvTkVXUwppbmRleCA4YmMyOWE2Li4zMDUxMTEwIDEwMDY0NAotLS0gYS9NaXNjL05FV1MKKysrIGIvTWlzYy9ORVdTCkBAIC02Myw2ICs2MywxMCBAQAogICBJdCBpcyBhbHNvIGV4cG9ydGVkIGZvciBudHBhdGgsIG1hY3BhdGgsIGFuZCBvczJlbXhwYXRoLgogICBTZWUgU0YgYnVnICM2NTkyMjguCiAKKy0gTmV3IG1vZHVsZSB0YXJmaWxlIGZyb20gTGFycyBHdXN05GJlbCBwcm92aWRlcyBhIGNvbXByZWhlbnNpdmUgaW50ZXJmYWNlCisgIHRvIHRhciBhcmNoaXZlIGZpbGVzIHdpdGggdHJhbnNwYXJlbnQgZ3ppcCBhbmQgYnppcDIgY29tcHJlc3Npb24uCisgIFNlZSBTRiBwYXRjaCAjNjUxMDgyLgorCiAKIFRvb2xzL0RlbW9zCiAtLS0tLS0tLS0tLQo=