Terms of use for AVMOO

1. Acceptance of terms of use and amendments

Each time you visit, use or cause access to this site, you agree to be bound by these 'Terms of use', as amended from time to time with or without notice to you. In addition, your usage of services on this site or accessed via this site will be subject to any rules or guidelines applicable to those services, and they will be incorporated by reference within these 'Terms of use'. Please read the site's 'Privacy policy', which is also incorporated within these 'Terms of use' by reference.

2. The site operator's service

This site and the services provided to you on and via this site are provided on an 'AS IS' basis. You agree that the site operator reserves the right to modify or discontinue provision of this site and its services, and to remove the data you provide, either temporarily or permanently, at any time, without notice and without any liability towards you (please see below for information about notice of changes). The site operator will not be held responsible or liable for timeliness, removal of information, failure to store information, inaccuracy of information, or improper delivery of information.

3. Your responsibilities and registration obligations

In order to use this site or certain parts of it, you may be required to register for a user account on this site; in this case, you agree to provide truthful information when requested, and - if a minimum age is required for eligibility for a user account - you undertake that you are of at least the required age. By registering for a user account, you explicitly agree to this site's 'Terms of use' and 'Privacy policy', including any amendments made by the site operator that are published herein.

4. Privacy policy

egistration data and other personally identifiable information that the site may collect is subject to the terms of the site operator's 'Privacy policy'.

5. Registration and password

You are responsible for maintaining the confidentiality of your password, and you will be held responsible for all usage of your user account and/or user name, whether authorised or not authorised by you. You agree to immediately notify the site operator of any unauthorised use of your user account, user name or password.

The site operator may apply the policy of requiring to grant prior approval of a new user account registration before the account is activated and available for logging-in. By registering for an account on this site, you agree that the site operator retains sole discretion regarding the approval of new registrations and the closure of existing accounts, without incurring any liability towards you.

6. Your conduct

You agree that all information or data of any kind, whether text, photographs or graphics, or other materials ('content'), made available publicly or privately, will be under the sole responsibility of the person providing the said content, or of the person whose user account is used. You agree that this site might expose you to content that may be objectionable or offensive. The site operator will not be responsible to you in any way for content provided on this site, nor for any error or omission. However, if you do see content on this site that you feel is offensive or inappropriate, please contact the site administrator.

By using this site or any service provided, you explicitly agree to the following clauses:

- You shall not provide any content or conduct yourself in any way that may be construed as: unlawful; illegal; threatening; harmful; abusive; harassing; stalking; tortious; defamatory; libellous; vulgar; obscene; offensive; objectionable; designed to interfere with or disrupt the operation of this site or any service provided; infected with a virus or other destructive or deleterious programming routine; likely to give rise to civil or criminal liability; in violation of an applicable local, national or international law.

- You shall not impersonate or misrepresent your association with any person or entity.

- You shall not forge or otherwise seek to conceal or misrepresent the origin of any content provided by you.

- You shall not collect or harvest any information about other users.

- You shall not provide, and you shall not use this site to provide, any content or service in any commercial manner, or in any manner that would involve junk mail, spam, chain letters, pyramid schemes, or any other form of unauthorised advertising or commerce.

- You shall not use this site to promote or operate any service or content without the site operator's prior written consent.

- You shall not use this site or any services or facilities provided on this site or via this site to contact and communicate with site users or other persons for any illicit or illegal purpose.

- You shall not provide any content that might give rise to the site operator being held civilly or criminally liable, or that might be considered a violation of any local, national or international law; this notably includes - but is not limited to - laws relating to copyrights, trademarks, patents, or trade secrets.

Failure to comply with any of the clauses of this section 6 of these 'Terms of use' will be considered to be just cause for immediate closure of your user account, and may render you liable to legal action. For more information about user account closure, please refer to the site's 'Privacy policy'.

7. Submission of content on this site

By providing any content to this site, you agree to the following clauses:

- You agree to grant the site operator a worldwide, royalty-free, perpetual, non-exclusive right and licence (including any moral rights or other necessary rights) to use, display, reproduce, modify, adapt, publish, distribute, perform, promote, archive, translate, and to create derivative works and compilations, in whole or in part. Such licence will apply with respect to any form, media or technology already known at the time of provision or developed subsequently.

- You warrant and represent that you have all legal, moral, and other rights that may be necessary to grant the site operator the licence specified in this section 7.

- You acknowledge and agree that the site operator will have every right and full discretion (but no obligation) to refuse to publish, or to remove, or to block access to any content you provide, at any time and for any reason, with or without notice.

8. Third-party services

Goods and services of third parties may be advertised and/or may be made available on or through this site. Products and services provided by third parties will be governed by the policies and representations of these third parties. The site operator will not in any manner be liable for or responsible for any of your dealings or interaction with third parties. Nor will the site operator be liable or responsible in any way for the quality, continuity or satisfactory provision of third-party products and services.

9. Indemnification

You agree to indemnify and hold harmless the site operator and the site operator's representatives, subsidiaries, affiliates, related parties, officers, directors, employees, agents, independent contractors, advertisers, partners, and co-branders, from any claim or demand, including reasonable legal fees, that may be filed by any third party, arising out of your conduct or connection with this site or service, your provision of content, your violation of these 'Terms of use', or any other violation by you of the rights of another person or party.

10. DISCLAIMER OF WARRANTIES

YOU UNDERSTAND AND AGREE THAT YOUR USE OF THIS SITE AND OF ANY SERVICES OR CONTENT PROVIDED (THE 'SERVICE') IS AT YOUR OWN RISK. SERVICES AND CONTENT ARE PROVIDED TO YOU 'AS IS', AND THE SITE OPERATOR EXPRESSLY DISCLAIMS ALL WARRANTIES OF ANY KIND, EITHER IMPLIED OR EXPRESS; THIS INCLUDES (BUT IS NOT LIMITED TO) WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT.

THE SITE OPERATOR OFFERS NO IMPLIED OR EXPRESS WARRANTY THAT ANY PART OF ANY SERVICE WILL BE UNINTERRUPTED, ERROR-FREE, VIRUS-FREE, TIMELY, SECURE, ACCURATE, RELIABLE, OR OF ANY QUALITY. NOR IS IT WARRANTED EITHER IMPLICITLY OR EXPRESSLY THAT ANY CONTENT IS SAFE IN ANY MANNER FOR DOWNLOAD OR USAGE. YOU UNDERSTAND AND AGREE THAT NEITHER THE SITE OPERATOR NOR ANY PARTICIPANT IN A SERVICE PROVIDES PROFESSIONAL ADVICE OF ANY KIND. YOU UNDERSTAND AND AGREE THAT ANY ADVICE OR ANY OTHER INFORMATION OBTAINED VIA THIS SITE MAY BE USED SOLELY AT YOUR OWN RISK, AND THAT THE SITE OPERATOR WILL NOT BE HELD LIABLE IN ANY WAY.

Some jurisdictions may not allow disclaimers of implied warranties, and certain statements in the above disclaimer may not apply to you as regards implied warranties; the other terms and conditions remain enforceable notwithstanding.

11. LIMITATION OF LIABILITY

YOU EXPRESSLY UNDERSTAND AND AGREE THAT THE SITE OPERATOR WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL, CONSEQUENTIAL OR EXEMPLARY DAMAGES (EVEN IF THE SITE OPERATOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES). THIS INCLUDES, BUT IS NOT LIMITED TO, DAMAGES FOR LOSS OF PROFITS, GOODWILL, USE, DATA OR OTHER INTANGIBLE LOSSES RESULTING FROM:

A. THE USE OF SERVICES OR THE INABILITY TO USE SERVICES,

B. THE COST OF OBTAINING SUBSTITUTE GOODS AND/OR SERVICES RESULTING FROM ANY TRANSACTION ENTERED INTO ON THROUGH SERVICES,

C. UNAUTHORISED ACCESS TO OR ALTERATION OF YOUR DATA TRANSMISSIONS,

D. STATEMENTS BY ANY THIRD PARTY OR CONDUCT OF ANY THIRD PARTY USING SERVICES,

E. OR ANY OTHER ISSUE PERTAINING TO SERVICES.

In some jurisdictions, it is not permitted to limit liability and, therefore, such limitations may not apply to you.

12. Reservation of rights

The site operator reserves all of the site operator's rights, including but not limited to any and all copyrights, trademarks, patents, trade secrets, and any other proprietary right that the site operator may have in respect of this site, its content, and goods and services that may be provided. The use of the site operator's rights and property requires the site operator's prior written consent. By making services available to you, the site operator is not providing you with any implied or express licences or rights, and you will have no rights to make any commercial or other unforeseen use of this site or provided services without the site operator's prior written consent.

13. Infringement Policy

AVMOO services permit account holders to post messages on its public forum and are available on the internet. Although AVMOO does not affirmatively screen subscriber posts, AVMOO does not tolerate infringing material on its site.

Pursuant to 17 U.S.C. Section 512 as amended by Title II of the Digital Millennium Copyright Act (the 'Copyright Act'), we reserve the right, but not the obligation, to terminate your license to use this Site if we determine in our sole and absolute discretion that you are involved in infringing activity, including allege acts of first-time or repeat infringement, regardless of whether the material or activity is ultimately determined to be infringing. We accommodate and do not interfere with standard technical measures used by copyright owners to protect their materials. In addition, pursuant to 17 U.S.C. Section 512(c), we have implemented procedures for receiving written notification of claimed infringements and for processing such claims in accordance with the Copyright Act. All claims of infringement must be submitted in a written complaint that complies with the requirements below and delivered to our designated agent to receive notification of claimed infringement by Contact Us

In addition, any written notice regarding any defamatory or infringing activity, whether of a copyright, patent, trademark or other proprietary right, must include the following information:

A physical or electronic signature of a person authorized to act on behalf of the owner of an exclusive right that is allegedly infringed or the person defamed.

Identification of the copyrighted work claimed to have been infringed, or, if multiple copyrighted works at a single website are covered by a single notification, a representative list of such works at that website. Similarly, for materials that are defamatory or infringe patent, trademark, or other proprietary rights of a third party, you must submit a list of such materials. Identification of the material that is claimed to be infringing, to be the subject of infringing activity, or that is claimed to be defamatory and that is to be removed or access to which is to be disabled, and information reasonably sufficient to permit us to locate the material.

Information reasonably sufficient to permit us to contact you, such as your name, address, telephone number, and an e-mail address.

A statement that you have a good faith belief that use of the material, in the manner complained of is not authorized by the copyright or other proprietary right owner, its agent, or the law.

A statement that the information in the notification is accurate, and under penalty of perjury, that you are authorized to act on behalf of the owner of an exclusive right that is allegedly infringed or on behalf of the person defamed.

14. Applicable law

You agree that these 'Terms of use' and any dispute arising out of your use of this site or products or services provided will be governed by and construed in accordance with local laws applicable at the site operator's domicile, notwithstanding any differences between the said applicable legislation and legislation in force at your location. By registering for a user account on this site, or by using this site and the services it provides, you accept that jurisdiction is granted to the courts having jurisdiction over the site operator's domicile, and that any disputes will be heard by the said courts.

15. Changes to these 'Terms of use'

Changes may be made to these 'Terms of use' from time to time. You should be notified of noteworthy changes by one or more of the following means:

A. the posting of an announcement on the site;

B. a requirement to read and accept the new 'Terms of use' before you can log into the site;

C. an e-mail message sent to the e-mail address you provide as part of your user account information.

Nothwithstanding, failure to post notification of changes to the site's 'Terms of use' will in no way invalidate the application of the new or changed clauses of the 'Terms of use', which you are recommended to re-read regularly.

16. Miscellaneous information

A. In the event that any provision of these 'Terms of use' is deemed to conflict with legislation by a court with jurisdiction over the parties, the said provision will be interpreted to reflect the original intentions of the parties in accordance with applicable law, and the remainder of these 'Terms of use' will remain valid and applicable.

B. The failure of either party to assert any right under these 'Terms of use' will not be considered to be a waiver of that party's right, and the said right will remain in full force and effect.

C. You agree that any claim or cause in respect of this site or its services must be filed within one (1) year after such claim or cause arose, or the said claim or cause will be forever barred, without regard to any contrary legislation.

D. The site operator may assign the site operator's rights and obligations under these 'Terms of use'; in this event, the site operator will be relieved of any further obligation.

W3siaWQiOiJhZHN0X2pfUE9QVU5ERVIiLCJhZHNwb3QiOiJqX1BPUFVOREVSIiwid2VpZ2h0IjoiNSIsImZjYXAiOiIyIiwic2NoZWR1bGUiOmZhbHNlLCJtYXhXaWR0aCI6ZmFsc2UsIm1pbldpZHRoIjoiNzY4IiwidGltZXpvbmUiOmZhbHNlLCJleGNsdWRlIjpmYWxzZSwiZG9tYWluIjpmYWxzZSwiY29kZSI6IjxzY3JpcHQgdHlwZT0ndGV4dFwvamF2YXNjcmlwdCcgc3JjPSdodHRwczpcL1wvcGwxMTA1MjUucHVodG1sLmNvbVwvNzBcLzgyXC85Y1wvNzA4MjljMzgyMTZlMWMwNDYxNmFkYjQ2NzJlZGEzNDIuanMnPjxcL3NjcmlwdD4ifSx7ImlkIjoiY2xpY19qX1BPUFVOREVSIiwiYWRzcG90Ijoial9QT1BVTkRFUiIsIndlaWdodCI6IjciLCJmY2FwIjoiMiIsInNjaGVkdWxlIjpmYWxzZSwibWF4V2lkdGgiOmZhbHNlLCJtaW5XaWR0aCI6ZmFsc2UsInRpbWV6b25lIjpmYWxzZSwiZXhjbHVkZSI6ZmFsc2UsImRvbWFpbiI6ZmFsc2UsImNvZGUiOiI8c2NyaXB0IGRhdGEtY2Zhc3luYz1cImZhbHNlXCIgdHlwZT1cInRleHRcL2phdmFzY3JpcHRcIiBzcmM9XCJcL1wvMmNuanVoMzRqYnBvaW50LmNvbVwvdFwvOVwvZnJldFwvbWVvdzRcLzM2OTA4OVwvYnJ0LmpzXCI+PFwvc2NyaXB0PiJ9LHsiaWQiOiJleG9jX2pfUE9QVU5ERVIiLCJhZHNwb3QiOiJqX1BPUFVOREVSIiwid2VpZ2h0IjoiNiIsImZjYXAiOiIyIiwic2NoZWR1bGUiOmZhbHNlLCJtYXhXaWR0aCI6ZmFsc2UsIm1pbldpZHRoIjoiNzY4IiwidGltZXpvbmUiOmZhbHNlLCJleGNsdWRlIjpmYWxzZSwiZG9tYWluIjpmYWxzZSwiY29kZSI6IjxzY3JpcHQgdHlwZT1cImFwcGxpY2F0aW9uXC9qYXZhc2NyaXB0XCI+XHJcbihmdW5jdGlvbigpIHtcclxuXHJcbiAgICBcL1wvdmVyc2lvbiAxLjAuMFxyXG5cclxuICAgIHZhciBhZENvbmZpZyA9IHtcclxuICAgIFwiYWRzX2hvc3RcIjogXCJhLnBlbXNydi5jb21cIixcclxuICAgIFwic3luZGljYXRpb25faG9zdFwiOiBcInMucGVtc3J2LmNvbVwiLFxyXG4gICAgXCJpZHpvbmVcIjogMTAwODA5NCxcclxuICAgIFwicG9wdXBfZmFsbGJhY2tcIjogZmFsc2UsXHJcbiAgICBcInBvcHVwX2ZvcmNlXCI6IGZhbHNlLFxyXG4gICAgXCJjaHJvbWVfZW5hYmxlZFwiOiB0cnVlLFxyXG4gICAgXCJuZXdfdGFiXCI6IGZhbHNlLFxyXG4gICAgXCJmcmVxdWVuY3lfcGVyaW9kXCI6IDcyMCxcclxuICAgIFwiZnJlcXVlbmN5X2NvdW50XCI6IDEsXHJcbiAgICBcInRyaWdnZXJfbWV0aG9kXCI6IDMsXHJcbiAgICBcInRyaWdnZXJfY2xhc3NcIjogXCJcIixcclxuICAgIFwidHJpZ2dlcl9kZWxheVwiOiAwLFxyXG4gICAgXCJvbmx5X2lubGluZVwiOiBmYWxzZVxyXG59O1xyXG5cclxuaWYoIXdpbmRvdy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKXtkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsPWRvY3VtZW50LmJvZHkucXVlcnlTZWxlY3RvckFsbD1PYmplY3QucXVlcnlTZWxlY3RvckFsbD1mdW5jdGlvbiBxdWVyeVNlbGVjdG9yQWxsUG9seWZpbGwocixjLGksaixhKXt2YXIgZD1kb2N1bWVudCxzPWQuY3JlYXRlU3R5bGVTaGVldCgpO2E9ZC5hbGw7Yz1bXTtyPXIucmVwbGFjZShcL1xcW2ZvclxcYlwvZ2ksXCJbaHRtbEZvclwiKS5zcGxpdChcIixcIik7Zm9yKGk9ci5sZW5ndGg7aS0tOyl7cy5hZGRSdWxlKHJbaV0sXCJrOnZcIik7Zm9yKGo9YS5sZW5ndGg7ai0tOyl7YVtqXS5jdXJyZW50U3R5bGUuayYmYy5wdXNoKGFbal0pfXMucmVtb3ZlUnVsZSgwKX1yZXR1cm4gY319dmFyIHBvcE1hZ2ljPXt2ZXJzaW9uOjEsY29va2llX25hbWU6XCJcIix1cmw6XCJcIixjb25maWc6e30sb3Blbl9jb3VudDowLHRvcDpudWxsLGJyb3dzZXI6bnVsbCx2ZW5vcl9sb2FkZWQ6ZmFsc2UsdmVub3I6ZmFsc2UsY29uZmlnVHBsOnthZHNfaG9zdDpcIlwiLHN5bmRpY2F0aW9uX2hvc3Q6XCJcIixpZHpvbmU6XCJcIixmcmVxdWVuY3lfcGVyaW9kOjcyMCxmcmVxdWVuY3lfY291bnQ6MSx0cmlnZ2VyX21ldGhvZDoxLHRyaWdnZXJfY2xhc3M6XCJcIixwb3B1cF9mb3JjZTpmYWxzZSxwb3B1cF9mYWxsYmFjazpmYWxzZSxjaHJvbWVfZW5hYmxlZDp0cnVlLG5ld190YWI6ZmFsc2UsY2F0OlwiXCIsdGFnczpcIlwiLGVsOlwiXCIsc3ViOlwiXCIsc3ViMjpcIlwiLHN1YjM6XCJcIixvbmx5X2lubGluZTpmYWxzZSx0cmlnZ2VyX2RlbGF5OjAsY29va2llY29uc2VudDp0cnVlfSxpbml0OmZ1bmN0aW9uKGNvbmZpZyl7aWYodHlwZW9mIGNvbmZpZy5pZHpvbmU9PT1cInVuZGVmaW5lZFwifHwhY29uZmlnLmlkem9uZSl7cmV0dXJufWlmKHR5cGVvZiBjb25maWdbXCJjdXN0b21UYXJnZXRpbmdcIl09PT1cInVuZGVmaW5lZFwiKXtjb25maWdbXCJjdXN0b21UYXJnZXRpbmdcIl09W119d2luZG93W1wiY3VzdG9tVGFyZ2V0aW5nXCJdPWNvbmZpZ1tcImN1c3RvbVRhcmdldGluZ1wiXXx8bnVsbDt2YXIgY3VzdG9tVGFyZ2V0aW5nPU9iamVjdC5rZXlzKGNvbmZpZ1tcImN1c3RvbVRhcmdldGluZ1wiXSkuZmlsdGVyKGZ1bmN0aW9uKGMpe3JldHVybiBjLnNlYXJjaChcImV4X1wiKT49MH0pO2lmKGN1c3RvbVRhcmdldGluZy5sZW5ndGgpe2N1c3RvbVRhcmdldGluZy5mb3JFYWNoKGZ1bmN0aW9uKGN0KXtyZXR1cm4gdGhpcy5jb25maWdUcGxbY3RdPW51bGx9LmJpbmQodGhpcykpfWZvcih2YXIga2V5IGluIHRoaXMuY29uZmlnVHBsKXtpZighT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuY29uZmlnVHBsLGtleSkpe2NvbnRpbnVlfWlmKHR5cGVvZiBjb25maWdba2V5XSE9PVwidW5kZWZpbmVkXCIpe3RoaXMuY29uZmlnW2tleV09Y29uZmlnW2tleV19ZWxzZXt0aGlzLmNvbmZpZ1trZXldPXRoaXMuY29uZmlnVHBsW2tleV19fWlmKHR5cGVvZiB0aGlzLmNvbmZpZy5pZHpvbmU9PT1cInVuZGVmaW5lZFwifHx0aGlzLmNvbmZpZy5pZHpvbmU9PT1cIlwiKXtyZXR1cm59aWYodGhpcy5jb25maWcub25seV9pbmxpbmUhPT10cnVlKXt0aGlzLmxvYWRIb3N0ZWQoKX10aGlzLmFkZEV2ZW50VG9FbGVtZW50KHdpbmRvdyxcImxvYWRcIix0aGlzLnByZXBhcmVQb3ApfSxnZXRDb3VudEZyb21Db29raWU6ZnVuY3Rpb24oKXtpZighdGhpcy5jb25maWcuY29va2llY29uc2VudCl7cmV0dXJuIDB9dmFyIHNob3duQ29va2llPXBvcE1hZ2ljLmdldENvb2tpZShwb3BNYWdpYy5jb29raWVfbmFtZSk7dmFyIGN0cj10eXBlb2Ygc2hvd25Db29raWU9PT1cInVuZGVmaW5lZFwiPzA6cGFyc2VJbnQoc2hvd25Db29raWUpO2lmKGlzTmFOKGN0cikpe2N0cj0wfXJldHVybiBjdHJ9LGdldExhc3RPcGVuZWRUaW1lRnJvbUNvb2tpZTpmdW5jdGlvbigpe3ZhciBzaG93bkNvb2tpZT1wb3BNYWdpYy5nZXRDb29raWUocG9wTWFnaWMuY29va2llX25hbWUpO3ZhciBkZWxheT1udWxsO2lmKHR5cGVvZiBzaG93bkNvb2tpZSE9PVwidW5kZWZpbmVkXCIpe3ZhciB2YWx1ZT1zaG93bkNvb2tpZS5zcGxpdChcIjtcIilbMV07ZGVsYXk9dmFsdWU+MD9wYXJzZUludCh2YWx1ZSk6MH1pZihpc05hTihkZWxheSkpe2RlbGF5PW51bGx9cmV0dXJuIGRlbGF5fSxzaG91bGRTaG93OmZ1bmN0aW9uKCl7aWYocG9wTWFnaWMub3Blbl9jb3VudD49cG9wTWFnaWMuY29uZmlnLmZyZXF1ZW5jeV9jb3VudCl7cmV0dXJuIGZhbHNlfXZhciBjdHI9cG9wTWFnaWMuZ2V0Q291bnRGcm9tQ29va2llKCk7Y29uc3QgbGFzdF9vcGVuZWRfdGltZT1wb3BNYWdpYy5nZXRMYXN0T3BlbmVkVGltZUZyb21Db29raWUoKTtjb25zdCBjdXJyZW50X3RpbWU9TWF0aC5mbG9vcihEYXRlLm5vdygpXC8xZTMpO2NvbnN0IG1heGltdW1EZWxheVRpbWU9bGFzdF9vcGVuZWRfdGltZStwb3BNYWdpYy5jb25maWcudHJpZ2dlcl9kZWxheTtpZihsYXN0X29wZW5lZF90aW1lJiZtYXhpbXVtRGVsYXlUaW1lPmN1cnJlbnRfdGltZSl7cmV0dXJuIGZhbHNlfXBvcE1hZ2ljLm9wZW5fY291bnQ9Y3RyO3JldHVybiEoY3RyPj1wb3BNYWdpYy5jb25maWcuZnJlcXVlbmN5X2NvdW50KX0sdmVub3JTaG91bGRTaG93OmZ1bmN0aW9uKCl7cmV0dXJuIHBvcE1hZ2ljLnZlbm9yX2xvYWRlZCYmcG9wTWFnaWMudmVub3I9PT1cIjBcIn0sc2V0QXNPcGVuZWQ6ZnVuY3Rpb24oKXt2YXIgbmV3X2N0cj0xO2lmKHBvcE1hZ2ljLm9wZW5fY291bnQhPT0wKXtuZXdfY3RyPXBvcE1hZ2ljLm9wZW5fY291bnQrMX1lbHNle25ld19jdHI9cG9wTWFnaWMuZ2V0Q291bnRGcm9tQ29va2llKCkrMX1jb25zdCBsYXN0X29wZW5lZF90aW1lPU1hdGguZmxvb3IoRGF0ZS5ub3coKVwvMWUzKTtpZihwb3BNYWdpYy5jb25maWcuY29va2llY29uc2VudCl7cG9wTWFnaWMuc2V0Q29va2llKHBvcE1hZ2ljLmNvb2tpZV9uYW1lLGAke25ld19jdHJ9OyR7bGFzdF9vcGVuZWRfdGltZX1gLHBvcE1hZ2ljLmNvbmZpZy5mcmVxdWVuY3lfcGVyaW9kKX19LGxvYWRIb3N0ZWQ6ZnVuY3Rpb24oKXt2YXIgaG9zdGVkU2NyaXB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7aG9zdGVkU2NyaXB0LnR5cGU9XCJhcHBsaWNhdGlvblwvamF2YXNjcmlwdFwiO2hvc3RlZFNjcmlwdC5hc3luYz10cnVlO2hvc3RlZFNjcmlwdC5zcmM9XCJcL1wvXCIrdGhpcy5jb25maWcuYWRzX2hvc3QrXCJcL3BvcHVuZGVyMTAwMC5qc1wiO2hvc3RlZFNjcmlwdC5pZD1cInBvcG1hZ2ljbGRyXCI7Zm9yKHZhciBrZXkgaW4gdGhpcy5jb25maWcpe2lmKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5jb25maWcsa2V5KSl7Y29udGludWV9aWYoa2V5PT09XCJhZHNfaG9zdFwifHxrZXk9PT1cInN5bmRpY2F0aW9uX2hvc3RcIil7Y29udGludWV9aG9zdGVkU2NyaXB0LnNldEF0dHJpYnV0ZShcImRhdGEtZXhvLVwiK2tleSx0aGlzLmNvbmZpZ1trZXldKX12YXIgaW5zZXJ0QW5jaG9yPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiYm9keVwiKS5pdGVtKDApO2lmKGluc2VydEFuY2hvci5maXJzdENoaWxkKXtpbnNlcnRBbmNob3IuaW5zZXJ0QmVmb3JlKGhvc3RlZFNjcmlwdCxpbnNlcnRBbmNob3IuZmlyc3RDaGlsZCl9ZWxzZXtpbnNlcnRBbmNob3IuYXBwZW5kQ2hpbGQoaG9zdGVkU2NyaXB0KX19LHByZXBhcmVQb3A6ZnVuY3Rpb24oKXtpZih0eXBlb2YgZXhvSnNQb3AxMDE9PT1cIm9iamVjdFwiJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXhvSnNQb3AxMDEsXCJhZGRcIikpe3JldHVybn1wb3BNYWdpYy50b3A9c2VsZjtpZihwb3BNYWdpYy50b3AhPT1zZWxmKXt0cnl7aWYodG9wLmRvY3VtZW50LmxvY2F0aW9uLnRvU3RyaW5nKCkpe3BvcE1hZ2ljLnRvcD10b3B9fWNhdGNoKGVycil7fX1wb3BNYWdpYy5jb29raWVfbmFtZT1cInpvbmUtY2FwLVwiK3BvcE1hZ2ljLmNvbmZpZy5pZHpvbmU7aWYocG9wTWFnaWMuc2hvdWxkU2hvdygpKXt2YXIgeG1saHR0cD1uZXcgWE1MSHR0cFJlcXVlc3Q7eG1saHR0cC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtpZih4bWxodHRwLnJlYWR5U3RhdGU9PVhNTEh0dHBSZXF1ZXN0LkRPTkUpe3BvcE1hZ2ljLnZlbm9yX2xvYWRlZD10cnVlO2lmKHhtbGh0dHAuc3RhdHVzPT0yMDApe3BvcE1hZ2ljLnZlbm9yPXhtbGh0dHAucmVzcG9uc2VUZXh0fWVsc2V7cG9wTWFnaWMudmVub3I9XCIwXCJ9fX07dmFyIHByb3RvY29sPWRvY3VtZW50LmxvY2F0aW9uLnByb3RvY29sIT09XCJodHRwczpcIiYmZG9jdW1lbnQubG9jYXRpb24ucHJvdG9jb2whPT1cImh0dHA6XCI/XCJodHRwczpcIjpkb2N1bWVudC5sb2NhdGlvbi5wcm90b2NvbDt4bWxodHRwLm9wZW4oXCJHRVRcIixwcm90b2NvbCtcIlwvXC9cIitwb3BNYWdpYy5jb25maWcuc3luZGljYXRpb25faG9zdCtcIlwvdmVub3IucGhwXCIsdHJ1ZSk7dHJ5e3htbGh0dHAuc2VuZCgpfWNhdGNoKGVycm9yKXtwb3BNYWdpYy52ZW5vcl9sb2FkZWQ9dHJ1ZX19cG9wTWFnaWMuYnVpbGRVcmwoKTtwb3BNYWdpYy5icm93c2VyPXBvcE1hZ2ljLmJyb3dzZXJEZXRlY3Rvci5kZXRlY3RCcm93c2VyKG5hdmlnYXRvci51c2VyQWdlbnQpO2lmKCFwb3BNYWdpYy5jb25maWcuY2hyb21lX2VuYWJsZWQmJihwb3BNYWdpYy5icm93c2VyLm5hbWU9PT1cImNocm9tZVwifHxwb3BNYWdpYy5icm93c2VyLm5hbWU9PT1cImNyaW9zXCIpKXtyZXR1cm59dmFyIHBvcE1ldGhvZD1wb3BNYWdpYy5nZXRQb3BNZXRob2QocG9wTWFnaWMuYnJvd3Nlcik7cG9wTWFnaWMuYWRkRXZlbnQoXCJjbGlja1wiLHBvcE1ldGhvZCl9LGdldFBvcE1ldGhvZDpmdW5jdGlvbihicm93c2VySW5mbyl7aWYocG9wTWFnaWMuY29uZmlnLnBvcHVwX2ZvcmNlKXtyZXR1cm4gcG9wTWFnaWMubWV0aG9kcy5wb3B1cH1pZihwb3BNYWdpYy5jb25maWcucG9wdXBfZmFsbGJhY2smJmJyb3dzZXJJbmZvLm5hbWU9PT1cImNocm9tZVwiJiZicm93c2VySW5mby52ZXJzaW9uPj02OCYmIWJyb3dzZXJJbmZvLmlzTW9iaWxlKXtyZXR1cm4gcG9wTWFnaWMubWV0aG9kcy5wb3B1cH1pZihicm93c2VySW5mby5pc01vYmlsZSl7cmV0dXJuIHBvcE1hZ2ljLm1ldGhvZHMuZGVmYXVsdH1pZihicm93c2VySW5mby5uYW1lPT09XCJjaHJvbWVcIil7cmV0dXJuIHBvcE1hZ2ljLm1ldGhvZHMuY2hyb21lVGFifXJldHVybiBwb3BNYWdpYy5tZXRob2RzLmRlZmF1bHR9LGJ1aWxkVXJsOmZ1bmN0aW9uKCl7dmFyIHByb3RvY29sPWRvY3VtZW50LmxvY2F0aW9uLnByb3RvY29sIT09XCJodHRwczpcIiYmZG9jdW1lbnQubG9jYXRpb24ucHJvdG9jb2whPT1cImh0dHA6XCI/XCJodHRwczpcIjpkb2N1bWVudC5sb2NhdGlvbi5wcm90b2NvbDt2YXIgcD10b3A9PT1zZWxmP2RvY3VtZW50LlVSTDpkb2N1bWVudC5yZWZlcnJlcjt2YXIgc2NyaXB0X2luZm89e3R5cGU6XCJpbmxpbmVcIixuYW1lOlwicG9wTWFnaWNcIix2ZXI6dGhpcy52ZXJzaW9ufTt2YXIgZW5jb2RlU2NyaXB0SW5mbz1mdW5jdGlvbihzY3JpcHRfaW5mbyl7dmFyIHJlc3VsdD1zY3JpcHRfaW5mb1tcInR5cGVcIl0rXCJ8XCIrc2NyaXB0X2luZm9bXCJuYW1lXCJdK1wifFwiK3NjcmlwdF9pbmZvW1widmVyXCJdO3JldHVybiBlbmNvZGVVUklDb21wb25lbnQoYnRvYShyZXN1bHQpKX07dmFyIGN1c3RvbVRhcmdldGluZ1BhcmFtcz1cIlwiO2lmKGN1c3RvbVRhcmdldGluZyYmT2JqZWN0LmtleXMoY3VzdG9tVGFyZ2V0aW5nKS5sZW5ndGgpe3ZhciBjdXN0b21UYXJnZXRpbmdLZXlzPXR5cGVvZiBjdXN0b21UYXJnZXRpbmc9PT1cIm9iamVjdFwiP09iamVjdC5rZXlzKGN1c3RvbVRhcmdldGluZyk6Y3VzdG9tVGFyZ2V0aW5nO3ZhciB2YWx1ZTtjdXN0b21UYXJnZXRpbmdLZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KXtpZih0eXBlb2YgY3VzdG9tVGFyZ2V0aW5nPT09XCJvYmplY3RcIil7dmFsdWU9Y3VzdG9tVGFyZ2V0aW5nW2tleV19ZWxzZSBpZihBcnJheS5pc0FycmF5KGN1c3RvbVRhcmdldGluZykpe3ZhbHVlPXNjcmlwdEVsLmdldEF0dHJpYnV0ZShrZXkpfXZhciBrZXlXaXRob3V0RXhvUHJlZml4PWtleS5yZXBsYWNlKFwiZGF0YS1leG8tXCIsXCJcIik7Y3VzdG9tVGFyZ2V0aW5nUGFyYW1zKz1gJiR7a2V5V2l0aG91dEV4b1ByZWZpeH09JHt2YWx1ZX1gfSl9dGhpcy51cmw9cHJvdG9jb2wrXCJcL1wvXCIrdGhpcy5jb25maWcuc3luZGljYXRpb25faG9zdCtcIlwvc3BsYXNoLnBocFwiK1wiP2NhdD1cIit0aGlzLmNvbmZpZy5jYXQrXCImaWR6b25lPVwiK3RoaXMuY29uZmlnLmlkem9uZStcIiZ0eXBlPThcIitcIiZwPVwiK2VuY29kZVVSSUNvbXBvbmVudChwKStcIiZzdWI9XCIrdGhpcy5jb25maWcuc3ViKyh0aGlzLmNvbmZpZy5zdWIyIT09XCJcIj9cIiZzdWIyPVwiK3RoaXMuY29uZmlnLnN1YjI6XCJcIikrKHRoaXMuY29uZmlnLnN1YjMhPT1cIlwiP1wiJnN1YjM9XCIrdGhpcy5jb25maWcuc3ViMzpcIlwiKStcIiZibG9jaz0xXCIrXCImZWw9XCIrdGhpcy5jb25maWcuZWwrXCImdGFncz1cIit0aGlzLmNvbmZpZy50YWdzK1wiJmNvb2tpZWNvbnNlbnQ9XCIrdGhpcy5jb25maWcuY29va2llY29uc2VudCtcIiZzY3JfaW5mbz1cIitlbmNvZGVTY3JpcHRJbmZvKHNjcmlwdF9pbmZvKStjdXN0b21UYXJnZXRpbmdQYXJhbXN9LGFkZEV2ZW50VG9FbGVtZW50OmZ1bmN0aW9uKG9iaix0eXBlLGZuKXtpZihvYmouYWRkRXZlbnRMaXN0ZW5lcil7b2JqLmFkZEV2ZW50TGlzdGVuZXIodHlwZSxmbixmYWxzZSl9ZWxzZSBpZihvYmouYXR0YWNoRXZlbnQpe29ialtcImVcIit0eXBlK2ZuXT1mbjtvYmpbdHlwZStmbl09ZnVuY3Rpb24oKXtvYmpbXCJlXCIrdHlwZStmbl0od2luZG93LmV2ZW50KX07b2JqLmF0dGFjaEV2ZW50KFwib25cIit0eXBlLG9ialt0eXBlK2ZuXSl9ZWxzZXtvYmpbXCJvblwiK3R5cGVdPW9ialtcImVcIit0eXBlK2ZuXX19LGFkZEV2ZW50OmZ1bmN0aW9uKHR5cGUsZm4pe3ZhciB0YXJnZXRFbGVtZW50cztpZihwb3BNYWdpYy5jb25maWcudHJpZ2dlcl9tZXRob2Q9PVwiM1wiKXt0YXJnZXRFbGVtZW50cz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiYVwiKTtmb3IoaT0wO2k8dGFyZ2V0RWxlbWVudHMubGVuZ3RoO2krKyl7cG9wTWFnaWMuYWRkRXZlbnRUb0VsZW1lbnQodGFyZ2V0RWxlbWVudHNbaV0sdHlwZSxmbil9cmV0dXJufWlmKHBvcE1hZ2ljLmNvbmZpZy50cmlnZ2VyX21ldGhvZD09XCIyXCImJnBvcE1hZ2ljLmNvbmZpZy50cmlnZ2VyX21ldGhvZCE9XCJcIil7dmFyIHRyaWdnZXJfY2xhc3Nlczt2YXIgdHJpZ2dlcl9jbGFzc2VzX2ZpbmFsPVtdO2lmKHBvcE1hZ2ljLmNvbmZpZy50cmlnZ2VyX2NsYXNzLmluZGV4T2YoXCIsXCIpPT09LTEpe3RyaWdnZXJfY2xhc3Nlcz1wb3BNYWdpYy5jb25maWcudHJpZ2dlcl9jbGFzcy5zcGxpdChcIiBcIil9ZWxzZXt2YXIgdHJpbW1lZF90cmlnZ2VyX2NsYXNzZXM9cG9wTWFnaWMuY29uZmlnLnRyaWdnZXJfY2xhc3MucmVwbGFjZShcL1xcc1wvZyxcIlwiKTt0cmlnZ2VyX2NsYXNzZXM9dHJpbW1lZF90cmlnZ2VyX2NsYXNzZXMuc3BsaXQoXCIsXCIpfWZvcih2YXIgaT0wO2k8dHJpZ2dlcl9jbGFzc2VzLmxlbmd0aDtpKyspe2lmKHRyaWdnZXJfY2xhc3Nlc1tpXSE9PVwiXCIpe3RyaWdnZXJfY2xhc3Nlc19maW5hbC5wdXNoKFwiLlwiK3RyaWdnZXJfY2xhc3Nlc1tpXSl9fXRhcmdldEVsZW1lbnRzPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodHJpZ2dlcl9jbGFzc2VzX2ZpbmFsLmpvaW4oXCIsIFwiKSk7Zm9yKGk9MDtpPHRhcmdldEVsZW1lbnRzLmxlbmd0aDtpKyspe3BvcE1hZ2ljLmFkZEV2ZW50VG9FbGVtZW50KHRhcmdldEVsZW1lbnRzW2ldLHR5cGUsZm4pfXJldHVybn1wb3BNYWdpYy5hZGRFdmVudFRvRWxlbWVudChkb2N1bWVudCx0eXBlLGZuKX0sc2V0Q29va2llOmZ1bmN0aW9uKG5hbWUsdmFsdWUsdHRsX21pbnV0ZXMpe2lmKCF0aGlzLmNvbmZpZy5jb29raWVjb25zZW50KXtyZXR1cm4gZmFsc2V9dHRsX21pbnV0ZXM9cGFyc2VJbnQodHRsX21pbnV0ZXMsMTApO3ZhciBub3dfZGF0ZT1uZXcgRGF0ZTtub3dfZGF0ZS5zZXRNaW51dGVzKG5vd19kYXRlLmdldE1pbnV0ZXMoKStwYXJzZUludCh0dGxfbWludXRlcykpO3ZhciBjX3ZhbHVlPWVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkrXCI7IGV4cGlyZXM9XCIrbm93X2RhdGUudG9VVENTdHJpbmcoKStcIjsgcGF0aD1cL1wiO2RvY3VtZW50LmNvb2tpZT1uYW1lK1wiPVwiK2NfdmFsdWV9LGdldENvb2tpZTpmdW5jdGlvbihuYW1lKXtpZighdGhpcy5jb25maWcuY29va2llY29uc2VudCl7cmV0dXJuIGZhbHNlfXZhciBpLHgseSxjb29raWVzQXJyYXk9ZG9jdW1lbnQuY29va2llLnNwbGl0KFwiO1wiKTtmb3IoaT0wO2k8Y29va2llc0FycmF5Lmxlbmd0aDtpKyspe3g9Y29va2llc0FycmF5W2ldLnN1YnN0cigwLGNvb2tpZXNBcnJheVtpXS5pbmRleE9mKFwiPVwiKSk7eT1jb29raWVzQXJyYXlbaV0uc3Vic3RyKGNvb2tpZXNBcnJheVtpXS5pbmRleE9mKFwiPVwiKSsxKTt4PXgucmVwbGFjZShcL15cXHMrfFxccyskXC9nLFwiXCIpO2lmKHg9PT1uYW1lKXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHkpfX19LHJhbmRTdHI6ZnVuY3Rpb24obGVuZ3RoLHBvc3NpYmxlQ2hhcnMpe3ZhciB0ZXh0PVwiXCI7dmFyIHBvc3NpYmxlPXBvc3NpYmxlQ2hhcnN8fFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODlcIjtmb3IodmFyIGk9MDtpPGxlbmd0aDtpKyspe3RleHQrPXBvc3NpYmxlLmNoYXJBdChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqcG9zc2libGUubGVuZ3RoKSl9cmV0dXJuIHRleHR9LGlzVmFsaWRVc2VyRXZlbnQ6ZnVuY3Rpb24oZXZlbnQpe2lmKFwiaXNUcnVzdGVkXCJpbiBldmVudCYmZXZlbnQuaXNUcnVzdGVkJiZwb3BNYWdpYy5icm93c2VyLm5hbWUhPT1cImllXCImJnBvcE1hZ2ljLmJyb3dzZXIubmFtZSE9PVwic2FmYXJpXCIpe3JldHVybiB0cnVlfWVsc2V7cmV0dXJuIGV2ZW50LnNjcmVlblghPTAmJmV2ZW50LnNjcmVlblkhPTB9fSxpc1ZhbGlkSHJlZjpmdW5jdGlvbihocmVmKXtpZih0eXBlb2YgaHJlZj09PVwidW5kZWZpbmVkXCJ8fGhyZWY9PVwiXCIpe3JldHVybiBmYWxzZX12YXIgZW1wdHlfcmVmPVwvXFxzP2phdmFzY3JpcHRcXHM/OlwvaTtyZXR1cm4hZW1wdHlfcmVmLnRlc3QoaHJlZil9LGZpbmRMaW5rVG9PcGVuOmZ1bmN0aW9uKGNsaWNrZWRFbGVtZW50KXt2YXIgdGFyZ2V0PWNsaWNrZWRFbGVtZW50O3ZhciBsb2NhdGlvbj1mYWxzZTt0cnl7dmFyIGJyZWFrQ3RyPTA7d2hpbGUoYnJlYWtDdHI8MjAmJiF0YXJnZXQuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKSYmdGFyZ2V0IT09ZG9jdW1lbnQmJnRhcmdldC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIT09XCJodG1sXCIpe3RhcmdldD10YXJnZXQucGFyZW50Tm9kZTticmVha0N0cisrfXZhciBlbGVtZW50VGFyZ2V0QXR0cj10YXJnZXQuZ2V0QXR0cmlidXRlKFwidGFyZ2V0XCIpO2lmKCFlbGVtZW50VGFyZ2V0QXR0cnx8ZWxlbWVudFRhcmdldEF0dHIuaW5kZXhPZihcIl9ibGFua1wiKT09PS0xKXtsb2NhdGlvbj10YXJnZXQuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKX19Y2F0Y2goZXJyKXt9aWYoIXBvcE1hZ2ljLmlzVmFsaWRIcmVmKGxvY2F0aW9uKSl7bG9jYXRpb249ZmFsc2V9cmV0dXJuIGxvY2F0aW9ufHx3aW5kb3cubG9jYXRpb24uaHJlZn0sZ2V0UHVJZDpmdW5jdGlvbigpe3JldHVyblwib2tfXCIrTWF0aC5mbG9vcig4OTk5OTk5OSpNYXRoLnJhbmRvbSgpKzFlNyl9LGJyb3dzZXJEZXRlY3Rvcjp7YnJvd3NlckRlZmluaXRpb25zOltbXCJmaXJlZm94XCIsXC9GaXJlZm94XFxcLyhbMC05Ll0rKSg/Olxcc3wkKVwvXSxbXCJvcGVyYVwiLFwvT3BlcmFcXFwvKFswLTkuXSspKD86XFxzfCQpXC9dLFtcIm9wZXJhXCIsXC9PUFJcXFwvKFswLTkuXSspKDo/XFxzfCQpJFwvXSxbXCJlZGdlXCIsXC9FZGcoPzplfClcXFwvKFswLTkuX10rKVwvXSxbXCJpZVwiLFwvVHJpZGVudFxcXC83XFwuMC4qcnY6KFswLTkuXSspXFwpLipHZWNrbyRcL10sW1wiaWVcIixcL01TSUVcXHMoWzAtOS5dKyk7LipUcmlkZW50XFxcL1s0LTddLjBcL10sW1wiaWVcIixcL01TSUVcXHMoN1xcLjApXC9dLFtcInNhZmFyaVwiLFwvVmVyc2lvblxcXC8oWzAtOS5fXSspLipTYWZhcmlcL10sW1wiY2hyb21lXCIsXC8oPyFDaHJvbS4qRWRnKD86ZXwpKUNocm9tKD86ZXxpdW0pXFxcLyhbMC05Ll0rKSg6P1xcc3wkKVwvXSxbXCJjaHJvbWVcIixcLyg/IUNocm9tLipPUFIpQ2hyb20oPzplfGl1bSlcXFwvKFswLTkuXSspKDo/XFxzfCQpXC9dLFtcImJiMTBcIixcL0JCMTA7XFxzVG91Y2guKlZlcnNpb25cXFwvKFswLTkuXSspXC9dLFtcImFuZHJvaWRcIixcL0FuZHJvaWRcXHMoWzAtOS5dKylcL10sW1wiaW9zXCIsXC9WZXJzaW9uXFxcLyhbMC05Ll9dKykuKk1vYmlsZS4qU2FmYXJpLipcL10sW1wieWFuZGV4YnJvd3NlclwiLFwvWWFCcm93c2VyXFxcLyhbMC05Ll9dKylcL10sW1wiY3Jpb3NcIixcL0NyaU9TXFxcLyhbMC05Ll0rKSg6P1xcc3wkKVwvXV0sZGV0ZWN0QnJvd3NlcjpmdW5jdGlvbih1c2VyQWdlbnQpe3ZhciBpc01vYmlsZT11c2VyQWdlbnQubWF0Y2goXC9BbmRyb2lkfEJsYWNrQmVycnl8aVBob25lfGlQYWR8aVBvZHxPcGVyYSBNaW5pfElFTW9iaWxlfFdlYk9TfFdpbmRvd3MgUGhvbmVcL2kpO2Zvcih2YXIgaSBpbiB0aGlzLmJyb3dzZXJEZWZpbml0aW9ucyl7dmFyIGRlZmluaXRpb249dGhpcy5icm93c2VyRGVmaW5pdGlvbnNbaV07aWYoZGVmaW5pdGlvblsxXS50ZXN0KHVzZXJBZ2VudCkpe3ZhciBtYXRjaD1kZWZpbml0aW9uWzFdLmV4ZWModXNlckFnZW50KTt2YXIgdmVyc2lvbj1tYXRjaCYmbWF0Y2hbMV0uc3BsaXQoXC9bLl9dXC8pLnNsaWNlKDAsMyk7dmFyIHZlcnNpb25UYWlscz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh2ZXJzaW9uLDEpLmpvaW4oXCJcIil8fFwiMFwiO2lmKHZlcnNpb24mJnZlcnNpb24ubGVuZ3RoPDMpe0FycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KHZlcnNpb24sdmVyc2lvbi5sZW5ndGg9PT0xP1swLDBdOlswXSl9cmV0dXJue25hbWU6ZGVmaW5pdGlvblswXSx2ZXJzaW9uOnZlcnNpb24uam9pbihcIi5cIiksdmVyc2lvbk51bWJlcjpwYXJzZUZsb2F0KHZlcnNpb25bMF0rXCIuXCIrdmVyc2lvblRhaWxzKSxpc01vYmlsZTppc01vYmlsZX19fXJldHVybntuYW1lOlwib3RoZXJcIix2ZXJzaW9uOlwiMS4wXCIsdmVyc2lvbk51bWJlcjoxLGlzTW9iaWxlOmlzTW9iaWxlfX19LG1ldGhvZHM6e2RlZmF1bHQ6ZnVuY3Rpb24odHJpZ2dlcmVkRXZlbnQpe2lmKCFwb3BNYWdpYy5zaG91bGRTaG93KCl8fCFwb3BNYWdpYy52ZW5vclNob3VsZFNob3coKXx8IXBvcE1hZ2ljLmlzVmFsaWRVc2VyRXZlbnQodHJpZ2dlcmVkRXZlbnQpKXJldHVybiB0cnVlO3ZhciBjbGlja2VkRWxlbWVudD10cmlnZ2VyZWRFdmVudC50YXJnZXR8fHRyaWdnZXJlZEV2ZW50LnNyY0VsZW1lbnQ7dmFyIGhyZWY9cG9wTWFnaWMuZmluZExpbmtUb09wZW4oY2xpY2tlZEVsZW1lbnQpO3dpbmRvdy5vcGVuKGhyZWYsXCJfYmxhbmtcIik7cG9wTWFnaWMuc2V0QXNPcGVuZWQoKTtwb3BNYWdpYy50b3AuZG9jdW1lbnQubG9jYXRpb249cG9wTWFnaWMudXJsO2lmKHR5cGVvZiB0cmlnZ2VyZWRFdmVudC5wcmV2ZW50RGVmYXVsdCE9PVwidW5kZWZpbmVkXCIpe3RyaWdnZXJlZEV2ZW50LnByZXZlbnREZWZhdWx0KCk7dHJpZ2dlcmVkRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCl9cmV0dXJuIHRydWV9LGNocm9tZVRhYjpmdW5jdGlvbihldmVudCl7aWYoIXBvcE1hZ2ljLnNob3VsZFNob3coKXx8IXBvcE1hZ2ljLnZlbm9yU2hvdWxkU2hvdygpfHwhcG9wTWFnaWMuaXNWYWxpZFVzZXJFdmVudChldmVudCkpcmV0dXJuIHRydWU7aWYodHlwZW9mIGV2ZW50LnByZXZlbnREZWZhdWx0IT09XCJ1bmRlZmluZWRcIil7ZXZlbnQucHJldmVudERlZmF1bHQoKTtldmVudC5zdG9wUHJvcGFnYXRpb24oKX1lbHNle3JldHVybiB0cnVlfXZhciBhPXRvcC53aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIik7dmFyIHRhcmdldD1ldmVudC50YXJnZXR8fGV2ZW50LnNyY0VsZW1lbnQ7YS5ocmVmPXBvcE1hZ2ljLmZpbmRMaW5rVG9PcGVuKHRhcmdldCk7ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJib2R5XCIpWzBdLmFwcGVuZENoaWxkKGEpO3ZhciBlPW5ldyBNb3VzZUV2ZW50KFwiY2xpY2tcIix7YnViYmxlczp0cnVlLGNhbmNlbGFibGU6dHJ1ZSx2aWV3OndpbmRvdyxzY3JlZW5YOjAsc2NyZWVuWTowLGNsaWVudFg6MCxjbGllbnRZOjAsY3RybEtleTp0cnVlLGFsdEtleTpmYWxzZSxzaGlmdEtleTpmYWxzZSxtZXRhS2V5OnRydWUsYnV0dG9uOjB9KTtlLnByZXZlbnREZWZhdWx0PXVuZGVmaW5lZDthLmRpc3BhdGNoRXZlbnQoZSk7YS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGEpO3dpbmRvdy5vcGVuKHBvcE1hZ2ljLnVybCxcIl9zZWxmXCIpO3BvcE1hZ2ljLnNldEFzT3BlbmVkKCl9LHBvcHVwOmZ1bmN0aW9uKHRyaWdnZXJlZEV2ZW50KXtpZighcG9wTWFnaWMuc2hvdWxkU2hvdygpfHwhcG9wTWFnaWMudmVub3JTaG91bGRTaG93KCl8fCFwb3BNYWdpYy5pc1ZhbGlkVXNlckV2ZW50KHRyaWdnZXJlZEV2ZW50KSlyZXR1cm4gdHJ1ZTt2YXIgd2luT3B0aW9ucz1cIlwiO2lmKHBvcE1hZ2ljLmNvbmZpZy5wb3B1cF9mYWxsYmFjayYmIXBvcE1hZ2ljLmNvbmZpZy5wb3B1cF9mb3JjZSl7dmFyIGhlaWdodD1NYXRoLm1heChNYXRoLnJvdW5kKHdpbmRvdy5pbm5lckhlaWdodCouOCksMzAwKTt2YXIgd2lkdGg9TWF0aC5tYXgoTWF0aC5yb3VuZCh3aW5kb3cuaW5uZXJXaWR0aCouNyksMzAwKTt2YXIgdG9wPXdpbmRvdy5zY3JlZW5ZKzEwMDt2YXIgbGVmdD13aW5kb3cuc2NyZWVuWCsxMDA7d2luT3B0aW9ucz1cIm1lbnViYXI9MSxyZXNpemFibGU9MSx3aWR0aD1cIit3aWR0aCtcIixoZWlnaHQ9XCIraGVpZ2h0K1wiLHRvcD1cIit0b3ArXCIsbGVmdD1cIitsZWZ0fXZhciBwcmVQb3BVcmw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZjt2YXIgcG9wV2luPXdpbmRvdy5vcGVuKHByZVBvcFVybCxwb3BNYWdpYy5nZXRQdUlkKCksd2luT3B0aW9ucyk7c2V0VGltZW91dChmdW5jdGlvbigpe3BvcFdpbi5sb2NhdGlvbi5ocmVmPXBvcE1hZ2ljLnVybH0sMjAwKTtwb3BNYWdpYy5zZXRBc09wZW5lZCgpO2lmKHR5cGVvZiB0cmlnZ2VyZWRFdmVudC5wcmV2ZW50RGVmYXVsdCE9PVwidW5kZWZpbmVkXCIpe3RyaWdnZXJlZEV2ZW50LnByZXZlbnREZWZhdWx0KCk7dHJpZ2dlcmVkRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCl9fX19OyAgICBwb3BNYWdpYy5pbml0KGFkQ29uZmlnKTtcclxufSkoKTtcclxuXHJcblxyXG48XC9zY3JpcHQ+In0seyJpZCI6ImV4b21fal9QT1BVTkRFUiIsImFkc3BvdCI6ImpfUE9QVU5ERVIiLCJ3ZWlnaHQiOiI2IiwiZmNhcCI6IjIiLCJzY2hlZHVsZSI6ZmFsc2UsIm1heFdpZHRoIjoiNzY4IiwibWluV2lkdGgiOmZhbHNlLCJ0aW1lem9uZSI6ZmFsc2UsImV4Y2x1ZGUiOmZhbHNlLCJkb21haW4iOmZhbHNlLCJjb2RlIjoiPHNjcmlwdCBzcmM9XCJcL1wvc3luZGljYXRpb24uZXhvY2xpY2suY29tXC9zcGxhc2gucGhwP2lkem9uZT0xMDI2MzEyJnR5cGU9MTFcIj48XC9zY3JpcHQ+XHJcbjxzY3JpcHQ+XHJcbiQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkge1xyXG4gICAgaWYgKHR5cGVvZiBleG9VcmwgIT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgIGV4b1VybCA9IGV4b1VybC5yZXBsYWNlKCdodHRwOlwvXC8nLCAnaHR0cHM6XC9cLycpO1xyXG4gICAgfVxyXG4gICAgJChcImFcIikuYmluZChcImNsaWNrXCIsIGZ1bmN0aW9uKGV2ZW50KSB7XHJcbiAgICAgICAgZXhvTW9iaWxlUG9wKCk7XHJcbiAgICAgICAgJCh0aGlzKS51bmJpbmQoXCJjbGlja1wiKTtcclxuICAgIH0pO1xyXG59KTtcclxuPFwvc2NyaXB0PiJ9LHsiaWQiOiJqYXZ1X2pfUE9QVU5ERVIiLCJhZHNwb3QiOiJqX1BPUFVOREVSIiwid2VpZ2h0IjoiNCIsImZjYXAiOiIxIiwic2NoZWR1bGUiOmZhbHNlLCJtYXhXaWR0aCI6ZmFsc2UsIm1pbldpZHRoIjpmYWxzZSwidGltZXpvbmUiOmZhbHNlLCJleGNsdWRlIjpmYWxzZSwiZG9tYWluIjpmYWxzZSwiY29kZSI6IjxzY3JpcHQ+XHJcbiQoZG9jdW1lbnQuYm9keSkub24oXCJjbGlja1wiLCBmdW5jdGlvbihldmVudCkge1xyXG4gIHdpbmRvdy5vcGVuKFwiaHR0cHM6XC9cL3RlbGxtZS5wd1wvZ29cL2phdnVcIik7XHJcbiAgJCh0aGlzKS5vZmYoXCJjbGlja1wiKTtcclxufSk7XHJcbjxcL3NjcmlwdD4ifV0=