TimeAccounting
1.0.2
OTRS GmbH
http://otrs.org/
GNU GENERAL PUBLIC LICENSE Version 2, June 1991
Fixed the problem if the agent has ro-permissions and try to see old time accounting overviews.
Make the TimeAccounting module fit for OTRS 2.2.
first version build with OPMS
2006-05-23 insert a ProjectReporting page
2006-05-16 fixed action new bug in setting
2006-04-24 insert the delete dtl
2006-04-18 fixed vacation bug
2006-04-11 fixed Show all bug
2006-04-11 fixed typo
2006-04-10 include new functions
2005-08-10 fixed initial bugs
2005-08-08 first package
A TimeAccounting Modul.
Ein Zeiterfassungsmodul.
2.1.x
2.2.x
# add groups
$Self->{GroupObject}->GroupAdd(
Name => 'time_accounting',
Comment => '',
ValidID => 1,
UserID => 1,
);
2007-05-23 16:37:08
opms.otrs.com
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iQXBwbGljYXRpb24iPgogICAgPENWUz4kSWQ6IFRpbWVBY2NvdW50aW5nLnhtbCx2IDEuNyAyMDA3LzA1LzExIDE0OjM3OjA1IHRyIEV4cCAkPC9DVlM+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRUaW1lQWNjb3VudGluZyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkZyb250ZW5kTW9kdWxlUmVnaXN0cmF0aW9uIGZvciBUaW1lQWNjb3VudGluZ01vZHVsZSAgdG8gZGVmaW5lIHRoZSByZWdpc3RyYXRpb24gc2V0dGluZ3MgaW4gdGhlIHByb2dyYW0gYW5kIHRvIHNldCByaWdodHMgYW5kIHBvc2l0aW9ucyBvZiBpY29ucyBpbiB0aGUgbmF2aWdhdGlvbiBiYXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkZyb250ZW5kTW9kdWxSZWdpc3RyYXRpb24gZvxyIGRhcyBaZWl0ZXJmYXNzdW5nc01vZHVsLiAgSGllcgpr9m5uZW4gU2llIGRpZSBBbmdhYmVuIGb8ciBkaWUgUmVnaXN0cmllcnVuZyBkZXMgTW9kdWxzIGltIFByb2dyYW1tIHTkdGlnZW4uIEZlcm5lcgpr9m5uZW4gZGllIFJlY2h0ZSB1bmQgZGllIFBvc2l0aW9uZW4gZGVyIEljb25zIGluIGRlciBOYXZpZ2F0aW9uc2xlaXN0ZSBnZXNldHp0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaW1lQWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPEdyb3VwPnRpbWVfYWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgICAgICAgICA8R3JvdXBSbz50aW1lX2FjY291bnRpbmc8L0dyb3VwUm8+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+VGltZUFjY291bnRpbmc8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+VGltZUFjY291bnRpbmc8L05hdkJhck5hbWU+CiAgICAgICAgICAgICAgICA8VGl0bGU+VGltZUFjY291bnRpbmc8L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+VGltZUFjY291bnRpbmc8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPlRpbWVBY2NvdW50aW5nPC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxJbWFnZT50aW1lX2FjY291bnRpbmcucG5nPC9JbWFnZT4KICAgICAgICAgICAgICAgICAgICA8TGluaz5BY3Rpb249QWdlbnRUaW1lQWNjb3VudGluZyZhbXA7U3ViYWN0aW9uPUVkaXQ8L0xpbms+CiAgICAgICAgICAgICAgICAgICAgPE5hdkJhcj5UaW1lQWNjb3VudGluZzwvTmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPk1lbnU8L1R5cGU+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+NjAwMDwvUHJpbz4KICAgICAgICAgICAgICAgICAgICA8QWNjZXNzS2V5PjwvQWNjZXNzS2V5PgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz5JdGVtQXJlYTwvQmxvY2s+CiAgICAgICAgICAgICAgICA8L05hdkJhcj4KICAgICAgICAgICAgICAgIDxOYXZCYXI+CiAgICAgICAgICAgICAgICA8R3JvdXBSbz50aW1lX2FjY291bnRpbmc8L0dyb3VwUm8+CiAgICAgICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPk92ZXJ2aWV3PC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgICAgICA8TmFtZT5PdmVydmlldzwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8SW1hZ2U+b3ZlcnZpZXcucG5nPC9JbWFnZT4KICAgICAgICAgICAgICAgICAgICA8TGluaz5BY3Rpb249QWdlbnRUaW1lQWNjb3VudGluZyZhbXA7U3ViYWN0aW9uPU92ZXJ2aWV3PC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPjwvVHlwZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+PC9CbG9jaz4KICAgICAgICAgICAgICAgICAgICA8TmF2QmFyPlRpbWVBY2NvdW50aW5nPC9OYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc0tleT5vPC9BY2Nlc3NLZXk+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+MTAwPC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXI+CiAgICAgICAgICAgICAgICA8TmF2QmFyPgogICAgICAgICAgICAgICAgPEdyb3VwUm8+dGltZV9hY2NvdW50aW5nPC9Hcm91cFJvPgogICAgICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5UaW1lUmVjb3JkLUVkaXQ8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPkVkaXQ8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPEltYWdlPm5ldy5wbmc8L0ltYWdlPgogICAgICAgICAgICAgICAgICAgIDxMaW5rPkFjdGlvbj1BZ2VudFRpbWVBY2NvdW50aW5nJmFtcDtTdWJhY3Rpb249RWRpdDwvTGluaz4KICAgICAgICAgICAgICAgICAgICA8VHlwZT48L1R5cGU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPjwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPE5hdkJhcj5UaW1lQWNjb3VudGluZzwvTmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NLZXk+bjwvQWNjZXNzS2V5PgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjIwMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyPgogICAgICAgICAgICAgICAgPE5hdkJhcj4KICAgICAgICAgICAgICAgIDxHcm91cD50aW1lX2FjY291bnRpbmc8L0dyb3VwPgogICAgICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5SZXBvcnRpbmc8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPlJlcG9ydGluZzwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8SW1hZ2U+cmVwb3J0aW5nLnBuZzwvSW1hZ2U+CiAgICAgICAgICAgICAgICAgICAgPExpbms+QWN0aW9uPUFnZW50VGltZUFjY291bnRpbmcmYW1wO1N1YmFjdGlvbj1SZXBvcnRpbmc8L0xpbms+CiAgICAgICAgICAgICAgICAgICAgPFR5cGU+PC9UeXBlPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz48L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxOYXZCYXI+VGltZUFjY291bnRpbmc8L05hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8QWNjZXNzS2V5PjwvQWNjZXNzS2V5PgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjUwMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyPgogICAgICAgICAgICAgICAgPE5hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8R3JvdXA+dGltZV9hY2NvdW50aW5nPC9Hcm91cD4KICAgICAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+U2V0dGluZzwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPE5hbWU+U2V0dGluZzwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8SW1hZ2U+bW9kdWxlX3NldHRpbmcucG5nPC9JbWFnZT4KICAgICAgICAgICAgICAgICAgICA8TGluaz5BY3Rpb249QWdlbnRUaW1lQWNjb3VudGluZyZhbXA7U3ViYWN0aW9uPVNldHRpbmc8L0xpbms+CiAgICAgICAgICAgICAgICAgICAgPFR5cGU+PC9UeXBlPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz48L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxOYXZCYXI+VGltZUFjY291bnRpbmc8L05hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8QWNjZXNzS2V5PjwvQWNjZXNzS2V5PgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjkwMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpbWVBY2NvdW50aW5nOjpEZWZhdWx0UHJvamVjdE5hbWUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZhdWx0IG5hbWUgZm9yIG5ldyBwcm9qZWN0cy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+SW5pdGlhbGVyIFByb2plY3RuYW1lIGJlaW0gZXJzdGVsbGVuIGVpbmVzIG5ldWVuIFByb2pla3QgaW4gZGVyIFplaXRlcmZhc3N1bmcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGltZUFjY291bnRpbmc8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpbWVBY2NvdW50aW5nOjpEZWZhdWx0UHJvamVjdFN0YXR1cyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmF1bHQgc3RhdHVzIG9mIGFuIG5ldyBwcm9qZWN0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5BbmZhbmdzc3RhdHVzIGVpbmVzIG5ldWVuIFByb2pla3RzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpbWVBY2NvdW50aW5nPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIxIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+aW52YWxpZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+dmFsaWQ8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpbWVBY2NvdW50aW5nOjpEZWZhdWx0QWN0aW9uTmFtZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmF1bHQgbmFtZSBmb3IgbmV3IGFjdGlvbnMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkluaXRpYWxlciBOYW1lIGVpbmVyIG5ldWVuIFTkdGlna2VpdCBpbiBkZXIgWmVpdGVyZmFzc3VuZy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaW1lQWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGltZUFjY291bnRpbmc6OkRlZmF1bHRBY3Rpb25TdGF0dXMiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZhdWx0IHN0YXR1cyBvZiBhbiBuZXcgYWN0aW9uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5BbmZhbmdzc3RhdHVzIGVpbmVyIG5ldWVuIFTkdGlna2VpdC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaW1lQWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPmludmFsaWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPnZhbGlkPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaW1lQWNjb3VudGluZzo6RGVmYXVsdFVzZXJXZWVrbHlIb3VycyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmF1bHQgc2V0dGluZyBmb3IgdGhlIHN0YW5kYXJkIHdlZWtseSBob3Vycy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+U3RhbmRhcmQgV29jaGVuYXJiZWl0c3plaXQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGltZUFjY291bnRpbmc8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjQwPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGltZUFjY291bnRpbmc6OkRlZmF1bHRVc2VyTGVhdmVEYXlzIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmYXVsdCBzZXR0aW5nIGZvciBsZWF2ZSBkYXlzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5TdGFuZGFyZCBVcmxhdWJzdGFnZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaW1lQWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+MjM8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaW1lQWNjb3VudGluZzo6RGVmYXVsdFVzZXJPdmVydGltZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmF1bHQgc2V0dGluZyBmb3Igb3ZlcnRpbWUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkV2ZW50dWVsbCB2b3JoYW5kZW5lciDcYmVyc3R1bmRlbvxiZXJ0cmFnLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpbWVBY2NvdW50aW5nPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj4wPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGltZUFjY291bnRpbmc6OkRlZmF1bHRVc2VyRGF0ZVN0YXJ0IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmYXVsdCBzZXR0aW5nIGZvciBkYXRlIHN0YXJ0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5TdGFydGRhdHVtIGb8ciBkaWUgRWluZ2FiZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGltZUFjY291bnRpbmc8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjIwMDgtMDEtMDE8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaW1lQWNjb3VudGluZzo6RGVmYXVsdFVzZXJEYXRlRW5kIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmYXVsdCBzZXR0aW5nIGZvciBkYXRlIGVuZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RW5kZGF0dW0gZvxyIGRpZSBFaW5nYWJlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaW1lQWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+MjAwOC0xMi0zMTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpbWVBY2NvdW50aW5nOjpEZWZhdWx0VXNlclN0YXR1cyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmF1bHQgc3RhdHVzIG9mIGFuIG5ldyB1c2VyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5BbmZhbmdzc3RhdHVzIGVpbmVzIG5ldWVuIEJlbnV0emVycy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaW1lQWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPmludmFsaWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPnZhbGlkPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaW1lQWNjb3VudGluZzo6TWF4SW50ZXJ2YWxPZkluY29tcGxldGVEYXlzIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+V29ya2luZyBkYXlzIGFmdGVyIGF0IHRoZSBsYXRlc3Qgd29ya2luZyB1bml0cyBoYXZlIHRvIGluc2VydC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+TGVndCBmZXN0LCBuYWNoIHdpZXZpZWxlbiBXZXJrdGFnZW4gc3DkdGVzdGVucyBkaWUgQXJiZWl0c3N0dW5kZW4gZWluZ2V0cmFnZW4gd2VyZGVuIG38c3Nlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaW1lQWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+NDwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpbWVBY2NvdW50aW5nOjpNYXhJbnRlcnZhbE9mSW5jb21wbGV0ZURheXNCZWZvcmVXYXJuaW5nIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+U2hvdyB3YXJuaW5nLCBpZiB0byBtdWNoIGluY29tcGxldGUgd29ya2luZyBkYXlzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5aZWlndCBlaW5lIFdhcm51bmcsIHdlbm4genV2aWVsZSBBcmJlaXRzdGFnZSBuaWNodCBlaW5nZXRyYWdlbiB3dXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGltZUFjY291bnRpbmc8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjI8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6Tm90aWZ5TW9kdWxlIyMjODg4LVRpbWVBY2NvdW50aW5nIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhpcyBub3RpZmljYXRpb24gbW9kdWxlIGdpdmVzIGEgd2FybmluZyBpZiB0byBtdWNoIGluY29tcGxldGUgd29ya2luZyBkYXlzIGF2YWlsYWJsZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+TW9kdWwsIGRhcyBkZW4gQWdlbnQgaW0gTm90aWZpY2F0aW9uLUJlcmVpY2ggZGVzIEFnZW50LUludGVyZmFjZXMgZGFy/GJlciBpbmZvcm1pZXJ0LCB3ZW5uIHNjaG9uIHp1IGxhbmdlIGtlaW5lIFN0dW5kZW4gbWVociBlaW5nZXRyYWdlbiB3dXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGltZUFjY291bnRpbmc8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZU5vdGlmeTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpOb3RpZmljYXRpb25UaW1lQWNjb3VudGluZzwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpbWVBY2NvdW50aW5nOjpNYXhBbGxvd2VkSW5zZXJ0RGF5cyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkZvciBob3cgbWFueSBkYXlzIGFnbyB5b3UgY2FuIGluc2VydCB3b3JraW5nIHVuaXRzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5MZWd0IGZlc3QsIGJpcyB3YW5uIG1hbiBpbiDkbHRlcmUgWmVpdGVpbnRy5GdlIGJlYXJiZWl0ZW4ga2FubiAoei4gQi4gMTAgVGFnZSB6dXL8Y2tsaWVnZW5kKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaW1lQWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+MTA8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaW1lQWNjb3VudGluZzo6UmVkdWNlVGltZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRvIHVzZSwgaWYgc29tZSBhY3Rpb25zIGFjb3VudCByZWR1Y2VkIHdvcmtpbmcgaG91cnMoS2V5ID0mZ3Q7IHRyYXZlbGluZzsgQ29udGVudCA9Jmd0OyA1MCkuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkhpZXIga2FubiBtYW4gZWluZ2ViZW4sIG9iIGb8ciBlaW5lIGJlc3RpbW10ZSBU5HRpZ2tlaXQsIGRpZSB6dSB2ZXJyZWNobmVuZGVuIFN0dW5kZW4gZ2Vr/HJ6dCB3ZXJkZW4uIFouIEIgd2VubiBSZWlzZXplaXRlbiBudXIgenVyIEjkbGZ0ZSB2ZXJn/HRldCB3ZXJkZW4gKEtleSA9Jmd0OyBqb3VybmV5OyBDb250ZW50ID0mZ3Q7IDUwKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaW1lQWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJ0cmF2ZWxpbmciPjUwPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGltZUFjY291bnRpbmc6OklucHV0SG91cnNXaXRob3V0U3RhcnRFbmRUaW1lIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+U2V0dGluZywgaWYgd29ya2luZyBob3VycyBjYW4gaW5zZXJ0IHdpdGhvdXQgc3RhcnQtIGFuZCBlbmR0aW1lLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5MZWd0IGZlc3QsIG9iIG1hbiBBcmJlaXRzc3R1bmRlbiBhdWNoIG9obmUgQW5mYW5ncy0gdW5kIEVuZHplaXQgZWluZ2ViZW4ga2Fubi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaW1lQWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlByZUFwcGxpY2F0aW9uTW9kdWxlIyMjQWdlbnRUaW1lQWNjb3VudGluZyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoaXMgbW9kdWxlIHlvdSBjYW4gZm9yY2UgaW5zZXJ0cyBpbiB0aGUgVGltZUFjY291bnRpbmcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPk1pdCBIaWxmZSBkaWVzZXMgTW9kdWxzIGv2bm5lbiBFaW50cuRnZSBpbiBkaWUgWmVpdGVyZmFzc3VuZyBlcnp3dW5nZW4gd2VyZGVuLCBpbiBkZW0gYmVpbSBFaW5sb2dnZW4gZGFzIFBvcnRhbCBnZWJsb2NrdCB3aXJkIHVuZCBudXIgZGFzIFplaXRlcmZhc3N1bmdzZmVuc3RlciBlcnNjaGVpbnQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGltZUFjY291bnRpbmc8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPktlcm5lbDo6TW9kdWxlczo6QWdlbnRUaW1lQWNjb3VudGluZzwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KPC9vdHJzX2NvbmZpZz4K
Iy0tCiMgS2VybmVsL1N5c3RlbS9UaW1lQWNjb3VudGluZy5wbSAtIGFsbCB0aW1lIGFjY291bnRpbmcgZnVuY3Rpb25zCiMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IFRpbWVBY2NvdW50aW5nLnBtLHYgMS45IDIwMDcvMDUvMTEgMTQ6MzY6MzcgdHIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpUaW1lQWNjb3VudGluZzsKCnVzZSBzdHJpY3Q7CnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9ICckUmV2aXNpb246IDEuOSAkJzsKJFZFUlNJT04gPX4gcy9eXCQuKjpcVyguKilcVy4rPyQvJDEvOwoKdXNlIERhdGU6OlBjYWxjIHF3KFRvZGF5IERheXNfaW5fTW9udGggRGF5X29mX1dlZWspOwojdXNlIEtlcm5lbDo6U3lzdGVtOjpDYWxlbmRhckV2ZW50OwoKPWhlYWQxIE5BTUUjCgpLZXJuZWw6OlN5c3RlbTo6VGltZUFjY291bnRpbmcgLSB0aW1lYWNjb3VudGluZyBsaWIKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIHRpbWVhY2NvdW50aW5nIGZ1bmN0aW9ucwoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UjCgo9b3ZlciA0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGEgb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lQWNjb3VudGluZzsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJExvZ09iamVjdCAgICA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkVGltZUFjY291bnRpbmdPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6VGltZUFjY291bnRpbmctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCA9PiAkREJPYmplY3QsCiAgICAgICAgVXNlcklEID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICRUeXBlID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyAoJFNlbGYsICRUeXBlKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3JlYWNoIChxdyhEQk9iamVjdCBDb25maWdPYmplY3QgTG9nT2JqZWN0IFVzZXJJRCBUaW1lT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gVXNlckN1cnJlbnRQZXJpb2RHZXQoKQoKcmV0dXJucyBhIGhhc2ggd2l0aCB0aGUgdXNlciBvZiB0aGUgY3VycmVudCBwZXJpb2QgZGF0YQoKICAgIG15ICVVc2VyRGF0YSA9ICRUaW1lQWNjb3VudGluZ09iamVjdC0+VXNlckN1cnJlbnRQZXJpb2RHZXQoCiAgICAgICAgWWVhciAgPT4gJzIwMDUnLAogICAgICAgIE1vbnRoID0+ICcxMic7CiAgICAgICAgRGF5ICAgPT4gJzI0JwogICAgKTsKCj1jdXQKCnN1YiBVc2VyQ3VycmVudFBlcmlvZEdldCB7CiAgICBteSAkU2VsZiAgICA9IHNoaWZ0OwogICAgbXkgJVBhcmFtICAgPSBAXzsKICAgIG15ICVEYXRhICAgID0gKCk7CiAgICBmb3JlYWNoIChxdyhZZWFyIE1vbnRoIERheSkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30pIHx8ICcnOwogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJVc2VyQ3VycmVudFBlcmlvZEdldDogTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkRGF0ZSA9IHNwcmludGYoIiUwNGQtJTAyZC0lMDJkIiwgJFBhcmFte1llYXJ9LCAkUGFyYW17TW9udGh9LCAkUGFyYW17RGF5fSkgLiAiIDAwOjAwOjAwIjsKCiAgICAjIGRiIHNlbGVjdAogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUgKAogICAgICAgIFNRTCA9PiAiU0VMRUNUIHVzZXJfaWQsIHByZWZlcmVuY2VfcGVyaW9kLCBkYXRlX3N0YXJ0LCBkYXRlX2VuZCwgd2Vla2x5X2hvdXJzLCBsZWF2ZV9kYXlzLCBvdmVydGltZSwgc3RhdHVzIEZST00gdGltZV9hY2NvdW50aW5nX3VzZXJfcGVyaW9kICIuCiAgICAgICAgICAgICJXSEVSRSBkYXRlX3N0YXJ0IDw9ICciIC4gJERhdGUgLiAiJyBBTkQgZGF0ZV9lbmQgID49JyIgLiAkRGF0ZSAuICInIiwKICAgICk7CgogICAgIyBmZXRjaCBEYXRhCiAgICB3aGlsZSAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKCiAgICAgICAgJERhdGF7JFJvd1swXX17VXNlcklEfSAgICAgICAgICAgPSAgJFJvd1swXTsKICAgICAgICAkRGF0YXskUm93WzBdfXtQZXJpb2R9ICAgICAgICAgICA9ICAkUm93WzFdOwogICAgICAgICREYXRheyRSb3dbMF19e0RhdGVTdGFydH0gICAgICAgID0gIHN1YnN0cigkUm93WzJdLCAwLCAxMCk7CiAgICAgICAgJERhdGF7JFJvd1swXX17RGF0ZUVuZH0gICAgICAgICAgPSAgc3Vic3RyKCRSb3dbM10sIDAsIDEwKTsKICAgICAgICAkRGF0YXskUm93WzBdfXtXZWVrbHlIb3Vyc30gICAgICA9ICAkUm93WzRdOwogICAgICAgICREYXRheyRSb3dbMF19e0xlYXZlRGF5c30gICAgICAgID0gICRSb3dbNV07CiAgICAgICAgJERhdGF7JFJvd1swXX17T3ZlcnRpbWV9ICAgICAgICAgPSAgJFJvd1s2XTsKICAgICAgICAkRGF0YXskUm93WzBdfXtVc2VyU3RhdHVzfSAgICAgICA9ICAkUm93WzddOwogICAgfQoKICAgIHJldHVybiAlRGF0YTsKfQoKPWl0ZW0gVXNlclJlcG9ydGluZygpCgpyZXR1cm5zIGEgaGFzaCB3aXRoIGluZm9ybWF0aW9ucyBhYm91dCBsZWF2ZWRheXMsIG92ZXJ0aW1lcywKd29ya2luZ2hvdXJzIGV0Yy4gb2YgYWxsIHVzZXJzCgogICAgbXkgJURhdGEgPSAkVGltZUFjY291bnRpbmdPYmplY3QtPlVzZXJSZXBvcnRpbmcoCiAgICAgICAgWWVhciAgPT4gJzIwMDUnLAogICAgICAgIE1vbnRoID0+ICcxMicsCiAgICAgICAgRGF5ICAgPT4gJzEyJywgICAgICAjIE9wdGlvbmFsCiAgICApOwoKPWN1dAoKc3ViIFVzZXJSZXBvcnRpbmcgewogICAgbXkgJFNlbGYgICAgPSBzaGlmdDsKICAgIG15ICVQYXJhbSAgID0gQF87CiAgICBteSAlRGF0YSAgICA9ICgpOwogICAgZm9yZWFjaCAocXcoWWVhciBNb250aCBEYXkpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99KSB8fCAnJzsKICAgICAgICBpZiAoISRQYXJhbXskX30gJiYgJF8gbmUgJ0RheScpIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiVXNlclJlcG9ydGluZzogTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIGlmICghJFBhcmFte0RheX0pIHsKICAgICAgICAkUGFyYW17RGF5fSA9IERheXNfaW5fTW9udGgoJFBhcmFte1llYXJ9LCAgJFBhcmFte01vbnRofSk7CiAgICB9CgogICAgbXkgJVVzZXJDdXJyZW50UGVyaW9kID0gJFNlbGYtPlVzZXJDdXJyZW50UGVyaW9kR2V0KCVQYXJhbSk7CiAgICBteSAkWWVhclN0YXJ0ICAgICAgID0gMDsKICAgIG15ICRNb250aFN0YXJ0ICAgICAgPSAwOwogICAgbXkgJERheVN0YXJ0ICAgICAgICA9IDA7CiAgICBteSAkTW9udGhTdGFydFBvaW50ID0gMDsKICAgIG15ICREYXlTdGFydFBvaW50ICAgPSAwOwogICAgbXkgJE1vbnRoRW5kUG9pbnQgICA9IDA7CiAgICBteSAkRGF5RW5kUG9pbnQgICAgID0gMDsKICAgIG15ICRZZWFyRW5kICAgICAgICAgPSAkUGFyYW17WWVhcn07CiAgICBteSAkTW9udGhFbmQgICAgICAgID0gJFBhcmFte01vbnRofTsKICAgIG15ICREYXlFbmQgICAgICAgICAgPSAkUGFyYW17RGF5fTsKCiAgICBmb3JlYWNoIG15ICRVc2VySUQgKGtleXMgJVVzZXJDdXJyZW50UGVyaW9kKXsKICAgICAgICBpZiAoJFVzZXJDdXJyZW50UGVyaW9keyRVc2VySUR9e0RhdGVTdGFydH0gPX4gL14oXGQrKS0oXGQrKS0oXGQrKS8pIHsKICAgICAgICAgICAgJFllYXJTdGFydCAgPSAkMTsKICAgICAgICAgICAgJE1vbnRoU3RhcnQgPSAkMjsKICAgICAgICAgICAgJERheVN0YXJ0ICAgPSAkMzsKICAgICAgICB9CiAgICAgICAgJERhdGF7JFVzZXJJRH17TGVhdmVEYXl9ICAgICAgICAgPSAwOwogICAgICAgICREYXRheyRVc2VySUR9e0Rpc2Vhc2VkfSAgICAgICAgID0gMDsKICAgICAgICAkRGF0YXskVXNlcklEfXtPdmVydGltZX0gICAgICAgICA9IDA7CiAgICAgICAgJERhdGF7JFVzZXJJRH17VGFyZ2V0U3RhdGV9ICAgICAgPSAwOwogICAgICAgICREYXRheyRVc2VySUR9e0xlYXZlRGF5VG90YWx9ICAgID0gMDsKICAgICAgICAkRGF0YXskVXNlcklEfXtEaXNlYXNlZFRvdGFsfSAgICA9IDA7CiAgICAgICAgJERhdGF7JFVzZXJJRH17T3ZlcnRpbWVUb3RhbH0gICAgPSAwOwogICAgICAgICREYXRheyRVc2VySUR9e1RhcmdldFN0YXRlVG90YWx9ID0gMDsKCiAgICAgICAgbXkgJENvdW50ZXIgPSAwOwogICAgICAgIGZvciAobXkgJFllYXIgPSAkWWVhclN0YXJ0OyAkWWVhciA8PSAkWWVhckVuZDsgJFllYXIrKykgewogICAgICAgICAgICBpZiAoJFllYXIgPT0gJFllYXJTdGFydCkgewogICAgICAgICAgICAgICAgJE1vbnRoU3RhcnRQb2ludCA9ICRNb250aFN0YXJ0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJE1vbnRoU3RhcnRQb2ludCA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRZZWFyID09ICRZZWFyRW5kKSB7CiAgICAgICAgICAgICAgICAkTW9udGhFbmRQb2ludCA9ICRNb250aEVuZDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRNb250aEVuZFBvaW50ID0gMTI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIChteSAkTW9udGggPSAkTW9udGhTdGFydFBvaW50OyAkTW9udGggPD0gJE1vbnRoRW5kUG9pbnQ7ICRNb250aCsrKSB7CiAgICAgICAgICAgICAgICBpZiAoJFllYXIgPT0gJFllYXJTdGFydCAmJiAkTW9udGggPT0gJE1vbnRoU3RhcnQgKSB7CiAgICAgICAgICAgICAgICAgICAgJERheVN0YXJ0UG9pbnQgPSAkRGF5U3RhcnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkRGF5U3RhcnRQb2ludCA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoJFllYXIgPT0gJFllYXJFbmQgJiYgJE1vbnRoID09ICRNb250aEVuZCApIHsKICAgICAgICAgICAgICAgICAgICAkRGF5RW5kUG9pbnQgPSAkRGF5RW5kOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJERheUVuZFBvaW50ID0gRGF5c19pbl9Nb250aCgkWWVhciwgJE1vbnRoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZvciAobXkgJERheSA9ICREYXlTdGFydFBvaW50OyAkRGF5IDw9ICREYXlFbmRQb2ludDsgJERheSsrKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJVdvcmtpbmdVbml0ID0gJFNlbGYtPldvcmtpbmdVbml0c0dldCgKICAgICAgICAgICAgICAgICAgICAgICAgWWVhciAgID0+ICRZZWFyLAogICAgICAgICAgICAgICAgICAgICAgICBNb250aCAgPT4gJE1vbnRoLAogICAgICAgICAgICAgICAgICAgICAgICBEYXkgICAgPT4gJERheSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBteSAkV29ya2luZ0hvdXJzID0gMDsKICAgICAgICAgICAgICAgICAgICBteSAkTGVhdmVEYXkgICAgID0gMDsKICAgICAgICAgICAgICAgICAgICBteSAkRGlzZWFzZWQgICAgID0gMDsKICAgICAgICAgICAgICAgICAgICBteSAkT3ZlcnRpbWUgICAgID0gMDsKICAgICAgICAgICAgICAgICAgICBteSAkVGFyZ2V0U3RhdGUgID0gMDsKICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIChrZXlzICVXb3JraW5nVW5pdCkgewogICAgICAgICAgICAgICAgICAgICAgICAkV29ya2luZ0hvdXJzICs9ICRXb3JraW5nVW5pdHskX317UGVyaW9kfTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRXb3JraW5nVW5pdHskX317UHJvamVjdElEfSA9PSAtMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRXb3JraW5nVW5pdHskX317QWN0aW9uSUR9ID09IC0yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7JFVzZXJJRH17TGVhdmVEYXlUb3RhbH0rKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTGVhdmVEYXkgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCRXb3JraW5nVW5pdHskX317QWN0aW9uSUR9ID09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7JFVzZXJJRH17RGlzZWFzZWRUb3RhbH0rKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGlzZWFzZWQgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCRXb3JraW5nVW5pdHskX317QWN0aW9uSUR9ID09IC0zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7JFVzZXJJRH17T3ZlcnRpbWVUb3RhbH0rKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkT3ZlcnRpbWUgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkRGF0YXskVXNlcklEfXtXb3JraW5nSG91cnNUb3RhbH0gKz0gJFdvcmtpbmdIb3VyczsKICAgICAgICAgICAgICAgICAgICBteSAkVmFjYXRpb25DaGVjayA9ICRTZWxmLT5WYWNhdGlvbkNoZWNrKAogICAgICAgICAgICAgICAgICAgICAgICBZZWFyICA9PiAkWWVhciwKICAgICAgICAgICAgICAgICAgICAgICAgTW9udGggPT4gJE1vbnRoLAogICAgICAgICAgICAgICAgICAgICAgICBEYXkgICA9PiAkRGF5LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgbXkgJFdlZWtkYXkgPSBEYXlfb2ZfV2VlaygkWWVhciwgJE1vbnRoLCAkRGF5KTsKICAgICAgICAgICAgICAgICAgICBpZiAoJFdlZWtkYXkgIT0gNiAmJiAkV2Vla2RheSAhPSA3CiAgICAgICAgICAgICAgICAgICAgICAgICYmICEkVmFjYXRpb25DaGVjawogICAgICAgICAgICAgICAgICAgICAgICAmJiAhJERpc2Vhc2VkICYmICEkTGVhdmVEYXkKICAgICAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7JFVzZXJJRH17VGFyZ2V0U3RhdGVUb3RhbH0gKz0gJFVzZXJDdXJyZW50UGVyaW9keyRVc2VySUR9e1dlZWtseUhvdXJzfS81OwogICAgICAgICAgICAgICAgICAgICAgICAkVGFyZ2V0U3RhdGUgPSAkVXNlckN1cnJlbnRQZXJpb2R7JFVzZXJJRH17V2Vla2x5SG91cnN9LzU7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoJE1vbnRoID09ICRNb250aEVuZCAmJiAkWWVhciA9PSAkWWVhckVuZCkgewogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXskVXNlcklEfXtUYXJnZXRTdGF0ZX0gICs9ICRUYXJnZXRTdGF0ZTsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7JFVzZXJJRH17V29ya2luZ0hvdXJzfSArPSAkV29ya2luZ0hvdXJzOwogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXskVXNlcklEfXtMZWF2ZURheX0gICAgICs9ICRMZWF2ZURheTsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7JFVzZXJJRH17RGlzZWFzZWR9ICAgICArPSAkRGlzZWFzZWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICREYXRheyRVc2VySUR9e092ZXJ0aW1lfSAgICAgICAgICA9ICREYXRheyRVc2VySUR9e1dvcmtpbmdIb3Vyc30gICAgICAgICAgIC0gJERhdGF7JFVzZXJJRH17VGFyZ2V0U3RhdGV9OwogICAgICAgICREYXRheyRVc2VySUR9e092ZXJ0aW1lVG90YWx9ICAgICA9ICRVc2VyQ3VycmVudFBlcmlvZHskVXNlcklEfXtPdmVydGltZX0gICsgJERhdGF7JFVzZXJJRH17V29ya2luZ0hvdXJzVG90YWx9IC0gJERhdGF7JFVzZXJJRH17VGFyZ2V0U3RhdGVUb3RhbH07CiAgICAgICAgJERhdGF7JFVzZXJJRH17T3ZlcnRpbWVVbnRpbH0gICAgID0gJERhdGF7JFVzZXJJRH17T3ZlcnRpbWVUb3RhbH0gICAgICAgICAgLSAkRGF0YXskVXNlcklEfXtPdmVydGltZX07CiAgICAgICAgJERhdGF7JFVzZXJJRH17TGVhdmVEYXlSZW1haW5pbmd9ID0gJFVzZXJDdXJyZW50UGVyaW9keyRVc2VySUR9e0xlYXZlRGF5c30gLSAkRGF0YXskVXNlcklEfXtMZWF2ZURheVRvdGFsfTsKICAgIH0KICAgIHJldHVybiAlRGF0YTsKfQoKPWl0ZW0gUHJvamVjdFNldHRpbmdzR2V0KCkKCnJldHVybnMgYSBoYXNoIHdpdGggdGhlIHByb2plY3QgZGF0YQoKICAgIG15ICVQcm9qZWN0RGF0YSA9ICRUaW1lQWNjb3VudGluZ09iamVjdC0+UHJvamVjdFNldHRpbmdzR2V0KCk7Cgo9Y3V0CgpzdWIgUHJvamVjdFNldHRpbmdzR2V0IHsKICAgIG15ICRTZWxmICAgID0gc2hpZnQ7CiAgICBteSAlRGF0YSAgICA9ICgpOwoKICAgICMgZGIgc2VsZWN0CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSAoCiAgICAgICAgU1FMID0+ICJTRUxFQ1QgaWQsIHByb2plY3QsIGRlc2NyaXB0aW9uLCBzdGF0dXMgRlJPTSB0aW1lX2FjY291bnRpbmdfcHJvamVjdCIsCiAgICApOwoKICAgICMgZmV0Y2ggRGF0YQogICAgd2hpbGUgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgJERhdGF7UHJvamVjdH0gICAgICAgICAgIHskUm93WzBdfSA9ICAkUm93WzFdOwogICAgICAgICREYXRhe1Byb2plY3REZXNjcmlwdGlvbn17JFJvd1swXX0gPSAgJFJvd1syXTsKICAgICAgICAkRGF0YXtQcm9qZWN0U3RhdHVzfSAgICAgeyRSb3dbMF19ID0gICRSb3dbM107CiAgICB9CiAgICByZXR1cm4gJURhdGE7Cn0KCj1pdGVtIFByb2plY3RTZXR0aW5nc0luc2VydCgpCgppbnNlcnQgbmV3IHByb2plY3QgZGF0YSBpbiB0aGUgZGIKCiAgICAkVGltZUFjY291bnRpbmdPYmplY3QtPlByb2plY3RTZXR0aW5nc0luc2VydCgKICAgICAgICBQcm9qZWN0ICAgICAgID0+ICdpbnRlcm5hbCcsICMgb3B0aW9uYWwKICAgICAgICBQcm9qZWN0U3RhdHVzID0+IDEgfHwgMCwgICAgICMgb3B0aW9uYWwKICAgICk7Cgo9Y3V0CgpzdWIgUHJvamVjdFNldHRpbmdzSW5zZXJ0IHsKICAgIG15ICRTZWxmICAgID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gICA9IEBfOwoKICAgIGlmICghJFBhcmFte1Byb2plY3R9KSB7CiAgICAgICAgJFBhcmFte1Byb2plY3R9ICAgICAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpbWVBY2NvdW50aW5nOjpEZWZhdWx0UHJvamVjdE5hbWUnKSB8fCAnJzsKICAgIH0KICAgIGlmICghJFBhcmFte1Byb2plY3RTdGF0dXN9KSB7CiAgICAgICAgJFBhcmFte1Byb2plY3RTdGF0dXN9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpbWVBY2NvdW50aW5nOjpEZWZhdWx0UHJvamVjdFN0YXR1cycpIHx8ICcwJzsKICAgIH0KCiAgICBpZiAoISRQYXJhbXtQcm9qZWN0RGVzY3JpcHRpb259KSB7CiAgICAgICAgJFBhcmFte1Byb2plY3REZXNjcmlwdGlvbn0gPSAnJzsKICAgIH0KCiAgICAjIGRiIHF1b3RlCiAgICBmb3JlYWNoIChrZXlzICVQYXJhbSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSkgfHwgJyc7CiAgICB9CgogICAgIyBidWlsZCBzcWwKCiAgICBteSAkU1FMID0gIklOU0VSVCBJTlRPIHRpbWVfYWNjb3VudGluZ19wcm9qZWN0IChwcm9qZWN0LCBkZXNjcmlwdGlvbiwgc3RhdHVzKSAiIC4KICAgICAgICAiVkFMVUVTICIgLgogICAgICAgICIoJyIgLiAkUGFyYW17UHJvamVjdH0gLiAiJywgJyIgLiAkUGFyYW17UHJvamVjdERlc2NyaXB0aW9ufSAuICInLCAnIiAuICRQYXJhbXtQcm9qZWN0U3RhdHVzfSAuICInKSI7CgogICAgIyBkYiBpbnNlcnQKICAgIGlmICghJFNlbGYtPntEQk9iamVjdH0tPkRvKFNRTCA9PiAkU1FMKSkgewogICAgICAgIHJldHVybjsKICAgIH0KICAgIHJldHVybiAxOwp9Cgo9aXRlbSBQcm9qZWN0U2V0dGluZ3NVcGRhdGUoKQoKdXBkYXRlIHByb2plY3QgZGF0YSBpbiB0aGUgZGIKCiAgICAkVGltZUFjY291bnRpbmdPYmplY3QtPlByb2plY3RTZXR0aW5nc1VwZGF0ZSgKICAgICAgICAxICAgID0+IHsgICAgICAgICAgICAgICAgICAgICAgICAjIGVxdWFsIFByb2plY3RJRAogICAgICAgICAgICBQcm9qZWN0ICAgICAgID0+ICdpbnRlcm5hbCcsCiAgICAgICAgICAgIFByb2plY3RTdGF0dXMgPT4gMSB8fCAwLAogICAgICAgIH0sCiAgICAgICAgMiAgICA9PiB7ICAgICAgICAgICAgICAgICAgICAgICAgIyBlcXVhbCBQcm9qZWN0SUQKICAgICAgICAgICAgUHJvamVjdCAgICAgICA9PiAncHJvamVjdG5hbWUnLAogICAgICAgICAgICBQcm9qZWN0U3RhdHVzID0+IDEgfHwgMCwKICAgICAgICB9LAogICAgICAgIDMgICAgPT4gLi4uLi4uCiAgICApOwoKPWN1dAoKc3ViIFByb2plY3RTZXR0aW5nc1VwZGF0ZSB7CiAgICBteSAkU2VsZiAgICA9IHNoaWZ0OwogICAgbXkgJVBhcmFtICAgPSBAXzsKCiAgICBmb3JlYWNoIG15ICRQcm9qZWN0SUQgKHNvcnQga2V5cyAgJVBhcmFtKSB7CiAgICAgICAgaWYgKCRQYXJhbXskUHJvamVjdElEfXtQcm9qZWN0fSkgewogICAgICAgICAgICAjIGRiIHF1b3RlCiAgICAgICAgICAgIGZvcmVhY2ggKGtleXMgJXskUGFyYW17JFByb2plY3RJRH19KSB7CiAgICAgICAgICAgICAgICAkUGFyYW17JFByb2plY3RJRH17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskUHJvamVjdElEfXskX30pIHx8ICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICMgYnVpbGQgc3FsCiAgICAgICAgICAgIG15ICRTUUwgPSAiVVBEQVRFIHRpbWVfYWNjb3VudGluZ19wcm9qZWN0ICIgLgogICAgICAgICAgICAgICAgIlNFVCBwcm9qZWN0ID0gJyIgLiAkUGFyYW17JFByb2plY3RJRH17UHJvamVjdH0uCiAgICAgICAgICAgICAgICAgICAgIicsIHN0YXR1cyA9ICciIC4gJFBhcmFteyRQcm9qZWN0SUR9e1Byb2plY3RTdGF0dXN9IC4KICAgICAgICAgICAgICAgICAgICAiJywgZGVzY3JpcHRpb24gPSAnIiAuICRQYXJhbXskUHJvamVjdElEfXtQcm9qZWN0RGVzY3JpcHRpb259IC4gIicgIiAuCiAgICAgICAgICAgICAgICAiV0hFUkUgaWQgPSAnIiAuICRQcm9qZWN0SUQgLiAiJyI7CiAgICAgICAgICAgICMgZGIgaW5zZXJ0CiAgICAgICAgICAgIGlmICghJFNlbGYtPntEQk9iamVjdH0tPkRvKFNRTCA9PiAkU1FMKSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIEFjdGlvblNldHRpbmdzR2V0KCkKCnJldHVybnMgYSBoYXNoIHdpdGggdGhlIGFjdGlvbiBzZXR0aW5ncwoKICAgIG15ICVBY3Rpb25EYXRhID0gJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5BY3Rpb25TZXR0aW5nc0dldCgpOwoKPWN1dAoKc3ViIEFjdGlvblNldHRpbmdzR2V0IHsKICAgIG15ICRTZWxmICAgID0gc2hpZnQ7CiAgICBteSAlRGF0YSAgICA9ICgpOwoKICAgICMgZGIgc2VsZWN0CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSAoCiAgICAgICAgU1FMID0+ICJTRUxFQ1QgaWQsIGFjdGlvbiwgc3RhdHVzIEZST00gdGltZV9hY2NvdW50aW5nX2FjdGlvbiIsCiAgICApOwoKICAgICMgZmV0Y2ggRGF0YQogICAgd2hpbGUgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgJERhdGF7JFJvd1swXX17QWN0aW9ufSAgICAgICA9ICAkUm93WzFdOwogICAgICAgICREYXRheyRSb3dbMF19e0FjdGlvblN0YXR1c30gPSAgJFJvd1syXTsKICAgIH0KICAgIHJldHVybiAlRGF0YTsKfQoKPWl0ZW0gQWN0aW9uU2V0dGluZ3NJbnNlcnQoKQoKaW5zZXJ0IG5ldyBhY3Rpb24gZGF0YSBpbiB0aGUgZGIKCiAgICAkVGltZUFjY291bnRpbmdPYmplY3QtPkFjdGlvblNldHRpbmdzSW5zZXJ0KAogICAgICAgIEFjdGlvbiAgICAgICA9PiAnbWVldGluZycsICAgIyBvcHRpb25hbAogICAgICAgIEFjdGlvblN0YXR1cyA9PiAxIHx8IDAsICAgICAgIyBvcHRpb25hbAogICAgKTsKCj1jdXQKCnN1YiBBY3Rpb25TZXR0aW5nc0luc2VydCB7CiAgICBteSAkU2VsZiAgICA9IHNoaWZ0OwogICAgbXkgJVBhcmFtICAgPSBAXzsKCiAgICAjIGRiIHF1b3RlCiAgICBmb3JlYWNoIChrZXlzICVQYXJhbSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSkgfHwgJyc7CiAgICB9CgogICAgaWYgKCEkUGFyYW17QWN0aW9ufSkgewogICAgICAgICRQYXJhbXtBY3Rpb259ICAgICAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpbWVBY2NvdW50aW5nOjpEZWZhdWx0QWN0aW9uTmFtZScpIHx8ICcnOwogICAgfQogICAgaWYgKCEkUGFyYW17QWN0aW9uU3RhdHVzfSkgewogICAgICAgICRQYXJhbXtBY3Rpb25TdGF0dXN9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpbWVBY2NvdW50aW5nOjpEZWZhdWx0QWN0aW9uU3RhdHVzJykgfHwgJzAnOwogICAgfQoKICAgICMgYnVpbGQgc3FsCiAgICBteSAkU1FMID0gIklOU0VSVCBJTlRPIHRpbWVfYWNjb3VudGluZ19hY3Rpb24gKGFjdGlvbiwgc3RhdHVzKSIgLgogICAgICAgICIgVkFMVUVTIiAuCiAgICAgICAgIiAoJyIgLiAkUGFyYW17QWN0aW9ufS4gIicgLCAnIiAuICRQYXJhbXtBY3Rpb25TdGF0dXN9IC4gIicpIjsKICAgICMgZGIgaW5zZXJ0CiAgICBpZiAoISRTZWxmLT57REJPYmplY3R9LT5EbyhTUUwgPT4gJFNRTCkpIHsKICAgICAgICByZXR1cm47CiAgICB9CiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQWN0aW9uU2V0dGluZ3NVcGRhdGUoKQoKdXBkYXRlIGFjdGlvbiBkYXRhIGluIHRoZSBkYgoKICAgICRUaW1lQWNjb3VudGluZ09iamVjdC0+QWN0aW9uU2V0dGluZ3NVcGRhdGUoCiAgICAgICAgMSAgICA9PiB7ICAgICAgICAgICAgICAgICAgICAgICMgZXF1YWwgQWN0aW9uSUQKICAgICAgICAgICAgQWN0aW9uICAgICAgID0+ICdtZWV0aW5nJywKICAgICAgICAgICAgQWN0aW9uU3RhdHVzID0+IDEgfHwgMCwKICAgICAgICB9LAogICAgICAgIDIgICAgPT4geyAgICAgICAgICAgICAgICAgICAgICAjIGVxdWFsIEFjdGlvbklECiAgICAgICAgICAgIEFjdGlvbiAgICAgICA9PiAnam91cm5leScsCiAgICAgICAgICAgIEFjdGlvblN0YXR1cyA9PiAxIHx8IDAsCiAgICAgICAgfSwKICAgICAgICAzICAgID0+IC4uLi4uLgogICAgKTsKCj1jdXQKCnN1YiBBY3Rpb25TZXR0aW5nc1VwZGF0ZSB7CiAgICBteSAkU2VsZiAgICA9IHNoaWZ0OwogICAgbXkgJVBhcmFtICAgPSBAXzsKICAgIG15ICRTUUwgICAgID0gJyc7CgogICAgZm9yZWFjaCBteSAkQWN0aW9uSUQgKHNvcnQga2V5cyAgJVBhcmFtKSB7CiAgICAgICAgaWYgKCRQYXJhbXskQWN0aW9uSUR9e0FjdGlvbn0pIHsKICAgICAgICAgICAgIyBkYiBxdW90ZQogICAgICAgICAgICBmb3JlYWNoIChrZXlzICV7JFBhcmFteyRBY3Rpb25JRH19KSB7CiAgICAgICAgICAgICAgICAkUGFyYW17JEFjdGlvbklEfXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRBY3Rpb25JRH17JF99KSB8fCAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAjIGJ1aWxkIHNxbAogICAgICAgICAgICAkU1FMID0gIlVQREFURSB0aW1lX2FjY291bnRpbmdfYWN0aW9uICIgLgogICAgICAgICAgICAgICAgIlNFVCBhY3Rpb24gPSAnIiAuICRQYXJhbXskQWN0aW9uSUR9e0FjdGlvbn0uICInLCBzdGF0dXMgPSAnIiAuICRQYXJhbXskQWN0aW9uSUR9e0FjdGlvblN0YXR1c30gLiAiJyAiIC4KICAgICAgICAgICAgICAgICJXSEVSRSBpZCA9ICciIC4gJEFjdGlvbklEIC4gIiciOwogICAgICAgICAgICAjIGRiIGluc2VydAogICAgICAgICAgICBpZiAoISRTZWxmLT57REJPYmplY3R9LT5EbyhTUUwgPT4gJFNRTCkpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAxOwp9Cgo9aXRlbSBVc2VyR2V0KCkKCnJldHVybnMgYSBoYXNoIHdpdGggdGhlIHVzZXIgZGF0YQoKICAgIG15ICVVc2VyRGF0YSA9ICRUaW1lQWNjb3VudGluZ09iamVjdC0+VXNlckdldCgpOwoKPWN1dAoKc3ViIFVzZXJHZXQgewogICAgbXkgJFNlbGYgICAgPSBzaGlmdDsKICAgIG15ICVEYXRhICAgID0gKCk7CiAgICAjIGRiIHNlbGVjdAogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUgKAogICAgICAgIFNRTCA9PiAiU0VMRUNUIHVzZXJfaWQsIGRlc2NyaXB0aW9uLCBzaG93X292ZXJ0aW1lLCBjcmVhdGVfcHJvamVjdCBGUk9NIHRpbWVfYWNjb3VudGluZ191c2VyIiwKICAgICk7CgogICAgIyBmZXRjaCBEYXRhCiAgICB3aGlsZSAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAkRGF0YXskUm93WzBdfXtVc2VySUR9ICAgICAgICA9ICAkUm93WzBdOwogICAgICAgICREYXRheyRSb3dbMF19e0Rlc2NyaXB0aW9ufSAgID0gICRSb3dbMV07CiAgICAgICAgJERhdGF7JFJvd1swXX17U2hvd092ZXJ0aW1lfSAgPSAgJFJvd1syXTsKICAgICAgICAkRGF0YXskUm93WzBdfXtDcmVhdGVQcm9qZWN0fSA9ICAkUm93WzNdOwogICAgfQogICAgcmV0dXJuICVEYXRhOwp9Cgo9aXRlbSBVc2VyU2V0dGluZ3NHZXQoKQoKcmV0dXJucyBhIGhhc2ggd2l0aCB0aGUgdXNlciBwZXJpb2QgZGF0YQoKICAgIG15ICVVc2VyRGF0YSA9ICRUaW1lQWNjb3VudGluZ09iamVjdC0+VXNlclNldHRpbmdzR2V0KCk7Cgo9Y3V0CgpzdWIgVXNlclNldHRpbmdzR2V0IHsKICAgIG15ICRTZWxmICAgID0gc2hpZnQ7CiAgICBteSAlRGF0YSAgICA9ICgpOwogICAgIyBkYiBzZWxlY3QKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlICgKICAgICAgICBTUUwgPT4gIlNFTEVDVCB1c2VyX2lkLCBwcmVmZXJlbmNlX3BlcmlvZCwgZGF0ZV9zdGFydCwgZGF0ZV9lbmQsIHdlZWtseV9ob3VycywgbGVhdmVfZGF5cywgb3ZlcnRpbWUsIHN0YXR1cyBGUk9NIHRpbWVfYWNjb3VudGluZ191c2VyX3BlcmlvZCIsCiAgICApOwoKICAgICMgZmV0Y2ggRGF0YQogICAgd2hpbGUgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgJERhdGF7JFJvd1swXX17JFJvd1sxXX17VXNlcklEfSAgICAgICAgICAgPSAgJFJvd1swXTsKICAgICAgICAkRGF0YXskUm93WzBdfXskUm93WzFdfXtQZXJpb2R9ICAgICAgICAgICA9ICAkUm93WzFdOwogICAgICAgICREYXRheyRSb3dbMF19eyRSb3dbMV19e0RhdGVTdGFydH0gICAgICAgID0gIHN1YnN0cigkUm93WzJdLCAwLCAxMCk7CiAgICAgICAgJERhdGF7JFJvd1swXX17JFJvd1sxXX17RGF0ZUVuZH0gICAgICAgICAgPSAgc3Vic3RyKCRSb3dbM10sIDAsIDEwKTsKICAgICAgICAkRGF0YXskUm93WzBdfXskUm93WzFdfXtXZWVrbHlIb3Vyc30gICAgICA9ICAkUm93WzRdOwogICAgICAgICREYXRheyRSb3dbMF19eyRSb3dbMV19e0xlYXZlRGF5c30gICAgICAgID0gICRSb3dbNV07CiAgICAgICAgJERhdGF7JFJvd1swXX17JFJvd1sxXX17T3ZlcnRpbWV9ICAgICAgICAgPSAgJFJvd1s2XTsKICAgICAgICAkRGF0YXskUm93WzBdfXskUm93WzFdfXtVc2VyU3RhdHVzfSAgICAgICA9ICAkUm93WzddOwogICAgfQogICAgcmV0dXJuICVEYXRhOwp9Cgo9aXRlbSBVc2VyU2V0dGluZ3NJbnNlcnQoKQoKaW5zZXJ0IG5ldyB1c2VyIGRhdGEgaW4gdGhlIGRiCgogICAgJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5Vc2VyU2V0dGluZ3NJbnNlcnQoCiAgICAgICAgVXNlcklEICAgICAgID0+ICcyJywKICAgICAgICBQZXJpb2QgICAgICAgPT4gJzInLAogICAgKTsKCj1jdXQKCnN1YiBVc2VyU2V0dGluZ3NJbnNlcnQgewogICAgbXkgJFNlbGYgICAgPSBzaGlmdDsKICAgIG15ICVQYXJhbSAgID0gQF87CiAgICBteSAkSUQgICAgICA9ICcnOwogICAgbXkgJFNRTCAgICAgPSAnJzsKCiAgICAkUGFyYW17V2Vla2x5SG91cnN9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpbWVBY2NvdW50aW5nOjpEZWZhdWx0VXNlcldlZWtseUhvdXJzJykgfHwgJzQwJzsKICAgICRQYXJhbXtMZWF2ZURheXN9ICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZUFjY291bnRpbmc6OkRlZmF1bHRVc2VyTGVhdmVEYXlzJykgICB8fCAnMjUnOwogICAgJFBhcmFte1VzZXJTdGF0dXN9ICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaW1lQWNjb3VudGluZzo6RGVmYXVsdFVzZXJTdGF0dXMnKSAgICAgIHx8ICcxJzsKICAgICRQYXJhbXtPdmVydGltZX0gICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZUFjY291bnRpbmc6OkRlZmF1bHRVc2VyT3ZlcnRpbWUnKSAgICB8fCAnMCc7CiAgICAkUGFyYW17RGF0ZUVuZH0gICAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpbWVBY2NvdW50aW5nOjpEZWZhdWx0VXNlckRhdGVFbmQnKSAgICAgfHwgJzIwMDUtMTItMzEnOwogICAgJFBhcmFte0RhdGVTdGFydH0gICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaW1lQWNjb3VudGluZzo6RGVmYXVsdFVzZXJEYXRlU3RhcnQnKSAgIHx8ICcyMDA1LTAxLTAxJzsKCiAgICAjIGRiIHF1b3RlCiAgICBmb3JlYWNoIChrZXlzICVQYXJhbSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSkgfHwgJyc7CiAgICB9CgogICAgIyBidWlsZCBzcWwKICAgICRTUUwgPSAiSU5TRVJUIElOVE8gdGltZV9hY2NvdW50aW5nX3VzZXJfcGVyaW9kICh1c2VyX2lkLCBwcmVmZXJlbmNlX3BlcmlvZCwgZGF0ZV9zdGFydCwgZGF0ZV9lbmQsIiAuCiAgICAgICAgIiB3ZWVrbHlfaG91cnMsIGxlYXZlX2RheXMsIG92ZXJ0aW1lLCBzdGF0dXMpIiAuCiAgICAgICAgIiBWQUxVRVMiIC4KICAgICAgICAiICgnJFBhcmFte1VzZXJJRH0nLCAnJFBhcmFte1BlcmlvZH0nLCAnJFBhcmFte0RhdGVTdGFydH0gMDA6MDA6MDAnLCAnJFBhcmFte0RhdGVFbmR9IDAwOjAwOjAwJywiIC4KICAgICAgICAiICckUGFyYW17V2Vla2x5SG91cnN9JywgJyRQYXJhbXtMZWF2ZURheXN9JywgJyRQYXJhbXtPdmVydGltZX0nLCAnJFBhcmFte1VzZXJTdGF0dXN9JykiOwogICAgIyBkYiBpbnNlcnQKICAgIGlmICghJFNlbGYtPntEQk9iamVjdH0tPkRvKFNRTCA9PiAkU1FMKSkgewogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIFNwbGl0IHRoZSBmb2xsb3dpbmcgY29kZSBpbiBhIHNlcGVyYXRlIGZ1bmN0aW9uIQoKICAgICNjaGVjayBpZiB0aGUgdXNlciBzdGlsbCBleGlzdHMKICAgIG15ICRVc2VySUQ7CiAgICAjIGJ1aWxkIHNxbAogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUgKAogICAgICAgIFNRTCA9PiAiU0VMRUNUIHVzZXJfaWQgRlJPTSB0aW1lX2FjY291bnRpbmdfdXNlciBXSEVSRSB1c2VyX2lkID0gJyIgLiAkUGFyYW17VXNlcklEfS4gIiciLAogICAgKTsKCiAgICAjIGZldGNoIERhdGEKICAgIHdoaWxlIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgICRVc2VySUQgICAgICAgICAgID0gICRSb3dbMF07CiAgICB9CiAgICBpZiAoIWRlZmluZWQoJFVzZXJJRCkpIHsKICAgICAgICAkU1FMID0gIklOU0VSVCBJTlRPIHRpbWVfYWNjb3VudGluZ191c2VyICh1c2VyX2lkKSIgLgogICAgICAgICAgICAiIFZBTFVFUyIgLgogICAgICAgICAgICAiICgnIiAuICRQYXJhbXtVc2VySUR9LiAiJykiOwogICAgICAgICMgZGIgaW5zZXJ0CiAgICAgICAgaWYgKCEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oU1FMID0+ICRTUUwpKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gVXNlclNldHRpbmdzVXBkYXRlKCkKCnVwZGF0ZSB1c2VyIGRhdGEgaW4gdGhlIGRiCgogICAgJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5Vc2VyU2V0dGluZ3NVcGRhdGUoCiAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NvbWUgVGV4dCcsCiAgICAgICAgQ3JlYXRlUHJvamVjdCA9PiAxIHx8IDAsCiAgICAgICAgU2hvd092ZXJ0aW1lICA9PiAxIHx8IDAsCiAgICAgICAgMSAgICA9PiB7CiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU29tZSBUZXh0JywKICAgICAgICAgICAgQ3JlYXRlUHJvamVjdCA9PiAxIHx8IDAsCiAgICAgICAgICAgIFNob3dPdmVydGltZSAgPT4gMSB8fCAwLAogICAgICAgICAgICAxID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgUGVyaW9kICAgICAgID0+ICcxJywKICAgICAgICAgICAgICAgIERhdGVTdGFydCAgICA9PiAnMjAwNS0xMi0xMicsCiAgICAgICAgICAgICAgICBEYXRlRW5kICAgICAgPT4gJzIwMDUtMTItMzEnLAogICAgICAgICAgICAgICAgV2Vla2x5SG91cnMgID0+ICczOCcsCiAgICAgICAgICAgICAgICBMZWF2ZURheXMgICAgPT4gJzI1JywKICAgICAgICAgICAgICAgIE92ZXJ0aW1lICAgICA9PiAnMzgnLAogICAgICAgICAgICAgICAgVXNlclN0YXR1cyAgID0+IDEgfHwgMCwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIDIgICAgPT4gewogICAgICAgICAgICAxID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAyLAogICAgICAgICAgICAgICAgUGVyaW9kICAgICAgID0+ICcxJywKICAgICAgICAgICAgICAgIERhdGVTdGFydCAgICA9PiAnMjAwNS0xMi0xMicsCiAgICAgICAgICAgICAgICBEYXRlRW5kICAgICAgPT4gJzIwMDUtMTItMzEnLAogICAgICAgICAgICAgICAgV2Vla2x5SG91cnMgID0+ICczOCcsCiAgICAgICAgICAgICAgICBMZWF2ZURheXMgICAgPT4gJzI1JywKICAgICAgICAgICAgICAgIE92ZXJ0aW1lICAgICA9PiAnMzgnLAogICAgICAgICAgICAgICAgVXNlclN0YXR1cyAgID0+IDEgfHwgMCwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIDMgICAgPT4gLi4uLi4uCiAgICApOwoKPWN1dAoKc3ViIFVzZXJTZXR0aW5nc1VwZGF0ZSB7CiAgICBteSAkU2VsZiAgICA9IHNoaWZ0OwogICAgbXkgJVBhcmFtICAgPSBAXzsKICAgIGZvcmVhY2ggbXkgJFVzZXJJRCAoc29ydCBrZXlzICAlUGFyYW0pIHsKICAgICAgICBmb3JlYWNoIChxdyhVc2VySUQgRGVzY3JpcHRpb24gU2hvd092ZXJ0aW1lIENyZWF0ZVByb2plY3QpKSB7CiAgICAgICAgICAgICRQYXJhbXskVXNlcklEfXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRVc2VySUR9eyRffSkgfHwgJyc7CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIHNxbAogICAgICAgIG15ICRTUUwgPSAiVVBEQVRFIHRpbWVfYWNjb3VudGluZ191c2VyICIgLgogICAgICAgICAgICAiU0VUIGRlc2NyaXB0aW9uID0gJyIgICAuICRQYXJhbXskVXNlcklEfXtEZXNjcmlwdGlvbn0gLgogICAgICAgICAgICAiJywgc2hvd19vdmVydGltZSA9ICciICAuICRQYXJhbXskVXNlcklEfXtTaG93T3ZlcnRpbWV9IC4KICAgICAgICAgICAgIicsIGNyZWF0ZV9wcm9qZWN0ID0gJyIgLiAkUGFyYW17JFVzZXJJRH17Q3JlYXRlUHJvamVjdH0gLiAiJyAiIC4KICAgICAgICAgICAgIldIRVJFIHVzZXJfaWQgPSAnIiAuICRQYXJhbXskVXNlcklEfXtVc2VySUR9LiAiJyI7CiAgICAgICAgIyBkYiBpbnNlcnQKICAgICAgICBpZiAoISRTZWxmLT57REJPYmplY3R9LT5EbyhTUUwgPT4gJFNRTCkpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgZm9yZWFjaCAocXcoVXNlcklEIERlc2NyaXB0aW9uIFNob3dPdmVydGltZSBDcmVhdGVQcm9qZWN0KSkgewogICAgICAgICAgICBkZWxldGUgKCRQYXJhbXskVXNlcklEfXskX30pOwogICAgICAgIH0KCiAgICAgICAgZm9yZWFjaCBteSAkUGVyaW9kIChrZXlzICV7JFBhcmFteyRVc2VySUR9fSkgewogICAgICAgICAgICAjIGRiIHF1b3RlCiAgICAgICAgICAgIGZvcmVhY2ggKGtleXMgJXskUGFyYW17JFVzZXJJRH17JFBlcmlvZH19KSB7CiAgICAgICAgICAgICAgICAkUGFyYW17JFVzZXJJRH17JFBlcmlvZH17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskVXNlcklEfXskUGVyaW9kfXskX30pIHx8ICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICMgYnVpbGQgc3FsCiAgICAgICAgICAgIG15ICRTUUwgPSAiVVBEQVRFIHRpbWVfYWNjb3VudGluZ191c2VyX3BlcmlvZCAiIC4KICAgICAgICAgICAgICAgICJTRVQgbGVhdmVfZGF5cyA9ICciICAuICRQYXJhbXskVXNlcklEfXskUGVyaW9kfXtMZWF2ZURheXN9IC4KICAgICAgICAgICAgICAgICInLCBkYXRlX3N0YXJ0ID0gJyIgICAuICRQYXJhbXskVXNlcklEfXskUGVyaW9kfXtEYXRlU3RhcnR9IC4KICAgICAgICAgICAgICAgICInLCBkYXRlX2VuZCA9ICciICAgICAuICRQYXJhbXskVXNlcklEfXskUGVyaW9kfXtEYXRlRW5kfSAuCiAgICAgICAgICAgICAgICAiJywgb3ZlcnRpbWUgPSAnIiAgICAgLiAkUGFyYW17JFVzZXJJRH17JFBlcmlvZH17T3ZlcnRpbWV9IC4KICAgICAgICAgICAgICAgICInLCB3ZWVrbHlfaG91cnMgPSAnIiAuICRQYXJhbXskVXNlcklEfXskUGVyaW9kfXtXZWVrbHlIb3Vyc30gLgogICAgICAgICAgICAgICAgIicsIHN0YXR1cyA9ICciICAgICAgIC4gJFBhcmFteyRVc2VySUR9eyRQZXJpb2R9e1VzZXJTdGF0dXN9LiAiJyAiIC4KICAgICAgICAgICAgICAgICJXSEVSRSB1c2VyX2lkID0gJyIgLiAkUGFyYW17JFVzZXJJRH17JFBlcmlvZH17VXNlcklEfSAuCiAgICAgICAgICAgICAgICAiJyBBTkQgcHJlZmVyZW5jZV9wZXJpb2QgPSAnIiAuICRQZXJpb2QgLiAiJyI7CiAgICAgICAgICAgICMgZGIgaW5zZXJ0CiAgICAgICAgICAgIGlmICghJFNlbGYtPntEQk9iamVjdH0tPkRvKFNRTCA9PiAkU1FMKSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIFdvcmtpbmdVbml0c0NvbXBsZXRuZXNzQ2hlY2soKQoKcmV0dXJucyBhIGhhc2ggd2l0aCB0aGUgaW5jb21wbGV0ZSB3b3JraW5nIGRheXMgYW5kCnRoZSBpbmZvcm1hdGlvbiBpZiB0aGUgaW5jb21wbGV0ZSB3b3JraW5nIGRheSBhcmUgaW4gdGhlIGFsbG93ZWQKcmFuZ2UuCgogICAgbXkgJVdvcmtpbmdVbml0c0NoZWNrID0gJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5Xb3JraW5nVW5pdHNDb21wbGV0bmVzc0NoZWNrKAogICAgICAgIFVzZXJJRCA9PiAnMicsICAgICMgT3B0aW9uYWwKICAgICk7Cgo9Y3V0CgpzdWIgV29ya2luZ1VuaXRzQ29tcGxldG5lc3NDaGVjayB7CiAgICBteSAkU2VsZiAgICAgICAgICAgICAgICA9IHNoaWZ0OwogICAgbXkgJVBhcmFtICAgICAgICAgICAgICAgPSBAXzsKICAgIG15ICVEYXRhICAgICAgICAgICAgICAgID0gKCk7CiAgICBteSAkV29ya2luZ1VuaXRJRCAgICAgICA9IDA7CiAgICBteSAlQ29tcGxldGVXb3JraW5nRGF5cyA9ICgpOwogICAgbXkgKCRTZWMsICRNaW4sICRIb3VyLCAkRGF5LCAkTW9udGgsICRZZWFyKSA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyRGF0ZSgKICAgICAgICBTeXN0ZW1UaW1lID0+ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKSwKICAgICk7CgogICAgJFBhcmFte1VzZXJJRH0gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFte1VzZXJJRH0pIHx8ICcnOwoKICAgIGlmICghJFBhcmFte1VzZXJJRH0pIHsKICAgICAgICAkUGFyYW17VXNlcklEfSA9ICRTZWxmLT57VXNlcklEfTsKICAgIH0KCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSAoCiAgICAgICAgU1FMID0+ICJTRUxFQ1QgRElTVElOQ1QgdGltZV9zdGFydCBGUk9NIHRpbWVfYWNjb3VudGluZ190YWJsZSBXSEVSRSB1c2VyX2lkID0gJyRQYXJhbXtVc2VySUR9JyIsCiAgICApOwoKICAgICMgZmV0Y2ggRGF0YQogICAgd2hpbGUgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgaWYgKCRSb3dbMF0gPX4gL14oXGQrKS0oXGQrKS0oXGQrKSguKz8pLykgewogICAgICAgICAgICAkQ29tcGxldGVXb3JraW5nRGF5c3skMX17JDJ9eyQzfSA9IDE7CiAgICAgICAgfQogICAgfQogICAgbXkgJVVzZXJDdXJyZW50UGVyaW9kID0gJFNlbGYtPlVzZXJDdXJyZW50UGVyaW9kR2V0KAogICAgICAgIFllYXIgICA9PiAkWWVhciwKICAgICAgICBNb250aCAgPT4gJE1vbnRoLAogICAgICAgIERheSAgICA9PiAkRGF5LAogICAgKTsKICAgIG15ICRXb3JraW5nRGF5cyAgICAgPSAwOwogICAgbXkgJFllYXJTdGFydCAgICAgICA9IDA7CiAgICBteSAkTW9udGhTdGFydCAgICAgID0gMDsKICAgIG15ICREYXlTdGFydCAgICAgICAgPSAwOwogICAgbXkgJE1vbnRoU3RhcnRQb2ludCA9IDA7CiAgICBteSAkRGF5U3RhcnRQb2ludCAgID0gMDsKICAgIG15ICRNb250aEVuZFBvaW50ICAgPSAwOwogICAgbXkgJERheUVuZFBvaW50ICAgICA9IDA7CiAgICBteSAkWWVhckVuZCAgICAgICAgID0gJFllYXI7CiAgICBteSAkTW9udGhFbmQgICAgICAgID0gJE1vbnRoOwogICAgbXkgJERheUVuZCAgICAgICAgICA9ICREYXk7CgogICAgaWYgKCRVc2VyQ3VycmVudFBlcmlvZHskUGFyYW17VXNlcklEfX17RGF0ZVN0YXJ0fSA9fiAvXihcZCspLShcZCspLShcZCspLykgewogICAgICAgICRZZWFyU3RhcnQgID0gJDE7CiAgICAgICAgJE1vbnRoU3RhcnQgPSAkMjsKICAgICAgICAkRGF5U3RhcnQgICA9ICQzOwogICAgfQoKICAgIGZvciAobXkgJFllYXIgPSAkWWVhclN0YXJ0OyAkWWVhciA8PSAkWWVhckVuZDsgJFllYXIrKykgewogICAgICAgIGlmICgkWWVhciA9PSAkWWVhclN0YXJ0KSB7CiAgICAgICAgICAgICRNb250aFN0YXJ0UG9pbnQgPSAkTW9udGhTdGFydDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRNb250aFN0YXJ0UG9pbnQgPSAxOwogICAgICAgIH0KICAgICAgICBpZiAoJFllYXIgPT0gJFllYXJFbmQpIHsKICAgICAgICAgICAgJE1vbnRoRW5kUG9pbnQgPSAkTW9udGhFbmQ7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkTW9udGhFbmRQb2ludCA9IDEyOwogICAgICAgIH0KICAgICAgICBmb3IgKG15ICRNb250aCA9ICRNb250aFN0YXJ0UG9pbnQ7ICRNb250aCA8PSAkTW9udGhFbmRQb2ludDsgJE1vbnRoKyspIHsKICAgICAgICAgICAgaWYgKCRZZWFyID09ICRZZWFyU3RhcnQgJiYgJE1vbnRoID09ICRNb250aFN0YXJ0ICkgewogICAgICAgICAgICAgICAgJERheVN0YXJ0UG9pbnQgPSAkRGF5U3RhcnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkRGF5U3RhcnRQb2ludCA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRZZWFyID09ICRZZWFyRW5kICYmICRNb250aCA9PSAkTW9udGhFbmQgKSB7CiAgICAgICAgICAgICAgICAkRGF5RW5kUG9pbnQgPSAkRGF5RW5kOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJERheUVuZFBvaW50ID0gRGF5c19pbl9Nb250aCgkWWVhciwgJE1vbnRoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBteSAkTW9udGhTdHJpbmcgPSBzcHJpbnRmKCIlMDJkIiwkTW9udGgpOwogICAgICAgICAgICBmb3IgKG15ICREYXkgPSAkRGF5U3RhcnRQb2ludDsgJERheSA8PSAkRGF5RW5kUG9pbnQ7ICREYXkrKykgewogICAgICAgICAgICAgICAgbXkgJFZhY2F0aW9uQ2hlY2sgPSAkU2VsZi0+VmFjYXRpb25DaGVjaygKICAgICAgICAgICAgICAgICAgICBZZWFyICA9PiAkWWVhciwKICAgICAgICAgICAgICAgICAgICBNb250aCA9PiAkTW9udGgsCiAgICAgICAgICAgICAgICAgICAgRGF5ICAgPT4gJERheSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbXkgJERheVN0cmluZyA9IHNwcmludGYoIiUwMmQiLCREYXkpOwogICAgICAgICAgICAgICAgbXkgJFdlZWtkYXkgPSBEYXlfb2ZfV2VlaygkWWVhciwgJE1vbnRoLCAkRGF5KTsKICAgICAgICAgICAgICAgIGlmICgkV2Vla2RheSAhPSA2ICYmICRXZWVrZGF5ICE9IDcgJiYgISRWYWNhdGlvbkNoZWNrKSB7CiAgICAgICAgICAgICAgICAgICAgJFdvcmtpbmdEYXlzKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoJFdlZWtkYXkgIT0gNiAmJiAkV2Vla2RheSAhPSA3CiAgICAgICAgICAgICAgICAgICAgJiYgISRWYWNhdGlvbkNoZWNrCiAgICAgICAgICAgICAgICAgICAgJiYgISRDb21wbGV0ZVdvcmtpbmdEYXlzeyRZZWFyfXskTW9udGhTdHJpbmd9eyREYXlTdHJpbmd9CiAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICAkRGF0YXtJbmNvbXBsZXRlfXskWWVhcn17JE1vbnRoU3RyaW5nfXskRGF5U3RyaW5nfSA9ICRXb3JraW5nRGF5czsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIG15ICRNYXhJbnRlcnZhbGxPZkluY29tcGxldGVEYXlzICAgICAgICAgICAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaW1lQWNjb3VudGluZzo6TWF4SW50ZXJ2YWxPZkluY29tcGxldGVEYXlzJykgfHwgJzUnOwogICAgbXkgJE1heEludGVydmFsbE9mSW5jb21wbGV0ZURheXNCZWZvcmVXYXJuaW5nID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpbWVBY2NvdW50aW5nOjpNYXhJbnRlcnZhbE9mSW5jb21wbGV0ZURheXNCZWZvcmVXYXJuaW5nJykgfHwgJzMnOwoKICAgIGZvcmVhY2ggbXkgJFllYXIgKGtleXMgJXskRGF0YXtJbmNvbXBsZXRlfX0pIHsKICAgICAgICBmb3JlYWNoIG15ICRNb250aCAoa2V5cyAleyREYXRhe0luY29tcGxldGV9eyRZZWFyfX0pIHsKICAgICAgICAgICAgZm9yZWFjaCBteSAkRGF5IChrZXlzICV7JERhdGF7SW5jb21wbGV0ZX17JFllYXJ9eyRNb250aH19KSB7CiAgICAgICAgICAgICAgICBpZiAoJERhdGF7SW5jb21wbGV0ZX17JFllYXJ9eyRNb250aH17JERheX0gPCAkV29ya2luZ0RheXMgLSAkTWF4SW50ZXJ2YWxsT2ZJbmNvbXBsZXRlRGF5cykgewogICAgICAgICAgICAgICAgICAgICREYXRhe0VuZm9yY2VJbnNlcnR9ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICgkRGF0YXtJbmNvbXBsZXRlfXskWWVhcn17JE1vbnRofXskRGF5fSA8ICRXb3JraW5nRGF5cyAtICRNYXhJbnRlcnZhbGxPZkluY29tcGxldGVEYXlzQmVmb3JlV2FybmluZykgewogICAgICAgICAgICAgICAgICAgICREYXRhe1dhcm5pbmd9ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAlRGF0YTsKfQoKPWl0ZW0gV29ya2luZ1VuaXRzR2V0KCkKCnJldHVybnMgYSBoYXNoIHdpdGggdGhlIHdvcmtpbmcgdW5pdHMgZGF0YQoKICAgIG15ICVXb3JraW5nVW5pdHNEYXRhID0gJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5Xb3JraW5nVW5pdHNHZXQoCiAgICAgICAgWWVhciAgID0+ICcyMDA1JywKICAgICAgICBNb250aCAgPT4gJzcnLAogICAgICAgIERheSAgICA9PiAnMTMnLAogICAgICAgIFVzZXJJRCA9PiAnMicsICAgICMgT3B0aW9uYWwKICAgICk7Cgo9Y3V0CgpzdWIgV29ya2luZ1VuaXRzR2V0IHsKICAgIG15ICRTZWxmICAgICAgICAgID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gICAgICAgICA9IEBfOwogICAgbXkgJURhdGEgICAgICAgICAgPSAoKTsKICAgIG15ICRXb3JraW5nVW5pdElEID0gMDsKICAgIGZvcmVhY2ggKGtleXMgJVBhcmFtKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99KSB8fCAnJzsKICAgIH0KICAgIGlmICghJFBhcmFte1VzZXJJRH0pIHsKICAgICAgICAkUGFyYW17VXNlcklEfSA9ICRTZWxmLT57VXNlcklEfTsKICAgIH0KCiAgICBteSAkRGF0ZSA9IHNwcmludGYoIiUwNGQtJTAyZC0lMDJkIiwgJFBhcmFte1llYXJ9LCAkUGFyYW17TW9udGh9LCAkUGFyYW17RGF5fSk7CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSAoCiAgICAgICAgU1FMID0+ICJTRUxFQ1QgdXNlcl9pZCwgcHJvamVjdF9pZCwgYWN0aW9uX2lkLCByZW1hcmssIHRpbWVfc3RhcnQsIHRpbWVfZW5kLCIgLgogICAgICAgICAgICAiIHBlcmlvZCBGUk9NIHRpbWVfYWNjb3VudGluZ190YWJsZSBXSEVSRSB0aW1lX3N0YXJ0IExJS0UgJyREYXRlJSciIC4KICAgICAgICAgICAgIiBBTkQgdXNlcl9pZCA9ICckUGFyYW17VXNlcklEfScgT1JERVIgYnkgaWQiLAogICAgKTsKCiAgICAjIGZldGNoIERhdGEKICAgIHdoaWxlIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgIGlmICgkUm93WzRdID1+IC9eKC4rPylccyhcZCs6XGQrKTooXGQrKS8pIHsKICAgICAgICAgICAgJFdvcmtpbmdVbml0SUQrKzsKICAgICAgICAgICAgJERhdGF7JFdvcmtpbmdVbml0SUR9e1VzZXJJRH0gICAgID0gICRSb3dbMF07CiAgICAgICAgICAgICREYXRheyRXb3JraW5nVW5pdElEfXtQcm9qZWN0SUR9ICA9ICAkUm93WzFdOwogICAgICAgICAgICAkRGF0YXskV29ya2luZ1VuaXRJRH17QWN0aW9uSUR9ICAgPSAgJFJvd1syXTsKICAgICAgICAgICAgJERhdGF7JFdvcmtpbmdVbml0SUR9e1JlbWFya30gICAgID0gICRSb3dbM107CiAgICAgICAgICAgICREYXRheyRXb3JraW5nVW5pdElEfXtTdGFydFRpbWV9ICA9ICAkMjsKICAgICAgICAgICAgJERhdGF7JFdvcmtpbmdVbml0SUR9e1BlcmlvZH0gICAgID0gIHNwcmludGYgKCIlLjJmIiwgJFJvd1s2XSk7CiAgICAgICAgICAgICREYXRheyRXb3JraW5nVW5pdElEfXtEYXRlfSAgICAgICA9ICAkMTsKICAgICAgICAgICAgaWYgKCRSb3dbNV0gPX4gL14oLis/KVxzKFxkKzpcZCspOihcZCspLykgewogICAgICAgICAgICAgICAgJERhdGF7JFdvcmtpbmdVbml0SUR9e0VuZFRpbWV9ICAgID0gICQyOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuICVEYXRhOwp9Cgo9aXRlbSBXb3JraW5nVW5pdHNJbnNlcnQoKQoKaW5zZXJ0IHdvcmtpbmcgdW5pdHMgaW4gdGhlIGRiCgogICAgJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5Xb3JraW5nVW5pdHNJbnNlcnQoCiAgICAgICAgWWVhciAgPT4gJzIwMDUnLAogICAgICAgIE1vbnRoID0+ICcwNycsCiAgICAgICAgRGF5ICAgPT4gJzAyJywKICAgICAgICAxICAgID0+IHsKICAgICAgICAgICAgUHJvamVjdElEID0+IDEsCiAgICAgICAgICAgIEFjdGlvbklEICA9PiAyMywKICAgICAgICAgICAgUmVtYXJrICAgID0+IDQsCiAgICAgICAgICAgIFN0YXJ0VGltZSA9PiAnNzozMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICA9PiAnMTE6MDAnLAogICAgICAgICAgICBQZXJpb2QgICAgPT4gJzguNScsCiAgICAgICAgfSwKICAgICAgICAyIC4uLi4uLgogICAgKTsKCj1jdXQKCnN1YiBXb3JraW5nVW5pdHNJbnNlcnQgewogICAgbXkgJFNlbGYgICAgPSBzaGlmdDsKICAgIG15ICVQYXJhbSAgID0gQF87CiAgICBteSAkU1FMICAgICA9ICcnOwoKICAgIGZvcmVhY2ggKHF3KFllYXIgTW9udGggRGF5KSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSkgfHwgJyc7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIldvcmtpbmdVbml0c0luc2VydDogTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIG15ICREYXRlID0gc3ByaW50ZigiJTA0ZC0lMDJkLSUwMmQiLCAkUGFyYW17WWVhcn0sICRQYXJhbXtNb250aH0sICRQYXJhbXtEYXl9KTsKCiAgICBpZiAoISRTZWxmLT5Xb3JraW5nVW5pdHNEZWxldGUoCiAgICAgICAgWWVhciAgPT4gJFBhcmFte1llYXJ9LAogICAgICAgIE1vbnRoID0+ICRQYXJhbXtNb250aH0sCiAgICAgICAgRGF5ICAgPT4gJFBhcmFte0RheX0sCiAgICApKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnQ2FuXCd0IGRlbGV0ZSBXb3JraW5nIFVuaXRzIScpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBkZWxldGUgJFBhcmFte1llYXJ9OwogICAgZGVsZXRlICRQYXJhbXtNb250aH07CiAgICBkZWxldGUgJFBhcmFte0RheX07CgogICAgIyBpbnN0ZXJ0IG5ldyB3b3JraW5nIHVuaXRzCiAgICBmb3JlYWNoIG15ICRXb3JraW5nVW5pdElEIChzb3J0IGtleXMgICVQYXJhbSkgewogICAgICAgICMgZGIgcXVvdGUKICAgICAgICBmb3JlYWNoIChrZXlzICV7JFBhcmFteyRXb3JraW5nVW5pdElEfX0pIHsKICAgICAgICAgICAgJFBhcmFteyRXb3JraW5nVW5pdElEfXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRXb3JraW5nVW5pdElEfXskX30pIHx8ICcnOwogICAgICAgIH0KICAgICAgICBteSAkU3RhcnRUaW1lID0gJERhdGUgLiAiICIgLiAkUGFyYW17JFdvcmtpbmdVbml0SUR9e1N0YXJ0VGltZX07CiAgICAgICAgbXkgJEVuZFRpbWUgICA9ICREYXRlIC4gIiAiIC4gJFBhcmFteyRXb3JraW5nVW5pdElEfXtFbmRUaW1lfTsKCiAgICAgICAgIyBidWlsZCBzcWwKICAgICAgICAkU1FMID0gIklOU0VSVCBJTlRPIHRpbWVfYWNjb3VudGluZ190YWJsZSAodXNlcl9pZCwgcHJvamVjdF9pZCwgYWN0aW9uX2lkLCByZW1hcmssIiAuCiAgICAgICAgICAgICIgdGltZV9zdGFydCwgdGltZV9lbmQsIHBlcmlvZCwgY3JlYXRlZCApIiAuCiAgICAgICAgICAgICIgVkFMVUVTIiAuCiAgICAgICAgICAgICIgKCckU2VsZi0+e1VzZXJJRH0nLCAnJFBhcmFteyRXb3JraW5nVW5pdElEfXtQcm9qZWN0SUR9JywgJyRQYXJhbXskV29ya2luZ1VuaXRJRH17QWN0aW9uSUR9JywiIC4KICAgICAgICAgICAgIiAnJFBhcmFteyRXb3JraW5nVW5pdElEfXtSZW1hcmt9JywgJyRTdGFydFRpbWUnLCAnJEVuZFRpbWUnLCAnJFBhcmFteyRXb3JraW5nVW5pdElEfXtQZXJpb2R9JywiIC4KICAgICAgICAgICAgIiBjdXJyZW50X3RpbWVzdGFtcCkiOwogICAgICAgICMgZGIgaW5zZXJ0CiAgICAgICAgaWYgKCEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oU1FMID0+ICRTUUwpKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gV29ya2luZ1VuaXRzRGVsZXRlKCkKCmRlbGV0cyB3b3JraW5nIHVuaXRzIGluIHRoZSBkYgoKICAgICRUaW1lQWNjb3VudGluZ09iamVjdC0+V29ya2luZ1VuaXRzRGVsZXRlKAogICAgICAgIFllYXIgID0+ICcyMDA1JywKICAgICAgICBNb250aCA9PiAnNycsCiAgICAgICAgRGF5ICAgPT4gJzEzJywKICAgICk7Cgo9Y3V0CgpzdWIgV29ya2luZ1VuaXRzRGVsZXRlIHsKICAgIG15ICRTZWxmICAgID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gICA9IEBfOwogICAgbXkgJFNRTCAgICAgPSAnJzsKCiAgICBmb3JlYWNoIChxdyhZZWFyIE1vbnRoIERheSkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30pIHx8ICcnOwogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJXb3JraW5nVW5pdHNJbnNlcnQ6IE5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBteSAkRGF0ZSA9IHNwcmludGYoIiUwNGQtJTAyZC0lMDJkIiwgJFBhcmFte1llYXJ9LCAkUGFyYW17TW9udGh9LCAkUGFyYW17RGF5fSk7CgogICAgIyBkZWxldGUgb2xkIHdvcmtpbmcgdW5pdHMKICAgICRTUUwgPSAiREVMRVRFIEZST00gdGltZV9hY2NvdW50aW5nX3RhYmxlICIgLgogICAgICAgICJXSEVSRSB0aW1lX3N0YXJ0IExJS0UgJyREYXRlJScgQU5EIHVzZXJfaWQgPSAnJFNlbGYtPntVc2VySUR9JyIgOwogICAgaWYgKCEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oU1FMID0+ICRTUUwpKSB7CiAgICAgICAgcmV0dXJuIDsKICAgIH0KICAgIHJldHVybiAxOwp9CgojIEZSQU1FV09SSy0yLjE6IHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSB0aW1lb2JqZWN0Cj1pdGVtIFZhY2F0aW9uQ2hlY2soKQoKY2hlY2sgaWYgdGhlIHNlbGVjdGVkIGRheSBpcyBhIHZhY2F0aW9uIChpdCBkb2Vzbid0IG1hdHRlciBpZiB5b3UKaW5zZXJ0IDAxIG9yIDEgZm9yIG1vbnRoIG9yIGRheSBpbiB0aGUgZnVuY3Rpb24gb3IgaW4gdGhlIFN5c0NvbmZpZykKCiAgICAkVGltZUFjY291bnRpbmdPYmplY3QtPlZhY2F0aW9uQ2hlY2soCiAgICAgICAgWWVhciAgPT4gJzIwMDUnLAogICAgICAgIE1vbnRoID0+ICc3JywgfHwgMDcKICAgICAgICBEYXkgICA9PiAnMTMnLAogICAgKTsKCj1jdXQKCnN1YiBWYWNhdGlvbkNoZWNrIHsKICAgIG15ICRTZWxmICAgICAgICAgPSBzaGlmdDsKICAgIG15ICVQYXJhbSAgICAgICAgPSBAXzsKICAgIG15ICRWYWNhdGlvbk5hbWUgPSAnJzsKCiAgICAjIGNoZWNrIHJlcXVpcmVkIHBhcmFtcwogICAgZm9yZWFjaCAocXcoWWVhciBNb250aCBEYXkpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJWYWNhdGlvbkNoZWNrOiBOZWVkICRfISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICRQYXJhbXtNb250aH0gPSBzcHJpbnRmKCIlMDJkIiwgJFBhcmFte01vbnRofSk7CiAgICAkUGFyYW17RGF5fSAgID0gc3ByaW50ZigiJTAyZCIsICRQYXJhbXtEYXl9KTsKCiAgICBteSAkVGltZVZhY2F0aW9uRGF5cyAgICAgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZVZhY2F0aW9uRGF5cycpOwogICAgbXkgJFRpbWVWYWNhdGlvbkRheXNPbmVUaW1lID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpbWVWYWNhdGlvbkRheXNPbmVUaW1lJyk7CiAgICBpZiAoZGVmaW5lZCgkVGltZVZhY2F0aW9uRGF5cy0+eyRQYXJhbXtNb250aH19LT57JFBhcmFte0RheX19KSkgewogICAgICAgIHJldHVybiAkVGltZVZhY2F0aW9uRGF5cy0+eyRQYXJhbXtNb250aH19LT57JFBhcmFte0RheX19OwogICAgfQogICAgZWxzaWYgKGRlZmluZWQoJFRpbWVWYWNhdGlvbkRheXNPbmVUaW1lLT57JFBhcmFte1llYXJ9fS0+eyRQYXJhbXtNb250aH19LT57JFBhcmFte0RheX19KSkgewogICAgICAgIHJldHVybiAkVGltZVZhY2F0aW9uRGF5c09uZVRpbWUtPnskUGFyYW17WWVhcn19LT57JFBhcmFte01vbnRofX0tPnskUGFyYW17RGF5fX07CiAgICB9CiAgICBlbHNpZiAoZGVmaW5lZCgkVGltZVZhY2F0aW9uRGF5cy0+e2ludCgkUGFyYW17TW9udGh9KX0tPntpbnQoJFBhcmFte0RheX0pfSkpIHsKICAgICAgICByZXR1cm4gJFRpbWVWYWNhdGlvbkRheXMtPntpbnQoJFBhcmFte01vbnRofSl9LT57aW50KCRQYXJhbXtEYXl9KX07CiAgICB9CiAgICBlbHNpZiAoZGVmaW5lZCgkVGltZVZhY2F0aW9uRGF5c09uZVRpbWUtPnskUGFyYW17WWVhcn19LT57aW50KCRQYXJhbXtNb250aH0pfS0+e2ludCgkUGFyYW17RGF5fSl9KSkgewogICAgICAgIHJldHVybiAkVGltZVZhY2F0aW9uRGF5c09uZVRpbWUtPnskUGFyYW17WWVhcn19LT57aW50KCRQYXJhbXtNb250aH0pfS0+e2ludCgkUGFyYW17RGF5fSl9OwogICAgfQogICAgcmV0dXJuOwp9Cgo9aXRlbSBQcm9qZWN0QWN0aW9uUmVwb3J0aW5nKCkKCnJldHVybnMgYSBoYXNoIHdpdGggdGhlIGhvdXJzIGRlcGVuZGVudCBwcm9qZWN0IGFuZCBhY3Rpb24gZGF0YQoKICAgIG15ICVQcm9qZWN0RGF0YSA9ICRUaW1lQWNjb3VudGluZ09iamVjdC0+UHJvamVjdEFjdGlvblJlcG9ydGluZygKICAgICAgICBZZWFyICA9PiAyMDA1LAogICAgICAgIE1vbnRoID0+IDcsCiAgICAgICAgVXNlcklEID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgUHJvamVjdEFjdGlvblJlcG9ydGluZyB7CiAgICBteSAkU2VsZiAgICAgPSBzaGlmdDsKICAgIG15ICVQYXJhbSAgICA9IEBfOwogICAgbXkgJURhdGEgICAgID0gKCk7CiAgICBteSAkSURTZWxlY3QgPSAnJzsKICAgIGZvcmVhY2ggKHF3KFllYXIgTW9udGgpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99KSB8fCAnJzsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiUHJvamVjdEFjdGlvblJlcG9ydGluZzogTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIGlmICgkUGFyYW17VXNlcklEfSkgewogICAgICAgICRQYXJhbXtVc2VySUR9ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXtVc2VySUR9KSB8fCAnJzsKICAgICAgICAkSURTZWxlY3QgPSAiIEFORCB1c2VyX2lkID0gJyRQYXJhbXtVc2VySUR9JyI7CiAgICB9CiAgICAjIGhvdXJzIHBlciBtb250aAogICAgbXkgJERhdGVTdHJpbmcgPSAkUGFyYW17WWVhcn0gLiAiLSIgLiBzcHJpbnRmKCIlMDJkIiwgJFBhcmFte01vbnRofSk7CgogICAgIyBUb3RhbCBob3VycwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUgKAogICAgICAgIFNRTCA9PiAiU0VMRUNUIHByb2plY3RfaWQsIGFjdGlvbl9pZCwgcGVyaW9kIEZST00gdGltZV9hY2NvdW50aW5nX3RhYmxlIFdIRVJFIHRpbWVfc3RhcnQgPD0gJyREYXRlU3RyaW5nLTMxIDIzOjIzOjU5JyRJRFNlbGVjdCIsCiAgICApOwogICAgIyBmZXRjaCBEYXRhCiAgICB3aGlsZSAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAkRGF0YXtUb3RhbH17JFJvd1swXX17JFJvd1sxXX17SG91cnN9ICs9ICRSb3dbMl07CiAgICB9CgogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUgKAogICAgICAgIFNRTCA9PiAiU0VMRUNUIHByb2plY3RfaWQsIGFjdGlvbl9pZCwgcGVyaW9kIEZST00gdGltZV9hY2NvdW50aW5nX3RhYmxlIiAuCiAgICAgICAgICAgICIgV0hFUkUgdGltZV9zdGFydCA+PSAnJERhdGVTdHJpbmctMDEgMDA6MDA6MDAnIEFORCB0aW1lX3N0YXJ0IDw9ICckRGF0ZVN0cmluZy0zMSAyMzoyMzo1OSckSURTZWxlY3QiLAogICAgKTsKCiAgICAjIGZldGNoIERhdGEKICAgIHdoaWxlIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgICREYXRhe1Blck1vbnRofXskUm93WzBdfXskUm93WzFdfXtIb3Vyc30gKz0gJFJvd1syXTsKICAgIH0KICAgIHJldHVybiAlRGF0YTsKCn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS45ICQgJERhdGU6IDIwMDcvMDUvMTEgMTQ6MzY6MzcgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9BZ2VudFRpbWVBY2NvdW50aW5nLnBtIC0gdGhlIGRlIGxhbmd1YWdlIGZvciBBZ2VudFRpbWVBY2NvdW50aW5nCiMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDYgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IGRlX0FnZW50VGltZUFjY291bnRpbmcucG0sdiAxLjMgMjAwNi8xMi8wOCAxNTowNzoyMyB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZGVfQWdlbnRUaW1lQWNjb3VudGluZzsKCnVzZSBzdHJpY3Q7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259ID0geyAleyRTZWxmLT57VHJhbnNsYXRpb259fSwKCiAgICAgICAgIyBUZW1wbGF0ZTogQWdlbnRUaW1lQWNjb3VudGluZwogICAgICAgICdTZXR0aW5nJyAgICAgICAgPT4gJ0tvbmZpZ3VyYXRpb24nLAogICAgICAgICdQcm9qZWN0U2V0dGluZycgPT4gJ1Byb2pla3Rrb25maWd1cmF0aW9uJywKICAgIH07Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGltZUFjY291bnRpbmcucG0gLSB0aW1lIGFjY291bnRpbmcgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFnZW50VGltZUFjY291bnRpbmcucG0sdiAxLjEzIDIwMDcvMDUvMjMgMTQ6MzQ6MTQgdHIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRUaW1lQWNjb3VudGluZzsKCnVzZSBzdHJpY3Q7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VGltZUFjY291bnRpbmc7CnVzZSBEYXRlOjpQY2FsYyBxdyhUb2RheSBEYXlzX2luX01vbnRoIERheV9vZl9XZWVrIEFkZF9EZWx0YV9ZTUQpOwp1c2UgVGltZTo6TG9jYWw7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4xMyAkJzsKJFZFUlNJT04gPX4gcy9eXCQuKjpcVyguKilcVy4rPyQvJDEvOwoKc3ViIG5ldyB7CiAgICBteSAkVHlwZSA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MgKCRTZWxmLCAkVHlwZSk7CgogICAgIyBnZXQgY29tbW9uIG9iamVjdHMKICAgIGZvcmVhY2ggKGtleXMgJVBhcmFtKSB7CiAgICAgICAgJFNlbGYtPnskX30gPSAkUGFyYW17JF99OwogICAgfQoKICAgICMgY2hlY2sgbmVlZGVkIE9wamVjdHMKICAgIGZvcmVhY2ggKHF3KFBhcmFtT2JqZWN0IERCT2JqZWN0IE1vZHVsZVJlZyBMb2dPYmplY3QKICAgICAgICBDb25maWdPYmplY3QgVGlja2V0T2JqZWN0IFRpbWVPYmplY3QgR3JvdXBPYmplY3QpCiAgICApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiR290IG5vICRfISIpIGlmICghJFNlbGYtPnskX30pOwogICAgfQoKICAgICMgY3JlYXRlIG5lZWRlbiBvYmplY3RzCiAgICAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpUaW1lQWNjb3VudGluZy0+bmV3KCVQYXJhbSk7CiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBQcmVSdW4gewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgKCRTZWMsICRNaW4sICRIb3VyLCAkRGF5LCAkTW9udGgsICRZZWFyKSA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyRGF0ZSgKICAgICAgICBTeXN0ZW1UaW1lID0+ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKSwKICAgICk7CiAgICBteSAlVXNlciA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Vc2VyQ3VycmVudFBlcmlvZEdldCgKICAgICAgICBZZWFyICA9PiAkWWVhciwKICAgICAgICBNb250aCA9PiAkTW9udGgsCiAgICAgICAgRGF5ICAgPT4gJERheSwKICAgICk7CiAgICBpZiAoJFVzZXJ7JFNlbGYtPntVc2VySUR9fSl7CiAgICAgICAgbXkgJUluY29tcGxldGVXb3JraW5nRGF5cyA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Xb3JraW5nVW5pdHNDb21wbGV0bmVzc0NoZWNrKCk7CiAgICAgICAgIyByZWRpcmVjdCBpZiBpbmNvbXBsZXRlIHdvcmtpbmcgZGF5IGFyZSBvdXQgb2YgcmFuZ2UKICAgICAgICBpZiAoJEluY29tcGxldGVXb3JraW5nRGF5c3tFbmZvcmNlSW5zZXJ0fQogICAgICAgICAgICAmJiAkU2VsZi0+e0FjdGlvbn0gbmUgJ0FnZW50VGltZUFjY291bnRpbmcnCiAgICAgICAgICAgICYmICRTZWxmLT57QWN0aW9ufSBuZSAnQWdlbnRDYWxlbmRhclNtYWxsJykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICJBY3Rpb249QWdlbnRUaW1lQWNjb3VudGluZyZTdWJhY3Rpb249RWRpdCIpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybjsKfQoKc3ViIFJ1biB7CiAgICBteSAkU2VsZiAgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgQE1vbnRoQXJyYXkgPSAoCiAgICAgICAgJycsCiAgICAgICAgJ0phbnVhcnknLAogICAgICAgICdGZWJydWFyeScsCiAgICAgICAgJ01hcmNoJywKICAgICAgICAnQXByaWwnLAogICAgICAgICdNYXknLAogICAgICAgICdKdW55JywKICAgICAgICAnSnVseScsCiAgICAgICAgJ0F1Z3VzdCcsCiAgICAgICAgJ1NlcHRlbWJlcicsCiAgICAgICAgJ09jdG9iZXInLAogICAgICAgICdOb3ZlbWJlcicsCiAgICAgICAgJ0RlY2VtYmVyJywKICAgICk7CiAgICBteSBAV2Vla2RheUFycmF5ID0gKAogICAgICAgICdNb24nLAogICAgICAgICdUdWUnLAogICAgICAgICdXZWQnLAogICAgICAgICdUaHUnLAogICAgICAgICdGcmknLAogICAgICAgICdTYXQnLAogICAgICAgICdTdW4nLAogICAgKTsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBlZGl0IHRoZSB0aW1lIGFjY291bnRpbmcgZWxlbWVudHMKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdFZGl0JykgewogICAgICAgIG15ICRPdXRwdXQgICAgICAgPSAnJzsKICAgICAgICBteSAlRnJvbnRlbmQgICAgID0gKCk7CiAgICAgICAgbXkgJVByb2plY3RMaXN0ICA9ICgpOwogICAgICAgIG15ICVBY3Rpb25MaXN0ICAgPSAoKTsKICAgICAgICBteSAlRGF0YSAgICAgICAgID0gKCk7CiAgICAgICAgbXkgJUFjdGlvbiAgICAgICA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5BY3Rpb25TZXR0aW5nc0dldCgpOwogICAgICAgIG15ICgkU2VjLCAkTWluLCAkSG91ciwgJERheSwgJE1vbnRoLCAkWWVhcikgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMkRhdGUoCiAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgIGZvcmVhY2ggKHF3KFN0YXR1cyBZZWFyIE1vbnRoIERheSBEZWxldGUpKSB7CiAgICAgICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJF8pOwogICAgICAgIH0KICAgICAgICAjIHBlcm1pc3Npb24gY2hlY2sKICAgICAgICBpZiAoISRTZWxmLT57QWNjZXNzUm99KSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbihXaXRoSGVhZGVyID0+ICd5ZXMnKTsKICAgICAgICB9CgogICAgICAgICMgQ2hlY2sgRGF0ZQogICAgICAgIGlmICghJFBhcmFte1llYXJ9IHx8ICEkUGFyYW17TW9udGh9IHx8ICEkUGFyYW17RGF5fSkgewogICAgICAgICAgICAkUGFyYW17WWVhcn0gID0gJFllYXI7CiAgICAgICAgICAgICRQYXJhbXtNb250aH0gPSAkTW9udGg7CiAgICAgICAgICAgICRQYXJhbXtEYXl9ICAgPSAkRGF5OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFBhcmFte1llYXJ9ICA9IHNwcmludGYoIiUwMmQiLCRQYXJhbXtZZWFyfSk7CiAgICAgICAgICAgICRQYXJhbXtNb250aH0gPSBzcHJpbnRmKCIlMDJkIiwkUGFyYW17TW9udGh9KTsKICAgICAgICAgICAgJFBhcmFte0RheX0gICA9IHNwcmludGYoIiUwMmQiLCRQYXJhbXtEYXl9KTsKICAgICAgICB9CgogICAgICAgIG15ICVVc2VyID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlVzZXJDdXJyZW50UGVyaW9kR2V0KAogICAgICAgICAgICBZZWFyICA9PiAkUGFyYW17WWVhcn0sCiAgICAgICAgICAgIE1vbnRoID0+ICRQYXJhbXtNb250aH0sCiAgICAgICAgICAgIERheSAgID0+ICRQYXJhbXtEYXl9LAogICAgICAgICk7CgogICAgICAgICMgZm9yIGluaXRhbCB1c2VpbmcsIHRoZSBmaXJzdCBhZ2VudCB3aXRoIHJ3LXJpZ2h0IHdpbGwgYmUgcmVkaXJlY3RlZAogICAgICAgICMgdG8gJ1NldHRpbmcnLiBUaGVuIGhlIGNhbiBkbyB0aGUgaW5pdGlhbCBzZXR0aW5ncwogICAgICAgIGlmICghJFVzZXJ7JFNlbGYtPntVc2VySUR9fSl7CiAgICAgICAgICAgIG15ICVHcm91cExpc3QgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIFR5cGUgICA9PiAncncnLAogICAgICAgICAgICAgICAgUmVzdWx0ID0+ICdIQVNIJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGZvcmVhY2ggKChrZXlzICVHcm91cExpc3QpKSB7CiAgICAgICAgICAgICAgICBpZiAoJEdyb3VwTGlzdHskX30gZXEgJ3RpbWVfYWNjb3VudGluZycpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdChPUCA9PiAiQWN0aW9uPUFnZW50VGltZUFjY291bnRpbmcmIiAuCiAgICAgICAgICAgICAgICAgICAgICAgICJTdWJhY3Rpb249U2V0dGluZyIKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAiTm8gVXNlclBlcmlvZCBhdmFpbGFibGUsIHBsZWFzZSBjb250YWN0IHRoZSB0aW1lIGFjY291bnRpbmcgYWRtaW4gdG8gaW5zZXJ0IHlvdXIgVXNlclBlcmlvZCEiCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAlSW5jb21wbGV0ZVdvcmtpbmdEYXlzID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPldvcmtpbmdVbml0c0NvbXBsZXRuZXNzQ2hlY2soKTsKICAgICAgICBteSAkTWF4QWxsb3dlZEluc2VydERheXMgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpbWVBY2NvdW50aW5nOjpNYXhBbGxvd2VkSW5zZXJ0RGF5cycpIHx8ICcxMCc7CiAgICAgICAgKCRQYXJhbXtZZWFyQWxsb3dlZH0sICRQYXJhbXtNb250aEFsbG93ZWR9LCAkUGFyYW17RGF5QWxsb3dlZH0pID0gQWRkX0RlbHRhX1lNRCgkWWVhciwgJE1vbnRoLCAkRGF5LCAwLCAwLCAtJE1heEFsbG93ZWRJbnNlcnREYXlzKTsKICAgICAgICBpZiAodGltZWxvY2FsKDEsIDAsIDAgLCAkUGFyYW17RGF5fSwgJFBhcmFte01vbnRofSAtIDEsICRQYXJhbXtZZWFyfSAtIDE5MDApIDwKICAgICAgICAgICAgdGltZWxvY2FsKDEsIDAsIDAgLCAkUGFyYW17RGF5QWxsb3dlZH0sICRQYXJhbXtNb250aEFsbG93ZWR9IC0gMSwgJFBhcmFte1llYXJBbGxvd2VkfSAtIDE5MDApCiAgICAgICAgKSB7CiAgICAgICAgICAgIGlmICghJEluY29tcGxldGVXb3JraW5nRGF5c3tJbmNvbXBsZXRlfXskUGFyYW17WWVhcn19eyRQYXJhbXtNb250aH19eyRQYXJhbXtEYXl9fSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mU3ViYWN0aW9uPVZpZXcmWWVhcj0kUGFyYW17WWVhcn0mTW9udGg9JFBhcmFte01vbnRofSZEYXk9JFBhcmFte0RheX0iKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzdG9yZSBsYXN0IHNjcmVlbgogICAgICAgICRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICAgICAgS2V5ICAgICAgID0+ICdMYXN0U2NyZWVuJywKICAgICAgICAgICAgVmFsdWUgICAgID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259JlN1YmFjdGlvbj1FZGl0JlllYXI9JFBhcmFte1llYXJ9Jk1vbnRoPSRQYXJhbXtNb250aH0mRGF5PSRQYXJhbXtEYXl9IiwKICAgICAgICApOwoKICAgICAgICAkUGFyYW17TW9udGhfdG9fVGV4dH0gICA9ICRNb250aEFycmF5WyRQYXJhbXtNb250aH1dOwoKICAgICAgICAoJFBhcmFte1llYXJCYWNrfSwgJFBhcmFte01vbnRoQmFja30sICRQYXJhbXtEYXlCYWNrfSkgPSBBZGRfRGVsdGFfWU1EKCRQYXJhbXtZZWFyfSwgJFBhcmFte01vbnRofSwgJFBhcmFte0RheX0sIDAsIDAsIC0xKTsKICAgICAgICAoJFBhcmFte1llYXJOZXh0fSwgJFBhcmFte01vbnRoTmV4dH0sICRQYXJhbXtEYXlOZXh0fSkgPSBBZGRfRGVsdGFfWU1EKCRQYXJhbXtZZWFyfSwgJFBhcmFte01vbnRofSwgJFBhcmFte0RheX0sIDAsIDAsIDEpOwoKICAgICMgRWRpdCBXb3JraW5nIFVuaXRzCiAgICAgICAgaWYgKCRQYXJhbXtTdGF0dXN9KSB7CiAgICAgICAgICAgIGlmICgkUGFyYW17RGVsZXRlfSkgewogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcihUaXRsZSA9PiAiRGVsZXRlIik7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dChEYXRhID0+IHslUGFyYW0sICVGcm9udGVuZH0sIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaW1lQWNjb3VudGluZ0RlbGV0ZScpOwogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXkgJFdvcmtpbmdVbml0SUQgPSAwOwogICAgICAgICAgICBmb3IgKCRXb3JraW5nVW5pdElEID0gMTsgJFdvcmtpbmdVbml0SUQgPCAxMDsgJFdvcmtpbmdVbml0SUQrKykgewogICAgICAgICAgICAgICAgZm9yZWFjaCAocXcoUHJvamVjdElEIEFjdGlvbklEIFJlbWFyayBTdGFydFRpbWUgRW5kVGltZSBQZXJpb2QpKSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAkXyAuICdbJyAuICRXb3JraW5nVW5pdElEIC4gJ10nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgkUGFyYW17UHJvamVjdElEfSB8fCAkUGFyYW17QWN0aW9uSUR9KSB7CiAgICAgICAgICAgICAgICAgICAgJERhdGF7JFdvcmtpbmdVbml0SUR9e1Byb2plY3RJRH0gPSAkUGFyYW17UHJvamVjdElEfTsKICAgICAgICAgICAgICAgICAgICAkRGF0YXskV29ya2luZ1VuaXRJRH17QWN0aW9uSUR9ICA9ICRQYXJhbXtBY3Rpb25JRH07CiAgICAgICAgICAgICAgICAgICAgJERhdGF7JFdvcmtpbmdVbml0SUR9e1JlbWFya30gICAgPSAkUGFyYW17UmVtYXJrfTsKICAgICAgICAgICAgICAgICAgICAkRGF0YXskV29ya2luZ1VuaXRJRH17U3RhcnRUaW1lfSA9ICRQYXJhbXtTdGFydFRpbWV9OwogICAgICAgICAgICAgICAgICAgICREYXRheyRXb3JraW5nVW5pdElEfXtFbmRUaW1lfSAgID0gJFBhcmFte0VuZFRpbWV9OwogICAgICAgICAgICAgICAgICAgICREYXRheyRXb3JraW5nVW5pdElEfXtEYXRlfSAgICAgID0gJFBhcmFte0RhdGV9OwogICAgICAgICAgICAgICAgICAgIGlmICgkUGFyYW17UGVyaW9kfSA9fiAvXihcZCspLChcZCspLykgewogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXskV29ya2luZ1VuaXRJRH17UGVyaW9kfSAgICA9ICQxIC4gIi4iIC4gJDI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXskV29ya2luZ1VuaXRJRH17UGVyaW9kfSAgICA9ICRQYXJhbXtQZXJpb2R9OwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgbXkgJVJlZHVjZVRpbWUgPSAoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpbWVBY2NvdW50aW5nOjpSZWR1Y2VUaW1lJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJVJlZHVjZVRpbWUgPSAleyRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaW1lQWNjb3VudGluZzo6UmVkdWNlVGltZScpfTsKICAgICAgICAgICAgICAgICAgICB9CiMgICAgICAgICAgICAgICAgICAgIGlmICgkUGFyYW17U3RhcnRUaW1lfSAmJiAkUGFyYW17RW5kVGltZX0gJiYgISRQYXJhbXtQZXJpb2R9KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRQYXJhbXtTdGFydFRpbWV9ICYmICRQYXJhbXtFbmRUaW1lfSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJFBhcmFte1N0YXJ0VGltZX0gPX4gL14oXGQrKTooXGQrKS8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRTdGFydFRpbWUgPSAkMSo2MCArICQyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRQYXJhbXtFbmRUaW1lfSA9fiAvXihcZCspOihcZCspLykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRFbmRUaW1lID0gJDEqNjAgKyAkMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJFJlZHVjZVRpbWV7JEFjdGlvbnskUGFyYW17QWN0aW9uSUR9fXtBY3Rpb259fSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXskV29ya2luZ1VuaXRJRH17UGVyaW9kfSA9ICgkRW5kVGltZSAtICRTdGFydFRpbWUpLzYwICogJFJlZHVjZVRpbWV7JEFjdGlvbnskUGFyYW17QWN0aW9uSUR9fXtBY3Rpb259fSAvIDEwMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyRXb3JraW5nVW5pdElEfXtQZXJpb2R9ID0gKCRFbmRUaW1lIC0gJFN0YXJ0VGltZSkvNjA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkQ2hlY2tib3hDaGVjayA9IDA7CiAgICAgICAgICAgIGZvcmVhY2ggKHF3KExlYXZlRGF5IERpc2Vhc2VkIE92ZXJ0aW1lKSkgewogICAgICAgICAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAkXyk7CiAgICAgICAgICAgICAgICBpZiAoJFBhcmFteyRffSkgewogICAgICAgICAgICAgICAgICAgICRXb3JraW5nVW5pdElEKys7CiAgICAgICAgICAgICAgICAgICAgJERhdGF7JFdvcmtpbmdVbml0SUR9e1Byb2plY3RJRH0gPSAnLTEnOwogICAgICAgICAgICAgICAgICAgICREYXRheyRXb3JraW5nVW5pdElEfXtBY3Rpb25JRH0gID0gJFBhcmFteyRffTsKICAgICAgICAgICAgICAgICAgICAkRGF0YXskV29ya2luZ1VuaXRJRH17UmVtYXJrfSAgICA9ICcnOwogICAgICAgICAgICAgICAgICAgICREYXRheyRXb3JraW5nVW5pdElEfXtTdGFydFRpbWV9ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgJERhdGF7JFdvcmtpbmdVbml0SUR9e0VuZFRpbWV9ICAgPSAnJzsKICAgICAgICAgICAgICAgICAgICAkRGF0YXskV29ya2luZ1VuaXRJRH17UGVyaW9kfSAgICA9ICcnOwogICAgICAgICAgICAgICAgICAgICRDaGVja2JveENoZWNrKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRDaGVja2JveENoZWNrID4gMSkgewogICAgICAgICAgICAgICAgJFBhcmFte1JlcXVpcmVkRGVzY3JpcHRpb259ID0gIllvdSBjYW4gb25seSBzZWxlY3Qgb25lIGNoZWNrYm94IGVsZW1lbnQhIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJERhdGF7WWVhcn0gID0gJFBhcmFte1llYXJ9OwogICAgICAgICAgICAkRGF0YXtNb250aH0gPSAkUGFyYW17TW9udGh9OwogICAgICAgICAgICAkRGF0YXtEYXl9ICAgPSAkUGFyYW17RGF5fTsKICAgICAgICAgICAgaWYgKCEkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+V29ya2luZ1VuaXRzSW5zZXJ0KCVEYXRhKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oTWVzc2FnZSA9PiAnQ2FuXCd0IGluc2VydCBXb3JraW5nIFVuaXRzIScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFBhcmFte1N1Y2Nlc3NmdWxJbnNlcnR9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAjIFNob3cgV29ya2luZyBVbml0cwogICAgICAgICMgZ2V0IGV4aXN0aW5nIHdvcmtpbmcgdW5pdHMKICAgICAgICAlRGF0YSAgICA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Xb3JraW5nVW5pdHNHZXQoCiAgICAgICAgICAgIFllYXIgID0+ICRQYXJhbXtZZWFyfSwKICAgICAgICAgICAgTW9udGggPT4gJFBhcmFte01vbnRofSwKICAgICAgICAgICAgRGF5ICAgPT4gJFBhcmFte0RheX0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaW1lQWNjb3VudGluZzo6SW5wdXRIb3Vyc1dpdGhvdXRTdGFydEVuZFRpbWUnKSkgewogICAgICAgICAgICAkUGFyYW17VGV4dFBvc2l0aW9ufSAgPSAnbGVmdCc7CiAgICAgICAgICAgICRQYXJhbXtQZXJpb2RCbG9ja30gICA9ICdVbml0SW5wdXRQZXJpb2QnOwogICAgICAgICAgICAkRnJvbnRlbmR7Q2xhc3NUaW1lfSAgPSAnZm9vdG5vdGUnOwogICAgICAgICAgICAkRnJvbnRlbmR7UGVyaW9kTm90ZX0gPSAnKic7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdGb290Tm90ZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHslUGFyYW0sICVGcm9udGVuZH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17VGV4dFBvc2l0aW9ufSAgPSAncmlnaHQnOwogICAgICAgICAgICAkUGFyYW17UGVyaW9kQmxvY2t9ICAgPSAnVW5pdFBlcmlvZFdpdGhvdXRJbnB1dCc7CiAgICAgICAgICAgICRGcm9udGVuZHtDbGFzc1RpbWV9ICA9ICdyZXF1aXJlZCc7CiAgICAgICAgICAgICRGcm9udGVuZHtQZXJpb2ROb3RlfSA9ICcnOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgcHJvamVjdCBzZXR0aW5ncwogICAgICAgIG15ICVQcm9qZWN0ID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlByb2plY3RTZXR0aW5nc0dldCgpOwogICAgICAgIGZvcmVhY2ggbXkgJFByb2plY3RJRCAoa2V5cyAleyRQcm9qZWN0e1Byb2plY3R9fSkgewogICAgICAgICAgICBpZiAoJFByb2plY3R7UHJvamVjdFN0YXR1c317JFByb2plY3RJRH0pIHsKICAgICAgICAgICAgICAgICRQcm9qZWN0TGlzdHskUHJvamVjdElEfSA9ICRQcm9qZWN0e1Byb2plY3R9eyRQcm9qZWN0SUR9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRQcm9qZWN0TGlzdHsnJ30gPSAnJzsKCiAgICAgICAgIyBnZXQgYWN0aW9uIHNldHRpbmdzCiAgICAgICAgZm9yZWFjaCBteSAkQWN0aW9uSUQgKGtleXMgJUFjdGlvbikgewogICAgICAgICAgICBpZiAoJEFjdGlvbnskQWN0aW9uSUR9e0FjdGlvblN0YXR1c30pIHsKICAgICAgICAgICAgICAgICRBY3Rpb25MaXN0eyRBY3Rpb25JRH0gPSAkQWN0aW9ueyRBY3Rpb25JRH17QWN0aW9ufTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkQWN0aW9uTGlzdHsnJ30gPSAnJzsKCiAgICAgICAgaWYgKHRpbWUoKSA+IHRpbWVsb2NhbCgxLCAwLCAwICwgJFBhcmFte0RheX0sICRQYXJhbXtNb250aH0gLSAxLCAkUGFyYW17WWVhcn0gLSAxOTAwKSkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVW5pdEJsb2NrJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbSwgJUZyb250ZW5kfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgIyBidWlsZCB1bml0cwogICAgICAgIG15ICRXb3JraW5nVW5pdElETWF4ID0gMTA7CiAgICAgICAgbXkgJFdvcmtpbmdVbml0SUQgICAgPSAwOwogICAgICAgICRQYXJhbXtUb3RhbH0gICAgICAgID0gMDsKICAgICAgICBmb3IgKCRXb3JraW5nVW5pdElEID0gMTsgJFdvcmtpbmdVbml0SUQgPCAkV29ya2luZ1VuaXRJRE1heDsgJFdvcmtpbmdVbml0SUQrKykgewogICAgICAgICAgICBpZiAoJERhdGF7JFdvcmtpbmdVbml0SUR9e1Byb2plY3RJRH0gJiYgJERhdGF7JFdvcmtpbmdVbml0SUR9e1Byb2plY3RJRH0gPT0gLTEpIHsKICAgICAgICAgICAgICAgIGlmICgkRGF0YXskV29ya2luZ1VuaXRJRH17QWN0aW9uSUR9ICAgID09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte0Rpc2Vhc2VkfSA9ICdjaGVja2VkJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICgkRGF0YXskV29ya2luZ1VuaXRJRH17QWN0aW9uSUR9ID09IC0yKSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte0xlYXZlRGF5fSA9ICdjaGVja2VkJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICgkRGF0YXskV29ya2luZ1VuaXRJRH17QWN0aW9uSUR9ID09IC0zKSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte092ZXJ0aW1lfSA9ICdjaGVja2VkJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRXb3JraW5nVW5pdElETWF4Kys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkUGFyYW17SUR9ID0gJFdvcmtpbmdVbml0SUQgOwogICAgICAgICAgICAgICAgIyBnZXQgb3B0aW9uIGZpZWxkcwogICAgICAgICAgICAgICAgJEZyb250ZW5keydBY3Rpb25PcHRpb24nfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJUFjdGlvbkxpc3QsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkRGF0YXskV29ya2luZ1VuaXRJRH17QWN0aW9uSUR9IHx8ICcnLAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gIkFjdGlvbklEWyRXb3JraW5nVW5pdElEXSIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJEZyb250ZW5keydQcm9qZWN0T3B0aW9uJ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVQcm9qZWN0TGlzdCwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEID0+ICREYXRheyRXb3JraW5nVW5pdElEfXtQcm9qZWN0SUR9IHx8ICcnLAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gIlByb2plY3RJRFskV29ya2luZ1VuaXRJRF0iLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkUGFyYW17UmVtYXJrfSAgICA9ICREYXRheyRXb3JraW5nVW5pdElEfXtSZW1hcmt9IHx8ICcnOwogICAgICAgICAgICAgICAgaWYgKCREYXRheyRXb3JraW5nVW5pdElEfXtQcm9qZWN0SUR9ICYmICREYXRheyRXb3JraW5nVW5pdElEfXtBY3Rpb25JRH0pIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJERhdGF7JFdvcmtpbmdVbml0SUR9e1BlcmlvZH0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCREYXRheyRXb3JraW5nVW5pdElEfXtQZXJpb2R9ID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte1BlcmlvZH0gICAgPSAkRGF0YXskV29ya2luZ1VuaXRJRH17UGVyaW9kfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtUb3RhbH0gICAgKz0gJFBhcmFte1BlcmlvZH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17VW5pdFJlcXVpcmVkRGVzY3JpcHRpb259ID0gJ0NhblwndCBzYXZlIHNldHRpbmdzLCBiZWNhdXNlIFN0YXJ0dGltZSBpcyBvbGRlciB0aGFuIEVuZHRpbWUhJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte1BlcmlvZH0gPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte1VuaXRSZXF1aXJlZERlc2NyaXB0aW9ufSA9ICdDYW5cJ3Qgc2F2ZSBzZXR0aW5ncywgYmVjYXVzZSBvZiBtaXNzaW5nIHBlcmlvZCEnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtQZXJpb2R9ICAgID0gJyc7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte1N0YXJ0VGltZX0gPSAnJzsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17RW5kVGltZX0gICA9ICcnOwogICAgICAgICAgICAgICAgfQoKIyAgICAgICAgICAgICAgICBmb3JlYWNoIChxdyhTdGFydCBFbmQpKSB7CiMgICAgICAgICAgICAgICAgICAgIGlmICgkRGF0YXskV29ya2luZ1VuaXRJRH17JF8gLiAiVGltZSJ9ICYmICREYXRheyRXb3JraW5nVW5pdElEfXskXyAuICJUaW1lIn0gZXEgJzAwOjAwOjAwJykgewojICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFteyRfIC4gIkhvdXIifSA9ICcwMCc7CiMgICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17JF8gLiAiTWludXRlIn0gPSAnMDAnOwojICAgICAgICAgICAgICAgICAgICB9CiMgICAgICAgICAgICAgICAgICAgIGVsc2lmICgkRGF0YXskV29ya2luZ1VuaXRJRH17JF8gLiAiVGltZSJ9KSB7CiMgICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17JF8uICJIb3VyIn0gICA9IHN1YnN0cigkRGF0YXskV29ya2luZ1VuaXRJRH17JF99LCAwLCAyKSB8fCAnJzsKIyAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXskXy4gIk1pbnV0ZSJ9ID0gc3Vic3RyKCREYXRheyRXb3JraW5nVW5pdElEfXskX30sIDMsIDIpIHx8ICcnOwojICAgICAgICAgICAgICAgICAgICB9CiMgICAgICAgICAgICAgICAgICAgICRQYXJhbXskXyAuICJUaW1lIn0gPSBCdWlsZFRpbWVTZWxlY3Rpb24oCiMgICAgICAgICAgICAgICAgICAgICAgICBIb3VyICAgPT4gJFBhcmFteyRfLiAiSG91ciJ9LAojICAgICAgICAgICAgICAgICAgICAgICAgTWludXRlID0+ICRQYXJhbXskXy4gIk1pbnV0ZSJ9CiMgICAgICAgICAgICAgICAgICAgICAgICBQcmVmaXggPT4gJF8sCiMgICAgICAgICAgICAgICAgICAgICAgICBGb3JtYXQgPT4gJ1RpbWVJbnB1dEZvcm1hdCcsCiMgICAgICAgICAgICAgICAgICAgICk7CiMgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGZvcmVhY2ggKHF3KFN0YXJ0VGltZSBFbmRUaW1lKSkgewogICAgICAgICAgICAgICAgICAgIGlmICgkRGF0YXskV29ya2luZ1VuaXRJRH17JF99ICYmICREYXRheyRXb3JraW5nVW5pdElEfXskX30gZXEgJzAwOjAwJykgewogICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17JF99ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17JF99ID0gJERhdGF7JFdvcmtpbmdVbml0SUR9eyRffTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdVbml0JywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHslUGFyYW0sICVGcm9udGVuZH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkUGFyYW17UGVyaW9kQmxvY2t9LAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbSwgJUZyb250ZW5kfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBWYWxpZGl0eSBjaGVja3Mgc3RhcnQKICAgICAgICAgICAgICAgIGlmICgkRGF0YXskV29ya2luZ1VuaXRJRH17UHJvamVjdElEfSAmJiAkRGF0YXskV29ya2luZ1VuaXRJRH17QWN0aW9uSUR9ICYmICRQYXJhbXtEaXNlYXNlZH0pIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17UmVhZE9ubHlEZXNjcmlwdGlvbn0gPSAnQXJlIHlvdSBzdXJlLCB0aGF0IHlvdSB3b3JrZWQgd2hpbGUgeW91IGFyZSBEaXNlYXNlZD8nOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCREYXRheyRXb3JraW5nVW5pdElEfXtQcm9qZWN0SUR9ICYmICREYXRheyRXb3JraW5nVW5pdElEfXtBY3Rpb25JRH0gJiYgJFBhcmFte0xlYXZlRGF5fSkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtSZWFkT25seURlc2NyaXB0aW9ufSA9ICdBcmUgeW91IHN1cmUsIHRoYXQgeW91IHdvcmtlZCB3aGlsZSB5b3UgaGF2ZSBhIGxlYXZlIGRheT8nOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCREYXRheyRXb3JraW5nVW5pdElEfXtQcm9qZWN0SUR9ICYmICREYXRheyRXb3JraW5nVW5pdElEfXtBY3Rpb25JRH0gJiYgJFBhcmFte092ZXJ0aW1lfSkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtSZWFkT25seURlc2NyaXB0aW9ufSA9ICdBcmUgeW91IHN1cmUsIHRoYXQgeW91IHdvcmtlZCB3aGlsZSB5b3UgaGF2ZSBvdmVydGltZT8nOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCREYXRheyRXb3JraW5nVW5pdElEfXtQcm9qZWN0SUR9ICYmICEkRGF0YXskV29ya2luZ1VuaXRJRH17QWN0aW9uSUR9KSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte1VuaXRSZXF1aXJlZERlc2NyaXB0aW9ufSA9ICdDYW5cJ3Qgc2F2ZSBzZXR0aW5ncywgYmVjYXVzZSBvZiBtaXNzaW5nIEFjdGlvbiEnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCEkRGF0YXskV29ya2luZ1VuaXRJRH17UHJvamVjdElEfSAmJiAkRGF0YXskV29ya2luZ1VuaXRJRH17QWN0aW9uSUR9KSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte1VuaXRSZXF1aXJlZERlc2NyaXB0aW9ufSA9ICdDYW5cJ3Qgc2F2ZSBzZXR0aW5ncywgYmVjYXVzZSBvZiBtaXNzaW5nIFByb2plY3QhJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgkRGF0YXskV29ya2luZ1VuaXRJRH17U3RhcnRUaW1lfSAmJiAkRGF0YXskV29ya2luZ1VuaXRJRH17U3RhcnRUaW1lfSBuZSAnMDA6MDAnICYmCiAgICAgICAgICAgICAgICAgICAgJERhdGF7JFdvcmtpbmdVbml0SUR9e0VuZFRpbWV9ICYmICREYXRheyRXb3JraW5nVW5pdElEfXtFbmRUaW1lfSAgbmUgJzAwOjAwJwogICAgICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCREYXRheyRXb3JraW5nVW5pdElEfXtTdGFydFRpbWV9ID1+IC9eKFxkKyk6KFxkKykvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRTdGFydFRpbWUgPSAkMSo2MCArICQyOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJERhdGF7JFdvcmtpbmdVbml0SUR9e0VuZFRpbWV9ID1+IC9eKFxkKyk6KFxkKykvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkRW5kVGltZSA9ICQxKjYwICsgJDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJERhdGF7JFdvcmtpbmdVbml0SUR9e1BlcmlvZH0gPiAoJEVuZFRpbWUgLSAkU3RhcnRUaW1lKS82MCArIDAuMDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17VW5pdFJlcXVpcmVkRGVzY3JpcHRpb259ID0gJ0NhblwndCBzYXZlIHNldHRpbmdzLCBiZWNhdXNlIHRoZSBQZXJpb2QgaXMgYmlnZ2VyJyAuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgdGhhbiB0aGUgaW50ZXJ2YWwgYmV0d2VlbiBTdGFydHRpbWUgYW5kIEVuZHRpbWUhJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkRW5kVGltZSA+IDYwICogMjQgfHwgJFN0YXJ0VGltZSA+IDYwICogMjQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17VW5pdFJlcXVpcmVkRGVzY3JpcHRpb259ID0gJ0NhblwndCBzYXZlIHNldHRpbmdzLCBiZWNhdXNlIGEgZGF5IGhhcyBvbmx5IDI0IGhvdXJzISc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCRQYXJhbXtVbml0UmVxdWlyZWREZXNjcmlwdGlvbn0pewogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1VuaXRSZXF1aXJlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4ge0Rlc2NyaXB0aW9uID0+ICRQYXJhbXtVbml0UmVxdWlyZWREZXNjcmlwdGlvbn19LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+V29ya2luZ1VuaXRzRGVsZXRlKAogICAgICAgICAgICAgICAgICAgICAgICBZZWFyICA9PiAkUGFyYW17WWVhcn0sCiAgICAgICAgICAgICAgICAgICAgICAgIE1vbnRoID0+ICRQYXJhbXtNb250aH0sCiAgICAgICAgICAgICAgICAgICAgICAgIERheSAgID0+ICRQYXJhbXtEYXl9LAogICAgICAgICAgICAgICAgICAgICkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oTWVzc2FnZSA9PiAnQ2FuXCd0IGRlbGV0ZSBXb3JraW5nIFVuaXRzIScpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkUGFyYW17VW5pdFJlcXVpcmVkRGVzY3JpcHRpb259ICAgICA9ICcnOwogICAgICAgICAgICAgICAgICAgICRQYXJhbXtVbml0UmVxdWlyZWREZXNjcmlwdGlvblRydWV9ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgkUGFyYW17VW5pdFJlYWRPbmx5RGVzY3JpcHRpb259KXsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdVbml0UmVhZG9ubHknLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHtEZXNjcmlwdGlvbiA9PiAkUGFyYW17VW5pdFJlYWRPbmx5RGVzY3JpcHRpb259fSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICRQYXJhbXtVbml0UmVhZE9ubHlEZXNjcmlwdGlvbn0gPSAnJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICMgVmFsaWRpdHkgY2hlY2tzIGVuZAogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpID4gdGltZWxvY2FsKDEsIDAsIDAgLCAkUGFyYW17RGF5fSwgJFBhcmFte01vbnRofSAtIDEsICRQYXJhbXtZZWFyfSAtIDE5MDApKSB7CiAgICAgICAgICAgICRQYXJhbXtUb3RhbH0gICAgICAgICAgID0gc3ByaW50ZiAoIiUuMmYiLCAkUGFyYW17VG90YWx9KTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RvdGFsJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbSwgJUZyb250ZW5kfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgIyB2YWxpZGl0eSBjaGVja3Mgc3RhcnQKICAgICAgICBpZiAoJFBhcmFte1RvdGFsfSAmJiAkUGFyYW17VG90YWx9ID4gMjQpIHsKICAgICAgICAgICAgJFBhcmFte1JlcXVpcmVkRGVzY3JpcHRpb259ID0gJ0NhblwndCBzYXZlIHNldHRpbmdzLCBiZWNhdXNlIG9mIG1vcmUgdGhhbiAyNCB3b3JraW5nIGhvdXJzISc7CiAgICAgICAgfQogICAgICAgIGVsc2lmICgkUGFyYW17VG90YWx9ICYmICRQYXJhbXtUb3RhbH0gPiAxNikgewogICAgICAgICAgICAkUGFyYW17UmVhZE9ubHlEZXNjcmlwdGlvbn0gPSAnQXJlIHlvdSBzdXJlLCB0aGF0IHlvdSB3b3JrZWQgbW9yZSB0aGFuIDE2IGhvdXJzPyc7CiAgICAgICAgfQogICAgICAgIGlmICgkUGFyYW17UmVxdWlyZWREZXNjcmlwdGlvbn0pewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUmVxdWlyZWQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7RGVzY3JpcHRpb24gPT4gJFBhcmFte1JlcXVpcmVkRGVzY3JpcHRpb259fSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCEkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+V29ya2luZ1VuaXRzRGVsZXRlKAogICAgICAgICAgICAgICAgWWVhciAgPT4gJFBhcmFte1llYXJ9LAogICAgICAgICAgICAgICAgTW9udGggPT4gJFBhcmFte01vbnRofSwKICAgICAgICAgICAgICAgIERheSAgID0+ICRQYXJhbXtEYXl9LAogICAgICAgICAgICApKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbihNZXNzYWdlID0+ICdDYW5cJ3QgZGVsZXRlIFdvcmtpbmcgVW5pdHMhJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCRQYXJhbXtSZWFkT25seURlc2NyaXB0aW9ufSl7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdSZWFkb25seScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHtEZXNjcmlwdGlvbiA9PiAkUGFyYW17UmVhZE9ubHlEZXNjcmlwdGlvbn19LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyB2YWxpZGl0eSBjaGVja3MgZW5kCgogICAgICAgICRQYXJhbXtEYXRlfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGREYXRlU2VsZWN0aW9uKAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIFByZWZpeCA9PiAnJywKICAgICAgICAgICAgRm9ybWF0ID0+ICdEYXRlSW5wdXRGb3JtYXQnLAogICAgICAgICk7CgogICAgICAgIGlmICh0aW1lbG9jYWwoMSwgMCwgMCAsICRQYXJhbXtEYXl9LCAkUGFyYW17TW9udGh9IC0gMSwgJFBhcmFte1llYXJ9IC0gMTkwMCkgPAogICAgICAgICAgICB0aW1lbG9jYWwoMSwgMCwgMCAsICRQYXJhbXtEYXlBbGxvd2VkfSwgJFBhcmFte01vbnRoQWxsb3dlZH0gLSAxLCAkUGFyYW17WWVhckFsbG93ZWR9IC0gMTkwMCkKICAgICAgICApIHsKICAgICAgICAgICAgaWYgKCRJbmNvbXBsZXRlV29ya2luZ0RheXN7SW5jb21wbGV0ZX17JFBhcmFte1llYXJ9fXskUGFyYW17TW9udGh9fXskUGFyYW17RGF5fX0gJiYgISRQYXJhbXtTdWNjZXNzZnVsSW5zZXJ0fSkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdSZXF1aXJlZCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7RGVzY3JpcHRpb24gPT4gJ1RoaXMgRGF0ZSBpcyBvdXQgb2YgbGltaXQsIGJ1dCB5b3UgaGF2ZW5cJ3QgaW5zZXJ0IHRoaXMgZGF5IHlldCwgc28geW91IGdldCBvbmUoISkgY2hhbmNlIHRvIGluc2VydCd9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZm9yZWFjaCBteSAkWWVhcklEIChzb3J0IGtleXMgJXskSW5jb21wbGV0ZVdvcmtpbmdEYXlze0luY29tcGxldGV9fSkgewogICAgICAgICAgICBmb3JlYWNoIG15ICRNb250aElEIChzb3J0IGtleXMgJXskSW5jb21wbGV0ZVdvcmtpbmdEYXlze0luY29tcGxldGV9eyRZZWFySUR9fSkgewogICAgICAgICAgICAgICAgZm9yZWFjaCBteSAkRGF5SUQgKHNvcnQga2V5cyAleyRJbmNvbXBsZXRlV29ya2luZ0RheXN7SW5jb21wbGV0ZX17JFllYXJJRH17JE1vbnRoSUR9fSkgewogICAgICAgICAgICAgICAgICAgIGlmICghJFBhcmFte0luY29tcGxldGV9KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdJbmNvbXBsZXRlVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG15ICRCb2xkU3RhcnQgPSAnJzsKICAgICAgICAgICAgICAgICAgICBteSAkQm9sZEVuZCAgID0gJyc7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRZZWFySUQgZXEgJFBhcmFte1llYXJ9CiAgICAgICAgICAgICAgICAgICAgICAgICYmICRNb250aElEIGVxICRQYXJhbXtNb250aH0KICAgICAgICAgICAgICAgICAgICAgICAgJiYgJERheUlEIGVxICRQYXJhbXtEYXl9CiAgICAgICAgICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRCb2xkU3RhcnQgPSAnPGI+JzsKICAgICAgICAgICAgICAgICAgICAgICAgJEJvbGRFbmQgICA9ICc8L2I+JzsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0luY29tcGxldGVXb3JraW5nRGF5cycsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgWWVhciAgICAgID0+ICRZZWFySUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb250aCAgICAgPT4gJE1vbnRoSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXkgICAgICAgPT4gJERheUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9sZFN0YXJ0ID0+ICRCb2xkU3RhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb2xkRW5kICAgPT4gJEJvbGRFbmQsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17SW5jb21wbGV0ZX0gPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAkVmFjYXRpb25DaGVjayA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5WYWNhdGlvbkNoZWNrKAogICAgICAgICAgICBZZWFyICA9PiAkUGFyYW17WWVhcn0sCiAgICAgICAgICAgIE1vbnRoID0+ICRQYXJhbXtNb250aH0sCiAgICAgICAgICAgIERheSAgID0+ICRQYXJhbXtEYXl9LAogICAgICAgICk7CgogICAgICAgICRQYXJhbXtXZWVrZGF5fSAgID0gRGF5X29mX1dlZWsoJFBhcmFte1llYXJ9LCAkUGFyYW17TW9udGh9LCAkUGFyYW17RGF5fSk7CiAgICAgICAgaWYgKCRQYXJhbXtXZWVrZGF5fSAhPSA2ICYmICRQYXJhbXtXZWVrZGF5fSAhPSA3ICYmICEkVmFjYXRpb25DaGVjaykgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnT3RoZXJUaW1lcycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHslUGFyYW0sICVGcm9udGVuZH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkUGFyYW17V2Vla2RheV90b19UZXh0fSA9ICRXZWVrZGF5QXJyYXlbJFBhcmFte1dlZWtkYXl9IC0gMV07CgogICAgICAgICMgYnVpbGQgb3V0cHV0CiAgICAgICAgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKFRpdGxlID0+ICJFZGl0Iik7CiAgICAgICAgaWYgKCEkSW5jb21wbGV0ZVdvcmtpbmdEYXlze0VuZm9yY2VJbnNlcnR9KSB7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHslUGFyYW0sICVGcm9udGVuZH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICMgc2hvdyBjcmVhdGUgcHJvamVjdCBsaW5rLCBpZiBhbGxvd2VkCiAgICAgICAgICAgIG15ICVVc2VyQmFzaWNzID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlVzZXJHZXQoKTsKICAgICAgICAgICAgaWYgKCRVc2VyQmFzaWNzeyRTZWxmLT57VXNlcklEfX17Q3JlYXRlUHJvamVjdH0pIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQ3JlYXRlUHJvamVjdCcsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghJFBhcmFte1JlcXVpcmVkRGVzY3JpcHRpb259ICYmICEkUGFyYW17VW5pdFJlcXVpcmVkRGVzY3JpcHRpb25UcnVlfSAmJiAkUGFyYW17U3VjY2Vzc2Z1bEluc2VydH0pIHsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vdGlmeSgKICAgICAgICAgICAgICAgIEluZm8gPT4gJ1N1Y2Nlc3NmdWwgaW5zZXJ0IScsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7JVBhcmFtLCAlRnJvbnRlbmR9LAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGltZUFjY291bnRpbmdFZGl0JwogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHZpZXcgb2xkZXIgZGF5IGluc3RlcnRzCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVmlldycpIHsKICAgICAgICAjIHBlcm1pc3Npb24gY2hlY2sKICAgICAgICBpZiAoISRTZWxmLT57QWNjZXNzUm99KSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbihXaXRoSGVhZGVyID0+ICd5ZXMnKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgIGZvcmVhY2ggKHF3KERheSBNb250aCBZZWFyIFVzZXJJRCkpIHsKICAgICAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAkXyk7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIG5lZWRlZCBwYXJhbXMKICAgICAgICBmb3JlYWNoIChxdyhEYXkgTW9udGggWWVhcikpIHsKICAgICAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICJWaWV3OiBOZWVkICRfIgogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBpZiBubyBVc2VySUQgcG9zdGVkIHVzZSB0aGUgY3VycmVudCB1c2VyCiAgICAgICAgaWYgKCEkUGFyYW17VXNlcklEfSkgewogICAgICAgICAgICAkUGFyYW17VXNlcklEfSA9ICRTZWxmLT57VXNlcklEfTsKICAgICAgICB9CgogICAgICAgICMgc2hvdyB0aGUgbmFtaW5nIG9mIHRoZSBhZ2VudCB3aGljaCB0aW1lIGFjY291bnRpbmcgaXMgdmlzaXRlZAogICAgICAgIGlmICgkUGFyYW17VXNlcklEfSAhPSAkU2VsZi0+e1VzZXJJRH0pIHsKICAgICAgICAgICAgbXkgJVNob3duVXNlcnMgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyTGlzdChUeXBlID0+ICdMb25nJywgVmFsaWQgPT4gMSk7CiAgICAgICAgICAgICRQYXJhbXtVc2VyfSAgID0gJFNob3duVXNlcnN7JFBhcmFte1VzZXJJRH19OwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVXNlcicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJFBhcmFte1dlZWtkYXl9ICAgICAgICAgPSBEYXlfb2ZfV2VlaygkUGFyYW17WWVhcn0sICRQYXJhbXtNb250aH0sICRQYXJhbXtEYXl9KTsKICAgICAgICAkUGFyYW17V2Vla2RheV90b19UZXh0fSA9ICRXZWVrZGF5QXJyYXlbJFBhcmFte1dlZWtkYXl9IC0gMV07CiAgICAgICAgJFBhcmFte01vbnRoX3RvX1RleHR9ICAgPSAkTW9udGhBcnJheVskUGFyYW17TW9udGh9XTsKICAgICAgICAjIFZhbHVlcyBmb3IgdGhlIGxpbmsgaWNvbnMgPD4KICAgICAgICAoJFBhcmFte1llYXJCYWNrfSwgJFBhcmFte01vbnRoQmFja30sICRQYXJhbXtEYXlCYWNrfSkgPSBBZGRfRGVsdGFfWU1EKCRQYXJhbXtZZWFyfSwgJFBhcmFte01vbnRofSwgJFBhcmFte0RheX0sIDAsIDAsIC0xKTsKICAgICAgICAoJFBhcmFte1llYXJOZXh0fSwgJFBhcmFte01vbnRoTmV4dH0sICRQYXJhbXtEYXlOZXh0fSkgPSBBZGRfRGVsdGFfWU1EKCRQYXJhbXtZZWFyfSwgJFBhcmFte01vbnRofSwgJFBhcmFte0RheX0sIDAsIDAsIDEpOwoKICAgICAgICAkUGFyYW17RGF0ZVNlbGVjdGlvbn0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBQcmVmaXggPT4gJycsCiAgICAgICAgICAgIEZvcm1hdCA9PiAnRGF0ZUlucHV0Rm9ybWF0JywKICAgICAgICApOwoKICAgICMgU2hvdyBXb3JraW5nIFVuaXRzCiAgICAgICAgIyBnZXQgZXhpc3Rpbmcgd29ya2luZyB1bml0cwogICAgICAgIG15ICVEYXRhICAgID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPldvcmtpbmdVbml0c0dldCgKICAgICAgICAgICAgWWVhciAgID0+ICRQYXJhbXtZZWFyfSwKICAgICAgICAgICAgTW9udGggID0+ICRQYXJhbXtNb250aH0sCiAgICAgICAgICAgIERheSAgICA9PiAkUGFyYW17RGF5fSwKICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICRQYXJhbXtEYXRlfSA9IHNwcmludGYoIiUwNGQtJTAyZC0lMDJkIiwgJFBhcmFte1llYXJ9LCAkUGFyYW17TW9udGh9LCAkUGFyYW17RGF5fSk7CgogICAgICAgICMgZ2V0IHByb2plY3QgYW5kIGFjdGlvbiBzZXR0aW5ncwogICAgICAgIG15ICVQcm9qZWN0ID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlByb2plY3RTZXR0aW5nc0dldCgpOwogICAgICAgIG15ICVBY3Rpb24gID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPkFjdGlvblNldHRpbmdzR2V0KCk7CiAgICAgICAgbXkgJEZsYWcgPSAwOwoKICAgICAgICBmb3JlYWNoIG15ICRJRCAoa2V5cyAlRGF0YSkgewogICAgICAgICAgICBpZiAoJERhdGF7JElEfXtQcm9qZWN0SUR9ICYmICREYXRheyRJRH17UHJvamVjdElEfSA9PSAtMSkgewogICAgICAgICAgICAgICAgaWYgKCREYXRheyRJRH17QWN0aW9uSUR9ICAgID09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte0Rpc2Vhc2VkfSA9ICdjaGVja2VkJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICgkRGF0YXskSUR9e0FjdGlvbklEfSA9PSAtMikgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtMZWF2ZURheX0gPSAnY2hlY2tlZCc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoJERhdGF7JElEfXtBY3Rpb25JRH0gPT0gLTMpIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17T3ZlcnRpbWV9ID0gJ2NoZWNrZWQnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgaWYgKCEkRmxhZykgewogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1VuaXRCbG9jaycsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1VuaXQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0ICAgPT4gJFByb2plY3R7UHJvamVjdH17JERhdGF7JElEfXtQcm9qZWN0SUR9fSwKICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgID0+ICRBY3Rpb24geyREYXRheyRJRH17QWN0aW9uSUR9fXtBY3Rpb259LAogICAgICAgICAgICAgICAgICAgICAgICBSZW1hcmsgICAgPT4gJERhdGF7JElEfXtSZW1hcmt9LAogICAgICAgICAgICAgICAgICAgICAgICBTdGFydFRpbWUgPT4gJERhdGF7JElEfXtTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgICAgICAgICBFbmRUaW1lICAgPT4gJERhdGF7JElEfXtFbmRUaW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgUGVyaW9kICAgID0+ICREYXRheyRJRH17UGVyaW9kfSwKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJEZsYWcgPSAxOwogICAgICAgICAgICAgICAgJFBhcmFte1RvdGFsfSArPSAkRGF0YXskSUR9e1BlcmlvZH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCRGbGFnKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUb3RhbCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHtUb3RhbCA9PiBzcHJpbnRmICgiJS4yZiIsICRQYXJhbXtUb3RhbH0pfQogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBpZiAoJFBhcmFte0Rpc2Vhc2VkfSB8fCAkUGFyYW17TGVhdmVEYXl9IHx8ICRQYXJhbXtPdmVydGltZX0pIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ090aGVyVGltZXMnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgRGlzZWFzZWQgPT4gJFBhcmFte0Rpc2Vhc2VkfSwKICAgICAgICAgICAgICAgICAgICBMZWF2ZURheSA9PiAkUGFyYW17TGVhdmVEYXl9LAogICAgICAgICAgICAgICAgICAgIE92ZXJ0aW1lID0+ICRQYXJhbXtPdmVydGltZX0sCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkVmFjYXRpb24gPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+VmFjYXRpb25DaGVjaygKICAgICAgICAgICAgWWVhciAgPT4gJFBhcmFte1llYXJ9LAogICAgICAgICAgICBNb250aCA9PiAkUGFyYW17TW9udGh9LAogICAgICAgICAgICBEYXkgICA9PiAkUGFyYW17RGF5fSwKICAgICAgICApOwoKICAgICAgICBpZiAoJFZhY2F0aW9uKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdWYWNhdGlvbicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHtWYWNhdGlvbiA9PiAkVmFjYXRpb259LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBwcmVzZW50YXRpb24KICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoVGl0bGUgPT4gIlZpZXciKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGltZUFjY291bnRpbmdWaWV3JwogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGRlbGV0ZSBvYmplY3QgZnJvbSBkYXRhYmFzZQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0RlbGV0ZScpIHsKICAgICAgICBmb3JlYWNoIChxdyhEYXkgTW9udGggWWVhcikpIHsKICAgICAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAkXyk7CiAgICAgICAgfQoKICAgICAgICBpZiAoISRTZWxmLT57QWNjZXNzUm99KSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbihXaXRoSGVhZGVyID0+ICd5ZXMnKTsKICAgICAgICB9CgogICAgICAgIGlmICghJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPldvcmtpbmdVbml0c0RlbGV0ZSgKICAgICAgICAgICAgWWVhciAgPT4gJFBhcmFte1llYXJ9LAogICAgICAgICAgICBNb250aCA9PiAkUGFyYW17TW9udGh9LAogICAgICAgICAgICBEYXkgICA9PiAkUGFyYW17RGF5fSwKICAgICAgICApKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259JlN1YmFjdGlvbj1FZGl0JlllYXI9JFBhcmFte1llYXJ9Jk1vbnRoPSRQYXJhbXtNb250aH0mRGF5PSRQYXJhbXtEYXl9Iik7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgb3ZlcnZpZXcgYWJvdXQgdGhlIHVzZXJzIHRpbWUgYWNjb3VudGluZwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ092ZXJ2aWV3JykgewogICAgICAgIG15ICRPdXRwdXQgICA9ICcnOwogICAgICAgIG15ICVGcm9udGVuZCA9ICgpOwogICAgICAgIG15ICgkU2VjLCAkTWluLCAkSG91ciwgJEN1cnJlbnREYXksICRNb250aCwgJFllYXIpID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZTJEYXRlKAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKSwKICAgICAgICApOwoKICAgICAgICAjIHBlcm1pc3Npb24gY2hlY2sKICAgICAgICBpZiAoISRTZWxmLT57QWNjZXNzUm99KSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbihXaXRoSGVhZGVyID0+ICd5ZXMnKTsKICAgICAgICB9CgogICAgICAgIGZvcmVhY2ggKHF3KFN0YXR1cyBEYXkgTW9udGggWWVhciBVc2VySUQgUHJvamVjdFN0YXR1c1Nob3cpKSB7CiAgICAgICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJF8pOwogICAgICAgIH0KICAgICAgICAkUGFyYW17U3ViYWN0aW9ufSA9ICdFZGl0JzsKCiAgICAgICAgaWYgKCEkUGFyYW17VXNlcklEfSkgewogICAgICAgICAgICAkUGFyYW17VXNlcklEfSA9ICRTZWxmLT57VXNlcklEfTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGlmICgkUGFyYW17VXNlcklEfSAhPSAkU2VsZi0+e1VzZXJJRH0gJiYgISRTZWxmLT57QWNjZXNzUnd9KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oV2l0aEhlYWRlciA9PiAneWVzJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFBhcmFte1N1YmFjdGlvbn0gPSAnVmlldyc7CiAgICAgICAgfQoKICAgICAgICBpZiAoJFBhcmFte1VzZXJJRH0gIT0gJFNlbGYtPntVc2VySUR9KSB7CiAgICAgICAgICAgIG15ICVTaG93blVzZXJzID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckxpc3QoVHlwZSA9PiAnTG9uZycsIFZhbGlkID0+IDEpOwogICAgICAgICAgICAkUGFyYW17VXNlcn0gICA9ICRTaG93blVzZXJzeyRQYXJhbXtVc2VySUR9fTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1VzZXInLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgQ2hlY2sgRGF0ZQogICAgICAgIGlmICghJFBhcmFte1llYXJ9IHx8ICEkUGFyYW17TW9udGh9KSB7CiAgICAgICAgICAgICRQYXJhbXtZZWFyfSAgPSAkWWVhcjsKICAgICAgICAgICAgJFBhcmFte01vbnRofSA9ICRNb250aDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXtNb250aH0gPSBzcHJpbnRmKCIlMDJkIiwgJFBhcmFte01vbnRofSk7CiAgICAgICAgfQoKICAgICAgICAjIHN0b3JlIGxhc3Qgc2NyZWVuCiAgICAgICAgJFNlbGYtPntTZXNzaW9uT2JqZWN0fS0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgICAgICBLZXkgICAgICAgPT4gJ0xhc3RTY3JlZW4nLAogICAgICAgICAgICBWYWx1ZSAgICAgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mU3ViYWN0aW9uPU92ZXJ2aWV3JlllYXI9JFBhcmFte1llYXJ9Jk1vbnRoPSRQYXJhbXtNb250aH0iLAogICAgICAgICk7CgogICAgICAgICRQYXJhbXtNb250aF90b19UZXh0fSAgID0gJE1vbnRoQXJyYXlbJFBhcmFte01vbnRofV07CgogICAgICAgICgkUGFyYW17WWVhckJhY2t9LCAkUGFyYW17TW9udGhCYWNrfSwgJFBhcmFte0RheUJhY2t9KSA9IEFkZF9EZWx0YV9ZTUQoJFBhcmFte1llYXJ9LCAkUGFyYW17TW9udGh9LCAxLCAwLCAtMSwgMCk7CiAgICAgICAgKCRQYXJhbXtZZWFyTmV4dH0sICRQYXJhbXtNb250aE5leHR9LCAkUGFyYW17RGF5TmV4dH0pID0gQWRkX0RlbHRhX1lNRCgkUGFyYW17WWVhcn0sICRQYXJhbXtNb250aH0sIDEsIDAsIDEsIDApOwoKICAgICAgICAjIE92ZXJ2aWV3IHBlciBkYXkKICAgICAgICBteSAkRGF5c09mTW9udGggICAgICAgICAgICAgPSBEYXlzX2luX01vbnRoKCRQYXJhbXtZZWFyfSwgICRQYXJhbXtNb250aH0pOwoKICAgICAgICBmb3IgKG15ICREYXkgPSAxOyAkRGF5IDw9ICREYXlzT2ZNb250aDsgJERheSsrKSB7CiAgICAgICAgICAgICRQYXJhbXtEYXl9ICAgICA9IHNwcmludGYoIiUwMmQiLCAkRGF5KTsKICAgICAgICAgICAgJFBhcmFte1dlZWtkYXl9ID0gRGF5X29mX1dlZWsoJFBhcmFte1llYXJ9LCAkUGFyYW17TW9udGh9LCAkRGF5KS0xOwogICAgICAgICAgICBteSAkVmFjYXRpb25DaGVjayA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5WYWNhdGlvbkNoZWNrKAogICAgICAgICAgICAgICAgWWVhciAgPT4gJFBhcmFte1llYXJ9LAogICAgICAgICAgICAgICAgTW9udGggPT4gJFBhcmFte01vbnRofSwKICAgICAgICAgICAgICAgIERheSAgID0+ICREYXksCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJFBhcmFte1llYXJ9IGVxICRZZWFyICYmICRQYXJhbXtNb250aH0gZXEgJE1vbnRoICYmICRDdXJyZW50RGF5IGVxICREYXkpewogICAgICAgICAgICAgICAgJFBhcmFte1N0eWxlfSA9ICdiZ2NvbG9yPSJvcmFuZ2UiJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoJFZhY2F0aW9uQ2hlY2spIHsKICAgICAgICAgICAgICAgICRQYXJhbXtTdHlsZX0gICA9ICdiZ2NvbG9yPSIjRUJDQ0NDIic7CiAgICAgICAgICAgICAgICAkUGFyYW17Q29tbWVudH0gPSAkVmFjYXRpb25DaGVjazsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoJFBhcmFte1dlZWtkYXl9ID09IDYgfHwgJFBhcmFte1dlZWtkYXl9ID09IDUpIHsKICAgICAgICAgICAgICAgICRQYXJhbXtTdHlsZX0gPSAnYmdjb2xvcj0iI0ZGRTBFMCInOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFBhcmFte1N0eWxlfSA9ICdiZ2NvbG9yPSIjRTVGMEZGIic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICVEYXRhID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPldvcmtpbmdVbml0c0dldCgKICAgICAgICAgICAgICAgIFllYXIgICA9PiAkUGFyYW17WWVhcn0sCiAgICAgICAgICAgICAgICBNb250aCAgPT4gJFBhcmFte01vbnRofSwKICAgICAgICAgICAgICAgIERheSAgICA9PiAkUGFyYW17RGF5fSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICRXb3JraW5nSG91cnMgPSAwOwogICAgICAgICAgICBteSAlT3RoZXJUaW1lICAgID0gKCk7CiAgICAgICAgICAgICRPdGhlclRpbWV7Jy0xJ30gPSAnRGlzZWFzZWQnOwogICAgICAgICAgICAkT3RoZXJUaW1leyctMid9ID0gJ0xlYXZlRGF5JzsKICAgICAgICAgICAgJE90aGVyVGltZXsnLTMnfSA9ICdPdmVydGltZSc7CgogICAgICAgICAgICBmb3JlYWNoIG15ICRJRCAoa2V5cyAlRGF0YSkgewogICAgICAgICAgICAgICAgJFdvcmtpbmdIb3VycyArPSAkRGF0YXskSUR9e1BlcmlvZH07CiAgICAgICAgICAgICAgICBpZiAoJERhdGF7JElEfXtQcm9qZWN0SUR9ID09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte0NvbW1lbnR9ID0gJE90aGVyVGltZXskRGF0YXskSUR9e0FjdGlvbklEfX07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRXb3JraW5nSG91cnMpIHsKICAgICAgICAgICAgICAgICRQYXJhbXtXb3JraW5nSG91cnN9ID0gc3ByaW50ZiAoIiUuMmYiLCAkV29ya2luZ0hvdXJzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRQYXJhbXtXb3JraW5nSG91cnN9ID0gJyc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRQYXJhbXtXZWVrZGF5X3RvX1RleHR9ID0gJFdlZWtkYXlBcnJheVskUGFyYW17V2Vla2RheX1dOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUm93JywKICAgICAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRQYXJhbXtDb21tZW50fSA9ICcnOwogICAgICAgIH0KCiAgICAgICAgbXkgJVVzZXJSZXBvcnQgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+VXNlclJlcG9ydGluZygKICAgICAgICAgICAgWWVhciAgPT4gJFBhcmFte1llYXJ9LAogICAgICAgICAgICBNb250aCA9PiAkUGFyYW17TW9udGh9LAogICAgICAgICk7CgogICAgICAgIGZvcmVhY2ggKHF3KFRhcmdldFN0YXRlIFRhcmdldFN0YXRlVG90YWwgV29ya2luZ0hvdXJzVG90YWwgV29ya2luZ0hvdXJzCiAgICAgICAgICAgIE92ZXJ0aW1lIE92ZXJ0aW1lVG90YWwgT3ZlcnRpbWVVbnRpbCBMZWF2ZURheSBMZWF2ZURheVRvdGFsCiAgICAgICAgICAgIExlYXZlRGF5UmVtYWluaW5nIERpc2Vhc2VkIERpc2Vhc2VkVG90YWwgRGlzZWFzZWRSZW1haW5pbmcpCiAgICAgICAgKSB7CiAgICAgICAgICAgIGlmICghJFVzZXJSZXBvcnR7JFBhcmFte1VzZXJJRH19eyRffSkgewogICAgICAgICAgICAgICAgJFVzZXJSZXBvcnR7JFBhcmFte1VzZXJJRH19eyRffSA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFBhcmFteyRffSA9IHNwcmludGYgKCIlLjJmIiwgJFVzZXJSZXBvcnR7JFBhcmFte1VzZXJJRH19eyRffSk7CiAgICAgICAgfQoKICAgICAgICAjIFNob3cgT3ZlcnRpbWUgaWYgYWxsb3dlZAogICAgICAgIG15ICVVc2VyQmFzaWNzID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlVzZXJHZXQoKTsKICAgICAgICBpZiAoJFVzZXJCYXNpY3N7JFBhcmFte1VzZXJJRH19e1Nob3dPdmVydGltZX0pIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ0aW1lJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbSwgJUZyb250ZW5kfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgT3ZlcnZpZXcgcGVyIHByb2plY3QgYW5kIGFjdGlvbgogICAgICAgIG15ICVQcm9qZWN0RGF0YSA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Qcm9qZWN0QWN0aW9uUmVwb3J0aW5nKAogICAgICAgICAgICBZZWFyICAgPT4gJFBhcmFte1llYXJ9LAogICAgICAgICAgICBNb250aCAgPT4gJFBhcmFte01vbnRofSwKICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgc2hvdyB0aGUgcmVwb3J0IHNvcnQgYnkgcHJvamVjdHMKICAgICAgICBpZiAoISRQYXJhbXtQcm9qZWN0U3RhdHVzU2hvd30gfHwgJFBhcmFte1Byb2plY3RTdGF0dXNTaG93fSBlcSAndmFsaWQnKSB7CiAgICAgICAgICAgICRQYXJhbXtQcm9qZWN0U3RhdHVzU2hvd30gPSAnYWxsJzsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCRQYXJhbXtQcm9qZWN0U3RhdHVzU2hvd30gZXEgJ2FsbCcpIHsKICAgICAgICAgICAgJFBhcmFte1Byb2plY3RTdGF0dXNTaG93fSA9ICd2YWxpZCc7CiAgICAgICAgfQoKICAgICAgICBteSAlUHJvamVjdCAgICAgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+UHJvamVjdFNldHRpbmdzR2V0KCk7CiAgICAgICAgbXkgJUFjdGlvbiAgICAgID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPkFjdGlvblNldHRpbmdzR2V0KCk7CiAgICAgICAgZm9yZWFjaCBteSAkUHJvamVjdElEIChzb3J0IHskUHJvamVjdHtQcm9qZWN0fXskYX0gY21wICRQcm9qZWN0e1Byb2plY3R9eyRifX0ga2V5cyAleyRQcm9qZWN0e1Byb2plY3R9fSkgewogICAgICAgICAgICBpZiAoJFByb2plY3REYXRhe1RvdGFsfXskUHJvamVjdElEfSkgewogICAgICAgICAgICAgICAgaWYgKCRQcm9qZWN0SUQgbmUgJy0xJykgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtQcm9qZWN0fT0gJyc7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte0NsYXNzfSAgICAgICAgICAgID0gJ2NvbnRlbnR2YWx1ZSc7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRQcm9qZWN0e1Byb2plY3RTdGF0dXN9eyRQcm9qZWN0SUR9KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtTdGF0dXN9ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17U3RhdHVzfSA9ICdwYXNzaXYnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBteSAkVG90YWwgICAgICA9IDA7CiAgICAgICAgICAgICAgICAgICAgbXkgJFRvdGFsVG90YWwgPSAwOwoKICAgICAgICAgICAgICAgICAgICBpZiAoKCRQYXJhbXtQcm9qZWN0U3RhdHVzU2hvd30gZXEgJ2FsbCcgJiYgISRQYXJhbXtTdGF0dXN9KQogICAgICAgICAgICAgICAgICAgICAgICB8fCAkUGFyYW17UHJvamVjdFN0YXR1c1Nob3d9IGVxICd2YWxpZCcKICAgICAgICAgICAgICAgICAgICApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgYWN0aW9uIHNvcnQgd3JhcHBlciAtIGJlIGNhcmVmdWwgaXRzIG5vdCBzaW11bGFyIHdpdGggcHJvamVjdCEhCiAgICAgICAgICAgICAgICAgICAgICAgIG15ICVTb3J0ZWRBY3Rpb25zID0gKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggbXkgJEFjdGlvbklEIChrZXlzICV7JFByb2plY3REYXRhe1RvdGFsfXskUHJvamVjdElEfX0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTb3J0ZWRBY3Rpb25zeyRBY3Rpb25JRH0gPSAkQWN0aW9ueyRBY3Rpb25JRH17QWN0aW9ufTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtSb3dTcGFufSsrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggbXkgJEFjdGlvbklEIChzb3J0IHskU29ydGVkQWN0aW9uc3skYX0gY21wICRTb3J0ZWRBY3Rpb25zeyRifX0ga2V5cyAlU29ydGVkQWN0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICAjZm9yZWFjaCBteSAkQWN0aW9uSUQgKGtleXMgJXskUHJvamVjdERhdGF7VG90YWx9eyRQcm9qZWN0SUR9fSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtBY3Rpb259ICAgICA9ICRBY3Rpb257JEFjdGlvbklEfXtBY3Rpb259OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte0hvdXJzfSAgICAgID0gc3ByaW50ZiAoIiUuMmYiLCAkUHJvamVjdERhdGF7UGVyTW9udGh9eyRQcm9qZWN0SUR9eyRBY3Rpb25JRH17SG91cnN9IHx8IDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte0hvdXJzVG90YWx9ID0gc3ByaW50ZiAoIiUuMmYiLCAkUHJvamVjdERhdGF7VG90YWx9eyRQcm9qZWN0SUR9eyRBY3Rpb25JRH17SG91cnN9ICAgIHx8IDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRvdGFsICAgICAgKz0gJFBhcmFte0hvdXJzfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUb3RhbFRvdGFsICs9ICRQYXJhbXtIb3Vyc1RvdGFsfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQWN0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHslUGFyYW0sICVGcm9udGVuZH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEkUGFyYW17UHJvamVjdH0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17UHJvamVjdH0gICAgICAgICAgICA9ICRQcm9qZWN0e1Byb2plY3R9eyRQcm9qZWN0SUR9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtQcm9qZWN0RGVzY3JpcHRpb259ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0ICAgICAgICAgICA9PiAkUHJvamVjdHtQcm9qZWN0RGVzY3JpcHRpb259eyRQcm9qZWN0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIVE1MUmVzdWx0TW9kZSA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXdMaW5lICAgICAgICA9PiA1MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtSb3dTcGFufSsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1Byb2plY3QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHslUGFyYW0sICVGcm9udGVuZH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJFVzZXJCYXNpY3N7JFNlbGYtPntVc2VySUR9fXtDcmVhdGVQcm9qZWN0fSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHBlcnNvbnMgaG93IGFyZSBhbGxvd2VkIHRvIHNlZSB0aGUgY3JlYXRlIG9iamVjdCBsaW5rIGFyZSBhbGxvd2VkIHRvIHNlZSB0aGUgcHJvamVjdCByZXBvcnRpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1Byb2plY3RMaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QgPT4gJFBhcmFte1Byb2plY3R9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3RJRCA9PiAkUHJvamVjdElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQcm9qZWN0Tm9MaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4ge1Byb2plY3QgPT4gJFBhcmFte1Byb2plY3R9fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtSb3dTcGFufSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte0NsYXNzfSAgICAgICAgICAgID0gJ2NvbnRlbnRrZXknOwogICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17QWN0aW9ufSAgICAgICAgICAgPSAnVG90YWwnOwogICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17SG91cnN9ICAgICAgICAgICAgPSBzcHJpbnRmICgiJS4yZiIsICRUb3RhbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtIb3Vyc1RvdGFsfSAgICAgICA9IHNwcmludGYgKCIlLjJmIiwgJFRvdGFsVG90YWwpOwogICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17VG90YWxIb3Vyc30gICAgICArPSAkVG90YWw7CiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtUb3RhbEhvdXJzVG90YWx9ICs9ICRUb3RhbFRvdGFsOwogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQWN0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbSwgJUZyb250ZW5kfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte0NsYXNzfSA9ICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkUGFyYW17VG90YWxIb3Vyc30gICAgICA9IHNwcmludGYgKCIlLjJmIiwgJFBhcmFte1RvdGFsSG91cnN9KTsKICAgICAgICAkUGFyYW17VG90YWxIb3Vyc1RvdGFsfSA9IHNwcmludGYgKCIlLjJmIiwgJFBhcmFte1RvdGFsSG91cnNUb3RhbH0pOwoKICAgICAgICAjIGJ1aWxkIG91dHB1dAogICAgICAgICRPdXRwdXQgID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoVGl0bGUgPT4gIk92ZXJ2aWV3Iik7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4geyVQYXJhbSwgJUZyb250ZW5kfSwKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpbWVBY2NvdW50aW5nT3ZlcnZpZXcnCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBzZXR0aW5ncyBmb3IgaGFuZGxpbmcgdGltZSBhY2NvdW50aW5nCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2V0dGluZycpIHsKICAgICAgICBteSAkT3V0cHV0ICAgICAgPSAnJzsKICAgICAgICBteSAlRnJvbnRlbmQgICAgPSAoKTsKICAgICAgICBteSAlQWN0aW9uICAgICAgPSAoKTsKICAgICAgICBteSAlU3RhdHVzTGlzdCAgPSAoKTsKICAgICAgICBteSAlVXNlciAgICAgICAgPSAoKTsKICAgICAgICBteSAlRGF0YSAgICAgICAgPSAoKTsKICAgICAgICBteSAlVXNlckJhc2ljcyAgPSAoKTsKCiAgICAgICAgZm9yZWFjaCAocXcoQWN0aW9uQWN0aW9uIEFjdGlvblVzZXIgTmV3QWN0aW9uIE5ld1VzZXIpKSB7CiAgICAgICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJF8pOwogICAgICAgIH0KCiAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrCiAgICAgICAgaWYgKCEkU2VsZi0+e0FjY2Vzc1J3fSkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oV2l0aEhlYWRlciA9PiAneWVzJyk7CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTZXR0aW5nJywKICAgICAgICApOwoKICAgICAgICAjIHN0b3JlIGxhc3Qgc2NyZWVuCiAgICAgICAgJFNlbGYtPntTZXNzaW9uT2JqZWN0fS0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgICAgICBLZXkgICAgICAgPT4gJ0xhc3RTY3JlZW4nLAogICAgICAgICAgICBWYWx1ZSAgICAgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mU3ViYWN0aW9uPVNldHRpbmciLAogICAgICAgICk7CgogICAgICAgIGlmICgkUGFyYW17QWN0aW9uQWN0aW9ufSB8fCAkUGFyYW17TmV3QWN0aW9ufSkgewogICAgICAgICAgICAlQWN0aW9uID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPkFjdGlvblNldHRpbmdzR2V0KCk7CiAgICAgICAgICAgIG15ICRBY3Rpb25FbXB0eSA9IDA7CiAgICAgICAgICAgIG15ICVBY3Rpb25DaGVjayA9ICgpOwogICAgICAgICAgICBmb3JlYWNoIG15ICRBY3Rpb25JRCAoa2V5cyAlQWN0aW9uKSB7CiAgICAgICAgICAgICAgICBmb3JlYWNoIChxdyhBY3Rpb24gQWN0aW9uU3RhdHVzKSkgewogICAgICAgICAgICAgICAgICAgICREYXRheyRBY3Rpb25JRH17JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICRfIC4gJ1snIC4gJEFjdGlvbklEIC4gJ10nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghJERhdGF7JEFjdGlvbklEfXtBY3Rpb259KSB7CiAgICAgICAgICAgICAgICAgICAgJEFjdGlvbkVtcHR5ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgkRGF0YXskQWN0aW9uSUR9e0FjdGlvbn0gJiYgJEFjdGlvbkNoZWNreyREYXRheyRBY3Rpb25JRH17QWN0aW9ufX0gICYmICRBY3Rpb25DaGVja3skRGF0YXskQWN0aW9uSUR9e0FjdGlvbn19ID09IDEpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbihNZXNzYWdlID0+ICdUaGUgYWN0aW9ubmFtaW5nIG11c3QgYmUgdW5pcXVlIScpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJEFjdGlvbkNoZWNreyREYXRheyRBY3Rpb25JRH17QWN0aW9ufX0gPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPkFjdGlvblNldHRpbmdzVXBkYXRlKCVEYXRhKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oTWVzc2FnZSA9PiAnQ2FuXCd0IHVwZGF0ZSBhY3Rpb24gZGF0YSEnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJFBhcmFte05ld0FjdGlvbn0gJiYgISRBY3Rpb25FbXB0eSkgewogICAgICAgICAgICAgICAgaWYgKCEkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+QWN0aW9uU2V0dGluZ3NJbnNlcnQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKE1lc3NhZ2UgPT4gJ0NhblwndCBpbnNlcnQgYWN0aW9uIGRhdGEhJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICVVc2VyID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlVzZXJTZXR0aW5nc0dldCgpOwogICAgICAgICAgICBteSAlTGFzdFBlcmlvZCA9ICgpOwogICAgICAgICAgICBmb3JlYWNoIG15ICRVc2VySUQgKGtleXMgJVVzZXIpIHsKICAgICAgICAgICAgICAgICRMYXN0UGVyaW9keyRVc2VySUR9ID0gMDsKICAgICAgICAgICAgICAgIGZvcmVhY2ggbXkgJFBlcmlvZCAoa2V5cyAleyRVc2VyeyRVc2VySUR9fSkgewogICAgICAgICAgICAgICAgICAgIGlmICgkTGFzdFBlcmlvZHskVXNlcklEfSA8ICRQZXJpb2QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJExhc3RQZXJpb2R7JFVzZXJJRH0gPSAkUGVyaW9kOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJ05ld1VzZXJTZXR0aW5nWycgLiAkVXNlcklEIC4gJ10nKSkgewogICAgICAgICAgICAgICAgICAgIG15ICVJbnNlcnREYXRhID0gKCk7CiAgICAgICAgICAgICAgICAgICAgJEluc2VydERhdGF7VXNlcklEfSAgICAgID0gJFVzZXJJRDsKICAgICAgICAgICAgICAgICAgICAkSW5zZXJ0RGF0YXtQZXJpb2R9ICAgICAgPSAkTGFzdFBlcmlvZHskVXNlcklEfSArIDE7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte0FjdGlvblVzZXJ9ID0gJ3RydWUnOwogICAgICAgICAgICAgICAgICAgIGlmICghJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlVzZXJTZXR0aW5nc0luc2VydCglSW5zZXJ0RGF0YSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oTWVzc2FnZSA9PiAnQ2FuXCd0IGluc2VydCB1c2VyIGRhdGEhJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkUGFyYW17QWN0aW9uVXNlcn0gfHwgJFBhcmFte05ld1VzZXJ9KSB7CiAgICAgICAgICAgICAgICAlVXNlckJhc2ljcyA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Vc2VyR2V0KCk7CiAgICAgICAgICAgICAgICBmb3JlYWNoIG15ICRVc2VySUQgKGtleXMgJVVzZXIpIHsKICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIChxdyhTaG93T3ZlcnRpbWUgQ3JlYXRlUHJvamVjdCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7JFVzZXJJRH17JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICRfIC4gJ1snIC4gJFVzZXJJRCAuICddJyk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBteSAkQnJlYWsgPSAnJzsKICAgICAgICAgICAgICAgICAgICBpZiAoJFVzZXJCYXNpY3N7JFVzZXJJRH17RGVzY3JpcHRpb259ICYmICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnRGVzY3JpcHRpb25bJyAuICRVc2VySUQgLiAnXScpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRCcmVhayA9ICJcbiI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG15ICREZXNjcmlwdGlvbiA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnRGVzY3JpcHRpb25bJyAuICRVc2VySUQgLiAnXScpOwogICAgICAgICAgICAgICAgICAgICREYXRheyRVc2VySUR9e0Rlc2NyaXB0aW9ufSA9ICRVc2VyQmFzaWNzeyRVc2VySUR9e0Rlc2NyaXB0aW9ufSAuICRCcmVhayAuICREZXNjcmlwdGlvbjsKCiAgICAgICAgICAgICAgICAgICAgJERhdGF7JFVzZXJJRH17VXNlcklEfSA9ICRVc2VySUQ7CiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCBteSAkUGVyaW9kIChrZXlzICV7JFVzZXJ7JFVzZXJJRH19KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHF3KFdlZWtseUhvdXJzIExlYXZlRGF5cyBVc2VyU3RhdHVzIERhdGVTdGFydCBEYXRlRW5kIE92ZXJ0aW1lKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7JFVzZXJJRH17JFBlcmlvZH17JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICRfIC4gJ1snIC4gJFVzZXJJRCAuICddWycgLiAkUGVyaW9kIC4gJ10nKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICREYXRheyRVc2VySUR9eyRQZXJpb2R9e1VzZXJJRH0gPSAkVXNlcklEOwogICAgICAgICAgICAgICAgICAgICRMYXN0UGVyaW9keyRVc2VySUR9ID0gJFBlcmlvZDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoISRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Vc2VyU2V0dGluZ3NVcGRhdGUoJURhdGEpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oTWVzc2FnZSA9PiAnQ2FuXCd0IHVwZGF0ZSB1c2VyIGRhdGEhJyk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCRQYXJhbXtOZXdVc2VyfSAmJiAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJ05ld1VzZXJJRCcpKSB7CiAgICAgICAgICAgICAgICAgICAgJURhdGEgPSAoKTsKICAgICAgICAgICAgICAgICAgICAkRGF0YXtVc2VySUR9ICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJ05ld1VzZXJJRCcpOwogICAgICAgICAgICAgICAgICAgICREYXRhe1BlcmlvZH0gICAgICA9ICcxJzsKICAgICAgICAgICAgICAgICAgICBpZiAoISRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Vc2VyU2V0dGluZ3NJbnNlcnQoJURhdGEpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKE1lc3NhZ2UgPT4gJ0NhblwndCBpbnNlcnQgdXNlciBkYXRhIScpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBteSAlR3JvdXBzID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTGlzdChWYWxpZCA9PiAxKTsKICAgICAgICAgICAgICAgICAgICBteSAlR3JvdXBEYXRhID0kU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJERhdGF7VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiAncm8nLAogICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHQgPT4gJ0hBU0gnLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoa2V5cyAlR3JvdXBzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkR3JvdXBzeyRffSBlcSAndGltZV9hY2NvdW50aW5nJyAmJiAhJEdyb3VwRGF0YXskX30pIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJBZGQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0lEID0+ICRfLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJRCA9PiAkRGF0YXtVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcm1pc3Npb24gPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybyAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW92ZV9pbnRvID0+IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZSAgICA9PiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lciAgICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHkgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ3ICAgICAgICA9PiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgU2hvdyBUaW1lQWNjb3VudGluZyBQcmVmZXJlbmNlcwogICAgICAgICRTdGF0dXNMaXN0ezF9ID0gJ3ZhbGlkJzsKICAgICAgICAkU3RhdHVzTGlzdHswfSA9ICdpbnZhbGlkJzsKCiAgICAgICAgIyBTaG93IGFjdGlvbiBkYXRhCiAgICAgICAgJUFjdGlvbiA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5BY3Rpb25TZXR0aW5nc0dldCgpOwogICAgICAgIG15ICRBY3Rpb25FbXB0eSA9IDA7CiAgICAgICAgbXkgJVNvcnRBY3Rpb24gID0gKCk7CiAgICAgICAgZm9yZWFjaCBteSAkQWN0aW9uSUQgKGtleXMgJUFjdGlvbikgewogICAgICAgICAgICAkU29ydEFjdGlvbnskQWN0aW9uSUR9ID0gJEFjdGlvbnskQWN0aW9uSUR9e0FjdGlvbn07CiAgICAgICAgfQogICAgICAgIGZvcmVhY2ggbXkgJEFjdGlvbklEIChzb3J0IHskU29ydEFjdGlvbnskYX0gY21wICRTb3J0QWN0aW9ueyRifX0ga2V5cyAlU29ydEFjdGlvbikgewogICAgICAgICAgICAkUGFyYW17QWN0aW9ufSAgID0gJEFjdGlvbnskQWN0aW9uSUR9e0FjdGlvbn07CiAgICAgICAgICAgICRQYXJhbXtBY3Rpb25JRH0gPSAkQWN0aW9uSUQ7CgogICAgICAgICAgICAkRnJvbnRlbmR7J1N0YXR1c09wdGlvbid9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVTdGF0dXNMaXN0LAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkQWN0aW9ueyRBY3Rpb25JRH17QWN0aW9uU3RhdHVzfSB8fCAnJywKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gIkFjdGlvblN0YXR1c1skUGFyYW17QWN0aW9uSUR9XSIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQWN0aW9uJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbSwgJUZyb250ZW5kfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgU2hvdyB1c2VyIGRhdGEKICAgICAgICAlVXNlciA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Vc2VyU2V0dGluZ3NHZXQoKTsKICAgICAgICAlVXNlckJhc2ljcyA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Vc2VyR2V0KCk7CiAgICAgICAgbXkgJVNob3duVXNlcnMgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyTGlzdChUeXBlID0+ICdMb25nJywgVmFsaWQgPT4gMSk7CiAgICAgICAgZm9yZWFjaCBteSAkVXNlcklEIChzb3J0IHskU2hvd25Vc2Vyc3skYX0gY21wICRTaG93blVzZXJzeyRifX0ga2V5cyAlU2hvd25Vc2VycykgewogICAgICAgICAgICBpZiAoJFVzZXJ7JFVzZXJJRH0pIHsKICAgICAgICAgICAgICAgICRQYXJhbXtVc2VyfSAgICAgICAgPSAkU2hvd25Vc2Vyc3skVXNlcklEfTsKICAgICAgICAgICAgICAgICRQYXJhbXtVc2VySUR9ICAgICAgPSAkVXNlcklEOwoKICAgICAgICAgICAgICAgIG15ICREZXNjcmlwdGlvbiA9ICcnOwogICAgICAgICAgICAgICAgaWYgKCRVc2VyQmFzaWNzeyRVc2VySUR9e0Rlc2NyaXB0aW9ufSkgewogICAgICAgICAgICAgICAgICAgICREZXNjcmlwdGlvbiA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCgKICAgICAgICAgICAgICAgICAgICAgICAgVGV4dCAgICAgICAgICAgPT4gJFVzZXJCYXNpY3N7JFVzZXJJRH17RGVzY3JpcHRpb259LAogICAgICAgICAgICAgICAgICAgICAgICBIVE1MUmVzdWx0TW9kZSA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICBOZXdMaW5lICAgICAgICA9PiA1MCwKICAgICAgICAgICAgICAgICAgICApIC4gIjxicj4iOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICgkVXNlckJhc2ljc3skVXNlcklEfXtTaG93T3ZlcnRpbWV9KSB7CiAgICAgICAgICAgICAgICAgICAgJFVzZXJCYXNpY3N7JFVzZXJJRH17U2hvd092ZXJ0aW1lfSA9ICJjaGVja2VkIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgkVXNlckJhc2ljc3skVXNlcklEfXtDcmVhdGVQcm9qZWN0fSkgewogICAgICAgICAgICAgICAgICAgICRVc2VyQmFzaWNzeyRVc2VySUR9e0NyZWF0ZVByb2plY3R9ID0gImNoZWNrZWQiOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVXNlcicsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtLCAlRnJvbnRlbmQsCiAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgPT4gJERlc2NyaXB0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICBTaG93T3ZlcnRpbWUgID0+ICRVc2VyQmFzaWNzeyRVc2VySUR9e1Nob3dPdmVydGltZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZVByb2plY3QgPT4gJFVzZXJCYXNpY3N7JFVzZXJJRH17Q3JlYXRlUHJvamVjdH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgZGVsZXRlICRTaG93blVzZXJzeyRVc2VySUR9OwoKICAgICAgICAgICAgICAgIGZvcmVhY2ggbXkgJFBlcmlvZCAoc29ydCBrZXlzICV7JFVzZXJ7JFVzZXJJRH19KSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte1dlZWtseUhvdXJzfSA9ICRVc2VyeyRVc2VySUR9eyRQZXJpb2R9e1dlZWtseUhvdXJzfTsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17TGVhdmVEYXlzfSAgID0gJFVzZXJ7JFVzZXJJRH17JFBlcmlvZH17TGVhdmVEYXlzfTsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17T3ZlcnRpbWV9ICAgID0gJFVzZXJ7JFVzZXJJRH17JFBlcmlvZH17T3ZlcnRpbWV9OwogICAgICAgICAgICAgICAgICAgICRQYXJhbXtEYXRlU3RhcnR9ICAgPSAkVXNlcnskVXNlcklEfXskUGVyaW9kfXtEYXRlU3RhcnR9OwogICAgICAgICAgICAgICAgICAgICRQYXJhbXtEYXRlRW5kfSAgICAgPSAkVXNlcnskVXNlcklEfXskUGVyaW9kfXtEYXRlRW5kfTsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17UGVyaW9kfSAgICAgID0gJFBlcmlvZDsKCiAgICAgICAgICAgICAgICAgICAgJEZyb250ZW5keydTdGF0dXNPcHRpb24nfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVTdGF0dXNMaXN0LAogICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEID0+ICRVc2VyeyRVc2VySUR9eyRQZXJpb2R9e1VzZXJTdGF0dXN9IHx8ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICJVc2VyU3RhdHVzWyRVc2VySURdWyRQZXJpb2RdIiwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQZXJpb2QnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHslUGFyYW0sICVGcm9udGVuZH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCVTaG93blVzZXJzKSB7CiAgICAgICAgICAgICRTaG93blVzZXJzeycnfSA9ICcnOwogICAgICAgICAgICAkRnJvbnRlbmR7J05ld1VzZXJPcHRpb24nfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgICAgICBEYXRhICAgICAgID0+IFwlU2hvd25Vc2VycywKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJycsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICJOZXdVc2VySUQiLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnTmV3VXNlck9wdGlvbicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHslUGFyYW0sICVGcm9udGVuZH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIG91dHB1dAogICAgICAgICRPdXRwdXQgID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoVGl0bGUgPT4gIlNldHRpbmciKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7JVBhcmFtLCAlRnJvbnRlbmR9LAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGltZUFjY291bnRpbmdTZXR0aW5nJwogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgc2V0dGluZ3MgZm9yIGhhbmRsaW5nIHRpbWUgYWNjb3VudGluZwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1Byb2plY3RTZXR0aW5nJykgewogICAgICAgIG15ICRPdXRwdXQgICAgID0gJyc7CiAgICAgICAgbXkgJUZyb250ZW5kICAgPSAoKTsKICAgICAgICBteSAlUHJvamVjdCAgICA9ICgpOwogICAgICAgIG15ICVTdGF0dXNMaXN0ID0gKCk7CiAgICAgICAgbXkgJURhdGEgICAgICAgPSAoKTsKCiAgICAgICAgZm9yZWFjaCAocXcoQWN0aW9uUHJvamVjdCBOZXdQcm9qZWN0KSkgewogICAgICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICRfKTsKICAgICAgICB9CgogICAgICAgICMgcGVybWlzc2lvbiBjaGVjawogICAgICAgIGlmICghJFNlbGYtPntBY2Nlc3NSb30pIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKFdpdGhIZWFkZXIgPT4gJ3llcycpOwogICAgICAgIH0KCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUHJvamVjdFNldHRpbmcnLAogICAgICAgICk7CgogICAgICAgICMgRWRpdCBUaW1lQWNjb3VudGluZyBQcmVmZXJlbmNlcwogICAgICAgIGlmICgkUGFyYW17QWN0aW9uUHJvamVjdH0gfHwgJFBhcmFte05ld1Byb2plY3R9KSB7CiAgICAgICAgICAgICVQcm9qZWN0ID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlByb2plY3RTZXR0aW5nc0dldCgpOwogICAgICAgICAgICBteSAkUHJvamVjdEVtcHR5ID0gMDsKICAgICAgICAgICAgbXkgJVByb2plY3RDaGVjayA9ICgpOwogICAgICAgICAgICBmb3JlYWNoIG15ICRQcm9qZWN0SUQgKGtleXMgJXskUHJvamVjdHtQcm9qZWN0fX0pIHsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKHF3KFByb2plY3QgUHJvamVjdFN0YXR1cyBQcm9qZWN0RGVzY3JpcHRpb24pKSB7CiAgICAgICAgICAgICAgICAgICAgJERhdGF7JFByb2plY3RJRH17JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICRfIC4gJ1snIC4gJFByb2plY3RJRCAuICddJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoISREYXRheyRQcm9qZWN0SUR9e1Byb2plY3R9KSB7CiAgICAgICAgICAgICAgICAgICAgJFByb2plY3RFbXB0eSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoJERhdGF7JFByb2plY3RJRH17UHJvamVjdH0gJiYgJFByb2plY3RDaGVja3skRGF0YXskUHJvamVjdElEfXtQcm9qZWN0fX0gJiYgJFByb2plY3RDaGVja3skRGF0YXskUHJvamVjdElEfXtQcm9qZWN0fX0gPT0gMSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICdUaGUgcHJvamVjdG5hbWluZyBtdXN0IGJlIHVuaXF1ZSEnCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmICgkRGF0YXskUHJvamVjdElEfXtQcm9qZWN0fSkgewogICAgICAgICAgICAgICAgICAgICAgICAkUHJvamVjdENoZWNreyREYXRheyRQcm9qZWN0SUR9e1Byb2plY3R9fSA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlByb2plY3RTZXR0aW5nc1VwZGF0ZSglRGF0YSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKE1lc3NhZ2UgPT4gJ0NhblwndCB1cGRhdGUgcHJvamVjdCBkYXRhIScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkUGFyYW17TmV3UHJvamVjdH0gJiYgISRQcm9qZWN0RW1wdHkpIHsKICAgICAgICAgICAgICAgIGlmICghJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlByb2plY3RTZXR0aW5nc0luc2VydCgpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oTWVzc2FnZSA9PiAnQ2FuXCd0IGluc2VydCBwcm9qZWN0IGRhdGEhJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgU2hvdyBUaW1lQWNjb3VudGluZyBQcmVmZXJlbmNlcwogICAgICAgICRTdGF0dXNMaXN0ezF9ID0gJ3ZhbGlkJzsKICAgICAgICAkU3RhdHVzTGlzdHswfSA9ICdpbnZhbGlkJzsKCiAgICAgICAgIyBTaG93IHByb2plY3QgZGF0YQogICAgICAgICVQcm9qZWN0ID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlByb2plY3RTZXR0aW5nc0dldCgpOwogICAgICAgIG15ICRQcm9qZWN0RW1wdHkgPSAwOwogICAgICAgIGZvcmVhY2ggbXkgJFByb2plY3RJRCAoc29ydCB7JFByb2plY3R7UHJvamVjdH17JGF9IGNtcCAkUHJvamVjdHtQcm9qZWN0fXskYn19IGtleXMgJXskUHJvamVjdHtQcm9qZWN0fX0pIHsKCiAgICAgICAgICAgICRQYXJhbXtQcm9qZWN0fSAgICAgICAgICAgID0gJFByb2plY3R7UHJvamVjdH17JFByb2plY3RJRH07CiAgICAgICAgICAgICRQYXJhbXtQcm9qZWN0RGVzY3JpcHRpb259ID0gJFByb2plY3R7UHJvamVjdERlc2NyaXB0aW9ufXskUHJvamVjdElEfTsKICAgICAgICAgICAgJFBhcmFte1Byb2plY3RJRH0gICAgICAgICAgPSAkUHJvamVjdElEOwoKICAgICAgICAgICAgJEZyb250ZW5keydTdGF0dXNPcHRpb24nfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgICAgICBEYXRhICAgICAgID0+IFwlU3RhdHVzTGlzdCwKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFByb2plY3R7UHJvamVjdFN0YXR1c317JFByb2plY3RJRH0gfHwgJycsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICJQcm9qZWN0U3RhdHVzWyRQYXJhbXtQcm9qZWN0SUR9XSIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUHJvamVjdCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHslUGFyYW0sICVGcm9udGVuZH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIG91dHB1dAogICAgICAgICRPdXRwdXQgID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoVGl0bGUgPT4gIlNldHRpbmciKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7JVBhcmFtLCAlRnJvbnRlbmR9LAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGltZUFjY291bnRpbmdTZXR0aW5nJwogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgdGltZSBhY2NvdW50aW5nIHJlcG9ydGluZwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1JlcG9ydGluZycpIHsKICAgICAgICBteSAkT3V0cHV0ICAgPSAnJzsKICAgICAgICBteSAlRnJvbnRlbmQgPSAoKTsKICAgICAgICBteSAlU2hvd25Vc2VycyA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJMaXN0KFR5cGUgPT4gJ0xvbmcnLCBWYWxpZCA9PiAwKTsKICAgICAgICBteSAoJFNlYywgJE1pbiwgJEhvdXIsICRDdXJyZW50RGF5LCAkTW9udGgsICRZZWFyKSA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyRGF0ZSgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCksCiAgICAgICAgKTsKCiAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrCiAgICAgICAgaWYgKCEkU2VsZi0+e0FjY2Vzc1J3fSkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oV2l0aEhlYWRlciA9PiAneWVzJyk7CiAgICAgICAgfQoKICAgICAgICBmb3JlYWNoIChxdyhTdGF0dXMgTW9udGggWWVhciBQcm9qZWN0U3RhdHVzU2hvdykpIHsKICAgICAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAkXyk7CiAgICAgICAgfQoKICAgICAgICAjIENoZWNrIERhdGUKICAgICAgICBpZiAoISRQYXJhbXtZZWFyfSB8fCAhJFBhcmFte01vbnRofSkgewogICAgICAgICAgICAkUGFyYW17WWVhcn0gID0gJFllYXI7CiAgICAgICAgICAgICRQYXJhbXtNb250aH0gPSAkTW9udGg7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17TW9udGh9ID0gc3ByaW50ZigiJTAyZCIsICRQYXJhbXtNb250aH0pOwogICAgICAgIH0KCiAgICAgICAgIyBzdG9yZSBsYXN0IHNjcmVlbgogICAgICAgICRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICAgICAgS2V5ICAgICAgID0+ICdMYXN0U2NyZWVuJywKICAgICAgICAgICAgVmFsdWUgICAgID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259JlN1YmFjdGlvbj1SZXBvcnRpbmcmWWVhcj0kUGFyYW17WWVhcn0mTW9udGg9JFBhcmFte01vbnRofSIsCiAgICAgICAgKTsKCiAgICAgICAgJFBhcmFte01vbnRoX3RvX1RleHR9ICAgPSAkTW9udGhBcnJheVskUGFyYW17TW9udGh9XTsKCiAgICAgICAgbXkgJU1vbnRoID0gKCk7CiAgICAgICAgZm9yIChteSAkSUQgPSAxOyAkSUQgPD0gMTI7ICRJRCsrKSB7CiAgICAgICAgICAgICRNb250aHtzcHJpbnRmKCIlMDJkIiwkSUQpfXsnVmFsdWUnfSAgICA9ICRNb250aEFycmF5WyRJRF07CiAgICAgICAgICAgICRNb250aHtzcHJpbnRmKCIlMDJkIiwkSUQpfXsnUG9zaXRpb24nfSA9ICRJRDsKICAgICAgICAgICAgaWYgKCRQYXJhbXtNb250aH0gPT0gJElEKSB7CiAgICAgICAgICAgICAgICAkTW9udGh7c3ByaW50ZigiJTAyZCIsJElEKX17J1NlbGVjdGVkJ30gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkRnJvbnRlbmR7J01vbnRoT3B0aW9uJ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvbkVsZW1lbnQoCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVNb250aCwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAiTW9udGgiLAogICAgICAgICk7CgogICAgICAgIG15ICVZZWFyID0gKCk7CiAgICAgICAgZm9yIChteSAkSUQgPSAyMDA1OyAkSUQgPD0gMjAwNjsgJElEKyspIHsKICAgICAgICAgICAgJFllYXJ7JElEfSA9ICRJRDsKICAgICAgICB9CiAgICAgICAgJEZyb250ZW5keydZZWFyT3B0aW9uJ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICBEYXRhICAgICAgID0+IFwlWWVhciwKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17WWVhcn0gfHwgJycsCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gIlllYXIiLAogICAgICAgICk7CgogICAgICAgICgkUGFyYW17WWVhckJhY2t9LCAkUGFyYW17TW9udGhCYWNrfSwgJFBhcmFte0RheUJhY2t9KSA9IEFkZF9EZWx0YV9ZTUQoJFBhcmFte1llYXJ9LCAkUGFyYW17TW9udGh9LCAxLCAwLCAtMSwgMCk7CiAgICAgICAgKCRQYXJhbXtZZWFyTmV4dH0sICRQYXJhbXtNb250aE5leHR9LCAkUGFyYW17RGF5TmV4dH0pID0gQWRkX0RlbHRhX1lNRCgkUGFyYW17WWVhcn0sICRQYXJhbXtNb250aH0sIDEsIDAsIDEsIDApOwoKICAgICAgICBteSAlVXNlclJlcG9ydCAgICAgICAgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+VXNlclJlcG9ydGluZygKICAgICAgICAgICAgWWVhciAgID0+ICRQYXJhbXtZZWFyfSwKICAgICAgICAgICAgTW9udGggID0+ICRQYXJhbXtNb250aH0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBteSAlVXNlckJhc2ljcyA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Vc2VyR2V0KCk7CiAgICAgICAgZm9yZWFjaCBteSAkVXNlcklEIChzb3J0IHskU2hvd25Vc2Vyc3skYX0gY21wICRTaG93blVzZXJzeyRifX0ga2V5cyAlU2hvd25Vc2VycykgewogICAgICAgICAgICBpZiAoJFVzZXJSZXBvcnR7JFVzZXJJRH0pIHsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKHF3KExlYXZlRGF5IE92ZXJ0aW1lIFdvcmtpbmdIb3VycyBEaXNlYXNlZCBMZWF2ZURheVJlbWFpbmluZyBPdmVydGltZVRvdGFsKSkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXskX30gPSBzcHJpbnRmICgiJS4yZiIsICRVc2VyUmVwb3J0eyRVc2VySUR9eyRffSk7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFteydUb3RhbCcgLiAkX30gKz0gJFBhcmFteyRffTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIFNob3cgT3ZlcnRpbWUgaWYgYWxsb3dlZAogICAgICAgICAgICAgICAgaWYgKCEkVXNlckJhc2ljc3skVXNlcklEfXtTaG93T3ZlcnRpbWV9KSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte092ZXJ0aW1lfSAgICAgID0gJyc7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte092ZXJ0aW1lVG90YWx9ID0gJyc7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJFBhcmFte1VzZXJ9ICAgPSAkU2hvd25Vc2Vyc3skVXNlcklEfTsKICAgICAgICAgICAgICAgICRQYXJhbXtVc2VySUR9ID0gJFVzZXJJRDsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVXNlcicsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtLCAlRnJvbnRlbmR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3JlYWNoIChxdyhUb3RhbExlYXZlRGF5IFRvdGFsT3ZlcnRpbWUgVG90YWxXb3JraW5nSG91cnMKICAgICAgICAgICAgVG90YWxEaXNlYXNlZCBUb3RhbExlYXZlRGF5UmVtYWluaW5nIFRvdGFsT3ZlcnRpbWVUb3RhbCkKICAgICAgICApIHsKICAgICAgICAgICAgJFBhcmFteyRffSA9IHNwcmludGYgKCIlLjJmIiwgJFBhcmFteyRffSk7CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgdGhlIHJlcG9ydCBzb3J0IGJ5IHByb2plY3RzCiAgICAgICAgaWYgKCEkUGFyYW17UHJvamVjdFN0YXR1c1Nob3d9IHx8ICRQYXJhbXtQcm9qZWN0U3RhdHVzU2hvd30gZXEgJ3ZhbGlkJykgewogICAgICAgICAgICAkUGFyYW17UHJvamVjdFN0YXR1c1Nob3d9ID0gJ2FsbCc7CiAgICAgICAgfQogICAgICAgIGVsc2lmICgkUGFyYW17UHJvamVjdFN0YXR1c1Nob3d9IGVxICdhbGwnKSB7CiAgICAgICAgICAgICRQYXJhbXtQcm9qZWN0U3RhdHVzU2hvd30gPSAndmFsaWQnOwogICAgICAgIH0KCiAgICAgICAgbXkgJVByb2plY3REYXRhID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlByb2plY3RBY3Rpb25SZXBvcnRpbmcoCiAgICAgICAgICAgIFllYXIgID0+ICRQYXJhbXtZZWFyfSwKICAgICAgICAgICAgTW9udGggPT4gJFBhcmFte01vbnRofSwKICAgICAgICApOwoKICAgICAgICBteSAlUHJvamVjdCAgICAgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+UHJvamVjdFNldHRpbmdzR2V0KCk7CiAgICAgICAgbXkgJUFjdGlvbiAgICAgID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPkFjdGlvblNldHRpbmdzR2V0KCk7CiAgICAgICAgZm9yZWFjaCBteSAkUHJvamVjdElEIChzb3J0IHskUHJvamVjdHtQcm9qZWN0fXskYX0gY21wICRQcm9qZWN0e1Byb2plY3R9eyRifX0ga2V5cyAleyRQcm9qZWN0e1Byb2plY3R9fSkgewogICAgICAgICAgICBpZiAoJFByb2plY3REYXRhe1RvdGFsfXskUHJvamVjdElEfSkgewogICAgICAgICAgICAgICAgaWYgKCRQcm9qZWN0SUQgbmUgJy0xJykgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtQcm9qZWN0fT0gJyc7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte0NsYXNzfSAgICAgICAgICAgID0gJ2NvbnRlbnR2YWx1ZSc7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRQcm9qZWN0e1Byb2plY3RTdGF0dXN9eyRQcm9qZWN0SUR9KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtTdGF0dXN9ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17U3RhdHVzfSA9ICdwYXNzaXYnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBteSAkVG90YWwgICAgICA9IDA7CiAgICAgICAgICAgICAgICAgICAgbXkgJFRvdGFsVG90YWwgPSAwOwoKICAgICAgICAgICAgICAgICAgICBpZiAoKCRQYXJhbXtQcm9qZWN0U3RhdHVzU2hvd30gZXEgJ2FsbCcgJiYgISRQYXJhbXtTdGF0dXN9KQogICAgICAgICAgICAgICAgICAgICAgICB8fCAkUGFyYW17UHJvamVjdFN0YXR1c1Nob3d9IGVxICd2YWxpZCcKICAgICAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIyBhY3Rpb24gc29ydCB3cmFwcGVyIC0gYmUgY2FyZWZ1bCBpdHMgbm90IHNpbXVsYXIgd2l0aCBwcm9qZWN0ISEKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJVNvcnRlZEFjdGlvbnMgPSAoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCBteSAkQWN0aW9uSUQgKGtleXMgJXskUHJvamVjdERhdGF7VG90YWx9eyRQcm9qZWN0SUR9fSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFNvcnRlZEFjdGlvbnN7JEFjdGlvbklEfSA9ICRBY3Rpb257JEFjdGlvbklEfXtBY3Rpb259OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte1Jvd1NwYW59Kys7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCBteSAkQWN0aW9uSUQgKHNvcnQgeyRTb3J0ZWRBY3Rpb25zeyRhfSBjbXAgJFNvcnRlZEFjdGlvbnN7JGJ9fSBrZXlzICVTb3J0ZWRBY3Rpb25zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICNmb3JlYWNoIG15ICRBY3Rpb25JRCAoa2V5cyAleyRQcm9qZWN0RGF0YXtUb3RhbH17JFByb2plY3RJRH19KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17QWN0aW9ufSAgICAgPSAkQWN0aW9ueyRBY3Rpb25JRH17QWN0aW9ufTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtIb3Vyc30gICAgICA9IHNwcmludGYgKCIlLjJmIiwgJFByb2plY3REYXRhe1Blck1vbnRofXskUHJvamVjdElEfXskQWN0aW9uSUR9e0hvdXJzfSB8fCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtIb3Vyc1RvdGFsfSA9IHNwcmludGYgKCIlLjJmIiwgJFByb2plY3REYXRhe1RvdGFsfSAgIHskUHJvamVjdElEfXskQWN0aW9uSUR9e0hvdXJzfSAgICB8fCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUb3RhbCAgICAgICs9ICRQYXJhbXtIb3Vyc307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVG90YWxUb3RhbCArPSAkUGFyYW17SG91cnNUb3RhbH07CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdBY3Rpb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbSwgJUZyb250ZW5kfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISRQYXJhbXtQcm9qZWN0fSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtQcm9qZWN0fSAgICAgICAgICAgID0gJFByb2plY3R7UHJvamVjdH17JFByb2plY3RJRH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte1Byb2plY3RJRH0gICAgICAgICAgPSAkUHJvamVjdElEOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtQcm9qZWN0RGVzY3JpcHRpb259ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0ICAgICAgICAgICA9PiAkUHJvamVjdHtQcm9qZWN0RGVzY3JpcHRpb259eyRQcm9qZWN0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIVE1MUmVzdWx0TW9kZSA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXdMaW5lICAgICAgICA9PiA1MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtSb3dTcGFufSsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1Byb2plY3QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHslUGFyYW0sICVGcm9udGVuZH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17Um93U3Bhbn0gPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17Q2xhc3N9ICAgICAgICAgICAgPSAnY29udGVudGtleSc7CiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtBY3Rpb259ICAgICAgICAgICA9ICdUb3RhbCc7CiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtIb3Vyc30gICAgICAgICAgICA9IHNwcmludGYgKCIlLjJmIiwgJFRvdGFsKTsKICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte0hvdXJzVG90YWx9ICAgICAgID0gc3ByaW50ZiAoIiUuMmYiLCAkVG90YWxUb3RhbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtUb3RhbEhvdXJzfSAgICAgICs9ICRUb3RhbDsKICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte1RvdGFsSG91cnNUb3RhbH0gKz0gJFRvdGFsVG90YWw7CiAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdBY3Rpb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtLCAlRnJvbnRlbmR9LAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoISRQYXJhbXtUb3RhbEhvdXJzfSkgewogICAgICAgICAgICAkUGFyYW17VG90YWxIb3Vyc30gPSAwOwogICAgICAgIH0KICAgICAgICBpZiAoISRQYXJhbXtUb3RhbEhvdXJzVG90YWx9KSB7CiAgICAgICAgICAgICRQYXJhbXtUb3RhbEhvdXJzVG90YWx9ID0gMDsKICAgICAgICB9CgogICAgICAgICRQYXJhbXtUb3RhbEhvdXJzfSAgICAgID0gc3ByaW50ZiAoIiUuMmYiLCAkUGFyYW17VG90YWxIb3Vyc30pOwogICAgICAgICRQYXJhbXtUb3RhbEhvdXJzVG90YWx9ID0gc3ByaW50ZiAoIiUuMmYiLCAkUGFyYW17VG90YWxIb3Vyc1RvdGFsfSk7CgogICAgICAgICMgYnVpbGQgb3V0cHV0CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcihUaXRsZSA9PiAiUmVwb3J0aW5nIik7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4geyVQYXJhbSwgJUZyb250ZW5kfSwKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpbWVBY2NvdW50aW5nUmVwb3J0aW5nJwogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgdGltZSBhY2NvdW50aW5nIHByb2plY3QgcmVwb3J0aW5nCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnUHJvamVjdFJlcG9ydGluZycpIHsKICAgICAgICBteSAkT3V0cHV0ICAgPSAnJzsKICAgICAgICBteSAlRnJvbnRlbmQgPSAoKTsKCiAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrCiAgICAgICAgaWYgKCEkU2VsZi0+e0FjY2Vzc1JvfSkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oV2l0aEhlYWRlciA9PiAneWVzJyk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICBmb3JlYWNoIChxdyhQcm9qZWN0SUQpKSB7CiAgICAgICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJF8pOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBuZWVkZWQgcGFyYW1zCiAgICAgICAgZm9yZWFjaCAocXcoUHJvamVjdElEKSkgewogICAgICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gIlByb2plY3RSZXBvcnRpbmc6IE5lZWQgJF8iCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAlQWN0aW9uICAgICAgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+QWN0aW9uU2V0dGluZ3NHZXQoKTsKICAgICAgICBteSAlUHJvamVjdCAgICAgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+UHJvamVjdFNldHRpbmdzR2V0KCk7CiAgICAgICAgJFBhcmFte1Byb2plY3R9ID0gJFByb2plY3R7UHJvamVjdH17JFBhcmFte1Byb2plY3RJRH19OwoKICAgICAgICBteSAlU2hvd25Vc2VycyA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJMaXN0KFR5cGUgPT4gJ0xvbmcnLCBWYWxpZCA9PiAwKTsKICAgICAgICAjIG5lY2Fzc2FyeSBiZWNhdXNlIHRoZSBQcm9qZWN0QWN0aW9uUmVwb3J0aW5nIGlzIG5vdCByZXdvcmtlZAogICAgICAgIG15ICgkU2VjLCAkTWluLCAkSG91ciwgJEN1cnJlbnREYXksICRNb250aCwgJFllYXIpID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZTJEYXRlKAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKSwKICAgICAgICApOwogICAgICAgIG15ICVQcm9qZWN0RGF0YSA9ICgpOwogICAgICAgIG15ICVQcm9qZWN0VGltZSAgICAgPSAoKTsKCiAgICAgICAgIyBPbmx5IG9uZSBmdW5jdGlvbiBzaG91bGQgYmUgZW5vdWdoCiAgICAgICAgZm9yZWFjaCBteSAkVXNlcklEIChrZXlzICVTaG93blVzZXJzKSB7CiAgICAgICAgICAgICMgT3ZlcnZpZXcgcGVyIHByb2plY3QgYW5kIGFjdGlvbgogICAgICAgICAgICAlUHJvamVjdERhdGEgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+UHJvamVjdEFjdGlvblJlcG9ydGluZygKICAgICAgICAgICAgICAgIFllYXIgICA9PiAkWWVhciwKICAgICAgICAgICAgICAgIE1vbnRoICA9PiAkTW9udGgsCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFVzZXJJRCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCRQcm9qZWN0RGF0YXtUb3RhbH17JFBhcmFte1Byb2plY3RJRH19KSB7CiAgICAgICAgICAgICAgICBmb3JlYWNoIG15ICRBY3Rpb25JRCAoa2V5cyAleyRQcm9qZWN0RGF0YXtUb3RhbH17JFBhcmFte1Byb2plY3RJRH19fSkgewogICAgICAgICAgICAgICAgICAgICRQcm9qZWN0VGltZXskQWN0aW9uSUR9eyRVc2VySUR9ID0gJFByb2plY3REYXRhe1RvdGFsfXskUGFyYW17UHJvamVjdElEfX17JEFjdGlvbklEfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSAoJFNob3duVXNlcnN7JFVzZXJJRH0pOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgdGhlIGhlYWRlcmxpbmUKICAgICAgICBmb3JlYWNoIG15ICRVc2VySUQgKHNvcnQgeyRTaG93blVzZXJzeyRhfSBjbXAgJFNob3duVXNlcnN7JGJ9fSBrZXlzICVTaG93blVzZXJzKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdVc2VyTmFtZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHtVc2VyID0+ICRTaG93blVzZXJzeyRVc2VySUR9fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgYmV0dGVyIHNvbHV0aW9uIGZvciBzb3J0IGFjdGlvbnMgbmVjZXNzYXJ5CiAgICAgICAgbXkgJU5ld0FjdGlvbiA9ICgpOwogICAgICAgIGZvcmVhY2ggbXkgJEFjdGlvbklEIChrZXlzICVQcm9qZWN0VGltZSkgewogICAgICAgICAgICAkTmV3QWN0aW9ueyRBY3Rpb25JRH0gPSAkQWN0aW9ueyRBY3Rpb25JRH17QWN0aW9ufTsKICAgICAgICB9CiAgICAgICAgJUFjdGlvbiA9ICVOZXdBY3Rpb247CgogICAgICAgICMgc2hvdyB0aGUgcmVzdWx0cwogICAgICAgIG15ICVUb3RhbCA9ICgpOwogICAgICAgIGZvcmVhY2ggbXkgJEFjdGlvbklEIChzb3J0IHskQWN0aW9ueyRhfSBjbXAgJEFjdGlvbnskYn19IGtleXMgJUFjdGlvbikgewogICAgICAgICAgICBteSAkVG90YWxIb3VycyA9IDA7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBY3Rpb24nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQWN0aW9uID0+ICRBY3Rpb257JEFjdGlvbklEfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBmb3JlYWNoIG15ICRVc2VySUQgKHNvcnQgeyRTaG93blVzZXJzeyRhfSBjbXAgJFNob3duVXNlcnN7JGJ9fSBrZXlzICVTaG93blVzZXJzKSB7CiAgICAgICAgICAgICAgICAkVG90YWxIb3VycyArPSAkUHJvamVjdFRpbWV7JEFjdGlvbklEfXskVXNlcklEfXtIb3Vyc307CiAgICAgICAgICAgICAgICAkVG90YWx7JFVzZXJJRH0gKz0gJFByb2plY3RUaW1leyRBY3Rpb25JRH17JFVzZXJJRH17SG91cnN9OwogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdVc2VyJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgSG91cnMgPT4gc3ByaW50ZiAoIiUuMmYiLCAkUHJvamVjdFRpbWV7JEFjdGlvbklEfXskVXNlcklEfXtIb3Vyc30gfHwgMCksCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgIyBUb3RhbAogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVXNlcicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBIb3VycyA9PiBzcHJpbnRmICgiJS4yZiIsICRUb3RhbEhvdXJzKSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICRQYXJhbXtUb3RhbEFsbH0gPSAwOwogICAgICAgIGZvcmVhY2ggbXkgJFVzZXJJRCAoc29ydCB7JFNob3duVXNlcnN7JGF9IGNtcCAkU2hvd25Vc2Vyc3skYn19IGtleXMgJVNob3duVXNlcnMpIHsKICAgICAgICAgICAgJFBhcmFte1RvdGFsQWxsfSArPSAkVG90YWx7JFVzZXJJRH07CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdVc2VyVG90YWwnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVG90YWwgPT4gc3ByaW50ZiAoIiUuMmYiLCAkVG90YWx7JFVzZXJJRH0pLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRQYXJhbXtUb3RhbEFsbH0gPSBzcHJpbnRmICgiJS4yZiIsICRQYXJhbXtUb3RhbEFsbH0pOwoKICAgICAgICAjIGJ1aWxkIG91dHB1dAogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoVGl0bGUgPT4gIlByb2plY3RSZXBvcnRpbmciKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7JVBhcmFtLCAlRnJvbnRlbmR9LAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGltZUFjY291bnRpbmdQcm9qZWN0UmVwb3J0aW5nJwogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgc2hvdyBlcnJvciBzY3JlZW4KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbihNZXNzYWdlID0+ICJJbnZhbGlkIFN1YmFjdGlvbiBwcm9jZXNzISIpOwp9CgoxOwo=
IyAtLQojIEFnZW50VGltZUFjY291bnRpbmdFZGl0LmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgdGltZSBhY2NvdW50aW5nIGVkaXQKIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogQWdlbnRUaW1lQWNjb3VudGluZ0VkaXQuZHRsLHYgMS42IDIwMDcvMDUvMTEgMTQ6MzY6MzcgdHIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjb2xzcGFuPSIzIiBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkRW52eyJCb3gwIn0kVGV4dHsiRWRpdCBUaW1lIEFjY291bnRpbmcifSRFbnZ7IkJveDEifQogICAgPC90ZD4KICA8L3RyPgo8IS0tIGR0bDpibG9jazpPdmVydmlldyAtLT4KICA8dHI+CiAgICA8dGQgY29sc3Bhbj0iMyIgY2xhc3M9Im1lbnUiPgogICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1PdmVydmlldyZZZWFyPSRMUURhdGF7IlllYXIifSZNb250aD0kTFFEYXRheyJNb250aCJ9IiBjbGFzcz0ibWVudWl0ZW0iPiRUZXh0eyJPdmVydmlldyJ9PC9hPgo8IS0tIGR0bDpibG9jazpDcmVhdGVQcm9qZWN0IC0tPgogICAgICAtCiAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPVByb2plY3RTZXR0aW5nIiBjbGFzcz0ibWVudWl0ZW0iPgogICAgICAkVGV4dHsiUHJvamVjdFNldHRpbmcifQogICAgICA8L2E+CjwhLS0gZHRsOmJsb2NrOkNyZWF0ZVByb2plY3QgLS0+CiAgICA8L3RkPgogIDwvdHI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3IC0tPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiPgogICAgICA8YnI+CiAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI3MDAiIGFsaWduPSJjZW50ZXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkPgogICAgICAgICAgICA8dGFibGUgY2xhc3M9ImNvbnRlbnRib2R5IiBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0iY29tcG9zZSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iICAgIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJFZGl0Ij4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IlRpbWUgc2VsZWN0aW9uIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICREYXRheyJEYXRlIn0KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IlN1Ym1pdCJ9Ij4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgIDx0YWJsZT4KICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICRRRGF0YXsiWWVhciJ9LSRRRGF0YXsiTW9udGgifS0kUURhdGF7IkRheSJ9Jm5ic3A7CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1FZGl0JlllYXI9JExRRGF0YXsiWWVhckJhY2sifSZNb250aD0kTFFEYXRheyJNb250aEJhY2sifSZEYXk9JExRRGF0YXsiRGF5QmFjayJ9Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifWxlZnQtYmlnLnBuZyIgYWx0PSIkVGV4dHsiYmFjayJ9Ij48L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1FZGl0JlllYXI9JExRRGF0YXsiWWVhck5leHQifSZNb250aD0kTFFEYXRheyJNb250aE5leHQifSZEYXk9JExRRGF0YXsiRGF5TmV4dCJ9Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifXJpZ2h0LWJpZy5wbmciIGFsdD0iJFRleHR7Im5leHQifSI+PC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwOwogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6SW5jb21wbGV0ZVRleHQgLS0+CiAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4KICAgICAgICAgICAgICAgICAgICAkVGV4dHsiSW5jb21wbGV0ZSBEYXlzIn06CjwhLS0gZHRsOmJsb2NrOkluY29tcGxldGVXb3JraW5nRGF5cyAtLT4KICAgICAgICAgICAgICAgICAgICAmbmJzcDsKICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1FZGl0JlllYXI9JExRRGF0YXsiWWVhciJ9Jk1vbnRoPSRMUURhdGF7Ik1vbnRoIn0mRGF5PSRMUURhdGF7IkRheSJ9Ij4KICAgICAgICAgICAgICAgICAgICAkRGF0YXsiQm9sZFN0YXJ0In0KICAgICAgICAgICAgICAgICAgICAkUURhdGF7IlllYXIifS0kUURhdGF7Ik1vbnRoIn0tJFFEYXRheyJEYXkifQogICAgICAgICAgICAgICAgICAgICREYXRheyJCb2xkRW5kIn0KICAgICAgICAgICAgICAgICAgICA8L2E+CjwhLS0gZHRsOmJsb2NrOkluY29tcGxldGVXb3JraW5nRGF5cyAtLT4KICAgICAgICAgICAgICAgICAgICAmbmJzcDsKICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkluY29tcGxldGVUZXh0IC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRmb290ZXIiPiZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPGJyPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiAgICB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iRWRpdCI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdGF0dXMiICAgIHZhbHVlPSJBY3Rpb24iPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iWWVhciIgICAgICB2YWx1ZT0iJERhdGF7IlllYXIifSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJNb250aCIgICAgIHZhbHVlPSIkRGF0YXsiTW9udGgifSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJEYXkiICAgICAgIHZhbHVlPSIkRGF0YXsiRGF5In0iPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4KICAgICAgICAgICAgICAgICAgICAkVGV4dHsiRGF0ZSJ9OiAkUURhdGF7IldlZWtkYXlfdG9fVGV4dCJ9ICRRRGF0YXsiWWVhciJ9LSRRRGF0YXsiTW9udGgifS0kUURhdGF7IkRheSJ9CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiIGFsaWduPSJjZW50ZXIiPgo8IS0tIGR0bDpibG9jazpVbml0QmxvY2sgLS0+CiAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IlByb2plY3QifTxzcGFuIGNsYXNzPSJyZXF1aXJlZCI+Kjwvc3Bhbj48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IkFjdGlvbiJ9PHNwYW4gY2xhc3M9InJlcXVpcmVkIj4qPC9zcGFuPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiUmVtYXJrIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IlN0YXJ0dGltZSJ9PHNwYW4gY2xhc3M9IiRRRGF0YXsiQ2xhc3NUaW1lIn0iPio8L3NwYW4+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJFbmR0aW1lIn08c3BhbiBjbGFzcz0iJFFEYXRheyJDbGFzc1RpbWUifSI+Kjwvc3Bhbj48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IlBlcmlvZCJ9PHNwYW4gY2xhc3M9ImZvb3Rub3RlIj4kUURhdGF7IlBlcmlvZE5vdGUifTwvc3Bhbj48L3RkPgogICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VW5pdCAtLT4KICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiREYXRheyJQcm9qZWN0T3B0aW9uIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JERhdGF7IkFjdGlvbk9wdGlvbiJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJSZW1hcmtbJFFEYXRheyJJRCJ9XSIgICAgdmFsdWU9IiRRRGF0YXsiUmVtYXJrIn0iICAgIHNpemU9IjM1Ij48L3RkPgojICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiREYXRheyJTdGFydFRpbWUifSI8L3RkPgojICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiREYXRheyJFbmRUaW1lIn0iPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJTdGFydFRpbWVbJFFEYXRheyJJRCJ9XSIgdmFsdWU9IiRRRGF0YXsiU3RhcnRUaW1lIn0iIHNpemU9IjciPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iRW5kVGltZVskUURhdGF7IklEIn1dIiAgIHZhbHVlPSIkUURhdGF7IkVuZFRpbWUifSIgICBzaXplPSI3Ij48L3RkPgo8IS0tIGR0bDpibG9jazpVbml0SW5wdXRQZXJpb2QgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0iJFFEYXRheyJUZXh0UG9zaXRpb24ifSI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlBlcmlvZFskUURhdGF7IklEIn1dIiAgICB2YWx1ZT0iJFFEYXRheyJQZXJpb2QifSIgICAgc2l6ZT0iNyI+PC90ZD4KPCEtLSBkdGw6YmxvY2s6VW5pdElucHV0UGVyaW9kIC0tPgo8IS0tIGR0bDpibG9jazpVbml0UGVyaW9kV2l0aG91dElucHV0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgYWxpZ249IiRRRGF0YXsiVGV4dFBvc2l0aW9uIn0iPiRRRGF0YXsiUGVyaW9kIn08L3RkPgo8IS0tIGR0bDpibG9jazpVbml0UGVyaW9kV2l0aG91dElucHV0IC0tPgogICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VW5pdFJlcXVpcmVkIC0tPgogICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJyZXF1aXJlZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI2Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiJFFEYXRheyJEZXNjcmlwdGlvbiJ9In0KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlVuaXRSZXF1aXJlZCAtLT4KPCEtLSBkdGw6YmxvY2s6VW5pdFJlYWRvbmx5IC0tPgogICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJyZWFkb25seSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI2Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiJFFEYXRheyJEZXNjcmlwdGlvbiJ9In0KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlVuaXRSZWFkb25seSAtLT4KPCEtLSBkdGw6YmxvY2s6VW5pdCAtLT4KPCEtLSBkdGw6YmxvY2s6VW5pdEJsb2NrIC0tPgogICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjQiPgo8IS0tIGR0bDpibG9jazpPdGhlclRpbWVzIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgdmFsdWU9Ii0yIiBuYW1lPSJMZWF2ZURheSIgJERhdGF7IkxlYXZlRGF5In0+JFRleHR7IkxlYXZlIERheSJ9Jm5ic3A7CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiB2YWx1ZT0iLTEiIG5hbWU9IkRpc2Vhc2VkIiAkRGF0YXsiRGlzZWFzZWQifT4kVGV4dHsiRGlzZWFzZWQifSZuYnNwOwogICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgdmFsdWU9Ii0zIiBuYW1lPSJPdmVydGltZSIgJERhdGF7Ik92ZXJ0aW1lIn0+JFRleHR7Ik92ZXJ0aW1lIn0KPCEtLSBkdGw6YmxvY2s6T3RoZXJUaW1lcyAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDsKICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KPCEtLSBkdGw6YmxvY2s6VG90YWwgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiVG90YWwifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgYWxpZ249IiRRRGF0YXsiVGV4dFBvc2l0aW9uIn0iPiRRRGF0YXsiVG90YWwifSZuYnNwOzwvdGQ+CjwhLS0gZHRsOmJsb2NrOlRvdGFsIC0tPgogICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6UmVxdWlyZWQgLS0+CiAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI2Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyZXF1aXJlZCI+JFRleHR7IiRRRGF0YXsiRGVzY3JpcHRpb24ifSJ9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpSZXF1aXJlZCAtLT4KPCEtLSBkdGw6YmxvY2s6UmVhZG9ubHkgLS0+CiAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI2Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyZWFkb25seSI+JFRleHR7IiRRRGF0YXsiRGVzY3JpcHRpb24ifSJ9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpSZWFkb25seSAtLT4KICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTdWJtaXQifSIgPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiRGVsZXRlIn0iIG5hbWU9IkRlbGV0ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIGFjY2Vzc2tleT0iZyIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IlN1Ym1pdCJ9Ij4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyZXF1aXJlZCI+KiAkVGV4dHsiUmVxdWlyZWQgRmllbGQifTwvZGl2Pgo8IS0tIGR0bDpibG9jazpGb290Tm90ZSAtLT4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb290bm90ZSI+KiAkVGV4dHsiWW91IGhhdmUgdG8gaW5zZXJ0IFN0YXJ0LSBhbmQgRW5kdGltZSBvciBhIFBlcmlvZCJ9PC9kaXY+CjwhLS0gZHRsOmJsb2NrOkZvb3ROb3RlIC0tPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvb3Rub3RlIj4qICRUZXh0eyJJZiB5b3UgdXNlIGFjdGlvbiBtaXNjLCBwbGVhc2UgZ2l2ZSBhbiBleHBsYW5hdGlvbiBpbiB0aGUgZmllbGQgcmVtYXJrIn08L2Rpdj4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgogICAgICA8YnI+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+Cg==
IyAtLQojIEFnZW50VGltZUFjY291bnRpbmdWaWV3LmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9yIHZpZXcgaW5zZXJ0cyBvZiBvbmUgZGF5CiMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDYgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFnZW50VGltZUFjY291bnRpbmdWaWV3LmR0bCx2IDEuMyAyMDA2LzEyLzA4IDE1OjA3OjIzIHRyIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY29sc3Bhbj0iMyIgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7IlZpZXcgVGltZSBBY2NvdW50aW5nIn0kRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY29sc3Bhbj0iMyIgY2xhc3M9Im1lbnUiPgogICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9JEVudnsiTGFzdFNjcmVlbiJ9IiBjbGFzcz0ibWVudWl0ZW0iPiRUZXh0eyJCYWNrIn08L2E+CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSI+CiAgICAgIDxicj4KICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjcwMCIgYWxpZ249ImNlbnRlciIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KPCEtLSBkdGw6YmxvY2s6VXNlciAtLT4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iNCIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJWaWV3IG9mICJ9ICRRRGF0YXsiVXNlciJ9PGJyPjxicj48L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlVzZXIgLS0+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkPgogICAgICAgICAgICA8dGFibGUgY2xhc3M9ImNvbnRlbnRib2R5IiBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0iY29tcG9zZSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iICAgIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJWaWV3Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlVzZXJJRCIgICAgdmFsdWU9IiRRRGF0YXsiVXNlcklEIn0iPgogICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50aGVhZCI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4kVGV4dHsiVGltZSBzZWxlY3Rpb24ifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgJERhdGF7IkRhdGVTZWxlY3Rpb24ifQogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiBhY2Nlc3NrZXk9ImciIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTdWJtaXQifSI+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICA8dGFibGU+CiAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAkUURhdGF7IkRhdGUifSZuYnNwOwogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249VmlldyZZZWFyPSRRRGF0YXsiWWVhckJhY2sifSZNb250aD0kUURhdGF7Ik1vbnRoQmFjayJ9JkRheT0kUURhdGF7IkRheUJhY2sifSZVc2VySUQ9JFFEYXRheyJVc2VySUQifSI+PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn1sZWZ0LWJpZy5wbmciIGFsdD0iJFRleHR7ImJhY2sifSI+PC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwOwogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249VmlldyZZZWFyPSRRRGF0YXsiWWVhck5leHQifSZNb250aD0kUURhdGF7Ik1vbnRoTmV4dCJ9JkRheT0kUURhdGF7IkRheU5leHQifSZVc2VySUQ9JFFEYXRheyJVc2VySUQifSI+PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn1yaWdodC1iaWcucG5nIiBhbHQ9IiRUZXh0eyJuZXh0In0iPjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDsKICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8YnI+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiRGF0ZSJ9OiAkUURhdGF7IldlZWtkYXlfdG9fVGV4dCJ9ICRRRGF0YXsiRGF0ZSJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIxIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiIGFsaWduPSJjZW50ZXIiIHdpZHRoPSI5MCUiPgo8IS0tIGR0bDpibG9jazpVbml0QmxvY2sgLS0+CiAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiUHJvamVjdCJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiQWN0aW9uIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJSZW1hcmsifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IlN0YXJ0dGltZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiRW5kdGltZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiUGVyaW9kIn08L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlVuaXQgLS0+CiAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgPHRkPiRRRGF0YXsiUHJvamVjdCJ9Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kUURhdGF7IkFjdGlvbiJ9Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kUURhdGF7IlJlbWFyayJ9Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPiRRRGF0YXsiU3RhcnRUaW1lIn0mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+JFFEYXRheyJFbmRUaW1lIn0mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+JFFEYXRheyJQZXJpb2QifSZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VW5pdCAtLT4KPCEtLSBkdGw6YmxvY2s6VW5pdEJsb2NrIC0tPgo8IS0tIGR0bDpibG9jazpUb3RhbCAtLT4KICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjQiPgogICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDsKICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IlRvdGFsIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPiRRRGF0YXsiVG90YWwifSZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VG90YWwgLS0+CjwhLS0gZHRsOmJsb2NrOk90aGVyVGltZXMgLS0+CiAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50a2V5IiBhbGlnbj0iY2VudGVyIj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI2Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiB2YWx1ZT0iLTIiIG5hbWU9IkxlYXZlRGF5IiAkRGF0YXsiTGVhdmVEYXkifSBkaXNhYmxlZD4kVGV4dHsiTGVhdmUgRGF5In0mbmJzcDsKICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiB2YWx1ZT0iLTEiIG5hbWU9IkRpc2Vhc2VkIiAkRGF0YXsiRGlzZWFzZWQifSBkaXNhYmxlZD4kVGV4dHsiRGlzZWFzZWQifSZuYnNwOwogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIHZhbHVlPSItMyIgbmFtZT0iT3ZlcnRpbWUiICREYXRheyJPdmVydGltZSJ9IGRpc2FibGVkPiRUZXh0eyJPdmVydGltZSJ9CiAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwOwogICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpPdGhlclRpbWVzIC0tPgo8IS0tIGR0bDpibG9jazpWYWNhdGlvbiAtLT4KICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRrZXkiIGFsaWduPSJjZW50ZXIiPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjYiPgogICAgICAgICAgICAgICAgICAgICAgICAkUURhdGF7IlZhY2F0aW9uIn0KICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7CiAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlZhY2F0aW9uIC0tPgogICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPiZuYnNwOzwvdGQ+PC90cj4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgICAgPGJyPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo=
IyAtLQojIEFnZW50VGltZUFjY291bnRpbmdTZXR0aW5nLmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgdGltZSBhY2NvdW50aW5nIHNldHRpbmdzCiMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDYgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFnZW50VGltZUFjY291bnRpbmdTZXR0aW5nLmR0bCx2IDEuNiAyMDA2LzEyLzA4IDE1OjA3OjIzIHRyIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQo8IS0tIGR0bDpibG9jazpQcm9qZWN0U2V0dGluZyAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJFZGl0IFRpbWUgQWNjb3VudGluZyBQcm9qZWN0IFByZWZlcmVuY2UifSRFbnZ7IkJveDEifQogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWVudSI+CiAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn0kRW52eyJMYXN0U2NyZWVuIn0iIGNsYXNzPSJtZW51aXRlbSI+CiAgICAgICRUZXh0eyJCYWNrIn0KICAgICAgPC9hPgogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiPgogICAgICA8YnI+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlByb2plY3RTZXR0aW5nIj4KICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iNzAwIiBhbGlnbj0iY2VudGVyIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiUHJvamVjdCBTZXR0aW5nIn08L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIiBhbGlnbj0iY2VudGVyIj4KICAgICAgICAgICAgICAgIDx0ciAgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IlByb2plY3QifTxzcGFuIGNsYXNzPSJyZXF1aXJlZCI+Kjwvc3Bhbj48L3RkPgogICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IkRlc2NyaXB0aW9uIn08L3RkPgogICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IlN0YXR1cyJ9PHNwYW4gY2xhc3M9InJlcXVpcmVkIj4qPC9zcGFuPjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpQcm9qZWN0IC0tPgogICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlByb2plY3RbJFFEYXRheyJQcm9qZWN0SUQifV0iIHZhbHVlPSIkUURhdGF7IlByb2plY3QifSIgc2l6ZT0iMzAiPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIHJvd3M9IjIiIG5hbWU9IlByb2plY3REZXNjcmlwdGlvblskUURhdGF7IlByb2plY3RJRCJ9XSIgY29scz0iNDAiPiRRRGF0YXsiUHJvamVjdERlc2NyaXB0aW9uIn08L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQ+JERhdGF7IlN0YXR1c09wdGlvbiJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlByb2plY3QgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgYWNjZXNza2V5PSJnIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiTmV3In0iIG5hbWU9Ik5ld1Byb2plY3QiPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgYWNjZXNza2V5PSJnIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiU3VibWl0In0iIG5hbWU9IkFjdGlvblByb2plY3QiPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICA8L3RhYmxlPgogICAgICA8L2Zvcm0+CiAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI3MDAiIGFsaWduPSJjZW50ZXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgPHRyIGNsYXNzPSJyZXF1aXJlZCI+PHRkPiogJFRleHR7IlJlcXVpcmVkIEZpZWxkIn08L3RkPjwvdHI+CiAgICAgIDwvdGFibGU+CiAgICAgIDxicj4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6UHJvamVjdFNldHRpbmcgLS0+CjwhLS0gZHRsOmJsb2NrOlNldHRpbmcgLS0+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkRW52eyJCb3gwIn0kVGV4dHsiRWRpdCBUaW1lIEFjY291bnRpbmcgUHJlZmVyZW5jZSJ9JEVudnsiQm94MSJ9CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtZW51Ij4KICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249UHJvamVjdFNldHRpbmciIGNsYXNzPSJtZW51aXRlbSI+CiAgICAgICRUZXh0eyJQcm9qZWN0U2V0dGluZyJ9CiAgICAgIDwvYT4KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5ib2R5Ij4KICAgICAgPGJyPgogICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJTZXR0aW5nIj4KICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iNzAwIiBhbGlnbj0iY2VudGVyIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiQWN0aW9uIFNldHRpbmcifTwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiIGFsaWduPSJjZW50ZXIiPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJBY3Rpb24ifTxzcGFuIGNsYXNzPSJyZXF1aXJlZCI+Kjwvc3Bhbj48L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTdGF0dXMifTxzcGFuIGNsYXNzPSJyZXF1aXJlZCI+Kjwvc3Bhbj48L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QWN0aW9uIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkFjdGlvblskUURhdGF7IkFjdGlvbklEIn1dIiB2YWx1ZT0iJFFEYXRheyJBY3Rpb24ifSIgc2l6ZT0iNDAiPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlN0YXR1c09wdGlvbiJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkFjdGlvbiAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiBjb2xzcGFuPSIyIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgYWNjZXNza2V5PSJnIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiTmV3In0iIG5hbWU9Ik5ld0FjdGlvbiI+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiBhY2Nlc3NrZXk9ImciIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTdWJtaXQifSIgbmFtZT0iQWN0aW9uQWN0aW9uIj4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90YWJsZT4KICAgICAgICA8YnI+CiAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjcwMCIgYWxpZ249ImNlbnRlciIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IlVzZXIgU2V0dGluZyJ9PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyIgYWxpZ249ImNlbnRlciI+CjwhLS0gZHRsOmJsb2NrOlVzZXIgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgY29sc3Bhbj0iMyI+JFFEYXRheyJVc2VyIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiRGVzY3JpcHRpb24ifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgJERhdGF7IkRlc2NyaXB0aW9uIn0KICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgcm93cz0iMSIgbmFtZT0iRGVzY3JpcHRpb25bJFFEYXRheyJVc2VySUQifV0iIGNvbHM9IjQwIj48L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJDaGVja2JveCIgbmFtZT0iU2hvd092ZXJ0aW1lWyRRRGF0YXsiVXNlcklEIn1dIiB2YWx1ZT0iMSIgJERhdGF7IlNob3dPdmVydGltZSJ9PgogICAgICAgICAgICAgICAgICAgICRUZXh0eyJTaG93IE92ZXJ0aW1lIn08YnI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9IkNoZWNrYm94IiBuYW1lPSJDcmVhdGVQcm9qZWN0WyRRRGF0YXsiVXNlcklEIn1dIiB2YWx1ZT0iMSIgJERhdGF7IkNyZWF0ZVByb2plY3QifT4KICAgICAgICAgICAgICAgICAgICAkVGV4dHsiQ3JlYXRlIFByb2plY3QifQogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjMiPgogICAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyIgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiPgogICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJTdGFydGRhdGUifTxzcGFuIGNsYXNzPSJyZXF1aXJlZCI+Kjwvc3Bhbj48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IkVuZGRhdGUifTxzcGFuIGNsYXNzPSJyZXF1aXJlZCI+Kjwvc3Bhbj48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IkxlYXZlIERheSJ9PHNwYW4gY2xhc3M9InJlcXVpcmVkIj4qPC9zcGFuPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiV2Vla2x5IEhvdXJzIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7Ik92ZXJ0aW1lIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IlN0YXR1cyJ9PHNwYW4gY2xhc3M9InJlcXVpcmVkIj4qPC9zcGFuPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpQZXJpb2QgLS0+CiAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iRGF0ZVN0YXJ0WyRRRGF0YXsiVXNlcklEIn1dWyRRRGF0YXsiUGVyaW9kIn1dIiB2YWx1ZT0iJFFEYXRheyJEYXRlU3RhcnQifSIgc2l6ZT0iMTIiPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkRhdGVFbmRbJFFEYXRheyJVc2VySUQifV1bJFFEYXRheyJQZXJpb2QifV0iIHZhbHVlPSIkUURhdGF7IkRhdGVFbmQifSIgc2l6ZT0iMTIiPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkxlYXZlRGF5c1skUURhdGF7IlVzZXJJRCJ9XVskUURhdGF7IlBlcmlvZCJ9XSIgdmFsdWU9IiRRRGF0YXsiTGVhdmVEYXlzIn0iIHNpemU9IjUiPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IldlZWtseUhvdXJzWyRRRGF0YXsiVXNlcklEIn1dWyRRRGF0YXsiUGVyaW9kIn1dIiB2YWx1ZT0iJFFEYXRheyJXZWVrbHlIb3VycyJ9IiBzaXplPSI1Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJPdmVydGltZVskUURhdGF7IlVzZXJJRCJ9XVskUURhdGF7IlBlcmlvZCJ9XSIgdmFsdWU9IiRRRGF0YXsiT3ZlcnRpbWUifSIgc2l6ZT0iNSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kRGF0YXsiU3RhdHVzT3B0aW9uIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6UGVyaW9kIC0tPgogICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgY29sc3Bhbj0iMyI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJOZXcgdXNlciBzZXR0aW5nIn0iICBuYW1lPSJOZXdVc2VyU2V0dGluZ1skUURhdGF7IlVzZXJJRCJ9XSI+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMyI+PGhyPjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpVc2VyIC0tPgo8IS0tIGR0bDpibG9jazpOZXdVc2VyT3B0aW9uIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgY29sc3Bhbj0iMyI+CiAgICAgICAgICAgICAgICAgICAgJERhdGF7Ik5ld1VzZXJPcHRpb24ifQogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiBhY2Nlc3NrZXk9ImciIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJOZXcifSIgIG5hbWU9Ik5ld1VzZXIiPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6TmV3VXNlck9wdGlvbiAtLT4KICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgYWNjZXNza2V5PSJnIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiU3VibWl0In0iIG5hbWU9IkFjdGlvblVzZXIiPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICA8L3RhYmxlPgogICAgICA8L2Zvcm0+CiAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI3MDAiIGFsaWduPSJjZW50ZXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgPHRyIGNsYXNzPSJyZXF1aXJlZCI+PHRkPiogJFRleHR7IlJlcXVpcmVkIEZpZWxkIn08L3RkPjwvdHI+CiAgICAgIDwvdGFibGU+CiAgICAgIDxicj4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6U2V0dGluZyAtLT4K
IyAtLQojIEFnZW50VGltZUFjY291bnRpbmdPdmVydmlldy5kdGwgLSBwcm92aWRlcyBIVE1MIGZvcm0gZm9yIHRpbWUgYWNjb3VudGluZyBvdmVydmlldwojIENvcHlyaWdodCAoQykgMjAwMy0yMDA3IE9UUlMgR21iSCwgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBBZ2VudFRpbWVBY2NvdW50aW5nT3ZlcnZpZXcuZHRsLHYgMS43IDIwMDcvMDUvMTEgMTQ6MzY6MzcgdHIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkRW52eyJCb3gwIn0kVGV4dHsiVGltZSBBY2NvdW50aW5nIE92ZXJ2aWV3IHBlciBNb250aCJ9JEVudnsiQm94MSJ9CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSI+CiAgICAgIDxicj4KICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjMzJSIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIyIiBhbGlnbj0iY2VudGVyIj4KPCEtLSBkdGw6YmxvY2s6VXNlciAtLT4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iNCIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJPdmVydmlldyBvZiAifSAkUURhdGF7IlVzZXIifTxicj48L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlVzZXIgLS0+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNvbHNwYW49IjQiIGFsaWduPSJjZW50ZXIiPgogICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1PdmVydmlldyZZZWFyPSRMUURhdGF7IlllYXJCYWNrIn0mTW9udGg9JExRRGF0YXsiTW9udGhCYWNrIn0mVXNlcklEPSRMUURhdGF7IlVzZXJJRCJ9Ij4KICAgICAgICAgICAgJiMwNjA7JiMwNjA7CiAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgJm5ic3A7Jm5ic3A7CiAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPU92ZXJ2aWV3JlllYXI9JExRRGF0YXsiWWVhck5leHQifSZNb250aD0kTFFEYXRheyJNb250aE5leHQifSZVc2VySUQ9JExRRGF0YXsiVXNlcklEIn0iPgogICAgICAgICAgICAmIzA2MjsmIzA2MjsKICAgICAgICAgICAgPC9hPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjb2xzcGFuPSI0IiBjbGFzcz0iY29udGVudGhlYWQiIGFsaWduPSJjZW50ZXIiPgogICAgICAgICAgICAkVGV4dHsiJFFEYXRheyJNb250aF90b19UZXh0In0ifSAkUURhdGF7IlllYXIifQogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpSb3cgLS0+CiAgICAgICAgPHRyICREYXRheyJTdHlsZSJ9PgogICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiPgogICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj0kTFFEYXRheyJTdWJhY3Rpb24ifSZZZWFyPSRMUURhdGF7IlllYXIifSZNb250aD0kTFFEYXRheyJNb250aCJ9JkRheT0kTFFEYXRheyJEYXkifSZVc2VySUQ9JExRRGF0YXsiVXNlcklEIn0iPgogICAgICAgICAgICAkUURhdGF7IkRheSJ9CiAgICAgICAgICAgIDwvYT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8dGQ+JFFEYXRheyJXZWVrZGF5X3RvX1RleHQifTwvdGQ+CiAgICAgICAgICA8dGQ+JFRleHR7IiRRRGF0YXsiQ29tbWVudCJ9In08L3RkPgogICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+JFFEYXRheyJXb3JraW5nSG91cnMifTwvdGQ+CiAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6Um93IC0tPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjb2xzcGFuPSIzIiBjbGFzcz0iY29udGVudGhlYWQiIGFsaWduPSJsZWZ0Ij4kVGV4dHsiV29ya2luZ0hvdXJzIn06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiIGFsaWduPSJyaWdodCI+JFFEYXRheyJXb3JraW5nSG91cnMifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgICAgPGJyPgogICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMzMlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIGFsaWduPSJjZW50ZXIiPgo8IS0tIGR0bDpibG9jazpPdmVydGltZSAtLT4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRoZWFkIj4KICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4kVGV4dHsiT3ZlcnRpbWUifTo8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiZuYnNwOyRUZXh0eyJ0aGlzIG1vbnRoIn06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIiBhbGlnbj0icmlnaHQiPiRRRGF0YXsiT3ZlcnRpbWUifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+Jm5ic3A7JFRleHR7InVudGlsIn06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIiBhbGlnbj0icmlnaHQiPiRRRGF0YXsiT3ZlcnRpbWVVbnRpbCJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudGhlYWQiPgogICAgICAgICAgPHRkPiRUZXh0eyJPdmVydGltZSB0b3RhbCJ9OjwvdGQ+CiAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4kUURhdGF7Ik92ZXJ0aW1lVG90YWwifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Jm5ic3A7PC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpPdmVydGltZSAtLT4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRoZWFkIj4KICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4kVGV4dHsiTGVhdmUgRGF5cyJ9OjwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+Jm5ic3A7JFRleHR7IkxlYXZlRGF5IHRoaXMgbW9udGgifTo8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIGFsaWduPSJyaWdodCI+JFFEYXRheyJMZWF2ZURheSJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4mbmJzcDskVGV4dHsiTGVhdmVEYXlUb3RhbCJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgYWxpZ249InJpZ2h0Ij4kUURhdGF7IkxlYXZlRGF5VG90YWwifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRoZWFkIj4KICAgICAgICAgIDx0ZD4kVGV4dHsiTGVhdmVEYXkgcmVtYWluaW5nIn06PC90ZD4KICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPiRRRGF0YXsiTGVhdmVEYXlSZW1haW5pbmcifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Jm5ic3A7PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudGhlYWQiPgogICAgICAgICAgPHRkIGNvbHNwYW49IjIiPiRUZXh0eyJEaXNlYXNlZCJ9OjwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+Jm5ic3A7JFRleHR7IkRpc2Vhc2VkIHRoaXMgbW9udGgifTo8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIGFsaWduPSJyaWdodCI+JFFEYXRheyJEaXNlYXNlZCJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4mbmJzcDskVGV4dHsiRGlzZWFzZWRUb3RhbCJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgYWxpZ249InJpZ2h0Ij4kUURhdGF7IkRpc2Vhc2VkVG90YWwifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgPHRkIGNvbHNwYW49IjIiPiZuYnNwOzwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgICAgPGJyPgogICAgICA8dGFibGUgY2xhc3M9ImNvbnRlbnRib2R5IiBib3JkZXI9IjAiIHdpZHRoPSI1MCUiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCIgYWxpZ249ImNlbnRlciI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IlByb2plY3QgUmVwb3J0aW5nIn06CiAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPU92ZXJ2aWV3JlllYXI9JExRRGF0YXsiWWVhciJ9Jk1vbnRoPSRMUURhdGF7Ik1vbnRoIn0mUHJvamVjdFN0YXR1c1Nob3c9JExRRGF0YXsiUHJvamVjdFN0YXR1c1Nob3cifSZVc2VySUQ9JExRRGF0YXsiVXNlcklEIn0iPgogICAgICAgICAgICAoJFRleHR7IlNob3cifSAkVGV4dHsiJFFEYXRheyJQcm9qZWN0U3RhdHVzU2hvdyJ9In0gJFRleHR7IlByb2plY3RzIn0pCiAgICAgICAgICAgIDwvYT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBhbGlnbj0iY2VudGVyIj4KICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPiZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+JFRleHR7InBlciBNb250aCJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiVG90YWwifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJQcm9qZWN0In08L3RkPgogICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJBY3Rpb24ifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IkhvdXJzIn08L3RkPgogICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJIb3VycyJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBY3Rpb24gLS0+CiAgICAgICAgICAgICAgPHRyPgo8IS0tIGR0bDpibG9jazpQcm9qZWN0IC0tPgogICAgICAgICAgICAgICAgPHRkIHJvd3NwYW49IiREYXRheyJSb3dTcGFuIn0iIHZhbGlnbj0idG9wIj4KICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbnRlbnRrZXkkUURhdGF7IlN0YXR1cyJ9Ij4KPCEtLSBkdGw6YmxvY2s6UHJvamVjdE5vTGluayAtLT4KICAgICAgICAgICAgICAgICAgJERhdGF7IlByb2plY3QifQo8IS0tIGR0bDpibG9jazpQcm9qZWN0Tm9MaW5rIC0tPgo8IS0tIGR0bDpibG9jazpQcm9qZWN0TGluayAtLT4KICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249UHJvamVjdFJlcG9ydGluZyZQcm9qZWN0SUQ9JFFEYXRheyJQcm9qZWN0SUQifSI+CiAgICAgICAgICAgICAgICAgICREYXRheyJQcm9qZWN0In0KICAgICAgICAgICAgICAgICAgPC9hPgo8IS0tIGR0bDpibG9jazpQcm9qZWN0TGluayAtLT4KICAgICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgICA8YnI+CiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb250ZW50dmFsdWUkUURhdGF7IlN0YXR1cyJ9Ij4kRGF0YXsiUHJvamVjdERlc2NyaXB0aW9uIn08L3NwYW4+CiAgICAgICAgICAgICAgICA8L3RkPgo8IS0tIGR0bDpibG9jazpQcm9qZWN0IC0tPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNsYXNzIn0kUURhdGF7IlN0YXR1cyJ9IiA+JFFEYXRheyJBY3Rpb24ifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ2xhc3MifSRRRGF0YXsiU3RhdHVzIn0iIGFsaWduPSJyaWdodCI+JFFEYXRheyJIb3VycyJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDbGFzcyJ9JFFEYXRheyJTdGF0dXMifSIgYWxpZ249InJpZ2h0Ij4kUURhdGF7IkhvdXJzVG90YWwifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QWN0aW9uIC0tPgogICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+JFRleHR7IlRvdGFsIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+JFFEYXRheyJUb3RhbEhvdXJzIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+JFFEYXRheyJUb3RhbEhvdXJzVG90YWwifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPiZuYnNwOzwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgICAgPGJyPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo=
IyAtLQojIEFnZW50VGltZUFjY291bnRpbmdSZXBvcnRpbmcuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciB0aW1lIGFjY291bnRpbmcgcmVwb3J0aW5nCiMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFnZW50VGltZUFjY291bnRpbmdSZXBvcnRpbmcuZHRsLHYgMS43IDIwMDcvMDUvMTEgMTQ6MzY6MzcgdHIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7IlRpbWUgUHJlcG9ydGluZyJ9OiAkVGV4dHsiJFFEYXRheyJNb250aF90b19UZXh0In0ifSAkUURhdGF7IlllYXIifSAkRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5ib2R5Ij4KICAgICAgPGJyPgogICAgICA8dGFibGUgY2xhc3M9ImNvbnRlbnRib2R5IiBib3JkZXI9IjAiIHdpZHRoPSI1MCUiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCIgYWxpZ249ImNlbnRlciI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50aGVhZCIgPiRUZXh0eyJUaW1lIHNlbGVjdGlvbiJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBuYW1lPSJjb21wb3NlIj4KICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iICAgIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iUmVwb3J0aW5nIj4KICAgICAgICAgICAgICAkRGF0YXsiTW9udGhPcHRpb24ifQogICAgICAgICAgICAgICREYXRheyJZZWFyT3B0aW9uIn0KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgYWNjZXNza2V5PSJnIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiU3VibWl0In0iPgogICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICA8L3RkPgogICAgICAgICAgPHRkPgogICAgICAgICAgICA8dGFibGU+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAkVGV4dHsiJFFEYXRheyJNb250aF90b19UZXh0In0ifSAkUURhdGF7IlllYXIifQogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249UmVwb3J0aW5nJlllYXI9JExRRGF0YXsiWWVhckJhY2sifSZNb250aD0kTFFEYXRheyJNb250aEJhY2sifSI+PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn1sZWZ0LWJpZy5wbmciIGFsdD0iJFRleHR7Ik9uZSBkYXkgYmFjayJ9Ij48L2E+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1SZXBvcnRpbmcmWWVhcj0kTFFEYXRheyJZZWFyTmV4dCJ9Jk1vbnRoPSRMUURhdGF7Ik1vbnRoTmV4dCJ9Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifXJpZ2h0LWJpZy5wbmciIGFsdD0iJFRleHR7Ik5leHQgZGF5In0iPjwvYT4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRmb290ZXIiPiZuYnNwOzwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgICAgPGJyPgogICAgICA8dGFibGUgY2xhc3M9ImNvbnRlbnRib2R5IiBib3JkZXI9IjAiIHdpZHRoPSI1MCUiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCIgYWxpZ249ImNlbnRlciI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IlVzZXIgUmVwb3J0aW5nIn06PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGFsaWduPSJjZW50ZXIiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMiI+CiAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAgIDx0ZD4mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjQiPiRUZXh0eyJwZXIgTW9udGgifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+JFRleHR7IlRvdGFsIn08L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiVXNlciJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiV29ya2luZyBIb3VycyJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiT3ZlcnRpbWUifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IkxlYXZlIERheXMifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IkRpc2Vhc2VkIn08L3RkPgogICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJPdmVydGltZSJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiTGVhdmVEYXkgUmVtYWluaW5nIn08L3RkPgogICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlVzZXIgLS0+CiAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1PdmVydmlldyZZZWFyPSRMUURhdGF7IlllYXIifSZNb250aD0kTFFEYXRheyJNb250aCJ9JlVzZXJJRD0kTFFEYXRheyJVc2VySUQifSI+CiAgICAgICAgICAgICAgICAgICRRRGF0YXsiVXNlciJ9CiAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4kUURhdGF7IldvcmtpbmdIb3VycyJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPiZuYnNwOyRRRGF0YXsiT3ZlcnRpbWUifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4kUURhdGF7IkxlYXZlRGF5In08L3RkPgogICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+JFFEYXRheyJEaXNlYXNlZCJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPiZuYnNwOyRRRGF0YXsiT3ZlcnRpbWVUb3RhbCJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPiRRRGF0YXsiTGVhdmVEYXlSZW1haW5pbmcifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VXNlciAtLT4KICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJUb3RhbCJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPiRRRGF0YXsiVG90YWxXb3JraW5nSG91cnMifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4kUURhdGF7IlRvdGFsT3ZlcnRpbWUifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4kUURhdGF7IlRvdGFsTGVhdmVEYXkifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4kUURhdGF7IlRvdGFsRGlzZWFzZWQifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4kUURhdGF7IlRvdGFsT3ZlcnRpbWVUb3RhbCJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPiRRRGF0YXsiVG90YWxMZWF2ZURheVJlbWFpbmluZyJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+Jm5ic3A7PC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgogICAgICA8YnI+CiAgICAgIDx0YWJsZSBjbGFzcz0iY29udGVudGJvZHkiIGJvcmRlcj0iMCIgd2lkdGg9IjUwJSIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIiBhbGlnbj0iY2VudGVyIj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4KICAgICAgICAgICAgJFRleHR7IlByb2plY3QgUmVwb3J0aW5nIn06CiAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPVJlcG9ydGluZyZZZWFyPSRMUURhdGF7IlllYXIifSZNb250aD0kTFFEYXRheyJNb250aCJ9JlByb2plY3RTdGF0dXNTaG93PSRMUURhdGF7IlByb2plY3RTdGF0dXNTaG93In0iPgogICAgICAgICAgICAoJFRleHR7IlNob3cifSAkVGV4dHsiJFFEYXRheyJQcm9qZWN0U3RhdHVzU2hvdyJ9In0gJFRleHR7IlByb2plY3RzIn0pCiAgICAgICAgICAgIDwvYT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBhbGlnbj0iY2VudGVyIj4KICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPiZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+JFRleHR7InBlciBNb250aCJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiVG90YWwifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJQcm9qZWN0In08L3RkPgogICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJBY3Rpb24ifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IkhvdXJzIn08L3RkPgogICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJIb3VycyJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBY3Rpb24gLS0+CiAgICAgICAgICAgICAgPHRyPgo8IS0tIGR0bDpibG9jazpQcm9qZWN0IC0tPgogICAgICAgICAgICAgICAgPHRkIHJvd3NwYW49IiREYXRheyJSb3dTcGFuIn0iIHZhbGlnbj0idG9wIj4KICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbnRlbnRrZXkkUURhdGF7IlN0YXR1cyJ9Ij4KICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249UHJvamVjdFJlcG9ydGluZyZQcm9qZWN0SUQ9JFFEYXRheyJQcm9qZWN0SUQifSI+CiAgICAgICAgICAgICAgICAgICREYXRheyJQcm9qZWN0In0KICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICAgIDxicj4KICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbnRlbnR2YWx1ZSRRRGF0YXsiU3RhdHVzIn0iPiREYXRheyJQcm9qZWN0RGVzY3JpcHRpb24ifTwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvdGQ+CjwhLS0gZHRsOmJsb2NrOlByb2plY3QgLS0+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ2xhc3MifSRRRGF0YXsiU3RhdHVzIn0iID4kUURhdGF7IkFjdGlvbiJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDbGFzcyJ9JFFEYXRheyJTdGF0dXMifSIgYWxpZ249InJpZ2h0Ij4kUURhdGF7IkhvdXJzIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNsYXNzIn0kUURhdGF7IlN0YXR1cyJ9IiBhbGlnbj0icmlnaHQiPiRRRGF0YXsiSG91cnNUb3RhbCJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBY3Rpb24gLS0+CiAgICAgICAgICAgICAgPHRyICBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+JFRleHR7IlRvdGFsIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+JFFEYXRheyJUb3RhbEhvdXJzIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+JFFEYXRheyJUb3RhbEhvdXJzVG90YWwifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPiZuYnNwOzwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgICAgPGJyPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo=
IyAtLQojIEFnZW50VGltZUFjY291bnRpbmdQcm9qZWN0UmVwb3J0aW5nLmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgdGltZSBhY2NvdW50aW5nIHJlcG9ydGluZwojIENvcHlyaWdodCAoQykgMjAwMy0yMDA2IE9UUlMgR21iSCwgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBBZ2VudFRpbWVBY2NvdW50aW5nUHJvamVjdFJlcG9ydGluZy5kdGwsdiAxLjIgMjAwNi8xMi8wOCAxNTowNzoyMyB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkRW52eyJCb3gwIn0kVGV4dHsiVGltZSBQcm9qZWN0IFByZXBvcnRpbmcifTogJFFEYXRheyJQcm9qZWN0In0gJEVudnsiQm94MSJ9CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtZW51Ij4KICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifSRFbnZ7Ikxhc3RTY3JlZW4ifSIgY2xhc3M9Im1lbnVpdGVtIj4kVGV4dHsiQmFjayJ9PC9hPgogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiPgogICAgICA8YnI+CiMgICAgICA8dGFibGUgY2xhc3M9ImNvbnRlbnRib2R5IiBib3JkZXI9IjAiIHdpZHRoPSI1MCUiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCIgYWxpZ249ImNlbnRlciI+CiMgICAgICAgIDx0cj4KIyAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRoZWFkIiA+JFRleHR7IlRpbWUgc2VsZWN0aW9uIn08L3RkPgojICAgICAgICA8L3RyPgojICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiMgICAgICAgICAgPHRkPgojICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBuYW1lPSJjb21wb3NlIj4KIyAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiAgICB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgojICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJSZXBvcnRpbmciPgojICAgICAgICAgICAgICAkRGF0YXsiTW9udGhPcHRpb24ifQojICAgICAgICAgICAgICAkRGF0YXsiWWVhck9wdGlvbiJ9CiMgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiBhY2Nlc3NrZXk9ImciIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTdWJtaXQifSI+CiMgICAgICAgICAgICA8L2Zvcm0+CiMgICAgICAgICAgPC90ZD4KIyAgICAgICAgICA8dGQ+CiMgICAgICAgICAgICA8dGFibGU+CiMgICAgICAgICAgICAgIDx0cj4KIyAgICAgICAgICAgICAgICA8dGQ+CiMgICAgICAgICAgICAgICAgICAkVGV4dHsiJFFEYXRheyJNb250aF90b19UZXh0In0ifSAkUURhdGF7IlllYXIifQojICAgICAgICAgICAgICAgIDwvdGQ+CiMgICAgICAgICAgICAgICAgPHRkPgojICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249UmVwb3J0aW5nJlllYXI9JFFEYXRheyJZZWFyQmFjayJ9Jk1vbnRoPSRRRGF0YXsiTW9udGhCYWNrIn0iPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRFbnZ7IkltYWdlcyJ9bGVmdC1iaWcucG5nIiBhbHQ9IiRUZXh0eyJPbmUgZGF5IGJhY2sifSI+PC9hPgojICAgICAgICAgICAgICAgIDwvdGQ+CiMgICAgICAgICAgICAgICAgPHRkPgojICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249UmVwb3J0aW5nJlllYXI9JFFEYXRheyJZZWFyTmV4dCJ9Jk1vbnRoPSRRRGF0YXsiTW9udGhOZXh0In0iPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRFbnZ7IkltYWdlcyJ9cmlnaHQtYmlnLnBuZyIgYWx0PSIkVGV4dHsiTmV4dCBkYXkifSI+PC9hPgojICAgICAgICAgICAgICAgIDwvdGQ+CiMgICAgICAgICAgICAgIDwvdHI+CiMgICAgICAgICAgICA8L3RhYmxlPgojICAgICAgICAgIDwvdGQ+CiMgICAgICAgIDwvdHI+CiMgICAgICAgIDx0cj4KIyAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRmb290ZXIiPiZuYnNwOzwvdGQ+CiMgICAgICAgIDwvdHI+CiMgICAgICA8L3RhYmxlPgojICAgICAgPGJyPgogICAgICA8dGFibGUgY2xhc3M9ImNvbnRlbnRib2R5IiBib3JkZXI9IjAiIHdpZHRoPSI1MCUiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCIgYWxpZ249ImNlbnRlciI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+CiAgICAgICAgICAgICRUZXh0eyJQcm9qZWN0IFJlcG9ydGluZyJ9OiAkUURhdGF7IlByb2plY3QifQogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGFsaWduPSJjZW50ZXIiPgogICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IkFjdGlvbiJ9PC90ZD4KPCEtLSBkdGw6YmxvY2s6VXNlck5hbWUgLS0+CiAgICAgICAgICAgICAgICA8dGQ+JFFEYXRheyJVc2VyIn08L3RkPgo8IS0tIGR0bDpibG9jazpVc2VyTmFtZSAtLT4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiVG90YWwifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QWN0aW9uIC0tPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7IkFjdGlvbiJ9PC90ZD4KPCEtLSBkdGw6YmxvY2s6VXNlciAtLT4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIiBhbGlnbj0icmlnaHQiPiRRRGF0YXsiSG91cnMifTwvdGQ+CjwhLS0gZHRsOmJsb2NrOlVzZXIgLS0+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QWN0aW9uIC0tPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlRvdGFsIn08L3RkPgo8IS0tIGR0bDpibG9jazpVc2VyVG90YWwgLS0+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIGFsaWduPSJyaWdodCI+JFFEYXRheyJUb3RhbCJ9PC90ZD4KPCEtLSBkdGw6YmxvY2s6VXNlclRvdGFsIC0tPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiBhbGlnbj0icmlnaHQiPiRRRGF0YXsiVG90YWxBbGwifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPiZuYnNwOzwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgICAgPGJyPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo=
IyAtLQojIEFnZW50VGltZUFjY291bnRpbmdEZWxldGUuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBkZWxldGUgYSBkYXkgb2YgdGltZWFjY291bnRpbmcKIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNSBPVFJTIEdtYkgsIGh0dHA6Ly93d3cub3Rycy5kZS8KIyAtLQojICRJZDogQWdlbnRUaW1lQWNjb3VudGluZ0RlbGV0ZS5kdGwsdiAxLjEuMS4xIDIwMDUvMDkvMDUgMTI6MTg6NDMgdHIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCjwhLS0gc3RhcnQgZm9ybSAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJEZWxldGUifTogJFRleHR7IlRpbWVBY2NvdW50aW5nIG9mIn0gJFFEYXRheyJZZWFyIn0tJFFEYXRheyJNb250aCJ9LSRRRGF0YXsiRGF5In0kRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KIyAgPHRyPgojICAgIDx0ZCBjbGFzcz0ibWVudSI+CiMgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9JEVudnsiTGFzdFNjcmVlblZpZXcifSIgY2xhc3M9Im1lbnVpdGVtIj4kVGV4dHsiQmFjayJ9PC9hPgojICAgIDwvdGQ+CiMgIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSI+CiAgICAgIDxicj4KICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjM1MCIgYWxpZ249ImNlbnRlciIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiT3B0aW9ucyJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgID4kVGV4dHsiRGVsZXRlIn06IDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFRleHR7IlRpbWVBY2NvdW50aW5nIG9mIn0gJFFEYXRheyJZZWFyIn0tJFFEYXRheyJNb250aCJ9LSRRRGF0YXsiRGF5In08L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPiZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJEbyB5b3UgcmVhbGx5IHdhbnQgdG8gZGVsZXRlIHRoaXMgT2JqZWN0In0/PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPUVkaXQmWWVhcj0kUURhdGF7IlllYXIifSZNb250aD0kUURhdGF7Ik1vbnRoIn0mRGF5PSRRRGF0YXsiRGF5In0iIj4kVGV4dHsiTm8ifTwvYT4gPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249RGVsZXRlJlllYXI9JFFEYXRheyJZZWFyIn0mTW9udGg9JFFEYXRheyJNb250aCJ9JkRheT0kUURhdGF7IkRheSJ9Ij4kVGV4dHsiWWVzIn08L2E+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CiAgICAgIDxicj4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBlbmQgZm9ybSAtLT4K
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9Ob3RpZmljYXRpb25UaW1lQWNjb3VudGluZy5wbQojIENvcHlyaWdodCAoQykgMjAwMy0yMDA2IE9UUlMgR21iSCwgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBOb3RpZmljYXRpb25UaW1lQWNjb3VudGluZy5wbSx2IDEuMiAyMDA2LzEyLzA4IDE1OjA3OjIzIHRyIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6Tm90aWZpY2F0aW9uVGltZUFjY291bnRpbmc7Cgp1c2Ugc3RyaWN0Owp1c2UgS2VybmVsOjpTeXN0ZW06OlRpbWVBY2NvdW50aW5nOwp1c2UgS2VybmVsOjpTeXN0ZW06OlRpbWU7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4yICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87CgpzdWIgbmV3IHsKICAgIG15ICRUeXBlID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyAoJFNlbGYsICRUeXBlKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgZm9yZWFjaCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgVXNlcklEKSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgICRTZWxmLT57VGltZU9iamVjdH0gICAgPSBLZXJuZWw6OlN5c3RlbTo6VGltZSAgICAgICAgICAtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6VGltZUFjY291bnRpbmctPm5ldyglUGFyYW0pOwogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICgkU2VjLCAkTWluLCAkSG91ciwgJERheSwgJE1vbnRoLCAkWWVhcikgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMkRhdGUoCiAgICAgICAgU3lzdGVtVGltZSA9PiAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCksCiAgICApOwogICAgbXkgJVVzZXIgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+VXNlckN1cnJlbnRQZXJpb2RHZXQoCiAgICAgICAgWWVhciAgPT4gJFllYXIsCiAgICAgICAgTW9udGggPT4gJE1vbnRoLAogICAgICAgIERheSAgID0+ICREYXksCiAgICApOwogICAgaWYgKCRVc2VyeyRTZWxmLT57VXNlcklEfX0pewogICAgICAgIG15ICVJbmNvbXBsZXRlV29ya2luZ0RheXMgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+V29ya2luZ1VuaXRzQ29tcGxldG5lc3NDaGVjaygpOwogICAgICAgICMgcmVkaXJlY3QgaWYgaW5jb21wbGV0ZSB3b3JraW5nIGRheSBhcmUgb3V0IG9mIHJhbmdlCiAgICAgICAgaWYgKCRJbmNvbXBsZXRlV29ya2luZ0RheXN7V2FybmluZ30pIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm90aWZ5KAogICAgICAgICAgICAgICAgSW5mbyAgICAgPT4gJ1BsZWFzZSBpbnNlcnQgeW91ciB3b3JraW5nIGhvdXJzIScsCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQp9CgoxOwo=
iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABmJLR0QA/wD/AP+gvaeTAAAEo0lEQVQ4y42VW2yURRTHf99lu7tdSr/laoBCa28qERaRRChSUWKEYKhcEqMEKoIKIdbGEDHRaIhCMJK2MZHEB60aHlRCMEDkQSlGFC1Bti1eCoFuuZV7lwK97DdzxoduSxERTnIyk8nM7/wzc+YcyxjDnSxv0U7PaIkZpRGt4yd3LUze6Yx1O3Dh0u9jRusKUbrMKO2J0oivMEojSifFV9vFVzXn9y+L3xW4+MU6z4hUidblxsskK38Y9xVEKRwVIdO1ONDSwemjFzlZ34Lfch6jVK0oqbzcuCp5W3Dx8jrPiKkj6MTGlOTycslIysaFEAPraw+TEw0wd04xKQMHL/p8/kMr+z/dh7rYERelZ145UtkPt/uhK/Z6xpg6OysYm7ckxmfzx/JUToiUgG9g3NAMRkSDCCAGxkcDvLeggBUflOGOyI6Jr+sGjd3o3QI2IlV20I3NWjSeiknZBB2LlECPQErg6dlFTJmaiza94FOtCcTA3GKP8vXzcLMzY6J01U3gomV7YkZL+Zjpebw0IRtlelWmBFLp0Tc3/HBjnPklk9iw5lVSGqbneUxd9TjG1+WhIe/G+sFGpCI8PMKCKSMI2L1KB3pPH1zgcEOcJbNnIiLEZjxB8loX3RrufziXwcX3IEpX3ABrKRtaMIwJQzPw04CBavu8aQD0rc1fMGTiozRetdjdepXWjh5Glz6A+LoMwM1/breHMV5hwRC0segWCNhgG7Ct3vtqbopzujXB2ytfQIuwurqWzvxHaE8F6dGKoANiLEZNzKFBa8+yX/dsIxITpYlGw9R+9Se7vjvCNQVdGro1JBIJ1jz/DIn6H7l6JcmMxSu50K05+3cDgwI2gwI2l5rP0/ztIYaN9hClwRBzjdIYLbi2RfJckizCXEmlVVtw9HgCz/MoLS2lurqa3Zs39uf9up9PEMkehnO9E3O5g7BrQfpfuEYkLkrTmezkyaXTCNqQTIMdC+6dUkpR6WzWrtvAKxs+YvDQkWgDSgwR18Z1bWKlBRSW5NN2or0vZtwyxpAz55v20oUTvIem5ZHpWoRdi7BjEXYhaFu4NvjdXThuAByXlBh6tKFLGTqV4boyXPeFX7f9zo53tiWN2RS1AUTp7Ud+ayVoG8IORFzICsCggEVWhsXggM3wwRGimRlkBWyyAjYR175JRMixOLzzEMD2/nQTX9Wc+OssZ46eJ+iQVmsRcW0irkXE7Q0WSQeNuBaRgEXYtQk5FkHH4sTBBC0HWgBq+sFtdYvjxle1Wz/eh+7yCaYVhB0I25DppKFO7zzkQCi9J+hY+Ne72fLmVoBaYzbFb6oVoqXyUltH/MM3dpDqTJFhWwQsCKbBe/afpqmpjZDduxZIe8/Vbt5/9hMunmqPA5W3FKEL9cuTovTMRPO5+GtLttB48CSuBQELMmxobjxN27EL/dniAA2/HGP1rCoSf5yJAzON2ZS8baHPLqryjNJV4uvyyZNHs2jBgzxWMo6CXA9toPn4Zer2HuPrLw9Q/9MxgFqgciD0f1tTZNT6mPi6QnxVJkp7RinE1xgRgGT69Wv67vSue95Ac0Nrvb6vjyH+b3X/Zf8AFuFkUCNJ29gAAAAASUVORK5CYII=