JIRAPackage
6.1.0
catworkx GmbH
http://www.catworkx.com
GNU AFFERO GENERAL PUBLIC LICENSE Version 3, November 2007
fix AMSOTRSTOJ-204: avoid double '/' in link to OTRS
Fix bug: ArticleGet is *not* a method of the ArticleObject (use the BackendObject instead)
Fix bug: Filling Multiselects resulted in a 400 response code as the values weren't build correctly. This is fixed now.
Fix bug: Jira user was marked as invalid as the list of assignable users was too short. Ask for 1000 users, now...
Fix bug: Server error occured on closing a ticket due to a typo
port Addon for OTRS6
fix ACL handling. Now it is possible to hide the button via ACLs
add queue specific settings (project and assignee)
do not search for description. search term should search for issue id as well
clean up summary - all vertical spaces are removed
new feature: set format for comments to be transferred to JIRA
new feature: setting the reporter can be disabled
fix bug: mapping created with the wizard is correct now (std:reporter:name instead of std:reporter)
fix bug: custom fields had a superfluous ':' in the mapping
fix bug: select fields weren't handled correctly.
Fix sending attachments with newer JIRA::REST releases
Improve wizard
Improve wizard
Add wizard for JIRA connector configuration
fix bug: utf-8 chars in attachment filenames led to internal server error
when no article is available, the ticket data is taken for the issue creation
Now article attachments for issue updates are sent to JIRA, too
When SysConfig option TransferTicketHistory is set to 'all articles', all articles of the ticket are sent to JIRA
Improve options for dialog: Now you can really hide the fields as well (before you could only make them editable or readonly)
add support for 'automatic-user'
In the dialog you can link a ticket to an existing JIRA issue.
add whitelist and blacklist options. That way you can define which projects should be shown in the dialog. Those options can be perl regular expression and the project *keys* are checked whether they match or not.
Fix bug: Do not translate Projects and Assignees in dialog
Support creating issues for specific articles
Minor UI improvements
Improve translation file
use dynamic field backend object to set JIRAIssueID field (instead of value object). Now the field update events are triggered.
add sysconfig option to suppress assignee setting in issue create request
Fix bug: When JIRA issue is closed in JIRA and this triggered an state update of the OTRS ticket, this triggered an event to close the JIRA issue. Now it is checked
if the agent who closes is the JIRA user, then the event is skipped.
Do not check field type for standard fields.
do not show subtasks in dialog (OTRSJIRA-108)
make assignee field in dialoag an autocomplete field (OTRSJIRA-109)
Followup for OTRSJIRA-98
Add dialog to create issue, fix bug OTRSJIRA-98
Fixed typo in package name
Moved TicketMenu module to correct folder.
Switched to OTRS::OPM::Maker::Command::sopm to generate .sopm file
Moved AgentTicketJIRA.tt to correct folder.
Added compatibility with OTRS 5.
Fixed a bug preventing automatic issue creation.
Do not update dynamic field.
Make debugging configurable, do not verify hostnames on SSL connections when configured.
Do not run ticket events when JIRA user triggers them.
Fix bug in typechecks.
Add typechecks, more debugging and fix update bug.
updates for OTRS4
Support IDs and names for custom fields and fix handling of some field types.
Switched to JIRA REST API.
Added article to mapFields call.
Cleanup in dynamic field code.
Removed authentication for license check. The API is available for anon access anyway.
Removed unnecessary returns.
Removed a strange if condition.
Removed obsolete and broken dependecy.
Attempt to debug JIRA 6.0 problems with JIRA::Client.
Bugfix.
Added licensing code.
Changed demo code for right hand side.
Finalized eval call again.
Bugfix.
Finalized eval call.
Added missing %Ticket.
Debugging.
Readded the $Self to the eval calls.
Changed eval call for external modules again.
Changed eval call for external modules.
Bugfix.
Bugfix.
Typo in config.
Added code to warn upon eval failure.
License info.
Skip file-2 attachment, fixes OTRSJIRA-3.
Bugfix for OTRSJIRA-5.
Bugfix.
Bugfix.
Bugfix for Perl 5.10 (SLES11SP2).
Lowered required module versions to work with Perl 5.10.
Rewrote date formatting completely.
Do not handle Checkboxes (for now).
Dynamic field data can be transferred.
Individial mapping for dynamic field types.
Changes to mapping code.
Bugfix.
Actually map field values if anything is present.
Avoid bounces and loops by checking the username of the user triggering an update.
Pass the correct variables down to the Jira Module.
More dependencies for Events. Better logging.
More dependencies for Events.
Readded original headers for actions. Corrected Actions dependencies. Fixed broken setup for ArticleCreateEvent. Added multiple events for TicketUpdate.
Removed broken dependency.
Fixed requirement check for events.
Fixed language typo.
Added more events.
Try to add the JIRAIssueID programatically.
Fix for the typo. 3.2.x Version.
Major rewrite of the OTRS2JIRA fieldmapping.
Added code to transform OTRS-dynamic fields/values to JIRA-custom fields/values and pass them to JIRA.
Added code to pass attachments to JIRA.
Added code to read configured Jira-project and Jira-issue from the 'SysConfig'.
Added ConfigItem to JIRA XML file and made field mapping from OTRS to JIRA configurable.
Added ConfigItem to JIRA XML file and made JIRA-date format configurable.
Added ConfigItem to JIRA XML file and made JIRA-Issue type configurable.
Added ConfigItem to JIRA XML file and made JIRA-project configurable.
Added code to check the OTRS Tickets state prior to any action. States are now configurable.
Added code to fetch the possible transitions of the given JIRA issue before attempting the transition.
Added template for showing an error in case a ticket is closed when one wants to open a JIRA issue.
Added code to pass the last article body to JIRA upon closing.
Added code to pass the article body to JIRA upon creation and comment the closing of a ticket in JIRA appropriately.
Added event code to close the JIRA issue when the ticket is closed.
1.1.10 - 2012-05-16 13:45:0
Added a hyperlink to JIRA.
Fixed the issue creation code.
Cleanup.
Added the options into the XML file.
Added error handling to the installer.
Added debugging to the installer.
Bugifxed the code for adding the JiraIssueID to the searchable and visible fields.
Added code for adding the JiraIssueID to the searchable and visible fields.
Bugfix for REST code for the remote issue links.
Bugfix for REST code for the remote issue links.
Added REST code for the remote issue links.
Uninstaller and Upgrader code done.
Added assignee and reporter. Nicer statuspage.
Updated MD5 dependecy.
New MD5 code in installer.
Updated DTL.
Updated SQL.
Debugging for dynamic field.
Added missing backslashes.
Added dynamic field.
New package.
Ein Modul, um Tickets in ein Jira zu eskalieren.
A module giving the option to escalate tickets into Jira.
6.0.x
Thank you for choosing the JIRAPackage module.<br />
Copyright (C) 2008-2016 catworkx GmbH http://www.catworkx.de<br />
This is commercial software.<br />
Please install the otrs2jira-licensing plugin into your Jira installation and obtain a valid license.<br />
Please contact catworkx GmbH for a valid license.
Vielen Dank für die Auswahl des JIRAPackage Modules.<br />
Copyright (C) 2008-2016 catworkx GmbH http://www.catworkx.de<br />
Dies ist kommerzielle Software.<br />
Bitte installieren Sie das Plugin otrs2jira-licensing in Ihre Jira Installation und hinterlegen dort eine gültige Lizenz.<br />
Bitte setzen Sie sich mit der catworkx GmbH bzgl. einer gültigen Lizenz in Verbindung.
JIRA::REST
REST::Client
Time::Piece
$Kernel::OM->Get('var::packagesetup::' . $Param{Structure}->{Name}->{Content} )->CodeInstall();
$Kernel::OM->Get('var::packagesetup::' . $Param{Structure}->{Name}->{Content} )->CodeUpgrade();
2020-01-27 06:50:02
debian.local
cGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6SklSQU1hcHBpbmc7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9IHF3KAogICAgS2VybmVsOjpTeXN0ZW06OlRpbWUKKTsKCnN1YiBUb2RheSB7CiAgICBteSAkVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaW1lJyk7CiAgICBteSAoJFNlYywgJE1pbiwgJEhvdXIsICREYXksICRNb24sICRZZWFyKSAgPSAkVGltZU9iamVjdC0+U3lzdGVtVGltZTJEYXRlKAogICAgICAgIFN5c3RlbVRpbWUgPT4gJFRpbWVPYmplY3QtPlN5c3RlbVRpbWUsCiAgICApOwoKICAgIG15ICgkRGF0ZSkgPSBzcHJpbnRmICIlMDRkLSUwMmQtJTAyZFQwMDowMDowMC4wKzAwMDAiLCAkWWVhciwgJE1vbiwgJERheTsKCiAgICByZXR1cm4gJERhdGU7Cn0KCnN1YiBGaWxsU2VsZWN0IHsKICAgIG15ICgkU2VsZiwgJEtleSwgJUFydGljbGUpID0gQF87CgogICAgbXkgKCRNb2R1bGUsICRGdW5jdGlvbiwgJFZhbHVlKSA9IHNwbGl0IC8sLywgJEtleTsKCiAgICByZXR1cm4geyB2YWx1ZSA9PiAkVmFsdWUgfTsKfQoKc3ViIEZpbGxNdWx0aVNlbGVjdCB7CiAgICBteSAoJFNlbGYsICRLZXksICVBcnRpY2xlKSA9IEBfOwoKICAgIG15ICgkTW9kdWxlLCAkRnVuY3Rpb24sIEBWYWx1ZXMpID0gc3BsaXQgLywvLCAkS2V5OwoKICAgIHJldHVybiBbIG1hcCB7ICt7IHZhbHVlID0+ICRfIH0gfUBWYWx1ZXMgXTsKfQoKMTsK
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+CjxvdHJzX2NvbmZpZyB2ZXJzaW9uPSIyLjAiIGluaXQ9IkNvbmZpZyI+CiAgICA8U2V0dGluZyBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRUaWNrZXRKSVJBIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RnJvbnRlbmRNb2R1bGVSZWdpc3RyYXRpb24gZm9yIHRoZSBUaWNrZXRKaXJhIG1vZHVsZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RnJvbnRlbmRNb2R1bFJlZ2lzdHJhdGlvbiBmw7xyIGRhcyBUaWNrZXRKaXJhIE1vZHVsLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+SmlyYTo6RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkZyb250ZW5kUmVnaXN0cmF0aW9uIj4KICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXAiPgogICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXBSbyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUaXRsZSI+VGlja2V0SmlyYTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIj5UaWNrZXRKaXJhPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmF2QmFyTmFtZSI+VGlja2V0SmlyYTwvSXRlbT4KICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJGcm9udGVuZDo6TmF2aWdhdGlvbiMjI0FnZW50VGlja2V0SklSQSMjIzAwMy1KSVJBIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPk1haW4gbWVudSBpdGVtIHJlZ2lzdHJhdGlvbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkppcmE6OkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uOjpNYWluTWVudTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxEZWZhdWx0SXRlbSBWYWx1ZVR5cGU9IkZyb250ZW5kTmF2aWdhdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICAgICAgPC9EZWZhdWx0SXRlbT4KICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6TWVudU1vZHVsZSMjIzkwMC1KSVJBIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+TW9kdWxlIHRvIHNob3dzIGEgSmlyYS1saW5rIGluIG1lbnUgb2YgdGhlIHRpY2tldCB6b29tLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5NaXQgZGllc2VtIE1vZHVsIHdpcmQgZGVyIEppcmEtTGluayBpbiBkZXIgTGlua2xlaXN0ZSBkZXIgVGlja2V0YW5zaWNodCBhbmdlemVpZ3QuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5KaXJhOjpGcm9udGVuZDo6QWdlbnQ6OlZpZXc6OlRpY2tldFpvb206Ok1lbnVNb2R1bGU8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6VGlja2V0TWVudTo6SklSQTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+SmlyYTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aW9uIj5BZ2VudFRpY2tldEpJUkE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRhcmdldCI+PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlRpY2tldEpJUkEjIyNVUkwiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgVVJMIG9mIHRoZSBKaXJhIHNlcnZlciwgaW5jbHVkZSB0aGUgcHJvdG9jb2wgYW5kIHRoZSBwb3J0IGlmIHJlcXVpcmVkIGEgd2VsbCBhcyB0aGUgYmFzZSBpZiBhbnkuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBVUkwgZGVzIEppcmEgU2VydmVycywgaW5rbHVzaXZlIFByb3Rva29sbCBzb3dpZSBQb3J0IHVuZCBQZmFkLCBzb2Zlcm4genV0cmVmZmVuZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkppcmE6OkNvcmU6OlJFU1Q8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlN0cmluZyIgVmFsdWVSZWdleD0iIj5odHRwOi8vY2F0LXBjLTA1MC5jYXR3b3JreC5kZTo4MDgwPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJUaWNrZXRKSVJBIyMjUGF0aCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBwYXRoIG9mIHRoZSBSRVNUIEFQSS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVyIFBmYWQgZGVyIFJFU1QgQVBJLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+SmlyYTo6Q29yZTo6UkVTVDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU3RyaW5nIiBWYWx1ZVJlZ2V4PSIiPi9yZXN0L2FwaS9sYXRlc3QvPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJUaWNrZXRKSVJBIyMjVXNlciIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSB1c2VybmFtZSB0byB1c2Ugd2hlbiBsb2dnaW5nIGluIGludG8gSmlyYSBpc3N1ZXMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlciBCZW51dHplcm5hbWUgbWl0IGRlbSBzaWNoIGJlaW0gSmlyYSBhbmdlbWVsZGV0IHdpcmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5KaXJhOjpDb3JlOjpSRVNUPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTdHJpbmciIFZhbHVlUmVnZXg9IiI+b3RyczwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iVGlja2V0SklSQSMjI1Bhc3N3b3JkIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIHBhc3N3b3JkIHRvIHVzZSB3aGVuIGxvZ2dpbmcgaW4gaW50byBKaXJhIGlzc3Vlcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGFzIFBhc3N3b3J0IG1pdCBkZW0gc2ljaCBiZWltIEppcmEgYW5nZW1lbGRldCB3aXJkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+SmlyYTo6Q29yZTo6UkVTVDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU3RyaW5nIiBWYWx1ZVJlZ2V4PSIiPm90cnM8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlRpY2tldEpJUkEjIyNSZXBvcnRlciIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBuYW1lIG9mIHRoZSByZXBvcnRlciB0byB1c2UgZm9yIHRoZSBuZXcgSmlyYSBpc3N1ZXMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlciBOYW1lIGRlcyBSZXBvcnRlcnMgZsO8ciBuZXVlIEppcmEgSXNzdWVzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+SmlyYTo6Q29yZTo6UkVTVDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU3RyaW5nIiBWYWx1ZVJlZ2V4PSIiPm90cnM8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlRpY2tldEpJUkEjIyNBc3NpZ25lZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBuYW1lIG9mIHRoZSBhc3NpZ25lZSB0byB1c2UgZm9yIHRoZSBuZXcgSmlyYSBpc3N1ZXMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlciBOYW1lIGRlcyBBc3NpZ25lZSBmw7xyIG5ldWUgSmlyYSBJc3N1ZXMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5KaXJhOjpDb3JlOjpSRVNUPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTdHJpbmciIFZhbHVlUmVnZXg9IiI+YWRtaW48L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkpJUkE6Ok5vQXNzaWduZWUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5JZiBlbmFibGVkLCB0aGUgYXNzaWduZWUgaXNuJ3Qgc2VudCB0byBKaXJhLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+SmlyYTo6Q29yZTo6UkVTVDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iQ2hlY2tib3giPjA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlRpY2tldEpJUkEjIyNJbmNvbWluZ1VzZXIiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgdXNlcm5hbWUgdGhhdCBpcyB1c2VkIHdoZW4gSmlyYSBsb2dzIGludG8gT1RSUyB0byB1cGRhdGUgdGlja2V0cy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVyIEJlbnV0emVybmFtZSBtaXQgZGVtIHNpY2ggSmlyYSBhbSBPVFJTIGFubWVsZGV0LCB1bSBUaWNrZXRzIHp1IGFrdHVhbGlzaWVyZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5KaXJhOjpDb3JlOjpSRVNUPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTdHJpbmciIFZhbHVlUmVnZXg9IiI+amlyYTwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iVGlja2V0SklSQSMjI1dvcmtmbG93Q2xvc2VBY3Rpb25OYW1lIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIG5hbWUgb2YgdGhlIGNsb3NlIGlzc3VlIHdvcmtmbG93IGFjdGlvbiAoZGVmYXVsdDogIkNsb3NlIElzc3VlIiwgcGF5IGF0dGVudGlvbiB0byB0aGUgSmlyYSBsYW5ndWFnZSBvZiB1c2VyIGluIFRpY2tldEpJUkEjIyNVc2VyLCBFbmdsaXNoKFVLKSB3b3JrcykuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlciBOYW1lIGRlciBBa3Rpb24genVtIFNjaGxpZcOfZW4gdm9uIElzc3VlcyAoU3RhbmRhcmQ6ICJDbG9zZSBJc3N1ZSIsIGFjaHRlbiBTaWUgYXVmIGRpZSBKaXJhIFNwcmFjaGUgZGVzIEJlbnV0ZXJzIGluIFRpY2tldEpJUkEjIyNVc2VyLCBFbmdsaXNoKFVLKSBpc3QgZW1wZmVobGVuc3dlcnQpLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+SmlyYTo6Q29yZTo6UkVTVDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU3RyaW5nIj5DbG9zZSBJc3N1ZTwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iVGlja2V0SklSQSMjI09UUlNUaWNrZXRBbGxvd0NyZWF0aW9uSW5BbGxRdWV1ZXMiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5BbGxvdyBtYW51YWwgaXNzdWUgY3JlYXRpb24gaW4gYWxsIHF1ZXVlcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+TWFudWVsbGUgUHJvYmxlbWVyc3RlbGx1bmcgaW4gYWxsZW4gV2FydGVzY2hsYW5nZW4genVsYXNzZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5KaXJhOjpDb3JlOjpSRVNUPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJDaGVja2JveCI+MDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iVGlja2V0SklSQSMjI09UUlNUaWNrZXRBbGxvd2VkUXVldWVzNENyZWF0ZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBuYW1lcyBvZiB0aGUgT1RSUyBUaWNrZXQgcXVldWVzIHRoYXQgYWxsb3cgdGhlIGNyZWF0aW9uIG9mIGEgSmlyYSBJc3N1ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIE5hbWVuIGRlciBPVFJTIFRpY2tldCBXYXJ0ZXNjaGxhbmdlIGRpZSBkYXMgRXJ6ZXVnZW4gZWluZXMgSmlyYSBJc3N1ZSB6dWxhc3Nlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkppcmE6OkNvcmU6OlJFU1Q8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICA8RGVmYXVsdEl0ZW0gVmFsdWVUeXBlPSJFbnRpdHkiIFZhbHVlRW50aXR5VHlwZT0iUXVldWUiIFZhbHVlUmVnZXg9IiI+PC9EZWZhdWx0SXRlbT4KICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iVGlja2V0SklSQSMjI09UUlNUaWNrZXRTdGF0ZXNFbmZvcmNpbmdDcmVhdGUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgbmFtZXMgb2YgdGhlIHN0YXRlcyBpbiBPVFJTIGZvciB3aGljaCBhIEppcmEgaXNzdWUgaXMgYXV0b21hdGljYWxseSBjcmVhdGVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgTmFtZW4gZGVyIE9UUlMgVGlja2V0IFp1c3TDpG5kZSwgZsO8ciBkaWUgYXV0b21hdGlzY2ggZWluIEppcmEgSXNzdWUgZXJzdGVsbHQgd2lyZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkppcmE6OkNvcmU6OlJFU1Q8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlN0cmluZyI+bmV3LG9wZW4sbWVyZ2VkLHBlbmRpbmcgcmVtaW5kZXI8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlRpY2tldEpJUkEjIyNPVFJTVGlja2V0QWxsb3dlZFN0YXRlczRDbG9zZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBuYW1lcyBvZiB0aGUgT1RSUyBUaWNrZXQgc3RhdGVzIHRoYXQgYWxsb3cgdGhlIGNsb3Npbmcgb2YgYSBKaXJhIElzc3VlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgTmFtZW4gZGVyIE9UUlMgVGlja2V0IFp1c3TDpG5kZSBkaWUgZGFzIFNjaGxpZcOfZW4gZWluZXMgSmlyYSBJc3N1ZSB6dWxhc3Nlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkppcmE6OkNvcmU6OlJFU1Q8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlN0cmluZyI+Y2xvc2VkIHN1Y2Nlc3NmdWwsY2xvc2VkIHVuc3VjY2Vzc2Z1bCxyZW1vdmVkPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJUaWNrZXRKSVJBIyMjT1RSU1RpY2tldEFsbG93ZWRTdGF0ZXM0VXBkYXRlIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIG5hbWVzIG9mIHRoZSBPVFJTIFRpY2tldCBzdGF0ZXMgdGhhdCBhbGxvdyB1cGRhdGluZyB0aGUgSmlyYSBJc3N1ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIE5hbWVuIGRlciBPVFJTIFRpY2tldCBadXN0w6RuZGUgZGllIGRhcyBBa3R1YWxpc2llcmVuIGVpbmVzIEppcmEgSXNzdWUgenVsYXNzZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5KaXJhOjpDb3JlOjpSRVNUPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTdHJpbmciPm5ldyxvcGVuLG1lcmdlZCxwZW5kaW5nIHJlbWluZGVyPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJUaWNrZXQ6OkV2ZW50TW9kdWxlUG9zdCMjIzAwMS1UaWNrZXRDbG9zZUpJUkEiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5VcGRhdGUgSmlyYSBvbmNlIHRoZSB0aWNrZXQgaXMgY2xvc2VkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EYXMgSmlyYSBuYWNoIGRlbSBTY2hsaWXDn2VuIGRlcyBUaWNrZXRzIGFrdHVhbGlzaWVyZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5KaXJhOjpDb3JlOjpUaWNrZXQ8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpFdmVudDo6Q2xvc2VKSVJBSXNzdWU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkV2ZW50Ij5UaWNrZXRTdGF0ZVVwZGF0ZTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJUaWNrZXQ6OkV2ZW50TW9kdWxlUG9zdCMjIzAwMS1UaWNrZXRDcmVhdGVKSVJBIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+Q3JlYXRlIEppcmEgSXNzdWUgb25jZSB0aGUgdGlja2V0IGlzIHB1c2hlZCBpbnRvIGEgc3BlY2lmaWMgc3RhdGUuIFNlZSBUaWNrZXRKSVJBIyMjT1RSU1RpY2tldFN0YXRlc0VuZm9yY2luZ0NyZWF0ZSBmb3IgZGV0YWlscy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RXJ6ZXVnZSBkYXMgSmlyYSBJc3N1ZSBzb2JhbGQgZGFzIE9UUlMgVGlja2V0IGluIGVpbmVtIGJlc3RpbW10ZW4gWnVzdGFuZCBhbmdla29tbWVuIGlzdC4gRsO8ciBEZXRhaWxzLCBzaWVoZSBUaWNrZXRKSVJBIyMjT1RSU1RpY2tldFN0YXRlc0VuZm9yY2luZ0NyZWF0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkppcmE6OkNvcmU6OlRpY2tldDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkV2ZW50OjpDcmVhdGVKSVJBSXNzdWU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkV2ZW50Ij5UaWNrZXRTdGF0ZVVwZGF0ZTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJUaWNrZXQ6OkV2ZW50TW9kdWxlUG9zdCMjIzAwMS1UaWNrZXRKSVJBVXBkYXRlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VXBkYXRlIEppcmEgb25jZSB0aGUgdGlja2V0IHVwZGF0ZWQgdGhlIHRpdGxlIGZpZWxkLiBEdXBsaWNhdGUgdGhpcyBlbnRyeSBmb3IgKmFsbCogZmllbGRzIHlvdSB3YW50IHRvIHN5bmMgaW50byBKaXJhLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EYXMgSmlyYSBiZWltIGFrdHVhbGlzaWVyZW4gZGVzIEZlbGRlcyAidGl0bGUiIGViZW5mYWxscyBha3R1YWxpc2llcmVuLiBEaWVzZXIgRWludHJhZyBtdXNzIGbDvHIgKmplZGVzKiB6dSDDvGJlcnRyYWdlbmRlIEZlbGQgZXh0cmEgYW5nZWxlZ3Qgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+SmlyYTo6Q29yZTo6VGlja2V0PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OlRpY2tldDo6RXZlbnQ6OlVwZGF0ZUpJUkFJc3N1ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRXZlbnQiPlRpY2tldFRpdGxlVXBkYXRlfFRpY2tldEN1c3RvbWVyVXBkYXRlfFRpY2tldEZyZWVUZXh0VXBkYXRlfFRpY2tldE93bmVyVXBkYXRlfFRpY2tldER5bmFtaWNGaWVsZFVwZGF0ZV9maWVsZDAwMXxUaWNrZXREeW5hbWljRmllbGRVcGRhdGVfZmllbGQwMDJ8VGlja2V0RHluYW1pY0ZpZWxkVXBkYXRlX2ZpZWxkMDAzfFRpY2tldER5bmFtaWNGaWVsZFVwZGF0ZV9maWVsZDAwNHxUaWNrZXREeW5hbWljRmllbGRVcGRhdGVfZmllbGQwMDV8VGlja2V0RHluYW1pY0ZpZWxkVXBkYXRlX2ZpZWxkMDEwfFRpY2tldER5bmFtaWNGaWVsZFVwZGF0ZV9maWVsZDAxMTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJUaWNrZXQ6OkV2ZW50TW9kdWxlUG9zdCMjIzAwMS1BcnRpY2xlVG9KSVJBIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+Q3JlYXRlIGEgSmlyYSBDb21tZW50IG9uY2UgYW4gYXJ0aWNsZSBpcyBjcmVhdGVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5FcnpldWdlIGVpbmVuIEppcmEga29tbWVudGFyIHNvYmFsZCBlaW4gT1RSUyBBcnRpa2VsIGVyemV1Z3Qgd3VyZGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5KaXJhOjpDb3JlOjpUaWNrZXQ8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpFdmVudDo6QWRkQXJ0aWNsZVRvSklSQUlzc3VlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFdmVudCI+QXJ0aWNsZUNyZWF0ZXxBcnRpY2xlVXBkYXRlPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlRpY2tldEpJUkEjIyNQcm9qZWN0IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIG5hbWUgb2YgdGhlIHByb2plY3QgdG8gdXNlIGZvciB0aGUgbmV3IEppcmEgaXNzdWVzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZXIgTmFtZSBkZXMgUHJvamVrdGVzIGbDvHIgbmV1ZSBKaXJhIElzc3Vlcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkppcmE6OkNvcmU6OlJFU1Q8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlN0cmluZyIgVmFsdWVSZWdleD0iIj5PVFJTPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJUaWNrZXRKSVJBIyMjSXNzdWVUeXBlIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIG5hbWUgb2YgdGhlIHR5cGUgdG8gdXNlIGZvciB0aGUgbmV3IEppcmEgaXNzdWVzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZXIgTmFtZSBkZXMgVHlwIGbDvHIgbmV1ZSBKaXJhIElzc3Vlcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkppcmE6OkNvcmU6OlJFU1Q8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlN0cmluZyIgVmFsdWVSZWdleD0iIj5CdWc8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlRpY2tldEpJUkEjIyNKSVJBLURhdGVUaW1lRm9ybWF0IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGF0ZSBmb3JtYXQgdXNlZCBpbiBKaXJhLCBlLmcuOiBKaXJhOiBkZC9NTU0veXkgaDptbSBhID0gT1RSUyAlZC8lYi8leSAlSTolTSAlcDwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EYXMgdm9uIEppcmEgYWt6ZXB0aWVydGUgRGF0dW1zZm9ybWF0LCB6LkIuOiBKaXJhOiBkZC9NTU0veXkgaDptbSBhID0gT1RSUyAlZC8lYi8leSAlSTolTSAlcDwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+SmlyYTo6Q29yZTo6UkVTVDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU3RyaW5nIiBWYWx1ZVJlZ2V4PSIiPiVkLyViLyV5ICVJOiVNICVwPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJUaWNrZXRKSVJBIyMjSklSQS1EYXRlRm9ybWF0IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGF0ZSBmb3JtYXQgdXNlZCBpbiBKaXJhLCBlLmcuOiBKaXJhOiBkZC9NTU0veXkgPSBPVFJTICVkLyViLyV5PC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRhcyB2b24gSmlyYSBha3plcHRpZXJ0ZSBEYXR1bXNmb3JtYXQsIHouQi46IEppcmE6IGRkL01NTS95eSA9IE9UUlMgJWQvJWIvJXk8L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkppcmE6OkNvcmU6OlJFU1Q8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlN0cmluZyIgVmFsdWVSZWdleD0iIj4lZC8lYi8leTwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iVGlja2V0SklSQSMjI09UUlMtSklSQS1GaWVsZE1hcHBpbmciIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5NYXBwaW5nIGZyb20gT1RSUyBmaWVsZHMgdG8gSmlyYSBGaWVsZHMuIEtleTogT1RSUzsgQ29udGVudDogSmlyYS4gUHJlZml4ZXM6ICJzdGQ6IiA9IHN0YW5kYXJkIGZpZWxkOyAiZHluOiIgPSBPVFJTIGR5bmFtaWMgZmllbGQ7ICJjdXN0OiIgPSBKaXJhIGN1c3RvbSBmaWVsZDsgImNhbGw6IiA9IE9UUlMvSmlyYSBtYXBwaW5nIGNhbGwgd2l0aCBmdWxsIFBlcmwgbW9kdWxlcGF0aCBQa2c6OlN1YixmdW5jIChlLmcuIE1JTUU6OkJhc2U2NCxlbmNvZGVfYmFzZTY0KS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+QWJiaWxkdW5nIGRlciBPVFJTIEZlbGRlcm4genUgZGVuIEppcmEgRmVsZGVybi4gU2NobMO8c3NlbDogT1RSUzsgSW5oYWx0OiBKaXJhLiBQcsOkZml4ZTogInN0ZDoiID0gU3RhbmRhcmQgRmVsZDsgImR5bjoiID0gT1RSUyBEeW5hbWljIEZlbGQ7ICJjdXN0OiIgPSBKaXJhIEN1c3RvbSBGZWxkOyAiY2FsbDoiID0gT1RSUy9KaXJhIE1hcHBpbmctRnVua3Rpb25zYXVmcnVmIG1pdCB2b2xsZW0gUGVybCBNb2R1bGVwZmFkIFBrZzo6U3ViLGZ1bmMgKHouQi4gTUlNRTo6QmFzZTY0LGVuY29kZV9iYXNlNjQpLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+SmlyYTo6Q29yZTo6UkVTVDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJkeW46ZHluYW1pY0ZpZWxkMSI+Y3VzdDpjdXN0b21GaWVsZDE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImR5bjpqaXJhX3ByaW8iPnN0ZDpwcmlvcml0eTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ic3RkOlRpdGxlIj5zdGQ6c3VtbWFyeTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ic3RkOlF1ZXVlIj5jdXN0OnF1ZXVlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJtYXA6TW9kOjpTdWJNb2Q6OmZ1bmMiPmN1c3Q6ZmllbGQxPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJkeW46ZHluYW1pY0ZpZWxkMiI+bWFwOk1vZDo6U3ViTW9kLGZ1bmMyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJtYXA6TW9kOjpTdWJNb2Q6OmZ1bmMzIj5tYXA6TW9kOjpTdWJNb2QsZnVuYzQ8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSklSQTo6T1RSU1RpY2tldElERmllbGQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgSUQgb2YgdGhlIGN1c3RvbSBmaWVsZCBpbiBKaXJhIHRoYXQgc3RvcmVzIHRoZSBPVFJTIHRpY2tldCBJRC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIElEIGRlcyBGZWxkZXMgaW4gSmlyYSwgZGFzIGRpZSBPVFJTLVRpY2tldElEIHNwZWljaGVydC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkppcmE6OkNvcmU6OlJFU1Q8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlN0cmluZyIgVmFsdWVSZWdleD0iXlxkKyQiPjEwMDAwPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJKSVJBOjpDYWNoZVRUTCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRpbWVUb0xpdmUgZm9yIENhY2hlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5UaW1lVG9MaXZlIGbDvHIgQ2FjaGU8L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkppcmE6OkNvcmU6OlJFU1Q8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlN0cmluZyIgVmFsdWVSZWdleD0iXlxkKyQiPjIwMDAwPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJKSVJBOjpTU0xWZXJpZnkiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5WZXJpZnkgaG9zdG5hbWUgZm9yIFNTTCBjb25uZWN0aW9ucy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+VmVyaWZpemllcmUgZGVuIEhvc3RuYW1lbiBiZWkgU1NMLVZlcmJpbmR1bmdlbjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+SmlyYTo6Q29yZTo6UkVTVDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iQ2hlY2tib3giPjE8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkpJUkE6OkRlYnVnIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RW5hYmxlcyBEZWJ1Z2dpbmcgZm9yIEppcmEgcGFja2FnZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+QWt0aXZpZXJ0IGRhcyBEZWJ1Z2dpbmcgZsO8ciBkYXMgSmlyYS1QYWtldDwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+SmlyYTo6Q29yZTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iQ2hlY2tib3giPjA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkpJUkE6OlNob3dEaWFsb2ciIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2hvdyBkaWFsb2cgd2hlbiBpc3N1ZSBpbiBKaXJhIGlzIGFib3V0IHRvIGJlIGNyZWF0ZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5KaXJhOjpDb3JlPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJDaGVja2JveCI+MDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSklSQTo6VHJhbnNmZXJUaWNrZXRIaXN0b3J5IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPklmIHNldCB0byAnb25seSBmaXJzdCBhcnRpY2xlJywgb25seSB0aGUgZmlyc3QgYXJ0aWNsZSBpcyBzZW50IHRvIEppcmEgb24gaXNzdWUgY3JlYXRpb24uIElmIHNldCB0byAnYWxsIGFydGljbGVzJywgYWxsIGV4aXN0aW5nIGFydGljbGVzIHdpbGwgYmUgc2VudCB0byBKaXJhLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+SmlyYTo6Q29yZTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU2VsZWN0IiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iMCIgVHJhbnNsYXRhYmxlPSIxIj5vbmx5IGZpcnN0IGFydGljbGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IjEiIFRyYW5zbGF0YWJsZT0iMSI+YWxsIGFydGljbGVzPC9JdGVtPgogICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkpJUkE6OlNlbmRSZXBvcnRlciIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5JZiBkaXNhYmxlZCwgbm8gcmVwb3J0ZXIgaXMgc2VudCB0byBKaXJhLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+SmlyYTo6Q3JlYXRlSXNzdWU8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkNoZWNrYm94Ij4xPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJKSVJBOjpTaG93UHJvamVjdCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TaG93IFByb2plY3QgZmllbGQgaW4gY3JlYXRlIGRpYWxvZy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkppcmE6OkNyZWF0ZUlzc3VlPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTZWxlY3QiIFNlbGVjdGVkSUQ9IjEiPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSItMSIgVHJhbnNsYXRhYmxlPSIxIj5IaWRlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSIwIiBUcmFuc2xhdGFibGU9IjEiPlJlYWRvbmx5PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSIxIiBUcmFuc2xhdGFibGU9IjEiPkVkaXRhYmxlPC9JdGVtPgogICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkpJUkE6OlNob3dBc3NpZ25lZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TaG93IEFzc2lnbmVlIGZpZWxkIGluIGNyZWF0ZSBkaWFsb2cuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5KaXJhOjpDcmVhdGVJc3N1ZTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU2VsZWN0IiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iLTEiIFRyYW5zbGF0YWJsZT0iMSI+SGlkZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iMCIgVHJhbnNsYXRhYmxlPSIxIj5SZWFkb25seTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iMSIgVHJhbnNsYXRhYmxlPSIxIj5FZGl0YWJsZTwvSXRlbT4KICAgICAgICAgICAgPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJKSVJBOjpTaG93QXV0b21hdGljVXNlciIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TaG93IGF1dG9tYXRpYyB1c2VyIGluIEFzc2lnbmVlIGZpZWxkIGluIGNyZWF0ZSBkaWFsb2cuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5KaXJhOjpDcmVhdGVJc3N1ZTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iQ2hlY2tib3giPjA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkpJUkE6OlNob3dJc3N1ZVR5cGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2hvdyBpc3N1ZSB0eXBlIGZpZWxkIGluIGNyZWF0ZSBkaWFsb2cuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5KaXJhOjpDcmVhdGVJc3N1ZTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU2VsZWN0IiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iLTEiIFRyYW5zbGF0YWJsZT0iMSI+SGlkZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iMCIgVHJhbnNsYXRhYmxlPSIxIj5SZWFkb25seTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iMSIgVHJhbnNsYXRhYmxlPSIxIj5FZGl0YWJsZTwvSXRlbT4KICAgICAgICAgICAgPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRUaWNrZXRKSVJBRGlhbG9nIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RnJvbnRlbmRNb2R1bGVSZWdpc3RyYXRpb24gZm9yIHRoZSBUaWNrZXRKaXJhIGRpYWxvZyBtb2R1bGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkZyb250ZW5kTW9kdWxSZWdpc3RyYXRpb24gZsO8ciBkYXMgVGlja2V0SmlyYS1EaWFsb2cgTW9kdWwuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5KaXJhOjpGcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iRnJvbnRlbmRSZWdpc3RyYXRpb24iPgogICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cFJvIj4KICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRpdGxlIj5UaWNrZXRKaXJhPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iPlRpY2tldEppcmE8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYXZCYXJOYW1lIj5UaWNrZXRKaXJhPC9JdGVtPgogICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkxvYWRlcjo6TW9kdWxlOjpBZ2VudFRpY2tldEpJUkFEaWFsb2cjIyMwMDMtSklSQSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Mb2FkZXIgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkppcmE6OkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uOjpMb2FkZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSmF2YVNjcmlwdCI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5KSVJBLkF1dG9jb21wbGV0ZS5qczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkZyb250ZW5kOjpOYXZpZ2F0aW9uIyMjQWdlbnRUaWNrZXRKSVJBRGlhbG9nIyMjMDAzLUpJUkEiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TWFpbiBtZW51IGl0ZW0gcmVnaXN0cmF0aW9uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+SmlyYTo6RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb246Ok1haW5NZW51PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgPERlZmF1bHRJdGVtIFZhbHVlVHlwZT0iRnJvbnRlbmROYXZpZ2F0aW9uIj4KICAgICAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgICAgICAgICA8L0RlZmF1bHRJdGVtPgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJGcm9udGVuZDo6T3V0cHV0OjpGaWx0ZXJFbGVtZW50UG9zdCMjI091dHB1dEZpbHRlckFydGljbGVNZW51T1RSU1RvSklSQUxpbmsiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+QWRkIGEgbGluayBpbiB0aGUgYXJ0aWNsZSBtZW51IHRvIGNyZWF0ZSBpc3N1ZSBpbiBKaXJhIGZvciB0aGUgYXJ0aWNsZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkppcmE6OkZyb250ZW5kOjpCYXNlOjpPdXRwdXRGaWx0ZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6RmlsdGVyRWxlbWVudFBvc3Q6Ok9UUlNUb0pJUkFMaW5rPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUZW1wbGF0ZXMiPgogICAgICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFnZW50VGlja2V0Wm9vbSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSklSQTo6UHJvamVjdFdoaXRlbGlzdCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5IZXJlIHlvdSBjYW4gZGVmaW5lIGEgbGlzdCBvZiByZWd1bGFyIGV4cHJlc3Npb25zLiBPbmx5IHByb2plY3Qga2V5cyB0aGF0IG1hdGNoZXMgYXQgbGVhc3Qgb25lIG9mIHRob3NlIHJlZ3VsYXIgZXhwcmVzc2lvbnMgYXJlIHNob3duIGluIHRoZSBwcm9qZWN0IGRyb3Bkb3duIChKaXJhIGRpYWxvZykuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5KaXJhOjpDb3JlOjpSRVNUPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJKSVJBOjpQcm9qZWN0QmxhY2tsaXN0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkhlcmUgeW91IGNhbiBkZWZpbmUgYSBsaXN0IG9mIHJlZ3VsYXIgZXhwcmVzc2lvbnMuIFByb2plY3Qga2V5cyB0aGF0IG1hdGNoZXMgYXQgbGVhc3Qgb25lIG9mIHRob3NlIHJlZ3VsYXIgZXhwcmVzc2lvbnMgYXJlIGV4Y2x1ZGVkIGZyb20gdGhlIHByb2plY3QgZHJvcGRvd24gKEppcmEgZGlhbG9nKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkppcmE6OkNvcmU6OlJFU1Q8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkpJUkE6Oklzc3VlU2VhcmNoTWF4UmVzdWx0cyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5NYXhpbXVtIG51bWJlciBvZiBpc3N1ZXMgc2hvd24gaW4gdGhlIGF1dG9jb21wbGV0ZSBkcm9wZG93bi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkppcmE6OkNvcmU6OlJFU1Q8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlN0cmluZyIgVmFsdWVSZWdleD0iXlxkKyQiPjMwMDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSklSQTo6SXNzdWVTZWFyY2hTdGF0ZXMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5IZXJlIHlvdSBjYW4gZGVmaW5lIGEgbGlzdCBvZiBzdGF0ZXMgdG8gcmVzdHJpY3QgdGhlIGlzc3VlcyB0aGF0IGFyZSBzZWFyY2hlZCBmb3IuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5KaXJhOjpDb3JlOjpSRVNUPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJUaWNrZXQ6OkV2ZW50TW9kdWxlUG9zdCMjIzEwMS1TZW5kQXR0YWNobWVudHMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2VuZCBhdHRhY2htZW50cyB0byBKaXJhLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+SmlyYTo6Q29yZTo6VGlja2V0PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OlRpY2tldDo6RXZlbnQ6OlNlbmRBdHRhY2htZW50c1RvSklSQUlzc3VlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFdmVudCI+QXR0YWNobWVudFdyaXRlPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlRpY2tldDo6Q3VzdG9tTW9kdWxlIyMjMDA1LUF0dGFjaG1lbnRFdmVudHMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+T3ZlcnJpZGVzIGFuZCBzb21lIG1ldGhvZHMgd2l0aCByZWdhcmRzIHRvIGF0dGFjaG1lbnRzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+SmlyYTo6Q29yZTo6VGlja2V0PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTdHJpbmciIFZhbHVlUmVnZXg9IiI+S2VybmVsOjpTeXN0ZW06OlRpY2tldDo6Q3VzdG9tOjpBdHRhY2htZW50RXZlbnRzPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWRtaW5KSVJBV2l6YXJkIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPldpemFyZCBmb3IgYmFzaWMgSmlyYSBzZXR0aW5ncy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkppcmE6OkZyb250ZW5kOjpBZG1pbjo6TW9kdWxlUmVnaXN0cmF0aW9uPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJGcm9udGVuZFJlZ2lzdHJhdGlvbiI+CiAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwUm8iPgogICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXAiPgogICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5hZG1pbjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5CYXNpYyBzZXR0aW5ncyBmb3IgSmlyYS48L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUaXRsZSIgVHJhbnNsYXRhYmxlPSIxIj5KaXJhPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmF2QmFyTmFtZSI+QWRtaW48L0l0ZW0+CiAgICAgICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iTG9hZGVyOjpNb2R1bGU6OkFkbWluSklSQVdpemFyZCMjIzAwMy1KSVJBIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkxvYWRlciBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+SmlyYTo6RnJvbnRlbmQ6OkFkbWluOjpNb2R1bGVSZWdpc3RyYXRpb246OkxvYWRlcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJKYXZhU2NyaXB0Ij4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPkpJUkEuQWRtaW5XaXphcmQuanM8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJGcm9udGVuZDo6TmF2aWdhdGlvbiMjI0FkbWluSklSQVdpemFyZCMjIzAwMy1KSVJBIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPk1haW4gbWVudSBpdGVtIHJlZ2lzdHJhdGlvbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkppcmE6OkZyb250ZW5kOjpBZG1pbjo6TW9kdWxlUmVnaXN0cmF0aW9uOjpNYWluTWVudTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxEZWZhdWx0SXRlbSBWYWx1ZVR5cGU9IkZyb250ZW5kTmF2aWdhdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICAgICAgPC9EZWZhdWx0SXRlbT4KICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iRnJvbnRlbmQ6Ok5hdmlnYXRpb25Nb2R1bGUjIyNBZG1pbkpJUkFXaXphcmQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+QWRtaW4gYXJlYSBuYXZpZ2F0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+SmlyYTo6RnJvbnRlbmQ6OkFkbWluOjpNb2R1bGVSZWdpc3RyYXRpb246OkFkbWluT3ZlcnZpZXc8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXAiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+YWRtaW48L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXBSbyI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok5hdkJhcjo6TW9kdWxlQWRtaW48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiIFRyYW5zbGF0YWJsZT0iMSI+SmlyYTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQmxvY2siPlN5c3RlbTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iIFRyYW5zbGF0YWJsZT0iMSI+QmFzaWMgc2V0dGluZ3MgZm9yIEppcmEuPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJY29uQmlnIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikljb25TbWFsbCI+PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkpJUkE6OkFydGljbGVGb3JtYXQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+Rm9ybWF0IGZvciBBcnRpY2xlIGNvbnRlbnQgdGhhdCBpcyBzZW50IHRvIEppcmEuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5KaXJhOjpDb3JlOjpSRVNUPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJUZXh0YXJlYSI+PCFbQ0RBVEFbWyUgRGF0YS5Gcm9tICVdIC8gWyUgRGF0YS5UbyAlXQpbJSBEYXRhLkJvZHkgJV0gXV0+CiAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FkbWluSklSQVF1ZXVlU2V0dGluZ3MiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+UXVldWUgc3BlY2lmaWMgc2V0dGluZ3MgZm9yIGRpYWxvZy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkppcmE6OkZyb250ZW5kOjpBZG1pbjo6TW9kdWxlUmVnaXN0cmF0aW9uPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJGcm9udGVuZFJlZ2lzdHJhdGlvbiI+CiAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwUm8iPgogICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXAiPgogICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5hZG1pbjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5RdWV1ZSBzcGVjaWZpYyBzZXR0aW5ncyBmb3IgSmlyYS48L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUaXRsZSIgVHJhbnNsYXRhYmxlPSIxIj5KaXJhPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmF2QmFyTmFtZSI+QWRtaW48L0l0ZW0+CiAgICAgICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iRnJvbnRlbmQ6Ok5hdmlnYXRpb24jIyNBZG1pbkpJUkFRdWV1ZVNldHRpbmdzIyMjMDAzLUpJUkEiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TWFpbiBtZW51IGl0ZW0gcmVnaXN0cmF0aW9uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+SmlyYTo6RnJvbnRlbmQ6OkFkbWluOjpNb2R1bGVSZWdpc3RyYXRpb246Ok1haW5NZW51PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgPERlZmF1bHRJdGVtIFZhbHVlVHlwZT0iRnJvbnRlbmROYXZpZ2F0aW9uIj4KICAgICAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgICAgICAgICA8L0RlZmF1bHRJdGVtPgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJGcm9udGVuZDo6TmF2aWdhdGlvbk1vZHVsZSMjI0FkbWluSklSQVF1ZXVlU2V0dGluZ3MiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+QWRtaW4gYXJlYSBuYXZpZ2F0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+SmlyYTo6RnJvbnRlbmQ6OkFkbWluOjpNb2R1bGVSZWdpc3RyYXRpb246OkFkbWluT3ZlcnZpZXc8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXAiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+YWRtaW48L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXBSbyI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok5hdkJhcjo6TW9kdWxlQWRtaW48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiIFRyYW5zbGF0YWJsZT0iMSI+UXVldWUgc2V0dGluZ3MgZm9yIEppcmE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkJsb2NrIj5TeXN0ZW08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIiBUcmFuc2xhdGFibGU9IjEiPlF1ZXVlIHNwZWNpZmljIHNldHRpbmdzIGZvciBKaXJhLjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSWNvbkJpZyI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJY29uU21hbGwiPjwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+Cgo8L290cnNfY29uZmlnPgo=
IyAgLS0KIyAgS2VybmVsL0xhbmd1YWdlL2RlX0FnZW50VGlja2V0SklSQS5wbSAtIGxhbmd1YWdlIG1vZHVsZQojICBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxNSBjYXR3b3JreCBHbWJIIGh0dHA6Ly93d3cuY2F0d29ya3guZGUKIyAgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRlX0FnZW50VGlja2V0SklSQTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgJExhbmctPnsnQSBuZXcgSmlyYSBJc3N1ZSBoYXMgYmVlbiBjcmVhdGVkJ30gPSAnRWluIG5ldWVzIEppcmEgSXNzdWUgd3VyZGUgZXJzdGVsbHQnOwogICAgJExhbmctPnsnQSBKaXJhIElzc3VlIGNvdWxkIG5vdCBiZSBjcmVhdGVkJ30gPSAnRWluIEppcmEgSXNzdWUga29ubnRlIG5pY2h0IGVyc3RlbGx0IHdlcmRlbic7CiAgICAkTGFuZy0+eydUbyB0aGUgaXNzdWUgKEppcmEpJ30gICAgICAgICAgICAgICA9ICdadW0gSmlyYSBJc3N1ZSc7CiAgICAkTGFuZy0+eydCYWNrIHRvIHRoZSB0aWNrZXQgKE9UUlMpJ30gICAgICAgICA9ICdadXLDvGNrIHp1bSBPVFJTIFRpY2tldCc7CiAgICAkTGFuZy0+eydUaWNrZXQgbm90IG9wZW4uJ30gICAgICAgICAgICAgICAgICA9ICdUaWNrZXQgbmljaHQgaW0gb2ZmZW5lbiBadXN0YW5kLic7CiAgICAkTGFuZy0+eydKaXJhIHRvIE9UUlMnfSAgICAgICAgICAgICAgICAgICAgICA9ICdKaXJhIG5hY2ggT1RSUyc7CiAgICAkTGFuZy0+eydUYWtlIHRoaXMgdGlja2V0IGJhY2sgZnJvbSBKaXJhJ30gICA9ICdEaWVzZXMgVGlja2V0IGF1cyBKaXJhIHp1csO8Y2tob2xlbic7CiAgICAkTGFuZy0+eydPVFJTIHRvIEppcmEnfSAgICAgICAgICAgICAgICAgICAgICA9ICdPVFJTIG5hY2ggSmlyYSc7CiAgICAkTGFuZy0+eydFc2NhbGF0ZSB0aGlzIHRpY2tldCB0byBKaXJhJ30gICAgICA9ICdEaWVzZXMgVGlja2V0IG5hY2ggSmlyYSBlc2thbGllcmVuJzsKICAgICRMYW5nLT57J0NyZWF0ZSBpc3N1ZSBpbiBKaXJhJ30gICAgICAgICAgICAgID0gJ1ZvcmdhbmcgaW4gSmlyYSBlcnN0ZWxsZW4nOwogICAgJExhbmctPnsnUHJvamVjdCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUHJvamVrdCc7CiAgICAkTGFuZy0+eydBc3NpZ25lZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdCZWFyYmVpdGVyJzsKICAgICRMYW5nLT57J0lzc3VlVHlwZSd9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1ZvcmdhbmdzdHlwJzsKICAgICRMYW5nLT57J0lzc3VlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1ZvcmdhbmcnOwogICAgJExhbmctPnsnQ3JlYXRlIG5ldyBpc3N1ZSd9ICAgICAgICAgICAgICAgICAgPSAnTmV1ZW4gVm9yZ2FuZyBlcnN0ZWxsZW4nOwogICAgJExhbmctPnsnTGluayB3aXRoIEppcmEgaXNzdWUnfSAgICAgICAgICAgICAgPSAnTWl0IEppcmEtVm9yZ2FuZyB2ZXJrbsO8cGZlbic7CiAgICAkTGFuZy0+eydMaW5rIHdpdGggZXhpc3RpbmcgaXNzdWUnfSAgICAgICAgICA9ICdNaXQgYmVzdGVoZW5kZW0gVm9yZ2FuZyB2ZXJrbsO8cGZlbic7CiAgICAkTGFuZy0+e0VkaXRhYmxlfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfDhG5kZXJiYXInOwogICAgJExhbmctPntIaWRlfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQXVzYmxlbmRlbic7CiAgICAkTGFuZy0+e1JlYWRvbmx5fSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdOdXIgQW56ZWlnZSc7CiAgICAKICAgICRMYW5nLT57J2FsbCBhcnRpY2xlcyd9ID0gJ0FsbGUgQXJ0aWtlbCc7CiAgICAkTGFuZy0+eydvbmx5IGZpcnN0IGFydGljbGUnfSA9ICdOdXIgZXJzdGVyIEFydGlrZWwnOwoKICAgICRMYW5nLT57J0dvIHRvIEFkbWluIGFyZWEnfSA9ICdHZWhlIHp1bSBBZG1pbmJlcmVpY2gnOwogICAgJExhbmctPnsnQ29uZmlndXJhdGlvbiBkb25lJ30gPSAnS29uZmlndXJhdGlvbiBlcmxlZGlndCc7CiAgICAkTGFuZy0+eydOZXh0J30gPSAnV2VpdGVyJzsKICAgICRMYW5nLT57J09UUlMgVGlja2V0IEZpZWxkJ30gPSAnT1RSUyBUaWNrZXRmZWxkJzsKICAgICRMYW5nLT57J0ppcmEgRmllbGQnfSA9ICdKaXJhIEZlbGQnOwogICAgJExhbmctPnsnSmlyYSBTZXR0aW5ncyd9ID0gJ0ppcmEgRWluc3RlbGx1bmdlbic7CiAgICAkTGFuZy0+eydKaXJhIGNvcmUgc2V0dGluZ3MnfSA9ICdKaXJhIEdydW5kZWluc3RlbGx1bmdlbic7CiAgICAkTGFuZy0+eydJc3N1ZSBTZXR0aW5ncyd9ID0gJ0VpbnN0ZWxsdW5nZW4gSmlyYSBWb3JmYWxsJzsKICAgICRMYW5nLT57J0lzc3VlIHNldHRpbmdzJ30gPSAnRWluc3RlbGx1bmdlbiBKaXJhIFZvcmZhbGwnOwogICAgJExhbmctPnsnRmllbGRtYXBwaW5nJ30gID0gJ0ZlbGR6dW9yZG51bmcnOwoKICAgICRMYW5nLT57J0ppcmEgVVJMJ30gPSAnSmlyYSBVUkwnOwogICAgJExhbmctPnsnQVBJIFBhdGgnfSA9ICdBUEkgUGZhZCc7CiAgICAkTGFuZy0+eydVc2VyJ30gICAgID0gJ0JlbnV0emVyJzsKICAgICRMYW5nLT57J0ppcmEgdXNlciBPVFJTIHVzZXMgZm9yIEFQSSBjYWxscyd9ID0gJ0ppcmEtQmVudXR6ZXIsIGRlbiBPVFJTIGbDvHIgZGllIEFQSS1BdWZydWZlIGJlbnV0enQnOwogICAgJExhbmctPntQYXNzd29yZH0gPSAnUGFzc3dvcnQnOwogICAgJExhbmctPnsnSW5jb21pbmcgVXNlcid9ID0gJ0VpbmdlaGVuZGVyIEJlbnV0emVyJzsKICAgICRMYW5nLT57J09UUlMgdXNlciBKaXJhIHVzZXMgdG8gY2FsbCBPVFJTIFdlYnNlcnZpY2UnfSA9ICdPVFJTLUJlbnV0emVyLCBkZW4gSmlyYSBmw7xyIGRpZSBPVFJTLVdlYnNlcnZpY2VzIGJlbnV0enQnOwogICAgJExhbmctPnsnVXNlIERpYWxvZyd9ID0gJ051dHplIGRlbiBEaWFsb2cnOwogICAgJExhbmctPnsnV2hlbiB1c2luZyB0aGUgZGlhbG9nLCB5b3UgY2FuIGVkaXQgc29tZSBzZXR0aW5ncyBmb3IgdGhlIGlzc3VlIChlLmcuIHByb2plY3QsIGFzc2lnbmVlLi4uKSd9ID0KICAgICAgICAnV2VubiBkZXIgRGlhbG9nIHZlcndlbmRldCB3aXJkLCBrw7ZubmVuIGVpbmlnZSBFaW5zdGVsbHVuZ2VuIGbDvHIgZGVuIFZvcmZhbGwgKHouQi4gUHJvamVrdCwgQmVzaXR6ZXIsIC4uLikgZ2XDpG5kZXJ0IHdlcmRlbi4nOwogICAgJExhbmctPnsnU2hvdyBBc3NpZ25lZSAoZGlhbG9nKSd9ID0gJ1plaWdlIEJlc2l0emVyIChpbSBEaWFsb2cpJzsKICAgICRMYW5nLT57J1Nob3cgIkF1dG9tYXRpYyIgdXNlciAoZGlhbG9nKSd9ID0gJ1N0ZWxsZSBkZW4gImF1dG9tYXRpc2NoZW4iIEJlbnV0emVyIHp1ciBBdXN3YWhsJzsKICAgICRMYW5nLT57J1Nob3cgSXNzdWVUeXBlIChkaWFsb2cpJ30gPSAnWmVpZ2UgVm9yZmFsbHN0eXAgKGltIERpYWxvZyknOwogICAgJExhbmctPnsnU2hvdyBQcm9qZWN0IChkaWFsb2cpJ30gPSAnWmVpZ2UgUHJvamVrdCAoaW0gRGlhbG9nKSc7CiAgICAkTGFuZy0+eydQcm9qZWN0J30gPSAnUHJvamVrdCc7CiAgICAkTGFuZy0+eydJc3N1ZSBUeXBlJ30gPSAnVm9yZmFsbHN0eXAnOwogICAgJExhbmctPnsnUmVwb3J0ZXInfSA9ICdSZXBvcnRlcic7CiAgICAkTGFuZy0+eydEbyBub3Qgc2V0IEFzc2lnbmVlJ30gPSAnU2V0emUgbmljaHQgZGVuIEJlc2l0emVyJzsKICAgICRMYW5nLT57J0Fzc2lnbmVlJ30gPSAnQmVzaXR6ZXInOwogICAgJExhbmctPnsnRHluYW1pYyBGaWVsZCd9ID0gJ0R5bmFtaXNjaGVzIEZlbGQnOwoKICAgICRMYW5nLT57J1RoZXNlIGluZm9ybWF0aW9uIGFyZSB0cmFuc2ZlcnJlZCBhdXRvbWF0aWNhbGx5Oid9ID0gJ0RpZXNlIEluZm9ybWF0aW9uZW4gd2VyZGVuIGF1dG9tYXRpc2NoIMO8YmVydHJhZ2VuJzsKICAgICRMYW5nLT57J1Byb2plY3QgKHN0YW5kYXJkIHZhbHVlIGZyb20gU3lzQ29uZmlnIG9yIHNlbGVjdGVkIHByb2plY3QpJ30gPSAnUHJvamVrdCAoU3RhbmRhcmR3ZXJ0IGF1cyBkZXIgU3lzQ29uZmlnIG9kZXIgYXVzZ2V3w6RobHRlcyBQcm9qZWt0KSc7CiAgICAkTGFuZy0+eydJc3N1ZXR5cGUgKHN0YW5kYXJkIHZhbHVlIGZyb20gU3lzQ29uZmlnIG9yIHNlbGVjdGVkIGlzc3VldHlwZSknfSA9ICdWb3JnYW5nc3R5cCAoU3RhbmRhcmR3ZXJ0IGF1cyBkZXIgU3lzQ29uZmlnIG9kZXIgYXVzZ2V3w6RobHRlciBWb3JnYW5nc3R5cCknOwogICAgJExhbmctPnsnU3VtbWFyeSAodGlja2V0IHRpdGxlKSd9ID0gJ1p1c2FtbWVuZmFzc3VuZyAoVGlja2V0LVRpdGxlKSc7CiAgICAkTGFuZy0+eydEZXNjcmlwdGlvbiAoYXJ0aWNsZSBib2R5KSd9ID0gJ0Jlc2NocmVpYnVuZyAoQXJ0aWtlbHRleHQpJzsKICAgICRMYW5nLT57J1JlcG9ydGVyIChzdGFuZGFyZCB2YWx1ZSBmcm9tIFN5c0NvbmZpZyBvciBzZWxlY3RlZCByZXBvcnRlciknfSA9ICdSZXBvcnRlciAoU3RhbmRhcmR3ZXJ0IGF1cyBkZXIgU3lzQ29uZmlnIG9kZXIgYXVzZ2V3w6RobHRlciBSZXBvcnRlciknOwogICAgJExhbmctPnsnQXNzaWduZWUgKHN0YW5kYXJkIHZhbHVlIGZyb20gU3lzQ29uZmlnIG9yIHNlbGVjdGVkIGFzc2lnbmVlKSd9ID0gJ1p1Z2V3aWVzZW5lIFBlcnNvbiAoU3RhbmRhcmR3ZXJ0IGF1cyBkZXIgU3lzQ29uZmlnIG9kZXIgYXVzZ2V3w6RobHRlIFBlcnNvbiknOwogICAgJExhbmctPnsnT1RSU1RpY2tldElEIGN1c3RvbWZpZWxkICh0aWNrZXQgaWQpJ30gPSAnQmVudXR6ZXJkZWZpbmllcnRlcyBGZWxkIE9UUlNUaWNrZXRJRCAoVGlja2V0LUlEKSc7CiAgICAkTGFuZy0+eydUaGlzIG1hcHBpbmcgZGVmaW5lcyB3aGljaCBpbmZvcm1hdGlvbiBhcmUgdHJhbnNmZXJyZWQgZnJvbSBPVFJTIHRvIEppcmEuIE9uIHRoZSBsZWZ0IHlvdSBzZWUgYWxsIHRoZSBhdmFpbGFibGUgaW5mb3JtYXRpb24gaW4gT1RSUyBhbmQgb24gdGhlIHJpZ2h0IHlvdSBzZWUgdGhlIGZpZWxkcyBpbiBKaXJhLiBQbGVhc2Uga2VlcCBpbiBtaW5kLCB0aGF0IHRoZSB0eXBlIG9mIHRoZSBmaWVsZHMgc2hvdWxkIG1hdGNoIChkYXRlL3RpbWUgaW5mb3JtYXRpb24gaW4gT1RSUyBuZWVkIHRvIGJlIHN0b3JlZCBpbiBhIGRhdGUvdGltZSBmaWVsZCBpbiBKaXJhKSd9ID0gJ0RpZSBGZWxkenVvcmRudW5nIGJlc3RpbW10LCB3ZWxjaGUgSW5mb3JtYXRpb25lbiBhdXMgZGVtIE9UUlMgbmFjaCBKaXJhIMO8YmVydHJhZ2VuIHdlcmRlbi4gQXVmIGRlciBsaW5rZW4gU2VpdGUgc2VoZW4gU2llIGFsbGUgSW5mb3JtYXRpb25lbiBkaWUgaW0gT1RSUyB6dXIgVmVyZsO8Z3VuZyBzdGVoZW4sIGF1ZiBkZXIgcmVjaHRlbiBTaWV0ZSBkaWUgRmVsZGVyIGluIEppcmEuIEJpdHRlIGJlYWNodGVuIFNpZSwgZGFzcyBkaWUgRmVsZHR5cGVuIHp1ZWluYW5kZXIgcGFzc2VuIHNvbGx0ZW4gKERhdHVtL1plaXQtSW5mb3JtYXRpb25lbiBpbiBPVFJTIGJlbsO2dGlnZW4gZWluIERhdHVtL1plaXQtRmVsZCBpbiBKaXJhKSc7CgogICAgJExhbmctPnsnU2VuZCBSZXBvcnRlcid9ID0gJ1NldHplIGRlbiBSZXBvcnRlcic7CgogICAgcmV0dXJuIDE7Cn0KMTsK
IyAgLS0KIyAgS2VybmVsL0xhbmd1YWdlL2VuX0FnZW50VGlja2V0SklSQS5wbSAtIGxhbmd1YWdlIG1vZHVsZQojICBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxNSBjYXR3b3JreCBHbWJIIGh0dHA6Ly93d3cuY2F0d29ya3guZGUKIyAgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmVuX0FnZW50VGlja2V0SklSQTsKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBIG5ldyBKaXJhIElzc3VlIGhhcyBiZWVuIGNyZWF0ZWQnfSA9ICdBIG5ldyBKaXJhIElzc3VlIGhhcyBiZWVuIGNyZWF0ZWQnOwogICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBIEppcmEgSXNzdWUgY291bGQgbm90IGJlIGNyZWF0ZWQnfSA9ICdBIEppcmEgSXNzdWUgY291bGQgbm90IGJlIGNyZWF0ZWQnOwogICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUbyB0aGUgaXNzdWUgKEppcmEpJ30gPSAnVG8gdGhlIGlzc3VlIChKaXJhKSc7CiAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0JhY2sgdG8gdGhlIHRpY2tldCAoT1RSUyknfSA9ICdCYWNrIHRvIHRoZSB0aWNrZXQgKE9UUlMpJzsKICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGlja2V0IG5vdCBvcGVuLid9ID0gJ1RpY2tldCBub3Qgb3Blbi4nOwogICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydKaXJhIHRvIE9UUlMnfSA9ICdKaXJhIHRvIE9UUlMnOwogICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUYWtlIHRoaXMgdGlja2V0IGJhY2sgZnJvbSBKaXJhJ30gPSAnVGFrZSB0aGlzIHRpY2tldCBiYWNrIGZyb20gSmlyYSc7CiAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09UUlMgdG8gSmlyYSd9ID0gJ09UUlMgdG8gSmlyYSc7CiAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VzY2FsYXRlIHRoaXMgdGlja2V0IHRvIEppcmEnfSA9ICdFc2NhbGF0ZSB0aGlzIHRpY2tldCB0byBKaXJhJzsKICAgIyRTZWxmLT57VHJhbnNsYXRpb259LT57Jyd9ID0gJyc7CiAgIHJldHVybiAxOwp9CjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAxNyBQZXJsLVNlcnZpY2VzLmRlLCBodHRwOi8vd3d3LnBlcmwtc2VydmljZXMuZGUKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZG1pbkpJUkFRdWV1ZVNldHRpbmdzOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSBxdygKICAgIEtlcm5lbDo6Q29uZmlnCiAgICBLZXJuZWw6OlN5c3RlbTo6U3lzQ29uZmlnCiAgICBLZXJuZWw6OlN5c3RlbTo6UXVldWUKICAgIEtlcm5lbDo6U3lzdGVtOjpWYWxpZAogICAgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dAogICAgS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdAogICAgS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZAogICAgS2VybmVsOjpTeXN0ZW06OkpJUkE6OlF1ZXVlU2V0dGluZ3MKKTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgJFNlbGYtPntVc2VySUR9ID0gJFBhcmFte1VzZXJJRH07CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExheW91dE9iamVjdCAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICBteSAkUGFyYW1PYmplY3QgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKICAgIG15ICRTeXNDb25maWdPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c0NvbmZpZycpOwogICAgbXkgJFNldHRpbmdzT2JqZWN0ICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SklSQTo6UXVldWVTZXR0aW5ncycpOwogICAgbXkgJENvbmZpZ09iamVjdCAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJEpJUkEgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SklSQTo6VXRpbHMnKTsKCiAgICBteSAlR2V0UGFyYW07CiAgICBmb3IgbXkgJFBhcmFtICggcXcvUHJvamVjdElEIEFzc2lnbmVlIFF1ZXVlSUQgSUQgVmFsaWRJRC8gKSB7CiAgICAgICAgJEdldFBhcmFteyRQYXJhbX0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW0gKTsKICAgIH0KCiAgICBteSAlQWxsU2V0dGluZ3MgPSAkU2V0dGluZ3NPYmplY3QtPlNldHRpbmdzTGlzdCgpOwogICAgbXkgJFBhZ2VPdXRwdXQ7CgogICAgJFNlbGYtPntTdWJhY3Rpb259IC8vPSAnJzsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHVwZGF0ZSBhY3Rpb24KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTYXZlJyApIHsKCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgIyBzZXJ2ZXIgc2lkZSB2YWxpZGF0aW9uCiAgICAgICAgbXkgJUVycm9yczsKICAgICAgICBpZiAoICEkU2VsZi0+X0NoZWNrUXVldWUoICVHZXRQYXJhbSApICkgewogICAgICAgICAgICAlRXJyb3JzID0gKCBRdWV1ZUludmFsaWQgPT4gJ1NlcnZlckVycm9yJyApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAlRXJyb3JzICkgewogICAgICAgICAgICAkU2VsZi0+e1N1YmFjdGlvbn0gPSAnRWRpdCc7CgogICAgICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT5fTWFzaygKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVFcnJvcnMsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CgogICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICB9CgogICAgICAgIG15ICRNZXRob2QgPSAnU2V0dGluZ3NBZGQnOwogICAgICAgIGlmICggJEFsbFNldHRpbmdzeyAkR2V0UGFyYW17SUR9IH0gKSB7CiAgICAgICAgICAgICRNZXRob2QgPSAnU2V0dGluZ3NVcGRhdGUnOwogICAgICAgIH0KCiAgICAgICAgJFNldHRpbmdzT2JqZWN0LT4kTWV0aG9kKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KAogICAgICAgICAgICBPUCA9PiAnQWN0aW9uPUFkbWluSklSQVF1ZXVlU2V0dGluZ3MnLAogICAgICAgICk7CiAgICB9CgogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FKQVhVcGRhdGUnICkgewogICAgICAgIG15ICRVc2VycyAgID0ge307CiAgICAgICAgbXkgJFByb2plY3QgPSAkR2V0UGFyYW17UHJvamVjdElEfTsKCiAgICAgICAgaWYgKCAkUHJvamVjdCApIHsKICAgICAgICAgICAgJFVzZXJzID0gJEpJUkEtPlVzZXJzR2V0KCBQcm9qZWN0ID0+ICRQcm9qZWN0ICk7CiAgICAgICAgfQoKICAgICAgICBteSAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uSlNPTigKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnQXNzaWduZWUnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkVXNlcnMsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtBc3NpZ25lZX0sCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnRGVsZXRlJyApIHsKCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgJFNldHRpbmdzT2JqZWN0LT5TZXR0aW5nc0RlbGV0ZSggUXVldWVJRCA9PiAkR2V0UGFyYW17UXVldWVJRH0gKTsKCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KAogICAgICAgICAgICBPUCA9PiAnQWN0aW9uPUFkbWluSklSQVF1ZXVlU2V0dGluZ3MnLAogICAgICAgICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBBZGQvRWRpdCBtYXNrCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnRWRpdCcgKSB7CiAgICAgICAgJFBhZ2VPdXRwdXQgPSAkU2VsZi0+X01hc2soICVHZXRQYXJhbSApOwogICAgfQoKICAgICRQYWdlT3V0cHV0IC8vPSAkU2VsZi0+X092ZXJ2aWV3KCBBbGxTZXR0aW5ncyA9PiBcJUFsbFNldHRpbmdzICk7CgogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAkT3V0cHV0IC49ICRQYWdlT3V0cHV0OwogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgIHJldHVybiAkT3V0cHV0Owp9CgpzdWIgX0NoZWNrUXVldWUgewogICAgbXkgKCRTZWxmLCAlUGFyYW0pID0gQF87CgogICAgbXkgJFNldHRpbmdzT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkpJUkE6OlF1ZXVlU2V0dGluZ3MnKTsKCiAgICByZXR1cm4gaWYgISRQYXJhbXtRdWV1ZUlEfTsKICAgIHJldHVybiAxIGlmICRQYXJhbXtJRH0gJiYgJFBhcmFte0lEfSA9PSAkUGFyYW17UXVldWVJRH07CgogICAgbXkgJVNldHRpbmdzID0gJFNldHRpbmdzT2JqZWN0LT5TZXR0aW5nc0dldCggUXVldWVJRCA9PiAkUGFyYW17UXVldWVJRH0gKTsKICAgIHJldHVybiAxIGlmICElU2V0dGluZ3M7Cn0KCnN1YiBfT3ZlcnZpZXcgewogICAgbXkgKCRTZWxmLCAlUGFyYW0pID0gQF87CgogICAgbXkgJExheW91dE9iamVjdCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgbXkgJFNldHRpbmdzT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkpJUkE6OlF1ZXVlU2V0dGluZ3MnKTsKICAgIG15ICRKSVJBICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpKSVJBOjpVdGlscycpOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdBZGRBY3Rpb24nICk7CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnU2V0dGluZ3NPdmVydmlldycgKTsKCiAgICBteSAlQWxsU2V0dGluZ3MgID0gJXsgJFBhcmFte0FsbFNldHRpbmdzfSB8fCB7fSB9OwogICAgbXkgJEpJUkFQcm9qZWN0cyA9ICRKSVJBLT5Qcm9qZWN0c0dldCggRm9yY2UgPT4gMSApOwoKICAgIGlmICggISVBbGxTZXR0aW5ncyApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTm9TZXR0aW5nc0ZvdW5kJywKICAgICAgICApOwogICAgfQoKICAgIGZvciBteSAkU2V0dGluZ3NJRCAoIHNvcnQgeyAkQWxsU2V0dGluZ3N7JGF9IGNtcCAkQWxsU2V0dGluZ3N7JGJ9IH0ga2V5cyAlQWxsU2V0dGluZ3MgKSB7CiAgICAgICAgbXkgJURhdGEgPSAkU2V0dGluZ3NPYmplY3QtPlNldHRpbmdzR2V0KCBRdWV1ZUlEID0+ICRTZXR0aW5nc0lEICk7CgogICAgICAgIGlmICggJERhdGF7UHJvamVjdElEfSApIHsKICAgICAgICAgICAgJERhdGF7UHJvamVjdH0gPSAkSklSQVByb2plY3RzLT57ICREYXRhe1Byb2plY3RJRH0gfSAvLyAnJzsKICAgICAgICB9CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTZXR0aW5nJywKICAgICAgICAgICAgRGF0YSA9PiBcJURhdGEsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5KSVJBUXVldWVTZXR0aW5ncycsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHt9LAogICAgKTsKfQoKc3ViIF9NYXNrIHsKICAgIG15ICgkU2VsZiwgJVBhcmFtKSA9IEBfOwoKICAgIG15ICRMYXlvdXRPYmplY3QgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRRdWV1ZU9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpOwogICAgbXkgJFZhbGlkT2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyk7CiAgICBteSAkSklSQSAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SklSQTo6VXRpbHMnKTsKICAgIG15ICRTZXR0aW5nc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpKSVJBOjpRdWV1ZVNldHRpbmdzJyk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ092ZXJ2aWV3QWN0aW9uJyApOwoKICAgIG15ICVTZXR0aW5nOwogICAgaWYgKCAkUGFyYW17UXVldWVJRH0gKSB7CiAgICAgICAgJVNldHRpbmcgICA9ICRTZXR0aW5nc09iamVjdC0+U2V0dGluZ3NHZXQoIFF1ZXVlSUQgPT4gJFBhcmFte1F1ZXVlSUR9ICk7CiAgICAgICAgJFBhcmFte0lEfSA9ICRQYXJhbXtRdWV1ZUlEfTsKICAgIH0KCiAgICBteSAkVXNlcnMgICA9IHt9OwogICAgbXkgJFByb2plY3QgPSAkUGFyYW17UHJvamVjdElEfSB8fCAkU2V0dGluZ3tQcm9qZWN0SUR9OwoKICAgIGlmICggJFByb2plY3QgKSB7CiAgICAgICAgJFVzZXJzID0gJEpJUkEtPlVzZXJzR2V0KCBQcm9qZWN0ID0+ICRQcm9qZWN0ICk7CiAgICB9CgogICAgbXkgJVF1ZXVlcyAgICAgICA9ICRRdWV1ZU9iamVjdC0+UXVldWVMaXN0KCBVc2VySUQgPT4gMSApOwogICAgbXkgJEpJUkFQcm9qZWN0cyA9ICRKSVJBLT5Qcm9qZWN0c0dldCggRm9yY2UgPT4gMSApOwoKICAgICRQYXJhbXtWYWxpZFNlbGVjdH0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBOYW1lICAgICAgICA9PiAnVmFsaWRJRCcsCiAgICAgICAgRGF0YSAgICAgICAgPT4geyAkVmFsaWRPYmplY3QtPlZhbGlkTGlzdCgpIH0sCiAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJFBhcmFte1ZhbGlkSUR9IHx8ICRTZXR0aW5ne1ZhbGlkSUR9LAogICAgICAgIENsYXNzICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgKTsKCiAgICAkUGFyYW17UXVldWVTZWxlY3R9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgTmFtZSAgICAgICAgPT4gJ1F1ZXVlSUQnLAogICAgICAgIERhdGEgICAgICAgID0+IFwlUXVldWVzLAogICAgICAgIENsYXNzICAgICAgID0+ICdNb2Rlcm5pemUgJyAuICggJFBhcmFte1F1ZXVlSW52YWxpZH0gLy8gJycgKSwKICAgICAgICBUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgIFNlbGVjdGVkSUQgID0+ICRQYXJhbXtRdWV1ZUlEfSB8fCAkU2V0dGluZ3tRdWV1ZUlEfSwKICAgICk7CgogICAgJFBhcmFte1Byb2plY3RTZWxlY3R9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgTmFtZSAgICAgICAgID0+ICdQcm9qZWN0SUQnLAogICAgICAgIERhdGEgICAgICAgICA9PiAkSklSQVByb2plY3RzLAogICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1Byb2plY3RJRH0gfHwgJFNldHRpbmd7UHJvamVjdElEfSwKICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICk7CgogICAgJFBhcmFte1VzZXJzU2VsZWN0fSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIE5hbWUgICAgICAgICA9PiAnQXNzaWduZWUnLAogICAgICAgIERhdGEgICAgICAgICA9PiAkVXNlcnMsCiAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17QXNzaWduZWV9IHx8ICRTZXR0aW5ne0Fzc2lnbmVlfSwKICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnU2V0dGluZ3NNYXNrJywKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwoKICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkpJUkFRdWV1ZVNldHRpbmdzJywKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICk7Cn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAxNiBQZXJsLVNlcnZpY2VzLmRlLCBodHRwOi8vd3d3LnBlcmwtc2VydmljZXMuZGUKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZG1pbkpJUkFXaXphcmQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9IHF3KAogICAgS2VybmVsOjpDb25maWcKICAgIEtlcm5lbDo6U3lzdGVtOjpTeXNDb25maWcKICAgIEtlcm5lbDo6U3lzdGVtOjpWYWxpZAogICAgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dAogICAgS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdAogICAgS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZAopOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAkU2VsZi0+e1VzZXJJRH0gPSAkUGFyYW17VXNlcklEfTsKCiAgICAkU2VsZi0+e1N0ZXAxfSA9IFsKICAgICAgICB7CiAgICAgICAgICAgIExhYmVsICAgICA9PiAnSmlyYSBVUkwnLAogICAgICAgICAgICBGaWVsZCAgICAgPT4gJ1VSTCcsCiAgICAgICAgICAgIFN5c0NvbmZpZyA9PiAnVVJMJywKICAgICAgICAgICAgRXh0cmEgICAgID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgICA9PiAnRHluYW1pY0ZpZWxkJywKICAgICAgICAgICAgICAgIE5hbWUgICA9PiAnSklSQUlzc3VlSUQnLAogICAgICAgICAgICAgICAgQXR0ciAgID0+ICdMaW5rJywKICAgICAgICAgICAgICAgIEZvcm1hdCA9PiAnJXMvYnJvd3NlL1slJSBEYXRhLkpJUkFJc3N1ZUlEIHwgdXJsICUlXScsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIExhYmVsICAgICA9PiAnQVBJIFBhdGgnLAogICAgICAgICAgICBGaWVsZCAgICAgPT4gJ1BhdGgnLAogICAgICAgICAgICBTeXNDb25maWcgPT4gJ1BhdGgnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBMYWJlbCAgICAgPT4gJ1VzZXInLAogICAgICAgICAgICBIaW50ICAgICAgPT4gJ0ppcmEgdXNlciBPVFJTIHVzZXMgZm9yIEFQSSBjYWxscycsCiAgICAgICAgICAgIEZpZWxkICAgICA9PiAnVXNlcicsCiAgICAgICAgICAgIFN5c0NvbmZpZyA9PiAnVXNlcicsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIExhYmVsICAgICA9PiAnUGFzc3dvcmQnLAogICAgICAgICAgICBGaWVsZCAgICAgPT4gJ1Bhc3N3b3JkJywKICAgICAgICAgICAgU3lzQ29uZmlnID0+ICdQYXNzd29yZCcsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIExhYmVsICAgICA9PiAnSW5jb21pbmcgVXNlcicsCiAgICAgICAgICAgIEhpbnQgICAgICA9PiAnT1RSUyB1c2VyIEppcmEgdXNlcyB0byBjYWxsIE9UUlMgV2Vic2VydmljZScsCiAgICAgICAgICAgIEZpZWxkICAgICA9PiAnSW5jb21pbmdVc2VyJywKICAgICAgICAgICAgU3lzQ29uZmlnID0+ICdJbmNvbWluZ1VzZXInLAogICAgICAgIH0sCiAgICBdOwoKICAgICRTZWxmLT57U3RlcDJ9ID0gWwogICAgICAgIHsKICAgICAgICAgICAgTGFiZWwgICAgID0+ICdQcm9qZWN0JywKICAgICAgICAgICAgRmllbGQgICAgID0+ICdQcm9qZWN0JywKICAgICAgICAgICAgU3lzQ29uZmlnID0+ICdUaWNrZXRKSVJBIyMjUHJvamVjdCcsCiAgICAgICAgICAgIERhdGEgICAgICA9PiAnSklSQVByb2plY3RzJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTGFiZWwgICAgID0+ICdJc3N1ZSBUeXBlJywKICAgICAgICAgICAgRmllbGQgICAgID0+ICdJc3N1ZVR5cGUnLAogICAgICAgICAgICBTeXNDb25maWcgPT4gJ1RpY2tldEpJUkEjIyNJc3N1ZVR5cGUnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBMYWJlbCAgICAgICAgPT4gJ1NlbmQgUmVwb3J0ZXInLAogICAgICAgICAgICBGaWVsZCAgICAgICAgPT4gJ1NlbmRSZXBvcnRlcicsCiAgICAgICAgICAgIFN5c0NvbmZpZyAgICA9PiAnSklSQTo6U2VuZFJlcG9ydGVyJywKICAgICAgICAgICAgVHJhbnNsYXRhYmxlID0+IDEsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAwID0+ICdObycsCiAgICAgICAgICAgICAgICAxID0+ICdZZXMnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWIgPT4gewogICAgICAgICAgICAgICAgMSA9PiBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBMYWJlbCAgICAgPT4gJ1JlcG9ydGVyJywKICAgICAgICAgICAgICAgICAgICAgICAgRmllbGQgICAgID0+ICdSZXBvcnRlcicsCiAgICAgICAgICAgICAgICAgICAgICAgIFN5c0NvbmZpZyA9PiAnVGlja2V0SklSQSMjI1JlcG9ydGVyJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTGFiZWwgICAgID0+ICdDdXN0b20gZmllbGQgT1RSU1RpY2tldElEJywKICAgICAgICAgICAgRmllbGQgICAgID0+ICdPVFJTVGlja2V0SUQnLAogICAgICAgICAgICBTeXNDb25maWcgPT4gJ0pJUkE6Ok9UUlNUaWNrZXRJREZpZWxkJywKICAgICAgICAgICAgRGF0YSAgICAgID0+ICdKSVJBQ3VzdG9tRmllbGRzJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTGFiZWwgICAgICAgID0+ICdEbyBub3Qgc2V0IEFzc2lnbmVlJywKICAgICAgICAgICAgRmllbGQgICAgICAgID0+ICdOb0Fzc2lnbmVlJywKICAgICAgICAgICAgU3lzQ29uZmlnICAgID0+ICdKSVJBOjpOb0Fzc2lnbmVlJywKICAgICAgICAgICAgVHJhbnNsYXRhYmxlID0+IDEsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAwID0+ICdObycsCiAgICAgICAgICAgICAgICAxID0+ICdZZXMnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWIgPT4gewogICAgICAgICAgICAgICAgMCA9PiBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBMYWJlbCAgICAgPT4gJ0Fzc2lnbmVlJywKICAgICAgICAgICAgICAgICAgICAgICAgRmllbGQgICAgID0+ICdBc3NpZ25lZScsCiAgICAgICAgICAgICAgICAgICAgICAgIFN5c0NvbmZpZyA9PiAnVGlja2V0SklSQSMjI0Fzc2lnbmVlJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTGFiZWwgICAgICAgID0+ICdVc2UgRGlhbG9nJywKICAgICAgICAgICAgRmllbGQgICAgICAgID0+ICdEaWFsb2cnLAogICAgICAgICAgICBTeXNDb25maWcgICAgPT4gJ0pJUkE6OlNob3dEaWFsb2cnLAogICAgICAgICAgICBIaW50ICAgICAgICAgPT4gJ1doZW4gdXNpbmcgdGhlIGRpYWxvZywgeW91IGNhbiBlZGl0IHNvbWUgc2V0dGluZ3MgZm9yIHRoZSBpc3N1ZSAoZS5nLiBwcm9qZWN0LCBhc3NpZ25lZS4uLiknLAogICAgICAgICAgICBUcmFuc2xhdGFibGUgPT4gMSwKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgIDAgPT4gJ05vJywKICAgICAgICAgICAgICAgIDEgPT4gJ1llcycsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1YiA9PiB7CiAgICAgICAgICAgICAgICAxID0+IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIExhYmVsICAgICAgICA9PiAnU2hvdyBBc3NpZ25lZSAoZGlhbG9nKScsCiAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkICAgICAgICA9PiAnU2hvd0Fzc2lnbmVlJywKICAgICAgICAgICAgICAgICAgICAgICAgU3lzQ29uZmlnICAgID0+ICdKSVJBOjpTaG93QXNzaWduZWUnLAogICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGFibGUgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xID0+ICdIaWRlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgPT4gJ1JlYWRvbmx5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgPT4gJ0VkaXRhYmxlJywKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgTGFiZWwgICAgICAgID0+ICdTaG93ICJBdXRvbWF0aWMiIHVzZXIgKGRpYWxvZyknLAogICAgICAgICAgICAgICAgICAgICAgICBGaWVsZCAgICAgICAgPT4gJ1Nob3dBdXRvbWF0aWNVc2VyJywKICAgICAgICAgICAgICAgICAgICAgICAgU3lzQ29uZmlnICAgID0+ICdKSVJBOjpTaG93QXV0b21hdGljVXNlcicsCiAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0YWJsZSA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgMCA9PiAnTm8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMSA9PiAnRWRpdGFibGUnLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBMYWJlbCAgICAgICAgPT4gJ1Nob3cgSXNzdWVUeXBlIChkaWFsb2cpJywKICAgICAgICAgICAgICAgICAgICAgICAgRmllbGQgICAgICAgID0+ICdTaG93SXNzdWVUeXBlJywKICAgICAgICAgICAgICAgICAgICAgICAgU3lzQ29uZmlnICAgID0+ICdKSVJBOjpTaG93SXNzdWVUeXBlJywKICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRhYmxlID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSA9PiAnSGlkZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwID0+ICdSZWFkb25seScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxID0+ICdFZGl0YWJsZScsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIExhYmVsICAgICAgICA9PiAnU2hvdyBQcm9qZWN0IChkaWFsb2cpJywKICAgICAgICAgICAgICAgICAgICAgICAgRmllbGQgICAgICAgID0+ICdTaG93UHJvamVjdCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFN5c0NvbmZpZyAgICA9PiAnSklSQTo6U2hvd1Byb2plY3QnLAogICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGFibGUgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xID0+ICdIaWRlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgPT4gJ1JlYWRvbmx5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgPT4gJ0VkaXRhYmxlJywKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgXTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkTGF5b3V0T2JqZWN0ICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRQYXJhbU9iamVjdCAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwogICAgbXkgJFN5c0NvbmZpZ09iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3lzQ29uZmlnJyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgJFNlbGYtPntTdWJhY3Rpb259IC8vPSAnU3RlcDEnOwoKICAgIG15ICgkSW5kZXgpID0gJFNlbGYtPntTdWJhY3Rpb259ID1+IG17KFxkKX14bXM7CiAgICAkSW5kZXggICAgLy89IDE7CgogICAgbXkgQFN0ZXBzID0gcXcoSklSQSBJc3N1ZSBNYXBwaW5nKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnU3RlcHMnICk7CiAgICBmb3IgbXkgJFN0ZXBJbmRleCAoIDAgLi4gJCNTdGVwcyApIHsKICAgICAgICBteSAkQWN0aXZlID0gJFN0ZXBJbmRleCA9PSAkSW5kZXgtMSA/ICdBY3RpdmUnIDogJyc7CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTdGVwJyAuICRTdGVwc1skU3RlcEluZGV4XSwKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBTdGVwICAgPT4gJFN0ZXBJbmRleCArIDEsCiAgICAgICAgICAgICAgICBBY3RpdmUgPT4gJEFjdGl2ZSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgYmFzaWMgSklSQSBpbmZvcm1hdGlvbgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgaWYgKCAhJFNlbGYtPntTdWJhY3Rpb259IHx8ICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU3RlcDEnICkgewogICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT5fU3RlcDEoKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgdXBkYXRlIGFjdGlvbgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1N0ZXAyJyApIHsKCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgIyBzZXJ2ZXIgc2lkZSB2YWxpZGF0aW9uCiAgICAgICAgbXkgJUVycm9ycyA9ICRTZWxmLT5fQ2hlY2tTdGVwMSgpOwoKICAgICAgICBpZiAoICVFcnJvcnMgKSB7CiAgICAgICAgICAgICRTZWxmLT57U3ViYWN0aW9ufSA9ICdFZGl0JzsKCiAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9TdGVwMSgKICAgICAgICAgICAgICAgICVFcnJvcnMsCiAgICAgICAgICAgICAgICBTdWJtaXR0ZWQgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCiAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU3RlcDFTYXZlJyApICkgewogICAgICAgICAgICAkU2VsZi0+X1NhdmVTdGVwMSgpOwogICAgICAgIH0KCiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9TdGVwMigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBzdGVwMwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1N0ZXAzJyApIHsKCiAgICAgICAgIyBzZXJ2ZXIgc2lkZSB2YWxpZGF0aW9uCiAgICAgICAgbXkgJUVycm9ycyA9ICRTZWxmLT5fQ2hlY2tTdGVwMigpOwoKICAgICAgICBpZiAoICVFcnJvcnMgKSB7CiAgICAgICAgICAgICRTZWxmLT57U3ViYWN0aW9ufSA9ICdFZGl0JzsKCiAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9TdGVwMigKICAgICAgICAgICAgICAgICVFcnJvcnMsCiAgICAgICAgICAgICAgICBTdWJtaXR0ZWQgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCiAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU3RlcDJTYXZlJyApICkgewogICAgICAgICAgICAkU2VsZi0+X1NhdmVTdGVwMigpOwogICAgICAgIH0KCiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9TdGVwMygpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBzdGVwMwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1N0ZXAzU2F2ZScgKSB7CgogICAgICAgICMgY2hhbGxlbmdlIHRva2VuIGNoZWNrIGZvciB3cml0ZSBhY3Rpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgICAgICMgc2VydmVyIHNpZGUgdmFsaWRhdGlvbgogICAgICAgIG15ICVFcnJvcnMgPSAkU2VsZi0+X0NoZWNrU3RlcDMoKTsKCiAgICAgICAgaWYgKCAlRXJyb3JzICkgewogICAgICAgICAgICAkU2VsZi0+e1N1YmFjdGlvbn0gPSAnRWRpdCc7CgogICAgICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT5fU3RlcDMoCiAgICAgICAgICAgICAgICAlRXJyb3JzLAogICAgICAgICAgICApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwoKICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+X1NhdmVTdGVwMygpOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnVGhhbmtZb3UnICk7CgogICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCggVGVtcGxhdGVGaWxlID0+ICdBZG1pbkpJUkFXaXphcmQnICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBlbHNlICEgcHJpbnQgZm9ybQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KCBPUCA9PiAnQWN0aW9uPUFkbWluSklSQVdpemFyZCcgKTsKICAgIH0KfQoKc3ViIF9TdGVwMSB7CiAgICBteSAoJFNlbGYsICVQYXJhbSkgPSBAXzsKCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkUGFyYW1PYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ1N0ZXAxJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgSXRlbSA9PiAnSklSQSBjb3JlIHNldHRpbmdzJywKICAgICAgICAgICAgU3RlcCA9PiAxLAogICAgICAgIH0sCiAgICApOwoKICAgIGlmICggJFBhcmFte01lc3NhZ2V9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTdGVwMUhhc0Vycm9yJywKICAgICAgICAgICAgRGF0YSA9PiB7IEVycm9yTWVzc2FnZSA9PiAkUGFyYW17TWVzc2FnZX0gfSwKICAgICAgICApOwogICAgfQoKICAgIG15IEBGaWVsZHMgPSBAeyAkU2VsZi0+e1N0ZXAxfSB8fCBbXSB9OwogICAgbXkgJENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0SklSQScpOwoKICAgIEZJRUxEOgogICAgZm9yIG15ICRGaWVsZCAoIEBGaWVsZHMgKSB7CiAgICAgICAgbXkgJFN1YmNvbmZpZyA9ICRGaWVsZC0+e1N5c0NvbmZpZ307CiAgICAgICAgbXkgJFZhbHVlID0gJENvbmZpZy0+eyRTdWJjb25maWd9OwoKICAgICAgICBpZiAoICRQYXJhbXtTdWJtaXR0ZWR9ICkgewogICAgICAgICAgICAkVmFsdWUgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkRmllbGQtPntGaWVsZH0gKTsKICAgICAgICB9CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdGaWVsZCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJXsgJEZpZWxkIHx8IHt9IH0sCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkVmFsdWUsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0ZpZWxkSW5wdXQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICV7ICRGaWVsZCB8fCB7fSB9LAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJFZhbHVlLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgIGlmICggJEZpZWxkLT57SGludH0gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRmllbGRIaW50JywKICAgICAgICAgICAgICAgIERhdGEgPT4gJEZpZWxkLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5KSVJBV2l6YXJkJywKICAgICAgICBEYXRhICAgICAgICAgPT4ge30sCiAgICApOwp9CgpzdWIgX0NoZWNrU3RlcDEgewogICAgbXkgKCRTZWxmKSA9IEBfOwoKICAgIG15ICRQYXJhbU9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgcmV0dXJuIGlmICEkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU3RlcDFTYXZlJyApOwoKICAgICMgYWxsIGZpZWxkcyBhcmUgbWFuZGF0b3J5CiAgICBteSBARmllbGRzID0gQHsgJFNlbGYtPntTdGVwMX0gfHwgW10gfTsKCiAgICBteSAlRXJyb3JzOwogICAgbXkgJUdldFBhcmFtOwoKICAgIEZJRUxEOgogICAgZm9yIG15ICRGaWVsZCAoIEBGaWVsZHMgKSB7CiAgICAgICAgbXkgJFZhbHVlID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJEZpZWxkLT57RmllbGR9ICk7CgogICAgICAgICRHZXRQYXJhbXskRmllbGQtPntGaWVsZH19ID0gJFZhbHVlOwoKICAgICAgICBpZiAoICFkZWZpbmVkICRWYWx1ZSB8fCAkVmFsdWUgZXEgJycgKSB7CiAgICAgICAgICAgICRFcnJvcnN7TWVzc2FnZX0gPSAnQWxsIGZpZWxkcyBhcmUgbWFuZGF0b3J5JzsKICAgICAgICAgICAgbGFzdCBGSUVMRDsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICVFcnJvcnMgaWYgJUVycm9yczsKCiAgICAjIGNoZWNrIGlmIEFQSSBpcyByZWFjaGFibGUKICAgIHsKICAgICAgICBsb2NhbCAkS2VybmVsOjpPTSA9IEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyLT5uZXcoCiAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6SklSQTo6VXRpbHMnID0+IHsKICAgICAgICAgICAgICAgIEpJUkFVUkwgID0+ICRHZXRQYXJhbXtVUkx9IC4gJEdldFBhcmFte1BhdGh9LAogICAgICAgICAgICAgICAgSklSQVVTRVIgPT4gJEdldFBhcmFte1VzZXJ9LAogICAgICAgICAgICAgICAgSklSQVBXRCAgPT4gJEdldFBhcmFte1Bhc3N3b3JkfSwKICAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJEpJUkEgICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpKSVJBOjpVdGlscycpOwogICAgICAgIG15ICgkU3RhdHVzLCAkTWVzc2FnZSkgPSAkSklSQS0+Q2hlY2soKTsKCiAgICAgICAgJFN0YXR1cyAvLz0gMDsKCiAgICAgICAgcmV0dXJuIGlmICRTdGF0dXMgPT0gMjAwOwoKICAgICAgICBpZiAoICRTdGF0dXMgPT0gNDA0ICYmICRNZXNzYWdlID1+IC9wYXJhbWV0ZXIvICkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFN0YXR1cyA9PSA0MDQgfHwgJFN0YXR1cyA9PSA1MDAgKSB7CiAgICAgICAgICAgICRFcnJvcnN7TWVzc2FnZX0gPSAiVGhlIFVSTCBtYXkgbm90IGJlIGNvcnJlY3QsIHdlIGNhbid0IGNvbm5lY3QgdG8gSmlyYSI7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFN0YXR1cyA9PSA0MDEgKSB7CiAgICAgICAgICAgICRFcnJvcnN7TWVzc2FnZX0gPSAiVGhlIGNyZWRlbnRpYWxzIGZvciB0aGUgSmlyYSB1c2VyIGFyZSBub3QgY29ycmVjdCI7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFN0YXR1cyA9PSA0MDMgKSB7CiAgICAgICAgICAgICRFcnJvcnN7TWVzc2FnZX0gPSAiQWNjZXNzIGRlbmllZCwgY2hlY2sgQVBJIHBhdGgiOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEVycm9yc3tNZXNzYWdlfSA9ICJFcnJvciAkU3RhdHVzOiAkTWVzc2FnZSI7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAlRXJyb3JzOwp9CgpzdWIgX1NhdmVTdGVwMSB7CiAgICBteSAoJFNlbGYpID0gQF87CgogICAgbXkgJFN5c0NvbmZpZ09iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTeXNDb25maWcnKTsKICAgIG15ICRQYXJhbU9iamVjdCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CiAgICBteSAkRHluYW1pY0ZpZWxkT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpOwoKICAgIG15ICRCYXNlICAgPSAnVGlja2V0SklSQSc7CiAgICBteSBARmllbGRzID0gQHsgJFNlbGYtPntTdGVwMX0gfHwgW10gfTsKCiAgICBteSBAU2V0dGluZ3M7CgogICAgRklFTEQ6CiAgICBmb3IgbXkgJEZpZWxkICggQEZpZWxkcyApIHsKICAgICAgICBteSAoJFZhbHVlKSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRGaWVsZC0+e0ZpZWxkfSApOwoKICAgICAgICBteSAkRmllbGRuYW1lID0gJEZpZWxkLT57U3lzQ29uZmlnfTsKICAgICAgICBwdXNoIEBTZXR0aW5ncywgewogICAgICAgICAgICBOYW1lICAgICAgICAgICA9PiAiJEJhc2UjIyMkRmllbGRuYW1lIiwKICAgICAgICAgICAgRWZmZWN0aXZlVmFsdWUgPT4gJFZhbHVlLAogICAgICAgIH07CgogICAgICAgIGlmICggJEZpZWxkLT57RXh0cmF9ICkgewogICAgICAgICAgICBteSAkRXh0cmEgPSAkRmllbGQtPntFeHRyYX07CgogICAgICAgICAgICBpZiAoICRFeHRyYS0+e1R5cGV9IGVxICdEeW5hbWljRmllbGQnICkgewogICAgICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZCA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZEdldCgKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICRFeHRyYS0+e05hbWV9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBteSAkQXR0ciA9ICRFeHRyYS0+e0F0dHJ9OwogICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZC0+e0NvbmZpZ30tPnskQXR0cn0gPSBzcHJpbnRmICRFeHRyYS0+e0Zvcm1hdH0sICRWYWx1ZTsKCiAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRVcGRhdGUoCiAgICAgICAgICAgICAgICAgICAgJXsgJER5bmFtaWNGaWVsZCB8fCB7fSB9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIG15ICRTdWNjZXNzID0gJFN5c0NvbmZpZ09iamVjdC0+U2V0dGluZ3NTZXQoCiAgICAgICAgU2V0dGluZ3MgPT4gXEBTZXR0aW5ncywKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKfQoKc3ViIF9TdGVwMiB7CiAgICBteSAoJFNlbGYsICVQYXJhbSkgPSBAXzsKCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkUGFyYW1PYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwogICAgbXkgJExvZ09iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKICAgIG15ICRNYWluT2JqZWN0ICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ1N0ZXAyJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgSXRlbSA9PiAnSXNzdWUgc2V0dGluZ3MnLAogICAgICAgICAgICBTdGVwID0+IDIsCiAgICAgICAgfSwKICAgICk7CgogICAgaWYgKCAkUGFyYW17TWVzc2FnZX0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1N0ZXAySGFzRXJyb3InLAogICAgICAgICAgICBEYXRhID0+IHsgRXJyb3JNZXNzYWdlID0+ICRQYXJhbXtNZXNzYWdlfSB9LAogICAgICAgICk7CiAgICB9CgogICAgbXkgQEZpZWxkcyA9IEB7ICRTZWxmLT57U3RlcDJ9IHx8IFtdIH07CiAgICBteSAkQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXRKSVJBJyk7CgogICAgbXkgJEZpZWxkQ291bnQgPSAxOwoKICAgIEZJRUxEOgogICAgZm9yIG15ICRGaWVsZCAoIEBGaWVsZHMgKSB7CiAgICAgICAgbXkgJENvbmZpZ0tleSAgICAgICAgICA9ICRGaWVsZC0+e1N5c0NvbmZpZ307CiAgICAgICAgbXkgKHVuZGVmLCAkU3ViY29uZmlnKSA9IHNwbGl0IC9cI3szfS8sICRDb25maWdLZXk7CiAgICAgICAgbXkgJFZhbHVlICAgICAgICAgICAgICA9ICRDb25maWdLZXkgPX4gbXs6On0gPyAkQ29uZmlnT2JqZWN0LT5HZXQoICRDb25maWdLZXkgKSA6ICRDb25maWctPnskU3ViY29uZmlnfTsKCiAgICAgICAgaWYgKCAkUGFyYW17U3VibWl0dGVkfSApIHsKICAgICAgICAgICAgJFZhbHVlID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJEZpZWxkLT57RmllbGR9ICk7CiAgICAgICAgfQoKICAgICAgICBteSAkQ2xhc3MgID0gJEZpZWxkLT57Q2xhc3N9IC8vICcnOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRmllbGRTdGVwMicsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJXsgJEZpZWxkIHx8IHt9IH0sCiAgICAgICAgICAgICAgICBGaWVsZENsYXNzID0+ICRDbGFzcywKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgPT4gJFZhbHVlLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgIGlmICggISRGaWVsZC0+e0RhdGF9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0ZpZWxkSW5wdXQyJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICV7ICRGaWVsZCB8fCB7fSB9LAogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRWYWx1ZSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgaWYgKCAhcmVmICRGaWVsZC0+e0RhdGF9ICkgewogICAgICAgICAgICAgICAgbXkgJFN1YiA9ICRTZWxmLT5jYW4oICRGaWVsZC0+e0RhdGF9ICk7CiAgICAgICAgICAgICAgICAoJEZpZWxkLT57RGF0YX0sICRGaWVsZC0+e1ZhbHVlfSkgPSAkU2VsZi0+JFN1YiggJEZpZWxkLT57RmllbGR9ICkgaWYgJFN1YjsKCiAgICAgICAgICAgICAgICBpZiAoICEkUGFyYW17U3VibWl0dGVkfSApIHsKICAgICAgICAgICAgICAgICAgICAkVmFsdWUgPSAkRmllbGQtPntWYWx1ZX07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRTZWxlY3QgPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICRGaWVsZC0+e0ZpZWxkfSwKICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+ICRGaWVsZC0+e0RhdGF9LAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gJEZpZWxkLT57VHJhbnNsYXRhYmxlfSwKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICRWYWx1ZSwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgID0+ICJNb2Rlcm5pemUiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdGaWVsZFNlbGVjdDInLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgRmllbGQgPT4gJFNlbGVjdCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRGaWVsZC0+e0hpbnR9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0ZpZWxkSGludFN0ZXAyJywKICAgICAgICAgICAgICAgIERhdGEgPT4gJEZpZWxkLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkRmllbGQtPntTdWJ9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0ZpZWxkQ2hhbmdlU3RlcDInLAogICAgICAgICAgICAgICAgRGF0YSA9PiAkRmllbGQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSBAU3ViRmllbGRzOwoKICAgICAgICAgICAgS0VZOgogICAgICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyAkRmllbGQtPntTdWJ9IH0gKSB7CiAgICAgICAgICAgICAgICBteSAkRmllbGRDbGFzcyA9ICRGaWVsZC0+e0ZpZWxkfSAuICctJyAuICRLZXk7CiAgICAgICAgICAgICAgICBwdXNoIEBTdWJGaWVsZHMsIG1hcHsKICAgICAgICAgICAgICAgICAgICAkXy0+e0NsYXNzfSA9ICRGaWVsZENsYXNzOwogICAgICAgICAgICAgICAgICAgICRfOwogICAgICAgICAgICAgICAgfUB7ICRGaWVsZC0+e1N1Yn0tPnskS2V5fSB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBzcGxpY2UgQEZpZWxkcywgJEZpZWxkQ291bnQsIDAsIEBTdWJGaWVsZHM7CiAgICAgICAgfQogICAgfQogICAgY29udGludWUgewogICAgICAgICRGaWVsZENvdW50Kys7CiAgICB9CgogICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluSklSQVdpemFyZCcsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHt9LAogICAgKTsKfQoKc3ViIEpJUkFDdXN0b21GaWVsZHMgewogICAgbXkgKCRTZWxmKSA9IEBfOwoKICAgIG15ICRKSVJBVGlja2V0T2JqZWN0ICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0SklSQScpOwogICAgbXkgJENvbmZpZ09iamVjdCAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgoKICAgIG15ICRGaWVsZFR5cGVzID0gJEpJUkFUaWNrZXRPYmplY3QtPkZpZWxkc0dldCggUmV0dXJuID0+ICd0eXBlcycgKTsKICAgIG15ICRKSVJBRmllbGRzID0gJEpJUkFUaWNrZXRPYmplY3QtPkZpZWxkc0dldCgpOwoKICAgIG15ICVDdXN0b21GaWVsZHMgPSByZXZlcnNlICV7ICRKSVJBRmllbGRzIHx8IHt9IH07CgogICAgbXkgJUpJUkFGaWVsZE1hcDsKCiAgICBGSUVMRE5BTUU6CiAgICBmb3IgbXkgJEZpZWxkTmFtZSAoIGtleXMgJXsgJEZpZWxkVHlwZXMgfHwge30gfSApIHsKICAgICAgICBuZXh0IEZJRUxETkFNRSBpZiAkRmllbGROYW1lICF+IG17XEEgY3VzdG9tZmllbGRfIH14bXM7CgogICAgICAgICRGaWVsZE5hbWUgID1+IHN7Y3VzdG9tZmllbGRffXt9OwogICAgICAgIG15ICRGaWVsZElEID0gJEZpZWxkTmFtZTsKICAgICAgICAkRmllbGROYW1lICA9ICRDdXN0b21GaWVsZHN7JEZpZWxkTmFtZX07CgogICAgICAgICRKSVJBRmllbGRNYXB7JEZpZWxkSUR9ID0gJEZpZWxkTmFtZTsKICAgIH0KCiAgICBteSAkU2VsZWN0ZWQgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIkpJUkE6Ok9UUlNUaWNrZXRJREZpZWxkIik7CgogICAgcmV0dXJuICggXCVKSVJBRmllbGRNYXAsICRTZWxlY3RlZCApOwp9CgpzdWIgX0NoZWNrU3RlcDIgewogICAgbXkgKCRTZWxmKSA9IEBfOwoKICAgIG15ICRTeXNDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3lzQ29uZmlnJyk7CiAgICBteSAkUGFyYW1PYmplY3QgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgIHJldHVybiBpZiAhJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1N0ZXAyU2F2ZScgKTsKCiAgICBteSBARmllbGRzID0gQHsgJFNlbGYtPntTdGVwMn0gfHwgW10gfTsKCiAgICBteSAkVXNlcnM7CiAgICBteSAkUHJvamVjdHM7CiAgICBteSAkSklSQTsKCiAgICAjIGNoZWNrIGlmIEFQSSBpcyByZWFjaGFibGUKICAgIHsKICAgICAgICBsb2NhbCAkS2VybmVsOjpPTSA9IEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyLT5uZXcoKTsKCiAgICAgICAgJEpJUkEgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkpJUkE6OlV0aWxzJyk7CiAgICAgICAgJFByb2plY3RzID0gJEpJUkEtPlByb2plY3RzR2V0KCBGb3JjZSA9PiAxICk7CiAgICB9CgogICAgbXkgJVZhbHVlczsKICAgIG15ICRGaWVsZENvdW50ID0gMTsKCiAgICBGSUVMRDoKICAgIGZvciBteSAkRmllbGQgKCBARmllbGRzICkgewogICAgICAgIG15ICgkVmFsdWUpID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJEZpZWxkLT57RmllbGR9ICk7CgogICAgICAgICAkVmFsdWVzeyAkRmllbGQtPntGaWVsZH0gfSA9ICRWYWx1ZTsKCiAgICAgICAgaWYgKCAkRmllbGQtPntEYXRhfSAmJiByZWYgJEZpZWxkLT57RGF0YX0gKSB7CiAgICAgICAgICAgIGlmICggISAkRmllbGQtPntEYXRhfS0+eyRWYWx1ZX0gKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKCBNZXNzYWdlID0+ICdJbnZhbGlkVmFsdWUnICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICggJEZpZWxkLT57RmllbGR9IGVxICdSZXBvcnRlcicgKSB7CgogICAgICAgICAgICAjIGdldCBhdmFpbGFibGUgdXNlcnMKICAgICAgICAgICAgJFVzZXJzICAgICAgLy89ICRKSVJBLT5Vc2Vyc0dldCggUHJvamVjdCA9PiAkVmFsdWVze1Byb2plY3R9ICk7CiAgICAgICAgICAgIG15ICRWYWxpZFVzZXIgPSAkVXNlcnMtPnskVmFsdWV9OwoKICAgICAgICAgICAgaWYgKCAhJFZhbGlkVXNlciApIHsKICAgICAgICAgICAgICAgIHJldHVybiAoIE1lc3NhZ2UgPT4gJ0ludmFsaWQgVXNlciAoZmllbGQgJyAuICRGaWVsZC0+e0ZpZWxkfSAuICcpLCBwbGVhc2Ugc2VsZWN0IGFuIGV4aXN0aW5nIEppcmEgdXNlcicgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCAhJFZhbHVlc3tOb0Fzc2lnbmVlfSAmJiAkRmllbGQtPntGaWVsZH0gZXEgJ0Fzc2lnbmVlJyApIHsKCiAgICAgICAgICAgICMgZ2V0IGF2YWlsYWJsZSB1c2VycwogICAgICAgICAgICAkVXNlcnMgICAgICAvLz0gJEpJUkEtPlVzZXJzR2V0KCBQcm9qZWN0ID0+ICRWYWx1ZXN7UHJvamVjdH0gKTsKICAgICAgICAgICAgbXkgJFZhbGlkVXNlciA9ICRVc2Vycy0+eyRWYWx1ZX07CgogICAgICAgICAgICBpZiAoICEkVmFsaWRVc2VyICkgewogICAgICAgICAgICAgICAgcmV0dXJuICggTWVzc2FnZSA9PiAnSW52YWxpZCBVc2VyIChmaWVsZCAnIC4gJEZpZWxkLT57RmllbGR9IC4gJyksIHBsZWFzZSBzZWxlY3QgYW4gZXhpc3RpbmcgSmlyYSB1c2VyJyApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoICRGaWVsZC0+e0ZpZWxkfSBlcSAnUHJvamVjdCcgKSB7CiAgICAgICAgICAgIG15ICRWYWxpZFByb2plY3QgPSAkUHJvamVjdHMtPnskVmFsdWV9OwoKICAgICAgICAgICAgaWYgKCAhJFZhbGlkUHJvamVjdCApIHsKICAgICAgICAgICAgICAgIHJldHVybiAoIE1lc3NhZ2UgPT4gJ0ludmFsaWQgUHJvamVjdCwgcGxlYXNlIHNlbGVjdCBhbiBleGlzdGluZyBKaXJhIHByb2plY3QnICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICggJEZpZWxkLT57RmllbGR9IGVxICdJc3N1ZVR5cGUnICkgewogICAgICAgICAgICAjIGdldCBhdmFpbGFibGUgaXNzdWUgdHlwZXMKICAgICAgICAgICAgbXkgJElzc3VlVHlwZXMgICAgID0gJEpJUkEtPklzc3VlVHlwZXNHZXQoIFByb2plY3QgPT4gJFZhbHVlc3tQcm9qZWN0fSApOwogICAgICAgICAgICBteSAkVmFsaWRJc3N1ZVR5cGUgPSAkSXNzdWVUeXBlcy0+eyRWYWx1ZX07CgogICAgICAgICAgICBpZiAoICEkVmFsaWRJc3N1ZVR5cGUgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKCBNZXNzYWdlID0+ICdJbnZhbGlkIElzc3VlVHlwZScgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCAkRmllbGQtPntTdWJ9ICkgewogICAgICAgICAgICBteSBAU3ViRmllbGRzOwoKICAgICAgICAgICAgS0VZOgogICAgICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyAkRmllbGQtPntTdWJ9IH0gKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBTdWJGaWVsZHMsIEB7ICRGaWVsZC0+e1N1Yn0tPnskS2V5fSB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBzcGxpY2UgQEZpZWxkcywgJEZpZWxkQ291bnQsIDAsIEBTdWJGaWVsZHM7CiAgICAgICAgfQoKICAgICAgICAkRmllbGRDb3VudCsrOwogICAgfQoKICAgIHJldHVybjsKfQoKc3ViIF9TYXZlU3RlcDIgewogICAgbXkgKCRTZWxmKSA9IEBfOwoKICAgIG15ICRTeXNDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3lzQ29uZmlnJyk7CiAgICBteSAkUGFyYW1PYmplY3QgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgIG15IEBGaWVsZHMgICAgID0gQHsgJFNlbGYtPntTdGVwMn0gfHwgW10gfTsKICAgIG15ICRGaWVsZENvdW50ID0gMTsKCiAgICBteSBAU2V0dGluZ3M7CgogICAgRklFTEQ6CiAgICBmb3IgbXkgJEZpZWxkICggQEZpZWxkcyApIHsKICAgICAgICBteSAoJFZhbHVlKSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRGaWVsZC0+e0ZpZWxkfSApOwoKICAgICAgICBteSAkRmllbGRuYW1lID0gJEZpZWxkLT57U3lzQ29uZmlnfTsKICAgICAgICBwdXNoIEBTZXR0aW5ncywgewogICAgICAgICAgICBOYW1lICAgICAgICAgICA9PiAkRmllbGRuYW1lLAogICAgICAgICAgICBFZmZlY3RpdmVWYWx1ZSA9PiAkVmFsdWUsCiAgICAgICAgfTsKCiAgICAgICAgaWYgKCAkRmllbGQtPntTdWJ9ICkgewogICAgICAgICAgICBteSBAU3ViRmllbGRzOwoKICAgICAgICAgICAgS0VZOgogICAgICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyAkRmllbGQtPntTdWJ9IH0gKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBTdWJGaWVsZHMsIEB7ICRGaWVsZC0+e1N1Yn0tPnskS2V5fSB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBzcGxpY2UgQEZpZWxkcywgJEZpZWxkQ291bnQsIDAsIEBTdWJGaWVsZHM7CiAgICAgICAgfQoKICAgICAgICAkRmllbGRDb3VudCsrOwogICAgfQoKICAgIG15ICRTdWNjZXNzID0gJFN5c0NvbmZpZ09iamVjdC0+U2V0dGluZ3NTZXQoCiAgICAgICAgU2V0dGluZ3MgPT4gXEBTZXR0aW5ncywKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKfQoKc3ViIF9TdGVwMyB7CiAgICBteSAoJFNlbGYsICVQYXJhbSkgPSBAXzsKCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkUGFyYW1PYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ1N0ZXAzJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgSXRlbSA9PiAnRmllbGRtYXBwaW5nJywKICAgICAgICAgICAgU3RlcCA9PiAzLAogICAgICAgIH0sCiAgICApOwoKICAgIGlmICggJFBhcmFte01lc3NhZ2V9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTdGVwM0hhc0Vycm9yJywKICAgICAgICAgICAgRGF0YSA9PiB7IEVycm9yTWVzc2FnZSA9PiAkUGFyYW17TWVzc2FnZX0gfSwKICAgICAgICApOwogICAgfQoKICAgICRTZWxmLT5fRGVmaW5lU3RlcDMoKTsKCiAgICBteSAkRmllbGRzID0gJFNlbGYtPntTdGVwM30gfHwge307CiAgICBteSAkT1RSU0ZpZWxkcyA9ICRGaWVsZHMtPntPVFJTRmllbGRzfTsKICAgIG15ICRKSVJBRmllbGRzID0gJEZpZWxkcy0+e0pJUkFGaWVsZHN9OwoKICAgIG15ICVEZWZhdWx0cyA9ICgKICAgICAgICAwID0+IHsKICAgICAgICAgICAgT1RSUyA9PiAnJywKICAgICAgICAgICAgSklSQSA9PiAnJywKICAgICAgICB9LAogICAgKTsKCiAgICBteSAkRmllbGRNYXBwaW5ncyA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0SklSQScpLT57J09UUlMtSklSQS1GaWVsZE1hcHBpbmcnfTsKICAgIG15ICRGaWVsZE1hcHBpbmdzS2V5cyA9IFtrZXlzICV7JEZpZWxkTWFwcGluZ3N9XTsKICAgIG15ICRGaWVsZE1hcHBpbmdzVmFsdWVzID0gW3ZhbHVlcyAleyRGaWVsZE1hcHBpbmdzfV07CiAgICBteSAkT1RSU0tleXMgPSBba2V5cyAleyRPVFJTRmllbGRzfV07CiAgICBteSAkSklSQUtleXMgPSBba2V5cyAleyRKSVJBRmllbGRzfV07CiAgICBmb3JlYWNoIG15ICRNYXBwaW5nS2V5IChAeyRGaWVsZE1hcHBpbmdzS2V5c30pIHsKICAgICAgICBpZiAoISBncmVwIHsgJF8gZXEgJE1hcHBpbmdLZXkgfSBAeyRPVFJTS2V5c30pIHsKICAgICAgICAgICAgJE9UUlNGaWVsZHMtPnskTWFwcGluZ0tleX0gPSAkTWFwcGluZ0tleTsKICAgICAgICB9CiAgICB9CiAgICBmb3JlYWNoIG15ICRNYXBwaW5nVmFsdWUgKEB7JEZpZWxkTWFwcGluZ3NWYWx1ZXN9KSB7CiAgICAgICAgaWYgKCEgZ3JlcCB7ICRNYXBwaW5nVmFsdWUgPX4gLyRfKD86Om5hbWV8OmtleSk/JC8gfSBAeyRKSVJBS2V5c30pIHsKICAgICAgICAgICAgJEpJUkFGaWVsZHMtPnskTWFwcGluZ1ZhbHVlfSA9ICRNYXBwaW5nVmFsdWU7CiAgICAgICAgfQogICAgfQogICAgbXkgJFJvd01hcHBpbmdJRCA9IDA7CgogICAgRVhJU1RJTkdST1dJRDoKICAgIGZvcmVhY2ggbXkgJEZpZWxkS2V5IChAeyRGaWVsZE1hcHBpbmdzS2V5c30pIHsKCiAgICAgICAgbXkgJE9UUlNEcm9wZG93biA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBOYW1lICAgICAgICAgID0+ICdPVFJTJyAuICRSb3dNYXBwaW5nSUQgLiAnRScsCiAgICAgICAgICAgIERhdGEgICAgICAgICAgPT4gJE9UUlNGaWVsZHMsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSAgPT4gMSwKICAgICAgICAgICAgQ2xhc3MgICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICAgICAgU2VsZWN0ZWRWYWx1ZSA9PiAkT1RSU0ZpZWxkcy0+eyRGaWVsZEtleX0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJEpJUkFGaWVsZEtleSA9ICRGaWVsZE1hcHBpbmdzLT57JEZpZWxkS2V5fSA9fiBzLyg/OjpuYW1lfDprZXkpJC8vcjsKICAgICAgICBteSAkSklSQURyb3Bkb3duID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgPT4gJ0pJUkEnIC4gJFJvd01hcHBpbmdJRCwKICAgICAgICAgICAgRGF0YSAgICAgICAgICA9PiAkSklSQUZpZWxkcywKICAgICAgICAgICAgUG9zc2libGVOb25lICA9PiAxLAogICAgICAgICAgICBDbGFzcyAgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICAgICBTZWxlY3RlZFZhbHVlID0+ICRKSVJBRmllbGRzLT57JEpJUkFGaWVsZEtleX0sCiAgICAgICAgKTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1JvdycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgT1RSUyA9PiAkT1RSU0Ryb3Bkb3duLAogICAgICAgICAgICAgICAgSklSQSA9PiAkSklSQURyb3Bkb3duCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgJFJvd01hcHBpbmdJRCsrOwogICAgfQoKICAgIG15ICRSb3dzVG9EaXNwbGF5Q291bnQgPSAkUm93TWFwcGluZ0lEICsgMTA7CgogICAgUk9XSUQ6CiAgICBmb3IgbXkgJFJvd0lEICggJFJvd01hcHBpbmdJRCAuLiAkUm93c1RvRGlzcGxheUNvdW50ICkgewoKICAgICAgICBteSAkT1RSU0Ryb3Bkb3duID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgPT4gJ09UUlMnIC4gJFJvd0lELAogICAgICAgICAgICBEYXRhICAgICAgICAgID0+ICRPVFJTRmllbGRzLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgID0+IDEsCiAgICAgICAgICAgIENsYXNzICAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgIFNlbGVjdGVkVmFsdWUgPT4gJERlZmF1bHRzeyRSb3dJRH0tPntPVFJTfSwKICAgICAgICApOwoKICAgICAgICBteSAkSklSQURyb3Bkb3duID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgPT4gJ0pJUkEnIC4gJFJvd0lELAogICAgICAgICAgICBEYXRhICAgICAgICAgID0+ICRKSVJBRmllbGRzLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgID0+IDEsCiAgICAgICAgICAgIENsYXNzICAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgIFNlbGVjdGVkVmFsdWUgPT4gJERlZmF1bHRzeyRSb3dJRH0tPntPVFJTfSwKICAgICAgICApOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUm93JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBPVFJTID0+ICRPVFJTRHJvcGRvd24sCiAgICAgICAgICAgICAgICBKSVJBID0+ICRKSVJBRHJvcGRvd24KICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkpJUkFXaXphcmQnLAogICAgICAgIERhdGEgICAgICAgICA9PiB7fSwKICAgICk7Cn0KCnN1YiBfQ2hlY2tTdGVwMyB7CiAgICByZXR1cm47Cn0KCnN1YiBfU2F2ZVN0ZXAzIHsKICAgIG15ICgkU2VsZikgPSBAXzsKCiAgICBteSAkU3lzQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c0NvbmZpZycpOwogICAgbXkgJENvbmZpZ09iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkUGFyYW1PYmplY3QgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgIG15ICVNYXBwaW5nOwoKICAgIG15IEBQYXJhbU5hbWVzID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbU5hbWVzKCk7CiAgICBteSBAT1RSU1BhcmFtTmFtZXMgPSBncmVwIHsgJF8gPX4gL15PVFJTXGQrRT8kLyB9IEBQYXJhbU5hbWVzOwogICAgbXkgJEZpZWxkTWFwcGluZ3MgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldEpJUkEnKS0+eydPVFJTLUpJUkEtRmllbGRNYXBwaW5nJ307CgogICAgUk9XSUQ6CiAgICBmb3JlYWNoIG15ICRPVFJTUGFyYW1OYW1lICggQE9UUlNQYXJhbU5hbWVzICkgewogICAgICAgIG15ICggJFJvd0lEICkgPSAkT1RSU1BhcmFtTmFtZSA9fiBtLyhcZCspRT8kLzsKCiAgICAgICAgbXkgJE9UUlMgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkT1RSU1BhcmFtTmFtZSApOwogICAgICAgIG15ICRKSVJBID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0pJUkEnIC4gJFJvd0lEICk7CgogICAgICAgIG5leHQgUk9XSUQgaWYgISRPVFJTIHx8ICEkSklSQTsKCiAgICAgICAgaWYgKCRPVFJTUGFyYW1OYW1lID1+IC9FJC8gJiYgJEZpZWxkTWFwcGluZ3MtPnskT1RSU30gJiYgJEZpZWxkTWFwcGluZ3MtPnskT1RSU30gPX4gL14kSklSQS8pIHsKICAgICAgICAgICAgJEpJUkEgPSAkRmllbGRNYXBwaW5ncy0+eyRPVFJTfTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBKSVJBRklFTERDSEVDSzoKICAgICAgICAgICAgZm9yIG15ICRKSVJBRmllbGRDaGVjayAoIHF3L3JlcG9ydGVyIGFzc2lnbmVlIGlzc3VldHlwZSBwcmlvcml0eSBwcm9qZWN0LyApIHsKICAgICAgICAgICAgICAgIG5leHQgSklSQUZJRUxEQ0hFQ0sgaWYgJEpJUkEgbmUgInN0ZDokSklSQUZpZWxkQ2hlY2siOwoKICAgICAgICAgICAgICAgIG15ICRTdWZmaXggPSAoICRPVFJTIG5lICdzdGQ6Q3VzdG9tZXJVc2VySUQnICYmICRPVFJTID1+IG17SURcen0gKSB8fCAkSklSQSBlcSAic3RkOnByb2plY3QiID8gJzprZXknIDogJzpuYW1lJzsKICAgICAgICAgICAgICAgICRKSVJBIC49ICRTdWZmaXg7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRNYXBwaW5neyRPVFJTfSA9ICRKSVJBOwogICAgfQoKICAgIG15ICRGaWVsZG5hbWUgPSAnVGlja2V0SklSQSMjI09UUlMtSklSQS1GaWVsZE1hcHBpbmcnOwogICAgbXkgQFNldHRpbmdzID0gKHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAkRmllbGRuYW1lLAogICAgICAgIEVmZmVjdGl2ZVZhbHVlID0+IFwlTWFwcGluZywKICAgIH0pOwoKICAgIG15ICRTdWNjZXNzID0gJFN5c0NvbmZpZ09iamVjdC0+U2V0dGluZ3NTZXQoCiAgICAgICAgU2V0dGluZ3MgPT4gXEBTZXR0aW5ncywKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKfQoKc3ViIF9EZWZpbmVTdGVwMyB7CiAgICBteSAoJFNlbGYpID0gQF87CgogICAgcmV0dXJuIDEgaWYgJFNlbGYtPntTdGVwM307CgogICAgbXkgJER5bmFtaWNGaWVsZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKTsKICAgIG15ICRKSVJBVGlja2V0T2JqZWN0ICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0SklSQScpOwogICAgbXkgJExheW91dE9iamVjdCAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICBteSAkRHluYW1pY0ZpZWxkcyA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICBPYmplY3RUeXBlICA9PiBbICdUaWNrZXQnIF0sCiAgICApOwoKICAgIG15IEBUaWNrZXRBdHRyaWJ1dGVzID0gcXcoCiAgICAgICBRdWV1ZSBQcmlvcml0eSBUaWNrZXRJRCBUaWNrZXROdW1iZXIgVGl0bGUgT3duZXIgUmVzcG9uc2libGUgU3RhdGUgU3RhdGVUeXBlCiAgICAgICBRdWV1ZUlEIFN0YXRlSUQgT3duZXJJRCBSZXNwb25zaWJsZUlEIFNMQUlEIFNlcnZpY2VJRCBQcmlvcml0eUlEIExvY2sgTG9ja0lECiAgICAgICBDdXN0b21lcklEIEN1c3RvbWVyVXNlcklEIFR5cGUgVHlwZUlEIEFnZSBDcmVhdGVkIENyZWF0ZWRUaW1lVW5pdHMgQ3JlYXRlQnkKICAgICAgIENoYW5nZUJ5IENoYW5nZWQgQXJjaGl2ZUZsYWcgUmVhbFRpbGxUaW1lTm90VXNlZCBFc2NhbGF0aW9uVXBkYXRlVGltZQogICAgICAgVW5sb2NrVGltZW91dCBFc2NhbGF0aW9uUmVzcG9uc2VUaW1lIEVzY2FsYXRpb25Tb2x1dGlvblRpbWUgRXNjYWxhdGlvblRpbWUKICAgICAgIEZyb20gVG8gQ2MgU3ViamVjdCBSZXBseVRvICBNZXNzYWdlSUQgSW5SZXBseVRvIFJlZmVyZW5jZXMgQm9keSBDb250ZW50VHlwZQogICAgICAgU2VuZGVyVHlwZUlEIEFydGljbGVUeXBlSUQgSW5jb21pbmdUaW1lIEFydGljbGVJRCBTZW5kZXJUeXBlIEFydGljbGVUeXBlCiAgICApOwoKICAgIG15ICVPVFJTRmllbGRNYXAgPSBtYXB7ICgic3RkOiRfIiA9PiAkXykgfSBAVGlja2V0QXR0cmlidXRlczsKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkICggQHsgJER5bmFtaWNGaWVsZHMgfHwgW10gfSApIHsKICAgICAgIG15ICROYW1lICA9ICREeW5hbWljRmllbGQtPntOYW1lfTsKICAgICAgIG15ICRMYWJlbCA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnRHluYW1pYyBGaWVsZCcpOwogICAgICAgJE9UUlNGaWVsZE1hcHsgImR5bjokTmFtZSIgfSA9ICcoJyAuICRMYWJlbCAuICcpICcgLiAkTmFtZTsKICAgIH0KCiAgICAkU2VsZi0+e1N0ZXAzfS0+e09UUlNGaWVsZHN9ID0gXCVPVFJTRmllbGRNYXA7CgogICAgbXkgJEZpZWxkVHlwZXMgPSAkSklSQVRpY2tldE9iamVjdC0+RmllbGRzR2V0KCBSZXR1cm4gPT4gJ3R5cGVzJywgRG9Ob3RDYWNoZSA9PiAxICk7CiAgICBteSAkSklSQUZpZWxkcyA9ICRKSVJBVGlja2V0T2JqZWN0LT5GaWVsZHNHZXQoIERvTm90Q2FjaGUgPT4gMSApOwoKICAgIG15ICVDdXN0b21GaWVsZHMgPSByZXZlcnNlICV7ICRKSVJBRmllbGRzIHx8IHt9IH07CgogICAgbXkgJUpJUkFGaWVsZE1hcDsKICAgIGZvciBteSAkRmllbGROYW1lICgga2V5cyAleyAkRmllbGRUeXBlcyB8fCB7fSB9ICkgewogICAgICAgIG15ICRUeXBlID0gJ3N0ZCc7CgogICAgICAgIGlmICggJEZpZWxkTmFtZSA9fiBte1xBIGN1c3RvbWZpZWxkXyB9eG1zICkgewogICAgICAgICAgICAkVHlwZSA9ICdjdXN0JzsKICAgICAgICAgICAgJEZpZWxkTmFtZSA9fiBze2N1c3RvbWZpZWxkX317fTsKICAgICAgICAgICAgJEZpZWxkTmFtZSA9ICRDdXN0b21GaWVsZHN7JEZpZWxkTmFtZX07CiAgICAgICAgfQoKICAgICAgICAkSklSQUZpZWxkTWFweyIkVHlwZTokRmllbGROYW1lIn0gPSAkRmllbGROYW1lOwogICAgfQoKICAgICRTZWxmLT57U3RlcDN9LT57SklSQUZpZWxkc30gPSBcJUpJUkFGaWVsZE1hcDsKfQoKc3ViIEpJUkFQcm9qZWN0cyB7CiAgICBteSAoJFNlbGYpID0gQF87CgogICAgbXkgJFV0aWxzT2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpKSVJBOjpVdGlscycpOwogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgbXkgJFByb2plY3RzID0gJFV0aWxzT2JqZWN0LT5Qcm9qZWN0c0dldCggRm9yY2UgPT4gMSApOwogICAgbXkgJFNlbGVjdGVkID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXRKSVJBJyktPntQcm9qZWN0fTsKCiAgICByZXR1cm4gKCAkUHJvamVjdHMsICRTZWxlY3RlZCApOwp9CgoKMTsK
IyAgLS0KIyAgQ29weXJpZ2h0IChDKSAyMDA4LTIwMTggY2F0d29ya3ggR21iSCBodHRwOi8vd3d3LmNhdHdvcmt4LmRlCiMgIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50VGlja2V0SklSQTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBMaXN0OjpVdGlsIHF3KGZpcnN0KTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gcXcoCiAgICBLZXJuZWw6OkNvbmZpZwogICAgS2VybmVsOjpTeXN0ZW06OkxvZwogICAgS2VybmVsOjpTeXN0ZW06Ok1haW4KICAgIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQKICAgIEtlcm5lbDo6U3lzdGVtOjpUaWNrZXQKICAgIEtlcm5lbDo6U3lzdGVtOjpUaWNrZXRKSVJBCiAgICBLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Cik7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MgKCRTZWxmLCAkVHlwZSk7CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICAkU2VsZi0+e0RlYnVnfSAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdKSVJBOjpEZWJ1ZycpOwoKICAgIGlmICggJFNlbGYtPntEZWJ1Z30gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdpbmZvJywKICAgICAgICAgICAgTWVzc2FnZSA9PiBfX1BBQ0tBR0VfXyAuICc6Om5ldygpOiBTdWJhY3Rpb249JyAuICRQYXJhbXtTdWJhY3Rpb259IC4gJyBUaWNrZXRJRD0nIC4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRUaWNrZXRPYmplY3QgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwogICAgbXkgJENvbmZpZ09iamVjdCAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJE1haW5PYmplY3QgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpOwogICAgbXkgJExvZ09iamVjdCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CiAgICBteSAkVGlja2V0SklSQU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXRKSVJBJyk7CiAgICBteSAkTGF5b3V0T2JqZWN0ICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRQYXJhbU9iamVjdCAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgIG15ICVEYXRhICA9ICgpOwogICAgbXkgJEJsb2NrID0gJ1N1Y2Nlc3MnOwoKICAgICMgU3ViYWN0aW9uID0gSklSQTJPVFJTIHx8IE9UUlMySklSQQogICAgbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIGlmICggJFNlbGYtPntEZWJ1Z30gKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnaW5mbycsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+IF9fUEFDS0FHRV9fIC4gIjo6UnVuKCk6IFRpY2tldElEOiAkVGlja2V0e1RpY2tldElEfSBUaXRsZTogJFRpY2tldHtUaXRsZX0gU3RhdGU6ICRUaWNrZXR7U3RhdGV9IgogICAgICAgICk7CiAgICB9CgogICAgbXkgJEpJUkFDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldEpJUkEnKSB8fCB7fTsKCiAgICBteSAkQWxsb3dlZFF1ZXVlc0xpc3QgICAgICAgICA9ICRKSVJBQ29uZmlnLT57T1RSU1RpY2tldEFsbG93ZWRRdWV1ZXM0Q3JlYXRlfTsKICAgIG15ICRBbGxvd0NyZWF0aW9uSW5BbGxRdWV1ZXMgID0gJEpJUkFDb25maWctPntPVFJTVGlja2V0QWxsb3dDcmVhdGlvbkluQWxsUXVldWVzfTsKCiAgICBpZiAoICRBbGxvd0NyZWF0aW9uSW5BbGxRdWV1ZXMKICAgICAgICAgfHwgKEB7JEFsbG93ZWRRdWV1ZXNMaXN0fSAmJiBncmVwIHsgJFRpY2tldHtRdWV1ZX0gZXEgJF8gfSBAeyRBbGxvd2VkUXVldWVzTGlzdH0pICkgewogICAgICAgIG15ICRBcnRpY2xlSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQXJ0aWNsZUlEJyApOwoKICAgICAgICBteSAkSklSQUlzc3VlID0gJFRpY2tldEpJUkFPYmplY3QtPklzc3VlQ3JlYXRlKAogICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBRdWV1ZUlEICAgPT4gJFRpY2tldHtRdWV1ZUlEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICRTZWxmLT57RGVidWd9ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnaW5mbycsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiBfX1BBQ0tBR0VfXyAuICI6OlJ1bigpOiAiIC4gJE1haW5PYmplY3QtPkR1bXAoJEpJUkFJc3N1ZSksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRKSVJBSXNzdWUtPntlcnJvcn0gKSB7CiAgICAgICAgICAgICRCbG9jayAgICAgICA9ICdFcnJvcic7CiAgICAgICAgICAgICREYXRhe2Vycm9yfSA9ICRKSVJBSXNzdWUtPntlcnJvcn07CiAgICAgICAgfQoKICAgICAgICBteSAkVVJMID0gJEpJUkFDb25maWctPntVUkx9OwoJICAgICAgCiAgICAgICAgJERhdGF7aWR9ICA9ICRKSVJBSXNzdWUtPntpZH07CiAgICAgICAgJERhdGF7a2V5fSA9ICRKSVJBSXNzdWUtPntrZXl9OwogICAgICAgICREYXRhe3VybH0gPSAiJFVSTC9icm93c2UvIiAuICRKSVJBSXNzdWUtPntrZXl9OwoKICAgICAgICBpZiAoICRTZWxmLT57RGVidWd9ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnaW5mbycsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiBfX1BBQ0tBR0VfXyAuICI6OlJ1bigpOiBUaWNrZXQtPlN0YXRlICRUaWNrZXR7U3RhdGV9IGFsbG93cyBmZXRjaGluZyAiCiAgICAgICAgICAgICAgICAgICAgLiAib2YgdGhlIEpJUkFJc3N1ZS0+a2V5OiAiIC4gJEpJUkFJc3N1ZS0+e2tleX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgbXkgJEFsbG93ZWRRdWV1ZXNOYW1lcyA9IGpvaW4oJywgJywgQHskQWxsb3dlZFF1ZXVlc0xpc3R9KTsKICAgICAgICAkQmxvY2sgICAgICAgID0gJ0Vycm9yJzsKICAgICAgICAkRGF0YXtlcnJvcn0gID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAiVGlja2V0IG5vdCBpbiAkQWxsb3dlZFF1ZXVlc05hbWVzOiAiIC4gJFRpY2tldHtRdWV1ZX0gLiAiLiIKICAgICAgICApOwoKICAgICAgICBpZiAoICRTZWxmLT57RGVidWd9ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnaW5mbycsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiBfX1BBQ0tBR0VfXyAuICI6OlJ1bigpOiBPVFJTIFRpY2tldCBub3QgaW4gJEFsbG93ZWRRdWV1ZXNOYW1lczogIiAuICRUaWNrZXR7UXVldWV9CiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICREYXRhe1RpY2tldElEfSAgICAgPSAkU2VsZi0+e1RpY2tldElEfTsKICAgICREYXRhe1RpY2tldE51bWJlcn0gPSAkVGlja2V0e1RpY2tldE51bWJlcn07CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgRGF0YSA9PiBcJURhdGEsCiAgICAgICAgTmFtZSA9PiAkQmxvY2ssCiAgICApOwoKICAgICMgYnVpbGQgb3V0cHV0CiAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKFRpdGxlID0+ICJUaWNrZXRKSVJBIik7CiAgICAkT3V0cHV0ICAgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwogICAgJE91dHB1dCAgIC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVEYXRhLAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaWNrZXRKSVJBJywKICAgICk7CiAgICAkT3V0cHV0ICAgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCjE7Cg==
IyAgLS0KIyAgQ29weXJpZ2h0IChDKSAyMDE2IC0gMjAxOCBjYXR3b3JreCBHbWJIIGh0dHA6Ly93d3cuY2F0d29ya3guZGUKIyAgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRUaWNrZXRKSVJBRGlhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIExpc3Q6OlV0aWwgcXcoZmlyc3QpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSBxdygKICAgIEtlcm5lbDo6Q29uZmlnCiAgICBLZXJuZWw6OlN5c3RlbTo6TG9nCiAgICBLZXJuZWw6OlN5c3RlbTo6SlNPTgogICAgS2VybmVsOjpTeXN0ZW06Ok1haW4KICAgIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQKICAgIEtlcm5lbDo6U3lzdGVtOjpUaWNrZXQKICAgIEtlcm5lbDo6U3lzdGVtOjpUaWNrZXRKSVJBCiAgICBLZXJuZWw6OlN5c3RlbTo6SklSQTo6VXRpbHMKICAgIEtlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QKICAgIEtlcm5lbDo6U3lzdGVtOjpKSVJBOjpRdWV1ZVNldHRpbmdzCik7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MgKCRTZWxmLCAkVHlwZSk7CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICAkU2VsZi0+e0RlYnVnfSAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdKSVJBOjpEZWJ1ZycpOwoKICAgIGlmICggJFNlbGYtPntEZWJ1Z30gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdpbmZvJywKICAgICAgICAgICAgTWVzc2FnZSA9PiBfX1BBQ0tBR0VfXyAuICc6Om5ldygpOiBUaWNrZXRJRD0nIC4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRUaWNrZXRPYmplY3QgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwogICAgbXkgJENvbmZpZ09iamVjdCAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJExhbmd1YWdlT2JqZWN0ICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Okxhbmd1YWdlJyk7CiAgICBteSAkTWFpbk9iamVjdCAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyk7CiAgICBteSAkTG9nT2JqZWN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKICAgIG15ICRUaWNrZXRKSVJBT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldEpJUkEnKTsKICAgIG15ICRMYXlvdXRPYmplY3QgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgbXkgJFV0aWxzT2JqZWN0ICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SklSQTo6VXRpbHMnKTsKICAgIG15ICRQYXJhbU9iamVjdCAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwogICAgbXkgJFNldHRpbmdzT2JqZWN0ICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SklSQTo6UXVldWVTZXR0aW5ncycpOwoKICAgIG15ICVHZXRQYXJhbTsKICAgIGZvciBteSAkUGFyYW0gKCBxdy9UaWNrZXRJRCBQcm9qZWN0IEFzc2lnbmVlIElzc3VlVHlwZSBTdGF0ZSBBcnRpY2xlSUQgSXNzdWVJRC8gKSB7CiAgICAgICAgJEdldFBhcmFteyRQYXJhbX0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW0gKSB8fCAnJzsKICAgIH0KCiAgICBteSAkVGVtcGxhdGVGaWxlID0gJ0FnZW50VGlja2V0SklSQURpYWxvZyc7CiAgICBteSAkRGVmYXVsdHMgICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXRKSVJBJykgfHwge307CiAgICBteSAlRGF0YSAgICAgICAgID0gJUdldFBhcmFtOwoKICAgIGlmICggISRTZWxmLT57U3ViYWN0aW9ufSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRm9ybScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgIG15ICVUaWNrZXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJVNldHRpbmdzID0gJFNldHRpbmdzT2JqZWN0LT5WYWxpZFNldHRpbmdzR2V0KCBRdWV1ZUlEID0+ICRUaWNrZXR7UXVldWVJRH0gKTsKCiAgICAgICAgbXkgJFByb2plY3RzICAgICAgID0gJFV0aWxzT2JqZWN0LT5Qcm9qZWN0c0dldCgpOwogICAgICAgIG15ICREZWZhdWx0UHJvamVjdCA9ICRTZXR0aW5nc3tQcm9qZWN0SUR9IHx8ICREZWZhdWx0cy0+e1Byb2plY3R9OwoKICAgICAgICBteSAkU2hvd1Byb2plY3QgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0pJUkE6OlNob3dQcm9qZWN0Jyk7CgogICAgICAgIGlmICggISRTaG93UHJvamVjdCApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdQcm9qZWN0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgUHJvamVjdCA9PiAkRGVmYXVsdFByb2plY3QsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRTaG93UHJvamVjdCA9PSAxICkgewogICAgICAgICAgICAkUGFyYW17UHJvamVjdFNlbGVjdH0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnUHJvamVjdCcsCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFByb2plY3RzLAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnVmFsaWRhdGUgTW9kZXJuaXplJywKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17UHJvamVjdH0gfHwgJFBhcmFte1Byb2plY3R9IHx8ICREZWZhdWx0UHJvamVjdCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUHJvamVjdFNlbGVjdCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICRVc2VycyA9ICRVdGlsc09iamVjdC0+VXNlcnNHZXQoCiAgICAgICAgICAgIFByb2plY3QgPT4gJERlZmF1bHRQcm9qZWN0LAogICAgICAgICk7CgogICAgICAgIG15ICREZWZhdWx0QXNzaWduZWUgPSAkU2V0dGluZ3N7QXNzaWduZWV9IHx8ICREZWZhdWx0cy0+e0Fzc2lnbmVlfTsKICAgICAgICBteSAkTm9Bc3NpZ25lZSAgICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdKSVJBOjpOb0Fzc2lnbmVlJyk7CiAgICAgICAgbXkgJFNob3dBc3NpZ25lZSAgICA9ICRDb25maWdPYmplY3QtPkdldCgnSklSQTo6U2hvd0Fzc2lnbmVlJyk7CgogICAgICAgIGlmICggISRTaG93QXNzaWduZWUgJiYgISROb0Fzc2lnbmVlICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0Fzc2lnbmVlJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgQXNzaWduZWUgPT4gJERlZmF1bHRBc3NpZ25lZSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFNob3dBc3NpZ25lZSA9PSAxICYmICEkTm9Bc3NpZ25lZSApIHsKICAgICAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0pJUkE6OlNob3dBdXRvbWF0aWNVc2VyJykgKSB7CiAgICAgICAgICAgICAgICAkVXNlcnMtPnsnLTEnfSA9ICRMYW5ndWFnZU9iamVjdC0+VHJhbnNsYXRlKCdhdXRvbWF0aWMtdXNlcicpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkUGFyYW17QXNzaWduZWVTZWxlY3R9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ0Fzc2lnbmVlJywKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkVXNlcnMsCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdWYWxpZGF0ZSBNb2Rlcm5pemUnLAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtBc3NpZ25lZX0gfHwgJFBhcmFte0Fzc2lnbmVlfSB8fCAkRGVmYXVsdEFzc2lnbmVlLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBc3NpZ25lZVNlbGVjdCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRHZXRQYXJhbXtBc3NpZ25lZX0gfHwgJFBhcmFte0Fzc2lnbmVlfSB8fCAkRGVmYXVsdEFzc2lnbmVlLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICRJc3N1ZVR5cGVzID0gJFV0aWxzT2JqZWN0LT5Jc3N1ZVR5cGVzR2V0KAogICAgICAgICAgICBQcm9qZWN0ID0+ICREZWZhdWx0UHJvamVjdCwKICAgICAgICApOwoKICAgICAgICBteSAkRGVmYXVsdElzc3VlVHlwZSA9ICREZWZhdWx0cy0+e0lzc3VlVHlwZX07CiAgICAgICAgbXkgJFNob3dJc3N1ZVR5cGUgICAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0pJUkE6OlNob3dJc3N1ZVR5cGUnKTsKCiAgICAgICAgaWYgKCAhJFNob3dJc3N1ZVR5cGUgKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnSXNzdWVUeXBlJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgSXNzdWVUeXBlID0+ICREZWZhdWx0SXNzdWVUeXBlLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkU2hvd0lzc3VlVHlwZSA9PSAxICkgewogICAgICAgICAgICAkUGFyYW17SXNzdWVUeXBlU2VsZWN0fSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdJc3N1ZVR5cGUnLAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRJc3N1ZVR5cGVzLAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ1ZhbGlkYXRlIE1vZGVybml6ZScsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte0lzc3VlVHlwZX0gfHwgJFBhcmFte0lzc3VlVHlwZX0gfHwgJERlZmF1bHRJc3N1ZVR5cGUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0lzc3VlVHlwZVNlbGVjdCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgojIFRPRE86IFdoZW4gd2Uga25vdyBob3cgdG8gZ2V0IGEgbGlzdCBvZiBzdGF0ZXMsIHRoZW4gdGhpcyBzaG91bGQgYmUgcmVlbmFibGVkLi4uCiMgICAgICAgIG15ICREZWZhdWx0U3RhdGUgPSAkRGVmYXVsdHMtPntTdGF0ZX07CiMKIyAgICAgICAgaWYgKCAhJENvbmZpZ09iamVjdC0+R2V0KCdKSVJBOjpTaG93U3RhdGUnKSApIHsKIyAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAojICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1N0YXRlJywKIyAgICAgICAgICAgICAgICBEYXRhID0+IHsKIyAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAojICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiMgICAgICAgICAgICAgICAgICAgIFN0YXRlID0+ICREZWZhdWx0U3RhdGUsCiMgICAgICAgICAgICAgICAgfSwKIyAgICAgICAgICAgICk7CiMgICAgICAgIH0KIyAgICAgICAgZWxzZSB7CiMgICAgICAgICAgICAkUGFyYW17U3RhdGVTZWxlY3R9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiMgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTdGF0ZScsCiMgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IHt9LAojICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAojICAgICAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnVmFsaWRhdGUnLAojICAgICAgICAgICAgKTsKIwojICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiMgICAgICAgICAgICAgICAgTmFtZSA9PiAnU3RhdGVTZWxlY3QnLAojICAgICAgICAgICAgICAgIERhdGEgPT4gewojICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiMgICAgICAgICAgICAgICAgICAgICVQYXJhbSwKIyAgICAgICAgICAgICAgICB9LAojICAgICAgICAgICAgKQojICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQXNzaWduZWVTZWFyY2gnICkgewoKICAgICAgICAjIGJ1aWxkIHJlc3VsdCBsaXN0CiAgICAgICAgbXkgQFJlc3VsdDsKCiAgICAgICAgbXkgJFRlcm0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnVGVybScgKTsKICAgICAgICAkVGVybSAgICA9fiBze1wqfXsuKn1nOwoKICAgICAgICBteSAkUkU7CiAgICAgICAgZXZhbCB7CiAgICAgICAgICAgICRSRSA9IHFyLyRUZXJtL2k7CiAgICAgICAgfTsKCiAgICAgICAgaWYgKCAkR2V0UGFyYW17UHJvamVjdH0gJiYgJFJFICkgewogICAgICAgICAgICBteSAkVXNlcnMgPSAkVXRpbHNPYmplY3QtPlVzZXJzR2V0KAogICAgICAgICAgICAgICAgUHJvamVjdCA9PiAkR2V0UGFyYW17UHJvamVjdH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnSklSQTo6U2hvd0F1dG9tYXRpY1VzZXInKSApIHsKICAgICAgICAgICAgICAgICRVc2Vycy0+eyctMSd9ID0gJExhbmd1YWdlT2JqZWN0LT5UcmFuc2xhdGUoJ2F1dG9tYXRpYy11c2VyJyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEFTU0lHTkVFOgogICAgICAgICAgICBmb3IgbXkgJFVzZXIgKCBrZXlzICV7ICRVc2VycyB8fCB7fSB9ICkgewogICAgICAgICAgICAgICAgaWYgKCAoICRVc2VyID1+ICRSRSApIHx8ICggJFVzZXJzLT57JFVzZXJ9ID1+ICRSRSApICkgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQFJlc3VsdCwgewogICAgICAgICAgICAgICAgICAgICAgICBMYWJlbCA9PiAiJFVzZXJzLT57JFVzZXJ9ICgkVXNlcikiLAogICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkVXNlciwKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoCiAgICAgICAgICAgIERhdGEgPT4gXEBSZXN1bHQsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OIHx8ICcnLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwogICAgfQogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FKQVhVcGRhdGUnICkgewogICAgICAgIG15ICRKU09ORGF0YSA9IFtdOwoKICAgICAgICBpZiAoICRHZXRQYXJhbXtQcm9qZWN0fSApIHsKICAgICAgICAgICAgbXkgJFVzZXJzID0gJFV0aWxzT2JqZWN0LT5Vc2Vyc0dldCgKICAgICAgICAgICAgICAgIFByb2plY3QgPT4gJEdldFBhcmFte1Byb2plY3R9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJERlZmF1bHRBc3NpZ25lZSA9ICREZWZhdWx0cy0+e0Fzc2lnbmVlfTsKCiAgICAgICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdKSVJBOjpTaG93QXV0b21hdGljVXNlcicpICkgewogICAgICAgICAgICAgICAgJFVzZXJzLT57Jy0xJ30gPSAkTGFuZ3VhZ2VPYmplY3QtPlRyYW5zbGF0ZSgnYXV0b21hdGljLXVzZXInKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHVzaCBAeyAkSlNPTkRhdGEgfSwgewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdBc3NpZ25lZScsCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFVzZXJzLAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ1ZhbGlkYXRlIE1vZGVybml6ZScsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte0Fzc2lnbmVlfSB8fCAkUGFyYW17QXNzaWduZWV9IHx8ICREZWZhdWx0QXNzaWduZWUsCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBteSAkSXNzdWVUeXBlcyA9ICRVdGlsc09iamVjdC0+SXNzdWVUeXBlc0dldCgKICAgICAgICAgICAgICAgIFByb2plY3QgPT4gJEdldFBhcmFte1Byb2plY3R9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJERlZmF1bHRJc3N1ZVR5cGUgPSAkRGVmYXVsdHMtPntJc3N1ZVR5cGV9OwoKICAgICAgICAgICAgcHVzaCBAeyAkSlNPTkRhdGEgfSwgewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdJc3N1ZVR5cGUnLAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRJc3N1ZVR5cGVzLAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ1ZhbGlkYXRlIE1vZGVybml6ZScsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte0lzc3VlVHlwZX0gfHwgJFBhcmFte0lzc3VlVHlwZX0gfHwgJERlZmF1bHRJc3N1ZVR5cGUsCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBteSAkU3RhdGVzID0gJFV0aWxzT2JqZWN0LT5TdGF0ZXNHZXQoCiAgICAgICAgICAgICAgICBQcm9qZWN0ID0+ICRHZXRQYXJhbXtQcm9qZWN0fSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICREZWZhdWx0U3RhdGUgPSAkRGVmYXVsdHMtPntTdGF0ZX07CgogICAgICAgICAgICBwdXNoIEB7ICRKU09ORGF0YSB9LCB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1N0YXRlJywKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkU3RhdGVzLAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ1ZhbGlkYXRlIE1vZGVybml6ZScsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte1N0YXRlfSB8fCAkUGFyYW17U3RhdGV9IHx8ICREZWZhdWx0U3RhdGUsCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICBteSAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uSlNPTiggJEpTT05EYXRhICk7CgogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdDcmVhdGUnICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDcmVhdGVSZXN1bHQnLAogICAgICAgICk7CgogICAgICAgIG15ICRCbG9jayA9ICdTdWNjZXNzJzsKCiAgICAgICAgbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICRTZWxmLT57RGVidWd9ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnaW5mbycsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiBfX1BBQ0tBR0VfXyAuICI6OlJ1bigpOiBUaWNrZXRJRDogJFRpY2tldHtUaWNrZXRJRH0gVGl0bGU6ICRUaWNrZXR7VGl0bGV9IFN0YXRlOiAkVGlja2V0e1N0YXRlfSIKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICRKSVJBQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXRKSVJBJykgfHwge307CgogICAgICAgIG15ICRBbGxvd2VkUXVldWVzTGlzdCAgICAgICAgID0gJEpJUkFDb25maWctPntPVFJTVGlja2V0QWxsb3dlZFF1ZXVlczRDcmVhdGV9OwogICAgICAgIG15ICRBbGxvd0NyZWF0aW9uSW5BbGxRdWV1ZXMgID0gJEpJUkFDb25maWctPntPVFJTVGlja2V0QWxsb3dDcmVhdGlvbkluQWxsUXVldWVzfTsKCiAgICAgICAgaWYgKCAkQWxsb3dDcmVhdGlvbkluQWxsUXVldWVzCiAgICAgICAgICAgICB8fCAoQHskQWxsb3dlZFF1ZXVlc0xpc3R9ICYmIGdyZXAgeyAkVGlja2V0e1F1ZXVlfSBlcSAkXyB9IEB7JEFsbG93ZWRRdWV1ZXNMaXN0fSkgKSB7CiAgICAgICAgICAgIG15ICRKSVJBSXNzdWUgPSAkVGlja2V0SklSQU9iamVjdC0+SXNzdWVDcmVhdGUoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEdldFBhcmFte0FydGljbGVJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgUHJvamVjdCAgID0+ICRHZXRQYXJhbXtQcm9qZWN0fSwKICAgICAgICAgICAgICAgIEFzc2lnbmVlICA9PiAkR2V0UGFyYW17QXNzaWduZWV9LAogICAgICAgICAgICAgICAgSXNzdWVUeXBlID0+ICRHZXRQYXJhbXtJc3N1ZVR5cGV9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0RlYnVnfSApIHsKICAgICAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnaW5mbycsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gX19QQUNLQUdFX18gLiAiOjpSdW4oKTogIiAuICRNYWluT2JqZWN0LT5EdW1wKCRKSVJBSXNzdWUpLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkSklSQUlzc3VlLT57ZXJyb3J9ICkgewogICAgICAgICAgICAgICAgJEJsb2NrICAgICAgID0gJ0Vycm9yJzsKICAgICAgICAgICAgICAgICREYXRhe2Vycm9yfSA9ICRKSVJBSXNzdWUtPntlcnJvcn07CgogICAgICAgICAgICAgICAgJERhdGF7VGlja2V0SUR9ICAgICA9ICRHZXRQYXJhbXtUaWNrZXRJRH07CiAgICAgICAgICAgICAgICAkRGF0YXtUaWNrZXROdW1iZXJ9ID0gJFRpY2tldHtUaWNrZXROdW1iZXJ9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgIyBsb2FkIG5ldyBVUkwgaW4gcGFyZW50IHdpbmRvdyBhbmQgY2xvc2UgcG9wdXAKICAgICAgICAgICAgICAgIG15ICRSZXR1cm5VUkwgPSAiQWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD0kR2V0UGFyYW17VGlja2V0SUR9IjsKCiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UG9wdXBDbG9zZSgKICAgICAgICAgICAgICAgICAgICBVUkwgPT4gJFJldHVyblVSTCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRVUkwgPSAkSklSQUNvbmZpZy0+e1VSTH07CgkgICAgICAKICAgICAgICAgICAgJERhdGF7aWR9ICA9ICRKSVJBSXNzdWUtPntpZH07CiAgICAgICAgICAgICREYXRhe2tleX0gPSAkSklSQUlzc3VlLT57a2V5fTsKICAgICAgICAgICAgJERhdGF7dXJsfSA9ICIkVVJML2Jyb3dzZS8iIC4gJEpJUkFJc3N1ZS0+e2tleX07CgogICAgICAgICAgICBpZiAoICRTZWxmLT57RGVidWd9ICkgewogICAgICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdpbmZvJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiBfX1BBQ0tBR0VfXyAuICI6OlJ1bigpOiBUaWNrZXQtPlN0YXRlICRUaWNrZXR7U3RhdGV9IGFsbG93cyBmZXRjaGluZyAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIm9mIHRoZSBKSVJBSXNzdWUtPmtleTogIiAuICRKSVJBSXNzdWUtPntrZXl9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbXkgJEFsbG93ZWRRdWV1ZXNOYW1lcyA9IGpvaW4oJywgJywgQHskQWxsb3dlZFF1ZXVlc0xpc3R9KTsKICAgICAgICAgICAgJEJsb2NrICAgICAgICA9ICdFcnJvcic7CiAgICAgICAgICAgICREYXRhe2Vycm9yfSAgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAiVGlja2V0IG5vdCBpbiAkQWxsb3dlZFF1ZXVlc05hbWVzOiAiIC4gJFRpY2tldHtRdWV1ZX0gLiAiLiIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggJFNlbGYtPntEZWJ1Z30gKSB7CiAgICAgICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2luZm8nLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+IF9fUEFDS0FHRV9fIC4gIjo6UnVuKCk6IE9UUlMgVGlja2V0IG5vdCBpbiAkQWxsb3dlZFF1ZXVlc05hbWVzOiAiIC4gJFRpY2tldHtRdWV1ZX0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICREYXRhe1RpY2tldElEfSAgICAgPSAkU2VsZi0+e1RpY2tldElEfTsKICAgICAgICAkRGF0YXtUaWNrZXROdW1iZXJ9ID0gJFRpY2tldHtUaWNrZXROdW1iZXJ9OwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAkQmxvY2ssCiAgICAgICAgICAgIERhdGEgPT4gXCVEYXRhLAogICAgICAgICk7CiAgICB9CgogICAgIyB1c2VyIHdhbnRzIHRvIGxpbmsgdGlja2V0IHdpdGggYW4gZXhpc3RpbmcgaXNzdWUKICAgICMgbmVlZHMgb24gb3RoZXIgZm9ybQogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0xpbmtFeGlzdGluZ0lzc3VlJyApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRm9ybScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICRUZW1wbGF0ZUZpbGUgPSAnQWdlbnRUaWNrZXRKSVJBRGlhbG9nRXhpc3RpbmdJc3N1ZSc7CgogICAgICAgIG15ICRQcm9qZWN0cyAgICAgICA9ICRVdGlsc09iamVjdC0+UHJvamVjdHNHZXQoKTsKICAgICAgICBteSAkRGVmYXVsdFByb2plY3QgPSAkRGVmYXVsdHMtPntQcm9qZWN0fTsKCiAgICAgICAgaWYgKCAhJENvbmZpZ09iamVjdC0+R2V0KCdKSVJBOjpTaG93UHJvamVjdCcpICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1Byb2plY3QnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICBQcm9qZWN0ID0+ICREZWZhdWx0UHJvamVjdCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17UHJvamVjdFNlbGVjdH0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnUHJvamVjdCcsCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFByb2plY3RzLAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnVmFsaWRhdGUgTW9kZXJuaXplJywKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17UHJvamVjdH0gfHwgJFBhcmFte1Byb2plY3R9IHx8ICREZWZhdWx0UHJvamVjdCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUHJvamVjdFNlbGVjdCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyB1c2VyIHdhbnRzIHRvIGxpbmsgdGlja2V0IHdpdGggYW4gZXhpc3RpbmcgaXNzdWUKICAgICMgICAtPiBjcmVhdGUgbGluayAoc2V0IGR5bmFtaWMgZmllbGQgaW4gb3RycyBhbmQgY3VzdG9tIGZpZWxkIGluIEpJUkEpCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ3JlYXRlTGlua1dpdGhJc3N1ZScgKSB7CiAgICAgICAgJFRlbXBsYXRlRmlsZSA9ICdBZ2VudFRpY2tldEpJUkFEaWFsb2dFeGlzdGluZ0lzc3VlJzsKCiAgICAgICAgbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ3JlYXRlUmVzdWx0JywKICAgICAgICApOwoKICAgICAgICBteSAkQmxvY2sgPSAnU3VjY2Vzcyc7CgogICAgICAgIG15ICRKSVJBSXNzdWUgPSAkVGlja2V0SklSQU9iamVjdC0+SXNzdWVMaW5rVG9PVFJTKAogICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIElzc3VlSUQgICA9PiAkR2V0UGFyYW17SXNzdWVJRH0sCiAgICAgICAgICAgIFByb2plY3QgICA9PiAkR2V0UGFyYW17UHJvamVjdH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkU2VsZi0+e0RlYnVnfSApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2luZm8nLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gX19QQUNLQUdFX18gLiAiOjpSdW4oKTogIiAuICRNYWluT2JqZWN0LT5EdW1wKCRKSVJBSXNzdWUpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkSklSQUlzc3VlLT57ZXJyb3J9ICkgewogICAgICAgICAgICAkQmxvY2sgICAgICAgPSAnRXJyb3InOwogICAgICAgICAgICAkRGF0YXtlcnJvcn0gPSAkSklSQUlzc3VlLT57ZXJyb3J9OwoKICAgICAgICAgICAgJERhdGF7VGlja2V0SUR9ICAgICA9ICRHZXRQYXJhbXtUaWNrZXRJRH07CiAgICAgICAgICAgICREYXRhe1RpY2tldE51bWJlcn0gPSAkVGlja2V0e1RpY2tldE51bWJlcn07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAjIGxvYWQgbmV3IFVSTCBpbiBwYXJlbnQgd2luZG93IGFuZCBjbG9zZSBwb3B1cAogICAgICAgICAgICBteSAkUmV0dXJuVVJMID0gIkFjdGlvbj1BZ2VudFRpY2tldFpvb207VGlja2V0SUQ9JEdldFBhcmFte1RpY2tldElEfSI7CgogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UG9wdXBDbG9zZSgKICAgICAgICAgICAgICAgIFVSTCA9PiAkUmV0dXJuVVJMLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJEpJUkFDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldEpJUkEnKSB8fCB7fTsKICAgICAgICBteSAkVVJMICAgICAgICA9ICRKSVJBQ29uZmlnLT57VVJMfTsKCSAgICAgIAogICAgICAgICREYXRhe2lkfSAgPSAkSklSQUlzc3VlLT57aWR9OwogICAgICAgICREYXRhe2tleX0gPSAkSklSQUlzc3VlLT57a2V5fTsKICAgICAgICAkRGF0YXt1cmx9ID0gIiRVUkwvYnJvd3NlLyIgLiAkSklSQUlzc3VlLT57a2V5fTsKICAgIH0KCiAgICAjIHVzZXIgd2FudHMgdG8gbGluayB0aWNrZXQgd2l0aCBhbiBleGlzdGluZyBpc3N1ZQogICAgIyAgIC0+IHNlYXJjaCBmb3IgZXhpc3RpbmcgaXNzdWVzCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnSXNzdWVTZWFyY2gnICkgewoKICAgICAgICAjIGJ1aWxkIHJlc3VsdCBsaXN0CiAgICAgICAgbXkgJElzc3VlczsKCiAgICAgICAgbXkgJFRlcm0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnVGVybScgKTsKCiAgICAgICAgaWYgKCAkR2V0UGFyYW17UHJvamVjdH0gJiYgJFRlcm0gKSB7CiAgICAgICAgICAgICRJc3N1ZXMgPSAkVXRpbHNPYmplY3QtPklzc3VlTGlzdCgKICAgICAgICAgICAgICAgIFByb2plY3QgPT4gJEdldFBhcmFte1Byb2plY3R9LAogICAgICAgICAgICAgICAgVGVybSAgICA9PiAkVGVybSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICRKU09OID0gJExheW91dE9iamVjdC0+SlNPTkVuY29kZSgKICAgICAgICAgICAgRGF0YSA9PiAkSXNzdWVzLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiB8fCAnJywKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGJ1aWxkIG91dHB1dAogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigKICAgICAgICBUeXBlICAgICAgPT4gJ1NtYWxsJywKICAgICAgICBCb2R5Q2xhc3MgPT4gJ1BvcHVwJywKICAgICk7CgogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICRUZW1wbGF0ZUZpbGUsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAlRGF0YSwKICAgICAgICB9LAogICAgKTsKCiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigKICAgICAgICBUeXBlID0+ICdTbWFsbCcsCiAgICApOwoKICAgIHJldHVybiAkT3V0cHV0Owp9CgoxOwo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9GaWx0ZXJFbGVtZW50UG9zdC9PVFJTVG9KSVJBTGluay5wbQojIENvcHlyaWdodCAoQykgMjAxNiBjYXR3b3JreCBHbWJIIGh0dHA6Ly93d3cuY2F0d29ya3guZGUKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkZpbHRlckVsZW1lbnRQb3N0OjpPVFJTVG9KSVJBTGluazsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gcXcoCiAgICBLZXJuZWw6OkNvbmZpZwogICAgS2VybmVsOjpMYW5ndWFnZQogICAgS2VybmVsOjpTeXN0ZW06OkxvZwogICAgS2VybmVsOjpTeXN0ZW06Ok1haW4KICAgIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQKICAgIEtlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QKKTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExhbmd1YWdlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpMYW5ndWFnZScpOwogICAgbXkgJExheW91dE9iamVjdCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgbXkgJFBhcmFtT2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwogICAgbXkgJFRpY2tldE9iamVjdCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwoKICAgIG15ICRUaXRsZSAgICA9ICRMYW5ndWFnZU9iamVjdC0+VHJhbnNsYXRlKCdPVFJTIHRvIEppcmEnKTsKICAgIG15ICRCYXNlbGluayA9ICRMYXlvdXRPYmplY3QtPntCYXNlbGlua307CiAgICBteSAkVGlja2V0SUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnVGlja2V0SUQnICk7CgogICAgbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiAgICApOwoKICAgIHJldHVybiAxIGlmICRUaWNrZXR7RHluYW1pY0ZpZWxkX0pJUkFJc3N1ZUlEfTsKCiAgICBteSBAQXJ0aWNsZUlEcyA9ICR7ICRQYXJhbXtEYXRhfSB9ID1+IG17PGEgXHMgbmFtZT0iQXJ0aWNsZShcZCspIn14bXM7CgogICAgJHsgJFBhcmFte0RhdGF9IH0gPX4gc3sgKCA8YSBccyBuYW1lPSJBcnRpY2xlKFxkKykiIC4qPyA8dWwgXHMgY2xhc3M9IkFjdGlvbnMiPiApIFxzKyA8bGk+fXskMSAuICRTZWxmLT5fX0xpbmtpZnkoICRCYXNlbGluaywgJFRpY2tldElELCAkMiwgJFRpdGxlICkgLiAnPGxpPic7fWV4bXNnOwoKICAgIHJldHVybiAxOwp9CgpzdWIgX19MaW5raWZ5IHsKICAgIG15ICgkU2VsZiwgJEJhc2VsaW5rLCAkVGlja2V0SUQsICRBcnRpY2xlSUQsICRUaXRsZSApID0gQF87CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgbXkgJERpYWxvZyA9ICRDb25maWdPYmplY3QtPkdldCgnSklSQTo6U2hvd0RpYWxvZycpOwoKICAgIG15ICRBY3Rpb24gPSAnQWdlbnRUaWNrZXRKSVJBJzsKICAgICRBY3Rpb24gICAuPSAnRGlhbG9nJyBpZiAkRGlhbG9nOwoKICAgIG15ICRMaW5rID0gcXF+CiAgICAgICAgPGxpIGNsYXNzPSJPVFJTVG9KSVJBTGlua0xpbmsiPgogICAgICAgICAgICA8YSBocmVmPSIke0Jhc2VsaW5rfUFjdGlvbj0kQWN0aW9uO1RpY2tldElEPSRUaWNrZXRJRDtBcnRpY2xlSUQ9JEFydGljbGVJRCIgdGl0bGU9IiRUaXRsZSIgY2xhc3M9IkFzUG9wdXAgUG9wdXBfVHlwZV9UaWNrZXRBY3Rpb24iPiRUaXRsZTwvYT4KICAgICAgICA8L2xpPgogICAgfjsKCiAgICByZXR1cm4gJExpbms7Cn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAxNyBQZXJsLVNlcnZpY2VzLmRlLCBodHRwOi8vd3d3LnBlcmwtc2VydmljZXMuZGUKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCjxkaXYgY2xhc3M9Ik1haW5Cb3ggQVJJQVJvbGVNYWluIExheW91dEZpeGVkU2lkZWJhciBTaWRlYmFyRmlyc3QiPgogICAgPGgxPlslIFRyYW5zbGF0ZSgiSmlyYSBRdWV1ZSBTZXR0aW5ncyIpIHwgaHRtbCAlXTwvaDE+CiAgICA8ZGl2IGNsYXNzPSJTaWRlYmFyQ29sdW1uIj4KICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiQWN0aW9ucyIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0iQWN0aW9uTGlzdCI+CiAgICAgICAgICAgICAgICAgICAgPGxpPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBZGRBY3Rpb24iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtTdWJhY3Rpb249RWRpdCIgY2xhc3M9IkNhbGxGb3JBY3Rpb24gRnVsbHNpemUgQ2VudGVyIj48c3Bhbj48aSBjbGFzcz0iZmEgZmEtcGx1cy1zcXVhcmUiPjwvaT5bJSBUcmFuc2xhdGUoIkFkZCBRdWV1ZSBTZXR0aW5ncyIpIHwgaHRtbCAlXTwvc3Bhbj48L2E+ClslIFJlbmRlckJsb2NrRW5kKCJBZGRBY3Rpb24iKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld0FjdGlvbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdIiBjbGFzcz0iQ2FsbEZvckFjdGlvbiBGdWxsc2l6ZSBDZW50ZXIiPjxzcGFuPjxpIGNsYXNzPSJmYSI+PC9pPlslIFRyYW5zbGF0ZSgiR28gdG8gb3ZlcnZpZXciKSB8IGh0bWwgJV08L3NwYW4+PC9hPgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdBY3Rpb24iKSAlXQogICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiU2V0dGluZ3NPdmVydmlldyIpICVdCiAgICA8ZGl2IGNsYXNzPSJDb250ZW50Q29sdW1uIj4KICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiTGlzdCIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iRGF0YVRhYmxlIiBpZD0iQ2hlY2tsaXN0SXRlbVN0YXRlIj4KICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIlF1ZXVlIikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIlByb2plY3QiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlslIFRyYW5zbGF0ZSgiQXNzaWduZWUiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlslIFRyYW5zbGF0ZSgiVmFsaWRpdHkiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlslIFRyYW5zbGF0ZSgiQWN0aW9ucyIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPC90aGVhZD4KICAgICAgICAgICAgICAgICAgICA8dGJvZHk+ClslIFJlbmRlckJsb2NrU3RhcnQoIk5vU2V0dGluZ3NGb3VuZCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI1Ij5bJSBUcmFuc2xhdGUoIk5vIG1hdGNoZXMgZm91bmQuIikgfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIk5vU2V0dGluZ3NGb3VuZCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlNldHRpbmciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5RdWV1ZU5hbWUgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuUHJvamVjdCB8IGh0bWwgJV0gKFslIERhdGEuUHJvamVjdElEIHwgaHRtbCAlXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5Bc3NpZ25lZSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKERhdGEuVmFsaWQpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXSZTdWJhY3Rpb249RWRpdCZRdWV1ZUlEPVslIERhdGEuUXVldWVJRCB8IHVyaSAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJlZGl0IikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPiB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV0mU3ViYWN0aW9uPURlbGV0ZSZRdWV1ZUlEPVslIERhdGEuUXVldWVJRCB8IHVyaSAlXTtbJSBFbnYoIkNoYWxsZW5nZVRva2VuUGFyYW0iKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiZGVsZXRlIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIlNldHRpbmciKSAlXQogICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+CiAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiU2V0dGluZ3NPdmVydmlldyIpICVdCgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiU2V0dGluZ3NNYXNrIikgJV0KICAgIDxkaXYgY2xhc3M9IkNvbnRlbnRDb2x1bW4iPgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJFZGl0L0FkZCBKaXJhIFF1ZXVlIFNldHRpbmdzIikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIGNsYXNzPSJWYWxpZGF0ZSIgaWQ9Ik5ld0VkaXRTZXR0aW5nIj4KCiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlNhdmUiIC8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iSUQiIHZhbHVlPSJbJSBEYXRhLklEIHwgaHRtbCAlXSIvPgoKICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlF1ZXVlSUQiIGNsYXNzPSJNYW5kYXRvcnkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiUXVldWUiKSB8IGh0bWwgJV06CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuUXVldWVTZWxlY3QgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlF1ZXVlRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIkEgUXVldWUgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJRdWV1ZVNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJBIFF1ZXVlIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iUHJvamVjdElEIiBjbGFzcz0iIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiUHJvamVjdCIpIHwgaHRtbCAlXToKICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5Qcm9qZWN0U2VsZWN0ICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJBc3NpZ25lZUlEIiBjbGFzcz0iIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiQXNzaWduZWUiKSB8IGh0bWwgJV06CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuVXNlcnNTZWxlY3QgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlZhbGlkSUQiIGNsYXNzPSJNYW5kYXRvcnkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiVmFsaWQiKSB8IGh0bWwgJV06CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuVmFsaWRTZWxlY3QgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IlByaW1hcnkiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlslIFRyYW5zbGF0ZSgiU2F2ZSIpIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKCJTYXZlIikgfCBodG1sICVdPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIm9yIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXSI+WyUgVHJhbnNsYXRlKCJDYW5jZWwiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQogICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAgICAgJCgnI1Byb2plY3RJRCcpLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoICQoJyNOZXdFZGl0U2V0dGluZycpLCAnQUpBWFVwZGF0ZScsICdQcm9qZWN0SUQnLCBbICdBc3NpZ25lZScgXSApOwogICAgICAgIH0pOwogICAgLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdClslIFJlbmRlckJsb2NrRW5kKCJTZXR0aW5nc01hc2siKSAlXQogICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pgo8L2Rpdj4K
IyAtLQojIENvcHlyaWdodCAoQykgMjAxNiBQZXJsLVNlcnZpY2VzLmRlLCBodHRwOi8vcGVybC1zZXJ2aWNlcy5kZQojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPGRpdiBjbGFzcz0iTWFpbkJveCBBUklBUm9sZU1haW4iPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTdGVwcyIpICVdCiAgICA8ZGl2IGNsYXNzPSJDZW50ZXIiPgogICAgICAgIDx1bCBpZD0iUHJvZ3Jlc3NCYXIiIGNsYXNzPSJQcm9ncmVzc0JhckVsZW1lbnRzWyUgRGF0YS5TdGVwcyB8IGh0bWwgJV0gU3BhY2luZ1RvcCBTcGFjaW5nQm90dG9tIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiU3RlcEpJUkEiKSAlXQogICAgICAgICAgICA8bGkgY2xhc3M9IkZpcnN0IEhpZ2hsaWdodGVkIE5vTGluayBbJSBEYXRhLkFjdGl2ZSB8IGh0bWwgJV0iIHN0eWxlPSJ3aWR0aDogMzE1cHgiPgogICAgICAgICAgICAgICAgPHNwYW4+CiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyI+WyUgVHJhbnNsYXRlKCJTdGVwICVzIiwgRGF0YS5TdGVwKSB8IGh0bWwgJV08c3Bhbj5bJSBUcmFuc2xhdGUoIkppcmEgU2V0dGluZ3MiKSB8IGh0bWwgJV08L3NwYW4+PC9hPgogICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiU3RlcEpJUkEiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTdGVwSXNzdWUiKSAlXQogICAgICAgICAgICA8bGkgY2xhc3M9IkhpZ2hsaWdodGVkIE5vTGluayBbJSBEYXRhLkFjdGl2ZSB8IGh0bWwgJV0iIHN0eWxlPSJ3aWR0aDogMzE1cHgiPgogICAgICAgICAgICAgICAgPHNwYW4+CiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyI+WyUgVHJhbnNsYXRlKCJTdGVwICVzIiwgRGF0YS5TdGVwKSB8IGh0bWwgJV08c3Bhbj5bJSBUcmFuc2xhdGUoIklzc3VlIFNldHRpbmdzIikgfCBodG1sICVdPC9zcGFuPjwvYT4KICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIlN0ZXBJc3N1ZSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlN0ZXBNYXBwaW5nIikgJV0KICAgICAgICAgICAgPGxpIGNsYXNzPSJMYXN0IEhpZ2hsaWdodGVkIE5vTGluayBbJSBEYXRhLkFjdGl2ZSB8IGh0bWwgJV0iIHN0eWxlPSJ3aWR0aDogMzE1cHgiPgogICAgICAgICAgICAgICAgPHNwYW4+CiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyI+WyUgVHJhbnNsYXRlKCJTdGVwICVzIiwgRGF0YS5TdGVwKSB8IGh0bWwgJV08c3Bhbj5bJSBUcmFuc2xhdGUoIkZpZWxkbWFwcGluZyIpIHwgaHRtbCAlXTwvc3Bhbj48L2E+CiAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgIDwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJTdGVwTWFwcGluZyIpICVdCiAgICAgICAgPC91bD4KICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiU3RlcHMiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiU3RlcDEiKSAlXQo8ZGl2IGNsYXNzPSJXOTUwcHggU3BhY2luZ1RvcCBTcGFjaW5nQm90dG9tIENlbnRlckJveCI+CiAgICA8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0icG9zdCIgY2xhc3M9IlByZXZlbnRNdWx0aXBsZVN1Ym1pdHMiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IkFkbWluSklSQVdpemFyZCI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iU3RlcDIiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN0ZXAxU2F2ZSIgdmFsdWU9IjEiPgoKICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZShEYXRhLkl0ZW0pIHwgaHRtbCAlXSAoWyUgRGF0YS5TdGVwICVdKTwvaDI+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+ClslIFJlbmRlckJsb2NrU3RhcnQoIlN0ZXAxSGFzRXJyb3IiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJFcnJvciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIERhdGEuRXJyb3JNZXNzYWdlICkgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiU3RlcDFIYXNFcnJvciIpICVdCiAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkZpZWxkIikgJV0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSb3cgWyUgRGF0YS5GaWVsZENsYXNzIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iWyUgRGF0YS5GaWVsZCB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZShEYXRhLkxhYmVsKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkZpZWxkSW5wdXQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iWyUgRGF0YS5GaWVsZCB8IGh0bWwgJV0iIGlkPSJbJSBEYXRhLkZpZWxkIHwgaHRtbCAlXSIgdmFsdWU9IlslIERhdGEuVmFsdWUgJV0iPgpbJSBSZW5kZXJCbG9ja0VuZCgiRmllbGRJbnB1dCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkZpZWxkU2VsZWN0IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5GaWVsZCAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiRmllbGRTZWxlY3QiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGaWVsZEhpbnQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoRGF0YS5IaW50KSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiRmllbGRIaW50IikgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJGaWVsZCIpICVdCgogICAgICAgICAgICAgICAgPC9maWVsZHNldD4KCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJTcGFjaW5nVG9wIFJpZ2h0Ij4KICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJQcmltYXJ5IENhbGxGb3JBY3Rpb24iIHR5cGU9InN1Ym1pdCI+PHNwYW4+WyUgVHJhbnNsYXRlKCJOZXh0IikgfCBodG1sICVdPC9zcGFuPjwvYnV0dG9uPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgPC9mb3JtPgo8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlN0ZXAxIikgJV0KCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTdGVwMiIpICVdCjxkaXYgY2xhc3M9Ilc5NTBweCBTcGFjaW5nVG9wIFNwYWNpbmdCb3R0b20gQ2VudGVyQm94Ij4KICAgIDxmb3JtIGFjdGlvbj0iWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIgbWV0aG9kPSJwb3N0IiBjbGFzcz0iUHJldmVudE11bHRpcGxlU3VibWl0cyI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iQWRtaW5KSVJBV2l6YXJkIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJTdGVwMyI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3RlcDJTYXZlIiB2YWx1ZT0iMSI+CgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKERhdGEuSXRlbSkgfCBodG1sICVdIChbJSBEYXRhLlN0ZXAgJV0pPC9oMj4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KWyUgUmVuZGVyQmxvY2tTdGFydCgiU3RlcDJIYXNFcnJvciIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkVycm9yIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSggRGF0YS5FcnJvck1lc3NhZ2UgKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJTdGVwMkhhc0Vycm9yIikgJV0KICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiRmllbGRTdGVwMiIpICVdCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUm93IFslIERhdGEuRmllbGRDbGFzcyB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlslIERhdGEuRmllbGQgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5MYWJlbCkgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGaWVsZElucHV0MiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJbJSBEYXRhLkZpZWxkIHwgaHRtbCAlXSIgaWQ9IlslIERhdGEuRmllbGQgfCBodG1sICVdIiB2YWx1ZT0iWyUgRGF0YS5WYWx1ZSAlXSI+ClslIFJlbmRlckJsb2NrRW5kKCJGaWVsZElucHV0MiIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkZpZWxkU2VsZWN0MiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRmllbGQgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIkZpZWxkU2VsZWN0MiIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkZpZWxkSGludFN0ZXAyIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKERhdGEuSGludCkgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIkZpZWxkSGludFN0ZXAyIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiRmllbGRDaGFuZ2VTdGVwMiIpICVdClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgICAgIEpJUkEuQWRtaW5XaXphcmQuSW5pdFNlbGVjdCggIlslIERhdGEuRmllbGQgfCBodG1sICVdIiApOwogICAgLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdClslIFJlbmRlckJsb2NrRW5kKCJGaWVsZENoYW5nZVN0ZXAyIikgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJGaWVsZFN0ZXAyIikgJV0KCiAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgoKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlNwYWNpbmdUb3AgUmlnaHQiPgogICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IlByaW1hcnkgQ2FsbEZvckFjdGlvbiIgdHlwZT0ic3VibWl0Ij48c3Bhbj5bJSBUcmFuc2xhdGUoIk5leHQiKSB8IGh0bWwgJV08L3NwYW4+PC9idXR0b24+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICA8L2Zvcm0+CjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiU3RlcDIiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiU3RlcDMiKSAlXQo8ZGl2IGNsYXNzPSJXOTUwcHggU3BhY2luZ1RvcCBTcGFjaW5nQm90dG9tIENlbnRlckJveCI+CiAgICA8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0icG9zdCIgY2xhc3M9IlByZXZlbnRNdWx0aXBsZVN1Ym1pdHMiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IkFkbWluSklSQVdpemFyZCI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iU3RlcDNTYXZlIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdGVwM1NhdmUiIHZhbHVlPSIxIj4KCiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoRGF0YS5JdGVtKSB8IGh0bWwgJV0gKFslIERhdGEuU3RlcCAlXSk8L2gyPgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgogICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iRGF0YVRhYmxlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIk9UUlMgVGlja2V0IEZpZWxkIikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+WyUgVHJhbnNsYXRlKCJKaXJhIEZpZWxkIikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keT4KWyUgUmVuZGVyQmxvY2tTdGFydCgiUm93IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+WyUgRGF0YS5PVFJTICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+WyUgRGF0YS5KSVJBICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrRW5kKCJSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSBDb2xsYXBzZWQiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0QWN0aW9uIFRvZ2dsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2hvdyBvciBoaWRlIHRoZSBjb250ZW50IikgfCBodG1sICVdIj48aSBjbGFzcz0iZmEgZmEtY2FyZXQtcmlnaHQiPjwvaT48aSBjbGFzcz0iZmEgZmEtY2FyZXQtZG93biI+PC9pPjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiSW5mb3JtYXRpb24iKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CgogICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSb3ciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiVGhpcyBtYXBwaW5nIGRlZmluZXMgd2hpY2ggaW5mb3JtYXRpb24gYXJlIHRyYW5zZmVycmVkIGZyb20gT1RSUyB0byBKaXJhLiBPbiB0aGUgbGVmdCB5b3Ugc2VlIGFsbCB0aGUgYXZhaWxhYmxlIGluZm9ybWF0aW9uIGluIE9UUlMgYW5kIG9uIHRoZSByaWdodCB5b3Ugc2VlIHRoZSBmaWVsZHMgaW4gSmlyYS4gUGxlYXNlIGtlZXAgaW4gbWluZCwgdGhhdCB0aGUgdHlwZSBvZiB0aGUgZmllbGRzIHNob3VsZCBtYXRjaCAoZGF0ZS90aW1lIGluZm9ybWF0aW9uIGluIE9UUlMgbmVlZCB0byBiZSBzdG9yZWQgaW4gYSBkYXRlL3RpbWUgZmllbGQgaW4gSmlyYSkiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlRoZXNlIGluZm9ybWF0aW9uIGFyZSB0cmFuc2ZlcnJlZCBhdXRvbWF0aWNhbGx5OiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5bJSBUcmFuc2xhdGUoIlByb2plY3QgKHN0YW5kYXJkIHZhbHVlIGZyb20gU3lzQ29uZmlnIG9yIHNlbGVjdGVkIHByb2plY3QpIikgfCBodG1sICVdPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5bJSBUcmFuc2xhdGUoIklzc3VldHlwZSAoc3RhbmRhcmQgdmFsdWUgZnJvbSBTeXNDb25maWcgb3Igc2VsZWN0ZWQgaXNzdWV0eXBlKSIpIHwgaHRtbCAlXTwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+WyUgVHJhbnNsYXRlKCJTdW1tYXJ5ICh0aWNrZXQgdGl0bGUpIikgfCBodG1sICVdPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5bJSBUcmFuc2xhdGUoIkRlc2NyaXB0aW9uIChhcnRpY2xlIGJvZHkpIikgfCBodG1sICVdPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5bJSBUcmFuc2xhdGUoIlJlcG9ydGVyIChzdGFuZGFyZCB2YWx1ZSBmcm9tIFN5c0NvbmZpZyBvciBzZWxlY3RlZCByZXBvcnRlcikiKSB8IGh0bWwgJV08L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPlslIFRyYW5zbGF0ZSgiQXNzaWduZWUgKHN0YW5kYXJkIHZhbHVlIGZyb20gU3lzQ29uZmlnIG9yIHNlbGVjdGVkIGFzc2lnbmVlKSIpIHwgaHRtbCAlXTwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+WyUgVHJhbnNsYXRlKCJPVFJTVGlja2V0SUQgY3VzdG9tZmllbGQgKHRpY2tldCBpZCkiKSB8IGh0bWwgJV08L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29sPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgoKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlNwYWNpbmdUb3AgUmlnaHQiPgogICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IlByaW1hcnkgQ2FsbEZvckFjdGlvbiIgdHlwZT0ic3VibWl0Ij48c3Bhbj5bJSBUcmFuc2xhdGUoIk5leHQiKSB8IGh0bWwgJV08L3NwYW4+PC9idXR0b24+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICA8L2Zvcm0+CjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiU3RlcDMiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiVGhhbmtZb3UiKSAlXQo8ZGl2IGNsYXNzPSJXOTUwcHggU3BhY2luZ1RvcCBTcGFjaW5nQm90dG9tIENlbnRlckJveCI+CiAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkNvbmZpZ3VyYXRpb24gZG9uZSIpIHwgaHRtbCAlXSAoWyUgRGF0YS5TdGVwICVdKTwvaDI+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICA8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0icG9zdCIgY2xhc3M9IlByZXZlbnRNdWx0aXBsZVN1Ym1pdHMiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iQWRtaW4iPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iU3BhY2luZ1RvcCBDZW50ZXIiPgogICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IlByaW1hcnkgQ2FsbEZvckFjdGlvbiIgdHlwZT0ic3VibWl0Ij48c3Bhbj5bJSBUcmFuc2xhdGUoIkdvIHRvIEFkbWluIGFyZWEiKSB8IGh0bWwgJV08L3NwYW4+PC9idXR0b24+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9mb3JtPgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVGhhbmtZb3UiKSAlXQo8L2Rpdj4KCg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9TdGFuZGFyZC9BZ2VudFRpY2tldEpJUkEudHQgLSBvdmVydmlldwojIENvcHlyaWdodCAoQykgMjAxNSBjYXR3b3JreCBHbWJoLCBodHRwOi8vd3d3LmNhdHdvcmt4LmRlCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCjxkaXYgY2xhc3M9Ik1haW5Cb3ggQVJJQVJvbGVNYWluIj4KICA8ZGl2IGNsYXNzPSJDbGVhckxlZnQiPjwvZGl2PgogIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiU3VjY2VzcyIpICVdCiAgICA8IS0tIHN0YXJ0IGZvcm0gLS0+CiAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIiBzdHlsZT0icGFkZGluZy1sZWZ0OiAxY207cGFkZGluZy10b3A6IDFjbTsiPgogICAgICA8dHI+CiAgICAgICAgPHRoIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICAgICA8aDE+WyUgRW52KCJCb3gwIikgJV1bJSBUcmFuc2xhdGUoIkEgbmV3IEppcmEgSXNzdWUgaGFzIGJlZW4gY3JlYXRlZCIpIHwgaHRtbCAlXSFbJSBFbnYoIkJveDAiKSAlXTwvaDE+CiAgICAgICAgPC90aD4KICAgICAgPC90cj4KICAgICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiPgogICAgICAgICAgWyUgVHJhbnNsYXRlKCJUbyB0aGUgaXNzdWUgKEppcmEpIikgfCBodG1sICVdOiA8YSBocmVmPSJbJSBEYXRhLnVybCB8IGh0bWwgJV0iPlslIERhdGEua2V5IHwgaHRtbCAlXSAoWyUgRGF0YS5pZCB8IGh0bWwgJV0pPC9hPgogICAgICAgIDwvdGQ+CiAgICAgIDwvdHI+CiAgICAgIDx0cj4KICAgICAgICA8dGQgY2xhc3M9Im1haW5ib2R5Ij4KICAgICAgICAgIFslIFRyYW5zbGF0ZSgiQmFjayB0byB0aGUgdGlja2V0IChPVFJTKSIpIHwgaHRtbCAlXTogPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50VGlja2V0Wm9vbSZUaWNrZXRJRD1bJSBEYXRhLlRpY2tldElEIHwgaHRtbCAlXSI+WyUgRGF0YS5UaWNrZXROdW1iZXIgfCBodG1sICVdIChbJSBEYXRhLlRpY2tldElEIHwgaHRtbCAlXSk8L2E+CiAgICAgICAgPC90ZD4KICAgICAgPC90cj4KICAgIDwvdGFibGU+CiAgICA8IS0tIGVuZCBmb3JtIC0tPgpbJSBSZW5kZXJCbG9ja0VuZCgiU3VjY2VzcyIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJFcnJvciIpICVdCiAgICA8IS0tIHN0YXJ0IGZvcm0gLS0+CiAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIiBzdHlsZT0icGFkZGluZy1sZWZ0OiAxY207cGFkZGluZy10b3A6IDFjbTsiPgogICAgICA8dHI+CiAgICAgICAgPHRoIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICAgICA8aDE+WyUgRW52KCJCb3gwIikgJV1bJSBUcmFuc2xhdGUoIkEgSmlyYSBJc3N1ZSBjb3VsZCBub3QgYmUgY3JlYXRlZCIpIHwgaHRtbCAlXSFbJSBFbnYoIkJveDAiKSAlXTwvaDE+CiAgICAgICAgPC90aD4KICAgICAgPC90cj4KICAgICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiPgogICAgICAgICAgWyUgRW52KCJCb3gwIikgJV1bJSBEYXRhLmVycm9yIHwgaHRtbCAlXVslIEVudigiQm94MCIpICVdCiAgICAgICAgPC90ZD4KICAgICAgPC90cj4KICAgICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiPgogICAgICAgICAgWyUgVHJhbnNsYXRlKCJCYWNrIHRvIHRoZSB0aWNrZXQgKE9UUlMpIikgfCBodG1sICVdOiA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRUaWNrZXRab29tJlRpY2tldElEPVslIERhdGEuVGlja2V0SUQgfCBodG1sICVdIj5bJSBEYXRhLlRpY2tldE51bWJlciB8IGh0bWwgJV0gKFslIERhdGEuVGlja2V0SUQgfCBodG1sICVdKTwvYT4KICAgICAgICA8L3RkPgogICAgICA8L3RyPgogICAgPC90YWJsZT4KICAgIDwhLS0gZW5kIGZvcm0gLS0+ClslIFJlbmRlckJsb2NrRW5kKCJFcnJvciIpICVdCgogIDwvZGl2Pgo8L2Rpdj4K
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9TdGFuZGFyZC9BZ2VudFRpY2tldEpJUkFEaWFsb2cudHQgLSBvdmVydmlldwojIENvcHlyaWdodCAoQykgMjAxNiBjYXR3b3JreCBHbWJoLCBodHRwOi8vd3d3LmNhdHdvcmt4LmRlCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCjxmb3JtIGFjdGlvbj0iWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIgbWV0aG9kPSJQT1NUIiBpZD0iSklSQUlzc3VlRm9ybSIgY2xhc3M9IlZhbGlkYXRlIFByZXZlbnRNdWx0aXBsZVN1Ym1pdHMiPgogICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSB8IGh0bWwgJV0iIC8+CiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJDcmVhdGUiIC8+CiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUaWNrZXRJRCIgdmFsdWU9IlslIERhdGEuVGlja2V0SUQgfCBodG1sICVdIiAvPgogICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQXJ0aWNsZUlEIiB2YWx1ZT0iWyUgRGF0YS5BcnRpY2xlSUQgfCBodG1sICVdIiAvPgogICAgPGRpdiBjbGFzcz0iTGF5b3V0UG9wdXAgQVJJQVJvbGVNYWluIj4KICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICA8aDE+WyUgVHJhbnNsYXRlKCJDcmVhdGUgaXNzdWUgaW4gSmlyYSIpIHwgaHRtbCAlXTwvaDE+CiAgICAKICAgICAgICAgICAgPHAgY2xhc3M9IkFzdGVyaXNrRXhwbGFuYXRpb24iPlslIFRyYW5zbGF0ZSgiQWxsIGZpZWxkcyBtYXJrZWQgd2l0aCBhbiBhc3RlcmlzayAoKikgYXJlIG1hbmRhdG9yeS4iKSB8IGh0bWwgJV08L3A+CiAgICAKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICA8YSBjbGFzcz0iQ2FuY2VsQ2xvc2VQb3B1cCIgaHJlZj0iIyI+WyUgVHJhbnNsYXRlKCJDYW5jZWwgJiBjbG9zZSIpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgib3IiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1N1YmFjdGlvbj1MaW5rRXhpc3RpbmdJc3N1ZTtUaWNrZXRJRD1bJSBEYXRhLlRpY2tldElEIHwgdXJpICVdO0FydGljbGVJRD1bJSBEYXRhLkFydGljbGVJRCB8IHVyaSAlXSIKICAgICAgICAgICAgICAgICAgICA+WyUgVHJhbnNsYXRlKCJMaW5rIHdpdGggZXhpc3RpbmcgaXNzdWUiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgIDwvcD4KICAgICAgICA8L2Rpdj4KClslIFJlbmRlckJsb2NrU3RhcnQoIkVycm9yIikgJV0KICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgPGgyPlslIEVudigiQm94MCIpICVdWyUgVHJhbnNsYXRlKCJBIEppcmEgSXNzdWUgY291bGQgbm90IGJlIGNyZWF0ZWQiKSB8IGh0bWwgJV0hWyUgRW52KCJCb3gwIikgJV08L2gyPgogICAgICAgICAgICBbJSBEYXRhLmVycm9yIHwgaHRtbCAlXQogICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRXJyb3IiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiRm9ybSIpICVdCiAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIEZpeGVkTGFiZWwiPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiUHJvamVjdCIpICVdCiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJQcm9qZWN0Ij5bJSBUcmFuc2xhdGUoIlByb2plY3QiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlByb2plY3RTZWxlY3QgJV0KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiUHJvamVjdCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlByb2plY3RTZWxlY3QiKSAlXQogICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iUHJvamVjdCI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj5bJSBUcmFuc2xhdGUoIlByb2plY3QiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlByb2plY3RTZWxlY3QgJV0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJQcm9qZWN0RXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlByb2plY3RTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNQcm9qZWN0JykuYmluZCggJ2NoYW5nZScsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIENvcmUuQUpBWC5Gb3JtVXBkYXRlKCQoJyNKSVJBSXNzdWVGb3JtJyksICdBSkFYVXBkYXRlJywgJ1Byb2plY3QnLCBbICdBc3NpZ25lZScsICdJc3N1ZVR5cGUnLCAnU3RhdGUnIF0pOwogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiUHJvamVjdCIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBc3NpZ25lZSIpICVdCiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJBc3NpZ25lZSI+WyUgVHJhbnNsYXRlKCJBc3NpZ25lZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgIFslIERhdGEuQXNzaWduZWUgJV0KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQXNzaWduZWUiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBc3NpZ25lZVNlbGVjdCIpICVdCiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJBc3NpZ25lZSI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj5bJSBUcmFuc2xhdGUoIkFzc2lnbmVlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkFzc2lnbmVlU2VhcmNoRmllbGQiIGlkPSJBc3NpZ25lZVNlYXJjaEZpZWxkIiBjbGFzcz0iVmFsaWRhdGUgVmFsaWRhdGVfUmVxdWlyZWQiIHZhbHVlPSJbJSBEYXRhLlZhbHVlIHwgaHRtbCAlXSIgLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBc3NpZ25lZSIgaWQ9IkFzc2lnbmVlIiB2YWx1ZT0iWyUgRGF0YS5WYWx1ZSB8IGh0bWwgJV0iIC8+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICBKSVJBLkF1dG9jb21wbGV0ZS5Jbml0KCAkKCcjQXNzaWduZWVTZWFyY2hGaWVsZCcpLCAnQXNzaWduZWVTZWFyY2gnICk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkFzc2lnbmVlU2VhcmNoRmllbGRFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iQXNzaWduZWVTZWFyY2hGaWVsZFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQXNzaWduZWVTZWxlY3QiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiSXNzdWVUeXBlIikgJV0KICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Iklzc3VlVHlwZSI+WyUgVHJhbnNsYXRlKCJJc3N1ZVR5cGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLklzc3VlVHlwZSAlXQogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJJc3N1ZVR5cGUiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJJc3N1ZVR5cGVTZWxlY3QiKSAlXQogICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iSXNzdWVUeXBlIj48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPlslIFRyYW5zbGF0ZSgiSXNzdWVUeXBlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5Jc3N1ZVR5cGVTZWxlY3QgJV0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJJc3N1ZVR5cGVFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iSXNzdWVUeXBlU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJJc3N1ZVR5cGVTZWxlY3QiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiU3RhdGUiKSAlXQogICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iU3RhdGUiPlslIFRyYW5zbGF0ZSgiU3RhdGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlN0YXRlICVdCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlN0YXRlIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiU3RhdGVTZWxlY3QiKSAlXQogICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iU3RhdGUiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+WyUgVHJhbnNsYXRlKCJTdGF0ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgIFslIERhdGEuU3RhdGVTZWxlY3QgJV0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTdGF0ZUVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTdGF0ZVNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiU3RhdGVTZWxlY3QiKSAlXQoKICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJGb290ZXIiPgogICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJDYWxsRm9yQWN0aW9uIFByaW1hcnkiIGlkPSJzdWJtaXRSaWNoVGV4dCIgYWNjZXNza2V5PSJnIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTdWJtaXQiKSB8IGh0bWwgJV0gKGcpIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJbJSBUcmFuc2xhdGUoIlN1Ym1pdCIpIHwgaHRtbCAlXSI+PHNwYW4+PGkgY2xhc3M9ImZhIGZhLWNoZWNrLXNxdWFyZS1vIj48L2k+IFslIFRyYW5zbGF0ZSgiU3VibWl0IikgfCBodG1sICVdPC9zcGFuPjwvYnV0dG9uPgogICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRm9ybSIpICVdCiAgICA8L2Rpdj4KPC9mb3JtPgo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9TdGFuZGFyZC9BZ2VudFRpY2tldEpJUkFEaWFsb2dFeGlzdGluZ0lzc3VlLnR0IC0gb3ZlcnZpZXcKIyBDb3B5cmlnaHQgKEMpIDIwMTYgY2F0d29ya3ggR21iaCwgaHR0cDovL3d3dy5jYXR3b3JreC5kZQojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQo8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0iUE9TVCIgaWQ9IkpJUkFJc3N1ZUZvcm0iIGNsYXNzPSJWYWxpZGF0ZSBQcmV2ZW50TXVsdGlwbGVTdWJtaXRzIj4KICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IlslIEVudigiQWN0aW9uIikgfCBodG1sICVdIiAvPgogICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iQ3JlYXRlTGlua1dpdGhJc3N1ZSIgLz4KICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlRpY2tldElEIiB2YWx1ZT0iWyUgRGF0YS5UaWNrZXRJRCB8IGh0bWwgJV0iIC8+CiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBcnRpY2xlSUQiIHZhbHVlPSJbJSBEYXRhLkFydGljbGVJRCB8IGh0bWwgJV0iIC8+CiAgICA8ZGl2IGNsYXNzPSJMYXlvdXRQb3B1cCBBUklBUm9sZU1haW4iPgogICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgIDxoMT5bJSBUcmFuc2xhdGUoIkxpbmsgd2l0aCBKaXJhIGlzc3VlIikgfCBodG1sICVdPC9oMT4KICAgIAogICAgICAgICAgICA8cCBjbGFzcz0iQXN0ZXJpc2tFeHBsYW5hdGlvbiI+WyUgVHJhbnNsYXRlKCJBbGwgZmllbGRzIG1hcmtlZCB3aXRoIGFuIGFzdGVyaXNrICgqKSBhcmUgbWFuZGF0b3J5LiIpIHwgaHRtbCAlXTwvcD4KICAgIAogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJDYW5jZWxDbG9zZVBvcHVwIiBocmVmPSIjIj5bJSBUcmFuc2xhdGUoIkNhbmNlbCAmIGNsb3NlIikgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJvciIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07VGlja2V0SUQ9WyUgRGF0YS5UaWNrZXRJRCB8IHVyaSAlXTtBcnRpY2xlSUQ9WyUgRGF0YS5BcnRpY2xlSUQgfCB1cmkgJV0iCiAgICAgICAgICAgICAgICAgICAgPlslIFRyYW5zbGF0ZSgiQ3JlYXRlIG5ldyBpc3N1ZSIpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgPC9wPgogICAgICAgIDwvZGl2PgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiRXJyb3IiKSAlXQogICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICA8aDI+WyUgRW52KCJCb3gwIikgJV1bJSBUcmFuc2xhdGUoIlRoZSBKaXJhIElzc3VlIGNvdWxkIG5vdCBiZSBsaW5rZWQiKSB8IGh0bWwgJV0hWyUgRW52KCJCb3gwIikgJV08L2gyPgogICAgICAgICAgICBbJSBEYXRhLmVycm9yIHwgaHRtbCAlXQogICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRXJyb3IiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiRm9ybSIpICVdCiAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIEZpeGVkTGFiZWwiPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiUHJvamVjdCIpICVdCiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJQcm9qZWN0Ij5bJSBUcmFuc2xhdGUoIlByb2plY3QiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlByb2plY3RTZWxlY3QgJV0KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiUHJvamVjdCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlByb2plY3RTZWxlY3QiKSAlXQogICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iUHJvamVjdCI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj5bJSBUcmFuc2xhdGUoIlByb2plY3QiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlByb2plY3RTZWxlY3QgJV0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJQcm9qZWN0RXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlByb2plY3RTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlByb2plY3QiKSAlXQoKICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9Iklzc3VlSUQiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+WyUgVHJhbnNsYXRlKCJJc3N1ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJJc3N1ZUlEU2VhcmNoRmllbGQiIGlkPSJJc3N1ZUlEU2VhcmNoRmllbGQiIGNsYXNzPSJWYWxpZGF0ZSBWYWxpZGF0ZV9SZXF1aXJlZCIgdmFsdWU9IlslIERhdGEuVmFsdWUgfCBodG1sICVdIiAvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Iklzc3VlSUQiIGlkPSJJc3N1ZUlEIiB2YWx1ZT0iWyUgRGF0YS5WYWx1ZSB8IGh0bWwgJV0iIC8+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICBKSVJBLkF1dG9jb21wbGV0ZS5Jbml0KCAkKCcjSXNzdWVJRFNlYXJjaEZpZWxkJyksICdJc3N1ZVNlYXJjaCcsICdJc3N1ZUlEJyApOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJJc3N1ZUlEU2VhcmNoRmllbGRFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iSXNzdWVJRFNlYXJjaEZpZWxkU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9IkZvb3RlciI+CiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IkNhbGxGb3JBY3Rpb24gUHJpbWFyeSIgaWQ9InN1Ym1pdFJpY2hUZXh0IiBhY2Nlc3NrZXk9ImciIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlN1Ym1pdCIpIHwgaHRtbCAlXSAoZykiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlslIFRyYW5zbGF0ZSgiU3VibWl0IikgfCBodG1sICVdIj48c3Bhbj48aSBjbGFzcz0iZmEgZmEtY2hlY2stc3F1YXJlLW8iPjwvaT4gWyUgVHJhbnNsYXRlKCJTdWJtaXQiKSB8IGh0bWwgJV08L3NwYW4+PC9idXR0b24+CiAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJGb3JtIikgJV0KICAgIDwvZGl2Pgo8L2Zvcm0+Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UaWNrZXRNZW51L0pJUkEucG0gLSBtZW51IG1vZHVsZQojICBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxNiBjYXR3b3JreCBHbWJIIGh0dHA6Ly93d3cuY2F0d29ya3guZGUKIyAgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpUaWNrZXRNZW51OjpKSVJBOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSBxdygKICAgIEtlcm5lbDo6Q29uZmlnCiAgICBLZXJuZWw6OlN5c3RlbTo6TG9nCiAgICBLZXJuZWw6OlN5c3RlbTo6VGlja2V0CiAgICBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Cik7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKCiAgICBteSAkU2VsZiA9IHsgJVBhcmFtIH07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFRpY2tldE9iamVjdCAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkTG9nT2JqZWN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKICAgIG15ICRMYXlvdXRPYmplY3QgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgbXkgJExhbmd1YWdlT2JqZWN0ICAgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9OwoKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1RpY2tldH0gKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFRpY2tldCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRBY3Rpb24gPSAkUGFyYW17Q29uZmlnfS0+e0FjdGlvbn07CgogICAgbXkgJFNob3dEaWFsb2cgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0pJUkE6OlNob3dEaWFsb2cnKTsKICAgIGlmICggJFNob3dEaWFsb2cgKSB7CiAgICAgICAgJEFjdGlvbiA9ICdBZ2VudFRpY2tldEpJUkFEaWFsb2cnOwoKICAgICAgICAkUGFyYW17UG9wdXBUeXBlfSAgICAgICAgICAgPSAnVGlja2V0QWN0aW9uJzsKICAgICAgICAkUGFyYW17Q29uZmlnfS0+e1BvcHVwVHlwZX0gPSAnVGlja2V0QWN0aW9uJzsKICAgIH0KCiAgICAjIGNoZWNrIGlmIGZyb250ZW5kIG1vZHVsZSByZWdpc3RlcmVkLCBpZiBub3QsIGRvIG5vdCBzaG93IGFjdGlvbgogICAgaWYgKCAkQWN0aW9uICkgewogICAgICAgIG15ICRNb2R1bGUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+eyRBY3Rpb259OwoKICAgICAgICByZXR1cm4gaWYgISRNb2R1bGU7CiAgICB9CgogICAgIyBjaGVjayBwZXJtaXNzaW9uCiAgICBteSAkQWNjZXNzT2sgPSAkVGlja2V0T2JqZWN0LT5QZXJtaXNzaW9uKAogICAgICAgIFR5cGUgICAgID0+ICdydycsCiAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldH0tPntUaWNrZXRJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIExvZ05vICAgID0+IDEsCiAgICApOwoKICAgIHJldHVybiBpZiAhJEFjY2Vzc09rOwoKICAgICMgY2hlY2sgcGVybWlzc2lvbgogICAgaWYgKCAkVGlja2V0T2JqZWN0LT5UaWNrZXRMb2NrR2V0KCBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0fS0+e1RpY2tldElEfSApICkgewogICAgICAgIG15ICRBY2Nlc3NPayA9ICRUaWNrZXRPYmplY3QtPk93bmVyQ2hlY2soCiAgICAgICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXR9LT57VGlja2V0SUR9LAogICAgICAgICAgICBPd25lcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuIGlmICEkQWNjZXNzT2s7CiAgICB9CgogICAgIyBjaGVjayBhY2wKICAgIG15ICVBQ0xMb29rdXAgPSByZXZlcnNlICV7ICRQYXJhbXtBQ0x9IHx8IHt9IH07CiAgICBpZiAoICEkQUNMTG9va3VweyRBY3Rpb259ICkgewogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGlmIHRoZXJlIGlzIGFscmVhZHkgYSBKSVJBIGlzc3VlIGZvciB0aGF0IHRpY2tldCwgZG8gbm90IHNob3cgdGhlIG1lbnUgaXRlbQogICAgaWYgKCAkUGFyYW17VGlja2V0fS0+eyJEeW5hbWljRmllbGRfSklSQUlzc3VlSUQifSApIHsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJEpJUkFDb25maWcgICAgICAgICAgICAgICAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldEpJUkEnKTsKICAgIG15ICRBbGxvd2VkUXVldWVzTGlzdCAgICAgICAgID0gJEpJUkFDb25maWctPntPVFJTVGlja2V0QWxsb3dlZFF1ZXVlczRDcmVhdGV9OwogICAgbXkgJEFsbG93Q3JlYXRpb25JbkFsbFF1ZXVlcyAgPSAkSklSQUNvbmZpZy0+e09UUlNUaWNrZXRBbGxvd0NyZWF0aW9uSW5BbGxRdWV1ZXN9OwoKICAgIGlmICggJEFsbG93Q3JlYXRpb25JbkFsbFF1ZXVlcwogICAgICAgICB8fCAoQHskQWxsb3dlZFF1ZXVlc0xpc3R9ICYmIGdyZXAgeyAkUGFyYW17VGlja2V0fS0+e1F1ZXVlfSBlcSAkXyB9IEB7JEFsbG93ZWRRdWV1ZXNMaXN0fSkgKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgJXsgJFBhcmFte0NvbmZpZ30gfSwKICAgICAgICAgICAgJXsgJFBhcmFte1RpY2tldH0gfSwKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJExhbmd1YWdlT2JqZWN0LT5UcmFuc2xhdGUoJ09UUlMgdG8gSmlyYScpLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgPT4gJExhbmd1YWdlT2JqZWN0LT5UcmFuc2xhdGUoJ0VzY2FsYXRlIHRoaXMgdGlja2V0IHRvIEppcmEnKSwKICAgICAgICAgICAgTGluayAgICAgICAgID0+ICdBY3Rpb249JyAuICRBY3Rpb24gLiAnO1RpY2tldElEPVslIERhdGEuVGlja2V0SUQgJV0nLAogICAgICAgIH07CiAgICB9CgogICAgcmV0dXJuOwp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAxNyBQZXJsLVNlcnZpY2VzLmRlLCBodHRwOi8vd3d3LnBlcmwtc2VydmljZXMuZGUKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkpJUkE6OlF1ZXVlU2V0dGluZ3M7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9IHF3KAogICAgS2VybmVsOjpTeXN0ZW06OkxvZwogICAgS2VybmVsOjpTeXN0ZW06OkRCCiAgICBLZXJuZWw6OlN5c3RlbTo6VXNlcgogICAgS2VybmVsOjpTeXN0ZW06OlZhbGlkCiAgICBLZXJuZWw6OlN5c3RlbTo6VGlja2V0Cik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkpJUkE6OlF1ZXVlU2V0dGluZ3MKCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFNldHRpbmdzQWRkKCkKCkFkZCB0aW1lIHRyYWNraW5nIAoKICAgIG15ICRJRCA9ICRTZXR0aW5nc09iamVjdC0+U2V0dGluZ3NBZGQoCiAgICAgICAgUXVldWVJRCAgID0+IDEyMzUsCiAgICAgICAgUHJvamVjdElEID0+ICd0cmFja2luZyB0aXRsZScsCiAgICAgICAgQXNzaWduZWUgID0+ICdvcGVuJywgICMgb3IgU3RhdHVzSUQgPT4gMSwKICAgICAgICBWYWxpZElEICAgPT4gMSwKICAgICAgICBVc2VySUQgICAgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBTZXR0aW5nc0FkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CiAgICBteSAkREJPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkICggcXcoUXVldWVJRCBVc2VySUQpICkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAkUGFyYW17VmFsaWRJRH0gIHx8PSAwOwogICAgJFBhcmFte0Fzc2lnbmVlfSB8fD0gJyc7CgogICAgIyBpbnNlcnQgbmV3IGl0ZW0KICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIGNhdF9qaXJhX3F1ZXVlX3NldHRpbmdzICcKICAgICAgICAgICAgLiAnKHF1ZXVlX2lkLCBwcm9qZWN0X2lkLCBhc3NpZ25lZSwgdmFsaWRfaWQsIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkgKScKICAgICAgICAgICAgLiAnVkFMVUVTICg/LCA/LCA/LCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPywgY3VycmVudF90aW1lc3RhbXAsID8pJywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtRdWV1ZUlEfSwKICAgICAgICAgICAgXCRQYXJhbXtQcm9qZWN0SUR9LAogICAgICAgICAgICBcJFBhcmFte0Fzc2lnbmVlfSwKICAgICAgICAgICAgXCRQYXJhbXtWYWxpZElEfSwKICAgICAgICAgICAgXCRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICBcJFBhcmFte1VzZXJJRH0sCiAgICAgICAgXSwKICAgICk7CgogICAgcmV0dXJuICRQYXJhbXtRdWV1ZUlEfTsKfQoKCj1pdGVtIFNldHRpbmdzVXBkYXRlKCkKCnRvIHVwZGF0ZSBuZXdzIAoKICAgIG15ICRTdWNjZXNzID0gJFNldHRpbmdzT2JqZWN0LT5TZXR0aW5nc1VwZGF0ZSgKICAgICAgICBJRCAgICAgICA9PiAzLAogICAgICAgIFRpY2tldElEID0+IDEyMzUsCiAgICAgICAgVGl0bGUgICAgPT4gJ3RyYWNraW5nIHRpdGxlJywgIyAob3B0aW9uYWwpCiAgICAgICAgU3RhdHVzICAgPT4gJ29wZW4nLCAgIyBvciBTdGF0dXNJRCA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBTZXR0aW5nc1VwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CiAgICBteSAkREJPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkICggcXcoUXVldWVJRCBVc2VySUQpICkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAkUGFyYW17VmFsaWRJRH0gIHx8PSAwOwogICAgJFBhcmFte0Fzc2lnbmVlfSB8fD0gJyc7CgogICAgIyBpbnNlcnQgbmV3IGl0ZW0KICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgPT4gJ1VQREFURSBjYXRfamlyYV9xdWV1ZV9zZXR0aW5ncyAnCiAgICAgICAgICAgIC4gJ1NFVCBxdWV1ZV9pZCA9ID8sIHByb2plY3RfaWQgPSA/LCBhc3NpZ25lZSA9ID8sIHZhbGlkX2lkID0gPywgJwogICAgICAgICAgICAuICcgY2hhbmdlX3RpbWUgPSBjdXJyZW50X3RpbWVzdGFtcCwgY2hhbmdlX2J5ID0gPycKICAgICAgICAgICAgLiAnIFdIRVJFIHF1ZXVlX2lkID0gPycsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17UXVldWVJRH0sCiAgICAgICAgICAgIFwkUGFyYW17UHJvamVjdElEfSwKICAgICAgICAgICAgXCRQYXJhbXtBc3NpZ25lZX0sCiAgICAgICAgICAgIFwkUGFyYW17VmFsaWRJRH0sCiAgICAgICAgICAgIFwkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgXCRQYXJhbXtJRH0sCiAgICAgICAgXSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIFZhbGlkU2V0dGluZ3NHZXQoKQoKPWN1dAoKc3ViIFZhbGlkU2V0dGluZ3NHZXQgewogICAgbXkgKCRTZWxmLCAlUGFyYW0pID0gQF87CgogICAgbXkgJVNldHRpbmdzID0gJFNlbGYtPlNldHRpbmdzR2V0KCAlUGFyYW0gKTsKCiAgICByZXR1cm4gaWYgISVTZXR0aW5nczsKICAgIHJldHVybiBpZiAhJFNldHRpbmdze1ZhbGlkfSBlcSAndmFsaWQnOwoKICAgIHJldHVybiAlU2V0dGluZ3M7Cn0KCj1pdGVtIFNldHRpbmdzR2V0KCkKCnJldHVybnMgYSBoYXNoIHdpdGggbmV3cyBkYXRhCgogICAgbXkgJVNldHRpbmdzRGF0YSA9ICRTZXR0aW5nc09iamVjdC0+U2V0dGluZ3NHZXQoIElEID0+IDIgKTsKClRoaXMgcmV0dXJucyBzb21ldGhpbmcgbGlrZToKCiAgICAlU2V0dGluZ3NEYXRhID0gKAogICAgICAgIElEICAgICAgICAgICAgPT4gMywKICAgICAgICBDcmVhdG9yICAgICAgID0+ICdBZ2VudCBOYW1lJywKICAgICAgICBDcmVhdGVCeSAgICAgID0+IDM1NCwKICAgICAgICBDcmVhdGVUaW1lICAgID0+ICcnLAogICAgICAgIENoYW5nZUJ5ICAgICAgPT4gMzUsCiAgICAgICAgQ2hhbmdlVGltZSAgICA9PiAnJywKICAgICk7Cgo9Y3V0CgpzdWIgU2V0dGluZ3NHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKIAogICAgbXkgJExvZ09iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CiAgICBteSAkREJPYmplY3QgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwogICAgbXkgJFVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17UXVldWVJRH0gKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKCiAgICByZXR1cm4gaWYgJFBhcmFte1F1ZXVlSUR9ID09IC0xOwoKICAgICMgc3FsCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBxdWV1ZV9pZCwgcHJvamVjdF9pZCwgYXNzaWduZWUsIHMudmFsaWRfaWQsICcKICAgICAgICAgICAgLiAncy5jcmVhdGVfYnksIHMuY3JlYXRlX3RpbWUsIHMuY2hhbmdlX2J5LCBzLmNoYW5nZV90aW1lLCBxLm5hbWUsIHYubmFtZSAnCiAgICAgICAgICAgIC4gJ0ZST00gY2F0X2ppcmFfcXVldWVfc2V0dGluZ3MgcyAnCiAgICAgICAgICAgIC4gJyAgTEVGVCBPVVRFUiBKT0lOIHF1ZXVlIHEgb24gcXVldWVfaWQgPSBxLmlkICcKICAgICAgICAgICAgLiAnICBMRUZUIE9VVEVSIEpPSU4gdmFsaWQgdiBvbiBzLnZhbGlkX2lkID0gdi5pZCAnCiAgICAgICAgICAgIC4gJ1dIRVJFIHF1ZXVlX2lkID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte1F1ZXVlSUR9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgbXkgJVNldHRpbmdzOwogICAgd2hpbGUgKCBteSBARGF0YSA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICVTZXR0aW5ncyA9ICgKICAgICAgICAgICAgUXVldWVJRCAgICA9PiAkRGF0YVswXSwKICAgICAgICAgICAgUHJvamVjdElEICA9PiAkRGF0YVsxXSwKICAgICAgICAgICAgQXNzaWduZWUgICA9PiAkRGF0YVsyXSwKICAgICAgICAgICAgVmFsaWRJRCAgICA9PiAkRGF0YVszXSwKICAgICAgICAgICAgQ3JlYXRlQnkgICA9PiAkRGF0YVs0XSwKICAgICAgICAgICAgQ3JlYXRlVGltZSA9PiAkRGF0YVs1XSwKICAgICAgICAgICAgQ2hhbmdlQnkgICA9PiAkRGF0YVs2XSwKICAgICAgICAgICAgQ2hhbmdlVGltZSA9PiAkRGF0YVs3XSwKICAgICAgICAgICAgUXVldWVOYW1lICA9PiAkRGF0YVs4XSwKICAgICAgICAgICAgVmFsaWQgICAgICA9PiAkRGF0YVs5XSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFNldHRpbmdze0NyZWF0ZUJ5fSApIHsKICAgICAgICAkU2V0dGluZ3N7Q3JlYXRvcn0gPSAkVXNlck9iamVjdC0+VXNlckxvb2t1cCggVXNlcklEID0+ICRTZXR0aW5nc3tDcmVhdGVCeX0gKTsKICAgIH0KCiAgICByZXR1cm4gJVNldHRpbmdzOwp9Cgo9aXRlbSBTZXR0aW5nc0RlbGV0ZSgpCgpkZWxldGVzIGEgcXVldWUgc2V0dGluZwoKICAgIG15ICRTdWNjZXNzID0gJFNldHRpbmdzT2JqZWN0LT5TZXR0aW5nc0RlbGV0ZSgKICAgICAgICBRdWV1ZUlEID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgU2V0dGluZ3NEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkTG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwogICAgbXkgJERCT2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17UXVldWVJRH0gKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBlaXRoZXIgUXVldWVJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRTUUwgID0gJ0RFTEVURSBGUk9NIGNhdF9qaXJhX3F1ZXVlX3NldHRpbmdzIFdIRVJFIHF1ZXVlX2lkID0gPyc7CgogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCAgPT4gJFNRTCwKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtRdWV1ZUlEfSBdLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKc3ViIFNldHRpbmdzTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CiAgICBteSAkREJPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgbXkgJFNRTCAgPSAnU0VMRUNUIHF1ZXVlX2lkLCBxLm5hbWUgRlJPTSBjYXRfamlyYV9xdWV1ZV9zZXR0aW5ncyBJTk5FUiBKT0lOIHF1ZXVlIHEgT04gcXVldWVfaWQgPSBxLmlkJzsgCgogICAgaWYgKCAkUGFyYW17VmFsaWR9ICkgewogICAgICAgICRTUUwgLj0gJyBXSEVSRSB2YWxpZF9pZCA9IDEnOwogICAgfQoKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAkU1FMLAogICAgKTsKCiAgICBteSAlTGlzdDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRMaXN0eyAkUm93WzBdIH0gPSAkUm93WzFdLAogICAgfQoKICAgIHJldHVybiAlTGlzdDsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQKCg==
IyAgLS0KIyAgS2VybmVsL1N5c3RlbS9KSVJBL1V0aWxzLnBtIC0gY29yZSBtb2R1bGUKIyAgQ29weXJpZ2h0IChDKSAyMDE2IGNhdHdvcmt4IEdtYkggaHR0cDovL3d3dy5jYXR3b3JreC5kZQojICAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkpJUkE6OlV0aWxzOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEpJUkE6OlJFU1Q7CnVzZSBMaXN0OjpVdGlsIHF3KGZpcnN0KTsKCnVzZSBjb25zdGFudCBQID0+IF9fUEFDS0FHRV9fOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSBxdygKICAgIEtlcm5lbDo6Q29uZmlnCiAgICBLZXJuZWw6OlN5c3RlbTo6TG9nCiAgICBLZXJuZWw6OlN5c3RlbTo6TWFpbgogICAgS2VybmVsOjpTeXN0ZW06OkpTT04KICAgIEtlcm5lbDo6U3lzdGVtOjpDYWNoZQopOwoKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkTG9nT2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwoKICAgICRTZWxmLT57RGVidWd9ICAgICAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0pJUkE6OkRlYnVnJyk7CiAgICAkU2VsZi0+e0NvbmZpZ30gICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXRKSVJBJykgfHwge307CgogICAgbXkgJEhvc3QgPSAkUGFyYW17SklSQVVSTH0gfHwgJFNlbGYtPntDb25maWd9LT57VVJMfSAuICRTZWxmLT57Q29uZmlnfS0+e1BhdGh9OwogICAgJEhvc3QgPX4gc3svXHp9e314bXNnOwoKICAgIG15ICRVc2VyICAgICA9ICRQYXJhbXtKSVJBVVNFUn0gfHwgJFNlbGYtPntDb25maWd9LT57VXNlcn07CiAgICBteSAkUGFzc3dvcmQgPSAkUGFyYW17SklSQVBXRH0gIHx8ICRTZWxmLT57Q29uZmlnfS0+e1Bhc3N3b3JkfTsKCiAgICAkU2VsZi0+e0pJUkFDbGllbnR9ID0gSklSQTo6UkVTVC0+bmV3KAogICAgICAgICRIb3N0LAogICAgICAgICRVc2VyLAogICAgICAgICRQYXNzd29yZCwKICAgICk7CgogICAgaWYgKCAkU2VsZi0+e0RlYnVnfSApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICJkZWJ1ZyIsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkSG9zdCAvLyAkVXNlciAvLyAkUGFzc3dvcmQiLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJFZlcmlmeVNTTCA9ICRDb25maWdPYmplY3QtPkdldCgnSklSQTo6U1NMVmVyaWZ5Jyk7CiAgICBpZiAoICEkVmVyaWZ5U1NMICkgewogICAgICAgIG15ICRMb2FkZWQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKAogICAgICAgICAgICAnTmV0OjpTU0xlYXknLAogICAgICAgICAgICBTaWxlbnQgPT4gMSwKICAgICAgICApOwogICAgICAgIGlmICgkTG9hZGVkKSB7CiAgICAgICAgICAgICRTZWxmLT57SklSQUNsaWVudH0tPntyZXN0fS0+Z2V0VXNlcmFnZW50KCktPnNzbF9vcHRzKCB2ZXJpZnlfaG9zdG5hbWUgPT4gMCApOwogICAgICAgICAgICAkU2VsZi0+e0pJUkFDbGllbnR9LT57cmVzdH0tPmdldFVzZXJhZ2VudCgpLT5zc2xfb3B0cyggU1NMX3ZlcmZpeV9tb2RlID0+IE5ldDo6U1NMZWF5OjpWRVJJRllfTk9ORSgpICk7CiAgICAgICAgfQogICAgfQoKICAgICRTZWxmLT57Q2FjaGVUeXBlfSA9ICdKSVJBVXRpbHMnOwogICAgJFNlbGYtPntDYWNoZVRUTH0gID0gJENvbmZpZ09iamVjdC0+R2V0KCdKSVJBOjpDYWNoZVRUTCcpOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gQ2hlY2soKQoKQ2hlY2tzIGlmIHRoZSBnaXZlbiBjcmVkZW50aWFscyBhcmUgY29ycmVjdC4gVGhpcyBpcyBkb25lIHdpdGggdGhlIEFQSSBjYWxsIG9mICdteXByZWZlcmVuY2VzJwoKUmV0dXJucyAgSFRUUCBzdGF0dXM6CgogIDIwMCAtPiBVUkwgT0ssIENyZWRlbnRpYWxzIE9LCiAgNDA0IC0+IFVSTCBOb3QgT0sKICA0MDEgLT4gVVJMIE9LLCBDcmVkZW50aWFscyBOb3QgT0sKCj1jdXQKCnN1YiBDaGVjayB7CiAgICBteSAoJFNlbGYsICVQYXJhbSkgPSBAXzsKCiAgICBteSAkTG9nT2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKICAgIG15ICRNYWluT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKTsKCiAgICBteSAkRXJyb3JHZXQgPSAnJzsKCiAgICBldmFsewogICAgICAgIG15ICRQcmVmZXJlbmNlcyA9ICRTZWxmLT57SklSQUNsaWVudH0tPkdFVCggJy9teXByZWZlcmVuY2VzJyApOwogICAgfSBvciAkRXJyb3JHZXQgPSAkQDsKCiAgICBpZiAoICRTZWxmLT57RGVidWd9ICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gUCAuICAiOjpDaGVjazogIgogICAgICAgICAgICAgICAgLiAkTWFpbk9iamVjdC0+RHVtcCggWyAkU2VsZi0+e0pJUkFDbGllbnR9LT57cmVzdH0tPmdldEhvc3QoKSAuICcvbXlwcmVmZXJlbmNlcycsICRFcnJvckdldCBdICksCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMjAwIGlmICEkRXJyb3JHZXQ7CgogICAgbXkgKCRFcnJvckNvZGUpID0gJEVycm9yR2V0ID1+IG17KFswLTldKyl9eG1zOwoKICAgIHJldHVybiAoICRFcnJvckNvZGUsICRFcnJvckdldCApOwp9Cgo9aXRlbSBQcm9qZWN0c0dldCgpCgo9Y3V0CgpzdWIgUHJvamVjdHNHZXQgewogICAgbXkgKCRTZWxmLCAlUGFyYW0pID0gQF87CgogICAgbXkgJExvZ09iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKICAgIG15ICRNYWluT2JqZWN0ICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpOwogICAgbXkgJENhY2hlT2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgbXkgJFByb2plY3RzID0gJENhY2hlT2JqZWN0LT5HZXQoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnX1Byb2plY3RzJywKICAgICAgICBLZXkgID0+ICdBbGwnLAogICAgKTsKCiAgICBpZiAoICRQcm9qZWN0cyAmJiAhJFBhcmFte0ZvcmNlfSApIHsKICAgICAgICByZXR1cm4gJFByb2plY3RzOwogICAgfQoKICAgIG15ICRNZXRhSlNPTjsKICAgIG15ICRFcnJvckdldDsKCiAgICBldmFsewogICAgICAgICRNZXRhSlNPTiA9ICRTZWxmLT57SklSQUNsaWVudH0tPkdFVCggJy9pc3N1ZS9jcmVhdGVtZXRhJyApOwogICAgfSBvciAkRXJyb3JHZXQgPSAkQDsKCiAgICBpZiAoICRFcnJvckdldCApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+IHNwcmludGYgUCAuICAiOjpQcm9qZWN0c0dldDogY2Fubm90IG1ldGFkYXRhOiAlcyIsCiAgICAgICAgICAgICAgICAkRXJyb3JHZXQsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICt7fTsKICAgIH0KCiAgICBteSBAV2hpdGVsaXN0ID0gQHsgJENvbmZpZ09iamVjdC0+R2V0KCdKSVJBOjpQcm9qZWN0V2hpdGVsaXN0JykgfHwgW10gfTsKICAgIG15IEBCbGFja2xpc3QgPSBAeyAkQ29uZmlnT2JqZWN0LT5HZXQoJ0pJUkE6OlByb2plY3RCbGFja2xpc3QnKSB8fCBbXSB9OwoKICAgIGlmICggJFNlbGYtPntEZWJ1Z30gKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICBNZXNzYWdlICA9PiBQIC4gICI6OlByb2plY3RzR2V0OiAiCiAgICAgICAgICAgICAgICAuICRNYWluT2JqZWN0LT5EdW1wKCBbIFxAV2hpdGVsaXN0LCBcQEJsYWNrbGlzdCwgJE1ldGFKU09OLT57cHJvamVjdHN9IF0gKSwKICAgICAgICApOwogICAgfQoKICAgIFBST0pFQ1RJVEVNOgogICAgZm9yIG15ICRQcm9qZWN0SXRlbSAoIEB7ICRNZXRhSlNPTi0+e3Byb2plY3RzfSB8fCBbXSB9ICkgewogICAgICAgIG15ICRLZXkgID0gJFByb2plY3RJdGVtLT57a2V5fTsKICAgICAgICBteSAkTmFtZSA9ICRQcm9qZWN0SXRlbS0+e25hbWV9OwoKICAgICAgICBpZiAoICRTZWxmLT57RGVidWd9ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gUCAuICAiOjpQcm9qZWN0c0dldDogQ2hlY2sgUHJvamVjdCAkS2V5IC0+ICROYW1lIgogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCBAV2hpdGVsaXN0ICkgewogICAgICAgICAgICBuZXh0IFBST0pFQ1RJVEVNIGlmICEoZmlyc3R7ICRLZXkgPX4gbXskX314bXMgfUBXaGl0ZWxpc3QpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCBAQmxhY2tsaXN0ICkgewogICAgICAgICAgICBuZXh0IFBST0pFQ1RJVEVNIGlmIChmaXJzdHsgJEtleSA9fiBteyRffXhtcyB9QEJsYWNrbGlzdCk7CiAgICAgICAgfQoKICAgICAgICAkUHJvamVjdHMtPnskS2V5fSA9ICROYW1lOwoKICAgICAgICAjIHNhdmUgaXNzdWV0eXBlcwogICAgICAgIG15ICRJc3N1ZVR5cGVzTGlzdDsKCiAgICAgICAgbXkgJElzc3VlVHlwZXMgPSAkUHJvamVjdEl0ZW0tPntpc3N1ZXR5cGVzfSB8fCBbXTsKCiAgICAgICAgSVNTVUVUWVBFOgogICAgICAgIGZvciBteSAkSXNzdWVUeXBlICggQHsgJElzc3VlVHlwZXMgfSApIHsKCiAgICAgICAgICAgIG5leHQgSVNTVUVUWVBFIGlmICRJc3N1ZVR5cGUtPntzdWJ0YXNrfTsKCiAgICAgICAgICAgIG15ICRJc3N1ZVR5cGVOYW1lID0gJElzc3VlVHlwZS0+e25hbWV9OwogICAgICAgICAgICAkSXNzdWVUeXBlc0xpc3QtPnskSXNzdWVUeXBlTmFtZX0gPSAkSXNzdWVUeXBlTmFtZTsKICAgICAgICB9CgogICAgICAgICRDYWNoZU9iamVjdC0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnX0lzc3VlVHlwZXMnLAogICAgICAgICAgICBLZXkgICA9PiAkS2V5LAogICAgICAgICAgICBWYWx1ZSA9PiAkSXNzdWVUeXBlc0xpc3QsCiAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgICAgICk7CiAgICB9CgogICAgJFByb2plY3RzIC8vPSB7fTsKCiAgICBpZiAoICRTZWxmLT57RGVidWd9ICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gUCAuICAiOjpQcm9qZWN0c0dldDogIgogICAgICAgICAgICAgICAgLiAkTWFpbk9iamVjdC0+RHVtcCggJFByb2plY3RzICksCiAgICAgICAgKTsKICAgIH0KCiAgICAkQ2FjaGVPYmplY3QtPlNldCgKICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnX1Byb2plY3RzJywKICAgICAgICBLZXkgICA9PiAnQWxsJywKICAgICAgICBWYWx1ZSA9PiAkUHJvamVjdHMsCiAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICApOwoKICAgIHJldHVybiAkUHJvamVjdHM7Cn0KCj1pdGVtIElzc3VlVHlwZXNHZXQoKQoKR2V0IGFsbCBpc3N1ZSB0eXBlcyB0aGF0IGJlbG9uZyB0byBhIHByb2plY3QgZnJvbSBKSVJBCgogICAgbXkgJElzc3VlVHlwZXMgPSAkT2JqZWN0LT5Jc3N1ZVR5cGVzR2V0KAogICAgICAgIFByb2plY3QgPT4gJFByb2plY3QsCiAgICApOwoKPWN1dAoKc3ViIElzc3VlVHlwZXNHZXQgewogICAgbXkgKCRTZWxmLCAlUGFyYW0pID0gQF87CgogICAgbXkgJExvZ09iamVjdCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwogICAgbXkgJENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CgogICAgIyBjaGVjayBmb3IgbmVlZGVkIGRhdGEKICAgIGZvciBteSAkTmVlZGVkICggcXcvUHJvamVjdC8gKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkSXNzdWVUeXBlcyA9ICRDYWNoZU9iamVjdC0+R2V0KAogICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdfSXNzdWVUeXBlcycsCiAgICAgICAgS2V5ICAgPT4gJFBhcmFte1Byb2plY3R9LAogICAgKTsKCiAgICBpZiAoICRJc3N1ZVR5cGVzICkgewogICAgICAgIHJldHVybiAkSXNzdWVUeXBlczsKICAgIH0KCiAgICAkU2VsZi0+UHJvamVjdHNHZXQoIEZvcmNlID0+IDEgKTsKCiAgICAkSXNzdWVUeXBlcyA9ICRDYWNoZU9iamVjdC0+R2V0KAogICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdfSXNzdWVUeXBlcycsCiAgICAgICAgS2V5ICAgPT4gJFBhcmFte1Byb2plY3R9LAogICAgKTsKCiAgICByZXR1cm4gJElzc3VlVHlwZXMgfHwge307Cn0KCj1pdGVtIFVzZXJzR2V0KCkKCkdldCBhbGwgaXNzdWUgdHlwZXMgdGhhdCBiZWxvbmcgdG8gYSBwcm9qZWN0IGZyb20gSklSQQoKICAgIG15ICRVc2VycyA9ICRPYmplY3QtPlVzZXJzR2V0KAogICAgICAgIFByb2plY3QgPT4gJFByb2plY3QsCiAgICApOwoKPWN1dAoKc3ViIFVzZXJzR2V0IHsKICAgIG15ICgkU2VsZiwgJVBhcmFtKSA9IEBfOwoKICAgIG15ICRMb2dPYmplY3QgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKICAgIG15ICRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwoKICAgICMgY2hlY2sgZm9yIG5lZWRlZCBkYXRhCiAgICBmb3IgbXkgJE5lZWRlZCAoIHF3L1Byb2plY3QvICkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBpbXBsZW1lbnQgY2FjaGluZwogICAgbXkgJFVzZXJzID0gJENhY2hlT2JqZWN0LT5HZXQoCiAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ19Vc2VycycsCiAgICAgICAgS2V5ICAgPT4gJFBhcmFte1Byb2plY3R9LAogICAgKTsKCgogICAgbXkgJFVzZXJzSlNPTjsKICAgIG15ICRFcnJvckdldDsKCiAgICAjIGdldCB1c2VycwogICAgZXZhbHsKICAgICAgICAkVXNlcnNKU09OID0gJFNlbGYtPntKSVJBQ2xpZW50fS0+R0VUKAogICAgICAgICAgICBzcHJpbnRmICcvdXNlci9hc3NpZ25hYmxlL3NlYXJjaD9tYXhSZXN1bHRzPSVkJnByb2plY3Q9JXMnLAogICAgICAgICAgICAgICAgMTAwMCwKICAgICAgICAgICAgICAgICRQYXJhbXtQcm9qZWN0fQogICAgICAgICk7CiAgICB9IG9yICRFcnJvckdldCA9ICRAOwoKICAgIGlmICggJEVycm9yR2V0ICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gc3ByaW50ZiBQIC4gICI6OlVzZXJzR2V0OiBjYW5ub3QgYXNzaWduYWJsZSB1c2VycyBmb3IgcHJvamVjdCAlczogJXMiLAogICAgICAgICAgICAgICAgJFBhcmFte1Byb2plY3R9LCAkRXJyb3JHZXQsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICt7fTsKICAgIH0KCiAgICBmb3IgbXkgJFVzZXIgKCBAeyAkVXNlcnNKU09OIHx8IFtdIH0gKSB7CiAgICAgICAgbXkgJEtleSAgID0gJFVzZXItPntuYW1lfTsKICAgICAgICBteSAkVmFsdWUgPSAkVXNlci0+e2Rpc3BsYXlOYW1lfTsgICAKCiAgICAgICAgJFVzZXJzLT57JEtleX0gPSAkVmFsdWU7CiAgICB9CgogICAgJENhY2hlT2JqZWN0LT5TZXQoCiAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ19Vc2VycycsCiAgICAgICAgS2V5ICAgPT4gJFBhcmFte1Byb2plY3R9LAogICAgICAgIFZhbHVlID0+ICRVc2VycywKICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICk7CgogICAgcmV0dXJuICRVc2VyczsKfQoKPWl0ZW0gU3RhdGVzR2V0KCkKCkdldCBhbGwgaXNzdWUgdHlwZXMgdGhhdCBiZWxvbmcgdG8gYSBwcm9qZWN0IGZyb20gSklSQQoKICAgIG15ICRTdGF0ZXMgPSAkT2JqZWN0LT5TdGF0ZXNHZXQoCiAgICAgICAgUHJvamVjdCA9PiAkUHJvamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgU3RhdGVzR2V0IHsKICAgIG15ICgkU2VsZiwgJVBhcmFtKSA9IEBfOwoKICAgIG15ICRMb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CgogICAgIyBjaGVjayBmb3IgbmVlZGVkIGRhdGEKICAgIGZvciBteSAkTmVlZGVkICggcXcvUHJvamVjdC8gKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIFRPRE86IGltcGxlbWVudCBjYWNoaW5nCgogICAgbXkgJFN0YXRlcyA9IHt9OwogICAgbXkgJEVycm9yR2V0OwoKICAgICMgVE9ETzogVVJMIHRvIGdldCBzdGF0ZXMKICAgICNldmFsewogICAgIyAgICAkU3RhdGVzID0gJFNlbGYtPntKSVJBQ2xpZW50fS0+R0VUKCAnL2lzc3VlLycgLiAkUGFyYW17UHJvamVjdH0gKTsKICAgICN9IG9yICRFcnJvckdldCA9ICRAOwogICAgIwogICAgI2lmICggJEVycm9yR2V0ICkgewogICAgIyAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAjICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgIyAgICAgICAgTWVzc2FnZSAgPT4gc3ByaW50ZiBQIC4gICI6OlN0YXRlc0dldDogY2Fubm90IGlzc3VlIHR5cGVzIGZvciBwcm9qZWN0ICVzOiAlcyIsCiAgICAjICAgICAgICAgICAgJFBhcmFte1Byb2plY3R9LCAkRXJyb3JHZXQsCiAgICAjICAgICk7CiAgICAjCiAgICAjICAgIHJldHVybiAreyBlcnJvciA9PiAkRXJyb3JHZXQgfTsKICAgICN9CgogICAgcmV0dXJuICRTdGF0ZXM7Cn0KCj1pdGVtIElzc3VlTGlzdCgpCgo9Y3V0CgpzdWIgSXNzdWVMaXN0IHsKICAgIG15ICgkU2VsZiwgJVBhcmFtKSA9IEBfOwoKICAgIG15ICRMb2dPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CiAgICBteSAkTWFpbk9iamVjdCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKTsKICAgIG15ICRDYWNoZU9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgY2hlY2sgZm9yIG5lZWRlZCBkYXRhCiAgICBmb3IgbXkgJE5lZWRlZCAoIHF3L1Byb2plY3QvICkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgJFBhcmFte1Rlcm19IC8vPSAnJzsKCiAgICBteSAkVHlwZVRlcm0gPSAkUGFyYW17VGVybX07CiAgICAkVHlwZVRlcm0gICAgPX4gc3tbXkEtWmEtejAtOV9dfXtffWc7CgogICAgbXkgJENhY2hlVHlwZSA9ICAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnX0lzc3Vlc18nIC4gJFBhcmFte1Byb2plY3R9IC4gJ18nIC4gJFR5cGVUZXJtOwoKICAgIG15ICRJc3N1ZXMgPSAkQ2FjaGVPYmplY3QtPkdldCgKICAgICAgICBUeXBlID0+ICRDYWNoZVR5cGUsCiAgICAgICAgS2V5ICA9PiAnQWxsJywKICAgICk7CgogICAgaWYgKCAkSXNzdWVzICYmICEkUGFyYW17Rm9yY2V9ICkgewogICAgICAgIHJldHVybiAkSXNzdWVzOwogICAgfQoKICAgIG15ICRJc3N1ZXNKU09OOwogICAgbXkgJEVycm9yR2V0OwoKICAgIG15IEBTdGF0ZXMgPSBAeyAkQ29uZmlnT2JqZWN0LT5HZXQoJ0pJUkE6Oklzc3VlU2VhcmNoU3RhdGVzJykgfHwgW10gfTsKCiAgICBteSAkU3RhdGVzU3RyaW5nID0gJyc7CiAgICBpZiAoIEBTdGF0ZXMgKSB7CiAgICAgICAgJFN0YXRlc1N0cmluZyA9ICcgQU5EIHN0YXR1cyBJTiAoJyAuIGpvaW4oJywnLCBtYXB7IHFxfiIkXyJ+IH1AU3RhdGVzICkgLiAnKSc7CiAgICB9CgogICAgbXkgJFBhcmFtcyA9IHNwcmludGYgInByb2plY3Q9JXMlcyBvcmRlciBieSBpc3N1ZUtleSBkZXNjIiwgJFBhcmFte1Byb2plY3R9LCAkU3RhdGVzU3RyaW5nOwoKICAgIGlmICggJFNlbGYtPntEZWJ1Z30gKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICBNZXNzYWdlICA9PiBQIC4gICI6Oklzc3VlTGlzdDogUGFyYW1zIC0+ICIgLiAkUGFyYW1zLAogICAgICAgICk7CiAgICB9CgogICAgZXZhbHsKICAgICAgICBteSAkTWF4UmVzdWx0cyA9ICRDb25maWdPYmplY3QtPkdldCgnSklSQTo6SXNzdWVTZWFyY2hNYXhSZXN1bHRzJykgfHwgMzAwOwogICAgICAgICRJc3N1ZXNKU09OICAgID0gJFNlbGYtPntKSVJBQ2xpZW50fS0+UE9TVCgKICAgICAgICAgICAgJy9zZWFyY2gnLAogICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAganFsICAgICAgICA9PiAkUGFyYW1zLAogICAgICAgICAgICAgICAgbWF4UmVzdWx0cyA9PiAkTWF4UmVzdWx0cywKICAgICAgICAgICAgICAgIGZpZWxkcyAgICAgPT4gW3F3L2lkIGtleSBkZXNjcmlwdGlvbi9dLAogICAgICAgICAgICB9CiAgICAgICAgKTsKICAgIH0gb3IgJEVycm9yR2V0ID0gJEA7CgogICAgaWYgKCAkRXJyb3JHZXQgKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiBzcHJpbnRmIFAgLiAgIjo6SXNzdWVMaXN0OiBjYW5ub3QgZ2V0IGlzc3VlIGxpc3Q6ICVzIiwKICAgICAgICAgICAgICAgICRFcnJvckdldCwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gK3t9OwogICAgfQoKICAgIGlmICggJFNlbGYtPntEZWJ1Z30gKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICBNZXNzYWdlICA9PiBQIC4gICI6Oklzc3VlTGlzdDogSlNPTiAtPiAiCiAgICAgICAgICAgICAgICAuICRNYWluT2JqZWN0LT5EdW1wKCAkSXNzdWVzSlNPTiApLAogICAgICAgICk7CiAgICB9CgogICAgbXkgQElzc3VlTGlzdDsKCiAgICBteSAkUkU7CiAgICBpZiAoICRQYXJhbXtUZXJtfSApIHsKICAgICAgICAkUGFyYW17VGVybX0gPX4gc3tcKn17Lip9eG1zZzsKICAgICAgICAkUkUgICAgICAgICAgPSBxci8kUGFyYW17VGVybX0vaTsKICAgIH0KCiAgICBJU1NVRUlURU06CiAgICBmb3IgbXkgJElzc3VlSXRlbSAoIEB7ICRJc3N1ZXNKU09OLT57aXNzdWVzfSB8fCBbXSB9ICkgewogICAgICAgIG15ICRLZXkgID0gJElzc3VlSXRlbS0+e2tleX07CiAgICAgICAgbXkgJERlc2MgPSAkSXNzdWVJdGVtLT57ZmllbGRzfS0+e2Rlc2NyaXB0aW9ufTsKICAgICAgICBteSAkSUQgICA9ICRJc3N1ZUl0ZW0tPntpZH07CgogICAgICAgIGlmICggJFBhcmFte1Rlcm19ICkgewogICAgICAgICAgICBuZXh0IElTU1VFSVRFTSBpZiAkS2V5ICF+ICRSRSBhbmQgJERlc2MgIX4gJFJFOwogICAgICAgIH0KCiAgICAgICAgcHVzaCBASXNzdWVMaXN0LCB7CiAgICAgICAgICAgIFZhbHVlID0+ICRJRCwKICAgICAgICAgICAgTGFiZWwgPT4gc3ByaW50ZiggIiVzIC0gJXMiLCAkS2V5LCAkRGVzYyApLAogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICRTZWxmLT57RGVidWd9ICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gUCAuICAiOjpJc3N1ZUxpc3Q6ICIgLgogICAgICAgICAgICAgICAgJE1haW5PYmplY3QtPkR1bXAoIFxASXNzdWVMaXN0ICksCiAgICAgICAgKTsKICAgIH0KCiAgICAkQ2FjaGVPYmplY3QtPlNldCgKICAgICAgICBUeXBlICA9PiAkQ2FjaGVUeXBlLAogICAgICAgIEtleSAgID0+ICdBbGwnLAogICAgICAgIFZhbHVlID0+IFxASXNzdWVMaXN0LAogICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgKTsKCiAgICByZXR1cm4gXEBJc3N1ZUxpc3Q7Cn0KCjE7Cgo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAxNiAtIDIwMTggUGVybC1TZXJ2aWNlcy5kZSwgaHR0cDovL3Blcmwtc2VydmljZXMuZGUKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6Q3VzdG9tOjpBdHRhY2htZW50RXZlbnRzOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwoKbXkgJExvYWRlZDsKbXkgJUFscmVhZHlSdW47CgpJbml0KCk7CgojIGRpc2FibGUgcmVkZWZpbmUgd2FybmluZ3MgaW4gdGhpcyBzY29wZQpzdWIgSW5pdCB7CiAgICBubyB3YXJuaW5ncyAncmVkZWZpbmUnOwoKICAgIHJldHVybiBpZiAkTG9hZGVkKys7CgogICAgewogICAgICAgIGxvY2FsICRLZXJuZWw6Ok9NID0gS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXItPm5ldygpOwogICAgICAgIG15ICRNSU1FT2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZTo6QmFja2VuZDo6TUlNRUJhc2U6OkFydGljbGVTdG9yYWdlREInKTsKICAgICAgICAgICAkTUlNRU9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGU6OkJhY2tlbmQ6Ok1JTUVCYXNlOjpBcnRpY2xlU3RvcmFnZUZTJyk7CiAgICB9CgogICAgbXkgJE9yaWdSdW5EQiA9ICpLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlOjpCYWNrZW5kOjpNSU1FQmFzZTo6QXJ0aWNsZVN0b3JhZ2VEQjo6QXJ0aWNsZVdyaXRlQXR0YWNobWVudHtDT0RFfTsKICAgICpLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlOjpCYWNrZW5kOjpNSU1FQmFzZTo6QXJ0aWNsZVN0b3JhZ2VEQjo6QXJ0aWNsZVdyaXRlQXR0YWNobWVudCA9IHN1YiB7CiAgICAgICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+JE9yaWdSdW5EQiggJVBhcmFtICk7CiAgICAgICAgX1RyaWdnZXJFdmVudCggJFNlbGYsICVQYXJhbSwgU3VjY2VzcyA9PiAkU3VjY2VzcyApOwoKICAgICAgICByZXR1cm4gJFN1Y2Nlc3M7CiAgICB9OwoKICAgIG15ICRPcmlnUnVuRlMgPSAqS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZTo6QmFja2VuZDo6TUlNRUJhc2U6OkFydGljbGVTdG9yYWdlRlM6OkFydGljbGVXcml0ZUF0dGFjaG1lbnR7Q09ERX07CiAgICAqS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZTo6QmFja2VuZDo6TUlNRUJhc2U6OkFydGljbGVTdG9yYWdlRlM6OkFydGljbGVXcml0ZUF0dGFjaG1lbnQgPSBzdWIgewogICAgICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPiRPcmlnUnVuRlMoICVQYXJhbSApOwogICAgICAgIF9UcmlnZ2VyRXZlbnQoICRTZWxmLCAlUGFyYW0sIFN1Y2Nlc3MgPT4gJFN1Y2Nlc3MgKTsKCiAgICAgICAgcmV0dXJuICRTdWNjZXNzOwogICAgfTsKfQoKc3ViIF9UcmlnZ2VyRXZlbnQgewogICAgbXkgKCRTZWxmLCAlUGFyYW0pID0gQF87CgogICAgbXkgJFRpY2tldE9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CiAgICBteSAkQXJ0aWNsZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnKTsKCiAgICAjIHRyaWdnZXIgZXZlbnQKICAgIGlmICggJFBhcmFte1N1Y2Nlc3N9ICkgewoKICAgICAgICBteSAkVGlja2V0SUQgPSAkQXJ0aWNsZU9iamVjdC0+VGlja2V0SURMb29rdXAoIEFydGljbGVJRCA9PiAkUGFyYW17QXJ0aWNsZUlEfSApOwogICAgICAgIG15ICVUaWNrZXQgICA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICk7CgogICAgICAgIG15ICRLZXkgPSBzcHJpbnRmICIlc18lcyIsICRUaWNrZXRJRCwgJFBhcmFte0FydGljbGVJRH07CiAgICAgICAgcmV0dXJuIGlmICRBbHJlYWR5UnVueyRLZXl9Kys7CgogICAgICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJEFydGljbGVPYmplY3QtPkJhY2tlbmRGb3JBcnRpY2xlKAogICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFRpY2tldElELAogICAgICAgICAgICBBcnRpY2xlSUQgPT4gJFBhcmFte0FydGljbGVJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJUF0dGFjaG1lbnRJbmRleCA9ICRCYWNrZW5kT2JqZWN0LT5BcnRpY2xlQXR0YWNobWVudEluZGV4KAogICAgICAgICAgICBBcnRpY2xlSUQgPT4gJFBhcmFte0FydGljbGVJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgKCRGaWxlSUQpID0gZ3JlcHsKICAgICAgICAgICAgJEF0dGFjaG1lbnRJbmRleHskX30tPntGaWxlbmFtZX0gZXEgJFBhcmFte0ZpbGVuYW1lfQogICAgICAgIH0ga2V5cyAlQXR0YWNobWVudEluZGV4OwoKICAgICAgICAkVGlja2V0T2JqZWN0LT5FdmVudEhhbmRsZXIoCiAgICAgICAgICAgIEV2ZW50ID0+ICdBdHRhY2htZW50V3JpdGUnLAogICAgICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJFBhcmFte0FydGljbGVJRH0sCiAgICAgICAgICAgICAgICBGaWxlbmFtZSAgPT4gJFBhcmFte0ZpbGVuYW1lfSwKICAgICAgICAgICAgICAgIEZpbGVJRCAgICA9PiAkRmlsZUlELAogICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICB9Cn0KCjE7Cgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vVGlja2V0L0V2ZW50L0FkZEFydGljbGVUb0pJUkFJc3N1ZS5wbSAtIGV2ZW50IG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwOC0yMDE4IGNhdHdvcmt4IEdtYkggaHR0cDovL3d3dy5jYXR3b3JreC5kZQojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpFdmVudDo6QWRkQXJ0aWNsZVRvSklSQUlzc3VlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIExpc3Q6OlV0aWwgcXcoZmlyc3QpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSBxdygKICAgIEtlcm5lbDo6Q29uZmlnCiAgICBLZXJuZWw6OlN5c3RlbTo6TG9nCiAgICBLZXJuZWw6OlN5c3RlbTo6TWFpbgogICAgS2VybmVsOjpTeXN0ZW06OlRpY2tldAogICAgS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZQogICAgS2VybmVsOjpTeXN0ZW06OlVzZXIKICAgIEtlcm5lbDo6U3lzdGVtOjpUaWNrZXRKSVJBCik7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgJFNlbGYtPntEZWJ1Z30gICA9ICRDb25maWdPYmplY3QtPkdldCgnSklSQTo6RGVidWcnKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkVGlja2V0T2JqZWN0ICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKICAgIG15ICRBcnRpY2xlT2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZScpOwogICAgbXkgJENvbmZpZ09iamVjdCAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJE1haW5PYmplY3QgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpOwogICAgbXkgJFVzZXJPYmplY3QgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpOwogICAgbXkgJExvZ09iamVjdCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CiAgICBteSAkVGlja2V0SklSQU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXRKSVJBJyk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhEYXRhIEV2ZW50IENvbmZpZyBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCFcbiIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGZvciBteSAkTmVlZGVkRGF0YSAocXcoVGlja2V0SUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFte0RhdGF9LT57JE5lZWRlZERhdGF9ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZERhdGEgaW4gRGF0YSFcbiIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRVc2VySUQgPSAkUGFyYW17VXNlcklEfTsKCiAgICAjIEdldCBjdXJyZW50IHVzZXIgZGF0YQogICAgbXkgJUN1cnJlbnRVc2VyID0gJFVzZXJPYmplY3QtPkdldFVzZXJEYXRhKAogICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgKTsKCiAgICBpZiAoICRTZWxmLT57RGVidWd9ICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gX19QQUNLQUdFX18gLiAiOjpSdW4oKTogVXNlcklEOiAkVXNlcklEIFVzZXJMb2dpbjogJEN1cnJlbnRVc2Vye1VzZXJMb2dpbn1cbiIKICAgICAgICApOwogICAgfQoKICAgIGlmICggJEN1cnJlbnRVc2Vye1VzZXJMb2dpbn0gZXEgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXRKSVJBJyktPntJbmNvbWluZ1VzZXJ9ICkgewogICAgCXJldHVybiAxOwogICAgfQoKICAgIG15ICRUaWNrZXRJRCA9ICRQYXJhbXtEYXRhfS0+e1RpY2tldElEfTsKCiAgICBpZiAoICRTZWxmLT57RGVidWd9ICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gX19QQUNLQUdFX18gLiAiOjpSdW4oKTogVGlja2V0SUQ6ICRUaWNrZXRJRCBFdmVudDogJFBhcmFte0V2ZW50fVxuIgogICAgICAgICk7CiAgICB9CgojICAgIHJldHVybiAxIGlmICRQYXJhbXtFdmVudH0gbmUgJ0FydGljbGVDcmVhdGUnOwoKICAgIG15ICVUaWNrZXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICAgICAgVGlja2V0SUQgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwKICAgICk7CgogICAgcmV0dXJuIDEgaWYgISVUaWNrZXQ7CgogICAgbXkgJElzc3VlSUQgPSAkVGlja2V0e0R5bmFtaWNGaWVsZF9KSVJBSXNzdWVJRH07CiAgICByZXR1cm4gMSBpZiAhJElzc3VlSUQ7CgogICAgaWYgKCAkU2VsZi0+e0RlYnVnfSApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+IF9fUEFDS0FHRV9fIC4gIjo6UnVuKCk6IFRpY2tldElEOiAkVGlja2V0e1RpY2tldElEfSBUaXRsZTogJFRpY2tldHtUaXRsZX0gIgogICAgICAgICAgICAgICAgLiAiU3RhdGU6ICRUaWNrZXR7U3RhdGV9XG4iLAogICAgICAgICk7CiAgICB9CgogICAgbXkgQEFydGljbGVJbmRleCA9ICRBcnRpY2xlT2JqZWN0LT5BcnRpY2xlTGlzdCgKICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICk7CgogICAgcmV0dXJuIDEgaWYgIUBBcnRpY2xlSW5kZXg7CgogICAgbXkgJEJhY2tlbmRPYmplY3QgPSAkQXJ0aWNsZU9iamVjdC0+QmFja2VuZEZvckFydGljbGUoICV7ICRBcnRpY2xlSW5kZXhbLTFdIH0gKTsKICAgIG15ICVBcnRpY2xlICAgICAgID0gJEJhY2tlbmRPYmplY3QtPkFydGljbGVHZXQoCiAgICAgICAgQXJ0aWNsZUlEICAgICA9PiAkQXJ0aWNsZUluZGV4Wy0xXS0+e0FydGljbGVJRH0sCiAgICAgICAgVGlja2V0SUQgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAogICAgKTsKCiAgICBpZiAoICRTZWxmLT57RGVidWd9ICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gX19QQUNLQUdFX18gLiAiOjpSdW4oKTogQXJ0aWNsZUlEOiAkQXJ0aWNsZXtBcnRpY2xlSUR9IFRpdGxlOiAkVGlja2V0e1RpdGxlfVxuIiwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxIGlmICElQXJ0aWNsZTsKCiAgICBteSAkQWxsb3dlZFN0YXRlc05hbWVzID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXRKSVJBJyktPntPVFJTVGlja2V0QWxsb3dlZFN0YXRlczRVcGRhdGV9OwogICAgbXkgQEFsbG93ZWRTdGF0ZXNMaXN0ICA9IHNwbGl0IC8sLywgJEFsbG93ZWRTdGF0ZXNOYW1lczsKCiAgICBpZiAoICEoIGZpcnN0IHsgJF8gZXEgJFRpY2tldHtTdGF0ZX0gfSBAQWxsb3dlZFN0YXRlc0xpc3QgKSApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdpbmZvJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gX19QQUNLQUdFX18gLiAiOjpSdW4oKTogT1RSUyBUaWNrZXQgbm90IGluICRBbGxvd2VkU3RhdGVzTmFtZXM6ICRUaWNrZXR7U3RhdGV9XG4iLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIG15ICRKSVJBSXNzdWUgPSAkVGlja2V0SklSQU9iamVjdC0+SXNzdWVDb21tZW50KAogICAgICAgIElzc3VlSUQgICA9PiAkSXNzdWVJRCwKICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGV7QXJ0aWNsZUlEfSwKICAgICAgICBVc2VySUQgICAgPT4gJFBhcmFte1VzZXJJRH0gLy8gMSwKICAgICAgICBDb21tZW50ICAgPT4gJEFydGljbGV7Qm9keX0sCiAgICAgICAgQXJ0aWNsZSAgID0+IFwlQXJ0aWNsZSwKICAgICk7CgogICAgIyBUT0RPOiBJZiBlcnJvciBvY2N1cmVkIHNob3cgbm90aWZpY2F0aW9uIGJhcgoKICAgIGlmICggJFNlbGYtPntEZWJ1Z30gKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICBNZXNzYWdlICA9PiBzcHJpbnRmIF9fUEFDS0FHRV9fIC4gIjogVXBkYXRlIHJlc3BvbnNlICVzXG4iLAogICAgICAgICAgICAgICAgJE1haW5PYmplY3QtPkR1bXAoICRKSVJBSXNzdWUgKSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vVGlja2V0L0V2ZW50L0Nsb3NlSklSQUlzc3VlLnBtIC0gZXZlbnQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDA4LTIwMTggY2F0d29ya3ggR21iSCBodHRwOi8vd3d3LmNhdHdvcmt4LmRlCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkV2ZW50OjpDbG9zZUpJUkFJc3N1ZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBMaXN0OjpVdGlsIHF3KGZpcnN0KTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gcXcoCiAgICBLZXJuZWw6OlN5c3RlbTo6TG9nCiAgICBLZXJuZWw6OlN5c3RlbTo6Q29uZmlnCiAgICBLZXJuZWw6OlN5c3RlbTo6SlNPTgogICAgS2VybmVsOjpTeXN0ZW06OlRpY2tldAogICAgS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZQogICAgS2VybmVsOjpTeXN0ZW06OlRpY2tldEpJUkEKKTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICAkU2VsZi0+e0RlYnVnfSAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdKSVJBOjpEZWJ1ZycpOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRUaWNrZXRPYmplY3QgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwogICAgbXkgJEFydGljbGVPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkTG9nT2JqZWN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKICAgIG15ICRUaWNrZXRKSVJBT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldEpJUkEnKTsKICAgIG15ICRVc2VyT2JqZWN0ICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KERhdGEgRXZlbnQgQ29uZmlnIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkIVxuIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgZm9yIG15ICROZWVkZWREYXRhIChxdyhUaWNrZXRJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17RGF0YX0tPnskTmVlZGVkRGF0YX0gKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkRGF0YSBpbiBEYXRhIVxuIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJFRpY2tldElEID0gJFBhcmFte0RhdGF9LT57VGlja2V0SUR9OwoKICAgIGlmICggJFNlbGYtPntEZWJ1Z30gKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICBNZXNzYWdlICA9PiBfX1BBQ0tBR0VfXyAuICI6OlJ1bigpOiBUaWNrZXRJRDogJFRpY2tldElEIEV2ZW50OiAkUGFyYW17RXZlbnR9XG4iLAogICAgICAgICk7CiAgICB9CgojICAgIHJldHVybiAxIGlmICRQYXJhbXtFdmVudH0gbmUgJ1RpY2tldFN0YXRlVXBkYXRlJzsKCiAgICBteSAlVGlja2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KAogICAgICAgIFRpY2tldElEICAgICAgPT4gJFRpY2tldElELAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiAgICApOwoKICAgIHJldHVybiAxIGlmICElVGlja2V0OwoKICAgIG15ICRVc2VySUQgPSAkUGFyYW17VXNlcklEfTsKCiAgICAjIEdldCBjdXJyZW50IHVzZXIgZGF0YQogICAgbXkgJUN1cnJlbnRVc2VyID0gJFVzZXJPYmplY3QtPkdldFVzZXJEYXRhKAogICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgKTsKCiAgICBpZiAoICRTZWxmLT57RGVidWd9ICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gX19QQUNLQUdFX18gLiAiOjpSdW4oKTogVXNlcklEOiAkVXNlcklEIFVzZXJMb2dpbjogJEN1cnJlbnRVc2Vye1VzZXJMb2dpbn1cbiIsCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRDdXJyZW50VXNlcntVc2VyTG9naW59IGVxICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0SklSQScpLT57SW5jb21pbmdVc2VyfSApIHsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCgogICAgbXkgJEpJUkFJc3N1ZUlEID0gJFRpY2tldHtEeW5hbWljRmllbGRfSklSQUlzc3VlSUR9OwogICAgcmV0dXJuIDEgaWYgISRKSVJBSXNzdWVJRDsKCiAgICBpZiAoICRTZWxmLT57RGVidWd9ICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gX19QQUNLQUdFX18gLiAiOjpSdW4oKTogVGlja2V0SUQ6ICRUaWNrZXR7VGlja2V0SUR9IFRpdGxlOiAkVGlja2V0e1RpdGxlfSAiCiAgICAgICAgICAgICAgICAuICJTdGF0ZTogJFRpY2tldHtTdGF0ZX1cbiIsCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXRKSVJBJykgfHwgIHt9OwoKICAgIG15ICRBbGxvd2VkU3RhdGVzTmFtZXMgPSAkQ29uZmlnLT57T1RSU1RpY2tldEFsbG93ZWRTdGF0ZXM0Q2xvc2V9OwogICAgbXkgQEFsbG93ZWRTdGF0ZXNMaXN0ICA9IHNwbGl0IC8sLywgJEFsbG93ZWRTdGF0ZXNOYW1lczsKCiAgICBpZiAoICEoIGZpcnN0eyAkXyBlcSAkVGlja2V0e1N0YXRlfSB9IEBBbGxvd2VkU3RhdGVzTGlzdCApICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2luZm8nLAogICAgICAgICAgICBNZXNzYWdlICA9PiBfX1BBQ0tBR0VfXyAuICI6OlJ1bigpOiBPVFJTIFRpY2tldCBub3QgaW4gJEFsbG93ZWRTdGF0ZXNOYW1lczogJFRpY2tldHtTdGF0ZX1cbiIsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgbXkgJFVSTCA9ICRDb25maWctPntVUkx9OwoKICAgIG15ICRWYWxpZExpY2Vuc2UgPSAkVGlja2V0SklSQU9iamVjdC0+Q2hlY2tWYWxpZExpY2Vuc2UoKTsKICAgIGlmICggJFZhbGlkTGljZW5zZSAhPSAxICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gX19QQUNLQUdFX18gLiAiOjpSdW4oKTogaW52YWxpZCBsaWNlbnNlIGF0ICRVUkwsIHN0YXR1cyAkVmFsaWRMaWNlbnNlIiwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gMTsgIyBza2lwIHRoZSByZXN0CiAgICB9CgogICAgbXkgJElzc3VlID0gJFRpY2tldEpJUkFPYmplY3QtPklzc3VlR2V0KCBJc3N1ZSA9PiAkSklSQUlzc3VlSUQgKTsKCiAgICBpZiAoICRJc3N1ZS0+e2Vycm9yfSApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+IF9fUEFDS0FHRV9fIC4gIjo6UnVuKCk6IGNhbm5vdCBmZXRjaCB0aGUgSmlyYSBJc3N1ZSAiCiAgICAgICAgICAgICAgICAuICRKSVJBSXNzdWVJRCAuICIgZm9yICIgLiAkVGlja2V0e1RpY2tldElEfSAuICI6ICRAIiwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICBpZiAoICRTZWxmLT57RGVidWd9ICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gX19QQUNLQUdFX18gLiAiOjpSdW4oKTogaXNzdWUgZXhpc3RzXG4iLAogICAgICAgICk7CiAgICB9CgogICAgbXkgQEFydGljbGVJbmRleCA9ICRBcnRpY2xlT2JqZWN0LT5BcnRpY2xlTGlzdCgKICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0e1RpY2tldElEfSwKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgIE9ubHlMYXN0ID0+IDEsCiAgICApOwoKICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJEFydGljbGVPYmplY3QtPkJhY2tlbmRGb3JBcnRpY2xlKCAleyAkQXJ0aWNsZUluZGV4WzBdIH0gKTsKICAgIG15ICVBcnRpY2xlICAgICAgID0gJEJhY2tlbmRPYmplY3QtPkFydGljbGVHZXQoCiAgICAgICAgVGlja2V0SUQgID0+ICRUaWNrZXR7VGlja2V0SUR9LAogICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUluZGV4WzBdLT57QXJ0aWNsZUlEfSwKICAgICk7CgogICAgbXkgJFJlc3VsdCA9ICRUaWNrZXRKSVJBT2JqZWN0LT5Jc3N1ZUNsb3NlKAogICAgICAgIElzc3VlSUQgPT4gJEpJUkFJc3N1ZUlELAogICAgICAgIENvbW1lbnQgPT4gIk9UUlM6ICRUaWNrZXR7U3RhdGV9XG5cbi0tLS0tLS0tXG4iIC4gJEFydGljbGV7Qm9keX0sCiAgICApOwoKICAgIGlmICggJFJlc3VsdC0+e2Vycm9yfSApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+IF9fUEFDS0FHRV9fIC4gIjogQ2Fubm90IGNsb3NlIGlzc3VlICRKSVJBSXNzdWVJRDogJFJlc3VsdC0+e2Vycm9yfVxuIiwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vVGlja2V0L0V2ZW50L0NyZWF0ZUpJUkFJc3N1ZS5wbSAtIGV2ZW50IG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwOC0yMDE1IGNhdHdvcmt4IEdtYkggaHR0cDovL3d3dy5jYXR3b3JreC5kZQojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpFdmVudDo6Q3JlYXRlSklSQUlzc3VlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIExpc3Q6OlV0aWwgcXcoZmlyc3QpOwoKb3VyICRWRVJTSU9OID0gJzQuMDAxJzsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gcXcoCiAgICBLZXJuZWw6OkNvbmZpZwogICAgS2VybmVsOjpTeXN0ZW06OkxvZwogICAgS2VybmVsOjpTeXN0ZW06OlRpY2tldAogICAgS2VybmVsOjpTeXN0ZW06OlRpY2tldEpJUkEKKTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICAkU2VsZi0+e0RlYnVnfSAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdKSVJBOjpEZWJ1ZycpOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRUaWNrZXRPYmplY3QgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwogICAgbXkgJENvbmZpZ09iamVjdCAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJExvZ09iamVjdCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CiAgICBteSAkVGlja2V0SklSQU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXRKSVJBJyk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhEYXRhIEV2ZW50IENvbmZpZykpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkIVxuIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgZm9yIG15ICROZWVkZWREYXRhIChxdyhUaWNrZXRJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17RGF0YX0tPnskTmVlZGVkRGF0YX0gKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkRGF0YSBpbiBEYXRhIVxuIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJFRpY2tldElEID0gJFBhcmFte0RhdGF9LT57VGlja2V0SUR9OwoKICAgIGlmICggJFNlbGYtPntEZWJ1Z30gKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICBNZXNzYWdlICA9PiBfX1BBQ0tBR0VfXyAuICI6OlJ1bigpOiBUaWNrZXRJRDogJFRpY2tldElEXG4iLAogICAgICAgICk7CgogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gX19QQUNLQUdFX18gLiAiOjpSdW4oKTogVGlja2V0SUQ6ICRUaWNrZXRJRCBFdmVudDogJFBhcmFte0V2ZW50fVxuIiwKICAgICAgICApOwogICAgfQoKIyAgICByZXR1cm4gMSBpZiAkUGFyYW17RXZlbnR9IG5lICdUaWNrZXRTdGF0ZVVwZGF0ZSc7CgogICAgbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAogICAgKTsKCiAgICByZXR1cm4gMSBpZiAhJVRpY2tldDsKCiAgICBteSAkSklSQUlzc3VlSUQgPSAkVGlja2V0e0R5bmFtaWNGaWVsZF9KSVJBSXNzdWVJRH07CiAgICByZXR1cm4gMSBpZiAkSklSQUlzc3VlSUQ7CgogICAgaWYgKCAkU2VsZi0+e0RlYnVnfSApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+IF9fUEFDS0FHRV9fIC4gIjo6UnVuKCk6IFRpY2tldElEOiAkVGlja2V0e1RpY2tldElEfSBUaXRsZTogJFRpY2tldHtUaXRsZX0gIgogICAgICAgICAgICAgICAgLiAiU3RhdGU6ICRUaWNrZXR7U3RhdGV9XG4iLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJEFsbG93ZWRTdGF0ZXNOYW1lcyA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0SklSQScpLT57T1RSU1RpY2tldFN0YXRlc0VuZm9yY2luZ0NyZWF0ZX07CiAgICBteSBAQWxsb3dlZFN0YXRlc0xpc3QgID0gc3BsaXQgLywvLCAkQWxsb3dlZFN0YXRlc05hbWVzOwoKICAgIGlmICggISBmaXJzdHsgJF8gZXEgJFRpY2tldHtTdGF0ZX0gfSBAQWxsb3dlZFN0YXRlc0xpc3QgKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnaW5mbycsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+IF9fUEFDS0FHRV9fIC4gIjo6UnVuKCk6IE9UUlMgVGlja2V0IG5vdCBpbiAkQWxsb3dlZFN0YXRlc05hbWVzOiAkVGlja2V0e1N0YXRlfVxuIiwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICBteSAkSklSQUlzc3VlID0gJFRpY2tldEpJUkFPYmplY3QtPklzc3VlQ3JlYXRlKAogICAgICAgIFRpY2tldElEID0+ICRUaWNrZXR7VGlja2V0SUR9LAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOyAjIEZJWE1FOiBVc2VySUQgPwoKICAgIGlmICggJFNlbGYtPntEZWJ1Z30gKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiBfX1BBQ0tBR0VfXyAuICI6IFVwZGF0ZSByZXNwb25zZSAkSklSQUlzc3VlXG4iLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwOC0yMDE4IGNhdHdvcmt4IEdtYkggaHR0cDovL3d3dy5jYXR3b3JreC5kZQojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpFdmVudDo6U2VuZEF0dGFjaG1lbnRzVG9KSVJBSXNzdWU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9IHF3KAogICAgS2VybmVsOjpDb25maWcKICAgIEtlcm5lbDo6U3lzdGVtOjpMb2cKICAgIEtlcm5lbDo6U3lzdGVtOjpNYWluCiAgICBLZXJuZWw6OlN5c3RlbTo6VGlja2V0CiAgICBLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlCiAgICBLZXJuZWw6OlN5c3RlbTo6VXNlcgogICAgS2VybmVsOjpTeXN0ZW06OlRpY2tldEpJUkEKKTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICAkU2VsZi0+e0RlYnVnfSAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdKSVJBOjpEZWJ1ZycpOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRUaWNrZXRPYmplY3QgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwogICAgbXkgJEFydGljbGVPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkTWFpbk9iamVjdCAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyk7CiAgICBteSAkVXNlck9iamVjdCAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CiAgICBteSAkTG9nT2JqZWN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKICAgIG15ICRUaWNrZXRKSVJBT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldEpJUkEnKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KERhdGEgRXZlbnQgQ29uZmlnIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkIVxuIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgZm9yIG15ICROZWVkZWREYXRhIChxdyhUaWNrZXRJRCBBcnRpY2xlSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFte0RhdGF9LT57JE5lZWRlZERhdGF9ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZERhdGEgaW4gRGF0YSFcbiIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRVc2VySUQgPSAkUGFyYW17VXNlcklEfTsKCiAgICAjIEdldCBjdXJyZW50IHVzZXIgZGF0YQogICAgbXkgJFRpY2tldElEID0gJFBhcmFte0RhdGF9LT57VGlja2V0SUR9OwoKICAgIGlmICggJFNlbGYtPntEZWJ1Z30gKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICBNZXNzYWdlICA9PiBzcHJpbnRmIF9fUEFDS0FHRV9fIC4gIjo6UnVuKCk6IFRpY2tldElEOiAlcyBBcnRpY2xlSUQ6ICVzIEZpbGVuYW1lOiAlc1xuIiwKICAgICAgICAgICAgICAgICRUaWNrZXRJRCwgJFBhcmFte0RhdGF9LT57QXJ0aWNsZUlEfSwgJFBhcmFte0RhdGF9LT57RmlsZW5hbWV9CiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkQmFja2VuZE9iamVjdCA9ICRBcnRpY2xlT2JqZWN0LT5CYWNrZW5kRm9yQXJ0aWNsZSgKICAgICAgICBBcnRpY2xlSUQgPT4gJFBhcmFte0RhdGF9LT57QXJ0aWNsZUlEfSwKICAgICAgICBUaWNrZXRJRCAgPT4gJFBhcmFte0RhdGF9LT57VGlja2V0SUR9LAogICAgKTsKCiAgICBteSAlQXJ0aWNsZSA9ICRCYWNrZW5kT2JqZWN0LT5BcnRpY2xlR2V0KAogICAgICAgIEFydGljbGVJRCAgICAgPT4gJFBhcmFte0RhdGF9LT57QXJ0aWNsZUlEfSwKICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRQYXJhbXtEYXRhfS0+e1RpY2tldElEfSwKICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAogICAgKTsKCiAgICBteSAlVGlja2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KAogICAgICAgIFRpY2tldElEICAgICAgPT4gJFBhcmFte0RhdGF9LT57VGlja2V0SUR9LAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiAgICApOwoKICAgIHJldHVybiAxIGlmICElQXJ0aWNsZTsKICAgIHJldHVybiAxIGlmICEkQXJ0aWNsZXtEeW5hbWljRmllbGRfQXJ0aWNsZVNlbnRUb0pJUkF9OwoKICAgIG15ICRJc3N1ZUlEID0gJFRpY2tldHtEeW5hbWljRmllbGRfSklSQUlzc3VlSUR9OwogICAgcmV0dXJuIDEgaWYgISRJc3N1ZUlEOwoKICAgICRUaWNrZXRKSVJBT2JqZWN0LT5BdHRhY2htZW50c1NlbmQoCiAgICAgICAgSXNzdWUgICAgID0+ICRJc3N1ZUlELAogICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZXtBcnRpY2xlSUR9LAogICAgICAgIFVzZXJJRCAgICA9PiAkUGFyYW17VXNlcklEfSAvLyAxLAogICAgICAgIEZpbGVJRCAgICA9PiAkUGFyYW17RGF0YX0tPntGaWxlSUR9LAogICAgICAgIEZpbGVuYW1lICA9PiAkUGFyYW17RGF0YX0tPntGaWxlbmFtZX0sCiAgICApOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwOC0yMDE4IGNhdHdvcmt4IEdtYkggaHR0cDovL3d3dy5jYXR3b3JreC5kZQojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpFdmVudDo6VXBkYXRlSklSQUlzc3VlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIExpc3Q6OlV0aWwgcXcoZmlyc3QpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSBxdygKICAgIEtlcm5lbDo6Q29uZmlnCiAgICBLZXJuZWw6OlN5c3RlbTo6TG9nCiAgICBLZXJuZWw6OlN5c3RlbTo6VGlja2V0CiAgICBLZXJuZWw6OlN5c3RlbTo6VXNlcgogICAgS2VybmVsOjpTeXN0ZW06OlRpY2tldEpJUkEKKTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICAkU2VsZi0+e0RlYnVnfSAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdKSVJBOjpEZWJ1ZycpOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRUaWNrZXRPYmplY3QgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwogICAgbXkgJENvbmZpZ09iamVjdCAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJFVzZXJPYmplY3QgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpOwogICAgbXkgJExvZ09iamVjdCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CiAgICBteSAkVGlja2V0SklSQU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXRKSVJBJyk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhEYXRhIEV2ZW50IENvbmZpZyBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCFcbiIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGZvciBteSAkTmVlZGVkRGF0YSAocXcoVGlja2V0SUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFte0RhdGF9LT57JE5lZWRlZERhdGF9ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZERhdGEgaW4gRGF0YSFcbiIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRVc2VySUQgPSAkUGFyYW17VXNlcklEfTsKCiAgICAjIEdldCBjdXJyZW50IHVzZXIgZGF0YQogICAgbXkgJUN1cnJlbnRVc2VyID0gJFVzZXJPYmplY3QtPkdldFVzZXJEYXRhKAogICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgKTsKCiAgICBpZiAoICRTZWxmLT57RGVidWd9ICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gX19QQUNLQUdFX18gLiAiOjpSdW4oKTogVXNlcklEOiAkVXNlcklEIFVzZXJMb2dpbjogJEN1cnJlbnRVc2Vye1VzZXJMb2dpbn1cbiIsCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRDdXJyZW50VXNlcntVc2VyTG9naW59IGVxICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0SklSQScpLT57SW5jb21pbmdVc2VyfSApIHsKICAgIAlyZXR1cm4gMTsKICAgIH0KCiAgICBteSAkVGlja2V0SUQgPSAkUGFyYW17RGF0YX0tPntUaWNrZXRJRH07CgogICAgaWYgKCAkU2VsZi0+e0RlYnVnfSApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+IF9fUEFDS0FHRV9fIC4gIjo6UnVuKCk6IFRpY2tldElEOiAkVGlja2V0SUQgRXZlbnQ6ICRQYXJhbXtFdmVudH1cbiIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIyBjYW5ub3QgdG8gKnRoYXQqIGVhc2lseSwgbWF5YmUgd2UnbGwgY2hlY2sgdGhlIFhNTC1Qcm9wcyBsYXRlciBvbiAjI3JldHVybiAxIGlmICRQYXJhbXtFdmVudH0gbmUgJ1RpY2tldFN0YXRlVXBkYXRlJzsKCiAgICBteSAlVGlja2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KAogICAgICAgIFRpY2tldElEICAgICAgPT4gJFRpY2tldElELAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiAgICApOwoKICAgIHJldHVybiAxIGlmICElVGlja2V0OwoKICAgIG15ICRKSVJBSXNzdWVJRCA9ICRUaWNrZXR7RHluYW1pY0ZpZWxkX0pJUkFJc3N1ZUlEfTsKICAgIHJldHVybiAxIGlmICEkSklSQUlzc3VlSUQ7CgogICAgaWYgKCAkU2VsZi0+e0RlYnVnfSApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+IF9fUEFDS0FHRV9fIC4gIjo6UnVuKCk6IFRpY2tldElEOiAkVGlja2V0e1RpY2tldElEfSBUaXRsZTogJFRpY2tldHtUaXRsZX0gIgogICAgICAgICAgICAgICAgLiAiU3RhdGU6ICRUaWNrZXR7U3RhdGV9XG4iLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJEFsbG93ZWRTdGF0ZXNOYW1lcyA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0SklSQScpLT57T1RSU1RpY2tldEFsbG93ZWRTdGF0ZXM0VXBkYXRlfTsKICAgIG15IEBBbGxvd2VkU3RhdGVzTGlzdCAgPSBzcGxpdCAvLC8sICRBbGxvd2VkU3RhdGVzTmFtZXM7CgogICAgaWYgKCAhKCBmaXJzdHsgJF8gZXEgJFRpY2tldHtTdGF0ZX0gfSBAQWxsb3dlZFN0YXRlc0xpc3QgKSApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdpbmZvJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gX19QQUNLQUdFX18gLiAiOjpSdW4oKTogT1RSUyBUaWNrZXQgbm90IGluICRBbGxvd2VkU3RhdGVzTmFtZXM6ICRUaWNrZXR7U3RhdGV9XG4iLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIG15ICRKSVJBSXNzdWUgPSAkVGlja2V0SklSQU9iamVjdC0+SXNzdWVVcGRhdGUoCiAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldHtUaWNrZXRJRH0sCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICk7ICMgRklYTUU6IFVzZXJJRCA/CgogICAgaWYgKCAkU2VsZi0+e0RlYnVnfSApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+IF9fUEFDS0FHRV9fIC4gIjogVXBkYXRlIHJlc3BvbnNlICRKSVJBSXNzdWVcbiIsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAgLS0KIyAgQ29weXJpZ2h0IChDKSAyMDA4LTIwMTggY2F0d29ya3ggR21iSCBodHRwOi8vd3d3LmNhdHdvcmt4LmRlCiMgIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6VGlja2V0SklSQTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBSRVNUOjpDbGllbnQ7CnVzZSBKSVJBOjpSRVNUOwp1c2UgVGltZTo6UGllY2U7CnVzZSBTY2FsYXI6OlV0aWwgcXcobG9va3NfbGlrZV9udW1iZXIpOwp1c2UgTGlzdDo6VXRpbCBxdyhmaXJzdCk7Cgp1c2UgY29uc3RhbnQgUCA9PiBfX1BBQ0tBR0VfXzsKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSBxdygKICAgIEtlcm5lbDo6Q29uZmlnCiAgICBLZXJuZWw6OlN5c3RlbTo6TG9nCiAgICBLZXJuZWw6OlN5c3RlbTo6TWFpbgogICAgS2VybmVsOjpTeXN0ZW06OlRpY2tldAogICAgS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZQogICAgS2VybmVsOjpTeXN0ZW06OlVzZXIKICAgIEtlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQKICAgIEtlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQKICAgIEtlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGRWYWx1ZQogICAgS2VybmVsOjpTeXN0ZW06OkpTT04KICAgIEtlcm5lbDo6U3lzdGVtOjpDYWNoZQogICAgS2VybmVsOjpTeXN0ZW06OkpJUkE6OlF1ZXVlU2V0dGluZ3MKKTsKCgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIG15ICRDb25maWdPYmplY3QgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJER5bmFtaWNGaWVsZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKTsKCiAgICAkU2VsZi0+e0RlYnVnfSAgICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdKSVJBOjpEZWJ1ZycpOwogICAgJFNlbGYtPntDb25maWd9ICAgICA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0SklSQScpIHx8IHt9OwoKICAgIG15ICRIb3N0ID0gJFNlbGYtPntDb25maWd9LT57VVJMfSAuICRTZWxmLT57Q29uZmlnfS0+e1BhdGh9OwogICAgJEhvc3QgPX4gc3svXHp9e314bXNnOwoKICAgICRTZWxmLT57SG9zdH0gPSAkSG9zdDsKCiAgICAkU2VsZi0+e0pJUkFDbGllbnR9ID0gSklSQTo6UkVTVC0+bmV3KAogICAgICAgICRIb3N0LAogICAgICAgICRTZWxmLT57Q29uZmlnfS0+e1VzZXJ9LAogICAgICAgICRTZWxmLT57Q29uZmlnfS0+e1Bhc3N3b3JkfSwKICAgICk7CgogICAgbXkgJFZlcmlmeVNTTCA9ICRDb25maWdPYmplY3QtPkdldCgnSklSQTo6U1NMVmVyaWZ5Jyk7CiAgICBpZiAoICEkVmVyaWZ5U1NMICkgewogICAgICAgIG15ICRMb2FkZWQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKAogICAgICAgICAgICAnTmV0OjpTU0xlYXknLAogICAgICAgICAgICBTaWxlbnQgPT4gMSwKICAgICAgICApOwogICAgICAgIGlmICgkTG9hZGVkKSB7CiAgICAgICAgICAgICRTZWxmLT57SklSQUNsaWVudH0tPntyZXN0fS0+Z2V0VXNlcmFnZW50KCktPnNzbF9vcHRzKCB2ZXJpZnlfaG9zdG5hbWUgPT4gMCApOwogICAgICAgICAgICAkU2VsZi0+e0pJUkFDbGllbnR9LT57cmVzdH0tPmdldFVzZXJhZ2VudCgpLT5zc2xfb3B0cyggU1NMX3ZlcmZpeV9tb2RlID0+IE5ldDo6U1NMZWF5OjpWRVJJRllfTk9ORSgpICk7CiAgICAgICAgfQogICAgfQoKICAgICRTZWxmLT57SklSQUR5bmFtaWNGaWVsZH0gPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRHZXQoIE5hbWUgPT4gJ0pJUkFJc3N1ZUlEJyApOwoKICAgICRTZWxmLT57Q2FjaGVUeXBlfSA9ICdKSVJBQVBJJzsKICAgICRTZWxmLT57Q2FjaGVUVEx9ICA9ICRDb25maWdPYmplY3QtPkdldCgnSklSQTo6Q2FjaGVUVEwnKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIElzc3VlQ2xvc2UoKQoKQ2xvc2UgYW4gaXNzdWUgaW4gSmlyYQoKPWN1dAoKc3ViIElzc3VlQ2xvc2UgewogICAgbXkgKCRTZWxmLCAlUGFyYW0pID0gQF87CgogICAgbXkgJExvZ09iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CiAgICBteSAkTWFpbk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyk7CgogICAgIyBjaGVjayBmb3IgbmVlZGVkIGRhdGEKICAgIGZvciBteSAkTmVlZGVkICggcXcvSXNzdWVJRC8gKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkQ2xvc2VUcmFuc2l0aW9uID0gJFNlbGYtPntDb25maWd9LT57V29ya2Zsb3dDbG9zZUFjdGlvbk5hbWV9IC8vICdEb25lJzsKCiAgICBteSAkVHJhbnNpdGlvbnM7CiAgICBteSAkRXJyb3JUcmFuc2l0aW9uczsKCiAgICBldmFsewogICAgICAgICRUcmFuc2l0aW9ucyA9ICRTZWxmLT57SklSQUNsaWVudH0tPkdFVCgKICAgICAgICAgICAgJy9pc3N1ZS8nIC4gJFBhcmFte0lzc3VlSUR9IC4gJy90cmFuc2l0aW9ucycsCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGV4cGFuZCA9PiAndHJhbnNpdGlvbi5maWVsZHMnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgIDE7CiAgICB9IG9yICRFcnJvclRyYW5zaXRpb25zID0gJEA7CgogICAgaWYgKCAkRXJyb3JUcmFuc2l0aW9ucyApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+IHNwcmludGYgUCAuICAiOjpJc3N1ZUNsb3NlOiBjYW5ub3QgZ2V0IHRyYW5zaXRpb25zIHRoZSBKaXJhIElzc3VlIGZvciAlczogJXMiLAogICAgICAgICAgICAgICAgJFBhcmFte0lzc3VlSUR9LCAkRXJyb3JUcmFuc2l0aW9ucywKICAgICAgICApOwoKICAgICAgICByZXR1cm4gK3sgZXJyb3IgPT4gJEVycm9yVHJhbnNpdGlvbnMgfTsKICAgIH0KCiAgICBteSAoJFRyYW5zaXRpb24pID0gZ3JlcHsgJF8tPntuYW1lfSBlcSAkQ2xvc2VUcmFuc2l0aW9uIH1AeyAkVHJhbnNpdGlvbnMtPnt0cmFuc2l0aW9uc30gfHwgW10gfTsKCiAgICBpZiAoICEkVHJhbnNpdGlvbiApIHsKICAgICAgICByZXR1cm4gK3sgZXJyb3IgPT4gJ05vIHRyYW5zaXRpb24gZm91bmQgZm9yICcgLiAkQ2xvc2VUcmFuc2l0aW9uIH07CiAgICB9CgogICAgbXkgJEVycm9yQ2xvc2U7CgogICAgbXkgJU9wdHMgPSAoCiAgICAgICAgdHJhbnNpdGlvbiA9PiB7CiAgICAgICAgICAgIGlkID0+ICRUcmFuc2l0aW9uLT57aWR9LAogICAgICAgIH0KICAgICk7CgogICAgaWYgKCAkUGFyYW17Q29tbWVudH0gKSB7CiAgICAgICAgJE9wdHN7dXBkYXRlfSA9IHsKICAgICAgICAgICAgY29tbWVudCA9PiBbCiAgICAgICAgICAgICAgICB7IGFkZCA9PiB7IGJvZHkgPT4gJFBhcmFte0NvbW1lbnR9IH0gfSwKICAgICAgICAgICAgXSwKICAgICAgICB9OwogICAgfQoKICAgIGV2YWx7CiAgICAgICAgJFNlbGYtPntKSVJBQ2xpZW50fS0+UE9TVCgKICAgICAgICAgICAgJy9pc3N1ZS8nIC4gJFBhcmFte0lzc3VlSUR9IC4gJy90cmFuc2l0aW9ucycsCiAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICBcJU9wdHMsCiAgICAgICAgKTsKCiAgICAgICAgMTsKICAgIH0gb3IgJEVycm9yQ2xvc2UgPSAkQDsKCiAgICBpZiAoICRFcnJvckNsb3NlICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gc3ByaW50ZiBQIC4gICI6Oklzc3VlQ2xvc2U6IGNhbm5vdCBjbG9zZSBpc3N1ZSAlczogJXMgZm9yICVzIiwKICAgICAgICAgICAgICAgICRQYXJhbXtJc3N1ZUlEfSwgJEVycm9yVHJhbnNpdGlvbnMsCiAgICAgICAgICAgICAgICAkTWFpbk9iamVjdC0+RHVtcChcJU9wdHMpLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAreyBlcnJvciA9PiAkRXJyb3JDbG9zZSB9OwogICAgfQoKICAgIHJldHVybiAre307Cn0KCj1pdGVtIElzc3VlR2V0KCkKCkdldCBhbiBpc3N1ZSBmcm9tIEppcmEKCiAgICBteSAkSXNzdWVEYXRhID0gJE9iamVjdC0+SXNzdWVHZXQoCiAgICAgICAgSXNzdWUgPT4gJElzc3VlS2V5LAogICAgKTsKCj1jdXQKCnN1YiBJc3N1ZUdldCB7CiAgICBteSAoJFNlbGYsICVQYXJhbSkgPSBAXzsKCiAgICBteSAkTG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwoKICAgICMgY2hlY2sgZm9yIG5lZWRlZCBkYXRhCiAgICBmb3IgbXkgJE5lZWRlZCAoIHF3L0lzc3VlLyApIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRJc3N1ZTsKICAgIG15ICRFcnJvckdldDsKCiAgICBldmFsewogICAgICAgICRJc3N1ZSA9ICRTZWxmLT57SklSQUNsaWVudH0tPkdFVCggJy9pc3N1ZS8nIC4gJFBhcmFte0lzc3VlfSApOwogICAgfSBvciAkRXJyb3JHZXQgPSAkQDsKCiAgICBpZiAoICRFcnJvckdldCApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+IHNwcmludGYgUCAuICAiOjpJc3N1ZUNsb3NlOiBjYW5ub3QgY2xvc2UgaXNzdWUgJXM6ICVzIiwKICAgICAgICAgICAgICAgICRQYXJhbXtJc3N1ZUlEfSwgJEVycm9yR2V0LAogICAgICAgICk7CgogICAgICAgIHJldHVybiAreyBlcnJvciA9PiAkRXJyb3JHZXQgfTsKICAgIH0KCiAgICByZXR1cm4gJElzc3VlOwp9Cgo9aXRlbSBJc3N1ZUNyZWF0ZSgpCgpjcmVhdGVzIGFuIGlzc3VlIGluIHRoZSBjb25maWd1cmVkIEppcmEgc3lzdGVtIHVzaW5nIFJFU1QKCiAgICBteSAkSXNzdWUgPSAkVGlja2V0SklSQU9iamVjdC0+SXNzdWVDcmVhdGUoCiAgICAgICAgVGlja2V0SUQgICAgICAgPT4gJFRpY2tldElELCAgICAgICAgICAgICAgICAgICMgdGhlIFRpY2tldElELCBtYW5kYXRvcnkKICAgICAgICBBcnRpY2xlSUQgICAgICA9PiAkQXJ0aWNsZUlELCAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCwgdG8gZGVmaW5lIHdoaWNoIGFydGljbGUgaXMgc2VudCB0byBKaXJhCiAgICAgICAgVXNlcklEICAgICAgICAgPT4gJFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICMgdGhlIFVzZXJJRCwgbWFuZGF0b3J5CiAgICApOwoKcmV0dXJuczoKCiAgICAkSXNzdWUgPSB7CiAgICAgICAgaWQgPT4gMTAwMDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaXNzdWUgaWQgaW4gSmlyYSwgc3RhcnRzIGZyb20gMTAwMDAKICAgICAgICBrZXkgPT4gUFJPSi0xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpc3N1ZSBrZXkgYXMgdXNlZCBpbiB0aGUgd2ViaW50ZXJmYWNlLCA8UHJvaj4tPE51bWJlcj4sIHN0YXJ0cyBmcm9tIDEKICAgICAgICBbLi4uXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwbGVudHkgb2Ygb3RoZXIgZmllbGRzIGFzIGRlZmluZWQgaW4gdGhlIEFQSQogICAgfQoKPWN1dAoKc3ViIElzc3VlQ3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExvZ09iamVjdCAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwogICAgbXkgJE1haW5PYmplY3QgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKTsKICAgIG15ICRDb25maWdPYmplY3QgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkVGlja2V0T2JqZWN0ICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CiAgICBteSAkREZWYWx1ZU9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkVmFsdWUnKTsKICAgIG15ICRCYWNrZW5kT2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKICAgIG15ICRTZXR0aW5nc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpKSVJBOjpRdWV1ZVNldHRpbmdzJyk7CiAgICBteSAkQXJ0aWNsZU9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJyk7CgoKICAgICMgY2hlY2sgZm9yIG5lZWRlZCBkYXRhCiAgICBmb3IgbXkgJE5lZWRlZCAoIHF3L1RpY2tldElEIFVzZXJJRC8gKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAlQXJ0aWNsZTsKCiAgICBpZiAoICRQYXJhbXtBcnRpY2xlSUR9ICkgewogICAgICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJEFydGljbGVPYmplY3QtPkJhY2tlbmRGb3JBcnRpY2xlKAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgIEFydGljbGVJRCAgICAgPT4gJFBhcmFte0FydGljbGVJRH0sCiAgICAgICAgKTsKCiAgICAgICAgJUFydGljbGUgPSAkQmFja2VuZE9iamVjdC0+QXJ0aWNsZUdldCgKICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICBBcnRpY2xlSUQgICAgID0+ICRQYXJhbXtBcnRpY2xlSUR9LAogICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIG15ICgkRmlyc3RBcnRpY2xlKSA9ICRBcnRpY2xlT2JqZWN0LT5BcnRpY2xlTGlzdCgKICAgICAgICAgICAgVGlja2V0SUQgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgIE9ubHlGaXJzdCA9PiAxLAogICAgICAgICk7CgogICAgICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJEFydGljbGVPYmplY3QtPkJhY2tlbmRGb3JBcnRpY2xlKCAleyRGaXJzdEFydGljbGV9ICk7CgogICAgICAgICVBcnRpY2xlID0gJEJhY2tlbmRPYmplY3QtPkFydGljbGVHZXQoCiAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgQXJ0aWNsZUlEICAgICA9PiAkRmlyc3RBcnRpY2xlLT57QXJ0aWNsZUlEfSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAogICAgKTsKCiAgICBpZiAoICRTZWxmLT57RGVidWd9ICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2luZm8nLAogICAgICAgICAgICBNZXNzYWdlICA9PiBzcHJpbnRmIFAgLiAiOjpJc3N1ZUNyZWF0ZTogVGlja2V0SUQ6ICVzID09ICVzIFRpdGxlOiAlcyBUZXh0OiAlcyIsCiAgICAgICAgICAgICAgICAkUGFyYW17VGlja2V0SUR9LCAkQXJ0aWNsZXtUaWNrZXRJRH0sICRUaWNrZXR7VGl0bGV9LCAkQXJ0aWNsZXtCb2R5fSwKICAgICAgICApOwogICAgfQoKICAgIG15ICRWYWxpZExpY2Vuc2UgPSAkU2VsZi0+Q2hlY2tWYWxpZExpY2Vuc2UoKTsKICAgIGlmICggJFZhbGlkTGljZW5zZSAhPSAxICkgewogICAgICAgIG15ICRVUkwgPSAkU2VsZi0+e0NvbmZpZ30tPntVUkx9OwogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gUCAuICI6Oklzc3VlQ3JlYXRlOiBpbnZhbGlkIGxpY2Vuc2UgYXQgJFVSTCwgc3RhdHVzICRWYWxpZExpY2Vuc2UiLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAreyBlcnJvciA9PiAnTm8gdmFsaWQgbGljZW5zZScgfTsgIyBza2lwIHRoZSByZXN0CiAgICB9CgogICAgbXkgJVNldHRpbmdzOwogICAgaWYgKCAkUGFyYW17UXVldWVJRH0gKSB7CiAgICAgICAgJVNldHRpbmdzID0gJFNldHRpbmdzT2JqZWN0LT5WYWxpZFNldHRpbmdzR2V0KCBRdWV1ZUlEID0+ICRQYXJhbXtRdWV1ZUlEfSApOwogICAgfQoKICAgIG15ICRSZXBvcnRlciA9ICRTZWxmLT57Q29uZmlnfS0+e1JlcG9ydGVyfTsKICAgIG15ICRBc3NpZ25lZSA9ICRTZXR0aW5nc3tBc3NpZ25lZX0gfHwgJFBhcmFte0Fzc2lnbmVlfSB8fCAkU2VsZi0+e0NvbmZpZ30tPntBc3NpZ25lZX07CgogICAgIyByZWFkICdQcm9qZWN0JyBmZWxkIGZyb20gICJTeXNDb25maWciIGluIE9UUlMKICAgIG15ICRQcm9qZWN0ID0gJFNldHRpbmdze1Byb2plY3RJRH0gfHwgJFBhcmFte1Byb2plY3R9IHx8ICRTZWxmLT57Q29uZmlnfS0+e1Byb2plY3R9OwoKICAgICMgcmVhZCAnSXNzdWVUeXBlJyBmZWxkIGZyb20gICJTeXNDb25maWciIGluIE9UUlMKICAgIG15ICRJc3N1ZVR5cGUgICA9ICRQYXJhbXtJc3N1ZVR5cGV9IHx8ICRTZWxmLT57Q29uZmlnfS0+e0lzc3VlVHlwZX07CiAgICBteSAkRmllbGROYW1lICAgPSAnSklSQUlzc3VlSUQnOwogICAgbXkgJEpJUkFJc3N1ZUlEID0gJEFydGljbGV7IkR5bmFtaWNGaWVsZF8iIC4gJEZpZWxkTmFtZX07CgogICAgaWYgKCAkU2VsZi0+e0RlYnVnfSApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdpbmZvJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gc3ByaW50ZiBQIC4gIjo6SXNzdWVDcmVhdGU6IEpJUkFJc3N1ZUlEKHByZSk6ICclcycgRHluYW1pY0ZpZWxkSUQ6ICVzICIsCiAgICAgICAgICAgICAgICAoICRKSVJBSXNzdWVJRCB8fCAnJyApLCAkRmllbGROYW1lLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJElzc3VlID0ge307CiAgICBteSAkVXNlZEFydGljbGVJRDsKCiAgICBpZiAoJEpJUkFJc3N1ZUlEKSB7CgogICAgICAgICRJc3N1ZSA9ICRTZWxmLT5Jc3N1ZUdldCgKICAgICAgICAgICAgSXNzdWUgPT4gJEpJUkFJc3N1ZUlELAogICAgICAgICk7CgogICAgICAgIGlmICggISRJc3N1ZSAmJiAkU2VsZi0+e0RlYnVnfSApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICBzcHJpbnRmIFAgLiAiOjpJc3N1ZUNyZWF0ZTogY2Fubm90IGZldGNoIHRoZSBKaXJhIElzc3VlICVzIGZvciAlcyIsCiAgICAgICAgICAgICAgICAgICAgJEpJUkFJc3N1ZUlELCAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuICt7IGVycm9yID0+ICdDYW5ub3QgZmV0Y2ggSXNzdWUnIH07CiAgICAgICAgfQoKICAgIH0KICAgIGVsc2UgewogICAgICAgIG15ICRDdXN0b21GaWVsZCA9ICdjdXN0b21maWVsZF8nIC4gKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0pJUkE6Ok9UUlNUaWNrZXRJREZpZWxkJykgfHwgMTAwMDAgKTsKICAgICAgICBteSAkSklSQUNyZWF0ZVBhcmFtcyA9IHsKICAgICAgICAgICAgcHJvamVjdCAgICAgICA9PiB7IGtleSA9PiAkUHJvamVjdCB9LAogICAgICAgICAgICBpc3N1ZXR5cGUgICAgID0+IHsgbmFtZSA9PiAkSXNzdWVUeXBlIH0sCiAgICAgICAgICAgIHN1bW1hcnkgICAgICAgPT4gJFRpY2tldHtUaXRsZX0sCiAgICAgICAgICAgIGRlc2NyaXB0aW9uICAgPT4gJEFydGljbGV7Qm9keX0sCiAgICAgICAgICAgIHJlcG9ydGVyICAgICAgPT4geyBuYW1lID0+ICRSZXBvcnRlciB9LAogICAgICAgICAgICBhc3NpZ25lZSAgICAgID0+IHsgbmFtZSA9PiAkQXNzaWduZWUgfSwKICAgICAgICAgICAgJEN1c3RvbUZpZWxkICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgIH07CgogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdKSVJBOjpOb0Fzc2lnbmVlJykgKSB7CiAgICAgICAgICAgIGRlbGV0ZSAkSklSQUNyZWF0ZVBhcmFtcy0+e2Fzc2lnbmVlfTsKICAgICAgICB9CgogICAgICAgIGlmICggISRDb25maWdPYmplY3QtPkdldCgnSklSQTo6U2VuZFJlcG9ydGVyJykgKSB7CiAgICAgICAgICAgIGRlbGV0ZSAkSklSQUNyZWF0ZVBhcmFtcy0+e3JlcG9ydGVyfTsKICAgICAgICB9CgogICAgICAgICRKSVJBQ3JlYXRlUGFyYW1zID0gJFNlbGYtPk1hcEZpZWxkcyggJEpJUkFDcmVhdGVQYXJhbXMsICVUaWNrZXQsICVBcnRpY2xlKTsKCiAgICAgICAgIyBjbGVhbiB1cCBzdW1tYXJ5IC0gYWxsIHZlcnRpY2FsIHNwYWNlcyBhcmUgcmVtb3ZlZAogICAgICAgICMgSmlyYSByZXBvcnRzIGFuIGVycm9yIHdoZW4gdGhlIHN1bW1hcnkgY29udGFpbnMgIm5ld2xpbmUgY2hhcmFjdGVycyIKICAgICAgICAkSklSQUNyZWF0ZVBhcmFtcy0+e3N1bW1hcnl9ID1+IHN7XHZ9eyB9ZzsKCiAgICAgICAgaWYgKCAkU2VsZi0+e0RlYnVnfSApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiBzcHJpbnRmIFAgLiAgIjo6SXNzdWVDcmVhdGU6IFBhcmFtZXRlcnM6ICVzIiwKICAgICAgICAgICAgICAgICAgICAkTWFpbk9iamVjdC0+RHVtcCgkSklSQUNyZWF0ZVBhcmFtcyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkRXJyb3JDcmVhdGU7CiAgICAgICAgZXZhbCB7CiAgICAgICAgICAgICRJc3N1ZSA9ICRTZWxmLT57SklSQUNsaWVudH0tPlBPU1QoCiAgICAgICAgICAgICAgICAnL2lzc3VlJywKICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgK3sgZmllbGRzID0+ICRKSVJBQ3JlYXRlUGFyYW1zIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAxOwogICAgICAgIH0gb3IgJEVycm9yQ3JlYXRlID0gJEA7CiAKICAgICAgICBpZiAoICRFcnJvckNyZWF0ZSApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+IHNwcmludGYgUCAuICAiOjpJc3N1ZUNyZWF0ZTogY2Fubm90IGNyZWF0ZSB0aGUgSmlyYSBJc3N1ZSBmb3IgJXM6ICVzIiwKICAgICAgICAgICAgICAgICAgICAkUGFyYW17VGlja2V0SUR9LCAkRXJyb3JDcmVhdGUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm4gK3sgZXJyb3IgPT4gJEVycm9yQ3JlYXRlIH07CiAgICAgICAgfQoKICAgICAgICAkVXNlZEFydGljbGVJRCA9ICRBcnRpY2xle0FydGljbGVJRH07CgogICAgICAgICRTZWxmLT5BdHRhY2htZW50c1NlbmQoCiAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZXtBcnRpY2xlSUR9LAogICAgICAgICAgICBJc3N1ZSAgICAgPT4gJElzc3VlLT57a2V5fSwKICAgICAgICAgICAgVXNlcklEICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIG15ICRTdWNjZXNzID0gJEJhY2tlbmRPYmplY3QtPlZhbHVlU2V0KAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJFNlbGYtPntKSVJBRHluYW1pY0ZpZWxkfSwKICAgICAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRBcnRpY2xle1RpY2tldElEfSwKICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRJc3N1ZS0+e2tleX0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICRTZWxmLT57RGVidWd9ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnaW5mbycsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiBzcHJpbnRmIFAgLiAiOjpJc3N1ZUNyZWF0ZTogSklSQUlzc3VlSUQocG9zdCk6ICVzIER5bmFtaWNGaWVsZElEOiAlcyIsCiAgICAgICAgICAgICAgICAgICAgJElzc3VlLT57a2V5fSwgJEZpZWxkTmFtZSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdpbmZvJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+IHNwcmludGYgUCAuICI6Oklzc3VlQ3JlYXRlOiBTdWNjZXNzOiAlcyIsICRTdWNjZXNzLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJFRpY2tldE51bWJlciA9ICRUaWNrZXRPYmplY3QtPlRpY2tldE51bWJlckxvb2t1cCgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJEFydGljbGV7VGlja2V0SUR9LAogICAgICAgICk7CgogICAgICAgIG15ICREYXRhICAgPSB7CiAgICAgICAgICAgIG9iamVjdCA9PiB7CiAgICAgICAgICAgICAgICB1cmwgICA9PiBzcHJpbnRmKAogICAgICAgICAgICAgICAgICAgICIlczovLyVzLyVzaW5kZXgucGw/QWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD0lcyIsCiAgICAgICAgICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdIdHRwVHlwZScpLAogICAgICAgICAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgnRlFETicpLAogICAgICAgICAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgnU2NyaXB0QWxpYXMnKSwKICAgICAgICAgICAgICAgICAgICAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIHRpdGxlID0+IHNwcmludGYoICJPVFJTIFRpY2tldCMlcyAoJXMpIiwgJFRpY2tldE51bWJlciwgJFBhcmFte1RpY2tldElEfSApLAogICAgICAgICAgICB9LAogICAgICAgIH07CgogICAgICAgIG15ICRSZXN1bHQ7CiAgICAgICAgZXZhbCB7CiAgICAgICAgICAgICRSZXN1bHQgPSAkU2VsZi0+e0pJUkFDbGllbnR9LT5QT1NUKAogICAgICAgICAgICAgICAgJy9pc3N1ZS8nIC4gJElzc3VlLT57a2V5fSAuICcvcmVtb3RlbGluaycsCiAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICREYXRhLAogICAgICAgICAgICApOwogICAgICAgIH07CgogICAgICAgIGlmICggJFNlbGYtPntEZWJ1Z30gKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdpbmZvJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+IHNwcmludGYgUCAuICI6Oklzc3VlQ3JlYXRlOiBSZW1vdGVsaW5rICglcy8lcykgcmVzdWx0ICVzIiwKICAgICAgICAgICAgICAgICAgICAkSXNzdWUtPntrZXl9LCAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgICRNYWluT2JqZWN0LT5EdW1wKCRSZXN1bHQpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyB0cmFuc2ZlciB0aWNrZXQgaGlzdG9yeSAtIGlmIGNvbmZpZ3VyZWQgYW5kIGlzc3VlIGlzIG5vdCBjcmVhdGVkIGJhc2VkCiAgICAgICAgIyBvbiBhIHNpbmdsZSBhcnRpY2xlCiAgICAgICAgbXkgJFNob3VsZFRyYW5zZmVySGlzdG9yeSA9ICRDb25maWdPYmplY3QtPkdldCgnSklSQTo6VHJhbnNmZXJUaWNrZXRIaXN0b3J5Jyk7CiAgICAgICAgaWYgKCAkU2hvdWxkVHJhbnNmZXJIaXN0b3J5ICYmICEkUGFyYW17QXJ0aWNsZUlEfSAmJiAkVXNlZEFydGljbGVJRCApIHsKCiAgICAgICAgICAgIG15IEBBcnRpY2xlSW5kZXggPSAkQXJ0aWNsZU9iamVjdC0+QXJ0aWNsZUxpc3QoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIENPTU1FTlQ6CiAgICAgICAgICAgIGZvciBteSAkQ29tbWVudCAoIEBBcnRpY2xlSW5kZXggKSB7CiAgICAgICAgICAgICAgICBuZXh0IENPTU1FTlQgaWYgJENvbW1lbnQtPntBcnRpY2xlSUR9ID09ICRVc2VkQXJ0aWNsZUlEOwoKICAgICAgICAgICAgICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJEFydGljbGVPYmplY3QtPkJhY2tlbmRGb3JBcnRpY2xlKCAleyRDb21tZW50fSApOwogICAgICAgICAgICAgICAgbXkgJUFydGljbGUgICAgICAgPSAkQmFja2VuZE9iamVjdC0+QXJ0aWNsZUdldCgKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJENvbW1lbnQtPntBcnRpY2xlSUR9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBteSAkSklSQUlzc3VlID0gJFNlbGYtPklzc3VlQ29tbWVudCgKICAgICAgICAgICAgICAgICAgICBJc3N1ZUlEICAgPT4gJElzc3VlLT57a2V5fSwKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJENvbW1lbnQtPntBcnRpY2xlSUR9LAogICAgICAgICAgICAgICAgICAgIEFydGljbGUgICA9PiBcJUFydGljbGUsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRQYXJhbXtVc2VySUR9IC8vIDEsCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCAgID0+ICRBcnRpY2xle0JvZHl9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkU2VsZi0+QXR0YWNobWVudHNTZW5kKAogICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQ29tbWVudC0+e0FydGljbGVJRH0sCiAgICAgICAgICAgICAgICAgICAgSXNzdWUgICAgID0+ICRJc3N1ZS0+e2tleX0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJElzc3VlOwp9Cgo9aXRlbSBJc3N1ZVVwZGF0ZSgpCgp1cGRhdGVzIGFuIGlzc3VlIGluIHRoZSBjb25maWd1cmVkIEppcmEgc3lzdGVtIHVzaW5nIFJFU1QKCiAgICBteSAkSXNzdWUgPSAkVGlja2V0SklSQU9iamVjdC0+SXNzdWVVcGRhdGUoCiAgICAgICAgVGlja2V0SUQgICAgICAgPT4gJFRpY2tldElELCAgICAgICAgICAgICAgICAgICMgdGhlIFRpY2tldElELCBtYW5kYXRvcnkKICAgICAgICBVc2VySUQgICAgICAgICA9PiAkVXNlcklEICAgICAgICAgICAgICAgICAgICAgIyB0aGUgVXNlcklELCBtYW5kYXRvcnkKICAgICk7CgpyZXR1cm5zOgoKICAgICRJc3N1ZSA9IHsKICAgICAgICBpZCA9PiAxMDAwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpc3N1ZSBpZCBpbiBKaXJhLCBzdGFydHMgZnJvbSAxMDAwMAogICAgICAgIGtleSA9PiBQUk9KLTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGlzc3VlIGtleSBhcyB1c2VkIGluIHRoZSB3ZWJpbnRlcmZhY2UsIDxQcm9qPi08TnVtYmVyPiwgc3RhcnRzIGZyb20gMQogICAgICAgIFsuLi5dICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHBsZW50eSBvZiBvdGhlciBmaWVsZHMgYXMgZGVmaW5lZCBpbiB0aGUgQVBJCiAgICB9Cj1jdXQKCnN1YiBJc3N1ZVVwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMb2dPYmplY3QgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwogICAgbXkgJENvbmZpZ09iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJFRpY2tldE9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CiAgICBteSAkQXJ0aWNsZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnKTsKCiAgICAjIGNoZWNrIGZvciBuZWVkZWQgZGF0YQogICAgZm9yIG15ICROZWVkZWQgKCBxdy9UaWNrZXRJRCBVc2VySUQvICkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxCiAgICApOwoKICAgIG15IEBJbmRleCA9ICRBcnRpY2xlT2JqZWN0LT5BcnRpY2xlTGlzdCgKICAgICAgICBUaWNrZXRJRCAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICApOwoKICAgIG15ICVBcnRpY2xlOwoKICAgIGlmIChASW5kZXgpIHsKICAgICAgICBteSAkQmFja2VuZE9iamVjdCA9ICRBcnRpY2xlT2JqZWN0LT5CYWNrZW5kRm9yQXJ0aWNsZSggJXsgJEluZGV4Wy0xXSB9ICk7CiAgICAgICAgJUFydGljbGUgPSAkQmFja2VuZE9iamVjdC0+QXJ0aWNsZUdldCgKICAgICAgICAgICAgQXJ0aWNsZUlEICAgICA9PiAkSW5kZXhbLTFdLT57QXJ0aWNsZUlEfSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkU2VsZi0+e0RlYnVnfSApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdpbmZvJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gc3ByaW50ZiBQIC4gIjo6SXNzdWVVcGRhdGU6IFRpY2tldElEOiAlcyA9PSAlcyBUaXRsZTogJXMiLAogICAgICAgICAgICAgICAgJFBhcmFte1RpY2tldElEfSwgJFRpY2tldHtUaWNrZXRJRH0sICRUaWNrZXR7VGl0bGV9LAogICAgICAgICk7CiAgICB9CgogICAgbXkgJFVSTCA9ICRTZWxmLT57Q29uZmlnfS0+e1VSTH07CgogICAgbXkgJFZhbGlkTGljZW5zZSA9ICRTZWxmLT5DaGVja1ZhbGlkTGljZW5zZSgpOwogICAgaWYgKCAkVmFsaWRMaWNlbnNlICE9IDEgKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiBzcHJpbnRmIFAgLiAiOjpJc3N1ZVVwZGF0ZTogaW52YWxpZCBsaWNlbnNlIGF0ICVzLCBzdGF0dXMgJXMiLAogICAgICAgICAgICAgICAgJFVSTCwgJFZhbGlkTGljZW5zZSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4ge307ICMgc2tpcCB0aGUgcmVzdAogICAgfQoKICAgIG15ICRSZXBvcnRlciA9ICRTZWxmLT57Q29uZmlnfS0+e1JlcG9ydGVyfTsKICAgIG15ICRBc3NpZ25lZSA9ICRTZWxmLT57Q29uZmlnfS0+e0Fzc2lnbmVlfTsKCiAgICAjIHJlYWQgJ1Byb2plY3QnIGZlbGQgZnJvbSAgIlN5c0NvbmZpZyIgaW4gT1RSUwogICAgbXkgJFByb2plY3QgPSAkU2VsZi0+e0NvbmZpZ30tPntQcm9qZWN0fTsKCiAgICAjIHJlYWQgJ0lzc3VlVHlwZScgZmVsZCBmcm9tICAiU3lzQ29uZmlnIiBpbiBPVFJTCiAgICBteSAkSXNzdWVUeXBlID0gJFNlbGYtPntDb25maWd9LT57SXNzdWVUeXBlfTsKICAgIG15ICRGaWVsZE5hbWUgPSAnSklSQUlzc3VlSUQnOwoKICAgIG15ICRKSVJBSXNzdWVJRCA9ICRUaWNrZXR7J0R5bmFtaWNGaWVsZF8nIC4gJEZpZWxkTmFtZX07CgogICAgaWYgKCAkU2VsZi0+e0RlYnVnfSApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdpbmZvJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gc3ByaW50ZiBQIC4gIjo6SXNzdWVVcGRhdGU6IEpJUkFJc3N1ZUlEKHByZSk6ICclcycgRHluYW1pY0ZpZWxkSUQ6ICVzIiwKICAgICAgICAgICAgICAgICRKSVJBSXNzdWVJRCwgJEZpZWxkTmFtZSwKICAgICAgICApOwogICAgfQoKICAgIG15ICRJc3N1ZSA9IHt9OwoKICAgIGlmICggJEpJUkFJc3N1ZUlEICkgewogICAgICAgIG15ICRDdXN0b21GaWVsZCA9ICdjdXN0b21maWVsZF8nIC4gKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0pJUkE6Ok9UUlNUaWNrZXRJREZpZWxkJykgfHwgMTAwMDAgKTsKCiAgICAgICAgbXkgJEpJUkFVcGRhdGVQYXJhbXMgPSB7CiAgICAgICAgICAgICRDdXN0b21GaWVsZCA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgIH07CgogICAgICAgICRKSVJBVXBkYXRlUGFyYW1zID0gJFNlbGYtPk1hcEZpZWxkcyggJEpJUkFVcGRhdGVQYXJhbXMsICVUaWNrZXQsICVBcnRpY2xlICk7CgogICAgICAgIG15ICRVcGRhdGVFcnJvcjsKCiAgICAgICAgZXZhbHsKICAgICAgICAgICAgJElzc3VlID0gJFNlbGYtPntKSVJBQ2xpZW50fS0+UFVUKAogICAgICAgICAgICAgICAgIi9pc3N1ZS8iIC4gJEpJUkFJc3N1ZUlELAogICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICB7IGZpZWxkcyA9PiAkSklSQVVwZGF0ZVBhcmFtcyB9LAogICAgICAgICAgICApCiAgICAgICAgfSBvciAkVXBkYXRlRXJyb3IgPSAkQDsKCiAgICAgICAgaWYgKCAkVXBkYXRlRXJyb3IgKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiBzcHJpbnRmIFAgLiAiOjpJc3N1ZVVwZGF0ZTogRXJyb3Igb24gdXBkYXRlOiAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAkVXBkYXRlRXJyb3IsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkSXNzdWUgfHwgJ1N1Y2Nlc3MnOwp9Cgo9aXRlbSBJc3N1ZUxpbmtUb09UUlMoKQoKbGluayBhbiBleGlzdGluZyBpc3N1ZSB0byBhbiBPVFJTIHRpY2tldC4gVGhpcyBvcGVyYXRpb24gdXBkYXRlcyB0aGUgY3VzdG9tIGZpZWxkIGhvbGRpbmcgdGhlIG90cnMgdGlja2V0IGlkIG9uIHRoZSBKaXJhIHNpZGUKYW5kIHRoZSBkeW5hbWljIGZpZWxkIHdpdGggdGhlIGlzc3VlIGlkIG9uIHRoZSBPVFJTIHNpZGUKCiAgICBteSAkSXNzdWUgPSAkVGlja2V0SklSQU9iamVjdC0+SXNzdWVMaW5rVG9PVFJTKAogICAgICAgIFRpY2tldElEICAgICAgID0+ICRUaWNrZXRJRCwgICAgICAgICAgICAgICAgICAjIHRoZSBUaWNrZXRJRCwgbWFuZGF0b3J5CiAgICAgICAgVXNlcklEICAgICAgICAgPT4gJFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICMgdGhlIFVzZXJJRCwgbWFuZGF0b3J5CiAgICApOwoKcmV0dXJuczoKCiAgICAkSXNzdWUgPSB7CiAgICAgICAgaWQgPT4gMTAwMDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaXNzdWUgaWQgaW4gSmlyYSwgc3RhcnRzIGZyb20gMTAwMDAKICAgICAgICBrZXkgPT4gUFJPSi0xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpc3N1ZSBrZXkgYXMgdXNlZCBpbiB0aGUgd2ViaW50ZXJmYWNlLCA8UHJvaj4tPE51bWJlcj4sIHN0YXJ0cyBmcm9tIDEKICAgICAgICBbLi4uXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwbGVudHkgb2Ygb3RoZXIgZmllbGRzIGFzIGRlZmluZWQgaW4gdGhlIEFQSQogICAgfQo9Y3V0CgpzdWIgSXNzdWVMaW5rVG9PVFJTIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExvZ09iamVjdCAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CiAgICBteSAkTWFpbk9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkVGlja2V0T2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgICMgY2hlY2sgZm9yIG5lZWRlZCBkYXRhCiAgICBmb3IgbXkgJE5lZWRlZCAoIHF3L1RpY2tldElEIFVzZXJJRCBJc3N1ZUlEIFByb2plY3QvICkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJFVSTCA9ICRTZWxmLT57Q29uZmlnfS0+e1VSTH07CgogICAgbXkgJFZhbGlkTGljZW5zZSA9ICRTZWxmLT5DaGVja1ZhbGlkTGljZW5zZSgpOwogICAgaWYgKCAkVmFsaWRMaWNlbnNlICE9IDEgKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiBzcHJpbnRmIFAgLiAiOjpJc3N1ZUxpbmtUb09UUlM6IGludmFsaWQgbGljZW5zZSBhdCAlcywgc3RhdHVzICVzIiwKICAgICAgICAgICAgICAgICRVUkwsICRWYWxpZExpY2Vuc2UsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuIHt9OyAjIHNraXAgdGhlIHJlc3QKICAgIH0KCiAgICAjIHJlYWQgJ1Byb2plY3QnIGZlbGQgZnJvbSAgIlN5c0NvbmZpZyIgaW4gT1RSUwogICAgbXkgJFByb2plY3QgICAgID0gJFBhcmFte1Byb2plY3R9OwogICAgbXkgJEpJUkFJc3N1ZUlEID0gJFBhcmFte0lzc3VlSUR9OwoKICAgIG15ICRGaWVsZE5hbWUgPSAnSklSQUlzc3VlSUQnOwoKICAgIGlmICggJFNlbGYtPntEZWJ1Z30gKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnaW5mbycsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+IHNwcmludGYgUCAuICI6Oklzc3VlTGlua1RvT1RSUzogVGlja2V0SUQ6ICclcycgRHluYW1pY0ZpZWxkSUQ6ICVzIiwKICAgICAgICAgICAgICAgICRQYXJhbXtUaWNrZXRJRH0sICRGaWVsZE5hbWUsCiAgICAgICAgKTsKICAgICB9CgogICAgbXkgJEN1c3RvbUZpZWxkID0gJ2N1c3RvbWZpZWxkXycgLiAoICRDb25maWdPYmplY3QtPkdldCgnSklSQTo6T1RSU1RpY2tldElERmllbGQnKSB8fCAxMDAwMCApOwoKICAgIG15ICRKSVJBVXBkYXRlUGFyYW1zID0gewogICAgICAgICRDdXN0b21GaWVsZCA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgfTsKCiAgICAkSklSQVVwZGF0ZVBhcmFtcyA9ICRTZWxmLT5NYXBGaWVsZHMoICRKSVJBVXBkYXRlUGFyYW1zICk7CgogICAgaWYgKCAkU2VsZi0+e0RlYnVnfSApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdpbmZvJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gc3ByaW50ZiBQIC4gIjo6SXNzdWVMaW5rVG9PVFJTOiBVcGRhdGVQYXJhbXMgLT4gIgogICAgICAgICAgICAgICAgLiAkTWFpbk9iamVjdC0+RHVtcCggJEpJUkFVcGRhdGVQYXJhbXMgKSwKICAgICAgICApOwogICAgfQoKICAgIG15ICRVcGRhdGVFcnJvcjsKCiAgICBteSAkSXNzdWUgPSB7fTsKICAgIGV2YWx7CiAgICAgICAgJElzc3VlID0gJFNlbGYtPntKSVJBQ2xpZW50fS0+UFVUKAogICAgICAgICAgICAiL2lzc3VlLyIgLiAkSklSQUlzc3VlSUQsCiAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICB7IGZpZWxkcyA9PiAkSklSQVVwZGF0ZVBhcmFtcyB9LAogICAgICAgICk7CiAgICB9IG9yICRVcGRhdGVFcnJvciA9ICRAOwoKICAgIG15ICRUaWNrZXROdW1iZXIgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXROdW1iZXJMb29rdXAoCiAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICk7CgogICAgbXkgJERhdGEgICA9IHsKICAgICAgICBvYmplY3QgPT4gewogICAgICAgICAgICB1cmwgICA9PiBzcHJpbnRmKAogICAgICAgICAgICAgICAgIiVzOi8vJXMvJXNpbmRleC5wbD9BY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPSVzIiwKICAgICAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgnSHR0cFR5cGUnKSwKICAgICAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgnRlFETicpLAogICAgICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdTY3JpcHRBbGlhcycpLAogICAgICAgICAgICAgICAgJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgKSwKICAgICAgICAgICAgdGl0bGUgPT4gc3ByaW50ZiggIk9UUlMgVGlja2V0IyVzICglcykiLCAkVGlja2V0TnVtYmVyLCAkUGFyYW17VGlja2V0SUR9ICksCiAgICAgICAgfSwKICAgIH07CgogICAgbXkgJFJlc3VsdDsKICAgIGV2YWwgewogICAgICAgICRSZXN1bHQgPSAkU2VsZi0+e0pJUkFDbGllbnR9LT5QT1NUKAogICAgICAgICAgICAnL2lzc3VlLycgLiAkSklSQUlzc3VlSUQgLiAnL3JlbW90ZWxpbmsnLAogICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgJERhdGEsCiAgICAgICAgKTsKICAgIH07CgogICAgaWYgKCAkU2VsZi0+e0RlYnVnfSApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdpbmZvJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gc3ByaW50ZiBQIC4gIjo6SXNzdWVMaW5rVG9PVFJTOiBJc3N1ZSAoZnJvbSBVcGRhdGUpIC0+ICIKICAgICAgICAgICAgICAgIC4gJE1haW5PYmplY3QtPkR1bXAoICRJc3N1ZSApLAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkVXBkYXRlRXJyb3IgKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiBzcHJpbnRmIFAgLiAiOjpJc3N1ZUxpbmtUb09UUlM6IEVycm9yIG9uIHVwZGF0ZTogJXNcbiIsCiAgICAgICAgICAgICAgICAkVXBkYXRlRXJyb3IsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuIHsgZXJyb3IgPT4gJFVwZGF0ZUVycm9yIH07CiAgICB9CgogICAgbXkgJElzc3VlSW5mbyA9ICRTZWxmLT5Jc3N1ZUdldCggSXNzdWUgPT4gJEpJUkFJc3N1ZUlEICk7CgogICAgbXkgJFN1Y2Nlc3MgPSAkQmFja2VuZE9iamVjdC0+VmFsdWVTZXQoCiAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICRTZWxmLT57SklSQUR5bmFtaWNGaWVsZH0sCiAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRJc3N1ZUluZm8tPntrZXl9LAogICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuICRJc3N1ZSB8fCB7fTsKfQoKPWl0ZW0gSXNzdWVDb21tZW50KCkKCmNyZWF0ZXMgYW4gaXNzdWUgaW4gdGhlIGNvbmZpZ3VyZWQgSmlyYSBzeXN0ZW0gdXNpbmcgU09BUAoKICAgIG15ICRJc3N1ZSA9ICRUaWNrZXRKSVJBT2JqZWN0LT5Jc3N1ZUNvbW1lbnQoCiAgICAgICAgSXNzdWVJRCA9PiAkVGlja2V0SUQsICMgdGhlIElzc3VlSUQsIG1hbmRhdG9yeQogICAgICAgIENvbW1lbnQgPT4gJEFydGljbGVJRCAjIHRoZSBjb21tZW50LCBtYW5kYXRvcnkKICAgICk7CgpyZXR1cm5zOgoKICAgICRJc3N1ZSA9IHsKICAgICAgICBpZCA9PiAxMDAwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpc3N1ZSBpZCBpbiBKaXJhLCBzdGFydHMgZnJvbSAxMDAwMAogICAgICAgIGtleSA9PiBQUk9KLTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGlzc3VlIGtleSBhcyB1c2VkIGluIHRoZSB3ZWJpbnRlcmZhY2UsIDxQcm9qPi08TnVtYmVyPiwgc3RhcnRzIGZyb20gMQogICAgICAgIFsuLi5dICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHBsZW50eSBvZiBvdGhlciBmaWVsZHMgYXMgZGVmaW5lZCBpbiB0aGUgQVBJCiAgICB9Cgo9Y3V0CgpzdWIgSXNzdWVDb21tZW50IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87ICMjIEZJWE1FIGltcGxlbWVudAoKICAgIG15ICRDb25maWdPYmplY3QgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJExvZ09iamVjdCAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKICAgIG15ICREeW5hbWljRmllbGRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyk7CiAgICBteSAkQmFja2VuZE9iamVjdCAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgICMgY2hlY2sgZm9yIG5lZWRlZCBkYXRhCiAgICBmb3IgbXkgJE5lZWRlZCAoIHF3L0lzc3VlSUQgQ29tbWVudCBBcnRpY2xlSUQgVXNlcklELyApIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRDb21tZW50VGV4dCAgID0gJFBhcmFte0NvbW1lbnR9OwogICAgbXkgJEFydGljbGVGb3JtYXQgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0pJUkE6OkFydGljbGVGb3JtYXQnKTsKICAgIGlmICggJEFydGljbGVGb3JtYXQgJiYgISRQYXJhbXtVc2VDb21tZW50fSApIHsKICAgICAgICAkQ29tbWVudFRleHQgPSAkU2VsZi0+X0Zvcm1hdEFydGljbGUoCiAgICAgICAgICAgIEFydGljbGUgICAgICAgPT4gJFBhcmFte0FydGljbGV9LAogICAgICAgICAgICBBcnRpY2xlRm9ybWF0ID0+ICRBcnRpY2xlRm9ybWF0LAogICAgICAgICk7CiAgICB9CgogICAgbXkgJFVSTCA9ICRTZWxmLT57Q29uZmlnfS0+e1VSTH07CgogICAgbXkgJFZhbGlkTGljZW5zZSA9ICRTZWxmLT5DaGVja1ZhbGlkTGljZW5zZSgpOwogICAgaWYgKCAkVmFsaWRMaWNlbnNlICE9IDEgKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiBzcHJpbnRmIFAgLiAiOjpJc3N1ZUNvbW1lbnQ6IGludmFsaWQgbGljZW5zZSBhdCAlcywgc3RhdHVzICVzIiwKICAgICAgICAgICAgICAgICRVUkwsICRWYWxpZExpY2Vuc2UsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuIHt9OyAjIHNraXAgdGhlIHJlc3QKICAgIH0KCiAgICBteSAkSXNzdWUgPSB7fTsKCiAgICBpZiAoICRQYXJhbXtJc3N1ZUlEfSApIHsKICAgICAgICBteSAkRXJyb3JDb21tZW50OwogICAgICAgIGV2YWwgewogICAgICAgICAgICAkSXNzdWUgPSAkU2VsZi0+e0pJUkFDbGllbnR9LT5QT1NUKAogICAgICAgICAgICAgICAgIi9pc3N1ZS8iIC4gJFBhcmFte0lzc3VlSUR9IC4gIi9jb21tZW50IiwKICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgeyBib2R5ID0+ICRDb21tZW50VGV4dCB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgMTsKICAgICAgICB9IG9yICRFcnJvckNvbW1lbnQgPSAkQDsKCiAgICAgICAgaWYgKCAkRXJyb3JDb21tZW50ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gc3ByaW50ZiBQIC4gICI6Oklzc3VlQ29tbWVudDogY2Fubm90IGNyZWF0ZSBjb21tZW50IGZvciBpc3N1ZSAlczogJXMiLAogICAgICAgICAgICAgICAgICAgICRQYXJhbXtJc3N1ZUlEfSwgJEVycm9yQ29tbWVudCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybiAreyBlcnJvciA9PiAkRXJyb3JDb21tZW50IH07CiAgICAgICAgfQoKICAgIH0KCiAgICBteSAkU2VudEZpZWxkID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkR2V0KCBOYW1lID0+ICdBcnRpY2xlU2VudFRvSklSQScgKTsKICAgIG15ICRTdWNjZXNzICAgPSAkQmFja2VuZE9iamVjdC0+VmFsdWVTZXQoCiAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICRTZW50RmllbGQsCiAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRQYXJhbXtBcnRpY2xlSUR9LAogICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAxLAogICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuICRJc3N1ZTsKfQoKPWl0ZW0gQXR0YWNobWVudHNTZW5kKCkKCj1jdXQKCnN1YiBBdHRhY2htZW50c1NlbmQgewogICAgbXkgKCRTZWxmLCAlUGFyYW0pID0gQF87CgogICAgbXkgJFRpY2tldE9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CiAgICBteSAkQXJ0aWNsZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnKTsKICAgIG15ICRMb2dPYmplY3QgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwogICAgbXkgJE1haW5PYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpOwogICAgbXkgJEVuY29kZU9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RW5jb2RlJyk7CgogICAgZm9yIG15ICROZWVkZWQgKCBxdyhBcnRpY2xlSUQgSXNzdWUgVXNlcklEKSApIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkVGlja2V0SUQgICAgICA9ICRBcnRpY2xlT2JqZWN0LT5UaWNrZXRJRExvb2t1cCggQXJ0aWNsZUlEID0+ICRQYXJhbXtBcnRpY2xlSUR9ICk7CiAgICBteSAkQmFja2VuZE9iamVjdCA9ICRBcnRpY2xlT2JqZWN0LT5CYWNrZW5kRm9yQXJ0aWNsZSgKICAgICAgICBUaWNrZXRJRCAgPT4gJFRpY2tldElELAogICAgICAgIEFydGljbGVJRCA9PiAkUGFyYW17QXJ0aWNsZUlEfSwKICAgICk7CgogICAgcmV0dXJuIGlmICEkQmFja2VuZE9iamVjdDsKICAgIHJldHVybiBpZiAhJEJhY2tlbmRPYmplY3QtPmNhbignQXJ0aWNsZUF0dGFjaG1lbnRJbmRleCcpOwoKICAgICMgZ2V0IHRoZSBsaXN0IG9mIHRoZSBhdHRhY2htZW50cwogICAgbXkgJUluZGV4ID0gJEJhY2tlbmRPYmplY3QtPkFydGljbGVBdHRhY2htZW50SW5kZXgoCiAgICAgICAgQXJ0aWNsZUlEID0+ICRQYXJhbXtBcnRpY2xlSUR9LAogICAgICAgIFVzZXJJRCAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBnZXQgdXNlcmFnZW50IHVzZWQgYnkgdGhlIEppcmEgb2JqZWN0IHRvIGRvIHRoZSBmaWxldXBsb2FkcwogICAgbXkgJFJlc3QgPSAkU2VsZi0+e0pJUkFDbGllbnR9LT57cmVzdH07CiAgICBteSAkVUEgICA9ICRSZXN0LT5nZXRVc2VyYWdlbnQoKTsKCiAgICAjIGdldCBJRCBvZiBlYWNoIGF0dGFjaG1lbnQgZmlsZSwgdGhlbiB0aGUgY29ycmVzcG9uZGluZyBhdHRhY2htZW50IGZpbGUKICAgIHdoaWxlICggbXkgKCAkRmlsZUlELCAkQXR0YWNoSCApID0gZWFjaCAlSW5kZXggKSB7CgogICAgICAgICMgcmV0cmlldmUgdGhlIG5hbWUgYW5kIGNvbnRlbnQgb2YgZWFjaCBhdHRhY2htZW50IGZpbGUsCiAgICAgICAgIyBzdG9yZSB0aGVtIGludG8gQGZpbGVuYW1lcyBhbmQgQGF0dGFjaG1lbnRzIHJlc3BlY3RpdmVseS4KICAgICAgICBteSBARmlsZW5hbWVzOwogICAgICAgIG15IEBBdHRhY2htZW50czsKCiAgICAgICAgbXkgJUF0dGFjaG1lbnQgPSAkQmFja2VuZE9iamVjdC0+QXJ0aWNsZUF0dGFjaG1lbnQoCiAgICAgICAgICAgIEFydGljbGVJRCA9PiAkUGFyYW17QXJ0aWNsZUlEfSwKICAgICAgICAgICAgRmlsZUlEICAgID0+ICRGaWxlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBuZXh0IGlmICRBdHRhY2htZW50e0ZpbGVuYW1lfSBlcSAnZmlsZS0yJzsKCiAgICAgICAgaWYgKCAkUGFyYW17RmlsZW5hbWV9ICYmICRBdHRhY2htZW50e0ZpbGVuYW1lfSBuZSAkUGFyYW17RmlsZW5hbWV9ICkgewogICAgICAgICAgICBuZXh0OwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkU2VsZi0+e0RlYnVnfSApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2luZm8nLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gc3ByaW50ZiBQIC4gIjo6QXR0YWNobWVudHNTZW5kOiBIYW5kbGluZyBhdHRhY2htZW50OiAlcyIsICRBdHRhY2htZW50e0ZpbGVuYW1lfQogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJElzc3VlS2V5ID0gJFBhcmFte0lzc3VlfTsKICAgICAgICBteSAkRmlsZU5hbWUgPSAkRW5jb2RlT2JqZWN0LT5FbmNvZGVPdXRwdXQoIFwkQXR0YWNobWVudHtGaWxlbmFtZX0gKTsKCiAgICAgICAgbXkgJFJlc3BvbnNlID0gJFVBLT5wb3N0KAogICAgICAgICAgICAkU2VsZi0+e0hvc3R9IC4gIi9pc3N1ZS8kSXNzdWVLZXkvYXR0YWNobWVudHMiLAogICAgICAgICAgICAjJFJlc3QtPmdldEhvc3QoKSAuICIvaXNzdWUvJElzc3VlS2V5L2F0dGFjaG1lbnRzIiwKICAgICAgICAgICAgJXskUmVzdC0+e19oZWFkZXJzfX0sCiAgICAgICAgICAgICdYLUF0bGFzc2lhbi1Ub2tlbicgPT4gJ25vLWNoZWNrJywKICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZScgICAgICA9PiAnZm9ybS1kYXRhJywKICAgICAgICAgICAgQ29udGVudCAgICAgICAgICAgICA9PiBbCiAgICAgICAgICAgICAgICBmaWxlID0+IFsKICAgICAgICAgICAgICAgICAgICB1bmRlZiwgICAgICAgICAgICAgICAgICAgIyBhcyB3ZSBoYXZlIHRoZSBjb250ZW50IGFscmVhZCwgd2UgZG8gbm90IHBhc3MgYSBmaWxlbmFtZQogICAgICAgICAgICAgICAgICAgICRBdHRhY2htZW50e0ZpbGVuYW1lfSwgICAjIGZpbGVuYW1lIGZvciB0aGUgc2VydmVyCiAgICAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJyA9PiAkQXR0YWNobWVudHtDb250ZW50VHlwZX0sCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgICAgICA9PiAkQXR0YWNobWVudHtDb250ZW50fSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgIF0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJFJlc3BvbnNlLT5pc19zdWNjZXNzICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gc3ByaW50ZiBQIC4gIjo6QXR0YWNobWVudHNTZW5kOiBDYW5ub3QgYXR0YWNoIGZpbGUgJEF0dGFjaG1lbnR7RmlsZW5hbWV9IHRvIGlzc3VlICRJc3N1ZUtleSAtPiAiCiAgICAgICAgICAgICAgICAgICAgLiAkUmVzcG9uc2UtPnN0YXR1c19saW5lLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+IHNwcmludGYgUCAuICI6OkF0dGFjaG1lbnRzU2VuZDogSGVhZGVyIC0+ICIgLiAkTWFpbk9iamVjdC0+RHVtcCAoICRSZXN0LT57X2hlYWRlcnN9ICksCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFNlbGYtPntEZWJ1Z30gKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiBzcHJpbnRmIFAgLiAiOjpBdHRhY2htZW50c1NlbmQ6IGF0dGFjaGVkIGZpbGUgJEF0dGFjaG1lbnR7RmlsZW5hbWV9IC0+ICIKICAgICAgICAgICAgICAgICAgICAuICRSZXNwb25zZS0+c3RhdHVzX2xpbmUsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQp9CgoKPWl0ZW0gRmllbGRzR2V0KCkKClJldHJpZXZlIGZpZWxkIGRlZmluaXRpb25zIGZyb20gSmlyYS4gVGhlIHJlc3VsdCBpcyBjYWNoZWQgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuCgogICAgbXkgJEZpZWxkcyA9ICRPYmplY3QtPkZpZWxkc0dldCgpOwoKPWN1dAoKc3ViIEZpZWxkc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMb2dPYmplY3QgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKICAgIG15ICRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwoKICAgIGlmICghJFBhcmFte0RvTm90Q2FjaGV9KSB7CiAgICAgICAgbXkgJENhY2hlS2V5ID0gJ0ZpZWxkc0dldCc7CgogICAgICAgICRQYXJhbXtSZXR1cm59IHx8PSAnJzsKCiAgICAgICAgaWYgKCAkUGFyYW17UmV0dXJufSAmJiBsYyAkUGFyYW17UmV0dXJufSBlcSAndHlwZXMnICkgewogICAgICAgICAgICAkQ2FjaGVLZXkgPSAnRmllbGRUeXBlcyc7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFBhcmFte1JldHVybn0gJiYgbGMgJFBhcmFte1JldHVybn0gZXEgJ3N0YW5kYXJkJyApIHsKICAgICAgICAgICAgJENhY2hlS2V5ID0gJ1N0YW5kYXJkRmllbGRzJzsKICAgICAgICB9CgogICAgICAgIG15ICRDYWNoZSA9ICRDYWNoZU9iamVjdC0+R2V0KAogICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXksCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRDYWNoZSBpZiAkQ2FjaGU7CiAgICB9CgogICAgbXkgJEZpZWxkczsKICAgIG15ICRGaWVsZFR5cGVzOwogICAgbXkgJFN0YW5kYXJkRmllbGRzOwoKICAgIG15ICRFcnJvckZpZWxkczsKICAgIGV2YWwgewogICAgICAgIG15ICRGaWVsZHNEYXRhID0gJFNlbGYtPntKSVJBQ2xpZW50fS0+R0VUKAogICAgICAgICAgICAiL2ZpZWxkIgogICAgICAgICk7CgogICAgICAgIG15ICVDdXN0b21GaWVsZHMgPSBtYXB7CiAgICAgICAgICAgICRfLT57bmFtZX0gPT4gJF8tPntzY2hlbWF9LT57Y3VzdG9tSWR9CiAgICAgICAgfSBncmVwIHsKICAgICAgICAgICAgJF8tPntzY2hlbWF9LT57Y3VzdG9tSWR9CiAgICAgICAgfSBAeyAkRmllbGRzRGF0YSB8fCBbXSB9OwoKICAgICAgICAkRmllbGRzID0gXCVDdXN0b21GaWVsZHM7CgogICAgICAgIGZvciBteSAkRmllbGQgKCBAeyAkRmllbGRzRGF0YSB8fCBbXSB9ICkgewogICAgICAgICAgICAkRmllbGRUeXBlcy0+eyAkRmllbGQtPntpZH0gfSA9ICRGaWVsZC0+e3NjaGVtYX07CgogICAgICAgICAgICBpZiAoICEkRmllbGQtPntjdXN0b219ICkgewogICAgICAgICAgICAgICAgcHVzaCBAeyRTdGFuZGFyZEZpZWxkc30sICRGaWVsZC0+e2lkfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgMTsKICAgIH0gb3IgJEVycm9yRmllbGRzID0gJEA7CgogICAgaWYgKCAhJEVycm9yRmllbGRzICkgewogICAgICAgICRDYWNoZU9iamVjdC0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgID0+ICdGaWVsZHNHZXQnLAogICAgICAgICAgICBWYWx1ZSA9PiAkRmllbGRzLAogICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSB8fCAxLAogICAgICAgICk7CgogICAgICAgICRDYWNoZU9iamVjdC0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgID0+ICdGaWVsZFR5cGVzJywKICAgICAgICAgICAgVmFsdWUgPT4gJEZpZWxkVHlwZXMsCiAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9IHx8IDEsCiAgICAgICAgKTsKCiAgICAgICAgJENhY2hlT2JqZWN0LT5TZXQoCiAgICAgICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICAgPT4gJ1N0YW5kYXJkRmllbGRzJywKICAgICAgICAgICAgVmFsdWUgPT4gJFN0YW5kYXJkRmllbGRzLAogICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSB8fCAxLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+IHNwcmludGYgUCAuICAiOjpGaWVsZHNHZXQ6IGNhbm5vdCByZXRyaWV2ZSBmaWVsZHMgZGVmaW5pdGlvbnM6ICVzIiwKICAgICAgICAgICAgICAgICRFcnJvckZpZWxkcywKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKCBsYyAkUGFyYW17UmV0dXJufSBlcSAndHlwZXMnICkgewogICAgICAgIHJldHVybiAkRmllbGRUeXBlczsKICAgIH0KCiAgICByZXR1cm4gJEZpZWxkczsKfQoKPWl0ZW0gTWFwRmllbGRzCgpNYXBzIHRoZSBPVFJTIHRvIHRoZSBKaXJhIGN1c3RvbSBmaWVsZHMgYXMgZGVmaW5lZCBpbiB0aGUgY29uZmlndXJhdGlvbi4KUmV0dXJucyBhIGhhc2ggbWFwLgoKICBteSAkRmllbGRzID0gJE9iamVjdC0+TWFwRmllbGRzKCRGaWVsZHMsICVUaWNrZXQsICVBcnRpY2xlKQoKcmV0dXJuOgoKICAkRmllbGRzID0gewogICAgc3RhbmRhcmRGaWVsZDEgPT4gdmFsdWUxLAogICAgc3RhbmRhcmRGaWVsZDIgPT4gdmFsdWUyLAogICAgWy4uLl0KICAgIGN1c3RvbWZpZWxkcyA9PiB7CiAgICAgICAgY2YxID0+IHZhbHVlMywKICAgICAgICBjZjIgPT4gdmFsdWU0LAogICAgICAgIFsuLi5dCiAgICB9CiAgfQoKPWN1dAoKc3ViIE1hcEZpZWxkcyB7CiAgICBteSAoICRTZWxmLCAkRmllbGRzLCAlQXJ0aWNsZSApID0gQF87CgogICAgbXkgJExvZ09iamVjdCAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKICAgIG15ICRDYWNoZU9iamVjdCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKICAgIG15ICRNYWluT2JqZWN0ICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpOwogICAgbXkgJER5bmFtaWNGaWVsZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKTsKICAgIG15ICRERlZhbHVlT2JqZWN0ICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkVmFsdWUnKTsKCiAgICAjIHJldHJpZXZlcyBkeW5hbWljLWN1c3RvbSBmaWVsZCBtYXBwaW5nCiAgICBteSAkQ3VzdG9tRmllbGRzICAgPSB7fTsKICAgIG15ICRNYXBwaW5nICAgICAgICA9ICRTZWxmLT57Q29uZmlnfS0+eydPVFJTLUpJUkEtRmllbGRNYXBwaW5nJ307CiAgICBteSAkRGF0ZUZvcm1hdCAgICAgPSAkU2VsZi0+e0NvbmZpZ30tPnsnSmlyYS1EYXRlRm9ybWF0J307CiAgICBteSAkRGF0ZVRpbWVGb3JtYXQgPSAkU2VsZi0+e0NvbmZpZ30tPnsnSmlyYS1EYXRlVGltZUZvcm1hdCd9OwoKICAgIG15ICRKSVJBRmllbGRzICAgICA9ICRTZWxmLT5GaWVsZHNHZXQoKTsKCiAgICBpZiAoICRTZWxmLT57RGVidWd9ICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gc3ByaW50ZiBQIC4gIjo6TWFwRmllbGRzOiBBcnRpY2xlOiAlcyIsCiAgICAgICAgICAgICAgICAkTWFpbk9iamVjdC0+RHVtcCggXCVBcnRpY2xlICksCiAgICAgICAgKTsKCiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICBNZXNzYWdlICA9PiBzcHJpbnRmIFAgLiAiOjpNYXBGaWVsZHM6IG1hcHBpbmc6ICVzIiwKICAgICAgICAgICAgICAgICRNYWluT2JqZWN0LT5EdW1wKCAkTWFwcGluZyApLAogICAgICAgICk7CiAgICB9CiAgICAKCiAgICBpZiAoIGRlZmluZWQgJE1hcHBpbmcgKSB7CgogICAgICAgICMgYWxsIGNoYW5nZXMgcmVxdWlyZWQgT05MWSBmb3IgUGVybCA1LjEwIC4uLgogICAgICAgIEtFWToKICAgICAgICBmb3IgbXkgJEtleSAoIGtleXMgJXskTWFwcGluZ30gICkgewogICAgICAgICAgICBteSAkVmFsdWUgPSAkTWFwcGluZy0+eyRLZXl9OwoKICAgICAgICAgICAgbmV4dCBLRVkgaWYgIWxlbmd0aCAkS2V5IHx8ICFsZW5ndGggJFZhbHVlOwoKICAgICAgICAgICAgbXkgKCRLUHJlZml4LCRWUHJlZml4LCREQlZhbCkgPSAoIiIsIiIsdW5kZWYpOwogICAgICAgICAgICBteSAoJElzQURhdGUsICRJc0FEYXRlVGltZSkgPSAoMCwwKTsKCiAgICAgICAgICAgICgkS1ByZWZpeCwgJEtleSkgICA9IHNwbGl0IC86LywgJEtleSwgMjsKICAgICAgICAgICAgKCRWUHJlZml4LCAkVmFsdWUpID0gc3BsaXQgLzovLCAkVmFsdWUsIDI7CgogICAgICAgICAgICBpZiAoICRTZWxmLT57RGVidWd9ICkgewogICAgICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gUCAuICI6Ok1hcEZpZWxkczogY2hlY2tpbmc6IGtwcmVmaXgsa2V5LHZwcmVmaXgsdmFsIDogIgogICAgICAgICAgICAgICAgICAgICAgICAuICIkS1ByZWZpeCwkS2V5LCRWUHJlZml4LCRWYWx1ZVxuIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJEtQcmVmaXggZXEgJ3N0ZCcgKSB7CiAgICAgICAgICAgICAgICAkREJWYWwgPSAkQXJ0aWNsZXskS2V5fTsKCiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57RGVidWd9ICkgewogICAgICAgICAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gUCAuICI6Ok1hcEZpZWxkczogc3RkIGZpZWxkIHdpdGggJERCVmFsXG4iLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCAkS2V5IGVxICdDcmVhdGVkJyB8fCAkS2V5IGVxICdDaGFuZ2VkJyApIHsKICAgICAgICAgICAgICAgICAgICAkSXNBRGF0ZVRpbWUgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkS2V5ID1+IG17RGF0ZVx6fXhtcyApIHsKICAgICAgICAgICAgICAgICAgICAkSXNBRGF0ZSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkS1ByZWZpeCBlcSAnZHluJyApIHsKICAgICAgICAgICAgICAgIG15ICREeW5GaWVsZCAgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRHZXQoIE5hbWUgPT4gJEtleSApOwogICAgICAgICAgICAgICAgbXkgJEZpZWxkVHlwZSA9ICREeW5GaWVsZC0+e0ZpZWxkVHlwZX07CgogICAgICAgICAgICAgICAgJERCVmFsID0gJEFydGljbGV7IkR5bmFtaWNGaWVsZF8kS2V5In07CgogICAgICAgICAgICAgICAgaWYgKCAhJERCVmFsICYmICREeW5GaWVsZCApIHsKICAgICAgICAgICAgICAgICAgICAkREJWYWwgPSAkREZWYWx1ZU9iamVjdC0+VmFsdWVHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkSUQgID0+ICREeW5GaWVsZC0+e0lEfSwKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0SUQgPT4gJEFydGljbGV7VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgICkgfHwgdW5kZWY7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0RlYnVnfSApIHsKICAgICAgICAgICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+IFAgLiAiOjpNYXBGaWVsZHM6IGR5biBmaWVsZCBBcnJheTogIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkTWFpbk9iamVjdC0+RHVtcCgkREJWYWwgLy8gJycpIC4gIlxuIiwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15ICRJc011bHRpc2VsZWN0OwoKICAgICAgICAgICAgICAgICMgb25seSBoYW5kbGUgRGF0ZSwgRGF0ZVRpbWUgYW5kIENoZWNrYm94LCBmb3IgdGhlIHJlc3Qgd2UgaGF2ZSBub3RoaW5nIHRvIGRvCiAgICAgICAgICAgICAgICBpZiAoICRGaWVsZFR5cGUgZXEgJ0RhdGUnICkgewogICAgICAgICAgICAgICAgICAgICRJc0FEYXRlID0gMTsKCiAgICAgICAgICAgICAgICAgICAgJERCVmFsID0gcmVmICREQlZhbCA/ICREQlZhbC0+WzBdLT57VmFsdWVEYXRlVGltZX0gOiAkREJWYWw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRGaWVsZFR5cGUgZXEgJ0RhdGVUaW1lJyApIHsKICAgICAgICAgICAgICAgICAgICAkSXNBRGF0ZVRpbWUgPSAxOwoKICAgICAgICAgICAgICAgICAgICAkREJWYWwgPSByZWYgJERCVmFsID8gJERCVmFsLT5bMF0tPntWYWx1ZURhdGVUaW1lfSA6ICREQlZhbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJEZpZWxkVHlwZSBlcSAnQ2hlY2tib3gnICkgewogICAgICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntEZWJ1Z30gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdpbmZvJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+IFAgLiAiOjpNYXBGaWVsZHM6IHNraXBwaW5nOiBDaGVja2JveCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiRHluYW1pY2ZpZWxkICRLZXkgd2l0aCB2YWx1ZSAkREJWYWxcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkREJWYWwgPSB1bmRlZjsKICAgICAgICAgICAgICAgIH0gIyBJZ25vcmUgYnkgZGVmYXVsdCBzaW5jZSBKaXJhIGRvZXMgbm90IGhhdmUgYSBjaGVja2JveCBjdXN0b20gZmllbGQKICAgICAgICAgICAgICAgIGVsc2lmICggJEZpZWxkVHlwZSBlcSAnTXVsdGlzZWxlY3QnICkgewogICAgICAgICAgICAgICAgICAgICREQlZhbCA9IHJlZiAkREJWYWwgPwogICAgICAgICAgICAgICAgICAgICAgICBbIG1hcHsgK3sgdmFsdWUgPT4gJF8gfSB9QHskREJWYWx9IF0gOgogICAgICAgICAgICAgICAgICAgICAgICBbXTsKCiAgICAgICAgICAgICAgICAgICAgJElzTXVsdGlzZWxlY3QgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkRmllbGRUeXBlIGVxICdEcm9wZG93bicgKSB7CiAgICAgICAgICAgICAgICAgICAgJERCVmFsID0gcmVmICREQlZhbCA/CiAgICAgICAgICAgICAgICAgICAgICAgICt7IHZhbHVlID0+ICREQlZhbC0+WzBdLT57VmFsdWVUZXh0fSB9IDoKICAgICAgICAgICAgICAgICAgICAgICAgK3sgdmFsdWUgPT4gJERCVmFsIH07CgogICAgICAgICAgICAgICAgICAgICRJc011bHRpc2VsZWN0ID0gMTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkREJWYWwgPSAocmVmICREQlZhbCAmJiAhJElzTXVsdGlzZWxlY3QpID8KICAgICAgICAgICAgICAgICAgICAoICREQlZhbC0+WzBdLT57VmFsdWVUZXh0fSB8fCAkREJWYWwtPlswXS0+e1ZhbHVlSW50fSApIDoKICAgICAgICAgICAgICAgICAgICAkREJWYWw7CgogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0RlYnVnfSApIHsKICAgICAgICAgICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+IFAgLiAiOjpNYXBGaWVsZHM6IGR5biBmaWVsZCB3aXRoICREQlZhbCBhbmQgdHlwZSAkRmllbGRUeXBlXG4iLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkS1ByZWZpeCBlcSAnY2FsbCcgKSB7CgogICAgICAgICAgICAgICAgIyBjYWxscyBtdXN0IGJlIHNwZWNpZmllZCBhcyB0aGlzOiBlLmcuICJNSU1FOjpCYXNlNjQsZW5jb2RlX2Jhc2U2NCIKICAgICAgICAgICAgICAgIG15ICgkTW9kdWxlLCAkRnVuY3Rpb24pID0gc3BsaXQgLywvLCAkS2V5OwoKICAgICAgICAgICAgICAgIGlmICggJE1haW5PYmplY3QtPlJlcXVpcmUoICRNb2R1bGUgKSApIHsKICAgICAgICAgICAgICAgICAgICBteSAkQ29kZSA9ICRNb2R1bGUtPmNhbiggJEZ1bmN0aW9uICk7CiAgICAgICAgICAgICAgICAgICAgJERCVmFsICAgPSAkQ29kZS0+KCAkU2VsZiwgJEtleSwgJUFydGljbGUgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gUCAuICc6Ok1hcEZpZWxkczogQ291bGQgbm90IGxvYWQgJyAuICRNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57RGVidWd9ICkgewogICAgICAgICAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gUCAuICI6Ok1hcEZpZWxkczogY2FsbCB0byAnJEZ1bmN0aW9uJyByZXN1bHRpbmcgaW4gJERCVmFsXG4iLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJERCVmFsICkgewogICAgICAgICAgICAgICAgaWYgKCAkSXNBRGF0ZSA9PSAxICkgewogICAgICAgICAgICAgICAgICAgICREQlZhbCA9ICRTZWxmLT5EYXRlRm9ybWF0VHJhbnNmb3JtKCAkRGF0ZUZvcm1hdCwgJERCVmFsICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCAkSXNBRGF0ZVRpbWUgPT0gMSApIHsKICAgICAgICAgICAgICAgICAgICAkREJWYWwgPSAkU2VsZi0+RGF0ZUZvcm1hdFRyYW5zZm9ybSggJERhdGVUaW1lRm9ybWF0LCAkREJWYWwgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57RGVidWd9ICkgewogICAgICAgICAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gUCAuICI6Ok1hcEZpZWxkczogZ290IG1hcHBlZCB2YWx1ZToga3ByZWZpeCxrZXksdnByZWZpeCx2YWwsZGJ2YWwgOiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIkS1ByZWZpeCwkS2V5LCRWUHJlZml4LCRWYWx1ZSwkREJWYWxcbiIsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoICRWUHJlZml4IGVxICdzdGQnICkgewogICAgICAgICAgICAgICAgICAgICRGaWVsZHMtPnskVmFsdWV9ID0gJERCVmFsOwoKICAgICAgICAgICAgICAgICAgICBpZiAoICRWYWx1ZSA9fiBtezp9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBteSAoJEtleSwgJFN1YmtleSkgPSBzcGxpdCAvOi8sICRWYWx1ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRSZWZUeXBlID0gcmVmICREQlZhbDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkUmVmVHlwZSAmJiAkUmVmVHlwZSBlcSAnQVJSQVknICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJERCVmFsID0gJERCVmFsLT5bMF0tPnt2YWx1ZX07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAkUmVmVHlwZSAmJiAkUmVmVHlwZSBlcSAnSEFTSCcgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkREJWYWwgPSAkREJWYWwtPnt2YWx1ZX07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICRGaWVsZHMtPnskS2V5fSA9IHsgJFN1YmtleSA9PiAkREJWYWwgfTsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlICRGaWVsZHMtPnskVmFsdWV9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJFZQcmVmaXggZXEgJ2N1c3QnICkgewogICAgICAgICAgICAgICAgICAgIGlmICggJEpJUkFGaWVsZHMtPnskVmFsdWV9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkVmFsdWUgPSAkSklSQUZpZWxkcy0+eyRWYWx1ZX07CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkRmllbGRzLT57ImN1c3RvbWZpZWxkXyIgLiAkVmFsdWV9ID0gJERCVmFsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkVlByZWZpeCBlcSAnY2FsbCcgKSB7CgogICAgICAgICAgICAgICAgICAgICMgY2FsbHMgbXVzdCBiZSBzcGVjaWZpZWQgYXMgdGhpczogZS5nLiAiTUlNRTo6QmFzZTY0LGVuY29kZV9iYXNlNjQiCiAgICAgICAgICAgICAgICAgICAgbXkgKCRNb2R1bGUsICRGdW5jdGlvbikgPSBzcGxpdCAvLC8sICRLZXk7CgogICAgICAgICAgICAgICAgICAgIG15ICRSZXMgPSAwOwogICAgICAgICAgICAgICAgICAgIGlmICggJE1haW5PYmplY3QtPlJlcXVpcmUoICRNb2R1bGUgKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJENvZGUgPSAkTW9kdWxlLT5jYW4oICRGdW5jdGlvbiApOwogICAgICAgICAgICAgICAgICAgICAgICAkUmVzICAgICA9ICRDb2RlLT4oICRTZWxmLCAkREJWYWwsICRGaWVsZHMsICVBcnRpY2xlICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gUCAuICc6Ok1hcEZpZWxkczogQ291bGQgbm90IGxvYWQgJyAuICRNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfSAKCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0RlYnVnfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+IFAgLiAiOjpNYXBGaWVsZHM6IGNhbGwgdG8gJyRGdW5jdGlvbicgcmVzdWx0aW5nIGluICRSZXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJFNlbGYtPntEZWJ1Z30gKSB7CiAgICAgICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiBQIC4gIjo6TWFwRmllbGRzOiBza2lwcGluZzoga3ByZWZpeCxrZXksdnByZWZpeCx2YWwsZGJ2YWwgOiAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiRLUHJlZml4LCRLZXksJFZQcmVmaXgsJFZhbHVlLCREQlZhbFxuIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgaWYgKCAkU2VsZi0+e0RlYnVnfSApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+IFAgLiAiOjpNYXBGaWVsZHM6IGZpZWxkczogIiAuICRNYWluT2JqZWN0LT5EdW1wKCRGaWVsZHMpIC4gIlxuIiwKICAgICAgICApOwogICAgfQoKICAgICRGaWVsZHMgPSAkU2VsZi0+Q2hlY2tGaWVsZFR5cGVzKCAkRmllbGRzICk7CgogICAgaWYgKCAkU2VsZi0+e0RlYnVnfSApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+IFAgLiAiOjpNYXBGaWVsZHM6IGZpZWxkcyAoYWZ0ZXIgdHlwZSBjaGVjayk6ICIgLiAkTWFpbk9iamVjdC0+RHVtcCgkRmllbGRzKSAuICJcbiIsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gJEZpZWxkczsKfQoKPWl0ZW0gRGF0ZUZvcm1hdFRyYW5zZm9ybQoKVGhpcyBmdW5jdGlvbiB0cmFuc2Zvcm1zIHRoZSBkYXRlIHZhbHVlIG9mIGEgb3RycyAoZHluYW1pYy9zdGFuZGFyZCkgZmllbGQgdG8gdGhlIEppcmEgZm9ybWF0LgoKSXQgcmVjZWl2ZXMgdGhlIGN1cnJlbnQgZm9ybWF0IGZyb20gdGhlIHJ1bm5pbmcgc3lzdGVtLgoKICBteSAkVmFsdWUxID0gJFNlbGYtPkRhdGVGb3JtYXRUcmFuc2Zvcm0oJyVkLyViLyV5ICVJOiVNICVwJywgICAnMjAwNC0wOC0xNCAyMjo0NTowMCcpCgpyZXR1cm5zIAoKICAxNC9BdWcvMDQgMTA6MDUgUE0KCm9yIEM8dW5kZWY+IHVwb24gZmFpbHVyZQoKPWN1dAoKc3ViIERhdGVGb3JtYXRUcmFuc2Zvcm0gewogICAgbXkgKCRTZWxmLCAkRGF0ZUZvcm1hdCwgJERhdGUpID0gQF87CgogICAgaWYgKCAhZGVmaW5lZCgkRGF0ZSkgfHwgKCAkRGF0ZSBlcSAiIiApICkgewogICAgICAgIHJldHVybiB1bmRlZjsKICAgIH0KCiAgICBpZiAoIGxlbmd0aCAkRGF0ZSA8IDExICkgewogICAgICAgICREYXRlIC49ICcgMDA6MDA6MDAnOwogICAgfQoKICAgIG15ICRUaW1lID0gVGltZTo6UGllY2UtPnN0cnB0aW1lKCAkRGF0ZSwgJyVZLSVtLSVkICVIOiVNOiVTJyApOwogICAgaWYgKCAhICRUaW1lICkgewogICAgICAgIHJldHVybiB1bmRlZjsKICAgIH0KCiAgICByZXR1cm4gJFRpbWUtPnN0cmZ0aW1lKCclWS0lbS0lZFQlSDolTTolUy4wMDArMDAwMCcpOwp9Cgo9aXRlbSBDaGVja0ZpZWxkVHlwZXMKClRoaXMgZnVuY3Rpb24gZW5zdXJlcyB0aGF0IHRoZSBkYXRhIHRyYW5zZmVyZWQgdG8gdGhlIEppcmEgc3lzdGVtIGhhdmUgdGhlIGNvcnJlY3QgdHlwZS4KRS5nLiBmaWVsZHMgb2YgdHlwZSAibGFiZWxzIiBoYXZlIHRvIGJlIGFuIGFycmF5IG9mIHN0cmluZyBldGMuCgpPbiBNYXJjaCAxMHRoLCAyMDE1IHdlIGFncmVlZCBvbiB0aG9zZSByZXN0cmljdGlvbnM6Cgo9b3ZlciA0Cgo9aXRlbSAqIEZvciBmaWVsZHMgb2YgdHlwZSAidXNlciIgdGhlICJ1c2VybmFtZSIgaXMgc2V0Cgo9aXRlbSAqIEZvciBmaWVsZHMgb2YgdHlwZSAic2VsZWN0IiBhbmQgdGhlIGxpa2UgdGhlIHZhbHVlIGlzIHNldAoKPWl0ZW0gKiBCZXNpZGUgY3VzdG9tZmllbGR0eXBlcyBvbmx5IHR5cGUgInVzZXIiIGlzIHN1cHBvcnRlZCBhdCB0aGUgbW9tZW50Cgo9YmFjawoKPWN1dAoKc3ViIENoZWNrRmllbGRUeXBlcyB7CiAgICBteSAoJFNlbGYsICRGaWVsZHMpID0gQF87CgogICAgbXkgJExvZ09iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CiAgICBteSAkTWFpbk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyk7CgogICAgbXkgJUZpZWxkc0NvcHkgPSAleyRGaWVsZHN9OwoKICAgIG15ICRGaWVsZHNJbmZvID0gJFNlbGYtPkZpZWxkc0dldCgKICAgICAgICBSZXR1cm4gPT4gJ1R5cGVzJywKICAgICk7CgogICAgbXkgJFN0YW5kYXJkRmllbGRzID0gJFNlbGYtPkZpZWxkc0dldCgKICAgICAgICBSZXR1cm4gPT4gJ1N0YW5kYXJkJywKICAgICk7CgogICAgbXkgJURpc3BhdGNoID0gKAogICAgICAgIHN0cmluZyAgICAgICAgICA9PiBbIFwmX1N0cmluZywgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICB1cmwgICAgICAgICAgICAgPT4gWyBcJl9TdHJpbmcsICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgYXJyYXkgICAgICAgICAgID0+IFsgXCZfQXJyYXksICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgIGxhYmVscyAgICAgICAgICA9PiBbIFwmX0FycmF5LCAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICBjYXNjYWRpbmdzZWxlY3QgPT4gWyBcJl9BcnJheSwgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgbXVsdGljaGVja2JveGVzID0+IFsgXCZfQXJyYXksICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgIHVzZXIgICAgICAgICAgICA9PiBbIFwmX0dlbmVyaWMsICAgICAgICduYW1lJywgICAgXSwKICAgICAgICB1c2VycGlja2VyICAgICAgPT4gWyBcJl9HZW5lcmljLCAgICAgICAnbmFtZScsICAgIF0sCiAgICAgICAgc2VsZWN0ICAgICAgICAgID0+IFsgXCZfR2VuZXJpYywgICAgICAgJ3ZhbHVlJyAgICBdLAogICAgICAgIG11bHRpc2VsZWN0ICAgICA9PiBbIFwmX0FycmF5T2ZIYXNoZXMsICd2YWx1ZScgICAgXSwKICAgICAgICByYWRpb2J1dHRvbnMgICAgPT4gWyBcJl9HZW5lcmljLCAgICAgICAndmFsdWUnICAgIF0sCiAgICAgICAgbnVtYmVyICAgICAgICAgID0+IFsgXCZfTnVtYmVyLCAgICAgICAgICAgICAgICAgICBdLAogICAgICAgIGZsb2F0ICAgICAgICAgICA9PiBbIFwmX051bWJlciwgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICBkYXRldGltZSAgICAgICAgPT4gWyBcJl9EYXRldGltZSwgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgZGF0ZSAgICAgICAgICAgID0+IFsgXCZfRGF0ZXRpbWUsICAgICAgJ3Nob3J0JywgICBdLAogICAgICAgIGRhdGVwaWNrZXIgICAgICA9PiBbIFwmX0RhdGV0aW1lLCAgICAgICdzaG9ydCcsICAgXSwKICAgICAgICB0ZXh0YXJlYSAgICAgICAgPT4gWyBcJl9TdHJpbmcsICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgdGV4dGZpZWxkICAgICAgID0+IFsgXCZfU3RyaW5nLCAgICAgICAgICAgICAgICAgICBdLAogICAgICAgIGRlZmF1bHQgICAgICAgICA9PiBbIFwmX1N0cmluZywgICAgICAgICAgICAgICAgICAgXSwKICAgICk7CgogICAgRklFTEQ6CiAgICBmb3IgbXkgJEZpZWxkICgga2V5cyAlRmllbGRzQ29weSApIHsKCiAgICAgICAgbmV4dCBpZiBmaXJzdHsgJEZpZWxkIGVxICRfIH1AeyAkU3RhbmRhcmRGaWVsZHMgfHwgW3F3KHByb2plY3QgaXNzdWV0eXBlIHJlcG9ydGVyIGFzc2lnbmVlKV0gfTsKCiAgICAgICAgbXkgJFNjaGVtYSA9ICRGaWVsZHNJbmZvLT57JEZpZWxkfTsKICAgICAgICBteSAkUmVmICAgID0gcmVmICRGaWVsZHNDb3B5eyRGaWVsZH07CiAgICAgICAgbXkgJFR5cGUgICA9ICRTY2hlbWEtPntjdXN0b219IHx8ICRTY2hlbWEtPnt0eXBlfTsKCiAgICAgICAgaWYgKCAkVHlwZSAmJiBpbmRleCggJFR5cGUsICc6JyApICE9IC0xICkgewogICAgICAgICAgICAkVHlwZSA9IChzcGxpdCAvOi8sICRUeXBlKVstMV07CiAgICAgICAgfQoKICAgICAgICAjIHN0cmluZyBpcyByZXF1aXJlZCBhbmQgaXQgaXMgYWxyZWFkeSBhIHN0cmluZyAtIG5vIHRyYW5zZm9ybWF0aW9uIHJlcXVpcmVkCiAgICAgICAgbmV4dCBGSUVMRCBpZiAkVHlwZSBlcSAnc3RyaW5nJyAmJiAhJFJlZjsKCiAgICAgICAgIyBhcnJheSBpcyByZXF1aXJlZCBhbmQgaXQgaXMgYWxyZWFkeSBhbiBhcnJheSAtIG5vIHRyYW5zZm9ybWF0aW9uIHJlcXVpcmVkCiAgICAgICAgbmV4dCBGSUVMRCBpZiAkVHlwZSBlcSAnYXJyYXknICYmICRSZWYgJiYgJFJlZiBlcSAnQVJSQVknOwoKICAgICAgICBteSBAU3ViUGFyYW1zID0gQHsgJERpc3BhdGNoeyRUeXBlfSB8fCAkRGlzcGF0Y2h7ZGVmYXVsdH0gfTsKICAgICAgICBteSAkU3ViICAgICAgID0gc2hpZnQgQFN1YlBhcmFtczsKCiAgICAgICAgaWYgKCAkU2VsZi0+e0RlYnVnfSApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+IFAgLiAiOjpDaGVja0ZpZWxkVHlwZXM6ICIgLiAkTWFpbk9iamVjdC0+RHVtcChbCiAgICAgICAgICAgICAgICAgICAgJEZpZWxkc0NvcHl7JEZpZWxkfSwgJEZpZWxkLCAkUmVmLCAkU2NoZW1hLCAkVHlwZSwgIiRTdWIiLCBcQFN1YlBhcmFtcwogICAgICAgICAgICAgICAgXSkgLiAiXG4iLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbmV4dCBGSUVMRCBpZiAhJFN1YjsKCiAgICAgICAgJEZpZWxkc0NvcHl7JEZpZWxkfSA9ICRTZWxmLT4kU3ViKCAkRmllbGRzQ29weXskRmllbGR9LCAkUmVmLCBAU3ViUGFyYW1zICk7CiAgICB9CgogICAgcmV0dXJuIFwlRmllbGRzQ29weTsKfQoKc3ViIF9TdHJpbmcgewogICAgbXkgKCRTZWxmLCAkVmFsdWUsICRSZWYpID0gQF87CgogICAgaWYgKCAkUmVmIGVxICdIQVNIJyApIHsKICAgICAgICBteSAoJEtleSkgPSBzb3J0IGtleXMgJXskVmFsdWV9OwogICAgICAgIHJldHVybiAkVmFsdWUtPnskS2V5fTsKICAgIH0KICAgIGVsc2lmICggJFJlZiBlcSAnQVJSQVknICkgewogICAgICAgIHJldHVybiBqb2luICcsICcsIEB7JFZhbHVlfTsKICAgIH0KCiAgICByZXR1cm4gIiRWYWx1ZSI7Cn0KCnN1YiBfQXJyYXkgewogICAgbXkgKCRTZWxmLCAkVmFsdWUsICRSZWYpID0gQF87CgogICAgaWYgKCAkUmVmIGVxICdIQVNIJyApIHsKICAgICAgICBteSAoJEtleSkgPSBzb3J0IGtleXMgJXskVmFsdWV9OwogICAgICAgIHJldHVybiBbICRWYWx1ZS0+eyRLZXl9IF07CiAgICB9CgogICAgcmV0dXJuIFsgJFZhbHVlIF07Cn0KCnN1YiBfQXJyYXlPZkhhc2hlcyB7CiAgICBteSAoJFNlbGYsICRWYWx1ZSwgJFJlZiwgJEtleSkgPSBAXzsKCiAgICBteSAkQXJyYXlSZWYgPSBbXTsKCiAgICBpZiAoICFyZWYgJFZhbHVlICkgewogICAgICAgIHB1c2ggQHskQXJyYXlSZWZ9LCAreyAkS2V5ID0+ICRWYWx1ZSB9OwogICAgfQoKICAgIGlmICggJFJlZiBlcSAnQVJSQVknICkgewogICAgICAgIGZvciBteSAkSXRlbSAoIEB7ICRWYWx1ZSB8fCBbXSB9ICkgewogICAgICAgICAgICBpZiAoICFyZWYgJEl0ZW0gKSB7CiAgICAgICAgICAgICAgICBwdXNoIEB7ICRBcnJheVJlZn0sICt7ICRLZXkgPT4gJEl0ZW0gfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoIHJlZiAkSXRlbSBlcSAnSEFTSCcgKSB7CiAgICAgICAgICAgICAgICBwdXNoIEB7ICRBcnJheVJlZn0sICRJdGVtOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkQXJyYXlSZWY7Cn0KCnN1YiBfR2VuZXJpYyB7CiAgICBteSAoJFNlbGYsICRWYWx1ZSwgJFJlZiwgJEtleSkgPSBAXzsKCiAgICBpZiAoICRSZWYgZXEgJ0hBU0gnICkgewogICAgICAgIGlmICggIWV4aXN0cyAkVmFsdWUtPnskS2V5fSApIHsKICAgICAgICAgICAgbXkgKCRFeGlzdGluZ0tleSkgPSBzb3J0IGtleXMgJXskVmFsdWV9OwogICAgICAgICAgICAkVmFsdWUgPSAkVmFsdWUtPnskRXhpc3RpbmdLZXl9OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFZhbHVlID0gJFZhbHVlLT57JEtleX07CiAgICAgICAgfQoKICAgICAgICBpZiAoICFkZWZpbmVkICRWYWx1ZSApIHsKICAgICAgICAgICAgcmV0dXJuIHVuZGVmOwogICAgICAgICAgICByZXR1cm4gK3sgc2V0ID0+IHVuZGVmIH07CiAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCAkUmVmIGVxICdBUlJBWScgKSB7CiAgICAgICAgcmV0dXJuICt7ICRLZXkgPT4gam9pbiAnLCAnLCBAeyRWYWx1ZX0gfTsKICAgIH0KCiAgICByZXR1cm4gK3sgJEtleSA9PiAiJFZhbHVlIiB9Owp9CgpzdWIgX051bWJlciB7CiAgICBteSAoJFNlbGYsICRWYWx1ZSwgJFJlZikgPSBAXzsKCiAgICBteSAkVmFsdWVDb3B5ID0gJFZhbHVlOwogICAgaWYgKCAkUmVmIGVxICdIQVNIJyApIHsKICAgICAgICBteSAoJEtleSkgPSBzb3J0IGtleXMgJXskVmFsdWV9OwogICAgICAgICRWYWx1ZUNvcHkgPSAkVmFsdWUtPnskS2V5fTsKICAgIH0KICAgIGVsc2lmICggJFJlZiBlcSAnQVJSQVknICkgewogICAgICAgICRWYWx1ZUNvcHkgPSBqb2luICcsICcsIEB7JFZhbHVlfTsKICAgIH0KCiAgICBpZiAoICEgbG9va3NfbGlrZV9udW1iZXIoICRWYWx1ZUNvcHkgKSApIHsKCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUcnkgdG8gY2FzdCAkVmFsdWVDb3B5IHRvIGEgbnVtYmVyIiwKICAgICAgICApOwoKICAgICAgICBubyB3YXJuaW5ncyAnbnVtZXJpYyc7CiAgICAgICAgJFZhbHVlQ29weSArPSAwOwogICAgfQoKICAgIHJldHVybiAkVmFsdWVDb3B5Owp9CgpzdWIgX0RhdGV0aW1lIHsKICAgIG15ICgkU2VsZiwgJFZhbHVlLCAkUmVmLCAkVHlwZSkgPSBAXzsKCiAgICBteSAkVmFsdWVDb3B5ID0gJFZhbHVlOwogICAgaWYgKCAkUmVmIGVxICdIQVNIJyApIHsKICAgICAgICBteSAoJEtleSkgPSBzb3J0IGtleXMgJXskVmFsdWV9OwogICAgICAgICRWYWx1ZUNvcHkgPSAkVmFsdWUtPnskS2V5fTsKICAgIH0KICAgIGVsc2lmICggJFJlZiBlcSAnQVJSQVknICkgewogICAgICAgICRWYWx1ZUNvcHkgPSBqb2luICcgJywgQHskVmFsdWV9OwogICAgfQoKICAgIG15ICVSZWdleGVzID0gKAogICAgICAgICdMb25nJyAgPT4gcXIvWzAtOV17NH0tWzAtOV17Mn0tWzAtOV17Mn1UWzAtOV17Mn06WzAtOV17Mn06WzAtOV17Mn1cLlswLTldK1wrWzAtOV0rLywKICAgICAgICAnU2hvcnQnID0+IHFyL1swLTldezR9LVswLTldezJ9LVswLTldezJ9LywKICAgICk7CgogICAgI215ICRSZWdleCA9ICRSZWdleGVzeyRUeXBlfSB8fCAkUmVnZXhlc3tMb25nfTsKICAgIG15ICRSZWdleCA9ICRSZWdleGVze0xvbmd9OwoKICAgIGlmICggJFZhbHVlQ29weSAhfiAkUmVnZXggKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkVmFsdWVDb3B5IGlzIG5vdCBhIGRhdGUiLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICRWYWx1ZUNvcHk7Cn0KCj1pdGVtIFRoaXMgZnVuY3Rpb24gY2FsbHMgSmlyYSBhbiBxdWVyaWVzIHRoZSBsaWNlbnNlIHN0YXR1cyBmb3IgdGhpcyBpbnN0YWxsYXRpb24uCgpteSAkc3RhdHVzID0gJFNlbGYtPkNoZWNrVmFsaWRMaWNlbnNlKCk7CgpyZXR1cm5zOgoKMCB1cG9uIGZhaWx1cmUKMSB1cG9uIHZhbGlkIGxpY2Vuc2UKMiB1cG9uIGV4cGlyZWQgbGljZW5zZQoKPWN1dAoKc3ViIENoZWNrVmFsaWRMaWNlbnNlIHsKICAgIG15ICgkU2VsZikgPSBAXzsKCiMgICAgcmV0dXJuIDE7CgogICAgbXkgJExvZ09iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgIG15ICRDb25maWcgPSAkU2VsZi0+e0NvbmZpZ307CgogICAgbXkgJFVSTCAgICAgID0gJENvbmZpZy0+e1VSTH07CiAgICBteSAkVXNlciAgICAgPSAkQ29uZmlnLT57VXNlcn07CiAgICBteSAkUGFzc3dvcmQgPSAkQ29uZmlnLT57UGFzc3dvcmR9OwoKICAgICMjIG1heWJlIG1vdmUgdGhpcyBpbnRvIGEgc3ViCiAgICBteSAkSGVhZGVycyA9IHsKICAgICAgICBBY2NlcHQgICAgICAgID0+ICdhcHBsaWNhdGlvbi9qc29uJywKIyBUaGUgbGF0dGVyIGhhcyBiZWVuIGRpc2FibGVkIGR1ZSB0byBPVFJTSklSQS04MQojICAgICAgICAgICAgQXV0aG9yaXphdGlvbiA9PiAnQmFzaWMgJwojICAgICAgICAgICAgICAuIGVuY29kZV9iYXNlNjQoICR1c2VyIC4gJzonIC4gJHBhc3N3b3JkICksCiAgICAgICAgIkNvbnRlbnQtdHlwZSIgPT4gJ2FwcGxpY2F0aW9uL2pzb24nLAogICAgfTsKCiAgICBteSAkQ2xpZW50ID0gUkVTVDo6Q2xpZW50LT5uZXcoKTsKICAgICRDbGllbnQtPnNldEZvbGxvdygxKTsKCiAgICBteSAkVmVyaWZ5U1NMID0gJENvbmZpZ09iamVjdC0+R2V0KCdKSVJBOjpTU0xWZXJpZnknKTsKCiAgICBpZiAoICEkVmVyaWZ5U1NMICkgewogICAgICAgIG15ICRMb2FkZWQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKAogICAgICAgICAgICAnTmV0OjpTU0xlYXknLAogICAgICAgICAgICBTaWxlbnQgPT4gMSwKICAgICAgICApOwogICAgICAgIGlmICgkTG9hZGVkKSB7CiAgICAgICAgICAgICRDbGllbnQtPmdldFVzZXJhZ2VudCgpLT5zc2xfb3B0cyggdmVyaWZ5X2hvc3RuYW1lID0+IDAgKTsKICAgICAgICAgICAgJENsaWVudC0+Z2V0VXNlcmFnZW50KCktPnNzbF9vcHRzKCBTU0xfdmVyZml5X21vZGUgPT4gTmV0OjpTU0xlYXk6OlZFUklGWV9OT05FKCkgKTsKICAgICAgICB9CiAgICB9CgogICAgbXkgKCRQcm90bywgdW5kZWYsICRIb3N0LCBAQmFzZVVSTCApID0gc3BsaXQgJy8nLCAkVVJMOwogICAgbXkgJEdldFVSTCA9ICcvJy4gam9pbignLycsIEBCYXNlVVJMKSAuICcvcmVzdC9vdHJzMmppcmEvMS4wL2luZm8nOwoKICAgICRHZXRVUkwgPX4gc3svL317L31nOwogICAgJENsaWVudC0+c2V0SG9zdCgiJFByb3RvLy8kSG9zdCIpOwogICAgJENsaWVudC0+R0VUKCAkR2V0VVJMLCAkSGVhZGVycyApOwoKIAogICAgaWYgKCAkU2VsZi0+e0RlYnVnfSApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdpbmZvJywKICAgICAgICAgICAgTWVzc2FnZSA9PiAgUCAuICI6OkNoZWNrVmFsaWRMaWNlbnNlOiBSRVNUOiBob3N0ICRQcm90by8vJEhvc3QgZ2V0dXJsICRHZXRVUkwiLAogICAgICAgICk7CgogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2luZm8nLAogICAgICAgICAgICBNZXNzYWdlICA9PiBzcHJpbnRmIFAgLiAiOjpDaGVja1ZhbGlkTGljZW5zZTogUkVTVDogcmVzcG9uc2VDb2RlICVzLCByZXNwb25zZUNvbnRlbnQgJXMiLAogICAgICAgICAgICAgICAgJENsaWVudC0+cmVzcG9uc2VDb2RlKCksCiAgICAgICAgICAgICAgICAkQ2xpZW50LT5yZXNwb25zZUNvbnRlbnQoKSwKICAgICAgICApOwogICAgfQoKICAgICMgVE9ETzogRmVobGVybWVsZHVuZyBhdXNnZWJlbiB3ZW5uIEZlaGxlciBiZWkgZGVyIFZlcmJpbmR1bmcgYXVmdHJpdHQKCiAgICByZXR1cm4gaW50KCRDbGllbnQtPnJlc3BvbnNlQ29udGVudCgpKTsKfQoKc3ViIF9Gb3JtYXRBcnRpY2xlIHsKICAgIG15ICgkU2VsZiwgJVBhcmFtKSA9IEBfOwoKICAgIG15ICRBcnRpY2xlRm9ybWF0ID0gJFBhcmFte0FydGljbGVGb3JtYXR9OwoKICAgIHJldHVybiAnJyBpZiAhZGVmaW5lZCAkQXJ0aWNsZUZvcm1hdDsKCiAgICBteSAkTGF5b3V0T2JqZWN0OwogICAgewogICAgICAgIGxvY2FsICRLZXJuZWw6Ok9NID0gS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXItPm5ldygpOwogICAgICAgICRMYXlvdXRPYmplY3QgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgfQoKICAgIG15ICRUZXh0ID0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlID0+ICRBcnRpY2xlRm9ybWF0LAogICAgICAgIERhdGEgICAgID0+ICRQYXJhbXtBcnRpY2xlfSwKICAgICk7CgogICAgcmV0dXJuICRUZXh0Owp9CgoKMTsKCg==
LS0tCkRlYnVnZ2VyOgogIERlYnVnVGhyZXNob2xkOiBkZWJ1ZwogIFRlc3RNb2RlOiAnMCcKRGVzY3JpcHRpb246IFRpY2tldCBDb25uZWN0b3IgUkVTVApGcmFtZXdvcmtWZXJzaW9uOiA0LjAuNQpQcm92aWRlcjoKICBPcGVyYXRpb246CiAgICBTZXNzaW9uQ3JlYXRlOgogICAgICBEZXNjcmlwdGlvbjogQ3JlYXRlcyBhIFNlc3Npb24KICAgICAgTWFwcGluZ0luYm91bmQ6IHt9CiAgICAgIE1hcHBpbmdPdXRib3VuZDoge30KICAgICAgVHlwZTogU2Vzc2lvbjo6U2Vzc2lvbkNyZWF0ZQogICAgVGlja2V0Q3JlYXRlOgogICAgICBEZXNjcmlwdGlvbjogQ3JlYXRlcyBhIFRpY2tldAogICAgICBNYXBwaW5nSW5ib3VuZDoge30KICAgICAgTWFwcGluZ091dGJvdW5kOiB7fQogICAgICBUeXBlOiBUaWNrZXQ6OlRpY2tldENyZWF0ZQogICAgVGlja2V0R2V0OgogICAgICBEZXNjcmlwdGlvbjogUmV0cmlldmVzIFRpY2tldCBkYXRhCiAgICAgIE1hcHBpbmdJbmJvdW5kOiB7fQogICAgICBNYXBwaW5nT3V0Ym91bmQ6IHt9CiAgICAgIFR5cGU6IFRpY2tldDo6VGlja2V0R2V0CiAgICBUaWNrZXRTZWFyY2g6CiAgICAgIERlc2NyaXB0aW9uOiBTZWFyY2ggZm9yIFRpY2tldHMKICAgICAgTWFwcGluZ0luYm91bmQ6IHt9CiAgICAgIE1hcHBpbmdPdXRib3VuZDoge30KICAgICAgVHlwZTogVGlja2V0OjpUaWNrZXRTZWFyY2gKICAgIFRpY2tldFVwZGF0ZToKICAgICAgRGVzY3JpcHRpb246IFVwZGF0ZXMgYSBUaWNrZXQKICAgICAgTWFwcGluZ0luYm91bmQ6IHt9CiAgICAgIE1hcHBpbmdPdXRib3VuZDoge30KICAgICAgVHlwZTogVGlja2V0OjpUaWNrZXRVcGRhdGUKICBUcmFuc3BvcnQ6CiAgICBDb25maWc6CiAgICAgIEtlZXBBbGl2ZTogJycKICAgICAgTWF4TGVuZ3RoOiAnMTAwMDAwMDAwJwogICAgICBSb3V0ZU9wZXJhdGlvbk1hcHBpbmc6CiAgICAgICAgU2Vzc2lvbkNyZWF0ZToKICAgICAgICAgIFJlcXVlc3RNZXRob2Q6CiAgICAgICAgICAtIFBPU1QKICAgICAgICAgIFJvdXRlOiAvU2Vzc2lvbgogICAgICAgIFRpY2tldENyZWF0ZToKICAgICAgICAgIFJlcXVlc3RNZXRob2Q6CiAgICAgICAgICAtIFBPU1QKICAgICAgICAgIFJvdXRlOiAvVGlja2V0CiAgICAgICAgVGlja2V0R2V0OgogICAgICAgICAgUmVxdWVzdE1ldGhvZDoKICAgICAgICAgIC0gR0VUCiAgICAgICAgICBSb3V0ZTogL1RpY2tldC86VGlja2V0SUQKICAgICAgICBUaWNrZXRTZWFyY2g6CiAgICAgICAgICBSZXF1ZXN0TWV0aG9kOgogICAgICAgICAgLSBHRVQKICAgICAgICAgIFJvdXRlOiAvVGlja2V0CiAgICAgICAgVGlja2V0VXBkYXRlOgogICAgICAgICAgUmVxdWVzdE1ldGhvZDoKICAgICAgICAgIC0gUEFUQ0gKICAgICAgICAgIFJvdXRlOiAvVGlja2V0LzpUaWNrZXRJRAogICAgVHlwZTogSFRUUDo6UkVTVApSZW1vdGVTeXN0ZW06ICcnClJlcXVlc3RlcjoKICBUcmFuc3BvcnQ6CiAgICBUeXBlOiAnJwo=
Ly8gLS0KLy8gSklSQS5BZG1pbldpemFyZC5qcyAtIHByb3ZpZGVzIHRoZSBzcGVjaWFsIG1vZHVsZSBmdW5jdGlvbnMgZm9yIHRoZSBDdXN0b21lcklEIHNlYXJjaAovLyBDb3B5cmlnaHQgKEMpIDIwMTYgUGVybC1TZXJ2aWNlcy5kZSwgaHR0cDovL3Blcmwtc2VydmljZXMuZGUKLy8gLS0KLy8gVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKLy8gdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQovLyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgovLyAtLQoKInVzZSBzdHJpY3QiOwoKdmFyIEpJUkEgPSBKSVJBIHx8IHt9OwoKLyoqCiAqIEBuYW1lc3BhY2UKICogQGV4cG9ydHMgVGFyZ2V0TlMgYXMgSklSQS5BZG1pbldpemFyZAogKiBAZGVzY3JpcHRpb24KICogICAgICBUaGlzIG5hbWVzcGFjZSBjb250YWlucyB0aGUgc3BlY2lhbCBtb2R1bGUgZnVuY3Rpb25zIGZvciB0aGUgc2VhcmNoLgogKi8KSklSQS5BZG1pbldpemFyZCA9IChmdW5jdGlvbiAoVGFyZ2V0TlMpIHsKCiAgICAvKioKICAgICAqIEBmdW5jdGlvbgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRJbnB1dCBJbnB1dCBlbGVtZW50IHRvIGFkZCBhdXRvIGNvbXBsZXRlIHRvCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gU3ViYWN0aW9uIFN1YmFjdGlvbiB0byBleGVjdXRlLCAiU2VhcmNoQ3VzdG9tZXJJRCIgb3IgIlNlYXJjaEN1c3RvbWVyVXNlciIKICAgICAqIEByZXR1cm4gbm90aGluZwogICAgICovCiAgICBUYXJnZXROUy5Jbml0U2VsZWN0ID0gZnVuY3Rpb24gKEZpZWxkTmFtZSkgewogICAgICAgICQoJyMnICsgRmllbGROYW1lKS5iaW5kKCAnY2hhbmdlJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICQoJ2RpdltjbGFzcyo9IicgKyBGaWVsZE5hbWUgKyAnLSJdJykuYWRkQ2xhc3MoJ0hpZGRlbicpOwoKICAgICAgICAgICAgdmFyIFN1YkNsYXNzID0gJCh0aGlzKS52YWwoKTsKCiAgICAgICAgICAgICQoJy4nICsgRmllbGROYW1lICsgJy0nICsgU3ViQ2xhc3MpLnJlbW92ZUNsYXNzKCdIaWRkZW4nKTsKICAgICAgICB9KTsKCiAgICAgICAgJCgnIycgKyBGaWVsZE5hbWUpLnRyaWdnZXIoICdjaGFuZ2UnICk7CiAgICB9OwoKICAgIHJldHVybiBUYXJnZXROUzsKCn0pKCBKSVJBLkFkbWluV2l6YXJkIHx8IHt9ICk7CgoK
Ly8gLS0KLy8gSklSQS5BdXRvY29tcGxldGUuanMgLSBwcm92aWRlcyB0aGUgc3BlY2lhbCBtb2R1bGUgZnVuY3Rpb25zIGZvciB0aGUgQ3VzdG9tZXJJRCBzZWFyY2gKLy8gQ29weXJpZ2h0IChDKSAyMDE2IFBlcmwtU2VydmljZXMuZGUsIGh0dHA6Ly9wZXJsLXNlcnZpY2VzLmRlCi8vIC0tCi8vIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCi8vIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKLy8gZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KLy8gLS0KCiJ1c2Ugc3RyaWN0IjsKCnZhciBKSVJBID0gSklSQSB8fCB7fTsKCi8qKgogKiBAbmFtZXNwYWNlCiAqIEBleHBvcnRzIFRhcmdldE5TIGFzIEpJUkEuQXV0b2NvbXBsZXRlCiAqIEBkZXNjcmlwdGlvbgogKiAgICAgIFRoaXMgbmFtZXNwYWNlIGNvbnRhaW5zIHRoZSBzcGVjaWFsIG1vZHVsZSBmdW5jdGlvbnMgZm9yIHRoZSBzZWFyY2guCiAqLwpKSVJBLkF1dG9jb21wbGV0ZSA9IChmdW5jdGlvbiAoVGFyZ2V0TlMpIHsKCiAgICAvKioKICAgICAqIEBmdW5jdGlvbgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRJbnB1dCBJbnB1dCBlbGVtZW50IHRvIGFkZCBhdXRvIGNvbXBsZXRlIHRvCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gU3ViYWN0aW9uIFN1YmFjdGlvbiB0byBleGVjdXRlLCAiU2VhcmNoQ3VzdG9tZXJJRCIgb3IgIlNlYXJjaEN1c3RvbWVyVXNlciIKICAgICAqIEByZXR1cm4gbm90aGluZwogICAgICovCiAgICBUYXJnZXROUy5Jbml0ID0gZnVuY3Rpb24gKCRJbnB1dCwgU3ViYWN0aW9uLCBUYXJnZXRGaWVsZCkgewogICAgICAgIHZhciBLZXl3b3JkID0gJ0Fzc2lnbmVlJzsKCiAgICAgICAgaWYgKCBUYXJnZXRGaWVsZCAmJiBUYXJnZXRGaWVsZCAhPSAnJyApIHsKICAgICAgICAgICAgS2V5d29yZCA9IFRhcmdldEZpZWxkOwogICAgICAgIH0KCiAgICAgICAgQ29yZS5VSS5BdXRvY29tcGxldGUuSW5pdCgkSW5wdXQsIGZ1bmN0aW9uIChSZXF1ZXN0LCBSZXNwb25zZSkgewogICAgICAgICAgICAgICAgdmFyIFVSTCA9IENvcmUuQ29uZmlnLkdldCgnQmFzZWxpbmsnKSwgRGF0YSA9IHsKICAgICAgICAgICAgICAgICAgICBBY3Rpb246ICdBZ2VudFRpY2tldEpJUkFEaWFsb2cnLAogICAgICAgICAgICAgICAgICAgIFN1YmFjdGlvbjogU3ViYWN0aW9uLAogICAgICAgICAgICAgICAgICAgIFByb2plY3Q6ICQoJyNQcm9qZWN0JykudmFsKCksCiAgICAgICAgICAgICAgICAgICAgVGVybTogUmVxdWVzdC50ZXJtCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICRJbnB1dC5kYXRhKCdBdXRvQ29tcGxldGVYSFInLCBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKFVSTCwgRGF0YSwgZnVuY3Rpb24gKFJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgIHZhciBEYXRhID0gW107CiAgICAgICAgICAgICAgICAgICAgJElucHV0LnJlbW92ZURhdGEoJ0F1dG9Db21wbGV0ZVhIUicpOwogICAgICAgICAgICAgICAgICAgICQuZWFjaChSZXN1bHQsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLkxhYmVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuVmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgUmVzcG9uc2UoRGF0YSk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgfSwgZnVuY3Rpb24gKEV2ZW50LCBVSSkgewogICAgICAgICAgICAkKCcjJyArIEtleXdvcmQgKS52YWwoVUkuaXRlbS52YWx1ZSk7CiAgICAgICAgICAgICQoJyMnICsgS2V5d29yZCArICdTZWFyY2hGaWVsZCcpLnZhbChVSS5pdGVtLmxhYmVsKTsKICAgICAgICB9LCBLZXl3b3JkICsgJ1NlYXJjaCcpOwogICAgfTsKCiAgICByZXR1cm4gVGFyZ2V0TlM7Cgp9KSggSklSQS5BdXRvY29tcGxldGUgfHwge30gKTsKCgo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAxNSAtIDIwMTggY2F0d29ya3ggR21iSCwgaHR0cDovL2NhdHdvcmt4LmRlCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIHZhcjo6cGFja2FnZXNldHVwOjpKSVJBUGFja2FnZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB1dGY4OwoKdXNlIExpc3Q6OlV0aWwgcXcoZmlyc3QpOwp1c2UgRmlsZTo6QmFzZW5hbWU7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9IHF3KAogICAgS2VybmVsOjpDb25maWcKICAgIEtlcm5lbDo6U3lzdGVtOjpTeXNDb25maWcKICAgIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmljSW50ZXJmYWNlOjpXZWJzZXJ2aWNlCiAgICBLZXJuZWw6OlN5c3RlbTo6WUFNTAogICAgS2VybmVsOjpTeXN0ZW06OlZhbGlkCiAgICBLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkCik7Cgo9aGVhZDEgTkFNRQoKdmFyOjpwYWNrYWdlc2V0dXA6OkpJUkFQYWNrYWdlLnBtIC0gY29kZSB0byBleGNlY3V0ZSBkdXJpbmcgcGFja2FnZSBpbnN0YWxsYXRpb24KCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGZ1bmN0aW9ucwoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gQ29kZUluc3RhbGwoKQoKcnVuIHRoZSBjb2RlIGluc3RhbGwgcGFydAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZUluc3RhbGwoKTsKCj1jdXQKCnN1YiBDb2RlSW5zdGFsbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY3JlYXRlIGR5bmFtaWMgZmllbGRzIAogICAgJFNlbGYtPl9JbnN0YWxsV2Vic2VydmljZSgpOwogICAgJFNlbGYtPl9DcmVhdGVEeW5hbWljRmllbGRzKCk7CiAgICAkU2VsZi0+X0FjdGl2YXRlRHluYW1pY0ZpZWxkcygpOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBDb2RlUmVpbnN0YWxsKCkKCnJ1biB0aGUgY29kZSByZWluc3RhbGwgcGFydAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVJlaW5zdGFsbCgpOwoKPWN1dAoKc3ViIENvZGVSZWluc3RhbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ29kZVVwZ3JhZGUoKQoKcnVuIHRoZSBjb2RlIHVwZ3JhZGUgcGFydAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVVwZ3JhZGUoKTsKCj1jdXQKCnN1YiBDb2RlVXBncmFkZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICRTZWxmLT5fSW5zdGFsbFdlYnNlcnZpY2UoKTsKICAgICRTZWxmLT5fQ3JlYXRlRHluYW1pY0ZpZWxkcygpOwogICAgJFNlbGYtPl9BY3RpdmF0ZUR5bmFtaWNGaWVsZHMoKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ29kZVVuaW5zdGFsbCgpCgpydW4gdGhlIGNvZGUgdW5pbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVVbmluc3RhbGwoKTsKCj1jdXQKCnN1YiBDb2RlVW5pbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9JbnN0YWxsV2Vic2VydmljZSgpCgo9Y3V0CgpzdWIgX0luc3RhbGxXZWJzZXJ2aWNlIHsKICAgIG15ICgkU2VsZiwgJVBhcmFtKSA9IEBfOwoKICAgIG15ICRZQU1MT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OllBTUwnKTsKICAgIG15ICRMb2NhdGlvbiAgID0gam9pbiAnLycsCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdIb21lJyksCiAgICAgICAgcXcvdmFyIEdlbmVyaWNJbnRlcmZhY2UgR2VuZXJpY1RpY2tldENvbm5lY3RvclJFU1QueW1sLzsKCiAgICBteSAkQ29udGVudCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPkZpbGVSZWFkKAogICAgICAgIExvY2F0aW9uID0+ICRMb2NhdGlvbiwKICAgICk7CgogICAgbXkgJEltcG9ydGVkQ29uZmlnID0gJFlBTUxPYmplY3QtPkxvYWQoIERhdGEgPT4gJHskQ29udGVudH0gKTsKCiAgICAjIGRpc3BsYXkgYW55IFlBTUwgZXJyb3IgbWVzc2FnZSBhcyBhIG5vcm1hbCBvdHJzIGVycm9yIG1lc3NhZ2UKICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCRJbXBvcnRlZENvbmZpZykgKSB7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgaWYgaW1wb3J0ZWQgY29uZmlndXJhdGlvbiBoYXMgY3VycmVudCBmcmFtZXdvcmsgdmVyc2lvbiBvdGhlcndpc2UgdXBkYXRlIGl0CiAgICAjaWYgKCAkSW1wb3J0ZWRDb25maWctPntGcmFtZXdvcmtWZXJzaW9ufSBuZSAkU2VsZi0+e0ZyYW1ld29ya1ZlcnNpb259ICkgewogICAgIyAgICAkSW1wb3J0ZWRDb25maWcgPSAkU2VsZi0+X1VwZGF0ZUNvbmZpZ3VyYXRpb24oIENvbmZpZ3VyYXRpb24gPT4gJEltcG9ydGVkQ29uZmlnICk7CiAgICAjfQoKICAgICMgcmVtb3ZlIGZyYW1ld29yayBpbmZvcm1hdGlvbiBzaW5jZSBpcyBub3QgbmVlZGVkIGFueW1vcmUKICAgIGRlbGV0ZSAkSW1wb3J0ZWRDb25maWctPntGcmFtZXdvcmtWZXJzaW9ufTsKCiAgICAjIGdldCB3ZWJzZXJ2aWNlIG5hbWUKICAgIG15ICRXZWJzZXJ2aWNlTmFtZSAgID0gYmFzZW5hbWUgJExvY2F0aW9uOwogICAgbXkgJFdlYnNlcnZpY2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJpY0ludGVyZmFjZTo6V2Vic2VydmljZScpOwoKICAgICMgcmVtb3ZlIGZpbGUgZXh0ZW5zaW9uCiAgICAkV2Vic2VydmljZU5hbWUgPX4gc3tcLlteLl0rJH17fWc7CgogICAgIyBjaGVjayBpZiBuYW1lIGlzIGR1cGxpY2F0ZWQKICAgIG15ICVXZWJzZXJ2aWNlTGlzdCA9IHJldmVyc2UgJXsgJFdlYnNlcnZpY2VPYmplY3QtPldlYnNlcnZpY2VMaXN0KCkgfTsKCiAgICByZXR1cm4gaWYgJFdlYnNlcnZpY2VMaXN0eyAkV2Vic2VydmljZU5hbWUgfTsKCiAgICAjIG90aGVyd2lzZSBzYXZlIGNvbmZpZ3VyYXRpb24gYW5kIHJldHVybiB0byBvdmVydmlldyBzY3JlZW4KICAgIG15ICRTdWNjZXNzID0gJFdlYnNlcnZpY2VPYmplY3QtPldlYnNlcnZpY2VBZGQoCiAgICAgICAgTmFtZSAgICA9PiAkV2Vic2VydmljZU5hbWUsCiAgICAgICAgQ29uZmlnICA9PiAkSW1wb3J0ZWRDb25maWcsCiAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICk7Cn0KCnN1YiBfQ3JlYXRlRHluYW1pY0ZpZWxkcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRWYWxpZE9iamVjdCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKTsKICAgIG15ICREeW5hbWljRmllbGRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyk7CgogICAgbXkgJFZhbGlkSUQgPSAkVmFsaWRPYmplY3QtPlZhbGlkTG9va3VwKAogICAgICAgIFZhbGlkID0+ICd2YWxpZCcsCiAgICApOwoKICAgICMgZ2V0IGFsbCBjdXJyZW50IGR5bmFtaWMgZmllbGRzCiAgICBteSAkRHluYW1pY0ZpZWxkTGlzdCA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgPT4gMCwKICAgICk7CgogICAgIyBnZXQgdGhlIGxpc3Qgb2Ygb3JkZXIgbnVtYmVycyAoaXMgYWxyZWFkeSBzb3J0ZWQpLgogICAgbXkgQER5bmFtaWNmaWVsZE9yZGVyTGlzdDsKICAgIGZvciBteSAkRHluYW1pY2ZpZWxkICggQHskRHluYW1pY0ZpZWxkTGlzdH0gKSB7CiAgICAgICAgcHVzaCBARHluYW1pY2ZpZWxkT3JkZXJMaXN0LCAkRHluYW1pY2ZpZWxkLT57RmllbGRPcmRlcn07CiAgICB9CgogICAgIyBnZXQgdGhlIGxhc3QgZWxlbWVudCBmcm9tIHRoZSBvcmRlciBsaXN0IGFuZCBhZGQgMQogICAgbXkgJE5leHRPcmRlck51bWJlciA9IDE7CiAgICBpZiAoQER5bmFtaWNmaWVsZE9yZGVyTGlzdCkgewogICAgICAgICROZXh0T3JkZXJOdW1iZXIgPSAkRHluYW1pY2ZpZWxkT3JkZXJMaXN0Wy0xXSArIDE7CiAgICB9CgogICAgIyBnZXQgdGhlIGRlZmluaXRpb24gZm9yIGFsbCBkeW5hbWljIGZpZWxkcyBmb3IgSVRTTQogICAgbXkgQER5bmFtaWNGaWVsZHMgPSAkU2VsZi0+X0dldER5bmFtaWNGaWVsZHNEZWZpbml0aW9uKCk7CgogICAgIyBjcmVhdGUgYSBkeW5hbWljIGZpZWxkcyBsb29rdXAgdGFibGUKICAgIG15ICVEeW5hbWljRmllbGRMb29rdXA7CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZCAoIEB7JER5bmFtaWNGaWVsZExpc3R9ICkgewogICAgICAgIG5leHQgaWYgcmVmICREeW5hbWljRmllbGQgbmUgJ0hBU0gnOwogICAgICAgICREeW5hbWljRmllbGRMb29rdXB7ICREeW5hbWljRmllbGQtPntOYW1lfSB9ID0gJER5bmFtaWNGaWVsZDsKICAgIH0KCiAgICAjIGNyZWF0ZSBvciB1cGRhdGUgZHluYW1pYyBmaWVsZHMKICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkIChARHluYW1pY0ZpZWxkcykgewogICAgICAgIG15ICRDcmVhdGVEeW5hbWljRmllbGQ7CgogICAgICAgICMgY2hlY2sgaWYgdGhlIGR5bmFtaWMgZmllbGQgYWxyZWFkeSBleGlzdHMKICAgICAgICBpZiAoIHJlZiAkRHluYW1pY0ZpZWxkTG9va3VweyAkRHluYW1pY0ZpZWxkLT57TmFtZX0gfSBuZSAnSEFTSCcgKSB7CiAgICAgICAgICAgICRDcmVhdGVEeW5hbWljRmllbGQgPSAxOwogICAgICAgIH0KCiAgICAgICAgIyBpZiB0aGUgZmllbGQgZXhpc3RzIGNoZWNrIGlmIHRoZSB0eXBlIG1hdGNoIHdpdGggdGhlIG5lZWRlZCB0eXBlCiAgICAgICAgZWxzaWYgKAogICAgICAgICAgICAkRHluYW1pY0ZpZWxkTG9va3VweyAkRHluYW1pY0ZpZWxkLT57TmFtZX0gfS0+e0ZpZWxkVHlwZX0KICAgICAgICAgICAgbmUgJER5bmFtaWNGaWVsZC0+e0ZpZWxkVHlwZX0KICAgICAgICAgICAgKQogICAgICAgIHsKCiAgICAgICAgICAgICMgcmVuYW1lIHRoZSBmaWVsZCBhbmQgY3JlYXRlIGEgbmV3IG9uZQogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZFVwZGF0ZSgKICAgICAgICAgICAgICAgICV7ICREeW5hbWljRmllbGRMb29rdXB7ICREeW5hbWljRmllbGQtPntOYW1lfSB9IH0sCiAgICAgICAgICAgICAgICBOYW1lICAgPT4gJER5bmFtaWNGaWVsZExvb2t1cHsgJER5bmFtaWNGaWVsZC0+e05hbWV9IH0tPntOYW1lfSAuICdPbGQnLAogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkQ3JlYXRlRHluYW1pY0ZpZWxkID0gMTsKICAgICAgICB9CgogICAgICAgICMgb3RoZXJ3aXNlIGlmIHRoZSBmaWVsZCBleGlzdHMgYW5kIHRoZSB0eXBlIG1hdGNoLCB1cGRhdGUgaXQgdG8gdGhlIElUU00gZGVmaW5pdGlvbgogICAgICAgIGVsc2UgewojICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRVcGRhdGUoCiMgICAgICAgICAgICAgICAgJXskRHluYW1pY0ZpZWxkfSwKIyAgICAgICAgICAgICAgICBJRCAgICAgICAgID0+ICREeW5hbWljRmllbGRMb29rdXB7ICREeW5hbWljRmllbGQtPntOYW1lfSB9LT57SUR9LAojICAgICAgICAgICAgICAgIEZpZWxkT3JkZXIgPT4gJER5bmFtaWNGaWVsZExvb2t1cHsgJER5bmFtaWNGaWVsZC0+e05hbWV9IH0tPntGaWVsZE9yZGVyfSwKIyAgICAgICAgICAgICAgICBWYWxpZElEICAgID0+ICRWYWxpZElELAojICAgICAgICAgICAgICAgIFJlb3JkZXIgICAgPT4gMCwKIyAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiMgICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiBuZXcgZmllbGQgaGFzIHRvIGJlIGNyZWF0ZWQKICAgICAgICBpZiAoJENyZWF0ZUR5bmFtaWNGaWVsZCkgewogICAgICAgICAgICAjIGNyZWF0ZSBhIG5ldyBmaWVsZAogICAgICAgICAgICBteSAkRmllbGRJRCA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZEFkZCgKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJER5bmFtaWNGaWVsZC0+e05hbWV9LAogICAgICAgICAgICAgICAgTGFiZWwgICAgICA9PiAkRHluYW1pY0ZpZWxkLT57TGFiZWx9LAogICAgICAgICAgICAgICAgRmllbGRPcmRlciA9PiAkTmV4dE9yZGVyTnVtYmVyLAogICAgICAgICAgICAgICAgRmllbGRUeXBlICA9PiAkRHluYW1pY0ZpZWxkLT57RmllbGRUeXBlfSwKICAgICAgICAgICAgICAgIE9iamVjdFR5cGUgPT4gJER5bmFtaWNGaWVsZC0+e09iamVjdFR5cGV9LAogICAgICAgICAgICAgICAgQ29uZmlnICAgICA9PiAkRHluYW1pY0ZpZWxkLT57Q29uZmlnfSwKICAgICAgICAgICAgICAgIFZhbGlkSUQgICAgPT4gJFZhbGlkSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRmllbGRJRDsKCiAgICAgICAgICAgICMgaW5jcmVhc2UgdGhlIG9yZGVyIG51bWJlcgogICAgICAgICAgICAkTmV4dE9yZGVyTnVtYmVyKys7CiAgICAgICAgfQoKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gX0dldER5bmFtaWNGaWVsZHNEZWZpbml0aW9uKCkKCnJldHVybnMgdGhlIGRlZmluaXRpb24gZm9yIHJlcG9ydGluZyByZWxhdGVkIGR5bmFtaWMgZmllbGRzCgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5fR2V0RHluYW1pY0ZpZWxkc0RlZmluaXRpb24oKTsKCj1jdXQKCnN1YiBfR2V0RHluYW1pY0ZpZWxkc0RlZmluaXRpb24gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGRlZmluZSBhbGwgZHluYW1pYyBmaWVsZHMgZm9yIHJlcG9ydGluZwogICAgbXkgQER5bmFtaWNGaWVsZHMgPSAoCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgID0+ICdKSVJBSXNzdWVJRCcsCiAgICAgICAgICAgIExhYmVsICAgICAgPT4gJ0ppcmEgSXNzdWUgSUQnLAogICAgICAgICAgICBGaWVsZFR5cGUgID0+ICdUZXh0JywKICAgICAgICAgICAgT2JqZWN0VHlwZSA9PiAnVGlja2V0JywKICAgICAgICAgICAgQ29uZmlnICAgICA9PiB7CiAgICAgICAgICAgICAgICBEZWZhdWx0VmFsdWUgID0+ICcnLAogICAgICAgICAgICAgICAgTGluayAgICAgICAgICA9PiAnaHR0cDovL2xvY2FsaG9zdDo4MDgwL2Jyb3dzZS9bJSBEYXRhLkpJUkFJc3N1ZUlEIHwgdXJsICVdJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnQXJ0aWNsZVNlbnRUb0pJUkEnLAogICAgICAgICAgICBMYWJlbCAgICAgID0+ICdBcnRpY2xlIHdhcyBzZW50IHRvIEppcmEnLAogICAgICAgICAgICBGaWVsZFR5cGUgID0+ICdDaGVja2JveCcsCiAgICAgICAgICAgIE9iamVjdFR5cGUgPT4gJ0FydGljbGUnLAogICAgICAgICAgICBDb25maWcgICAgID0+IHsKICAgICAgICAgICAgICAgIERlZmF1bHRWYWx1ZSAgPT4gMCwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgKTsKCiAgICByZXR1cm4gQER5bmFtaWNGaWVsZHM7Cn0KCnN1YiBfQWN0aXZhdGVEeW5hbWljRmllbGRzIHsKICAgIG15ICgkU2VsZiwgJVBhcmFtKSA9IEBfOwoKCiAgICBteSAlTWFwID0gKAogICAgICAgIEpJUkFJc3N1ZUlEID0+IHsKICAgICAgICAgICAgJ1pvb20nICAgICA9PiAxLAogICAgICAgICAgICAnRnJlZVRleHQnID0+IDEsCiAgICAgICAgICAgICdTZWFyY2gnICAgPT4gMSwKICAgICAgICB9LAogICAgKTsKCiAgICBteSAkQ29uZmlnT2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRTeXNDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3lzQ29uZmlnJyk7CgogICAgbXkgQFNldHRpbmdzOwogICAgZm9yIG15ICRGaWVsZCAoIGtleXMgJU1hcCApIHsKICAgICAgICBmb3IgbXkgJFNjcmVlbiAoIGtleXMgJXsgJE1hcHskRmllbGR9IH0gKSB7CiAgICAgICAgICAgIG15ICRGdWxsbmFtZSAgICAgID0gJ1RpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0JyAuICRTY3JlZW47CiAgICAgICAgICAgIG15ICRPcHRpb25zICAgICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCAkRnVsbG5hbWUgKTsKICAgICAgICAgICAgbXkgJE1hcHBpbmcgICAgICAgPSAkT3B0aW9ucy0+e0R5bmFtaWNGaWVsZH0gfHwge307CgogICAgICAgICAgICBteSAlTmV3TWFwcGluZyA9ICgKICAgICAgICAgICAgICAgICV7ICRNYXBwaW5nIH0sCiAgICAgICAgICAgICAgICAkRmllbGQgPT4gJE1hcHskRmllbGR9LT57JFNjcmVlbn0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBwdXNoIEBTZXR0aW5ncywgewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgPT4gIiRGdWxsbmFtZSMjI0R5bmFtaWNGaWVsZCIsCiAgICAgICAgICAgICAgICBFZmZlY3RpdmVWYWx1ZSA9PiBcJU5ld01hcHBpbmcsCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQoKICAgIG15ICRTdWNjZXNzID0gJFN5c0NvbmZpZ09iamVjdC0+U2V0dGluZ3NTZXQoCiAgICAgICAgU2V0dGluZ3MgPT4gXEBTZXR0aW5ncywKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQ+LgoKPWN1dAoK