FAQ
1.0.12
OTRS GmbH
http://otrs.org/
GNU GENERAL PUBLIC LICENSE Version 2, June 1991
fixed faq link bug
2005-12-04 New package
A FAQ/knowledge base.
Eine FAQ-/Wissensdatenbank.
2.1.x
# add faq group
require Kernel::System::Group;
$Self->{GroupObject} = Kernel::System::Group->new(%{$Self});
$Self->{GroupObject}->GroupAdd(
Name => 'faq',
Comment => 'faq database users',
ValidID => 1,
UserID => 1,
);
2006-12-13 13:48:21
lancelot.otrs.com
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8b3Ryc19jb25maWcgdmVyc2lvbj0iMS4wIiBpbml0PSJBcHBsaWNhdGlvbiI+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpOb3RlVHlwZXMiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5TcGVjaWZ5IHRoZSBkaWZmZXJlbnQgbm90ZSB0eXBlcywgdGhhdCB5b3Ugd2FudCB0byB1c2UgaW4geW91ciBzeXN0ZW0uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkhpZXIgaz9uZW4gZGllIHZlcnNjaGllZGVuZW4gTm90aXotVHlwZW4gZmVzdGdlbGVndCB3ZXJkZW4sIGRpZSBpbm5lcmhhbGIgZGVzIFN5c3RlbXMgdmVyd2VuZGV0IHdlcmRlbiBzb2xsZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdOb3RlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Im5vdGUtaW50ZXJuYWwiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Im5vdGUtZXh0ZXJuYWwiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Im5vdGUtcmVwb3J0Ij4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRkFROjpEZWZhdWx0OjpSb290Q2F0ZWdvcnlOYW1lIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+ZGVmYXVsdCBjYXRlZ29yeSBuYW1lLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Sb290IEthdGVnb3JpZSBOYW1lLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZBUTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkRlZmF1bHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nPkZBUTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KCiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGQVE6OkRlZmF1bHQ6OlJvb3RDYXRlZ29yeUNvbW1lbnQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5kZWZhdWx0IGNhdGVnb3J5IG5hbWUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPlJvb3QgS2F0ZWdvcmllIE5hbWUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RkFRPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6RGVmYXVsdDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmc+ZGVmYXVsdCBjb21tZW50PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgoKICAgIDxDb25maWdJdGVtIE5hbWU9IkZBUTo6SXRlbTo6Vm90aW5nOjpSYXRlcyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlJhdGVzIGZvciB2b3RpbmcuIEtleSBtdXN0IGJlIGluIHByb2NlbnQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkdld2ljaHR1bmcgZvxyIGRpZSBCZXdlcnR1bmcuIERlciBLZXkgbXVzcyBpbiBQcm96ZW50IGFuZ2VnZWJlbiB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RkFRPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SXRlbTo6Vm90aW5nPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEwMCI+MTAwICU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ijc1Ij43NSAlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI1MCI+NTAgJTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMjUiPjI1ICU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPjAgJTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KCgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRkFROjpJdGVtOjpWb3Rpbmc6OlNob3ciIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5zaG93IHZvdGluZzwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5JbnRlcmZhY2VzIGluIGRlbmVuIGRhcyBWb3RpbmcgRmVhdHVyZSBhbmdlemVpZ3Qgd2VyZGVuIHNvbGwuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RkFRPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SXRlbTo6Vm90aW5nPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImludGVybmFsIj5pbnRlcm5hbCAoYWdlbnQpPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJleHRlcm5hbCI+ZXh0ZXJuYWwgKGN1c3RvbWVyKTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KCiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGQVE6Okl0ZW06OlZvdGluZzo6UXVlc3Rpb25MYW5nS2V5IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+bGFuZ3VhZ2VrZXkgd2hpY2ggaXMgZGVmaW5lZCBpbiB0aGUgbGFuZ2F1Z2UgZmlsZSAqX0ZBUS5wbTwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5MYW5ndWFnZUtleSBm/HIgZGllIEZyYWdlIGJlaSBkZXIgQXJ0aWtlbGJld2VydHVuZy4gV2lyZCBpbiBkZW4gU3ByYWNoZmlsZXMgZGVmaW5pZXJ0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZBUTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6Okl0ZW06OlZvdGluZzwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmc+QXJ0aWNsZVZvdGluZ1F1ZXN0aW9uPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgoKICAgIDxDb25maWdJdGVtIE5hbWU9IkZBUTo6RXhwbG9yZXI6OlBhdGg6OlNob3ciIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5zaG93IEZBUSBwYXRoIHllcy9ubzwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5GQVEgUGZhZCBhbnplaWdlbiBqYS9uZWluPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RkFRPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6RXhwbG9yZXI8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjEiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRkFROjpFeHBsb3Jlcjo6SXRlbUxpc3Q6OlZvdGluZ1Jlc3VsdERlY2ltYWxQbGFjZXMiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5kZWNpbWFsIHBsYWNlcyBvZiB0aGUgdm90aW5nIHJlc3VsdDwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZXppbWFsc3RlbGxlbiBkZXMgRXJnZWJuaXNlcyBiZWkgZGVyIEFydGlrZWxiZXdlcnR1bmcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RkFRPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6RXhwbG9yZXI8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nPjI8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRkFROjpFeHBsb3Jlcjo6SXRlbUxpc3Q6OlZvdGluZ1Jlc3VsdENvbG9ycyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPmNzcyBjb2xvciBmb3IgdGhlIHZvdGluZyByZXN1bHQ8L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RmFyYmVuIGb8ciBkaWUgQW56ZWlnZSBkZXMgRXJnZWJuaXNlcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GQVE8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpFeHBsb3JlcjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIzMCI+cmVkPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI3MCI+b3JhbmdlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxMDAiPmdyZWVuPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgoKICAgIDxDb25maWdJdGVtIE5hbWU9IkZBUTo6RXhwbG9yZXI6OlBhdGg6OlNlcGVyYXRvciIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkZBUSBwYXRoIHNlcGVyYXRvcjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5UcmVubnplaWNoZW4gaW0gRkFRIFBmYWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RkFRPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6RXhwbG9yZXI8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nPrs8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRkFROjpDYXRlZ29yeTo6SWNvbiIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPmNhdGVnb3J5IGljb248L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+S2F0ZWdvcmllIEljb24gaW4gZGVyIEZBUTwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZBUTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkNhdGVnb3J5PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZz5mYXEtY2F0ZWdvcnktc21hbGwucG5nPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgoKICAgIDxDb25maWdJdGVtIE5hbWU9IkZBUTo6SXRlbTo6SWNvbiIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPml0ZW0gaWNvbjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5BcnRpa2VsIEljb24gaW4gZGVyIEZBUTwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZBUTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6Okl0ZW08L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nPmZhcS1pdGVtLXNtYWxsLnBuZzwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KCiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGQVE6OkV4cGxvcmVyOjpRdWlja1NlYXJjaDo6U2hvdyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPnNob3cgcXVpY2tzZWFyY2g8L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+SW50ZXJmYWNlcyBpbiBkZW5lbiBkYXMgUXVpY2tTZWFyY2ggRmVhdHVyZSBhbmdlemVpZ3Qgd2lyZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GQVE8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpFeHBsb3JlcjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpbnRlcm5hbCI+aW50ZXJuYWwgKGFnZW50KTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iZXh0ZXJuYWwiPmV4dGVybmFsIChjdXN0b21lcik8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9InB1YmxpYyI+cHVibGljIChwdWJsaWMpPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgoKCiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGQVE6OkV4cGxvcmVyOjpRdWlja1NlYXJjaDo6U2hvd1N1YkNhdGVnb3J5SXRlbXMiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5zaG93IGl0ZW1zIG9mIHN1YmNhdGVnb3JpZXM8L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+QXJ0aWtlbCBhdXMgU3Via2F0ZWdvcmllbiBhbnplaWdlbiBqYS9uZWluPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RkFRPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6RXhwbG9yZXI8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjEiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRkFROjpFeHBsb3Jlcjo6TGFzdENoYW5nZTo6U2hvdyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPnNob3cgbGFzdCBjaGFuZ2UgaXRlbXM8L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+SW50ZXJmYWNlcyBpbiBkZW5lbiBkYXMgTGFzdENoYW5nZSBGZWF0dXJlIGFuZ2V6ZWlndCB3ZXJkZW4gc29sbC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GQVE8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpFeHBsb3JlcjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpbnRlcm5hbCI+aW50ZXJuYWwgKGFnZW50KTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iZXh0ZXJuYWwiPmV4dGVybmFsIChjdXN0b21lcik8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9InB1YmxpYyI+cHVibGljIChwdWJsaWMpPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgoKCiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGQVE6OkV4cGxvcmVyOjpMYXN0Q2hhbmdlOjpTaG93U3ViQ2F0ZWdvcnlJdGVtcyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPnNob3cgaXRlbXMgb2Ygc3ViY2F0ZWdvcmllczwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5BcnRpa2VsIGF1cyBTdWJrYXRlZ29yaWVuIGFuemVpZ2VuIGphL25laW48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GQVE8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpFeHBsb3JlcjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KCiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGQVE6OkV4cGxvcmVyOjpMYXN0Q2hhbmdlOjpMaW1pdCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPm51bWJlciBvZiBpdGVtczwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5BbnphaGwgZGVyIHp1IGFuemVpZ2VuZGVuIEFydGlrZWw8L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GQVE8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpFeHBsb3JlcjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmc+MzwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KCiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGQVE6OkV4cGxvcmVyOjpMYXN0Q3JlYXRlOjpTaG93IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+c2hvdyBsYXN0IGNyZWF0ZSBpdGVtczwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5JbnRlcmZhY2VzIGluIGRlbmVuIGRhcyBMYXN0Q3JlYXRlIEZlYXR1cmUgYW5nZXplaWd0IHdlcmRlbiBzb2xsLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZBUTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkV4cGxvcmVyPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImludGVybmFsIj5pbnRlcm5hbCAoYWdlbnQpPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJleHRlcm5hbCI+ZXh0ZXJuYWwgKGN1c3RvbWVyKTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0icHVibGljIj5wdWJsaWMgKHB1YmxpYyk8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRkFROjpFeHBsb3Jlcjo6TGFzdENyZWF0ZTo6U2hvd1N1YkNhdGVnb3J5SXRlbXMiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5zaG93IGl0ZW1zIG9mIHN1YmNhdGVnb3JpZXM8L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+QXJ0aWtlbCBhdXMgU3Via2F0ZWdvcmllbiBhbnplaWdlbiBqYS9uZWluPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RkFRPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6RXhwbG9yZXI8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjEiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRkFROjpFeHBsb3Jlcjo6TGFzdENyZWF0ZTo6TGltaXQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5saW1pdCBvZiBpdGVtczwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5BbnphaGwgZGVyIHp1IGFuemVpZ2VuZGVuIEFydGlrZWw8L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GQVE8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpFeHBsb3JlcjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmc+MzwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KCiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGQVE6OkZBUUhvb2siIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZhdWx0IGhvb2sgZm9yIEZBUS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+U3RhbmRhcmQgQmV6ZWljaG5lciBm/HIgZWluZSBGQVEuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RkFRPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmc+RkFRIzwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KCiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGQVE6OkRlZmF1bHQ6OlN0YXRlIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmYXVsdCBzdGF0ZSBmb3IgRkFRIGVudHJ5LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5TdGFuZGFyZCBTdGF0dXMgZWluZXMgIEZBUS1FaW50cmFncy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GQVE8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZz5pbnRlcm5hbCAoYWdlbnQpPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgoKICAgIDxDb25maWdJdGVtIE5hbWU9IkZBUTo6SXRlbTo6RmllbGQxIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5pdGlvbiBvZiBGQVEgaXRlbSBmcmVlIHRleHQgZmllbGQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVyIGZyZWllbiBUZXh0ZmVsZGVyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZBUTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6Okl0ZW08L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgIDxJdGVtIEtleT0iU2hvdyI+cHVibGljPC9JdGVtPgogICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2FwdGlvbiI+U3ltcHRvbTwvSXRlbT4KICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByaW8iPjEwMDwvSXRlbT4KICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgoKICAgIDxDb25maWdJdGVtIE5hbWU9IkZBUTo6SXRlbTo6RmllbGQyIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5pdGlvbiBvZiBGQVEgaXRlbSBmcmVlIHRleHQgZmllbGQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVyIGZyZWllbiBUZXh0ZmVsZGVyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZBUTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6Okl0ZW08L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgIDxJdGVtIEtleT0iU2hvdyI+cHVibGljPC9JdGVtPgogICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2FwdGlvbiI+UHJvYmxlbTwvSXRlbT4KICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByaW8iPjIwMDwvSXRlbT4KICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgoKICAgIDxDb25maWdJdGVtIE5hbWU9IkZBUTo6SXRlbTo6RmllbGQzIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5pdGlvbiBvZiBGQVEgaXRlbSBmcmVlIHRleHQgZmllbGQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVyIGZyZWllbiBUZXh0ZmVsZGVyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZBUTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6Okl0ZW08L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgIDxJdGVtIEtleT0iU2hvdyI+cHVibGljPC9JdGVtPgogICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2FwdGlvbiI+U29sdXRpb248L0l0ZW0+CiAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmlvIj4zMDA8L0l0ZW0+CiAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KCiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGQVE6Okl0ZW06OkZpZWxkNCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluaXRpb24gb2YgRkFRIGl0ZW0gZnJlZSB0ZXh0IGZpZWxkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlciBmcmVpZW4gVGV4dGZlbGRlci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GQVE8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJdGVtPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICA8SXRlbSBLZXk9IlNob3ciPjwvSXRlbT4KICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNhcHRpb24iPkZpZWxkNDwvSXRlbT4KICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByaW8iPjQwMDwvSXRlbT4KICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgoKICAgIDxDb25maWdJdGVtIE5hbWU9IkZBUTo6SXRlbTo6RmllbGQ1IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5pdGlvbiBvZiBGQVEgaXRlbSBmcmVlIHRleHQgZmllbGQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVyIGZyZWllbiBUZXh0ZmVsZGVyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZBUTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6Okl0ZW08L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgIDxJdGVtIEtleT0iU2hvdyI+PC9JdGVtPgogICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2FwdGlvbiI+RmllbGQ1PC9JdGVtPgogICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJpbyI+NTAwPC9JdGVtPgogICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRkFROjpJdGVtOjpGaWVsZDYiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbml0aW9uIG9mIEZBUSBpdGVtIGZyZWUgdGV4dCBmaWVsZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXIgZnJlaWVuIFRleHRmZWxkZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RkFRPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SXRlbTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJTaG93Ij5pbnRlcm5hbDwvSXRlbT4KICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNhcHRpb24iPkNvbW1lbnQ8L0l0ZW0+CiAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmlvIj42MDA8L0l0ZW0+CiAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KCiAgICA8Q29uZmlnSXRlbSBOYW1lPSJMaW5rT2JqZWN0IyMjRkFRIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+TGluayBvYmplY3Qgc2V0dGluZ3MgZm9yIEZBUS4gT2JqZWN0cyB0aGF0IGFyZSBrbm93biBieSB0aGUgc3lzdGVtLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5MaW5rIE9iamVrdCBFaW5zdGVsbHVuZ2VuIGb8ciBkaWUgRkFRLiBPYmpla3RlLCBkaWUgZGVtIFN5c3RlbSBiZWthbm50IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RkFRPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6TGlua09iamVjdDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj5GQVEgT2JqZWN0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUeXBlIj5PYmplY3Q8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmtPYmplY3RzIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPlRpY2tldDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+RkFRPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRGQVEiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgRkFRIG9iamVjdCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBm/HIgZGFzIEZBUS1PYmpla3QgaW0gQWdlbnQtSW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZBUTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPEdyb3VwPmZhcTwvR3JvdXA+CiAgICAgICAgICAgICAgICA8R3JvdXBSbz5mYXE8L0dyb3VwUm8+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+RkFRLUFyZWE8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+RkFRPC9OYXZCYXJOYW1lPgogICAgICAgICAgICAgICAgPFRpdGxlPkZBUTwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxHcm91cFJvPmZhcTwvR3JvdXBSbz4KICAgICAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+RkFRLUFyZWE8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPk1lbnU8L1R5cGU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPkl0ZW1BcmVhPC9CbG9jaz4KICAgICAgICAgICAgICAgICAgICA8TmFtZT5GQVE8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPEltYWdlPmhlbHAucG5nPC9JbWFnZT4KICAgICAgICAgICAgICAgICAgICA8TGluaz5BY3Rpb249QWdlbnRGQVEmYW1wO05hdj1Ob3JtYWw8L0xpbms+CiAgICAgICAgICAgICAgICAgICAgPE5hdkJhcj5GQVE8L05hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8QWNjZXNzS2V5PnE8L0FjY2Vzc0tleT4KICAgICAgICAgICAgICAgICAgICA8UHJpbz44MzAwPC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXI+CiAgICAgICAgICAgICAgICA8TmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxHcm91cFJvPmZhcTwvR3JvdXBSbz4KICAgICAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+RXhwbG9yZXI8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPkV4cGxvcmVyPC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxJbWFnZT5saXN0LnBuZzwvSW1hZ2U+CiAgICAgICAgICAgICAgICAgICAgPExpbms+QWN0aW9uPUFnZW50RkFRJmFtcDtTdWJhY3Rpb249RXhwbG9yZXI8L0xpbms+CiAgICAgICAgICAgICAgICAgICAgPFR5cGU+PC9UeXBlPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz48L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxOYXZCYXI+RkFRPC9OYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc0tleT5lPC9BY2Nlc3NLZXk+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+MTAwPC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXI+CiAgICAgICAgICAgICAgICA8TmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxHcm91cD5mYXE8L0dyb3VwPgogICAgICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5OZXcgQXJ0aWNsZTwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPE5hbWU+TmV3IEFydGljbGU8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPEltYWdlPm5ldy5wbmc8L0ltYWdlPgogICAgICAgICAgICAgICAgICAgIDxMaW5rPkFjdGlvbj1BZ2VudEZBUSZhbXA7U3ViYWN0aW9uPUFkZDwvTGluaz4KICAgICAgICAgICAgICAgICAgICA8VHlwZT48L1R5cGU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPjwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPE5hdkJhcj5GQVE8L05hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8QWNjZXNzS2V5Pm48L0FjY2Vzc0tleT4KICAgICAgICAgICAgICAgICAgICA8UHJpbz4yMDA8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhcj4KICAgICAgICAgICAgICAgIDxOYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPEdyb3VwUm8+ZmFxPC9Hcm91cFJvPgogICAgICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5GQVEtU2VhcmNoPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgICAgICA8TmFtZT5TZWFyY2g8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPEltYWdlPnNlYXJjaC5wbmc8L0ltYWdlPgogICAgICAgICAgICAgICAgICAgIDxMaW5rPkFjdGlvbj1BZ2VudEZBUSZhbXA7U3ViYWN0aW9uPVNlYXJjaDwvTGluaz4KICAgICAgICAgICAgICAgICAgICA8VHlwZT48L1R5cGU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPjwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPE5hdkJhcj5GQVE8L05hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8QWNjZXNzS2V5PnM8L0FjY2Vzc0tleT4KICAgICAgICAgICAgICAgICAgICA8UHJpbz4zMDA8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhcj4KICAgICAgICAgICAgICAgIDxOYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPEdyb3VwUm8+ZmFxPC9Hcm91cFJvPgogICAgICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5IaXN0b3J5PC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgICAgICA8TmFtZT5IaXN0b3J5PC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxJbWFnZT5oaXN0b3J5LnBuZzwvSW1hZ2U+CiAgICAgICAgICAgICAgICAgICAgPExpbms+QWN0aW9uPUFnZW50RkFRJmFtcDtTdWJhY3Rpb249U3lzdGVtSGlzdG9yeTwvTGluaz4KICAgICAgICAgICAgICAgICAgICA8VHlwZT48L1R5cGU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPjwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPE5hdkJhcj5GQVE8L05hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8QWNjZXNzS2V5Pm88L0FjY2Vzc0tleT4KICAgICAgICAgICAgICAgICAgICA8UHJpbz4zMTA8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhcj4KICAgICAgICAgICAgICAgIDxOYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPEdyb3VwPmZhcTwvR3JvdXA+CiAgICAgICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPkxhbmd1YWdlPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgICAgICA8TmFtZT5MYW5ndWFnZTwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8SW1hZ2U+bGFuZ3VhZ2UucG5nPC9JbWFnZT4KICAgICAgICAgICAgICAgICAgICA8TGluaz5BY3Rpb249QWdlbnRGQVEmYW1wO1N1YmFjdGlvbj1MYW5ndWFnZTwvTGluaz4KICAgICAgICAgICAgICAgICAgICA8VHlwZT48L1R5cGU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPjwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPE5hdkJhcj5GQVE8L05hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8QWNjZXNzS2V5PnU8L0FjY2Vzc0tleT4KICAgICAgICAgICAgICAgICAgICA8UHJpbz45MTA8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhcj4KICAgICAgICAgICAgICAgIDxOYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPEdyb3VwPmZhcTwvR3JvdXA+CiAgICAgICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPkNhdGVnb3J5PC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgICAgICA8TmFtZT5DYXRlZ29yeTwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8SW1hZ2U+Y2F0ZWdvcnkucG5nPC9JbWFnZT4KICAgICAgICAgICAgICAgICAgICA8TGluaz5BY3Rpb249QWdlbnRGQVEmYW1wO1N1YmFjdGlvbj1DYXRlZ29yeTwvTGluaz4KICAgICAgICAgICAgICAgICAgICA8VHlwZT48L1R5cGU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPjwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPE5hdkJhcj5GQVE8L05hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8QWNjZXNzS2V5PmM8L0FjY2Vzc0tleT4KICAgICAgICAgICAgICAgICAgICA8UHJpbz45MjA8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhcj4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDdXN0b21lckZyb250ZW5kOjpNb2R1bGUjIyNDdXN0b21lckZBUSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBDdXN0b21lckZBUSBvYmplY3QgaW4gdGhlIGN1c3RvbWVyIGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RnJvbnRlbmRtb2R1bC1SZWdpc3RyYXRpb24gZvxyIGRhcyBDdXN0b21lckZBUS1PYmpla3QgaW0gQ3VzdG9tZXItSW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZBUTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpDdXN0b21lcjo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPkN1c3RvbWVyIGZhcTwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5GQVE8L05hdkJhck5hbWU+CiAgICAgICAgICAgICAgICA8VGl0bGU+PC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPkZBUS1BcmVhPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgICAgICA8TmFtZT5GQVEtQXJlYTwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8SW1hZ2U+aGVscC5wbmc8L0ltYWdlPgogICAgICAgICAgICAgICAgICAgIDxMaW5rPkFjdGlvbj1DdXN0b21lckZBUTwvTGluaz4KICAgICAgICAgICAgICAgICAgICA8VHlwZT48L1R5cGU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPjwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPE5hdkJhcj48L05hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8QWNjZXNzS2V5PmY8L0FjY2Vzc0tleT4KICAgICAgICAgICAgICAgICAgICA8UHJpbz40MDA8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhcj4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJQdWJsaWNGcm9udGVuZDo6Q29tbW9uUGFyYW0jIyNBY3Rpb24iIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZhdWx0IHZhbHVlIGZvciB0aGUgQWN0aW9uIHBhcmFtZXRlciBmb3IgdGhlIHB1YmxpYyBmcm9udGVuZC4gVGhlIEFjdGlvbiBwYXJhbWV0ZXIgaXMgdXNlZCBpbiB0aGUgc2NyaXB0cyBvZiB0aGUgc3lzdGVtLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5TdGFuZGFyZHdlcnQgZGVzIEFjdGlvbi1QYXJhbWV0ZXJzIGb8ciBkZW4g9mZmZW50bGljaGVuIEZBUS1CZXJlaWNoLiBEZXIgQWN0aW9uLVBhcmFtZXRlciB3aXJkIHZvbiBkZW4gU2tyaXB0ZW4gZGVzIFN5c3RlbXMgYmVudXR6dC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GQVE8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6UHVibGljPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZz5QdWJsaWNGQVE8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJQdWJsaWNGcm9udGVuZDo6TW9kdWxlIyMjUHVibGljRkFRIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIFB1YmxpY0ZBUSBvYmplY3QgaW4gdGhlIHB1YmxpYyBGQVEgYXJlYS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RnJvbnRlbmRtb2R1bC1SZWdpc3RyYXRpb24gZvxyIGRhcyBQdWJsaWNGQVEtT2JqZWt0IGltIPZmZmVudGxpY2hlbiBGQVEtQmVyZWljaC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GQVE8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6UHVibGljOjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+Q3VzdG9tZXIgZmFxPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPkZBUTwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgICAgIDxUaXRsZT48L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+RkFRLUFyZWE8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPkZBUS1BcmVhPC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxJbWFnZT5oZWxwLnBuZzwvSW1hZ2U+CiAgICAgICAgICAgICAgICAgICAgPExpbms+QWN0aW9uPUN1c3RvbWVyRkFRPC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPjwvVHlwZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+PC9CbG9jaz4KICAgICAgICAgICAgICAgICAgICA8TmF2QmFyPjwvTmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NLZXk+ZjwvQWNjZXNzS2V5PgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjQwMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KPC9vdHJzX2NvbmZpZz4K
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS94eF9DdXN0b20ucG0gLSBwcm92aWRlcyB4eCBjdXN0b20gbGFuZ3VhZ2UgdHJhbnNsYXRpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBNYXJ0aW4gRWRlbmhvZmVyIDxtYXJ0aW4rY29kZUBvdHJzLm9yZz4KIyAtLQojICRJZDogZGVfRkFRLnBtLHYgMS4xLjEuMSAyMDA2LzA2LzI5IDA5OjI5OjUxIGN0IEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRlX0ZBUTsKCnVzZSBzdHJpY3Q7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4xLjEuMSAkJzsKJFZFUlNJT04gPX4gcy9eXCQuKjpcVyguKilcVy4rPyQvJDEvOwoKIyAtLQpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyAkJFNUQVJUJCQKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufSA9IHsKICAgICAgICAleyRTZWxmLT57VHJhbnNsYXRpb259fSwKICAgICAgICAKICAgICAgICAjIG93biB0cmFuc2xhdGlvbnMKICAgICAgICAnWW91IGhhdmUgYWxyZWFkeSB2b3RlZCEnID0+ICdTaWUgaGFiZW4gYmVyZWl0cyBiZXdlcnRldCEnLCAgICAgICAgCiAgICAgICAgJ05vIHJhdGUgc2VsZWN0ZWQhJyA9PiAnS2VpbmUgQmV3ZXJ0dW5nIGF1c3fkaGx0IScsICAgICAgICAKICAgICAgICAnVGhhbmtzIGZvciB2b3RlIScgPT4gJ0RhbmtlIGb8ciBJaHJlIEJld2VydHVuZ2VuIScsICAgICAgICAgICAgICAgICAKICAgICAgICBWb3RlcyA9PiAnQmV3ZXJ0dW5nZW4nLAogICAgICAgIExhdGVzdENoYW5nZWRJdGVtcyA9PiAnenVsZXR6dCBnZeRuZGVydGUgQXJ0aWtlbCcsCiAgICAgICAgTGF0ZXN0Q3JlYXRlZEl0ZW1zID0+ICd6dWxldHp0IGVyc3RlbGx0ZSBBcnRpa2VsJywgICAgIAogICAgICAgIEFydGljbGVWb3RpbmdRdWVzdGlvbiA9PiAnV2llIGd1dCB3dXJkZSBtaXQgZGllc2VtIEFydGlrZWwgSWhyZSBGcmFnZSBiZWFudHdvcnRldD8nLCAgIAogICAgICAgIFN1YkNhdGVnb3J5T2YgPT4gJ1VudGVya2F0ZWdvcmllIHZvbicsCiAgICAgICAgUXVpY2tTZWFyY2ggPT4gJ1NjaG5lbGxzdWNoZScsICAgICAgICAgICAgICAgIAogICAgICAgIERldGFpbFNlYXJjaCA9PiAnRGV0YWlsc3VjaGUnLCAKICAgICAgICBDYXRlZ29yaWVzID0+ICdLYXRlZ29yaWVuJywKICAgICAgICBTdWJDYXRlZ29yaWVzID0+ICdTdWJrYXRlZ29yaWVuJywgICAgICAgIAogICAgfTsKCiAgICAjICQkU1RPUCQkCn0KIyAtLQoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS94eF9DdXN0b20ucG0gLSBwcm92aWRlcyB4eCBjdXN0b20gbGFuZ3VhZ2UgdHJhbnNsYXRpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBNYXJ0aW4gRWRlbmhvZmVyIDxtYXJ0aW4rY29kZUBvdHJzLm9yZz4KIyAtLQojICRJZDogZW5fRkFRLnBtLHYgMS4xLjEuMSAyMDA2LzA2LzI5IDA5OjI5OjUxIGN0IEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmVuX0ZBUTsKCnVzZSBzdHJpY3Q7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4xLjEuMSAkJzsKJFZFUlNJT04gPX4gcy9eXCQuKjpcVyguKilcVy4rPyQvJDEvOwoKIyAtLQpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyAkJFNUQVJUJCQKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufSA9IHsKICAgICAgICAleyRTZWxmLT57VHJhbnNsYXRpb259fSwKICAgICAgICAKICAgICAgICAjIG93biB0cmFuc2xhdGlvbnMKICAgICAgICBWb3RlcyA9PiAnVm90ZXMnLCAgICAgICAgCiAgICAgICAgTGF0ZXN0Q2hhbmdlZEl0ZW1zID0+ICdsYXRlc3QgY2hhbmdlZCBhcnRpY2xlJywKICAgICAgICBMYXRlc3RDcmVhdGVkSXRlbXMgPT4gJ2xhdGVzdCBjcmVhdGVkIGFydGljbGUnLCAgICAgCiAgICAgICAgQXJ0aWNsZVZvdGluZ1F1ZXN0aW9uID0+ICdEaWQgdGhpcyBhcnRpY2xlIGhlbHA/JywgCiAgICAgICAgUXVpY2tTZWFyY2ggPT4gJ3F1aWNrIHNlYXJjaCcsICAKICAgICAgICBEZXRhaWxTZWFyY2ggPT4gJ2RldGFpbCBzZWFyY2gnLCAKICAgICAgICAnWW91IGhhdmUgYWxyZWFkeSB2b3RlZCEnID0+ICdZb3UgaGF2ZSBhbHJlYWR5IHZvdGUhJywKICAgICAgICAnTm8gcmF0ZSBzZWxlY3RlZCEnID0+ICdObyByYXRlIHNlbGVjdGVkIScsIAogICAgICAgICdUaGFua3MgZm9yIHZvdGUhJyA9PiAnVGhhbmtzIGZvciB2b3RlIScsCiAgICAgICAgQ2F0ZWdvcmllcyA9PiAnQ2F0ZWdvcmllcycsICAKICAgICAgICBTdWJDYXRlZ29yaWVzID0+ICdzdWJjYXRlZ29yaWVzJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgfTsKCiAgICAjICQkU1RPUCQkCn0KIyAtLQoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0ZBUS5wbSAtIGZhcSBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNiBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogRkFRLnBtLHYgMS40IDIwMDYvMTAvMjUgMTA6MDY6MTkgcmsgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6RkFROwoKdXNlIHN0cmljdDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpVc2VyOwp1c2UgS2VybmVsOjpTeXN0ZW06OkZBUTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0OwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9ICckUmV2aXNpb246IDEuNCAkJzsKJFZFUlNJT04gPX4gcy9eXCQuKjpcVyguKilcVy4rPyQvJDEvOwoKc3ViIG5ldyB7CiAgICBteSAkVHlwZSA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MgKCRTZWxmLCAkVHlwZSk7CgogICAgZm9yZWFjaCAoa2V5cyAlUGFyYW0pIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX307CiAgICB9CgogICAgIyBjaGVjayBuZWVkZWQgT3BqZWN0cwogICAgZm9yZWFjaCAocXcoUGFyYW1PYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBDb25maWdPYmplY3QgVXNlck9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiR290IG5vICRfISIpIGlmICghJFNlbGYtPnskX30pOwogICAgfQoKICAgICMgZmFxIG9iamVjdAogICAgJFNlbGYtPntGQVFPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkZBUS0+bmV3KCVQYXJhbSk7CiAgICAjIGxpbmsgb2JqZWN0CiAgICAkU2VsZi0+e0xpbmtPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QtPm5ldyglUGFyYW0pOwogICAgIyBhZ2VudCB1c2VyCiAgICAkU2VsZi0+e0FnZW50VXNlck9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6VXNlci0+bmV3KCVQYXJhbSk7CgogICAgIyBpbnRlcmZhY2Ugc2V0dGluZ3MKCiAgICAkU2VsZi0+e0ludGVyZmFjZX0gPSAkU2VsZi0+e0ZBUU9iamVjdH0tPlN0YXRlVHlwZUdldCgKICAgICAgICBOYW1lID0+ICdwdWJsaWMnCiAgICApOwogICAgJFNlbGYtPntJbnRlcmZhY2VTdGF0ZXN9ID0gJFNlbGYtPntGQVFPYmplY3R9LT5TdGF0ZVR5cGVMaXN0KAogICAgICAgIFR5cGVzID0+IFsncHVibGljJ10KICAgICk7CgogICAgIyBnbG9iYWwgb3V0cHV0IHZhcnMKICAgICRTZWxmLT57Tm90aWZ5fSA9IFtdOwoKICAgICMgc3RvcmUgbGFzdCBzY3JlZW4KICAgIGlmKCRTZWxmLT57U2Vzc2lvbk9iamVjdH0pIHsKICAgICAgICBpZigkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0V4cGxvcmVyJykgewogICAgICAgICAgICAkU2VsZi0+e1Nlc3Npb25PYmplY3R9LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgICAgICAgICAgS2V5ID0+ICdMYXN0U2NyZWVuT3ZlcnZpZXcnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntSZXF1ZXN0ZWRVUkx9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPntTZXNzaW9uT2JqZWN0fS0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgICAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICAgICAgICAgIEtleSA9PiAnTGFzdFNjcmVlblZpZXcnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntSZXF1ZXN0ZWRVUkx9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIEdldEV4cGxvcmVyIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICVGcm9udGVuZCA9ICgpOwogICAgbXkgJUdldFBhcmFtID0gKCk7CiAgICBteSBAUGFyYW1zID0gcXcoT3JkZXIgU29ydCk7CgogICAgIyBtYW5hZ2UgcGFyYW1ldGVycwogICAgJEdldFBhcmFte0NhdGVnb3J5SUR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdDYXRlZ29yeUlEJykgfHwgMDsKICAgICRHZXRQYXJhbXtPcmRlcn0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJ09yZGVyJykgfHwgJ1RpdGxlJzsKICAgICRHZXRQYXJhbXtTb3J0fSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnU29ydCcpIHx8ICd1cCc7CiAgICBmb3JlYWNoIChAUGFyYW1zKSB7CiAgICAgICAgaWYoISRHZXRQYXJhbXskX30gJiYgISgkR2V0UGFyYW17JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICRfKSkpIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcihNZXNzYWdlID0+ICJOZWVkIHBhcmFtZXRlciAkXyIpOwogICAgICAgIH0KICAgIH0KICAgICMgc3RvcmUgYmFjayBsaW5rCiAgICBpZigkU2VsZi0+e1Nlc3Npb25PYmplY3R9KSB7CiAgICAgICAgJFNlbGYtPntTZXNzaW9uT2JqZWN0fS0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgICAgICBLZXkgPT4gJ0xhc3RTY3JlZW5WaWV3JywKICAgICAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntSZXF1ZXN0ZWRVUkx9LAogICAgICAgICk7CiAgICB9CiAgICAjIGRiIGFjdGlvbgogICAgbXkgJUNhdGVnb3J5RGF0YSA9ICgpOwogICAgaWYoJEdldFBhcmFte0NhdGVnb3J5SUR9KSB7CiAgICAgICAgJUNhdGVnb3J5RGF0YSA9ICRTZWxmLT57RkFRT2JqZWN0fS0+Q2F0ZWdvcnlHZXQoQ2F0ZWdvcnlJRCA9PiAkR2V0UGFyYW17Q2F0ZWdvcnlJRH0sIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0pOwogICAgICAgIGlmICghJUNhdGVnb3J5RGF0YSkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgICAgIH0KICAgIH0KICAgICMgZHRsIGJsb2NrCiAgICAkRnJvbnRlbmR7TGFzdFNjcmVlbk92ZXJ2aWV3fSA9ICRTZWxmLT57UmVxdWVzdGVkVVJMfTsKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnRXhwbG9yZXInLAogICAgICAgIERhdGEgPT4geyAlQ2F0ZWdvcnlEYXRhLCAlRnJvbnRlbmQgfSwKICAgICk7CiAgICAjIEZBUSBwYXRoCiAgICAkU2VsZi0+X0dldEZBUVBhdGgoCiAgICAgICAgQ2F0ZWdvcnlJRCA9PiAkR2V0UGFyYW17Q2F0ZWdvcnlJRH0sCiAgICApOwogICAgIyBleHBsb3JlciB0aXRsZQogICAgaWYoJEdldFBhcmFte0NhdGVnb3J5SUR9KSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRXhwbG9yZXJUaXRsZScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAnTmFtZScgPT4gJENhdGVnb3J5RGF0YXtOYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbW1lbnQnID0+ICRDYXRlZ29yeURhdGF7Q29tbWVudH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdFeHBsb3JlclRpdGxlJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICdOYW1lJyA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRkFROjpEZWZhdWx0OjpSb290Q2F0ZWdvcnlOYW1lJyksCiAgICAgICAgICAgICAgICAgICAgICAgICdDb21tZW50JyA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRkFROjpEZWZhdWx0OjpSb290Q2F0ZWdvcnlDb21tZW50JykKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CiAgICAjIGV4cGxvcmVyIGNhdGVnb3J5IGxpc3QKICAgICRTZWxmLT5fR2V0RXhwbG9yZXJDYXRlZ29yeUxpc3QoCiAgICAgICAgQ2F0ZWdvcnlJRCA9PiAkR2V0UGFyYW17Q2F0ZWdvcnlJRH0sCiAgICAgICAgT3JkZXIgPT4gJ05hbWUnLAogICAgICAgIFNvcnQgPT4gJ3VwJwogICAgKTsKICAgICMgZXhwbG9yZXIgaXRlbSBsaXN0CiAgICAkU2VsZi0+X0dldEV4cGxvcmVySXRlbUxpc3QoCiAgICAgICAgQ2F0ZWdvcnlJRCA9PiAkR2V0UGFyYW17Q2F0ZWdvcnlJRH0sCiAgICAgICAgT3JkZXIgPT4gJEdldFBhcmFte09yZGVyfSB8fCAnVGl0bGUnLAogICAgICAgIFNvcnQgPT4gJEdldFBhcmFte1NvcnR9IHx8ICd1cCcKICAgICk7CiAgICAjIHF1aWNrc2VhcmNoCiAgICBteSAlU2hvd1F1aWNrU2VhcmNoID0gJXskU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRkFROjpFeHBsb3Jlcjo6UXVpY2tTZWFyY2g6OlNob3cnKX07CiAgICBpZiAoZXhpc3RzKCRTaG93UXVpY2tTZWFyY2h7JFNlbGYtPntJbnRlcmZhY2V9e05hbWV9fSkpIHsKICAgICAgICAkU2VsZi0+X0dldEV4cGxvcmVyUXVpY2tTZWFyY2goCiAgICAgICAgICAgIENhdGVnb3J5SUQgPT4gJEdldFBhcmFte0NhdGVnb3J5SUR9LAogICAgICAgICk7CiAgICB9CiAgICAjIGxhdGVzdCBjaGFuZ2UgZmFxIGl0ZW1zCiAgICBteSAlU2hvd0xhc3RDaGFuZ2UgPSAleyRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGQVE6OkV4cGxvcmVyOjpMYXN0Q2hhbmdlOjpTaG93Jyl9OwogICAgaWYgKGV4aXN0cygkU2hvd0xhc3RDaGFuZ2V7JFNlbGYtPntJbnRlcmZhY2V9e05hbWV9fSkpIHsKICAgICAgICAkU2VsZi0+X0dldEV4cGxvcmVyTGFzdENoYW5nZUl0ZW1zKAogICAgICAgICAgICBDYXRlZ29yeUlEID0+ICRHZXRQYXJhbXtDYXRlZ29yeUlEfSwKICAgICAgICApOwogICAgfQogICAgIyBsYXRlc3QgY3JlYXRlIGZhcSBpdGVtcwogICAgbXkgJVNob3dMYXN0Q3JlYXRlID0gJXskU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRkFROjpFeHBsb3Jlcjo6TGFzdENyZWF0ZTo6U2hvdycpfTsKICAgIGlmIChleGlzdHMoJFNob3dMYXN0Q3JlYXRleyRTZWxmLT57SW50ZXJmYWNlfXtOYW1lfX0pKSB7CiAgICAgICAgJFNlbGYtPl9HZXRFeHBsb3Jlckxhc3RDcmVhdGVJdGVtcygKICAgICAgICAgICAgQ2F0ZWdvcnlJRCA9PiAkR2V0UGFyYW17Q2F0ZWdvcnlJRH0sCiAgICAgICAgKTsKICAgIH0KfQoKc3ViIF9HZXRGQVFQYXRoIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0ZBUVBhdGhDYXRlZ29yeUVsZW1lbnQnLAogICAgICAgIERhdGEgPT4geyAnTmFtZScgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ZBUTo6RGVmYXVsdDo6Um9vdENhdGVnb3J5TmFtZScpLAogICAgICAgICAgICAgICAgICAnQ2F0ZWdvcnlJRCcgPT4gJzAnCiAgICAgICAgICAgICAgICB9LAogICAgKTsKCiAgICBpZigkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRkFROjpFeHBsb3Jlcjo6UGF0aDo6U2hvdycpKSB7CiAgICAgICAgbXkgQENhdGVnb3J5TGlzdCA9IEB7JFNlbGYtPntGQVFPYmplY3R9LT5GQVFQYXRoTGlzdEdldChDYXRlZ29yeUlEID0+ICRQYXJhbXtDYXRlZ29yeUlEfSl9OwogICAgICAgIGZvcmVhY2ggbXkgJERhdGEgKEBDYXRlZ29yeUxpc3QpIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0ZBUVBhdGhDYXRlZ29yeUVsZW1lbnQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICV7JERhdGF9IH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAxOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCnN1YiBfR2V0RXhwbG9yZXJDYXRlZ29yeUxpc3QgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJUZyb250ZW5kID0gKCk7CiAgICAkRnJvbnRlbmR7Q3NzUm93fSA9ICcnOwoKICAgICMgY2hlY2sgbmVlZGVkIHBhcmFtZXRlcnMKICAgIGZvcmVhY2ggKHF3KE9yZGVyIFNvcnQpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcihNZXNzYWdlID0+ICJOZWVkIHBhcmFtZXRlciAkXyEiKQogICAgICAgIH0KICAgIH0KICAgIG15IEBDYXRlZ29yeUlEcyA9IEB7JFNlbGYtPntGQVFPYmplY3R9LT5DYXRlZ29yeVNlYXJjaCgKICAgICAgICBQYXJlbnRJRCA9PiAkUGFyYW17Q2F0ZWdvcnlJRH0sCiAgICAgICAgT3JkZXIgPT4gJFBhcmFte09yZGVyfSwKICAgICAgICBTb3J0ID0+ICRQYXJhbXtTb3J0fQogICAgKX07CgogICAgaWYoQENhdGVnb3J5SURzKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRXhwbG9yZXJDYXRlZ29yeUxpc3QnLAogICAgICAgICk7CiAgICAgICAgZm9yZWFjaCAoQENhdGVnb3J5SURzKSB7CiAgICAgICAgICAgIG15ICVEYXRhID0gJFNlbGYtPntGQVFPYmplY3R9LT5DYXRlZ29yeUdldChDYXRlZ29yeUlEID0+ICRfKTsKICAgICAgICAgICAgJERhdGF7Q2F0ZWdvcnlOdW1iZXJ9ID0gJFNlbGYtPntGQVFPYmplY3R9LT5DYXRlZ29yeUNvdW50KAogICAgICAgICAgICAgICAgUGFyZW50SURzID0+IFskX10KICAgICAgICAgICAgKTsKICAgICAgICAgICAgJERhdGF7QXJ0aWNsZU51bWJlcn0gPSAkU2VsZi0+e0ZBUU9iamVjdH0tPkZBUUNvdW50KAogICAgICAgICAgICAgICAgQ2F0ZWdvcnlJRHMgPT4gWyRfXSwKICAgICAgICAgICAgICAgIEl0ZW1TdGF0ZXMgPT4gJFNlbGYtPntJbnRlcmZhY2VTdGF0ZXN9CiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNzcyBjb25maWd1cmF0aW9uCiAgICAgICAgICAgIGlmKCRGcm9udGVuZHtDc3NSb3d9IGVxICdzZWFyY2hwYXNzaXZlJykgewogICAgICAgICAgICAgICAgJEZyb250ZW5ke0Nzc1Jvd30gPSAnc2VhcmNoYWN0aXZlJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRGcm9udGVuZHtDc3NSb3d9ID0gJ3NlYXJjaHBhc3NpdmUnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdFeHBsb3JlckNhdGVnb3J5Um93JywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlRGF0YSwgJUZyb250ZW5kIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuOwp9CgpzdWIgX0dldEV4cGxvcmVySXRlbUxpc3QgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHBhcmFtZXRlcnMKICAgIGZvcmVhY2ggKHF3KE9yZGVyIFNvcnQpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcihNZXNzYWdlID0+ICJOZWVkIHBhcmFtZXRlciAkXyEiKQogICAgICAgIH0KICAgIH0KCiAgICBteSAkQ3NzUm93ID0gJyc7CiAgICBteSBASXRlbUlEcyA9ICRTZWxmLT57RkFRT2JqZWN0fS0+RkFRU2VhcmNoKAogICAgICAgIENhdGVnb3J5SURzID0+IFskUGFyYW17Q2F0ZWdvcnlJRH1dLAogICAgICAgIFN0YXRlcyA9PiAkU2VsZi0+e0ludGVyZmFjZVN0YXRlc30sCiAgICAgICAgT3JkZXIgPT4gJFBhcmFte09yZGVyfSwKICAgICAgICBTb3J0ID0+ICRQYXJhbXtTb3J0fSwKICAgICAgICBMaW1pdCA9PiAzMDAsCiAgICApOwoKICAgIGlmIChASXRlbUlEcykgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0V4cGxvcmVyRkFRSXRlbUxpc3QnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19CiAgICAgICAgKTsKICAgICAgICBmb3JlYWNoIChASXRlbUlEcykgewogICAgICAgICAgICBteSAlRnJvbnRlbmQgPSAoKTsKICAgICAgICAgICAgbXkgJURhdGEgPSAkU2VsZi0+e0ZBUU9iamVjdH0tPkZBUUdldChJdGVtSUQgPT4gJF8pOwoKICAgICAgICAgICAgIyBjc3MgY29uZmlndXJhdGlvbgogICAgICAgICAgICBpZigkQ3NzUm93IGVxICdzZWFyY2hwYXNzaXZlJykgewogICAgICAgICAgICAgICAgJENzc1JvdyA9ICdzZWFyY2hhY3RpdmUnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJENzc1JvdyA9ICdzZWFyY2hwYXNzaXZlJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkRnJvbnRlbmR7Q3NzUm93fSA9ICRDc3NSb3c7CiAgICAgICAgICAgICRGcm9udGVuZHtDc3NDb2x1bW5Wb3RpbmdSZXN1bHR9ID0gJ2NvbG9yOicuJFNlbGYtPntMYXlvdXRPYmplY3R9LT5HZXRGQVFJdGVtVm90aW5nUmF0ZUNvbG9yKFJhdGUgPT4gJERhdGF7UmVzdWx0fSkuJzsnOwoKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0V4cGxvcmVyRkFRSXRlbVJvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJURhdGEsICVGcm9udGVuZCB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybjsKfQoKc3ViIF9HZXRFeHBsb3Jlckxhc3RDaGFuZ2VJdGVtcyB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgaWYoJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ZBUTo6RXhwbG9yZXI6Okxhc3RDaGFuZ2U6OlNob3cnKSkgewogICAgICAgICMgY2hlY2sgbmVlZGVkIHBhcmFtZXRlcnMKICAgICAgICBmb3JlYWNoIChxdyhDYXRlZ29yeUlEKSkgewogICAgICAgICAgICBpZiAoIWRlZmluZWQoJFBhcmFteyRffSkpIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcihNZXNzYWdlID0+ICJOZWVkIHBhcmFtZXRlciAkXyEiKQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG15IEBJdGVtSURzID0gKCk7CiAgICAgICAgaWYoJFBhcmFte0NhdGVnb3J5SUR9KSB7CiAgICAgICAgICAgICMgYWRkIGN1cnJlbnQgY2F0ZWdvcnlpZAogICAgICAgICAgICBteSBAQ2F0ZWdvcnlJRHMgPSAoKTsKICAgICAgICAgICAgaWYoJFBhcmFte0NhdGVnb3J5SUR9KSB7CiAgICAgICAgICAgICAgICBwdXNoKEBDYXRlZ29yeUlEcywgKCRQYXJhbXtDYXRlZ29yeUlEfSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICMgYWRkIHN1YmNhdGVnb3J5aWRzCiAgICAgICAgICAgIGlmKCRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGQVE6OkV4cGxvcmVyOjpMYXN0Q2hhbmdlOjpTaG93U3ViQ2F0ZWdvcnlJdGVtcycpKSB7CiAgICAgICAgICAgICAgICBteSBAU3ViQ2F0ZWdvcnlJRHMgPSBAeyRTZWxmLT57RkFRT2JqZWN0fS0+Q2F0ZWdvcnlTdWJDYXRlZ29yeUlETGlzdCgKICAgICAgICAgICAgICAgICAgICBQYXJlbnRJRCA9PiAkUGFyYW17Q2F0ZWdvcnlJRH0sCiAgICAgICAgICAgICAgICAgICAgSXRlbVN0YXRlcyA9PiAkU2VsZi0+e0ludGVyZmFjZVN0YXRlc30sCiAgICAgICAgICAgICAgICApfTsKICAgICAgICAgICAgICAgIHB1c2goQENhdGVnb3J5SURzLCBAU3ViQ2F0ZWdvcnlJRHMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdFeHBsb3JlckxhdGVzdENoYW5nZScKICAgICAgICAgICAgKTsKICAgICAgICAgICAgQEl0ZW1JRHMgPSAkU2VsZi0+e0ZBUU9iamVjdH0tPkZBUVNlYXJjaCgKICAgICAgICAgICAgICAgIENhdGVnb3J5SURzID0+IFxAQ2F0ZWdvcnlJRHMsCiAgICAgICAgICAgICAgICBTdGF0ZXMgPT4gJFNlbGYtPntJbnRlcmZhY2VTdGF0ZXN9LAogICAgICAgICAgICAgICAgT3JkZXIgPT4gJ0NoYW5nZWQnLAogICAgICAgICAgICAgICAgU29ydCA9PiAnZG93bicsCiAgICAgICAgICAgICAgICBMaW1pdCA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRkFROjpFeHBsb3Jlcjo6TGFzdENoYW5nZTo6TGltaXQnKQogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0V4cGxvcmVyTGF0ZXN0Q2hhbmdlJwogICAgICAgICAgICApOwogICAgICAgICAgICBASXRlbUlEcyA9ICRTZWxmLT57RkFRT2JqZWN0fS0+RkFRU2VhcmNoKAogICAgICAgICAgICAgICAgU3RhdGVzID0+ICRTZWxmLT57SW50ZXJmYWNlU3RhdGVzfSwKICAgICAgICAgICAgICAgIE9yZGVyID0+ICdDaGFuZ2VkJywKICAgICAgICAgICAgICAgIFNvcnQgPT4gJ2Rvd24nLAogICAgICAgICAgICAgICAgTGltaXQgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ZBUTo6RXhwbG9yZXI6Okxhc3RDaGFuZ2U6OkxpbWl0JykKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZm9yZWFjaCAoQEl0ZW1JRHMpIHsKICAgICAgICAgICAgbXkgJURhdGEgPSAkU2VsZi0+e0ZBUU9iamVjdH0tPkZBUUdldChJdGVtSUQgPT4gJF8pOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRXhwbG9yZXJMYXRlc3RDaGFuZ2VGQVFJdGVtUm93JywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlRGF0YSB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gMTsKICAgIH0KICAgIHJldHVybiAwOwp9CgpzdWIgX0dldEV4cGxvcmVyTGFzdENyZWF0ZUl0ZW1zIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICBpZigkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRkFROjpFeHBsb3Jlcjo6TGFzdENyZWF0ZTo6U2hvdycpKSB7CiAgICAgICAgIyBjaGVjayBuZWVkZWQgcGFyYW1ldGVycwogICAgICAgIGZvcmVhY2ggKHF3KENhdGVnb3J5SUQpKSB7CiAgICAgICAgICAgIGlmICghZGVmaW5lZCgkUGFyYW17JF99KSkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKE1lc3NhZ2UgPT4gIk5lZWQgcGFyYW1ldGVyICRfISIpCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbXkgQEl0ZW1JRHMgPSAoKTsKICAgICAgICBpZigkUGFyYW17Q2F0ZWdvcnlJRH0pIHsKICAgICAgICAgICAgIyBhZGQgY3VycmVudCBjYXRlZ29yeWlkCiAgICAgICAgICAgIG15IEBDYXRlZ29yeUlEcyA9ICgpOwogICAgICAgICAgICBpZigkUGFyYW17Q2F0ZWdvcnlJRH0pIHsKICAgICAgICAgICAgICAgIHB1c2goQENhdGVnb3J5SURzLCAoJFBhcmFte0NhdGVnb3J5SUR9KSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgIyBhZGQgc3ViY2F0ZWdvcnlpZHMKICAgICAgICAgICAgaWYoJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ZBUTo6RXhwbG9yZXI6Okxhc3RDcmVhdGU6OlNob3dTdWJDYXRlZ29yeUl0ZW1zJykpIHsKICAgICAgICAgICAgICAgIG15IEBTdWJDYXRlZ29yeUlEcyA9IEB7JFNlbGYtPntGQVFPYmplY3R9LT5DYXRlZ29yeVN1YkNhdGVnb3J5SURMaXN0KAogICAgICAgICAgICAgICAgICAgIFBhcmVudElEID0+ICRQYXJhbXtDYXRlZ29yeUlEfSwKICAgICAgICAgICAgICAgICAgICBJdGVtU3RhdGVzID0+ICRTZWxmLT57SW50ZXJmYWNlU3RhdGVzfSwKICAgICAgICAgICAgICAgICl9OwogICAgICAgICAgICAgICAgcHVzaChAQ2F0ZWdvcnlJRHMsIEBTdWJDYXRlZ29yeUlEcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0V4cGxvcmVyTGF0ZXN0Q3JlYXRlJwogICAgICAgICAgICApOwogICAgICAgICAgICBASXRlbUlEcyA9ICRTZWxmLT57RkFRT2JqZWN0fS0+RkFRU2VhcmNoKAogICAgICAgICAgICAgICAgQ2F0ZWdvcnlJRHMgPT4gXEBDYXRlZ29yeUlEcywKICAgICAgICAgICAgICAgIFN0YXRlcyA9PiAkU2VsZi0+e0ludGVyZmFjZVN0YXRlc30sCiAgICAgICAgICAgICAgICBPcmRlciA9PiAnQ3JlYXRlZCcsCiAgICAgICAgICAgICAgICBTb3J0ID0+ICdkb3duJywKICAgICAgICAgICAgICAgIExpbWl0ID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGQVE6OkV4cGxvcmVyOjpMYXN0Q3JlYXRlOjpMaW1pdCcpCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRXhwbG9yZXJMYXRlc3RDcmVhdGUnCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIEBJdGVtSURzID0gJFNlbGYtPntGQVFPYmplY3R9LT5GQVFTZWFyY2goCiAgICAgICAgICAgICAgICBTdGF0ZXMgPT4gJFNlbGYtPntJbnRlcmZhY2VTdGF0ZXN9LAogICAgICAgICAgICAgICAgT3JkZXIgPT4gJ0NyZWF0ZWQnLAogICAgICAgICAgICAgICAgU29ydCA9PiAnZG93bicsCiAgICAgICAgICAgICAgICBMaW1pdCA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRkFROjpFeHBsb3Jlcjo6TGFzdENyZWF0ZTo6TGltaXQnKQogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAjIGR0bCBibG9jawogICAgICAgIGZvcmVhY2ggKEBJdGVtSURzKSB7CiAgICAgICAgICAgIG15ICVEYXRhID0gJFNlbGYtPntGQVFPYmplY3R9LT5GQVFHZXQoSXRlbUlEID0+ICRfKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0V4cGxvcmVyTGF0ZXN0Q3JlYXRlRkFRSXRlbVJvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJURhdGEgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKc3ViIF9HZXRFeHBsb3JlclF1aWNrU2VhcmNoIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICBpZigkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRkFROjpFeHBsb3Jlcjo6UXVpY2tTZWFyY2g6OlNob3cnKSkgewogICAgICAgICMgY2hlY2sgbmVlZGVkIHBhcmFtZXRlcnMKICAgICAgICBmb3JlYWNoIChxdygpKSB7CiAgICAgICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKE1lc3NhZ2UgPT4gIk5lZWQgcGFyYW1ldGVyICRfISIpCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgIyBkdGwgYmxvY2sKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdFeHBsb3JlclF1aWNrU2VhcmNoJywKICAgICAgICAgICAgRGF0YSA9PiB7IENhdGVnb3J5SUQgPT4gJFBhcmFte0NhdGVnb3J5SUR9IH0KICAgICAgICApOwogICAgICAgIHJldHVybiAxOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCnN1YiBHZXRJdGVtVmlldyB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAlRnJvbnRlbmQgPSAoKTsKICAgIG15ICVHZXRQYXJhbSA9ICgpOwogICAgbXkgQFBhcmFtcyA9IHF3KEl0ZW1JRCk7CgogICAgIyBtYW5hZ2UgcGFyYW1ldGVycwogICAgZm9yZWFjaCAoQFBhcmFtcykgewogICAgICAgIGlmICghKCRHZXRQYXJhbXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJF8pKSkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiTmVlZCBwYXJhbWV0ZXIgJF8iKTsKICAgICAgICB9CiAgICB9CiAgICAjIGRiIGFjdGlvbgogICAgbXkgJUl0ZW1EYXRhID0gJFNlbGYtPntGQVFPYmplY3R9LT5GQVFHZXQoSXRlbUlEID0+ICRHZXRQYXJhbXtJdGVtSUR9LCBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9KTsKICAgICMgaHRtbCBxdW90aW5nCiAgICBmb3JlYWNoIG15ICRLZXkgKHF3IChGaWVsZDEgRmllbGQyIEZpZWxkMyBGaWVsZDQgRmllbGQ1IEZpZWxkNikpIHsKICAgICAgICAkSXRlbURhdGF7JEtleX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoCiAgICAgICAgICAgIE5ld0xpbmUgPT4gNzAsCiAgICAgICAgICAgIFRleHQgPT4gJEl0ZW1EYXRheyRLZXl9LAogICAgICAgICAgICBWTWF4ID0+IDUwMDAsCiAgICAgICAgICAgIEhUTUxSZXN1bHRNb2RlID0+IDEsCiAgICAgICAgICAgIExpbmtGZWF0dXJlID0+IDEsCiAgICAgICAgKTsKICAgIH0KICAgIGlmICghJUl0ZW1EYXRhKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKTsKICAgIH0KICAgICMgcGVybWlzc2lvbiBjaGVjawogICAgaWYgKCFleGlzdHMoJFNlbGYtPntJbnRlcmZhY2VTdGF0ZXN9eyRJdGVtRGF0YXtTdGF0ZVR5cGVJRH19KSkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbihXaXRoSGVhZGVyID0+ICd5ZXMnKTsKICAgIH0KICAgICMgdXNlciBpbmZvCiAgICBteSAlVXNlckluZm8gPSAkU2VsZi0+e0FnZW50VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgIFVzZXJJRCA9PiAkSXRlbURhdGF7Q3JlYXRlZEJ5fSwKICAgICk7CiAgICAkRnJvbnRlbmR7Q3JlYXRlZEJ5TG9naW59ID0gJFVzZXJJbmZve1VzZXJMb2dpbn07CiAgICAlVXNlckluZm8gPSAkU2VsZi0+e0FnZW50VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgIFVzZXJJRCA9PiAkSXRlbURhdGF7Q2hhbmdlZEJ5fSwKICAgICk7CiAgICAkRnJvbnRlbmR7Q2hhbmdlZEJ5TG9naW59ID0gJFVzZXJJbmZve1VzZXJMb2dpbn07CiAgICAjIGl0ZW0gdmlldwogICAgJEZyb250ZW5ke0Nzc0NvbHVtblZvdGluZ1Jlc3VsdH0gPSAnY29sb3I6Jy4kU2VsZi0+e0xheW91dE9iamVjdH0tPkdldEZBUUl0ZW1Wb3RpbmdSYXRlQ29sb3IoUmF0ZSA9PiAkSXRlbURhdGF7UmVzdWx0fSkuJzsnOwogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdWaWV3JywKICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlSXRlbURhdGEsICVGcm9udGVuZCB9LAogICAgKTsKICAgICMgRkFRIHBhdGgKICAgIGlmICgkU2VsZi0+X0dldEZBUVBhdGgoQ2F0ZWdvcnlJRCA9PiAkSXRlbURhdGF7Q2F0ZWdvcnlJRH0pKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRkFRUGF0aEl0ZW1FbGVtZW50JywKICAgICAgICAgICAgRGF0YSA9PiBcJUl0ZW1EYXRhLAogICAgICAgICk7CiAgICB9CiAgICAjIGl0ZW0gYXR0YWNobWVudAogICAgaWYgKGRlZmluZWQoJEl0ZW1EYXRhe0ZpbGVuYW1lfSkpIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdGQVFJdGVtVmlld0F0dGFjaG1lbnQnLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlSXRlbURhdGEgfSwKICAgICAgICApOwogICAgfQogICAgIyBpdGVtIGZpZWxkcwogICAgJFNlbGYtPl9HZXRJdGVtRmllbGRzKAogICAgICAgIEl0ZW1EYXRhID0+IFwlSXRlbURhdGEKICAgICk7CiAgICAjIGl0ZW0gdm90aW5nCiAgICBteSAlU2hvd0l0ZW1Wb3RpbmcgPSAleyRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGQVE6Okl0ZW06OlZvdGluZzo6U2hvdycpfTsKICAgIGlmIChleGlzdHMoJFNob3dJdGVtVm90aW5neyRTZWxmLT57SW50ZXJmYWNlfXtOYW1lfX0pKSB7CiAgICAgICAgJFNlbGYtPl9HZXRJdGVtVm90aW5nKAogICAgICAgICAgICBJdGVtRGF0YSA9PiBcJUl0ZW1EYXRhCiAgICAgICAgKTsKICAgIH0KICAgIGlmICgkUGFyYW17TGlua3N9ICYmICRQYXJhbXtMaW5rc30gPT0gMSkgewogICAgICAgICMgZ2V0IGxpbmtlZCBvYmplY3RzCiAgICAgICAgbXkgJUxpbmtzID0gJFNlbGYtPntMaW5rT2JqZWN0fS0+QWxsTGlua2VkT2JqZWN0cygKICAgICAgICAgICAgT2JqZWN0ID0+ICdGQVEnLAogICAgICAgICAgICBPYmplY3RJRCA9PiAkSXRlbURhdGF7SXRlbUlEfSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gIkxpbmtzIiwKICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICApOwogICAgICAgIGZvcmVhY2ggbXkgJExpbmtUeXBlIChzb3J0IGtleXMgJUxpbmtzKSB7CiAgICAgICAgICAgIG15ICVPYmplY3RUeXBlID0gJXskTGlua3N7JExpbmtUeXBlfX07CiAgICAgICAgICAgIGZvcmVhY2ggbXkgJE9iamVjdCAoc29ydCBrZXlzICVPYmplY3RUeXBlKSB7CiAgICAgICAgICAgICAgICBteSAlRGF0YSA9ICV7JE9iamVjdFR5cGV7JE9iamVjdH19OwogICAgICAgICAgICAgICAgZm9yZWFjaCBteSAkSXRlbSAoc29ydCBrZXlzICVEYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAiTGluayRMaW5rVHlwZSIsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJERhdGF7JEl0ZW19LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm47Cn0KCnN1YiBHZXRJdGVtU21hbGxWaWV3IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICVGcm9udGVuZCA9ICgpOwogICAgbXkgJUdldFBhcmFtID0gKCk7CiAgICBteSBAUGFyYW1zID0gcXcoSXRlbUlEKTsKCiAgICAjIG1hbmFnZSBwYXJhbWV0ZXJzCiAgICBmb3JlYWNoIChAUGFyYW1zKSB7CiAgICAgICAgaWYgKCEoJEdldFBhcmFteyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAkXykpKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcihNZXNzYWdlID0+ICJOZWVkIHBhcmFtZXRlciAkXyIpOwogICAgICAgIH0KICAgIH0KICAgICMgZGIgYWN0aW9uCiAgICBteSAlSXRlbURhdGEgPSAkU2VsZi0+e0ZBUU9iamVjdH0tPkZBUUdldChJdGVtSUQgPT4gJEdldFBhcmFte0l0ZW1JRH0sIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0pOwogICAgaWYgKCElSXRlbURhdGEpIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgfQogICAgIyBwZXJtaXNzaW9uIGNoZWNrCiAgICBpZighZXhpc3RzKCRTZWxmLT57SW50ZXJmYWNlU3RhdGVzfXskSXRlbURhdGF7U3RhdGVUeXBlSUR9fSkpIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oV2l0aEhlYWRlciA9PiAneWVzJyk7CiAgICB9CiAgICAjIHVzZXIgaW5mbwogICAgbXkgJVVzZXJJbmZvID0gJFNlbGYtPntBZ2VudFVzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICBVc2VySUQgPT4gJEl0ZW1EYXRhe0NyZWF0ZWRCeX0sCiAgICApOwogICAgJEZyb250ZW5ke0NyZWF0ZWRCeUxvZ2lufSA9ICRVc2VySW5mb3tVc2VyTG9naW59OwogICAgJVVzZXJJbmZvID0gJFNlbGYtPntBZ2VudFVzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICBVc2VySUQgPT4gJEl0ZW1EYXRhe0NoYW5nZWRCeX0sCiAgICApOwogICAgJEZyb250ZW5ke0NoYW5nZWRCeUxvZ2lufSA9ICRVc2VySW5mb3tVc2VyTG9naW59OwogICAgIyBpdGVtIHZpZXcKICAgICRGcm9udGVuZHtDc3NDb2x1bW5Wb3RpbmdSZXN1bHR9ID0gJ2NvbG9yOicuJFNlbGYtPntMYXlvdXRPYmplY3R9LT5HZXRGQVFJdGVtVm90aW5nUmF0ZUNvbG9yKFJhdGUgPT4gJEl0ZW1EYXRhe1Jlc3VsdH0pLic7JzsKICAgICRGcm9udGVuZHtJdGVtRmllbGRWYWx1ZXN9ID0gJFNlbGYtPl9HZXRJdGVtRmllbGRWYWx1ZXMoSXRlbURhdGEgPT4gXCVJdGVtRGF0YSk7CiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ1ZpZXdTbWFsbCcsCiAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUl0ZW1EYXRhLCAlRnJvbnRlbmQgfSwKICAgICk7CiAgICAjIEZBUSBwYXRoCiAgICBpZiAoJFNlbGYtPl9HZXRGQVFQYXRoKENhdGVnb3J5SUQgPT4gJEl0ZW1EYXRhe0NhdGVnb3J5SUR9KSkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0ZBUVBhdGhJdGVtRWxlbWVudCcsCiAgICAgICAgICAgIERhdGEgPT4gXCVJdGVtRGF0YSwKICAgICAgICApOwogICAgfQogICAgIyBnZXQgbGlua2VkIG9iamVjdHMKICAgIG15ICVMaW5rcyA9ICRTZWxmLT57TGlua09iamVjdH0tPkFsbExpbmtlZE9iamVjdHMoCiAgICAgICAgT2JqZWN0ID0+ICdGQVEnLAogICAgICAgIE9iamVjdElEID0+ICRJdGVtRGF0YXtJdGVtSUR9LAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwogICAgZm9yZWFjaCBteSAkTGlua1R5cGUgKHNvcnQga2V5cyAlTGlua3MpIHsKICAgICAgICBteSAlT2JqZWN0VHlwZSA9ICV7JExpbmtzeyRMaW5rVHlwZX19OwogICAgICAgIGZvcmVhY2ggbXkgJE9iamVjdCAoc29ydCBrZXlzICVPYmplY3RUeXBlKSB7CiAgICAgICAgICAgIG15ICVEYXRhID0gJXskT2JqZWN0VHlwZXskT2JqZWN0fX07CiAgICAgICAgICAgIGZvcmVhY2ggbXkgJEl0ZW0gKHNvcnQga2V5cyAlRGF0YSkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICJMaW5rJExpbmtUeXBlIiwKICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICREYXRheyRJdGVtfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm47Cn0KCnN1YiBHZXRJdGVtUHJpbnQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJUdldFBhcmFtID0gKCk7CiAgICBteSBAUGFyYW1zID0gcXcoSXRlbUlEKTsKCiAgICAjIG1hbmFnZSBwYXJhbWV0ZXJzCiAgICBmb3JlYWNoIChAUGFyYW1zKSB7CiAgICAgICAgaWYgKCEoJEdldFBhcmFteyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAkXykpKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcihNZXNzYWdlID0+ICJOZWVkIHBhcmFtZXRlciAkXyIpOwogICAgICAgIH0KICAgIH0KICAgICMgZGIgYWN0aW9uCiAgICBteSAlSXRlbURhdGEgPSAkU2VsZi0+e0ZBUU9iamVjdH0tPkZBUUdldChJdGVtSUQgPT4gJEdldFBhcmFte0l0ZW1JRH0sIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0pOwogICAgaWYgKCElSXRlbURhdGEpIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgfQogICAgIyBodG1sIHF1b3RpbmcKICAgIGZvcmVhY2ggbXkgJEtleSAocXcgKEZpZWxkMSBGaWVsZDIgRmllbGQzIEZpZWxkNCBGaWVsZDUgRmllbGQ2KSkgewogICAgICAgICRJdGVtRGF0YXskS2V5fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCgKICAgICAgICAgICAgTmV3TGluZSA9PiA3MCwKICAgICAgICAgICAgVGV4dCA9PiAkSXRlbURhdGF7JEtleX0sCiAgICAgICAgICAgIFZNYXggPT4gNTAwMCwKICAgICAgICAgICAgSFRNTFJlc3VsdE1vZGUgPT4gMSwKICAgICAgICAgICAgTGlua0ZlYXR1cmUgPT4gMSwKICAgICAgICApOwogICAgfQogICAgIyBwZXJtaXNzaW9uIGNoZWNrCiAgICBpZiAoIWV4aXN0cygkU2VsZi0+e0ludGVyZmFjZVN0YXRlc317JEl0ZW1EYXRhe1N0YXRlVHlwZUlEfX0pKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKFdpdGhIZWFkZXIgPT4gJ3llcycpOwogICAgfQogICAgIyBhZGQgYXJ0aWNsZQogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgTmFtZSA9PiAnUHJpbnQnLAogICAgICAgICBEYXRhID0+IFwlSXRlbURhdGEsCiAgICApOwogICAgIyBmaWVsZHMKICAgICRTZWxmLT5fR2V0SXRlbUZpZWxkcygKICAgICAgICBJdGVtRGF0YSA9PiBcJUl0ZW1EYXRhCiAgICApOwogICAgIyBsaW5rcwogICAgaWYgKCRQYXJhbXtMaW5rc30gJiYgJFBhcmFte0xpbmtzfSA9PSAxKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTGlua3MnLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CiAgICAgICAgIyBnZXQgbGlua2VkIG9iamVjdHMKICAgICAgICBteSAlTGlua3MgPSAkU2VsZi0+e0xpbmtPYmplY3R9LT5BbGxMaW5rZWRPYmplY3RzKAogICAgICAgICAgICBPYmplY3QgPT4gJ0ZBUScsCiAgICAgICAgICAgIE9iamVjdElEID0+ICRJdGVtRGF0YXtJdGVtSUR9LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgIyBsaW5rcwogICAgICAgIGZvcmVhY2ggbXkgJExpbmtUeXBlIChzb3J0IGtleXMgJUxpbmtzKSB7CiAgICAgICAgICAgIG15ICVPYmplY3RUeXBlID0gJXskTGlua3N7JExpbmtUeXBlfX07CiAgICAgICAgICAgIGZvcmVhY2ggbXkgJE9iamVjdCAoc29ydCBrZXlzICVPYmplY3RUeXBlKSB7CiAgICAgICAgICAgICAgICBteSAlRGF0YSA9ICV7JE9iamVjdFR5cGV7JE9iamVjdH19OwogICAgICAgICAgICAgICAgZm9yZWFjaCBteSAkSXRlbSAoc29ydCBrZXlzICVEYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAiTGluayRMaW5rVHlwZSIsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJERhdGF7JEl0ZW19LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm47Cn0KCnN1YiBfR2V0SXRlbUZpZWxkcyB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAlR2V0UGFyYW0gPSAoKTsKICAgIG15IEBQYXJhbXMgPSBxdyhJdGVtRGF0YSk7CgogICAgIyBtYW5hZ2UgcGFyYW1ldGVycwogICAgZm9yZWFjaCAoQFBhcmFtcykgewogICAgICAgIGlmKCFleGlzdHMoJFBhcmFteyRffSkpIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcihNZXNzYWdlID0+ICJOZWVkIHBhcmFtZXRlciAkXyIpOwogICAgICAgIH0KICAgIH0KICAgICMgY29uZmlnIHZhbHVlcwogICAgbXkgJUl0ZW1GaWVsZHMgPSAoKTsKICAgIGZvcihteSAkaT0xOyRpPDc7JGkrKykgewogICAgICAgIG15ICVJdGVtQ29uZmlnID0gJXskU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRkFROjpJdGVtOjpGaWVsZCcuJGkpfTsKICAgICAgICBpZigkSXRlbUNvbmZpZ3tTaG93fSkgewogICAgICAgICAgICAkSXRlbUZpZWxkc3siRmllbGQiLiRpfSA9IFwlSXRlbUNvbmZpZzsKICAgICAgICB9CiAgICB9CiAgICBmb3JlYWNoIG15ICRLZXkgKHNvcnQoIHsgJEl0ZW1GaWVsZHN7JGF9e1ByaW99IDw9PiAkSXRlbUZpZWxkc3skYn17UHJpb30gfSBrZXlzKCVJdGVtRmllbGRzKSkpIHsKICAgICAgICBteSAlU3RhdGVUeXBlRGF0YSA9ICV7JFNlbGYtPntGQVFPYmplY3R9LT5TdGF0ZVR5cGVHZXQoCiAgICAgICAgICAgIE5hbWUgPT4gJEl0ZW1GaWVsZHN7JEtleX17U2hvd30KICAgICAgICApfTsKICAgICAgICAjIHNob3cgeWVzIC9ubwogICAgICAgIGlmIChleGlzdHMoJFNlbGYtPntJbnRlcmZhY2VTdGF0ZXN9eyRTdGF0ZVR5cGVEYXRhe0lEfX0pKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdGQVFJdGVtRmllbGQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJXskSXRlbUZpZWxkc3skS2V5fX0sCiAgICAgICAgICAgICAgICAgICAgJ1N0YXRlTmFtZScgPT4gJFN0YXRlVHlwZURhdGF7TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgJ0tleScgPT4gJEtleSwKICAgICAgICAgICAgICAgICAgICAnVmFsdWUnID0+ICRQYXJhbXtJdGVtRGF0YX17JEtleX0gfHwgJycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybjsKfQoKc3ViIF9HZXRJdGVtRmllbGRWYWx1ZXMgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJUdldFBhcmFtID0gKCk7CiAgICBteSBAUGFyYW1zID0gcXcoSXRlbURhdGEpOwoKICAgICMgbWFuYWdlIHBhcmFtZXRlcnMKICAgIGZvcmVhY2ggKEBQYXJhbXMpIHsKICAgICAgICBpZiAoIWV4aXN0cygkUGFyYW17JF99KSkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKE1lc3NhZ2UgPT4gIk5lZWQgcGFyYW1ldGVyICRfIik7CiAgICAgICAgfQogICAgfQogICAgIyBjb25maWcgdmFsdWVzCiAgICBteSAlSXRlbUZpZWxkcyA9ICgpOwogICAgZm9yIChteSAkaT0xOyRpPDc7JGkrKykgewogICAgICAgIG15ICVJdGVtQ29uZmlnID0gJXskU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRkFROjpJdGVtOjpGaWVsZCcuJGkpfTsKICAgICAgICBpZigkSXRlbUNvbmZpZ3tTaG93fSkgewogICAgICAgICAgICAkSXRlbUZpZWxkc3siRmllbGQiLiRpfSA9IFwlSXRlbUNvbmZpZzsKICAgICAgICB9CiAgICB9CiAgICBteSAkU3RyaW5nID0gJyc7CiAgICBmb3JlYWNoIG15ICRLZXkgKHNvcnQoIHsgJEl0ZW1GaWVsZHN7JGF9e1ByaW99IDw9PiAkSXRlbUZpZWxkc3skYn17UHJpb30gfSBrZXlzKCVJdGVtRmllbGRzKSkpIHsKICAgICAgICBteSAlU3RhdGVUeXBlRGF0YSA9ICV7JFNlbGYtPntGQVFPYmplY3R9LT5TdGF0ZVR5cGVHZXQoCiAgICAgICAgICAgIE5hbWUgPT4gJEl0ZW1GaWVsZHN7JEtleX17U2hvd30KICAgICAgICApfTsKICAgICAgICAjIHNob3cgeWVzIC9ubwogICAgICAgIGlmKGV4aXN0cygkU2VsZi0+e0ludGVyZmFjZVN0YXRlc317JFN0YXRlVHlwZURhdGF7SUR9fSkpIHsKICAgICAgICAgICAgJFN0cmluZyAuPSAkUGFyYW17SXRlbURhdGF9eyRLZXl9IHx8ICcnOwogICAgICAgICAgICAkU3RyaW5nIC49ICJcblxuIjsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gJFN0cmluZzsKfQoKc3ViIF9HZXRJdGVtVm90aW5nIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBwYXJhbWV0ZXJzCiAgICBmb3JlYWNoIChxdyhJdGVtRGF0YSkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKE1lc3NhZ2UgPT4gIk5lZWQgcGFyYW1ldGVyICRfISIpOwogICAgICAgIH0KICAgIH0KICAgIG15ICVJdGVtRGF0YSA9ICV7JFBhcmFte0l0ZW1EYXRhfX07CgogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICJWb3RpbmciCiAgICApOwogICAgbXkgJVZvdGVEYXRhID0gJXskU2VsZi0+e0ZBUU9iamVjdH0tPlZvdGVHZXQoCiAgICAgICAgQ3JlYXRlQnkgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIEl0ZW1JRCA9PiAkSXRlbURhdGF7SXRlbUlEfSwKICAgICAgICBJbnRlcmZhY2UgPT4gJFNlbGYtPntJbnRlcmZhY2V9e0lEfSwKICAgICAgICBJUCA9PiAkRU5WeydSRU1PVEVfQUREUid9LAogICAgKX07CgogICAgbXkgJEZsYWcgPSAwOwogICAgIyBhbHJlYWR5IHZvdGVkPwogICAgaWYoJVZvdGVEYXRhKSB7CiAgICAgICAgIyBpdGVtL2NoYW5nZV90aW1lID4gdm90aW5nL2NyZWF0ZV90aW1lCiAgICAgICAgbXkgJEl0ZW1DaGFuZ2VkU3lzdGVtVGltZSA9ICRTZWxmLT57VGltZU9iamVjdH0tPlRpbWVTdGFtcDJTeXN0ZW1UaW1lKFN0cmluZyA9PiAkSXRlbURhdGF7Q2hhbmdlZH0gfHwgJycpOwogICAgICAgIG15ICRWb3RlQ3JlYXRlZFN5c3RlbVRpbWUgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZShTdHJpbmcgPT4gJFZvdGVEYXRhe0NyZWF0ZWR9IHx8ICcnKTsKCiAgICAgICAgaWYgKCRJdGVtQ2hhbmdlZFN5c3RlbVRpbWUgPiAkVm90ZUNyZWF0ZWRTeXN0ZW1UaW1lKSB7CiAgICAgICAgICAgICRGbGFnID0gMTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHB1c2goQHskU2VsZi0+e05vdGlmeX19LCBbJ0luZm8nLCAnWW91IGhhdmUgYWxyZWFkeSB2b3RlZCEnXSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkRmxhZyA9IDE7CiAgICB9CiAgICBpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdWb3RlJyAmJiAkRmxhZykgewogICAgICAgICMgY2hlY2sgbmVlZGVkIHBhcmFtZXRlcnMKICAgICAgICBmb3JlYWNoIChxdyhJdGVtRGF0YSkpIHsKICAgICAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiTmVlZCBwYXJhbWV0ZXIgJF8hIikKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAjIG1hbmFnZSBwYXJhbWV0ZXJzCiAgICAgICAgbXkgJUdldFBhcmFtID0gKCk7CiAgICAgICAgbXkgQFBhcmFtcyA9IHF3KEl0ZW1JRCBSYXRlKTsKICAgICAgICBmb3JlYWNoIChAUGFyYW1zKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJF8pOwogICAgICAgIH0KCiAgICAgICAgaWYoJEdldFBhcmFte1JhdGV9IGVxICcwJyBvciAkR2V0UGFyYW17UmF0ZX0pIHsKICAgICAgICAgICAgJFNlbGYtPntGQVFPYmplY3R9LT5Wb3RlQWRkKAogICAgICAgICAgICAgICAgQ3JlYXRlZEJ5ID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIEl0ZW1JRCA9PiAkR2V0UGFyYW17SXRlbUlEfSwKICAgICAgICAgICAgICAgIElQID0+ICRFTlZ7J1JFTU9URV9BRERSJ30sCiAgICAgICAgICAgICAgICBJbnRlcmZhY2UgPT4gJFNlbGYtPntJbnRlcmZhY2V9e0lEfSwKICAgICAgICAgICAgICAgIFJhdGUgPT4gJEdldFBhcmFte1JhdGV9LAogICAgICAgICAgICApOwogICAgICAgICAgICBwdXNoKEB7JFNlbGYtPntOb3RpZnl9fSwgWydJbmZvJywgJ1RoYW5rcyBmb3Igdm90ZSEnXSk7CiAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBwdXNoKEB7JFNlbGYtPntOb3RpZnl9fSwgWydFcnJvcicsICdObyByYXRlIHNlbGVjdGVkISddKTsKICAgICAgICAgICAgJFNlbGYtPkdldEl0ZW1Wb3RpbmdGb3JtKAogICAgICAgICAgICAgICAgSXRlbURhdGEgPT4gJFBhcmFte0l0ZW1EYXRhfQogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGZvcm0KICAgICRTZWxmLT5fR2V0SXRlbVZvdGluZ0Zvcm0oCiAgICAgICAgSXRlbURhdGEgPT4gJFBhcmFte0l0ZW1EYXRhfQogICAgKTsKCiAgICByZXR1cm47Cn0KCnN1YiBfR2V0SXRlbVZvdGluZ0Zvcm0gewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHBhcmFtZXRlcnMKICAgIGZvcmVhY2ggKHF3KEl0ZW1EYXRhKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiTmVlZCBwYXJhbWV0ZXIgJF8hIikKICAgICAgICB9CiAgICB9CiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ1ZvdGVGb3JtJywKICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAleyRQYXJhbXtJdGVtRGF0YX19IH0KICAgICk7CgogICAgbXkgJVZvdGluZ1JhdGVzID0gJXskU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRkFROjpJdGVtOjpWb3Rpbmc6OlJhdGVzJyl9OwogICAgZm9yZWFjaCBteSAka2V5ICggc29ydCggeyAkYiA8PT4gJGEgfSBrZXlzKCVWb3RpbmdSYXRlcyApICkgKSB7CiAgICAgICAgbXkgJURhdGEgPSAoIlZhbHVlIj0+JGtleSwgIlRpdGxlIj0+JFZvdGluZ1JhdGVzeyRrZXl9ICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAiVm90aW5nUmF0ZVJvdyIsCiAgICAgICAgICAgIERhdGEgPT4gXCVEYXRhLAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm47Cn0KCnN1YiBHZXRJdGVtU2VhcmNoIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICVHZXRQYXJhbSAgICA9ICgpOwogICAgbXkgJUZyb250ZW5kICAgID0gKCk7CgogICAgIyBnZXQgcGFyYW1zCiAgICBmb3JlYWNoIChxdyhMYW5ndWFnZUlEcyBDYXRlZ29yeUlEcykpIHsKICAgICAgICBteSBAQXJyYXkgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0QXJyYXkoUGFyYW0gPT4gJF8pOwogICAgICAgIGlmIChAQXJyYXkpIHsKICAgICAgICAgICAgJEdldFBhcmFteyRffSA9IFxAQXJyYXk7CiAgICAgICAgfQogICAgfQogICAgZm9yZWFjaCAocXcoUXVpY2tTZWFyY2ggTnVtYmVyIFRpdGxlIFdoYXQgS2V5d29yZCkpIHsKICAgICAgICAkR2V0UGFyYW17JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICRfKTsKICAgIH0KICAgICMgcXVpY2tzZWFyY2ggaW4gc3ViY2F0ZWdvcmllcz8KICAgIGlmICgkR2V0UGFyYW17UXVpY2tTZWFyY2h9KSB7CiAgICAgICAgaWYgKCRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGQVE6OkV4cGxvcmVyOjpRdWlja1NlYXJjaDo6U2hvd1N1YkNhdGVnb3J5SXRlbXMnKSkgewogICAgICAgICAgICBteSBAU3ViQ2F0ZWdvcnlJRHMgPSBAeyRTZWxmLT57RkFRT2JqZWN0fS0+Q2F0ZWdvcnlTdWJDYXRlZ29yeUlETGlzdCgKICAgICAgICAgICAgICAgIFBhcmVudElEID0+ICRHZXRQYXJhbXtDYXRlZ29yeUlEc30tPlswXSwKICAgICAgICAgICAgICAgIEl0ZW1TdGF0ZXMgPT4gJFNlbGYtPntJbnRlcmZhY2VTdGF0ZXN9LAogICAgICAgICAgICApfTsKICAgICAgICAgICAgcHVzaChAeyRHZXRQYXJhbXtDYXRlZ29yeUlEc319LCBAU3ViQ2F0ZWdvcnlJRHMpOwogICAgICAgIH0KICAgIH0KICAgICRGcm9udGVuZHtMYW5ndWFnZU9wdGlvbn0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgIERhdGEgPT4geyAkU2VsZi0+e0ZBUU9iamVjdH0tPkxhbmd1YWdlTGlzdCgpIH0sCiAgICAgICAgU2l6ZSA9PiA1LAogICAgICAgIE5hbWUgPT4gJ0xhbmd1YWdlSURzJywKICAgICAgICBNdWx0aXBsZSA9PiAxLAogICAgICAgIFNlbGVjdGVkSURSZWZBcnJheSA9PiAkR2V0UGFyYW17TGFuZ3VhZ2VJRHN9IHx8IFtdLAogICAgICAgIEhUTUxRdW90ZSA9PiAxLAogICAgICAgIExhbmd1YWdlVHJhbnNsYXRpb24gPT4gMCwKICAgICk7CiAgICAkRnJvbnRlbmR7Q2F0ZWdvcnlPcHRpb259ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudEZBUUNhdGVnb3J5TGlzdE9wdGlvbigKICAgICAgICBDYXRlZ29yeUxpc3QgPT4geyAleyRTZWxmLT57RkFRT2JqZWN0fS0+Q2F0ZWdvcnlMaXN0KCl9IH0sCiAgICAgICAgU2l6ZSA9PiA1LAogICAgICAgIE5hbWUgPT4gJ0NhdGVnb3J5SURzJywKICAgICAgICBNdWx0aXBsZSA9PiAxLAogICAgICAgIFNlbGVjdGVkSURzID0+ICRHZXRQYXJhbXtDYXRlZ29yeUlEc30gfHwgW10sCiAgICAgICAgSFRNTFF1b3RlID0+IDEsCiAgICAgICAgTGFuZ3VhZ2VUcmFuc2xhdGlvbiA9PiAwLAogICAgKTsKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnU2VhcmNoJywKICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlR2V0UGFyYW0sICVGcm9udGVuZCB9LAogICAgKTsKCiAgICAjIGJ1aWxkIHJlc3VsdAogICAgaWYgKCRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnU3VibWl0JykpIHsKICAgICAgICBteSAkQ3NzUm93ID0gJyc7CgogICAgICAgIG15IEBJdGVtSURzID0gJFNlbGYtPntGQVFPYmplY3R9LT5GQVFTZWFyY2goCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICBTdGF0ZXMgPT4gJFNlbGYtPntJbnRlcmZhY2VTdGF0ZXN9LAogICAgICAgICAgICBMaW1pdCA9PiAyNSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NlYXJjaFJlc3VsdCcsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVGcm9udGVuZCB9LAogICAgICAgICk7CiAgICAgICAgZm9yZWFjaCAoQEl0ZW1JRHMpIHsKICAgICAgICAgICAgJUZyb250ZW5kID0gKCk7CiAgICAgICAgICAgIG15ICVEYXRhID0gJFNlbGYtPntGQVFPYmplY3R9LT5GQVFHZXQoSXRlbUlEID0+ICRfKTsKCiAgICAgICAgICAgIGlmKCRDc3NSb3cgZXEgJ3NlYXJjaHBhc3NpdmUnKSB7CiAgICAgICAgICAgICAgICAkQ3NzUm93ID0gJ3NlYXJjaGFjdGl2ZSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkQ3NzUm93ID0gJ3NlYXJjaHBhc3NpdmUnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICREYXRhe0Nzc1Jvd30gPSAkQ3NzUm93OwogICAgICAgICAgICAkRnJvbnRlbmR7Q3NzQ29sdW1uVm90aW5nUmVzdWx0fSA9ICdjb2xvcjonLiRTZWxmLT57TGF5b3V0T2JqZWN0fS0+R2V0RkFRSXRlbVZvdGluZ1JhdGVDb2xvcihSYXRlID0+ICREYXRhe1Jlc3VsdH0pLic7JzsKCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdTZWFyY2hSZXN1bHRSb3cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVEYXRhLCAlRnJvbnRlbmQgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm47Cn0KCnN1YiBHZXRTeXN0ZW1IaXN0b3J5IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICVGcm9udGVuZCA9ICgpOwoKICAgICMgc3RvcmUgbGFzdCBxdWV1ZSBzY3JlZW4KICAgICRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgIEtleSA9PiAnTGFzdFNjcmVlbk92ZXJ2aWV3JywKICAgICAgICBWYWx1ZSA9PiAkU2VsZi0+e1JlcXVlc3RlZFVSTH0sCiAgICApOwogICAgIyBzdG9yZSBsYXN0IHNjcmVlbgogICAgJFNlbGYtPntTZXNzaW9uT2JqZWN0fS0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgS2V5ID0+ICdMYXN0U2NyZWVuVmlldycsCiAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntSZXF1ZXN0ZWRVUkx9LAogICAgKTsKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnU3lzdGVtSGlzdG9yeScsCiAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSB9LAogICAgKTsKCiAgICAkRnJvbnRlbmR7Q3NzUm93fSA9ICcnOwogICAgbXkgQEhpc3RvcnkgPSBAeyRTZWxmLT57RkFRT2JqZWN0fS0+SGlzdG9yeUdldCgpfTsKICAgIGZvcmVhY2ggbXkgJFJvdyAoQEhpc3RvcnkpIHsKICAgICAgICAjIGNzcyBjb25maWd1cmF0aW9uCiAgICAgICAgaWYoJEZyb250ZW5ke0Nzc1Jvd30gZXEgJ3NlYXJjaHBhc3NpdmUnKSB7CiAgICAgICAgICAgICRGcm9udGVuZHtDc3NSb3d9ID0gJ3NlYXJjaGFjdGl2ZSc7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkRnJvbnRlbmR7Q3NzUm93fSA9ICdzZWFyY2hwYXNzaXZlJzsKICAgICAgICB9CiAgICAgICAgbXkgJURhdGEgPSAleyRSb3d9OyMkU2VsZi0+e0ZBUU9iamVjdH0tPkZBUUdldChJdGVtSUQgPT4gJFJvdy0+e0l0ZW1JRH0pOwogICAgICAgIG15ICVVc2VyID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUm93LT57Q3JlYXRlZEJ5fSwKICAgICAgICAgICAgQ2FjaGVkID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTeXN0ZW1IaXN0b3J5Um93JywKICAgICAgICAgICAgRGF0YSA9PiB7ICVEYXRhLCAlRnJvbnRlbmQsICVVc2VyLCBOYW1lID0+ICRSb3ctPntOYW1lfSB9LAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm47Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50RkFRLnBtIC0gZmFxIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA2IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudEZBUS5wbSx2IDEuNyAyMDA2LzEwLzI1IDEwOjA2OjE5IHJrIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50RkFROwoKdXNlIHN0cmljdDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpGQVE7CnVzZSBLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdDsKdXNlIEtlcm5lbDo6TW9kdWxlczo6RkFROwoKdXNlIHZhcnMgcXcoJFZFUlNJT04gQElTQSk7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS43ICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87CgpASVNBID0gcXcoS2VybmVsOjpNb2R1bGVzOjpGQVEpOwoKIyAtLQpzdWIgbmV3IHsKICAgIG15ICRUeXBlID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgICMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAjCiAgICBteSAkU2VsZiA9IG5ldyBLZXJuZWw6Ok1vZHVsZXM6OkZBUSglUGFyYW0pOwogICAgYmxlc3MgKCRTZWxmLCAkVHlwZSk7CgogICAgIyBpbnRlcmZhY2Ugc2V0dGluZ3MKICAgICMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAjCiAgICAkU2VsZi0+e0ludGVyZmFjZX0gPSAkU2VsZi0+e0ZBUU9iamVjdH0tPlN0YXRlVHlwZUdldCgKICAgICAgICBOYW1lID0+ICdpbnRlcm5hbCcKICAgICk7CiAgICAkU2VsZi0+e0ludGVyZmFjZVN0YXRlc30gPSAkU2VsZi0+e0ZBUU9iamVjdH0tPlN0YXRlVHlwZUxpc3QoCiAgICAgICAgVHlwZXMgPT4gWydpbnRlcm5hbCcsJ2V4dGVybmFsJywncHVibGljJ10KICAgICk7CgogICAgIyBjaGVjayBuZWVkZWQgT2JqZWN0cwogICAgIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICMKICAgIGZvcmVhY2ggKHF3KFNlc3Npb25PYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKE1lc3NhZ2UgPT4gIkdvdCBubyAkXyEiKSBpZiAoISRTZWxmLT57JF99KTsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KIyAtLQpzdWIgUnVuIHsKCiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBQYXJhbXRlcgogICAgbXkgQFBhcmFtcyA9ICgpOwogICAgbXkgJUdldFBhcmFtID0gKCk7CiAgICBteSAlRnJvbnRlbmQgPSAoKTsKICAgIG15ICVEYXRhID0gKCk7CgogICAgIyBPdXRwdXQKICAgIG15ICRPdXRwdXQgPSAnJzsKICAgIG15ICRIZWFkZXIgPSAnJzsKICAgIG15ICRIZWFkZXJUaXRsZSA9ICAnJzsKICAgIG15ICRIZWFkZXJUeXBlID0gICcnOwogICAgbXkgJE5hdmlnYXRpb24gPSAnJzsKICAgIG15ICROb3RpZnkgPSAnJzsKICAgIG15ICRDb250ZW50ID0gJyc7CiAgICBteSAkRm9vdGVyID0gJyc7CiAgICBteSAkRm9vdGVyVHlwZSA9ICAnJzsKCiAgICBteSAkRGVmYXVsdEhlYWRlciA9ICcnOwogICAgbXkgJERlZmF1bHROYXZpZ2F0aW9uID0gJyc7CiAgICBteSAkRGVmYXVsdE5vdGlmeSA9ICcnOwogICAgbXkgJERlZmF1bHRDb250ZW50ID0gJyc7CiAgICBteSAkRGVmYXVsdEZvb3RlciA9ICcnOwoKICAgICMgbWFuYWdlIHBhcmFtZXRlcnMKICAgICMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAjCiAgICBAUGFyYW1zID0gcXcoSXRlbUlEIElEIE51bWJlciBOYW1lIENvbW1lbnQgQ2F0ZWdvcnlJRCBQYXJlbnRJRCBTdGF0ZUlEIExhbmd1YWdlSUQgVGl0bGUgVXNlcklEIEZpZWxkMSBGaWVsZDIgRmllbGQzIEZpZWxkNCBGaWVsZDUgRmllbGQ2IEZyZWVLZXkxIEZyZWVLZXkyIEZyZWVLZXkzIEtleXdvcmRzIE9yZGVyIFNvcnQgTmF2KTsKICAgIGZvcmVhY2ggKEBQYXJhbXMpIHsKICAgICAgICAkR2V0UGFyYW17JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICRfKSB8fCAnJzsKICAgIH0KCiAgICAjIG5hdmlnYXRpb24gT04vT0ZGCiAgICAjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIwogICAgJEhlYWRlclR5cGUgPSAkU2VsZi0+e0xhc3RGQVFOYXZ9OwogICAgaWYoJEdldFBhcmFte05hdn0gZXEgJ05vcm1hbCcpIHsKICAgICAgICAkSGVhZGVyVHlwZSA9ICcnOwogICAgfSBlbHNpZiAoJEdldFBhcmFte05hdn0gZXEgJ05vbmUnIHx8ICRTZWxmLT57TGFzdEZBUU5hdn0pIHsKICAgICAgICAkSGVhZGVyVHlwZSA9ICdTbWFsbCc7CiAgICAgICAgJE5hdmlnYXRpb24gPSAnICc7CiAgICAgICAgJE5vdGlmeSAgICA9ICcgJzsKICAgIH0gZWxzZSB7CiAgICAgICAgJEhlYWRlclR5cGUgPSAnJzsKICAgIH0KCiAgICAkU2VsZi0+e1Nlc3Npb25PYmplY3R9LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICBLZXkgPT4gJ0xhc3RGQVFOYXYnLAogICAgICAgIFZhbHVlID0+ICRIZWFkZXJUeXBlLAogICAgKTsKCiAgICAjIHN0b3JlIG5hdiBwYXJhbQogICAgJFNlbGYtPntTZXNzaW9uT2JqZWN0fS0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgS2V5ID0+ICdMYXN0RkFRTmF2JywKICAgICAgICBWYWx1ZSA9PiAkSGVhZGVyVHlwZSwKICAgICk7CgogICAgIyB2aWV3IHNtYWxsCiAgICAjJEhlYWRlclR5cGUgPSAkU2VsZi0+e0xhc3RGQVFOYXZ9IHx8ICcnOwogICAgI215ICROYXYgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJ05hdicpIHx8ICcnOwoKICAgICMgb3V0cHV0CiAgICAkT3V0cHV0ICA9ICcnOwoKICAgICMgc3RvcmUgc2VhcmNoIHBhcmFtcwogICAgJFNlbGYtPntTZXNzaW9uT2JqZWN0fS0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgS2V5ID0+ICdMYXN0RkFRV2hhdCcsCiAgICAgICAgVmFsdWUgPT4gJFBhcmFte1doYXR9LAogICAgKTsKICAgICRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgIEtleSA9PiAnTGFzdEZBUUtleXdvcmQnLAogICAgICAgIFZhbHVlID0+ICRQYXJhbXtLZXl3b3JkfSwKICAgICk7CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgbGFuZ3VhZ2UgYWRkCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnTGFuZ3VhZ2UnKSB7CgogICAgICAgICMgcGVybWlzc2lvbiBjaGVjawogICAgICAgIGlmICghJFNlbGYtPntBY2Nlc3NSd30pIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKFdpdGhIZWFkZXIgPT4gJ3llcycpOwogICAgICAgIH0KCiAgICAgICAgIyBkdGwKICAgICAgICAkRnJvbnRlbmR7SGVhZGxpbmV9ID0gJ0FkZCc7CiAgICAgICAgJEZyb250ZW5ke0FkZExpbmt9ID0gJyhDbGljayBoZXJlIHRvIGFkZCknOwogICAgICAgICRGcm9udGVuZHtTdWJhY3Rpb259ID0gJ0xhbmd1YWdlQWRkJzsKICAgICAgICAkRnJvbnRlbmR7TGFuZ3VhZ2VPcHRpb259ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSA9PiB7ICRTZWxmLT57RkFRT2JqZWN0fS0+TGFuZ3VhZ2VMaXN0KFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0pIH0sCiAgICAgICAgICAgIFNpemUgPT4gMTAsCiAgICAgICAgICAgIE5hbWUgPT4gJ0lEJywKICAgICAgICAgICAgSFRNTFF1b3RlID0+IDEsCiAgICAgICAgICAgIExhbmd1YWdlVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdMYW5ndWFnZScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbSwgJUZyb250ZW5kfSwKICAgICAgICApOwoKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBsYW5ndWFnZSBhZGQgYWN0aW9uCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnTGFuZ3VhZ2VBY3Rpb24nKSB7CgogICAgICAgICMgcGVybWlzc2lvbiBjaGVjawogICAgICAgIGlmICghJFNlbGYtPntBY2Nlc3NSd30pIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKFdpdGhIZWFkZXIgPT4gJ3llcycpOwogICAgICAgIH0KCiAgICAgICAgI2dldCBEYXRhCiAgICAgICAgbXkgJVBhcmFtRGF0YSA9ICgpOwogICAgICAgICRQYXJhbURhdGF7VXNlcklEfSA9ICRTZWxmLT57VXNlcklEfTsKICAgICAgICBmb3JlYWNoKHF3KE5hbWUpKSB7CiAgICAgICAgICAgIGlmKCEoJFBhcmFtRGF0YXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJF8pKSkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKE1lc3NhZ2UgPT4gIk5lZWQgJF8gISIpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGRiIGFjdGlvbgogICAgICAgIGlmKCEkU2VsZi0+e0ZBUU9iamVjdH0tPkxhbmd1YWdlRHVwbGljYXRlQ2hlY2soTmFtZT0+JFBhcmFtRGF0YXtOYW1lfSkpIHsKICAgICAgICAgICAgaWYgKCRTZWxmLT57RkFRT2JqZWN0fS0+TGFuZ3VhZ2VBZGQoJVBhcmFtRGF0YSwgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICJBY3Rpb249QWdlbnRGQVEmU3ViYWN0aW9uPUxhbmd1YWdlIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiTGFuZ3VhZ2UgJyRQYXJhbURhdGF7TmFtZX0nIGFscmVhZHkgZXhpc3RzISIpOwogICAgICAgIH0KCiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgbGFuZ3VhZ2UgdXBkYXRlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnTGFuZ3VhZ2VDaGFuZ2UnKSB7CgogICAgICAgICMgcGVybWlzc2lvbiBjaGVjawogICAgICAgIGlmICghJFNlbGYtPntBY2Nlc3NSd30pIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKFdpdGhIZWFkZXIgPT4gJ3llcycpOwogICAgICAgIH0KCiAgICAgICAgI2dldCBEYXRhCiAgICAgICAgbXkgJVBhcmFtRGF0YSA9ICgpOwogICAgICAgIGZvcmVhY2gocXcoSUQpKSB7CiAgICAgICAgICAgIGlmKCEoJFBhcmFtRGF0YXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJF8pKSkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKE1lc3NhZ2UgPT4gIk5lZWQgJF8gISIpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGRiIGFjdGlvbgogICAgICAgIG15ICVMYW5ndWFnZURhdGEgPSAkU2VsZi0+e0ZBUU9iamVjdH0tPkxhbmd1YWdlR2V0KElEID0+ICRQYXJhbURhdGF7SUR9LCBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9KTsKICAgICAgICBpZiAoISVMYW5ndWFnZURhdGEpIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKTsKICAgICAgICB9CgogICAgICAgICMgZHRsCiAgICAgICAgJEZyb250ZW5ke0hlYWRsaW5lfSA9ICdDaGFuZ2UnOwogICAgICAgICRGcm9udGVuZHtBZGRMaW5rfSA9ICcnOwogICAgICAgICRGcm9udGVuZHtTdWJhY3Rpb259ID0gJ0xhbmd1YWdlQ2hhbmdlJzsKICAgICAgICAkRnJvbnRlbmR7TGFuZ3VhZ2VPcHRpb259ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSA9PiB7ICRTZWxmLT57RkFRT2JqZWN0fS0+TGFuZ3VhZ2VMaXN0KFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0pIH0sCiAgICAgICAgICAgIFNpemUgPT4gMTAsCiAgICAgICAgICAgIE5hbWUgPT4gJ0lEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkTGFuZ3VhZ2VEYXRhe0xhbmd1YWdlSUR9LAogICAgICAgICAgICBIVE1MUXVvdGUgPT4gMSwKICAgICAgICAgICAgTGFuZ3VhZ2VUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICk7CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0xhbmd1YWdlJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtLCAlRnJvbnRlbmQsICVMYW5ndWFnZURhdGF9LAogICAgICAgICk7CgogICAgICAgICRDb250ZW50ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbSwgJUZyb250ZW5kLCAlTGFuZ3VhZ2VEYXRhfSwKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudEZBUScsCiAgICAgICAgKTsKCiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgbGFuZ3VhZ2UgdXBkYXRlIGFjdGlvbgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0xhbmd1YWdlQ2hhbmdlQWN0aW9uJykgewoKICAgICAgICAjIHBlcm1pc3Npb24gY2hlY2sKICAgICAgICBpZiAoISRTZWxmLT57QWNjZXNzUnd9KSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbihXaXRoSGVhZGVyID0+ICd5ZXMnKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IERhdGEKICAgICAgICBteSAlUGFyYW1EYXRhID0gKCk7CiAgICAgICAgJFBhcmFtRGF0YXtVc2VySUR9ID0gJFNlbGYtPntVc2VySUR9OwogICAgICAgIGZvcmVhY2gocXcoSUQgTmFtZSkpIHsKICAgICAgICAgICAgaWYoISgkUGFyYW1EYXRheyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAkXykpKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiTmVlZCAkXyAhIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZHVwbGljYXRlIGNoZWNrCiAgICAgICAgaWYoISRTZWxmLT57RkFRT2JqZWN0fS0+TGFuZ3VhZ2VEdXBsaWNhdGVDaGVjayhOYW1lPT4kUGFyYW1EYXRhe05hbWV9LElEPT4kUGFyYW1EYXRhe0lEfSkpIHsKICAgICAgICAgICAgIyBkYiBhY3Rpb24KICAgICAgICAgICAgaWYgKCEkU2VsZi0+e0ZBUU9iamVjdH0tPkxhbmd1YWdlVXBkYXRlKCVQYXJhbURhdGEsIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0pKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdChPUCA9PiAiQWN0aW9uPUFnZW50RkFRJlN1YmFjdGlvbj1MYW5ndWFnZSIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKE1lc3NhZ2UgPT4gIkxhbmd1YWdlICckUGFyYW1EYXRhe05hbWV9JyBhbHJlYWR5IGV4aXN0cyEiKTsKICAgICAgICB9CgogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGNhdGVnb3J5IHVwZGF0ZQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0NhdGVnb3J5Q2hhbmdlJykgewoKICAgICAgICBAUGFyYW1zID0gcXcoQ2F0ZWdvcnlJRCk7CgogICAgICAgICMgcGVybWlzc2lvbiBjaGVjawogICAgICAgIGlmICghJFNlbGYtPntBY2Nlc3NSd30pIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKFdpdGhIZWFkZXIgPT4gJ3llcycpOwogICAgICAgIH0KCiAgICAgICAgIyBjZWNrIHBhcmFtZXRlcnMKICAgICAgICBteSAlUGFyYW1EYXRhID0gKCk7CiAgICAgICAgZm9yZWFjaChxdyhDYXRlZ29yeUlEKSkgewogICAgICAgICAgICBpZighKCRQYXJhbURhdGF7JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICRfKSkpIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcihNZXNzYWdlID0+ICJOZWVkICRfICEiKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBkYiBhY3Rpb24KICAgICAgICBteSAlQ2F0ZWdvcnlEYXRhID0gJFNlbGYtPntGQVFPYmplY3R9LT5DYXRlZ29yeUdldChDYXRlZ29yeUlEID0+ICRQYXJhbURhdGF7Q2F0ZWdvcnlJRH0sIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0pOwogICAgICAgIGlmICghJUNhdGVnb3J5RGF0YSkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgICAgIH0KCiAgICAgICAgIyBkdGwKICAgICAgICAkRnJvbnRlbmR7Q2F0ZWdvcnlMb25nT3B0aW9ufSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QWdlbnRGQVFDYXRlZ29yeUxpc3RPcHRpb24oCiAgICAgICAgICAgIENhdGVnb3J5TGlzdCA9PiB7ICV7JFNlbGYtPntGQVFPYmplY3R9LT5DYXRlZ29yeUxpc3QoVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSl9IH0sCiAgICAgICAgICAgIFNpemUgPT4gMTAsCiAgICAgICAgICAgIE5hbWUgPT4gJ0NhdGVnb3J5SUQnLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRDYXRlZ29yeURhdGF7Q2F0ZWdvcnlJRH0sCiAgICAgICAgICAgIEhUTUxRdW90ZSA9PiAxLAogICAgICAgICAgICBMYW5ndWFnZVRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgKTsKICAgICAgICAkRnJvbnRlbmR7Q2F0ZWdvcnlPcHRpb259ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudEZBUUNhdGVnb3J5TGlzdE9wdGlvbigKICAgICAgICAgICAgQ2F0ZWdvcnlMaXN0ID0+IHsgJXskU2VsZi0+e0ZBUU9iamVjdH0tPkNhdGVnb3J5TGlzdChVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9KX0gfSwKICAgICAgICAgICAgU2l6ZSA9PiAxLAogICAgICAgICAgICBOYW1lID0+ICdQYXJlbnRJRCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJENhdGVnb3J5RGF0YXtQYXJlbnRJRH0sCiAgICAgICAgICAgIEhUTUxRdW90ZSA9PiAxLAogICAgICAgICAgICBMYW5ndWFnZVRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgICAgIFJvb3RFbGVtZW50ID0+IDEsCiAgICAgICAgKTsKICAgICAgICAjIGJ1aWxkIFZhbGlkSUQgc3RyaW5nCiAgICAgICAgJEZyb250ZW5ke1ZhbGlkT3B0aW9ufSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPkdldFRhYmxlRGF0YSgKICAgICAgICAgICAgICAgICAgICBXaGF0ID0+ICdpZCwgbmFtZScsCiAgICAgICAgICAgICAgICAgICAgVGFibGUgPT4gJ3ZhbGlkJywKICAgICAgICAgICAgICAgICAgICBWYWxpZCA9PiAwLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB9LAogICAgICAgICAgICBOYW1lID0+ICdWYWxpZElEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkQ2F0ZWdvcnlEYXRhe1ZhbGlkSUR9LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ2F0ZWdvcnknLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlRnJvbnRlbmQsICVDYXRlZ29yeURhdGEgfSwKICAgICAgICApOwoKICAgIH0KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGNhdGVnb3J5IHVwZGF0ZSBhY3Rpb24KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdDYXRlZ29yeUNoYW5nZUFjdGlvbicpIHsKCiAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrCiAgICAgICAgaWYgKCEkU2VsZi0+e0FjY2Vzc1J3fSkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oV2l0aEhlYWRlciA9PiAneWVzJyk7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIHBhcmFtZXRlcnMKICAgICAgICBteSAlUGFyYW1EYXRhID0gKCk7CiAgICAgICAgbXkgQFJlcXVpcmVkUGFyYW1zID0gcXcoQ2F0ZWdvcnlJRCBOYW1lIENvbW1lbnQpOwogICAgICAgIG15IEBQYXJhbXMgPSBxdyhQYXJlbnRJRCBWYWxpZElEKTsKICAgICAgICBmb3JlYWNoIChAUmVxdWlyZWRQYXJhbXMpIHsKICAgICAgICAgICAgJFBhcmFtRGF0YXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJF8pOwogICAgICAgICAgICBpZighJFBhcmFtRGF0YXskX30pIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3JlYWNoIChAUGFyYW1zKSB7CiAgICAgICAgICAgICRQYXJhbURhdGF7JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICRfKTsKICAgICAgICAgICAgaWYoIWRlZmluZWQoJFBhcmFtRGF0YXskX30pKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZHVwbGljYXRlIGNoZWNrCiAgICAgICAgaWYoISRTZWxmLT57RkFRT2JqZWN0fS0+Q2F0ZWdvcnlEdXBsaWNhdGVDaGVjayhOYW1lPT4kUGFyYW1EYXRhe05hbWV9LElEPT4kUGFyYW1EYXRhe0NhdGVnb3J5SUR9LFBhcmVudElEPT4kUGFyYW1EYXRhe1BhcmVudElEfSkpIHsKICAgICAgICAgICAgIyBkYiBhY3Rpb24KICAgICAgICAgICAgaWYgKCRTZWxmLT57RkFRT2JqZWN0fS0+Q2F0ZWdvcnlVcGRhdGUoJVBhcmFtRGF0YSwgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICJBY3Rpb249QWdlbnRGQVEmU3ViYWN0aW9uPUNhdGVnb3J5Iik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiQ2F0ZWdvcnkgJyRQYXJhbURhdGF7TmFtZX0nIGFscmVhZHkgZXhpc3RzISIpOwogICAgICAgIH0KICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBjYXRlZ29yeSBhZGQKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdDYXRlZ29yeScpIHsKCiAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrCgogICAgICAgIGlmICghJFNlbGYtPntBY2Nlc3NSd30pIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKFdpdGhIZWFkZXIgPT4gJ3llcycpOwogICAgICAgIH0KCiAgICAgICAgIyBkdGwKCiAgICAgICAgJEZyb250ZW5ke0NhdGVnb3J5TG9uZ09wdGlvbn0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50RkFRQ2F0ZWdvcnlMaXN0T3B0aW9uKAogICAgICAgICAgICBDYXRlZ29yeUxpc3QgPT4geyAleyRTZWxmLT57RkFRT2JqZWN0fS0+Q2F0ZWdvcnlMaXN0KFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0pfSB9ICwKICAgICAgICAgICAgU2l6ZSA9PiAxMCwKICAgICAgICAgICAgTmFtZSA9PiAnQ2F0ZWdvcnlJRCcsCiAgICAgICAgICAgIEhUTUxRdW90ZSA9PiAxLAogICAgICAgICAgICBMYW5ndWFnZVRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgKTsKICAgICAgICAkRnJvbnRlbmR7Q2F0ZWdvcnlPcHRpb259ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudEZBUUNhdGVnb3J5TGlzdE9wdGlvbigKICAgICAgICAgICAgQ2F0ZWdvcnlMaXN0ID0+IHsgJXskU2VsZi0+e0ZBUU9iamVjdH0tPkNhdGVnb3J5TGlzdChVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9KX0gfSwKICAgICAgICAgICAgU2l6ZSA9PiAxLAogICAgICAgICAgICBOYW1lID0+ICdQYXJlbnRJRCcsCiAgICAgICAgICAgIEhUTUxRdW90ZSA9PiAxLAogICAgICAgICAgICBMYW5ndWFnZVRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgICAgIFJvb3RFbGVtZW50ID0+IDEsCiAgICAgICAgKTsKICAgICAgICAjIGJ1aWxkIFZhbGlkSUQgc3RyaW5nCiAgICAgICAgJEZyb250ZW5ke1ZhbGlkT3B0aW9ufSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPkdldFRhYmxlRGF0YSgKICAgICAgICAgICAgICAgICAgICBXaGF0ID0+ICdpZCwgbmFtZScsCiAgICAgICAgICAgICAgICAgICAgVGFibGUgPT4gJ3ZhbGlkJywKICAgICAgICAgICAgICAgICAgICBWYWxpZCA9PiAwLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB9LAogICAgICAgICAgICBOYW1lID0+ICdWYWxpZElEJywKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0NhdGVnb3J5JywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUZyb250ZW5kIH0sCiAgICAgICAgKTsKCiAgICB9CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBjYXRlZ29yeSBhZGQgYWN0aW9uCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ2F0ZWdvcnlBZGRBY3Rpb24nKSB7CgogICAgICAgICMgcGVybWlzc2lvbiBjaGVjawogICAgICAgIGlmICghJFNlbGYtPntBY2Nlc3NSd30pIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKFdpdGhIZWFkZXIgPT4gJ3llcycpOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBwYXJhbWV0ZXJzCiAgICAgICAgbXkgJVBhcmFtRGF0YSA9ICgpOwogICAgICAgIG15IEBSZXF1aXJlZFBhcmFtcyA9IHF3KE5hbWUgQ29tbWVudCk7CiAgICAgICAgbXkgQFBhcmFtcyA9IHF3KFBhcmVudElEIFZhbGlkSUQpOwogICAgICAgIGZvcmVhY2ggKEBSZXF1aXJlZFBhcmFtcykgewogICAgICAgICAgICAkUGFyYW1EYXRheyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAkXyk7CiAgICAgICAgICAgIGlmKCEkUGFyYW1EYXRheyRffSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcihNZXNzYWdlID0+ICJOZWVkICRfIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZm9yZWFjaCAoQFBhcmFtcykgewogICAgICAgICAgICAkUGFyYW1EYXRheyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAkXyk7CiAgICAgICAgICAgIGlmKCFkZWZpbmVkKCRQYXJhbURhdGF7JF99KSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcihNZXNzYWdlID0+ICJOZWVkICRfIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZHVwbGljYXRlIGNoZWNrCiAgICAgICAgaWYoISRTZWxmLT57RkFRT2JqZWN0fS0+Q2F0ZWdvcnlEdXBsaWNhdGVDaGVjayhOYW1lPT4kUGFyYW1EYXRhe05hbWV9LFBhcmVudElEPT4kUGFyYW1EYXRhe1BhcmVudElEfSkpIHsKICAgICAgICAgICAgaWYgKCRTZWxmLT57RkFRT2JqZWN0fS0+Q2F0ZWdvcnlBZGQoJVBhcmFtRGF0YSwgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSkgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdChPUCA9PiAiQWN0aW9uPUFnZW50RkFRJlN1YmFjdGlvbj1DYXRlZ29yeSIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKE1lc3NhZ2UgPT4gIkNhdGVnb3J5ICckUGFyYW1EYXRhe05hbWV9JyBhbHJlYWR5IGV4aXN0cyEiKTsKICAgICAgICB9CiAgICB9CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBpdGVtIGFkZAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FkZCcpIHsKCiAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrCgogICAgICAgIGlmICghJFNlbGYtPntBY2Nlc3NSd30pIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKFdpdGhIZWFkZXIgPT4gJ3llcycpOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBwYXJhbWV0ZXJzCgogICAgICAgICMgZHRsCiAgICAgICAgJEZyb250ZW5ke0xhbmd1YWdlT3B0aW9ufSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgIERhdGEgPT4geyAkU2VsZi0+e0ZBUU9iamVjdH0tPkxhbmd1YWdlTGlzdCgpIH0sCiAgICAgICAgICAgIE5hbWUgPT4gJ0xhbmd1YWdlSUQnLAogICAgICAgICAgICBMYW5ndWFnZVRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgICAgIFNlbGVjdGVkID0+ICRTZWxmLT57VXNlckxhbmd1YWdlfSwKICAgICAgICApOwogICAgICAgICRGcm9udGVuZHtDYXRlZ29yeU9wdGlvbn0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50RkFRQ2F0ZWdvcnlMaXN0T3B0aW9uKAogICAgICAgICAgICBDYXRlZ29yeUxpc3QgPT4geyAleyRTZWxmLT57RkFRT2JqZWN0fS0+Q2F0ZWdvcnlMaXN0KFZhbGlkID0+IDEpfSB9LAogICAgICAgICAgICBOYW1lID0+ICdDYXRlZ29yeUlEJywKICAgICAgICAgICAgTGFuZ3VhZ2VUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICk7CiAgICAgICAgJEZyb250ZW5ke1N0YXRlT3B0aW9ufSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgIERhdGEgPT4geyAkU2VsZi0+e0ZBUU9iamVjdH0tPlN0YXRlTGlzdCgpIH0sCiAgICAgICAgICAgIE5hbWUgPT4gJ1N0YXRlSUQnLAogICAgICAgICAgICBTZWxlY3RlZCA9PiAnaW50ZXJuYWwgKGFnZW50KScsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQWRkJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUZyb250ZW5kIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBmaWVsZHMKICAgICAgICAkU2VsZi0+X0dldEl0ZW1GaWVsZHMoCiAgICAgICAgICAgIEl0ZW1EYXRhID0+IHt9CiAgICAgICAgKTsKCiAgICB9CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBpdGVtIGFkZCBhY3Rpb24KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdBZGRBY3Rpb24nKSB7CgogICAgICAgIEBQYXJhbXMgPSBxdyhUaXRsZSk7CgogICAgICAgICMgcGVybWlzc2lvbiBjaGVjawogICAgICAgIGlmICghJFNlbGYtPntBY2Nlc3NSd30pIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKFdpdGhIZWFkZXIgPT4gJ3llcycpOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBwYXJhbWV0ZXJzCiAgICAgICAgbXkgJVBhcmFtRGF0YSA9ICgpOwogICAgICAgIG15IEBSZXF1aXJlZFBhcmFtcyA9IHF3KENhdGVnb3J5SUQgVGl0bGUpOwogICAgICAgIG15IEBQYXJhbXMgPSBxdyhTdGF0ZUlEIExhbmd1YWdlSUQgRmllbGQxIEZpZWxkMiBGaWVsZDMgRmllbGQ0IEZpZWxkNSBGaWVsZDYgS2V5d29yZHMgVGl0bGUpOwogICAgICAgIGZvcmVhY2ggKEBSZXF1aXJlZFBhcmFtcykgewogICAgICAgICAgICAkUGFyYW1EYXRheyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAkXyk7CiAgICAgICAgICAgIGlmKCEkUGFyYW1EYXRheyRffSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcihNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvcmVhY2ggKEBQYXJhbXMpIHsKICAgICAgICAgICAgJFBhcmFtRGF0YXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJF8pOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgc3VibWl0IGF0dGFjaG1lbnQKICAgICAgICBteSAlVXBsb2FkU3R1ZmYgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0VXBsb2FkQWxsKAogICAgICAgICAgICBQYXJhbSA9PiAnZmlsZV91cGxvYWQnLAogICAgICAgICAgICBTb3VyY2UgPT4gJ1N0cmluZycsCiAgICAgICAgKTsKCiAgICAgICAgIyBpbnNlcnQgaXRlbQogICAgICAgIG15ICRJdGVtSUQgPSAkU2VsZi0+e0ZBUU9iamVjdH0tPkZBUUFkZCgKICAgICAgICAgICAgJVBhcmFtRGF0YSwKICAgICAgICAgICAgJVVwbG9hZFN0dWZmLAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9CiAgICAgICAgKTsKCiAgICAgICAgaWYgKCRJdGVtSUQpIHsKICAgICAgICAgICAgaWYgKCFkZWZpbmVkKCRQYXJhbURhdGF7SXRlbUlEfSkgJiYgISRQYXJhbURhdGF7SXRlbUlEfSkgewogICAgICAgICAgICAgICAgJFBhcmFtRGF0YXtJdGVtSUR9ID0gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mU3ViYWN0aW9uPVZpZXcmSXRlbUlEPSRQYXJhbURhdGF7SXRlbUlEfSIpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKTsKICAgICAgICB9CiAgICB9CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBpdGVtIHVwZGF0ZQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1VwZGF0ZScpIHsKCiAgICAgICAgQFBhcmFtcyA9IHF3KEl0ZW1JRCk7CgogICAgICAgICMgcGVybWlzc2lvbiBjaGVjawogICAgICAgIGlmICghJFNlbGYtPntBY2Nlc3NSd30pIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKFdpdGhIZWFkZXIgPT4gJ3llcycpOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBwYXJhbWV0ZXJzCiAgICAgICAgbXkgJVBhcmFtRGF0YSA9ICgpOwogICAgICAgIG15IEBSZXF1aXJlZFBhcmFtcyA9IHF3KENhdGVnb3J5SUQgSXRlbUlEKTsKICAgICAgICBmb3JlYWNoIChAUmVxdWlyZWRQYXJhbXMpIHsKICAgICAgICAgICAgJFBhcmFtRGF0YXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJF8pOwogICAgICAgICAgICBpZighJFBhcmFtRGF0YXskX30pIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBkYiBhY3Rpb24KICAgICAgICBteSAlSXRlbURhdGEgPSAkU2VsZi0+e0ZBUU9iamVjdH0tPkZBUUdldChJdGVtSUQgPT4gJFBhcmFtRGF0YXtJdGVtSUR9LCBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9KTsKICAgICAgICBpZiAoISVJdGVtRGF0YSkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgICAgIH0KCiAgICAgICAgIyBkdGwKICAgICAgICAkRnJvbnRlbmR7TGFuZ3VhZ2VPcHRpb259ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSA9PiB7ICRTZWxmLT57RkFRT2JqZWN0fS0+TGFuZ3VhZ2VMaXN0KCkgfSwKICAgICAgICAgICAgTmFtZSA9PiAnTGFuZ3VhZ2VJRCcsCiAgICAgICAgICAgIExhbmd1YWdlVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkSXRlbURhdGF7TGFuZ3VhZ2VJRH0sCiAgICAgICAgKTsKICAgICAgICAkRnJvbnRlbmR7Q2F0ZWdvcnlPcHRpb259ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudEZBUUNhdGVnb3J5TGlzdE9wdGlvbigKICAgICAgICAgICAgQ2F0ZWdvcnlMaXN0ID0+IHsgJXskU2VsZi0+e0ZBUU9iamVjdH0tPkNhdGVnb3J5TGlzdCgpfSB9LAogICAgICAgICAgICBOYW1lID0+ICdDYXRlZ29yeUlEJywKICAgICAgICAgICAgTGFuZ3VhZ2VUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRJdGVtRGF0YXtDYXRlZ29yeUlEfSwKICAgICAgICApOwogICAgICAgICRGcm9udGVuZHtTdGF0ZU9wdGlvbn0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICBEYXRhID0+IHsgJFNlbGYtPntGQVFPYmplY3R9LT5TdGF0ZUxpc3QoKSB9LAogICAgICAgICAgICBOYW1lID0+ICdTdGF0ZUlEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkSXRlbURhdGF7U3RhdGVJRH0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdVcGRhdGUnLAogICAgICAgICAgICBEYXRhID0+IHsgJUl0ZW1EYXRhLCAlRnJvbnRlbmQgfSwKICAgICAgICApOwoKICAgICAgICAjIGZpZWxkcwogICAgICAgICRTZWxmLT5fR2V0SXRlbUZpZWxkcygKICAgICAgICAgICAgSXRlbURhdGEgPT4gXCVJdGVtRGF0YQogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0CiAgICAgICAgJEhlYWRlclRpdGxlID0gJ0VkaXQnOwogICAgICAgICRIZWFkZXIgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcihUeXBlID0+ICRIZWFkZXJUeXBlLCBUaXRsZSA9PiAkSGVhZGVyVGl0bGUpOwoKICAgIH0KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGl0ZW0gdXBkYXRlIGFjdGlvbgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1VwZGF0ZUFjdGlvbicpIHsKCiAgICAgICAgQFBhcmFtcyA9IHF3KEl0ZW1JRCBUaXRsZSBDYXRlZ29yeUlEIFN0YXRlSUQgTGFuZ3VhZ2VJRCk7CgogICAgICAgICMgcGVybWlzc2lvbiBjaGVjawoKICAgICAgICBpZiAoISRTZWxmLT57QWNjZXNzUnd9KSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbihXaXRoSGVhZGVyID0+ICd5ZXMnKTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgcGFyYW1ldGVycwogICAgICAgIG15ICVQYXJhbURhdGEgPSAoKTsKICAgICAgICBteSBAUmVxdWlyZWRQYXJhbXMgPSBxdyhUaXRsZSBDYXRlZ29yeUlEKTsKICAgICAgICBteSBAUGFyYW1zID0gcXcoSXRlbUlEIFN0YXRlSUQgTGFuZ3VhZ2VJRCBGaWVsZDEgRmllbGQyIEZpZWxkMyBGaWVsZDQgRmllbGQ1IEZpZWxkNiBLZXl3b3Jkcyk7CiAgICAgICAgZm9yZWFjaCAoQFJlcXVpcmVkUGFyYW1zKSB7CiAgICAgICAgICAgICRQYXJhbURhdGF7JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICRfKTsKICAgICAgICAgICAgaWYoISRQYXJhbURhdGF7JF99KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZm9yZWFjaCAoQFBhcmFtcykgewogICAgICAgICAgICAkUGFyYW1EYXRheyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAkXyk7CiAgICAgICAgfQoKICAgICAgICAjIGRiIGFjdGlvbgoKICAgICAgICAjIGdldCBzdWJtaXQgYXR0YWNobWVudAogICAgICAgIG15ICVVcGxvYWRTdHVmZiA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgICAgIFBhcmFtID0+ICdmaWxlX3VwbG9hZCcsCiAgICAgICAgICAgIFNvdXJjZSA9PiAnU3RyaW5nJywKICAgICAgICApOwoKICAgICAgICAjIHVwZGF0ZSBpdGVtCiAgICAgICAgaWYgKCRTZWxmLT57RkFRT2JqZWN0fS0+RkFRVXBkYXRlKCVQYXJhbURhdGEsICVVcGxvYWRTdHVmZiwgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSkpIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mU3ViYWN0aW9uPVZpZXcmSXRlbUlEPSRHZXRQYXJhbXtJdGVtSUR9Iik7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgICAgIH0KICAgIH0KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGRlbGV0ZSBpdGVtIHNjcmVlbgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0RlbGV0ZScpIHsKCiAgICAgICAgQFBhcmFtcyA9IHF3KEl0ZW1JRCk7CgogICAgICAgICMgcGVybWlzc2lvbiBjaGVjawoKICAgICAgICBpZiAoISRTZWxmLT57QWNjZXNzUnd9KSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbihXaXRoSGVhZGVyID0+ICd5ZXMnKTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgcGFyYW1ldGVycwogICAgICAgIG15ICVQYXJhbURhdGEgPSAoKTsKICAgICAgICBteSBAUmVxdWlyZWRQYXJhbXMgPSBxdyhDYXRlZ29yeUlEIEl0ZW1JRCk7CiAgICAgICAgZm9yZWFjaCAoQFJlcXVpcmVkUGFyYW1zKSB7CiAgICAgICAgICAgICRQYXJhbURhdGF7JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICRfKTsKICAgICAgICAgICAgaWYoISRQYXJhbURhdGF7JF99KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZm9yZWFjaCAoQFBhcmFtcykgewogICAgICAgICAgICAkUGFyYW1EYXRheyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAkXyk7CiAgICAgICAgfQoKICAgICAgICAjIGRiIGFjdGlvbgoKICAgICAgICBteSAlSXRlbURhdGEgPSAkU2VsZi0+e0ZBUU9iamVjdH0tPkZBUUdldChJdGVtSUQgPT4gJFBhcmFtRGF0YXtJdGVtSUR9LCBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9KTsKICAgICAgICBpZiAoISVJdGVtRGF0YSkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgICAgIH0KCiAgICAgICAgIyBkdGwKCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRGVsZXRlJywKICAgICAgICAgICAgRGF0YSA9PiB7JUl0ZW1EYXRhfSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dAogICAgICAgICRIZWFkZXJUaXRsZSA9ICdEZWxldGUnOwogICAgICAgICRIZWFkZXIgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcihUeXBlID0+ICRIZWFkZXJUeXBlLCBUaXRsZSA9PiAkSGVhZGVyVGl0bGUpOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGl0ZW0gZGVsZXRlIGFjdGlvbgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0RlbGV0ZUFjdGlvbicpIHsKCiAgICAgICAgQFBhcmFtcyA9IHF3KEl0ZW1JRCk7CgogICAgICAgICMgcGVybWlzc2lvbiBjaGVjawogICAgICAgIGlmICghJFNlbGYtPntBY2Nlc3NSd30pIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKFdpdGhIZWFkZXIgPT4gJ3llcycpOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBwYXJhbWV0ZXJzCiAgICAgICAgbXkgJVBhcmFtRGF0YSA9ICgpOwogICAgICAgIG15IEBSZXF1aXJlZFBhcmFtcyA9IHF3KENhdGVnb3J5SUQgSXRlbUlEKTsKICAgICAgICBmb3JlYWNoIChAUmVxdWlyZWRQYXJhbXMpIHsKICAgICAgICAgICAgJFBhcmFtRGF0YXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJF8pOwogICAgICAgICAgICBpZighJFBhcmFtRGF0YXskX30pIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBkYiBhY3Rpb24KICAgICAgICBteSAlSXRlbURhdGEgPSAkU2VsZi0+e0ZBUU9iamVjdH0tPkZBUUdldChJdGVtSUQgPT4gJFBhcmFtRGF0YXtJdGVtSUR9LCBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9KTsKICAgICAgICBpZiAoISVJdGVtRGF0YSkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRTZWxmLT57RkFRT2JqZWN0fS0+RkFRRGVsZXRlKCVJdGVtRGF0YSkpIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mU3ViYWN0aW9uPUV4cGxvcmVyJkNhdGVnb3J5SUQ9JFBhcmFtRGF0YXtDYXRlZ29yeUlEfSIpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKTsKICAgICAgICB9CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgZG93bmxvYWQgaXRlbQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0Rvd25sb2FkJykgewogICAgICAgIEBQYXJhbXMgPSBxdyhJdGVtSUQpOwoKICAgICAgICAjIHBlcm1pc3Npb24gY2hlY2sKICAgICAgICBpZiAoISRTZWxmLT57QWNjZXNzUnd9KSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbihXaXRoSGVhZGVyID0+ICd5ZXMnKTsKICAgICAgICB9CiAgICAgICAgIyBtYW5hZ2UgcGFyYW1ldGVycwogICAgICAgIGZvcmVhY2ggKEBQYXJhbXMpIHsKICAgICAgICAgICAgaWYoISgkR2V0UGFyYW17JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICRfKSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiTmVlZCAkXyIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICMgZGIgYWN0aW9uCiAgICAgICAgbXkgJUl0ZW1EYXRhID0gJFNlbGYtPntGQVFPYmplY3R9LT5GQVFHZXQoSXRlbUlEID0+ICRHZXRQYXJhbXtJdGVtSUR9LCBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9KTsKICAgICAgICBpZiAoISVJdGVtRGF0YSkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCVJdGVtRGF0YSkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BdHRhY2htZW50KCVJdGVtRGF0YSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgICAgIH0KICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBzZWFyY2ggYSBpdGVtCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2VhcmNoJykgewogICAgICAgICRTZWxmLT5HZXRJdGVtU2VhcmNoKCk7CiAgICAgICAgJEhlYWRlclRpdGxlID0gJ1NlYXJjaCc7CiAgICAgICAgJEhlYWRlciA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKAogICAgICAgICAgICBUaXRsZSA9PiAkSGVhZGVyVGl0bGUsCiAgICAgICAgICAgIFR5cGUgPT4gJEhlYWRlclR5cGUsCiAgICAgICAgKTsKICAgICAgICAkQ29udGVudCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0ZBUScsCiAgICAgICAgICAgIERhdGEgPT4geyVGcm9udGVuZCAsICVHZXRQYXJhbSB9CiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBpdGVtIGhpc3RvcnkKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdIaXN0b3J5JykgewoKICAgICAgICAjIGNoZWNrIHBhcmFtZXRlcnMKICAgICAgICBteSAlUGFyYW1EYXRhID0gKCk7CiAgICAgICAgbXkgQFJlcXVpcmVkUGFyYW1zID0gcXcoQ2F0ZWdvcnlJRCBJdGVtSUQpOwogICAgICAgIGZvcmVhY2ggKEBSZXF1aXJlZFBhcmFtcykgewogICAgICAgICAgICAkUGFyYW1EYXRheyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAkXyk7CiAgICAgICAgICAgIGlmKCEkUGFyYW1EYXRheyRffSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcihNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGRiIGFjdGlvbgogICAgICAgICMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAjCiAgICAgICAgbXkgJUl0ZW1EYXRhID0gJFNlbGYtPntGQVFPYmplY3R9LT5GQVFHZXQoSXRlbUlEID0+ICRQYXJhbURhdGF7SXRlbUlEfSwgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSk7CiAgICAgICAgaWYgKCElSXRlbURhdGEpIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKTsKICAgICAgICB9CgogICAgICAgICMgZHRsCiAgICAgICAgIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICMKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdIaXN0b3J5JywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUl0ZW1EYXRhIH0sCiAgICAgICAgKTsKCiAgICAgICAgJEhlYWRlclRpdGxlID0gJ0hpc3RvcnknOwogICAgICAgICRGcm9udGVuZHtDc3NSb3d9ID0gJ3NlYXJjaGFjdGl2ZSc7CiAgICAgICAgbXkgQEhpc3RvcnkgPSBAeyRTZWxmLT57RkFRT2JqZWN0fS0+RkFRSGlzdG9yeUdldChJdGVtSUQgPT4gJEl0ZW1EYXRhe0l0ZW1JRH0pfTsKICAgICAgICBmb3JlYWNoIG15ICRSb3cgKEBIaXN0b3J5KSB7CgogICAgICAgICAgICAjIGNzcyBjb25maWd1cmF0aW9uCiAgICAgICAgICAgIGlmKCRGcm9udGVuZHtDc3NSb3d9IGVxICdzZWFyY2hwYXNzaXZlJykgewogICAgICAgICAgICAgICAgJEZyb250ZW5ke0Nzc1Jvd30gPSAnc2VhcmNoYWN0aXZlJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRGcm9udGVuZHtDc3NSb3d9ID0gJ3NlYXJjaHBhc3NpdmUnOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkRnJvbnRlbmR7TmFtZX0gPSAkUm93LT57TmFtZX07CiAgICAgICAgICAgICRGcm9udGVuZHtDcmVhdGVkfSA9ICRSb3ctPntDcmVhdGVkfTsKCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdIaXN0b3J5Um93JywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlRnJvbnRlbmQgfQogICAgICAgICAgICApOwoKICAgICAgICB9CgogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHN5c3RlbSBoaXN0b3J5CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU3lzdGVtSGlzdG9yeScpIHsKICAgICAgICAkU2VsZi0+R2V0U3lzdGVtSGlzdG9yeSgpOwogICAgICAgICRIZWFkZXJUaXRsZSA9ICdIaXN0b3J5JzsKICAgIH0KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGl0ZW0gcHJpbnQKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdQcmludCcgJiYgJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdJdGVtSUQnKSkgewogICAgICAgICRTZWxmLT5HZXRJdGVtUHJpbnQoTGlua3MgPT4gMSk7CiAgICAgICAgJEhlYWRlciA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UHJpbnRIZWFkZXIoCiAgICAgICAgICAgIFRpdGxlID0+ICRTZWxmLT57SXRlbURhdGF9e1N1YmplY3R9CiAgICAgICAgKTsKICAgICAgICAkTmF2aWdhdGlvbiA9ICcgJzsKICAgICAgICAkQ29udGVudCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0ZBUScsCiAgICAgICAgICAgIERhdGEgPT4geyVGcm9udGVuZCAsICVHZXRQYXJhbSB9CiAgICAgICAgKTsKICAgICAgICAkRm9vdGVyID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5QcmludEZvb3RlcigpOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGV4cGxvcmVyCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnRXhwbG9yZXInKSB7CiAgICAgICAgJFNlbGYtPkdldEV4cGxvcmVyKCk7CiAgICAgICAgJEhlYWRlclRpdGxlID0gJ0V4cGxvcmVyJzsKICAgICAgICAkSGVhZGVyID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoCiAgICAgICAgICAgIFR5cGUgPT4gJEhlYWRlclR5cGUsCiAgICAgICAgICAgIFRpdGxlID0+ICRIZWFkZXJUaXRsZQogICAgICAgICk7CiAgICAgICAgJENvbnRlbnQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdGQVEnLAogICAgICAgICAgICBEYXRhID0+IHslRnJvbnRlbmQgLCAlR2V0UGFyYW0gfQogICAgICAgICk7CgogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGl0ZW0gdmlldwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICgkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJ0l0ZW1JRCcpKSB7CiAgICAgICAgaWYoJFNlbGYtPntMYXN0RkFRTmF2fSkgewogICAgICAgICAgICAkU2VsZi0+R2V0SXRlbVNtYWxsVmlldygpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT5HZXRJdGVtVmlldyhMaW5rcyA9PiAxKTsKICAgICAgICB9CiAgICAgICAgJEhlYWRlclRpdGxlID0gJFNlbGYtPntJdGVtRGF0YX17TnVtYmVyfTsKICAgICAgICAkSGVhZGVyID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoCiAgICAgICAgICAgIFR5cGUgPT4gJEhlYWRlclR5cGUsCiAgICAgICAgICAgIFRpdGxlID0+ICRIZWFkZXJUaXRsZQogICAgICAgICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgcmVkaXJlY3QgdG8gZXhwbG9yZXIKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNlIHsKICAgICAgICBpZiAoIWRlZmluZWQoJFBhcmFte05hdn0pKSB7CiAgICAgICAgICAgICRQYXJhbXtOYXZ9ID0gJyc7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259JlN1YmFjdGlvbj1FeHBsb3JlciZOYXY9Ii4kUGFyYW17TmF2fSk7CiAgICB9CgogICAgIyBERUZBVUxUIE9VVFBVVAogICAgJERlZmF1bHRIZWFkZXIgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigKICAgICAgICBUeXBlID0+ICRIZWFkZXJUeXBlLAogICAgICAgIFRpdGxlID0+ICRIZWFkZXJUaXRsZQogICAgKTsKICAgICREZWZhdWx0TmF2aWdhdGlvbiA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgJERlZmF1bHRDb250ZW50ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudEZBUScsCiAgICAgICAgRGF0YSA9PiB7JUZyb250ZW5kICwgJUdldFBhcmFtIH0KICAgICk7CiAgICAkRGVmYXVsdEZvb3RlciA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKFR5cGUgPT4gJEZvb3RlclR5cGUpOwoKICAgICMgT1VUUFVUCiAgICAkT3V0cHV0IC49ICRIZWFkZXIgfHwgJERlZmF1bHRIZWFkZXI7CiAgICAkT3V0cHV0IC49ICROYXZpZ2F0aW9uIHx8ICREZWZhdWx0TmF2aWdhdGlvbjsKICAgIGlmKCEkTm90aWZ5KSB7CiAgICAgICAgZm9yZWFjaCBteSAkTm90aWZ5IChAeyRTZWxmLT57Tm90aWZ5fX0pIHsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vdGlmeSgKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICROb3RpZnktPlswXSwKICAgICAgICAgICAgICAgIEluZm8gPT4gJE5vdGlmeS0+WzFdLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgICRPdXRwdXQgLj0gJENvbnRlbnQgfHwgJERlZmF1bHRDb250ZW50OwogICAgJE91dHB1dCAuPSAkRm9vdGVyIHx8ICREZWZhdWx0Rm9vdGVyOwoKICAgIHJldHVybiAkT3V0cHV0Owp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0N1c3RvbWVyRkFRLnBtIC0gZmFxIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA2IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBDdXN0b21lckZBUS5wbSx2IDEuMyAyMDA2LzEwLzIwIDEyOjA2OjM3IHJrIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkN1c3RvbWVyRkFROwoKdXNlIHN0cmljdDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpGQVE7CnVzZSBLZXJuZWw6Ok1vZHVsZXM6OkZBUTsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjMgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCm91ciBASVNBID0gcXcoS2VybmVsOjpNb2R1bGVzOjpGQVEpOwoKIyAtLQpzdWIgbmV3IHsKICAgIG15ICRUeXBlID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgICMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAjCiAgICBteSAkU2VsZiA9IG5ldyBLZXJuZWw6Ok1vZHVsZXM6OkZBUSglUGFyYW0pOwogICAgYmxlc3MgKCRTZWxmLCAkVHlwZSk7CgogICAgIyBpbnRlcmZhY2Ugc2V0dGluZ3MKICAgICMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAjCiAgICAkU2VsZi0+e0ludGVyZmFjZX0gPSAkU2VsZi0+e0ZBUU9iamVjdH0tPlN0YXRlVHlwZUdldCgKICAgICAgICBOYW1lID0+ICdleHRlcm5hbCcKICAgICk7CiAgICAkU2VsZi0+e0ludGVyZmFjZVN0YXRlc30gPSAkU2VsZi0+e0ZBUU9iamVjdH0tPlN0YXRlVHlwZUxpc3QoCiAgICAgICAgVHlwZXMgPT4gWydleHRlcm5hbCcsJ3B1YmxpYyddCiAgICApOwoKICAgICMgY2hlY2sgbmVlZGVkIE9wamVjdHMKICAgICMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAjCiAgICBmb3JlYWNoIChxdyhVc2VyT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcihNZXNzYWdlID0+ICJHb3Qgbm8gJF8hIikgaWYgKCEkU2VsZi0+eyRffSk7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9CiMgLS0Kc3ViIFJ1biB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBQYXJhbXRlcgogICAgbXkgQFBhcmFtcyA9ICgpOwogICAgbXkgJUdldFBhcmFtID0gKCk7CiAgICBteSAlRnJvbnRlbmQgPSAoKTsKCiAgICAjIE91dHB1dAogICAgbXkgJE91dHB1dCA9ICcnOwogICAgbXkgJEhlYWRlciA9ICcnOwogICAgbXkgJEhlYWRlclRpdGxlID0gICcnOwogICAgbXkgJEhlYWRlclR5cGUgPSAgJyc7CiAgICBteSAkTmF2aWdhdGlvbiA9ICcnOwogICAgbXkgJE5vdGlmeSA9ICcnOwogICAgbXkgJENvbnRlbnQgPSAnJzsKICAgIG15ICRGb290ZXIgPSAnJzsKICAgIG15ICRGb290ZXJUeXBlID0gICcnOwoKICAgIG15ICREZWZhdWx0SGVhZGVyID0gJyc7CiAgICBteSAkRGVmYXVsdE5hdmlnYXRpb24gPSAnJzsKICAgIG15ICREZWZhdWx0Q29udGVudCA9ICcnOwogICAgbXkgJERlZmF1bHRGb290ZXIgPSAnJzsKCiAgICAjIG5hdmlnYXRpb24gT04vT0ZGCiAgICAjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIwogICAgaWYgKCRHZXRQYXJhbXtOYXZ9KSB7CiAgICAgICAgJEhlYWRlclR5cGUgPSAnU21hbGwnOwogICAgfSBlbHNlIHsKICAgICAgICAkSGVhZGVyVHlwZSA9ICcnOwogICAgfQogICAgIyBzdG9yZSBuYXYgcGFyYW0KICAgICRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgIEtleSA9PiAnTGFzdEZBUU5hdicsCiAgICAgICAgVmFsdWUgPT4gJEhlYWRlclR5cGUsCiAgICApOwoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGV4cGxvcmVyCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnRXhwbG9yZXInKSB7CiAgICAgICAgJFNlbGYtPkdldEV4cGxvcmVyKCk7CiAgICAgICAgJEhlYWRlclRpdGxlID0gJ0V4cGxvcmVyJzsKICAgICAgICAkSGVhZGVyID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckhlYWRlcigKICAgICAgICAgICAgVHlwZSA9PiAkSGVhZGVyVHlwZSwKICAgICAgICAgICAgVGl0bGUgPT4gJEhlYWRlclRpdGxlCiAgICAgICAgKTsKICAgICAgICAkQ29udGVudCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0ZBUScsCiAgICAgICAgICAgIERhdGEgPT4geyAlRnJvbnRlbmQgLCAlR2V0UGFyYW0gfQogICAgICAgICk7CiAgICB9CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBzZWFyY2ggYSBpdGVtCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2VhcmNoJykgewogICAgICAgICRIZWFkZXJUaXRsZSA9ICdTZWFyY2gnOwogICAgICAgICRIZWFkZXIgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVySGVhZGVyKAogICAgICAgICAgICBUeXBlID0+ICRIZWFkZXJUeXBlLAogICAgICAgICAgICBUaXRsZSA9PiAkSGVhZGVyVGl0bGUKICAgICAgICApOwogICAgICAgICRTZWxmLT5HZXRJdGVtU2VhcmNoKCk7CiAgICAgICAgJENvbnRlbnQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdGQVEnLAogICAgICAgICAgICBEYXRhID0+IHslRnJvbnRlbmQgLCAlR2V0UGFyYW0gfQogICAgICAgICk7CiAgICB9CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBkb3dubG9hZCBpdGVtCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnRG93bmxvYWQnKSB7CiAgICAgICAgIyBnZXQgcGFyYW0KICAgICAgICBteSAkSXRlbUlEICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnSXRlbUlEJyk7CiAgICAgICAgIyBkYiBhY3Rpb24KICAgICAgICBteSAlSXRlbURhdGEgPSAkU2VsZi0+e0ZBUU9iamVjdH0tPkZBUUdldChJdGVtSUQgPT4gJEl0ZW1JRCk7CiAgICAgICAgaWYgKCElSXRlbURhdGEpIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcihNZXNzYWdlID0+ICJObyBGQVEgZm91bmQhIik7CiAgICAgICAgfQogICAgICAgIGlmICgkSXRlbURhdGF7U3RhdGVUeXBlTmFtZX0gZXEgJ2V4dGVybmFsJyB8fCAkSXRlbURhdGF7U3RhdGVUeXBlTmFtZX0gZXEgJ3B1YmxpYycpIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXR0YWNobWVudCglSXRlbURhdGEpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcihNZXNzYWdlID0+ICJQZXJtaXNzaW9uIGRlbmllZCEiKTsKICAgICAgICB9CiAgICB9CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBpdGVtIHByaW50CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnUHJpbnQnICYmICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnSXRlbUlEJykpIHsKICAgICAgICAkU2VsZi0+R2V0SXRlbVByaW50KCk7CiAgICAgICAgJEhlYWRlciA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UHJpbnRIZWFkZXIoCiAgICAgICAgICAgIFRpdGxlID0+ICRTZWxmLT57SXRlbURhdGF9e1N1YmplY3R9CiAgICAgICAgKTsKICAgICAgICAkTmF2aWdhdGlvbiA9ICcgJzsKICAgICAgICAkQ29udGVudCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0ZBUScsCiAgICAgICAgICAgIERhdGEgPT4geyVGcm9udGVuZCAsICVHZXRQYXJhbSB9CiAgICAgICAgKTsKICAgICAgICAkRm9vdGVyID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5QcmludEZvb3RlcigpOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGl0ZW0gdmlldwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICgkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJ0l0ZW1JRCcpKSB7CiAgICAgICAgJFNlbGYtPkdldEl0ZW1WaWV3KCk7CiAgICAgICAgJEhlYWRlclRpdGxlID0gJFNlbGYtPntJdGVtRGF0YX17TnVtYmVyfTsKICAgICAgICAkSGVhZGVyID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckhlYWRlcigKICAgICAgICAgICAgVHlwZSA9PiAkSGVhZGVyVHlwZSwKICAgICAgICAgICAgVGl0bGUgPT4gJEhlYWRlclRpdGxlCiAgICAgICAgKTsKICAgICAgICAkQ29udGVudCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0ZBUScsCiAgICAgICAgICAgIERhdGEgPT4geyVGcm9udGVuZCAsICVHZXRQYXJhbSB9CiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyByZWRpcmVjdCB0byBleHBsb3JlcgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2UgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259JlN1YmFjdGlvbj1FeHBsb3JlciIpOwogICAgfQoKICAgICMgREVGQVVMVCBPVVRQVVQKICAgICREZWZhdWx0SGVhZGVyID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckhlYWRlcigKICAgICAgICBUeXBlID0+ICRIZWFkZXJUeXBlLAogICAgICAgIFRpdGxlID0+ICRIZWFkZXJUaXRsZQogICAgKTsKICAgICREZWZhdWx0TmF2aWdhdGlvbiA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJOYXZpZ2F0aW9uQmFyKCk7CiAgICAkRGVmYXVsdENvbnRlbnQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0N1c3RvbWVyRkFRJywKICAgICAgICBEYXRhID0+IHsgJUZyb250ZW5kICwgJUdldFBhcmFtIH0KICAgICk7CiAgICAkRGVmYXVsdEZvb3RlciA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJGb290ZXIoVHlwZSA9PiAkRm9vdGVyVHlwZSk7CgogICAgIyBPVVRQVVQKICAgICRPdXRwdXQgLj0gJEhlYWRlciB8fCAkRGVmYXVsdEhlYWRlcjsKICAgICRPdXRwdXQgLj0gJE5hdmlnYXRpb24gfHwgJERlZmF1bHROYXZpZ2F0aW9uOwogICAgaWYoISROb3RpZnkpIHsKICAgICAgICBmb3JlYWNoIG15ICROb3RpZnkgKEB7JFNlbGYtPntOb3RpZnl9fSkgewogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm90aWZ5KAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJE5vdGlmeS0+WzBdLAogICAgICAgICAgICAgICAgSW5mbyA9PiAkTm90aWZ5LT5bMV0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgJE91dHB1dCAuPSAkQ29udGVudCB8fCAkRGVmYXVsdENvbnRlbnQ7CiAgICAkT3V0cHV0IC49ICRGb290ZXIgfHwgJERlZmF1bHRGb290ZXI7CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KIyAtLQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0N1c3RvbWVyRkFRLnBtIC0gZmFxIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA2IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBQdWJsaWNGQVEucG0sdiAxLjIgMjAwNi8xMC8yMCAxMjowNjozNyByayBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpQdWJsaWNGQVE7Cgp1c2Ugc3RyaWN0Owp1c2UgS2VybmVsOjpTeXN0ZW06OkZBUTsKdXNlIEtlcm5lbDo6TW9kdWxlczo6RkFROwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9ICckUmV2aXNpb246IDEuMiAkJzsKJFZFUlNJT04gPX4gcy9eXCQuKjpcVyguKilcVy4rPyQvJDEvOwoKb3VyIEBJU0EgPSBxdyhLZXJuZWw6Ok1vZHVsZXM6OkZBUSk7CgojIC0tCnN1YiBuZXcgewogICAgbXkgJFR5cGUgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICMKICAgIG15ICRTZWxmID0gbmV3IEtlcm5lbDo6TW9kdWxlczo6RkFRKCVQYXJhbSk7CiAgICBibGVzcyAoJFNlbGYsICRUeXBlKTsKCiAgICAjIGludGVyZmFjZSBzZXR0aW5ncwogICAgIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICMKICAgICRTZWxmLT57SW50ZXJmYWNlfSA9ICRTZWxmLT57RkFRT2JqZWN0fS0+U3RhdGVUeXBlR2V0KAogICAgICAgIE5hbWUgPT4gJ3B1YmxpYycKICAgICk7CiAgICAkU2VsZi0+e0ludGVyZmFjZVN0YXRlc30gPSAkU2VsZi0+e0ZBUU9iamVjdH0tPlN0YXRlVHlwZUxpc3QoCiAgICAgICAgVHlwZXMgPT4gWydwdWJsaWMnXQogICAgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBPcGplY3RzCiAgICAjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIwogICAgZm9yZWFjaCAocXcoKSkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcihNZXNzYWdlID0+ICJHb3Qgbm8gJF8hIikgaWYgKCEkU2VsZi0+eyRffSk7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9CiMgLS0Kc3ViIFJ1biB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBQYXJhbXRlcgogICAgbXkgQFBhcmFtcyA9ICgpOwogICAgbXkgJUdldFBhcmFtID0gKCk7CiAgICBteSAlRnJvbnRlbmQgPSAoKTsKCiAgICAjIE91dHB1dAogICAgbXkgJE91dHB1dCA9ICcnOwogICAgbXkgJEhlYWRlciA9ICcnOwogICAgbXkgJEhlYWRlclRpdGxlID0gICcnOwogICAgbXkgJEhlYWRlclR5cGUgPSAgJyc7CiAgICBteSAkTmF2aWdhdGlvbiA9ICcnOwogICAgbXkgJE5vdGlmeSA9ICcnOwogICAgbXkgJENvbnRlbnQgPSAnJzsKICAgIG15ICRGb290ZXIgPSAnJzsKICAgIG15ICRGb290ZXJUeXBlID0gICcnOwoKICAgIG15ICREZWZhdWx0SGVhZGVyID0gJyc7CiAgICBteSAkRGVmYXVsdE5hdmlnYXRpb24gPSAnJzsKICAgIG15ICREZWZhdWx0Q29udGVudCA9ICcnOwogICAgbXkgJERlZmF1bHRGb290ZXIgPSAnJzsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBleHBsb3JlcgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGlmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0V4cGxvcmVyJykgewogICAgICAgICRIZWFkZXJUaXRsZSA9ICdFeHBsb3Jlcic7CiAgICAgICAgJEhlYWRlciA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJIZWFkZXIoCiAgICAgICAgICAgIFR5cGUgPT4gJEhlYWRlclR5cGUsCiAgICAgICAgICAgIFRpdGxlID0+ICRIZWFkZXJUaXRsZQogICAgICAgICk7CiAgICAgICAgJFNlbGYtPkdldEV4cGxvcmVyKCk7CiAgICAgICAgJENvbnRlbnQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdGQVEnLAogICAgICAgICAgICBEYXRhID0+IHslRnJvbnRlbmQgLCAlR2V0UGFyYW0gfQogICAgICAgICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgc2VhcmNoIGEgaXRlbQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1NlYXJjaCcpIHsKICAgICAgICAkSGVhZGVyVGl0bGUgPSAnU2VhcmNoJzsKICAgICAgICAkSGVhZGVyID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckhlYWRlcigKICAgICAgICAgICAgVHlwZSA9PiAkSGVhZGVyVHlwZSwKICAgICAgICAgICAgVGl0bGUgPT4gJEhlYWRlclRpdGxlCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+R2V0SXRlbVNlYXJjaCgpOwogICAgICAgICRDb250ZW50ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnRkFRJywKICAgICAgICAgICAgRGF0YSA9PiB7JUZyb250ZW5kICwgJUdldFBhcmFtIH0KICAgICAgICApOwogICAgfQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgZG93bmxvYWQgaXRlbQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0Rvd25sb2FkJykgewogICAgICAgICMgZ2V0IHBhcmFtCiAgICAgICAgbXkgJEl0ZW1JRCAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJ0l0ZW1JRCcpOwogICAgICAgICMgZGIgYWN0aW9uCiAgICAgICAgbXkgJUl0ZW1EYXRhID0gJFNlbGYtPntGQVFPYmplY3R9LT5GQVFHZXQoSXRlbUlEID0+ICRJdGVtSUQpOwogICAgICAgIGlmICghJUl0ZW1EYXRhKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiTm8gRkFRIGZvdW5kISIpOwogICAgICAgIH0KICAgICAgICBpZiAoJEl0ZW1EYXRhe1N0YXRlVHlwZU5hbWV9IGVxICdwdWJsaWMnKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkF0dGFjaG1lbnQoJUl0ZW1EYXRhKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiUGVybWlzc2lvbiBkZW5pZWQhIik7CiAgICAgICAgfQogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGl0ZW0gcHJpbnQKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdQcmludCcgJiYgJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdJdGVtSUQnKSkgewogICAgICAgICRIZWFkZXIgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlByaW50SGVhZGVyKAogICAgICAgICAgICBUaXRsZSA9PiAkU2VsZi0+e0l0ZW1EYXRhfXtTdWJqZWN0fQogICAgICAgICk7CiAgICAgICAgJFNlbGYtPkdldEl0ZW1QcmludCgpOwogICAgICAgICRDb250ZW50ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnRkFRJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVGcm9udGVuZCAsICVHZXRQYXJhbSB9CiAgICAgICAgKTsKICAgICAgICAkRm9vdGVyID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5QcmludEZvb3RlcigpOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGl0ZW0gdmlldwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICgkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJ0l0ZW1JRCcpKSB7CiAgICAgICAgJFNlbGYtPkdldEl0ZW1WaWV3KCk7CiAgICAgICAgJEhlYWRlclRpdGxlID0gJFNlbGYtPntJdGVtRGF0YX17TnVtYmVyfTsKICAgICAgICAkSGVhZGVyID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckhlYWRlcigKICAgICAgICAgICAgVHlwZSA9PiAkSGVhZGVyVHlwZSwKICAgICAgICAgICAgVGl0bGUgPT4gJEhlYWRlclRpdGxlCiAgICAgICAgKTsKICAgICAgICAkQ29udGVudCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0ZBUScsCiAgICAgICAgICAgIERhdGEgPT4geyVGcm9udGVuZCAsICVHZXRQYXJhbSB9CiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyByZWRpcmVjdCB0byBleHBsb3JlcgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2UgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259JlN1YmFjdGlvbj1FeHBsb3JlciIpOwogICAgfQoKICAgICMgREVGQVVMVCBPVVRQVVQKICAgICREZWZhdWx0SGVhZGVyID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckhlYWRlcigKICAgICAgICBUeXBlID0+ICRIZWFkZXJUeXBlLAogICAgICAgIFRpdGxlID0+ICRIZWFkZXJUaXRsZQogICAgKTsKCiAgICAkRGVmYXVsdENvbnRlbnQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ1B1YmxpY0ZBUScsCiAgICAgICAgRGF0YSA9PiB7ICVGcm9udGVuZCAsICVHZXRQYXJhbSB9CiAgICApOwogICAgJERlZmF1bHRGb290ZXIgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyRm9vdGVyKFR5cGUgPT4gJEZvb3RlclR5cGUpOwoKICAgICMgT1VUUFVUCiAgICAkT3V0cHV0IC49ICRIZWFkZXIgfHwgJERlZmF1bHRIZWFkZXI7CiAgICBpZighJE5vdGlmeSkgewogICAgICAgIGZvcmVhY2ggbXkgJE5vdGlmeSAoQHskU2VsZi0+e05vdGlmeX19KSB7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAkTm90aWZ5LT5bMF0sCiAgICAgICAgICAgICAgICBJbmZvID0+ICROb3RpZnktPlsxXSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICAkT3V0cHV0IC49ICRDb250ZW50IHx8ICREZWZhdWx0Q29udGVudDsKICAgICRPdXRwdXQgLj0gJEZvb3RlciB8fCAkRGVmYXVsdEZvb3RlcjsKCiAgICByZXR1cm4gJE91dHB1dDsKfQojIC0tCgoxOwo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9BZ2VudC5wbSAtIHByb3ZpZGVzIGdlbmVyaWMgYWdlbnQgSFRNTCBvdXRwdXQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNiBNYXJ0aW4gRWRlbmhvZmVyIDxtYXJ0aW4rY29kZUBvdHJzLm9yZz4KIyAtLQojICRJZDogTGF5b3V0RkFRLnBtLHYgMS4xLjEuMSAyMDA2LzA2LzI5IDA5OjI5OjUxIGN0IEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0RkFROwoKdXNlIHN0cmljdDsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjEuMS4xICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87CgojIC0tCgpzdWIgQWdlbnRGQVFDYXRlZ29yeUxpc3RPcHRpb24gewoKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICRPdXRwdXQgPSAnJzsKICAgIG15ICRTaXplID0gZGVmaW5lZCgkUGFyYW17U2l6ZX0pID8gInNpemU9JyRQYXJhbXtTaXplfSciIDogJyc7CiAgICBteSAkTWF4TGV2ZWwgPSBkZWZpbmVkKCRQYXJhbXtNYXhMZXZlbH0pID8gJFBhcmFte01heExldmVsfSA6IDEwOwogICAgbXkgJFNlbGVjdGVkID0gZGVmaW5lZCgkUGFyYW17U2VsZWN0ZWR9KSA/ICRQYXJhbXtTZWxlY3RlZH0gOiAnJzsKICAgIG15ICRTZWxlY3RlZElEcyA9ICRQYXJhbXtTZWxlY3RlZElEc30gfHwgW107CiAgICBteSAkU2VsZWN0ZWRJRCA9IGRlZmluZWQoJFBhcmFte1NlbGVjdGVkSUR9KSA/ICRQYXJhbXtTZWxlY3RlZElEfSA6ICcnOwogICAgbXkgJE11bHRpcGxlID0gJFBhcmFte011bHRpcGxlfSA/ICdtdWx0aXBsZScgOiAnJzsKICAgIG15ICRPbkNoYW5nZVN1Ym1pdCA9IGRlZmluZWQoJFBhcmFte09uQ2hhbmdlU3VibWl0fSkgPyAkUGFyYW17T25DaGFuZ2VTdWJtaXR9IDogMDsKICAgIGlmICgkT25DaGFuZ2VTdWJtaXQpIHsKICAgICAgICAkT25DaGFuZ2VTdWJtaXQgPSAiIG9uY2hhbmdlPVwic3VibWl0KClcIiI7CiAgICB9CiAgICBpZiAoJFBhcmFte09uQ2hhbmdlfSkgewogICAgICAgICRPbkNoYW5nZVN1Ym1pdCA9ICIgb25jaGFuZ2U9XCIkUGFyYW17T25DaGFuZ2V9XCIiOwogICAgfQoKICAgIGlmIChkZWZpbmVkKCRQYXJhbXtTZWxlY3RlZElEfSkpIHsKICAgICAgICAkU2VsZWN0ZWRJRHMgPSBbJFNlbGVjdGVkSURdOwogICAgfQoKICAgIG15ICVDYXRlZ29yeUxpc3QgPSAleyRQYXJhbXtDYXRlZ29yeUxpc3R9fTsKICAgICNpZiAoISgkUGFyYW17Q2F0ZWdvcnlMaXN0fSAmJiByZWYoJFBhcmFte0NhdGVnb3J5TGlzdH0pIGVxICdIQVNIJyAmJiAleyRQYXJhbXtDYXRlZ29yeUxpc3R9fSkpIHsKICAgICMgICAgcmV0dXJuICRTZWxmLT5GYXRhbEVycm9yKAogICAgIyAgICAgICAgTWVzc2FnZSA9PiAnTmVlZCBDYXRlZ29yeUxpc3QgYXMgaGFzaCByZWYgJwogICAgIyAgICApOwogICAgI30KCiAgICAjIGJ1aWxkIHRyZWUgbGlzdAogICAgJE91dHB1dCAuPSAnPHNlbGVjdCBuYW1lPSInLiRQYXJhbXtOYW1lfS4iXCIgJFNpemUgJE11bHRpcGxlICRPbkNoYW5nZVN1Ym1pdD4iOwoKICAgIGlmKCRQYXJhbXtSb290RWxlbWVudH0pIHsKICAgICAgICAkT3V0cHV0IC49ICc8b3B0aW9uIHZhbHVlPSIwIj4tPC9vcHRpb24+JzsKICAgIH0KCiAgICBpZiAoJFBhcmFte0NhdGVnb3J5TGlzdH0gJiYgcmVmKCRQYXJhbXtDYXRlZ29yeUxpc3R9KSBlcSAnSEFTSCcgJiYgJXskUGFyYW17Q2F0ZWdvcnlMaXN0fX0pIHsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT5BZ2VudEZBUUNhdGVnb3J5TGlzdE9wdGlvbkVsZW1lbnQoCiAgICAgICAgICAgIENhdGVnb3J5TGlzdCA9PiBcJUNhdGVnb3J5TGlzdCwKICAgICAgICAgICAgTGV2ZWxDb3VudGVyID0+IDAsCiAgICAgICAgICAgIFBhcmVudElEID0+IDAsCiAgICAgICAgICAgIFNlbGVjdGVkSURzID0+ICRTZWxlY3RlZElEcwogICAgICAgICk7CiAgICB9CiAgICAkT3V0cHV0IC49ICc8L3NlbGVjdD4nOwoKICAgIHJldHVybiAkT3V0cHV0Owp9CgoKc3ViIEFnZW50RkFRQ2F0ZWdvcnlMaXN0T3B0aW9uRWxlbWVudCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAkT3V0cHV0ID0gJyc7CgogICAgbXkgJUNhdGVnb3J5TGlzdCA9ICV7ICRQYXJhbXtDYXRlZ29yeUxpc3R9IH07CiAgICBteSAlQ2F0ZWdvcnlMZXZlbExpc3QgPSAlIHsgJENhdGVnb3J5TGlzdHskUGFyYW17UGFyZW50SUR9fX07CiAgICBteSBAU2VsZWN0ZWRJRHMgPSBAeyRQYXJhbXtTZWxlY3RlZElEc319OwogICAgbXkgJEZsYWcgPSAwOwoKICAgIGZvcmVhY2ggbXkgJENhdGVnb3J5SUQgKHNvcnQoIHsgJENhdGVnb3J5TGV2ZWxMaXN0eyRhfSBjbXAgJENhdGVnb3J5TGV2ZWxMaXN0eyRifSB9IGtleXMoJUNhdGVnb3J5TGV2ZWxMaXN0KSkpIHsKICAgICAgICAkT3V0cHV0IC49ICc8b3B0aW9uIHZhbHVlPSInLiRDYXRlZ29yeUlELiciJzsKICAgICAgICBmb3IobXkgJGk9MDskaTxAU2VsZWN0ZWRJRHM7JGkrKykgewogICAgICAgICAgIGlmKCRQYXJhbXtTZWxlY3RlZElEc31bJGldIGVxICRDYXRlZ29yeUlEKSB7CiAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJyBzZWxlY3RlZCc7CiAgICAgICAgICAgfSAgICAgICAgICAgCiAgICAgICAgfQogICAgICAgICRPdXRwdXQgLj0gJz4nOwogICAgICAgIGZvcihteSAkaT0wOyRpPCRQYXJhbXtMZXZlbENvdW50ZXJ9OyRpKyspIHsKICAgICAgICAgICAgJE91dHB1dCAuPSAnJm5ic3A7Jm5ic3A7JzsKICAgICAgICB9CiAgICAgICAgJE91dHB1dCAuPSAkQ2F0ZWdvcnlMZXZlbExpc3R7JENhdGVnb3J5SUR9OwogICAgICAgICRPdXRwdXQgLj0gJzwvb3B0aW9uPic7CiAgICAgICAgaWYoZXhpc3RzKCRDYXRlZ29yeUxpc3R7JENhdGVnb3J5SUR9KSkgewogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT5BZ2VudEZBUUNhdGVnb3J5TGlzdE9wdGlvbkVsZW1lbnQoCiAgICAgICAgICAgICAgICBDYXRlZ29yeUxpc3QgPT4gXCVDYXRlZ29yeUxpc3QsCiAgICAgICAgICAgICAgICBMZXZlbENvdW50ZXIgPT4gJFBhcmFte0xldmVsQ291bnRlcn0rMSwKICAgICAgICAgICAgICAgIFBhcmVudElEID0+ICRDYXRlZ29yeUlELAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRHMgPT4gXEBTZWxlY3RlZElEcwogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAkT3V0cHV0Owp9CgoKCnN1YiBHZXRGQVFJdGVtVm90aW5nUmF0ZUNvbG9yIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICBpZiAoISRQYXJhbXtSYXRlfSkgewogICAgICAgIHJldHVybiAkU2VsZi0+RmF0YWxFcnJvcigKICAgICAgICAgICAgTWVzc2FnZSA9PiAnTmVlZCByYXRlIScKICAgICAgICApOwogICAgfQogICAgbXkgJENzc1RtcCA9ICcnOwogICAgbXkgJVZvdGluZ1Jlc3VsdENvbG9ycyA9ICV7JFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ZBUTo6RXhwbG9yZXI6Okl0ZW1MaXN0OjpWb3RpbmdSZXN1bHRDb2xvcnMnKX07CiAgICBmb3JlYWNoIG15ICRLZXkgKHNvcnQoIHsgJGIgPD0+ICRhIH0ga2V5cyglVm90aW5nUmVzdWx0Q29sb3JzKSkpIHsKICAgICAgICBpZigkUGFyYW17UmF0ZX0gPD0gJEtleSkgewogICAgICAgICAgICAkQ3NzVG1wID0gJFZvdGluZ1Jlc3VsdENvbG9yc3skS2V5fTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gJENzc1RtcDsKfQoKCjE7Cg==
IyAtLQojIEZBUS5kdGwgLSBwcm92aWRlcyBIVE1MIHZpZXcgZm9yIGZhcSBhcnRpY2xlcwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA2IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBGQVEuZHRsLHYgMS4zIDIwMDYvMTAvMjUgMTA6MDY6MTkgcmsgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgoKPCEtLSBkdGw6YmxvY2s6VmlldyAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJWaWV3In06ICRDb25maWd7IkZBUTo6RkFRSG9vayJ9ICRRRGF0YXsiTnVtYmVyIn0kRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1lbnUiPgogICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JkNhdGVnb3J5SUQ9JERhdGF7IkNhdGVnb3J5SUQifSI+JFRleHR7IkJhY2sifTwvYT4gLQogICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1QcmludCZDYXRlZ29yeUlEPSREYXRheyJDYXRlZ29yeUlEIn0mSXRlbUlEPSREYXRheyJJdGVtSUQifSIgdGFyZ2V0PSJwcmludCI+JFRleHR7IlByaW50In08L2E+CiAgICA8L3RkPgogICAgPHRkIGFsaWduPSJyaWdodCIgY2xhc3M9Im1lbnUiPgoKICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgd2lkdGg9Ijc1JSIgY2xhc3M9Im1haW5ib2R5Ij4KCjwhLS0gZHRsOmJsb2NrOkZBUVBhdGhDYXRlZ29yeUVsZW1lbnQgLS0+CiAgICAgICRDb25maWd7IkZBUTo6RXhwbG9yZXI6OlBhdGg6OlNlcGVyYXRvciJ9IDxiPjxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPUV4cGxvcmVyJkNhdGVnb3J5SUQ9JERhdGF7IkNhdGVnb3J5SUQifSI+JFFEYXRheyJOYW1lIn08L2E+PC9iPgo8IS0tIGR0bDpibG9jazpGQVFQYXRoQ2F0ZWdvcnlFbGVtZW50IC0tPgoKICAgICAgPGgxPiRRRGF0YXsiVGl0bGUifTwvaDE+Cgo8IS0tIGR0bDpibG9jazpGQVFJdGVtVmlld0F0dGFjaG1lbnQgLS0+CiAgICAgIDxiPiRUZXh0eyJBdHRhY2htZW50In06PC9iPgogICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1Eb3dubG9hZCZJdGVtSUQ9JFFEYXRheyJJdGVtSUQifSI+JFFEYXRheyJGaWxlbmFtZSJ9PC9hPgo8IS0tIGR0bDpibG9jazpGQVFJdGVtVmlld0F0dGFjaG1lbnQgLS0+CgogICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiT3B0aW9ucyJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgo8IS0tIGR0bDpibG9jazpGQVFJdGVtRmllbGQgLS0+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIyNSUiIGNsYXNzPSJjb250ZW50a2V5IiB2YWxpZ249InRvcCI+JFRleHR7IiREYXRheyJDYXB0aW9uIn0ifTogIDxicj4gPGkgY2xhc3M9InNtYWxsIj4oJFRleHR7IiREYXRheyJTdGF0ZU5hbWUifSJ9KTwvaT48L3RkPgogICAgICAgICAgICAgICAgPHRkIHdpZHRoPSI3NSUiIGNsYXNzPSJjb250ZW50dmFsdWUiPjxwcmU+JERhdGF7IlZhbHVlIn08L3ByZT48L3RkPgogICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkZBUUl0ZW1GaWVsZCAtLT4KCiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50aGVhZCI+Jm5ic3A7PC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgoKICAgIDwvdGQ+CiAgICA8dGQgd2lkdGg9IjM1JSIgY2xhc3M9Im1lbnUiPgoKICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iOTUlIj4KICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ2F0ZWdvcnkifTo8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiAkUURhdGF7IkNhdGVnb3J5In08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlN0YXRlIn06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4gJFFEYXRheyJTdGF0ZSJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJMYW5ndWFnZSJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+ICRRRGF0YXsiTGFuZ3VhZ2UifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiS2V5d29yZHMifTo8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiAkUURhdGF7IktleXdvcmRzIn08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlJlc3VsdCJ9OjwvdGQ+CiAgICAgICAgICA8dGQgc3R5bGU9IiREYXRheyJDc3NDb2x1bW5Wb3RpbmdSZXN1bHQifSI+ICRRRGF0YXsiUmVzdWx0In0gJiMzNzs8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlZvdGVzIn06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4gJFFEYXRheyJWb3RlcyJ9PC90ZD4KICAgICAgICA8L3RyPgoKICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgPHRkPiZuYnNwOzwvdGQ+CiAgICAgICAgICA8dGQ+Jm5ic3A7PC90ZD4KICAgICAgICA8L3RyPgoKICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ3JlYXRlZCJ9OiA8L2I+PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kVGltZUxvbmd7IiREYXRheyJDcmVhdGVkIn0ifSAoJERhdGF7IkNyZWF0ZWRCeUxvZ2luIn0pPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDaGFuZ2VkIn08L2I+PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kVGltZUxvbmd7IiREYXRheyJDaGFuZ2VkIn0ifSAoJERhdGF7IkNoYW5nZWRCeUxvZ2luIn0pPC90ZD4KICAgICAgICA8L3RyPgoKICAgICAgICA8YnI+CiAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KICAgICAgICAgIDx0ZD4mbmJzcDs8L3RkPgogICAgICAgICAgPHRkPiZuYnNwOzwvdGQ+CiAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6TGlua3MgLS0+CiAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkxpbmtlZCJ9ICgkVGV4dHsiTm9ybWFsIn0pOjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CjwhLS0gZHRsOmJsb2NrOkxpbmtOb3JtYWwgLS0+CiAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JFFEYXRheyJGcm9udGVuZERlc3QifSRRRGF0YXsiSUQifSIgdGl0bGU9IiRRRGF0YXsiT2JqZWN0In06ICRRRGF0YXsiTnVtYmVyIn0iPiRRRGF0YXsiVGV4dCJ9PC9hPgo8IS0tIGR0bDpibG9jazpMaW5rTm9ybWFsIC0tPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgoKICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTGlua2VkIn0gKCRUZXh0eyJQYXJlbnQifSk6PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KPCEtLSBkdGw6YmxvY2s6TGlua1BhcmVudCAtLT4KICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kUURhdGF7IkZyb250ZW5kRGVzdCJ9JFFEYXRheyJJRCJ9IiB0aXRsZT0iJFFEYXRheyJPYmplY3QifTogJFFEYXRheyJOdW1iZXIifSI+JFFEYXRheyJUZXh0In08L2E+CjwhLS0gZHRsOmJsb2NrOkxpbmtQYXJlbnQgLS0+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CgogICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJMaW5rZWQifSAoJFRleHR7IkNoaWxkIn0pOjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CjwhLS0gZHRsOmJsb2NrOkxpbmtDaGlsZCAtLT4KICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kUURhdGF7IkZyb250ZW5kRGVzdCJ9JFFEYXRheyJJRCJ9IiB0aXRsZT0iJFFEYXRheyJPYmplY3QifTogJFFEYXRheyJOdW1iZXIifSI+JFFEYXRheyJUZXh0In08L2E+CjwhLS0gZHRsOmJsb2NrOkxpbmtDaGlsZCAtLT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6TGlua3MgLS0+CiAgICAgIDwvdGFibGU+Cgo8IS0tIGR0bDpibG9jazpWb3RlRm9ybSAtLT4KICAgICAgPGgzPiRUZXh0eyIkQ29uZmlneyJGQVE6Okl0ZW06OlZvdGluZzo6UXVlc3Rpb25MYW5nS2V5In0ifTwvaDM+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0ic3BlbGxpbmciPgogICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSI+CiAgICAgICAgICA8dHI+CjwhLS0gZHRsOmJsb2NrOlZvdGluZ1JhdGVSb3cgLS0+CiAgICAgICAgICAgIDx0ZD48aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9IlJhdGUiIHZhbHVlPSIkUURhdGF7IlZhbHVlIn0iPjxicj4gJFFEYXRheyJUaXRsZSJ9PC90ZD4KPCEtLSBkdGw6YmxvY2s6Vm90aW5nUmF0ZVJvdyAtLT4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90YWJsZT4KCiAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0iYnRuIiB2YWx1ZT0iJFRleHR7IlN1Ym1pdCJ9IiBjbGFzcz0iYnV0dG9uIj4KCiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlZvdGUiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkNhdGVnb3J5SUQiIHZhbHVlPSIkRGF0YXsiQ2F0ZWdvcnlJRCJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJJdGVtSUQiIHZhbHVlPSIkRGF0YXsiSXRlbUlEIn0iPgogICAgICA8L2Zvcm0+CjwhLS0gZHRsOmJsb2NrOlZvdGVGb3JtIC0tPgoKICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6VmlldyAtLT4KCgoKCgoKCgoKCjwhLS0gZHRsOmJsb2NrOlByaW50IC0tPgoKPGgxPiREYXRheyJUaXRsZSJ9PC9oMT4KCjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiIGNvbHM9IjIiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkQ29uZmlneyJGQVE6OkZBUUhvb2sifTogJFFEYXRheyJOdW1iZXIifQogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDYXRlZ29yeSJ9OiA8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiAkUXVvdGV7IiREYXRheyJDYXRlZ29yeU5hbWUifSJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlN0YXRlIn06IDwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+ICRRdW90ZXsiJERhdGF7IlN0YXRlIn0ifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJMYW5ndWFnZSJ9OiA8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiAkUXVvdGV7IiREYXRheyJMYW5ndWFnZSJ9In08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiS2V5d29yZHMifTogPC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4gJFF1b3RleyIkRGF0YXsiS2V5d29yZHMifSJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlZvdGVzIn06IDwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+ICRRRGF0YXsiVm90ZXMifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJSZXN1bHQifTogPC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4gJFFEYXRheyJSZXN1bHQifSAmIzM3OzwvdGQ+CiAgICAgICAgPC90cj4KCiMgLS0KIyBvYmplY3QgbGlua3MKIyAtLQo8IS0tIGR0bDpibG9jazpMaW5rcyAtLT4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJMaW5rZWQifSAoJFRleHR7Ik5vcm1hbCJ9KTo8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgoKPCEtLSBkdGw6YmxvY2s6TGlua05vcm1hbCAtLT4KICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifSREYXRheyJGcm9udGVuZERlc3QifSRRRGF0YXsiSUQifSIgdGl0bGU9IiRRRGF0YXsiT2JqZWN0In06ICRRRGF0YXsiTnVtYmVyIn0iPiRRRGF0YXsiVGV4dCJ9PC9hPgo8IS0tIGR0bDpibG9jazpMaW5rTm9ybWFsIC0tPgoKICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KCiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTGlua2VkIn0gKCRUZXh0eyJQYXJlbnQifSk6PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KCjwhLS0gZHRsOmJsb2NrOkxpbmtQYXJlbnQgLS0+CiAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn0kRGF0YXsiRnJvbnRlbmREZXN0In0kUURhdGF7IklEIn0iIHRpdGxlPSIkUURhdGF7Ik9iamVjdCJ9OiAkUURhdGF7Ik51bWJlciJ9Ij4kUURhdGF7IlRleHQifTwvYT4KPCEtLSBkdGw6YmxvY2s6TGlua1BhcmVudCAtLT4KCiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkxpbmtlZCJ9ICgkVGV4dHsiQ2hpbGQifSk6PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KCjwhLS0gZHRsOmJsb2NrOkxpbmtDaGlsZCAtLT4KICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifSREYXRheyJGcm9udGVuZERlc3QifSRRRGF0YXsiSUQifSIgdGl0bGU9IiRRRGF0YXsiT2JqZWN0In06ICRRRGF0YXsiTnVtYmVyIn0iPiRRRGF0YXsiVGV4dCJ9PC9hPgo8IS0tIGR0bDpibG9jazpMaW5rQ2hpbGQgLS0+CgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpMaW5rcyAtLT4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJMYXN0IHVwZGF0ZSJ9OiA8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiAkUXVvdGV7IiRUaW1lTG9uZ3siJERhdGF7IkNoYW5nZWQifSJ9In08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNvbHNwYW49IjIiPjxocj48L3RkPgogICAgICAgIDwvdHI+Cgo8IS0tIGR0bDpibG9jazpGQVFJdGVtRmllbGQgLS0+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJERhdGF7IkNhcHRpb24ifSJ9OiAgPGJyPiA8aSBjbGFzcz0ic21hbGwiPigkVGV4dHsiJERhdGF7IlN0YXRlTmFtZSJ9In08L2k+KSA8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxwcmU+JERhdGF7IlZhbHVlIn08L3ByZT48L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNvbHNwYW49IjIiPjxocj48L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgo8IS0tIGR0bDpibG9jazpGQVFJdGVtRmllbGQgLS0+CgogICAgICAgIDwvdGFibGU+CiAgICAgIDwvdGQ+CiAgICA8L3RyPgogIDwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOlByaW50IC0tPgoKCgoKCgoKCjwhLS0gZHRsOmJsb2NrOlNlYXJjaCAtLT4KCiAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICA8dHI+CiAgICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJTZWFyY2gifTogJENvbmZpZ3siRkFROjpGQVFIb29rIn0kRW52eyJCb3gxIn0KICAgICAgPC90ZD4KICAgIDwvdHI+CiAgICA8dHI+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiBjbGFzcz0ibWFpbmJvZHkiPgoKICAgICAgICA8YnI+CgogICAgICAgIDx0YWJsZSB3aWR0aD0iNjAwIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJPcHRpb25zIn08L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CgogICAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0iZ2V0Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlNlYXJjaCI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJtaXQiIHZhbHVlPSJ5ZXMiPgogICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iMjUlIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ik51bWJlciJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iNzUlIiBjbGFzcz0iY29udGVudHZhbHVlIiBjb2xzcGFuPSIzIj4gPGlucHV0IHR5cGU9InRleHQiIG5hbWU9Ik51bWJlciIgdmFsdWU9IiRRRGF0YXsiTnVtYmVyIn0iIHNpemU9IjUwIiBtYXhsZW5ndGg9IjUwIj48L3RkPgogICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVGl0bGUifTogPC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgY29sc3Bhbj0iMyI+IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJUaXRsZSIgdmFsdWU9IiRRRGF0YXsiVGl0bGUifSIgc2l6ZT0iNTAiIG1heGxlbmd0aD0iNTAiPjwvdGQ+CiAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJGdWxsdGV4dCJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIiBjb2xzcGFuPSIzIj4gPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IldoYXQiIHZhbHVlPSIkUURhdGF7IldoYXQifSIgc2l6ZT0iNTAiIG1heGxlbmd0aD0iNTAiPjwvdGQ+CiAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJLZXl3b3JkIn06IDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIGNvbHNwYW49IjMiPiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iS2V5d29yZCIgdmFsdWU9IiRRRGF0YXsiS2V5d29yZCJ9IiBzaXplPSI1MCIgbWF4bGVuZ3RoPSI1MCI+PC90ZD4KICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJMYW5ndWFnZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiTGFuZ3VhZ2VPcHRpb24ifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkNhdGVnb3J5In06PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJDYXRlZ29yeU9wdGlvbiJ9PC90ZD4KICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDwvdGFibGU+CgogICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPiA8aW5wdXQgYWNjZXNza2V5PSJnIiBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiU2VhcmNoIn0iPjwvdGQ+CiAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8L3RhYmxlPgogICAgICAgIDwvZm9ybT4KCiAgICAgICAgPGJyPgoKICAgICAgPC90ZD4KICAgIDwvdHI+CiAgPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6U2VhcmNoIC0tPgoKCgoKCgo8IS0tIGR0bDpibG9jazpTZWFyY2hSZXN1bHQgLS0+CiAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICA8dHI+CiAgICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJTZWFyY2gifTogJENvbmZpZ3siRkFROjpGQVFIb29rIn0kRW52eyJCb3gxIn0KICAgICAgPC90ZD4KICAgIDwvdHI+CiAgICA8dHI+CiAgICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiPgogICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiPgogICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50aGVhZCI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JENvbmZpZ3siRkFROjpGQVFIb29rIn08L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUaXRsZSJ9PC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ2F0ZWdvcnkifTwvdGQ+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ikxhbmd1YWdlIn08L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTdGF0ZSJ9PC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ2hhbmdlZCJ9PC90ZD4KICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlNlYXJjaFJlc3VsdFJvdyAtLT4KICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzUm93In0iPjxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mSXRlbUlEPSRRRGF0YXsiSXRlbUlEIn0iPiRRRGF0YXsiTnVtYmVyIn08L2E+PC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc1JvdyJ9Ij4kUURhdGF7IlRpdGxlIn08L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzUm93In0iPiRRRGF0YXsiQ2F0ZWdvcnkifTwvdGQ+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NSb3cifSI+JFFEYXRheyJMYW5ndWFnZSJ9PC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc1JvdyJ9Ij4kUURhdGF7IlN0YXRlIn08L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzUm93In0iPigkVGltZUxvbmd7IiREYXRheyJDaGFuZ2VkIn0ifSk8L3RkPgogICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6U2VhcmNoUmVzdWx0Um93IC0tPgogICAgICAgIDwvdGFibGU+CiAgICAgIDwvdGQ+CiAgICA8L3RyPgogIDwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOlNlYXJjaFJlc3VsdCAtLT4KCgoKCgoKCgo8IS0tIGR0bDpibG9jazpFeHBsb3Jlci0tPgogIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgPHRyPgogICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgICAkRW52eyJCb3gwIn0kVGV4dHsiRXhwbG9yZXIifTogJENvbmZpZ3siRkFROjpGQVFIb29rIn0kRW52eyJCb3gxIn0KICAgICAgPC90ZD4KICAgIDwvdHI+CiAgICA8dHI+CiAgICAgIDx0ZCB3aWR0aD0iNzUlIiBjbGFzcz0ibWVudSI+CjwhLS08YSBocmVmPSIkRW52eyJCYXNlbGluayJ9JEVudnsiTGFzdFNjcmVlblZpZXcifSI+JFRleHR7IkJhY2sifTwvYT4tLT4KICAgICAgPC90ZD4KICAgICAgPHRkIHdpZHRoPSIzNSUiIGNsYXNzPSJtZW51Ij4KICAgICAgICAmbmJzcDsKICAgICAgPC90ZD4KICAgIDwvdHI+CiAgICA8dHI+CiAgICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiPgoKCjwhLS0gZHRsOmJsb2NrOkZBUVBhdGhDYXRlZ29yeUVsZW1lbnQgLS0+CiAgICAgICAgJENvbmZpZ3siRkFROjpFeHBsb3Jlcjo6UGF0aDo6U2VwZXJhdG9yIn0gPGI+PGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249JEVudnsiU3ViYWN0aW9uIn0mQ2F0ZWdvcnlJRD0kRGF0YXsiQ2F0ZWdvcnlJRCJ9Ij4kUURhdGF7Ik5hbWUifTwvYT48L2I+CjwhLS0gZHRsOmJsb2NrOkZBUVBhdGhDYXRlZ29yeUVsZW1lbnQgLS0+Cgo8IS0tIGR0bDpibG9jazpFeHBsb3JlclRpdGxlIC0tPgogICAgICAgIDxoMT4kUURhdGF7Ik5hbWUifTwvaDE+CiAgICAgICAgPHA+JFFEYXRheyJDb21tZW50In08L3A+CjwhLS0gZHRsOmJsb2NrOkV4cGxvcmVyVGl0bGUgLS0+CgoKCjwhLS0gZHRsOmJsb2NrOkV4cGxvcmVyQ2F0ZWdvcnlMaXN0IC0tPgogICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjEwMCUiPgogICAgICAgICAgPGNvbGdyb3VwPjxjb2wgd2lkdGg9IjE1IiAvPjxjb2wgd2lkdGg9IioiIC8+PGNvbCB3aWR0aD0iMTAwIiAvPjxjb2wgd2lkdGg9IjEwMCIgLz48L2NvbGdyb3VwPgogICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50aGVhZCI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgY29sc3Bhbj0iMiI+CiAgICAgICAgICAgICAgJFRleHR7Ik5hbWUifSAvCiAgICAgICAgICAgICAgJFRleHR7IkNvbW1lbnQifQogICAgICAgICAgICA8L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICRUZXh0eyJTdWJDYXRlZ29yaWVzIn0KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAkVGV4dHsiQXJ0aWNsZSJ9CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpFeHBsb3JlckNhdGVnb3J5Um93IC0tPgogICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NSb3cifSIgdmFsaWduPSJ0b3AiPjxpbWcgc3JjPSIkRW52eyJJbWFnZXMifSRDb25maWd7IkZBUTo6Q2F0ZWdvcnk6Okljb24ifSI+PC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc1JvdyJ9Ij4KICAgICAgICAgICAgICA8Yj48YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj0kRW52eyJTdWJhY3Rpb24ifSZDYXRlZ29yeUlEPSRRRGF0YXsiQ2F0ZWdvcnlJRCJ9Ij4kUURhdGF7Ik5hbWUifTwvYT48L2I+CiAgICAgICAgICAgICAgPGJyPiRRRGF0YXsiQ29tbWVudCJ9Jm5ic3A7CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NSb3cifSI+CiAgICAgICAgICAgICAgJFFEYXRheyJDYXRlZ29yeU51bWJlciJ9CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NSb3cifSI+CiAgICAgICAgICAgICAgJFFEYXRheyJBcnRpY2xlTnVtYmVyIn0KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkV4cGxvcmVyQ2F0ZWdvcnlSb3cgLS0+CiAgICAgICAgPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6RXhwbG9yZXJDYXRlZ29yeUxpc3QgLS0+CgogICAgICAgIDxicj4KCjwhLS0gZHRsOmJsb2NrOkV4cGxvcmVyRkFRSXRlbUxpc3QgLS0+CiAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiI+CiAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRoZWFkIj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAkVGV4dHsiVGl0bGUifQogICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPUV4cGxvcmVyJkNhdGVnb3J5SUQ9JFFEYXRheyJDYXRlZ29yeUlEIn0mT3JkZXI9VGl0bGUmU29ydD11cCI+PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn11cC1zbWFsbC5wbmciIGFsdD0iJFRleHR7InVwIn0iPjwvYT4mbmJzcDsvCiAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249RXhwbG9yZXImQ2F0ZWdvcnlJRD0kUURhdGF7IkNhdGVnb3J5SUQifSZPcmRlcj1UaXRsZSZTb3J0PWRvd24iPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRFbnZ7IkltYWdlcyJ9ZG93bi1zbWFsbC5wbmciIGFsdD0iJFRleHR7ImRvd24ifSI+PC9hPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICRUZXh0eyJMYW5ndWFnZSJ9CiAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249RXhwbG9yZXImQ2F0ZWdvcnlJRD0kUURhdGF7IkNhdGVnb3J5SUQifSZPcmRlcj1MYW5ndWFnZSZTb3J0PXVwIj48aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifXVwLXNtYWxsLnBuZyIgYWx0PSIkVGV4dHsidXAifSI+PC9hPiZuYnNwOy8KICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1FeHBsb3JlciZDYXRlZ29yeUlEPSRRRGF0YXsiQ2F0ZWdvcnlJRCJ9Jk9yZGVyPUxhbmd1YWdlJlNvcnQ9ZG93biI+PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn1kb3duLXNtYWxsLnBuZyIgYWx0PSIkVGV4dHsiZG93biJ9Ij48L2E+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgJFRleHR7IlN0YXRlIn0KICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1FeHBsb3JlciZDYXRlZ29yeUlEPSRRRGF0YXsiQ2F0ZWdvcnlJRCJ9Jk9yZGVyPVN0YXRlJlNvcnQ9dXAiPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRFbnZ7IkltYWdlcyJ9dXAtc21hbGwucG5nIiBhbHQ9IiRUZXh0eyJ1cCJ9Ij48L2E+Jm5ic3A7LwogICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPUV4cGxvcmVyJkNhdGVnb3J5SUQ9JFFEYXRheyJDYXRlZ29yeUlEIn0mT3JkZXI9U3RhdGUmU29ydD1kb3duIj48aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifWRvd24tc21hbGwucG5nIiBhbHQ9IiRUZXh0eyJkb3duIn0iPjwvYT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAkVGV4dHsiUmVzdWx0In0gKCYjMzc7KQogICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPUV4cGxvcmVyJkNhdGVnb3J5SUQ9JFFEYXRheyJDYXRlZ29yeUlEIn0mT3JkZXI9UmVzdWx0JlNvcnQ9dXAiPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRFbnZ7IkltYWdlcyJ9dXAtc21hbGwucG5nIiBhbHQ9IiRUZXh0eyJ1cCJ9Ij48L2E+Jm5ic3A7LwogICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPUV4cGxvcmVyJkNhdGVnb3J5SUQ9JFFEYXRheyJDYXRlZ29yeUlEIn0mT3JkZXI9UmVzdWx0JlNvcnQ9ZG93biI+PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn1kb3duLXNtYWxsLnBuZyIgYWx0PSIkVGV4dHsiZG93biJ9Ij48L2E+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgJFRleHR7IlZvdGVzIn0KICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1FeHBsb3JlciZDYXRlZ29yeUlEPSREYXRheyJDYXRlZ29yeUlEIn0mT3JkZXI9Vm90ZXMmU29ydD11cCI+PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn11cC1zbWFsbC5wbmciIGFsdD0iJFRleHR7InVwIn0iPjwvYT4mbmJzcDsvCiAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249RXhwbG9yZXImQ2F0ZWdvcnlJRD0kRGF0YXsiQ2F0ZWdvcnlJRCJ9Jk9yZGVyPVZvdGVzJlNvcnQ9ZG93biI+PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn1kb3duLXNtYWxsLnBuZyIgYWx0PSIkVGV4dHsiZG93biJ9Ij48L2E+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgoKPCEtLSBkdGw6YmxvY2s6RXhwbG9yZXJGQVFJdGVtUm93IC0tPgogICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NSb3cifSI+PGltZyBzcmM9IiRFbnZ7IkltYWdlcyJ9JENvbmZpZ3siRkFROjpJdGVtOjpJY29uIn0iIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7Ij4mbmJzcDs8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JkNhdGVnb3J5SUQ9JFFEYXRheyJDYXRlZ29yeUlEIn0mSXRlbUlEPSRRRGF0YXsiSXRlbUlEIn0iPiRRRGF0YXsiVGl0bGUifTwvYT48L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzUm93In0iPiRRRGF0YXsiTGFuZ3VhZ2UifTwvdGQ+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NSb3cifSI+JFFEYXRheyJTdGF0ZSJ9PC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc1JvdyJ9IiBzdHlsZT0iJERhdGF7IkNzc0NvbHVtblZvdGluZ1Jlc3VsdCJ9Ij4kUURhdGF7IlJlc3VsdCJ9PC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc1JvdyJ9Ij4kUURhdGF7IlZvdGVzIn08L3RkPgogICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6RXhwbG9yZXJGQVFJdGVtUm93IC0tPgogICAgICAgIDwvdGFibGU+Cgo8IS0tIGR0bDpibG9jazpFeHBsb3JlckZBUUl0ZW1MaXN0IC0tPgoKCgoKCiAgICAgIDwvdGQ+CiAgICAgIDx0ZCBjbGFzcz0ibWVudSI+CgoKPCEtLSBkdGw6YmxvY2s6RXhwbG9yZXJRdWlja1NlYXJjaCAtLT4KICAgICAgICA8aDM+JFRleHR7IlF1aWNrU2VhcmNoIn08L2gzPgogICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQmFzZWxpbmsifSIgbWV0aG9kPSJnZXQiIHN0eWxlPSJtYXJnaW46MHB4O3BhZGRpbmc6MHB4OyI+CiAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJTZWFyY2giPgogICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3VibWl0IiB2YWx1ZT0ieWVzIj4KCjwhLS0gZHRsOmJsb2NrOkV4cGxvcmVyUXVpY2tTZWFyY2hDYXRlZ29yeSAtLT4KICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkNhdGVnb3J5SURzIiB2YWx1ZT0iJERhdGF7IkNhdGVnb3J5SUQifSI+CjwhLS0gZHRsOmJsb2NrOkV4cGxvcmVyUXVpY2tTZWFyY2hDYXRlZ29yeSAtLT4KCiAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJRdWlja1NlYXJjaCIgdmFsdWU9IjEiPgogICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQ2F0ZWdvcnlJRHMiIHZhbHVlPSIkRGF0YXsiQ2F0ZWdvcnlJRCJ9Ij4KICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJXaGF0IiB2YWx1ZT0iJFFEYXRheyJXaGF0In0iIHNpemU9IjMwIiBtYXhsZW5ndGg9IjUwIj48aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IlNlYXJjaCJ9Ij48YnI+CiAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1TZWFyY2giPiRUZXh0eyJEZXRhaWxTZWFyY2gifTwvYT4KICAgICAgICA8L2Zvcm0+CjwhLS0gZHRsOmJsb2NrOkV4cGxvcmVyUXVpY2tTZWFyY2ggLS0+CgoKPCEtLSBkdGw6YmxvY2s6RXhwbG9yZXJMYXRlc3RDcmVhdGUgLS0+CiAgICAgICAgPGgzPiRUZXh0eyJMYXRlc3RDcmVhdGVkSXRlbXMifTwvaDM+CiAgICAgICAgPHVsIHN0eWxlPSJwYWRkaW5nLWxlZnQ6MHB4O2xpc3Qtc3R5bGUtaW1hZ2U6dXJsKCRFbnZ7IkltYWdlcyJ9JENvbmZpZ3siRkFROjpJdGVtOjpJY29uIn0pOyI+CjwhLS0gZHRsOmJsb2NrOkV4cGxvcmVyTGF0ZXN0Q3JlYXRlRkFRSXRlbVJvdyAtLT4KICAgICAgICA8bGk+CiAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZDYXRlZ29yeUlEPSRRRGF0YXsiQ2F0ZWdvcnlJRCJ9Jkl0ZW1JRD0kUURhdGF7Ikl0ZW1JRCJ9Ij4kUURhdGF7IlRpdGxlIn0gKCRRRGF0YXsiQ2F0ZWdvcnlOYW1lIn0pPC9hPiAkUURhdGF7Ikxhbmd1YWdlIn0gPGJyPgogICAgICAgIDxpPiRUaW1lTG9uZ3siJERhdGF7IkNyZWF0ZWQifSJ9PC9pPgogICAgICAgIDwvbGk+CjwhLS0gZHRsOmJsb2NrOkV4cGxvcmVyTGF0ZXN0Q3JlYXRlRkFRSXRlbVJvdyAtLT4KICAgICAgICA8L3VsPgo8IS0tIGR0bDpibG9jazpFeHBsb3JlckxhdGVzdENyZWF0ZSAtLT4KCgo8IS0tIGR0bDpibG9jazpFeHBsb3JlckxhdGVzdENoYW5nZSAtLT4KICAgICAgICA8aDM+JFRleHR7IkxhdGVzdENoYW5nZWRJdGVtcyJ9PC9oMz4KICAgICAgICA8dWwgc3R5bGU9InBhZGRpbmctbGVmdDowcHg7bGlzdC1zdHlsZS1pbWFnZTp1cmwoJEVudnsiSW1hZ2VzIn0kQ29uZmlneyJGQVE6Okl0ZW06Okljb24ifSk7Ij4KPCEtLSBkdGw6YmxvY2s6RXhwbG9yZXJMYXRlc3RDaGFuZ2VGQVFJdGVtUm93IC0tPgogICAgICAgIDxsaT4KICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JkNhdGVnb3J5SUQ9JFFEYXRheyJDYXRlZ29yeUlEIn0mSXRlbUlEPSRRRGF0YXsiSXRlbUlEIn0iPiRRRGF0YXsiVGl0bGUifSAoJFFEYXRheyJDYXRlZ29yeU5hbWUifSk8L2E+ICRRRGF0YXsiTGFuZ3VhZ2UifSA8YnI+CiAgICAgICAgPGk+JFRpbWVMb25neyIkRGF0YXsiQ2hhbmdlZCJ9In08L2k+CiAgICAgICAgPC9saT4KPCEtLSBkdGw6YmxvY2s6RXhwbG9yZXJMYXRlc3RDaGFuZ2VGQVFJdGVtUm93IC0tPgogICAgICAgIDwvdWw+CjwhLS0gZHRsOmJsb2NrOkV4cGxvcmVyTGF0ZXN0Q2hhbmdlIC0tPgoKCiAgICAgIDwvdGQ+CiAgICA8L3RyPgogIDwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOkV4cGxvcmVyIC0tPgo=
IyAtLQojIEFnZW50RkFRLmR0bCAtIHByb3ZpZGVzIEhUTUwgdmlldyBmb3IgZmFxIGFydGljbGVzCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDYgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50RkFRLmR0bCx2IDEuNCAyMDA2LzEyLzEzIDEyOjQ1OjU0IHJrIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKCgo8IS0tIGR0bDpibG9jazpWaWV3IC0tPgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7IlZpZXcifTogJENvbmZpZ3siRkFROjpGQVFIb29rIn0gJFFEYXRheyJOdW1iZXIifSRFbnZ7IkJveDEifQogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWVudSI+CiAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mQ2F0ZWdvcnlJRD0kRGF0YXsiQ2F0ZWdvcnlJRCJ9Ij4kVGV4dHsiQmFjayJ9PC9hPiAtCiAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPVVwZGF0ZSZDYXRlZ29yeUlEPSREYXRheyJDYXRlZ29yeUlEIn0mSXRlbUlEPSREYXRheyJJdGVtSUQifSI+JFRleHR7IkVkaXQifTwvYT4gLQogICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1IaXN0b3J5JkNhdGVnb3J5SUQ9JERhdGF7IkNhdGVnb3J5SUQifSZJdGVtSUQ9JERhdGF7Ikl0ZW1JRCJ9Ij4kVGV4dHsiSGlzdG9yeSJ9PC9hPiAtCiAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPVByaW50JkNhdGVnb3J5SUQ9JERhdGF7IkNhdGVnb3J5SUQifSZJdGVtSUQ9JERhdGF7Ikl0ZW1JRCJ9IiB0YXJnZXQ9InByaW50Ij4kVGV4dHsiUHJpbnQifTwvYT4gLQogICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPUFnZW50TGlua09iamVjdCZTb3VyY2VPYmplY3Q9RkFRJkNhdGVnb3J5SUQ9JERhdGF7IkNhdGVnb3J5SUQifSZTb3VyY2VJRD0kRGF0YXsiSXRlbUlEIn0iPiRUZXh0eyJMaW5rIn08L2E+IC0KICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249RGVsZXRlJkNhdGVnb3J5SUQ9JERhdGF7IkNhdGVnb3J5SUQifSZJdGVtSUQ9JERhdGF7Ikl0ZW1JRCJ9Ij4kVGV4dHsiRGVsZXRlIn08L2E+CiAgICA8L3RkPgogICAgPHRkIGFsaWduPSJyaWdodCIgY2xhc3M9Im1lbnUiPgoKICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgd2lkdGg9Ijc1JSIgY2xhc3M9Im1haW5ib2R5Ij4KCgo8IS0tIGR0bDpibG9jazpGQVFQYXRoQ2F0ZWdvcnlFbGVtZW50IC0tPgogICAgICAkQ29uZmlneyJGQVE6OkV4cGxvcmVyOjpQYXRoOjpTZXBlcmF0b3IifSA8Yj48YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1FeHBsb3JlciZDYXRlZ29yeUlEPSREYXRheyJDYXRlZ29yeUlEIn0iPiRRRGF0YXsiTmFtZSJ9PC9hPjwvYj4KPCEtLSBkdGw6YmxvY2s6RkFRUGF0aENhdGVnb3J5RWxlbWVudCAtLT4KCjwhLS0gZHRsOmJsb2NrOkZBUVBhdGhJdGVtRWxlbWVudCAtLT4KICAgICAgJENvbmZpZ3siRkFROjpFeHBsb3Jlcjo6UGF0aDo6U2VwZXJhdG9yIn0gPGI+PGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZDYXRlZ29yeUlEPSRRRGF0YXsiQ2F0ZWdvcnlJRCJ9Jkl0ZW1JRD0kUURhdGF7Ikl0ZW1JRCJ9Ij4kUURhdGF7IlRpdGxlIn08L2E+PC9iPgo8IS0tIGR0bDpibG9jazpGQVFQYXRoSXRlbUVsZW1lbnQgLS0+CgoKICAgICAgPGgxPiRRRGF0YXsiVGl0bGUifTwvaDE+CgogICAgICA8cD4KCjwhLS0gZHRsOmJsb2NrOkZBUUl0ZW1WaWV3QXR0YWNobWVudCAtLT4KICAgICAgICA8Yj4kVGV4dHsiQXR0YWNobWVudCJ9OjwvYj4KICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1Eb3dubG9hZCZJdGVtSUQ9JFFEYXRheyJJdGVtSUQifSI+JFFEYXRheyJGaWxlbmFtZSJ9PC9hPgo8IS0tIGR0bDpibG9jazpGQVFJdGVtVmlld0F0dGFjaG1lbnQgLS0+CgogICAgICA8L3A+CgogICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiT3B0aW9ucyJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgo8IS0tIGR0bDpibG9jazpGQVFJdGVtRmllbGQgLS0+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIyNSUiIGNsYXNzPSJjb250ZW50a2V5IiB2YWxpZ249InRvcCI+JFRleHR7IiREYXRheyJDYXB0aW9uIn0ifTogIDxicj4gPGkgY2xhc3M9InNtYWxsIj4oJFRleHR7IiREYXRheyJTdGF0ZU5hbWUifSJ9KTwvaT48L3RkPgogICAgICAgICAgICAgICAgPHRkIHdpZHRoPSI3NSUiIGNsYXNzPSJjb250ZW50dmFsdWUiPjxwcmU+JERhdGF7IlZhbHVlIn08L3ByZT48L3RkPgogICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkZBUUl0ZW1GaWVsZCAtLT4KCiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50aGVhZCI+Jm5ic3A7PC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgoKICAgIDwvdGQ+CiAgICA8dGQgd2lkdGg9IjM1JSIgY2xhc3M9Im1lbnUiPgogICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSI5NSUiPgogICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDYXRlZ29yeSJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+ICRRRGF0YXsiQ2F0ZWdvcnkifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiU3RhdGUifTo8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiAkUURhdGF7IlN0YXRlIn08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ikxhbmd1YWdlIn06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4gJFFEYXRheyJMYW5ndWFnZSJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJLZXl3b3JkcyJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+ICRRRGF0YXsiS2V5d29yZHMifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiUmVzdWx0In06PC90ZD4KICAgICAgICAgIDx0ZCBzdHlsZT0iJERhdGF7IkNzc0NvbHVtblZvdGluZ1Jlc3VsdCJ9Ij4gJFFEYXRheyJSZXN1bHQifSAmIzM3OzwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVm90ZXMifTo8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiAkUURhdGF7IlZvdGVzIn08L3RkPgogICAgICAgIDwvdHI+CgogICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiAgICAgICAgICA8dGQ+Jm5ic3A7PC90ZD4KICAgICAgICAgIDx0ZD4mbmJzcDs8L3RkPgogICAgICAgIDwvdHI+CgogICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDcmVhdGVkIn06IDwvYj48L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRUaW1lTG9uZ3siJERhdGF7IkNyZWF0ZWQifSJ9ICgkRGF0YXsiQ3JlYXRlZEJ5TG9naW4ifSk8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkNoYW5nZWQifTwvYj48L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRUaW1lTG9uZ3siJERhdGF7IkNoYW5nZWQifSJ9ICgkRGF0YXsiQ2hhbmdlZEJ5TG9naW4ifSk8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPGJyPgogICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiAgICAgICAgICA8dGQ+Jm5ic3A7PC90ZD4KICAgICAgICAgIDx0ZD4mbmJzcDs8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkxpbmtlZCJ9ICgkVGV4dHsiTm9ybWFsIn0pOjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CjwhLS0gZHRsOmJsb2NrOkxpbmtOb3JtYWwgLS0+CiAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn0kRGF0YXsiRnJvbnRlbmREZXN0In0kUURhdGF7IklEIn0iIHRpdGxlPSIkUURhdGF7Ik9iamVjdCJ9OiAkUURhdGF7Ik51bWJlciJ9Ij4kUURhdGF7IlRleHQifTwvYT4KPCEtLSBkdGw6YmxvY2s6TGlua05vcm1hbCAtLT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KCiAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkxpbmtlZCJ9ICgkVGV4dHsiUGFyZW50In0pOjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CjwhLS0gZHRsOmJsb2NrOkxpbmtQYXJlbnQgLS0+CiAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn0kRGF0YXsiRnJvbnRlbmREZXN0In0kUURhdGF7IklEIn0iIHRpdGxlPSIkUURhdGF7Ik9iamVjdCJ9OiAkUURhdGF7Ik51bWJlciJ9Ij4kUURhdGF7IlRleHQifTwvYT4KPCEtLSBkdGw6YmxvY2s6TGlua1BhcmVudCAtLT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KCiAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkxpbmtlZCJ9ICgkVGV4dHsiQ2hpbGQifSk6PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KPCEtLSBkdGw6YmxvY2s6TGlua0NoaWxkIC0tPgogICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9JERhdGF7IkZyb250ZW5kRGVzdCJ9JFFEYXRheyJJRCJ9IiB0aXRsZT0iJFFEYXRheyJPYmplY3QifTogJFFEYXRheyJOdW1iZXIifSI+JFFEYXRheyJUZXh0In08L2E+CjwhLS0gZHRsOmJsb2NrOkxpbmtDaGlsZCAtLT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KCiAgICAgIDwvdGFibGU+Cgo8IS0tIGR0bDpibG9jazpWb3RlRm9ybSAtLT4KICAgICAgPGgzPiRUZXh0eyIkQ29uZmlneyJGQVE6Okl0ZW06OlZvdGluZzo6UXVlc3Rpb25MYW5nS2V5In0ifTwvaDM+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0ic3BlbGxpbmciPgogICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSI+CiAgICAgICAgICA8dHI+CjwhLS0gZHRsOmJsb2NrOlZvdGluZ1JhdGVSb3cgLS0+CiAgICAgICAgICAgIDx0ZD48aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9IlJhdGUiIHZhbHVlPSIkUURhdGF7IlZhbHVlIn0iPjxicj4gJFFEYXRheyJUaXRsZSJ9PC90ZD4KPCEtLSBkdGw6YmxvY2s6Vm90aW5nUmF0ZVJvdyAtLT4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90YWJsZT4KCiAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0iYnRuIiB2YWx1ZT0iJFRleHR7IlN1Ym1pdCJ9IiBjbGFzcz0iYnV0dG9uIj4KCiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iQWdlbnRGQVEiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlZvdGUiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkNhdGVnb3J5SUQiIHZhbHVlPSIkRGF0YXsiQ2F0ZWdvcnlJRCJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJJdGVtSUQiIHZhbHVlPSIkRGF0YXsiSXRlbUlEIn0iPgogICAgICA8L2Zvcm0+CjwhLS0gZHRsOmJsb2NrOlZvdGVGb3JtIC0tPgoKICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6VmlldyAtLT4KCgoKPCEtLSBkdGw6YmxvY2s6Vmlld1NtYWxsIC0tPgo8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgo8IS0tCgpmdW5jdGlvbiB1cGRhdGVNZXNzYWdlKCkKewogICAgaWYgKHBhcmVudC5vcGVuZXIuY2xvc2VkKSB7CiAgICAgICAgYWxlcnQoJyRUZXh0eyJUaGUgbWVzc2FnZSBiZWluZyBjb21wb3NlZCBoYXMgYmVlbiBjbG9zZWQuICBFeGl0aW5nLiJ9Jyk7CiAgICAgICAgdGhpcy5jbG9zZSgpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoIXBhcmVudC5vcGVuZXIuZG9jdW1lbnQuY29tcG9zZSkgewogICAgICAgIGFsZXJ0KCckVGV4dHsiVGhpcyB3aW5kb3cgbXVzdCBiZSBjYWxsZWQgZnJvbSBjb21wb3NlIHdpbmRvdyJ9Jyk7CiAgICAgICAgdGhpcy5jbG9zZSgpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBwYXJlbnQub3BlbmVyLmRvY3VtZW50LmNvbXBvc2UuQm9keS52YWx1ZSA9IGRvY3VtZW50LnNwZWxsaW5nLkJvZHkudmFsdWUgKyBwYXJlbnQub3BlbmVyLmRvY3VtZW50LmNvbXBvc2UuQm9keS52YWx1ZQogICAgcGFyZW50Lm9wZW5lci5kb2N1bWVudC5jb21wb3NlLlN1YmplY3QudmFsdWUgPSBkb2N1bWVudC5zcGVsbGluZy5UaXRsZS52YWx1ZQoKICAgIHRoaXMuY2xvc2UoKTsKfQoKLy8tLT4KPC9zY3JpcHQ+Cgo8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG5hbWU9InNwZWxsaW5nIj4KCiAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyIgY29scz0iMiI+CiAgICA8dHI+CiAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAgICRFbnZ7IkJveDAifSRDb25maWd7IkZBUTo6RkFRSG9vayJ9OiAkUURhdGF7Ik51bWJlciJ9JEVudnsiQm94MSJ9CiAgICAgIDwvdGQ+CiAgICA8L3RyPgogICAgPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+CiAgICAgIDx0ZCB3aWR0aD0iMTAwJSIgY2xhc3M9Im1haW5ib2R5Ij4KCgo8IS0tIGR0bDpibG9jazpGQVFQYXRoQ2F0ZWdvcnlFbGVtZW50IC0tPgogICAgICAgICRDb25maWd7IkZBUTo6RXhwbG9yZXI6OlBhdGg6OlNlcGVyYXRvciJ9IDxiPjxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPUV4cGxvcmVyJkNhdGVnb3J5SUQ9JERhdGF7IkNhdGVnb3J5SUQifSI+JFFEYXRheyJOYW1lIn08L2E+PC9iPgo8IS0tIGR0bDpibG9jazpGQVFQYXRoQ2F0ZWdvcnlFbGVtZW50IC0tPgoKPCEtLSBkdGw6YmxvY2s6RkFRUGF0aEl0ZW1FbGVtZW50IC0tPgogICAgICAgICRDb25maWd7IkZBUTo6RXhwbG9yZXI6OlBhdGg6OlNlcGVyYXRvciJ9IDxiPjxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mQ2F0ZWdvcnlJRD0kUURhdGF7IkNhdGVnb3J5SUQifSZJdGVtSUQ9JFFEYXRheyJJdGVtSUQifSI+JFFEYXRheyJUaXRsZSJ9PC9hPjwvYj4KPCEtLSBkdGw6YmxvY2s6RkFRUGF0aEl0ZW1FbGVtZW50IC0tPgoKCiAgICAgICAgPGgxPiRRRGF0YXsiVGl0bGUifTwvaDE+CgogICAgICAgIDxwPgo8IS0tIGR0bDpibG9jazpGQVFJdGVtVmlld0F0dGFjaG1lbnQgLS0+CiAgICAgICAgICA8Yj4kVGV4dHsiQXR0YWNobWVudCJ9OjwvYj4KICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPURvd25sb2FkJkl0ZW1JRD0kUURhdGF7Ikl0ZW1JRCJ9Ij4kUURhdGF7IkZpbGVuYW1lIn08L2E+CjwhLS0gZHRsOmJsb2NrOkZBUUl0ZW1WaWV3QXR0YWNobWVudCAtLT4KICAgICAgICA8L3A+CgogICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JENvbmZpZ3siRkFROjpGQVFIb29rIn06IDwvdGQ+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4gJFFEYXRheyJOdW1iZXIifTwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUaXRsZSJ9OiA8L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+ICRRRGF0YXsiVGl0bGUifTwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDYXRlZ29yeSJ9OiA8L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+ICRRRGF0YXsiQ2F0ZWdvcnkifTwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTdGF0ZSJ9OiA8L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+ICRRRGF0YXsiU3RhdGUifTwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJMYW5ndWFnZSJ9OiA8L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+ICRRRGF0YXsiTGFuZ3VhZ2UifTwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJLZXl3b3JkcyJ9OiA8L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+ICRRRGF0YXsiS2V5d29yZHMifTwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiUmVzdWx0In06PC90ZD4KICAgICAgICAgICAgPHRkIHN0eWxlPSIkRGF0YXsiQ3NzQ29sdW1uVm90aW5nUmVzdWx0In0iPiAkUURhdGF7IlJlc3VsdCJ9ICYjMzc7PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJWb3RlcyJ9OjwvdGQ+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4gJFFEYXRheyJWb3RlcyJ9PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj48aHI+PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4KICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUaXRsZSIgdmFsdWU9IiRRRGF0YXsiVGl0bGUifSI+CiAgICAgICAgICAgICAgPHByZT4KICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBuYW1lPSJCb2R5IiByb3dzPSIxNCIgY29scz0iJENvbmZpZ3siVGlja2V0OjpGcm9udGVuZDo6VGV4dEFyZWFFbWFpbCJ9IiB3cmFwPSIkRW52eyJCcm93c2VyV3JhcCJ9Ij4KICAgICAgICAgICAgICAgICREYXRheyJJdGVtRmllbGRWYWx1ZXMifQogICAgICAgICAgICAgICAgPC90ZXh0YXJlYT4KICAgICAgICAgICAgICA8L3ByZT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj48aHI+PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90YWJsZT4KCiAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9ImJ1dHRvbiIgb25jbGljaz0idXBkYXRlTWVzc2FnZSgpOyIgdmFsdWU9IiRUZXh0eyJEb25lIn0iPgogICAgICAgIDxpPigkVGV4dHsiUmV0dXJuIHRvIHRoZSBjb21wb3NlIHNjcmVlbiJ9KTwvaT4KCiAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9ImJ1dHRvbiIgb25jbGljaz0id2luZG93LmNsb3NlKCk7IiB2YWx1ZT0iJFRleHR7IkNhbmNlbCJ9Ij4KICAgICAgICA8aT4oJFRleHR7IkRpc2NhcmQgYWxsIGNoYW5nZXMgYW5kIHJldHVybiB0byB0aGUgY29tcG9zZSBzY3JlZW4ifSk8L2k+CgogICAgICAgIDxocj4KCiAgICAgIDwvdGQ+CiAgICA8L3RyPgogIDwvdGFibGU+Cgo8L3RkPgo8L3RyPgo8L3RhYmxlPgo8IS0tIGR0bDpibG9jazpWaWV3U21hbGwgLS0+CgoKCgo8IS0tIGR0bDpibG9jazpIaXN0b3J5IC0tPgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KPHRyPgo8dGQgY2xhc3M9Im1haW5oZWFkIj4KICAkRW52eyJCb3gwIn0kVGV4dHsiSGlzdG9yeSJ9OiAkQ29uZmlneyJGQVE6OkZBUUhvb2sifSAkUURhdGF7Ik51bWJlciJ9JEVudnsiQm94MSJ9CjwvdGQ+CjwvdHI+Cjx0cj4KPHRkIGNsYXNzPSJtZW51Ij4KICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JkNhdGVnb3J5SUQ9JERhdGF7IkNhdGVnb3J5SUQifSZJdGVtSUQ9JERhdGF7Ikl0ZW1JRCJ9Ij4kVGV4dHsiQmFjayJ9PC9hPgo8L3RkPgo8dHI+CiAgPHRkIGNsYXNzPSJtYWluYm9keSI+CgogICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiI+CiAgICAgIDx0ciBjbGFzcz0iY29udGVudGhlYWQiPgogICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkFjdGlvbiJ9PC90ZD4KICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUaW1lIn08L3RkPgogICAgICA8L3RyPgoKPCEtLSBkdGw6YmxvY2s6SGlzdG9yeVJvdyAtLT4KICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgPHRkIGNsYXNzPSIkRGF0YXsiQ3NzUm93In0iPiRUZXh0eyIkRGF0YXsiTmFtZSJ9In08L3RkPgogICAgICAgIDx0ZCBjbGFzcz0iJERhdGF7IkNzc1JvdyJ9Ij4oJFRpbWVMb25neyIkRGF0YXsiQ3JlYXRlZCJ9In0pPC90ZD4KICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6SGlzdG9yeVJvdyAtLT4KCiAgICA8L3RhYmxlPgogIDwvdGQ+CjwvdHI+CjwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOkhpc3RvcnkgLS0+CgoKCgoKCgo8IS0tIGR0bDpibG9jazpBZGQgLS0+CjxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+CjwhLS0KZnVuY3Rpb24gc3VibWl0X2NvbXBvc2UoKQp7CiAgICBpZiAoZG9jdW1lbnQuY29tcG9zZS5UaXRsZS52YWx1ZSA9PSAiIikgewogICAgICAgIGFsZXJ0KCckVGV4dHsiQSBhcnRpY2xlIHNob3VsZCBoYXZlIGEgdGl0bGUhIn0nKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLlRpdGxlLmZvY3VzKCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9Cn0KLy8tLT4KPC9zY3JpcHQ+Cgo8IS0tIHN0YXJ0IGZvcm0gLS0+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiIGNvbHM9IjIiPgo8dHI+CiAgPHRkIGFsaWduPSJsZWZ0IiBjb2xzcGFuPSIyIiBjbGFzcz0ibWFpbmhlYWQiPgogICAgJEVudnsiQm94MCJ9JFRleHR7Ik5ldyBGQVEgQXJ0aWNsZSJ9JEVudnsiQm94MSJ9CiAgPC90ZD4KPC90cj4KPHRyPgogIDx0ZCB3aWR0aD0iMTAwJSIgY2xhc3M9Im1haW5ib2R5Ij4KCiAgICA8YnI+CgogICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjcwMCIgYWxpZ249ImNlbnRlciIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgPHRyPgogICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJPcHRpb25zIn08L3RkPgogICAgICA8L3RyPgogICAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CgogICAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBuYW1lPSJjb21wb3NlIj4KICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJBZGRBY3Rpb24iPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJJdGVtSUQiIHZhbHVlPSIkRGF0YXsiSXRlbUlEIn0iPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlRpdGxlIn06IDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJUaXRsZSIgdmFsdWU9IiREYXRheyJUaXRsZSJ9IiBzaXplPSI3NSIgbWF4bGVuZ3RoPSIxMjAiPjwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJLZXl3b3JkcyJ9OiA8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iS2V5d29yZHMiIHZhbHVlPSIkRGF0YXsiS2V5d29yZHMifSIgc2l6ZT0iNzUiIG1heGxlbmd0aD0iMTIwIj48L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIyMCUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ2F0ZWdvcnkifTogPC90ZD4KICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iODAlIiBjbGFzcz0iY29udGVudHZhbHVlIj4gJERhdGF7IkNhdGVnb3J5T3B0aW9uIn08L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiU3RhdGUifTogPC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4gJERhdGF7IlN0YXRlT3B0aW9uIn08L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTGFuZ3VhZ2UifTogPC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4gJERhdGF7Ikxhbmd1YWdlT3B0aW9uIn0gPC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkF0dGFjaG1lbnQifTo8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxpbnB1dCBuYW1lPSJmaWxlX3VwbG9hZCIgdHlwZT0iZmlsZSIgc2l6ZT0iNDAiIGNsYXNzPSJmaXhlZCI+Jm5ic3A7PGEgbmFtZT0iYXR0YWNobWVudCI+PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj48aHI+PC90ZD4KICAgICAgICAgICAgICA8L3RyPgoKPCEtLSBkdGw6YmxvY2s6RkFRSXRlbUZpZWxkIC0tPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiREYXRheyJDYXB0aW9uIn0ifTogIDxicj4gPGkgY2xhc3M9InNtYWxsIj4oJFRleHR7IiREYXRheyJTdGF0ZU5hbWUifSJ9KTwvaT4gPC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj48dGV4dGFyZWEgbmFtZT0iJERhdGF7IktleSJ9IiByb3dzPSIxMiIgY29scz0iNzUiIHdyYXA9IiRFbnZ7IkJyb3dzZXJXcmFwIn0iPiREYXRheyJWYWx1ZSJ9PC90ZXh0YXJlYT48L3RyPgogICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPjxocj48L3RkPgogICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpGQVFJdGVtRmllbGQgLS0+CgogICAgICAgICAgICAgICAgPC90YWJsZT4KCiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+PGlucHV0IGFjY2Vzc2tleT0iZyIgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7InN1Ym1pdCJ9IiBvbmNsaWNrPSJyZXR1cm4gc3VibWl0X2NvbXBvc2UoKTsiPjwvdGQ+CiAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8L3RhYmxlPgogICAgICAgIDwvZm9ybT4KCiAgICAgICAgPGJyPgoKICAgICAgPC90ZD4KICAgIDwvdHI+CiAgPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6QWRkIC0tPgoKCgoKCgoKPCEtLSBkdGw6YmxvY2s6VXBkYXRlIC0tPgo8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgo8IS0tCmZ1bmN0aW9uIHN1Ym1pdF9jb21wb3NlKCkKewogICAgaWYgKGRvY3VtZW50LmNvbXBvc2UuVGl0bGUudmFsdWUgPT0gIiIpIHsKICAgICAgICBhbGVydCgnJFRleHR7IkEgYXJ0aWNsZSBzaG91bGQgaGF2ZSBhIHRpdGxlISJ9Jyk7CiAgICAgICAgZG9jdW1lbnQuY29tcG9zZS5UaXRsZS5mb2N1cygpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQp9Ci8vLS0+Cjwvc2NyaXB0PgoKCiAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICA8dHI+CiAgICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJFZGl0In06ICRDb25maWd7IkZBUTo6RkFRSG9vayJ9ICRRRGF0YXsiTnVtYmVyIn0kRW52eyJCb3gxIn0KICAgICAgPC90ZD4KICAgIDwvdHI+CiAgICA8dHI+CiAgICAgIDx0ZCBjbGFzcz0ibWVudSI+CiAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZDYXRlZ29yeUlEPSREYXRheyJDYXRlZ29yeUlEIn0mSXRlbUlEPSREYXRheyJJdGVtSUQifSIgY2xhc3M9Im1lbnVpdGVtIj4kVGV4dHsiQmFjayJ9PC9hPgogICAgICA8L3RkPgogICAgPC90cj4KICAgIDx0cj4KICAgICAgPHRkIGNsYXNzPSJtYWluYm9keSI+CgogICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiT3B0aW9ucyJ9PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgoKICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG5hbWU9ImNvbXBvc2UiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iVXBkYXRlQWN0aW9uIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Ikl0ZW1JRCIgdmFsdWU9IiREYXRheyJJdGVtSUQifSI+CiAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVGl0bGUifTogPC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJUaXRsZSIgdmFsdWU9IiRRRGF0YXsiVGl0bGUifSIgc2l6ZT0iNzUiIG1heGxlbmd0aD0iMTIwIj48L3RkPgogICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiS2V5d29yZHMifTogPC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJLZXl3b3JkcyIgdmFsdWU9IiRRRGF0YXsiS2V5d29yZHMifSIgc2l6ZT0iNzUiIG1heGxlbmd0aD0iMTIwIj48L3RkPgogICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIyMCUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ2F0ZWdvcnkifTogPC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjgwJSIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+ICREYXRheyJDYXRlZ29yeU9wdGlvbiJ9PC90ZD4KICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlN0YXRlIn06IDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiAkRGF0YXsiU3RhdGVPcHRpb24ifTwvdGQ+CiAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJBdHRhY2htZW50In06PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkZpbGVuYW1lIn0gPGlucHV0IG5hbWU9ImZpbGVfdXBsb2FkIiB0eXBlPSJmaWxlIiBzaXplPSIzMCIgY2xhc3M9ImZpeGVkIj4mbmJzcDs8YSBuYW1lPSJhdHRhY2htZW50Ij48L3RkPgogICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTGFuZ3VhZ2UifTogPC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+ICREYXRheyJMYW5ndWFnZU9wdGlvbiJ9IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+PGhyPjwvdGQ+CiAgICAgICAgICAgICAgICAgIDwvdHI+Cgo8IS0tIGR0bDpibG9jazpGQVFJdGVtRmllbGQgLS0+CiAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyIkRGF0YXsiQ2FwdGlvbiJ9In06ICA8YnI+IDxpIGNsYXNzPSJzbWFsbCI+KCRUZXh0eyIkRGF0YXsiU3RhdGVOYW1lIn0ifSk8L2k+IDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjx0ZXh0YXJlYSBuYW1lPSIkRGF0YXsiS2V5In0iIHJvd3M9IjEyIiBjb2xzPSI3NSIgd3JhcD0iJEVudnsiQnJvd3NlcldyYXAifSI+JFFEYXRheyJWYWx1ZSJ9PC90ZXh0YXJlYT48L3RyPgogICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+PGhyPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpGQVFJdGVtRmllbGQgLS0+CgogICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj48aW5wdXQgYWNjZXNza2V5PSJnIiBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsic3VibWl0In0iIG9uY2xpY2s9InJldHVybiBzdWJtaXRfY29tcG9zZSgpOyI+PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9mb3JtPgoKICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KCiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOlVwZGF0ZSAtLT4KCgoKCgoKPCEtLSBkdGw6YmxvY2s6RGVsZXRlIC0tPgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7IkRlbGV0ZSJ9OiAkQ29uZmlneyJBcnRlZmFjdDo6QXJ0ZWZhY3RIb29rIn0gJFFEYXRheyJOdW1iZXIifSRFbnZ7IkJveDEifQogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWVudSI+CiAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mQ2F0ZWdvcnlJRD0kRGF0YXsiQ2F0ZWdvcnlJRCJ9Jkl0ZW1JRD0kRGF0YXsiSXRlbUlEIn0iIGNsYXNzPSJtZW51aXRlbSI+JFRleHR7IkJhY2sifTwvYT4KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5ib2R5Ij4KICAgICAgPGJyPgogICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMzUwIiBhbGlnbj0iY2VudGVyIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJPcHRpb25zIn08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIyNSUiIGNsYXNzPSJjb250ZW50a2V5Ij4kQ29uZmlneyJGQVE6OkZBUUhvb2sifTo8L3RkPgogICAgICAgICAgICAgICAgPHRkIHdpZHRoPSI3NSUiIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiTnVtYmVyIn08L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVGl0bGUifTo8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJUaXRsZSJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4mbmJzcDs8L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiRG8geW91IHJlYWxseSB3YW50IHRvIGRlbGV0ZSB0aGlzIE9iamVjdD8ifTo8L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQ2F0ZWdvcnlJRCIgdmFsdWU9IiRRRGF0YXsiQ2F0ZWdvcnlJRCJ9Ij4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJJdGVtSUQiIHZhbHVlPSIkUURhdGF7Ikl0ZW1JRCJ9Ij4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7Ik5vIn0iPgogICAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIxMCIgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJEZWxldGVBY3Rpb24iPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkNhdGVnb3J5SUQiIHZhbHVlPSIkUURhdGF7IkNhdGVnb3J5SUQifSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iSXRlbUlEIiB2YWx1ZT0iJFFEYXRheyJJdGVtSUQifSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJZZXMifSI+CiAgICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgICAgPGJyPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo8IS0tIGR0bDpibG9jazpEZWxldGUgLS0+CgoKCgoKCgoKPCEtLSBkdGw6YmxvY2s6U3lzdGVtSGlzdG9yeSAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJTeXN0ZW0gSGlzdG9yeSJ9OiAkQ29uZmlneyJGQVE6OkZBUUhvb2sifSRFbnZ7IkJveDEifQogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBhbGlnbj0iY2VudGVyIiBjbGFzcz0ibWFpbmJvZHkiPgogICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIj4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRoZWFkIj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JENvbmZpZ3siRkFROjpGQVFIb29rIn08L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVGl0bGUifTwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDYXRlZ29yeSJ9PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ik5hbWUifTwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUaW1lIn08L3RkPgogICAgICAgIDwvdHI+Cgo8IS0tIGR0bDpibG9jazpTeXN0ZW1IaXN0b3J5Um93IC0tPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgPHRkIGNsYXNzPSIkRGF0YXsiQ3NzUm93In0iPjxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mSXRlbUlEPSRRRGF0YXsiSXRlbUlEIn0iPiRRRGF0YXsiTnVtYmVyIn08L2E+PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iJERhdGF7IkNzc1JvdyJ9Ij4kUURhdGF7IlN1YmplY3QifTwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9IiREYXRheyJDc3NSb3cifSI+JFFEYXRheyJDYXRlZ29yeSJ9PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iJERhdGF7IkNzc1JvdyJ9Ij4kUURhdGF7IkFjdGlvbiJ9PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iJERhdGF7IkNzc1JvdyJ9Ij4oJFRpbWVMb25neyIkRGF0YXsiQ3JlYXRlZCJ9In0pPC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpTeXN0ZW1IaXN0b3J5Um93IC0tPgoKICAgICAgPC90YWJsZT4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6U3lzdGVtSGlzdG9yeSAtLT4KCgoKCgoKPCEtLSBkdGw6YmxvY2s6TGFuZ3VhZ2UgLS0+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkRW52eyJCb3gwIn0kVGV4dHsiRkFRIExhbmd1YWdlIn0kRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgd2lkdGg9IjQwJSIgY2xhc3M9Im1haW5ib2R5Ij4KCiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9Ikxhbmd1YWdlQ2hhbmdlIj4KICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgYWxpZ249ImNlbnRlciIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IkNoYW5nZSJ9PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPiREYXRheyJMYW5ndWFnZU9wdGlvbiJ9PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+PGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJDaGFuZ2UifSI+PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90YWJsZT4KICAgICAgPC9mb3JtPgogICAgPC90ZD4KCgogICAgPHRkIHdpZHRoPSI2MCUiIGNsYXNzPSJtYWluYm9keSI+CgogICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG5hbWU9ImNvbXBvc2UiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSIkRW52eyJTdWJhY3Rpb24ifUFjdGlvbiI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iSUQiIHZhbHVlPSIkRGF0YXsiSUQifSI+CiAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGFsaWduPSJjZW50ZXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyIkRGF0YXsiSGVhZGxpbmUifSJ9IDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPUxhbmd1YWdlIj4kVGV4dHsiJERhdGF7IkFkZExpbmsifSJ9PC9hPjwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJMYW5ndWFnZSJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJOYW1lIiB2YWx1ZT0iJFFEYXRheyJOYW1lIn0iIHNpemU9IjUiIG1heGxlbmd0aD0iNTAiPjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiJERhdGF7IkhlYWRsaW5lIn0ifSIgb25jbGljaz0icmV0dXJuIHN1Ym1pdF9jb21wb3NlKCk7Ij4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90YWJsZT4KCiAgICAgIDwvdGQ+CiAgICA8L3RyPgogIDwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOkxhbmd1YWdlIC0tPgoKCgoKCgoKPCEtLSBkdGw6YmxvY2s6Q2F0ZWdvcnkgLS0+CiAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyIgY29scz0iMiI+CiAgICA8dHI+CiAgICAgIDx0ZCBhbGlnbj0ibGVmdCIgY29sc3Bhbj0iMiIgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgICAkRW52eyJCb3gwIn0kVGV4dHsiRkFRIENhdGVnb3J5In0kRW52eyJCb3gxIn0KICAgICAgPC90ZD4KICAgIDwvdHI+CiAgICA8dHI+CiAgICAgIDx0ZCB3aWR0aD0iNDAlIiBjbGFzcz0ibWFpbmJvZHkiPgoKICAgICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiPgogICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iQ2F0ZWdvcnlDaGFuZ2UiPgogICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGFsaWduPSJjZW50ZXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiQ2hhbmdlIn08L3RkPgogICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgPHRkIHdpZHRoPSI0NiUiIGNsYXNzPSJjb250ZW50Ym9keSI+JERhdGF7IkNhdGVnb3J5TG9uZ09wdGlvbiJ9PC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+PGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJDaGFuZ2UifSI+PC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgPC9mb3JtPgogICAgICA8L3RkPgoKCiAgICAgIDx0ZCB3aWR0aD0iNjAlIiBjbGFzcz0ibWFpbmJvZHkiPgojIC0tCiMgY2hlY2sgc3ViYWN0aW9uCiMgLS0KICAgICAgICA8ZHRsIHNldCAkRGF0YXsiSGVhZGxpbmUifSA9ICJBZGQiPgogICAgICAgIDxkdGwgaWYgKCRFbnZ7IlN1YmFjdGlvbiJ9IGVxICJDYXRlZ29yeUNoYW5nZSIpIHsgJERhdGF7IkhlYWRsaW5lIn0gPSAiVXBkYXRlIjsgfT4KIyBzZXQgc3ViYWN0aW9uIQogICAgICAgIDxkdGwgaWYgKCRFbnZ7IlN1YmFjdGlvbiJ9IGVxICJDYXRlZ29yeSIpIHsgJEVudnsiU3ViYWN0aW9uIn0gPSAiQ2F0ZWdvcnlBZGQiOyB9PgojIGNoZWNrIGFkZCBsaW5rCiAgICAgICAgPGR0bCBpZiAoJEVudnsiU3ViYWN0aW9uIn0gZXEgIkNhdGVnb3J5Q2hhbmdlIikgeyAkRGF0YXsiQWRkTGluayJ9ID0gIihDbGljayBoZXJlIHRvIGFkZCkiOyB9PgojIC0tCiAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBuYW1lPSJjb21wb3NlIj4KICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IiRFbnZ7IlN1YmFjdGlvbiJ9QWN0aW9uIj4KICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkNhdGVnb3J5SUQiIHZhbHVlPSIkRGF0YXsiQ2F0ZWdvcnlJRCJ9Ij4KICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBhbGlnbj0iY2VudGVyIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IiREYXRheyJIZWFkbGluZSJ9In0gPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249Q2F0ZWdvcnkiPiRUZXh0eyIkRGF0YXsiQWRkTGluayJ9In08L2E+PC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkNhdGVnb3J5In06IDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4gPGlucHV0IHR5cGU9InRleHQiIG5hbWU9Ik5hbWUiIHZhbHVlPSIkUURhdGF7Ik5hbWUifSIgc2l6ZT0iMzUiIG1heGxlbmd0aD0iNTAiPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTdWJDYXRlZ29yeU9mIn06IDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPiREYXRheyJDYXRlZ29yeU9wdGlvbiJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkNvbW1lbnQifTogPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iQ29tbWVudCIgdmFsdWU9IiRRRGF0YXsiQ29tbWVudCJ9IiBzaXplPSI1MCIgbWF4bGVuZ3RoPSI4MCI+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlZhbGlkIn06IDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPiREYXRheyJWYWxpZE9wdGlvbiJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgb25jbGljaz0icmV0dXJuIHN1Ym1pdF9jb21wb3NlKCk7IiB2YWx1ZT0iJFRleHR7IiREYXRheyJIZWFkbGluZSJ9In0iPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICA8L3RhYmxlPgogICAgICA8L2Zvcm0+CgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo8IS0tIGR0bDpibG9jazpDYXRlZ29yeSAtLT4K
IyAtLQojIEN1c3RvbWVyRkFRLmR0bCAtIHByb3ZpZGVzIEhUTUwgdmlldyBmb3IgZmFxIGFydGljbGVzCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDUgTWFydGluIEVkZW5ob2ZlciA8bWFydGluK2NvZGVAb3Rycy5vcmc+CiMgLS0KIyAkSWQ6IEN1c3RvbWVyRkFRLmR0bCx2IDEuMS4xLjEgMjAwNi8wNi8yOSAwOToyOTo1MSBjdCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0K
IyAtLQojIFB1YmxpY0ZBUS5kdGwgLSBwcm92aWRlcyBIVE1MIHZpZXcgZm9yIGZhcSBhcnRpY2xlcwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA1IE1hcnRpbiBFZGVuaG9mZXIgPG1hcnRpbitjb2RlQG90cnMub3JnPgojIC0tCiMgJElkOiBQdWJsaWNGQVEuZHRsLHYgMS4xLjEuMSAyMDA2LzA2LzI5IDA5OjI5OjUxIGN0IEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vRkFRLnBtIC0gYWxsIGZhcSBmdW5rdGlvbnMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNiBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogRkFRLnBtLHYgMS41IDIwMDYvMTAvMjYgMTQ6Mjk6MDggcmsgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpGQVE7Cgp1c2Ugc3RyaWN0Owp1c2UgTUlNRTo6QmFzZTY0Owp1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9ICckUmV2aXNpb246IDEuNSAkJzsKJFZFUlNJT04gPX4gcy9eXCQuKjpcVyguKilcVy4rPyQvJDEvOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpGQVEgLSBmYXEgbGliCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBmYXEgZnVuY3Rpb25zLiBFLiBnLiB0byBhZGQgZmFxcyBvciB0byBnZXQgZmFxcy4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGEgZmFxIG9iamVjdAoKICB1c2UgS2VybmVsOjpDb25maWc7CiAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICB1c2UgS2VybmVsOjpTeXN0ZW06OkZBUTsKCiAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICBteSAkTG9nT2JqZWN0ICAgID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICApOwogIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgTG9nT2JqZWN0ID0+ICRMb2dPYmplY3QsCiAgKTsKICBteSAkRkFRT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkZBUS0+bmV3KAogICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgTG9nT2JqZWN0ID0+ICRMb2dPYmplY3QsCiAgICAgIERCT2JqZWN0ID0+ICREQk9iamVjdCwKICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAkVHlwZSA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MgKCRTZWxmLCAkVHlwZSk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yZWFjaCAocXcoREJPYmplY3QgQ29uZmlnT2JqZWN0IExvZ09iamVjdCBVc2VySUQpKSB7CiAgICAgICAgJFNlbGYtPnskX30gPSAkUGFyYW17JF99IHx8IGRpZSAiR290IG5vICRfISI7CiAgICB9CiAgICAkU2VsZi0+e0VuY29kZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoJVBhcmFtKTsKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gRkFRR2V0KCkKCmdldCBhbiBhcnRpY2xlCgogIG15ICVBcnRpY2xlID0gJEZBUU9iamVjdC0+RkFRR2V0KAogICAgICBJRCA9PiAxLAogICk7Cgo9Y3V0CgpzdWIgRkFRR2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIEZhaWx1cmVzIHJlbmFtZSBmcm9tIEl0ZW1JRCB0byBGQVFJRAogICAgaWYoJFBhcmFte0ZBUUlEfSkgewogICAgICAgICRQYXJhbXtJdGVtSUR9ID0gJFBhcmFte0ZBUUlEfTsKICAgIH0KCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoSXRlbUlEKSkgewogICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgIHJldHVybiB7fTsKICAgICAgfQogICAgfQogICAgIyBkYiBxdW90ZQogICAgZm9yZWFjaCAocXcoSXRlbUlEKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSwgJ0ludGVnZXInKTsKICAgIH0KICAgIG15ICVEYXRhID0gKCk7CiAgICBteSAkU1FMID0gIlNFTEVDVCBpLmZfbmFtZSwgaS5mX2xhbmd1YWdlX2lkLCBpLmZfc3ViamVjdCwgIi4KICAgICAgICAgICAgIiBpLmZfZmllbGQxLCBpLmZfZmllbGQyLCBpLmZfZmllbGQzLCAiLgogICAgICAgICAgICAiIGkuZl9maWVsZDQsIGkuZl9maWVsZDUsIGkuZl9maWVsZDYsICIuCiAgICAgICAgICAgICIgaS5mcmVlX2tleTEsIGkuZnJlZV92YWx1ZTEsIGkuZnJlZV9rZXkyLCBpLmZyZWVfdmFsdWUyLCAiLgogICAgICAgICAgICAiIGkuZnJlZV9rZXkzLCBpLmZyZWVfdmFsdWUzLCBpLmZyZWVfa2V5NCwgaS5mcmVlX3ZhbHVlNCwgIi4KICAgICAgICAgICAgIiBpLmNyZWF0ZWQsIGkuY3JlYXRlZF9ieSwgaS5jaGFuZ2VkLCBpLmNoYW5nZWRfYnksICIuCiAgICAgICAgICAgICIgaS5jYXRlZ29yeV9pZCwgaS5zdGF0ZV9pZCwgYy5uYW1lLCBzLm5hbWUsIGwubmFtZSwgaS5mX2tleXdvcmRzLCBpLmZfbnVtYmVyLCBzdC5pZCwgc3QubmFtZSAiLgogICAgICAgICAgICAiIEZST00gZmFxX2l0ZW0gaSwgZmFxX2NhdGVnb3J5IGMsIGZhcV9zdGF0ZSBzLCBmYXFfc3RhdGVfdHlwZSBzdCwgZmFxX2xhbmd1YWdlIGwgIi4KICAgICAgICAgICAgIiBXSEVSRSAiLgogICAgICAgICAgICAiIGkuc3RhdGVfaWQgPSBzLmlkIEFORCAiLgogICAgICAgICAgICAiIHMudHlwZV9pZCA9IHN0LmlkIEFORCAiLgogICAgICAgICAgICAiIGkuY2F0ZWdvcnlfaWQgPSBjLmlkIEFORCAiLgogICAgICAgICAgICAiIGkuZl9sYW5ndWFnZV9pZCA9IGwuaWQgQU5EICIuCiAgICAgICAgICAgICIgaS5pZCA9ICRQYXJhbXtJdGVtSUR9IjsKICAgICMkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICRTUUwpOwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoU1FMID0+ICRTUUwpOwogICAgd2hpbGUgIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgIG15ICVWb3RlRGF0YSA9ICV7JFNlbGYtPkl0ZW1Wb3RlRGF0YUdldChJdGVtSUQ9PiRQYXJhbXtJdGVtSUR9KX07CiAgICAgICAgJURhdGEgPSAoCiAgICAgICAgICAgICMgdmFyIGZvciBvbGQgdmVyc2lvbnMKICAgICAgICAgICAgSUQgPT4gJFBhcmFte0l0ZW1JRH0sCiAgICAgICAgICAgIEZBUUlEID0+ICRQYXJhbXtJdGVtSUR9LAogICAgICAgICAgICAjCiAgICAgICAgICAgIEl0ZW1JRCA9PiAkUGFyYW17SXRlbUlEfSwKICAgICAgICAgICAgTmFtZSA9PiAkUm93WzBdLAogICAgICAgICAgICBMYW5ndWFnZUlEID0+ICRSb3dbMV0sCiAgICAgICAgICAgIFRpdGxlID0+ICRSb3dbMl0sCiAgICAgICAgICAgIEZpZWxkMSA9PiAkUm93WzNdLAogICAgICAgICAgICBGaWVsZDIgPT4gJFJvd1s0XSwKICAgICAgICAgICAgRmllbGQzID0+ICRSb3dbNV0sCiAgICAgICAgICAgIEZpZWxkNCA9PiAkUm93WzZdLAogICAgICAgICAgICBGaWVsZDUgPT4gJFJvd1s3XSwKICAgICAgICAgICAgRmllbGQ2ID0+ICRSb3dbOF0sCiAgICAgICAgICAgIEZyZWVLZXkxID0+ICRSb3dbOV0sCiAgICAgICAgICAgIEZyZWVLZXkyID0+ICRSb3dbMTBdLAogICAgICAgICAgICBGcmVlS2V5MyA9PiAkUm93WzExXSwKICAgICAgICAgICAgRnJlZUtleTQgPT4gJFJvd1sxMl0sCiAgICAgICAgICAgIEZyZWVLZXk1ID0+ICRSb3dbMTNdLAogICAgICAgICAgICBGcmVlS2V5NiA9PiAkUm93WzE0XSwKICAgICAgICAgICAgQ3JlYXRlZCA9PiAkUm93WzE3XSwKICAgICAgICAgICAgQ3JlYXRlZEJ5ID0+ICRSb3dbMThdLAogICAgICAgICAgICBDaGFuZ2VkID0+ICRSb3dbMTldLAogICAgICAgICAgICBDaGFuZ2VkQnkgPT4gJFJvd1syMF0sCiAgICAgICAgICAgIENhdGVnb3J5SUQgPT4gJFJvd1syMV0sCiAgICAgICAgICAgIFN0YXRlSUQgPT4gJFJvd1syMl0sCiAgICAgICAgICAgIENhdGVnb3J5TmFtZSA9PiAkUm93WzIzXSwKICAgICAgICAgICAgU3RhdGUgPT4gJFJvd1syNF0sCiAgICAgICAgICAgIExhbmd1YWdlID0+ICRSb3dbMjVdLAogICAgICAgICAgICBLZXl3b3JkcyA9PiAkUm93WzI2XSwKICAgICAgICAgICAgTnVtYmVyID0+ICRSb3dbMjddLAogICAgICAgICAgICBTdGF0ZVR5cGVJRCA9PiAkUm93WzI4XSwKICAgICAgICAgICAgU3RhdGVUeXBlTmFtZSA9PiAkUm93WzI5XSwKICAgICAgICAgICAgUmVzdWx0ID0+IHNwcmludGYoIiUwLiIuJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIkZBUTo6RXhwbG9yZXI6Okl0ZW1MaXN0OjpWb3RpbmdSZXN1bHREZWNpbWFsUGxhY2VzIikuImYiLCRWb3RlRGF0YXtSZXN1bHR9IHx8IDApLAogICAgICAgICAgICBWb3RlcyA9PiAkVm90ZURhdGF7Vm90ZXN9LAogICAgICAgICk7CiAgICB9CiAgICBpZiAoISVEYXRhKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTm8gc3VjaCBJdGVtSUQgJFBhcmFte0l0ZW1JRH0hIik7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgIyB1cGRhdGUgbnVtYmVyCiAgICBpZiAoISREYXRhe051bWJlcn0pIHsKICAgICAgICBteSAkTnVtYmVyID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1N5c3RlbUlEJykuIjAwIi4kRGF0YXtJdGVtSUR9OwogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgU1FMID0+ICJVUERBVEUgZmFxX2l0ZW0gU0VUIGZfbnVtYmVyID0gJyROdW1iZXInIFdIRVJFIGlkID0gJERhdGF7SXRlbUlEfSIsCiAgICAgICAgKTsKICAgICAgICAkRGF0YXtOdW1iZXJ9ID0gJE51bWJlcjsKICAgIH0KICAgICMgZ2V0IGF0dGFjaG1lbnQKICAgICRTUUwgPSAiU0VMRUNUIGZpbGVuYW1lLCBjb250ZW50X3R5cGUsIGNvbnRlbnRfc2l6ZSwgY29udGVudCAiLgogICAgICAgICIgRlJPTSBmYXFfYXR0YWNobWVudCBXSEVSRSBmYXFfaWQgPSAkUGFyYW17SXRlbUlEfSI7CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZShTUUwgPT4gJFNRTCk7CiAgICB3aGlsZSAgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgIyBkZWNvZGUgYXR0YWNobWVudCBpZiBpdCdzIGEgcG9zdGdyZXNxbCBiYWNrZW5kIGFuZCBub3QgQkxPQgogICAgICAgIGlmICghJFNlbGYtPntEQk9iamVjdH0tPkdldERhdGFiYXNlRnVuY3Rpb24oJ0RpcmVjdEJsb2InKSkgewogICAgICAgICAgICAkUm93WzNdID0gZGVjb2RlX2Jhc2U2NCgkUm93WzNdKTsKICAgICAgICAgICAgJFNlbGYtPntFbmNvZGVPYmplY3R9LT5FbmNvZGUoXCRSb3dbM10pOwogICAgICAgIH0KICAgICAgICAkRGF0YXtGaWxlbmFtZX0gPSAkUm93WzBdOwogICAgICAgICREYXRhe0NvbnRlbnRUeXBlfSA9ICRSb3dbMV07CiAgICAgICAgJERhdGF7Q29udGVudFNpemV9ID0gJFJvd1syXTsKICAgICAgICAkRGF0YXtDb250ZW50fSA9ICRSb3dbM107CiAgICB9CgogICAgcmV0dXJuICVEYXRhOwp9Cgo9aXRlbSBJdGVtVm90ZURhdGFHZXQoKQoKcmV0dXJucyBhIGhhc2ggd2l0aCBudW1iZXIgYW5kIHJlc3VsdCBvZiBhIGl0ZW0KCiAgbXkgJUZsYWcgPSAkRkFRT2JqZWN0LT5JdGVtVm90ZURhdGFHZXQoCiAgICAgIEl0ZW1JRCA9PiAxLAogICk7Cgo9Y3V0CnN1YiBJdGVtVm90ZURhdGFHZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KEl0ZW1JRCkpIHsKICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICByZXR1cm4gMDsKICAgICAgIH0KICAgIH0KCiAgICAjIGRiIHF1b3RlCiAgICBmb3JlYWNoIChxdyhJdGVtSUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99LCAnSW50ZWdlcicpOwogICAgfQoKICAgIG15ICRTUUwgPSAiIFNFTEVDVCBjb3VudCgqKSwgYXZnKHJhdGUpIEZST00gZmFxX3ZvdGluZyBXSEVSRSBpdGVtX2lkID0gIiAuICRQYXJhbXtJdGVtSUR9OwoKICAgIG15ICVIYXNoID0gKCk7CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZShTUUwgPT4gJFNRTCwgTGltaXQgPT4gJFBhcmFte0xpbWl0fSB8fCA1MDApOwogICAgaWYobXkgQERhdGEgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgJEhhc2h7Vm90ZXN9ICA9ICREYXRhWzBdOwogICAgICAgICRIYXNoe1Jlc3VsdH0gPSAkRGF0YVsxXTsKICAgIH0KICAgIHJldHVybiBcJUhhc2g7Cn0KCj1pdGVtIEZBUUFkZCgpCgphZGQgYW4gYXJ0aWNsZQoKICBteSAkSXRlbUlEID0gJEZBUU9iamVjdC0+RkFRQWRkKAogICAgICBOdW1iZXIgPT4gJzEzNDAyJywKICAgICAgVGl0bGUgPT4gJ1NvbWUgVGV4dCcsCiAgICAgIENhdGVnb3J5SUQgPT4gMSwKICAgICAgU3RhdGVJRCA9PiAxLAogICAgICBMYW5ndWFnZUlEID0+IDEsCiAgICAgIEZpZWxkMSA9PiAnUHJvYmxlbS4uLicsCiAgICAgIEZpZWxkMiA9PiAnU29sdXRpb24uLi4nLAogICAgICBGcmVlS2V5MSA9PiAnU29mdHdhcmUnLAogICAgICBGcmVlVGV4dDEgPT4gJ0FwYWNoZSAzLjQuMicsCiAgICAgIEZyZWVLZXkyID0+ICdPUycsCiAgICAgIEZyZWVUZXh0MiA9PiAnT3BlbkJTRCA0LjIuMicsCiAgICAgICMgYXR0YWNobWVudCBvcHRpb25zIChub3QgcmVxdWlyZWQpCiAgICAgIEZpbGVuYW1lID0+ICRGaWxlbmFtZSwKICAgICAgQ29udGVudCA9PiAkQ29udGVudCwKICAgICAgQ29udGVudFR5cGUgPT4gJENvbnRlbnRUeXBlLAogICk7Cgo9Y3V0CgpzdWIgRkFRQWRkIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhDYXRlZ29yeUlEIFN0YXRlSUQgTGFuZ3VhZ2VJRCBUaXRsZSkpIHsKICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICByZXR1cm4gMDsKICAgICAgfQogICAgfQogICAgIyBjaGVjayBuYW1lCiAgICBpZiAoISRQYXJhbXtOYW1lfSkgewogICAgICAgICRQYXJhbXtOYW1lfSA9IHRpbWUoKS4nLScucmFuZCgxMDApOwogICAgfQogICAgIyBjaGVjayBudW1iZXIKICAgIGlmICghJFBhcmFte051bWJlcn0pIHsKICAgICAgICAkUGFyYW17TnVtYmVyfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTeXN0ZW1JRCcpLnJhbmQoMTAwKTsKICAgIH0KICAgICMgZGIgcXVvdGUgKGp1c3Qgbm90IENvbnRlbnQsIHVzZSBkYiBCaW5kIHZhbHVlcykKICAgIGZvcmVhY2ggKHF3KE51bWJlciBOYW1lIFRpdGxlIEtleXdvcmRzIEZpZWxkMSBGaWVsZDIgRmllbGQzIEZpZWxkNCBGaWVsZDUgRmllbGQ2IEZyZWVLZXkxIEZyZWVUZXh0MSBGcmVlS2V5MiBGcmVlVGV4dDIgRnJlZUtleTMgRnJlZVRleHQzIEZyZWVLZXk0IEZyZWVUZXh0NCBGaWxlbmFtZSBDb250ZW50VHlwZSBGaWxlc2l6ZSkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30pOwogICAgfQogICAgZm9yZWFjaCAocXcoQ2F0ZWdvcnlJRCBTdGF0ZUlEIExhbmd1YWdlSUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99LCAnSW50ZWdlcicpOwogICAgfQoKICAgIGZvcmVhY2ggbXkgJFR5cGUgKHF3KEZpZWxkIEZyZWVLZXkgRnJlZVRleHQpKSB7CiAgICAgICAgZm9yZWFjaCAoMS4uNikgewogICAgICAgICAgICBpZiAoIWRlZmluZWQoJFBhcmFteyRUeXBlLiRffSkpIHsKICAgICAgICAgICAgICAgICRQYXJhbXskVHlwZS4kX30gPSAnJzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIG15ICRTUUwgPSAiSU5TRVJUIElOVE8gZmFxX2l0ZW0gKGZfbnVtYmVyLCBmX25hbWUsIGZfbGFuZ3VhZ2VfaWQsIGZfc3ViamVjdCwgIi4KICAgICAgICAgICAgIiBjYXRlZ29yeV9pZCwgc3RhdGVfaWQsIGZfa2V5d29yZHMsICIuCiAgICAgICAgICAgICIgZl9maWVsZDEsIGZfZmllbGQyLCBmX2ZpZWxkMywgZl9maWVsZDQsIGZfZmllbGQ1LCBmX2ZpZWxkNiwgIi4KICAgICAgICAgICAgIiBmcmVlX2tleTEsIGZyZWVfdmFsdWUxLCBmcmVlX2tleTIsIGZyZWVfdmFsdWUyLCAiLgogICAgICAgICAgICAiIGZyZWVfa2V5MywgZnJlZV92YWx1ZTMsIGZyZWVfa2V5NCwgZnJlZV92YWx1ZTQsICIuCiAgICAgICAgICAgICIgY3JlYXRlZCwgY3JlYXRlZF9ieSwgY2hhbmdlZCwgY2hhbmdlZF9ieSkiLgogICAgICAgICAgICAiIFZBTFVFUyAiLgogICAgICAgICAgICAiICgnJFBhcmFte051bWJlcn0nLCAnJFBhcmFte05hbWV9JywgJFBhcmFte0xhbmd1YWdlSUR9LCAnJFBhcmFte1RpdGxlfScsICIuCiAgICAgICAgICAgICIgJFBhcmFte0NhdGVnb3J5SUR9LCAkUGFyYW17U3RhdGVJRH0sICckUGFyYW17S2V5d29yZHN9JywgIi4KICAgICAgICAgICAgIiAnJFBhcmFte0ZpZWxkMX0nLCAnJFBhcmFte0ZpZWxkMn0nLCAnJFBhcmFte0ZpZWxkM30nLCAiLgogICAgICAgICAgICAiICckUGFyYW17RmllbGQ0fScsICckUGFyYW17RmllbGQ1fScsICckUGFyYW17RmllbGQ2fScsICIuCiAgICAgICAgICAgICIgJyRQYXJhbXtGcmVlS2V5MX0nLCAnJFBhcmFte0ZyZWVUZXh0MX0nLCAiLgogICAgICAgICAgICAiICckUGFyYW17RnJlZUtleTJ9JywgJyRQYXJhbXtGcmVlVGV4dDJ9JywgIi4KICAgICAgICAgICAgIiAnJFBhcmFte0ZyZWVLZXkzfScsICckUGFyYW17RnJlZVRleHQzfScsICIuCiAgICAgICAgICAgICIgJyRQYXJhbXtGcmVlS2V5NH0nLCAnJFBhcmFte0ZyZWVUZXh0NH0nLCAiLgogICAgICAgICAgICAiIGN1cnJlbnRfdGltZXN0YW1wLCAkU2VsZi0+e1VzZXJJRH0sICIuCiAgICAgICAgICAgICIgY3VycmVudF90aW1lc3RhbXAsICRTZWxmLT57VXNlcklEfSkiOwoKICAgIGlmICgkU2VsZi0+e0RCT2JqZWN0fS0+RG8oU1FMID0+ICRTUUwpKSB7CiAgICAgICAgIyBnZXQgaWQKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMID0+ICJTRUxFQ1QgaWQgRlJPTSBmYXFfaXRlbSBXSEVSRSAiLgogICAgICAgICAgICAgICJmX25hbWUgPSAnJFBhcmFte05hbWV9JyBBTkQgZl9sYW5ndWFnZV9pZCA9ICRQYXJhbXtMYW5ndWFnZUlEfSAiLgogICAgICAgICAgICAgICIgQU5EIGZfc3ViamVjdCA9ICckUGFyYW17VGl0bGV9JyIsCiAgICAgICAgKTsKICAgICAgICBteSAkSUQgPSAwOwogICAgICAgIHdoaWxlICAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAgICAgJElEID0gJFJvd1swXTsKICAgICAgICB9CiAgICAgICAgIyB1cGRhdGUgbnVtYmVyCiAgICAgICAgbXkgJE51bWJlciA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTeXN0ZW1JRCcpLiIwMCIuJElEOwogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgU1FMID0+ICJVUERBVEUgZmFxX2l0ZW0gU0VUIGZfbnVtYmVyID0gJyROdW1iZXInIFdIRVJFIGlkID0gJElEIiwKICAgICAgICApOwogICAgICAgICMgYWRkIGF0dGFjaG1lbnQKICAgICAgICBpZigkUGFyYW17Q29udGVudH0gJiYgJFBhcmFte0NvbnRlbnRUeXBlfSAmJiAkUGFyYW17RmlsZW5hbWV9KSB7CiAgICAgICAgICAgICRTZWxmLT5BdHRhY2htZW50QWRkKAogICAgICAgICAgICAgICAgSXRlbUlEID0+ICRJRCwKICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJFBhcmFte0NvbnRlbnR9LAogICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJFBhcmFte0NvbnRlbnRUeXBlfSwKICAgICAgICAgICAgICAgIEZpbGVuYW1lID0+ICRQYXJhbXtGaWxlbmFtZX0KICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRTZWxmLT5GQVFIaXN0b3J5QWRkKAogICAgICAgICAgICBOYW1lID0+ICdDcmVhdGVkJywKICAgICAgICAgICAgSXRlbUlEID0+ICRJRCwKICAgICAgICApOwogICAgICAgIHJldHVybiAkSUQ7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm47CiAgICB9Cgp9Cgo9aXRlbSBBdHRhY2htZW50QWRkKCkKCj1jdXQKCnN1YiBBdHRhY2htZW50QWRkIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhJdGVtSUQgQ29udGVudCBDb250ZW50VHlwZSBGaWxlbmFtZSkpIHsKICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KCiAgICAjIGdldCBhdHRhY2htZW50IHNpemUKICAgIHsKICAgICAgICB1c2UgYnl0ZXM7CiAgICAgICAgJFBhcmFte0ZpbGVzaXplfSA9IGxlbmd0aCgkUGFyYW17Q29udGVudH0pOwogICAgICAgIG5vIGJ5dGVzOwogICAgfQogICAgIyBlbmNvZGUgYXR0YWNoZW1udCBpZiBpdCdzIGEgcG9zdGdyZXNxbCBiYWNrZW5kISEhCiAgICBpZiAoISRTZWxmLT57REJPYmplY3R9LT5HZXREYXRhYmFzZUZ1bmN0aW9uKCdEaXJlY3RCbG9iJykpIHsKICAgICAgICAkU2VsZi0+e0VuY29kZU9iamVjdH0tPkVuY29kZU91dHB1dChcJFBhcmFte0NvbnRlbnR9KTsKICAgICAgICAkUGFyYW17Q29udGVudH0gPSBlbmNvZGVfYmFzZTY0KCRQYXJhbXtDb250ZW50fSk7CiAgICB9CgogICAgbXkgJFNRTCA9ICJJTlNFUlQgSU5UTyBmYXFfYXR0YWNobWVudCAiLgogICAgICAgICIgKGZhcV9pZCwgZmlsZW5hbWUsIGNvbnRlbnRfdHlwZSwgY29udGVudF9zaXplLCBjb250ZW50LCAiLgogICAgICAgICIgY3JlYXRlZCwgY3JlYXRlZF9ieSwgY2hhbmdlZCwgY2hhbmdlZF9ieSkgIiAuCiAgICAgICAgIiBWQUxVRVMgIi4KICAgICAgICAiICgkUGFyYW17SXRlbUlEfSwgJyRQYXJhbXtGaWxlbmFtZX0nLCAnJFBhcmFte0NvbnRlbnRUeXBlfScsICckUGFyYW17RmlsZXNpemV9JywgPywgIi4KICAgICAgICAiIGN1cnJlbnRfdGltZXN0YW1wLCAkU2VsZi0+e1VzZXJJRH0sIGN1cnJlbnRfdGltZXN0YW1wLCAkU2VsZi0+e1VzZXJJRH0pIjsKICAgICMgd3JpdGUgYXR0YWNobWVudCB0byBkYgogICAgaWYgKCRTZWxmLT57REJPYmplY3R9LT5EbyhTUUwgPT4gJFNRTCwgQmluZCA9PiBbXCRQYXJhbXtDb250ZW50fV0pKSB7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKPWl0ZW0gQXR0YWNobWVudEdldCgpCgo9Y3V0CgpzdWIgQXR0YWNobWVudEdldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoSXRlbUlEIENvbnRlbnQgQ29udGVudFR5cGUgRmlsZW5hbWUpKSB7CiAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9Cn0KCj1pdGVtIEF0dGFjaG1lbnREZWxldGUoKQoKPWN1dAoKc3ViIEF0dGFjaG1lbnREZWxldGUgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KEl0ZW1JRCBDb250ZW50IENvbnRlbnRUeXBlIEZpbGVuYW1lKSkgewogICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfQp9Cgo9aXRlbSBBdHRhY2htZW50U2VhcmNoKCkKCj1jdXQKCnN1YiBBdHRhY2htZW50U2VhcmNoIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhJdGVtSUQgQ29udGVudCBDb250ZW50VHlwZSBGaWxlbmFtZSkpIHsKICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KfQoKPWl0ZW0gRkFRVXBkYXRlKCkKCnVwZGF0ZSBhbiBhcnRpY2xlCgogICRGQVFPYmplY3QtPkZBUVVwZGF0ZSgKICAgICAgQ2F0ZWdvcnlJRCA9PiAxLAogICAgICBTdGF0ZUlEID0+IDEsCiAgICAgIExhbmd1YWdlSUQgPT4gMSwKICAgICAgVGl0bGUgPT4gJ1NvbWUgVGV4dCcsCiAgICAgIEZpZWxkMSA9PiAnUHJvYmxlbS4uLicsCiAgICAgIEZpZWxkMiA9PiAnU29sdXRpb24uLi4nLAogICAgICBGcmVlS2V5MSA9PiAnU29mdHdhcmUnLAogICAgICBGcmVlVGV4dDEgPT4gJ0FwYWNoZSAzLjQuMicsCiAgICAgIEZyZWVLZXkyID0+ICdPUycsCiAgICAgIEZyZWVUZXh0MiA9PiAnT3BlbkJTRCA0LjIuMicsCiAgICAgICMgYXR0YWNobWVudCBvcHRpb25zIChub3QgcmVxdWlyZWQpCiAgICAgIEZpbGVuYW1lID0+ICRGaWxlbmFtZSwKICAgICAgQ29udGVudCA9PiAkQ29udGVudCwKICAgICAgQ29udGVudFR5cGUgPT4gJENvbnRlbnRUeXBlLAogICk7Cgo9Y3V0CgpzdWIgRkFRVXBkYXRlIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhJdGVtSUQgQ2F0ZWdvcnlJRCBTdGF0ZUlEIExhbmd1YWdlSUQgVGl0bGUpKSB7CiAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CiAgICAjIGNoZWNrIG5hbWUKICAgIGlmICghJFBhcmFte05hbWV9KSB7CiAgICAgICAgbXkgJUFydGljbGUgPSAkU2VsZi0+RkFRR2V0KCVQYXJhbSk7CiAgICAgICAgJFBhcmFte05hbWV9ID0gJEFydGljbGV7TmFtZX07CiAgICB9CiAgICAjIGRiIHF1b3RlIChqdXN0IG5vdCBDb250ZW50LCB1c2UgZGIgQmluZCB2YWx1ZXMpCiAgICBmb3JlYWNoIChxdyhOdW1iZXIgTmFtZSBUaXRsZSBLZXl3b3JkcyBGaWVsZDEgRmllbGQyIEZpZWxkMyBGaWVsZDQgRmllbGQ1IEZpZWxkNiBGcmVlS2V5MSBGcmVlVGV4dDEgRnJlZUtleTIgRnJlZVRleHQyIEZyZWVLZXkzIEZyZWVUZXh0MyBGcmVlS2V5NCBGcmVlVGV4dDQgRmlsZW5hbWUgQ29udGVudFR5cGUgRmlsZXNpemUpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99KTsKICAgIH0KICAgIGZvcmVhY2ggKHF3KEl0ZW1JRCBDYXRlZ29yeUlEIFN0YXRlSUQgTGFuZ3VhZ2VJRCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30sICdJbnRlZ2VyJyk7CiAgICB9CiAgICAjIGZpbGwgdXAgZW1wdHkgc3R1ZmYKICAgIGZvcmVhY2ggbXkgJFR5cGUgKHF3KEZpZWxkIEZyZWVLZXkgRnJlZVRleHQpKSB7CiAgICAgICAgZm9yZWFjaCAoMS4uNikgewogICAgICAgICAgICBpZiAoISRQYXJhbXskVHlwZS4kX30pIHsKICAgICAgICAgICAgICAgICRQYXJhbXskVHlwZS4kX30gPSAnJzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBteSAkU1FMID0gIlVQREFURSBmYXFfaXRlbSBTRVQgZl9uYW1lID0gJyRQYXJhbXtOYW1lfScsICIuCiAgICAgICAgICAgICIgZl9sYW5ndWFnZV9pZCA9ICRQYXJhbXtMYW5ndWFnZUlEfSwgZl9zdWJqZWN0ID0gJyRQYXJhbXtUaXRsZX0nLCAiLgogICAgICAgICAgICAiIGNhdGVnb3J5X2lkID0gJFBhcmFte0NhdGVnb3J5SUR9LCBzdGF0ZV9pZCA9ICRQYXJhbXtTdGF0ZUlEfSwgIi4KICAgICAgICAgICAgIiBmX2tleXdvcmRzID0gJyRQYXJhbXtLZXl3b3Jkc30nLCAiLgogICAgICAgICAgICAiIGZfZmllbGQxID0gJyRQYXJhbXtGaWVsZDF9JywgZl9maWVsZDIgPSAnJFBhcmFte0ZpZWxkMn0nLCAiLgogICAgICAgICAgICAiIGZfZmllbGQzID0gJyRQYXJhbXtGaWVsZDN9JywgZl9maWVsZDQgPSAnJFBhcmFte0ZpZWxkNH0nLCAiLgogICAgICAgICAgICAiIGZfZmllbGQ1ID0gJyRQYXJhbXtGaWVsZDV9JywgZl9maWVsZDYgPSAnJFBhcmFte0ZpZWxkNn0nLCAiLgogICAgICAgICAgICAiIGZyZWVfa2V5MSA9ICckUGFyYW17RnJlZUtleTF9JywgZnJlZV92YWx1ZTEgPSAnJFBhcmFte0ZyZWVUZXh0MX0nLCAiLgogICAgICAgICAgICAiIGZyZWVfa2V5MiA9ICckUGFyYW17RnJlZUtleTJ9JywgZnJlZV92YWx1ZTIgPSAnJFBhcmFte0ZyZWVUZXh0Mn0nLCAiLgogICAgICAgICAgICAiIGZyZWVfa2V5MyA9ICckUGFyYW17RnJlZUtleTN9JywgZnJlZV92YWx1ZTMgPSAnJFBhcmFte0ZyZWVUZXh0M30nLCAiLgogICAgICAgICAgICAiIGZyZWVfa2V5NCA9ICckUGFyYW17RnJlZUtleTR9JywgZnJlZV92YWx1ZTQgPSAnJFBhcmFte0ZyZWVUZXh0NH0nLCAiLgogICAgICAgICAgICAiIGNoYW5nZWQgPSBjdXJyZW50X3RpbWVzdGFtcCwgY2hhbmdlZF9ieSA9ICRTZWxmLT57VXNlcklEfSAiLgogICAgICAgICAgICAiIFdIRVJFIGlkID0gJFBhcmFte0l0ZW1JRH0gIjsKCiAgICBpZiAoJFNlbGYtPntEQk9iamVjdH0tPkRvKFNRTCA9PiAkU1FMKSkgewogICAgICAgICMgYWRkIGF0dGFjaG1lbnQKICAgICAgICBpZiAoJFBhcmFte0NvbnRlbnR9ICYmICRQYXJhbXtDb250ZW50VHlwZX0gJiYgJFBhcmFte0ZpbGVuYW1lfSkgewogICAgICAgICAgICAjIGdldCBhdHRhY2htZW50IHNpemUKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdXNlIGJ5dGVzOwogICAgICAgICAgICAgICAgJFBhcmFte0ZpbGVzaXplfSA9IGxlbmd0aCgkUGFyYW17Q29udGVudH0pOwogICAgICAgICAgICAgICAgbm8gYnl0ZXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgIyBlbmNvZGUgYXR0YWNoZW1udCBpZiBpdCdzIGEgcG9zdGdyZXNxbCBiYWNrZW5kISEhCiAgICAgICAgICAgIGlmICghJFNlbGYtPntEQk9iamVjdH0tPkdldERhdGFiYXNlRnVuY3Rpb24oJ0RpcmVjdEJsb2InKSkgewogICAgICAgICAgICAgICAgJFNlbGYtPntFbmNvZGVPYmplY3R9LT5FbmNvZGVPdXRwdXQoXCRQYXJhbXtDb250ZW50fSk7CiAgICAgICAgICAgICAgICAkUGFyYW17Q29udGVudH0gPSBlbmNvZGVfYmFzZTY0KCRQYXJhbXtDb250ZW50fSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgIyBkZWxldGUgb2xkIGF0dGFjaG1lbnQKICAgICAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICAgICAgU1FMID0+ICJERUxFVEUgRlJPTSBmYXFfYXR0YWNobWVudCBXSEVSRSBmYXFfaWQgPSAkUGFyYW17SXRlbUlEfSIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRTUUwgPSAiSU5TRVJUIElOVE8gZmFxX2F0dGFjaG1lbnQgIi4KICAgICAgICAgICAgICAgICIgKGZhcV9pZCwgZmlsZW5hbWUsIGNvbnRlbnRfdHlwZSwgY29udGVudF9zaXplLCBjb250ZW50LCAiLgogICAgICAgICAgICAgICAgIiBjcmVhdGVkLCBjcmVhdGVkX2J5LCBjaGFuZ2VkLCBjaGFuZ2VkX2J5KSAiIC4KICAgICAgICAgICAgICAgICIgVkFMVUVTICIuCiAgICAgICAgICAgICAgICAiICgkUGFyYW17SXRlbUlEfSwgJyRQYXJhbXtGaWxlbmFtZX0nLCAnJFBhcmFte0NvbnRlbnRUeXBlfScsICckUGFyYW17RmlsZXNpemV9JywgPywgIi4KICAgICAgICAgICAgICAgICIgY3VycmVudF90aW1lc3RhbXAsICRTZWxmLT57VXNlcklEfSwgY3VycmVudF90aW1lc3RhbXAsICRTZWxmLT57VXNlcklEfSkiOwogICAgICAgICAgICAjIHdyaXRlIGF0dGFjaG1lbnQgdG8gZGIKICAgICAgICAgICAgaWYgKCRTZWxmLT57REJPYmplY3R9LT5EbyhTUUwgPT4gJFNRTCwgQmluZCA9PiBbXCRQYXJhbXtDb250ZW50fV0pKSB7CgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRTZWxmLT5GQVFIaXN0b3J5QWRkKAogICAgICAgICAgICBOYW1lID0+ICdVcGRhdGVkJywKICAgICAgICAgICAgSXRlbUlEID0+ICRQYXJhbXtJdGVtSUR9LAogICAgICAgICk7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm47CiAgICB9Cn0KCj1pdGVtIEZBUUNvdW50KCkKCmNvdW50IGFuIGFydGljbGUKCiAgJEZBUU9iamVjdC0+RkFRQ291bnQoCiAgICAgIENhdGVnb3J5SURzID0+IFsxLDIsMyw0XSwKICApOwoKPWN1dAoKc3ViIEZBUUNvdW50IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoQ2F0ZWdvcnlJRHMgSXRlbVN0YXRlcykpIHsKICAgICAgICBpZiAoIWRlZmluZWQoJFBhcmFteyRffSkpIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkU1FMID0gIiI7CiAgICBteSAkRXh0ID0gIiI7CiAgICAkU1FMID0gIlNFTEVDVCBDT1VOVCgqKSIgLgogICAgICAgICAgICIgRlJPTSBmYXFfaXRlbSBpLCBmYXFfc3RhdGUgcyIuCiAgICAgICAgICAgIiBXSEVSRSBpLmNhdGVnb3J5X2lkIElOICgnJHtcKGpvaW4gJ1wnLCBcJycsIEB7JFBhcmFte0NhdGVnb3J5SURzfX0pfScpIi4KICAgICAgICAgICAiIEFORCBpLnN0YXRlX2lkID0gcy5pZCI7CiAgICBpZiAoJFBhcmFte0l0ZW1TdGF0ZXN9ICYmIHJlZigkUGFyYW17SXRlbVN0YXRlc30pIGVxICdIQVNIJyAmJiAleyRQYXJhbXtJdGVtU3RhdGVzfX0pIHsKICAgICAgICAkRXh0IC49ICIgQU5EIHMudHlwZV9pZCBJTiAoJyR7XChqb2luICdcJywgXCcnLCBrZXlzKCV7JFBhcmFte0l0ZW1TdGF0ZXN9fSkpfScpIjsKICAgIH0KICAgICRFeHQgLj0gIiBHUk9VUCBCWSBjYXRlZ29yeV9pZCI7CiAgICAkU1FMIC49ICRFeHQ7CgogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoU1FMID0+ICRTUUwsIExpbWl0ID0+IDIwMCk7CgogICAgaWYobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICByZXR1cm4gJFJvd1swXTsKICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9Cn0KCj1pdGVtIFZvdGVBZGQoKQoKYWRkIGFuIGFydGljbGUKCiAgbXkgJEl0ZW1JRCA9ICRGQVFPYmplY3QtPkZBUVZvdGUoCiAgICAgIENyZWF0ZUJ5ID0+ICdTb21lIFRleHQnLAogICAgICBJdGVtSUQgPT4gJzEyMzQ1NicsCiAgICAgIElQID0+IDU0LjQzLjMwLjEnLAogICAgICBJbnRlcmZhY2UgPT4gJ1NvbWUgVGV4dCcsCiAgICAgIFJhdGUgPT4gMTAwLAogICk7Cgo9Y3V0CgpzdWIgVm90ZUFkZCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoQ3JlYXRlZEJ5IEl0ZW1JRCBJUCBJbnRlcmZhY2UpKSB7CiAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgICB9CiAgICB9CgogICAgIyBkYiBxdW90ZQogICAgZm9yZWFjaCAocXcoQ3JlYXRlZEJ5IEludGVyZmFjZSBJUCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30pOwogICAgfQogICAgZm9yZWFjaCAocXcoSXRlbUlEKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSwgJ0ludGVnZXInKTsKICAgIH0KCiAgICBteSAkU1FMID0gIklOU0VSVCBJTlRPIGZhcV92b3RpbmcgKCAiLgogICAgICAgICAgICAgICIgY3JlYXRlZF9ieSwgaXRlbV9pZCwgaXAsIGludGVyZmFjZSwgcmF0ZSwgY3JlYXRlZCIuCiAgICAgICAgICAgICAgIiApIFZBTFVFUyAoIi4KICAgICAgICAgICAgICAiICckUGFyYW17Q3JlYXRlZEJ5fScsICIuCiAgICAgICAgICAgICAgIiAkUGFyYW17SXRlbUlEfSwgIi4KICAgICAgICAgICAgICAiICckUGFyYW17SVB9JywgIi4KICAgICAgICAgICAgICAiICckUGFyYW17SW50ZXJmYWNlfScsICIuCiAgICAgICAgICAgICAgIiAnJFBhcmFte1JhdGV9JywgIi4KICAgICAgICAgICAgICAiIGN1cnJlbnRfdGltZXN0YW1wICIuCiAgICAgICAgICAgICAgIiApIjsKICAgICMkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICRTUUwpOwogICAgaWYgKCRTZWxmLT57REJPYmplY3R9LT5EbyhTUUwgPT4gJFNRTCkpIHsKICAgICAgICByZXR1cm4gMTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiAwOwogICAgfQoKfQoKPWl0ZW0gVm90ZUdldCgpCgphZGQgYW4gYXJ0aWNsZQoKICBteSAlVm90ZURhdGEgPSAleyRGQVFPYmplY3QtPlZvdGVHZXQoCiAgICAgIENyZWF0ZUJ5ID0+ICdTb21lIFRleHQnLAogICAgICBJdGVtSUQgPT4gJzEyMzQ1NicsCiAgICAgIEludGVyZmFjZSA9PiAnU29tZSBUZXh0JywKICApfTsKCj1jdXQKc3ViIFZvdGVHZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KENyZWF0ZUJ5IEl0ZW1JRCBJbnRlcmZhY2UgSVApKSB7CiAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgfQogICAgfQoKICAgICMgZGIgcXVvdGUKICAgIGZvcmVhY2ggKHF3KENyZWF0ZWRCeSBJbnRlcmZhY2UgSVApKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99KTsKICAgIH0KICAgIGZvcmVhY2ggKHF3KEl0ZW1JRCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30sICdJbnRlZ2VyJyk7CiAgICB9CgogICAgbXkgJEV4dCA9ICIiOwogICAgbXkgJFNRTCA9ICIgU0VMRUNUIGNyZWF0ZWRfYnksIGl0ZW1faWQsIGludGVyZmFjZSwgaXAsIGNyZWF0ZWQsIHJhdGUgRlJPTSBmYXFfdm90aW5nIFdIRVJFIjsKCiAgICAjIHB1YmxpYwogICAgaWYoJFBhcmFte0ludGVyZmFjZX0gZXEgJzMnKSB7CiAgICAgICAgJEV4dCAuPSAiIGlwIExJS0UgJyRQYXJhbXtJUH0nIEFORCIuCiAgICAgICAgICAgICAgICAiIGl0ZW1faWQgPSAkUGFyYW17SXRlbUlEfSI7CgogICAgIyBjdXN0b21lcgogICAgfSBlbHNpZigkUGFyYW17SW50ZXJmYWNlfSBlcSAnMicpIHsKICAgICAgICAkRXh0IC49ICIgY3JlYXRlZF9ieSBMSUtFICckUGFyYW17Q3JlYXRlQnl9JyBBTkQiLgogICAgICAgICAgICAgICAgIiBpdGVtX2lkID0gJFBhcmFte0l0ZW1JRH0iOwoKICAgICMgaW50ZXJuYWwKICAgIH0gZWxzaWYoJFBhcmFte0ludGVyZmFjZX0gZXEgJzEnKSB7CiAgICAgICAgJEV4dCAuPSAiIGNyZWF0ZWRfYnkgTElLRSAnJFBhcmFte0NyZWF0ZUJ5fScgQU5EIi4KICAgICAgICAgICAgICAgICIgaXRlbV9pZCA9ICRQYXJhbXtJdGVtSUR9IjsKICAgIH0KICAgICRTUUwgLj0gJEV4dDsKICAgICMkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICRTUUwpOwoKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAkU1FMKTsKICAgIG15ICVEYXRhID0gKCk7CiAgICB3aGlsZSAgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgJURhdGEgPSAoCiAgICAgICAgICAgIENyZWF0ZWRCeSA9PiAkUm93WzBdLAogICAgICAgICAgICBJdGVtSUQgPT4gJFJvd1sxXSwKICAgICAgICAgICAgSW50ZXJmYWNlID0+ICRSb3dbMl0sCiAgICAgICAgICAgIElQID0+ICRSb3dbM10sCiAgICAgICAgICAgIENyZWF0ZWQgPT4gJFJvd1s0XSwKICAgICAgICAgICAgUmF0ZSA9PiAkUm93WzVdLAogICAgICAgICk7CiAgICB9CiAgICBpZiAoISVEYXRhKSB7CiAgICAgICAgIyRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5vIHZvdGluZyBmb3IgdGhpcyBmYXEgYXJ0aWNsZSEgS2VybmVsOjpTeXN0ZW06OkZBUTo6Vm90ZUdldCgpIik7CiAgICAgICAgcmV0dXJuIHt9OwogICAgfQogICAgcmV0dXJuIFwlRGF0YTsKfQoKPWl0ZW0gVm90ZVNlYXJjaCgpCgpyZXR1cm5zIGEgYXJyYXkgd2l0aCBWb3RlSURzCgogIG15IEBGQVFJRHMgPSBAeyRGQVFPYmplY3QtPlZvdGVTZWFyY2goCiAgICAgIEl0ZW1JRCA9PiAxLAogICl9OwoKPWN1dApzdWIgVm90ZVNlYXJjaCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoSXRlbUlEKSkgewogICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgIHJldHVybiBbXTsKICAgICAgIH0KICAgIH0KCiAgICAjIGRiIHF1b3RlCiAgICBmb3JlYWNoIChxdygpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99KTsKICAgIH0KICAgIGZvcmVhY2ggKHF3KEl0ZW1JRCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30sICdJbnRlZ2VyJyk7CiAgICB9CgogICAgbXkgJEV4dCA9ICIiOwogICAgbXkgJFNRTCA9ICIgU0VMRUNUIGlkIEZST00gZmFxX3ZvdGluZyBXSEVSRSI7CgogICAgaWYoZGVmaW5lZCgkUGFyYW17SXRlbUlEfSkpIHsKICAgICAgICAkRXh0IC49ICIgaXRlbV9pZCA9ICIgLiAkUGFyYW17SXRlbUlEfTsKICAgIH0KCiAgICAkU1FMIC49ICRFeHQ7CgogICAgbXkgQExpc3QgPSAoKTsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAkU1FMLCBMaW1pdCA9PiAkUGFyYW17TGltaXR9IHx8IDUwMCk7CiAgICB3aGlsZSAgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgcHVzaCAoQExpc3QsICRSb3dbMF0pOwogICAgfQogICAgcmV0dXJuIFxATGlzdDsKfQoKPWl0ZW0gVm90ZURlbGV0ZSgpCgphZGQgYW4gYXJ0aWNsZQoKICBteSAkRmxhZyA9ICRGQVFPYmplY3QtPlZvdGVEZWxldGUoCiAgICAgIFZvdGVJRCA9PiAxLAogICk7Cgo9Y3V0CnN1YiBWb3RlRGVsZXRlIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoVm90ZUlEKSkgewogICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgIHJldHVybiAwOwogICAgICAgfQogICAgfQoKICAgICMgZGIgcXVvdGUKICAgIGZvcmVhY2ggKHF3KFZvdGVJRCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30sICdJbnRlZ2VyJyk7CiAgICB9CgogICAgbXkgJFNRTCA9ICJERUxFVEUgRlJPTSBmYXFfdm90aW5nIFdIRVJFIGlkID0gIi4kUGFyYW17Vm90ZUlEfTsKCiAgICBpZiAoJFNlbGYtPntEQk9iamVjdH0tPkRvKFNRTCA9PiAkU1FMKSkgewogICAgICAgIHJldHVybiAxOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9Cgp9Cgo9aXRlbSBGQVFEZWxldGUoKQoKZGVsZXRlIGFuIGFydGljbGUKCiAgJEZsYWcgPSAkRkFRT2JqZWN0LT5GQVFEZWxldGUoSXRlbUlEID0+IDEpOwoKPWN1dAoKc3ViIEZBUURlbGV0ZSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoSXRlbUlEKSkgewogICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgIHJldHVybiAwOwogICAgICB9CiAgICB9CiAgICAjIGRiIHF1b3RlCiAgICBmb3JlYWNoIChxdyhJdGVtSUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99LCAnSW50ZWdlcicpOwogICAgfQogICAgI2lmICgkU2VsZi0+QXR0YWNobWVudERlbGV0ZSglUGFyYW0pKSB7CiAgICAgICAgbXkgQFZvdGVJRHMgPSBAeyRTZWxmLT5Wb3RlU2VhcmNoKEl0ZW1JRCA9PiAkUGFyYW17SXRlbUlEfSl9OwogICAgICAgIGZvcmVhY2ggbXkgJFRtcFZvdGVJRCAoQFZvdGVJRHMpIHsKICAgICAgICAgICAgaWYoISRTZWxmLT5Wb3RlRGVsZXRlKFZvdGVJRCA9PiAkVG1wVm90ZUlEKSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICgkU2VsZi0+RkFRSGlzdG9yeURlbGV0ZSglUGFyYW0pKSB7CiAgICAgICAgICAgIGlmICgkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZShTUUwgPT4gIkRFTEVURSBGUk9NIGZhcV9pdGVtIFdIRVJFIGlkID0gJFBhcmFte0l0ZW1JRH0iKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAjfQogICAgcmV0dXJuIDA7Cn0KCj1pdGVtIEZBUUhpc3RvcnlBZGQoKQoKYWRkIGFuIGhpc3RvcnkgdG8gYW4gYXJ0aWNsZQoKICAkRmxhZyA9ICRGQVFPYmplY3QtPkZBUUhpc3RvcnlBZGQoCiAgICAgIEl0ZW1JRCA9PiAxLAogICAgICBOYW1lID0+ICdVcGRhdGVkIEFydGljbGUuJywKICApOwoKPWN1dAoKc3ViIEZBUUhpc3RvcnlBZGQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KEl0ZW1JRCBOYW1lKSkgewogICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgIHJldHVybiAwOwogICAgICB9CiAgICB9CiAgICAjIGRiIHF1b3RlCiAgICBmb3JlYWNoIChxdyhOYW1lKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSkgfHwgJyc7CiAgICB9CiAgICBmb3JlYWNoIChxdyhJdGVtSUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99LCAnSW50ZWdlcicpOwogICAgfQogICAgbXkgJFNRTCA9ICJJTlNFUlQgSU5UTyBmYXFfaGlzdG9yeSAobmFtZSwgaXRlbV9pZCwgIi4KICAgICAgICAgICAgIiBjcmVhdGVkLCBjcmVhdGVkX2J5LCBjaGFuZ2VkLCBjaGFuZ2VkX2J5KSIuCiAgICAgICAgICAgICIgVkFMVUVTICIuCiAgICAgICAgICAgICIgKCckUGFyYW17TmFtZX0nLCAkUGFyYW17SXRlbUlEfSwgIi4KICAgICAgICAgICAgIiBjdXJyZW50X3RpbWVzdGFtcCwgJFNlbGYtPntVc2VySUR9LCAiLgogICAgICAgICAgICAiIGN1cnJlbnRfdGltZXN0YW1wLCAkU2VsZi0+e1VzZXJJRH0pIjsKCiAgICBpZiAoJFNlbGYtPntEQk9iamVjdH0tPkRvKFNRTCA9PiAkU1FMKSkgewogICAgICAgIHJldHVybiAxOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9Cn0KCj1pdGVtIEZBUUhpc3RvcnlHZXQoKQoKZ2V0IGEgYXJyYXkgd2l0aCBoYWNocmVmIChOYW1lLCBDcmVhdGVkKSB3aXRoIGhpc3Rvcnkgb2YgYW4gYXJ0aWNsZSBiYWNrCgogIG15IEBEYXRhID0gQHskRkFRT2JqZWN0LT5GQVFIaXN0b3J5R2V0KAogICAgICBJdGVtSUQgPT4gMSwKICApfTsKCj1jdXQKCnN1YiBGQVFIaXN0b3J5R2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhJdGVtSUQpKSB7CiAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgcmV0dXJuIFtdOwogICAgICB9CiAgICB9CiAgICAjIGRiIHF1b3RlCiAgICBmb3JlYWNoIChxdyhJdGVtSUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99LCAnSW50ZWdlcicpOwogICAgfQogICAgbXkgQERhdGEgPSAoKTsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAiU0VMRUNUIG5hbWUsIGNyZWF0ZWQgRlJPTSBmYXFfaGlzdG9yeSBXSEVSRSBpdGVtX2lkID0gJFBhcmFte0l0ZW1JRH0iLAogICAgKTsKICAgIHdoaWxlICAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICBteSAlUmVjb3JkID0gKAogICAgICAgICAgICBOYW1lID0+ICRSb3dbMF0sCiAgICAgICAgICAgIENyZWF0ZWQgPT4gJFJvd1sxXSwKICAgICAgICApOwogICAgICAgIHB1c2ggKEBEYXRhLCBcJVJlY29yZCk7CiAgICB9CiAgICByZXR1cm4gXEBEYXRhOwp9Cgo9aXRlbSBGQVFIaXN0b3J5RGVsZXRlKCkKCmRlbGV0ZSBhbiBoaXN0b3J5IG9mIGFuIGFydGljbGUKCiAgJEZBUU9iamVjdC0+RkFRSGlzdG9yeURlbGV0ZSgKICAgICAgSXRlbUlEID0+IDEsCiAgKTsKCj1jdXQKCnN1YiBGQVFIaXN0b3J5RGVsZXRlIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhJdGVtSUQpKSB7CiAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KICAgIH0KICAgICMgZGIgcXVvdGUKICAgIGZvcmVhY2ggKHF3KEl0ZW1JRCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30sICdJbnRlZ2VyJyk7CiAgICB9CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gIkRFTEVURSBGUk9NIGZhcV9oaXN0b3J5IFdIRVJFIGl0ZW1faWQgPSAkUGFyYW17SXRlbUlEfSIsCiAgICApOwogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIEhpc3RvcnlHZXQoKQoKZ2V0IHRoZSBzeXN0ZW0gaGlzdG9yeQoKICBteSBARGF0YSA9IEB7JEZBUU9iamVjdC0+SGlzdG9yeUdldCgpfTsKCj1jdXQKCnN1YiBIaXN0b3J5R2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdygpKSB7CiAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CiAgICAjIHF1ZXJ5CiAgICBteSAkU1FMID0gIlNFTEVDVCBpLmlkLCBoLm5hbWUsIGguY3JlYXRlZCwgaC5jcmVhdGVkX2J5LCBjLm5hbWUsIGkuZl9zdWJqZWN0LCBpLmZfbnVtYmVyIEZST00iLgogICAgICAgICIgZmFxX2l0ZW0gaSwgZmFxX3N0YXRlIHMsIGZhcV9oaXN0b3J5IGgsIGZhcV9jYXRlZ29yeSBjIFdIRVJFIi4KICAgICAgICAiIHMuaWQgPSBpLnN0YXRlX2lkIEFORCBoLml0ZW1faWQgPSBpLmlkIEFORCBpLmNhdGVnb3J5X2lkID0gYy5pZCI7CiAgICBpZiAoJFBhcmFte1N0YXRlc30gJiYgcmVmKCRQYXJhbXtTdGF0ZXN9KSBlcSAnQVJSQVknICYmIEB7JFBhcmFte1N0YXRlc319KSB7CiAgICAgICAgJFNRTCAuPSAiIEFORCBzLm5hbWUgSU4gKCcke1woam9pbiAnXCcsIFwnJywgQHskUGFyYW17U3RhdGVzfX0pfScpICI7CiAgICB9CiAgICAkU1FMIC49ICcgT1JERVIgQlkgY3JlYXRlZCBERVNDJzsKICAgIG15IEBEYXRhID0gKCk7CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZShTUUwgPT4gJFNRTCwgTGltaXQgPT4gMjAwKTsKICAgIHdoaWxlICAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICBteSAlUmVjb3JkID0gKAogICAgICAgICAgICBJdGVtSUQgPT4gJFJvd1swXSwKICAgICAgICAgICAgQWN0aW9uID0+ICRSb3dbMV0sCiAgICAgICAgICAgIENyZWF0ZWQgPT4gJFJvd1syXSwKICAgICAgICAgICAgQ3JlYXRlZEJ5ID0+ICRSb3dbM10sCiAgICAgICAgICAgIENhdGVnb3J5ID0+ICRSb3dbNF0sCiAgICAgICAgICAgIFN1YmplY3QgPT4gJFJvd1s1XSwKICAgICAgICAgICAgTnVtYmVyID0+ICRSb3dbNl0sCiAgICAgICAgKTsKICAgICAgICBwdXNoIChARGF0YSwgXCVSZWNvcmQpOwogICAgfQogICAgcmV0dXJuIFxARGF0YTsKfQoKPWl0ZW0gQ2F0ZWdvcnlMaXN0KCkKCmdldCB0aGUgY2F0ZWdvcnkgbGlzdCBhcyBoYXNoCgogIG15ICVDYXRlZ29yaWVzID0gJXskRkFRT2JqZWN0LT5DYXRlZ29yeUxpc3QoCiAgICAgVmFsaWQgPT4gMSwKICApfTsKCj1jdXQKCnN1YiBDYXRlZ29yeUxpc3QgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KCkpIHsKICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICByZXR1cm4ge307CiAgICAgIH0KICAgIH0KICAgICMgc3FsCiAgICBteSAkU1FMID0gJ1NFTEVDVCBpZCwgcGFyZW50X2lkLCBuYW1lIEZST00gZmFxX2NhdGVnb3J5ICc7CiAgICBpZihkZWZpbmVkKCRQYXJhbXtWYWxpZH0pKSB7CiAgICAgICAgJFNRTCAuPSAnV0hFUkUgdmFsaWRfaWQgPSAxJzsKICAgIH0KICAgIG15ICVEYXRhID0gKCk7CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZShTUUwgPT4gJFNRTCk7CiAgICB3aGlsZSAgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgJERhdGF7JFJvd1sxXX17JFJvd1swXX0gPSAkUm93WzJdOwogICAgfQoKICAgIHJldHVybiBcJURhdGE7Cn0KCj1pdGVtIENhdGVnb3J5U2VhcmNoKCkKCmdldCB0aGUgY2F0ZWdvcnkgc2VhcmNoIGFzIGhhc2gKCiAgbXkgQENhdGVnb3JpZUlEcyA9IEB7JEZBUU9iamVjdC0+Q2F0ZWdvcnlTZWFyY2goCiAgICBOYW1lID0+ICJOYW1lIgogICl9OwoKPWN1dAoKc3ViIENhdGVnb3J5U2VhcmNoIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIHNxbAogICAgbXkgJFNRTCA9ICJTRUxFQ1QgaWQgRlJPTSBmYXFfY2F0ZWdvcnkgV0hFUkUgdmFsaWRfaWQgPSAxICI7CiAgICBteSAkRXh0ID0gJyc7CgogICAgIyBXSEVSRQogICAgaWYgKGRlZmluZWQoJFBhcmFte05hbWV9KSkgewogICAgICAgICRFeHQgLj0gIiBBTkQgbmFtZSBMSUtFICclIi4kU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFte05hbWV9KS4iJSciOwogICAgfQogICAgZWxzaWYgKGRlZmluZWQoJFBhcmFte1BhcmVudElEfSkpIHsKICAgICAgICAkRXh0IC49ICIgQU5EIHBhcmVudF9pZCA9ICciLiRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17UGFyZW50SUR9LCAnSW50ZWdlcicpLiInIjsKICAgIH0KICAgIGVsc2lmIChkZWZpbmVkKCRQYXJhbXtQYXJlbnRJRHN9KSAmJiByZWYoJFBhcmFte1BhcmVudElEc30pIGVxICdBUlJBWScgJiYgQHskUGFyYW17UGFyZW50SURzfX0pIHsKICAgICAgICAkRXh0ID0gIiBBTkQgcGFyZW50X2lkIElOICgiOwogICAgICAgIGZvcmVhY2ggbXkgJFBhcmVudElEIChAeyRQYXJhbXtQYXJlbnRJRHN9fSkgewogICAgICAgICAgICAkRXh0IC49ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyZW50SUQsICdJbnRlZ2VyJykuIiwiOwogICAgICAgIH0KICAgICAgICAkRXh0ID0gc3Vic3RyKCRFeHQsMCwtMSk7CiAgICAgICAgJEV4dCAuPSAiKSI7CiAgICB9CiAgICBlbHNpZiAoZGVmaW5lZCgkUGFyYW17Q2F0ZWdvcnlJRHN9KSAmJiByZWYoJFBhcmFte0NhdGVnb3J5SURzfSkgZXEgJ0FSUkFZJyAmJiBAeyRQYXJhbXtDYXRlZ29yeUlEc319KSB7CiAgICAgICAgJEV4dCA9ICIgQU5EIGlkIElOICgiOwogICAgICAgIGZvcmVhY2ggbXkgJENhdGVnb3J5SUQgKEB7JFBhcmFte0NhdGVnb3J5SURzfX0pIHsKICAgICAgICAgICAgJEV4dCAuPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJENhdGVnb3J5SUQsICdJbnRlZ2VyJykuIiwiOwogICAgICAgIH0KICAgICAgICAkRXh0ID0gc3Vic3RyKCRFeHQsMCwtMSk7CiAgICAgICAgJEV4dCAuPSAiKSI7CiAgICB9CiAgICAjaWYgKGRlZmluZWQoJFBhcmFte1ZhbGlkSUR9KSkgewogICAgIyAgICAkRXh0IC49ICIgQU5EIHZhbGlkX2lkID0gJyIuJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXtWYWxpZElEfSwgJ0ludGVnZXInKS4iJyAiOwogICAgI30KCiAgICAjIE9SREVSIEJZCiAgICBpZiAoJFBhcmFte09yZGVyfSkgewogICAgICAgICRFeHQgLj0gIiBPUkRFUiBCWSAiOwogICAgICAgIGlmKCRQYXJhbXtPcmRlcn0gZXEgJ05hbWUnKSB7CiAgICAgICAgICAgICRFeHQgLj0gIm5hbWUiOwogICAgICAgIH0KICAgICAgICAjZGVmYXVsdAogICAgICAgIGVsc2UgewogICAgICAgICAgICAkRXh0IC49ICJuYW1lIjsKICAgICAgICB9CiAgICAgICAgIyBTT1JUCiAgICAgICAgaWYgKCRQYXJhbXtTb3J0fSkgewogICAgICAgICAgICBpZiAoJFBhcmFte1NvcnR9IGVxICd1cCcpIHsKICAgICAgICAgICAgICAgICRFeHQgLj0gIiBBU0MiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICgkUGFyYW17U29ydH0gZXEgJ2Rvd24nKSB7CiAgICAgICAgICAgICAgICAkRXh0IC49ICIgREVTQyI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBTUUwgU1RBVEVNRU5UCiAgICAkU1FMIC49ICRFeHQ7CgogICAgbXkgQExpc3QgPSAoKTsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAkU1FMLCBMaW1pdCA9PiA1MDApOwogICAgd2hpbGUgIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgIHB1c2ggKEBMaXN0LCAkUm93WzBdKTsKICAgIH0KICAgIHJldHVybiBcQExpc3Q7Cn0KCj1pdGVtIENhdGVnb3J5R2V0KCkKCmdldCBhIGNhdGVnb3J5IGFzIGhhc2gKCiAgbXkgJUNhdGVnb3J5ID0gJEZBUU9iamVjdC0+Q2F0ZWdvcnlHZXQoCiAgICAgIElEID0+IDEsCiAgKTsKCj1jdXQKCnN1YiBDYXRlZ29yeUdldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoQ2F0ZWdvcnlJRCkpIHsKICAgICAgaWYgKCFkZWZpbmVkKCRQYXJhbXskX30pKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KICAgICMgZGIgcXVvdGUKICAgIGZvcmVhY2ggKHF3KENhdGVnb3J5SUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99LCAnSW50ZWdlcicpOwogICAgfQogICAgIyBzcWwKICAgIG15ICVEYXRhID0gKCk7CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gIlNFTEVDVCBpZCwgcGFyZW50X2lkLCBuYW1lLCBjb21tZW50cywgdmFsaWRfaWQgRlJPTSBmYXFfY2F0ZWdvcnkgV0hFUkUgaWQgPSAkUGFyYW17Q2F0ZWdvcnlJRH0gIiwKICAgICk7CiAgICB3aGlsZSAgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgJURhdGEgPSAoCiAgICAgICAgICAgIENhdGVnb3J5SUQgPT4gJFJvd1swXSwKICAgICAgICAgICAgUGFyZW50SUQgPT4gJFJvd1sxXSwKICAgICAgICAgICAgTmFtZSA9PiAkUm93WzJdLAogICAgICAgICAgICBDb21tZW50ID0+ICRSb3dbM10sCiAgICAgICAgICAgIFZhbGlkSUQgPT4gJFJvd1s0XSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuICVEYXRhOwp9Cgo9aXRlbSBDYXRlZ29yeVN1YkNhdGVnb3J5SURMaXN0KCkKCmdldCBhbGwgc3ViY2F0ZWdvcnkgaWRzIG9mIG9mIGEgY2F0ZWdvcnkKCiAgbXkgJUNhdGVnb3J5ID0gJEZBUU9iamVjdC0+Q2F0ZWdvcnlTdWJDYXRlZ29yaWVJRExpc3QoCiAgICAgIFBhcmVudElEID0+IDEsCiAgICAgIEl0ZW1TdGF0ZXMgPT4gWzEsMiwzXQogICk7Cgo9Y3V0CgpzdWIgQ2F0ZWdvcnlTdWJDYXRlZ29yeUlETGlzdCB7CgogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhQYXJlbnRJRCBJdGVtU3RhdGVzKSkgewogICAgICAgIGlmICghZGVmaW5lZCgkUGFyYW17JF99KSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgfQogICAgfQoKICAgICMgYWRkIHN1YmNhdGVnb3J5aWRzCiAgICBteSBAU3ViQ2F0ZWdvcnlJRHMgPSBAeyRTZWxmLT5DYXRlZ29yeVNlYXJjaCgKICAgICAgICBQYXJlbnRJRCA9PiAkUGFyYW17UGFyZW50SUR9LAogICAgICAgIFN0YXRlcyA9PiAkUGFyYW17SXRlbVN0YXRlc30sCiAgICAgICAgT3JkZXIgPT4gJ0NyZWF0ZWQnLAogICAgICAgIFNvcnQgPT4gJ2Rvd24nLAogICAgKX07CiAgICBmb3JlYWNoIG15ICRTdWJDYXRlZ29yeUlEIChAU3ViQ2F0ZWdvcnlJRHMpIHsKICAgICAgICBteSBAVGVtcCA9IEB7JFNlbGYtPkNhdGVnb3J5U3ViQ2F0ZWdvcnlJRExpc3QoCiAgICAgICAgICAgIFBhcmVudElEID0+ICRTdWJDYXRlZ29yeUlELAogICAgICAgICAgICBJdGVtU3RhdGVzID0+ICRQYXJhbXtJdGVtU3RhdGVzfQogICAgICAgICl9OwogICAgICAgIGlmKEBUZW1wKSB7CiAgICAgICAgICAgIHB1c2goQFN1YkNhdGVnb3J5SURzLCBAVGVtcCk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIFxAU3ViQ2F0ZWdvcnlJRHM7Cn0KCj1pdGVtIENhdGVnb3J5QWRkKCkKCmFkZCBhIGNhdGVnb3J5CgogIG15ICRJRCA9ICRGQVFPYmplY3QtPkNhdGVnb3J5QWRkKAogICAgICBOYW1lID0+ICdTb21lIENhdGVnb3J5JywKICAgICAgQ29tbWVudCA9PiAnc29tZSBjb21tZW50IC4uLicsCiAgKTsKCj1jdXQKCnN1YiBDYXRlZ29yeUFkZCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoUGFyZW50SUQgTmFtZSkpIHsKICAgICAgaWYgKCFkZWZpbmVkKCRQYXJhbXskX30pKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KICAgICMgZGIgcXVvdGUKICAgIGZvcmVhY2ggKHF3KE5hbWUgQ29tbWVudCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30pIHx8ICcnOwogICAgfQogICAgZm9yZWFjaCAocXcoUGFyZW50SUQgVXNlcklEIFZhbGlkSUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99LCAnSW50ZWdlcicpOwogICAgfQogICAgbXkgJFNRTCA9ICJJTlNFUlQgSU5UTyBmYXFfY2F0ZWdvcnkgKG5hbWUsIHBhcmVudF9pZCwgY29tbWVudHMsIHZhbGlkX2lkLCAiLgogICAgICAgICAgICAiIGNyZWF0ZWQsIGNyZWF0ZWRfYnksIGNoYW5nZWQsIGNoYW5nZWRfYnkpIi4KICAgICAgICAgICAgIiBWQUxVRVMgIi4KICAgICAgICAgICAgIiAoJyRQYXJhbXtOYW1lfScsICRQYXJhbXtQYXJlbnRJRH0sICckUGFyYW17Q29tbWVudH0nLCAkUGFyYW17VmFsaWRJRH0sICIuCiAgICAgICAgICAgICIgY3VycmVudF90aW1lc3RhbXAsICRTZWxmLT57VXNlcklEfSwgIi4KICAgICAgICAgICAgIiBjdXJyZW50X3RpbWVzdGFtcCwgJFNlbGYtPntVc2VySUR9KSI7CiAgICBpZiAoJFNlbGYtPntEQk9iamVjdH0tPkRvKFNRTCA9PiAkU1FMKSkgewogICAgICAgICMgZ2V0IG5ldyBjYXRlZ29yeSBpZAogICAgICAgICRTUUwgPSAiU0VMRUNUIGlkICIuCiAgICAgICAgICAiIEZST00gIiAuCiAgICAgICAgICAiIGZhcV9jYXRlZ29yeSAiIC4KICAgICAgICAgICIgV0hFUkUgIiAuCiAgICAgICAgICAiIG5hbWUgPSAnJFBhcmFte05hbWV9JyI7CiAgICAgICAgbXkgJElEID0gJyc7CiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoU1FMID0+ICRTUUwpOwogICAgICAgIHdoaWxlIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgICAgJElEID0gJFJvd1swXTsKICAgICAgICB9CiAgICAgICAgIyBsb2cgbm90aWNlCiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICAgIE1lc3NhZ2UgPT4gIkZBUUNhdGVnb3J5OiAnJFBhcmFte05hbWV9JyBJRDogJyRJRCcgY3JlYXRlZCBzdWNjZXNzZnVsbHkgKCRTZWxmLT57VXNlcklEfSkhIiwKICAgICAgICApOwogICAgICAgIHJldHVybiAkSUQ7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm47CiAgICB9Cn0KCj1pdGVtIENhdGVnb3J5VXBkYXRlKCkKCnVwZGF0ZSBhIGNhdGVnb3J5CgogICRGQVFPYmplY3QtPkNhdGVnb3J5VXBkYXRlKAogICAgICBJRCA9PiAxLAogICAgICBOYW1lID0+ICdTb21lIENhdGVnb3J5JywKICAgICAgQ29tbWVudCA9PiAnc29tZSBjb21tZW50IC4uLicsCiAgKTsKCj1jdXQKCnN1YiBDYXRlZ29yeVVwZGF0ZSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoQ2F0ZWdvcnlJRCBQYXJlbnRJRCBOYW1lKSkgewogICAgICBpZiAoIWRlZmluZWQoJFBhcmFteyRffSkpIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfQogICAgIyBkYiBxdW90ZQogICAgZm9yZWFjaCAocXcoTmFtZSBDb21tZW50KSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSkgfHwgJyc7CiAgICB9CiAgICBmb3JlYWNoIChxdyhDYXRlZ29yeUlEIFBhcmVudElEIFZhbGlkSUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99LCAnSW50ZWdlcicpOwogICAgfQoKICAgICMgc3FsCiAgICBteSAkU1FMID0gIlVQREFURSBmYXFfY2F0ZWdvcnkgU0VUICIuCiAgICAgICAgICAiIHBhcmVudF9pZCA9ICRQYXJhbXtQYXJlbnRJRH0sICIuCiAgICAgICAgICAiIG5hbWUgPSAnJFBhcmFte05hbWV9JywgIi4KICAgICAgICAgICIgY29tbWVudHMgPSAnJFBhcmFte0NvbW1lbnR9JywgIi4KICAgICAgICAgICIgdmFsaWRfaWQgPSAnJFBhcmFte1ZhbGlkSUR9JywgIi4KICAgICAgICAgICIgY2hhbmdlZCA9IGN1cnJlbnRfdGltZXN0YW1wLCBjaGFuZ2VkX2J5ID0gJFNlbGYtPntVc2VySUR9ICIuCiAgICAgICAgICAiIFdIRVJFIGlkID0gJFBhcmFte0NhdGVnb3J5SUR9IjsKICAgIGlmICgkU2VsZi0+e0RCT2JqZWN0fS0+RG8oU1FMID0+ICRTUUwpKSB7CiAgICAgICAgIyBsb2cgbm90aWNlCiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICAgIE1lc3NhZ2UgPT4gIkZBUUNhdGVnb3J5OiAnJFBhcmFte05hbWV9JyBJRDogJyRQYXJhbXtDYXRlZ29yeUlEfScgdXBkYXRlZCBzdWNjZXNzZnVsbHkgKCRTZWxmLT57VXNlcklEfSkhIiwKICAgICAgICApOwogICAgICAgIHJldHVybiAxOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuOwogICAgfQp9Cgo9aXRlbSBDYXRlZ29yeUR1cGxpY2F0ZUNoZWNrKCkKCmNoZWNrIGEgY2F0ZWdvcnkKCiAgJEZBUU9iamVjdC0+Q2F0ZWdvcnlEdXBsaWNhdGVDaGVjaygKICAgICAgSUQgPT4gMSwgIyBvcgogICAgICBOYW1lID0+ICdTb21lIE5hbWUnLAogICAgICBQYXJlbnRJRCA9PiAxLAogICk7Cgo9Y3V0CgpzdWIgQ2F0ZWdvcnlEdXBsaWNhdGVDaGVjayB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBkYiBxdW90ZQogICAgZm9yZWFjaCAocXcoTmFtZSkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30pIHx8ICcnOwogICAgfQogICAgZm9yZWFjaCAocXcoSUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99LCAnSW50ZWdlcicpOwogICAgfQoKICAgICMgc3FsCiAgICBteSAkU1FMID0gIlNFTEVDVCBpZCBGUk9NIGZhcV9jYXRlZ29yeSBXSEVSRSAiOwogICAgaWYoZGVmaW5lZCgkUGFyYW17TmFtZX0pKSB7CiAgICAgICAgJFNRTCAuPSAibmFtZSA9ICckUGFyYW17TmFtZX0nIEFORCBwYXJlbnRfaWQgPSAkUGFyYW17UGFyZW50SUR9ICI7CiAgICAgICAgaWYoZGVmaW5lZCgkUGFyYW17SUR9KSkgewogICAgICAgICAgICAkU1FMIC49ICJBTkQgaWQgIT0gJyRQYXJhbXtJRH0nICI7CiAgICAgICAgfQogICAgfQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoU1FMID0+ICRTUUwpOwogICAgaWYgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKPWl0ZW0gQ2F0ZWdvcnlDb3VudCgpCgpjb3VudCBhbiBhcnRpY2xlCgogICRGQVFPYmplY3QtPkNhdGVnb3J5Q291bnQoCiAgICAgIFBhcmVudElEcyA9PiBbMSwyLDMsNF0sCiAgKTsKCj1jdXQKCnN1YiBDYXRlZ29yeUNvdW50IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoUGFyZW50SURzKSkgewogICAgICAgIGlmICghZGVmaW5lZCgkUGFyYW17JF99KSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRTUUwgPSAiIjsKICAgIG15ICRFeHQgPSAiIjsKCiAgICAkU1FMID0gIlNFTEVDVCBDT1VOVCgqKSIgLgogICAgICAgICAgICIgRlJPTSBmYXFfY2F0ZWdvcnkgV0hFUkUgdmFsaWRfaWQgPSAxIjsKCiAgICBpZihkZWZpbmVkKCRQYXJhbXtQYXJlbnRJRHN9KSkgewogICAgICAgICRFeHQgPSAiIEFORCBwYXJlbnRfaWQgSU4gKCI7CiAgICAgICAgZm9yZWFjaCBteSAkUGFyZW50SUQgKEB7JFBhcmFte1BhcmVudElEc319KSB7CiAgICAgICAgICAgICRFeHQgLj0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJlbnRJRCwnSW50ZWdlcicpLiIsIjsKICAgICAgICB9CiAgICAgICAgJEV4dCA9IHN1YnN0cigkRXh0LDAsLTEpOwogICAgICAgICRFeHQgLj0gIikiOwogICAgfQogICAgJEV4dCAuPSAiIEdST1VQIEJZIHBhcmVudF9pZCI7CgogICAgJFNRTCAuPSAkRXh0OwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoU1FMID0+ICRTUUwsIExpbWl0ID0+IDIwMCk7CgogICAgbXkgJURhdGEgPSAoKTsKICAgIGlmKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgcmV0dXJuICRSb3dbMF07CiAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAwOwogICAgfQoKfQoKPWl0ZW0gU3RhdGVUeXBlTGlzdCgpCgpnZXQgdGhlIHN0YXRlIHR5cGUgbGlzdCBhcyBoYXNoCgogIG15ICVTdGF0ZVR5cGVzID0gJEZBUU9iamVjdC0+U3RhdGVUeXBlTGlzdCgpOwoKPWN1dAoKc3ViIFN0YXRlVHlwZUxpc3QgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgIG15ICRTUUwgPSAnJzsKICAgIG15ICRFeHQgPSAnJzsKICAgICRTUUwgPSAiU0VMRUNUIGlkLCBuYW1lIEZST00gZmFxX3N0YXRlX3R5cGUiOwoKICAgIGlmKCRQYXJhbXtUeXBlc30pIHsKICAgICAgICBteSBAU3RhdGVzID0gQHskUGFyYW17VHlwZXN9fTsKICAgICAgICAkRXh0ID0gIiBXSEVSRSI7CiAgICAgICAgZm9yZWFjaCBteSAkU3RhdGUgKEBTdGF0ZXMpIHsKICAgICAgICAgICAgJEV4dCAuPSAiIG5hbWUgTElLRSAnIi4kU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFN0YXRlKS4iJyBPUiI7CiAgICAgICAgfQogICAgICAgICRFeHQgPSBzdWJzdHIoJEV4dCwwLC0zKTsKICAgIH0KICAgICRTUUwgLj0gJEV4dDsKCiAgICAjIHNxbAogICAgbXkgJUxpc3QgPSAoKTsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAkU1FMKTsKICAgIHdoaWxlICAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAkTGlzdHskUm93WzBdfSA9ICRSb3dbMV07CiAgICB9CiAgICByZXR1cm4gXCVMaXN0Owp9Cgo9aXRlbSBTdGF0ZUxpc3QoKQoKZ2V0IHRoZSBzdGF0ZSBsaXN0IGFzIGhhc2gKCiAgbXkgJVN0YXRlcyA9ICRGQVFPYmplY3QtPlN0YXRlTGlzdCgpOwoKPWN1dAoKc3ViIFN0YXRlTGlzdCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoKSkgewogICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfQogICAgIyBzcWwKICAgIG15ICVMaXN0ID0gKCk7CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZShTUUwgPT4gJ1NFTEVDVCBpZCwgbmFtZSBGUk9NIGZhcV9zdGF0ZScpOwogICAgd2hpbGUgIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgICRMaXN0eyRSb3dbMF19ID0gJFJvd1sxXTsKICAgIH0KICAgIHJldHVybiAlTGlzdDsKfQoKPWl0ZW0gU3RhdGVVcGRhdGUoKQoKdXBkYXRlIGEgc3RhdGUKCiAgJEZBUU9iamVjdC0+U3RhdGVVcGRhdGUoCiAgICAgIElEID0+IDEsCiAgICAgIE5hbWUgPT4gJ3B1YmxpYycsCiAgICAgIFR5cGVJRCA9PiAxLAogICk7Cgo9Y3V0CgpzdWIgU3RhdGVVcGRhdGUgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KElEIE5hbWUgVHlwZUlEKSkgewogICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfQogICAgIyBkYiBxdW90ZQogICAgZm9yZWFjaCAocXcoTmFtZSkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30pIHx8ICcnOwogICAgfQogICAgZm9yZWFjaCAocXcoSUQgVHlwZUlEKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSwgJ0ludGVnZXInKTsKICAgIH0KICAgICMgc3FsCiAgICBteSAkU1FMID0gIlVQREFURSBmYXFfc3RhdGUgU0VUIG5hbWUgPSAnJFBhcmFte05hbWV9JywgdHlwZV9pZCA9ICRQYXJhbXtUeXBlSUR9LCAiLgogICAgICAgICAgIiBXSEVSRSBpZCA9ICRQYXJhbXtJRH0iOwogICAgaWYgKCRTZWxmLT57REJPYmplY3R9LT5EbyhTUUwgPT4gJFNRTCkpIHsKICAgICAgICByZXR1cm4gMTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybjsKICAgIH0KfQoKPWl0ZW0gU3RhdGVBZGQoKQoKYWRkIGEgc3RhdGUKCiAgbXkgJElEID0gJEZBUU9iamVjdC0+U3RhdGVBZGQoCiAgICAgIElEID0+IDEsCiAgICAgIE5hbWUgPT4gJ3B1YmxpYycsCiAgICAgIFR5cGVJRCA9PiAxLAogICk7Cgo9Y3V0CgpzdWIgU3RhdGVBZGQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KE5hbWUgVHlwZUlEKSkgewogICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfQogICAgIyBkYiBxdW90ZQogICAgZm9yZWFjaCAocXcoTmFtZSkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30pIHx8ICcnOwogICAgfQogICAgZm9yZWFjaCAocXcoVHlwZUlEKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSwgJ0ludGVnZXInKTsKICAgIH0KICAgIG15ICRTUUwgPSAiSU5TRVJUIElOVE8gZmFxX3N0YXRlIChuYW1lLCB0eXBlX2lkKSAiLgogICAgICAgICAgICAiIFZBTFVFUyAiLgogICAgICAgICAgICAiICgnJFBhcmFte05hbWV9JywgJFBhcmFte1R5cGVJRH0pICI7CgogICAgaWYgKCRTZWxmLT57REJPYmplY3R9LT5EbyhTUUwgPT4gJFNRTCkpIHsKICAgICAgICByZXR1cm4gMTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybjsKICAgIH0KfQoKPWl0ZW0gU3RhdGVHZXQoKQoKZ2V0IGEgc3RhdGUgYXMgaGFzaAoKICBteSAlU3RhdGUgPSAkRkFRT2JqZWN0LT5TdGF0ZUdldCgKICAgICAgSUQgPT4gMSwKICApOwoKPWN1dAoKc3ViIFN0YXRlR2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhJRCkpIHsKICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KICAgICMgZGIgcXVvdGUKICAgIGZvcmVhY2ggKHF3KElEKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSwgJ0ludGVnZXInKTsKICAgIH0KICAgICMgc3FsCiAgICBteSAlRGF0YSA9ICgpOwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICJTRUxFQ1QgaWQsIG5hbWUgRlJPTSBmYXFfc3RhdGUgV0hFUkUgaWQgPSAkUGFyYW17SUR9IiwKICAgICk7CiAgICB3aGlsZSAgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgJURhdGEgPSAoCiAgICAgICAgICAgIElEID0+ICRSb3dbMF0sCiAgICAgICAgICAgIE5hbWUgPT4gJFJvd1sxXSwKICAgICAgICAgICAgQ29tbWVudCA9PiAkUm93WzJdLAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gJURhdGE7Cn0KCj1pdGVtIFN0YXRlVHlwZUdldCgpCgpnZXQgYSBzdGF0ZSBhcyBoYXNoCgogIG15ICVTdGF0ZSA9ICRGQVFPYmplY3QtPlN0YXRlR2V0KAogICAgICBJRCA9PiAxLCAjIG9yCiAgICAgIE5hbWUgPT4gJ2ludGVybmFsJywKICApOwoKPWN1dAoKc3ViIFN0YXRlVHlwZUdldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgbXkgJFNRTCA9ICIiOwogICAgbXkgJEV4dCA9ICIiOwoKICAgICRTUUwgPSAiU0VMRUNUIGlkLCBuYW1lICIuCiAgICAgICAgICAgIiBGUk9NIGZhcV9zdGF0ZV90eXBlIFdIRVJFIjsKCiAgICBpZihkZWZpbmVkKCRQYXJhbXtJRH0pKSB7CiAgICAgICAgJEV4dCAuPSAiIGlkID0gIi4kU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFte0lEfSwgJ0ludGVnZXInKQogICAgfQogICAgZWxzaWYoZGVmaW5lZCgkUGFyYW17TmFtZX0pKSB7CiAgICAgICAgJEV4dCAuPSAiIG5hbWUgTElLRSAnIi4kU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFte05hbWV9KS4iJyIKICAgIH0KICAgICRTUUwgLj0gJEV4dDsKICAgICMgc3FsCiAgICBteSAlRGF0YSA9ICgpOwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICRTUUwsCiAgICApOwogICAgd2hpbGUgIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgICVEYXRhID0gKAogICAgICAgICAgICBJRCA9PiAkUm93WzBdLAogICAgICAgICAgICBOYW1lID0+ICRSb3dbMV0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiBcJURhdGE7Cn0KCj1pdGVtIExhbmd1YWdlTGlzdCgpCgpnZXQgdGhlIGxhbmd1YWdlIGxpc3QgYXMgaGFzaAoKICBteSAlTGFuZ3VhZ2VzID0gJEZBUU9iamVjdC0+TGFuZ3VhZ2VMaXN0KCk7Cgo9Y3V0CgpzdWIgTGFuZ3VhZ2VMaXN0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdygpKSB7CiAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CiAgICAjIHNxbAogICAgbXkgJUxpc3QgPSAoKTsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAnU0VMRUNUIGlkLCBuYW1lIEZST00gZmFxX2xhbmd1YWdlJyk7CiAgICB3aGlsZSAgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgJExpc3R7JFJvd1swXX0gPSAkUm93WzFdOwogICAgfQogICAgcmV0dXJuICVMaXN0Owp9Cgo9aXRlbSBMYW5ndWFnZVVwZGF0ZSgpCgp1cGRhdGUgYSBsYW5ndWFnZQoKICAkRkFRT2JqZWN0LT5MYW5ndWFnZVVwZGF0ZSgKICAgICAgSUQgPT4gMSwKICAgICAgTmFtZSA9PiAnU29tZSBDYXRlZ29yeScsCiAgKTsKCj1jdXQKCnN1YiBMYW5ndWFnZVVwZGF0ZSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoSUQgTmFtZSkpIHsKICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KICAgICMgZGIgcXVvdGUKICAgIGZvcmVhY2ggKHF3KE5hbWUpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99KSB8fCAnJzsKICAgIH0KICAgIGZvcmVhY2ggKHF3KElEKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSwgJ0ludGVnZXInKTsKICAgIH0KICAgICMgc3FsCiAgICBteSAkU1FMID0gIlVQREFURSBmYXFfbGFuZ3VhZ2UgU0VUIG5hbWUgPSAnJFBhcmFte05hbWV9JyAiLgogICAgICAgICAgIiBXSEVSRSBpZCA9ICRQYXJhbXtJRH0iOwogICAgaWYgKCRTZWxmLT57REJPYmplY3R9LT5EbyhTUUwgPT4gJFNRTCkpIHsKICAgICAgICByZXR1cm4gMTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybjsKICAgIH0KfQoKPWl0ZW0gTGFuZ3VhZ2VEdXBsaWNhdGVDaGVjaygpCgpjaGVjayBhIGxhbmd1YWdlCgogICRGQVFPYmplY3QtPkxhbmd1YWdlRHVwbGljYXRlQ2hlY2soCiAgICAgIE5hbWUgPT4gJ1NvbWUgTmFtZScsCiAgICAgIElEID0+IDEsICMgZm9yIHVwZGF0ZQogICk7Cgo9Y3V0CgpzdWIgTGFuZ3VhZ2VEdXBsaWNhdGVDaGVjayB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBkYiBxdW90ZQogICAgZm9yZWFjaCAocXcoTmFtZSkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30pIHx8ICcnOwogICAgfQogICAgZm9yZWFjaCAocXcoSUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99LCAnSW50ZWdlcicpOwogICAgfQoKICAgICMgc3FsCiAgICBteSAkU1FMID0gIlNFTEVDVCBpZCBGUk9NIGZhcV9sYW5ndWFnZSBXSEVSRSAiOwogICAgaWYoZGVmaW5lZCgkUGFyYW17TmFtZX0pKSB7CiAgICAgICAgJFNRTCAuPSAibmFtZSA9ICckUGFyYW17TmFtZX0nICI7CiAgICB9CiAgICBpZihkZWZpbmVkKCRQYXJhbXtJRH0pKSB7CiAgICAgICAgJFNRTCAuPSAiQU5EIGlkICE9ICckUGFyYW17SUR9JyAiOwogICAgfQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoU1FMID0+ICRTUUwpOwogICAgd2hpbGUgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKPWl0ZW0gTGFuZ3VhZ2VBZGQoKQoKYWRkIGEgbGFuZ3VhZ2UKCiAgbXkgJElEID0gJEZBUU9iamVjdC0+TGFuZ3VhZ2VBZGQoCiAgICAgIE5hbWUgPT4gJ1NvbWUgQ2F0ZWdvcnknLAogICk7Cgo9Y3V0CgpzdWIgTGFuZ3VhZ2VBZGQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KE5hbWUpKSB7CiAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CiAgICAjIGRiIHF1b3RlCiAgICBmb3JlYWNoIChxdyhOYW1lKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSkgfHwgJyc7CiAgICB9CiAgICBteSAkU1FMID0gIklOU0VSVCBJTlRPIGZhcV9sYW5ndWFnZSAobmFtZSkgIi4KICAgICAgICAgICAgIiBWQUxVRVMgIi4KICAgICAgICAgICAgIiAoJyRQYXJhbXtOYW1lfScpICI7CgogICAgaWYgKCRTZWxmLT57REJPYmplY3R9LT5EbyhTUUwgPT4gJFNRTCkpIHsKICAgICAgICByZXR1cm4gMTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybjsKICAgIH0KfQoKPWl0ZW0gTGFuZ3VhZ2VHZXQoKQoKZ2V0IGEgbGFuZ3VhZ2UgYXMgaGFzaAoKICBteSAlTGFuZ3VhZ2UgPSAkRkFRT2JqZWN0LT5MYW5ndWFnZUdldCgKICAgICAgSUQgPT4gMSwKICApOwoKPWN1dAoKc3ViIExhbmd1YWdlR2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhJRCkpIHsKICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KICAgICMgZGIgcXVvdGUKICAgIGZvcmVhY2ggKHF3KElEKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSwgJ0ludGVnZXInKTsKICAgIH0KICAgICMgc3FsCiAgICBteSAlRGF0YSA9ICgpOwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICJTRUxFQ1QgaWQsIG5hbWUgRlJPTSBmYXFfbGFuZ3VhZ2UgV0hFUkUgaWQgPSAkUGFyYW17SUR9IiwKICAgICk7CiAgICB3aGlsZSAgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgJURhdGEgPSAoCiAgICAgICAgICAgIElEID0+ICRSb3dbMF0sCiAgICAgICAgICAgIE5hbWUgPT4gJFJvd1sxXSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuICVEYXRhOwp9Cgo9aXRlbSBGQVFTZWFyY2goKQoKc2VhcmNoIGluIGFydGljbGVzCgogIG15IEBJRHMgPSAkRkFRT2JqZWN0LT5GQVFTZWFyY2goCiAgICAgIE51bWJlciA9PiAnKjEzNConLAogICAgICBXaGF0ID0+ICcqc29tZSB0ZXh0KicsCiAgICAgIEtleXdvcmRzID0+ICcqd2Vic2VydmVyKicsCiAgICAgIFN0YXRlcyA9IFsncHVibGljJywgJ2ludGVybmFsJ10sCiAgICAgIE9yZGVyID0+ICdjaGFuZ2VkJwogICAgICBTb3J0ID0+ICdBU0MnCiAgICAgIExpbWl0ID0+IDE1MCwKICApOwoKPWN1dAoKc3ViIEZBUVNlYXJjaCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoKSkgewogICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfQoKICAgICMgc3FsCiAgICBteSAkU1FMID0gIlNFTEVDVCBpLmlkLCBjb3VudCggdi5pdGVtX2lkICkgdm90ZXMsIGF2Zyggdi5yYXRlICkgcmVzdWx0Ii4KICAgICAgICAiIEZST00gZmFxX2l0ZW0gaSAiLgogICAgICAgICIgTEVGVCBKT0lOIGZhcV92b3RpbmcgdiBPTiB2Lml0ZW1faWQgPSBpLmlkIi4KICAgICAgICAiIExFRlQgSk9JTiBmYXFfc3RhdGUgcyBPTiBzLmlkID0gaS5zdGF0ZV9pZCIuCiAgICAgICAgIiBXSEVSRSI7CiAgICBteSAkRXh0ID0gJyc7CiAgICBmb3JlYWNoIChxdyhmX3N1YmplY3QgZl9maWVsZDEgZl9maWVsZDIgZl9maWVsZDMgZl9maWVsZDQgZl9maWVsZDUgZl9maWVsZDYpKSB7CiAgICAgICAgaWYgKCRFeHQpIHsKICAgICAgICAgICAgJEV4dCAuPSAnIE9SICc7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkRXh0IC49ICcgKCc7CiAgICAgICAgfQogICAgICAgIGlmICgkUGFyYW17V2hhdH0pIHsKICAgICAgICAgICAgbXkgQExpc3QgPSBzcGxpdCgvOy8sICRQYXJhbXtXaGF0fSk7CiAgICAgICAgICAgIG15ICRXaGF0ID0gJyc7CiAgICAgICAgICAgIGZvcmVhY2ggbXkgJFZhbHVlIChATGlzdCkgewogICAgICAgICAgICAgICAgaWYgKCRXaGF0KSB7CiAgICAgICAgICAgICAgICAgICAgJFdoYXQgLj0gJyBPUiAnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJFdoYXQgLj0gIiBMT1dFUihpLiRfKSBMSUtFIExPV0VSKCclIi4kU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFZhbHVlKS4iJScpIjsKICAgICAgICAgICAgfQogICAgICAgICAgICAkRXh0IC49ICRXaGF0OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEV4dCAuPSAiIExPV0VSKGkuJF8pIExJS0UgTE9XRVIoJyUnKSI7CiAgICAgICAgfQogICAgfQogICAgJEV4dCAuPSAnICknOwogICAgaWYgKCRQYXJhbXtOdW1iZXJ9KSB7CiAgICAgICAgJFBhcmFte051bWJlcn0gPX4gcy9cKi8lL2c7CiAgICAgICAgJEV4dCAuPSAiIEFORCBMT1dFUihpLmZfbnVtYmVyKSBMSUtFIExPV0VSKCciLiRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17TnVtYmVyfSkuIicpIjsKICAgIH0KICAgIGlmICgkUGFyYW17VGl0bGV9KSB7CiAgICAgICAgJEV4dCAuPSAiIEFORCBMT1dFUihpLmZfc3ViamVjdCkgTElLRSBMT1dFUignJSIuJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXtUaXRsZX0pLiIlJykiOwogICAgfQogICAgaWYgKCRQYXJhbXtMYW5ndWFnZUlEc30gJiYgcmVmKCRQYXJhbXtMYW5ndWFnZUlEc30pIGVxICdBUlJBWScgJiYgQHskUGFyYW17TGFuZ3VhZ2VJRHN9fSkgewogICAgICAgICRFeHQgLj0gIiBBTkQgaS5mX2xhbmd1YWdlX2lkIElOICgiOwogICAgICAgIGZvcmVhY2ggbXkgJExhbmd1YWdlSUQgKEB7JFBhcmFte0xhbmd1YWdlSURzfX0pIHsKICAgICAgICAgICAgJEV4dCAuPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJExhbmd1YWdlSUQsICdJbnRlZ2VyJykuIiwiOwogICAgICAgIH0KICAgICAgICAkRXh0ID0gc3Vic3RyKCRFeHQsMCwtMSk7CiAgICAgICAgJEV4dCAuPSAiKSI7CiAgICB9CiAgICBpZiAoJFBhcmFte0NhdGVnb3J5SURzfSAmJiByZWYoJFBhcmFte0NhdGVnb3J5SURzfSkgZXEgJ0FSUkFZJyAmJiBAeyRQYXJhbXtDYXRlZ29yeUlEc319KSB7CiAgICAgICAgJEV4dCAuPSAiIEFORCAoaS5jYXRlZ29yeV9pZCBJTiAgKCI7CiAgICAgICAgbXkgJENvdW50ZXI9MDsKICAgICAgICBmb3JlYWNoIG15ICRDYXRlZ29yeUlEIChAeyRQYXJhbXtDYXRlZ29yeUlEc319KSB7CiAgICAgICAgICAgICRFeHQgLj0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRDYXRlZ29yeUlELCAnSW50ZWdlcicpLiIsIjsKICAgICAgICAgICAgJENvdW50ZXIrKzsKICAgICAgICAgICAgaWYoISgkQ291bnRlciU1MDApKSB7CiAgICAgICAgICAgICAgICAkRXh0ID0gc3Vic3RyKCRFeHQsMCwtMSk7CiAgICAgICAgICAgICAgICAkRXh0IC49ICIpIjsKICAgICAgICAgICAgICAgICRFeHQgLj0gIiBPUiBpLmNhdGVnb3J5X2lkIElOICAoIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkRXh0ID0gc3Vic3RyKCRFeHQsMCwtMSk7CiAgICAgICAgJEV4dCAuPSAiKSkiOwogICAgfQogICAgaWYgKCRQYXJhbXtTdGF0ZXN9ICYmIHJlZigkUGFyYW17U3RhdGVzfSkgZXEgJ0hBU0gnICYmICV7JFBhcmFte1N0YXRlc319KSB7CiAgICAgICAgJEV4dCAuPSAiIEFORCBzLnR5cGVfaWQgSU4gKCI7CiAgICAgICAgZm9yZWFjaCBteSAkU3RhdGVJRCAoa2V5cygleyRQYXJhbXtTdGF0ZXN9fSkpIHsKICAgICAgICAgICAgJEV4dCAuPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFN0YXRlSUQsICdJbnRlZ2VyJykuIiwiOwogICAgICAgIH0KICAgICAgICAkRXh0ID0gc3Vic3RyKCRFeHQsMCwtMSk7CiAgICAgICAgJEV4dCAuPSAiKSI7CiAgICB9CiAgICBpZiAoJFBhcmFte0tleXdvcmR9KSB7CiAgICAgICAgJEV4dCAuPSAiIEFORCBMT1dFUihpLmZfa2V5d29yZHMpIExJS0UgTE9XRVIoJyUiLiRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17S2V5d29yZH0pLiIlJykiOwogICAgfQogICAgJEV4dCAuPSAiIEdST1VQIEJZIGkuaWQsIGkuZl9zdWJqZWN0LCBpLmZfbGFuZ3VhZ2VfaWQsIGkuY3JlYXRlZCwgaS5jaGFuZ2VkLCBzLm5hbWUsIHYuaXRlbV9pZCI7CiAgICBpZiAoJFBhcmFte09yZGVyfSkgewogICAgICAgICRFeHQgLj0gIiBPUkRFUiBCWSAiOwoKICAgICAgICAjIHRpdGxlCiAgICAgICAgaWYgKCRQYXJhbXtPcmRlcn0gZXEgJ1RpdGxlJykgewogICAgICAgICAgICAkRXh0IC49ICJpLmZfc3ViamVjdCI7CiAgICAgICAgfQogICAgICAgICMgbGFuZ3VhZ2UKICAgICAgICBlbHNpZiAoJFBhcmFte09yZGVyfSBlcSAnTGFuZ3VhZ2UnKSB7CiAgICAgICAgICAgICRFeHQgLj0gImkuZl9sYW5ndWFnZV9pZCI7CiAgICAgICAgfQogICAgICAgICMgc3RhdGUKICAgICAgICBlbHNpZiAoJFBhcmFte09yZGVyfSBlcSAnU3RhdGUnKSB7CiAgICAgICAgICAgICRFeHQgLj0gInMubmFtZSI7CiAgICAgICAgfQogICAgICAgICMgdm90ZXMKICAgICAgICBlbHNpZiAoJFBhcmFte09yZGVyfSBlcSAnVm90ZXMnKSB7CiAgICAgICAgICAgICRFeHQgLj0gInZvdGVzIjsKICAgICAgICB9CiAgICAgICAgIyByYXRlcwogICAgICAgIGVsc2lmICgkUGFyYW17T3JkZXJ9IGVxICdSZXN1bHQnKSB7CiAgICAgICAgICAgICRFeHQgLj0gInJlc3VsdCI7CiAgICAgICAgfQogICAgICAgICMgY2hhbmdlZAogICAgICAgIGVsc2lmICgkUGFyYW17T3JkZXJ9IGVxICdDcmVhdGVkJykgewogICAgICAgICAgICAkRXh0IC49ICJpLmNoYW5nZWQiOwogICAgICAgIH0KICAgICAgICAjIGNyZWF0ZWQKICAgICAgICBlbHNpZiAoJFBhcmFte09yZGVyfSBlcSAnQ2hhbmdlZCcpIHsKICAgICAgICAgICAgJEV4dCAuPSAiaS5jcmVhdGVkIjsKICAgICAgICB9CgogICAgICAgIGlmICgkUGFyYW17U29ydH0pIHsKICAgICAgICAgICAgaWYgKCRQYXJhbXtTb3J0fSBlcSAndXAnKSB7CiAgICAgICAgICAgICAgICAkRXh0IC49ICIgQVNDIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoJFBhcmFte1NvcnR9IGVxICdkb3duJykgewogICAgICAgICAgICAgICAgJEV4dCAuPSAiIERFU0MiOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgJFNRTCAuPSAkRXh0OwogICAgIyRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gJFNRTCk7CiAgICBteSBATGlzdCA9ICgpOwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoU1FMID0+ICRTUUwsIExpbWl0ID0+ICRQYXJhbXtMaW1pdH0gfHwgNTAwKTsKICAgIHdoaWxlICAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICBwdXNoIChATGlzdCwgJFJvd1swXSk7CiAgICB9CiAgICByZXR1cm4gQExpc3Q7Cn0KPWl0ZW0gRkFRUGF0aExpc3RHZXQoKQoKcmV0dXJucyBhIGNhdGVnb3J5IGFycmF5CgogIG15IEBJRHMgPSAkRkFRT2JqZWN0LT5GQVFQYXRoTGlzdEdldCgKICAgICAgQ2F0ZWdvcnlJRCA9PiAxNTAsCiAgKTsKCj1jdXQKCnN1YiBGQVFQYXRoTGlzdEdldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgbXkgQENhdGVnb3J5TGlzdCA9ICgpOwogICAgbXkgJFRlbXBDYXRlZ29yeUlEID0gJFBhcmFte0NhdGVnb3J5SUR9OwogICAgd2hpbGUoJFRlbXBDYXRlZ29yeUlEKSB7CiAgICAgICAgbXkgJURhdGEgPSAkU2VsZi0+Q2F0ZWdvcnlHZXQoQ2F0ZWdvcnlJRCA9PiAkVGVtcENhdGVnb3J5SUQpOwogICAgICAgIGlmKCVEYXRhKSB7CiAgICAgICAgICAgICRDYXRlZ29yeUxpc3RbJCNDYXRlZ29yeUxpc3QrMV0gPSBcJURhdGE7CiAgICAgICAgfQogICAgICAgICRUZW1wQ2F0ZWdvcnlJRCA9ICREYXRhe1BhcmVudElEfTsKICAgIH0KICAgIEBDYXRlZ29yeUxpc3QgPSByZXZlcnNlKEBDYXRlZ29yeUxpc3QpOwoKICAgIHJldHVybiBcQENhdGVnb3J5TGlzdDsKCn0KCjE7Cgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjUgJCAkRGF0ZTogMjAwNi8xMC8yNiAxNDoyOTowOCAkCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vTGlua09iamVjdC9GQVEucG0gLSB0byBsaW5rIGZhcSBvYmplY3RzCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDYgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEZBUS5wbSx2IDEuMyAyMDA2LzEyLzEzIDEyOjQ1OjU0IHJrIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdDo6RkFROwoKdXNlIHN0cmljdDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpGQVE7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4zICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87CgpzdWIgSW5pdCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgJFNlbGYtPntGQVFPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkZBUS0+bmV3KCV7JFNlbGZ9KTsKCiAgICByZXR1cm4gMTsKfQoKc3ViIEZpbGxEYXRhTWFwIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIGZvcmVhY2ggKHF3KElEKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIG15ICVBcnRpY2xlID0gJFNlbGYtPntGQVFPYmplY3R9LT5GQVFHZXQoCiAgICAgICAgRkFRSUQgPT4gJFBhcmFte0lEfSwKICAgICk7CiAgICByZXR1cm4gKAogICAgICAgIFRleHQgPT4gJ0Y6Jy4kQXJ0aWNsZXtOdW1iZXJ9LAogICAgICAgIE51bWJlciA9PiAkQXJ0aWNsZXtOdW1iZXJ9LAogICAgICAgIElEID0+ICRQYXJhbXtJRH0sCiAgICAgICAgT2JqZWN0ID0+ICdGQVEnLAogICAgICAgIEZyb250ZW5kRGVzdCA9PiAiQWN0aW9uPUFnZW50RkFRJkl0ZW1JRD0iLAogICAgKTsKfQoKc3ViIEJhY2tlbmRMaW5rT2JqZWN0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIHJldHVybiAxOwp9CgpzdWIgQmFja2VuZFVubGlua09iamVjdCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICByZXR1cm4gMTsKfQoKc3ViIExpbmtTZWFyY2hQYXJhbXMgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgcmV0dXJuICgKICAgICAgICB7IE5hbWUgPT4gJ0ZBUU51bWJlcicsIFRleHQgPT4gJ0ZBUSMnfSwKICAgICAgICB7IE5hbWUgPT4gJ0ZBUVRpdGxlJywgVGV4dCA9PiAnVGl0bGUnfSwKICAgICAgICB7IE5hbWUgPT4gJ0ZBUUZ1bGx0ZXh0JywgVGV4dCA9PiAnRnVsbHRleHQnfSwKICAgICk7Cn0KCnN1YiBMaW5rU2VhcmNoIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15IEBSZXN1bHRXaXRoRGF0YSA9ICgpOwogICAgbXkgQFJlc3VsdCA9ICRTZWxmLT57RkFRT2JqZWN0fS0+RkFRU2VhcmNoKAogICAgICAgIE51bWJlciA9PiAkUGFyYW17RkFRTnVtYmVyfSwKICAgICAgICBUaXRsZSA9PiAkUGFyYW17RkFRVGl0bGV9LAogICAgICAgIFdoYXQgPT4gJFBhcmFte0ZBUUZ1bGx0ZXh0fSwKICAgICk7CiAgICBmb3JlYWNoIChAUmVzdWx0KSB7CiAgICAgICAgbXkgJUFydGljbGUgPSAkU2VsZi0+e0ZBUU9iamVjdH0tPkZBUUdldChGQVFJRCA9PiAkXyk7CiAgICAgICAgcHVzaCAoQFJlc3VsdFdpdGhEYXRhLCB7CiAgICAgICAgICAgICVBcnRpY2xlLAogICAgICAgICAgICBJRCA9PiAkQXJ0aWNsZXtJdGVtSUR9LAogICAgICAgICAgfSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuIEBSZXN1bHRXaXRoRGF0YTsKfQoKc3ViIExpbmtJdGVtRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAlQXJ0aWNsZSA9ICRTZWxmLT57RkFRT2JqZWN0fS0+RkFRR2V0KAogICAgICAgIEl0ZW1JRCA9PiAkUGFyYW17SUR9LAogICAgKTsKCiAgICBteSAkQm9keSA9ICcnOwogICAgZm9yZWFjaCAoMS4uMTApIHsKICAgICAgICBpZiAoJEFydGljbGV7IkZpZWxkJF8ifSkgewogICAgICAgICAgICAkQm9keSAuPSAkQXJ0aWNsZXsiRmllbGQkXyJ9OwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gKAogICAgICAgICVBcnRpY2xlLAogICAgICAgIElEID0+ICRBcnRpY2xle0l0ZW1JRH0sCiAgICAgICAgQm9keSA9PiAkQm9keSwKICAgICAgICBEZXRhaWxMaW5rID0+ICJBY3Rpb249QWdlbnRGQVEmSXRlbUlEPSRQYXJhbXtJRH0iLAogICAgKTsKfQoKMTsK
IyAtLQojIEZpbGVUZW1wLnQgLSBGaWxlVGVtcCB0ZXN0cwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA1IE1hcnRpbiBFZGVuaG9mZXIgPG1hcnRpbitjb2RlQG90cnMub3JnPgojIC0tCiMgJElkOiBGQVEudCx2IDEuMS4xLjEgMjAwNi8wNi8yOSAwOToyOTo1MSBjdCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnVzZSBLZXJuZWw6OlN5c3RlbTo6RkFROwoKJFNlbGYtPntGQVFPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkZBUS0+bmV3KCV7JFNlbGZ9KTsKCkZBUUdldCgpCkZBUUFkZCB7CkF0dGFjaG1lbnRBZGQgewpBdHRhY2htZW50R2V0IHsKQXR0YWNobWVudERlbGV0ZSgpCkF0dGFjaG1lbnRTZWFyY2goKQpGQVFVcGRhdGUoKQpGQVFDb3VudCB7ClZvdGVBZGQoKQpWb3RlR2V0IHsKRkFRRGVsZXRlIHsKRkFRSGlzdG9yeUFkZCB7CkZBUUhpc3RvcnlHZXQgewpGQVFIaXN0b3J5RGVsZXRlIHsKSGlzdG9yeUdldCB7CkNhdGVnb3J5TGlzdCB7CkNhdGVnb3J5U2VhcmNoIHsKQ2F0ZWdvcnlHZXQgewpDYXRlZ29yeVN1YkNhdGVnb3J5SURMaXN0IHsKQ2F0ZWdvcnlBZGQgewpDYXRlZ29yeVVwZGF0ZSB7CkNhdGVnb3J5RGVsZXRlIHsKQ2F0ZWdvcnlDb3VudCB7ClN0YXRlVHlwZUxpc3QgewpTdGF0ZUxpc3QgewpTdGF0ZVVwZGF0ZSB7ClN0YXRlQWRkIHsKU3RhdGVHZXQgewpTdGF0ZVR5cGVHZXQgewogTGFuZ3VhZ2VMaXN0KCkKTGFuZ3VhZ2VVcGRhdGUgewpMYW5ndWFnZUFkZCB7Ckxhbmd1YWdlR2V0IHsKRkFRU2VhcmNoIHsKRkFRUGF0aExpc3RHZXQgICAgICAKCgoKMTsKCg==
iVBORw0KGgoAAAANSUhEUgAAABIAAAAQCAIAAACUZLgLAAABgklEQVQokZWTMUsjQRiGny/GUvIDDjsLQRCikP8g2Jx2FoKFiAjRKxQEEQ5ETg5EBcHCvyCYzsLG0kIFjTZeJVhYaIJhszuzO/mu2M1uQhTxLQZ2Zp/vfeeFEVUFgPHVfygCKgIKXP0d4jOpqqoWVx680HnGJatxnnHFlQf9RHmgWL47+zPSsAAIiSeMDjyOlUMVBFE03r8+GAXyAM42wu4ILSTHxq9JQEFy0IIcCsWlq5vD8Tygka0HH11AmFmr9uz2J27q7JsF6AMXr0ofLG5W1xcGZ0uFlDi9Z3232sZarh6AsLHVNXtu5sdsqbB3gZM4enYUu4V1w8729cTPsf2prkDLJ0lJqZwN21hkagHO2Oc3po+TwSKdP7dZJTImC/lucH7wUoM0T2oiab8gOD/IKmlYIj+oeT1Mx1eMu2aGhZ4h9L373z1td6tSuZw/94EcQCtKx3wp12ymbtGrTxj4lcrll1gU+IDEL2B48ujp1iYn0nEjFaSjGaX5VM6w7+o/Xh/qfCGTpFEAAAAASUVORK5CYII=
iVBORw0KGgoAAAANSUhEUgAAAAwAAAARCAIAAABmX9r1AAABeklEQVQokYWRvUtCYRTGz1WuphDUIoX/gFQiREPgcKGpghanBqOWKAfBoKkWawsaLvedhYaGcCqTjFDpvhEO4VCD2od4DfwqvVlZ2IechmtXA8lnejjnx+E55zCICN2k6Uq0IEopIYRpEyGEUtqCKKUcxxn7B4LhM6lUjd8UfP6jl4aB4ziFYxDR4/FYx+zTU5OMRqMvbgNArDaXf3yOBvZMPR88z4MS/DYnF+SanPAiIiLKCa+fpnwH52azGRGbUPK+rBBywqsa8eIaABCxGTxfqaW1S0/JjQy7rC7Va9QrhkFEQsgra7IMjxh1LMtqRw27ACDhwvFJqCSleJ7XAIDNZlt3zZ5GwncZKVcoKsT+YWBtxeVwOJqT1CsE/Vt9OimdrWiNFufiZusZ+CsAqMvxRuPrvRRJ0dX2FqPihJDEZdQ5M5jOVmJXn0O2Cbfb3WHSWzXzXS8/ZEKBnfk/LdUJgmAft6r7C4LQAUJEURQVQhTF9nor0z/6AQncFoIjEATtAAAAAElFTkSuQmCC
iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABmJLR0QA/wDpAIB4rBT8AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1gUPDBkpSJgCpAAABRhJREFUOMvVlWto3fUZxz+//+3cTy4nOznJqWmaxjQGpY1EITHOpZrVigEtoogS71GE0rlBYLCNbbgZdayUMelopdgO9IWV1tZ6r7fWqqm21SRq6+mapjnpyeXcci7/c/6X316IeyHK3g32hefFA9/n4eF5vjxf+H+D+G+EmXeOd+VOTt0V1J1fGCp+o6GezLFxckLZXY6v+PW1vxxJ/mjxkSPTQ7v3fLTiu/zTEwuR17a+2jN5/+iOmc4rk4XBQemePi2dZFI6c3Myf/fdctHjkye7rpqa/HC850cnHr73pV3JlP/mcFj/wPDoFCtc1nfxSOdjJ8ZwN2xAHR1FX7cOoWlIoJjOUHjrPQq/+S1n/vi7P9x05+2//35jDaBcNejvv6Th40+Xbs2WJTcONqF92Y71xGuwZg16Po+YmoJcDlwXMZPE7unj/LYd1IblD+94fj5rPLLl+CvTSW7o6Ahh2hLdUNk42MDt4jOM555Di8ehsxOEgHwe9+mnqdY38P4dD3DUU523rep8NpslFou9MDQ09Pfu7u6sNn3+Yk1ra3j9wPoIbx9dAFVlw/oYK3c8ie/L/YBAdncj+vogEsEtm1imhbH9GX6yezsXbvp5VFOU6M6dO/H7/Y8fOHBg47Zt24bUrstvC0x9Y49OnC7T0RHGF9RJpm16Zo4Su7IN66mnYGgIdB23UsHRdErXDbA0/CDnzl/kM6dMqVhkcmKCarXK3NxcS2NjY7/WN9BeE1nlcGqyRLkqaYz7WNkaoOm+xylZeZQ9e7DHxpDlMlJRcNJpquemkSObKdxwM4MHdxHL5VkDHAY+lpJ4PH6NFjEXRn6mzLPh4atxVRXFNFEmJ9H/uh9l714EoA0Po65diwyFsBcWcfftQ/3Ln4h39eCLBWlYWqRDwJ3AM0CNz3dWy3w+wcpfbUZtaUExDNRCAW12Frl6NXLLFpRNm9CiUdRUCmnbuJdfgXvLbRRffxdr7M/4SyWchQVcwAA2A28mEnu1Qks76tiTMP4J2DZOczNWby/092MsL6M9/zzqoUOQSIDjoHl9eAeuJz3yGJne66g7eRgnl/+PzFygPh5HUy6kcO69B3vkIZAShED/6isCW7fi2bcPJZXCRWDaEsuy8C5lCex6lhWH3yF5fQe1AzahTpfKGUFxXFIxBeHmZrSmNw7cGHpiFHnppSiOg7K0hDo/D6pKQTFIqD6WxDJWvYCgjhH0EKn3EP9wkVCzn/A1fsJVH5QcrCGTiX96qI03oznSaRNnEngSCWQ4TKWunploE2nSzE79C8UnMWI+alsNmtYZNP40hN7QQDHXSuCiieYVoHjBddCbXSIjIQKt0aJ48W//6K89eWq7Xsy1Wl6/lY3FLwR61y5HJkZ6tUyGgO4n2uanpj2MqKsB3QOaFxA4lo2omCjFNJQKUFzmm6Umjiz0RQVAJpNRTNO8WghRjsVip6ZPHLw/cvzWZ42AgV4TgmAYAkEIhsDrA90ACdhV3HyOUrqAWirgs5f5Ot3JJ9VNUQ2grq7OBT767rLpmc8vafE7oKugat+GroPhAX8APF5SF0qkzoVIZa9wFjP2qzo27bXJa1FETW101bff7fuouMYXp821rNLPomsCdAG6im05JKZMZtMtFKtt++uaul5oWR0/flVj41kpJV9/Mb6iUlh8NBaJmT/oIIcOvizijbV3zJ45tlHXlWFbuiAUbNdzLFi/6oOGWOuLgUDgRFtbm/0/97x/A0fIGqQPAQaeAAAAAElFTkSuQmCC
iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABmJLR0QA/wD/AP+gvaeTAAAB3ElEQVQ4y7WVPW4UQRCFv/nxD7IEEgkiceAjWCKBhIwLEJmAtdCKY3AKSMYWSOQcgICIEyACRESAOICRmJnuriqC7vX02LPekaUdqVTV6u7Xb1696SnMjG089eN3f94f7FeLvaokeCE4JTjBpxyc4jfk4ATxioog/V/UXXyoD/arxbPjB/QO+g66HrouRQttB22bIq9b0BKcgROwMjItigtwnxf1nd2avgfnYngH3qcIEAKIpMhqzWKkZrVDwS713R3jycNhQwgQEkjIwue1H7L3hgiYGWYgzvj4qaS+twdPD4cDm6ZhuVxubI5ZBFNVVA1Vw8xwvfHla0l5G1esA13VmFGj84C7t4djO73+NQkax1Ca3s7HK7Y5qJkhqpgZ9ZQUTdOMxlOaD3JYatzqgBXwBOM5zZtinEtRz2meql1qmjfturZD3uiKqY03gaoqYDc3b93G9aAzpMg3mRl2dkQBVCv7vfhxpWlpXSJaTvl40vTXXLGGdSJaTxE+Pz8bjU9OXl4ynaN9BFYdLT49fTXJZs5bRSnSl6lieB/iAonNEY1a5XeBPv+GqqU5Rf91aNJUbQB1zsV7+dGb73Z0v0K8IEFi9mGog6D5XMoqutZNP3+3FNv655Vs6fkPvQLKVHtth28AAAAASUVORK5CYII=
IyEvdXNyL2Jpbi9wZXJsIC13CiMgLS0KIyBmYXEucGwgLSB0aGUgZ2xvYmFsIENHSSBoYW5kbGUgZmlsZSBmb3IgT1RSUwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA2IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBmYXEucGwsdiAxLjEgMjAwNi8wOS8yOCAxNzoyODoxMCByayBFeHAgJAojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQojIC0tCgojIHVzZSAuLi8uLi8gYXMgbGliIGxvY2F0aW9uCnVzZSBGaW5kQmluIHF3KCRCaW4pOwp1c2UgbGliICIkQmluLy4uLy4uIjsKdXNlIGxpYiAiJEJpbi8uLi8uLi9LZXJuZWwvY3Bhbi1saWIiOwoKdXNlIHN0cmljdDsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OIEBJTkMpOwokVkVSU0lPTiA9ICckUmV2aXNpb246IDEuMSAkJzsKJFZFUlNJT04gPX4gcy9eXCQuKjpcVyguKilcVy4rPyQvJDEvOwoKIyAtLQojIDA9b2ZmOzE9b247CiMgLS0KbXkgJERlYnVnID0gMDsKCiMgLS0KIyBjaGVjayBASU5DIGZvciBtb2RfcGVybCAoYWRkIGxpYiBwYXRoIGZvciAicmVxdWlyZSBtb2R1bGUiISkKIyAtLQpwdXNoIChASU5DLCAiJEJpbi8uLi8uLiIsICIkQmluLy4uLy4uL0tlcm5lbC9jcGFuLWxpYiIpOwoKcHJpbnQgImxvY2F0aW9uOiBwdWJsaWMucGw/QWN0aW9uPVB1YmxpY0ZBUVxuIjsKcHJpbnQgIlxuIjsKcHJpbnQgIjxhIGhyZWY9J3B1YmxpYy5wbD9BY3Rpb249UHVibGljRkFRJz5tb3ZlZDwvYT5cbiI7Cgo=
IyEvdXNyL2Jpbi9wZXJsIC13CiMgLS0KIyBmYXEucGwgLSB0aGUgZ2xvYmFsIENHSSBoYW5kbGUgZmlsZSBmb3IgT1RSUwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA2IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBmYXEuZnBsLHYgMS4xIDIwMDYvMDkvMjggMTc6Mjg6MTAgcmsgRXhwICQKIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgojIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKIyAtLQoKIyB1c2UgLi4vLi4vIGFzIGxpYiBsb2NhdGlvbgp1c2UgRmluZEJpbiBxdygkQmluKTsKdXNlIGxpYiAiJEJpbi8uLi8uLiI7CnVzZSBsaWIgIiRCaW4vLi4vLi4vS2VybmVsL2NwYW4tbGliIjsKCnVzZSBzdHJpY3Q7Cgp1c2UgdmFycyBxdygkVkVSU0lPTiBASU5DKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjEgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCiMgLS0KIyAwPW9mZjsxPW9uOwojIC0tCm15ICREZWJ1ZyA9IDA7CgojIC0tCiMgY2hlY2sgQElOQyBmb3IgbW9kX3BlcmwgKGFkZCBsaWIgcGF0aCBmb3IgInJlcXVpcmUgbW9kdWxlIiEpCiMgLS0KcHVzaCAoQElOQywgIiRCaW4vLi4vLi4iLCAiJEJpbi8uLi8uLi9LZXJuZWwvY3Bhbi1saWIiKTsKCnByaW50ICJsb2NhdGlvbjogcHVibGljLmZwbD9BY3Rpb249UHVibGljRkFRXG4iOwpwcmludCAiXG4iOwpwcmludCAiPGEgaHJlZj0ncHVibGljLmZwbD9BY3Rpb249UHVibGljRkFRJz5tb3ZlZDwvYT5cbiI7Cgo=