IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwpQSwMEFAAAAAAAAAAhAAAAAAAAAAAAAAAAAAsAAABfX2luaXRfXy5weVBLAwQUAAAAAAAAACEAwX/1g5YXAACWFwAACwAAAF9fbWFpbl9fLnB5IyBDb3B5cmlnaHQgMjAxNyBUaGUgQmF6ZWwgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIwojIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwojIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIwojICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAojCiMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQojIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAojIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoiIiJUaGUgd2hsIG1vZHVsZXMgZGVmaW5lcyBjbGFzc2VzIGZvciBpbnRlcmFjdGluZyB3aXRoIFB5dGhvbiBwYWNrYWdlcy4iIiIKCiMgQm9pbGVycGxhdGUgYWRkZWQgYnkgc3VicGFyL2NvbXBpbGVyL3B5dGhvbl9hcmNoaXZlLnB5CmZyb20gc3VicGFyLnJ1bnRpbWUgaW1wb3J0IHN1cHBvcnQgYXMgXwpfLnNldHVwKGltcG9ydF9yb290cz1bJ3BpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMCcsICdiYXplbF90b29scycsICdwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAnLCAncnVsZXNfcHl0aG9uJ10sIHppcF9zYWZlPVRydWUpCmRlbCBfCiMgRW5kIGJvaWxlcnBsYXRlCmltcG9ydCBhcmdwYXJzZQppbXBvcnQganNvbgppbXBvcnQgb3MKaW1wb3J0IHBrZ19yZXNvdXJjZXMKaW1wb3J0IHJlCmltcG9ydCB6aXBmaWxlCgoKY2xhc3MgV2hlZWwob2JqZWN0KToKCiAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGgpOgogICAgc2VsZi5fcGF0aCA9IHBhdGgKCiAgZGVmIHBhdGgoc2VsZik6CiAgICByZXR1cm4gc2VsZi5fcGF0aAoKICBkZWYgYmFzZW5hbWUoc2VsZik6CiAgICByZXR1cm4gb3MucGF0aC5iYXNlbmFtZShzZWxmLnBhdGgoKSkKCiAgZGVmIGRpc3RyaWJ1dGlvbihzZWxmKToKICAgICMgU2VlIGh0dHBzOi8vd3d3LnB5dGhvbi5vcmcvZGV2L3BlcHMvcGVwLTA0MjcvI2ZpbGUtbmFtZS1jb252ZW50aW9uCiAgICBwYXJ0cyA9IHNlbGYuYmFzZW5hbWUoKS5zcGxpdCgnLScpCiAgICByZXR1cm4gcGFydHNbMF0KCiAgZGVmIHZlcnNpb24oc2VsZik6CiAgICAjIFNlZSBodHRwczovL3d3dy5weXRob24ub3JnL2Rldi9wZXBzL3BlcC0wNDI3LyNmaWxlLW5hbWUtY29udmVudGlvbgogICAgcGFydHMgPSBzZWxmLmJhc2VuYW1lKCkuc3BsaXQoJy0nKQogICAgcmV0dXJuIHBhcnRzWzFdCgogIGRlZiByZXBvc2l0b3J5X3N1ZmZpeChzZWxmKToKICAgICMgUmV0dXJucyBhIGNhbm9uaWNhbCBzdWZmaXggdGhhdCB3aWxsIGZvcm0gcGFydCBvZiB0aGUgbmFtZSBvZiB0aGUgQmF6ZWwKICAgICMgcmVwb3NpdG9yeSBmb3IgdGhpcyBwYWNrYWdlLgogICAgY2Fub25pY2FsID0gJ3B5cGlfX3t9X3t9Jy5mb3JtYXQoc2VsZi5kaXN0cmlidXRpb24oKSwgc2VsZi52ZXJzaW9uKCkpCiAgICAjIEVzY2FwZSBhbnkgaWxsZWdhbCBjaGFyYWN0ZXJzIHdpdGggdW5kZXJzY29yZS4KICAgIHJldHVybiByZS5zdWIoJ1stLitdJywgJ18nLCBjYW5vbmljYWwpCgogIGRlZiBfZGlzdF9pbmZvKHNlbGYpOgogICAgIyBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGRpc3QtaW5mbyBkaXJlY3Rvcnkgd2l0aGluIHRoZSAud2hsIGZpbGUuCiAgICAjIGUuZy4gZ29vZ2xlX2Nsb3VkLTAuMjcuMC1weTIucHkzLW5vbmUtYW55LndobCAtPgogICAgIyAgICAgIGdvb2dsZV9jbG91ZC0wLjI3LjAuZGlzdC1pbmZvCiAgICByZXR1cm4gJ3t9LXt9LmRpc3QtaW5mbycuZm9ybWF0KHNlbGYuZGlzdHJpYnV0aW9uKCksIHNlbGYudmVyc2lvbigpKQoKICBkZWYgbWV0YWRhdGEoc2VsZik6CiAgICAjIEV4dHJhY3QgdGhlIHN0cnVjdHVyZWQgZGF0YSBmcm9tIG1ldGFkYXRhLmpzb24gaW4gdGhlIFdITCdzIGRpc3QtaW5mbwogICAgIyBkaXJlY3RvcnkuCiAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShzZWxmLnBhdGgoKSwgJ3InKSBhcyB3aGw6CiAgICAgICMgZmlyc3QgY2hlY2sgZm9yIG1ldGFkYXRhLmpzb24KICAgICAgdHJ5OgogICAgICAgIHdpdGggd2hsLm9wZW4oc2VsZi5fZGlzdF9pbmZvKCkgKyAnL21ldGFkYXRhLmpzb24nKSBhcyBmOgogICAgICAgICAgcmV0dXJuIGpzb24ubG9hZHMoZi5yZWFkKCkuZGVjb2RlKCJ1dGYtOCIpKQogICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICBwYXNzCiAgICAgICMgZmFsbCBiYWNrIHRvIE1FVEFEQVRBIGZpbGUgKGh0dHBzOi8vd3d3LnB5dGhvbi5vcmcvZGV2L3BlcHMvcGVwLTA0MjcvKQogICAgICB3aXRoIHdobC5vcGVuKHNlbGYuX2Rpc3RfaW5mbygpICsgJy9NRVRBREFUQScpIGFzIGY6CiAgICAgICAgcmV0dXJuIHNlbGYuX3BhcnNlX21ldGFkYXRhKGYucmVhZCgpLmRlY29kZSgidXRmLTgiKSkKCiAgZGVmIG5hbWUoc2VsZik6CiAgICByZXR1cm4gc2VsZi5tZXRhZGF0YSgpLmdldCgnbmFtZScpCgogIGRlZiBkZXBlbmRlbmNpZXMoc2VsZiwgZXh0cmE9Tm9uZSk6CiAgICAiIiJBY2Nlc3MgdGhlIGRlcGVuZGVuY2llcyBvZiB0aGlzIFdoZWVsLgoKICAgIEFyZ3M6CiAgICAgIGV4dHJhOiBpZiBzcGVjaWZpZWQsIGluY2x1ZGUgdGhlIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzCiAgICAgICAgICAgIG9mIHRoZSBuYW1lZCAiZXh0cmEiLgoKICAgIFlpZWxkczoKICAgICAgdGhlIG5hbWVzIG9mIHJlcXVpcmVtZW50cyBmcm9tIHRoZSBtZXRhZGF0YS5qc29uCiAgICAiIiIKICAgICMgVE9ETyhtYXR0bW9vcik6IElzIHRoZXJlIGEgc2NoZW1hIHRvIGZvbGxvdyBmb3IgdGhpcz8KICAgIGRlcGVuZGVuY3lfc2V0ID0gc2V0KCkKCiAgICBydW5fcmVxdWlyZXMgPSBzZWxmLm1ldGFkYXRhKCkuZ2V0KCdydW5fcmVxdWlyZXMnLCBbXSkKICAgIGZvciByZXF1aXJlbWVudCBpbiBydW5fcmVxdWlyZXM6CiAgICAgIGlmIHJlcXVpcmVtZW50LmdldCgnZXh0cmEnKSAhPSBleHRyYToKICAgICAgICAjIE1hdGNoIHRoZSByZXF1aXJlbWVudHMgZm9yIHRoZSBleHRyYSB3ZSdyZSBsb29raW5nIGZvci4KICAgICAgICBjb250aW51ZQogICAgICBtYXJrZXIgPSByZXF1aXJlbWVudC5nZXQoJ2Vudmlyb25tZW50JykKICAgICAgaWYgbWFya2VyIGFuZCBub3QgcGtnX3Jlc291cmNlcy5ldmFsdWF0ZV9tYXJrZXIobWFya2VyKToKICAgICAgICAjIFRoZSBjdXJyZW50IGVudmlyb25tZW50IGRvZXMgbm90IG1hdGNoIHRoZSBwcm92aWRlZCBQRVAgNTA4IG1hcmtlciwKICAgICAgICAjIHNvIGlnbm9yZSB0aGlzIHJlcXVpcmVtZW50LgogICAgICAgIGNvbnRpbnVlCiAgICAgIHJlcXVpcmVzID0gcmVxdWlyZW1lbnQuZ2V0KCdyZXF1aXJlcycsIFtdKQogICAgICBmb3IgZW50cnkgaW4gcmVxdWlyZXM6CiAgICAgICAgIyBTdHJpcCBvZmYgYW55IHRyYWlsaW5nIHZlcnNpb25pbmcgZGF0YS4KICAgICAgICBwYXJ0cyA9IHJlLnNwbGl0KCdbID48PSgpXScsIGVudHJ5KQogICAgICAgIGRlcGVuZGVuY3lfc2V0LmFkZChwYXJ0c1swXSkKCiAgICByZXR1cm4gZGVwZW5kZW5jeV9zZXQKCiAgZGVmIGV4dHJhcyhzZWxmKToKICAgIHJldHVybiBzZWxmLm1ldGFkYXRhKCkuZ2V0KCdleHRyYXMnLCBbXSkKCiAgZGVmIGV4cGFuZChzZWxmLCBkaXJlY3RvcnkpOgogICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoc2VsZi5wYXRoKCksICdyJykgYXMgd2hsOgogICAgICB3aGwuZXh0cmFjdGFsbChkaXJlY3RvcnkpCgogICMgX3BhcnNlX21ldGFkYXRhIHBhcnNlcyBNRVRBREFUQSBmaWxlcyBhY2NvcmRpbmcgdG8gaHR0cHM6Ly93d3cucHl0aG9uLm9yZy9kZXYvcGVwcy9wZXAtMDMxNC8KICBkZWYgX3BhcnNlX21ldGFkYXRhKHNlbGYsIGNvbnRlbnQpOgogICAgIyBUT0RPOiBoYW5kbGUgZmllbGRzIG90aGVyIHRoYW4ganVzdCBuYW1lCiAgICBuYW1lX3BhdHRlcm4gPSByZS5jb21waWxlKCdOYW1lOiAoLiopJykKICAgIHJldHVybiB7ICduYW1lJzogbmFtZV9wYXR0ZXJuLnNlYXJjaChjb250ZW50KS5ncm91cCgxKSB9CgoKcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoCiAgICBkZXNjcmlwdGlvbj0nVW5wYWNrIGEgV0hMIGZpbGUgYXMgYSBweV9saWJyYXJ5LicpCgpwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXdobCcsIGFjdGlvbj0nc3RvcmUnLAogICAgICAgICAgICAgICAgICAgIGhlbHA9KCdUaGUgLndobCBmaWxlIHdlIGFyZSBleHBhbmRpbmcuJykpCgpwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXJlcXVpcmVtZW50cycsIGFjdGlvbj0nc3RvcmUnLAogICAgICAgICAgICAgICAgICAgIGhlbHA9J1RoZSBwaXBfaW1wb3J0IGZyb20gd2hpY2ggdG8gZHJhdyBkZXBlbmRlbmNpZXMuJykKCnBhcnNlci5hZGRfYXJndW1lbnQoJy0tZGlyZWN0b3J5JywgYWN0aW9uPSdzdG9yZScsIGRlZmF1bHQ9Jy4nLAogICAgICAgICAgICAgICAgICAgIGhlbHA9J1RoZSBkaXJlY3RvcnkgaW50byB3aGljaCB0byBleHBhbmQgdGhpbmdzLicpCgpwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWV4dHJhcycsIGFjdGlvbj0nYXBwZW5kJywKICAgICAgICAgICAgICAgICAgICBoZWxwPSdUaGUgc2V0IG9mIGV4dHJhcyBmb3Igd2hpY2ggdG8gZ2VuZXJhdGUgbGlicmFyeSB0YXJnZXRzLicpCgpkZWYgbWFpbigpOgogIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCiAgd2hsID0gV2hlZWwoYXJncy53aGwpCgogICMgRXh0cmFjdCB0aGUgZmlsZXMgaW50byB0aGUgY3VycmVudCBkaXJlY3RvcnkKICB3aGwuZXhwYW5kKGFyZ3MuZGlyZWN0b3J5KQoKICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKGFyZ3MuZGlyZWN0b3J5LCAnQlVJTEQnKSwgJ3cnKSBhcyBmOgogICAgZi53cml0ZSgiIiIKcGFja2FnZShkZWZhdWx0X3Zpc2liaWxpdHkgPSBbIi8vdmlzaWJpbGl0eTpwdWJsaWMiXSkKCmxvYWQoIkBydWxlc19weXRob24vL3B5dGhvbjpkZWZzLmJ6bCIsICJweV9saWJyYXJ5IikKbG9hZCgie3JlcXVpcmVtZW50c30iLCAicmVxdWlyZW1lbnQiKQoKcHlfbGlicmFyeSgKICAgIG5hbWUgPSAicGtnIiwKICAgIHNyY3MgPSBnbG9iKFsiKiovKi5weSJdKSwKICAgIGRhdGEgPSBnbG9iKFsiKiovKiJdLCBleGNsdWRlPVsiKiovKi5weSIsICIqKi8qICoiLCAiQlVJTEQiLCAiV09SS1NQQUNFIl0pLAogICAgIyBUaGlzIG1ha2VzIHRoaXMgZGlyZWN0b3J5IGEgdG9wLWxldmVsIGluIHRoZSBweXRob24gaW1wb3J0CiAgICAjIHNlYXJjaCBwYXRoIGZvciBhbnl0aGluZyB0aGF0IGRlcGVuZHMgb24gdGhpcy4KICAgIGltcG9ydHMgPSBbIi4iXSwKICAgIGRlcHMgPSBbe2RlcGVuZGVuY2llc31dLAopCntleHRyYXN9IiIiLmZvcm1hdCgKICByZXF1aXJlbWVudHM9YXJncy5yZXF1aXJlbWVudHMsCiAgZGVwZW5kZW5jaWVzPScsJy5qb2luKFsKICAgICdyZXF1aXJlbWVudCgiJXMiKScgJSBkCiAgICBmb3IgZCBpbiB3aGwuZGVwZW5kZW5jaWVzKCkKICBdKSwKICBleHRyYXM9J1xuXG4nLmpvaW4oWwogICAgIiIicHlfbGlicmFyeSgKICAgIG5hbWUgPSAie2V4dHJhfSIsCiAgICBkZXBzID0gWwogICAgICAgICI6cGtnIix7ZGVwc30KICAgIF0sCikiIiIuZm9ybWF0KGV4dHJhPWV4dHJhLAogICAgICAgICAgICBkZXBzPScsJy5qb2luKFsKICAgICAgICAgICAgICAgICdyZXF1aXJlbWVudCgiJXMiKScgJSBkZXAKICAgICAgICAgICAgICAgIGZvciBkZXAgaW4gd2hsLmRlcGVuZGVuY2llcyhleHRyYSkKICAgICAgICAgICAgXSkpCiAgICBmb3IgZXh0cmEgaW4gYXJncy5leHRyYXMgb3IgW10KICBdKSkpCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogIG1haW4oKQpQSwMEFAAAAAAAAAAhAE85aVXiDQAA4g0AACYAAABiYXplbF90b29scy90b29scy9weXRob24vcHkzd3JhcHBlci5zaCMhL2Jpbi9zaAoKIyBEb24ndCBzZXQgLWUgYmVjYXVzZSB3ZSBkb24ndCBoYXZlIHJvYnVzdCB0cmFwcGluZyBhbmQgcHJpbnRpbmcgb2YgZXJyb3JzLgpzZXQgLXUKCiMgV2UgdXNlIC9iaW4vc2ggcmF0aGVyIHRoYW4gL2Jpbi9iYXNoIGZvciBwb3J0YWJpbGl0eS4gU2VlIGRpc2N1c3Npb24gaGVyZToKIyBodHRwczovL2dyb3Vwcy5nb29nbGUuY29tL2ZvcnVtLz9ub21vYmlsZT10cnVlIyF0b3BpYy9iYXplbC1kZXYvNFFsXzdlRGNMQzAKIyBXZSBkbyBsb3NlIHRoZSBhYmlsaXR5IHRvIHNldCAtbyBwaXBlZmFpbC4KClNUUklDVD0iMSIKCmlmIFsgIiRTVFJJQ1QiID0gIjEiIF07IHRoZW4KICBGQUlMVVJFX0hFQURFUj0iXApFcnJvciBvY2N1cnJlZCB3aGlsZSBhdHRlbXB0aW5nIHRvIHVzZSB0aGUgZGVmYXVsdCBQeXRob24gdG9vbGNoYWluIFwKKEBiYXplbF90b29scy8vdG9vbHMvcHl0aG9uOmF1dG9kZXRlY3RpbmdfdG9vbGNoYWluKS4iCmVsc2UKICBGQUlMVVJFX0hFQURFUj0iXApFcnJvciBvY2N1cnJlZCB3aGlsZSBhdHRlbXB0aW5nIHRvIHVzZSB0aGUgbm9uLXN0cmljdCBhdXRvZGV0ZWN0aW5nIFB5dGhvbiBcCnRvb2xjaGFpbiAoQGJhemVsX3Rvb2xzLy90b29scy9weXRob246YXV0b2RldGVjdGluZ190b29sY2hhaW5fbm9uc3RyaWN0KS4iCmZpCgpkaWUoKSB7CiAgZWNobyAiJEZBSUxVUkVfSEVBREVSIiAxPiYyCiAgZWNobyAiJDEiIDE+JjIKICBleGl0IDEKfQoKIyBXZSB1c2UgYHdoaWNoYCB0byBsb2NhdGUgdGhlIFB5dGhvbiBpbnRlcnByZXRlciBjb21tYW5kIG9uIFBBVEguIGBjb21tYW5kIC12YAojIGlzIGFub3RoZXIgb3B0aW9uLCBidXQgaXQgZG9lc24ndCBjaGVjayB3aGV0aGVyIHRoZSBmaWxlIGl0IGZpbmRzIGhhcyB0aGUKIyBleGVjdXRhYmxlIGJpdC4KIwojIEEgdHJpY2t5IHNpdHVhdGlvbiBoYXBwZW5zIHdoZW4gdGhpcyB3cmFwcGVyIGlzIGludm9rZWQgYXMgcGFydCBvZiBydW5uaW5nIGEKIyB0b29sLCBlLmcuIHBhc3NpbmcgYSBweV9iaW5hcnkgdGFyZ2V0IHRvIGBjdHguYWN0aW9ucy5ydW4oKWAuIEJhemVsIHdpbGwgdW5zZXQKIyB0aGUgUEFUSCB2YXJpYWJsZS4gVGhlbiB0aGUgc2hlbGwgd2lsbCBzZWUgdGhlcmUncyBubyBQQVRIIGFuZCBpbml0aWFsaXplIGl0cwojIG93biwgc29tZXRpbWVzIHdpdGhvdXQgZXhwb3J0aW5nIGl0LiBUaGlzIGNhdXNlcyBgd2hpY2hgIHRvIGZhaWwgYW5kIHRoaXMKIyBzY3JpcHQgdG8gdGhpbmsgdGhlcmUncyBubyBQeXRob24gaW50ZXJwcmV0ZXIgaW5zdGFsbGVkLiBUbyBhdm9pZCB0aGlzIHdlCiMgZXhwbGljaXRseSBwYXNzIFBBVEggdG8gZWFjaCBgd2hpY2hgIGludm9jYXRpb24uIFdlIGNhbid0IGp1c3QgZXhwb3J0IFBBVEgKIyBiZWNhdXNlIHRoYXQgd291bGQgbW9kaWZ5IHRoZSBlbnZpcm9ubWVudCBzZWVuIGJ5IHRoZSBmaW5hbCB1c2VyIFB5dGhvbgojIHByb2dyYW0uCiMKIyBTZWUgYWxzbzoKIwojICAgICBodHRwczovL2dpdGh1Yi5jb20vYmF6ZWxidWlsZC9jb250aW51b3VzLWludGVncmF0aW9uL2lzc3Vlcy81NzgKIyAgICAgaHR0cHM6Ly9naXRodWIuY29tL2JhemVsYnVpbGQvYmF6ZWwvaXNzdWVzLzg0MTQKIyAgICAgaHR0cHM6Ly9naXRodWIuY29tL2JhemVsYnVpbGQvYmF6ZWwvaXNzdWVzLzg0MTUKCiMgVHJ5IHRoZSAicHl0aG9uMyIgY29tbWFuZCBuYW1lIGZpcnN0LCB0aGVuIGZhbGwgYmFjayBvbiAicHl0aG9uIi4KUFlUSE9OX0JJTj0iJChQQVRIPSIkUEFUSCIgd2hpY2ggcHl0aG9uMyAyPiAvZGV2L251bGwpIgpVU0VEX0ZBTExCQUNLPSIwIgppZiBbIC16ICIke1BZVEhPTl9CSU46LX0iIF07IHRoZW4KICBQWVRIT05fQklOPSIkKFBBVEg9IiRQQVRIIiB3aGljaCBweXRob24gMj4vZGV2L251bGwpIgogIFVTRURfRkFMTEJBQ0s9IjEiCmZpCmlmIFsgLXogIiR7UFlUSE9OX0JJTjotfSIgXTsgdGhlbgogIGRpZSAiTmVpdGhlciAncHl0aG9uMycgbm9yICdweXRob24nIHdlcmUgZm91bmQgb24gdGhlIHRhcmdldCBcCnBsYXRmb3JtJ3MgUEFUSCwgd2hpY2ggaXM6CgokUEFUSAoKUGxlYXNlIGVuc3VyZSBhbiBpbnRlcnByZXRlciBpcyBhdmFpbGFibGUgb24gdGhpcyBwbGF0Zm9ybSAoYW5kIG1hcmtlZCBcCmV4ZWN1dGFibGUpLCBvciBlbHNlIHJlZ2lzdGVyIGFuIGFwcHJvcHJpYXRlIFB5dGhvbiB0b29sY2hhaW4gYXMgcGVyIHRoZSBcCmRvY3VtZW50YXRpb24gZm9yIHB5X3J1bnRpbWVfcGFpciBcCihodHRwczovL2dpdGh1Yi5jb20vYmF6ZWxidWlsZC9iYXplbC9ibG9iL21hc3Rlci90b29scy9weXRob24vdG9vbGNoYWluLmJ6bCkuIgpmaQoKaWYgWyAiJFNUUklDVCIgPSAiMSIgXTsgdGhlbgogICMgVmVyaWZ5IHRoYXQgd2UgZ3JhYmJlZCBhbiBpbnRlcnByZXRlciB3aXRoIHRoZSByaWdodCB2ZXJzaW9uLgogIFZFUlNJT05fU1RSPSIkKCIkUFlUSE9OX0JJTiIgLVYgMj4mMSkiIFwKICAgICAgfHwgZGllICJDb3VsZCBub3QgZ2V0IGludGVycHJldGVyIHZlcnNpb24gdmlhICckUFlUSE9OX0JJTiAtViciCiAgaWYgISBlY2hvICIkVkVSU0lPTl9TVFIiIHwgZ3JlcCAtcSAiIDNcLiIgOyB0aGVuCiAgICAgIGRpZSAiQWNjb3JkaW5nIHRvICckUFlUSE9OX0JJTiAtVicsIHZlcnNpb24gaXMgJyRWRVJTSU9OX1NUUicsIGJ1dCB3ZSBcCm5lZWQgdmVyc2lvbiAzLiBQQVRIIGlzOgoKJFBBVEgKClBsZWFzZSBlbnN1cmUgYW4gaW50ZXJwcmV0ZXIgd2l0aCB2ZXJzaW9uIDMgaXMgYXZhaWxhYmxlIG9uIHRoaXMgXApwbGF0Zm9ybSBhcyAncHl0aG9uMycgb3IgJ3B5dGhvbicsIG9yIGVsc2UgcmVnaXN0ZXIgYW4gYXBwcm9wcmlhdGUgXApQeXRob24gdG9vbGNoYWluIGFzIHBlciB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgcHlfcnVudGltZV9wYWlyIFwKKGh0dHBzOi8vZ2l0aHViLmNvbS9iYXplbGJ1aWxkL2JhemVsL2Jsb2IvbWFzdGVyL3Rvb2xzL3B5dGhvbi90b29sY2hhaW4uYnpsKS4KCk5vdGUgdGhhdCBwcmlvciB0byBCYXplbCAwLjI3LCB0aGVyZSB3YXMgbm8gY2hlY2sgdG8gZW5zdXJlIHRoYXQgdGhlIFwKaW50ZXJwcmV0ZXIncyB2ZXJzaW9uIG1hdGNoZWQgdGhlIHZlcnNpb24gZGVjbGFyZWQgYnkgdGhlIHRhcmdldCAoIzQ4MTUpLiBJZiBcCnlvdXIgYnVpbGQgd29ya2VkIHByaW9yIHRvIEJhemVsIDAuMjcsIGFuZCB5b3UncmUgc3VyZSB5b3VyIHRhcmdldHMgZG8gbm90IFwKcmVxdWlyZSBQeXRob24gMywgeW91IGNhbiBvcHQgb3V0IG9mIHRoaXMgdmVyc2lvbiBjaGVjayBieSB1c2luZyB0aGUgXApub24tc3RyaWN0IGF1dG9kZXRlY3RpbmcgdG9vbGNoYWluIGluc3RlYWQgb2YgdGhlIHN0YW5kYXJkIGF1dG9kZXRlY3RpbmcgXAp0b29sY2hhaW4uIFRoaXMgY2FuIGJlIGRvbmUgYnkgcGFzc2luZyB0aGUgZmxhZyBcClxgLS1leHRyYV90b29sY2hhaW5zPUBiYXplbF90b29scy8vdG9vbHMvcHl0aG9uOmF1dG9kZXRlY3RpbmdfdG9vbGNoYWluX25vbnN0cmljdFxgIFwKb24gdGhlIGNvbW1hbmQgbGluZSBvciBhZGRpbmcgaXQgdG8geW91ciBiYXplbHJjLiIKICBmaQpmaQoKZXhlYyAiJFBZVEhPTl9CSU4iICIkQCIKUEsDBBQAAAAAAAAAIQAAAAAAAAAAAAAAAAAwAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL19faW5pdF9fLnB5UEsDBBQAAAAAAAAAIQBcT7pFfgAAAH4AAAA0AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL2Vhc3lfaW5zdGFsbC5weSIiIlJ1biB0aGUgRWFzeUluc3RhbGwgY29tbWFuZCIiIgoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgIGZyb20gc2V0dXB0b29scy5jb21tYW5kLmVhc3lfaW5zdGFsbCBpbXBvcnQgbWFpbgogICAgbWFpbigpClBLAwQUAAAAAAAAACEAHGyyTz2nAQA9pwEAPgAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9wa2dfcmVzb3VyY2VzL19faW5pdF9fLnB5IyBjb2Rpbmc6IHV0Zi04CiIiIgpQYWNrYWdlIHJlc291cmNlIEFQSQotLS0tLS0tLS0tLS0tLS0tLS0tLQoKQSByZXNvdXJjZSBpcyBhIGxvZ2ljYWwgZmlsZSBjb250YWluZWQgd2l0aGluIGEgcGFja2FnZSwgb3IgYSBsb2dpY2FsCnN1YmRpcmVjdG9yeSB0aGVyZW9mLiAgVGhlIHBhY2thZ2UgcmVzb3VyY2UgQVBJIGV4cGVjdHMgcmVzb3VyY2UgbmFtZXMKdG8gaGF2ZSB0aGVpciBwYXRoIHBhcnRzIHNlcGFyYXRlZCB3aXRoIGBgL2BgLCAqbm90KiB3aGF0ZXZlciB0aGUgbG9jYWwKcGF0aCBzZXBhcmF0b3IgaXMuICBEbyBub3QgdXNlIG9zLnBhdGggb3BlcmF0aW9ucyB0byBtYW5pcHVsYXRlIHJlc291cmNlCm5hbWVzIGJlaW5nIHBhc3NlZCBpbnRvIHRoZSBBUEkuCgpUaGUgcGFja2FnZSByZXNvdXJjZSBBUEkgaXMgZGVzaWduZWQgdG8gd29yayB3aXRoIG5vcm1hbCBmaWxlc3lzdGVtIHBhY2thZ2VzLAouZWdnIGZpbGVzLCBhbmQgdW5wYWNrZWQgLmVnZyBmaWxlcy4gIEl0IGNhbiBhbHNvIHdvcmsgaW4gYSBsaW1pdGVkIHdheSB3aXRoCi56aXAgZmlsZXMgYW5kIHdpdGggY3VzdG9tIFBFUCAzMDIgbG9hZGVycyB0aGF0IHN1cHBvcnQgdGhlIGBgZ2V0X2RhdGEoKWBgCm1ldGhvZC4KIiIiCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IHN5cwppbXBvcnQgb3MKaW1wb3J0IGlvCmltcG9ydCB0aW1lCmltcG9ydCByZQppbXBvcnQgdHlwZXMKaW1wb3J0IHppcGZpbGUKaW1wb3J0IHppcGltcG9ydAppbXBvcnQgd2FybmluZ3MKaW1wb3J0IHN0YXQKaW1wb3J0IGZ1bmN0b29scwppbXBvcnQgcGtndXRpbAppbXBvcnQgb3BlcmF0b3IKaW1wb3J0IHBsYXRmb3JtCmltcG9ydCBjb2xsZWN0aW9ucwppbXBvcnQgcGxpc3RsaWIKaW1wb3J0IGVtYWlsLnBhcnNlcgppbXBvcnQgZXJybm8KaW1wb3J0IHRlbXBmaWxlCmltcG9ydCB0ZXh0d3JhcAppbXBvcnQgaXRlcnRvb2xzCmltcG9ydCBpbnNwZWN0CmltcG9ydCBudHBhdGgKaW1wb3J0IHBvc2l4cGF0aApmcm9tIHBrZ3V0aWwgaW1wb3J0IGdldF9pbXBvcnRlcgoKdHJ5OgogICAgaW1wb3J0IF9pbXAKZXhjZXB0IEltcG9ydEVycm9yOgogICAgIyBQeXRob24gMy4yIGNvbXBhdGliaWxpdHkKICAgIGltcG9ydCBpbXAgYXMgX2ltcAoKdHJ5OgogICAgRmlsZUV4aXN0c0Vycm9yCmV4Y2VwdCBOYW1lRXJyb3I6CiAgICBGaWxlRXhpc3RzRXJyb3IgPSBPU0Vycm9yCgpmcm9tIHBrZ19yZXNvdXJjZXMuZXh0ZXJuIGltcG9ydCBzaXgKZnJvbSBwa2dfcmVzb3VyY2VzLmV4dGVybi5zaXgubW92ZXMgaW1wb3J0IHVybGxpYiwgbWFwLCBmaWx0ZXIKCiMgY2FwdHVyZSB0aGVzZSB0byBieXBhc3Mgc2FuZGJveGluZwpmcm9tIG9zIGltcG9ydCB1dGltZQp0cnk6CiAgICBmcm9tIG9zIGltcG9ydCBta2RpciwgcmVuYW1lLCB1bmxpbmsKICAgIFdSSVRFX1NVUFBPUlQgPSBUcnVlCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICMgbm8gd3JpdGUgc3VwcG9ydCwgcHJvYmFibHkgdW5kZXIgR0FFCiAgICBXUklURV9TVVBQT1JUID0gRmFsc2UKCmZyb20gb3MgaW1wb3J0IG9wZW4gYXMgb3Nfb3Blbgpmcm9tIG9zLnBhdGggaW1wb3J0IGlzZGlyLCBzcGxpdAoKdHJ5OgogICAgaW1wb3J0IGltcG9ydGxpYi5tYWNoaW5lcnkgYXMgaW1wb3J0bGliX21hY2hpbmVyeQogICAgIyBhY2Nlc3MgYXR0cmlidXRlIHRvIGZvcmNlIGltcG9ydCB1bmRlciBkZWxheWVkIGltcG9ydCBtZWNoYW5pc21zLgogICAgaW1wb3J0bGliX21hY2hpbmVyeS5fX25hbWVfXwpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBpbXBvcnRsaWJfbWFjaGluZXJ5ID0gTm9uZQoKZnJvbSAuIGltcG9ydCBweTMxY29tcGF0CmZyb20gcGtnX3Jlc291cmNlcy5leHRlcm4gaW1wb3J0IGFwcGRpcnMKZnJvbSBwa2dfcmVzb3VyY2VzLmV4dGVybiBpbXBvcnQgcGFja2FnaW5nCl9faW1wb3J0X18oJ3BrZ19yZXNvdXJjZXMuZXh0ZXJuLnBhY2thZ2luZy52ZXJzaW9uJykKX19pbXBvcnRfXygncGtnX3Jlc291cmNlcy5leHRlcm4ucGFja2FnaW5nLnNwZWNpZmllcnMnKQpfX2ltcG9ydF9fKCdwa2dfcmVzb3VyY2VzLmV4dGVybi5wYWNrYWdpbmcucmVxdWlyZW1lbnRzJykKX19pbXBvcnRfXygncGtnX3Jlc291cmNlcy5leHRlcm4ucGFja2FnaW5nLm1hcmtlcnMnKQoKCl9fbWV0YWNsYXNzX18gPSB0eXBlCgoKaWYgKDMsIDApIDwgc3lzLnZlcnNpb25faW5mbyA8ICgzLCA1KToKICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiUHl0aG9uIDMuNSBvciBsYXRlciBpcyByZXF1aXJlZCIpCgppZiBzaXguUFkyOgogICAgIyBUaG9zZSBidWlsdGluIGV4Y2VwdGlvbnMgYXJlIG9ubHkgZGVmaW5lZCBpbiBQeXRob24gMwogICAgUGVybWlzc2lvbkVycm9yID0gTm9uZQogICAgTm90QURpcmVjdG9yeUVycm9yID0gTm9uZQoKIyBkZWNsYXJlIHNvbWUgZ2xvYmFscyB0aGF0IHdpbGwgYmUgZGVmaW5lZCBsYXRlciB0bwojIHNhdGlzZnkgdGhlIGxpbnRlcnMuCnJlcXVpcmUgPSBOb25lCndvcmtpbmdfc2V0ID0gTm9uZQphZGRfYWN0aXZhdGlvbl9saXN0ZW5lciA9IE5vbmUKcmVzb3VyY2VzX3N0cmVhbSA9IE5vbmUKY2xlYW51cF9yZXNvdXJjZXMgPSBOb25lCnJlc291cmNlX2RpciA9IE5vbmUKcmVzb3VyY2Vfc3RyZWFtID0gTm9uZQpzZXRfZXh0cmFjdGlvbl9wYXRoID0gTm9uZQpyZXNvdXJjZV9pc2RpciA9IE5vbmUKcmVzb3VyY2Vfc3RyaW5nID0gTm9uZQppdGVyX2VudHJ5X3BvaW50cyA9IE5vbmUKcmVzb3VyY2VfbGlzdGRpciA9IE5vbmUKcmVzb3VyY2VfZmlsZW5hbWUgPSBOb25lCnJlc291cmNlX2V4aXN0cyA9IE5vbmUKX2Rpc3RyaWJ1dGlvbl9maW5kZXJzID0gTm9uZQpfbmFtZXNwYWNlX2hhbmRsZXJzID0gTm9uZQpfbmFtZXNwYWNlX3BhY2thZ2VzID0gTm9uZQoKCmNsYXNzIFBFUDQ0MFdhcm5pbmcoUnVudGltZVdhcm5pbmcpOgogICAgIiIiCiAgICBVc2VkIHdoZW4gdGhlcmUgaXMgYW4gaXNzdWUgd2l0aCBhIHZlcnNpb24gb3Igc3BlY2lmaWVyIG5vdCBjb21wbHlpbmcgd2l0aAogICAgUEVQIDQ0MC4KICAgICIiIgoKCmRlZiBwYXJzZV92ZXJzaW9uKHYpOgogICAgdHJ5OgogICAgICAgIHJldHVybiBwYWNrYWdpbmcudmVyc2lvbi5WZXJzaW9uKHYpCiAgICBleGNlcHQgcGFja2FnaW5nLnZlcnNpb24uSW52YWxpZFZlcnNpb246CiAgICAgICAgcmV0dXJuIHBhY2thZ2luZy52ZXJzaW9uLkxlZ2FjeVZlcnNpb24odikKCgpfc3RhdGVfdmFycyA9IHt9CgoKZGVmIF9kZWNsYXJlX3N0YXRlKHZhcnR5cGUsICoqa3cpOgogICAgZ2xvYmFscygpLnVwZGF0ZShrdykKICAgIF9zdGF0ZV92YXJzLnVwZGF0ZShkaWN0LmZyb21rZXlzKGt3LCB2YXJ0eXBlKSkKCgpkZWYgX19nZXRzdGF0ZV9fKCk6CiAgICBzdGF0ZSA9IHt9CiAgICBnID0gZ2xvYmFscygpCiAgICBmb3IgaywgdiBpbiBfc3RhdGVfdmFycy5pdGVtcygpOgogICAgICAgIHN0YXRlW2tdID0gZ1snX3NnZXRfJyArIHZdKGdba10pCiAgICByZXR1cm4gc3RhdGUKCgpkZWYgX19zZXRzdGF0ZV9fKHN0YXRlKToKICAgIGcgPSBnbG9iYWxzKCkKICAgIGZvciBrLCB2IGluIHN0YXRlLml0ZW1zKCk6CiAgICAgICAgZ1snX3NzZXRfJyArIF9zdGF0ZV92YXJzW2tdXShrLCBnW2tdLCB2KQogICAgcmV0dXJuIHN0YXRlCgoKZGVmIF9zZ2V0X2RpY3QodmFsKToKICAgIHJldHVybiB2YWwuY29weSgpCgoKZGVmIF9zc2V0X2RpY3Qoa2V5LCBvYiwgc3RhdGUpOgogICAgb2IuY2xlYXIoKQogICAgb2IudXBkYXRlKHN0YXRlKQoKCmRlZiBfc2dldF9vYmplY3QodmFsKToKICAgIHJldHVybiB2YWwuX19nZXRzdGF0ZV9fKCkKCgpkZWYgX3NzZXRfb2JqZWN0KGtleSwgb2IsIHN0YXRlKToKICAgIG9iLl9fc2V0c3RhdGVfXyhzdGF0ZSkKCgpfc2dldF9ub25lID0gX3NzZXRfbm9uZSA9IGxhbWJkYSAqYXJnczogTm9uZQoKCmRlZiBnZXRfc3VwcG9ydGVkX3BsYXRmb3JtKCk6CiAgICAiIiJSZXR1cm4gdGhpcyBwbGF0Zm9ybSdzIG1heGltdW0gY29tcGF0aWJsZSB2ZXJzaW9uLgoKICAgIGRpc3R1dGlscy51dGlsLmdldF9wbGF0Zm9ybSgpIG5vcm1hbGx5IHJlcG9ydHMgdGhlIG1pbmltdW0gdmVyc2lvbgogICAgb2YgTWFjIE9TIFggdGhhdCB3b3VsZCBiZSByZXF1aXJlZCB0byAqdXNlKiBleHRlbnNpb25zIHByb2R1Y2VkIGJ5CiAgICBkaXN0dXRpbHMuICBCdXQgd2hhdCB3ZSB3YW50IHdoZW4gY2hlY2tpbmcgY29tcGF0aWJpbGl0eSBpcyB0byBrbm93IHRoZQogICAgdmVyc2lvbiBvZiBNYWMgT1MgWCB0aGF0IHdlIGFyZSAqcnVubmluZyouICBUbyBhbGxvdyB1c2FnZSBvZiBwYWNrYWdlcyB0aGF0CiAgICBleHBsaWNpdGx5IHJlcXVpcmUgYSBuZXdlciB2ZXJzaW9uIG9mIE1hYyBPUyBYLCB3ZSBtdXN0IGFsc28ga25vdyB0aGUKICAgIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgT1MuCgogICAgSWYgdGhpcyBjb25kaXRpb24gb2NjdXJzIGZvciBhbnkgb3RoZXIgcGxhdGZvcm0gd2l0aCBhIHZlcnNpb24gaW4gaXRzCiAgICBwbGF0Zm9ybSBzdHJpbmdzLCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBleHRlbmRlZCBhY2NvcmRpbmdseS4KICAgICIiIgogICAgcGxhdCA9IGdldF9idWlsZF9wbGF0Zm9ybSgpCiAgICBtID0gbWFjb3NWZXJzaW9uU3RyaW5nLm1hdGNoKHBsYXQpCiAgICBpZiBtIGlzIG5vdCBOb25lIGFuZCBzeXMucGxhdGZvcm0gPT0gImRhcndpbiI6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBwbGF0ID0gJ21hY29zeC0lcy0lcycgJSAoJy4nLmpvaW4oX21hY29zeF92ZXJzKClbOjJdKSwgbS5ncm91cCgzKSkKICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgIyBub3QgTWFjIE9TIFgKICAgICAgICAgICAgcGFzcwogICAgcmV0dXJuIHBsYXQKCgpfX2FsbF9fID0gWwogICAgIyBCYXNpYyByZXNvdXJjZSBhY2Nlc3MgYW5kIGRpc3RyaWJ1dGlvbi9lbnRyeSBwb2ludCBkaXNjb3ZlcnkKICAgICdyZXF1aXJlJywgJ3J1bl9zY3JpcHQnLCAnZ2V0X3Byb3ZpZGVyJywgJ2dldF9kaXN0cmlidXRpb24nLAogICAgJ2xvYWRfZW50cnlfcG9pbnQnLCAnZ2V0X2VudHJ5X21hcCcsICdnZXRfZW50cnlfaW5mbycsCiAgICAnaXRlcl9lbnRyeV9wb2ludHMnLAogICAgJ3Jlc291cmNlX3N0cmluZycsICdyZXNvdXJjZV9zdHJlYW0nLCAncmVzb3VyY2VfZmlsZW5hbWUnLAogICAgJ3Jlc291cmNlX2xpc3RkaXInLCAncmVzb3VyY2VfZXhpc3RzJywgJ3Jlc291cmNlX2lzZGlyJywKCiAgICAjIEVudmlyb25tZW50YWwgY29udHJvbAogICAgJ2RlY2xhcmVfbmFtZXNwYWNlJywgJ3dvcmtpbmdfc2V0JywgJ2FkZF9hY3RpdmF0aW9uX2xpc3RlbmVyJywKICAgICdmaW5kX2Rpc3RyaWJ1dGlvbnMnLCAnc2V0X2V4dHJhY3Rpb25fcGF0aCcsICdjbGVhbnVwX3Jlc291cmNlcycsCiAgICAnZ2V0X2RlZmF1bHRfY2FjaGUnLAoKICAgICMgUHJpbWFyeSBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzCiAgICAnRW52aXJvbm1lbnQnLCAnV29ya2luZ1NldCcsICdSZXNvdXJjZU1hbmFnZXInLAogICAgJ0Rpc3RyaWJ1dGlvbicsICdSZXF1aXJlbWVudCcsICdFbnRyeVBvaW50JywKCiAgICAjIEV4Y2VwdGlvbnMKICAgICdSZXNvbHV0aW9uRXJyb3InLCAnVmVyc2lvbkNvbmZsaWN0JywgJ0Rpc3RyaWJ1dGlvbk5vdEZvdW5kJywKICAgICdVbmtub3duRXh0cmEnLCAnRXh0cmFjdGlvbkVycm9yJywKCiAgICAjIFdhcm5pbmdzCiAgICAnUEVQNDQwV2FybmluZycsCgogICAgIyBQYXJzaW5nIGZ1bmN0aW9ucyBhbmQgc3RyaW5nIHV0aWxpdGllcwogICAgJ3BhcnNlX3JlcXVpcmVtZW50cycsICdwYXJzZV92ZXJzaW9uJywgJ3NhZmVfbmFtZScsICdzYWZlX3ZlcnNpb24nLAogICAgJ2dldF9wbGF0Zm9ybScsICdjb21wYXRpYmxlX3BsYXRmb3JtcycsICd5aWVsZF9saW5lcycsICdzcGxpdF9zZWN0aW9ucycsCiAgICAnc2FmZV9leHRyYScsICd0b19maWxlbmFtZScsICdpbnZhbGlkX21hcmtlcicsICdldmFsdWF0ZV9tYXJrZXInLAoKICAgICMgZmlsZXN5c3RlbSB1dGlsaXRpZXMKICAgICdlbnN1cmVfZGlyZWN0b3J5JywgJ25vcm1hbGl6ZV9wYXRoJywKCiAgICAjIERpc3RyaWJ1dGlvbiAicHJlY2VkZW5jZSIgY29uc3RhbnRzCiAgICAnRUdHX0RJU1QnLCAnQklOQVJZX0RJU1QnLCAnU09VUkNFX0RJU1QnLCAnQ0hFQ0tPVVRfRElTVCcsICdERVZFTE9QX0RJU1QnLAoKICAgICMgIlByb3ZpZGVyIiBpbnRlcmZhY2VzLCBpbXBsZW1lbnRhdGlvbnMsIGFuZCByZWdpc3RyYXRpb24vbG9va3VwIEFQSXMKICAgICdJTWV0YWRhdGFQcm92aWRlcicsICdJUmVzb3VyY2VQcm92aWRlcicsICdGaWxlTWV0YWRhdGEnLAogICAgJ1BhdGhNZXRhZGF0YScsICdFZ2dNZXRhZGF0YScsICdFbXB0eVByb3ZpZGVyJywgJ2VtcHR5X3Byb3ZpZGVyJywKICAgICdOdWxsUHJvdmlkZXInLCAnRWdnUHJvdmlkZXInLCAnRGVmYXVsdFByb3ZpZGVyJywgJ1ppcFByb3ZpZGVyJywKICAgICdyZWdpc3Rlcl9maW5kZXInLCAncmVnaXN0ZXJfbmFtZXNwYWNlX2hhbmRsZXInLCAncmVnaXN0ZXJfbG9hZGVyX3R5cGUnLAogICAgJ2ZpeHVwX25hbWVzcGFjZV9wYWNrYWdlcycsICdnZXRfaW1wb3J0ZXInLAoKICAgICMgV2FybmluZ3MKICAgICdQa2dSZXNvdXJjZXNEZXByZWNhdGlvbldhcm5pbmcnLAoKICAgICMgRGVwcmVjYXRlZC9iYWNrd2FyZCBjb21wYXRpYmlsaXR5IG9ubHkKICAgICdydW5fbWFpbicsICdBdmFpbGFibGVEaXN0cmlidXRpb25zJywKXQoKCmNsYXNzIFJlc29sdXRpb25FcnJvcihFeGNlcHRpb24pOgogICAgIiIiQWJzdHJhY3QgYmFzZSBmb3IgZGVwZW5kZW5jeSByZXNvbHV0aW9uIGVycm9ycyIiIgoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18uX19uYW1lX18gKyByZXByKHNlbGYuYXJncykKCgpjbGFzcyBWZXJzaW9uQ29uZmxpY3QoUmVzb2x1dGlvbkVycm9yKToKICAgICIiIgogICAgQW4gYWxyZWFkeS1pbnN0YWxsZWQgdmVyc2lvbiBjb25mbGljdHMgd2l0aCB0aGUgcmVxdWVzdGVkIHZlcnNpb24uCgogICAgU2hvdWxkIGJlIGluaXRpYWxpemVkIHdpdGggdGhlIGluc3RhbGxlZCBEaXN0cmlidXRpb24gYW5kIHRoZSByZXF1ZXN0ZWQKICAgIFJlcXVpcmVtZW50LgogICAgIiIiCgogICAgX3RlbXBsYXRlID0gIntzZWxmLmRpc3R9IGlzIGluc3RhbGxlZCBidXQge3NlbGYucmVxfSBpcyByZXF1aXJlZCIKCiAgICBAcHJvcGVydHkKICAgIGRlZiBkaXN0KHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmFyZ3NbMF0KCiAgICBAcHJvcGVydHkKICAgIGRlZiByZXEoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuYXJnc1sxXQoKICAgIGRlZiByZXBvcnQoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3RlbXBsYXRlLmZvcm1hdCgqKmxvY2FscygpKQoKICAgIGRlZiB3aXRoX2NvbnRleHQoc2VsZiwgcmVxdWlyZWRfYnkpOgogICAgICAgICIiIgogICAgICAgIElmIHJlcXVpcmVkX2J5IGlzIG5vbi1lbXB0eSwgcmV0dXJuIGEgdmVyc2lvbiBvZiBzZWxmIHRoYXQgaXMgYQogICAgICAgIENvbnRleHR1YWxWZXJzaW9uQ29uZmxpY3QuCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IHJlcXVpcmVkX2J5OgogICAgICAgICAgICByZXR1cm4gc2VsZgogICAgICAgIGFyZ3MgPSBzZWxmLmFyZ3MgKyAocmVxdWlyZWRfYnksKQogICAgICAgIHJldHVybiBDb250ZXh0dWFsVmVyc2lvbkNvbmZsaWN0KCphcmdzKQoKCmNsYXNzIENvbnRleHR1YWxWZXJzaW9uQ29uZmxpY3QoVmVyc2lvbkNvbmZsaWN0KToKICAgICIiIgogICAgQSBWZXJzaW9uQ29uZmxpY3QgdGhhdCBhY2NlcHRzIGEgdGhpcmQgcGFyYW1ldGVyLCB0aGUgc2V0IG9mIHRoZQogICAgcmVxdWlyZW1lbnRzIHRoYXQgcmVxdWlyZWQgdGhlIGluc3RhbGxlZCBEaXN0cmlidXRpb24uCiAgICAiIiIKCiAgICBfdGVtcGxhdGUgPSBWZXJzaW9uQ29uZmxpY3QuX3RlbXBsYXRlICsgJyBieSB7c2VsZi5yZXF1aXJlZF9ieX0nCgogICAgQHByb3BlcnR5CiAgICBkZWYgcmVxdWlyZWRfYnkoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuYXJnc1syXQoKCmNsYXNzIERpc3RyaWJ1dGlvbk5vdEZvdW5kKFJlc29sdXRpb25FcnJvcik6CiAgICAiIiJBIHJlcXVlc3RlZCBkaXN0cmlidXRpb24gd2FzIG5vdCBmb3VuZCIiIgoKICAgIF90ZW1wbGF0ZSA9ICgiVGhlICd7c2VsZi5yZXF9JyBkaXN0cmlidXRpb24gd2FzIG5vdCBmb3VuZCAiCiAgICAgICAgICAgICAgICAgImFuZCBpcyByZXF1aXJlZCBieSB7c2VsZi5yZXF1aXJlcnNfc3RyfSIpCgogICAgQHByb3BlcnR5CiAgICBkZWYgcmVxKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmFyZ3NbMF0KCiAgICBAcHJvcGVydHkKICAgIGRlZiByZXF1aXJlcnMoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuYXJnc1sxXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHJlcXVpcmVyc19zdHIoc2VsZik6CiAgICAgICAgaWYgbm90IHNlbGYucmVxdWlyZXJzOgogICAgICAgICAgICByZXR1cm4gJ3RoZSBhcHBsaWNhdGlvbicKICAgICAgICByZXR1cm4gJywgJy5qb2luKHNlbGYucmVxdWlyZXJzKQoKICAgIGRlZiByZXBvcnQoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3RlbXBsYXRlLmZvcm1hdCgqKmxvY2FscygpKQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnJlcG9ydCgpCgoKY2xhc3MgVW5rbm93bkV4dHJhKFJlc29sdXRpb25FcnJvcik6CiAgICAiIiJEaXN0cmlidXRpb24gZG9lc24ndCBoYXZlIGFuICJleHRyYSBmZWF0dXJlIiBvZiB0aGUgZ2l2ZW4gbmFtZSIiIgoKCl9wcm92aWRlcl9mYWN0b3JpZXMgPSB7fQoKUFlfTUFKT1IgPSAne30ue30nLmZvcm1hdCgqc3lzLnZlcnNpb25faW5mbykKRUdHX0RJU1QgPSAzCkJJTkFSWV9ESVNUID0gMgpTT1VSQ0VfRElTVCA9IDEKQ0hFQ0tPVVRfRElTVCA9IDAKREVWRUxPUF9ESVNUID0gLTEKCgpkZWYgcmVnaXN0ZXJfbG9hZGVyX3R5cGUobG9hZGVyX3R5cGUsIHByb3ZpZGVyX2ZhY3RvcnkpOgogICAgIiIiUmVnaXN0ZXIgYHByb3ZpZGVyX2ZhY3RvcnlgIHRvIG1ha2UgcHJvdmlkZXJzIGZvciBgbG9hZGVyX3R5cGVgCgogICAgYGxvYWRlcl90eXBlYCBpcyB0aGUgdHlwZSBvciBjbGFzcyBvZiBhIFBFUCAzMDIgYGBtb2R1bGUuX19sb2FkZXJfX2BgLAogICAgYW5kIGBwcm92aWRlcl9mYWN0b3J5YCBpcyBhIGZ1bmN0aW9uIHRoYXQsIHBhc3NlZCBhICptb2R1bGUqIG9iamVjdCwKICAgIHJldHVybnMgYW4gYGBJUmVzb3VyY2VQcm92aWRlcmBgIGZvciB0aGF0IG1vZHVsZS4KICAgICIiIgogICAgX3Byb3ZpZGVyX2ZhY3Rvcmllc1tsb2FkZXJfdHlwZV0gPSBwcm92aWRlcl9mYWN0b3J5CgoKZGVmIGdldF9wcm92aWRlcihtb2R1bGVPclJlcSk6CiAgICAiIiJSZXR1cm4gYW4gSVJlc291cmNlUHJvdmlkZXIgZm9yIHRoZSBuYW1lZCBtb2R1bGUgb3IgcmVxdWlyZW1lbnQiIiIKICAgIGlmIGlzaW5zdGFuY2UobW9kdWxlT3JSZXEsIFJlcXVpcmVtZW50KToKICAgICAgICByZXR1cm4gd29ya2luZ19zZXQuZmluZChtb2R1bGVPclJlcSkgb3IgcmVxdWlyZShzdHIobW9kdWxlT3JSZXEpKVswXQogICAgdHJ5OgogICAgICAgIG1vZHVsZSA9IHN5cy5tb2R1bGVzW21vZHVsZU9yUmVxXQogICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgIF9faW1wb3J0X18obW9kdWxlT3JSZXEpCiAgICAgICAgbW9kdWxlID0gc3lzLm1vZHVsZXNbbW9kdWxlT3JSZXFdCiAgICBsb2FkZXIgPSBnZXRhdHRyKG1vZHVsZSwgJ19fbG9hZGVyX18nLCBOb25lKQogICAgcmV0dXJuIF9maW5kX2FkYXB0ZXIoX3Byb3ZpZGVyX2ZhY3RvcmllcywgbG9hZGVyKShtb2R1bGUpCgoKZGVmIF9tYWNvc3hfdmVycyhfY2FjaGU9W10pOgogICAgaWYgbm90IF9jYWNoZToKICAgICAgICB2ZXJzaW9uID0gcGxhdGZvcm0ubWFjX3ZlcigpWzBdCiAgICAgICAgIyBmYWxsYmFjayBmb3IgTWFjUG9ydHMKICAgICAgICBpZiB2ZXJzaW9uID09ICcnOgogICAgICAgICAgICBwbGlzdCA9ICcvU3lzdGVtL0xpYnJhcnkvQ29yZVNlcnZpY2VzL1N5c3RlbVZlcnNpb24ucGxpc3QnCiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHBsaXN0KToKICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIocGxpc3RsaWIsICdyZWFkUGxpc3QnKToKICAgICAgICAgICAgICAgICAgICBwbGlzdF9jb250ZW50ID0gcGxpc3RsaWIucmVhZFBsaXN0KHBsaXN0KQogICAgICAgICAgICAgICAgICAgIGlmICdQcm9kdWN0VmVyc2lvbicgaW4gcGxpc3RfY29udGVudDoKICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiA9IHBsaXN0X2NvbnRlbnRbJ1Byb2R1Y3RWZXJzaW9uJ10KCiAgICAgICAgX2NhY2hlLmFwcGVuZCh2ZXJzaW9uLnNwbGl0KCcuJykpCiAgICByZXR1cm4gX2NhY2hlWzBdCgoKZGVmIF9tYWNvc3hfYXJjaChtYWNoaW5lKToKICAgIHJldHVybiB7J1Bvd2VyUEMnOiAncHBjJywgJ1Bvd2VyX01hY2ludG9zaCc6ICdwcGMnfS5nZXQobWFjaGluZSwgbWFjaGluZSkKCgpkZWYgZ2V0X2J1aWxkX3BsYXRmb3JtKCk6CiAgICAiIiJSZXR1cm4gdGhpcyBwbGF0Zm9ybSdzIHN0cmluZyBmb3IgcGxhdGZvcm0tc3BlY2lmaWMgZGlzdHJpYnV0aW9ucwoKICAgIFhYWCBDdXJyZW50bHkgdGhpcyBpcyB0aGUgc2FtZSBhcyBgYGRpc3R1dGlscy51dGlsLmdldF9wbGF0Zm9ybSgpYGAsIGJ1dCBpdAogICAgbmVlZHMgc29tZSBoYWNrcyBmb3IgTGludXggYW5kIE1hYyBPUyBYLgogICAgIiIiCiAgICBmcm9tIHN5c2NvbmZpZyBpbXBvcnQgZ2V0X3BsYXRmb3JtCgogICAgcGxhdCA9IGdldF9wbGF0Zm9ybSgpCiAgICBpZiBzeXMucGxhdGZvcm0gPT0gImRhcndpbiIgYW5kIG5vdCBwbGF0LnN0YXJ0c3dpdGgoJ21hY29zeC0nKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHZlcnNpb24gPSBfbWFjb3N4X3ZlcnMoKQogICAgICAgICAgICBtYWNoaW5lID0gb3MudW5hbWUoKVs0XS5yZXBsYWNlKCIgIiwgIl8iKQogICAgICAgICAgICByZXR1cm4gIm1hY29zeC0lZC4lZC0lcyIgJSAoCiAgICAgICAgICAgICAgICBpbnQodmVyc2lvblswXSksIGludCh2ZXJzaW9uWzFdKSwKICAgICAgICAgICAgICAgIF9tYWNvc3hfYXJjaChtYWNoaW5lKSwKICAgICAgICAgICAgKQogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAjIGlmIHNvbWVvbmUgaXMgcnVubmluZyBhIG5vbi1NYWMgZGFyd2luIHN5c3RlbSwgdGhpcyB3aWxsIGZhbGwKICAgICAgICAgICAgIyB0aHJvdWdoIHRvIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCiAgICAgICAgICAgIHBhc3MKICAgIHJldHVybiBwbGF0CgoKbWFjb3NWZXJzaW9uU3RyaW5nID0gcmUuY29tcGlsZShyIm1hY29zeC0oXGQrKVwuKFxkKyktKC4qKSIpCmRhcndpblZlcnNpb25TdHJpbmcgPSByZS5jb21waWxlKHIiZGFyd2luLShcZCspXC4oXGQrKVwuKFxkKyktKC4qKSIpCiMgWFhYIGJhY2t3YXJkIGNvbXBhdApnZXRfcGxhdGZvcm0gPSBnZXRfYnVpbGRfcGxhdGZvcm0KCgpkZWYgY29tcGF0aWJsZV9wbGF0Zm9ybXMocHJvdmlkZWQsIHJlcXVpcmVkKToKICAgICIiIkNhbiBjb2RlIGZvciB0aGUgYHByb3ZpZGVkYCBwbGF0Zm9ybSBydW4gb24gdGhlIGByZXF1aXJlZGAgcGxhdGZvcm0/CgogICAgUmV0dXJucyB0cnVlIGlmIGVpdGhlciBwbGF0Zm9ybSBpcyBgYE5vbmVgYCwgb3IgdGhlIHBsYXRmb3JtcyBhcmUgZXF1YWwuCgogICAgWFhYIE5lZWRzIGNvbXBhdGliaWxpdHkgY2hlY2tzIGZvciBMaW51eCBhbmQgb3RoZXIgdW5peHkgT1Nlcy4KICAgICIiIgogICAgaWYgcHJvdmlkZWQgaXMgTm9uZSBvciByZXF1aXJlZCBpcyBOb25lIG9yIHByb3ZpZGVkID09IHJlcXVpcmVkOgogICAgICAgICMgZWFzeSBjYXNlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICAjIE1hYyBPUyBYIHNwZWNpYWwgY2FzZXMKICAgIHJlcU1hYyA9IG1hY29zVmVyc2lvblN0cmluZy5tYXRjaChyZXF1aXJlZCkKICAgIGlmIHJlcU1hYzoKICAgICAgICBwcm92TWFjID0gbWFjb3NWZXJzaW9uU3RyaW5nLm1hdGNoKHByb3ZpZGVkKQoKICAgICAgICAjIGlzIHRoaXMgYSBNYWMgcGFja2FnZT8KICAgICAgICBpZiBub3QgcHJvdk1hYzoKICAgICAgICAgICAgIyB0aGlzIGlzIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciBwYWNrYWdlcyBidWlsdCBiZWZvcmUKICAgICAgICAgICAgIyBzZXR1cHRvb2xzIDAuNi4gQWxsIHBhY2thZ2VzIGJ1aWx0IGFmdGVyIHRoaXMgcG9pbnQgd2lsbAogICAgICAgICAgICAjIHVzZSB0aGUgbmV3IG1hY29zeCBkZXNpZ25hdGlvbi4KICAgICAgICAgICAgcHJvdkRhcndpbiA9IGRhcndpblZlcnNpb25TdHJpbmcubWF0Y2gocHJvdmlkZWQpCiAgICAgICAgICAgIGlmIHByb3ZEYXJ3aW46CiAgICAgICAgICAgICAgICBkdmVyc2lvbiA9IGludChwcm92RGFyd2luLmdyb3VwKDEpKQogICAgICAgICAgICAgICAgbWFjb3N2ZXJzaW9uID0gIiVzLiVzIiAlIChyZXFNYWMuZ3JvdXAoMSksIHJlcU1hYy5ncm91cCgyKSkKICAgICAgICAgICAgICAgIGlmIGR2ZXJzaW9uID09IDcgYW5kIG1hY29zdmVyc2lvbiA+PSAiMTAuMyIgb3IgXAogICAgICAgICAgICAgICAgICAgICAgICBkdmVyc2lvbiA9PSA4IGFuZCBtYWNvc3ZlcnNpb24gPj0gIjEwLjQiOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgICAgICMgZWdnIGlzbid0IG1hY29zeCBvciBsZWdhY3kgZGFyd2luCiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAjIGFyZSB0aGV5IHRoZSBzYW1lIG1ham9yIHZlcnNpb24gYW5kIG1hY2hpbmUgdHlwZT8KICAgICAgICBpZiBwcm92TWFjLmdyb3VwKDEpICE9IHJlcU1hYy5ncm91cCgxKSBvciBcCiAgICAgICAgICAgICAgICBwcm92TWFjLmdyb3VwKDMpICE9IHJlcU1hYy5ncm91cCgzKToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICMgaXMgdGhlIHJlcXVpcmVkIE9TIG1ham9yIHVwZGF0ZSA+PSB0aGUgcHJvdmlkZWQgb25lPwogICAgICAgIGlmIGludChwcm92TWFjLmdyb3VwKDIpKSA+IGludChyZXFNYWMuZ3JvdXAoMikpOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICAjIFhYWCBMaW51eCBhbmQgb3RoZXIgcGxhdGZvcm1zJyBzcGVjaWFsIGNhc2VzIHNob3VsZCBnbyBoZXJlCiAgICByZXR1cm4gRmFsc2UKCgpkZWYgcnVuX3NjcmlwdChkaXN0X3NwZWMsIHNjcmlwdF9uYW1lKToKICAgICIiIkxvY2F0ZSBkaXN0cmlidXRpb24gYGRpc3Rfc3BlY2AgYW5kIHJ1biBpdHMgYHNjcmlwdF9uYW1lYCBzY3JpcHQiIiIKICAgIG5zID0gc3lzLl9nZXRmcmFtZSgxKS5mX2dsb2JhbHMKICAgIG5hbWUgPSBuc1snX19uYW1lX18nXQogICAgbnMuY2xlYXIoKQogICAgbnNbJ19fbmFtZV9fJ10gPSBuYW1lCiAgICByZXF1aXJlKGRpc3Rfc3BlYylbMF0ucnVuX3NjcmlwdChzY3JpcHRfbmFtZSwgbnMpCgoKIyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CnJ1bl9tYWluID0gcnVuX3NjcmlwdAoKCmRlZiBnZXRfZGlzdHJpYnV0aW9uKGRpc3QpOgogICAgIiIiUmV0dXJuIGEgY3VycmVudCBkaXN0cmlidXRpb24gb2JqZWN0IGZvciBhIFJlcXVpcmVtZW50IG9yIHN0cmluZyIiIgogICAgaWYgaXNpbnN0YW5jZShkaXN0LCBzaXguc3RyaW5nX3R5cGVzKToKICAgICAgICBkaXN0ID0gUmVxdWlyZW1lbnQucGFyc2UoZGlzdCkKICAgIGlmIGlzaW5zdGFuY2UoZGlzdCwgUmVxdWlyZW1lbnQpOgogICAgICAgIGRpc3QgPSBnZXRfcHJvdmlkZXIoZGlzdCkKICAgIGlmIG5vdCBpc2luc3RhbmNlKGRpc3QsIERpc3RyaWJ1dGlvbik6CiAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJFeHBlY3RlZCBzdHJpbmcsIFJlcXVpcmVtZW50LCBvciBEaXN0cmlidXRpb24iLCBkaXN0KQogICAgcmV0dXJuIGRpc3QKCgpkZWYgbG9hZF9lbnRyeV9wb2ludChkaXN0LCBncm91cCwgbmFtZSk6CiAgICAiIiJSZXR1cm4gYG5hbWVgIGVudHJ5IHBvaW50IG9mIGBncm91cGAgZm9yIGBkaXN0YCBvciByYWlzZSBJbXBvcnRFcnJvciIiIgogICAgcmV0dXJuIGdldF9kaXN0cmlidXRpb24oZGlzdCkubG9hZF9lbnRyeV9wb2ludChncm91cCwgbmFtZSkKCgpkZWYgZ2V0X2VudHJ5X21hcChkaXN0LCBncm91cD1Ob25lKToKICAgICIiIlJldHVybiB0aGUgZW50cnkgcG9pbnQgbWFwIGZvciBgZ3JvdXBgLCBvciB0aGUgZnVsbCBlbnRyeSBtYXAiIiIKICAgIHJldHVybiBnZXRfZGlzdHJpYnV0aW9uKGRpc3QpLmdldF9lbnRyeV9tYXAoZ3JvdXApCgoKZGVmIGdldF9lbnRyeV9pbmZvKGRpc3QsIGdyb3VwLCBuYW1lKToKICAgICIiIlJldHVybiB0aGUgRW50cnlQb2ludCBvYmplY3QgZm9yIGBncm91cGArYG5hbWVgLCBvciBgYE5vbmVgYCIiIgogICAgcmV0dXJuIGdldF9kaXN0cmlidXRpb24oZGlzdCkuZ2V0X2VudHJ5X2luZm8oZ3JvdXAsIG5hbWUpCgoKY2xhc3MgSU1ldGFkYXRhUHJvdmlkZXI6CiAgICBkZWYgaGFzX21ldGFkYXRhKG5hbWUpOgogICAgICAgICIiIkRvZXMgdGhlIHBhY2thZ2UncyBkaXN0cmlidXRpb24gY29udGFpbiB0aGUgbmFtZWQgbWV0YWRhdGE/IiIiCgogICAgZGVmIGdldF9tZXRhZGF0YShuYW1lKToKICAgICAgICAiIiJUaGUgbmFtZWQgbWV0YWRhdGEgcmVzb3VyY2UgYXMgYSBzdHJpbmciIiIKCiAgICBkZWYgZ2V0X21ldGFkYXRhX2xpbmVzKG5hbWUpOgogICAgICAgICIiIllpZWxkIG5hbWVkIG1ldGFkYXRhIHJlc291cmNlIGFzIGxpc3Qgb2Ygbm9uLWJsYW5rIG5vbi1jb21tZW50IGxpbmVzCgogICAgICAgTGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBpcyBzdHJpcHBlZCBmcm9tIGVhY2ggbGluZSwgYW5kIGxpbmVzCiAgICAgICB3aXRoIGBgI2BgIGFzIHRoZSBmaXJzdCBub24tYmxhbmsgY2hhcmFjdGVyIGFyZSBvbWl0dGVkLiIiIgoKICAgIGRlZiBtZXRhZGF0YV9pc2RpcihuYW1lKToKICAgICAgICAiIiJJcyB0aGUgbmFtZWQgbWV0YWRhdGEgYSBkaXJlY3Rvcnk/ICAobGlrZSBgYG9zLnBhdGguaXNkaXIoKWBgKSIiIgoKICAgIGRlZiBtZXRhZGF0YV9saXN0ZGlyKG5hbWUpOgogICAgICAgICIiIkxpc3Qgb2YgbWV0YWRhdGEgbmFtZXMgaW4gdGhlIGRpcmVjdG9yeSAobGlrZSBgYG9zLmxpc3RkaXIoKWBgKSIiIgoKICAgIGRlZiBydW5fc2NyaXB0KHNjcmlwdF9uYW1lLCBuYW1lc3BhY2UpOgogICAgICAgICIiIkV4ZWN1dGUgdGhlIG5hbWVkIHNjcmlwdCBpbiB0aGUgc3VwcGxpZWQgbmFtZXNwYWNlIGRpY3Rpb25hcnkiIiIKCgpjbGFzcyBJUmVzb3VyY2VQcm92aWRlcihJTWV0YWRhdGFQcm92aWRlcik6CiAgICAiIiJBbiBvYmplY3QgdGhhdCBwcm92aWRlcyBhY2Nlc3MgdG8gcGFja2FnZSByZXNvdXJjZXMiIiIKCiAgICBkZWYgZ2V0X3Jlc291cmNlX2ZpbGVuYW1lKG1hbmFnZXIsIHJlc291cmNlX25hbWUpOgogICAgICAgICIiIlJldHVybiBhIHRydWUgZmlsZXN5c3RlbSBwYXRoIGZvciBgcmVzb3VyY2VfbmFtZWAKCiAgICAgICAgYG1hbmFnZXJgIG11c3QgYmUgYW4gYGBJUmVzb3VyY2VNYW5hZ2VyYGAiIiIKCiAgICBkZWYgZ2V0X3Jlc291cmNlX3N0cmVhbShtYW5hZ2VyLCByZXNvdXJjZV9uYW1lKToKICAgICAgICAiIiJSZXR1cm4gYSByZWFkYWJsZSBmaWxlLWxpa2Ugb2JqZWN0IGZvciBgcmVzb3VyY2VfbmFtZWAKCiAgICAgICAgYG1hbmFnZXJgIG11c3QgYmUgYW4gYGBJUmVzb3VyY2VNYW5hZ2VyYGAiIiIKCiAgICBkZWYgZ2V0X3Jlc291cmNlX3N0cmluZyhtYW5hZ2VyLCByZXNvdXJjZV9uYW1lKToKICAgICAgICAiIiJSZXR1cm4gYSBzdHJpbmcgY29udGFpbmluZyB0aGUgY29udGVudHMgb2YgYHJlc291cmNlX25hbWVgCgogICAgICAgIGBtYW5hZ2VyYCBtdXN0IGJlIGFuIGBgSVJlc291cmNlTWFuYWdlcmBgIiIiCgogICAgZGVmIGhhc19yZXNvdXJjZShyZXNvdXJjZV9uYW1lKToKICAgICAgICAiIiJEb2VzIHRoZSBwYWNrYWdlIGNvbnRhaW4gdGhlIG5hbWVkIHJlc291cmNlPyIiIgoKICAgIGRlZiByZXNvdXJjZV9pc2RpcihyZXNvdXJjZV9uYW1lKToKICAgICAgICAiIiJJcyB0aGUgbmFtZWQgcmVzb3VyY2UgYSBkaXJlY3Rvcnk/ICAobGlrZSBgYG9zLnBhdGguaXNkaXIoKWBgKSIiIgoKICAgIGRlZiByZXNvdXJjZV9saXN0ZGlyKHJlc291cmNlX25hbWUpOgogICAgICAgICIiIkxpc3Qgb2YgcmVzb3VyY2UgbmFtZXMgaW4gdGhlIGRpcmVjdG9yeSAobGlrZSBgYG9zLmxpc3RkaXIoKWBgKSIiIgoKCmNsYXNzIFdvcmtpbmdTZXQ6CiAgICAiIiJBIGNvbGxlY3Rpb24gb2YgYWN0aXZlIGRpc3RyaWJ1dGlvbnMgb24gc3lzLnBhdGggKG9yIGEgc2ltaWxhciBsaXN0KSIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlbnRyaWVzPU5vbmUpOgogICAgICAgICIiIkNyZWF0ZSB3b3JraW5nIHNldCBmcm9tIGxpc3Qgb2YgcGF0aCBlbnRyaWVzIChkZWZhdWx0PXN5cy5wYXRoKSIiIgogICAgICAgIHNlbGYuZW50cmllcyA9IFtdCiAgICAgICAgc2VsZi5lbnRyeV9rZXlzID0ge30KICAgICAgICBzZWxmLmJ5X2tleSA9IHt9CiAgICAgICAgc2VsZi5jYWxsYmFja3MgPSBbXQoKICAgICAgICBpZiBlbnRyaWVzIGlzIE5vbmU6CiAgICAgICAgICAgIGVudHJpZXMgPSBzeXMucGF0aAoKICAgICAgICBmb3IgZW50cnkgaW4gZW50cmllczoKICAgICAgICAgICAgc2VsZi5hZGRfZW50cnkoZW50cnkpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX2J1aWxkX21hc3RlcihjbHMpOgogICAgICAgICIiIgogICAgICAgIFByZXBhcmUgdGhlIG1hc3RlciB3b3JraW5nIHNldC4KICAgICAgICAiIiIKICAgICAgICB3cyA9IGNscygpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBmcm9tIF9fbWFpbl9fIGltcG9ydCBfX3JlcXVpcmVzX18KICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgICAgICMgVGhlIG1haW4gcHJvZ3JhbSBkb2VzIG5vdCBsaXN0IGFueSByZXF1aXJlbWVudHMKICAgICAgICAgICAgcmV0dXJuIHdzCgogICAgICAgICMgZW5zdXJlIHRoZSByZXF1aXJlbWVudHMgYXJlIG1ldAogICAgICAgIHRyeToKICAgICAgICAgICAgd3MucmVxdWlyZShfX3JlcXVpcmVzX18pCiAgICAgICAgZXhjZXB0IFZlcnNpb25Db25mbGljdDoKICAgICAgICAgICAgcmV0dXJuIGNscy5fYnVpbGRfZnJvbV9yZXF1aXJlbWVudHMoX19yZXF1aXJlc19fKQoKICAgICAgICByZXR1cm4gd3MKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfYnVpbGRfZnJvbV9yZXF1aXJlbWVudHMoY2xzLCByZXFfc3BlYyk6CiAgICAgICAgIiIiCiAgICAgICAgQnVpbGQgYSB3b3JraW5nIHNldCBmcm9tIGEgcmVxdWlyZW1lbnQgc3BlYy4gUmV3cml0ZXMgc3lzLnBhdGguCiAgICAgICAgIiIiCiAgICAgICAgIyB0cnkgaXQgd2l0aG91dCBkZWZhdWx0cyBhbHJlYWR5IG9uIHN5cy5wYXRoCiAgICAgICAgIyBieSBzdGFydGluZyB3aXRoIGFuIGVtcHR5IHBhdGgKICAgICAgICB3cyA9IGNscyhbXSkKICAgICAgICByZXFzID0gcGFyc2VfcmVxdWlyZW1lbnRzKHJlcV9zcGVjKQogICAgICAgIGRpc3RzID0gd3MucmVzb2x2ZShyZXFzLCBFbnZpcm9ubWVudCgpKQogICAgICAgIGZvciBkaXN0IGluIGRpc3RzOgogICAgICAgICAgICB3cy5hZGQoZGlzdCkKCiAgICAgICAgIyBhZGQgYW55IG1pc3NpbmcgZW50cmllcyBmcm9tIHN5cy5wYXRoCiAgICAgICAgZm9yIGVudHJ5IGluIHN5cy5wYXRoOgogICAgICAgICAgICBpZiBlbnRyeSBub3QgaW4gd3MuZW50cmllczoKICAgICAgICAgICAgICAgIHdzLmFkZF9lbnRyeShlbnRyeSkKCiAgICAgICAgIyB0aGVuIGNvcHkgYmFjayB0byBzeXMucGF0aAogICAgICAgIHN5cy5wYXRoWzpdID0gd3MuZW50cmllcwogICAgICAgIHJldHVybiB3cwoKICAgIGRlZiBhZGRfZW50cnkoc2VsZiwgZW50cnkpOgogICAgICAgICIiIkFkZCBhIHBhdGggaXRlbSB0byBgYC5lbnRyaWVzYGAsIGZpbmRpbmcgYW55IGRpc3RyaWJ1dGlvbnMgb24gaXQKCiAgICAgICAgYGBmaW5kX2Rpc3RyaWJ1dGlvbnMoZW50cnksIFRydWUpYGAgaXMgdXNlZCB0byBmaW5kIGRpc3RyaWJ1dGlvbnMKICAgICAgICBjb3JyZXNwb25kaW5nIHRvIHRoZSBwYXRoIGVudHJ5LCBhbmQgdGhleSBhcmUgYWRkZWQuICBgZW50cnlgIGlzCiAgICAgICAgYWx3YXlzIGFwcGVuZGVkIHRvIGBgLmVudHJpZXNgYCwgZXZlbiBpZiBpdCBpcyBhbHJlYWR5IHByZXNlbnQuCiAgICAgICAgKFRoaXMgaXMgYmVjYXVzZSBgYHN5cy5wYXRoYGAgY2FuIGNvbnRhaW4gdGhlIHNhbWUgdmFsdWUgbW9yZSB0aGFuCiAgICAgICAgb25jZSwgYW5kIHRoZSBgYC5lbnRyaWVzYGAgb2YgdGhlIGBgc3lzLnBhdGhgYCBXb3JraW5nU2V0IHNob3VsZCBhbHdheXMKICAgICAgICBlcXVhbCBgYHN5cy5wYXRoYGAuKQogICAgICAgICIiIgogICAgICAgIHNlbGYuZW50cnlfa2V5cy5zZXRkZWZhdWx0KGVudHJ5LCBbXSkKICAgICAgICBzZWxmLmVudHJpZXMuYXBwZW5kKGVudHJ5KQogICAgICAgIGZvciBkaXN0IGluIGZpbmRfZGlzdHJpYnV0aW9ucyhlbnRyeSwgVHJ1ZSk6CiAgICAgICAgICAgIHNlbGYuYWRkKGRpc3QsIGVudHJ5LCBGYWxzZSkKCiAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGRpc3QpOgogICAgICAgICIiIlRydWUgaWYgYGRpc3RgIGlzIHRoZSBhY3RpdmUgZGlzdHJpYnV0aW9uIGZvciBpdHMgcHJvamVjdCIiIgogICAgICAgIHJldHVybiBzZWxmLmJ5X2tleS5nZXQoZGlzdC5rZXkpID09IGRpc3QKCiAgICBkZWYgZmluZChzZWxmLCByZXEpOgogICAgICAgICIiIkZpbmQgYSBkaXN0cmlidXRpb24gbWF0Y2hpbmcgcmVxdWlyZW1lbnQgYHJlcWAKCiAgICAgICAgSWYgdGhlcmUgaXMgYW4gYWN0aXZlIGRpc3RyaWJ1dGlvbiBmb3IgdGhlIHJlcXVlc3RlZCBwcm9qZWN0LCB0aGlzCiAgICAgICAgcmV0dXJucyBpdCBhcyBsb25nIGFzIGl0IG1lZXRzIHRoZSB2ZXJzaW9uIHJlcXVpcmVtZW50IHNwZWNpZmllZCBieQogICAgICAgIGByZXFgLiAgQnV0LCBpZiB0aGVyZSBpcyBhbiBhY3RpdmUgZGlzdHJpYnV0aW9uIGZvciB0aGUgcHJvamVjdCBhbmQgaXQKICAgICAgICBkb2VzICpub3QqIG1lZXQgdGhlIGByZXFgIHJlcXVpcmVtZW50LCBgYFZlcnNpb25Db25mbGljdGBgIGlzIHJhaXNlZC4KICAgICAgICBJZiB0aGVyZSBpcyBubyBhY3RpdmUgZGlzdHJpYnV0aW9uIGZvciB0aGUgcmVxdWVzdGVkIHByb2plY3QsIGBgTm9uZWBgCiAgICAgICAgaXMgcmV0dXJuZWQuCiAgICAgICAgIiIiCiAgICAgICAgZGlzdCA9IHNlbGYuYnlfa2V5LmdldChyZXEua2V5KQogICAgICAgIGlmIGRpc3QgaXMgbm90IE5vbmUgYW5kIGRpc3Qgbm90IGluIHJlcToKICAgICAgICAgICAgIyBYWFggYWRkIG1vcmUgaW5mbwogICAgICAgICAgICByYWlzZSBWZXJzaW9uQ29uZmxpY3QoZGlzdCwgcmVxKQogICAgICAgIHJldHVybiBkaXN0CgogICAgZGVmIGl0ZXJfZW50cnlfcG9pbnRzKHNlbGYsIGdyb3VwLCBuYW1lPU5vbmUpOgogICAgICAgICIiIllpZWxkIGVudHJ5IHBvaW50IG9iamVjdHMgZnJvbSBgZ3JvdXBgIG1hdGNoaW5nIGBuYW1lYAoKICAgICAgICBJZiBgbmFtZWAgaXMgTm9uZSwgeWllbGRzIGFsbCBlbnRyeSBwb2ludHMgaW4gYGdyb3VwYCBmcm9tIGFsbAogICAgICAgIGRpc3RyaWJ1dGlvbnMgaW4gdGhlIHdvcmtpbmcgc2V0LCBvdGhlcndpc2Ugb25seSBvbmVzIG1hdGNoaW5nCiAgICAgICAgYm90aCBgZ3JvdXBgIGFuZCBgbmFtZWAgYXJlIHlpZWxkZWQgKGluIGRpc3RyaWJ1dGlvbiBvcmRlcikuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgZW50cnkKICAgICAgICAgICAgZm9yIGRpc3QgaW4gc2VsZgogICAgICAgICAgICBmb3IgZW50cnkgaW4gZGlzdC5nZXRfZW50cnlfbWFwKGdyb3VwKS52YWx1ZXMoKQogICAgICAgICAgICBpZiBuYW1lIGlzIE5vbmUgb3IgbmFtZSA9PSBlbnRyeS5uYW1lCiAgICAgICAgKQoKICAgIGRlZiBydW5fc2NyaXB0KHNlbGYsIHJlcXVpcmVzLCBzY3JpcHRfbmFtZSk6CiAgICAgICAgIiIiTG9jYXRlIGRpc3RyaWJ1dGlvbiBmb3IgYHJlcXVpcmVzYCBhbmQgcnVuIGBzY3JpcHRfbmFtZWAgc2NyaXB0IiIiCiAgICAgICAgbnMgPSBzeXMuX2dldGZyYW1lKDEpLmZfZ2xvYmFscwogICAgICAgIG5hbWUgPSBuc1snX19uYW1lX18nXQogICAgICAgIG5zLmNsZWFyKCkKICAgICAgICBuc1snX19uYW1lX18nXSA9IG5hbWUKICAgICAgICBzZWxmLnJlcXVpcmUocmVxdWlyZXMpWzBdLnJ1bl9zY3JpcHQoc2NyaXB0X25hbWUsIG5zKQoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICAiIiJZaWVsZCBkaXN0cmlidXRpb25zIGZvciBub24tZHVwbGljYXRlIHByb2plY3RzIGluIHRoZSB3b3JraW5nIHNldAoKICAgICAgICBUaGUgeWllbGQgb3JkZXIgaXMgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBpdGVtcycgcGF0aCBlbnRyaWVzIHdlcmUKICAgICAgICBhZGRlZCB0byB0aGUgd29ya2luZyBzZXQuCiAgICAgICAgIiIiCiAgICAgICAgc2VlbiA9IHt9CiAgICAgICAgZm9yIGl0ZW0gaW4gc2VsZi5lbnRyaWVzOgogICAgICAgICAgICBpZiBpdGVtIG5vdCBpbiBzZWxmLmVudHJ5X2tleXM6CiAgICAgICAgICAgICAgICAjIHdvcmthcm91bmQgYSBjYWNoZSBpc3N1ZQogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgIGZvciBrZXkgaW4gc2VsZi5lbnRyeV9rZXlzW2l0ZW1dOgogICAgICAgICAgICAgICAgaWYga2V5IG5vdCBpbiBzZWVuOgogICAgICAgICAgICAgICAgICAgIHNlZW5ba2V5XSA9IDEKICAgICAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLmJ5X2tleVtrZXldCgogICAgZGVmIGFkZChzZWxmLCBkaXN0LCBlbnRyeT1Ob25lLCBpbnNlcnQ9VHJ1ZSwgcmVwbGFjZT1GYWxzZSk6CiAgICAgICAgIiIiQWRkIGBkaXN0YCB0byB3b3JraW5nIHNldCwgYXNzb2NpYXRlZCB3aXRoIGBlbnRyeWAKCiAgICAgICAgSWYgYGVudHJ5YCBpcyB1bnNwZWNpZmllZCwgaXQgZGVmYXVsdHMgdG8gdGhlIGBgLmxvY2F0aW9uYGAgb2YgYGRpc3RgLgogICAgICAgIE9uIGV4aXQgZnJvbSB0aGlzIHJvdXRpbmUsIGBlbnRyeWAgaXMgYWRkZWQgdG8gdGhlIGVuZCBvZiB0aGUgd29ya2luZwogICAgICAgIHNldCdzIGBgLmVudHJpZXNgYCAoaWYgaXQgd2Fzbid0IGFscmVhZHkgcHJlc2VudCkuCgogICAgICAgIGBkaXN0YCBpcyBvbmx5IGFkZGVkIHRvIHRoZSB3b3JraW5nIHNldCBpZiBpdCdzIGZvciBhIHByb2plY3QgdGhhdAogICAgICAgIGRvZXNuJ3QgYWxyZWFkeSBoYXZlIGEgZGlzdHJpYnV0aW9uIGluIHRoZSBzZXQsIHVubGVzcyBgcmVwbGFjZT1UcnVlYC4KICAgICAgICBJZiBpdCdzIGFkZGVkLCBhbnkgY2FsbGJhY2tzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgYGBzdWJzY3JpYmUoKWBgIG1ldGhvZAogICAgICAgIHdpbGwgYmUgY2FsbGVkLgogICAgICAgICIiIgogICAgICAgIGlmIGluc2VydDoKICAgICAgICAgICAgZGlzdC5pbnNlcnRfb24oc2VsZi5lbnRyaWVzLCBlbnRyeSwgcmVwbGFjZT1yZXBsYWNlKQoKICAgICAgICBpZiBlbnRyeSBpcyBOb25lOgogICAgICAgICAgICBlbnRyeSA9IGRpc3QubG9jYXRpb24KICAgICAgICBrZXlzID0gc2VsZi5lbnRyeV9rZXlzLnNldGRlZmF1bHQoZW50cnksIFtdKQogICAgICAgIGtleXMyID0gc2VsZi5lbnRyeV9rZXlzLnNldGRlZmF1bHQoZGlzdC5sb2NhdGlvbiwgW10pCiAgICAgICAgaWYgbm90IHJlcGxhY2UgYW5kIGRpc3Qua2V5IGluIHNlbGYuYnlfa2V5OgogICAgICAgICAgICAjIGlnbm9yZSBoaWRkZW4gZGlzdHJvcwogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgc2VsZi5ieV9rZXlbZGlzdC5rZXldID0gZGlzdAogICAgICAgIGlmIGRpc3Qua2V5IG5vdCBpbiBrZXlzOgogICAgICAgICAgICBrZXlzLmFwcGVuZChkaXN0LmtleSkKICAgICAgICBpZiBkaXN0LmtleSBub3QgaW4ga2V5czI6CiAgICAgICAgICAgIGtleXMyLmFwcGVuZChkaXN0LmtleSkKICAgICAgICBzZWxmLl9hZGRlZF9uZXcoZGlzdCkKCiAgICBkZWYgcmVzb2x2ZShzZWxmLCByZXF1aXJlbWVudHMsIGVudj1Ob25lLCBpbnN0YWxsZXI9Tm9uZSwKICAgICAgICAgICAgICAgIHJlcGxhY2VfY29uZmxpY3Rpbmc9RmFsc2UsIGV4dHJhcz1Ob25lKToKICAgICAgICAiIiJMaXN0IGFsbCBkaXN0cmlidXRpb25zIG5lZWRlZCB0byAocmVjdXJzaXZlbHkpIG1lZXQgYHJlcXVpcmVtZW50c2AKCiAgICAgICAgYHJlcXVpcmVtZW50c2AgbXVzdCBiZSBhIHNlcXVlbmNlIG9mIGBgUmVxdWlyZW1lbnRgYCBvYmplY3RzLiAgYGVudmAsCiAgICAgICAgaWYgc3VwcGxpZWQsIHNob3VsZCBiZSBhbiBgYEVudmlyb25tZW50YGAgaW5zdGFuY2UuICBJZgogICAgICAgIG5vdCBzdXBwbGllZCwgaXQgZGVmYXVsdHMgdG8gYWxsIGRpc3RyaWJ1dGlvbnMgYXZhaWxhYmxlIHdpdGhpbiBhbnkKICAgICAgICBlbnRyeSBvciBkaXN0cmlidXRpb24gaW4gdGhlIHdvcmtpbmcgc2V0LiAgYGluc3RhbGxlcmAsIGlmIHN1cHBsaWVkLAogICAgICAgIHdpbGwgYmUgaW52b2tlZCB3aXRoIGVhY2ggcmVxdWlyZW1lbnQgdGhhdCBjYW5ub3QgYmUgbWV0IGJ5IGFuCiAgICAgICAgYWxyZWFkeS1pbnN0YWxsZWQgZGlzdHJpYnV0aW9uOyBpdCBzaG91bGQgcmV0dXJuIGEgYGBEaXN0cmlidXRpb25gYCBvcgogICAgICAgIGBgTm9uZWBgLgoKICAgICAgICBVbmxlc3MgYHJlcGxhY2VfY29uZmxpY3Rpbmc9VHJ1ZWAsIHJhaXNlcyBhIFZlcnNpb25Db25mbGljdCBleGNlcHRpb24KICAgICAgICBpZgogICAgICAgIGFueSByZXF1aXJlbWVudHMgYXJlIGZvdW5kIG9uIHRoZSBwYXRoIHRoYXQgaGF2ZSB0aGUgY29ycmVjdCBuYW1lIGJ1dAogICAgICAgIHRoZSB3cm9uZyB2ZXJzaW9uLiAgT3RoZXJ3aXNlLCBpZiBhbiBgaW5zdGFsbGVyYCBpcyBzdXBwbGllZCBpdCB3aWxsIGJlCiAgICAgICAgaW52b2tlZCB0byBvYnRhaW4gdGhlIGNvcnJlY3QgdmVyc2lvbiBvZiB0aGUgcmVxdWlyZW1lbnQgYW5kIGFjdGl2YXRlCiAgICAgICAgaXQuCgogICAgICAgIGBleHRyYXNgIGlzIGEgbGlzdCBvZiB0aGUgZXh0cmFzIHRvIGJlIHVzZWQgd2l0aCB0aGVzZSByZXF1aXJlbWVudHMuCiAgICAgICAgVGhpcyBpcyBpbXBvcnRhbnQgYmVjYXVzZSBleHRyYSByZXF1aXJlbWVudHMgbWF5IGxvb2sgbGlrZSBgbXlfcmVxOwogICAgICAgIGV4dHJhID0gIm15X2V4dHJhImAsIHdoaWNoIHdvdWxkIG90aGVyd2lzZSBiZSBpbnRlcnByZXRlZCBhcyBhIHB1cmVseQogICAgICAgIG9wdGlvbmFsIHJlcXVpcmVtZW50LiAgSW5zdGVhZCwgd2Ugd2FudCB0byBiZSBhYmxlIHRvIGFzc2VydCB0aGF0IHRoZXNlCiAgICAgICAgcmVxdWlyZW1lbnRzIGFyZSB0cnVseSByZXF1aXJlZC4KICAgICAgICAiIiIKCiAgICAgICAgIyBzZXQgdXAgdGhlIHN0YWNrCiAgICAgICAgcmVxdWlyZW1lbnRzID0gbGlzdChyZXF1aXJlbWVudHMpWzo6LTFdCiAgICAgICAgIyBzZXQgb2YgcHJvY2Vzc2VkIHJlcXVpcmVtZW50cwogICAgICAgIHByb2Nlc3NlZCA9IHt9CiAgICAgICAgIyBrZXkgLT4gZGlzdAogICAgICAgIGJlc3QgPSB7fQogICAgICAgIHRvX2FjdGl2YXRlID0gW10KCiAgICAgICAgcmVxX2V4dHJhcyA9IF9SZXFFeHRyYXMoKQoKICAgICAgICAjIE1hcHBpbmcgb2YgcmVxdWlyZW1lbnQgdG8gc2V0IG9mIGRpc3RyaWJ1dGlvbnMgdGhhdCByZXF1aXJlZCBpdDsKICAgICAgICAjIHVzZWZ1bCBmb3IgcmVwb3J0aW5nIGluZm8gYWJvdXQgY29uZmxpY3RzLgogICAgICAgIHJlcXVpcmVkX2J5ID0gY29sbGVjdGlvbnMuZGVmYXVsdGRpY3Qoc2V0KQoKICAgICAgICB3aGlsZSByZXF1aXJlbWVudHM6CiAgICAgICAgICAgICMgcHJvY2VzcyBkZXBlbmRlbmNpZXMgYnJlYWR0aC1maXJzdAogICAgICAgICAgICByZXEgPSByZXF1aXJlbWVudHMucG9wKDApCiAgICAgICAgICAgIGlmIHJlcSBpbiBwcm9jZXNzZWQ6CiAgICAgICAgICAgICAgICAjIElnbm9yZSBjeWNsaWMgb3IgcmVkdW5kYW50IGRlcGVuZGVuY2llcwogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgIGlmIG5vdCByZXFfZXh0cmFzLm1hcmtlcnNfcGFzcyhyZXEsIGV4dHJhcyk6CiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgZGlzdCA9IGJlc3QuZ2V0KHJlcS5rZXkpCiAgICAgICAgICAgIGlmIGRpc3QgaXMgTm9uZToKICAgICAgICAgICAgICAgICMgRmluZCB0aGUgYmVzdCBkaXN0cmlidXRpb24gYW5kIGFkZCBpdCB0byB0aGUgbWFwCiAgICAgICAgICAgICAgICBkaXN0ID0gc2VsZi5ieV9rZXkuZ2V0KHJlcS5rZXkpCiAgICAgICAgICAgICAgICBpZiBkaXN0IGlzIE5vbmUgb3IgKGRpc3Qgbm90IGluIHJlcSBhbmQgcmVwbGFjZV9jb25mbGljdGluZyk6CiAgICAgICAgICAgICAgICAgICAgd3MgPSBzZWxmCiAgICAgICAgICAgICAgICAgICAgaWYgZW52IGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGRpc3QgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudiA9IEVudmlyb25tZW50KHNlbGYuZW50cmllcykKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVXNlIGFuIGVtcHR5IGVudmlyb25tZW50IGFuZCB3b3JraW5nc2V0IHRvIGF2b2lkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFueSBmdXJ0aGVyIGNvbmZsaWN0cyB3aXRoIHRoZSBjb25mbGljdGluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBkaXN0cmlidXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudiA9IEVudmlyb25tZW50KFtdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgd3MgPSBXb3JraW5nU2V0KFtdKQogICAgICAgICAgICAgICAgICAgIGRpc3QgPSBiZXN0W3JlcS5rZXldID0gZW52LmJlc3RfbWF0Y2goCiAgICAgICAgICAgICAgICAgICAgICAgIHJlcSwgd3MsIGluc3RhbGxlciwKICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZV9jb25mbGljdGluZz1yZXBsYWNlX2NvbmZsaWN0aW5nCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIGlmIGRpc3QgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZXJzID0gcmVxdWlyZWRfYnkuZ2V0KHJlcSwgTm9uZSkKICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHJpYnV0aW9uTm90Rm91bmQocmVxLCByZXF1aXJlcnMpCiAgICAgICAgICAgICAgICB0b19hY3RpdmF0ZS5hcHBlbmQoZGlzdCkKICAgICAgICAgICAgaWYgZGlzdCBub3QgaW4gcmVxOgogICAgICAgICAgICAgICAgIyBPb3BzLCB0aGUgImJlc3QiIHNvIGZhciBjb25mbGljdHMgd2l0aCBhIGRlcGVuZGVuY3kKICAgICAgICAgICAgICAgIGRlcGVuZGVudF9yZXEgPSByZXF1aXJlZF9ieVtyZXFdCiAgICAgICAgICAgICAgICByYWlzZSBWZXJzaW9uQ29uZmxpY3QoZGlzdCwgcmVxKS53aXRoX2NvbnRleHQoZGVwZW5kZW50X3JlcSkKCiAgICAgICAgICAgICMgcHVzaCB0aGUgbmV3IHJlcXVpcmVtZW50cyBvbnRvIHRoZSBzdGFjawogICAgICAgICAgICBuZXdfcmVxdWlyZW1lbnRzID0gZGlzdC5yZXF1aXJlcyhyZXEuZXh0cmFzKVs6Oi0xXQogICAgICAgICAgICByZXF1aXJlbWVudHMuZXh0ZW5kKG5ld19yZXF1aXJlbWVudHMpCgogICAgICAgICAgICAjIFJlZ2lzdGVyIHRoZSBuZXcgcmVxdWlyZW1lbnRzIG5lZWRlZCBieSByZXEKICAgICAgICAgICAgZm9yIG5ld19yZXF1aXJlbWVudCBpbiBuZXdfcmVxdWlyZW1lbnRzOgogICAgICAgICAgICAgICAgcmVxdWlyZWRfYnlbbmV3X3JlcXVpcmVtZW50XS5hZGQocmVxLnByb2plY3RfbmFtZSkKICAgICAgICAgICAgICAgIHJlcV9leHRyYXNbbmV3X3JlcXVpcmVtZW50XSA9IHJlcS5leHRyYXMKCiAgICAgICAgICAgIHByb2Nlc3NlZFtyZXFdID0gVHJ1ZQoKICAgICAgICAjIHJldHVybiBsaXN0IG9mIGRpc3Ryb3MgdG8gYWN0aXZhdGUKICAgICAgICByZXR1cm4gdG9fYWN0aXZhdGUKCiAgICBkZWYgZmluZF9wbHVnaW5zKAogICAgICAgICAgICBzZWxmLCBwbHVnaW5fZW52LCBmdWxsX2Vudj1Ob25lLCBpbnN0YWxsZXI9Tm9uZSwgZmFsbGJhY2s9VHJ1ZSk6CiAgICAgICAgIiIiRmluZCBhbGwgYWN0aXZhdGFibGUgZGlzdHJpYnV0aW9ucyBpbiBgcGx1Z2luX2VudmAKCiAgICAgICAgRXhhbXBsZSB1c2FnZTo6CgogICAgICAgICAgICBkaXN0cmlidXRpb25zLCBlcnJvcnMgPSB3b3JraW5nX3NldC5maW5kX3BsdWdpbnMoCiAgICAgICAgICAgICAgICBFbnZpcm9ubWVudChwbHVnaW5fZGlybGlzdCkKICAgICAgICAgICAgKQogICAgICAgICAgICAjIGFkZCBwbHVnaW5zK2xpYnMgdG8gc3lzLnBhdGgKICAgICAgICAgICAgbWFwKHdvcmtpbmdfc2V0LmFkZCwgZGlzdHJpYnV0aW9ucykKICAgICAgICAgICAgIyBkaXNwbGF5IGVycm9ycwogICAgICAgICAgICBwcmludCgnQ291bGQgbm90IGxvYWQnLCBlcnJvcnMpCgogICAgICAgIFRoZSBgcGx1Z2luX2VudmAgc2hvdWxkIGJlIGFuIGBgRW52aXJvbm1lbnRgYCBpbnN0YW5jZSB0aGF0IGNvbnRhaW5zCiAgICAgICAgb25seSBkaXN0cmlidXRpb25zIHRoYXQgYXJlIGluIHRoZSBwcm9qZWN0J3MgInBsdWdpbiBkaXJlY3RvcnkiIG9yCiAgICAgICAgZGlyZWN0b3JpZXMuIFRoZSBgZnVsbF9lbnZgLCBpZiBzdXBwbGllZCwgc2hvdWxkIGJlIGFuIGBgRW52aXJvbm1lbnRgYAogICAgICAgIGNvbnRhaW5zIGFsbCBjdXJyZW50bHktYXZhaWxhYmxlIGRpc3RyaWJ1dGlvbnMuICBJZiBgZnVsbF9lbnZgIGlzIG5vdAogICAgICAgIHN1cHBsaWVkLCBvbmUgaXMgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gdGhlIGBgV29ya2luZ1NldGBgIHRoaXMKICAgICAgICBtZXRob2QgaXMgY2FsbGVkIG9uLCB3aGljaCB3aWxsIHR5cGljYWxseSBtZWFuIHRoYXQgZXZlcnkgZGlyZWN0b3J5IG9uCiAgICAgICAgYGBzeXMucGF0aGBgIHdpbGwgYmUgc2Nhbm5lZCBmb3IgZGlzdHJpYnV0aW9ucy4KCiAgICAgICAgYGluc3RhbGxlcmAgaXMgYSBzdGFuZGFyZCBpbnN0YWxsZXIgY2FsbGJhY2sgYXMgdXNlZCBieSB0aGUKICAgICAgICBgYHJlc29sdmUoKWBgIG1ldGhvZC4gVGhlIGBmYWxsYmFja2AgZmxhZyBpbmRpY2F0ZXMgd2hldGhlciB3ZSBzaG91bGQKICAgICAgICBhdHRlbXB0IHRvIHJlc29sdmUgb2xkZXIgdmVyc2lvbnMgb2YgYSBwbHVnaW4gaWYgdGhlIG5ld2VzdCB2ZXJzaW9uCiAgICAgICAgY2Fubm90IGJlIHJlc29sdmVkLgoKICAgICAgICBUaGlzIG1ldGhvZCByZXR1cm5zIGEgMi10dXBsZTogKGBkaXN0cmlidXRpb25zYCwgYGVycm9yX2luZm9gKSwgd2hlcmUKICAgICAgICBgZGlzdHJpYnV0aW9uc2AgaXMgYSBsaXN0IG9mIHRoZSBkaXN0cmlidXRpb25zIGZvdW5kIGluIGBwbHVnaW5fZW52YAogICAgICAgIHRoYXQgd2VyZSBsb2FkYWJsZSwgYWxvbmcgd2l0aCBhbnkgb3RoZXIgZGlzdHJpYnV0aW9ucyB0aGF0IGFyZSBuZWVkZWQKICAgICAgICB0byByZXNvbHZlIHRoZWlyIGRlcGVuZGVuY2llcy4gIGBlcnJvcl9pbmZvYCBpcyBhIGRpY3Rpb25hcnkgbWFwcGluZwogICAgICAgIHVubG9hZGFibGUgcGx1Z2luIGRpc3RyaWJ1dGlvbnMgdG8gYW4gZXhjZXB0aW9uIGluc3RhbmNlIGRlc2NyaWJpbmcgdGhlCiAgICAgICAgZXJyb3IgdGhhdCBvY2N1cnJlZC4gVXN1YWxseSB0aGlzIHdpbGwgYmUgYSBgYERpc3RyaWJ1dGlvbk5vdEZvdW5kYGAgb3IKICAgICAgICBgYFZlcnNpb25Db25mbGljdGBgIGluc3RhbmNlLgogICAgICAgICIiIgoKICAgICAgICBwbHVnaW5fcHJvamVjdHMgPSBsaXN0KHBsdWdpbl9lbnYpCiAgICAgICAgIyBzY2FuIHByb2plY3QgbmFtZXMgaW4gYWxwaGFiZXRpYyBvcmRlcgogICAgICAgIHBsdWdpbl9wcm9qZWN0cy5zb3J0KCkKCiAgICAgICAgZXJyb3JfaW5mbyA9IHt9CiAgICAgICAgZGlzdHJpYnV0aW9ucyA9IHt9CgogICAgICAgIGlmIGZ1bGxfZW52IGlzIE5vbmU6CiAgICAgICAgICAgIGVudiA9IEVudmlyb25tZW50KHNlbGYuZW50cmllcykKICAgICAgICAgICAgZW52ICs9IHBsdWdpbl9lbnYKICAgICAgICBlbHNlOgogICAgICAgICAgICBlbnYgPSBmdWxsX2VudiArIHBsdWdpbl9lbnYKCiAgICAgICAgc2hhZG93X3NldCA9IHNlbGYuX19jbGFzc19fKFtdKQogICAgICAgICMgcHV0IGFsbCBvdXIgZW50cmllcyBpbiBzaGFkb3dfc2V0CiAgICAgICAgbGlzdChtYXAoc2hhZG93X3NldC5hZGQsIHNlbGYpKQoKICAgICAgICBmb3IgcHJvamVjdF9uYW1lIGluIHBsdWdpbl9wcm9qZWN0czoKCiAgICAgICAgICAgIGZvciBkaXN0IGluIHBsdWdpbl9lbnZbcHJvamVjdF9uYW1lXToKCiAgICAgICAgICAgICAgICByZXEgPSBbZGlzdC5hc19yZXF1aXJlbWVudCgpXQoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICByZXNvbHZlZXMgPSBzaGFkb3dfc2V0LnJlc29sdmUocmVxLCBlbnYsIGluc3RhbGxlcikKCiAgICAgICAgICAgICAgICBleGNlcHQgUmVzb2x1dGlvbkVycm9yIGFzIHY6CiAgICAgICAgICAgICAgICAgICAgIyBzYXZlIGVycm9yIGluZm8KICAgICAgICAgICAgICAgICAgICBlcnJvcl9pbmZvW2Rpc3RdID0gdgogICAgICAgICAgICAgICAgICAgIGlmIGZhbGxiYWNrOgogICAgICAgICAgICAgICAgICAgICAgICAjIHRyeSB0aGUgbmV4dCBvbGRlciB2ZXJzaW9uIG9mIHByb2plY3QKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAjIGdpdmUgdXAgb24gdGhpcyBwcm9qZWN0LCBrZWVwIGdvaW5nCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCgogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBsaXN0KG1hcChzaGFkb3dfc2V0LmFkZCwgcmVzb2x2ZWVzKSkKICAgICAgICAgICAgICAgICAgICBkaXN0cmlidXRpb25zLnVwZGF0ZShkaWN0LmZyb21rZXlzKHJlc29sdmVlcykpCgogICAgICAgICAgICAgICAgICAgICMgc3VjY2Vzcywgbm8gbmVlZCB0byB0cnkgYW55IG1vcmUgdmVyc2lvbnMgb2YgdGhpcyBwcm9qZWN0CiAgICAgICAgICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgZGlzdHJpYnV0aW9ucyA9IGxpc3QoZGlzdHJpYnV0aW9ucykKICAgICAgICBkaXN0cmlidXRpb25zLnNvcnQoKQoKICAgICAgICByZXR1cm4gZGlzdHJpYnV0aW9ucywgZXJyb3JfaW5mbwoKICAgIGRlZiByZXF1aXJlKHNlbGYsICpyZXF1aXJlbWVudHMpOgogICAgICAgICIiIkVuc3VyZSB0aGF0IGRpc3RyaWJ1dGlvbnMgbWF0Y2hpbmcgYHJlcXVpcmVtZW50c2AgYXJlIGFjdGl2YXRlZAoKICAgICAgICBgcmVxdWlyZW1lbnRzYCBtdXN0IGJlIGEgc3RyaW5nIG9yIGEgKHBvc3NpYmx5LW5lc3RlZCkgc2VxdWVuY2UKICAgICAgICB0aGVyZW9mLCBzcGVjaWZ5aW5nIHRoZSBkaXN0cmlidXRpb25zIGFuZCB2ZXJzaW9ucyByZXF1aXJlZC4gIFRoZQogICAgICAgIHJldHVybiB2YWx1ZSBpcyBhIHNlcXVlbmNlIG9mIHRoZSBkaXN0cmlidXRpb25zIHRoYXQgbmVlZGVkIHRvIGJlCiAgICAgICAgYWN0aXZhdGVkIHRvIGZ1bGZpbGwgdGhlIHJlcXVpcmVtZW50czsgYWxsIHJlbGV2YW50IGRpc3RyaWJ1dGlvbnMgYXJlCiAgICAgICAgaW5jbHVkZWQsIGV2ZW4gaWYgdGhleSB3ZXJlIGFscmVhZHkgYWN0aXZhdGVkIGluIHRoaXMgd29ya2luZyBzZXQuCiAgICAgICAgIiIiCiAgICAgICAgbmVlZGVkID0gc2VsZi5yZXNvbHZlKHBhcnNlX3JlcXVpcmVtZW50cyhyZXF1aXJlbWVudHMpKQoKICAgICAgICBmb3IgZGlzdCBpbiBuZWVkZWQ6CiAgICAgICAgICAgIHNlbGYuYWRkKGRpc3QpCgogICAgICAgIHJldHVybiBuZWVkZWQKCiAgICBkZWYgc3Vic2NyaWJlKHNlbGYsIGNhbGxiYWNrLCBleGlzdGluZz1UcnVlKToKICAgICAgICAiIiJJbnZva2UgYGNhbGxiYWNrYCBmb3IgYWxsIGRpc3RyaWJ1dGlvbnMKCiAgICAgICAgSWYgYGV4aXN0aW5nPVRydWVgIChkZWZhdWx0KSwKICAgICAgICBjYWxsIG9uIGFsbCBleGlzdGluZyBvbmVzLCBhcyB3ZWxsLgogICAgICAgICIiIgogICAgICAgIGlmIGNhbGxiYWNrIGluIHNlbGYuY2FsbGJhY2tzOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBzZWxmLmNhbGxiYWNrcy5hcHBlbmQoY2FsbGJhY2spCiAgICAgICAgaWYgbm90IGV4aXN0aW5nOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBmb3IgZGlzdCBpbiBzZWxmOgogICAgICAgICAgICBjYWxsYmFjayhkaXN0KQoKICAgIGRlZiBfYWRkZWRfbmV3KHNlbGYsIGRpc3QpOgogICAgICAgIGZvciBjYWxsYmFjayBpbiBzZWxmLmNhbGxiYWNrczoKICAgICAgICAgICAgY2FsbGJhY2soZGlzdCkKCiAgICBkZWYgX19nZXRzdGF0ZV9fKHNlbGYpOgogICAgICAgIHJldHVybiAoCiAgICAgICAgICAgIHNlbGYuZW50cmllc1s6XSwgc2VsZi5lbnRyeV9rZXlzLmNvcHkoKSwgc2VsZi5ieV9rZXkuY29weSgpLAogICAgICAgICAgICBzZWxmLmNhbGxiYWNrc1s6XQogICAgICAgICkKCiAgICBkZWYgX19zZXRzdGF0ZV9fKHNlbGYsIGVfa19iX2MpOgogICAgICAgIGVudHJpZXMsIGtleXMsIGJ5X2tleSwgY2FsbGJhY2tzID0gZV9rX2JfYwogICAgICAgIHNlbGYuZW50cmllcyA9IGVudHJpZXNbOl0KICAgICAgICBzZWxmLmVudHJ5X2tleXMgPSBrZXlzLmNvcHkoKQogICAgICAgIHNlbGYuYnlfa2V5ID0gYnlfa2V5LmNvcHkoKQogICAgICAgIHNlbGYuY2FsbGJhY2tzID0gY2FsbGJhY2tzWzpdCgoKY2xhc3MgX1JlcUV4dHJhcyhkaWN0KToKICAgICIiIgogICAgTWFwIGVhY2ggcmVxdWlyZW1lbnQgdG8gdGhlIGV4dHJhcyB0aGF0IGRlbWFuZGVkIGl0LgogICAgIiIiCgogICAgZGVmIG1hcmtlcnNfcGFzcyhzZWxmLCByZXEsIGV4dHJhcz1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBFdmFsdWF0ZSBtYXJrZXJzIGZvciByZXEgYWdhaW5zdCBlYWNoIGV4dHJhIHRoYXQKICAgICAgICBkZW1hbmRlZCBpdC4KCiAgICAgICAgUmV0dXJuIEZhbHNlIGlmIHRoZSByZXEgaGFzIGEgbWFya2VyIGFuZCBmYWlscwogICAgICAgIGV2YWx1YXRpb24uIE90aGVyd2lzZSwgcmV0dXJuIFRydWUuCiAgICAgICAgIiIiCiAgICAgICAgZXh0cmFfZXZhbHMgPSAoCiAgICAgICAgICAgIHJlcS5tYXJrZXIuZXZhbHVhdGUoeydleHRyYSc6IGV4dHJhfSkKICAgICAgICAgICAgZm9yIGV4dHJhIGluIHNlbGYuZ2V0KHJlcSwgKCkpICsgKGV4dHJhcyBvciAoTm9uZSwpKQogICAgICAgICkKICAgICAgICByZXR1cm4gbm90IHJlcS5tYXJrZXIgb3IgYW55KGV4dHJhX2V2YWxzKQoKCmNsYXNzIEVudmlyb25tZW50OgogICAgIiIiU2VhcmNoYWJsZSBzbmFwc2hvdCBvZiBkaXN0cmlidXRpb25zIG9uIGEgc2VhcmNoIHBhdGgiIiIKCiAgICBkZWYgX19pbml0X18oCiAgICAgICAgICAgIHNlbGYsIHNlYXJjaF9wYXRoPU5vbmUsIHBsYXRmb3JtPWdldF9zdXBwb3J0ZWRfcGxhdGZvcm0oKSwKICAgICAgICAgICAgcHl0aG9uPVBZX01BSk9SKToKICAgICAgICAiIiJTbmFwc2hvdCBkaXN0cmlidXRpb25zIGF2YWlsYWJsZSBvbiBhIHNlYXJjaCBwYXRoCgogICAgICAgIEFueSBkaXN0cmlidXRpb25zIGZvdW5kIG9uIGBzZWFyY2hfcGF0aGAgYXJlIGFkZGVkIHRvIHRoZSBlbnZpcm9ubWVudC4KICAgICAgICBgc2VhcmNoX3BhdGhgIHNob3VsZCBiZSBhIHNlcXVlbmNlIG9mIGBgc3lzLnBhdGhgYCBpdGVtcy4gIElmIG5vdAogICAgICAgIHN1cHBsaWVkLCBgYHN5cy5wYXRoYGAgaXMgdXNlZC4KCiAgICAgICAgYHBsYXRmb3JtYCBpcyBhbiBvcHRpb25hbCBzdHJpbmcgc3BlY2lmeWluZyB0aGUgbmFtZSBvZiB0aGUgcGxhdGZvcm0KICAgICAgICB0aGF0IHBsYXRmb3JtLXNwZWNpZmljIGRpc3RyaWJ1dGlvbnMgbXVzdCBiZSBjb21wYXRpYmxlIHdpdGguICBJZgogICAgICAgIHVuc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBwbGF0Zm9ybS4gIGBweXRob25gIGlzIGFuCiAgICAgICAgb3B0aW9uYWwgc3RyaW5nIG5hbWluZyB0aGUgZGVzaXJlZCB2ZXJzaW9uIG9mIFB5dGhvbiAoZS5nLiBgYCczLjYnYGApOwogICAgICAgIGl0IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHZlcnNpb24uCgogICAgICAgIFlvdSBtYXkgZXhwbGljaXRseSBzZXQgYHBsYXRmb3JtYCAoYW5kL29yIGBweXRob25gKSB0byBgYE5vbmVgYCBpZiB5b3UKICAgICAgICB3aXNoIHRvIG1hcCAqYWxsKiBkaXN0cmlidXRpb25zLCBub3QganVzdCB0aG9zZSBjb21wYXRpYmxlIHdpdGggdGhlCiAgICAgICAgcnVubmluZyBwbGF0Zm9ybSBvciBQeXRob24gdmVyc2lvbi4KICAgICAgICAiIiIKICAgICAgICBzZWxmLl9kaXN0bWFwID0ge30KICAgICAgICBzZWxmLnBsYXRmb3JtID0gcGxhdGZvcm0KICAgICAgICBzZWxmLnB5dGhvbiA9IHB5dGhvbgogICAgICAgIHNlbGYuc2NhbihzZWFyY2hfcGF0aCkKCiAgICBkZWYgY2FuX2FkZChzZWxmLCBkaXN0KToKICAgICAgICAiIiJJcyBkaXN0cmlidXRpb24gYGRpc3RgIGFjY2VwdGFibGUgZm9yIHRoaXMgZW52aXJvbm1lbnQ/CgogICAgICAgIFRoZSBkaXN0cmlidXRpb24gbXVzdCBtYXRjaCB0aGUgcGxhdGZvcm0gYW5kIHB5dGhvbiB2ZXJzaW9uCiAgICAgICAgcmVxdWlyZW1lbnRzIHNwZWNpZmllZCB3aGVuIHRoaXMgZW52aXJvbm1lbnQgd2FzIGNyZWF0ZWQsIG9yIEZhbHNlCiAgICAgICAgaXMgcmV0dXJuZWQuCiAgICAgICAgIiIiCiAgICAgICAgcHlfY29tcGF0ID0gKAogICAgICAgICAgICBzZWxmLnB5dGhvbiBpcyBOb25lCiAgICAgICAgICAgIG9yIGRpc3QucHlfdmVyc2lvbiBpcyBOb25lCiAgICAgICAgICAgIG9yIGRpc3QucHlfdmVyc2lvbiA9PSBzZWxmLnB5dGhvbgogICAgICAgICkKICAgICAgICByZXR1cm4gcHlfY29tcGF0IGFuZCBjb21wYXRpYmxlX3BsYXRmb3JtcyhkaXN0LnBsYXRmb3JtLCBzZWxmLnBsYXRmb3JtKQoKICAgIGRlZiByZW1vdmUoc2VsZiwgZGlzdCk6CiAgICAgICAgIiIiUmVtb3ZlIGBkaXN0YCBmcm9tIHRoZSBlbnZpcm9ubWVudCIiIgogICAgICAgIHNlbGYuX2Rpc3RtYXBbZGlzdC5rZXldLnJlbW92ZShkaXN0KQoKICAgIGRlZiBzY2FuKHNlbGYsIHNlYXJjaF9wYXRoPU5vbmUpOgogICAgICAgICIiIlNjYW4gYHNlYXJjaF9wYXRoYCBmb3IgZGlzdHJpYnV0aW9ucyB1c2FibGUgaW4gdGhpcyBlbnZpcm9ubWVudAoKICAgICAgICBBbnkgZGlzdHJpYnV0aW9ucyBmb3VuZCBhcmUgYWRkZWQgdG8gdGhlIGVudmlyb25tZW50LgogICAgICAgIGBzZWFyY2hfcGF0aGAgc2hvdWxkIGJlIGEgc2VxdWVuY2Ugb2YgYGBzeXMucGF0aGBgIGl0ZW1zLiAgSWYgbm90CiAgICAgICAgc3VwcGxpZWQsIGBgc3lzLnBhdGhgYCBpcyB1c2VkLiAgT25seSBkaXN0cmlidXRpb25zIGNvbmZvcm1pbmcgdG8KICAgICAgICB0aGUgcGxhdGZvcm0vcHl0aG9uIHZlcnNpb24gZGVmaW5lZCBhdCBpbml0aWFsaXphdGlvbiBhcmUgYWRkZWQuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VhcmNoX3BhdGggaXMgTm9uZToKICAgICAgICAgICAgc2VhcmNoX3BhdGggPSBzeXMucGF0aAoKICAgICAgICBmb3IgaXRlbSBpbiBzZWFyY2hfcGF0aDoKICAgICAgICAgICAgZm9yIGRpc3QgaW4gZmluZF9kaXN0cmlidXRpb25zKGl0ZW0pOgogICAgICAgICAgICAgICAgc2VsZi5hZGQoZGlzdCkKCiAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgcHJvamVjdF9uYW1lKToKICAgICAgICAiIiJSZXR1cm4gYSBuZXdlc3QtdG8tb2xkZXN0IGxpc3Qgb2YgZGlzdHJpYnV0aW9ucyBmb3IgYHByb2plY3RfbmFtZWAKCiAgICAgICAgVXNlcyBjYXNlLWluc2Vuc2l0aXZlIGBwcm9qZWN0X25hbWVgIGNvbXBhcmlzb24sIGFzc3VtaW5nIGFsbCB0aGUKICAgICAgICBwcm9qZWN0J3MgZGlzdHJpYnV0aW9ucyB1c2UgdGhlaXIgcHJvamVjdCdzIG5hbWUgY29udmVydGVkIHRvIGFsbAogICAgICAgIGxvd2VyY2FzZSBhcyB0aGVpciBrZXkuCgogICAgICAgICIiIgogICAgICAgIGRpc3RyaWJ1dGlvbl9rZXkgPSBwcm9qZWN0X25hbWUubG93ZXIoKQogICAgICAgIHJldHVybiBzZWxmLl9kaXN0bWFwLmdldChkaXN0cmlidXRpb25fa2V5LCBbXSkKCiAgICBkZWYgYWRkKHNlbGYsIGRpc3QpOgogICAgICAgICIiIkFkZCBgZGlzdGAgaWYgd2UgYGBjYW5fYWRkKClgYCBpdCBhbmQgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWRkZWQKICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLmNhbl9hZGQoZGlzdCkgYW5kIGRpc3QuaGFzX3ZlcnNpb24oKToKICAgICAgICAgICAgZGlzdHMgPSBzZWxmLl9kaXN0bWFwLnNldGRlZmF1bHQoZGlzdC5rZXksIFtdKQogICAgICAgICAgICBpZiBkaXN0IG5vdCBpbiBkaXN0czoKICAgICAgICAgICAgICAgIGRpc3RzLmFwcGVuZChkaXN0KQogICAgICAgICAgICAgICAgZGlzdHMuc29ydChrZXk9b3BlcmF0b3IuYXR0cmdldHRlcignaGFzaGNtcCcpLCByZXZlcnNlPVRydWUpCgogICAgZGVmIGJlc3RfbWF0Y2goCiAgICAgICAgICAgIHNlbGYsIHJlcSwgd29ya2luZ19zZXQsIGluc3RhbGxlcj1Ob25lLCByZXBsYWNlX2NvbmZsaWN0aW5nPUZhbHNlKToKICAgICAgICAiIiJGaW5kIGRpc3RyaWJ1dGlvbiBiZXN0IG1hdGNoaW5nIGByZXFgIGFuZCB1c2FibGUgb24gYHdvcmtpbmdfc2V0YAoKICAgICAgICBUaGlzIGNhbGxzIHRoZSBgYGZpbmQocmVxKWBgIG1ldGhvZCBvZiB0aGUgYHdvcmtpbmdfc2V0YCB0byBzZWUgaWYgYQogICAgICAgIHN1aXRhYmxlIGRpc3RyaWJ1dGlvbiBpcyBhbHJlYWR5IGFjdGl2ZS4gIChUaGlzIG1heSByYWlzZQogICAgICAgIGBgVmVyc2lvbkNvbmZsaWN0YGAgaWYgYW4gdW5zdWl0YWJsZSB2ZXJzaW9uIG9mIHRoZSBwcm9qZWN0IGlzIGFscmVhZHkKICAgICAgICBhY3RpdmUgaW4gdGhlIHNwZWNpZmllZCBgd29ya2luZ19zZXRgLikgIElmIGEgc3VpdGFibGUgZGlzdHJpYnV0aW9uCiAgICAgICAgaXNuJ3QgYWN0aXZlLCB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSBuZXdlc3QgZGlzdHJpYnV0aW9uIGluIHRoZQogICAgICAgIGVudmlyb25tZW50IHRoYXQgbWVldHMgdGhlIGBgUmVxdWlyZW1lbnRgYCBpbiBgcmVxYC4gIElmIG5vIHN1aXRhYmxlCiAgICAgICAgZGlzdHJpYnV0aW9uIGlzIGZvdW5kLCBhbmQgYGluc3RhbGxlcmAgaXMgc3VwcGxpZWQsIHRoZW4gdGhlIHJlc3VsdCBvZgogICAgICAgIGNhbGxpbmcgdGhlIGVudmlyb25tZW50J3MgYGBvYnRhaW4ocmVxLCBpbnN0YWxsZXIpYGAgbWV0aG9kIHdpbGwgYmUKICAgICAgICByZXR1cm5lZC4KICAgICAgICAiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIGRpc3QgPSB3b3JraW5nX3NldC5maW5kKHJlcSkKICAgICAgICBleGNlcHQgVmVyc2lvbkNvbmZsaWN0OgogICAgICAgICAgICBpZiBub3QgcmVwbGFjZV9jb25mbGljdGluZzoKICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgICAgIGRpc3QgPSBOb25lCiAgICAgICAgaWYgZGlzdCBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIGRpc3QKICAgICAgICBmb3IgZGlzdCBpbiBzZWxmW3JlcS5rZXldOgogICAgICAgICAgICBpZiBkaXN0IGluIHJlcToKICAgICAgICAgICAgICAgIHJldHVybiBkaXN0CiAgICAgICAgIyB0cnkgdG8gZG93bmxvYWQvaW5zdGFsbAogICAgICAgIHJldHVybiBzZWxmLm9idGFpbihyZXEsIGluc3RhbGxlcikKCiAgICBkZWYgb2J0YWluKHNlbGYsIHJlcXVpcmVtZW50LCBpbnN0YWxsZXI9Tm9uZSk6CiAgICAgICAgIiIiT2J0YWluIGEgZGlzdHJpYnV0aW9uIG1hdGNoaW5nIGByZXF1aXJlbWVudGAgKGUuZy4gdmlhIGRvd25sb2FkKQoKICAgICAgICBPYnRhaW4gYSBkaXN0cm8gdGhhdCBtYXRjaGVzIHJlcXVpcmVtZW50IChlLmcuIHZpYSBkb3dubG9hZCkuICBJbiB0aGUKICAgICAgICBiYXNlIGBgRW52aXJvbm1lbnRgYCBjbGFzcywgdGhpcyByb3V0aW5lIGp1c3QgcmV0dXJucwogICAgICAgIGBgaW5zdGFsbGVyKHJlcXVpcmVtZW50KWBgLCB1bmxlc3MgYGluc3RhbGxlcmAgaXMgTm9uZSwgaW4gd2hpY2ggY2FzZQogICAgICAgIE5vbmUgaXMgcmV0dXJuZWQgaW5zdGVhZC4gIFRoaXMgbWV0aG9kIGlzIGEgaG9vayB0aGF0IGFsbG93cyBzdWJjbGFzc2VzCiAgICAgICAgdG8gYXR0ZW1wdCBvdGhlciB3YXlzIG9mIG9idGFpbmluZyBhIGRpc3RyaWJ1dGlvbiBiZWZvcmUgZmFsbGluZyBiYWNrCiAgICAgICAgdG8gdGhlIGBpbnN0YWxsZXJgIGFyZ3VtZW50LiIiIgogICAgICAgIGlmIGluc3RhbGxlciBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIGluc3RhbGxlcihyZXF1aXJlbWVudCkKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgIiIiWWllbGQgdGhlIHVuaXF1ZSBwcm9qZWN0IG5hbWVzIG9mIHRoZSBhdmFpbGFibGUgZGlzdHJpYnV0aW9ucyIiIgogICAgICAgIGZvciBrZXkgaW4gc2VsZi5fZGlzdG1hcC5rZXlzKCk6CiAgICAgICAgICAgIGlmIHNlbGZba2V5XToKICAgICAgICAgICAgICAgIHlpZWxkIGtleQoKICAgIGRlZiBfX2lhZGRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgIiIiSW4tcGxhY2UgYWRkaXRpb24gb2YgYSBkaXN0cmlidXRpb24gb3IgZW52aXJvbm1lbnQiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBEaXN0cmlidXRpb24pOgogICAgICAgICAgICBzZWxmLmFkZChvdGhlcikKICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob3RoZXIsIEVudmlyb25tZW50KToKICAgICAgICAgICAgZm9yIHByb2plY3QgaW4gb3RoZXI6CiAgICAgICAgICAgICAgICBmb3IgZGlzdCBpbiBvdGhlcltwcm9qZWN0XToKICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZChkaXN0KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiQ2FuJ3QgYWRkICVyIHRvIGVudmlyb25tZW50IiAlIChvdGhlciwpKQogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIF9fYWRkX18oc2VsZiwgb3RoZXIpOgogICAgICAgICIiIkFkZCBhbiBlbnZpcm9ubWVudCBvciBkaXN0cmlidXRpb24gdG8gYW4gZW52aXJvbm1lbnQiIiIKICAgICAgICBuZXcgPSBzZWxmLl9fY2xhc3NfXyhbXSwgcGxhdGZvcm09Tm9uZSwgcHl0aG9uPU5vbmUpCiAgICAgICAgZm9yIGVudiBpbiBzZWxmLCBvdGhlcjoKICAgICAgICAgICAgbmV3ICs9IGVudgogICAgICAgIHJldHVybiBuZXcKCgojIFhYWCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CkF2YWlsYWJsZURpc3RyaWJ1dGlvbnMgPSBFbnZpcm9ubWVudAoKCmNsYXNzIEV4dHJhY3Rpb25FcnJvcihSdW50aW1lRXJyb3IpOgogICAgIiIiQW4gZXJyb3Igb2NjdXJyZWQgZXh0cmFjdGluZyBhIHJlc291cmNlCgogICAgVGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSBhdmFpbGFibGUgZnJvbSBpbnN0YW5jZXMgb2YgdGhpcyBleGNlcHRpb246CgogICAgbWFuYWdlcgogICAgICAgIFRoZSByZXNvdXJjZSBtYW5hZ2VyIHRoYXQgcmFpc2VkIHRoaXMgZXhjZXB0aW9uCgogICAgY2FjaGVfcGF0aAogICAgICAgIFRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgcmVzb3VyY2UgZXh0cmFjdGlvbgoKICAgIG9yaWdpbmFsX2Vycm9yCiAgICAgICAgVGhlIGV4Y2VwdGlvbiBpbnN0YW5jZSB0aGF0IGNhdXNlZCBleHRyYWN0aW9uIHRvIGZhaWwKICAgICIiIgoKCmNsYXNzIFJlc291cmNlTWFuYWdlcjoKICAgICIiIk1hbmFnZSByZXNvdXJjZSBleHRyYWN0aW9uIGFuZCBwYWNrYWdlcyIiIgogICAgZXh0cmFjdGlvbl9wYXRoID0gTm9uZQoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLmNhY2hlZF9maWxlcyA9IHt9CgogICAgZGVmIHJlc291cmNlX2V4aXN0cyhzZWxmLCBwYWNrYWdlX29yX3JlcXVpcmVtZW50LCByZXNvdXJjZV9uYW1lKToKICAgICAgICAiIiJEb2VzIHRoZSBuYW1lZCByZXNvdXJjZSBleGlzdD8iIiIKICAgICAgICByZXR1cm4gZ2V0X3Byb3ZpZGVyKHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQpLmhhc19yZXNvdXJjZShyZXNvdXJjZV9uYW1lKQoKICAgIGRlZiByZXNvdXJjZV9pc2RpcihzZWxmLCBwYWNrYWdlX29yX3JlcXVpcmVtZW50LCByZXNvdXJjZV9uYW1lKToKICAgICAgICAiIiJJcyB0aGUgbmFtZWQgcmVzb3VyY2UgYW4gZXhpc3RpbmcgZGlyZWN0b3J5PyIiIgogICAgICAgIHJldHVybiBnZXRfcHJvdmlkZXIocGFja2FnZV9vcl9yZXF1aXJlbWVudCkucmVzb3VyY2VfaXNkaXIoCiAgICAgICAgICAgIHJlc291cmNlX25hbWUKICAgICAgICApCgogICAgZGVmIHJlc291cmNlX2ZpbGVuYW1lKHNlbGYsIHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQsIHJlc291cmNlX25hbWUpOgogICAgICAgICIiIlJldHVybiBhIHRydWUgZmlsZXN5c3RlbSBwYXRoIGZvciBzcGVjaWZpZWQgcmVzb3VyY2UiIiIKICAgICAgICByZXR1cm4gZ2V0X3Byb3ZpZGVyKHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQpLmdldF9yZXNvdXJjZV9maWxlbmFtZSgKICAgICAgICAgICAgc2VsZiwgcmVzb3VyY2VfbmFtZQogICAgICAgICkKCiAgICBkZWYgcmVzb3VyY2Vfc3RyZWFtKHNlbGYsIHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQsIHJlc291cmNlX25hbWUpOgogICAgICAgICIiIlJldHVybiBhIHJlYWRhYmxlIGZpbGUtbGlrZSBvYmplY3QgZm9yIHNwZWNpZmllZCByZXNvdXJjZSIiIgogICAgICAgIHJldHVybiBnZXRfcHJvdmlkZXIocGFja2FnZV9vcl9yZXF1aXJlbWVudCkuZ2V0X3Jlc291cmNlX3N0cmVhbSgKICAgICAgICAgICAgc2VsZiwgcmVzb3VyY2VfbmFtZQogICAgICAgICkKCiAgICBkZWYgcmVzb3VyY2Vfc3RyaW5nKHNlbGYsIHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQsIHJlc291cmNlX25hbWUpOgogICAgICAgICIiIlJldHVybiBzcGVjaWZpZWQgcmVzb3VyY2UgYXMgYSBzdHJpbmciIiIKICAgICAgICByZXR1cm4gZ2V0X3Byb3ZpZGVyKHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQpLmdldF9yZXNvdXJjZV9zdHJpbmcoCiAgICAgICAgICAgIHNlbGYsIHJlc291cmNlX25hbWUKICAgICAgICApCgogICAgZGVmIHJlc291cmNlX2xpc3RkaXIoc2VsZiwgcGFja2FnZV9vcl9yZXF1aXJlbWVudCwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgIiIiTGlzdCB0aGUgY29udGVudHMgb2YgdGhlIG5hbWVkIHJlc291cmNlIGRpcmVjdG9yeSIiIgogICAgICAgIHJldHVybiBnZXRfcHJvdmlkZXIocGFja2FnZV9vcl9yZXF1aXJlbWVudCkucmVzb3VyY2VfbGlzdGRpcigKICAgICAgICAgICAgcmVzb3VyY2VfbmFtZQogICAgICAgICkKCiAgICBkZWYgZXh0cmFjdGlvbl9lcnJvcihzZWxmKToKICAgICAgICAiIiJHaXZlIGFuIGVycm9yIG1lc3NhZ2UgZm9yIHByb2JsZW1zIGV4dHJhY3RpbmcgZmlsZShzKSIiIgoKICAgICAgICBvbGRfZXhjID0gc3lzLmV4Y19pbmZvKClbMV0KICAgICAgICBjYWNoZV9wYXRoID0gc2VsZi5leHRyYWN0aW9uX3BhdGggb3IgZ2V0X2RlZmF1bHRfY2FjaGUoKQoKICAgICAgICB0bXBsID0gdGV4dHdyYXAuZGVkZW50KCIiIgogICAgICAgICAgICBDYW4ndCBleHRyYWN0IGZpbGUocykgdG8gZWdnIGNhY2hlCgogICAgICAgICAgICBUaGUgZm9sbG93aW5nIGVycm9yIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byBleHRyYWN0IGZpbGUocykKICAgICAgICAgICAgdG8gdGhlIFB5dGhvbiBlZ2cgY2FjaGU6CgogICAgICAgICAgICAgIHtvbGRfZXhjfQoKICAgICAgICAgICAgVGhlIFB5dGhvbiBlZ2cgY2FjaGUgZGlyZWN0b3J5IGlzIGN1cnJlbnRseSBzZXQgdG86CgogICAgICAgICAgICAgIHtjYWNoZV9wYXRofQoKICAgICAgICAgICAgUGVyaGFwcyB5b3VyIGFjY291bnQgZG9lcyBub3QgaGF2ZSB3cml0ZSBhY2Nlc3MgdG8gdGhpcyBkaXJlY3Rvcnk/CiAgICAgICAgICAgIFlvdSBjYW4gY2hhbmdlIHRoZSBjYWNoZSBkaXJlY3RvcnkgYnkgc2V0dGluZyB0aGUgUFlUSE9OX0VHR19DQUNIRQogICAgICAgICAgICBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBwb2ludCB0byBhbiBhY2Nlc3NpYmxlIGRpcmVjdG9yeS4KICAgICAgICAgICAgIiIiKS5sc3RyaXAoKQogICAgICAgIGVyciA9IEV4dHJhY3Rpb25FcnJvcih0bXBsLmZvcm1hdCgqKmxvY2FscygpKSkKICAgICAgICBlcnIubWFuYWdlciA9IHNlbGYKICAgICAgICBlcnIuY2FjaGVfcGF0aCA9IGNhY2hlX3BhdGgKICAgICAgICBlcnIub3JpZ2luYWxfZXJyb3IgPSBvbGRfZXhjCiAgICAgICAgcmFpc2UgZXJyCgogICAgZGVmIGdldF9jYWNoZV9wYXRoKHNlbGYsIGFyY2hpdmVfbmFtZSwgbmFtZXM9KCkpOgogICAgICAgICIiIlJldHVybiBhYnNvbHV0ZSBsb2NhdGlvbiBpbiBjYWNoZSBmb3IgYGFyY2hpdmVfbmFtZWAgYW5kIGBuYW1lc2AKCiAgICAgICAgVGhlIHBhcmVudCBkaXJlY3Rvcnkgb2YgdGhlIHJlc3VsdGluZyBwYXRoIHdpbGwgYmUgY3JlYXRlZCBpZiBpdCBkb2VzCiAgICAgICAgbm90IGFscmVhZHkgZXhpc3QuICBgYXJjaGl2ZV9uYW1lYCBzaG91bGQgYmUgdGhlIGJhc2UgZmlsZW5hbWUgb2YgdGhlCiAgICAgICAgZW5jbG9zaW5nIGVnZyAod2hpY2ggbWF5IG5vdCBiZSB0aGUgbmFtZSBvZiB0aGUgZW5jbG9zaW5nIHppcGZpbGUhKSwKICAgICAgICBpbmNsdWRpbmcgaXRzICIuZWdnIiBleHRlbnNpb24uICBgbmFtZXNgLCBpZiBwcm92aWRlZCwgc2hvdWxkIGJlIGEKICAgICAgICBzZXF1ZW5jZSBvZiBwYXRoIG5hbWUgcGFydHMgInVuZGVyIiB0aGUgZWdnJ3MgZXh0cmFjdGlvbiBsb2NhdGlvbi4KCiAgICAgICAgVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGJ5IHJlc291cmNlIHByb3ZpZGVycyB0aGF0IG5lZWQgdG8KICAgICAgICBvYnRhaW4gYW4gZXh0cmFjdGlvbiBsb2NhdGlvbiwgYW5kIG9ubHkgZm9yIG5hbWVzIHRoZXkgaW50ZW5kIHRvCiAgICAgICAgZXh0cmFjdCwgYXMgaXQgdHJhY2tzIHRoZSBnZW5lcmF0ZWQgbmFtZXMgZm9yIHBvc3NpYmxlIGNsZWFudXAgbGF0ZXIuCiAgICAgICAgIiIiCiAgICAgICAgZXh0cmFjdF9wYXRoID0gc2VsZi5leHRyYWN0aW9uX3BhdGggb3IgZ2V0X2RlZmF1bHRfY2FjaGUoKQogICAgICAgIHRhcmdldF9wYXRoID0gb3MucGF0aC5qb2luKGV4dHJhY3RfcGF0aCwgYXJjaGl2ZV9uYW1lICsgJy10bXAnLCAqbmFtZXMpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBfYnlwYXNzX2Vuc3VyZV9kaXJlY3RvcnkodGFyZ2V0X3BhdGgpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgc2VsZi5leHRyYWN0aW9uX2Vycm9yKCkKCiAgICAgICAgc2VsZi5fd2Fybl91bnNhZmVfZXh0cmFjdGlvbl9wYXRoKGV4dHJhY3RfcGF0aCkKCiAgICAgICAgc2VsZi5jYWNoZWRfZmlsZXNbdGFyZ2V0X3BhdGhdID0gMQogICAgICAgIHJldHVybiB0YXJnZXRfcGF0aAoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfd2Fybl91bnNhZmVfZXh0cmFjdGlvbl9wYXRoKHBhdGgpOgogICAgICAgICIiIgogICAgICAgIElmIHRoZSBkZWZhdWx0IGV4dHJhY3Rpb24gcGF0aCBpcyBvdmVycmlkZGVuIGFuZCBzZXQgdG8gYW4gaW5zZWN1cmUKICAgICAgICBsb2NhdGlvbiwgc3VjaCBhcyAvdG1wLCBpdCBvcGVucyB1cCBhbiBvcHBvcnR1bml0eSBmb3IgYW4gYXR0YWNrZXIgdG8KICAgICAgICByZXBsYWNlIGFuIGV4dHJhY3RlZCBmaWxlIHdpdGggYW4gdW5hdXRob3JpemVkIHBheWxvYWQuIFdhcm4gdGhlIHVzZXIKICAgICAgICBpZiBhIGtub3duIGluc2VjdXJlIGxvY2F0aW9uIGlzIHVzZWQuCgogICAgICAgIFNlZSBEaXN0cmlidXRlICMzNzUgZm9yIG1vcmUgZGV0YWlscy4KICAgICAgICAiIiIKICAgICAgICBpZiBvcy5uYW1lID09ICdudCcgYW5kIG5vdCBwYXRoLnN0YXJ0c3dpdGgob3MuZW52aXJvblsnd2luZGlyJ10pOgogICAgICAgICAgICAjIE9uIFdpbmRvd3MsIHBlcm1pc3Npb25zIGFyZSBnZW5lcmFsbHkgcmVzdHJpY3RpdmUgYnkgZGVmYXVsdAogICAgICAgICAgICAjICBhbmQgdGVtcCBkaXJlY3RvcmllcyBhcmUgbm90IHdyaXRhYmxlIGJ5IG90aGVyIHVzZXJzLCBzbwogICAgICAgICAgICAjICBieXBhc3MgdGhlIHdhcm5pbmcuCiAgICAgICAgICAgIHJldHVybgogICAgICAgIG1vZGUgPSBvcy5zdGF0KHBhdGgpLnN0X21vZGUKICAgICAgICBpZiBtb2RlICYgc3RhdC5TX0lXT1RIIG9yIG1vZGUgJiBzdGF0LlNfSVdHUlA6CiAgICAgICAgICAgIG1zZyA9ICgKICAgICAgICAgICAgICAgICIlcyBpcyB3cml0YWJsZSBieSBncm91cC9vdGhlcnMgYW5kIHZ1bG5lcmFibGUgdG8gYXR0YWNrICIKICAgICAgICAgICAgICAgICJ3aGVuICIKICAgICAgICAgICAgICAgICJ1c2VkIHdpdGggZ2V0X3Jlc291cmNlX2ZpbGVuYW1lLiBDb25zaWRlciBhIG1vcmUgc2VjdXJlICIKICAgICAgICAgICAgICAgICJsb2NhdGlvbiAoc2V0IHdpdGggLnNldF9leHRyYWN0aW9uX3BhdGggb3IgdGhlICIKICAgICAgICAgICAgICAgICJQWVRIT05fRUdHX0NBQ0hFIGVudmlyb25tZW50IHZhcmlhYmxlKS4iICUgcGF0aAogICAgICAgICAgICApCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4obXNnLCBVc2VyV2FybmluZykKCiAgICBkZWYgcG9zdHByb2Nlc3Moc2VsZiwgdGVtcG5hbWUsIGZpbGVuYW1lKToKICAgICAgICAiIiJQZXJmb3JtIGFueSBwbGF0Zm9ybS1zcGVjaWZpYyBwb3N0cHJvY2Vzc2luZyBvZiBgdGVtcG5hbWVgCgogICAgICAgIFRoaXMgaXMgd2hlcmUgTWFjIGhlYWRlciByZXdyaXRlcyBzaG91bGQgYmUgZG9uZTsgb3RoZXIgcGxhdGZvcm1zIGRvbid0CiAgICAgICAgaGF2ZSBhbnl0aGluZyBzcGVjaWFsIHRoZXkgc2hvdWxkIGRvLgoKICAgICAgICBSZXNvdXJjZSBwcm92aWRlcnMgc2hvdWxkIGNhbGwgdGhpcyBtZXRob2QgT05MWSBhZnRlciBzdWNjZXNzZnVsbHkKICAgICAgICBleHRyYWN0aW5nIGEgY29tcHJlc3NlZCByZXNvdXJjZS4gIFRoZXkgbXVzdCBOT1QgY2FsbCBpdCBvbiByZXNvdXJjZXMKICAgICAgICB0aGF0IGFyZSBhbHJlYWR5IGluIHRoZSBmaWxlc3lzdGVtLgoKICAgICAgICBgdGVtcG5hbWVgIGlzIHRoZSBjdXJyZW50ICh0ZW1wb3JhcnkpIG5hbWUgb2YgdGhlIGZpbGUsIGFuZCBgZmlsZW5hbWVgCiAgICAgICAgaXMgdGhlIG5hbWUgaXQgd2lsbCBiZSByZW5hbWVkIHRvIGJ5IHRoZSBjYWxsZXIgYWZ0ZXIgdGhpcyByb3V0aW5lCiAgICAgICAgcmV0dXJucy4KICAgICAgICAiIiIKCiAgICAgICAgaWYgb3MubmFtZSA9PSAncG9zaXgnOgogICAgICAgICAgICAjIE1ha2UgdGhlIHJlc291cmNlIGV4ZWN1dGFibGUKICAgICAgICAgICAgbW9kZSA9ICgob3Muc3RhdCh0ZW1wbmFtZSkuc3RfbW9kZSkgfCAwbzU1NSkgJiAwbzc3NzcKICAgICAgICAgICAgb3MuY2htb2QodGVtcG5hbWUsIG1vZGUpCgogICAgZGVmIHNldF9leHRyYWN0aW9uX3BhdGgoc2VsZiwgcGF0aCk6CiAgICAgICAgIiIiU2V0IHRoZSBiYXNlIHBhdGggd2hlcmUgcmVzb3VyY2VzIHdpbGwgYmUgZXh0cmFjdGVkIHRvLCBpZiBuZWVkZWQuCgogICAgICAgIElmIHlvdSBkbyBub3QgY2FsbCB0aGlzIHJvdXRpbmUgYmVmb3JlIGFueSBleHRyYWN0aW9ucyB0YWtlIHBsYWNlLCB0aGUKICAgICAgICBwYXRoIGRlZmF1bHRzIHRvIHRoZSByZXR1cm4gdmFsdWUgb2YgYGBnZXRfZGVmYXVsdF9jYWNoZSgpYGAuICAoV2hpY2gKICAgICAgICBpcyBiYXNlZCBvbiB0aGUgYGBQWVRIT05fRUdHX0NBQ0hFYGAgZW52aXJvbm1lbnQgdmFyaWFibGUsIHdpdGggdmFyaW91cwogICAgICAgIHBsYXRmb3JtLXNwZWNpZmljIGZhbGxiYWNrcy4gIFNlZSB0aGF0IHJvdXRpbmUncyBkb2N1bWVudGF0aW9uIGZvciBtb3JlCiAgICAgICAgZGV0YWlscy4pCgogICAgICAgIFJlc291cmNlcyBhcmUgZXh0cmFjdGVkIHRvIHN1YmRpcmVjdG9yaWVzIG9mIHRoaXMgcGF0aCBiYXNlZCB1cG9uCiAgICAgICAgaW5mb3JtYXRpb24gZ2l2ZW4gYnkgdGhlIGBgSVJlc291cmNlUHJvdmlkZXJgYC4gIFlvdSBtYXkgc2V0IHRoaXMgdG8gYQogICAgICAgIHRlbXBvcmFyeSBkaXJlY3RvcnksIGJ1dCB0aGVuIHlvdSBtdXN0IGNhbGwgYGBjbGVhbnVwX3Jlc291cmNlcygpYGAgdG8KICAgICAgICBkZWxldGUgdGhlIGV4dHJhY3RlZCBmaWxlcyB3aGVuIGRvbmUuICBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdAogICAgICAgIGBgY2xlYW51cF9yZXNvdXJjZXMoKWBgIHdpbGwgYmUgYWJsZSB0byByZW1vdmUgYWxsIGV4dHJhY3RlZCBmaWxlcy4KCiAgICAgICAgKE5vdGU6IHlvdSBtYXkgbm90IGNoYW5nZSB0aGUgZXh0cmFjdGlvbiBwYXRoIGZvciBhIGdpdmVuIHJlc291cmNlCiAgICAgICAgbWFuYWdlciBvbmNlIHJlc291cmNlcyBoYXZlIGJlZW4gZXh0cmFjdGVkLCB1bmxlc3MgeW91IGZpcnN0IGNhbGwKICAgICAgICBgYGNsZWFudXBfcmVzb3VyY2VzKClgYC4pCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5jYWNoZWRfZmlsZXM6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCiAgICAgICAgICAgICAgICAiQ2FuJ3QgY2hhbmdlIGV4dHJhY3Rpb24gcGF0aCwgZmlsZXMgYWxyZWFkeSBleHRyYWN0ZWQiCiAgICAgICAgICAgICkKCiAgICAgICAgc2VsZi5leHRyYWN0aW9uX3BhdGggPSBwYXRoCgogICAgZGVmIGNsZWFudXBfcmVzb3VyY2VzKHNlbGYsIGZvcmNlPUZhbHNlKToKICAgICAgICAiIiIKICAgICAgICBEZWxldGUgYWxsIGV4dHJhY3RlZCByZXNvdXJjZSBmaWxlcyBhbmQgZGlyZWN0b3JpZXMsIHJldHVybmluZyBhIGxpc3QKICAgICAgICBvZiB0aGUgZmlsZSBhbmQgZGlyZWN0b3J5IG5hbWVzIHRoYXQgY291bGQgbm90IGJlIHN1Y2Nlc3NmdWxseSByZW1vdmVkLgogICAgICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgaGF2ZSBhbnkgY29uY3VycmVuY3kgcHJvdGVjdGlvbiwgc28gaXQgc2hvdWxkCiAgICAgICAgZ2VuZXJhbGx5IG9ubHkgYmUgY2FsbGVkIHdoZW4gdGhlIGV4dHJhY3Rpb24gcGF0aCBpcyBhIHRlbXBvcmFyeQogICAgICAgIGRpcmVjdG9yeSBleGNsdXNpdmUgdG8gYSBzaW5nbGUgcHJvY2Vzcy4gIFRoaXMgbWV0aG9kIGlzIG5vdAogICAgICAgIGF1dG9tYXRpY2FsbHkgY2FsbGVkOyB5b3UgbXVzdCBjYWxsIGl0IGV4cGxpY2l0bHkgb3IgcmVnaXN0ZXIgaXQgYXMgYW4KICAgICAgICBgYGF0ZXhpdGBgIGZ1bmN0aW9uIGlmIHlvdSB3aXNoIHRvIGVuc3VyZSBjbGVhbnVwIG9mIGEgdGVtcG9yYXJ5CiAgICAgICAgZGlyZWN0b3J5IHVzZWQgZm9yIGV4dHJhY3Rpb25zLgogICAgICAgICIiIgogICAgICAgICMgWFhYCgoKZGVmIGdldF9kZWZhdWx0X2NhY2hlKCk6CiAgICAiIiIKICAgIFJldHVybiB0aGUgYGBQWVRIT05fRUdHX0NBQ0hFYGAgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIG9yIGEgcGxhdGZvcm0tcmVsZXZhbnQgdXNlciBjYWNoZSBkaXIgZm9yIGFuIGFwcAogICAgbmFtZWQgIlB5dGhvbi1FZ2dzIi4KICAgICIiIgogICAgcmV0dXJuICgKICAgICAgICBvcy5lbnZpcm9uLmdldCgnUFlUSE9OX0VHR19DQUNIRScpCiAgICAgICAgb3IgYXBwZGlycy51c2VyX2NhY2hlX2RpcihhcHBuYW1lPSdQeXRob24tRWdncycpCiAgICApCgoKZGVmIHNhZmVfbmFtZShuYW1lKToKICAgICIiIkNvbnZlcnQgYW4gYXJiaXRyYXJ5IHN0cmluZyB0byBhIHN0YW5kYXJkIGRpc3RyaWJ1dGlvbiBuYW1lCgogICAgQW55IHJ1bnMgb2Ygbm9uLWFscGhhbnVtZXJpYy8uIGNoYXJhY3RlcnMgYXJlIHJlcGxhY2VkIHdpdGggYSBzaW5nbGUgJy0nLgogICAgIiIiCiAgICByZXR1cm4gcmUuc3ViKCdbXkEtWmEtejAtOS5dKycsICctJywgbmFtZSkKCgpkZWYgc2FmZV92ZXJzaW9uKHZlcnNpb24pOgogICAgIiIiCiAgICBDb252ZXJ0IGFuIGFyYml0cmFyeSBzdHJpbmcgdG8gYSBzdGFuZGFyZCB2ZXJzaW9uIHN0cmluZwogICAgIiIiCiAgICB0cnk6CiAgICAgICAgIyBub3JtYWxpemUgdGhlIHZlcnNpb24KICAgICAgICByZXR1cm4gc3RyKHBhY2thZ2luZy52ZXJzaW9uLlZlcnNpb24odmVyc2lvbikpCiAgICBleGNlcHQgcGFja2FnaW5nLnZlcnNpb24uSW52YWxpZFZlcnNpb246CiAgICAgICAgdmVyc2lvbiA9IHZlcnNpb24ucmVwbGFjZSgnICcsICcuJykKICAgICAgICByZXR1cm4gcmUuc3ViKCdbXkEtWmEtejAtOS5dKycsICctJywgdmVyc2lvbikKCgpkZWYgc2FmZV9leHRyYShleHRyYSk6CiAgICAiIiJDb252ZXJ0IGFuIGFyYml0cmFyeSBzdHJpbmcgdG8gYSBzdGFuZGFyZCAnZXh0cmEnIG5hbWUKCiAgICBBbnkgcnVucyBvZiBub24tYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgYXJlIHJlcGxhY2VkIHdpdGggYSBzaW5nbGUgJ18nLAogICAgYW5kIHRoZSByZXN1bHQgaXMgYWx3YXlzIGxvd2VyY2FzZWQuCiAgICAiIiIKICAgIHJldHVybiByZS5zdWIoJ1teQS1aYS16MC05Li1dKycsICdfJywgZXh0cmEpLmxvd2VyKCkKCgpkZWYgdG9fZmlsZW5hbWUobmFtZSk6CiAgICAiIiJDb252ZXJ0IGEgcHJvamVjdCBvciB2ZXJzaW9uIG5hbWUgdG8gaXRzIGZpbGVuYW1lLWVzY2FwZWQgZm9ybQoKICAgIEFueSAnLScgY2hhcmFjdGVycyBhcmUgY3VycmVudGx5IHJlcGxhY2VkIHdpdGggJ18nLgogICAgIiIiCiAgICByZXR1cm4gbmFtZS5yZXBsYWNlKCctJywgJ18nKQoKCmRlZiBpbnZhbGlkX21hcmtlcih0ZXh0KToKICAgICIiIgogICAgVmFsaWRhdGUgdGV4dCBhcyBhIFBFUCA1MDggZW52aXJvbm1lbnQgbWFya2VyOyByZXR1cm4gYW4gZXhjZXB0aW9uCiAgICBpZiBpbnZhbGlkIG9yIEZhbHNlIG90aGVyd2lzZS4KICAgICIiIgogICAgdHJ5OgogICAgICAgIGV2YWx1YXRlX21hcmtlcih0ZXh0KQogICAgZXhjZXB0IFN5bnRheEVycm9yIGFzIGU6CiAgICAgICAgZS5maWxlbmFtZSA9IE5vbmUKICAgICAgICBlLmxpbmVubyA9IE5vbmUKICAgICAgICByZXR1cm4gZQogICAgcmV0dXJuIEZhbHNlCgoKZGVmIGV2YWx1YXRlX21hcmtlcih0ZXh0LCBleHRyYT1Ob25lKToKICAgICIiIgogICAgRXZhbHVhdGUgYSBQRVAgNTA4IGVudmlyb25tZW50IG1hcmtlci4KICAgIFJldHVybiBhIGJvb2xlYW4gaW5kaWNhdGluZyB0aGUgbWFya2VyIHJlc3VsdCBpbiB0aGlzIGVudmlyb25tZW50LgogICAgUmFpc2UgU3ludGF4RXJyb3IgaWYgbWFya2VyIGlzIGludmFsaWQuCgogICAgVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzIHRoZSAncHlwYXJzaW5nJyBtb2R1bGUuCiAgICAiIiIKICAgIHRyeToKICAgICAgICBtYXJrZXIgPSBwYWNrYWdpbmcubWFya2Vycy5NYXJrZXIodGV4dCkKICAgICAgICByZXR1cm4gbWFya2VyLmV2YWx1YXRlKCkKICAgIGV4Y2VwdCBwYWNrYWdpbmcubWFya2Vycy5JbnZhbGlkTWFya2VyIGFzIGU6CiAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IoZSkKCgpjbGFzcyBOdWxsUHJvdmlkZXI6CiAgICAiIiJUcnkgdG8gaW1wbGVtZW50IHJlc291cmNlcyBhbmQgbWV0YWRhdGEgZm9yIGFyYml0cmFyeSBQRVAgMzAyIGxvYWRlcnMiIiIKCiAgICBlZ2dfbmFtZSA9IE5vbmUKICAgIGVnZ19pbmZvID0gTm9uZQogICAgbG9hZGVyID0gTm9uZQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtb2R1bGUpOgogICAgICAgIHNlbGYubG9hZGVyID0gZ2V0YXR0cihtb2R1bGUsICdfX2xvYWRlcl9fJywgTm9uZSkKICAgICAgICBzZWxmLm1vZHVsZV9wYXRoID0gb3MucGF0aC5kaXJuYW1lKGdldGF0dHIobW9kdWxlLCAnX19maWxlX18nLCAnJykpCgogICAgZGVmIGdldF9yZXNvdXJjZV9maWxlbmFtZShzZWxmLCBtYW5hZ2VyLCByZXNvdXJjZV9uYW1lKToKICAgICAgICByZXR1cm4gc2VsZi5fZm4oc2VsZi5tb2R1bGVfcGF0aCwgcmVzb3VyY2VfbmFtZSkKCiAgICBkZWYgZ2V0X3Jlc291cmNlX3N0cmVhbShzZWxmLCBtYW5hZ2VyLCByZXNvdXJjZV9uYW1lKToKICAgICAgICByZXR1cm4gaW8uQnl0ZXNJTyhzZWxmLmdldF9yZXNvdXJjZV9zdHJpbmcobWFuYWdlciwgcmVzb3VyY2VfbmFtZSkpCgogICAgZGVmIGdldF9yZXNvdXJjZV9zdHJpbmcoc2VsZiwgbWFuYWdlciwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgcmV0dXJuIHNlbGYuX2dldChzZWxmLl9mbihzZWxmLm1vZHVsZV9wYXRoLCByZXNvdXJjZV9uYW1lKSkKCiAgICBkZWYgaGFzX3Jlc291cmNlKHNlbGYsIHJlc291cmNlX25hbWUpOgogICAgICAgIHJldHVybiBzZWxmLl9oYXMoc2VsZi5fZm4oc2VsZi5tb2R1bGVfcGF0aCwgcmVzb3VyY2VfbmFtZSkpCgogICAgZGVmIF9nZXRfbWV0YWRhdGFfcGF0aChzZWxmLCBuYW1lKToKICAgICAgICByZXR1cm4gc2VsZi5fZm4oc2VsZi5lZ2dfaW5mbywgbmFtZSkKCiAgICBkZWYgaGFzX21ldGFkYXRhKHNlbGYsIG5hbWUpOgogICAgICAgIGlmIG5vdCBzZWxmLmVnZ19pbmZvOgogICAgICAgICAgICByZXR1cm4gc2VsZi5lZ2dfaW5mbwoKICAgICAgICBwYXRoID0gc2VsZi5fZ2V0X21ldGFkYXRhX3BhdGgobmFtZSkKICAgICAgICByZXR1cm4gc2VsZi5faGFzKHBhdGgpCgogICAgZGVmIGdldF9tZXRhZGF0YShzZWxmLCBuYW1lKToKICAgICAgICBpZiBub3Qgc2VsZi5lZ2dfaW5mbzoKICAgICAgICAgICAgcmV0dXJuICIiCiAgICAgICAgcGF0aCA9IHNlbGYuX2dldF9tZXRhZGF0YV9wYXRoKG5hbWUpCiAgICAgICAgdmFsdWUgPSBzZWxmLl9nZXQocGF0aCkKICAgICAgICBpZiBzaXguUFkyOgogICAgICAgICAgICByZXR1cm4gdmFsdWUKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5kZWNvZGUoJ3V0Zi04JykKICAgICAgICBleGNlcHQgVW5pY29kZURlY29kZUVycm9yIGFzIGV4YzoKICAgICAgICAgICAgIyBJbmNsdWRlIHRoZSBwYXRoIGluIHRoZSBlcnJvciBtZXNzYWdlIHRvIHNpbXBsaWZ5CiAgICAgICAgICAgICMgdHJvdWJsZXNob290aW5nLCBhbmQgd2l0aG91dCBjaGFuZ2luZyB0aGUgZXhjZXB0aW9uIHR5cGUuCiAgICAgICAgICAgIGV4Yy5yZWFzb24gKz0gJyBpbiB7fSBmaWxlIGF0IHBhdGg6IHt9Jy5mb3JtYXQobmFtZSwgcGF0aCkKICAgICAgICAgICAgcmFpc2UKCiAgICBkZWYgZ2V0X21ldGFkYXRhX2xpbmVzKHNlbGYsIG5hbWUpOgogICAgICAgIHJldHVybiB5aWVsZF9saW5lcyhzZWxmLmdldF9tZXRhZGF0YShuYW1lKSkKCiAgICBkZWYgcmVzb3VyY2VfaXNkaXIoc2VsZiwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgcmV0dXJuIHNlbGYuX2lzZGlyKHNlbGYuX2ZuKHNlbGYubW9kdWxlX3BhdGgsIHJlc291cmNlX25hbWUpKQoKICAgIGRlZiBtZXRhZGF0YV9pc2RpcihzZWxmLCBuYW1lKToKICAgICAgICByZXR1cm4gc2VsZi5lZ2dfaW5mbyBhbmQgc2VsZi5faXNkaXIoc2VsZi5fZm4oc2VsZi5lZ2dfaW5mbywgbmFtZSkpCgogICAgZGVmIHJlc291cmNlX2xpc3RkaXIoc2VsZiwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgcmV0dXJuIHNlbGYuX2xpc3RkaXIoc2VsZi5fZm4oc2VsZi5tb2R1bGVfcGF0aCwgcmVzb3VyY2VfbmFtZSkpCgogICAgZGVmIG1ldGFkYXRhX2xpc3RkaXIoc2VsZiwgbmFtZSk6CiAgICAgICAgaWYgc2VsZi5lZ2dfaW5mbzoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2xpc3RkaXIoc2VsZi5fZm4oc2VsZi5lZ2dfaW5mbywgbmFtZSkpCiAgICAgICAgcmV0dXJuIFtdCgogICAgZGVmIHJ1bl9zY3JpcHQoc2VsZiwgc2NyaXB0X25hbWUsIG5hbWVzcGFjZSk6CiAgICAgICAgc2NyaXB0ID0gJ3NjcmlwdHMvJyArIHNjcmlwdF9uYW1lCiAgICAgICAgaWYgbm90IHNlbGYuaGFzX21ldGFkYXRhKHNjcmlwdCk6CiAgICAgICAgICAgIHJhaXNlIFJlc29sdXRpb25FcnJvcigKICAgICAgICAgICAgICAgICJTY3JpcHQge3NjcmlwdCFyfSBub3QgZm91bmQgaW4gbWV0YWRhdGEgYXQge3NlbGYuZWdnX2luZm8hcn0iCiAgICAgICAgICAgICAgICAuZm9ybWF0KCoqbG9jYWxzKCkpLAogICAgICAgICAgICApCiAgICAgICAgc2NyaXB0X3RleHQgPSBzZWxmLmdldF9tZXRhZGF0YShzY3JpcHQpLnJlcGxhY2UoJ1xyXG4nLCAnXG4nKQogICAgICAgIHNjcmlwdF90ZXh0ID0gc2NyaXB0X3RleHQucmVwbGFjZSgnXHInLCAnXG4nKQogICAgICAgIHNjcmlwdF9maWxlbmFtZSA9IHNlbGYuX2ZuKHNlbGYuZWdnX2luZm8sIHNjcmlwdCkKICAgICAgICBuYW1lc3BhY2VbJ19fZmlsZV9fJ10gPSBzY3JpcHRfZmlsZW5hbWUKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzY3JpcHRfZmlsZW5hbWUpOgogICAgICAgICAgICBzb3VyY2UgPSBvcGVuKHNjcmlwdF9maWxlbmFtZSkucmVhZCgpCiAgICAgICAgICAgIGNvZGUgPSBjb21waWxlKHNvdXJjZSwgc2NyaXB0X2ZpbGVuYW1lLCAnZXhlYycpCiAgICAgICAgICAgIGV4ZWMoY29kZSwgbmFtZXNwYWNlLCBuYW1lc3BhY2UpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZnJvbSBsaW5lY2FjaGUgaW1wb3J0IGNhY2hlCiAgICAgICAgICAgIGNhY2hlW3NjcmlwdF9maWxlbmFtZV0gPSAoCiAgICAgICAgICAgICAgICBsZW4oc2NyaXB0X3RleHQpLCAwLCBzY3JpcHRfdGV4dC5zcGxpdCgnXG4nKSwgc2NyaXB0X2ZpbGVuYW1lCiAgICAgICAgICAgICkKICAgICAgICAgICAgc2NyaXB0X2NvZGUgPSBjb21waWxlKHNjcmlwdF90ZXh0LCBzY3JpcHRfZmlsZW5hbWUsICdleGVjJykKICAgICAgICAgICAgZXhlYyhzY3JpcHRfY29kZSwgbmFtZXNwYWNlLCBuYW1lc3BhY2UpCgogICAgZGVmIF9oYXMoc2VsZiwgcGF0aCk6CiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigKICAgICAgICAgICAgIkNhbid0IHBlcmZvcm0gdGhpcyBvcGVyYXRpb24gZm9yIHVucmVnaXN0ZXJlZCBsb2FkZXIgdHlwZSIKICAgICAgICApCgogICAgZGVmIF9pc2RpcihzZWxmLCBwYXRoKToKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKAogICAgICAgICAgICAiQ2FuJ3QgcGVyZm9ybSB0aGlzIG9wZXJhdGlvbiBmb3IgdW5yZWdpc3RlcmVkIGxvYWRlciB0eXBlIgogICAgICAgICkKCiAgICBkZWYgX2xpc3RkaXIoc2VsZiwgcGF0aCk6CiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigKICAgICAgICAgICAgIkNhbid0IHBlcmZvcm0gdGhpcyBvcGVyYXRpb24gZm9yIHVucmVnaXN0ZXJlZCBsb2FkZXIgdHlwZSIKICAgICAgICApCgogICAgZGVmIF9mbihzZWxmLCBiYXNlLCByZXNvdXJjZV9uYW1lKToKICAgICAgICBzZWxmLl92YWxpZGF0ZV9yZXNvdXJjZV9wYXRoKHJlc291cmNlX25hbWUpCiAgICAgICAgaWYgcmVzb3VyY2VfbmFtZToKICAgICAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihiYXNlLCAqcmVzb3VyY2VfbmFtZS5zcGxpdCgnLycpKQogICAgICAgIHJldHVybiBiYXNlCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF92YWxpZGF0ZV9yZXNvdXJjZV9wYXRoKHBhdGgpOgogICAgICAgICIiIgogICAgICAgIFZhbGlkYXRlIHRoZSByZXNvdXJjZSBwYXRocyBhY2NvcmRpbmcgdG8gdGhlIGRvY3MuCiAgICAgICAgaHR0cHM6Ly9zZXR1cHRvb2xzLnJlYWR0aGVkb2NzLmlvL2VuL2xhdGVzdC9wa2dfcmVzb3VyY2VzLmh0bWwjYmFzaWMtcmVzb3VyY2UtYWNjZXNzCgogICAgICAgID4+PiB3YXJuZWQgPSBnZXRmaXh0dXJlKCdyZWN3YXJuJykKICAgICAgICA+Pj4gd2FybmluZ3Muc2ltcGxlZmlsdGVyKCdhbHdheXMnKQogICAgICAgID4+PiB2cnAgPSBOdWxsUHJvdmlkZXIuX3ZhbGlkYXRlX3Jlc291cmNlX3BhdGgKICAgICAgICA+Pj4gdnJwKCdmb28vYmFyLnR4dCcpCiAgICAgICAgPj4+IGJvb2wod2FybmVkKQogICAgICAgIEZhbHNlCiAgICAgICAgPj4+IHZycCgnLi4vZm9vL2Jhci50eHQnKQogICAgICAgID4+PiBib29sKHdhcm5lZCkKICAgICAgICBUcnVlCiAgICAgICAgPj4+IHdhcm5lZC5jbGVhcigpCiAgICAgICAgPj4+IHZycCgnL2Zvby9iYXIudHh0JykKICAgICAgICA+Pj4gYm9vbCh3YXJuZWQpCiAgICAgICAgVHJ1ZQogICAgICAgID4+PiB2cnAoJ2Zvby8uLi8uLi9iYXIudHh0JykKICAgICAgICA+Pj4gYm9vbCh3YXJuZWQpCiAgICAgICAgVHJ1ZQogICAgICAgID4+PiB3YXJuZWQuY2xlYXIoKQogICAgICAgID4+PiB2cnAoJ2Zvby9mLi4vYmFyLnR4dCcpCiAgICAgICAgPj4+IGJvb2wod2FybmVkKQogICAgICAgIEZhbHNlCgogICAgICAgIFdpbmRvd3MgcGF0aCBzZXBhcmF0b3JzIGFyZSBzdHJhaWdodC11cCBkaXNhbGxvd2VkLgogICAgICAgID4+PiB2cnAocidcXGZvby9iYXIudHh0JykKICAgICAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgICAgICAgLi4uCiAgICAgICAgVmFsdWVFcnJvcjogVXNlIG9mIC4uIG9yIGFic29sdXRlIHBhdGggaW4gYSByZXNvdXJjZSBwYXRoIFwKaXMgbm90IGFsbG93ZWQuCgogICAgICAgID4+PiB2cnAocidDOlxcZm9vL2Jhci50eHQnKQogICAgICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICAgICAgICAuLi4KICAgICAgICBWYWx1ZUVycm9yOiBVc2Ugb2YgLi4gb3IgYWJzb2x1dGUgcGF0aCBpbiBhIHJlc291cmNlIHBhdGggXAppcyBub3QgYWxsb3dlZC4KCiAgICAgICAgQmxhbmsgdmFsdWVzIGFyZSBhbGxvd2VkCgogICAgICAgID4+PiB2cnAoJycpCiAgICAgICAgPj4+IGJvb2wod2FybmVkKQogICAgICAgIEZhbHNlCgogICAgICAgIE5vbi1zdHJpbmcgdmFsdWVzIGFyZSBub3QuCgogICAgICAgID4+PiB2cnAoTm9uZSkKICAgICAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgICAgICAgLi4uCiAgICAgICAgQXR0cmlidXRlRXJyb3I6IC4uLgogICAgICAgICIiIgogICAgICAgIGludmFsaWQgPSAoCiAgICAgICAgICAgIG9zLnBhdGgucGFyZGlyIGluIHBhdGguc3BsaXQocG9zaXhwYXRoLnNlcCkgb3IKICAgICAgICAgICAgcG9zaXhwYXRoLmlzYWJzKHBhdGgpIG9yCiAgICAgICAgICAgIG50cGF0aC5pc2FicyhwYXRoKQogICAgICAgICkKICAgICAgICBpZiBub3QgaW52YWxpZDoKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIG1zZyA9ICJVc2Ugb2YgLi4gb3IgYWJzb2x1dGUgcGF0aCBpbiBhIHJlc291cmNlIHBhdGggaXMgbm90IGFsbG93ZWQuIgoKICAgICAgICAjIEFnZ3Jlc3NpdmVseSBkaXNhbGxvdyBXaW5kb3dzIGFic29sdXRlIHBhdGhzCiAgICAgICAgaWYgbnRwYXRoLmlzYWJzKHBhdGgpIGFuZCBub3QgcG9zaXhwYXRoLmlzYWJzKHBhdGgpOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKG1zZykKCiAgICAgICAgIyBmb3IgY29tcGF0aWJpbGl0eSwgd2FybjsgaW4gZnV0dXJlCiAgICAgICAgIyByYWlzZSBWYWx1ZUVycm9yKG1zZykKICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICBtc2dbOi0xXSArICIgYW5kIHdpbGwgcmFpc2UgZXhjZXB0aW9ucyBpbiBhIGZ1dHVyZSByZWxlYXNlLiIsCiAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywKICAgICAgICAgICAgc3RhY2tsZXZlbD00LAogICAgICAgICkKCiAgICBkZWYgX2dldChzZWxmLCBwYXRoKToKICAgICAgICBpZiBoYXNhdHRyKHNlbGYubG9hZGVyLCAnZ2V0X2RhdGEnKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYubG9hZGVyLmdldF9kYXRhKHBhdGgpCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigKICAgICAgICAgICAgIkNhbid0IHBlcmZvcm0gdGhpcyBvcGVyYXRpb24gZm9yIGxvYWRlcnMgd2l0aG91dCAnZ2V0X2RhdGEoKSciCiAgICAgICAgKQoKCnJlZ2lzdGVyX2xvYWRlcl90eXBlKG9iamVjdCwgTnVsbFByb3ZpZGVyKQoKCmNsYXNzIEVnZ1Byb3ZpZGVyKE51bGxQcm92aWRlcik6CiAgICAiIiJQcm92aWRlciBiYXNlZCBvbiBhIHZpcnR1YWwgZmlsZXN5c3RlbSIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtb2R1bGUpOgogICAgICAgIE51bGxQcm92aWRlci5fX2luaXRfXyhzZWxmLCBtb2R1bGUpCiAgICAgICAgc2VsZi5fc2V0dXBfcHJlZml4KCkKCiAgICBkZWYgX3NldHVwX3ByZWZpeChzZWxmKToKICAgICAgICAjIHdlIGFzc3VtZSBoZXJlIHRoYXQgb3VyIG1ldGFkYXRhIG1heSBiZSBuZXN0ZWQgaW5zaWRlIGEgImJhc2tldCIKICAgICAgICAjIG9mIG11bHRpcGxlIGVnZ3M7IHRoYXQncyB3aHkgd2UgdXNlIG1vZHVsZV9wYXRoIGluc3RlYWQgb2YgLmFyY2hpdmUKICAgICAgICBwYXRoID0gc2VsZi5tb2R1bGVfcGF0aAogICAgICAgIG9sZCA9IE5vbmUKICAgICAgICB3aGlsZSBwYXRoICE9IG9sZDoKICAgICAgICAgICAgaWYgX2lzX2VnZ19wYXRoKHBhdGgpOgogICAgICAgICAgICAgICAgc2VsZi5lZ2dfbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUocGF0aCkKICAgICAgICAgICAgICAgIHNlbGYuZWdnX2luZm8gPSBvcy5wYXRoLmpvaW4ocGF0aCwgJ0VHRy1JTkZPJykKICAgICAgICAgICAgICAgIHNlbGYuZWdnX3Jvb3QgPSBwYXRoCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBvbGQgPSBwYXRoCiAgICAgICAgICAgIHBhdGgsIGJhc2UgPSBvcy5wYXRoLnNwbGl0KHBhdGgpCgoKY2xhc3MgRGVmYXVsdFByb3ZpZGVyKEVnZ1Byb3ZpZGVyKToKICAgICIiIlByb3ZpZGVzIGFjY2VzcyB0byBwYWNrYWdlIHJlc291cmNlcyBpbiB0aGUgZmlsZXN5c3RlbSIiIgoKICAgIGRlZiBfaGFzKHNlbGYsIHBhdGgpOgogICAgICAgIHJldHVybiBvcy5wYXRoLmV4aXN0cyhwYXRoKQoKICAgIGRlZiBfaXNkaXIoc2VsZiwgcGF0aCk6CiAgICAgICAgcmV0dXJuIG9zLnBhdGguaXNkaXIocGF0aCkKCiAgICBkZWYgX2xpc3RkaXIoc2VsZiwgcGF0aCk6CiAgICAgICAgcmV0dXJuIG9zLmxpc3RkaXIocGF0aCkKCiAgICBkZWYgZ2V0X3Jlc291cmNlX3N0cmVhbShzZWxmLCBtYW5hZ2VyLCByZXNvdXJjZV9uYW1lKToKICAgICAgICByZXR1cm4gb3BlbihzZWxmLl9mbihzZWxmLm1vZHVsZV9wYXRoLCByZXNvdXJjZV9uYW1lKSwgJ3JiJykKCiAgICBkZWYgX2dldChzZWxmLCBwYXRoKToKICAgICAgICB3aXRoIG9wZW4ocGF0aCwgJ3JiJykgYXMgc3RyZWFtOgogICAgICAgICAgICByZXR1cm4gc3RyZWFtLnJlYWQoKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9yZWdpc3RlcihjbHMpOgogICAgICAgIGxvYWRlcl9uYW1lcyA9ICdTb3VyY2VGaWxlTG9hZGVyJywgJ1NvdXJjZWxlc3NGaWxlTG9hZGVyJywKICAgICAgICBmb3IgbmFtZSBpbiBsb2FkZXJfbmFtZXM6CiAgICAgICAgICAgIGxvYWRlcl9jbHMgPSBnZXRhdHRyKGltcG9ydGxpYl9tYWNoaW5lcnksIG5hbWUsIHR5cGUoTm9uZSkpCiAgICAgICAgICAgIHJlZ2lzdGVyX2xvYWRlcl90eXBlKGxvYWRlcl9jbHMsIGNscykKCgpEZWZhdWx0UHJvdmlkZXIuX3JlZ2lzdGVyKCkKCgpjbGFzcyBFbXB0eVByb3ZpZGVyKE51bGxQcm92aWRlcik6CiAgICAiIiJQcm92aWRlciB0aGF0IHJldHVybnMgbm90aGluZyBmb3IgYWxsIHJlcXVlc3RzIiIiCgogICAgbW9kdWxlX3BhdGggPSBOb25lCgogICAgX2lzZGlyID0gX2hhcyA9IGxhbWJkYSBzZWxmLCBwYXRoOiBGYWxzZQoKICAgIGRlZiBfZ2V0KHNlbGYsIHBhdGgpOgogICAgICAgIHJldHVybiAnJwoKICAgIGRlZiBfbGlzdGRpcihzZWxmLCBwYXRoKToKICAgICAgICByZXR1cm4gW10KCiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgcGFzcwoKCmVtcHR5X3Byb3ZpZGVyID0gRW1wdHlQcm92aWRlcigpCgoKY2xhc3MgWmlwTWFuaWZlc3RzKGRpY3QpOgogICAgIiIiCiAgICB6aXAgbWFuaWZlc3QgYnVpbGRlcgogICAgIiIiCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgYnVpbGQoY2xzLCBwYXRoKToKICAgICAgICAiIiIKICAgICAgICBCdWlsZCBhIGRpY3Rpb25hcnkgc2ltaWxhciB0byB0aGUgemlwaW1wb3J0IGRpcmVjdG9yeQogICAgICAgIGNhY2hlcywgZXhjZXB0IGluc3RlYWQgb2YgdHVwbGVzLCBzdG9yZSBaaXBJbmZvIG9iamVjdHMuCgogICAgICAgIFVzZSBhIHBsYXRmb3JtLXNwZWNpZmljIHBhdGggc2VwYXJhdG9yIChvcy5zZXApIGZvciB0aGUgcGF0aCBrZXlzCiAgICAgICAgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBweXB5IG9uIFdpbmRvd3MuCiAgICAgICAgIiIiCiAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUocGF0aCkgYXMgemZpbGU6CiAgICAgICAgICAgIGl0ZW1zID0gKAogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgIG5hbWUucmVwbGFjZSgnLycsIG9zLnNlcCksCiAgICAgICAgICAgICAgICAgICAgemZpbGUuZ2V0aW5mbyhuYW1lKSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGZvciBuYW1lIGluIHpmaWxlLm5hbWVsaXN0KCkKICAgICAgICAgICAgKQogICAgICAgICAgICByZXR1cm4gZGljdChpdGVtcykKCiAgICBsb2FkID0gYnVpbGQKCgpjbGFzcyBNZW1vaXplZFppcE1hbmlmZXN0cyhaaXBNYW5pZmVzdHMpOgogICAgIiIiCiAgICBNZW1vaXplZCB6aXBmaWxlIG1hbmlmZXN0cy4KICAgICIiIgogICAgbWFuaWZlc3RfbW9kID0gY29sbGVjdGlvbnMubmFtZWR0dXBsZSgnbWFuaWZlc3RfbW9kJywgJ21hbmlmZXN0IG10aW1lJykKCiAgICBkZWYgbG9hZChzZWxmLCBwYXRoKToKICAgICAgICAiIiIKICAgICAgICBMb2FkIGEgbWFuaWZlc3QgYXQgcGF0aCBvciByZXR1cm4gYSBzdWl0YWJsZSBtYW5pZmVzdCBhbHJlYWR5IGxvYWRlZC4KICAgICAgICAiIiIKICAgICAgICBwYXRoID0gb3MucGF0aC5ub3JtcGF0aChwYXRoKQogICAgICAgIG10aW1lID0gb3Muc3RhdChwYXRoKS5zdF9tdGltZQoKICAgICAgICBpZiBwYXRoIG5vdCBpbiBzZWxmIG9yIHNlbGZbcGF0aF0ubXRpbWUgIT0gbXRpbWU6CiAgICAgICAgICAgIG1hbmlmZXN0ID0gc2VsZi5idWlsZChwYXRoKQogICAgICAgICAgICBzZWxmW3BhdGhdID0gc2VsZi5tYW5pZmVzdF9tb2QobWFuaWZlc3QsIG10aW1lKQoKICAgICAgICByZXR1cm4gc2VsZltwYXRoXS5tYW5pZmVzdAoKCmNsYXNzIFppcFByb3ZpZGVyKEVnZ1Byb3ZpZGVyKToKICAgICIiIlJlc291cmNlIHN1cHBvcnQgZm9yIHppcHMgYW5kIGVnZ3MiIiIKCiAgICBlYWdlcnMgPSBOb25lCiAgICBfemlwX21hbmlmZXN0cyA9IE1lbW9pemVkWmlwTWFuaWZlc3RzKCkKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbW9kdWxlKToKICAgICAgICBFZ2dQcm92aWRlci5fX2luaXRfXyhzZWxmLCBtb2R1bGUpCiAgICAgICAgc2VsZi56aXBfcHJlID0gc2VsZi5sb2FkZXIuYXJjaGl2ZSArIG9zLnNlcAoKICAgIGRlZiBfemlwaW5mb19uYW1lKHNlbGYsIGZzcGF0aCk6CiAgICAgICAgIyBDb252ZXJ0IGEgdmlydHVhbCBmaWxlbmFtZSAoZnVsbCBwYXRoIHRvIGZpbGUpIGludG8gYSB6aXBmaWxlIHN1YnBhdGgKICAgICAgICAjIHVzYWJsZSB3aXRoIHRoZSB6aXBpbXBvcnQgZGlyZWN0b3J5IGNhY2hlIGZvciBvdXIgdGFyZ2V0IGFyY2hpdmUKICAgICAgICBmc3BhdGggPSBmc3BhdGgucnN0cmlwKG9zLnNlcCkKICAgICAgICBpZiBmc3BhdGggPT0gc2VsZi5sb2FkZXIuYXJjaGl2ZToKICAgICAgICAgICAgcmV0dXJuICcnCiAgICAgICAgaWYgZnNwYXRoLnN0YXJ0c3dpdGgoc2VsZi56aXBfcHJlKToKICAgICAgICAgICAgcmV0dXJuIGZzcGF0aFtsZW4oc2VsZi56aXBfcHJlKTpdCiAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoCiAgICAgICAgICAgICIlcyBpcyBub3QgYSBzdWJwYXRoIG9mICVzIiAlIChmc3BhdGgsIHNlbGYuemlwX3ByZSkKICAgICAgICApCgogICAgZGVmIF9wYXJ0cyhzZWxmLCB6aXBfcGF0aCk6CiAgICAgICAgIyBDb252ZXJ0IGEgemlwZmlsZSBzdWJwYXRoIGludG8gYW4gZWdnLXJlbGF0aXZlIHBhdGggcGFydCBsaXN0LgogICAgICAgICMgcHNldWRvLWZzIHBhdGgKICAgICAgICBmc3BhdGggPSBzZWxmLnppcF9wcmUgKyB6aXBfcGF0aAogICAgICAgIGlmIGZzcGF0aC5zdGFydHN3aXRoKHNlbGYuZWdnX3Jvb3QgKyBvcy5zZXApOgogICAgICAgICAgICByZXR1cm4gZnNwYXRoW2xlbihzZWxmLmVnZ19yb290KSArIDE6XS5zcGxpdChvcy5zZXApCiAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoCiAgICAgICAgICAgICIlcyBpcyBub3QgYSBzdWJwYXRoIG9mICVzIiAlIChmc3BhdGgsIHNlbGYuZWdnX3Jvb3QpCiAgICAgICAgKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHppcGluZm8oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3ppcF9tYW5pZmVzdHMubG9hZChzZWxmLmxvYWRlci5hcmNoaXZlKQoKICAgIGRlZiBnZXRfcmVzb3VyY2VfZmlsZW5hbWUoc2VsZiwgbWFuYWdlciwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgaWYgbm90IHNlbGYuZWdnX25hbWU6CiAgICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfZmlsZW5hbWUoKSBvbmx5IHN1cHBvcnRlZCBmb3IgLmVnZywgbm90IC56aXAiCiAgICAgICAgICAgICkKICAgICAgICAjIG5vIG5lZWQgdG8gbG9jayBmb3IgZXh0cmFjdGlvbiwgc2luY2Ugd2UgdXNlIHRlbXAgbmFtZXMKICAgICAgICB6aXBfcGF0aCA9IHNlbGYuX3Jlc291cmNlX3RvX3ppcChyZXNvdXJjZV9uYW1lKQogICAgICAgIGVhZ2VycyA9IHNlbGYuX2dldF9lYWdlcl9yZXNvdXJjZXMoKQogICAgICAgIGlmICcvJy5qb2luKHNlbGYuX3BhcnRzKHppcF9wYXRoKSkgaW4gZWFnZXJzOgogICAgICAgICAgICBmb3IgbmFtZSBpbiBlYWdlcnM6CiAgICAgICAgICAgICAgICBzZWxmLl9leHRyYWN0X3Jlc291cmNlKG1hbmFnZXIsIHNlbGYuX2VhZ2VyX3RvX3ppcChuYW1lKSkKICAgICAgICByZXR1cm4gc2VsZi5fZXh0cmFjdF9yZXNvdXJjZShtYW5hZ2VyLCB6aXBfcGF0aCkKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2dldF9kYXRlX2FuZF9zaXplKHppcF9zdGF0KToKICAgICAgICBzaXplID0gemlwX3N0YXQuZmlsZV9zaXplCiAgICAgICAgIyB5bWRobXMrd2RheSwgeWRheSwgZHN0CiAgICAgICAgZGF0ZV90aW1lID0gemlwX3N0YXQuZGF0ZV90aW1lICsgKDAsIDAsIC0xKQogICAgICAgICMgMTk4MCBvZmZzZXQgYWxyZWFkeSBkb25lCiAgICAgICAgdGltZXN0YW1wID0gdGltZS5ta3RpbWUoZGF0ZV90aW1lKQogICAgICAgIHJldHVybiB0aW1lc3RhbXAsIHNpemUKCiAgICBkZWYgX2V4dHJhY3RfcmVzb3VyY2Uoc2VsZiwgbWFuYWdlciwgemlwX3BhdGgpOgoKICAgICAgICBpZiB6aXBfcGF0aCBpbiBzZWxmLl9pbmRleCgpOgogICAgICAgICAgICBmb3IgbmFtZSBpbiBzZWxmLl9pbmRleCgpW3ppcF9wYXRoXToKICAgICAgICAgICAgICAgIGxhc3QgPSBzZWxmLl9leHRyYWN0X3Jlc291cmNlKAogICAgICAgICAgICAgICAgICAgIG1hbmFnZXIsIG9zLnBhdGguam9pbih6aXBfcGF0aCwgbmFtZSkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgIyByZXR1cm4gdGhlIGV4dHJhY3RlZCBkaXJlY3RvcnkgbmFtZQogICAgICAgICAgICByZXR1cm4gb3MucGF0aC5kaXJuYW1lKGxhc3QpCgogICAgICAgIHRpbWVzdGFtcCwgc2l6ZSA9IHNlbGYuX2dldF9kYXRlX2FuZF9zaXplKHNlbGYuemlwaW5mb1t6aXBfcGF0aF0pCgogICAgICAgIGlmIG5vdCBXUklURV9TVVBQT1JUOgogICAgICAgICAgICByYWlzZSBJT0Vycm9yKCcib3MucmVuYW1lIiBhbmQgIm9zLnVubGluayIgYXJlIG5vdCBzdXBwb3J0ZWQgJwogICAgICAgICAgICAgICAgICAgICAgICAgICdvbiB0aGlzIHBsYXRmb3JtJykKICAgICAgICB0cnk6CgogICAgICAgICAgICByZWFsX3BhdGggPSBtYW5hZ2VyLmdldF9jYWNoZV9wYXRoKAogICAgICAgICAgICAgICAgc2VsZi5lZ2dfbmFtZSwgc2VsZi5fcGFydHMoemlwX3BhdGgpCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIGlmIHNlbGYuX2lzX2N1cnJlbnQocmVhbF9wYXRoLCB6aXBfcGF0aCk6CiAgICAgICAgICAgICAgICByZXR1cm4gcmVhbF9wYXRoCgogICAgICAgICAgICBvdXRmLCB0bXBuYW0gPSBfbWtzdGVtcCgKICAgICAgICAgICAgICAgICIuJGV4dHJhY3QiLAogICAgICAgICAgICAgICAgZGlyPW9zLnBhdGguZGlybmFtZShyZWFsX3BhdGgpLAogICAgICAgICAgICApCiAgICAgICAgICAgIG9zLndyaXRlKG91dGYsIHNlbGYubG9hZGVyLmdldF9kYXRhKHppcF9wYXRoKSkKICAgICAgICAgICAgb3MuY2xvc2Uob3V0ZikKICAgICAgICAgICAgdXRpbWUodG1wbmFtLCAodGltZXN0YW1wLCB0aW1lc3RhbXApKQogICAgICAgICAgICBtYW5hZ2VyLnBvc3Rwcm9jZXNzKHRtcG5hbSwgcmVhbF9wYXRoKQoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmVuYW1lKHRtcG5hbSwgcmVhbF9wYXRoKQoKICAgICAgICAgICAgZXhjZXB0IG9zLmVycm9yOgogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUocmVhbF9wYXRoKToKICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLl9pc19jdXJyZW50KHJlYWxfcGF0aCwgemlwX3BhdGgpOgogICAgICAgICAgICAgICAgICAgICAgICAjIHRoZSBmaWxlIGJlY2FtZSBjdXJyZW50IHNpbmNlIGl0IHdhcyBjaGVja2VkIGFib3ZlLAogICAgICAgICAgICAgICAgICAgICAgICAjICBzbyBwcm9jZWVkLgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVhbF9wYXRoCiAgICAgICAgICAgICAgICAgICAgIyBXaW5kb3dzLCBkZWwgb2xkIGZpbGUgYW5kIHJldHJ5CiAgICAgICAgICAgICAgICAgICAgZWxpZiBvcy5uYW1lID09ICdudCc6CiAgICAgICAgICAgICAgICAgICAgICAgIHVubGluayhyZWFsX3BhdGgpCiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtZSh0bXBuYW0sIHJlYWxfcGF0aCkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWxfcGF0aAogICAgICAgICAgICAgICAgcmFpc2UKCiAgICAgICAgZXhjZXB0IG9zLmVycm9yOgogICAgICAgICAgICAjIHJlcG9ydCBhIHVzZXItZnJpZW5kbHkgZXJyb3IKICAgICAgICAgICAgbWFuYWdlci5leHRyYWN0aW9uX2Vycm9yKCkKCiAgICAgICAgcmV0dXJuIHJlYWxfcGF0aAoKICAgIGRlZiBfaXNfY3VycmVudChzZWxmLCBmaWxlX3BhdGgsIHppcF9wYXRoKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gVHJ1ZSBpZiB0aGUgZmlsZV9wYXRoIGlzIGN1cnJlbnQgZm9yIHRoaXMgemlwX3BhdGgKICAgICAgICAiIiIKICAgICAgICB0aW1lc3RhbXAsIHNpemUgPSBzZWxmLl9nZXRfZGF0ZV9hbmRfc2l6ZShzZWxmLnppcGluZm9bemlwX3BhdGhdKQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZmlsZShmaWxlX3BhdGgpOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICBzdGF0ID0gb3Muc3RhdChmaWxlX3BhdGgpCiAgICAgICAgaWYgc3RhdC5zdF9zaXplICE9IHNpemUgb3Igc3RhdC5zdF9tdGltZSAhPSB0aW1lc3RhbXA6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICMgY2hlY2sgdGhhdCB0aGUgY29udGVudHMgbWF0Y2gKICAgICAgICB6aXBfY29udGVudHMgPSBzZWxmLmxvYWRlci5nZXRfZGF0YSh6aXBfcGF0aCkKICAgICAgICB3aXRoIG9wZW4oZmlsZV9wYXRoLCAncmInKSBhcyBmOgogICAgICAgICAgICBmaWxlX2NvbnRlbnRzID0gZi5yZWFkKCkKICAgICAgICByZXR1cm4gemlwX2NvbnRlbnRzID09IGZpbGVfY29udGVudHMKCiAgICBkZWYgX2dldF9lYWdlcl9yZXNvdXJjZXMoc2VsZik6CiAgICAgICAgaWYgc2VsZi5lYWdlcnMgaXMgTm9uZToKICAgICAgICAgICAgZWFnZXJzID0gW10KICAgICAgICAgICAgZm9yIG5hbWUgaW4gKCduYXRpdmVfbGlicy50eHQnLCAnZWFnZXJfcmVzb3VyY2VzLnR4dCcpOgogICAgICAgICAgICAgICAgaWYgc2VsZi5oYXNfbWV0YWRhdGEobmFtZSk6CiAgICAgICAgICAgICAgICAgICAgZWFnZXJzLmV4dGVuZChzZWxmLmdldF9tZXRhZGF0YV9saW5lcyhuYW1lKSkKICAgICAgICAgICAgc2VsZi5lYWdlcnMgPSBlYWdlcnMKICAgICAgICByZXR1cm4gc2VsZi5lYWdlcnMKCiAgICBkZWYgX2luZGV4KHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2RpcmluZGV4CiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICBpbmQgPSB7fQogICAgICAgICAgICBmb3IgcGF0aCBpbiBzZWxmLnppcGluZm86CiAgICAgICAgICAgICAgICBwYXJ0cyA9IHBhdGguc3BsaXQob3Muc2VwKQogICAgICAgICAgICAgICAgd2hpbGUgcGFydHM6CiAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gb3Muc2VwLmpvaW4ocGFydHNbOi0xXSkKICAgICAgICAgICAgICAgICAgICBpZiBwYXJlbnQgaW4gaW5kOgogICAgICAgICAgICAgICAgICAgICAgICBpbmRbcGFyZW50XS5hcHBlbmQocGFydHNbLTFdKQogICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGluZFtwYXJlbnRdID0gW3BhcnRzLnBvcCgpXQogICAgICAgICAgICBzZWxmLl9kaXJpbmRleCA9IGluZAogICAgICAgICAgICByZXR1cm4gaW5kCgogICAgZGVmIF9oYXMoc2VsZiwgZnNwYXRoKToKICAgICAgICB6aXBfcGF0aCA9IHNlbGYuX3ppcGluZm9fbmFtZShmc3BhdGgpCiAgICAgICAgcmV0dXJuIHppcF9wYXRoIGluIHNlbGYuemlwaW5mbyBvciB6aXBfcGF0aCBpbiBzZWxmLl9pbmRleCgpCgogICAgZGVmIF9pc2RpcihzZWxmLCBmc3BhdGgpOgogICAgICAgIHJldHVybiBzZWxmLl96aXBpbmZvX25hbWUoZnNwYXRoKSBpbiBzZWxmLl9pbmRleCgpCgogICAgZGVmIF9saXN0ZGlyKHNlbGYsIGZzcGF0aCk6CiAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5faW5kZXgoKS5nZXQoc2VsZi5femlwaW5mb19uYW1lKGZzcGF0aCksICgpKSkKCiAgICBkZWYgX2VhZ2VyX3RvX3ppcChzZWxmLCByZXNvdXJjZV9uYW1lKToKICAgICAgICByZXR1cm4gc2VsZi5femlwaW5mb19uYW1lKHNlbGYuX2ZuKHNlbGYuZWdnX3Jvb3QsIHJlc291cmNlX25hbWUpKQoKICAgIGRlZiBfcmVzb3VyY2VfdG9femlwKHNlbGYsIHJlc291cmNlX25hbWUpOgogICAgICAgIHJldHVybiBzZWxmLl96aXBpbmZvX25hbWUoc2VsZi5fZm4oc2VsZi5tb2R1bGVfcGF0aCwgcmVzb3VyY2VfbmFtZSkpCgoKcmVnaXN0ZXJfbG9hZGVyX3R5cGUoemlwaW1wb3J0LnppcGltcG9ydGVyLCBaaXBQcm92aWRlcikKCgpjbGFzcyBGaWxlTWV0YWRhdGEoRW1wdHlQcm92aWRlcik6CiAgICAiIiJNZXRhZGF0YSBoYW5kbGVyIGZvciBzdGFuZGFsb25lIFBLRy1JTkZPIGZpbGVzCgogICAgVXNhZ2U6OgoKICAgICAgICBtZXRhZGF0YSA9IEZpbGVNZXRhZGF0YSgiL3BhdGgvdG8vUEtHLUlORk8iKQoKICAgIFRoaXMgcHJvdmlkZXIgcmVqZWN0cyBhbGwgZGF0YSBhbmQgbWV0YWRhdGEgcmVxdWVzdHMgZXhjZXB0IGZvciBQS0ctSU5GTywKICAgIHdoaWNoIGlzIHRyZWF0ZWQgYXMgZXhpc3RpbmcsIGFuZCB3aWxsIGJlIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZSBhdAogICAgdGhlIHByb3ZpZGVkIGxvY2F0aW9uLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGgpOgogICAgICAgIHNlbGYucGF0aCA9IHBhdGgKCiAgICBkZWYgX2dldF9tZXRhZGF0YV9wYXRoKHNlbGYsIG5hbWUpOgogICAgICAgIHJldHVybiBzZWxmLnBhdGgKCiAgICBkZWYgaGFzX21ldGFkYXRhKHNlbGYsIG5hbWUpOgogICAgICAgIHJldHVybiBuYW1lID09ICdQS0ctSU5GTycgYW5kIG9zLnBhdGguaXNmaWxlKHNlbGYucGF0aCkKCiAgICBkZWYgZ2V0X21ldGFkYXRhKHNlbGYsIG5hbWUpOgogICAgICAgIGlmIG5hbWUgIT0gJ1BLRy1JTkZPJzoKICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoIk5vIG1ldGFkYXRhIGV4Y2VwdCBQS0ctSU5GTyBpcyBhdmFpbGFibGUiKQoKICAgICAgICB3aXRoIGlvLm9wZW4oc2VsZi5wYXRoLCBlbmNvZGluZz0ndXRmLTgnLCBlcnJvcnM9InJlcGxhY2UiKSBhcyBmOgogICAgICAgICAgICBtZXRhZGF0YSA9IGYucmVhZCgpCiAgICAgICAgc2VsZi5fd2Fybl9vbl9yZXBsYWNlbWVudChtZXRhZGF0YSkKICAgICAgICByZXR1cm4gbWV0YWRhdGEKCiAgICBkZWYgX3dhcm5fb25fcmVwbGFjZW1lbnQoc2VsZiwgbWV0YWRhdGEpOgogICAgICAgICMgUHl0aG9uIDIuNyBjb21wYXQgZm9yOiByZXBsYWNlbWVudF9jaGFyID0gJ++/vScKICAgICAgICByZXBsYWNlbWVudF9jaGFyID0gYidceGVmXHhiZlx4YmQnLmRlY29kZSgndXRmLTgnKQogICAgICAgIGlmIHJlcGxhY2VtZW50X2NoYXIgaW4gbWV0YWRhdGE6CiAgICAgICAgICAgIHRtcGwgPSAie3NlbGYucGF0aH0gY291bGQgbm90IGJlIHByb3Blcmx5IGRlY29kZWQgaW4gVVRGLTgiCiAgICAgICAgICAgIG1zZyA9IHRtcGwuZm9ybWF0KCoqbG9jYWxzKCkpCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4obXNnKQoKICAgIGRlZiBnZXRfbWV0YWRhdGFfbGluZXMoc2VsZiwgbmFtZSk6CiAgICAgICAgcmV0dXJuIHlpZWxkX2xpbmVzKHNlbGYuZ2V0X21ldGFkYXRhKG5hbWUpKQoKCmNsYXNzIFBhdGhNZXRhZGF0YShEZWZhdWx0UHJvdmlkZXIpOgogICAgIiIiTWV0YWRhdGEgcHJvdmlkZXIgZm9yIGVnZyBkaXJlY3RvcmllcwoKICAgIFVzYWdlOjoKCiAgICAgICAgIyBEZXZlbG9wbWVudCBlZ2dzOgoKICAgICAgICBlZ2dfaW5mbyA9ICIvcGF0aC90by9QYWNrYWdlTmFtZS5lZ2ctaW5mbyIKICAgICAgICBiYXNlX2RpciA9IG9zLnBhdGguZGlybmFtZShlZ2dfaW5mbykKICAgICAgICBtZXRhZGF0YSA9IFBhdGhNZXRhZGF0YShiYXNlX2RpciwgZWdnX2luZm8pCiAgICAgICAgZGlzdF9uYW1lID0gb3MucGF0aC5zcGxpdGV4dChvcy5wYXRoLmJhc2VuYW1lKGVnZ19pbmZvKSlbMF0KICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uKGJhc2VkaXIsIHByb2plY3RfbmFtZT1kaXN0X25hbWUsIG1ldGFkYXRhPW1ldGFkYXRhKQoKICAgICAgICAjIFVucGFja2VkIGVnZyBkaXJlY3RvcmllczoKCiAgICAgICAgZWdnX3BhdGggPSAiL3BhdGgvdG8vUGFja2FnZU5hbWUtdmVyLXB5dmVyLWV0Yy5lZ2ciCiAgICAgICAgbWV0YWRhdGEgPSBQYXRoTWV0YWRhdGEoZWdnX3BhdGgsIG9zLnBhdGguam9pbihlZ2dfcGF0aCwnRUdHLUlORk8nKSkKICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uLmZyb21fZmlsZW5hbWUoZWdnX3BhdGgsIG1ldGFkYXRhPW1ldGFkYXRhKQogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGgsIGVnZ19pbmZvKToKICAgICAgICBzZWxmLm1vZHVsZV9wYXRoID0gcGF0aAogICAgICAgIHNlbGYuZWdnX2luZm8gPSBlZ2dfaW5mbwoKCmNsYXNzIEVnZ01ldGFkYXRhKFppcFByb3ZpZGVyKToKICAgICIiIk1ldGFkYXRhIHByb3ZpZGVyIGZvciAuZWdnIGZpbGVzIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGltcG9ydGVyKToKICAgICAgICAiIiJDcmVhdGUgYSBtZXRhZGF0YSBwcm92aWRlciBmcm9tIGEgemlwaW1wb3J0ZXIiIiIKCiAgICAgICAgc2VsZi56aXBfcHJlID0gaW1wb3J0ZXIuYXJjaGl2ZSArIG9zLnNlcAogICAgICAgIHNlbGYubG9hZGVyID0gaW1wb3J0ZXIKICAgICAgICBpZiBpbXBvcnRlci5wcmVmaXg6CiAgICAgICAgICAgIHNlbGYubW9kdWxlX3BhdGggPSBvcy5wYXRoLmpvaW4oaW1wb3J0ZXIuYXJjaGl2ZSwgaW1wb3J0ZXIucHJlZml4KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYubW9kdWxlX3BhdGggPSBpbXBvcnRlci5hcmNoaXZlCiAgICAgICAgc2VsZi5fc2V0dXBfcHJlZml4KCkKCgpfZGVjbGFyZV9zdGF0ZSgnZGljdCcsIF9kaXN0cmlidXRpb25fZmluZGVycz17fSkKCgpkZWYgcmVnaXN0ZXJfZmluZGVyKGltcG9ydGVyX3R5cGUsIGRpc3RyaWJ1dGlvbl9maW5kZXIpOgogICAgIiIiUmVnaXN0ZXIgYGRpc3RyaWJ1dGlvbl9maW5kZXJgIHRvIGZpbmQgZGlzdHJpYnV0aW9ucyBpbiBzeXMucGF0aCBpdGVtcwoKICAgIGBpbXBvcnRlcl90eXBlYCBpcyB0aGUgdHlwZSBvciBjbGFzcyBvZiBhIFBFUCAzMDIgIkltcG9ydGVyIiAoc3lzLnBhdGggaXRlbQogICAgaGFuZGxlciksIGFuZCBgZGlzdHJpYnV0aW9uX2ZpbmRlcmAgaXMgYSBjYWxsYWJsZSB0aGF0LCBwYXNzZWQgYSBwYXRoCiAgICBpdGVtIGFuZCB0aGUgaW1wb3J0ZXIgaW5zdGFuY2UsIHlpZWxkcyBgYERpc3RyaWJ1dGlvbmBgIGluc3RhbmNlcyBmb3VuZCBvbgogICAgdGhhdCBwYXRoIGl0ZW0uICBTZWUgYGBwa2dfcmVzb3VyY2VzLmZpbmRfb25fcGF0aGBgIGZvciBhbiBleGFtcGxlLiIiIgogICAgX2Rpc3RyaWJ1dGlvbl9maW5kZXJzW2ltcG9ydGVyX3R5cGVdID0gZGlzdHJpYnV0aW9uX2ZpbmRlcgoKCmRlZiBmaW5kX2Rpc3RyaWJ1dGlvbnMocGF0aF9pdGVtLCBvbmx5PUZhbHNlKToKICAgICIiIllpZWxkIGRpc3RyaWJ1dGlvbnMgYWNjZXNzaWJsZSB2aWEgYHBhdGhfaXRlbWAiIiIKICAgIGltcG9ydGVyID0gZ2V0X2ltcG9ydGVyKHBhdGhfaXRlbSkKICAgIGZpbmRlciA9IF9maW5kX2FkYXB0ZXIoX2Rpc3RyaWJ1dGlvbl9maW5kZXJzLCBpbXBvcnRlcikKICAgIHJldHVybiBmaW5kZXIoaW1wb3J0ZXIsIHBhdGhfaXRlbSwgb25seSkKCgpkZWYgZmluZF9lZ2dzX2luX3ppcChpbXBvcnRlciwgcGF0aF9pdGVtLCBvbmx5PUZhbHNlKToKICAgICIiIgogICAgRmluZCBlZ2dzIGluIHppcCBmaWxlczsgcG9zc2libHkgbXVsdGlwbGUgbmVzdGVkIGVnZ3MuCiAgICAiIiIKICAgIGlmIGltcG9ydGVyLmFyY2hpdmUuZW5kc3dpdGgoJy53aGwnKToKICAgICAgICAjIHdoZWVscyBhcmUgbm90IHN1cHBvcnRlZCB3aXRoIHRoaXMgZmluZGVyCiAgICAgICAgIyB0aGV5IGRvbid0IGhhdmUgUEtHLUlORk8gbWV0YWRhdGEsIGFuZCB3b24ndCBldmVyIGNvbnRhaW4gZWdncwogICAgICAgIHJldHVybgogICAgbWV0YWRhdGEgPSBFZ2dNZXRhZGF0YShpbXBvcnRlcikKICAgIGlmIG1ldGFkYXRhLmhhc19tZXRhZGF0YSgnUEtHLUlORk8nKToKICAgICAgICB5aWVsZCBEaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZShwYXRoX2l0ZW0sIG1ldGFkYXRhPW1ldGFkYXRhKQogICAgaWYgb25seToKICAgICAgICAjIGRvbid0IHlpZWxkIG5lc3RlZCBkaXN0cm9zCiAgICAgICAgcmV0dXJuCiAgICBmb3Igc3ViaXRlbSBpbiBtZXRhZGF0YS5yZXNvdXJjZV9saXN0ZGlyKCcnKToKICAgICAgICBpZiBfaXNfZWdnX3BhdGgoc3ViaXRlbSk6CiAgICAgICAgICAgIHN1YnBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aF9pdGVtLCBzdWJpdGVtKQogICAgICAgICAgICBkaXN0cyA9IGZpbmRfZWdnc19pbl96aXAoemlwaW1wb3J0LnppcGltcG9ydGVyKHN1YnBhdGgpLCBzdWJwYXRoKQogICAgICAgICAgICBmb3IgZGlzdCBpbiBkaXN0czoKICAgICAgICAgICAgICAgIHlpZWxkIGRpc3QKICAgICAgICBlbGlmIHN1Yml0ZW0ubG93ZXIoKS5lbmRzd2l0aCgnLmRpc3QtaW5mbycpOgogICAgICAgICAgICBzdWJwYXRoID0gb3MucGF0aC5qb2luKHBhdGhfaXRlbSwgc3ViaXRlbSkKICAgICAgICAgICAgc3VibWV0YSA9IEVnZ01ldGFkYXRhKHppcGltcG9ydC56aXBpbXBvcnRlcihzdWJwYXRoKSkKICAgICAgICAgICAgc3VibWV0YS5lZ2dfaW5mbyA9IHN1YnBhdGgKICAgICAgICAgICAgeWllbGQgRGlzdHJpYnV0aW9uLmZyb21fbG9jYXRpb24ocGF0aF9pdGVtLCBzdWJpdGVtLCBzdWJtZXRhKQoKCnJlZ2lzdGVyX2ZpbmRlcih6aXBpbXBvcnQuemlwaW1wb3J0ZXIsIGZpbmRfZWdnc19pbl96aXApCgoKZGVmIGZpbmRfbm90aGluZyhpbXBvcnRlciwgcGF0aF9pdGVtLCBvbmx5PUZhbHNlKToKICAgIHJldHVybiAoKQoKCnJlZ2lzdGVyX2ZpbmRlcihvYmplY3QsIGZpbmRfbm90aGluZykKCgpkZWYgX2J5X3ZlcnNpb25fZGVzY2VuZGluZyhuYW1lcyk6CiAgICAiIiIKICAgIEdpdmVuIGEgbGlzdCBvZiBmaWxlbmFtZXMsIHJldHVybiB0aGVtIGluIGRlc2NlbmRpbmcgb3JkZXIKICAgIGJ5IHZlcnNpb24gbnVtYmVyLgoKICAgID4+PiBuYW1lcyA9ICdiYXInLCAnZm9vJywgJ1B5dGhvbi0yLjcuMTAuZWdnJywgJ1B5dGhvbi0yLjcuMi5lZ2cnCiAgICA+Pj4gX2J5X3ZlcnNpb25fZGVzY2VuZGluZyhuYW1lcykKICAgIFsnUHl0aG9uLTIuNy4xMC5lZ2cnLCAnUHl0aG9uLTIuNy4yLmVnZycsICdmb28nLCAnYmFyJ10KICAgID4+PiBuYW1lcyA9ICdTZXR1cHRvb2xzLTEuMi4zYjEuZWdnJywgJ1NldHVwdG9vbHMtMS4yLjMuZWdnJwogICAgPj4+IF9ieV92ZXJzaW9uX2Rlc2NlbmRpbmcobmFtZXMpCiAgICBbJ1NldHVwdG9vbHMtMS4yLjMuZWdnJywgJ1NldHVwdG9vbHMtMS4yLjNiMS5lZ2cnXQogICAgPj4+IG5hbWVzID0gJ1NldHVwdG9vbHMtMS4yLjNiMS5lZ2cnLCAnU2V0dXB0b29scy0xLjIuMy5wb3N0MS5lZ2cnCiAgICA+Pj4gX2J5X3ZlcnNpb25fZGVzY2VuZGluZyhuYW1lcykKICAgIFsnU2V0dXB0b29scy0xLjIuMy5wb3N0MS5lZ2cnLCAnU2V0dXB0b29scy0xLjIuM2IxLmVnZyddCiAgICAiIiIKICAgIGRlZiBfYnlfdmVyc2lvbihuYW1lKToKICAgICAgICAiIiIKICAgICAgICBQYXJzZSBlYWNoIGNvbXBvbmVudCBvZiB0aGUgZmlsZW5hbWUKICAgICAgICAiIiIKICAgICAgICBuYW1lLCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KG5hbWUpCiAgICAgICAgcGFydHMgPSBpdGVydG9vbHMuY2hhaW4obmFtZS5zcGxpdCgnLScpLCBbZXh0XSkKICAgICAgICByZXR1cm4gW3BhY2thZ2luZy52ZXJzaW9uLnBhcnNlKHBhcnQpIGZvciBwYXJ0IGluIHBhcnRzXQoKICAgIHJldHVybiBzb3J0ZWQobmFtZXMsIGtleT1fYnlfdmVyc2lvbiwgcmV2ZXJzZT1UcnVlKQoKCmRlZiBmaW5kX29uX3BhdGgoaW1wb3J0ZXIsIHBhdGhfaXRlbSwgb25seT1GYWxzZSk6CiAgICAiIiJZaWVsZCBkaXN0cmlidXRpb25zIGFjY2Vzc2libGUgb24gYSBzeXMucGF0aCBkaXJlY3RvcnkiIiIKICAgIHBhdGhfaXRlbSA9IF9ub3JtYWxpemVfY2FjaGVkKHBhdGhfaXRlbSkKCiAgICBpZiBfaXNfdW5wYWNrZWRfZWdnKHBhdGhfaXRlbSk6CiAgICAgICAgeWllbGQgRGlzdHJpYnV0aW9uLmZyb21fZmlsZW5hbWUoCiAgICAgICAgICAgIHBhdGhfaXRlbSwgbWV0YWRhdGE9UGF0aE1ldGFkYXRhKAogICAgICAgICAgICAgICAgcGF0aF9pdGVtLCBvcy5wYXRoLmpvaW4ocGF0aF9pdGVtLCAnRUdHLUlORk8nKQogICAgICAgICAgICApCiAgICAgICAgKQogICAgICAgIHJldHVybgoKICAgIGVudHJpZXMgPSBzYWZlX2xpc3RkaXIocGF0aF9pdGVtKQoKICAgICMgZm9yIHBlcmZvcm1hbmNlLCBiZWZvcmUgc29ydGluZyBieSB2ZXJzaW9uLAogICAgIyBzY3JlZW4gZW50cmllcyBmb3Igb25seSB0aG9zZSB0aGF0IHdpbGwgeWllbGQKICAgICMgZGlzdHJpYnV0aW9ucwogICAgZmlsdGVyZWQgPSAoCiAgICAgICAgZW50cnkKICAgICAgICBmb3IgZW50cnkgaW4gZW50cmllcwogICAgICAgIGlmIGRpc3RfZmFjdG9yeShwYXRoX2l0ZW0sIGVudHJ5LCBvbmx5KQogICAgKQoKICAgICMgc2NhbiBmb3IgLmVnZyBhbmQgLmVnZy1pbmZvIGluIGRpcmVjdG9yeQogICAgcGF0aF9pdGVtX2VudHJpZXMgPSBfYnlfdmVyc2lvbl9kZXNjZW5kaW5nKGZpbHRlcmVkKQogICAgZm9yIGVudHJ5IGluIHBhdGhfaXRlbV9lbnRyaWVzOgogICAgICAgIGZ1bGxwYXRoID0gb3MucGF0aC5qb2luKHBhdGhfaXRlbSwgZW50cnkpCiAgICAgICAgZmFjdG9yeSA9IGRpc3RfZmFjdG9yeShwYXRoX2l0ZW0sIGVudHJ5LCBvbmx5KQogICAgICAgIGZvciBkaXN0IGluIGZhY3RvcnkoZnVsbHBhdGgpOgogICAgICAgICAgICB5aWVsZCBkaXN0CgoKZGVmIGRpc3RfZmFjdG9yeShwYXRoX2l0ZW0sIGVudHJ5LCBvbmx5KToKICAgICIiIgogICAgUmV0dXJuIGEgZGlzdF9mYWN0b3J5IGZvciBhIHBhdGhfaXRlbSBhbmQgZW50cnkKICAgICIiIgogICAgbG93ZXIgPSBlbnRyeS5sb3dlcigpCiAgICBpc19tZXRhID0gYW55KG1hcChsb3dlci5lbmRzd2l0aCwgKCcuZWdnLWluZm8nLCAnLmRpc3QtaW5mbycpKSkKICAgIHJldHVybiAoCiAgICAgICAgZGlzdHJpYnV0aW9uc19mcm9tX21ldGFkYXRhCiAgICAgICAgaWYgaXNfbWV0YSBlbHNlCiAgICAgICAgZmluZF9kaXN0cmlidXRpb25zCiAgICAgICAgaWYgbm90IG9ubHkgYW5kIF9pc19lZ2dfcGF0aChlbnRyeSkgZWxzZQogICAgICAgIHJlc29sdmVfZWdnX2xpbmsKICAgICAgICBpZiBub3Qgb25seSBhbmQgbG93ZXIuZW5kc3dpdGgoJy5lZ2ctbGluaycpIGVsc2UKICAgICAgICBOb0Rpc3RzKCkKICAgICkKCgpjbGFzcyBOb0Rpc3RzOgogICAgIiIiCiAgICA+Pj4gYm9vbChOb0Rpc3RzKCkpCiAgICBGYWxzZQoKICAgID4+PiBsaXN0KE5vRGlzdHMoKSgnYW55dGhpbmcnKSkKICAgIFtdCiAgICAiIiIKICAgIGRlZiBfX2Jvb2xfXyhzZWxmKToKICAgICAgICByZXR1cm4gRmFsc2UKICAgIGlmIHNpeC5QWTI6CiAgICAgICAgX19ub256ZXJvX18gPSBfX2Jvb2xfXwoKICAgIGRlZiBfX2NhbGxfXyhzZWxmLCBmdWxscGF0aCk6CiAgICAgICAgcmV0dXJuIGl0ZXIoKCkpCgoKZGVmIHNhZmVfbGlzdGRpcihwYXRoKToKICAgICIiIgogICAgQXR0ZW1wdCB0byBsaXN0IGNvbnRlbnRzIG9mIHBhdGgsIGJ1dCBzdXBwcmVzcyBzb21lIGV4Y2VwdGlvbnMuCiAgICAiIiIKICAgIHRyeToKICAgICAgICByZXR1cm4gb3MubGlzdGRpcihwYXRoKQogICAgZXhjZXB0IChQZXJtaXNzaW9uRXJyb3IsIE5vdEFEaXJlY3RvcnlFcnJvcik6CiAgICAgICAgcGFzcwogICAgZXhjZXB0IE9TRXJyb3IgYXMgZToKICAgICAgICAjIElnbm9yZSB0aGUgZGlyZWN0b3J5IGlmIGRvZXMgbm90IGV4aXN0LCBub3QgYSBkaXJlY3Rvcnkgb3IKICAgICAgICAjIHBlcm1pc3Npb24gZGVuaWVkCiAgICAgICAgaWdub3JhYmxlID0gKAogICAgICAgICAgICBlLmVycm5vIGluIChlcnJuby5FTk9URElSLCBlcnJuby5FQUNDRVMsIGVycm5vLkVOT0VOVCkKICAgICAgICAgICAgIyBQeXRob24gMiBvbiBXaW5kb3dzIG5lZWRzIHRvIGJlIGhhbmRsZWQgdGhpcyB3YXkgOigKICAgICAgICAgICAgb3IgZ2V0YXR0cihlLCAid2luZXJyb3IiLCBOb25lKSA9PSAyNjcKICAgICAgICApCiAgICAgICAgaWYgbm90IGlnbm9yYWJsZToKICAgICAgICAgICAgcmFpc2UKICAgIHJldHVybiAoKQoKCmRlZiBkaXN0cmlidXRpb25zX2Zyb21fbWV0YWRhdGEocGF0aCk6CiAgICByb290ID0gb3MucGF0aC5kaXJuYW1lKHBhdGgpCiAgICBpZiBvcy5wYXRoLmlzZGlyKHBhdGgpOgogICAgICAgIGlmIGxlbihvcy5saXN0ZGlyKHBhdGgpKSA9PSAwOgogICAgICAgICAgICAjIGVtcHR5IG1ldGFkYXRhIGRpcjsgc2tpcAogICAgICAgICAgICByZXR1cm4KICAgICAgICBtZXRhZGF0YSA9IFBhdGhNZXRhZGF0YShyb290LCBwYXRoKQogICAgZWxzZToKICAgICAgICBtZXRhZGF0YSA9IEZpbGVNZXRhZGF0YShwYXRoKQogICAgZW50cnkgPSBvcy5wYXRoLmJhc2VuYW1lKHBhdGgpCiAgICB5aWVsZCBEaXN0cmlidXRpb24uZnJvbV9sb2NhdGlvbigKICAgICAgICByb290LCBlbnRyeSwgbWV0YWRhdGEsIHByZWNlZGVuY2U9REVWRUxPUF9ESVNULAogICAgKQoKCmRlZiBub25fZW1wdHlfbGluZXMocGF0aCk6CiAgICAiIiIKICAgIFlpZWxkIG5vbi1lbXB0eSBsaW5lcyBmcm9tIGZpbGUgYXQgcGF0aAogICAgIiIiCiAgICB3aXRoIG9wZW4ocGF0aCkgYXMgZjoKICAgICAgICBmb3IgbGluZSBpbiBmOgogICAgICAgICAgICBsaW5lID0gbGluZS5zdHJpcCgpCiAgICAgICAgICAgIGlmIGxpbmU6CiAgICAgICAgICAgICAgICB5aWVsZCBsaW5lCgoKZGVmIHJlc29sdmVfZWdnX2xpbmsocGF0aCk6CiAgICAiIiIKICAgIEdpdmVuIGEgcGF0aCB0byBhbiAuZWdnLWxpbmssIHJlc29sdmUgZGlzdHJpYnV0aW9ucwogICAgcHJlc2VudCBpbiB0aGUgcmVmZXJlbmNlZCBwYXRoLgogICAgIiIiCiAgICByZWZlcmVuY2VkX3BhdGhzID0gbm9uX2VtcHR5X2xpbmVzKHBhdGgpCiAgICByZXNvbHZlZF9wYXRocyA9ICgKICAgICAgICBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKHBhdGgpLCByZWYpCiAgICAgICAgZm9yIHJlZiBpbiByZWZlcmVuY2VkX3BhdGhzCiAgICApCiAgICBkaXN0X2dyb3VwcyA9IG1hcChmaW5kX2Rpc3RyaWJ1dGlvbnMsIHJlc29sdmVkX3BhdGhzKQogICAgcmV0dXJuIG5leHQoZGlzdF9ncm91cHMsICgpKQoKCnJlZ2lzdGVyX2ZpbmRlcihwa2d1dGlsLkltcEltcG9ydGVyLCBmaW5kX29uX3BhdGgpCgppZiBoYXNhdHRyKGltcG9ydGxpYl9tYWNoaW5lcnksICdGaWxlRmluZGVyJyk6CiAgICByZWdpc3Rlcl9maW5kZXIoaW1wb3J0bGliX21hY2hpbmVyeS5GaWxlRmluZGVyLCBmaW5kX29uX3BhdGgpCgpfZGVjbGFyZV9zdGF0ZSgnZGljdCcsIF9uYW1lc3BhY2VfaGFuZGxlcnM9e30pCl9kZWNsYXJlX3N0YXRlKCdkaWN0JywgX25hbWVzcGFjZV9wYWNrYWdlcz17fSkKCgpkZWYgcmVnaXN0ZXJfbmFtZXNwYWNlX2hhbmRsZXIoaW1wb3J0ZXJfdHlwZSwgbmFtZXNwYWNlX2hhbmRsZXIpOgogICAgIiIiUmVnaXN0ZXIgYG5hbWVzcGFjZV9oYW5kbGVyYCB0byBkZWNsYXJlIG5hbWVzcGFjZSBwYWNrYWdlcwoKICAgIGBpbXBvcnRlcl90eXBlYCBpcyB0aGUgdHlwZSBvciBjbGFzcyBvZiBhIFBFUCAzMDIgIkltcG9ydGVyIiAoc3lzLnBhdGggaXRlbQogICAgaGFuZGxlciksIGFuZCBgbmFtZXNwYWNlX2hhbmRsZXJgIGlzIGEgY2FsbGFibGUgbGlrZSB0aGlzOjoKCiAgICAgICAgZGVmIG5hbWVzcGFjZV9oYW5kbGVyKGltcG9ydGVyLCBwYXRoX2VudHJ5LCBtb2R1bGVOYW1lLCBtb2R1bGUpOgogICAgICAgICAgICAjIHJldHVybiBhIHBhdGhfZW50cnkgdG8gdXNlIGZvciBjaGlsZCBwYWNrYWdlcwoKICAgIE5hbWVzcGFjZSBoYW5kbGVycyBhcmUgb25seSBjYWxsZWQgaWYgdGhlIGltcG9ydGVyIG9iamVjdCBoYXMgYWxyZWFkeQogICAgYWdyZWVkIHRoYXQgaXQgY2FuIGhhbmRsZSB0aGUgcmVsZXZhbnQgcGF0aCBpdGVtLCBhbmQgdGhleSBzaG91bGQgb25seQogICAgcmV0dXJuIGEgc3VicGF0aCBpZiB0aGUgbW9kdWxlIF9fcGF0aF9fIGRvZXMgbm90IGFscmVhZHkgY29udGFpbiBhbgogICAgZXF1aXZhbGVudCBzdWJwYXRoLiAgRm9yIGFuIGV4YW1wbGUgbmFtZXNwYWNlIGhhbmRsZXIsIHNlZQogICAgYGBwa2dfcmVzb3VyY2VzLmZpbGVfbnNfaGFuZGxlcmBgLgogICAgIiIiCiAgICBfbmFtZXNwYWNlX2hhbmRsZXJzW2ltcG9ydGVyX3R5cGVdID0gbmFtZXNwYWNlX2hhbmRsZXIKCgpkZWYgX2hhbmRsZV9ucyhwYWNrYWdlTmFtZSwgcGF0aF9pdGVtKToKICAgICIiIkVuc3VyZSB0aGF0IG5hbWVkIHBhY2thZ2UgaW5jbHVkZXMgYSBzdWJwYXRoIG9mIHBhdGhfaXRlbSAoaWYgbmVlZGVkKSIiIgoKICAgIGltcG9ydGVyID0gZ2V0X2ltcG9ydGVyKHBhdGhfaXRlbSkKICAgIGlmIGltcG9ydGVyIGlzIE5vbmU6CiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAjIGNhcHR1cmUgd2FybmluZ3MgZHVlIHRvICMxMTExCiAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6CiAgICAgICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCJpZ25vcmUiKQogICAgICAgIGxvYWRlciA9IGltcG9ydGVyLmZpbmRfbW9kdWxlKHBhY2thZ2VOYW1lKQoKICAgIGlmIGxvYWRlciBpcyBOb25lOgogICAgICAgIHJldHVybiBOb25lCiAgICBtb2R1bGUgPSBzeXMubW9kdWxlcy5nZXQocGFja2FnZU5hbWUpCiAgICBpZiBtb2R1bGUgaXMgTm9uZToKICAgICAgICBtb2R1bGUgPSBzeXMubW9kdWxlc1twYWNrYWdlTmFtZV0gPSB0eXBlcy5Nb2R1bGVUeXBlKHBhY2thZ2VOYW1lKQogICAgICAgIG1vZHVsZS5fX3BhdGhfXyA9IFtdCiAgICAgICAgX3NldF9wYXJlbnRfbnMocGFja2FnZU5hbWUpCiAgICBlbGlmIG5vdCBoYXNhdHRyKG1vZHVsZSwgJ19fcGF0aF9fJyk6CiAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJOb3QgYSBwYWNrYWdlOiIsIHBhY2thZ2VOYW1lKQogICAgaGFuZGxlciA9IF9maW5kX2FkYXB0ZXIoX25hbWVzcGFjZV9oYW5kbGVycywgaW1wb3J0ZXIpCiAgICBzdWJwYXRoID0gaGFuZGxlcihpbXBvcnRlciwgcGF0aF9pdGVtLCBwYWNrYWdlTmFtZSwgbW9kdWxlKQogICAgaWYgc3VicGF0aCBpcyBub3QgTm9uZToKICAgICAgICBwYXRoID0gbW9kdWxlLl9fcGF0aF9fCiAgICAgICAgcGF0aC5hcHBlbmQoc3VicGF0aCkKICAgICAgICBsb2FkZXIubG9hZF9tb2R1bGUocGFja2FnZU5hbWUpCiAgICAgICAgX3JlYnVpbGRfbW9kX3BhdGgocGF0aCwgcGFja2FnZU5hbWUsIG1vZHVsZSkKICAgIHJldHVybiBzdWJwYXRoCgoKZGVmIF9yZWJ1aWxkX21vZF9wYXRoKG9yaWdfcGF0aCwgcGFja2FnZV9uYW1lLCBtb2R1bGUpOgogICAgIiIiCiAgICBSZWJ1aWxkIG1vZHVsZS5fX3BhdGhfXyBlbnN1cmluZyB0aGF0IGFsbCBlbnRyaWVzIGFyZSBvcmRlcmVkCiAgICBjb3JyZXNwb25kaW5nIHRvIHRoZWlyIHN5cy5wYXRoIG9yZGVyCiAgICAiIiIKICAgIHN5c19wYXRoID0gW19ub3JtYWxpemVfY2FjaGVkKHApIGZvciBwIGluIHN5cy5wYXRoXQoKICAgIGRlZiBzYWZlX3N5c19wYXRoX2luZGV4KGVudHJ5KToKICAgICAgICAiIiIKICAgICAgICBXb3JrYXJvdW5kIGZvciAjNTIwIGFuZCAjNTEzLgogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHN5c19wYXRoLmluZGV4KGVudHJ5KQogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICByZXR1cm4gZmxvYXQoJ2luZicpCgogICAgZGVmIHBvc2l0aW9uX2luX3N5c19wYXRoKHBhdGgpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiB0aGUgb3JkaW5hbCBvZiB0aGUgcGF0aCBiYXNlZCBvbiBpdHMgcG9zaXRpb24gaW4gc3lzLnBhdGgKICAgICAgICAiIiIKICAgICAgICBwYXRoX3BhcnRzID0gcGF0aC5zcGxpdChvcy5zZXApCiAgICAgICAgbW9kdWxlX3BhcnRzID0gcGFja2FnZV9uYW1lLmNvdW50KCcuJykgKyAxCiAgICAgICAgcGFydHMgPSBwYXRoX3BhcnRzWzotbW9kdWxlX3BhcnRzXQogICAgICAgIHJldHVybiBzYWZlX3N5c19wYXRoX2luZGV4KF9ub3JtYWxpemVfY2FjaGVkKG9zLnNlcC5qb2luKHBhcnRzKSkpCgogICAgbmV3X3BhdGggPSBzb3J0ZWQob3JpZ19wYXRoLCBrZXk9cG9zaXRpb25faW5fc3lzX3BhdGgpCiAgICBuZXdfcGF0aCA9IFtfbm9ybWFsaXplX2NhY2hlZChwKSBmb3IgcCBpbiBuZXdfcGF0aF0KCiAgICBpZiBpc2luc3RhbmNlKG1vZHVsZS5fX3BhdGhfXywgbGlzdCk6CiAgICAgICAgbW9kdWxlLl9fcGF0aF9fWzpdID0gbmV3X3BhdGgKICAgIGVsc2U6CiAgICAgICAgbW9kdWxlLl9fcGF0aF9fID0gbmV3X3BhdGgKCgpkZWYgZGVjbGFyZV9uYW1lc3BhY2UocGFja2FnZU5hbWUpOgogICAgIiIiRGVjbGFyZSB0aGF0IHBhY2thZ2UgJ3BhY2thZ2VOYW1lJyBpcyBhIG5hbWVzcGFjZSBwYWNrYWdlIiIiCgogICAgX2ltcC5hY3F1aXJlX2xvY2soKQogICAgdHJ5OgogICAgICAgIGlmIHBhY2thZ2VOYW1lIGluIF9uYW1lc3BhY2VfcGFja2FnZXM6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBwYXRoID0gc3lzLnBhdGgKICAgICAgICBwYXJlbnQsIF8sIF8gPSBwYWNrYWdlTmFtZS5ycGFydGl0aW9uKCcuJykKCiAgICAgICAgaWYgcGFyZW50OgogICAgICAgICAgICBkZWNsYXJlX25hbWVzcGFjZShwYXJlbnQpCiAgICAgICAgICAgIGlmIHBhcmVudCBub3QgaW4gX25hbWVzcGFjZV9wYWNrYWdlczoKICAgICAgICAgICAgICAgIF9faW1wb3J0X18ocGFyZW50KQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBwYXRoID0gc3lzLm1vZHVsZXNbcGFyZW50XS5fX3BhdGhfXwogICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIk5vdCBhIHBhY2thZ2U6IiwgcGFyZW50KQoKICAgICAgICAjIFRyYWNrIHdoYXQgcGFja2FnZXMgYXJlIG5hbWVzcGFjZXMsIHNvIHdoZW4gbmV3IHBhdGggaXRlbXMgYXJlIGFkZGVkLAogICAgICAgICMgdGhleSBjYW4gYmUgdXBkYXRlZAogICAgICAgIF9uYW1lc3BhY2VfcGFja2FnZXMuc2V0ZGVmYXVsdChwYXJlbnQgb3IgTm9uZSwgW10pLmFwcGVuZChwYWNrYWdlTmFtZSkKICAgICAgICBfbmFtZXNwYWNlX3BhY2thZ2VzLnNldGRlZmF1bHQocGFja2FnZU5hbWUsIFtdKQoKICAgICAgICBmb3IgcGF0aF9pdGVtIGluIHBhdGg6CiAgICAgICAgICAgICMgRW5zdXJlIGFsbCB0aGUgcGFyZW50J3MgcGF0aCBpdGVtcyBhcmUgcmVmbGVjdGVkIGluIHRoZSBjaGlsZCwKICAgICAgICAgICAgIyBpZiB0aGV5IGFwcGx5CiAgICAgICAgICAgIF9oYW5kbGVfbnMocGFja2FnZU5hbWUsIHBhdGhfaXRlbSkKCiAgICBmaW5hbGx5OgogICAgICAgIF9pbXAucmVsZWFzZV9sb2NrKCkKCgpkZWYgZml4dXBfbmFtZXNwYWNlX3BhY2thZ2VzKHBhdGhfaXRlbSwgcGFyZW50PU5vbmUpOgogICAgIiIiRW5zdXJlIHRoYXQgcHJldmlvdXNseS1kZWNsYXJlZCBuYW1lc3BhY2UgcGFja2FnZXMgaW5jbHVkZSBwYXRoX2l0ZW0iIiIKICAgIF9pbXAuYWNxdWlyZV9sb2NrKCkKICAgIHRyeToKICAgICAgICBmb3IgcGFja2FnZSBpbiBfbmFtZXNwYWNlX3BhY2thZ2VzLmdldChwYXJlbnQsICgpKToKICAgICAgICAgICAgc3VicGF0aCA9IF9oYW5kbGVfbnMocGFja2FnZSwgcGF0aF9pdGVtKQogICAgICAgICAgICBpZiBzdWJwYXRoOgogICAgICAgICAgICAgICAgZml4dXBfbmFtZXNwYWNlX3BhY2thZ2VzKHN1YnBhdGgsIHBhY2thZ2UpCiAgICBmaW5hbGx5OgogICAgICAgIF9pbXAucmVsZWFzZV9sb2NrKCkKCgpkZWYgZmlsZV9uc19oYW5kbGVyKGltcG9ydGVyLCBwYXRoX2l0ZW0sIHBhY2thZ2VOYW1lLCBtb2R1bGUpOgogICAgIiIiQ29tcHV0ZSBhbiBucy1wYWNrYWdlIHN1YnBhdGggZm9yIGEgZmlsZXN5c3RlbSBvciB6aXBmaWxlIGltcG9ydGVyIiIiCgogICAgc3VicGF0aCA9IG9zLnBhdGguam9pbihwYXRoX2l0ZW0sIHBhY2thZ2VOYW1lLnNwbGl0KCcuJylbLTFdKQogICAgbm9ybWFsaXplZCA9IF9ub3JtYWxpemVfY2FjaGVkKHN1YnBhdGgpCiAgICBmb3IgaXRlbSBpbiBtb2R1bGUuX19wYXRoX186CiAgICAgICAgaWYgX25vcm1hbGl6ZV9jYWNoZWQoaXRlbSkgPT0gbm9ybWFsaXplZDoKICAgICAgICAgICAgYnJlYWsKICAgIGVsc2U6CiAgICAgICAgIyBPbmx5IHJldHVybiB0aGUgcGF0aCBpZiBpdCdzIG5vdCBhbHJlYWR5IHRoZXJlCiAgICAgICAgcmV0dXJuIHN1YnBhdGgKCgpyZWdpc3Rlcl9uYW1lc3BhY2VfaGFuZGxlcihwa2d1dGlsLkltcEltcG9ydGVyLCBmaWxlX25zX2hhbmRsZXIpCnJlZ2lzdGVyX25hbWVzcGFjZV9oYW5kbGVyKHppcGltcG9ydC56aXBpbXBvcnRlciwgZmlsZV9uc19oYW5kbGVyKQoKaWYgaGFzYXR0cihpbXBvcnRsaWJfbWFjaGluZXJ5LCAnRmlsZUZpbmRlcicpOgogICAgcmVnaXN0ZXJfbmFtZXNwYWNlX2hhbmRsZXIoaW1wb3J0bGliX21hY2hpbmVyeS5GaWxlRmluZGVyLCBmaWxlX25zX2hhbmRsZXIpCgoKZGVmIG51bGxfbnNfaGFuZGxlcihpbXBvcnRlciwgcGF0aF9pdGVtLCBwYWNrYWdlTmFtZSwgbW9kdWxlKToKICAgIHJldHVybiBOb25lCgoKcmVnaXN0ZXJfbmFtZXNwYWNlX2hhbmRsZXIob2JqZWN0LCBudWxsX25zX2hhbmRsZXIpCgoKZGVmIG5vcm1hbGl6ZV9wYXRoKGZpbGVuYW1lKToKICAgICIiIk5vcm1hbGl6ZSBhIGZpbGUvZGlyIG5hbWUgZm9yIGNvbXBhcmlzb24gcHVycG9zZXMiIiIKICAgIHJldHVybiBvcy5wYXRoLm5vcm1jYXNlKG9zLnBhdGgucmVhbHBhdGgob3MucGF0aC5ub3JtcGF0aChfY3lnd2luX3BhdGNoKGZpbGVuYW1lKSkpKQoKCmRlZiBfY3lnd2luX3BhdGNoKGZpbGVuYW1lKTogICMgcHJhZ21hOiBub2NvdmVyCiAgICAiIiIKICAgIENvbnRyYXJ5IHRvIFBPU0lYIDIwMDgsIG9uIEN5Z3dpbiwgZ2V0Y3dkICgzKSBjb250YWlucwogICAgc3ltbGluayBjb21wb25lbnRzLiBVc2luZwogICAgb3MucGF0aC5hYnNwYXRoKCkgd29ya3MgYXJvdW5kIHRoaXMgbGltaXRhdGlvbi4gQSBmaXggaW4gb3MuZ2V0Y3dkKCkKICAgIHdvdWxkIHByb2JhYmx5IGJldHRlciwgaW4gQ3lnd2luIGV2ZW4gbW9yZSBzbywgZXhjZXB0CiAgICB0aGF0IHRoaXMgc2VlbXMgdG8gYmUgYnkgZGVzaWduLi4uCiAgICAiIiIKICAgIHJldHVybiBvcy5wYXRoLmFic3BhdGgoZmlsZW5hbWUpIGlmIHN5cy5wbGF0Zm9ybSA9PSAnY3lnd2luJyBlbHNlIGZpbGVuYW1lCgoKZGVmIF9ub3JtYWxpemVfY2FjaGVkKGZpbGVuYW1lLCBfY2FjaGU9e30pOgogICAgdHJ5OgogICAgICAgIHJldHVybiBfY2FjaGVbZmlsZW5hbWVdCiAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgX2NhY2hlW2ZpbGVuYW1lXSA9IHJlc3VsdCA9IG5vcm1hbGl6ZV9wYXRoKGZpbGVuYW1lKQogICAgICAgIHJldHVybiByZXN1bHQKCgpkZWYgX2lzX2VnZ19wYXRoKHBhdGgpOgogICAgIiIiCiAgICBEZXRlcm1pbmUgaWYgZ2l2ZW4gcGF0aCBhcHBlYXJzIHRvIGJlIGFuIGVnZy4KICAgICIiIgogICAgcmV0dXJuIHBhdGgubG93ZXIoKS5lbmRzd2l0aCgnLmVnZycpCgoKZGVmIF9pc191bnBhY2tlZF9lZ2cocGF0aCk6CiAgICAiIiIKICAgIERldGVybWluZSBpZiBnaXZlbiBwYXRoIGFwcGVhcnMgdG8gYmUgYW4gdW5wYWNrZWQgZWdnLgogICAgIiIiCiAgICByZXR1cm4gKAogICAgICAgIF9pc19lZ2dfcGF0aChwYXRoKSBhbmQKICAgICAgICBvcy5wYXRoLmlzZmlsZShvcy5wYXRoLmpvaW4ocGF0aCwgJ0VHRy1JTkZPJywgJ1BLRy1JTkZPJykpCiAgICApCgoKZGVmIF9zZXRfcGFyZW50X25zKHBhY2thZ2VOYW1lKToKICAgIHBhcnRzID0gcGFja2FnZU5hbWUuc3BsaXQoJy4nKQogICAgbmFtZSA9IHBhcnRzLnBvcCgpCiAgICBpZiBwYXJ0czoKICAgICAgICBwYXJlbnQgPSAnLicuam9pbihwYXJ0cykKICAgICAgICBzZXRhdHRyKHN5cy5tb2R1bGVzW3BhcmVudF0sIG5hbWUsIHN5cy5tb2R1bGVzW3BhY2thZ2VOYW1lXSkKCgpkZWYgeWllbGRfbGluZXMoc3Rycyk6CiAgICAiIiJZaWVsZCBub24tZW1wdHkvbm9uLWNvbW1lbnQgbGluZXMgb2YgYSBzdHJpbmcgb3Igc2VxdWVuY2UiIiIKICAgIGlmIGlzaW5zdGFuY2Uoc3Rycywgc2l4LnN0cmluZ190eXBlcyk6CiAgICAgICAgZm9yIHMgaW4gc3Rycy5zcGxpdGxpbmVzKCk6CiAgICAgICAgICAgIHMgPSBzLnN0cmlwKCkKICAgICAgICAgICAgIyBza2lwIGJsYW5rIGxpbmVzL2NvbW1lbnRzCiAgICAgICAgICAgIGlmIHMgYW5kIG5vdCBzLnN0YXJ0c3dpdGgoJyMnKToKICAgICAgICAgICAgICAgIHlpZWxkIHMKICAgIGVsc2U6CiAgICAgICAgZm9yIHNzIGluIHN0cnM6CiAgICAgICAgICAgIGZvciBzIGluIHlpZWxkX2xpbmVzKHNzKToKICAgICAgICAgICAgICAgIHlpZWxkIHMKCgpNT0RVTEUgPSByZS5jb21waWxlKHIiXHcrKFwuXHcrKSokIikubWF0Y2gKRUdHX05BTUUgPSByZS5jb21waWxlKAogICAgciIiIgogICAgKD9QPG5hbWU+W14tXSspICgKICAgICAgICAtKD9QPHZlcj5bXi1dKykgKAogICAgICAgICAgICAtcHkoP1A8cHl2ZXI+W14tXSspICgKICAgICAgICAgICAgICAgIC0oP1A8cGxhdD4uKykKICAgICAgICAgICAgKT8KICAgICAgICApPwogICAgKT8KICAgICIiIiwKICAgIHJlLlZFUkJPU0UgfCByZS5JR05PUkVDQVNFLAopLm1hdGNoCgoKY2xhc3MgRW50cnlQb2ludDoKICAgICIiIk9iamVjdCByZXByZXNlbnRpbmcgYW4gYWR2ZXJ0aXNlZCBpbXBvcnRhYmxlIG9iamVjdCIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBtb2R1bGVfbmFtZSwgYXR0cnM9KCksIGV4dHJhcz0oKSwgZGlzdD1Ob25lKToKICAgICAgICBpZiBub3QgTU9EVUxFKG1vZHVsZV9uYW1lKToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSW52YWxpZCBtb2R1bGUgbmFtZSIsIG1vZHVsZV9uYW1lKQogICAgICAgIHNlbGYubmFtZSA9IG5hbWUKICAgICAgICBzZWxmLm1vZHVsZV9uYW1lID0gbW9kdWxlX25hbWUKICAgICAgICBzZWxmLmF0dHJzID0gdHVwbGUoYXR0cnMpCiAgICAgICAgc2VsZi5leHRyYXMgPSB0dXBsZShleHRyYXMpCiAgICAgICAgc2VsZi5kaXN0ID0gZGlzdAoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHMgPSAiJXMgPSAlcyIgJSAoc2VsZi5uYW1lLCBzZWxmLm1vZHVsZV9uYW1lKQogICAgICAgIGlmIHNlbGYuYXR0cnM6CiAgICAgICAgICAgIHMgKz0gJzonICsgJy4nLmpvaW4oc2VsZi5hdHRycykKICAgICAgICBpZiBzZWxmLmV4dHJhczoKICAgICAgICAgICAgcyArPSAnIFslc10nICUgJywnLmpvaW4oc2VsZi5leHRyYXMpCiAgICAgICAgcmV0dXJuIHMKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICJFbnRyeVBvaW50LnBhcnNlKCVyKSIgJSBzdHIoc2VsZikKCiAgICBkZWYgbG9hZChzZWxmLCByZXF1aXJlPVRydWUsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgIiIiCiAgICAgICAgUmVxdWlyZSBwYWNrYWdlcyBmb3IgdGhpcyBFbnRyeVBvaW50LCB0aGVuIHJlc29sdmUgaXQuCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IHJlcXVpcmUgb3IgYXJncyBvciBrd2FyZ3M6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICAgICAiUGFyYW1ldGVycyB0byBsb2FkIGFyZSBkZXByZWNhdGVkLiAgQ2FsbCAucmVzb2x2ZSBhbmQgIgogICAgICAgICAgICAgICAgIi5yZXF1aXJlIHNlcGFyYXRlbHkuIiwKICAgICAgICAgICAgICAgIFBrZ1Jlc291cmNlc0RlcHJlY2F0aW9uV2FybmluZywKICAgICAgICAgICAgICAgIHN0YWNrbGV2ZWw9MiwKICAgICAgICAgICAgKQogICAgICAgIGlmIHJlcXVpcmU6CiAgICAgICAgICAgIHNlbGYucmVxdWlyZSgqYXJncywgKiprd2FyZ3MpCiAgICAgICAgcmV0dXJuIHNlbGYucmVzb2x2ZSgpCgogICAgZGVmIHJlc29sdmUoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmVzb2x2ZSB0aGUgZW50cnkgcG9pbnQgZnJvbSBpdHMgbW9kdWxlIGFuZCBhdHRycy4KICAgICAgICAiIiIKICAgICAgICBtb2R1bGUgPSBfX2ltcG9ydF9fKHNlbGYubW9kdWxlX25hbWUsIGZyb21saXN0PVsnX19uYW1lX18nXSwgbGV2ZWw9MCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBmdW5jdG9vbHMucmVkdWNlKGdldGF0dHIsIHNlbGYuYXR0cnMsIG1vZHVsZSkKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3IgYXMgZXhjOgogICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvcihzdHIoZXhjKSkKCiAgICBkZWYgcmVxdWlyZShzZWxmLCBlbnY9Tm9uZSwgaW5zdGFsbGVyPU5vbmUpOgogICAgICAgIGlmIHNlbGYuZXh0cmFzIGFuZCBub3Qgc2VsZi5kaXN0OgogICAgICAgICAgICByYWlzZSBVbmtub3duRXh0cmEoIkNhbid0IHJlcXVpcmUoKSB3aXRob3V0IGEgZGlzdHJpYnV0aW9uIiwgc2VsZikKCiAgICAgICAgIyBHZXQgdGhlIHJlcXVpcmVtZW50cyBmb3IgdGhpcyBlbnRyeSBwb2ludCB3aXRoIGFsbCBpdHMgZXh0cmFzIGFuZAogICAgICAgICMgdGhlbiByZXNvbHZlIHRoZW0uIFdlIGhhdmUgdG8gcGFzcyBgZXh0cmFzYCBhbG9uZyB3aGVuIHJlc29sdmluZyBzbwogICAgICAgICMgdGhhdCB0aGUgd29ya2luZyBzZXQga25vd3Mgd2hhdCBleHRyYXMgd2Ugd2FudC4gT3RoZXJ3aXNlLCBmb3IKICAgICAgICAjIGRpc3QtaW5mbyBkaXN0cmlidXRpb25zLCB0aGUgd29ya2luZyBzZXQgd2lsbCBhc3N1bWUgdGhhdCB0aGUKICAgICAgICAjIHJlcXVpcmVtZW50cyBmb3IgdGhhdCBleHRyYSBhcmUgcHVyZWx5IG9wdGlvbmFsIGFuZCBza2lwIG92ZXIgdGhlbS4KICAgICAgICByZXFzID0gc2VsZi5kaXN0LnJlcXVpcmVzKHNlbGYuZXh0cmFzKQogICAgICAgIGl0ZW1zID0gd29ya2luZ19zZXQucmVzb2x2ZShyZXFzLCBlbnYsIGluc3RhbGxlciwgZXh0cmFzPXNlbGYuZXh0cmFzKQogICAgICAgIGxpc3QobWFwKHdvcmtpbmdfc2V0LmFkZCwgaXRlbXMpKQoKICAgIHBhdHRlcm4gPSByZS5jb21waWxlKAogICAgICAgIHInXHMqJwogICAgICAgIHInKD9QPG5hbWU+Lis/KVxzKicKICAgICAgICByJz1ccyonCiAgICAgICAgcicoP1A8bW9kdWxlPltcdy5dKylccyonCiAgICAgICAgcicoOlxzKig/UDxhdHRyPltcdy5dKykpP1xzKicKICAgICAgICByJyg/UDxleHRyYXM+XFsuKlxdKT9ccyokJwogICAgKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIHBhcnNlKGNscywgc3JjLCBkaXN0PU5vbmUpOgogICAgICAgICIiIlBhcnNlIGEgc2luZ2xlIGVudHJ5IHBvaW50IGZyb20gc3RyaW5nIGBzcmNgCgogICAgICAgIEVudHJ5IHBvaW50IHN5bnRheCBmb2xsb3dzIHRoZSBmb3JtOjoKCiAgICAgICAgICAgIG5hbWUgPSBzb21lLm1vZHVsZTpzb21lLmF0dHIgW2V4dHJhMSwgZXh0cmEyXQoKICAgICAgICBUaGUgZW50cnkgbmFtZSBhbmQgbW9kdWxlIG5hbWUgYXJlIHJlcXVpcmVkLCBidXQgdGhlIGBgOmF0dHJzYGAgYW5kCiAgICAgICAgYGBbZXh0cmFzXWBgIHBhcnRzIGFyZSBvcHRpb25hbAogICAgICAgICIiIgogICAgICAgIG0gPSBjbHMucGF0dGVybi5tYXRjaChzcmMpCiAgICAgICAgaWYgbm90IG06CiAgICAgICAgICAgIG1zZyA9ICJFbnRyeVBvaW50IG11c3QgYmUgaW4gJ25hbWU9bW9kdWxlOmF0dHJzIFtleHRyYXNdJyBmb3JtYXQiCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IobXNnLCBzcmMpCiAgICAgICAgcmVzID0gbS5ncm91cGRpY3QoKQogICAgICAgIGV4dHJhcyA9IGNscy5fcGFyc2VfZXh0cmFzKHJlc1snZXh0cmFzJ10pCiAgICAgICAgYXR0cnMgPSByZXNbJ2F0dHInXS5zcGxpdCgnLicpIGlmIHJlc1snYXR0ciddIGVsc2UgKCkKICAgICAgICByZXR1cm4gY2xzKHJlc1snbmFtZSddLCByZXNbJ21vZHVsZSddLCBhdHRycywgZXh0cmFzLCBkaXN0KQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9wYXJzZV9leHRyYXMoY2xzLCBleHRyYXNfc3BlYyk6CiAgICAgICAgaWYgbm90IGV4dHJhc19zcGVjOgogICAgICAgICAgICByZXR1cm4gKCkKICAgICAgICByZXEgPSBSZXF1aXJlbWVudC5wYXJzZSgneCcgKyBleHRyYXNfc3BlYykKICAgICAgICBpZiByZXEuc3BlY3M6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoKQogICAgICAgIHJldHVybiByZXEuZXh0cmFzCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgcGFyc2VfZ3JvdXAoY2xzLCBncm91cCwgbGluZXMsIGRpc3Q9Tm9uZSk6CiAgICAgICAgIiIiUGFyc2UgYW4gZW50cnkgcG9pbnQgZ3JvdXAiIiIKICAgICAgICBpZiBub3QgTU9EVUxFKGdyb3VwKToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSW52YWxpZCBncm91cCBuYW1lIiwgZ3JvdXApCiAgICAgICAgdGhpcyA9IHt9CiAgICAgICAgZm9yIGxpbmUgaW4geWllbGRfbGluZXMobGluZXMpOgogICAgICAgICAgICBlcCA9IGNscy5wYXJzZShsaW5lLCBkaXN0KQogICAgICAgICAgICBpZiBlcC5uYW1lIGluIHRoaXM6CiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJEdXBsaWNhdGUgZW50cnkgcG9pbnQiLCBncm91cCwgZXAubmFtZSkKICAgICAgICAgICAgdGhpc1tlcC5uYW1lXSA9IGVwCiAgICAgICAgcmV0dXJuIHRoaXMKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBwYXJzZV9tYXAoY2xzLCBkYXRhLCBkaXN0PU5vbmUpOgogICAgICAgICIiIlBhcnNlIGEgbWFwIG9mIGVudHJ5IHBvaW50IGdyb3VwcyIiIgogICAgICAgIGlmIGlzaW5zdGFuY2UoZGF0YSwgZGljdCk6CiAgICAgICAgICAgIGRhdGEgPSBkYXRhLml0ZW1zKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBkYXRhID0gc3BsaXRfc2VjdGlvbnMoZGF0YSkKICAgICAgICBtYXBzID0ge30KICAgICAgICBmb3IgZ3JvdXAsIGxpbmVzIGluIGRhdGE6CiAgICAgICAgICAgIGlmIGdyb3VwIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBpZiBub3QgbGluZXM6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkVudHJ5IHBvaW50cyBtdXN0IGJlIGxpc3RlZCBpbiBncm91cHMiKQogICAgICAgICAgICBncm91cCA9IGdyb3VwLnN0cmlwKCkKICAgICAgICAgICAgaWYgZ3JvdXAgaW4gbWFwczoKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkR1cGxpY2F0ZSBncm91cCBuYW1lIiwgZ3JvdXApCiAgICAgICAgICAgIG1hcHNbZ3JvdXBdID0gY2xzLnBhcnNlX2dyb3VwKGdyb3VwLCBsaW5lcywgZGlzdCkKICAgICAgICByZXR1cm4gbWFwcwoKCmRlZiBfcmVtb3ZlX21kNV9mcmFnbWVudChsb2NhdGlvbik6CiAgICBpZiBub3QgbG9jYXRpb246CiAgICAgICAgcmV0dXJuICcnCiAgICBwYXJzZWQgPSB1cmxsaWIucGFyc2UudXJscGFyc2UobG9jYXRpb24pCiAgICBpZiBwYXJzZWRbLTFdLnN0YXJ0c3dpdGgoJ21kNT0nKToKICAgICAgICByZXR1cm4gdXJsbGliLnBhcnNlLnVybHVucGFyc2UocGFyc2VkWzotMV0gKyAoJycsKSkKICAgIHJldHVybiBsb2NhdGlvbgoKCmRlZiBfdmVyc2lvbl9mcm9tX2ZpbGUobGluZXMpOgogICAgIiIiCiAgICBHaXZlbiBhbiBpdGVyYWJsZSBvZiBsaW5lcyBmcm9tIGEgTWV0YWRhdGEgZmlsZSwgcmV0dXJuCiAgICB0aGUgdmFsdWUgb2YgdGhlIFZlcnNpb24gZmllbGQsIGlmIHByZXNlbnQsIG9yIE5vbmUgb3RoZXJ3aXNlLgogICAgIiIiCiAgICBkZWYgaXNfdmVyc2lvbl9saW5lKGxpbmUpOgogICAgICAgIHJldHVybiBsaW5lLmxvd2VyKCkuc3RhcnRzd2l0aCgndmVyc2lvbjonKQogICAgdmVyc2lvbl9saW5lcyA9IGZpbHRlcihpc192ZXJzaW9uX2xpbmUsIGxpbmVzKQogICAgbGluZSA9IG5leHQoaXRlcih2ZXJzaW9uX2xpbmVzKSwgJycpCiAgICBfLCBfLCB2YWx1ZSA9IGxpbmUucGFydGl0aW9uKCc6JykKICAgIHJldHVybiBzYWZlX3ZlcnNpb24odmFsdWUuc3RyaXAoKSkgb3IgTm9uZQoKCmNsYXNzIERpc3RyaWJ1dGlvbjoKICAgICIiIldyYXAgYW4gYWN0dWFsIG9yIHBvdGVudGlhbCBzeXMucGF0aCBlbnRyeSB3L21ldGFkYXRhIiIiCiAgICBQS0dfSU5GTyA9ICdQS0ctSU5GTycKCiAgICBkZWYgX19pbml0X18oCiAgICAgICAgICAgIHNlbGYsIGxvY2F0aW9uPU5vbmUsIG1ldGFkYXRhPU5vbmUsIHByb2plY3RfbmFtZT1Ob25lLAogICAgICAgICAgICB2ZXJzaW9uPU5vbmUsIHB5X3ZlcnNpb249UFlfTUFKT1IsIHBsYXRmb3JtPU5vbmUsCiAgICAgICAgICAgIHByZWNlZGVuY2U9RUdHX0RJU1QpOgogICAgICAgIHNlbGYucHJvamVjdF9uYW1lID0gc2FmZV9uYW1lKHByb2plY3RfbmFtZSBvciAnVW5rbm93bicpCiAgICAgICAgaWYgdmVyc2lvbiBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5fdmVyc2lvbiA9IHNhZmVfdmVyc2lvbih2ZXJzaW9uKQogICAgICAgIHNlbGYucHlfdmVyc2lvbiA9IHB5X3ZlcnNpb24KICAgICAgICBzZWxmLnBsYXRmb3JtID0gcGxhdGZvcm0KICAgICAgICBzZWxmLmxvY2F0aW9uID0gbG9jYXRpb24KICAgICAgICBzZWxmLnByZWNlZGVuY2UgPSBwcmVjZWRlbmNlCiAgICAgICAgc2VsZi5fcHJvdmlkZXIgPSBtZXRhZGF0YSBvciBlbXB0eV9wcm92aWRlcgoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGZyb21fbG9jYXRpb24oY2xzLCBsb2NhdGlvbiwgYmFzZW5hbWUsIG1ldGFkYXRhPU5vbmUsICoqa3cpOgogICAgICAgIHByb2plY3RfbmFtZSwgdmVyc2lvbiwgcHlfdmVyc2lvbiwgcGxhdGZvcm0gPSBbTm9uZV0gKiA0CiAgICAgICAgYmFzZW5hbWUsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQoYmFzZW5hbWUpCiAgICAgICAgaWYgZXh0Lmxvd2VyKCkgaW4gX2Rpc3RyaWJ1dGlvbkltcGw6CiAgICAgICAgICAgIGNscyA9IF9kaXN0cmlidXRpb25JbXBsW2V4dC5sb3dlcigpXQoKICAgICAgICAgICAgbWF0Y2ggPSBFR0dfTkFNRShiYXNlbmFtZSkKICAgICAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgICAgICBwcm9qZWN0X25hbWUsIHZlcnNpb24sIHB5X3ZlcnNpb24sIHBsYXRmb3JtID0gbWF0Y2guZ3JvdXAoCiAgICAgICAgICAgICAgICAgICAgJ25hbWUnLCAndmVyJywgJ3B5dmVyJywgJ3BsYXQnCiAgICAgICAgICAgICAgICApCiAgICAgICAgcmV0dXJuIGNscygKICAgICAgICAgICAgbG9jYXRpb24sIG1ldGFkYXRhLCBwcm9qZWN0X25hbWU9cHJvamVjdF9uYW1lLCB2ZXJzaW9uPXZlcnNpb24sCiAgICAgICAgICAgIHB5X3ZlcnNpb249cHlfdmVyc2lvbiwgcGxhdGZvcm09cGxhdGZvcm0sICoqa3cKICAgICAgICApLl9yZWxvYWRfdmVyc2lvbigpCgogICAgZGVmIF9yZWxvYWRfdmVyc2lvbihzZWxmKToKICAgICAgICByZXR1cm4gc2VsZgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGhhc2hjbXAoc2VsZik6CiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgc2VsZi5wYXJzZWRfdmVyc2lvbiwKICAgICAgICAgICAgc2VsZi5wcmVjZWRlbmNlLAogICAgICAgICAgICBzZWxmLmtleSwKICAgICAgICAgICAgX3JlbW92ZV9tZDVfZnJhZ21lbnQoc2VsZi5sb2NhdGlvbiksCiAgICAgICAgICAgIHNlbGYucHlfdmVyc2lvbiBvciAnJywKICAgICAgICAgICAgc2VsZi5wbGF0Zm9ybSBvciAnJywKICAgICAgICApCgogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgIHJldHVybiBoYXNoKHNlbGYuaGFzaGNtcCkKCiAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5oYXNoY21wIDwgb3RoZXIuaGFzaGNtcAoKICAgIGRlZiBfX2xlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLmhhc2hjbXAgPD0gb3RoZXIuaGFzaGNtcAoKICAgIGRlZiBfX2d0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLmhhc2hjbXAgPiBvdGhlci5oYXNoY21wCgogICAgZGVmIF9fZ2VfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuaGFzaGNtcCA+PSBvdGhlci5oYXNoY21wCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKToKICAgICAgICAgICAgIyBJdCdzIG5vdCBhIERpc3RyaWJ1dGlvbiwgc28gdGhleSBhcmUgbm90IGVxdWFsCiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIHJldHVybiBzZWxmLmhhc2hjbXAgPT0gb3RoZXIuaGFzaGNtcAoKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBub3Qgc2VsZiA9PSBvdGhlcgoKICAgICMgVGhlc2UgcHJvcGVydGllcyBoYXZlIHRvIGJlIGxhenkgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGxvYWQgYW55CiAgICAjIG1ldGFkYXRhIHVudGlsL3VubGVzcyBpdCdzIGFjdHVhbGx5IG5lZWRlZC4gIChpLmUuLCBzb21lIGRpc3RyaWJ1dGlvbnMKICAgICMgbWF5IG5vdCBrbm93IHRoZWlyIG5hbWUgb3IgdmVyc2lvbiB3aXRob3V0IGxvYWRpbmcgUEtHLUlORk8pCgogICAgQHByb3BlcnR5CiAgICBkZWYga2V5KHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2tleQogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgc2VsZi5fa2V5ID0ga2V5ID0gc2VsZi5wcm9qZWN0X25hbWUubG93ZXIoKQogICAgICAgICAgICByZXR1cm4ga2V5CgogICAgQHByb3BlcnR5CiAgICBkZWYgcGFyc2VkX3ZlcnNpb24oc2VsZik6CiAgICAgICAgaWYgbm90IGhhc2F0dHIoc2VsZiwgIl9wYXJzZWRfdmVyc2lvbiIpOgogICAgICAgICAgICBzZWxmLl9wYXJzZWRfdmVyc2lvbiA9IHBhcnNlX3ZlcnNpb24oc2VsZi52ZXJzaW9uKQoKICAgICAgICByZXR1cm4gc2VsZi5fcGFyc2VkX3ZlcnNpb24KCiAgICBkZWYgX3dhcm5fbGVnYWN5X3ZlcnNpb24oc2VsZik6CiAgICAgICAgTFYgPSBwYWNrYWdpbmcudmVyc2lvbi5MZWdhY3lWZXJzaW9uCiAgICAgICAgaXNfbGVnYWN5ID0gaXNpbnN0YW5jZShzZWxmLl9wYXJzZWRfdmVyc2lvbiwgTFYpCiAgICAgICAgaWYgbm90IGlzX2xlZ2FjeToKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICMgV2hpbGUgYW4gZW1wdHkgdmVyc2lvbiBpcyB0ZWNobmljYWxseSBhIGxlZ2FjeSB2ZXJzaW9uIGFuZAogICAgICAgICMgaXMgbm90IGEgdmFsaWQgUEVQIDQ0MCB2ZXJzaW9uLCBpdCdzIGFsc28gdW5saWtlbHkgdG8KICAgICAgICAjIGFjdHVhbGx5IGNvbWUgZnJvbSBzb21lb25lIGFuZCBpbnN0ZWFkIGl0IGlzIG1vcmUgbGlrZWx5IHRoYXQKICAgICAgICAjIGl0IGNvbWVzIGZyb20gc2V0dXB0b29scyBhdHRlbXB0aW5nIHRvIHBhcnNlIGEgZmlsZW5hbWUgYW5kCiAgICAgICAgIyBpbmNsdWRpbmcgaXQgaW4gdGhlIGxpc3QuIFNvIGZvciB0aGF0IHdlJ2xsIGdhdGUgdGhpcyB3YXJuaW5nCiAgICAgICAgIyBvbiBpZiB0aGUgdmVyc2lvbiBpcyBhbnl0aGluZyBhdCBhbGwgb3Igbm90LgogICAgICAgIGlmIG5vdCBzZWxmLnZlcnNpb246CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICB0bXBsID0gdGV4dHdyYXAuZGVkZW50KCIiIgogICAgICAgICAgICAne3Byb2plY3RfbmFtZX0gKHt2ZXJzaW9ufSknIGlzIGJlaW5nIHBhcnNlZCBhcyBhIGxlZ2FjeSwKICAgICAgICAgICAgbm9uIFBFUCA0NDAsCiAgICAgICAgICAgIHZlcnNpb24uIFlvdSBtYXkgZmluZCBvZGQgYmVoYXZpb3IgYW5kIHNvcnQgb3JkZXIuCiAgICAgICAgICAgIEluIHBhcnRpY3VsYXIgaXQgd2lsbCBiZSBzb3J0ZWQgYXMgbGVzcyB0aGFuIDAuMC4gSXQKICAgICAgICAgICAgaXMgcmVjb21tZW5kZWQgdG8gbWlncmF0ZSB0byBQRVAgNDQwIGNvbXBhdGlibGUKICAgICAgICAgICAgdmVyc2lvbnMuCiAgICAgICAgICAgICIiIikuc3RyaXAoKS5yZXBsYWNlKCdcbicsICcgJykKCiAgICAgICAgd2FybmluZ3Mud2Fybih0bXBsLmZvcm1hdCgqKnZhcnMoc2VsZikpLCBQRVA0NDBXYXJuaW5nKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHZlcnNpb24oc2VsZik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5fdmVyc2lvbgogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgdmVyc2lvbiA9IHNlbGYuX2dldF92ZXJzaW9uKCkKICAgICAgICAgICAgaWYgdmVyc2lvbiBpcyBOb25lOgogICAgICAgICAgICAgICAgcGF0aCA9IHNlbGYuX2dldF9tZXRhZGF0YV9wYXRoX2Zvcl9kaXNwbGF5KHNlbGYuUEtHX0lORk8pCiAgICAgICAgICAgICAgICBtc2cgPSAoCiAgICAgICAgICAgICAgICAgICAgIk1pc3NpbmcgJ1ZlcnNpb246JyBoZWFkZXIgYW5kL29yIHt9IGZpbGUgYXQgcGF0aDoge30iCiAgICAgICAgICAgICAgICApLmZvcm1hdChzZWxmLlBLR19JTkZPLCBwYXRoKQogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihtc2csIHNlbGYpCgogICAgICAgICAgICByZXR1cm4gdmVyc2lvbgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIF9kZXBfbWFwKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEEgbWFwIG9mIGV4dHJhIHRvIGl0cyBsaXN0IG9mIChkaXJlY3QpIHJlcXVpcmVtZW50cwogICAgICAgIGZvciB0aGlzIGRpc3RyaWJ1dGlvbiwgaW5jbHVkaW5nIHRoZSBudWxsIGV4dHJhLgogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19kZXBfbWFwCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICBzZWxmLl9fZGVwX21hcCA9IHNlbGYuX2ZpbHRlcl9leHRyYXMoc2VsZi5fYnVpbGRfZGVwX21hcCgpKQogICAgICAgIHJldHVybiBzZWxmLl9fZGVwX21hcAoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfZmlsdGVyX2V4dHJhcyhkbSk6CiAgICAgICAgIiIiCiAgICAgICAgR2l2ZW4gYSBtYXBwaW5nIG9mIGV4dHJhcyB0byBkZXBlbmRlbmNpZXMsIHN0cmlwIG9mZgogICAgICAgIGVudmlyb25tZW50IG1hcmtlcnMgYW5kIGZpbHRlciBvdXQgYW55IGRlcGVuZGVuY2llcwogICAgICAgIG5vdCBtYXRjaGluZyB0aGUgbWFya2Vycy4KICAgICAgICAiIiIKICAgICAgICBmb3IgZXh0cmEgaW4gbGlzdChmaWx0ZXIoTm9uZSwgZG0pKToKICAgICAgICAgICAgbmV3X2V4dHJhID0gZXh0cmEKICAgICAgICAgICAgcmVxcyA9IGRtLnBvcChleHRyYSkKICAgICAgICAgICAgbmV3X2V4dHJhLCBfLCBtYXJrZXIgPSBleHRyYS5wYXJ0aXRpb24oJzonKQogICAgICAgICAgICBmYWlsc19tYXJrZXIgPSBtYXJrZXIgYW5kICgKICAgICAgICAgICAgICAgIGludmFsaWRfbWFya2VyKG1hcmtlcikKICAgICAgICAgICAgICAgIG9yIG5vdCBldmFsdWF0ZV9tYXJrZXIobWFya2VyKQogICAgICAgICAgICApCiAgICAgICAgICAgIGlmIGZhaWxzX21hcmtlcjoKICAgICAgICAgICAgICAgIHJlcXMgPSBbXQogICAgICAgICAgICBuZXdfZXh0cmEgPSBzYWZlX2V4dHJhKG5ld19leHRyYSkgb3IgTm9uZQoKICAgICAgICAgICAgZG0uc2V0ZGVmYXVsdChuZXdfZXh0cmEsIFtdKS5leHRlbmQocmVxcykKICAgICAgICByZXR1cm4gZG0KCiAgICBkZWYgX2J1aWxkX2RlcF9tYXAoc2VsZik6CiAgICAgICAgZG0gPSB7fQogICAgICAgIGZvciBuYW1lIGluICdyZXF1aXJlcy50eHQnLCAnZGVwZW5kcy50eHQnOgogICAgICAgICAgICBmb3IgZXh0cmEsIHJlcXMgaW4gc3BsaXRfc2VjdGlvbnMoc2VsZi5fZ2V0X21ldGFkYXRhKG5hbWUpKToKICAgICAgICAgICAgICAgIGRtLnNldGRlZmF1bHQoZXh0cmEsIFtdKS5leHRlbmQocGFyc2VfcmVxdWlyZW1lbnRzKHJlcXMpKQogICAgICAgIHJldHVybiBkbQoKICAgIGRlZiByZXF1aXJlcyhzZWxmLCBleHRyYXM9KCkpOgogICAgICAgICIiIkxpc3Qgb2YgUmVxdWlyZW1lbnRzIG5lZWRlZCBmb3IgdGhpcyBkaXN0cm8gaWYgYGV4dHJhc2AgYXJlIHVzZWQiIiIKICAgICAgICBkbSA9IHNlbGYuX2RlcF9tYXAKICAgICAgICBkZXBzID0gW10KICAgICAgICBkZXBzLmV4dGVuZChkbS5nZXQoTm9uZSwgKCkpKQogICAgICAgIGZvciBleHQgaW4gZXh0cmFzOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBkZXBzLmV4dGVuZChkbVtzYWZlX2V4dHJhKGV4dCldKQogICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgICAgICByYWlzZSBVbmtub3duRXh0cmEoCiAgICAgICAgICAgICAgICAgICAgIiVzIGhhcyBubyBzdWNoIGV4dHJhIGZlYXR1cmUgJXIiICUgKHNlbGYsIGV4dCkKICAgICAgICAgICAgICAgICkKICAgICAgICByZXR1cm4gZGVwcwoKICAgIGRlZiBfZ2V0X21ldGFkYXRhX3BhdGhfZm9yX2Rpc3BsYXkoc2VsZiwgbmFtZSk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIHRoZSBwYXRoIHRvIHRoZSBnaXZlbiBtZXRhZGF0YSBmaWxlLCBpZiBhdmFpbGFibGUuCiAgICAgICAgIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICAjIFdlIG5lZWQgdG8gYWNjZXNzIF9nZXRfbWV0YWRhdGFfcGF0aCgpIG9uIHRoZSBwcm92aWRlciBvYmplY3QKICAgICAgICAgICAgIyBkaXJlY3RseSByYXRoZXIgdGhhbiB0aHJvdWdoIHRoaXMgY2xhc3MncyBfX2dldGF0dHJfXygpCiAgICAgICAgICAgICMgc2luY2UgX2dldF9tZXRhZGF0YV9wYXRoKCkgaXMgbWFya2VkIHByaXZhdGUuCiAgICAgICAgICAgIHBhdGggPSBzZWxmLl9wcm92aWRlci5fZ2V0X21ldGFkYXRhX3BhdGgobmFtZSkKCiAgICAgICAgIyBIYW5kbGUgZXhjZXB0aW9ucyBlLmcuIGluIGNhc2UgdGhlIGRpc3RyaWJ1dGlvbidzIG1ldGFkYXRhCiAgICAgICAgIyBwcm92aWRlciBkb2Vzbid0IHN1cHBvcnQgX2dldF9tZXRhZGF0YV9wYXRoKCkuCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgcmV0dXJuICdbY291bGQgbm90IGRldGVjdF0nCgogICAgICAgIHJldHVybiBwYXRoCgogICAgZGVmIF9nZXRfbWV0YWRhdGEoc2VsZiwgbmFtZSk6CiAgICAgICAgaWYgc2VsZi5oYXNfbWV0YWRhdGEobmFtZSk6CiAgICAgICAgICAgIGZvciBsaW5lIGluIHNlbGYuZ2V0X21ldGFkYXRhX2xpbmVzKG5hbWUpOgogICAgICAgICAgICAgICAgeWllbGQgbGluZQoKICAgIGRlZiBfZ2V0X3ZlcnNpb24oc2VsZik6CiAgICAgICAgbGluZXMgPSBzZWxmLl9nZXRfbWV0YWRhdGEoc2VsZi5QS0dfSU5GTykKICAgICAgICB2ZXJzaW9uID0gX3ZlcnNpb25fZnJvbV9maWxlKGxpbmVzKQoKICAgICAgICByZXR1cm4gdmVyc2lvbgoKICAgIGRlZiBhY3RpdmF0ZShzZWxmLCBwYXRoPU5vbmUsIHJlcGxhY2U9RmFsc2UpOgogICAgICAgICIiIkVuc3VyZSBkaXN0cmlidXRpb24gaXMgaW1wb3J0YWJsZSBvbiBgcGF0aGAgKGRlZmF1bHQ9c3lzLnBhdGgpIiIiCiAgICAgICAgaWYgcGF0aCBpcyBOb25lOgogICAgICAgICAgICBwYXRoID0gc3lzLnBhdGgKICAgICAgICBzZWxmLmluc2VydF9vbihwYXRoLCByZXBsYWNlPXJlcGxhY2UpCiAgICAgICAgaWYgcGF0aCBpcyBzeXMucGF0aDoKICAgICAgICAgICAgZml4dXBfbmFtZXNwYWNlX3BhY2thZ2VzKHNlbGYubG9jYXRpb24pCiAgICAgICAgICAgIGZvciBwa2cgaW4gc2VsZi5fZ2V0X21ldGFkYXRhKCduYW1lc3BhY2VfcGFja2FnZXMudHh0Jyk6CiAgICAgICAgICAgICAgICBpZiBwa2cgaW4gc3lzLm1vZHVsZXM6CiAgICAgICAgICAgICAgICAgICAgZGVjbGFyZV9uYW1lc3BhY2UocGtnKQoKICAgIGRlZiBlZ2dfbmFtZShzZWxmKToKICAgICAgICAiIiJSZXR1cm4gd2hhdCB0aGlzIGRpc3RyaWJ1dGlvbidzIHN0YW5kYXJkIC5lZ2cgZmlsZW5hbWUgc2hvdWxkIGJlIiIiCiAgICAgICAgZmlsZW5hbWUgPSAiJXMtJXMtcHklcyIgJSAoCiAgICAgICAgICAgIHRvX2ZpbGVuYW1lKHNlbGYucHJvamVjdF9uYW1lKSwgdG9fZmlsZW5hbWUoc2VsZi52ZXJzaW9uKSwKICAgICAgICAgICAgc2VsZi5weV92ZXJzaW9uIG9yIFBZX01BSk9SCiAgICAgICAgKQoKICAgICAgICBpZiBzZWxmLnBsYXRmb3JtOgogICAgICAgICAgICBmaWxlbmFtZSArPSAnLScgKyBzZWxmLnBsYXRmb3JtCiAgICAgICAgcmV0dXJuIGZpbGVuYW1lCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIGlmIHNlbGYubG9jYXRpb246CiAgICAgICAgICAgIHJldHVybiAiJXMgKCVzKSIgJSAoc2VsZiwgc2VsZi5sb2NhdGlvbikKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc3RyKHNlbGYpCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICB2ZXJzaW9uID0gZ2V0YXR0cihzZWxmLCAndmVyc2lvbicsIE5vbmUpCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgIHZlcnNpb24gPSBOb25lCiAgICAgICAgdmVyc2lvbiA9IHZlcnNpb24gb3IgIlt1bmtub3duIHZlcnNpb25dIgogICAgICAgIHJldHVybiAiJXMgJXMiICUgKHNlbGYucHJvamVjdF9uYW1lLCB2ZXJzaW9uKQoKICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBhdHRyKToKICAgICAgICAiIiJEZWxlZ2F0ZSBhbGwgdW5yZWNvZ25pemVkIHB1YmxpYyBhdHRyaWJ1dGVzIHRvIC5tZXRhZGF0YSBwcm92aWRlciIiIgogICAgICAgIGlmIGF0dHIuc3RhcnRzd2l0aCgnXycpOgogICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcihhdHRyKQogICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYuX3Byb3ZpZGVyLCBhdHRyKQoKICAgIGRlZiBfX2Rpcl9fKHNlbGYpOgogICAgICAgIHJldHVybiBsaXN0KAogICAgICAgICAgICBzZXQoc3VwZXIoRGlzdHJpYnV0aW9uLCBzZWxmKS5fX2Rpcl9fKCkpCiAgICAgICAgICAgIHwgc2V0KAogICAgICAgICAgICAgICAgYXR0ciBmb3IgYXR0ciBpbiBzZWxmLl9wcm92aWRlci5fX2Rpcl9fKCkKICAgICAgICAgICAgICAgIGlmIG5vdCBhdHRyLnN0YXJ0c3dpdGgoJ18nKQogICAgICAgICAgICApCiAgICAgICAgKQoKICAgIGlmIG5vdCBoYXNhdHRyKG9iamVjdCwgJ19fZGlyX18nKToKICAgICAgICAjIHB5dGhvbiAyLjcgbm90IHN1cHBvcnRlZAogICAgICAgIGRlbCBfX2Rpcl9fCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZnJvbV9maWxlbmFtZShjbHMsIGZpbGVuYW1lLCBtZXRhZGF0YT1Ob25lLCAqKmt3KToKICAgICAgICByZXR1cm4gY2xzLmZyb21fbG9jYXRpb24oCiAgICAgICAgICAgIF9ub3JtYWxpemVfY2FjaGVkKGZpbGVuYW1lKSwgb3MucGF0aC5iYXNlbmFtZShmaWxlbmFtZSksIG1ldGFkYXRhLAogICAgICAgICAgICAqKmt3CiAgICAgICAgKQoKICAgIGRlZiBhc19yZXF1aXJlbWVudChzZWxmKToKICAgICAgICAiIiJSZXR1cm4gYSBgYFJlcXVpcmVtZW50YGAgdGhhdCBtYXRjaGVzIHRoaXMgZGlzdHJpYnV0aW9uIGV4YWN0bHkiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYucGFyc2VkX3ZlcnNpb24sIHBhY2thZ2luZy52ZXJzaW9uLlZlcnNpb24pOgogICAgICAgICAgICBzcGVjID0gIiVzPT0lcyIgJSAoc2VsZi5wcm9qZWN0X25hbWUsIHNlbGYucGFyc2VkX3ZlcnNpb24pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc3BlYyA9ICIlcz09PSVzIiAlIChzZWxmLnByb2plY3RfbmFtZSwgc2VsZi5wYXJzZWRfdmVyc2lvbikKCiAgICAgICAgcmV0dXJuIFJlcXVpcmVtZW50LnBhcnNlKHNwZWMpCgogICAgZGVmIGxvYWRfZW50cnlfcG9pbnQoc2VsZiwgZ3JvdXAsIG5hbWUpOgogICAgICAgICIiIlJldHVybiB0aGUgYG5hbWVgIGVudHJ5IHBvaW50IG9mIGBncm91cGAgb3IgcmFpc2UgSW1wb3J0RXJyb3IiIiIKICAgICAgICBlcCA9IHNlbGYuZ2V0X2VudHJ5X2luZm8oZ3JvdXAsIG5hbWUpCiAgICAgICAgaWYgZXAgaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoIkVudHJ5IHBvaW50ICVyIG5vdCBmb3VuZCIgJSAoKGdyb3VwLCBuYW1lKSwpKQogICAgICAgIHJldHVybiBlcC5sb2FkKCkKCiAgICBkZWYgZ2V0X2VudHJ5X21hcChzZWxmLCBncm91cD1Ob25lKToKICAgICAgICAiIiJSZXR1cm4gdGhlIGVudHJ5IHBvaW50IG1hcCBmb3IgYGdyb3VwYCwgb3IgdGhlIGZ1bGwgZW50cnkgbWFwIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICBlcF9tYXAgPSBzZWxmLl9lcF9tYXAKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIGVwX21hcCA9IHNlbGYuX2VwX21hcCA9IEVudHJ5UG9pbnQucGFyc2VfbWFwKAogICAgICAgICAgICAgICAgc2VsZi5fZ2V0X21ldGFkYXRhKCdlbnRyeV9wb2ludHMudHh0JyksIHNlbGYKICAgICAgICAgICAgKQogICAgICAgIGlmIGdyb3VwIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gZXBfbWFwLmdldChncm91cCwge30pCiAgICAgICAgcmV0dXJuIGVwX21hcAoKICAgIGRlZiBnZXRfZW50cnlfaW5mbyhzZWxmLCBncm91cCwgbmFtZSk6CiAgICAgICAgIiIiUmV0dXJuIHRoZSBFbnRyeVBvaW50IG9iamVjdCBmb3IgYGdyb3VwYCtgbmFtZWAsIG9yIGBgTm9uZWBgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuZ2V0X2VudHJ5X21hcChncm91cCkuZ2V0KG5hbWUpCgogICAgZGVmIGluc2VydF9vbihzZWxmLCBwYXRoLCBsb2M9Tm9uZSwgcmVwbGFjZT1GYWxzZSk6CiAgICAgICAgIiIiRW5zdXJlIHNlbGYubG9jYXRpb24gaXMgb24gcGF0aAoKICAgICAgICBJZiByZXBsYWNlPUZhbHNlIChkZWZhdWx0KToKICAgICAgICAgICAgLSBJZiBsb2NhdGlvbiBpcyBhbHJlYWR5IGluIHBhdGggYW55d2hlcmUsIGRvIG5vdGhpbmcuCiAgICAgICAgICAgIC0gRWxzZToKICAgICAgICAgICAgICAtIElmIGl0J3MgYW4gZWdnIGFuZCBpdHMgcGFyZW50IGRpcmVjdG9yeSBpcyBvbiBwYXRoLAogICAgICAgICAgICAgICAgaW5zZXJ0IGp1c3QgYWhlYWQgb2YgdGhlIHBhcmVudC4KICAgICAgICAgICAgICAtIEVsc2U6IGFkZCB0byB0aGUgZW5kIG9mIHBhdGguCiAgICAgICAgSWYgcmVwbGFjZT1UcnVlOgogICAgICAgICAgICAtIElmIGxvY2F0aW9uIGlzIGFscmVhZHkgb24gcGF0aCBhbnl3aGVyZSAobm90IGVnZ3MpCiAgICAgICAgICAgICAgb3IgaGlnaGVyIHByaW9yaXR5IHRoYW4gaXRzIHBhcmVudCAoZWdncykKICAgICAgICAgICAgICBkbyBub3RoaW5nLgogICAgICAgICAgICAtIEVsc2U6CiAgICAgICAgICAgICAgLSBJZiBpdCdzIGFuIGVnZyBhbmQgaXRzIHBhcmVudCBkaXJlY3RvcnkgaXMgb24gcGF0aCwKICAgICAgICAgICAgICAgIGluc2VydCBqdXN0IGFoZWFkIG9mIHRoZSBwYXJlbnQsCiAgICAgICAgICAgICAgICByZW1vdmluZyBhbnkgbG93ZXItcHJpb3JpdHkgZW50cmllcy4KICAgICAgICAgICAgICAtIEVsc2U6IGFkZCBpdCB0byB0aGUgZnJvbnQgb2YgcGF0aC4KICAgICAgICAiIiIKCiAgICAgICAgbG9jID0gbG9jIG9yIHNlbGYubG9jYXRpb24KICAgICAgICBpZiBub3QgbG9jOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgbmxvYyA9IF9ub3JtYWxpemVfY2FjaGVkKGxvYykKICAgICAgICBiZGlyID0gb3MucGF0aC5kaXJuYW1lKG5sb2MpCiAgICAgICAgbnBhdGggPSBbKHAgYW5kIF9ub3JtYWxpemVfY2FjaGVkKHApIG9yIHApIGZvciBwIGluIHBhdGhdCgogICAgICAgIGZvciBwLCBpdGVtIGluIGVudW1lcmF0ZShucGF0aCk6CiAgICAgICAgICAgIGlmIGl0ZW0gPT0gbmxvYzoKICAgICAgICAgICAgICAgIGlmIHJlcGxhY2U6CiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgIyBkb24ndCBtb2RpZnkgcGF0aCAoZXZlbiByZW1vdmluZyBkdXBsaWNhdGVzKSBpZgogICAgICAgICAgICAgICAgICAgICMgZm91bmQgYW5kIG5vdCByZXBsYWNlCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIGVsaWYgaXRlbSA9PSBiZGlyIGFuZCBzZWxmLnByZWNlZGVuY2UgPT0gRUdHX0RJU1Q6CiAgICAgICAgICAgICAgICAjIGlmIGl0J3MgYW4gLmVnZywgZ2l2ZSBpdCBwcmVjZWRlbmNlIG92ZXIgaXRzIGRpcmVjdG9yeQogICAgICAgICAgICAgICAgIyBVTkxFU1MgaXQncyBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gc3lzLnBhdGggYW5kIHJlcGxhY2U9RmFsc2UKICAgICAgICAgICAgICAgIGlmIChub3QgcmVwbGFjZSkgYW5kIG5sb2MgaW4gbnBhdGhbcDpdOgogICAgICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgICAgaWYgcGF0aCBpcyBzeXMucGF0aDoKICAgICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrX3ZlcnNpb25fY29uZmxpY3QoKQogICAgICAgICAgICAgICAgcGF0aC5pbnNlcnQocCwgbG9jKQogICAgICAgICAgICAgICAgbnBhdGguaW5zZXJ0KHAsIG5sb2MpCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIHBhdGggaXMgc3lzLnBhdGg6CiAgICAgICAgICAgICAgICBzZWxmLmNoZWNrX3ZlcnNpb25fY29uZmxpY3QoKQogICAgICAgICAgICBpZiByZXBsYWNlOgogICAgICAgICAgICAgICAgcGF0aC5pbnNlcnQoMCwgbG9jKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcGF0aC5hcHBlbmQobG9jKQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgIyBwIGlzIHRoZSBzcG90IHdoZXJlIHdlIGZvdW5kIG9yIGluc2VydGVkIGxvYzsgbm93IHJlbW92ZSBkdXBsaWNhdGVzCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgbnAgPSBucGF0aC5pbmRleChubG9jLCBwICsgMSkKICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZGVsIG5wYXRoW25wXSwgcGF0aFtucF0KICAgICAgICAgICAgICAgICMgaGEhCiAgICAgICAgICAgICAgICBwID0gbnAKCiAgICAgICAgcmV0dXJuCgogICAgZGVmIGNoZWNrX3ZlcnNpb25fY29uZmxpY3Qoc2VsZik6CiAgICAgICAgaWYgc2VsZi5rZXkgPT0gJ3NldHVwdG9vbHMnOgogICAgICAgICAgICAjIGlnbm9yZSB0aGUgaW5ldml0YWJsZSBzZXR1cHRvb2xzIHNlbGYtY29uZmxpY3RzICA6KAogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgbnNwID0gZGljdC5mcm9ta2V5cyhzZWxmLl9nZXRfbWV0YWRhdGEoJ25hbWVzcGFjZV9wYWNrYWdlcy50eHQnKSkKICAgICAgICBsb2MgPSBub3JtYWxpemVfcGF0aChzZWxmLmxvY2F0aW9uKQogICAgICAgIGZvciBtb2RuYW1lIGluIHNlbGYuX2dldF9tZXRhZGF0YSgndG9wX2xldmVsLnR4dCcpOgogICAgICAgICAgICBpZiAobW9kbmFtZSBub3QgaW4gc3lzLm1vZHVsZXMgb3IgbW9kbmFtZSBpbiBuc3AKICAgICAgICAgICAgICAgICAgICBvciBtb2RuYW1lIGluIF9uYW1lc3BhY2VfcGFja2FnZXMpOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgbW9kbmFtZSBpbiAoJ3BrZ19yZXNvdXJjZXMnLCAnc2V0dXB0b29scycsICdzaXRlJyk6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBmbiA9IGdldGF0dHIoc3lzLm1vZHVsZXNbbW9kbmFtZV0sICdfX2ZpbGVfXycsIE5vbmUpCiAgICAgICAgICAgIGlmIGZuIGFuZCAobm9ybWFsaXplX3BhdGgoZm4pLnN0YXJ0c3dpdGgobG9jKSBvcgogICAgICAgICAgICAgICAgICAgICAgIGZuLnN0YXJ0c3dpdGgoc2VsZi5sb2NhdGlvbikpOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaXNzdWVfd2FybmluZygKICAgICAgICAgICAgICAgICJNb2R1bGUgJXMgd2FzIGFscmVhZHkgaW1wb3J0ZWQgZnJvbSAlcywgYnV0ICVzIGlzIGJlaW5nIGFkZGVkIgogICAgICAgICAgICAgICAgIiB0byBzeXMucGF0aCIgJSAobW9kbmFtZSwgZm4sIHNlbGYubG9jYXRpb24pLAogICAgICAgICAgICApCgogICAgZGVmIGhhc192ZXJzaW9uKHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi52ZXJzaW9uCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgIGlzc3VlX3dhcm5pbmcoIlVuYnVpbHQgZWdnIGZvciAiICsgcmVwcihzZWxmKSkKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgY2xvbmUoc2VsZiwgKiprdyk6CiAgICAgICAgIiIiQ29weSB0aGlzIGRpc3RyaWJ1dGlvbiwgc3Vic3RpdHV0aW5nIGluIGFueSBjaGFuZ2VkIGtleXdvcmQgYXJncyIiIgogICAgICAgIG5hbWVzID0gJ3Byb2plY3RfbmFtZSB2ZXJzaW9uIHB5X3ZlcnNpb24gcGxhdGZvcm0gbG9jYXRpb24gcHJlY2VkZW5jZScKICAgICAgICBmb3IgYXR0ciBpbiBuYW1lcy5zcGxpdCgpOgogICAgICAgICAgICBrdy5zZXRkZWZhdWx0KGF0dHIsIGdldGF0dHIoc2VsZiwgYXR0ciwgTm9uZSkpCiAgICAgICAga3cuc2V0ZGVmYXVsdCgnbWV0YWRhdGEnLCBzZWxmLl9wcm92aWRlcikKICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oKiprdykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBleHRyYXMoc2VsZik6CiAgICAgICAgcmV0dXJuIFtkZXAgZm9yIGRlcCBpbiBzZWxmLl9kZXBfbWFwIGlmIGRlcF0KCgpjbGFzcyBFZ2dJbmZvRGlzdHJpYnV0aW9uKERpc3RyaWJ1dGlvbik6CiAgICBkZWYgX3JlbG9hZF92ZXJzaW9uKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFBhY2thZ2VzIGluc3RhbGxlZCBieSBkaXN0dXRpbHMgKGUuZy4gbnVtcHkgb3Igc2NpcHkpLAogICAgICAgIHdoaWNoIHVzZXMgYW4gb2xkIHNhZmVfdmVyc2lvbiwgYW5kIHNvCiAgICAgICAgdGhlaXIgdmVyc2lvbiBudW1iZXJzIGNhbiBnZXQgbWFuZ2xlZCB3aGVuCiAgICAgICAgY29udmVydGVkIHRvIGZpbGVuYW1lcyAoZS5nLiwgMS4xMS4wLmRldjArMjMyOWVhZSB0bwogICAgICAgIDEuMTEuMC5kZXYwXzIzMjllYWUpLiBUaGVzZSBkaXN0cmlidXRpb25zIHdpbGwgbm90IGJlCiAgICAgICAgcGFyc2VkIHByb3Blcmx5CiAgICAgICAgZG93bnN0cmVhbSBieSBEaXN0cmlidXRpb24gYW5kIHNhZmVfdmVyc2lvbiwgc28KICAgICAgICB0YWtlIGFuIGV4dHJhIHN0ZXAgYW5kIHRyeSB0byBnZXQgdGhlIHZlcnNpb24gbnVtYmVyIGZyb20KICAgICAgICB0aGUgbWV0YWRhdGEgZmlsZSBpdHNlbGYgaW5zdGVhZCBvZiB0aGUgZmlsZW5hbWUuCiAgICAgICAgIiIiCiAgICAgICAgbWRfdmVyc2lvbiA9IHNlbGYuX2dldF92ZXJzaW9uKCkKICAgICAgICBpZiBtZF92ZXJzaW9uOgogICAgICAgICAgICBzZWxmLl92ZXJzaW9uID0gbWRfdmVyc2lvbgogICAgICAgIHJldHVybiBzZWxmCgoKY2xhc3MgRGlzdEluZm9EaXN0cmlidXRpb24oRGlzdHJpYnV0aW9uKToKICAgICIiIgogICAgV3JhcCBhbiBhY3R1YWwgb3IgcG90ZW50aWFsIHN5cy5wYXRoIGVudHJ5CiAgICB3L21ldGFkYXRhLCAuZGlzdC1pbmZvIHN0eWxlLgogICAgIiIiCiAgICBQS0dfSU5GTyA9ICdNRVRBREFUQScKICAgIEVRRVEgPSByZS5jb21waWxlKHIiKFtcKCxdKVxzKihcZC4qPylccyooWyxcKV0pIikKCiAgICBAcHJvcGVydHkKICAgIGRlZiBfcGFyc2VkX3BrZ19pbmZvKHNlbGYpOgogICAgICAgICIiIlBhcnNlIGFuZCBjYWNoZSBtZXRhZGF0YSIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3BrZ19pbmZvCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICBtZXRhZGF0YSA9IHNlbGYuZ2V0X21ldGFkYXRhKHNlbGYuUEtHX0lORk8pCiAgICAgICAgICAgIHNlbGYuX3BrZ19pbmZvID0gZW1haWwucGFyc2VyLlBhcnNlcigpLnBhcnNlc3RyKG1ldGFkYXRhKQogICAgICAgICAgICByZXR1cm4gc2VsZi5fcGtnX2luZm8KCiAgICBAcHJvcGVydHkKICAgIGRlZiBfZGVwX21hcChzZWxmKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9fZGVwX21hcAogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgc2VsZi5fX2RlcF9tYXAgPSBzZWxmLl9jb21wdXRlX2RlcGVuZGVuY2llcygpCiAgICAgICAgICAgIHJldHVybiBzZWxmLl9fZGVwX21hcAoKICAgIGRlZiBfY29tcHV0ZV9kZXBlbmRlbmNpZXMoc2VsZik6CiAgICAgICAgIiIiUmVjb21wdXRlIHRoaXMgZGlzdHJpYnV0aW9uJ3MgZGVwZW5kZW5jaWVzLiIiIgogICAgICAgIGRtID0gc2VsZi5fX2RlcF9tYXAgPSB7Tm9uZTogW119CgogICAgICAgIHJlcXMgPSBbXQogICAgICAgICMgSW5jbHVkaW5nIGFueSBjb25kaXRpb24gZXhwcmVzc2lvbnMKICAgICAgICBmb3IgcmVxIGluIHNlbGYuX3BhcnNlZF9wa2dfaW5mby5nZXRfYWxsKCdSZXF1aXJlcy1EaXN0Jykgb3IgW106CiAgICAgICAgICAgIHJlcXMuZXh0ZW5kKHBhcnNlX3JlcXVpcmVtZW50cyhyZXEpKQoKICAgICAgICBkZWYgcmVxc19mb3JfZXh0cmEoZXh0cmEpOgogICAgICAgICAgICBmb3IgcmVxIGluIHJlcXM6CiAgICAgICAgICAgICAgICBpZiBub3QgcmVxLm1hcmtlciBvciByZXEubWFya2VyLmV2YWx1YXRlKHsnZXh0cmEnOiBleHRyYX0pOgogICAgICAgICAgICAgICAgICAgIHlpZWxkIHJlcQoKICAgICAgICBjb21tb24gPSBmcm96ZW5zZXQocmVxc19mb3JfZXh0cmEoTm9uZSkpCiAgICAgICAgZG1bTm9uZV0uZXh0ZW5kKGNvbW1vbikKCiAgICAgICAgZm9yIGV4dHJhIGluIHNlbGYuX3BhcnNlZF9wa2dfaW5mby5nZXRfYWxsKCdQcm92aWRlcy1FeHRyYScpIG9yIFtdOgogICAgICAgICAgICBzX2V4dHJhID0gc2FmZV9leHRyYShleHRyYS5zdHJpcCgpKQogICAgICAgICAgICBkbVtzX2V4dHJhXSA9IGxpc3QoZnJvemVuc2V0KHJlcXNfZm9yX2V4dHJhKGV4dHJhKSkgLSBjb21tb24pCgogICAgICAgIHJldHVybiBkbQoKCl9kaXN0cmlidXRpb25JbXBsID0gewogICAgJy5lZ2cnOiBEaXN0cmlidXRpb24sCiAgICAnLmVnZy1pbmZvJzogRWdnSW5mb0Rpc3RyaWJ1dGlvbiwKICAgICcuZGlzdC1pbmZvJzogRGlzdEluZm9EaXN0cmlidXRpb24sCn0KCgpkZWYgaXNzdWVfd2FybmluZygqYXJncywgKiprdyk6CiAgICBsZXZlbCA9IDEKICAgIGcgPSBnbG9iYWxzKCkKICAgIHRyeToKICAgICAgICAjIGZpbmQgdGhlIGZpcnN0IHN0YWNrIGZyYW1lIHRoYXQgaXMgKm5vdCogY29kZSBpbgogICAgICAgICMgdGhlIHBrZ19yZXNvdXJjZXMgbW9kdWxlLCB0byB1c2UgZm9yIHRoZSB3YXJuaW5nCiAgICAgICAgd2hpbGUgc3lzLl9nZXRmcmFtZShsZXZlbCkuZl9nbG9iYWxzIGlzIGc6CiAgICAgICAgICAgIGxldmVsICs9IDEKICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgIHBhc3MKICAgIHdhcm5pbmdzLndhcm4oc3RhY2tsZXZlbD1sZXZlbCArIDEsICphcmdzLCAqKmt3KQoKCmNsYXNzIFJlcXVpcmVtZW50UGFyc2VFcnJvcihWYWx1ZUVycm9yKToKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiAnICcuam9pbihzZWxmLmFyZ3MpCgoKZGVmIHBhcnNlX3JlcXVpcmVtZW50cyhzdHJzKToKICAgICIiIllpZWxkIGBgUmVxdWlyZW1lbnRgYCBvYmplY3RzIGZvciBlYWNoIHNwZWNpZmljYXRpb24gaW4gYHN0cnNgCgogICAgYHN0cnNgIG11c3QgYmUgYSBzdHJpbmcsIG9yIGEgKHBvc3NpYmx5LW5lc3RlZCkgaXRlcmFibGUgdGhlcmVvZi4KICAgICIiIgogICAgIyBjcmVhdGUgYSBzdGVwcGFibGUgaXRlcmF0b3IsIHNvIHdlIGNhbiBoYW5kbGUgXC1jb250aW51YXRpb25zCiAgICBsaW5lcyA9IGl0ZXIoeWllbGRfbGluZXMoc3RycykpCgogICAgZm9yIGxpbmUgaW4gbGluZXM6CiAgICAgICAgIyBEcm9wIGNvbW1lbnRzIC0tIGEgaGFzaCB3aXRob3V0IGEgc3BhY2UgbWF5IGJlIGluIGEgVVJMLgogICAgICAgIGlmICcgIycgaW4gbGluZToKICAgICAgICAgICAgbGluZSA9IGxpbmVbOmxpbmUuZmluZCgnICMnKV0KICAgICAgICAjIElmIHRoZXJlIGlzIGEgbGluZSBjb250aW51YXRpb24sIGRyb3AgaXQsIGFuZCBhcHBlbmQgdGhlIG5leHQgbGluZS4KICAgICAgICBpZiBsaW5lLmVuZHN3aXRoKCdcXCcpOgogICAgICAgICAgICBsaW5lID0gbGluZVs6LTJdLnN0cmlwKCkKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgbGluZSArPSBuZXh0KGxpbmVzKQogICAgICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgIHlpZWxkIFJlcXVpcmVtZW50KGxpbmUpCgoKY2xhc3MgUmVxdWlyZW1lbnQocGFja2FnaW5nLnJlcXVpcmVtZW50cy5SZXF1aXJlbWVudCk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgcmVxdWlyZW1lbnRfc3RyaW5nKToKICAgICAgICAiIiJETyBOT1QgQ0FMTCBUSElTIFVORE9DVU1FTlRFRCBNRVRIT0Q7IHVzZSBSZXF1aXJlbWVudC5wYXJzZSgpISIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgc3VwZXIoUmVxdWlyZW1lbnQsIHNlbGYpLl9faW5pdF9fKHJlcXVpcmVtZW50X3N0cmluZykKICAgICAgICBleGNlcHQgcGFja2FnaW5nLnJlcXVpcmVtZW50cy5JbnZhbGlkUmVxdWlyZW1lbnQgYXMgZToKICAgICAgICAgICAgcmFpc2UgUmVxdWlyZW1lbnRQYXJzZUVycm9yKHN0cihlKSkKICAgICAgICBzZWxmLnVuc2FmZV9uYW1lID0gc2VsZi5uYW1lCiAgICAgICAgcHJvamVjdF9uYW1lID0gc2FmZV9uYW1lKHNlbGYubmFtZSkKICAgICAgICBzZWxmLnByb2plY3RfbmFtZSwgc2VsZi5rZXkgPSBwcm9qZWN0X25hbWUsIHByb2plY3RfbmFtZS5sb3dlcigpCiAgICAgICAgc2VsZi5zcGVjcyA9IFsKICAgICAgICAgICAgKHNwZWMub3BlcmF0b3IsIHNwZWMudmVyc2lvbikgZm9yIHNwZWMgaW4gc2VsZi5zcGVjaWZpZXJdCiAgICAgICAgc2VsZi5leHRyYXMgPSB0dXBsZShtYXAoc2FmZV9leHRyYSwgc2VsZi5leHRyYXMpKQogICAgICAgIHNlbGYuaGFzaENtcCA9ICgKICAgICAgICAgICAgc2VsZi5rZXksCiAgICAgICAgICAgIHNlbGYudXJsLAogICAgICAgICAgICBzZWxmLnNwZWNpZmllciwKICAgICAgICAgICAgZnJvemVuc2V0KHNlbGYuZXh0cmFzKSwKICAgICAgICAgICAgc3RyKHNlbGYubWFya2VyKSBpZiBzZWxmLm1hcmtlciBlbHNlIE5vbmUsCiAgICAgICAgKQogICAgICAgIHNlbGYuX19oYXNoID0gaGFzaChzZWxmLmhhc2hDbXApCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgaXNpbnN0YW5jZShvdGhlciwgUmVxdWlyZW1lbnQpIGFuZAogICAgICAgICAgICBzZWxmLmhhc2hDbXAgPT0gb3RoZXIuaGFzaENtcAogICAgICAgICkKCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gbm90IHNlbGYgPT0gb3RoZXIKCiAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGl0ZW0pOgogICAgICAgIGlmIGlzaW5zdGFuY2UoaXRlbSwgRGlzdHJpYnV0aW9uKToKICAgICAgICAgICAgaWYgaXRlbS5rZXkgIT0gc2VsZi5rZXk6CiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgICAgIGl0ZW0gPSBpdGVtLnZlcnNpb24KCiAgICAgICAgIyBBbGxvdyBwcmVyZWxlYXNlcyBhbHdheXMgaW4gb3JkZXIgdG8gbWF0Y2ggdGhlIHByZXZpb3VzIGJlaGF2aW9yIG9mCiAgICAgICAgIyB0aGlzIG1ldGhvZC4gSW4gdGhlIGZ1dHVyZSB0aGlzIHNob3VsZCBiZSBzbWFydGVyIGFuZCBmb2xsb3cgUEVQIDQ0MAogICAgICAgICMgbW9yZSBhY2N1cmF0ZWx5LgogICAgICAgIHJldHVybiBzZWxmLnNwZWNpZmllci5jb250YWlucyhpdGVtLCBwcmVyZWxlYXNlcz1UcnVlKQoKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fX2hhc2gKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICJSZXF1aXJlbWVudC5wYXJzZSglcikiICUgc3RyKHNlbGYpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIHBhcnNlKHMpOgogICAgICAgIHJlcSwgPSBwYXJzZV9yZXF1aXJlbWVudHMocykKICAgICAgICByZXR1cm4gcmVxCgoKZGVmIF9hbHdheXNfb2JqZWN0KGNsYXNzZXMpOgogICAgIiIiCiAgICBFbnN1cmUgb2JqZWN0IGFwcGVhcnMgaW4gdGhlIG1ybyBldmVuCiAgICBmb3Igb2xkLXN0eWxlIGNsYXNzZXMuCiAgICAiIiIKICAgIGlmIG9iamVjdCBub3QgaW4gY2xhc3NlczoKICAgICAgICByZXR1cm4gY2xhc3NlcyArIChvYmplY3QsKQogICAgcmV0dXJuIGNsYXNzZXMKCgpkZWYgX2ZpbmRfYWRhcHRlcihyZWdpc3RyeSwgb2IpOgogICAgIiIiUmV0dXJuIGFuIGFkYXB0ZXIgZmFjdG9yeSBmb3IgYG9iYCBmcm9tIGByZWdpc3RyeWAiIiIKICAgIHR5cGVzID0gX2Fsd2F5c19vYmplY3QoaW5zcGVjdC5nZXRtcm8oZ2V0YXR0cihvYiwgJ19fY2xhc3NfXycsIHR5cGUob2IpKSkpCiAgICBmb3IgdCBpbiB0eXBlczoKICAgICAgICBpZiB0IGluIHJlZ2lzdHJ5OgogICAgICAgICAgICByZXR1cm4gcmVnaXN0cnlbdF0KCgpkZWYgZW5zdXJlX2RpcmVjdG9yeShwYXRoKToKICAgICIiIkVuc3VyZSB0aGF0IHRoZSBwYXJlbnQgZGlyZWN0b3J5IG9mIGBwYXRoYCBleGlzdHMiIiIKICAgIGRpcm5hbWUgPSBvcy5wYXRoLmRpcm5hbWUocGF0aCkKICAgIHB5MzFjb21wYXQubWFrZWRpcnMoZGlybmFtZSwgZXhpc3Rfb2s9VHJ1ZSkKCgpkZWYgX2J5cGFzc19lbnN1cmVfZGlyZWN0b3J5KHBhdGgpOgogICAgIiIiU2FuZGJveC1ieXBhc3NpbmcgdmVyc2lvbiBvZiBlbnN1cmVfZGlyZWN0b3J5KCkiIiIKICAgIGlmIG5vdCBXUklURV9TVVBQT1JUOgogICAgICAgIHJhaXNlIElPRXJyb3IoJyJvcy5ta2RpciIgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHBsYXRmb3JtLicpCiAgICBkaXJuYW1lLCBmaWxlbmFtZSA9IHNwbGl0KHBhdGgpCiAgICBpZiBkaXJuYW1lIGFuZCBmaWxlbmFtZSBhbmQgbm90IGlzZGlyKGRpcm5hbWUpOgogICAgICAgIF9ieXBhc3NfZW5zdXJlX2RpcmVjdG9yeShkaXJuYW1lKQogICAgICAgIHRyeToKICAgICAgICAgICAgbWtkaXIoZGlybmFtZSwgMG83NTUpCiAgICAgICAgZXhjZXB0IEZpbGVFeGlzdHNFcnJvcjoKICAgICAgICAgICAgcGFzcwoKCmRlZiBzcGxpdF9zZWN0aW9ucyhzKToKICAgICIiIlNwbGl0IGEgc3RyaW5nIG9yIGl0ZXJhYmxlIHRoZXJlb2YgaW50byAoc2VjdGlvbiwgY29udGVudCkgcGFpcnMKCiAgICBFYWNoIGBgc2VjdGlvbmBgIGlzIGEgc3RyaXBwZWQgdmVyc2lvbiBvZiB0aGUgc2VjdGlvbiBoZWFkZXIgKCJbc2VjdGlvbl0iKQogICAgYW5kIGVhY2ggYGBjb250ZW50YGAgaXMgYSBsaXN0IG9mIHN0cmlwcGVkIGxpbmVzIGV4Y2x1ZGluZyBibGFuayBsaW5lcyBhbmQKICAgIGNvbW1lbnQtb25seSBsaW5lcy4gIElmIHRoZXJlIGFyZSBhbnkgc3VjaCBsaW5lcyBiZWZvcmUgdGhlIGZpcnN0IHNlY3Rpb24KICAgIGhlYWRlciwgdGhleSdyZSByZXR1cm5lZCBpbiBhIGZpcnN0IGBgc2VjdGlvbmBgIG9mIGBgTm9uZWBgLgogICAgIiIiCiAgICBzZWN0aW9uID0gTm9uZQogICAgY29udGVudCA9IFtdCiAgICBmb3IgbGluZSBpbiB5aWVsZF9saW5lcyhzKToKICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoIlsiKToKICAgICAgICAgICAgaWYgbGluZS5lbmRzd2l0aCgiXSIpOgogICAgICAgICAgICAgICAgaWYgc2VjdGlvbiBvciBjb250ZW50OgogICAgICAgICAgICAgICAgICAgIHlpZWxkIHNlY3Rpb24sIGNvbnRlbnQKICAgICAgICAgICAgICAgIHNlY3Rpb24gPSBsaW5lWzE6LTFdLnN0cmlwKCkKICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBbXQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSW52YWxpZCBzZWN0aW9uIGhlYWRpbmciLCBsaW5lKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGNvbnRlbnQuYXBwZW5kKGxpbmUpCgogICAgIyB3cmFwIHVwIGxhc3Qgc2VnbWVudAogICAgeWllbGQgc2VjdGlvbiwgY29udGVudAoKCmRlZiBfbWtzdGVtcCgqYXJncywgKiprdyk6CiAgICBvbGRfb3BlbiA9IG9zLm9wZW4KICAgIHRyeToKICAgICAgICAjIHRlbXBvcmFyaWx5IGJ5cGFzcyBzYW5kYm94aW5nCiAgICAgICAgb3Mub3BlbiA9IG9zX29wZW4KICAgICAgICByZXR1cm4gdGVtcGZpbGUubWtzdGVtcCgqYXJncywgKiprdykKICAgIGZpbmFsbHk6CiAgICAgICAgIyBhbmQgdGhlbiBwdXQgaXQgYmFjawogICAgICAgIG9zLm9wZW4gPSBvbGRfb3BlbgoKCiMgU2lsZW5jZSB0aGUgUEVQNDQwV2FybmluZyBieSBkZWZhdWx0LCBzbyB0aGF0IGVuZCB1c2VycyBkb24ndCBnZXQgaGl0IGJ5IGl0CiMgcmFuZG9tbHkganVzdCBiZWNhdXNlIHRoZXkgdXNlIHBrZ19yZXNvdXJjZXMuIFdlIHdhbnQgdG8gYXBwZW5kIHRoZSBydWxlCiMgYmVjYXVzZSB3ZSB3YW50IGVhcmxpZXIgdXNlcyBvZiBmaWx0ZXJ3YXJuaW5ncyB0byB0YWtlIHByZWNlZGVuY2Ugb3ZlciB0aGlzCiMgb25lLgp3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiaWdub3JlIiwgY2F0ZWdvcnk9UEVQNDQwV2FybmluZywgYXBwZW5kPVRydWUpCgoKIyBmcm9tIGphcmFjby5mdW5jdG9vbHMgMS4zCmRlZiBfY2FsbF9hc2lkZShmLCAqYXJncywgKiprd2FyZ3MpOgogICAgZigqYXJncywgKiprd2FyZ3MpCiAgICByZXR1cm4gZgoKCkBfY2FsbF9hc2lkZQpkZWYgX2luaXRpYWxpemUoZz1nbG9iYWxzKCkpOgogICAgIlNldCB1cCBnbG9iYWwgcmVzb3VyY2UgbWFuYWdlciAoZGVsaWJlcmF0ZWx5IG5vdCBzdGF0ZS1zYXZlZCkiCiAgICBtYW5hZ2VyID0gUmVzb3VyY2VNYW5hZ2VyKCkKICAgIGdbJ19tYW5hZ2VyJ10gPSBtYW5hZ2VyCiAgICBnLnVwZGF0ZSgKICAgICAgICAobmFtZSwgZ2V0YXR0cihtYW5hZ2VyLCBuYW1lKSkKICAgICAgICBmb3IgbmFtZSBpbiBkaXIobWFuYWdlcikKICAgICAgICBpZiBub3QgbmFtZS5zdGFydHN3aXRoKCdfJykKICAgICkKCgpAX2NhbGxfYXNpZGUKZGVmIF9pbml0aWFsaXplX21hc3Rlcl93b3JraW5nX3NldCgpOgogICAgIiIiCiAgICBQcmVwYXJlIHRoZSBtYXN0ZXIgd29ya2luZyBzZXQgYW5kIG1ha2UgdGhlIGBgcmVxdWlyZSgpYGAKICAgIEFQSSBhdmFpbGFibGUuCgogICAgVGhpcyBmdW5jdGlvbiBoYXMgZXhwbGljaXQgZWZmZWN0cyBvbiB0aGUgZ2xvYmFsIHN0YXRlCiAgICBvZiBwa2dfcmVzb3VyY2VzLiBJdCBpcyBpbnRlbmRlZCB0byBiZSBpbnZva2VkIG9uY2UgYXQKICAgIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGlzIG1vZHVsZS4KCiAgICBJbnZvY2F0aW9uIGJ5IG90aGVyIHBhY2thZ2VzIGlzIHVuc3VwcG9ydGVkIGFuZCBkb25lCiAgICBhdCB0aGVpciBvd24gcmlzay4KICAgICIiIgogICAgd29ya2luZ19zZXQgPSBXb3JraW5nU2V0Ll9idWlsZF9tYXN0ZXIoKQogICAgX2RlY2xhcmVfc3RhdGUoJ29iamVjdCcsIHdvcmtpbmdfc2V0PXdvcmtpbmdfc2V0KQoKICAgIHJlcXVpcmUgPSB3b3JraW5nX3NldC5yZXF1aXJlCiAgICBpdGVyX2VudHJ5X3BvaW50cyA9IHdvcmtpbmdfc2V0Lml0ZXJfZW50cnlfcG9pbnRzCiAgICBhZGRfYWN0aXZhdGlvbl9saXN0ZW5lciA9IHdvcmtpbmdfc2V0LnN1YnNjcmliZQogICAgcnVuX3NjcmlwdCA9IHdvcmtpbmdfc2V0LnJ1bl9zY3JpcHQKICAgICMgYmFja3dhcmQgY29tcGF0aWJpbGl0eQogICAgcnVuX21haW4gPSBydW5fc2NyaXB0CiAgICAjIEFjdGl2YXRlIGFsbCBkaXN0cmlidXRpb25zIGFscmVhZHkgb24gc3lzLnBhdGggd2l0aCByZXBsYWNlPUZhbHNlIGFuZAogICAgIyBlbnN1cmUgdGhhdCBhbGwgZGlzdHJpYnV0aW9ucyBhZGRlZCB0byB0aGUgd29ya2luZyBzZXQgaW4gdGhlIGZ1dHVyZQogICAgIyAoZS5nLiBieSBjYWxsaW5nIGBgcmVxdWlyZSgpYGApIHdpbGwgZ2V0IGFjdGl2YXRlZCBhcyB3ZWxsLAogICAgIyB3aXRoIGhpZ2hlciBwcmlvcml0eSAocmVwbGFjZT1UcnVlKS4KICAgIHR1cGxlKAogICAgICAgIGRpc3QuYWN0aXZhdGUocmVwbGFjZT1GYWxzZSkKICAgICAgICBmb3IgZGlzdCBpbiB3b3JraW5nX3NldAogICAgKQogICAgYWRkX2FjdGl2YXRpb25fbGlzdGVuZXIoCiAgICAgICAgbGFtYmRhIGRpc3Q6IGRpc3QuYWN0aXZhdGUocmVwbGFjZT1UcnVlKSwKICAgICAgICBleGlzdGluZz1GYWxzZSwKICAgICkKICAgIHdvcmtpbmdfc2V0LmVudHJpZXMgPSBbXQogICAgIyBtYXRjaCBvcmRlcgogICAgbGlzdChtYXAod29ya2luZ19zZXQuYWRkX2VudHJ5LCBzeXMucGF0aCkpCiAgICBnbG9iYWxzKCkudXBkYXRlKGxvY2FscygpKQoKY2xhc3MgUGtnUmVzb3VyY2VzRGVwcmVjYXRpb25XYXJuaW5nKFdhcm5pbmcpOgogICAgIiIiCiAgICBCYXNlIGNsYXNzIGZvciB3YXJuaW5nIGFib3V0IGRlcHJlY2F0aW9ucyBpbiBgYHBrZ19yZXNvdXJjZXNgYAoKICAgIFRoaXMgY2xhc3MgaXMgbm90IGRlcml2ZWQgZnJvbSBgYERlcHJlY2F0aW9uV2FybmluZ2BgLCBhbmQgYXMgc3VjaCBpcwogICAgdmlzaWJsZSBieSBkZWZhdWx0LgogICAgIiIiClBLAwQUAAAAAAAAACEAAAAAAAAAAAAAAAAARgAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvX19pbml0X18ucHlQSwMEFAAAAAAAAAAhAIbzYdR9YAAAfWAAAEUAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvcGtnX3Jlc291cmNlcy9fdmVuZG9yL2FwcGRpcnMucHkjIS91c3IvYmluL2VudiBweXRob24KIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KIyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAxMCBBY3RpdmVTdGF0ZSBTb2Z0d2FyZSBJbmMuCiMgQ29weXJpZ2h0IChjKSAyMDEzIEVkZHkgUGV0cmnImW9yCgoiIiJVdGlsaXRpZXMgZm9yIGRldGVybWluaW5nIGFwcGxpY2F0aW9uLXNwZWNpZmljIGRpcnMuCgpTZWUgPGh0dHA6Ly9naXRodWIuY29tL0FjdGl2ZVN0YXRlL2FwcGRpcnM+IGZvciBkZXRhaWxzIGFuZCB1c2FnZS4KIiIiCiMgRGV2IE5vdGVzOgojIC0gTVNETiBvbiB3aGVyZSB0byBzdG9yZSBhcHAgZGF0YSBmaWxlczoKIyAgIGh0dHA6Ly9zdXBwb3J0Lm1pY3Jvc29mdC5jb20vZGVmYXVsdC5hc3B4P3NjaWQ9a2I7ZW4tdXM7MzEwMjk0I1hTTFRIMzE5NDEyMTEyMzEyMDEyMTEyMDEyMAojIC0gTWFjIE9TIFg6IGh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2RvY3VtZW50YXRpb24vTWFjT1NYL0NvbmNlcHR1YWwvQlBGaWxlU3lzdGVtL2luZGV4Lmh0bWwKIyAtIFhERyBzcGVjIGZvciBVbip4OiBodHRwOi8vc3RhbmRhcmRzLmZyZWVkZXNrdG9wLm9yZy9iYXNlZGlyLXNwZWMvYmFzZWRpci1zcGVjLWxhdGVzdC5odG1sCgpfX3ZlcnNpb25faW5mb19fID0gKDEsIDQsIDMpCl9fdmVyc2lvbl9fID0gJy4nLmpvaW4obWFwKHN0ciwgX192ZXJzaW9uX2luZm9fXykpCgoKaW1wb3J0IHN5cwppbXBvcnQgb3MKClBZMyA9IHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMwoKaWYgUFkzOgogICAgdW5pY29kZSA9IHN0cgoKaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2phdmEnKToKICAgIGltcG9ydCBwbGF0Zm9ybQogICAgb3NfbmFtZSA9IHBsYXRmb3JtLmphdmFfdmVyKClbM11bMF0KICAgIGlmIG9zX25hbWUuc3RhcnRzd2l0aCgnV2luZG93cycpOiAjICJXaW5kb3dzIFhQIiwgIldpbmRvd3MgNyIsIGV0Yy4KICAgICAgICBzeXN0ZW0gPSAnd2luMzInCiAgICBlbGlmIG9zX25hbWUuc3RhcnRzd2l0aCgnTWFjJyk6ICMgIk1hYyBPUyBYIiwgZXRjLgogICAgICAgIHN5c3RlbSA9ICdkYXJ3aW4nCiAgICBlbHNlOiAjICJMaW51eCIsICJTdW5PUyIsICJGcmVlQlNEIiwgZXRjLgogICAgICAgICMgU2V0dGluZyB0aGlzIHRvICJsaW51eDIiIGlzIG5vdCBpZGVhbCwgYnV0IG9ubHkgV2luZG93cyBvciBNYWMKICAgICAgICAjIGFyZSBhY3R1YWxseSBjaGVja2VkIGZvciBhbmQgdGhlIHJlc3Qgb2YgdGhlIG1vZHVsZSBleHBlY3RzCiAgICAgICAgIyAqc3lzLnBsYXRmb3JtKiBzdHlsZSBzdHJpbmdzLgogICAgICAgIHN5c3RlbSA9ICdsaW51eDInCmVsc2U6CiAgICBzeXN0ZW0gPSBzeXMucGxhdGZvcm0KCgoKZGVmIHVzZXJfZGF0YV9kaXIoYXBwbmFtZT1Ob25lLCBhcHBhdXRob3I9Tm9uZSwgdmVyc2lvbj1Ob25lLCByb2FtaW5nPUZhbHNlKToKICAgIHIiIiJSZXR1cm4gZnVsbCBwYXRoIHRvIHRoZSB1c2VyLXNwZWNpZmljIGRhdGEgZGlyIGZvciB0aGlzIGFwcGxpY2F0aW9uLgoKICAgICAgICAiYXBwbmFtZSIgaXMgdGhlIG5hbWUgb2YgYXBwbGljYXRpb24uCiAgICAgICAgICAgIElmIE5vbmUsIGp1c3QgdGhlIHN5c3RlbSBkaXJlY3RvcnkgaXMgcmV0dXJuZWQuCiAgICAgICAgImFwcGF1dGhvciIgKG9ubHkgdXNlZCBvbiBXaW5kb3dzKSBpcyB0aGUgbmFtZSBvZiB0aGUKICAgICAgICAgICAgYXBwYXV0aG9yIG9yIGRpc3RyaWJ1dGluZyBib2R5IGZvciB0aGlzIGFwcGxpY2F0aW9uLiBUeXBpY2FsbHkKICAgICAgICAgICAgaXQgaXMgdGhlIG93bmluZyBjb21wYW55IG5hbWUuIFRoaXMgZmFsbHMgYmFjayB0byBhcHBuYW1lLiBZb3UgbWF5CiAgICAgICAgICAgIHBhc3MgRmFsc2UgdG8gZGlzYWJsZSBpdC4KICAgICAgICAidmVyc2lvbiIgaXMgYW4gb3B0aW9uYWwgdmVyc2lvbiBwYXRoIGVsZW1lbnQgdG8gYXBwZW5kIHRvIHRoZQogICAgICAgICAgICBwYXRoLiBZb3UgbWlnaHQgd2FudCB0byB1c2UgdGhpcyBpZiB5b3Ugd2FudCBtdWx0aXBsZSB2ZXJzaW9ucwogICAgICAgICAgICBvZiB5b3VyIGFwcCB0byBiZSBhYmxlIHRvIHJ1biBpbmRlcGVuZGVudGx5LiBJZiB1c2VkLCB0aGlzCiAgICAgICAgICAgIHdvdWxkIHR5cGljYWxseSBiZSAiPG1ham9yPi48bWlub3I+Ii4KICAgICAgICAgICAgT25seSBhcHBsaWVkIHdoZW4gYXBwbmFtZSBpcyBwcmVzZW50LgogICAgICAgICJyb2FtaW5nIiAoYm9vbGVhbiwgZGVmYXVsdCBGYWxzZSkgY2FuIGJlIHNldCBUcnVlIHRvIHVzZSB0aGUgV2luZG93cwogICAgICAgICAgICByb2FtaW5nIGFwcGRhdGEgZGlyZWN0b3J5LiBUaGF0IG1lYW5zIHRoYXQgZm9yIHVzZXJzIG9uIGEgV2luZG93cwogICAgICAgICAgICBuZXR3b3JrIHNldHVwIGZvciByb2FtaW5nIHByb2ZpbGVzLCB0aGlzIHVzZXIgZGF0YSB3aWxsIGJlCiAgICAgICAgICAgIHN5bmMnZCBvbiBsb2dpbi4gU2VlCiAgICAgICAgICAgIDxodHRwOi8vdGVjaG5ldC5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvY2M3NjY0ODkoV1MuMTApLmFzcHg+CiAgICAgICAgICAgIGZvciBhIGRpc2N1c3Npb24gb2YgaXNzdWVzLgoKICAgIFR5cGljYWwgdXNlciBkYXRhIGRpcmVjdG9yaWVzIGFyZToKICAgICAgICBNYWMgT1MgWDogICAgICAgICAgICAgICB+L0xpYnJhcnkvQXBwbGljYXRpb24gU3VwcG9ydC88QXBwTmFtZT4KICAgICAgICBVbml4OiAgICAgICAgICAgICAgICAgICB+Ly5sb2NhbC9zaGFyZS88QXBwTmFtZT4gICAgIyBvciBpbiAkWERHX0RBVEFfSE9NRSwgaWYgZGVmaW5lZAogICAgICAgIFdpbiBYUCAobm90IHJvYW1pbmcpOiAgIEM6XERvY3VtZW50cyBhbmQgU2V0dGluZ3NcPHVzZXJuYW1lPlxBcHBsaWNhdGlvbiBEYXRhXDxBcHBBdXRob3I+XDxBcHBOYW1lPgogICAgICAgIFdpbiBYUCAocm9hbWluZyk6ICAgICAgIEM6XERvY3VtZW50cyBhbmQgU2V0dGluZ3NcPHVzZXJuYW1lPlxMb2NhbCBTZXR0aW5nc1xBcHBsaWNhdGlvbiBEYXRhXDxBcHBBdXRob3I+XDxBcHBOYW1lPgogICAgICAgIFdpbiA3ICAobm90IHJvYW1pbmcpOiAgIEM6XFVzZXJzXDx1c2VybmFtZT5cQXBwRGF0YVxMb2NhbFw8QXBwQXV0aG9yPlw8QXBwTmFtZT4KICAgICAgICBXaW4gNyAgKHJvYW1pbmcpOiAgICAgICBDOlxVc2Vyc1w8dXNlcm5hbWU+XEFwcERhdGFcUm9hbWluZ1w8QXBwQXV0aG9yPlw8QXBwTmFtZT4KCiAgICBGb3IgVW5peCwgd2UgZm9sbG93IHRoZSBYREcgc3BlYyBhbmQgc3VwcG9ydCAkWERHX0RBVEFfSE9NRS4KICAgIFRoYXQgbWVhbnMsIGJ5IGRlZmF1bHQgIn4vLmxvY2FsL3NoYXJlLzxBcHBOYW1lPiIuCiAgICAiIiIKICAgIGlmIHN5c3RlbSA9PSAid2luMzIiOgogICAgICAgIGlmIGFwcGF1dGhvciBpcyBOb25lOgogICAgICAgICAgICBhcHBhdXRob3IgPSBhcHBuYW1lCiAgICAgICAgY29uc3QgPSByb2FtaW5nIGFuZCAiQ1NJRExfQVBQREFUQSIgb3IgIkNTSURMX0xPQ0FMX0FQUERBVEEiCiAgICAgICAgcGF0aCA9IG9zLnBhdGgubm9ybXBhdGgoX2dldF93aW5fZm9sZGVyKGNvbnN0KSkKICAgICAgICBpZiBhcHBuYW1lOgogICAgICAgICAgICBpZiBhcHBhdXRob3IgaXMgbm90IEZhbHNlOgogICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBhdXRob3IsIGFwcG5hbWUpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGFwcG5hbWUpCiAgICBlbGlmIHN5c3RlbSA9PSAnZGFyd2luJzoKICAgICAgICBwYXRoID0gb3MucGF0aC5leHBhbmR1c2VyKCd+L0xpYnJhcnkvQXBwbGljYXRpb24gU3VwcG9ydC8nKQogICAgICAgIGlmIGFwcG5hbWU6CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgYXBwbmFtZSkKICAgIGVsc2U6CiAgICAgICAgcGF0aCA9IG9zLmdldGVudignWERHX0RBVEFfSE9NRScsIG9zLnBhdGguZXhwYW5kdXNlcigifi8ubG9jYWwvc2hhcmUiKSkKICAgICAgICBpZiBhcHBuYW1lOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGFwcG5hbWUpCiAgICBpZiBhcHBuYW1lIGFuZCB2ZXJzaW9uOgogICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgdmVyc2lvbikKICAgIHJldHVybiBwYXRoCgoKZGVmIHNpdGVfZGF0YV9kaXIoYXBwbmFtZT1Ob25lLCBhcHBhdXRob3I9Tm9uZSwgdmVyc2lvbj1Ob25lLCBtdWx0aXBhdGg9RmFsc2UpOgogICAgciIiIlJldHVybiBmdWxsIHBhdGggdG8gdGhlIHVzZXItc2hhcmVkIGRhdGEgZGlyIGZvciB0aGlzIGFwcGxpY2F0aW9uLgoKICAgICAgICAiYXBwbmFtZSIgaXMgdGhlIG5hbWUgb2YgYXBwbGljYXRpb24uCiAgICAgICAgICAgIElmIE5vbmUsIGp1c3QgdGhlIHN5c3RlbSBkaXJlY3RvcnkgaXMgcmV0dXJuZWQuCiAgICAgICAgImFwcGF1dGhvciIgKG9ubHkgdXNlZCBvbiBXaW5kb3dzKSBpcyB0aGUgbmFtZSBvZiB0aGUKICAgICAgICAgICAgYXBwYXV0aG9yIG9yIGRpc3RyaWJ1dGluZyBib2R5IGZvciB0aGlzIGFwcGxpY2F0aW9uLiBUeXBpY2FsbHkKICAgICAgICAgICAgaXQgaXMgdGhlIG93bmluZyBjb21wYW55IG5hbWUuIFRoaXMgZmFsbHMgYmFjayB0byBhcHBuYW1lLiBZb3UgbWF5CiAgICAgICAgICAgIHBhc3MgRmFsc2UgdG8gZGlzYWJsZSBpdC4KICAgICAgICAidmVyc2lvbiIgaXMgYW4gb3B0aW9uYWwgdmVyc2lvbiBwYXRoIGVsZW1lbnQgdG8gYXBwZW5kIHRvIHRoZQogICAgICAgICAgICBwYXRoLiBZb3UgbWlnaHQgd2FudCB0byB1c2UgdGhpcyBpZiB5b3Ugd2FudCBtdWx0aXBsZSB2ZXJzaW9ucwogICAgICAgICAgICBvZiB5b3VyIGFwcCB0byBiZSBhYmxlIHRvIHJ1biBpbmRlcGVuZGVudGx5LiBJZiB1c2VkLCB0aGlzCiAgICAgICAgICAgIHdvdWxkIHR5cGljYWxseSBiZSAiPG1ham9yPi48bWlub3I+Ii4KICAgICAgICAgICAgT25seSBhcHBsaWVkIHdoZW4gYXBwbmFtZSBpcyBwcmVzZW50LgogICAgICAgICJtdWx0aXBhdGgiIGlzIGFuIG9wdGlvbmFsIHBhcmFtZXRlciBvbmx5IGFwcGxpY2FibGUgdG8gKm5peAogICAgICAgICAgICB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgZW50aXJlIGxpc3Qgb2YgZGF0YSBkaXJzIHNob3VsZCBiZQogICAgICAgICAgICByZXR1cm5lZC4gQnkgZGVmYXVsdCwgdGhlIGZpcnN0IGl0ZW0gZnJvbSBYREdfREFUQV9ESVJTIGlzCiAgICAgICAgICAgIHJldHVybmVkLCBvciAnL3Vzci9sb2NhbC9zaGFyZS88QXBwTmFtZT4nLAogICAgICAgICAgICBpZiBYREdfREFUQV9ESVJTIGlzIG5vdCBzZXQKCiAgICBUeXBpY2FsIHNpdGUgZGF0YSBkaXJlY3RvcmllcyBhcmU6CiAgICAgICAgTWFjIE9TIFg6ICAgL0xpYnJhcnkvQXBwbGljYXRpb24gU3VwcG9ydC88QXBwTmFtZT4KICAgICAgICBVbml4OiAgICAgICAvdXNyL2xvY2FsL3NoYXJlLzxBcHBOYW1lPiBvciAvdXNyL3NoYXJlLzxBcHBOYW1lPgogICAgICAgIFdpbiBYUDogICAgIEM6XERvY3VtZW50cyBhbmQgU2V0dGluZ3NcQWxsIFVzZXJzXEFwcGxpY2F0aW9uIERhdGFcPEFwcEF1dGhvcj5cPEFwcE5hbWU+CiAgICAgICAgVmlzdGE6ICAgICAgKEZhaWwhICJDOlxQcm9ncmFtRGF0YSIgaXMgYSBoaWRkZW4gKnN5c3RlbSogZGlyZWN0b3J5IG9uIFZpc3RhLikKICAgICAgICBXaW4gNzogICAgICBDOlxQcm9ncmFtRGF0YVw8QXBwQXV0aG9yPlw8QXBwTmFtZT4gICAjIEhpZGRlbiwgYnV0IHdyaXRlYWJsZSBvbiBXaW4gNy4KCiAgICBGb3IgVW5peCwgdGhpcyBpcyB1c2luZyB0aGUgJFhER19EQVRBX0RJUlNbMF0gZGVmYXVsdC4KCiAgICBXQVJOSU5HOiBEbyBub3QgdXNlIHRoaXMgb24gV2luZG93cy4gU2VlIHRoZSBWaXN0YS1GYWlsIG5vdGUgYWJvdmUgZm9yIHdoeS4KICAgICIiIgogICAgaWYgc3lzdGVtID09ICJ3aW4zMiI6CiAgICAgICAgaWYgYXBwYXV0aG9yIGlzIE5vbmU6CiAgICAgICAgICAgIGFwcGF1dGhvciA9IGFwcG5hbWUKICAgICAgICBwYXRoID0gb3MucGF0aC5ub3JtcGF0aChfZ2V0X3dpbl9mb2xkZXIoIkNTSURMX0NPTU1PTl9BUFBEQVRBIikpCiAgICAgICAgaWYgYXBwbmFtZToKICAgICAgICAgICAgaWYgYXBwYXV0aG9yIGlzIG5vdCBGYWxzZToKICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgYXBwYXV0aG9yLCBhcHBuYW1lKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBuYW1lKQogICAgZWxpZiBzeXN0ZW0gPT0gJ2Rhcndpbic6CiAgICAgICAgcGF0aCA9IG9zLnBhdGguZXhwYW5kdXNlcignL0xpYnJhcnkvQXBwbGljYXRpb24gU3VwcG9ydCcpCiAgICAgICAgaWYgYXBwbmFtZToKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBuYW1lKQogICAgZWxzZToKICAgICAgICAjIFhERyBkZWZhdWx0IGZvciAkWERHX0RBVEFfRElSUwogICAgICAgICMgb25seSBmaXJzdCwgaWYgbXVsdGlwYXRoIGlzIEZhbHNlCiAgICAgICAgcGF0aCA9IG9zLmdldGVudignWERHX0RBVEFfRElSUycsCiAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoc2VwLmpvaW4oWycvdXNyL2xvY2FsL3NoYXJlJywgJy91c3Ivc2hhcmUnXSkpCiAgICAgICAgcGF0aGxpc3QgPSBbb3MucGF0aC5leHBhbmR1c2VyKHgucnN0cmlwKG9zLnNlcCkpIGZvciB4IGluIHBhdGguc3BsaXQob3MucGF0aHNlcCldCiAgICAgICAgaWYgYXBwbmFtZToKICAgICAgICAgICAgaWYgdmVyc2lvbjoKICAgICAgICAgICAgICAgIGFwcG5hbWUgPSBvcy5wYXRoLmpvaW4oYXBwbmFtZSwgdmVyc2lvbikKICAgICAgICAgICAgcGF0aGxpc3QgPSBbb3Muc2VwLmpvaW4oW3gsIGFwcG5hbWVdKSBmb3IgeCBpbiBwYXRobGlzdF0KCiAgICAgICAgaWYgbXVsdGlwYXRoOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aHNlcC5qb2luKHBhdGhsaXN0KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHBhdGggPSBwYXRobGlzdFswXQogICAgICAgIHJldHVybiBwYXRoCgogICAgaWYgYXBwbmFtZSBhbmQgdmVyc2lvbjoKICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIHZlcnNpb24pCiAgICByZXR1cm4gcGF0aAoKCmRlZiB1c2VyX2NvbmZpZ19kaXIoYXBwbmFtZT1Ob25lLCBhcHBhdXRob3I9Tm9uZSwgdmVyc2lvbj1Ob25lLCByb2FtaW5nPUZhbHNlKToKICAgIHIiIiJSZXR1cm4gZnVsbCBwYXRoIHRvIHRoZSB1c2VyLXNwZWNpZmljIGNvbmZpZyBkaXIgZm9yIHRoaXMgYXBwbGljYXRpb24uCgogICAgICAgICJhcHBuYW1lIiBpcyB0aGUgbmFtZSBvZiBhcHBsaWNhdGlvbi4KICAgICAgICAgICAgSWYgTm9uZSwganVzdCB0aGUgc3lzdGVtIGRpcmVjdG9yeSBpcyByZXR1cm5lZC4KICAgICAgICAiYXBwYXV0aG9yIiAob25seSB1c2VkIG9uIFdpbmRvd3MpIGlzIHRoZSBuYW1lIG9mIHRoZQogICAgICAgICAgICBhcHBhdXRob3Igb3IgZGlzdHJpYnV0aW5nIGJvZHkgZm9yIHRoaXMgYXBwbGljYXRpb24uIFR5cGljYWxseQogICAgICAgICAgICBpdCBpcyB0aGUgb3duaW5nIGNvbXBhbnkgbmFtZS4gVGhpcyBmYWxscyBiYWNrIHRvIGFwcG5hbWUuIFlvdSBtYXkKICAgICAgICAgICAgcGFzcyBGYWxzZSB0byBkaXNhYmxlIGl0LgogICAgICAgICJ2ZXJzaW9uIiBpcyBhbiBvcHRpb25hbCB2ZXJzaW9uIHBhdGggZWxlbWVudCB0byBhcHBlbmQgdG8gdGhlCiAgICAgICAgICAgIHBhdGguIFlvdSBtaWdodCB3YW50IHRvIHVzZSB0aGlzIGlmIHlvdSB3YW50IG11bHRpcGxlIHZlcnNpb25zCiAgICAgICAgICAgIG9mIHlvdXIgYXBwIHRvIGJlIGFibGUgdG8gcnVuIGluZGVwZW5kZW50bHkuIElmIHVzZWQsIHRoaXMKICAgICAgICAgICAgd291bGQgdHlwaWNhbGx5IGJlICI8bWFqb3I+LjxtaW5vcj4iLgogICAgICAgICAgICBPbmx5IGFwcGxpZWQgd2hlbiBhcHBuYW1lIGlzIHByZXNlbnQuCiAgICAgICAgInJvYW1pbmciIChib29sZWFuLCBkZWZhdWx0IEZhbHNlKSBjYW4gYmUgc2V0IFRydWUgdG8gdXNlIHRoZSBXaW5kb3dzCiAgICAgICAgICAgIHJvYW1pbmcgYXBwZGF0YSBkaXJlY3RvcnkuIFRoYXQgbWVhbnMgdGhhdCBmb3IgdXNlcnMgb24gYSBXaW5kb3dzCiAgICAgICAgICAgIG5ldHdvcmsgc2V0dXAgZm9yIHJvYW1pbmcgcHJvZmlsZXMsIHRoaXMgdXNlciBkYXRhIHdpbGwgYmUKICAgICAgICAgICAgc3luYydkIG9uIGxvZ2luLiBTZWUKICAgICAgICAgICAgPGh0dHA6Ly90ZWNobmV0Lm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9jYzc2NjQ4OShXUy4xMCkuYXNweD4KICAgICAgICAgICAgZm9yIGEgZGlzY3Vzc2lvbiBvZiBpc3N1ZXMuCgogICAgVHlwaWNhbCB1c2VyIGNvbmZpZyBkaXJlY3RvcmllcyBhcmU6CiAgICAgICAgTWFjIE9TIFg6ICAgICAgICAgICAgICAgc2FtZSBhcyB1c2VyX2RhdGFfZGlyCiAgICAgICAgVW5peDogICAgICAgICAgICAgICAgICAgfi8uY29uZmlnLzxBcHBOYW1lPiAgICAgIyBvciBpbiAkWERHX0NPTkZJR19IT01FLCBpZiBkZWZpbmVkCiAgICAgICAgV2luICo6ICAgICAgICAgICAgICAgICAgc2FtZSBhcyB1c2VyX2RhdGFfZGlyCgogICAgRm9yIFVuaXgsIHdlIGZvbGxvdyB0aGUgWERHIHNwZWMgYW5kIHN1cHBvcnQgJFhER19DT05GSUdfSE9NRS4KICAgIFRoYXQgbWVhbnMsIGJ5IGRlZmF1bHQgIn4vLmNvbmZpZy88QXBwTmFtZT4iLgogICAgIiIiCiAgICBpZiBzeXN0ZW0gaW4gWyJ3aW4zMiIsICJkYXJ3aW4iXToKICAgICAgICBwYXRoID0gdXNlcl9kYXRhX2RpcihhcHBuYW1lLCBhcHBhdXRob3IsIE5vbmUsIHJvYW1pbmcpCiAgICBlbHNlOgogICAgICAgIHBhdGggPSBvcy5nZXRlbnYoJ1hER19DT05GSUdfSE9NRScsIG9zLnBhdGguZXhwYW5kdXNlcigifi8uY29uZmlnIikpCiAgICAgICAgaWYgYXBwbmFtZToKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBuYW1lKQogICAgaWYgYXBwbmFtZSBhbmQgdmVyc2lvbjoKICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIHZlcnNpb24pCiAgICByZXR1cm4gcGF0aAoKCmRlZiBzaXRlX2NvbmZpZ19kaXIoYXBwbmFtZT1Ob25lLCBhcHBhdXRob3I9Tm9uZSwgdmVyc2lvbj1Ob25lLCBtdWx0aXBhdGg9RmFsc2UpOgogICAgciIiIlJldHVybiBmdWxsIHBhdGggdG8gdGhlIHVzZXItc2hhcmVkIGRhdGEgZGlyIGZvciB0aGlzIGFwcGxpY2F0aW9uLgoKICAgICAgICAiYXBwbmFtZSIgaXMgdGhlIG5hbWUgb2YgYXBwbGljYXRpb24uCiAgICAgICAgICAgIElmIE5vbmUsIGp1c3QgdGhlIHN5c3RlbSBkaXJlY3RvcnkgaXMgcmV0dXJuZWQuCiAgICAgICAgImFwcGF1dGhvciIgKG9ubHkgdXNlZCBvbiBXaW5kb3dzKSBpcyB0aGUgbmFtZSBvZiB0aGUKICAgICAgICAgICAgYXBwYXV0aG9yIG9yIGRpc3RyaWJ1dGluZyBib2R5IGZvciB0aGlzIGFwcGxpY2F0aW9uLiBUeXBpY2FsbHkKICAgICAgICAgICAgaXQgaXMgdGhlIG93bmluZyBjb21wYW55IG5hbWUuIFRoaXMgZmFsbHMgYmFjayB0byBhcHBuYW1lLiBZb3UgbWF5CiAgICAgICAgICAgIHBhc3MgRmFsc2UgdG8gZGlzYWJsZSBpdC4KICAgICAgICAidmVyc2lvbiIgaXMgYW4gb3B0aW9uYWwgdmVyc2lvbiBwYXRoIGVsZW1lbnQgdG8gYXBwZW5kIHRvIHRoZQogICAgICAgICAgICBwYXRoLiBZb3UgbWlnaHQgd2FudCB0byB1c2UgdGhpcyBpZiB5b3Ugd2FudCBtdWx0aXBsZSB2ZXJzaW9ucwogICAgICAgICAgICBvZiB5b3VyIGFwcCB0byBiZSBhYmxlIHRvIHJ1biBpbmRlcGVuZGVudGx5LiBJZiB1c2VkLCB0aGlzCiAgICAgICAgICAgIHdvdWxkIHR5cGljYWxseSBiZSAiPG1ham9yPi48bWlub3I+Ii4KICAgICAgICAgICAgT25seSBhcHBsaWVkIHdoZW4gYXBwbmFtZSBpcyBwcmVzZW50LgogICAgICAgICJtdWx0aXBhdGgiIGlzIGFuIG9wdGlvbmFsIHBhcmFtZXRlciBvbmx5IGFwcGxpY2FibGUgdG8gKm5peAogICAgICAgICAgICB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgZW50aXJlIGxpc3Qgb2YgY29uZmlnIGRpcnMgc2hvdWxkIGJlCiAgICAgICAgICAgIHJldHVybmVkLiBCeSBkZWZhdWx0LCB0aGUgZmlyc3QgaXRlbSBmcm9tIFhER19DT05GSUdfRElSUyBpcwogICAgICAgICAgICByZXR1cm5lZCwgb3IgJy9ldGMveGRnLzxBcHBOYW1lPicsIGlmIFhER19DT05GSUdfRElSUyBpcyBub3Qgc2V0CgogICAgVHlwaWNhbCBzaXRlIGNvbmZpZyBkaXJlY3RvcmllcyBhcmU6CiAgICAgICAgTWFjIE9TIFg6ICAgc2FtZSBhcyBzaXRlX2RhdGFfZGlyCiAgICAgICAgVW5peDogICAgICAgL2V0Yy94ZGcvPEFwcE5hbWU+IG9yICRYREdfQ09ORklHX0RJUlNbaV0vPEFwcE5hbWU+IGZvciBlYWNoIHZhbHVlIGluCiAgICAgICAgICAgICAgICAgICAgJFhER19DT05GSUdfRElSUwogICAgICAgIFdpbiAqOiAgICAgIHNhbWUgYXMgc2l0ZV9kYXRhX2RpcgogICAgICAgIFZpc3RhOiAgICAgIChGYWlsISAiQzpcUHJvZ3JhbURhdGEiIGlzIGEgaGlkZGVuICpzeXN0ZW0qIGRpcmVjdG9yeSBvbiBWaXN0YS4pCgogICAgRm9yIFVuaXgsIHRoaXMgaXMgdXNpbmcgdGhlICRYREdfQ09ORklHX0RJUlNbMF0gZGVmYXVsdCwgaWYgbXVsdGlwYXRoPUZhbHNlCgogICAgV0FSTklORzogRG8gbm90IHVzZSB0aGlzIG9uIFdpbmRvd3MuIFNlZSB0aGUgVmlzdGEtRmFpbCBub3RlIGFib3ZlIGZvciB3aHkuCiAgICAiIiIKICAgIGlmIHN5c3RlbSBpbiBbIndpbjMyIiwgImRhcndpbiJdOgogICAgICAgIHBhdGggPSBzaXRlX2RhdGFfZGlyKGFwcG5hbWUsIGFwcGF1dGhvcikKICAgICAgICBpZiBhcHBuYW1lIGFuZCB2ZXJzaW9uOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIHZlcnNpb24pCiAgICBlbHNlOgogICAgICAgICMgWERHIGRlZmF1bHQgZm9yICRYREdfQ09ORklHX0RJUlMKICAgICAgICAjIG9ubHkgZmlyc3QsIGlmIG11bHRpcGF0aCBpcyBGYWxzZQogICAgICAgIHBhdGggPSBvcy5nZXRlbnYoJ1hER19DT05GSUdfRElSUycsICcvZXRjL3hkZycpCiAgICAgICAgcGF0aGxpc3QgPSBbb3MucGF0aC5leHBhbmR1c2VyKHgucnN0cmlwKG9zLnNlcCkpIGZvciB4IGluIHBhdGguc3BsaXQob3MucGF0aHNlcCldCiAgICAgICAgaWYgYXBwbmFtZToKICAgICAgICAgICAgaWYgdmVyc2lvbjoKICAgICAgICAgICAgICAgIGFwcG5hbWUgPSBvcy5wYXRoLmpvaW4oYXBwbmFtZSwgdmVyc2lvbikKICAgICAgICAgICAgcGF0aGxpc3QgPSBbb3Muc2VwLmpvaW4oW3gsIGFwcG5hbWVdKSBmb3IgeCBpbiBwYXRobGlzdF0KCiAgICAgICAgaWYgbXVsdGlwYXRoOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aHNlcC5qb2luKHBhdGhsaXN0KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHBhdGggPSBwYXRobGlzdFswXQogICAgcmV0dXJuIHBhdGgKCgpkZWYgdXNlcl9jYWNoZV9kaXIoYXBwbmFtZT1Ob25lLCBhcHBhdXRob3I9Tm9uZSwgdmVyc2lvbj1Ob25lLCBvcGluaW9uPVRydWUpOgogICAgciIiIlJldHVybiBmdWxsIHBhdGggdG8gdGhlIHVzZXItc3BlY2lmaWMgY2FjaGUgZGlyIGZvciB0aGlzIGFwcGxpY2F0aW9uLgoKICAgICAgICAiYXBwbmFtZSIgaXMgdGhlIG5hbWUgb2YgYXBwbGljYXRpb24uCiAgICAgICAgICAgIElmIE5vbmUsIGp1c3QgdGhlIHN5c3RlbSBkaXJlY3RvcnkgaXMgcmV0dXJuZWQuCiAgICAgICAgImFwcGF1dGhvciIgKG9ubHkgdXNlZCBvbiBXaW5kb3dzKSBpcyB0aGUgbmFtZSBvZiB0aGUKICAgICAgICAgICAgYXBwYXV0aG9yIG9yIGRpc3RyaWJ1dGluZyBib2R5IGZvciB0aGlzIGFwcGxpY2F0aW9uLiBUeXBpY2FsbHkKICAgICAgICAgICAgaXQgaXMgdGhlIG93bmluZyBjb21wYW55IG5hbWUuIFRoaXMgZmFsbHMgYmFjayB0byBhcHBuYW1lLiBZb3UgbWF5CiAgICAgICAgICAgIHBhc3MgRmFsc2UgdG8gZGlzYWJsZSBpdC4KICAgICAgICAidmVyc2lvbiIgaXMgYW4gb3B0aW9uYWwgdmVyc2lvbiBwYXRoIGVsZW1lbnQgdG8gYXBwZW5kIHRvIHRoZQogICAgICAgICAgICBwYXRoLiBZb3UgbWlnaHQgd2FudCB0byB1c2UgdGhpcyBpZiB5b3Ugd2FudCBtdWx0aXBsZSB2ZXJzaW9ucwogICAgICAgICAgICBvZiB5b3VyIGFwcCB0byBiZSBhYmxlIHRvIHJ1biBpbmRlcGVuZGVudGx5LiBJZiB1c2VkLCB0aGlzCiAgICAgICAgICAgIHdvdWxkIHR5cGljYWxseSBiZSAiPG1ham9yPi48bWlub3I+Ii4KICAgICAgICAgICAgT25seSBhcHBsaWVkIHdoZW4gYXBwbmFtZSBpcyBwcmVzZW50LgogICAgICAgICJvcGluaW9uIiAoYm9vbGVhbikgY2FuIGJlIEZhbHNlIHRvIGRpc2FibGUgdGhlIGFwcGVuZGluZyBvZgogICAgICAgICAgICAiQ2FjaGUiIHRvIHRoZSBiYXNlIGFwcCBkYXRhIGRpciBmb3IgV2luZG93cy4gU2VlCiAgICAgICAgICAgIGRpc2N1c3Npb24gYmVsb3cuCgogICAgVHlwaWNhbCB1c2VyIGNhY2hlIGRpcmVjdG9yaWVzIGFyZToKICAgICAgICBNYWMgT1MgWDogICB+L0xpYnJhcnkvQ2FjaGVzLzxBcHBOYW1lPgogICAgICAgIFVuaXg6ICAgICAgIH4vLmNhY2hlLzxBcHBOYW1lPiAoWERHIGRlZmF1bHQpCiAgICAgICAgV2luIFhQOiAgICAgQzpcRG9jdW1lbnRzIGFuZCBTZXR0aW5nc1w8dXNlcm5hbWU+XExvY2FsIFNldHRpbmdzXEFwcGxpY2F0aW9uIERhdGFcPEFwcEF1dGhvcj5cPEFwcE5hbWU+XENhY2hlCiAgICAgICAgVmlzdGE6ICAgICAgQzpcVXNlcnNcPHVzZXJuYW1lPlxBcHBEYXRhXExvY2FsXDxBcHBBdXRob3I+XDxBcHBOYW1lPlxDYWNoZQoKICAgIE9uIFdpbmRvd3MgdGhlIG9ubHkgc3VnZ2VzdGlvbiBpbiB0aGUgTVNETiBkb2NzIGlzIHRoYXQgbG9jYWwgc2V0dGluZ3MgZ28gaW4KICAgIHRoZSBgQ1NJRExfTE9DQUxfQVBQREFUQWAgZGlyZWN0b3J5LiBUaGlzIGlzIGlkZW50aWNhbCB0byB0aGUgbm9uLXJvYW1pbmcKICAgIGFwcCBkYXRhIGRpciAodGhlIGRlZmF1bHQgcmV0dXJuZWQgYnkgYHVzZXJfZGF0YV9kaXJgIGFib3ZlKS4gQXBwcyB0eXBpY2FsbHkKICAgIHB1dCBjYWNoZSBkYXRhIHNvbWV3aGVyZSAqdW5kZXIqIHRoZSBnaXZlbiBkaXIgaGVyZS4gU29tZSBleGFtcGxlczoKICAgICAgICAuLi5cTW96aWxsYVxGaXJlZm94XFByb2ZpbGVzXDxQcm9maWxlTmFtZT5cQ2FjaGUKICAgICAgICAuLi5cQWNtZVxTdXBlckFwcFxDYWNoZVwxLjAKICAgIE9QSU5JT046IFRoaXMgZnVuY3Rpb24gYXBwZW5kcyAiQ2FjaGUiIHRvIHRoZSBgQ1NJRExfTE9DQUxfQVBQREFUQWAgdmFsdWUuCiAgICBUaGlzIGNhbiBiZSBkaXNhYmxlZCB3aXRoIHRoZSBgb3Bpbmlvbj1GYWxzZWAgb3B0aW9uLgogICAgIiIiCiAgICBpZiBzeXN0ZW0gPT0gIndpbjMyIjoKICAgICAgICBpZiBhcHBhdXRob3IgaXMgTm9uZToKICAgICAgICAgICAgYXBwYXV0aG9yID0gYXBwbmFtZQogICAgICAgIHBhdGggPSBvcy5wYXRoLm5vcm1wYXRoKF9nZXRfd2luX2ZvbGRlcigiQ1NJRExfTE9DQUxfQVBQREFUQSIpKQogICAgICAgIGlmIGFwcG5hbWU6CiAgICAgICAgICAgIGlmIGFwcGF1dGhvciBpcyBub3QgRmFsc2U6CiAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGFwcGF1dGhvciwgYXBwbmFtZSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgYXBwbmFtZSkKICAgICAgICAgICAgaWYgb3BpbmlvbjoKICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgIkNhY2hlIikKICAgIGVsaWYgc3lzdGVtID09ICdkYXJ3aW4nOgogICAgICAgIHBhdGggPSBvcy5wYXRoLmV4cGFuZHVzZXIoJ34vTGlicmFyeS9DYWNoZXMnKQogICAgICAgIGlmIGFwcG5hbWU6CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgYXBwbmFtZSkKICAgIGVsc2U6CiAgICAgICAgcGF0aCA9IG9zLmdldGVudignWERHX0NBQ0hFX0hPTUUnLCBvcy5wYXRoLmV4cGFuZHVzZXIoJ34vLmNhY2hlJykpCiAgICAgICAgaWYgYXBwbmFtZToKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBuYW1lKQogICAgaWYgYXBwbmFtZSBhbmQgdmVyc2lvbjoKICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIHZlcnNpb24pCiAgICByZXR1cm4gcGF0aAoKCmRlZiB1c2VyX3N0YXRlX2RpcihhcHBuYW1lPU5vbmUsIGFwcGF1dGhvcj1Ob25lLCB2ZXJzaW9uPU5vbmUsIHJvYW1pbmc9RmFsc2UpOgogICAgciIiIlJldHVybiBmdWxsIHBhdGggdG8gdGhlIHVzZXItc3BlY2lmaWMgc3RhdGUgZGlyIGZvciB0aGlzIGFwcGxpY2F0aW9uLgoKICAgICAgICAiYXBwbmFtZSIgaXMgdGhlIG5hbWUgb2YgYXBwbGljYXRpb24uCiAgICAgICAgICAgIElmIE5vbmUsIGp1c3QgdGhlIHN5c3RlbSBkaXJlY3RvcnkgaXMgcmV0dXJuZWQuCiAgICAgICAgImFwcGF1dGhvciIgKG9ubHkgdXNlZCBvbiBXaW5kb3dzKSBpcyB0aGUgbmFtZSBvZiB0aGUKICAgICAgICAgICAgYXBwYXV0aG9yIG9yIGRpc3RyaWJ1dGluZyBib2R5IGZvciB0aGlzIGFwcGxpY2F0aW9uLiBUeXBpY2FsbHkKICAgICAgICAgICAgaXQgaXMgdGhlIG93bmluZyBjb21wYW55IG5hbWUuIFRoaXMgZmFsbHMgYmFjayB0byBhcHBuYW1lLiBZb3UgbWF5CiAgICAgICAgICAgIHBhc3MgRmFsc2UgdG8gZGlzYWJsZSBpdC4KICAgICAgICAidmVyc2lvbiIgaXMgYW4gb3B0aW9uYWwgdmVyc2lvbiBwYXRoIGVsZW1lbnQgdG8gYXBwZW5kIHRvIHRoZQogICAgICAgICAgICBwYXRoLiBZb3UgbWlnaHQgd2FudCB0byB1c2UgdGhpcyBpZiB5b3Ugd2FudCBtdWx0aXBsZSB2ZXJzaW9ucwogICAgICAgICAgICBvZiB5b3VyIGFwcCB0byBiZSBhYmxlIHRvIHJ1biBpbmRlcGVuZGVudGx5LiBJZiB1c2VkLCB0aGlzCiAgICAgICAgICAgIHdvdWxkIHR5cGljYWxseSBiZSAiPG1ham9yPi48bWlub3I+Ii4KICAgICAgICAgICAgT25seSBhcHBsaWVkIHdoZW4gYXBwbmFtZSBpcyBwcmVzZW50LgogICAgICAgICJyb2FtaW5nIiAoYm9vbGVhbiwgZGVmYXVsdCBGYWxzZSkgY2FuIGJlIHNldCBUcnVlIHRvIHVzZSB0aGUgV2luZG93cwogICAgICAgICAgICByb2FtaW5nIGFwcGRhdGEgZGlyZWN0b3J5LiBUaGF0IG1lYW5zIHRoYXQgZm9yIHVzZXJzIG9uIGEgV2luZG93cwogICAgICAgICAgICBuZXR3b3JrIHNldHVwIGZvciByb2FtaW5nIHByb2ZpbGVzLCB0aGlzIHVzZXIgZGF0YSB3aWxsIGJlCiAgICAgICAgICAgIHN5bmMnZCBvbiBsb2dpbi4gU2VlCiAgICAgICAgICAgIDxodHRwOi8vdGVjaG5ldC5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvY2M3NjY0ODkoV1MuMTApLmFzcHg+CiAgICAgICAgICAgIGZvciBhIGRpc2N1c3Npb24gb2YgaXNzdWVzLgoKICAgIFR5cGljYWwgdXNlciBzdGF0ZSBkaXJlY3RvcmllcyBhcmU6CiAgICAgICAgTWFjIE9TIFg6ICBzYW1lIGFzIHVzZXJfZGF0YV9kaXIKICAgICAgICBVbml4OiAgICAgIH4vLmxvY2FsL3N0YXRlLzxBcHBOYW1lPiAgICMgb3IgaW4gJFhER19TVEFURV9IT01FLCBpZiBkZWZpbmVkCiAgICAgICAgV2luICo6ICAgICBzYW1lIGFzIHVzZXJfZGF0YV9kaXIKCiAgICBGb3IgVW5peCwgd2UgZm9sbG93IHRoaXMgRGViaWFuIHByb3Bvc2FsIDxodHRwczovL3dpa2kuZGViaWFuLm9yZy9YREdCYXNlRGlyZWN0b3J5U3BlY2lmaWNhdGlvbiNzdGF0ZT4KICAgIHRvIGV4dGVuZCB0aGUgWERHIHNwZWMgYW5kIHN1cHBvcnQgJFhER19TVEFURV9IT01FLgoKICAgIFRoYXQgbWVhbnMsIGJ5IGRlZmF1bHQgIn4vLmxvY2FsL3N0YXRlLzxBcHBOYW1lPiIuCiAgICAiIiIKICAgIGlmIHN5c3RlbSBpbiBbIndpbjMyIiwgImRhcndpbiJdOgogICAgICAgIHBhdGggPSB1c2VyX2RhdGFfZGlyKGFwcG5hbWUsIGFwcGF1dGhvciwgTm9uZSwgcm9hbWluZykKICAgIGVsc2U6CiAgICAgICAgcGF0aCA9IG9zLmdldGVudignWERHX1NUQVRFX0hPTUUnLCBvcy5wYXRoLmV4cGFuZHVzZXIoIn4vLmxvY2FsL3N0YXRlIikpCiAgICAgICAgaWYgYXBwbmFtZToKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBuYW1lKQogICAgaWYgYXBwbmFtZSBhbmQgdmVyc2lvbjoKICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIHZlcnNpb24pCiAgICByZXR1cm4gcGF0aAoKCmRlZiB1c2VyX2xvZ19kaXIoYXBwbmFtZT1Ob25lLCBhcHBhdXRob3I9Tm9uZSwgdmVyc2lvbj1Ob25lLCBvcGluaW9uPVRydWUpOgogICAgciIiIlJldHVybiBmdWxsIHBhdGggdG8gdGhlIHVzZXItc3BlY2lmaWMgbG9nIGRpciBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KCiAgICAgICAgImFwcG5hbWUiIGlzIHRoZSBuYW1lIG9mIGFwcGxpY2F0aW9uLgogICAgICAgICAgICBJZiBOb25lLCBqdXN0IHRoZSBzeXN0ZW0gZGlyZWN0b3J5IGlzIHJldHVybmVkLgogICAgICAgICJhcHBhdXRob3IiIChvbmx5IHVzZWQgb24gV2luZG93cykgaXMgdGhlIG5hbWUgb2YgdGhlCiAgICAgICAgICAgIGFwcGF1dGhvciBvciBkaXN0cmlidXRpbmcgYm9keSBmb3IgdGhpcyBhcHBsaWNhdGlvbi4gVHlwaWNhbGx5CiAgICAgICAgICAgIGl0IGlzIHRoZSBvd25pbmcgY29tcGFueSBuYW1lLiBUaGlzIGZhbGxzIGJhY2sgdG8gYXBwbmFtZS4gWW91IG1heQogICAgICAgICAgICBwYXNzIEZhbHNlIHRvIGRpc2FibGUgaXQuCiAgICAgICAgInZlcnNpb24iIGlzIGFuIG9wdGlvbmFsIHZlcnNpb24gcGF0aCBlbGVtZW50IHRvIGFwcGVuZCB0byB0aGUKICAgICAgICAgICAgcGF0aC4gWW91IG1pZ2h0IHdhbnQgdG8gdXNlIHRoaXMgaWYgeW91IHdhbnQgbXVsdGlwbGUgdmVyc2lvbnMKICAgICAgICAgICAgb2YgeW91ciBhcHAgdG8gYmUgYWJsZSB0byBydW4gaW5kZXBlbmRlbnRseS4gSWYgdXNlZCwgdGhpcwogICAgICAgICAgICB3b3VsZCB0eXBpY2FsbHkgYmUgIjxtYWpvcj4uPG1pbm9yPiIuCiAgICAgICAgICAgIE9ubHkgYXBwbGllZCB3aGVuIGFwcG5hbWUgaXMgcHJlc2VudC4KICAgICAgICAib3BpbmlvbiIgKGJvb2xlYW4pIGNhbiBiZSBGYWxzZSB0byBkaXNhYmxlIHRoZSBhcHBlbmRpbmcgb2YKICAgICAgICAgICAgIkxvZ3MiIHRvIHRoZSBiYXNlIGFwcCBkYXRhIGRpciBmb3IgV2luZG93cywgYW5kICJsb2ciIHRvIHRoZQogICAgICAgICAgICBiYXNlIGNhY2hlIGRpciBmb3IgVW5peC4gU2VlIGRpc2N1c3Npb24gYmVsb3cuCgogICAgVHlwaWNhbCB1c2VyIGxvZyBkaXJlY3RvcmllcyBhcmU6CiAgICAgICAgTWFjIE9TIFg6ICAgfi9MaWJyYXJ5L0xvZ3MvPEFwcE5hbWU+CiAgICAgICAgVW5peDogICAgICAgfi8uY2FjaGUvPEFwcE5hbWU+L2xvZyAgIyBvciB1bmRlciAkWERHX0NBQ0hFX0hPTUUgaWYgZGVmaW5lZAogICAgICAgIFdpbiBYUDogICAgIEM6XERvY3VtZW50cyBhbmQgU2V0dGluZ3NcPHVzZXJuYW1lPlxMb2NhbCBTZXR0aW5nc1xBcHBsaWNhdGlvbiBEYXRhXDxBcHBBdXRob3I+XDxBcHBOYW1lPlxMb2dzCiAgICAgICAgVmlzdGE6ICAgICAgQzpcVXNlcnNcPHVzZXJuYW1lPlxBcHBEYXRhXExvY2FsXDxBcHBBdXRob3I+XDxBcHBOYW1lPlxMb2dzCgogICAgT24gV2luZG93cyB0aGUgb25seSBzdWdnZXN0aW9uIGluIHRoZSBNU0ROIGRvY3MgaXMgdGhhdCBsb2NhbCBzZXR0aW5ncwogICAgZ28gaW4gdGhlIGBDU0lETF9MT0NBTF9BUFBEQVRBYCBkaXJlY3RvcnkuIChOb3RlOiBJJ20gaW50ZXJlc3RlZCBpbgogICAgZXhhbXBsZXMgb2Ygd2hhdCBzb21lIHdpbmRvd3MgYXBwcyB1c2UgZm9yIGEgbG9ncyBkaXIuKQoKICAgIE9QSU5JT046IFRoaXMgZnVuY3Rpb24gYXBwZW5kcyAiTG9ncyIgdG8gdGhlIGBDU0lETF9MT0NBTF9BUFBEQVRBYAogICAgdmFsdWUgZm9yIFdpbmRvd3MgYW5kIGFwcGVuZHMgImxvZyIgdG8gdGhlIHVzZXIgY2FjaGUgZGlyIGZvciBVbml4LgogICAgVGhpcyBjYW4gYmUgZGlzYWJsZWQgd2l0aCB0aGUgYG9waW5pb249RmFsc2VgIG9wdGlvbi4KICAgICIiIgogICAgaWYgc3lzdGVtID09ICJkYXJ3aW4iOgogICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgIG9zLnBhdGguZXhwYW5kdXNlcignfi9MaWJyYXJ5L0xvZ3MnKSwKICAgICAgICAgICAgYXBwbmFtZSkKICAgIGVsaWYgc3lzdGVtID09ICJ3aW4zMiI6CiAgICAgICAgcGF0aCA9IHVzZXJfZGF0YV9kaXIoYXBwbmFtZSwgYXBwYXV0aG9yLCB2ZXJzaW9uKQogICAgICAgIHZlcnNpb24gPSBGYWxzZQogICAgICAgIGlmIG9waW5pb246CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgIkxvZ3MiKQogICAgZWxzZToKICAgICAgICBwYXRoID0gdXNlcl9jYWNoZV9kaXIoYXBwbmFtZSwgYXBwYXV0aG9yLCB2ZXJzaW9uKQogICAgICAgIHZlcnNpb24gPSBGYWxzZQogICAgICAgIGlmIG9waW5pb246CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgImxvZyIpCiAgICBpZiBhcHBuYW1lIGFuZCB2ZXJzaW9uOgogICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgdmVyc2lvbikKICAgIHJldHVybiBwYXRoCgoKY2xhc3MgQXBwRGlycyhvYmplY3QpOgogICAgIiIiQ29udmVuaWVuY2Ugd3JhcHBlciBmb3IgZ2V0dGluZyBhcHBsaWNhdGlvbiBkaXJzLiIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGFwcG5hbWU9Tm9uZSwgYXBwYXV0aG9yPU5vbmUsIHZlcnNpb249Tm9uZSwKICAgICAgICAgICAgcm9hbWluZz1GYWxzZSwgbXVsdGlwYXRoPUZhbHNlKToKICAgICAgICBzZWxmLmFwcG5hbWUgPSBhcHBuYW1lCiAgICAgICAgc2VsZi5hcHBhdXRob3IgPSBhcHBhdXRob3IKICAgICAgICBzZWxmLnZlcnNpb24gPSB2ZXJzaW9uCiAgICAgICAgc2VsZi5yb2FtaW5nID0gcm9hbWluZwogICAgICAgIHNlbGYubXVsdGlwYXRoID0gbXVsdGlwYXRoCgogICAgQHByb3BlcnR5CiAgICBkZWYgdXNlcl9kYXRhX2RpcihzZWxmKToKICAgICAgICByZXR1cm4gdXNlcl9kYXRhX2RpcihzZWxmLmFwcG5hbWUsIHNlbGYuYXBwYXV0aG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb249c2VsZi52ZXJzaW9uLCByb2FtaW5nPXNlbGYucm9hbWluZykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBzaXRlX2RhdGFfZGlyKHNlbGYpOgogICAgICAgIHJldHVybiBzaXRlX2RhdGFfZGlyKHNlbGYuYXBwbmFtZSwgc2VsZi5hcHBhdXRob3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj1zZWxmLnZlcnNpb24sIG11bHRpcGF0aD1zZWxmLm11bHRpcGF0aCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiB1c2VyX2NvbmZpZ19kaXIoc2VsZik6CiAgICAgICAgcmV0dXJuIHVzZXJfY29uZmlnX2RpcihzZWxmLmFwcG5hbWUsIHNlbGYuYXBwYXV0aG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj1zZWxmLnZlcnNpb24sIHJvYW1pbmc9c2VsZi5yb2FtaW5nKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHNpdGVfY29uZmlnX2RpcihzZWxmKToKICAgICAgICByZXR1cm4gc2l0ZV9jb25maWdfZGlyKHNlbGYuYXBwbmFtZSwgc2VsZi5hcHBhdXRob3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj1zZWxmLnZlcnNpb24sIG11bHRpcGF0aD1zZWxmLm11bHRpcGF0aCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiB1c2VyX2NhY2hlX2RpcihzZWxmKToKICAgICAgICByZXR1cm4gdXNlcl9jYWNoZV9kaXIoc2VsZi5hcHBuYW1lLCBzZWxmLmFwcGF1dGhvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj1zZWxmLnZlcnNpb24pCgogICAgQHByb3BlcnR5CiAgICBkZWYgdXNlcl9zdGF0ZV9kaXIoc2VsZik6CiAgICAgICAgcmV0dXJuIHVzZXJfc3RhdGVfZGlyKHNlbGYuYXBwbmFtZSwgc2VsZi5hcHBhdXRob3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb249c2VsZi52ZXJzaW9uKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHVzZXJfbG9nX2RpcihzZWxmKToKICAgICAgICByZXR1cm4gdXNlcl9sb2dfZGlyKHNlbGYuYXBwbmFtZSwgc2VsZi5hcHBhdXRob3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPXNlbGYudmVyc2lvbikKCgojLS0tLSBpbnRlcm5hbCBzdXBwb3J0IHN0dWZmCgpkZWYgX2dldF93aW5fZm9sZGVyX2Zyb21fcmVnaXN0cnkoY3NpZGxfbmFtZSk6CiAgICAiIiJUaGlzIGlzIGEgZmFsbGJhY2sgdGVjaG5pcXVlIGF0IGJlc3QuIEknbSBub3Qgc3VyZSBpZiB1c2luZyB0aGUKICAgIHJlZ2lzdHJ5IGZvciB0aGlzIGd1YXJhbnRlZXMgdXMgdGhlIGNvcnJlY3QgYW5zd2VyIGZvciBhbGwgQ1NJRExfKgogICAgbmFtZXMuCiAgICAiIiIKICAgIGlmIFBZMzoKICAgICAgaW1wb3J0IHdpbnJlZyBhcyBfd2lucmVnCiAgICBlbHNlOgogICAgICBpbXBvcnQgX3dpbnJlZwoKICAgIHNoZWxsX2ZvbGRlcl9uYW1lID0gewogICAgICAgICJDU0lETF9BUFBEQVRBIjogIkFwcERhdGEiLAogICAgICAgICJDU0lETF9DT01NT05fQVBQREFUQSI6ICJDb21tb24gQXBwRGF0YSIsCiAgICAgICAgIkNTSURMX0xPQ0FMX0FQUERBVEEiOiAiTG9jYWwgQXBwRGF0YSIsCiAgICB9W2NzaWRsX25hbWVdCgogICAga2V5ID0gX3dpbnJlZy5PcGVuS2V5KAogICAgICAgIF93aW5yZWcuSEtFWV9DVVJSRU5UX1VTRVIsCiAgICAgICAgciJTb2Z0d2FyZVxNaWNyb3NvZnRcV2luZG93c1xDdXJyZW50VmVyc2lvblxFeHBsb3JlclxTaGVsbCBGb2xkZXJzIgogICAgKQogICAgZGlyLCB0eXBlID0gX3dpbnJlZy5RdWVyeVZhbHVlRXgoa2V5LCBzaGVsbF9mb2xkZXJfbmFtZSkKICAgIHJldHVybiBkaXIKCgpkZWYgX2dldF93aW5fZm9sZGVyX3dpdGhfcHl3aW4zMihjc2lkbF9uYW1lKToKICAgIGZyb20gd2luMzJjb20uc2hlbGwgaW1wb3J0IHNoZWxsY29uLCBzaGVsbAogICAgZGlyID0gc2hlbGwuU0hHZXRGb2xkZXJQYXRoKDAsIGdldGF0dHIoc2hlbGxjb24sIGNzaWRsX25hbWUpLCAwLCAwKQogICAgIyBUcnkgdG8gbWFrZSB0aGlzIGEgdW5pY29kZSBwYXRoIGJlY2F1c2UgU0hHZXRGb2xkZXJQYXRoIGRvZXMKICAgICMgbm90IHJldHVybiB1bmljb2RlIHN0cmluZ3Mgd2hlbiB0aGVyZSBpcyB1bmljb2RlIGRhdGEgaW4gdGhlCiAgICAjIHBhdGguCiAgICB0cnk6CiAgICAgICAgZGlyID0gdW5pY29kZShkaXIpCgogICAgICAgICMgRG93bmdyYWRlIHRvIHNob3J0IHBhdGggbmFtZSBpZiBoYXZlIGhpZ2hiaXQgY2hhcnMuIFNlZQogICAgICAgICMgPGh0dHA6Ly9idWdzLmFjdGl2ZXN0YXRlLmNvbS9zaG93X2J1Zy5jZ2k/aWQ9ODUwOTk+LgogICAgICAgIGhhc19oaWdoX2NoYXIgPSBGYWxzZQogICAgICAgIGZvciBjIGluIGRpcjoKICAgICAgICAgICAgaWYgb3JkKGMpID4gMjU1OgogICAgICAgICAgICAgICAgaGFzX2hpZ2hfY2hhciA9IFRydWUKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgaWYgaGFzX2hpZ2hfY2hhcjoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaW1wb3J0IHdpbjMyYXBpCiAgICAgICAgICAgICAgICBkaXIgPSB3aW4zMmFwaS5HZXRTaG9ydFBhdGhOYW1lKGRpcikKICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICAgICAgICAgcGFzcwogICAgZXhjZXB0IFVuaWNvZGVFcnJvcjoKICAgICAgICBwYXNzCiAgICByZXR1cm4gZGlyCgoKZGVmIF9nZXRfd2luX2ZvbGRlcl93aXRoX2N0eXBlcyhjc2lkbF9uYW1lKToKICAgIGltcG9ydCBjdHlwZXMKCiAgICBjc2lkbF9jb25zdCA9IHsKICAgICAgICAiQ1NJRExfQVBQREFUQSI6IDI2LAogICAgICAgICJDU0lETF9DT01NT05fQVBQREFUQSI6IDM1LAogICAgICAgICJDU0lETF9MT0NBTF9BUFBEQVRBIjogMjgsCiAgICB9W2NzaWRsX25hbWVdCgogICAgYnVmID0gY3R5cGVzLmNyZWF0ZV91bmljb2RlX2J1ZmZlcigxMDI0KQogICAgY3R5cGVzLndpbmRsbC5zaGVsbDMyLlNIR2V0Rm9sZGVyUGF0aFcoTm9uZSwgY3NpZGxfY29uc3QsIE5vbmUsIDAsIGJ1ZikKCiAgICAjIERvd25ncmFkZSB0byBzaG9ydCBwYXRoIG5hbWUgaWYgaGF2ZSBoaWdoYml0IGNoYXJzLiBTZWUKICAgICMgPGh0dHA6Ly9idWdzLmFjdGl2ZXN0YXRlLmNvbS9zaG93X2J1Zy5jZ2k/aWQ9ODUwOTk+LgogICAgaGFzX2hpZ2hfY2hhciA9IEZhbHNlCiAgICBmb3IgYyBpbiBidWY6CiAgICAgICAgaWYgb3JkKGMpID4gMjU1OgogICAgICAgICAgICBoYXNfaGlnaF9jaGFyID0gVHJ1ZQogICAgICAgICAgICBicmVhawogICAgaWYgaGFzX2hpZ2hfY2hhcjoKICAgICAgICBidWYyID0gY3R5cGVzLmNyZWF0ZV91bmljb2RlX2J1ZmZlcigxMDI0KQogICAgICAgIGlmIGN0eXBlcy53aW5kbGwua2VybmVsMzIuR2V0U2hvcnRQYXRoTmFtZVcoYnVmLnZhbHVlLCBidWYyLCAxMDI0KToKICAgICAgICAgICAgYnVmID0gYnVmMgoKICAgIHJldHVybiBidWYudmFsdWUKCmRlZiBfZ2V0X3dpbl9mb2xkZXJfd2l0aF9qbmEoY3NpZGxfbmFtZSk6CiAgICBpbXBvcnQgYXJyYXkKICAgIGZyb20gY29tLnN1biBpbXBvcnQgam5hCiAgICBmcm9tIGNvbS5zdW4uam5hLnBsYXRmb3JtIGltcG9ydCB3aW4zMgoKICAgIGJ1Zl9zaXplID0gd2luMzIuV2luRGVmLk1BWF9QQVRIICogMgogICAgYnVmID0gYXJyYXkuemVyb3MoJ2MnLCBidWZfc2l6ZSkKICAgIHNoZWxsID0gd2luMzIuU2hlbGwzMi5JTlNUQU5DRQogICAgc2hlbGwuU0hHZXRGb2xkZXJQYXRoKE5vbmUsIGdldGF0dHIod2luMzIuU2hsT2JqLCBjc2lkbF9uYW1lKSwgTm9uZSwgd2luMzIuU2hsT2JqLlNIR0ZQX1RZUEVfQ1VSUkVOVCwgYnVmKQogICAgZGlyID0gam5hLk5hdGl2ZS50b1N0cmluZyhidWYudG9zdHJpbmcoKSkucnN0cmlwKCJcMCIpCgogICAgIyBEb3duZ3JhZGUgdG8gc2hvcnQgcGF0aCBuYW1lIGlmIGhhdmUgaGlnaGJpdCBjaGFycy4gU2VlCiAgICAjIDxodHRwOi8vYnVncy5hY3RpdmVzdGF0ZS5jb20vc2hvd19idWcuY2dpP2lkPTg1MDk5Pi4KICAgIGhhc19oaWdoX2NoYXIgPSBGYWxzZQogICAgZm9yIGMgaW4gZGlyOgogICAgICAgIGlmIG9yZChjKSA+IDI1NToKICAgICAgICAgICAgaGFzX2hpZ2hfY2hhciA9IFRydWUKICAgICAgICAgICAgYnJlYWsKICAgIGlmIGhhc19oaWdoX2NoYXI6CiAgICAgICAgYnVmID0gYXJyYXkuemVyb3MoJ2MnLCBidWZfc2l6ZSkKICAgICAgICBrZXJuZWwgPSB3aW4zMi5LZXJuZWwzMi5JTlNUQU5DRQogICAgICAgIGlmIGtlcm5lbC5HZXRTaG9ydFBhdGhOYW1lKGRpciwgYnVmLCBidWZfc2l6ZSk6CiAgICAgICAgICAgIGRpciA9IGpuYS5OYXRpdmUudG9TdHJpbmcoYnVmLnRvc3RyaW5nKCkpLnJzdHJpcCgiXDAiKQoKICAgIHJldHVybiBkaXIKCmlmIHN5c3RlbSA9PSAid2luMzIiOgogICAgdHJ5OgogICAgICAgIGltcG9ydCB3aW4zMmNvbS5zaGVsbAogICAgICAgIF9nZXRfd2luX2ZvbGRlciA9IF9nZXRfd2luX2ZvbGRlcl93aXRoX3B5d2luMzIKICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZyb20gY3R5cGVzIGltcG9ydCB3aW5kbGwKICAgICAgICAgICAgX2dldF93aW5fZm9sZGVyID0gX2dldF93aW5fZm9sZGVyX3dpdGhfY3R5cGVzCiAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBpbXBvcnQgY29tLnN1bi5qbmEKICAgICAgICAgICAgICAgIF9nZXRfd2luX2ZvbGRlciA9IF9nZXRfd2luX2ZvbGRlcl93aXRoX2puYQogICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgICAgICAgICBfZ2V0X3dpbl9mb2xkZXIgPSBfZ2V0X3dpbl9mb2xkZXJfZnJvbV9yZWdpc3RyeQoKCiMtLS0tIHNlbGYgdGVzdCBjb2RlCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgYXBwbmFtZSA9ICJNeUFwcCIKICAgIGFwcGF1dGhvciA9ICJNeUNvbXBhbnkiCgogICAgcHJvcHMgPSAoInVzZXJfZGF0YV9kaXIiLAogICAgICAgICAgICAgInVzZXJfY29uZmlnX2RpciIsCiAgICAgICAgICAgICAidXNlcl9jYWNoZV9kaXIiLAogICAgICAgICAgICAgInVzZXJfc3RhdGVfZGlyIiwKICAgICAgICAgICAgICJ1c2VyX2xvZ19kaXIiLAogICAgICAgICAgICAgInNpdGVfZGF0YV9kaXIiLAogICAgICAgICAgICAgInNpdGVfY29uZmlnX2RpciIpCgogICAgcHJpbnQoIi0tIGFwcCBkaXJzICVzIC0tIiAlIF9fdmVyc2lvbl9fKQoKICAgIHByaW50KCItLSBhcHAgZGlycyAod2l0aCBvcHRpb25hbCAndmVyc2lvbicpIikKICAgIGRpcnMgPSBBcHBEaXJzKGFwcG5hbWUsIGFwcGF1dGhvciwgdmVyc2lvbj0iMS4wIikKICAgIGZvciBwcm9wIGluIHByb3BzOgogICAgICAgIHByaW50KCIlczogJXMiICUgKHByb3AsIGdldGF0dHIoZGlycywgcHJvcCkpKQoKICAgIHByaW50KCJcbi0tIGFwcCBkaXJzICh3aXRob3V0IG9wdGlvbmFsICd2ZXJzaW9uJykiKQogICAgZGlycyA9IEFwcERpcnMoYXBwbmFtZSwgYXBwYXV0aG9yKQogICAgZm9yIHByb3AgaW4gcHJvcHM6CiAgICAgICAgcHJpbnQoIiVzOiAlcyIgJSAocHJvcCwgZ2V0YXR0cihkaXJzLCBwcm9wKSkpCgogICAgcHJpbnQoIlxuLS0gYXBwIGRpcnMgKHdpdGhvdXQgb3B0aW9uYWwgJ2FwcGF1dGhvcicpIikKICAgIGRpcnMgPSBBcHBEaXJzKGFwcG5hbWUpCiAgICBmb3IgcHJvcCBpbiBwcm9wczoKICAgICAgICBwcmludCgiJXM6ICVzIiAlIChwcm9wLCBnZXRhdHRyKGRpcnMsIHByb3ApKSkKCiAgICBwcmludCgiXG4tLSBhcHAgZGlycyAod2l0aCBkaXNhYmxlZCAnYXBwYXV0aG9yJykiKQogICAgZGlycyA9IEFwcERpcnMoYXBwbmFtZSwgYXBwYXV0aG9yPUZhbHNlKQogICAgZm9yIHByb3AgaW4gcHJvcHM6CiAgICAgICAgcHJpbnQoIiVzOiAlcyIgJSAocHJvcCwgZ2V0YXR0cihkaXJzLCBwcm9wKSkpClBLAwQUAAAAAAAAACEAPClYxtACAADQAgAAUQAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL19fYWJvdXRfXy5weSMgVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbgojIDIuMCwgYW5kIHRoZSBCU0QgTGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyByZXBvc2l0b3J5CiMgZm9yIGNvbXBsZXRlIGRldGFpbHMuCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgcHJpbnRfZnVuY3Rpb24KCl9fYWxsX18gPSBbCiAgICAiX190aXRsZV9fIiwgIl9fc3VtbWFyeV9fIiwgIl9fdXJpX18iLCAiX192ZXJzaW9uX18iLCAiX19hdXRob3JfXyIsCiAgICAiX19lbWFpbF9fIiwgIl9fbGljZW5zZV9fIiwgIl9fY29weXJpZ2h0X18iLApdCgpfX3RpdGxlX18gPSAicGFja2FnaW5nIgpfX3N1bW1hcnlfXyA9ICJDb3JlIHV0aWxpdGllcyBmb3IgUHl0aG9uIHBhY2thZ2VzIgpfX3VyaV9fID0gImh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3BhY2thZ2luZyIKCl9fdmVyc2lvbl9fID0gIjE2LjgiCgpfX2F1dGhvcl9fID0gIkRvbmFsZCBTdHVmZnQgYW5kIGluZGl2aWR1YWwgY29udHJpYnV0b3JzIgpfX2VtYWlsX18gPSAiZG9uYWxkQHN0dWZmdC5pbyIKCl9fbGljZW5zZV9fID0gIkJTRCBvciBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAiCl9fY29weXJpZ2h0X18gPSAiQ29weXJpZ2h0IDIwMTQtMjAxNiAlcyIgJSBfX2F1dGhvcl9fClBLAwQUAAAAAAAAACEAgXaWygECAAABAgAAUAAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL19faW5pdF9fLnB5IyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uCiMgMi4wLCBhbmQgdGhlIEJTRCBMaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHJlcG9zaXRvcnkKIyBmb3IgY29tcGxldGUgZGV0YWlscy4KZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCBwcmludF9mdW5jdGlvbgoKZnJvbSAuX19hYm91dF9fIGltcG9ydCAoCiAgICBfX2F1dGhvcl9fLCBfX2NvcHlyaWdodF9fLCBfX2VtYWlsX18sIF9fbGljZW5zZV9fLCBfX3N1bW1hcnlfXywgX190aXRsZV9fLAogICAgX191cmlfXywgX192ZXJzaW9uX18KKQoKX19hbGxfXyA9IFsKICAgICJfX3RpdGxlX18iLCAiX19zdW1tYXJ5X18iLCAiX191cmlfXyIsICJfX3ZlcnNpb25fXyIsICJfX2F1dGhvcl9fIiwKICAgICJfX2VtYWlsX18iLCAiX19saWNlbnNlX18iLCAiX19jb3B5cmlnaHRfXyIsCl0KUEsDBBQAAAAAAAAAIQDmaUrjXAMAAFwDAABPAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvX2NvbXBhdC5weSMgVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbgojIDIuMCwgYW5kIHRoZSBCU0QgTGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyByZXBvc2l0b3J5CiMgZm9yIGNvbXBsZXRlIGRldGFpbHMuCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgcHJpbnRfZnVuY3Rpb24KCmltcG9ydCBzeXMKCgpQWTIgPSBzeXMudmVyc2lvbl9pbmZvWzBdID09IDIKUFkzID0gc3lzLnZlcnNpb25faW5mb1swXSA9PSAzCgojIGZsYWtlODogbm9xYQoKaWYgUFkzOgogICAgc3RyaW5nX3R5cGVzID0gc3RyLAplbHNlOgogICAgc3RyaW5nX3R5cGVzID0gYmFzZXN0cmluZywKCgpkZWYgd2l0aF9tZXRhY2xhc3MobWV0YSwgKmJhc2VzKToKICAgICIiIgogICAgQ3JlYXRlIGEgYmFzZSBjbGFzcyB3aXRoIGEgbWV0YWNsYXNzLgogICAgIiIiCiAgICAjIFRoaXMgcmVxdWlyZXMgYSBiaXQgb2YgZXhwbGFuYXRpb246IHRoZSBiYXNpYyBpZGVhIGlzIHRvIG1ha2UgYSBkdW1teQogICAgIyBtZXRhY2xhc3MgZm9yIG9uZSBsZXZlbCBvZiBjbGFzcyBpbnN0YW50aWF0aW9uIHRoYXQgcmVwbGFjZXMgaXRzZWxmIHdpdGgKICAgICMgdGhlIGFjdHVhbCBtZXRhY2xhc3MuCiAgICBjbGFzcyBtZXRhY2xhc3MobWV0YSk6CiAgICAgICAgZGVmIF9fbmV3X18oY2xzLCBuYW1lLCB0aGlzX2Jhc2VzLCBkKToKICAgICAgICAgICAgcmV0dXJuIG1ldGEobmFtZSwgYmFzZXMsIGQpCiAgICByZXR1cm4gdHlwZS5fX25ld19fKG1ldGFjbGFzcywgJ3RlbXBvcmFyeV9jbGFzcycsICgpLCB7fSkKUEsDBBQAAAAAAAAAIQD6/aQSiAUAAIgFAABTAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvX3N0cnVjdHVyZXMucHkjIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24KIyAyLjAsIGFuZCB0aGUgQlNEIExpY2Vuc2UuIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcmVwb3NpdG9yeQojIGZvciBjb21wbGV0ZSBkZXRhaWxzLgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHByaW50X2Z1bmN0aW9uCgoKY2xhc3MgSW5maW5pdHkob2JqZWN0KToKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICJJbmZpbml0eSIKCiAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGhhc2gocmVwcihzZWxmKSkKCiAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIG5vdCBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXykKCiAgICBkZWYgX19ndF9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBfX2dlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIF9fbmVnX18oc2VsZik6CiAgICAgICAgcmV0dXJuIE5lZ2F0aXZlSW5maW5pdHkKCkluZmluaXR5ID0gSW5maW5pdHkoKQoKCmNsYXNzIE5lZ2F0aXZlSW5maW5pdHkob2JqZWN0KToKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICItSW5maW5pdHkiCgogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgIHJldHVybiBoYXNoKHJlcHIoc2VsZikpCgogICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXykKCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gbm90IGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKQoKICAgIGRlZiBfX2d0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBfX2dlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBfX25lZ19fKHNlbGYpOgogICAgICAgIHJldHVybiBJbmZpbml0eQoKTmVnYXRpdmVJbmZpbml0eSA9IE5lZ2F0aXZlSW5maW5pdHkoKQpQSwMEFAAAAAAAAAAhADD4E9w4IAAAOCAAAE8AAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9tYXJrZXJzLnB5IyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uCiMgMi4wLCBhbmQgdGhlIEJTRCBMaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHJlcG9zaXRvcnkKIyBmb3IgY29tcGxldGUgZGV0YWlscy4KZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCBwcmludF9mdW5jdGlvbgoKaW1wb3J0IG9wZXJhdG9yCmltcG9ydCBvcwppbXBvcnQgcGxhdGZvcm0KaW1wb3J0IHN5cwoKZnJvbSBwa2dfcmVzb3VyY2VzLmV4dGVybi5weXBhcnNpbmcgaW1wb3J0IFBhcnNlRXhjZXB0aW9uLCBQYXJzZVJlc3VsdHMsIHN0cmluZ1N0YXJ0LCBzdHJpbmdFbmQKZnJvbSBwa2dfcmVzb3VyY2VzLmV4dGVybi5weXBhcnNpbmcgaW1wb3J0IFplcm9Pck1vcmUsIEdyb3VwLCBGb3J3YXJkLCBRdW90ZWRTdHJpbmcKZnJvbSBwa2dfcmVzb3VyY2VzLmV4dGVybi5weXBhcnNpbmcgaW1wb3J0IExpdGVyYWwgYXMgTCAgIyBub3FhCgpmcm9tIC5fY29tcGF0IGltcG9ydCBzdHJpbmdfdHlwZXMKZnJvbSAuc3BlY2lmaWVycyBpbXBvcnQgU3BlY2lmaWVyLCBJbnZhbGlkU3BlY2lmaWVyCgoKX19hbGxfXyA9IFsKICAgICJJbnZhbGlkTWFya2VyIiwgIlVuZGVmaW5lZENvbXBhcmlzb24iLCAiVW5kZWZpbmVkRW52aXJvbm1lbnROYW1lIiwKICAgICJNYXJrZXIiLCAiZGVmYXVsdF9lbnZpcm9ubWVudCIsCl0KCgpjbGFzcyBJbnZhbGlkTWFya2VyKFZhbHVlRXJyb3IpOgogICAgIiIiCiAgICBBbiBpbnZhbGlkIG1hcmtlciB3YXMgZm91bmQsIHVzZXJzIHNob3VsZCByZWZlciB0byBQRVAgNTA4LgogICAgIiIiCgoKY2xhc3MgVW5kZWZpbmVkQ29tcGFyaXNvbihWYWx1ZUVycm9yKToKICAgICIiIgogICAgQW4gaW52YWxpZCBvcGVyYXRpb24gd2FzIGF0dGVtcHRlZCBvbiBhIHZhbHVlIHRoYXQgZG9lc24ndCBzdXBwb3J0IGl0LgogICAgIiIiCgoKY2xhc3MgVW5kZWZpbmVkRW52aXJvbm1lbnROYW1lKFZhbHVlRXJyb3IpOgogICAgIiIiCiAgICBBIG5hbWUgd2FzIGF0dGVtcHRlZCB0byBiZSB1c2VkIHRoYXQgZG9lcyBub3QgZXhpc3QgaW5zaWRlIG9mIHRoZQogICAgZW52aXJvbm1lbnQuCiAgICAiIiIKCgpjbGFzcyBOb2RlKG9iamVjdCk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlKToKICAgICAgICBzZWxmLnZhbHVlID0gdmFsdWUKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc3RyKHNlbGYudmFsdWUpCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiPHswfSh7MSFyfSk+Ii5mb3JtYXQoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHN0cihzZWxmKSkKCiAgICBkZWYgc2VyaWFsaXplKHNlbGYpOgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKCgpjbGFzcyBWYXJpYWJsZShOb2RlKToKCiAgICBkZWYgc2VyaWFsaXplKHNlbGYpOgogICAgICAgIHJldHVybiBzdHIoc2VsZikKCgpjbGFzcyBWYWx1ZShOb2RlKToKCiAgICBkZWYgc2VyaWFsaXplKHNlbGYpOgogICAgICAgIHJldHVybiAnInswfSInLmZvcm1hdChzZWxmKQoKCmNsYXNzIE9wKE5vZGUpOgoKICAgIGRlZiBzZXJpYWxpemUoc2VsZik6CiAgICAgICAgcmV0dXJuIHN0cihzZWxmKQoKClZBUklBQkxFID0gKAogICAgTCgiaW1wbGVtZW50YXRpb25fdmVyc2lvbiIpIHwKICAgIEwoInBsYXRmb3JtX3B5dGhvbl9pbXBsZW1lbnRhdGlvbiIpIHwKICAgIEwoImltcGxlbWVudGF0aW9uX25hbWUiKSB8CiAgICBMKCJweXRob25fZnVsbF92ZXJzaW9uIikgfAogICAgTCgicGxhdGZvcm1fcmVsZWFzZSIpIHwKICAgIEwoInBsYXRmb3JtX3ZlcnNpb24iKSB8CiAgICBMKCJwbGF0Zm9ybV9tYWNoaW5lIikgfAogICAgTCgicGxhdGZvcm1fc3lzdGVtIikgfAogICAgTCgicHl0aG9uX3ZlcnNpb24iKSB8CiAgICBMKCJzeXNfcGxhdGZvcm0iKSB8CiAgICBMKCJvc19uYW1lIikgfAogICAgTCgib3MubmFtZSIpIHwgICMgUEVQLTM0NQogICAgTCgic3lzLnBsYXRmb3JtIikgfCAgIyBQRVAtMzQ1CiAgICBMKCJwbGF0Zm9ybS52ZXJzaW9uIikgfCAgIyBQRVAtMzQ1CiAgICBMKCJwbGF0Zm9ybS5tYWNoaW5lIikgfCAgIyBQRVAtMzQ1CiAgICBMKCJwbGF0Zm9ybS5weXRob25faW1wbGVtZW50YXRpb24iKSB8ICAjIFBFUC0zNDUKICAgIEwoInB5dGhvbl9pbXBsZW1lbnRhdGlvbiIpIHwgICMgdW5kb2N1bWVudGVkIHNldHVwdG9vbHMgbGVnYWN5CiAgICBMKCJleHRyYSIpCikKQUxJQVNFUyA9IHsKICAgICdvcy5uYW1lJzogJ29zX25hbWUnLAogICAgJ3N5cy5wbGF0Zm9ybSc6ICdzeXNfcGxhdGZvcm0nLAogICAgJ3BsYXRmb3JtLnZlcnNpb24nOiAncGxhdGZvcm1fdmVyc2lvbicsCiAgICAncGxhdGZvcm0ubWFjaGluZSc6ICdwbGF0Zm9ybV9tYWNoaW5lJywKICAgICdwbGF0Zm9ybS5weXRob25faW1wbGVtZW50YXRpb24nOiAncGxhdGZvcm1fcHl0aG9uX2ltcGxlbWVudGF0aW9uJywKICAgICdweXRob25faW1wbGVtZW50YXRpb24nOiAncGxhdGZvcm1fcHl0aG9uX2ltcGxlbWVudGF0aW9uJwp9ClZBUklBQkxFLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLCBsLCB0OiBWYXJpYWJsZShBTElBU0VTLmdldCh0WzBdLCB0WzBdKSkpCgpWRVJTSU9OX0NNUCA9ICgKICAgIEwoIj09PSIpIHwKICAgIEwoIj09IikgfAogICAgTCgiPj0iKSB8CiAgICBMKCI8PSIpIHwKICAgIEwoIiE9IikgfAogICAgTCgifj0iKSB8CiAgICBMKCI+IikgfAogICAgTCgiPCIpCikKCk1BUktFUl9PUCA9IFZFUlNJT05fQ01QIHwgTCgibm90IGluIikgfCBMKCJpbiIpCk1BUktFUl9PUC5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcywgbCwgdDogT3AodFswXSkpCgpNQVJLRVJfVkFMVUUgPSBRdW90ZWRTdHJpbmcoIiciKSB8IFF1b3RlZFN0cmluZygnIicpCk1BUktFUl9WQUxVRS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcywgbCwgdDogVmFsdWUodFswXSkpCgpCT09MT1AgPSBMKCJhbmQiKSB8IEwoIm9yIikKCk1BUktFUl9WQVIgPSBWQVJJQUJMRSB8IE1BUktFUl9WQUxVRQoKTUFSS0VSX0lURU0gPSBHcm91cChNQVJLRVJfVkFSICsgTUFSS0VSX09QICsgTUFSS0VSX1ZBUikKTUFSS0VSX0lURU0uc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsIGwsIHQ6IHR1cGxlKHRbMF0pKQoKTFBBUkVOID0gTCgiKCIpLnN1cHByZXNzKCkKUlBBUkVOID0gTCgiKSIpLnN1cHByZXNzKCkKCk1BUktFUl9FWFBSID0gRm9yd2FyZCgpCk1BUktFUl9BVE9NID0gTUFSS0VSX0lURU0gfCBHcm91cChMUEFSRU4gKyBNQVJLRVJfRVhQUiArIFJQQVJFTikKTUFSS0VSX0VYUFIgPDwgTUFSS0VSX0FUT00gKyBaZXJvT3JNb3JlKEJPT0xPUCArIE1BUktFUl9FWFBSKQoKTUFSS0VSID0gc3RyaW5nU3RhcnQgKyBNQVJLRVJfRVhQUiArIHN0cmluZ0VuZAoKCmRlZiBfY29lcmNlX3BhcnNlX3Jlc3VsdChyZXN1bHRzKToKICAgIGlmIGlzaW5zdGFuY2UocmVzdWx0cywgUGFyc2VSZXN1bHRzKToKICAgICAgICByZXR1cm4gW19jb2VyY2VfcGFyc2VfcmVzdWx0KGkpIGZvciBpIGluIHJlc3VsdHNdCiAgICBlbHNlOgogICAgICAgIHJldHVybiByZXN1bHRzCgoKZGVmIF9mb3JtYXRfbWFya2VyKG1hcmtlciwgZmlyc3Q9VHJ1ZSk6CiAgICBhc3NlcnQgaXNpbnN0YW5jZShtYXJrZXIsIChsaXN0LCB0dXBsZSwgc3RyaW5nX3R5cGVzKSkKCiAgICAjIFNvbWV0aW1lcyB3ZSBoYXZlIGEgc3RydWN0dXJlIGxpa2UgW1suLi5dXSB3aGljaCBpcyBhIHNpbmdsZSBpdGVtIGxpc3QKICAgICMgd2hlcmUgdGhlIHNpbmdsZSBpdGVtIGlzIGl0c2VsZiBpdCdzIG93biBsaXN0LiBJbiB0aGF0IGNhc2Ugd2Ugd2FudCBza2lwCiAgICAjIHRoZSByZXN0IG9mIHRoaXMgZnVuY3Rpb24gc28gdGhhdCB3ZSBkb24ndCBnZXQgZXh0cmFuZW91cyAoKSBvbiB0aGUKICAgICMgb3V0c2lkZS4KICAgIGlmIChpc2luc3RhbmNlKG1hcmtlciwgbGlzdCkgYW5kIGxlbihtYXJrZXIpID09IDEgYW5kCiAgICAgICAgICAgIGlzaW5zdGFuY2UobWFya2VyWzBdLCAobGlzdCwgdHVwbGUpKSk6CiAgICAgICAgcmV0dXJuIF9mb3JtYXRfbWFya2VyKG1hcmtlclswXSkKCiAgICBpZiBpc2luc3RhbmNlKG1hcmtlciwgbGlzdCk6CiAgICAgICAgaW5uZXIgPSAoX2Zvcm1hdF9tYXJrZXIobSwgZmlyc3Q9RmFsc2UpIGZvciBtIGluIG1hcmtlcikKICAgICAgICBpZiBmaXJzdDoKICAgICAgICAgICAgcmV0dXJuICIgIi5qb2luKGlubmVyKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiAiKCIgKyAiICIuam9pbihpbm5lcikgKyAiKSIKICAgIGVsaWYgaXNpbnN0YW5jZShtYXJrZXIsIHR1cGxlKToKICAgICAgICByZXR1cm4gIiAiLmpvaW4oW20uc2VyaWFsaXplKCkgZm9yIG0gaW4gbWFya2VyXSkKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIG1hcmtlcgoKCl9vcGVyYXRvcnMgPSB7CiAgICAiaW4iOiBsYW1iZGEgbGhzLCByaHM6IGxocyBpbiByaHMsCiAgICAibm90IGluIjogbGFtYmRhIGxocywgcmhzOiBsaHMgbm90IGluIHJocywKICAgICI8Ijogb3BlcmF0b3IubHQsCiAgICAiPD0iOiBvcGVyYXRvci5sZSwKICAgICI9PSI6IG9wZXJhdG9yLmVxLAogICAgIiE9Ijogb3BlcmF0b3IubmUsCiAgICAiPj0iOiBvcGVyYXRvci5nZSwKICAgICI+Ijogb3BlcmF0b3IuZ3QsCn0KCgpkZWYgX2V2YWxfb3AobGhzLCBvcCwgcmhzKToKICAgIHRyeToKICAgICAgICBzcGVjID0gU3BlY2lmaWVyKCIiLmpvaW4oW29wLnNlcmlhbGl6ZSgpLCByaHNdKSkKICAgIGV4Y2VwdCBJbnZhbGlkU3BlY2lmaWVyOgogICAgICAgIHBhc3MKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIHNwZWMuY29udGFpbnMobGhzKQoKICAgIG9wZXIgPSBfb3BlcmF0b3JzLmdldChvcC5zZXJpYWxpemUoKSkKICAgIGlmIG9wZXIgaXMgTm9uZToKICAgICAgICByYWlzZSBVbmRlZmluZWRDb21wYXJpc29uKAogICAgICAgICAgICAiVW5kZWZpbmVkIHswIXJ9IG9uIHsxIXJ9IGFuZCB7MiFyfS4iLmZvcm1hdChvcCwgbGhzLCByaHMpCiAgICAgICAgKQoKICAgIHJldHVybiBvcGVyKGxocywgcmhzKQoKCl91bmRlZmluZWQgPSBvYmplY3QoKQoKCmRlZiBfZ2V0X2VudihlbnZpcm9ubWVudCwgbmFtZSk6CiAgICB2YWx1ZSA9IGVudmlyb25tZW50LmdldChuYW1lLCBfdW5kZWZpbmVkKQoKICAgIGlmIHZhbHVlIGlzIF91bmRlZmluZWQ6CiAgICAgICAgcmFpc2UgVW5kZWZpbmVkRW52aXJvbm1lbnROYW1lKAogICAgICAgICAgICAiezAhcn0gZG9lcyBub3QgZXhpc3QgaW4gZXZhbHVhdGlvbiBlbnZpcm9ubWVudC4iLmZvcm1hdChuYW1lKQogICAgICAgICkKCiAgICByZXR1cm4gdmFsdWUKCgpkZWYgX2V2YWx1YXRlX21hcmtlcnMobWFya2VycywgZW52aXJvbm1lbnQpOgogICAgZ3JvdXBzID0gW1tdXQoKICAgIGZvciBtYXJrZXIgaW4gbWFya2VyczoKICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShtYXJrZXIsIChsaXN0LCB0dXBsZSwgc3RyaW5nX3R5cGVzKSkKCiAgICAgICAgaWYgaXNpbnN0YW5jZShtYXJrZXIsIGxpc3QpOgogICAgICAgICAgICBncm91cHNbLTFdLmFwcGVuZChfZXZhbHVhdGVfbWFya2VycyhtYXJrZXIsIGVudmlyb25tZW50KSkKICAgICAgICBlbGlmIGlzaW5zdGFuY2UobWFya2VyLCB0dXBsZSk6CiAgICAgICAgICAgIGxocywgb3AsIHJocyA9IG1hcmtlcgoKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShsaHMsIFZhcmlhYmxlKToKICAgICAgICAgICAgICAgIGxoc192YWx1ZSA9IF9nZXRfZW52KGVudmlyb25tZW50LCBsaHMudmFsdWUpCiAgICAgICAgICAgICAgICByaHNfdmFsdWUgPSByaHMudmFsdWUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGxoc192YWx1ZSA9IGxocy52YWx1ZQogICAgICAgICAgICAgICAgcmhzX3ZhbHVlID0gX2dldF9lbnYoZW52aXJvbm1lbnQsIHJocy52YWx1ZSkKCiAgICAgICAgICAgIGdyb3Vwc1stMV0uYXBwZW5kKF9ldmFsX29wKGxoc192YWx1ZSwgb3AsIHJoc192YWx1ZSkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYXNzZXJ0IG1hcmtlciBpbiBbImFuZCIsICJvciJdCiAgICAgICAgICAgIGlmIG1hcmtlciA9PSAib3IiOgogICAgICAgICAgICAgICAgZ3JvdXBzLmFwcGVuZChbXSkKCiAgICByZXR1cm4gYW55KGFsbChpdGVtKSBmb3IgaXRlbSBpbiBncm91cHMpCgoKZGVmIGZvcm1hdF9mdWxsX3ZlcnNpb24oaW5mbyk6CiAgICB2ZXJzaW9uID0gJ3swLm1ham9yfS57MC5taW5vcn0uezAubWljcm99Jy5mb3JtYXQoaW5mbykKICAgIGtpbmQgPSBpbmZvLnJlbGVhc2VsZXZlbAogICAgaWYga2luZCAhPSAnZmluYWwnOgogICAgICAgIHZlcnNpb24gKz0ga2luZFswXSArIHN0cihpbmZvLnNlcmlhbCkKICAgIHJldHVybiB2ZXJzaW9uCgoKZGVmIGRlZmF1bHRfZW52aXJvbm1lbnQoKToKICAgIGlmIGhhc2F0dHIoc3lzLCAnaW1wbGVtZW50YXRpb24nKToKICAgICAgICBpdmVyID0gZm9ybWF0X2Z1bGxfdmVyc2lvbihzeXMuaW1wbGVtZW50YXRpb24udmVyc2lvbikKICAgICAgICBpbXBsZW1lbnRhdGlvbl9uYW1lID0gc3lzLmltcGxlbWVudGF0aW9uLm5hbWUKICAgIGVsc2U6CiAgICAgICAgaXZlciA9ICcwJwogICAgICAgIGltcGxlbWVudGF0aW9uX25hbWUgPSAnJwoKICAgIHJldHVybiB7CiAgICAgICAgImltcGxlbWVudGF0aW9uX25hbWUiOiBpbXBsZW1lbnRhdGlvbl9uYW1lLAogICAgICAgICJpbXBsZW1lbnRhdGlvbl92ZXJzaW9uIjogaXZlciwKICAgICAgICAib3NfbmFtZSI6IG9zLm5hbWUsCiAgICAgICAgInBsYXRmb3JtX21hY2hpbmUiOiBwbGF0Zm9ybS5tYWNoaW5lKCksCiAgICAgICAgInBsYXRmb3JtX3JlbGVhc2UiOiBwbGF0Zm9ybS5yZWxlYXNlKCksCiAgICAgICAgInBsYXRmb3JtX3N5c3RlbSI6IHBsYXRmb3JtLnN5c3RlbSgpLAogICAgICAgICJwbGF0Zm9ybV92ZXJzaW9uIjogcGxhdGZvcm0udmVyc2lvbigpLAogICAgICAgICJweXRob25fZnVsbF92ZXJzaW9uIjogcGxhdGZvcm0ucHl0aG9uX3ZlcnNpb24oKSwKICAgICAgICAicGxhdGZvcm1fcHl0aG9uX2ltcGxlbWVudGF0aW9uIjogcGxhdGZvcm0ucHl0aG9uX2ltcGxlbWVudGF0aW9uKCksCiAgICAgICAgInB5dGhvbl92ZXJzaW9uIjogcGxhdGZvcm0ucHl0aG9uX3ZlcnNpb24oKVs6M10sCiAgICAgICAgInN5c19wbGF0Zm9ybSI6IHN5cy5wbGF0Zm9ybSwKICAgIH0KCgpjbGFzcyBNYXJrZXIob2JqZWN0KToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbWFya2VyKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYuX21hcmtlcnMgPSBfY29lcmNlX3BhcnNlX3Jlc3VsdChNQVJLRVIucGFyc2VTdHJpbmcobWFya2VyKSkKICAgICAgICBleGNlcHQgUGFyc2VFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgZXJyX3N0ciA9ICJJbnZhbGlkIG1hcmtlcjogezAhcn0sIHBhcnNlIGVycm9yIGF0IHsxIXJ9Ii5mb3JtYXQoCiAgICAgICAgICAgICAgICBtYXJrZXIsIG1hcmtlcltlLmxvYzplLmxvYyArIDhdKQogICAgICAgICAgICByYWlzZSBJbnZhbGlkTWFya2VyKGVycl9zdHIpCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIF9mb3JtYXRfbWFya2VyKHNlbGYuX21hcmtlcnMpCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiPE1hcmtlcih7MCFyfSk+Ii5mb3JtYXQoc3RyKHNlbGYpKQoKICAgIGRlZiBldmFsdWF0ZShzZWxmLCBlbnZpcm9ubWVudD1Ob25lKToKICAgICAgICAiIiJFdmFsdWF0ZSBhIG1hcmtlci4KCiAgICAgICAgUmV0dXJuIHRoZSBib29sZWFuIGZyb20gZXZhbHVhdGluZyB0aGUgZ2l2ZW4gbWFya2VyIGFnYWluc3QgdGhlCiAgICAgICAgZW52aXJvbm1lbnQuIGVudmlyb25tZW50IGlzIGFuIG9wdGlvbmFsIGFyZ3VtZW50IHRvIG92ZXJyaWRlIGFsbCBvcgogICAgICAgIHBhcnQgb2YgdGhlIGRldGVybWluZWQgZW52aXJvbm1lbnQuCgogICAgICAgIFRoZSBlbnZpcm9ubWVudCBpcyBkZXRlcm1pbmVkIGZyb20gdGhlIGN1cnJlbnQgUHl0aG9uIHByb2Nlc3MuCiAgICAgICAgIiIiCiAgICAgICAgY3VycmVudF9lbnZpcm9ubWVudCA9IGRlZmF1bHRfZW52aXJvbm1lbnQoKQogICAgICAgIGlmIGVudmlyb25tZW50IGlzIG5vdCBOb25lOgogICAgICAgICAgICBjdXJyZW50X2Vudmlyb25tZW50LnVwZGF0ZShlbnZpcm9ubWVudCkKCiAgICAgICAgcmV0dXJuIF9ldmFsdWF0ZV9tYXJrZXJzKHNlbGYuX21hcmtlcnMsIGN1cnJlbnRfZW52aXJvbm1lbnQpClBLAwQUAAAAAAAAACEApYYd2wMRAAADEQAAVAAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL3JlcXVpcmVtZW50cy5weSMgVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbgojIDIuMCwgYW5kIHRoZSBCU0QgTGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyByZXBvc2l0b3J5CiMgZm9yIGNvbXBsZXRlIGRldGFpbHMuCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgcHJpbnRfZnVuY3Rpb24KCmltcG9ydCBzdHJpbmcKaW1wb3J0IHJlCgpmcm9tIHBrZ19yZXNvdXJjZXMuZXh0ZXJuLnB5cGFyc2luZyBpbXBvcnQgc3RyaW5nU3RhcnQsIHN0cmluZ0VuZCwgb3JpZ2luYWxUZXh0Rm9yLCBQYXJzZUV4Y2VwdGlvbgpmcm9tIHBrZ19yZXNvdXJjZXMuZXh0ZXJuLnB5cGFyc2luZyBpbXBvcnQgWmVyb09yTW9yZSwgV29yZCwgT3B0aW9uYWwsIFJlZ2V4LCBDb21iaW5lCmZyb20gcGtnX3Jlc291cmNlcy5leHRlcm4ucHlwYXJzaW5nIGltcG9ydCBMaXRlcmFsIGFzIEwgICMgbm9xYQpmcm9tIHBrZ19yZXNvdXJjZXMuZXh0ZXJuLnNpeC5tb3Zlcy51cmxsaWIgaW1wb3J0IHBhcnNlIGFzIHVybHBhcnNlCgpmcm9tIC5tYXJrZXJzIGltcG9ydCBNQVJLRVJfRVhQUiwgTWFya2VyCmZyb20gLnNwZWNpZmllcnMgaW1wb3J0IExlZ2FjeVNwZWNpZmllciwgU3BlY2lmaWVyLCBTcGVjaWZpZXJTZXQKCgpjbGFzcyBJbnZhbGlkUmVxdWlyZW1lbnQoVmFsdWVFcnJvcik6CiAgICAiIiIKICAgIEFuIGludmFsaWQgcmVxdWlyZW1lbnQgd2FzIGZvdW5kLCB1c2VycyBzaG91bGQgcmVmZXIgdG8gUEVQIDUwOC4KICAgICIiIgoKCkFMUEhBTlVNID0gV29yZChzdHJpbmcuYXNjaWlfbGV0dGVycyArIHN0cmluZy5kaWdpdHMpCgpMQlJBQ0tFVCA9IEwoIlsiKS5zdXBwcmVzcygpClJCUkFDS0VUID0gTCgiXSIpLnN1cHByZXNzKCkKTFBBUkVOID0gTCgiKCIpLnN1cHByZXNzKCkKUlBBUkVOID0gTCgiKSIpLnN1cHByZXNzKCkKQ09NTUEgPSBMKCIsIikuc3VwcHJlc3MoKQpTRU1JQ09MT04gPSBMKCI7Iikuc3VwcHJlc3MoKQpBVCA9IEwoIkAiKS5zdXBwcmVzcygpCgpQVU5DVFVBVElPTiA9IFdvcmQoIi1fLiIpCklERU5USUZJRVJfRU5EID0gQUxQSEFOVU0gfCAoWmVyb09yTW9yZShQVU5DVFVBVElPTikgKyBBTFBIQU5VTSkKSURFTlRJRklFUiA9IENvbWJpbmUoQUxQSEFOVU0gKyBaZXJvT3JNb3JlKElERU5USUZJRVJfRU5EKSkKCk5BTUUgPSBJREVOVElGSUVSKCJuYW1lIikKRVhUUkEgPSBJREVOVElGSUVSCgpVUkkgPSBSZWdleChyJ1teIF0rJykoInVybCIpClVSTCA9IChBVCArIFVSSSkKCkVYVFJBU19MSVNUID0gRVhUUkEgKyBaZXJvT3JNb3JlKENPTU1BICsgRVhUUkEpCkVYVFJBUyA9IChMQlJBQ0tFVCArIE9wdGlvbmFsKEVYVFJBU19MSVNUKSArIFJCUkFDS0VUKSgiZXh0cmFzIikKClZFUlNJT05fUEVQNDQwID0gUmVnZXgoU3BlY2lmaWVyLl9yZWdleF9zdHIsIHJlLlZFUkJPU0UgfCByZS5JR05PUkVDQVNFKQpWRVJTSU9OX0xFR0FDWSA9IFJlZ2V4KExlZ2FjeVNwZWNpZmllci5fcmVnZXhfc3RyLCByZS5WRVJCT1NFIHwgcmUuSUdOT1JFQ0FTRSkKClZFUlNJT05fT05FID0gVkVSU0lPTl9QRVA0NDAgXiBWRVJTSU9OX0xFR0FDWQpWRVJTSU9OX01BTlkgPSBDb21iaW5lKFZFUlNJT05fT05FICsgWmVyb09yTW9yZShDT01NQSArIFZFUlNJT05fT05FKSwKICAgICAgICAgICAgICAgICAgICAgICBqb2luU3RyaW5nPSIsIiwgYWRqYWNlbnQ9RmFsc2UpKCJfcmF3X3NwZWMiKQpfVkVSU0lPTl9TUEVDID0gT3B0aW9uYWwoKChMUEFSRU4gKyBWRVJTSU9OX01BTlkgKyBSUEFSRU4pIHwgVkVSU0lPTl9NQU5ZKSkKX1ZFUlNJT05fU1BFQy5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcywgbCwgdDogdC5fcmF3X3NwZWMgb3IgJycpCgpWRVJTSU9OX1NQRUMgPSBvcmlnaW5hbFRleHRGb3IoX1ZFUlNJT05fU1BFQykoInNwZWNpZmllciIpClZFUlNJT05fU1BFQy5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcywgbCwgdDogdFsxXSkKCk1BUktFUl9FWFBSID0gb3JpZ2luYWxUZXh0Rm9yKE1BUktFUl9FWFBSKCkpKCJtYXJrZXIiKQpNQVJLRVJfRVhQUi5zZXRQYXJzZUFjdGlvbigKICAgIGxhbWJkYSBzLCBsLCB0OiBNYXJrZXIoc1t0Ll9vcmlnaW5hbF9zdGFydDp0Ll9vcmlnaW5hbF9lbmRdKQopCk1BUktFUl9TRVBFUkFUT1IgPSBTRU1JQ09MT04KTUFSS0VSID0gTUFSS0VSX1NFUEVSQVRPUiArIE1BUktFUl9FWFBSCgpWRVJTSU9OX0FORF9NQVJLRVIgPSBWRVJTSU9OX1NQRUMgKyBPcHRpb25hbChNQVJLRVIpClVSTF9BTkRfTUFSS0VSID0gVVJMICsgT3B0aW9uYWwoTUFSS0VSKQoKTkFNRURfUkVRVUlSRU1FTlQgPSBcCiAgICBOQU1FICsgT3B0aW9uYWwoRVhUUkFTKSArIChVUkxfQU5EX01BUktFUiB8IFZFUlNJT05fQU5EX01BUktFUikKClJFUVVJUkVNRU5UID0gc3RyaW5nU3RhcnQgKyBOQU1FRF9SRVFVSVJFTUVOVCArIHN0cmluZ0VuZAoKCmNsYXNzIFJlcXVpcmVtZW50KG9iamVjdCk6CiAgICAiIiJQYXJzZSBhIHJlcXVpcmVtZW50LgoKICAgIFBhcnNlIGEgZ2l2ZW4gcmVxdWlyZW1lbnQgc3RyaW5nIGludG8gaXRzIHBhcnRzLCBzdWNoIGFzIG5hbWUsIHNwZWNpZmllciwKICAgIFVSTCwgYW5kIGV4dHJhcy4gUmFpc2VzIEludmFsaWRSZXF1aXJlbWVudCBvbiBhIGJhZGx5LWZvcm1lZCByZXF1aXJlbWVudAogICAgc3RyaW5nLgogICAgIiIiCgogICAgIyBUT0RPOiBDYW4gd2UgdGVzdCB3aGV0aGVyIHNvbWV0aGluZyBpcyBjb250YWluZWQgd2l0aGluIGEgcmVxdWlyZW1lbnQ/CiAgICAjICAgICAgIElmIHNvIGhvdyBkbyB3ZSBkbyB0aGF0PyBEbyB3ZSBuZWVkIHRvIHRlc3QgYWdhaW5zdCB0aGUgX25hbWVfIG9mCiAgICAjICAgICAgIHRoZSB0aGluZyBhcyB3ZWxsIGFzIHRoZSB2ZXJzaW9uPyBXaGF0IGFib3V0IHRoZSBtYXJrZXJzPwogICAgIyBUT0RPOiBDYW4gd2Ugbm9ybWFsaXplIHRoZSBuYW1lIGFuZCBleHRyYSBuYW1lPwoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCByZXF1aXJlbWVudF9zdHJpbmcpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmVxID0gUkVRVUlSRU1FTlQucGFyc2VTdHJpbmcocmVxdWlyZW1lbnRfc3RyaW5nKQogICAgICAgIGV4Y2VwdCBQYXJzZUV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICByYWlzZSBJbnZhbGlkUmVxdWlyZW1lbnQoCiAgICAgICAgICAgICAgICAiSW52YWxpZCByZXF1aXJlbWVudCwgcGFyc2UgZXJyb3IgYXQgXCJ7MCFyfVwiIi5mb3JtYXQoCiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZW1lbnRfc3RyaW5nW2UubG9jOmUubG9jICsgOF0pKQoKICAgICAgICBzZWxmLm5hbWUgPSByZXEubmFtZQogICAgICAgIGlmIHJlcS51cmw6CiAgICAgICAgICAgIHBhcnNlZF91cmwgPSB1cmxwYXJzZS51cmxwYXJzZShyZXEudXJsKQogICAgICAgICAgICBpZiBub3QgKHBhcnNlZF91cmwuc2NoZW1lIGFuZCBwYXJzZWRfdXJsLm5ldGxvYykgb3IgKAogICAgICAgICAgICAgICAgICAgIG5vdCBwYXJzZWRfdXJsLnNjaGVtZSBhbmQgbm90IHBhcnNlZF91cmwubmV0bG9jKToKICAgICAgICAgICAgICAgIHJhaXNlIEludmFsaWRSZXF1aXJlbWVudCgiSW52YWxpZCBVUkwgZ2l2ZW4iKQogICAgICAgICAgICBzZWxmLnVybCA9IHJlcS51cmwKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnVybCA9IE5vbmUKICAgICAgICBzZWxmLmV4dHJhcyA9IHNldChyZXEuZXh0cmFzLmFzTGlzdCgpIGlmIHJlcS5leHRyYXMgZWxzZSBbXSkKICAgICAgICBzZWxmLnNwZWNpZmllciA9IFNwZWNpZmllclNldChyZXEuc3BlY2lmaWVyKQogICAgICAgIHNlbGYubWFya2VyID0gcmVxLm1hcmtlciBpZiByZXEubWFya2VyIGVsc2UgTm9uZQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHBhcnRzID0gW3NlbGYubmFtZV0KCiAgICAgICAgaWYgc2VsZi5leHRyYXM6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgiW3swfV0iLmZvcm1hdCgiLCIuam9pbihzb3J0ZWQoc2VsZi5leHRyYXMpKSkpCgogICAgICAgIGlmIHNlbGYuc3BlY2lmaWVyOgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoc3RyKHNlbGYuc3BlY2lmaWVyKSkKCiAgICAgICAgaWYgc2VsZi51cmw6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgiQCB7MH0iLmZvcm1hdChzZWxmLnVybCkpCgogICAgICAgIGlmIHNlbGYubWFya2VyOgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoIjsgezB9Ii5mb3JtYXQoc2VsZi5tYXJrZXIpKQoKICAgICAgICByZXR1cm4gIiIuam9pbihwYXJ0cykKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICI8UmVxdWlyZW1lbnQoezAhcn0pPiIuZm9ybWF0KHN0cihzZWxmKSkKUEsDBBQAAAAAAAAAIQB8RYOMeW0AAHltAABSAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvc3BlY2lmaWVycy5weSMgVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbgojIDIuMCwgYW5kIHRoZSBCU0QgTGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyByZXBvc2l0b3J5CiMgZm9yIGNvbXBsZXRlIGRldGFpbHMuCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgcHJpbnRfZnVuY3Rpb24KCmltcG9ydCBhYmMKaW1wb3J0IGZ1bmN0b29scwppbXBvcnQgaXRlcnRvb2xzCmltcG9ydCByZQoKZnJvbSAuX2NvbXBhdCBpbXBvcnQgc3RyaW5nX3R5cGVzLCB3aXRoX21ldGFjbGFzcwpmcm9tIC52ZXJzaW9uIGltcG9ydCBWZXJzaW9uLCBMZWdhY3lWZXJzaW9uLCBwYXJzZQoKCmNsYXNzIEludmFsaWRTcGVjaWZpZXIoVmFsdWVFcnJvcik6CiAgICAiIiIKICAgIEFuIGludmFsaWQgc3BlY2lmaWVyIHdhcyBmb3VuZCwgdXNlcnMgc2hvdWxkIHJlZmVyIHRvIFBFUCA0NDAuCiAgICAiIiIKCgpjbGFzcyBCYXNlU3BlY2lmaWVyKHdpdGhfbWV0YWNsYXNzKGFiYy5BQkNNZXRhLCBvYmplY3QpKToKCiAgICBAYWJjLmFic3RyYWN0bWV0aG9kCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm5zIHRoZSBzdHIgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBTcGVjaWZpZXIgbGlrZSBvYmplY3QuIFRoaXMKICAgICAgICBzaG91bGQgYmUgcmVwcmVzZW50YXRpdmUgb2YgdGhlIFNwZWNpZmllciBpdHNlbGYuCiAgICAgICAgIiIiCgogICAgQGFiYy5hYnN0cmFjdG1ldGhvZAogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybnMgYSBoYXNoIHZhbHVlIGZvciB0aGlzIFNwZWNpZmllciBsaWtlIG9iamVjdC4KICAgICAgICAiIiIKCiAgICBAYWJjLmFic3RyYWN0bWV0aG9kCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm5zIGEgYm9vbGVhbiByZXByZXNlbnRpbmcgd2hldGhlciBvciBub3QgdGhlIHR3byBTcGVjaWZpZXIgbGlrZQogICAgICAgIG9iamVjdHMgYXJlIGVxdWFsLgogICAgICAgICIiIgoKICAgIEBhYmMuYWJzdHJhY3RtZXRob2QKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgICIiIgogICAgICAgIFJldHVybnMgYSBib29sZWFuIHJlcHJlc2VudGluZyB3aGV0aGVyIG9yIG5vdCB0aGUgdHdvIFNwZWNpZmllciBsaWtlCiAgICAgICAgb2JqZWN0cyBhcmUgbm90IGVxdWFsLgogICAgICAgICIiIgoKICAgIEBhYmMuYWJzdHJhY3Rwcm9wZXJ0eQogICAgZGVmIHByZXJlbGVhc2VzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybnMgd2hldGhlciBvciBub3QgcHJlLXJlbGVhc2VzIGFzIGEgd2hvbGUgYXJlIGFsbG93ZWQgYnkgdGhpcwogICAgICAgIHNwZWNpZmllci4KICAgICAgICAiIiIKCiAgICBAcHJlcmVsZWFzZXMuc2V0dGVyCiAgICBkZWYgcHJlcmVsZWFzZXMoc2VsZiwgdmFsdWUpOgogICAgICAgICIiIgogICAgICAgIFNldHMgd2hldGhlciBvciBub3QgcHJlLXJlbGVhc2VzIGFzIGEgd2hvbGUgYXJlIGFsbG93ZWQgYnkgdGhpcwogICAgICAgIHNwZWNpZmllci4KICAgICAgICAiIiIKCiAgICBAYWJjLmFic3RyYWN0bWV0aG9kCiAgICBkZWYgY29udGFpbnMoc2VsZiwgaXRlbSwgcHJlcmVsZWFzZXM9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gaXRlbSBpcyBjb250YWluZWQgd2l0aGluIHRoaXMgc3BlY2lmaWVyLgogICAgICAgICIiIgoKICAgIEBhYmMuYWJzdHJhY3RtZXRob2QKICAgIGRlZiBmaWx0ZXIoc2VsZiwgaXRlcmFibGUsIHByZXJlbGVhc2VzPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIFRha2VzIGFuIGl0ZXJhYmxlIG9mIGl0ZW1zIGFuZCBmaWx0ZXJzIHRoZW0gc28gdGhhdCBvbmx5IGl0ZW1zIHdoaWNoCiAgICAgICAgYXJlIGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBzcGVjaWZpZXIgYXJlIGFsbG93ZWQgaW4gaXQuCiAgICAgICAgIiIiCgoKY2xhc3MgX0luZGl2aWR1YWxTcGVjaWZpZXIoQmFzZVNwZWNpZmllcik6CgogICAgX29wZXJhdG9ycyA9IHt9CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHNwZWM9IiIsIHByZXJlbGVhc2VzPU5vbmUpOgogICAgICAgIG1hdGNoID0gc2VsZi5fcmVnZXguc2VhcmNoKHNwZWMpCiAgICAgICAgaWYgbm90IG1hdGNoOgogICAgICAgICAgICByYWlzZSBJbnZhbGlkU3BlY2lmaWVyKCJJbnZhbGlkIHNwZWNpZmllcjogJ3swfSciLmZvcm1hdChzcGVjKSkKCiAgICAgICAgc2VsZi5fc3BlYyA9ICgKICAgICAgICAgICAgbWF0Y2guZ3JvdXAoIm9wZXJhdG9yIikuc3RyaXAoKSwKICAgICAgICAgICAgbWF0Y2guZ3JvdXAoInZlcnNpb24iKS5zdHJpcCgpLAogICAgICAgICkKCiAgICAgICAgIyBTdG9yZSB3aGV0aGVyIG9yIG5vdCB0aGlzIFNwZWNpZmllciBzaG91bGQgYWNjZXB0IHByZXJlbGVhc2VzCiAgICAgICAgc2VsZi5fcHJlcmVsZWFzZXMgPSBwcmVyZWxlYXNlcwoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICBwcmUgPSAoCiAgICAgICAgICAgICIsIHByZXJlbGVhc2VzPXswIXJ9Ii5mb3JtYXQoc2VsZi5wcmVyZWxlYXNlcykKICAgICAgICAgICAgaWYgc2VsZi5fcHJlcmVsZWFzZXMgaXMgbm90IE5vbmUKICAgICAgICAgICAgZWxzZSAiIgogICAgICAgICkKCiAgICAgICAgcmV0dXJuICI8ezB9KHsxIXJ9ezJ9KT4iLmZvcm1hdCgKICAgICAgICAgICAgc2VsZi5fX2NsYXNzX18uX19uYW1lX18sCiAgICAgICAgICAgIHN0cihzZWxmKSwKICAgICAgICAgICAgcHJlLAogICAgICAgICkKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gInswfXsxfSIuZm9ybWF0KCpzZWxmLl9zcGVjKQoKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICByZXR1cm4gaGFzaChzZWxmLl9zcGVjKQoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHN0cmluZ190eXBlcyk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIG90aGVyID0gc2VsZi5fX2NsYXNzX18ob3RoZXIpCiAgICAgICAgICAgIGV4Y2VwdCBJbnZhbGlkU3BlY2lmaWVyOgogICAgICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCiAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKCiAgICAgICAgcmV0dXJuIHNlbGYuX3NwZWMgPT0gb3RoZXIuX3NwZWMKCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBzdHJpbmdfdHlwZXMpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBvdGhlciA9IHNlbGYuX19jbGFzc19fKG90aGVyKQogICAgICAgICAgICBleGNlcHQgSW52YWxpZFNwZWNpZmllcjoKICAgICAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAogICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKToKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCgogICAgICAgIHJldHVybiBzZWxmLl9zcGVjICE9IG90aGVyLl9zcGVjCgogICAgZGVmIF9nZXRfb3BlcmF0b3Ioc2VsZiwgb3ApOgogICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYsICJfY29tcGFyZV97MH0iLmZvcm1hdChzZWxmLl9vcGVyYXRvcnNbb3BdKSkKCiAgICBkZWYgX2NvZXJjZV92ZXJzaW9uKHNlbGYsIHZlcnNpb24pOgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHZlcnNpb24sIChMZWdhY3lWZXJzaW9uLCBWZXJzaW9uKSk6CiAgICAgICAgICAgIHZlcnNpb24gPSBwYXJzZSh2ZXJzaW9uKQogICAgICAgIHJldHVybiB2ZXJzaW9uCgogICAgQHByb3BlcnR5CiAgICBkZWYgb3BlcmF0b3Ioc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3NwZWNbMF0KCiAgICBAcHJvcGVydHkKICAgIGRlZiB2ZXJzaW9uKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9zcGVjWzFdCgogICAgQHByb3BlcnR5CiAgICBkZWYgcHJlcmVsZWFzZXMoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3ByZXJlbGVhc2VzCgogICAgQHByZXJlbGVhc2VzLnNldHRlcgogICAgZGVmIHByZXJlbGVhc2VzKHNlbGYsIHZhbHVlKToKICAgICAgICBzZWxmLl9wcmVyZWxlYXNlcyA9IHZhbHVlCgogICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBpdGVtKToKICAgICAgICByZXR1cm4gc2VsZi5jb250YWlucyhpdGVtKQoKICAgIGRlZiBjb250YWlucyhzZWxmLCBpdGVtLCBwcmVyZWxlYXNlcz1Ob25lKToKICAgICAgICAjIERldGVybWluZSBpZiBwcmVyZWxlYXNlcyBhcmUgdG8gYmUgYWxsb3dlZCBvciBub3QuCiAgICAgICAgaWYgcHJlcmVsZWFzZXMgaXMgTm9uZToKICAgICAgICAgICAgcHJlcmVsZWFzZXMgPSBzZWxmLnByZXJlbGVhc2VzCgogICAgICAgICMgTm9ybWFsaXplIGl0ZW0gdG8gYSBWZXJzaW9uIG9yIExlZ2FjeVZlcnNpb24sIHRoaXMgYWxsb3dzIHVzIHRvIGhhdmUKICAgICAgICAjIGEgc2hvcnRjdXQgZm9yIGBgIjIuMCIgaW4gU3BlY2lmaWVyKCI+PTIiKQogICAgICAgIGl0ZW0gPSBzZWxmLl9jb2VyY2VfdmVyc2lvbihpdGVtKQoKICAgICAgICAjIERldGVybWluZSBpZiB3ZSBzaG91bGQgYmUgc3VwcG9ydGluZyBwcmVyZWxlYXNlcyBpbiB0aGlzIHNwZWNpZmllcgogICAgICAgICMgb3Igbm90LCBpZiB3ZSBkbyBub3Qgc3VwcG9ydCBwcmVyZWxlYXNlcyB0aGFuIHdlIGNhbiBzaG9ydCBjaXJjdWl0CiAgICAgICAgIyBsb2dpYyBpZiB0aGlzIHZlcnNpb24gaXMgYSBwcmVyZWxlYXNlcy4KICAgICAgICBpZiBpdGVtLmlzX3ByZXJlbGVhc2UgYW5kIG5vdCBwcmVyZWxlYXNlczoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICMgQWN0dWFsbHkgZG8gdGhlIGNvbXBhcmlzb24gdG8gZGV0ZXJtaW5lIGlmIHRoaXMgaXRlbSBpcyBjb250YWluZWQKICAgICAgICAjIHdpdGhpbiB0aGlzIFNwZWNpZmllciBvciBub3QuCiAgICAgICAgcmV0dXJuIHNlbGYuX2dldF9vcGVyYXRvcihzZWxmLm9wZXJhdG9yKShpdGVtLCBzZWxmLnZlcnNpb24pCgogICAgZGVmIGZpbHRlcihzZWxmLCBpdGVyYWJsZSwgcHJlcmVsZWFzZXM9Tm9uZSk6CiAgICAgICAgeWllbGRlZCA9IEZhbHNlCiAgICAgICAgZm91bmRfcHJlcmVsZWFzZXMgPSBbXQoKICAgICAgICBrdyA9IHsicHJlcmVsZWFzZXMiOiBwcmVyZWxlYXNlcyBpZiBwcmVyZWxlYXNlcyBpcyBub3QgTm9uZSBlbHNlIFRydWV9CgogICAgICAgICMgQXR0ZW1wdCB0byBpdGVyYXRlIG92ZXIgYWxsIHRoZSB2YWx1ZXMgaW4gdGhlIGl0ZXJhYmxlIGFuZCBpZiBhbnkgb2YKICAgICAgICAjIHRoZW0gbWF0Y2gsIHlpZWxkIHRoZW0uCiAgICAgICAgZm9yIHZlcnNpb24gaW4gaXRlcmFibGU6CiAgICAgICAgICAgIHBhcnNlZF92ZXJzaW9uID0gc2VsZi5fY29lcmNlX3ZlcnNpb24odmVyc2lvbikKCiAgICAgICAgICAgIGlmIHNlbGYuY29udGFpbnMocGFyc2VkX3ZlcnNpb24sICoqa3cpOgogICAgICAgICAgICAgICAgIyBJZiBvdXIgdmVyc2lvbiBpcyBhIHByZXJlbGVhc2UsIGFuZCB3ZSB3ZXJlIG5vdCBzZXQgdG8gYWxsb3cKICAgICAgICAgICAgICAgICMgcHJlcmVsZWFzZXMsIHRoZW4gd2UnbGwgc3RvcmUgaXQgZm9yIGxhdGVyIGluY2FzZSBub3RoaW5nCiAgICAgICAgICAgICAgICAjIGVsc2UgbWF0Y2hlcyB0aGlzIHNwZWNpZmllci4KICAgICAgICAgICAgICAgIGlmIChwYXJzZWRfdmVyc2lvbi5pc19wcmVyZWxlYXNlIGFuZCBub3QKICAgICAgICAgICAgICAgICAgICAgICAgKHByZXJlbGVhc2VzIG9yIHNlbGYucHJlcmVsZWFzZXMpKToKICAgICAgICAgICAgICAgICAgICBmb3VuZF9wcmVyZWxlYXNlcy5hcHBlbmQodmVyc2lvbikKICAgICAgICAgICAgICAgICMgRWl0aGVyIHRoaXMgaXMgbm90IGEgcHJlcmVsZWFzZSwgb3Igd2Ugc2hvdWxkIGhhdmUgYmVlbgogICAgICAgICAgICAgICAgIyBhY2NlcHRpbmcgcHJlcmVsZWFzZXMgZnJvbSB0aGUgYmVnaW5pbmcuCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHlpZWxkZWQgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgeWllbGQgdmVyc2lvbgoKICAgICAgICAjIE5vdyB0aGF0IHdlJ3ZlIGl0ZXJhdGVkIG92ZXIgZXZlcnl0aGluZywgZGV0ZXJtaW5lIGlmIHdlJ3ZlIHlpZWxkZWQKICAgICAgICAjIGFueSB2YWx1ZXMsIGFuZCBpZiB3ZSBoYXZlIG5vdCBhbmQgd2UgaGF2ZSBhbnkgcHJlcmVsZWFzZXMgc3RvcmVkIHVwCiAgICAgICAgIyB0aGVuIHdlIHdpbGwgZ28gYWhlYWQgYW5kIHlpZWxkIHRoZSBwcmVyZWxlYXNlcy4KICAgICAgICBpZiBub3QgeWllbGRlZCBhbmQgZm91bmRfcHJlcmVsZWFzZXM6CiAgICAgICAgICAgIGZvciB2ZXJzaW9uIGluIGZvdW5kX3ByZXJlbGVhc2VzOgogICAgICAgICAgICAgICAgeWllbGQgdmVyc2lvbgoKCmNsYXNzIExlZ2FjeVNwZWNpZmllcihfSW5kaXZpZHVhbFNwZWNpZmllcik6CgogICAgX3JlZ2V4X3N0ciA9ICgKICAgICAgICByIiIiCiAgICAgICAgKD9QPG9wZXJhdG9yPig9PXwhPXw8PXw+PXw8fD4pKQogICAgICAgIFxzKgogICAgICAgICg/UDx2ZXJzaW9uPgogICAgICAgICAgICBbXiw7XHMpXSogIyBTaW5jZSB0aGlzIGlzIGEgImxlZ2FjeSIgc3BlY2lmaWVyLCBhbmQgdGhlIHZlcnNpb24KICAgICAgICAgICAgICAgICAgICAgICMgc3RyaW5nIGNhbiBiZSBqdXN0IGFib3V0IGFueXRoaW5nLCB3ZSBtYXRjaCBldmVyeXRoaW5nCiAgICAgICAgICAgICAgICAgICAgICAjIGV4Y2VwdCBmb3Igd2hpdGVzcGFjZSwgYSBzZW1pLWNvbG9uIGZvciBtYXJrZXIgc3VwcG9ydCwKICAgICAgICAgICAgICAgICAgICAgICMgYSBjbG9zaW5nIHBhcmVuIHNpbmNlIHZlcnNpb25zIGNhbiBiZSBlbmNsb3NlZCBpbgogICAgICAgICAgICAgICAgICAgICAgIyB0aGVtLCBhbmQgYSBjb21tYSBzaW5jZSBpdCdzIGEgdmVyc2lvbiBzZXBhcmF0b3IuCiAgICAgICAgKQogICAgICAgICIiIgogICAgKQoKICAgIF9yZWdleCA9IHJlLmNvbXBpbGUoCiAgICAgICAgciJeXHMqIiArIF9yZWdleF9zdHIgKyByIlxzKiQiLCByZS5WRVJCT1NFIHwgcmUuSUdOT1JFQ0FTRSkKCiAgICBfb3BlcmF0b3JzID0gewogICAgICAgICI9PSI6ICJlcXVhbCIsCiAgICAgICAgIiE9IjogIm5vdF9lcXVhbCIsCiAgICAgICAgIjw9IjogImxlc3NfdGhhbl9lcXVhbCIsCiAgICAgICAgIj49IjogImdyZWF0ZXJfdGhhbl9lcXVhbCIsCiAgICAgICAgIjwiOiAibGVzc190aGFuIiwKICAgICAgICAiPiI6ICJncmVhdGVyX3RoYW4iLAogICAgfQoKICAgIGRlZiBfY29lcmNlX3ZlcnNpb24oc2VsZiwgdmVyc2lvbik6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodmVyc2lvbiwgTGVnYWN5VmVyc2lvbik6CiAgICAgICAgICAgIHZlcnNpb24gPSBMZWdhY3lWZXJzaW9uKHN0cih2ZXJzaW9uKSkKICAgICAgICByZXR1cm4gdmVyc2lvbgoKICAgIGRlZiBfY29tcGFyZV9lcXVhbChzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgcmV0dXJuIHByb3NwZWN0aXZlID09IHNlbGYuX2NvZXJjZV92ZXJzaW9uKHNwZWMpCgogICAgZGVmIF9jb21wYXJlX25vdF9lcXVhbChzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgcmV0dXJuIHByb3NwZWN0aXZlICE9IHNlbGYuX2NvZXJjZV92ZXJzaW9uKHNwZWMpCgogICAgZGVmIF9jb21wYXJlX2xlc3NfdGhhbl9lcXVhbChzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgcmV0dXJuIHByb3NwZWN0aXZlIDw9IHNlbGYuX2NvZXJjZV92ZXJzaW9uKHNwZWMpCgogICAgZGVmIF9jb21wYXJlX2dyZWF0ZXJfdGhhbl9lcXVhbChzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgcmV0dXJuIHByb3NwZWN0aXZlID49IHNlbGYuX2NvZXJjZV92ZXJzaW9uKHNwZWMpCgogICAgZGVmIF9jb21wYXJlX2xlc3NfdGhhbihzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgcmV0dXJuIHByb3NwZWN0aXZlIDwgc2VsZi5fY29lcmNlX3ZlcnNpb24oc3BlYykKCiAgICBkZWYgX2NvbXBhcmVfZ3JlYXRlcl90aGFuKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICByZXR1cm4gcHJvc3BlY3RpdmUgPiBzZWxmLl9jb2VyY2VfdmVyc2lvbihzcGVjKQoKCmRlZiBfcmVxdWlyZV92ZXJzaW9uX2NvbXBhcmUoZm4pOgogICAgQGZ1bmN0b29scy53cmFwcyhmbikKICAgIGRlZiB3cmFwcGVkKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShwcm9zcGVjdGl2ZSwgVmVyc2lvbik6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIHJldHVybiBmbihzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYykKICAgIHJldHVybiB3cmFwcGVkCgoKY2xhc3MgU3BlY2lmaWVyKF9JbmRpdmlkdWFsU3BlY2lmaWVyKToKCiAgICBfcmVnZXhfc3RyID0gKAogICAgICAgIHIiIiIKICAgICAgICAoP1A8b3BlcmF0b3I+KH49fD09fCE9fDw9fD49fDx8Pnw9PT0pKQogICAgICAgICg/UDx2ZXJzaW9uPgogICAgICAgICAgICAoPzoKICAgICAgICAgICAgICAgICMgVGhlIGlkZW50aXR5IG9wZXJhdG9ycyBhbGxvdyBmb3IgYW4gZXNjYXBlIGhhdGNoIHRoYXQgd2lsbAogICAgICAgICAgICAgICAgIyBkbyBhbiBleGFjdCBzdHJpbmcgbWF0Y2ggb2YgdGhlIHZlcnNpb24geW91IHdpc2ggdG8gaW5zdGFsbC4KICAgICAgICAgICAgICAgICMgVGhpcyB3aWxsIG5vdCBiZSBwYXJzZWQgYnkgUEVQIDQ0MCBhbmQgd2UgY2Fubm90IGRldGVybWluZQogICAgICAgICAgICAgICAgIyBhbnkgc2VtYW50aWMgbWVhbmluZyBmcm9tIGl0LiBUaGlzIG9wZXJhdG9yIGlzIGRpc2NvdXJhZ2VkCiAgICAgICAgICAgICAgICAjIGJ1dCBpbmNsdWRlZCBlbnRpcmVseSBhcyBhbiBlc2NhcGUgaGF0Y2guCiAgICAgICAgICAgICAgICAoPzw9PT09KSAgIyBPbmx5IG1hdGNoIGZvciB0aGUgaWRlbnRpdHkgb3BlcmF0b3IKICAgICAgICAgICAgICAgIFxzKgogICAgICAgICAgICAgICAgW15cc10qICAgICMgV2UganVzdCBtYXRjaCBldmVyeXRoaW5nLCBleGNlcHQgZm9yIHdoaXRlc3BhY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNpbmNlIHdlIGFyZSBvbmx5IHRlc3RpbmcgZm9yIHN0cmljdCBpZGVudGl0eS4KICAgICAgICAgICAgKQogICAgICAgICAgICB8CiAgICAgICAgICAgICg/OgogICAgICAgICAgICAgICAgIyBUaGUgKG5vbillcXVhbGl0eSBvcGVyYXRvcnMgYWxsb3cgZm9yIHdpbGQgY2FyZCBhbmQgbG9jYWwKICAgICAgICAgICAgICAgICMgdmVyc2lvbnMgdG8gYmUgc3BlY2lmaWVkIHNvIHdlIGhhdmUgdG8gZGVmaW5lIHRoZXNlIHR3bwogICAgICAgICAgICAgICAgIyBvcGVyYXRvcnMgc2VwYXJhdGVseSB0byBlbmFibGUgdGhhdC4KICAgICAgICAgICAgICAgICg/PD09PXwhPSkgICAgICAgICAgICAjIE9ubHkgbWF0Y2ggZm9yIGVxdWFscyBhbmQgbm90IGVxdWFscwoKICAgICAgICAgICAgICAgIFxzKgogICAgICAgICAgICAgICAgdj8KICAgICAgICAgICAgICAgICg/OlswLTldKyEpPyAgICAgICAgICAjIGVwb2NoCiAgICAgICAgICAgICAgICBbMC05XSsoPzpcLlswLTldKykqICAgIyByZWxlYXNlCiAgICAgICAgICAgICAgICAoPzogICAgICAgICAgICAgICAgICAgIyBwcmUgcmVsZWFzZQogICAgICAgICAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgICAgICAgICAoYXxifGN8cmN8YWxwaGF8YmV0YXxwcmV8cHJldmlldykKICAgICAgICAgICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICAgICAgICAgWzAtOV0qCiAgICAgICAgICAgICAgICApPwogICAgICAgICAgICAgICAgKD86ICAgICAgICAgICAgICAgICAgICMgcG9zdCByZWxlYXNlCiAgICAgICAgICAgICAgICAgICAgKD86LVswLTldKyl8KD86Wy1fXC5dPyhwb3N0fHJldnxyKVstX1wuXT9bMC05XSopCiAgICAgICAgICAgICAgICApPwoKICAgICAgICAgICAgICAgICMgWW91IGNhbm5vdCB1c2UgYSB3aWxkIGNhcmQgYW5kIGEgZGV2IG9yIGxvY2FsIHZlcnNpb24KICAgICAgICAgICAgICAgICMgdG9nZXRoZXIgc28gZ3JvdXAgdGhlbSB3aXRoIGEgfCBhbmQgbWFrZSB0aGVtIG9wdGlvbmFsLgogICAgICAgICAgICAgICAgKD86CiAgICAgICAgICAgICAgICAgICAgKD86Wy1fXC5dP2RldlstX1wuXT9bMC05XSopPyAgICAgICAgICMgZGV2IHJlbGVhc2UKICAgICAgICAgICAgICAgICAgICAoPzpcK1thLXowLTldKyg/OlstX1wuXVthLXowLTldKykqKT8gIyBsb2NhbAogICAgICAgICAgICAgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICBcLlwqICAjIFdpbGQgY2FyZCBzeW50YXggb2YgLioKICAgICAgICAgICAgICAgICk/CiAgICAgICAgICAgICkKICAgICAgICAgICAgfAogICAgICAgICAgICAoPzoKICAgICAgICAgICAgICAgICMgVGhlIGNvbXBhdGlibGUgb3BlcmF0b3IgcmVxdWlyZXMgYXQgbGVhc3QgdHdvIGRpZ2l0cyBpbiB0aGUKICAgICAgICAgICAgICAgICMgcmVsZWFzZSBzZWdtZW50LgogICAgICAgICAgICAgICAgKD88PX49KSAgICAgICAgICAgICAgICMgT25seSBtYXRjaCBmb3IgdGhlIGNvbXBhdGlibGUgb3BlcmF0b3IKCiAgICAgICAgICAgICAgICBccyoKICAgICAgICAgICAgICAgIHY/CiAgICAgICAgICAgICAgICAoPzpbMC05XSshKT8gICAgICAgICAgIyBlcG9jaAogICAgICAgICAgICAgICAgWzAtOV0rKD86XC5bMC05XSspKyAgICMgcmVsZWFzZSAgKFdlIGhhdmUgYSArIGluc3RlYWQgb2YgYSAqKQogICAgICAgICAgICAgICAgKD86ICAgICAgICAgICAgICAgICAgICMgcHJlIHJlbGVhc2UKICAgICAgICAgICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICAgICAgICAgKGF8YnxjfHJjfGFscGhhfGJldGF8cHJlfHByZXZpZXcpCiAgICAgICAgICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAgICAgICAgIFswLTldKgogICAgICAgICAgICAgICAgKT8KICAgICAgICAgICAgICAgICg/OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwb3N0IHJlbGVhc2UKICAgICAgICAgICAgICAgICAgICAoPzotWzAtOV0rKXwoPzpbLV9cLl0/KHBvc3R8cmV2fHIpWy1fXC5dP1swLTldKikKICAgICAgICAgICAgICAgICk/CiAgICAgICAgICAgICAgICAoPzpbLV9cLl0/ZGV2Wy1fXC5dP1swLTldKik/ICAgICAgICAgICMgZGV2IHJlbGVhc2UKICAgICAgICAgICAgKQogICAgICAgICAgICB8CiAgICAgICAgICAgICg/OgogICAgICAgICAgICAgICAgIyBBbGwgb3RoZXIgb3BlcmF0b3JzIG9ubHkgYWxsb3cgYSBzdWIgc2V0IG9mIHdoYXQgdGhlCiAgICAgICAgICAgICAgICAjIChub24pZXF1YWxpdHkgb3BlcmF0b3JzIGRvLiBTcGVjaWZpY2FsbHkgdGhleSBkbyBub3QgYWxsb3cKICAgICAgICAgICAgICAgICMgbG9jYWwgdmVyc2lvbnMgdG8gYmUgc3BlY2lmaWVkIG5vciBkbyB0aGV5IGFsbG93IHRoZSBwcmVmaXgKICAgICAgICAgICAgICAgICMgbWF0Y2hpbmcgd2lsZCBjYXJkcy4KICAgICAgICAgICAgICAgICg/PCE9PXwhPXx+PSkgICAgICAgICAjIFdlIGhhdmUgc3BlY2lhbCBjYXNlcyBmb3IgdGhlc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9wZXJhdG9ycyBzbyB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB0aGV5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBkb24ndCBtYXRjaCBoZXJlLgoKICAgICAgICAgICAgICAgIFxzKgogICAgICAgICAgICAgICAgdj8KICAgICAgICAgICAgICAgICg/OlswLTldKyEpPyAgICAgICAgICAjIGVwb2NoCiAgICAgICAgICAgICAgICBbMC05XSsoPzpcLlswLTldKykqICAgIyByZWxlYXNlCiAgICAgICAgICAgICAgICAoPzogICAgICAgICAgICAgICAgICAgIyBwcmUgcmVsZWFzZQogICAgICAgICAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgICAgICAgICAoYXxifGN8cmN8YWxwaGF8YmV0YXxwcmV8cHJldmlldykKICAgICAgICAgICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICAgICAgICAgWzAtOV0qCiAgICAgICAgICAgICAgICApPwogICAgICAgICAgICAgICAgKD86ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHBvc3QgcmVsZWFzZQogICAgICAgICAgICAgICAgICAgICg/Oi1bMC05XSspfCg/OlstX1wuXT8ocG9zdHxyZXZ8cilbLV9cLl0/WzAtOV0qKQogICAgICAgICAgICAgICAgKT8KICAgICAgICAgICAgICAgICg/OlstX1wuXT9kZXZbLV9cLl0/WzAtOV0qKT8gICAgICAgICAgIyBkZXYgcmVsZWFzZQogICAgICAgICAgICApCiAgICAgICAgKQogICAgICAgICIiIgogICAgKQoKICAgIF9yZWdleCA9IHJlLmNvbXBpbGUoCiAgICAgICAgciJeXHMqIiArIF9yZWdleF9zdHIgKyByIlxzKiQiLCByZS5WRVJCT1NFIHwgcmUuSUdOT1JFQ0FTRSkKCiAgICBfb3BlcmF0b3JzID0gewogICAgICAgICJ+PSI6ICJjb21wYXRpYmxlIiwKICAgICAgICAiPT0iOiAiZXF1YWwiLAogICAgICAgICIhPSI6ICJub3RfZXF1YWwiLAogICAgICAgICI8PSI6ICJsZXNzX3RoYW5fZXF1YWwiLAogICAgICAgICI+PSI6ICJncmVhdGVyX3RoYW5fZXF1YWwiLAogICAgICAgICI8IjogImxlc3NfdGhhbiIsCiAgICAgICAgIj4iOiAiZ3JlYXRlcl90aGFuIiwKICAgICAgICAiPT09IjogImFyYml0cmFyeSIsCiAgICB9CgogICAgQF9yZXF1aXJlX3ZlcnNpb25fY29tcGFyZQogICAgZGVmIF9jb21wYXJlX2NvbXBhdGlibGUoc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgICMgQ29tcGF0aWJsZSByZWxlYXNlcyBoYXZlIGFuIGVxdWl2YWxlbnQgY29tYmluYXRpb24gb2YgPj0gYW5kID09LiBUaGF0CiAgICAgICAgIyBpcyB0aGF0IH49Mi4yIGlzIGVxdWl2YWxlbnQgdG8gPj0yLjIsPT0yLiouIFRoaXMgYWxsb3dzIHVzIHRvCiAgICAgICAgIyBpbXBsZW1lbnQgdGhpcyBpbiB0ZXJtcyBvZiB0aGUgb3RoZXIgc3BlY2lmaWVycyBpbnN0ZWFkIG9mCiAgICAgICAgIyBpbXBsZW1lbnRpbmcgaXQgb3Vyc2VsdmVzLiBUaGUgb25seSB0aGluZyB3ZSBuZWVkIHRvIGRvIGlzIGNvbnN0cnVjdAogICAgICAgICMgdGhlIG90aGVyIHNwZWNpZmllcnMuCgogICAgICAgICMgV2Ugd2FudCBldmVyeXRoaW5nIGJ1dCB0aGUgbGFzdCBpdGVtIGluIHRoZSB2ZXJzaW9uLCBidXQgd2Ugd2FudCB0bwogICAgICAgICMgaWdub3JlIHBvc3QgYW5kIGRldiByZWxlYXNlcyBhbmQgd2Ugd2FudCB0byB0cmVhdCB0aGUgcHJlLXJlbGVhc2UgYXMKICAgICAgICAjIGl0J3Mgb3duIHNlcGFyYXRlIHNlZ21lbnQuCiAgICAgICAgcHJlZml4ID0gIi4iLmpvaW4oCiAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgICBpdGVydG9vbHMudGFrZXdoaWxlKAogICAgICAgICAgICAgICAgICAgIGxhbWJkYSB4OiAobm90IHguc3RhcnRzd2l0aCgicG9zdCIpIGFuZCBub3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHguc3RhcnRzd2l0aCgiZGV2IikpLAogICAgICAgICAgICAgICAgICAgIF92ZXJzaW9uX3NwbGl0KHNwZWMpLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICApWzotMV0KICAgICAgICApCgogICAgICAgICMgQWRkIHRoZSBwcmVmaXggbm90YXRpb24gdG8gdGhlIGVuZCBvZiBvdXIgc3RyaW5nCiAgICAgICAgcHJlZml4ICs9ICIuKiIKCiAgICAgICAgcmV0dXJuIChzZWxmLl9nZXRfb3BlcmF0b3IoIj49IikocHJvc3BlY3RpdmUsIHNwZWMpIGFuZAogICAgICAgICAgICAgICAgc2VsZi5fZ2V0X29wZXJhdG9yKCI9PSIpKHByb3NwZWN0aXZlLCBwcmVmaXgpKQoKICAgIEBfcmVxdWlyZV92ZXJzaW9uX2NvbXBhcmUKICAgIGRlZiBfY29tcGFyZV9lcXVhbChzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgIyBXZSBuZWVkIHNwZWNpYWwgbG9naWMgdG8gaGFuZGxlIHByZWZpeCBtYXRjaGluZwogICAgICAgIGlmIHNwZWMuZW5kc3dpdGgoIi4qIik6CiAgICAgICAgICAgICMgSW4gdGhlIGNhc2Ugb2YgcHJlZml4IG1hdGNoaW5nIHdlIHdhbnQgdG8gaWdub3JlIGxvY2FsIHNlZ21lbnQuCiAgICAgICAgICAgIHByb3NwZWN0aXZlID0gVmVyc2lvbihwcm9zcGVjdGl2ZS5wdWJsaWMpCiAgICAgICAgICAgICMgU3BsaXQgdGhlIHNwZWMgb3V0IGJ5IGRvdHMsIGFuZCBwcmV0ZW5kIHRoYXQgdGhlcmUgaXMgYW4gaW1wbGljaXQKICAgICAgICAgICAgIyBkb3QgaW4gYmV0d2VlbiBhIHJlbGVhc2Ugc2VnbWVudCBhbmQgYSBwcmUtcmVsZWFzZSBzZWdtZW50LgogICAgICAgICAgICBzcGVjID0gX3ZlcnNpb25fc3BsaXQoc3BlY1s6LTJdKSAgIyBSZW1vdmUgdGhlIHRyYWlsaW5nIC4qCgogICAgICAgICAgICAjIFNwbGl0IHRoZSBwcm9zcGVjdGl2ZSB2ZXJzaW9uIG91dCBieSBkb3RzLCBhbmQgcHJldGVuZCB0aGF0IHRoZXJlCiAgICAgICAgICAgICMgaXMgYW4gaW1wbGljaXQgZG90IGluIGJldHdlZW4gYSByZWxlYXNlIHNlZ21lbnQgYW5kIGEgcHJlLXJlbGVhc2UKICAgICAgICAgICAgIyBzZWdtZW50LgogICAgICAgICAgICBwcm9zcGVjdGl2ZSA9IF92ZXJzaW9uX3NwbGl0KHN0cihwcm9zcGVjdGl2ZSkpCgogICAgICAgICAgICAjIFNob3J0ZW4gdGhlIHByb3NwZWN0aXZlIHZlcnNpb24gdG8gYmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBzcGVjCiAgICAgICAgICAgICMgc28gdGhhdCB3ZSBjYW4gZGV0ZXJtaW5lIGlmIHRoZSBzcGVjaWZpZXIgaXMgYSBwcmVmaXggb2YgdGhlCiAgICAgICAgICAgICMgcHJvc3BlY3RpdmUgdmVyc2lvbiBvciBub3QuCiAgICAgICAgICAgIHByb3NwZWN0aXZlID0gcHJvc3BlY3RpdmVbOmxlbihzcGVjKV0KCiAgICAgICAgICAgICMgUGFkIG91dCBvdXIgdHdvIHNpZGVzIHdpdGggemVyb3Mgc28gdGhhdCB0aGV5IGJvdGggZXF1YWwgdGhlIHNhbWUKICAgICAgICAgICAgIyBsZW5ndGguCiAgICAgICAgICAgIHNwZWMsIHByb3NwZWN0aXZlID0gX3BhZF92ZXJzaW9uKHNwZWMsIHByb3NwZWN0aXZlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgQ29udmVydCBvdXIgc3BlYyBzdHJpbmcgaW50byBhIFZlcnNpb24KICAgICAgICAgICAgc3BlYyA9IFZlcnNpb24oc3BlYykKCiAgICAgICAgICAgICMgSWYgdGhlIHNwZWNpZmllciBkb2VzIG5vdCBoYXZlIGEgbG9jYWwgc2VnbWVudCwgdGhlbiB3ZSB3YW50IHRvCiAgICAgICAgICAgICMgYWN0IGFzIGlmIHRoZSBwcm9zcGVjdGl2ZSB2ZXJzaW9uIGFsc28gZG9lcyBub3QgaGF2ZSBhIGxvY2FsCiAgICAgICAgICAgICMgc2VnbWVudC4KICAgICAgICAgICAgaWYgbm90IHNwZWMubG9jYWw6CiAgICAgICAgICAgICAgICBwcm9zcGVjdGl2ZSA9IFZlcnNpb24ocHJvc3BlY3RpdmUucHVibGljKQoKICAgICAgICByZXR1cm4gcHJvc3BlY3RpdmUgPT0gc3BlYwoKICAgIEBfcmVxdWlyZV92ZXJzaW9uX2NvbXBhcmUKICAgIGRlZiBfY29tcGFyZV9ub3RfZXF1YWwoc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgIHJldHVybiBub3Qgc2VsZi5fY29tcGFyZV9lcXVhbChwcm9zcGVjdGl2ZSwgc3BlYykKCiAgICBAX3JlcXVpcmVfdmVyc2lvbl9jb21wYXJlCiAgICBkZWYgX2NvbXBhcmVfbGVzc190aGFuX2VxdWFsKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICByZXR1cm4gcHJvc3BlY3RpdmUgPD0gVmVyc2lvbihzcGVjKQoKICAgIEBfcmVxdWlyZV92ZXJzaW9uX2NvbXBhcmUKICAgIGRlZiBfY29tcGFyZV9ncmVhdGVyX3RoYW5fZXF1YWwoc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgIHJldHVybiBwcm9zcGVjdGl2ZSA+PSBWZXJzaW9uKHNwZWMpCgogICAgQF9yZXF1aXJlX3ZlcnNpb25fY29tcGFyZQogICAgZGVmIF9jb21wYXJlX2xlc3NfdGhhbihzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgIyBDb252ZXJ0IG91ciBzcGVjIHRvIGEgVmVyc2lvbiBpbnN0YW5jZSwgc2luY2Ugd2UnbGwgd2FudCB0byB3b3JrIHdpdGgKICAgICAgICAjIGl0IGFzIGEgdmVyc2lvbi4KICAgICAgICBzcGVjID0gVmVyc2lvbihzcGVjKQoKICAgICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvc3BlY3RpdmUgdmVyc2lvbiBpcyBsZXNzIHRoYW4gdGhlIHNwZWMKICAgICAgICAjIHZlcnNpb24uIElmIGl0J3Mgbm90IHdlIGNhbiBzaG9ydCBjaXJjdWl0IGFuZCBqdXN0IHJldHVybiBGYWxzZSBub3cKICAgICAgICAjIGluc3RlYWQgb2YgZG9pbmcgZXh0cmEgdW5uZWVkZWQgd29yay4KICAgICAgICBpZiBub3QgcHJvc3BlY3RpdmUgPCBzcGVjOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgIyBUaGlzIHNwZWNpYWwgY2FzZSBpcyBoZXJlIHNvIHRoYXQsIHVubGVzcyB0aGUgc3BlY2lmaWVyIGl0c2VsZgogICAgICAgICMgaW5jbHVkZXMgaXMgYSBwcmUtcmVsZWFzZSB2ZXJzaW9uLCB0aGF0IHdlIGRvIG5vdCBhY2NlcHQgcHJlLXJlbGVhc2UKICAgICAgICAjIHZlcnNpb25zIGZvciB0aGUgdmVyc2lvbiBtZW50aW9uZWQgaW4gdGhlIHNwZWNpZmllciAoZS5nLiA8My4xIHNob3VsZAogICAgICAgICMgbm90IG1hdGNoIDMuMS5kZXYwLCBidXQgc2hvdWxkIG1hdGNoIDMuMC5kZXYwKS4KICAgICAgICBpZiBub3Qgc3BlYy5pc19wcmVyZWxlYXNlIGFuZCBwcm9zcGVjdGl2ZS5pc19wcmVyZWxlYXNlOgogICAgICAgICAgICBpZiBWZXJzaW9uKHByb3NwZWN0aXZlLmJhc2VfdmVyc2lvbikgPT0gVmVyc2lvbihzcGVjLmJhc2VfdmVyc2lvbik6CiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgIyBJZiB3ZSd2ZSBnb3R0ZW4gdG8gaGVyZSwgaXQgbWVhbnMgdGhhdCBwcm9zcGVjdGl2ZSB2ZXJzaW9uIGlzIGJvdGgKICAgICAgICAjIGxlc3MgdGhhbiB0aGUgc3BlYyB2ZXJzaW9uICphbmQqIGl0J3Mgbm90IGEgcHJlLXJlbGVhc2Ugb2YgdGhlIHNhbWUKICAgICAgICAjIHZlcnNpb24gaW4gdGhlIHNwZWMuCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBAX3JlcXVpcmVfdmVyc2lvbl9jb21wYXJlCiAgICBkZWYgX2NvbXBhcmVfZ3JlYXRlcl90aGFuKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICAjIENvbnZlcnQgb3VyIHNwZWMgdG8gYSBWZXJzaW9uIGluc3RhbmNlLCBzaW5jZSB3ZSdsbCB3YW50IHRvIHdvcmsgd2l0aAogICAgICAgICMgaXQgYXMgYSB2ZXJzaW9uLgogICAgICAgIHNwZWMgPSBWZXJzaW9uKHNwZWMpCgogICAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9zcGVjdGl2ZSB2ZXJzaW9uIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc3BlYwogICAgICAgICMgdmVyc2lvbi4gSWYgaXQncyBub3Qgd2UgY2FuIHNob3J0IGNpcmN1aXQgYW5kIGp1c3QgcmV0dXJuIEZhbHNlIG5vdwogICAgICAgICMgaW5zdGVhZCBvZiBkb2luZyBleHRyYSB1bm5lZWRlZCB3b3JrLgogICAgICAgIGlmIG5vdCBwcm9zcGVjdGl2ZSA+IHNwZWM6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAjIFRoaXMgc3BlY2lhbCBjYXNlIGlzIGhlcmUgc28gdGhhdCwgdW5sZXNzIHRoZSBzcGVjaWZpZXIgaXRzZWxmCiAgICAgICAgIyBpbmNsdWRlcyBpcyBhIHBvc3QtcmVsZWFzZSB2ZXJzaW9uLCB0aGF0IHdlIGRvIG5vdCBhY2NlcHQKICAgICAgICAjIHBvc3QtcmVsZWFzZSB2ZXJzaW9ucyBmb3IgdGhlIHZlcnNpb24gbWVudGlvbmVkIGluIHRoZSBzcGVjaWZpZXIKICAgICAgICAjIChlLmcuID4zLjEgc2hvdWxkIG5vdCBtYXRjaCAzLjAucG9zdDAsIGJ1dCBzaG91bGQgbWF0Y2ggMy4yLnBvc3QwKS4KICAgICAgICBpZiBub3Qgc3BlYy5pc19wb3N0cmVsZWFzZSBhbmQgcHJvc3BlY3RpdmUuaXNfcG9zdHJlbGVhc2U6CiAgICAgICAgICAgIGlmIFZlcnNpb24ocHJvc3BlY3RpdmUuYmFzZV92ZXJzaW9uKSA9PSBWZXJzaW9uKHNwZWMuYmFzZV92ZXJzaW9uKToKICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAjIEVuc3VyZSB0aGF0IHdlIGRvIG5vdCBhbGxvdyBhIGxvY2FsIHZlcnNpb24gb2YgdGhlIHZlcnNpb24gbWVudGlvbmVkCiAgICAgICAgIyBpbiB0aGUgc3BlY2lmaWVyLCB3aGljaCBpcyB0ZWNoaW5jYWxseSBncmVhdGVyIHRoYW4sIHRvIG1hdGNoLgogICAgICAgIGlmIHByb3NwZWN0aXZlLmxvY2FsIGlzIG5vdCBOb25lOgogICAgICAgICAgICBpZiBWZXJzaW9uKHByb3NwZWN0aXZlLmJhc2VfdmVyc2lvbikgPT0gVmVyc2lvbihzcGVjLmJhc2VfdmVyc2lvbik6CiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgIyBJZiB3ZSd2ZSBnb3R0ZW4gdG8gaGVyZSwgaXQgbWVhbnMgdGhhdCBwcm9zcGVjdGl2ZSB2ZXJzaW9uIGlzIGJvdGgKICAgICAgICAjIGdyZWF0ZXIgdGhhbiB0aGUgc3BlYyB2ZXJzaW9uICphbmQqIGl0J3Mgbm90IGEgcHJlLXJlbGVhc2Ugb2YgdGhlCiAgICAgICAgIyBzYW1lIHZlcnNpb24gaW4gdGhlIHNwZWMuCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgX2NvbXBhcmVfYXJiaXRyYXJ5KHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICByZXR1cm4gc3RyKHByb3NwZWN0aXZlKS5sb3dlcigpID09IHN0cihzcGVjKS5sb3dlcigpCgogICAgQHByb3BlcnR5CiAgICBkZWYgcHJlcmVsZWFzZXMoc2VsZik6CiAgICAgICAgIyBJZiB0aGVyZSBpcyBhbiBleHBsaWNpdCBwcmVyZWxlYXNlcyBzZXQgZm9yIHRoaXMsIHRoZW4gd2UnbGwganVzdAogICAgICAgICMgYmxpbmRseSB1c2UgdGhhdC4KICAgICAgICBpZiBzZWxmLl9wcmVyZWxlYXNlcyBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3ByZXJlbGVhc2VzCgogICAgICAgICMgTG9vayBhdCBhbGwgb2Ygb3VyIHNwZWNpZmllcnMgYW5kIGRldGVybWluZSBpZiB0aGV5IGFyZSBpbmNsdXNpdmUKICAgICAgICAjIG9wZXJhdG9ycywgYW5kIGlmIHRoZXkgYXJlIGlmIHRoZXkgYXJlIGluY2x1ZGluZyBhbiBleHBsaWNpdAogICAgICAgICMgcHJlcmVsZWFzZS4KICAgICAgICBvcGVyYXRvciwgdmVyc2lvbiA9IHNlbGYuX3NwZWMKICAgICAgICBpZiBvcGVyYXRvciBpbiBbIj09IiwgIj49IiwgIjw9IiwgIn49IiwgIj09PSJdOgogICAgICAgICAgICAjIFRoZSA9PSBzcGVjaWZpZXIgY2FuIGluY2x1ZGUgYSB0cmFpbGluZyAuKiwgaWYgaXQgZG9lcyB3ZQogICAgICAgICAgICAjIHdhbnQgdG8gcmVtb3ZlIGJlZm9yZSBwYXJzaW5nLgogICAgICAgICAgICBpZiBvcGVyYXRvciA9PSAiPT0iIGFuZCB2ZXJzaW9uLmVuZHN3aXRoKCIuKiIpOgogICAgICAgICAgICAgICAgdmVyc2lvbiA9IHZlcnNpb25bOi0yXQoKICAgICAgICAgICAgIyBQYXJzZSB0aGUgdmVyc2lvbiwgYW5kIGlmIGl0IGlzIGEgcHJlLXJlbGVhc2UgdGhhbiB0aGlzCiAgICAgICAgICAgICMgc3BlY2lmaWVyIGFsbG93cyBwcmUtcmVsZWFzZXMuCiAgICAgICAgICAgIGlmIHBhcnNlKHZlcnNpb24pLmlzX3ByZXJlbGVhc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBAcHJlcmVsZWFzZXMuc2V0dGVyCiAgICBkZWYgcHJlcmVsZWFzZXMoc2VsZiwgdmFsdWUpOgogICAgICAgIHNlbGYuX3ByZXJlbGVhc2VzID0gdmFsdWUKCgpfcHJlZml4X3JlZ2V4ID0gcmUuY29tcGlsZShyIl4oWzAtOV0rKSgoPzphfGJ8Y3xyYylbMC05XSspJCIpCgoKZGVmIF92ZXJzaW9uX3NwbGl0KHZlcnNpb24pOgogICAgcmVzdWx0ID0gW10KICAgIGZvciBpdGVtIGluIHZlcnNpb24uc3BsaXQoIi4iKToKICAgICAgICBtYXRjaCA9IF9wcmVmaXhfcmVnZXguc2VhcmNoKGl0ZW0pCiAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgIHJlc3VsdC5leHRlbmQobWF0Y2guZ3JvdXBzKCkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChpdGVtKQogICAgcmV0dXJuIHJlc3VsdAoKCmRlZiBfcGFkX3ZlcnNpb24obGVmdCwgcmlnaHQpOgogICAgbGVmdF9zcGxpdCwgcmlnaHRfc3BsaXQgPSBbXSwgW10KCiAgICAjIEdldCB0aGUgcmVsZWFzZSBzZWdtZW50IG9mIG91ciB2ZXJzaW9ucwogICAgbGVmdF9zcGxpdC5hcHBlbmQobGlzdChpdGVydG9vbHMudGFrZXdoaWxlKGxhbWJkYSB4OiB4LmlzZGlnaXQoKSwgbGVmdCkpKQogICAgcmlnaHRfc3BsaXQuYXBwZW5kKGxpc3QoaXRlcnRvb2xzLnRha2V3aGlsZShsYW1iZGEgeDogeC5pc2RpZ2l0KCksIHJpZ2h0KSkpCgogICAgIyBHZXQgdGhlIHJlc3Qgb2Ygb3VyIHZlcnNpb25zCiAgICBsZWZ0X3NwbGl0LmFwcGVuZChsZWZ0W2xlbihsZWZ0X3NwbGl0WzBdKTpdKQogICAgcmlnaHRfc3BsaXQuYXBwZW5kKHJpZ2h0W2xlbihyaWdodF9zcGxpdFswXSk6XSkKCiAgICAjIEluc2VydCBvdXIgcGFkZGluZwogICAgbGVmdF9zcGxpdC5pbnNlcnQoCiAgICAgICAgMSwKICAgICAgICBbIjAiXSAqIG1heCgwLCBsZW4ocmlnaHRfc3BsaXRbMF0pIC0gbGVuKGxlZnRfc3BsaXRbMF0pKSwKICAgICkKICAgIHJpZ2h0X3NwbGl0Lmluc2VydCgKICAgICAgICAxLAogICAgICAgIFsiMCJdICogbWF4KDAsIGxlbihsZWZ0X3NwbGl0WzBdKSAtIGxlbihyaWdodF9zcGxpdFswXSkpLAogICAgKQoKICAgIHJldHVybiAoCiAgICAgICAgbGlzdChpdGVydG9vbHMuY2hhaW4oKmxlZnRfc3BsaXQpKSwKICAgICAgICBsaXN0KGl0ZXJ0b29scy5jaGFpbigqcmlnaHRfc3BsaXQpKSwKICAgICkKCgpjbGFzcyBTcGVjaWZpZXJTZXQoQmFzZVNwZWNpZmllcik6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHNwZWNpZmllcnM9IiIsIHByZXJlbGVhc2VzPU5vbmUpOgogICAgICAgICMgU3BsaXQgb24gLCB0byBicmVhayBlYWNoIGluZGlkaXZ1YWwgc3BlY2lmaWVyIGludG8gaXQncyBvd24gaXRlbSwgYW5kCiAgICAgICAgIyBzdHJpcCBlYWNoIGl0ZW0gdG8gcmVtb3ZlIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZS4KICAgICAgICBzcGVjaWZpZXJzID0gW3Muc3RyaXAoKSBmb3IgcyBpbiBzcGVjaWZpZXJzLnNwbGl0KCIsIikgaWYgcy5zdHJpcCgpXQoKICAgICAgICAjIFBhcnNlZCBlYWNoIGluZGl2aWR1YWwgc3BlY2lmaWVyLCBhdHRlbXB0aW5nIGZpcnN0IHRvIG1ha2UgaXQgYQogICAgICAgICMgU3BlY2lmaWVyIGFuZCBmYWxsaW5nIGJhY2sgdG8gYSBMZWdhY3lTcGVjaWZpZXIuCiAgICAgICAgcGFyc2VkID0gc2V0KCkKICAgICAgICBmb3Igc3BlY2lmaWVyIGluIHNwZWNpZmllcnM6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHBhcnNlZC5hZGQoU3BlY2lmaWVyKHNwZWNpZmllcikpCiAgICAgICAgICAgIGV4Y2VwdCBJbnZhbGlkU3BlY2lmaWVyOgogICAgICAgICAgICAgICAgcGFyc2VkLmFkZChMZWdhY3lTcGVjaWZpZXIoc3BlY2lmaWVyKSkKCiAgICAgICAgIyBUdXJuIG91ciBwYXJzZWQgc3BlY2lmaWVycyBpbnRvIGEgZnJvemVuIHNldCBhbmQgc2F2ZSB0aGVtIGZvciBsYXRlci4KICAgICAgICBzZWxmLl9zcGVjcyA9IGZyb3plbnNldChwYXJzZWQpCgogICAgICAgICMgU3RvcmUgb3VyIHByZXJlbGVhc2VzIHZhbHVlIHNvIHdlIGNhbiB1c2UgaXQgbGF0ZXIgdG8gZGV0ZXJtaW5lIGlmCiAgICAgICAgIyB3ZSBhY2NlcHQgcHJlcmVsZWFzZXMgb3Igbm90LgogICAgICAgIHNlbGYuX3ByZXJlbGVhc2VzID0gcHJlcmVsZWFzZXMKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcHJlID0gKAogICAgICAgICAgICAiLCBwcmVyZWxlYXNlcz17MCFyfSIuZm9ybWF0KHNlbGYucHJlcmVsZWFzZXMpCiAgICAgICAgICAgIGlmIHNlbGYuX3ByZXJlbGVhc2VzIGlzIG5vdCBOb25lCiAgICAgICAgICAgIGVsc2UgIiIKICAgICAgICApCgogICAgICAgIHJldHVybiAiPFNwZWNpZmllclNldCh7MCFyfXsxfSk+Ii5mb3JtYXQoc3RyKHNlbGYpLCBwcmUpCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuICIsIi5qb2luKHNvcnRlZChzdHIocykgZm9yIHMgaW4gc2VsZi5fc3BlY3MpKQoKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICByZXR1cm4gaGFzaChzZWxmLl9zcGVjcykKCiAgICBkZWYgX19hbmRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgb3RoZXIgPSBTcGVjaWZpZXJTZXQob3RoZXIpCiAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgU3BlY2lmaWVyU2V0KToKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCgogICAgICAgIHNwZWNpZmllciA9IFNwZWNpZmllclNldCgpCiAgICAgICAgc3BlY2lmaWVyLl9zcGVjcyA9IGZyb3plbnNldChzZWxmLl9zcGVjcyB8IG90aGVyLl9zcGVjcykKCiAgICAgICAgaWYgc2VsZi5fcHJlcmVsZWFzZXMgaXMgTm9uZSBhbmQgb3RoZXIuX3ByZXJlbGVhc2VzIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzcGVjaWZpZXIuX3ByZXJlbGVhc2VzID0gb3RoZXIuX3ByZXJlbGVhc2VzCiAgICAgICAgZWxpZiBzZWxmLl9wcmVyZWxlYXNlcyBpcyBub3QgTm9uZSBhbmQgb3RoZXIuX3ByZXJlbGVhc2VzIGlzIE5vbmU6CiAgICAgICAgICAgIHNwZWNpZmllci5fcHJlcmVsZWFzZXMgPSBzZWxmLl9wcmVyZWxlYXNlcwogICAgICAgIGVsaWYgc2VsZi5fcHJlcmVsZWFzZXMgPT0gb3RoZXIuX3ByZXJlbGVhc2VzOgogICAgICAgICAgICBzcGVjaWZpZXIuX3ByZXJlbGVhc2VzID0gc2VsZi5fcHJlcmVsZWFzZXMKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAogICAgICAgICAgICAgICAgIkNhbm5vdCBjb21iaW5lIFNwZWNpZmllclNldHMgd2l0aCBUcnVlIGFuZCBGYWxzZSBwcmVyZWxlYXNlICIKICAgICAgICAgICAgICAgICJvdmVycmlkZXMuIgogICAgICAgICAgICApCgogICAgICAgIHJldHVybiBzcGVjaWZpZXIKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBzdHJpbmdfdHlwZXMpOgogICAgICAgICAgICBvdGhlciA9IFNwZWNpZmllclNldChvdGhlcikKICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob3RoZXIsIF9JbmRpdmlkdWFsU3BlY2lmaWVyKToKICAgICAgICAgICAgb3RoZXIgPSBTcGVjaWZpZXJTZXQoc3RyKG90aGVyKSkKICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBTcGVjaWZpZXJTZXQpOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKCiAgICAgICAgcmV0dXJuIHNlbGYuX3NwZWNzID09IG90aGVyLl9zcGVjcwoKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHN0cmluZ190eXBlcyk6CiAgICAgICAgICAgIG90aGVyID0gU3BlY2lmaWVyU2V0KG90aGVyKQogICAgICAgIGVsaWYgaXNpbnN0YW5jZShvdGhlciwgX0luZGl2aWR1YWxTcGVjaWZpZXIpOgogICAgICAgICAgICBvdGhlciA9IFNwZWNpZmllclNldChzdHIob3RoZXIpKQogICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIFNwZWNpZmllclNldCk6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAoKICAgICAgICByZXR1cm4gc2VsZi5fc3BlY3MgIT0gb3RoZXIuX3NwZWNzCgogICAgZGVmIF9fbGVuX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGxlbihzZWxmLl9zcGVjcykKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGl0ZXIoc2VsZi5fc3BlY3MpCgogICAgQHByb3BlcnR5CiAgICBkZWYgcHJlcmVsZWFzZXMoc2VsZik6CiAgICAgICAgIyBJZiB3ZSBoYXZlIGJlZW4gZ2l2ZW4gYW4gZXhwbGljaXQgcHJlcmVsZWFzZSBtb2RpZmllciwgdGhlbiB3ZSdsbAogICAgICAgICMgcGFzcyB0aGF0IHRocm91Z2ggaGVyZS4KICAgICAgICBpZiBzZWxmLl9wcmVyZWxlYXNlcyBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3ByZXJlbGVhc2VzCgogICAgICAgICMgSWYgd2UgZG9uJ3QgaGF2ZSBhbnkgc3BlY2lmaWVycywgYW5kIHdlIGRvbid0IGhhdmUgYSBmb3JjZWQgdmFsdWUsCiAgICAgICAgIyB0aGVuIHdlJ2xsIGp1c3QgcmV0dXJuIE5vbmUgc2luY2Ugd2UgZG9uJ3Qga25vdyBpZiB0aGlzIHNob3VsZCBoYXZlCiAgICAgICAgIyBwcmUtcmVsZWFzZXMgb3Igbm90LgogICAgICAgIGlmIG5vdCBzZWxmLl9zcGVjczoKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgIyBPdGhlcndpc2Ugd2UnbGwgc2VlIGlmIGFueSBvZiB0aGUgZ2l2ZW4gc3BlY2lmaWVycyBhY2NlcHQKICAgICAgICAjIHByZXJlbGVhc2VzLCBpZiBhbnkgb2YgdGhlbSBkbyB3ZSdsbCByZXR1cm4gVHJ1ZSwgb3RoZXJ3aXNlIEZhbHNlLgogICAgICAgIHJldHVybiBhbnkocy5wcmVyZWxlYXNlcyBmb3IgcyBpbiBzZWxmLl9zcGVjcykKCiAgICBAcHJlcmVsZWFzZXMuc2V0dGVyCiAgICBkZWYgcHJlcmVsZWFzZXMoc2VsZiwgdmFsdWUpOgogICAgICAgIHNlbGYuX3ByZXJlbGVhc2VzID0gdmFsdWUKCiAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGl0ZW0pOgogICAgICAgIHJldHVybiBzZWxmLmNvbnRhaW5zKGl0ZW0pCgogICAgZGVmIGNvbnRhaW5zKHNlbGYsIGl0ZW0sIHByZXJlbGVhc2VzPU5vbmUpOgogICAgICAgICMgRW5zdXJlIHRoYXQgb3VyIGl0ZW0gaXMgYSBWZXJzaW9uIG9yIExlZ2FjeVZlcnNpb24gaW5zdGFuY2UuCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoaXRlbSwgKExlZ2FjeVZlcnNpb24sIFZlcnNpb24pKToKICAgICAgICAgICAgaXRlbSA9IHBhcnNlKGl0ZW0pCgogICAgICAgICMgRGV0ZXJtaW5lIGlmIHdlJ3JlIGZvcmNpbmcgYSBwcmVyZWxlYXNlIG9yIG5vdCwgaWYgd2UncmUgbm90IGZvcmNpbmcKICAgICAgICAjIG9uZSBmb3IgdGhpcyBwYXJ0aWN1bGFyIGZpbHRlciBjYWxsLCB0aGVuIHdlJ2xsIHVzZSB3aGF0ZXZlciB0aGUKICAgICAgICAjIFNwZWNpZmllclNldCB0aGlua3MgZm9yIHdoZXRoZXIgb3Igbm90IHdlIHNob3VsZCBzdXBwb3J0IHByZXJlbGVhc2VzLgogICAgICAgIGlmIHByZXJlbGVhc2VzIGlzIE5vbmU6CiAgICAgICAgICAgIHByZXJlbGVhc2VzID0gc2VsZi5wcmVyZWxlYXNlcwoKICAgICAgICAjIFdlIGNhbiBkZXRlcm1pbmUgaWYgd2UncmUgZ29pbmcgdG8gYWxsb3cgcHJlLXJlbGVhc2VzIGJ5IGxvb2tpbmcgdG8KICAgICAgICAjIHNlZSBpZiBhbnkgb2YgdGhlIHVuZGVybHlpbmcgaXRlbXMgc3VwcG9ydHMgdGhlbS4gSWYgbm9uZSBvZiB0aGVtIGRvCiAgICAgICAgIyBhbmQgdGhpcyBpdGVtIGlzIGEgcHJlLXJlbGVhc2UgdGhlbiB3ZSBkbyBub3QgYWxsb3cgaXQgYW5kIHdlIGNhbgogICAgICAgICMgc2hvcnQgY2lyY3VpdCB0aGF0IGhlcmUuCiAgICAgICAgIyBOb3RlOiBUaGlzIG1lYW5zIHRoYXQgMS4wLmRldjEgd291bGQgbm90IGJlIGNvbnRhaW5lZCBpbiBzb21ldGhpbmcKICAgICAgICAjICAgICAgIGxpa2UgPj0xLjAuZGV2YWJjIGhvd2V2ZXIgaXQgd291bGQgYmUgaW4gPj0xLjAuZGViYWJjLD4wLjAuZGV2MAogICAgICAgIGlmIG5vdCBwcmVyZWxlYXNlcyBhbmQgaXRlbS5pc19wcmVyZWxlYXNlOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgIyBXZSBzaW1wbHkgZGlzcGF0Y2ggdG8gdGhlIHVuZGVybHlpbmcgc3BlY3MgaGVyZSB0byBtYWtlIHN1cmUgdGhhdCB0aGUKICAgICAgICAjIGdpdmVuIHZlcnNpb24gaXMgY29udGFpbmVkIHdpdGhpbiBhbGwgb2YgdGhlbS4KICAgICAgICAjIE5vdGU6IFRoaXMgdXNlIG9mIGFsbCgpIGhlcmUgbWVhbnMgdGhhdCBhbiBlbXB0eSBzZXQgb2Ygc3BlY2lmaWVycwogICAgICAgICMgICAgICAgd2lsbCBhbHdheXMgcmV0dXJuIFRydWUsIHRoaXMgaXMgYW4gZXhwbGljaXQgZGVzaWduIGRlY2lzaW9uLgogICAgICAgIHJldHVybiBhbGwoCiAgICAgICAgICAgIHMuY29udGFpbnMoaXRlbSwgcHJlcmVsZWFzZXM9cHJlcmVsZWFzZXMpCiAgICAgICAgICAgIGZvciBzIGluIHNlbGYuX3NwZWNzCiAgICAgICAgKQoKICAgIGRlZiBmaWx0ZXIoc2VsZiwgaXRlcmFibGUsIHByZXJlbGVhc2VzPU5vbmUpOgogICAgICAgICMgRGV0ZXJtaW5lIGlmIHdlJ3JlIGZvcmNpbmcgYSBwcmVyZWxlYXNlIG9yIG5vdCwgaWYgd2UncmUgbm90IGZvcmNpbmcKICAgICAgICAjIG9uZSBmb3IgdGhpcyBwYXJ0aWN1bGFyIGZpbHRlciBjYWxsLCB0aGVuIHdlJ2xsIHVzZSB3aGF0ZXZlciB0aGUKICAgICAgICAjIFNwZWNpZmllclNldCB0aGlua3MgZm9yIHdoZXRoZXIgb3Igbm90IHdlIHNob3VsZCBzdXBwb3J0IHByZXJlbGVhc2VzLgogICAgICAgIGlmIHByZXJlbGVhc2VzIGlzIE5vbmU6CiAgICAgICAgICAgIHByZXJlbGVhc2VzID0gc2VsZi5wcmVyZWxlYXNlcwoKICAgICAgICAjIElmIHdlIGhhdmUgYW55IHNwZWNpZmllcnMsIHRoZW4gd2Ugd2FudCB0byB3cmFwIG91ciBpdGVyYWJsZSBpbiB0aGUKICAgICAgICAjIGZpbHRlciBtZXRob2QgZm9yIGVhY2ggb25lLCB0aGlzIHdpbGwgYWN0IGFzIGEgbG9naWNhbCBBTkQgYW1vbmdzdAogICAgICAgICMgZWFjaCBzcGVjaWZpZXIuCiAgICAgICAgaWYgc2VsZi5fc3BlY3M6CiAgICAgICAgICAgIGZvciBzcGVjIGluIHNlbGYuX3NwZWNzOgogICAgICAgICAgICAgICAgaXRlcmFibGUgPSBzcGVjLmZpbHRlcihpdGVyYWJsZSwgcHJlcmVsZWFzZXM9Ym9vbChwcmVyZWxlYXNlcykpCiAgICAgICAgICAgIHJldHVybiBpdGVyYWJsZQogICAgICAgICMgSWYgd2UgZG8gbm90IGhhdmUgYW55IHNwZWNpZmllcnMsIHRoZW4gd2UgbmVlZCB0byBoYXZlIGEgcm91Z2ggZmlsdGVyCiAgICAgICAgIyB3aGljaCB3aWxsIGZpbHRlciBvdXQgYW55IHByZS1yZWxlYXNlcywgdW5sZXNzIHRoZXJlIGFyZSBubyBmaW5hbAogICAgICAgICMgcmVsZWFzZXMsIGFuZCB3aGljaCB3aWxsIGZpbHRlciBvdXQgTGVnYWN5VmVyc2lvbiBpbiBnZW5lcmFsLgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGZpbHRlcmVkID0gW10KICAgICAgICAgICAgZm91bmRfcHJlcmVsZWFzZXMgPSBbXQoKICAgICAgICAgICAgZm9yIGl0ZW0gaW4gaXRlcmFibGU6CiAgICAgICAgICAgICAgICAjIEVuc3VyZSB0aGF0IHdlIHNvbWUga2luZCBvZiBWZXJzaW9uIGNsYXNzIGZvciB0aGlzIGl0ZW0uCiAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShpdGVtLCAoTGVnYWN5VmVyc2lvbiwgVmVyc2lvbikpOgogICAgICAgICAgICAgICAgICAgIHBhcnNlZF92ZXJzaW9uID0gcGFyc2UoaXRlbSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcGFyc2VkX3ZlcnNpb24gPSBpdGVtCgogICAgICAgICAgICAgICAgIyBGaWx0ZXIgb3V0IGFueSBpdGVtIHdoaWNoIGlzIHBhcnNlZCBhcyBhIExlZ2FjeVZlcnNpb24KICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UocGFyc2VkX3ZlcnNpb24sIExlZ2FjeVZlcnNpb24pOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICAgICAgIyBTdG9yZSBhbnkgaXRlbSB3aGljaCBpcyBhIHByZS1yZWxlYXNlIGZvciBsYXRlciB1bmxlc3Mgd2UndmUKICAgICAgICAgICAgICAgICMgYWxyZWFkeSBmb3VuZCBhIGZpbmFsIHZlcnNpb24gb3Igd2UgYXJlIGFjY2VwdGluZyBwcmVyZWxlYXNlcwogICAgICAgICAgICAgICAgaWYgcGFyc2VkX3ZlcnNpb24uaXNfcHJlcmVsZWFzZSBhbmQgbm90IHByZXJlbGVhc2VzOgogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBmaWx0ZXJlZDoKICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRfcHJlcmVsZWFzZXMuYXBwZW5kKGl0ZW0pCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkLmFwcGVuZChpdGVtKQoKICAgICAgICAgICAgIyBJZiB3ZSd2ZSBmb3VuZCBubyBpdGVtcyBleGNlcHQgZm9yIHByZS1yZWxlYXNlcywgdGhlbiB3ZSdsbCBnbwogICAgICAgICAgICAjIGFoZWFkIGFuZCB1c2UgdGhlIHByZS1yZWxlYXNlcwogICAgICAgICAgICBpZiBub3QgZmlsdGVyZWQgYW5kIGZvdW5kX3ByZXJlbGVhc2VzIGFuZCBwcmVyZWxlYXNlcyBpcyBOb25lOgogICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kX3ByZXJlbGVhc2VzCgogICAgICAgICAgICByZXR1cm4gZmlsdGVyZWQKUEsDBBQAAAAAAAAAIQDF6icPpQEAAKUBAABNAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvdXRpbHMucHkjIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24KIyAyLjAsIGFuZCB0aGUgQlNEIExpY2Vuc2UuIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcmVwb3NpdG9yeQojIGZvciBjb21wbGV0ZSBkZXRhaWxzLgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHByaW50X2Z1bmN0aW9uCgppbXBvcnQgcmUKCgpfY2Fub25pY2FsaXplX3JlZ2V4ID0gcmUuY29tcGlsZShyIlstXy5dKyIpCgoKZGVmIGNhbm9uaWNhbGl6ZV9uYW1lKG5hbWUpOgogICAgIyBUaGlzIGlzIHRha2VuIGZyb20gUEVQIDUwMy4KICAgIHJldHVybiBfY2Fub25pY2FsaXplX3JlZ2V4LnN1YigiLSIsIG5hbWUpLmxvd2VyKCkKUEsDBBQAAAAAAAAAIQAO78ahJC0AACQtAABPAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvdmVyc2lvbi5weSMgVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbgojIDIuMCwgYW5kIHRoZSBCU0QgTGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyByZXBvc2l0b3J5CiMgZm9yIGNvbXBsZXRlIGRldGFpbHMuCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgcHJpbnRfZnVuY3Rpb24KCmltcG9ydCBjb2xsZWN0aW9ucwppbXBvcnQgaXRlcnRvb2xzCmltcG9ydCByZQoKZnJvbSAuX3N0cnVjdHVyZXMgaW1wb3J0IEluZmluaXR5CgoKX19hbGxfXyA9IFsKICAgICJwYXJzZSIsICJWZXJzaW9uIiwgIkxlZ2FjeVZlcnNpb24iLCAiSW52YWxpZFZlcnNpb24iLCAiVkVSU0lPTl9QQVRURVJOIgpdCgoKX1ZlcnNpb24gPSBjb2xsZWN0aW9ucy5uYW1lZHR1cGxlKAogICAgIl9WZXJzaW9uIiwKICAgIFsiZXBvY2giLCAicmVsZWFzZSIsICJkZXYiLCAicHJlIiwgInBvc3QiLCAibG9jYWwiXSwKKQoKCmRlZiBwYXJzZSh2ZXJzaW9uKToKICAgICIiIgogICAgUGFyc2UgdGhlIGdpdmVuIHZlcnNpb24gc3RyaW5nIGFuZCByZXR1cm4gZWl0aGVyIGEgOmNsYXNzOmBWZXJzaW9uYCBvYmplY3QKICAgIG9yIGEgOmNsYXNzOmBMZWdhY3lWZXJzaW9uYCBvYmplY3QgZGVwZW5kaW5nIG9uIGlmIHRoZSBnaXZlbiB2ZXJzaW9uIGlzCiAgICBhIHZhbGlkIFBFUCA0NDAgdmVyc2lvbiBvciBhIGxlZ2FjeSB2ZXJzaW9uLgogICAgIiIiCiAgICB0cnk6CiAgICAgICAgcmV0dXJuIFZlcnNpb24odmVyc2lvbikKICAgIGV4Y2VwdCBJbnZhbGlkVmVyc2lvbjoKICAgICAgICByZXR1cm4gTGVnYWN5VmVyc2lvbih2ZXJzaW9uKQoKCmNsYXNzIEludmFsaWRWZXJzaW9uKFZhbHVlRXJyb3IpOgogICAgIiIiCiAgICBBbiBpbnZhbGlkIHZlcnNpb24gd2FzIGZvdW5kLCB1c2VycyBzaG91bGQgcmVmZXIgdG8gUEVQIDQ0MC4KICAgICIiIgoKCmNsYXNzIF9CYXNlVmVyc2lvbihvYmplY3QpOgoKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICByZXR1cm4gaGFzaChzZWxmLl9rZXkpCgogICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2NvbXBhcmUob3RoZXIsIGxhbWJkYSBzLCBvOiBzIDwgbykKCiAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5fY29tcGFyZShvdGhlciwgbGFtYmRhIHMsIG86IHMgPD0gbykKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5fY29tcGFyZShvdGhlciwgbGFtYmRhIHMsIG86IHMgPT0gbykKCiAgICBkZWYgX19nZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5fY29tcGFyZShvdGhlciwgbGFtYmRhIHMsIG86IHMgPj0gbykKCiAgICBkZWYgX19ndF9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5fY29tcGFyZShvdGhlciwgbGFtYmRhIHMsIG86IHMgPiBvKQoKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLl9jb21wYXJlKG90aGVyLCBsYW1iZGEgcywgbzogcyAhPSBvKQoKICAgIGRlZiBfY29tcGFyZShzZWxmLCBvdGhlciwgbWV0aG9kKToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgX0Jhc2VWZXJzaW9uKToKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCgogICAgICAgIHJldHVybiBtZXRob2Qoc2VsZi5fa2V5LCBvdGhlci5fa2V5KQoKCmNsYXNzIExlZ2FjeVZlcnNpb24oX0Jhc2VWZXJzaW9uKToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgdmVyc2lvbik6CiAgICAgICAgc2VsZi5fdmVyc2lvbiA9IHN0cih2ZXJzaW9uKQogICAgICAgIHNlbGYuX2tleSA9IF9sZWdhY3lfY21wa2V5KHNlbGYuX3ZlcnNpb24pCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3ZlcnNpb24KCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICI8TGVnYWN5VmVyc2lvbih7MH0pPiIuZm9ybWF0KHJlcHIoc3RyKHNlbGYpKSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBwdWJsaWMoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3ZlcnNpb24KCiAgICBAcHJvcGVydHkKICAgIGRlZiBiYXNlX3ZlcnNpb24oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3ZlcnNpb24KCiAgICBAcHJvcGVydHkKICAgIGRlZiBsb2NhbChzZWxmKToKICAgICAgICByZXR1cm4gTm9uZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX3ByZXJlbGVhc2Uoc2VsZik6CiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfcG9zdHJlbGVhc2Uoc2VsZik6CiAgICAgICAgcmV0dXJuIEZhbHNlCgoKX2xlZ2FjeV92ZXJzaW9uX2NvbXBvbmVudF9yZSA9IHJlLmNvbXBpbGUoCiAgICByIihcZCsgfCBbYS16XSsgfCBcLnwgLSkiLCByZS5WRVJCT1NFLAopCgpfbGVnYWN5X3ZlcnNpb25fcmVwbGFjZW1lbnRfbWFwID0gewogICAgInByZSI6ICJjIiwgInByZXZpZXciOiAiYyIsICItIjogImZpbmFsLSIsICJyYyI6ICJjIiwgImRldiI6ICJAIiwKfQoKCmRlZiBfcGFyc2VfdmVyc2lvbl9wYXJ0cyhzKToKICAgIGZvciBwYXJ0IGluIF9sZWdhY3lfdmVyc2lvbl9jb21wb25lbnRfcmUuc3BsaXQocyk6CiAgICAgICAgcGFydCA9IF9sZWdhY3lfdmVyc2lvbl9yZXBsYWNlbWVudF9tYXAuZ2V0KHBhcnQsIHBhcnQpCgogICAgICAgIGlmIG5vdCBwYXJ0IG9yIHBhcnQgPT0gIi4iOgogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICBpZiBwYXJ0WzoxXSBpbiAiMDEyMzQ1Njc4OSI6CiAgICAgICAgICAgICMgcGFkIGZvciBudW1lcmljIGNvbXBhcmlzb24KICAgICAgICAgICAgeWllbGQgcGFydC56ZmlsbCg4KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHlpZWxkICIqIiArIHBhcnQKCiAgICAjIGVuc3VyZSB0aGF0IGFscGhhL2JldGEvY2FuZGlkYXRlIGFyZSBiZWZvcmUgZmluYWwKICAgIHlpZWxkICIqZmluYWwiCgoKZGVmIF9sZWdhY3lfY21wa2V5KHZlcnNpb24pOgogICAgIyBXZSBoYXJkY29kZSBhbiBlcG9jaCBvZiAtMSBoZXJlLiBBIFBFUCA0NDAgdmVyc2lvbiBjYW4gb25seSBoYXZlIGEgZXBvY2gKICAgICMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAuIFRoaXMgd2lsbCBlZmZlY3RpdmVseSBwdXQgdGhlIExlZ2FjeVZlcnNpb24sCiAgICAjIHdoaWNoIHVzZXMgdGhlIGRlZmFjdG8gc3RhbmRhcmQgb3JpZ2luYWxseSBpbXBsZW1lbnRlZCBieSBzZXR1cHRvb2xzLAogICAgIyBhcyBiZWZvcmUgYWxsIFBFUCA0NDAgdmVyc2lvbnMuCiAgICBlcG9jaCA9IC0xCgogICAgIyBUaGlzIHNjaGVtZSBpcyB0YWtlbiBmcm9tIHBrZ19yZXNvdXJjZXMucGFyc2VfdmVyc2lvbiBzZXR1cHRvb2xzIHByaW9yIHRvCiAgICAjIGl0J3MgYWRvcHRpb24gb2YgdGhlIHBhY2thZ2luZyBsaWJyYXJ5LgogICAgcGFydHMgPSBbXQogICAgZm9yIHBhcnQgaW4gX3BhcnNlX3ZlcnNpb25fcGFydHModmVyc2lvbi5sb3dlcigpKToKICAgICAgICBpZiBwYXJ0LnN0YXJ0c3dpdGgoIioiKToKICAgICAgICAgICAgIyByZW1vdmUgIi0iIGJlZm9yZSBhIHByZXJlbGVhc2UgdGFnCiAgICAgICAgICAgIGlmIHBhcnQgPCAiKmZpbmFsIjoKICAgICAgICAgICAgICAgIHdoaWxlIHBhcnRzIGFuZCBwYXJ0c1stMV0gPT0gIipmaW5hbC0iOgogICAgICAgICAgICAgICAgICAgIHBhcnRzLnBvcCgpCgogICAgICAgICAgICAjIHJlbW92ZSB0cmFpbGluZyB6ZXJvcyBmcm9tIGVhY2ggc2VyaWVzIG9mIG51bWVyaWMgcGFydHMKICAgICAgICAgICAgd2hpbGUgcGFydHMgYW5kIHBhcnRzWy0xXSA9PSAiMDAwMDAwMDAiOgogICAgICAgICAgICAgICAgcGFydHMucG9wKCkKCiAgICAgICAgcGFydHMuYXBwZW5kKHBhcnQpCiAgICBwYXJ0cyA9IHR1cGxlKHBhcnRzKQoKICAgIHJldHVybiBlcG9jaCwgcGFydHMKCiMgRGVsaWJlcmF0ZWx5IG5vdCBhbmNob3JlZCB0byB0aGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgc3RyaW5nLCB0byBtYWtlIGl0CiMgZWFzaWVyIGZvciAzcmQgcGFydHkgY29kZSB0byByZXVzZQpWRVJTSU9OX1BBVFRFUk4gPSByIiIiCiAgICB2PwogICAgKD86CiAgICAgICAgKD86KD9QPGVwb2NoPlswLTldKykhKT8gICAgICAgICAgICAgICAgICAgICAgICAgICAjIGVwb2NoCiAgICAgICAgKD9QPHJlbGVhc2U+WzAtOV0rKD86XC5bMC05XSspKikgICAgICAgICAgICAgICAgICAjIHJlbGVhc2Ugc2VnbWVudAogICAgICAgICg/UDxwcmU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwcmUtcmVsZWFzZQogICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICg/UDxwcmVfbD4oYXxifGN8cmN8YWxwaGF8YmV0YXxwcmV8cHJldmlldykpCiAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgKD9QPHByZV9uPlswLTldKyk/CiAgICAgICAgKT8KICAgICAgICAoP1A8cG9zdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcG9zdCByZWxlYXNlCiAgICAgICAgICAgICg/Oi0oP1A8cG9zdF9uMT5bMC05XSspKQogICAgICAgICAgICB8CiAgICAgICAgICAgICg/OgogICAgICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAgICAgKD9QPHBvc3RfbD5wb3N0fHJldnxyKQogICAgICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAgICAgKD9QPHBvc3RfbjI+WzAtOV0rKT8KICAgICAgICAgICAgKQogICAgICAgICk/CiAgICAgICAgKD9QPGRldj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGRldiByZWxlYXNlCiAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgKD9QPGRldl9sPmRldikKICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAoP1A8ZGV2X24+WzAtOV0rKT8KICAgICAgICApPwogICAgKQogICAgKD86XCsoP1A8bG9jYWw+W2EtejAtOV0rKD86Wy1fXC5dW2EtejAtOV0rKSopKT8gICAgICAgIyBsb2NhbCB2ZXJzaW9uCiIiIgoKCmNsYXNzIFZlcnNpb24oX0Jhc2VWZXJzaW9uKToKCiAgICBfcmVnZXggPSByZS5jb21waWxlKAogICAgICAgIHIiXlxzKiIgKyBWRVJTSU9OX1BBVFRFUk4gKyByIlxzKiQiLAogICAgICAgIHJlLlZFUkJPU0UgfCByZS5JR05PUkVDQVNFLAogICAgKQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2ZXJzaW9uKToKICAgICAgICAjIFZhbGlkYXRlIHRoZSB2ZXJzaW9uIGFuZCBwYXJzZSBpdCBpbnRvIHBpZWNlcwogICAgICAgIG1hdGNoID0gc2VsZi5fcmVnZXguc2VhcmNoKHZlcnNpb24pCiAgICAgICAgaWYgbm90IG1hdGNoOgogICAgICAgICAgICByYWlzZSBJbnZhbGlkVmVyc2lvbigiSW52YWxpZCB2ZXJzaW9uOiAnezB9JyIuZm9ybWF0KHZlcnNpb24pKQoKICAgICAgICAjIFN0b3JlIHRoZSBwYXJzZWQgb3V0IHBpZWNlcyBvZiB0aGUgdmVyc2lvbgogICAgICAgIHNlbGYuX3ZlcnNpb24gPSBfVmVyc2lvbigKICAgICAgICAgICAgZXBvY2g9aW50KG1hdGNoLmdyb3VwKCJlcG9jaCIpKSBpZiBtYXRjaC5ncm91cCgiZXBvY2giKSBlbHNlIDAsCiAgICAgICAgICAgIHJlbGVhc2U9dHVwbGUoaW50KGkpIGZvciBpIGluIG1hdGNoLmdyb3VwKCJyZWxlYXNlIikuc3BsaXQoIi4iKSksCiAgICAgICAgICAgIHByZT1fcGFyc2VfbGV0dGVyX3ZlcnNpb24oCiAgICAgICAgICAgICAgICBtYXRjaC5ncm91cCgicHJlX2wiKSwKICAgICAgICAgICAgICAgIG1hdGNoLmdyb3VwKCJwcmVfbiIpLAogICAgICAgICAgICApLAogICAgICAgICAgICBwb3N0PV9wYXJzZV9sZXR0ZXJfdmVyc2lvbigKICAgICAgICAgICAgICAgIG1hdGNoLmdyb3VwKCJwb3N0X2wiKSwKICAgICAgICAgICAgICAgIG1hdGNoLmdyb3VwKCJwb3N0X24xIikgb3IgbWF0Y2guZ3JvdXAoInBvc3RfbjIiKSwKICAgICAgICAgICAgKSwKICAgICAgICAgICAgZGV2PV9wYXJzZV9sZXR0ZXJfdmVyc2lvbigKICAgICAgICAgICAgICAgIG1hdGNoLmdyb3VwKCJkZXZfbCIpLAogICAgICAgICAgICAgICAgbWF0Y2guZ3JvdXAoImRldl9uIiksCiAgICAgICAgICAgICksCiAgICAgICAgICAgIGxvY2FsPV9wYXJzZV9sb2NhbF92ZXJzaW9uKG1hdGNoLmdyb3VwKCJsb2NhbCIpKSwKICAgICAgICApCgogICAgICAgICMgR2VuZXJhdGUgYSBrZXkgd2hpY2ggd2lsbCBiZSB1c2VkIGZvciBzb3J0aW5nCiAgICAgICAgc2VsZi5fa2V5ID0gX2NtcGtleSgKICAgICAgICAgICAgc2VsZi5fdmVyc2lvbi5lcG9jaCwKICAgICAgICAgICAgc2VsZi5fdmVyc2lvbi5yZWxlYXNlLAogICAgICAgICAgICBzZWxmLl92ZXJzaW9uLnByZSwKICAgICAgICAgICAgc2VsZi5fdmVyc2lvbi5wb3N0LAogICAgICAgICAgICBzZWxmLl92ZXJzaW9uLmRldiwKICAgICAgICAgICAgc2VsZi5fdmVyc2lvbi5sb2NhbCwKICAgICAgICApCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiPFZlcnNpb24oezB9KT4iLmZvcm1hdChyZXByKHN0cihzZWxmKSkpCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcGFydHMgPSBbXQoKICAgICAgICAjIEVwb2NoCiAgICAgICAgaWYgc2VsZi5fdmVyc2lvbi5lcG9jaCAhPSAwOgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoInswfSEiLmZvcm1hdChzZWxmLl92ZXJzaW9uLmVwb2NoKSkKCiAgICAgICAgIyBSZWxlYXNlIHNlZ21lbnQKICAgICAgICBwYXJ0cy5hcHBlbmQoIi4iLmpvaW4oc3RyKHgpIGZvciB4IGluIHNlbGYuX3ZlcnNpb24ucmVsZWFzZSkpCgogICAgICAgICMgUHJlLXJlbGVhc2UKICAgICAgICBpZiBzZWxmLl92ZXJzaW9uLnByZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgcGFydHMuYXBwZW5kKCIiLmpvaW4oc3RyKHgpIGZvciB4IGluIHNlbGYuX3ZlcnNpb24ucHJlKSkKCiAgICAgICAgIyBQb3N0LXJlbGVhc2UKICAgICAgICBpZiBzZWxmLl92ZXJzaW9uLnBvc3QgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgiLnBvc3R7MH0iLmZvcm1hdChzZWxmLl92ZXJzaW9uLnBvc3RbMV0pKQoKICAgICAgICAjIERldmVsb3BtZW50IHJlbGVhc2UKICAgICAgICBpZiBzZWxmLl92ZXJzaW9uLmRldiBpcyBub3QgTm9uZToKICAgICAgICAgICAgcGFydHMuYXBwZW5kKCIuZGV2ezB9Ii5mb3JtYXQoc2VsZi5fdmVyc2lvbi5kZXZbMV0pKQoKICAgICAgICAjIExvY2FsIHZlcnNpb24gc2VnbWVudAogICAgICAgIGlmIHNlbGYuX3ZlcnNpb24ubG9jYWwgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgKICAgICAgICAgICAgICAgICIrezB9Ii5mb3JtYXQoIi4iLmpvaW4oc3RyKHgpIGZvciB4IGluIHNlbGYuX3ZlcnNpb24ubG9jYWwpKQogICAgICAgICAgICApCgogICAgICAgIHJldHVybiAiIi5qb2luKHBhcnRzKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHB1YmxpYyhzZWxmKToKICAgICAgICByZXR1cm4gc3RyKHNlbGYpLnNwbGl0KCIrIiwgMSlbMF0KCiAgICBAcHJvcGVydHkKICAgIGRlZiBiYXNlX3ZlcnNpb24oc2VsZik6CiAgICAgICAgcGFydHMgPSBbXQoKICAgICAgICAjIEVwb2NoCiAgICAgICAgaWYgc2VsZi5fdmVyc2lvbi5lcG9jaCAhPSAwOgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoInswfSEiLmZvcm1hdChzZWxmLl92ZXJzaW9uLmVwb2NoKSkKCiAgICAgICAgIyBSZWxlYXNlIHNlZ21lbnQKICAgICAgICBwYXJ0cy5hcHBlbmQoIi4iLmpvaW4oc3RyKHgpIGZvciB4IGluIHNlbGYuX3ZlcnNpb24ucmVsZWFzZSkpCgogICAgICAgIHJldHVybiAiIi5qb2luKHBhcnRzKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGxvY2FsKHNlbGYpOgogICAgICAgIHZlcnNpb25fc3RyaW5nID0gc3RyKHNlbGYpCiAgICAgICAgaWYgIisiIGluIHZlcnNpb25fc3RyaW5nOgogICAgICAgICAgICByZXR1cm4gdmVyc2lvbl9zdHJpbmcuc3BsaXQoIisiLCAxKVsxXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX3ByZXJlbGVhc2Uoc2VsZik6CiAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fdmVyc2lvbi5kZXYgb3Igc2VsZi5fdmVyc2lvbi5wcmUpCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfcG9zdHJlbGVhc2Uoc2VsZik6CiAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fdmVyc2lvbi5wb3N0KQoKCmRlZiBfcGFyc2VfbGV0dGVyX3ZlcnNpb24obGV0dGVyLCBudW1iZXIpOgogICAgaWYgbGV0dGVyOgogICAgICAgICMgV2UgY29uc2lkZXIgdGhlcmUgdG8gYmUgYW4gaW1wbGljaXQgMCBpbiBhIHByZS1yZWxlYXNlIGlmIHRoZXJlIGlzCiAgICAgICAgIyBub3QgYSBudW1lcmFsIGFzc29jaWF0ZWQgd2l0aCBpdC4KICAgICAgICBpZiBudW1iZXIgaXMgTm9uZToKICAgICAgICAgICAgbnVtYmVyID0gMAoKICAgICAgICAjIFdlIG5vcm1hbGl6ZSBhbnkgbGV0dGVycyB0byB0aGVpciBsb3dlciBjYXNlIGZvcm0KICAgICAgICBsZXR0ZXIgPSBsZXR0ZXIubG93ZXIoKQoKICAgICAgICAjIFdlIGNvbnNpZGVyIHNvbWUgd29yZHMgdG8gYmUgYWx0ZXJuYXRlIHNwZWxsaW5ncyBvZiBvdGhlciB3b3JkcyBhbmQKICAgICAgICAjIGluIHRob3NlIGNhc2VzIHdlIHdhbnQgdG8gbm9ybWFsaXplIHRoZSBzcGVsbGluZ3MgdG8gb3VyIHByZWZlcnJlZAogICAgICAgICMgc3BlbGxpbmcuCiAgICAgICAgaWYgbGV0dGVyID09ICJhbHBoYSI6CiAgICAgICAgICAgIGxldHRlciA9ICJhIgogICAgICAgIGVsaWYgbGV0dGVyID09ICJiZXRhIjoKICAgICAgICAgICAgbGV0dGVyID0gImIiCiAgICAgICAgZWxpZiBsZXR0ZXIgaW4gWyJjIiwgInByZSIsICJwcmV2aWV3Il06CiAgICAgICAgICAgIGxldHRlciA9ICJyYyIKICAgICAgICBlbGlmIGxldHRlciBpbiBbInJldiIsICJyIl06CiAgICAgICAgICAgIGxldHRlciA9ICJwb3N0IgoKICAgICAgICByZXR1cm4gbGV0dGVyLCBpbnQobnVtYmVyKQogICAgaWYgbm90IGxldHRlciBhbmQgbnVtYmVyOgogICAgICAgICMgV2UgYXNzdW1lIGlmIHdlIGFyZSBnaXZlbiBhIG51bWJlciwgYnV0IHdlIGFyZSBub3QgZ2l2ZW4gYSBsZXR0ZXIKICAgICAgICAjIHRoZW4gdGhpcyBpcyB1c2luZyB0aGUgaW1wbGljaXQgcG9zdCByZWxlYXNlIHN5bnRheCAoZS5nLiAxLjAtMSkKICAgICAgICBsZXR0ZXIgPSAicG9zdCIKCiAgICAgICAgcmV0dXJuIGxldHRlciwgaW50KG51bWJlcikKCgpfbG9jYWxfdmVyc2lvbl9zZXBlcmF0b3JzID0gcmUuY29tcGlsZShyIltcLl8tXSIpCgoKZGVmIF9wYXJzZV9sb2NhbF92ZXJzaW9uKGxvY2FsKToKICAgICIiIgogICAgVGFrZXMgYSBzdHJpbmcgbGlrZSBhYmMuMS50d2VsdmUgYW5kIHR1cm5zIGl0IGludG8gKCJhYmMiLCAxLCAidHdlbHZlIikuCiAgICAiIiIKICAgIGlmIGxvY2FsIGlzIG5vdCBOb25lOgogICAgICAgIHJldHVybiB0dXBsZSgKICAgICAgICAgICAgcGFydC5sb3dlcigpIGlmIG5vdCBwYXJ0LmlzZGlnaXQoKSBlbHNlIGludChwYXJ0KQogICAgICAgICAgICBmb3IgcGFydCBpbiBfbG9jYWxfdmVyc2lvbl9zZXBlcmF0b3JzLnNwbGl0KGxvY2FsKQogICAgICAgICkKCgpkZWYgX2NtcGtleShlcG9jaCwgcmVsZWFzZSwgcHJlLCBwb3N0LCBkZXYsIGxvY2FsKToKICAgICMgV2hlbiB3ZSBjb21wYXJlIGEgcmVsZWFzZSB2ZXJzaW9uLCB3ZSB3YW50IHRvIGNvbXBhcmUgaXQgd2l0aCBhbGwgb2YgdGhlCiAgICAjIHRyYWlsaW5nIHplcm9zIHJlbW92ZWQuIFNvIHdlJ2xsIHVzZSBhIHJldmVyc2UgdGhlIGxpc3QsIGRyb3AgYWxsIHRoZSBub3cKICAgICMgbGVhZGluZyB6ZXJvcyB1bnRpbCB3ZSBjb21lIHRvIHNvbWV0aGluZyBub24gemVybywgdGhlbiB0YWtlIHRoZSByZXN0CiAgICAjIHJlLXJldmVyc2UgaXQgYmFjayBpbnRvIHRoZSBjb3JyZWN0IG9yZGVyIGFuZCBtYWtlIGl0IGEgdHVwbGUgYW5kIHVzZQogICAgIyB0aGF0IGZvciBvdXIgc29ydGluZyBrZXkuCiAgICByZWxlYXNlID0gdHVwbGUoCiAgICAgICAgcmV2ZXJzZWQobGlzdCgKICAgICAgICAgICAgaXRlcnRvb2xzLmRyb3B3aGlsZSgKICAgICAgICAgICAgICAgIGxhbWJkYSB4OiB4ID09IDAsCiAgICAgICAgICAgICAgICByZXZlcnNlZChyZWxlYXNlKSwKICAgICAgICAgICAgKQogICAgICAgICkpCiAgICApCgogICAgIyBXZSBuZWVkIHRvICJ0cmljayIgdGhlIHNvcnRpbmcgYWxnb3JpdGhtIHRvIHB1dCAxLjAuZGV2MCBiZWZvcmUgMS4wYTAuCiAgICAjIFdlJ2xsIGRvIHRoaXMgYnkgYWJ1c2luZyB0aGUgcHJlIHNlZ21lbnQsIGJ1dCB3ZSBfb25seV8gd2FudCB0byBkbyB0aGlzCiAgICAjIGlmIHRoZXJlIGlzIG5vdCBhIHByZSBvciBhIHBvc3Qgc2VnbWVudC4gSWYgd2UgaGF2ZSBvbmUgb2YgdGhvc2UgdGhlbgogICAgIyB0aGUgbm9ybWFsIHNvcnRpbmcgcnVsZXMgd2lsbCBoYW5kbGUgdGhpcyBjYXNlIGNvcnJlY3RseS4KICAgIGlmIHByZSBpcyBOb25lIGFuZCBwb3N0IGlzIE5vbmUgYW5kIGRldiBpcyBub3QgTm9uZToKICAgICAgICBwcmUgPSAtSW5maW5pdHkKICAgICMgVmVyc2lvbnMgd2l0aG91dCBhIHByZS1yZWxlYXNlIChleGNlcHQgYXMgbm90ZWQgYWJvdmUpIHNob3VsZCBzb3J0IGFmdGVyCiAgICAjIHRob3NlIHdpdGggb25lLgogICAgZWxpZiBwcmUgaXMgTm9uZToKICAgICAgICBwcmUgPSBJbmZpbml0eQoKICAgICMgVmVyc2lvbnMgd2l0aG91dCBhIHBvc3Qgc2VnbWVudCBzaG91bGQgc29ydCBiZWZvcmUgdGhvc2Ugd2l0aCBvbmUuCiAgICBpZiBwb3N0IGlzIE5vbmU6CiAgICAgICAgcG9zdCA9IC1JbmZpbml0eQoKICAgICMgVmVyc2lvbnMgd2l0aG91dCBhIGRldmVsb3BtZW50IHNlZ21lbnQgc2hvdWxkIHNvcnQgYWZ0ZXIgdGhvc2Ugd2l0aCBvbmUuCiAgICBpZiBkZXYgaXMgTm9uZToKICAgICAgICBkZXYgPSBJbmZpbml0eQoKICAgIGlmIGxvY2FsIGlzIE5vbmU6CiAgICAgICAgIyBWZXJzaW9ucyB3aXRob3V0IGEgbG9jYWwgc2VnbWVudCBzaG91bGQgc29ydCBiZWZvcmUgdGhvc2Ugd2l0aCBvbmUuCiAgICAgICAgbG9jYWwgPSAtSW5maW5pdHkKICAgIGVsc2U6CiAgICAgICAgIyBWZXJzaW9ucyB3aXRoIGEgbG9jYWwgc2VnbWVudCBuZWVkIHRoYXQgc2VnbWVudCBwYXJzZWQgdG8gaW1wbGVtZW50CiAgICAgICAgIyB0aGUgc29ydGluZyBydWxlcyBpbiBQRVA0NDAuCiAgICAgICAgIyAtIEFscGhhIG51bWVyaWMgc2VnbWVudHMgc29ydCBiZWZvcmUgbnVtZXJpYyBzZWdtZW50cwogICAgICAgICMgLSBBbHBoYSBudW1lcmljIHNlZ21lbnRzIHNvcnQgbGV4aWNvZ3JhcGhpY2FsbHkKICAgICAgICAjIC0gTnVtZXJpYyBzZWdtZW50cyBzb3J0IG51bWVyaWNhbGx5CiAgICAgICAgIyAtIFNob3J0ZXIgdmVyc2lvbnMgc29ydCBiZWZvcmUgbG9uZ2VyIHZlcnNpb25zIHdoZW4gdGhlIHByZWZpeGVzCiAgICAgICAgIyAgIG1hdGNoIGV4YWN0bHkKICAgICAgICBsb2NhbCA9IHR1cGxlKAogICAgICAgICAgICAoaSwgIiIpIGlmIGlzaW5zdGFuY2UoaSwgaW50KSBlbHNlICgtSW5maW5pdHksIGkpCiAgICAgICAgICAgIGZvciBpIGluIGxvY2FsCiAgICAgICAgKQoKICAgIHJldHVybiBlcG9jaCwgcmVsZWFzZSwgcHJlLCBwb3N0LCBkZXYsIGxvY2FsClBLAwQUAAAAAAAAACEAZg+EsXeKAwB3igMARwAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvcHlwYXJzaW5nLnB5IyBtb2R1bGUgcHlwYXJzaW5nLnB5DQojDQojIENvcHlyaWdodCAoYykgMjAwMy0yMDE4ICBQYXVsIFQuIE1jR3VpcmUNCiMNCiMgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nDQojIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQ0KIyAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nDQojIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwNCiMgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvDQojIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bw0KIyB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQojDQojIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlDQojIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLg0KIw0KIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwNCiMgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GDQojIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4NCiMgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkNCiMgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwNCiMgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUNCiMgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuDQojDQoNCl9fZG9jX18gPSBcDQoiIiINCnB5cGFyc2luZyBtb2R1bGUgLSBDbGFzc2VzIGFuZCBtZXRob2RzIHRvIGRlZmluZSBhbmQgZXhlY3V0ZSBwYXJzaW5nIGdyYW1tYXJzDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQpUaGUgcHlwYXJzaW5nIG1vZHVsZSBpcyBhbiBhbHRlcm5hdGl2ZSBhcHByb2FjaCB0byBjcmVhdGluZyBhbmQgZXhlY3V0aW5nIHNpbXBsZSBncmFtbWFycywNCnZzLiB0aGUgdHJhZGl0aW9uYWwgbGV4L3lhY2MgYXBwcm9hY2gsIG9yIHRoZSB1c2Ugb2YgcmVndWxhciBleHByZXNzaW9ucy4gIFdpdGggcHlwYXJzaW5nLCB5b3UNCmRvbid0IG5lZWQgdG8gbGVhcm4gYSBuZXcgc3ludGF4IGZvciBkZWZpbmluZyBncmFtbWFycyBvciBtYXRjaGluZyBleHByZXNzaW9ucyAtIHRoZSBwYXJzaW5nIG1vZHVsZQ0KcHJvdmlkZXMgYSBsaWJyYXJ5IG9mIGNsYXNzZXMgdGhhdCB5b3UgdXNlIHRvIGNvbnN0cnVjdCB0aGUgZ3JhbW1hciBkaXJlY3RseSBpbiBQeXRob24uDQoNCkhlcmUgaXMgYSBwcm9ncmFtIHRvIHBhcnNlICJIZWxsbywgV29ybGQhIiAob3IgYW55IGdyZWV0aW5nIG9mIHRoZSBmb3JtIA0KQ3siPHNhbHV0YXRpb24+LCA8YWRkcmVzc2VlPiEifSksIGJ1aWx0IHVwIHVzaW5nIEx7V29yZH0sIEx7TGl0ZXJhbH0sIGFuZCBMe0FuZH0gZWxlbWVudHMgDQooTHsnKyc8UGFyc2VyRWxlbWVudC5fX2FkZF9fPn0gb3BlcmF0b3IgZ2l2ZXMgTHtBbmR9IGV4cHJlc3Npb25zLCBzdHJpbmdzIGFyZSBhdXRvLWNvbnZlcnRlZCB0bw0KTHtMaXRlcmFsfSBleHByZXNzaW9ucyk6Og0KDQogICAgZnJvbSBweXBhcnNpbmcgaW1wb3J0IFdvcmQsIGFscGhhcw0KDQogICAgIyBkZWZpbmUgZ3JhbW1hciBvZiBhIGdyZWV0aW5nDQogICAgZ3JlZXQgPSBXb3JkKGFscGhhcykgKyAiLCIgKyBXb3JkKGFscGhhcykgKyAiISINCg0KICAgIGhlbGxvID0gIkhlbGxvLCBXb3JsZCEiDQogICAgcHJpbnQgKGhlbGxvLCAiLT4iLCBncmVldC5wYXJzZVN0cmluZyhoZWxsbykpDQoNClRoZSBwcm9ncmFtIG91dHB1dHMgdGhlIGZvbGxvd2luZzo6DQoNCiAgICBIZWxsbywgV29ybGQhIC0+IFsnSGVsbG8nLCAnLCcsICdXb3JsZCcsICchJ10NCg0KVGhlIFB5dGhvbiByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ3JhbW1hciBpcyBxdWl0ZSByZWFkYWJsZSwgb3dpbmcgdG8gdGhlIHNlbGYtZXhwbGFuYXRvcnkNCmNsYXNzIG5hbWVzLCBhbmQgdGhlIHVzZSBvZiAnKycsICd8JyBhbmQgJ14nIG9wZXJhdG9ycy4NCg0KVGhlIEx7UGFyc2VSZXN1bHRzfSBvYmplY3QgcmV0dXJuZWQgZnJvbSBMe1BhcnNlckVsZW1lbnQucGFyc2VTdHJpbmc8UGFyc2VyRWxlbWVudC5wYXJzZVN0cmluZz59IGNhbiBiZSBhY2Nlc3NlZCBhcyBhIG5lc3RlZCBsaXN0LCBhIGRpY3Rpb25hcnksIG9yIGFuDQpvYmplY3Qgd2l0aCBuYW1lZCBhdHRyaWJ1dGVzLg0KDQpUaGUgcHlwYXJzaW5nIG1vZHVsZSBoYW5kbGVzIHNvbWUgb2YgdGhlIHByb2JsZW1zIHRoYXQgYXJlIHR5cGljYWxseSB2ZXhpbmcgd2hlbiB3cml0aW5nIHRleHQgcGFyc2VyczoNCiAtIGV4dHJhIG9yIG1pc3Npbmcgd2hpdGVzcGFjZSAodGhlIGFib3ZlIHByb2dyYW0gd2lsbCBhbHNvIGhhbmRsZSAiSGVsbG8sV29ybGQhIiwgIkhlbGxvICAsICBXb3JsZCAgISIsIGV0Yy4pDQogLSBxdW90ZWQgc3RyaW5ncw0KIC0gZW1iZWRkZWQgY29tbWVudHMNCg0KDQpHZXR0aW5nIFN0YXJ0ZWQgLQ0KLS0tLS0tLS0tLS0tLS0tLS0NClZpc2l0IHRoZSBjbGFzc2VzIEx7UGFyc2VyRWxlbWVudH0gYW5kIEx7UGFyc2VSZXN1bHRzfSB0byBzZWUgdGhlIGJhc2UgY2xhc3NlcyB0aGF0IG1vc3Qgb3RoZXIgcHlwYXJzaW5nDQpjbGFzc2VzIGluaGVyaXQgZnJvbS4gVXNlIHRoZSBkb2NzdHJpbmdzIGZvciBleGFtcGxlcyBvZiBob3cgdG86DQogLSBjb25zdHJ1Y3QgbGl0ZXJhbCBtYXRjaCBleHByZXNzaW9ucyBmcm9tIEx7TGl0ZXJhbH0gYW5kIEx7Q2FzZWxlc3NMaXRlcmFsfSBjbGFzc2VzDQogLSBjb25zdHJ1Y3QgY2hhcmFjdGVyIHdvcmQtZ3JvdXAgZXhwcmVzc2lvbnMgdXNpbmcgdGhlIEx7V29yZH0gY2xhc3MNCiAtIHNlZSBob3cgdG8gY3JlYXRlIHJlcGV0aXRpdmUgZXhwcmVzc2lvbnMgdXNpbmcgTHtaZXJvT3JNb3JlfSBhbmQgTHtPbmVPck1vcmV9IGNsYXNzZXMNCiAtIHVzZSBMeycrJzxBbmQ+fSwgTHsnfCc8TWF0Y2hGaXJzdD59LCBMeydeJzxPcj59LCBhbmQgTHsnJic8RWFjaD59IG9wZXJhdG9ycyB0byBjb21iaW5lIHNpbXBsZSBleHByZXNzaW9ucyBpbnRvIG1vcmUgY29tcGxleCBvbmVzDQogLSBhc3NvY2lhdGUgbmFtZXMgd2l0aCB5b3VyIHBhcnNlZCByZXN1bHRzIHVzaW5nIEx7UGFyc2VyRWxlbWVudC5zZXRSZXN1bHRzTmFtZX0NCiAtIGZpbmQgc29tZSBoZWxwZnVsIGV4cHJlc3Npb24gc2hvcnQtY3V0cyBsaWtlIEx7ZGVsaW1pdGVkTGlzdH0gYW5kIEx7b25lT2Z9DQogLSBmaW5kIG1vcmUgdXNlZnVsIGNvbW1vbiBleHByZXNzaW9ucyBpbiB0aGUgTHtweXBhcnNpbmdfY29tbW9ufSBuYW1lc3BhY2UgY2xhc3MNCiIiIg0KDQpfX3ZlcnNpb25fXyA9ICIyLjIuMSINCl9fdmVyc2lvblRpbWVfXyA9ICIxOCBTZXAgMjAxOCAwMDo0OSBVVEMiDQpfX2F1dGhvcl9fID0gIlBhdWwgTWNHdWlyZSA8cHRtY2dAdXNlcnMuc291cmNlZm9yZ2UubmV0PiINCg0KaW1wb3J0IHN0cmluZw0KZnJvbSB3ZWFrcmVmIGltcG9ydCByZWYgYXMgd2tyZWYNCmltcG9ydCBjb3B5DQppbXBvcnQgc3lzDQppbXBvcnQgd2FybmluZ3MNCmltcG9ydCByZQ0KaW1wb3J0IHNyZV9jb25zdGFudHMNCmltcG9ydCBjb2xsZWN0aW9ucw0KaW1wb3J0IHBwcmludA0KaW1wb3J0IHRyYWNlYmFjaw0KaW1wb3J0IHR5cGVzDQpmcm9tIGRhdGV0aW1lIGltcG9ydCBkYXRldGltZQ0KDQp0cnk6DQogICAgZnJvbSBfdGhyZWFkIGltcG9ydCBSTG9jaw0KZXhjZXB0IEltcG9ydEVycm9yOg0KICAgIGZyb20gdGhyZWFkaW5nIGltcG9ydCBSTG9jaw0KDQp0cnk6DQogICAgIyBQeXRob24gMw0KICAgIGZyb20gY29sbGVjdGlvbnMuYWJjIGltcG9ydCBJdGVyYWJsZQ0KICAgIGZyb20gY29sbGVjdGlvbnMuYWJjIGltcG9ydCBNdXRhYmxlTWFwcGluZw0KZXhjZXB0IEltcG9ydEVycm9yOg0KICAgICMgUHl0aG9uIDIuNw0KICAgIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IEl0ZXJhYmxlDQogICAgZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgTXV0YWJsZU1hcHBpbmcNCg0KdHJ5Og0KICAgIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IE9yZGVyZWREaWN0IGFzIF9PcmRlcmVkRGljdA0KZXhjZXB0IEltcG9ydEVycm9yOg0KICAgIHRyeToNCiAgICAgICAgZnJvbSBvcmRlcmVkZGljdCBpbXBvcnQgT3JkZXJlZERpY3QgYXMgX09yZGVyZWREaWN0DQogICAgZXhjZXB0IEltcG9ydEVycm9yOg0KICAgICAgICBfT3JkZXJlZERpY3QgPSBOb25lDQoNCiN+IHN5cy5zdGRlcnIud3JpdGUoICJ0ZXN0aW5nIHB5cGFyc2luZyBtb2R1bGUsIHZlcnNpb24gJXMsICVzXG4iICUgKF9fdmVyc2lvbl9fLF9fdmVyc2lvblRpbWVfXyApICkNCg0KX19hbGxfXyA9IFsNCidBbmQnLCAnQ2FzZWxlc3NLZXl3b3JkJywgJ0Nhc2VsZXNzTGl0ZXJhbCcsICdDaGFyc05vdEluJywgJ0NvbWJpbmUnLCAnRGljdCcsICdFYWNoJywgJ0VtcHR5JywNCidGb2xsb3dlZEJ5JywgJ0ZvcndhcmQnLCAnR29Ub0NvbHVtbicsICdHcm91cCcsICdLZXl3b3JkJywgJ0xpbmVFbmQnLCAnTGluZVN0YXJ0JywgJ0xpdGVyYWwnLA0KJ01hdGNoRmlyc3QnLCAnTm9NYXRjaCcsICdOb3RBbnknLCAnT25lT3JNb3JlJywgJ09ubHlPbmNlJywgJ09wdGlvbmFsJywgJ09yJywNCidQYXJzZUJhc2VFeGNlcHRpb24nLCAnUGFyc2VFbGVtZW50RW5oYW5jZScsICdQYXJzZUV4Y2VwdGlvbicsICdQYXJzZUV4cHJlc3Npb24nLCAnUGFyc2VGYXRhbEV4Y2VwdGlvbicsDQonUGFyc2VSZXN1bHRzJywgJ1BhcnNlU3ludGF4RXhjZXB0aW9uJywgJ1BhcnNlckVsZW1lbnQnLCAnUXVvdGVkU3RyaW5nJywgJ1JlY3Vyc2l2ZUdyYW1tYXJFeGNlcHRpb24nLA0KJ1JlZ2V4JywgJ1NraXBUbycsICdTdHJpbmdFbmQnLCAnU3RyaW5nU3RhcnQnLCAnU3VwcHJlc3MnLCAnVG9rZW4nLCAnVG9rZW5Db252ZXJ0ZXInLCANCidXaGl0ZScsICdXb3JkJywgJ1dvcmRFbmQnLCAnV29yZFN0YXJ0JywgJ1plcm9Pck1vcmUnLA0KJ2FscGhhbnVtcycsICdhbHBoYXMnLCAnYWxwaGFzOGJpdCcsICdhbnlDbG9zZVRhZycsICdhbnlPcGVuVGFnJywgJ2NTdHlsZUNvbW1lbnQnLCAnY29sJywNCidjb21tYVNlcGFyYXRlZExpc3QnLCAnY29tbW9uSFRNTEVudGl0eScsICdjb3VudGVkQXJyYXknLCAnY3BwU3R5bGVDb21tZW50JywgJ2RibFF1b3RlZFN0cmluZycsDQonZGJsU2xhc2hDb21tZW50JywgJ2RlbGltaXRlZExpc3QnLCAnZGljdE9mJywgJ2Rvd25jYXNlVG9rZW5zJywgJ2VtcHR5JywgJ2hleG51bXMnLA0KJ2h0bWxDb21tZW50JywgJ2phdmFTdHlsZUNvbW1lbnQnLCAnbGluZScsICdsaW5lRW5kJywgJ2xpbmVTdGFydCcsICdsaW5lbm8nLA0KJ21ha2VIVE1MVGFncycsICdtYWtlWE1MVGFncycsICdtYXRjaE9ubHlBdENvbCcsICdtYXRjaFByZXZpb3VzRXhwcicsICdtYXRjaFByZXZpb3VzTGl0ZXJhbCcsDQonbmVzdGVkRXhwcicsICdudWxsRGVidWdBY3Rpb24nLCAnbnVtcycsICdvbmVPZicsICdvcEFzc29jJywgJ29wZXJhdG9yUHJlY2VkZW5jZScsICdwcmludGFibGVzJywNCidwdW5jOGJpdCcsICdweXRob25TdHlsZUNvbW1lbnQnLCAncXVvdGVkU3RyaW5nJywgJ3JlbW92ZVF1b3RlcycsICdyZXBsYWNlSFRNTEVudGl0eScsIA0KJ3JlcGxhY2VXaXRoJywgJ3Jlc3RPZkxpbmUnLCAnc2dsUXVvdGVkU3RyaW5nJywgJ3NyYW5nZScsICdzdHJpbmdFbmQnLA0KJ3N0cmluZ1N0YXJ0JywgJ3RyYWNlUGFyc2VBY3Rpb24nLCAndW5pY29kZVN0cmluZycsICd1cGNhc2VUb2tlbnMnLCAnd2l0aEF0dHJpYnV0ZScsDQonaW5kZW50ZWRCbG9jaycsICdvcmlnaW5hbFRleHRGb3InLCAndW5ncm91cCcsICdpbmZpeE5vdGF0aW9uJywnbG9jYXRlZEV4cHInLCAnd2l0aENsYXNzJywNCidDbG9zZU1hdGNoJywgJ3Rva2VuTWFwJywgJ3B5cGFyc2luZ19jb21tb24nLA0KXQ0KDQpzeXN0ZW1fdmVyc2lvbiA9IHR1cGxlKHN5cy52ZXJzaW9uX2luZm8pWzozXQ0KUFlfMyA9IHN5c3RlbV92ZXJzaW9uWzBdID09IDMNCmlmIFBZXzM6DQogICAgX01BWF9JTlQgPSBzeXMubWF4c2l6ZQ0KICAgIGJhc2VzdHJpbmcgPSBzdHINCiAgICB1bmljaHIgPSBjaHINCiAgICBfdXN0ciA9IHN0cg0KDQogICAgIyBidWlsZCBsaXN0IG9mIHNpbmdsZSBhcmcgYnVpbHRpbnMsIHRoYXQgY2FuIGJlIHVzZWQgYXMgcGFyc2UgYWN0aW9ucw0KICAgIHNpbmdsZUFyZ0J1aWx0aW5zID0gW3N1bSwgbGVuLCBzb3J0ZWQsIHJldmVyc2VkLCBsaXN0LCB0dXBsZSwgc2V0LCBhbnksIGFsbCwgbWluLCBtYXhdDQoNCmVsc2U6DQogICAgX01BWF9JTlQgPSBzeXMubWF4aW50DQogICAgcmFuZ2UgPSB4cmFuZ2UNCg0KICAgIGRlZiBfdXN0cihvYmopOg0KICAgICAgICAiIiJEcm9wLWluIHJlcGxhY2VtZW50IGZvciBzdHIob2JqKSB0aGF0IHRyaWVzIHRvIGJlIFVuaWNvZGUgZnJpZW5kbHkuIEl0IGZpcnN0IHRyaWVzDQogICAgICAgICAgIHN0cihvYmopLiBJZiB0aGF0IGZhaWxzIHdpdGggYSBVbmljb2RlRW5jb2RlRXJyb3IsIHRoZW4gaXQgdHJpZXMgdW5pY29kZShvYmopLiBJdA0KICAgICAgICAgICB0aGVuIDwgcmV0dXJucyB0aGUgdW5pY29kZSBvYmplY3QgfCBlbmNvZGVzIGl0IHdpdGggdGhlIGRlZmF1bHQgZW5jb2RpbmcgfCAuLi4gPi4NCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2Uob2JqLHVuaWNvZGUpOg0KICAgICAgICAgICAgcmV0dXJuIG9iag0KDQogICAgICAgIHRyeToNCiAgICAgICAgICAgICMgSWYgdGhpcyB3b3JrcywgdGhlbiBfdXN0cihvYmopIGhhcyB0aGUgc2FtZSBiZWhhdmlvdXIgYXMgc3RyKG9iaiksIHNvDQogICAgICAgICAgICAjIGl0IHdvbid0IGJyZWFrIGFueSBleGlzdGluZyBjb2RlLg0KICAgICAgICAgICAgcmV0dXJuIHN0cihvYmopDQoNCiAgICAgICAgZXhjZXB0IFVuaWNvZGVFbmNvZGVFcnJvcjoNCiAgICAgICAgICAgICMgRWxzZSBlbmNvZGUgaXQNCiAgICAgICAgICAgIHJldCA9IHVuaWNvZGUob2JqKS5lbmNvZGUoc3lzLmdldGRlZmF1bHRlbmNvZGluZygpLCAneG1sY2hhcnJlZnJlcGxhY2UnKQ0KICAgICAgICAgICAgeG1sY2hhcnJlZiA9IFJlZ2V4KHInJiNcZCs7JykNCiAgICAgICAgICAgIHhtbGNoYXJyZWYuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHQ6ICdcXHUnICsgaGV4KGludCh0WzBdWzI6LTFdKSlbMjpdKQ0KICAgICAgICAgICAgcmV0dXJuIHhtbGNoYXJyZWYudHJhbnNmb3JtU3RyaW5nKHJldCkNCg0KICAgICMgYnVpbGQgbGlzdCBvZiBzaW5nbGUgYXJnIGJ1aWx0aW5zLCB0b2xlcmFudCBvZiBQeXRob24gdmVyc2lvbiwgdGhhdCBjYW4gYmUgdXNlZCBhcyBwYXJzZSBhY3Rpb25zDQogICAgc2luZ2xlQXJnQnVpbHRpbnMgPSBbXQ0KICAgIGltcG9ydCBfX2J1aWx0aW5fXw0KICAgIGZvciBmbmFtZSBpbiAic3VtIGxlbiBzb3J0ZWQgcmV2ZXJzZWQgbGlzdCB0dXBsZSBzZXQgYW55IGFsbCBtaW4gbWF4Ii5zcGxpdCgpOg0KICAgICAgICB0cnk6DQogICAgICAgICAgICBzaW5nbGVBcmdCdWlsdGlucy5hcHBlbmQoZ2V0YXR0cihfX2J1aWx0aW5fXyxmbmFtZSkpDQogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoNCiAgICAgICAgICAgIGNvbnRpbnVlDQogICAgICAgICAgICANCl9nZW5lcmF0b3JUeXBlID0gdHlwZSgoeSBmb3IgeSBpbiByYW5nZSgxKSkpDQogDQpkZWYgX3htbF9lc2NhcGUoZGF0YSk6DQogICAgIiIiRXNjYXBlICYsIDwsID4sICIsICcsIGV0Yy4gaW4gYSBzdHJpbmcgb2YgZGF0YS4iIiINCg0KICAgICMgYW1wZXJzYW5kIG11c3QgYmUgcmVwbGFjZWQgZmlyc3QNCiAgICBmcm9tX3N5bWJvbHMgPSAnJj48IlwnJw0KICAgIHRvX3N5bWJvbHMgPSAoJyYnK3MrJzsnIGZvciBzIGluICJhbXAgZ3QgbHQgcXVvdCBhcG9zIi5zcGxpdCgpKQ0KICAgIGZvciBmcm9tXyx0b18gaW4gemlwKGZyb21fc3ltYm9scywgdG9fc3ltYm9scyk6DQogICAgICAgIGRhdGEgPSBkYXRhLnJlcGxhY2UoZnJvbV8sIHRvXykNCiAgICByZXR1cm4gZGF0YQ0KDQpjbGFzcyBfQ29uc3RhbnRzKG9iamVjdCk6DQogICAgcGFzcw0KDQphbHBoYXMgICAgID0gc3RyaW5nLmFzY2lpX3VwcGVyY2FzZSArIHN0cmluZy5hc2NpaV9sb3dlcmNhc2UNCm51bXMgICAgICAgPSAiMDEyMzQ1Njc4OSINCmhleG51bXMgICAgPSBudW1zICsgIkFCQ0RFRmFiY2RlZiINCmFscGhhbnVtcyAgPSBhbHBoYXMgKyBudW1zDQpfYnNsYXNoICAgID0gY2hyKDkyKQ0KcHJpbnRhYmxlcyA9ICIiLmpvaW4oYyBmb3IgYyBpbiBzdHJpbmcucHJpbnRhYmxlIGlmIGMgbm90IGluIHN0cmluZy53aGl0ZXNwYWNlKQ0KDQpjbGFzcyBQYXJzZUJhc2VFeGNlcHRpb24oRXhjZXB0aW9uKToNCiAgICAiIiJiYXNlIGV4Y2VwdGlvbiBjbGFzcyBmb3IgYWxsIHBhcnNpbmcgcnVudGltZSBleGNlcHRpb25zIiIiDQogICAgIyBQZXJmb3JtYW5jZSB0dW5pbmc6IHdlIGNvbnN0cnVjdCBhICpsb3QqIG9mIHRoZXNlLCBzbyBrZWVwIHRoaXMNCiAgICAjIGNvbnN0cnVjdG9yIGFzIHNtYWxsIGFuZCBmYXN0IGFzIHBvc3NpYmxlDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBwc3RyLCBsb2M9MCwgbXNnPU5vbmUsIGVsZW09Tm9uZSApOg0KICAgICAgICBzZWxmLmxvYyA9IGxvYw0KICAgICAgICBpZiBtc2cgaXMgTm9uZToNCiAgICAgICAgICAgIHNlbGYubXNnID0gcHN0cg0KICAgICAgICAgICAgc2VsZi5wc3RyID0gIiINCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHNlbGYubXNnID0gbXNnDQogICAgICAgICAgICBzZWxmLnBzdHIgPSBwc3RyDQogICAgICAgIHNlbGYucGFyc2VyRWxlbWVudCA9IGVsZW0NCiAgICAgICAgc2VsZi5hcmdzID0gKHBzdHIsIGxvYywgbXNnKQ0KDQogICAgQGNsYXNzbWV0aG9kDQogICAgZGVmIF9mcm9tX2V4Y2VwdGlvbihjbHMsIHBlKToNCiAgICAgICAgIiIiDQogICAgICAgIGludGVybmFsIGZhY3RvcnkgbWV0aG9kIHRvIHNpbXBsaWZ5IGNyZWF0aW5nIG9uZSB0eXBlIG9mIFBhcnNlRXhjZXB0aW9uIA0KICAgICAgICBmcm9tIGFub3RoZXIgLSBhdm9pZHMgaGF2aW5nIF9faW5pdF9fIHNpZ25hdHVyZSBjb25mbGljdHMgYW1vbmcgc3ViY2xhc3Nlcw0KICAgICAgICAiIiINCiAgICAgICAgcmV0dXJuIGNscyhwZS5wc3RyLCBwZS5sb2MsIHBlLm1zZywgcGUucGFyc2VyRWxlbWVudCkNCg0KICAgIGRlZiBfX2dldGF0dHJfXyggc2VsZiwgYW5hbWUgKToNCiAgICAgICAgIiIic3VwcG9ydGVkIGF0dHJpYnV0ZXMgYnkgbmFtZSBhcmU6DQogICAgICAgICAgICAtIGxpbmVubyAtIHJldHVybnMgdGhlIGxpbmUgbnVtYmVyIG9mIHRoZSBleGNlcHRpb24gdGV4dA0KICAgICAgICAgICAgLSBjb2wgLSByZXR1cm5zIHRoZSBjb2x1bW4gbnVtYmVyIG9mIHRoZSBleGNlcHRpb24gdGV4dA0KICAgICAgICAgICAgLSBsaW5lIC0gcmV0dXJucyB0aGUgbGluZSBjb250YWluaW5nIHRoZSBleGNlcHRpb24gdGV4dA0KICAgICAgICAiIiINCiAgICAgICAgaWYoIGFuYW1lID09ICJsaW5lbm8iICk6DQogICAgICAgICAgICByZXR1cm4gbGluZW5vKCBzZWxmLmxvYywgc2VsZi5wc3RyICkNCiAgICAgICAgZWxpZiggYW5hbWUgaW4gKCJjb2wiLCAiY29sdW1uIikgKToNCiAgICAgICAgICAgIHJldHVybiBjb2woIHNlbGYubG9jLCBzZWxmLnBzdHIgKQ0KICAgICAgICBlbGlmKCBhbmFtZSA9PSAibGluZSIgKToNCiAgICAgICAgICAgIHJldHVybiBsaW5lKCBzZWxmLmxvYywgc2VsZi5wc3RyICkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKGFuYW1lKQ0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgcmV0dXJuICIlcyAoYXQgY2hhciAlZCksIChsaW5lOiVkLCBjb2w6JWQpIiAlIFwNCiAgICAgICAgICAgICAgICAoIHNlbGYubXNnLCBzZWxmLmxvYywgc2VsZi5saW5lbm8sIHNlbGYuY29sdW1uICkNCiAgICBkZWYgX19yZXByX18oIHNlbGYgKToNCiAgICAgICAgcmV0dXJuIF91c3RyKHNlbGYpDQogICAgZGVmIG1hcmtJbnB1dGxpbmUoIHNlbGYsIG1hcmtlclN0cmluZyA9ICI+ITwiICk6DQogICAgICAgICIiIkV4dHJhY3RzIHRoZSBleGNlcHRpb24gbGluZSBmcm9tIHRoZSBpbnB1dCBzdHJpbmcsIGFuZCBtYXJrcw0KICAgICAgICAgICB0aGUgbG9jYXRpb24gb2YgdGhlIGV4Y2VwdGlvbiB3aXRoIGEgc3BlY2lhbCBzeW1ib2wuDQogICAgICAgICIiIg0KICAgICAgICBsaW5lX3N0ciA9IHNlbGYubGluZQ0KICAgICAgICBsaW5lX2NvbHVtbiA9IHNlbGYuY29sdW1uIC0gMQ0KICAgICAgICBpZiBtYXJrZXJTdHJpbmc6DQogICAgICAgICAgICBsaW5lX3N0ciA9ICIiLmpvaW4oKGxpbmVfc3RyWzpsaW5lX2NvbHVtbl0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlclN0cmluZywgbGluZV9zdHJbbGluZV9jb2x1bW46XSkpDQogICAgICAgIHJldHVybiBsaW5lX3N0ci5zdHJpcCgpDQogICAgZGVmIF9fZGlyX18oc2VsZik6DQogICAgICAgIHJldHVybiAibGluZW5vIGNvbCBsaW5lIi5zcGxpdCgpICsgZGlyKHR5cGUoc2VsZikpDQoNCmNsYXNzIFBhcnNlRXhjZXB0aW9uKFBhcnNlQmFzZUV4Y2VwdGlvbik6DQogICAgIiIiDQogICAgRXhjZXB0aW9uIHRocm93biB3aGVuIHBhcnNlIGV4cHJlc3Npb25zIGRvbid0IG1hdGNoIGNsYXNzOw0KICAgIHN1cHBvcnRlZCBhdHRyaWJ1dGVzIGJ5IG5hbWUgYXJlOg0KICAgICAtIGxpbmVubyAtIHJldHVybnMgdGhlIGxpbmUgbnVtYmVyIG9mIHRoZSBleGNlcHRpb24gdGV4dA0KICAgICAtIGNvbCAtIHJldHVybnMgdGhlIGNvbHVtbiBudW1iZXIgb2YgdGhlIGV4Y2VwdGlvbiB0ZXh0DQogICAgIC0gbGluZSAtIHJldHVybnMgdGhlIGxpbmUgY29udGFpbmluZyB0aGUgZXhjZXB0aW9uIHRleHQNCiAgICAgICAgDQogICAgRXhhbXBsZTo6DQogICAgICAgIHRyeToNCiAgICAgICAgICAgIFdvcmQobnVtcykuc2V0TmFtZSgiaW50ZWdlciIpLnBhcnNlU3RyaW5nKCJBQkMiKQ0KICAgICAgICBleGNlcHQgUGFyc2VFeGNlcHRpb24gYXMgcGU6DQogICAgICAgICAgICBwcmludChwZSkNCiAgICAgICAgICAgIHByaW50KCJjb2x1bW46IHt9Ii5mb3JtYXQocGUuY29sKSkNCiAgICAgICAgICAgIA0KICAgIHByaW50czo6DQogICAgICAgRXhwZWN0ZWQgaW50ZWdlciAoYXQgY2hhciAwKSwgKGxpbmU6MSwgY29sOjEpDQogICAgICAgIGNvbHVtbjogMQ0KICAgICIiIg0KICAgIHBhc3MNCg0KY2xhc3MgUGFyc2VGYXRhbEV4Y2VwdGlvbihQYXJzZUJhc2VFeGNlcHRpb24pOg0KICAgICIiInVzZXItdGhyb3dhYmxlIGV4Y2VwdGlvbiB0aHJvd24gd2hlbiBpbmNvbnNpc3RlbnQgcGFyc2UgY29udGVudA0KICAgICAgIGlzIGZvdW5kOyBzdG9wcyBhbGwgcGFyc2luZyBpbW1lZGlhdGVseSIiIg0KICAgIHBhc3MNCg0KY2xhc3MgUGFyc2VTeW50YXhFeGNlcHRpb24oUGFyc2VGYXRhbEV4Y2VwdGlvbik6DQogICAgIiIianVzdCBsaWtlIEx7UGFyc2VGYXRhbEV4Y2VwdGlvbn0sIGJ1dCB0aHJvd24gaW50ZXJuYWxseSB3aGVuIGFuDQogICAgICAgTHtFcnJvclN0b3A8QW5kLl9FcnJvclN0b3A+fSAoJy0nIG9wZXJhdG9yKSBpbmRpY2F0ZXMgdGhhdCBwYXJzaW5nIGlzIHRvIHN0b3AgDQogICAgICAgaW1tZWRpYXRlbHkgYmVjYXVzZSBhbiB1bmJhY2t0cmFja2FibGUgc3ludGF4IGVycm9yIGhhcyBiZWVuIGZvdW5kIiIiDQogICAgcGFzcw0KDQojfiBjbGFzcyBSZXBhcnNlRXhjZXB0aW9uKFBhcnNlQmFzZUV4Y2VwdGlvbik6DQogICAgI34gIiIiRXhwZXJpbWVudGFsIGNsYXNzIC0gcGFyc2UgYWN0aW9ucyBjYW4gcmFpc2UgdGhpcyBleGNlcHRpb24gdG8gY2F1c2UNCiAgICAgICAjfiBweXBhcnNpbmcgdG8gcmVwYXJzZSB0aGUgaW5wdXQgc3RyaW5nOg0KICAgICAgICAjfiAtIHdpdGggYSBtb2RpZmllZCBpbnB1dCBzdHJpbmcsIGFuZC9vcg0KICAgICAgICAjfiAtIHdpdGggYSBtb2RpZmllZCBzdGFydCBsb2NhdGlvbg0KICAgICAgICN+IFNldCB0aGUgdmFsdWVzIG9mIHRoZSBSZXBhcnNlRXhjZXB0aW9uIGluIHRoZSBjb25zdHJ1Y3RvciwgYW5kIHJhaXNlIHRoZQ0KICAgICAgICN+IGV4Y2VwdGlvbiBpbiBhIHBhcnNlIGFjdGlvbiB0byBjYXVzZSBweXBhcnNpbmcgdG8gdXNlIHRoZSBuZXcgc3RyaW5nL2xvY2F0aW9uLg0KICAgICAgICN+IFNldHRpbmcgdGhlIHZhbHVlcyBhcyBOb25lIGNhdXNlcyBubyBjaGFuZ2UgdG8gYmUgbWFkZS4NCiAgICAgICAjfiAiIiINCiAgICAjfiBkZWYgX19pbml0Xyggc2VsZiwgbmV3c3RyaW5nLCByZXN0YXJ0TG9jICk6DQogICAgICAgICN+IHNlbGYubmV3UGFyc2VUZXh0ID0gbmV3c3RyaW5nDQogICAgICAgICN+IHNlbGYucmVwYXJzZUxvYyA9IHJlc3RhcnRMb2MNCg0KY2xhc3MgUmVjdXJzaXZlR3JhbW1hckV4Y2VwdGlvbihFeGNlcHRpb24pOg0KICAgICIiImV4Y2VwdGlvbiB0aHJvd24gYnkgTHtQYXJzZXJFbGVtZW50LnZhbGlkYXRlfSBpZiB0aGUgZ3JhbW1hciBjb3VsZCBiZSBpbXByb3Blcmx5IHJlY3Vyc2l2ZSIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgcGFyc2VFbGVtZW50TGlzdCApOg0KICAgICAgICBzZWxmLnBhcnNlRWxlbWVudFRyYWNlID0gcGFyc2VFbGVtZW50TGlzdA0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgcmV0dXJuICJSZWN1cnNpdmVHcmFtbWFyRXhjZXB0aW9uOiAlcyIgJSBzZWxmLnBhcnNlRWxlbWVudFRyYWNlDQoNCmNsYXNzIF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KG9iamVjdCk6DQogICAgZGVmIF9faW5pdF9fKHNlbGYscDEscDIpOg0KICAgICAgICBzZWxmLnR1cCA9IChwMSxwMikNCiAgICBkZWYgX19nZXRpdGVtX18oc2VsZixpKToNCiAgICAgICAgcmV0dXJuIHNlbGYudHVwW2ldDQogICAgZGVmIF9fcmVwcl9fKHNlbGYpOg0KICAgICAgICByZXR1cm4gcmVwcihzZWxmLnR1cFswXSkNCiAgICBkZWYgc2V0T2Zmc2V0KHNlbGYsaSk6DQogICAgICAgIHNlbGYudHVwID0gKHNlbGYudHVwWzBdLGkpDQoNCmNsYXNzIFBhcnNlUmVzdWx0cyhvYmplY3QpOg0KICAgICIiIg0KICAgIFN0cnVjdHVyZWQgcGFyc2UgcmVzdWx0cywgdG8gcHJvdmlkZSBtdWx0aXBsZSBtZWFucyBvZiBhY2Nlc3MgdG8gdGhlIHBhcnNlZCBkYXRhOg0KICAgICAgIC0gYXMgYSBsaXN0IChDe2xlbihyZXN1bHRzKX0pDQogICAgICAgLSBieSBsaXN0IGluZGV4IChDe3Jlc3VsdHNbMF0sIHJlc3VsdHNbMV19LCBldGMuKQ0KICAgICAgIC0gYnkgYXR0cmlidXRlIChDe3Jlc3VsdHMuPHJlc3VsdHNOYW1lPn0gLSBzZWUgTHtQYXJzZXJFbGVtZW50LnNldFJlc3VsdHNOYW1lfSkNCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKQ0KICAgICAgICBkYXRlX3N0ciA9IChpbnRlZ2VyLnNldFJlc3VsdHNOYW1lKCJ5ZWFyIikgKyAnLycgDQogICAgICAgICAgICAgICAgICAgICAgICArIGludGVnZXIuc2V0UmVzdWx0c05hbWUoIm1vbnRoIikgKyAnLycgDQogICAgICAgICAgICAgICAgICAgICAgICArIGludGVnZXIuc2V0UmVzdWx0c05hbWUoImRheSIpKQ0KICAgICAgICAjIGVxdWl2YWxlbnQgZm9ybToNCiAgICAgICAgIyBkYXRlX3N0ciA9IGludGVnZXIoInllYXIiKSArICcvJyArIGludGVnZXIoIm1vbnRoIikgKyAnLycgKyBpbnRlZ2VyKCJkYXkiKQ0KDQogICAgICAgICMgcGFyc2VTdHJpbmcgcmV0dXJucyBhIFBhcnNlUmVzdWx0cyBvYmplY3QNCiAgICAgICAgcmVzdWx0ID0gZGF0ZV9zdHIucGFyc2VTdHJpbmcoIjE5OTkvMTIvMzEiKQ0KDQogICAgICAgIGRlZiB0ZXN0KHMsIGZuPXJlcHIpOg0KICAgICAgICAgICAgcHJpbnQoIiVzIC0+ICVzIiAlIChzLCBmbihldmFsKHMpKSkpDQogICAgICAgIHRlc3QoImxpc3QocmVzdWx0KSIpDQogICAgICAgIHRlc3QoInJlc3VsdFswXSIpDQogICAgICAgIHRlc3QoInJlc3VsdFsnbW9udGgnXSIpDQogICAgICAgIHRlc3QoInJlc3VsdC5kYXkiKQ0KICAgICAgICB0ZXN0KCInbW9udGgnIGluIHJlc3VsdCIpDQogICAgICAgIHRlc3QoIidtaW51dGVzJyBpbiByZXN1bHQiKQ0KICAgICAgICB0ZXN0KCJyZXN1bHQuZHVtcCgpIiwgc3RyKQ0KICAgIHByaW50czo6DQogICAgICAgIGxpc3QocmVzdWx0KSAtPiBbJzE5OTknLCAnLycsICcxMicsICcvJywgJzMxJ10NCiAgICAgICAgcmVzdWx0WzBdIC0+ICcxOTk5Jw0KICAgICAgICByZXN1bHRbJ21vbnRoJ10gLT4gJzEyJw0KICAgICAgICByZXN1bHQuZGF5IC0+ICczMScNCiAgICAgICAgJ21vbnRoJyBpbiByZXN1bHQgLT4gVHJ1ZQ0KICAgICAgICAnbWludXRlcycgaW4gcmVzdWx0IC0+IEZhbHNlDQogICAgICAgIHJlc3VsdC5kdW1wKCkgLT4gWycxOTk5JywgJy8nLCAnMTInLCAnLycsICczMSddDQogICAgICAgIC0gZGF5OiAzMQ0KICAgICAgICAtIG1vbnRoOiAxMg0KICAgICAgICAtIHllYXI6IDE5OTkNCiAgICAiIiINCiAgICBkZWYgX19uZXdfXyhjbHMsIHRva2xpc3Q9Tm9uZSwgbmFtZT1Ob25lLCBhc0xpc3Q9VHJ1ZSwgbW9kYWw9VHJ1ZSApOg0KICAgICAgICBpZiBpc2luc3RhbmNlKHRva2xpc3QsIGNscyk6DQogICAgICAgICAgICByZXR1cm4gdG9rbGlzdA0KICAgICAgICByZXRvYmogPSBvYmplY3QuX19uZXdfXyhjbHMpDQogICAgICAgIHJldG9iai5fX2RvaW5pdCA9IFRydWUNCiAgICAgICAgcmV0dXJuIHJldG9iag0KDQogICAgIyBQZXJmb3JtYW5jZSB0dW5pbmc6IHdlIGNvbnN0cnVjdCBhICpsb3QqIG9mIHRoZXNlLCBzbyBrZWVwIHRoaXMNCiAgICAjIGNvbnN0cnVjdG9yIGFzIHNtYWxsIGFuZCBmYXN0IGFzIHBvc3NpYmxlDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCB0b2tsaXN0PU5vbmUsIG5hbWU9Tm9uZSwgYXNMaXN0PVRydWUsIG1vZGFsPVRydWUsIGlzaW5zdGFuY2U9aXNpbnN0YW5jZSApOg0KICAgICAgICBpZiBzZWxmLl9fZG9pbml0Og0KICAgICAgICAgICAgc2VsZi5fX2RvaW5pdCA9IEZhbHNlDQogICAgICAgICAgICBzZWxmLl9fbmFtZSA9IE5vbmUNCiAgICAgICAgICAgIHNlbGYuX19wYXJlbnQgPSBOb25lDQogICAgICAgICAgICBzZWxmLl9fYWNjdW1OYW1lcyA9IHt9DQogICAgICAgICAgICBzZWxmLl9fYXNMaXN0ID0gYXNMaXN0DQogICAgICAgICAgICBzZWxmLl9fbW9kYWwgPSBtb2RhbA0KICAgICAgICAgICAgaWYgdG9rbGlzdCBpcyBOb25lOg0KICAgICAgICAgICAgICAgIHRva2xpc3QgPSBbXQ0KICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh0b2tsaXN0LCBsaXN0KToNCiAgICAgICAgICAgICAgICBzZWxmLl9fdG9rbGlzdCA9IHRva2xpc3RbOl0NCiAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZSh0b2tsaXN0LCBfZ2VuZXJhdG9yVHlwZSk6DQogICAgICAgICAgICAgICAgc2VsZi5fX3Rva2xpc3QgPSBsaXN0KHRva2xpc3QpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHNlbGYuX190b2tsaXN0ID0gW3Rva2xpc3RdDQogICAgICAgICAgICBzZWxmLl9fdG9rZGljdCA9IGRpY3QoKQ0KDQogICAgICAgIGlmIG5hbWUgaXMgbm90IE5vbmUgYW5kIG5hbWU6DQogICAgICAgICAgICBpZiBub3QgbW9kYWw6DQogICAgICAgICAgICAgICAgc2VsZi5fX2FjY3VtTmFtZXNbbmFtZV0gPSAwDQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKG5hbWUsaW50KToNCiAgICAgICAgICAgICAgICBuYW1lID0gX3VzdHIobmFtZSkgIyB3aWxsIGFsd2F5cyByZXR1cm4gYSBzdHIsIGJ1dCB1c2UgX3VzdHIgZm9yIGNvbnNpc3RlbmN5DQogICAgICAgICAgICBzZWxmLl9fbmFtZSA9IG5hbWUNCiAgICAgICAgICAgIGlmIG5vdCAoaXNpbnN0YW5jZSh0b2tsaXN0LCAodHlwZShOb25lKSwgYmFzZXN0cmluZywgbGlzdCkpIGFuZCB0b2tsaXN0IGluIChOb25lLCcnLFtdKSk6DQogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh0b2tsaXN0LGJhc2VzdHJpbmcpOg0KICAgICAgICAgICAgICAgICAgICB0b2tsaXN0ID0gWyB0b2tsaXN0IF0NCiAgICAgICAgICAgICAgICBpZiBhc0xpc3Q6DQogICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodG9rbGlzdCxQYXJzZVJlc3VsdHMpOg0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZltuYW1lXSA9IF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KHRva2xpc3QuY29weSgpLDApDQogICAgICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmW25hbWVdID0gX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQoUGFyc2VSZXN1bHRzKHRva2xpc3RbMF0pLDApDQogICAgICAgICAgICAgICAgICAgIHNlbGZbbmFtZV0uX19uYW1lID0gbmFtZQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGZbbmFtZV0gPSB0b2tsaXN0WzBdDQogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCAoS2V5RXJyb3IsVHlwZUVycm9yLEluZGV4RXJyb3IpOg0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZltuYW1lXSA9IHRva2xpc3QNCg0KICAgIGRlZiBfX2dldGl0ZW1fXyggc2VsZiwgaSApOg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBpLCAoaW50LHNsaWNlKSApOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYuX190b2tsaXN0W2ldDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBpZiBpIG5vdCBpbiBzZWxmLl9fYWNjdW1OYW1lczoNCiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fX3Rva2RpY3RbaV1bLTFdWzBdDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHJldHVybiBQYXJzZVJlc3VsdHMoWyB2WzBdIGZvciB2IGluIHNlbGYuX190b2tkaWN0W2ldIF0pDQoNCiAgICBkZWYgX19zZXRpdGVtX18oIHNlbGYsIGssIHYsIGlzaW5zdGFuY2U9aXNpbnN0YW5jZSApOg0KICAgICAgICBpZiBpc2luc3RhbmNlKHYsX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQpOg0KICAgICAgICAgICAgc2VsZi5fX3Rva2RpY3Rba10gPSBzZWxmLl9fdG9rZGljdC5nZXQoayxsaXN0KCkpICsgW3ZdDQogICAgICAgICAgICBzdWIgPSB2WzBdDQogICAgICAgIGVsaWYgaXNpbnN0YW5jZShrLChpbnQsc2xpY2UpKToNCiAgICAgICAgICAgIHNlbGYuX190b2tsaXN0W2tdID0gdg0KICAgICAgICAgICAgc3ViID0gdg0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc2VsZi5fX3Rva2RpY3Rba10gPSBzZWxmLl9fdG9rZGljdC5nZXQoayxsaXN0KCkpICsgW19QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KHYsMCldDQogICAgICAgICAgICBzdWIgPSB2DQogICAgICAgIGlmIGlzaW5zdGFuY2Uoc3ViLFBhcnNlUmVzdWx0cyk6DQogICAgICAgICAgICBzdWIuX19wYXJlbnQgPSB3a3JlZihzZWxmKQ0KDQogICAgZGVmIF9fZGVsaXRlbV9fKCBzZWxmLCBpICk6DQogICAgICAgIGlmIGlzaW5zdGFuY2UoaSwoaW50LHNsaWNlKSk6DQogICAgICAgICAgICBteWxlbiA9IGxlbiggc2VsZi5fX3Rva2xpc3QgKQ0KICAgICAgICAgICAgZGVsIHNlbGYuX190b2tsaXN0W2ldDQoNCiAgICAgICAgICAgICMgY29udmVydCBpbnQgdG8gc2xpY2UNCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoaSwgaW50KToNCiAgICAgICAgICAgICAgICBpZiBpIDwgMDoNCiAgICAgICAgICAgICAgICAgICAgaSArPSBteWxlbg0KICAgICAgICAgICAgICAgIGkgPSBzbGljZShpLCBpKzEpDQogICAgICAgICAgICAjIGdldCByZW1vdmVkIGluZGljZXMNCiAgICAgICAgICAgIHJlbW92ZWQgPSBsaXN0KHJhbmdlKCppLmluZGljZXMobXlsZW4pKSkNCiAgICAgICAgICAgIHJlbW92ZWQucmV2ZXJzZSgpDQogICAgICAgICAgICAjIGZpeHVwIGluZGljZXMgaW4gdG9rZW4gZGljdGlvbmFyeQ0KICAgICAgICAgICAgZm9yIG5hbWUsb2NjdXJyZW5jZXMgaW4gc2VsZi5fX3Rva2RpY3QuaXRlbXMoKToNCiAgICAgICAgICAgICAgICBmb3IgaiBpbiByZW1vdmVkOg0KICAgICAgICAgICAgICAgICAgICBmb3IgaywgKHZhbHVlLCBwb3NpdGlvbikgaW4gZW51bWVyYXRlKG9jY3VycmVuY2VzKToNCiAgICAgICAgICAgICAgICAgICAgICAgIG9jY3VycmVuY2VzW2tdID0gX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQodmFsdWUsIHBvc2l0aW9uIC0gKHBvc2l0aW9uID4gaikpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBkZWwgc2VsZi5fX3Rva2RpY3RbaV0NCg0KICAgIGRlZiBfX2NvbnRhaW5zX18oIHNlbGYsIGsgKToNCiAgICAgICAgcmV0dXJuIGsgaW4gc2VsZi5fX3Rva2RpY3QNCg0KICAgIGRlZiBfX2xlbl9fKCBzZWxmICk6IHJldHVybiBsZW4oIHNlbGYuX190b2tsaXN0ICkNCiAgICBkZWYgX19ib29sX18oc2VsZik6IHJldHVybiAoIG5vdCBub3Qgc2VsZi5fX3Rva2xpc3QgKQ0KICAgIF9fbm9uemVyb19fID0gX19ib29sX18NCiAgICBkZWYgX19pdGVyX18oIHNlbGYgKTogcmV0dXJuIGl0ZXIoIHNlbGYuX190b2tsaXN0ICkNCiAgICBkZWYgX19yZXZlcnNlZF9fKCBzZWxmICk6IHJldHVybiBpdGVyKCBzZWxmLl9fdG9rbGlzdFs6Oi0xXSApDQogICAgZGVmIF9pdGVya2V5cyggc2VsZiApOg0KICAgICAgICBpZiBoYXNhdHRyKHNlbGYuX190b2tkaWN0LCAiaXRlcmtleXMiKToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLl9fdG9rZGljdC5pdGVya2V5cygpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByZXR1cm4gaXRlcihzZWxmLl9fdG9rZGljdCkNCg0KICAgIGRlZiBfaXRlcnZhbHVlcyggc2VsZiApOg0KICAgICAgICByZXR1cm4gKHNlbGZba10gZm9yIGsgaW4gc2VsZi5faXRlcmtleXMoKSkNCiAgICAgICAgICAgIA0KICAgIGRlZiBfaXRlcml0ZW1zKCBzZWxmICk6DQogICAgICAgIHJldHVybiAoKGssIHNlbGZba10pIGZvciBrIGluIHNlbGYuX2l0ZXJrZXlzKCkpDQoNCiAgICBpZiBQWV8zOg0KICAgICAgICBrZXlzID0gX2l0ZXJrZXlzICAgICAgIA0KICAgICAgICAiIiJSZXR1cm5zIGFuIGl0ZXJhdG9yIG9mIGFsbCBuYW1lZCByZXN1bHQga2V5cyAoUHl0aG9uIDMueCBvbmx5KS4iIiINCg0KICAgICAgICB2YWx1ZXMgPSBfaXRlcnZhbHVlcw0KICAgICAgICAiIiJSZXR1cm5zIGFuIGl0ZXJhdG9yIG9mIGFsbCBuYW1lZCByZXN1bHQgdmFsdWVzIChQeXRob24gMy54IG9ubHkpLiIiIg0KDQogICAgICAgIGl0ZW1zID0gX2l0ZXJpdGVtcw0KICAgICAgICAiIiJSZXR1cm5zIGFuIGl0ZXJhdG9yIG9mIGFsbCBuYW1lZCByZXN1bHQga2V5LXZhbHVlIHR1cGxlcyAoUHl0aG9uIDMueCBvbmx5KS4iIiINCg0KICAgIGVsc2U6DQogICAgICAgIGl0ZXJrZXlzID0gX2l0ZXJrZXlzDQogICAgICAgICIiIlJldHVybnMgYW4gaXRlcmF0b3Igb2YgYWxsIG5hbWVkIHJlc3VsdCBrZXlzIChQeXRob24gMi54IG9ubHkpLiIiIg0KDQogICAgICAgIGl0ZXJ2YWx1ZXMgPSBfaXRlcnZhbHVlcw0KICAgICAgICAiIiJSZXR1cm5zIGFuIGl0ZXJhdG9yIG9mIGFsbCBuYW1lZCByZXN1bHQgdmFsdWVzIChQeXRob24gMi54IG9ubHkpLiIiIg0KDQogICAgICAgIGl0ZXJpdGVtcyA9IF9pdGVyaXRlbXMNCiAgICAgICAgIiIiUmV0dXJucyBhbiBpdGVyYXRvciBvZiBhbGwgbmFtZWQgcmVzdWx0IGtleS12YWx1ZSB0dXBsZXMgKFB5dGhvbiAyLnggb25seSkuIiIiDQoNCiAgICAgICAgZGVmIGtleXMoIHNlbGYgKToNCiAgICAgICAgICAgICIiIlJldHVybnMgYWxsIG5hbWVkIHJlc3VsdCBrZXlzIChhcyBhIGxpc3QgaW4gUHl0aG9uIDIueCwgYXMgYW4gaXRlcmF0b3IgaW4gUHl0aG9uIDMueCkuIiIiDQogICAgICAgICAgICByZXR1cm4gbGlzdChzZWxmLml0ZXJrZXlzKCkpDQoNCiAgICAgICAgZGVmIHZhbHVlcyggc2VsZiApOg0KICAgICAgICAgICAgIiIiUmV0dXJucyBhbGwgbmFtZWQgcmVzdWx0IHZhbHVlcyAoYXMgYSBsaXN0IGluIFB5dGhvbiAyLngsIGFzIGFuIGl0ZXJhdG9yIGluIFB5dGhvbiAzLngpLiIiIg0KICAgICAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5pdGVydmFsdWVzKCkpDQogICAgICAgICAgICAgICAgDQogICAgICAgIGRlZiBpdGVtcyggc2VsZiApOg0KICAgICAgICAgICAgIiIiUmV0dXJucyBhbGwgbmFtZWQgcmVzdWx0IGtleS12YWx1ZXMgKGFzIGEgbGlzdCBvZiB0dXBsZXMgaW4gUHl0aG9uIDIueCwgYXMgYW4gaXRlcmF0b3IgaW4gUHl0aG9uIDMueCkuIiIiDQogICAgICAgICAgICByZXR1cm4gbGlzdChzZWxmLml0ZXJpdGVtcygpKQ0KDQogICAgZGVmIGhhc2tleXMoIHNlbGYgKToNCiAgICAgICAgIiIiU2luY2Uga2V5cygpIHJldHVybnMgYW4gaXRlcmF0b3IsIHRoaXMgbWV0aG9kIGlzIGhlbHBmdWwgaW4gYnlwYXNzaW5nDQogICAgICAgICAgIGNvZGUgdGhhdCBsb29rcyBmb3IgdGhlIGV4aXN0ZW5jZSBvZiBhbnkgZGVmaW5lZCByZXN1bHRzIG5hbWVzLiIiIg0KICAgICAgICByZXR1cm4gYm9vbChzZWxmLl9fdG9rZGljdCkNCiAgICAgICAgDQogICAgZGVmIHBvcCggc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToNCiAgICAgICAgIiIiDQogICAgICAgIFJlbW92ZXMgYW5kIHJldHVybnMgaXRlbSBhdCBzcGVjaWZpZWQgaW5kZXggKGRlZmF1bHQ9Q3tsYXN0fSkuDQogICAgICAgIFN1cHBvcnRzIGJvdGggQ3tsaXN0fSBhbmQgQ3tkaWN0fSBzZW1hbnRpY3MgZm9yIEN7cG9wKCl9LiBJZiBwYXNzZWQgbm8NCiAgICAgICAgYXJndW1lbnQgb3IgYW4gaW50ZWdlciBhcmd1bWVudCwgaXQgd2lsbCB1c2UgQ3tsaXN0fSBzZW1hbnRpY3MNCiAgICAgICAgYW5kIHBvcCB0b2tlbnMgZnJvbSB0aGUgbGlzdCBvZiBwYXJzZWQgdG9rZW5zLiBJZiBwYXNzZWQgYSANCiAgICAgICAgbm9uLWludGVnZXIgYXJndW1lbnQgKG1vc3QgbGlrZWx5IGEgc3RyaW5nKSwgaXQgd2lsbCB1c2UgQ3tkaWN0fQ0KICAgICAgICBzZW1hbnRpY3MgYW5kIHBvcCB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBmcm9tIGFueSBkZWZpbmVkIA0KICAgICAgICByZXN1bHRzIG5hbWVzLiBBIHNlY29uZCBkZWZhdWx0IHJldHVybiB2YWx1ZSBhcmd1bWVudCBpcyANCiAgICAgICAgc3VwcG9ydGVkLCBqdXN0IGFzIGluIEN7ZGljdC5wb3AoKX0uDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBkZWYgcmVtb3ZlX2ZpcnN0KHRva2Vucyk6DQogICAgICAgICAgICAgICAgdG9rZW5zLnBvcCgwKQ0KICAgICAgICAgICAgcHJpbnQoT25lT3JNb3JlKFdvcmQobnVtcykpLnBhcnNlU3RyaW5nKCIwIDEyMyAzMjEiKSkgIyAtPiBbJzAnLCAnMTIzJywgJzMyMSddDQogICAgICAgICAgICBwcmludChPbmVPck1vcmUoV29yZChudW1zKSkuYWRkUGFyc2VBY3Rpb24ocmVtb3ZlX2ZpcnN0KS5wYXJzZVN0cmluZygiMCAxMjMgMzIxIikpICMgLT4gWycxMjMnLCAnMzIxJ10NCg0KICAgICAgICAgICAgbGFiZWwgPSBXb3JkKGFscGhhcykNCiAgICAgICAgICAgIHBhdHQgPSBsYWJlbCgiTEFCRUwiKSArIE9uZU9yTW9yZShXb3JkKG51bXMpKQ0KICAgICAgICAgICAgcHJpbnQocGF0dC5wYXJzZVN0cmluZygiQUFCIDEyMyAzMjEiKS5kdW1wKCkpDQoNCiAgICAgICAgICAgICMgVXNlIHBvcCgpIGluIGEgcGFyc2UgYWN0aW9uIHRvIHJlbW92ZSBuYW1lZCByZXN1bHQgKG5vdGUgdGhhdCBjb3JyZXNwb25kaW5nIHZhbHVlIGlzIG5vdA0KICAgICAgICAgICAgIyByZW1vdmVkIGZyb20gbGlzdCBmb3JtIG9mIHJlc3VsdHMpDQogICAgICAgICAgICBkZWYgcmVtb3ZlX0xBQkVMKHRva2Vucyk6DQogICAgICAgICAgICAgICAgdG9rZW5zLnBvcCgiTEFCRUwiKQ0KICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbnMNCiAgICAgICAgICAgIHBhdHQuYWRkUGFyc2VBY3Rpb24ocmVtb3ZlX0xBQkVMKQ0KICAgICAgICAgICAgcHJpbnQocGF0dC5wYXJzZVN0cmluZygiQUFCIDEyMyAzMjEiKS5kdW1wKCkpDQogICAgICAgIHByaW50czo6DQogICAgICAgICAgICBbJ0FBQicsICcxMjMnLCAnMzIxJ10NCiAgICAgICAgICAgIC0gTEFCRUw6IEFBQg0KDQogICAgICAgICAgICBbJ0FBQicsICcxMjMnLCAnMzIxJ10NCiAgICAgICAgIiIiDQogICAgICAgIGlmIG5vdCBhcmdzOg0KICAgICAgICAgICAgYXJncyA9IFstMV0NCiAgICAgICAgZm9yIGssdiBpbiBrd2FyZ3MuaXRlbXMoKToNCiAgICAgICAgICAgIGlmIGsgPT0gJ2RlZmF1bHQnOg0KICAgICAgICAgICAgICAgIGFyZ3MgPSAoYXJnc1swXSwgdikNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJwb3AoKSBnb3QgYW4gdW5leHBlY3RlZCBrZXl3b3JkIGFyZ3VtZW50ICclcyciICUgaykNCiAgICAgICAgaWYgKGlzaW5zdGFuY2UoYXJnc1swXSwgaW50KSBvciANCiAgICAgICAgICAgICAgICAgICAgICAgIGxlbihhcmdzKSA9PSAxIG9yIA0KICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1swXSBpbiBzZWxmKToNCiAgICAgICAgICAgIGluZGV4ID0gYXJnc1swXQ0KICAgICAgICAgICAgcmV0ID0gc2VsZltpbmRleF0NCiAgICAgICAgICAgIGRlbCBzZWxmW2luZGV4XQ0KICAgICAgICAgICAgcmV0dXJuIHJldA0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgZGVmYXVsdHZhbHVlID0gYXJnc1sxXQ0KICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHR2YWx1ZQ0KDQogICAgZGVmIGdldChzZWxmLCBrZXksIGRlZmF1bHRWYWx1ZT1Ob25lKToNCiAgICAgICAgIiIiDQogICAgICAgIFJldHVybnMgbmFtZWQgcmVzdWx0IG1hdGNoaW5nIHRoZSBnaXZlbiBrZXksIG9yIGlmIHRoZXJlIGlzIG5vDQogICAgICAgIHN1Y2ggbmFtZSwgdGhlbiByZXR1cm5zIHRoZSBnaXZlbiBDe2RlZmF1bHRWYWx1ZX0gb3IgQ3tOb25lfSBpZiBubw0KICAgICAgICBDe2RlZmF1bHRWYWx1ZX0gaXMgc3BlY2lmaWVkLg0KDQogICAgICAgIFNpbWlsYXIgdG8gQ3tkaWN0LmdldCgpfS4NCiAgICAgICAgDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykNCiAgICAgICAgICAgIGRhdGVfc3RyID0gaW50ZWdlcigieWVhciIpICsgJy8nICsgaW50ZWdlcigibW9udGgiKSArICcvJyArIGludGVnZXIoImRheSIpICAgICAgICAgICANCg0KICAgICAgICAgICAgcmVzdWx0ID0gZGF0ZV9zdHIucGFyc2VTdHJpbmcoIjE5OTkvMTIvMzEiKQ0KICAgICAgICAgICAgcHJpbnQocmVzdWx0LmdldCgieWVhciIpKSAjIC0+ICcxOTk5Jw0KICAgICAgICAgICAgcHJpbnQocmVzdWx0LmdldCgiaG91ciIsICJub3Qgc3BlY2lmaWVkIikpICMgLT4gJ25vdCBzcGVjaWZpZWQnDQogICAgICAgICAgICBwcmludChyZXN1bHQuZ2V0KCJob3VyIikpICMgLT4gTm9uZQ0KICAgICAgICAiIiINCiAgICAgICAgaWYga2V5IGluIHNlbGY6DQogICAgICAgICAgICByZXR1cm4gc2VsZltrZXldDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlDQoNCiAgICBkZWYgaW5zZXJ0KCBzZWxmLCBpbmRleCwgaW5zU3RyICk6DQogICAgICAgICIiIg0KICAgICAgICBJbnNlcnRzIG5ldyBlbGVtZW50IGF0IGxvY2F0aW9uIGluZGV4IGluIHRoZSBsaXN0IG9mIHBhcnNlZCB0b2tlbnMuDQogICAgICAgIA0KICAgICAgICBTaW1pbGFyIHRvIEN7bGlzdC5pbnNlcnQoKX0uDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBwcmludChPbmVPck1vcmUoV29yZChudW1zKSkucGFyc2VTdHJpbmcoIjAgMTIzIDMyMSIpKSAjIC0+IFsnMCcsICcxMjMnLCAnMzIxJ10NCg0KICAgICAgICAgICAgIyB1c2UgYSBwYXJzZSBhY3Rpb24gdG8gaW5zZXJ0IHRoZSBwYXJzZSBsb2NhdGlvbiBpbiB0aGUgZnJvbnQgb2YgdGhlIHBhcnNlZCByZXN1bHRzDQogICAgICAgICAgICBkZWYgaW5zZXJ0X2xvY24obG9jbiwgdG9rZW5zKToNCiAgICAgICAgICAgICAgICB0b2tlbnMuaW5zZXJ0KDAsIGxvY24pDQogICAgICAgICAgICBwcmludChPbmVPck1vcmUoV29yZChudW1zKSkuYWRkUGFyc2VBY3Rpb24oaW5zZXJ0X2xvY24pLnBhcnNlU3RyaW5nKCIwIDEyMyAzMjEiKSkgIyAtPiBbMCwgJzAnLCAnMTIzJywgJzMyMSddDQogICAgICAgICIiIg0KICAgICAgICBzZWxmLl9fdG9rbGlzdC5pbnNlcnQoaW5kZXgsIGluc1N0cikNCiAgICAgICAgIyBmaXh1cCBpbmRpY2VzIGluIHRva2VuIGRpY3Rpb25hcnkNCiAgICAgICAgZm9yIG5hbWUsb2NjdXJyZW5jZXMgaW4gc2VsZi5fX3Rva2RpY3QuaXRlbXMoKToNCiAgICAgICAgICAgIGZvciBrLCAodmFsdWUsIHBvc2l0aW9uKSBpbiBlbnVtZXJhdGUob2NjdXJyZW5jZXMpOg0KICAgICAgICAgICAgICAgIG9jY3VycmVuY2VzW2tdID0gX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQodmFsdWUsIHBvc2l0aW9uICsgKHBvc2l0aW9uID4gaW5kZXgpKQ0KDQogICAgZGVmIGFwcGVuZCggc2VsZiwgaXRlbSApOg0KICAgICAgICAiIiINCiAgICAgICAgQWRkIHNpbmdsZSBlbGVtZW50IHRvIGVuZCBvZiBQYXJzZVJlc3VsdHMgbGlzdCBvZiBlbGVtZW50cy4NCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIHByaW50KE9uZU9yTW9yZShXb3JkKG51bXMpKS5wYXJzZVN0cmluZygiMCAxMjMgMzIxIikpICMgLT4gWycwJywgJzEyMycsICczMjEnXQ0KICAgICAgICAgICAgDQogICAgICAgICAgICAjIHVzZSBhIHBhcnNlIGFjdGlvbiB0byBjb21wdXRlIHRoZSBzdW0gb2YgdGhlIHBhcnNlZCBpbnRlZ2VycywgYW5kIGFkZCBpdCB0byB0aGUgZW5kDQogICAgICAgICAgICBkZWYgYXBwZW5kX3N1bSh0b2tlbnMpOg0KICAgICAgICAgICAgICAgIHRva2Vucy5hcHBlbmQoc3VtKG1hcChpbnQsIHRva2VucykpKQ0KICAgICAgICAgICAgcHJpbnQoT25lT3JNb3JlKFdvcmQobnVtcykpLmFkZFBhcnNlQWN0aW9uKGFwcGVuZF9zdW0pLnBhcnNlU3RyaW5nKCIwIDEyMyAzMjEiKSkgIyAtPiBbJzAnLCAnMTIzJywgJzMyMScsIDQ0NF0NCiAgICAgICAgIiIiDQogICAgICAgIHNlbGYuX190b2tsaXN0LmFwcGVuZChpdGVtKQ0KDQogICAgZGVmIGV4dGVuZCggc2VsZiwgaXRlbXNlcSApOg0KICAgICAgICAiIiINCiAgICAgICAgQWRkIHNlcXVlbmNlIG9mIGVsZW1lbnRzIHRvIGVuZCBvZiBQYXJzZVJlc3VsdHMgbGlzdCBvZiBlbGVtZW50cy4NCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIHBhdHQgPSBPbmVPck1vcmUoV29yZChhbHBoYXMpKQ0KICAgICAgICAgICAgDQogICAgICAgICAgICAjIHVzZSBhIHBhcnNlIGFjdGlvbiB0byBhcHBlbmQgdGhlIHJldmVyc2Ugb2YgdGhlIG1hdGNoZWQgc3RyaW5ncywgdG8gbWFrZSBhIHBhbGluZHJvbWUNCiAgICAgICAgICAgIGRlZiBtYWtlX3BhbGluZHJvbWUodG9rZW5zKToNCiAgICAgICAgICAgICAgICB0b2tlbnMuZXh0ZW5kKHJldmVyc2VkKFt0Wzo6LTFdIGZvciB0IGluIHRva2Vuc10pKQ0KICAgICAgICAgICAgICAgIHJldHVybiAnJy5qb2luKHRva2VucykNCiAgICAgICAgICAgIHByaW50KHBhdHQuYWRkUGFyc2VBY3Rpb24obWFrZV9wYWxpbmRyb21lKS5wYXJzZVN0cmluZygibHNrZGogc2Rsa2pmIGxrc2QiKSkgIyAtPiAnbHNrZGpzZGxramZsa3NkZHNrbGZqa2xkc2pka3NsJw0KICAgICAgICAiIiINCiAgICAgICAgaWYgaXNpbnN0YW5jZShpdGVtc2VxLCBQYXJzZVJlc3VsdHMpOg0KICAgICAgICAgICAgc2VsZiArPSBpdGVtc2VxDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzZWxmLl9fdG9rbGlzdC5leHRlbmQoaXRlbXNlcSkNCg0KICAgIGRlZiBjbGVhciggc2VsZiApOg0KICAgICAgICAiIiINCiAgICAgICAgQ2xlYXIgYWxsIGVsZW1lbnRzIGFuZCByZXN1bHRzIG5hbWVzLg0KICAgICAgICAiIiINCiAgICAgICAgZGVsIHNlbGYuX190b2tsaXN0WzpdDQogICAgICAgIHNlbGYuX190b2tkaWN0LmNsZWFyKCkNCg0KICAgIGRlZiBfX2dldGF0dHJfXyggc2VsZiwgbmFtZSApOg0KICAgICAgICB0cnk6DQogICAgICAgICAgICByZXR1cm4gc2VsZltuYW1lXQ0KICAgICAgICBleGNlcHQgS2V5RXJyb3I6DQogICAgICAgICAgICByZXR1cm4gIiINCiAgICAgICAgICAgIA0KICAgICAgICBpZiBuYW1lIGluIHNlbGYuX190b2tkaWN0Og0KICAgICAgICAgICAgaWYgbmFtZSBub3QgaW4gc2VsZi5fX2FjY3VtTmFtZXM6DQogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX190b2tkaWN0W25hbWVdWy0xXVswXQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICByZXR1cm4gUGFyc2VSZXN1bHRzKFsgdlswXSBmb3IgdiBpbiBzZWxmLl9fdG9rZGljdFtuYW1lXSBdKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmV0dXJuICIiDQoNCiAgICBkZWYgX19hZGRfXyggc2VsZiwgb3RoZXIgKToNCiAgICAgICAgcmV0ID0gc2VsZi5jb3B5KCkNCiAgICAgICAgcmV0ICs9IG90aGVyDQogICAgICAgIHJldHVybiByZXQNCg0KICAgIGRlZiBfX2lhZGRfXyggc2VsZiwgb3RoZXIgKToNCiAgICAgICAgaWYgb3RoZXIuX190b2tkaWN0Og0KICAgICAgICAgICAgb2Zmc2V0ID0gbGVuKHNlbGYuX190b2tsaXN0KQ0KICAgICAgICAgICAgYWRkb2Zmc2V0ID0gbGFtYmRhIGE6IG9mZnNldCBpZiBhPDAgZWxzZSBhK29mZnNldA0KICAgICAgICAgICAgb3RoZXJpdGVtcyA9IG90aGVyLl9fdG9rZGljdC5pdGVtcygpDQogICAgICAgICAgICBvdGhlcmRpY3RpdGVtcyA9IFsoaywgX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQodlswXSxhZGRvZmZzZXQodlsxXSkpICkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrLHZsaXN0KSBpbiBvdGhlcml0ZW1zIGZvciB2IGluIHZsaXN0XQ0KICAgICAgICAgICAgZm9yIGssdiBpbiBvdGhlcmRpY3RpdGVtczoNCiAgICAgICAgICAgICAgICBzZWxmW2tdID0gdg0KICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodlswXSxQYXJzZVJlc3VsdHMpOg0KICAgICAgICAgICAgICAgICAgICB2WzBdLl9fcGFyZW50ID0gd2tyZWYoc2VsZikNCiAgICAgICAgICAgIA0KICAgICAgICBzZWxmLl9fdG9rbGlzdCArPSBvdGhlci5fX3Rva2xpc3QNCiAgICAgICAgc2VsZi5fX2FjY3VtTmFtZXMudXBkYXRlKCBvdGhlci5fX2FjY3VtTmFtZXMgKQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIF9fcmFkZF9fKHNlbGYsIG90aGVyKToNCiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlcixpbnQpIGFuZCBvdGhlciA9PSAwOg0KICAgICAgICAgICAgIyB1c2VmdWwgZm9yIG1lcmdpbmcgbWFueSBQYXJzZVJlc3VsdHMgdXNpbmcgc3VtKCkgYnVpbHRpbg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29weSgpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICAjIHRoaXMgbWF5IHJhaXNlIGEgVHlwZUVycm9yIC0gc28gYmUgaXQNCiAgICAgICAgICAgIHJldHVybiBvdGhlciArIHNlbGYNCiAgICAgICAgDQogICAgZGVmIF9fcmVwcl9fKCBzZWxmICk6DQogICAgICAgIHJldHVybiAiKCVzLCAlcykiICUgKCByZXByKCBzZWxmLl9fdG9rbGlzdCApLCByZXByKCBzZWxmLl9fdG9rZGljdCApICkNCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIHJldHVybiAnWycgKyAnLCAnLmpvaW4oX3VzdHIoaSkgaWYgaXNpbnN0YW5jZShpLCBQYXJzZVJlc3VsdHMpIGVsc2UgcmVwcihpKSBmb3IgaSBpbiBzZWxmLl9fdG9rbGlzdCkgKyAnXScNCg0KICAgIGRlZiBfYXNTdHJpbmdMaXN0KCBzZWxmLCBzZXA9JycgKToNCiAgICAgICAgb3V0ID0gW10NCiAgICAgICAgZm9yIGl0ZW0gaW4gc2VsZi5fX3Rva2xpc3Q6DQogICAgICAgICAgICBpZiBvdXQgYW5kIHNlcDoNCiAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKHNlcCkNCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoIGl0ZW0sIFBhcnNlUmVzdWx0cyApOg0KICAgICAgICAgICAgICAgIG91dCArPSBpdGVtLl9hc1N0cmluZ0xpc3QoKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCBfdXN0cihpdGVtKSApDQogICAgICAgIHJldHVybiBvdXQNCg0KICAgIGRlZiBhc0xpc3QoIHNlbGYgKToNCiAgICAgICAgIiIiDQogICAgICAgIFJldHVybnMgdGhlIHBhcnNlIHJlc3VsdHMgYXMgYSBuZXN0ZWQgbGlzdCBvZiBtYXRjaGluZyB0b2tlbnMsIGFsbCBjb252ZXJ0ZWQgdG8gc3RyaW5ncy4NCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIHBhdHQgPSBPbmVPck1vcmUoV29yZChhbHBoYXMpKQ0KICAgICAgICAgICAgcmVzdWx0ID0gcGF0dC5wYXJzZVN0cmluZygic2xka2ogbHNka2ogc2xka2oiKQ0KICAgICAgICAgICAgIyBldmVuIHRob3VnaCB0aGUgcmVzdWx0IHByaW50cyBpbiBzdHJpbmctbGlrZSBmb3JtLCBpdCBpcyBhY3R1YWxseSBhIHB5cGFyc2luZyBQYXJzZVJlc3VsdHMNCiAgICAgICAgICAgIHByaW50KHR5cGUocmVzdWx0KSwgcmVzdWx0KSAjIC0+IDxjbGFzcyAncHlwYXJzaW5nLlBhcnNlUmVzdWx0cyc+IFsnc2xka2onLCAnbHNka2onLCAnc2xka2onXQ0KICAgICAgICAgICAgDQogICAgICAgICAgICAjIFVzZSBhc0xpc3QoKSB0byBjcmVhdGUgYW4gYWN0dWFsIGxpc3QNCiAgICAgICAgICAgIHJlc3VsdF9saXN0ID0gcmVzdWx0LmFzTGlzdCgpDQogICAgICAgICAgICBwcmludCh0eXBlKHJlc3VsdF9saXN0KSwgcmVzdWx0X2xpc3QpICMgLT4gPGNsYXNzICdsaXN0Jz4gWydzbGRraicsICdsc2RraicsICdzbGRraiddDQogICAgICAgICIiIg0KICAgICAgICByZXR1cm4gW3Jlcy5hc0xpc3QoKSBpZiBpc2luc3RhbmNlKHJlcyxQYXJzZVJlc3VsdHMpIGVsc2UgcmVzIGZvciByZXMgaW4gc2VsZi5fX3Rva2xpc3RdDQoNCiAgICBkZWYgYXNEaWN0KCBzZWxmICk6DQogICAgICAgICIiIg0KICAgICAgICBSZXR1cm5zIHRoZSBuYW1lZCBwYXJzZSByZXN1bHRzIGFzIGEgbmVzdGVkIGRpY3Rpb25hcnkuDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKQ0KICAgICAgICAgICAgZGF0ZV9zdHIgPSBpbnRlZ2VyKCJ5ZWFyIikgKyAnLycgKyBpbnRlZ2VyKCJtb250aCIpICsgJy8nICsgaW50ZWdlcigiZGF5IikNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgcmVzdWx0ID0gZGF0ZV9zdHIucGFyc2VTdHJpbmcoJzEyLzMxLzE5OTknKQ0KICAgICAgICAgICAgcHJpbnQodHlwZShyZXN1bHQpLCByZXByKHJlc3VsdCkpICMgLT4gPGNsYXNzICdweXBhcnNpbmcuUGFyc2VSZXN1bHRzJz4gKFsnMTInLCAnLycsICczMScsICcvJywgJzE5OTknXSwgeydkYXknOiBbKCcxOTk5JywgNCldLCAneWVhcic6IFsoJzEyJywgMCldLCAnbW9udGgnOiBbKCczMScsIDIpXX0pDQogICAgICAgICAgICANCiAgICAgICAgICAgIHJlc3VsdF9kaWN0ID0gcmVzdWx0LmFzRGljdCgpDQogICAgICAgICAgICBwcmludCh0eXBlKHJlc3VsdF9kaWN0KSwgcmVwcihyZXN1bHRfZGljdCkpICMgLT4gPGNsYXNzICdkaWN0Jz4geydkYXknOiAnMTk5OScsICd5ZWFyJzogJzEyJywgJ21vbnRoJzogJzMxJ30NCg0KICAgICAgICAgICAgIyBldmVuIHRob3VnaCBhIFBhcnNlUmVzdWx0cyBzdXBwb3J0cyBkaWN0LWxpa2UgYWNjZXNzLCBzb21ldGltZSB5b3UganVzdCBuZWVkIHRvIGhhdmUgYSBkaWN0DQogICAgICAgICAgICBpbXBvcnQganNvbg0KICAgICAgICAgICAgcHJpbnQoanNvbi5kdW1wcyhyZXN1bHQpKSAjIC0+IEV4Y2VwdGlvbjogVHlwZUVycm9yOiAuLi4gaXMgbm90IEpTT04gc2VyaWFsaXphYmxlDQogICAgICAgICAgICBwcmludChqc29uLmR1bXBzKHJlc3VsdC5hc0RpY3QoKSkpICMgLT4geyJtb250aCI6ICIzMSIsICJkYXkiOiAiMTk5OSIsICJ5ZWFyIjogIjEyIn0NCiAgICAgICAgIiIiDQogICAgICAgIGlmIFBZXzM6DQogICAgICAgICAgICBpdGVtX2ZuID0gc2VsZi5pdGVtcw0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgaXRlbV9mbiA9IHNlbGYuaXRlcml0ZW1zDQogICAgICAgICAgICANCiAgICAgICAgZGVmIHRvSXRlbShvYmopOg0KICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShvYmosIFBhcnNlUmVzdWx0cyk6DQogICAgICAgICAgICAgICAgaWYgb2JqLmhhc2tleXMoKToNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iai5hc0RpY3QoKQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBbdG9JdGVtKHYpIGZvciB2IGluIG9ial0NCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcmV0dXJuIG9iag0KICAgICAgICAgICAgICAgIA0KICAgICAgICByZXR1cm4gZGljdCgoayx0b0l0ZW0odikpIGZvciBrLHYgaW4gaXRlbV9mbigpKQ0KDQogICAgZGVmIGNvcHkoIHNlbGYgKToNCiAgICAgICAgIiIiDQogICAgICAgIFJldHVybnMgYSBuZXcgY29weSBvZiBhIEN7UGFyc2VSZXN1bHRzfSBvYmplY3QuDQogICAgICAgICIiIg0KICAgICAgICByZXQgPSBQYXJzZVJlc3VsdHMoIHNlbGYuX190b2tsaXN0ICkNCiAgICAgICAgcmV0Ll9fdG9rZGljdCA9IHNlbGYuX190b2tkaWN0LmNvcHkoKQ0KICAgICAgICByZXQuX19wYXJlbnQgPSBzZWxmLl9fcGFyZW50DQogICAgICAgIHJldC5fX2FjY3VtTmFtZXMudXBkYXRlKCBzZWxmLl9fYWNjdW1OYW1lcyApDQogICAgICAgIHJldC5fX25hbWUgPSBzZWxmLl9fbmFtZQ0KICAgICAgICByZXR1cm4gcmV0DQoNCiAgICBkZWYgYXNYTUwoIHNlbGYsIGRvY3RhZz1Ob25lLCBuYW1lZEl0ZW1zT25seT1GYWxzZSwgaW5kZW50PSIiLCBmb3JtYXR0ZWQ9VHJ1ZSApOg0KICAgICAgICAiIiINCiAgICAgICAgKERlcHJlY2F0ZWQpIFJldHVybnMgdGhlIHBhcnNlIHJlc3VsdHMgYXMgWE1MLiBUYWdzIGFyZSBjcmVhdGVkIGZvciB0b2tlbnMgYW5kIGxpc3RzIHRoYXQgaGF2ZSBkZWZpbmVkIHJlc3VsdHMgbmFtZXMuDQogICAgICAgICIiIg0KICAgICAgICBubCA9ICJcbiINCiAgICAgICAgb3V0ID0gW10NCiAgICAgICAgbmFtZWRJdGVtcyA9IGRpY3QoKHZbMV0saykgZm9yIChrLHZsaXN0KSBpbiBzZWxmLl9fdG9rZGljdC5pdGVtcygpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdiBpbiB2bGlzdCkNCiAgICAgICAgbmV4dExldmVsSW5kZW50ID0gaW5kZW50ICsgIiAgIg0KDQogICAgICAgICMgY29sbGFwc2Ugb3V0IGluZGVudHMgaWYgZm9ybWF0dGluZyBpcyBub3QgZGVzaXJlZA0KICAgICAgICBpZiBub3QgZm9ybWF0dGVkOg0KICAgICAgICAgICAgaW5kZW50ID0gIiINCiAgICAgICAgICAgIG5leHRMZXZlbEluZGVudCA9ICIiDQogICAgICAgICAgICBubCA9ICIiDQoNCiAgICAgICAgc2VsZlRhZyA9IE5vbmUNCiAgICAgICAgaWYgZG9jdGFnIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgc2VsZlRhZyA9IGRvY3RhZw0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgaWYgc2VsZi5fX25hbWU6DQogICAgICAgICAgICAgICAgc2VsZlRhZyA9IHNlbGYuX19uYW1lDQoNCiAgICAgICAgaWYgbm90IHNlbGZUYWc6DQogICAgICAgICAgICBpZiBuYW1lZEl0ZW1zT25seToNCiAgICAgICAgICAgICAgICByZXR1cm4gIiINCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgc2VsZlRhZyA9ICJJVEVNIg0KDQogICAgICAgIG91dCArPSBbIG5sLCBpbmRlbnQsICI8Iiwgc2VsZlRhZywgIj4iIF0NCg0KICAgICAgICBmb3IgaSxyZXMgaW4gZW51bWVyYXRlKHNlbGYuX190b2tsaXN0KToNCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UocmVzLFBhcnNlUmVzdWx0cyk6DQogICAgICAgICAgICAgICAgaWYgaSBpbiBuYW1lZEl0ZW1zOg0KICAgICAgICAgICAgICAgICAgICBvdXQgKz0gWyByZXMuYXNYTUwobmFtZWRJdGVtc1tpXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lZEl0ZW1zT25seSBhbmQgZG9jdGFnIGlzIE5vbmUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dExldmVsSW5kZW50LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlZCldDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgb3V0ICs9IFsgcmVzLmFzWE1MKE5vbmUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZWRJdGVtc09ubHkgYW5kIGRvY3RhZyBpcyBOb25lLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRMZXZlbEluZGVudCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWQpXQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAjIGluZGl2aWR1YWwgdG9rZW4sIHNlZSBpZiB0aGVyZSBpcyBhIG5hbWUgZm9yIGl0DQogICAgICAgICAgICAgICAgcmVzVGFnID0gTm9uZQ0KICAgICAgICAgICAgICAgIGlmIGkgaW4gbmFtZWRJdGVtczoNCiAgICAgICAgICAgICAgICAgICAgcmVzVGFnID0gbmFtZWRJdGVtc1tpXQ0KICAgICAgICAgICAgICAgIGlmIG5vdCByZXNUYWc6DQogICAgICAgICAgICAgICAgICAgIGlmIG5hbWVkSXRlbXNPbmx5Og0KICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUNCiAgICAgICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgICAgIHJlc1RhZyA9ICJJVEVNIg0KICAgICAgICAgICAgICAgIHhtbEJvZHlUZXh0ID0gX3htbF9lc2NhcGUoX3VzdHIocmVzKSkNCiAgICAgICAgICAgICAgICBvdXQgKz0gWyBubCwgbmV4dExldmVsSW5kZW50LCAiPCIsIHJlc1RhZywgIj4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sQm9keVRleHQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC8iLCByZXNUYWcsICI+IiBdDQoNCiAgICAgICAgb3V0ICs9IFsgbmwsIGluZGVudCwgIjwvIiwgc2VsZlRhZywgIj4iIF0NCiAgICAgICAgcmV0dXJuICIiLmpvaW4ob3V0KQ0KDQogICAgZGVmIF9fbG9va3VwKHNlbGYsc3ViKToNCiAgICAgICAgZm9yIGssdmxpc3QgaW4gc2VsZi5fX3Rva2RpY3QuaXRlbXMoKToNCiAgICAgICAgICAgIGZvciB2LGxvYyBpbiB2bGlzdDoNCiAgICAgICAgICAgICAgICBpZiBzdWIgaXMgdjoNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGsNCiAgICAgICAgcmV0dXJuIE5vbmUNCg0KICAgIGRlZiBnZXROYW1lKHNlbGYpOg0KICAgICAgICByIiIiDQogICAgICAgIFJldHVybnMgdGhlIHJlc3VsdHMgbmFtZSBmb3IgdGhpcyB0b2tlbiBleHByZXNzaW9uLiBVc2VmdWwgd2hlbiBzZXZlcmFsIA0KICAgICAgICBkaWZmZXJlbnQgZXhwcmVzc2lvbnMgbWlnaHQgbWF0Y2ggYXQgYSBwYXJ0aWN1bGFyIGxvY2F0aW9uLg0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykNCiAgICAgICAgICAgIHNzbl9leHByID0gUmVnZXgociJcZFxkXGQtXGRcZC1cZFxkXGRcZCIpDQogICAgICAgICAgICBob3VzZV9udW1iZXJfZXhwciA9IFN1cHByZXNzKCcjJykgKyBXb3JkKG51bXMsIGFscGhhbnVtcykNCiAgICAgICAgICAgIHVzZXJfZGF0YSA9IChHcm91cChob3VzZV9udW1iZXJfZXhwcikoImhvdXNlX251bWJlciIpIA0KICAgICAgICAgICAgICAgICAgICAgICAgfCBHcm91cChzc25fZXhwcikoInNzbiIpDQogICAgICAgICAgICAgICAgICAgICAgICB8IEdyb3VwKGludGVnZXIpKCJhZ2UiKSkNCiAgICAgICAgICAgIHVzZXJfaW5mbyA9IE9uZU9yTW9yZSh1c2VyX2RhdGEpDQogICAgICAgICAgICANCiAgICAgICAgICAgIHJlc3VsdCA9IHVzZXJfaW5mby5wYXJzZVN0cmluZygiMjIgMTExLTIyLTMzMzMgIzIyMUIiKQ0KICAgICAgICAgICAgZm9yIGl0ZW0gaW4gcmVzdWx0Og0KICAgICAgICAgICAgICAgIHByaW50KGl0ZW0uZ2V0TmFtZSgpLCAnOicsIGl0ZW1bMF0pDQogICAgICAgIHByaW50czo6DQogICAgICAgICAgICBhZ2UgOiAyMg0KICAgICAgICAgICAgc3NuIDogMTExLTIyLTMzMzMNCiAgICAgICAgICAgIGhvdXNlX251bWJlciA6IDIyMUINCiAgICAgICAgIiIiDQogICAgICAgIGlmIHNlbGYuX19uYW1lOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19uYW1lDQogICAgICAgIGVsaWYgc2VsZi5fX3BhcmVudDoNCiAgICAgICAgICAgIHBhciA9IHNlbGYuX19wYXJlbnQoKQ0KICAgICAgICAgICAgaWYgcGFyOg0KICAgICAgICAgICAgICAgIHJldHVybiBwYXIuX19sb29rdXAoc2VsZikNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUNCiAgICAgICAgZWxpZiAobGVuKHNlbGYpID09IDEgYW5kDQogICAgICAgICAgICAgICBsZW4oc2VsZi5fX3Rva2RpY3QpID09IDEgYW5kDQogICAgICAgICAgICAgICBuZXh0KGl0ZXIoc2VsZi5fX3Rva2RpY3QudmFsdWVzKCkpKVswXVsxXSBpbiAoMCwtMSkpOg0KICAgICAgICAgICAgcmV0dXJuIG5leHQoaXRlcihzZWxmLl9fdG9rZGljdC5rZXlzKCkpKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmV0dXJuIE5vbmUNCg0KICAgIGRlZiBkdW1wKHNlbGYsIGluZGVudD0nJywgZGVwdGg9MCwgZnVsbD1UcnVlKToNCiAgICAgICAgIiIiDQogICAgICAgIERpYWdub3N0aWMgbWV0aG9kIGZvciBsaXN0aW5nIG91dCB0aGUgY29udGVudHMgb2YgYSBDe1BhcnNlUmVzdWx0c30uDQogICAgICAgIEFjY2VwdHMgYW4gb3B0aW9uYWwgQ3tpbmRlbnR9IGFyZ3VtZW50IHNvIHRoYXQgdGhpcyBzdHJpbmcgY2FuIGJlIGVtYmVkZGVkDQogICAgICAgIGluIGEgbmVzdGVkIGRpc3BsYXkgb2Ygb3RoZXIgZGF0YS4NCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpDQogICAgICAgICAgICBkYXRlX3N0ciA9IGludGVnZXIoInllYXIiKSArICcvJyArIGludGVnZXIoIm1vbnRoIikgKyAnLycgKyBpbnRlZ2VyKCJkYXkiKQ0KICAgICAgICAgICAgDQogICAgICAgICAgICByZXN1bHQgPSBkYXRlX3N0ci5wYXJzZVN0cmluZygnMTIvMzEvMTk5OScpDQogICAgICAgICAgICBwcmludChyZXN1bHQuZHVtcCgpKQ0KICAgICAgICBwcmludHM6Og0KICAgICAgICAgICAgWycxMicsICcvJywgJzMxJywgJy8nLCAnMTk5OSddDQogICAgICAgICAgICAtIGRheTogMTk5OQ0KICAgICAgICAgICAgLSBtb250aDogMzENCiAgICAgICAgICAgIC0geWVhcjogMTINCiAgICAgICAgIiIiDQogICAgICAgIG91dCA9IFtdDQogICAgICAgIE5MID0gJ1xuJw0KICAgICAgICBvdXQuYXBwZW5kKCBpbmRlbnQrX3VzdHIoc2VsZi5hc0xpc3QoKSkgKQ0KICAgICAgICBpZiBmdWxsOg0KICAgICAgICAgICAgaWYgc2VsZi5oYXNrZXlzKCk6DQogICAgICAgICAgICAgICAgaXRlbXMgPSBzb3J0ZWQoKHN0cihrKSwgdikgZm9yIGssdiBpbiBzZWxmLml0ZW1zKCkpDQogICAgICAgICAgICAgICAgZm9yIGssdiBpbiBpdGVtczoNCiAgICAgICAgICAgICAgICAgICAgaWYgb3V0Og0KICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZChOTCkNCiAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCggIiVzJXMtICVzOiAiICUgKGluZGVudCwoJyAgJypkZXB0aCksIGspICkNCiAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2LFBhcnNlUmVzdWx0cyk6DQogICAgICAgICAgICAgICAgICAgICAgICBpZiB2Og0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoIHYuZHVtcChpbmRlbnQsZGVwdGgrMSkgKQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKF91c3RyKHYpKQ0KICAgICAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZChyZXByKHYpKQ0KICAgICAgICAgICAgZWxpZiBhbnkoaXNpbnN0YW5jZSh2dixQYXJzZVJlc3VsdHMpIGZvciB2diBpbiBzZWxmKToNCiAgICAgICAgICAgICAgICB2ID0gc2VsZg0KICAgICAgICAgICAgICAgIGZvciBpLHZ2IGluIGVudW1lcmF0ZSh2KToNCiAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2dixQYXJzZVJlc3VsdHMpOg0KICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCgiXG4lcyVzWyVkXTpcbiVzJXMlcyIgJSAoaW5kZW50LCgnICAnKihkZXB0aCkpLGksaW5kZW50LCgnICAnKihkZXB0aCsxKSksdnYuZHVtcChpbmRlbnQsZGVwdGgrMSkgKSkNCiAgICAgICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoIlxuJXMlc1slZF06XG4lcyVzJXMiICUgKGluZGVudCwoJyAgJyooZGVwdGgpKSxpLGluZGVudCwoJyAgJyooZGVwdGgrMSkpLF91c3RyKHZ2KSkpDQogICAgICAgICAgICANCiAgICAgICAgcmV0dXJuICIiLmpvaW4ob3V0KQ0KDQogICAgZGVmIHBwcmludChzZWxmLCAqYXJncywgKiprd2FyZ3MpOg0KICAgICAgICAiIiINCiAgICAgICAgUHJldHR5LXByaW50ZXIgZm9yIHBhcnNlZCByZXN1bHRzIGFzIGEgbGlzdCwgdXNpbmcgdGhlIEN7cHByaW50fSBtb2R1bGUuDQogICAgICAgIEFjY2VwdHMgYWRkaXRpb25hbCBwb3NpdGlvbmFsIG9yIGtleXdvcmQgYXJncyBhcyBkZWZpbmVkIGZvciB0aGUgDQogICAgICAgIEN7cHByaW50LnBwcmludH0gbWV0aG9kLiAoVXtodHRwOi8vZG9jcy5weXRob24ub3JnLzMvbGlicmFyeS9wcHJpbnQuaHRtbCNwcHJpbnQucHByaW50fSkNCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIGlkZW50ID0gV29yZChhbHBoYXMsIGFscGhhbnVtcykNCiAgICAgICAgICAgIG51bSA9IFdvcmQobnVtcykNCiAgICAgICAgICAgIGZ1bmMgPSBGb3J3YXJkKCkNCiAgICAgICAgICAgIHRlcm0gPSBpZGVudCB8IG51bSB8IEdyb3VwKCcoJyArIGZ1bmMgKyAnKScpDQogICAgICAgICAgICBmdW5jIDw8PSBpZGVudCArIEdyb3VwKE9wdGlvbmFsKGRlbGltaXRlZExpc3QodGVybSkpKQ0KICAgICAgICAgICAgcmVzdWx0ID0gZnVuYy5wYXJzZVN0cmluZygiZm5hIGEsYiwoZm5iIGMsZCwyMDApLDEwMCIpDQogICAgICAgICAgICByZXN1bHQucHByaW50KHdpZHRoPTQwKQ0KICAgICAgICBwcmludHM6Og0KICAgICAgICAgICAgWydmbmEnLA0KICAgICAgICAgICAgIFsnYScsDQogICAgICAgICAgICAgICdiJywNCiAgICAgICAgICAgICAgWycoJywgJ2ZuYicsIFsnYycsICdkJywgJzIwMCddLCAnKSddLA0KICAgICAgICAgICAgICAnMTAwJ11dDQogICAgICAgICIiIg0KICAgICAgICBwcHJpbnQucHByaW50KHNlbGYuYXNMaXN0KCksICphcmdzLCAqKmt3YXJncykNCg0KICAgICMgYWRkIHN1cHBvcnQgZm9yIHBpY2tsZSBwcm90b2NvbA0KICAgIGRlZiBfX2dldHN0YXRlX18oc2VsZik6DQogICAgICAgIHJldHVybiAoIHNlbGYuX190b2tsaXN0LA0KICAgICAgICAgICAgICAgICAoIHNlbGYuX190b2tkaWN0LmNvcHkoKSwNCiAgICAgICAgICAgICAgICAgICBzZWxmLl9fcGFyZW50IGlzIG5vdCBOb25lIGFuZCBzZWxmLl9fcGFyZW50KCkgb3IgTm9uZSwNCiAgICAgICAgICAgICAgICAgICBzZWxmLl9fYWNjdW1OYW1lcywNCiAgICAgICAgICAgICAgICAgICBzZWxmLl9fbmFtZSApICkNCg0KICAgIGRlZiBfX3NldHN0YXRlX18oc2VsZixzdGF0ZSk6DQogICAgICAgIHNlbGYuX190b2tsaXN0ID0gc3RhdGVbMF0NCiAgICAgICAgKHNlbGYuX190b2tkaWN0LA0KICAgICAgICAgcGFyLA0KICAgICAgICAgaW5BY2N1bU5hbWVzLA0KICAgICAgICAgc2VsZi5fX25hbWUpID0gc3RhdGVbMV0NCiAgICAgICAgc2VsZi5fX2FjY3VtTmFtZXMgPSB7fQ0KICAgICAgICBzZWxmLl9fYWNjdW1OYW1lcy51cGRhdGUoaW5BY2N1bU5hbWVzKQ0KICAgICAgICBpZiBwYXIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICBzZWxmLl9fcGFyZW50ID0gd2tyZWYocGFyKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc2VsZi5fX3BhcmVudCA9IE5vbmUNCg0KICAgIGRlZiBfX2dldG5ld2FyZ3NfXyhzZWxmKToNCiAgICAgICAgcmV0dXJuIHNlbGYuX190b2tsaXN0LCBzZWxmLl9fbmFtZSwgc2VsZi5fX2FzTGlzdCwgc2VsZi5fX21vZGFsDQoNCiAgICBkZWYgX19kaXJfXyhzZWxmKToNCiAgICAgICAgcmV0dXJuIChkaXIodHlwZShzZWxmKSkgKyBsaXN0KHNlbGYua2V5cygpKSkNCg0KTXV0YWJsZU1hcHBpbmcucmVnaXN0ZXIoUGFyc2VSZXN1bHRzKQ0KDQpkZWYgY29sIChsb2Msc3RyZyk6DQogICAgIiIiUmV0dXJucyBjdXJyZW50IGNvbHVtbiB3aXRoaW4gYSBzdHJpbmcsIGNvdW50aW5nIG5ld2xpbmVzIGFzIGxpbmUgc2VwYXJhdG9ycy4NCiAgIFRoZSBmaXJzdCBjb2x1bW4gaXMgbnVtYmVyIDEuDQoNCiAgIE5vdGU6IHRoZSBkZWZhdWx0IHBhcnNpbmcgYmVoYXZpb3IgaXMgdG8gZXhwYW5kIHRhYnMgaW4gdGhlIGlucHV0IHN0cmluZw0KICAgYmVmb3JlIHN0YXJ0aW5nIHRoZSBwYXJzaW5nIHByb2Nlc3MuICBTZWUgTHtJe1BhcnNlckVsZW1lbnQucGFyc2VTdHJpbmd9PFBhcnNlckVsZW1lbnQucGFyc2VTdHJpbmc+fSBmb3IgbW9yZSBpbmZvcm1hdGlvbg0KICAgb24gcGFyc2luZyBzdHJpbmdzIGNvbnRhaW5pbmcgQ3s8VEFCPn1zLCBhbmQgc3VnZ2VzdGVkIG1ldGhvZHMgdG8gbWFpbnRhaW4gYQ0KICAgY29uc2lzdGVudCB2aWV3IG9mIHRoZSBwYXJzZWQgc3RyaW5nLCB0aGUgcGFyc2UgbG9jYXRpb24sIGFuZCBsaW5lIGFuZCBjb2x1bW4NCiAgIHBvc2l0aW9ucyB3aXRoaW4gdGhlIHBhcnNlZCBzdHJpbmcuDQogICAiIiINCiAgICBzID0gc3RyZw0KICAgIHJldHVybiAxIGlmIDA8bG9jPGxlbihzKSBhbmQgc1tsb2MtMV0gPT0gJ1xuJyBlbHNlIGxvYyAtIHMucmZpbmQoIlxuIiwgMCwgbG9jKQ0KDQpkZWYgbGluZW5vKGxvYyxzdHJnKToNCiAgICAiIiJSZXR1cm5zIGN1cnJlbnQgbGluZSBudW1iZXIgd2l0aGluIGEgc3RyaW5nLCBjb3VudGluZyBuZXdsaW5lcyBhcyBsaW5lIHNlcGFyYXRvcnMuDQogICBUaGUgZmlyc3QgbGluZSBpcyBudW1iZXIgMS4NCg0KICAgTm90ZTogdGhlIGRlZmF1bHQgcGFyc2luZyBiZWhhdmlvciBpcyB0byBleHBhbmQgdGFicyBpbiB0aGUgaW5wdXQgc3RyaW5nDQogICBiZWZvcmUgc3RhcnRpbmcgdGhlIHBhcnNpbmcgcHJvY2Vzcy4gIFNlZSBMe0l7UGFyc2VyRWxlbWVudC5wYXJzZVN0cmluZ308UGFyc2VyRWxlbWVudC5wYXJzZVN0cmluZz59IGZvciBtb3JlIGluZm9ybWF0aW9uDQogICBvbiBwYXJzaW5nIHN0cmluZ3MgY29udGFpbmluZyBDezxUQUI+fXMsIGFuZCBzdWdnZXN0ZWQgbWV0aG9kcyB0byBtYWludGFpbiBhDQogICBjb25zaXN0ZW50IHZpZXcgb2YgdGhlIHBhcnNlZCBzdHJpbmcsIHRoZSBwYXJzZSBsb2NhdGlvbiwgYW5kIGxpbmUgYW5kIGNvbHVtbg0KICAgcG9zaXRpb25zIHdpdGhpbiB0aGUgcGFyc2VkIHN0cmluZy4NCiAgICIiIg0KICAgIHJldHVybiBzdHJnLmNvdW50KCJcbiIsMCxsb2MpICsgMQ0KDQpkZWYgbGluZSggbG9jLCBzdHJnICk6DQogICAgIiIiUmV0dXJucyB0aGUgbGluZSBvZiB0ZXh0IGNvbnRhaW5pbmcgbG9jIHdpdGhpbiBhIHN0cmluZywgY291bnRpbmcgbmV3bGluZXMgYXMgbGluZSBzZXBhcmF0b3JzLg0KICAgICAgICIiIg0KICAgIGxhc3RDUiA9IHN0cmcucmZpbmQoIlxuIiwgMCwgbG9jKQ0KICAgIG5leHRDUiA9IHN0cmcuZmluZCgiXG4iLCBsb2MpDQogICAgaWYgbmV4dENSID49IDA6DQogICAgICAgIHJldHVybiBzdHJnW2xhc3RDUisxOm5leHRDUl0NCiAgICBlbHNlOg0KICAgICAgICByZXR1cm4gc3RyZ1tsYXN0Q1IrMTpdDQoNCmRlZiBfZGVmYXVsdFN0YXJ0RGVidWdBY3Rpb24oIGluc3RyaW5nLCBsb2MsIGV4cHIgKToNCiAgICBwcmludCAoKCJNYXRjaCAiICsgX3VzdHIoZXhwcikgKyAiIGF0IGxvYyAiICsgX3VzdHIobG9jKSArICIoJWQsJWQpIiAlICggbGluZW5vKGxvYyxpbnN0cmluZyksIGNvbChsb2MsaW5zdHJpbmcpICkpKQ0KDQpkZWYgX2RlZmF1bHRTdWNjZXNzRGVidWdBY3Rpb24oIGluc3RyaW5nLCBzdGFydGxvYywgZW5kbG9jLCBleHByLCB0b2tzICk6DQogICAgcHJpbnQgKCJNYXRjaGVkICIgKyBfdXN0cihleHByKSArICIgLT4gIiArIHN0cih0b2tzLmFzTGlzdCgpKSkNCg0KZGVmIF9kZWZhdWx0RXhjZXB0aW9uRGVidWdBY3Rpb24oIGluc3RyaW5nLCBsb2MsIGV4cHIsIGV4YyApOg0KICAgIHByaW50ICgiRXhjZXB0aW9uIHJhaXNlZDoiICsgX3VzdHIoZXhjKSkNCg0KZGVmIG51bGxEZWJ1Z0FjdGlvbigqYXJncyk6DQogICAgIiIiJ0RvLW5vdGhpbmcnIGRlYnVnIGFjdGlvbiwgdG8gc3VwcHJlc3MgZGVidWdnaW5nIG91dHB1dCBkdXJpbmcgcGFyc2luZy4iIiINCiAgICBwYXNzDQoNCiMgT25seSB3b3JrcyBvbiBQeXRob24gMy54IC0gbm9ubG9jYWwgaXMgdG94aWMgdG8gUHl0aG9uIDIgaW5zdGFsbHMNCiN+ICdkZWNvcmF0b3IgdG8gdHJpbSBmdW5jdGlvbiBjYWxscyB0byBtYXRjaCB0aGUgYXJpdHkgb2YgdGhlIHRhcmdldCcNCiN+IGRlZiBfdHJpbV9hcml0eShmdW5jLCBtYXhhcmdzPTMpOg0KICAgICN+IGlmIGZ1bmMgaW4gc2luZ2xlQXJnQnVpbHRpbnM6DQogICAgICAgICN+IHJldHVybiBsYW1iZGEgcyxsLHQ6IGZ1bmModCkNCiAgICAjfiBsaW1pdCA9IDANCiAgICAjfiBmb3VuZEFyaXR5ID0gRmFsc2UNCiAgICAjfiBkZWYgd3JhcHBlcigqYXJncyk6DQogICAgICAgICN+IG5vbmxvY2FsIGxpbWl0LGZvdW5kQXJpdHkNCiAgICAgICAgI34gd2hpbGUgMToNCiAgICAgICAgICAgICN+IHRyeToNCiAgICAgICAgICAgICAgICAjfiByZXQgPSBmdW5jKCphcmdzW2xpbWl0Ol0pDQogICAgICAgICAgICAgICAgI34gZm91bmRBcml0eSA9IFRydWUNCiAgICAgICAgICAgICAgICAjfiByZXR1cm4gcmV0DQogICAgICAgICAgICAjfiBleGNlcHQgVHlwZUVycm9yOg0KICAgICAgICAgICAgICAgICN+IGlmIGxpbWl0ID09IG1heGFyZ3Mgb3IgZm91bmRBcml0eToNCiAgICAgICAgICAgICAgICAgICAgI34gcmFpc2UNCiAgICAgICAgICAgICAgICAjfiBsaW1pdCArPSAxDQogICAgICAgICAgICAgICAgI34gY29udGludWUNCiAgICAjfiByZXR1cm4gd3JhcHBlcg0KDQojIHRoaXMgdmVyc2lvbiBpcyBQeXRob24gMi54LTMueCBjcm9zcy1jb21wYXRpYmxlDQonZGVjb3JhdG9yIHRvIHRyaW0gZnVuY3Rpb24gY2FsbHMgdG8gbWF0Y2ggdGhlIGFyaXR5IG9mIHRoZSB0YXJnZXQnDQpkZWYgX3RyaW1fYXJpdHkoZnVuYywgbWF4YXJncz0yKToNCiAgICBpZiBmdW5jIGluIHNpbmdsZUFyZ0J1aWx0aW5zOg0KICAgICAgICByZXR1cm4gbGFtYmRhIHMsbCx0OiBmdW5jKHQpDQogICAgbGltaXQgPSBbMF0NCiAgICBmb3VuZEFyaXR5ID0gW0ZhbHNlXQ0KICAgIA0KICAgICMgdHJhY2ViYWNrIHJldHVybiBkYXRhIHN0cnVjdHVyZSBjaGFuZ2VkIGluIFB5My41IC0gbm9ybWFsaXplIGJhY2sgdG8gcGxhaW4gdHVwbGVzDQogICAgaWYgc3lzdGVtX3ZlcnNpb25bOjJdID49ICgzLDUpOg0KICAgICAgICBkZWYgZXh0cmFjdF9zdGFjayhsaW1pdD0wKToNCiAgICAgICAgICAgICMgc3BlY2lhbCBoYW5kbGluZyBmb3IgUHl0aG9uIDMuNS4wIC0gZXh0cmEgZGVlcCBjYWxsIHN0YWNrIGJ5IDENCiAgICAgICAgICAgIG9mZnNldCA9IC0zIGlmIHN5c3RlbV92ZXJzaW9uID09ICgzLDUsMCkgZWxzZSAtMg0KICAgICAgICAgICAgZnJhbWVfc3VtbWFyeSA9IHRyYWNlYmFjay5leHRyYWN0X3N0YWNrKGxpbWl0PS1vZmZzZXQrbGltaXQtMSlbb2Zmc2V0XQ0KICAgICAgICAgICAgcmV0dXJuIFtmcmFtZV9zdW1tYXJ5WzoyXV0NCiAgICAgICAgZGVmIGV4dHJhY3RfdGIodGIsIGxpbWl0PTApOg0KICAgICAgICAgICAgZnJhbWVzID0gdHJhY2ViYWNrLmV4dHJhY3RfdGIodGIsIGxpbWl0PWxpbWl0KQ0KICAgICAgICAgICAgZnJhbWVfc3VtbWFyeSA9IGZyYW1lc1stMV0NCiAgICAgICAgICAgIHJldHVybiBbZnJhbWVfc3VtbWFyeVs6Ml1dDQogICAgZWxzZToNCiAgICAgICAgZXh0cmFjdF9zdGFjayA9IHRyYWNlYmFjay5leHRyYWN0X3N0YWNrDQogICAgICAgIGV4dHJhY3RfdGIgPSB0cmFjZWJhY2suZXh0cmFjdF90Yg0KICAgIA0KICAgICMgc3ludGhlc2l6ZSB3aGF0IHdvdWxkIGJlIHJldHVybmVkIGJ5IHRyYWNlYmFjay5leHRyYWN0X3N0YWNrIGF0IHRoZSBjYWxsIHRvIA0KICAgICMgdXNlcidzIHBhcnNlIGFjdGlvbiAnZnVuYycsIHNvIHRoYXQgd2UgZG9uJ3QgaW5jdXIgY2FsbCBwZW5hbHR5IGF0IHBhcnNlIHRpbWUNCiAgICANCiAgICBMSU5FX0RJRkYgPSA2DQogICAgIyBJRiBBTlkgQ09ERSBDSEFOR0VTLCBFVkVOIEpVU1QgQ09NTUVOVFMgT1IgQkxBTksgTElORVMsIEJFVFdFRU4gVEhFIE5FWFQgTElORSBBTkQgDQogICAgIyBUSEUgQ0FMTCBUTyBGVU5DIElOU0lERSBXUkFQUEVSLCBMSU5FX0RJRkYgTVVTVCBCRSBNT0RJRklFRCEhISENCiAgICB0aGlzX2xpbmUgPSBleHRyYWN0X3N0YWNrKGxpbWl0PTIpWy0xXQ0KICAgIHBhX2NhbGxfbGluZV9zeW50aCA9ICh0aGlzX2xpbmVbMF0sIHRoaXNfbGluZVsxXStMSU5FX0RJRkYpDQoNCiAgICBkZWYgd3JhcHBlcigqYXJncyk6DQogICAgICAgIHdoaWxlIDE6DQogICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgcmV0ID0gZnVuYygqYXJnc1tsaW1pdFswXTpdKQ0KICAgICAgICAgICAgICAgIGZvdW5kQXJpdHlbMF0gPSBUcnVlDQogICAgICAgICAgICAgICAgcmV0dXJuIHJldA0KICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoNCiAgICAgICAgICAgICAgICAjIHJlLXJhaXNlIFR5cGVFcnJvcnMgaWYgdGhleSBkaWQgbm90IGNvbWUgZnJvbSBvdXIgYXJpdHkgdGVzdGluZw0KICAgICAgICAgICAgICAgIGlmIGZvdW5kQXJpdHlbMF06DQogICAgICAgICAgICAgICAgICAgIHJhaXNlDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgICAgICAgICAgdGIgPSBzeXMuZXhjX2luZm8oKVstMV0NCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBleHRyYWN0X3RiKHRiLCBsaW1pdD0yKVstMV1bOjJdID09IHBhX2NhbGxfbGluZV9zeW50aDoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZQ0KICAgICAgICAgICAgICAgICAgICBmaW5hbGx5Og0KICAgICAgICAgICAgICAgICAgICAgICAgZGVsIHRiDQoNCiAgICAgICAgICAgICAgICBpZiBsaW1pdFswXSA8PSBtYXhhcmdzOg0KICAgICAgICAgICAgICAgICAgICBsaW1pdFswXSArPSAxDQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlDQogICAgICAgICAgICAgICAgcmFpc2UNCg0KICAgICMgY29weSBmdW5jIG5hbWUgdG8gd3JhcHBlciBmb3Igc2Vuc2libGUgZGVidWcgb3V0cHV0DQogICAgZnVuY19uYW1lID0gIjxwYXJzZSBhY3Rpb24+Ig0KICAgIHRyeToNCiAgICAgICAgZnVuY19uYW1lID0gZ2V0YXR0cihmdW5jLCAnX19uYW1lX18nLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRhdHRyKGZ1bmMsICdfX2NsYXNzX18nKS5fX25hbWVfXykNCiAgICBleGNlcHQgRXhjZXB0aW9uOg0KICAgICAgICBmdW5jX25hbWUgPSBzdHIoZnVuYykNCiAgICB3cmFwcGVyLl9fbmFtZV9fID0gZnVuY19uYW1lDQoNCiAgICByZXR1cm4gd3JhcHBlcg0KDQpjbGFzcyBQYXJzZXJFbGVtZW50KG9iamVjdCk6DQogICAgIiIiQWJzdHJhY3QgYmFzZSBsZXZlbCBwYXJzZXIgZWxlbWVudCBjbGFzcy4iIiINCiAgICBERUZBVUxUX1dISVRFX0NIQVJTID0gIiBcblx0XHIiDQogICAgdmVyYm9zZV9zdGFja3RyYWNlID0gRmFsc2UNCg0KICAgIEBzdGF0aWNtZXRob2QNCiAgICBkZWYgc2V0RGVmYXVsdFdoaXRlc3BhY2VDaGFycyggY2hhcnMgKToNCiAgICAgICAgciIiIg0KICAgICAgICBPdmVycmlkZXMgdGhlIGRlZmF1bHQgd2hpdGVzcGFjZSBjaGFycw0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgIyBkZWZhdWx0IHdoaXRlc3BhY2UgY2hhcnMgYXJlIHNwYWNlLCA8VEFCPiBhbmQgbmV3bGluZQ0KICAgICAgICAgICAgT25lT3JNb3JlKFdvcmQoYWxwaGFzKSkucGFyc2VTdHJpbmcoImFiYyBkZWZcbmdoaSBqa2wiKSAgIyAtPiBbJ2FiYycsICdkZWYnLCAnZ2hpJywgJ2prbCddDQogICAgICAgICAgICANCiAgICAgICAgICAgICMgY2hhbmdlIHRvIGp1c3QgdHJlYXQgbmV3bGluZSBhcyBzaWduaWZpY2FudA0KICAgICAgICAgICAgUGFyc2VyRWxlbWVudC5zZXREZWZhdWx0V2hpdGVzcGFjZUNoYXJzKCIgXHQiKQ0KICAgICAgICAgICAgT25lT3JNb3JlKFdvcmQoYWxwaGFzKSkucGFyc2VTdHJpbmcoImFiYyBkZWZcbmdoaSBqa2wiKSAgIyAtPiBbJ2FiYycsICdkZWYnXQ0KICAgICAgICAiIiINCiAgICAgICAgUGFyc2VyRWxlbWVudC5ERUZBVUxUX1dISVRFX0NIQVJTID0gY2hhcnMNCg0KICAgIEBzdGF0aWNtZXRob2QNCiAgICBkZWYgaW5saW5lTGl0ZXJhbHNVc2luZyhjbHMpOg0KICAgICAgICAiIiINCiAgICAgICAgU2V0IGNsYXNzIHRvIGJlIHVzZWQgZm9yIGluY2x1c2lvbiBvZiBzdHJpbmcgbGl0ZXJhbHMgaW50byBhIHBhcnNlci4NCiAgICAgICAgDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgIyBkZWZhdWx0IGxpdGVyYWwgY2xhc3MgdXNlZCBpcyBMaXRlcmFsDQogICAgICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKQ0KICAgICAgICAgICAgZGF0ZV9zdHIgPSBpbnRlZ2VyKCJ5ZWFyIikgKyAnLycgKyBpbnRlZ2VyKCJtb250aCIpICsgJy8nICsgaW50ZWdlcigiZGF5IikgICAgICAgICAgIA0KDQogICAgICAgICAgICBkYXRlX3N0ci5wYXJzZVN0cmluZygiMTk5OS8xMi8zMSIpICAjIC0+IFsnMTk5OScsICcvJywgJzEyJywgJy8nLCAnMzEnXQ0KDQoNCiAgICAgICAgICAgICMgY2hhbmdlIHRvIFN1cHByZXNzDQogICAgICAgICAgICBQYXJzZXJFbGVtZW50LmlubGluZUxpdGVyYWxzVXNpbmcoU3VwcHJlc3MpDQogICAgICAgICAgICBkYXRlX3N0ciA9IGludGVnZXIoInllYXIiKSArICcvJyArIGludGVnZXIoIm1vbnRoIikgKyAnLycgKyBpbnRlZ2VyKCJkYXkiKSAgICAgICAgICAgDQoNCiAgICAgICAgICAgIGRhdGVfc3RyLnBhcnNlU3RyaW5nKCIxOTk5LzEyLzMxIikgICMgLT4gWycxOTk5JywgJzEyJywgJzMxJ10NCiAgICAgICAgIiIiDQogICAgICAgIFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyA9IGNscw0KDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBzYXZlbGlzdD1GYWxzZSApOg0KICAgICAgICBzZWxmLnBhcnNlQWN0aW9uID0gbGlzdCgpDQogICAgICAgIHNlbGYuZmFpbEFjdGlvbiA9IE5vbmUNCiAgICAgICAgI34gc2VsZi5uYW1lID0gIjx1bmtub3duPiIgICMgZG9uJ3QgZGVmaW5lIHNlbGYubmFtZSwgbGV0IHN1YmNsYXNzZXMgdHJ5L2V4Y2VwdCB1cGNhbGwNCiAgICAgICAgc2VsZi5zdHJSZXByID0gTm9uZQ0KICAgICAgICBzZWxmLnJlc3VsdHNOYW1lID0gTm9uZQ0KICAgICAgICBzZWxmLnNhdmVBc0xpc3QgPSBzYXZlbGlzdA0KICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gVHJ1ZQ0KICAgICAgICBzZWxmLndoaXRlQ2hhcnMgPSBQYXJzZXJFbGVtZW50LkRFRkFVTFRfV0hJVEVfQ0hBUlMNCiAgICAgICAgc2VsZi5jb3B5RGVmYXVsdFdoaXRlQ2hhcnMgPSBUcnVlDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBGYWxzZSAjIHVzZWQgd2hlbiBjaGVja2luZyBmb3IgbGVmdC1yZWN1cnNpb24NCiAgICAgICAgc2VsZi5rZWVwVGFicyA9IEZhbHNlDQogICAgICAgIHNlbGYuaWdub3JlRXhwcnMgPSBsaXN0KCkNCiAgICAgICAgc2VsZi5kZWJ1ZyA9IEZhbHNlDQogICAgICAgIHNlbGYuc3RyZWFtbGluZWQgPSBGYWxzZQ0KICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBUcnVlICMgdXNlZCB0byBvcHRpbWl6ZSBleGNlcHRpb24gaGFuZGxpbmcgZm9yIHN1YmNsYXNzZXMgdGhhdCBkb24ndCBhZHZhbmNlIHBhcnNlIGluZGV4DQogICAgICAgIHNlbGYuZXJybXNnID0gIiINCiAgICAgICAgc2VsZi5tb2RhbFJlc3VsdHMgPSBUcnVlICMgdXNlZCB0byBtYXJrIHJlc3VsdHMgbmFtZXMgYXMgbW9kYWwgKHJlcG9ydCBvbmx5IGxhc3QpIG9yIGN1bXVsYXRpdmUgKGxpc3QgYWxsKQ0KICAgICAgICBzZWxmLmRlYnVnQWN0aW9ucyA9ICggTm9uZSwgTm9uZSwgTm9uZSApICNjdXN0b20gZGVidWcgYWN0aW9ucw0KICAgICAgICBzZWxmLnJlID0gTm9uZQ0KICAgICAgICBzZWxmLmNhbGxQcmVwYXJzZSA9IFRydWUgIyB1c2VkIHRvIGF2b2lkIHJlZHVuZGFudCBjYWxscyB0byBwcmVQYXJzZQ0KICAgICAgICBzZWxmLmNhbGxEdXJpbmdUcnkgPSBGYWxzZQ0KDQogICAgZGVmIGNvcHkoIHNlbGYgKToNCiAgICAgICAgIiIiDQogICAgICAgIE1ha2UgYSBjb3B5IG9mIHRoaXMgQ3tQYXJzZXJFbGVtZW50fS4gIFVzZWZ1bCBmb3IgZGVmaW5pbmcgZGlmZmVyZW50IHBhcnNlIGFjdGlvbnMNCiAgICAgICAgZm9yIHRoZSBzYW1lIHBhcnNpbmcgcGF0dGVybiwgdXNpbmcgY29waWVzIG9mIHRoZSBvcmlnaW5hbCBwYXJzZSBlbGVtZW50Lg0KICAgICAgICANCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdG9rczogaW50KHRva3NbMF0pKQ0KICAgICAgICAgICAgaW50ZWdlcksgPSBpbnRlZ2VyLmNvcHkoKS5hZGRQYXJzZUFjdGlvbihsYW1iZGEgdG9rczogdG9rc1swXSoxMDI0KSArIFN1cHByZXNzKCJLIikNCiAgICAgICAgICAgIGludGVnZXJNID0gaW50ZWdlci5jb3B5KCkuYWRkUGFyc2VBY3Rpb24obGFtYmRhIHRva3M6IHRva3NbMF0qMTAyNCoxMDI0KSArIFN1cHByZXNzKCJNIikNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgcHJpbnQoT25lT3JNb3JlKGludGVnZXJLIHwgaW50ZWdlck0gfCBpbnRlZ2VyKS5wYXJzZVN0cmluZygiNUsgMTAwIDY0MEsgMjU2TSIpKQ0KICAgICAgICBwcmludHM6Og0KICAgICAgICAgICAgWzUxMjAsIDEwMCwgNjU1MzYwLCAyNjg0MzU0NTZdDQogICAgICAgIEVxdWl2YWxlbnQgZm9ybSBvZiBDe2V4cHIuY29weSgpfSBpcyBqdXN0IEN7ZXhwcigpfTo6DQogICAgICAgICAgICBpbnRlZ2VyTSA9IGludGVnZXIoKS5hZGRQYXJzZUFjdGlvbihsYW1iZGEgdG9rczogdG9rc1swXSoxMDI0KjEwMjQpICsgU3VwcHJlc3MoIk0iKQ0KICAgICAgICAiIiINCiAgICAgICAgY3B5ID0gY29weS5jb3B5KCBzZWxmICkNCiAgICAgICAgY3B5LnBhcnNlQWN0aW9uID0gc2VsZi5wYXJzZUFjdGlvbls6XQ0KICAgICAgICBjcHkuaWdub3JlRXhwcnMgPSBzZWxmLmlnbm9yZUV4cHJzWzpdDQogICAgICAgIGlmIHNlbGYuY29weURlZmF1bHRXaGl0ZUNoYXJzOg0KICAgICAgICAgICAgY3B5LndoaXRlQ2hhcnMgPSBQYXJzZXJFbGVtZW50LkRFRkFVTFRfV0hJVEVfQ0hBUlMNCiAgICAgICAgcmV0dXJuIGNweQ0KDQogICAgZGVmIHNldE5hbWUoIHNlbGYsIG5hbWUgKToNCiAgICAgICAgIiIiDQogICAgICAgIERlZmluZSBuYW1lIGZvciB0aGlzIGV4cHJlc3Npb24sIG1ha2VzIGRlYnVnZ2luZyBhbmQgZXhjZXB0aW9uIG1lc3NhZ2VzIGNsZWFyZXIuDQogICAgICAgIA0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIFdvcmQobnVtcykucGFyc2VTdHJpbmcoIkFCQyIpICAjIC0+IEV4Y2VwdGlvbjogRXhwZWN0ZWQgVzooMDEyMy4uLikgKGF0IGNoYXIgMCksIChsaW5lOjEsIGNvbDoxKQ0KICAgICAgICAgICAgV29yZChudW1zKS5zZXROYW1lKCJpbnRlZ2VyIikucGFyc2VTdHJpbmcoIkFCQyIpICAjIC0+IEV4Y2VwdGlvbjogRXhwZWN0ZWQgaW50ZWdlciAoYXQgY2hhciAwKSwgKGxpbmU6MSwgY29sOjEpDQogICAgICAgICIiIg0KICAgICAgICBzZWxmLm5hbWUgPSBuYW1lDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICIgKyBzZWxmLm5hbWUNCiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCJleGNlcHRpb24iKToNCiAgICAgICAgICAgIHNlbGYuZXhjZXB0aW9uLm1zZyA9IHNlbGYuZXJybXNnDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgc2V0UmVzdWx0c05hbWUoIHNlbGYsIG5hbWUsIGxpc3RBbGxNYXRjaGVzPUZhbHNlICk6DQogICAgICAgICIiIg0KICAgICAgICBEZWZpbmUgbmFtZSBmb3IgcmVmZXJlbmNpbmcgbWF0Y2hpbmcgdG9rZW5zIGFzIGEgbmVzdGVkIGF0dHJpYnV0ZQ0KICAgICAgICBvZiB0aGUgcmV0dXJuZWQgcGFyc2UgcmVzdWx0cy4NCiAgICAgICAgTk9URTogdGhpcyByZXR1cm5zIGEgKmNvcHkqIG9mIHRoZSBvcmlnaW5hbCBDe1BhcnNlckVsZW1lbnR9IG9iamVjdDsNCiAgICAgICAgdGhpcyBpcyBzbyB0aGF0IHRoZSBjbGllbnQgY2FuIGRlZmluZSBhIGJhc2ljIGVsZW1lbnQsIHN1Y2ggYXMgYW4NCiAgICAgICAgaW50ZWdlciwgYW5kIHJlZmVyZW5jZSBpdCBpbiBtdWx0aXBsZSBwbGFjZXMgd2l0aCBkaWZmZXJlbnQgbmFtZXMuDQoNCiAgICAgICAgWW91IGNhbiBhbHNvIHNldCByZXN1bHRzIG5hbWVzIHVzaW5nIHRoZSBhYmJyZXZpYXRlZCBzeW50YXgsDQogICAgICAgIEN7ZXhwcigibmFtZSIpfSBpbiBwbGFjZSBvZiBDe2V4cHIuc2V0UmVzdWx0c05hbWUoIm5hbWUiKX0gLSANCiAgICAgICAgc2VlIEx7SXtfX2NhbGxfX308X19jYWxsX18+fS4NCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIGRhdGVfc3RyID0gKGludGVnZXIuc2V0UmVzdWx0c05hbWUoInllYXIiKSArICcvJyANCiAgICAgICAgICAgICAgICAgICAgICAgICsgaW50ZWdlci5zZXRSZXN1bHRzTmFtZSgibW9udGgiKSArICcvJyANCiAgICAgICAgICAgICAgICAgICAgICAgICsgaW50ZWdlci5zZXRSZXN1bHRzTmFtZSgiZGF5IikpDQoNCiAgICAgICAgICAgICMgZXF1aXZhbGVudCBmb3JtOg0KICAgICAgICAgICAgZGF0ZV9zdHIgPSBpbnRlZ2VyKCJ5ZWFyIikgKyAnLycgKyBpbnRlZ2VyKCJtb250aCIpICsgJy8nICsgaW50ZWdlcigiZGF5IikNCiAgICAgICAgIiIiDQogICAgICAgIG5ld3NlbGYgPSBzZWxmLmNvcHkoKQ0KICAgICAgICBpZiBuYW1lLmVuZHN3aXRoKCIqIik6DQogICAgICAgICAgICBuYW1lID0gbmFtZVs6LTFdDQogICAgICAgICAgICBsaXN0QWxsTWF0Y2hlcz1UcnVlDQogICAgICAgIG5ld3NlbGYucmVzdWx0c05hbWUgPSBuYW1lDQogICAgICAgIG5ld3NlbGYubW9kYWxSZXN1bHRzID0gbm90IGxpc3RBbGxNYXRjaGVzDQogICAgICAgIHJldHVybiBuZXdzZWxmDQoNCiAgICBkZWYgc2V0QnJlYWsoc2VsZixicmVha0ZsYWcgPSBUcnVlKToNCiAgICAgICAgIiIiTWV0aG9kIHRvIGludm9rZSB0aGUgUHl0aG9uIHBkYiBkZWJ1Z2dlciB3aGVuIHRoaXMgZWxlbWVudCBpcw0KICAgICAgICAgICBhYm91dCB0byBiZSBwYXJzZWQuIFNldCBDe2JyZWFrRmxhZ30gdG8gVHJ1ZSB0byBlbmFibGUsIEZhbHNlIHRvDQogICAgICAgICAgIGRpc2FibGUuDQogICAgICAgICIiIg0KICAgICAgICBpZiBicmVha0ZsYWc6DQogICAgICAgICAgICBfcGFyc2VNZXRob2QgPSBzZWxmLl9wYXJzZQ0KICAgICAgICAgICAgZGVmIGJyZWFrZXIoaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUsIGNhbGxQcmVQYXJzZT1UcnVlKToNCiAgICAgICAgICAgICAgICBpbXBvcnQgcGRiDQogICAgICAgICAgICAgICAgcGRiLnNldF90cmFjZSgpDQogICAgICAgICAgICAgICAgcmV0dXJuIF9wYXJzZU1ldGhvZCggaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zLCBjYWxsUHJlUGFyc2UgKQ0KICAgICAgICAgICAgYnJlYWtlci5fb3JpZ2luYWxQYXJzZU1ldGhvZCA9IF9wYXJzZU1ldGhvZA0KICAgICAgICAgICAgc2VsZi5fcGFyc2UgPSBicmVha2VyDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBpZiBoYXNhdHRyKHNlbGYuX3BhcnNlLCJfb3JpZ2luYWxQYXJzZU1ldGhvZCIpOg0KICAgICAgICAgICAgICAgIHNlbGYuX3BhcnNlID0gc2VsZi5fcGFyc2UuX29yaWdpbmFsUGFyc2VNZXRob2QNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBzZXRQYXJzZUFjdGlvbiggc2VsZiwgKmZucywgKiprd2FyZ3MgKToNCiAgICAgICAgIiIiDQogICAgICAgIERlZmluZSBvbmUgb3IgbW9yZSBhY3Rpb25zIHRvIHBlcmZvcm0gd2hlbiBzdWNjZXNzZnVsbHkgbWF0Y2hpbmcgcGFyc2UgZWxlbWVudCBkZWZpbml0aW9uLg0KICAgICAgICBQYXJzZSBhY3Rpb24gZm4gaXMgYSBjYWxsYWJsZSBtZXRob2Qgd2l0aCAwLTMgYXJndW1lbnRzLCBjYWxsZWQgYXMgQ3tmbihzLGxvYyx0b2tzKX0sDQogICAgICAgIEN7Zm4obG9jLHRva3MpfSwgQ3tmbih0b2tzKX0sIG9yIGp1c3QgQ3tmbigpfSwgd2hlcmU6DQogICAgICAgICAtIHMgICA9IHRoZSBvcmlnaW5hbCBzdHJpbmcgYmVpbmcgcGFyc2VkIChzZWUgbm90ZSBiZWxvdykNCiAgICAgICAgIC0gbG9jID0gdGhlIGxvY2F0aW9uIG9mIHRoZSBtYXRjaGluZyBzdWJzdHJpbmcNCiAgICAgICAgIC0gdG9rcyA9IGEgbGlzdCBvZiB0aGUgbWF0Y2hlZCB0b2tlbnMsIHBhY2thZ2VkIGFzIGEgQ3tMe1BhcnNlUmVzdWx0c319IG9iamVjdA0KICAgICAgICBJZiB0aGUgZnVuY3Rpb25zIGluIGZucyBtb2RpZnkgdGhlIHRva2VucywgdGhleSBjYW4gcmV0dXJuIHRoZW0gYXMgdGhlIHJldHVybg0KICAgICAgICB2YWx1ZSBmcm9tIGZuLCBhbmQgdGhlIG1vZGlmaWVkIGxpc3Qgb2YgdG9rZW5zIHdpbGwgcmVwbGFjZSB0aGUgb3JpZ2luYWwuDQogICAgICAgIE90aGVyd2lzZSwgZm4gZG9lcyBub3QgbmVlZCB0byByZXR1cm4gYW55IHZhbHVlLg0KDQogICAgICAgIE9wdGlvbmFsIGtleXdvcmQgYXJndW1lbnRzOg0KICAgICAgICAgLSBjYWxsRHVyaW5nVHJ5ID0gKGRlZmF1bHQ9Q3tGYWxzZX0pIGluZGljYXRlIGlmIHBhcnNlIGFjdGlvbiBzaG91bGQgYmUgcnVuIGR1cmluZyBsb29rYWhlYWRzIGFuZCBhbHRlcm5hdGUgdGVzdGluZw0KDQogICAgICAgIE5vdGU6IHRoZSBkZWZhdWx0IHBhcnNpbmcgYmVoYXZpb3IgaXMgdG8gZXhwYW5kIHRhYnMgaW4gdGhlIGlucHV0IHN0cmluZw0KICAgICAgICBiZWZvcmUgc3RhcnRpbmcgdGhlIHBhcnNpbmcgcHJvY2Vzcy4gIFNlZSBMe0l7cGFyc2VTdHJpbmd9PHBhcnNlU3RyaW5nPn0gZm9yIG1vcmUgaW5mb3JtYXRpb24NCiAgICAgICAgb24gcGFyc2luZyBzdHJpbmdzIGNvbnRhaW5pbmcgQ3s8VEFCPn1zLCBhbmQgc3VnZ2VzdGVkIG1ldGhvZHMgdG8gbWFpbnRhaW4gYQ0KICAgICAgICBjb25zaXN0ZW50IHZpZXcgb2YgdGhlIHBhcnNlZCBzdHJpbmcsIHRoZSBwYXJzZSBsb2NhdGlvbiwgYW5kIGxpbmUgYW5kIGNvbHVtbg0KICAgICAgICBwb3NpdGlvbnMgd2l0aGluIHRoZSBwYXJzZWQgc3RyaW5nLg0KICAgICAgICANCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKQ0KICAgICAgICAgICAgZGF0ZV9zdHIgPSBpbnRlZ2VyICsgJy8nICsgaW50ZWdlciArICcvJyArIGludGVnZXINCg0KICAgICAgICAgICAgZGF0ZV9zdHIucGFyc2VTdHJpbmcoIjE5OTkvMTIvMzEiKSAgIyAtPiBbJzE5OTknLCAnLycsICcxMicsICcvJywgJzMxJ10NCg0KICAgICAgICAgICAgIyB1c2UgcGFyc2UgYWN0aW9uIHRvIGNvbnZlcnQgdG8gaW50cyBhdCBwYXJzZSB0aW1lDQogICAgICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdG9rczogaW50KHRva3NbMF0pKQ0KICAgICAgICAgICAgZGF0ZV9zdHIgPSBpbnRlZ2VyICsgJy8nICsgaW50ZWdlciArICcvJyArIGludGVnZXINCg0KICAgICAgICAgICAgIyBub3RlIHRoYXQgaW50ZWdlciBmaWVsZHMgYXJlIG5vdyBpbnRzLCBub3Qgc3RyaW5ncw0KICAgICAgICAgICAgZGF0ZV9zdHIucGFyc2VTdHJpbmcoIjE5OTkvMTIvMzEiKSAgIyAtPiBbMTk5OSwgJy8nLCAxMiwgJy8nLCAzMV0NCiAgICAgICAgIiIiDQogICAgICAgIHNlbGYucGFyc2VBY3Rpb24gPSBsaXN0KG1hcChfdHJpbV9hcml0eSwgbGlzdChmbnMpKSkNCiAgICAgICAgc2VsZi5jYWxsRHVyaW5nVHJ5ID0ga3dhcmdzLmdldCgiY2FsbER1cmluZ1RyeSIsIEZhbHNlKQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIGFkZFBhcnNlQWN0aW9uKCBzZWxmLCAqZm5zLCAqKmt3YXJncyApOg0KICAgICAgICAiIiINCiAgICAgICAgQWRkIG9uZSBvciBtb3JlIHBhcnNlIGFjdGlvbnMgdG8gZXhwcmVzc2lvbidzIGxpc3Qgb2YgcGFyc2UgYWN0aW9ucy4gU2VlIEx7SXtzZXRQYXJzZUFjdGlvbn08c2V0UGFyc2VBY3Rpb24+fS4NCiAgICAgICAgDQogICAgICAgIFNlZSBleGFtcGxlcyBpbiBMe0l7Y29weX08Y29weT59Lg0KICAgICAgICAiIiINCiAgICAgICAgc2VsZi5wYXJzZUFjdGlvbiArPSBsaXN0KG1hcChfdHJpbV9hcml0eSwgbGlzdChmbnMpKSkNCiAgICAgICAgc2VsZi5jYWxsRHVyaW5nVHJ5ID0gc2VsZi5jYWxsRHVyaW5nVHJ5IG9yIGt3YXJncy5nZXQoImNhbGxEdXJpbmdUcnkiLCBGYWxzZSkNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBhZGRDb25kaXRpb24oc2VsZiwgKmZucywgKiprd2FyZ3MpOg0KICAgICAgICAiIiJBZGQgYSBib29sZWFuIHByZWRpY2F0ZSBmdW5jdGlvbiB0byBleHByZXNzaW9uJ3MgbGlzdCBvZiBwYXJzZSBhY3Rpb25zLiBTZWUgDQogICAgICAgIEx7SXtzZXRQYXJzZUFjdGlvbn08c2V0UGFyc2VBY3Rpb24+fSBmb3IgZnVuY3Rpb24gY2FsbCBzaWduYXR1cmVzLiBVbmxpa2UgQ3tzZXRQYXJzZUFjdGlvbn0sIA0KICAgICAgICBmdW5jdGlvbnMgcGFzc2VkIHRvIEN7YWRkQ29uZGl0aW9ufSBuZWVkIHRvIHJldHVybiBib29sZWFuIHN1Y2Nlc3MvZmFpbCBvZiB0aGUgY29uZGl0aW9uLg0KDQogICAgICAgIE9wdGlvbmFsIGtleXdvcmQgYXJndW1lbnRzOg0KICAgICAgICAgLSBtZXNzYWdlID0gZGVmaW5lIGEgY3VzdG9tIG1lc3NhZ2UgdG8gYmUgdXNlZCBpbiB0aGUgcmFpc2VkIGV4Y2VwdGlvbg0KICAgICAgICAgLSBmYXRhbCAgID0gaWYgVHJ1ZSwgd2lsbCByYWlzZSBQYXJzZUZhdGFsRXhjZXB0aW9uIHRvIHN0b3AgcGFyc2luZyBpbW1lZGlhdGVseTsgb3RoZXJ3aXNlIHdpbGwgcmFpc2UgUGFyc2VFeGNlcHRpb24NCiAgICAgICAgIA0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0b2tzOiBpbnQodG9rc1swXSkpDQogICAgICAgICAgICB5ZWFyX2ludCA9IGludGVnZXIuY29weSgpDQogICAgICAgICAgICB5ZWFyX2ludC5hZGRDb25kaXRpb24obGFtYmRhIHRva3M6IHRva3NbMF0gPj0gMjAwMCwgbWVzc2FnZT0iT25seSBzdXBwb3J0IHllYXJzIDIwMDAgYW5kIGxhdGVyIikNCiAgICAgICAgICAgIGRhdGVfc3RyID0geWVhcl9pbnQgKyAnLycgKyBpbnRlZ2VyICsgJy8nICsgaW50ZWdlcg0KDQogICAgICAgICAgICByZXN1bHQgPSBkYXRlX3N0ci5wYXJzZVN0cmluZygiMTk5OS8xMi8zMSIpICAjIC0+IEV4Y2VwdGlvbjogT25seSBzdXBwb3J0IHllYXJzIDIwMDAgYW5kIGxhdGVyIChhdCBjaGFyIDApLCAobGluZToxLCBjb2w6MSkNCiAgICAgICAgIiIiDQogICAgICAgIG1zZyA9IGt3YXJncy5nZXQoIm1lc3NhZ2UiLCAiZmFpbGVkIHVzZXItZGVmaW5lZCBjb25kaXRpb24iKQ0KICAgICAgICBleGNfdHlwZSA9IFBhcnNlRmF0YWxFeGNlcHRpb24gaWYga3dhcmdzLmdldCgiZmF0YWwiLCBGYWxzZSkgZWxzZSBQYXJzZUV4Y2VwdGlvbg0KICAgICAgICBmb3IgZm4gaW4gZm5zOg0KICAgICAgICAgICAgZGVmIHBhKHMsbCx0KToNCiAgICAgICAgICAgICAgICBpZiBub3QgYm9vbChfdHJpbV9hcml0eShmbikocyxsLHQpKToNCiAgICAgICAgICAgICAgICAgICAgcmFpc2UgZXhjX3R5cGUocyxsLG1zZykNCiAgICAgICAgICAgIHNlbGYucGFyc2VBY3Rpb24uYXBwZW5kKHBhKQ0KICAgICAgICBzZWxmLmNhbGxEdXJpbmdUcnkgPSBzZWxmLmNhbGxEdXJpbmdUcnkgb3Iga3dhcmdzLmdldCgiY2FsbER1cmluZ1RyeSIsIEZhbHNlKQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIHNldEZhaWxBY3Rpb24oIHNlbGYsIGZuICk6DQogICAgICAgICIiIkRlZmluZSBhY3Rpb24gdG8gcGVyZm9ybSBpZiBwYXJzaW5nIGZhaWxzIGF0IHRoaXMgZXhwcmVzc2lvbi4NCiAgICAgICAgICAgRmFpbCBhY3RvbiBmbiBpcyBhIGNhbGxhYmxlIGZ1bmN0aW9uIHRoYXQgdGFrZXMgdGhlIGFyZ3VtZW50cw0KICAgICAgICAgICBDe2ZuKHMsbG9jLGV4cHIsZXJyKX0gd2hlcmU6DQogICAgICAgICAgICAtIHMgPSBzdHJpbmcgYmVpbmcgcGFyc2VkDQogICAgICAgICAgICAtIGxvYyA9IGxvY2F0aW9uIHdoZXJlIGV4cHJlc3Npb24gbWF0Y2ggd2FzIGF0dGVtcHRlZCBhbmQgZmFpbGVkDQogICAgICAgICAgICAtIGV4cHIgPSB0aGUgcGFyc2UgZXhwcmVzc2lvbiB0aGF0IGZhaWxlZA0KICAgICAgICAgICAgLSBlcnIgPSB0aGUgZXhjZXB0aW9uIHRocm93bg0KICAgICAgICAgICBUaGUgZnVuY3Rpb24gcmV0dXJucyBubyB2YWx1ZS4gIEl0IG1heSB0aHJvdyBDe0x7UGFyc2VGYXRhbEV4Y2VwdGlvbn19DQogICAgICAgICAgIGlmIGl0IGlzIGRlc2lyZWQgdG8gc3RvcCBwYXJzaW5nIGltbWVkaWF0ZWx5LiIiIg0KICAgICAgICBzZWxmLmZhaWxBY3Rpb24gPSBmbg0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIF9za2lwSWdub3JhYmxlcyggc2VsZiwgaW5zdHJpbmcsIGxvYyApOg0KICAgICAgICBleHByc0ZvdW5kID0gVHJ1ZQ0KICAgICAgICB3aGlsZSBleHByc0ZvdW5kOg0KICAgICAgICAgICAgZXhwcnNGb3VuZCA9IEZhbHNlDQogICAgICAgICAgICBmb3IgZSBpbiBzZWxmLmlnbm9yZUV4cHJzOg0KICAgICAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICAgICAgd2hpbGUgMToNCiAgICAgICAgICAgICAgICAgICAgICAgIGxvYyxkdW1teSA9IGUuX3BhcnNlKCBpbnN0cmluZywgbG9jICkNCiAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJzRm91bmQgPSBUcnVlDQogICAgICAgICAgICAgICAgZXhjZXB0IFBhcnNlRXhjZXB0aW9uOg0KICAgICAgICAgICAgICAgICAgICBwYXNzDQogICAgICAgIHJldHVybiBsb2MNCg0KICAgIGRlZiBwcmVQYXJzZSggc2VsZiwgaW5zdHJpbmcsIGxvYyApOg0KICAgICAgICBpZiBzZWxmLmlnbm9yZUV4cHJzOg0KICAgICAgICAgICAgbG9jID0gc2VsZi5fc2tpcElnbm9yYWJsZXMoIGluc3RyaW5nLCBsb2MgKQ0KDQogICAgICAgIGlmIHNlbGYuc2tpcFdoaXRlc3BhY2U6DQogICAgICAgICAgICB3dCA9IHNlbGYud2hpdGVDaGFycw0KICAgICAgICAgICAgaW5zdHJsZW4gPSBsZW4oaW5zdHJpbmcpDQogICAgICAgICAgICB3aGlsZSBsb2MgPCBpbnN0cmxlbiBhbmQgaW5zdHJpbmdbbG9jXSBpbiB3dDoNCiAgICAgICAgICAgICAgICBsb2MgKz0gMQ0KDQogICAgICAgIHJldHVybiBsb2MNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIHJldHVybiBsb2MsIFtdDQoNCiAgICBkZWYgcG9zdFBhcnNlKCBzZWxmLCBpbnN0cmluZywgbG9jLCB0b2tlbmxpc3QgKToNCiAgICAgICAgcmV0dXJuIHRva2VubGlzdA0KDQogICAgI34gQHByb2ZpbGUNCiAgICBkZWYgX3BhcnNlTm9DYWNoZSggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUsIGNhbGxQcmVQYXJzZT1UcnVlICk6DQogICAgICAgIGRlYnVnZ2luZyA9ICggc2VsZi5kZWJ1ZyApICNhbmQgZG9BY3Rpb25zICkNCg0KICAgICAgICBpZiBkZWJ1Z2dpbmcgb3Igc2VsZi5mYWlsQWN0aW9uOg0KICAgICAgICAgICAgI34gcHJpbnQgKCJNYXRjaCIsc2VsZiwiYXQgbG9jIixsb2MsIiglZCwlZCkiICUgKCBsaW5lbm8obG9jLGluc3RyaW5nKSwgY29sKGxvYyxpbnN0cmluZykgKSkNCiAgICAgICAgICAgIGlmIChzZWxmLmRlYnVnQWN0aW9uc1swXSApOg0KICAgICAgICAgICAgICAgIHNlbGYuZGVidWdBY3Rpb25zWzBdKCBpbnN0cmluZywgbG9jLCBzZWxmICkNCiAgICAgICAgICAgIGlmIGNhbGxQcmVQYXJzZSBhbmQgc2VsZi5jYWxsUHJlcGFyc2U6DQogICAgICAgICAgICAgICAgcHJlbG9jID0gc2VsZi5wcmVQYXJzZSggaW5zdHJpbmcsIGxvYyApDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHByZWxvYyA9IGxvYw0KICAgICAgICAgICAgdG9rZW5zU3RhcnQgPSBwcmVsb2MNCiAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgICAgIGxvYyx0b2tlbnMgPSBzZWxmLnBhcnNlSW1wbCggaW5zdHJpbmcsIHByZWxvYywgZG9BY3Rpb25zICkNCiAgICAgICAgICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoNCiAgICAgICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oIGluc3RyaW5nLCBsZW4oaW5zdHJpbmcpLCBzZWxmLmVycm1zZywgc2VsZiApDQogICAgICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uIGFzIGVycjoNCiAgICAgICAgICAgICAgICAjfiBwcmludCAoIkV4Y2VwdGlvbiByYWlzZWQ6IiwgZXJyKQ0KICAgICAgICAgICAgICAgIGlmIHNlbGYuZGVidWdBY3Rpb25zWzJdOg0KICAgICAgICAgICAgICAgICAgICBzZWxmLmRlYnVnQWN0aW9uc1syXSggaW5zdHJpbmcsIHRva2Vuc1N0YXJ0LCBzZWxmLCBlcnIgKQ0KICAgICAgICAgICAgICAgIGlmIHNlbGYuZmFpbEFjdGlvbjoNCiAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsQWN0aW9uKCBpbnN0cmluZywgdG9rZW5zU3RhcnQsIHNlbGYsIGVyciApDQogICAgICAgICAgICAgICAgcmFpc2UNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIGlmIGNhbGxQcmVQYXJzZSBhbmQgc2VsZi5jYWxsUHJlcGFyc2U6DQogICAgICAgICAgICAgICAgcHJlbG9jID0gc2VsZi5wcmVQYXJzZSggaW5zdHJpbmcsIGxvYyApDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHByZWxvYyA9IGxvYw0KICAgICAgICAgICAgdG9rZW5zU3RhcnQgPSBwcmVsb2MNCiAgICAgICAgICAgIGlmIHNlbGYubWF5SW5kZXhFcnJvciBvciBwcmVsb2MgPj0gbGVuKGluc3RyaW5nKToNCiAgICAgICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgICAgIGxvYyx0b2tlbnMgPSBzZWxmLnBhcnNlSW1wbCggaW5zdHJpbmcsIHByZWxvYywgZG9BY3Rpb25zICkNCiAgICAgICAgICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoNCiAgICAgICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oIGluc3RyaW5nLCBsZW4oaW5zdHJpbmcpLCBzZWxmLmVycm1zZywgc2VsZiApDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIGxvYyx0b2tlbnMgPSBzZWxmLnBhcnNlSW1wbCggaW5zdHJpbmcsIHByZWxvYywgZG9BY3Rpb25zICkNCg0KICAgICAgICB0b2tlbnMgPSBzZWxmLnBvc3RQYXJzZSggaW5zdHJpbmcsIGxvYywgdG9rZW5zICkNCg0KICAgICAgICByZXRUb2tlbnMgPSBQYXJzZVJlc3VsdHMoIHRva2Vucywgc2VsZi5yZXN1bHRzTmFtZSwgYXNMaXN0PXNlbGYuc2F2ZUFzTGlzdCwgbW9kYWw9c2VsZi5tb2RhbFJlc3VsdHMgKQ0KICAgICAgICBpZiBzZWxmLnBhcnNlQWN0aW9uIGFuZCAoZG9BY3Rpb25zIG9yIHNlbGYuY2FsbER1cmluZ1RyeSk6DQogICAgICAgICAgICBpZiBkZWJ1Z2dpbmc6DQogICAgICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgICAgICBmb3IgZm4gaW4gc2VsZi5wYXJzZUFjdGlvbjoNCiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VucyA9IGZuKCBpbnN0cmluZywgdG9rZW5zU3RhcnQsIHJldFRva2VucyApDQogICAgICAgICAgICAgICAgICAgICAgICBpZiB0b2tlbnMgaXMgbm90IE5vbmU6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VG9rZW5zID0gUGFyc2VSZXN1bHRzKCB0b2tlbnMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlc3VsdHNOYW1lLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNMaXN0PXNlbGYuc2F2ZUFzTGlzdCBhbmQgaXNpbnN0YW5jZSh0b2tlbnMsKFBhcnNlUmVzdWx0cyxsaXN0KSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RhbD1zZWxmLm1vZGFsUmVzdWx0cyApDQogICAgICAgICAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbiBhcyBlcnI6DQogICAgICAgICAgICAgICAgICAgICN+IHByaW50ICJFeGNlcHRpb24gcmFpc2VkIGluIHVzZXIgcGFyc2UgYWN0aW9uOiIsIGVycg0KICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5kZWJ1Z0FjdGlvbnNbMl0gKToNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGVidWdBY3Rpb25zWzJdKCBpbnN0cmluZywgdG9rZW5zU3RhcnQsIHNlbGYsIGVyciApDQogICAgICAgICAgICAgICAgICAgIHJhaXNlDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIGZvciBmbiBpbiBzZWxmLnBhcnNlQWN0aW9uOg0KICAgICAgICAgICAgICAgICAgICB0b2tlbnMgPSBmbiggaW5zdHJpbmcsIHRva2Vuc1N0YXJ0LCByZXRUb2tlbnMgKQ0KICAgICAgICAgICAgICAgICAgICBpZiB0b2tlbnMgaXMgbm90IE5vbmU6DQogICAgICAgICAgICAgICAgICAgICAgICByZXRUb2tlbnMgPSBQYXJzZVJlc3VsdHMoIHRva2VucywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXN1bHRzTmFtZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNMaXN0PXNlbGYuc2F2ZUFzTGlzdCBhbmQgaXNpbnN0YW5jZSh0b2tlbnMsKFBhcnNlUmVzdWx0cyxsaXN0KSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGFsPXNlbGYubW9kYWxSZXN1bHRzICkNCiAgICAgICAgaWYgZGVidWdnaW5nOg0KICAgICAgICAgICAgI34gcHJpbnQgKCJNYXRjaGVkIixzZWxmLCItPiIscmV0VG9rZW5zLmFzTGlzdCgpKQ0KICAgICAgICAgICAgaWYgKHNlbGYuZGVidWdBY3Rpb25zWzFdICk6DQogICAgICAgICAgICAgICAgc2VsZi5kZWJ1Z0FjdGlvbnNbMV0oIGluc3RyaW5nLCB0b2tlbnNTdGFydCwgbG9jLCBzZWxmLCByZXRUb2tlbnMgKQ0KDQogICAgICAgIHJldHVybiBsb2MsIHJldFRva2Vucw0KDQogICAgZGVmIHRyeVBhcnNlKCBzZWxmLCBpbnN0cmluZywgbG9jICk6DQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLl9wYXJzZSggaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPUZhbHNlIClbMF0NCiAgICAgICAgZXhjZXB0IFBhcnNlRmF0YWxFeGNlcHRpb246DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbiggaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQogICAgDQogICAgZGVmIGNhblBhcnNlTmV4dChzZWxmLCBpbnN0cmluZywgbG9jKToNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgc2VsZi50cnlQYXJzZShpbnN0cmluZywgbG9jKQ0KICAgICAgICBleGNlcHQgKFBhcnNlRXhjZXB0aW9uLCBJbmRleEVycm9yKToNCiAgICAgICAgICAgIHJldHVybiBGYWxzZQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmV0dXJuIFRydWUNCg0KICAgIGNsYXNzIF9VbmJvdW5kZWRDYWNoZShvYmplY3QpOg0KICAgICAgICBkZWYgX19pbml0X18oc2VsZik6DQogICAgICAgICAgICBjYWNoZSA9IHt9DQogICAgICAgICAgICBzZWxmLm5vdF9pbl9jYWNoZSA9IG5vdF9pbl9jYWNoZSA9IG9iamVjdCgpDQoNCiAgICAgICAgICAgIGRlZiBnZXQoc2VsZiwga2V5KToNCiAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGUuZ2V0KGtleSwgbm90X2luX2NhY2hlKQ0KDQogICAgICAgICAgICBkZWYgc2V0KHNlbGYsIGtleSwgdmFsdWUpOg0KICAgICAgICAgICAgICAgIGNhY2hlW2tleV0gPSB2YWx1ZQ0KDQogICAgICAgICAgICBkZWYgY2xlYXIoc2VsZik6DQogICAgICAgICAgICAgICAgY2FjaGUuY2xlYXIoKQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgZGVmIGNhY2hlX2xlbihzZWxmKToNCiAgICAgICAgICAgICAgICByZXR1cm4gbGVuKGNhY2hlKQ0KDQogICAgICAgICAgICBzZWxmLmdldCA9IHR5cGVzLk1ldGhvZFR5cGUoZ2V0LCBzZWxmKQ0KICAgICAgICAgICAgc2VsZi5zZXQgPSB0eXBlcy5NZXRob2RUeXBlKHNldCwgc2VsZikNCiAgICAgICAgICAgIHNlbGYuY2xlYXIgPSB0eXBlcy5NZXRob2RUeXBlKGNsZWFyLCBzZWxmKQ0KICAgICAgICAgICAgc2VsZi5fX2xlbl9fID0gdHlwZXMuTWV0aG9kVHlwZShjYWNoZV9sZW4sIHNlbGYpDQoNCiAgICBpZiBfT3JkZXJlZERpY3QgaXMgbm90IE5vbmU6DQogICAgICAgIGNsYXNzIF9GaWZvQ2FjaGUob2JqZWN0KToNCiAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzaXplKToNCiAgICAgICAgICAgICAgICBzZWxmLm5vdF9pbl9jYWNoZSA9IG5vdF9pbl9jYWNoZSA9IG9iamVjdCgpDQoNCiAgICAgICAgICAgICAgICBjYWNoZSA9IF9PcmRlcmVkRGljdCgpDQoNCiAgICAgICAgICAgICAgICBkZWYgZ2V0KHNlbGYsIGtleSk6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZS5nZXQoa2V5LCBub3RfaW5fY2FjaGUpDQoNCiAgICAgICAgICAgICAgICBkZWYgc2V0KHNlbGYsIGtleSwgdmFsdWUpOg0KICAgICAgICAgICAgICAgICAgICBjYWNoZVtrZXldID0gdmFsdWUNCiAgICAgICAgICAgICAgICAgICAgd2hpbGUgbGVuKGNhY2hlKSA+IHNpemU6DQogICAgICAgICAgICAgICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUucG9waXRlbShGYWxzZSkNCiAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzDQoNCiAgICAgICAgICAgICAgICBkZWYgY2xlYXIoc2VsZik6DQogICAgICAgICAgICAgICAgICAgIGNhY2hlLmNsZWFyKCkNCg0KICAgICAgICAgICAgICAgIGRlZiBjYWNoZV9sZW4oc2VsZik6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBsZW4oY2FjaGUpDQoNCiAgICAgICAgICAgICAgICBzZWxmLmdldCA9IHR5cGVzLk1ldGhvZFR5cGUoZ2V0LCBzZWxmKQ0KICAgICAgICAgICAgICAgIHNlbGYuc2V0ID0gdHlwZXMuTWV0aG9kVHlwZShzZXQsIHNlbGYpDQogICAgICAgICAgICAgICAgc2VsZi5jbGVhciA9IHR5cGVzLk1ldGhvZFR5cGUoY2xlYXIsIHNlbGYpDQogICAgICAgICAgICAgICAgc2VsZi5fX2xlbl9fID0gdHlwZXMuTWV0aG9kVHlwZShjYWNoZV9sZW4sIHNlbGYpDQoNCiAgICBlbHNlOg0KICAgICAgICBjbGFzcyBfRmlmb0NhY2hlKG9iamVjdCk6DQogICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgc2l6ZSk6DQogICAgICAgICAgICAgICAgc2VsZi5ub3RfaW5fY2FjaGUgPSBub3RfaW5fY2FjaGUgPSBvYmplY3QoKQ0KDQogICAgICAgICAgICAgICAgY2FjaGUgPSB7fQ0KICAgICAgICAgICAgICAgIGtleV9maWZvID0gY29sbGVjdGlvbnMuZGVxdWUoW10sIHNpemUpDQoNCiAgICAgICAgICAgICAgICBkZWYgZ2V0KHNlbGYsIGtleSk6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZS5nZXQoa2V5LCBub3RfaW5fY2FjaGUpDQoNCiAgICAgICAgICAgICAgICBkZWYgc2V0KHNlbGYsIGtleSwgdmFsdWUpOg0KICAgICAgICAgICAgICAgICAgICBjYWNoZVtrZXldID0gdmFsdWUNCiAgICAgICAgICAgICAgICAgICAgd2hpbGUgbGVuKGtleV9maWZvKSA+IHNpemU6DQogICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS5wb3Aoa2V5X2ZpZm8ucG9wbGVmdCgpLCBOb25lKQ0KICAgICAgICAgICAgICAgICAgICBrZXlfZmlmby5hcHBlbmQoa2V5KQ0KDQogICAgICAgICAgICAgICAgZGVmIGNsZWFyKHNlbGYpOg0KICAgICAgICAgICAgICAgICAgICBjYWNoZS5jbGVhcigpDQogICAgICAgICAgICAgICAgICAgIGtleV9maWZvLmNsZWFyKCkNCg0KICAgICAgICAgICAgICAgIGRlZiBjYWNoZV9sZW4oc2VsZik6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBsZW4oY2FjaGUpDQoNCiAgICAgICAgICAgICAgICBzZWxmLmdldCA9IHR5cGVzLk1ldGhvZFR5cGUoZ2V0LCBzZWxmKQ0KICAgICAgICAgICAgICAgIHNlbGYuc2V0ID0gdHlwZXMuTWV0aG9kVHlwZShzZXQsIHNlbGYpDQogICAgICAgICAgICAgICAgc2VsZi5jbGVhciA9IHR5cGVzLk1ldGhvZFR5cGUoY2xlYXIsIHNlbGYpDQogICAgICAgICAgICAgICAgc2VsZi5fX2xlbl9fID0gdHlwZXMuTWV0aG9kVHlwZShjYWNoZV9sZW4sIHNlbGYpDQoNCiAgICAjIGFyZ3VtZW50IGNhY2hlIGZvciBvcHRpbWl6aW5nIHJlcGVhdGVkIGNhbGxzIHdoZW4gYmFja3RyYWNraW5nIHRocm91Z2ggcmVjdXJzaXZlIGV4cHJlc3Npb25zDQogICAgcGFja3JhdF9jYWNoZSA9IHt9ICMgdGhpcyBpcyBzZXQgbGF0ZXIgYnkgZW5hYmxlZFBhY2tyYXQoKTsgdGhpcyBpcyBoZXJlIHNvIHRoYXQgcmVzZXRDYWNoZSgpIGRvZXNuJ3QgZmFpbA0KICAgIHBhY2tyYXRfY2FjaGVfbG9jayA9IFJMb2NrKCkNCiAgICBwYWNrcmF0X2NhY2hlX3N0YXRzID0gWzAsIDBdDQoNCiAgICAjIHRoaXMgbWV0aG9kIGdldHMgcmVwZWF0ZWRseSBjYWxsZWQgZHVyaW5nIGJhY2t0cmFja2luZyB3aXRoIHRoZSBzYW1lIGFyZ3VtZW50cyAtDQogICAgIyB3ZSBjYW4gY2FjaGUgdGhlc2UgYXJndW1lbnRzIGFuZCBzYXZlIG91cnNlbHZlcyB0aGUgdHJvdWJsZSBvZiByZS1wYXJzaW5nIHRoZSBjb250YWluZWQgZXhwcmVzc2lvbg0KICAgIGRlZiBfcGFyc2VDYWNoZSggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUsIGNhbGxQcmVQYXJzZT1UcnVlICk6DQogICAgICAgIEhJVCwgTUlTUyA9IDAsIDENCiAgICAgICAgbG9va3VwID0gKHNlbGYsIGluc3RyaW5nLCBsb2MsIGNhbGxQcmVQYXJzZSwgZG9BY3Rpb25zKQ0KICAgICAgICB3aXRoIFBhcnNlckVsZW1lbnQucGFja3JhdF9jYWNoZV9sb2NrOg0KICAgICAgICAgICAgY2FjaGUgPSBQYXJzZXJFbGVtZW50LnBhY2tyYXRfY2FjaGUNCiAgICAgICAgICAgIHZhbHVlID0gY2FjaGUuZ2V0KGxvb2t1cCkNCiAgICAgICAgICAgIGlmIHZhbHVlIGlzIGNhY2hlLm5vdF9pbl9jYWNoZToNCiAgICAgICAgICAgICAgICBQYXJzZXJFbGVtZW50LnBhY2tyYXRfY2FjaGVfc3RhdHNbTUlTU10gKz0gMQ0KICAgICAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzZWxmLl9wYXJzZU5vQ2FjaGUoaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zLCBjYWxsUHJlUGFyc2UpDQogICAgICAgICAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbiBhcyBwZToNCiAgICAgICAgICAgICAgICAgICAgIyBjYWNoZSBhIGNvcHkgb2YgdGhlIGV4Y2VwdGlvbiwgd2l0aG91dCB0aGUgdHJhY2ViYWNrDQogICAgICAgICAgICAgICAgICAgIGNhY2hlLnNldChsb29rdXAsIHBlLl9fY2xhc3NfXygqcGUuYXJncykpDQogICAgICAgICAgICAgICAgICAgIHJhaXNlDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgY2FjaGUuc2V0KGxvb2t1cCwgKHZhbHVlWzBdLCB2YWx1ZVsxXS5jb3B5KCkpKQ0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgUGFyc2VyRWxlbWVudC5wYWNrcmF0X2NhY2hlX3N0YXRzW0hJVF0gKz0gMQ0KICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIEV4Y2VwdGlvbik6DQogICAgICAgICAgICAgICAgICAgIHJhaXNlIHZhbHVlDQogICAgICAgICAgICAgICAgcmV0dXJuICh2YWx1ZVswXSwgdmFsdWVbMV0uY29weSgpKQ0KDQogICAgX3BhcnNlID0gX3BhcnNlTm9DYWNoZQ0KDQogICAgQHN0YXRpY21ldGhvZA0KICAgIGRlZiByZXNldENhY2hlKCk6DQogICAgICAgIFBhcnNlckVsZW1lbnQucGFja3JhdF9jYWNoZS5jbGVhcigpDQogICAgICAgIFBhcnNlckVsZW1lbnQucGFja3JhdF9jYWNoZV9zdGF0c1s6XSA9IFswXSAqIGxlbihQYXJzZXJFbGVtZW50LnBhY2tyYXRfY2FjaGVfc3RhdHMpDQoNCiAgICBfcGFja3JhdEVuYWJsZWQgPSBGYWxzZQ0KICAgIEBzdGF0aWNtZXRob2QNCiAgICBkZWYgZW5hYmxlUGFja3JhdChjYWNoZV9zaXplX2xpbWl0PTEyOCk6DQogICAgICAgICIiIkVuYWJsZXMgInBhY2tyYXQiIHBhcnNpbmcsIHdoaWNoIGFkZHMgbWVtb2l6aW5nIHRvIHRoZSBwYXJzaW5nIGxvZ2ljLg0KICAgICAgICAgICBSZXBlYXRlZCBwYXJzZSBhdHRlbXB0cyBhdCB0aGUgc2FtZSBzdHJpbmcgbG9jYXRpb24gKHdoaWNoIGhhcHBlbnMNCiAgICAgICAgICAgb2Z0ZW4gaW4gbWFueSBjb21wbGV4IGdyYW1tYXJzKSBjYW4gaW1tZWRpYXRlbHkgcmV0dXJuIGEgY2FjaGVkIHZhbHVlLA0KICAgICAgICAgICBpbnN0ZWFkIG9mIHJlLWV4ZWN1dGluZyBwYXJzaW5nL3ZhbGlkYXRpbmcgY29kZS4gIE1lbW9pemluZyBpcyBkb25lIG9mDQogICAgICAgICAgIGJvdGggdmFsaWQgcmVzdWx0cyBhbmQgcGFyc2luZyBleGNlcHRpb25zLg0KICAgICAgICAgICANCiAgICAgICAgICAgUGFyYW1ldGVyczoNCiAgICAgICAgICAgIC0gY2FjaGVfc2l6ZV9saW1pdCAtIChkZWZhdWx0PUN7MTI4fSkgLSBpZiBhbiBpbnRlZ2VyIHZhbHVlIGlzIHByb3ZpZGVkDQogICAgICAgICAgICAgIHdpbGwgbGltaXQgdGhlIHNpemUgb2YgdGhlIHBhY2tyYXQgY2FjaGU7IGlmIE5vbmUgaXMgcGFzc2VkLCB0aGVuDQogICAgICAgICAgICAgIHRoZSBjYWNoZSBzaXplIHdpbGwgYmUgdW5ib3VuZGVkOyBpZiAwIGlzIHBhc3NlZCwgdGhlIGNhY2hlIHdpbGwNCiAgICAgICAgICAgICAgYmUgZWZmZWN0aXZlbHkgZGlzYWJsZWQuDQogICAgICAgICAgICANCiAgICAgICAgICAgVGhpcyBzcGVlZHVwIG1heSBicmVhayBleGlzdGluZyBwcm9ncmFtcyB0aGF0IHVzZSBwYXJzZSBhY3Rpb25zIHRoYXQNCiAgICAgICAgICAgaGF2ZSBzaWRlLWVmZmVjdHMuICBGb3IgdGhpcyByZWFzb24sIHBhY2tyYXQgcGFyc2luZyBpcyBkaXNhYmxlZCB3aGVuDQogICAgICAgICAgIHlvdSBmaXJzdCBpbXBvcnQgcHlwYXJzaW5nLiAgVG8gYWN0aXZhdGUgdGhlIHBhY2tyYXQgZmVhdHVyZSwgeW91cg0KICAgICAgICAgICBwcm9ncmFtIG11c3QgY2FsbCB0aGUgY2xhc3MgbWV0aG9kIEN7UGFyc2VyRWxlbWVudC5lbmFibGVQYWNrcmF0KCl9LiAgSWYNCiAgICAgICAgICAgeW91ciBwcm9ncmFtIHVzZXMgQ3twc3ljb30gdG8gImNvbXBpbGUgYXMgeW91IGdvIiwgeW91IG11c3QgY2FsbA0KICAgICAgICAgICBDe2VuYWJsZVBhY2tyYXR9IGJlZm9yZSBjYWxsaW5nIEN7cHN5Y28uZnVsbCgpfS4gIElmIHlvdSBkbyBub3QgZG8gdGhpcywNCiAgICAgICAgICAgUHl0aG9uIHdpbGwgY3Jhc2guICBGb3IgYmVzdCByZXN1bHRzLCBjYWxsIEN7ZW5hYmxlUGFja3JhdCgpfSBpbW1lZGlhdGVseQ0KICAgICAgICAgICBhZnRlciBpbXBvcnRpbmcgcHlwYXJzaW5nLg0KICAgICAgICAgICANCiAgICAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICAgICBpbXBvcnQgcHlwYXJzaW5nDQogICAgICAgICAgICAgICBweXBhcnNpbmcuUGFyc2VyRWxlbWVudC5lbmFibGVQYWNrcmF0KCkNCiAgICAgICAgIiIiDQogICAgICAgIGlmIG5vdCBQYXJzZXJFbGVtZW50Ll9wYWNrcmF0RW5hYmxlZDoNCiAgICAgICAgICAgIFBhcnNlckVsZW1lbnQuX3BhY2tyYXRFbmFibGVkID0gVHJ1ZQ0KICAgICAgICAgICAgaWYgY2FjaGVfc2l6ZV9saW1pdCBpcyBOb25lOg0KICAgICAgICAgICAgICAgIFBhcnNlckVsZW1lbnQucGFja3JhdF9jYWNoZSA9IFBhcnNlckVsZW1lbnQuX1VuYm91bmRlZENhY2hlKCkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgUGFyc2VyRWxlbWVudC5wYWNrcmF0X2NhY2hlID0gUGFyc2VyRWxlbWVudC5fRmlmb0NhY2hlKGNhY2hlX3NpemVfbGltaXQpDQogICAgICAgICAgICBQYXJzZXJFbGVtZW50Ll9wYXJzZSA9IFBhcnNlckVsZW1lbnQuX3BhcnNlQ2FjaGUNCg0KICAgIGRlZiBwYXJzZVN0cmluZyggc2VsZiwgaW5zdHJpbmcsIHBhcnNlQWxsPUZhbHNlICk6DQogICAgICAgICIiIg0KICAgICAgICBFeGVjdXRlIHRoZSBwYXJzZSBleHByZXNzaW9uIHdpdGggdGhlIGdpdmVuIHN0cmluZy4NCiAgICAgICAgVGhpcyBpcyB0aGUgbWFpbiBpbnRlcmZhY2UgdG8gdGhlIGNsaWVudCBjb2RlLCBvbmNlIHRoZSBjb21wbGV0ZQ0KICAgICAgICBleHByZXNzaW9uIGhhcyBiZWVuIGJ1aWx0Lg0KDQogICAgICAgIElmIHlvdSB3YW50IHRoZSBncmFtbWFyIHRvIHJlcXVpcmUgdGhhdCB0aGUgZW50aXJlIGlucHV0IHN0cmluZyBiZQ0KICAgICAgICBzdWNjZXNzZnVsbHkgcGFyc2VkLCB0aGVuIHNldCBDe3BhcnNlQWxsfSB0byBUcnVlIChlcXVpdmFsZW50IHRvIGVuZGluZw0KICAgICAgICB0aGUgZ3JhbW1hciB3aXRoIEN7THtTdHJpbmdFbmQoKX19KS4NCg0KICAgICAgICBOb3RlOiBDe3BhcnNlU3RyaW5nfSBpbXBsaWNpdGx5IGNhbGxzIEN7ZXhwYW5kdGFicygpfSBvbiB0aGUgaW5wdXQgc3RyaW5nLA0KICAgICAgICBpbiBvcmRlciB0byByZXBvcnQgcHJvcGVyIGNvbHVtbiBudW1iZXJzIGluIHBhcnNlIGFjdGlvbnMuDQogICAgICAgIElmIHRoZSBpbnB1dCBzdHJpbmcgY29udGFpbnMgdGFicyBhbmQNCiAgICAgICAgdGhlIGdyYW1tYXIgdXNlcyBwYXJzZSBhY3Rpb25zIHRoYXQgdXNlIHRoZSBDe2xvY30gYXJndW1lbnQgdG8gaW5kZXggaW50byB0aGUNCiAgICAgICAgc3RyaW5nIGJlaW5nIHBhcnNlZCwgeW91IGNhbiBlbnN1cmUgeW91IGhhdmUgYSBjb25zaXN0ZW50IHZpZXcgb2YgdGhlIGlucHV0DQogICAgICAgIHN0cmluZyBieToNCiAgICAgICAgIC0gY2FsbGluZyBDe3BhcnNlV2l0aFRhYnN9IG9uIHlvdXIgZ3JhbW1hciBiZWZvcmUgY2FsbGluZyBDe3BhcnNlU3RyaW5nfQ0KICAgICAgICAgICAoc2VlIEx7SXtwYXJzZVdpdGhUYWJzfTxwYXJzZVdpdGhUYWJzPn0pDQogICAgICAgICAtIGRlZmluZSB5b3VyIHBhcnNlIGFjdGlvbiB1c2luZyB0aGUgZnVsbCBDeyhzLGxvYyx0b2tzKX0gc2lnbmF0dXJlLCBhbmQNCiAgICAgICAgICAgcmVmZXJlbmNlIHRoZSBpbnB1dCBzdHJpbmcgdXNpbmcgdGhlIHBhcnNlIGFjdGlvbidzIEN7c30gYXJndW1lbnQNCiAgICAgICAgIC0gZXhwbGljdGx5IGV4cGFuZCB0aGUgdGFicyBpbiB5b3VyIGlucHV0IHN0cmluZyBiZWZvcmUgY2FsbGluZw0KICAgICAgICAgICBDe3BhcnNlU3RyaW5nfQ0KICAgICAgICANCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBXb3JkKCdhJykucGFyc2VTdHJpbmcoJ2FhYWFhYmFhYScpICAjIC0+IFsnYWFhYWEnXQ0KICAgICAgICAgICAgV29yZCgnYScpLnBhcnNlU3RyaW5nKCdhYWFhYWJhYWEnLCBwYXJzZUFsbD1UcnVlKSAgIyAtPiBFeGNlcHRpb246IEV4cGVjdGVkIGVuZCBvZiB0ZXh0DQogICAgICAgICIiIg0KICAgICAgICBQYXJzZXJFbGVtZW50LnJlc2V0Q2FjaGUoKQ0KICAgICAgICBpZiBub3Qgc2VsZi5zdHJlYW1saW5lZDoNCiAgICAgICAgICAgIHNlbGYuc3RyZWFtbGluZSgpDQogICAgICAgICAgICAjfiBzZWxmLnNhdmVBc0xpc3QgPSBUcnVlDQogICAgICAgIGZvciBlIGluIHNlbGYuaWdub3JlRXhwcnM6DQogICAgICAgICAgICBlLnN0cmVhbWxpbmUoKQ0KICAgICAgICBpZiBub3Qgc2VsZi5rZWVwVGFiczoNCiAgICAgICAgICAgIGluc3RyaW5nID0gaW5zdHJpbmcuZXhwYW5kdGFicygpDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIGxvYywgdG9rZW5zID0gc2VsZi5fcGFyc2UoIGluc3RyaW5nLCAwICkNCiAgICAgICAgICAgIGlmIHBhcnNlQWxsOg0KICAgICAgICAgICAgICAgIGxvYyA9IHNlbGYucHJlUGFyc2UoIGluc3RyaW5nLCBsb2MgKQ0KICAgICAgICAgICAgICAgIHNlID0gRW1wdHkoKSArIFN0cmluZ0VuZCgpDQogICAgICAgICAgICAgICAgc2UuX3BhcnNlKCBpbnN0cmluZywgbG9jICkNCiAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbiBhcyBleGM6DQogICAgICAgICAgICBpZiBQYXJzZXJFbGVtZW50LnZlcmJvc2Vfc3RhY2t0cmFjZToNCiAgICAgICAgICAgICAgICByYWlzZQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAjIGNhdGNoIGFuZCByZS1yYWlzZSBleGNlcHRpb24gZnJvbSBoZXJlLCBjbGVhcnMgb3V0IHB5cGFyc2luZyBpbnRlcm5hbCBzdGFjayB0cmFjZQ0KICAgICAgICAgICAgICAgIHJhaXNlIGV4Yw0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmV0dXJuIHRva2Vucw0KDQogICAgZGVmIHNjYW5TdHJpbmcoIHNlbGYsIGluc3RyaW5nLCBtYXhNYXRjaGVzPV9NQVhfSU5ULCBvdmVybGFwPUZhbHNlICk6DQogICAgICAgICIiIg0KICAgICAgICBTY2FuIHRoZSBpbnB1dCBzdHJpbmcgZm9yIGV4cHJlc3Npb24gbWF0Y2hlcy4gIEVhY2ggbWF0Y2ggd2lsbCByZXR1cm4gdGhlDQogICAgICAgIG1hdGNoaW5nIHRva2Vucywgc3RhcnQgbG9jYXRpb24sIGFuZCBlbmQgbG9jYXRpb24uICBNYXkgYmUgY2FsbGVkIHdpdGggb3B0aW9uYWwNCiAgICAgICAgQ3ttYXhNYXRjaGVzfSBhcmd1bWVudCwgdG8gY2xpcCBzY2FubmluZyBhZnRlciAnbicgbWF0Y2hlcyBhcmUgZm91bmQuICBJZg0KICAgICAgICBDe292ZXJsYXB9IGlzIHNwZWNpZmllZCwgdGhlbiBvdmVybGFwcGluZyBtYXRjaGVzIHdpbGwgYmUgcmVwb3J0ZWQuDQoNCiAgICAgICAgTm90ZSB0aGF0IHRoZSBzdGFydCBhbmQgZW5kIGxvY2F0aW9ucyBhcmUgcmVwb3J0ZWQgcmVsYXRpdmUgdG8gdGhlIHN0cmluZw0KICAgICAgICBiZWluZyBwYXJzZWQuICBTZWUgTHtJe3BhcnNlU3RyaW5nfTxwYXJzZVN0cmluZz59IGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHBhcnNpbmcNCiAgICAgICAgc3RyaW5ncyB3aXRoIGVtYmVkZGVkIHRhYnMuDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBzb3VyY2UgPSAic2xkamYxMjNsc2RqamtmMzQ1c2xka2pmODc5bGtqc2ZkOTg3Ig0KICAgICAgICAgICAgcHJpbnQoc291cmNlKQ0KICAgICAgICAgICAgZm9yIHRva2VucyxzdGFydCxlbmQgaW4gV29yZChhbHBoYXMpLnNjYW5TdHJpbmcoc291cmNlKToNCiAgICAgICAgICAgICAgICBwcmludCgnICcqc3RhcnQgKyAnXicqKGVuZC1zdGFydCkpDQogICAgICAgICAgICAgICAgcHJpbnQoJyAnKnN0YXJ0ICsgdG9rZW5zWzBdKQ0KICAgICAgICANCiAgICAgICAgcHJpbnRzOjoNCiAgICAgICAgDQogICAgICAgICAgICBzbGRqZjEyM2xzZGpqa2YzNDVzbGRramY4Nzlsa2pzZmQ5ODcNCiAgICAgICAgICAgIF5eXl5eDQogICAgICAgICAgICBzbGRqZg0KICAgICAgICAgICAgICAgICAgICBeXl5eXl5eDQogICAgICAgICAgICAgICAgICAgIGxzZGpqa2YNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xka2pmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxranNmZA0KICAgICAgICAiIiINCiAgICAgICAgaWYgbm90IHNlbGYuc3RyZWFtbGluZWQ6DQogICAgICAgICAgICBzZWxmLnN0cmVhbWxpbmUoKQ0KICAgICAgICBmb3IgZSBpbiBzZWxmLmlnbm9yZUV4cHJzOg0KICAgICAgICAgICAgZS5zdHJlYW1saW5lKCkNCg0KICAgICAgICBpZiBub3Qgc2VsZi5rZWVwVGFiczoNCiAgICAgICAgICAgIGluc3RyaW5nID0gX3VzdHIoaW5zdHJpbmcpLmV4cGFuZHRhYnMoKQ0KICAgICAgICBpbnN0cmxlbiA9IGxlbihpbnN0cmluZykNCiAgICAgICAgbG9jID0gMA0KICAgICAgICBwcmVwYXJzZUZuID0gc2VsZi5wcmVQYXJzZQ0KICAgICAgICBwYXJzZUZuID0gc2VsZi5fcGFyc2UNCiAgICAgICAgUGFyc2VyRWxlbWVudC5yZXNldENhY2hlKCkNCiAgICAgICAgbWF0Y2hlcyA9IDANCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgd2hpbGUgbG9jIDw9IGluc3RybGVuIGFuZCBtYXRjaGVzIDwgbWF4TWF0Y2hlczoNCiAgICAgICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgICAgIHByZWxvYyA9IHByZXBhcnNlRm4oIGluc3RyaW5nLCBsb2MgKQ0KICAgICAgICAgICAgICAgICAgICBuZXh0TG9jLHRva2VucyA9IHBhcnNlRm4oIGluc3RyaW5nLCBwcmVsb2MsIGNhbGxQcmVQYXJzZT1GYWxzZSApDQogICAgICAgICAgICAgICAgZXhjZXB0IFBhcnNlRXhjZXB0aW9uOg0KICAgICAgICAgICAgICAgICAgICBsb2MgPSBwcmVsb2MrMQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIGlmIG5leHRMb2MgPiBsb2M6DQogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzICs9IDENCiAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHRva2VucywgcHJlbG9jLCBuZXh0TG9jDQogICAgICAgICAgICAgICAgICAgICAgICBpZiBvdmVybGFwOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRsb2MgPSBwcmVwYXJzZUZuKCBpbnN0cmluZywgbG9jICkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBuZXh0bG9jID4gbG9jOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2MgPSBuZXh0TG9jDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jICs9IDENCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jID0gbmV4dExvYw0KICAgICAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICAgICAgbG9jID0gcHJlbG9jKzENCiAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbiBhcyBleGM6DQogICAgICAgICAgICBpZiBQYXJzZXJFbGVtZW50LnZlcmJvc2Vfc3RhY2t0cmFjZToNCiAgICAgICAgICAgICAgICByYWlzZQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAjIGNhdGNoIGFuZCByZS1yYWlzZSBleGNlcHRpb24gZnJvbSBoZXJlLCBjbGVhcnMgb3V0IHB5cGFyc2luZyBpbnRlcm5hbCBzdGFjayB0cmFjZQ0KICAgICAgICAgICAgICAgIHJhaXNlIGV4Yw0KDQogICAgZGVmIHRyYW5zZm9ybVN0cmluZyggc2VsZiwgaW5zdHJpbmcgKToNCiAgICAgICAgIiIiDQogICAgICAgIEV4dGVuc2lvbiB0byBDe0x7c2NhblN0cmluZ319LCB0byBtb2RpZnkgbWF0Y2hpbmcgdGV4dCB3aXRoIG1vZGlmaWVkIHRva2VucyB0aGF0IG1heQ0KICAgICAgICBiZSByZXR1cm5lZCBmcm9tIGEgcGFyc2UgYWN0aW9uLiAgVG8gdXNlIEN7dHJhbnNmb3JtU3RyaW5nfSwgZGVmaW5lIGEgZ3JhbW1hciBhbmQNCiAgICAgICAgYXR0YWNoIGEgcGFyc2UgYWN0aW9uIHRvIGl0IHRoYXQgbW9kaWZpZXMgdGhlIHJldHVybmVkIHRva2VuIGxpc3QuDQogICAgICAgIEludm9raW5nIEN7dHJhbnNmb3JtU3RyaW5nKCl9IG9uIGEgdGFyZ2V0IHN0cmluZyB3aWxsIHRoZW4gc2NhbiBmb3IgbWF0Y2hlcywNCiAgICAgICAgYW5kIHJlcGxhY2UgdGhlIG1hdGNoZWQgdGV4dCBwYXR0ZXJucyBhY2NvcmRpbmcgdG8gdGhlIGxvZ2ljIGluIHRoZSBwYXJzZQ0KICAgICAgICBhY3Rpb24uICBDe3RyYW5zZm9ybVN0cmluZygpfSByZXR1cm5zIHRoZSByZXN1bHRpbmcgdHJhbnNmb3JtZWQgc3RyaW5nLg0KICAgICAgICANCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICB3ZCA9IFdvcmQoYWxwaGFzKQ0KICAgICAgICAgICAgd2Quc2V0UGFyc2VBY3Rpb24obGFtYmRhIHRva3M6IHRva3NbMF0udGl0bGUoKSkNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgcHJpbnQod2QudHJhbnNmb3JtU3RyaW5nKCJub3cgaXMgdGhlIHdpbnRlciBvZiBvdXIgZGlzY29udGVudCBtYWRlIGdsb3Jpb3VzIHN1bW1lciBieSB0aGlzIHN1biBvZiB5b3JrLiIpKQ0KICAgICAgICBQcmludHM6Og0KICAgICAgICAgICAgTm93IElzIFRoZSBXaW50ZXIgT2YgT3VyIERpc2NvbnRlbnQgTWFkZSBHbG9yaW91cyBTdW1tZXIgQnkgVGhpcyBTdW4gT2YgWW9yay4NCiAgICAgICAgIiIiDQogICAgICAgIG91dCA9IFtdDQogICAgICAgIGxhc3RFID0gMA0KICAgICAgICAjIGZvcmNlIHByZXNlcnZhdGlvbiBvZiA8VEFCPnMsIHRvIG1pbmltaXplIHVud2FudGVkIHRyYW5zZm9ybWF0aW9uIG9mIHN0cmluZywgYW5kIHRvDQogICAgICAgICMga2VlcCBzdHJpbmcgbG9jcyBzdHJhaWdodCBiZXR3ZWVuIHRyYW5zZm9ybVN0cmluZyBhbmQgc2NhblN0cmluZw0KICAgICAgICBzZWxmLmtlZXBUYWJzID0gVHJ1ZQ0KICAgICAgICB0cnk6DQogICAgICAgICAgICBmb3IgdCxzLGUgaW4gc2VsZi5zY2FuU3RyaW5nKCBpbnN0cmluZyApOg0KICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoIGluc3RyaW5nW2xhc3RFOnNdICkNCiAgICAgICAgICAgICAgICBpZiB0Og0KICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHQsUGFyc2VSZXN1bHRzKToNCiAgICAgICAgICAgICAgICAgICAgICAgIG91dCArPSB0LmFzTGlzdCgpDQogICAgICAgICAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZSh0LGxpc3QpOg0KICAgICAgICAgICAgICAgICAgICAgICAgb3V0ICs9IHQNCiAgICAgICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQodCkNCiAgICAgICAgICAgICAgICBsYXN0RSA9IGUNCiAgICAgICAgICAgIG91dC5hcHBlbmQoaW5zdHJpbmdbbGFzdEU6XSkNCiAgICAgICAgICAgIG91dCA9IFtvIGZvciBvIGluIG91dCBpZiBvXQ0KICAgICAgICAgICAgcmV0dXJuICIiLmpvaW4obWFwKF91c3RyLF9mbGF0dGVuKG91dCkpKQ0KICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uIGFzIGV4YzoNCiAgICAgICAgICAgIGlmIFBhcnNlckVsZW1lbnQudmVyYm9zZV9zdGFja3RyYWNlOg0KICAgICAgICAgICAgICAgIHJhaXNlDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICMgY2F0Y2ggYW5kIHJlLXJhaXNlIGV4Y2VwdGlvbiBmcm9tIGhlcmUsIGNsZWFycyBvdXQgcHlwYXJzaW5nIGludGVybmFsIHN0YWNrIHRyYWNlDQogICAgICAgICAgICAgICAgcmFpc2UgZXhjDQoNCiAgICBkZWYgc2VhcmNoU3RyaW5nKCBzZWxmLCBpbnN0cmluZywgbWF4TWF0Y2hlcz1fTUFYX0lOVCApOg0KICAgICAgICAiIiINCiAgICAgICAgQW5vdGhlciBleHRlbnNpb24gdG8gQ3tMe3NjYW5TdHJpbmd9fSwgc2ltcGxpZnlpbmcgdGhlIGFjY2VzcyB0byB0aGUgdG9rZW5zIGZvdW5kDQogICAgICAgIHRvIG1hdGNoIHRoZSBnaXZlbiBwYXJzZSBleHByZXNzaW9uLiAgTWF5IGJlIGNhbGxlZCB3aXRoIG9wdGlvbmFsDQogICAgICAgIEN7bWF4TWF0Y2hlc30gYXJndW1lbnQsIHRvIGNsaXAgc2VhcmNoaW5nIGFmdGVyICduJyBtYXRjaGVzIGFyZSBmb3VuZC4NCiAgICAgICAgDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgIyBhIGNhcGl0YWxpemVkIHdvcmQgc3RhcnRzIHdpdGggYW4gdXBwZXJjYXNlIGxldHRlciwgZm9sbG93ZWQgYnkgemVybyBvciBtb3JlIGxvd2VyY2FzZSBsZXR0ZXJzDQogICAgICAgICAgICBjYXBfd29yZCA9IFdvcmQoYWxwaGFzLnVwcGVyKCksIGFscGhhcy5sb3dlcigpKQ0KICAgICAgICAgICAgDQogICAgICAgICAgICBwcmludChjYXBfd29yZC5zZWFyY2hTdHJpbmcoIk1vcmUgdGhhbiBJcm9uLCBtb3JlIHRoYW4gTGVhZCwgbW9yZSB0aGFuIEdvbGQgSSBuZWVkIEVsZWN0cmljaXR5IikpDQoNCiAgICAgICAgICAgICMgdGhlIHN1bSgpIGJ1aWx0aW4gY2FuIGJlIHVzZWQgdG8gbWVyZ2UgcmVzdWx0cyBpbnRvIGEgc2luZ2xlIFBhcnNlUmVzdWx0cyBvYmplY3QNCiAgICAgICAgICAgIHByaW50KHN1bShjYXBfd29yZC5zZWFyY2hTdHJpbmcoIk1vcmUgdGhhbiBJcm9uLCBtb3JlIHRoYW4gTGVhZCwgbW9yZSB0aGFuIEdvbGQgSSBuZWVkIEVsZWN0cmljaXR5IikpKQ0KICAgICAgICBwcmludHM6Og0KICAgICAgICAgICAgW1snTW9yZSddLCBbJ0lyb24nXSwgWydMZWFkJ10sIFsnR29sZCddLCBbJ0knXSwgWydFbGVjdHJpY2l0eSddXQ0KICAgICAgICAgICAgWydNb3JlJywgJ0lyb24nLCAnTGVhZCcsICdHb2xkJywgJ0knLCAnRWxlY3RyaWNpdHknXQ0KICAgICAgICAiIiINCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgcmV0dXJuIFBhcnNlUmVzdWx0cyhbIHQgZm9yIHQscyxlIGluIHNlbGYuc2NhblN0cmluZyggaW5zdHJpbmcsIG1heE1hdGNoZXMgKSBdKQ0KICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uIGFzIGV4YzoNCiAgICAgICAgICAgIGlmIFBhcnNlckVsZW1lbnQudmVyYm9zZV9zdGFja3RyYWNlOg0KICAgICAgICAgICAgICAgIHJhaXNlDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICMgY2F0Y2ggYW5kIHJlLXJhaXNlIGV4Y2VwdGlvbiBmcm9tIGhlcmUsIGNsZWFycyBvdXQgcHlwYXJzaW5nIGludGVybmFsIHN0YWNrIHRyYWNlDQogICAgICAgICAgICAgICAgcmFpc2UgZXhjDQoNCiAgICBkZWYgc3BsaXQoc2VsZiwgaW5zdHJpbmcsIG1heHNwbGl0PV9NQVhfSU5ULCBpbmNsdWRlU2VwYXJhdG9ycz1GYWxzZSk6DQogICAgICAgICIiIg0KICAgICAgICBHZW5lcmF0b3IgbWV0aG9kIHRvIHNwbGl0IGEgc3RyaW5nIHVzaW5nIHRoZSBnaXZlbiBleHByZXNzaW9uIGFzIGEgc2VwYXJhdG9yLg0KICAgICAgICBNYXkgYmUgY2FsbGVkIHdpdGggb3B0aW9uYWwgQ3ttYXhzcGxpdH0gYXJndW1lbnQsIHRvIGxpbWl0IHRoZSBudW1iZXIgb2Ygc3BsaXRzOw0KICAgICAgICBhbmQgdGhlIG9wdGlvbmFsIEN7aW5jbHVkZVNlcGFyYXRvcnN9IGFyZ3VtZW50IChkZWZhdWx0PUN7RmFsc2V9KSwgaWYgdGhlIHNlcGFyYXRpbmcNCiAgICAgICAgbWF0Y2hpbmcgdGV4dCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIHNwbGl0IHJlc3VsdHMuDQogICAgICAgIA0KICAgICAgICBFeGFtcGxlOjogICAgICAgIA0KICAgICAgICAgICAgcHVuYyA9IG9uZU9mKGxpc3QoIi4sOzovLSE/IikpDQogICAgICAgICAgICBwcmludChsaXN0KHB1bmMuc3BsaXQoIlRoaXMsIHRoaXM/LCB0aGlzIHNlbnRlbmNlLCBpcyBiYWRseSBwdW5jdHVhdGVkISIpKSkNCiAgICAgICAgcHJpbnRzOjoNCiAgICAgICAgICAgIFsnVGhpcycsICcgdGhpcycsICcnLCAnIHRoaXMgc2VudGVuY2UnLCAnIGlzIGJhZGx5IHB1bmN0dWF0ZWQnLCAnJ10NCiAgICAgICAgIiIiDQogICAgICAgIHNwbGl0cyA9IDANCiAgICAgICAgbGFzdCA9IDANCiAgICAgICAgZm9yIHQscyxlIGluIHNlbGYuc2NhblN0cmluZyhpbnN0cmluZywgbWF4TWF0Y2hlcz1tYXhzcGxpdCk6DQogICAgICAgICAgICB5aWVsZCBpbnN0cmluZ1tsYXN0OnNdDQogICAgICAgICAgICBpZiBpbmNsdWRlU2VwYXJhdG9yczoNCiAgICAgICAgICAgICAgICB5aWVsZCB0WzBdDQogICAgICAgICAgICBsYXN0ID0gZQ0KICAgICAgICB5aWVsZCBpbnN0cmluZ1tsYXN0Ol0NCg0KICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyICk6DQogICAgICAgICIiIg0KICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiArIG9wZXJhdG9yIC0gcmV0dXJucyBDe0x7QW5kfX0uIEFkZGluZyBzdHJpbmdzIHRvIGEgUGFyc2VyRWxlbWVudA0KICAgICAgICBjb252ZXJ0cyB0aGVtIHRvIEx7TGl0ZXJhbH1zIGJ5IGRlZmF1bHQuDQogICAgICAgIA0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIGdyZWV0ID0gV29yZChhbHBoYXMpICsgIiwiICsgV29yZChhbHBoYXMpICsgIiEiDQogICAgICAgICAgICBoZWxsbyA9ICJIZWxsbywgV29ybGQhIg0KICAgICAgICAgICAgcHJpbnQgKGhlbGxvLCAiLT4iLCBncmVldC5wYXJzZVN0cmluZyhoZWxsbykpDQogICAgICAgIFByaW50czo6DQogICAgICAgICAgICBIZWxsbywgV29ybGQhIC0+IFsnSGVsbG8nLCAnLCcsICdXb3JsZCcsICchJ10NCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQ0KICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSggb3RoZXIsIFBhcnNlckVsZW1lbnQgKToNCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNhbm5vdCBjb21iaW5lIGVsZW1lbnQgb2YgdHlwZSAlcyB3aXRoIFBhcnNlckVsZW1lbnQiICUgdHlwZShvdGhlciksDQogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgIHJldHVybiBOb25lDQogICAgICAgIHJldHVybiBBbmQoIFsgc2VsZiwgb3RoZXIgXSApDQoNCiAgICBkZWYgX19yYWRkX18oc2VsZiwgb3RoZXIgKToNCiAgICAgICAgIiIiDQogICAgICAgIEltcGxlbWVudGF0aW9uIG9mICsgb3BlcmF0b3Igd2hlbiBsZWZ0IG9wZXJhbmQgaXMgbm90IGEgQ3tMe1BhcnNlckVsZW1lbnR9fQ0KICAgICAgICAiIiINCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApDQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKCBvdGhlciwgUGFyc2VyRWxlbWVudCApOg0KICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ2Fubm90IGNvbWJpbmUgZWxlbWVudCBvZiB0eXBlICVzIHdpdGggUGFyc2VyRWxlbWVudCIgJSB0eXBlKG90aGVyKSwNCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KICAgICAgICAgICAgcmV0dXJuIE5vbmUNCiAgICAgICAgcmV0dXJuIG90aGVyICsgc2VsZg0KDQogICAgZGVmIF9fc3ViX18oc2VsZiwgb3RoZXIpOg0KICAgICAgICAiIiINCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgLSBvcGVyYXRvciwgcmV0dXJucyBDe0x7QW5kfX0gd2l0aCBlcnJvciBzdG9wDQogICAgICAgICIiIg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkNCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoIG90aGVyLCBQYXJzZXJFbGVtZW50ICk6DQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDYW5ub3QgY29tYmluZSBlbGVtZW50IG9mIHR5cGUgJXMgd2l0aCBQYXJzZXJFbGVtZW50IiAlIHR5cGUob3RoZXIpLA0KICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQogICAgICAgICAgICByZXR1cm4gTm9uZQ0KICAgICAgICByZXR1cm4gc2VsZiArIEFuZC5fRXJyb3JTdG9wKCkgKyBvdGhlcg0KDQogICAgZGVmIF9fcnN1Yl9fKHNlbGYsIG90aGVyICk6DQogICAgICAgICIiIg0KICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiAtIG9wZXJhdG9yIHdoZW4gbGVmdCBvcGVyYW5kIGlzIG5vdCBhIEN7THtQYXJzZXJFbGVtZW50fX0NCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQ0KICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSggb3RoZXIsIFBhcnNlckVsZW1lbnQgKToNCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNhbm5vdCBjb21iaW5lIGVsZW1lbnQgb2YgdHlwZSAlcyB3aXRoIFBhcnNlckVsZW1lbnQiICUgdHlwZShvdGhlciksDQogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgIHJldHVybiBOb25lDQogICAgICAgIHJldHVybiBvdGhlciAtIHNlbGYNCg0KICAgIGRlZiBfX211bF9fKHNlbGYsb3RoZXIpOg0KICAgICAgICAiIiINCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgKiBvcGVyYXRvciwgYWxsb3dzIHVzZSBvZiBDe2V4cHIgKiAzfSBpbiBwbGFjZSBvZg0KICAgICAgICBDe2V4cHIgKyBleHByICsgZXhwcn0uICBFeHByZXNzaW9ucyBtYXkgYWxzbyBtZSBtdWx0aXBsaWVkIGJ5IGEgMi1pbnRlZ2VyDQogICAgICAgIHR1cGxlLCBzaW1pbGFyIHRvIEN7e21pbixtYXh9fSBtdWx0aXBsaWVycyBpbiByZWd1bGFyIGV4cHJlc3Npb25zLiAgVHVwbGVzDQogICAgICAgIG1heSBhbHNvIGluY2x1ZGUgQ3tOb25lfSBhcyBpbjoNCiAgICAgICAgIC0gQ3tleHByKihuLE5vbmUpfSBvciBDe2V4cHIqKG4sKX0gaXMgZXF1aXZhbGVudA0KICAgICAgICAgICAgICB0byBDe2V4cHIqbiArIEx7WmVyb09yTW9yZX0oZXhwcil9DQogICAgICAgICAgICAgIChyZWFkIGFzICJhdCBsZWFzdCBuIGluc3RhbmNlcyBvZiBDe2V4cHJ9IikNCiAgICAgICAgIC0gQ3tleHByKihOb25lLG4pfSBpcyBlcXVpdmFsZW50IHRvIEN7ZXhwciooMCxuKX0NCiAgICAgICAgICAgICAgKHJlYWQgYXMgIjAgdG8gbiBpbnN0YW5jZXMgb2YgQ3tleHByfSIpDQogICAgICAgICAtIEN7ZXhwciooTm9uZSxOb25lKX0gaXMgZXF1aXZhbGVudCB0byBDe0x7WmVyb09yTW9yZX0oZXhwcil9DQogICAgICAgICAtIEN7ZXhwciooMSxOb25lKX0gaXMgZXF1aXZhbGVudCB0byBDe0x7T25lT3JNb3JlfShleHByKX0NCg0KICAgICAgICBOb3RlIHRoYXQgQ3tleHByKihOb25lLG4pfSBkb2VzIG5vdCByYWlzZSBhbiBleGNlcHRpb24gaWYNCiAgICAgICAgbW9yZSB0aGFuIG4gZXhwcnMgZXhpc3QgaW4gdGhlIGlucHV0IHN0cmVhbTsgdGhhdCBpcywNCiAgICAgICAgQ3tleHByKihOb25lLG4pfSBkb2VzIG5vdCBlbmZvcmNlIGEgbWF4aW11bSBudW1iZXIgb2YgZXhwcg0KICAgICAgICBvY2N1cnJlbmNlcy4gIElmIHRoaXMgYmVoYXZpb3IgaXMgZGVzaXJlZCwgdGhlbiB3cml0ZQ0KICAgICAgICBDe2V4cHIqKE5vbmUsbikgKyB+ZXhwcn0NCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsaW50KToNCiAgICAgICAgICAgIG1pbkVsZW1lbnRzLCBvcHRFbGVtZW50cyA9IG90aGVyLDANCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKG90aGVyLHR1cGxlKToNCiAgICAgICAgICAgIG90aGVyID0gKG90aGVyICsgKE5vbmUsIE5vbmUpKVs6Ml0NCiAgICAgICAgICAgIGlmIG90aGVyWzBdIGlzIE5vbmU6DQogICAgICAgICAgICAgICAgb3RoZXIgPSAoMCwgb3RoZXJbMV0pDQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyWzBdLGludCkgYW5kIG90aGVyWzFdIGlzIE5vbmU6DQogICAgICAgICAgICAgICAgaWYgb3RoZXJbMF0gPT0gMDoNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFplcm9Pck1vcmUoc2VsZikNCiAgICAgICAgICAgICAgICBpZiBvdGhlclswXSA9PSAxOg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gT25lT3JNb3JlKHNlbGYpDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYqb3RoZXJbMF0gKyBaZXJvT3JNb3JlKHNlbGYpDQogICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob3RoZXJbMF0saW50KSBhbmQgaXNpbnN0YW5jZShvdGhlclsxXSxpbnQpOg0KICAgICAgICAgICAgICAgIG1pbkVsZW1lbnRzLCBvcHRFbGVtZW50cyA9IG90aGVyDQogICAgICAgICAgICAgICAgb3B0RWxlbWVudHMgLT0gbWluRWxlbWVudHMNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJjYW5ub3QgbXVsdGlwbHkgJ1BhcnNlckVsZW1lbnQnIGFuZCAoJyVzJywnJXMnKSBvYmplY3RzIiwgdHlwZShvdGhlclswXSksdHlwZShvdGhlclsxXSkpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImNhbm5vdCBtdWx0aXBseSAnUGFyc2VyRWxlbWVudCcgYW5kICclcycgb2JqZWN0cyIsIHR5cGUob3RoZXIpKQ0KDQogICAgICAgIGlmIG1pbkVsZW1lbnRzIDwgMDoNCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImNhbm5vdCBtdWx0aXBseSBQYXJzZXJFbGVtZW50IGJ5IG5lZ2F0aXZlIHZhbHVlIikNCiAgICAgICAgaWYgb3B0RWxlbWVudHMgPCAwOg0KICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigic2Vjb25kIHR1cGxlIHZhbHVlIG11c3QgYmUgZ3JlYXRlciBvciBlcXVhbCB0byBmaXJzdCB0dXBsZSB2YWx1ZSIpDQogICAgICAgIGlmIG1pbkVsZW1lbnRzID09IG9wdEVsZW1lbnRzID09IDA6DQogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJjYW5ub3QgbXVsdGlwbHkgUGFyc2VyRWxlbWVudCBieSAwIG9yICgwLDApIikNCg0KICAgICAgICBpZiAob3B0RWxlbWVudHMpOg0KICAgICAgICAgICAgZGVmIG1ha2VPcHRpb25hbExpc3Qobik6DQogICAgICAgICAgICAgICAgaWYgbj4xOg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwoc2VsZiArIG1ha2VPcHRpb25hbExpc3Qobi0xKSkNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwoc2VsZikNCiAgICAgICAgICAgIGlmIG1pbkVsZW1lbnRzOg0KICAgICAgICAgICAgICAgIGlmIG1pbkVsZW1lbnRzID09IDE6DQogICAgICAgICAgICAgICAgICAgIHJldCA9IHNlbGYgKyBtYWtlT3B0aW9uYWxMaXN0KG9wdEVsZW1lbnRzKQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIHJldCA9IEFuZChbc2VsZl0qbWluRWxlbWVudHMpICsgbWFrZU9wdGlvbmFsTGlzdChvcHRFbGVtZW50cykNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcmV0ID0gbWFrZU9wdGlvbmFsTGlzdChvcHRFbGVtZW50cykNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIGlmIG1pbkVsZW1lbnRzID09IDE6DQogICAgICAgICAgICAgICAgcmV0ID0gc2VsZg0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICByZXQgPSBBbmQoW3NlbGZdKm1pbkVsZW1lbnRzKQ0KICAgICAgICByZXR1cm4gcmV0DQoNCiAgICBkZWYgX19ybXVsX18oc2VsZiwgb3RoZXIpOg0KICAgICAgICByZXR1cm4gc2VsZi5fX211bF9fKG90aGVyKQ0KDQogICAgZGVmIF9fb3JfXyhzZWxmLCBvdGhlciApOg0KICAgICAgICAiIiINCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgfCBvcGVyYXRvciAtIHJldHVybnMgQ3tMe01hdGNoRmlyc3R9fQ0KICAgICAgICAiIiINCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApDQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKCBvdGhlciwgUGFyc2VyRWxlbWVudCApOg0KICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ2Fubm90IGNvbWJpbmUgZWxlbWVudCBvZiB0eXBlICVzIHdpdGggUGFyc2VyRWxlbWVudCIgJSB0eXBlKG90aGVyKSwNCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KICAgICAgICAgICAgcmV0dXJuIE5vbmUNCiAgICAgICAgcmV0dXJuIE1hdGNoRmlyc3QoIFsgc2VsZiwgb3RoZXIgXSApDQoNCiAgICBkZWYgX19yb3JfXyhzZWxmLCBvdGhlciApOg0KICAgICAgICAiIiINCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgfCBvcGVyYXRvciB3aGVuIGxlZnQgb3BlcmFuZCBpcyBub3QgYSBDe0x7UGFyc2VyRWxlbWVudH19DQogICAgICAgICIiIg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkNCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoIG90aGVyLCBQYXJzZXJFbGVtZW50ICk6DQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDYW5ub3QgY29tYmluZSBlbGVtZW50IG9mIHR5cGUgJXMgd2l0aCBQYXJzZXJFbGVtZW50IiAlIHR5cGUob3RoZXIpLA0KICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQogICAgICAgICAgICByZXR1cm4gTm9uZQ0KICAgICAgICByZXR1cm4gb3RoZXIgfCBzZWxmDQoNCiAgICBkZWYgX194b3JfXyhzZWxmLCBvdGhlciApOg0KICAgICAgICAiIiINCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgXiBvcGVyYXRvciAtIHJldHVybnMgQ3tMe09yfX0NCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQ0KICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSggb3RoZXIsIFBhcnNlckVsZW1lbnQgKToNCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNhbm5vdCBjb21iaW5lIGVsZW1lbnQgb2YgdHlwZSAlcyB3aXRoIFBhcnNlckVsZW1lbnQiICUgdHlwZShvdGhlciksDQogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgIHJldHVybiBOb25lDQogICAgICAgIHJldHVybiBPciggWyBzZWxmLCBvdGhlciBdICkNCg0KICAgIGRlZiBfX3J4b3JfXyhzZWxmLCBvdGhlciApOg0KICAgICAgICAiIiINCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgXiBvcGVyYXRvciB3aGVuIGxlZnQgb3BlcmFuZCBpcyBub3QgYSBDe0x7UGFyc2VyRWxlbWVudH19DQogICAgICAgICIiIg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkNCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoIG90aGVyLCBQYXJzZXJFbGVtZW50ICk6DQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDYW5ub3QgY29tYmluZSBlbGVtZW50IG9mIHR5cGUgJXMgd2l0aCBQYXJzZXJFbGVtZW50IiAlIHR5cGUob3RoZXIpLA0KICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQogICAgICAgICAgICByZXR1cm4gTm9uZQ0KICAgICAgICByZXR1cm4gb3RoZXIgXiBzZWxmDQoNCiAgICBkZWYgX19hbmRfXyhzZWxmLCBvdGhlciApOg0KICAgICAgICAiIiINCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgJiBvcGVyYXRvciAtIHJldHVybnMgQ3tMe0VhY2h9fQ0KICAgICAgICAiIiINCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApDQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKCBvdGhlciwgUGFyc2VyRWxlbWVudCApOg0KICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ2Fubm90IGNvbWJpbmUgZWxlbWVudCBvZiB0eXBlICVzIHdpdGggUGFyc2VyRWxlbWVudCIgJSB0eXBlKG90aGVyKSwNCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KICAgICAgICAgICAgcmV0dXJuIE5vbmUNCiAgICAgICAgcmV0dXJuIEVhY2goIFsgc2VsZiwgb3RoZXIgXSApDQoNCiAgICBkZWYgX19yYW5kX18oc2VsZiwgb3RoZXIgKToNCiAgICAgICAgIiIiDQogICAgICAgIEltcGxlbWVudGF0aW9uIG9mICYgb3BlcmF0b3Igd2hlbiBsZWZ0IG9wZXJhbmQgaXMgbm90IGEgQ3tMe1BhcnNlckVsZW1lbnR9fQ0KICAgICAgICAiIiINCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApDQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKCBvdGhlciwgUGFyc2VyRWxlbWVudCApOg0KICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ2Fubm90IGNvbWJpbmUgZWxlbWVudCBvZiB0eXBlICVzIHdpdGggUGFyc2VyRWxlbWVudCIgJSB0eXBlKG90aGVyKSwNCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KICAgICAgICAgICAgcmV0dXJuIE5vbmUNCiAgICAgICAgcmV0dXJuIG90aGVyICYgc2VsZg0KDQogICAgZGVmIF9faW52ZXJ0X18oIHNlbGYgKToNCiAgICAgICAgIiIiDQogICAgICAgIEltcGxlbWVudGF0aW9uIG9mIH4gb3BlcmF0b3IgLSByZXR1cm5zIEN7THtOb3RBbnl9fQ0KICAgICAgICAiIiINCiAgICAgICAgcmV0dXJuIE5vdEFueSggc2VsZiApDQoNCiAgICBkZWYgX19jYWxsX18oc2VsZiwgbmFtZT1Ob25lKToNCiAgICAgICAgIiIiDQogICAgICAgIFNob3J0Y3V0IGZvciBDe0x7c2V0UmVzdWx0c05hbWV9fSwgd2l0aCBDe2xpc3RBbGxNYXRjaGVzPUZhbHNlfS4NCiAgICAgICAgDQogICAgICAgIElmIEN7bmFtZX0gaXMgZ2l2ZW4gd2l0aCBhIHRyYWlsaW5nIEN7JyonfSBjaGFyYWN0ZXIsIHRoZW4gQ3tsaXN0QWxsTWF0Y2hlc30gd2lsbCBiZQ0KICAgICAgICBwYXNzZWQgYXMgQ3tUcnVlfS4NCiAgICAgICAgICAgDQogICAgICAgIElmIEN7bmFtZX0gaXMgb21pdHRlZCwgc2FtZSBhcyBjYWxsaW5nIEN7THtjb3B5fX0uDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICAjIHRoZXNlIGFyZSBlcXVpdmFsZW50DQogICAgICAgICAgICB1c2VyZGF0YSA9IFdvcmQoYWxwaGFzKS5zZXRSZXN1bHRzTmFtZSgibmFtZSIpICsgV29yZChudW1zKyItIikuc2V0UmVzdWx0c05hbWUoInNvY3NlY25vIikNCiAgICAgICAgICAgIHVzZXJkYXRhID0gV29yZChhbHBoYXMpKCJuYW1lIikgKyBXb3JkKG51bXMrIi0iKSgic29jc2Vjbm8iKSAgICAgICAgICAgICANCiAgICAgICAgIiIiDQogICAgICAgIGlmIG5hbWUgaXMgbm90IE5vbmU6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5zZXRSZXN1bHRzTmFtZShuYW1lKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29weSgpDQoNCiAgICBkZWYgc3VwcHJlc3MoIHNlbGYgKToNCiAgICAgICAgIiIiDQogICAgICAgIFN1cHByZXNzZXMgdGhlIG91dHB1dCBvZiB0aGlzIEN7UGFyc2VyRWxlbWVudH07IHVzZWZ1bCB0byBrZWVwIHB1bmN0dWF0aW9uIGZyb20NCiAgICAgICAgY2x1dHRlcmluZyB1cCByZXR1cm5lZCBvdXRwdXQuDQogICAgICAgICIiIg0KICAgICAgICByZXR1cm4gU3VwcHJlc3MoIHNlbGYgKQ0KDQogICAgZGVmIGxlYXZlV2hpdGVzcGFjZSggc2VsZiApOg0KICAgICAgICAiIiINCiAgICAgICAgRGlzYWJsZXMgdGhlIHNraXBwaW5nIG9mIHdoaXRlc3BhY2UgYmVmb3JlIG1hdGNoaW5nIHRoZSBjaGFyYWN0ZXJzIGluIHRoZQ0KICAgICAgICBDe1BhcnNlckVsZW1lbnR9J3MgZGVmaW5lZCBwYXR0ZXJuLiAgVGhpcyBpcyBub3JtYWxseSBvbmx5IHVzZWQgaW50ZXJuYWxseSBieQ0KICAgICAgICB0aGUgcHlwYXJzaW5nIG1vZHVsZSwgYnV0IG1heSBiZSBuZWVkZWQgaW4gc29tZSB3aGl0ZXNwYWNlLXNlbnNpdGl2ZSBncmFtbWFycy4NCiAgICAgICAgIiIiDQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBGYWxzZQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIHNldFdoaXRlc3BhY2VDaGFycyggc2VsZiwgY2hhcnMgKToNCiAgICAgICAgIiIiDQogICAgICAgIE92ZXJyaWRlcyB0aGUgZGVmYXVsdCB3aGl0ZXNwYWNlIGNoYXJzDQogICAgICAgICIiIg0KICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gVHJ1ZQ0KICAgICAgICBzZWxmLndoaXRlQ2hhcnMgPSBjaGFycw0KICAgICAgICBzZWxmLmNvcHlEZWZhdWx0V2hpdGVDaGFycyA9IEZhbHNlDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgcGFyc2VXaXRoVGFicyggc2VsZiApOg0KICAgICAgICAiIiINCiAgICAgICAgT3ZlcnJpZGVzIGRlZmF1bHQgYmVoYXZpb3IgdG8gZXhwYW5kIEN7PFRBQj59cyB0byBzcGFjZXMgYmVmb3JlIHBhcnNpbmcgdGhlIGlucHV0IHN0cmluZy4NCiAgICAgICAgTXVzdCBiZSBjYWxsZWQgYmVmb3JlIEN7cGFyc2VTdHJpbmd9IHdoZW4gdGhlIGlucHV0IGdyYW1tYXIgY29udGFpbnMgZWxlbWVudHMgdGhhdA0KICAgICAgICBtYXRjaCBDezxUQUI+fSBjaGFyYWN0ZXJzLg0KICAgICAgICAiIiINCiAgICAgICAgc2VsZi5rZWVwVGFicyA9IFRydWUNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBpZ25vcmUoIHNlbGYsIG90aGVyICk6DQogICAgICAgICIiIg0KICAgICAgICBEZWZpbmUgZXhwcmVzc2lvbiB0byBiZSBpZ25vcmVkIChlLmcuLCBjb21tZW50cykgd2hpbGUgZG9pbmcgcGF0dGVybg0KICAgICAgICBtYXRjaGluZzsgbWF5IGJlIGNhbGxlZCByZXBlYXRlZGx5LCB0byBkZWZpbmUgbXVsdGlwbGUgY29tbWVudCBvciBvdGhlcg0KICAgICAgICBpZ25vcmFibGUgcGF0dGVybnMuDQogICAgICAgIA0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIHBhdHQgPSBPbmVPck1vcmUoV29yZChhbHBoYXMpKQ0KICAgICAgICAgICAgcGF0dC5wYXJzZVN0cmluZygnYWJsYWogLyogY29tbWVudCAqLyBsc2tqZCcpICMgLT4gWydhYmxhaiddDQogICAgICAgICAgICANCiAgICAgICAgICAgIHBhdHQuaWdub3JlKGNTdHlsZUNvbW1lbnQpDQogICAgICAgICAgICBwYXR0LnBhcnNlU3RyaW5nKCdhYmxhaiAvKiBjb21tZW50ICovIGxza2pkJykgIyAtPiBbJ2FibGFqJywgJ2xza2pkJ10NCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGJhc2VzdHJpbmcpOg0KICAgICAgICAgICAgb3RoZXIgPSBTdXBwcmVzcyhvdGhlcikNCg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgU3VwcHJlc3MgKToNCiAgICAgICAgICAgIGlmIG90aGVyIG5vdCBpbiBzZWxmLmlnbm9yZUV4cHJzOg0KICAgICAgICAgICAgICAgIHNlbGYuaWdub3JlRXhwcnMuYXBwZW5kKG90aGVyKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc2VsZi5pZ25vcmVFeHBycy5hcHBlbmQoIFN1cHByZXNzKCBvdGhlci5jb3B5KCkgKSApDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgc2V0RGVidWdBY3Rpb25zKCBzZWxmLCBzdGFydEFjdGlvbiwgc3VjY2Vzc0FjdGlvbiwgZXhjZXB0aW9uQWN0aW9uICk6DQogICAgICAgICIiIg0KICAgICAgICBFbmFibGUgZGlzcGxheSBvZiBkZWJ1Z2dpbmcgbWVzc2FnZXMgd2hpbGUgZG9pbmcgcGF0dGVybiBtYXRjaGluZy4NCiAgICAgICAgIiIiDQogICAgICAgIHNlbGYuZGVidWdBY3Rpb25zID0gKHN0YXJ0QWN0aW9uIG9yIF9kZWZhdWx0U3RhcnREZWJ1Z0FjdGlvbiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc0FjdGlvbiBvciBfZGVmYXVsdFN1Y2Nlc3NEZWJ1Z0FjdGlvbiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uQWN0aW9uIG9yIF9kZWZhdWx0RXhjZXB0aW9uRGVidWdBY3Rpb24pDQogICAgICAgIHNlbGYuZGVidWcgPSBUcnVlDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgc2V0RGVidWcoIHNlbGYsIGZsYWc9VHJ1ZSApOg0KICAgICAgICAiIiINCiAgICAgICAgRW5hYmxlIGRpc3BsYXkgb2YgZGVidWdnaW5nIG1lc3NhZ2VzIHdoaWxlIGRvaW5nIHBhdHRlcm4gbWF0Y2hpbmcuDQogICAgICAgIFNldCBDe2ZsYWd9IHRvIFRydWUgdG8gZW5hYmxlLCBGYWxzZSB0byBkaXNhYmxlLg0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgd2QgPSBXb3JkKGFscGhhcykuc2V0TmFtZSgiYWxwaGF3b3JkIikNCiAgICAgICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpLnNldE5hbWUoIm51bXdvcmQiKQ0KICAgICAgICAgICAgdGVybSA9IHdkIHwgaW50ZWdlcg0KICAgICAgICAgICAgDQogICAgICAgICAgICAjIHR1cm4gb24gZGVidWdnaW5nIGZvciB3ZA0KICAgICAgICAgICAgd2Quc2V0RGVidWcoKQ0KDQogICAgICAgICAgICBPbmVPck1vcmUodGVybSkucGFyc2VTdHJpbmcoImFiYyAxMjMgeHl6IDg5MCIpDQogICAgICAgIA0KICAgICAgICBwcmludHM6Og0KICAgICAgICAgICAgTWF0Y2ggYWxwaGF3b3JkIGF0IGxvYyAwKDEsMSkNCiAgICAgICAgICAgIE1hdGNoZWQgYWxwaGF3b3JkIC0+IFsnYWJjJ10NCiAgICAgICAgICAgIE1hdGNoIGFscGhhd29yZCBhdCBsb2MgMygxLDQpDQogICAgICAgICAgICBFeGNlcHRpb24gcmFpc2VkOkV4cGVjdGVkIGFscGhhd29yZCAoYXQgY2hhciA0KSwgKGxpbmU6MSwgY29sOjUpDQogICAgICAgICAgICBNYXRjaCBhbHBoYXdvcmQgYXQgbG9jIDcoMSw4KQ0KICAgICAgICAgICAgTWF0Y2hlZCBhbHBoYXdvcmQgLT4gWyd4eXonXQ0KICAgICAgICAgICAgTWF0Y2ggYWxwaGF3b3JkIGF0IGxvYyAxMSgxLDEyKQ0KICAgICAgICAgICAgRXhjZXB0aW9uIHJhaXNlZDpFeHBlY3RlZCBhbHBoYXdvcmQgKGF0IGNoYXIgMTIpLCAobGluZToxLCBjb2w6MTMpDQogICAgICAgICAgICBNYXRjaCBhbHBoYXdvcmQgYXQgbG9jIDE1KDEsMTYpDQogICAgICAgICAgICBFeGNlcHRpb24gcmFpc2VkOkV4cGVjdGVkIGFscGhhd29yZCAoYXQgY2hhciAxNSksIChsaW5lOjEsIGNvbDoxNikNCg0KICAgICAgICBUaGUgb3V0cHV0IHNob3duIGlzIHRoYXQgcHJvZHVjZWQgYnkgdGhlIGRlZmF1bHQgZGVidWcgYWN0aW9ucyAtIGN1c3RvbSBkZWJ1ZyBhY3Rpb25zIGNhbiBiZQ0KICAgICAgICBzcGVjaWZpZWQgdXNpbmcgTHtzZXREZWJ1Z0FjdGlvbnN9LiBQcmlvciB0byBhdHRlbXB0aW5nDQogICAgICAgIHRvIG1hdGNoIHRoZSBDe3dkfSBleHByZXNzaW9uLCB0aGUgZGVidWdnaW5nIG1lc3NhZ2UgQ3siTWF0Y2ggPGV4cHJuYW1lPiBhdCBsb2MgPG4+KDxsaW5lPiw8Y29sPikifQ0KICAgICAgICBpcyBzaG93bi4gVGhlbiBpZiB0aGUgcGFyc2Ugc3VjY2VlZHMsIGEgQ3siTWF0Y2hlZCJ9IG1lc3NhZ2UgaXMgc2hvd24sIG9yIGFuIEN7IkV4Y2VwdGlvbiByYWlzZWQifQ0KICAgICAgICBtZXNzYWdlIGlzIHNob3duLiBBbHNvIG5vdGUgdGhlIHVzZSBvZiBMe3NldE5hbWV9IHRvIGFzc2lnbiBhIGh1bWFuLXJlYWRhYmxlIG5hbWUgdG8gdGhlIGV4cHJlc3Npb24sDQogICAgICAgIHdoaWNoIG1ha2VzIGRlYnVnZ2luZyBhbmQgZXhjZXB0aW9uIG1lc3NhZ2VzIGVhc2llciB0byB1bmRlcnN0YW5kIC0gZm9yIGluc3RhbmNlLCB0aGUgZGVmYXVsdA0KICAgICAgICBuYW1lIGNyZWF0ZWQgZm9yIHRoZSBDe1dvcmR9IGV4cHJlc3Npb24gd2l0aG91dCBjYWxsaW5nIEN7c2V0TmFtZX0gaXMgQ3siVzooQUJDRC4uLikifS4NCiAgICAgICAgIiIiDQogICAgICAgIGlmIGZsYWc6DQogICAgICAgICAgICBzZWxmLnNldERlYnVnQWN0aW9ucyggX2RlZmF1bHRTdGFydERlYnVnQWN0aW9uLCBfZGVmYXVsdFN1Y2Nlc3NEZWJ1Z0FjdGlvbiwgX2RlZmF1bHRFeGNlcHRpb25EZWJ1Z0FjdGlvbiApDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzZWxmLmRlYnVnID0gRmFsc2UNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIHJldHVybiBzZWxmLm5hbWUNCg0KICAgIGRlZiBfX3JlcHJfXyggc2VsZiApOg0KICAgICAgICByZXR1cm4gX3VzdHIoc2VsZikNCg0KICAgIGRlZiBzdHJlYW1saW5lKCBzZWxmICk6DQogICAgICAgIHNlbGYuc3RyZWFtbGluZWQgPSBUcnVlDQogICAgICAgIHNlbGYuc3RyUmVwciA9IE5vbmUNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBjaGVja1JlY3Vyc2lvbiggc2VsZiwgcGFyc2VFbGVtZW50TGlzdCApOg0KICAgICAgICBwYXNzDQoNCiAgICBkZWYgdmFsaWRhdGUoIHNlbGYsIHZhbGlkYXRlVHJhY2U9W10gKToNCiAgICAgICAgIiIiDQogICAgICAgIENoZWNrIGRlZmluZWQgZXhwcmVzc2lvbnMgZm9yIHZhbGlkIHN0cnVjdHVyZSwgY2hlY2sgZm9yIGluZmluaXRlIHJlY3Vyc2l2ZSBkZWZpbml0aW9ucy4NCiAgICAgICAgIiIiDQogICAgICAgIHNlbGYuY2hlY2tSZWN1cnNpb24oIFtdICkNCg0KICAgIGRlZiBwYXJzZUZpbGUoIHNlbGYsIGZpbGVfb3JfZmlsZW5hbWUsIHBhcnNlQWxsPUZhbHNlICk6DQogICAgICAgICIiIg0KICAgICAgICBFeGVjdXRlIHRoZSBwYXJzZSBleHByZXNzaW9uIG9uIHRoZSBnaXZlbiBmaWxlIG9yIGZpbGVuYW1lLg0KICAgICAgICBJZiBhIGZpbGVuYW1lIGlzIHNwZWNpZmllZCAoaW5zdGVhZCBvZiBhIGZpbGUgb2JqZWN0KSwNCiAgICAgICAgdGhlIGVudGlyZSBmaWxlIGlzIG9wZW5lZCwgcmVhZCwgYW5kIGNsb3NlZCBiZWZvcmUgcGFyc2luZy4NCiAgICAgICAgIiIiDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIGZpbGVfY29udGVudHMgPSBmaWxlX29yX2ZpbGVuYW1lLnJlYWQoKQ0KICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6DQogICAgICAgICAgICB3aXRoIG9wZW4oZmlsZV9vcl9maWxlbmFtZSwgInIiKSBhcyBmOg0KICAgICAgICAgICAgICAgIGZpbGVfY29udGVudHMgPSBmLnJlYWQoKQ0KICAgICAgICB0cnk6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZVN0cmluZyhmaWxlX2NvbnRlbnRzLCBwYXJzZUFsbCkNCiAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbiBhcyBleGM6DQogICAgICAgICAgICBpZiBQYXJzZXJFbGVtZW50LnZlcmJvc2Vfc3RhY2t0cmFjZToNCiAgICAgICAgICAgICAgICByYWlzZQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAjIGNhdGNoIGFuZCByZS1yYWlzZSBleGNlcHRpb24gZnJvbSBoZXJlLCBjbGVhcnMgb3V0IHB5cGFyc2luZyBpbnRlcm5hbCBzdGFjayB0cmFjZQ0KICAgICAgICAgICAgICAgIHJhaXNlIGV4Yw0KDQogICAgZGVmIF9fZXFfXyhzZWxmLG90aGVyKToNCiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgUGFyc2VyRWxlbWVudCk6DQogICAgICAgICAgICByZXR1cm4gc2VsZiBpcyBvdGhlciBvciB2YXJzKHNlbGYpID09IHZhcnMob3RoZXIpDQogICAgICAgIGVsaWYgaXNpbnN0YW5jZShvdGhlciwgYmFzZXN0cmluZyk6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5tYXRjaGVzKG90aGVyKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmV0dXJuIHN1cGVyKFBhcnNlckVsZW1lbnQsc2VsZik9PW90aGVyDQoNCiAgICBkZWYgX19uZV9fKHNlbGYsb3RoZXIpOg0KICAgICAgICByZXR1cm4gbm90IChzZWxmID09IG90aGVyKQ0KDQogICAgZGVmIF9faGFzaF9fKHNlbGYpOg0KICAgICAgICByZXR1cm4gaGFzaChpZChzZWxmKSkNCg0KICAgIGRlZiBfX3JlcV9fKHNlbGYsb3RoZXIpOg0KICAgICAgICByZXR1cm4gc2VsZiA9PSBvdGhlcg0KDQogICAgZGVmIF9fcm5lX18oc2VsZixvdGhlcik6DQogICAgICAgIHJldHVybiBub3QgKHNlbGYgPT0gb3RoZXIpDQoNCiAgICBkZWYgbWF0Y2hlcyhzZWxmLCB0ZXN0U3RyaW5nLCBwYXJzZUFsbD1UcnVlKToNCiAgICAgICAgIiIiDQogICAgICAgIE1ldGhvZCBmb3IgcXVpY2sgdGVzdGluZyBvZiBhIHBhcnNlciBhZ2FpbnN0IGEgdGVzdCBzdHJpbmcuIEdvb2QgZm9yIHNpbXBsZSANCiAgICAgICAgaW5saW5lIG1pY3JvdGVzdHMgb2Ygc3ViIGV4cHJlc3Npb25zIHdoaWxlIGJ1aWxkaW5nIHVwIGxhcmdlciBwYXJzZXIuDQogICAgICAgICAgIA0KICAgICAgICBQYXJhbWV0ZXJzOg0KICAgICAgICAgLSB0ZXN0U3RyaW5nIC0gdG8gdGVzdCBhZ2FpbnN0IHRoaXMgZXhwcmVzc2lvbiBmb3IgYSBtYXRjaA0KICAgICAgICAgLSBwYXJzZUFsbCAtIChkZWZhdWx0PUN7VHJ1ZX0pIC0gZmxhZyB0byBwYXNzIHRvIEN7THtwYXJzZVN0cmluZ319IHdoZW4gcnVubmluZyB0ZXN0cw0KICAgICAgICAgICAgDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgZXhwciA9IFdvcmQobnVtcykNCiAgICAgICAgICAgIGFzc2VydCBleHByLm1hdGNoZXMoIjEwMCIpDQogICAgICAgICIiIg0KICAgICAgICB0cnk6DQogICAgICAgICAgICBzZWxmLnBhcnNlU3RyaW5nKF91c3RyKHRlc3RTdHJpbmcpLCBwYXJzZUFsbD1wYXJzZUFsbCkNCiAgICAgICAgICAgIHJldHVybiBUcnVlDQogICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb246DQogICAgICAgICAgICByZXR1cm4gRmFsc2UNCiAgICAgICAgICAgICAgICANCiAgICBkZWYgcnVuVGVzdHMoc2VsZiwgdGVzdHMsIHBhcnNlQWxsPVRydWUsIGNvbW1lbnQ9JyMnLCBmdWxsRHVtcD1UcnVlLCBwcmludFJlc3VsdHM9VHJ1ZSwgZmFpbHVyZVRlc3RzPUZhbHNlKToNCiAgICAgICAgIiIiDQogICAgICAgIEV4ZWN1dGUgdGhlIHBhcnNlIGV4cHJlc3Npb24gb24gYSBzZXJpZXMgb2YgdGVzdCBzdHJpbmdzLCBzaG93aW5nIGVhY2gNCiAgICAgICAgdGVzdCwgdGhlIHBhcnNlZCByZXN1bHRzIG9yIHdoZXJlIHRoZSBwYXJzZSBmYWlsZWQuIFF1aWNrIGFuZCBlYXN5IHdheSB0bw0KICAgICAgICBydW4gYSBwYXJzZSBleHByZXNzaW9uIGFnYWluc3QgYSBsaXN0IG9mIHNhbXBsZSBzdHJpbmdzLg0KICAgICAgICAgICANCiAgICAgICAgUGFyYW1ldGVyczoNCiAgICAgICAgIC0gdGVzdHMgLSBhIGxpc3Qgb2Ygc2VwYXJhdGUgdGVzdCBzdHJpbmdzLCBvciBhIG11bHRpbGluZSBzdHJpbmcgb2YgdGVzdCBzdHJpbmdzDQogICAgICAgICAtIHBhcnNlQWxsIC0gKGRlZmF1bHQ9Q3tUcnVlfSkgLSBmbGFnIHRvIHBhc3MgdG8gQ3tMe3BhcnNlU3RyaW5nfX0gd2hlbiBydW5uaW5nIHRlc3RzICAgICAgICAgICANCiAgICAgICAgIC0gY29tbWVudCAtIChkZWZhdWx0PUN7JyMnfSkgLSBleHByZXNzaW9uIGZvciBpbmRpY2F0aW5nIGVtYmVkZGVkIGNvbW1lbnRzIGluIHRoZSB0ZXN0IA0KICAgICAgICAgICAgICBzdHJpbmc7IHBhc3MgTm9uZSB0byBkaXNhYmxlIGNvbW1lbnQgZmlsdGVyaW5nDQogICAgICAgICAtIGZ1bGxEdW1wIC0gKGRlZmF1bHQ9Q3tUcnVlfSkgLSBkdW1wIHJlc3VsdHMgYXMgbGlzdCBmb2xsb3dlZCBieSByZXN1bHRzIG5hbWVzIGluIG5lc3RlZCBvdXRsaW5lOw0KICAgICAgICAgICAgICBpZiBGYWxzZSwgb25seSBkdW1wIG5lc3RlZCBsaXN0DQogICAgICAgICAtIHByaW50UmVzdWx0cyAtIChkZWZhdWx0PUN7VHJ1ZX0pIHByaW50cyB0ZXN0IG91dHB1dCB0byBzdGRvdXQNCiAgICAgICAgIC0gZmFpbHVyZVRlc3RzIC0gKGRlZmF1bHQ9Q3tGYWxzZX0pIGluZGljYXRlcyBpZiB0aGVzZSB0ZXN0cyBhcmUgZXhwZWN0ZWQgdG8gZmFpbCBwYXJzaW5nDQoNCiAgICAgICAgUmV0dXJuczogYSAoc3VjY2VzcywgcmVzdWx0cykgdHVwbGUsIHdoZXJlIHN1Y2Nlc3MgaW5kaWNhdGVzIHRoYXQgYWxsIHRlc3RzIHN1Y2NlZWRlZA0KICAgICAgICAob3IgZmFpbGVkIGlmIEN7ZmFpbHVyZVRlc3RzfSBpcyBUcnVlKSwgYW5kIHRoZSByZXN1bHRzIGNvbnRhaW4gYSBsaXN0IG9mIGxpbmVzIG9mIGVhY2ggDQogICAgICAgIHRlc3QncyBvdXRwdXQNCiAgICAgICAgDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgbnVtYmVyX2V4cHIgPSBweXBhcnNpbmdfY29tbW9uLm51bWJlci5jb3B5KCkNCg0KICAgICAgICAgICAgcmVzdWx0ID0gbnVtYmVyX2V4cHIucnVuVGVzdHMoJycnDQogICAgICAgICAgICAgICAgIyB1bnNpZ25lZCBpbnRlZ2VyDQogICAgICAgICAgICAgICAgMTAwDQogICAgICAgICAgICAgICAgIyBuZWdhdGl2ZSBpbnRlZ2VyDQogICAgICAgICAgICAgICAgLTEwMA0KICAgICAgICAgICAgICAgICMgZmxvYXQgd2l0aCBzY2llbnRpZmljIG5vdGF0aW9uDQogICAgICAgICAgICAgICAgNi4wMmUyMw0KICAgICAgICAgICAgICAgICMgaW50ZWdlciB3aXRoIHNjaWVudGlmaWMgbm90YXRpb24NCiAgICAgICAgICAgICAgICAxZS0xMg0KICAgICAgICAgICAgICAgICcnJykNCiAgICAgICAgICAgIHByaW50KCJTdWNjZXNzIiBpZiByZXN1bHRbMF0gZWxzZSAiRmFpbGVkISIpDQoNCiAgICAgICAgICAgIHJlc3VsdCA9IG51bWJlcl9leHByLnJ1blRlc3RzKCcnJw0KICAgICAgICAgICAgICAgICMgc3RyYXkgY2hhcmFjdGVyDQogICAgICAgICAgICAgICAgMTAwWg0KICAgICAgICAgICAgICAgICMgbWlzc2luZyBsZWFkaW5nIGRpZ2l0IGJlZm9yZSAnLicNCiAgICAgICAgICAgICAgICAtLjEwMA0KICAgICAgICAgICAgICAgICMgdG9vIG1hbnkgJy4nDQogICAgICAgICAgICAgICAgMy4xNC4xNTkNCiAgICAgICAgICAgICAgICAnJycsIGZhaWx1cmVUZXN0cz1UcnVlKQ0KICAgICAgICAgICAgcHJpbnQoIlN1Y2Nlc3MiIGlmIHJlc3VsdFswXSBlbHNlICJGYWlsZWQhIikNCiAgICAgICAgcHJpbnRzOjoNCiAgICAgICAgICAgICMgdW5zaWduZWQgaW50ZWdlcg0KICAgICAgICAgICAgMTAwDQogICAgICAgICAgICBbMTAwXQ0KDQogICAgICAgICAgICAjIG5lZ2F0aXZlIGludGVnZXINCiAgICAgICAgICAgIC0xMDANCiAgICAgICAgICAgIFstMTAwXQ0KDQogICAgICAgICAgICAjIGZsb2F0IHdpdGggc2NpZW50aWZpYyBub3RhdGlvbg0KICAgICAgICAgICAgNi4wMmUyMw0KICAgICAgICAgICAgWzYuMDJlKzIzXQ0KDQogICAgICAgICAgICAjIGludGVnZXIgd2l0aCBzY2llbnRpZmljIG5vdGF0aW9uDQogICAgICAgICAgICAxZS0xMg0KICAgICAgICAgICAgWzFlLTEyXQ0KDQogICAgICAgICAgICBTdWNjZXNzDQogICAgICAgICAgICANCiAgICAgICAgICAgICMgc3RyYXkgY2hhcmFjdGVyDQogICAgICAgICAgICAxMDBaDQogICAgICAgICAgICAgICBeDQogICAgICAgICAgICBGQUlMOiBFeHBlY3RlZCBlbmQgb2YgdGV4dCAoYXQgY2hhciAzKSwgKGxpbmU6MSwgY29sOjQpDQoNCiAgICAgICAgICAgICMgbWlzc2luZyBsZWFkaW5nIGRpZ2l0IGJlZm9yZSAnLicNCiAgICAgICAgICAgIC0uMTAwDQogICAgICAgICAgICBeDQogICAgICAgICAgICBGQUlMOiBFeHBlY3RlZCB7cmVhbCBudW1iZXIgd2l0aCBzY2llbnRpZmljIG5vdGF0aW9uIHwgcmVhbCBudW1iZXIgfCBzaWduZWQgaW50ZWdlcn0gKGF0IGNoYXIgMCksIChsaW5lOjEsIGNvbDoxKQ0KDQogICAgICAgICAgICAjIHRvbyBtYW55ICcuJw0KICAgICAgICAgICAgMy4xNC4xNTkNCiAgICAgICAgICAgICAgICBeDQogICAgICAgICAgICBGQUlMOiBFeHBlY3RlZCBlbmQgb2YgdGV4dCAoYXQgY2hhciA0KSwgKGxpbmU6MSwgY29sOjUpDQoNCiAgICAgICAgICAgIFN1Y2Nlc3MNCg0KICAgICAgICBFYWNoIHRlc3Qgc3RyaW5nIG11c3QgYmUgb24gYSBzaW5nbGUgbGluZS4gSWYgeW91IHdhbnQgdG8gdGVzdCBhIHN0cmluZyB0aGF0IHNwYW5zIG11bHRpcGxlDQogICAgICAgIGxpbmVzLCBjcmVhdGUgYSB0ZXN0IGxpa2UgdGhpczo6DQoNCiAgICAgICAgICAgIGV4cHIucnVuVGVzdChyInRoaXMgaXMgYSB0ZXN0XFxuIG9mIHN0cmluZ3MgdGhhdCBzcGFucyBcXG4gMyBsaW5lcyIpDQogICAgICAgIA0KICAgICAgICAoTm90ZSB0aGF0IHRoaXMgaXMgYSByYXcgc3RyaW5nIGxpdGVyYWwsIHlvdSBtdXN0IGluY2x1ZGUgdGhlIGxlYWRpbmcgJ3InLikNCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2UodGVzdHMsIGJhc2VzdHJpbmcpOg0KICAgICAgICAgICAgdGVzdHMgPSBsaXN0KG1hcChzdHIuc3RyaXAsIHRlc3RzLnJzdHJpcCgpLnNwbGl0bGluZXMoKSkpDQogICAgICAgIGlmIGlzaW5zdGFuY2UoY29tbWVudCwgYmFzZXN0cmluZyk6DQogICAgICAgICAgICBjb21tZW50ID0gTGl0ZXJhbChjb21tZW50KQ0KICAgICAgICBhbGxSZXN1bHRzID0gW10NCiAgICAgICAgY29tbWVudHMgPSBbXQ0KICAgICAgICBzdWNjZXNzID0gVHJ1ZQ0KICAgICAgICBmb3IgdCBpbiB0ZXN0czoNCiAgICAgICAgICAgIGlmIGNvbW1lbnQgaXMgbm90IE5vbmUgYW5kIGNvbW1lbnQubWF0Y2hlcyh0LCBGYWxzZSkgb3IgY29tbWVudHMgYW5kIG5vdCB0Og0KICAgICAgICAgICAgICAgIGNvbW1lbnRzLmFwcGVuZCh0KQ0KICAgICAgICAgICAgICAgIGNvbnRpbnVlDQogICAgICAgICAgICBpZiBub3QgdDoNCiAgICAgICAgICAgICAgICBjb250aW51ZQ0KICAgICAgICAgICAgb3V0ID0gWydcbicuam9pbihjb21tZW50cyksIHRdDQogICAgICAgICAgICBjb21tZW50cyA9IFtdDQogICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgdCA9IHQucmVwbGFjZShyJ1xuJywnXG4nKQ0KICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYucGFyc2VTdHJpbmcodCwgcGFyc2VBbGw9cGFyc2VBbGwpDQogICAgICAgICAgICAgICAgb3V0LmFwcGVuZChyZXN1bHQuZHVtcChmdWxsPWZ1bGxEdW1wKSkNCiAgICAgICAgICAgICAgICBzdWNjZXNzID0gc3VjY2VzcyBhbmQgbm90IGZhaWx1cmVUZXN0cw0KICAgICAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbiBhcyBwZToNCiAgICAgICAgICAgICAgICBmYXRhbCA9ICIoRkFUQUwpIiBpZiBpc2luc3RhbmNlKHBlLCBQYXJzZUZhdGFsRXhjZXB0aW9uKSBlbHNlICIiDQogICAgICAgICAgICAgICAgaWYgJ1xuJyBpbiB0Og0KICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKGxpbmUocGUubG9jLCB0KSkNCiAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCgnICcqKGNvbChwZS5sb2MsdCktMSkgKyAnXicgKyBmYXRhbCkNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCcgJypwZS5sb2MgKyAnXicgKyBmYXRhbCkNCiAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCJGQUlMOiAiICsgc3RyKHBlKSkNCiAgICAgICAgICAgICAgICBzdWNjZXNzID0gc3VjY2VzcyBhbmQgZmFpbHVyZVRlc3RzDQogICAgICAgICAgICAgICAgcmVzdWx0ID0gcGUNCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXhjOg0KICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoIkZBSUwtRVhDRVBUSU9OOiAiICsgc3RyKGV4YykpDQogICAgICAgICAgICAgICAgc3VjY2VzcyA9IHN1Y2Nlc3MgYW5kIGZhaWx1cmVUZXN0cw0KICAgICAgICAgICAgICAgIHJlc3VsdCA9IGV4Yw0KDQogICAgICAgICAgICBpZiBwcmludFJlc3VsdHM6DQogICAgICAgICAgICAgICAgaWYgZnVsbER1bXA6DQogICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoJycpDQogICAgICAgICAgICAgICAgcHJpbnQoJ1xuJy5qb2luKG91dCkpDQoNCiAgICAgICAgICAgIGFsbFJlc3VsdHMuYXBwZW5kKCh0LCByZXN1bHQpKQ0KICAgICAgICANCiAgICAgICAgcmV0dXJuIHN1Y2Nlc3MsIGFsbFJlc3VsdHMNCg0KICAgICAgICANCmNsYXNzIFRva2VuKFBhcnNlckVsZW1lbnQpOg0KICAgICIiIg0KICAgIEFic3RyYWN0IEN7UGFyc2VyRWxlbWVudH0gc3ViY2xhc3MsIGZvciBkZWZpbmluZyBhdG9taWMgbWF0Y2hpbmcgcGF0dGVybnMuDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmICk6DQogICAgICAgIHN1cGVyKFRva2VuLHNlbGYpLl9faW5pdF9fKCBzYXZlbGlzdD1GYWxzZSApDQoNCg0KY2xhc3MgRW1wdHkoVG9rZW4pOg0KICAgICIiIg0KICAgIEFuIGVtcHR5IHRva2VuLCB3aWxsIGFsd2F5cyBtYXRjaC4NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYgKToNCiAgICAgICAgc3VwZXIoRW1wdHksc2VsZikuX19pbml0X18oKQ0KICAgICAgICBzZWxmLm5hbWUgPSAiRW1wdHkiDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlDQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlDQoNCg0KY2xhc3MgTm9NYXRjaChUb2tlbik6DQogICAgIiIiDQogICAgQSB0b2tlbiB0aGF0IHdpbGwgbmV2ZXIgbWF0Y2guDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmICk6DQogICAgICAgIHN1cGVyKE5vTWF0Y2gsc2VsZikuX19pbml0X18oKQ0KICAgICAgICBzZWxmLm5hbWUgPSAiTm9NYXRjaCINCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUNCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiVW5tYXRjaGFibGUgdG9rZW4iDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KDQpjbGFzcyBMaXRlcmFsKFRva2VuKToNCiAgICAiIiINCiAgICBUb2tlbiB0byBleGFjdGx5IG1hdGNoIGEgc3BlY2lmaWVkIHN0cmluZy4NCiAgICANCiAgICBFeGFtcGxlOjoNCiAgICAgICAgTGl0ZXJhbCgnYmxhaCcpLnBhcnNlU3RyaW5nKCdibGFoJykgICMgLT4gWydibGFoJ10NCiAgICAgICAgTGl0ZXJhbCgnYmxhaCcpLnBhcnNlU3RyaW5nKCdibGFoZm9vYmxhaCcpICAjIC0+IFsnYmxhaCddDQogICAgICAgIExpdGVyYWwoJ2JsYWgnKS5wYXJzZVN0cmluZygnYmxhJykgICMgLT4gRXhjZXB0aW9uOiBFeHBlY3RlZCAiYmxhaCINCiAgICANCiAgICBGb3IgY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaGluZywgdXNlIEx7Q2FzZWxlc3NMaXRlcmFsfS4NCiAgICANCiAgICBGb3Iga2V5d29yZCBtYXRjaGluZyAoZm9yY2Ugd29yZCBicmVhayBiZWZvcmUgYW5kIGFmdGVyIHRoZSBtYXRjaGVkIHN0cmluZyksDQogICAgdXNlIEx7S2V5d29yZH0gb3IgTHtDYXNlbGVzc0tleXdvcmR9Lg0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgbWF0Y2hTdHJpbmcgKToNCiAgICAgICAgc3VwZXIoTGl0ZXJhbCxzZWxmKS5fX2luaXRfXygpDQogICAgICAgIHNlbGYubWF0Y2ggPSBtYXRjaFN0cmluZw0KICAgICAgICBzZWxmLm1hdGNoTGVuID0gbGVuKG1hdGNoU3RyaW5nKQ0KICAgICAgICB0cnk6DQogICAgICAgICAgICBzZWxmLmZpcnN0TWF0Y2hDaGFyID0gbWF0Y2hTdHJpbmdbMF0NCiAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6DQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJudWxsIHN0cmluZyBwYXNzZWQgdG8gTGl0ZXJhbDsgdXNlIEVtcHR5KCkgaW5zdGVhZCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KICAgICAgICAgICAgc2VsZi5fX2NsYXNzX18gPSBFbXB0eQ0KICAgICAgICBzZWxmLm5hbWUgPSAnIiVzIicgJSBfdXN0cihzZWxmLm1hdGNoKQ0KICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCAiICsgc2VsZi5uYW1lDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBGYWxzZQ0KICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQ0KDQogICAgIyBQZXJmb3JtYW5jZSB0dW5pbmc6IHRoaXMgcm91dGluZSBnZXRzIGNhbGxlZCBhICpsb3QqDQogICAgIyBpZiB0aGlzIGlzIGEgc2luZ2xlIGNoYXJhY3RlciBtYXRjaCBzdHJpbmcgIGFuZCB0aGUgZmlyc3QgY2hhcmFjdGVyIG1hdGNoZXMsDQogICAgIyBzaG9ydC1jaXJjdWl0IGFzIHF1aWNrbHkgYXMgcG9zc2libGUsIGFuZCBhdm9pZCBjYWxsaW5nIHN0YXJ0c3dpdGgNCiAgICAjfiBAcHJvZmlsZQ0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGlmIChpbnN0cmluZ1tsb2NdID09IHNlbGYuZmlyc3RNYXRjaENoYXIgYW5kDQogICAgICAgICAgICAoc2VsZi5tYXRjaExlbj09MSBvciBpbnN0cmluZy5zdGFydHN3aXRoKHNlbGYubWF0Y2gsbG9jKSkgKToNCiAgICAgICAgICAgIHJldHVybiBsb2Mrc2VsZi5tYXRjaExlbiwgc2VsZi5tYXRjaA0KICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCl9MID0gTGl0ZXJhbA0KUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzID0gTGl0ZXJhbA0KDQpjbGFzcyBLZXl3b3JkKFRva2VuKToNCiAgICAiIiINCiAgICBUb2tlbiB0byBleGFjdGx5IG1hdGNoIGEgc3BlY2lmaWVkIHN0cmluZyBhcyBhIGtleXdvcmQsIHRoYXQgaXMsIGl0IG11c3QgYmUNCiAgICBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhIG5vbi1rZXl3b3JkIGNoYXJhY3Rlci4gIENvbXBhcmUgd2l0aCBDe0x7TGl0ZXJhbH19Og0KICAgICAtIEN7TGl0ZXJhbCgiaWYiKX0gd2lsbCBtYXRjaCB0aGUgbGVhZGluZyBDeydpZid9IGluIEN7J2lmQW5kT25seUlmJ30uDQogICAgIC0gQ3tLZXl3b3JkKCJpZiIpfSB3aWxsIG5vdDsgaXQgd2lsbCBvbmx5IG1hdGNoIHRoZSBsZWFkaW5nIEN7J2lmJ30gaW4gQ3snaWYgeD0xJ30sIG9yIEN7J2lmKHk9PTIpJ30NCiAgICBBY2NlcHRzIHR3byBvcHRpb25hbCBjb25zdHJ1Y3RvciBhcmd1bWVudHMgaW4gYWRkaXRpb24gdG8gdGhlIGtleXdvcmQgc3RyaW5nOg0KICAgICAtIEN7aWRlbnRDaGFyc30gaXMgYSBzdHJpbmcgb2YgY2hhcmFjdGVycyB0aGF0IHdvdWxkIGJlIHZhbGlkIGlkZW50aWZpZXIgY2hhcmFjdGVycywNCiAgICAgICAgICBkZWZhdWx0aW5nIHRvIGFsbCBhbHBoYW51bWVyaWNzICsgIl8iIGFuZCAiJCINCiAgICAgLSBDe2Nhc2VsZXNzfSBhbGxvd3MgY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaGluZywgZGVmYXVsdCBpcyBDe0ZhbHNlfS4NCiAgICAgICANCiAgICBFeGFtcGxlOjoNCiAgICAgICAgS2V5d29yZCgic3RhcnQiKS5wYXJzZVN0cmluZygic3RhcnQiKSAgIyAtPiBbJ3N0YXJ0J10NCiAgICAgICAgS2V5d29yZCgic3RhcnQiKS5wYXJzZVN0cmluZygic3RhcnRpbmciKSAgIyAtPiBFeGNlcHRpb24NCg0KICAgIEZvciBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoaW5nLCB1c2UgTHtDYXNlbGVzc0tleXdvcmR9Lg0KICAgICIiIg0KICAgIERFRkFVTFRfS0VZV09SRF9DSEFSUyA9IGFscGhhbnVtcysiXyQiDQoNCiAgICBkZWYgX19pbml0X18oIHNlbGYsIG1hdGNoU3RyaW5nLCBpZGVudENoYXJzPU5vbmUsIGNhc2VsZXNzPUZhbHNlICk6DQogICAgICAgIHN1cGVyKEtleXdvcmQsc2VsZikuX19pbml0X18oKQ0KICAgICAgICBpZiBpZGVudENoYXJzIGlzIE5vbmU6DQogICAgICAgICAgICBpZGVudENoYXJzID0gS2V5d29yZC5ERUZBVUxUX0tFWVdPUkRfQ0hBUlMNCiAgICAgICAgc2VsZi5tYXRjaCA9IG1hdGNoU3RyaW5nDQogICAgICAgIHNlbGYubWF0Y2hMZW4gPSBsZW4obWF0Y2hTdHJpbmcpDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHNlbGYuZmlyc3RNYXRjaENoYXIgPSBtYXRjaFN0cmluZ1swXQ0KICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoNCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIm51bGwgc3RyaW5nIHBhc3NlZCB0byBLZXl3b3JkOyB1c2UgRW1wdHkoKSBpbnN0ZWFkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQogICAgICAgIHNlbGYubmFtZSA9ICciJXMiJyAlIHNlbGYubWF0Y2gNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgIiArIHNlbGYubmFtZQ0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gRmFsc2UNCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UNCiAgICAgICAgc2VsZi5jYXNlbGVzcyA9IGNhc2VsZXNzDQogICAgICAgIGlmIGNhc2VsZXNzOg0KICAgICAgICAgICAgc2VsZi5jYXNlbGVzc21hdGNoID0gbWF0Y2hTdHJpbmcudXBwZXIoKQ0KICAgICAgICAgICAgaWRlbnRDaGFycyA9IGlkZW50Q2hhcnMudXBwZXIoKQ0KICAgICAgICBzZWxmLmlkZW50Q2hhcnMgPSBzZXQoaWRlbnRDaGFycykNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGlmIHNlbGYuY2FzZWxlc3M6DQogICAgICAgICAgICBpZiAoIChpbnN0cmluZ1sgbG9jOmxvYytzZWxmLm1hdGNoTGVuIF0udXBwZXIoKSA9PSBzZWxmLmNhc2VsZXNzbWF0Y2gpIGFuZA0KICAgICAgICAgICAgICAgICAobG9jID49IGxlbihpbnN0cmluZyktc2VsZi5tYXRjaExlbiBvciBpbnN0cmluZ1tsb2Mrc2VsZi5tYXRjaExlbl0udXBwZXIoKSBub3QgaW4gc2VsZi5pZGVudENoYXJzKSBhbmQNCiAgICAgICAgICAgICAgICAgKGxvYyA9PSAwIG9yIGluc3RyaW5nW2xvYy0xXS51cHBlcigpIG5vdCBpbiBzZWxmLmlkZW50Q2hhcnMpICk6DQogICAgICAgICAgICAgICAgcmV0dXJuIGxvYytzZWxmLm1hdGNoTGVuLCBzZWxmLm1hdGNoDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBpZiAoaW5zdHJpbmdbbG9jXSA9PSBzZWxmLmZpcnN0TWF0Y2hDaGFyIGFuZA0KICAgICAgICAgICAgICAgIChzZWxmLm1hdGNoTGVuPT0xIG9yIGluc3RyaW5nLnN0YXJ0c3dpdGgoc2VsZi5tYXRjaCxsb2MpKSBhbmQNCiAgICAgICAgICAgICAgICAobG9jID49IGxlbihpbnN0cmluZyktc2VsZi5tYXRjaExlbiBvciBpbnN0cmluZ1tsb2Mrc2VsZi5tYXRjaExlbl0gbm90IGluIHNlbGYuaWRlbnRDaGFycykgYW5kDQogICAgICAgICAgICAgICAgKGxvYyA9PSAwIG9yIGluc3RyaW5nW2xvYy0xXSBub3QgaW4gc2VsZi5pZGVudENoYXJzKSApOg0KICAgICAgICAgICAgICAgIHJldHVybiBsb2Mrc2VsZi5tYXRjaExlbiwgc2VsZi5tYXRjaA0KICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KICAgIGRlZiBjb3B5KHNlbGYpOg0KICAgICAgICBjID0gc3VwZXIoS2V5d29yZCxzZWxmKS5jb3B5KCkNCiAgICAgICAgYy5pZGVudENoYXJzID0gS2V5d29yZC5ERUZBVUxUX0tFWVdPUkRfQ0hBUlMNCiAgICAgICAgcmV0dXJuIGMNCg0KICAgIEBzdGF0aWNtZXRob2QNCiAgICBkZWYgc2V0RGVmYXVsdEtleXdvcmRDaGFycyggY2hhcnMgKToNCiAgICAgICAgIiIiT3ZlcnJpZGVzIHRoZSBkZWZhdWx0IEtleXdvcmQgY2hhcnMNCiAgICAgICAgIiIiDQogICAgICAgIEtleXdvcmQuREVGQVVMVF9LRVlXT1JEX0NIQVJTID0gY2hhcnMNCg0KY2xhc3MgQ2FzZWxlc3NMaXRlcmFsKExpdGVyYWwpOg0KICAgICIiIg0KICAgIFRva2VuIHRvIG1hdGNoIGEgc3BlY2lmaWVkIHN0cmluZywgaWdub3JpbmcgY2FzZSBvZiBsZXR0ZXJzLg0KICAgIE5vdGU6IHRoZSBtYXRjaGVkIHJlc3VsdHMgd2lsbCBhbHdheXMgYmUgaW4gdGhlIGNhc2Ugb2YgdGhlIGdpdmVuDQogICAgbWF0Y2ggc3RyaW5nLCBOT1QgdGhlIGNhc2Ugb2YgdGhlIGlucHV0IHRleHQuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgT25lT3JNb3JlKENhc2VsZXNzTGl0ZXJhbCgiQ01EIikpLnBhcnNlU3RyaW5nKCJjbWQgQ01EIENtZDEwIikgIyAtPiBbJ0NNRCcsICdDTUQnLCAnQ01EJ10NCiAgICAgICAgDQogICAgKENvbnRyYXN0IHdpdGggZXhhbXBsZSBmb3IgTHtDYXNlbGVzc0tleXdvcmR9LikNCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIG1hdGNoU3RyaW5nICk6DQogICAgICAgIHN1cGVyKENhc2VsZXNzTGl0ZXJhbCxzZWxmKS5fX2luaXRfXyggbWF0Y2hTdHJpbmcudXBwZXIoKSApDQogICAgICAgICMgUHJlc2VydmUgdGhlIGRlZmluaW5nIGxpdGVyYWwuDQogICAgICAgIHNlbGYucmV0dXJuU3RyaW5nID0gbWF0Y2hTdHJpbmcNCiAgICAgICAgc2VsZi5uYW1lID0gIiclcyciICUgc2VsZi5yZXR1cm5TdHJpbmcNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgIiArIHNlbGYubmFtZQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgaWYgaW5zdHJpbmdbIGxvYzpsb2Mrc2VsZi5tYXRjaExlbiBdLnVwcGVyKCkgPT0gc2VsZi5tYXRjaDoNCiAgICAgICAgICAgIHJldHVybiBsb2Mrc2VsZi5tYXRjaExlbiwgc2VsZi5yZXR1cm5TdHJpbmcNCiAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCmNsYXNzIENhc2VsZXNzS2V5d29yZChLZXl3b3JkKToNCiAgICAiIiINCiAgICBDYXNlbGVzcyB2ZXJzaW9uIG9mIEx7S2V5d29yZH0uDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgT25lT3JNb3JlKENhc2VsZXNzS2V5d29yZCgiQ01EIikpLnBhcnNlU3RyaW5nKCJjbWQgQ01EIENtZDEwIikgIyAtPiBbJ0NNRCcsICdDTUQnXQ0KICAgICAgICANCiAgICAoQ29udHJhc3Qgd2l0aCBleGFtcGxlIGZvciBMe0Nhc2VsZXNzTGl0ZXJhbH0uKQ0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgbWF0Y2hTdHJpbmcsIGlkZW50Q2hhcnM9Tm9uZSApOg0KICAgICAgICBzdXBlcihDYXNlbGVzc0tleXdvcmQsc2VsZikuX19pbml0X18oIG1hdGNoU3RyaW5nLCBpZGVudENoYXJzLCBjYXNlbGVzcz1UcnVlICkNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGlmICggKGluc3RyaW5nWyBsb2M6bG9jK3NlbGYubWF0Y2hMZW4gXS51cHBlcigpID09IHNlbGYuY2FzZWxlc3NtYXRjaCkgYW5kDQogICAgICAgICAgICAgKGxvYyA+PSBsZW4oaW5zdHJpbmcpLXNlbGYubWF0Y2hMZW4gb3IgaW5zdHJpbmdbbG9jK3NlbGYubWF0Y2hMZW5dLnVwcGVyKCkgbm90IGluIHNlbGYuaWRlbnRDaGFycykgKToNCiAgICAgICAgICAgIHJldHVybiBsb2Mrc2VsZi5tYXRjaExlbiwgc2VsZi5tYXRjaA0KICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KY2xhc3MgQ2xvc2VNYXRjaChUb2tlbik6DQogICAgIiIiDQogICAgQSB2YXJpYXRpb24gb24gTHtMaXRlcmFsfSB3aGljaCBtYXRjaGVzICJjbG9zZSIgbWF0Y2hlcywgdGhhdCBpcywgDQogICAgc3RyaW5ncyB3aXRoIGF0IG1vc3QgJ24nIG1pc21hdGNoaW5nIGNoYXJhY3RlcnMuIEN7Q2xvc2VNYXRjaH0gdGFrZXMgcGFyYW1ldGVyczoNCiAgICAgLSBDe21hdGNoX3N0cmluZ30gLSBzdHJpbmcgdG8gYmUgbWF0Y2hlZA0KICAgICAtIEN7bWF4TWlzbWF0Y2hlc30gLSAoQ3tkZWZhdWx0PTF9KSBtYXhpbXVtIG51bWJlciBvZiBtaXNtYXRjaGVzIGFsbG93ZWQgdG8gY291bnQgYXMgYSBtYXRjaA0KICAgIA0KICAgIFRoZSByZXN1bHRzIGZyb20gYSBzdWNjZXNzZnVsIHBhcnNlIHdpbGwgY29udGFpbiB0aGUgbWF0Y2hlZCB0ZXh0IGZyb20gdGhlIGlucHV0IHN0cmluZyBhbmQgdGhlIGZvbGxvd2luZyBuYW1lZCByZXN1bHRzOg0KICAgICAtIEN7bWlzbWF0Y2hlc30gLSBhIGxpc3Qgb2YgdGhlIHBvc2l0aW9ucyB3aXRoaW4gdGhlIG1hdGNoX3N0cmluZyB3aGVyZSBtaXNtYXRjaGVzIHdlcmUgZm91bmQNCiAgICAgLSBDe29yaWdpbmFsfSAtIHRoZSBvcmlnaW5hbCBtYXRjaF9zdHJpbmcgdXNlZCB0byBjb21wYXJlIGFnYWluc3QgdGhlIGlucHV0IHN0cmluZw0KICAgIA0KICAgIElmIEN7bWlzbWF0Y2hlc30gaXMgYW4gZW1wdHkgbGlzdCwgdGhlbiB0aGUgbWF0Y2ggd2FzIGFuIGV4YWN0IG1hdGNoLg0KICAgIA0KICAgIEV4YW1wbGU6Og0KICAgICAgICBwYXR0ID0gQ2xvc2VNYXRjaCgiQVRDQVRDR0FBVEdHQSIpDQogICAgICAgIHBhdHQucGFyc2VTdHJpbmcoIkFUQ0FUQ0dBQVhHR0EiKSAjIC0+IChbJ0FUQ0FUQ0dBQVhHR0EnXSwgeydtaXNtYXRjaGVzJzogW1s5XV0sICdvcmlnaW5hbCc6IFsnQVRDQVRDR0FBVEdHQSddfSkNCiAgICAgICAgcGF0dC5wYXJzZVN0cmluZygiQVRDQVhDR0FBWEdHQSIpICMgLT4gRXhjZXB0aW9uOiBFeHBlY3RlZCAnQVRDQVRDR0FBVEdHQScgKHdpdGggdXAgdG8gMSBtaXNtYXRjaGVzKSAoYXQgY2hhciAwKSwgKGxpbmU6MSwgY29sOjEpDQoNCiAgICAgICAgIyBleGFjdCBtYXRjaA0KICAgICAgICBwYXR0LnBhcnNlU3RyaW5nKCJBVENBVENHQUFUR0dBIikgIyAtPiAoWydBVENBVENHQUFUR0dBJ10sIHsnbWlzbWF0Y2hlcyc6IFtbXV0sICdvcmlnaW5hbCc6IFsnQVRDQVRDR0FBVEdHQSddfSkNCg0KICAgICAgICAjIGNsb3NlIG1hdGNoIGFsbG93aW5nIHVwIHRvIDIgbWlzbWF0Y2hlcw0KICAgICAgICBwYXR0ID0gQ2xvc2VNYXRjaCgiQVRDQVRDR0FBVEdHQSIsIG1heE1pc21hdGNoZXM9MikNCiAgICAgICAgcGF0dC5wYXJzZVN0cmluZygiQVRDQVhDR0FBWEdHQSIpICMgLT4gKFsnQVRDQVhDR0FBWEdHQSddLCB7J21pc21hdGNoZXMnOiBbWzQsIDldXSwgJ29yaWdpbmFsJzogWydBVENBVENHQUFUR0dBJ119KQ0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXRjaF9zdHJpbmcsIG1heE1pc21hdGNoZXM9MSk6DQogICAgICAgIHN1cGVyKENsb3NlTWF0Y2gsc2VsZikuX19pbml0X18oKQ0KICAgICAgICBzZWxmLm5hbWUgPSBtYXRjaF9zdHJpbmcNCiAgICAgICAgc2VsZi5tYXRjaF9zdHJpbmcgPSBtYXRjaF9zdHJpbmcNCiAgICAgICAgc2VsZi5tYXhNaXNtYXRjaGVzID0gbWF4TWlzbWF0Y2hlcw0KICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCAlciAod2l0aCB1cCB0byAlZCBtaXNtYXRjaGVzKSIgJSAoc2VsZi5tYXRjaF9zdHJpbmcsIHNlbGYubWF4TWlzbWF0Y2hlcykNCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IEZhbHNlDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBzdGFydCA9IGxvYw0KICAgICAgICBpbnN0cmxlbiA9IGxlbihpbnN0cmluZykNCiAgICAgICAgbWF4bG9jID0gc3RhcnQgKyBsZW4oc2VsZi5tYXRjaF9zdHJpbmcpDQoNCiAgICAgICAgaWYgbWF4bG9jIDw9IGluc3RybGVuOg0KICAgICAgICAgICAgbWF0Y2hfc3RyaW5nID0gc2VsZi5tYXRjaF9zdHJpbmcNCiAgICAgICAgICAgIG1hdGNoX3N0cmluZ2xvYyA9IDANCiAgICAgICAgICAgIG1pc21hdGNoZXMgPSBbXQ0KICAgICAgICAgICAgbWF4TWlzbWF0Y2hlcyA9IHNlbGYubWF4TWlzbWF0Y2hlcw0KDQogICAgICAgICAgICBmb3IgbWF0Y2hfc3RyaW5nbG9jLHNfbSBpbiBlbnVtZXJhdGUoemlwKGluc3RyaW5nW2xvYzptYXhsb2NdLCBzZWxmLm1hdGNoX3N0cmluZykpOg0KICAgICAgICAgICAgICAgIHNyYyxtYXQgPSBzX20NCiAgICAgICAgICAgICAgICBpZiBzcmMgIT0gbWF0Og0KICAgICAgICAgICAgICAgICAgICBtaXNtYXRjaGVzLmFwcGVuZChtYXRjaF9zdHJpbmdsb2MpDQogICAgICAgICAgICAgICAgICAgIGlmIGxlbihtaXNtYXRjaGVzKSA+IG1heE1pc21hdGNoZXM6DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhaw0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBsb2MgPSBtYXRjaF9zdHJpbmdsb2MgKyAxDQogICAgICAgICAgICAgICAgcmVzdWx0cyA9IFBhcnNlUmVzdWx0cyhbaW5zdHJpbmdbc3RhcnQ6bG9jXV0pDQogICAgICAgICAgICAgICAgcmVzdWx0c1snb3JpZ2luYWwnXSA9IHNlbGYubWF0Y2hfc3RyaW5nDQogICAgICAgICAgICAgICAgcmVzdWx0c1snbWlzbWF0Y2hlcyddID0gbWlzbWF0Y2hlcw0KICAgICAgICAgICAgICAgIHJldHVybiBsb2MsIHJlc3VsdHMNCg0KICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KDQpjbGFzcyBXb3JkKFRva2VuKToNCiAgICAiIiINCiAgICBUb2tlbiBmb3IgbWF0Y2hpbmcgd29yZHMgY29tcG9zZWQgb2YgYWxsb3dlZCBjaGFyYWN0ZXIgc2V0cy4NCiAgICBEZWZpbmVkIHdpdGggc3RyaW5nIGNvbnRhaW5pbmcgYWxsIGFsbG93ZWQgaW5pdGlhbCBjaGFyYWN0ZXJzLA0KICAgIGFuIG9wdGlvbmFsIHN0cmluZyBjb250YWluaW5nIGFsbG93ZWQgYm9keSBjaGFyYWN0ZXJzIChpZiBvbWl0dGVkLA0KICAgIGRlZmF1bHRzIHRvIHRoZSBpbml0aWFsIGNoYXJhY3RlciBzZXQpLCBhbmQgYW4gb3B0aW9uYWwgbWluaW11bSwNCiAgICBtYXhpbXVtLCBhbmQvb3IgZXhhY3QgbGVuZ3RoLiAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIEN7bWlufSBpcyAxIChhDQogICAgbWluaW11bSB2YWx1ZSA8IDEgaXMgbm90IHZhbGlkKTsgdGhlIGRlZmF1bHQgdmFsdWVzIGZvciBDe21heH0gYW5kIEN7ZXhhY3R9DQogICAgYXJlIDAsIG1lYW5pbmcgbm8gbWF4aW11bSBvciBleGFjdCBsZW5ndGggcmVzdHJpY3Rpb24uIEFuIG9wdGlvbmFsDQogICAgQ3tleGNsdWRlQ2hhcnN9IHBhcmFtZXRlciBjYW4gbGlzdCBjaGFyYWN0ZXJzIHRoYXQgbWlnaHQgYmUgZm91bmQgaW4gDQogICAgdGhlIGlucHV0IEN7Ym9keUNoYXJzfSBzdHJpbmc7IHVzZWZ1bCB0byBkZWZpbmUgYSB3b3JkIG9mIGFsbCBwcmludGFibGVzDQogICAgZXhjZXB0IGZvciBvbmUgb3IgdHdvIGNoYXJhY3RlcnMsIGZvciBpbnN0YW5jZS4NCiAgICANCiAgICBMe3NyYW5nZX0gaXMgdXNlZnVsIGZvciBkZWZpbmluZyBjdXN0b20gY2hhcmFjdGVyIHNldCBzdHJpbmdzIGZvciBkZWZpbmluZyANCiAgICBDe1dvcmR9IGV4cHJlc3Npb25zLCB1c2luZyByYW5nZSBub3RhdGlvbiBmcm9tIHJlZ3VsYXIgZXhwcmVzc2lvbiBjaGFyYWN0ZXIgc2V0cy4NCiAgICANCiAgICBBIGNvbW1vbiBtaXN0YWtlIGlzIHRvIHVzZSBDe1dvcmR9IHRvIG1hdGNoIGEgc3BlY2lmaWMgbGl0ZXJhbCBzdHJpbmcsIGFzIGluIA0KICAgIEN7V29yZCgiQWRkcmVzcyIpfS4gUmVtZW1iZXIgdGhhdCBDe1dvcmR9IHVzZXMgdGhlIHN0cmluZyBhcmd1bWVudCB0byBkZWZpbmUNCiAgICBJe3NldHN9IG9mIG1hdGNoYWJsZSBjaGFyYWN0ZXJzLiBUaGlzIGV4cHJlc3Npb24gd291bGQgbWF0Y2ggIkFkZCIsICJBQUEiLA0KICAgICJkQXJlZCIsIG9yIGFueSBvdGhlciB3b3JkIG1hZGUgdXAgb2YgdGhlIGNoYXJhY3RlcnMgJ0EnLCAnZCcsICdyJywgJ2UnLCBhbmQgJ3MnLg0KICAgIFRvIG1hdGNoIGFuIGV4YWN0IGxpdGVyYWwgc3RyaW5nLCB1c2UgTHtMaXRlcmFsfSBvciBMe0tleXdvcmR9Lg0KDQogICAgcHlwYXJzaW5nIGluY2x1ZGVzIGhlbHBlciBzdHJpbmdzIGZvciBidWlsZGluZyBXb3JkczoNCiAgICAgLSBMe2FscGhhc30NCiAgICAgLSBMe251bXN9DQogICAgIC0gTHthbHBoYW51bXN9DQogICAgIC0gTHtoZXhudW1zfQ0KICAgICAtIEx7YWxwaGFzOGJpdH0gKGFscGhhYmV0aWMgY2hhcmFjdGVycyBpbiBBU0NJSSByYW5nZSAxMjgtMjU1IC0gYWNjZW50ZWQsIHRpbGRlZCwgdW1sYXV0ZWQsIGV0Yy4pDQogICAgIC0gTHtwdW5jOGJpdH0gKG5vbi1hbHBoYWJldGljIGNoYXJhY3RlcnMgaW4gQVNDSUkgcmFuZ2UgMTI4LTI1NSAtIGN1cnJlbmN5LCBzeW1ib2xzLCBzdXBlcnNjcmlwdHMsIGRpYWNyaXRpY2FscywgZXRjLikNCiAgICAgLSBMe3ByaW50YWJsZXN9IChhbnkgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyKQ0KDQogICAgRXhhbXBsZTo6DQogICAgICAgICMgYSB3b3JkIGNvbXBvc2VkIG9mIGRpZ2l0cw0KICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKSAjIGVxdWl2YWxlbnQgdG8gV29yZCgiMDEyMzQ1Njc4OSIpIG9yIFdvcmQoc3JhbmdlKCIwLTkiKSkNCiAgICAgICAgDQogICAgICAgICMgYSB3b3JkIHdpdGggYSBsZWFkaW5nIGNhcGl0YWwsIGFuZCB6ZXJvIG9yIG1vcmUgbG93ZXJjYXNlDQogICAgICAgIGNhcGl0YWxfd29yZCA9IFdvcmQoYWxwaGFzLnVwcGVyKCksIGFscGhhcy5sb3dlcigpKQ0KDQogICAgICAgICMgaG9zdG5hbWVzIGFyZSBhbHBoYW51bWVyaWMsIHdpdGggbGVhZGluZyBhbHBoYSwgYW5kICctJw0KICAgICAgICBob3N0bmFtZSA9IFdvcmQoYWxwaGFzLCBhbHBoYW51bXMrJy0nKQ0KICAgICAgICANCiAgICAgICAgIyByb21hbiBudW1lcmFsIChub3QgYSBzdHJpY3QgcGFyc2VyLCBhY2NlcHRzIGludmFsaWQgbWl4IG9mIGNoYXJhY3RlcnMpDQogICAgICAgIHJvbWFuID0gV29yZCgiSVZYTENETSIpDQogICAgICAgIA0KICAgICAgICAjIGFueSBzdHJpbmcgb2Ygbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVycywgZXhjZXB0IGZvciAnLCcNCiAgICAgICAgY3N2X3ZhbHVlID0gV29yZChwcmludGFibGVzLCBleGNsdWRlQ2hhcnM9IiwiKQ0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgaW5pdENoYXJzLCBib2R5Q2hhcnM9Tm9uZSwgbWluPTEsIG1heD0wLCBleGFjdD0wLCBhc0tleXdvcmQ9RmFsc2UsIGV4Y2x1ZGVDaGFycz1Ob25lICk6DQogICAgICAgIHN1cGVyKFdvcmQsc2VsZikuX19pbml0X18oKQ0KICAgICAgICBpZiBleGNsdWRlQ2hhcnM6DQogICAgICAgICAgICBpbml0Q2hhcnMgPSAnJy5qb2luKGMgZm9yIGMgaW4gaW5pdENoYXJzIGlmIGMgbm90IGluIGV4Y2x1ZGVDaGFycykNCiAgICAgICAgICAgIGlmIGJvZHlDaGFyczoNCiAgICAgICAgICAgICAgICBib2R5Q2hhcnMgPSAnJy5qb2luKGMgZm9yIGMgaW4gYm9keUNoYXJzIGlmIGMgbm90IGluIGV4Y2x1ZGVDaGFycykNCiAgICAgICAgc2VsZi5pbml0Q2hhcnNPcmlnID0gaW5pdENoYXJzDQogICAgICAgIHNlbGYuaW5pdENoYXJzID0gc2V0KGluaXRDaGFycykNCiAgICAgICAgaWYgYm9keUNoYXJzIDoNCiAgICAgICAgICAgIHNlbGYuYm9keUNoYXJzT3JpZyA9IGJvZHlDaGFycw0KICAgICAgICAgICAgc2VsZi5ib2R5Q2hhcnMgPSBzZXQoYm9keUNoYXJzKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc2VsZi5ib2R5Q2hhcnNPcmlnID0gaW5pdENoYXJzDQogICAgICAgICAgICBzZWxmLmJvZHlDaGFycyA9IHNldChpbml0Q2hhcnMpDQoNCiAgICAgICAgc2VsZi5tYXhTcGVjaWZpZWQgPSBtYXggPiAwDQoNCiAgICAgICAgaWYgbWluIDwgMToNCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImNhbm5vdCBzcGVjaWZ5IGEgbWluaW11bSBsZW5ndGggPCAxOyB1c2UgT3B0aW9uYWwoV29yZCgpKSBpZiB6ZXJvLWxlbmd0aCB3b3JkIGlzIHBlcm1pdHRlZCIpDQoNCiAgICAgICAgc2VsZi5taW5MZW4gPSBtaW4NCg0KICAgICAgICBpZiBtYXggPiAwOg0KICAgICAgICAgICAgc2VsZi5tYXhMZW4gPSBtYXgNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHNlbGYubWF4TGVuID0gX01BWF9JTlQNCg0KICAgICAgICBpZiBleGFjdCA+IDA6DQogICAgICAgICAgICBzZWxmLm1heExlbiA9IGV4YWN0DQogICAgICAgICAgICBzZWxmLm1pbkxlbiA9IGV4YWN0DQoNCiAgICAgICAgc2VsZi5uYW1lID0gX3VzdHIoc2VsZikNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgIiArIHNlbGYubmFtZQ0KICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQ0KICAgICAgICBzZWxmLmFzS2V5d29yZCA9IGFzS2V5d29yZA0KDQogICAgICAgIGlmICcgJyBub3QgaW4gc2VsZi5pbml0Q2hhcnNPcmlnK3NlbGYuYm9keUNoYXJzT3JpZyBhbmQgKG1pbj09MSBhbmQgbWF4PT0wIGFuZCBleGFjdD09MCk6DQogICAgICAgICAgICBpZiBzZWxmLmJvZHlDaGFyc09yaWcgPT0gc2VsZi5pbml0Q2hhcnNPcmlnOg0KICAgICAgICAgICAgICAgIHNlbGYucmVTdHJpbmcgPSAiWyVzXSsiICUgX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhzZWxmLmluaXRDaGFyc09yaWcpDQogICAgICAgICAgICBlbGlmIGxlbihzZWxmLmluaXRDaGFyc09yaWcpID09IDE6DQogICAgICAgICAgICAgICAgc2VsZi5yZVN0cmluZyA9ICIlc1slc10qIiAlIFwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlLmVzY2FwZShzZWxmLmluaXRDaGFyc09yaWcpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKHNlbGYuYm9keUNoYXJzT3JpZyksKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBzZWxmLnJlU3RyaW5nID0gIlslc11bJXNdKiIgJSBcDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKHNlbGYuaW5pdENoYXJzT3JpZyksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMoc2VsZi5ib2R5Q2hhcnNPcmlnKSwpDQogICAgICAgICAgICBpZiBzZWxmLmFzS2V5d29yZDoNCiAgICAgICAgICAgICAgICBzZWxmLnJlU3RyaW5nID0gciJcYiIrc2VsZi5yZVN0cmluZytyIlxiIg0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIHNlbGYucmUgPSByZS5jb21waWxlKCBzZWxmLnJlU3RyaW5nICkNCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246DQogICAgICAgICAgICAgICAgc2VsZi5yZSA9IE5vbmUNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGlmIHNlbGYucmU6DQogICAgICAgICAgICByZXN1bHQgPSBzZWxmLnJlLm1hdGNoKGluc3RyaW5nLGxvYykNCiAgICAgICAgICAgIGlmIG5vdCByZXN1bHQ6DQogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCiAgICAgICAgICAgIGxvYyA9IHJlc3VsdC5lbmQoKQ0KICAgICAgICAgICAgcmV0dXJuIGxvYywgcmVzdWx0Lmdyb3VwKCkNCg0KICAgICAgICBpZiBub3QoaW5zdHJpbmdbIGxvYyBdIGluIHNlbGYuaW5pdENoYXJzKToNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQogICAgICAgIHN0YXJ0ID0gbG9jDQogICAgICAgIGxvYyArPSAxDQogICAgICAgIGluc3RybGVuID0gbGVuKGluc3RyaW5nKQ0KICAgICAgICBib2R5Y2hhcnMgPSBzZWxmLmJvZHlDaGFycw0KICAgICAgICBtYXhsb2MgPSBzdGFydCArIHNlbGYubWF4TGVuDQogICAgICAgIG1heGxvYyA9IG1pbiggbWF4bG9jLCBpbnN0cmxlbiApDQogICAgICAgIHdoaWxlIGxvYyA8IG1heGxvYyBhbmQgaW5zdHJpbmdbbG9jXSBpbiBib2R5Y2hhcnM6DQogICAgICAgICAgICBsb2MgKz0gMQ0KDQogICAgICAgIHRocm93RXhjZXB0aW9uID0gRmFsc2UNCiAgICAgICAgaWYgbG9jIC0gc3RhcnQgPCBzZWxmLm1pbkxlbjoNCiAgICAgICAgICAgIHRocm93RXhjZXB0aW9uID0gVHJ1ZQ0KICAgICAgICBpZiBzZWxmLm1heFNwZWNpZmllZCBhbmQgbG9jIDwgaW5zdHJsZW4gYW5kIGluc3RyaW5nW2xvY10gaW4gYm9keWNoYXJzOg0KICAgICAgICAgICAgdGhyb3dFeGNlcHRpb24gPSBUcnVlDQogICAgICAgIGlmIHNlbGYuYXNLZXl3b3JkOg0KICAgICAgICAgICAgaWYgKHN0YXJ0PjAgYW5kIGluc3RyaW5nW3N0YXJ0LTFdIGluIGJvZHljaGFycykgb3IgKGxvYzxpbnN0cmxlbiBhbmQgaW5zdHJpbmdbbG9jXSBpbiBib2R5Y2hhcnMpOg0KICAgICAgICAgICAgICAgIHRocm93RXhjZXB0aW9uID0gVHJ1ZQ0KDQogICAgICAgIGlmIHRocm93RXhjZXB0aW9uOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCiAgICAgICAgcmV0dXJuIGxvYywgaW5zdHJpbmdbc3RhcnQ6bG9jXQ0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgcmV0dXJuIHN1cGVyKFdvcmQsc2VsZikuX19zdHJfXygpDQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246DQogICAgICAgICAgICBwYXNzDQoNCg0KICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToNCg0KICAgICAgICAgICAgZGVmIGNoYXJzQXNTdHIocyk6DQogICAgICAgICAgICAgICAgaWYgbGVuKHMpPjQ6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBzWzo0XSsiLi4uIg0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBzDQoNCiAgICAgICAgICAgIGlmICggc2VsZi5pbml0Q2hhcnNPcmlnICE9IHNlbGYuYm9keUNoYXJzT3JpZyApOg0KICAgICAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJXOiglcywlcykiICUgKCBjaGFyc0FzU3RyKHNlbGYuaW5pdENoYXJzT3JpZyksIGNoYXJzQXNTdHIoc2VsZi5ib2R5Q2hhcnNPcmlnKSApDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJXOiglcykiICUgY2hhcnNBc1N0cihzZWxmLmluaXRDaGFyc09yaWcpDQoNCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcg0KDQoNCmNsYXNzIFJlZ2V4KFRva2VuKToNCiAgICByIiIiDQogICAgVG9rZW4gZm9yIG1hdGNoaW5nIHN0cmluZ3MgdGhhdCBtYXRjaCBhIGdpdmVuIHJlZ3VsYXIgZXhwcmVzc2lvbi4NCiAgICBEZWZpbmVkIHdpdGggc3RyaW5nIHNwZWNpZnlpbmcgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBpbiBhIGZvcm0gcmVjb2duaXplZCBieSB0aGUgaW5idWlsdCBQeXRob24gcmUgbW9kdWxlLg0KICAgIElmIHRoZSBnaXZlbiByZWdleCBjb250YWlucyBuYW1lZCBncm91cHMgKGRlZmluZWQgdXNpbmcgQ3soP1A8bmFtZT4uLi4pfSksIHRoZXNlIHdpbGwgYmUgcHJlc2VydmVkIGFzIA0KICAgIG5hbWVkIHBhcnNlIHJlc3VsdHMuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgcmVhbG51bSA9IFJlZ2V4KHIiWystXT9cZCtcLlxkKiIpDQogICAgICAgIGRhdGUgPSBSZWdleChyJyg/UDx5ZWFyPlxkezR9KS0oP1A8bW9udGg+XGRcZD8pLSg/UDxkYXk+XGRcZD8pJykNCiAgICAgICAgIyByZWY6IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjY3Mzk5L2hvdy1kby15b3UtbWF0Y2gtb25seS12YWxpZC1yb21hbi1udW1lcmFscy13aXRoLWEtcmVndWxhci1leHByZXNzaW9uDQogICAgICAgIHJvbWFuID0gUmVnZXgociJNezAsNH0oQ018Q0R8RD9DezAsM30pKFhDfFhMfEw/WHswLDN9KShJWHxJVnxWP0l7MCwzfSkiKQ0KICAgICIiIg0KICAgIGNvbXBpbGVkUkV0eXBlID0gdHlwZShyZS5jb21waWxlKCJbQS1aXSIpKQ0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgcGF0dGVybiwgZmxhZ3M9MCk6DQogICAgICAgICIiIlRoZSBwYXJhbWV0ZXJzIEN7cGF0dGVybn0gYW5kIEN7ZmxhZ3N9IGFyZSBwYXNzZWQgdG8gdGhlIEN7cmUuY29tcGlsZSgpfSBmdW5jdGlvbiBhcy1pcy4gU2VlIHRoZSBQeXRob24gQ3tyZX0gbW9kdWxlIGZvciBhbiBleHBsYW5hdGlvbiBvZiB0aGUgYWNjZXB0YWJsZSBwYXR0ZXJucyBhbmQgZmxhZ3MuIiIiDQogICAgICAgIHN1cGVyKFJlZ2V4LHNlbGYpLl9faW5pdF9fKCkNCg0KICAgICAgICBpZiBpc2luc3RhbmNlKHBhdHRlcm4sIGJhc2VzdHJpbmcpOg0KICAgICAgICAgICAgaWYgbm90IHBhdHRlcm46DQogICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigibnVsbCBzdHJpbmcgcGFzc2VkIHRvIFJlZ2V4OyB1c2UgRW1wdHkoKSBpbnN0ZWFkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCg0KICAgICAgICAgICAgc2VsZi5wYXR0ZXJuID0gcGF0dGVybg0KICAgICAgICAgICAgc2VsZi5mbGFncyA9IGZsYWdzDQoNCiAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICBzZWxmLnJlID0gcmUuY29tcGlsZShzZWxmLnBhdHRlcm4sIHNlbGYuZmxhZ3MpDQogICAgICAgICAgICAgICAgc2VsZi5yZVN0cmluZyA9IHNlbGYucGF0dGVybg0KICAgICAgICAgICAgZXhjZXB0IHNyZV9jb25zdGFudHMuZXJyb3I6DQogICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigiaW52YWxpZCBwYXR0ZXJuICglcykgcGFzc2VkIHRvIFJlZ2V4IiAlIHBhdHRlcm4sDQogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgICAgICByYWlzZQ0KDQogICAgICAgIGVsaWYgaXNpbnN0YW5jZShwYXR0ZXJuLCBSZWdleC5jb21waWxlZFJFdHlwZSk6DQogICAgICAgICAgICBzZWxmLnJlID0gcGF0dGVybg0KICAgICAgICAgICAgc2VsZi5wYXR0ZXJuID0gXA0KICAgICAgICAgICAgc2VsZi5yZVN0cmluZyA9IHN0cihwYXR0ZXJuKQ0KICAgICAgICAgICAgc2VsZi5mbGFncyA9IGZsYWdzDQogICAgICAgICAgICANCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlJlZ2V4IG1heSBvbmx5IGJlIGNvbnN0cnVjdGVkIHdpdGggYSBzdHJpbmcgb3IgYSBjb21waWxlZCBSRSBvYmplY3QiKQ0KDQogICAgICAgIHNlbGYubmFtZSA9IF91c3RyKHNlbGYpDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICIgKyBzZWxmLm5hbWUNCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIHJlc3VsdCA9IHNlbGYucmUubWF0Y2goaW5zdHJpbmcsbG9jKQ0KICAgICAgICBpZiBub3QgcmVzdWx0Og0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCiAgICAgICAgbG9jID0gcmVzdWx0LmVuZCgpDQogICAgICAgIGQgPSByZXN1bHQuZ3JvdXBkaWN0KCkNCiAgICAgICAgcmV0ID0gUGFyc2VSZXN1bHRzKHJlc3VsdC5ncm91cCgpKQ0KICAgICAgICBpZiBkOg0KICAgICAgICAgICAgZm9yIGsgaW4gZDoNCiAgICAgICAgICAgICAgICByZXRba10gPSBkW2tdDQogICAgICAgIHJldHVybiBsb2MscmV0DQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICB0cnk6DQogICAgICAgICAgICByZXR1cm4gc3VwZXIoUmVnZXgsc2VsZikuX19zdHJfXygpDQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246DQogICAgICAgICAgICBwYXNzDQoNCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6DQogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAiUmU6KCVzKSIgJSByZXByKHNlbGYucGF0dGVybikNCg0KICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByDQoNCg0KY2xhc3MgUXVvdGVkU3RyaW5nKFRva2VuKToNCiAgICByIiIiDQogICAgVG9rZW4gZm9yIG1hdGNoaW5nIHN0cmluZ3MgdGhhdCBhcmUgZGVsaW1pdGVkIGJ5IHF1b3RpbmcgY2hhcmFjdGVycy4NCiAgICANCiAgICBEZWZpbmVkIHdpdGggdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOg0KICAgICAgICAtIHF1b3RlQ2hhciAtIHN0cmluZyBvZiBvbmUgb3IgbW9yZSBjaGFyYWN0ZXJzIGRlZmluaW5nIHRoZSBxdW90ZSBkZWxpbWl0aW5nIHN0cmluZw0KICAgICAgICAtIGVzY0NoYXIgLSBjaGFyYWN0ZXIgdG8gZXNjYXBlIHF1b3RlcywgdHlwaWNhbGx5IGJhY2tzbGFzaCAoZGVmYXVsdD1De05vbmV9KQ0KICAgICAgICAtIGVzY1F1b3RlIC0gc3BlY2lhbCBxdW90ZSBzZXF1ZW5jZSB0byBlc2NhcGUgYW4gZW1iZWRkZWQgcXVvdGUgc3RyaW5nIChzdWNoIGFzIFNRTCdzICIiIHRvIGVzY2FwZSBhbiBlbWJlZGRlZCAiKSAoZGVmYXVsdD1De05vbmV9KQ0KICAgICAgICAtIG11bHRpbGluZSAtIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHF1b3RlcyBjYW4gc3BhbiBtdWx0aXBsZSBsaW5lcyAoZGVmYXVsdD1De0ZhbHNlfSkNCiAgICAgICAgLSB1bnF1b3RlUmVzdWx0cyAtIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBtYXRjaGVkIHRleHQgc2hvdWxkIGJlIHVucXVvdGVkIChkZWZhdWx0PUN7VHJ1ZX0pDQogICAgICAgIC0gZW5kUXVvdGVDaGFyIC0gc3RyaW5nIG9mIG9uZSBvciBtb3JlIGNoYXJhY3RlcnMgZGVmaW5pbmcgdGhlIGVuZCBvZiB0aGUgcXVvdGUgZGVsaW1pdGVkIHN0cmluZyAoZGVmYXVsdD1De05vbmV9ID0+IHNhbWUgYXMgcXVvdGVDaGFyKQ0KICAgICAgICAtIGNvbnZlcnRXaGl0ZXNwYWNlRXNjYXBlcyAtIGNvbnZlcnQgZXNjYXBlZCB3aGl0ZXNwYWNlIChDeydcdCd9LCBDeydcbid9LCBldGMuKSB0byBhY3R1YWwgd2hpdGVzcGFjZSAoZGVmYXVsdD1De1RydWV9KQ0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIHFzID0gUXVvdGVkU3RyaW5nKCciJykNCiAgICAgICAgcHJpbnQocXMuc2VhcmNoU3RyaW5nKCdsc2pkZiAiVGhpcyBpcyB0aGUgcXVvdGUiIHNsZGpmJykpDQogICAgICAgIGNvbXBsZXhfcXMgPSBRdW90ZWRTdHJpbmcoJ3t7JywgZW5kUXVvdGVDaGFyPSd9fScpDQogICAgICAgIHByaW50KGNvbXBsZXhfcXMuc2VhcmNoU3RyaW5nKCdsc2pkZiB7e1RoaXMgaXMgdGhlICJxdW90ZSJ9fSBzbGRqZicpKQ0KICAgICAgICBzcWxfcXMgPSBRdW90ZWRTdHJpbmcoJyInLCBlc2NRdW90ZT0nIiInKQ0KICAgICAgICBwcmludChzcWxfcXMuc2VhcmNoU3RyaW5nKCdsc2pkZiAiVGhpcyBpcyB0aGUgcXVvdGUgd2l0aCAiImVtYmVkZGVkIiIgcXVvdGVzIiBzbGRqZicpKQ0KICAgIHByaW50czo6DQogICAgICAgIFtbJ1RoaXMgaXMgdGhlIHF1b3RlJ11dDQogICAgICAgIFtbJ1RoaXMgaXMgdGhlICJxdW90ZSInXV0NCiAgICAgICAgW1snVGhpcyBpcyB0aGUgcXVvdGUgd2l0aCAiZW1iZWRkZWQiIHF1b3RlcyddXQ0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgcXVvdGVDaGFyLCBlc2NDaGFyPU5vbmUsIGVzY1F1b3RlPU5vbmUsIG11bHRpbGluZT1GYWxzZSwgdW5xdW90ZVJlc3VsdHM9VHJ1ZSwgZW5kUXVvdGVDaGFyPU5vbmUsIGNvbnZlcnRXaGl0ZXNwYWNlRXNjYXBlcz1UcnVlKToNCiAgICAgICAgc3VwZXIoUXVvdGVkU3RyaW5nLHNlbGYpLl9faW5pdF9fKCkNCg0KICAgICAgICAjIHJlbW92ZSB3aGl0ZSBzcGFjZSBmcm9tIHF1b3RlIGNoYXJzIC0gd29udCB3b3JrIGFueXdheQ0KICAgICAgICBxdW90ZUNoYXIgPSBxdW90ZUNoYXIuc3RyaXAoKQ0KICAgICAgICBpZiBub3QgcXVvdGVDaGFyOg0KICAgICAgICAgICAgd2FybmluZ3Mud2FybigicXVvdGVDaGFyIGNhbm5vdCBiZSB0aGUgZW1wdHkgc3RyaW5nIixTeW50YXhXYXJuaW5nLHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yKCkNCg0KICAgICAgICBpZiBlbmRRdW90ZUNoYXIgaXMgTm9uZToNCiAgICAgICAgICAgIGVuZFF1b3RlQ2hhciA9IHF1b3RlQ2hhcg0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgZW5kUXVvdGVDaGFyID0gZW5kUXVvdGVDaGFyLnN0cmlwKCkNCiAgICAgICAgICAgIGlmIG5vdCBlbmRRdW90ZUNoYXI6DQogICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigiZW5kUXVvdGVDaGFyIGNhbm5vdCBiZSB0aGUgZW1wdHkgc3RyaW5nIixTeW50YXhXYXJuaW5nLHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvcigpDQoNCiAgICAgICAgc2VsZi5xdW90ZUNoYXIgPSBxdW90ZUNoYXINCiAgICAgICAgc2VsZi5xdW90ZUNoYXJMZW4gPSBsZW4ocXVvdGVDaGFyKQ0KICAgICAgICBzZWxmLmZpcnN0UXVvdGVDaGFyID0gcXVvdGVDaGFyWzBdDQogICAgICAgIHNlbGYuZW5kUXVvdGVDaGFyID0gZW5kUXVvdGVDaGFyDQogICAgICAgIHNlbGYuZW5kUXVvdGVDaGFyTGVuID0gbGVuKGVuZFF1b3RlQ2hhcikNCiAgICAgICAgc2VsZi5lc2NDaGFyID0gZXNjQ2hhcg0KICAgICAgICBzZWxmLmVzY1F1b3RlID0gZXNjUXVvdGUNCiAgICAgICAgc2VsZi51bnF1b3RlUmVzdWx0cyA9IHVucXVvdGVSZXN1bHRzDQogICAgICAgIHNlbGYuY29udmVydFdoaXRlc3BhY2VFc2NhcGVzID0gY29udmVydFdoaXRlc3BhY2VFc2NhcGVzDQoNCiAgICAgICAgaWYgbXVsdGlsaW5lOg0KICAgICAgICAgICAgc2VsZi5mbGFncyA9IHJlLk1VTFRJTElORSB8IHJlLkRPVEFMTA0KICAgICAgICAgICAgc2VsZi5wYXR0ZXJuID0gciclcyg/OlteJXMlc10nICUgXA0KICAgICAgICAgICAgICAgICggcmUuZXNjYXBlKHNlbGYucXVvdGVDaGFyKSwNCiAgICAgICAgICAgICAgICAgIF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMoc2VsZi5lbmRRdW90ZUNoYXJbMF0pLA0KICAgICAgICAgICAgICAgICAgKGVzY0NoYXIgaXMgbm90IE5vbmUgYW5kIF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMoZXNjQ2hhcikgb3IgJycpICkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHNlbGYuZmxhZ3MgPSAwDQogICAgICAgICAgICBzZWxmLnBhdHRlcm4gPSByJyVzKD86W14lc1xuXHIlc10nICUgXA0KICAgICAgICAgICAgICAgICggcmUuZXNjYXBlKHNlbGYucXVvdGVDaGFyKSwNCiAgICAgICAgICAgICAgICAgIF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMoc2VsZi5lbmRRdW90ZUNoYXJbMF0pLA0KICAgICAgICAgICAgICAgICAgKGVzY0NoYXIgaXMgbm90IE5vbmUgYW5kIF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMoZXNjQ2hhcikgb3IgJycpICkNCiAgICAgICAgaWYgbGVuKHNlbGYuZW5kUXVvdGVDaGFyKSA+IDE6DQogICAgICAgICAgICBzZWxmLnBhdHRlcm4gKz0gKA0KICAgICAgICAgICAgICAgICd8KD86JyArICcpfCg/Oicuam9pbigiJXNbXiVzXSIgJSAocmUuZXNjYXBlKHNlbGYuZW5kUXVvdGVDaGFyWzppXSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMoc2VsZi5lbmRRdW90ZUNoYXJbaV0pKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYuZW5kUXVvdGVDaGFyKS0xLDAsLTEpKSArICcpJw0KICAgICAgICAgICAgICAgICkNCiAgICAgICAgaWYgZXNjUXVvdGU6DQogICAgICAgICAgICBzZWxmLnBhdHRlcm4gKz0gKHInfCg/OiVzKScgJSByZS5lc2NhcGUoZXNjUXVvdGUpKQ0KICAgICAgICBpZiBlc2NDaGFyOg0KICAgICAgICAgICAgc2VsZi5wYXR0ZXJuICs9IChyJ3woPzolcy4pJyAlIHJlLmVzY2FwZShlc2NDaGFyKSkNCiAgICAgICAgICAgIHNlbGYuZXNjQ2hhclJlcGxhY2VQYXR0ZXJuID0gcmUuZXNjYXBlKHNlbGYuZXNjQ2hhcikrIiguKSINCiAgICAgICAgc2VsZi5wYXR0ZXJuICs9IChyJykqJXMnICUgcmUuZXNjYXBlKHNlbGYuZW5kUXVvdGVDaGFyKSkNCg0KICAgICAgICB0cnk6DQogICAgICAgICAgICBzZWxmLnJlID0gcmUuY29tcGlsZShzZWxmLnBhdHRlcm4sIHNlbGYuZmxhZ3MpDQogICAgICAgICAgICBzZWxmLnJlU3RyaW5nID0gc2VsZi5wYXR0ZXJuDQogICAgICAgIGV4Y2VwdCBzcmVfY29uc3RhbnRzLmVycm9yOg0KICAgICAgICAgICAgd2FybmluZ3Mud2FybigiaW52YWxpZCBwYXR0ZXJuICglcykgcGFzc2VkIHRvIFJlZ2V4IiAlIHNlbGYucGF0dGVybiwNCiAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQogICAgICAgICAgICByYWlzZQ0KDQogICAgICAgIHNlbGYubmFtZSA9IF91c3RyKHNlbGYpDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICIgKyBzZWxmLm5hbWUNCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIHJlc3VsdCA9IGluc3RyaW5nW2xvY10gPT0gc2VsZi5maXJzdFF1b3RlQ2hhciBhbmQgc2VsZi5yZS5tYXRjaChpbnN0cmluZyxsb2MpIG9yIE5vbmUNCiAgICAgICAgaWYgbm90IHJlc3VsdDoNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQogICAgICAgIGxvYyA9IHJlc3VsdC5lbmQoKQ0KICAgICAgICByZXQgPSByZXN1bHQuZ3JvdXAoKQ0KDQogICAgICAgIGlmIHNlbGYudW5xdW90ZVJlc3VsdHM6DQoNCiAgICAgICAgICAgICMgc3RyaXAgb2ZmIHF1b3Rlcw0KICAgICAgICAgICAgcmV0ID0gcmV0W3NlbGYucXVvdGVDaGFyTGVuOi1zZWxmLmVuZFF1b3RlQ2hhckxlbl0NCg0KICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShyZXQsYmFzZXN0cmluZyk6DQogICAgICAgICAgICAgICAgIyByZXBsYWNlIGVzY2FwZWQgd2hpdGVzcGFjZQ0KICAgICAgICAgICAgICAgIGlmICdcXCcgaW4gcmV0IGFuZCBzZWxmLmNvbnZlcnRXaGl0ZXNwYWNlRXNjYXBlczoNCiAgICAgICAgICAgICAgICAgICAgd3NfbWFwID0gew0KICAgICAgICAgICAgICAgICAgICAgICAgcidcdCcgOiAnXHQnLA0KICAgICAgICAgICAgICAgICAgICAgICAgcidcbicgOiAnXG4nLA0KICAgICAgICAgICAgICAgICAgICAgICAgcidcZicgOiAnXGYnLA0KICAgICAgICAgICAgICAgICAgICAgICAgcidccicgOiAnXHInLA0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGZvciB3c2xpdCx3c2NoYXIgaW4gd3NfbWFwLml0ZW1zKCk6DQogICAgICAgICAgICAgICAgICAgICAgICByZXQgPSByZXQucmVwbGFjZSh3c2xpdCwgd3NjaGFyKQ0KDQogICAgICAgICAgICAgICAgIyByZXBsYWNlIGVzY2FwZWQgY2hhcmFjdGVycw0KICAgICAgICAgICAgICAgIGlmIHNlbGYuZXNjQ2hhcjoNCiAgICAgICAgICAgICAgICAgICAgcmV0ID0gcmUuc3ViKHNlbGYuZXNjQ2hhclJlcGxhY2VQYXR0ZXJuLCByIlxnPDE+IiwgcmV0KQ0KDQogICAgICAgICAgICAgICAgIyByZXBsYWNlIGVzY2FwZWQgcXVvdGVzDQogICAgICAgICAgICAgICAgaWYgc2VsZi5lc2NRdW90ZToNCiAgICAgICAgICAgICAgICAgICAgcmV0ID0gcmV0LnJlcGxhY2Uoc2VsZi5lc2NRdW90ZSwgc2VsZi5lbmRRdW90ZUNoYXIpDQoNCiAgICAgICAgcmV0dXJuIGxvYywgcmV0DQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICB0cnk6DQogICAgICAgICAgICByZXR1cm4gc3VwZXIoUXVvdGVkU3RyaW5nLHNlbGYpLl9fc3RyX18oKQ0KICAgICAgICBleGNlcHQgRXhjZXB0aW9uOg0KICAgICAgICAgICAgcGFzcw0KDQogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOg0KICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gInF1b3RlZCBzdHJpbmcsIHN0YXJ0aW5nIHdpdGggJXMgZW5kaW5nIHdpdGggJXMiICUgKHNlbGYucXVvdGVDaGFyLCBzZWxmLmVuZFF1b3RlQ2hhcikNCg0KICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByDQoNCg0KY2xhc3MgQ2hhcnNOb3RJbihUb2tlbik6DQogICAgIiIiDQogICAgVG9rZW4gZm9yIG1hdGNoaW5nIHdvcmRzIGNvbXBvc2VkIG9mIGNoYXJhY3RlcnMgSXtub3R9IGluIGEgZ2l2ZW4gc2V0ICh3aWxsDQogICAgaW5jbHVkZSB3aGl0ZXNwYWNlIGluIG1hdGNoZWQgY2hhcmFjdGVycyBpZiBub3QgbGlzdGVkIGluIHRoZSBwcm92aWRlZCBleGNsdXNpb24gc2V0IC0gc2VlIGV4YW1wbGUpLg0KICAgIERlZmluZWQgd2l0aCBzdHJpbmcgY29udGFpbmluZyBhbGwgZGlzYWxsb3dlZCBjaGFyYWN0ZXJzLCBhbmQgYW4gb3B0aW9uYWwNCiAgICBtaW5pbXVtLCBtYXhpbXVtLCBhbmQvb3IgZXhhY3QgbGVuZ3RoLiAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIEN7bWlufSBpcyAxIChhDQogICAgbWluaW11bSB2YWx1ZSA8IDEgaXMgbm90IHZhbGlkKTsgdGhlIGRlZmF1bHQgdmFsdWVzIGZvciBDe21heH0gYW5kIEN7ZXhhY3R9DQogICAgYXJlIDAsIG1lYW5pbmcgbm8gbWF4aW11bSBvciBleGFjdCBsZW5ndGggcmVzdHJpY3Rpb24uDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgIyBkZWZpbmUgYSBjb21tYS1zZXBhcmF0ZWQtdmFsdWUgYXMgYW55dGhpbmcgdGhhdCBpcyBub3QgYSAnLCcNCiAgICAgICAgY3N2X3ZhbHVlID0gQ2hhcnNOb3RJbignLCcpDQogICAgICAgIHByaW50KGRlbGltaXRlZExpc3QoY3N2X3ZhbHVlKS5wYXJzZVN0cmluZygiZGtscyxsc2RramYsczEyIDM0LEAhIywyMTMiKSkNCiAgICBwcmludHM6Og0KICAgICAgICBbJ2RrbHMnLCAnbHNka2pmJywgJ3MxMiAzNCcsICdAISMnLCAnMjEzJ10NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIG5vdENoYXJzLCBtaW49MSwgbWF4PTAsIGV4YWN0PTAgKToNCiAgICAgICAgc3VwZXIoQ2hhcnNOb3RJbixzZWxmKS5fX2luaXRfXygpDQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBGYWxzZQ0KICAgICAgICBzZWxmLm5vdENoYXJzID0gbm90Q2hhcnMNCg0KICAgICAgICBpZiBtaW4gPCAxOg0KICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiY2Fubm90IHNwZWNpZnkgYSBtaW5pbXVtIGxlbmd0aCA8IDE7IHVzZSBPcHRpb25hbChDaGFyc05vdEluKCkpIGlmIHplcm8tbGVuZ3RoIGNoYXIgZ3JvdXAgaXMgcGVybWl0dGVkIikNCg0KICAgICAgICBzZWxmLm1pbkxlbiA9IG1pbg0KDQogICAgICAgIGlmIG1heCA+IDA6DQogICAgICAgICAgICBzZWxmLm1heExlbiA9IG1heA0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc2VsZi5tYXhMZW4gPSBfTUFYX0lOVA0KDQogICAgICAgIGlmIGV4YWN0ID4gMDoNCiAgICAgICAgICAgIHNlbGYubWF4TGVuID0gZXhhY3QNCiAgICAgICAgICAgIHNlbGYubWluTGVuID0gZXhhY3QNCg0KICAgICAgICBzZWxmLm5hbWUgPSBfdXN0cihzZWxmKQ0KICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCAiICsgc2VsZi5uYW1lDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSAoIHNlbGYubWluTGVuID09IDAgKQ0KICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgaWYgaW5zdHJpbmdbbG9jXSBpbiBzZWxmLm5vdENoYXJzOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCiAgICAgICAgc3RhcnQgPSBsb2MNCiAgICAgICAgbG9jICs9IDENCiAgICAgICAgbm90Y2hhcnMgPSBzZWxmLm5vdENoYXJzDQogICAgICAgIG1heGxlbiA9IG1pbiggc3RhcnQrc2VsZi5tYXhMZW4sIGxlbihpbnN0cmluZykgKQ0KICAgICAgICB3aGlsZSBsb2MgPCBtYXhsZW4gYW5kIFwNCiAgICAgICAgICAgICAgKGluc3RyaW5nW2xvY10gbm90IGluIG5vdGNoYXJzKToNCiAgICAgICAgICAgIGxvYyArPSAxDQoNCiAgICAgICAgaWYgbG9jIC0gc3RhcnQgPCBzZWxmLm1pbkxlbjoNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQogICAgICAgIHJldHVybiBsb2MsIGluc3RyaW5nW3N0YXJ0OmxvY10NCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHJldHVybiBzdXBlcihDaGFyc05vdEluLCBzZWxmKS5fX3N0cl9fKCkNCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoNCiAgICAgICAgICAgIHBhc3MNCg0KICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToNCiAgICAgICAgICAgIGlmIGxlbihzZWxmLm5vdENoYXJzKSA+IDQ6DQogICAgICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gIiFXOiglcy4uLikiICUgc2VsZi5ub3RDaGFyc1s6NF0NCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gIiFXOiglcykiICUgc2VsZi5ub3RDaGFycw0KDQogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHINCg0KY2xhc3MgV2hpdGUoVG9rZW4pOg0KICAgICIiIg0KICAgIFNwZWNpYWwgbWF0Y2hpbmcgY2xhc3MgZm9yIG1hdGNoaW5nIHdoaXRlc3BhY2UuICBOb3JtYWxseSwgd2hpdGVzcGFjZSBpcyBpZ25vcmVkDQogICAgYnkgcHlwYXJzaW5nIGdyYW1tYXJzLiAgVGhpcyBjbGFzcyBpcyBpbmNsdWRlZCB3aGVuIHNvbWUgd2hpdGVzcGFjZSBzdHJ1Y3R1cmVzDQogICAgYXJlIHNpZ25pZmljYW50LiAgRGVmaW5lIHdpdGggYSBzdHJpbmcgY29udGFpbmluZyB0aGUgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHRvIGJlDQogICAgbWF0Y2hlZDsgZGVmYXVsdCBpcyBDeyIgXFx0XFxyXFxuIn0uICBBbHNvIHRha2VzIG9wdGlvbmFsIEN7bWlufSwgQ3ttYXh9LCBhbmQgQ3tleGFjdH0gYXJndW1lbnRzLA0KICAgIGFzIGRlZmluZWQgZm9yIHRoZSBDe0x7V29yZH19IGNsYXNzLg0KICAgICIiIg0KICAgIHdoaXRlU3RycyA9IHsNCiAgICAgICAgIiAiIDogIjxTUEM+IiwNCiAgICAgICAgIlx0IjogIjxUQUI+IiwNCiAgICAgICAgIlxuIjogIjxMRj4iLA0KICAgICAgICAiXHIiOiAiPENSPiIsDQogICAgICAgICJcZiI6ICI8RkY+IiwNCiAgICAgICAgfQ0KICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3cz0iIFx0XHJcbiIsIG1pbj0xLCBtYXg9MCwgZXhhY3Q9MCk6DQogICAgICAgIHN1cGVyKFdoaXRlLHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgc2VsZi5tYXRjaFdoaXRlID0gd3MNCiAgICAgICAgc2VsZi5zZXRXaGl0ZXNwYWNlQ2hhcnMoICIiLmpvaW4oYyBmb3IgYyBpbiBzZWxmLndoaXRlQ2hhcnMgaWYgYyBub3QgaW4gc2VsZi5tYXRjaFdoaXRlKSApDQogICAgICAgICN+IHNlbGYubGVhdmVXaGl0ZXNwYWNlKCkNCiAgICAgICAgc2VsZi5uYW1lID0gKCIiLmpvaW4oV2hpdGUud2hpdGVTdHJzW2NdIGZvciBjIGluIHNlbGYubWF0Y2hXaGl0ZSkpDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICIgKyBzZWxmLm5hbWUNCg0KICAgICAgICBzZWxmLm1pbkxlbiA9IG1pbg0KDQogICAgICAgIGlmIG1heCA+IDA6DQogICAgICAgICAgICBzZWxmLm1heExlbiA9IG1heA0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc2VsZi5tYXhMZW4gPSBfTUFYX0lOVA0KDQogICAgICAgIGlmIGV4YWN0ID4gMDoNCiAgICAgICAgICAgIHNlbGYubWF4TGVuID0gZXhhY3QNCiAgICAgICAgICAgIHNlbGYubWluTGVuID0gZXhhY3QNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGlmIG5vdChpbnN0cmluZ1sgbG9jIF0gaW4gc2VsZi5tYXRjaFdoaXRlKToNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KICAgICAgICBzdGFydCA9IGxvYw0KICAgICAgICBsb2MgKz0gMQ0KICAgICAgICBtYXhsb2MgPSBzdGFydCArIHNlbGYubWF4TGVuDQogICAgICAgIG1heGxvYyA9IG1pbiggbWF4bG9jLCBsZW4oaW5zdHJpbmcpICkNCiAgICAgICAgd2hpbGUgbG9jIDwgbWF4bG9jIGFuZCBpbnN0cmluZ1tsb2NdIGluIHNlbGYubWF0Y2hXaGl0ZToNCiAgICAgICAgICAgIGxvYyArPSAxDQoNCiAgICAgICAgaWYgbG9jIC0gc3RhcnQgPCBzZWxmLm1pbkxlbjoNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQogICAgICAgIHJldHVybiBsb2MsIGluc3RyaW5nW3N0YXJ0OmxvY10NCg0KDQpjbGFzcyBfUG9zaXRpb25Ub2tlbihUb2tlbik6DQogICAgZGVmIF9faW5pdF9fKCBzZWxmICk6DQogICAgICAgIHN1cGVyKF9Qb3NpdGlvblRva2VuLHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgc2VsZi5uYW1lPXNlbGYuX19jbGFzc19fLl9fbmFtZV9fDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlDQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlDQoNCmNsYXNzIEdvVG9Db2x1bW4oX1Bvc2l0aW9uVG9rZW4pOg0KICAgICIiIg0KICAgIFRva2VuIHRvIGFkdmFuY2UgdG8gYSBzcGVjaWZpYyBjb2x1bW4gb2YgaW5wdXQgdGV4dDsgdXNlZnVsIGZvciB0YWJ1bGFyIHJlcG9ydCBzY3JhcGluZy4NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGNvbG5vICk6DQogICAgICAgIHN1cGVyKEdvVG9Db2x1bW4sc2VsZikuX19pbml0X18oKQ0KICAgICAgICBzZWxmLmNvbCA9IGNvbG5vDQoNCiAgICBkZWYgcHJlUGFyc2UoIHNlbGYsIGluc3RyaW5nLCBsb2MgKToNCiAgICAgICAgaWYgY29sKGxvYyxpbnN0cmluZykgIT0gc2VsZi5jb2w6DQogICAgICAgICAgICBpbnN0cmxlbiA9IGxlbihpbnN0cmluZykNCiAgICAgICAgICAgIGlmIHNlbGYuaWdub3JlRXhwcnM6DQogICAgICAgICAgICAgICAgbG9jID0gc2VsZi5fc2tpcElnbm9yYWJsZXMoIGluc3RyaW5nLCBsb2MgKQ0KICAgICAgICAgICAgd2hpbGUgbG9jIDwgaW5zdHJsZW4gYW5kIGluc3RyaW5nW2xvY10uaXNzcGFjZSgpIGFuZCBjb2woIGxvYywgaW5zdHJpbmcgKSAhPSBzZWxmLmNvbCA6DQogICAgICAgICAgICAgICAgbG9jICs9IDENCiAgICAgICAgcmV0dXJuIGxvYw0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgdGhpc2NvbCA9IGNvbCggbG9jLCBpbnN0cmluZyApDQogICAgICAgIGlmIHRoaXNjb2wgPiBzZWxmLmNvbDoNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKCBpbnN0cmluZywgbG9jLCAiVGV4dCBub3QgaW4gZXhwZWN0ZWQgY29sdW1uIiwgc2VsZiApDQogICAgICAgIG5ld2xvYyA9IGxvYyArIHNlbGYuY29sIC0gdGhpc2NvbA0KICAgICAgICByZXQgPSBpbnN0cmluZ1sgbG9jOiBuZXdsb2MgXQ0KICAgICAgICByZXR1cm4gbmV3bG9jLCByZXQNCg0KDQpjbGFzcyBMaW5lU3RhcnQoX1Bvc2l0aW9uVG9rZW4pOg0KICAgICIiIg0KICAgIE1hdGNoZXMgaWYgY3VycmVudCBwb3NpdGlvbiBpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZSB3aXRoaW4gdGhlIHBhcnNlIHN0cmluZw0KICAgIA0KICAgIEV4YW1wbGU6Og0KICAgIA0KICAgICAgICB0ZXN0ID0gJycnXA0KICAgICAgICBBQUEgdGhpcyBsaW5lDQogICAgICAgIEFBQSBhbmQgdGhpcyBsaW5lDQogICAgICAgICAgQUFBIGJ1dCBub3QgdGhpcyBvbmUNCiAgICAgICAgQiBBQUEgYW5kIGRlZmluaXRlbHkgbm90IHRoaXMgb25lDQogICAgICAgICcnJw0KDQogICAgICAgIGZvciB0IGluIChMaW5lU3RhcnQoKSArICdBQUEnICsgcmVzdE9mTGluZSkuc2VhcmNoU3RyaW5nKHRlc3QpOg0KICAgICAgICAgICAgcHJpbnQodCkNCiAgICANCiAgICBQcmludHM6Og0KICAgICAgICBbJ0FBQScsICcgdGhpcyBsaW5lJ10NCiAgICAgICAgWydBQUEnLCAnIGFuZCB0aGlzIGxpbmUnXSAgICANCg0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiApOg0KICAgICAgICBzdXBlcihMaW5lU3RhcnQsc2VsZikuX19pbml0X18oKQ0KICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCBzdGFydCBvZiBsaW5lIg0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgaWYgY29sKGxvYywgaW5zdHJpbmcpID09IDE6DQogICAgICAgICAgICByZXR1cm4gbG9jLCBbXQ0KICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KY2xhc3MgTGluZUVuZChfUG9zaXRpb25Ub2tlbik6DQogICAgIiIiDQogICAgTWF0Y2hlcyBpZiBjdXJyZW50IHBvc2l0aW9uIGlzIGF0IHRoZSBlbmQgb2YgYSBsaW5lIHdpdGhpbiB0aGUgcGFyc2Ugc3RyaW5nDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmICk6DQogICAgICAgIHN1cGVyKExpbmVFbmQsc2VsZikuX19pbml0X18oKQ0KICAgICAgICBzZWxmLnNldFdoaXRlc3BhY2VDaGFycyggUGFyc2VyRWxlbWVudC5ERUZBVUxUX1dISVRFX0NIQVJTLnJlcGxhY2UoIlxuIiwiIikgKQ0KICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCBlbmQgb2YgbGluZSINCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGlmIGxvYzxsZW4oaW5zdHJpbmcpOg0KICAgICAgICAgICAgaWYgaW5zdHJpbmdbbG9jXSA9PSAiXG4iOg0KICAgICAgICAgICAgICAgIHJldHVybiBsb2MrMSwgIlxuIg0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCiAgICAgICAgZWxpZiBsb2MgPT0gbGVuKGluc3RyaW5nKToNCiAgICAgICAgICAgIHJldHVybiBsb2MrMSwgW10NCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQpjbGFzcyBTdHJpbmdTdGFydChfUG9zaXRpb25Ub2tlbik6DQogICAgIiIiDQogICAgTWF0Y2hlcyBpZiBjdXJyZW50IHBvc2l0aW9uIGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhcnNlIHN0cmluZw0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiApOg0KICAgICAgICBzdXBlcihTdHJpbmdTdGFydCxzZWxmKS5fX2luaXRfXygpDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkIHN0YXJ0IG9mIHRleHQiDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiBsb2MgIT0gMDoNCiAgICAgICAgICAgICMgc2VlIGlmIGVudGlyZSBzdHJpbmcgdXAgdG8gaGVyZSBpcyBqdXN0IHdoaXRlc3BhY2UgYW5kIGlnbm9yZWFibGVzDQogICAgICAgICAgICBpZiBsb2MgIT0gc2VsZi5wcmVQYXJzZSggaW5zdHJpbmcsIDAgKToNCiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCiAgICAgICAgcmV0dXJuIGxvYywgW10NCg0KY2xhc3MgU3RyaW5nRW5kKF9Qb3NpdGlvblRva2VuKToNCiAgICAiIiINCiAgICBNYXRjaGVzIGlmIGN1cnJlbnQgcG9zaXRpb24gaXMgYXQgdGhlIGVuZCBvZiB0aGUgcGFyc2Ugc3RyaW5nDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmICk6DQogICAgICAgIHN1cGVyKFN0cmluZ0VuZCxzZWxmKS5fX2luaXRfXygpDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkIGVuZCBvZiB0ZXh0Ig0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgaWYgbG9jIDwgbGVuKGluc3RyaW5nKToNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KICAgICAgICBlbGlmIGxvYyA9PSBsZW4oaW5zdHJpbmcpOg0KICAgICAgICAgICAgcmV0dXJuIGxvYysxLCBbXQ0KICAgICAgICBlbGlmIGxvYyA+IGxlbihpbnN0cmluZyk6DQogICAgICAgICAgICByZXR1cm4gbG9jLCBbXQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCmNsYXNzIFdvcmRTdGFydChfUG9zaXRpb25Ub2tlbik6DQogICAgIiIiDQogICAgTWF0Y2hlcyBpZiB0aGUgY3VycmVudCBwb3NpdGlvbiBpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgV29yZCwgYW5kDQogICAgaXMgbm90IHByZWNlZGVkIGJ5IGFueSBjaGFyYWN0ZXIgaW4gYSBnaXZlbiBzZXQgb2YgQ3t3b3JkQ2hhcnN9DQogICAgKGRlZmF1bHQ9Q3twcmludGFibGVzfSkuIFRvIGVtdWxhdGUgdGhlIEN7XGJ9IGJlaGF2aW9yIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbnMsDQogICAgdXNlIEN7V29yZFN0YXJ0KGFscGhhbnVtcyl9LiBDe1dvcmRTdGFydH0gd2lsbCBhbHNvIG1hdGNoIGF0IHRoZSBiZWdpbm5pbmcgb2YNCiAgICB0aGUgc3RyaW5nIGJlaW5nIHBhcnNlZCwgb3IgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUuDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKHNlbGYsIHdvcmRDaGFycyA9IHByaW50YWJsZXMpOg0KICAgICAgICBzdXBlcihXb3JkU3RhcnQsc2VsZikuX19pbml0X18oKQ0KICAgICAgICBzZWxmLndvcmRDaGFycyA9IHNldCh3b3JkQ2hhcnMpDQogICAgICAgIHNlbGYuZXJybXNnID0gIk5vdCBhdCB0aGUgc3RhcnQgb2YgYSB3b3JkIg0KDQogICAgZGVmIHBhcnNlSW1wbChzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiBsb2MgIT0gMDoNCiAgICAgICAgICAgIGlmIChpbnN0cmluZ1tsb2MtMV0gaW4gc2VsZi53b3JkQ2hhcnMgb3INCiAgICAgICAgICAgICAgICBpbnN0cmluZ1tsb2NdIG5vdCBpbiBzZWxmLndvcmRDaGFycyk6DQogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQogICAgICAgIHJldHVybiBsb2MsIFtdDQoNCmNsYXNzIFdvcmRFbmQoX1Bvc2l0aW9uVG9rZW4pOg0KICAgICIiIg0KICAgIE1hdGNoZXMgaWYgdGhlIGN1cnJlbnQgcG9zaXRpb24gaXMgYXQgdGhlIGVuZCBvZiBhIFdvcmQsIGFuZA0KICAgIGlzIG5vdCBmb2xsb3dlZCBieSBhbnkgY2hhcmFjdGVyIGluIGEgZ2l2ZW4gc2V0IG9mIEN7d29yZENoYXJzfQ0KICAgIChkZWZhdWx0PUN7cHJpbnRhYmxlc30pLiBUbyBlbXVsYXRlIHRoZSBDe1xifSBiZWhhdmlvciBvZiByZWd1bGFyIGV4cHJlc3Npb25zLA0KICAgIHVzZSBDe1dvcmRFbmQoYWxwaGFudW1zKX0uIEN7V29yZEVuZH0gd2lsbCBhbHNvIG1hdGNoIGF0IHRoZSBlbmQgb2YNCiAgICB0aGUgc3RyaW5nIGJlaW5nIHBhcnNlZCwgb3IgYXQgdGhlIGVuZCBvZiBhIGxpbmUuDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKHNlbGYsIHdvcmRDaGFycyA9IHByaW50YWJsZXMpOg0KICAgICAgICBzdXBlcihXb3JkRW5kLHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgc2VsZi53b3JkQ2hhcnMgPSBzZXQod29yZENoYXJzKQ0KICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gRmFsc2UNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiTm90IGF0IHRoZSBlbmQgb2YgYSB3b3JkIg0KDQogICAgZGVmIHBhcnNlSW1wbChzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpbnN0cmxlbiA9IGxlbihpbnN0cmluZykNCiAgICAgICAgaWYgaW5zdHJsZW4+MCBhbmQgbG9jPGluc3RybGVuOg0KICAgICAgICAgICAgaWYgKGluc3RyaW5nW2xvY10gaW4gc2VsZi53b3JkQ2hhcnMgb3INCiAgICAgICAgICAgICAgICBpbnN0cmluZ1tsb2MtMV0gbm90IGluIHNlbGYud29yZENoYXJzKToNCiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCiAgICAgICAgcmV0dXJuIGxvYywgW10NCg0KDQpjbGFzcyBQYXJzZUV4cHJlc3Npb24oUGFyc2VyRWxlbWVudCk6DQogICAgIiIiDQogICAgQWJzdHJhY3Qgc3ViY2xhc3Mgb2YgUGFyc2VyRWxlbWVudCwgZm9yIGNvbWJpbmluZyBhbmQgcG9zdC1wcm9jZXNzaW5nIHBhcnNlZCB0b2tlbnMuDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHBycywgc2F2ZWxpc3QgPSBGYWxzZSApOg0KICAgICAgICBzdXBlcihQYXJzZUV4cHJlc3Npb24sc2VsZikuX19pbml0X18oc2F2ZWxpc3QpDQogICAgICAgIGlmIGlzaW5zdGFuY2UoIGV4cHJzLCBfZ2VuZXJhdG9yVHlwZSApOg0KICAgICAgICAgICAgZXhwcnMgPSBsaXN0KGV4cHJzKQ0KDQogICAgICAgIGlmIGlzaW5zdGFuY2UoIGV4cHJzLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBzZWxmLmV4cHJzID0gWyBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIGV4cHJzICkgXQ0KICAgICAgICBlbGlmIGlzaW5zdGFuY2UoIGV4cHJzLCBJdGVyYWJsZSApOg0KICAgICAgICAgICAgZXhwcnMgPSBsaXN0KGV4cHJzKQ0KICAgICAgICAgICAgIyBpZiBzZXF1ZW5jZSBvZiBzdHJpbmdzIHByb3ZpZGVkLCB3cmFwIHdpdGggTGl0ZXJhbA0KICAgICAgICAgICAgaWYgYWxsKGlzaW5zdGFuY2UoZXhwciwgYmFzZXN0cmluZykgZm9yIGV4cHIgaW4gZXhwcnMpOg0KICAgICAgICAgICAgICAgIGV4cHJzID0gbWFwKFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcywgZXhwcnMpDQogICAgICAgICAgICBzZWxmLmV4cHJzID0gbGlzdChleHBycykNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICBzZWxmLmV4cHJzID0gbGlzdCggZXhwcnMgKQ0KICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoNCiAgICAgICAgICAgICAgICBzZWxmLmV4cHJzID0gWyBleHBycyBdDQogICAgICAgIHNlbGYuY2FsbFByZXBhcnNlID0gRmFsc2UNCg0KICAgIGRlZiBfX2dldGl0ZW1fXyggc2VsZiwgaSApOg0KICAgICAgICByZXR1cm4gc2VsZi5leHByc1tpXQ0KDQogICAgZGVmIGFwcGVuZCggc2VsZiwgb3RoZXIgKToNCiAgICAgICAgc2VsZi5leHBycy5hcHBlbmQoIG90aGVyICkNCiAgICAgICAgc2VsZi5zdHJSZXByID0gTm9uZQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIGxlYXZlV2hpdGVzcGFjZSggc2VsZiApOg0KICAgICAgICAiIiJFeHRlbmRzIEN7bGVhdmVXaGl0ZXNwYWNlfSBkZWZpbmVkIGluIGJhc2UgY2xhc3MsIGFuZCBhbHNvIGludm9rZXMgQ3tsZWF2ZVdoaXRlc3BhY2V9IG9uDQogICAgICAgICAgIGFsbCBjb250YWluZWQgZXhwcmVzc2lvbnMuIiIiDQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBGYWxzZQ0KICAgICAgICBzZWxmLmV4cHJzID0gWyBlLmNvcHkoKSBmb3IgZSBpbiBzZWxmLmV4cHJzIF0NCiAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoNCiAgICAgICAgICAgIGUubGVhdmVXaGl0ZXNwYWNlKCkNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBpZ25vcmUoIHNlbGYsIG90aGVyICk6DQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBTdXBwcmVzcyApOg0KICAgICAgICAgICAgaWYgb3RoZXIgbm90IGluIHNlbGYuaWdub3JlRXhwcnM6DQogICAgICAgICAgICAgICAgc3VwZXIoIFBhcnNlRXhwcmVzc2lvbiwgc2VsZikuaWdub3JlKCBvdGhlciApDQogICAgICAgICAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoNCiAgICAgICAgICAgICAgICAgICAgZS5pZ25vcmUoIHNlbGYuaWdub3JlRXhwcnNbLTFdICkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHN1cGVyKCBQYXJzZUV4cHJlc3Npb24sIHNlbGYpLmlnbm9yZSggb3RoZXIgKQ0KICAgICAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoNCiAgICAgICAgICAgICAgICBlLmlnbm9yZSggc2VsZi5pZ25vcmVFeHByc1stMV0gKQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgcmV0dXJuIHN1cGVyKFBhcnNlRXhwcmVzc2lvbixzZWxmKS5fX3N0cl9fKCkNCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoNCiAgICAgICAgICAgIHBhc3MNCg0KICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToNCiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICIlczooJXMpIiAlICggc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIF91c3RyKHNlbGYuZXhwcnMpICkNCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcg0KDQogICAgZGVmIHN0cmVhbWxpbmUoIHNlbGYgKToNCiAgICAgICAgc3VwZXIoUGFyc2VFeHByZXNzaW9uLHNlbGYpLnN0cmVhbWxpbmUoKQ0KDQogICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnM6DQogICAgICAgICAgICBlLnN0cmVhbWxpbmUoKQ0KDQogICAgICAgICMgY29sbGFwc2UgbmVzdGVkIEFuZCdzIG9mIHRoZSBmb3JtIEFuZCggQW5kKCBBbmQoIGEsYiksIGMpLCBkKSB0byBBbmQoIGEsYixjLGQgKQ0KICAgICAgICAjIGJ1dCBvbmx5IGlmIHRoZXJlIGFyZSBubyBwYXJzZSBhY3Rpb25zIG9yIHJlc3VsdHNOYW1lcyBvbiB0aGUgbmVzdGVkIEFuZCdzDQogICAgICAgICMgKGxpa2V3aXNlIGZvciBPcidzIGFuZCBNYXRjaEZpcnN0J3MpDQogICAgICAgIGlmICggbGVuKHNlbGYuZXhwcnMpID09IDIgKToNCiAgICAgICAgICAgIG90aGVyID0gc2VsZi5leHByc1swXQ0KICAgICAgICAgICAgaWYgKCBpc2luc3RhbmNlKCBvdGhlciwgc2VsZi5fX2NsYXNzX18gKSBhbmQNCiAgICAgICAgICAgICAgICAgIG5vdChvdGhlci5wYXJzZUFjdGlvbikgYW5kDQogICAgICAgICAgICAgICAgICBvdGhlci5yZXN1bHRzTmFtZSBpcyBOb25lIGFuZA0KICAgICAgICAgICAgICAgICAgbm90IG90aGVyLmRlYnVnICk6DQogICAgICAgICAgICAgICAgc2VsZi5leHBycyA9IG90aGVyLmV4cHJzWzpdICsgWyBzZWxmLmV4cHJzWzFdIF0NCiAgICAgICAgICAgICAgICBzZWxmLnN0clJlcHIgPSBOb25lDQogICAgICAgICAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSB8PSBvdGhlci5tYXlSZXR1cm5FbXB0eQ0KICAgICAgICAgICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciAgfD0gb3RoZXIubWF5SW5kZXhFcnJvcg0KDQogICAgICAgICAgICBvdGhlciA9IHNlbGYuZXhwcnNbLTFdDQogICAgICAgICAgICBpZiAoIGlzaW5zdGFuY2UoIG90aGVyLCBzZWxmLl9fY2xhc3NfXyApIGFuZA0KICAgICAgICAgICAgICAgICAgbm90KG90aGVyLnBhcnNlQWN0aW9uKSBhbmQNCiAgICAgICAgICAgICAgICAgIG90aGVyLnJlc3VsdHNOYW1lIGlzIE5vbmUgYW5kDQogICAgICAgICAgICAgICAgICBub3Qgb3RoZXIuZGVidWcgKToNCiAgICAgICAgICAgICAgICBzZWxmLmV4cHJzID0gc2VsZi5leHByc1s6LTFdICsgb3RoZXIuZXhwcnNbOl0NCiAgICAgICAgICAgICAgICBzZWxmLnN0clJlcHIgPSBOb25lDQogICAgICAgICAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSB8PSBvdGhlci5tYXlSZXR1cm5FbXB0eQ0KICAgICAgICAgICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciAgfD0gb3RoZXIubWF5SW5kZXhFcnJvcg0KDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICIgKyBfdXN0cihzZWxmKQ0KICAgICAgICANCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBzZXRSZXN1bHRzTmFtZSggc2VsZiwgbmFtZSwgbGlzdEFsbE1hdGNoZXM9RmFsc2UgKToNCiAgICAgICAgcmV0ID0gc3VwZXIoUGFyc2VFeHByZXNzaW9uLHNlbGYpLnNldFJlc3VsdHNOYW1lKG5hbWUsbGlzdEFsbE1hdGNoZXMpDQogICAgICAgIHJldHVybiByZXQNCg0KICAgIGRlZiB2YWxpZGF0ZSggc2VsZiwgdmFsaWRhdGVUcmFjZT1bXSApOg0KICAgICAgICB0bXAgPSB2YWxpZGF0ZVRyYWNlWzpdK1tzZWxmXQ0KICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOg0KICAgICAgICAgICAgZS52YWxpZGF0ZSh0bXApDQogICAgICAgIHNlbGYuY2hlY2tSZWN1cnNpb24oIFtdICkNCiAgICAgICAgDQogICAgZGVmIGNvcHkoc2VsZik6DQogICAgICAgIHJldCA9IHN1cGVyKFBhcnNlRXhwcmVzc2lvbixzZWxmKS5jb3B5KCkNCiAgICAgICAgcmV0LmV4cHJzID0gW2UuY29weSgpIGZvciBlIGluIHNlbGYuZXhwcnNdDQogICAgICAgIHJldHVybiByZXQNCg0KY2xhc3MgQW5kKFBhcnNlRXhwcmVzc2lvbik6DQogICAgIiIiDQogICAgUmVxdWlyZXMgYWxsIGdpdmVuIEN7UGFyc2VFeHByZXNzaW9ufXMgdG8gYmUgZm91bmQgaW4gdGhlIGdpdmVuIG9yZGVyLg0KICAgIEV4cHJlc3Npb25zIG1heSBiZSBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZS4NCiAgICBNYXkgYmUgY29uc3RydWN0ZWQgdXNpbmcgdGhlIEN7JysnfSBvcGVyYXRvci4NCiAgICBNYXkgYWxzbyBiZSBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgQ3snLSd9IG9wZXJhdG9yLCB3aGljaCB3aWxsIHN1cHByZXNzIGJhY2t0cmFja2luZy4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKQ0KICAgICAgICBuYW1lX2V4cHIgPSBPbmVPck1vcmUoV29yZChhbHBoYXMpKQ0KDQogICAgICAgIGV4cHIgPSBBbmQoW2ludGVnZXIoImlkIiksbmFtZV9leHByKCJuYW1lIiksaW50ZWdlcigiYWdlIildKQ0KICAgICAgICAjIG1vcmUgZWFzaWx5IHdyaXR0ZW4gYXM6DQogICAgICAgIGV4cHIgPSBpbnRlZ2VyKCJpZCIpICsgbmFtZV9leHByKCJuYW1lIikgKyBpbnRlZ2VyKCJhZ2UiKQ0KICAgICIiIg0KDQogICAgY2xhc3MgX0Vycm9yU3RvcChFbXB0eSk6DQogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOg0KICAgICAgICAgICAgc3VwZXIoQW5kLl9FcnJvclN0b3Asc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3dhcmdzKQ0KICAgICAgICAgICAgc2VsZi5uYW1lID0gJy0nDQogICAgICAgICAgICBzZWxmLmxlYXZlV2hpdGVzcGFjZSgpDQoNCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHJzLCBzYXZlbGlzdCA9IFRydWUgKToNCiAgICAgICAgc3VwZXIoQW5kLHNlbGYpLl9faW5pdF9fKGV4cHJzLCBzYXZlbGlzdCkNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IGFsbChlLm1heVJldHVybkVtcHR5IGZvciBlIGluIHNlbGYuZXhwcnMpDQogICAgICAgIHNlbGYuc2V0V2hpdGVzcGFjZUNoYXJzKCBzZWxmLmV4cHJzWzBdLndoaXRlQ2hhcnMgKQ0KICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gc2VsZi5leHByc1swXS5za2lwV2hpdGVzcGFjZQ0KICAgICAgICBzZWxmLmNhbGxQcmVwYXJzZSA9IFRydWUNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgICMgcGFzcyBGYWxzZSBhcyBsYXN0IGFyZyB0byBfcGFyc2UgZm9yIGZpcnN0IGVsZW1lbnQsIHNpbmNlIHdlIGFscmVhZHkNCiAgICAgICAgIyBwcmUtcGFyc2VkIHRoZSBzdHJpbmcgYXMgcGFydCBvZiBvdXIgQW5kIHByZS1wYXJzaW5nDQogICAgICAgIGxvYywgcmVzdWx0bGlzdCA9IHNlbGYuZXhwcnNbMF0uX3BhcnNlKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMsIGNhbGxQcmVQYXJzZT1GYWxzZSApDQogICAgICAgIGVycm9yU3RvcCA9IEZhbHNlDQogICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnNbMTpdOg0KICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShlLCBBbmQuX0Vycm9yU3RvcCk6DQogICAgICAgICAgICAgICAgZXJyb3JTdG9wID0gVHJ1ZQ0KICAgICAgICAgICAgICAgIGNvbnRpbnVlDQogICAgICAgICAgICBpZiBlcnJvclN0b3A6DQogICAgICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgICAgICBsb2MsIGV4cHJ0b2tlbnMgPSBlLl9wYXJzZSggaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zICkNCiAgICAgICAgICAgICAgICBleGNlcHQgUGFyc2VTeW50YXhFeGNlcHRpb246DQogICAgICAgICAgICAgICAgICAgIHJhaXNlDQogICAgICAgICAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbiBhcyBwZToNCiAgICAgICAgICAgICAgICAgICAgcGUuX190cmFjZWJhY2tfXyA9IE5vbmUNCiAgICAgICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VTeW50YXhFeGNlcHRpb24uX2Zyb21fZXhjZXB0aW9uKHBlKQ0KICAgICAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOg0KICAgICAgICAgICAgICAgICAgICByYWlzZSBQYXJzZVN5bnRheEV4Y2VwdGlvbihpbnN0cmluZywgbGVuKGluc3RyaW5nKSwgc2VsZi5lcnJtc2csIHNlbGYpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIGxvYywgZXhwcnRva2VucyA9IGUuX3BhcnNlKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMgKQ0KICAgICAgICAgICAgaWYgZXhwcnRva2VucyBvciBleHBydG9rZW5zLmhhc2tleXMoKToNCiAgICAgICAgICAgICAgICByZXN1bHRsaXN0ICs9IGV4cHJ0b2tlbnMNCiAgICAgICAgcmV0dXJuIGxvYywgcmVzdWx0bGlzdA0KDQogICAgZGVmIF9faWFkZF9fKHNlbGYsIG90aGVyICk6DQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQ0KICAgICAgICByZXR1cm4gc2VsZi5hcHBlbmQoIG90aGVyICkgI0FuZCggWyBzZWxmLCBvdGhlciBdICkNCg0KICAgIGRlZiBjaGVja1JlY3Vyc2lvbiggc2VsZiwgcGFyc2VFbGVtZW50TGlzdCApOg0KICAgICAgICBzdWJSZWNDaGVja0xpc3QgPSBwYXJzZUVsZW1lbnRMaXN0WzpdICsgWyBzZWxmIF0NCiAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoNCiAgICAgICAgICAgIGUuY2hlY2tSZWN1cnNpb24oIHN1YlJlY0NoZWNrTGlzdCApDQogICAgICAgICAgICBpZiBub3QgZS5tYXlSZXR1cm5FbXB0eToNCiAgICAgICAgICAgICAgICBicmVhaw0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCJuYW1lIik6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lDQoNCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6DQogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAieyIgKyAiICIuam9pbihfdXN0cihlKSBmb3IgZSBpbiBzZWxmLmV4cHJzKSArICJ9Ig0KDQogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHINCg0KDQpjbGFzcyBPcihQYXJzZUV4cHJlc3Npb24pOg0KICAgICIiIg0KICAgIFJlcXVpcmVzIHRoYXQgYXQgbGVhc3Qgb25lIEN7UGFyc2VFeHByZXNzaW9ufSBpcyBmb3VuZC4NCiAgICBJZiB0d28gZXhwcmVzc2lvbnMgbWF0Y2gsIHRoZSBleHByZXNzaW9uIHRoYXQgbWF0Y2hlcyB0aGUgbG9uZ2VzdCBzdHJpbmcgd2lsbCBiZSB1c2VkLg0KICAgIE1heSBiZSBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgQ3snXid9IG9wZXJhdG9yLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgICMgY29uc3RydWN0IE9yIHVzaW5nICdeJyBvcGVyYXRvcg0KICAgICAgICANCiAgICAgICAgbnVtYmVyID0gV29yZChudW1zKSBeIENvbWJpbmUoV29yZChudW1zKSArICcuJyArIFdvcmQobnVtcykpDQogICAgICAgIHByaW50KG51bWJlci5zZWFyY2hTdHJpbmcoIjEyMyAzLjE0MTYgNzg5IikpDQogICAgcHJpbnRzOjoNCiAgICAgICAgW1snMTIzJ10sIFsnMy4xNDE2J10sIFsnNzg5J11dDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHBycywgc2F2ZWxpc3QgPSBGYWxzZSApOg0KICAgICAgICBzdXBlcihPcixzZWxmKS5fX2luaXRfXyhleHBycywgc2F2ZWxpc3QpDQogICAgICAgIGlmIHNlbGYuZXhwcnM6DQogICAgICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gYW55KGUubWF5UmV0dXJuRW1wdHkgZm9yIGUgaW4gc2VsZi5leHBycykNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBtYXhFeGNMb2MgPSAtMQ0KICAgICAgICBtYXhFeGNlcHRpb24gPSBOb25lDQogICAgICAgIG1hdGNoZXMgPSBbXQ0KICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOg0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIGxvYzIgPSBlLnRyeVBhcnNlKCBpbnN0cmluZywgbG9jICkNCiAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUV4Y2VwdGlvbiBhcyBlcnI6DQogICAgICAgICAgICAgICAgZXJyLl9fdHJhY2ViYWNrX18gPSBOb25lDQogICAgICAgICAgICAgICAgaWYgZXJyLmxvYyA+IG1heEV4Y0xvYzoNCiAgICAgICAgICAgICAgICAgICAgbWF4RXhjZXB0aW9uID0gZXJyDQogICAgICAgICAgICAgICAgICAgIG1heEV4Y0xvYyA9IGVyci5sb2MNCiAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOg0KICAgICAgICAgICAgICAgIGlmIGxlbihpbnN0cmluZykgPiBtYXhFeGNMb2M6DQogICAgICAgICAgICAgICAgICAgIG1heEV4Y2VwdGlvbiA9IFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLGxlbihpbnN0cmluZyksZS5lcnJtc2csc2VsZikNCiAgICAgICAgICAgICAgICAgICAgbWF4RXhjTG9jID0gbGVuKGluc3RyaW5nKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAjIHNhdmUgbWF0Y2ggYW1vbmcgYWxsIG1hdGNoZXMsIHRvIHJldHJ5IGxvbmdlc3QgdG8gc2hvcnRlc3QNCiAgICAgICAgICAgICAgICBtYXRjaGVzLmFwcGVuZCgobG9jMiwgZSkpDQoNCiAgICAgICAgaWYgbWF0Y2hlczoNCiAgICAgICAgICAgIG1hdGNoZXMuc29ydChrZXk9bGFtYmRhIHg6IC14WzBdKQ0KICAgICAgICAgICAgZm9yIF8sZSBpbiBtYXRjaGVzOg0KICAgICAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuX3BhcnNlKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMgKQ0KICAgICAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUV4Y2VwdGlvbiBhcyBlcnI6DQogICAgICAgICAgICAgICAgICAgIGVyci5fX3RyYWNlYmFja19fID0gTm9uZQ0KICAgICAgICAgICAgICAgICAgICBpZiBlcnIubG9jID4gbWF4RXhjTG9jOg0KICAgICAgICAgICAgICAgICAgICAgICAgbWF4RXhjZXB0aW9uID0gZXJyDQogICAgICAgICAgICAgICAgICAgICAgICBtYXhFeGNMb2MgPSBlcnIubG9jDQoNCiAgICAgICAgaWYgbWF4RXhjZXB0aW9uIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgbWF4RXhjZXB0aW9uLm1zZyA9IHNlbGYuZXJybXNnDQogICAgICAgICAgICByYWlzZSBtYXhFeGNlcHRpb24NCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsICJubyBkZWZpbmVkIGFsdGVybmF0aXZlcyB0byBtYXRjaCIsIHNlbGYpDQoNCg0KICAgIGRlZiBfX2l4b3JfXyhzZWxmLCBvdGhlciApOg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkNCiAgICAgICAgcmV0dXJuIHNlbGYuYXBwZW5kKCBvdGhlciApICNPciggWyBzZWxmLCBvdGhlciBdICkNCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwibmFtZSIpOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZQ0KDQogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOg0KICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gInsiICsgIiBeICIuam9pbihfdXN0cihlKSBmb3IgZSBpbiBzZWxmLmV4cHJzKSArICJ9Ig0KDQogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHINCg0KICAgIGRlZiBjaGVja1JlY3Vyc2lvbiggc2VsZiwgcGFyc2VFbGVtZW50TGlzdCApOg0KICAgICAgICBzdWJSZWNDaGVja0xpc3QgPSBwYXJzZUVsZW1lbnRMaXN0WzpdICsgWyBzZWxmIF0NCiAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoNCiAgICAgICAgICAgIGUuY2hlY2tSZWN1cnNpb24oIHN1YlJlY0NoZWNrTGlzdCApDQoNCg0KY2xhc3MgTWF0Y2hGaXJzdChQYXJzZUV4cHJlc3Npb24pOg0KICAgICIiIg0KICAgIFJlcXVpcmVzIHRoYXQgYXQgbGVhc3Qgb25lIEN7UGFyc2VFeHByZXNzaW9ufSBpcyBmb3VuZC4NCiAgICBJZiB0d28gZXhwcmVzc2lvbnMgbWF0Y2gsIHRoZSBmaXJzdCBvbmUgbGlzdGVkIGlzIHRoZSBvbmUgdGhhdCB3aWxsIG1hdGNoLg0KICAgIE1heSBiZSBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgQ3snfCd9IG9wZXJhdG9yLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgICMgY29uc3RydWN0IE1hdGNoRmlyc3QgdXNpbmcgJ3wnIG9wZXJhdG9yDQogICAgICAgIA0KICAgICAgICAjIHdhdGNoIHRoZSBvcmRlciBvZiBleHByZXNzaW9ucyB0byBtYXRjaA0KICAgICAgICBudW1iZXIgPSBXb3JkKG51bXMpIHwgQ29tYmluZShXb3JkKG51bXMpICsgJy4nICsgV29yZChudW1zKSkNCiAgICAgICAgcHJpbnQobnVtYmVyLnNlYXJjaFN0cmluZygiMTIzIDMuMTQxNiA3ODkiKSkgIyAgRmFpbCEgLT4gW1snMTIzJ10sIFsnMyddLCBbJzE0MTYnXSwgWyc3ODknXV0NCg0KICAgICAgICAjIHB1dCBtb3JlIHNlbGVjdGl2ZSBleHByZXNzaW9uIGZpcnN0DQogICAgICAgIG51bWJlciA9IENvbWJpbmUoV29yZChudW1zKSArICcuJyArIFdvcmQobnVtcykpIHwgV29yZChudW1zKQ0KICAgICAgICBwcmludChudW1iZXIuc2VhcmNoU3RyaW5nKCIxMjMgMy4xNDE2IDc4OSIpKSAjICBCZXR0ZXIgLT4gW1snMTIzJ10sIFsnMy4xNDE2J10sIFsnNzg5J11dDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHBycywgc2F2ZWxpc3QgPSBGYWxzZSApOg0KICAgICAgICBzdXBlcihNYXRjaEZpcnN0LHNlbGYpLl9faW5pdF9fKGV4cHJzLCBzYXZlbGlzdCkNCiAgICAgICAgaWYgc2VsZi5leHByczoNCiAgICAgICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBhbnkoZS5tYXlSZXR1cm5FbXB0eSBmb3IgZSBpbiBzZWxmLmV4cHJzKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIG1heEV4Y0xvYyA9IC0xDQogICAgICAgIG1heEV4Y2VwdGlvbiA9IE5vbmUNCiAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoNCiAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICByZXQgPSBlLl9wYXJzZSggaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zICkNCiAgICAgICAgICAgICAgICByZXR1cm4gcmV0DQogICAgICAgICAgICBleGNlcHQgUGFyc2VFeGNlcHRpb24gYXMgZXJyOg0KICAgICAgICAgICAgICAgIGlmIGVyci5sb2MgPiBtYXhFeGNMb2M6DQogICAgICAgICAgICAgICAgICAgIG1heEV4Y2VwdGlvbiA9IGVycg0KICAgICAgICAgICAgICAgICAgICBtYXhFeGNMb2MgPSBlcnIubG9jDQogICAgICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoNCiAgICAgICAgICAgICAgICBpZiBsZW4oaW5zdHJpbmcpID4gbWF4RXhjTG9jOg0KICAgICAgICAgICAgICAgICAgICBtYXhFeGNlcHRpb24gPSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZyxsZW4oaW5zdHJpbmcpLGUuZXJybXNnLHNlbGYpDQogICAgICAgICAgICAgICAgICAgIG1heEV4Y0xvYyA9IGxlbihpbnN0cmluZykNCg0KICAgICAgICAjIG9ubHkgZ290IGhlcmUgaWYgbm8gZXhwcmVzc2lvbiBtYXRjaGVkLCByYWlzZSBleGNlcHRpb24gZm9yIG1hdGNoIHRoYXQgbWFkZSBpdCB0aGUgZnVydGhlc3QNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIGlmIG1heEV4Y2VwdGlvbiBpcyBub3QgTm9uZToNCiAgICAgICAgICAgICAgICBtYXhFeGNlcHRpb24ubXNnID0gc2VsZi5lcnJtc2cNCiAgICAgICAgICAgICAgICByYWlzZSBtYXhFeGNlcHRpb24NCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgIm5vIGRlZmluZWQgYWx0ZXJuYXRpdmVzIHRvIG1hdGNoIiwgc2VsZikNCg0KICAgIGRlZiBfX2lvcl9fKHNlbGYsIG90aGVyICk6DQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQ0KICAgICAgICByZXR1cm4gc2VsZi5hcHBlbmQoIG90aGVyICkgI01hdGNoRmlyc3QoIFsgc2VsZiwgb3RoZXIgXSApDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICBpZiBoYXNhdHRyKHNlbGYsIm5hbWUiKToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWUNCg0KICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToNCiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJ7IiArICIgfCAiLmpvaW4oX3VzdHIoZSkgZm9yIGUgaW4gc2VsZi5leHBycykgKyAifSINCg0KICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByDQoNCiAgICBkZWYgY2hlY2tSZWN1cnNpb24oIHNlbGYsIHBhcnNlRWxlbWVudExpc3QgKToNCiAgICAgICAgc3ViUmVjQ2hlY2tMaXN0ID0gcGFyc2VFbGVtZW50TGlzdFs6XSArIFsgc2VsZiBdDQogICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnM6DQogICAgICAgICAgICBlLmNoZWNrUmVjdXJzaW9uKCBzdWJSZWNDaGVja0xpc3QgKQ0KDQoNCmNsYXNzIEVhY2goUGFyc2VFeHByZXNzaW9uKToNCiAgICAiIiINCiAgICBSZXF1aXJlcyBhbGwgZ2l2ZW4gQ3tQYXJzZUV4cHJlc3Npb259cyB0byBiZSBmb3VuZCwgYnV0IGluIGFueSBvcmRlci4NCiAgICBFeHByZXNzaW9ucyBtYXkgYmUgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UuDQogICAgTWF5IGJlIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSBDeycmJ30gb3BlcmF0b3IuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgY29sb3IgPSBvbmVPZigiUkVEIE9SQU5HRSBZRUxMT1cgR1JFRU4gQkxVRSBQVVJQTEUgQkxBQ0sgV0hJVEUgQlJPV04iKQ0KICAgICAgICBzaGFwZV90eXBlID0gb25lT2YoIlNRVUFSRSBDSVJDTEUgVFJJQU5HTEUgU1RBUiBIRVhBR09OIE9DVEFHT04iKQ0KICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKQ0KICAgICAgICBzaGFwZV9hdHRyID0gInNoYXBlOiIgKyBzaGFwZV90eXBlKCJzaGFwZSIpDQogICAgICAgIHBvc25fYXR0ciA9ICJwb3NuOiIgKyBHcm91cChpbnRlZ2VyKCJ4IikgKyAnLCcgKyBpbnRlZ2VyKCJ5IikpKCJwb3NuIikNCiAgICAgICAgY29sb3JfYXR0ciA9ICJjb2xvcjoiICsgY29sb3IoImNvbG9yIikNCiAgICAgICAgc2l6ZV9hdHRyID0gInNpemU6IiArIGludGVnZXIoInNpemUiKQ0KDQogICAgICAgICMgdXNlIEVhY2ggKHVzaW5nIG9wZXJhdG9yICcmJykgdG8gYWNjZXB0IGF0dHJpYnV0ZXMgaW4gYW55IG9yZGVyIA0KICAgICAgICAjIChzaGFwZSBhbmQgcG9zbiBhcmUgcmVxdWlyZWQsIGNvbG9yIGFuZCBzaXplIGFyZSBvcHRpb25hbCkNCiAgICAgICAgc2hhcGVfc3BlYyA9IHNoYXBlX2F0dHIgJiBwb3NuX2F0dHIgJiBPcHRpb25hbChjb2xvcl9hdHRyKSAmIE9wdGlvbmFsKHNpemVfYXR0cikNCg0KICAgICAgICBzaGFwZV9zcGVjLnJ1blRlc3RzKCcnJw0KICAgICAgICAgICAgc2hhcGU6IFNRVUFSRSBjb2xvcjogQkxBQ0sgcG9zbjogMTAwLCAxMjANCiAgICAgICAgICAgIHNoYXBlOiBDSVJDTEUgc2l6ZTogNTAgY29sb3I6IEJMVUUgcG9zbjogNTAsODANCiAgICAgICAgICAgIGNvbG9yOkdSRUVOIHNpemU6MjAgc2hhcGU6VFJJQU5HTEUgcG9zbjoyMCw0MA0KICAgICAgICAgICAgJycnDQogICAgICAgICAgICApDQogICAgcHJpbnRzOjoNCiAgICAgICAgc2hhcGU6IFNRVUFSRSBjb2xvcjogQkxBQ0sgcG9zbjogMTAwLCAxMjANCiAgICAgICAgWydzaGFwZTonLCAnU1FVQVJFJywgJ2NvbG9yOicsICdCTEFDSycsICdwb3NuOicsIFsnMTAwJywgJywnLCAnMTIwJ11dDQogICAgICAgIC0gY29sb3I6IEJMQUNLDQogICAgICAgIC0gcG9zbjogWycxMDAnLCAnLCcsICcxMjAnXQ0KICAgICAgICAgIC0geDogMTAwDQogICAgICAgICAgLSB5OiAxMjANCiAgICAgICAgLSBzaGFwZTogU1FVQVJFDQoNCg0KICAgICAgICBzaGFwZTogQ0lSQ0xFIHNpemU6IDUwIGNvbG9yOiBCTFVFIHBvc246IDUwLDgwDQogICAgICAgIFsnc2hhcGU6JywgJ0NJUkNMRScsICdzaXplOicsICc1MCcsICdjb2xvcjonLCAnQkxVRScsICdwb3NuOicsIFsnNTAnLCAnLCcsICc4MCddXQ0KICAgICAgICAtIGNvbG9yOiBCTFVFDQogICAgICAgIC0gcG9zbjogWyc1MCcsICcsJywgJzgwJ10NCiAgICAgICAgICAtIHg6IDUwDQogICAgICAgICAgLSB5OiA4MA0KICAgICAgICAtIHNoYXBlOiBDSVJDTEUNCiAgICAgICAgLSBzaXplOiA1MA0KDQoNCiAgICAgICAgY29sb3I6IEdSRUVOIHNpemU6IDIwIHNoYXBlOiBUUklBTkdMRSBwb3NuOiAyMCw0MA0KICAgICAgICBbJ2NvbG9yOicsICdHUkVFTicsICdzaXplOicsICcyMCcsICdzaGFwZTonLCAnVFJJQU5HTEUnLCAncG9zbjonLCBbJzIwJywgJywnLCAnNDAnXV0NCiAgICAgICAgLSBjb2xvcjogR1JFRU4NCiAgICAgICAgLSBwb3NuOiBbJzIwJywgJywnLCAnNDAnXQ0KICAgICAgICAgIC0geDogMjANCiAgICAgICAgICAtIHk6IDQwDQogICAgICAgIC0gc2hhcGU6IFRSSUFOR0xFDQogICAgICAgIC0gc2l6ZTogMjANCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHJzLCBzYXZlbGlzdCA9IFRydWUgKToNCiAgICAgICAgc3VwZXIoRWFjaCxzZWxmKS5fX2luaXRfXyhleHBycywgc2F2ZWxpc3QpDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBhbGwoZS5tYXlSZXR1cm5FbXB0eSBmb3IgZSBpbiBzZWxmLmV4cHJzKQ0KICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gVHJ1ZQ0KICAgICAgICBzZWxmLmluaXRFeHByR3JvdXBzID0gVHJ1ZQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgaWYgc2VsZi5pbml0RXhwckdyb3VwczoNCiAgICAgICAgICAgIHNlbGYub3B0MW1hcCA9IGRpY3QoKGlkKGUuZXhwciksZSkgZm9yIGUgaW4gc2VsZi5leHBycyBpZiBpc2luc3RhbmNlKGUsT3B0aW9uYWwpKQ0KICAgICAgICAgICAgb3B0MSA9IFsgZS5leHByIGZvciBlIGluIHNlbGYuZXhwcnMgaWYgaXNpbnN0YW5jZShlLE9wdGlvbmFsKSBdDQogICAgICAgICAgICBvcHQyID0gWyBlIGZvciBlIGluIHNlbGYuZXhwcnMgaWYgZS5tYXlSZXR1cm5FbXB0eSBhbmQgbm90IGlzaW5zdGFuY2UoZSxPcHRpb25hbCldDQogICAgICAgICAgICBzZWxmLm9wdGlvbmFscyA9IG9wdDEgKyBvcHQyDQogICAgICAgICAgICBzZWxmLm11bHRpb3B0aW9uYWxzID0gWyBlLmV4cHIgZm9yIGUgaW4gc2VsZi5leHBycyBpZiBpc2luc3RhbmNlKGUsWmVyb09yTW9yZSkgXQ0KICAgICAgICAgICAgc2VsZi5tdWx0aXJlcXVpcmVkID0gWyBlLmV4cHIgZm9yIGUgaW4gc2VsZi5leHBycyBpZiBpc2luc3RhbmNlKGUsT25lT3JNb3JlKSBdDQogICAgICAgICAgICBzZWxmLnJlcXVpcmVkID0gWyBlIGZvciBlIGluIHNlbGYuZXhwcnMgaWYgbm90IGlzaW5zdGFuY2UoZSwoT3B0aW9uYWwsWmVyb09yTW9yZSxPbmVPck1vcmUpKSBdDQogICAgICAgICAgICBzZWxmLnJlcXVpcmVkICs9IHNlbGYubXVsdGlyZXF1aXJlZA0KICAgICAgICAgICAgc2VsZi5pbml0RXhwckdyb3VwcyA9IEZhbHNlDQogICAgICAgIHRtcExvYyA9IGxvYw0KICAgICAgICB0bXBSZXFkID0gc2VsZi5yZXF1aXJlZFs6XQ0KICAgICAgICB0bXBPcHQgID0gc2VsZi5vcHRpb25hbHNbOl0NCiAgICAgICAgbWF0Y2hPcmRlciA9IFtdDQoNCiAgICAgICAga2VlcE1hdGNoaW5nID0gVHJ1ZQ0KICAgICAgICB3aGlsZSBrZWVwTWF0Y2hpbmc6DQogICAgICAgICAgICB0bXBFeHBycyA9IHRtcFJlcWQgKyB0bXBPcHQgKyBzZWxmLm11bHRpb3B0aW9uYWxzICsgc2VsZi5tdWx0aXJlcXVpcmVkDQogICAgICAgICAgICBmYWlsZWQgPSBbXQ0KICAgICAgICAgICAgZm9yIGUgaW4gdG1wRXhwcnM6DQogICAgICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgICAgICB0bXBMb2MgPSBlLnRyeVBhcnNlKCBpbnN0cmluZywgdG1wTG9jICkNCiAgICAgICAgICAgICAgICBleGNlcHQgUGFyc2VFeGNlcHRpb246DQogICAgICAgICAgICAgICAgICAgIGZhaWxlZC5hcHBlbmQoZSkNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICBtYXRjaE9yZGVyLmFwcGVuZChzZWxmLm9wdDFtYXAuZ2V0KGlkKGUpLGUpKQ0KICAgICAgICAgICAgICAgICAgICBpZiBlIGluIHRtcFJlcWQ6DQogICAgICAgICAgICAgICAgICAgICAgICB0bXBSZXFkLnJlbW92ZShlKQ0KICAgICAgICAgICAgICAgICAgICBlbGlmIGUgaW4gdG1wT3B0Og0KICAgICAgICAgICAgICAgICAgICAgICAgdG1wT3B0LnJlbW92ZShlKQ0KICAgICAgICAgICAgaWYgbGVuKGZhaWxlZCkgPT0gbGVuKHRtcEV4cHJzKToNCiAgICAgICAgICAgICAgICBrZWVwTWF0Y2hpbmcgPSBGYWxzZQ0KDQogICAgICAgIGlmIHRtcFJlcWQ6DQogICAgICAgICAgICBtaXNzaW5nID0gIiwgIi5qb2luKF91c3RyKGUpIGZvciBlIGluIHRtcFJlcWQpDQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZyxsb2MsIk1pc3Npbmcgb25lIG9yIG1vcmUgcmVxdWlyZWQgZWxlbWVudHMgKCVzKSIgJSBtaXNzaW5nICkNCg0KICAgICAgICAjIGFkZCBhbnkgdW5tYXRjaGVkIE9wdGlvbmFscywgaW4gY2FzZSB0aGV5IGhhdmUgZGVmYXVsdCB2YWx1ZXMgZGVmaW5lZA0KICAgICAgICBtYXRjaE9yZGVyICs9IFtlIGZvciBlIGluIHNlbGYuZXhwcnMgaWYgaXNpbnN0YW5jZShlLE9wdGlvbmFsKSBhbmQgZS5leHByIGluIHRtcE9wdF0NCg0KICAgICAgICByZXN1bHRsaXN0ID0gW10NCiAgICAgICAgZm9yIGUgaW4gbWF0Y2hPcmRlcjoNCiAgICAgICAgICAgIGxvYyxyZXN1bHRzID0gZS5fcGFyc2UoaW5zdHJpbmcsbG9jLGRvQWN0aW9ucykNCiAgICAgICAgICAgIHJlc3VsdGxpc3QuYXBwZW5kKHJlc3VsdHMpDQoNCiAgICAgICAgZmluYWxSZXN1bHRzID0gc3VtKHJlc3VsdGxpc3QsIFBhcnNlUmVzdWx0cyhbXSkpDQogICAgICAgIHJldHVybiBsb2MsIGZpbmFsUmVzdWx0cw0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCJuYW1lIik6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lDQoNCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6DQogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAieyIgKyAiICYgIi5qb2luKF91c3RyKGUpIGZvciBlIGluIHNlbGYuZXhwcnMpICsgIn0iDQoNCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcg0KDQogICAgZGVmIGNoZWNrUmVjdXJzaW9uKCBzZWxmLCBwYXJzZUVsZW1lbnRMaXN0ICk6DQogICAgICAgIHN1YlJlY0NoZWNrTGlzdCA9IHBhcnNlRWxlbWVudExpc3RbOl0gKyBbIHNlbGYgXQ0KICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOg0KICAgICAgICAgICAgZS5jaGVja1JlY3Vyc2lvbiggc3ViUmVjQ2hlY2tMaXN0ICkNCg0KDQpjbGFzcyBQYXJzZUVsZW1lbnRFbmhhbmNlKFBhcnNlckVsZW1lbnQpOg0KICAgICIiIg0KICAgIEFic3RyYWN0IHN1YmNsYXNzIG9mIEN7UGFyc2VyRWxlbWVudH0sIGZvciBjb21iaW5pbmcgYW5kIHBvc3QtcHJvY2Vzc2luZyBwYXJzZWQgdG9rZW5zLg0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwciwgc2F2ZWxpc3Q9RmFsc2UgKToNCiAgICAgICAgc3VwZXIoUGFyc2VFbGVtZW50RW5oYW5jZSxzZWxmKS5fX2luaXRfXyhzYXZlbGlzdCkNCiAgICAgICAgaWYgaXNpbnN0YW5jZSggZXhwciwgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgaWYgaXNzdWJjbGFzcyhQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MsIFRva2VuKToNCiAgICAgICAgICAgICAgICBleHByID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKGV4cHIpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIGV4cHIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoTGl0ZXJhbChleHByKSkNCiAgICAgICAgc2VsZi5leHByID0gZXhwcg0KICAgICAgICBzZWxmLnN0clJlcHIgPSBOb25lDQogICAgICAgIGlmIGV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBleHByLm1heUluZGV4RXJyb3INCiAgICAgICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBleHByLm1heVJldHVybkVtcHR5DQogICAgICAgICAgICBzZWxmLnNldFdoaXRlc3BhY2VDaGFycyggZXhwci53aGl0ZUNoYXJzICkNCiAgICAgICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBleHByLnNraXBXaGl0ZXNwYWNlDQogICAgICAgICAgICBzZWxmLnNhdmVBc0xpc3QgPSBleHByLnNhdmVBc0xpc3QNCiAgICAgICAgICAgIHNlbGYuY2FsbFByZXBhcnNlID0gZXhwci5jYWxsUHJlcGFyc2UNCiAgICAgICAgICAgIHNlbGYuaWdub3JlRXhwcnMuZXh0ZW5kKGV4cHIuaWdub3JlRXhwcnMpDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5leHByLl9wYXJzZSggaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zLCBjYWxsUHJlUGFyc2U9RmFsc2UgKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oIiIsbG9jLHNlbGYuZXJybXNnLHNlbGYpDQoNCiAgICBkZWYgbGVhdmVXaGl0ZXNwYWNlKCBzZWxmICk6DQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBGYWxzZQ0KICAgICAgICBzZWxmLmV4cHIgPSBzZWxmLmV4cHIuY29weSgpDQogICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgIHNlbGYuZXhwci5sZWF2ZVdoaXRlc3BhY2UoKQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIGlnbm9yZSggc2VsZiwgb3RoZXIgKToNCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIFN1cHByZXNzICk6DQogICAgICAgICAgICBpZiBvdGhlciBub3QgaW4gc2VsZi5pZ25vcmVFeHByczoNCiAgICAgICAgICAgICAgICBzdXBlciggUGFyc2VFbGVtZW50RW5oYW5jZSwgc2VsZikuaWdub3JlKCBvdGhlciApDQogICAgICAgICAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgICAgICAgICBzZWxmLmV4cHIuaWdub3JlKCBzZWxmLmlnbm9yZUV4cHJzWy0xXSApDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzdXBlciggUGFyc2VFbGVtZW50RW5oYW5jZSwgc2VsZikuaWdub3JlKCBvdGhlciApDQogICAgICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICAgICAgc2VsZi5leHByLmlnbm9yZSggc2VsZi5pZ25vcmVFeHByc1stMV0gKQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIHN0cmVhbWxpbmUoIHNlbGYgKToNCiAgICAgICAgc3VwZXIoUGFyc2VFbGVtZW50RW5oYW5jZSxzZWxmKS5zdHJlYW1saW5lKCkNCiAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgc2VsZi5leHByLnN0cmVhbWxpbmUoKQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIGNoZWNrUmVjdXJzaW9uKCBzZWxmLCBwYXJzZUVsZW1lbnRMaXN0ICk6DQogICAgICAgIGlmIHNlbGYgaW4gcGFyc2VFbGVtZW50TGlzdDoNCiAgICAgICAgICAgIHJhaXNlIFJlY3Vyc2l2ZUdyYW1tYXJFeGNlcHRpb24oIHBhcnNlRWxlbWVudExpc3QrW3NlbGZdICkNCiAgICAgICAgc3ViUmVjQ2hlY2tMaXN0ID0gcGFyc2VFbGVtZW50TGlzdFs6XSArIFsgc2VsZiBdDQogICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgIHNlbGYuZXhwci5jaGVja1JlY3Vyc2lvbiggc3ViUmVjQ2hlY2tMaXN0ICkNCg0KICAgIGRlZiB2YWxpZGF0ZSggc2VsZiwgdmFsaWRhdGVUcmFjZT1bXSApOg0KICAgICAgICB0bXAgPSB2YWxpZGF0ZVRyYWNlWzpdK1tzZWxmXQ0KICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICBzZWxmLmV4cHIudmFsaWRhdGUodG1wKQ0KICAgICAgICBzZWxmLmNoZWNrUmVjdXJzaW9uKCBbXSApDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICB0cnk6DQogICAgICAgICAgICByZXR1cm4gc3VwZXIoUGFyc2VFbGVtZW50RW5oYW5jZSxzZWxmKS5fX3N0cl9fKCkNCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoNCiAgICAgICAgICAgIHBhc3MNCg0KICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZSBhbmQgc2VsZi5leHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gIiVzOiglcykiICUgKCBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgX3VzdHIoc2VsZi5leHByKSApDQogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHINCg0KDQpjbGFzcyBGb2xsb3dlZEJ5KFBhcnNlRWxlbWVudEVuaGFuY2UpOg0KICAgICIiIg0KICAgIExvb2thaGVhZCBtYXRjaGluZyBvZiB0aGUgZ2l2ZW4gcGFyc2UgZXhwcmVzc2lvbi4gIEN7Rm9sbG93ZWRCeX0NCiAgICBkb2VzIEl7bm90fSBhZHZhbmNlIHRoZSBwYXJzaW5nIHBvc2l0aW9uIHdpdGhpbiB0aGUgaW5wdXQgc3RyaW5nLCBpdCBvbmx5DQogICAgdmVyaWZpZXMgdGhhdCB0aGUgc3BlY2lmaWVkIHBhcnNlIGV4cHJlc3Npb24gbWF0Y2hlcyBhdCB0aGUgY3VycmVudA0KICAgIHBvc2l0aW9uLiAgQ3tGb2xsb3dlZEJ5fSBhbHdheXMgcmV0dXJucyBhIG51bGwgdG9rZW4gbGlzdC4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICAjIHVzZSBGb2xsb3dlZEJ5IHRvIG1hdGNoIGEgbGFiZWwgb25seSBpZiBpdCBpcyBmb2xsb3dlZCBieSBhICc6Jw0KICAgICAgICBkYXRhX3dvcmQgPSBXb3JkKGFscGhhcykNCiAgICAgICAgbGFiZWwgPSBkYXRhX3dvcmQgKyBGb2xsb3dlZEJ5KCc6JykNCiAgICAgICAgYXR0cl9leHByID0gR3JvdXAobGFiZWwgKyBTdXBwcmVzcygnOicpICsgT25lT3JNb3JlKGRhdGFfd29yZCwgc3RvcE9uPWxhYmVsKS5zZXRQYXJzZUFjdGlvbignICcuam9pbikpDQogICAgICAgIA0KICAgICAgICBPbmVPck1vcmUoYXR0cl9leHByKS5wYXJzZVN0cmluZygic2hhcGU6IFNRVUFSRSBjb2xvcjogQkxBQ0sgcG9zbjogdXBwZXIgbGVmdCIpLnBwcmludCgpDQogICAgcHJpbnRzOjoNCiAgICAgICAgW1snc2hhcGUnLCAnU1FVQVJFJ10sIFsnY29sb3InLCAnQkxBQ0snXSwgWydwb3NuJywgJ3VwcGVyIGxlZnQnXV0NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHIgKToNCiAgICAgICAgc3VwZXIoRm9sbG93ZWRCeSxzZWxmKS5fX2luaXRfXyhleHByKQ0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgc2VsZi5leHByLnRyeVBhcnNlKCBpbnN0cmluZywgbG9jICkNCiAgICAgICAgcmV0dXJuIGxvYywgW10NCg0KDQpjbGFzcyBOb3RBbnkoUGFyc2VFbGVtZW50RW5oYW5jZSk6DQogICAgIiIiDQogICAgTG9va2FoZWFkIHRvIGRpc2FsbG93IG1hdGNoaW5nIHdpdGggdGhlIGdpdmVuIHBhcnNlIGV4cHJlc3Npb24uICBDe05vdEFueX0NCiAgICBkb2VzIEl7bm90fSBhZHZhbmNlIHRoZSBwYXJzaW5nIHBvc2l0aW9uIHdpdGhpbiB0aGUgaW5wdXQgc3RyaW5nLCBpdCBvbmx5DQogICAgdmVyaWZpZXMgdGhhdCB0aGUgc3BlY2lmaWVkIHBhcnNlIGV4cHJlc3Npb24gZG9lcyBJe25vdH0gbWF0Y2ggYXQgdGhlIGN1cnJlbnQNCiAgICBwb3NpdGlvbi4gIEFsc28sIEN7Tm90QW55fSBkb2VzIEl7bm90fSBza2lwIG92ZXIgbGVhZGluZyB3aGl0ZXNwYWNlLiBDe05vdEFueX0NCiAgICBhbHdheXMgcmV0dXJucyBhIG51bGwgdG9rZW4gbGlzdC4gIE1heSBiZSBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgJ34nIG9wZXJhdG9yLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIA0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwciApOg0KICAgICAgICBzdXBlcihOb3RBbnksc2VsZikuX19pbml0X18oZXhwcikNCiAgICAgICAgI34gc2VsZi5sZWF2ZVdoaXRlc3BhY2UoKQ0KICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gRmFsc2UgICMgZG8gTk9UIHVzZSBzZWxmLmxlYXZlV2hpdGVzcGFjZSgpLCBkb24ndCB3YW50IHRvIHByb3BhZ2F0ZSB0byBleHBycw0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQ0KICAgICAgICBzZWxmLmVycm1zZyA9ICJGb3VuZCB1bndhbnRlZCB0b2tlbiwgIitfdXN0cihzZWxmLmV4cHIpDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiBzZWxmLmV4cHIuY2FuUGFyc2VOZXh0KGluc3RyaW5nLCBsb2MpOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQogICAgICAgIHJldHVybiBsb2MsIFtdDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICBpZiBoYXNhdHRyKHNlbGYsIm5hbWUiKToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWUNCg0KICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToNCiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJ+eyIgKyBfdXN0cihzZWxmLmV4cHIpICsgIn0iDQoNCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcg0KDQpjbGFzcyBfTXVsdGlwbGVNYXRjaChQYXJzZUVsZW1lbnRFbmhhbmNlKToNCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHIsIHN0b3BPbj1Ob25lKToNCiAgICAgICAgc3VwZXIoX011bHRpcGxlTWF0Y2gsIHNlbGYpLl9faW5pdF9fKGV4cHIpDQogICAgICAgIHNlbGYuc2F2ZUFzTGlzdCA9IFRydWUNCiAgICAgICAgZW5kZXIgPSBzdG9wT24NCiAgICAgICAgaWYgaXNpbnN0YW5jZShlbmRlciwgYmFzZXN0cmluZyk6DQogICAgICAgICAgICBlbmRlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyhlbmRlcikNCiAgICAgICAgc2VsZi5ub3RfZW5kZXIgPSB+ZW5kZXIgaWYgZW5kZXIgaXMgbm90IE5vbmUgZWxzZSBOb25lDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBzZWxmX2V4cHJfcGFyc2UgPSBzZWxmLmV4cHIuX3BhcnNlDQogICAgICAgIHNlbGZfc2tpcF9pZ25vcmFibGVzID0gc2VsZi5fc2tpcElnbm9yYWJsZXMNCiAgICAgICAgY2hlY2tfZW5kZXIgPSBzZWxmLm5vdF9lbmRlciBpcyBub3QgTm9uZQ0KICAgICAgICBpZiBjaGVja19lbmRlcjoNCiAgICAgICAgICAgIHRyeV9ub3RfZW5kZXIgPSBzZWxmLm5vdF9lbmRlci50cnlQYXJzZQ0KICAgICAgICANCiAgICAgICAgIyBtdXN0IGJlIGF0IGxlYXN0IG9uZSAoYnV0IGZpcnN0IHNlZSBpZiB3ZSBhcmUgdGhlIHN0b3BPbiBzZW50aW5lbDsNCiAgICAgICAgIyBpZiBzbywgZmFpbCkNCiAgICAgICAgaWYgY2hlY2tfZW5kZXI6DQogICAgICAgICAgICB0cnlfbm90X2VuZGVyKGluc3RyaW5nLCBsb2MpDQogICAgICAgIGxvYywgdG9rZW5zID0gc2VsZl9leHByX3BhcnNlKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMsIGNhbGxQcmVQYXJzZT1GYWxzZSApDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIGhhc0lnbm9yZUV4cHJzID0gKG5vdCBub3Qgc2VsZi5pZ25vcmVFeHBycykNCiAgICAgICAgICAgIHdoaWxlIDE6DQogICAgICAgICAgICAgICAgaWYgY2hlY2tfZW5kZXI6DQogICAgICAgICAgICAgICAgICAgIHRyeV9ub3RfZW5kZXIoaW5zdHJpbmcsIGxvYykNCiAgICAgICAgICAgICAgICBpZiBoYXNJZ25vcmVFeHByczoNCiAgICAgICAgICAgICAgICAgICAgcHJlbG9jID0gc2VsZl9za2lwX2lnbm9yYWJsZXMoIGluc3RyaW5nLCBsb2MgKQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIHByZWxvYyA9IGxvYw0KICAgICAgICAgICAgICAgIGxvYywgdG1wdG9rZW5zID0gc2VsZl9leHByX3BhcnNlKCBpbnN0cmluZywgcHJlbG9jLCBkb0FjdGlvbnMgKQ0KICAgICAgICAgICAgICAgIGlmIHRtcHRva2VucyBvciB0bXB0b2tlbnMuaGFza2V5cygpOg0KICAgICAgICAgICAgICAgICAgICB0b2tlbnMgKz0gdG1wdG9rZW5zDQogICAgICAgIGV4Y2VwdCAoUGFyc2VFeGNlcHRpb24sSW5kZXhFcnJvcik6DQogICAgICAgICAgICBwYXNzDQoNCiAgICAgICAgcmV0dXJuIGxvYywgdG9rZW5zDQogICAgICAgIA0KY2xhc3MgT25lT3JNb3JlKF9NdWx0aXBsZU1hdGNoKToNCiAgICAiIiINCiAgICBSZXBldGl0aW9uIG9mIG9uZSBvciBtb3JlIG9mIHRoZSBnaXZlbiBleHByZXNzaW9uLg0KICAgIA0KICAgIFBhcmFtZXRlcnM6DQogICAgIC0gZXhwciAtIGV4cHJlc3Npb24gdGhhdCBtdXN0IG1hdGNoIG9uZSBvciBtb3JlIHRpbWVzDQogICAgIC0gc3RvcE9uIC0gKGRlZmF1bHQ9Q3tOb25lfSkgLSBleHByZXNzaW9uIGZvciBhIHRlcm1pbmF0aW5nIHNlbnRpbmVsDQogICAgICAgICAgKG9ubHkgcmVxdWlyZWQgaWYgdGhlIHNlbnRpbmVsIHdvdWxkIG9yZGluYXJpbHkgbWF0Y2ggdGhlIHJlcGV0aXRpb24gDQogICAgICAgICAgZXhwcmVzc2lvbikgICAgICAgICAgDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgZGF0YV93b3JkID0gV29yZChhbHBoYXMpDQogICAgICAgIGxhYmVsID0gZGF0YV93b3JkICsgRm9sbG93ZWRCeSgnOicpDQogICAgICAgIGF0dHJfZXhwciA9IEdyb3VwKGxhYmVsICsgU3VwcHJlc3MoJzonKSArIE9uZU9yTW9yZShkYXRhX3dvcmQpLnNldFBhcnNlQWN0aW9uKCcgJy5qb2luKSkNCg0KICAgICAgICB0ZXh0ID0gInNoYXBlOiBTUVVBUkUgcG9zbjogdXBwZXIgbGVmdCBjb2xvcjogQkxBQ0siDQogICAgICAgIE9uZU9yTW9yZShhdHRyX2V4cHIpLnBhcnNlU3RyaW5nKHRleHQpLnBwcmludCgpICAjIEZhaWwhIHJlYWQgJ2NvbG9yJyBhcyBkYXRhIGluc3RlYWQgb2YgbmV4dCBsYWJlbCAtPiBbWydzaGFwZScsICdTUVVBUkUgY29sb3InXV0NCg0KICAgICAgICAjIHVzZSBzdG9wT24gYXR0cmlidXRlIGZvciBPbmVPck1vcmUgdG8gYXZvaWQgcmVhZGluZyBsYWJlbCBzdHJpbmcgYXMgcGFydCBvZiB0aGUgZGF0YQ0KICAgICAgICBhdHRyX2V4cHIgPSBHcm91cChsYWJlbCArIFN1cHByZXNzKCc6JykgKyBPbmVPck1vcmUoZGF0YV93b3JkLCBzdG9wT249bGFiZWwpLnNldFBhcnNlQWN0aW9uKCcgJy5qb2luKSkNCiAgICAgICAgT25lT3JNb3JlKGF0dHJfZXhwcikucGFyc2VTdHJpbmcodGV4dCkucHByaW50KCkgIyBCZXR0ZXIgLT4gW1snc2hhcGUnLCAnU1FVQVJFJ10sIFsncG9zbicsICd1cHBlciBsZWZ0J10sIFsnY29sb3InLCAnQkxBQ0snXV0NCiAgICAgICAgDQogICAgICAgICMgY291bGQgYWxzbyBiZSB3cml0dGVuIGFzDQogICAgICAgIChhdHRyX2V4cHIgKiAoMSwpKS5wYXJzZVN0cmluZyh0ZXh0KS5wcHJpbnQoKQ0KICAgICIiIg0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCJuYW1lIik6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lDQoNCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6DQogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAieyIgKyBfdXN0cihzZWxmLmV4cHIpICsgIn0uLi4iDQoNCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcg0KDQpjbGFzcyBaZXJvT3JNb3JlKF9NdWx0aXBsZU1hdGNoKToNCiAgICAiIiINCiAgICBPcHRpb25hbCByZXBldGl0aW9uIG9mIHplcm8gb3IgbW9yZSBvZiB0aGUgZ2l2ZW4gZXhwcmVzc2lvbi4NCiAgICANCiAgICBQYXJhbWV0ZXJzOg0KICAgICAtIGV4cHIgLSBleHByZXNzaW9uIHRoYXQgbXVzdCBtYXRjaCB6ZXJvIG9yIG1vcmUgdGltZXMNCiAgICAgLSBzdG9wT24gLSAoZGVmYXVsdD1De05vbmV9KSAtIGV4cHJlc3Npb24gZm9yIGEgdGVybWluYXRpbmcgc2VudGluZWwNCiAgICAgICAgICAob25seSByZXF1aXJlZCBpZiB0aGUgc2VudGluZWwgd291bGQgb3JkaW5hcmlseSBtYXRjaCB0aGUgcmVwZXRpdGlvbiANCiAgICAgICAgICBleHByZXNzaW9uKSAgICAgICAgICANCg0KICAgIEV4YW1wbGU6IHNpbWlsYXIgdG8gTHtPbmVPck1vcmV9DQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHByLCBzdG9wT249Tm9uZSk6DQogICAgICAgIHN1cGVyKFplcm9Pck1vcmUsc2VsZikuX19pbml0X18oZXhwciwgc3RvcE9uPXN0b3BPbikNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUNCiAgICAgICAgDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgcmV0dXJuIHN1cGVyKFplcm9Pck1vcmUsIHNlbGYpLnBhcnNlSW1wbChpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMpDQogICAgICAgIGV4Y2VwdCAoUGFyc2VFeGNlcHRpb24sSW5kZXhFcnJvcik6DQogICAgICAgICAgICByZXR1cm4gbG9jLCBbXQ0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCJuYW1lIik6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lDQoNCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6DQogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAiWyIgKyBfdXN0cihzZWxmLmV4cHIpICsgIl0uLi4iDQoNCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcg0KDQpjbGFzcyBfTnVsbFRva2VuKG9iamVjdCk6DQogICAgZGVmIF9fYm9vbF9fKHNlbGYpOg0KICAgICAgICByZXR1cm4gRmFsc2UNCiAgICBfX25vbnplcm9fXyA9IF9fYm9vbF9fDQogICAgZGVmIF9fc3RyX18oc2VsZik6DQogICAgICAgIHJldHVybiAiIg0KDQpfb3B0aW9uYWxOb3RNYXRjaGVkID0gX051bGxUb2tlbigpDQpjbGFzcyBPcHRpb25hbChQYXJzZUVsZW1lbnRFbmhhbmNlKToNCiAgICAiIiINCiAgICBPcHRpb25hbCBtYXRjaGluZyBvZiB0aGUgZ2l2ZW4gZXhwcmVzc2lvbi4NCg0KICAgIFBhcmFtZXRlcnM6DQogICAgIC0gZXhwciAtIGV4cHJlc3Npb24gdGhhdCBtdXN0IG1hdGNoIHplcm8gb3IgbW9yZSB0aW1lcw0KICAgICAtIGRlZmF1bHQgKG9wdGlvbmFsKSAtIHZhbHVlIHRvIGJlIHJldHVybmVkIGlmIHRoZSBvcHRpb25hbCBleHByZXNzaW9uIGlzIG5vdCBmb3VuZC4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICAjIFVTIHBvc3RhbCBjb2RlIGNhbiBiZSBhIDUtZGlnaXQgemlwLCBwbHVzIG9wdGlvbmFsIDQtZGlnaXQgcXVhbGlmaWVyDQogICAgICAgIHppcCA9IENvbWJpbmUoV29yZChudW1zLCBleGFjdD01KSArIE9wdGlvbmFsKCctJyArIFdvcmQobnVtcywgZXhhY3Q9NCkpKQ0KICAgICAgICB6aXAucnVuVGVzdHMoJycnDQogICAgICAgICAgICAjIHRyYWRpdGlvbmFsIFpJUCBjb2RlDQogICAgICAgICAgICAxMjM0NQ0KICAgICAgICAgICAgDQogICAgICAgICAgICAjIFpJUCs0IGZvcm0NCiAgICAgICAgICAgIDEyMTAxLTAwMDENCiAgICAgICAgICAgIA0KICAgICAgICAgICAgIyBpbnZhbGlkIFpJUA0KICAgICAgICAgICAgOTg3NjUtDQogICAgICAgICAgICAnJycpDQogICAgcHJpbnRzOjoNCiAgICAgICAgIyB0cmFkaXRpb25hbCBaSVAgY29kZQ0KICAgICAgICAxMjM0NQ0KICAgICAgICBbJzEyMzQ1J10NCg0KICAgICAgICAjIFpJUCs0IGZvcm0NCiAgICAgICAgMTIxMDEtMDAwMQ0KICAgICAgICBbJzEyMTAxLTAwMDEnXQ0KDQogICAgICAgICMgaW52YWxpZCBaSVANCiAgICAgICAgOTg3NjUtDQogICAgICAgICAgICAgXg0KICAgICAgICBGQUlMOiBFeHBlY3RlZCBlbmQgb2YgdGV4dCAoYXQgY2hhciA1KSwgKGxpbmU6MSwgY29sOjYpDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHByLCBkZWZhdWx0PV9vcHRpb25hbE5vdE1hdGNoZWQgKToNCiAgICAgICAgc3VwZXIoT3B0aW9uYWwsc2VsZikuX19pbml0X18oIGV4cHIsIHNhdmVsaXN0PUZhbHNlICkNCiAgICAgICAgc2VsZi5zYXZlQXNMaXN0ID0gc2VsZi5leHByLnNhdmVBc0xpc3QNCiAgICAgICAgc2VsZi5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0DQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICB0cnk6DQogICAgICAgICAgICBsb2MsIHRva2VucyA9IHNlbGYuZXhwci5fcGFyc2UoIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucywgY2FsbFByZVBhcnNlPUZhbHNlICkNCiAgICAgICAgZXhjZXB0IChQYXJzZUV4Y2VwdGlvbixJbmRleEVycm9yKToNCiAgICAgICAgICAgIGlmIHNlbGYuZGVmYXVsdFZhbHVlIGlzIG5vdCBfb3B0aW9uYWxOb3RNYXRjaGVkOg0KICAgICAgICAgICAgICAgIGlmIHNlbGYuZXhwci5yZXN1bHRzTmFtZToNCiAgICAgICAgICAgICAgICAgICAgdG9rZW5zID0gUGFyc2VSZXN1bHRzKFsgc2VsZi5kZWZhdWx0VmFsdWUgXSkNCiAgICAgICAgICAgICAgICAgICAgdG9rZW5zW3NlbGYuZXhwci5yZXN1bHRzTmFtZV0gPSBzZWxmLmRlZmF1bHRWYWx1ZQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIHRva2VucyA9IFsgc2VsZi5kZWZhdWx0VmFsdWUgXQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICB0b2tlbnMgPSBbXQ0KICAgICAgICByZXR1cm4gbG9jLCB0b2tlbnMNCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwibmFtZSIpOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZQ0KDQogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOg0KICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gIlsiICsgX3VzdHIoc2VsZi5leHByKSArICJdIg0KDQogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHINCg0KY2xhc3MgU2tpcFRvKFBhcnNlRWxlbWVudEVuaGFuY2UpOg0KICAgICIiIg0KICAgIFRva2VuIGZvciBza2lwcGluZyBvdmVyIGFsbCB1bmRlZmluZWQgdGV4dCB1bnRpbCB0aGUgbWF0Y2hlZCBleHByZXNzaW9uIGlzIGZvdW5kLg0KDQogICAgUGFyYW1ldGVyczoNCiAgICAgLSBleHByIC0gdGFyZ2V0IGV4cHJlc3Npb24gbWFya2luZyB0aGUgZW5kIG9mIHRoZSBkYXRhIHRvIGJlIHNraXBwZWQNCiAgICAgLSBpbmNsdWRlIC0gKGRlZmF1bHQ9Q3tGYWxzZX0pIGlmIFRydWUsIHRoZSB0YXJnZXQgZXhwcmVzc2lvbiBpcyBhbHNvIHBhcnNlZCANCiAgICAgICAgICAodGhlIHNraXBwZWQgdGV4dCBhbmQgdGFyZ2V0IGV4cHJlc3Npb24gYXJlIHJldHVybmVkIGFzIGEgMi1lbGVtZW50IGxpc3QpLg0KICAgICAtIGlnbm9yZSAtIChkZWZhdWx0PUN7Tm9uZX0pIHVzZWQgdG8gZGVmaW5lIGdyYW1tYXJzICh0eXBpY2FsbHkgcXVvdGVkIHN0cmluZ3MgYW5kIA0KICAgICAgICAgIGNvbW1lbnRzKSB0aGF0IG1pZ2h0IGNvbnRhaW4gZmFsc2UgbWF0Y2hlcyB0byB0aGUgdGFyZ2V0IGV4cHJlc3Npb24NCiAgICAgLSBmYWlsT24gLSAoZGVmYXVsdD1De05vbmV9KSBkZWZpbmUgZXhwcmVzc2lvbnMgdGhhdCBhcmUgbm90IGFsbG93ZWQgdG8gYmUgDQogICAgICAgICAgaW5jbHVkZWQgaW4gdGhlIHNraXBwZWQgdGVzdDsgaWYgZm91bmQgYmVmb3JlIHRoZSB0YXJnZXQgZXhwcmVzc2lvbiBpcyBmb3VuZCwgDQogICAgICAgICAgdGhlIFNraXBUbyBpcyBub3QgYSBtYXRjaA0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIHJlcG9ydCA9ICcnJw0KICAgICAgICAgICAgT3V0c3RhbmRpbmcgSXNzdWVzIFJlcG9ydCAtIDEgSmFuIDIwMDANCg0KICAgICAgICAgICAgICAgIyB8IFNldmVyaXR5IHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgRGF5cyBPcGVuDQogICAgICAgICAgICAtLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0NCiAgICAgICAgICAgICAxMDEgfCBDcml0aWNhbCB8IEludGVybWl0dGVudCBzeXN0ZW0gY3Jhc2ggICAgICAgICAgICAgICAgIHwgICAgICAgICAgNg0KICAgICAgICAgICAgICA5NCB8IENvc21ldGljIHwgU3BlbGxpbmcgZXJyb3Igb24gTG9naW4gKCdsb2d8bicpICAgICAgICAgfCAgICAgICAgIDE0DQogICAgICAgICAgICAgIDc5IHwgTWlub3IgICAgfCBTeXN0ZW0gc2xvdyB3aGVuIHJ1bm5pbmcgdG9vIG1hbnkgcmVwb3J0cyB8ICAgICAgICAgNDcNCiAgICAgICAgICAgICcnJw0KICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKQ0KICAgICAgICBTRVAgPSBTdXBwcmVzcygnfCcpDQogICAgICAgICMgdXNlIFNraXBUbyB0byBzaW1wbHkgbWF0Y2ggZXZlcnl0aGluZyB1cCB1bnRpbCB0aGUgbmV4dCBTRVANCiAgICAgICAgIyAtIGlnbm9yZSBxdW90ZWQgc3RyaW5ncywgc28gdGhhdCBhICd8JyBjaGFyYWN0ZXIgaW5zaWRlIGEgcXVvdGVkIHN0cmluZyBkb2VzIG5vdCBtYXRjaA0KICAgICAgICAjIC0gcGFyc2UgYWN0aW9uIHdpbGwgY2FsbCB0b2tlbi5zdHJpcCgpIGZvciBlYWNoIG1hdGNoZWQgdG9rZW4sIGkuZS4sIHRoZSBkZXNjcmlwdGlvbiBib2R5DQogICAgICAgIHN0cmluZ19kYXRhID0gU2tpcFRvKFNFUCwgaWdub3JlPXF1b3RlZFN0cmluZykNCiAgICAgICAgc3RyaW5nX2RhdGEuc2V0UGFyc2VBY3Rpb24odG9rZW5NYXAoc3RyLnN0cmlwKSkNCiAgICAgICAgdGlja2V0X2V4cHIgPSAoaW50ZWdlcigiaXNzdWVfbnVtIikgKyBTRVAgDQogICAgICAgICAgICAgICAgICAgICAgKyBzdHJpbmdfZGF0YSgic2V2IikgKyBTRVAgDQogICAgICAgICAgICAgICAgICAgICAgKyBzdHJpbmdfZGF0YSgiZGVzYyIpICsgU0VQIA0KICAgICAgICAgICAgICAgICAgICAgICsgaW50ZWdlcigiZGF5c19vcGVuIikpDQogICAgICAgIA0KICAgICAgICBmb3IgdGt0IGluIHRpY2tldF9leHByLnNlYXJjaFN0cmluZyhyZXBvcnQpOg0KICAgICAgICAgICAgcHJpbnQgdGt0LmR1bXAoKQ0KICAgIHByaW50czo6DQogICAgICAgIFsnMTAxJywgJ0NyaXRpY2FsJywgJ0ludGVybWl0dGVudCBzeXN0ZW0gY3Jhc2gnLCAnNiddDQogICAgICAgIC0gZGF5c19vcGVuOiA2DQogICAgICAgIC0gZGVzYzogSW50ZXJtaXR0ZW50IHN5c3RlbSBjcmFzaA0KICAgICAgICAtIGlzc3VlX251bTogMTAxDQogICAgICAgIC0gc2V2OiBDcml0aWNhbA0KICAgICAgICBbJzk0JywgJ0Nvc21ldGljJywgIlNwZWxsaW5nIGVycm9yIG9uIExvZ2luICgnbG9nfG4nKSIsICcxNCddDQogICAgICAgIC0gZGF5c19vcGVuOiAxNA0KICAgICAgICAtIGRlc2M6IFNwZWxsaW5nIGVycm9yIG9uIExvZ2luICgnbG9nfG4nKQ0KICAgICAgICAtIGlzc3VlX251bTogOTQNCiAgICAgICAgLSBzZXY6IENvc21ldGljDQogICAgICAgIFsnNzknLCAnTWlub3InLCAnU3lzdGVtIHNsb3cgd2hlbiBydW5uaW5nIHRvbyBtYW55IHJlcG9ydHMnLCAnNDcnXQ0KICAgICAgICAtIGRheXNfb3BlbjogNDcNCiAgICAgICAgLSBkZXNjOiBTeXN0ZW0gc2xvdyB3aGVuIHJ1bm5pbmcgdG9vIG1hbnkgcmVwb3J0cw0KICAgICAgICAtIGlzc3VlX251bTogNzkNCiAgICAgICAgLSBzZXY6IE1pbm9yDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBvdGhlciwgaW5jbHVkZT1GYWxzZSwgaWdub3JlPU5vbmUsIGZhaWxPbj1Ob25lICk6DQogICAgICAgIHN1cGVyKCBTa2lwVG8sIHNlbGYgKS5fX2luaXRfXyggb3RoZXIgKQ0KICAgICAgICBzZWxmLmlnbm9yZUV4cHIgPSBpZ25vcmUNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUNCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UNCiAgICAgICAgc2VsZi5pbmNsdWRlTWF0Y2ggPSBpbmNsdWRlDQogICAgICAgIHNlbGYuYXNMaXN0ID0gRmFsc2UNCiAgICAgICAgaWYgaXNpbnN0YW5jZShmYWlsT24sIGJhc2VzdHJpbmcpOg0KICAgICAgICAgICAgc2VsZi5mYWlsT24gPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoZmFpbE9uKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc2VsZi5mYWlsT24gPSBmYWlsT24NCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiTm8gbWF0Y2ggZm91bmQgZm9yICIrX3VzdHIoc2VsZi5leHByKQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgc3RhcnRsb2MgPSBsb2MNCiAgICAgICAgaW5zdHJsZW4gPSBsZW4oaW5zdHJpbmcpDQogICAgICAgIGV4cHIgPSBzZWxmLmV4cHINCiAgICAgICAgZXhwcl9wYXJzZSA9IHNlbGYuZXhwci5fcGFyc2UNCiAgICAgICAgc2VsZl9mYWlsT25fY2FuUGFyc2VOZXh0ID0gc2VsZi5mYWlsT24uY2FuUGFyc2VOZXh0IGlmIHNlbGYuZmFpbE9uIGlzIG5vdCBOb25lIGVsc2UgTm9uZQ0KICAgICAgICBzZWxmX2lnbm9yZUV4cHJfdHJ5UGFyc2UgPSBzZWxmLmlnbm9yZUV4cHIudHJ5UGFyc2UgaWYgc2VsZi5pZ25vcmVFeHByIGlzIG5vdCBOb25lIGVsc2UgTm9uZQ0KICAgICAgICANCiAgICAgICAgdG1wbG9jID0gbG9jDQogICAgICAgIHdoaWxlIHRtcGxvYyA8PSBpbnN0cmxlbjoNCiAgICAgICAgICAgIGlmIHNlbGZfZmFpbE9uX2NhblBhcnNlTmV4dCBpcyBub3QgTm9uZToNCiAgICAgICAgICAgICAgICAjIGJyZWFrIGlmIGZhaWxPbiBleHByZXNzaW9uIG1hdGNoZXMNCiAgICAgICAgICAgICAgICBpZiBzZWxmX2ZhaWxPbl9jYW5QYXJzZU5leHQoaW5zdHJpbmcsIHRtcGxvYyk6DQogICAgICAgICAgICAgICAgICAgIGJyZWFrDQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgaWYgc2VsZl9pZ25vcmVFeHByX3RyeVBhcnNlIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgICAgICMgYWR2YW5jZSBwYXN0IGlnbm9yZSBleHByZXNzaW9ucw0KICAgICAgICAgICAgICAgIHdoaWxlIDE6DQogICAgICAgICAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICAgICAgICAgIHRtcGxvYyA9IHNlbGZfaWdub3JlRXhwcl90cnlQYXJzZShpbnN0cmluZywgdG1wbG9jKQ0KICAgICAgICAgICAgICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uOg0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIGV4cHJfcGFyc2UoaW5zdHJpbmcsIHRtcGxvYywgZG9BY3Rpb25zPUZhbHNlLCBjYWxsUHJlUGFyc2U9RmFsc2UpDQogICAgICAgICAgICBleGNlcHQgKFBhcnNlRXhjZXB0aW9uLCBJbmRleEVycm9yKToNCiAgICAgICAgICAgICAgICAjIG5vIG1hdGNoLCBhZHZhbmNlIGxvYyBpbiBzdHJpbmcNCiAgICAgICAgICAgICAgICB0bXBsb2MgKz0gMQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAjIG1hdGNoZWQgc2tpcHRvIGV4cHIsIGRvbmUNCiAgICAgICAgICAgICAgICBicmVhaw0KDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICAjIHJhbiBvZmYgdGhlIGVuZCBvZiB0aGUgaW5wdXQgc3RyaW5nIHdpdGhvdXQgbWF0Y2hpbmcgc2tpcHRvIGV4cHIsIGZhaWwNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQogICAgICAgICMgYnVpbGQgdXAgcmV0dXJuIHZhbHVlcw0KICAgICAgICBsb2MgPSB0bXBsb2MNCiAgICAgICAgc2tpcHRleHQgPSBpbnN0cmluZ1tzdGFydGxvYzpsb2NdDQogICAgICAgIHNraXByZXN1bHQgPSBQYXJzZVJlc3VsdHMoc2tpcHRleHQpDQogICAgICAgIA0KICAgICAgICBpZiBzZWxmLmluY2x1ZGVNYXRjaDoNCiAgICAgICAgICAgIGxvYywgbWF0ID0gZXhwcl9wYXJzZShpbnN0cmluZyxsb2MsZG9BY3Rpb25zLGNhbGxQcmVQYXJzZT1GYWxzZSkNCiAgICAgICAgICAgIHNraXByZXN1bHQgKz0gbWF0DQoNCiAgICAgICAgcmV0dXJuIGxvYywgc2tpcHJlc3VsdA0KDQpjbGFzcyBGb3J3YXJkKFBhcnNlRWxlbWVudEVuaGFuY2UpOg0KICAgICIiIg0KICAgIEZvcndhcmQgZGVjbGFyYXRpb24gb2YgYW4gZXhwcmVzc2lvbiB0byBiZSBkZWZpbmVkIGxhdGVyIC0NCiAgICB1c2VkIGZvciByZWN1cnNpdmUgZ3JhbW1hcnMsIHN1Y2ggYXMgYWxnZWJyYWljIGluZml4IG5vdGF0aW9uLg0KICAgIFdoZW4gdGhlIGV4cHJlc3Npb24gaXMga25vd24sIGl0IGlzIGFzc2lnbmVkIHRvIHRoZSBDe0ZvcndhcmR9IHZhcmlhYmxlIHVzaW5nIHRoZSAnPDwnIG9wZXJhdG9yLg0KDQogICAgTm90ZTogdGFrZSBjYXJlIHdoZW4gYXNzaWduaW5nIHRvIEN7Rm9yd2FyZH0gbm90IHRvIG92ZXJsb29rIHByZWNlZGVuY2Ugb2Ygb3BlcmF0b3JzLg0KICAgIFNwZWNpZmljYWxseSwgJ3wnIGhhcyBhIGxvd2VyIHByZWNlZGVuY2UgdGhhbiAnPDwnLCBzbyB0aGF0OjoNCiAgICAgICAgZndkRXhwciA8PCBhIHwgYiB8IGMNCiAgICB3aWxsIGFjdHVhbGx5IGJlIGV2YWx1YXRlZCBhczo6DQogICAgICAgIChmd2RFeHByIDw8IGEpIHwgYiB8IGMNCiAgICB0aGVyZWJ5IGxlYXZpbmcgYiBhbmQgYyBvdXQgYXMgcGFyc2VhYmxlIGFsdGVybmF0aXZlcy4gIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgeW91DQogICAgZXhwbGljaXRseSBncm91cCB0aGUgdmFsdWVzIGluc2VydGVkIGludG8gdGhlIEN7Rm9yd2FyZH06Og0KICAgICAgICBmd2RFeHByIDw8IChhIHwgYiB8IGMpDQogICAgQ29udmVydGluZyB0byB1c2UgdGhlICc8PD0nIG9wZXJhdG9yIGluc3RlYWQgd2lsbCBhdm9pZCB0aGlzIHByb2JsZW0uDQoNCiAgICBTZWUgTHtQYXJzZVJlc3VsdHMucHByaW50fSBmb3IgYW4gZXhhbXBsZSBvZiBhIHJlY3Vyc2l2ZSBwYXJzZXIgY3JlYXRlZCB1c2luZw0KICAgIEN7Rm9yd2FyZH0uDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBvdGhlcj1Ob25lICk6DQogICAgICAgIHN1cGVyKEZvcndhcmQsc2VsZikuX19pbml0X18oIG90aGVyLCBzYXZlbGlzdD1GYWxzZSApDQoNCiAgICBkZWYgX19sc2hpZnRfXyggc2VsZiwgb3RoZXIgKToNCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKG90aGVyKQ0KICAgICAgICBzZWxmLmV4cHIgPSBvdGhlcg0KICAgICAgICBzZWxmLnN0clJlcHIgPSBOb25lDQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IHNlbGYuZXhwci5tYXlJbmRleEVycm9yDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBzZWxmLmV4cHIubWF5UmV0dXJuRW1wdHkNCiAgICAgICAgc2VsZi5zZXRXaGl0ZXNwYWNlQ2hhcnMoIHNlbGYuZXhwci53aGl0ZUNoYXJzICkNCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IHNlbGYuZXhwci5za2lwV2hpdGVzcGFjZQ0KICAgICAgICBzZWxmLnNhdmVBc0xpc3QgPSBzZWxmLmV4cHIuc2F2ZUFzTGlzdA0KICAgICAgICBzZWxmLmlnbm9yZUV4cHJzLmV4dGVuZChzZWxmLmV4cHIuaWdub3JlRXhwcnMpDQogICAgICAgIHJldHVybiBzZWxmDQogICAgICAgIA0KICAgIGRlZiBfX2lsc2hpZnRfXyhzZWxmLCBvdGhlcik6DQogICAgICAgIHJldHVybiBzZWxmIDw8IG90aGVyDQogICAgDQogICAgZGVmIGxlYXZlV2hpdGVzcGFjZSggc2VsZiApOg0KICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gRmFsc2UNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBzdHJlYW1saW5lKCBzZWxmICk6DQogICAgICAgIGlmIG5vdCBzZWxmLnN0cmVhbWxpbmVkOg0KICAgICAgICAgICAgc2VsZi5zdHJlYW1saW5lZCA9IFRydWUNCiAgICAgICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgICAgICBzZWxmLmV4cHIuc3RyZWFtbGluZSgpDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgdmFsaWRhdGUoIHNlbGYsIHZhbGlkYXRlVHJhY2U9W10gKToNCiAgICAgICAgaWYgc2VsZiBub3QgaW4gdmFsaWRhdGVUcmFjZToNCiAgICAgICAgICAgIHRtcCA9IHZhbGlkYXRlVHJhY2VbOl0rW3NlbGZdDQogICAgICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICAgICAgc2VsZi5leHByLnZhbGlkYXRlKHRtcCkNCiAgICAgICAgc2VsZi5jaGVja1JlY3Vyc2lvbihbXSkNCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwibmFtZSIpOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZQ0KICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18uX19uYW1lX18gKyAiOiAuLi4iDQoNCiAgICAgICAgIyBzdHViYmVkIG91dCBmb3Igbm93IC0gY3JlYXRlcyBhd2Z1bCBtZW1vcnkgYW5kIHBlcmYgaXNzdWVzDQogICAgICAgIHNlbGYuX3JldmVydENsYXNzID0gc2VsZi5fX2NsYXNzX18NCiAgICAgICAgc2VsZi5fX2NsYXNzX18gPSBfRm9yd2FyZE5vUmVjdXJzZQ0KICAgICAgICB0cnk6DQogICAgICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICAgICAgcmV0U3RyaW5nID0gX3VzdHIoc2VsZi5leHByKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICByZXRTdHJpbmcgPSAiTm9uZSINCiAgICAgICAgZmluYWxseToNCiAgICAgICAgICAgIHNlbGYuX19jbGFzc19fID0gc2VsZi5fcmV2ZXJ0Q2xhc3MNCiAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fICsgIjogIiArIHJldFN0cmluZw0KDQogICAgZGVmIGNvcHkoc2VsZik6DQogICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgIHJldHVybiBzdXBlcihGb3J3YXJkLHNlbGYpLmNvcHkoKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmV0ID0gRm9yd2FyZCgpDQogICAgICAgICAgICByZXQgPDw9IHNlbGYNCiAgICAgICAgICAgIHJldHVybiByZXQNCg0KY2xhc3MgX0ZvcndhcmROb1JlY3Vyc2UoRm9yd2FyZCk6DQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgcmV0dXJuICIuLi4iDQoNCmNsYXNzIFRva2VuQ29udmVydGVyKFBhcnNlRWxlbWVudEVuaGFuY2UpOg0KICAgICIiIg0KICAgIEFic3RyYWN0IHN1YmNsYXNzIG9mIEN7UGFyc2VFeHByZXNzaW9ufSwgZm9yIGNvbnZlcnRpbmcgcGFyc2VkIHJlc3VsdHMuDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHByLCBzYXZlbGlzdD1GYWxzZSApOg0KICAgICAgICBzdXBlcihUb2tlbkNvbnZlcnRlcixzZWxmKS5fX2luaXRfXyggZXhwciApIywgc2F2ZWxpc3QgKQ0KICAgICAgICBzZWxmLnNhdmVBc0xpc3QgPSBGYWxzZQ0KDQpjbGFzcyBDb21iaW5lKFRva2VuQ29udmVydGVyKToNCiAgICAiIiINCiAgICBDb252ZXJ0ZXIgdG8gY29uY2F0ZW5hdGUgYWxsIG1hdGNoaW5nIHRva2VucyB0byBhIHNpbmdsZSBzdHJpbmcuDQogICAgQnkgZGVmYXVsdCwgdGhlIG1hdGNoaW5nIHBhdHRlcm5zIG11c3QgYWxzbyBiZSBjb250aWd1b3VzIGluIHRoZSBpbnB1dCBzdHJpbmc7DQogICAgdGhpcyBjYW4gYmUgZGlzYWJsZWQgYnkgc3BlY2lmeWluZyBDeydhZGphY2VudD1GYWxzZSd9IGluIHRoZSBjb25zdHJ1Y3Rvci4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICByZWFsID0gV29yZChudW1zKSArICcuJyArIFdvcmQobnVtcykNCiAgICAgICAgcHJpbnQocmVhbC5wYXJzZVN0cmluZygnMy4xNDE2JykpICMgLT4gWyczJywgJy4nLCAnMTQxNiddDQogICAgICAgICMgd2lsbCBhbHNvIGVycm9uZW91c2x5IG1hdGNoIHRoZSBmb2xsb3dpbmcNCiAgICAgICAgcHJpbnQocmVhbC5wYXJzZVN0cmluZygnMy4gMTQxNicpKSAjIC0+IFsnMycsICcuJywgJzE0MTYnXQ0KDQogICAgICAgIHJlYWwgPSBDb21iaW5lKFdvcmQobnVtcykgKyAnLicgKyBXb3JkKG51bXMpKQ0KICAgICAgICBwcmludChyZWFsLnBhcnNlU3RyaW5nKCczLjE0MTYnKSkgIyAtPiBbJzMuMTQxNiddDQogICAgICAgICMgbm8gbWF0Y2ggd2hlbiB0aGVyZSBhcmUgaW50ZXJuYWwgc3BhY2VzDQogICAgICAgIHByaW50KHJlYWwucGFyc2VTdHJpbmcoJzMuIDE0MTYnKSkgIyAtPiBFeGNlcHRpb246IEV4cGVjdGVkIFc6KDAxMjMuLi4pDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHByLCBqb2luU3RyaW5nPSIiLCBhZGphY2VudD1UcnVlICk6DQogICAgICAgIHN1cGVyKENvbWJpbmUsc2VsZikuX19pbml0X18oIGV4cHIgKQ0KICAgICAgICAjIHN1cHByZXNzIHdoaXRlc3BhY2Utc3RyaXBwaW5nIGluIGNvbnRhaW5lZCBwYXJzZSBleHByZXNzaW9ucywgYnV0IHJlLWVuYWJsZSBpdCBvbiB0aGUgQ29tYmluZSBpdHNlbGYNCiAgICAgICAgaWYgYWRqYWNlbnQ6DQogICAgICAgICAgICBzZWxmLmxlYXZlV2hpdGVzcGFjZSgpDQogICAgICAgIHNlbGYuYWRqYWNlbnQgPSBhZGphY2VudA0KICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gVHJ1ZQ0KICAgICAgICBzZWxmLmpvaW5TdHJpbmcgPSBqb2luU3RyaW5nDQogICAgICAgIHNlbGYuY2FsbFByZXBhcnNlID0gVHJ1ZQ0KDQogICAgZGVmIGlnbm9yZSggc2VsZiwgb3RoZXIgKToNCiAgICAgICAgaWYgc2VsZi5hZGphY2VudDoNCiAgICAgICAgICAgIFBhcnNlckVsZW1lbnQuaWdub3JlKHNlbGYsIG90aGVyKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc3VwZXIoIENvbWJpbmUsIHNlbGYpLmlnbm9yZSggb3RoZXIgKQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIHBvc3RQYXJzZSggc2VsZiwgaW5zdHJpbmcsIGxvYywgdG9rZW5saXN0ICk6DQogICAgICAgIHJldFRva3MgPSB0b2tlbmxpc3QuY29weSgpDQogICAgICAgIGRlbCByZXRUb2tzWzpdDQogICAgICAgIHJldFRva3MgKz0gUGFyc2VSZXN1bHRzKFsgIiIuam9pbih0b2tlbmxpc3QuX2FzU3RyaW5nTGlzdChzZWxmLmpvaW5TdHJpbmcpKSBdLCBtb2RhbD1zZWxmLm1vZGFsUmVzdWx0cykNCg0KICAgICAgICBpZiBzZWxmLnJlc3VsdHNOYW1lIGFuZCByZXRUb2tzLmhhc2tleXMoKToNCiAgICAgICAgICAgIHJldHVybiBbIHJldFRva3MgXQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmV0dXJuIHJldFRva3MNCg0KY2xhc3MgR3JvdXAoVG9rZW5Db252ZXJ0ZXIpOg0KICAgICIiIg0KICAgIENvbnZlcnRlciB0byByZXR1cm4gdGhlIG1hdGNoZWQgdG9rZW5zIGFzIGEgbGlzdCAtIHVzZWZ1bCBmb3IgcmV0dXJuaW5nIHRva2VucyBvZiBDe0x7WmVyb09yTW9yZX19IGFuZCBDe0x7T25lT3JNb3JlfX0gZXhwcmVzc2lvbnMuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgaWRlbnQgPSBXb3JkKGFscGhhcykNCiAgICAgICAgbnVtID0gV29yZChudW1zKQ0KICAgICAgICB0ZXJtID0gaWRlbnQgfCBudW0NCiAgICAgICAgZnVuYyA9IGlkZW50ICsgT3B0aW9uYWwoZGVsaW1pdGVkTGlzdCh0ZXJtKSkNCiAgICAgICAgcHJpbnQoZnVuYy5wYXJzZVN0cmluZygiZm4gYSxiLDEwMCIpKSAgIyAtPiBbJ2ZuJywgJ2EnLCAnYicsICcxMDAnXQ0KDQogICAgICAgIGZ1bmMgPSBpZGVudCArIEdyb3VwKE9wdGlvbmFsKGRlbGltaXRlZExpc3QodGVybSkpKQ0KICAgICAgICBwcmludChmdW5jLnBhcnNlU3RyaW5nKCJmbiBhLGIsMTAwIikpICAjIC0+IFsnZm4nLCBbJ2EnLCAnYicsICcxMDAnXV0NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHIgKToNCiAgICAgICAgc3VwZXIoR3JvdXAsc2VsZikuX19pbml0X18oIGV4cHIgKQ0KICAgICAgICBzZWxmLnNhdmVBc0xpc3QgPSBUcnVlDQoNCiAgICBkZWYgcG9zdFBhcnNlKCBzZWxmLCBpbnN0cmluZywgbG9jLCB0b2tlbmxpc3QgKToNCiAgICAgICAgcmV0dXJuIFsgdG9rZW5saXN0IF0NCg0KY2xhc3MgRGljdChUb2tlbkNvbnZlcnRlcik6DQogICAgIiIiDQogICAgQ29udmVydGVyIHRvIHJldHVybiBhIHJlcGV0aXRpdmUgZXhwcmVzc2lvbiBhcyBhIGxpc3QsIGJ1dCBhbHNvIGFzIGEgZGljdGlvbmFyeS4NCiAgICBFYWNoIGVsZW1lbnQgY2FuIGFsc28gYmUgcmVmZXJlbmNlZCB1c2luZyB0aGUgZmlyc3QgdG9rZW4gaW4gdGhlIGV4cHJlc3Npb24gYXMgaXRzIGtleS4NCiAgICBVc2VmdWwgZm9yIHRhYnVsYXIgcmVwb3J0IHNjcmFwaW5nIHdoZW4gdGhlIGZpcnN0IGNvbHVtbiBjYW4gYmUgdXNlZCBhcyBhIGl0ZW0ga2V5Lg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIGRhdGFfd29yZCA9IFdvcmQoYWxwaGFzKQ0KICAgICAgICBsYWJlbCA9IGRhdGFfd29yZCArIEZvbGxvd2VkQnkoJzonKQ0KICAgICAgICBhdHRyX2V4cHIgPSBHcm91cChsYWJlbCArIFN1cHByZXNzKCc6JykgKyBPbmVPck1vcmUoZGF0YV93b3JkKS5zZXRQYXJzZUFjdGlvbignICcuam9pbikpDQoNCiAgICAgICAgdGV4dCA9ICJzaGFwZTogU1FVQVJFIHBvc246IHVwcGVyIGxlZnQgY29sb3I6IGxpZ2h0IGJsdWUgdGV4dHVyZTogYnVybGFwIg0KICAgICAgICBhdHRyX2V4cHIgPSAobGFiZWwgKyBTdXBwcmVzcygnOicpICsgT25lT3JNb3JlKGRhdGFfd29yZCwgc3RvcE9uPWxhYmVsKS5zZXRQYXJzZUFjdGlvbignICcuam9pbikpDQogICAgICAgIA0KICAgICAgICAjIHByaW50IGF0dHJpYnV0ZXMgYXMgcGxhaW4gZ3JvdXBzDQogICAgICAgIHByaW50KE9uZU9yTW9yZShhdHRyX2V4cHIpLnBhcnNlU3RyaW5nKHRleHQpLmR1bXAoKSkNCiAgICAgICAgDQogICAgICAgICMgaW5zdGVhZCBvZiBPbmVPck1vcmUoZXhwciksIHBhcnNlIHVzaW5nIERpY3QoT25lT3JNb3JlKEdyb3VwKGV4cHIpKSkgLSBEaWN0IHdpbGwgYXV0by1hc3NpZ24gbmFtZXMNCiAgICAgICAgcmVzdWx0ID0gRGljdChPbmVPck1vcmUoR3JvdXAoYXR0cl9leHByKSkpLnBhcnNlU3RyaW5nKHRleHQpDQogICAgICAgIHByaW50KHJlc3VsdC5kdW1wKCkpDQogICAgICAgIA0KICAgICAgICAjIGFjY2VzcyBuYW1lZCBmaWVsZHMgYXMgZGljdCBlbnRyaWVzLCBvciBvdXRwdXQgYXMgZGljdA0KICAgICAgICBwcmludChyZXN1bHRbJ3NoYXBlJ10pICAgICAgICANCiAgICAgICAgcHJpbnQocmVzdWx0LmFzRGljdCgpKQ0KICAgIHByaW50czo6DQogICAgICAgIFsnc2hhcGUnLCAnU1FVQVJFJywgJ3Bvc24nLCAndXBwZXIgbGVmdCcsICdjb2xvcicsICdsaWdodCBibHVlJywgJ3RleHR1cmUnLCAnYnVybGFwJ10NCg0KICAgICAgICBbWydzaGFwZScsICdTUVVBUkUnXSwgWydwb3NuJywgJ3VwcGVyIGxlZnQnXSwgWydjb2xvcicsICdsaWdodCBibHVlJ10sIFsndGV4dHVyZScsICdidXJsYXAnXV0NCiAgICAgICAgLSBjb2xvcjogbGlnaHQgYmx1ZQ0KICAgICAgICAtIHBvc246IHVwcGVyIGxlZnQNCiAgICAgICAgLSBzaGFwZTogU1FVQVJFDQogICAgICAgIC0gdGV4dHVyZTogYnVybGFwDQogICAgICAgIFNRVUFSRQ0KICAgICAgICB7J2NvbG9yJzogJ2xpZ2h0IGJsdWUnLCAncG9zbic6ICd1cHBlciBsZWZ0JywgJ3RleHR1cmUnOiAnYnVybGFwJywgJ3NoYXBlJzogJ1NRVUFSRSd9DQogICAgU2VlIG1vcmUgZXhhbXBsZXMgYXQgTHtQYXJzZVJlc3VsdHN9IG9mIGFjY2Vzc2luZyBmaWVsZHMgYnkgcmVzdWx0cyBuYW1lLg0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwciApOg0KICAgICAgICBzdXBlcihEaWN0LHNlbGYpLl9faW5pdF9fKCBleHByICkNCiAgICAgICAgc2VsZi5zYXZlQXNMaXN0ID0gVHJ1ZQ0KDQogICAgZGVmIHBvc3RQYXJzZSggc2VsZiwgaW5zdHJpbmcsIGxvYywgdG9rZW5saXN0ICk6DQogICAgICAgIGZvciBpLHRvayBpbiBlbnVtZXJhdGUodG9rZW5saXN0KToNCiAgICAgICAgICAgIGlmIGxlbih0b2spID09IDA6DQogICAgICAgICAgICAgICAgY29udGludWUNCiAgICAgICAgICAgIGlrZXkgPSB0b2tbMF0NCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoaWtleSxpbnQpOg0KICAgICAgICAgICAgICAgIGlrZXkgPSBfdXN0cih0b2tbMF0pLnN0cmlwKCkNCiAgICAgICAgICAgIGlmIGxlbih0b2spPT0xOg0KICAgICAgICAgICAgICAgIHRva2VubGlzdFtpa2V5XSA9IF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KCIiLGkpDQogICAgICAgICAgICBlbGlmIGxlbih0b2spPT0yIGFuZCBub3QgaXNpbnN0YW5jZSh0b2tbMV0sUGFyc2VSZXN1bHRzKToNCiAgICAgICAgICAgICAgICB0b2tlbmxpc3RbaWtleV0gPSBfUGFyc2VSZXN1bHRzV2l0aE9mZnNldCh0b2tbMV0saSkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgZGljdHZhbHVlID0gdG9rLmNvcHkoKSAjUGFyc2VSZXN1bHRzKGkpDQogICAgICAgICAgICAgICAgZGVsIGRpY3R2YWx1ZVswXQ0KICAgICAgICAgICAgICAgIGlmIGxlbihkaWN0dmFsdWUpIT0gMSBvciAoaXNpbnN0YW5jZShkaWN0dmFsdWUsUGFyc2VSZXN1bHRzKSBhbmQgZGljdHZhbHVlLmhhc2tleXMoKSk6DQogICAgICAgICAgICAgICAgICAgIHRva2VubGlzdFtpa2V5XSA9IF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KGRpY3R2YWx1ZSxpKQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIHRva2VubGlzdFtpa2V5XSA9IF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KGRpY3R2YWx1ZVswXSxpKQ0KDQogICAgICAgIGlmIHNlbGYucmVzdWx0c05hbWU6DQogICAgICAgICAgICByZXR1cm4gWyB0b2tlbmxpc3QgXQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmV0dXJuIHRva2VubGlzdA0KDQoNCmNsYXNzIFN1cHByZXNzKFRva2VuQ29udmVydGVyKToNCiAgICAiIiINCiAgICBDb252ZXJ0ZXIgZm9yIGlnbm9yaW5nIHRoZSByZXN1bHRzIG9mIGEgcGFyc2VkIGV4cHJlc3Npb24uDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgc291cmNlID0gImEsIGIsIGMsZCINCiAgICAgICAgd2QgPSBXb3JkKGFscGhhcykNCiAgICAgICAgd2RfbGlzdDEgPSB3ZCArIFplcm9Pck1vcmUoJywnICsgd2QpDQogICAgICAgIHByaW50KHdkX2xpc3QxLnBhcnNlU3RyaW5nKHNvdXJjZSkpDQoNCiAgICAgICAgIyBvZnRlbiwgZGVsaW1pdGVycyB0aGF0IGFyZSB1c2VmdWwgZHVyaW5nIHBhcnNpbmcgYXJlIGp1c3QgaW4gdGhlDQogICAgICAgICMgd2F5IGFmdGVyd2FyZCAtIHVzZSBTdXBwcmVzcyB0byBrZWVwIHRoZW0gb3V0IG9mIHRoZSBwYXJzZWQgb3V0cHV0DQogICAgICAgIHdkX2xpc3QyID0gd2QgKyBaZXJvT3JNb3JlKFN1cHByZXNzKCcsJykgKyB3ZCkNCiAgICAgICAgcHJpbnQod2RfbGlzdDIucGFyc2VTdHJpbmcoc291cmNlKSkNCiAgICBwcmludHM6Og0KICAgICAgICBbJ2EnLCAnLCcsICdiJywgJywnLCAnYycsICcsJywgJ2QnXQ0KICAgICAgICBbJ2EnLCAnYicsICdjJywgJ2QnXQ0KICAgIChTZWUgYWxzbyBMe2RlbGltaXRlZExpc3R9LikNCiAgICAiIiINCiAgICBkZWYgcG9zdFBhcnNlKCBzZWxmLCBpbnN0cmluZywgbG9jLCB0b2tlbmxpc3QgKToNCiAgICAgICAgcmV0dXJuIFtdDQoNCiAgICBkZWYgc3VwcHJlc3MoIHNlbGYgKToNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KDQpjbGFzcyBPbmx5T25jZShvYmplY3QpOg0KICAgICIiIg0KICAgIFdyYXBwZXIgZm9yIHBhcnNlIGFjdGlvbnMsIHRvIGVuc3VyZSB0aGV5IGFyZSBvbmx5IGNhbGxlZCBvbmNlLg0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXRob2RDYWxsKToNCiAgICAgICAgc2VsZi5jYWxsYWJsZSA9IF90cmltX2FyaXR5KG1ldGhvZENhbGwpDQogICAgICAgIHNlbGYuY2FsbGVkID0gRmFsc2UNCiAgICBkZWYgX19jYWxsX18oc2VsZixzLGwsdCk6DQogICAgICAgIGlmIG5vdCBzZWxmLmNhbGxlZDoNCiAgICAgICAgICAgIHJlc3VsdHMgPSBzZWxmLmNhbGxhYmxlKHMsbCx0KQ0KICAgICAgICAgICAgc2VsZi5jYWxsZWQgPSBUcnVlDQogICAgICAgICAgICByZXR1cm4gcmVzdWx0cw0KICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihzLGwsIiIpDQogICAgZGVmIHJlc2V0KHNlbGYpOg0KICAgICAgICBzZWxmLmNhbGxlZCA9IEZhbHNlDQoNCmRlZiB0cmFjZVBhcnNlQWN0aW9uKGYpOg0KICAgICIiIg0KICAgIERlY29yYXRvciBmb3IgZGVidWdnaW5nIHBhcnNlIGFjdGlvbnMuIA0KICAgIA0KICAgIFdoZW4gdGhlIHBhcnNlIGFjdGlvbiBpcyBjYWxsZWQsIHRoaXMgZGVjb3JhdG9yIHdpbGwgcHJpbnQgQ3siPj4gZW50ZXJpbmcgSXttZXRob2QtbmFtZX0obGluZTpJe2N1cnJlbnRfc291cmNlX2xpbmV9LCBJe3BhcnNlX2xvY2F0aW9ufSwgSXttYXRjaGVkX3Rva2Vuc30pIi59DQogICAgV2hlbiB0aGUgcGFyc2UgYWN0aW9uIGNvbXBsZXRlcywgdGhlIGRlY29yYXRvciB3aWxsIHByaW50IEN7Ijw8In0gZm9sbG93ZWQgYnkgdGhlIHJldHVybmVkIHZhbHVlLCBvciBhbnkgZXhjZXB0aW9uIHRoYXQgdGhlIHBhcnNlIGFjdGlvbiByYWlzZWQuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgd2QgPSBXb3JkKGFscGhhcykNCg0KICAgICAgICBAdHJhY2VQYXJzZUFjdGlvbg0KICAgICAgICBkZWYgcmVtb3ZlX2R1cGxpY2F0ZV9jaGFycyh0b2tlbnMpOg0KICAgICAgICAgICAgcmV0dXJuICcnLmpvaW4oc29ydGVkKHNldCgnJy5qb2luKHRva2VucykpKSkNCg0KICAgICAgICB3ZHMgPSBPbmVPck1vcmUod2QpLnNldFBhcnNlQWN0aW9uKHJlbW92ZV9kdXBsaWNhdGVfY2hhcnMpDQogICAgICAgIHByaW50KHdkcy5wYXJzZVN0cmluZygic2xrZGpzIHNsZCBzbGRkIHNkbGYgc2RsamYiKSkNCiAgICBwcmludHM6Og0KICAgICAgICA+PmVudGVyaW5nIHJlbW92ZV9kdXBsaWNhdGVfY2hhcnMobGluZTogJ3Nsa2RqcyBzbGQgc2xkZCBzZGxmIHNkbGpmJywgMCwgKFsnc2xrZGpzJywgJ3NsZCcsICdzbGRkJywgJ3NkbGYnLCAnc2RsamYnXSwge30pKQ0KICAgICAgICA8PGxlYXZpbmcgcmVtb3ZlX2R1cGxpY2F0ZV9jaGFycyAocmV0OiAnZGZqa2xzJykNCiAgICAgICAgWydkZmprbHMnXQ0KICAgICIiIg0KICAgIGYgPSBfdHJpbV9hcml0eShmKQ0KICAgIGRlZiB6KCpwYUFyZ3MpOg0KICAgICAgICB0aGlzRnVuYyA9IGYuX19uYW1lX18NCiAgICAgICAgcyxsLHQgPSBwYUFyZ3NbLTM6XQ0KICAgICAgICBpZiBsZW4ocGFBcmdzKT4zOg0KICAgICAgICAgICAgdGhpc0Z1bmMgPSBwYUFyZ3NbMF0uX19jbGFzc19fLl9fbmFtZV9fICsgJy4nICsgdGhpc0Z1bmMNCiAgICAgICAgc3lzLnN0ZGVyci53cml0ZSggIj4+ZW50ZXJpbmcgJXMobGluZTogJyVzJywgJWQsICVyKVxuIiAlICh0aGlzRnVuYyxsaW5lKGwscyksbCx0KSApDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHJldCA9IGYoKnBhQXJncykNCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleGM6DQogICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCAiPDxsZWF2aW5nICVzIChleGNlcHRpb246ICVzKVxuIiAlICh0aGlzRnVuYyxleGMpICkNCiAgICAgICAgICAgIHJhaXNlDQogICAgICAgIHN5cy5zdGRlcnIud3JpdGUoICI8PGxlYXZpbmcgJXMgKHJldDogJXIpXG4iICUgKHRoaXNGdW5jLHJldCkgKQ0KICAgICAgICByZXR1cm4gcmV0DQogICAgdHJ5Og0KICAgICAgICB6Ll9fbmFtZV9fID0gZi5fX25hbWVfXw0KICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoNCiAgICAgICAgcGFzcw0KICAgIHJldHVybiB6DQoNCiMNCiMgZ2xvYmFsIGhlbHBlcnMNCiMNCmRlZiBkZWxpbWl0ZWRMaXN0KCBleHByLCBkZWxpbT0iLCIsIGNvbWJpbmU9RmFsc2UgKToNCiAgICAiIiINCiAgICBIZWxwZXIgdG8gZGVmaW5lIGEgZGVsaW1pdGVkIGxpc3Qgb2YgZXhwcmVzc2lvbnMgLSB0aGUgZGVsaW1pdGVyIGRlZmF1bHRzIHRvICcsJy4NCiAgICBCeSBkZWZhdWx0LCB0aGUgbGlzdCBlbGVtZW50cyBhbmQgZGVsaW1pdGVycyBjYW4gaGF2ZSBpbnRlcnZlbmluZyB3aGl0ZXNwYWNlLCBhbmQNCiAgICBjb21tZW50cywgYnV0IHRoaXMgY2FuIGJlIG92ZXJyaWRkZW4gYnkgcGFzc2luZyBDe2NvbWJpbmU9VHJ1ZX0gaW4gdGhlIGNvbnN0cnVjdG9yLg0KICAgIElmIEN7Y29tYmluZX0gaXMgc2V0IHRvIEN7VHJ1ZX0sIHRoZSBtYXRjaGluZyB0b2tlbnMgYXJlIHJldHVybmVkIGFzIGEgc2luZ2xlIHRva2VuDQogICAgc3RyaW5nLCB3aXRoIHRoZSBkZWxpbWl0ZXJzIGluY2x1ZGVkOyBvdGhlcndpc2UsIHRoZSBtYXRjaGluZyB0b2tlbnMgYXJlIHJldHVybmVkDQogICAgYXMgYSBsaXN0IG9mIHRva2Vucywgd2l0aCB0aGUgZGVsaW1pdGVycyBzdXBwcmVzc2VkLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIGRlbGltaXRlZExpc3QoV29yZChhbHBoYXMpKS5wYXJzZVN0cmluZygiYWEsYmIsY2MiKSAjIC0+IFsnYWEnLCAnYmInLCAnY2MnXQ0KICAgICAgICBkZWxpbWl0ZWRMaXN0KFdvcmQoaGV4bnVtcyksIGRlbGltPSc6JywgY29tYmluZT1UcnVlKS5wYXJzZVN0cmluZygiQUE6QkI6Q0M6REQ6RUUiKSAjIC0+IFsnQUE6QkI6Q0M6REQ6RUUnXQ0KICAgICIiIg0KICAgIGRsTmFtZSA9IF91c3RyKGV4cHIpKyIgWyIrX3VzdHIoZGVsaW0pKyIgIitfdXN0cihleHByKSsiXS4uLiINCiAgICBpZiBjb21iaW5lOg0KICAgICAgICByZXR1cm4gQ29tYmluZSggZXhwciArIFplcm9Pck1vcmUoIGRlbGltICsgZXhwciApICkuc2V0TmFtZShkbE5hbWUpDQogICAgZWxzZToNCiAgICAgICAgcmV0dXJuICggZXhwciArIFplcm9Pck1vcmUoIFN1cHByZXNzKCBkZWxpbSApICsgZXhwciApICkuc2V0TmFtZShkbE5hbWUpDQoNCmRlZiBjb3VudGVkQXJyYXkoIGV4cHIsIGludEV4cHI9Tm9uZSApOg0KICAgICIiIg0KICAgIEhlbHBlciB0byBkZWZpbmUgYSBjb3VudGVkIGxpc3Qgb2YgZXhwcmVzc2lvbnMuDQogICAgVGhpcyBoZWxwZXIgZGVmaW5lcyBhIHBhdHRlcm4gb2YgdGhlIGZvcm06Og0KICAgICAgICBpbnRlZ2VyIGV4cHIgZXhwciBleHByLi4uDQogICAgd2hlcmUgdGhlIGxlYWRpbmcgaW50ZWdlciB0ZWxscyBob3cgbWFueSBleHByIGV4cHJlc3Npb25zIGZvbGxvdy4NCiAgICBUaGUgbWF0Y2hlZCB0b2tlbnMgcmV0dXJucyB0aGUgYXJyYXkgb2YgZXhwciB0b2tlbnMgYXMgYSBsaXN0IC0gdGhlIGxlYWRpbmcgY291bnQgdG9rZW4gaXMgc3VwcHJlc3NlZC4NCiAgICANCiAgICBJZiBDe2ludEV4cHJ9IGlzIHNwZWNpZmllZCwgaXQgc2hvdWxkIGJlIGEgcHlwYXJzaW5nIGV4cHJlc3Npb24gdGhhdCBwcm9kdWNlcyBhbiBpbnRlZ2VyIHZhbHVlLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIGNvdW50ZWRBcnJheShXb3JkKGFscGhhcykpLnBhcnNlU3RyaW5nKCcyIGFiIGNkIGVmJykgICMgLT4gWydhYicsICdjZCddDQoNCiAgICAgICAgIyBpbiB0aGlzIHBhcnNlciwgdGhlIGxlYWRpbmcgaW50ZWdlciB2YWx1ZSBpcyBnaXZlbiBpbiBiaW5hcnksDQogICAgICAgICMgJzEwJyBpbmRpY2F0aW5nIHRoYXQgMiB2YWx1ZXMgYXJlIGluIHRoZSBhcnJheQ0KICAgICAgICBiaW5hcnlDb25zdGFudCA9IFdvcmQoJzAxJykuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHQ6IGludCh0WzBdLCAyKSkNCiAgICAgICAgY291bnRlZEFycmF5KFdvcmQoYWxwaGFzKSwgaW50RXhwcj1iaW5hcnlDb25zdGFudCkucGFyc2VTdHJpbmcoJzEwIGFiIGNkIGVmJykgICMgLT4gWydhYicsICdjZCddDQogICAgIiIiDQogICAgYXJyYXlFeHByID0gRm9yd2FyZCgpDQogICAgZGVmIGNvdW50RmllbGRQYXJzZUFjdGlvbihzLGwsdCk6DQogICAgICAgIG4gPSB0WzBdDQogICAgICAgIGFycmF5RXhwciA8PCAobiBhbmQgR3JvdXAoQW5kKFtleHByXSpuKSkgb3IgR3JvdXAoZW1wdHkpKQ0KICAgICAgICByZXR1cm4gW10NCiAgICBpZiBpbnRFeHByIGlzIE5vbmU6DQogICAgICAgIGludEV4cHIgPSBXb3JkKG51bXMpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0OmludCh0WzBdKSkNCiAgICBlbHNlOg0KICAgICAgICBpbnRFeHByID0gaW50RXhwci5jb3B5KCkNCiAgICBpbnRFeHByLnNldE5hbWUoImFycmF5TGVuIikNCiAgICBpbnRFeHByLmFkZFBhcnNlQWN0aW9uKGNvdW50RmllbGRQYXJzZUFjdGlvbiwgY2FsbER1cmluZ1RyeT1UcnVlKQ0KICAgIHJldHVybiAoIGludEV4cHIgKyBhcnJheUV4cHIgKS5zZXROYW1lKCcobGVuKSAnICsgX3VzdHIoZXhwcikgKyAnLi4uJykNCg0KZGVmIF9mbGF0dGVuKEwpOg0KICAgIHJldCA9IFtdDQogICAgZm9yIGkgaW4gTDoNCiAgICAgICAgaWYgaXNpbnN0YW5jZShpLGxpc3QpOg0KICAgICAgICAgICAgcmV0LmV4dGVuZChfZmxhdHRlbihpKSkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJldC5hcHBlbmQoaSkNCiAgICByZXR1cm4gcmV0DQoNCmRlZiBtYXRjaFByZXZpb3VzTGl0ZXJhbChleHByKToNCiAgICAiIiINCiAgICBIZWxwZXIgdG8gZGVmaW5lIGFuIGV4cHJlc3Npb24gdGhhdCBpcyBpbmRpcmVjdGx5IGRlZmluZWQgZnJvbQ0KICAgIHRoZSB0b2tlbnMgbWF0Y2hlZCBpbiBhIHByZXZpb3VzIGV4cHJlc3Npb24sIHRoYXQgaXMsIGl0IGxvb2tzDQogICAgZm9yIGEgJ3JlcGVhdCcgb2YgYSBwcmV2aW91cyBleHByZXNzaW9uLiAgRm9yIGV4YW1wbGU6Og0KICAgICAgICBmaXJzdCA9IFdvcmQobnVtcykNCiAgICAgICAgc2Vjb25kID0gbWF0Y2hQcmV2aW91c0xpdGVyYWwoZmlyc3QpDQogICAgICAgIG1hdGNoRXhwciA9IGZpcnN0ICsgIjoiICsgc2Vjb25kDQogICAgd2lsbCBtYXRjaCBDeyIxOjEifSwgYnV0IG5vdCBDeyIxOjIifS4gIEJlY2F1c2UgdGhpcyBtYXRjaGVzIGENCiAgICBwcmV2aW91cyBsaXRlcmFsLCB3aWxsIGFsc28gbWF0Y2ggdGhlIGxlYWRpbmcgQ3siMToxIn0gaW4gQ3siMToxMCJ9Lg0KICAgIElmIHRoaXMgaXMgbm90IGRlc2lyZWQsIHVzZSBDe21hdGNoUHJldmlvdXNFeHByfS4NCiAgICBEbyBJe25vdH0gdXNlIHdpdGggcGFja3JhdCBwYXJzaW5nIGVuYWJsZWQuDQogICAgIiIiDQogICAgcmVwID0gRm9yd2FyZCgpDQogICAgZGVmIGNvcHlUb2tlblRvUmVwZWF0ZXIocyxsLHQpOg0KICAgICAgICBpZiB0Og0KICAgICAgICAgICAgaWYgbGVuKHQpID09IDE6DQogICAgICAgICAgICAgICAgcmVwIDw8IHRbMF0NCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgIyBmbGF0dGVuIHQgdG9rZW5zDQogICAgICAgICAgICAgICAgdGZsYXQgPSBfZmxhdHRlbih0LmFzTGlzdCgpKQ0KICAgICAgICAgICAgICAgIHJlcCA8PCBBbmQoTGl0ZXJhbCh0dCkgZm9yIHR0IGluIHRmbGF0KQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmVwIDw8IEVtcHR5KCkNCiAgICBleHByLmFkZFBhcnNlQWN0aW9uKGNvcHlUb2tlblRvUmVwZWF0ZXIsIGNhbGxEdXJpbmdUcnk9VHJ1ZSkNCiAgICByZXAuc2V0TmFtZSgnKHByZXYpICcgKyBfdXN0cihleHByKSkNCiAgICByZXR1cm4gcmVwDQoNCmRlZiBtYXRjaFByZXZpb3VzRXhwcihleHByKToNCiAgICAiIiINCiAgICBIZWxwZXIgdG8gZGVmaW5lIGFuIGV4cHJlc3Npb24gdGhhdCBpcyBpbmRpcmVjdGx5IGRlZmluZWQgZnJvbQ0KICAgIHRoZSB0b2tlbnMgbWF0Y2hlZCBpbiBhIHByZXZpb3VzIGV4cHJlc3Npb24sIHRoYXQgaXMsIGl0IGxvb2tzDQogICAgZm9yIGEgJ3JlcGVhdCcgb2YgYSBwcmV2aW91cyBleHByZXNzaW9uLiAgRm9yIGV4YW1wbGU6Og0KICAgICAgICBmaXJzdCA9IFdvcmQobnVtcykNCiAgICAgICAgc2Vjb25kID0gbWF0Y2hQcmV2aW91c0V4cHIoZmlyc3QpDQogICAgICAgIG1hdGNoRXhwciA9IGZpcnN0ICsgIjoiICsgc2Vjb25kDQogICAgd2lsbCBtYXRjaCBDeyIxOjEifSwgYnV0IG5vdCBDeyIxOjIifS4gIEJlY2F1c2UgdGhpcyBtYXRjaGVzIGJ5DQogICAgZXhwcmVzc2lvbnMsIHdpbGwgSXtub3R9IG1hdGNoIHRoZSBsZWFkaW5nIEN7IjE6MSJ9IGluIEN7IjE6MTAifTsNCiAgICB0aGUgZXhwcmVzc2lvbnMgYXJlIGV2YWx1YXRlZCBmaXJzdCwgYW5kIHRoZW4gY29tcGFyZWQsIHNvDQogICAgQ3siMSJ9IGlzIGNvbXBhcmVkIHdpdGggQ3siMTAifS4NCiAgICBEbyBJe25vdH0gdXNlIHdpdGggcGFja3JhdCBwYXJzaW5nIGVuYWJsZWQuDQogICAgIiIiDQogICAgcmVwID0gRm9yd2FyZCgpDQogICAgZTIgPSBleHByLmNvcHkoKQ0KICAgIHJlcCA8PD0gZTINCiAgICBkZWYgY29weVRva2VuVG9SZXBlYXRlcihzLGwsdCk6DQogICAgICAgIG1hdGNoVG9rZW5zID0gX2ZsYXR0ZW4odC5hc0xpc3QoKSkNCiAgICAgICAgZGVmIG11c3RNYXRjaFRoZXNlVG9rZW5zKHMsbCx0KToNCiAgICAgICAgICAgIHRoZXNlVG9rZW5zID0gX2ZsYXR0ZW4odC5hc0xpc3QoKSkNCiAgICAgICAgICAgIGlmICB0aGVzZVRva2VucyAhPSBtYXRjaFRva2VuczoNCiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbigiIiwwLCIiKQ0KICAgICAgICByZXAuc2V0UGFyc2VBY3Rpb24oIG11c3RNYXRjaFRoZXNlVG9rZW5zLCBjYWxsRHVyaW5nVHJ5PVRydWUgKQ0KICAgIGV4cHIuYWRkUGFyc2VBY3Rpb24oY29weVRva2VuVG9SZXBlYXRlciwgY2FsbER1cmluZ1RyeT1UcnVlKQ0KICAgIHJlcC5zZXROYW1lKCcocHJldikgJyArIF91c3RyKGV4cHIpKQ0KICAgIHJldHVybiByZXANCg0KZGVmIF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMocyk6DQogICAgI34gIGVzY2FwZSB0aGVzZSBjaGFyczogXi1dDQogICAgZm9yIGMgaW4gciJcXi1dIjoNCiAgICAgICAgcyA9IHMucmVwbGFjZShjLF9ic2xhc2grYykNCiAgICBzID0gcy5yZXBsYWNlKCJcbiIsciJcbiIpDQogICAgcyA9IHMucmVwbGFjZSgiXHQiLHIiXHQiKQ0KICAgIHJldHVybiBfdXN0cihzKQ0KDQpkZWYgb25lT2YoIHN0cnMsIGNhc2VsZXNzPUZhbHNlLCB1c2VSZWdleD1UcnVlICk6DQogICAgIiIiDQogICAgSGVscGVyIHRvIHF1aWNrbHkgZGVmaW5lIGEgc2V0IG9mIGFsdGVybmF0aXZlIExpdGVyYWxzLCBhbmQgbWFrZXMgc3VyZSB0byBkbw0KICAgIGxvbmdlc3QtZmlyc3QgdGVzdGluZyB3aGVuIHRoZXJlIGlzIGEgY29uZmxpY3QsIHJlZ2FyZGxlc3Mgb2YgdGhlIGlucHV0IG9yZGVyLA0KICAgIGJ1dCByZXR1cm5zIGEgQ3tMe01hdGNoRmlyc3R9fSBmb3IgYmVzdCBwZXJmb3JtYW5jZS4NCg0KICAgIFBhcmFtZXRlcnM6DQogICAgIC0gc3RycyAtIGEgc3RyaW5nIG9mIHNwYWNlLWRlbGltaXRlZCBsaXRlcmFscywgb3IgYSBjb2xsZWN0aW9uIG9mIHN0cmluZyBsaXRlcmFscw0KICAgICAtIGNhc2VsZXNzIC0gKGRlZmF1bHQ9Q3tGYWxzZX0pIC0gdHJlYXQgYWxsIGxpdGVyYWxzIGFzIGNhc2VsZXNzDQogICAgIC0gdXNlUmVnZXggLSAoZGVmYXVsdD1De1RydWV9KSAtIGFzIGFuIG9wdGltaXphdGlvbiwgd2lsbCBnZW5lcmF0ZSBhIFJlZ2V4DQogICAgICAgICAgb2JqZWN0OyBvdGhlcndpc2UsIHdpbGwgZ2VuZXJhdGUgYSBDe01hdGNoRmlyc3R9IG9iamVjdCAoaWYgQ3tjYXNlbGVzcz1UcnVlfSwgb3INCiAgICAgICAgICBpZiBjcmVhdGluZyBhIEN7UmVnZXh9IHJhaXNlcyBhbiBleGNlcHRpb24pDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgY29tcF9vcGVyID0gb25lT2YoIjwgPSA+IDw9ID49ICE9IikNCiAgICAgICAgdmFyID0gV29yZChhbHBoYXMpDQogICAgICAgIG51bWJlciA9IFdvcmQobnVtcykNCiAgICAgICAgdGVybSA9IHZhciB8IG51bWJlcg0KICAgICAgICBjb21wYXJpc29uX2V4cHIgPSB0ZXJtICsgY29tcF9vcGVyICsgdGVybQ0KICAgICAgICBwcmludChjb21wYXJpc29uX2V4cHIuc2VhcmNoU3RyaW5nKCJCID0gMTIgIEFBPTIzIEI8PUFBIEFBPjEyIikpDQogICAgcHJpbnRzOjoNCiAgICAgICAgW1snQicsICc9JywgJzEyJ10sIFsnQUEnLCAnPScsICcyMyddLCBbJ0InLCAnPD0nLCAnQUEnXSwgWydBQScsICc+JywgJzEyJ11dDQogICAgIiIiDQogICAgaWYgY2FzZWxlc3M6DQogICAgICAgIGlzZXF1YWwgPSAoIGxhbWJkYSBhLGI6IGEudXBwZXIoKSA9PSBiLnVwcGVyKCkgKQ0KICAgICAgICBtYXNrcyA9ICggbGFtYmRhIGEsYjogYi51cHBlcigpLnN0YXJ0c3dpdGgoYS51cHBlcigpKSApDQogICAgICAgIHBhcnNlRWxlbWVudENsYXNzID0gQ2FzZWxlc3NMaXRlcmFsDQogICAgZWxzZToNCiAgICAgICAgaXNlcXVhbCA9ICggbGFtYmRhIGEsYjogYSA9PSBiICkNCiAgICAgICAgbWFza3MgPSAoIGxhbWJkYSBhLGI6IGIuc3RhcnRzd2l0aChhKSApDQogICAgICAgIHBhcnNlRWxlbWVudENsYXNzID0gTGl0ZXJhbA0KDQogICAgc3ltYm9scyA9IFtdDQogICAgaWYgaXNpbnN0YW5jZShzdHJzLGJhc2VzdHJpbmcpOg0KICAgICAgICBzeW1ib2xzID0gc3Rycy5zcGxpdCgpDQogICAgZWxpZiBpc2luc3RhbmNlKHN0cnMsIEl0ZXJhYmxlKToNCiAgICAgICAgc3ltYm9scyA9IGxpc3Qoc3RycykNCiAgICBlbHNlOg0KICAgICAgICB3YXJuaW5ncy53YXJuKCJJbnZhbGlkIGFyZ3VtZW50IHRvIG9uZU9mLCBleHBlY3RlZCBzdHJpbmcgb3IgaXRlcmFibGUiLA0KICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCiAgICBpZiBub3Qgc3ltYm9sczoNCiAgICAgICAgcmV0dXJuIE5vTWF0Y2goKQ0KDQogICAgaSA9IDANCiAgICB3aGlsZSBpIDwgbGVuKHN5bWJvbHMpLTE6DQogICAgICAgIGN1ciA9IHN5bWJvbHNbaV0NCiAgICAgICAgZm9yIGosb3RoZXIgaW4gZW51bWVyYXRlKHN5bWJvbHNbaSsxOl0pOg0KICAgICAgICAgICAgaWYgKCBpc2VxdWFsKG90aGVyLCBjdXIpICk6DQogICAgICAgICAgICAgICAgZGVsIHN5bWJvbHNbaStqKzFdDQogICAgICAgICAgICAgICAgYnJlYWsNCiAgICAgICAgICAgIGVsaWYgKCBtYXNrcyhjdXIsIG90aGVyKSApOg0KICAgICAgICAgICAgICAgIGRlbCBzeW1ib2xzW2kraisxXQ0KICAgICAgICAgICAgICAgIHN5bWJvbHMuaW5zZXJ0KGksb3RoZXIpDQogICAgICAgICAgICAgICAgY3VyID0gb3RoZXINCiAgICAgICAgICAgICAgICBicmVhaw0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgaSArPSAxDQoNCiAgICBpZiBub3QgY2FzZWxlc3MgYW5kIHVzZVJlZ2V4Og0KICAgICAgICAjfiBwcmludCAoc3RycywiLT4iLCAifCIuam9pbiggWyBfZXNjYXBlUmVnZXhDaGFycyhzeW0pIGZvciBzeW0gaW4gc3ltYm9sc10gKSkNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgaWYgbGVuKHN5bWJvbHMpPT1sZW4oIiIuam9pbihzeW1ib2xzKSk6DQogICAgICAgICAgICAgICAgcmV0dXJuIFJlZ2V4KCAiWyVzXSIgJSAiIi5qb2luKF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMoc3ltKSBmb3Igc3ltIGluIHN5bWJvbHMpICkuc2V0TmFtZSgnIHwgJy5qb2luKHN5bWJvbHMpKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICByZXR1cm4gUmVnZXgoICJ8Ii5qb2luKHJlLmVzY2FwZShzeW0pIGZvciBzeW0gaW4gc3ltYm9scykgKS5zZXROYW1lKCcgfCAnLmpvaW4oc3ltYm9scykpDQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246DQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJFeGNlcHRpb24gY3JlYXRpbmcgUmVnZXggZm9yIG9uZU9mLCBidWlsZGluZyBNYXRjaEZpcnN0IiwNCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KDQoNCiAgICAjIGxhc3QgcmVzb3J0LCBqdXN0IHVzZSBNYXRjaEZpcnN0DQogICAgcmV0dXJuIE1hdGNoRmlyc3QocGFyc2VFbGVtZW50Q2xhc3Moc3ltKSBmb3Igc3ltIGluIHN5bWJvbHMpLnNldE5hbWUoJyB8ICcuam9pbihzeW1ib2xzKSkNCg0KZGVmIGRpY3RPZigga2V5LCB2YWx1ZSApOg0KICAgICIiIg0KICAgIEhlbHBlciB0byBlYXNpbHkgYW5kIGNsZWFybHkgZGVmaW5lIGEgZGljdGlvbmFyeSBieSBzcGVjaWZ5aW5nIHRoZSByZXNwZWN0aXZlIHBhdHRlcm5zDQogICAgZm9yIHRoZSBrZXkgYW5kIHZhbHVlLiAgVGFrZXMgY2FyZSBvZiBkZWZpbmluZyB0aGUgQ3tMe0RpY3R9fSwgQ3tMe1plcm9Pck1vcmV9fSwgYW5kIEN7THtHcm91cH19IHRva2Vucw0KICAgIGluIHRoZSBwcm9wZXIgb3JkZXIuICBUaGUga2V5IHBhdHRlcm4gY2FuIGluY2x1ZGUgZGVsaW1pdGluZyBtYXJrZXJzIG9yIHB1bmN0dWF0aW9uLA0KICAgIGFzIGxvbmcgYXMgdGhleSBhcmUgc3VwcHJlc3NlZCwgdGhlcmVieSBsZWF2aW5nIHRoZSBzaWduaWZpY2FudCBrZXkgdGV4dC4gIFRoZSB2YWx1ZQ0KICAgIHBhdHRlcm4gY2FuIGluY2x1ZGUgbmFtZWQgcmVzdWx0cywgc28gdGhhdCB0aGUgQ3tEaWN0fSByZXN1bHRzIGNhbiBpbmNsdWRlIG5hbWVkIHRva2VuDQogICAgZmllbGRzLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIHRleHQgPSAic2hhcGU6IFNRVUFSRSBwb3NuOiB1cHBlciBsZWZ0IGNvbG9yOiBsaWdodCBibHVlIHRleHR1cmU6IGJ1cmxhcCINCiAgICAgICAgYXR0cl9leHByID0gKGxhYmVsICsgU3VwcHJlc3MoJzonKSArIE9uZU9yTW9yZShkYXRhX3dvcmQsIHN0b3BPbj1sYWJlbCkuc2V0UGFyc2VBY3Rpb24oJyAnLmpvaW4pKQ0KICAgICAgICBwcmludChPbmVPck1vcmUoYXR0cl9leHByKS5wYXJzZVN0cmluZyh0ZXh0KS5kdW1wKCkpDQogICAgICAgIA0KICAgICAgICBhdHRyX2xhYmVsID0gbGFiZWwNCiAgICAgICAgYXR0cl92YWx1ZSA9IFN1cHByZXNzKCc6JykgKyBPbmVPck1vcmUoZGF0YV93b3JkLCBzdG9wT249bGFiZWwpLnNldFBhcnNlQWN0aW9uKCcgJy5qb2luKQ0KDQogICAgICAgICMgc2ltaWxhciB0byBEaWN0LCBidXQgc2ltcGxlciBjYWxsIGZvcm1hdA0KICAgICAgICByZXN1bHQgPSBkaWN0T2YoYXR0cl9sYWJlbCwgYXR0cl92YWx1ZSkucGFyc2VTdHJpbmcodGV4dCkNCiAgICAgICAgcHJpbnQocmVzdWx0LmR1bXAoKSkNCiAgICAgICAgcHJpbnQocmVzdWx0WydzaGFwZSddKQ0KICAgICAgICBwcmludChyZXN1bHQuc2hhcGUpICAjIG9iamVjdCBhdHRyaWJ1dGUgYWNjZXNzIHdvcmtzIHRvbw0KICAgICAgICBwcmludChyZXN1bHQuYXNEaWN0KCkpDQogICAgcHJpbnRzOjoNCiAgICAgICAgW1snc2hhcGUnLCAnU1FVQVJFJ10sIFsncG9zbicsICd1cHBlciBsZWZ0J10sIFsnY29sb3InLCAnbGlnaHQgYmx1ZSddLCBbJ3RleHR1cmUnLCAnYnVybGFwJ11dDQogICAgICAgIC0gY29sb3I6IGxpZ2h0IGJsdWUNCiAgICAgICAgLSBwb3NuOiB1cHBlciBsZWZ0DQogICAgICAgIC0gc2hhcGU6IFNRVUFSRQ0KICAgICAgICAtIHRleHR1cmU6IGJ1cmxhcA0KICAgICAgICBTUVVBUkUNCiAgICAgICAgU1FVQVJFDQogICAgICAgIHsnY29sb3InOiAnbGlnaHQgYmx1ZScsICdzaGFwZSc6ICdTUVVBUkUnLCAncG9zbic6ICd1cHBlciBsZWZ0JywgJ3RleHR1cmUnOiAnYnVybGFwJ30NCiAgICAiIiINCiAgICByZXR1cm4gRGljdCggWmVyb09yTW9yZSggR3JvdXAgKCBrZXkgKyB2YWx1ZSApICkgKQ0KDQpkZWYgb3JpZ2luYWxUZXh0Rm9yKGV4cHIsIGFzU3RyaW5nPVRydWUpOg0KICAgICIiIg0KICAgIEhlbHBlciB0byByZXR1cm4gdGhlIG9yaWdpbmFsLCB1bnRva2VuaXplZCB0ZXh0IGZvciBhIGdpdmVuIGV4cHJlc3Npb24uICBVc2VmdWwgdG8NCiAgICByZXN0b3JlIHRoZSBwYXJzZWQgZmllbGRzIG9mIGFuIEhUTUwgc3RhcnQgdGFnIGludG8gdGhlIHJhdyB0YWcgdGV4dCBpdHNlbGYsIG9yIHRvDQogICAgcmV2ZXJ0IHNlcGFyYXRlIHRva2VucyB3aXRoIGludGVydmVuaW5nIHdoaXRlc3BhY2UgYmFjayB0byB0aGUgb3JpZ2luYWwgbWF0Y2hpbmcNCiAgICBpbnB1dCB0ZXh0LiBCeSBkZWZhdWx0LCByZXR1cm5zIGFzdHJpbmcgY29udGFpbmluZyB0aGUgb3JpZ2luYWwgcGFyc2VkIHRleHQuICANCiAgICAgICANCiAgICBJZiB0aGUgb3B0aW9uYWwgQ3thc1N0cmluZ30gYXJndW1lbnQgaXMgcGFzc2VkIGFzIEN7RmFsc2V9LCB0aGVuIHRoZSByZXR1cm4gdmFsdWUgaXMgYSANCiAgICBDe0x7UGFyc2VSZXN1bHRzfX0gY29udGFpbmluZyBhbnkgcmVzdWx0cyBuYW1lcyB0aGF0IHdlcmUgb3JpZ2luYWxseSBtYXRjaGVkLCBhbmQgYSANCiAgICBzaW5nbGUgdG9rZW4gY29udGFpbmluZyB0aGUgb3JpZ2luYWwgbWF0Y2hlZCB0ZXh0IGZyb20gdGhlIGlucHV0IHN0cmluZy4gIFNvIGlmIA0KICAgIHRoZSBleHByZXNzaW9uIHBhc3NlZCB0byBDe0x7b3JpZ2luYWxUZXh0Rm9yfX0gY29udGFpbnMgZXhwcmVzc2lvbnMgd2l0aCBkZWZpbmVkDQogICAgcmVzdWx0cyBuYW1lcywgeW91IG11c3Qgc2V0IEN7YXNTdHJpbmd9IHRvIEN7RmFsc2V9IGlmIHlvdSB3YW50IHRvIHByZXNlcnZlIHRob3NlDQogICAgcmVzdWx0cyBuYW1lIHZhbHVlcy4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBzcmMgPSAidGhpcyBpcyB0ZXN0IDxiPiBib2xkIDxpPnRleHQ8L2k+IDwvYj4gbm9ybWFsIHRleHQgIg0KICAgICAgICBmb3IgdGFnIGluICgiYiIsImkiKToNCiAgICAgICAgICAgIG9wZW5lcixjbG9zZXIgPSBtYWtlSFRNTFRhZ3ModGFnKQ0KICAgICAgICAgICAgcGF0dCA9IG9yaWdpbmFsVGV4dEZvcihvcGVuZXIgKyBTa2lwVG8oY2xvc2VyKSArIGNsb3NlcikNCiAgICAgICAgICAgIHByaW50KHBhdHQuc2VhcmNoU3RyaW5nKHNyYylbMF0pDQogICAgcHJpbnRzOjoNCiAgICAgICAgWyc8Yj4gYm9sZCA8aT50ZXh0PC9pPiA8L2I+J10NCiAgICAgICAgWyc8aT50ZXh0PC9pPiddDQogICAgIiIiDQogICAgbG9jTWFya2VyID0gRW1wdHkoKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcyxsb2MsdDogbG9jKQ0KICAgIGVuZGxvY01hcmtlciA9IGxvY01hcmtlci5jb3B5KCkNCiAgICBlbmRsb2NNYXJrZXIuY2FsbFByZXBhcnNlID0gRmFsc2UNCiAgICBtYXRjaEV4cHIgPSBsb2NNYXJrZXIoIl9vcmlnaW5hbF9zdGFydCIpICsgZXhwciArIGVuZGxvY01hcmtlcigiX29yaWdpbmFsX2VuZCIpDQogICAgaWYgYXNTdHJpbmc6DQogICAgICAgIGV4dHJhY3RUZXh0ID0gbGFtYmRhIHMsbCx0OiBzW3QuX29yaWdpbmFsX3N0YXJ0OnQuX29yaWdpbmFsX2VuZF0NCiAgICBlbHNlOg0KICAgICAgICBkZWYgZXh0cmFjdFRleHQocyxsLHQpOg0KICAgICAgICAgICAgdFs6XSA9IFtzW3QucG9wKCdfb3JpZ2luYWxfc3RhcnQnKTp0LnBvcCgnX29yaWdpbmFsX2VuZCcpXV0NCiAgICBtYXRjaEV4cHIuc2V0UGFyc2VBY3Rpb24oZXh0cmFjdFRleHQpDQogICAgbWF0Y2hFeHByLmlnbm9yZUV4cHJzID0gZXhwci5pZ25vcmVFeHBycw0KICAgIHJldHVybiBtYXRjaEV4cHINCg0KZGVmIHVuZ3JvdXAoZXhwcik6IA0KICAgICIiIg0KICAgIEhlbHBlciB0byB1bmRvIHB5cGFyc2luZydzIGRlZmF1bHQgZ3JvdXBpbmcgb2YgQW5kIGV4cHJlc3Npb25zLCBldmVuDQogICAgaWYgYWxsIGJ1dCBvbmUgYXJlIG5vbi1lbXB0eS4NCiAgICAiIiINCiAgICByZXR1cm4gVG9rZW5Db252ZXJ0ZXIoZXhwcikuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHQ6dFswXSkNCg0KZGVmIGxvY2F0ZWRFeHByKGV4cHIpOg0KICAgICIiIg0KICAgIEhlbHBlciB0byBkZWNvcmF0ZSBhIHJldHVybmVkIHRva2VuIHdpdGggaXRzIHN0YXJ0aW5nIGFuZCBlbmRpbmcgbG9jYXRpb25zIGluIHRoZSBpbnB1dCBzdHJpbmcuDQogICAgVGhpcyBoZWxwZXIgYWRkcyB0aGUgZm9sbG93aW5nIHJlc3VsdHMgbmFtZXM6DQogICAgIC0gbG9jbl9zdGFydCA9IGxvY2F0aW9uIHdoZXJlIG1hdGNoZWQgZXhwcmVzc2lvbiBiZWdpbnMNCiAgICAgLSBsb2NuX2VuZCA9IGxvY2F0aW9uIHdoZXJlIG1hdGNoZWQgZXhwcmVzc2lvbiBlbmRzDQogICAgIC0gdmFsdWUgPSB0aGUgYWN0dWFsIHBhcnNlZCByZXN1bHRzDQoNCiAgICBCZSBjYXJlZnVsIGlmIHRoZSBpbnB1dCB0ZXh0IGNvbnRhaW5zIEN7PFRBQj59IGNoYXJhY3RlcnMsIHlvdSBtYXkgd2FudCB0byBjYWxsDQogICAgQ3tMe1BhcnNlckVsZW1lbnQucGFyc2VXaXRoVGFic319DQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgd2QgPSBXb3JkKGFscGhhcykNCiAgICAgICAgZm9yIG1hdGNoIGluIGxvY2F0ZWRFeHByKHdkKS5zZWFyY2hTdHJpbmcoImxqc2RmMTIzbGtzZGpqZjEyM2xra2pqMTIyMiIpOg0KICAgICAgICAgICAgcHJpbnQobWF0Y2gpDQogICAgcHJpbnRzOjoNCiAgICAgICAgW1swLCAnbGpzZGYnLCA1XV0NCiAgICAgICAgW1s4LCAnbGtzZGpqZicsIDE1XV0NCiAgICAgICAgW1sxOCwgJ2xra2pqJywgMjNdXQ0KICAgICIiIg0KICAgIGxvY2F0b3IgPSBFbXB0eSgpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLGwsdDogbCkNCiAgICByZXR1cm4gR3JvdXAobG9jYXRvcigibG9jbl9zdGFydCIpICsgZXhwcigidmFsdWUiKSArIGxvY2F0b3IuY29weSgpLmxlYXZlV2hpdGVzcGFjZSgpKCJsb2NuX2VuZCIpKQ0KDQoNCiMgY29udmVuaWVuY2UgY29uc3RhbnRzIGZvciBwb3NpdGlvbmFsIGV4cHJlc3Npb25zDQplbXB0eSAgICAgICA9IEVtcHR5KCkuc2V0TmFtZSgiZW1wdHkiKQ0KbGluZVN0YXJ0ICAgPSBMaW5lU3RhcnQoKS5zZXROYW1lKCJsaW5lU3RhcnQiKQ0KbGluZUVuZCAgICAgPSBMaW5lRW5kKCkuc2V0TmFtZSgibGluZUVuZCIpDQpzdHJpbmdTdGFydCA9IFN0cmluZ1N0YXJ0KCkuc2V0TmFtZSgic3RyaW5nU3RhcnQiKQ0Kc3RyaW5nRW5kICAgPSBTdHJpbmdFbmQoKS5zZXROYW1lKCJzdHJpbmdFbmQiKQ0KDQpfZXNjYXBlZFB1bmMgPSBXb3JkKCBfYnNsYXNoLCByIlxbXS0qLiQrXj8oKX4gIiwgZXhhY3Q9MiApLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLGwsdDp0WzBdWzFdKQ0KX2VzY2FwZWRIZXhDaGFyID0gUmVnZXgociJcXDA/W3hYXVswLTlhLWZBLUZdKyIpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLGwsdDp1bmljaHIoaW50KHRbMF0ubHN0cmlwKHInXDB4JyksMTYpKSkNCl9lc2NhcGVkT2N0Q2hhciA9IFJlZ2V4KHIiXFwwWzAtN10rIikuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsbCx0OnVuaWNocihpbnQodFswXVsxOl0sOCkpKQ0KX3NpbmdsZUNoYXIgPSBfZXNjYXBlZFB1bmMgfCBfZXNjYXBlZEhleENoYXIgfCBfZXNjYXBlZE9jdENoYXIgfCBDaGFyc05vdEluKHInXF0nLCBleGFjdD0xKQ0KX2NoYXJSYW5nZSA9IEdyb3VwKF9zaW5nbGVDaGFyICsgU3VwcHJlc3MoIi0iKSArIF9zaW5nbGVDaGFyKQ0KX3JlQnJhY2tldEV4cHIgPSBMaXRlcmFsKCJbIikgKyBPcHRpb25hbCgiXiIpLnNldFJlc3VsdHNOYW1lKCJuZWdhdGUiKSArIEdyb3VwKCBPbmVPck1vcmUoIF9jaGFyUmFuZ2UgfCBfc2luZ2xlQ2hhciApICkuc2V0UmVzdWx0c05hbWUoImJvZHkiKSArICJdIg0KDQpkZWYgc3JhbmdlKHMpOg0KICAgIHIiIiINCiAgICBIZWxwZXIgdG8gZWFzaWx5IGRlZmluZSBzdHJpbmcgcmFuZ2VzIGZvciB1c2UgaW4gV29yZCBjb25zdHJ1Y3Rpb24uICBCb3Jyb3dzDQogICAgc3ludGF4IGZyb20gcmVnZXhwICdbXScgc3RyaW5nIHJhbmdlIGRlZmluaXRpb25zOjoNCiAgICAgICAgc3JhbmdlKCJbMC05XSIpICAgLT4gIjAxMjM0NTY3ODkiDQogICAgICAgIHNyYW5nZSgiW2Etel0iKSAgIC0+ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiINCiAgICAgICAgc3JhbmdlKCJbYS16JF9dIikgLT4gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JF8iDQogICAgVGhlIGlucHV0IHN0cmluZyBtdXN0IGJlIGVuY2xvc2VkIGluIFtdJ3MsIGFuZCB0aGUgcmV0dXJuZWQgc3RyaW5nIGlzIHRoZSBleHBhbmRlZA0KICAgIGNoYXJhY3RlciBzZXQgam9pbmVkIGludG8gYSBzaW5nbGUgc3RyaW5nLg0KICAgIFRoZSB2YWx1ZXMgZW5jbG9zZWQgaW4gdGhlIFtdJ3MgbWF5IGJlOg0KICAgICAtIGEgc2luZ2xlIGNoYXJhY3Rlcg0KICAgICAtIGFuIGVzY2FwZWQgY2hhcmFjdGVyIHdpdGggYSBsZWFkaW5nIGJhY2tzbGFzaCAoc3VjaCBhcyBDe1wtfSBvciBDe1xdfSkNCiAgICAgLSBhbiBlc2NhcGVkIGhleCBjaGFyYWN0ZXIgd2l0aCBhIGxlYWRpbmcgQ3snXHgnfSAoQ3tceDIxfSwgd2hpY2ggaXMgYSBDeychJ30gY2hhcmFjdGVyKSANCiAgICAgICAgIChDe1wweCMjfSBpcyBhbHNvIHN1cHBvcnRlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkpIA0KICAgICAtIGFuIGVzY2FwZWQgb2N0YWwgY2hhcmFjdGVyIHdpdGggYSBsZWFkaW5nIEN7J1wwJ30gKEN7XDA0MX0sIHdoaWNoIGlzIGEgQ3snISd9IGNoYXJhY3RlcikNCiAgICAgLSBhIHJhbmdlIG9mIGFueSBvZiB0aGUgYWJvdmUsIHNlcGFyYXRlZCBieSBhIGRhc2ggKEN7J2Eteid9LCBldGMuKQ0KICAgICAtIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgYWJvdmUgKEN7J2FlaW91eSd9LCBDeydhLXpBLVowLTlfJCd9LCBldGMuKQ0KICAgICIiIg0KICAgIF9leHBhbmRlZCA9IGxhbWJkYSBwOiBwIGlmIG5vdCBpc2luc3RhbmNlKHAsUGFyc2VSZXN1bHRzKSBlbHNlICcnLmpvaW4odW5pY2hyKGMpIGZvciBjIGluIHJhbmdlKG9yZChwWzBdKSxvcmQocFsxXSkrMSkpDQogICAgdHJ5Og0KICAgICAgICByZXR1cm4gIiIuam9pbihfZXhwYW5kZWQocGFydCkgZm9yIHBhcnQgaW4gX3JlQnJhY2tldEV4cHIucGFyc2VTdHJpbmcocykuYm9keSkNCiAgICBleGNlcHQgRXhjZXB0aW9uOg0KICAgICAgICByZXR1cm4gIiINCg0KZGVmIG1hdGNoT25seUF0Q29sKG4pOg0KICAgICIiIg0KICAgIEhlbHBlciBtZXRob2QgZm9yIGRlZmluaW5nIHBhcnNlIGFjdGlvbnMgdGhhdCByZXF1aXJlIG1hdGNoaW5nIGF0IGEgc3BlY2lmaWMNCiAgICBjb2x1bW4gaW4gdGhlIGlucHV0IHRleHQuDQogICAgIiIiDQogICAgZGVmIHZlcmlmeUNvbChzdHJnLGxvY24sdG9rcyk6DQogICAgICAgIGlmIGNvbChsb2NuLHN0cmcpICE9IG46DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihzdHJnLGxvY24sIm1hdGNoZWQgdG9rZW4gbm90IGF0IGNvbHVtbiAlZCIgJSBuKQ0KICAgIHJldHVybiB2ZXJpZnlDb2wNCg0KZGVmIHJlcGxhY2VXaXRoKHJlcGxTdHIpOg0KICAgICIiIg0KICAgIEhlbHBlciBtZXRob2QgZm9yIGNvbW1vbiBwYXJzZSBhY3Rpb25zIHRoYXQgc2ltcGx5IHJldHVybiBhIGxpdGVyYWwgdmFsdWUuICBFc3BlY2lhbGx5DQogICAgdXNlZnVsIHdoZW4gdXNlZCB3aXRoIEN7THt0cmFuc2Zvcm1TdHJpbmc8UGFyc2VyRWxlbWVudC50cmFuc2Zvcm1TdHJpbmc+fSgpfS4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBudW0gPSBXb3JkKG51bXMpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0b2tzOiBpbnQodG9rc1swXSkpDQogICAgICAgIG5hID0gb25lT2YoIk4vQSBOQSIpLnNldFBhcnNlQWN0aW9uKHJlcGxhY2VXaXRoKG1hdGgubmFuKSkNCiAgICAgICAgdGVybSA9IG5hIHwgbnVtDQogICAgICAgIA0KICAgICAgICBPbmVPck1vcmUodGVybSkucGFyc2VTdHJpbmcoIjMyNCAyMzQgTi9BIDIzNCIpICMgLT4gWzMyNCwgMjM0LCBuYW4sIDIzNF0NCiAgICAiIiINCiAgICByZXR1cm4gbGFtYmRhIHMsbCx0OiBbcmVwbFN0cl0NCg0KZGVmIHJlbW92ZVF1b3RlcyhzLGwsdCk6DQogICAgIiIiDQogICAgSGVscGVyIHBhcnNlIGFjdGlvbiBmb3IgcmVtb3ZpbmcgcXVvdGF0aW9uIG1hcmtzIGZyb20gcGFyc2VkIHF1b3RlZCBzdHJpbmdzLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgICMgYnkgZGVmYXVsdCwgcXVvdGF0aW9uIG1hcmtzIGFyZSBpbmNsdWRlZCBpbiBwYXJzZWQgcmVzdWx0cw0KICAgICAgICBxdW90ZWRTdHJpbmcucGFyc2VTdHJpbmcoIidOb3cgaXMgdGhlIFdpbnRlciBvZiBvdXIgRGlzY29udGVudCciKSAjIC0+IFsiJ05vdyBpcyB0aGUgV2ludGVyIG9mIG91ciBEaXNjb250ZW50JyJdDQoNCiAgICAgICAgIyB1c2UgcmVtb3ZlUXVvdGVzIHRvIHN0cmlwIHF1b3RhdGlvbiBtYXJrcyBmcm9tIHBhcnNlZCByZXN1bHRzDQogICAgICAgIHF1b3RlZFN0cmluZy5zZXRQYXJzZUFjdGlvbihyZW1vdmVRdW90ZXMpDQogICAgICAgIHF1b3RlZFN0cmluZy5wYXJzZVN0cmluZygiJ05vdyBpcyB0aGUgV2ludGVyIG9mIG91ciBEaXNjb250ZW50JyIpICMgLT4gWyJOb3cgaXMgdGhlIFdpbnRlciBvZiBvdXIgRGlzY29udGVudCJdDQogICAgIiIiDQogICAgcmV0dXJuIHRbMF1bMTotMV0NCg0KZGVmIHRva2VuTWFwKGZ1bmMsICphcmdzKToNCiAgICAiIiINCiAgICBIZWxwZXIgdG8gZGVmaW5lIGEgcGFyc2UgYWN0aW9uIGJ5IG1hcHBpbmcgYSBmdW5jdGlvbiB0byBhbGwgZWxlbWVudHMgb2YgYSBQYXJzZVJlc3VsdHMgbGlzdC5JZiBhbnkgYWRkaXRpb25hbCANCiAgICBhcmdzIGFyZSBwYXNzZWQsIHRoZXkgYXJlIGZvcndhcmRlZCB0byB0aGUgZ2l2ZW4gZnVuY3Rpb24gYXMgYWRkaXRpb25hbCBhcmd1bWVudHMgYWZ0ZXINCiAgICB0aGUgdG9rZW4sIGFzIGluIEN7aGV4X2ludGVnZXIgPSBXb3JkKGhleG51bXMpLnNldFBhcnNlQWN0aW9uKHRva2VuTWFwKGludCwgMTYpKX0sIHdoaWNoIHdpbGwgY29udmVydCB0aGUNCiAgICBwYXJzZWQgZGF0YSB0byBhbiBpbnRlZ2VyIHVzaW5nIGJhc2UgMTYuDQoNCiAgICBFeGFtcGxlIChjb21wYXJlIHRoZSBsYXN0IHRvIGV4YW1wbGUgaW4gTHtQYXJzZXJFbGVtZW50LnRyYW5zZm9ybVN0cmluZ306Og0KICAgICAgICBoZXhfaW50cyA9IE9uZU9yTW9yZShXb3JkKGhleG51bXMpKS5zZXRQYXJzZUFjdGlvbih0b2tlbk1hcChpbnQsIDE2KSkNCiAgICAgICAgaGV4X2ludHMucnVuVGVzdHMoJycnDQogICAgICAgICAgICAwMCAxMSAyMiBhYSBGRiAwYSAwZCAxYQ0KICAgICAgICAgICAgJycnKQ0KICAgICAgICANCiAgICAgICAgdXBwZXJ3b3JkID0gV29yZChhbHBoYXMpLnNldFBhcnNlQWN0aW9uKHRva2VuTWFwKHN0ci51cHBlcikpDQogICAgICAgIE9uZU9yTW9yZSh1cHBlcndvcmQpLnJ1blRlc3RzKCcnJw0KICAgICAgICAgICAgbXkga2luZ2RvbSBmb3IgYSBob3JzZQ0KICAgICAgICAgICAgJycnKQ0KDQogICAgICAgIHdkID0gV29yZChhbHBoYXMpLnNldFBhcnNlQWN0aW9uKHRva2VuTWFwKHN0ci50aXRsZSkpDQogICAgICAgIE9uZU9yTW9yZSh3ZCkuc2V0UGFyc2VBY3Rpb24oJyAnLmpvaW4pLnJ1blRlc3RzKCcnJw0KICAgICAgICAgICAgbm93IGlzIHRoZSB3aW50ZXIgb2Ygb3VyIGRpc2NvbnRlbnQgbWFkZSBnbG9yaW91cyBzdW1tZXIgYnkgdGhpcyBzdW4gb2YgeW9yaw0KICAgICAgICAgICAgJycnKQ0KICAgIHByaW50czo6DQogICAgICAgIDAwIDExIDIyIGFhIEZGIDBhIDBkIDFhDQogICAgICAgIFswLCAxNywgMzQsIDE3MCwgMjU1LCAxMCwgMTMsIDI2XQ0KDQogICAgICAgIG15IGtpbmdkb20gZm9yIGEgaG9yc2UNCiAgICAgICAgWydNWScsICdLSU5HRE9NJywgJ0ZPUicsICdBJywgJ0hPUlNFJ10NCg0KICAgICAgICBub3cgaXMgdGhlIHdpbnRlciBvZiBvdXIgZGlzY29udGVudCBtYWRlIGdsb3Jpb3VzIHN1bW1lciBieSB0aGlzIHN1biBvZiB5b3JrDQogICAgICAgIFsnTm93IElzIFRoZSBXaW50ZXIgT2YgT3VyIERpc2NvbnRlbnQgTWFkZSBHbG9yaW91cyBTdW1tZXIgQnkgVGhpcyBTdW4gT2YgWW9yayddDQogICAgIiIiDQogICAgZGVmIHBhKHMsbCx0KToNCiAgICAgICAgcmV0dXJuIFtmdW5jKHRva24sICphcmdzKSBmb3IgdG9rbiBpbiB0XQ0KDQogICAgdHJ5Og0KICAgICAgICBmdW5jX25hbWUgPSBnZXRhdHRyKGZ1bmMsICdfX25hbWVfXycsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldGF0dHIoZnVuYywgJ19fY2xhc3NfXycpLl9fbmFtZV9fKQ0KICAgIGV4Y2VwdCBFeGNlcHRpb246DQogICAgICAgIGZ1bmNfbmFtZSA9IHN0cihmdW5jKQ0KICAgIHBhLl9fbmFtZV9fID0gZnVuY19uYW1lDQoNCiAgICByZXR1cm4gcGENCg0KdXBjYXNlVG9rZW5zID0gdG9rZW5NYXAobGFtYmRhIHQ6IF91c3RyKHQpLnVwcGVyKCkpDQoiIiIoRGVwcmVjYXRlZCkgSGVscGVyIHBhcnNlIGFjdGlvbiB0byBjb252ZXJ0IHRva2VucyB0byB1cHBlciBjYXNlLiBEZXByZWNhdGVkIGluIGZhdm9yIG9mIEx7cHlwYXJzaW5nX2NvbW1vbi51cGNhc2VUb2tlbnN9IiIiDQoNCmRvd25jYXNlVG9rZW5zID0gdG9rZW5NYXAobGFtYmRhIHQ6IF91c3RyKHQpLmxvd2VyKCkpDQoiIiIoRGVwcmVjYXRlZCkgSGVscGVyIHBhcnNlIGFjdGlvbiB0byBjb252ZXJ0IHRva2VucyB0byBsb3dlciBjYXNlLiBEZXByZWNhdGVkIGluIGZhdm9yIG9mIEx7cHlwYXJzaW5nX2NvbW1vbi5kb3duY2FzZVRva2Vuc30iIiINCiAgICANCmRlZiBfbWFrZVRhZ3ModGFnU3RyLCB4bWwpOg0KICAgICIiIkludGVybmFsIGhlbHBlciB0byBjb25zdHJ1Y3Qgb3BlbmluZyBhbmQgY2xvc2luZyB0YWcgZXhwcmVzc2lvbnMsIGdpdmVuIGEgdGFnIG5hbWUiIiINCiAgICBpZiBpc2luc3RhbmNlKHRhZ1N0cixiYXNlc3RyaW5nKToNCiAgICAgICAgcmVzbmFtZSA9IHRhZ1N0cg0KICAgICAgICB0YWdTdHIgPSBLZXl3b3JkKHRhZ1N0ciwgY2FzZWxlc3M9bm90IHhtbCkNCiAgICBlbHNlOg0KICAgICAgICByZXNuYW1lID0gdGFnU3RyLm5hbWUNCg0KICAgIHRhZ0F0dHJOYW1lID0gV29yZChhbHBoYXMsYWxwaGFudW1zKyJfLToiKQ0KICAgIGlmICh4bWwpOg0KICAgICAgICB0YWdBdHRyVmFsdWUgPSBkYmxRdW90ZWRTdHJpbmcuY29weSgpLnNldFBhcnNlQWN0aW9uKCByZW1vdmVRdW90ZXMgKQ0KICAgICAgICBvcGVuVGFnID0gU3VwcHJlc3MoIjwiKSArIHRhZ1N0cigidGFnIikgKyBcDQogICAgICAgICAgICAgICAgRGljdChaZXJvT3JNb3JlKEdyb3VwKCB0YWdBdHRyTmFtZSArIFN1cHByZXNzKCI9IikgKyB0YWdBdHRyVmFsdWUgKSkpICsgXA0KICAgICAgICAgICAgICAgIE9wdGlvbmFsKCIvIixkZWZhdWx0PVtGYWxzZV0pLnNldFJlc3VsdHNOYW1lKCJlbXB0eSIpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLGwsdDp0WzBdPT0nLycpICsgU3VwcHJlc3MoIj4iKQ0KICAgIGVsc2U6DQogICAgICAgIHByaW50YWJsZXNMZXNzUkFicmFjayA9ICIiLmpvaW4oYyBmb3IgYyBpbiBwcmludGFibGVzIGlmIGMgbm90IGluICI+IikNCiAgICAgICAgdGFnQXR0clZhbHVlID0gcXVvdGVkU3RyaW5nLmNvcHkoKS5zZXRQYXJzZUFjdGlvbiggcmVtb3ZlUXVvdGVzICkgfCBXb3JkKHByaW50YWJsZXNMZXNzUkFicmFjaykNCiAgICAgICAgb3BlblRhZyA9IFN1cHByZXNzKCI8IikgKyB0YWdTdHIoInRhZyIpICsgXA0KICAgICAgICAgICAgICAgIERpY3QoWmVyb09yTW9yZShHcm91cCggdGFnQXR0ck5hbWUuc2V0UGFyc2VBY3Rpb24oZG93bmNhc2VUb2tlbnMpICsgXA0KICAgICAgICAgICAgICAgIE9wdGlvbmFsKCBTdXBwcmVzcygiPSIpICsgdGFnQXR0clZhbHVlICkgKSkpICsgXA0KICAgICAgICAgICAgICAgIE9wdGlvbmFsKCIvIixkZWZhdWx0PVtGYWxzZV0pLnNldFJlc3VsdHNOYW1lKCJlbXB0eSIpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLGwsdDp0WzBdPT0nLycpICsgU3VwcHJlc3MoIj4iKQ0KICAgIGNsb3NlVGFnID0gQ29tYmluZShfTCgiPC8iKSArIHRhZ1N0ciArICI+IikNCg0KICAgIG9wZW5UYWcgPSBvcGVuVGFnLnNldFJlc3VsdHNOYW1lKCJzdGFydCIrIiIuam9pbihyZXNuYW1lLnJlcGxhY2UoIjoiLCIgIikudGl0bGUoKS5zcGxpdCgpKSkuc2V0TmFtZSgiPCVzPiIgJSByZXNuYW1lKQ0KICAgIGNsb3NlVGFnID0gY2xvc2VUYWcuc2V0UmVzdWx0c05hbWUoImVuZCIrIiIuam9pbihyZXNuYW1lLnJlcGxhY2UoIjoiLCIgIikudGl0bGUoKS5zcGxpdCgpKSkuc2V0TmFtZSgiPC8lcz4iICUgcmVzbmFtZSkNCiAgICBvcGVuVGFnLnRhZyA9IHJlc25hbWUNCiAgICBjbG9zZVRhZy50YWcgPSByZXNuYW1lDQogICAgcmV0dXJuIG9wZW5UYWcsIGNsb3NlVGFnDQoNCmRlZiBtYWtlSFRNTFRhZ3ModGFnU3RyKToNCiAgICAiIiINCiAgICBIZWxwZXIgdG8gY29uc3RydWN0IG9wZW5pbmcgYW5kIGNsb3NpbmcgdGFnIGV4cHJlc3Npb25zIGZvciBIVE1MLCBnaXZlbiBhIHRhZyBuYW1lLiBNYXRjaGVzDQogICAgdGFncyBpbiBlaXRoZXIgdXBwZXIgb3IgbG93ZXIgY2FzZSwgYXR0cmlidXRlcyB3aXRoIG5hbWVzcGFjZXMgYW5kIHdpdGggcXVvdGVkIG9yIHVucXVvdGVkIHZhbHVlcy4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICB0ZXh0ID0gJzx0ZD5Nb3JlIGluZm8gYXQgdGhlIDxhIGhyZWY9Imh0dHA6Ly9weXBhcnNpbmcud2lraXNwYWNlcy5jb20iPnB5cGFyc2luZzwvYT4gd2lraSBwYWdlPC90ZD4nDQogICAgICAgICMgbWFrZUhUTUxUYWdzIHJldHVybnMgcHlwYXJzaW5nIGV4cHJlc3Npb25zIGZvciB0aGUgb3BlbmluZyBhbmQgY2xvc2luZyB0YWdzIGFzIGEgMi10dXBsZQ0KICAgICAgICBhLGFfZW5kID0gbWFrZUhUTUxUYWdzKCJBIikNCiAgICAgICAgbGlua19leHByID0gYSArIFNraXBUbyhhX2VuZCkoImxpbmtfdGV4dCIpICsgYV9lbmQNCiAgICAgICAgDQogICAgICAgIGZvciBsaW5rIGluIGxpbmtfZXhwci5zZWFyY2hTdHJpbmcodGV4dCk6DQogICAgICAgICAgICAjIGF0dHJpYnV0ZXMgaW4gdGhlIDxBPiB0YWcgKGxpa2UgImhyZWYiIHNob3duIGhlcmUpIGFyZSBhbHNvIGFjY2Vzc2libGUgYXMgbmFtZWQgcmVzdWx0cw0KICAgICAgICAgICAgcHJpbnQobGluay5saW5rX3RleHQsICctPicsIGxpbmsuaHJlZikNCiAgICBwcmludHM6Og0KICAgICAgICBweXBhcnNpbmcgLT4gaHR0cDovL3B5cGFyc2luZy53aWtpc3BhY2VzLmNvbQ0KICAgICIiIg0KICAgIHJldHVybiBfbWFrZVRhZ3MoIHRhZ1N0ciwgRmFsc2UgKQ0KDQpkZWYgbWFrZVhNTFRhZ3ModGFnU3RyKToNCiAgICAiIiINCiAgICBIZWxwZXIgdG8gY29uc3RydWN0IG9wZW5pbmcgYW5kIGNsb3NpbmcgdGFnIGV4cHJlc3Npb25zIGZvciBYTUwsIGdpdmVuIGEgdGFnIG5hbWUuIE1hdGNoZXMNCiAgICB0YWdzIG9ubHkgaW4gdGhlIGdpdmVuIHVwcGVyL2xvd2VyIGNhc2UuDQoNCiAgICBFeGFtcGxlOiBzaW1pbGFyIHRvIEx7bWFrZUhUTUxUYWdzfQ0KICAgICIiIg0KICAgIHJldHVybiBfbWFrZVRhZ3MoIHRhZ1N0ciwgVHJ1ZSApDQoNCmRlZiB3aXRoQXR0cmlidXRlKCphcmdzLCoqYXR0ckRpY3QpOg0KICAgICIiIg0KICAgIEhlbHBlciB0byBjcmVhdGUgYSB2YWxpZGF0aW5nIHBhcnNlIGFjdGlvbiB0byBiZSB1c2VkIHdpdGggc3RhcnQgdGFncyBjcmVhdGVkDQogICAgd2l0aCBDe0x7bWFrZVhNTFRhZ3N9fSBvciBDe0x7bWFrZUhUTUxUYWdzfX0uIFVzZSBDe3dpdGhBdHRyaWJ1dGV9IHRvIHF1YWxpZnkgYSBzdGFydGluZyB0YWcNCiAgICB3aXRoIGEgcmVxdWlyZWQgYXR0cmlidXRlIHZhbHVlLCB0byBhdm9pZCBmYWxzZSBtYXRjaGVzIG9uIGNvbW1vbiB0YWdzIHN1Y2ggYXMNCiAgICBDezxURD59IG9yIEN7PERJVj59Lg0KDQogICAgQ2FsbCBDe3dpdGhBdHRyaWJ1dGV9IHdpdGggYSBzZXJpZXMgb2YgYXR0cmlidXRlIG5hbWVzIGFuZCB2YWx1ZXMuIFNwZWNpZnkgdGhlIGxpc3QNCiAgICBvZiBmaWx0ZXIgYXR0cmlidXRlcyBuYW1lcyBhbmQgdmFsdWVzIGFzOg0KICAgICAtIGtleXdvcmQgYXJndW1lbnRzLCBhcyBpbiBDeyhhbGlnbj0icmlnaHQiKX0sIG9yDQogICAgIC0gYXMgYW4gZXhwbGljaXQgZGljdCB3aXRoIEN7Kip9IG9wZXJhdG9yLCB3aGVuIGFuIGF0dHJpYnV0ZSBuYW1lIGlzIGFsc28gYSBQeXRob24NCiAgICAgICAgICByZXNlcnZlZCB3b3JkLCBhcyBpbiBDeyoqeyJjbGFzcyI6IkN1c3RvbWVyIiwgImFsaWduIjoicmlnaHQifX0NCiAgICAgLSBhIGxpc3Qgb2YgbmFtZS12YWx1ZSB0dXBsZXMsIGFzIGluICggKCJuczE6Y2xhc3MiLCAiQ3VzdG9tZXIiKSwgKCJuczI6YWxpZ24iLCJyaWdodCIpICkNCiAgICBGb3IgYXR0cmlidXRlIG5hbWVzIHdpdGggYSBuYW1lc3BhY2UgcHJlZml4LCB5b3UgbXVzdCB1c2UgdGhlIHNlY29uZCBmb3JtLiAgQXR0cmlidXRlDQogICAgbmFtZXMgYXJlIG1hdGNoZWQgaW5zZW5zaXRpdmUgdG8gdXBwZXIvbG93ZXIgY2FzZS4NCiAgICAgICANCiAgICBJZiBqdXN0IHRlc3RpbmcgZm9yIEN7Y2xhc3N9ICh3aXRoIG9yIHdpdGhvdXQgYSBuYW1lc3BhY2UpLCB1c2UgQ3tMe3dpdGhDbGFzc319Lg0KDQogICAgVG8gdmVyaWZ5IHRoYXQgdGhlIGF0dHJpYnV0ZSBleGlzdHMsIGJ1dCB3aXRob3V0IHNwZWNpZnlpbmcgYSB2YWx1ZSwgcGFzcw0KICAgIEN7d2l0aEF0dHJpYnV0ZS5BTllfVkFMVUV9IGFzIHRoZSB2YWx1ZS4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBodG1sID0gJycnDQogICAgICAgICAgICA8ZGl2Pg0KICAgICAgICAgICAgU29tZSB0ZXh0DQogICAgICAgICAgICA8ZGl2IHR5cGU9ImdyaWQiPjEgNCAwIDEgMDwvZGl2Pg0KICAgICAgICAgICAgPGRpdiB0eXBlPSJncmFwaCI+MSwzIDIsMyAxLDE8L2Rpdj4NCiAgICAgICAgICAgIDxkaXY+dGhpcyBoYXMgbm8gdHlwZTwvZGl2Pg0KICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgDQogICAgICAgICcnJw0KICAgICAgICBkaXYsZGl2X2VuZCA9IG1ha2VIVE1MVGFncygiZGl2IikNCg0KICAgICAgICAjIG9ubHkgbWF0Y2ggZGl2IHRhZyBoYXZpbmcgYSB0eXBlIGF0dHJpYnV0ZSB3aXRoIHZhbHVlICJncmlkIg0KICAgICAgICBkaXZfZ3JpZCA9IGRpdigpLnNldFBhcnNlQWN0aW9uKHdpdGhBdHRyaWJ1dGUodHlwZT0iZ3JpZCIpKQ0KICAgICAgICBncmlkX2V4cHIgPSBkaXZfZ3JpZCArIFNraXBUbyhkaXYgfCBkaXZfZW5kKSgiYm9keSIpDQogICAgICAgIGZvciBncmlkX2hlYWRlciBpbiBncmlkX2V4cHIuc2VhcmNoU3RyaW5nKGh0bWwpOg0KICAgICAgICAgICAgcHJpbnQoZ3JpZF9oZWFkZXIuYm9keSkNCiAgICAgICAgDQogICAgICAgICMgY29uc3RydWN0IGEgbWF0Y2ggd2l0aCBhbnkgZGl2IHRhZyBoYXZpbmcgYSB0eXBlIGF0dHJpYnV0ZSwgcmVnYXJkbGVzcyBvZiB0aGUgdmFsdWUNCiAgICAgICAgZGl2X2FueV90eXBlID0gZGl2KCkuc2V0UGFyc2VBY3Rpb24od2l0aEF0dHJpYnV0ZSh0eXBlPXdpdGhBdHRyaWJ1dGUuQU5ZX1ZBTFVFKSkNCiAgICAgICAgZGl2X2V4cHIgPSBkaXZfYW55X3R5cGUgKyBTa2lwVG8oZGl2IHwgZGl2X2VuZCkoImJvZHkiKQ0KICAgICAgICBmb3IgZGl2X2hlYWRlciBpbiBkaXZfZXhwci5zZWFyY2hTdHJpbmcoaHRtbCk6DQogICAgICAgICAgICBwcmludChkaXZfaGVhZGVyLmJvZHkpDQogICAgcHJpbnRzOjoNCiAgICAgICAgMSA0IDAgMSAwDQoNCiAgICAgICAgMSA0IDAgMSAwDQogICAgICAgIDEsMyAyLDMgMSwxDQogICAgIiIiDQogICAgaWYgYXJnczoNCiAgICAgICAgYXR0cnMgPSBhcmdzWzpdDQogICAgZWxzZToNCiAgICAgICAgYXR0cnMgPSBhdHRyRGljdC5pdGVtcygpDQogICAgYXR0cnMgPSBbKGssdikgZm9yIGssdiBpbiBhdHRyc10NCiAgICBkZWYgcGEocyxsLHRva2Vucyk6DQogICAgICAgIGZvciBhdHRyTmFtZSxhdHRyVmFsdWUgaW4gYXR0cnM6DQogICAgICAgICAgICBpZiBhdHRyTmFtZSBub3QgaW4gdG9rZW5zOg0KICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKHMsbCwibm8gbWF0Y2hpbmcgYXR0cmlidXRlICIgKyBhdHRyTmFtZSkNCiAgICAgICAgICAgIGlmIGF0dHJWYWx1ZSAhPSB3aXRoQXR0cmlidXRlLkFOWV9WQUxVRSBhbmQgdG9rZW5zW2F0dHJOYW1lXSAhPSBhdHRyVmFsdWU6DQogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24ocyxsLCJhdHRyaWJ1dGUgJyVzJyBoYXMgdmFsdWUgJyVzJywgbXVzdCBiZSAnJXMnIiAlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdHRyTmFtZSwgdG9rZW5zW2F0dHJOYW1lXSwgYXR0clZhbHVlKSkNCiAgICByZXR1cm4gcGENCndpdGhBdHRyaWJ1dGUuQU5ZX1ZBTFVFID0gb2JqZWN0KCkNCg0KZGVmIHdpdGhDbGFzcyhjbGFzc25hbWUsIG5hbWVzcGFjZT0nJyk6DQogICAgIiIiDQogICAgU2ltcGxpZmllZCB2ZXJzaW9uIG9mIEN7THt3aXRoQXR0cmlidXRlfX0gd2hlbiBtYXRjaGluZyBvbiBhIGRpdiBjbGFzcyAtIG1hZGUNCiAgICBkaWZmaWN1bHQgYmVjYXVzZSBDe2NsYXNzfSBpcyBhIHJlc2VydmVkIHdvcmQgaW4gUHl0aG9uLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIGh0bWwgPSAnJycNCiAgICAgICAgICAgIDxkaXY+DQogICAgICAgICAgICBTb21lIHRleHQNCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImdyaWQiPjEgNCAwIDEgMDwvZGl2Pg0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZ3JhcGgiPjEsMyAyLDMgMSwxPC9kaXY+DQogICAgICAgICAgICA8ZGl2PnRoaXMgJmx0O2RpdiZndDsgaGFzIG5vIGNsYXNzPC9kaXY+DQogICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICANCiAgICAgICAgJycnDQogICAgICAgIGRpdixkaXZfZW5kID0gbWFrZUhUTUxUYWdzKCJkaXYiKQ0KICAgICAgICBkaXZfZ3JpZCA9IGRpdigpLnNldFBhcnNlQWN0aW9uKHdpdGhDbGFzcygiZ3JpZCIpKQ0KICAgICAgICANCiAgICAgICAgZ3JpZF9leHByID0gZGl2X2dyaWQgKyBTa2lwVG8oZGl2IHwgZGl2X2VuZCkoImJvZHkiKQ0KICAgICAgICBmb3IgZ3JpZF9oZWFkZXIgaW4gZ3JpZF9leHByLnNlYXJjaFN0cmluZyhodG1sKToNCiAgICAgICAgICAgIHByaW50KGdyaWRfaGVhZGVyLmJvZHkpDQogICAgICAgIA0KICAgICAgICBkaXZfYW55X3R5cGUgPSBkaXYoKS5zZXRQYXJzZUFjdGlvbih3aXRoQ2xhc3Mod2l0aEF0dHJpYnV0ZS5BTllfVkFMVUUpKQ0KICAgICAgICBkaXZfZXhwciA9IGRpdl9hbnlfdHlwZSArIFNraXBUbyhkaXYgfCBkaXZfZW5kKSgiYm9keSIpDQogICAgICAgIGZvciBkaXZfaGVhZGVyIGluIGRpdl9leHByLnNlYXJjaFN0cmluZyhodG1sKToNCiAgICAgICAgICAgIHByaW50KGRpdl9oZWFkZXIuYm9keSkNCiAgICBwcmludHM6Og0KICAgICAgICAxIDQgMCAxIDANCg0KICAgICAgICAxIDQgMCAxIDANCiAgICAgICAgMSwzIDIsMyAxLDENCiAgICAiIiINCiAgICBjbGFzc2F0dHIgPSAiJXM6Y2xhc3MiICUgbmFtZXNwYWNlIGlmIG5hbWVzcGFjZSBlbHNlICJjbGFzcyINCiAgICByZXR1cm4gd2l0aEF0dHJpYnV0ZSgqKntjbGFzc2F0dHIgOiBjbGFzc25hbWV9KSAgICAgICAgDQoNCm9wQXNzb2MgPSBfQ29uc3RhbnRzKCkNCm9wQXNzb2MuTEVGVCA9IG9iamVjdCgpDQpvcEFzc29jLlJJR0hUID0gb2JqZWN0KCkNCg0KZGVmIGluZml4Tm90YXRpb24oIGJhc2VFeHByLCBvcExpc3QsIGxwYXI9U3VwcHJlc3MoJygnKSwgcnBhcj1TdXBwcmVzcygnKScpICk6DQogICAgIiIiDQogICAgSGVscGVyIG1ldGhvZCBmb3IgY29uc3RydWN0aW5nIGdyYW1tYXJzIG9mIGV4cHJlc3Npb25zIG1hZGUgdXAgb2YNCiAgICBvcGVyYXRvcnMgd29ya2luZyBpbiBhIHByZWNlZGVuY2UgaGllcmFyY2h5LiAgT3BlcmF0b3JzIG1heSBiZSB1bmFyeSBvcg0KICAgIGJpbmFyeSwgbGVmdC0gb3IgcmlnaHQtYXNzb2NpYXRpdmUuICBQYXJzZSBhY3Rpb25zIGNhbiBhbHNvIGJlIGF0dGFjaGVkDQogICAgdG8gb3BlcmF0b3IgZXhwcmVzc2lvbnMuIFRoZSBnZW5lcmF0ZWQgcGFyc2VyIHdpbGwgYWxzbyByZWNvZ25pemUgdGhlIHVzZSANCiAgICBvZiBwYXJlbnRoZXNlcyB0byBvdmVycmlkZSBvcGVyYXRvciBwcmVjZWRlbmNlcyAoc2VlIGV4YW1wbGUgYmVsb3cpLg0KICAgIA0KICAgIE5vdGU6IGlmIHlvdSBkZWZpbmUgYSBkZWVwIG9wZXJhdG9yIGxpc3QsIHlvdSBtYXkgc2VlIHBlcmZvcm1hbmNlIGlzc3Vlcw0KICAgIHdoZW4gdXNpbmcgaW5maXhOb3RhdGlvbi4gU2VlIEx7UGFyc2VyRWxlbWVudC5lbmFibGVQYWNrcmF0fSBmb3IgYQ0KICAgIG1lY2hhbmlzbSB0byBwb3RlbnRpYWxseSBpbXByb3ZlIHlvdXIgcGFyc2VyIHBlcmZvcm1hbmNlLg0KDQogICAgUGFyYW1ldGVyczoNCiAgICAgLSBiYXNlRXhwciAtIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBtb3N0IGJhc2ljIGVsZW1lbnQgZm9yIHRoZSBuZXN0ZWQNCiAgICAgLSBvcExpc3QgLSBsaXN0IG9mIHR1cGxlcywgb25lIGZvciBlYWNoIG9wZXJhdG9yIHByZWNlZGVuY2UgbGV2ZWwgaW4gdGhlDQogICAgICBleHByZXNzaW9uIGdyYW1tYXI7IGVhY2ggdHVwbGUgaXMgb2YgdGhlIGZvcm0NCiAgICAgIChvcEV4cHIsIG51bVRlcm1zLCByaWdodExlZnRBc3NvYywgcGFyc2VBY3Rpb24pLCB3aGVyZToNCiAgICAgICAtIG9wRXhwciBpcyB0aGUgcHlwYXJzaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBvcGVyYXRvcjsNCiAgICAgICAgICBtYXkgYWxzbyBiZSBhIHN0cmluZywgd2hpY2ggd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSBMaXRlcmFsOw0KICAgICAgICAgIGlmIG51bVRlcm1zIGlzIDMsIG9wRXhwciBpcyBhIHR1cGxlIG9mIHR3byBleHByZXNzaW9ucywgZm9yIHRoZQ0KICAgICAgICAgIHR3byBvcGVyYXRvcnMgc2VwYXJhdGluZyB0aGUgMyB0ZXJtcw0KICAgICAgIC0gbnVtVGVybXMgaXMgdGhlIG51bWJlciBvZiB0ZXJtcyBmb3IgdGhpcyBvcGVyYXRvciAobXVzdA0KICAgICAgICAgIGJlIDEsIDIsIG9yIDMpDQogICAgICAgLSByaWdodExlZnRBc3NvYyBpcyB0aGUgaW5kaWNhdG9yIHdoZXRoZXIgdGhlIG9wZXJhdG9yIGlzDQogICAgICAgICAgcmlnaHQgb3IgbGVmdCBhc3NvY2lhdGl2ZSwgdXNpbmcgdGhlIHB5cGFyc2luZy1kZWZpbmVkDQogICAgICAgICAgY29uc3RhbnRzIEN7b3BBc3NvYy5SSUdIVH0gYW5kIEN7b3BBc3NvYy5MRUZUfS4NCiAgICAgICAtIHBhcnNlQWN0aW9uIGlzIHRoZSBwYXJzZSBhY3Rpb24gdG8gYmUgYXNzb2NpYXRlZCB3aXRoDQogICAgICAgICAgZXhwcmVzc2lvbnMgbWF0Y2hpbmcgdGhpcyBvcGVyYXRvciBleHByZXNzaW9uICh0aGUNCiAgICAgICAgICBwYXJzZSBhY3Rpb24gdHVwbGUgbWVtYmVyIG1heSBiZSBvbWl0dGVkKTsgaWYgdGhlIHBhcnNlIGFjdGlvbg0KICAgICAgICAgIGlzIHBhc3NlZCBhIHR1cGxlIG9yIGxpc3Qgb2YgZnVuY3Rpb25zLCB0aGlzIGlzIGVxdWl2YWxlbnQgdG8NCiAgICAgICAgICBjYWxsaW5nIEN7c2V0UGFyc2VBY3Rpb24oKmZuKX0gKEx7UGFyc2VyRWxlbWVudC5zZXRQYXJzZUFjdGlvbn0pDQogICAgIC0gbHBhciAtIGV4cHJlc3Npb24gZm9yIG1hdGNoaW5nIGxlZnQtcGFyZW50aGVzZXMgKGRlZmF1bHQ9Q3tTdXBwcmVzcygnKCcpfSkNCiAgICAgLSBycGFyIC0gZXhwcmVzc2lvbiBmb3IgbWF0Y2hpbmcgcmlnaHQtcGFyZW50aGVzZXMgKGRlZmF1bHQ9Q3tTdXBwcmVzcygnKScpfSkNCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICAjIHNpbXBsZSBleGFtcGxlIG9mIGZvdXItZnVuY3Rpb24gYXJpdGhtZXRpYyB3aXRoIGludHMgYW5kIHZhcmlhYmxlIG5hbWVzDQogICAgICAgIGludGVnZXIgPSBweXBhcnNpbmdfY29tbW9uLnNpZ25lZF9pbnRlZ2VyDQogICAgICAgIHZhcm5hbWUgPSBweXBhcnNpbmdfY29tbW9uLmlkZW50aWZpZXIgDQogICAgICAgIA0KICAgICAgICBhcml0aF9leHByID0gaW5maXhOb3RhdGlvbihpbnRlZ2VyIHwgdmFybmFtZSwNCiAgICAgICAgICAgIFsNCiAgICAgICAgICAgICgnLScsIDEsIG9wQXNzb2MuUklHSFQpLA0KICAgICAgICAgICAgKG9uZU9mKCcqIC8nKSwgMiwgb3BBc3NvYy5MRUZUKSwNCiAgICAgICAgICAgIChvbmVPZignKyAtJyksIDIsIG9wQXNzb2MuTEVGVCksDQogICAgICAgICAgICBdKQ0KICAgICAgICANCiAgICAgICAgYXJpdGhfZXhwci5ydW5UZXN0cygnJycNCiAgICAgICAgICAgIDUrMyo2DQogICAgICAgICAgICAoNSszKSo2DQogICAgICAgICAgICAtMi0tMTENCiAgICAgICAgICAgICcnJywgZnVsbER1bXA9RmFsc2UpDQogICAgcHJpbnRzOjoNCiAgICAgICAgNSszKjYNCiAgICAgICAgW1s1LCAnKycsIFszLCAnKicsIDZdXV0NCg0KICAgICAgICAoNSszKSo2DQogICAgICAgIFtbWzUsICcrJywgM10sICcqJywgNl1dDQoNCiAgICAgICAgLTItLTExDQogICAgICAgIFtbWyctJywgMl0sICctJywgWyctJywgMTFdXV0NCiAgICAiIiINCiAgICByZXQgPSBGb3J3YXJkKCkNCiAgICBsYXN0RXhwciA9IGJhc2VFeHByIHwgKCBscGFyICsgcmV0ICsgcnBhciApDQogICAgZm9yIGksb3BlckRlZiBpbiBlbnVtZXJhdGUob3BMaXN0KToNCiAgICAgICAgb3BFeHByLGFyaXR5LHJpZ2h0TGVmdEFzc29jLHBhID0gKG9wZXJEZWYgKyAoTm9uZSwpKVs6NF0NCiAgICAgICAgdGVybU5hbWUgPSAiJXMgdGVybSIgJSBvcEV4cHIgaWYgYXJpdHkgPCAzIGVsc2UgIiVzJXMgdGVybSIgJSBvcEV4cHINCiAgICAgICAgaWYgYXJpdHkgPT0gMzoNCiAgICAgICAgICAgIGlmIG9wRXhwciBpcyBOb25lIG9yIGxlbihvcEV4cHIpICE9IDI6DQogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiaWYgbnVtdGVybXM9Mywgb3BFeHByIG11c3QgYmUgYSB0dXBsZSBvciBsaXN0IG9mIHR3byBleHByZXNzaW9ucyIpDQogICAgICAgICAgICBvcEV4cHIxLCBvcEV4cHIyID0gb3BFeHByDQogICAgICAgIHRoaXNFeHByID0gRm9yd2FyZCgpLnNldE5hbWUodGVybU5hbWUpDQogICAgICAgIGlmIHJpZ2h0TGVmdEFzc29jID09IG9wQXNzb2MuTEVGVDoNCiAgICAgICAgICAgIGlmIGFyaXR5ID09IDE6DQogICAgICAgICAgICAgICAgbWF0Y2hFeHByID0gRm9sbG93ZWRCeShsYXN0RXhwciArIG9wRXhwcikgKyBHcm91cCggbGFzdEV4cHIgKyBPbmVPck1vcmUoIG9wRXhwciApICkNCiAgICAgICAgICAgIGVsaWYgYXJpdHkgPT0gMjoNCiAgICAgICAgICAgICAgICBpZiBvcEV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICAgICAgICAgIG1hdGNoRXhwciA9IEZvbGxvd2VkQnkobGFzdEV4cHIgKyBvcEV4cHIgKyBsYXN0RXhwcikgKyBHcm91cCggbGFzdEV4cHIgKyBPbmVPck1vcmUoIG9wRXhwciArIGxhc3RFeHByICkgKQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIG1hdGNoRXhwciA9IEZvbGxvd2VkQnkobGFzdEV4cHIrbGFzdEV4cHIpICsgR3JvdXAoIGxhc3RFeHByICsgT25lT3JNb3JlKGxhc3RFeHByKSApDQogICAgICAgICAgICBlbGlmIGFyaXR5ID09IDM6DQogICAgICAgICAgICAgICAgbWF0Y2hFeHByID0gRm9sbG93ZWRCeShsYXN0RXhwciArIG9wRXhwcjEgKyBsYXN0RXhwciArIG9wRXhwcjIgKyBsYXN0RXhwcikgKyBcDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXAoIGxhc3RFeHByICsgb3BFeHByMSArIGxhc3RFeHByICsgb3BFeHByMiArIGxhc3RFeHByICkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigib3BlcmF0b3IgbXVzdCBiZSB1bmFyeSAoMSksIGJpbmFyeSAoMiksIG9yIHRlcm5hcnkgKDMpIikNCiAgICAgICAgZWxpZiByaWdodExlZnRBc3NvYyA9PSBvcEFzc29jLlJJR0hUOg0KICAgICAgICAgICAgaWYgYXJpdHkgPT0gMToNCiAgICAgICAgICAgICAgICAjIHRyeSB0byBhdm9pZCBMUiB3aXRoIHRoaXMgZXh0cmEgdGVzdA0KICAgICAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG9wRXhwciwgT3B0aW9uYWwpOg0KICAgICAgICAgICAgICAgICAgICBvcEV4cHIgPSBPcHRpb25hbChvcEV4cHIpDQogICAgICAgICAgICAgICAgbWF0Y2hFeHByID0gRm9sbG93ZWRCeShvcEV4cHIuZXhwciArIHRoaXNFeHByKSArIEdyb3VwKCBvcEV4cHIgKyB0aGlzRXhwciApDQogICAgICAgICAgICBlbGlmIGFyaXR5ID09IDI6DQogICAgICAgICAgICAgICAgaWYgb3BFeHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgICAgICAgICBtYXRjaEV4cHIgPSBGb2xsb3dlZEJ5KGxhc3RFeHByICsgb3BFeHByICsgdGhpc0V4cHIpICsgR3JvdXAoIGxhc3RFeHByICsgT25lT3JNb3JlKCBvcEV4cHIgKyB0aGlzRXhwciApICkNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICBtYXRjaEV4cHIgPSBGb2xsb3dlZEJ5KGxhc3RFeHByICsgdGhpc0V4cHIpICsgR3JvdXAoIGxhc3RFeHByICsgT25lT3JNb3JlKCB0aGlzRXhwciApICkNCiAgICAgICAgICAgIGVsaWYgYXJpdHkgPT0gMzoNCiAgICAgICAgICAgICAgICBtYXRjaEV4cHIgPSBGb2xsb3dlZEJ5KGxhc3RFeHByICsgb3BFeHByMSArIHRoaXNFeHByICsgb3BFeHByMiArIHRoaXNFeHByKSArIFwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cCggbGFzdEV4cHIgKyBvcEV4cHIxICsgdGhpc0V4cHIgKyBvcEV4cHIyICsgdGhpc0V4cHIgKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJvcGVyYXRvciBtdXN0IGJlIHVuYXJ5ICgxKSwgYmluYXJ5ICgyKSwgb3IgdGVybmFyeSAoMykiKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigib3BlcmF0b3IgbXVzdCBpbmRpY2F0ZSByaWdodCBvciBsZWZ0IGFzc29jaWF0aXZpdHkiKQ0KICAgICAgICBpZiBwYToNCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UocGEsICh0dXBsZSwgbGlzdCkpOg0KICAgICAgICAgICAgICAgIG1hdGNoRXhwci5zZXRQYXJzZUFjdGlvbigqcGEpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIG1hdGNoRXhwci5zZXRQYXJzZUFjdGlvbihwYSkNCiAgICAgICAgdGhpc0V4cHIgPDw9ICggbWF0Y2hFeHByLnNldE5hbWUodGVybU5hbWUpIHwgbGFzdEV4cHIgKQ0KICAgICAgICBsYXN0RXhwciA9IHRoaXNFeHByDQogICAgcmV0IDw8PSBsYXN0RXhwcg0KICAgIHJldHVybiByZXQNCg0Kb3BlcmF0b3JQcmVjZWRlbmNlID0gaW5maXhOb3RhdGlvbg0KIiIiKERlcHJlY2F0ZWQpIEZvcm1lciBuYW1lIG9mIEN7THtpbmZpeE5vdGF0aW9ufX0sIHdpbGwgYmUgZHJvcHBlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLiIiIg0KDQpkYmxRdW90ZWRTdHJpbmcgPSBDb21iaW5lKFJlZ2V4KHInIig/OlteIlxuXHJcXF18KD86IiIpfCg/OlxcKD86W154XXx4WzAtOWEtZkEtRl0rKSkpKicpKyciJykuc2V0TmFtZSgic3RyaW5nIGVuY2xvc2VkIGluIGRvdWJsZSBxdW90ZXMiKQ0Kc2dsUXVvdGVkU3RyaW5nID0gQ29tYmluZShSZWdleChyIicoPzpbXidcblxyXFxdfCg/OicnKXwoPzpcXCg/OlteeF18eFswLTlhLWZBLUZdKykpKSoiKSsiJyIpLnNldE5hbWUoInN0cmluZyBlbmNsb3NlZCBpbiBzaW5nbGUgcXVvdGVzIikNCnF1b3RlZFN0cmluZyA9IENvbWJpbmUoUmVnZXgociciKD86W14iXG5cclxcXXwoPzoiIil8KD86XFwoPzpbXnhdfHhbMC05YS1mQS1GXSspKSkqJykrJyInfA0KICAgICAgICAgICAgICAgICAgICAgICBSZWdleChyIicoPzpbXidcblxyXFxdfCg/OicnKXwoPzpcXCg/OlteeF18eFswLTlhLWZBLUZdKykpKSoiKSsiJyIpLnNldE5hbWUoInF1b3RlZFN0cmluZyB1c2luZyBzaW5nbGUgb3IgZG91YmxlIHF1b3RlcyIpDQp1bmljb2RlU3RyaW5nID0gQ29tYmluZShfTCgndScpICsgcXVvdGVkU3RyaW5nLmNvcHkoKSkuc2V0TmFtZSgidW5pY29kZSBzdHJpbmcgbGl0ZXJhbCIpDQoNCmRlZiBuZXN0ZWRFeHByKG9wZW5lcj0iKCIsIGNsb3Nlcj0iKSIsIGNvbnRlbnQ9Tm9uZSwgaWdub3JlRXhwcj1xdW90ZWRTdHJpbmcuY29weSgpKToNCiAgICAiIiINCiAgICBIZWxwZXIgbWV0aG9kIGZvciBkZWZpbmluZyBuZXN0ZWQgbGlzdHMgZW5jbG9zZWQgaW4gb3BlbmluZyBhbmQgY2xvc2luZw0KICAgIGRlbGltaXRlcnMgKCIoIiBhbmQgIikiIGFyZSB0aGUgZGVmYXVsdCkuDQoNCiAgICBQYXJhbWV0ZXJzOg0KICAgICAtIG9wZW5lciAtIG9wZW5pbmcgY2hhcmFjdGVyIGZvciBhIG5lc3RlZCBsaXN0IChkZWZhdWx0PUN7IigifSk7IGNhbiBhbHNvIGJlIGEgcHlwYXJzaW5nIGV4cHJlc3Npb24NCiAgICAgLSBjbG9zZXIgLSBjbG9zaW5nIGNoYXJhY3RlciBmb3IgYSBuZXN0ZWQgbGlzdCAoZGVmYXVsdD1DeyIpIn0pOyBjYW4gYWxzbyBiZSBhIHB5cGFyc2luZyBleHByZXNzaW9uDQogICAgIC0gY29udGVudCAtIGV4cHJlc3Npb24gZm9yIGl0ZW1zIHdpdGhpbiB0aGUgbmVzdGVkIGxpc3RzIChkZWZhdWx0PUN7Tm9uZX0pDQogICAgIC0gaWdub3JlRXhwciAtIGV4cHJlc3Npb24gZm9yIGlnbm9yaW5nIG9wZW5pbmcgYW5kIGNsb3NpbmcgZGVsaW1pdGVycyAoZGVmYXVsdD1De3F1b3RlZFN0cmluZ30pDQoNCiAgICBJZiBhbiBleHByZXNzaW9uIGlzIG5vdCBwcm92aWRlZCBmb3IgdGhlIGNvbnRlbnQgYXJndW1lbnQsIHRoZSBuZXN0ZWQNCiAgICBleHByZXNzaW9uIHdpbGwgY2FwdHVyZSBhbGwgd2hpdGVzcGFjZS1kZWxpbWl0ZWQgY29udGVudCBiZXR3ZWVuIGRlbGltaXRlcnMNCiAgICBhcyBhIGxpc3Qgb2Ygc2VwYXJhdGUgdmFsdWVzLg0KDQogICAgVXNlIHRoZSBDe2lnbm9yZUV4cHJ9IGFyZ3VtZW50IHRvIGRlZmluZSBleHByZXNzaW9ucyB0aGF0IG1heSBjb250YWluDQogICAgb3BlbmluZyBvciBjbG9zaW5nIGNoYXJhY3RlcnMgdGhhdCBzaG91bGQgbm90IGJlIHRyZWF0ZWQgYXMgb3BlbmluZw0KICAgIG9yIGNsb3NpbmcgY2hhcmFjdGVycyBmb3IgbmVzdGluZywgc3VjaCBhcyBxdW90ZWRTdHJpbmcgb3IgYSBjb21tZW50DQogICAgZXhwcmVzc2lvbi4gIFNwZWNpZnkgbXVsdGlwbGUgZXhwcmVzc2lvbnMgdXNpbmcgYW4gQ3tMe09yfX0gb3IgQ3tMe01hdGNoRmlyc3R9fS4NCiAgICBUaGUgZGVmYXVsdCBpcyBMe3F1b3RlZFN0cmluZ30sIGJ1dCBpZiBubyBleHByZXNzaW9ucyBhcmUgdG8gYmUgaWdub3JlZCwNCiAgICB0aGVuIHBhc3MgQ3tOb25lfSBmb3IgdGhpcyBhcmd1bWVudC4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBkYXRhX3R5cGUgPSBvbmVPZigidm9pZCBpbnQgc2hvcnQgbG9uZyBjaGFyIGZsb2F0IGRvdWJsZSIpDQogICAgICAgIGRlY2xfZGF0YV90eXBlID0gQ29tYmluZShkYXRhX3R5cGUgKyBPcHRpb25hbChXb3JkKCcqJykpKQ0KICAgICAgICBpZGVudCA9IFdvcmQoYWxwaGFzKydfJywgYWxwaGFudW1zKydfJykNCiAgICAgICAgbnVtYmVyID0gcHlwYXJzaW5nX2NvbW1vbi5udW1iZXINCiAgICAgICAgYXJnID0gR3JvdXAoZGVjbF9kYXRhX3R5cGUgKyBpZGVudCkNCiAgICAgICAgTFBBUixSUEFSID0gbWFwKFN1cHByZXNzLCAiKCkiKQ0KDQogICAgICAgIGNvZGVfYm9keSA9IG5lc3RlZEV4cHIoJ3snLCAnfScsIGlnbm9yZUV4cHI9KHF1b3RlZFN0cmluZyB8IGNTdHlsZUNvbW1lbnQpKQ0KDQogICAgICAgIGNfZnVuY3Rpb24gPSAoZGVjbF9kYXRhX3R5cGUoInR5cGUiKSANCiAgICAgICAgICAgICAgICAgICAgICArIGlkZW50KCJuYW1lIikNCiAgICAgICAgICAgICAgICAgICAgICArIExQQVIgKyBPcHRpb25hbChkZWxpbWl0ZWRMaXN0KGFyZyksIFtdKSgiYXJncyIpICsgUlBBUiANCiAgICAgICAgICAgICAgICAgICAgICArIGNvZGVfYm9keSgiYm9keSIpKQ0KICAgICAgICBjX2Z1bmN0aW9uLmlnbm9yZShjU3R5bGVDb21tZW50KQ0KICAgICAgICANCiAgICAgICAgc291cmNlX2NvZGUgPSAnJycNCiAgICAgICAgICAgIGludCBpc19vZGQoaW50IHgpIHsgDQogICAgICAgICAgICAgICAgcmV0dXJuICh4JTIpOyANCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgIGludCBkZWNfdG9faGV4KGNoYXIgaGNoYXIpIHsgDQogICAgICAgICAgICAgICAgaWYgKGhjaGFyID49ICcwJyAmJiBoY2hhciA8PSAnOScpIHsgDQogICAgICAgICAgICAgICAgICAgIHJldHVybiAob3JkKGhjaGFyKS1vcmQoJzAnKSk7IA0KICAgICAgICAgICAgICAgIH0gZWxzZSB7IA0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDEwK29yZChoY2hhciktb3JkKCdBJykpOw0KICAgICAgICAgICAgICAgIH0gDQogICAgICAgICAgICB9DQogICAgICAgICcnJw0KICAgICAgICBmb3IgZnVuYyBpbiBjX2Z1bmN0aW9uLnNlYXJjaFN0cmluZyhzb3VyY2VfY29kZSk6DQogICAgICAgICAgICBwcmludCgiJShuYW1lKXMgKCUodHlwZSlzKSBhcmdzOiAlKGFyZ3MpcyIgJSBmdW5jKQ0KDQogICAgcHJpbnRzOjoNCiAgICAgICAgaXNfb2RkIChpbnQpIGFyZ3M6IFtbJ2ludCcsICd4J11dDQogICAgICAgIGRlY190b19oZXggKGludCkgYXJnczogW1snY2hhcicsICdoY2hhciddXQ0KICAgICIiIg0KICAgIGlmIG9wZW5lciA9PSBjbG9zZXI6DQogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm9wZW5pbmcgYW5kIGNsb3Npbmcgc3RyaW5ncyBjYW5ub3QgYmUgdGhlIHNhbWUiKQ0KICAgIGlmIGNvbnRlbnQgaXMgTm9uZToNCiAgICAgICAgaWYgaXNpbnN0YW5jZShvcGVuZXIsYmFzZXN0cmluZykgYW5kIGlzaW5zdGFuY2UoY2xvc2VyLGJhc2VzdHJpbmcpOg0KICAgICAgICAgICAgaWYgbGVuKG9wZW5lcikgPT0gMSBhbmQgbGVuKGNsb3Nlcik9PTE6DQogICAgICAgICAgICAgICAgaWYgaWdub3JlRXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IChDb21iaW5lKE9uZU9yTW9yZSh+aWdub3JlRXhwciArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyc05vdEluKG9wZW5lcitjbG9zZXIrUGFyc2VyRWxlbWVudC5ERUZBVUxUX1dISVRFX0NIQVJTLGV4YWN0PTEpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0OnRbMF0uc3RyaXAoKSkpDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IChlbXB0eS5jb3B5KCkrQ2hhcnNOb3RJbihvcGVuZXIrY2xvc2VyK1BhcnNlckVsZW1lbnQuREVGQVVMVF9XSElURV9DSEFSUw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0OnRbMF0uc3RyaXAoKSkpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIGlmIGlnbm9yZUV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSAoQ29tYmluZShPbmVPck1vcmUofmlnbm9yZUV4cHIgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5MaXRlcmFsKG9wZW5lcikgKyB+TGl0ZXJhbChjbG9zZXIpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJzTm90SW4oUGFyc2VyRWxlbWVudC5ERUZBVUxUX1dISVRFX0NIQVJTLGV4YWN0PTEpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0OnRbMF0uc3RyaXAoKSkpDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IChDb21iaW5lKE9uZU9yTW9yZSh+TGl0ZXJhbChvcGVuZXIpICsgfkxpdGVyYWwoY2xvc2VyKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyc05vdEluKFBhcnNlckVsZW1lbnQuREVGQVVMVF9XSElURV9DSEFSUyxleGFjdD0xKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdDp0WzBdLnN0cmlwKCkpKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigib3BlbmluZyBhbmQgY2xvc2luZyBhcmd1bWVudHMgbXVzdCBiZSBzdHJpbmdzIGlmIG5vIGNvbnRlbnQgZXhwcmVzc2lvbiBpcyBnaXZlbiIpDQogICAgcmV0ID0gRm9yd2FyZCgpDQogICAgaWYgaWdub3JlRXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgcmV0IDw8PSBHcm91cCggU3VwcHJlc3Mob3BlbmVyKSArIFplcm9Pck1vcmUoIGlnbm9yZUV4cHIgfCByZXQgfCBjb250ZW50ICkgKyBTdXBwcmVzcyhjbG9zZXIpICkNCiAgICBlbHNlOg0KICAgICAgICByZXQgPDw9IEdyb3VwKCBTdXBwcmVzcyhvcGVuZXIpICsgWmVyb09yTW9yZSggcmV0IHwgY29udGVudCApICArIFN1cHByZXNzKGNsb3NlcikgKQ0KICAgIHJldC5zZXROYW1lKCduZXN0ZWQgJXMlcyBleHByZXNzaW9uJyAlIChvcGVuZXIsY2xvc2VyKSkNCiAgICByZXR1cm4gcmV0DQoNCmRlZiBpbmRlbnRlZEJsb2NrKGJsb2NrU3RhdGVtZW50RXhwciwgaW5kZW50U3RhY2ssIGluZGVudD1UcnVlKToNCiAgICAiIiINCiAgICBIZWxwZXIgbWV0aG9kIGZvciBkZWZpbmluZyBzcGFjZS1kZWxpbWl0ZWQgaW5kZW50YXRpb24gYmxvY2tzLCBzdWNoIGFzDQogICAgdGhvc2UgdXNlZCB0byBkZWZpbmUgYmxvY2sgc3RhdGVtZW50cyBpbiBQeXRob24gc291cmNlIGNvZGUuDQoNCiAgICBQYXJhbWV0ZXJzOg0KICAgICAtIGJsb2NrU3RhdGVtZW50RXhwciAtIGV4cHJlc3Npb24gZGVmaW5pbmcgc3ludGF4IG9mIHN0YXRlbWVudCB0aGF0DQogICAgICAgICAgICBpcyByZXBlYXRlZCB3aXRoaW4gdGhlIGluZGVudGVkIGJsb2NrDQogICAgIC0gaW5kZW50U3RhY2sgLSBsaXN0IGNyZWF0ZWQgYnkgY2FsbGVyIHRvIG1hbmFnZSBpbmRlbnRhdGlvbiBzdGFjaw0KICAgICAgICAgICAgKG11bHRpcGxlIHN0YXRlbWVudFdpdGhJbmRlbnRlZEJsb2NrIGV4cHJlc3Npb25zIHdpdGhpbiBhIHNpbmdsZSBncmFtbWFyDQogICAgICAgICAgICBzaG91bGQgc2hhcmUgYSBjb21tb24gaW5kZW50U3RhY2spDQogICAgIC0gaW5kZW50IC0gYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgYmxvY2sgbXVzdCBiZSBpbmRlbnRlZCBiZXlvbmQgdGhlDQogICAgICAgICAgICB0aGUgY3VycmVudCBsZXZlbDsgc2V0IHRvIEZhbHNlIGZvciBibG9jayBvZiBsZWZ0LW1vc3Qgc3RhdGVtZW50cw0KICAgICAgICAgICAgKGRlZmF1bHQ9Q3tUcnVlfSkNCg0KICAgIEEgdmFsaWQgYmxvY2sgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBDe2Jsb2NrU3RhdGVtZW50fS4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBkYXRhID0gJycnDQogICAgICAgIGRlZiBBKHopOg0KICAgICAgICAgIEExDQogICAgICAgICAgQiA9IDEwMA0KICAgICAgICAgIEcgPSBBMg0KICAgICAgICAgIEEyDQogICAgICAgICAgQTMNCiAgICAgICAgQg0KICAgICAgICBkZWYgQkIoYSxiLGMpOg0KICAgICAgICAgIEJCMQ0KICAgICAgICAgIGRlZiBCQkEoKToNCiAgICAgICAgICAgIGJiYTENCiAgICAgICAgICAgIGJiYTINCiAgICAgICAgICAgIGJiYTMNCiAgICAgICAgQw0KICAgICAgICBEDQogICAgICAgIGRlZiBzcGFtKHgseSk6DQogICAgICAgICAgICAgZGVmIGVnZ3Moeik6DQogICAgICAgICAgICAgICAgIHBhc3MNCiAgICAgICAgJycnDQoNCg0KICAgICAgICBpbmRlbnRTdGFjayA9IFsxXQ0KICAgICAgICBzdG10ID0gRm9yd2FyZCgpDQoNCiAgICAgICAgaWRlbnRpZmllciA9IFdvcmQoYWxwaGFzLCBhbHBoYW51bXMpDQogICAgICAgIGZ1bmNEZWNsID0gKCJkZWYiICsgaWRlbnRpZmllciArIEdyb3VwKCAiKCIgKyBPcHRpb25hbCggZGVsaW1pdGVkTGlzdChpZGVudGlmaWVyKSApICsgIikiICkgKyAiOiIpDQogICAgICAgIGZ1bmNfYm9keSA9IGluZGVudGVkQmxvY2soc3RtdCwgaW5kZW50U3RhY2spDQogICAgICAgIGZ1bmNEZWYgPSBHcm91cCggZnVuY0RlY2wgKyBmdW5jX2JvZHkgKQ0KDQogICAgICAgIHJ2YWx1ZSA9IEZvcndhcmQoKQ0KICAgICAgICBmdW5jQ2FsbCA9IEdyb3VwKGlkZW50aWZpZXIgKyAiKCIgKyBPcHRpb25hbChkZWxpbWl0ZWRMaXN0KHJ2YWx1ZSkpICsgIikiKQ0KICAgICAgICBydmFsdWUgPDwgKGZ1bmNDYWxsIHwgaWRlbnRpZmllciB8IFdvcmQobnVtcykpDQogICAgICAgIGFzc2lnbm1lbnQgPSBHcm91cChpZGVudGlmaWVyICsgIj0iICsgcnZhbHVlKQ0KICAgICAgICBzdG10IDw8ICggZnVuY0RlZiB8IGFzc2lnbm1lbnQgfCBpZGVudGlmaWVyICkNCg0KICAgICAgICBtb2R1bGVfYm9keSA9IE9uZU9yTW9yZShzdG10KQ0KDQogICAgICAgIHBhcnNlVHJlZSA9IG1vZHVsZV9ib2R5LnBhcnNlU3RyaW5nKGRhdGEpDQogICAgICAgIHBhcnNlVHJlZS5wcHJpbnQoKQ0KICAgIHByaW50czo6DQogICAgICAgIFtbJ2RlZicsDQogICAgICAgICAgJ0EnLA0KICAgICAgICAgIFsnKCcsICd6JywgJyknXSwNCiAgICAgICAgICAnOicsDQogICAgICAgICAgW1snQTEnXSwgW1snQicsICc9JywgJzEwMCddXSwgW1snRycsICc9JywgJ0EyJ11dLCBbJ0EyJ10sIFsnQTMnXV1dLA0KICAgICAgICAgJ0InLA0KICAgICAgICAgWydkZWYnLA0KICAgICAgICAgICdCQicsDQogICAgICAgICAgWycoJywgJ2EnLCAnYicsICdjJywgJyknXSwNCiAgICAgICAgICAnOicsDQogICAgICAgICAgW1snQkIxJ10sIFtbJ2RlZicsICdCQkEnLCBbJygnLCAnKSddLCAnOicsIFtbJ2JiYTEnXSwgWydiYmEyJ10sIFsnYmJhMyddXV1dXV0sDQogICAgICAgICAnQycsDQogICAgICAgICAnRCcsDQogICAgICAgICBbJ2RlZicsDQogICAgICAgICAgJ3NwYW0nLA0KICAgICAgICAgIFsnKCcsICd4JywgJ3knLCAnKSddLA0KICAgICAgICAgICc6JywNCiAgICAgICAgICBbW1snZGVmJywgJ2VnZ3MnLCBbJygnLCAneicsICcpJ10sICc6JywgW1sncGFzcyddXV1dXV1dIA0KICAgICIiIg0KICAgIGRlZiBjaGVja1BlZXJJbmRlbnQocyxsLHQpOg0KICAgICAgICBpZiBsID49IGxlbihzKTogcmV0dXJuDQogICAgICAgIGN1ckNvbCA9IGNvbChsLHMpDQogICAgICAgIGlmIGN1ckNvbCAhPSBpbmRlbnRTdGFja1stMV06DQogICAgICAgICAgICBpZiBjdXJDb2wgPiBpbmRlbnRTdGFja1stMV06DQogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VGYXRhbEV4Y2VwdGlvbihzLGwsImlsbGVnYWwgbmVzdGluZyIpDQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihzLGwsIm5vdCBhIHBlZXIgZW50cnkiKQ0KDQogICAgZGVmIGNoZWNrU3ViSW5kZW50KHMsbCx0KToNCiAgICAgICAgY3VyQ29sID0gY29sKGwscykNCiAgICAgICAgaWYgY3VyQ29sID4gaW5kZW50U3RhY2tbLTFdOg0KICAgICAgICAgICAgaW5kZW50U3RhY2suYXBwZW5kKCBjdXJDb2wgKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24ocyxsLCJub3QgYSBzdWJlbnRyeSIpDQoNCiAgICBkZWYgY2hlY2tVbmluZGVudChzLGwsdCk6DQogICAgICAgIGlmIGwgPj0gbGVuKHMpOiByZXR1cm4NCiAgICAgICAgY3VyQ29sID0gY29sKGwscykNCiAgICAgICAgaWYgbm90KGluZGVudFN0YWNrIGFuZCBjdXJDb2wgPCBpbmRlbnRTdGFja1stMV0gYW5kIGN1ckNvbCA8PSBpbmRlbnRTdGFja1stMl0pOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24ocyxsLCJub3QgYW4gdW5pbmRlbnQiKQ0KICAgICAgICBpbmRlbnRTdGFjay5wb3AoKQ0KDQogICAgTkwgPSBPbmVPck1vcmUoTGluZUVuZCgpLnNldFdoaXRlc3BhY2VDaGFycygiXHQgIikuc3VwcHJlc3MoKSkNCiAgICBJTkRFTlQgPSAoRW1wdHkoKSArIEVtcHR5KCkuc2V0UGFyc2VBY3Rpb24oY2hlY2tTdWJJbmRlbnQpKS5zZXROYW1lKCdJTkRFTlQnKQ0KICAgIFBFRVIgICA9IEVtcHR5KCkuc2V0UGFyc2VBY3Rpb24oY2hlY2tQZWVySW5kZW50KS5zZXROYW1lKCcnKQ0KICAgIFVOREVOVCA9IEVtcHR5KCkuc2V0UGFyc2VBY3Rpb24oY2hlY2tVbmluZGVudCkuc2V0TmFtZSgnVU5JTkRFTlQnKQ0KICAgIGlmIGluZGVudDoNCiAgICAgICAgc21FeHByID0gR3JvdXAoIE9wdGlvbmFsKE5MKSArDQogICAgICAgICAgICAjfiBGb2xsb3dlZEJ5KGJsb2NrU3RhdGVtZW50RXhwcikgKw0KICAgICAgICAgICAgSU5ERU5UICsgKE9uZU9yTW9yZSggUEVFUiArIEdyb3VwKGJsb2NrU3RhdGVtZW50RXhwcikgKyBPcHRpb25hbChOTCkgKSkgKyBVTkRFTlQpDQogICAgZWxzZToNCiAgICAgICAgc21FeHByID0gR3JvdXAoIE9wdGlvbmFsKE5MKSArDQogICAgICAgICAgICAoT25lT3JNb3JlKCBQRUVSICsgR3JvdXAoYmxvY2tTdGF0ZW1lbnRFeHByKSArIE9wdGlvbmFsKE5MKSApKSApDQogICAgYmxvY2tTdGF0ZW1lbnRFeHByLmlnbm9yZShfYnNsYXNoICsgTGluZUVuZCgpKQ0KICAgIHJldHVybiBzbUV4cHIuc2V0TmFtZSgnaW5kZW50ZWQgYmxvY2snKQ0KDQphbHBoYXM4Yml0ID0gc3JhbmdlKHIiW1wweGMwLVwweGQ2XDB4ZDgtXDB4ZjZcMHhmOC1cMHhmZl0iKQ0KcHVuYzhiaXQgPSBzcmFuZ2UociJbXDB4YTEtXDB4YmZcMHhkN1wweGY3XSIpDQoNCmFueU9wZW5UYWcsYW55Q2xvc2VUYWcgPSBtYWtlSFRNTFRhZ3MoV29yZChhbHBoYXMsYWxwaGFudW1zKyJfOiIpLnNldE5hbWUoJ2FueSB0YWcnKSkNCl9odG1sRW50aXR5TWFwID0gZGljdCh6aXAoImd0IGx0IGFtcCBuYnNwIHF1b3QgYXBvcyIuc3BsaXQoKSwnPjwmICJcJycpKQ0KY29tbW9uSFRNTEVudGl0eSA9IFJlZ2V4KCcmKD9QPGVudGl0eT4nICsgJ3wnLmpvaW4oX2h0bWxFbnRpdHlNYXAua2V5cygpKSArIik7Iikuc2V0TmFtZSgiY29tbW9uIEhUTUwgZW50aXR5IikNCmRlZiByZXBsYWNlSFRNTEVudGl0eSh0KToNCiAgICAiIiJIZWxwZXIgcGFyc2VyIGFjdGlvbiB0byByZXBsYWNlIGNvbW1vbiBIVE1MIGVudGl0aWVzIHdpdGggdGhlaXIgc3BlY2lhbCBjaGFyYWN0ZXJzIiIiDQogICAgcmV0dXJuIF9odG1sRW50aXR5TWFwLmdldCh0LmVudGl0eSkNCg0KIyBpdCdzIGVhc3kgdG8gZ2V0IHRoZXNlIGNvbW1lbnQgc3RydWN0dXJlcyB3cm9uZyAtIHRoZXkncmUgdmVyeSBjb21tb24sIHNvIG1heSBhcyB3ZWxsIG1ha2UgdGhlbSBhdmFpbGFibGUNCmNTdHlsZUNvbW1lbnQgPSBDb21iaW5lKFJlZ2V4KHIiL1wqKD86W14qXXxcKig/IS8pKSoiKSArICcqLycpLnNldE5hbWUoIkMgc3R5bGUgY29tbWVudCIpDQoiQ29tbWVudCBvZiB0aGUgZm9ybSBDey8qIC4uLiAqL30iDQoNCmh0bWxDb21tZW50ID0gUmVnZXgociI8IS0tW1xzXFNdKj8tLT4iKS5zZXROYW1lKCJIVE1MIGNvbW1lbnQiKQ0KIkNvbW1lbnQgb2YgdGhlIGZvcm0gQ3s8IS0tIC4uLiAtLT59Ig0KDQpyZXN0T2ZMaW5lID0gUmVnZXgociIuKiIpLmxlYXZlV2hpdGVzcGFjZSgpLnNldE5hbWUoInJlc3Qgb2YgbGluZSIpDQpkYmxTbGFzaENvbW1lbnQgPSBSZWdleChyIi8vKD86XFxcbnxbXlxuXSkqIikuc2V0TmFtZSgiLy8gY29tbWVudCIpDQoiQ29tbWVudCBvZiB0aGUgZm9ybSBDey8vIC4uLiAodG8gZW5kIG9mIGxpbmUpfSINCg0KY3BwU3R5bGVDb21tZW50ID0gQ29tYmluZShSZWdleChyIi9cKig/OlteKl18XCooPyEvKSkqIikgKyAnKi8nfCBkYmxTbGFzaENvbW1lbnQpLnNldE5hbWUoIkMrKyBzdHlsZSBjb21tZW50IikNCiJDb21tZW50IG9mIGVpdGhlciBmb3JtIEN7THtjU3R5bGVDb21tZW50fX0gb3IgQ3tMe2RibFNsYXNoQ29tbWVudH19Ig0KDQpqYXZhU3R5bGVDb21tZW50ID0gY3BwU3R5bGVDb21tZW50DQoiU2FtZSBhcyBDe0x7Y3BwU3R5bGVDb21tZW50fX0iDQoNCnB5dGhvblN0eWxlQ29tbWVudCA9IFJlZ2V4KHIiIy4qIikuc2V0TmFtZSgiUHl0aG9uIHN0eWxlIGNvbW1lbnQiKQ0KIkNvbW1lbnQgb2YgdGhlIGZvcm0gQ3sjIC4uLiAodG8gZW5kIG9mIGxpbmUpfSINCg0KX2NvbW1hc2VwaXRlbSA9IENvbWJpbmUoT25lT3JNb3JlKFdvcmQocHJpbnRhYmxlcywgZXhjbHVkZUNoYXJzPScsJykgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsKCBXb3JkKCIgXHQiKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5MaXRlcmFsKCIsIikgKyB+TGluZUVuZCgpICkgKSApLnN0cmVhbWxpbmUoKS5zZXROYW1lKCJjb21tYUl0ZW0iKQ0KY29tbWFTZXBhcmF0ZWRMaXN0ID0gZGVsaW1pdGVkTGlzdCggT3B0aW9uYWwoIHF1b3RlZFN0cmluZy5jb3B5KCkgfCBfY29tbWFzZXBpdGVtLCBkZWZhdWx0PSIiKSApLnNldE5hbWUoImNvbW1hU2VwYXJhdGVkTGlzdCIpDQoiIiIoRGVwcmVjYXRlZCkgUHJlZGVmaW5lZCBleHByZXNzaW9uIG9mIDEgb3IgbW9yZSBwcmludGFibGUgd29yZHMgb3IgcXVvdGVkIHN0cmluZ3MsIHNlcGFyYXRlZCBieSBjb21tYXMuDQogICBUaGlzIGV4cHJlc3Npb24gaXMgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBMe3B5cGFyc2luZ19jb21tb24uY29tbWFfc2VwYXJhdGVkX2xpc3R9LiIiIg0KDQojIHNvbWUgb3RoZXIgdXNlZnVsIGV4cHJlc3Npb25zIC0gdXNpbmcgbG93ZXItY2FzZSBjbGFzcyBuYW1lIHNpbmNlIHdlIGFyZSByZWFsbHkgdXNpbmcgdGhpcyBhcyBhIG5hbWVzcGFjZQ0KY2xhc3MgcHlwYXJzaW5nX2NvbW1vbjoNCiAgICAiIiINCiAgICBIZXJlIGFyZSBzb21lIGNvbW1vbiBsb3ctbGV2ZWwgZXhwcmVzc2lvbnMgdGhhdCBtYXkgYmUgdXNlZnVsIGluIGp1bXAtc3RhcnRpbmcgcGFyc2VyIGRldmVsb3BtZW50Og0KICAgICAtIG51bWVyaWMgZm9ybXMgKEx7aW50ZWdlcnM8aW50ZWdlcj59LCBMe3JlYWxzPHJlYWw+fSwgTHtzY2llbnRpZmljIG5vdGF0aW9uPHNjaV9yZWFsPn0pDQogICAgIC0gY29tbW9uIEx7cHJvZ3JhbW1pbmcgaWRlbnRpZmllcnM8aWRlbnRpZmllcj59DQogICAgIC0gbmV0d29yayBhZGRyZXNzZXMgKEx7TUFDPG1hY19hZGRyZXNzPn0sIEx7SVB2NDxpcHY0X2FkZHJlc3M+fSwgTHtJUHY2PGlwdjZfYWRkcmVzcz59KQ0KICAgICAtIElTTzg2MDEgTHtkYXRlczxpc284NjAxX2RhdGU+fSBhbmQgTHtkYXRldGltZTxpc284NjAxX2RhdGV0aW1lPn0NCiAgICAgLSBMe1VVSUQ8dXVpZD59DQogICAgIC0gTHtjb21tYS1zZXBhcmF0ZWQgbGlzdDxjb21tYV9zZXBhcmF0ZWRfbGlzdD59DQogICAgUGFyc2UgYWN0aW9uczoNCiAgICAgLSBDe0x7Y29udmVydFRvSW50ZWdlcn19DQogICAgIC0gQ3tMe2NvbnZlcnRUb0Zsb2F0fX0NCiAgICAgLSBDe0x7Y29udmVydFRvRGF0ZX19DQogICAgIC0gQ3tMe2NvbnZlcnRUb0RhdGV0aW1lfX0NCiAgICAgLSBDe0x7c3RyaXBIVE1MVGFnc319DQogICAgIC0gQ3tMe3VwY2FzZVRva2Vuc319DQogICAgIC0gQ3tMe2Rvd25jYXNlVG9rZW5zfX0NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBweXBhcnNpbmdfY29tbW9uLm51bWJlci5ydW5UZXN0cygnJycNCiAgICAgICAgICAgICMgYW55IGludCBvciByZWFsIG51bWJlciwgcmV0dXJuZWQgYXMgdGhlIGFwcHJvcHJpYXRlIHR5cGUNCiAgICAgICAgICAgIDEwMA0KICAgICAgICAgICAgLTEwMA0KICAgICAgICAgICAgKzEwMA0KICAgICAgICAgICAgMy4xNDE1OQ0KICAgICAgICAgICAgNi4wMmUyMw0KICAgICAgICAgICAgMWUtMTINCiAgICAgICAgICAgICcnJykNCg0KICAgICAgICBweXBhcnNpbmdfY29tbW9uLmZudW1iZXIucnVuVGVzdHMoJycnDQogICAgICAgICAgICAjIGFueSBpbnQgb3IgcmVhbCBudW1iZXIsIHJldHVybmVkIGFzIGZsb2F0DQogICAgICAgICAgICAxMDANCiAgICAgICAgICAgIC0xMDANCiAgICAgICAgICAgICsxMDANCiAgICAgICAgICAgIDMuMTQxNTkNCiAgICAgICAgICAgIDYuMDJlMjMNCiAgICAgICAgICAgIDFlLTEyDQogICAgICAgICAgICAnJycpDQoNCiAgICAgICAgcHlwYXJzaW5nX2NvbW1vbi5oZXhfaW50ZWdlci5ydW5UZXN0cygnJycNCiAgICAgICAgICAgICMgaGV4IG51bWJlcnMNCiAgICAgICAgICAgIDEwMA0KICAgICAgICAgICAgRkYNCiAgICAgICAgICAgICcnJykNCg0KICAgICAgICBweXBhcnNpbmdfY29tbW9uLmZyYWN0aW9uLnJ1blRlc3RzKCcnJw0KICAgICAgICAgICAgIyBmcmFjdGlvbnMNCiAgICAgICAgICAgIDEvMg0KICAgICAgICAgICAgLTMvNA0KICAgICAgICAgICAgJycnKQ0KDQogICAgICAgIHB5cGFyc2luZ19jb21tb24ubWl4ZWRfaW50ZWdlci5ydW5UZXN0cygnJycNCiAgICAgICAgICAgICMgbWl4ZWQgZnJhY3Rpb25zDQogICAgICAgICAgICAxDQogICAgICAgICAgICAxLzINCiAgICAgICAgICAgIC0zLzQNCiAgICAgICAgICAgIDEtMy80DQogICAgICAgICAgICAnJycpDQoNCiAgICAgICAgaW1wb3J0IHV1aWQNCiAgICAgICAgcHlwYXJzaW5nX2NvbW1vbi51dWlkLnNldFBhcnNlQWN0aW9uKHRva2VuTWFwKHV1aWQuVVVJRCkpDQogICAgICAgIHB5cGFyc2luZ19jb21tb24udXVpZC5ydW5UZXN0cygnJycNCiAgICAgICAgICAgICMgdXVpZA0KICAgICAgICAgICAgMTIzNDU2NzgtMTIzNC01Njc4LTEyMzQtNTY3ODEyMzQ1Njc4DQogICAgICAgICAgICAnJycpDQogICAgcHJpbnRzOjoNCiAgICAgICAgIyBhbnkgaW50IG9yIHJlYWwgbnVtYmVyLCByZXR1cm5lZCBhcyB0aGUgYXBwcm9wcmlhdGUgdHlwZQ0KICAgICAgICAxMDANCiAgICAgICAgWzEwMF0NCg0KICAgICAgICAtMTAwDQogICAgICAgIFstMTAwXQ0KDQogICAgICAgICsxMDANCiAgICAgICAgWzEwMF0NCg0KICAgICAgICAzLjE0MTU5DQogICAgICAgIFszLjE0MTU5XQ0KDQogICAgICAgIDYuMDJlMjMNCiAgICAgICAgWzYuMDJlKzIzXQ0KDQogICAgICAgIDFlLTEyDQogICAgICAgIFsxZS0xMl0NCg0KICAgICAgICAjIGFueSBpbnQgb3IgcmVhbCBudW1iZXIsIHJldHVybmVkIGFzIGZsb2F0DQogICAgICAgIDEwMA0KICAgICAgICBbMTAwLjBdDQoNCiAgICAgICAgLTEwMA0KICAgICAgICBbLTEwMC4wXQ0KDQogICAgICAgICsxMDANCiAgICAgICAgWzEwMC4wXQ0KDQogICAgICAgIDMuMTQxNTkNCiAgICAgICAgWzMuMTQxNTldDQoNCiAgICAgICAgNi4wMmUyMw0KICAgICAgICBbNi4wMmUrMjNdDQoNCiAgICAgICAgMWUtMTINCiAgICAgICAgWzFlLTEyXQ0KDQogICAgICAgICMgaGV4IG51bWJlcnMNCiAgICAgICAgMTAwDQogICAgICAgIFsyNTZdDQoNCiAgICAgICAgRkYNCiAgICAgICAgWzI1NV0NCg0KICAgICAgICAjIGZyYWN0aW9ucw0KICAgICAgICAxLzINCiAgICAgICAgWzAuNV0NCg0KICAgICAgICAtMy80DQogICAgICAgIFstMC43NV0NCg0KICAgICAgICAjIG1peGVkIGZyYWN0aW9ucw0KICAgICAgICAxDQogICAgICAgIFsxXQ0KDQogICAgICAgIDEvMg0KICAgICAgICBbMC41XQ0KDQogICAgICAgIC0zLzQNCiAgICAgICAgWy0wLjc1XQ0KDQogICAgICAgIDEtMy80DQogICAgICAgIFsxLjc1XQ0KDQogICAgICAgICMgdXVpZA0KICAgICAgICAxMjM0NTY3OC0xMjM0LTU2NzgtMTIzNC01Njc4MTIzNDU2NzgNCiAgICAgICAgW1VVSUQoJzEyMzQ1Njc4LTEyMzQtNTY3OC0xMjM0LTU2NzgxMjM0NTY3OCcpXQ0KICAgICIiIg0KDQogICAgY29udmVydFRvSW50ZWdlciA9IHRva2VuTWFwKGludCkNCiAgICAiIiINCiAgICBQYXJzZSBhY3Rpb24gZm9yIGNvbnZlcnRpbmcgcGFyc2VkIGludGVnZXJzIHRvIFB5dGhvbiBpbnQNCiAgICAiIiINCg0KICAgIGNvbnZlcnRUb0Zsb2F0ID0gdG9rZW5NYXAoZmxvYXQpDQogICAgIiIiDQogICAgUGFyc2UgYWN0aW9uIGZvciBjb252ZXJ0aW5nIHBhcnNlZCBudW1iZXJzIHRvIFB5dGhvbiBmbG9hdA0KICAgICIiIg0KDQogICAgaW50ZWdlciA9IFdvcmQobnVtcykuc2V0TmFtZSgiaW50ZWdlciIpLnNldFBhcnNlQWN0aW9uKGNvbnZlcnRUb0ludGVnZXIpDQogICAgIiIiZXhwcmVzc2lvbiB0aGF0IHBhcnNlcyBhbiB1bnNpZ25lZCBpbnRlZ2VyLCByZXR1cm5zIGFuIGludCIiIg0KDQogICAgaGV4X2ludGVnZXIgPSBXb3JkKGhleG51bXMpLnNldE5hbWUoImhleCBpbnRlZ2VyIikuc2V0UGFyc2VBY3Rpb24odG9rZW5NYXAoaW50LDE2KSkNCiAgICAiIiJleHByZXNzaW9uIHRoYXQgcGFyc2VzIGEgaGV4YWRlY2ltYWwgaW50ZWdlciwgcmV0dXJucyBhbiBpbnQiIiINCg0KICAgIHNpZ25lZF9pbnRlZ2VyID0gUmVnZXgocidbKy1dP1xkKycpLnNldE5hbWUoInNpZ25lZCBpbnRlZ2VyIikuc2V0UGFyc2VBY3Rpb24oY29udmVydFRvSW50ZWdlcikNCiAgICAiIiJleHByZXNzaW9uIHRoYXQgcGFyc2VzIGFuIGludGVnZXIgd2l0aCBvcHRpb25hbCBsZWFkaW5nIHNpZ24sIHJldHVybnMgYW4gaW50IiIiDQoNCiAgICBmcmFjdGlvbiA9IChzaWduZWRfaW50ZWdlcigpLnNldFBhcnNlQWN0aW9uKGNvbnZlcnRUb0Zsb2F0KSArICcvJyArIHNpZ25lZF9pbnRlZ2VyKCkuc2V0UGFyc2VBY3Rpb24oY29udmVydFRvRmxvYXQpKS5zZXROYW1lKCJmcmFjdGlvbiIpDQogICAgIiIiZnJhY3Rpb25hbCBleHByZXNzaW9uIG9mIGFuIGludGVnZXIgZGl2aWRlZCBieSBhbiBpbnRlZ2VyLCByZXR1cm5zIGEgZmxvYXQiIiINCiAgICBmcmFjdGlvbi5hZGRQYXJzZUFjdGlvbihsYW1iZGEgdDogdFswXS90Wy0xXSkNCg0KICAgIG1peGVkX2ludGVnZXIgPSAoZnJhY3Rpb24gfCBzaWduZWRfaW50ZWdlciArIE9wdGlvbmFsKE9wdGlvbmFsKCctJykuc3VwcHJlc3MoKSArIGZyYWN0aW9uKSkuc2V0TmFtZSgiZnJhY3Rpb24gb3IgbWl4ZWQgaW50ZWdlci1mcmFjdGlvbiIpDQogICAgIiIibWl4ZWQgaW50ZWdlciBvZiB0aGUgZm9ybSAnaW50ZWdlciAtIGZyYWN0aW9uJywgd2l0aCBvcHRpb25hbCBsZWFkaW5nIGludGVnZXIsIHJldHVybnMgZmxvYXQiIiINCiAgICBtaXhlZF9pbnRlZ2VyLmFkZFBhcnNlQWN0aW9uKHN1bSkNCg0KICAgIHJlYWwgPSBSZWdleChyJ1srLV0/XGQrXC5cZConKS5zZXROYW1lKCJyZWFsIG51bWJlciIpLnNldFBhcnNlQWN0aW9uKGNvbnZlcnRUb0Zsb2F0KQ0KICAgICIiImV4cHJlc3Npb24gdGhhdCBwYXJzZXMgYSBmbG9hdGluZyBwb2ludCBudW1iZXIgYW5kIHJldHVybnMgYSBmbG9hdCIiIg0KDQogICAgc2NpX3JlYWwgPSBSZWdleChyJ1srLV0/XGQrKFtlRV1bKy1dP1xkK3xcLlxkKihbZUVdWystXT9cZCspPyknKS5zZXROYW1lKCJyZWFsIG51bWJlciB3aXRoIHNjaWVudGlmaWMgbm90YXRpb24iKS5zZXRQYXJzZUFjdGlvbihjb252ZXJ0VG9GbG9hdCkNCiAgICAiIiJleHByZXNzaW9uIHRoYXQgcGFyc2VzIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIHdpdGggb3B0aW9uYWwgc2NpZW50aWZpYyBub3RhdGlvbiBhbmQgcmV0dXJucyBhIGZsb2F0IiIiDQoNCiAgICAjIHN0cmVhbWxpbmluZyB0aGlzIGV4cHJlc3Npb24gbWFrZXMgdGhlIGRvY3MgbmljZXItbG9va2luZw0KICAgIG51bWJlciA9IChzY2lfcmVhbCB8IHJlYWwgfCBzaWduZWRfaW50ZWdlcikuc3RyZWFtbGluZSgpDQogICAgIiIiYW55IG51bWVyaWMgZXhwcmVzc2lvbiwgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBQeXRob24gdHlwZSIiIg0KDQogICAgZm51bWJlciA9IFJlZ2V4KHInWystXT9cZCtcLj9cZCooW2VFXVsrLV0/XGQrKT8nKS5zZXROYW1lKCJmbnVtYmVyIikuc2V0UGFyc2VBY3Rpb24oY29udmVydFRvRmxvYXQpDQogICAgIiIiYW55IGludCBvciByZWFsIG51bWJlciwgcmV0dXJuZWQgYXMgZmxvYXQiIiINCiAgICANCiAgICBpZGVudGlmaWVyID0gV29yZChhbHBoYXMrJ18nLCBhbHBoYW51bXMrJ18nKS5zZXROYW1lKCJpZGVudGlmaWVyIikNCiAgICAiIiJ0eXBpY2FsIGNvZGUgaWRlbnRpZmllciAobGVhZGluZyBhbHBoYSBvciAnXycsIGZvbGxvd2VkIGJ5IDAgb3IgbW9yZSBhbHBoYXMsIG51bXMsIG9yICdfJykiIiINCiAgICANCiAgICBpcHY0X2FkZHJlc3MgPSBSZWdleChyJygyNVswLTVdfDJbMC00XVswLTldfDE/WzAtOV17MSwyfSkoXC4oMjVbMC01XXwyWzAtNF1bMC05XXwxP1swLTldezEsMn0pKXszfScpLnNldE5hbWUoIklQdjQgYWRkcmVzcyIpDQogICAgIklQdjQgYWRkcmVzcyAoQ3swLjAuMC4wIC0gMjU1LjI1NS4yNTUuMjU1fSkiDQoNCiAgICBfaXB2Nl9wYXJ0ID0gUmVnZXgocidbMC05YS1mQS1GXXsxLDR9Jykuc2V0TmFtZSgiaGV4X2ludGVnZXIiKQ0KICAgIF9mdWxsX2lwdjZfYWRkcmVzcyA9IChfaXB2Nl9wYXJ0ICsgKCc6JyArIF9pcHY2X3BhcnQpKjcpLnNldE5hbWUoImZ1bGwgSVB2NiBhZGRyZXNzIikNCiAgICBfc2hvcnRfaXB2Nl9hZGRyZXNzID0gKE9wdGlvbmFsKF9pcHY2X3BhcnQgKyAoJzonICsgX2lwdjZfcGFydCkqKDAsNikpICsgIjo6IiArIE9wdGlvbmFsKF9pcHY2X3BhcnQgKyAoJzonICsgX2lwdjZfcGFydCkqKDAsNikpKS5zZXROYW1lKCJzaG9ydCBJUHY2IGFkZHJlc3MiKQ0KICAgIF9zaG9ydF9pcHY2X2FkZHJlc3MuYWRkQ29uZGl0aW9uKGxhbWJkYSB0OiBzdW0oMSBmb3IgdHQgaW4gdCBpZiBweXBhcnNpbmdfY29tbW9uLl9pcHY2X3BhcnQubWF0Y2hlcyh0dCkpIDwgOCkNCiAgICBfbWl4ZWRfaXB2Nl9hZGRyZXNzID0gKCI6OmZmZmY6IiArIGlwdjRfYWRkcmVzcykuc2V0TmFtZSgibWl4ZWQgSVB2NiBhZGRyZXNzIikNCiAgICBpcHY2X2FkZHJlc3MgPSBDb21iaW5lKChfZnVsbF9pcHY2X2FkZHJlc3MgfCBfbWl4ZWRfaXB2Nl9hZGRyZXNzIHwgX3Nob3J0X2lwdjZfYWRkcmVzcykuc2V0TmFtZSgiSVB2NiBhZGRyZXNzIikpLnNldE5hbWUoIklQdjYgYWRkcmVzcyIpDQogICAgIklQdjYgYWRkcmVzcyAobG9uZywgc2hvcnQsIG9yIG1peGVkIGZvcm0pIg0KICAgIA0KICAgIG1hY19hZGRyZXNzID0gUmVnZXgocidbMC05YS1mQS1GXXsyfShbOi4tXSlbMC05YS1mQS1GXXsyfSg/OlwxWzAtOWEtZkEtRl17Mn0pezR9Jykuc2V0TmFtZSgiTUFDIGFkZHJlc3MiKQ0KICAgICJNQUMgYWRkcmVzcyB4eDp4eDp4eDp4eDp4eCAobWF5IGFsc28gaGF2ZSAnLScgb3IgJy4nIGRlbGltaXRlcnMpIg0KDQogICAgQHN0YXRpY21ldGhvZA0KICAgIGRlZiBjb252ZXJ0VG9EYXRlKGZtdD0iJVktJW0tJWQiKToNCiAgICAgICAgIiIiDQogICAgICAgIEhlbHBlciB0byBjcmVhdGUgYSBwYXJzZSBhY3Rpb24gZm9yIGNvbnZlcnRpbmcgcGFyc2VkIGRhdGUgc3RyaW5nIHRvIFB5dGhvbiBkYXRldGltZS5kYXRlDQoNCiAgICAgICAgUGFyYW1zIC0NCiAgICAgICAgIC0gZm10IC0gZm9ybWF0IHRvIGJlIHBhc3NlZCB0byBkYXRldGltZS5zdHJwdGltZSAoZGVmYXVsdD1DeyIlWS0lbS0lZCJ9KQ0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgZGF0ZV9leHByID0gcHlwYXJzaW5nX2NvbW1vbi5pc284NjAxX2RhdGUuY29weSgpDQogICAgICAgICAgICBkYXRlX2V4cHIuc2V0UGFyc2VBY3Rpb24ocHlwYXJzaW5nX2NvbW1vbi5jb252ZXJ0VG9EYXRlKCkpDQogICAgICAgICAgICBwcmludChkYXRlX2V4cHIucGFyc2VTdHJpbmcoIjE5OTktMTItMzEiKSkNCiAgICAgICAgcHJpbnRzOjoNCiAgICAgICAgICAgIFtkYXRldGltZS5kYXRlKDE5OTksIDEyLCAzMSldDQogICAgICAgICIiIg0KICAgICAgICBkZWYgY3Z0X2ZuKHMsbCx0KToNCiAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZXRpbWUuc3RycHRpbWUodFswXSwgZm10KS5kYXRlKCkNCiAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yIGFzIHZlOg0KICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKHMsIGwsIHN0cih2ZSkpDQogICAgICAgIHJldHVybiBjdnRfZm4NCg0KICAgIEBzdGF0aWNtZXRob2QNCiAgICBkZWYgY29udmVydFRvRGF0ZXRpbWUoZm10PSIlWS0lbS0lZFQlSDolTTolUy4lZiIpOg0KICAgICAgICAiIiINCiAgICAgICAgSGVscGVyIHRvIGNyZWF0ZSBhIHBhcnNlIGFjdGlvbiBmb3IgY29udmVydGluZyBwYXJzZWQgZGF0ZXRpbWUgc3RyaW5nIHRvIFB5dGhvbiBkYXRldGltZS5kYXRldGltZQ0KDQogICAgICAgIFBhcmFtcyAtDQogICAgICAgICAtIGZtdCAtIGZvcm1hdCB0byBiZSBwYXNzZWQgdG8gZGF0ZXRpbWUuc3RycHRpbWUgKGRlZmF1bHQ9Q3siJVktJW0tJWRUJUg6JU06JVMuJWYifSkNCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIGR0X2V4cHIgPSBweXBhcnNpbmdfY29tbW9uLmlzbzg2MDFfZGF0ZXRpbWUuY29weSgpDQogICAgICAgICAgICBkdF9leHByLnNldFBhcnNlQWN0aW9uKHB5cGFyc2luZ19jb21tb24uY29udmVydFRvRGF0ZXRpbWUoKSkNCiAgICAgICAgICAgIHByaW50KGR0X2V4cHIucGFyc2VTdHJpbmcoIjE5OTktMTItMzFUMjM6NTk6NTkuOTk5IikpDQogICAgICAgIHByaW50czo6DQogICAgICAgICAgICBbZGF0ZXRpbWUuZGF0ZXRpbWUoMTk5OSwgMTIsIDMxLCAyMywgNTksIDU5LCA5OTkwMDApXQ0KICAgICAgICAiIiINCiAgICAgICAgZGVmIGN2dF9mbihzLGwsdCk6DQogICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgcmV0dXJuIGRhdGV0aW1lLnN0cnB0aW1lKHRbMF0sIGZtdCkNCiAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yIGFzIHZlOg0KICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKHMsIGwsIHN0cih2ZSkpDQogICAgICAgIHJldHVybiBjdnRfZm4NCg0KICAgIGlzbzg2MDFfZGF0ZSA9IFJlZ2V4KHInKD9QPHllYXI+XGR7NH0pKD86LSg/UDxtb250aD5cZFxkKSg/Oi0oP1A8ZGF5PlxkXGQpKT8pPycpLnNldE5hbWUoIklTTzg2MDEgZGF0ZSIpDQogICAgIklTTzg2MDEgZGF0ZSAoQ3t5eXl5LW1tLWRkfSkiDQoNCiAgICBpc284NjAxX2RhdGV0aW1lID0gUmVnZXgocicoP1A8eWVhcj5cZHs0fSktKD9QPG1vbnRoPlxkXGQpLSg/UDxkYXk+XGRcZClbVCBdKD9QPGhvdXI+XGRcZCk6KD9QPG1pbnV0ZT5cZFxkKSg6KD9QPHNlY29uZD5cZFxkKFwuXGQqKT8pPyk/KD9QPHR6Plp8WystXVxkXGQ6P1xkXGQpPycpLnNldE5hbWUoIklTTzg2MDEgZGF0ZXRpbWUiKQ0KICAgICJJU084NjAxIGRhdGV0aW1lIChDe3l5eXktbW0tZGRUaGg6bW06c3MucyhafCstMDA6MDApfSkgLSB0cmFpbGluZyBzZWNvbmRzLCBtaWxsaXNlY29uZHMsIGFuZCB0aW1lem9uZSBvcHRpb25hbDsgYWNjZXB0cyBzZXBhcmF0aW5nIEN7J1QnfSBvciBDeycgJ30iDQoNCiAgICB1dWlkID0gUmVnZXgocidbMC05YS1mQS1GXXs4fSgtWzAtOWEtZkEtRl17NH0pezN9LVswLTlhLWZBLUZdezEyfScpLnNldE5hbWUoIlVVSUQiKQ0KICAgICJVVUlEIChDe3h4eHh4eHh4LXh4eHgteHh4eC14eHh4LXh4eHh4eHh4eHh4eH0pIg0KDQogICAgX2h0bWxfc3RyaXBwZXIgPSBhbnlPcGVuVGFnLnN1cHByZXNzKCkgfCBhbnlDbG9zZVRhZy5zdXBwcmVzcygpDQogICAgQHN0YXRpY21ldGhvZA0KICAgIGRlZiBzdHJpcEhUTUxUYWdzKHMsIGwsIHRva2Vucyk6DQogICAgICAgICIiIg0KICAgICAgICBQYXJzZSBhY3Rpb24gdG8gcmVtb3ZlIEhUTUwgdGFncyBmcm9tIHdlYiBwYWdlIEhUTUwgc291cmNlDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICAjIHN0cmlwIEhUTUwgbGlua3MgZnJvbSBub3JtYWwgdGV4dCANCiAgICAgICAgICAgIHRleHQgPSAnPHRkPk1vcmUgaW5mbyBhdCB0aGUgPGEgaHJlZj0iaHR0cDovL3B5cGFyc2luZy53aWtpc3BhY2VzLmNvbSI+cHlwYXJzaW5nPC9hPiB3aWtpIHBhZ2U8L3RkPicNCiAgICAgICAgICAgIHRkLHRkX2VuZCA9IG1ha2VIVE1MVGFncygiVEQiKQ0KICAgICAgICAgICAgdGFibGVfdGV4dCA9IHRkICsgU2tpcFRvKHRkX2VuZCkuc2V0UGFyc2VBY3Rpb24ocHlwYXJzaW5nX2NvbW1vbi5zdHJpcEhUTUxUYWdzKSgiYm9keSIpICsgdGRfZW5kDQogICAgICAgICAgICANCiAgICAgICAgICAgIHByaW50KHRhYmxlX3RleHQucGFyc2VTdHJpbmcodGV4dCkuYm9keSkgIyAtPiAnTW9yZSBpbmZvIGF0IHRoZSBweXBhcnNpbmcgd2lraSBwYWdlJw0KICAgICAgICAiIiINCiAgICAgICAgcmV0dXJuIHB5cGFyc2luZ19jb21tb24uX2h0bWxfc3RyaXBwZXIudHJhbnNmb3JtU3RyaW5nKHRva2Vuc1swXSkNCg0KICAgIF9jb21tYXNlcGl0ZW0gPSBDb21iaW5lKE9uZU9yTW9yZSh+TGl0ZXJhbCgiLCIpICsgfkxpbmVFbmQoKSArIFdvcmQocHJpbnRhYmxlcywgZXhjbHVkZUNoYXJzPScsJykgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBPcHRpb25hbCggV2hpdGUoIiBcdCIpICkgKSApLnN0cmVhbWxpbmUoKS5zZXROYW1lKCJjb21tYUl0ZW0iKQ0KICAgIGNvbW1hX3NlcGFyYXRlZF9saXN0ID0gZGVsaW1pdGVkTGlzdCggT3B0aW9uYWwoIHF1b3RlZFN0cmluZy5jb3B5KCkgfCBfY29tbWFzZXBpdGVtLCBkZWZhdWx0PSIiKSApLnNldE5hbWUoImNvbW1hIHNlcGFyYXRlZCBsaXN0IikNCiAgICAiIiJQcmVkZWZpbmVkIGV4cHJlc3Npb24gb2YgMSBvciBtb3JlIHByaW50YWJsZSB3b3JkcyBvciBxdW90ZWQgc3RyaW5ncywgc2VwYXJhdGVkIGJ5IGNvbW1hcy4iIiINCg0KICAgIHVwY2FzZVRva2VucyA9IHN0YXRpY21ldGhvZCh0b2tlbk1hcChsYW1iZGEgdDogX3VzdHIodCkudXBwZXIoKSkpDQogICAgIiIiUGFyc2UgYWN0aW9uIHRvIGNvbnZlcnQgdG9rZW5zIHRvIHVwcGVyIGNhc2UuIiIiDQoNCiAgICBkb3duY2FzZVRva2VucyA9IHN0YXRpY21ldGhvZCh0b2tlbk1hcChsYW1iZGEgdDogX3VzdHIodCkubG93ZXIoKSkpDQogICAgIiIiUGFyc2UgYWN0aW9uIHRvIGNvbnZlcnQgdG9rZW5zIHRvIGxvd2VyIGNhc2UuIiIiDQoNCg0KaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoNCg0KICAgIHNlbGVjdFRva2VuICAgID0gQ2FzZWxlc3NMaXRlcmFsKCJzZWxlY3QiKQ0KICAgIGZyb21Ub2tlbiAgICAgID0gQ2FzZWxlc3NMaXRlcmFsKCJmcm9tIikNCg0KICAgIGlkZW50ICAgICAgICAgID0gV29yZChhbHBoYXMsIGFscGhhbnVtcyArICJfJCIpDQoNCiAgICBjb2x1bW5OYW1lICAgICA9IGRlbGltaXRlZExpc3QoaWRlbnQsICIuIiwgY29tYmluZT1UcnVlKS5zZXRQYXJzZUFjdGlvbih1cGNhc2VUb2tlbnMpDQogICAgY29sdW1uTmFtZUxpc3QgPSBHcm91cChkZWxpbWl0ZWRMaXN0KGNvbHVtbk5hbWUpKS5zZXROYW1lKCJjb2x1bW5zIikNCiAgICBjb2x1bW5TcGVjICAgICA9ICgnKicgfCBjb2x1bW5OYW1lTGlzdCkNCg0KICAgIHRhYmxlTmFtZSAgICAgID0gZGVsaW1pdGVkTGlzdChpZGVudCwgIi4iLCBjb21iaW5lPVRydWUpLnNldFBhcnNlQWN0aW9uKHVwY2FzZVRva2VucykNCiAgICB0YWJsZU5hbWVMaXN0ICA9IEdyb3VwKGRlbGltaXRlZExpc3QodGFibGVOYW1lKSkuc2V0TmFtZSgidGFibGVzIikNCiAgICANCiAgICBzaW1wbGVTUUwgICAgICA9IHNlbGVjdFRva2VuKCJjb21tYW5kIikgKyBjb2x1bW5TcGVjKCJjb2x1bW5zIikgKyBmcm9tVG9rZW4gKyB0YWJsZU5hbWVMaXN0KCJ0YWJsZXMiKQ0KDQogICAgIyBkZW1vIHJ1blRlc3RzIG1ldGhvZCwgaW5jbHVkaW5nIGVtYmVkZGVkIGNvbW1lbnRzIGluIHRlc3Qgc3RyaW5nDQogICAgc2ltcGxlU1FMLnJ1blRlc3RzKCIiIg0KICAgICAgICAjICcqJyBhcyBjb2x1bW4gbGlzdCBhbmQgZG90dGVkIHRhYmxlIG5hbWUNCiAgICAgICAgc2VsZWN0ICogZnJvbSBTWVMuWFlaWlkNCg0KICAgICAgICAjIGNhc2VsZXNzIG1hdGNoIG9uICJTRUxFQ1QiLCBhbmQgY2FzdHMgYmFjayB0byAic2VsZWN0Ig0KICAgICAgICBTRUxFQ1QgKiBmcm9tIFhZWlpZLCBBQkMNCg0KICAgICAgICAjIGxpc3Qgb2YgY29sdW1uIG5hbWVzLCBhbmQgbWl4ZWQgY2FzZSBTRUxFQ1Qga2V5d29yZA0KICAgICAgICBTZWxlY3QgQUEsQkIsQ0MgZnJvbSBTeXMuZHVhbA0KDQogICAgICAgICMgbXVsdGlwbGUgdGFibGVzDQogICAgICAgIFNlbGVjdCBBLCBCLCBDIGZyb20gU3lzLmR1YWwsIFRhYmxlMg0KDQogICAgICAgICMgaW52YWxpZCBTRUxFQ1Qga2V5d29yZCAtIHNob3VsZCBmYWlsDQogICAgICAgIFhlbGVjdCBBLCBCLCBDIGZyb20gU3lzLmR1YWwNCg0KICAgICAgICAjIGluY29tcGxldGUgY29tbWFuZCAtIHNob3VsZCBmYWlsDQogICAgICAgIFNlbGVjdA0KDQogICAgICAgICMgaW52YWxpZCBjb2x1bW4gbmFtZSAtIHNob3VsZCBmYWlsDQogICAgICAgIFNlbGVjdCBeXl4gZnJveCBTeXMuZHVhbA0KDQogICAgICAgICIiIikNCg0KICAgIHB5cGFyc2luZ19jb21tb24ubnVtYmVyLnJ1blRlc3RzKCIiIg0KICAgICAgICAxMDANCiAgICAgICAgLTEwMA0KICAgICAgICArMTAwDQogICAgICAgIDMuMTQxNTkNCiAgICAgICAgNi4wMmUyMw0KICAgICAgICAxZS0xMg0KICAgICAgICAiIiIpDQoNCiAgICAjIGFueSBpbnQgb3IgcmVhbCBudW1iZXIsIHJldHVybmVkIGFzIGZsb2F0DQogICAgcHlwYXJzaW5nX2NvbW1vbi5mbnVtYmVyLnJ1blRlc3RzKCIiIg0KICAgICAgICAxMDANCiAgICAgICAgLTEwMA0KICAgICAgICArMTAwDQogICAgICAgIDMuMTQxNTkNCiAgICAgICAgNi4wMmUyMw0KICAgICAgICAxZS0xMg0KICAgICAgICAiIiIpDQoNCiAgICBweXBhcnNpbmdfY29tbW9uLmhleF9pbnRlZ2VyLnJ1blRlc3RzKCIiIg0KICAgICAgICAxMDANCiAgICAgICAgRkYNCiAgICAgICAgIiIiKQ0KDQogICAgaW1wb3J0IHV1aWQNCiAgICBweXBhcnNpbmdfY29tbW9uLnV1aWQuc2V0UGFyc2VBY3Rpb24odG9rZW5NYXAodXVpZC5VVUlEKSkNCiAgICBweXBhcnNpbmdfY29tbW9uLnV1aWQucnVuVGVzdHMoIiIiDQogICAgICAgIDEyMzQ1Njc4LTEyMzQtNTY3OC0xMjM0LTU2NzgxMjM0NTY3OA0KICAgICAgICAiIiIpDQpQSwMEFAAAAAAAAAAhAJlYTVqSdQAAknUAAEEAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3NpeC5weSIiIlV0aWxpdGllcyBmb3Igd3JpdGluZyBjb2RlIHRoYXQgcnVucyBvbiBQeXRob24gMiBhbmQgMyIiIgoKIyBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxNSBCZW5qYW1pbiBQZXRlcnNvbgojCiMgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQojIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCiMgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwojIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKIyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKIyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgojCiMgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCiMgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KIwojIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCiMgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCiMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCiMgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgojIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCiMgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKIyBTT0ZUV0FSRS4KCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgZnVuY3Rvb2xzCmltcG9ydCBpdGVydG9vbHMKaW1wb3J0IG9wZXJhdG9yCmltcG9ydCBzeXMKaW1wb3J0IHR5cGVzCgpfX2F1dGhvcl9fID0gIkJlbmphbWluIFBldGVyc29uIDxiZW5qYW1pbkBweXRob24ub3JnPiIKX192ZXJzaW9uX18gPSAiMS4xMC4wIgoKCiMgVXNlZnVsIGZvciB2ZXJ5IGNvYXJzZSB2ZXJzaW9uIGRpZmZlcmVudGlhdGlvbi4KUFkyID0gc3lzLnZlcnNpb25faW5mb1swXSA9PSAyClBZMyA9IHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMwpQWTM0ID0gc3lzLnZlcnNpb25faW5mb1swOjJdID49ICgzLCA0KQoKaWYgUFkzOgogICAgc3RyaW5nX3R5cGVzID0gc3RyLAogICAgaW50ZWdlcl90eXBlcyA9IGludCwKICAgIGNsYXNzX3R5cGVzID0gdHlwZSwKICAgIHRleHRfdHlwZSA9IHN0cgogICAgYmluYXJ5X3R5cGUgPSBieXRlcwoKICAgIE1BWFNJWkUgPSBzeXMubWF4c2l6ZQplbHNlOgogICAgc3RyaW5nX3R5cGVzID0gYmFzZXN0cmluZywKICAgIGludGVnZXJfdHlwZXMgPSAoaW50LCBsb25nKQogICAgY2xhc3NfdHlwZXMgPSAodHlwZSwgdHlwZXMuQ2xhc3NUeXBlKQogICAgdGV4dF90eXBlID0gdW5pY29kZQogICAgYmluYXJ5X3R5cGUgPSBzdHIKCiAgICBpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgiamF2YSIpOgogICAgICAgICMgSnl0aG9uIGFsd2F5cyB1c2VzIDMyIGJpdHMuCiAgICAgICAgTUFYU0laRSA9IGludCgoMSA8PCAzMSkgLSAxKQogICAgZWxzZToKICAgICAgICAjIEl0J3MgcG9zc2libGUgdG8gaGF2ZSBzaXplb2YobG9uZykgIT0gc2l6ZW9mKFB5X3NzaXplX3QpLgogICAgICAgIGNsYXNzIFgob2JqZWN0KToKCiAgICAgICAgICAgIGRlZiBfX2xlbl9fKHNlbGYpOgogICAgICAgICAgICAgICAgcmV0dXJuIDEgPDwgMzEKICAgICAgICB0cnk6CiAgICAgICAgICAgIGxlbihYKCkpCiAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CiAgICAgICAgICAgICMgMzItYml0CiAgICAgICAgICAgIE1BWFNJWkUgPSBpbnQoKDEgPDwgMzEpIC0gMSkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIDY0LWJpdAogICAgICAgICAgICBNQVhTSVpFID0gaW50KCgxIDw8IDYzKSAtIDEpCiAgICAgICAgZGVsIFgKCgpkZWYgX2FkZF9kb2MoZnVuYywgZG9jKToKICAgICIiIkFkZCBkb2N1bWVudGF0aW9uIHRvIGEgZnVuY3Rpb24uIiIiCiAgICBmdW5jLl9fZG9jX18gPSBkb2MKCgpkZWYgX2ltcG9ydF9tb2R1bGUobmFtZSk6CiAgICAiIiJJbXBvcnQgbW9kdWxlLCByZXR1cm5pbmcgdGhlIG1vZHVsZSBhZnRlciB0aGUgbGFzdCBkb3QuIiIiCiAgICBfX2ltcG9ydF9fKG5hbWUpCiAgICByZXR1cm4gc3lzLm1vZHVsZXNbbmFtZV0KCgpjbGFzcyBfTGF6eURlc2NyKG9iamVjdCk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUpOgogICAgICAgIHNlbGYubmFtZSA9IG5hbWUKCiAgICBkZWYgX19nZXRfXyhzZWxmLCBvYmosIHRwKToKICAgICAgICByZXN1bHQgPSBzZWxmLl9yZXNvbHZlKCkKICAgICAgICBzZXRhdHRyKG9iaiwgc2VsZi5uYW1lLCByZXN1bHQpICAjIEludm9rZXMgX19zZXRfXy4KICAgICAgICB0cnk6CiAgICAgICAgICAgICMgVGhpcyBpcyBhIGJpdCB1Z2x5LCBidXQgaXQgYXZvaWRzIHJ1bm5pbmcgdGhpcyBhZ2FpbiBieQogICAgICAgICAgICAjIHJlbW92aW5nIHRoaXMgZGVzY3JpcHRvci4KICAgICAgICAgICAgZGVsYXR0cihvYmouX19jbGFzc19fLCBzZWxmLm5hbWUpCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICBwYXNzCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKCmNsYXNzIE1vdmVkTW9kdWxlKF9MYXp5RGVzY3IpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBvbGQsIG5ldz1Ob25lKToKICAgICAgICBzdXBlcihNb3ZlZE1vZHVsZSwgc2VsZikuX19pbml0X18obmFtZSkKICAgICAgICBpZiBQWTM6CiAgICAgICAgICAgIGlmIG5ldyBpcyBOb25lOgogICAgICAgICAgICAgICAgbmV3ID0gbmFtZQogICAgICAgICAgICBzZWxmLm1vZCA9IG5ldwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYubW9kID0gb2xkCgogICAgZGVmIF9yZXNvbHZlKHNlbGYpOgogICAgICAgIHJldHVybiBfaW1wb3J0X21vZHVsZShzZWxmLm1vZCkKCiAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgYXR0cik6CiAgICAgICAgX21vZHVsZSA9IHNlbGYuX3Jlc29sdmUoKQogICAgICAgIHZhbHVlID0gZ2V0YXR0cihfbW9kdWxlLCBhdHRyKQogICAgICAgIHNldGF0dHIoc2VsZiwgYXR0ciwgdmFsdWUpCiAgICAgICAgcmV0dXJuIHZhbHVlCgoKY2xhc3MgX0xhenlNb2R1bGUodHlwZXMuTW9kdWxlVHlwZSk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUpOgogICAgICAgIHN1cGVyKF9MYXp5TW9kdWxlLCBzZWxmKS5fX2luaXRfXyhuYW1lKQogICAgICAgIHNlbGYuX19kb2NfXyA9IHNlbGYuX19jbGFzc19fLl9fZG9jX18KCiAgICBkZWYgX19kaXJfXyhzZWxmKToKICAgICAgICBhdHRycyA9IFsiX19kb2NfXyIsICJfX25hbWVfXyJdCiAgICAgICAgYXR0cnMgKz0gW2F0dHIubmFtZSBmb3IgYXR0ciBpbiBzZWxmLl9tb3ZlZF9hdHRyaWJ1dGVzXQogICAgICAgIHJldHVybiBhdHRycwoKICAgICMgU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcwogICAgX21vdmVkX2F0dHJpYnV0ZXMgPSBbXQoKCmNsYXNzIE1vdmVkQXR0cmlidXRlKF9MYXp5RGVzY3IpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBvbGRfbW9kLCBuZXdfbW9kLCBvbGRfYXR0cj1Ob25lLCBuZXdfYXR0cj1Ob25lKToKICAgICAgICBzdXBlcihNb3ZlZEF0dHJpYnV0ZSwgc2VsZikuX19pbml0X18obmFtZSkKICAgICAgICBpZiBQWTM6CiAgICAgICAgICAgIGlmIG5ld19tb2QgaXMgTm9uZToKICAgICAgICAgICAgICAgIG5ld19tb2QgPSBuYW1lCiAgICAgICAgICAgIHNlbGYubW9kID0gbmV3X21vZAogICAgICAgICAgICBpZiBuZXdfYXR0ciBpcyBOb25lOgogICAgICAgICAgICAgICAgaWYgb2xkX2F0dHIgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICBuZXdfYXR0ciA9IG5hbWUKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbmV3X2F0dHIgPSBvbGRfYXR0cgogICAgICAgICAgICBzZWxmLmF0dHIgPSBuZXdfYXR0cgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYubW9kID0gb2xkX21vZAogICAgICAgICAgICBpZiBvbGRfYXR0ciBpcyBOb25lOgogICAgICAgICAgICAgICAgb2xkX2F0dHIgPSBuYW1lCiAgICAgICAgICAgIHNlbGYuYXR0ciA9IG9sZF9hdHRyCgogICAgZGVmIF9yZXNvbHZlKHNlbGYpOgogICAgICAgIG1vZHVsZSA9IF9pbXBvcnRfbW9kdWxlKHNlbGYubW9kKQogICAgICAgIHJldHVybiBnZXRhdHRyKG1vZHVsZSwgc2VsZi5hdHRyKQoKCmNsYXNzIF9TaXhNZXRhUGF0aEltcG9ydGVyKG9iamVjdCk6CgogICAgIiIiCiAgICBBIG1ldGEgcGF0aCBpbXBvcnRlciB0byBpbXBvcnQgc2l4Lm1vdmVzIGFuZCBpdHMgc3VibW9kdWxlcy4KCiAgICBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBQRVAzMDIgZmluZGVyIGFuZCBsb2FkZXIuIEl0IHNob3VsZCBiZSBjb21wYXRpYmxlCiAgICB3aXRoIFB5dGhvbiAyLjUgYW5kIGFsbCBleGlzdGluZyB2ZXJzaW9ucyBvZiBQeXRob24zCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgc2l4X21vZHVsZV9uYW1lKToKICAgICAgICBzZWxmLm5hbWUgPSBzaXhfbW9kdWxlX25hbWUKICAgICAgICBzZWxmLmtub3duX21vZHVsZXMgPSB7fQoKICAgIGRlZiBfYWRkX21vZHVsZShzZWxmLCBtb2QsICpmdWxsbmFtZXMpOgogICAgICAgIGZvciBmdWxsbmFtZSBpbiBmdWxsbmFtZXM6CiAgICAgICAgICAgIHNlbGYua25vd25fbW9kdWxlc1tzZWxmLm5hbWUgKyAiLiIgKyBmdWxsbmFtZV0gPSBtb2QKCiAgICBkZWYgX2dldF9tb2R1bGUoc2VsZiwgZnVsbG5hbWUpOgogICAgICAgIHJldHVybiBzZWxmLmtub3duX21vZHVsZXNbc2VsZi5uYW1lICsgIi4iICsgZnVsbG5hbWVdCgogICAgZGVmIGZpbmRfbW9kdWxlKHNlbGYsIGZ1bGxuYW1lLCBwYXRoPU5vbmUpOgogICAgICAgIGlmIGZ1bGxuYW1lIGluIHNlbGYua25vd25fbW9kdWxlczoKICAgICAgICAgICAgcmV0dXJuIHNlbGYKICAgICAgICByZXR1cm4gTm9uZQoKICAgIGRlZiBfX2dldF9tb2R1bGUoc2VsZiwgZnVsbG5hbWUpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYua25vd25fbW9kdWxlc1tmdWxsbmFtZV0KICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCJUaGlzIGxvYWRlciBkb2VzIG5vdCBrbm93IG1vZHVsZSAiICsgZnVsbG5hbWUpCgogICAgZGVmIGxvYWRfbW9kdWxlKHNlbGYsIGZ1bGxuYW1lKToKICAgICAgICB0cnk6CiAgICAgICAgICAgICMgaW4gY2FzZSBvZiBhIHJlbG9hZAogICAgICAgICAgICByZXR1cm4gc3lzLm1vZHVsZXNbZnVsbG5hbWVdCiAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICBwYXNzCiAgICAgICAgbW9kID0gc2VsZi5fX2dldF9tb2R1bGUoZnVsbG5hbWUpCiAgICAgICAgaWYgaXNpbnN0YW5jZShtb2QsIE1vdmVkTW9kdWxlKToKICAgICAgICAgICAgbW9kID0gbW9kLl9yZXNvbHZlKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBtb2QuX19sb2FkZXJfXyA9IHNlbGYKICAgICAgICBzeXMubW9kdWxlc1tmdWxsbmFtZV0gPSBtb2QKICAgICAgICByZXR1cm4gbW9kCgogICAgZGVmIGlzX3BhY2thZ2Uoc2VsZiwgZnVsbG5hbWUpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiB0cnVlLCBpZiB0aGUgbmFtZWQgbW9kdWxlIGlzIGEgcGFja2FnZS4KCiAgICAgICAgV2UgbmVlZCB0aGlzIG1ldGhvZCB0byBnZXQgY29ycmVjdCBzcGVjIG9iamVjdHMgd2l0aAogICAgICAgIFB5dGhvbiAzLjQgKHNlZSBQRVA0NTEpCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGhhc2F0dHIoc2VsZi5fX2dldF9tb2R1bGUoZnVsbG5hbWUpLCAiX19wYXRoX18iKQoKICAgIGRlZiBnZXRfY29kZShzZWxmLCBmdWxsbmFtZSk6CiAgICAgICAgIiIiUmV0dXJuIE5vbmUKCiAgICAgICAgUmVxdWlyZWQsIGlmIGlzX3BhY2thZ2UgaXMgaW1wbGVtZW50ZWQiIiIKICAgICAgICBzZWxmLl9fZ2V0X21vZHVsZShmdWxsbmFtZSkgICMgZXZlbnR1YWxseSByYWlzZXMgSW1wb3J0RXJyb3IKICAgICAgICByZXR1cm4gTm9uZQogICAgZ2V0X3NvdXJjZSA9IGdldF9jb2RlICAjIHNhbWUgYXMgZ2V0X2NvZGUKCl9pbXBvcnRlciA9IF9TaXhNZXRhUGF0aEltcG9ydGVyKF9fbmFtZV9fKQoKCmNsYXNzIF9Nb3ZlZEl0ZW1zKF9MYXp5TW9kdWxlKToKCiAgICAiIiJMYXp5IGxvYWRpbmcgb2YgbW92ZWQgb2JqZWN0cyIiIgogICAgX19wYXRoX18gPSBbXSAgIyBtYXJrIGFzIHBhY2thZ2UKCgpfbW92ZWRfYXR0cmlidXRlcyA9IFsKICAgIE1vdmVkQXR0cmlidXRlKCJjU3RyaW5nSU8iLCAiY1N0cmluZ0lPIiwgImlvIiwgIlN0cmluZ0lPIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiZmlsdGVyIiwgIml0ZXJ0b29scyIsICJidWlsdGlucyIsICJpZmlsdGVyIiwgImZpbHRlciIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImZpbHRlcmZhbHNlIiwgIml0ZXJ0b29scyIsICJpdGVydG9vbHMiLCAiaWZpbHRlcmZhbHNlIiwgImZpbHRlcmZhbHNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiaW5wdXQiLCAiX19idWlsdGluX18iLCAiYnVpbHRpbnMiLCAicmF3X2lucHV0IiwgImlucHV0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiaW50ZXJuIiwgIl9fYnVpbHRpbl9fIiwgInN5cyIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIm1hcCIsICJpdGVydG9vbHMiLCAiYnVpbHRpbnMiLCAiaW1hcCIsICJtYXAiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJnZXRjd2QiLCAib3MiLCAib3MiLCAiZ2V0Y3dkdSIsICJnZXRjd2QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJnZXRjd2RiIiwgIm9zIiwgIm9zIiwgImdldGN3ZCIsICJnZXRjd2RiIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicmFuZ2UiLCAiX19idWlsdGluX18iLCAiYnVpbHRpbnMiLCAieHJhbmdlIiwgInJhbmdlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicmVsb2FkX21vZHVsZSIsICJfX2J1aWx0aW5fXyIsICJpbXBvcnRsaWIiIGlmIFBZMzQgZWxzZSAiaW1wIiwgInJlbG9hZCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInJlZHVjZSIsICJfX2J1aWx0aW5fXyIsICJmdW5jdG9vbHMiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJzaGxleF9xdW90ZSIsICJwaXBlcyIsICJzaGxleCIsICJxdW90ZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlN0cmluZ0lPIiwgIlN0cmluZ0lPIiwgImlvIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiVXNlckRpY3QiLCAiVXNlckRpY3QiLCAiY29sbGVjdGlvbnMiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJVc2VyTGlzdCIsICJVc2VyTGlzdCIsICJjb2xsZWN0aW9ucyIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlVzZXJTdHJpbmciLCAiVXNlclN0cmluZyIsICJjb2xsZWN0aW9ucyIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInhyYW5nZSIsICJfX2J1aWx0aW5fXyIsICJidWlsdGlucyIsICJ4cmFuZ2UiLCAicmFuZ2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ6aXAiLCAiaXRlcnRvb2xzIiwgImJ1aWx0aW5zIiwgIml6aXAiLCAiemlwIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiemlwX2xvbmdlc3QiLCAiaXRlcnRvb2xzIiwgIml0ZXJ0b29scyIsICJpemlwX2xvbmdlc3QiLCAiemlwX2xvbmdlc3QiKSwKICAgIE1vdmVkTW9kdWxlKCJidWlsdGlucyIsICJfX2J1aWx0aW5fXyIpLAogICAgTW92ZWRNb2R1bGUoImNvbmZpZ3BhcnNlciIsICJDb25maWdQYXJzZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJjb3B5cmVnIiwgImNvcHlfcmVnIiksCiAgICBNb3ZlZE1vZHVsZSgiZGJtX2dudSIsICJnZGJtIiwgImRibS5nbnUiKSwKICAgIE1vdmVkTW9kdWxlKCJfZHVtbXlfdGhyZWFkIiwgImR1bW15X3RocmVhZCIsICJfZHVtbXlfdGhyZWFkIiksCiAgICBNb3ZlZE1vZHVsZSgiaHR0cF9jb29raWVqYXIiLCAiY29va2llbGliIiwgImh0dHAuY29va2llamFyIiksCiAgICBNb3ZlZE1vZHVsZSgiaHR0cF9jb29raWVzIiwgIkNvb2tpZSIsICJodHRwLmNvb2tpZXMiKSwKICAgIE1vdmVkTW9kdWxlKCJodG1sX2VudGl0aWVzIiwgImh0bWxlbnRpdHlkZWZzIiwgImh0bWwuZW50aXRpZXMiKSwKICAgIE1vdmVkTW9kdWxlKCJodG1sX3BhcnNlciIsICJIVE1MUGFyc2VyIiwgImh0bWwucGFyc2VyIiksCiAgICBNb3ZlZE1vZHVsZSgiaHR0cF9jbGllbnQiLCAiaHR0cGxpYiIsICJodHRwLmNsaWVudCIpLAogICAgTW92ZWRNb2R1bGUoImVtYWlsX21pbWVfbXVsdGlwYXJ0IiwgImVtYWlsLk1JTUVNdWx0aXBhcnQiLCAiZW1haWwubWltZS5tdWx0aXBhcnQiKSwKICAgIE1vdmVkTW9kdWxlKCJlbWFpbF9taW1lX25vbm11bHRpcGFydCIsICJlbWFpbC5NSU1FTm9uTXVsdGlwYXJ0IiwgImVtYWlsLm1pbWUubm9ubXVsdGlwYXJ0IiksCiAgICBNb3ZlZE1vZHVsZSgiZW1haWxfbWltZV90ZXh0IiwgImVtYWlsLk1JTUVUZXh0IiwgImVtYWlsLm1pbWUudGV4dCIpLAogICAgTW92ZWRNb2R1bGUoImVtYWlsX21pbWVfYmFzZSIsICJlbWFpbC5NSU1FQmFzZSIsICJlbWFpbC5taW1lLmJhc2UiKSwKICAgIE1vdmVkTW9kdWxlKCJCYXNlSFRUUFNlcnZlciIsICJCYXNlSFRUUFNlcnZlciIsICJodHRwLnNlcnZlciIpLAogICAgTW92ZWRNb2R1bGUoIkNHSUhUVFBTZXJ2ZXIiLCAiQ0dJSFRUUFNlcnZlciIsICJodHRwLnNlcnZlciIpLAogICAgTW92ZWRNb2R1bGUoIlNpbXBsZUhUVFBTZXJ2ZXIiLCAiU2ltcGxlSFRUUFNlcnZlciIsICJodHRwLnNlcnZlciIpLAogICAgTW92ZWRNb2R1bGUoImNQaWNrbGUiLCAiY1BpY2tsZSIsICJwaWNrbGUiKSwKICAgIE1vdmVkTW9kdWxlKCJxdWV1ZSIsICJRdWV1ZSIpLAogICAgTW92ZWRNb2R1bGUoInJlcHJsaWIiLCAicmVwciIpLAogICAgTW92ZWRNb2R1bGUoInNvY2tldHNlcnZlciIsICJTb2NrZXRTZXJ2ZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJfdGhyZWFkIiwgInRocmVhZCIsICJfdGhyZWFkIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlciIsICJUa2ludGVyIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9kaWFsb2ciLCAiRGlhbG9nIiwgInRraW50ZXIuZGlhbG9nIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9maWxlZGlhbG9nIiwgIkZpbGVEaWFsb2ciLCAidGtpbnRlci5maWxlZGlhbG9nIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9zY3JvbGxlZHRleHQiLCAiU2Nyb2xsZWRUZXh0IiwgInRraW50ZXIuc2Nyb2xsZWR0ZXh0IiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9zaW1wbGVkaWFsb2ciLCAiU2ltcGxlRGlhbG9nIiwgInRraW50ZXIuc2ltcGxlZGlhbG9nIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl90aXgiLCAiVGl4IiwgInRraW50ZXIudGl4IiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl90dGsiLCAidHRrIiwgInRraW50ZXIudHRrIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9jb25zdGFudHMiLCAiVGtjb25zdGFudHMiLCAidGtpbnRlci5jb25zdGFudHMiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX2RuZCIsICJUa2RuZCIsICJ0a2ludGVyLmRuZCIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfY29sb3JjaG9vc2VyIiwgInRrQ29sb3JDaG9vc2VyIiwKICAgICAgICAgICAgICAgICJ0a2ludGVyLmNvbG9yY2hvb3NlciIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfY29tbW9uZGlhbG9nIiwgInRrQ29tbW9uRGlhbG9nIiwKICAgICAgICAgICAgICAgICJ0a2ludGVyLmNvbW1vbmRpYWxvZyIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfdGtmaWxlZGlhbG9nIiwgInRrRmlsZURpYWxvZyIsICJ0a2ludGVyLmZpbGVkaWFsb2ciKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX2ZvbnQiLCAidGtGb250IiwgInRraW50ZXIuZm9udCIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfbWVzc2FnZWJveCIsICJ0a01lc3NhZ2VCb3giLCAidGtpbnRlci5tZXNzYWdlYm94IiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl90a3NpbXBsZWRpYWxvZyIsICJ0a1NpbXBsZURpYWxvZyIsCiAgICAgICAgICAgICAgICAidGtpbnRlci5zaW1wbGVkaWFsb2ciKSwKICAgIE1vdmVkTW9kdWxlKCJ1cmxsaWJfcGFyc2UiLCBfX25hbWVfXyArICIubW92ZXMudXJsbGliX3BhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRNb2R1bGUoInVybGxpYl9lcnJvciIsIF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWJfZXJyb3IiLCAidXJsbGliLmVycm9yIiksCiAgICBNb3ZlZE1vZHVsZSgidXJsbGliIiwgX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYiIsIF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWIiKSwKICAgIE1vdmVkTW9kdWxlKCJ1cmxsaWJfcm9ib3RwYXJzZXIiLCAicm9ib3RwYXJzZXIiLCAidXJsbGliLnJvYm90cGFyc2VyIiksCiAgICBNb3ZlZE1vZHVsZSgieG1scnBjX2NsaWVudCIsICJ4bWxycGNsaWIiLCAieG1scnBjLmNsaWVudCIpLAogICAgTW92ZWRNb2R1bGUoInhtbHJwY19zZXJ2ZXIiLCAiU2ltcGxlWE1MUlBDU2VydmVyIiwgInhtbHJwYy5zZXJ2ZXIiKSwKXQojIEFkZCB3aW5kb3dzIHNwZWNpZmljIG1vZHVsZXMuCmlmIHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiOgogICAgX21vdmVkX2F0dHJpYnV0ZXMgKz0gWwogICAgICAgIE1vdmVkTW9kdWxlKCJ3aW5yZWciLCAiX3dpbnJlZyIpLAogICAgXQoKZm9yIGF0dHIgaW4gX21vdmVkX2F0dHJpYnV0ZXM6CiAgICBzZXRhdHRyKF9Nb3ZlZEl0ZW1zLCBhdHRyLm5hbWUsIGF0dHIpCiAgICBpZiBpc2luc3RhbmNlKGF0dHIsIE1vdmVkTW9kdWxlKToKICAgICAgICBfaW1wb3J0ZXIuX2FkZF9tb2R1bGUoYXR0ciwgIm1vdmVzLiIgKyBhdHRyLm5hbWUpCmRlbCBhdHRyCgpfTW92ZWRJdGVtcy5fbW92ZWRfYXR0cmlidXRlcyA9IF9tb3ZlZF9hdHRyaWJ1dGVzCgptb3ZlcyA9IF9Nb3ZlZEl0ZW1zKF9fbmFtZV9fICsgIi5tb3ZlcyIpCl9pbXBvcnRlci5fYWRkX21vZHVsZShtb3ZlcywgIm1vdmVzIikKCgpjbGFzcyBNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9wYXJzZShfTGF6eU1vZHVsZSk6CgogICAgIiIiTGF6eSBsb2FkaW5nIG9mIG1vdmVkIG9iamVjdHMgaW4gc2l4Lm1vdmVzLnVybGxpYl9wYXJzZSIiIgoKCl91cmxsaWJfcGFyc2VfbW92ZWRfYXR0cmlidXRlcyA9IFsKICAgIE1vdmVkQXR0cmlidXRlKCJQYXJzZVJlc3VsdCIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJTcGxpdFJlc3VsdCIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJwYXJzZV9xcyIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJwYXJzZV9xc2wiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsZGVmcmFnIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybGpvaW4iLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJscGFyc2UiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsc3BsaXQiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsdW5wYXJzZSIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmx1bnNwbGl0IiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInF1b3RlIiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJxdW90ZV9wbHVzIiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1bnF1b3RlIiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1bnF1b3RlX3BsdXMiLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybGVuY29kZSIsICJ1cmxsaWIiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgic3BsaXRxdWVyeSIsICJ1cmxsaWIiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgic3BsaXR0YWciLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInNwbGl0dXNlciIsICJ1cmxsaWIiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXNlc19mcmFnbWVudCIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1c2VzX25ldGxvYyIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1c2VzX3BhcmFtcyIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1c2VzX3F1ZXJ5IiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVzZXNfcmVsYXRpdmUiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCl0KZm9yIGF0dHIgaW4gX3VybGxpYl9wYXJzZV9tb3ZlZF9hdHRyaWJ1dGVzOgogICAgc2V0YXR0cihNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9wYXJzZSwgYXR0ci5uYW1lLCBhdHRyKQpkZWwgYXR0cgoKTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcGFyc2UuX21vdmVkX2F0dHJpYnV0ZXMgPSBfdXJsbGliX3BhcnNlX21vdmVkX2F0dHJpYnV0ZXMKCl9pbXBvcnRlci5fYWRkX21vZHVsZShNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9wYXJzZShfX25hbWVfXyArICIubW92ZXMudXJsbGliX3BhcnNlIiksCiAgICAgICAgICAgICAgICAgICAgICAibW92ZXMudXJsbGliX3BhcnNlIiwgIm1vdmVzLnVybGxpYi5wYXJzZSIpCgoKY2xhc3MgTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfZXJyb3IoX0xhenlNb2R1bGUpOgoKICAgICIiIkxhenkgbG9hZGluZyBvZiBtb3ZlZCBvYmplY3RzIGluIHNpeC5tb3Zlcy51cmxsaWJfZXJyb3IiIiIKCgpfdXJsbGliX2Vycm9yX21vdmVkX2F0dHJpYnV0ZXMgPSBbCiAgICBNb3ZlZEF0dHJpYnV0ZSgiVVJMRXJyb3IiLCAidXJsbGliMiIsICJ1cmxsaWIuZXJyb3IiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQRXJyb3IiLCAidXJsbGliMiIsICJ1cmxsaWIuZXJyb3IiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJDb250ZW50VG9vU2hvcnRFcnJvciIsICJ1cmxsaWIiLCAidXJsbGliLmVycm9yIiksCl0KZm9yIGF0dHIgaW4gX3VybGxpYl9lcnJvcl9tb3ZlZF9hdHRyaWJ1dGVzOgogICAgc2V0YXR0cihNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9lcnJvciwgYXR0ci5uYW1lLCBhdHRyKQpkZWwgYXR0cgoKTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfZXJyb3IuX21vdmVkX2F0dHJpYnV0ZXMgPSBfdXJsbGliX2Vycm9yX21vdmVkX2F0dHJpYnV0ZXMKCl9pbXBvcnRlci5fYWRkX21vZHVsZShNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9lcnJvcihfX25hbWVfXyArICIubW92ZXMudXJsbGliLmVycm9yIiksCiAgICAgICAgICAgICAgICAgICAgICAibW92ZXMudXJsbGliX2Vycm9yIiwgIm1vdmVzLnVybGxpYi5lcnJvciIpCgoKY2xhc3MgTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcmVxdWVzdChfTGF6eU1vZHVsZSk6CgogICAgIiIiTGF6eSBsb2FkaW5nIG9mIG1vdmVkIG9iamVjdHMgaW4gc2l4Lm1vdmVzLnVybGxpYl9yZXF1ZXN0IiIiCgoKX3VybGxpYl9yZXF1ZXN0X21vdmVkX2F0dHJpYnV0ZXMgPSBbCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsb3BlbiIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiaW5zdGFsbF9vcGVuZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImJ1aWxkX29wZW5lciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicGF0aG5hbWUydXJsIiwgInVybGxpYiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybDJwYXRobmFtZSIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJnZXRwcm94aWVzIiwgInVybGxpYiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlJlcXVlc3QiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIk9wZW5lckRpcmVjdG9yIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQRGVmYXVsdEVycm9ySGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUFJlZGlyZWN0SGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUENvb2tpZVByb2Nlc3NvciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiUHJveHlIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJCYXNlSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUFBhc3N3b3JkTWdyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQUGFzc3dvcmRNZ3JXaXRoRGVmYXVsdFJlYWxtIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJBYnN0cmFjdEJhc2ljQXV0aEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBCYXNpY0F1dGhIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJQcm94eUJhc2ljQXV0aEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkFic3RyYWN0RGlnZXN0QXV0aEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBEaWdlc3RBdXRoSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiUHJveHlEaWdlc3RBdXRoSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBTSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiRmlsZUhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkZUUEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkNhY2hlRlRQSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiVW5rbm93bkhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBFcnJvclByb2Nlc3NvciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJscmV0cmlldmUiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsY2xlYW51cCIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJVUkxvcGVuZXIiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiRmFuY3lVUkxvcGVuZXIiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicHJveHlfYnlwYXNzIiwgInVybGxpYiIsICJ1cmxsaWIucmVxdWVzdCIpLApdCmZvciBhdHRyIGluIF91cmxsaWJfcmVxdWVzdF9tb3ZlZF9hdHRyaWJ1dGVzOgogICAgc2V0YXR0cihNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXF1ZXN0LCBhdHRyLm5hbWUsIGF0dHIpCmRlbCBhdHRyCgpNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXF1ZXN0Ll9tb3ZlZF9hdHRyaWJ1dGVzID0gX3VybGxpYl9yZXF1ZXN0X21vdmVkX2F0dHJpYnV0ZXMKCl9pbXBvcnRlci5fYWRkX21vZHVsZShNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXF1ZXN0KF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWIucmVxdWVzdCIpLAogICAgICAgICAgICAgICAgICAgICAgIm1vdmVzLnVybGxpYl9yZXF1ZXN0IiwgIm1vdmVzLnVybGxpYi5yZXF1ZXN0IikKCgpjbGFzcyBNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXNwb25zZShfTGF6eU1vZHVsZSk6CgogICAgIiIiTGF6eSBsb2FkaW5nIG9mIG1vdmVkIG9iamVjdHMgaW4gc2l4Lm1vdmVzLnVybGxpYl9yZXNwb25zZSIiIgoKCl91cmxsaWJfcmVzcG9uc2VfbW92ZWRfYXR0cmlidXRlcyA9IFsKICAgIE1vdmVkQXR0cmlidXRlKCJhZGRiYXNlIiwgInVybGxpYiIsICJ1cmxsaWIucmVzcG9uc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJhZGRjbG9zZWhvb2siLCAidXJsbGliIiwgInVybGxpYi5yZXNwb25zZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImFkZGluZm8iLCAidXJsbGliIiwgInVybGxpYi5yZXNwb25zZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImFkZGluZm91cmwiLCAidXJsbGliIiwgInVybGxpYi5yZXNwb25zZSIpLApdCmZvciBhdHRyIGluIF91cmxsaWJfcmVzcG9uc2VfbW92ZWRfYXR0cmlidXRlczoKICAgIHNldGF0dHIoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcmVzcG9uc2UsIGF0dHIubmFtZSwgYXR0cikKZGVsIGF0dHIKCk1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3Jlc3BvbnNlLl9tb3ZlZF9hdHRyaWJ1dGVzID0gX3VybGxpYl9yZXNwb25zZV9tb3ZlZF9hdHRyaWJ1dGVzCgpfaW1wb3J0ZXIuX2FkZF9tb2R1bGUoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcmVzcG9uc2UoX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYi5yZXNwb25zZSIpLAogICAgICAgICAgICAgICAgICAgICAgIm1vdmVzLnVybGxpYl9yZXNwb25zZSIsICJtb3Zlcy51cmxsaWIucmVzcG9uc2UiKQoKCmNsYXNzIE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JvYm90cGFyc2VyKF9MYXp5TW9kdWxlKToKCiAgICAiIiJMYXp5IGxvYWRpbmcgb2YgbW92ZWQgb2JqZWN0cyBpbiBzaXgubW92ZXMudXJsbGliX3JvYm90cGFyc2VyIiIiCgoKX3VybGxpYl9yb2JvdHBhcnNlcl9tb3ZlZF9hdHRyaWJ1dGVzID0gWwogICAgTW92ZWRBdHRyaWJ1dGUoIlJvYm90RmlsZVBhcnNlciIsICJyb2JvdHBhcnNlciIsICJ1cmxsaWIucm9ib3RwYXJzZXIiKSwKXQpmb3IgYXR0ciBpbiBfdXJsbGliX3JvYm90cGFyc2VyX21vdmVkX2F0dHJpYnV0ZXM6CiAgICBzZXRhdHRyKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JvYm90cGFyc2VyLCBhdHRyLm5hbWUsIGF0dHIpCmRlbCBhdHRyCgpNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yb2JvdHBhcnNlci5fbW92ZWRfYXR0cmlidXRlcyA9IF91cmxsaWJfcm9ib3RwYXJzZXJfbW92ZWRfYXR0cmlidXRlcwoKX2ltcG9ydGVyLl9hZGRfbW9kdWxlKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JvYm90cGFyc2VyKF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWIucm9ib3RwYXJzZXIiKSwKICAgICAgICAgICAgICAgICAgICAgICJtb3Zlcy51cmxsaWJfcm9ib3RwYXJzZXIiLCAibW92ZXMudXJsbGliLnJvYm90cGFyc2VyIikKCgpjbGFzcyBNb2R1bGVfc2l4X21vdmVzX3VybGxpYih0eXBlcy5Nb2R1bGVUeXBlKToKCiAgICAiIiJDcmVhdGUgYSBzaXgubW92ZXMudXJsbGliIG5hbWVzcGFjZSB0aGF0IHJlc2VtYmxlcyB0aGUgUHl0aG9uIDMgbmFtZXNwYWNlIiIiCiAgICBfX3BhdGhfXyA9IFtdICAjIG1hcmsgYXMgcGFja2FnZQogICAgcGFyc2UgPSBfaW1wb3J0ZXIuX2dldF9tb2R1bGUoIm1vdmVzLnVybGxpYl9wYXJzZSIpCiAgICBlcnJvciA9IF9pbXBvcnRlci5fZ2V0X21vZHVsZSgibW92ZXMudXJsbGliX2Vycm9yIikKICAgIHJlcXVlc3QgPSBfaW1wb3J0ZXIuX2dldF9tb2R1bGUoIm1vdmVzLnVybGxpYl9yZXF1ZXN0IikKICAgIHJlc3BvbnNlID0gX2ltcG9ydGVyLl9nZXRfbW9kdWxlKCJtb3Zlcy51cmxsaWJfcmVzcG9uc2UiKQogICAgcm9ib3RwYXJzZXIgPSBfaW1wb3J0ZXIuX2dldF9tb2R1bGUoIm1vdmVzLnVybGxpYl9yb2JvdHBhcnNlciIpCgogICAgZGVmIF9fZGlyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIFsncGFyc2UnLCAnZXJyb3InLCAncmVxdWVzdCcsICdyZXNwb25zZScsICdyb2JvdHBhcnNlciddCgpfaW1wb3J0ZXIuX2FkZF9tb2R1bGUoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWIoX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYiIpLAogICAgICAgICAgICAgICAgICAgICAgIm1vdmVzLnVybGxpYiIpCgoKZGVmIGFkZF9tb3ZlKG1vdmUpOgogICAgIiIiQWRkIGFuIGl0ZW0gdG8gc2l4Lm1vdmVzLiIiIgogICAgc2V0YXR0cihfTW92ZWRJdGVtcywgbW92ZS5uYW1lLCBtb3ZlKQoKCmRlZiByZW1vdmVfbW92ZShuYW1lKToKICAgICIiIlJlbW92ZSBpdGVtIGZyb20gc2l4Lm1vdmVzLiIiIgogICAgdHJ5OgogICAgICAgIGRlbGF0dHIoX01vdmVkSXRlbXMsIG5hbWUpCiAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBkZWwgbW92ZXMuX19kaWN0X19bbmFtZV0KICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKCJubyBzdWNoIG1vdmUsICVyIiAlIChuYW1lLCkpCgoKaWYgUFkzOgogICAgX21ldGhfZnVuYyA9ICJfX2Z1bmNfXyIKICAgIF9tZXRoX3NlbGYgPSAiX19zZWxmX18iCgogICAgX2Z1bmNfY2xvc3VyZSA9ICJfX2Nsb3N1cmVfXyIKICAgIF9mdW5jX2NvZGUgPSAiX19jb2RlX18iCiAgICBfZnVuY19kZWZhdWx0cyA9ICJfX2RlZmF1bHRzX18iCiAgICBfZnVuY19nbG9iYWxzID0gIl9fZ2xvYmFsc19fIgplbHNlOgogICAgX21ldGhfZnVuYyA9ICJpbV9mdW5jIgogICAgX21ldGhfc2VsZiA9ICJpbV9zZWxmIgoKICAgIF9mdW5jX2Nsb3N1cmUgPSAiZnVuY19jbG9zdXJlIgogICAgX2Z1bmNfY29kZSA9ICJmdW5jX2NvZGUiCiAgICBfZnVuY19kZWZhdWx0cyA9ICJmdW5jX2RlZmF1bHRzIgogICAgX2Z1bmNfZ2xvYmFscyA9ICJmdW5jX2dsb2JhbHMiCgoKdHJ5OgogICAgYWR2YW5jZV9pdGVyYXRvciA9IG5leHQKZXhjZXB0IE5hbWVFcnJvcjoKICAgIGRlZiBhZHZhbmNlX2l0ZXJhdG9yKGl0KToKICAgICAgICByZXR1cm4gaXQubmV4dCgpCm5leHQgPSBhZHZhbmNlX2l0ZXJhdG9yCgoKdHJ5OgogICAgY2FsbGFibGUgPSBjYWxsYWJsZQpleGNlcHQgTmFtZUVycm9yOgogICAgZGVmIGNhbGxhYmxlKG9iaik6CiAgICAgICAgcmV0dXJuIGFueSgiX19jYWxsX18iIGluIGtsYXNzLl9fZGljdF9fIGZvciBrbGFzcyBpbiB0eXBlKG9iaikuX19tcm9fXykKCgppZiBQWTM6CiAgICBkZWYgZ2V0X3VuYm91bmRfZnVuY3Rpb24odW5ib3VuZCk6CiAgICAgICAgcmV0dXJuIHVuYm91bmQKCiAgICBjcmVhdGVfYm91bmRfbWV0aG9kID0gdHlwZXMuTWV0aG9kVHlwZQoKICAgIGRlZiBjcmVhdGVfdW5ib3VuZF9tZXRob2QoZnVuYywgY2xzKToKICAgICAgICByZXR1cm4gZnVuYwoKICAgIEl0ZXJhdG9yID0gb2JqZWN0CmVsc2U6CiAgICBkZWYgZ2V0X3VuYm91bmRfZnVuY3Rpb24odW5ib3VuZCk6CiAgICAgICAgcmV0dXJuIHVuYm91bmQuaW1fZnVuYwoKICAgIGRlZiBjcmVhdGVfYm91bmRfbWV0aG9kKGZ1bmMsIG9iaik6CiAgICAgICAgcmV0dXJuIHR5cGVzLk1ldGhvZFR5cGUoZnVuYywgb2JqLCBvYmouX19jbGFzc19fKQoKICAgIGRlZiBjcmVhdGVfdW5ib3VuZF9tZXRob2QoZnVuYywgY2xzKToKICAgICAgICByZXR1cm4gdHlwZXMuTWV0aG9kVHlwZShmdW5jLCBOb25lLCBjbHMpCgogICAgY2xhc3MgSXRlcmF0b3Iob2JqZWN0KToKCiAgICAgICAgZGVmIG5leHQoc2VsZik6CiAgICAgICAgICAgIHJldHVybiB0eXBlKHNlbGYpLl9fbmV4dF9fKHNlbGYpCgogICAgY2FsbGFibGUgPSBjYWxsYWJsZQpfYWRkX2RvYyhnZXRfdW5ib3VuZF9mdW5jdGlvbiwKICAgICAgICAgIiIiR2V0IHRoZSBmdW5jdGlvbiBvdXQgb2YgYSBwb3NzaWJseSB1bmJvdW5kIGZ1bmN0aW9uIiIiKQoKCmdldF9tZXRob2RfZnVuY3Rpb24gPSBvcGVyYXRvci5hdHRyZ2V0dGVyKF9tZXRoX2Z1bmMpCmdldF9tZXRob2Rfc2VsZiA9IG9wZXJhdG9yLmF0dHJnZXR0ZXIoX21ldGhfc2VsZikKZ2V0X2Z1bmN0aW9uX2Nsb3N1cmUgPSBvcGVyYXRvci5hdHRyZ2V0dGVyKF9mdW5jX2Nsb3N1cmUpCmdldF9mdW5jdGlvbl9jb2RlID0gb3BlcmF0b3IuYXR0cmdldHRlcihfZnVuY19jb2RlKQpnZXRfZnVuY3Rpb25fZGVmYXVsdHMgPSBvcGVyYXRvci5hdHRyZ2V0dGVyKF9mdW5jX2RlZmF1bHRzKQpnZXRfZnVuY3Rpb25fZ2xvYmFscyA9IG9wZXJhdG9yLmF0dHJnZXR0ZXIoX2Z1bmNfZ2xvYmFscykKCgppZiBQWTM6CiAgICBkZWYgaXRlcmtleXMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGl0ZXIoZC5rZXlzKCoqa3cpKQoKICAgIGRlZiBpdGVydmFsdWVzKGQsICoqa3cpOgogICAgICAgIHJldHVybiBpdGVyKGQudmFsdWVzKCoqa3cpKQoKICAgIGRlZiBpdGVyaXRlbXMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGl0ZXIoZC5pdGVtcygqKmt3KSkKCiAgICBkZWYgaXRlcmxpc3RzKGQsICoqa3cpOgogICAgICAgIHJldHVybiBpdGVyKGQubGlzdHMoKiprdykpCgogICAgdmlld2tleXMgPSBvcGVyYXRvci5tZXRob2RjYWxsZXIoImtleXMiKQoKICAgIHZpZXd2YWx1ZXMgPSBvcGVyYXRvci5tZXRob2RjYWxsZXIoInZhbHVlcyIpCgogICAgdmlld2l0ZW1zID0gb3BlcmF0b3IubWV0aG9kY2FsbGVyKCJpdGVtcyIpCmVsc2U6CiAgICBkZWYgaXRlcmtleXMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGQuaXRlcmtleXMoKiprdykKCiAgICBkZWYgaXRlcnZhbHVlcyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gZC5pdGVydmFsdWVzKCoqa3cpCgogICAgZGVmIGl0ZXJpdGVtcyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gZC5pdGVyaXRlbXMoKiprdykKCiAgICBkZWYgaXRlcmxpc3RzKGQsICoqa3cpOgogICAgICAgIHJldHVybiBkLml0ZXJsaXN0cygqKmt3KQoKICAgIHZpZXdrZXlzID0gb3BlcmF0b3IubWV0aG9kY2FsbGVyKCJ2aWV3a2V5cyIpCgogICAgdmlld3ZhbHVlcyA9IG9wZXJhdG9yLm1ldGhvZGNhbGxlcigidmlld3ZhbHVlcyIpCgogICAgdmlld2l0ZW1zID0gb3BlcmF0b3IubWV0aG9kY2FsbGVyKCJ2aWV3aXRlbXMiKQoKX2FkZF9kb2MoaXRlcmtleXMsICJSZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGUga2V5cyBvZiBhIGRpY3Rpb25hcnkuIikKX2FkZF9kb2MoaXRlcnZhbHVlcywgIlJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSB2YWx1ZXMgb2YgYSBkaWN0aW9uYXJ5LiIpCl9hZGRfZG9jKGl0ZXJpdGVtcywKICAgICAgICAgIlJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSAoa2V5LCB2YWx1ZSkgcGFpcnMgb2YgYSBkaWN0aW9uYXJ5LiIpCl9hZGRfZG9jKGl0ZXJsaXN0cywKICAgICAgICAgIlJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSAoa2V5LCBbdmFsdWVzXSkgcGFpcnMgb2YgYSBkaWN0aW9uYXJ5LiIpCgoKaWYgUFkzOgogICAgZGVmIGIocyk6CiAgICAgICAgcmV0dXJuIHMuZW5jb2RlKCJsYXRpbi0xIikKCiAgICBkZWYgdShzKToKICAgICAgICByZXR1cm4gcwogICAgdW5pY2hyID0gY2hyCiAgICBpbXBvcnQgc3RydWN0CiAgICBpbnQyYnl0ZSA9IHN0cnVjdC5TdHJ1Y3QoIj5CIikucGFjawogICAgZGVsIHN0cnVjdAogICAgYnl0ZTJpbnQgPSBvcGVyYXRvci5pdGVtZ2V0dGVyKDApCiAgICBpbmRleGJ5dGVzID0gb3BlcmF0b3IuZ2V0aXRlbQogICAgaXRlcmJ5dGVzID0gaXRlcgogICAgaW1wb3J0IGlvCiAgICBTdHJpbmdJTyA9IGlvLlN0cmluZ0lPCiAgICBCeXRlc0lPID0gaW8uQnl0ZXNJTwogICAgX2Fzc2VydENvdW50RXF1YWwgPSAiYXNzZXJ0Q291bnRFcXVhbCIKICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMV0gPD0gMToKICAgICAgICBfYXNzZXJ0UmFpc2VzUmVnZXggPSAiYXNzZXJ0UmFpc2VzUmVnZXhwIgogICAgICAgIF9hc3NlcnRSZWdleCA9ICJhc3NlcnRSZWdleHBNYXRjaGVzIgogICAgZWxzZToKICAgICAgICBfYXNzZXJ0UmFpc2VzUmVnZXggPSAiYXNzZXJ0UmFpc2VzUmVnZXgiCiAgICAgICAgX2Fzc2VydFJlZ2V4ID0gImFzc2VydFJlZ2V4IgplbHNlOgogICAgZGVmIGIocyk6CiAgICAgICAgcmV0dXJuIHMKICAgICMgV29ya2Fyb3VuZCBmb3Igc3RhbmRhbG9uZSBiYWNrc2xhc2gKCiAgICBkZWYgdShzKToKICAgICAgICByZXR1cm4gdW5pY29kZShzLnJlcGxhY2UocidcXCcsIHInXFxcXCcpLCAidW5pY29kZV9lc2NhcGUiKQogICAgdW5pY2hyID0gdW5pY2hyCiAgICBpbnQyYnl0ZSA9IGNocgoKICAgIGRlZiBieXRlMmludChicyk6CiAgICAgICAgcmV0dXJuIG9yZChic1swXSkKCiAgICBkZWYgaW5kZXhieXRlcyhidWYsIGkpOgogICAgICAgIHJldHVybiBvcmQoYnVmW2ldKQogICAgaXRlcmJ5dGVzID0gZnVuY3Rvb2xzLnBhcnRpYWwoaXRlcnRvb2xzLmltYXAsIG9yZCkKICAgIGltcG9ydCBTdHJpbmdJTwogICAgU3RyaW5nSU8gPSBCeXRlc0lPID0gU3RyaW5nSU8uU3RyaW5nSU8KICAgIF9hc3NlcnRDb3VudEVxdWFsID0gImFzc2VydEl0ZW1zRXF1YWwiCiAgICBfYXNzZXJ0UmFpc2VzUmVnZXggPSAiYXNzZXJ0UmFpc2VzUmVnZXhwIgogICAgX2Fzc2VydFJlZ2V4ID0gImFzc2VydFJlZ2V4cE1hdGNoZXMiCl9hZGRfZG9jKGIsICIiIkJ5dGUgbGl0ZXJhbCIiIikKX2FkZF9kb2ModSwgIiIiVGV4dCBsaXRlcmFsIiIiKQoKCmRlZiBhc3NlcnRDb3VudEVxdWFsKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICByZXR1cm4gZ2V0YXR0cihzZWxmLCBfYXNzZXJ0Q291bnRFcXVhbCkoKmFyZ3MsICoqa3dhcmdzKQoKCmRlZiBhc3NlcnRSYWlzZXNSZWdleChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgcmV0dXJuIGdldGF0dHIoc2VsZiwgX2Fzc2VydFJhaXNlc1JlZ2V4KSgqYXJncywgKiprd2FyZ3MpCgoKZGVmIGFzc2VydFJlZ2V4KHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICByZXR1cm4gZ2V0YXR0cihzZWxmLCBfYXNzZXJ0UmVnZXgpKCphcmdzLCAqKmt3YXJncykKCgppZiBQWTM6CiAgICBleGVjXyA9IGdldGF0dHIobW92ZXMuYnVpbHRpbnMsICJleGVjIikKCiAgICBkZWYgcmVyYWlzZSh0cCwgdmFsdWUsIHRiPU5vbmUpOgogICAgICAgIGlmIHZhbHVlIGlzIE5vbmU6CiAgICAgICAgICAgIHZhbHVlID0gdHAoKQogICAgICAgIGlmIHZhbHVlLl9fdHJhY2ViYWNrX18gaXMgbm90IHRiOgogICAgICAgICAgICByYWlzZSB2YWx1ZS53aXRoX3RyYWNlYmFjayh0YikKICAgICAgICByYWlzZSB2YWx1ZQoKZWxzZToKICAgIGRlZiBleGVjXyhfY29kZV8sIF9nbG9ic189Tm9uZSwgX2xvY3NfPU5vbmUpOgogICAgICAgICIiIkV4ZWN1dGUgY29kZSBpbiBhIG5hbWVzcGFjZS4iIiIKICAgICAgICBpZiBfZ2xvYnNfIGlzIE5vbmU6CiAgICAgICAgICAgIGZyYW1lID0gc3lzLl9nZXRmcmFtZSgxKQogICAgICAgICAgICBfZ2xvYnNfID0gZnJhbWUuZl9nbG9iYWxzCiAgICAgICAgICAgIGlmIF9sb2NzXyBpcyBOb25lOgogICAgICAgICAgICAgICAgX2xvY3NfID0gZnJhbWUuZl9sb2NhbHMKICAgICAgICAgICAgZGVsIGZyYW1lCiAgICAgICAgZWxpZiBfbG9jc18gaXMgTm9uZToKICAgICAgICAgICAgX2xvY3NfID0gX2dsb2JzXwogICAgICAgIGV4ZWMoIiIiZXhlYyBfY29kZV8gaW4gX2dsb2JzXywgX2xvY3NfIiIiKQoKICAgIGV4ZWNfKCIiImRlZiByZXJhaXNlKHRwLCB2YWx1ZSwgdGI9Tm9uZSk6CiAgICByYWlzZSB0cCwgdmFsdWUsIHRiCiIiIikKCgppZiBzeXMudmVyc2lvbl9pbmZvWzoyXSA9PSAoMywgMik6CiAgICBleGVjXygiIiJkZWYgcmFpc2VfZnJvbSh2YWx1ZSwgZnJvbV92YWx1ZSk6CiAgICBpZiBmcm9tX3ZhbHVlIGlzIE5vbmU6CiAgICAgICAgcmFpc2UgdmFsdWUKICAgIHJhaXNlIHZhbHVlIGZyb20gZnJvbV92YWx1ZQoiIiIpCmVsaWYgc3lzLnZlcnNpb25faW5mb1s6Ml0gPiAoMywgMik6CiAgICBleGVjXygiIiJkZWYgcmFpc2VfZnJvbSh2YWx1ZSwgZnJvbV92YWx1ZSk6CiAgICByYWlzZSB2YWx1ZSBmcm9tIGZyb21fdmFsdWUKIiIiKQplbHNlOgogICAgZGVmIHJhaXNlX2Zyb20odmFsdWUsIGZyb21fdmFsdWUpOgogICAgICAgIHJhaXNlIHZhbHVlCgoKcHJpbnRfID0gZ2V0YXR0cihtb3Zlcy5idWlsdGlucywgInByaW50IiwgTm9uZSkKaWYgcHJpbnRfIGlzIE5vbmU6CiAgICBkZWYgcHJpbnRfKCphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgIiIiVGhlIG5ldy1zdHlsZSBwcmludCBmdW5jdGlvbiBmb3IgUHl0aG9uIDIuNCBhbmQgMi41LiIiIgogICAgICAgIGZwID0ga3dhcmdzLnBvcCgiZmlsZSIsIHN5cy5zdGRvdXQpCiAgICAgICAgaWYgZnAgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGRlZiB3cml0ZShkYXRhKToKICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZGF0YSwgYmFzZXN0cmluZyk6CiAgICAgICAgICAgICAgICBkYXRhID0gc3RyKGRhdGEpCiAgICAgICAgICAgICMgSWYgdGhlIGZpbGUgaGFzIGFuIGVuY29kaW5nLCBlbmNvZGUgdW5pY29kZSB3aXRoIGl0LgogICAgICAgICAgICBpZiAoaXNpbnN0YW5jZShmcCwgZmlsZSkgYW5kCiAgICAgICAgICAgICAgICAgICAgaXNpbnN0YW5jZShkYXRhLCB1bmljb2RlKSBhbmQKICAgICAgICAgICAgICAgICAgICBmcC5lbmNvZGluZyBpcyBub3QgTm9uZSk6CiAgICAgICAgICAgICAgICBlcnJvcnMgPSBnZXRhdHRyKGZwLCAiZXJyb3JzIiwgTm9uZSkKICAgICAgICAgICAgICAgIGlmIGVycm9ycyBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgIGVycm9ycyA9ICJzdHJpY3QiCiAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5lbmNvZGUoZnAuZW5jb2RpbmcsIGVycm9ycykKICAgICAgICAgICAgZnAud3JpdGUoZGF0YSkKICAgICAgICB3YW50X3VuaWNvZGUgPSBGYWxzZQogICAgICAgIHNlcCA9IGt3YXJncy5wb3AoInNlcCIsIE5vbmUpCiAgICAgICAgaWYgc2VwIGlzIG5vdCBOb25lOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNlcCwgdW5pY29kZSk6CiAgICAgICAgICAgICAgICB3YW50X3VuaWNvZGUgPSBUcnVlCiAgICAgICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2Uoc2VwLCBzdHIpOgogICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJzZXAgbXVzdCBiZSBOb25lIG9yIGEgc3RyaW5nIikKICAgICAgICBlbmQgPSBrd2FyZ3MucG9wKCJlbmQiLCBOb25lKQogICAgICAgIGlmIGVuZCBpcyBub3QgTm9uZToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShlbmQsIHVuaWNvZGUpOgogICAgICAgICAgICAgICAgd2FudF91bmljb2RlID0gVHJ1ZQogICAgICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKGVuZCwgc3RyKToKICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiZW5kIG11c3QgYmUgTm9uZSBvciBhIHN0cmluZyIpCiAgICAgICAgaWYga3dhcmdzOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImludmFsaWQga2V5d29yZCBhcmd1bWVudHMgdG8gcHJpbnQoKSIpCiAgICAgICAgaWYgbm90IHdhbnRfdW5pY29kZToKICAgICAgICAgICAgZm9yIGFyZyBpbiBhcmdzOgogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShhcmcsIHVuaWNvZGUpOgogICAgICAgICAgICAgICAgICAgIHdhbnRfdW5pY29kZSA9IFRydWUKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgIGlmIHdhbnRfdW5pY29kZToKICAgICAgICAgICAgbmV3bGluZSA9IHVuaWNvZGUoIlxuIikKICAgICAgICAgICAgc3BhY2UgPSB1bmljb2RlKCIgIikKICAgICAgICBlbHNlOgogICAgICAgICAgICBuZXdsaW5lID0gIlxuIgogICAgICAgICAgICBzcGFjZSA9ICIgIgogICAgICAgIGlmIHNlcCBpcyBOb25lOgogICAgICAgICAgICBzZXAgPSBzcGFjZQogICAgICAgIGlmIGVuZCBpcyBOb25lOgogICAgICAgICAgICBlbmQgPSBuZXdsaW5lCiAgICAgICAgZm9yIGksIGFyZyBpbiBlbnVtZXJhdGUoYXJncyk6CiAgICAgICAgICAgIGlmIGk6CiAgICAgICAgICAgICAgICB3cml0ZShzZXApCiAgICAgICAgICAgIHdyaXRlKGFyZykKICAgICAgICB3cml0ZShlbmQpCmlmIHN5cy52ZXJzaW9uX2luZm9bOjJdIDwgKDMsIDMpOgogICAgX3ByaW50ID0gcHJpbnRfCgogICAgZGVmIHByaW50XygqYXJncywgKiprd2FyZ3MpOgogICAgICAgIGZwID0ga3dhcmdzLmdldCgiZmlsZSIsIHN5cy5zdGRvdXQpCiAgICAgICAgZmx1c2ggPSBrd2FyZ3MucG9wKCJmbHVzaCIsIEZhbHNlKQogICAgICAgIF9wcmludCgqYXJncywgKiprd2FyZ3MpCiAgICAgICAgaWYgZmx1c2ggYW5kIGZwIGlzIG5vdCBOb25lOgogICAgICAgICAgICBmcC5mbHVzaCgpCgpfYWRkX2RvYyhyZXJhaXNlLCAiIiJSZXJhaXNlIGFuIGV4Y2VwdGlvbi4iIiIpCgppZiBzeXMudmVyc2lvbl9pbmZvWzA6Ml0gPCAoMywgNCk6CiAgICBkZWYgd3JhcHMod3JhcHBlZCwgYXNzaWduZWQ9ZnVuY3Rvb2xzLldSQVBQRVJfQVNTSUdOTUVOVFMsCiAgICAgICAgICAgICAgdXBkYXRlZD1mdW5jdG9vbHMuV1JBUFBFUl9VUERBVEVTKToKICAgICAgICBkZWYgd3JhcHBlcihmKToKICAgICAgICAgICAgZiA9IGZ1bmN0b29scy53cmFwcyh3cmFwcGVkLCBhc3NpZ25lZCwgdXBkYXRlZCkoZikKICAgICAgICAgICAgZi5fX3dyYXBwZWRfXyA9IHdyYXBwZWQKICAgICAgICAgICAgcmV0dXJuIGYKICAgICAgICByZXR1cm4gd3JhcHBlcgplbHNlOgogICAgd3JhcHMgPSBmdW5jdG9vbHMud3JhcHMKCgpkZWYgd2l0aF9tZXRhY2xhc3MobWV0YSwgKmJhc2VzKToKICAgICIiIkNyZWF0ZSBhIGJhc2UgY2xhc3Mgd2l0aCBhIG1ldGFjbGFzcy4iIiIKICAgICMgVGhpcyByZXF1aXJlcyBhIGJpdCBvZiBleHBsYW5hdGlvbjogdGhlIGJhc2ljIGlkZWEgaXMgdG8gbWFrZSBhIGR1bW15CiAgICAjIG1ldGFjbGFzcyBmb3Igb25lIGxldmVsIG9mIGNsYXNzIGluc3RhbnRpYXRpb24gdGhhdCByZXBsYWNlcyBpdHNlbGYgd2l0aAogICAgIyB0aGUgYWN0dWFsIG1ldGFjbGFzcy4KICAgIGNsYXNzIG1ldGFjbGFzcyhtZXRhKToKCiAgICAgICAgZGVmIF9fbmV3X18oY2xzLCBuYW1lLCB0aGlzX2Jhc2VzLCBkKToKICAgICAgICAgICAgcmV0dXJuIG1ldGEobmFtZSwgYmFzZXMsIGQpCiAgICByZXR1cm4gdHlwZS5fX25ld19fKG1ldGFjbGFzcywgJ3RlbXBvcmFyeV9jbGFzcycsICgpLCB7fSkKCgpkZWYgYWRkX21ldGFjbGFzcyhtZXRhY2xhc3MpOgogICAgIiIiQ2xhc3MgZGVjb3JhdG9yIGZvciBjcmVhdGluZyBhIGNsYXNzIHdpdGggYSBtZXRhY2xhc3MuIiIiCiAgICBkZWYgd3JhcHBlcihjbHMpOgogICAgICAgIG9yaWdfdmFycyA9IGNscy5fX2RpY3RfXy5jb3B5KCkKICAgICAgICBzbG90cyA9IG9yaWdfdmFycy5nZXQoJ19fc2xvdHNfXycpCiAgICAgICAgaWYgc2xvdHMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2xvdHMsIHN0cik6CiAgICAgICAgICAgICAgICBzbG90cyA9IFtzbG90c10KICAgICAgICAgICAgZm9yIHNsb3RzX3ZhciBpbiBzbG90czoKICAgICAgICAgICAgICAgIG9yaWdfdmFycy5wb3Aoc2xvdHNfdmFyKQogICAgICAgIG9yaWdfdmFycy5wb3AoJ19fZGljdF9fJywgTm9uZSkKICAgICAgICBvcmlnX3ZhcnMucG9wKCdfX3dlYWtyZWZfXycsIE5vbmUpCiAgICAgICAgcmV0dXJuIG1ldGFjbGFzcyhjbHMuX19uYW1lX18sIGNscy5fX2Jhc2VzX18sIG9yaWdfdmFycykKICAgIHJldHVybiB3cmFwcGVyCgoKZGVmIHB5dGhvbl8yX3VuaWNvZGVfY29tcGF0aWJsZShrbGFzcyk6CiAgICAiIiIKICAgIEEgZGVjb3JhdG9yIHRoYXQgZGVmaW5lcyBfX3VuaWNvZGVfXyBhbmQgX19zdHJfXyBtZXRob2RzIHVuZGVyIFB5dGhvbiAyLgogICAgVW5kZXIgUHl0aG9uIDMgaXQgZG9lcyBub3RoaW5nLgoKICAgIFRvIHN1cHBvcnQgUHl0aG9uIDIgYW5kIDMgd2l0aCBhIHNpbmdsZSBjb2RlIGJhc2UsIGRlZmluZSBhIF9fc3RyX18gbWV0aG9kCiAgICByZXR1cm5pbmcgdGV4dCBhbmQgYXBwbHkgdGhpcyBkZWNvcmF0b3IgdG8gdGhlIGNsYXNzLgogICAgIiIiCiAgICBpZiBQWTI6CiAgICAgICAgaWYgJ19fc3RyX18nIG5vdCBpbiBrbGFzcy5fX2RpY3RfXzoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiQHB5dGhvbl8yX3VuaWNvZGVfY29tcGF0aWJsZSBjYW5ub3QgYmUgYXBwbGllZCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvICVzIGJlY2F1c2UgaXQgZG9lc24ndCBkZWZpbmUgX19zdHJfXygpLiIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtsYXNzLl9fbmFtZV9fKQogICAgICAgIGtsYXNzLl9fdW5pY29kZV9fID0ga2xhc3MuX19zdHJfXwogICAgICAgIGtsYXNzLl9fc3RyX18gPSBsYW1iZGEgc2VsZjogc2VsZi5fX3VuaWNvZGVfXygpLmVuY29kZSgndXRmLTgnKQogICAgcmV0dXJuIGtsYXNzCgoKIyBDb21wbGV0ZSB0aGUgbW92ZXMgaW1wbGVtZW50YXRpb24uCiMgVGhpcyBjb2RlIGlzIGF0IHRoZSBlbmQgb2YgdGhpcyBtb2R1bGUgdG8gc3BlZWQgdXAgbW9kdWxlIGxvYWRpbmcuCiMgVHVybiB0aGlzIG1vZHVsZSBpbnRvIGEgcGFja2FnZS4KX19wYXRoX18gPSBbXSAgIyByZXF1aXJlZCBmb3IgUEVQIDMwMiBhbmQgUEVQIDQ1MQpfX3BhY2thZ2VfXyA9IF9fbmFtZV9fICAjIHNlZSBQRVAgMzY2IEBSZXNlcnZlZEFzc2lnbm1lbnQKaWYgZ2xvYmFscygpLmdldCgiX19zcGVjX18iKSBpcyBub3QgTm9uZToKICAgIF9fc3BlY19fLnN1Ym1vZHVsZV9zZWFyY2hfbG9jYXRpb25zID0gW10gICMgUEVQIDQ1MSBAVW5kZWZpbmVkVmFyaWFibGUKIyBSZW1vdmUgb3RoZXIgc2l4IG1ldGEgcGF0aCBpbXBvcnRlcnMsIHNpbmNlIHRoZXkgY2F1c2UgcHJvYmxlbXMuIFRoaXMgY2FuCiMgaGFwcGVuIGlmIHNpeCBpcyByZW1vdmVkIGZyb20gc3lzLm1vZHVsZXMgYW5kIHRoZW4gcmVsb2FkZWQuIChTZXR1cHRvb2xzIGRvZXMKIyB0aGlzIGZvciBzb21lIHJlYXNvbi4pCmlmIHN5cy5tZXRhX3BhdGg6CiAgICBmb3IgaSwgaW1wb3J0ZXIgaW4gZW51bWVyYXRlKHN5cy5tZXRhX3BhdGgpOgogICAgICAgICMgSGVyZSdzIHNvbWUgcmVhbCBuYXN0aW5lc3M6IEFub3RoZXIgImluc3RhbmNlIiBvZiB0aGUgc2l4IG1vZHVsZSBtaWdodAogICAgICAgICMgYmUgZmxvYXRpbmcgYXJvdW5kLiBUaGVyZWZvcmUsIHdlIGNhbid0IHVzZSBpc2luc3RhbmNlKCkgdG8gY2hlY2sgZm9yCiAgICAgICAgIyB0aGUgc2l4IG1ldGEgcGF0aCBpbXBvcnRlciwgc2luY2UgdGhlIG90aGVyIHNpeCBpbnN0YW5jZSB3aWxsIGhhdmUKICAgICAgICAjIGluc2VydGVkIGFuIGltcG9ydGVyIHdpdGggZGlmZmVyZW50IGNsYXNzLgogICAgICAgIGlmICh0eXBlKGltcG9ydGVyKS5fX25hbWVfXyA9PSAiX1NpeE1ldGFQYXRoSW1wb3J0ZXIiIGFuZAogICAgICAgICAgICAgICAgaW1wb3J0ZXIubmFtZSA9PSBfX25hbWVfXyk6CiAgICAgICAgICAgIGRlbCBzeXMubWV0YV9wYXRoW2ldCiAgICAgICAgICAgIGJyZWFrCiAgICBkZWwgaSwgaW1wb3J0ZXIKIyBGaW5hbGx5LCBhZGQgdGhlIGltcG9ydGVyIHRvIHRoZSBtZXRhIHBhdGggaW1wb3J0IGhvb2suCnN5cy5tZXRhX3BhdGguYXBwZW5kKF9pbXBvcnRlcikKUEsDBBQAAAAAAAAAIQDznfLBwgkAAMIJAABFAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3BrZ19yZXNvdXJjZXMvZXh0ZXJuL19faW5pdF9fLnB5aW1wb3J0IHN5cwoKCmNsYXNzIFZlbmRvckltcG9ydGVyOgogICAgIiIiCiAgICBBIFBFUCAzMDIgbWV0YSBwYXRoIGltcG9ydGVyIGZvciBmaW5kaW5nIG9wdGlvbmFsbHktdmVuZG9yZWQKICAgIG9yIG90aGVyd2lzZSBuYXR1cmFsbHktaW5zdGFsbGVkIHBhY2thZ2VzIGZyb20gcm9vdF9uYW1lLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHJvb3RfbmFtZSwgdmVuZG9yZWRfbmFtZXM9KCksIHZlbmRvcl9wa2c9Tm9uZSk6CiAgICAgICAgc2VsZi5yb290X25hbWUgPSByb290X25hbWUKICAgICAgICBzZWxmLnZlbmRvcmVkX25hbWVzID0gc2V0KHZlbmRvcmVkX25hbWVzKQogICAgICAgIHNlbGYudmVuZG9yX3BrZyA9IHZlbmRvcl9wa2cgb3Igcm9vdF9uYW1lLnJlcGxhY2UoJ2V4dGVybicsICdfdmVuZG9yJykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBzZWFyY2hfcGF0aChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBTZWFyY2ggZmlyc3QgdGhlIHZlbmRvciBwYWNrYWdlIHRoZW4gYXMgYSBuYXR1cmFsIHBhY2thZ2UuCiAgICAgICAgIiIiCiAgICAgICAgeWllbGQgc2VsZi52ZW5kb3JfcGtnICsgJy4nCiAgICAgICAgeWllbGQgJycKCiAgICBkZWYgZmluZF9tb2R1bGUoc2VsZiwgZnVsbG5hbWUsIHBhdGg9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIHNlbGYgd2hlbiBmdWxsbmFtZSBzdGFydHMgd2l0aCByb290X25hbWUgYW5kIHRoZQogICAgICAgIHRhcmdldCBtb2R1bGUgaXMgb25lIHZlbmRvcmVkIHRocm91Z2ggdGhpcyBpbXBvcnRlci4KICAgICAgICAiIiIKICAgICAgICByb290LCBiYXNlLCB0YXJnZXQgPSBmdWxsbmFtZS5wYXJ0aXRpb24oc2VsZi5yb290X25hbWUgKyAnLicpCiAgICAgICAgaWYgcm9vdDoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgaWYgbm90IGFueShtYXAodGFyZ2V0LnN0YXJ0c3dpdGgsIHNlbGYudmVuZG9yZWRfbmFtZXMpKToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgbG9hZF9tb2R1bGUoc2VsZiwgZnVsbG5hbWUpOgogICAgICAgICIiIgogICAgICAgIEl0ZXJhdGUgb3ZlciB0aGUgc2VhcmNoIHBhdGggdG8gbG9jYXRlIGFuZCBsb2FkIGZ1bGxuYW1lLgogICAgICAgICIiIgogICAgICAgIHJvb3QsIGJhc2UsIHRhcmdldCA9IGZ1bGxuYW1lLnBhcnRpdGlvbihzZWxmLnJvb3RfbmFtZSArICcuJykKICAgICAgICBmb3IgcHJlZml4IGluIHNlbGYuc2VhcmNoX3BhdGg6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGV4dGFudCA9IHByZWZpeCArIHRhcmdldAogICAgICAgICAgICAgICAgX19pbXBvcnRfXyhleHRhbnQpCiAgICAgICAgICAgICAgICBtb2QgPSBzeXMubW9kdWxlc1tleHRhbnRdCiAgICAgICAgICAgICAgICBzeXMubW9kdWxlc1tmdWxsbmFtZV0gPSBtb2QKICAgICAgICAgICAgICAgICMgbXlzdGVyaW91cyBoYWNrOgogICAgICAgICAgICAgICAgIyBSZW1vdmUgdGhlIHJlZmVyZW5jZSB0byB0aGUgZXh0YW50IHBhY2thZ2UvbW9kdWxlCiAgICAgICAgICAgICAgICAjIG9uIGxhdGVyIFB5dGhvbiB2ZXJzaW9ucyB0byBjYXVzZSByZWxhdGl2ZSBpbXBvcnRzCiAgICAgICAgICAgICAgICAjIGluIHRoZSB2ZW5kb3IgcGFja2FnZSB0byByZXNvbHZlIHRoZSBzYW1lIG1vZHVsZXMKICAgICAgICAgICAgICAgICMgYXMgdGhvc2UgZ29pbmcgdGhyb3VnaCB0aGlzIGltcG9ydGVyLgogICAgICAgICAgICAgICAgaWYgcHJlZml4IGFuZCBzeXMudmVyc2lvbl9pbmZvID4gKDMsIDMpOgogICAgICAgICAgICAgICAgICAgIGRlbCBzeXMubW9kdWxlc1tleHRhbnRdCiAgICAgICAgICAgICAgICByZXR1cm4gbW9kCiAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvcigKICAgICAgICAgICAgICAgICJUaGUgJ3t0YXJnZXR9JyBwYWNrYWdlIGlzIHJlcXVpcmVkOyAiCiAgICAgICAgICAgICAgICAibm9ybWFsbHkgdGhpcyBpcyBidW5kbGVkIHdpdGggdGhpcyBwYWNrYWdlIHNvIGlmIHlvdSBnZXQgIgogICAgICAgICAgICAgICAgInRoaXMgd2FybmluZywgY29uc3VsdCB0aGUgcGFja2FnZXIgb2YgeW91ciAiCiAgICAgICAgICAgICAgICAiZGlzdHJpYnV0aW9uLiIuZm9ybWF0KCoqbG9jYWxzKCkpCiAgICAgICAgICAgICkKCiAgICBkZWYgaW5zdGFsbChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBJbnN0YWxsIHRoaXMgaW1wb3J0ZXIgaW50byBzeXMubWV0YV9wYXRoIGlmIG5vdCBhbHJlYWR5IHByZXNlbnQuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZiBub3QgaW4gc3lzLm1ldGFfcGF0aDoKICAgICAgICAgICAgc3lzLm1ldGFfcGF0aC5hcHBlbmQoc2VsZikKCgpuYW1lcyA9ICdwYWNrYWdpbmcnLCAncHlwYXJzaW5nJywgJ3NpeCcsICdhcHBkaXJzJwpWZW5kb3JJbXBvcnRlcihfX25hbWVfXywgbmFtZXMpLmluc3RhbGwoKQpQSwMEFAAAAAAAAAAhAIvAkkYuAgAALgIAAEAAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvcGtnX3Jlc291cmNlcy9weTMxY29tcGF0LnB5aW1wb3J0IG9zCmltcG9ydCBlcnJubwppbXBvcnQgc3lzCgpmcm9tIC5leHRlcm4gaW1wb3J0IHNpeAoKCmRlZiBfbWFrZWRpcnNfMzEocGF0aCwgZXhpc3Rfb2s9RmFsc2UpOgogICAgdHJ5OgogICAgICAgIG9zLm1ha2VkaXJzKHBhdGgpCiAgICBleGNlcHQgT1NFcnJvciBhcyBleGM6CiAgICAgICAgaWYgbm90IGV4aXN0X29rIG9yIGV4Yy5lcnJubyAhPSBlcnJuby5FRVhJU1Q6CiAgICAgICAgICAgIHJhaXNlCgoKIyByZWx5IG9uIGNvbXBhdGliaWxpdHkgYmVoYXZpb3IgdW50aWwgbW9kZSBjb25zaWRlcmF0aW9ucwojICBhbmQgZXhpc3RzX29rIGNvbnNpZGVyYXRpb25zIGFyZSBkaXNlbnRhbmdsZWQuCiMgU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3NldHVwdG9vbHMvcHVsbC8xMDgzI2lzc3VlY29tbWVudC0zMTUxNjg2NjMKbmVlZHNfbWFrZWRpcnMgPSAoCiAgICBzaXguUFkyIG9yCiAgICAoMywgNCkgPD0gc3lzLnZlcnNpb25faW5mbyA8ICgzLCA0LCAxKQopCm1ha2VkaXJzID0gX21ha2VkaXJzXzMxIGlmIG5lZWRzX21ha2VkaXJzIGVsc2Ugb3MubWFrZWRpcnMKUEsDBBQAAAAAAAAAIQBQ16sHNgQAADYEAABIAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMtNDQuMC4wLmRpc3QtaW5mby9MSUNFTlNFQ29weXJpZ2h0IChDKSAyMDE2IEphc29uIFIgQ29vbWJzIDxqYXJhY29AamFyYWNvLmNvbT4KClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bwp1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcwpvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8Kc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKU09GVFdBUkUuClBLAwQUAAAAAAAAACEAMZDeoHgOAAB4DgAASQAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzLTQ0LjAuMC5kaXN0LWluZm8vTUVUQURBVEFNZXRhZGF0YS1WZXJzaW9uOiAyLjEKTmFtZTogc2V0dXB0b29scwpWZXJzaW9uOiA0NC4wLjAKU3VtbWFyeTogRWFzaWx5IGRvd25sb2FkLCBidWlsZCwgaW5zdGFsbCwgdXBncmFkZSwgYW5kIHVuaW5zdGFsbCBQeXRob24gcGFja2FnZXMKSG9tZS1wYWdlOiBodHRwczovL2dpdGh1Yi5jb20vcHlwYS9zZXR1cHRvb2xzCkF1dGhvcjogUHl0aG9uIFBhY2thZ2luZyBBdXRob3JpdHkKQXV0aG9yLWVtYWlsOiBkaXN0dXRpbHMtc2lnQHB5dGhvbi5vcmcKTGljZW5zZTogVU5LTk9XTgpQcm9qZWN0LVVSTDogRG9jdW1lbnRhdGlvbiwgaHR0cHM6Ly9zZXR1cHRvb2xzLnJlYWR0aGVkb2NzLmlvLwpLZXl3b3JkczogQ1BBTiBQeVBJIGRpc3R1dGlscyBlZ2dzIHBhY2thZ2UgbWFuYWdlbWVudApQbGF0Zm9ybTogVU5LTk9XTgpDbGFzc2lmaWVyOiBEZXZlbG9wbWVudCBTdGF0dXMgOjogNSAtIFByb2R1Y3Rpb24vU3RhYmxlCkNsYXNzaWZpZXI6IEludGVuZGVkIEF1ZGllbmNlIDo6IERldmVsb3BlcnMKQ2xhc3NpZmllcjogTGljZW5zZSA6OiBPU0kgQXBwcm92ZWQgOjogTUlUIExpY2Vuc2UKQ2xhc3NpZmllcjogT3BlcmF0aW5nIFN5c3RlbSA6OiBPUyBJbmRlcGVuZGVudApDbGFzc2lmaWVyOiBQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMgpDbGFzc2lmaWVyOiBQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMi43CkNsYXNzaWZpZXI6IFByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzCkNsYXNzaWZpZXI6IFByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzLjUKQ2xhc3NpZmllcjogUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuNgpDbGFzc2lmaWVyOiBQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy43CkNsYXNzaWZpZXI6IFByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzLjgKQ2xhc3NpZmllcjogVG9waWMgOjogU29mdHdhcmUgRGV2ZWxvcG1lbnQgOjogTGlicmFyaWVzIDo6IFB5dGhvbiBNb2R1bGVzCkNsYXNzaWZpZXI6IFRvcGljIDo6IFN5c3RlbSA6OiBBcmNoaXZpbmcgOjogUGFja2FnaW5nCkNsYXNzaWZpZXI6IFRvcGljIDo6IFN5c3RlbSA6OiBTeXN0ZW1zIEFkbWluaXN0cmF0aW9uCkNsYXNzaWZpZXI6IFRvcGljIDo6IFV0aWxpdGllcwpSZXF1aXJlcy1QeXRob246ICE9My4wLiosIT0zLjEuKiwhPTMuMi4qLCE9My4zLiosIT0zLjQuKiw+PTIuNwpEZXNjcmlwdGlvbi1Db250ZW50LVR5cGU6IHRleHQveC1yc3Q7IGNoYXJzZXQ9VVRGLTgKUHJvdmlkZXMtRXh0cmE6IGNlcnRzClJlcXVpcmVzLURpc3Q6IGNlcnRpZmkgKD09MjAxNi45LjI2KSA7IGV4dHJhID09ICdjZXJ0cycKUHJvdmlkZXMtRXh0cmE6IHNzbApSZXF1aXJlcy1EaXN0OiB3aW5jZXJ0c3RvcmUgKD09MC4yKSA7IChzeXNfcGxhdGZvcm0gPT0gIndpbjMyIikgYW5kIGV4dHJhID09ICdzc2wnCgouLiBpbWFnZTo6IGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vcHlwaS92L3NldHVwdG9vbHMuc3ZnCiAgIDp0YXJnZXQ6IGh0dHBzOi8vcHlwaS5vcmcvcHJvamVjdC9zZXR1cHRvb2xzCgouLiBpbWFnZTo6IGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vcmVhZHRoZWRvY3Mvc2V0dXB0b29scy9sYXRlc3Quc3ZnCiAgICA6dGFyZ2V0OiBodHRwczovL3NldHVwdG9vbHMucmVhZHRoZWRvY3MuaW8KCi4uIGltYWdlOjogaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby90cmF2aXMvcHlwYS9zZXR1cHRvb2xzL21hc3Rlci5zdmc/bGFiZWw9TGludXglMjBDSSZsb2dvPXRyYXZpcyZsb2dvQ29sb3I9d2hpdGUKICAgOnRhcmdldDogaHR0cHM6Ly90cmF2aXMtY2kub3JnL3B5cGEvc2V0dXB0b29scwoKLi4gaW1hZ2U6OiBodHRwczovL2ltZy5zaGllbGRzLmlvL2FwcHZleW9yL2NpL3B5cGEvc2V0dXB0b29scy9tYXN0ZXIuc3ZnP2xhYmVsPVdpbmRvd3MlMjBDSSZsb2dvPWFwcHZleW9yJmxvZ29Db2xvcj13aGl0ZQogICA6dGFyZ2V0OiBodHRwczovL2NpLmFwcHZleW9yLmNvbS9wcm9qZWN0L3B5cGEvc2V0dXB0b29scy9icmFuY2gvbWFzdGVyCgouLiBpbWFnZTo6IGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vY29kZWNvdi9jL2dpdGh1Yi9weXBhL3NldHVwdG9vbHMvbWFzdGVyLnN2Zz9sb2dvPWNvZGVjb3YmbG9nb0NvbG9yPXdoaXRlCiAgIDp0YXJnZXQ6IGh0dHBzOi8vY29kZWNvdi5pby9naC9weXBhL3NldHVwdG9vbHMKCi4uIGltYWdlOjogaHR0cHM6Ly90aWRlbGlmdC5jb20vYmFkZ2VzL2dpdGh1Yi9weXBhL3NldHVwdG9vbHM/c3R5bGU9ZmxhdAogICA6dGFyZ2V0OiBodHRwczovL3RpZGVsaWZ0LmNvbS9zdWJzY3JpcHRpb24vcGtnL3B5cGktc2V0dXB0b29scz91dG1fc291cmNlPXB5cGktc2V0dXB0b29scyZ1dG1fbWVkaXVtPXJlYWRtZQoKLi4gaW1hZ2U6OiBodHRwczovL2ltZy5zaGllbGRzLmlvL3B5cGkvcHl2ZXJzaW9ucy9zZXR1cHRvb2xzLnN2ZwoKU2VlIHRoZSBgSW5zdGFsbGF0aW9uIEluc3RydWN0aW9ucwo8aHR0cHM6Ly9wYWNrYWdpbmcucHl0aG9uLm9yZy9pbnN0YWxsaW5nLz5gXyBpbiB0aGUgUHl0aG9uIFBhY2thZ2luZwpVc2VyJ3MgR3VpZGUgZm9yIGluc3RydWN0aW9ucyBvbiBpbnN0YWxsaW5nLCB1cGdyYWRpbmcsIGFuZCB1bmluc3RhbGxpbmcKU2V0dXB0b29scy4KClF1ZXN0aW9ucyBhbmQgY29tbWVudHMgc2hvdWxkIGJlIGRpcmVjdGVkIHRvIHRoZSBgZGlzdHV0aWxzLXNpZwptYWlsaW5nIGxpc3QgPGh0dHA6Ly9tYWlsLnB5dGhvbi5vcmcvcGlwZXJtYWlsL2Rpc3R1dGlscy1zaWcvPmBfLgpCdWcgcmVwb3J0cyBhbmQgZXNwZWNpYWxseSB0ZXN0ZWQgcGF0Y2hlcyBtYXkgYmUKc3VibWl0dGVkIGRpcmVjdGx5IHRvIHRoZSBgYnVnIHRyYWNrZXIKPGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3NldHVwdG9vbHMvaXNzdWVzPmBfLgoKVG8gcmVwb3J0IGEgc2VjdXJpdHkgdnVsbmVyYWJpbGl0eSwgcGxlYXNlIHVzZSB0aGUKYFRpZGVsaWZ0IHNlY3VyaXR5IGNvbnRhY3QgPGh0dHBzOi8vdGlkZWxpZnQuY29tL3NlY3VyaXR5PmBfLgpUaWRlbGlmdCB3aWxsIGNvb3JkaW5hdGUgdGhlIGZpeCBhbmQgZGlzY2xvc3VyZS4KCgpGb3IgRW50ZXJwcmlzZQo9PT09PT09PT09PT09PQoKQXZhaWxhYmxlIGFzIHBhcnQgb2YgdGhlIFRpZGVsaWZ0IFN1YnNjcmlwdGlvbi4KClNldHVwdG9vbHMgYW5kIHRoZSBtYWludGFpbmVycyBvZiB0aG91c2FuZHMgb2Ygb3RoZXIgcGFja2FnZXMgYXJlIHdvcmtpbmcgd2l0aCBUaWRlbGlmdCB0byBkZWxpdmVyIG9uZSBlbnRlcnByaXNlIHN1YnNjcmlwdGlvbiB0aGF0IGNvdmVycyBhbGwgb2YgdGhlIG9wZW4gc291cmNlIHlvdSB1c2UuCgpgTGVhcm4gbW9yZSA8aHR0cHM6Ly90aWRlbGlmdC5jb20vc3Vic2NyaXB0aW9uL3BrZy9weXBpLXNldHVwdG9vbHM/dXRtX3NvdXJjZT1weXBpLXNldHVwdG9vbHMmdXRtX21lZGl1bT1yZWZlcnJhbCZ1dG1fY2FtcGFpZ249Z2l0aHViPmBfLgoKQ29kZSBvZiBDb25kdWN0Cj09PT09PT09PT09PT09PQoKRXZlcnlvbmUgaW50ZXJhY3RpbmcgaW4gdGhlIHNldHVwdG9vbHMgcHJvamVjdCdzIGNvZGViYXNlcywgaXNzdWUgdHJhY2tlcnMsCmNoYXQgcm9vbXMsIGFuZCBtYWlsaW5nIGxpc3RzIGlzIGV4cGVjdGVkIHRvIGZvbGxvdyB0aGUKYFB5UEEgQ29kZSBvZiBDb25kdWN0IDxodHRwczovL3d3dy5weXBhLmlvL2VuL2xhdGVzdC9jb2RlLW9mLWNvbmR1Y3QvPmBfLgoKClBLAwQUAAAAAAAAACEAc8+JhSgjAAAoIwAARwAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzLTQ0LjAuMC5kaXN0LWluZm8vUkVDT1JEZWFzeV9pbnN0YWxsLnB5LHNoYTI1Nj1NREM5dnQ1QXhEc1hYNXFjS2xCejJUblc2VHB1dl9Bb2JuZmhDSjlYM1BNLDEyNgpwa2dfcmVzb3VyY2VzL19faW5pdF9fLnB5LHNoYTI1Nj0wSXNzeFhQbmFES3BZWlJyYThJbWUwSkc0aHdvc1Fsakl0R0QwYm5Ja0drLDEwODM0OQpwa2dfcmVzb3VyY2VzL3B5MzFjb21wYXQucHksc2hhMjU2PS1XUTBlNGMzUkdfYWNkaHdDM2dMaVhoUF9sZzRHNXE3WFlrWmtRZzBneFUsNTU4CnBrZ19yZXNvdXJjZXMvX3ZlbmRvci9fX2luaXRfXy5weSxzaGEyNTY9NDdERVFwajhIQlNhLV9USW1XLTVKQ2V1UWVSa201Tk1wSldaRzNoU3VGVSwwCnBrZ19yZXNvdXJjZXMvX3ZlbmRvci9hcHBkaXJzLnB5LHNoYTI1Nj1NaWV2VUV1djNsX21RSVNINVNGMHNoRGtfQk5oSEh6WWlBUHJUM0lUTjRJLDI0NzAxCnBrZ19yZXNvdXJjZXMvX3ZlbmRvci9weXBhcnNpbmcucHksc2hhMjU2PXRtcnAtbHUtcU8xaTc1WnpJTjVBMTJuS1JSRDFDbTRWcGstNUxSOXJpbXMsMjMyMDU1CnBrZ19yZXNvdXJjZXMvX3ZlbmRvci9zaXgucHksc2hhMjU2PUE2aGRKWlZqSTN0X2dlZWJaOUJ6VXZ3UnJJWG8wbGZ3elFsTTJMY0t5YXMsMzAwOTgKcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9fX2Fib3V0X18ucHksc2hhMjU2PXprY0NQVE5fNlRjTFcwTnJsZzAxNzYtUjFRUV9XVlBUbThzejFSNC1Iak0sNzIwCnBrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvX19pbml0X18ucHksc2hhMjU2PV92TmFjNVRyendzcnpiT0ZJYkYtNWNIcWNfWTJhUFQyRDd6cklSMDZCT28sNTEzCnBrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvX2NvbXBhdC5weSxzaGEyNTY9VmlfQTByQVFlSGJVLWE5WDB0dDF5UW05UnFrZ1FiRFN4elJ3OFdsVTlrQSw4NjAKcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9fc3RydWN0dXJlcy5weSxzaGEyNTY9UkltRUNKNGNfd1RsYVRZWXdaWUxIRWllYkRNYUFKbUsxb1BBUmh3MVQ1bywxNDE2CnBrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvbWFya2Vycy5weSxzaGEyNTY9dUVjQkJ0R3Z6cWx0Z25BcnFiOWM0UnJjSW5YZXpETG9zMTR6YkJIaFdKbyw4MjQ4CnBrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvcmVxdWlyZW1lbnRzLnB5LHNoYTI1Nj1TaWtMMlV5bmJzVDBxdFk5bHRxbmduZGhhX3NmbzB3NlhHRmhBaG9Tb2FRLDQzNTUKcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9zcGVjaWZpZXJzLnB5LHNoYTI1Nj1TQU1SZXJ6TzNmSzJJa0ZaQ2Faa3V3WmFMX0VHcUhOT3o0cG5pNHZobk4wLDI4MDI1CnBrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvdXRpbHMucHksc2hhMjU2PTNtNld2UG02Tk54RThya1RHbW4wcjc1Ql9HWlNHZzdpa2FmeEhzQk4xV0EsNDIxCnBrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvdmVyc2lvbi5weSxzaGEyNTY9T3dHbnhZZnIyZ2hOell4NTlxV0lCa3JLM1NuQjZuLVpmZDFYYUxwbm5NMCwxMTU1Ngpwa2dfcmVzb3VyY2VzL2V4dGVybi9fX2luaXRfXy5weSxzaGEyNTY9Y0hpRWZIdUxtbTZyczVWZV96dEJmTUk3THIzMXZzcy1ENHdrcUY1eHpsSSwyNDk4CnNldHVwdG9vbHMvX19pbml0X18ucHksc2hhMjU2PVdCcENjbjJsdmRja290YWJlYWUxVFRZb25QT2NnQ0lGM3JhRDJ6Uld6QmMsNzI4MwpzZXR1cHRvb2xzL19kZXByZWNhdGlvbl93YXJuaW5nLnB5LHNoYTI1Nj1qVTktZHRmdjZjS210UUpPWE44blAxbW03Z09OdzVrS0V0aVB0YnduWnlJLDIxOApzZXR1cHRvb2xzL19pbXAucHksc2hhMjU2PWpsb3NsT2t4clRLYm9iZ2VtZlA5NFlJSTBuaHFpSnpFMWJSbUNUWjFhNUksMjIyMwpzZXR1cHRvb2xzL2FyY2hpdmVfdXRpbC5weSxzaGEyNTY9a3c4SWJfbEtqQ2NuUEtOYlM3aDhIenRSVkswZDVSYWNVM3JfS1JkVm5tTSw2NTkyCnNldHVwdG9vbHMvYnVpbGRfbWV0YS5weSxzaGEyNTY9LTlObWo5WWRiVzR6WDNUc3NQSlpoc0VOclRhNGZ3M2s4NkptMWNkS01payw5NTk3CnNldHVwdG9vbHMvY2xpLTMyLmV4ZSxzaGEyNTY9ZGZFdW92TU5uQTJITGEzalJmTVBWaTV0azRSN2FsQ2JwVHZ1eHRDeXcwWSw2NTUzNgpzZXR1cHRvb2xzL2NsaS02NC5leGUsc2hhMjU2PUtMQUJ1NXB5cm5va0pDdjZza2pYWjZHc1hleVlIR2NxT1VUM29ISTNYcG8sNzQ3NTIKc2V0dXB0b29scy9jbGkuZXhlLHNoYTI1Nj1kZkV1b3ZNTm5BMkhMYTNqUmZNUFZpNXRrNFI3YWxDYnBUdnV4dEN5dzBZLDY1NTM2CnNldHVwdG9vbHMvY29uZmlnLnB5LHNoYTI1Nj02U0IyT1kzcWNvb09KbUdfcnNLX3MwcEtCc29yQmxEcGZNSlV5empRSUdrLDIwNTc1CnNldHVwdG9vbHMvZGVwX3V0aWwucHksc2hhMjU2PWZnaXh2QzFSN3NIM3IxM2t0eWY3TjBGQUxvcUVYTDFjQmFybU5wU0VvV2csOTM1CnNldHVwdG9vbHMvZGVwZW5kcy5weSxzaGEyNTY9cXQyUldsbEFyUnZobm04bHhzeVJwY3RoRVpZcDRHSFFnUkVsMXEwTGtGdyw1NTE3CnNldHVwdG9vbHMvZGlzdC5weSxzaGEyNTY9aHY1SVRmUGpRYms4ZUNNS1dLUnNWVUhRdndWZzRlY25CdHJJeWt0VS1RRSw0OTg1NwpzZXR1cHRvb2xzL2Vycm9ycy5weSxzaGEyNTY9TVZPY3YzODFITlNhakRnRVVXek9RNEo2QjVCSENCTVNqSGZhV2NFd0Exbyw1MjQKc2V0dXB0b29scy9leHRlbnNpb24ucHksc2hhMjU2PXVjNm5ISS1NeHdtTkNOUGJVaUJueWJTeXFocEpxamJodk9RLWVtZHZ0X0UsMTcyOQpzZXR1cHRvb2xzL2dsb2IucHksc2hhMjU2PW83NWNIck94WXN2bjg1NHRoU3hFMHg5azhKcktEdWhQX3JSWGxWQjAwUTQsNTA4NApzZXR1cHRvb2xzL2d1aS0zMi5leGUsc2hhMjU2PVhCcjBiSE1BNkhwejJzOXM5QnpqbC1Qd1hmYTluSDRpZTByRm40VjJrV0EsNjU1MzYKc2V0dXB0b29scy9ndWktNjQuZXhlLHNoYTI1Nj1hWUtNaFgxSUpMbjRVTEhnV1gwc0UweVJFVXQ2QjNURUhmX2pPdzZ5TnlFLDc1MjY0CnNldHVwdG9vbHMvZ3VpLmV4ZSxzaGEyNTY9WEJyMGJITUE2SHB6MnM5czlCempsLVB3WGZhOW5INGllMHJGbjRWMmtXQSw2NTUzNgpzZXR1cHRvb2xzL2luc3RhbGxlci5weSxzaGEyNTY9VENGUm9uUm8wMUk3OXpvLXVjZjNZbWhqOFRlblBsbWhNaWpOOTE2YWFKcyw1MzM3CnNldHVwdG9vbHMvbGF1bmNoLnB5LHNoYTI1Nj1zZDdlandoQm9jQ0R4X3dHOXJJczBPYVo4SHRtbUZVOFpDNklSX1MwTHZnLDc4NwpzZXR1cHRvb2xzL2xpYjJ0bzNfZXgucHksc2hhMjU2PXQ1ZTEyaGJSMnBpOVY0ZXpXRFRCNEpNLUFJU1VuR09rbWNuWUhlazN4amcsMjAxMwpzZXR1cHRvb2xzL21vbmtleS5weSxzaGEyNTY9RkdjOWZmZmg3Z0F4TUxGbUpzMkRXX09ZV3BCamtkYk5TMm4xNFVBSzROQSw1MjY0CnNldHVwdG9vbHMvbXN2Yy5weSxzaGEyNTY9OGJhSjZhWWdDQTRUUmRXUVFpMTg1cUI5ZG5VOEZhUDR3Z3BibWQ3Vk9Ecyw0Njc1MQpzZXR1cHRvb2xzL25hbWVzcGFjZXMucHksc2hhMjU2PUYwTnJidjhLQ1QyT3JPN3J3YTAzb200TjRHWktBbG5jZS1yci1jZ0RRYTgsMzE5OQpzZXR1cHRvb2xzL3BhY2thZ2VfaW5kZXgucHksc2hhMjU2PTZwYi1CMVBPdEh5THljQWJrREVUazRmTy1Rdjhfc1ktcmpUWGhVT29oNmssNDA2MDUKc2V0dXB0b29scy9weTI3Y29tcGF0LnB5LHNoYTI1Nj10dm1lcjBUbi13a19KdW1tQ2tvTTIyVUlqcGpMLUFROHVVaU9hcVRzOHNJLDE0OTYKc2V0dXB0b29scy9weTMxY29tcGF0LnB5LHNoYTI1Nj1oMnJ0WmdoT2Z3b0dZZDhzUTAtYXVhS2lGM1RjTDNxWDBiWDNWZXNzcWNFLDgzOApzZXR1cHRvb2xzL3B5MzNjb21wYXQucHksc2hhMjU2PVNNRjlaOHduR2ljVE9rVTF1Uk53Wl9rejVaX2JqMjlQVUJicWRxZWVOc2MsMTMzMApzZXR1cHRvb2xzL3B5MzRjb21wYXQucHksc2hhMjU2PUtZT2Q2eWJSeGpCVzhOSm1ZRDh0X1V5eVZteXNwcEZYcUhwRkxkc2xHWFUsMjQ1CnNldHVwdG9vbHMvc2FuZGJveC5weSxzaGEyNTY9OVVid2ZFTDVRWTQzNm9NSTFMdEZXb2hob1otVXp3SHZHeVpqVUhfcWhrdywxNDI3NgpzZXR1cHRvb2xzL3NjcmlwdCAoZGV2KS50bXBsLHNoYTI1Nj1SVXpRekNRVWFYdHdkTHRZSFdZYklRbU9hRVM1QnJxcTFGdlVBX3R1LTVJLDIxOApzZXR1cHRvb2xzL3NjcmlwdC50bXBsLHNoYTI1Nj1XR1R0NXBpZXpPMjdjLURieDZsNVE0VDNGZjIwQTV6Nzg3Mmh2M2FBaFlZLDEzOApzZXR1cHRvb2xzL3NpdGUtcGF0Y2gucHksc2hhMjU2PU91bWtJSE11b1NlblJTVzEzODJrS1dJMVZBd3hORTg2RTVXOGlEZDM0RlksMjMwMgpzZXR1cHRvb2xzL3NzbF9zdXBwb3J0LnB5LHNoYTI1Nj1uTGpQVUJCdzdSVFR4Nk80UkpaNWVBTUdnakpHOGJlaURia0ZYRFpwTHVNLDg0OTMKc2V0dXB0b29scy91bmljb2RlX3V0aWxzLnB5LHNoYTI1Nj1OT2laXzVoRDcyQTZ3LTR3Vmo4YXdIRk0zbjUxS213MUljX3Z4MTVYRnF3LDk5NgpzZXR1cHRvb2xzL3ZlcnNpb24ucHksc2hhMjU2PW9nX2N1WlFiMFFJNnVrS1pGZlpXUGxyMUhnSkJQUG4ydk8ybV9iSTlaVEUsMTQ0CnNldHVwdG9vbHMvd2hlZWwucHksc2hhMjU2PXpjdC1TRWo1X0xvSGc2WEVMdDJjVlJkdWxzVUVOZW5DZFMxZWtNN1RsWkEsODQ1NQpzZXR1cHRvb2xzL3dpbmRvd3Nfc3VwcG9ydC5weSxzaGEyNTY9NUdyZnFTUDItZExHSm9aVHEyZzZkQ0treVF4eGEybjVJUWlYbEpDb1lFRSw3MTQKc2V0dXB0b29scy9fdmVuZG9yL19faW5pdF9fLnB5LHNoYTI1Nj00N0RFUXBqOEhCU2EtX1RJbVctNUpDZXVRZVJrbTVOTXBKV1pHM2hTdUZVLDAKc2V0dXB0b29scy9fdmVuZG9yL29yZGVyZWRfc2V0LnB5LHNoYTI1Nj1kYmFDY3MyN2R5Tjlnbk1XR0Y1bkFfQnJWbjZRLU5yaktZSnBWOV9mZ0JzLDE1MTMwCnNldHVwdG9vbHMvX3ZlbmRvci9weXBhcnNpbmcucHksc2hhMjU2PXRtcnAtbHUtcU8xaTc1WnpJTjVBMTJuS1JSRDFDbTRWcGstNUxSOXJpbXMsMjMyMDU1CnNldHVwdG9vbHMvX3ZlbmRvci9zaXgucHksc2hhMjU2PUE2aGRKWlZqSTN0X2dlZWJaOUJ6VXZ3UnJJWG8wbGZ3elFsTTJMY0t5YXMsMzAwOTgKc2V0dXB0b29scy9fdmVuZG9yL3BhY2thZ2luZy9fX2Fib3V0X18ucHksc2hhMjU2PUNwdU1TeWgxVjdhZHc4UU1qV0trWTNMdGRxUlVrUlg0TWdKNm5GNHN0TTAsNzQ0CnNldHVwdG9vbHMvX3ZlbmRvci9wYWNrYWdpbmcvX19pbml0X18ucHksc2hhMjU2PTZlbmJwNVhnUmZqQmpzSTktYm4wMEhqSGY1VEgyMVBETU9La0pXOHh3LXcsNTYyCnNldHVwdG9vbHMvX3ZlbmRvci9wYWNrYWdpbmcvX2NvbXBhdC5weSxzaGEyNTY9VWdkbS1xY25lU2NoVzI1SnJ0TUlLZ1V4ZkVFQmNDQXo2V3JFZVhlcXo5byw4NjUKc2V0dXB0b29scy9fdmVuZG9yL3BhY2thZ2luZy9fc3RydWN0dXJlcy5weSxzaGEyNTY9cFZkOTBYY1hSR3dwWlJCX3FkRnVWRWliaENIcFhfYkw1ellyOS1OMG1jOCwxNDE2CnNldHVwdG9vbHMvX3ZlbmRvci9wYWNrYWdpbmcvbWFya2Vycy5weSxzaGEyNTY9LW1lRmw5RnI5VjhyRjVSZHV6Z2V0dDVFSEs5d0JZUlVxc3NBVjJwajBsdyw4MjY4CnNldHVwdG9vbHMvX3ZlbmRvci9wYWNrYWdpbmcvcmVxdWlyZW1lbnRzLnB5LHNoYTI1Nj0zZHdJSmVrdDhSUkdDVWJneFg4cmVlQWJnbVpZamIwd2NDUnRtSDYza3hJLDQ3NDIKc2V0dXB0b29scy9fdmVuZG9yL3BhY2thZ2luZy9zcGVjaWZpZXJzLnB5LHNoYTI1Nj0wWnpRcGNVbnZyUTZMalItbVFSTHpNcjhHNmhkUnYtbVkwVlNmX2FtRnRJLDI3Nzc4CnNldHVwdG9vbHMvX3ZlbmRvci9wYWNrYWdpbmcvdGFncy5weSxzaGEyNTY9RVBMWGhPNkdURDdfb2lXRU8xVTBsMFBrZlI4Ul94aXZwTURIWG5zVGx0cywxMjkzMwpzZXR1cHRvb2xzL192ZW5kb3IvcGFja2FnaW5nL3V0aWxzLnB5LHNoYTI1Nj1WYVRDMEVpN3pPMnhsOUFSaVdtejJZRkxGdDg5UHV1aExiQWxYTXlBR21zLDE1MjAKc2V0dXB0b29scy9fdmVuZG9yL3BhY2thZ2luZy92ZXJzaW9uLnB5LHNoYTI1Nj1OcGR3bmI4T0hlZGpfMkw4NnlpVXFzY3VqYjd3X2k1Z21TSzFQaE9BRnpnLDExOTc4CnNldHVwdG9vbHMvY29tbWFuZC9fX2luaXRfXy5weSxzaGEyNTY9UUNBdUE5d2hucThCbm9jMGJCYVM2THdfS0FVTzBEaUhZWlFYRU1ObjVoZyw1NjgKc2V0dXB0b29scy9jb21tYW5kL2FsaWFzLnB5LHNoYTI1Nj1LanBFMHN6X1NESUh2M2ZwWmNJUUstc0NrSnotU3JDNkdtdWc2YjlOa2M4LDI0MjYKc2V0dXB0b29scy9jb21tYW5kL2JkaXN0X2VnZy5weSxzaGEyNTY9bm5mVjhBaDhJUkNfSWZ2NUxvYTlGZHhMNjZNVmJ5RFh3eS1mb1A4MTB6TSwxODE4NQpzZXR1cHRvb2xzL2NvbW1hbmQvYmRpc3RfcnBtLnB5LHNoYTI1Nj1CN2wwVG56Q0diLTBuTGxtNnJTMDBqV0xrb2pBU3dWbWRoVzJ3NVF6X0FrLDE1MDgKc2V0dXB0b29scy9jb21tYW5kL2JkaXN0X3dpbmluc3QucHksc2hhMjU2PV82ZHozbHBCMXRZMjAwTHhLUExNN3Fnd1RDY2VPTWdhV0ZGLWpXMi1wbTAsNjM3CnNldHVwdG9vbHMvY29tbWFuZC9idWlsZF9jbGliLnB5LHNoYTI1Nj1iUTlhQnItNVpTTy05ZkdzR3NETHowbW5uRnRlSFVabmZ0VkxraHZIRHEwLDQ0ODQKc2V0dXB0b29scy9jb21tYW5kL2J1aWxkX2V4dC5weSxzaGEyNTY9SWI0MllVR2tzQnN3bTJtTDV4bVFQRjZOZVRBNkhjcXJ2QXRFZ0ZDdjMyQSwxMzAxOQpzZXR1cHRvb2xzL2NvbW1hbmQvYnVpbGRfcHkucHksc2hhMjU2PXlXeVlhYVM5RjNvOUpiSWN6bjA2NEE1ZzFDNV9VaUtSRHhHYVRxWWJ0TEUsOTU5NgpzZXR1cHRvb2xzL2NvbW1hbmQvZGV2ZWxvcC5weSxzaGEyNTY9TVFsbkdTNnVQMTllcksySkNOT3lRWW9ZeXF1azNQQURycXJyaW5xcUx0QSw4MTg0CnNldHVwdG9vbHMvY29tbWFuZC9kaXN0X2luZm8ucHksc2hhMjU2PTV0NmtPZnJkZ0FMVC1QM29nc3M2UEY5ay1MZXllc3VleWN1azNkVXlabkksOTYwCnNldHVwdG9vbHMvY29tbWFuZC9lYXN5X2luc3RhbGwucHksc2hhMjU2PXJRZllHalFvaG1mNXFiSURabVFWZXB4WnQ3ZURMMnRYSC1KOWxSUnR6RVEsODc1NDQKc2V0dXB0b29scy9jb21tYW5kL2VnZ19pbmZvLnB5LHNoYTI1Nj13NzNFZHhZU09rMmdzYUFpSEdMMmRackNsZG9QaXVScjJlVGZxY0Z2Q2RzLDI1NTcwCnNldHVwdG9vbHMvY29tbWFuZC9pbnN0YWxsLnB5LHNoYTI1Nj04ZG9NeGVRRURvSzRFY28wbU8yV2xYWHp6cDlRbnNHSlE3Wjd5V2taUEc4LDQ3MDUKc2V0dXB0b29scy9jb21tYW5kL2luc3RhbGxfZWdnX2luZm8ucHksc2hhMjU2PWJNZ2VJZVJpWHpRNERBR1BWMTMyOGtjandRakhqT1dVNEZuZ0FXTFY3OFEsMjIwMwpzZXR1cHRvb2xzL2NvbW1hbmQvaW5zdGFsbF9saWIucHksc2hhMjU2PXI1TnVhc2FTeHZtSXJqZ1pOajM4SXEtMVVKRzFvMW1zN0N1SHE2TUNUYlEsMzg2MgpzZXR1cHRvb2xzL2NvbW1hbmQvaW5zdGFsbF9zY3JpcHRzLnB5LHNoYTI1Nj1VRDByRVo2ODYxbVRZaElkemNzcUtuVWw4UG96b2NYV2w5VkJRMVZUV25jLDI0MzkKc2V0dXB0b29scy9jb21tYW5kL2xhdW5jaGVyIG1hbmlmZXN0LnhtbCxzaGEyNTY9eGxMYmpXckIwMXRLQzAtaGxWa09La2lTUGJ6TW1sMmVPUHRKX3VjQ25iRSw2MjgKc2V0dXB0b29scy9jb21tYW5kL3B5MzZjb21wYXQucHksc2hhMjU2PVN6alpjT3hGN3pkRlVUNDdadjJuN0FNM0g4a29EeXNfME9wUy1uOWdJZmMsNDk4NgpzZXR1cHRvb2xzL2NvbW1hbmQvcmVnaXN0ZXIucHksc2hhMjU2PWtrM0R4WENiNWxYVHZxbmhmd3gyZzZxN2l3YlVtZ1R5WFVDYUJvb0JPVWssNDY4CnNldHVwdG9vbHMvY29tbWFuZC9yb3RhdGUucHksc2hhMjU2PWNvNUMxRWtJN1AwR0dUNlRxei1UMlNJajJMQkpUWlhZRUxwbWFvNmQ0S1EsMjE2NApzZXR1cHRvb2xzL2NvbW1hbmQvc2F2ZW9wdHMucHksc2hhMjU2PXphN1FDQmNRaW1LS3JpV2NvQ2NiaHhQalV6MzBnU0I3NHp1VEw0N3hwUDQsNjU4CnNldHVwdG9vbHMvY29tbWFuZC9zZGlzdC5weSxzaGEyNTY9SUwxTGVwRDJoOHFHS09GSjNyclFWYmpOSF9RNlZpRDQwbDBRQURyNE1FVSw4MDg4CnNldHVwdG9vbHMvY29tbWFuZC9zZXRvcHQucHksc2hhMjU2PU5UV0R5eC1nakRGLXR4ZjRkTzU3N3M3TE96SFZvS1IwTXEzM3JGeGFScjgsNTA4NQpzZXR1cHRvb2xzL2NvbW1hbmQvdGVzdC5weSxzaGEyNTY9dTJrWG5nSUlkU1lxdHZ3RmxIaU42SXllMUlCNFRVNnVhZEIydWlWMXN6dyw5NjAyCnNldHVwdG9vbHMvY29tbWFuZC91cGxvYWQucHksc2hhMjU2PVhUM1lGVmZZUEFtQTVxaEdnMGV1bHVVOThmdHhSVVctUHpLY09ETUx4VXMsNDYyCnNldHVwdG9vbHMvY29tbWFuZC91cGxvYWRfZG9jcy5weSxzaGEyNTY9b1hpR3BsTV9jVUtMd0U0Q1dXdzk4UnpDdWZBdTh0QmhNQzk3R2VnRmNtcyw3MzExCnNldHVwdG9vbHMvZXh0ZXJuL19faW5pdF9fLnB5LHNoYTI1Nj00cTlndFNoQjFYRlA2Q2lzbHRzeVBxdGNmVE82Wk05THUxUUJsM2wtcW1vLDI1MTQKc2V0dXB0b29scy00NC4wLjAuZGlzdC1pbmZvL0xJQ0VOU0Usc2hhMjU2PXd5bzZ3NVd2WXlIdjBvdm5QUWFnRHcyMnE0aDlIQ0hVX3NSaEtOSUZiVm8sMTA3OApzZXR1cHRvb2xzLTQ0LjAuMC5kaXN0LWluZm8vTUVUQURBVEEsc2hhMjU2PVE1NlVtZjRWajhKWDNFNHN0UGx0bkRRclpEcW13UWNVUVBObWJvTzlIcjAsMzcwNApzZXR1cHRvb2xzLTQ0LjAuMC5kaXN0LWluZm8vV0hFRUwsc2hhMjU2PTh6TllaYndRU1hvQjlJZlhPalBmZU53dkFzQUxBamZmZ2syN0ZxdkNXYm8sMTEwCnNldHVwdG9vbHMtNDQuMC4wLmRpc3QtaW5mby9kZXBlbmRlbmN5X2xpbmtzLnR4dCxzaGEyNTY9SGxrQ0Zrb0s1VGJaNUVNTGJMS1loTGNZX0UzMWtCV0Q4VHFXMkVnbWF0USwyMzkKc2V0dXB0b29scy00NC4wLjAuZGlzdC1pbmZvL2VudHJ5X3BvaW50cy50eHQsc2hhMjU2PWZ3b2drWmVha0lmeE1OV29nN2t4Y3NianduTUFNa3BDcFF2OHgxWmpRNzAsMzIwNgpzZXR1cHRvb2xzLTQ0LjAuMC5kaXN0LWluZm8vdG9wX2xldmVsLnR4dCxzaGEyNTY9MkhVWFZWd0E0UGZmMXhnVEZyM0dzVFhYS2FQYU82dmxHNm9OSl80dTRUZywzOApzZXR1cHRvb2xzLTQ0LjAuMC5kaXN0LWluZm8vemlwLXNhZmUsc2hhMjU2PUFicEhHY2dMYi1rUnNKR253RkVrdGs3dXpwWk9DY0JZNzQtWUJkcktWR3MsMQpzZXR1cHRvb2xzLTQ0LjAuMC5kaXN0LWluZm8vUkVDT1JELCwKUEsDBBQAAAAAAAAAIQCq4Eb2bgAAAG4AAABGAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMtNDQuMC4wLmRpc3QtaW5mby9XSEVFTFdoZWVsLVZlcnNpb246IDEuMApHZW5lcmF0b3I6IGJkaXN0X3doZWVsICgwLjMzLjYpClJvb3QtSXMtUHVyZWxpYjogdHJ1ZQpUYWc6IHB5Mi1ub25lLWFueQpUYWc6IHB5My1ub25lLWFueQoKUEsDBBQAAAAAAAAAIQA32V/d7wAAAO8AAABVAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMtNDQuMC4wLmRpc3QtaW5mby9kZXBlbmRlbmN5X2xpbmtzLnR4dGh0dHBzOi8vZmlsZXMucHl0aG9uaG9zdGVkLm9yZy9wYWNrYWdlcy9zb3VyY2UvYy9jZXJ0aWZpL2NlcnRpZmktMjAxNi45LjI2LnRhci5neiNtZDU9YmFhODFlOTUxYTI5OTU4NTYzNjg5ZDg2OGVmMTA2NGQKaHR0cHM6Ly9maWxlcy5weXRob25ob3N0ZWQub3JnL3BhY2thZ2VzL3NvdXJjZS93L3dpbmNlcnRzdG9yZS93aW5jZXJ0c3RvcmUtMC4yLnppcCNtZDU9YWU3MjhmMmYwMDcxODU2NDhkMGM3YTg2NzliMzYxZTIKUEsDBBQAAAAAAAAAIQCsdR8IhgwAAIYMAABRAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMtNDQuMC4wLmRpc3QtaW5mby9lbnRyeV9wb2ludHMudHh0W2NvbnNvbGVfc2NyaXB0c10KZWFzeV9pbnN0YWxsID0gc2V0dXB0b29scy5jb21tYW5kLmVhc3lfaW5zdGFsbDptYWluCmVhc3lfaW5zdGFsbC0zLjggPSBzZXR1cHRvb2xzLmNvbW1hbmQuZWFzeV9pbnN0YWxsOm1haW4KCltkaXN0dXRpbHMuY29tbWFuZHNdCmFsaWFzID0gc2V0dXB0b29scy5jb21tYW5kLmFsaWFzOmFsaWFzCmJkaXN0X2VnZyA9IHNldHVwdG9vbHMuY29tbWFuZC5iZGlzdF9lZ2c6YmRpc3RfZWdnCmJkaXN0X3JwbSA9IHNldHVwdG9vbHMuY29tbWFuZC5iZGlzdF9ycG06YmRpc3RfcnBtCmJkaXN0X3dpbmluc3QgPSBzZXR1cHRvb2xzLmNvbW1hbmQuYmRpc3Rfd2luaW5zdDpiZGlzdF93aW5pbnN0CmJ1aWxkX2NsaWIgPSBzZXR1cHRvb2xzLmNvbW1hbmQuYnVpbGRfY2xpYjpidWlsZF9jbGliCmJ1aWxkX2V4dCA9IHNldHVwdG9vbHMuY29tbWFuZC5idWlsZF9leHQ6YnVpbGRfZXh0CmJ1aWxkX3B5ID0gc2V0dXB0b29scy5jb21tYW5kLmJ1aWxkX3B5OmJ1aWxkX3B5CmRldmVsb3AgPSBzZXR1cHRvb2xzLmNvbW1hbmQuZGV2ZWxvcDpkZXZlbG9wCmRpc3RfaW5mbyA9IHNldHVwdG9vbHMuY29tbWFuZC5kaXN0X2luZm86ZGlzdF9pbmZvCmVhc3lfaW5zdGFsbCA9IHNldHVwdG9vbHMuY29tbWFuZC5lYXN5X2luc3RhbGw6ZWFzeV9pbnN0YWxsCmVnZ19pbmZvID0gc2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvOmVnZ19pbmZvCmluc3RhbGwgPSBzZXR1cHRvb2xzLmNvbW1hbmQuaW5zdGFsbDppbnN0YWxsCmluc3RhbGxfZWdnX2luZm8gPSBzZXR1cHRvb2xzLmNvbW1hbmQuaW5zdGFsbF9lZ2dfaW5mbzppbnN0YWxsX2VnZ19pbmZvCmluc3RhbGxfbGliID0gc2V0dXB0b29scy5jb21tYW5kLmluc3RhbGxfbGliOmluc3RhbGxfbGliCmluc3RhbGxfc2NyaXB0cyA9IHNldHVwdG9vbHMuY29tbWFuZC5pbnN0YWxsX3NjcmlwdHM6aW5zdGFsbF9zY3JpcHRzCnJvdGF0ZSA9IHNldHVwdG9vbHMuY29tbWFuZC5yb3RhdGU6cm90YXRlCnNhdmVvcHRzID0gc2V0dXB0b29scy5jb21tYW5kLnNhdmVvcHRzOnNhdmVvcHRzCnNkaXN0ID0gc2V0dXB0b29scy5jb21tYW5kLnNkaXN0OnNkaXN0CnNldG9wdCA9IHNldHVwdG9vbHMuY29tbWFuZC5zZXRvcHQ6c2V0b3B0CnRlc3QgPSBzZXR1cHRvb2xzLmNvbW1hbmQudGVzdDp0ZXN0CnVwbG9hZF9kb2NzID0gc2V0dXB0b29scy5jb21tYW5kLnVwbG9hZF9kb2NzOnVwbG9hZF9kb2NzCgpbZGlzdHV0aWxzLnNldHVwX2tleXdvcmRzXQpjb252ZXJ0XzJ0bzNfZG9jdGVzdHMgPSBzZXR1cHRvb2xzLmRpc3Q6YXNzZXJ0X3N0cmluZ19saXN0CmRlcGVuZGVuY3lfbGlua3MgPSBzZXR1cHRvb2xzLmRpc3Q6YXNzZXJ0X3N0cmluZ19saXN0CmVhZ2VyX3Jlc291cmNlcyA9IHNldHVwdG9vbHMuZGlzdDphc3NlcnRfc3RyaW5nX2xpc3QKZW50cnlfcG9pbnRzID0gc2V0dXB0b29scy5kaXN0OmNoZWNrX2VudHJ5X3BvaW50cwpleGNsdWRlX3BhY2thZ2VfZGF0YSA9IHNldHVwdG9vbHMuZGlzdDpjaGVja19wYWNrYWdlX2RhdGEKZXh0cmFzX3JlcXVpcmUgPSBzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfZXh0cmFzCmluY2x1ZGVfcGFja2FnZV9kYXRhID0gc2V0dXB0b29scy5kaXN0OmFzc2VydF9ib29sCmluc3RhbGxfcmVxdWlyZXMgPSBzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfcmVxdWlyZW1lbnRzCm5hbWVzcGFjZV9wYWNrYWdlcyA9IHNldHVwdG9vbHMuZGlzdDpjaGVja19uc3AKcGFja2FnZV9kYXRhID0gc2V0dXB0b29scy5kaXN0OmNoZWNrX3BhY2thZ2VfZGF0YQpwYWNrYWdlcyA9IHNldHVwdG9vbHMuZGlzdDpjaGVja19wYWNrYWdlcwpweXRob25fcmVxdWlyZXMgPSBzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfc3BlY2lmaWVyCnNldHVwX3JlcXVpcmVzID0gc2V0dXB0b29scy5kaXN0OmNoZWNrX3JlcXVpcmVtZW50cwp0ZXN0X2xvYWRlciA9IHNldHVwdG9vbHMuZGlzdDpjaGVja19pbXBvcnRhYmxlCnRlc3RfcnVubmVyID0gc2V0dXB0b29scy5kaXN0OmNoZWNrX2ltcG9ydGFibGUKdGVzdF9zdWl0ZSA9IHNldHVwdG9vbHMuZGlzdDpjaGVja190ZXN0X3N1aXRlCnRlc3RzX3JlcXVpcmUgPSBzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfcmVxdWlyZW1lbnRzCnVzZV8ydG8zID0gc2V0dXB0b29scy5kaXN0OmFzc2VydF9ib29sCnVzZV8ydG8zX2V4Y2x1ZGVfZml4ZXJzID0gc2V0dXB0b29scy5kaXN0OmFzc2VydF9zdHJpbmdfbGlzdAp1c2VfMnRvM19maXhlcnMgPSBzZXR1cHRvb2xzLmRpc3Q6YXNzZXJ0X3N0cmluZ19saXN0CnppcF9zYWZlID0gc2V0dXB0b29scy5kaXN0OmFzc2VydF9ib29sCgpbZWdnX2luZm8ud3JpdGVyc10KUEtHLUlORk8gPSBzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm86d3JpdGVfcGtnX2luZm8KZGVwZW5kZW5jeV9saW5rcy50eHQgPSBzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm86b3ZlcndyaXRlX2FyZwpkZXBlbmRzLnR4dCA9IHNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbzp3YXJuX2RlcGVuZHNfb2Jzb2xldGUKZWFnZXJfcmVzb3VyY2VzLnR4dCA9IHNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbzpvdmVyd3JpdGVfYXJnCmVudHJ5X3BvaW50cy50eHQgPSBzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm86d3JpdGVfZW50cmllcwpuYW1lc3BhY2VfcGFja2FnZXMudHh0ID0gc2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvOm92ZXJ3cml0ZV9hcmcKcmVxdWlyZXMudHh0ID0gc2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvOndyaXRlX3JlcXVpcmVtZW50cwp0b3BfbGV2ZWwudHh0ID0gc2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvOndyaXRlX3RvcGxldmVsX25hbWVzCgpbc2V0dXB0b29scy5maW5hbGl6ZV9kaXN0cmlidXRpb25fb3B0aW9uc10KMnRvM19kb2N0ZXN0cyA9IHNldHVwdG9vbHMuZGlzdDpEaXN0cmlidXRpb24uX2ZpbmFsaXplXzJ0bzNfZG9jdGVzdHMKZmVhdHVyZXMgPSBzZXR1cHRvb2xzLmRpc3Q6RGlzdHJpYnV0aW9uLl9maW5hbGl6ZV9mZWF0dXJlX29wdHMKa2V5d29yZHMgPSBzZXR1cHRvb2xzLmRpc3Q6RGlzdHJpYnV0aW9uLl9maW5hbGl6ZV9zZXR1cF9rZXl3b3JkcwpwYXJlbnRfZmluYWxpemUgPSBzZXR1cHRvb2xzLmRpc3Q6X0Rpc3RyaWJ1dGlvbi5maW5hbGl6ZV9vcHRpb25zCgpbc2V0dXB0b29scy5pbnN0YWxsYXRpb25dCmVnZ3NlY3V0YWJsZSA9IHNldHVwdG9vbHMuY29tbWFuZC5lYXN5X2luc3RhbGw6Ym9vdHN0cmFwCgpQSwMEFAAAAAAAAAAhADBcAZEmAAAAJgAAAE4AAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy00NC4wLjAuZGlzdC1pbmZvL3RvcF9sZXZlbC50eHRlYXN5X2luc3RhbGwKcGtnX3Jlc291cmNlcwpzZXR1cHRvb2xzClBLAwQUAAAAAAAAACEAkwbXMgEAAAABAAAASQAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzLTQ0LjAuMC5kaXN0LWluZm8vemlwLXNhZmUKUEsDBBQAAAAAAAAAIQDRwN/qcxwAAHMcAAA7AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvX19pbml0X18ucHkiIiJFeHRlbnNpb25zIHRvIHRoZSAnZGlzdHV0aWxzJyBmb3IgbGFyZ2Ugb3IgY29tcGxleCBkaXN0cmlidXRpb25zIiIiCgppbXBvcnQgb3MKaW1wb3J0IHN5cwppbXBvcnQgZnVuY3Rvb2xzCmltcG9ydCBkaXN0dXRpbHMuY29yZQppbXBvcnQgZGlzdHV0aWxzLmZpbGVsaXN0CmltcG9ydCByZQpmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc09wdGlvbkVycm9yCmZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGNvbnZlcnRfcGF0aApmcm9tIGZubWF0Y2ggaW1wb3J0IGZubWF0Y2hjYXNlCgpmcm9tIC5fZGVwcmVjYXRpb25fd2FybmluZyBpbXBvcnQgU2V0dXB0b29sc0RlcHJlY2F0aW9uV2FybmluZwoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5zaXggaW1wb3J0IFBZMywgc3RyaW5nX3R5cGVzCmZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4Lm1vdmVzIGltcG9ydCBmaWx0ZXIsIG1hcAoKaW1wb3J0IHNldHVwdG9vbHMudmVyc2lvbgpmcm9tIHNldHVwdG9vbHMuZXh0ZW5zaW9uIGltcG9ydCBFeHRlbnNpb24KZnJvbSBzZXR1cHRvb2xzLmRpc3QgaW1wb3J0IERpc3RyaWJ1dGlvbiwgRmVhdHVyZQpmcm9tIHNldHVwdG9vbHMuZGVwZW5kcyBpbXBvcnQgUmVxdWlyZQpmcm9tIC4gaW1wb3J0IG1vbmtleQoKX19tZXRhY2xhc3NfXyA9IHR5cGUKCgpfX2FsbF9fID0gWwogICAgJ3NldHVwJywgJ0Rpc3RyaWJ1dGlvbicsICdGZWF0dXJlJywgJ0NvbW1hbmQnLCAnRXh0ZW5zaW9uJywgJ1JlcXVpcmUnLAogICAgJ1NldHVwdG9vbHNEZXByZWNhdGlvbldhcm5pbmcnLAogICAgJ2ZpbmRfcGFja2FnZXMnCl0KCmlmIFBZMzoKICBfX2FsbF9fLmFwcGVuZCgnZmluZF9uYW1lc3BhY2VfcGFja2FnZXMnKQoKX192ZXJzaW9uX18gPSBzZXR1cHRvb2xzLnZlcnNpb24uX192ZXJzaW9uX18KCmJvb3RzdHJhcF9pbnN0YWxsX2Zyb20gPSBOb25lCgojIElmIHdlIHJ1biAydG8zIG9uIC5weSBmaWxlcywgc2hvdWxkIHdlIGFsc28gY29udmVydCBkb2NzdHJpbmdzPwojIERlZmF1bHQ6IHllczsgYXNzdW1lIHRoYXQgd2UgY2FuIGRldGVjdCBkb2N0ZXN0cyByZWxpYWJseQpydW5fMnRvM19vbl9kb2N0ZXN0cyA9IFRydWUKIyBTdGFuZGFyZCBwYWNrYWdlIG5hbWVzIGZvciBmaXhlciBwYWNrYWdlcwpsaWIydG8zX2ZpeGVyX3BhY2thZ2VzID0gWydsaWIydG8zLmZpeGVzJ10KCgpjbGFzcyBQYWNrYWdlRmluZGVyOgogICAgIiIiCiAgICBHZW5lcmF0ZSBhIGxpc3Qgb2YgYWxsIFB5dGhvbiBwYWNrYWdlcyBmb3VuZCB3aXRoaW4gYSBkaXJlY3RvcnkKICAgICIiIgoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGZpbmQoY2xzLCB3aGVyZT0nLicsIGV4Y2x1ZGU9KCksIGluY2x1ZGU9KCcqJywpKToKICAgICAgICAiIiJSZXR1cm4gYSBsaXN0IGFsbCBQeXRob24gcGFja2FnZXMgZm91bmQgd2l0aGluIGRpcmVjdG9yeSAnd2hlcmUnCgogICAgICAgICd3aGVyZScgaXMgdGhlIHJvb3QgZGlyZWN0b3J5IHdoaWNoIHdpbGwgYmUgc2VhcmNoZWQgZm9yIHBhY2thZ2VzLiAgSXQKICAgICAgICBzaG91bGQgYmUgc3VwcGxpZWQgYXMgYSAiY3Jvc3MtcGxhdGZvcm0iIChpLmUuIFVSTC1zdHlsZSkgcGF0aDsgaXQgd2lsbAogICAgICAgIGJlIGNvbnZlcnRlZCB0byB0aGUgYXBwcm9wcmlhdGUgbG9jYWwgcGF0aCBzeW50YXguCgogICAgICAgICdleGNsdWRlJyBpcyBhIHNlcXVlbmNlIG9mIHBhY2thZ2UgbmFtZXMgdG8gZXhjbHVkZTsgJyonIGNhbiBiZSB1c2VkCiAgICAgICAgYXMgYSB3aWxkY2FyZCBpbiB0aGUgbmFtZXMsIHN1Y2ggdGhhdCAnZm9vLionIHdpbGwgZXhjbHVkZSBhbGwKICAgICAgICBzdWJwYWNrYWdlcyBvZiAnZm9vJyAoYnV0IG5vdCAnZm9vJyBpdHNlbGYpLgoKICAgICAgICAnaW5jbHVkZScgaXMgYSBzZXF1ZW5jZSBvZiBwYWNrYWdlIG5hbWVzIHRvIGluY2x1ZGUuICBJZiBpdCdzCiAgICAgICAgc3BlY2lmaWVkLCBvbmx5IHRoZSBuYW1lZCBwYWNrYWdlcyB3aWxsIGJlIGluY2x1ZGVkLiAgSWYgaXQncyBub3QKICAgICAgICBzcGVjaWZpZWQsIGFsbCBmb3VuZCBwYWNrYWdlcyB3aWxsIGJlIGluY2x1ZGVkLiAgJ2luY2x1ZGUnIGNhbiBjb250YWluCiAgICAgICAgc2hlbGwgc3R5bGUgd2lsZGNhcmQgcGF0dGVybnMganVzdCBsaWtlICdleGNsdWRlJy4KICAgICAgICAiIiIKCiAgICAgICAgcmV0dXJuIGxpc3QoY2xzLl9maW5kX3BhY2thZ2VzX2l0ZXIoCiAgICAgICAgICAgIGNvbnZlcnRfcGF0aCh3aGVyZSksCiAgICAgICAgICAgIGNscy5fYnVpbGRfZmlsdGVyKCdlel9zZXR1cCcsICcqX19weWNhY2hlX18nLCAqZXhjbHVkZSksCiAgICAgICAgICAgIGNscy5fYnVpbGRfZmlsdGVyKCppbmNsdWRlKSkpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX2ZpbmRfcGFja2FnZXNfaXRlcihjbHMsIHdoZXJlLCBleGNsdWRlLCBpbmNsdWRlKToKICAgICAgICAiIiIKICAgICAgICBBbGwgdGhlIHBhY2thZ2VzIGZvdW5kIGluICd3aGVyZScgdGhhdCBwYXNzIHRoZSAnaW5jbHVkZScgZmlsdGVyLCBidXQKICAgICAgICBub3QgdGhlICdleGNsdWRlJyBmaWx0ZXIuCiAgICAgICAgIiIiCiAgICAgICAgZm9yIHJvb3QsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsod2hlcmUsIGZvbGxvd2xpbmtzPVRydWUpOgogICAgICAgICAgICAjIENvcHkgZGlycyB0byBpdGVyYXRlIG92ZXIgaXQsIHRoZW4gZW1wdHkgZGlycy4KICAgICAgICAgICAgYWxsX2RpcnMgPSBkaXJzWzpdCiAgICAgICAgICAgIGRpcnNbOl0gPSBbXQoKICAgICAgICAgICAgZm9yIGRpciBpbiBhbGxfZGlyczoKICAgICAgICAgICAgICAgIGZ1bGxfcGF0aCA9IG9zLnBhdGguam9pbihyb290LCBkaXIpCiAgICAgICAgICAgICAgICByZWxfcGF0aCA9IG9zLnBhdGgucmVscGF0aChmdWxsX3BhdGgsIHdoZXJlKQogICAgICAgICAgICAgICAgcGFja2FnZSA9IHJlbF9wYXRoLnJlcGxhY2Uob3MucGF0aC5zZXAsICcuJykKCiAgICAgICAgICAgICAgICAjIFNraXAgZGlyZWN0b3J5IHRyZWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBwYWNrYWdlcwogICAgICAgICAgICAgICAgaWYgKCcuJyBpbiBkaXIgb3Igbm90IGNscy5fbG9va3NfbGlrZV9wYWNrYWdlKGZ1bGxfcGF0aCkpOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICAgICAgIyBTaG91bGQgdGhpcyBwYWNrYWdlIGJlIGluY2x1ZGVkPwogICAgICAgICAgICAgICAgaWYgaW5jbHVkZShwYWNrYWdlKSBhbmQgbm90IGV4Y2x1ZGUocGFja2FnZSk6CiAgICAgICAgICAgICAgICAgICAgeWllbGQgcGFja2FnZQoKICAgICAgICAgICAgICAgICMgS2VlcCBzZWFyY2hpbmcgc3ViZGlyZWN0b3JpZXMsIGFzIHRoZXJlIG1heSBiZSBtb3JlIHBhY2thZ2VzCiAgICAgICAgICAgICAgICAjIGRvd24gdGhlcmUsIGV2ZW4gaWYgdGhlIHBhcmVudCB3YXMgZXhjbHVkZWQuCiAgICAgICAgICAgICAgICBkaXJzLmFwcGVuZChkaXIpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9sb29rc19saWtlX3BhY2thZ2UocGF0aCk6CiAgICAgICAgIiIiRG9lcyBhIGRpcmVjdG9yeSBsb29rIGxpa2UgYSBwYWNrYWdlPyIiIgogICAgICAgIHJldHVybiBvcy5wYXRoLmlzZmlsZShvcy5wYXRoLmpvaW4ocGF0aCwgJ19faW5pdF9fLnB5JykpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9idWlsZF9maWx0ZXIoKnBhdHRlcm5zKToKICAgICAgICAiIiIKICAgICAgICBHaXZlbiBhIGxpc3Qgb2YgcGF0dGVybnMsIHJldHVybiBhIGNhbGxhYmxlIHRoYXQgd2lsbCBiZSB0cnVlIG9ubHkgaWYKICAgICAgICB0aGUgaW5wdXQgbWF0Y2hlcyBhdCBsZWFzdCBvbmUgb2YgdGhlIHBhdHRlcm5zLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBsYW1iZGEgbmFtZTogYW55KGZubWF0Y2hjYXNlKG5hbWUsIHBhdD1wYXQpIGZvciBwYXQgaW4gcGF0dGVybnMpCgoKY2xhc3MgUEVQNDIwUGFja2FnZUZpbmRlcihQYWNrYWdlRmluZGVyKToKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfbG9va3NfbGlrZV9wYWNrYWdlKHBhdGgpOgogICAgICAgIHJldHVybiBUcnVlCgoKZmluZF9wYWNrYWdlcyA9IFBhY2thZ2VGaW5kZXIuZmluZAoKaWYgUFkzOgogIGZpbmRfbmFtZXNwYWNlX3BhY2thZ2VzID0gUEVQNDIwUGFja2FnZUZpbmRlci5maW5kCgoKZGVmIF9pbnN0YWxsX3NldHVwX3JlcXVpcmVzKGF0dHJzKToKICAgICMgTm90ZTogZG8gbm90IHVzZSBgc2V0dXB0b29scy5EaXN0cmlidXRpb25gIGRpcmVjdGx5LCBhcwogICAgIyBvdXIgUEVQIDUxNyBiYWNrZW5kIHBhdGNoIGBkaXN0dXRpbHMuY29yZS5EaXN0cmlidXRpb25gLgogICAgZGlzdCA9IGRpc3R1dGlscy5jb3JlLkRpc3RyaWJ1dGlvbihkaWN0KAogICAgICAgIChrLCB2KSBmb3IgaywgdiBpbiBhdHRycy5pdGVtcygpCiAgICAgICAgaWYgayBpbiAoJ2RlcGVuZGVuY3lfbGlua3MnLCAnc2V0dXBfcmVxdWlyZXMnKQogICAgKSkKICAgICMgSG9ub3Igc2V0dXAuY2ZnJ3Mgb3B0aW9ucy4KICAgIGRpc3QucGFyc2VfY29uZmlnX2ZpbGVzKGlnbm9yZV9vcHRpb25fZXJyb3JzPVRydWUpCiAgICBpZiBkaXN0LnNldHVwX3JlcXVpcmVzOgogICAgICAgIGRpc3QuZmV0Y2hfYnVpbGRfZWdncyhkaXN0LnNldHVwX3JlcXVpcmVzKQoKCmRlZiBzZXR1cCgqKmF0dHJzKToKICAgICMgTWFrZSBzdXJlIHdlIGhhdmUgYW55IHJlcXVpcmVtZW50cyBuZWVkZWQgdG8gaW50ZXJwcmV0ICdhdHRycycuCiAgICBfaW5zdGFsbF9zZXR1cF9yZXF1aXJlcyhhdHRycykKICAgIHJldHVybiBkaXN0dXRpbHMuY29yZS5zZXR1cCgqKmF0dHJzKQoKc2V0dXAuX19kb2NfXyA9IGRpc3R1dGlscy5jb3JlLnNldHVwLl9fZG9jX18KCgpfQ29tbWFuZCA9IG1vbmtleS5nZXRfdW5wYXRjaGVkKGRpc3R1dGlscy5jb3JlLkNvbW1hbmQpCgoKY2xhc3MgQ29tbWFuZChfQ29tbWFuZCk6CiAgICBfX2RvY19fID0gX0NvbW1hbmQuX19kb2NfXwoKICAgIGNvbW1hbmRfY29uc3VtZXNfYXJndW1lbnRzID0gRmFsc2UKCiAgICBkZWYgX19pbml0X18oc2VsZiwgZGlzdCwgKiprdyk6CiAgICAgICAgIiIiCiAgICAgICAgQ29uc3RydWN0IHRoZSBjb21tYW5kIGZvciBkaXN0LCB1cGRhdGluZwogICAgICAgIHZhcnMoc2VsZikgd2l0aCBhbnkga2V5d29yZCBwYXJhbWV0ZXJzLgogICAgICAgICIiIgogICAgICAgIF9Db21tYW5kLl9faW5pdF9fKHNlbGYsIGRpc3QpCiAgICAgICAgdmFycyhzZWxmKS51cGRhdGUoa3cpCgogICAgZGVmIF9lbnN1cmVfc3RyaW5nbGlrZShzZWxmLCBvcHRpb24sIHdoYXQsIGRlZmF1bHQ9Tm9uZSk6CiAgICAgICAgdmFsID0gZ2V0YXR0cihzZWxmLCBvcHRpb24pCiAgICAgICAgaWYgdmFsIGlzIE5vbmU6CiAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgb3B0aW9uLCBkZWZhdWx0KQogICAgICAgICAgICByZXR1cm4gZGVmYXVsdAogICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2UodmFsLCBzdHJpbmdfdHlwZXMpOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigiJyVzJyBtdXN0IGJlIGEgJXMgKGdvdCBgJXNgKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAob3B0aW9uLCB3aGF0LCB2YWwpKQogICAgICAgIHJldHVybiB2YWwKCiAgICBkZWYgZW5zdXJlX3N0cmluZ19saXN0KHNlbGYsIG9wdGlvbik6CiAgICAgICAgciIiIkVuc3VyZSB0aGF0ICdvcHRpb24nIGlzIGEgbGlzdCBvZiBzdHJpbmdzLiAgSWYgJ29wdGlvbicgaXMKICAgICAgICBjdXJyZW50bHkgYSBzdHJpbmcsIHdlIHNwbGl0IGl0IGVpdGhlciBvbiAvLFxzKi8gb3IgL1xzKy8sIHNvCiAgICAgICAgImZvbyBiYXIgYmF6IiwgImZvbyxiYXIsYmF6IiwgYW5kICJmb28sICAgYmFyIGJheiIgYWxsIGJlY29tZQogICAgICAgIFsiZm9vIiwgImJhciIsICJiYXoiXS4KICAgICAgICAiIiIKICAgICAgICB2YWwgPSBnZXRhdHRyKHNlbGYsIG9wdGlvbikKICAgICAgICBpZiB2YWwgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKHZhbCwgc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBvcHRpb24sIHJlLnNwbGl0KHInLFxzKnxccysnLCB2YWwpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsLCBsaXN0KToKICAgICAgICAgICAgICAgIG9rID0gYWxsKGlzaW5zdGFuY2Uodiwgc3RyaW5nX3R5cGVzKSBmb3IgdiBpbiB2YWwpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBvayA9IEZhbHNlCiAgICAgICAgICAgIGlmIG5vdCBvazoKICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKAogICAgICAgICAgICAgICAgICAgICAgIiclcycgbXVzdCBiZSBhIGxpc3Qgb2Ygc3RyaW5ncyAoZ290ICVyKSIKICAgICAgICAgICAgICAgICAgICAgICUgKG9wdGlvbiwgdmFsKSkKCiAgICBkZWYgcmVpbml0aWFsaXplX2NvbW1hbmQoc2VsZiwgY29tbWFuZCwgcmVpbml0X3N1YmNvbW1hbmRzPTAsICoqa3cpOgogICAgICAgIGNtZCA9IF9Db21tYW5kLnJlaW5pdGlhbGl6ZV9jb21tYW5kKHNlbGYsIGNvbW1hbmQsIHJlaW5pdF9zdWJjb21tYW5kcykKICAgICAgICB2YXJzKGNtZCkudXBkYXRlKGt3KQogICAgICAgIHJldHVybiBjbWQKCgpkZWYgX2ZpbmRfYWxsX3NpbXBsZShwYXRoKToKICAgICIiIgogICAgRmluZCBhbGwgZmlsZXMgdW5kZXIgJ3BhdGgnCiAgICAiIiIKICAgIHJlc3VsdHMgPSAoCiAgICAgICAgb3MucGF0aC5qb2luKGJhc2UsIGZpbGUpCiAgICAgICAgZm9yIGJhc2UsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsocGF0aCwgZm9sbG93bGlua3M9VHJ1ZSkKICAgICAgICBmb3IgZmlsZSBpbiBmaWxlcwogICAgKQogICAgcmV0dXJuIGZpbHRlcihvcy5wYXRoLmlzZmlsZSwgcmVzdWx0cykKCgpkZWYgZmluZGFsbChkaXI9b3MuY3VyZGlyKToKICAgICIiIgogICAgRmluZCBhbGwgZmlsZXMgdW5kZXIgJ2RpcicgYW5kIHJldHVybiB0aGUgbGlzdCBvZiBmdWxsIGZpbGVuYW1lcy4KICAgIFVubGVzcyBkaXIgaXMgJy4nLCByZXR1cm4gZnVsbCBmaWxlbmFtZXMgd2l0aCBkaXIgcHJlcGVuZGVkLgogICAgIiIiCiAgICBmaWxlcyA9IF9maW5kX2FsbF9zaW1wbGUoZGlyKQogICAgaWYgZGlyID09IG9zLmN1cmRpcjoKICAgICAgICBtYWtlX3JlbCA9IGZ1bmN0b29scy5wYXJ0aWFsKG9zLnBhdGgucmVscGF0aCwgc3RhcnQ9ZGlyKQogICAgICAgIGZpbGVzID0gbWFwKG1ha2VfcmVsLCBmaWxlcykKICAgIHJldHVybiBsaXN0KGZpbGVzKQoKCiMgQXBwbHkgbW9ua2V5IHBhdGNoZXMKbW9ua2V5LnBhdGNoX2FsbCgpClBLAwQUAAAAAAAAACEADqwSStoAAADaAAAARwAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL19kZXByZWNhdGlvbl93YXJuaW5nLnB5Y2xhc3MgU2V0dXB0b29sc0RlcHJlY2F0aW9uV2FybmluZyhXYXJuaW5nKToKICAgICIiIgogICAgQmFzZSBjbGFzcyBmb3Igd2FybmluZyBkZXByZWNhdGlvbnMgaW4gYGBzZXR1cHRvb2xzYGAKCiAgICBUaGlzIGNsYXNzIGlzIG5vdCBkZXJpdmVkIGZyb20gYGBEZXByZWNhdGlvbldhcm5pbmdgYCwgYW5kIGFzIHN1Y2ggaXMKICAgIHZpc2libGUgYnkgZGVmYXVsdC4KICAgICIiIgpQSwMEFAAAAAAAAAAhAFsURI6vCAAArwgAADcAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9faW1wLnB5IiIiClJlLWltcGxlbWVudGF0aW9uIG9mIGZpbmRfbW9kdWxlIGFuZCBnZXRfZnJvemVuX29iamVjdApmcm9tIHRoZSBkZXByZWNhdGVkIGltcCBtb2R1bGUuCiIiIgoKaW1wb3J0IG9zCmltcG9ydCBpbXBvcnRsaWIudXRpbAppbXBvcnQgaW1wb3J0bGliLm1hY2hpbmVyeQoKZnJvbSAucHkzNGNvbXBhdCBpbXBvcnQgbW9kdWxlX2Zyb21fc3BlYwoKClBZX1NPVVJDRSA9IDEKUFlfQ09NUElMRUQgPSAyCkNfRVhURU5TSU9OID0gMwpDX0JVSUxUSU4gPSA2ClBZX0ZST1pFTiA9IDcKCgpkZWYgZmluZF9tb2R1bGUobW9kdWxlLCBwYXRocz1Ob25lKToKICAgICIiIkp1c3QgbGlrZSAnaW1wLmZpbmRfbW9kdWxlKCknLCBidXQgd2l0aCBwYWNrYWdlIHN1cHBvcnQiIiIKICAgIHNwZWMgPSBpbXBvcnRsaWIudXRpbC5maW5kX3NwZWMobW9kdWxlLCBwYXRocykKICAgIGlmIHNwZWMgaXMgTm9uZToKICAgICAgICByYWlzZSBJbXBvcnRFcnJvcigiQ2FuJ3QgZmluZCAlcyIgJSBtb2R1bGUpCiAgICBpZiBub3Qgc3BlYy5oYXNfbG9jYXRpb24gYW5kIGhhc2F0dHIoc3BlYywgJ3N1Ym1vZHVsZV9zZWFyY2hfbG9jYXRpb25zJyk6CiAgICAgICAgc3BlYyA9IGltcG9ydGxpYi51dGlsLnNwZWNfZnJvbV9sb2FkZXIoJ19faW5pdF9fLnB5Jywgc3BlYy5sb2FkZXIpCgogICAga2luZCA9IC0xCiAgICBmaWxlID0gTm9uZQogICAgc3RhdGljID0gaXNpbnN0YW5jZShzcGVjLmxvYWRlciwgdHlwZSkKICAgIGlmIHNwZWMub3JpZ2luID09ICdmcm96ZW4nIG9yIHN0YXRpYyBhbmQgaXNzdWJjbGFzcygKICAgICAgICAgICAgc3BlYy5sb2FkZXIsIGltcG9ydGxpYi5tYWNoaW5lcnkuRnJvemVuSW1wb3J0ZXIpOgogICAgICAgIGtpbmQgPSBQWV9GUk9aRU4KICAgICAgICBwYXRoID0gTm9uZSAgIyBpbXAgY29tcGFiaWx0eQogICAgICAgIHN1ZmZpeCA9IG1vZGUgPSAnJyAgIyBpbXAgY29tcGFiaWxpdHkKICAgIGVsaWYgc3BlYy5vcmlnaW4gPT0gJ2J1aWx0LWluJyBvciBzdGF0aWMgYW5kIGlzc3ViY2xhc3MoCiAgICAgICAgICAgIHNwZWMubG9hZGVyLCBpbXBvcnRsaWIubWFjaGluZXJ5LkJ1aWx0aW5JbXBvcnRlcik6CiAgICAgICAga2luZCA9IENfQlVJTFRJTgogICAgICAgIHBhdGggPSBOb25lICAjIGltcCBjb21wYWJpbHR5CiAgICAgICAgc3VmZml4ID0gbW9kZSA9ICcnICAjIGltcCBjb21wYWJpbGl0eQogICAgZWxpZiBzcGVjLmhhc19sb2NhdGlvbjoKICAgICAgICBwYXRoID0gc3BlYy5vcmlnaW4KICAgICAgICBzdWZmaXggPSBvcy5wYXRoLnNwbGl0ZXh0KHBhdGgpWzFdCiAgICAgICAgbW9kZSA9ICdyJyBpZiBzdWZmaXggaW4gaW1wb3J0bGliLm1hY2hpbmVyeS5TT1VSQ0VfU1VGRklYRVMgZWxzZSAncmInCgogICAgICAgIGlmIHN1ZmZpeCBpbiBpbXBvcnRsaWIubWFjaGluZXJ5LlNPVVJDRV9TVUZGSVhFUzoKICAgICAgICAgICAga2luZCA9IFBZX1NPVVJDRQogICAgICAgIGVsaWYgc3VmZml4IGluIGltcG9ydGxpYi5tYWNoaW5lcnkuQllURUNPREVfU1VGRklYRVM6CiAgICAgICAgICAgIGtpbmQgPSBQWV9DT01QSUxFRAogICAgICAgIGVsaWYgc3VmZml4IGluIGltcG9ydGxpYi5tYWNoaW5lcnkuRVhURU5TSU9OX1NVRkZJWEVTOgogICAgICAgICAgICBraW5kID0gQ19FWFRFTlNJT04KCiAgICAgICAgaWYga2luZCBpbiB7UFlfU09VUkNFLCBQWV9DT01QSUxFRH06CiAgICAgICAgICAgIGZpbGUgPSBvcGVuKHBhdGgsIG1vZGUpCiAgICBlbHNlOgogICAgICAgIHBhdGggPSBOb25lCiAgICAgICAgc3VmZml4ID0gbW9kZSA9ICcnCgogICAgcmV0dXJuIGZpbGUsIHBhdGgsIChzdWZmaXgsIG1vZGUsIGtpbmQpCgoKZGVmIGdldF9mcm96ZW5fb2JqZWN0KG1vZHVsZSwgcGF0aHM9Tm9uZSk6CiAgICBzcGVjID0gaW1wb3J0bGliLnV0aWwuZmluZF9zcGVjKG1vZHVsZSwgcGF0aHMpCiAgICBpZiBub3Qgc3BlYzoKICAgICAgICByYWlzZSBJbXBvcnRFcnJvcigiQ2FuJ3QgZmluZCAlcyIgJSBtb2R1bGUpCiAgICByZXR1cm4gc3BlYy5sb2FkZXIuZ2V0X2NvZGUobW9kdWxlKQoKCmRlZiBnZXRfbW9kdWxlKG1vZHVsZSwgcGF0aHMsIGluZm8pOgogICAgc3BlYyA9IGltcG9ydGxpYi51dGlsLmZpbmRfc3BlYyhtb2R1bGUsIHBhdGhzKQogICAgaWYgbm90IHNwZWM6CiAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoIkNhbid0IGZpbmQgJXMiICUgbW9kdWxlKQogICAgcmV0dXJuIG1vZHVsZV9mcm9tX3NwZWMoc3BlYykKUEsDBBQAAAAAAAAAIQAAAAAAAAAAAAAAAABDAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvX3ZlbmRvci9fX2luaXRfXy5weVBLAwQUAAAAAAAAACEARMMqAxo7AAAaOwAARgAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL192ZW5kb3Ivb3JkZXJlZF9zZXQucHkiIiIKQW4gT3JkZXJlZFNldCBpcyBhIGN1c3RvbSBNdXRhYmxlU2V0IHRoYXQgcmVtZW1iZXJzIGl0cyBvcmRlciwgc28gdGhhdCBldmVyeQplbnRyeSBoYXMgYW4gaW5kZXggdGhhdCBjYW4gYmUgbG9va2VkIHVwLgoKQmFzZWQgb24gYSByZWNpcGUgb3JpZ2luYWxseSBwb3N0ZWQgdG8gQWN0aXZlU3RhdGUgUmVjaXBlcyBieSBSYXltb25kIEhldHRpZ2VyLAphbmQgcmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLgoiIiIKaW1wb3J0IGl0ZXJ0b29scyBhcyBpdApmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZXF1ZQoKdHJ5OgogICAgIyBQeXRob24gMwogICAgZnJvbSBjb2xsZWN0aW9ucy5hYmMgaW1wb3J0IE11dGFibGVTZXQsIFNlcXVlbmNlCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICMgUHl0aG9uIDIuNwogICAgZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgTXV0YWJsZVNldCwgU2VxdWVuY2UKClNMSUNFX0FMTCA9IHNsaWNlKE5vbmUpCl9fdmVyc2lvbl9fID0gIjMuMSIKCgpkZWYgaXNfaXRlcmFibGUob2JqKToKICAgICIiIgogICAgQXJlIHdlIGJlaW5nIGFza2VkIHRvIGxvb2sgdXAgYSBsaXN0IG9mIHRoaW5ncywgaW5zdGVhZCBvZiBhIHNpbmdsZSB0aGluZz8KICAgIFdlIGNoZWNrIGZvciB0aGUgYF9faXRlcl9fYCBhdHRyaWJ1dGUgc28gdGhhdCB0aGlzIGNhbiBjb3ZlciB0eXBlcyB0aGF0CiAgICBkb24ndCBoYXZlIHRvIGJlIGtub3duIGJ5IHRoaXMgbW9kdWxlLCBzdWNoIGFzIE51bVB5IGFycmF5cy4KCiAgICBTdHJpbmdzLCBob3dldmVyLCBzaG91bGQgYmUgY29uc2lkZXJlZCBhcyBhdG9taWMgdmFsdWVzIHRvIGxvb2sgdXAsIG5vdAogICAgaXRlcmFibGVzLiBUaGUgc2FtZSBnb2VzIGZvciB0dXBsZXMsIHNpbmNlIHRoZXkgYXJlIGltbXV0YWJsZSBhbmQgdGhlcmVmb3JlCiAgICB2YWxpZCBlbnRyaWVzLgoKICAgIFdlIGRvbid0IG5lZWQgdG8gY2hlY2sgZm9yIHRoZSBQeXRob24gMiBgdW5pY29kZWAgdHlwZSwgYmVjYXVzZSBpdCBkb2Vzbid0CiAgICBoYXZlIGFuIGBfX2l0ZXJfX2AgYXR0cmlidXRlIGFueXdheS4KICAgICIiIgogICAgcmV0dXJuICgKICAgICAgICBoYXNhdHRyKG9iaiwgIl9faXRlcl9fIikKICAgICAgICBhbmQgbm90IGlzaW5zdGFuY2Uob2JqLCBzdHIpCiAgICAgICAgYW5kIG5vdCBpc2luc3RhbmNlKG9iaiwgdHVwbGUpCiAgICApCgoKY2xhc3MgT3JkZXJlZFNldChNdXRhYmxlU2V0LCBTZXF1ZW5jZSk6CiAgICAiIiIKICAgIEFuIE9yZGVyZWRTZXQgaXMgYSBjdXN0b20gTXV0YWJsZVNldCB0aGF0IHJlbWVtYmVycyBpdHMgb3JkZXIsIHNvIHRoYXQKICAgIGV2ZXJ5IGVudHJ5IGhhcyBhbiBpbmRleCB0aGF0IGNhbiBiZSBsb29rZWQgdXAuCgogICAgRXhhbXBsZToKICAgICAgICA+Pj4gT3JkZXJlZFNldChbMSwgMSwgMiwgMywgMl0pCiAgICAgICAgT3JkZXJlZFNldChbMSwgMiwgM10pCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgaXRlcmFibGU9Tm9uZSk6CiAgICAgICAgc2VsZi5pdGVtcyA9IFtdCiAgICAgICAgc2VsZi5tYXAgPSB7fQogICAgICAgIGlmIGl0ZXJhYmxlIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmIHw9IGl0ZXJhYmxlCgogICAgZGVmIF9fbGVuX18oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIHVuaXF1ZSBlbGVtZW50cyBpbiB0aGUgb3JkZXJlZCBzZXQKCiAgICAgICAgRXhhbXBsZToKICAgICAgICAgICAgPj4+IGxlbihPcmRlcmVkU2V0KFtdKSkKICAgICAgICAgICAgMAogICAgICAgICAgICA+Pj4gbGVuKE9yZGVyZWRTZXQoWzEsIDJdKSkKICAgICAgICAgICAgMgogICAgICAgICIiIgogICAgICAgIHJldHVybiBsZW4oc2VsZi5pdGVtcykKCiAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaW5kZXgpOgogICAgICAgICIiIgogICAgICAgIEdldCB0aGUgaXRlbSBhdCBhIGdpdmVuIGluZGV4LgoKICAgICAgICBJZiBgaW5kZXhgIGlzIGEgc2xpY2UsIHlvdSB3aWxsIGdldCBiYWNrIHRoYXQgc2xpY2Ugb2YgaXRlbXMsIGFzIGEKICAgICAgICBuZXcgT3JkZXJlZFNldC4KCiAgICAgICAgSWYgYGluZGV4YCBpcyBhIGxpc3Qgb3IgYSBzaW1pbGFyIGl0ZXJhYmxlLCB5b3UnbGwgZ2V0IGEgbGlzdCBvZgogICAgICAgIGl0ZW1zIGNvcnJlc3BvbmRpbmcgdG8gdGhvc2UgaW5kaWNlcy4gVGhpcyBpcyBzaW1pbGFyIHRvIE51bVB5J3MKICAgICAgICAiZmFuY3kgaW5kZXhpbmciLiBUaGUgcmVzdWx0IGlzIG5vdCBhbiBPcmRlcmVkU2V0IGJlY2F1c2UgeW91IG1heSBhc2sKICAgICAgICBmb3IgZHVwbGljYXRlIGluZGljZXMsIGFuZCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHJldHVybmVkIHNob3VsZCBiZQogICAgICAgIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgYXNrZWQgZm9yLgoKICAgICAgICBFeGFtcGxlOgogICAgICAgICAgICA+Pj4gb3NldCA9IE9yZGVyZWRTZXQoWzEsIDIsIDNdKQogICAgICAgICAgICA+Pj4gb3NldFsxXQogICAgICAgICAgICAyCiAgICAgICAgIiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZShpbmRleCwgc2xpY2UpIGFuZCBpbmRleCA9PSBTTElDRV9BTEw6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmNvcHkoKQogICAgICAgIGVsaWYgaXNfaXRlcmFibGUoaW5kZXgpOgogICAgICAgICAgICByZXR1cm4gW3NlbGYuaXRlbXNbaV0gZm9yIGkgaW4gaW5kZXhdCiAgICAgICAgZWxpZiBoYXNhdHRyKGluZGV4LCAiX19pbmRleF9fIikgb3IgaXNpbnN0YW5jZShpbmRleCwgc2xpY2UpOgogICAgICAgICAgICByZXN1bHQgPSBzZWxmLml0ZW1zW2luZGV4XQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHJlc3VsdCwgbGlzdCk6CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18ocmVzdWx0KQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiRG9uJ3Qga25vdyBob3cgdG8gaW5kZXggYW4gT3JkZXJlZFNldCBieSAlciIgJSBpbmRleCkKCiAgICBkZWYgY29weShzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgdGhpcyBvYmplY3QuCgogICAgICAgIEV4YW1wbGU6CiAgICAgICAgICAgID4+PiB0aGlzID0gT3JkZXJlZFNldChbMSwgMiwgM10pCiAgICAgICAgICAgID4+PiBvdGhlciA9IHRoaXMuY29weSgpCiAgICAgICAgICAgID4+PiB0aGlzID09IG90aGVyCiAgICAgICAgICAgIFRydWUKICAgICAgICAgICAgPj4+IHRoaXMgaXMgb3RoZXIKICAgICAgICAgICAgRmFsc2UKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZikKCiAgICBkZWYgX19nZXRzdGF0ZV9fKHNlbGYpOgogICAgICAgIGlmIGxlbihzZWxmKSA9PSAwOgogICAgICAgICAgICAjIFRoZSBzdGF0ZSBjYW4ndCBiZSBhbiBlbXB0eSBsaXN0LgogICAgICAgICAgICAjIFdlIG5lZWQgdG8gcmV0dXJuIGEgdHJ1dGh5IHZhbHVlLCBvciBlbHNlIF9fc2V0c3RhdGVfXyB3b24ndCBiZSBydW4uCiAgICAgICAgICAgICMKICAgICAgICAgICAgIyBUaGlzIGNvdWxkIGhhdmUgYmVlbiBkb25lIG1vcmUgZ3JhY2VmdWxseSBieSBhbHdheXMgcHV0dGluZyB0aGUgc3RhdGUKICAgICAgICAgICAgIyBpbiBhIHR1cGxlLCBidXQgdGhpcyB3YXkgaXMgYmFja3dhcmRzLSBhbmQgZm9yd2FyZHMtIGNvbXBhdGlibGUgd2l0aAogICAgICAgICAgICAjIHByZXZpb3VzIHZlcnNpb25zIG9mIE9yZGVyZWRTZXQuCiAgICAgICAgICAgIHJldHVybiAoTm9uZSwpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZikKCiAgICBkZWYgX19zZXRzdGF0ZV9fKHNlbGYsIHN0YXRlKToKICAgICAgICBpZiBzdGF0ZSA9PSAoTm9uZSwpOgogICAgICAgICAgICBzZWxmLl9faW5pdF9fKFtdKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuX19pbml0X18oc3RhdGUpCgogICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBrZXkpOgogICAgICAgICIiIgogICAgICAgIFRlc3QgaWYgdGhlIGl0ZW0gaXMgaW4gdGhpcyBvcmRlcmVkIHNldAoKICAgICAgICBFeGFtcGxlOgogICAgICAgICAgICA+Pj4gMSBpbiBPcmRlcmVkU2V0KFsxLCAzLCAyXSkKICAgICAgICAgICAgVHJ1ZQogICAgICAgICAgICA+Pj4gNSBpbiBPcmRlcmVkU2V0KFsxLCAzLCAyXSkKICAgICAgICAgICAgRmFsc2UKICAgICAgICAiIiIKICAgICAgICByZXR1cm4ga2V5IGluIHNlbGYubWFwCgogICAgZGVmIGFkZChzZWxmLCBrZXkpOgogICAgICAgICIiIgogICAgICAgIEFkZCBga2V5YCBhcyBhbiBpdGVtIHRvIHRoaXMgT3JkZXJlZFNldCwgdGhlbiByZXR1cm4gaXRzIGluZGV4LgoKICAgICAgICBJZiBga2V5YCBpcyBhbHJlYWR5IGluIHRoZSBPcmRlcmVkU2V0LCByZXR1cm4gdGhlIGluZGV4IGl0IGFscmVhZHkKICAgICAgICBoYWQuCgogICAgICAgIEV4YW1wbGU6CiAgICAgICAgICAgID4+PiBvc2V0ID0gT3JkZXJlZFNldCgpCiAgICAgICAgICAgID4+PiBvc2V0LmFwcGVuZCgzKQogICAgICAgICAgICAwCiAgICAgICAgICAgID4+PiBwcmludChvc2V0KQogICAgICAgICAgICBPcmRlcmVkU2V0KFszXSkKICAgICAgICAiIiIKICAgICAgICBpZiBrZXkgbm90IGluIHNlbGYubWFwOgogICAgICAgICAgICBzZWxmLm1hcFtrZXldID0gbGVuKHNlbGYuaXRlbXMpCiAgICAgICAgICAgIHNlbGYuaXRlbXMuYXBwZW5kKGtleSkKICAgICAgICByZXR1cm4gc2VsZi5tYXBba2V5XQoKICAgIGFwcGVuZCA9IGFkZAoKICAgIGRlZiB1cGRhdGUoc2VsZiwgc2VxdWVuY2UpOgogICAgICAgICIiIgogICAgICAgIFVwZGF0ZSB0aGUgc2V0IHdpdGggdGhlIGdpdmVuIGl0ZXJhYmxlIHNlcXVlbmNlLCB0aGVuIHJldHVybiB0aGUgaW5kZXgKICAgICAgICBvZiB0aGUgbGFzdCBlbGVtZW50IGluc2VydGVkLgoKICAgICAgICBFeGFtcGxlOgogICAgICAgICAgICA+Pj4gb3NldCA9IE9yZGVyZWRTZXQoWzEsIDIsIDNdKQogICAgICAgICAgICA+Pj4gb3NldC51cGRhdGUoWzMsIDEsIDUsIDEsIDRdKQogICAgICAgICAgICA0CiAgICAgICAgICAgID4+PiBwcmludChvc2V0KQogICAgICAgICAgICBPcmRlcmVkU2V0KFsxLCAyLCAzLCA1LCA0XSkKICAgICAgICAiIiIKICAgICAgICBpdGVtX2luZGV4ID0gTm9uZQogICAgICAgIHRyeToKICAgICAgICAgICAgZm9yIGl0ZW0gaW4gc2VxdWVuY2U6CiAgICAgICAgICAgICAgICBpdGVtX2luZGV4ID0gc2VsZi5hZGQoaXRlbSkKICAgICAgICBleGNlcHQgVHlwZUVycm9yOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAogICAgICAgICAgICAgICAgIkFyZ3VtZW50IG5lZWRzIHRvIGJlIGFuIGl0ZXJhYmxlLCBnb3QgJXMiICUgdHlwZShzZXF1ZW5jZSkKICAgICAgICAgICAgKQogICAgICAgIHJldHVybiBpdGVtX2luZGV4CgogICAgZGVmIGluZGV4KHNlbGYsIGtleSk6CiAgICAgICAgIiIiCiAgICAgICAgR2V0IHRoZSBpbmRleCBvZiBhIGdpdmVuIGVudHJ5LCByYWlzaW5nIGFuIEluZGV4RXJyb3IgaWYgaXQncyBub3QKICAgICAgICBwcmVzZW50LgoKICAgICAgICBga2V5YCBjYW4gYmUgYW4gaXRlcmFibGUgb2YgZW50cmllcyB0aGF0IGlzIG5vdCBhIHN0cmluZywgaW4gd2hpY2ggY2FzZQogICAgICAgIHRoaXMgcmV0dXJucyBhIGxpc3Qgb2YgaW5kaWNlcy4KCiAgICAgICAgRXhhbXBsZToKICAgICAgICAgICAgPj4+IG9zZXQgPSBPcmRlcmVkU2V0KFsxLCAyLCAzXSkKICAgICAgICAgICAgPj4+IG9zZXQuaW5kZXgoMikKICAgICAgICAgICAgMQogICAgICAgICIiIgogICAgICAgIGlmIGlzX2l0ZXJhYmxlKGtleSk6CiAgICAgICAgICAgIHJldHVybiBbc2VsZi5pbmRleChzdWJrZXkpIGZvciBzdWJrZXkgaW4ga2V5XQogICAgICAgIHJldHVybiBzZWxmLm1hcFtrZXldCgogICAgIyBQcm92aWRlIHNvbWUgY29tcGF0aWJpbGl0eSB3aXRoIHBkLkluZGV4CiAgICBnZXRfbG9jID0gaW5kZXgKICAgIGdldF9pbmRleGVyID0gaW5kZXgKCiAgICBkZWYgcG9wKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJlbW92ZSBhbmQgcmV0dXJuIHRoZSBsYXN0IGVsZW1lbnQgZnJvbSB0aGUgc2V0LgoKICAgICAgICBSYWlzZXMgS2V5RXJyb3IgaWYgdGhlIHNldCBpcyBlbXB0eS4KCiAgICAgICAgRXhhbXBsZToKICAgICAgICAgICAgPj4+IG9zZXQgPSBPcmRlcmVkU2V0KFsxLCAyLCAzXSkKICAgICAgICAgICAgPj4+IG9zZXQucG9wKCkKICAgICAgICAgICAgMwogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBzZWxmLml0ZW1zOgogICAgICAgICAgICByYWlzZSBLZXlFcnJvcigiU2V0IGlzIGVtcHR5IikKCiAgICAgICAgZWxlbSA9IHNlbGYuaXRlbXNbLTFdCiAgICAgICAgZGVsIHNlbGYuaXRlbXNbLTFdCiAgICAgICAgZGVsIHNlbGYubWFwW2VsZW1dCiAgICAgICAgcmV0dXJuIGVsZW0KCiAgICBkZWYgZGlzY2FyZChzZWxmLCBrZXkpOgogICAgICAgICIiIgogICAgICAgIFJlbW92ZSBhbiBlbGVtZW50LiAgRG8gbm90IHJhaXNlIGFuIGV4Y2VwdGlvbiBpZiBhYnNlbnQuCgogICAgICAgIFRoZSBNdXRhYmxlU2V0IG1peGluIHVzZXMgdGhpcyB0byBpbXBsZW1lbnQgdGhlIC5yZW1vdmUoKSBtZXRob2QsIHdoaWNoCiAgICAgICAgKmRvZXMqIHJhaXNlIGFuIGVycm9yIHdoZW4gYXNrZWQgdG8gcmVtb3ZlIGEgbm9uLWV4aXN0ZW50IGl0ZW0uCgogICAgICAgIEV4YW1wbGU6CiAgICAgICAgICAgID4+PiBvc2V0ID0gT3JkZXJlZFNldChbMSwgMiwgM10pCiAgICAgICAgICAgID4+PiBvc2V0LmRpc2NhcmQoMikKICAgICAgICAgICAgPj4+IHByaW50KG9zZXQpCiAgICAgICAgICAgIE9yZGVyZWRTZXQoWzEsIDNdKQogICAgICAgICAgICA+Pj4gb3NldC5kaXNjYXJkKDIpCiAgICAgICAgICAgID4+PiBwcmludChvc2V0KQogICAgICAgICAgICBPcmRlcmVkU2V0KFsxLCAzXSkKICAgICAgICAiIiIKICAgICAgICBpZiBrZXkgaW4gc2VsZjoKICAgICAgICAgICAgaSA9IHNlbGYubWFwW2tleV0KICAgICAgICAgICAgZGVsIHNlbGYuaXRlbXNbaV0KICAgICAgICAgICAgZGVsIHNlbGYubWFwW2tleV0KICAgICAgICAgICAgZm9yIGssIHYgaW4gc2VsZi5tYXAuaXRlbXMoKToKICAgICAgICAgICAgICAgIGlmIHYgPj0gaToKICAgICAgICAgICAgICAgICAgICBzZWxmLm1hcFtrXSA9IHYgLSAxCgogICAgZGVmIGNsZWFyKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJlbW92ZSBhbGwgaXRlbXMgZnJvbSB0aGlzIE9yZGVyZWRTZXQuCiAgICAgICAgIiIiCiAgICAgICAgZGVsIHNlbGYuaXRlbXNbOl0KICAgICAgICBzZWxmLm1hcC5jbGVhcigpCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEV4YW1wbGU6CiAgICAgICAgICAgID4+PiBsaXN0KGl0ZXIoT3JkZXJlZFNldChbMSwgMiwgM10pKSkKICAgICAgICAgICAgWzEsIDIsIDNdCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGl0ZXIoc2VsZi5pdGVtcykKCiAgICBkZWYgX19yZXZlcnNlZF9fKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEV4YW1wbGU6CiAgICAgICAgICAgID4+PiBsaXN0KHJldmVyc2VkKE9yZGVyZWRTZXQoWzEsIDIsIDNdKSkpCiAgICAgICAgICAgIFszLCAyLCAxXQogICAgICAgICIiIgogICAgICAgIHJldHVybiByZXZlcnNlZChzZWxmLml0ZW1zKQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICBpZiBub3Qgc2VsZjoKICAgICAgICAgICAgcmV0dXJuICIlcygpIiAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywpCiAgICAgICAgcmV0dXJuICIlcyglcikiICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBsaXN0KHNlbGYpKQoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgICIiIgogICAgICAgIFJldHVybnMgdHJ1ZSBpZiB0aGUgY29udGFpbmVycyBoYXZlIHRoZSBzYW1lIGl0ZW1zLiBJZiBgb3RoZXJgIGlzIGEKICAgICAgICBTZXF1ZW5jZSwgdGhlbiBvcmRlciBpcyBjaGVja2VkLCBvdGhlcndpc2UgaXQgaXMgaWdub3JlZC4KCiAgICAgICAgRXhhbXBsZToKICAgICAgICAgICAgPj4+IG9zZXQgPSBPcmRlcmVkU2V0KFsxLCAzLCAyXSkKICAgICAgICAgICAgPj4+IG9zZXQgPT0gWzEsIDMsIDJdCiAgICAgICAgICAgIFRydWUKICAgICAgICAgICAgPj4+IG9zZXQgPT0gWzEsIDIsIDNdCiAgICAgICAgICAgIEZhbHNlCiAgICAgICAgICAgID4+PiBvc2V0ID09IFsyLCAzXQogICAgICAgICAgICBGYWxzZQogICAgICAgICAgICA+Pj4gb3NldCA9PSBPcmRlcmVkU2V0KFszLCAyLCAxXSkKICAgICAgICAgICAgRmFsc2UKICAgICAgICAiIiIKICAgICAgICAjIEluIFB5dGhvbiAyIGRlcXVlIGlzIG5vdCBhIFNlcXVlbmNlLCBzbyB0cmVhdCBpdCBhcyBvbmUgZm9yCiAgICAgICAgIyBjb25zaXN0ZW50IGJlaGF2aW9yIHdpdGggUHl0aG9uIDMuCiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgKFNlcXVlbmNlLCBkZXF1ZSkpOgogICAgICAgICAgICAjIENoZWNrIHRoYXQgdGhpcyBPcmRlcmVkU2V0IGNvbnRhaW5zIHRoZSBzYW1lIGVsZW1lbnRzLCBpbiB0aGUKICAgICAgICAgICAgIyBzYW1lIG9yZGVyLCBhcyB0aGUgb3RoZXIgb2JqZWN0LgogICAgICAgICAgICByZXR1cm4gbGlzdChzZWxmKSA9PSBsaXN0KG90aGVyKQogICAgICAgIHRyeToKICAgICAgICAgICAgb3RoZXJfYXNfc2V0ID0gc2V0KG90aGVyKQogICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CiAgICAgICAgICAgICMgSWYgYG90aGVyYCBjYW4ndCBiZSBjb252ZXJ0ZWQgaW50byBhIHNldCwgaXQncyBub3QgZXF1YWwuCiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBzZXQoc2VsZikgPT0gb3RoZXJfYXNfc2V0CgogICAgZGVmIHVuaW9uKHNlbGYsICpzZXRzKToKICAgICAgICAiIiIKICAgICAgICBDb21iaW5lcyBhbGwgdW5pcXVlIGl0ZW1zLgogICAgICAgIEVhY2ggaXRlbXMgb3JkZXIgaXMgZGVmaW5lZCBieSBpdHMgZmlyc3QgYXBwZWFyYW5jZS4KCiAgICAgICAgRXhhbXBsZToKICAgICAgICAgICAgPj4+IG9zZXQgPSBPcmRlcmVkU2V0LnVuaW9uKE9yZGVyZWRTZXQoWzMsIDEsIDQsIDEsIDVdKSwgWzEsIDNdLCBbMiwgMF0pCiAgICAgICAgICAgID4+PiBwcmludChvc2V0KQogICAgICAgICAgICBPcmRlcmVkU2V0KFszLCAxLCA0LCA1LCAyLCAwXSkKICAgICAgICAgICAgPj4+IG9zZXQudW5pb24oWzgsIDldKQogICAgICAgICAgICBPcmRlcmVkU2V0KFszLCAxLCA0LCA1LCAyLCAwLCA4LCA5XSkKICAgICAgICAgICAgPj4+IG9zZXQgfCB7MTB9CiAgICAgICAgICAgIE9yZGVyZWRTZXQoWzMsIDEsIDQsIDUsIDIsIDAsIDEwXSkKICAgICAgICAiIiIKICAgICAgICBjbHMgPSBzZWxmLl9fY2xhc3NfXyBpZiBpc2luc3RhbmNlKHNlbGYsIE9yZGVyZWRTZXQpIGVsc2UgT3JkZXJlZFNldAogICAgICAgIGNvbnRhaW5lcnMgPSBtYXAobGlzdCwgaXQuY2hhaW4oW3NlbGZdLCBzZXRzKSkKICAgICAgICBpdGVtcyA9IGl0LmNoYWluLmZyb21faXRlcmFibGUoY29udGFpbmVycykKICAgICAgICByZXR1cm4gY2xzKGl0ZW1zKQoKICAgIGRlZiBfX2FuZF9fKHNlbGYsIG90aGVyKToKICAgICAgICAjIHRoZSBwYXJlbnQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBpcyBiYWNrd2FyZHMKICAgICAgICByZXR1cm4gc2VsZi5pbnRlcnNlY3Rpb24ob3RoZXIpCgogICAgZGVmIGludGVyc2VjdGlvbihzZWxmLCAqc2V0cyk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJucyBlbGVtZW50cyBpbiBjb21tb24gYmV0d2VlbiBhbGwgc2V0cy4gT3JkZXIgaXMgZGVmaW5lZCBvbmx5CiAgICAgICAgYnkgdGhlIGZpcnN0IHNldC4KCiAgICAgICAgRXhhbXBsZToKICAgICAgICAgICAgPj4+IG9zZXQgPSBPcmRlcmVkU2V0LmludGVyc2VjdGlvbihPcmRlcmVkU2V0KFswLCAxLCAyLCAzXSksIFsxLCAyLCAzXSkKICAgICAgICAgICAgPj4+IHByaW50KG9zZXQpCiAgICAgICAgICAgIE9yZGVyZWRTZXQoWzEsIDIsIDNdKQogICAgICAgICAgICA+Pj4gb3NldC5pbnRlcnNlY3Rpb24oWzIsIDQsIDVdLCBbMSwgMiwgMywgNF0pCiAgICAgICAgICAgIE9yZGVyZWRTZXQoWzJdKQogICAgICAgICAgICA+Pj4gb3NldC5pbnRlcnNlY3Rpb24oKQogICAgICAgICAgICBPcmRlcmVkU2V0KFsxLCAyLCAzXSkKICAgICAgICAiIiIKICAgICAgICBjbHMgPSBzZWxmLl9fY2xhc3NfXyBpZiBpc2luc3RhbmNlKHNlbGYsIE9yZGVyZWRTZXQpIGVsc2UgT3JkZXJlZFNldAogICAgICAgIGlmIHNldHM6CiAgICAgICAgICAgIGNvbW1vbiA9IHNldC5pbnRlcnNlY3Rpb24oKm1hcChzZXQsIHNldHMpKQogICAgICAgICAgICBpdGVtcyA9IChpdGVtIGZvciBpdGVtIGluIHNlbGYgaWYgaXRlbSBpbiBjb21tb24pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaXRlbXMgPSBzZWxmCiAgICAgICAgcmV0dXJuIGNscyhpdGVtcykKCiAgICBkZWYgZGlmZmVyZW5jZShzZWxmLCAqc2V0cyk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJucyBhbGwgZWxlbWVudHMgdGhhdCBhcmUgaW4gdGhpcyBzZXQgYnV0IG5vdCB0aGUgb3RoZXJzLgoKICAgICAgICBFeGFtcGxlOgogICAgICAgICAgICA+Pj4gT3JkZXJlZFNldChbMSwgMiwgM10pLmRpZmZlcmVuY2UoT3JkZXJlZFNldChbMl0pKQogICAgICAgICAgICBPcmRlcmVkU2V0KFsxLCAzXSkKICAgICAgICAgICAgPj4+IE9yZGVyZWRTZXQoWzEsIDIsIDNdKS5kaWZmZXJlbmNlKE9yZGVyZWRTZXQoWzJdKSwgT3JkZXJlZFNldChbM10pKQogICAgICAgICAgICBPcmRlcmVkU2V0KFsxXSkKICAgICAgICAgICAgPj4+IE9yZGVyZWRTZXQoWzEsIDIsIDNdKSAtIE9yZGVyZWRTZXQoWzJdKQogICAgICAgICAgICBPcmRlcmVkU2V0KFsxLCAzXSkKICAgICAgICAgICAgPj4+IE9yZGVyZWRTZXQoWzEsIDIsIDNdKS5kaWZmZXJlbmNlKCkKICAgICAgICAgICAgT3JkZXJlZFNldChbMSwgMiwgM10pCiAgICAgICAgIiIiCiAgICAgICAgY2xzID0gc2VsZi5fX2NsYXNzX18KICAgICAgICBpZiBzZXRzOgogICAgICAgICAgICBvdGhlciA9IHNldC51bmlvbigqbWFwKHNldCwgc2V0cykpCiAgICAgICAgICAgIGl0ZW1zID0gKGl0ZW0gZm9yIGl0ZW0gaW4gc2VsZiBpZiBpdGVtIG5vdCBpbiBvdGhlcikKICAgICAgICBlbHNlOgogICAgICAgICAgICBpdGVtcyA9IHNlbGYKICAgICAgICByZXR1cm4gY2xzKGl0ZW1zKQoKICAgIGRlZiBpc3N1YnNldChzZWxmLCBvdGhlcik6CiAgICAgICAgIiIiCiAgICAgICAgUmVwb3J0IHdoZXRoZXIgYW5vdGhlciBzZXQgY29udGFpbnMgdGhpcyBzZXQuCgogICAgICAgIEV4YW1wbGU6CiAgICAgICAgICAgID4+PiBPcmRlcmVkU2V0KFsxLCAyLCAzXSkuaXNzdWJzZXQoezEsIDJ9KQogICAgICAgICAgICBGYWxzZQogICAgICAgICAgICA+Pj4gT3JkZXJlZFNldChbMSwgMiwgM10pLmlzc3Vic2V0KHsxLCAyLCAzLCA0fSkKICAgICAgICAgICAgVHJ1ZQogICAgICAgICAgICA+Pj4gT3JkZXJlZFNldChbMSwgMiwgM10pLmlzc3Vic2V0KHsxLCA0LCAzLCA1fSkKICAgICAgICAgICAgRmFsc2UKICAgICAgICAiIiIKICAgICAgICBpZiBsZW4oc2VsZikgPiBsZW4ob3RoZXIpOiAgIyBGYXN0IGNoZWNrIGZvciBvYnZpb3VzIGNhc2VzCiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIHJldHVybiBhbGwoaXRlbSBpbiBvdGhlciBmb3IgaXRlbSBpbiBzZWxmKQoKICAgIGRlZiBpc3N1cGVyc2V0KHNlbGYsIG90aGVyKToKICAgICAgICAiIiIKICAgICAgICBSZXBvcnQgd2hldGhlciB0aGlzIHNldCBjb250YWlucyBhbm90aGVyIHNldC4KCiAgICAgICAgRXhhbXBsZToKICAgICAgICAgICAgPj4+IE9yZGVyZWRTZXQoWzEsIDJdKS5pc3N1cGVyc2V0KFsxLCAyLCAzXSkKICAgICAgICAgICAgRmFsc2UKICAgICAgICAgICAgPj4+IE9yZGVyZWRTZXQoWzEsIDIsIDMsIDRdKS5pc3N1cGVyc2V0KHsxLCAyLCAzfSkKICAgICAgICAgICAgVHJ1ZQogICAgICAgICAgICA+Pj4gT3JkZXJlZFNldChbMSwgNCwgMywgNV0pLmlzc3VwZXJzZXQoezEsIDIsIDN9KQogICAgICAgICAgICBGYWxzZQogICAgICAgICIiIgogICAgICAgIGlmIGxlbihzZWxmKSA8IGxlbihvdGhlcik6ICAjIEZhc3QgY2hlY2sgZm9yIG9idmlvdXMgY2FzZXMKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgcmV0dXJuIGFsbChpdGVtIGluIHNlbGYgZm9yIGl0ZW0gaW4gb3RoZXIpCgogICAgZGVmIHN5bW1ldHJpY19kaWZmZXJlbmNlKHNlbGYsIG90aGVyKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gdGhlIHN5bW1ldHJpYyBkaWZmZXJlbmNlIG9mIHR3byBPcmRlcmVkU2V0cyBhcyBhIG5ldyBzZXQuCiAgICAgICAgVGhhdCBpcywgdGhlIG5ldyBzZXQgd2lsbCBjb250YWluIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBpbiBleGFjdGx5CiAgICAgICAgb25lIG9mIHRoZSBzZXRzLgoKICAgICAgICBUaGVpciBvcmRlciB3aWxsIGJlIHByZXNlcnZlZCwgd2l0aCBlbGVtZW50cyBmcm9tIGBzZWxmYCBwcmVjZWRpbmcKICAgICAgICBlbGVtZW50cyBmcm9tIGBvdGhlcmAuCgogICAgICAgIEV4YW1wbGU6CiAgICAgICAgICAgID4+PiB0aGlzID0gT3JkZXJlZFNldChbMSwgNCwgMywgNSwgN10pCiAgICAgICAgICAgID4+PiBvdGhlciA9IE9yZGVyZWRTZXQoWzksIDcsIDEsIDMsIDJdKQogICAgICAgICAgICA+Pj4gdGhpcy5zeW1tZXRyaWNfZGlmZmVyZW5jZShvdGhlcikKICAgICAgICAgICAgT3JkZXJlZFNldChbNCwgNSwgOSwgMl0pCiAgICAgICAgIiIiCiAgICAgICAgY2xzID0gc2VsZi5fX2NsYXNzX18gaWYgaXNpbnN0YW5jZShzZWxmLCBPcmRlcmVkU2V0KSBlbHNlIE9yZGVyZWRTZXQKICAgICAgICBkaWZmMSA9IGNscyhzZWxmKS5kaWZmZXJlbmNlKG90aGVyKQogICAgICAgIGRpZmYyID0gY2xzKG90aGVyKS5kaWZmZXJlbmNlKHNlbGYpCiAgICAgICAgcmV0dXJuIGRpZmYxLnVuaW9uKGRpZmYyKQoKICAgIGRlZiBfdXBkYXRlX2l0ZW1zKHNlbGYsIGl0ZW1zKToKICAgICAgICAiIiIKICAgICAgICBSZXBsYWNlIHRoZSAnaXRlbXMnIGxpc3Qgb2YgdGhpcyBPcmRlcmVkU2V0IHdpdGggYSBuZXcgb25lLCB1cGRhdGluZwogICAgICAgIHNlbGYubWFwIGFjY29yZGluZ2x5LgogICAgICAgICIiIgogICAgICAgIHNlbGYuaXRlbXMgPSBpdGVtcwogICAgICAgIHNlbGYubWFwID0ge2l0ZW06IGlkeCBmb3IgKGlkeCwgaXRlbSkgaW4gZW51bWVyYXRlKGl0ZW1zKX0KCiAgICBkZWYgZGlmZmVyZW5jZV91cGRhdGUoc2VsZiwgKnNldHMpOgogICAgICAgICIiIgogICAgICAgIFVwZGF0ZSB0aGlzIE9yZGVyZWRTZXQgdG8gcmVtb3ZlIGl0ZW1zIGZyb20gb25lIG9yIG1vcmUgb3RoZXIgc2V0cy4KCiAgICAgICAgRXhhbXBsZToKICAgICAgICAgICAgPj4+IHRoaXMgPSBPcmRlcmVkU2V0KFsxLCAyLCAzXSkKICAgICAgICAgICAgPj4+IHRoaXMuZGlmZmVyZW5jZV91cGRhdGUoT3JkZXJlZFNldChbMiwgNF0pKQogICAgICAgICAgICA+Pj4gcHJpbnQodGhpcykKICAgICAgICAgICAgT3JkZXJlZFNldChbMSwgM10pCgogICAgICAgICAgICA+Pj4gdGhpcyA9IE9yZGVyZWRTZXQoWzEsIDIsIDMsIDQsIDVdKQogICAgICAgICAgICA+Pj4gdGhpcy5kaWZmZXJlbmNlX3VwZGF0ZShPcmRlcmVkU2V0KFsyLCA0XSksIE9yZGVyZWRTZXQoWzEsIDQsIDZdKSkKICAgICAgICAgICAgPj4+IHByaW50KHRoaXMpCiAgICAgICAgICAgIE9yZGVyZWRTZXQoWzMsIDVdKQogICAgICAgICIiIgogICAgICAgIGl0ZW1zX3RvX3JlbW92ZSA9IHNldCgpCiAgICAgICAgZm9yIG90aGVyIGluIHNldHM6CiAgICAgICAgICAgIGl0ZW1zX3RvX3JlbW92ZSB8PSBzZXQob3RoZXIpCiAgICAgICAgc2VsZi5fdXBkYXRlX2l0ZW1zKFtpdGVtIGZvciBpdGVtIGluIHNlbGYuaXRlbXMgaWYgaXRlbSBub3QgaW4gaXRlbXNfdG9fcmVtb3ZlXSkKCiAgICBkZWYgaW50ZXJzZWN0aW9uX3VwZGF0ZShzZWxmLCBvdGhlcik6CiAgICAgICAgIiIiCiAgICAgICAgVXBkYXRlIHRoaXMgT3JkZXJlZFNldCB0byBrZWVwIG9ubHkgaXRlbXMgaW4gYW5vdGhlciBzZXQsIHByZXNlcnZpbmcKICAgICAgICB0aGVpciBvcmRlciBpbiB0aGlzIHNldC4KCiAgICAgICAgRXhhbXBsZToKICAgICAgICAgICAgPj4+IHRoaXMgPSBPcmRlcmVkU2V0KFsxLCA0LCAzLCA1LCA3XSkKICAgICAgICAgICAgPj4+IG90aGVyID0gT3JkZXJlZFNldChbOSwgNywgMSwgMywgMl0pCiAgICAgICAgICAgID4+PiB0aGlzLmludGVyc2VjdGlvbl91cGRhdGUob3RoZXIpCiAgICAgICAgICAgID4+PiBwcmludCh0aGlzKQogICAgICAgICAgICBPcmRlcmVkU2V0KFsxLCAzLCA3XSkKICAgICAgICAiIiIKICAgICAgICBvdGhlciA9IHNldChvdGhlcikKICAgICAgICBzZWxmLl91cGRhdGVfaXRlbXMoW2l0ZW0gZm9yIGl0ZW0gaW4gc2VsZi5pdGVtcyBpZiBpdGVtIGluIG90aGVyXSkKCiAgICBkZWYgc3ltbWV0cmljX2RpZmZlcmVuY2VfdXBkYXRlKHNlbGYsIG90aGVyKToKICAgICAgICAiIiIKICAgICAgICBVcGRhdGUgdGhpcyBPcmRlcmVkU2V0IHRvIHJlbW92ZSBpdGVtcyBmcm9tIGFub3RoZXIgc2V0LCB0aGVuCiAgICAgICAgYWRkIGl0ZW1zIGZyb20gdGhlIG90aGVyIHNldCB0aGF0IHdlcmUgbm90IHByZXNlbnQgaW4gdGhpcyBzZXQuCgogICAgICAgIEV4YW1wbGU6CiAgICAgICAgICAgID4+PiB0aGlzID0gT3JkZXJlZFNldChbMSwgNCwgMywgNSwgN10pCiAgICAgICAgICAgID4+PiBvdGhlciA9IE9yZGVyZWRTZXQoWzksIDcsIDEsIDMsIDJdKQogICAgICAgICAgICA+Pj4gdGhpcy5zeW1tZXRyaWNfZGlmZmVyZW5jZV91cGRhdGUob3RoZXIpCiAgICAgICAgICAgID4+PiBwcmludCh0aGlzKQogICAgICAgICAgICBPcmRlcmVkU2V0KFs0LCA1LCA5LCAyXSkKICAgICAgICAiIiIKICAgICAgICBpdGVtc190b19hZGQgPSBbaXRlbSBmb3IgaXRlbSBpbiBvdGhlciBpZiBpdGVtIG5vdCBpbiBzZWxmXQogICAgICAgIGl0ZW1zX3RvX3JlbW92ZSA9IHNldChvdGhlcikKICAgICAgICBzZWxmLl91cGRhdGVfaXRlbXMoCiAgICAgICAgICAgIFtpdGVtIGZvciBpdGVtIGluIHNlbGYuaXRlbXMgaWYgaXRlbSBub3QgaW4gaXRlbXNfdG9fcmVtb3ZlXSArIGl0ZW1zX3RvX2FkZAogICAgICAgICkKUEsDBBQAAAAAAAAAIQCK13/Q6AIAAOgCAABOAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvX3ZlbmRvci9wYWNrYWdpbmcvX19hYm91dF9fLnB5IyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uCiMgMi4wLCBhbmQgdGhlIEJTRCBMaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHJlcG9zaXRvcnkKIyBmb3IgY29tcGxldGUgZGV0YWlscy4KZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCBwcmludF9mdW5jdGlvbgoKX19hbGxfXyA9IFsKICAgICJfX3RpdGxlX18iLAogICAgIl9fc3VtbWFyeV9fIiwKICAgICJfX3VyaV9fIiwKICAgICJfX3ZlcnNpb25fXyIsCiAgICAiX19hdXRob3JfXyIsCiAgICAiX19lbWFpbF9fIiwKICAgICJfX2xpY2Vuc2VfXyIsCiAgICAiX19jb3B5cmlnaHRfXyIsCl0KCl9fdGl0bGVfXyA9ICJwYWNrYWdpbmciCl9fc3VtbWFyeV9fID0gIkNvcmUgdXRpbGl0aWVzIGZvciBQeXRob24gcGFja2FnZXMiCl9fdXJpX18gPSAiaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvcGFja2FnaW5nIgoKX192ZXJzaW9uX18gPSAiMTkuMiIKCl9fYXV0aG9yX18gPSAiRG9uYWxkIFN0dWZmdCBhbmQgaW5kaXZpZHVhbCBjb250cmlidXRvcnMiCl9fZW1haWxfXyA9ICJkb25hbGRAc3R1ZmZ0LmlvIgoKX19saWNlbnNlX18gPSAiQlNEIG9yIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCIKX19jb3B5cmlnaHRfXyA9ICJDb3B5cmlnaHQgMjAxNC0yMDE5ICVzIiAlIF9fYXV0aG9yX18KUEsDBBQAAAAAAAAAIQBlGxFEMgIAADICAABNAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvX3ZlbmRvci9wYWNrYWdpbmcvX19pbml0X18ucHkjIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24KIyAyLjAsIGFuZCB0aGUgQlNEIExpY2Vuc2UuIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcmVwb3NpdG9yeQojIGZvciBjb21wbGV0ZSBkZXRhaWxzLgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHByaW50X2Z1bmN0aW9uCgpmcm9tIC5fX2Fib3V0X18gaW1wb3J0ICgKICAgIF9fYXV0aG9yX18sCiAgICBfX2NvcHlyaWdodF9fLAogICAgX19lbWFpbF9fLAogICAgX19saWNlbnNlX18sCiAgICBfX3N1bW1hcnlfXywKICAgIF9fdGl0bGVfXywKICAgIF9fdXJpX18sCiAgICBfX3ZlcnNpb25fXywKKQoKX19hbGxfXyA9IFsKICAgICJfX3RpdGxlX18iLAogICAgIl9fc3VtbWFyeV9fIiwKICAgICJfX3VyaV9fIiwKICAgICJfX3ZlcnNpb25fXyIsCiAgICAiX19hdXRob3JfXyIsCiAgICAiX19lbWFpbF9fIiwKICAgICJfX2xpY2Vuc2VfXyIsCiAgICAiX19jb3B5cmlnaHRfXyIsCl0KUEsDBBQAAAAAAAAAIQBmitrjYQMAAGEDAABMAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvX3ZlbmRvci9wYWNrYWdpbmcvX2NvbXBhdC5weSMgVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbgojIDIuMCwgYW5kIHRoZSBCU0QgTGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyByZXBvc2l0b3J5CiMgZm9yIGNvbXBsZXRlIGRldGFpbHMuCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgcHJpbnRfZnVuY3Rpb24KCmltcG9ydCBzeXMKCgpQWTIgPSBzeXMudmVyc2lvbl9pbmZvWzBdID09IDIKUFkzID0gc3lzLnZlcnNpb25faW5mb1swXSA9PSAzCgojIGZsYWtlODogbm9xYQoKaWYgUFkzOgogICAgc3RyaW5nX3R5cGVzID0gKHN0ciwpCmVsc2U6CiAgICBzdHJpbmdfdHlwZXMgPSAoYmFzZXN0cmluZywpCgoKZGVmIHdpdGhfbWV0YWNsYXNzKG1ldGEsICpiYXNlcyk6CiAgICAiIiIKICAgIENyZWF0ZSBhIGJhc2UgY2xhc3Mgd2l0aCBhIG1ldGFjbGFzcy4KICAgICIiIgogICAgIyBUaGlzIHJlcXVpcmVzIGEgYml0IG9mIGV4cGxhbmF0aW9uOiB0aGUgYmFzaWMgaWRlYSBpcyB0byBtYWtlIGEgZHVtbXkKICAgICMgbWV0YWNsYXNzIGZvciBvbmUgbGV2ZWwgb2YgY2xhc3MgaW5zdGFudGlhdGlvbiB0aGF0IHJlcGxhY2VzIGl0c2VsZiB3aXRoCiAgICAjIHRoZSBhY3R1YWwgbWV0YWNsYXNzLgogICAgY2xhc3MgbWV0YWNsYXNzKG1ldGEpOgogICAgICAgIGRlZiBfX25ld19fKGNscywgbmFtZSwgdGhpc19iYXNlcywgZCk6CiAgICAgICAgICAgIHJldHVybiBtZXRhKG5hbWUsIGJhc2VzLCBkKQoKICAgIHJldHVybiB0eXBlLl9fbmV3X18obWV0YWNsYXNzLCAidGVtcG9yYXJ5X2NsYXNzIiwgKCksIHt9KQpQSwMEFAAAAAAAAAAhAGuPHJWIBQAAiAUAAFAAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9fdmVuZG9yL3BhY2thZ2luZy9fc3RydWN0dXJlcy5weSMgVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbgojIDIuMCwgYW5kIHRoZSBCU0QgTGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyByZXBvc2l0b3J5CiMgZm9yIGNvbXBsZXRlIGRldGFpbHMuCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgcHJpbnRfZnVuY3Rpb24KCgpjbGFzcyBJbmZpbml0eShvYmplY3QpOgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiSW5maW5pdHkiCgogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgIHJldHVybiBoYXNoKHJlcHIoc2VsZikpCgogICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIF9fbGVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKQoKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBub3QgaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pCgogICAgZGVmIF9fZ3RfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgX19nZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBfX25lZ19fKHNlbGYpOgogICAgICAgIHJldHVybiBOZWdhdGl2ZUluZmluaXR5CgoKSW5maW5pdHkgPSBJbmZpbml0eSgpCgoKY2xhc3MgTmVnYXRpdmVJbmZpbml0eShvYmplY3QpOgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiLUluZmluaXR5IgoKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICByZXR1cm4gaGFzaChyZXByKHNlbGYpKQoKICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIF9fbGVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIG5vdCBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXykKCiAgICBkZWYgX19ndF9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgX19nZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgX19uZWdfXyhzZWxmKToKICAgICAgICByZXR1cm4gSW5maW5pdHkKCgpOZWdhdGl2ZUluZmluaXR5ID0gTmVnYXRpdmVJbmZpbml0eSgpClBLAwQUAAAAAAAAACEALzniskwgAABMIAAATAAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL192ZW5kb3IvcGFja2FnaW5nL21hcmtlcnMucHkjIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24KIyAyLjAsIGFuZCB0aGUgQlNEIExpY2Vuc2UuIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcmVwb3NpdG9yeQojIGZvciBjb21wbGV0ZSBkZXRhaWxzLgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHByaW50X2Z1bmN0aW9uCgppbXBvcnQgb3BlcmF0b3IKaW1wb3J0IG9zCmltcG9ydCBwbGF0Zm9ybQppbXBvcnQgc3lzCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnB5cGFyc2luZyBpbXBvcnQgUGFyc2VFeGNlcHRpb24sIFBhcnNlUmVzdWx0cywgc3RyaW5nU3RhcnQsIHN0cmluZ0VuZApmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnB5cGFyc2luZyBpbXBvcnQgWmVyb09yTW9yZSwgR3JvdXAsIEZvcndhcmQsIFF1b3RlZFN0cmluZwpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnB5cGFyc2luZyBpbXBvcnQgTGl0ZXJhbCBhcyBMICAjIG5vcWEKCmZyb20gLl9jb21wYXQgaW1wb3J0IHN0cmluZ190eXBlcwpmcm9tIC5zcGVjaWZpZXJzIGltcG9ydCBTcGVjaWZpZXIsIEludmFsaWRTcGVjaWZpZXIKCgpfX2FsbF9fID0gWwogICAgIkludmFsaWRNYXJrZXIiLAogICAgIlVuZGVmaW5lZENvbXBhcmlzb24iLAogICAgIlVuZGVmaW5lZEVudmlyb25tZW50TmFtZSIsCiAgICAiTWFya2VyIiwKICAgICJkZWZhdWx0X2Vudmlyb25tZW50IiwKXQoKCmNsYXNzIEludmFsaWRNYXJrZXIoVmFsdWVFcnJvcik6CiAgICAiIiIKICAgIEFuIGludmFsaWQgbWFya2VyIHdhcyBmb3VuZCwgdXNlcnMgc2hvdWxkIHJlZmVyIHRvIFBFUCA1MDguCiAgICAiIiIKCgpjbGFzcyBVbmRlZmluZWRDb21wYXJpc29uKFZhbHVlRXJyb3IpOgogICAgIiIiCiAgICBBbiBpbnZhbGlkIG9wZXJhdGlvbiB3YXMgYXR0ZW1wdGVkIG9uIGEgdmFsdWUgdGhhdCBkb2Vzbid0IHN1cHBvcnQgaXQuCiAgICAiIiIKCgpjbGFzcyBVbmRlZmluZWRFbnZpcm9ubWVudE5hbWUoVmFsdWVFcnJvcik6CiAgICAiIiIKICAgIEEgbmFtZSB3YXMgYXR0ZW1wdGVkIHRvIGJlIHVzZWQgdGhhdCBkb2VzIG5vdCBleGlzdCBpbnNpZGUgb2YgdGhlCiAgICBlbnZpcm9ubWVudC4KICAgICIiIgoKCmNsYXNzIE5vZGUob2JqZWN0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZSk6CiAgICAgICAgc2VsZi52YWx1ZSA9IHZhbHVlCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHN0cihzZWxmLnZhbHVlKQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIjx7MH0oezEhcn0pPiIuZm9ybWF0KHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzdHIoc2VsZikpCgogICAgZGVmIHNlcmlhbGl6ZShzZWxmKToKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCgoKY2xhc3MgVmFyaWFibGUoTm9kZSk6CiAgICBkZWYgc2VyaWFsaXplKHNlbGYpOgogICAgICAgIHJldHVybiBzdHIoc2VsZikKCgpjbGFzcyBWYWx1ZShOb2RlKToKICAgIGRlZiBzZXJpYWxpemUoc2VsZik6CiAgICAgICAgcmV0dXJuICciezB9IicuZm9ybWF0KHNlbGYpCgoKY2xhc3MgT3AoTm9kZSk6CiAgICBkZWYgc2VyaWFsaXplKHNlbGYpOgogICAgICAgIHJldHVybiBzdHIoc2VsZikKCgpWQVJJQUJMRSA9ICgKICAgIEwoImltcGxlbWVudGF0aW9uX3ZlcnNpb24iKQogICAgfCBMKCJwbGF0Zm9ybV9weXRob25faW1wbGVtZW50YXRpb24iKQogICAgfCBMKCJpbXBsZW1lbnRhdGlvbl9uYW1lIikKICAgIHwgTCgicHl0aG9uX2Z1bGxfdmVyc2lvbiIpCiAgICB8IEwoInBsYXRmb3JtX3JlbGVhc2UiKQogICAgfCBMKCJwbGF0Zm9ybV92ZXJzaW9uIikKICAgIHwgTCgicGxhdGZvcm1fbWFjaGluZSIpCiAgICB8IEwoInBsYXRmb3JtX3N5c3RlbSIpCiAgICB8IEwoInB5dGhvbl92ZXJzaW9uIikKICAgIHwgTCgic3lzX3BsYXRmb3JtIikKICAgIHwgTCgib3NfbmFtZSIpCiAgICB8IEwoIm9zLm5hbWUiKQogICAgfCBMKCJzeXMucGxhdGZvcm0iKSAgIyBQRVAtMzQ1CiAgICB8IEwoInBsYXRmb3JtLnZlcnNpb24iKSAgIyBQRVAtMzQ1CiAgICB8IEwoInBsYXRmb3JtLm1hY2hpbmUiKSAgIyBQRVAtMzQ1CiAgICB8IEwoInBsYXRmb3JtLnB5dGhvbl9pbXBsZW1lbnRhdGlvbiIpICAjIFBFUC0zNDUKICAgIHwgTCgicHl0aG9uX2ltcGxlbWVudGF0aW9uIikgICMgUEVQLTM0NQogICAgfCBMKCJleHRyYSIpICAjIHVuZG9jdW1lbnRlZCBzZXR1cHRvb2xzIGxlZ2FjeQopCkFMSUFTRVMgPSB7CiAgICAib3MubmFtZSI6ICJvc19uYW1lIiwKICAgICJzeXMucGxhdGZvcm0iOiAic3lzX3BsYXRmb3JtIiwKICAgICJwbGF0Zm9ybS52ZXJzaW9uIjogInBsYXRmb3JtX3ZlcnNpb24iLAogICAgInBsYXRmb3JtLm1hY2hpbmUiOiAicGxhdGZvcm1fbWFjaGluZSIsCiAgICAicGxhdGZvcm0ucHl0aG9uX2ltcGxlbWVudGF0aW9uIjogInBsYXRmb3JtX3B5dGhvbl9pbXBsZW1lbnRhdGlvbiIsCiAgICAicHl0aG9uX2ltcGxlbWVudGF0aW9uIjogInBsYXRmb3JtX3B5dGhvbl9pbXBsZW1lbnRhdGlvbiIsCn0KVkFSSUFCTEUuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsIGwsIHQ6IFZhcmlhYmxlKEFMSUFTRVMuZ2V0KHRbMF0sIHRbMF0pKSkKClZFUlNJT05fQ01QID0gKAogICAgTCgiPT09IikgfCBMKCI9PSIpIHwgTCgiPj0iKSB8IEwoIjw9IikgfCBMKCIhPSIpIHwgTCgifj0iKSB8IEwoIj4iKSB8IEwoIjwiKQopCgpNQVJLRVJfT1AgPSBWRVJTSU9OX0NNUCB8IEwoIm5vdCBpbiIpIHwgTCgiaW4iKQpNQVJLRVJfT1Auc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsIGwsIHQ6IE9wKHRbMF0pKQoKTUFSS0VSX1ZBTFVFID0gUXVvdGVkU3RyaW5nKCInIikgfCBRdW90ZWRTdHJpbmcoJyInKQpNQVJLRVJfVkFMVUUuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsIGwsIHQ6IFZhbHVlKHRbMF0pKQoKQk9PTE9QID0gTCgiYW5kIikgfCBMKCJvciIpCgpNQVJLRVJfVkFSID0gVkFSSUFCTEUgfCBNQVJLRVJfVkFMVUUKCk1BUktFUl9JVEVNID0gR3JvdXAoTUFSS0VSX1ZBUiArIE1BUktFUl9PUCArIE1BUktFUl9WQVIpCk1BUktFUl9JVEVNLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLCBsLCB0OiB0dXBsZSh0WzBdKSkKCkxQQVJFTiA9IEwoIigiKS5zdXBwcmVzcygpClJQQVJFTiA9IEwoIikiKS5zdXBwcmVzcygpCgpNQVJLRVJfRVhQUiA9IEZvcndhcmQoKQpNQVJLRVJfQVRPTSA9IE1BUktFUl9JVEVNIHwgR3JvdXAoTFBBUkVOICsgTUFSS0VSX0VYUFIgKyBSUEFSRU4pCk1BUktFUl9FWFBSIDw8IE1BUktFUl9BVE9NICsgWmVyb09yTW9yZShCT09MT1AgKyBNQVJLRVJfRVhQUikKCk1BUktFUiA9IHN0cmluZ1N0YXJ0ICsgTUFSS0VSX0VYUFIgKyBzdHJpbmdFbmQKCgpkZWYgX2NvZXJjZV9wYXJzZV9yZXN1bHQocmVzdWx0cyk6CiAgICBpZiBpc2luc3RhbmNlKHJlc3VsdHMsIFBhcnNlUmVzdWx0cyk6CiAgICAgICAgcmV0dXJuIFtfY29lcmNlX3BhcnNlX3Jlc3VsdChpKSBmb3IgaSBpbiByZXN1bHRzXQogICAgZWxzZToKICAgICAgICByZXR1cm4gcmVzdWx0cwoKCmRlZiBfZm9ybWF0X21hcmtlcihtYXJrZXIsIGZpcnN0PVRydWUpOgogICAgYXNzZXJ0IGlzaW5zdGFuY2UobWFya2VyLCAobGlzdCwgdHVwbGUsIHN0cmluZ190eXBlcykpCgogICAgIyBTb21ldGltZXMgd2UgaGF2ZSBhIHN0cnVjdHVyZSBsaWtlIFtbLi4uXV0gd2hpY2ggaXMgYSBzaW5nbGUgaXRlbSBsaXN0CiAgICAjIHdoZXJlIHRoZSBzaW5nbGUgaXRlbSBpcyBpdHNlbGYgaXQncyBvd24gbGlzdC4gSW4gdGhhdCBjYXNlIHdlIHdhbnQgc2tpcAogICAgIyB0aGUgcmVzdCBvZiB0aGlzIGZ1bmN0aW9uIHNvIHRoYXQgd2UgZG9uJ3QgZ2V0IGV4dHJhbmVvdXMgKCkgb24gdGhlCiAgICAjIG91dHNpZGUuCiAgICBpZiAoCiAgICAgICAgaXNpbnN0YW5jZShtYXJrZXIsIGxpc3QpCiAgICAgICAgYW5kIGxlbihtYXJrZXIpID09IDEKICAgICAgICBhbmQgaXNpbnN0YW5jZShtYXJrZXJbMF0sIChsaXN0LCB0dXBsZSkpCiAgICApOgogICAgICAgIHJldHVybiBfZm9ybWF0X21hcmtlcihtYXJrZXJbMF0pCgogICAgaWYgaXNpbnN0YW5jZShtYXJrZXIsIGxpc3QpOgogICAgICAgIGlubmVyID0gKF9mb3JtYXRfbWFya2VyKG0sIGZpcnN0PUZhbHNlKSBmb3IgbSBpbiBtYXJrZXIpCiAgICAgICAgaWYgZmlyc3Q6CiAgICAgICAgICAgIHJldHVybiAiICIuam9pbihpbm5lcikKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gIigiICsgIiAiLmpvaW4oaW5uZXIpICsgIikiCiAgICBlbGlmIGlzaW5zdGFuY2UobWFya2VyLCB0dXBsZSk6CiAgICAgICAgcmV0dXJuICIgIi5qb2luKFttLnNlcmlhbGl6ZSgpIGZvciBtIGluIG1hcmtlcl0pCiAgICBlbHNlOgogICAgICAgIHJldHVybiBtYXJrZXIKCgpfb3BlcmF0b3JzID0gewogICAgImluIjogbGFtYmRhIGxocywgcmhzOiBsaHMgaW4gcmhzLAogICAgIm5vdCBpbiI6IGxhbWJkYSBsaHMsIHJoczogbGhzIG5vdCBpbiByaHMsCiAgICAiPCI6IG9wZXJhdG9yLmx0LAogICAgIjw9Ijogb3BlcmF0b3IubGUsCiAgICAiPT0iOiBvcGVyYXRvci5lcSwKICAgICIhPSI6IG9wZXJhdG9yLm5lLAogICAgIj49Ijogb3BlcmF0b3IuZ2UsCiAgICAiPiI6IG9wZXJhdG9yLmd0LAp9CgoKZGVmIF9ldmFsX29wKGxocywgb3AsIHJocyk6CiAgICB0cnk6CiAgICAgICAgc3BlYyA9IFNwZWNpZmllcigiIi5qb2luKFtvcC5zZXJpYWxpemUoKSwgcmhzXSkpCiAgICBleGNlcHQgSW52YWxpZFNwZWNpZmllcjoKICAgICAgICBwYXNzCiAgICBlbHNlOgogICAgICAgIHJldHVybiBzcGVjLmNvbnRhaW5zKGxocykKCiAgICBvcGVyID0gX29wZXJhdG9ycy5nZXQob3Auc2VyaWFsaXplKCkpCiAgICBpZiBvcGVyIGlzIE5vbmU6CiAgICAgICAgcmFpc2UgVW5kZWZpbmVkQ29tcGFyaXNvbigKICAgICAgICAgICAgIlVuZGVmaW5lZCB7MCFyfSBvbiB7MSFyfSBhbmQgezIhcn0uIi5mb3JtYXQob3AsIGxocywgcmhzKQogICAgICAgICkKCiAgICByZXR1cm4gb3BlcihsaHMsIHJocykKCgpfdW5kZWZpbmVkID0gb2JqZWN0KCkKCgpkZWYgX2dldF9lbnYoZW52aXJvbm1lbnQsIG5hbWUpOgogICAgdmFsdWUgPSBlbnZpcm9ubWVudC5nZXQobmFtZSwgX3VuZGVmaW5lZCkKCiAgICBpZiB2YWx1ZSBpcyBfdW5kZWZpbmVkOgogICAgICAgIHJhaXNlIFVuZGVmaW5lZEVudmlyb25tZW50TmFtZSgKICAgICAgICAgICAgInswIXJ9IGRvZXMgbm90IGV4aXN0IGluIGV2YWx1YXRpb24gZW52aXJvbm1lbnQuIi5mb3JtYXQobmFtZSkKICAgICAgICApCgogICAgcmV0dXJuIHZhbHVlCgoKZGVmIF9ldmFsdWF0ZV9tYXJrZXJzKG1hcmtlcnMsIGVudmlyb25tZW50KToKICAgIGdyb3VwcyA9IFtbXV0KCiAgICBmb3IgbWFya2VyIGluIG1hcmtlcnM6CiAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UobWFya2VyLCAobGlzdCwgdHVwbGUsIHN0cmluZ190eXBlcykpCgogICAgICAgIGlmIGlzaW5zdGFuY2UobWFya2VyLCBsaXN0KToKICAgICAgICAgICAgZ3JvdXBzWy0xXS5hcHBlbmQoX2V2YWx1YXRlX21hcmtlcnMobWFya2VyLCBlbnZpcm9ubWVudCkpCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKG1hcmtlciwgdHVwbGUpOgogICAgICAgICAgICBsaHMsIG9wLCByaHMgPSBtYXJrZXIKCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UobGhzLCBWYXJpYWJsZSk6CiAgICAgICAgICAgICAgICBsaHNfdmFsdWUgPSBfZ2V0X2VudihlbnZpcm9ubWVudCwgbGhzLnZhbHVlKQogICAgICAgICAgICAgICAgcmhzX3ZhbHVlID0gcmhzLnZhbHVlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBsaHNfdmFsdWUgPSBsaHMudmFsdWUKICAgICAgICAgICAgICAgIHJoc192YWx1ZSA9IF9nZXRfZW52KGVudmlyb25tZW50LCByaHMudmFsdWUpCgogICAgICAgICAgICBncm91cHNbLTFdLmFwcGVuZChfZXZhbF9vcChsaHNfdmFsdWUsIG9wLCByaHNfdmFsdWUpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGFzc2VydCBtYXJrZXIgaW4gWyJhbmQiLCAib3IiXQogICAgICAgICAgICBpZiBtYXJrZXIgPT0gIm9yIjoKICAgICAgICAgICAgICAgIGdyb3Vwcy5hcHBlbmQoW10pCgogICAgcmV0dXJuIGFueShhbGwoaXRlbSkgZm9yIGl0ZW0gaW4gZ3JvdXBzKQoKCmRlZiBmb3JtYXRfZnVsbF92ZXJzaW9uKGluZm8pOgogICAgdmVyc2lvbiA9ICJ7MC5tYWpvcn0uezAubWlub3J9LnswLm1pY3JvfSIuZm9ybWF0KGluZm8pCiAgICBraW5kID0gaW5mby5yZWxlYXNlbGV2ZWwKICAgIGlmIGtpbmQgIT0gImZpbmFsIjoKICAgICAgICB2ZXJzaW9uICs9IGtpbmRbMF0gKyBzdHIoaW5mby5zZXJpYWwpCiAgICByZXR1cm4gdmVyc2lvbgoKCmRlZiBkZWZhdWx0X2Vudmlyb25tZW50KCk6CiAgICBpZiBoYXNhdHRyKHN5cywgImltcGxlbWVudGF0aW9uIik6CiAgICAgICAgaXZlciA9IGZvcm1hdF9mdWxsX3ZlcnNpb24oc3lzLmltcGxlbWVudGF0aW9uLnZlcnNpb24pCiAgICAgICAgaW1wbGVtZW50YXRpb25fbmFtZSA9IHN5cy5pbXBsZW1lbnRhdGlvbi5uYW1lCiAgICBlbHNlOgogICAgICAgIGl2ZXIgPSAiMCIKICAgICAgICBpbXBsZW1lbnRhdGlvbl9uYW1lID0gIiIKCiAgICByZXR1cm4gewogICAgICAgICJpbXBsZW1lbnRhdGlvbl9uYW1lIjogaW1wbGVtZW50YXRpb25fbmFtZSwKICAgICAgICAiaW1wbGVtZW50YXRpb25fdmVyc2lvbiI6IGl2ZXIsCiAgICAgICAgIm9zX25hbWUiOiBvcy5uYW1lLAogICAgICAgICJwbGF0Zm9ybV9tYWNoaW5lIjogcGxhdGZvcm0ubWFjaGluZSgpLAogICAgICAgICJwbGF0Zm9ybV9yZWxlYXNlIjogcGxhdGZvcm0ucmVsZWFzZSgpLAogICAgICAgICJwbGF0Zm9ybV9zeXN0ZW0iOiBwbGF0Zm9ybS5zeXN0ZW0oKSwKICAgICAgICAicGxhdGZvcm1fdmVyc2lvbiI6IHBsYXRmb3JtLnZlcnNpb24oKSwKICAgICAgICAicHl0aG9uX2Z1bGxfdmVyc2lvbiI6IHBsYXRmb3JtLnB5dGhvbl92ZXJzaW9uKCksCiAgICAgICAgInBsYXRmb3JtX3B5dGhvbl9pbXBsZW1lbnRhdGlvbiI6IHBsYXRmb3JtLnB5dGhvbl9pbXBsZW1lbnRhdGlvbigpLAogICAgICAgICJweXRob25fdmVyc2lvbiI6ICIuIi5qb2luKHBsYXRmb3JtLnB5dGhvbl92ZXJzaW9uX3R1cGxlKClbOjJdKSwKICAgICAgICAic3lzX3BsYXRmb3JtIjogc3lzLnBsYXRmb3JtLAogICAgfQoKCmNsYXNzIE1hcmtlcihvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hcmtlcik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLl9tYXJrZXJzID0gX2NvZXJjZV9wYXJzZV9yZXN1bHQoTUFSS0VSLnBhcnNlU3RyaW5nKG1hcmtlcikpCiAgICAgICAgZXhjZXB0IFBhcnNlRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIGVycl9zdHIgPSAiSW52YWxpZCBtYXJrZXI6IHswIXJ9LCBwYXJzZSBlcnJvciBhdCB7MSFyfSIuZm9ybWF0KAogICAgICAgICAgICAgICAgbWFya2VyLCBtYXJrZXJbZS5sb2MgOiBlLmxvYyArIDhdCiAgICAgICAgICAgICkKICAgICAgICAgICAgcmFpc2UgSW52YWxpZE1hcmtlcihlcnJfc3RyKQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiBfZm9ybWF0X21hcmtlcihzZWxmLl9tYXJrZXJzKQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIjxNYXJrZXIoezAhcn0pPiIuZm9ybWF0KHN0cihzZWxmKSkKCiAgICBkZWYgZXZhbHVhdGUoc2VsZiwgZW52aXJvbm1lbnQ9Tm9uZSk6CiAgICAgICAgIiIiRXZhbHVhdGUgYSBtYXJrZXIuCgogICAgICAgIFJldHVybiB0aGUgYm9vbGVhbiBmcm9tIGV2YWx1YXRpbmcgdGhlIGdpdmVuIG1hcmtlciBhZ2FpbnN0IHRoZQogICAgICAgIGVudmlyb25tZW50LiBlbnZpcm9ubWVudCBpcyBhbiBvcHRpb25hbCBhcmd1bWVudCB0byBvdmVycmlkZSBhbGwgb3IKICAgICAgICBwYXJ0IG9mIHRoZSBkZXRlcm1pbmVkIGVudmlyb25tZW50LgoKICAgICAgICBUaGUgZW52aXJvbm1lbnQgaXMgZGV0ZXJtaW5lZCBmcm9tIHRoZSBjdXJyZW50IFB5dGhvbiBwcm9jZXNzLgogICAgICAgICIiIgogICAgICAgIGN1cnJlbnRfZW52aXJvbm1lbnQgPSBkZWZhdWx0X2Vudmlyb25tZW50KCkKICAgICAgICBpZiBlbnZpcm9ubWVudCBpcyBub3QgTm9uZToKICAgICAgICAgICAgY3VycmVudF9lbnZpcm9ubWVudC51cGRhdGUoZW52aXJvbm1lbnQpCgogICAgICAgIHJldHVybiBfZXZhbHVhdGVfbWFya2VycyhzZWxmLl9tYXJrZXJzLCBjdXJyZW50X2Vudmlyb25tZW50KQpQSwMEFAAAAAAAAAAhADj6V1yGEgAAhhIAAFEAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9fdmVuZG9yL3BhY2thZ2luZy9yZXF1aXJlbWVudHMucHkjIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24KIyAyLjAsIGFuZCB0aGUgQlNEIExpY2Vuc2UuIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcmVwb3NpdG9yeQojIGZvciBjb21wbGV0ZSBkZXRhaWxzLgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHByaW50X2Z1bmN0aW9uCgppbXBvcnQgc3RyaW5nCmltcG9ydCByZQoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5weXBhcnNpbmcgaW1wb3J0IHN0cmluZ1N0YXJ0LCBzdHJpbmdFbmQsIG9yaWdpbmFsVGV4dEZvciwgUGFyc2VFeGNlcHRpb24KZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5weXBhcnNpbmcgaW1wb3J0IFplcm9Pck1vcmUsIFdvcmQsIE9wdGlvbmFsLCBSZWdleCwgQ29tYmluZQpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnB5cGFyc2luZyBpbXBvcnQgTGl0ZXJhbCBhcyBMICAjIG5vcWEKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5zaXgubW92ZXMudXJsbGliIGltcG9ydCBwYXJzZSBhcyB1cmxwYXJzZQoKZnJvbSAubWFya2VycyBpbXBvcnQgTUFSS0VSX0VYUFIsIE1hcmtlcgpmcm9tIC5zcGVjaWZpZXJzIGltcG9ydCBMZWdhY3lTcGVjaWZpZXIsIFNwZWNpZmllciwgU3BlY2lmaWVyU2V0CgoKY2xhc3MgSW52YWxpZFJlcXVpcmVtZW50KFZhbHVlRXJyb3IpOgogICAgIiIiCiAgICBBbiBpbnZhbGlkIHJlcXVpcmVtZW50IHdhcyBmb3VuZCwgdXNlcnMgc2hvdWxkIHJlZmVyIHRvIFBFUCA1MDguCiAgICAiIiIKCgpBTFBIQU5VTSA9IFdvcmQoc3RyaW5nLmFzY2lpX2xldHRlcnMgKyBzdHJpbmcuZGlnaXRzKQoKTEJSQUNLRVQgPSBMKCJbIikuc3VwcHJlc3MoKQpSQlJBQ0tFVCA9IEwoIl0iKS5zdXBwcmVzcygpCkxQQVJFTiA9IEwoIigiKS5zdXBwcmVzcygpClJQQVJFTiA9IEwoIikiKS5zdXBwcmVzcygpCkNPTU1BID0gTCgiLCIpLnN1cHByZXNzKCkKU0VNSUNPTE9OID0gTCgiOyIpLnN1cHByZXNzKCkKQVQgPSBMKCJAIikuc3VwcHJlc3MoKQoKUFVOQ1RVQVRJT04gPSBXb3JkKCItXy4iKQpJREVOVElGSUVSX0VORCA9IEFMUEhBTlVNIHwgKFplcm9Pck1vcmUoUFVOQ1RVQVRJT04pICsgQUxQSEFOVU0pCklERU5USUZJRVIgPSBDb21iaW5lKEFMUEhBTlVNICsgWmVyb09yTW9yZShJREVOVElGSUVSX0VORCkpCgpOQU1FID0gSURFTlRJRklFUigibmFtZSIpCkVYVFJBID0gSURFTlRJRklFUgoKVVJJID0gUmVnZXgociJbXiBdKyIpKCJ1cmwiKQpVUkwgPSBBVCArIFVSSQoKRVhUUkFTX0xJU1QgPSBFWFRSQSArIFplcm9Pck1vcmUoQ09NTUEgKyBFWFRSQSkKRVhUUkFTID0gKExCUkFDS0VUICsgT3B0aW9uYWwoRVhUUkFTX0xJU1QpICsgUkJSQUNLRVQpKCJleHRyYXMiKQoKVkVSU0lPTl9QRVA0NDAgPSBSZWdleChTcGVjaWZpZXIuX3JlZ2V4X3N0ciwgcmUuVkVSQk9TRSB8IHJlLklHTk9SRUNBU0UpClZFUlNJT05fTEVHQUNZID0gUmVnZXgoTGVnYWN5U3BlY2lmaWVyLl9yZWdleF9zdHIsIHJlLlZFUkJPU0UgfCByZS5JR05PUkVDQVNFKQoKVkVSU0lPTl9PTkUgPSBWRVJTSU9OX1BFUDQ0MCBeIFZFUlNJT05fTEVHQUNZClZFUlNJT05fTUFOWSA9IENvbWJpbmUoCiAgICBWRVJTSU9OX09ORSArIFplcm9Pck1vcmUoQ09NTUEgKyBWRVJTSU9OX09ORSksIGpvaW5TdHJpbmc9IiwiLCBhZGphY2VudD1GYWxzZQopKCJfcmF3X3NwZWMiKQpfVkVSU0lPTl9TUEVDID0gT3B0aW9uYWwoKChMUEFSRU4gKyBWRVJTSU9OX01BTlkgKyBSUEFSRU4pIHwgVkVSU0lPTl9NQU5ZKSkKX1ZFUlNJT05fU1BFQy5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcywgbCwgdDogdC5fcmF3X3NwZWMgb3IgIiIpCgpWRVJTSU9OX1NQRUMgPSBvcmlnaW5hbFRleHRGb3IoX1ZFUlNJT05fU1BFQykoInNwZWNpZmllciIpClZFUlNJT05fU1BFQy5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcywgbCwgdDogdFsxXSkKCk1BUktFUl9FWFBSID0gb3JpZ2luYWxUZXh0Rm9yKE1BUktFUl9FWFBSKCkpKCJtYXJrZXIiKQpNQVJLRVJfRVhQUi5zZXRQYXJzZUFjdGlvbigKICAgIGxhbWJkYSBzLCBsLCB0OiBNYXJrZXIoc1t0Ll9vcmlnaW5hbF9zdGFydCA6IHQuX29yaWdpbmFsX2VuZF0pCikKTUFSS0VSX1NFUEFSQVRPUiA9IFNFTUlDT0xPTgpNQVJLRVIgPSBNQVJLRVJfU0VQQVJBVE9SICsgTUFSS0VSX0VYUFIKClZFUlNJT05fQU5EX01BUktFUiA9IFZFUlNJT05fU1BFQyArIE9wdGlvbmFsKE1BUktFUikKVVJMX0FORF9NQVJLRVIgPSBVUkwgKyBPcHRpb25hbChNQVJLRVIpCgpOQU1FRF9SRVFVSVJFTUVOVCA9IE5BTUUgKyBPcHRpb25hbChFWFRSQVMpICsgKFVSTF9BTkRfTUFSS0VSIHwgVkVSU0lPTl9BTkRfTUFSS0VSKQoKUkVRVUlSRU1FTlQgPSBzdHJpbmdTdGFydCArIE5BTUVEX1JFUVVJUkVNRU5UICsgc3RyaW5nRW5kCiMgc2V0dXB0b29scy5leHRlcm4ucHlwYXJzaW5nIGlzbid0IHRocmVhZCBzYWZlIGR1cmluZyBpbml0aWFsaXphdGlvbiwgc28gd2UgZG8gaXQgZWFnZXJseSwgc2VlCiMgaXNzdWUgIzEwNApSRVFVSVJFTUVOVC5wYXJzZVN0cmluZygieFtdIikKCgpjbGFzcyBSZXF1aXJlbWVudChvYmplY3QpOgogICAgIiIiUGFyc2UgYSByZXF1aXJlbWVudC4KCiAgICBQYXJzZSBhIGdpdmVuIHJlcXVpcmVtZW50IHN0cmluZyBpbnRvIGl0cyBwYXJ0cywgc3VjaCBhcyBuYW1lLCBzcGVjaWZpZXIsCiAgICBVUkwsIGFuZCBleHRyYXMuIFJhaXNlcyBJbnZhbGlkUmVxdWlyZW1lbnQgb24gYSBiYWRseS1mb3JtZWQgcmVxdWlyZW1lbnQKICAgIHN0cmluZy4KICAgICIiIgoKICAgICMgVE9ETzogQ2FuIHdlIHRlc3Qgd2hldGhlciBzb21ldGhpbmcgaXMgY29udGFpbmVkIHdpdGhpbiBhIHJlcXVpcmVtZW50PwogICAgIyAgICAgICBJZiBzbyBob3cgZG8gd2UgZG8gdGhhdD8gRG8gd2UgbmVlZCB0byB0ZXN0IGFnYWluc3QgdGhlIF9uYW1lXyBvZgogICAgIyAgICAgICB0aGUgdGhpbmcgYXMgd2VsbCBhcyB0aGUgdmVyc2lvbj8gV2hhdCBhYm91dCB0aGUgbWFya2Vycz8KICAgICMgVE9ETzogQ2FuIHdlIG5vcm1hbGl6ZSB0aGUgbmFtZSBhbmQgZXh0cmEgbmFtZT8KCiAgICBkZWYgX19pbml0X18oc2VsZiwgcmVxdWlyZW1lbnRfc3RyaW5nKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJlcSA9IFJFUVVJUkVNRU5ULnBhcnNlU3RyaW5nKHJlcXVpcmVtZW50X3N0cmluZykKICAgICAgICBleGNlcHQgUGFyc2VFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgcmFpc2UgSW52YWxpZFJlcXVpcmVtZW50KAogICAgICAgICAgICAgICAgJ1BhcnNlIGVycm9yIGF0ICJ7MCFyfSI6IHsxfScuZm9ybWF0KAogICAgICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50X3N0cmluZ1tlLmxvYyA6IGUubG9jICsgOF0sIGUubXNnCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICkKCiAgICAgICAgc2VsZi5uYW1lID0gcmVxLm5hbWUKICAgICAgICBpZiByZXEudXJsOgogICAgICAgICAgICBwYXJzZWRfdXJsID0gdXJscGFyc2UudXJscGFyc2UocmVxLnVybCkKICAgICAgICAgICAgaWYgcGFyc2VkX3VybC5zY2hlbWUgPT0gImZpbGUiOgogICAgICAgICAgICAgICAgaWYgdXJscGFyc2UudXJsdW5wYXJzZShwYXJzZWRfdXJsKSAhPSByZXEudXJsOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIEludmFsaWRSZXF1aXJlbWVudCgiSW52YWxpZCBVUkwgZ2l2ZW4iKQogICAgICAgICAgICBlbGlmIG5vdCAocGFyc2VkX3VybC5zY2hlbWUgYW5kIHBhcnNlZF91cmwubmV0bG9jKSBvciAoCiAgICAgICAgICAgICAgICBub3QgcGFyc2VkX3VybC5zY2hlbWUgYW5kIG5vdCBwYXJzZWRfdXJsLm5ldGxvYwogICAgICAgICAgICApOgogICAgICAgICAgICAgICAgcmFpc2UgSW52YWxpZFJlcXVpcmVtZW50KCJJbnZhbGlkIFVSTDogezB9Ii5mb3JtYXQocmVxLnVybCkpCiAgICAgICAgICAgIHNlbGYudXJsID0gcmVxLnVybAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudXJsID0gTm9uZQogICAgICAgIHNlbGYuZXh0cmFzID0gc2V0KHJlcS5leHRyYXMuYXNMaXN0KCkgaWYgcmVxLmV4dHJhcyBlbHNlIFtdKQogICAgICAgIHNlbGYuc3BlY2lmaWVyID0gU3BlY2lmaWVyU2V0KHJlcS5zcGVjaWZpZXIpCiAgICAgICAgc2VsZi5tYXJrZXIgPSByZXEubWFya2VyIGlmIHJlcS5tYXJrZXIgZWxzZSBOb25lCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcGFydHMgPSBbc2VsZi5uYW1lXQoKICAgICAgICBpZiBzZWxmLmV4dHJhczoKICAgICAgICAgICAgcGFydHMuYXBwZW5kKCJbezB9XSIuZm9ybWF0KCIsIi5qb2luKHNvcnRlZChzZWxmLmV4dHJhcykpKSkKCiAgICAgICAgaWYgc2VsZi5zcGVjaWZpZXI6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZChzdHIoc2VsZi5zcGVjaWZpZXIpKQoKICAgICAgICBpZiBzZWxmLnVybDoKICAgICAgICAgICAgcGFydHMuYXBwZW5kKCJAIHswfSIuZm9ybWF0KHNlbGYudXJsKSkKICAgICAgICAgICAgaWYgc2VsZi5tYXJrZXI6CiAgICAgICAgICAgICAgICBwYXJ0cy5hcHBlbmQoIiAiKQoKICAgICAgICBpZiBzZWxmLm1hcmtlcjoKICAgICAgICAgICAgcGFydHMuYXBwZW5kKCI7IHswfSIuZm9ybWF0KHNlbGYubWFya2VyKSkKCiAgICAgICAgcmV0dXJuICIiLmpvaW4ocGFydHMpCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiPFJlcXVpcmVtZW50KHswIXJ9KT4iLmZvcm1hdChzdHIoc2VsZikpClBLAwQUAAAAAAAAACEA8ohG04JsAACCbAAATwAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL192ZW5kb3IvcGFja2FnaW5nL3NwZWNpZmllcnMucHkjIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24KIyAyLjAsIGFuZCB0aGUgQlNEIExpY2Vuc2UuIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcmVwb3NpdG9yeQojIGZvciBjb21wbGV0ZSBkZXRhaWxzLgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHByaW50X2Z1bmN0aW9uCgppbXBvcnQgYWJjCmltcG9ydCBmdW5jdG9vbHMKaW1wb3J0IGl0ZXJ0b29scwppbXBvcnQgcmUKCmZyb20gLl9jb21wYXQgaW1wb3J0IHN0cmluZ190eXBlcywgd2l0aF9tZXRhY2xhc3MKZnJvbSAudmVyc2lvbiBpbXBvcnQgVmVyc2lvbiwgTGVnYWN5VmVyc2lvbiwgcGFyc2UKCgpjbGFzcyBJbnZhbGlkU3BlY2lmaWVyKFZhbHVlRXJyb3IpOgogICAgIiIiCiAgICBBbiBpbnZhbGlkIHNwZWNpZmllciB3YXMgZm91bmQsIHVzZXJzIHNob3VsZCByZWZlciB0byBQRVAgNDQwLgogICAgIiIiCgoKY2xhc3MgQmFzZVNwZWNpZmllcih3aXRoX21ldGFjbGFzcyhhYmMuQUJDTWV0YSwgb2JqZWN0KSk6CiAgICBAYWJjLmFic3RyYWN0bWV0aG9kCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm5zIHRoZSBzdHIgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBTcGVjaWZpZXIgbGlrZSBvYmplY3QuIFRoaXMKICAgICAgICBzaG91bGQgYmUgcmVwcmVzZW50YXRpdmUgb2YgdGhlIFNwZWNpZmllciBpdHNlbGYuCiAgICAgICAgIiIiCgogICAgQGFiYy5hYnN0cmFjdG1ldGhvZAogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybnMgYSBoYXNoIHZhbHVlIGZvciB0aGlzIFNwZWNpZmllciBsaWtlIG9iamVjdC4KICAgICAgICAiIiIKCiAgICBAYWJjLmFic3RyYWN0bWV0aG9kCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm5zIGEgYm9vbGVhbiByZXByZXNlbnRpbmcgd2hldGhlciBvciBub3QgdGhlIHR3byBTcGVjaWZpZXIgbGlrZQogICAgICAgIG9iamVjdHMgYXJlIGVxdWFsLgogICAgICAgICIiIgoKICAgIEBhYmMuYWJzdHJhY3RtZXRob2QKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgICIiIgogICAgICAgIFJldHVybnMgYSBib29sZWFuIHJlcHJlc2VudGluZyB3aGV0aGVyIG9yIG5vdCB0aGUgdHdvIFNwZWNpZmllciBsaWtlCiAgICAgICAgb2JqZWN0cyBhcmUgbm90IGVxdWFsLgogICAgICAgICIiIgoKICAgIEBhYmMuYWJzdHJhY3Rwcm9wZXJ0eQogICAgZGVmIHByZXJlbGVhc2VzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybnMgd2hldGhlciBvciBub3QgcHJlLXJlbGVhc2VzIGFzIGEgd2hvbGUgYXJlIGFsbG93ZWQgYnkgdGhpcwogICAgICAgIHNwZWNpZmllci4KICAgICAgICAiIiIKCiAgICBAcHJlcmVsZWFzZXMuc2V0dGVyCiAgICBkZWYgcHJlcmVsZWFzZXMoc2VsZiwgdmFsdWUpOgogICAgICAgICIiIgogICAgICAgIFNldHMgd2hldGhlciBvciBub3QgcHJlLXJlbGVhc2VzIGFzIGEgd2hvbGUgYXJlIGFsbG93ZWQgYnkgdGhpcwogICAgICAgIHNwZWNpZmllci4KICAgICAgICAiIiIKCiAgICBAYWJjLmFic3RyYWN0bWV0aG9kCiAgICBkZWYgY29udGFpbnMoc2VsZiwgaXRlbSwgcHJlcmVsZWFzZXM9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gaXRlbSBpcyBjb250YWluZWQgd2l0aGluIHRoaXMgc3BlY2lmaWVyLgogICAgICAgICIiIgoKICAgIEBhYmMuYWJzdHJhY3RtZXRob2QKICAgIGRlZiBmaWx0ZXIoc2VsZiwgaXRlcmFibGUsIHByZXJlbGVhc2VzPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIFRha2VzIGFuIGl0ZXJhYmxlIG9mIGl0ZW1zIGFuZCBmaWx0ZXJzIHRoZW0gc28gdGhhdCBvbmx5IGl0ZW1zIHdoaWNoCiAgICAgICAgYXJlIGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBzcGVjaWZpZXIgYXJlIGFsbG93ZWQgaW4gaXQuCiAgICAgICAgIiIiCgoKY2xhc3MgX0luZGl2aWR1YWxTcGVjaWZpZXIoQmFzZVNwZWNpZmllcik6CgogICAgX29wZXJhdG9ycyA9IHt9CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHNwZWM9IiIsIHByZXJlbGVhc2VzPU5vbmUpOgogICAgICAgIG1hdGNoID0gc2VsZi5fcmVnZXguc2VhcmNoKHNwZWMpCiAgICAgICAgaWYgbm90IG1hdGNoOgogICAgICAgICAgICByYWlzZSBJbnZhbGlkU3BlY2lmaWVyKCJJbnZhbGlkIHNwZWNpZmllcjogJ3swfSciLmZvcm1hdChzcGVjKSkKCiAgICAgICAgc2VsZi5fc3BlYyA9IChtYXRjaC5ncm91cCgib3BlcmF0b3IiKS5zdHJpcCgpLCBtYXRjaC5ncm91cCgidmVyc2lvbiIpLnN0cmlwKCkpCgogICAgICAgICMgU3RvcmUgd2hldGhlciBvciBub3QgdGhpcyBTcGVjaWZpZXIgc2hvdWxkIGFjY2VwdCBwcmVyZWxlYXNlcwogICAgICAgIHNlbGYuX3ByZXJlbGVhc2VzID0gcHJlcmVsZWFzZXMKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcHJlID0gKAogICAgICAgICAgICAiLCBwcmVyZWxlYXNlcz17MCFyfSIuZm9ybWF0KHNlbGYucHJlcmVsZWFzZXMpCiAgICAgICAgICAgIGlmIHNlbGYuX3ByZXJlbGVhc2VzIGlzIG5vdCBOb25lCiAgICAgICAgICAgIGVsc2UgIiIKICAgICAgICApCgogICAgICAgIHJldHVybiAiPHswfSh7MSFyfXsyfSk+Ii5mb3JtYXQoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHN0cihzZWxmKSwgcHJlKQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiezB9ezF9Ii5mb3JtYXQoKnNlbGYuX3NwZWMpCgogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgIHJldHVybiBoYXNoKHNlbGYuX3NwZWMpCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgb3RoZXIgPSBzZWxmLl9fY2xhc3NfXyhvdGhlcikKICAgICAgICAgICAgZXhjZXB0IEludmFsaWRTcGVjaWZpZXI6CiAgICAgICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXyk6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAoKICAgICAgICByZXR1cm4gc2VsZi5fc3BlYyA9PSBvdGhlci5fc3BlYwoKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHN0cmluZ190eXBlcyk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIG90aGVyID0gc2VsZi5fX2NsYXNzX18ob3RoZXIpCiAgICAgICAgICAgIGV4Y2VwdCBJbnZhbGlkU3BlY2lmaWVyOgogICAgICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCiAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKCiAgICAgICAgcmV0dXJuIHNlbGYuX3NwZWMgIT0gb3RoZXIuX3NwZWMKCiAgICBkZWYgX2dldF9vcGVyYXRvcihzZWxmLCBvcCk6CiAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZiwgIl9jb21wYXJlX3swfSIuZm9ybWF0KHNlbGYuX29wZXJhdG9yc1tvcF0pKQoKICAgIGRlZiBfY29lcmNlX3ZlcnNpb24oc2VsZiwgdmVyc2lvbik6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodmVyc2lvbiwgKExlZ2FjeVZlcnNpb24sIFZlcnNpb24pKToKICAgICAgICAgICAgdmVyc2lvbiA9IHBhcnNlKHZlcnNpb24pCiAgICAgICAgcmV0dXJuIHZlcnNpb24KCiAgICBAcHJvcGVydHkKICAgIGRlZiBvcGVyYXRvcihzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fc3BlY1swXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHZlcnNpb24oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3NwZWNbMV0KCiAgICBAcHJvcGVydHkKICAgIGRlZiBwcmVyZWxlYXNlcyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fcHJlcmVsZWFzZXMKCiAgICBAcHJlcmVsZWFzZXMuc2V0dGVyCiAgICBkZWYgcHJlcmVsZWFzZXMoc2VsZiwgdmFsdWUpOgogICAgICAgIHNlbGYuX3ByZXJlbGVhc2VzID0gdmFsdWUKCiAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGl0ZW0pOgogICAgICAgIHJldHVybiBzZWxmLmNvbnRhaW5zKGl0ZW0pCgogICAgZGVmIGNvbnRhaW5zKHNlbGYsIGl0ZW0sIHByZXJlbGVhc2VzPU5vbmUpOgogICAgICAgICMgRGV0ZXJtaW5lIGlmIHByZXJlbGVhc2VzIGFyZSB0byBiZSBhbGxvd2VkIG9yIG5vdC4KICAgICAgICBpZiBwcmVyZWxlYXNlcyBpcyBOb25lOgogICAgICAgICAgICBwcmVyZWxlYXNlcyA9IHNlbGYucHJlcmVsZWFzZXMKCiAgICAgICAgIyBOb3JtYWxpemUgaXRlbSB0byBhIFZlcnNpb24gb3IgTGVnYWN5VmVyc2lvbiwgdGhpcyBhbGxvd3MgdXMgdG8gaGF2ZQogICAgICAgICMgYSBzaG9ydGN1dCBmb3IgYGAiMi4wIiBpbiBTcGVjaWZpZXIoIj49MiIpCiAgICAgICAgaXRlbSA9IHNlbGYuX2NvZXJjZV92ZXJzaW9uKGl0ZW0pCgogICAgICAgICMgRGV0ZXJtaW5lIGlmIHdlIHNob3VsZCBiZSBzdXBwb3J0aW5nIHByZXJlbGVhc2VzIGluIHRoaXMgc3BlY2lmaWVyCiAgICAgICAgIyBvciBub3QsIGlmIHdlIGRvIG5vdCBzdXBwb3J0IHByZXJlbGVhc2VzIHRoYW4gd2UgY2FuIHNob3J0IGNpcmN1aXQKICAgICAgICAjIGxvZ2ljIGlmIHRoaXMgdmVyc2lvbiBpcyBhIHByZXJlbGVhc2VzLgogICAgICAgIGlmIGl0ZW0uaXNfcHJlcmVsZWFzZSBhbmQgbm90IHByZXJlbGVhc2VzOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgIyBBY3R1YWxseSBkbyB0aGUgY29tcGFyaXNvbiB0byBkZXRlcm1pbmUgaWYgdGhpcyBpdGVtIGlzIGNvbnRhaW5lZAogICAgICAgICMgd2l0aGluIHRoaXMgU3BlY2lmaWVyIG9yIG5vdC4KICAgICAgICByZXR1cm4gc2VsZi5fZ2V0X29wZXJhdG9yKHNlbGYub3BlcmF0b3IpKGl0ZW0sIHNlbGYudmVyc2lvbikKCiAgICBkZWYgZmlsdGVyKHNlbGYsIGl0ZXJhYmxlLCBwcmVyZWxlYXNlcz1Ob25lKToKICAgICAgICB5aWVsZGVkID0gRmFsc2UKICAgICAgICBmb3VuZF9wcmVyZWxlYXNlcyA9IFtdCgogICAgICAgIGt3ID0geyJwcmVyZWxlYXNlcyI6IHByZXJlbGVhc2VzIGlmIHByZXJlbGVhc2VzIGlzIG5vdCBOb25lIGVsc2UgVHJ1ZX0KCiAgICAgICAgIyBBdHRlbXB0IHRvIGl0ZXJhdGUgb3ZlciBhbGwgdGhlIHZhbHVlcyBpbiB0aGUgaXRlcmFibGUgYW5kIGlmIGFueSBvZgogICAgICAgICMgdGhlbSBtYXRjaCwgeWllbGQgdGhlbS4KICAgICAgICBmb3IgdmVyc2lvbiBpbiBpdGVyYWJsZToKICAgICAgICAgICAgcGFyc2VkX3ZlcnNpb24gPSBzZWxmLl9jb2VyY2VfdmVyc2lvbih2ZXJzaW9uKQoKICAgICAgICAgICAgaWYgc2VsZi5jb250YWlucyhwYXJzZWRfdmVyc2lvbiwgKiprdyk6CiAgICAgICAgICAgICAgICAjIElmIG91ciB2ZXJzaW9uIGlzIGEgcHJlcmVsZWFzZSwgYW5kIHdlIHdlcmUgbm90IHNldCB0byBhbGxvdwogICAgICAgICAgICAgICAgIyBwcmVyZWxlYXNlcywgdGhlbiB3ZSdsbCBzdG9yZSBpdCBmb3IgbGF0ZXIgaW5jYXNlIG5vdGhpbmcKICAgICAgICAgICAgICAgICMgZWxzZSBtYXRjaGVzIHRoaXMgc3BlY2lmaWVyLgogICAgICAgICAgICAgICAgaWYgcGFyc2VkX3ZlcnNpb24uaXNfcHJlcmVsZWFzZSBhbmQgbm90ICgKICAgICAgICAgICAgICAgICAgICBwcmVyZWxlYXNlcyBvciBzZWxmLnByZXJlbGVhc2VzCiAgICAgICAgICAgICAgICApOgogICAgICAgICAgICAgICAgICAgIGZvdW5kX3ByZXJlbGVhc2VzLmFwcGVuZCh2ZXJzaW9uKQogICAgICAgICAgICAgICAgIyBFaXRoZXIgdGhpcyBpcyBub3QgYSBwcmVyZWxlYXNlLCBvciB3ZSBzaG91bGQgaGF2ZSBiZWVuCiAgICAgICAgICAgICAgICAjIGFjY2VwdGluZyBwcmVyZWxlYXNlcyBmcm9tIHRoZSBiZWdpbm5pbmcuCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHlpZWxkZWQgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgeWllbGQgdmVyc2lvbgoKICAgICAgICAjIE5vdyB0aGF0IHdlJ3ZlIGl0ZXJhdGVkIG92ZXIgZXZlcnl0aGluZywgZGV0ZXJtaW5lIGlmIHdlJ3ZlIHlpZWxkZWQKICAgICAgICAjIGFueSB2YWx1ZXMsIGFuZCBpZiB3ZSBoYXZlIG5vdCBhbmQgd2UgaGF2ZSBhbnkgcHJlcmVsZWFzZXMgc3RvcmVkIHVwCiAgICAgICAgIyB0aGVuIHdlIHdpbGwgZ28gYWhlYWQgYW5kIHlpZWxkIHRoZSBwcmVyZWxlYXNlcy4KICAgICAgICBpZiBub3QgeWllbGRlZCBhbmQgZm91bmRfcHJlcmVsZWFzZXM6CiAgICAgICAgICAgIGZvciB2ZXJzaW9uIGluIGZvdW5kX3ByZXJlbGVhc2VzOgogICAgICAgICAgICAgICAgeWllbGQgdmVyc2lvbgoKCmNsYXNzIExlZ2FjeVNwZWNpZmllcihfSW5kaXZpZHVhbFNwZWNpZmllcik6CgogICAgX3JlZ2V4X3N0ciA9IHIiIiIKICAgICAgICAoP1A8b3BlcmF0b3I+KD09fCE9fDw9fD49fDx8PikpCiAgICAgICAgXHMqCiAgICAgICAgKD9QPHZlcnNpb24+CiAgICAgICAgICAgIFteLDtccyldKiAjIFNpbmNlIHRoaXMgaXMgYSAibGVnYWN5IiBzcGVjaWZpZXIsIGFuZCB0aGUgdmVyc2lvbgogICAgICAgICAgICAgICAgICAgICAgIyBzdHJpbmcgY2FuIGJlIGp1c3QgYWJvdXQgYW55dGhpbmcsIHdlIG1hdGNoIGV2ZXJ5dGhpbmcKICAgICAgICAgICAgICAgICAgICAgICMgZXhjZXB0IGZvciB3aGl0ZXNwYWNlLCBhIHNlbWktY29sb24gZm9yIG1hcmtlciBzdXBwb3J0LAogICAgICAgICAgICAgICAgICAgICAgIyBhIGNsb3NpbmcgcGFyZW4gc2luY2UgdmVyc2lvbnMgY2FuIGJlIGVuY2xvc2VkIGluCiAgICAgICAgICAgICAgICAgICAgICAjIHRoZW0sIGFuZCBhIGNvbW1hIHNpbmNlIGl0J3MgYSB2ZXJzaW9uIHNlcGFyYXRvci4KICAgICAgICApCiAgICAgICAgIiIiCgogICAgX3JlZ2V4ID0gcmUuY29tcGlsZShyIl5ccyoiICsgX3JlZ2V4X3N0ciArIHIiXHMqJCIsIHJlLlZFUkJPU0UgfCByZS5JR05PUkVDQVNFKQoKICAgIF9vcGVyYXRvcnMgPSB7CiAgICAgICAgIj09IjogImVxdWFsIiwKICAgICAgICAiIT0iOiAibm90X2VxdWFsIiwKICAgICAgICAiPD0iOiAibGVzc190aGFuX2VxdWFsIiwKICAgICAgICAiPj0iOiAiZ3JlYXRlcl90aGFuX2VxdWFsIiwKICAgICAgICAiPCI6ICJsZXNzX3RoYW4iLAogICAgICAgICI+IjogImdyZWF0ZXJfdGhhbiIsCiAgICB9CgogICAgZGVmIF9jb2VyY2VfdmVyc2lvbihzZWxmLCB2ZXJzaW9uKToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh2ZXJzaW9uLCBMZWdhY3lWZXJzaW9uKToKICAgICAgICAgICAgdmVyc2lvbiA9IExlZ2FjeVZlcnNpb24oc3RyKHZlcnNpb24pKQogICAgICAgIHJldHVybiB2ZXJzaW9uCgogICAgZGVmIF9jb21wYXJlX2VxdWFsKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICByZXR1cm4gcHJvc3BlY3RpdmUgPT0gc2VsZi5fY29lcmNlX3ZlcnNpb24oc3BlYykKCiAgICBkZWYgX2NvbXBhcmVfbm90X2VxdWFsKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICByZXR1cm4gcHJvc3BlY3RpdmUgIT0gc2VsZi5fY29lcmNlX3ZlcnNpb24oc3BlYykKCiAgICBkZWYgX2NvbXBhcmVfbGVzc190aGFuX2VxdWFsKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICByZXR1cm4gcHJvc3BlY3RpdmUgPD0gc2VsZi5fY29lcmNlX3ZlcnNpb24oc3BlYykKCiAgICBkZWYgX2NvbXBhcmVfZ3JlYXRlcl90aGFuX2VxdWFsKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICByZXR1cm4gcHJvc3BlY3RpdmUgPj0gc2VsZi5fY29lcmNlX3ZlcnNpb24oc3BlYykKCiAgICBkZWYgX2NvbXBhcmVfbGVzc190aGFuKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICByZXR1cm4gcHJvc3BlY3RpdmUgPCBzZWxmLl9jb2VyY2VfdmVyc2lvbihzcGVjKQoKICAgIGRlZiBfY29tcGFyZV9ncmVhdGVyX3RoYW4oc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgIHJldHVybiBwcm9zcGVjdGl2ZSA+IHNlbGYuX2NvZXJjZV92ZXJzaW9uKHNwZWMpCgoKZGVmIF9yZXF1aXJlX3ZlcnNpb25fY29tcGFyZShmbik6CiAgICBAZnVuY3Rvb2xzLndyYXBzKGZuKQogICAgZGVmIHdyYXBwZWQoc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHByb3NwZWN0aXZlLCBWZXJzaW9uKToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgcmV0dXJuIGZuKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKQoKICAgIHJldHVybiB3cmFwcGVkCgoKY2xhc3MgU3BlY2lmaWVyKF9JbmRpdmlkdWFsU3BlY2lmaWVyKToKCiAgICBfcmVnZXhfc3RyID0gciIiIgogICAgICAgICg/UDxvcGVyYXRvcj4ofj18PT18IT18PD18Pj18PHw+fD09PSkpCiAgICAgICAgKD9QPHZlcnNpb24+CiAgICAgICAgICAgICg/OgogICAgICAgICAgICAgICAgIyBUaGUgaWRlbnRpdHkgb3BlcmF0b3JzIGFsbG93IGZvciBhbiBlc2NhcGUgaGF0Y2ggdGhhdCB3aWxsCiAgICAgICAgICAgICAgICAjIGRvIGFuIGV4YWN0IHN0cmluZyBtYXRjaCBvZiB0aGUgdmVyc2lvbiB5b3Ugd2lzaCB0byBpbnN0YWxsLgogICAgICAgICAgICAgICAgIyBUaGlzIHdpbGwgbm90IGJlIHBhcnNlZCBieSBQRVAgNDQwIGFuZCB3ZSBjYW5ub3QgZGV0ZXJtaW5lCiAgICAgICAgICAgICAgICAjIGFueSBzZW1hbnRpYyBtZWFuaW5nIGZyb20gaXQuIFRoaXMgb3BlcmF0b3IgaXMgZGlzY291cmFnZWQKICAgICAgICAgICAgICAgICMgYnV0IGluY2x1ZGVkIGVudGlyZWx5IGFzIGFuIGVzY2FwZSBoYXRjaC4KICAgICAgICAgICAgICAgICg/PD09PT0pICAjIE9ubHkgbWF0Y2ggZm9yIHRoZSBpZGVudGl0eSBvcGVyYXRvcgogICAgICAgICAgICAgICAgXHMqCiAgICAgICAgICAgICAgICBbXlxzXSogICAgIyBXZSBqdXN0IG1hdGNoIGV2ZXJ5dGhpbmcsIGV4Y2VwdCBmb3Igd2hpdGVzcGFjZQogICAgICAgICAgICAgICAgICAgICAgICAgICMgc2luY2Ugd2UgYXJlIG9ubHkgdGVzdGluZyBmb3Igc3RyaWN0IGlkZW50aXR5LgogICAgICAgICAgICApCiAgICAgICAgICAgIHwKICAgICAgICAgICAgKD86CiAgICAgICAgICAgICAgICAjIFRoZSAobm9uKWVxdWFsaXR5IG9wZXJhdG9ycyBhbGxvdyBmb3Igd2lsZCBjYXJkIGFuZCBsb2NhbAogICAgICAgICAgICAgICAgIyB2ZXJzaW9ucyB0byBiZSBzcGVjaWZpZWQgc28gd2UgaGF2ZSB0byBkZWZpbmUgdGhlc2UgdHdvCiAgICAgICAgICAgICAgICAjIG9wZXJhdG9ycyBzZXBhcmF0ZWx5IHRvIGVuYWJsZSB0aGF0LgogICAgICAgICAgICAgICAgKD88PT09fCE9KSAgICAgICAgICAgICMgT25seSBtYXRjaCBmb3IgZXF1YWxzIGFuZCBub3QgZXF1YWxzCgogICAgICAgICAgICAgICAgXHMqCiAgICAgICAgICAgICAgICB2PwogICAgICAgICAgICAgICAgKD86WzAtOV0rISk/ICAgICAgICAgICMgZXBvY2gKICAgICAgICAgICAgICAgIFswLTldKyg/OlwuWzAtOV0rKSogICAjIHJlbGVhc2UKICAgICAgICAgICAgICAgICg/OiAgICAgICAgICAgICAgICAgICAjIHByZSByZWxlYXNlCiAgICAgICAgICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAgICAgICAgIChhfGJ8Y3xyY3xhbHBoYXxiZXRhfHByZXxwcmV2aWV3KQogICAgICAgICAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgICAgICAgICBbMC05XSoKICAgICAgICAgICAgICAgICk/CiAgICAgICAgICAgICAgICAoPzogICAgICAgICAgICAgICAgICAgIyBwb3N0IHJlbGVhc2UKICAgICAgICAgICAgICAgICAgICAoPzotWzAtOV0rKXwoPzpbLV9cLl0/KHBvc3R8cmV2fHIpWy1fXC5dP1swLTldKikKICAgICAgICAgICAgICAgICk/CgogICAgICAgICAgICAgICAgIyBZb3UgY2Fubm90IHVzZSBhIHdpbGQgY2FyZCBhbmQgYSBkZXYgb3IgbG9jYWwgdmVyc2lvbgogICAgICAgICAgICAgICAgIyB0b2dldGhlciBzbyBncm91cCB0aGVtIHdpdGggYSB8IGFuZCBtYWtlIHRoZW0gb3B0aW9uYWwuCiAgICAgICAgICAgICAgICAoPzoKICAgICAgICAgICAgICAgICAgICAoPzpbLV9cLl0/ZGV2Wy1fXC5dP1swLTldKik/ICAgICAgICAgIyBkZXYgcmVsZWFzZQogICAgICAgICAgICAgICAgICAgICg/OlwrW2EtejAtOV0rKD86Wy1fXC5dW2EtejAtOV0rKSopPyAjIGxvY2FsCiAgICAgICAgICAgICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgIFwuXCogICMgV2lsZCBjYXJkIHN5bnRheCBvZiAuKgogICAgICAgICAgICAgICAgKT8KICAgICAgICAgICAgKQogICAgICAgICAgICB8CiAgICAgICAgICAgICg/OgogICAgICAgICAgICAgICAgIyBUaGUgY29tcGF0aWJsZSBvcGVyYXRvciByZXF1aXJlcyBhdCBsZWFzdCB0d28gZGlnaXRzIGluIHRoZQogICAgICAgICAgICAgICAgIyByZWxlYXNlIHNlZ21lbnQuCiAgICAgICAgICAgICAgICAoPzw9fj0pICAgICAgICAgICAgICAgIyBPbmx5IG1hdGNoIGZvciB0aGUgY29tcGF0aWJsZSBvcGVyYXRvcgoKICAgICAgICAgICAgICAgIFxzKgogICAgICAgICAgICAgICAgdj8KICAgICAgICAgICAgICAgICg/OlswLTldKyEpPyAgICAgICAgICAjIGVwb2NoCiAgICAgICAgICAgICAgICBbMC05XSsoPzpcLlswLTldKykrICAgIyByZWxlYXNlICAoV2UgaGF2ZSBhICsgaW5zdGVhZCBvZiBhICopCiAgICAgICAgICAgICAgICAoPzogICAgICAgICAgICAgICAgICAgIyBwcmUgcmVsZWFzZQogICAgICAgICAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgICAgICAgICAoYXxifGN8cmN8YWxwaGF8YmV0YXxwcmV8cHJldmlldykKICAgICAgICAgICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICAgICAgICAgWzAtOV0qCiAgICAgICAgICAgICAgICApPwogICAgICAgICAgICAgICAgKD86ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHBvc3QgcmVsZWFzZQogICAgICAgICAgICAgICAgICAgICg/Oi1bMC05XSspfCg/OlstX1wuXT8ocG9zdHxyZXZ8cilbLV9cLl0/WzAtOV0qKQogICAgICAgICAgICAgICAgKT8KICAgICAgICAgICAgICAgICg/OlstX1wuXT9kZXZbLV9cLl0/WzAtOV0qKT8gICAgICAgICAgIyBkZXYgcmVsZWFzZQogICAgICAgICAgICApCiAgICAgICAgICAgIHwKICAgICAgICAgICAgKD86CiAgICAgICAgICAgICAgICAjIEFsbCBvdGhlciBvcGVyYXRvcnMgb25seSBhbGxvdyBhIHN1YiBzZXQgb2Ygd2hhdCB0aGUKICAgICAgICAgICAgICAgICMgKG5vbillcXVhbGl0eSBvcGVyYXRvcnMgZG8uIFNwZWNpZmljYWxseSB0aGV5IGRvIG5vdCBhbGxvdwogICAgICAgICAgICAgICAgIyBsb2NhbCB2ZXJzaW9ucyB0byBiZSBzcGVjaWZpZWQgbm9yIGRvIHRoZXkgYWxsb3cgdGhlIHByZWZpeAogICAgICAgICAgICAgICAgIyBtYXRjaGluZyB3aWxkIGNhcmRzLgogICAgICAgICAgICAgICAgKD88IT09fCE9fH49KSAgICAgICAgICMgV2UgaGF2ZSBzcGVjaWFsIGNhc2VzIGZvciB0aGVzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb3BlcmF0b3JzIHNvIHdlIHdhbnQgdG8gbWFrZSBzdXJlIHRoZXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGRvbid0IG1hdGNoIGhlcmUuCgogICAgICAgICAgICAgICAgXHMqCiAgICAgICAgICAgICAgICB2PwogICAgICAgICAgICAgICAgKD86WzAtOV0rISk/ICAgICAgICAgICMgZXBvY2gKICAgICAgICAgICAgICAgIFswLTldKyg/OlwuWzAtOV0rKSogICAjIHJlbGVhc2UKICAgICAgICAgICAgICAgICg/OiAgICAgICAgICAgICAgICAgICAjIHByZSByZWxlYXNlCiAgICAgICAgICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAgICAgICAgIChhfGJ8Y3xyY3xhbHBoYXxiZXRhfHByZXxwcmV2aWV3KQogICAgICAgICAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgICAgICAgICBbMC05XSoKICAgICAgICAgICAgICAgICk/CiAgICAgICAgICAgICAgICAoPzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcG9zdCByZWxlYXNlCiAgICAgICAgICAgICAgICAgICAgKD86LVswLTldKyl8KD86Wy1fXC5dPyhwb3N0fHJldnxyKVstX1wuXT9bMC05XSopCiAgICAgICAgICAgICAgICApPwogICAgICAgICAgICAgICAgKD86Wy1fXC5dP2RldlstX1wuXT9bMC05XSopPyAgICAgICAgICAjIGRldiByZWxlYXNlCiAgICAgICAgICAgICkKICAgICAgICApCiAgICAgICAgIiIiCgogICAgX3JlZ2V4ID0gcmUuY29tcGlsZShyIl5ccyoiICsgX3JlZ2V4X3N0ciArIHIiXHMqJCIsIHJlLlZFUkJPU0UgfCByZS5JR05PUkVDQVNFKQoKICAgIF9vcGVyYXRvcnMgPSB7CiAgICAgICAgIn49IjogImNvbXBhdGlibGUiLAogICAgICAgICI9PSI6ICJlcXVhbCIsCiAgICAgICAgIiE9IjogIm5vdF9lcXVhbCIsCiAgICAgICAgIjw9IjogImxlc3NfdGhhbl9lcXVhbCIsCiAgICAgICAgIj49IjogImdyZWF0ZXJfdGhhbl9lcXVhbCIsCiAgICAgICAgIjwiOiAibGVzc190aGFuIiwKICAgICAgICAiPiI6ICJncmVhdGVyX3RoYW4iLAogICAgICAgICI9PT0iOiAiYXJiaXRyYXJ5IiwKICAgIH0KCiAgICBAX3JlcXVpcmVfdmVyc2lvbl9jb21wYXJlCiAgICBkZWYgX2NvbXBhcmVfY29tcGF0aWJsZShzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgIyBDb21wYXRpYmxlIHJlbGVhc2VzIGhhdmUgYW4gZXF1aXZhbGVudCBjb21iaW5hdGlvbiBvZiA+PSBhbmQgPT0uIFRoYXQKICAgICAgICAjIGlzIHRoYXQgfj0yLjIgaXMgZXF1aXZhbGVudCB0byA+PTIuMiw9PTIuKi4gVGhpcyBhbGxvd3MgdXMgdG8KICAgICAgICAjIGltcGxlbWVudCB0aGlzIGluIHRlcm1zIG9mIHRoZSBvdGhlciBzcGVjaWZpZXJzIGluc3RlYWQgb2YKICAgICAgICAjIGltcGxlbWVudGluZyBpdCBvdXJzZWx2ZXMuIFRoZSBvbmx5IHRoaW5nIHdlIG5lZWQgdG8gZG8gaXMgY29uc3RydWN0CiAgICAgICAgIyB0aGUgb3RoZXIgc3BlY2lmaWVycy4KCiAgICAgICAgIyBXZSB3YW50IGV2ZXJ5dGhpbmcgYnV0IHRoZSBsYXN0IGl0ZW0gaW4gdGhlIHZlcnNpb24sIGJ1dCB3ZSB3YW50IHRvCiAgICAgICAgIyBpZ25vcmUgcG9zdCBhbmQgZGV2IHJlbGVhc2VzIGFuZCB3ZSB3YW50IHRvIHRyZWF0IHRoZSBwcmUtcmVsZWFzZSBhcwogICAgICAgICMgaXQncyBvd24gc2VwYXJhdGUgc2VnbWVudC4KICAgICAgICBwcmVmaXggPSAiLiIuam9pbigKICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgIGl0ZXJ0b29scy50YWtld2hpbGUoCiAgICAgICAgICAgICAgICAgICAgbGFtYmRhIHg6IChub3QgeC5zdGFydHN3aXRoKCJwb3N0IikgYW5kIG5vdCB4LnN0YXJ0c3dpdGgoImRldiIpKSwKICAgICAgICAgICAgICAgICAgICBfdmVyc2lvbl9zcGxpdChzcGVjKSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgKVs6LTFdCiAgICAgICAgKQoKICAgICAgICAjIEFkZCB0aGUgcHJlZml4IG5vdGF0aW9uIHRvIHRoZSBlbmQgb2Ygb3VyIHN0cmluZwogICAgICAgIHByZWZpeCArPSAiLioiCgogICAgICAgIHJldHVybiBzZWxmLl9nZXRfb3BlcmF0b3IoIj49IikocHJvc3BlY3RpdmUsIHNwZWMpIGFuZCBzZWxmLl9nZXRfb3BlcmF0b3IoIj09IikoCiAgICAgICAgICAgIHByb3NwZWN0aXZlLCBwcmVmaXgKICAgICAgICApCgogICAgQF9yZXF1aXJlX3ZlcnNpb25fY29tcGFyZQogICAgZGVmIF9jb21wYXJlX2VxdWFsKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICAjIFdlIG5lZWQgc3BlY2lhbCBsb2dpYyB0byBoYW5kbGUgcHJlZml4IG1hdGNoaW5nCiAgICAgICAgaWYgc3BlYy5lbmRzd2l0aCgiLioiKToKICAgICAgICAgICAgIyBJbiB0aGUgY2FzZSBvZiBwcmVmaXggbWF0Y2hpbmcgd2Ugd2FudCB0byBpZ25vcmUgbG9jYWwgc2VnbWVudC4KICAgICAgICAgICAgcHJvc3BlY3RpdmUgPSBWZXJzaW9uKHByb3NwZWN0aXZlLnB1YmxpYykKICAgICAgICAgICAgIyBTcGxpdCB0aGUgc3BlYyBvdXQgYnkgZG90cywgYW5kIHByZXRlbmQgdGhhdCB0aGVyZSBpcyBhbiBpbXBsaWNpdAogICAgICAgICAgICAjIGRvdCBpbiBiZXR3ZWVuIGEgcmVsZWFzZSBzZWdtZW50IGFuZCBhIHByZS1yZWxlYXNlIHNlZ21lbnQuCiAgICAgICAgICAgIHNwZWMgPSBfdmVyc2lvbl9zcGxpdChzcGVjWzotMl0pICAjIFJlbW92ZSB0aGUgdHJhaWxpbmcgLioKCiAgICAgICAgICAgICMgU3BsaXQgdGhlIHByb3NwZWN0aXZlIHZlcnNpb24gb3V0IGJ5IGRvdHMsIGFuZCBwcmV0ZW5kIHRoYXQgdGhlcmUKICAgICAgICAgICAgIyBpcyBhbiBpbXBsaWNpdCBkb3QgaW4gYmV0d2VlbiBhIHJlbGVhc2Ugc2VnbWVudCBhbmQgYSBwcmUtcmVsZWFzZQogICAgICAgICAgICAjIHNlZ21lbnQuCiAgICAgICAgICAgIHByb3NwZWN0aXZlID0gX3ZlcnNpb25fc3BsaXQoc3RyKHByb3NwZWN0aXZlKSkKCiAgICAgICAgICAgICMgU2hvcnRlbiB0aGUgcHJvc3BlY3RpdmUgdmVyc2lvbiB0byBiZSB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIHNwZWMKICAgICAgICAgICAgIyBzbyB0aGF0IHdlIGNhbiBkZXRlcm1pbmUgaWYgdGhlIHNwZWNpZmllciBpcyBhIHByZWZpeCBvZiB0aGUKICAgICAgICAgICAgIyBwcm9zcGVjdGl2ZSB2ZXJzaW9uIG9yIG5vdC4KICAgICAgICAgICAgcHJvc3BlY3RpdmUgPSBwcm9zcGVjdGl2ZVs6IGxlbihzcGVjKV0KCiAgICAgICAgICAgICMgUGFkIG91dCBvdXIgdHdvIHNpZGVzIHdpdGggemVyb3Mgc28gdGhhdCB0aGV5IGJvdGggZXF1YWwgdGhlIHNhbWUKICAgICAgICAgICAgIyBsZW5ndGguCiAgICAgICAgICAgIHNwZWMsIHByb3NwZWN0aXZlID0gX3BhZF92ZXJzaW9uKHNwZWMsIHByb3NwZWN0aXZlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgQ29udmVydCBvdXIgc3BlYyBzdHJpbmcgaW50byBhIFZlcnNpb24KICAgICAgICAgICAgc3BlYyA9IFZlcnNpb24oc3BlYykKCiAgICAgICAgICAgICMgSWYgdGhlIHNwZWNpZmllciBkb2VzIG5vdCBoYXZlIGEgbG9jYWwgc2VnbWVudCwgdGhlbiB3ZSB3YW50IHRvCiAgICAgICAgICAgICMgYWN0IGFzIGlmIHRoZSBwcm9zcGVjdGl2ZSB2ZXJzaW9uIGFsc28gZG9lcyBub3QgaGF2ZSBhIGxvY2FsCiAgICAgICAgICAgICMgc2VnbWVudC4KICAgICAgICAgICAgaWYgbm90IHNwZWMubG9jYWw6CiAgICAgICAgICAgICAgICBwcm9zcGVjdGl2ZSA9IFZlcnNpb24ocHJvc3BlY3RpdmUucHVibGljKQoKICAgICAgICByZXR1cm4gcHJvc3BlY3RpdmUgPT0gc3BlYwoKICAgIEBfcmVxdWlyZV92ZXJzaW9uX2NvbXBhcmUKICAgIGRlZiBfY29tcGFyZV9ub3RfZXF1YWwoc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgIHJldHVybiBub3Qgc2VsZi5fY29tcGFyZV9lcXVhbChwcm9zcGVjdGl2ZSwgc3BlYykKCiAgICBAX3JlcXVpcmVfdmVyc2lvbl9jb21wYXJlCiAgICBkZWYgX2NvbXBhcmVfbGVzc190aGFuX2VxdWFsKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICByZXR1cm4gcHJvc3BlY3RpdmUgPD0gVmVyc2lvbihzcGVjKQoKICAgIEBfcmVxdWlyZV92ZXJzaW9uX2NvbXBhcmUKICAgIGRlZiBfY29tcGFyZV9ncmVhdGVyX3RoYW5fZXF1YWwoc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgIHJldHVybiBwcm9zcGVjdGl2ZSA+PSBWZXJzaW9uKHNwZWMpCgogICAgQF9yZXF1aXJlX3ZlcnNpb25fY29tcGFyZQogICAgZGVmIF9jb21wYXJlX2xlc3NfdGhhbihzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgIyBDb252ZXJ0IG91ciBzcGVjIHRvIGEgVmVyc2lvbiBpbnN0YW5jZSwgc2luY2Ugd2UnbGwgd2FudCB0byB3b3JrIHdpdGgKICAgICAgICAjIGl0IGFzIGEgdmVyc2lvbi4KICAgICAgICBzcGVjID0gVmVyc2lvbihzcGVjKQoKICAgICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvc3BlY3RpdmUgdmVyc2lvbiBpcyBsZXNzIHRoYW4gdGhlIHNwZWMKICAgICAgICAjIHZlcnNpb24uIElmIGl0J3Mgbm90IHdlIGNhbiBzaG9ydCBjaXJjdWl0IGFuZCBqdXN0IHJldHVybiBGYWxzZSBub3cKICAgICAgICAjIGluc3RlYWQgb2YgZG9pbmcgZXh0cmEgdW5uZWVkZWQgd29yay4KICAgICAgICBpZiBub3QgcHJvc3BlY3RpdmUgPCBzcGVjOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgIyBUaGlzIHNwZWNpYWwgY2FzZSBpcyBoZXJlIHNvIHRoYXQsIHVubGVzcyB0aGUgc3BlY2lmaWVyIGl0c2VsZgogICAgICAgICMgaW5jbHVkZXMgaXMgYSBwcmUtcmVsZWFzZSB2ZXJzaW9uLCB0aGF0IHdlIGRvIG5vdCBhY2NlcHQgcHJlLXJlbGVhc2UKICAgICAgICAjIHZlcnNpb25zIGZvciB0aGUgdmVyc2lvbiBtZW50aW9uZWQgaW4gdGhlIHNwZWNpZmllciAoZS5nLiA8My4xIHNob3VsZAogICAgICAgICMgbm90IG1hdGNoIDMuMS5kZXYwLCBidXQgc2hvdWxkIG1hdGNoIDMuMC5kZXYwKS4KICAgICAgICBpZiBub3Qgc3BlYy5pc19wcmVyZWxlYXNlIGFuZCBwcm9zcGVjdGl2ZS5pc19wcmVyZWxlYXNlOgogICAgICAgICAgICBpZiBWZXJzaW9uKHByb3NwZWN0aXZlLmJhc2VfdmVyc2lvbikgPT0gVmVyc2lvbihzcGVjLmJhc2VfdmVyc2lvbik6CiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgIyBJZiB3ZSd2ZSBnb3R0ZW4gdG8gaGVyZSwgaXQgbWVhbnMgdGhhdCBwcm9zcGVjdGl2ZSB2ZXJzaW9uIGlzIGJvdGgKICAgICAgICAjIGxlc3MgdGhhbiB0aGUgc3BlYyB2ZXJzaW9uICphbmQqIGl0J3Mgbm90IGEgcHJlLXJlbGVhc2Ugb2YgdGhlIHNhbWUKICAgICAgICAjIHZlcnNpb24gaW4gdGhlIHNwZWMuCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBAX3JlcXVpcmVfdmVyc2lvbl9jb21wYXJlCiAgICBkZWYgX2NvbXBhcmVfZ3JlYXRlcl90aGFuKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICAjIENvbnZlcnQgb3VyIHNwZWMgdG8gYSBWZXJzaW9uIGluc3RhbmNlLCBzaW5jZSB3ZSdsbCB3YW50IHRvIHdvcmsgd2l0aAogICAgICAgICMgaXQgYXMgYSB2ZXJzaW9uLgogICAgICAgIHNwZWMgPSBWZXJzaW9uKHNwZWMpCgogICAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9zcGVjdGl2ZSB2ZXJzaW9uIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc3BlYwogICAgICAgICMgdmVyc2lvbi4gSWYgaXQncyBub3Qgd2UgY2FuIHNob3J0IGNpcmN1aXQgYW5kIGp1c3QgcmV0dXJuIEZhbHNlIG5vdwogICAgICAgICMgaW5zdGVhZCBvZiBkb2luZyBleHRyYSB1bm5lZWRlZCB3b3JrLgogICAgICAgIGlmIG5vdCBwcm9zcGVjdGl2ZSA+IHNwZWM6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAjIFRoaXMgc3BlY2lhbCBjYXNlIGlzIGhlcmUgc28gdGhhdCwgdW5sZXNzIHRoZSBzcGVjaWZpZXIgaXRzZWxmCiAgICAgICAgIyBpbmNsdWRlcyBpcyBhIHBvc3QtcmVsZWFzZSB2ZXJzaW9uLCB0aGF0IHdlIGRvIG5vdCBhY2NlcHQKICAgICAgICAjIHBvc3QtcmVsZWFzZSB2ZXJzaW9ucyBmb3IgdGhlIHZlcnNpb24gbWVudGlvbmVkIGluIHRoZSBzcGVjaWZpZXIKICAgICAgICAjIChlLmcuID4zLjEgc2hvdWxkIG5vdCBtYXRjaCAzLjAucG9zdDAsIGJ1dCBzaG91bGQgbWF0Y2ggMy4yLnBvc3QwKS4KICAgICAgICBpZiBub3Qgc3BlYy5pc19wb3N0cmVsZWFzZSBhbmQgcHJvc3BlY3RpdmUuaXNfcG9zdHJlbGVhc2U6CiAgICAgICAgICAgIGlmIFZlcnNpb24ocHJvc3BlY3RpdmUuYmFzZV92ZXJzaW9uKSA9PSBWZXJzaW9uKHNwZWMuYmFzZV92ZXJzaW9uKToKICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAjIEVuc3VyZSB0aGF0IHdlIGRvIG5vdCBhbGxvdyBhIGxvY2FsIHZlcnNpb24gb2YgdGhlIHZlcnNpb24gbWVudGlvbmVkCiAgICAgICAgIyBpbiB0aGUgc3BlY2lmaWVyLCB3aGljaCBpcyB0ZWNobmljYWxseSBncmVhdGVyIHRoYW4sIHRvIG1hdGNoLgogICAgICAgIGlmIHByb3NwZWN0aXZlLmxvY2FsIGlzIG5vdCBOb25lOgogICAgICAgICAgICBpZiBWZXJzaW9uKHByb3NwZWN0aXZlLmJhc2VfdmVyc2lvbikgPT0gVmVyc2lvbihzcGVjLmJhc2VfdmVyc2lvbik6CiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgIyBJZiB3ZSd2ZSBnb3R0ZW4gdG8gaGVyZSwgaXQgbWVhbnMgdGhhdCBwcm9zcGVjdGl2ZSB2ZXJzaW9uIGlzIGJvdGgKICAgICAgICAjIGdyZWF0ZXIgdGhhbiB0aGUgc3BlYyB2ZXJzaW9uICphbmQqIGl0J3Mgbm90IGEgcHJlLXJlbGVhc2Ugb2YgdGhlCiAgICAgICAgIyBzYW1lIHZlcnNpb24gaW4gdGhlIHNwZWMuCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgX2NvbXBhcmVfYXJiaXRyYXJ5KHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICByZXR1cm4gc3RyKHByb3NwZWN0aXZlKS5sb3dlcigpID09IHN0cihzcGVjKS5sb3dlcigpCgogICAgQHByb3BlcnR5CiAgICBkZWYgcHJlcmVsZWFzZXMoc2VsZik6CiAgICAgICAgIyBJZiB0aGVyZSBpcyBhbiBleHBsaWNpdCBwcmVyZWxlYXNlcyBzZXQgZm9yIHRoaXMsIHRoZW4gd2UnbGwganVzdAogICAgICAgICMgYmxpbmRseSB1c2UgdGhhdC4KICAgICAgICBpZiBzZWxmLl9wcmVyZWxlYXNlcyBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3ByZXJlbGVhc2VzCgogICAgICAgICMgTG9vayBhdCBhbGwgb2Ygb3VyIHNwZWNpZmllcnMgYW5kIGRldGVybWluZSBpZiB0aGV5IGFyZSBpbmNsdXNpdmUKICAgICAgICAjIG9wZXJhdG9ycywgYW5kIGlmIHRoZXkgYXJlIGlmIHRoZXkgYXJlIGluY2x1ZGluZyBhbiBleHBsaWNpdAogICAgICAgICMgcHJlcmVsZWFzZS4KICAgICAgICBvcGVyYXRvciwgdmVyc2lvbiA9IHNlbGYuX3NwZWMKICAgICAgICBpZiBvcGVyYXRvciBpbiBbIj09IiwgIj49IiwgIjw9IiwgIn49IiwgIj09PSJdOgogICAgICAgICAgICAjIFRoZSA9PSBzcGVjaWZpZXIgY2FuIGluY2x1ZGUgYSB0cmFpbGluZyAuKiwgaWYgaXQgZG9lcyB3ZQogICAgICAgICAgICAjIHdhbnQgdG8gcmVtb3ZlIGJlZm9yZSBwYXJzaW5nLgogICAgICAgICAgICBpZiBvcGVyYXRvciA9PSAiPT0iIGFuZCB2ZXJzaW9uLmVuZHN3aXRoKCIuKiIpOgogICAgICAgICAgICAgICAgdmVyc2lvbiA9IHZlcnNpb25bOi0yXQoKICAgICAgICAgICAgIyBQYXJzZSB0aGUgdmVyc2lvbiwgYW5kIGlmIGl0IGlzIGEgcHJlLXJlbGVhc2UgdGhhbiB0aGlzCiAgICAgICAgICAgICMgc3BlY2lmaWVyIGFsbG93cyBwcmUtcmVsZWFzZXMuCiAgICAgICAgICAgIGlmIHBhcnNlKHZlcnNpb24pLmlzX3ByZXJlbGVhc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBAcHJlcmVsZWFzZXMuc2V0dGVyCiAgICBkZWYgcHJlcmVsZWFzZXMoc2VsZiwgdmFsdWUpOgogICAgICAgIHNlbGYuX3ByZXJlbGVhc2VzID0gdmFsdWUKCgpfcHJlZml4X3JlZ2V4ID0gcmUuY29tcGlsZShyIl4oWzAtOV0rKSgoPzphfGJ8Y3xyYylbMC05XSspJCIpCgoKZGVmIF92ZXJzaW9uX3NwbGl0KHZlcnNpb24pOgogICAgcmVzdWx0ID0gW10KICAgIGZvciBpdGVtIGluIHZlcnNpb24uc3BsaXQoIi4iKToKICAgICAgICBtYXRjaCA9IF9wcmVmaXhfcmVnZXguc2VhcmNoKGl0ZW0pCiAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgIHJlc3VsdC5leHRlbmQobWF0Y2guZ3JvdXBzKCkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChpdGVtKQogICAgcmV0dXJuIHJlc3VsdAoKCmRlZiBfcGFkX3ZlcnNpb24obGVmdCwgcmlnaHQpOgogICAgbGVmdF9zcGxpdCwgcmlnaHRfc3BsaXQgPSBbXSwgW10KCiAgICAjIEdldCB0aGUgcmVsZWFzZSBzZWdtZW50IG9mIG91ciB2ZXJzaW9ucwogICAgbGVmdF9zcGxpdC5hcHBlbmQobGlzdChpdGVydG9vbHMudGFrZXdoaWxlKGxhbWJkYSB4OiB4LmlzZGlnaXQoKSwgbGVmdCkpKQogICAgcmlnaHRfc3BsaXQuYXBwZW5kKGxpc3QoaXRlcnRvb2xzLnRha2V3aGlsZShsYW1iZGEgeDogeC5pc2RpZ2l0KCksIHJpZ2h0KSkpCgogICAgIyBHZXQgdGhlIHJlc3Qgb2Ygb3VyIHZlcnNpb25zCiAgICBsZWZ0X3NwbGl0LmFwcGVuZChsZWZ0W2xlbihsZWZ0X3NwbGl0WzBdKSA6XSkKICAgIHJpZ2h0X3NwbGl0LmFwcGVuZChyaWdodFtsZW4ocmlnaHRfc3BsaXRbMF0pIDpdKQoKICAgICMgSW5zZXJ0IG91ciBwYWRkaW5nCiAgICBsZWZ0X3NwbGl0Lmluc2VydCgxLCBbIjAiXSAqIG1heCgwLCBsZW4ocmlnaHRfc3BsaXRbMF0pIC0gbGVuKGxlZnRfc3BsaXRbMF0pKSkKICAgIHJpZ2h0X3NwbGl0Lmluc2VydCgxLCBbIjAiXSAqIG1heCgwLCBsZW4obGVmdF9zcGxpdFswXSkgLSBsZW4ocmlnaHRfc3BsaXRbMF0pKSkKCiAgICByZXR1cm4gKGxpc3QoaXRlcnRvb2xzLmNoYWluKCpsZWZ0X3NwbGl0KSksIGxpc3QoaXRlcnRvb2xzLmNoYWluKCpyaWdodF9zcGxpdCkpKQoKCmNsYXNzIFNwZWNpZmllclNldChCYXNlU3BlY2lmaWVyKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzcGVjaWZpZXJzPSIiLCBwcmVyZWxlYXNlcz1Ob25lKToKICAgICAgICAjIFNwbGl0IG9uICwgdG8gYnJlYWsgZWFjaCBpbmRpZGl2dWFsIHNwZWNpZmllciBpbnRvIGl0J3Mgb3duIGl0ZW0sIGFuZAogICAgICAgICMgc3RyaXAgZWFjaCBpdGVtIHRvIHJlbW92ZSBsZWFkaW5nL3RyYWlsaW5nIHdoaXRlc3BhY2UuCiAgICAgICAgc3BlY2lmaWVycyA9IFtzLnN0cmlwKCkgZm9yIHMgaW4gc3BlY2lmaWVycy5zcGxpdCgiLCIpIGlmIHMuc3RyaXAoKV0KCiAgICAgICAgIyBQYXJzZWQgZWFjaCBpbmRpdmlkdWFsIHNwZWNpZmllciwgYXR0ZW1wdGluZyBmaXJzdCB0byBtYWtlIGl0IGEKICAgICAgICAjIFNwZWNpZmllciBhbmQgZmFsbGluZyBiYWNrIHRvIGEgTGVnYWN5U3BlY2lmaWVyLgogICAgICAgIHBhcnNlZCA9IHNldCgpCiAgICAgICAgZm9yIHNwZWNpZmllciBpbiBzcGVjaWZpZXJzOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBwYXJzZWQuYWRkKFNwZWNpZmllcihzcGVjaWZpZXIpKQogICAgICAgICAgICBleGNlcHQgSW52YWxpZFNwZWNpZmllcjoKICAgICAgICAgICAgICAgIHBhcnNlZC5hZGQoTGVnYWN5U3BlY2lmaWVyKHNwZWNpZmllcikpCgogICAgICAgICMgVHVybiBvdXIgcGFyc2VkIHNwZWNpZmllcnMgaW50byBhIGZyb3plbiBzZXQgYW5kIHNhdmUgdGhlbSBmb3IgbGF0ZXIuCiAgICAgICAgc2VsZi5fc3BlY3MgPSBmcm96ZW5zZXQocGFyc2VkKQoKICAgICAgICAjIFN0b3JlIG91ciBwcmVyZWxlYXNlcyB2YWx1ZSBzbyB3ZSBjYW4gdXNlIGl0IGxhdGVyIHRvIGRldGVybWluZSBpZgogICAgICAgICMgd2UgYWNjZXB0IHByZXJlbGVhc2VzIG9yIG5vdC4KICAgICAgICBzZWxmLl9wcmVyZWxlYXNlcyA9IHByZXJlbGVhc2VzCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHByZSA9ICgKICAgICAgICAgICAgIiwgcHJlcmVsZWFzZXM9ezAhcn0iLmZvcm1hdChzZWxmLnByZXJlbGVhc2VzKQogICAgICAgICAgICBpZiBzZWxmLl9wcmVyZWxlYXNlcyBpcyBub3QgTm9uZQogICAgICAgICAgICBlbHNlICIiCiAgICAgICAgKQoKICAgICAgICByZXR1cm4gIjxTcGVjaWZpZXJTZXQoezAhcn17MX0pPiIuZm9ybWF0KHN0cihzZWxmKSwgcHJlKQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiLCIuam9pbihzb3J0ZWQoc3RyKHMpIGZvciBzIGluIHNlbGYuX3NwZWNzKSkKCiAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGhhc2goc2VsZi5fc3BlY3MpCgogICAgZGVmIF9fYW5kX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHN0cmluZ190eXBlcyk6CiAgICAgICAgICAgIG90aGVyID0gU3BlY2lmaWVyU2V0KG90aGVyKQogICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIFNwZWNpZmllclNldCk6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAoKICAgICAgICBzcGVjaWZpZXIgPSBTcGVjaWZpZXJTZXQoKQogICAgICAgIHNwZWNpZmllci5fc3BlY3MgPSBmcm96ZW5zZXQoc2VsZi5fc3BlY3MgfCBvdGhlci5fc3BlY3MpCgogICAgICAgIGlmIHNlbGYuX3ByZXJlbGVhc2VzIGlzIE5vbmUgYW5kIG90aGVyLl9wcmVyZWxlYXNlcyBpcyBub3QgTm9uZToKICAgICAgICAgICAgc3BlY2lmaWVyLl9wcmVyZWxlYXNlcyA9IG90aGVyLl9wcmVyZWxlYXNlcwogICAgICAgIGVsaWYgc2VsZi5fcHJlcmVsZWFzZXMgaXMgbm90IE5vbmUgYW5kIG90aGVyLl9wcmVyZWxlYXNlcyBpcyBOb25lOgogICAgICAgICAgICBzcGVjaWZpZXIuX3ByZXJlbGVhc2VzID0gc2VsZi5fcHJlcmVsZWFzZXMKICAgICAgICBlbGlmIHNlbGYuX3ByZXJlbGVhc2VzID09IG90aGVyLl9wcmVyZWxlYXNlczoKICAgICAgICAgICAgc3BlY2lmaWVyLl9wcmVyZWxlYXNlcyA9IHNlbGYuX3ByZXJlbGVhc2VzCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKICAgICAgICAgICAgICAgICJDYW5ub3QgY29tYmluZSBTcGVjaWZpZXJTZXRzIHdpdGggVHJ1ZSBhbmQgRmFsc2UgcHJlcmVsZWFzZSAiCiAgICAgICAgICAgICAgICAib3ZlcnJpZGVzLiIKICAgICAgICAgICAgKQoKICAgICAgICByZXR1cm4gc3BlY2lmaWVyCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgb3RoZXIgPSBTcGVjaWZpZXJTZXQob3RoZXIpCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKG90aGVyLCBfSW5kaXZpZHVhbFNwZWNpZmllcik6CiAgICAgICAgICAgIG90aGVyID0gU3BlY2lmaWVyU2V0KHN0cihvdGhlcikpCiAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgU3BlY2lmaWVyU2V0KToKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCgogICAgICAgIHJldHVybiBzZWxmLl9zcGVjcyA9PSBvdGhlci5fc3BlY3MKCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBzdHJpbmdfdHlwZXMpOgogICAgICAgICAgICBvdGhlciA9IFNwZWNpZmllclNldChvdGhlcikKICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob3RoZXIsIF9JbmRpdmlkdWFsU3BlY2lmaWVyKToKICAgICAgICAgICAgb3RoZXIgPSBTcGVjaWZpZXJTZXQoc3RyKG90aGVyKSkKICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBTcGVjaWZpZXJTZXQpOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKCiAgICAgICAgcmV0dXJuIHNlbGYuX3NwZWNzICE9IG90aGVyLl9zcGVjcwoKICAgIGRlZiBfX2xlbl9fKHNlbGYpOgogICAgICAgIHJldHVybiBsZW4oc2VsZi5fc3BlY3MpCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgIHJldHVybiBpdGVyKHNlbGYuX3NwZWNzKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHByZXJlbGVhc2VzKHNlbGYpOgogICAgICAgICMgSWYgd2UgaGF2ZSBiZWVuIGdpdmVuIGFuIGV4cGxpY2l0IHByZXJlbGVhc2UgbW9kaWZpZXIsIHRoZW4gd2UnbGwKICAgICAgICAjIHBhc3MgdGhhdCB0aHJvdWdoIGhlcmUuCiAgICAgICAgaWYgc2VsZi5fcHJlcmVsZWFzZXMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9wcmVyZWxlYXNlcwoKICAgICAgICAjIElmIHdlIGRvbid0IGhhdmUgYW55IHNwZWNpZmllcnMsIGFuZCB3ZSBkb24ndCBoYXZlIGEgZm9yY2VkIHZhbHVlLAogICAgICAgICMgdGhlbiB3ZSdsbCBqdXN0IHJldHVybiBOb25lIHNpbmNlIHdlIGRvbid0IGtub3cgaWYgdGhpcyBzaG91bGQgaGF2ZQogICAgICAgICMgcHJlLXJlbGVhc2VzIG9yIG5vdC4KICAgICAgICBpZiBub3Qgc2VsZi5fc3BlY3M6CiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgICMgT3RoZXJ3aXNlIHdlJ2xsIHNlZSBpZiBhbnkgb2YgdGhlIGdpdmVuIHNwZWNpZmllcnMgYWNjZXB0CiAgICAgICAgIyBwcmVyZWxlYXNlcywgaWYgYW55IG9mIHRoZW0gZG8gd2UnbGwgcmV0dXJuIFRydWUsIG90aGVyd2lzZSBGYWxzZS4KICAgICAgICByZXR1cm4gYW55KHMucHJlcmVsZWFzZXMgZm9yIHMgaW4gc2VsZi5fc3BlY3MpCgogICAgQHByZXJlbGVhc2VzLnNldHRlcgogICAgZGVmIHByZXJlbGVhc2VzKHNlbGYsIHZhbHVlKToKICAgICAgICBzZWxmLl9wcmVyZWxlYXNlcyA9IHZhbHVlCgogICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBpdGVtKToKICAgICAgICByZXR1cm4gc2VsZi5jb250YWlucyhpdGVtKQoKICAgIGRlZiBjb250YWlucyhzZWxmLCBpdGVtLCBwcmVyZWxlYXNlcz1Ob25lKToKICAgICAgICAjIEVuc3VyZSB0aGF0IG91ciBpdGVtIGlzIGEgVmVyc2lvbiBvciBMZWdhY3lWZXJzaW9uIGluc3RhbmNlLgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGl0ZW0sIChMZWdhY3lWZXJzaW9uLCBWZXJzaW9uKSk6CiAgICAgICAgICAgIGl0ZW0gPSBwYXJzZShpdGVtKQoKICAgICAgICAjIERldGVybWluZSBpZiB3ZSdyZSBmb3JjaW5nIGEgcHJlcmVsZWFzZSBvciBub3QsIGlmIHdlJ3JlIG5vdCBmb3JjaW5nCiAgICAgICAgIyBvbmUgZm9yIHRoaXMgcGFydGljdWxhciBmaWx0ZXIgY2FsbCwgdGhlbiB3ZSdsbCB1c2Ugd2hhdGV2ZXIgdGhlCiAgICAgICAgIyBTcGVjaWZpZXJTZXQgdGhpbmtzIGZvciB3aGV0aGVyIG9yIG5vdCB3ZSBzaG91bGQgc3VwcG9ydCBwcmVyZWxlYXNlcy4KICAgICAgICBpZiBwcmVyZWxlYXNlcyBpcyBOb25lOgogICAgICAgICAgICBwcmVyZWxlYXNlcyA9IHNlbGYucHJlcmVsZWFzZXMKCiAgICAgICAgIyBXZSBjYW4gZGV0ZXJtaW5lIGlmIHdlJ3JlIGdvaW5nIHRvIGFsbG93IHByZS1yZWxlYXNlcyBieSBsb29raW5nIHRvCiAgICAgICAgIyBzZWUgaWYgYW55IG9mIHRoZSB1bmRlcmx5aW5nIGl0ZW1zIHN1cHBvcnRzIHRoZW0uIElmIG5vbmUgb2YgdGhlbSBkbwogICAgICAgICMgYW5kIHRoaXMgaXRlbSBpcyBhIHByZS1yZWxlYXNlIHRoZW4gd2UgZG8gbm90IGFsbG93IGl0IGFuZCB3ZSBjYW4KICAgICAgICAjIHNob3J0IGNpcmN1aXQgdGhhdCBoZXJlLgogICAgICAgICMgTm90ZTogVGhpcyBtZWFucyB0aGF0IDEuMC5kZXYxIHdvdWxkIG5vdCBiZSBjb250YWluZWQgaW4gc29tZXRoaW5nCiAgICAgICAgIyAgICAgICBsaWtlID49MS4wLmRldmFiYyBob3dldmVyIGl0IHdvdWxkIGJlIGluID49MS4wLmRlYmFiYyw+MC4wLmRldjAKICAgICAgICBpZiBub3QgcHJlcmVsZWFzZXMgYW5kIGl0ZW0uaXNfcHJlcmVsZWFzZToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICMgV2Ugc2ltcGx5IGRpc3BhdGNoIHRvIHRoZSB1bmRlcmx5aW5nIHNwZWNzIGhlcmUgdG8gbWFrZSBzdXJlIHRoYXQgdGhlCiAgICAgICAgIyBnaXZlbiB2ZXJzaW9uIGlzIGNvbnRhaW5lZCB3aXRoaW4gYWxsIG9mIHRoZW0uCiAgICAgICAgIyBOb3RlOiBUaGlzIHVzZSBvZiBhbGwoKSBoZXJlIG1lYW5zIHRoYXQgYW4gZW1wdHkgc2V0IG9mIHNwZWNpZmllcnMKICAgICAgICAjICAgICAgIHdpbGwgYWx3YXlzIHJldHVybiBUcnVlLCB0aGlzIGlzIGFuIGV4cGxpY2l0IGRlc2lnbiBkZWNpc2lvbi4KICAgICAgICByZXR1cm4gYWxsKHMuY29udGFpbnMoaXRlbSwgcHJlcmVsZWFzZXM9cHJlcmVsZWFzZXMpIGZvciBzIGluIHNlbGYuX3NwZWNzKQoKICAgIGRlZiBmaWx0ZXIoc2VsZiwgaXRlcmFibGUsIHByZXJlbGVhc2VzPU5vbmUpOgogICAgICAgICMgRGV0ZXJtaW5lIGlmIHdlJ3JlIGZvcmNpbmcgYSBwcmVyZWxlYXNlIG9yIG5vdCwgaWYgd2UncmUgbm90IGZvcmNpbmcKICAgICAgICAjIG9uZSBmb3IgdGhpcyBwYXJ0aWN1bGFyIGZpbHRlciBjYWxsLCB0aGVuIHdlJ2xsIHVzZSB3aGF0ZXZlciB0aGUKICAgICAgICAjIFNwZWNpZmllclNldCB0aGlua3MgZm9yIHdoZXRoZXIgb3Igbm90IHdlIHNob3VsZCBzdXBwb3J0IHByZXJlbGVhc2VzLgogICAgICAgIGlmIHByZXJlbGVhc2VzIGlzIE5vbmU6CiAgICAgICAgICAgIHByZXJlbGVhc2VzID0gc2VsZi5wcmVyZWxlYXNlcwoKICAgICAgICAjIElmIHdlIGhhdmUgYW55IHNwZWNpZmllcnMsIHRoZW4gd2Ugd2FudCB0byB3cmFwIG91ciBpdGVyYWJsZSBpbiB0aGUKICAgICAgICAjIGZpbHRlciBtZXRob2QgZm9yIGVhY2ggb25lLCB0aGlzIHdpbGwgYWN0IGFzIGEgbG9naWNhbCBBTkQgYW1vbmdzdAogICAgICAgICMgZWFjaCBzcGVjaWZpZXIuCiAgICAgICAgaWYgc2VsZi5fc3BlY3M6CiAgICAgICAgICAgIGZvciBzcGVjIGluIHNlbGYuX3NwZWNzOgogICAgICAgICAgICAgICAgaXRlcmFibGUgPSBzcGVjLmZpbHRlcihpdGVyYWJsZSwgcHJlcmVsZWFzZXM9Ym9vbChwcmVyZWxlYXNlcykpCiAgICAgICAgICAgIHJldHVybiBpdGVyYWJsZQogICAgICAgICMgSWYgd2UgZG8gbm90IGhhdmUgYW55IHNwZWNpZmllcnMsIHRoZW4gd2UgbmVlZCB0byBoYXZlIGEgcm91Z2ggZmlsdGVyCiAgICAgICAgIyB3aGljaCB3aWxsIGZpbHRlciBvdXQgYW55IHByZS1yZWxlYXNlcywgdW5sZXNzIHRoZXJlIGFyZSBubyBmaW5hbAogICAgICAgICMgcmVsZWFzZXMsIGFuZCB3aGljaCB3aWxsIGZpbHRlciBvdXQgTGVnYWN5VmVyc2lvbiBpbiBnZW5lcmFsLgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGZpbHRlcmVkID0gW10KICAgICAgICAgICAgZm91bmRfcHJlcmVsZWFzZXMgPSBbXQoKICAgICAgICAgICAgZm9yIGl0ZW0gaW4gaXRlcmFibGU6CiAgICAgICAgICAgICAgICAjIEVuc3VyZSB0aGF0IHdlIHNvbWUga2luZCBvZiBWZXJzaW9uIGNsYXNzIGZvciB0aGlzIGl0ZW0uCiAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShpdGVtLCAoTGVnYWN5VmVyc2lvbiwgVmVyc2lvbikpOgogICAgICAgICAgICAgICAgICAgIHBhcnNlZF92ZXJzaW9uID0gcGFyc2UoaXRlbSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcGFyc2VkX3ZlcnNpb24gPSBpdGVtCgogICAgICAgICAgICAgICAgIyBGaWx0ZXIgb3V0IGFueSBpdGVtIHdoaWNoIGlzIHBhcnNlZCBhcyBhIExlZ2FjeVZlcnNpb24KICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UocGFyc2VkX3ZlcnNpb24sIExlZ2FjeVZlcnNpb24pOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICAgICAgIyBTdG9yZSBhbnkgaXRlbSB3aGljaCBpcyBhIHByZS1yZWxlYXNlIGZvciBsYXRlciB1bmxlc3Mgd2UndmUKICAgICAgICAgICAgICAgICMgYWxyZWFkeSBmb3VuZCBhIGZpbmFsIHZlcnNpb24gb3Igd2UgYXJlIGFjY2VwdGluZyBwcmVyZWxlYXNlcwogICAgICAgICAgICAgICAgaWYgcGFyc2VkX3ZlcnNpb24uaXNfcHJlcmVsZWFzZSBhbmQgbm90IHByZXJlbGVhc2VzOgogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBmaWx0ZXJlZDoKICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRfcHJlcmVsZWFzZXMuYXBwZW5kKGl0ZW0pCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkLmFwcGVuZChpdGVtKQoKICAgICAgICAgICAgIyBJZiB3ZSd2ZSBmb3VuZCBubyBpdGVtcyBleGNlcHQgZm9yIHByZS1yZWxlYXNlcywgdGhlbiB3ZSdsbCBnbwogICAgICAgICAgICAjIGFoZWFkIGFuZCB1c2UgdGhlIHByZS1yZWxlYXNlcwogICAgICAgICAgICBpZiBub3QgZmlsdGVyZWQgYW5kIGZvdW5kX3ByZXJlbGVhc2VzIGFuZCBwcmVyZWxlYXNlcyBpcyBOb25lOgogICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kX3ByZXJlbGVhc2VzCgogICAgICAgICAgICByZXR1cm4gZmlsdGVyZWQKUEsDBBQAAAAAAAAAIQDz9of/hTIAAIUyAABJAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvX3ZlbmRvci9wYWNrYWdpbmcvdGFncy5weSMgVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbgojIDIuMCwgYW5kIHRoZSBCU0QgTGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyByZXBvc2l0b3J5CiMgZm9yIGNvbXBsZXRlIGRldGFpbHMuCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGRpc3R1dGlscy51dGlsCgp0cnk6CiAgICBmcm9tIGltcG9ydGxpYi5tYWNoaW5lcnkgaW1wb3J0IEVYVEVOU0lPTl9TVUZGSVhFUwpleGNlcHQgSW1wb3J0RXJyb3I6ICAjIHByYWdtYTogbm8gY292ZXIKICAgIGltcG9ydCBpbXAKCiAgICBFWFRFTlNJT05fU1VGRklYRVMgPSBbeFswXSBmb3IgeCBpbiBpbXAuZ2V0X3N1ZmZpeGVzKCldCiAgICBkZWwgaW1wCmltcG9ydCBwbGF0Zm9ybQppbXBvcnQgcmUKaW1wb3J0IHN5cwppbXBvcnQgc3lzY29uZmlnCmltcG9ydCB3YXJuaW5ncwoKCklOVEVSUFJFVEVSX1NIT1JUX05BTUVTID0gewogICAgInB5dGhvbiI6ICJweSIsICAjIEdlbmVyaWMuCiAgICAiY3B5dGhvbiI6ICJjcCIsCiAgICAicHlweSI6ICJwcCIsCiAgICAiaXJvbnB5dGhvbiI6ICJpcCIsCiAgICAianl0aG9uIjogImp5IiwKfQoKCl8zMl9CSVRfSU5URVJQUkVURVIgPSBzeXMubWF4c2l6ZSA8PSAyICoqIDMyCgoKY2xhc3MgVGFnKG9iamVjdCk6CgogICAgX19zbG90c19fID0gWyJfaW50ZXJwcmV0ZXIiLCAiX2FiaSIsICJfcGxhdGZvcm0iXQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpbnRlcnByZXRlciwgYWJpLCBwbGF0Zm9ybSk6CiAgICAgICAgc2VsZi5faW50ZXJwcmV0ZXIgPSBpbnRlcnByZXRlci5sb3dlcigpCiAgICAgICAgc2VsZi5fYWJpID0gYWJpLmxvd2VyKCkKICAgICAgICBzZWxmLl9wbGF0Zm9ybSA9IHBsYXRmb3JtLmxvd2VyKCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpbnRlcnByZXRlcihzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5faW50ZXJwcmV0ZXIKCiAgICBAcHJvcGVydHkKICAgIGRlZiBhYmkoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2FiaQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHBsYXRmb3JtKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9wbGF0Zm9ybQoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiAoCiAgICAgICAgICAgIChzZWxmLnBsYXRmb3JtID09IG90aGVyLnBsYXRmb3JtKQogICAgICAgICAgICBhbmQgKHNlbGYuYWJpID09IG90aGVyLmFiaSkKICAgICAgICAgICAgYW5kIChzZWxmLmludGVycHJldGVyID09IG90aGVyLmludGVycHJldGVyKQogICAgICAgICkKCiAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGhhc2goKHNlbGYuX2ludGVycHJldGVyLCBzZWxmLl9hYmksIHNlbGYuX3BsYXRmb3JtKSkKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gInt9LXt9LXt9Ii5mb3JtYXQoc2VsZi5faW50ZXJwcmV0ZXIsIHNlbGYuX2FiaSwgc2VsZi5fcGxhdGZvcm0pCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiPHtzZWxmfSBAIHtzZWxmX2lkfT4iLmZvcm1hdChzZWxmPXNlbGYsIHNlbGZfaWQ9aWQoc2VsZikpCgoKZGVmIHBhcnNlX3RhZyh0YWcpOgogICAgdGFncyA9IHNldCgpCiAgICBpbnRlcnByZXRlcnMsIGFiaXMsIHBsYXRmb3JtcyA9IHRhZy5zcGxpdCgiLSIpCiAgICBmb3IgaW50ZXJwcmV0ZXIgaW4gaW50ZXJwcmV0ZXJzLnNwbGl0KCIuIik6CiAgICAgICAgZm9yIGFiaSBpbiBhYmlzLnNwbGl0KCIuIik6CiAgICAgICAgICAgIGZvciBwbGF0Zm9ybV8gaW4gcGxhdGZvcm1zLnNwbGl0KCIuIik6CiAgICAgICAgICAgICAgICB0YWdzLmFkZChUYWcoaW50ZXJwcmV0ZXIsIGFiaSwgcGxhdGZvcm1fKSkKICAgIHJldHVybiBmcm96ZW5zZXQodGFncykKCgpkZWYgX25vcm1hbGl6ZV9zdHJpbmcoc3RyaW5nKToKICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgiLiIsICJfIikucmVwbGFjZSgiLSIsICJfIikKCgpkZWYgX2NweXRob25faW50ZXJwcmV0ZXIocHlfdmVyc2lvbik6CiAgICAjIFRPRE86IElzIHVzaW5nIHB5X3ZlcnNpb25fbm9kb3QgZm9yIGludGVycHJldGVyIHZlcnNpb24gY3JpdGljYWw/CiAgICByZXR1cm4gImNwe21ham9yfXttaW5vcn0iLmZvcm1hdChtYWpvcj1weV92ZXJzaW9uWzBdLCBtaW5vcj1weV92ZXJzaW9uWzFdKQoKCmRlZiBfY3B5dGhvbl9hYmlzKHB5X3ZlcnNpb24pOgogICAgYWJpcyA9IFtdCiAgICB2ZXJzaW9uID0gInt9e30iLmZvcm1hdCgqcHlfdmVyc2lvbls6Ml0pCiAgICBkZWJ1ZyA9IHB5bWFsbG9jID0gdWNzNCA9ICIiCiAgICB3aXRoX2RlYnVnID0gc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCJQeV9ERUJVRyIpCiAgICBoYXNfcmVmY291bnQgPSBoYXNhdHRyKHN5cywgImdldHRvdGFscmVmY291bnQiKQogICAgIyBXaW5kb3dzIGRvZXNuJ3Qgc2V0IFB5X0RFQlVHLCBzbyBjaGVja2luZyBmb3Igc3VwcG9ydCBvZiBkZWJ1Zy1jb21waWxlZAogICAgIyBleHRlbnNpb24gbW9kdWxlcyBpcyB0aGUgYmVzdCBvcHRpb24uCiAgICAjIGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3BpcC9pc3N1ZXMvMzM4MyNpc3N1ZWNvbW1lbnQtMTczMjY3NjkyCiAgICBoYXNfZXh0ID0gIl9kLnB5ZCIgaW4gRVhURU5TSU9OX1NVRkZJWEVTCiAgICBpZiB3aXRoX2RlYnVnIG9yICh3aXRoX2RlYnVnIGlzIE5vbmUgYW5kIChoYXNfcmVmY291bnQgb3IgaGFzX2V4dCkpOgogICAgICAgIGRlYnVnID0gImQiCiAgICBpZiBweV92ZXJzaW9uIDwgKDMsIDgpOgogICAgICAgIHdpdGhfcHltYWxsb2MgPSBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoIldJVEhfUFlNQUxMT0MiKQogICAgICAgIGlmIHdpdGhfcHltYWxsb2Mgb3Igd2l0aF9weW1hbGxvYyBpcyBOb25lOgogICAgICAgICAgICBweW1hbGxvYyA9ICJtIgogICAgICAgIGlmIHB5X3ZlcnNpb24gPCAoMywgMyk6CiAgICAgICAgICAgIHVuaWNvZGVfc2l6ZSA9IHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcigiUHlfVU5JQ09ERV9TSVpFIikKICAgICAgICAgICAgaWYgdW5pY29kZV9zaXplID09IDQgb3IgKAogICAgICAgICAgICAgICAgdW5pY29kZV9zaXplIGlzIE5vbmUgYW5kIHN5cy5tYXh1bmljb2RlID09IDB4MTBGRkZGCiAgICAgICAgICAgICk6CiAgICAgICAgICAgICAgICB1Y3M0ID0gInUiCiAgICBlbGlmIGRlYnVnOgogICAgICAgICMgRGVidWcgYnVpbGRzIGNhbiBhbHNvIGxvYWQgIm5vcm1hbCIgZXh0ZW5zaW9uIG1vZHVsZXMuCiAgICAgICAgIyBXZSBjYW4gYWxzbyBhc3N1bWUgbm8gVUNTLTQgb3IgcHltYWxsb2MgcmVxdWlyZW1lbnQuCiAgICAgICAgYWJpcy5hcHBlbmQoImNwe3ZlcnNpb259Ii5mb3JtYXQodmVyc2lvbj12ZXJzaW9uKSkKICAgIGFiaXMuaW5zZXJ0KAogICAgICAgIDAsCiAgICAgICAgImNwe3ZlcnNpb259e2RlYnVnfXtweW1hbGxvY317dWNzNH0iLmZvcm1hdCgKICAgICAgICAgICAgdmVyc2lvbj12ZXJzaW9uLCBkZWJ1Zz1kZWJ1ZywgcHltYWxsb2M9cHltYWxsb2MsIHVjczQ9dWNzNAogICAgICAgICksCiAgICApCiAgICByZXR1cm4gYWJpcwoKCmRlZiBfY3B5dGhvbl90YWdzKHB5X3ZlcnNpb24sIGludGVycHJldGVyLCBhYmlzLCBwbGF0Zm9ybXMpOgogICAgZm9yIGFiaSBpbiBhYmlzOgogICAgICAgIGZvciBwbGF0Zm9ybV8gaW4gcGxhdGZvcm1zOgogICAgICAgICAgICB5aWVsZCBUYWcoaW50ZXJwcmV0ZXIsIGFiaSwgcGxhdGZvcm1fKQogICAgZm9yIHRhZyBpbiAoVGFnKGludGVycHJldGVyLCAiYWJpMyIsIHBsYXRmb3JtXykgZm9yIHBsYXRmb3JtXyBpbiBwbGF0Zm9ybXMpOgogICAgICAgIHlpZWxkIHRhZwogICAgZm9yIHRhZyBpbiAoVGFnKGludGVycHJldGVyLCAibm9uZSIsIHBsYXRmb3JtXykgZm9yIHBsYXRmb3JtXyBpbiBwbGF0Zm9ybXMpOgogICAgICAgIHlpZWxkIHRhZwogICAgIyBQRVAgMzg0IHdhcyBmaXJzdCBpbXBsZW1lbnRlZCBpbiBQeXRob24gMy4yLgogICAgZm9yIG1pbm9yX3ZlcnNpb24gaW4gcmFuZ2UocHlfdmVyc2lvblsxXSAtIDEsIDEsIC0xKToKICAgICAgICBmb3IgcGxhdGZvcm1fIGluIHBsYXRmb3JtczoKICAgICAgICAgICAgaW50ZXJwcmV0ZXIgPSAiY3B7bWFqb3J9e21pbm9yfSIuZm9ybWF0KAogICAgICAgICAgICAgICAgbWFqb3I9cHlfdmVyc2lvblswXSwgbWlub3I9bWlub3JfdmVyc2lvbgogICAgICAgICAgICApCiAgICAgICAgICAgIHlpZWxkIFRhZyhpbnRlcnByZXRlciwgImFiaTMiLCBwbGF0Zm9ybV8pCgoKZGVmIF9weXB5X2ludGVycHJldGVyKCk6CiAgICByZXR1cm4gInBwe3B5X21ham9yfXtweXB5X21ham9yfXtweXB5X21pbm9yfSIuZm9ybWF0KAogICAgICAgIHB5X21ham9yPXN5cy52ZXJzaW9uX2luZm9bMF0sCiAgICAgICAgcHlweV9tYWpvcj1zeXMucHlweV92ZXJzaW9uX2luZm8ubWFqb3IsCiAgICAgICAgcHlweV9taW5vcj1zeXMucHlweV92ZXJzaW9uX2luZm8ubWlub3IsCiAgICApCgoKZGVmIF9nZW5lcmljX2FiaSgpOgogICAgYWJpID0gc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCJTT0FCSSIpCiAgICBpZiBhYmk6CiAgICAgICAgcmV0dXJuIF9ub3JtYWxpemVfc3RyaW5nKGFiaSkKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuICJub25lIgoKCmRlZiBfcHlweV90YWdzKHB5X3ZlcnNpb24sIGludGVycHJldGVyLCBhYmksIHBsYXRmb3Jtcyk6CiAgICBmb3IgdGFnIGluIChUYWcoaW50ZXJwcmV0ZXIsIGFiaSwgcGxhdGZvcm0pIGZvciBwbGF0Zm9ybSBpbiBwbGF0Zm9ybXMpOgogICAgICAgIHlpZWxkIHRhZwogICAgZm9yIHRhZyBpbiAoVGFnKGludGVycHJldGVyLCAibm9uZSIsIHBsYXRmb3JtKSBmb3IgcGxhdGZvcm0gaW4gcGxhdGZvcm1zKToKICAgICAgICB5aWVsZCB0YWcKCgpkZWYgX2dlbmVyaWNfdGFncyhpbnRlcnByZXRlciwgcHlfdmVyc2lvbiwgYWJpLCBwbGF0Zm9ybXMpOgogICAgZm9yIHRhZyBpbiAoVGFnKGludGVycHJldGVyLCBhYmksIHBsYXRmb3JtKSBmb3IgcGxhdGZvcm0gaW4gcGxhdGZvcm1zKToKICAgICAgICB5aWVsZCB0YWcKICAgIGlmIGFiaSAhPSAibm9uZSI6CiAgICAgICAgdGFncyA9IChUYWcoaW50ZXJwcmV0ZXIsICJub25lIiwgcGxhdGZvcm1fKSBmb3IgcGxhdGZvcm1fIGluIHBsYXRmb3JtcykKICAgICAgICBmb3IgdGFnIGluIHRhZ3M6CiAgICAgICAgICAgIHlpZWxkIHRhZwoKCmRlZiBfcHlfaW50ZXJwcmV0ZXJfcmFuZ2UocHlfdmVyc2lvbik6CiAgICAiIiIKICAgIFlpZWxkIFB5dGhvbiB2ZXJzaW9ucyBpbiBkZXNjZW5kaW5nIG9yZGVyLgoKICAgIEFmdGVyIHRoZSBsYXRlc3QgdmVyc2lvbiwgdGhlIG1ham9yLW9ubHkgdmVyc2lvbiB3aWxsIGJlIHlpZWxkZWQsIGFuZCB0aGVuCiAgICBhbGwgZm9sbG93aW5nIHZlcnNpb25zIHVwIHRvICdlbmQnLgogICAgIiIiCiAgICB5aWVsZCAicHl7bWFqb3J9e21pbm9yfSIuZm9ybWF0KG1ham9yPXB5X3ZlcnNpb25bMF0sIG1pbm9yPXB5X3ZlcnNpb25bMV0pCiAgICB5aWVsZCAicHl7bWFqb3J9Ii5mb3JtYXQobWFqb3I9cHlfdmVyc2lvblswXSkKICAgIGZvciBtaW5vciBpbiByYW5nZShweV92ZXJzaW9uWzFdIC0gMSwgLTEsIC0xKToKICAgICAgICB5aWVsZCAicHl7bWFqb3J9e21pbm9yfSIuZm9ybWF0KG1ham9yPXB5X3ZlcnNpb25bMF0sIG1pbm9yPW1pbm9yKQoKCmRlZiBfaW5kZXBlbmRlbnRfdGFncyhpbnRlcnByZXRlciwgcHlfdmVyc2lvbiwgcGxhdGZvcm1zKToKICAgICIiIgogICAgUmV0dXJuIHRoZSBzZXF1ZW5jZSBvZiB0YWdzIHRoYXQgYXJlIGNvbnNpc3RlbnQgYWNyb3NzIGltcGxlbWVudGF0aW9ucy4KCiAgICBUaGUgdGFncyBjb25zaXN0IG9mOgogICAgLSBweSotbm9uZS08cGxhdGZvcm0+CiAgICAtIDxpbnRlcnByZXRlcj4tbm9uZS1hbnkKICAgIC0gcHkqLW5vbmUtYW55CiAgICAiIiIKICAgIGZvciB2ZXJzaW9uIGluIF9weV9pbnRlcnByZXRlcl9yYW5nZShweV92ZXJzaW9uKToKICAgICAgICBmb3IgcGxhdGZvcm1fIGluIHBsYXRmb3JtczoKICAgICAgICAgICAgeWllbGQgVGFnKHZlcnNpb24sICJub25lIiwgcGxhdGZvcm1fKQogICAgeWllbGQgVGFnKGludGVycHJldGVyLCAibm9uZSIsICJhbnkiKQogICAgZm9yIHZlcnNpb24gaW4gX3B5X2ludGVycHJldGVyX3JhbmdlKHB5X3ZlcnNpb24pOgogICAgICAgIHlpZWxkIFRhZyh2ZXJzaW9uLCAibm9uZSIsICJhbnkiKQoKCmRlZiBfbWFjX2FyY2goYXJjaCwgaXNfMzJiaXQ9XzMyX0JJVF9JTlRFUlBSRVRFUik6CiAgICBpZiBub3QgaXNfMzJiaXQ6CiAgICAgICAgcmV0dXJuIGFyY2gKCiAgICBpZiBhcmNoLnN0YXJ0c3dpdGgoInBwYyIpOgogICAgICAgIHJldHVybiAicHBjIgoKICAgIHJldHVybiAiaTM4NiIKCgpkZWYgX21hY19iaW5hcnlfZm9ybWF0cyh2ZXJzaW9uLCBjcHVfYXJjaCk6CiAgICBmb3JtYXRzID0gW2NwdV9hcmNoXQogICAgaWYgY3B1X2FyY2ggPT0gIng4Nl82NCI6CiAgICAgICAgaWYgdmVyc2lvbiA8ICgxMCwgNCk6CiAgICAgICAgICAgIHJldHVybiBbXQogICAgICAgIGZvcm1hdHMuZXh0ZW5kKFsiaW50ZWwiLCAiZmF0NjQiLCAiZmF0MzIiXSkKCiAgICBlbGlmIGNwdV9hcmNoID09ICJpMzg2IjoKICAgICAgICBpZiB2ZXJzaW9uIDwgKDEwLCA0KToKICAgICAgICAgICAgcmV0dXJuIFtdCiAgICAgICAgZm9ybWF0cy5leHRlbmQoWyJpbnRlbCIsICJmYXQzMiIsICJmYXQiXSkKCiAgICBlbGlmIGNwdV9hcmNoID09ICJwcGM2NCI6CiAgICAgICAgIyBUT0RPOiBOZWVkIHRvIGNhcmUgYWJvdXQgMzItYml0IFBQQyBmb3IgcHBjNjQgdGhyb3VnaCAxMC4yPwogICAgICAgIGlmIHZlcnNpb24gPiAoMTAsIDUpIG9yIHZlcnNpb24gPCAoMTAsIDQpOgogICAgICAgICAgICByZXR1cm4gW10KICAgICAgICBmb3JtYXRzLmFwcGVuZCgiZmF0NjQiKQoKICAgIGVsaWYgY3B1X2FyY2ggPT0gInBwYyI6CiAgICAgICAgaWYgdmVyc2lvbiA+ICgxMCwgNik6CiAgICAgICAgICAgIHJldHVybiBbXQogICAgICAgIGZvcm1hdHMuZXh0ZW5kKFsiZmF0MzIiLCAiZmF0Il0pCgogICAgZm9ybWF0cy5hcHBlbmQoInVuaXZlcnNhbCIpCiAgICByZXR1cm4gZm9ybWF0cwoKCmRlZiBfbWFjX3BsYXRmb3Jtcyh2ZXJzaW9uPU5vbmUsIGFyY2g9Tm9uZSk6CiAgICB2ZXJzaW9uX3N0ciwgXywgY3B1X2FyY2ggPSBwbGF0Zm9ybS5tYWNfdmVyKCkKICAgIGlmIHZlcnNpb24gaXMgTm9uZToKICAgICAgICB2ZXJzaW9uID0gdHVwbGUobWFwKGludCwgdmVyc2lvbl9zdHIuc3BsaXQoIi4iKVs6Ml0pKQogICAgaWYgYXJjaCBpcyBOb25lOgogICAgICAgIGFyY2ggPSBfbWFjX2FyY2goY3B1X2FyY2gpCiAgICBwbGF0Zm9ybXMgPSBbXQogICAgZm9yIG1pbm9yX3ZlcnNpb24gaW4gcmFuZ2UodmVyc2lvblsxXSwgLTEsIC0xKToKICAgICAgICBjb21wYXRfdmVyc2lvbiA9IHZlcnNpb25bMF0sIG1pbm9yX3ZlcnNpb24KICAgICAgICBiaW5hcnlfZm9ybWF0cyA9IF9tYWNfYmluYXJ5X2Zvcm1hdHMoY29tcGF0X3ZlcnNpb24sIGFyY2gpCiAgICAgICAgZm9yIGJpbmFyeV9mb3JtYXQgaW4gYmluYXJ5X2Zvcm1hdHM6CiAgICAgICAgICAgIHBsYXRmb3Jtcy5hcHBlbmQoCiAgICAgICAgICAgICAgICAibWFjb3N4X3ttYWpvcn1fe21pbm9yfV97YmluYXJ5X2Zvcm1hdH0iLmZvcm1hdCgKICAgICAgICAgICAgICAgICAgICBtYWpvcj1jb21wYXRfdmVyc2lvblswXSwKICAgICAgICAgICAgICAgICAgICBtaW5vcj1jb21wYXRfdmVyc2lvblsxXSwKICAgICAgICAgICAgICAgICAgICBiaW5hcnlfZm9ybWF0PWJpbmFyeV9mb3JtYXQsCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICkKICAgIHJldHVybiBwbGF0Zm9ybXMKCgojIEZyb20gUEVQIDUxMy4KZGVmIF9pc19tYW55bGludXhfY29tcGF0aWJsZShuYW1lLCBnbGliY192ZXJzaW9uKToKICAgICMgQ2hlY2sgZm9yIHByZXNlbmNlIG9mIF9tYW55bGludXggbW9kdWxlLgogICAgdHJ5OgogICAgICAgIGltcG9ydCBfbWFueWxpbnV4CgogICAgICAgIHJldHVybiBib29sKGdldGF0dHIoX21hbnlsaW51eCwgbmFtZSArICJfY29tcGF0aWJsZSIpKQogICAgZXhjZXB0IChJbXBvcnRFcnJvciwgQXR0cmlidXRlRXJyb3IpOgogICAgICAgICMgRmFsbCB0aHJvdWdoIHRvIGhldXJpc3RpYyBjaGVjayBiZWxvdy4KICAgICAgICBwYXNzCgogICAgcmV0dXJuIF9oYXZlX2NvbXBhdGlibGVfZ2xpYmMoKmdsaWJjX3ZlcnNpb24pCgoKZGVmIF9nbGliY192ZXJzaW9uX3N0cmluZygpOgogICAgIyBSZXR1cm5zIGdsaWJjIHZlcnNpb24gc3RyaW5nLCBvciBOb25lIGlmIG5vdCB1c2luZyBnbGliYy4KICAgIGltcG9ydCBjdHlwZXMKCiAgICAjIGN0eXBlcy5DRExMKE5vbmUpIGludGVybmFsbHkgY2FsbHMgZGxvcGVuKE5VTEwpLCBhbmQgYXMgdGhlIGRsb3BlbgogICAgIyBtYW5wYWdlIHNheXMsICJJZiBmaWxlbmFtZSBpcyBOVUxMLCB0aGVuIHRoZSByZXR1cm5lZCBoYW5kbGUgaXMgZm9yIHRoZQogICAgIyBtYWluIHByb2dyYW0iLiBUaGlzIHdheSB3ZSBjYW4gbGV0IHRoZSBsaW5rZXIgZG8gdGhlIHdvcmsgdG8gZmlndXJlIG91dAogICAgIyB3aGljaCBsaWJjIG91ciBwcm9jZXNzIGlzIGFjdHVhbGx5IHVzaW5nLgogICAgcHJvY2Vzc19uYW1lc3BhY2UgPSBjdHlwZXMuQ0RMTChOb25lKQogICAgdHJ5OgogICAgICAgIGdudV9nZXRfbGliY192ZXJzaW9uID0gcHJvY2Vzc19uYW1lc3BhY2UuZ251X2dldF9saWJjX3ZlcnNpb24KICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAjIFN5bWJvbCBkb2Vzbid0IGV4aXN0IC0+IHRoZXJlZm9yZSwgd2UgYXJlIG5vdCBsaW5rZWQgdG8KICAgICAgICAjIGdsaWJjLgogICAgICAgIHJldHVybiBOb25lCgogICAgIyBDYWxsIGdudV9nZXRfbGliY192ZXJzaW9uLCB3aGljaCByZXR1cm5zIGEgc3RyaW5nIGxpa2UgIjIuNSIKICAgIGdudV9nZXRfbGliY192ZXJzaW9uLnJlc3R5cGUgPSBjdHlwZXMuY19jaGFyX3AKICAgIHZlcnNpb25fc3RyID0gZ251X2dldF9saWJjX3ZlcnNpb24oKQogICAgIyBweTIgLyBweTMgY29tcGF0aWJpbGl0eToKICAgIGlmIG5vdCBpc2luc3RhbmNlKHZlcnNpb25fc3RyLCBzdHIpOgogICAgICAgIHZlcnNpb25fc3RyID0gdmVyc2lvbl9zdHIuZGVjb2RlKCJhc2NpaSIpCgogICAgcmV0dXJuIHZlcnNpb25fc3RyCgoKIyBTZXBhcmF0ZWQgb3V0IGZyb20gaGF2ZV9jb21wYXRpYmxlX2dsaWJjIGZvciBlYXNpZXIgdW5pdCB0ZXN0aW5nLgpkZWYgX2NoZWNrX2dsaWJjX3ZlcnNpb24odmVyc2lvbl9zdHIsIHJlcXVpcmVkX21ham9yLCBtaW5pbXVtX21pbm9yKToKICAgICMgUGFyc2Ugc3RyaW5nIGFuZCBjaGVjayBhZ2FpbnN0IHJlcXVlc3RlZCB2ZXJzaW9uLgogICAgIwogICAgIyBXZSB1c2UgYSByZWdleHAgaW5zdGVhZCBvZiBzdHIuc3BsaXQgYmVjYXVzZSB3ZSB3YW50IHRvIGRpc2NhcmQgYW55CiAgICAjIHJhbmRvbSBqdW5rIHRoYXQgbWlnaHQgY29tZSBhZnRlciB0aGUgbWlub3IgdmVyc2lvbiAtLSB0aGlzIG1pZ2h0IGhhcHBlbgogICAgIyBpbiBwYXRjaGVkL2ZvcmtlZCB2ZXJzaW9ucyBvZiBnbGliYyAoZS5nLiBMaW5hcm8ncyB2ZXJzaW9uIG9mIGdsaWJjCiAgICAjIHVzZXMgdmVyc2lvbiBzdHJpbmdzIGxpa2UgIjIuMjAtMjAxNC4xMSIpLiBTZWUgZ2gtMzU4OC4KICAgIG0gPSByZS5tYXRjaChyIig/UDxtYWpvcj5bMC05XSspXC4oP1A8bWlub3I+WzAtOV0rKSIsIHZlcnNpb25fc3RyKQogICAgaWYgbm90IG06CiAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgIkV4cGVjdGVkIGdsaWJjIHZlcnNpb24gd2l0aCAyIGNvbXBvbmVudHMgbWFqb3IubWlub3IsIgogICAgICAgICAgICAiIGdvdDogJXMiICUgdmVyc2lvbl9zdHIsCiAgICAgICAgICAgIFJ1bnRpbWVXYXJuaW5nLAogICAgICAgICkKICAgICAgICByZXR1cm4gRmFsc2UKICAgIHJldHVybiAoCiAgICAgICAgaW50KG0uZ3JvdXAoIm1ham9yIikpID09IHJlcXVpcmVkX21ham9yCiAgICAgICAgYW5kIGludChtLmdyb3VwKCJtaW5vciIpKSA+PSBtaW5pbXVtX21pbm9yCiAgICApCgoKZGVmIF9oYXZlX2NvbXBhdGlibGVfZ2xpYmMocmVxdWlyZWRfbWFqb3IsIG1pbmltdW1fbWlub3IpOgogICAgdmVyc2lvbl9zdHIgPSBfZ2xpYmNfdmVyc2lvbl9zdHJpbmcoKQogICAgaWYgdmVyc2lvbl9zdHIgaXMgTm9uZToKICAgICAgICByZXR1cm4gRmFsc2UKICAgIHJldHVybiBfY2hlY2tfZ2xpYmNfdmVyc2lvbih2ZXJzaW9uX3N0ciwgcmVxdWlyZWRfbWFqb3IsIG1pbmltdW1fbWlub3IpCgoKZGVmIF9saW51eF9wbGF0Zm9ybXMoaXNfMzJiaXQ9XzMyX0JJVF9JTlRFUlBSRVRFUik6CiAgICBsaW51eCA9IF9ub3JtYWxpemVfc3RyaW5nKGRpc3R1dGlscy51dGlsLmdldF9wbGF0Zm9ybSgpKQogICAgaWYgbGludXggPT0gImxpbnV4X3g4Nl82NCIgYW5kIGlzXzMyYml0OgogICAgICAgIGxpbnV4ID0gImxpbnV4X2k2ODYiCiAgICBtYW55bGludXhfc3VwcG9ydCA9ICgKICAgICAgICAoIm1hbnlsaW51eDIwMTQiLCAoMiwgMTcpKSwgICMgQ2VudE9TIDcgdy8gZ2xpYmMgMi4xNyAoUEVQIDU5OSkKICAgICAgICAoIm1hbnlsaW51eDIwMTAiLCAoMiwgMTIpKSwgICMgQ2VudE9TIDYgdy8gZ2xpYmMgMi4xMiAoUEVQIDU3MSkKICAgICAgICAoIm1hbnlsaW51eDEiLCAoMiwgNSkpLCAgIyBDZW50T1MgNSB3LyBnbGliYyAyLjUgKFBFUCA1MTMpCiAgICApCiAgICBtYW55bGludXhfc3VwcG9ydF9pdGVyID0gaXRlcihtYW55bGludXhfc3VwcG9ydCkKICAgIGZvciBuYW1lLCBnbGliY192ZXJzaW9uIGluIG1hbnlsaW51eF9zdXBwb3J0X2l0ZXI6CiAgICAgICAgaWYgX2lzX21hbnlsaW51eF9jb21wYXRpYmxlKG5hbWUsIGdsaWJjX3ZlcnNpb24pOgogICAgICAgICAgICBwbGF0Zm9ybXMgPSBbbGludXgucmVwbGFjZSgibGludXgiLCBuYW1lKV0KICAgICAgICAgICAgYnJlYWsKICAgIGVsc2U6CiAgICAgICAgcGxhdGZvcm1zID0gW10KICAgICMgU3VwcG9ydCBmb3IgYSBsYXRlciBtYW55bGludXggaW1wbGllcyBzdXBwb3J0IGZvciBhbiBlYXJsaWVyIHZlcnNpb24uCiAgICBwbGF0Zm9ybXMgKz0gW2xpbnV4LnJlcGxhY2UoImxpbnV4IiwgbmFtZSkgZm9yIG5hbWUsIF8gaW4gbWFueWxpbnV4X3N1cHBvcnRfaXRlcl0KICAgIHBsYXRmb3Jtcy5hcHBlbmQobGludXgpCiAgICByZXR1cm4gcGxhdGZvcm1zCgoKZGVmIF9nZW5lcmljX3BsYXRmb3JtcygpOgogICAgcGxhdGZvcm0gPSBfbm9ybWFsaXplX3N0cmluZyhkaXN0dXRpbHMudXRpbC5nZXRfcGxhdGZvcm0oKSkKICAgIHJldHVybiBbcGxhdGZvcm1dCgoKZGVmIF9pbnRlcnByZXRlcl9uYW1lKCk6CiAgICBuYW1lID0gcGxhdGZvcm0ucHl0aG9uX2ltcGxlbWVudGF0aW9uKCkubG93ZXIoKQogICAgcmV0dXJuIElOVEVSUFJFVEVSX1NIT1JUX05BTUVTLmdldChuYW1lKSBvciBuYW1lCgoKZGVmIF9nZW5lcmljX2ludGVycHJldGVyKG5hbWUsIHB5X3ZlcnNpb24pOgogICAgdmVyc2lvbiA9IHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcigicHlfdmVyc2lvbl9ub2RvdCIpCiAgICBpZiBub3QgdmVyc2lvbjoKICAgICAgICB2ZXJzaW9uID0gIiIuam9pbihtYXAoc3RyLCBweV92ZXJzaW9uWzoyXSkpCiAgICByZXR1cm4gIntuYW1lfXt2ZXJzaW9ufSIuZm9ybWF0KG5hbWU9bmFtZSwgdmVyc2lvbj12ZXJzaW9uKQoKCmRlZiBzeXNfdGFncygpOgogICAgIiIiCiAgICBSZXR1cm5zIHRoZSBzZXF1ZW5jZSBvZiB0YWcgdHJpcGxlcyBmb3IgdGhlIHJ1bm5pbmcgaW50ZXJwcmV0ZXIuCgogICAgVGhlIG9yZGVyIG9mIHRoZSBzZXF1ZW5jZSBjb3JyZXNwb25kcyB0byBwcmlvcml0eSBvcmRlciBmb3IgdGhlCiAgICBpbnRlcnByZXRlciwgZnJvbSBtb3N0IHRvIGxlYXN0IGltcG9ydGFudC4KICAgICIiIgogICAgcHlfdmVyc2lvbiA9IHN5cy52ZXJzaW9uX2luZm9bOjJdCiAgICBpbnRlcnByZXRlcl9uYW1lID0gX2ludGVycHJldGVyX25hbWUoKQogICAgaWYgcGxhdGZvcm0uc3lzdGVtKCkgPT0gIkRhcndpbiI6CiAgICAgICAgcGxhdGZvcm1zID0gX21hY19wbGF0Zm9ybXMoKQogICAgZWxpZiBwbGF0Zm9ybS5zeXN0ZW0oKSA9PSAiTGludXgiOgogICAgICAgIHBsYXRmb3JtcyA9IF9saW51eF9wbGF0Zm9ybXMoKQogICAgZWxzZToKICAgICAgICBwbGF0Zm9ybXMgPSBfZ2VuZXJpY19wbGF0Zm9ybXMoKQoKICAgIGlmIGludGVycHJldGVyX25hbWUgPT0gImNwIjoKICAgICAgICBpbnRlcnByZXRlciA9IF9jcHl0aG9uX2ludGVycHJldGVyKHB5X3ZlcnNpb24pCiAgICAgICAgYWJpcyA9IF9jcHl0aG9uX2FiaXMocHlfdmVyc2lvbikKICAgICAgICBmb3IgdGFnIGluIF9jcHl0aG9uX3RhZ3MocHlfdmVyc2lvbiwgaW50ZXJwcmV0ZXIsIGFiaXMsIHBsYXRmb3Jtcyk6CiAgICAgICAgICAgIHlpZWxkIHRhZwogICAgZWxpZiBpbnRlcnByZXRlcl9uYW1lID09ICJwcCI6CiAgICAgICAgaW50ZXJwcmV0ZXIgPSBfcHlweV9pbnRlcnByZXRlcigpCiAgICAgICAgYWJpID0gX2dlbmVyaWNfYWJpKCkKICAgICAgICBmb3IgdGFnIGluIF9weXB5X3RhZ3MocHlfdmVyc2lvbiwgaW50ZXJwcmV0ZXIsIGFiaSwgcGxhdGZvcm1zKToKICAgICAgICAgICAgeWllbGQgdGFnCiAgICBlbHNlOgogICAgICAgIGludGVycHJldGVyID0gX2dlbmVyaWNfaW50ZXJwcmV0ZXIoaW50ZXJwcmV0ZXJfbmFtZSwgcHlfdmVyc2lvbikKICAgICAgICBhYmkgPSBfZ2VuZXJpY19hYmkoKQogICAgICAgIGZvciB0YWcgaW4gX2dlbmVyaWNfdGFncyhpbnRlcnByZXRlciwgcHlfdmVyc2lvbiwgYWJpLCBwbGF0Zm9ybXMpOgogICAgICAgICAgICB5aWVsZCB0YWcKICAgIGZvciB0YWcgaW4gX2luZGVwZW5kZW50X3RhZ3MoaW50ZXJwcmV0ZXIsIHB5X3ZlcnNpb24sIHBsYXRmb3Jtcyk6CiAgICAgICAgeWllbGQgdGFnClBLAwQUAAAAAAAAACEAYT2tnfAFAADwBQAASgAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL192ZW5kb3IvcGFja2FnaW5nL3V0aWxzLnB5IyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uCiMgMi4wLCBhbmQgdGhlIEJTRCBMaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHJlcG9zaXRvcnkKIyBmb3IgY29tcGxldGUgZGV0YWlscy4KZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCBwcmludF9mdW5jdGlvbgoKaW1wb3J0IHJlCgpmcm9tIC52ZXJzaW9uIGltcG9ydCBJbnZhbGlkVmVyc2lvbiwgVmVyc2lvbgoKCl9jYW5vbmljYWxpemVfcmVnZXggPSByZS5jb21waWxlKHIiWy1fLl0rIikKCgpkZWYgY2Fub25pY2FsaXplX25hbWUobmFtZSk6CiAgICAjIFRoaXMgaXMgdGFrZW4gZnJvbSBQRVAgNTAzLgogICAgcmV0dXJuIF9jYW5vbmljYWxpemVfcmVnZXguc3ViKCItIiwgbmFtZSkubG93ZXIoKQoKCmRlZiBjYW5vbmljYWxpemVfdmVyc2lvbih2ZXJzaW9uKToKICAgICIiIgogICAgVGhpcyBpcyB2ZXJ5IHNpbWlsYXIgdG8gVmVyc2lvbi5fX3N0cl9fLCBidXQgaGFzIG9uZSBzdWJ0bGUgZGlmZmVyZW5jZXMKICAgIHdpdGggdGhlIHdheSBpdCBoYW5kbGVzIHRoZSByZWxlYXNlIHNlZ21lbnQuCiAgICAiIiIKCiAgICB0cnk6CiAgICAgICAgdmVyc2lvbiA9IFZlcnNpb24odmVyc2lvbikKICAgIGV4Y2VwdCBJbnZhbGlkVmVyc2lvbjoKICAgICAgICAjIExlZ2FjeSB2ZXJzaW9ucyBjYW5ub3QgYmUgbm9ybWFsaXplZAogICAgICAgIHJldHVybiB2ZXJzaW9uCgogICAgcGFydHMgPSBbXQoKICAgICMgRXBvY2gKICAgIGlmIHZlcnNpb24uZXBvY2ggIT0gMDoKICAgICAgICBwYXJ0cy5hcHBlbmQoInswfSEiLmZvcm1hdCh2ZXJzaW9uLmVwb2NoKSkKCiAgICAjIFJlbGVhc2Ugc2VnbWVudAogICAgIyBOQjogVGhpcyBzdHJpcHMgdHJhaWxpbmcgJy4wJ3MgdG8gbm9ybWFsaXplCiAgICBwYXJ0cy5hcHBlbmQocmUuc3ViKHIiKFwuMCkrJCIsICIiLCAiLiIuam9pbihzdHIoeCkgZm9yIHggaW4gdmVyc2lvbi5yZWxlYXNlKSkpCgogICAgIyBQcmUtcmVsZWFzZQogICAgaWYgdmVyc2lvbi5wcmUgaXMgbm90IE5vbmU6CiAgICAgICAgcGFydHMuYXBwZW5kKCIiLmpvaW4oc3RyKHgpIGZvciB4IGluIHZlcnNpb24ucHJlKSkKCiAgICAjIFBvc3QtcmVsZWFzZQogICAgaWYgdmVyc2lvbi5wb3N0IGlzIG5vdCBOb25lOgogICAgICAgIHBhcnRzLmFwcGVuZCgiLnBvc3R7MH0iLmZvcm1hdCh2ZXJzaW9uLnBvc3QpKQoKICAgICMgRGV2ZWxvcG1lbnQgcmVsZWFzZQogICAgaWYgdmVyc2lvbi5kZXYgaXMgbm90IE5vbmU6CiAgICAgICAgcGFydHMuYXBwZW5kKCIuZGV2ezB9Ii5mb3JtYXQodmVyc2lvbi5kZXYpKQoKICAgICMgTG9jYWwgdmVyc2lvbiBzZWdtZW50CiAgICBpZiB2ZXJzaW9uLmxvY2FsIGlzIG5vdCBOb25lOgogICAgICAgIHBhcnRzLmFwcGVuZCgiK3swfSIuZm9ybWF0KHZlcnNpb24ubG9jYWwpKQoKICAgIHJldHVybiAiIi5qb2luKHBhcnRzKQpQSwMEFAAAAAAAAAAhAPEzcuvKLgAAyi4AAEwAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9fdmVuZG9yL3BhY2thZ2luZy92ZXJzaW9uLnB5IyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uCiMgMi4wLCBhbmQgdGhlIEJTRCBMaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHJlcG9zaXRvcnkKIyBmb3IgY29tcGxldGUgZGV0YWlscy4KZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCBwcmludF9mdW5jdGlvbgoKaW1wb3J0IGNvbGxlY3Rpb25zCmltcG9ydCBpdGVydG9vbHMKaW1wb3J0IHJlCgpmcm9tIC5fc3RydWN0dXJlcyBpbXBvcnQgSW5maW5pdHkKCgpfX2FsbF9fID0gWyJwYXJzZSIsICJWZXJzaW9uIiwgIkxlZ2FjeVZlcnNpb24iLCAiSW52YWxpZFZlcnNpb24iLCAiVkVSU0lPTl9QQVRURVJOIl0KCgpfVmVyc2lvbiA9IGNvbGxlY3Rpb25zLm5hbWVkdHVwbGUoCiAgICAiX1ZlcnNpb24iLCBbImVwb2NoIiwgInJlbGVhc2UiLCAiZGV2IiwgInByZSIsICJwb3N0IiwgImxvY2FsIl0KKQoKCmRlZiBwYXJzZSh2ZXJzaW9uKToKICAgICIiIgogICAgUGFyc2UgdGhlIGdpdmVuIHZlcnNpb24gc3RyaW5nIGFuZCByZXR1cm4gZWl0aGVyIGEgOmNsYXNzOmBWZXJzaW9uYCBvYmplY3QKICAgIG9yIGEgOmNsYXNzOmBMZWdhY3lWZXJzaW9uYCBvYmplY3QgZGVwZW5kaW5nIG9uIGlmIHRoZSBnaXZlbiB2ZXJzaW9uIGlzCiAgICBhIHZhbGlkIFBFUCA0NDAgdmVyc2lvbiBvciBhIGxlZ2FjeSB2ZXJzaW9uLgogICAgIiIiCiAgICB0cnk6CiAgICAgICAgcmV0dXJuIFZlcnNpb24odmVyc2lvbikKICAgIGV4Y2VwdCBJbnZhbGlkVmVyc2lvbjoKICAgICAgICByZXR1cm4gTGVnYWN5VmVyc2lvbih2ZXJzaW9uKQoKCmNsYXNzIEludmFsaWRWZXJzaW9uKFZhbHVlRXJyb3IpOgogICAgIiIiCiAgICBBbiBpbnZhbGlkIHZlcnNpb24gd2FzIGZvdW5kLCB1c2VycyBzaG91bGQgcmVmZXIgdG8gUEVQIDQ0MC4KICAgICIiIgoKCmNsYXNzIF9CYXNlVmVyc2lvbihvYmplY3QpOgogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgIHJldHVybiBoYXNoKHNlbGYuX2tleSkKCiAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5fY29tcGFyZShvdGhlciwgbGFtYmRhIHMsIG86IHMgPCBvKQoKICAgIGRlZiBfX2xlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLl9jb21wYXJlKG90aGVyLCBsYW1iZGEgcywgbzogcyA8PSBvKQoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLl9jb21wYXJlKG90aGVyLCBsYW1iZGEgcywgbzogcyA9PSBvKQoKICAgIGRlZiBfX2dlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLl9jb21wYXJlKG90aGVyLCBsYW1iZGEgcywgbzogcyA+PSBvKQoKICAgIGRlZiBfX2d0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLl9jb21wYXJlKG90aGVyLCBsYW1iZGEgcywgbzogcyA+IG8pCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2NvbXBhcmUob3RoZXIsIGxhbWJkYSBzLCBvOiBzICE9IG8pCgogICAgZGVmIF9jb21wYXJlKHNlbGYsIG90aGVyLCBtZXRob2QpOgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBfQmFzZVZlcnNpb24pOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKCiAgICAgICAgcmV0dXJuIG1ldGhvZChzZWxmLl9rZXksIG90aGVyLl9rZXkpCgoKY2xhc3MgTGVnYWN5VmVyc2lvbihfQmFzZVZlcnNpb24pOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHZlcnNpb24pOgogICAgICAgIHNlbGYuX3ZlcnNpb24gPSBzdHIodmVyc2lvbikKICAgICAgICBzZWxmLl9rZXkgPSBfbGVnYWN5X2NtcGtleShzZWxmLl92ZXJzaW9uKQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl92ZXJzaW9uCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiPExlZ2FjeVZlcnNpb24oezB9KT4iLmZvcm1hdChyZXByKHN0cihzZWxmKSkpCgogICAgQHByb3BlcnR5CiAgICBkZWYgcHVibGljKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl92ZXJzaW9uCgogICAgQHByb3BlcnR5CiAgICBkZWYgYmFzZV92ZXJzaW9uKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl92ZXJzaW9uCgogICAgQHByb3BlcnR5CiAgICBkZWYgZXBvY2goc2VsZik6CiAgICAgICAgcmV0dXJuIC0xCgogICAgQHByb3BlcnR5CiAgICBkZWYgcmVsZWFzZShzZWxmKToKICAgICAgICByZXR1cm4gTm9uZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHByZShzZWxmKToKICAgICAgICByZXR1cm4gTm9uZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHBvc3Qoc2VsZik6CiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBAcHJvcGVydHkKICAgIGRlZiBkZXYoc2VsZik6CiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBAcHJvcGVydHkKICAgIGRlZiBsb2NhbChzZWxmKToKICAgICAgICByZXR1cm4gTm9uZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX3ByZXJlbGVhc2Uoc2VsZik6CiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfcG9zdHJlbGVhc2Uoc2VsZik6CiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfZGV2cmVsZWFzZShzZWxmKToKICAgICAgICByZXR1cm4gRmFsc2UKCgpfbGVnYWN5X3ZlcnNpb25fY29tcG9uZW50X3JlID0gcmUuY29tcGlsZShyIihcZCsgfCBbYS16XSsgfCBcLnwgLSkiLCByZS5WRVJCT1NFKQoKX2xlZ2FjeV92ZXJzaW9uX3JlcGxhY2VtZW50X21hcCA9IHsKICAgICJwcmUiOiAiYyIsCiAgICAicHJldmlldyI6ICJjIiwKICAgICItIjogImZpbmFsLSIsCiAgICAicmMiOiAiYyIsCiAgICAiZGV2IjogIkAiLAp9CgoKZGVmIF9wYXJzZV92ZXJzaW9uX3BhcnRzKHMpOgogICAgZm9yIHBhcnQgaW4gX2xlZ2FjeV92ZXJzaW9uX2NvbXBvbmVudF9yZS5zcGxpdChzKToKICAgICAgICBwYXJ0ID0gX2xlZ2FjeV92ZXJzaW9uX3JlcGxhY2VtZW50X21hcC5nZXQocGFydCwgcGFydCkKCiAgICAgICAgaWYgbm90IHBhcnQgb3IgcGFydCA9PSAiLiI6CiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgIGlmIHBhcnRbOjFdIGluICIwMTIzNDU2Nzg5IjoKICAgICAgICAgICAgIyBwYWQgZm9yIG51bWVyaWMgY29tcGFyaXNvbgogICAgICAgICAgICB5aWVsZCBwYXJ0LnpmaWxsKDgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgeWllbGQgIioiICsgcGFydAoKICAgICMgZW5zdXJlIHRoYXQgYWxwaGEvYmV0YS9jYW5kaWRhdGUgYXJlIGJlZm9yZSBmaW5hbAogICAgeWllbGQgIipmaW5hbCIKCgpkZWYgX2xlZ2FjeV9jbXBrZXkodmVyc2lvbik6CiAgICAjIFdlIGhhcmRjb2RlIGFuIGVwb2NoIG9mIC0xIGhlcmUuIEEgUEVQIDQ0MCB2ZXJzaW9uIGNhbiBvbmx5IGhhdmUgYSBlcG9jaAogICAgIyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMC4gVGhpcyB3aWxsIGVmZmVjdGl2ZWx5IHB1dCB0aGUgTGVnYWN5VmVyc2lvbiwKICAgICMgd2hpY2ggdXNlcyB0aGUgZGVmYWN0byBzdGFuZGFyZCBvcmlnaW5hbGx5IGltcGxlbWVudGVkIGJ5IHNldHVwdG9vbHMsCiAgICAjIGFzIGJlZm9yZSBhbGwgUEVQIDQ0MCB2ZXJzaW9ucy4KICAgIGVwb2NoID0gLTEKCiAgICAjIFRoaXMgc2NoZW1lIGlzIHRha2VuIGZyb20gcGtnX3Jlc291cmNlcy5wYXJzZV92ZXJzaW9uIHNldHVwdG9vbHMgcHJpb3IgdG8KICAgICMgaXQncyBhZG9wdGlvbiBvZiB0aGUgcGFja2FnaW5nIGxpYnJhcnkuCiAgICBwYXJ0cyA9IFtdCiAgICBmb3IgcGFydCBpbiBfcGFyc2VfdmVyc2lvbl9wYXJ0cyh2ZXJzaW9uLmxvd2VyKCkpOgogICAgICAgIGlmIHBhcnQuc3RhcnRzd2l0aCgiKiIpOgogICAgICAgICAgICAjIHJlbW92ZSAiLSIgYmVmb3JlIGEgcHJlcmVsZWFzZSB0YWcKICAgICAgICAgICAgaWYgcGFydCA8ICIqZmluYWwiOgogICAgICAgICAgICAgICAgd2hpbGUgcGFydHMgYW5kIHBhcnRzWy0xXSA9PSAiKmZpbmFsLSI6CiAgICAgICAgICAgICAgICAgICAgcGFydHMucG9wKCkKCiAgICAgICAgICAgICMgcmVtb3ZlIHRyYWlsaW5nIHplcm9zIGZyb20gZWFjaCBzZXJpZXMgb2YgbnVtZXJpYyBwYXJ0cwogICAgICAgICAgICB3aGlsZSBwYXJ0cyBhbmQgcGFydHNbLTFdID09ICIwMDAwMDAwMCI6CiAgICAgICAgICAgICAgICBwYXJ0cy5wb3AoKQoKICAgICAgICBwYXJ0cy5hcHBlbmQocGFydCkKICAgIHBhcnRzID0gdHVwbGUocGFydHMpCgogICAgcmV0dXJuIGVwb2NoLCBwYXJ0cwoKCiMgRGVsaWJlcmF0ZWx5IG5vdCBhbmNob3JlZCB0byB0aGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgc3RyaW5nLCB0byBtYWtlIGl0CiMgZWFzaWVyIGZvciAzcmQgcGFydHkgY29kZSB0byByZXVzZQpWRVJTSU9OX1BBVFRFUk4gPSByIiIiCiAgICB2PwogICAgKD86CiAgICAgICAgKD86KD9QPGVwb2NoPlswLTldKykhKT8gICAgICAgICAgICAgICAgICAgICAgICAgICAjIGVwb2NoCiAgICAgICAgKD9QPHJlbGVhc2U+WzAtOV0rKD86XC5bMC05XSspKikgICAgICAgICAgICAgICAgICAjIHJlbGVhc2Ugc2VnbWVudAogICAgICAgICg/UDxwcmU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwcmUtcmVsZWFzZQogICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICg/UDxwcmVfbD4oYXxifGN8cmN8YWxwaGF8YmV0YXxwcmV8cHJldmlldykpCiAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgKD9QPHByZV9uPlswLTldKyk/CiAgICAgICAgKT8KICAgICAgICAoP1A8cG9zdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcG9zdCByZWxlYXNlCiAgICAgICAgICAgICg/Oi0oP1A8cG9zdF9uMT5bMC05XSspKQogICAgICAgICAgICB8CiAgICAgICAgICAgICg/OgogICAgICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAgICAgKD9QPHBvc3RfbD5wb3N0fHJldnxyKQogICAgICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAgICAgKD9QPHBvc3RfbjI+WzAtOV0rKT8KICAgICAgICAgICAgKQogICAgICAgICk/CiAgICAgICAgKD9QPGRldj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGRldiByZWxlYXNlCiAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgKD9QPGRldl9sPmRldikKICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAoP1A8ZGV2X24+WzAtOV0rKT8KICAgICAgICApPwogICAgKQogICAgKD86XCsoP1A8bG9jYWw+W2EtejAtOV0rKD86Wy1fXC5dW2EtejAtOV0rKSopKT8gICAgICAgIyBsb2NhbCB2ZXJzaW9uCiIiIgoKCmNsYXNzIFZlcnNpb24oX0Jhc2VWZXJzaW9uKToKCiAgICBfcmVnZXggPSByZS5jb21waWxlKHIiXlxzKiIgKyBWRVJTSU9OX1BBVFRFUk4gKyByIlxzKiQiLCByZS5WRVJCT1NFIHwgcmUuSUdOT1JFQ0FTRSkKCiAgICBkZWYgX19pbml0X18oc2VsZiwgdmVyc2lvbik6CiAgICAgICAgIyBWYWxpZGF0ZSB0aGUgdmVyc2lvbiBhbmQgcGFyc2UgaXQgaW50byBwaWVjZXMKICAgICAgICBtYXRjaCA9IHNlbGYuX3JlZ2V4LnNlYXJjaCh2ZXJzaW9uKQogICAgICAgIGlmIG5vdCBtYXRjaDoKICAgICAgICAgICAgcmFpc2UgSW52YWxpZFZlcnNpb24oIkludmFsaWQgdmVyc2lvbjogJ3swfSciLmZvcm1hdCh2ZXJzaW9uKSkKCiAgICAgICAgIyBTdG9yZSB0aGUgcGFyc2VkIG91dCBwaWVjZXMgb2YgdGhlIHZlcnNpb24KICAgICAgICBzZWxmLl92ZXJzaW9uID0gX1ZlcnNpb24oCiAgICAgICAgICAgIGVwb2NoPWludChtYXRjaC5ncm91cCgiZXBvY2giKSkgaWYgbWF0Y2guZ3JvdXAoImVwb2NoIikgZWxzZSAwLAogICAgICAgICAgICByZWxlYXNlPXR1cGxlKGludChpKSBmb3IgaSBpbiBtYXRjaC5ncm91cCgicmVsZWFzZSIpLnNwbGl0KCIuIikpLAogICAgICAgICAgICBwcmU9X3BhcnNlX2xldHRlcl92ZXJzaW9uKG1hdGNoLmdyb3VwKCJwcmVfbCIpLCBtYXRjaC5ncm91cCgicHJlX24iKSksCiAgICAgICAgICAgIHBvc3Q9X3BhcnNlX2xldHRlcl92ZXJzaW9uKAogICAgICAgICAgICAgICAgbWF0Y2guZ3JvdXAoInBvc3RfbCIpLCBtYXRjaC5ncm91cCgicG9zdF9uMSIpIG9yIG1hdGNoLmdyb3VwKCJwb3N0X24yIikKICAgICAgICAgICAgKSwKICAgICAgICAgICAgZGV2PV9wYXJzZV9sZXR0ZXJfdmVyc2lvbihtYXRjaC5ncm91cCgiZGV2X2wiKSwgbWF0Y2guZ3JvdXAoImRldl9uIikpLAogICAgICAgICAgICBsb2NhbD1fcGFyc2VfbG9jYWxfdmVyc2lvbihtYXRjaC5ncm91cCgibG9jYWwiKSksCiAgICAgICAgKQoKICAgICAgICAjIEdlbmVyYXRlIGEga2V5IHdoaWNoIHdpbGwgYmUgdXNlZCBmb3Igc29ydGluZwogICAgICAgIHNlbGYuX2tleSA9IF9jbXBrZXkoCiAgICAgICAgICAgIHNlbGYuX3ZlcnNpb24uZXBvY2gsCiAgICAgICAgICAgIHNlbGYuX3ZlcnNpb24ucmVsZWFzZSwKICAgICAgICAgICAgc2VsZi5fdmVyc2lvbi5wcmUsCiAgICAgICAgICAgIHNlbGYuX3ZlcnNpb24ucG9zdCwKICAgICAgICAgICAgc2VsZi5fdmVyc2lvbi5kZXYsCiAgICAgICAgICAgIHNlbGYuX3ZlcnNpb24ubG9jYWwsCiAgICAgICAgKQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIjxWZXJzaW9uKHswfSk+Ii5mb3JtYXQocmVwcihzdHIoc2VsZikpKQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHBhcnRzID0gW10KCiAgICAgICAgIyBFcG9jaAogICAgICAgIGlmIHNlbGYuZXBvY2ggIT0gMDoKICAgICAgICAgICAgcGFydHMuYXBwZW5kKCJ7MH0hIi5mb3JtYXQoc2VsZi5lcG9jaCkpCgogICAgICAgICMgUmVsZWFzZSBzZWdtZW50CiAgICAgICAgcGFydHMuYXBwZW5kKCIuIi5qb2luKHN0cih4KSBmb3IgeCBpbiBzZWxmLnJlbGVhc2UpKQoKICAgICAgICAjIFByZS1yZWxlYXNlCiAgICAgICAgaWYgc2VsZi5wcmUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgiIi5qb2luKHN0cih4KSBmb3IgeCBpbiBzZWxmLnByZSkpCgogICAgICAgICMgUG9zdC1yZWxlYXNlCiAgICAgICAgaWYgc2VsZi5wb3N0IGlzIG5vdCBOb25lOgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoIi5wb3N0ezB9Ii5mb3JtYXQoc2VsZi5wb3N0KSkKCiAgICAgICAgIyBEZXZlbG9wbWVudCByZWxlYXNlCiAgICAgICAgaWYgc2VsZi5kZXYgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgiLmRldnswfSIuZm9ybWF0KHNlbGYuZGV2KSkKCiAgICAgICAgIyBMb2NhbCB2ZXJzaW9uIHNlZ21lbnQKICAgICAgICBpZiBzZWxmLmxvY2FsIGlzIG5vdCBOb25lOgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoIit7MH0iLmZvcm1hdChzZWxmLmxvY2FsKSkKCiAgICAgICAgcmV0dXJuICIiLmpvaW4ocGFydHMpCgogICAgQHByb3BlcnR5CiAgICBkZWYgZXBvY2goc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3ZlcnNpb24uZXBvY2gKCiAgICBAcHJvcGVydHkKICAgIGRlZiByZWxlYXNlKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl92ZXJzaW9uLnJlbGVhc2UKCiAgICBAcHJvcGVydHkKICAgIGRlZiBwcmUoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3ZlcnNpb24ucHJlCgogICAgQHByb3BlcnR5CiAgICBkZWYgcG9zdChzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fdmVyc2lvbi5wb3N0WzFdIGlmIHNlbGYuX3ZlcnNpb24ucG9zdCBlbHNlIE5vbmUKCiAgICBAcHJvcGVydHkKICAgIGRlZiBkZXYoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3ZlcnNpb24uZGV2WzFdIGlmIHNlbGYuX3ZlcnNpb24uZGV2IGVsc2UgTm9uZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGxvY2FsKHNlbGYpOgogICAgICAgIGlmIHNlbGYuX3ZlcnNpb24ubG9jYWw6CiAgICAgICAgICAgIHJldHVybiAiLiIuam9pbihzdHIoeCkgZm9yIHggaW4gc2VsZi5fdmVyc2lvbi5sb2NhbCkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHB1YmxpYyhzZWxmKToKICAgICAgICByZXR1cm4gc3RyKHNlbGYpLnNwbGl0KCIrIiwgMSlbMF0KCiAgICBAcHJvcGVydHkKICAgIGRlZiBiYXNlX3ZlcnNpb24oc2VsZik6CiAgICAgICAgcGFydHMgPSBbXQoKICAgICAgICAjIEVwb2NoCiAgICAgICAgaWYgc2VsZi5lcG9jaCAhPSAwOgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoInswfSEiLmZvcm1hdChzZWxmLmVwb2NoKSkKCiAgICAgICAgIyBSZWxlYXNlIHNlZ21lbnQKICAgICAgICBwYXJ0cy5hcHBlbmQoIi4iLmpvaW4oc3RyKHgpIGZvciB4IGluIHNlbGYucmVsZWFzZSkpCgogICAgICAgIHJldHVybiAiIi5qb2luKHBhcnRzKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX3ByZXJlbGVhc2Uoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuZGV2IGlzIG5vdCBOb25lIG9yIHNlbGYucHJlIGlzIG5vdCBOb25lCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfcG9zdHJlbGVhc2Uoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYucG9zdCBpcyBub3QgTm9uZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX2RldnJlbGVhc2Uoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuZGV2IGlzIG5vdCBOb25lCgoKZGVmIF9wYXJzZV9sZXR0ZXJfdmVyc2lvbihsZXR0ZXIsIG51bWJlcik6CiAgICBpZiBsZXR0ZXI6CiAgICAgICAgIyBXZSBjb25zaWRlciB0aGVyZSB0byBiZSBhbiBpbXBsaWNpdCAwIGluIGEgcHJlLXJlbGVhc2UgaWYgdGhlcmUgaXMKICAgICAgICAjIG5vdCBhIG51bWVyYWwgYXNzb2NpYXRlZCB3aXRoIGl0LgogICAgICAgIGlmIG51bWJlciBpcyBOb25lOgogICAgICAgICAgICBudW1iZXIgPSAwCgogICAgICAgICMgV2Ugbm9ybWFsaXplIGFueSBsZXR0ZXJzIHRvIHRoZWlyIGxvd2VyIGNhc2UgZm9ybQogICAgICAgIGxldHRlciA9IGxldHRlci5sb3dlcigpCgogICAgICAgICMgV2UgY29uc2lkZXIgc29tZSB3b3JkcyB0byBiZSBhbHRlcm5hdGUgc3BlbGxpbmdzIG9mIG90aGVyIHdvcmRzIGFuZAogICAgICAgICMgaW4gdGhvc2UgY2FzZXMgd2Ugd2FudCB0byBub3JtYWxpemUgdGhlIHNwZWxsaW5ncyB0byBvdXIgcHJlZmVycmVkCiAgICAgICAgIyBzcGVsbGluZy4KICAgICAgICBpZiBsZXR0ZXIgPT0gImFscGhhIjoKICAgICAgICAgICAgbGV0dGVyID0gImEiCiAgICAgICAgZWxpZiBsZXR0ZXIgPT0gImJldGEiOgogICAgICAgICAgICBsZXR0ZXIgPSAiYiIKICAgICAgICBlbGlmIGxldHRlciBpbiBbImMiLCAicHJlIiwgInByZXZpZXciXToKICAgICAgICAgICAgbGV0dGVyID0gInJjIgogICAgICAgIGVsaWYgbGV0dGVyIGluIFsicmV2IiwgInIiXToKICAgICAgICAgICAgbGV0dGVyID0gInBvc3QiCgogICAgICAgIHJldHVybiBsZXR0ZXIsIGludChudW1iZXIpCiAgICBpZiBub3QgbGV0dGVyIGFuZCBudW1iZXI6CiAgICAgICAgIyBXZSBhc3N1bWUgaWYgd2UgYXJlIGdpdmVuIGEgbnVtYmVyLCBidXQgd2UgYXJlIG5vdCBnaXZlbiBhIGxldHRlcgogICAgICAgICMgdGhlbiB0aGlzIGlzIHVzaW5nIHRoZSBpbXBsaWNpdCBwb3N0IHJlbGVhc2Ugc3ludGF4IChlLmcuIDEuMC0xKQogICAgICAgIGxldHRlciA9ICJwb3N0IgoKICAgICAgICByZXR1cm4gbGV0dGVyLCBpbnQobnVtYmVyKQoKCl9sb2NhbF92ZXJzaW9uX3NlcGFyYXRvcnMgPSByZS5jb21waWxlKHIiW1wuXy1dIikKCgpkZWYgX3BhcnNlX2xvY2FsX3ZlcnNpb24obG9jYWwpOgogICAgIiIiCiAgICBUYWtlcyBhIHN0cmluZyBsaWtlIGFiYy4xLnR3ZWx2ZSBhbmQgdHVybnMgaXQgaW50byAoImFiYyIsIDEsICJ0d2VsdmUiKS4KICAgICIiIgogICAgaWYgbG9jYWwgaXMgbm90IE5vbmU6CiAgICAgICAgcmV0dXJuIHR1cGxlKAogICAgICAgICAgICBwYXJ0Lmxvd2VyKCkgaWYgbm90IHBhcnQuaXNkaWdpdCgpIGVsc2UgaW50KHBhcnQpCiAgICAgICAgICAgIGZvciBwYXJ0IGluIF9sb2NhbF92ZXJzaW9uX3NlcGFyYXRvcnMuc3BsaXQobG9jYWwpCiAgICAgICAgKQoKCmRlZiBfY21wa2V5KGVwb2NoLCByZWxlYXNlLCBwcmUsIHBvc3QsIGRldiwgbG9jYWwpOgogICAgIyBXaGVuIHdlIGNvbXBhcmUgYSByZWxlYXNlIHZlcnNpb24sIHdlIHdhbnQgdG8gY29tcGFyZSBpdCB3aXRoIGFsbCBvZiB0aGUKICAgICMgdHJhaWxpbmcgemVyb3MgcmVtb3ZlZC4gU28gd2UnbGwgdXNlIGEgcmV2ZXJzZSB0aGUgbGlzdCwgZHJvcCBhbGwgdGhlIG5vdwogICAgIyBsZWFkaW5nIHplcm9zIHVudGlsIHdlIGNvbWUgdG8gc29tZXRoaW5nIG5vbiB6ZXJvLCB0aGVuIHRha2UgdGhlIHJlc3QKICAgICMgcmUtcmV2ZXJzZSBpdCBiYWNrIGludG8gdGhlIGNvcnJlY3Qgb3JkZXIgYW5kIG1ha2UgaXQgYSB0dXBsZSBhbmQgdXNlCiAgICAjIHRoYXQgZm9yIG91ciBzb3J0aW5nIGtleS4KICAgIHJlbGVhc2UgPSB0dXBsZSgKICAgICAgICByZXZlcnNlZChsaXN0KGl0ZXJ0b29scy5kcm9wd2hpbGUobGFtYmRhIHg6IHggPT0gMCwgcmV2ZXJzZWQocmVsZWFzZSkpKSkKICAgICkKCiAgICAjIFdlIG5lZWQgdG8gInRyaWNrIiB0aGUgc29ydGluZyBhbGdvcml0aG0gdG8gcHV0IDEuMC5kZXYwIGJlZm9yZSAxLjBhMC4KICAgICMgV2UnbGwgZG8gdGhpcyBieSBhYnVzaW5nIHRoZSBwcmUgc2VnbWVudCwgYnV0IHdlIF9vbmx5XyB3YW50IHRvIGRvIHRoaXMKICAgICMgaWYgdGhlcmUgaXMgbm90IGEgcHJlIG9yIGEgcG9zdCBzZWdtZW50LiBJZiB3ZSBoYXZlIG9uZSBvZiB0aG9zZSB0aGVuCiAgICAjIHRoZSBub3JtYWwgc29ydGluZyBydWxlcyB3aWxsIGhhbmRsZSB0aGlzIGNhc2UgY29ycmVjdGx5LgogICAgaWYgcHJlIGlzIE5vbmUgYW5kIHBvc3QgaXMgTm9uZSBhbmQgZGV2IGlzIG5vdCBOb25lOgogICAgICAgIHByZSA9IC1JbmZpbml0eQogICAgIyBWZXJzaW9ucyB3aXRob3V0IGEgcHJlLXJlbGVhc2UgKGV4Y2VwdCBhcyBub3RlZCBhYm92ZSkgc2hvdWxkIHNvcnQgYWZ0ZXIKICAgICMgdGhvc2Ugd2l0aCBvbmUuCiAgICBlbGlmIHByZSBpcyBOb25lOgogICAgICAgIHByZSA9IEluZmluaXR5CgogICAgIyBWZXJzaW9ucyB3aXRob3V0IGEgcG9zdCBzZWdtZW50IHNob3VsZCBzb3J0IGJlZm9yZSB0aG9zZSB3aXRoIG9uZS4KICAgIGlmIHBvc3QgaXMgTm9uZToKICAgICAgICBwb3N0ID0gLUluZmluaXR5CgogICAgIyBWZXJzaW9ucyB3aXRob3V0IGEgZGV2ZWxvcG1lbnQgc2VnbWVudCBzaG91bGQgc29ydCBhZnRlciB0aG9zZSB3aXRoIG9uZS4KICAgIGlmIGRldiBpcyBOb25lOgogICAgICAgIGRldiA9IEluZmluaXR5CgogICAgaWYgbG9jYWwgaXMgTm9uZToKICAgICAgICAjIFZlcnNpb25zIHdpdGhvdXQgYSBsb2NhbCBzZWdtZW50IHNob3VsZCBzb3J0IGJlZm9yZSB0aG9zZSB3aXRoIG9uZS4KICAgICAgICBsb2NhbCA9IC1JbmZpbml0eQogICAgZWxzZToKICAgICAgICAjIFZlcnNpb25zIHdpdGggYSBsb2NhbCBzZWdtZW50IG5lZWQgdGhhdCBzZWdtZW50IHBhcnNlZCB0byBpbXBsZW1lbnQKICAgICAgICAjIHRoZSBzb3J0aW5nIHJ1bGVzIGluIFBFUDQ0MC4KICAgICAgICAjIC0gQWxwaGEgbnVtZXJpYyBzZWdtZW50cyBzb3J0IGJlZm9yZSBudW1lcmljIHNlZ21lbnRzCiAgICAgICAgIyAtIEFscGhhIG51bWVyaWMgc2VnbWVudHMgc29ydCBsZXhpY29ncmFwaGljYWxseQogICAgICAgICMgLSBOdW1lcmljIHNlZ21lbnRzIHNvcnQgbnVtZXJpY2FsbHkKICAgICAgICAjIC0gU2hvcnRlciB2ZXJzaW9ucyBzb3J0IGJlZm9yZSBsb25nZXIgdmVyc2lvbnMgd2hlbiB0aGUgcHJlZml4ZXMKICAgICAgICAjICAgbWF0Y2ggZXhhY3RseQogICAgICAgIGxvY2FsID0gdHVwbGUoKGksICIiKSBpZiBpc2luc3RhbmNlKGksIGludCkgZWxzZSAoLUluZmluaXR5LCBpKSBmb3IgaSBpbiBsb2NhbCkKCiAgICByZXR1cm4gZXBvY2gsIHJlbGVhc2UsIHByZSwgcG9zdCwgZGV2LCBsb2NhbApQSwMEFAAAAAAAAAAhAGYPhLF3igMAd4oDAEQAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9fdmVuZG9yL3B5cGFyc2luZy5weSMgbW9kdWxlIHB5cGFyc2luZy5weQ0KIw0KIyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxOCAgUGF1bCBULiBNY0d1aXJlDQojDQojIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZw0KIyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUNCiMgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZw0KIyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsDQojIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bw0KIyBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8NCiMgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KIw0KIyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQ0KIyBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4NCiMNCiMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsDQojIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRg0KIyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuDQojIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZDQojIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsDQojIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFDQojIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLg0KIw0KDQpfX2RvY19fID0gXA0KIiIiDQpweXBhcnNpbmcgbW9kdWxlIC0gQ2xhc3NlcyBhbmQgbWV0aG9kcyB0byBkZWZpbmUgYW5kIGV4ZWN1dGUgcGFyc2luZyBncmFtbWFycw0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KVGhlIHB5cGFyc2luZyBtb2R1bGUgaXMgYW4gYWx0ZXJuYXRpdmUgYXBwcm9hY2ggdG8gY3JlYXRpbmcgYW5kIGV4ZWN1dGluZyBzaW1wbGUgZ3JhbW1hcnMsDQp2cy4gdGhlIHRyYWRpdGlvbmFsIGxleC95YWNjIGFwcHJvYWNoLCBvciB0aGUgdXNlIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbnMuICBXaXRoIHB5cGFyc2luZywgeW91DQpkb24ndCBuZWVkIHRvIGxlYXJuIGEgbmV3IHN5bnRheCBmb3IgZGVmaW5pbmcgZ3JhbW1hcnMgb3IgbWF0Y2hpbmcgZXhwcmVzc2lvbnMgLSB0aGUgcGFyc2luZyBtb2R1bGUNCnByb3ZpZGVzIGEgbGlicmFyeSBvZiBjbGFzc2VzIHRoYXQgeW91IHVzZSB0byBjb25zdHJ1Y3QgdGhlIGdyYW1tYXIgZGlyZWN0bHkgaW4gUHl0aG9uLg0KDQpIZXJlIGlzIGEgcHJvZ3JhbSB0byBwYXJzZSAiSGVsbG8sIFdvcmxkISIgKG9yIGFueSBncmVldGluZyBvZiB0aGUgZm9ybSANCkN7IjxzYWx1dGF0aW9uPiwgPGFkZHJlc3NlZT4hIn0pLCBidWlsdCB1cCB1c2luZyBMe1dvcmR9LCBMe0xpdGVyYWx9LCBhbmQgTHtBbmR9IGVsZW1lbnRzIA0KKEx7JysnPFBhcnNlckVsZW1lbnQuX19hZGRfXz59IG9wZXJhdG9yIGdpdmVzIEx7QW5kfSBleHByZXNzaW9ucywgc3RyaW5ncyBhcmUgYXV0by1jb252ZXJ0ZWQgdG8NCkx7TGl0ZXJhbH0gZXhwcmVzc2lvbnMpOjoNCg0KICAgIGZyb20gcHlwYXJzaW5nIGltcG9ydCBXb3JkLCBhbHBoYXMNCg0KICAgICMgZGVmaW5lIGdyYW1tYXIgb2YgYSBncmVldGluZw0KICAgIGdyZWV0ID0gV29yZChhbHBoYXMpICsgIiwiICsgV29yZChhbHBoYXMpICsgIiEiDQoNCiAgICBoZWxsbyA9ICJIZWxsbywgV29ybGQhIg0KICAgIHByaW50IChoZWxsbywgIi0+IiwgZ3JlZXQucGFyc2VTdHJpbmcoaGVsbG8pKQ0KDQpUaGUgcHJvZ3JhbSBvdXRwdXRzIHRoZSBmb2xsb3dpbmc6Og0KDQogICAgSGVsbG8sIFdvcmxkISAtPiBbJ0hlbGxvJywgJywnLCAnV29ybGQnLCAnISddDQoNClRoZSBQeXRob24gcmVwcmVzZW50YXRpb24gb2YgdGhlIGdyYW1tYXIgaXMgcXVpdGUgcmVhZGFibGUsIG93aW5nIHRvIHRoZSBzZWxmLWV4cGxhbmF0b3J5DQpjbGFzcyBuYW1lcywgYW5kIHRoZSB1c2Ugb2YgJysnLCAnfCcgYW5kICdeJyBvcGVyYXRvcnMuDQoNClRoZSBMe1BhcnNlUmVzdWx0c30gb2JqZWN0IHJldHVybmVkIGZyb20gTHtQYXJzZXJFbGVtZW50LnBhcnNlU3RyaW5nPFBhcnNlckVsZW1lbnQucGFyc2VTdHJpbmc+fSBjYW4gYmUgYWNjZXNzZWQgYXMgYSBuZXN0ZWQgbGlzdCwgYSBkaWN0aW9uYXJ5LCBvciBhbg0Kb2JqZWN0IHdpdGggbmFtZWQgYXR0cmlidXRlcy4NCg0KVGhlIHB5cGFyc2luZyBtb2R1bGUgaGFuZGxlcyBzb21lIG9mIHRoZSBwcm9ibGVtcyB0aGF0IGFyZSB0eXBpY2FsbHkgdmV4aW5nIHdoZW4gd3JpdGluZyB0ZXh0IHBhcnNlcnM6DQogLSBleHRyYSBvciBtaXNzaW5nIHdoaXRlc3BhY2UgKHRoZSBhYm92ZSBwcm9ncmFtIHdpbGwgYWxzbyBoYW5kbGUgIkhlbGxvLFdvcmxkISIsICJIZWxsbyAgLCAgV29ybGQgICEiLCBldGMuKQ0KIC0gcXVvdGVkIHN0cmluZ3MNCiAtIGVtYmVkZGVkIGNvbW1lbnRzDQoNCg0KR2V0dGluZyBTdGFydGVkIC0NCi0tLS0tLS0tLS0tLS0tLS0tDQpWaXNpdCB0aGUgY2xhc3NlcyBMe1BhcnNlckVsZW1lbnR9IGFuZCBMe1BhcnNlUmVzdWx0c30gdG8gc2VlIHRoZSBiYXNlIGNsYXNzZXMgdGhhdCBtb3N0IG90aGVyIHB5cGFyc2luZw0KY2xhc3NlcyBpbmhlcml0IGZyb20uIFVzZSB0aGUgZG9jc3RyaW5ncyBmb3IgZXhhbXBsZXMgb2YgaG93IHRvOg0KIC0gY29uc3RydWN0IGxpdGVyYWwgbWF0Y2ggZXhwcmVzc2lvbnMgZnJvbSBMe0xpdGVyYWx9IGFuZCBMe0Nhc2VsZXNzTGl0ZXJhbH0gY2xhc3Nlcw0KIC0gY29uc3RydWN0IGNoYXJhY3RlciB3b3JkLWdyb3VwIGV4cHJlc3Npb25zIHVzaW5nIHRoZSBMe1dvcmR9IGNsYXNzDQogLSBzZWUgaG93IHRvIGNyZWF0ZSByZXBldGl0aXZlIGV4cHJlc3Npb25zIHVzaW5nIEx7WmVyb09yTW9yZX0gYW5kIEx7T25lT3JNb3JlfSBjbGFzc2VzDQogLSB1c2UgTHsnKyc8QW5kPn0sIEx7J3wnPE1hdGNoRmlyc3Q+fSwgTHsnXic8T3I+fSwgYW5kIEx7JyYnPEVhY2g+fSBvcGVyYXRvcnMgdG8gY29tYmluZSBzaW1wbGUgZXhwcmVzc2lvbnMgaW50byBtb3JlIGNvbXBsZXggb25lcw0KIC0gYXNzb2NpYXRlIG5hbWVzIHdpdGggeW91ciBwYXJzZWQgcmVzdWx0cyB1c2luZyBMe1BhcnNlckVsZW1lbnQuc2V0UmVzdWx0c05hbWV9DQogLSBmaW5kIHNvbWUgaGVscGZ1bCBleHByZXNzaW9uIHNob3J0LWN1dHMgbGlrZSBMe2RlbGltaXRlZExpc3R9IGFuZCBMe29uZU9mfQ0KIC0gZmluZCBtb3JlIHVzZWZ1bCBjb21tb24gZXhwcmVzc2lvbnMgaW4gdGhlIEx7cHlwYXJzaW5nX2NvbW1vbn0gbmFtZXNwYWNlIGNsYXNzDQoiIiINCg0KX192ZXJzaW9uX18gPSAiMi4yLjEiDQpfX3ZlcnNpb25UaW1lX18gPSAiMTggU2VwIDIwMTggMDA6NDkgVVRDIg0KX19hdXRob3JfXyA9ICJQYXVsIE1jR3VpcmUgPHB0bWNnQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4iDQoNCmltcG9ydCBzdHJpbmcNCmZyb20gd2Vha3JlZiBpbXBvcnQgcmVmIGFzIHdrcmVmDQppbXBvcnQgY29weQ0KaW1wb3J0IHN5cw0KaW1wb3J0IHdhcm5pbmdzDQppbXBvcnQgcmUNCmltcG9ydCBzcmVfY29uc3RhbnRzDQppbXBvcnQgY29sbGVjdGlvbnMNCmltcG9ydCBwcHJpbnQNCmltcG9ydCB0cmFjZWJhY2sNCmltcG9ydCB0eXBlcw0KZnJvbSBkYXRldGltZSBpbXBvcnQgZGF0ZXRpbWUNCg0KdHJ5Og0KICAgIGZyb20gX3RocmVhZCBpbXBvcnQgUkxvY2sNCmV4Y2VwdCBJbXBvcnRFcnJvcjoNCiAgICBmcm9tIHRocmVhZGluZyBpbXBvcnQgUkxvY2sNCg0KdHJ5Og0KICAgICMgUHl0aG9uIDMNCiAgICBmcm9tIGNvbGxlY3Rpb25zLmFiYyBpbXBvcnQgSXRlcmFibGUNCiAgICBmcm9tIGNvbGxlY3Rpb25zLmFiYyBpbXBvcnQgTXV0YWJsZU1hcHBpbmcNCmV4Y2VwdCBJbXBvcnRFcnJvcjoNCiAgICAjIFB5dGhvbiAyLjcNCiAgICBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBJdGVyYWJsZQ0KICAgIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IE11dGFibGVNYXBwaW5nDQoNCnRyeToNCiAgICBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBPcmRlcmVkRGljdCBhcyBfT3JkZXJlZERpY3QNCmV4Y2VwdCBJbXBvcnRFcnJvcjoNCiAgICB0cnk6DQogICAgICAgIGZyb20gb3JkZXJlZGRpY3QgaW1wb3J0IE9yZGVyZWREaWN0IGFzIF9PcmRlcmVkRGljdA0KICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoNCiAgICAgICAgX09yZGVyZWREaWN0ID0gTm9uZQ0KDQojfiBzeXMuc3RkZXJyLndyaXRlKCAidGVzdGluZyBweXBhcnNpbmcgbW9kdWxlLCB2ZXJzaW9uICVzLCAlc1xuIiAlIChfX3ZlcnNpb25fXyxfX3ZlcnNpb25UaW1lX18gKSApDQoNCl9fYWxsX18gPSBbDQonQW5kJywgJ0Nhc2VsZXNzS2V5d29yZCcsICdDYXNlbGVzc0xpdGVyYWwnLCAnQ2hhcnNOb3RJbicsICdDb21iaW5lJywgJ0RpY3QnLCAnRWFjaCcsICdFbXB0eScsDQonRm9sbG93ZWRCeScsICdGb3J3YXJkJywgJ0dvVG9Db2x1bW4nLCAnR3JvdXAnLCAnS2V5d29yZCcsICdMaW5lRW5kJywgJ0xpbmVTdGFydCcsICdMaXRlcmFsJywNCidNYXRjaEZpcnN0JywgJ05vTWF0Y2gnLCAnTm90QW55JywgJ09uZU9yTW9yZScsICdPbmx5T25jZScsICdPcHRpb25hbCcsICdPcicsDQonUGFyc2VCYXNlRXhjZXB0aW9uJywgJ1BhcnNlRWxlbWVudEVuaGFuY2UnLCAnUGFyc2VFeGNlcHRpb24nLCAnUGFyc2VFeHByZXNzaW9uJywgJ1BhcnNlRmF0YWxFeGNlcHRpb24nLA0KJ1BhcnNlUmVzdWx0cycsICdQYXJzZVN5bnRheEV4Y2VwdGlvbicsICdQYXJzZXJFbGVtZW50JywgJ1F1b3RlZFN0cmluZycsICdSZWN1cnNpdmVHcmFtbWFyRXhjZXB0aW9uJywNCidSZWdleCcsICdTa2lwVG8nLCAnU3RyaW5nRW5kJywgJ1N0cmluZ1N0YXJ0JywgJ1N1cHByZXNzJywgJ1Rva2VuJywgJ1Rva2VuQ29udmVydGVyJywgDQonV2hpdGUnLCAnV29yZCcsICdXb3JkRW5kJywgJ1dvcmRTdGFydCcsICdaZXJvT3JNb3JlJywNCidhbHBoYW51bXMnLCAnYWxwaGFzJywgJ2FscGhhczhiaXQnLCAnYW55Q2xvc2VUYWcnLCAnYW55T3BlblRhZycsICdjU3R5bGVDb21tZW50JywgJ2NvbCcsDQonY29tbWFTZXBhcmF0ZWRMaXN0JywgJ2NvbW1vbkhUTUxFbnRpdHknLCAnY291bnRlZEFycmF5JywgJ2NwcFN0eWxlQ29tbWVudCcsICdkYmxRdW90ZWRTdHJpbmcnLA0KJ2RibFNsYXNoQ29tbWVudCcsICdkZWxpbWl0ZWRMaXN0JywgJ2RpY3RPZicsICdkb3duY2FzZVRva2VucycsICdlbXB0eScsICdoZXhudW1zJywNCidodG1sQ29tbWVudCcsICdqYXZhU3R5bGVDb21tZW50JywgJ2xpbmUnLCAnbGluZUVuZCcsICdsaW5lU3RhcnQnLCAnbGluZW5vJywNCidtYWtlSFRNTFRhZ3MnLCAnbWFrZVhNTFRhZ3MnLCAnbWF0Y2hPbmx5QXRDb2wnLCAnbWF0Y2hQcmV2aW91c0V4cHInLCAnbWF0Y2hQcmV2aW91c0xpdGVyYWwnLA0KJ25lc3RlZEV4cHInLCAnbnVsbERlYnVnQWN0aW9uJywgJ251bXMnLCAnb25lT2YnLCAnb3BBc3NvYycsICdvcGVyYXRvclByZWNlZGVuY2UnLCAncHJpbnRhYmxlcycsDQoncHVuYzhiaXQnLCAncHl0aG9uU3R5bGVDb21tZW50JywgJ3F1b3RlZFN0cmluZycsICdyZW1vdmVRdW90ZXMnLCAncmVwbGFjZUhUTUxFbnRpdHknLCANCidyZXBsYWNlV2l0aCcsICdyZXN0T2ZMaW5lJywgJ3NnbFF1b3RlZFN0cmluZycsICdzcmFuZ2UnLCAnc3RyaW5nRW5kJywNCidzdHJpbmdTdGFydCcsICd0cmFjZVBhcnNlQWN0aW9uJywgJ3VuaWNvZGVTdHJpbmcnLCAndXBjYXNlVG9rZW5zJywgJ3dpdGhBdHRyaWJ1dGUnLA0KJ2luZGVudGVkQmxvY2snLCAnb3JpZ2luYWxUZXh0Rm9yJywgJ3VuZ3JvdXAnLCAnaW5maXhOb3RhdGlvbicsJ2xvY2F0ZWRFeHByJywgJ3dpdGhDbGFzcycsDQonQ2xvc2VNYXRjaCcsICd0b2tlbk1hcCcsICdweXBhcnNpbmdfY29tbW9uJywNCl0NCg0Kc3lzdGVtX3ZlcnNpb24gPSB0dXBsZShzeXMudmVyc2lvbl9pbmZvKVs6M10NClBZXzMgPSBzeXN0ZW1fdmVyc2lvblswXSA9PSAzDQppZiBQWV8zOg0KICAgIF9NQVhfSU5UID0gc3lzLm1heHNpemUNCiAgICBiYXNlc3RyaW5nID0gc3RyDQogICAgdW5pY2hyID0gY2hyDQogICAgX3VzdHIgPSBzdHINCg0KICAgICMgYnVpbGQgbGlzdCBvZiBzaW5nbGUgYXJnIGJ1aWx0aW5zLCB0aGF0IGNhbiBiZSB1c2VkIGFzIHBhcnNlIGFjdGlvbnMNCiAgICBzaW5nbGVBcmdCdWlsdGlucyA9IFtzdW0sIGxlbiwgc29ydGVkLCByZXZlcnNlZCwgbGlzdCwgdHVwbGUsIHNldCwgYW55LCBhbGwsIG1pbiwgbWF4XQ0KDQplbHNlOg0KICAgIF9NQVhfSU5UID0gc3lzLm1heGludA0KICAgIHJhbmdlID0geHJhbmdlDQoNCiAgICBkZWYgX3VzdHIob2JqKToNCiAgICAgICAgIiIiRHJvcC1pbiByZXBsYWNlbWVudCBmb3Igc3RyKG9iaikgdGhhdCB0cmllcyB0byBiZSBVbmljb2RlIGZyaWVuZGx5LiBJdCBmaXJzdCB0cmllcw0KICAgICAgICAgICBzdHIob2JqKS4gSWYgdGhhdCBmYWlscyB3aXRoIGEgVW5pY29kZUVuY29kZUVycm9yLCB0aGVuIGl0IHRyaWVzIHVuaWNvZGUob2JqKS4gSXQNCiAgICAgICAgICAgdGhlbiA8IHJldHVybnMgdGhlIHVuaWNvZGUgb2JqZWN0IHwgZW5jb2RlcyBpdCB3aXRoIHRoZSBkZWZhdWx0IGVuY29kaW5nIHwgLi4uID4uDQogICAgICAgICIiIg0KICAgICAgICBpZiBpc2luc3RhbmNlKG9iaix1bmljb2RlKToNCiAgICAgICAgICAgIHJldHVybiBvYmoNCg0KICAgICAgICB0cnk6DQogICAgICAgICAgICAjIElmIHRoaXMgd29ya3MsIHRoZW4gX3VzdHIob2JqKSBoYXMgdGhlIHNhbWUgYmVoYXZpb3VyIGFzIHN0cihvYmopLCBzbw0KICAgICAgICAgICAgIyBpdCB3b24ndCBicmVhayBhbnkgZXhpc3RpbmcgY29kZS4NCiAgICAgICAgICAgIHJldHVybiBzdHIob2JqKQ0KDQogICAgICAgIGV4Y2VwdCBVbmljb2RlRW5jb2RlRXJyb3I6DQogICAgICAgICAgICAjIEVsc2UgZW5jb2RlIGl0DQogICAgICAgICAgICByZXQgPSB1bmljb2RlKG9iaikuZW5jb2RlKHN5cy5nZXRkZWZhdWx0ZW5jb2RpbmcoKSwgJ3htbGNoYXJyZWZyZXBsYWNlJykNCiAgICAgICAgICAgIHhtbGNoYXJyZWYgPSBSZWdleChyJyYjXGQrOycpDQogICAgICAgICAgICB4bWxjaGFycmVmLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0OiAnXFx1JyArIGhleChpbnQodFswXVsyOi0xXSkpWzI6XSkNCiAgICAgICAgICAgIHJldHVybiB4bWxjaGFycmVmLnRyYW5zZm9ybVN0cmluZyhyZXQpDQoNCiAgICAjIGJ1aWxkIGxpc3Qgb2Ygc2luZ2xlIGFyZyBidWlsdGlucywgdG9sZXJhbnQgb2YgUHl0aG9uIHZlcnNpb24sIHRoYXQgY2FuIGJlIHVzZWQgYXMgcGFyc2UgYWN0aW9ucw0KICAgIHNpbmdsZUFyZ0J1aWx0aW5zID0gW10NCiAgICBpbXBvcnQgX19idWlsdGluX18NCiAgICBmb3IgZm5hbWUgaW4gInN1bSBsZW4gc29ydGVkIHJldmVyc2VkIGxpc3QgdHVwbGUgc2V0IGFueSBhbGwgbWluIG1heCIuc3BsaXQoKToNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgc2luZ2xlQXJnQnVpbHRpbnMuYXBwZW5kKGdldGF0dHIoX19idWlsdGluX18sZm5hbWUpKQ0KICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6DQogICAgICAgICAgICBjb250aW51ZQ0KICAgICAgICAgICAgDQpfZ2VuZXJhdG9yVHlwZSA9IHR5cGUoKHkgZm9yIHkgaW4gcmFuZ2UoMSkpKQ0KIA0KZGVmIF94bWxfZXNjYXBlKGRhdGEpOg0KICAgICIiIkVzY2FwZSAmLCA8LCA+LCAiLCAnLCBldGMuIGluIGEgc3RyaW5nIG9mIGRhdGEuIiIiDQoNCiAgICAjIGFtcGVyc2FuZCBtdXN0IGJlIHJlcGxhY2VkIGZpcnN0DQogICAgZnJvbV9zeW1ib2xzID0gJyY+PCJcJycNCiAgICB0b19zeW1ib2xzID0gKCcmJytzKyc7JyBmb3IgcyBpbiAiYW1wIGd0IGx0IHF1b3QgYXBvcyIuc3BsaXQoKSkNCiAgICBmb3IgZnJvbV8sdG9fIGluIHppcChmcm9tX3N5bWJvbHMsIHRvX3N5bWJvbHMpOg0KICAgICAgICBkYXRhID0gZGF0YS5yZXBsYWNlKGZyb21fLCB0b18pDQogICAgcmV0dXJuIGRhdGENCg0KY2xhc3MgX0NvbnN0YW50cyhvYmplY3QpOg0KICAgIHBhc3MNCg0KYWxwaGFzICAgICA9IHN0cmluZy5hc2NpaV91cHBlcmNhc2UgKyBzdHJpbmcuYXNjaWlfbG93ZXJjYXNlDQpudW1zICAgICAgID0gIjAxMjM0NTY3ODkiDQpoZXhudW1zICAgID0gbnVtcyArICJBQkNERUZhYmNkZWYiDQphbHBoYW51bXMgID0gYWxwaGFzICsgbnVtcw0KX2JzbGFzaCAgICA9IGNocig5MikNCnByaW50YWJsZXMgPSAiIi5qb2luKGMgZm9yIGMgaW4gc3RyaW5nLnByaW50YWJsZSBpZiBjIG5vdCBpbiBzdHJpbmcud2hpdGVzcGFjZSkNCg0KY2xhc3MgUGFyc2VCYXNlRXhjZXB0aW9uKEV4Y2VwdGlvbik6DQogICAgIiIiYmFzZSBleGNlcHRpb24gY2xhc3MgZm9yIGFsbCBwYXJzaW5nIHJ1bnRpbWUgZXhjZXB0aW9ucyIiIg0KICAgICMgUGVyZm9ybWFuY2UgdHVuaW5nOiB3ZSBjb25zdHJ1Y3QgYSAqbG90KiBvZiB0aGVzZSwgc28ga2VlcCB0aGlzDQogICAgIyBjb25zdHJ1Y3RvciBhcyBzbWFsbCBhbmQgZmFzdCBhcyBwb3NzaWJsZQ0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgcHN0ciwgbG9jPTAsIG1zZz1Ob25lLCBlbGVtPU5vbmUgKToNCiAgICAgICAgc2VsZi5sb2MgPSBsb2MNCiAgICAgICAgaWYgbXNnIGlzIE5vbmU6DQogICAgICAgICAgICBzZWxmLm1zZyA9IHBzdHINCiAgICAgICAgICAgIHNlbGYucHN0ciA9ICIiDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzZWxmLm1zZyA9IG1zZw0KICAgICAgICAgICAgc2VsZi5wc3RyID0gcHN0cg0KICAgICAgICBzZWxmLnBhcnNlckVsZW1lbnQgPSBlbGVtDQogICAgICAgIHNlbGYuYXJncyA9IChwc3RyLCBsb2MsIG1zZykNCg0KICAgIEBjbGFzc21ldGhvZA0KICAgIGRlZiBfZnJvbV9leGNlcHRpb24oY2xzLCBwZSk6DQogICAgICAgICIiIg0KICAgICAgICBpbnRlcm5hbCBmYWN0b3J5IG1ldGhvZCB0byBzaW1wbGlmeSBjcmVhdGluZyBvbmUgdHlwZSBvZiBQYXJzZUV4Y2VwdGlvbiANCiAgICAgICAgZnJvbSBhbm90aGVyIC0gYXZvaWRzIGhhdmluZyBfX2luaXRfXyBzaWduYXR1cmUgY29uZmxpY3RzIGFtb25nIHN1YmNsYXNzZXMNCiAgICAgICAgIiIiDQogICAgICAgIHJldHVybiBjbHMocGUucHN0ciwgcGUubG9jLCBwZS5tc2csIHBlLnBhcnNlckVsZW1lbnQpDQoNCiAgICBkZWYgX19nZXRhdHRyX18oIHNlbGYsIGFuYW1lICk6DQogICAgICAgICIiInN1cHBvcnRlZCBhdHRyaWJ1dGVzIGJ5IG5hbWUgYXJlOg0KICAgICAgICAgICAgLSBsaW5lbm8gLSByZXR1cm5zIHRoZSBsaW5lIG51bWJlciBvZiB0aGUgZXhjZXB0aW9uIHRleHQNCiAgICAgICAgICAgIC0gY29sIC0gcmV0dXJucyB0aGUgY29sdW1uIG51bWJlciBvZiB0aGUgZXhjZXB0aW9uIHRleHQNCiAgICAgICAgICAgIC0gbGluZSAtIHJldHVybnMgdGhlIGxpbmUgY29udGFpbmluZyB0aGUgZXhjZXB0aW9uIHRleHQNCiAgICAgICAgIiIiDQogICAgICAgIGlmKCBhbmFtZSA9PSAibGluZW5vIiApOg0KICAgICAgICAgICAgcmV0dXJuIGxpbmVubyggc2VsZi5sb2MsIHNlbGYucHN0ciApDQogICAgICAgIGVsaWYoIGFuYW1lIGluICgiY29sIiwgImNvbHVtbiIpICk6DQogICAgICAgICAgICByZXR1cm4gY29sKCBzZWxmLmxvYywgc2VsZi5wc3RyICkNCiAgICAgICAgZWxpZiggYW5hbWUgPT0gImxpbmUiICk6DQogICAgICAgICAgICByZXR1cm4gbGluZSggc2VsZi5sb2MsIHNlbGYucHN0ciApDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcihhbmFtZSkNCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIHJldHVybiAiJXMgKGF0IGNoYXIgJWQpLCAobGluZTolZCwgY29sOiVkKSIgJSBcDQogICAgICAgICAgICAgICAgKCBzZWxmLm1zZywgc2VsZi5sb2MsIHNlbGYubGluZW5vLCBzZWxmLmNvbHVtbiApDQogICAgZGVmIF9fcmVwcl9fKCBzZWxmICk6DQogICAgICAgIHJldHVybiBfdXN0cihzZWxmKQ0KICAgIGRlZiBtYXJrSW5wdXRsaW5lKCBzZWxmLCBtYXJrZXJTdHJpbmcgPSAiPiE8IiApOg0KICAgICAgICAiIiJFeHRyYWN0cyB0aGUgZXhjZXB0aW9uIGxpbmUgZnJvbSB0aGUgaW5wdXQgc3RyaW5nLCBhbmQgbWFya3MNCiAgICAgICAgICAgdGhlIGxvY2F0aW9uIG9mIHRoZSBleGNlcHRpb24gd2l0aCBhIHNwZWNpYWwgc3ltYm9sLg0KICAgICAgICAiIiINCiAgICAgICAgbGluZV9zdHIgPSBzZWxmLmxpbmUNCiAgICAgICAgbGluZV9jb2x1bW4gPSBzZWxmLmNvbHVtbiAtIDENCiAgICAgICAgaWYgbWFya2VyU3RyaW5nOg0KICAgICAgICAgICAgbGluZV9zdHIgPSAiIi5qb2luKChsaW5lX3N0cls6bGluZV9jb2x1bW5dLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXJTdHJpbmcsIGxpbmVfc3RyW2xpbmVfY29sdW1uOl0pKQ0KICAgICAgICByZXR1cm4gbGluZV9zdHIuc3RyaXAoKQ0KICAgIGRlZiBfX2Rpcl9fKHNlbGYpOg0KICAgICAgICByZXR1cm4gImxpbmVubyBjb2wgbGluZSIuc3BsaXQoKSArIGRpcih0eXBlKHNlbGYpKQ0KDQpjbGFzcyBQYXJzZUV4Y2VwdGlvbihQYXJzZUJhc2VFeGNlcHRpb24pOg0KICAgICIiIg0KICAgIEV4Y2VwdGlvbiB0aHJvd24gd2hlbiBwYXJzZSBleHByZXNzaW9ucyBkb24ndCBtYXRjaCBjbGFzczsNCiAgICBzdXBwb3J0ZWQgYXR0cmlidXRlcyBieSBuYW1lIGFyZToNCiAgICAgLSBsaW5lbm8gLSByZXR1cm5zIHRoZSBsaW5lIG51bWJlciBvZiB0aGUgZXhjZXB0aW9uIHRleHQNCiAgICAgLSBjb2wgLSByZXR1cm5zIHRoZSBjb2x1bW4gbnVtYmVyIG9mIHRoZSBleGNlcHRpb24gdGV4dA0KICAgICAtIGxpbmUgLSByZXR1cm5zIHRoZSBsaW5lIGNvbnRhaW5pbmcgdGhlIGV4Y2VwdGlvbiB0ZXh0DQogICAgICAgIA0KICAgIEV4YW1wbGU6Og0KICAgICAgICB0cnk6DQogICAgICAgICAgICBXb3JkKG51bXMpLnNldE5hbWUoImludGVnZXIiKS5wYXJzZVN0cmluZygiQUJDIikNCiAgICAgICAgZXhjZXB0IFBhcnNlRXhjZXB0aW9uIGFzIHBlOg0KICAgICAgICAgICAgcHJpbnQocGUpDQogICAgICAgICAgICBwcmludCgiY29sdW1uOiB7fSIuZm9ybWF0KHBlLmNvbCkpDQogICAgICAgICAgICANCiAgICBwcmludHM6Og0KICAgICAgIEV4cGVjdGVkIGludGVnZXIgKGF0IGNoYXIgMCksIChsaW5lOjEsIGNvbDoxKQ0KICAgICAgICBjb2x1bW46IDENCiAgICAiIiINCiAgICBwYXNzDQoNCmNsYXNzIFBhcnNlRmF0YWxFeGNlcHRpb24oUGFyc2VCYXNlRXhjZXB0aW9uKToNCiAgICAiIiJ1c2VyLXRocm93YWJsZSBleGNlcHRpb24gdGhyb3duIHdoZW4gaW5jb25zaXN0ZW50IHBhcnNlIGNvbnRlbnQNCiAgICAgICBpcyBmb3VuZDsgc3RvcHMgYWxsIHBhcnNpbmcgaW1tZWRpYXRlbHkiIiINCiAgICBwYXNzDQoNCmNsYXNzIFBhcnNlU3ludGF4RXhjZXB0aW9uKFBhcnNlRmF0YWxFeGNlcHRpb24pOg0KICAgICIiImp1c3QgbGlrZSBMe1BhcnNlRmF0YWxFeGNlcHRpb259LCBidXQgdGhyb3duIGludGVybmFsbHkgd2hlbiBhbg0KICAgICAgIEx7RXJyb3JTdG9wPEFuZC5fRXJyb3JTdG9wPn0gKCctJyBvcGVyYXRvcikgaW5kaWNhdGVzIHRoYXQgcGFyc2luZyBpcyB0byBzdG9wIA0KICAgICAgIGltbWVkaWF0ZWx5IGJlY2F1c2UgYW4gdW5iYWNrdHJhY2thYmxlIHN5bnRheCBlcnJvciBoYXMgYmVlbiBmb3VuZCIiIg0KICAgIHBhc3MNCg0KI34gY2xhc3MgUmVwYXJzZUV4Y2VwdGlvbihQYXJzZUJhc2VFeGNlcHRpb24pOg0KICAgICN+ICIiIkV4cGVyaW1lbnRhbCBjbGFzcyAtIHBhcnNlIGFjdGlvbnMgY2FuIHJhaXNlIHRoaXMgZXhjZXB0aW9uIHRvIGNhdXNlDQogICAgICAgI34gcHlwYXJzaW5nIHRvIHJlcGFyc2UgdGhlIGlucHV0IHN0cmluZzoNCiAgICAgICAgI34gLSB3aXRoIGEgbW9kaWZpZWQgaW5wdXQgc3RyaW5nLCBhbmQvb3INCiAgICAgICAgI34gLSB3aXRoIGEgbW9kaWZpZWQgc3RhcnQgbG9jYXRpb24NCiAgICAgICAjfiBTZXQgdGhlIHZhbHVlcyBvZiB0aGUgUmVwYXJzZUV4Y2VwdGlvbiBpbiB0aGUgY29uc3RydWN0b3IsIGFuZCByYWlzZSB0aGUNCiAgICAgICAjfiBleGNlcHRpb24gaW4gYSBwYXJzZSBhY3Rpb24gdG8gY2F1c2UgcHlwYXJzaW5nIHRvIHVzZSB0aGUgbmV3IHN0cmluZy9sb2NhdGlvbi4NCiAgICAgICAjfiBTZXR0aW5nIHRoZSB2YWx1ZXMgYXMgTm9uZSBjYXVzZXMgbm8gY2hhbmdlIHRvIGJlIG1hZGUuDQogICAgICAgI34gIiIiDQogICAgI34gZGVmIF9faW5pdF8oIHNlbGYsIG5ld3N0cmluZywgcmVzdGFydExvYyApOg0KICAgICAgICAjfiBzZWxmLm5ld1BhcnNlVGV4dCA9IG5ld3N0cmluZw0KICAgICAgICAjfiBzZWxmLnJlcGFyc2VMb2MgPSByZXN0YXJ0TG9jDQoNCmNsYXNzIFJlY3Vyc2l2ZUdyYW1tYXJFeGNlcHRpb24oRXhjZXB0aW9uKToNCiAgICAiIiJleGNlcHRpb24gdGhyb3duIGJ5IEx7UGFyc2VyRWxlbWVudC52YWxpZGF0ZX0gaWYgdGhlIGdyYW1tYXIgY291bGQgYmUgaW1wcm9wZXJseSByZWN1cnNpdmUiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIHBhcnNlRWxlbWVudExpc3QgKToNCiAgICAgICAgc2VsZi5wYXJzZUVsZW1lbnRUcmFjZSA9IHBhcnNlRWxlbWVudExpc3QNCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIHJldHVybiAiUmVjdXJzaXZlR3JhbW1hckV4Y2VwdGlvbjogJXMiICUgc2VsZi5wYXJzZUVsZW1lbnRUcmFjZQ0KDQpjbGFzcyBfUGFyc2VSZXN1bHRzV2l0aE9mZnNldChvYmplY3QpOg0KICAgIGRlZiBfX2luaXRfXyhzZWxmLHAxLHAyKToNCiAgICAgICAgc2VsZi50dXAgPSAocDEscDIpDQogICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsaSk6DQogICAgICAgIHJldHVybiBzZWxmLnR1cFtpXQ0KICAgIGRlZiBfX3JlcHJfXyhzZWxmKToNCiAgICAgICAgcmV0dXJuIHJlcHIoc2VsZi50dXBbMF0pDQogICAgZGVmIHNldE9mZnNldChzZWxmLGkpOg0KICAgICAgICBzZWxmLnR1cCA9IChzZWxmLnR1cFswXSxpKQ0KDQpjbGFzcyBQYXJzZVJlc3VsdHMob2JqZWN0KToNCiAgICAiIiINCiAgICBTdHJ1Y3R1cmVkIHBhcnNlIHJlc3VsdHMsIHRvIHByb3ZpZGUgbXVsdGlwbGUgbWVhbnMgb2YgYWNjZXNzIHRvIHRoZSBwYXJzZWQgZGF0YToNCiAgICAgICAtIGFzIGEgbGlzdCAoQ3tsZW4ocmVzdWx0cyl9KQ0KICAgICAgIC0gYnkgbGlzdCBpbmRleCAoQ3tyZXN1bHRzWzBdLCByZXN1bHRzWzFdfSwgZXRjLikNCiAgICAgICAtIGJ5IGF0dHJpYnV0ZSAoQ3tyZXN1bHRzLjxyZXN1bHRzTmFtZT59IC0gc2VlIEx7UGFyc2VyRWxlbWVudC5zZXRSZXN1bHRzTmFtZX0pDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykNCiAgICAgICAgZGF0ZV9zdHIgPSAoaW50ZWdlci5zZXRSZXN1bHRzTmFtZSgieWVhciIpICsgJy8nIA0KICAgICAgICAgICAgICAgICAgICAgICAgKyBpbnRlZ2VyLnNldFJlc3VsdHNOYW1lKCJtb250aCIpICsgJy8nIA0KICAgICAgICAgICAgICAgICAgICAgICAgKyBpbnRlZ2VyLnNldFJlc3VsdHNOYW1lKCJkYXkiKSkNCiAgICAgICAgIyBlcXVpdmFsZW50IGZvcm06DQogICAgICAgICMgZGF0ZV9zdHIgPSBpbnRlZ2VyKCJ5ZWFyIikgKyAnLycgKyBpbnRlZ2VyKCJtb250aCIpICsgJy8nICsgaW50ZWdlcigiZGF5IikNCg0KICAgICAgICAjIHBhcnNlU3RyaW5nIHJldHVybnMgYSBQYXJzZVJlc3VsdHMgb2JqZWN0DQogICAgICAgIHJlc3VsdCA9IGRhdGVfc3RyLnBhcnNlU3RyaW5nKCIxOTk5LzEyLzMxIikNCg0KICAgICAgICBkZWYgdGVzdChzLCBmbj1yZXByKToNCiAgICAgICAgICAgIHByaW50KCIlcyAtPiAlcyIgJSAocywgZm4oZXZhbChzKSkpKQ0KICAgICAgICB0ZXN0KCJsaXN0KHJlc3VsdCkiKQ0KICAgICAgICB0ZXN0KCJyZXN1bHRbMF0iKQ0KICAgICAgICB0ZXN0KCJyZXN1bHRbJ21vbnRoJ10iKQ0KICAgICAgICB0ZXN0KCJyZXN1bHQuZGF5IikNCiAgICAgICAgdGVzdCgiJ21vbnRoJyBpbiByZXN1bHQiKQ0KICAgICAgICB0ZXN0KCInbWludXRlcycgaW4gcmVzdWx0IikNCiAgICAgICAgdGVzdCgicmVzdWx0LmR1bXAoKSIsIHN0cikNCiAgICBwcmludHM6Og0KICAgICAgICBsaXN0KHJlc3VsdCkgLT4gWycxOTk5JywgJy8nLCAnMTInLCAnLycsICczMSddDQogICAgICAgIHJlc3VsdFswXSAtPiAnMTk5OScNCiAgICAgICAgcmVzdWx0Wydtb250aCddIC0+ICcxMicNCiAgICAgICAgcmVzdWx0LmRheSAtPiAnMzEnDQogICAgICAgICdtb250aCcgaW4gcmVzdWx0IC0+IFRydWUNCiAgICAgICAgJ21pbnV0ZXMnIGluIHJlc3VsdCAtPiBGYWxzZQ0KICAgICAgICByZXN1bHQuZHVtcCgpIC0+IFsnMTk5OScsICcvJywgJzEyJywgJy8nLCAnMzEnXQ0KICAgICAgICAtIGRheTogMzENCiAgICAgICAgLSBtb250aDogMTINCiAgICAgICAgLSB5ZWFyOiAxOTk5DQogICAgIiIiDQogICAgZGVmIF9fbmV3X18oY2xzLCB0b2tsaXN0PU5vbmUsIG5hbWU9Tm9uZSwgYXNMaXN0PVRydWUsIG1vZGFsPVRydWUgKToNCiAgICAgICAgaWYgaXNpbnN0YW5jZSh0b2tsaXN0LCBjbHMpOg0KICAgICAgICAgICAgcmV0dXJuIHRva2xpc3QNCiAgICAgICAgcmV0b2JqID0gb2JqZWN0Ll9fbmV3X18oY2xzKQ0KICAgICAgICByZXRvYmouX19kb2luaXQgPSBUcnVlDQogICAgICAgIHJldHVybiByZXRvYmoNCg0KICAgICMgUGVyZm9ybWFuY2UgdHVuaW5nOiB3ZSBjb25zdHJ1Y3QgYSAqbG90KiBvZiB0aGVzZSwgc28ga2VlcCB0aGlzDQogICAgIyBjb25zdHJ1Y3RvciBhcyBzbWFsbCBhbmQgZmFzdCBhcyBwb3NzaWJsZQ0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgdG9rbGlzdD1Ob25lLCBuYW1lPU5vbmUsIGFzTGlzdD1UcnVlLCBtb2RhbD1UcnVlLCBpc2luc3RhbmNlPWlzaW5zdGFuY2UgKToNCiAgICAgICAgaWYgc2VsZi5fX2RvaW5pdDoNCiAgICAgICAgICAgIHNlbGYuX19kb2luaXQgPSBGYWxzZQ0KICAgICAgICAgICAgc2VsZi5fX25hbWUgPSBOb25lDQogICAgICAgICAgICBzZWxmLl9fcGFyZW50ID0gTm9uZQ0KICAgICAgICAgICAgc2VsZi5fX2FjY3VtTmFtZXMgPSB7fQ0KICAgICAgICAgICAgc2VsZi5fX2FzTGlzdCA9IGFzTGlzdA0KICAgICAgICAgICAgc2VsZi5fX21vZGFsID0gbW9kYWwNCiAgICAgICAgICAgIGlmIHRva2xpc3QgaXMgTm9uZToNCiAgICAgICAgICAgICAgICB0b2tsaXN0ID0gW10NCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodG9rbGlzdCwgbGlzdCk6DQogICAgICAgICAgICAgICAgc2VsZi5fX3Rva2xpc3QgPSB0b2tsaXN0WzpdDQogICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UodG9rbGlzdCwgX2dlbmVyYXRvclR5cGUpOg0KICAgICAgICAgICAgICAgIHNlbGYuX190b2tsaXN0ID0gbGlzdCh0b2tsaXN0KQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBzZWxmLl9fdG9rbGlzdCA9IFt0b2tsaXN0XQ0KICAgICAgICAgICAgc2VsZi5fX3Rva2RpY3QgPSBkaWN0KCkNCg0KICAgICAgICBpZiBuYW1lIGlzIG5vdCBOb25lIGFuZCBuYW1lOg0KICAgICAgICAgICAgaWYgbm90IG1vZGFsOg0KICAgICAgICAgICAgICAgIHNlbGYuX19hY2N1bU5hbWVzW25hbWVdID0gMA0KICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShuYW1lLGludCk6DQogICAgICAgICAgICAgICAgbmFtZSA9IF91c3RyKG5hbWUpICMgd2lsbCBhbHdheXMgcmV0dXJuIGEgc3RyLCBidXQgdXNlIF91c3RyIGZvciBjb25zaXN0ZW5jeQ0KICAgICAgICAgICAgc2VsZi5fX25hbWUgPSBuYW1lDQogICAgICAgICAgICBpZiBub3QgKGlzaW5zdGFuY2UodG9rbGlzdCwgKHR5cGUoTm9uZSksIGJhc2VzdHJpbmcsIGxpc3QpKSBhbmQgdG9rbGlzdCBpbiAoTm9uZSwnJyxbXSkpOg0KICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodG9rbGlzdCxiYXNlc3RyaW5nKToNCiAgICAgICAgICAgICAgICAgICAgdG9rbGlzdCA9IFsgdG9rbGlzdCBdDQogICAgICAgICAgICAgICAgaWYgYXNMaXN0Og0KICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHRva2xpc3QsUGFyc2VSZXN1bHRzKToNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGZbbmFtZV0gPSBfUGFyc2VSZXN1bHRzV2l0aE9mZnNldCh0b2tsaXN0LmNvcHkoKSwwKQ0KICAgICAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZltuYW1lXSA9IF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KFBhcnNlUmVzdWx0cyh0b2tsaXN0WzBdKSwwKQ0KICAgICAgICAgICAgICAgICAgICBzZWxmW25hbWVdLl9fbmFtZSA9IG5hbWUNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmW25hbWVdID0gdG9rbGlzdFswXQ0KICAgICAgICAgICAgICAgICAgICBleGNlcHQgKEtleUVycm9yLFR5cGVFcnJvcixJbmRleEVycm9yKToNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGZbbmFtZV0gPSB0b2tsaXN0DQoNCiAgICBkZWYgX19nZXRpdGVtX18oIHNlbGYsIGkgKToNCiAgICAgICAgaWYgaXNpbnN0YW5jZSggaSwgKGludCxzbGljZSkgKToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLl9fdG9rbGlzdFtpXQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgaWYgaSBub3QgaW4gc2VsZi5fX2FjY3VtTmFtZXM6DQogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX190b2tkaWN0W2ldWy0xXVswXQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICByZXR1cm4gUGFyc2VSZXN1bHRzKFsgdlswXSBmb3IgdiBpbiBzZWxmLl9fdG9rZGljdFtpXSBdKQ0KDQogICAgZGVmIF9fc2V0aXRlbV9fKCBzZWxmLCBrLCB2LCBpc2luc3RhbmNlPWlzaW5zdGFuY2UgKToNCiAgICAgICAgaWYgaXNpbnN0YW5jZSh2LF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KToNCiAgICAgICAgICAgIHNlbGYuX190b2tkaWN0W2tdID0gc2VsZi5fX3Rva2RpY3QuZ2V0KGssbGlzdCgpKSArIFt2XQ0KICAgICAgICAgICAgc3ViID0gdlswXQ0KICAgICAgICBlbGlmIGlzaW5zdGFuY2UoaywoaW50LHNsaWNlKSk6DQogICAgICAgICAgICBzZWxmLl9fdG9rbGlzdFtrXSA9IHYNCiAgICAgICAgICAgIHN1YiA9IHYNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHNlbGYuX190b2tkaWN0W2tdID0gc2VsZi5fX3Rva2RpY3QuZ2V0KGssbGlzdCgpKSArIFtfUGFyc2VSZXN1bHRzV2l0aE9mZnNldCh2LDApXQ0KICAgICAgICAgICAgc3ViID0gdg0KICAgICAgICBpZiBpc2luc3RhbmNlKHN1YixQYXJzZVJlc3VsdHMpOg0KICAgICAgICAgICAgc3ViLl9fcGFyZW50ID0gd2tyZWYoc2VsZikNCg0KICAgIGRlZiBfX2RlbGl0ZW1fXyggc2VsZiwgaSApOg0KICAgICAgICBpZiBpc2luc3RhbmNlKGksKGludCxzbGljZSkpOg0KICAgICAgICAgICAgbXlsZW4gPSBsZW4oIHNlbGYuX190b2tsaXN0ICkNCiAgICAgICAgICAgIGRlbCBzZWxmLl9fdG9rbGlzdFtpXQ0KDQogICAgICAgICAgICAjIGNvbnZlcnQgaW50IHRvIHNsaWNlDQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGksIGludCk6DQogICAgICAgICAgICAgICAgaWYgaSA8IDA6DQogICAgICAgICAgICAgICAgICAgIGkgKz0gbXlsZW4NCiAgICAgICAgICAgICAgICBpID0gc2xpY2UoaSwgaSsxKQ0KICAgICAgICAgICAgIyBnZXQgcmVtb3ZlZCBpbmRpY2VzDQogICAgICAgICAgICByZW1vdmVkID0gbGlzdChyYW5nZSgqaS5pbmRpY2VzKG15bGVuKSkpDQogICAgICAgICAgICByZW1vdmVkLnJldmVyc2UoKQ0KICAgICAgICAgICAgIyBmaXh1cCBpbmRpY2VzIGluIHRva2VuIGRpY3Rpb25hcnkNCiAgICAgICAgICAgIGZvciBuYW1lLG9jY3VycmVuY2VzIGluIHNlbGYuX190b2tkaWN0Lml0ZW1zKCk6DQogICAgICAgICAgICAgICAgZm9yIGogaW4gcmVtb3ZlZDoNCiAgICAgICAgICAgICAgICAgICAgZm9yIGssICh2YWx1ZSwgcG9zaXRpb24pIGluIGVudW1lcmF0ZShvY2N1cnJlbmNlcyk6DQogICAgICAgICAgICAgICAgICAgICAgICBvY2N1cnJlbmNlc1trXSA9IF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KHZhbHVlLCBwb3NpdGlvbiAtIChwb3NpdGlvbiA+IGopKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgZGVsIHNlbGYuX190b2tkaWN0W2ldDQoNCiAgICBkZWYgX19jb250YWluc19fKCBzZWxmLCBrICk6DQogICAgICAgIHJldHVybiBrIGluIHNlbGYuX190b2tkaWN0DQoNCiAgICBkZWYgX19sZW5fXyggc2VsZiApOiByZXR1cm4gbGVuKCBzZWxmLl9fdG9rbGlzdCApDQogICAgZGVmIF9fYm9vbF9fKHNlbGYpOiByZXR1cm4gKCBub3Qgbm90IHNlbGYuX190b2tsaXN0ICkNCiAgICBfX25vbnplcm9fXyA9IF9fYm9vbF9fDQogICAgZGVmIF9faXRlcl9fKCBzZWxmICk6IHJldHVybiBpdGVyKCBzZWxmLl9fdG9rbGlzdCApDQogICAgZGVmIF9fcmV2ZXJzZWRfXyggc2VsZiApOiByZXR1cm4gaXRlciggc2VsZi5fX3Rva2xpc3RbOjotMV0gKQ0KICAgIGRlZiBfaXRlcmtleXMoIHNlbGYgKToNCiAgICAgICAgaWYgaGFzYXR0cihzZWxmLl9fdG9rZGljdCwgIml0ZXJrZXlzIik6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5fX3Rva2RpY3QuaXRlcmtleXMoKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmV0dXJuIGl0ZXIoc2VsZi5fX3Rva2RpY3QpDQoNCiAgICBkZWYgX2l0ZXJ2YWx1ZXMoIHNlbGYgKToNCiAgICAgICAgcmV0dXJuIChzZWxmW2tdIGZvciBrIGluIHNlbGYuX2l0ZXJrZXlzKCkpDQogICAgICAgICAgICANCiAgICBkZWYgX2l0ZXJpdGVtcyggc2VsZiApOg0KICAgICAgICByZXR1cm4gKChrLCBzZWxmW2tdKSBmb3IgayBpbiBzZWxmLl9pdGVya2V5cygpKQ0KDQogICAgaWYgUFlfMzoNCiAgICAgICAga2V5cyA9IF9pdGVya2V5cyAgICAgICANCiAgICAgICAgIiIiUmV0dXJucyBhbiBpdGVyYXRvciBvZiBhbGwgbmFtZWQgcmVzdWx0IGtleXMgKFB5dGhvbiAzLnggb25seSkuIiIiDQoNCiAgICAgICAgdmFsdWVzID0gX2l0ZXJ2YWx1ZXMNCiAgICAgICAgIiIiUmV0dXJucyBhbiBpdGVyYXRvciBvZiBhbGwgbmFtZWQgcmVzdWx0IHZhbHVlcyAoUHl0aG9uIDMueCBvbmx5KS4iIiINCg0KICAgICAgICBpdGVtcyA9IF9pdGVyaXRlbXMNCiAgICAgICAgIiIiUmV0dXJucyBhbiBpdGVyYXRvciBvZiBhbGwgbmFtZWQgcmVzdWx0IGtleS12YWx1ZSB0dXBsZXMgKFB5dGhvbiAzLnggb25seSkuIiIiDQoNCiAgICBlbHNlOg0KICAgICAgICBpdGVya2V5cyA9IF9pdGVya2V5cw0KICAgICAgICAiIiJSZXR1cm5zIGFuIGl0ZXJhdG9yIG9mIGFsbCBuYW1lZCByZXN1bHQga2V5cyAoUHl0aG9uIDIueCBvbmx5KS4iIiINCg0KICAgICAgICBpdGVydmFsdWVzID0gX2l0ZXJ2YWx1ZXMNCiAgICAgICAgIiIiUmV0dXJucyBhbiBpdGVyYXRvciBvZiBhbGwgbmFtZWQgcmVzdWx0IHZhbHVlcyAoUHl0aG9uIDIueCBvbmx5KS4iIiINCg0KICAgICAgICBpdGVyaXRlbXMgPSBfaXRlcml0ZW1zDQogICAgICAgICIiIlJldHVybnMgYW4gaXRlcmF0b3Igb2YgYWxsIG5hbWVkIHJlc3VsdCBrZXktdmFsdWUgdHVwbGVzIChQeXRob24gMi54IG9ubHkpLiIiIg0KDQogICAgICAgIGRlZiBrZXlzKCBzZWxmICk6DQogICAgICAgICAgICAiIiJSZXR1cm5zIGFsbCBuYW1lZCByZXN1bHQga2V5cyAoYXMgYSBsaXN0IGluIFB5dGhvbiAyLngsIGFzIGFuIGl0ZXJhdG9yIGluIFB5dGhvbiAzLngpLiIiIg0KICAgICAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5pdGVya2V5cygpKQ0KDQogICAgICAgIGRlZiB2YWx1ZXMoIHNlbGYgKToNCiAgICAgICAgICAgICIiIlJldHVybnMgYWxsIG5hbWVkIHJlc3VsdCB2YWx1ZXMgKGFzIGEgbGlzdCBpbiBQeXRob24gMi54LCBhcyBhbiBpdGVyYXRvciBpbiBQeXRob24gMy54KS4iIiINCiAgICAgICAgICAgIHJldHVybiBsaXN0KHNlbGYuaXRlcnZhbHVlcygpKQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICBkZWYgaXRlbXMoIHNlbGYgKToNCiAgICAgICAgICAgICIiIlJldHVybnMgYWxsIG5hbWVkIHJlc3VsdCBrZXktdmFsdWVzIChhcyBhIGxpc3Qgb2YgdHVwbGVzIGluIFB5dGhvbiAyLngsIGFzIGFuIGl0ZXJhdG9yIGluIFB5dGhvbiAzLngpLiIiIg0KICAgICAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5pdGVyaXRlbXMoKSkNCg0KICAgIGRlZiBoYXNrZXlzKCBzZWxmICk6DQogICAgICAgICIiIlNpbmNlIGtleXMoKSByZXR1cm5zIGFuIGl0ZXJhdG9yLCB0aGlzIG1ldGhvZCBpcyBoZWxwZnVsIGluIGJ5cGFzc2luZw0KICAgICAgICAgICBjb2RlIHRoYXQgbG9va3MgZm9yIHRoZSBleGlzdGVuY2Ugb2YgYW55IGRlZmluZWQgcmVzdWx0cyBuYW1lcy4iIiINCiAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fX3Rva2RpY3QpDQogICAgICAgIA0KICAgIGRlZiBwb3AoIHNlbGYsICphcmdzLCAqKmt3YXJncyk6DQogICAgICAgICIiIg0KICAgICAgICBSZW1vdmVzIGFuZCByZXR1cm5zIGl0ZW0gYXQgc3BlY2lmaWVkIGluZGV4IChkZWZhdWx0PUN7bGFzdH0pLg0KICAgICAgICBTdXBwb3J0cyBib3RoIEN7bGlzdH0gYW5kIEN7ZGljdH0gc2VtYW50aWNzIGZvciBDe3BvcCgpfS4gSWYgcGFzc2VkIG5vDQogICAgICAgIGFyZ3VtZW50IG9yIGFuIGludGVnZXIgYXJndW1lbnQsIGl0IHdpbGwgdXNlIEN7bGlzdH0gc2VtYW50aWNzDQogICAgICAgIGFuZCBwb3AgdG9rZW5zIGZyb20gdGhlIGxpc3Qgb2YgcGFyc2VkIHRva2Vucy4gSWYgcGFzc2VkIGEgDQogICAgICAgIG5vbi1pbnRlZ2VyIGFyZ3VtZW50IChtb3N0IGxpa2VseSBhIHN0cmluZyksIGl0IHdpbGwgdXNlIEN7ZGljdH0NCiAgICAgICAgc2VtYW50aWNzIGFuZCBwb3AgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgZnJvbSBhbnkgZGVmaW5lZCANCiAgICAgICAgcmVzdWx0cyBuYW1lcy4gQSBzZWNvbmQgZGVmYXVsdCByZXR1cm4gdmFsdWUgYXJndW1lbnQgaXMgDQogICAgICAgIHN1cHBvcnRlZCwganVzdCBhcyBpbiBDe2RpY3QucG9wKCl9Lg0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgZGVmIHJlbW92ZV9maXJzdCh0b2tlbnMpOg0KICAgICAgICAgICAgICAgIHRva2Vucy5wb3AoMCkNCiAgICAgICAgICAgIHByaW50KE9uZU9yTW9yZShXb3JkKG51bXMpKS5wYXJzZVN0cmluZygiMCAxMjMgMzIxIikpICMgLT4gWycwJywgJzEyMycsICczMjEnXQ0KICAgICAgICAgICAgcHJpbnQoT25lT3JNb3JlKFdvcmQobnVtcykpLmFkZFBhcnNlQWN0aW9uKHJlbW92ZV9maXJzdCkucGFyc2VTdHJpbmcoIjAgMTIzIDMyMSIpKSAjIC0+IFsnMTIzJywgJzMyMSddDQoNCiAgICAgICAgICAgIGxhYmVsID0gV29yZChhbHBoYXMpDQogICAgICAgICAgICBwYXR0ID0gbGFiZWwoIkxBQkVMIikgKyBPbmVPck1vcmUoV29yZChudW1zKSkNCiAgICAgICAgICAgIHByaW50KHBhdHQucGFyc2VTdHJpbmcoIkFBQiAxMjMgMzIxIikuZHVtcCgpKQ0KDQogICAgICAgICAgICAjIFVzZSBwb3AoKSBpbiBhIHBhcnNlIGFjdGlvbiB0byByZW1vdmUgbmFtZWQgcmVzdWx0IChub3RlIHRoYXQgY29ycmVzcG9uZGluZyB2YWx1ZSBpcyBub3QNCiAgICAgICAgICAgICMgcmVtb3ZlZCBmcm9tIGxpc3QgZm9ybSBvZiByZXN1bHRzKQ0KICAgICAgICAgICAgZGVmIHJlbW92ZV9MQUJFTCh0b2tlbnMpOg0KICAgICAgICAgICAgICAgIHRva2Vucy5wb3AoIkxBQkVMIikNCiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5zDQogICAgICAgICAgICBwYXR0LmFkZFBhcnNlQWN0aW9uKHJlbW92ZV9MQUJFTCkNCiAgICAgICAgICAgIHByaW50KHBhdHQucGFyc2VTdHJpbmcoIkFBQiAxMjMgMzIxIikuZHVtcCgpKQ0KICAgICAgICBwcmludHM6Og0KICAgICAgICAgICAgWydBQUInLCAnMTIzJywgJzMyMSddDQogICAgICAgICAgICAtIExBQkVMOiBBQUINCg0KICAgICAgICAgICAgWydBQUInLCAnMTIzJywgJzMyMSddDQogICAgICAgICIiIg0KICAgICAgICBpZiBub3QgYXJnczoNCiAgICAgICAgICAgIGFyZ3MgPSBbLTFdDQogICAgICAgIGZvciBrLHYgaW4ga3dhcmdzLml0ZW1zKCk6DQogICAgICAgICAgICBpZiBrID09ICdkZWZhdWx0JzoNCiAgICAgICAgICAgICAgICBhcmdzID0gKGFyZ3NbMF0sIHYpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigicG9wKCkgZ290IGFuIHVuZXhwZWN0ZWQga2V5d29yZCBhcmd1bWVudCAnJXMnIiAlIGspDQogICAgICAgIGlmIChpc2luc3RhbmNlKGFyZ3NbMF0sIGludCkgb3IgDQogICAgICAgICAgICAgICAgICAgICAgICBsZW4oYXJncykgPT0gMSBvciANCiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbMF0gaW4gc2VsZik6DQogICAgICAgICAgICBpbmRleCA9IGFyZ3NbMF0NCiAgICAgICAgICAgIHJldCA9IHNlbGZbaW5kZXhdDQogICAgICAgICAgICBkZWwgc2VsZltpbmRleF0NCiAgICAgICAgICAgIHJldHVybiByZXQNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIGRlZmF1bHR2YWx1ZSA9IGFyZ3NbMV0NCiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0dmFsdWUNCg0KICAgIGRlZiBnZXQoc2VsZiwga2V5LCBkZWZhdWx0VmFsdWU9Tm9uZSk6DQogICAgICAgICIiIg0KICAgICAgICBSZXR1cm5zIG5hbWVkIHJlc3VsdCBtYXRjaGluZyB0aGUgZ2l2ZW4ga2V5LCBvciBpZiB0aGVyZSBpcyBubw0KICAgICAgICBzdWNoIG5hbWUsIHRoZW4gcmV0dXJucyB0aGUgZ2l2ZW4gQ3tkZWZhdWx0VmFsdWV9IG9yIEN7Tm9uZX0gaWYgbm8NCiAgICAgICAgQ3tkZWZhdWx0VmFsdWV9IGlzIHNwZWNpZmllZC4NCg0KICAgICAgICBTaW1pbGFyIHRvIEN7ZGljdC5nZXQoKX0uDQogICAgICAgIA0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpDQogICAgICAgICAgICBkYXRlX3N0ciA9IGludGVnZXIoInllYXIiKSArICcvJyArIGludGVnZXIoIm1vbnRoIikgKyAnLycgKyBpbnRlZ2VyKCJkYXkiKSAgICAgICAgICAgDQoNCiAgICAgICAgICAgIHJlc3VsdCA9IGRhdGVfc3RyLnBhcnNlU3RyaW5nKCIxOTk5LzEyLzMxIikNCiAgICAgICAgICAgIHByaW50KHJlc3VsdC5nZXQoInllYXIiKSkgIyAtPiAnMTk5OScNCiAgICAgICAgICAgIHByaW50KHJlc3VsdC5nZXQoImhvdXIiLCAibm90IHNwZWNpZmllZCIpKSAjIC0+ICdub3Qgc3BlY2lmaWVkJw0KICAgICAgICAgICAgcHJpbnQocmVzdWx0LmdldCgiaG91ciIpKSAjIC0+IE5vbmUNCiAgICAgICAgIiIiDQogICAgICAgIGlmIGtleSBpbiBzZWxmOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGZba2V5XQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZQ0KDQogICAgZGVmIGluc2VydCggc2VsZiwgaW5kZXgsIGluc1N0ciApOg0KICAgICAgICAiIiINCiAgICAgICAgSW5zZXJ0cyBuZXcgZWxlbWVudCBhdCBsb2NhdGlvbiBpbmRleCBpbiB0aGUgbGlzdCBvZiBwYXJzZWQgdG9rZW5zLg0KICAgICAgICANCiAgICAgICAgU2ltaWxhciB0byBDe2xpc3QuaW5zZXJ0KCl9Lg0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgcHJpbnQoT25lT3JNb3JlKFdvcmQobnVtcykpLnBhcnNlU3RyaW5nKCIwIDEyMyAzMjEiKSkgIyAtPiBbJzAnLCAnMTIzJywgJzMyMSddDQoNCiAgICAgICAgICAgICMgdXNlIGEgcGFyc2UgYWN0aW9uIHRvIGluc2VydCB0aGUgcGFyc2UgbG9jYXRpb24gaW4gdGhlIGZyb250IG9mIHRoZSBwYXJzZWQgcmVzdWx0cw0KICAgICAgICAgICAgZGVmIGluc2VydF9sb2NuKGxvY24sIHRva2Vucyk6DQogICAgICAgICAgICAgICAgdG9rZW5zLmluc2VydCgwLCBsb2NuKQ0KICAgICAgICAgICAgcHJpbnQoT25lT3JNb3JlKFdvcmQobnVtcykpLmFkZFBhcnNlQWN0aW9uKGluc2VydF9sb2NuKS5wYXJzZVN0cmluZygiMCAxMjMgMzIxIikpICMgLT4gWzAsICcwJywgJzEyMycsICczMjEnXQ0KICAgICAgICAiIiINCiAgICAgICAgc2VsZi5fX3Rva2xpc3QuaW5zZXJ0KGluZGV4LCBpbnNTdHIpDQogICAgICAgICMgZml4dXAgaW5kaWNlcyBpbiB0b2tlbiBkaWN0aW9uYXJ5DQogICAgICAgIGZvciBuYW1lLG9jY3VycmVuY2VzIGluIHNlbGYuX190b2tkaWN0Lml0ZW1zKCk6DQogICAgICAgICAgICBmb3IgaywgKHZhbHVlLCBwb3NpdGlvbikgaW4gZW51bWVyYXRlKG9jY3VycmVuY2VzKToNCiAgICAgICAgICAgICAgICBvY2N1cnJlbmNlc1trXSA9IF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KHZhbHVlLCBwb3NpdGlvbiArIChwb3NpdGlvbiA+IGluZGV4KSkNCg0KICAgIGRlZiBhcHBlbmQoIHNlbGYsIGl0ZW0gKToNCiAgICAgICAgIiIiDQogICAgICAgIEFkZCBzaW5nbGUgZWxlbWVudCB0byBlbmQgb2YgUGFyc2VSZXN1bHRzIGxpc3Qgb2YgZWxlbWVudHMuDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBwcmludChPbmVPck1vcmUoV29yZChudW1zKSkucGFyc2VTdHJpbmcoIjAgMTIzIDMyMSIpKSAjIC0+IFsnMCcsICcxMjMnLCAnMzIxJ10NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgIyB1c2UgYSBwYXJzZSBhY3Rpb24gdG8gY29tcHV0ZSB0aGUgc3VtIG9mIHRoZSBwYXJzZWQgaW50ZWdlcnMsIGFuZCBhZGQgaXQgdG8gdGhlIGVuZA0KICAgICAgICAgICAgZGVmIGFwcGVuZF9zdW0odG9rZW5zKToNCiAgICAgICAgICAgICAgICB0b2tlbnMuYXBwZW5kKHN1bShtYXAoaW50LCB0b2tlbnMpKSkNCiAgICAgICAgICAgIHByaW50KE9uZU9yTW9yZShXb3JkKG51bXMpKS5hZGRQYXJzZUFjdGlvbihhcHBlbmRfc3VtKS5wYXJzZVN0cmluZygiMCAxMjMgMzIxIikpICMgLT4gWycwJywgJzEyMycsICczMjEnLCA0NDRdDQogICAgICAgICIiIg0KICAgICAgICBzZWxmLl9fdG9rbGlzdC5hcHBlbmQoaXRlbSkNCg0KICAgIGRlZiBleHRlbmQoIHNlbGYsIGl0ZW1zZXEgKToNCiAgICAgICAgIiIiDQogICAgICAgIEFkZCBzZXF1ZW5jZSBvZiBlbGVtZW50cyB0byBlbmQgb2YgUGFyc2VSZXN1bHRzIGxpc3Qgb2YgZWxlbWVudHMuDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBwYXR0ID0gT25lT3JNb3JlKFdvcmQoYWxwaGFzKSkNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgIyB1c2UgYSBwYXJzZSBhY3Rpb24gdG8gYXBwZW5kIHRoZSByZXZlcnNlIG9mIHRoZSBtYXRjaGVkIHN0cmluZ3MsIHRvIG1ha2UgYSBwYWxpbmRyb21lDQogICAgICAgICAgICBkZWYgbWFrZV9wYWxpbmRyb21lKHRva2Vucyk6DQogICAgICAgICAgICAgICAgdG9rZW5zLmV4dGVuZChyZXZlcnNlZChbdFs6Oi0xXSBmb3IgdCBpbiB0b2tlbnNdKSkNCiAgICAgICAgICAgICAgICByZXR1cm4gJycuam9pbih0b2tlbnMpDQogICAgICAgICAgICBwcmludChwYXR0LmFkZFBhcnNlQWN0aW9uKG1ha2VfcGFsaW5kcm9tZSkucGFyc2VTdHJpbmcoImxza2RqIHNkbGtqZiBsa3NkIikpICMgLT4gJ2xza2Rqc2Rsa2pmbGtzZGRza2xmamtsZHNqZGtzbCcNCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2UoaXRlbXNlcSwgUGFyc2VSZXN1bHRzKToNCiAgICAgICAgICAgIHNlbGYgKz0gaXRlbXNlcQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc2VsZi5fX3Rva2xpc3QuZXh0ZW5kKGl0ZW1zZXEpDQoNCiAgICBkZWYgY2xlYXIoIHNlbGYgKToNCiAgICAgICAgIiIiDQogICAgICAgIENsZWFyIGFsbCBlbGVtZW50cyBhbmQgcmVzdWx0cyBuYW1lcy4NCiAgICAgICAgIiIiDQogICAgICAgIGRlbCBzZWxmLl9fdG9rbGlzdFs6XQ0KICAgICAgICBzZWxmLl9fdG9rZGljdC5jbGVhcigpDQoNCiAgICBkZWYgX19nZXRhdHRyX18oIHNlbGYsIG5hbWUgKToNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgcmV0dXJuIHNlbGZbbmFtZV0NCiAgICAgICAgZXhjZXB0IEtleUVycm9yOg0KICAgICAgICAgICAgcmV0dXJuICIiDQogICAgICAgICAgICANCiAgICAgICAgaWYgbmFtZSBpbiBzZWxmLl9fdG9rZGljdDoNCiAgICAgICAgICAgIGlmIG5hbWUgbm90IGluIHNlbGYuX19hY2N1bU5hbWVzOg0KICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9fdG9rZGljdFtuYW1lXVstMV1bMF0NCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcmV0dXJuIFBhcnNlUmVzdWx0cyhbIHZbMF0gZm9yIHYgaW4gc2VsZi5fX3Rva2RpY3RbbmFtZV0gXSkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJldHVybiAiIg0KDQogICAgZGVmIF9fYWRkX18oIHNlbGYsIG90aGVyICk6DQogICAgICAgIHJldCA9IHNlbGYuY29weSgpDQogICAgICAgIHJldCArPSBvdGhlcg0KICAgICAgICByZXR1cm4gcmV0DQoNCiAgICBkZWYgX19pYWRkX18oIHNlbGYsIG90aGVyICk6DQogICAgICAgIGlmIG90aGVyLl9fdG9rZGljdDoNCiAgICAgICAgICAgIG9mZnNldCA9IGxlbihzZWxmLl9fdG9rbGlzdCkNCiAgICAgICAgICAgIGFkZG9mZnNldCA9IGxhbWJkYSBhOiBvZmZzZXQgaWYgYTwwIGVsc2UgYStvZmZzZXQNCiAgICAgICAgICAgIG90aGVyaXRlbXMgPSBvdGhlci5fX3Rva2RpY3QuaXRlbXMoKQ0KICAgICAgICAgICAgb3RoZXJkaWN0aXRlbXMgPSBbKGssIF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KHZbMF0sYWRkb2Zmc2V0KHZbMV0pKSApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoayx2bGlzdCkgaW4gb3RoZXJpdGVtcyBmb3IgdiBpbiB2bGlzdF0NCiAgICAgICAgICAgIGZvciBrLHYgaW4gb3RoZXJkaWN0aXRlbXM6DQogICAgICAgICAgICAgICAgc2VsZltrXSA9IHYNCiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZbMF0sUGFyc2VSZXN1bHRzKToNCiAgICAgICAgICAgICAgICAgICAgdlswXS5fX3BhcmVudCA9IHdrcmVmKHNlbGYpDQogICAgICAgICAgICANCiAgICAgICAgc2VsZi5fX3Rva2xpc3QgKz0gb3RoZXIuX190b2tsaXN0DQogICAgICAgIHNlbGYuX19hY2N1bU5hbWVzLnVwZGF0ZSggb3RoZXIuX19hY2N1bU5hbWVzICkNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBfX3JhZGRfXyhzZWxmLCBvdGhlcik6DQogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsaW50KSBhbmQgb3RoZXIgPT0gMDoNCiAgICAgICAgICAgICMgdXNlZnVsIGZvciBtZXJnaW5nIG1hbnkgUGFyc2VSZXN1bHRzIHVzaW5nIHN1bSgpIGJ1aWx0aW4NCiAgICAgICAgICAgIHJldHVybiBzZWxmLmNvcHkoKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgIyB0aGlzIG1heSByYWlzZSBhIFR5cGVFcnJvciAtIHNvIGJlIGl0DQogICAgICAgICAgICByZXR1cm4gb3RoZXIgKyBzZWxmDQogICAgICAgIA0KICAgIGRlZiBfX3JlcHJfXyggc2VsZiApOg0KICAgICAgICByZXR1cm4gIiglcywgJXMpIiAlICggcmVwciggc2VsZi5fX3Rva2xpc3QgKSwgcmVwciggc2VsZi5fX3Rva2RpY3QgKSApDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICByZXR1cm4gJ1snICsgJywgJy5qb2luKF91c3RyKGkpIGlmIGlzaW5zdGFuY2UoaSwgUGFyc2VSZXN1bHRzKSBlbHNlIHJlcHIoaSkgZm9yIGkgaW4gc2VsZi5fX3Rva2xpc3QpICsgJ10nDQoNCiAgICBkZWYgX2FzU3RyaW5nTGlzdCggc2VsZiwgc2VwPScnICk6DQogICAgICAgIG91dCA9IFtdDQogICAgICAgIGZvciBpdGVtIGluIHNlbGYuX190b2tsaXN0Og0KICAgICAgICAgICAgaWYgb3V0IGFuZCBzZXA6DQogICAgICAgICAgICAgICAgb3V0LmFwcGVuZChzZXApDQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKCBpdGVtLCBQYXJzZVJlc3VsdHMgKToNCiAgICAgICAgICAgICAgICBvdXQgKz0gaXRlbS5fYXNTdHJpbmdMaXN0KCkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgb3V0LmFwcGVuZCggX3VzdHIoaXRlbSkgKQ0KICAgICAgICByZXR1cm4gb3V0DQoNCiAgICBkZWYgYXNMaXN0KCBzZWxmICk6DQogICAgICAgICIiIg0KICAgICAgICBSZXR1cm5zIHRoZSBwYXJzZSByZXN1bHRzIGFzIGEgbmVzdGVkIGxpc3Qgb2YgbWF0Y2hpbmcgdG9rZW5zLCBhbGwgY29udmVydGVkIHRvIHN0cmluZ3MuDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBwYXR0ID0gT25lT3JNb3JlKFdvcmQoYWxwaGFzKSkNCiAgICAgICAgICAgIHJlc3VsdCA9IHBhdHQucGFyc2VTdHJpbmcoInNsZGtqIGxzZGtqIHNsZGtqIikNCiAgICAgICAgICAgICMgZXZlbiB0aG91Z2ggdGhlIHJlc3VsdCBwcmludHMgaW4gc3RyaW5nLWxpa2UgZm9ybSwgaXQgaXMgYWN0dWFsbHkgYSBweXBhcnNpbmcgUGFyc2VSZXN1bHRzDQogICAgICAgICAgICBwcmludCh0eXBlKHJlc3VsdCksIHJlc3VsdCkgIyAtPiA8Y2xhc3MgJ3B5cGFyc2luZy5QYXJzZVJlc3VsdHMnPiBbJ3NsZGtqJywgJ2xzZGtqJywgJ3NsZGtqJ10NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgIyBVc2UgYXNMaXN0KCkgdG8gY3JlYXRlIGFuIGFjdHVhbCBsaXN0DQogICAgICAgICAgICByZXN1bHRfbGlzdCA9IHJlc3VsdC5hc0xpc3QoKQ0KICAgICAgICAgICAgcHJpbnQodHlwZShyZXN1bHRfbGlzdCksIHJlc3VsdF9saXN0KSAjIC0+IDxjbGFzcyAnbGlzdCc+IFsnc2xka2onLCAnbHNka2onLCAnc2xka2onXQ0KICAgICAgICAiIiINCiAgICAgICAgcmV0dXJuIFtyZXMuYXNMaXN0KCkgaWYgaXNpbnN0YW5jZShyZXMsUGFyc2VSZXN1bHRzKSBlbHNlIHJlcyBmb3IgcmVzIGluIHNlbGYuX190b2tsaXN0XQ0KDQogICAgZGVmIGFzRGljdCggc2VsZiApOg0KICAgICAgICAiIiINCiAgICAgICAgUmV0dXJucyB0aGUgbmFtZWQgcGFyc2UgcmVzdWx0cyBhcyBhIG5lc3RlZCBkaWN0aW9uYXJ5Lg0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykNCiAgICAgICAgICAgIGRhdGVfc3RyID0gaW50ZWdlcigieWVhciIpICsgJy8nICsgaW50ZWdlcigibW9udGgiKSArICcvJyArIGludGVnZXIoImRheSIpDQogICAgICAgICAgICANCiAgICAgICAgICAgIHJlc3VsdCA9IGRhdGVfc3RyLnBhcnNlU3RyaW5nKCcxMi8zMS8xOTk5JykNCiAgICAgICAgICAgIHByaW50KHR5cGUocmVzdWx0KSwgcmVwcihyZXN1bHQpKSAjIC0+IDxjbGFzcyAncHlwYXJzaW5nLlBhcnNlUmVzdWx0cyc+IChbJzEyJywgJy8nLCAnMzEnLCAnLycsICcxOTk5J10sIHsnZGF5JzogWygnMTk5OScsIDQpXSwgJ3llYXInOiBbKCcxMicsIDApXSwgJ21vbnRoJzogWygnMzEnLCAyKV19KQ0KICAgICAgICAgICAgDQogICAgICAgICAgICByZXN1bHRfZGljdCA9IHJlc3VsdC5hc0RpY3QoKQ0KICAgICAgICAgICAgcHJpbnQodHlwZShyZXN1bHRfZGljdCksIHJlcHIocmVzdWx0X2RpY3QpKSAjIC0+IDxjbGFzcyAnZGljdCc+IHsnZGF5JzogJzE5OTknLCAneWVhcic6ICcxMicsICdtb250aCc6ICczMSd9DQoNCiAgICAgICAgICAgICMgZXZlbiB0aG91Z2ggYSBQYXJzZVJlc3VsdHMgc3VwcG9ydHMgZGljdC1saWtlIGFjY2Vzcywgc29tZXRpbWUgeW91IGp1c3QgbmVlZCB0byBoYXZlIGEgZGljdA0KICAgICAgICAgICAgaW1wb3J0IGpzb24NCiAgICAgICAgICAgIHByaW50KGpzb24uZHVtcHMocmVzdWx0KSkgIyAtPiBFeGNlcHRpb246IFR5cGVFcnJvcjogLi4uIGlzIG5vdCBKU09OIHNlcmlhbGl6YWJsZQ0KICAgICAgICAgICAgcHJpbnQoanNvbi5kdW1wcyhyZXN1bHQuYXNEaWN0KCkpKSAjIC0+IHsibW9udGgiOiAiMzEiLCAiZGF5IjogIjE5OTkiLCAieWVhciI6ICIxMiJ9DQogICAgICAgICIiIg0KICAgICAgICBpZiBQWV8zOg0KICAgICAgICAgICAgaXRlbV9mbiA9IHNlbGYuaXRlbXMNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIGl0ZW1fZm4gPSBzZWxmLml0ZXJpdGVtcw0KICAgICAgICAgICAgDQogICAgICAgIGRlZiB0b0l0ZW0ob2JqKToNCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uob2JqLCBQYXJzZVJlc3VsdHMpOg0KICAgICAgICAgICAgICAgIGlmIG9iai5oYXNrZXlzKCk6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmouYXNEaWN0KCkNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3RvSXRlbSh2KSBmb3IgdiBpbiBvYmpdDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHJldHVybiBvYmoNCiAgICAgICAgICAgICAgICANCiAgICAgICAgcmV0dXJuIGRpY3QoKGssdG9JdGVtKHYpKSBmb3Igayx2IGluIGl0ZW1fZm4oKSkNCg0KICAgIGRlZiBjb3B5KCBzZWxmICk6DQogICAgICAgICIiIg0KICAgICAgICBSZXR1cm5zIGEgbmV3IGNvcHkgb2YgYSBDe1BhcnNlUmVzdWx0c30gb2JqZWN0Lg0KICAgICAgICAiIiINCiAgICAgICAgcmV0ID0gUGFyc2VSZXN1bHRzKCBzZWxmLl9fdG9rbGlzdCApDQogICAgICAgIHJldC5fX3Rva2RpY3QgPSBzZWxmLl9fdG9rZGljdC5jb3B5KCkNCiAgICAgICAgcmV0Ll9fcGFyZW50ID0gc2VsZi5fX3BhcmVudA0KICAgICAgICByZXQuX19hY2N1bU5hbWVzLnVwZGF0ZSggc2VsZi5fX2FjY3VtTmFtZXMgKQ0KICAgICAgICByZXQuX19uYW1lID0gc2VsZi5fX25hbWUNCiAgICAgICAgcmV0dXJuIHJldA0KDQogICAgZGVmIGFzWE1MKCBzZWxmLCBkb2N0YWc9Tm9uZSwgbmFtZWRJdGVtc09ubHk9RmFsc2UsIGluZGVudD0iIiwgZm9ybWF0dGVkPVRydWUgKToNCiAgICAgICAgIiIiDQogICAgICAgIChEZXByZWNhdGVkKSBSZXR1cm5zIHRoZSBwYXJzZSByZXN1bHRzIGFzIFhNTC4gVGFncyBhcmUgY3JlYXRlZCBmb3IgdG9rZW5zIGFuZCBsaXN0cyB0aGF0IGhhdmUgZGVmaW5lZCByZXN1bHRzIG5hbWVzLg0KICAgICAgICAiIiINCiAgICAgICAgbmwgPSAiXG4iDQogICAgICAgIG91dCA9IFtdDQogICAgICAgIG5hbWVkSXRlbXMgPSBkaWN0KCh2WzFdLGspIGZvciAoayx2bGlzdCkgaW4gc2VsZi5fX3Rva2RpY3QuaXRlbXMoKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHYgaW4gdmxpc3QpDQogICAgICAgIG5leHRMZXZlbEluZGVudCA9IGluZGVudCArICIgICINCg0KICAgICAgICAjIGNvbGxhcHNlIG91dCBpbmRlbnRzIGlmIGZvcm1hdHRpbmcgaXMgbm90IGRlc2lyZWQNCiAgICAgICAgaWYgbm90IGZvcm1hdHRlZDoNCiAgICAgICAgICAgIGluZGVudCA9ICIiDQogICAgICAgICAgICBuZXh0TGV2ZWxJbmRlbnQgPSAiIg0KICAgICAgICAgICAgbmwgPSAiIg0KDQogICAgICAgIHNlbGZUYWcgPSBOb25lDQogICAgICAgIGlmIGRvY3RhZyBpcyBub3QgTm9uZToNCiAgICAgICAgICAgIHNlbGZUYWcgPSBkb2N0YWcNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIGlmIHNlbGYuX19uYW1lOg0KICAgICAgICAgICAgICAgIHNlbGZUYWcgPSBzZWxmLl9fbmFtZQ0KDQogICAgICAgIGlmIG5vdCBzZWxmVGFnOg0KICAgICAgICAgICAgaWYgbmFtZWRJdGVtc09ubHk6DQogICAgICAgICAgICAgICAgcmV0dXJuICIiDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHNlbGZUYWcgPSAiSVRFTSINCg0KICAgICAgICBvdXQgKz0gWyBubCwgaW5kZW50LCAiPCIsIHNlbGZUYWcsICI+IiBdDQoNCiAgICAgICAgZm9yIGkscmVzIGluIGVudW1lcmF0ZShzZWxmLl9fdG9rbGlzdCk6DQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHJlcyxQYXJzZVJlc3VsdHMpOg0KICAgICAgICAgICAgICAgIGlmIGkgaW4gbmFtZWRJdGVtczoNCiAgICAgICAgICAgICAgICAgICAgb3V0ICs9IFsgcmVzLmFzWE1MKG5hbWVkSXRlbXNbaV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZWRJdGVtc09ubHkgYW5kIGRvY3RhZyBpcyBOb25lLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRMZXZlbEluZGVudCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWQpXQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIG91dCArPSBbIHJlcy5hc1hNTChOb25lLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVkSXRlbXNPbmx5IGFuZCBkb2N0YWcgaXMgTm9uZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0TGV2ZWxJbmRlbnQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkKV0NCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgIyBpbmRpdmlkdWFsIHRva2VuLCBzZWUgaWYgdGhlcmUgaXMgYSBuYW1lIGZvciBpdA0KICAgICAgICAgICAgICAgIHJlc1RhZyA9IE5vbmUNCiAgICAgICAgICAgICAgICBpZiBpIGluIG5hbWVkSXRlbXM6DQogICAgICAgICAgICAgICAgICAgIHJlc1RhZyA9IG5hbWVkSXRlbXNbaV0NCiAgICAgICAgICAgICAgICBpZiBub3QgcmVzVGFnOg0KICAgICAgICAgICAgICAgICAgICBpZiBuYW1lZEl0ZW1zT25seToNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlDQogICAgICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgICAgICByZXNUYWcgPSAiSVRFTSINCiAgICAgICAgICAgICAgICB4bWxCb2R5VGV4dCA9IF94bWxfZXNjYXBlKF91c3RyKHJlcykpDQogICAgICAgICAgICAgICAgb3V0ICs9IFsgbmwsIG5leHRMZXZlbEluZGVudCwgIjwiLCByZXNUYWcsICI+IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbEJvZHlUZXh0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwvIiwgcmVzVGFnLCAiPiIgXQ0KDQogICAgICAgIG91dCArPSBbIG5sLCBpbmRlbnQsICI8LyIsIHNlbGZUYWcsICI+IiBdDQogICAgICAgIHJldHVybiAiIi5qb2luKG91dCkNCg0KICAgIGRlZiBfX2xvb2t1cChzZWxmLHN1Yik6DQogICAgICAgIGZvciBrLHZsaXN0IGluIHNlbGYuX190b2tkaWN0Lml0ZW1zKCk6DQogICAgICAgICAgICBmb3Igdixsb2MgaW4gdmxpc3Q6DQogICAgICAgICAgICAgICAgaWYgc3ViIGlzIHY6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBrDQogICAgICAgIHJldHVybiBOb25lDQoNCiAgICBkZWYgZ2V0TmFtZShzZWxmKToNCiAgICAgICAgciIiIg0KICAgICAgICBSZXR1cm5zIHRoZSByZXN1bHRzIG5hbWUgZm9yIHRoaXMgdG9rZW4gZXhwcmVzc2lvbi4gVXNlZnVsIHdoZW4gc2V2ZXJhbCANCiAgICAgICAgZGlmZmVyZW50IGV4cHJlc3Npb25zIG1pZ2h0IG1hdGNoIGF0IGEgcGFydGljdWxhciBsb2NhdGlvbi4NCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpDQogICAgICAgICAgICBzc25fZXhwciA9IFJlZ2V4KHIiXGRcZFxkLVxkXGQtXGRcZFxkXGQiKQ0KICAgICAgICAgICAgaG91c2VfbnVtYmVyX2V4cHIgPSBTdXBwcmVzcygnIycpICsgV29yZChudW1zLCBhbHBoYW51bXMpDQogICAgICAgICAgICB1c2VyX2RhdGEgPSAoR3JvdXAoaG91c2VfbnVtYmVyX2V4cHIpKCJob3VzZV9udW1iZXIiKSANCiAgICAgICAgICAgICAgICAgICAgICAgIHwgR3JvdXAoc3NuX2V4cHIpKCJzc24iKQ0KICAgICAgICAgICAgICAgICAgICAgICAgfCBHcm91cChpbnRlZ2VyKSgiYWdlIikpDQogICAgICAgICAgICB1c2VyX2luZm8gPSBPbmVPck1vcmUodXNlcl9kYXRhKQ0KICAgICAgICAgICAgDQogICAgICAgICAgICByZXN1bHQgPSB1c2VyX2luZm8ucGFyc2VTdHJpbmcoIjIyIDExMS0yMi0zMzMzICMyMjFCIikNCiAgICAgICAgICAgIGZvciBpdGVtIGluIHJlc3VsdDoNCiAgICAgICAgICAgICAgICBwcmludChpdGVtLmdldE5hbWUoKSwgJzonLCBpdGVtWzBdKQ0KICAgICAgICBwcmludHM6Og0KICAgICAgICAgICAgYWdlIDogMjINCiAgICAgICAgICAgIHNzbiA6IDExMS0yMi0zMzMzDQogICAgICAgICAgICBob3VzZV9udW1iZXIgOiAyMjFCDQogICAgICAgICIiIg0KICAgICAgICBpZiBzZWxmLl9fbmFtZToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLl9fbmFtZQ0KICAgICAgICBlbGlmIHNlbGYuX19wYXJlbnQ6DQogICAgICAgICAgICBwYXIgPSBzZWxmLl9fcGFyZW50KCkNCiAgICAgICAgICAgIGlmIHBhcjoNCiAgICAgICAgICAgICAgICByZXR1cm4gcGFyLl9fbG9va3VwKHNlbGYpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHJldHVybiBOb25lDQogICAgICAgIGVsaWYgKGxlbihzZWxmKSA9PSAxIGFuZA0KICAgICAgICAgICAgICAgbGVuKHNlbGYuX190b2tkaWN0KSA9PSAxIGFuZA0KICAgICAgICAgICAgICAgbmV4dChpdGVyKHNlbGYuX190b2tkaWN0LnZhbHVlcygpKSlbMF1bMV0gaW4gKDAsLTEpKToNCiAgICAgICAgICAgIHJldHVybiBuZXh0KGl0ZXIoc2VsZi5fX3Rva2RpY3Qua2V5cygpKSkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJldHVybiBOb25lDQoNCiAgICBkZWYgZHVtcChzZWxmLCBpbmRlbnQ9JycsIGRlcHRoPTAsIGZ1bGw9VHJ1ZSk6DQogICAgICAgICIiIg0KICAgICAgICBEaWFnbm9zdGljIG1ldGhvZCBmb3IgbGlzdGluZyBvdXQgdGhlIGNvbnRlbnRzIG9mIGEgQ3tQYXJzZVJlc3VsdHN9Lg0KICAgICAgICBBY2NlcHRzIGFuIG9wdGlvbmFsIEN7aW5kZW50fSBhcmd1bWVudCBzbyB0aGF0IHRoaXMgc3RyaW5nIGNhbiBiZSBlbWJlZGRlZA0KICAgICAgICBpbiBhIG5lc3RlZCBkaXNwbGF5IG9mIG90aGVyIGRhdGEuDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKQ0KICAgICAgICAgICAgZGF0ZV9zdHIgPSBpbnRlZ2VyKCJ5ZWFyIikgKyAnLycgKyBpbnRlZ2VyKCJtb250aCIpICsgJy8nICsgaW50ZWdlcigiZGF5IikNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgcmVzdWx0ID0gZGF0ZV9zdHIucGFyc2VTdHJpbmcoJzEyLzMxLzE5OTknKQ0KICAgICAgICAgICAgcHJpbnQocmVzdWx0LmR1bXAoKSkNCiAgICAgICAgcHJpbnRzOjoNCiAgICAgICAgICAgIFsnMTInLCAnLycsICczMScsICcvJywgJzE5OTknXQ0KICAgICAgICAgICAgLSBkYXk6IDE5OTkNCiAgICAgICAgICAgIC0gbW9udGg6IDMxDQogICAgICAgICAgICAtIHllYXI6IDEyDQogICAgICAgICIiIg0KICAgICAgICBvdXQgPSBbXQ0KICAgICAgICBOTCA9ICdcbicNCiAgICAgICAgb3V0LmFwcGVuZCggaW5kZW50K191c3RyKHNlbGYuYXNMaXN0KCkpICkNCiAgICAgICAgaWYgZnVsbDoNCiAgICAgICAgICAgIGlmIHNlbGYuaGFza2V5cygpOg0KICAgICAgICAgICAgICAgIGl0ZW1zID0gc29ydGVkKChzdHIoayksIHYpIGZvciBrLHYgaW4gc2VsZi5pdGVtcygpKQ0KICAgICAgICAgICAgICAgIGZvciBrLHYgaW4gaXRlbXM6DQogICAgICAgICAgICAgICAgICAgIGlmIG91dDoNCiAgICAgICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoTkwpDQogICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoICIlcyVzLSAlczogIiAlIChpbmRlbnQsKCcgICcqZGVwdGgpLCBrKSApDQogICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodixQYXJzZVJlc3VsdHMpOg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgdjoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCB2LmR1bXAoaW5kZW50LGRlcHRoKzEpICkNCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZChfdXN0cih2KSkNCiAgICAgICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQocmVwcih2KSkNCiAgICAgICAgICAgIGVsaWYgYW55KGlzaW5zdGFuY2UodnYsUGFyc2VSZXN1bHRzKSBmb3IgdnYgaW4gc2VsZik6DQogICAgICAgICAgICAgICAgdiA9IHNlbGYNCiAgICAgICAgICAgICAgICBmb3IgaSx2diBpbiBlbnVtZXJhdGUodik6DQogICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodnYsUGFyc2VSZXN1bHRzKToNCiAgICAgICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoIlxuJXMlc1slZF06XG4lcyVzJXMiICUgKGluZGVudCwoJyAgJyooZGVwdGgpKSxpLGluZGVudCwoJyAgJyooZGVwdGgrMSkpLHZ2LmR1bXAoaW5kZW50LGRlcHRoKzEpICkpDQogICAgICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCJcbiVzJXNbJWRdOlxuJXMlcyVzIiAlIChpbmRlbnQsKCcgICcqKGRlcHRoKSksaSxpbmRlbnQsKCcgICcqKGRlcHRoKzEpKSxfdXN0cih2dikpKQ0KICAgICAgICAgICAgDQogICAgICAgIHJldHVybiAiIi5qb2luKG91dCkNCg0KICAgIGRlZiBwcHJpbnQoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToNCiAgICAgICAgIiIiDQogICAgICAgIFByZXR0eS1wcmludGVyIGZvciBwYXJzZWQgcmVzdWx0cyBhcyBhIGxpc3QsIHVzaW5nIHRoZSBDe3BwcmludH0gbW9kdWxlLg0KICAgICAgICBBY2NlcHRzIGFkZGl0aW9uYWwgcG9zaXRpb25hbCBvciBrZXl3b3JkIGFyZ3MgYXMgZGVmaW5lZCBmb3IgdGhlIA0KICAgICAgICBDe3BwcmludC5wcHJpbnR9IG1ldGhvZC4gKFV7aHR0cDovL2RvY3MucHl0aG9uLm9yZy8zL2xpYnJhcnkvcHByaW50Lmh0bWwjcHByaW50LnBwcmludH0pDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBpZGVudCA9IFdvcmQoYWxwaGFzLCBhbHBoYW51bXMpDQogICAgICAgICAgICBudW0gPSBXb3JkKG51bXMpDQogICAgICAgICAgICBmdW5jID0gRm9yd2FyZCgpDQogICAgICAgICAgICB0ZXJtID0gaWRlbnQgfCBudW0gfCBHcm91cCgnKCcgKyBmdW5jICsgJyknKQ0KICAgICAgICAgICAgZnVuYyA8PD0gaWRlbnQgKyBHcm91cChPcHRpb25hbChkZWxpbWl0ZWRMaXN0KHRlcm0pKSkNCiAgICAgICAgICAgIHJlc3VsdCA9IGZ1bmMucGFyc2VTdHJpbmcoImZuYSBhLGIsKGZuYiBjLGQsMjAwKSwxMDAiKQ0KICAgICAgICAgICAgcmVzdWx0LnBwcmludCh3aWR0aD00MCkNCiAgICAgICAgcHJpbnRzOjoNCiAgICAgICAgICAgIFsnZm5hJywNCiAgICAgICAgICAgICBbJ2EnLA0KICAgICAgICAgICAgICAnYicsDQogICAgICAgICAgICAgIFsnKCcsICdmbmInLCBbJ2MnLCAnZCcsICcyMDAnXSwgJyknXSwNCiAgICAgICAgICAgICAgJzEwMCddXQ0KICAgICAgICAiIiINCiAgICAgICAgcHByaW50LnBwcmludChzZWxmLmFzTGlzdCgpLCAqYXJncywgKiprd2FyZ3MpDQoNCiAgICAjIGFkZCBzdXBwb3J0IGZvciBwaWNrbGUgcHJvdG9jb2wNCiAgICBkZWYgX19nZXRzdGF0ZV9fKHNlbGYpOg0KICAgICAgICByZXR1cm4gKCBzZWxmLl9fdG9rbGlzdCwNCiAgICAgICAgICAgICAgICAgKCBzZWxmLl9fdG9rZGljdC5jb3B5KCksDQogICAgICAgICAgICAgICAgICAgc2VsZi5fX3BhcmVudCBpcyBub3QgTm9uZSBhbmQgc2VsZi5fX3BhcmVudCgpIG9yIE5vbmUsDQogICAgICAgICAgICAgICAgICAgc2VsZi5fX2FjY3VtTmFtZXMsDQogICAgICAgICAgICAgICAgICAgc2VsZi5fX25hbWUgKSApDQoNCiAgICBkZWYgX19zZXRzdGF0ZV9fKHNlbGYsc3RhdGUpOg0KICAgICAgICBzZWxmLl9fdG9rbGlzdCA9IHN0YXRlWzBdDQogICAgICAgIChzZWxmLl9fdG9rZGljdCwNCiAgICAgICAgIHBhciwNCiAgICAgICAgIGluQWNjdW1OYW1lcywNCiAgICAgICAgIHNlbGYuX19uYW1lKSA9IHN0YXRlWzFdDQogICAgICAgIHNlbGYuX19hY2N1bU5hbWVzID0ge30NCiAgICAgICAgc2VsZi5fX2FjY3VtTmFtZXMudXBkYXRlKGluQWNjdW1OYW1lcykNCiAgICAgICAgaWYgcGFyIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgc2VsZi5fX3BhcmVudCA9IHdrcmVmKHBhcikNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHNlbGYuX19wYXJlbnQgPSBOb25lDQoNCiAgICBkZWYgX19nZXRuZXdhcmdzX18oc2VsZik6DQogICAgICAgIHJldHVybiBzZWxmLl9fdG9rbGlzdCwgc2VsZi5fX25hbWUsIHNlbGYuX19hc0xpc3QsIHNlbGYuX19tb2RhbA0KDQogICAgZGVmIF9fZGlyX18oc2VsZik6DQogICAgICAgIHJldHVybiAoZGlyKHR5cGUoc2VsZikpICsgbGlzdChzZWxmLmtleXMoKSkpDQoNCk11dGFibGVNYXBwaW5nLnJlZ2lzdGVyKFBhcnNlUmVzdWx0cykNCg0KZGVmIGNvbCAobG9jLHN0cmcpOg0KICAgICIiIlJldHVybnMgY3VycmVudCBjb2x1bW4gd2l0aGluIGEgc3RyaW5nLCBjb3VudGluZyBuZXdsaW5lcyBhcyBsaW5lIHNlcGFyYXRvcnMuDQogICBUaGUgZmlyc3QgY29sdW1uIGlzIG51bWJlciAxLg0KDQogICBOb3RlOiB0aGUgZGVmYXVsdCBwYXJzaW5nIGJlaGF2aW9yIGlzIHRvIGV4cGFuZCB0YWJzIGluIHRoZSBpbnB1dCBzdHJpbmcNCiAgIGJlZm9yZSBzdGFydGluZyB0aGUgcGFyc2luZyBwcm9jZXNzLiAgU2VlIEx7SXtQYXJzZXJFbGVtZW50LnBhcnNlU3RyaW5nfTxQYXJzZXJFbGVtZW50LnBhcnNlU3RyaW5nPn0gZm9yIG1vcmUgaW5mb3JtYXRpb24NCiAgIG9uIHBhcnNpbmcgc3RyaW5ncyBjb250YWluaW5nIEN7PFRBQj59cywgYW5kIHN1Z2dlc3RlZCBtZXRob2RzIHRvIG1haW50YWluIGENCiAgIGNvbnNpc3RlbnQgdmlldyBvZiB0aGUgcGFyc2VkIHN0cmluZywgdGhlIHBhcnNlIGxvY2F0aW9uLCBhbmQgbGluZSBhbmQgY29sdW1uDQogICBwb3NpdGlvbnMgd2l0aGluIHRoZSBwYXJzZWQgc3RyaW5nLg0KICAgIiIiDQogICAgcyA9IHN0cmcNCiAgICByZXR1cm4gMSBpZiAwPGxvYzxsZW4ocykgYW5kIHNbbG9jLTFdID09ICdcbicgZWxzZSBsb2MgLSBzLnJmaW5kKCJcbiIsIDAsIGxvYykNCg0KZGVmIGxpbmVubyhsb2Msc3RyZyk6DQogICAgIiIiUmV0dXJucyBjdXJyZW50IGxpbmUgbnVtYmVyIHdpdGhpbiBhIHN0cmluZywgY291bnRpbmcgbmV3bGluZXMgYXMgbGluZSBzZXBhcmF0b3JzLg0KICAgVGhlIGZpcnN0IGxpbmUgaXMgbnVtYmVyIDEuDQoNCiAgIE5vdGU6IHRoZSBkZWZhdWx0IHBhcnNpbmcgYmVoYXZpb3IgaXMgdG8gZXhwYW5kIHRhYnMgaW4gdGhlIGlucHV0IHN0cmluZw0KICAgYmVmb3JlIHN0YXJ0aW5nIHRoZSBwYXJzaW5nIHByb2Nlc3MuICBTZWUgTHtJe1BhcnNlckVsZW1lbnQucGFyc2VTdHJpbmd9PFBhcnNlckVsZW1lbnQucGFyc2VTdHJpbmc+fSBmb3IgbW9yZSBpbmZvcm1hdGlvbg0KICAgb24gcGFyc2luZyBzdHJpbmdzIGNvbnRhaW5pbmcgQ3s8VEFCPn1zLCBhbmQgc3VnZ2VzdGVkIG1ldGhvZHMgdG8gbWFpbnRhaW4gYQ0KICAgY29uc2lzdGVudCB2aWV3IG9mIHRoZSBwYXJzZWQgc3RyaW5nLCB0aGUgcGFyc2UgbG9jYXRpb24sIGFuZCBsaW5lIGFuZCBjb2x1bW4NCiAgIHBvc2l0aW9ucyB3aXRoaW4gdGhlIHBhcnNlZCBzdHJpbmcuDQogICAiIiINCiAgICByZXR1cm4gc3RyZy5jb3VudCgiXG4iLDAsbG9jKSArIDENCg0KZGVmIGxpbmUoIGxvYywgc3RyZyApOg0KICAgICIiIlJldHVybnMgdGhlIGxpbmUgb2YgdGV4dCBjb250YWluaW5nIGxvYyB3aXRoaW4gYSBzdHJpbmcsIGNvdW50aW5nIG5ld2xpbmVzIGFzIGxpbmUgc2VwYXJhdG9ycy4NCiAgICAgICAiIiINCiAgICBsYXN0Q1IgPSBzdHJnLnJmaW5kKCJcbiIsIDAsIGxvYykNCiAgICBuZXh0Q1IgPSBzdHJnLmZpbmQoIlxuIiwgbG9jKQ0KICAgIGlmIG5leHRDUiA+PSAwOg0KICAgICAgICByZXR1cm4gc3RyZ1tsYXN0Q1IrMTpuZXh0Q1JdDQogICAgZWxzZToNCiAgICAgICAgcmV0dXJuIHN0cmdbbGFzdENSKzE6XQ0KDQpkZWYgX2RlZmF1bHRTdGFydERlYnVnQWN0aW9uKCBpbnN0cmluZywgbG9jLCBleHByICk6DQogICAgcHJpbnQgKCgiTWF0Y2ggIiArIF91c3RyKGV4cHIpICsgIiBhdCBsb2MgIiArIF91c3RyKGxvYykgKyAiKCVkLCVkKSIgJSAoIGxpbmVubyhsb2MsaW5zdHJpbmcpLCBjb2wobG9jLGluc3RyaW5nKSApKSkNCg0KZGVmIF9kZWZhdWx0U3VjY2Vzc0RlYnVnQWN0aW9uKCBpbnN0cmluZywgc3RhcnRsb2MsIGVuZGxvYywgZXhwciwgdG9rcyApOg0KICAgIHByaW50ICgiTWF0Y2hlZCAiICsgX3VzdHIoZXhwcikgKyAiIC0+ICIgKyBzdHIodG9rcy5hc0xpc3QoKSkpDQoNCmRlZiBfZGVmYXVsdEV4Y2VwdGlvbkRlYnVnQWN0aW9uKCBpbnN0cmluZywgbG9jLCBleHByLCBleGMgKToNCiAgICBwcmludCAoIkV4Y2VwdGlvbiByYWlzZWQ6IiArIF91c3RyKGV4YykpDQoNCmRlZiBudWxsRGVidWdBY3Rpb24oKmFyZ3MpOg0KICAgICIiIidEby1ub3RoaW5nJyBkZWJ1ZyBhY3Rpb24sIHRvIHN1cHByZXNzIGRlYnVnZ2luZyBvdXRwdXQgZHVyaW5nIHBhcnNpbmcuIiIiDQogICAgcGFzcw0KDQojIE9ubHkgd29ya3Mgb24gUHl0aG9uIDMueCAtIG5vbmxvY2FsIGlzIHRveGljIHRvIFB5dGhvbiAyIGluc3RhbGxzDQojfiAnZGVjb3JhdG9yIHRvIHRyaW0gZnVuY3Rpb24gY2FsbHMgdG8gbWF0Y2ggdGhlIGFyaXR5IG9mIHRoZSB0YXJnZXQnDQojfiBkZWYgX3RyaW1fYXJpdHkoZnVuYywgbWF4YXJncz0zKToNCiAgICAjfiBpZiBmdW5jIGluIHNpbmdsZUFyZ0J1aWx0aW5zOg0KICAgICAgICAjfiByZXR1cm4gbGFtYmRhIHMsbCx0OiBmdW5jKHQpDQogICAgI34gbGltaXQgPSAwDQogICAgI34gZm91bmRBcml0eSA9IEZhbHNlDQogICAgI34gZGVmIHdyYXBwZXIoKmFyZ3MpOg0KICAgICAgICAjfiBub25sb2NhbCBsaW1pdCxmb3VuZEFyaXR5DQogICAgICAgICN+IHdoaWxlIDE6DQogICAgICAgICAgICAjfiB0cnk6DQogICAgICAgICAgICAgICAgI34gcmV0ID0gZnVuYygqYXJnc1tsaW1pdDpdKQ0KICAgICAgICAgICAgICAgICN+IGZvdW5kQXJpdHkgPSBUcnVlDQogICAgICAgICAgICAgICAgI34gcmV0dXJuIHJldA0KICAgICAgICAgICAgI34gZXhjZXB0IFR5cGVFcnJvcjoNCiAgICAgICAgICAgICAgICAjfiBpZiBsaW1pdCA9PSBtYXhhcmdzIG9yIGZvdW5kQXJpdHk6DQogICAgICAgICAgICAgICAgICAgICN+IHJhaXNlDQogICAgICAgICAgICAgICAgI34gbGltaXQgKz0gMQ0KICAgICAgICAgICAgICAgICN+IGNvbnRpbnVlDQogICAgI34gcmV0dXJuIHdyYXBwZXINCg0KIyB0aGlzIHZlcnNpb24gaXMgUHl0aG9uIDIueC0zLnggY3Jvc3MtY29tcGF0aWJsZQ0KJ2RlY29yYXRvciB0byB0cmltIGZ1bmN0aW9uIGNhbGxzIHRvIG1hdGNoIHRoZSBhcml0eSBvZiB0aGUgdGFyZ2V0Jw0KZGVmIF90cmltX2FyaXR5KGZ1bmMsIG1heGFyZ3M9Mik6DQogICAgaWYgZnVuYyBpbiBzaW5nbGVBcmdCdWlsdGluczoNCiAgICAgICAgcmV0dXJuIGxhbWJkYSBzLGwsdDogZnVuYyh0KQ0KICAgIGxpbWl0ID0gWzBdDQogICAgZm91bmRBcml0eSA9IFtGYWxzZV0NCiAgICANCiAgICAjIHRyYWNlYmFjayByZXR1cm4gZGF0YSBzdHJ1Y3R1cmUgY2hhbmdlZCBpbiBQeTMuNSAtIG5vcm1hbGl6ZSBiYWNrIHRvIHBsYWluIHR1cGxlcw0KICAgIGlmIHN5c3RlbV92ZXJzaW9uWzoyXSA+PSAoMyw1KToNCiAgICAgICAgZGVmIGV4dHJhY3Rfc3RhY2sobGltaXQ9MCk6DQogICAgICAgICAgICAjIHNwZWNpYWwgaGFuZGxpbmcgZm9yIFB5dGhvbiAzLjUuMCAtIGV4dHJhIGRlZXAgY2FsbCBzdGFjayBieSAxDQogICAgICAgICAgICBvZmZzZXQgPSAtMyBpZiBzeXN0ZW1fdmVyc2lvbiA9PSAoMyw1LDApIGVsc2UgLTINCiAgICAgICAgICAgIGZyYW1lX3N1bW1hcnkgPSB0cmFjZWJhY2suZXh0cmFjdF9zdGFjayhsaW1pdD0tb2Zmc2V0K2xpbWl0LTEpW29mZnNldF0NCiAgICAgICAgICAgIHJldHVybiBbZnJhbWVfc3VtbWFyeVs6Ml1dDQogICAgICAgIGRlZiBleHRyYWN0X3RiKHRiLCBsaW1pdD0wKToNCiAgICAgICAgICAgIGZyYW1lcyA9IHRyYWNlYmFjay5leHRyYWN0X3RiKHRiLCBsaW1pdD1saW1pdCkNCiAgICAgICAgICAgIGZyYW1lX3N1bW1hcnkgPSBmcmFtZXNbLTFdDQogICAgICAgICAgICByZXR1cm4gW2ZyYW1lX3N1bW1hcnlbOjJdXQ0KICAgIGVsc2U6DQogICAgICAgIGV4dHJhY3Rfc3RhY2sgPSB0cmFjZWJhY2suZXh0cmFjdF9zdGFjaw0KICAgICAgICBleHRyYWN0X3RiID0gdHJhY2ViYWNrLmV4dHJhY3RfdGINCiAgICANCiAgICAjIHN5bnRoZXNpemUgd2hhdCB3b3VsZCBiZSByZXR1cm5lZCBieSB0cmFjZWJhY2suZXh0cmFjdF9zdGFjayBhdCB0aGUgY2FsbCB0byANCiAgICAjIHVzZXIncyBwYXJzZSBhY3Rpb24gJ2Z1bmMnLCBzbyB0aGF0IHdlIGRvbid0IGluY3VyIGNhbGwgcGVuYWx0eSBhdCBwYXJzZSB0aW1lDQogICAgDQogICAgTElORV9ESUZGID0gNg0KICAgICMgSUYgQU5ZIENPREUgQ0hBTkdFUywgRVZFTiBKVVNUIENPTU1FTlRTIE9SIEJMQU5LIExJTkVTLCBCRVRXRUVOIFRIRSBORVhUIExJTkUgQU5EIA0KICAgICMgVEhFIENBTEwgVE8gRlVOQyBJTlNJREUgV1JBUFBFUiwgTElORV9ESUZGIE1VU1QgQkUgTU9ESUZJRUQhISEhDQogICAgdGhpc19saW5lID0gZXh0cmFjdF9zdGFjayhsaW1pdD0yKVstMV0NCiAgICBwYV9jYWxsX2xpbmVfc3ludGggPSAodGhpc19saW5lWzBdLCB0aGlzX2xpbmVbMV0rTElORV9ESUZGKQ0KDQogICAgZGVmIHdyYXBwZXIoKmFyZ3MpOg0KICAgICAgICB3aGlsZSAxOg0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIHJldCA9IGZ1bmMoKmFyZ3NbbGltaXRbMF06XSkNCiAgICAgICAgICAgICAgICBmb3VuZEFyaXR5WzBdID0gVHJ1ZQ0KICAgICAgICAgICAgICAgIHJldHVybiByZXQNCiAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6DQogICAgICAgICAgICAgICAgIyByZS1yYWlzZSBUeXBlRXJyb3JzIGlmIHRoZXkgZGlkIG5vdCBjb21lIGZyb20gb3VyIGFyaXR5IHRlc3RpbmcNCiAgICAgICAgICAgICAgICBpZiBmb3VuZEFyaXR5WzBdOg0KICAgICAgICAgICAgICAgICAgICByYWlzZQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICAgICAgICAgIHRiID0gc3lzLmV4Y19pbmZvKClbLTFdDQogICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgZXh0cmFjdF90Yih0YiwgbGltaXQ9MilbLTFdWzoyXSA9PSBwYV9jYWxsX2xpbmVfc3ludGg6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UNCiAgICAgICAgICAgICAgICAgICAgZmluYWxseToNCiAgICAgICAgICAgICAgICAgICAgICAgIGRlbCB0Yg0KDQogICAgICAgICAgICAgICAgaWYgbGltaXRbMF0gPD0gbWF4YXJnczoNCiAgICAgICAgICAgICAgICAgICAgbGltaXRbMF0gKz0gMQ0KICAgICAgICAgICAgICAgICAgICBjb250aW51ZQ0KICAgICAgICAgICAgICAgIHJhaXNlDQoNCiAgICAjIGNvcHkgZnVuYyBuYW1lIHRvIHdyYXBwZXIgZm9yIHNlbnNpYmxlIGRlYnVnIG91dHB1dA0KICAgIGZ1bmNfbmFtZSA9ICI8cGFyc2UgYWN0aW9uPiINCiAgICB0cnk6DQogICAgICAgIGZ1bmNfbmFtZSA9IGdldGF0dHIoZnVuYywgJ19fbmFtZV9fJywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0YXR0cihmdW5jLCAnX19jbGFzc19fJykuX19uYW1lX18pDQogICAgZXhjZXB0IEV4Y2VwdGlvbjoNCiAgICAgICAgZnVuY19uYW1lID0gc3RyKGZ1bmMpDQogICAgd3JhcHBlci5fX25hbWVfXyA9IGZ1bmNfbmFtZQ0KDQogICAgcmV0dXJuIHdyYXBwZXINCg0KY2xhc3MgUGFyc2VyRWxlbWVudChvYmplY3QpOg0KICAgICIiIkFic3RyYWN0IGJhc2UgbGV2ZWwgcGFyc2VyIGVsZW1lbnQgY2xhc3MuIiIiDQogICAgREVGQVVMVF9XSElURV9DSEFSUyA9ICIgXG5cdFxyIg0KICAgIHZlcmJvc2Vfc3RhY2t0cmFjZSA9IEZhbHNlDQoNCiAgICBAc3RhdGljbWV0aG9kDQogICAgZGVmIHNldERlZmF1bHRXaGl0ZXNwYWNlQ2hhcnMoIGNoYXJzICk6DQogICAgICAgIHIiIiINCiAgICAgICAgT3ZlcnJpZGVzIHRoZSBkZWZhdWx0IHdoaXRlc3BhY2UgY2hhcnMNCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgICMgZGVmYXVsdCB3aGl0ZXNwYWNlIGNoYXJzIGFyZSBzcGFjZSwgPFRBQj4gYW5kIG5ld2xpbmUNCiAgICAgICAgICAgIE9uZU9yTW9yZShXb3JkKGFscGhhcykpLnBhcnNlU3RyaW5nKCJhYmMgZGVmXG5naGkgamtsIikgICMgLT4gWydhYmMnLCAnZGVmJywgJ2doaScsICdqa2wnXQ0KICAgICAgICAgICAgDQogICAgICAgICAgICAjIGNoYW5nZSB0byBqdXN0IHRyZWF0IG5ld2xpbmUgYXMgc2lnbmlmaWNhbnQNCiAgICAgICAgICAgIFBhcnNlckVsZW1lbnQuc2V0RGVmYXVsdFdoaXRlc3BhY2VDaGFycygiIFx0IikNCiAgICAgICAgICAgIE9uZU9yTW9yZShXb3JkKGFscGhhcykpLnBhcnNlU3RyaW5nKCJhYmMgZGVmXG5naGkgamtsIikgICMgLT4gWydhYmMnLCAnZGVmJ10NCiAgICAgICAgIiIiDQogICAgICAgIFBhcnNlckVsZW1lbnQuREVGQVVMVF9XSElURV9DSEFSUyA9IGNoYXJzDQoNCiAgICBAc3RhdGljbWV0aG9kDQogICAgZGVmIGlubGluZUxpdGVyYWxzVXNpbmcoY2xzKToNCiAgICAgICAgIiIiDQogICAgICAgIFNldCBjbGFzcyB0byBiZSB1c2VkIGZvciBpbmNsdXNpb24gb2Ygc3RyaW5nIGxpdGVyYWxzIGludG8gYSBwYXJzZXIuDQogICAgICAgIA0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgICMgZGVmYXVsdCBsaXRlcmFsIGNsYXNzIHVzZWQgaXMgTGl0ZXJhbA0KICAgICAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykNCiAgICAgICAgICAgIGRhdGVfc3RyID0gaW50ZWdlcigieWVhciIpICsgJy8nICsgaW50ZWdlcigibW9udGgiKSArICcvJyArIGludGVnZXIoImRheSIpICAgICAgICAgICANCg0KICAgICAgICAgICAgZGF0ZV9zdHIucGFyc2VTdHJpbmcoIjE5OTkvMTIvMzEiKSAgIyAtPiBbJzE5OTknLCAnLycsICcxMicsICcvJywgJzMxJ10NCg0KDQogICAgICAgICAgICAjIGNoYW5nZSB0byBTdXBwcmVzcw0KICAgICAgICAgICAgUGFyc2VyRWxlbWVudC5pbmxpbmVMaXRlcmFsc1VzaW5nKFN1cHByZXNzKQ0KICAgICAgICAgICAgZGF0ZV9zdHIgPSBpbnRlZ2VyKCJ5ZWFyIikgKyAnLycgKyBpbnRlZ2VyKCJtb250aCIpICsgJy8nICsgaW50ZWdlcigiZGF5IikgICAgICAgICAgIA0KDQogICAgICAgICAgICBkYXRlX3N0ci5wYXJzZVN0cmluZygiMTk5OS8xMi8zMSIpICAjIC0+IFsnMTk5OScsICcxMicsICczMSddDQogICAgICAgICIiIg0KICAgICAgICBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MgPSBjbHMNCg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgc2F2ZWxpc3Q9RmFsc2UgKToNCiAgICAgICAgc2VsZi5wYXJzZUFjdGlvbiA9IGxpc3QoKQ0KICAgICAgICBzZWxmLmZhaWxBY3Rpb24gPSBOb25lDQogICAgICAgICN+IHNlbGYubmFtZSA9ICI8dW5rbm93bj4iICAjIGRvbid0IGRlZmluZSBzZWxmLm5hbWUsIGxldCBzdWJjbGFzc2VzIHRyeS9leGNlcHQgdXBjYWxsDQogICAgICAgIHNlbGYuc3RyUmVwciA9IE5vbmUNCiAgICAgICAgc2VsZi5yZXN1bHRzTmFtZSA9IE5vbmUNCiAgICAgICAgc2VsZi5zYXZlQXNMaXN0ID0gc2F2ZWxpc3QNCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IFRydWUNCiAgICAgICAgc2VsZi53aGl0ZUNoYXJzID0gUGFyc2VyRWxlbWVudC5ERUZBVUxUX1dISVRFX0NIQVJTDQogICAgICAgIHNlbGYuY29weURlZmF1bHRXaGl0ZUNoYXJzID0gVHJ1ZQ0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gRmFsc2UgIyB1c2VkIHdoZW4gY2hlY2tpbmcgZm9yIGxlZnQtcmVjdXJzaW9uDQogICAgICAgIHNlbGYua2VlcFRhYnMgPSBGYWxzZQ0KICAgICAgICBzZWxmLmlnbm9yZUV4cHJzID0gbGlzdCgpDQogICAgICAgIHNlbGYuZGVidWcgPSBGYWxzZQ0KICAgICAgICBzZWxmLnN0cmVhbWxpbmVkID0gRmFsc2UNCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gVHJ1ZSAjIHVzZWQgdG8gb3B0aW1pemUgZXhjZXB0aW9uIGhhbmRsaW5nIGZvciBzdWJjbGFzc2VzIHRoYXQgZG9uJ3QgYWR2YW5jZSBwYXJzZSBpbmRleA0KICAgICAgICBzZWxmLmVycm1zZyA9ICIiDQogICAgICAgIHNlbGYubW9kYWxSZXN1bHRzID0gVHJ1ZSAjIHVzZWQgdG8gbWFyayByZXN1bHRzIG5hbWVzIGFzIG1vZGFsIChyZXBvcnQgb25seSBsYXN0KSBvciBjdW11bGF0aXZlIChsaXN0IGFsbCkNCiAgICAgICAgc2VsZi5kZWJ1Z0FjdGlvbnMgPSAoIE5vbmUsIE5vbmUsIE5vbmUgKSAjY3VzdG9tIGRlYnVnIGFjdGlvbnMNCiAgICAgICAgc2VsZi5yZSA9IE5vbmUNCiAgICAgICAgc2VsZi5jYWxsUHJlcGFyc2UgPSBUcnVlICMgdXNlZCB0byBhdm9pZCByZWR1bmRhbnQgY2FsbHMgdG8gcHJlUGFyc2UNCiAgICAgICAgc2VsZi5jYWxsRHVyaW5nVHJ5ID0gRmFsc2UNCg0KICAgIGRlZiBjb3B5KCBzZWxmICk6DQogICAgICAgICIiIg0KICAgICAgICBNYWtlIGEgY29weSBvZiB0aGlzIEN7UGFyc2VyRWxlbWVudH0uICBVc2VmdWwgZm9yIGRlZmluaW5nIGRpZmZlcmVudCBwYXJzZSBhY3Rpb25zDQogICAgICAgIGZvciB0aGUgc2FtZSBwYXJzaW5nIHBhdHRlcm4sIHVzaW5nIGNvcGllcyBvZiB0aGUgb3JpZ2luYWwgcGFyc2UgZWxlbWVudC4NCiAgICAgICAgDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHRva3M6IGludCh0b2tzWzBdKSkNCiAgICAgICAgICAgIGludGVnZXJLID0gaW50ZWdlci5jb3B5KCkuYWRkUGFyc2VBY3Rpb24obGFtYmRhIHRva3M6IHRva3NbMF0qMTAyNCkgKyBTdXBwcmVzcygiSyIpDQogICAgICAgICAgICBpbnRlZ2VyTSA9IGludGVnZXIuY29weSgpLmFkZFBhcnNlQWN0aW9uKGxhbWJkYSB0b2tzOiB0b2tzWzBdKjEwMjQqMTAyNCkgKyBTdXBwcmVzcygiTSIpDQogICAgICAgICAgICANCiAgICAgICAgICAgIHByaW50KE9uZU9yTW9yZShpbnRlZ2VySyB8IGludGVnZXJNIHwgaW50ZWdlcikucGFyc2VTdHJpbmcoIjVLIDEwMCA2NDBLIDI1Nk0iKSkNCiAgICAgICAgcHJpbnRzOjoNCiAgICAgICAgICAgIFs1MTIwLCAxMDAsIDY1NTM2MCwgMjY4NDM1NDU2XQ0KICAgICAgICBFcXVpdmFsZW50IGZvcm0gb2YgQ3tleHByLmNvcHkoKX0gaXMganVzdCBDe2V4cHIoKX06Og0KICAgICAgICAgICAgaW50ZWdlck0gPSBpbnRlZ2VyKCkuYWRkUGFyc2VBY3Rpb24obGFtYmRhIHRva3M6IHRva3NbMF0qMTAyNCoxMDI0KSArIFN1cHByZXNzKCJNIikNCiAgICAgICAgIiIiDQogICAgICAgIGNweSA9IGNvcHkuY29weSggc2VsZiApDQogICAgICAgIGNweS5wYXJzZUFjdGlvbiA9IHNlbGYucGFyc2VBY3Rpb25bOl0NCiAgICAgICAgY3B5Lmlnbm9yZUV4cHJzID0gc2VsZi5pZ25vcmVFeHByc1s6XQ0KICAgICAgICBpZiBzZWxmLmNvcHlEZWZhdWx0V2hpdGVDaGFyczoNCiAgICAgICAgICAgIGNweS53aGl0ZUNoYXJzID0gUGFyc2VyRWxlbWVudC5ERUZBVUxUX1dISVRFX0NIQVJTDQogICAgICAgIHJldHVybiBjcHkNCg0KICAgIGRlZiBzZXROYW1lKCBzZWxmLCBuYW1lICk6DQogICAgICAgICIiIg0KICAgICAgICBEZWZpbmUgbmFtZSBmb3IgdGhpcyBleHByZXNzaW9uLCBtYWtlcyBkZWJ1Z2dpbmcgYW5kIGV4Y2VwdGlvbiBtZXNzYWdlcyBjbGVhcmVyLg0KICAgICAgICANCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBXb3JkKG51bXMpLnBhcnNlU3RyaW5nKCJBQkMiKSAgIyAtPiBFeGNlcHRpb246IEV4cGVjdGVkIFc6KDAxMjMuLi4pIChhdCBjaGFyIDApLCAobGluZToxLCBjb2w6MSkNCiAgICAgICAgICAgIFdvcmQobnVtcykuc2V0TmFtZSgiaW50ZWdlciIpLnBhcnNlU3RyaW5nKCJBQkMiKSAgIyAtPiBFeGNlcHRpb246IEV4cGVjdGVkIGludGVnZXIgKGF0IGNoYXIgMCksIChsaW5lOjEsIGNvbDoxKQ0KICAgICAgICAiIiINCiAgICAgICAgc2VsZi5uYW1lID0gbmFtZQ0KICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCAiICsgc2VsZi5uYW1lDQogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwiZXhjZXB0aW9uIik6DQogICAgICAgICAgICBzZWxmLmV4Y2VwdGlvbi5tc2cgPSBzZWxmLmVycm1zZw0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIHNldFJlc3VsdHNOYW1lKCBzZWxmLCBuYW1lLCBsaXN0QWxsTWF0Y2hlcz1GYWxzZSApOg0KICAgICAgICAiIiINCiAgICAgICAgRGVmaW5lIG5hbWUgZm9yIHJlZmVyZW5jaW5nIG1hdGNoaW5nIHRva2VucyBhcyBhIG5lc3RlZCBhdHRyaWJ1dGUNCiAgICAgICAgb2YgdGhlIHJldHVybmVkIHBhcnNlIHJlc3VsdHMuDQogICAgICAgIE5PVEU6IHRoaXMgcmV0dXJucyBhICpjb3B5KiBvZiB0aGUgb3JpZ2luYWwgQ3tQYXJzZXJFbGVtZW50fSBvYmplY3Q7DQogICAgICAgIHRoaXMgaXMgc28gdGhhdCB0aGUgY2xpZW50IGNhbiBkZWZpbmUgYSBiYXNpYyBlbGVtZW50LCBzdWNoIGFzIGFuDQogICAgICAgIGludGVnZXIsIGFuZCByZWZlcmVuY2UgaXQgaW4gbXVsdGlwbGUgcGxhY2VzIHdpdGggZGlmZmVyZW50IG5hbWVzLg0KDQogICAgICAgIFlvdSBjYW4gYWxzbyBzZXQgcmVzdWx0cyBuYW1lcyB1c2luZyB0aGUgYWJicmV2aWF0ZWQgc3ludGF4LA0KICAgICAgICBDe2V4cHIoIm5hbWUiKX0gaW4gcGxhY2Ugb2YgQ3tleHByLnNldFJlc3VsdHNOYW1lKCJuYW1lIil9IC0gDQogICAgICAgIHNlZSBMe0l7X19jYWxsX199PF9fY2FsbF9fPn0uDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBkYXRlX3N0ciA9IChpbnRlZ2VyLnNldFJlc3VsdHNOYW1lKCJ5ZWFyIikgKyAnLycgDQogICAgICAgICAgICAgICAgICAgICAgICArIGludGVnZXIuc2V0UmVzdWx0c05hbWUoIm1vbnRoIikgKyAnLycgDQogICAgICAgICAgICAgICAgICAgICAgICArIGludGVnZXIuc2V0UmVzdWx0c05hbWUoImRheSIpKQ0KDQogICAgICAgICAgICAjIGVxdWl2YWxlbnQgZm9ybToNCiAgICAgICAgICAgIGRhdGVfc3RyID0gaW50ZWdlcigieWVhciIpICsgJy8nICsgaW50ZWdlcigibW9udGgiKSArICcvJyArIGludGVnZXIoImRheSIpDQogICAgICAgICIiIg0KICAgICAgICBuZXdzZWxmID0gc2VsZi5jb3B5KCkNCiAgICAgICAgaWYgbmFtZS5lbmRzd2l0aCgiKiIpOg0KICAgICAgICAgICAgbmFtZSA9IG5hbWVbOi0xXQ0KICAgICAgICAgICAgbGlzdEFsbE1hdGNoZXM9VHJ1ZQ0KICAgICAgICBuZXdzZWxmLnJlc3VsdHNOYW1lID0gbmFtZQ0KICAgICAgICBuZXdzZWxmLm1vZGFsUmVzdWx0cyA9IG5vdCBsaXN0QWxsTWF0Y2hlcw0KICAgICAgICByZXR1cm4gbmV3c2VsZg0KDQogICAgZGVmIHNldEJyZWFrKHNlbGYsYnJlYWtGbGFnID0gVHJ1ZSk6DQogICAgICAgICIiIk1ldGhvZCB0byBpbnZva2UgdGhlIFB5dGhvbiBwZGIgZGVidWdnZXIgd2hlbiB0aGlzIGVsZW1lbnQgaXMNCiAgICAgICAgICAgYWJvdXQgdG8gYmUgcGFyc2VkLiBTZXQgQ3ticmVha0ZsYWd9IHRvIFRydWUgdG8gZW5hYmxlLCBGYWxzZSB0bw0KICAgICAgICAgICBkaXNhYmxlLg0KICAgICAgICAiIiINCiAgICAgICAgaWYgYnJlYWtGbGFnOg0KICAgICAgICAgICAgX3BhcnNlTWV0aG9kID0gc2VsZi5fcGFyc2UNCiAgICAgICAgICAgIGRlZiBicmVha2VyKGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlLCBjYWxsUHJlUGFyc2U9VHJ1ZSk6DQogICAgICAgICAgICAgICAgaW1wb3J0IHBkYg0KICAgICAgICAgICAgICAgIHBkYi5zZXRfdHJhY2UoKQ0KICAgICAgICAgICAgICAgIHJldHVybiBfcGFyc2VNZXRob2QoIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucywgY2FsbFByZVBhcnNlICkNCiAgICAgICAgICAgIGJyZWFrZXIuX29yaWdpbmFsUGFyc2VNZXRob2QgPSBfcGFyc2VNZXRob2QNCiAgICAgICAgICAgIHNlbGYuX3BhcnNlID0gYnJlYWtlcg0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgaWYgaGFzYXR0cihzZWxmLl9wYXJzZSwiX29yaWdpbmFsUGFyc2VNZXRob2QiKToNCiAgICAgICAgICAgICAgICBzZWxmLl9wYXJzZSA9IHNlbGYuX3BhcnNlLl9vcmlnaW5hbFBhcnNlTWV0aG9kDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgc2V0UGFyc2VBY3Rpb24oIHNlbGYsICpmbnMsICoqa3dhcmdzICk6DQogICAgICAgICIiIg0KICAgICAgICBEZWZpbmUgb25lIG9yIG1vcmUgYWN0aW9ucyB0byBwZXJmb3JtIHdoZW4gc3VjY2Vzc2Z1bGx5IG1hdGNoaW5nIHBhcnNlIGVsZW1lbnQgZGVmaW5pdGlvbi4NCiAgICAgICAgUGFyc2UgYWN0aW9uIGZuIGlzIGEgY2FsbGFibGUgbWV0aG9kIHdpdGggMC0zIGFyZ3VtZW50cywgY2FsbGVkIGFzIEN7Zm4ocyxsb2MsdG9rcyl9LA0KICAgICAgICBDe2ZuKGxvYyx0b2tzKX0sIEN7Zm4odG9rcyl9LCBvciBqdXN0IEN7Zm4oKX0sIHdoZXJlOg0KICAgICAgICAgLSBzICAgPSB0aGUgb3JpZ2luYWwgc3RyaW5nIGJlaW5nIHBhcnNlZCAoc2VlIG5vdGUgYmVsb3cpDQogICAgICAgICAtIGxvYyA9IHRoZSBsb2NhdGlvbiBvZiB0aGUgbWF0Y2hpbmcgc3Vic3RyaW5nDQogICAgICAgICAtIHRva3MgPSBhIGxpc3Qgb2YgdGhlIG1hdGNoZWQgdG9rZW5zLCBwYWNrYWdlZCBhcyBhIEN7THtQYXJzZVJlc3VsdHN9fSBvYmplY3QNCiAgICAgICAgSWYgdGhlIGZ1bmN0aW9ucyBpbiBmbnMgbW9kaWZ5IHRoZSB0b2tlbnMsIHRoZXkgY2FuIHJldHVybiB0aGVtIGFzIHRoZSByZXR1cm4NCiAgICAgICAgdmFsdWUgZnJvbSBmbiwgYW5kIHRoZSBtb2RpZmllZCBsaXN0IG9mIHRva2VucyB3aWxsIHJlcGxhY2UgdGhlIG9yaWdpbmFsLg0KICAgICAgICBPdGhlcndpc2UsIGZuIGRvZXMgbm90IG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZS4NCg0KICAgICAgICBPcHRpb25hbCBrZXl3b3JkIGFyZ3VtZW50czoNCiAgICAgICAgIC0gY2FsbER1cmluZ1RyeSA9IChkZWZhdWx0PUN7RmFsc2V9KSBpbmRpY2F0ZSBpZiBwYXJzZSBhY3Rpb24gc2hvdWxkIGJlIHJ1biBkdXJpbmcgbG9va2FoZWFkcyBhbmQgYWx0ZXJuYXRlIHRlc3RpbmcNCg0KICAgICAgICBOb3RlOiB0aGUgZGVmYXVsdCBwYXJzaW5nIGJlaGF2aW9yIGlzIHRvIGV4cGFuZCB0YWJzIGluIHRoZSBpbnB1dCBzdHJpbmcNCiAgICAgICAgYmVmb3JlIHN0YXJ0aW5nIHRoZSBwYXJzaW5nIHByb2Nlc3MuICBTZWUgTHtJe3BhcnNlU3RyaW5nfTxwYXJzZVN0cmluZz59IGZvciBtb3JlIGluZm9ybWF0aW9uDQogICAgICAgIG9uIHBhcnNpbmcgc3RyaW5ncyBjb250YWluaW5nIEN7PFRBQj59cywgYW5kIHN1Z2dlc3RlZCBtZXRob2RzIHRvIG1haW50YWluIGENCiAgICAgICAgY29uc2lzdGVudCB2aWV3IG9mIHRoZSBwYXJzZWQgc3RyaW5nLCB0aGUgcGFyc2UgbG9jYXRpb24sIGFuZCBsaW5lIGFuZCBjb2x1bW4NCiAgICAgICAgcG9zaXRpb25zIHdpdGhpbiB0aGUgcGFyc2VkIHN0cmluZy4NCiAgICAgICAgDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykNCiAgICAgICAgICAgIGRhdGVfc3RyID0gaW50ZWdlciArICcvJyArIGludGVnZXIgKyAnLycgKyBpbnRlZ2VyDQoNCiAgICAgICAgICAgIGRhdGVfc3RyLnBhcnNlU3RyaW5nKCIxOTk5LzEyLzMxIikgICMgLT4gWycxOTk5JywgJy8nLCAnMTInLCAnLycsICczMSddDQoNCiAgICAgICAgICAgICMgdXNlIHBhcnNlIGFjdGlvbiB0byBjb252ZXJ0IHRvIGludHMgYXQgcGFyc2UgdGltZQ0KICAgICAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHRva3M6IGludCh0b2tzWzBdKSkNCiAgICAgICAgICAgIGRhdGVfc3RyID0gaW50ZWdlciArICcvJyArIGludGVnZXIgKyAnLycgKyBpbnRlZ2VyDQoNCiAgICAgICAgICAgICMgbm90ZSB0aGF0IGludGVnZXIgZmllbGRzIGFyZSBub3cgaW50cywgbm90IHN0cmluZ3MNCiAgICAgICAgICAgIGRhdGVfc3RyLnBhcnNlU3RyaW5nKCIxOTk5LzEyLzMxIikgICMgLT4gWzE5OTksICcvJywgMTIsICcvJywgMzFdDQogICAgICAgICIiIg0KICAgICAgICBzZWxmLnBhcnNlQWN0aW9uID0gbGlzdChtYXAoX3RyaW1fYXJpdHksIGxpc3QoZm5zKSkpDQogICAgICAgIHNlbGYuY2FsbER1cmluZ1RyeSA9IGt3YXJncy5nZXQoImNhbGxEdXJpbmdUcnkiLCBGYWxzZSkNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBhZGRQYXJzZUFjdGlvbiggc2VsZiwgKmZucywgKiprd2FyZ3MgKToNCiAgICAgICAgIiIiDQogICAgICAgIEFkZCBvbmUgb3IgbW9yZSBwYXJzZSBhY3Rpb25zIHRvIGV4cHJlc3Npb24ncyBsaXN0IG9mIHBhcnNlIGFjdGlvbnMuIFNlZSBMe0l7c2V0UGFyc2VBY3Rpb259PHNldFBhcnNlQWN0aW9uPn0uDQogICAgICAgIA0KICAgICAgICBTZWUgZXhhbXBsZXMgaW4gTHtJe2NvcHl9PGNvcHk+fS4NCiAgICAgICAgIiIiDQogICAgICAgIHNlbGYucGFyc2VBY3Rpb24gKz0gbGlzdChtYXAoX3RyaW1fYXJpdHksIGxpc3QoZm5zKSkpDQogICAgICAgIHNlbGYuY2FsbER1cmluZ1RyeSA9IHNlbGYuY2FsbER1cmluZ1RyeSBvciBrd2FyZ3MuZ2V0KCJjYWxsRHVyaW5nVHJ5IiwgRmFsc2UpDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgYWRkQ29uZGl0aW9uKHNlbGYsICpmbnMsICoqa3dhcmdzKToNCiAgICAgICAgIiIiQWRkIGEgYm9vbGVhbiBwcmVkaWNhdGUgZnVuY3Rpb24gdG8gZXhwcmVzc2lvbidzIGxpc3Qgb2YgcGFyc2UgYWN0aW9ucy4gU2VlIA0KICAgICAgICBMe0l7c2V0UGFyc2VBY3Rpb259PHNldFBhcnNlQWN0aW9uPn0gZm9yIGZ1bmN0aW9uIGNhbGwgc2lnbmF0dXJlcy4gVW5saWtlIEN7c2V0UGFyc2VBY3Rpb259LCANCiAgICAgICAgZnVuY3Rpb25zIHBhc3NlZCB0byBDe2FkZENvbmRpdGlvbn0gbmVlZCB0byByZXR1cm4gYm9vbGVhbiBzdWNjZXNzL2ZhaWwgb2YgdGhlIGNvbmRpdGlvbi4NCg0KICAgICAgICBPcHRpb25hbCBrZXl3b3JkIGFyZ3VtZW50czoNCiAgICAgICAgIC0gbWVzc2FnZSA9IGRlZmluZSBhIGN1c3RvbSBtZXNzYWdlIHRvIGJlIHVzZWQgaW4gdGhlIHJhaXNlZCBleGNlcHRpb24NCiAgICAgICAgIC0gZmF0YWwgICA9IGlmIFRydWUsIHdpbGwgcmFpc2UgUGFyc2VGYXRhbEV4Y2VwdGlvbiB0byBzdG9wIHBhcnNpbmcgaW1tZWRpYXRlbHk7IG90aGVyd2lzZSB3aWxsIHJhaXNlIFBhcnNlRXhjZXB0aW9uDQogICAgICAgICANCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdG9rczogaW50KHRva3NbMF0pKQ0KICAgICAgICAgICAgeWVhcl9pbnQgPSBpbnRlZ2VyLmNvcHkoKQ0KICAgICAgICAgICAgeWVhcl9pbnQuYWRkQ29uZGl0aW9uKGxhbWJkYSB0b2tzOiB0b2tzWzBdID49IDIwMDAsIG1lc3NhZ2U9Ik9ubHkgc3VwcG9ydCB5ZWFycyAyMDAwIGFuZCBsYXRlciIpDQogICAgICAgICAgICBkYXRlX3N0ciA9IHllYXJfaW50ICsgJy8nICsgaW50ZWdlciArICcvJyArIGludGVnZXINCg0KICAgICAgICAgICAgcmVzdWx0ID0gZGF0ZV9zdHIucGFyc2VTdHJpbmcoIjE5OTkvMTIvMzEiKSAgIyAtPiBFeGNlcHRpb246IE9ubHkgc3VwcG9ydCB5ZWFycyAyMDAwIGFuZCBsYXRlciAoYXQgY2hhciAwKSwgKGxpbmU6MSwgY29sOjEpDQogICAgICAgICIiIg0KICAgICAgICBtc2cgPSBrd2FyZ3MuZ2V0KCJtZXNzYWdlIiwgImZhaWxlZCB1c2VyLWRlZmluZWQgY29uZGl0aW9uIikNCiAgICAgICAgZXhjX3R5cGUgPSBQYXJzZUZhdGFsRXhjZXB0aW9uIGlmIGt3YXJncy5nZXQoImZhdGFsIiwgRmFsc2UpIGVsc2UgUGFyc2VFeGNlcHRpb24NCiAgICAgICAgZm9yIGZuIGluIGZuczoNCiAgICAgICAgICAgIGRlZiBwYShzLGwsdCk6DQogICAgICAgICAgICAgICAgaWYgbm90IGJvb2woX3RyaW1fYXJpdHkoZm4pKHMsbCx0KSk6DQogICAgICAgICAgICAgICAgICAgIHJhaXNlIGV4Y190eXBlKHMsbCxtc2cpDQogICAgICAgICAgICBzZWxmLnBhcnNlQWN0aW9uLmFwcGVuZChwYSkNCiAgICAgICAgc2VsZi5jYWxsRHVyaW5nVHJ5ID0gc2VsZi5jYWxsRHVyaW5nVHJ5IG9yIGt3YXJncy5nZXQoImNhbGxEdXJpbmdUcnkiLCBGYWxzZSkNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBzZXRGYWlsQWN0aW9uKCBzZWxmLCBmbiApOg0KICAgICAgICAiIiJEZWZpbmUgYWN0aW9uIHRvIHBlcmZvcm0gaWYgcGFyc2luZyBmYWlscyBhdCB0aGlzIGV4cHJlc3Npb24uDQogICAgICAgICAgIEZhaWwgYWN0b24gZm4gaXMgYSBjYWxsYWJsZSBmdW5jdGlvbiB0aGF0IHRha2VzIHRoZSBhcmd1bWVudHMNCiAgICAgICAgICAgQ3tmbihzLGxvYyxleHByLGVycil9IHdoZXJlOg0KICAgICAgICAgICAgLSBzID0gc3RyaW5nIGJlaW5nIHBhcnNlZA0KICAgICAgICAgICAgLSBsb2MgPSBsb2NhdGlvbiB3aGVyZSBleHByZXNzaW9uIG1hdGNoIHdhcyBhdHRlbXB0ZWQgYW5kIGZhaWxlZA0KICAgICAgICAgICAgLSBleHByID0gdGhlIHBhcnNlIGV4cHJlc3Npb24gdGhhdCBmYWlsZWQNCiAgICAgICAgICAgIC0gZXJyID0gdGhlIGV4Y2VwdGlvbiB0aHJvd24NCiAgICAgICAgICAgVGhlIGZ1bmN0aW9uIHJldHVybnMgbm8gdmFsdWUuICBJdCBtYXkgdGhyb3cgQ3tMe1BhcnNlRmF0YWxFeGNlcHRpb259fQ0KICAgICAgICAgICBpZiBpdCBpcyBkZXNpcmVkIHRvIHN0b3AgcGFyc2luZyBpbW1lZGlhdGVseS4iIiINCiAgICAgICAgc2VsZi5mYWlsQWN0aW9uID0gZm4NCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBfc2tpcElnbm9yYWJsZXMoIHNlbGYsIGluc3RyaW5nLCBsb2MgKToNCiAgICAgICAgZXhwcnNGb3VuZCA9IFRydWUNCiAgICAgICAgd2hpbGUgZXhwcnNGb3VuZDoNCiAgICAgICAgICAgIGV4cHJzRm91bmQgPSBGYWxzZQ0KICAgICAgICAgICAgZm9yIGUgaW4gc2VsZi5pZ25vcmVFeHByczoNCiAgICAgICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgICAgIHdoaWxlIDE6DQogICAgICAgICAgICAgICAgICAgICAgICBsb2MsZHVtbXkgPSBlLl9wYXJzZSggaW5zdHJpbmcsIGxvYyApDQogICAgICAgICAgICAgICAgICAgICAgICBleHByc0ZvdW5kID0gVHJ1ZQ0KICAgICAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUV4Y2VwdGlvbjoNCiAgICAgICAgICAgICAgICAgICAgcGFzcw0KICAgICAgICByZXR1cm4gbG9jDQoNCiAgICBkZWYgcHJlUGFyc2UoIHNlbGYsIGluc3RyaW5nLCBsb2MgKToNCiAgICAgICAgaWYgc2VsZi5pZ25vcmVFeHByczoNCiAgICAgICAgICAgIGxvYyA9IHNlbGYuX3NraXBJZ25vcmFibGVzKCBpbnN0cmluZywgbG9jICkNCg0KICAgICAgICBpZiBzZWxmLnNraXBXaGl0ZXNwYWNlOg0KICAgICAgICAgICAgd3QgPSBzZWxmLndoaXRlQ2hhcnMNCiAgICAgICAgICAgIGluc3RybGVuID0gbGVuKGluc3RyaW5nKQ0KICAgICAgICAgICAgd2hpbGUgbG9jIDwgaW5zdHJsZW4gYW5kIGluc3RyaW5nW2xvY10gaW4gd3Q6DQogICAgICAgICAgICAgICAgbG9jICs9IDENCg0KICAgICAgICByZXR1cm4gbG9jDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICByZXR1cm4gbG9jLCBbXQ0KDQogICAgZGVmIHBvc3RQYXJzZSggc2VsZiwgaW5zdHJpbmcsIGxvYywgdG9rZW5saXN0ICk6DQogICAgICAgIHJldHVybiB0b2tlbmxpc3QNCg0KICAgICN+IEBwcm9maWxlDQogICAgZGVmIF9wYXJzZU5vQ2FjaGUoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlLCBjYWxsUHJlUGFyc2U9VHJ1ZSApOg0KICAgICAgICBkZWJ1Z2dpbmcgPSAoIHNlbGYuZGVidWcgKSAjYW5kIGRvQWN0aW9ucyApDQoNCiAgICAgICAgaWYgZGVidWdnaW5nIG9yIHNlbGYuZmFpbEFjdGlvbjoNCiAgICAgICAgICAgICN+IHByaW50ICgiTWF0Y2giLHNlbGYsImF0IGxvYyIsbG9jLCIoJWQsJWQpIiAlICggbGluZW5vKGxvYyxpbnN0cmluZyksIGNvbChsb2MsaW5zdHJpbmcpICkpDQogICAgICAgICAgICBpZiAoc2VsZi5kZWJ1Z0FjdGlvbnNbMF0gKToNCiAgICAgICAgICAgICAgICBzZWxmLmRlYnVnQWN0aW9uc1swXSggaW5zdHJpbmcsIGxvYywgc2VsZiApDQogICAgICAgICAgICBpZiBjYWxsUHJlUGFyc2UgYW5kIHNlbGYuY2FsbFByZXBhcnNlOg0KICAgICAgICAgICAgICAgIHByZWxvYyA9IHNlbGYucHJlUGFyc2UoIGluc3RyaW5nLCBsb2MgKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBwcmVsb2MgPSBsb2MNCiAgICAgICAgICAgIHRva2Vuc1N0YXJ0ID0gcHJlbG9jDQogICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgICAgICBsb2MsdG9rZW5zID0gc2VsZi5wYXJzZUltcGwoIGluc3RyaW5nLCBwcmVsb2MsIGRvQWN0aW9ucyApDQogICAgICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6DQogICAgICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKCBpbnN0cmluZywgbGVuKGluc3RyaW5nKSwgc2VsZi5lcnJtc2csIHNlbGYgKQ0KICAgICAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbiBhcyBlcnI6DQogICAgICAgICAgICAgICAgI34gcHJpbnQgKCJFeGNlcHRpb24gcmFpc2VkOiIsIGVycikNCiAgICAgICAgICAgICAgICBpZiBzZWxmLmRlYnVnQWN0aW9uc1syXToNCiAgICAgICAgICAgICAgICAgICAgc2VsZi5kZWJ1Z0FjdGlvbnNbMl0oIGluc3RyaW5nLCB0b2tlbnNTdGFydCwgc2VsZiwgZXJyICkNCiAgICAgICAgICAgICAgICBpZiBzZWxmLmZhaWxBY3Rpb246DQogICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbEFjdGlvbiggaW5zdHJpbmcsIHRva2Vuc1N0YXJ0LCBzZWxmLCBlcnIgKQ0KICAgICAgICAgICAgICAgIHJhaXNlDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBpZiBjYWxsUHJlUGFyc2UgYW5kIHNlbGYuY2FsbFByZXBhcnNlOg0KICAgICAgICAgICAgICAgIHByZWxvYyA9IHNlbGYucHJlUGFyc2UoIGluc3RyaW5nLCBsb2MgKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBwcmVsb2MgPSBsb2MNCiAgICAgICAgICAgIHRva2Vuc1N0YXJ0ID0gcHJlbG9jDQogICAgICAgICAgICBpZiBzZWxmLm1heUluZGV4RXJyb3Igb3IgcHJlbG9jID49IGxlbihpbnN0cmluZyk6DQogICAgICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgICAgICBsb2MsdG9rZW5zID0gc2VsZi5wYXJzZUltcGwoIGluc3RyaW5nLCBwcmVsb2MsIGRvQWN0aW9ucyApDQogICAgICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6DQogICAgICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKCBpbnN0cmluZywgbGVuKGluc3RyaW5nKSwgc2VsZi5lcnJtc2csIHNlbGYgKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBsb2MsdG9rZW5zID0gc2VsZi5wYXJzZUltcGwoIGluc3RyaW5nLCBwcmVsb2MsIGRvQWN0aW9ucyApDQoNCiAgICAgICAgdG9rZW5zID0gc2VsZi5wb3N0UGFyc2UoIGluc3RyaW5nLCBsb2MsIHRva2VucyApDQoNCiAgICAgICAgcmV0VG9rZW5zID0gUGFyc2VSZXN1bHRzKCB0b2tlbnMsIHNlbGYucmVzdWx0c05hbWUsIGFzTGlzdD1zZWxmLnNhdmVBc0xpc3QsIG1vZGFsPXNlbGYubW9kYWxSZXN1bHRzICkNCiAgICAgICAgaWYgc2VsZi5wYXJzZUFjdGlvbiBhbmQgKGRvQWN0aW9ucyBvciBzZWxmLmNhbGxEdXJpbmdUcnkpOg0KICAgICAgICAgICAgaWYgZGVidWdnaW5nOg0KICAgICAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICAgICAgZm9yIGZuIGluIHNlbGYucGFyc2VBY3Rpb246DQogICAgICAgICAgICAgICAgICAgICAgICB0b2tlbnMgPSBmbiggaW5zdHJpbmcsIHRva2Vuc1N0YXJ0LCByZXRUb2tlbnMgKQ0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgdG9rZW5zIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFRva2VucyA9IFBhcnNlUmVzdWx0cyggdG9rZW5zLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXN1bHRzTmFtZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzTGlzdD1zZWxmLnNhdmVBc0xpc3QgYW5kIGlzaW5zdGFuY2UodG9rZW5zLChQYXJzZVJlc3VsdHMsbGlzdCkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kYWw9c2VsZi5tb2RhbFJlc3VsdHMgKQ0KICAgICAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb24gYXMgZXJyOg0KICAgICAgICAgICAgICAgICAgICAjfiBwcmludCAiRXhjZXB0aW9uIHJhaXNlZCBpbiB1c2VyIHBhcnNlIGFjdGlvbjoiLCBlcnINCiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZGVidWdBY3Rpb25zWzJdICk6DQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRlYnVnQWN0aW9uc1syXSggaW5zdHJpbmcsIHRva2Vuc1N0YXJ0LCBzZWxmLCBlcnIgKQ0KICAgICAgICAgICAgICAgICAgICByYWlzZQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBmb3IgZm4gaW4gc2VsZi5wYXJzZUFjdGlvbjoNCiAgICAgICAgICAgICAgICAgICAgdG9rZW5zID0gZm4oIGluc3RyaW5nLCB0b2tlbnNTdGFydCwgcmV0VG9rZW5zICkNCiAgICAgICAgICAgICAgICAgICAgaWYgdG9rZW5zIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0VG9rZW5zID0gUGFyc2VSZXN1bHRzKCB0b2tlbnMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVzdWx0c05hbWUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzTGlzdD1zZWxmLnNhdmVBc0xpc3QgYW5kIGlzaW5zdGFuY2UodG9rZW5zLChQYXJzZVJlc3VsdHMsbGlzdCkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RhbD1zZWxmLm1vZGFsUmVzdWx0cyApDQogICAgICAgIGlmIGRlYnVnZ2luZzoNCiAgICAgICAgICAgICN+IHByaW50ICgiTWF0Y2hlZCIsc2VsZiwiLT4iLHJldFRva2Vucy5hc0xpc3QoKSkNCiAgICAgICAgICAgIGlmIChzZWxmLmRlYnVnQWN0aW9uc1sxXSApOg0KICAgICAgICAgICAgICAgIHNlbGYuZGVidWdBY3Rpb25zWzFdKCBpbnN0cmluZywgdG9rZW5zU3RhcnQsIGxvYywgc2VsZiwgcmV0VG9rZW5zICkNCg0KICAgICAgICByZXR1cm4gbG9jLCByZXRUb2tlbnMNCg0KICAgIGRlZiB0cnlQYXJzZSggc2VsZiwgaW5zdHJpbmcsIGxvYyApOg0KICAgICAgICB0cnk6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5fcGFyc2UoIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1GYWxzZSApWzBdDQogICAgICAgIGV4Y2VwdCBQYXJzZUZhdGFsRXhjZXB0aW9uOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oIGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KICAgIA0KICAgIGRlZiBjYW5QYXJzZU5leHQoc2VsZiwgaW5zdHJpbmcsIGxvYyk6DQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHNlbGYudHJ5UGFyc2UoaW5zdHJpbmcsIGxvYykNCiAgICAgICAgZXhjZXB0IChQYXJzZUV4Y2VwdGlvbiwgSW5kZXhFcnJvcik6DQogICAgICAgICAgICByZXR1cm4gRmFsc2UNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJldHVybiBUcnVlDQoNCiAgICBjbGFzcyBfVW5ib3VuZGVkQ2FjaGUob2JqZWN0KToNCiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOg0KICAgICAgICAgICAgY2FjaGUgPSB7fQ0KICAgICAgICAgICAgc2VsZi5ub3RfaW5fY2FjaGUgPSBub3RfaW5fY2FjaGUgPSBvYmplY3QoKQ0KDQogICAgICAgICAgICBkZWYgZ2V0KHNlbGYsIGtleSk6DQogICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlLmdldChrZXksIG5vdF9pbl9jYWNoZSkNCg0KICAgICAgICAgICAgZGVmIHNldChzZWxmLCBrZXksIHZhbHVlKToNCiAgICAgICAgICAgICAgICBjYWNoZVtrZXldID0gdmFsdWUNCg0KICAgICAgICAgICAgZGVmIGNsZWFyKHNlbGYpOg0KICAgICAgICAgICAgICAgIGNhY2hlLmNsZWFyKCkNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgIGRlZiBjYWNoZV9sZW4oc2VsZik6DQogICAgICAgICAgICAgICAgcmV0dXJuIGxlbihjYWNoZSkNCg0KICAgICAgICAgICAgc2VsZi5nZXQgPSB0eXBlcy5NZXRob2RUeXBlKGdldCwgc2VsZikNCiAgICAgICAgICAgIHNlbGYuc2V0ID0gdHlwZXMuTWV0aG9kVHlwZShzZXQsIHNlbGYpDQogICAgICAgICAgICBzZWxmLmNsZWFyID0gdHlwZXMuTWV0aG9kVHlwZShjbGVhciwgc2VsZikNCiAgICAgICAgICAgIHNlbGYuX19sZW5fXyA9IHR5cGVzLk1ldGhvZFR5cGUoY2FjaGVfbGVuLCBzZWxmKQ0KDQogICAgaWYgX09yZGVyZWREaWN0IGlzIG5vdCBOb25lOg0KICAgICAgICBjbGFzcyBfRmlmb0NhY2hlKG9iamVjdCk6DQogICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgc2l6ZSk6DQogICAgICAgICAgICAgICAgc2VsZi5ub3RfaW5fY2FjaGUgPSBub3RfaW5fY2FjaGUgPSBvYmplY3QoKQ0KDQogICAgICAgICAgICAgICAgY2FjaGUgPSBfT3JkZXJlZERpY3QoKQ0KDQogICAgICAgICAgICAgICAgZGVmIGdldChzZWxmLCBrZXkpOg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGUuZ2V0KGtleSwgbm90X2luX2NhY2hlKQ0KDQogICAgICAgICAgICAgICAgZGVmIHNldChzZWxmLCBrZXksIHZhbHVlKToNCiAgICAgICAgICAgICAgICAgICAgY2FjaGVba2V5XSA9IHZhbHVlDQogICAgICAgICAgICAgICAgICAgIHdoaWxlIGxlbihjYWNoZSkgPiBzaXplOg0KICAgICAgICAgICAgICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlLnBvcGl0ZW0oRmFsc2UpDQogICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzcw0KDQogICAgICAgICAgICAgICAgZGVmIGNsZWFyKHNlbGYpOg0KICAgICAgICAgICAgICAgICAgICBjYWNoZS5jbGVhcigpDQoNCiAgICAgICAgICAgICAgICBkZWYgY2FjaGVfbGVuKHNlbGYpOg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGVuKGNhY2hlKQ0KDQogICAgICAgICAgICAgICAgc2VsZi5nZXQgPSB0eXBlcy5NZXRob2RUeXBlKGdldCwgc2VsZikNCiAgICAgICAgICAgICAgICBzZWxmLnNldCA9IHR5cGVzLk1ldGhvZFR5cGUoc2V0LCBzZWxmKQ0KICAgICAgICAgICAgICAgIHNlbGYuY2xlYXIgPSB0eXBlcy5NZXRob2RUeXBlKGNsZWFyLCBzZWxmKQ0KICAgICAgICAgICAgICAgIHNlbGYuX19sZW5fXyA9IHR5cGVzLk1ldGhvZFR5cGUoY2FjaGVfbGVuLCBzZWxmKQ0KDQogICAgZWxzZToNCiAgICAgICAgY2xhc3MgX0ZpZm9DYWNoZShvYmplY3QpOg0KICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNpemUpOg0KICAgICAgICAgICAgICAgIHNlbGYubm90X2luX2NhY2hlID0gbm90X2luX2NhY2hlID0gb2JqZWN0KCkNCg0KICAgICAgICAgICAgICAgIGNhY2hlID0ge30NCiAgICAgICAgICAgICAgICBrZXlfZmlmbyA9IGNvbGxlY3Rpb25zLmRlcXVlKFtdLCBzaXplKQ0KDQogICAgICAgICAgICAgICAgZGVmIGdldChzZWxmLCBrZXkpOg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGUuZ2V0KGtleSwgbm90X2luX2NhY2hlKQ0KDQogICAgICAgICAgICAgICAgZGVmIHNldChzZWxmLCBrZXksIHZhbHVlKToNCiAgICAgICAgICAgICAgICAgICAgY2FjaGVba2V5XSA9IHZhbHVlDQogICAgICAgICAgICAgICAgICAgIHdoaWxlIGxlbihrZXlfZmlmbykgPiBzaXplOg0KICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUucG9wKGtleV9maWZvLnBvcGxlZnQoKSwgTm9uZSkNCiAgICAgICAgICAgICAgICAgICAga2V5X2ZpZm8uYXBwZW5kKGtleSkNCg0KICAgICAgICAgICAgICAgIGRlZiBjbGVhcihzZWxmKToNCiAgICAgICAgICAgICAgICAgICAgY2FjaGUuY2xlYXIoKQ0KICAgICAgICAgICAgICAgICAgICBrZXlfZmlmby5jbGVhcigpDQoNCiAgICAgICAgICAgICAgICBkZWYgY2FjaGVfbGVuKHNlbGYpOg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGVuKGNhY2hlKQ0KDQogICAgICAgICAgICAgICAgc2VsZi5nZXQgPSB0eXBlcy5NZXRob2RUeXBlKGdldCwgc2VsZikNCiAgICAgICAgICAgICAgICBzZWxmLnNldCA9IHR5cGVzLk1ldGhvZFR5cGUoc2V0LCBzZWxmKQ0KICAgICAgICAgICAgICAgIHNlbGYuY2xlYXIgPSB0eXBlcy5NZXRob2RUeXBlKGNsZWFyLCBzZWxmKQ0KICAgICAgICAgICAgICAgIHNlbGYuX19sZW5fXyA9IHR5cGVzLk1ldGhvZFR5cGUoY2FjaGVfbGVuLCBzZWxmKQ0KDQogICAgIyBhcmd1bWVudCBjYWNoZSBmb3Igb3B0aW1pemluZyByZXBlYXRlZCBjYWxscyB3aGVuIGJhY2t0cmFja2luZyB0aHJvdWdoIHJlY3Vyc2l2ZSBleHByZXNzaW9ucw0KICAgIHBhY2tyYXRfY2FjaGUgPSB7fSAjIHRoaXMgaXMgc2V0IGxhdGVyIGJ5IGVuYWJsZWRQYWNrcmF0KCk7IHRoaXMgaXMgaGVyZSBzbyB0aGF0IHJlc2V0Q2FjaGUoKSBkb2Vzbid0IGZhaWwNCiAgICBwYWNrcmF0X2NhY2hlX2xvY2sgPSBSTG9jaygpDQogICAgcGFja3JhdF9jYWNoZV9zdGF0cyA9IFswLCAwXQ0KDQogICAgIyB0aGlzIG1ldGhvZCBnZXRzIHJlcGVhdGVkbHkgY2FsbGVkIGR1cmluZyBiYWNrdHJhY2tpbmcgd2l0aCB0aGUgc2FtZSBhcmd1bWVudHMgLQ0KICAgICMgd2UgY2FuIGNhY2hlIHRoZXNlIGFyZ3VtZW50cyBhbmQgc2F2ZSBvdXJzZWx2ZXMgdGhlIHRyb3VibGUgb2YgcmUtcGFyc2luZyB0aGUgY29udGFpbmVkIGV4cHJlc3Npb24NCiAgICBkZWYgX3BhcnNlQ2FjaGUoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlLCBjYWxsUHJlUGFyc2U9VHJ1ZSApOg0KICAgICAgICBISVQsIE1JU1MgPSAwLCAxDQogICAgICAgIGxvb2t1cCA9IChzZWxmLCBpbnN0cmluZywgbG9jLCBjYWxsUHJlUGFyc2UsIGRvQWN0aW9ucykNCiAgICAgICAgd2l0aCBQYXJzZXJFbGVtZW50LnBhY2tyYXRfY2FjaGVfbG9jazoNCiAgICAgICAgICAgIGNhY2hlID0gUGFyc2VyRWxlbWVudC5wYWNrcmF0X2NhY2hlDQogICAgICAgICAgICB2YWx1ZSA9IGNhY2hlLmdldChsb29rdXApDQogICAgICAgICAgICBpZiB2YWx1ZSBpcyBjYWNoZS5ub3RfaW5fY2FjaGU6DQogICAgICAgICAgICAgICAgUGFyc2VyRWxlbWVudC5wYWNrcmF0X2NhY2hlX3N0YXRzW01JU1NdICs9IDENCiAgICAgICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc2VsZi5fcGFyc2VOb0NhY2hlKGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucywgY2FsbFByZVBhcnNlKQ0KICAgICAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb24gYXMgcGU6DQogICAgICAgICAgICAgICAgICAgICMgY2FjaGUgYSBjb3B5IG9mIHRoZSBleGNlcHRpb24sIHdpdGhvdXQgdGhlIHRyYWNlYmFjaw0KICAgICAgICAgICAgICAgICAgICBjYWNoZS5zZXQobG9va3VwLCBwZS5fX2NsYXNzX18oKnBlLmFyZ3MpKQ0KICAgICAgICAgICAgICAgICAgICByYWlzZQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIGNhY2hlLnNldChsb29rdXAsICh2YWx1ZVswXSwgdmFsdWVbMV0uY29weSgpKSkNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIFBhcnNlckVsZW1lbnQucGFja3JhdF9jYWNoZV9zdGF0c1tISVRdICs9IDENCiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBFeGNlcHRpb24pOg0KICAgICAgICAgICAgICAgICAgICByYWlzZSB2YWx1ZQ0KICAgICAgICAgICAgICAgIHJldHVybiAodmFsdWVbMF0sIHZhbHVlWzFdLmNvcHkoKSkNCg0KICAgIF9wYXJzZSA9IF9wYXJzZU5vQ2FjaGUNCg0KICAgIEBzdGF0aWNtZXRob2QNCiAgICBkZWYgcmVzZXRDYWNoZSgpOg0KICAgICAgICBQYXJzZXJFbGVtZW50LnBhY2tyYXRfY2FjaGUuY2xlYXIoKQ0KICAgICAgICBQYXJzZXJFbGVtZW50LnBhY2tyYXRfY2FjaGVfc3RhdHNbOl0gPSBbMF0gKiBsZW4oUGFyc2VyRWxlbWVudC5wYWNrcmF0X2NhY2hlX3N0YXRzKQ0KDQogICAgX3BhY2tyYXRFbmFibGVkID0gRmFsc2UNCiAgICBAc3RhdGljbWV0aG9kDQogICAgZGVmIGVuYWJsZVBhY2tyYXQoY2FjaGVfc2l6ZV9saW1pdD0xMjgpOg0KICAgICAgICAiIiJFbmFibGVzICJwYWNrcmF0IiBwYXJzaW5nLCB3aGljaCBhZGRzIG1lbW9pemluZyB0byB0aGUgcGFyc2luZyBsb2dpYy4NCiAgICAgICAgICAgUmVwZWF0ZWQgcGFyc2UgYXR0ZW1wdHMgYXQgdGhlIHNhbWUgc3RyaW5nIGxvY2F0aW9uICh3aGljaCBoYXBwZW5zDQogICAgICAgICAgIG9mdGVuIGluIG1hbnkgY29tcGxleCBncmFtbWFycykgY2FuIGltbWVkaWF0ZWx5IHJldHVybiBhIGNhY2hlZCB2YWx1ZSwNCiAgICAgICAgICAgaW5zdGVhZCBvZiByZS1leGVjdXRpbmcgcGFyc2luZy92YWxpZGF0aW5nIGNvZGUuICBNZW1vaXppbmcgaXMgZG9uZSBvZg0KICAgICAgICAgICBib3RoIHZhbGlkIHJlc3VsdHMgYW5kIHBhcnNpbmcgZXhjZXB0aW9ucy4NCiAgICAgICAgICAgDQogICAgICAgICAgIFBhcmFtZXRlcnM6DQogICAgICAgICAgICAtIGNhY2hlX3NpemVfbGltaXQgLSAoZGVmYXVsdD1DezEyOH0pIC0gaWYgYW4gaW50ZWdlciB2YWx1ZSBpcyBwcm92aWRlZA0KICAgICAgICAgICAgICB3aWxsIGxpbWl0IHRoZSBzaXplIG9mIHRoZSBwYWNrcmF0IGNhY2hlOyBpZiBOb25lIGlzIHBhc3NlZCwgdGhlbg0KICAgICAgICAgICAgICB0aGUgY2FjaGUgc2l6ZSB3aWxsIGJlIHVuYm91bmRlZDsgaWYgMCBpcyBwYXNzZWQsIHRoZSBjYWNoZSB3aWxsDQogICAgICAgICAgICAgIGJlIGVmZmVjdGl2ZWx5IGRpc2FibGVkLg0KICAgICAgICAgICAgDQogICAgICAgICAgIFRoaXMgc3BlZWR1cCBtYXkgYnJlYWsgZXhpc3RpbmcgcHJvZ3JhbXMgdGhhdCB1c2UgcGFyc2UgYWN0aW9ucyB0aGF0DQogICAgICAgICAgIGhhdmUgc2lkZS1lZmZlY3RzLiAgRm9yIHRoaXMgcmVhc29uLCBwYWNrcmF0IHBhcnNpbmcgaXMgZGlzYWJsZWQgd2hlbg0KICAgICAgICAgICB5b3UgZmlyc3QgaW1wb3J0IHB5cGFyc2luZy4gIFRvIGFjdGl2YXRlIHRoZSBwYWNrcmF0IGZlYXR1cmUsIHlvdXINCiAgICAgICAgICAgcHJvZ3JhbSBtdXN0IGNhbGwgdGhlIGNsYXNzIG1ldGhvZCBDe1BhcnNlckVsZW1lbnQuZW5hYmxlUGFja3JhdCgpfS4gIElmDQogICAgICAgICAgIHlvdXIgcHJvZ3JhbSB1c2VzIEN7cHN5Y299IHRvICJjb21waWxlIGFzIHlvdSBnbyIsIHlvdSBtdXN0IGNhbGwNCiAgICAgICAgICAgQ3tlbmFibGVQYWNrcmF0fSBiZWZvcmUgY2FsbGluZyBDe3BzeWNvLmZ1bGwoKX0uICBJZiB5b3UgZG8gbm90IGRvIHRoaXMsDQogICAgICAgICAgIFB5dGhvbiB3aWxsIGNyYXNoLiAgRm9yIGJlc3QgcmVzdWx0cywgY2FsbCBDe2VuYWJsZVBhY2tyYXQoKX0gaW1tZWRpYXRlbHkNCiAgICAgICAgICAgYWZ0ZXIgaW1wb3J0aW5nIHB5cGFyc2luZy4NCiAgICAgICAgICAgDQogICAgICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgICAgaW1wb3J0IHB5cGFyc2luZw0KICAgICAgICAgICAgICAgcHlwYXJzaW5nLlBhcnNlckVsZW1lbnQuZW5hYmxlUGFja3JhdCgpDQogICAgICAgICIiIg0KICAgICAgICBpZiBub3QgUGFyc2VyRWxlbWVudC5fcGFja3JhdEVuYWJsZWQ6DQogICAgICAgICAgICBQYXJzZXJFbGVtZW50Ll9wYWNrcmF0RW5hYmxlZCA9IFRydWUNCiAgICAgICAgICAgIGlmIGNhY2hlX3NpemVfbGltaXQgaXMgTm9uZToNCiAgICAgICAgICAgICAgICBQYXJzZXJFbGVtZW50LnBhY2tyYXRfY2FjaGUgPSBQYXJzZXJFbGVtZW50Ll9VbmJvdW5kZWRDYWNoZSgpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIFBhcnNlckVsZW1lbnQucGFja3JhdF9jYWNoZSA9IFBhcnNlckVsZW1lbnQuX0ZpZm9DYWNoZShjYWNoZV9zaXplX2xpbWl0KQ0KICAgICAgICAgICAgUGFyc2VyRWxlbWVudC5fcGFyc2UgPSBQYXJzZXJFbGVtZW50Ll9wYXJzZUNhY2hlDQoNCiAgICBkZWYgcGFyc2VTdHJpbmcoIHNlbGYsIGluc3RyaW5nLCBwYXJzZUFsbD1GYWxzZSApOg0KICAgICAgICAiIiINCiAgICAgICAgRXhlY3V0ZSB0aGUgcGFyc2UgZXhwcmVzc2lvbiB3aXRoIHRoZSBnaXZlbiBzdHJpbmcuDQogICAgICAgIFRoaXMgaXMgdGhlIG1haW4gaW50ZXJmYWNlIHRvIHRoZSBjbGllbnQgY29kZSwgb25jZSB0aGUgY29tcGxldGUNCiAgICAgICAgZXhwcmVzc2lvbiBoYXMgYmVlbiBidWlsdC4NCg0KICAgICAgICBJZiB5b3Ugd2FudCB0aGUgZ3JhbW1hciB0byByZXF1aXJlIHRoYXQgdGhlIGVudGlyZSBpbnB1dCBzdHJpbmcgYmUNCiAgICAgICAgc3VjY2Vzc2Z1bGx5IHBhcnNlZCwgdGhlbiBzZXQgQ3twYXJzZUFsbH0gdG8gVHJ1ZSAoZXF1aXZhbGVudCB0byBlbmRpbmcNCiAgICAgICAgdGhlIGdyYW1tYXIgd2l0aCBDe0x7U3RyaW5nRW5kKCl9fSkuDQoNCiAgICAgICAgTm90ZTogQ3twYXJzZVN0cmluZ30gaW1wbGljaXRseSBjYWxscyBDe2V4cGFuZHRhYnMoKX0gb24gdGhlIGlucHV0IHN0cmluZywNCiAgICAgICAgaW4gb3JkZXIgdG8gcmVwb3J0IHByb3BlciBjb2x1bW4gbnVtYmVycyBpbiBwYXJzZSBhY3Rpb25zLg0KICAgICAgICBJZiB0aGUgaW5wdXQgc3RyaW5nIGNvbnRhaW5zIHRhYnMgYW5kDQogICAgICAgIHRoZSBncmFtbWFyIHVzZXMgcGFyc2UgYWN0aW9ucyB0aGF0IHVzZSB0aGUgQ3tsb2N9IGFyZ3VtZW50IHRvIGluZGV4IGludG8gdGhlDQogICAgICAgIHN0cmluZyBiZWluZyBwYXJzZWQsIHlvdSBjYW4gZW5zdXJlIHlvdSBoYXZlIGEgY29uc2lzdGVudCB2aWV3IG9mIHRoZSBpbnB1dA0KICAgICAgICBzdHJpbmcgYnk6DQogICAgICAgICAtIGNhbGxpbmcgQ3twYXJzZVdpdGhUYWJzfSBvbiB5b3VyIGdyYW1tYXIgYmVmb3JlIGNhbGxpbmcgQ3twYXJzZVN0cmluZ30NCiAgICAgICAgICAgKHNlZSBMe0l7cGFyc2VXaXRoVGFic308cGFyc2VXaXRoVGFicz59KQ0KICAgICAgICAgLSBkZWZpbmUgeW91ciBwYXJzZSBhY3Rpb24gdXNpbmcgdGhlIGZ1bGwgQ3socyxsb2MsdG9rcyl9IHNpZ25hdHVyZSwgYW5kDQogICAgICAgICAgIHJlZmVyZW5jZSB0aGUgaW5wdXQgc3RyaW5nIHVzaW5nIHRoZSBwYXJzZSBhY3Rpb24ncyBDe3N9IGFyZ3VtZW50DQogICAgICAgICAtIGV4cGxpY3RseSBleHBhbmQgdGhlIHRhYnMgaW4geW91ciBpbnB1dCBzdHJpbmcgYmVmb3JlIGNhbGxpbmcNCiAgICAgICAgICAgQ3twYXJzZVN0cmluZ30NCiAgICAgICAgDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgV29yZCgnYScpLnBhcnNlU3RyaW5nKCdhYWFhYWJhYWEnKSAgIyAtPiBbJ2FhYWFhJ10NCiAgICAgICAgICAgIFdvcmQoJ2EnKS5wYXJzZVN0cmluZygnYWFhYWFiYWFhJywgcGFyc2VBbGw9VHJ1ZSkgICMgLT4gRXhjZXB0aW9uOiBFeHBlY3RlZCBlbmQgb2YgdGV4dA0KICAgICAgICAiIiINCiAgICAgICAgUGFyc2VyRWxlbWVudC5yZXNldENhY2hlKCkNCiAgICAgICAgaWYgbm90IHNlbGYuc3RyZWFtbGluZWQ6DQogICAgICAgICAgICBzZWxmLnN0cmVhbWxpbmUoKQ0KICAgICAgICAgICAgI34gc2VsZi5zYXZlQXNMaXN0ID0gVHJ1ZQ0KICAgICAgICBmb3IgZSBpbiBzZWxmLmlnbm9yZUV4cHJzOg0KICAgICAgICAgICAgZS5zdHJlYW1saW5lKCkNCiAgICAgICAgaWYgbm90IHNlbGYua2VlcFRhYnM6DQogICAgICAgICAgICBpbnN0cmluZyA9IGluc3RyaW5nLmV4cGFuZHRhYnMoKQ0KICAgICAgICB0cnk6DQogICAgICAgICAgICBsb2MsIHRva2VucyA9IHNlbGYuX3BhcnNlKCBpbnN0cmluZywgMCApDQogICAgICAgICAgICBpZiBwYXJzZUFsbDoNCiAgICAgICAgICAgICAgICBsb2MgPSBzZWxmLnByZVBhcnNlKCBpbnN0cmluZywgbG9jICkNCiAgICAgICAgICAgICAgICBzZSA9IEVtcHR5KCkgKyBTdHJpbmdFbmQoKQ0KICAgICAgICAgICAgICAgIHNlLl9wYXJzZSggaW5zdHJpbmcsIGxvYyApDQogICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb24gYXMgZXhjOg0KICAgICAgICAgICAgaWYgUGFyc2VyRWxlbWVudC52ZXJib3NlX3N0YWNrdHJhY2U6DQogICAgICAgICAgICAgICAgcmFpc2UNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgIyBjYXRjaCBhbmQgcmUtcmFpc2UgZXhjZXB0aW9uIGZyb20gaGVyZSwgY2xlYXJzIG91dCBweXBhcnNpbmcgaW50ZXJuYWwgc3RhY2sgdHJhY2UNCiAgICAgICAgICAgICAgICByYWlzZSBleGMNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJldHVybiB0b2tlbnMNCg0KICAgIGRlZiBzY2FuU3RyaW5nKCBzZWxmLCBpbnN0cmluZywgbWF4TWF0Y2hlcz1fTUFYX0lOVCwgb3ZlcmxhcD1GYWxzZSApOg0KICAgICAgICAiIiINCiAgICAgICAgU2NhbiB0aGUgaW5wdXQgc3RyaW5nIGZvciBleHByZXNzaW9uIG1hdGNoZXMuICBFYWNoIG1hdGNoIHdpbGwgcmV0dXJuIHRoZQ0KICAgICAgICBtYXRjaGluZyB0b2tlbnMsIHN0YXJ0IGxvY2F0aW9uLCBhbmQgZW5kIGxvY2F0aW9uLiAgTWF5IGJlIGNhbGxlZCB3aXRoIG9wdGlvbmFsDQogICAgICAgIEN7bWF4TWF0Y2hlc30gYXJndW1lbnQsIHRvIGNsaXAgc2Nhbm5pbmcgYWZ0ZXIgJ24nIG1hdGNoZXMgYXJlIGZvdW5kLiAgSWYNCiAgICAgICAgQ3tvdmVybGFwfSBpcyBzcGVjaWZpZWQsIHRoZW4gb3ZlcmxhcHBpbmcgbWF0Y2hlcyB3aWxsIGJlIHJlcG9ydGVkLg0KDQogICAgICAgIE5vdGUgdGhhdCB0aGUgc3RhcnQgYW5kIGVuZCBsb2NhdGlvbnMgYXJlIHJlcG9ydGVkIHJlbGF0aXZlIHRvIHRoZSBzdHJpbmcNCiAgICAgICAgYmVpbmcgcGFyc2VkLiAgU2VlIEx7SXtwYXJzZVN0cmluZ308cGFyc2VTdHJpbmc+fSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBwYXJzaW5nDQogICAgICAgIHN0cmluZ3Mgd2l0aCBlbWJlZGRlZCB0YWJzLg0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgc291cmNlID0gInNsZGpmMTIzbHNkamprZjM0NXNsZGtqZjg3OWxranNmZDk4NyINCiAgICAgICAgICAgIHByaW50KHNvdXJjZSkNCiAgICAgICAgICAgIGZvciB0b2tlbnMsc3RhcnQsZW5kIGluIFdvcmQoYWxwaGFzKS5zY2FuU3RyaW5nKHNvdXJjZSk6DQogICAgICAgICAgICAgICAgcHJpbnQoJyAnKnN0YXJ0ICsgJ14nKihlbmQtc3RhcnQpKQ0KICAgICAgICAgICAgICAgIHByaW50KCcgJypzdGFydCArIHRva2Vuc1swXSkNCiAgICAgICAgDQogICAgICAgIHByaW50czo6DQogICAgICAgIA0KICAgICAgICAgICAgc2xkamYxMjNsc2RqamtmMzQ1c2xka2pmODc5bGtqc2ZkOTg3DQogICAgICAgICAgICBeXl5eXg0KICAgICAgICAgICAgc2xkamYNCiAgICAgICAgICAgICAgICAgICAgXl5eXl5eXg0KICAgICAgICAgICAgICAgICAgICBsc2RqamtmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsZGtqZg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsa2pzZmQNCiAgICAgICAgIiIiDQogICAgICAgIGlmIG5vdCBzZWxmLnN0cmVhbWxpbmVkOg0KICAgICAgICAgICAgc2VsZi5zdHJlYW1saW5lKCkNCiAgICAgICAgZm9yIGUgaW4gc2VsZi5pZ25vcmVFeHByczoNCiAgICAgICAgICAgIGUuc3RyZWFtbGluZSgpDQoNCiAgICAgICAgaWYgbm90IHNlbGYua2VlcFRhYnM6DQogICAgICAgICAgICBpbnN0cmluZyA9IF91c3RyKGluc3RyaW5nKS5leHBhbmR0YWJzKCkNCiAgICAgICAgaW5zdHJsZW4gPSBsZW4oaW5zdHJpbmcpDQogICAgICAgIGxvYyA9IDANCiAgICAgICAgcHJlcGFyc2VGbiA9IHNlbGYucHJlUGFyc2UNCiAgICAgICAgcGFyc2VGbiA9IHNlbGYuX3BhcnNlDQogICAgICAgIFBhcnNlckVsZW1lbnQucmVzZXRDYWNoZSgpDQogICAgICAgIG1hdGNoZXMgPSAwDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHdoaWxlIGxvYyA8PSBpbnN0cmxlbiBhbmQgbWF0Y2hlcyA8IG1heE1hdGNoZXM6DQogICAgICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgICAgICBwcmVsb2MgPSBwcmVwYXJzZUZuKCBpbnN0cmluZywgbG9jICkNCiAgICAgICAgICAgICAgICAgICAgbmV4dExvYyx0b2tlbnMgPSBwYXJzZUZuKCBpbnN0cmluZywgcHJlbG9jLCBjYWxsUHJlUGFyc2U9RmFsc2UgKQ0KICAgICAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUV4Y2VwdGlvbjoNCiAgICAgICAgICAgICAgICAgICAgbG9jID0gcHJlbG9jKzENCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICBpZiBuZXh0TG9jID4gbG9jOg0KICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcyArPSAxDQogICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCB0b2tlbnMsIHByZWxvYywgbmV4dExvYw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgb3ZlcmxhcDoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0bG9jID0gcHJlcGFyc2VGbiggaW5zdHJpbmcsIGxvYyApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbmV4dGxvYyA+IGxvYzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jID0gbmV4dExvYw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYyArPSAxDQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYyA9IG5leHRMb2MNCiAgICAgICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgICAgIGxvYyA9IHByZWxvYysxDQogICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb24gYXMgZXhjOg0KICAgICAgICAgICAgaWYgUGFyc2VyRWxlbWVudC52ZXJib3NlX3N0YWNrdHJhY2U6DQogICAgICAgICAgICAgICAgcmFpc2UNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgIyBjYXRjaCBhbmQgcmUtcmFpc2UgZXhjZXB0aW9uIGZyb20gaGVyZSwgY2xlYXJzIG91dCBweXBhcnNpbmcgaW50ZXJuYWwgc3RhY2sgdHJhY2UNCiAgICAgICAgICAgICAgICByYWlzZSBleGMNCg0KICAgIGRlZiB0cmFuc2Zvcm1TdHJpbmcoIHNlbGYsIGluc3RyaW5nICk6DQogICAgICAgICIiIg0KICAgICAgICBFeHRlbnNpb24gdG8gQ3tMe3NjYW5TdHJpbmd9fSwgdG8gbW9kaWZ5IG1hdGNoaW5nIHRleHQgd2l0aCBtb2RpZmllZCB0b2tlbnMgdGhhdCBtYXkNCiAgICAgICAgYmUgcmV0dXJuZWQgZnJvbSBhIHBhcnNlIGFjdGlvbi4gIFRvIHVzZSBDe3RyYW5zZm9ybVN0cmluZ30sIGRlZmluZSBhIGdyYW1tYXIgYW5kDQogICAgICAgIGF0dGFjaCBhIHBhcnNlIGFjdGlvbiB0byBpdCB0aGF0IG1vZGlmaWVzIHRoZSByZXR1cm5lZCB0b2tlbiBsaXN0Lg0KICAgICAgICBJbnZva2luZyBDe3RyYW5zZm9ybVN0cmluZygpfSBvbiBhIHRhcmdldCBzdHJpbmcgd2lsbCB0aGVuIHNjYW4gZm9yIG1hdGNoZXMsDQogICAgICAgIGFuZCByZXBsYWNlIHRoZSBtYXRjaGVkIHRleHQgcGF0dGVybnMgYWNjb3JkaW5nIHRvIHRoZSBsb2dpYyBpbiB0aGUgcGFyc2UNCiAgICAgICAgYWN0aW9uLiAgQ3t0cmFuc2Zvcm1TdHJpbmcoKX0gcmV0dXJucyB0aGUgcmVzdWx0aW5nIHRyYW5zZm9ybWVkIHN0cmluZy4NCiAgICAgICAgDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgd2QgPSBXb3JkKGFscGhhcykNCiAgICAgICAgICAgIHdkLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0b2tzOiB0b2tzWzBdLnRpdGxlKCkpDQogICAgICAgICAgICANCiAgICAgICAgICAgIHByaW50KHdkLnRyYW5zZm9ybVN0cmluZygibm93IGlzIHRoZSB3aW50ZXIgb2Ygb3VyIGRpc2NvbnRlbnQgbWFkZSBnbG9yaW91cyBzdW1tZXIgYnkgdGhpcyBzdW4gb2YgeW9yay4iKSkNCiAgICAgICAgUHJpbnRzOjoNCiAgICAgICAgICAgIE5vdyBJcyBUaGUgV2ludGVyIE9mIE91ciBEaXNjb250ZW50IE1hZGUgR2xvcmlvdXMgU3VtbWVyIEJ5IFRoaXMgU3VuIE9mIFlvcmsuDQogICAgICAgICIiIg0KICAgICAgICBvdXQgPSBbXQ0KICAgICAgICBsYXN0RSA9IDANCiAgICAgICAgIyBmb3JjZSBwcmVzZXJ2YXRpb24gb2YgPFRBQj5zLCB0byBtaW5pbWl6ZSB1bndhbnRlZCB0cmFuc2Zvcm1hdGlvbiBvZiBzdHJpbmcsIGFuZCB0bw0KICAgICAgICAjIGtlZXAgc3RyaW5nIGxvY3Mgc3RyYWlnaHQgYmV0d2VlbiB0cmFuc2Zvcm1TdHJpbmcgYW5kIHNjYW5TdHJpbmcNCiAgICAgICAgc2VsZi5rZWVwVGFicyA9IFRydWUNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgZm9yIHQscyxlIGluIHNlbGYuc2NhblN0cmluZyggaW5zdHJpbmcgKToNCiAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCBpbnN0cmluZ1tsYXN0RTpzXSApDQogICAgICAgICAgICAgICAgaWYgdDoNCiAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh0LFBhcnNlUmVzdWx0cyk6DQogICAgICAgICAgICAgICAgICAgICAgICBvdXQgKz0gdC5hc0xpc3QoKQ0KICAgICAgICAgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UodCxsaXN0KToNCiAgICAgICAgICAgICAgICAgICAgICAgIG91dCArPSB0DQogICAgICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKHQpDQogICAgICAgICAgICAgICAgbGFzdEUgPSBlDQogICAgICAgICAgICBvdXQuYXBwZW5kKGluc3RyaW5nW2xhc3RFOl0pDQogICAgICAgICAgICBvdXQgPSBbbyBmb3IgbyBpbiBvdXQgaWYgb10NCiAgICAgICAgICAgIHJldHVybiAiIi5qb2luKG1hcChfdXN0cixfZmxhdHRlbihvdXQpKSkNCiAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbiBhcyBleGM6DQogICAgICAgICAgICBpZiBQYXJzZXJFbGVtZW50LnZlcmJvc2Vfc3RhY2t0cmFjZToNCiAgICAgICAgICAgICAgICByYWlzZQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAjIGNhdGNoIGFuZCByZS1yYWlzZSBleGNlcHRpb24gZnJvbSBoZXJlLCBjbGVhcnMgb3V0IHB5cGFyc2luZyBpbnRlcm5hbCBzdGFjayB0cmFjZQ0KICAgICAgICAgICAgICAgIHJhaXNlIGV4Yw0KDQogICAgZGVmIHNlYXJjaFN0cmluZyggc2VsZiwgaW5zdHJpbmcsIG1heE1hdGNoZXM9X01BWF9JTlQgKToNCiAgICAgICAgIiIiDQogICAgICAgIEFub3RoZXIgZXh0ZW5zaW9uIHRvIEN7THtzY2FuU3RyaW5nfX0sIHNpbXBsaWZ5aW5nIHRoZSBhY2Nlc3MgdG8gdGhlIHRva2VucyBmb3VuZA0KICAgICAgICB0byBtYXRjaCB0aGUgZ2l2ZW4gcGFyc2UgZXhwcmVzc2lvbi4gIE1heSBiZSBjYWxsZWQgd2l0aCBvcHRpb25hbA0KICAgICAgICBDe21heE1hdGNoZXN9IGFyZ3VtZW50LCB0byBjbGlwIHNlYXJjaGluZyBhZnRlciAnbicgbWF0Y2hlcyBhcmUgZm91bmQuDQogICAgICAgIA0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgICMgYSBjYXBpdGFsaXplZCB3b3JkIHN0YXJ0cyB3aXRoIGFuIHVwcGVyY2FzZSBsZXR0ZXIsIGZvbGxvd2VkIGJ5IHplcm8gb3IgbW9yZSBsb3dlcmNhc2UgbGV0dGVycw0KICAgICAgICAgICAgY2FwX3dvcmQgPSBXb3JkKGFscGhhcy51cHBlcigpLCBhbHBoYXMubG93ZXIoKSkNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgcHJpbnQoY2FwX3dvcmQuc2VhcmNoU3RyaW5nKCJNb3JlIHRoYW4gSXJvbiwgbW9yZSB0aGFuIExlYWQsIG1vcmUgdGhhbiBHb2xkIEkgbmVlZCBFbGVjdHJpY2l0eSIpKQ0KDQogICAgICAgICAgICAjIHRoZSBzdW0oKSBidWlsdGluIGNhbiBiZSB1c2VkIHRvIG1lcmdlIHJlc3VsdHMgaW50byBhIHNpbmdsZSBQYXJzZVJlc3VsdHMgb2JqZWN0DQogICAgICAgICAgICBwcmludChzdW0oY2FwX3dvcmQuc2VhcmNoU3RyaW5nKCJNb3JlIHRoYW4gSXJvbiwgbW9yZSB0aGFuIExlYWQsIG1vcmUgdGhhbiBHb2xkIEkgbmVlZCBFbGVjdHJpY2l0eSIpKSkNCiAgICAgICAgcHJpbnRzOjoNCiAgICAgICAgICAgIFtbJ01vcmUnXSwgWydJcm9uJ10sIFsnTGVhZCddLCBbJ0dvbGQnXSwgWydJJ10sIFsnRWxlY3RyaWNpdHknXV0NCiAgICAgICAgICAgIFsnTW9yZScsICdJcm9uJywgJ0xlYWQnLCAnR29sZCcsICdJJywgJ0VsZWN0cmljaXR5J10NCiAgICAgICAgIiIiDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHJldHVybiBQYXJzZVJlc3VsdHMoWyB0IGZvciB0LHMsZSBpbiBzZWxmLnNjYW5TdHJpbmcoIGluc3RyaW5nLCBtYXhNYXRjaGVzICkgXSkNCiAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbiBhcyBleGM6DQogICAgICAgICAgICBpZiBQYXJzZXJFbGVtZW50LnZlcmJvc2Vfc3RhY2t0cmFjZToNCiAgICAgICAgICAgICAgICByYWlzZQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAjIGNhdGNoIGFuZCByZS1yYWlzZSBleGNlcHRpb24gZnJvbSBoZXJlLCBjbGVhcnMgb3V0IHB5cGFyc2luZyBpbnRlcm5hbCBzdGFjayB0cmFjZQ0KICAgICAgICAgICAgICAgIHJhaXNlIGV4Yw0KDQogICAgZGVmIHNwbGl0KHNlbGYsIGluc3RyaW5nLCBtYXhzcGxpdD1fTUFYX0lOVCwgaW5jbHVkZVNlcGFyYXRvcnM9RmFsc2UpOg0KICAgICAgICAiIiINCiAgICAgICAgR2VuZXJhdG9yIG1ldGhvZCB0byBzcGxpdCBhIHN0cmluZyB1c2luZyB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiBhcyBhIHNlcGFyYXRvci4NCiAgICAgICAgTWF5IGJlIGNhbGxlZCB3aXRoIG9wdGlvbmFsIEN7bWF4c3BsaXR9IGFyZ3VtZW50LCB0byBsaW1pdCB0aGUgbnVtYmVyIG9mIHNwbGl0czsNCiAgICAgICAgYW5kIHRoZSBvcHRpb25hbCBDe2luY2x1ZGVTZXBhcmF0b3JzfSBhcmd1bWVudCAoZGVmYXVsdD1De0ZhbHNlfSksIGlmIHRoZSBzZXBhcmF0aW5nDQogICAgICAgIG1hdGNoaW5nIHRleHQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBzcGxpdCByZXN1bHRzLg0KICAgICAgICANCiAgICAgICAgRXhhbXBsZTo6ICAgICAgICANCiAgICAgICAgICAgIHB1bmMgPSBvbmVPZihsaXN0KCIuLDs6Ly0hPyIpKQ0KICAgICAgICAgICAgcHJpbnQobGlzdChwdW5jLnNwbGl0KCJUaGlzLCB0aGlzPywgdGhpcyBzZW50ZW5jZSwgaXMgYmFkbHkgcHVuY3R1YXRlZCEiKSkpDQogICAgICAgIHByaW50czo6DQogICAgICAgICAgICBbJ1RoaXMnLCAnIHRoaXMnLCAnJywgJyB0aGlzIHNlbnRlbmNlJywgJyBpcyBiYWRseSBwdW5jdHVhdGVkJywgJyddDQogICAgICAgICIiIg0KICAgICAgICBzcGxpdHMgPSAwDQogICAgICAgIGxhc3QgPSAwDQogICAgICAgIGZvciB0LHMsZSBpbiBzZWxmLnNjYW5TdHJpbmcoaW5zdHJpbmcsIG1heE1hdGNoZXM9bWF4c3BsaXQpOg0KICAgICAgICAgICAgeWllbGQgaW5zdHJpbmdbbGFzdDpzXQ0KICAgICAgICAgICAgaWYgaW5jbHVkZVNlcGFyYXRvcnM6DQogICAgICAgICAgICAgICAgeWllbGQgdFswXQ0KICAgICAgICAgICAgbGFzdCA9IGUNCiAgICAgICAgeWllbGQgaW5zdHJpbmdbbGFzdDpdDQoNCiAgICBkZWYgX19hZGRfXyhzZWxmLCBvdGhlciApOg0KICAgICAgICAiIiINCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgKyBvcGVyYXRvciAtIHJldHVybnMgQ3tMe0FuZH19LiBBZGRpbmcgc3RyaW5ncyB0byBhIFBhcnNlckVsZW1lbnQNCiAgICAgICAgY29udmVydHMgdGhlbSB0byBMe0xpdGVyYWx9cyBieSBkZWZhdWx0Lg0KICAgICAgICANCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBncmVldCA9IFdvcmQoYWxwaGFzKSArICIsIiArIFdvcmQoYWxwaGFzKSArICIhIg0KICAgICAgICAgICAgaGVsbG8gPSAiSGVsbG8sIFdvcmxkISINCiAgICAgICAgICAgIHByaW50IChoZWxsbywgIi0+IiwgZ3JlZXQucGFyc2VTdHJpbmcoaGVsbG8pKQ0KICAgICAgICBQcmludHM6Og0KICAgICAgICAgICAgSGVsbG8sIFdvcmxkISAtPiBbJ0hlbGxvJywgJywnLCAnV29ybGQnLCAnISddDQogICAgICAgICIiIg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkNCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoIG90aGVyLCBQYXJzZXJFbGVtZW50ICk6DQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDYW5ub3QgY29tYmluZSBlbGVtZW50IG9mIHR5cGUgJXMgd2l0aCBQYXJzZXJFbGVtZW50IiAlIHR5cGUob3RoZXIpLA0KICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQogICAgICAgICAgICByZXR1cm4gTm9uZQ0KICAgICAgICByZXR1cm4gQW5kKCBbIHNlbGYsIG90aGVyIF0gKQ0KDQogICAgZGVmIF9fcmFkZF9fKHNlbGYsIG90aGVyICk6DQogICAgICAgICIiIg0KICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiArIG9wZXJhdG9yIHdoZW4gbGVmdCBvcGVyYW5kIGlzIG5vdCBhIEN7THtQYXJzZXJFbGVtZW50fX0NCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQ0KICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSggb3RoZXIsIFBhcnNlckVsZW1lbnQgKToNCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNhbm5vdCBjb21iaW5lIGVsZW1lbnQgb2YgdHlwZSAlcyB3aXRoIFBhcnNlckVsZW1lbnQiICUgdHlwZShvdGhlciksDQogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgIHJldHVybiBOb25lDQogICAgICAgIHJldHVybiBvdGhlciArIHNlbGYNCg0KICAgIGRlZiBfX3N1Yl9fKHNlbGYsIG90aGVyKToNCiAgICAgICAgIiIiDQogICAgICAgIEltcGxlbWVudGF0aW9uIG9mIC0gb3BlcmF0b3IsIHJldHVybnMgQ3tMe0FuZH19IHdpdGggZXJyb3Igc3RvcA0KICAgICAgICAiIiINCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApDQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKCBvdGhlciwgUGFyc2VyRWxlbWVudCApOg0KICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ2Fubm90IGNvbWJpbmUgZWxlbWVudCBvZiB0eXBlICVzIHdpdGggUGFyc2VyRWxlbWVudCIgJSB0eXBlKG90aGVyKSwNCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KICAgICAgICAgICAgcmV0dXJuIE5vbmUNCiAgICAgICAgcmV0dXJuIHNlbGYgKyBBbmQuX0Vycm9yU3RvcCgpICsgb3RoZXINCg0KICAgIGRlZiBfX3JzdWJfXyhzZWxmLCBvdGhlciApOg0KICAgICAgICAiIiINCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgLSBvcGVyYXRvciB3aGVuIGxlZnQgb3BlcmFuZCBpcyBub3QgYSBDe0x7UGFyc2VyRWxlbWVudH19DQogICAgICAgICIiIg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkNCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoIG90aGVyLCBQYXJzZXJFbGVtZW50ICk6DQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDYW5ub3QgY29tYmluZSBlbGVtZW50IG9mIHR5cGUgJXMgd2l0aCBQYXJzZXJFbGVtZW50IiAlIHR5cGUob3RoZXIpLA0KICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQogICAgICAgICAgICByZXR1cm4gTm9uZQ0KICAgICAgICByZXR1cm4gb3RoZXIgLSBzZWxmDQoNCiAgICBkZWYgX19tdWxfXyhzZWxmLG90aGVyKToNCiAgICAgICAgIiIiDQogICAgICAgIEltcGxlbWVudGF0aW9uIG9mICogb3BlcmF0b3IsIGFsbG93cyB1c2Ugb2YgQ3tleHByICogM30gaW4gcGxhY2Ugb2YNCiAgICAgICAgQ3tleHByICsgZXhwciArIGV4cHJ9LiAgRXhwcmVzc2lvbnMgbWF5IGFsc28gbWUgbXVsdGlwbGllZCBieSBhIDItaW50ZWdlcg0KICAgICAgICB0dXBsZSwgc2ltaWxhciB0byBDe3ttaW4sbWF4fX0gbXVsdGlwbGllcnMgaW4gcmVndWxhciBleHByZXNzaW9ucy4gIFR1cGxlcw0KICAgICAgICBtYXkgYWxzbyBpbmNsdWRlIEN7Tm9uZX0gYXMgaW46DQogICAgICAgICAtIEN7ZXhwcioobixOb25lKX0gb3IgQ3tleHByKihuLCl9IGlzIGVxdWl2YWxlbnQNCiAgICAgICAgICAgICAgdG8gQ3tleHByKm4gKyBMe1plcm9Pck1vcmV9KGV4cHIpfQ0KICAgICAgICAgICAgICAocmVhZCBhcyAiYXQgbGVhc3QgbiBpbnN0YW5jZXMgb2YgQ3tleHByfSIpDQogICAgICAgICAtIEN7ZXhwciooTm9uZSxuKX0gaXMgZXF1aXZhbGVudCB0byBDe2V4cHIqKDAsbil9DQogICAgICAgICAgICAgIChyZWFkIGFzICIwIHRvIG4gaW5zdGFuY2VzIG9mIEN7ZXhwcn0iKQ0KICAgICAgICAgLSBDe2V4cHIqKE5vbmUsTm9uZSl9IGlzIGVxdWl2YWxlbnQgdG8gQ3tMe1plcm9Pck1vcmV9KGV4cHIpfQ0KICAgICAgICAgLSBDe2V4cHIqKDEsTm9uZSl9IGlzIGVxdWl2YWxlbnQgdG8gQ3tMe09uZU9yTW9yZX0oZXhwcil9DQoNCiAgICAgICAgTm90ZSB0aGF0IEN7ZXhwciooTm9uZSxuKX0gZG9lcyBub3QgcmFpc2UgYW4gZXhjZXB0aW9uIGlmDQogICAgICAgIG1vcmUgdGhhbiBuIGV4cHJzIGV4aXN0IGluIHRoZSBpbnB1dCBzdHJlYW07IHRoYXQgaXMsDQogICAgICAgIEN7ZXhwciooTm9uZSxuKX0gZG9lcyBub3QgZW5mb3JjZSBhIG1heGltdW0gbnVtYmVyIG9mIGV4cHINCiAgICAgICAgb2NjdXJyZW5jZXMuICBJZiB0aGlzIGJlaGF2aW9yIGlzIGRlc2lyZWQsIHRoZW4gd3JpdGUNCiAgICAgICAgQ3tleHByKihOb25lLG4pICsgfmV4cHJ9DQogICAgICAgICIiIg0KICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLGludCk6DQogICAgICAgICAgICBtaW5FbGVtZW50cywgb3B0RWxlbWVudHMgPSBvdGhlciwwDQogICAgICAgIGVsaWYgaXNpbnN0YW5jZShvdGhlcix0dXBsZSk6DQogICAgICAgICAgICBvdGhlciA9IChvdGhlciArIChOb25lLCBOb25lKSlbOjJdDQogICAgICAgICAgICBpZiBvdGhlclswXSBpcyBOb25lOg0KICAgICAgICAgICAgICAgIG90aGVyID0gKDAsIG90aGVyWzFdKQ0KICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlclswXSxpbnQpIGFuZCBvdGhlclsxXSBpcyBOb25lOg0KICAgICAgICAgICAgICAgIGlmIG90aGVyWzBdID09IDA6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBaZXJvT3JNb3JlKHNlbGYpDQogICAgICAgICAgICAgICAgaWYgb3RoZXJbMF0gPT0gMToNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9uZU9yTW9yZShzZWxmKQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmKm90aGVyWzBdICsgWmVyb09yTW9yZShzZWxmKQ0KICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKG90aGVyWzBdLGludCkgYW5kIGlzaW5zdGFuY2Uob3RoZXJbMV0saW50KToNCiAgICAgICAgICAgICAgICBtaW5FbGVtZW50cywgb3B0RWxlbWVudHMgPSBvdGhlcg0KICAgICAgICAgICAgICAgIG9wdEVsZW1lbnRzIC09IG1pbkVsZW1lbnRzDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiY2Fubm90IG11bHRpcGx5ICdQYXJzZXJFbGVtZW50JyBhbmQgKCclcycsJyVzJykgb2JqZWN0cyIsIHR5cGUob3RoZXJbMF0pLHR5cGUob3RoZXJbMV0pKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJjYW5ub3QgbXVsdGlwbHkgJ1BhcnNlckVsZW1lbnQnIGFuZCAnJXMnIG9iamVjdHMiLCB0eXBlKG90aGVyKSkNCg0KICAgICAgICBpZiBtaW5FbGVtZW50cyA8IDA6DQogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJjYW5ub3QgbXVsdGlwbHkgUGFyc2VyRWxlbWVudCBieSBuZWdhdGl2ZSB2YWx1ZSIpDQogICAgICAgIGlmIG9wdEVsZW1lbnRzIDwgMDoNCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInNlY29uZCB0dXBsZSB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgb3IgZXF1YWwgdG8gZmlyc3QgdHVwbGUgdmFsdWUiKQ0KICAgICAgICBpZiBtaW5FbGVtZW50cyA9PSBvcHRFbGVtZW50cyA9PSAwOg0KICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiY2Fubm90IG11bHRpcGx5IFBhcnNlckVsZW1lbnQgYnkgMCBvciAoMCwwKSIpDQoNCiAgICAgICAgaWYgKG9wdEVsZW1lbnRzKToNCiAgICAgICAgICAgIGRlZiBtYWtlT3B0aW9uYWxMaXN0KG4pOg0KICAgICAgICAgICAgICAgIGlmIG4+MToNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsKHNlbGYgKyBtYWtlT3B0aW9uYWxMaXN0KG4tMSkpDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsKHNlbGYpDQogICAgICAgICAgICBpZiBtaW5FbGVtZW50czoNCiAgICAgICAgICAgICAgICBpZiBtaW5FbGVtZW50cyA9PSAxOg0KICAgICAgICAgICAgICAgICAgICByZXQgPSBzZWxmICsgbWFrZU9wdGlvbmFsTGlzdChvcHRFbGVtZW50cykNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICByZXQgPSBBbmQoW3NlbGZdKm1pbkVsZW1lbnRzKSArIG1ha2VPcHRpb25hbExpc3Qob3B0RWxlbWVudHMpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHJldCA9IG1ha2VPcHRpb25hbExpc3Qob3B0RWxlbWVudHMpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBpZiBtaW5FbGVtZW50cyA9PSAxOg0KICAgICAgICAgICAgICAgIHJldCA9IHNlbGYNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcmV0ID0gQW5kKFtzZWxmXSptaW5FbGVtZW50cykNCiAgICAgICAgcmV0dXJuIHJldA0KDQogICAgZGVmIF9fcm11bF9fKHNlbGYsIG90aGVyKToNCiAgICAgICAgcmV0dXJuIHNlbGYuX19tdWxfXyhvdGhlcikNCg0KICAgIGRlZiBfX29yX18oc2VsZiwgb3RoZXIgKToNCiAgICAgICAgIiIiDQogICAgICAgIEltcGxlbWVudGF0aW9uIG9mIHwgb3BlcmF0b3IgLSByZXR1cm5zIEN7THtNYXRjaEZpcnN0fX0NCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQ0KICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSggb3RoZXIsIFBhcnNlckVsZW1lbnQgKToNCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNhbm5vdCBjb21iaW5lIGVsZW1lbnQgb2YgdHlwZSAlcyB3aXRoIFBhcnNlckVsZW1lbnQiICUgdHlwZShvdGhlciksDQogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgIHJldHVybiBOb25lDQogICAgICAgIHJldHVybiBNYXRjaEZpcnN0KCBbIHNlbGYsIG90aGVyIF0gKQ0KDQogICAgZGVmIF9fcm9yX18oc2VsZiwgb3RoZXIgKToNCiAgICAgICAgIiIiDQogICAgICAgIEltcGxlbWVudGF0aW9uIG9mIHwgb3BlcmF0b3Igd2hlbiBsZWZ0IG9wZXJhbmQgaXMgbm90IGEgQ3tMe1BhcnNlckVsZW1lbnR9fQ0KICAgICAgICAiIiINCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApDQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKCBvdGhlciwgUGFyc2VyRWxlbWVudCApOg0KICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ2Fubm90IGNvbWJpbmUgZWxlbWVudCBvZiB0eXBlICVzIHdpdGggUGFyc2VyRWxlbWVudCIgJSB0eXBlKG90aGVyKSwNCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KICAgICAgICAgICAgcmV0dXJuIE5vbmUNCiAgICAgICAgcmV0dXJuIG90aGVyIHwgc2VsZg0KDQogICAgZGVmIF9feG9yX18oc2VsZiwgb3RoZXIgKToNCiAgICAgICAgIiIiDQogICAgICAgIEltcGxlbWVudGF0aW9uIG9mIF4gb3BlcmF0b3IgLSByZXR1cm5zIEN7THtPcn19DQogICAgICAgICIiIg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkNCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoIG90aGVyLCBQYXJzZXJFbGVtZW50ICk6DQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDYW5ub3QgY29tYmluZSBlbGVtZW50IG9mIHR5cGUgJXMgd2l0aCBQYXJzZXJFbGVtZW50IiAlIHR5cGUob3RoZXIpLA0KICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQogICAgICAgICAgICByZXR1cm4gTm9uZQ0KICAgICAgICByZXR1cm4gT3IoIFsgc2VsZiwgb3RoZXIgXSApDQoNCiAgICBkZWYgX19yeG9yX18oc2VsZiwgb3RoZXIgKToNCiAgICAgICAgIiIiDQogICAgICAgIEltcGxlbWVudGF0aW9uIG9mIF4gb3BlcmF0b3Igd2hlbiBsZWZ0IG9wZXJhbmQgaXMgbm90IGEgQ3tMe1BhcnNlckVsZW1lbnR9fQ0KICAgICAgICAiIiINCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApDQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKCBvdGhlciwgUGFyc2VyRWxlbWVudCApOg0KICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ2Fubm90IGNvbWJpbmUgZWxlbWVudCBvZiB0eXBlICVzIHdpdGggUGFyc2VyRWxlbWVudCIgJSB0eXBlKG90aGVyKSwNCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KICAgICAgICAgICAgcmV0dXJuIE5vbmUNCiAgICAgICAgcmV0dXJuIG90aGVyIF4gc2VsZg0KDQogICAgZGVmIF9fYW5kX18oc2VsZiwgb3RoZXIgKToNCiAgICAgICAgIiIiDQogICAgICAgIEltcGxlbWVudGF0aW9uIG9mICYgb3BlcmF0b3IgLSByZXR1cm5zIEN7THtFYWNofX0NCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQ0KICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSggb3RoZXIsIFBhcnNlckVsZW1lbnQgKToNCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNhbm5vdCBjb21iaW5lIGVsZW1lbnQgb2YgdHlwZSAlcyB3aXRoIFBhcnNlckVsZW1lbnQiICUgdHlwZShvdGhlciksDQogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgIHJldHVybiBOb25lDQogICAgICAgIHJldHVybiBFYWNoKCBbIHNlbGYsIG90aGVyIF0gKQ0KDQogICAgZGVmIF9fcmFuZF9fKHNlbGYsIG90aGVyICk6DQogICAgICAgICIiIg0KICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiAmIG9wZXJhdG9yIHdoZW4gbGVmdCBvcGVyYW5kIGlzIG5vdCBhIEN7THtQYXJzZXJFbGVtZW50fX0NCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQ0KICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSggb3RoZXIsIFBhcnNlckVsZW1lbnQgKToNCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNhbm5vdCBjb21iaW5lIGVsZW1lbnQgb2YgdHlwZSAlcyB3aXRoIFBhcnNlckVsZW1lbnQiICUgdHlwZShvdGhlciksDQogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgIHJldHVybiBOb25lDQogICAgICAgIHJldHVybiBvdGhlciAmIHNlbGYNCg0KICAgIGRlZiBfX2ludmVydF9fKCBzZWxmICk6DQogICAgICAgICIiIg0KICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiB+IG9wZXJhdG9yIC0gcmV0dXJucyBDe0x7Tm90QW55fX0NCiAgICAgICAgIiIiDQogICAgICAgIHJldHVybiBOb3RBbnkoIHNlbGYgKQ0KDQogICAgZGVmIF9fY2FsbF9fKHNlbGYsIG5hbWU9Tm9uZSk6DQogICAgICAgICIiIg0KICAgICAgICBTaG9ydGN1dCBmb3IgQ3tMe3NldFJlc3VsdHNOYW1lfX0sIHdpdGggQ3tsaXN0QWxsTWF0Y2hlcz1GYWxzZX0uDQogICAgICAgIA0KICAgICAgICBJZiBDe25hbWV9IGlzIGdpdmVuIHdpdGggYSB0cmFpbGluZyBDeycqJ30gY2hhcmFjdGVyLCB0aGVuIEN7bGlzdEFsbE1hdGNoZXN9IHdpbGwgYmUNCiAgICAgICAgcGFzc2VkIGFzIEN7VHJ1ZX0uDQogICAgICAgICAgIA0KICAgICAgICBJZiBDe25hbWV9IGlzIG9taXR0ZWQsIHNhbWUgYXMgY2FsbGluZyBDe0x7Y29weX19Lg0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgIyB0aGVzZSBhcmUgZXF1aXZhbGVudA0KICAgICAgICAgICAgdXNlcmRhdGEgPSBXb3JkKGFscGhhcykuc2V0UmVzdWx0c05hbWUoIm5hbWUiKSArIFdvcmQobnVtcysiLSIpLnNldFJlc3VsdHNOYW1lKCJzb2NzZWNubyIpDQogICAgICAgICAgICB1c2VyZGF0YSA9IFdvcmQoYWxwaGFzKSgibmFtZSIpICsgV29yZChudW1zKyItIikoInNvY3NlY25vIikgICAgICAgICAgICAgDQogICAgICAgICIiIg0KICAgICAgICBpZiBuYW1lIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2V0UmVzdWx0c05hbWUobmFtZSkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLmNvcHkoKQ0KDQogICAgZGVmIHN1cHByZXNzKCBzZWxmICk6DQogICAgICAgICIiIg0KICAgICAgICBTdXBwcmVzc2VzIHRoZSBvdXRwdXQgb2YgdGhpcyBDe1BhcnNlckVsZW1lbnR9OyB1c2VmdWwgdG8ga2VlcCBwdW5jdHVhdGlvbiBmcm9tDQogICAgICAgIGNsdXR0ZXJpbmcgdXAgcmV0dXJuZWQgb3V0cHV0Lg0KICAgICAgICAiIiINCiAgICAgICAgcmV0dXJuIFN1cHByZXNzKCBzZWxmICkNCg0KICAgIGRlZiBsZWF2ZVdoaXRlc3BhY2UoIHNlbGYgKToNCiAgICAgICAgIiIiDQogICAgICAgIERpc2FibGVzIHRoZSBza2lwcGluZyBvZiB3aGl0ZXNwYWNlIGJlZm9yZSBtYXRjaGluZyB0aGUgY2hhcmFjdGVycyBpbiB0aGUNCiAgICAgICAgQ3tQYXJzZXJFbGVtZW50fSdzIGRlZmluZWQgcGF0dGVybi4gIFRoaXMgaXMgbm9ybWFsbHkgb25seSB1c2VkIGludGVybmFsbHkgYnkNCiAgICAgICAgdGhlIHB5cGFyc2luZyBtb2R1bGUsIGJ1dCBtYXkgYmUgbmVlZGVkIGluIHNvbWUgd2hpdGVzcGFjZS1zZW5zaXRpdmUgZ3JhbW1hcnMuDQogICAgICAgICIiIg0KICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gRmFsc2UNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBzZXRXaGl0ZXNwYWNlQ2hhcnMoIHNlbGYsIGNoYXJzICk6DQogICAgICAgICIiIg0KICAgICAgICBPdmVycmlkZXMgdGhlIGRlZmF1bHQgd2hpdGVzcGFjZSBjaGFycw0KICAgICAgICAiIiINCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IFRydWUNCiAgICAgICAgc2VsZi53aGl0ZUNoYXJzID0gY2hhcnMNCiAgICAgICAgc2VsZi5jb3B5RGVmYXVsdFdoaXRlQ2hhcnMgPSBGYWxzZQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIHBhcnNlV2l0aFRhYnMoIHNlbGYgKToNCiAgICAgICAgIiIiDQogICAgICAgIE92ZXJyaWRlcyBkZWZhdWx0IGJlaGF2aW9yIHRvIGV4cGFuZCBDezxUQUI+fXMgdG8gc3BhY2VzIGJlZm9yZSBwYXJzaW5nIHRoZSBpbnB1dCBzdHJpbmcuDQogICAgICAgIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBDe3BhcnNlU3RyaW5nfSB3aGVuIHRoZSBpbnB1dCBncmFtbWFyIGNvbnRhaW5zIGVsZW1lbnRzIHRoYXQNCiAgICAgICAgbWF0Y2ggQ3s8VEFCPn0gY2hhcmFjdGVycy4NCiAgICAgICAgIiIiDQogICAgICAgIHNlbGYua2VlcFRhYnMgPSBUcnVlDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgaWdub3JlKCBzZWxmLCBvdGhlciApOg0KICAgICAgICAiIiINCiAgICAgICAgRGVmaW5lIGV4cHJlc3Npb24gdG8gYmUgaWdub3JlZCAoZS5nLiwgY29tbWVudHMpIHdoaWxlIGRvaW5nIHBhdHRlcm4NCiAgICAgICAgbWF0Y2hpbmc7IG1heSBiZSBjYWxsZWQgcmVwZWF0ZWRseSwgdG8gZGVmaW5lIG11bHRpcGxlIGNvbW1lbnQgb3Igb3RoZXINCiAgICAgICAgaWdub3JhYmxlIHBhdHRlcm5zLg0KICAgICAgICANCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBwYXR0ID0gT25lT3JNb3JlKFdvcmQoYWxwaGFzKSkNCiAgICAgICAgICAgIHBhdHQucGFyc2VTdHJpbmcoJ2FibGFqIC8qIGNvbW1lbnQgKi8gbHNramQnKSAjIC0+IFsnYWJsYWonXQ0KICAgICAgICAgICAgDQogICAgICAgICAgICBwYXR0Lmlnbm9yZShjU3R5bGVDb21tZW50KQ0KICAgICAgICAgICAgcGF0dC5wYXJzZVN0cmluZygnYWJsYWogLyogY29tbWVudCAqLyBsc2tqZCcpICMgLT4gWydhYmxhaicsICdsc2tqZCddDQogICAgICAgICIiIg0KICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBiYXNlc3RyaW5nKToNCiAgICAgICAgICAgIG90aGVyID0gU3VwcHJlc3Mob3RoZXIpDQoNCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIFN1cHByZXNzICk6DQogICAgICAgICAgICBpZiBvdGhlciBub3QgaW4gc2VsZi5pZ25vcmVFeHByczoNCiAgICAgICAgICAgICAgICBzZWxmLmlnbm9yZUV4cHJzLmFwcGVuZChvdGhlcikNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHNlbGYuaWdub3JlRXhwcnMuYXBwZW5kKCBTdXBwcmVzcyggb3RoZXIuY29weSgpICkgKQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIHNldERlYnVnQWN0aW9ucyggc2VsZiwgc3RhcnRBY3Rpb24sIHN1Y2Nlc3NBY3Rpb24sIGV4Y2VwdGlvbkFjdGlvbiApOg0KICAgICAgICAiIiINCiAgICAgICAgRW5hYmxlIGRpc3BsYXkgb2YgZGVidWdnaW5nIG1lc3NhZ2VzIHdoaWxlIGRvaW5nIHBhdHRlcm4gbWF0Y2hpbmcuDQogICAgICAgICIiIg0KICAgICAgICBzZWxmLmRlYnVnQWN0aW9ucyA9IChzdGFydEFjdGlvbiBvciBfZGVmYXVsdFN0YXJ0RGVidWdBY3Rpb24sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NBY3Rpb24gb3IgX2RlZmF1bHRTdWNjZXNzRGVidWdBY3Rpb24sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbkFjdGlvbiBvciBfZGVmYXVsdEV4Y2VwdGlvbkRlYnVnQWN0aW9uKQ0KICAgICAgICBzZWxmLmRlYnVnID0gVHJ1ZQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIHNldERlYnVnKCBzZWxmLCBmbGFnPVRydWUgKToNCiAgICAgICAgIiIiDQogICAgICAgIEVuYWJsZSBkaXNwbGF5IG9mIGRlYnVnZ2luZyBtZXNzYWdlcyB3aGlsZSBkb2luZyBwYXR0ZXJuIG1hdGNoaW5nLg0KICAgICAgICBTZXQgQ3tmbGFnfSB0byBUcnVlIHRvIGVuYWJsZSwgRmFsc2UgdG8gZGlzYWJsZS4NCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIHdkID0gV29yZChhbHBoYXMpLnNldE5hbWUoImFscGhhd29yZCIpDQogICAgICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKS5zZXROYW1lKCJudW13b3JkIikNCiAgICAgICAgICAgIHRlcm0gPSB3ZCB8IGludGVnZXINCiAgICAgICAgICAgIA0KICAgICAgICAgICAgIyB0dXJuIG9uIGRlYnVnZ2luZyBmb3Igd2QNCiAgICAgICAgICAgIHdkLnNldERlYnVnKCkNCg0KICAgICAgICAgICAgT25lT3JNb3JlKHRlcm0pLnBhcnNlU3RyaW5nKCJhYmMgMTIzIHh5eiA4OTAiKQ0KICAgICAgICANCiAgICAgICAgcHJpbnRzOjoNCiAgICAgICAgICAgIE1hdGNoIGFscGhhd29yZCBhdCBsb2MgMCgxLDEpDQogICAgICAgICAgICBNYXRjaGVkIGFscGhhd29yZCAtPiBbJ2FiYyddDQogICAgICAgICAgICBNYXRjaCBhbHBoYXdvcmQgYXQgbG9jIDMoMSw0KQ0KICAgICAgICAgICAgRXhjZXB0aW9uIHJhaXNlZDpFeHBlY3RlZCBhbHBoYXdvcmQgKGF0IGNoYXIgNCksIChsaW5lOjEsIGNvbDo1KQ0KICAgICAgICAgICAgTWF0Y2ggYWxwaGF3b3JkIGF0IGxvYyA3KDEsOCkNCiAgICAgICAgICAgIE1hdGNoZWQgYWxwaGF3b3JkIC0+IFsneHl6J10NCiAgICAgICAgICAgIE1hdGNoIGFscGhhd29yZCBhdCBsb2MgMTEoMSwxMikNCiAgICAgICAgICAgIEV4Y2VwdGlvbiByYWlzZWQ6RXhwZWN0ZWQgYWxwaGF3b3JkIChhdCBjaGFyIDEyKSwgKGxpbmU6MSwgY29sOjEzKQ0KICAgICAgICAgICAgTWF0Y2ggYWxwaGF3b3JkIGF0IGxvYyAxNSgxLDE2KQ0KICAgICAgICAgICAgRXhjZXB0aW9uIHJhaXNlZDpFeHBlY3RlZCBhbHBoYXdvcmQgKGF0IGNoYXIgMTUpLCAobGluZToxLCBjb2w6MTYpDQoNCiAgICAgICAgVGhlIG91dHB1dCBzaG93biBpcyB0aGF0IHByb2R1Y2VkIGJ5IHRoZSBkZWZhdWx0IGRlYnVnIGFjdGlvbnMgLSBjdXN0b20gZGVidWcgYWN0aW9ucyBjYW4gYmUNCiAgICAgICAgc3BlY2lmaWVkIHVzaW5nIEx7c2V0RGVidWdBY3Rpb25zfS4gUHJpb3IgdG8gYXR0ZW1wdGluZw0KICAgICAgICB0byBtYXRjaCB0aGUgQ3t3ZH0gZXhwcmVzc2lvbiwgdGhlIGRlYnVnZ2luZyBtZXNzYWdlIEN7Ik1hdGNoIDxleHBybmFtZT4gYXQgbG9jIDxuPig8bGluZT4sPGNvbD4pIn0NCiAgICAgICAgaXMgc2hvd24uIFRoZW4gaWYgdGhlIHBhcnNlIHN1Y2NlZWRzLCBhIEN7Ik1hdGNoZWQifSBtZXNzYWdlIGlzIHNob3duLCBvciBhbiBDeyJFeGNlcHRpb24gcmFpc2VkIn0NCiAgICAgICAgbWVzc2FnZSBpcyBzaG93bi4gQWxzbyBub3RlIHRoZSB1c2Ugb2YgTHtzZXROYW1lfSB0byBhc3NpZ24gYSBodW1hbi1yZWFkYWJsZSBuYW1lIHRvIHRoZSBleHByZXNzaW9uLA0KICAgICAgICB3aGljaCBtYWtlcyBkZWJ1Z2dpbmcgYW5kIGV4Y2VwdGlvbiBtZXNzYWdlcyBlYXNpZXIgdG8gdW5kZXJzdGFuZCAtIGZvciBpbnN0YW5jZSwgdGhlIGRlZmF1bHQNCiAgICAgICAgbmFtZSBjcmVhdGVkIGZvciB0aGUgQ3tXb3JkfSBleHByZXNzaW9uIHdpdGhvdXQgY2FsbGluZyBDe3NldE5hbWV9IGlzIEN7Ilc6KEFCQ0QuLi4pIn0uDQogICAgICAgICIiIg0KICAgICAgICBpZiBmbGFnOg0KICAgICAgICAgICAgc2VsZi5zZXREZWJ1Z0FjdGlvbnMoIF9kZWZhdWx0U3RhcnREZWJ1Z0FjdGlvbiwgX2RlZmF1bHRTdWNjZXNzRGVidWdBY3Rpb24sIF9kZWZhdWx0RXhjZXB0aW9uRGVidWdBY3Rpb24gKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc2VsZi5kZWJ1ZyA9IEZhbHNlDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICByZXR1cm4gc2VsZi5uYW1lDQoNCiAgICBkZWYgX19yZXByX18oIHNlbGYgKToNCiAgICAgICAgcmV0dXJuIF91c3RyKHNlbGYpDQoNCiAgICBkZWYgc3RyZWFtbGluZSggc2VsZiApOg0KICAgICAgICBzZWxmLnN0cmVhbWxpbmVkID0gVHJ1ZQ0KICAgICAgICBzZWxmLnN0clJlcHIgPSBOb25lDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgY2hlY2tSZWN1cnNpb24oIHNlbGYsIHBhcnNlRWxlbWVudExpc3QgKToNCiAgICAgICAgcGFzcw0KDQogICAgZGVmIHZhbGlkYXRlKCBzZWxmLCB2YWxpZGF0ZVRyYWNlPVtdICk6DQogICAgICAgICIiIg0KICAgICAgICBDaGVjayBkZWZpbmVkIGV4cHJlc3Npb25zIGZvciB2YWxpZCBzdHJ1Y3R1cmUsIGNoZWNrIGZvciBpbmZpbml0ZSByZWN1cnNpdmUgZGVmaW5pdGlvbnMuDQogICAgICAgICIiIg0KICAgICAgICBzZWxmLmNoZWNrUmVjdXJzaW9uKCBbXSApDQoNCiAgICBkZWYgcGFyc2VGaWxlKCBzZWxmLCBmaWxlX29yX2ZpbGVuYW1lLCBwYXJzZUFsbD1GYWxzZSApOg0KICAgICAgICAiIiINCiAgICAgICAgRXhlY3V0ZSB0aGUgcGFyc2UgZXhwcmVzc2lvbiBvbiB0aGUgZ2l2ZW4gZmlsZSBvciBmaWxlbmFtZS4NCiAgICAgICAgSWYgYSBmaWxlbmFtZSBpcyBzcGVjaWZpZWQgKGluc3RlYWQgb2YgYSBmaWxlIG9iamVjdCksDQogICAgICAgIHRoZSBlbnRpcmUgZmlsZSBpcyBvcGVuZWQsIHJlYWQsIGFuZCBjbG9zZWQgYmVmb3JlIHBhcnNpbmcuDQogICAgICAgICIiIg0KICAgICAgICB0cnk6DQogICAgICAgICAgICBmaWxlX2NvbnRlbnRzID0gZmlsZV9vcl9maWxlbmFtZS5yZWFkKCkNCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOg0KICAgICAgICAgICAgd2l0aCBvcGVuKGZpbGVfb3JfZmlsZW5hbWUsICJyIikgYXMgZjoNCiAgICAgICAgICAgICAgICBmaWxlX2NvbnRlbnRzID0gZi5yZWFkKCkNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VTdHJpbmcoZmlsZV9jb250ZW50cywgcGFyc2VBbGwpDQogICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb24gYXMgZXhjOg0KICAgICAgICAgICAgaWYgUGFyc2VyRWxlbWVudC52ZXJib3NlX3N0YWNrdHJhY2U6DQogICAgICAgICAgICAgICAgcmFpc2UNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgIyBjYXRjaCBhbmQgcmUtcmFpc2UgZXhjZXB0aW9uIGZyb20gaGVyZSwgY2xlYXJzIG91dCBweXBhcnNpbmcgaW50ZXJuYWwgc3RhY2sgdHJhY2UNCiAgICAgICAgICAgICAgICByYWlzZSBleGMNCg0KICAgIGRlZiBfX2VxX18oc2VsZixvdGhlcik6DQogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIFBhcnNlckVsZW1lbnQpOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYgaXMgb3RoZXIgb3IgdmFycyhzZWxmKSA9PSB2YXJzKG90aGVyKQ0KICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob3RoZXIsIGJhc2VzdHJpbmcpOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYubWF0Y2hlcyhvdGhlcikNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJldHVybiBzdXBlcihQYXJzZXJFbGVtZW50LHNlbGYpPT1vdGhlcg0KDQogICAgZGVmIF9fbmVfXyhzZWxmLG90aGVyKToNCiAgICAgICAgcmV0dXJuIG5vdCAoc2VsZiA9PSBvdGhlcikNCg0KICAgIGRlZiBfX2hhc2hfXyhzZWxmKToNCiAgICAgICAgcmV0dXJuIGhhc2goaWQoc2VsZikpDQoNCiAgICBkZWYgX19yZXFfXyhzZWxmLG90aGVyKToNCiAgICAgICAgcmV0dXJuIHNlbGYgPT0gb3RoZXINCg0KICAgIGRlZiBfX3JuZV9fKHNlbGYsb3RoZXIpOg0KICAgICAgICByZXR1cm4gbm90IChzZWxmID09IG90aGVyKQ0KDQogICAgZGVmIG1hdGNoZXMoc2VsZiwgdGVzdFN0cmluZywgcGFyc2VBbGw9VHJ1ZSk6DQogICAgICAgICIiIg0KICAgICAgICBNZXRob2QgZm9yIHF1aWNrIHRlc3Rpbmcgb2YgYSBwYXJzZXIgYWdhaW5zdCBhIHRlc3Qgc3RyaW5nLiBHb29kIGZvciBzaW1wbGUgDQogICAgICAgIGlubGluZSBtaWNyb3Rlc3RzIG9mIHN1YiBleHByZXNzaW9ucyB3aGlsZSBidWlsZGluZyB1cCBsYXJnZXIgcGFyc2VyLg0KICAgICAgICAgICANCiAgICAgICAgUGFyYW1ldGVyczoNCiAgICAgICAgIC0gdGVzdFN0cmluZyAtIHRvIHRlc3QgYWdhaW5zdCB0aGlzIGV4cHJlc3Npb24gZm9yIGEgbWF0Y2gNCiAgICAgICAgIC0gcGFyc2VBbGwgLSAoZGVmYXVsdD1De1RydWV9KSAtIGZsYWcgdG8gcGFzcyB0byBDe0x7cGFyc2VTdHJpbmd9fSB3aGVuIHJ1bm5pbmcgdGVzdHMNCiAgICAgICAgICAgIA0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIGV4cHIgPSBXb3JkKG51bXMpDQogICAgICAgICAgICBhc3NlcnQgZXhwci5tYXRjaGVzKCIxMDAiKQ0KICAgICAgICAiIiINCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgc2VsZi5wYXJzZVN0cmluZyhfdXN0cih0ZXN0U3RyaW5nKSwgcGFyc2VBbGw9cGFyc2VBbGwpDQogICAgICAgICAgICByZXR1cm4gVHJ1ZQ0KICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uOg0KICAgICAgICAgICAgcmV0dXJuIEZhbHNlDQogICAgICAgICAgICAgICAgDQogICAgZGVmIHJ1blRlc3RzKHNlbGYsIHRlc3RzLCBwYXJzZUFsbD1UcnVlLCBjb21tZW50PScjJywgZnVsbER1bXA9VHJ1ZSwgcHJpbnRSZXN1bHRzPVRydWUsIGZhaWx1cmVUZXN0cz1GYWxzZSk6DQogICAgICAgICIiIg0KICAgICAgICBFeGVjdXRlIHRoZSBwYXJzZSBleHByZXNzaW9uIG9uIGEgc2VyaWVzIG9mIHRlc3Qgc3RyaW5ncywgc2hvd2luZyBlYWNoDQogICAgICAgIHRlc3QsIHRoZSBwYXJzZWQgcmVzdWx0cyBvciB3aGVyZSB0aGUgcGFyc2UgZmFpbGVkLiBRdWljayBhbmQgZWFzeSB3YXkgdG8NCiAgICAgICAgcnVuIGEgcGFyc2UgZXhwcmVzc2lvbiBhZ2FpbnN0IGEgbGlzdCBvZiBzYW1wbGUgc3RyaW5ncy4NCiAgICAgICAgICAgDQogICAgICAgIFBhcmFtZXRlcnM6DQogICAgICAgICAtIHRlc3RzIC0gYSBsaXN0IG9mIHNlcGFyYXRlIHRlc3Qgc3RyaW5ncywgb3IgYSBtdWx0aWxpbmUgc3RyaW5nIG9mIHRlc3Qgc3RyaW5ncw0KICAgICAgICAgLSBwYXJzZUFsbCAtIChkZWZhdWx0PUN7VHJ1ZX0pIC0gZmxhZyB0byBwYXNzIHRvIEN7THtwYXJzZVN0cmluZ319IHdoZW4gcnVubmluZyB0ZXN0cyAgICAgICAgICAgDQogICAgICAgICAtIGNvbW1lbnQgLSAoZGVmYXVsdD1DeycjJ30pIC0gZXhwcmVzc2lvbiBmb3IgaW5kaWNhdGluZyBlbWJlZGRlZCBjb21tZW50cyBpbiB0aGUgdGVzdCANCiAgICAgICAgICAgICAgc3RyaW5nOyBwYXNzIE5vbmUgdG8gZGlzYWJsZSBjb21tZW50IGZpbHRlcmluZw0KICAgICAgICAgLSBmdWxsRHVtcCAtIChkZWZhdWx0PUN7VHJ1ZX0pIC0gZHVtcCByZXN1bHRzIGFzIGxpc3QgZm9sbG93ZWQgYnkgcmVzdWx0cyBuYW1lcyBpbiBuZXN0ZWQgb3V0bGluZTsNCiAgICAgICAgICAgICAgaWYgRmFsc2UsIG9ubHkgZHVtcCBuZXN0ZWQgbGlzdA0KICAgICAgICAgLSBwcmludFJlc3VsdHMgLSAoZGVmYXVsdD1De1RydWV9KSBwcmludHMgdGVzdCBvdXRwdXQgdG8gc3Rkb3V0DQogICAgICAgICAtIGZhaWx1cmVUZXN0cyAtIChkZWZhdWx0PUN7RmFsc2V9KSBpbmRpY2F0ZXMgaWYgdGhlc2UgdGVzdHMgYXJlIGV4cGVjdGVkIHRvIGZhaWwgcGFyc2luZw0KDQogICAgICAgIFJldHVybnM6IGEgKHN1Y2Nlc3MsIHJlc3VsdHMpIHR1cGxlLCB3aGVyZSBzdWNjZXNzIGluZGljYXRlcyB0aGF0IGFsbCB0ZXN0cyBzdWNjZWVkZWQNCiAgICAgICAgKG9yIGZhaWxlZCBpZiBDe2ZhaWx1cmVUZXN0c30gaXMgVHJ1ZSksIGFuZCB0aGUgcmVzdWx0cyBjb250YWluIGEgbGlzdCBvZiBsaW5lcyBvZiBlYWNoIA0KICAgICAgICB0ZXN0J3Mgb3V0cHV0DQogICAgICAgIA0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIG51bWJlcl9leHByID0gcHlwYXJzaW5nX2NvbW1vbi5udW1iZXIuY29weSgpDQoNCiAgICAgICAgICAgIHJlc3VsdCA9IG51bWJlcl9leHByLnJ1blRlc3RzKCcnJw0KICAgICAgICAgICAgICAgICMgdW5zaWduZWQgaW50ZWdlcg0KICAgICAgICAgICAgICAgIDEwMA0KICAgICAgICAgICAgICAgICMgbmVnYXRpdmUgaW50ZWdlcg0KICAgICAgICAgICAgICAgIC0xMDANCiAgICAgICAgICAgICAgICAjIGZsb2F0IHdpdGggc2NpZW50aWZpYyBub3RhdGlvbg0KICAgICAgICAgICAgICAgIDYuMDJlMjMNCiAgICAgICAgICAgICAgICAjIGludGVnZXIgd2l0aCBzY2llbnRpZmljIG5vdGF0aW9uDQogICAgICAgICAgICAgICAgMWUtMTINCiAgICAgICAgICAgICAgICAnJycpDQogICAgICAgICAgICBwcmludCgiU3VjY2VzcyIgaWYgcmVzdWx0WzBdIGVsc2UgIkZhaWxlZCEiKQ0KDQogICAgICAgICAgICByZXN1bHQgPSBudW1iZXJfZXhwci5ydW5UZXN0cygnJycNCiAgICAgICAgICAgICAgICAjIHN0cmF5IGNoYXJhY3Rlcg0KICAgICAgICAgICAgICAgIDEwMFoNCiAgICAgICAgICAgICAgICAjIG1pc3NpbmcgbGVhZGluZyBkaWdpdCBiZWZvcmUgJy4nDQogICAgICAgICAgICAgICAgLS4xMDANCiAgICAgICAgICAgICAgICAjIHRvbyBtYW55ICcuJw0KICAgICAgICAgICAgICAgIDMuMTQuMTU5DQogICAgICAgICAgICAgICAgJycnLCBmYWlsdXJlVGVzdHM9VHJ1ZSkNCiAgICAgICAgICAgIHByaW50KCJTdWNjZXNzIiBpZiByZXN1bHRbMF0gZWxzZSAiRmFpbGVkISIpDQogICAgICAgIHByaW50czo6DQogICAgICAgICAgICAjIHVuc2lnbmVkIGludGVnZXINCiAgICAgICAgICAgIDEwMA0KICAgICAgICAgICAgWzEwMF0NCg0KICAgICAgICAgICAgIyBuZWdhdGl2ZSBpbnRlZ2VyDQogICAgICAgICAgICAtMTAwDQogICAgICAgICAgICBbLTEwMF0NCg0KICAgICAgICAgICAgIyBmbG9hdCB3aXRoIHNjaWVudGlmaWMgbm90YXRpb24NCiAgICAgICAgICAgIDYuMDJlMjMNCiAgICAgICAgICAgIFs2LjAyZSsyM10NCg0KICAgICAgICAgICAgIyBpbnRlZ2VyIHdpdGggc2NpZW50aWZpYyBub3RhdGlvbg0KICAgICAgICAgICAgMWUtMTINCiAgICAgICAgICAgIFsxZS0xMl0NCg0KICAgICAgICAgICAgU3VjY2Vzcw0KICAgICAgICAgICAgDQogICAgICAgICAgICAjIHN0cmF5IGNoYXJhY3Rlcg0KICAgICAgICAgICAgMTAwWg0KICAgICAgICAgICAgICAgXg0KICAgICAgICAgICAgRkFJTDogRXhwZWN0ZWQgZW5kIG9mIHRleHQgKGF0IGNoYXIgMyksIChsaW5lOjEsIGNvbDo0KQ0KDQogICAgICAgICAgICAjIG1pc3NpbmcgbGVhZGluZyBkaWdpdCBiZWZvcmUgJy4nDQogICAgICAgICAgICAtLjEwMA0KICAgICAgICAgICAgXg0KICAgICAgICAgICAgRkFJTDogRXhwZWN0ZWQge3JlYWwgbnVtYmVyIHdpdGggc2NpZW50aWZpYyBub3RhdGlvbiB8IHJlYWwgbnVtYmVyIHwgc2lnbmVkIGludGVnZXJ9IChhdCBjaGFyIDApLCAobGluZToxLCBjb2w6MSkNCg0KICAgICAgICAgICAgIyB0b28gbWFueSAnLicNCiAgICAgICAgICAgIDMuMTQuMTU5DQogICAgICAgICAgICAgICAgXg0KICAgICAgICAgICAgRkFJTDogRXhwZWN0ZWQgZW5kIG9mIHRleHQgKGF0IGNoYXIgNCksIChsaW5lOjEsIGNvbDo1KQ0KDQogICAgICAgICAgICBTdWNjZXNzDQoNCiAgICAgICAgRWFjaCB0ZXN0IHN0cmluZyBtdXN0IGJlIG9uIGEgc2luZ2xlIGxpbmUuIElmIHlvdSB3YW50IHRvIHRlc3QgYSBzdHJpbmcgdGhhdCBzcGFucyBtdWx0aXBsZQ0KICAgICAgICBsaW5lcywgY3JlYXRlIGEgdGVzdCBsaWtlIHRoaXM6Og0KDQogICAgICAgICAgICBleHByLnJ1blRlc3QociJ0aGlzIGlzIGEgdGVzdFxcbiBvZiBzdHJpbmdzIHRoYXQgc3BhbnMgXFxuIDMgbGluZXMiKQ0KICAgICAgICANCiAgICAgICAgKE5vdGUgdGhhdCB0aGlzIGlzIGEgcmF3IHN0cmluZyBsaXRlcmFsLCB5b3UgbXVzdCBpbmNsdWRlIHRoZSBsZWFkaW5nICdyJy4pDQogICAgICAgICIiIg0KICAgICAgICBpZiBpc2luc3RhbmNlKHRlc3RzLCBiYXNlc3RyaW5nKToNCiAgICAgICAgICAgIHRlc3RzID0gbGlzdChtYXAoc3RyLnN0cmlwLCB0ZXN0cy5yc3RyaXAoKS5zcGxpdGxpbmVzKCkpKQ0KICAgICAgICBpZiBpc2luc3RhbmNlKGNvbW1lbnQsIGJhc2VzdHJpbmcpOg0KICAgICAgICAgICAgY29tbWVudCA9IExpdGVyYWwoY29tbWVudCkNCiAgICAgICAgYWxsUmVzdWx0cyA9IFtdDQogICAgICAgIGNvbW1lbnRzID0gW10NCiAgICAgICAgc3VjY2VzcyA9IFRydWUNCiAgICAgICAgZm9yIHQgaW4gdGVzdHM6DQogICAgICAgICAgICBpZiBjb21tZW50IGlzIG5vdCBOb25lIGFuZCBjb21tZW50Lm1hdGNoZXModCwgRmFsc2UpIG9yIGNvbW1lbnRzIGFuZCBub3QgdDoNCiAgICAgICAgICAgICAgICBjb21tZW50cy5hcHBlbmQodCkNCiAgICAgICAgICAgICAgICBjb250aW51ZQ0KICAgICAgICAgICAgaWYgbm90IHQ6DQogICAgICAgICAgICAgICAgY29udGludWUNCiAgICAgICAgICAgIG91dCA9IFsnXG4nLmpvaW4oY29tbWVudHMpLCB0XQ0KICAgICAgICAgICAgY29tbWVudHMgPSBbXQ0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIHQgPSB0LnJlcGxhY2UocidcbicsJ1xuJykNCiAgICAgICAgICAgICAgICByZXN1bHQgPSBzZWxmLnBhcnNlU3RyaW5nKHQsIHBhcnNlQWxsPXBhcnNlQWxsKQ0KICAgICAgICAgICAgICAgIG91dC5hcHBlbmQocmVzdWx0LmR1bXAoZnVsbD1mdWxsRHVtcCkpDQogICAgICAgICAgICAgICAgc3VjY2VzcyA9IHN1Y2Nlc3MgYW5kIG5vdCBmYWlsdXJlVGVzdHMNCiAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb24gYXMgcGU6DQogICAgICAgICAgICAgICAgZmF0YWwgPSAiKEZBVEFMKSIgaWYgaXNpbnN0YW5jZShwZSwgUGFyc2VGYXRhbEV4Y2VwdGlvbikgZWxzZSAiIg0KICAgICAgICAgICAgICAgIGlmICdcbicgaW4gdDoNCiAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZChsaW5lKHBlLmxvYywgdCkpDQogICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoJyAnKihjb2wocGUubG9jLHQpLTEpICsgJ14nICsgZmF0YWwpDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCgnICcqcGUubG9jICsgJ14nICsgZmF0YWwpDQogICAgICAgICAgICAgICAgb3V0LmFwcGVuZCgiRkFJTDogIiArIHN0cihwZSkpDQogICAgICAgICAgICAgICAgc3VjY2VzcyA9IHN1Y2Nlc3MgYW5kIGZhaWx1cmVUZXN0cw0KICAgICAgICAgICAgICAgIHJlc3VsdCA9IHBlDQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4YzoNCiAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCJGQUlMLUVYQ0VQVElPTjogIiArIHN0cihleGMpKQ0KICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBzdWNjZXNzIGFuZCBmYWlsdXJlVGVzdHMNCiAgICAgICAgICAgICAgICByZXN1bHQgPSBleGMNCg0KICAgICAgICAgICAgaWYgcHJpbnRSZXN1bHRzOg0KICAgICAgICAgICAgICAgIGlmIGZ1bGxEdW1wOg0KICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCcnKQ0KICAgICAgICAgICAgICAgIHByaW50KCdcbicuam9pbihvdXQpKQ0KDQogICAgICAgICAgICBhbGxSZXN1bHRzLmFwcGVuZCgodCwgcmVzdWx0KSkNCiAgICAgICAgDQogICAgICAgIHJldHVybiBzdWNjZXNzLCBhbGxSZXN1bHRzDQoNCiAgICAgICAgDQpjbGFzcyBUb2tlbihQYXJzZXJFbGVtZW50KToNCiAgICAiIiINCiAgICBBYnN0cmFjdCBDe1BhcnNlckVsZW1lbnR9IHN1YmNsYXNzLCBmb3IgZGVmaW5pbmcgYXRvbWljIG1hdGNoaW5nIHBhdHRlcm5zLg0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiApOg0KICAgICAgICBzdXBlcihUb2tlbixzZWxmKS5fX2luaXRfXyggc2F2ZWxpc3Q9RmFsc2UgKQ0KDQoNCmNsYXNzIEVtcHR5KFRva2VuKToNCiAgICAiIiINCiAgICBBbiBlbXB0eSB0b2tlbiwgd2lsbCBhbHdheXMgbWF0Y2guDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmICk6DQogICAgICAgIHN1cGVyKEVtcHR5LHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgc2VsZi5uYW1lID0gIkVtcHR5Ig0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQ0KICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQ0KDQoNCmNsYXNzIE5vTWF0Y2goVG9rZW4pOg0KICAgICIiIg0KICAgIEEgdG9rZW4gdGhhdCB3aWxsIG5ldmVyIG1hdGNoLg0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiApOg0KICAgICAgICBzdXBlcihOb01hdGNoLHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgc2VsZi5uYW1lID0gIk5vTWF0Y2giDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlDQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlDQogICAgICAgIHNlbGYuZXJybXNnID0gIlVubWF0Y2hhYmxlIHRva2VuIg0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCg0KY2xhc3MgTGl0ZXJhbChUb2tlbik6DQogICAgIiIiDQogICAgVG9rZW4gdG8gZXhhY3RseSBtYXRjaCBhIHNwZWNpZmllZCBzdHJpbmcuDQogICAgDQogICAgRXhhbXBsZTo6DQogICAgICAgIExpdGVyYWwoJ2JsYWgnKS5wYXJzZVN0cmluZygnYmxhaCcpICAjIC0+IFsnYmxhaCddDQogICAgICAgIExpdGVyYWwoJ2JsYWgnKS5wYXJzZVN0cmluZygnYmxhaGZvb2JsYWgnKSAgIyAtPiBbJ2JsYWgnXQ0KICAgICAgICBMaXRlcmFsKCdibGFoJykucGFyc2VTdHJpbmcoJ2JsYScpICAjIC0+IEV4Y2VwdGlvbjogRXhwZWN0ZWQgImJsYWgiDQogICAgDQogICAgRm9yIGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2hpbmcsIHVzZSBMe0Nhc2VsZXNzTGl0ZXJhbH0uDQogICAgDQogICAgRm9yIGtleXdvcmQgbWF0Y2hpbmcgKGZvcmNlIHdvcmQgYnJlYWsgYmVmb3JlIGFuZCBhZnRlciB0aGUgbWF0Y2hlZCBzdHJpbmcpLA0KICAgIHVzZSBMe0tleXdvcmR9IG9yIEx7Q2FzZWxlc3NLZXl3b3JkfS4NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIG1hdGNoU3RyaW5nICk6DQogICAgICAgIHN1cGVyKExpdGVyYWwsc2VsZikuX19pbml0X18oKQ0KICAgICAgICBzZWxmLm1hdGNoID0gbWF0Y2hTdHJpbmcNCiAgICAgICAgc2VsZi5tYXRjaExlbiA9IGxlbihtYXRjaFN0cmluZykNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgc2VsZi5maXJzdE1hdGNoQ2hhciA9IG1hdGNoU3RyaW5nWzBdDQogICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOg0KICAgICAgICAgICAgd2FybmluZ3Mud2FybigibnVsbCBzdHJpbmcgcGFzc2VkIHRvIExpdGVyYWw7IHVzZSBFbXB0eSgpIGluc3RlYWQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgIHNlbGYuX19jbGFzc19fID0gRW1wdHkNCiAgICAgICAgc2VsZi5uYW1lID0gJyIlcyInICUgX3VzdHIoc2VsZi5tYXRjaCkNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgIiArIHNlbGYubmFtZQ0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gRmFsc2UNCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UNCg0KICAgICMgUGVyZm9ybWFuY2UgdHVuaW5nOiB0aGlzIHJvdXRpbmUgZ2V0cyBjYWxsZWQgYSAqbG90Kg0KICAgICMgaWYgdGhpcyBpcyBhIHNpbmdsZSBjaGFyYWN0ZXIgbWF0Y2ggc3RyaW5nICBhbmQgdGhlIGZpcnN0IGNoYXJhY3RlciBtYXRjaGVzLA0KICAgICMgc2hvcnQtY2lyY3VpdCBhcyBxdWlja2x5IGFzIHBvc3NpYmxlLCBhbmQgYXZvaWQgY2FsbGluZyBzdGFydHN3aXRoDQogICAgI34gQHByb2ZpbGUNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiAoaW5zdHJpbmdbbG9jXSA9PSBzZWxmLmZpcnN0TWF0Y2hDaGFyIGFuZA0KICAgICAgICAgICAgKHNlbGYubWF0Y2hMZW49PTEgb3IgaW5zdHJpbmcuc3RhcnRzd2l0aChzZWxmLm1hdGNoLGxvYykpICk6DQogICAgICAgICAgICByZXR1cm4gbG9jK3NlbGYubWF0Y2hMZW4sIHNlbGYubWF0Y2gNCiAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQpfTCA9IExpdGVyYWwNClBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyA9IExpdGVyYWwNCg0KY2xhc3MgS2V5d29yZChUb2tlbik6DQogICAgIiIiDQogICAgVG9rZW4gdG8gZXhhY3RseSBtYXRjaCBhIHNwZWNpZmllZCBzdHJpbmcgYXMgYSBrZXl3b3JkLCB0aGF0IGlzLCBpdCBtdXN0IGJlDQogICAgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSBub24ta2V5d29yZCBjaGFyYWN0ZXIuICBDb21wYXJlIHdpdGggQ3tMe0xpdGVyYWx9fToNCiAgICAgLSBDe0xpdGVyYWwoImlmIil9IHdpbGwgbWF0Y2ggdGhlIGxlYWRpbmcgQ3snaWYnfSBpbiBDeydpZkFuZE9ubHlJZid9Lg0KICAgICAtIEN7S2V5d29yZCgiaWYiKX0gd2lsbCBub3Q7IGl0IHdpbGwgb25seSBtYXRjaCB0aGUgbGVhZGluZyBDeydpZid9IGluIEN7J2lmIHg9MSd9LCBvciBDeydpZih5PT0yKSd9DQogICAgQWNjZXB0cyB0d28gb3B0aW9uYWwgY29uc3RydWN0b3IgYXJndW1lbnRzIGluIGFkZGl0aW9uIHRvIHRoZSBrZXl3b3JkIHN0cmluZzoNCiAgICAgLSBDe2lkZW50Q2hhcnN9IGlzIGEgc3RyaW5nIG9mIGNoYXJhY3RlcnMgdGhhdCB3b3VsZCBiZSB2YWxpZCBpZGVudGlmaWVyIGNoYXJhY3RlcnMsDQogICAgICAgICAgZGVmYXVsdGluZyB0byBhbGwgYWxwaGFudW1lcmljcyArICJfIiBhbmQgIiQiDQogICAgIC0gQ3tjYXNlbGVzc30gYWxsb3dzIGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2hpbmcsIGRlZmF1bHQgaXMgQ3tGYWxzZX0uDQogICAgICAgDQogICAgRXhhbXBsZTo6DQogICAgICAgIEtleXdvcmQoInN0YXJ0IikucGFyc2VTdHJpbmcoInN0YXJ0IikgICMgLT4gWydzdGFydCddDQogICAgICAgIEtleXdvcmQoInN0YXJ0IikucGFyc2VTdHJpbmcoInN0YXJ0aW5nIikgICMgLT4gRXhjZXB0aW9uDQoNCiAgICBGb3IgY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaGluZywgdXNlIEx7Q2FzZWxlc3NLZXl3b3JkfS4NCiAgICAiIiINCiAgICBERUZBVUxUX0tFWVdPUkRfQ0hBUlMgPSBhbHBoYW51bXMrIl8kIg0KDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBtYXRjaFN0cmluZywgaWRlbnRDaGFycz1Ob25lLCBjYXNlbGVzcz1GYWxzZSApOg0KICAgICAgICBzdXBlcihLZXl3b3JkLHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgaWYgaWRlbnRDaGFycyBpcyBOb25lOg0KICAgICAgICAgICAgaWRlbnRDaGFycyA9IEtleXdvcmQuREVGQVVMVF9LRVlXT1JEX0NIQVJTDQogICAgICAgIHNlbGYubWF0Y2ggPSBtYXRjaFN0cmluZw0KICAgICAgICBzZWxmLm1hdGNoTGVuID0gbGVuKG1hdGNoU3RyaW5nKQ0KICAgICAgICB0cnk6DQogICAgICAgICAgICBzZWxmLmZpcnN0TWF0Y2hDaGFyID0gbWF0Y2hTdHJpbmdbMF0NCiAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6DQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJudWxsIHN0cmluZyBwYXNzZWQgdG8gS2V5d29yZDsgdXNlIEVtcHR5KCkgaW5zdGVhZCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KICAgICAgICBzZWxmLm5hbWUgPSAnIiVzIicgJSBzZWxmLm1hdGNoDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICIgKyBzZWxmLm5hbWUNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IEZhbHNlDQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlDQogICAgICAgIHNlbGYuY2FzZWxlc3MgPSBjYXNlbGVzcw0KICAgICAgICBpZiBjYXNlbGVzczoNCiAgICAgICAgICAgIHNlbGYuY2FzZWxlc3NtYXRjaCA9IG1hdGNoU3RyaW5nLnVwcGVyKCkNCiAgICAgICAgICAgIGlkZW50Q2hhcnMgPSBpZGVudENoYXJzLnVwcGVyKCkNCiAgICAgICAgc2VsZi5pZGVudENoYXJzID0gc2V0KGlkZW50Q2hhcnMpDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiBzZWxmLmNhc2VsZXNzOg0KICAgICAgICAgICAgaWYgKCAoaW5zdHJpbmdbIGxvYzpsb2Mrc2VsZi5tYXRjaExlbiBdLnVwcGVyKCkgPT0gc2VsZi5jYXNlbGVzc21hdGNoKSBhbmQNCiAgICAgICAgICAgICAgICAgKGxvYyA+PSBsZW4oaW5zdHJpbmcpLXNlbGYubWF0Y2hMZW4gb3IgaW5zdHJpbmdbbG9jK3NlbGYubWF0Y2hMZW5dLnVwcGVyKCkgbm90IGluIHNlbGYuaWRlbnRDaGFycykgYW5kDQogICAgICAgICAgICAgICAgIChsb2MgPT0gMCBvciBpbnN0cmluZ1tsb2MtMV0udXBwZXIoKSBub3QgaW4gc2VsZi5pZGVudENoYXJzKSApOg0KICAgICAgICAgICAgICAgIHJldHVybiBsb2Mrc2VsZi5tYXRjaExlbiwgc2VsZi5tYXRjaA0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgaWYgKGluc3RyaW5nW2xvY10gPT0gc2VsZi5maXJzdE1hdGNoQ2hhciBhbmQNCiAgICAgICAgICAgICAgICAoc2VsZi5tYXRjaExlbj09MSBvciBpbnN0cmluZy5zdGFydHN3aXRoKHNlbGYubWF0Y2gsbG9jKSkgYW5kDQogICAgICAgICAgICAgICAgKGxvYyA+PSBsZW4oaW5zdHJpbmcpLXNlbGYubWF0Y2hMZW4gb3IgaW5zdHJpbmdbbG9jK3NlbGYubWF0Y2hMZW5dIG5vdCBpbiBzZWxmLmlkZW50Q2hhcnMpIGFuZA0KICAgICAgICAgICAgICAgIChsb2MgPT0gMCBvciBpbnN0cmluZ1tsb2MtMV0gbm90IGluIHNlbGYuaWRlbnRDaGFycykgKToNCiAgICAgICAgICAgICAgICByZXR1cm4gbG9jK3NlbGYubWF0Y2hMZW4sIHNlbGYubWF0Y2gNCiAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCiAgICBkZWYgY29weShzZWxmKToNCiAgICAgICAgYyA9IHN1cGVyKEtleXdvcmQsc2VsZikuY29weSgpDQogICAgICAgIGMuaWRlbnRDaGFycyA9IEtleXdvcmQuREVGQVVMVF9LRVlXT1JEX0NIQVJTDQogICAgICAgIHJldHVybiBjDQoNCiAgICBAc3RhdGljbWV0aG9kDQogICAgZGVmIHNldERlZmF1bHRLZXl3b3JkQ2hhcnMoIGNoYXJzICk6DQogICAgICAgICIiIk92ZXJyaWRlcyB0aGUgZGVmYXVsdCBLZXl3b3JkIGNoYXJzDQogICAgICAgICIiIg0KICAgICAgICBLZXl3b3JkLkRFRkFVTFRfS0VZV09SRF9DSEFSUyA9IGNoYXJzDQoNCmNsYXNzIENhc2VsZXNzTGl0ZXJhbChMaXRlcmFsKToNCiAgICAiIiINCiAgICBUb2tlbiB0byBtYXRjaCBhIHNwZWNpZmllZCBzdHJpbmcsIGlnbm9yaW5nIGNhc2Ugb2YgbGV0dGVycy4NCiAgICBOb3RlOiB0aGUgbWF0Y2hlZCByZXN1bHRzIHdpbGwgYWx3YXlzIGJlIGluIHRoZSBjYXNlIG9mIHRoZSBnaXZlbg0KICAgIG1hdGNoIHN0cmluZywgTk9UIHRoZSBjYXNlIG9mIHRoZSBpbnB1dCB0ZXh0Lg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIE9uZU9yTW9yZShDYXNlbGVzc0xpdGVyYWwoIkNNRCIpKS5wYXJzZVN0cmluZygiY21kIENNRCBDbWQxMCIpICMgLT4gWydDTUQnLCAnQ01EJywgJ0NNRCddDQogICAgICAgIA0KICAgIChDb250cmFzdCB3aXRoIGV4YW1wbGUgZm9yIEx7Q2FzZWxlc3NLZXl3b3JkfS4pDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBtYXRjaFN0cmluZyApOg0KICAgICAgICBzdXBlcihDYXNlbGVzc0xpdGVyYWwsc2VsZikuX19pbml0X18oIG1hdGNoU3RyaW5nLnVwcGVyKCkgKQ0KICAgICAgICAjIFByZXNlcnZlIHRoZSBkZWZpbmluZyBsaXRlcmFsLg0KICAgICAgICBzZWxmLnJldHVyblN0cmluZyA9IG1hdGNoU3RyaW5nDQogICAgICAgIHNlbGYubmFtZSA9ICInJXMnIiAlIHNlbGYucmV0dXJuU3RyaW5nDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICIgKyBzZWxmLm5hbWUNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGlmIGluc3RyaW5nWyBsb2M6bG9jK3NlbGYubWF0Y2hMZW4gXS51cHBlcigpID09IHNlbGYubWF0Y2g6DQogICAgICAgICAgICByZXR1cm4gbG9jK3NlbGYubWF0Y2hMZW4sIHNlbGYucmV0dXJuU3RyaW5nDQogICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQpjbGFzcyBDYXNlbGVzc0tleXdvcmQoS2V5d29yZCk6DQogICAgIiIiDQogICAgQ2FzZWxlc3MgdmVyc2lvbiBvZiBMe0tleXdvcmR9Lg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIE9uZU9yTW9yZShDYXNlbGVzc0tleXdvcmQoIkNNRCIpKS5wYXJzZVN0cmluZygiY21kIENNRCBDbWQxMCIpICMgLT4gWydDTUQnLCAnQ01EJ10NCiAgICAgICAgDQogICAgKENvbnRyYXN0IHdpdGggZXhhbXBsZSBmb3IgTHtDYXNlbGVzc0xpdGVyYWx9LikNCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIG1hdGNoU3RyaW5nLCBpZGVudENoYXJzPU5vbmUgKToNCiAgICAgICAgc3VwZXIoQ2FzZWxlc3NLZXl3b3JkLHNlbGYpLl9faW5pdF9fKCBtYXRjaFN0cmluZywgaWRlbnRDaGFycywgY2FzZWxlc3M9VHJ1ZSApDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiAoIChpbnN0cmluZ1sgbG9jOmxvYytzZWxmLm1hdGNoTGVuIF0udXBwZXIoKSA9PSBzZWxmLmNhc2VsZXNzbWF0Y2gpIGFuZA0KICAgICAgICAgICAgIChsb2MgPj0gbGVuKGluc3RyaW5nKS1zZWxmLm1hdGNoTGVuIG9yIGluc3RyaW5nW2xvYytzZWxmLm1hdGNoTGVuXS51cHBlcigpIG5vdCBpbiBzZWxmLmlkZW50Q2hhcnMpICk6DQogICAgICAgICAgICByZXR1cm4gbG9jK3NlbGYubWF0Y2hMZW4sIHNlbGYubWF0Y2gNCiAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCmNsYXNzIENsb3NlTWF0Y2goVG9rZW4pOg0KICAgICIiIg0KICAgIEEgdmFyaWF0aW9uIG9uIEx7TGl0ZXJhbH0gd2hpY2ggbWF0Y2hlcyAiY2xvc2UiIG1hdGNoZXMsIHRoYXQgaXMsIA0KICAgIHN0cmluZ3Mgd2l0aCBhdCBtb3N0ICduJyBtaXNtYXRjaGluZyBjaGFyYWN0ZXJzLiBDe0Nsb3NlTWF0Y2h9IHRha2VzIHBhcmFtZXRlcnM6DQogICAgIC0gQ3ttYXRjaF9zdHJpbmd9IC0gc3RyaW5nIHRvIGJlIG1hdGNoZWQNCiAgICAgLSBDe21heE1pc21hdGNoZXN9IC0gKEN7ZGVmYXVsdD0xfSkgbWF4aW11bSBudW1iZXIgb2YgbWlzbWF0Y2hlcyBhbGxvd2VkIHRvIGNvdW50IGFzIGEgbWF0Y2gNCiAgICANCiAgICBUaGUgcmVzdWx0cyBmcm9tIGEgc3VjY2Vzc2Z1bCBwYXJzZSB3aWxsIGNvbnRhaW4gdGhlIG1hdGNoZWQgdGV4dCBmcm9tIHRoZSBpbnB1dCBzdHJpbmcgYW5kIHRoZSBmb2xsb3dpbmcgbmFtZWQgcmVzdWx0czoNCiAgICAgLSBDe21pc21hdGNoZXN9IC0gYSBsaXN0IG9mIHRoZSBwb3NpdGlvbnMgd2l0aGluIHRoZSBtYXRjaF9zdHJpbmcgd2hlcmUgbWlzbWF0Y2hlcyB3ZXJlIGZvdW5kDQogICAgIC0gQ3tvcmlnaW5hbH0gLSB0aGUgb3JpZ2luYWwgbWF0Y2hfc3RyaW5nIHVzZWQgdG8gY29tcGFyZSBhZ2FpbnN0IHRoZSBpbnB1dCBzdHJpbmcNCiAgICANCiAgICBJZiBDe21pc21hdGNoZXN9IGlzIGFuIGVtcHR5IGxpc3QsIHRoZW4gdGhlIG1hdGNoIHdhcyBhbiBleGFjdCBtYXRjaC4NCiAgICANCiAgICBFeGFtcGxlOjoNCiAgICAgICAgcGF0dCA9IENsb3NlTWF0Y2goIkFUQ0FUQ0dBQVRHR0EiKQ0KICAgICAgICBwYXR0LnBhcnNlU3RyaW5nKCJBVENBVENHQUFYR0dBIikgIyAtPiAoWydBVENBVENHQUFYR0dBJ10sIHsnbWlzbWF0Y2hlcyc6IFtbOV1dLCAnb3JpZ2luYWwnOiBbJ0FUQ0FUQ0dBQVRHR0EnXX0pDQogICAgICAgIHBhdHQucGFyc2VTdHJpbmcoIkFUQ0FYQ0dBQVhHR0EiKSAjIC0+IEV4Y2VwdGlvbjogRXhwZWN0ZWQgJ0FUQ0FUQ0dBQVRHR0EnICh3aXRoIHVwIHRvIDEgbWlzbWF0Y2hlcykgKGF0IGNoYXIgMCksIChsaW5lOjEsIGNvbDoxKQ0KDQogICAgICAgICMgZXhhY3QgbWF0Y2gNCiAgICAgICAgcGF0dC5wYXJzZVN0cmluZygiQVRDQVRDR0FBVEdHQSIpICMgLT4gKFsnQVRDQVRDR0FBVEdHQSddLCB7J21pc21hdGNoZXMnOiBbW11dLCAnb3JpZ2luYWwnOiBbJ0FUQ0FUQ0dBQVRHR0EnXX0pDQoNCiAgICAgICAgIyBjbG9zZSBtYXRjaCBhbGxvd2luZyB1cCB0byAyIG1pc21hdGNoZXMNCiAgICAgICAgcGF0dCA9IENsb3NlTWF0Y2goIkFUQ0FUQ0dBQVRHR0EiLCBtYXhNaXNtYXRjaGVzPTIpDQogICAgICAgIHBhdHQucGFyc2VTdHJpbmcoIkFUQ0FYQ0dBQVhHR0EiKSAjIC0+IChbJ0FUQ0FYQ0dBQVhHR0EnXSwgeydtaXNtYXRjaGVzJzogW1s0LCA5XV0sICdvcmlnaW5hbCc6IFsnQVRDQVRDR0FBVEdHQSddfSkNCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oc2VsZiwgbWF0Y2hfc3RyaW5nLCBtYXhNaXNtYXRjaGVzPTEpOg0KICAgICAgICBzdXBlcihDbG9zZU1hdGNoLHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgc2VsZi5uYW1lID0gbWF0Y2hfc3RyaW5nDQogICAgICAgIHNlbGYubWF0Y2hfc3RyaW5nID0gbWF0Y2hfc3RyaW5nDQogICAgICAgIHNlbGYubWF4TWlzbWF0Y2hlcyA9IG1heE1pc21hdGNoZXMNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgJXIgKHdpdGggdXAgdG8gJWQgbWlzbWF0Y2hlcykiICUgKHNlbGYubWF0Y2hfc3RyaW5nLCBzZWxmLm1heE1pc21hdGNoZXMpDQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBGYWxzZQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgc3RhcnQgPSBsb2MNCiAgICAgICAgaW5zdHJsZW4gPSBsZW4oaW5zdHJpbmcpDQogICAgICAgIG1heGxvYyA9IHN0YXJ0ICsgbGVuKHNlbGYubWF0Y2hfc3RyaW5nKQ0KDQogICAgICAgIGlmIG1heGxvYyA8PSBpbnN0cmxlbjoNCiAgICAgICAgICAgIG1hdGNoX3N0cmluZyA9IHNlbGYubWF0Y2hfc3RyaW5nDQogICAgICAgICAgICBtYXRjaF9zdHJpbmdsb2MgPSAwDQogICAgICAgICAgICBtaXNtYXRjaGVzID0gW10NCiAgICAgICAgICAgIG1heE1pc21hdGNoZXMgPSBzZWxmLm1heE1pc21hdGNoZXMNCg0KICAgICAgICAgICAgZm9yIG1hdGNoX3N0cmluZ2xvYyxzX20gaW4gZW51bWVyYXRlKHppcChpbnN0cmluZ1tsb2M6bWF4bG9jXSwgc2VsZi5tYXRjaF9zdHJpbmcpKToNCiAgICAgICAgICAgICAgICBzcmMsbWF0ID0gc19tDQogICAgICAgICAgICAgICAgaWYgc3JjICE9IG1hdDoNCiAgICAgICAgICAgICAgICAgICAgbWlzbWF0Y2hlcy5hcHBlbmQobWF0Y2hfc3RyaW5nbG9jKQ0KICAgICAgICAgICAgICAgICAgICBpZiBsZW4obWlzbWF0Y2hlcykgPiBtYXhNaXNtYXRjaGVzOg0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgbG9jID0gbWF0Y2hfc3RyaW5nbG9jICsgMQ0KICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBQYXJzZVJlc3VsdHMoW2luc3RyaW5nW3N0YXJ0OmxvY11dKQ0KICAgICAgICAgICAgICAgIHJlc3VsdHNbJ29yaWdpbmFsJ10gPSBzZWxmLm1hdGNoX3N0cmluZw0KICAgICAgICAgICAgICAgIHJlc3VsdHNbJ21pc21hdGNoZXMnXSA9IG1pc21hdGNoZXMNCiAgICAgICAgICAgICAgICByZXR1cm4gbG9jLCByZXN1bHRzDQoNCiAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCg0KY2xhc3MgV29yZChUb2tlbik6DQogICAgIiIiDQogICAgVG9rZW4gZm9yIG1hdGNoaW5nIHdvcmRzIGNvbXBvc2VkIG9mIGFsbG93ZWQgY2hhcmFjdGVyIHNldHMuDQogICAgRGVmaW5lZCB3aXRoIHN0cmluZyBjb250YWluaW5nIGFsbCBhbGxvd2VkIGluaXRpYWwgY2hhcmFjdGVycywNCiAgICBhbiBvcHRpb25hbCBzdHJpbmcgY29udGFpbmluZyBhbGxvd2VkIGJvZHkgY2hhcmFjdGVycyAoaWYgb21pdHRlZCwNCiAgICBkZWZhdWx0cyB0byB0aGUgaW5pdGlhbCBjaGFyYWN0ZXIgc2V0KSwgYW5kIGFuIG9wdGlvbmFsIG1pbmltdW0sDQogICAgbWF4aW11bSwgYW5kL29yIGV4YWN0IGxlbmd0aC4gIFRoZSBkZWZhdWx0IHZhbHVlIGZvciBDe21pbn0gaXMgMSAoYQ0KICAgIG1pbmltdW0gdmFsdWUgPCAxIGlzIG5vdCB2YWxpZCk7IHRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgQ3ttYXh9IGFuZCBDe2V4YWN0fQ0KICAgIGFyZSAwLCBtZWFuaW5nIG5vIG1heGltdW0gb3IgZXhhY3QgbGVuZ3RoIHJlc3RyaWN0aW9uLiBBbiBvcHRpb25hbA0KICAgIEN7ZXhjbHVkZUNoYXJzfSBwYXJhbWV0ZXIgY2FuIGxpc3QgY2hhcmFjdGVycyB0aGF0IG1pZ2h0IGJlIGZvdW5kIGluIA0KICAgIHRoZSBpbnB1dCBDe2JvZHlDaGFyc30gc3RyaW5nOyB1c2VmdWwgdG8gZGVmaW5lIGEgd29yZCBvZiBhbGwgcHJpbnRhYmxlcw0KICAgIGV4Y2VwdCBmb3Igb25lIG9yIHR3byBjaGFyYWN0ZXJzLCBmb3IgaW5zdGFuY2UuDQogICAgDQogICAgTHtzcmFuZ2V9IGlzIHVzZWZ1bCBmb3IgZGVmaW5pbmcgY3VzdG9tIGNoYXJhY3RlciBzZXQgc3RyaW5ncyBmb3IgZGVmaW5pbmcgDQogICAgQ3tXb3JkfSBleHByZXNzaW9ucywgdXNpbmcgcmFuZ2Ugbm90YXRpb24gZnJvbSByZWd1bGFyIGV4cHJlc3Npb24gY2hhcmFjdGVyIHNldHMuDQogICAgDQogICAgQSBjb21tb24gbWlzdGFrZSBpcyB0byB1c2UgQ3tXb3JkfSB0byBtYXRjaCBhIHNwZWNpZmljIGxpdGVyYWwgc3RyaW5nLCBhcyBpbiANCiAgICBDe1dvcmQoIkFkZHJlc3MiKX0uIFJlbWVtYmVyIHRoYXQgQ3tXb3JkfSB1c2VzIHRoZSBzdHJpbmcgYXJndW1lbnQgdG8gZGVmaW5lDQogICAgSXtzZXRzfSBvZiBtYXRjaGFibGUgY2hhcmFjdGVycy4gVGhpcyBleHByZXNzaW9uIHdvdWxkIG1hdGNoICJBZGQiLCAiQUFBIiwNCiAgICAiZEFyZWQiLCBvciBhbnkgb3RoZXIgd29yZCBtYWRlIHVwIG9mIHRoZSBjaGFyYWN0ZXJzICdBJywgJ2QnLCAncicsICdlJywgYW5kICdzJy4NCiAgICBUbyBtYXRjaCBhbiBleGFjdCBsaXRlcmFsIHN0cmluZywgdXNlIEx7TGl0ZXJhbH0gb3IgTHtLZXl3b3JkfS4NCg0KICAgIHB5cGFyc2luZyBpbmNsdWRlcyBoZWxwZXIgc3RyaW5ncyBmb3IgYnVpbGRpbmcgV29yZHM6DQogICAgIC0gTHthbHBoYXN9DQogICAgIC0gTHtudW1zfQ0KICAgICAtIEx7YWxwaGFudW1zfQ0KICAgICAtIEx7aGV4bnVtc30NCiAgICAgLSBMe2FscGhhczhiaXR9IChhbHBoYWJldGljIGNoYXJhY3RlcnMgaW4gQVNDSUkgcmFuZ2UgMTI4LTI1NSAtIGFjY2VudGVkLCB0aWxkZWQsIHVtbGF1dGVkLCBldGMuKQ0KICAgICAtIEx7cHVuYzhiaXR9IChub24tYWxwaGFiZXRpYyBjaGFyYWN0ZXJzIGluIEFTQ0lJIHJhbmdlIDEyOC0yNTUgLSBjdXJyZW5jeSwgc3ltYm9scywgc3VwZXJzY3JpcHRzLCBkaWFjcml0aWNhbHMsIGV0Yy4pDQogICAgIC0gTHtwcmludGFibGVzfSAoYW55IG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlcikNCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICAjIGEgd29yZCBjb21wb3NlZCBvZiBkaWdpdHMNCiAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykgIyBlcXVpdmFsZW50IHRvIFdvcmQoIjAxMjM0NTY3ODkiKSBvciBXb3JkKHNyYW5nZSgiMC05IikpDQogICAgICAgIA0KICAgICAgICAjIGEgd29yZCB3aXRoIGEgbGVhZGluZyBjYXBpdGFsLCBhbmQgemVybyBvciBtb3JlIGxvd2VyY2FzZQ0KICAgICAgICBjYXBpdGFsX3dvcmQgPSBXb3JkKGFscGhhcy51cHBlcigpLCBhbHBoYXMubG93ZXIoKSkNCg0KICAgICAgICAjIGhvc3RuYW1lcyBhcmUgYWxwaGFudW1lcmljLCB3aXRoIGxlYWRpbmcgYWxwaGEsIGFuZCAnLScNCiAgICAgICAgaG9zdG5hbWUgPSBXb3JkKGFscGhhcywgYWxwaGFudW1zKyctJykNCiAgICAgICAgDQogICAgICAgICMgcm9tYW4gbnVtZXJhbCAobm90IGEgc3RyaWN0IHBhcnNlciwgYWNjZXB0cyBpbnZhbGlkIG1peCBvZiBjaGFyYWN0ZXJzKQ0KICAgICAgICByb21hbiA9IFdvcmQoIklWWExDRE0iKQ0KICAgICAgICANCiAgICAgICAgIyBhbnkgc3RyaW5nIG9mIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlcnMsIGV4Y2VwdCBmb3IgJywnDQogICAgICAgIGNzdl92YWx1ZSA9IFdvcmQocHJpbnRhYmxlcywgZXhjbHVkZUNoYXJzPSIsIikNCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGluaXRDaGFycywgYm9keUNoYXJzPU5vbmUsIG1pbj0xLCBtYXg9MCwgZXhhY3Q9MCwgYXNLZXl3b3JkPUZhbHNlLCBleGNsdWRlQ2hhcnM9Tm9uZSApOg0KICAgICAgICBzdXBlcihXb3JkLHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgaWYgZXhjbHVkZUNoYXJzOg0KICAgICAgICAgICAgaW5pdENoYXJzID0gJycuam9pbihjIGZvciBjIGluIGluaXRDaGFycyBpZiBjIG5vdCBpbiBleGNsdWRlQ2hhcnMpDQogICAgICAgICAgICBpZiBib2R5Q2hhcnM6DQogICAgICAgICAgICAgICAgYm9keUNoYXJzID0gJycuam9pbihjIGZvciBjIGluIGJvZHlDaGFycyBpZiBjIG5vdCBpbiBleGNsdWRlQ2hhcnMpDQogICAgICAgIHNlbGYuaW5pdENoYXJzT3JpZyA9IGluaXRDaGFycw0KICAgICAgICBzZWxmLmluaXRDaGFycyA9IHNldChpbml0Q2hhcnMpDQogICAgICAgIGlmIGJvZHlDaGFycyA6DQogICAgICAgICAgICBzZWxmLmJvZHlDaGFyc09yaWcgPSBib2R5Q2hhcnMNCiAgICAgICAgICAgIHNlbGYuYm9keUNoYXJzID0gc2V0KGJvZHlDaGFycykNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHNlbGYuYm9keUNoYXJzT3JpZyA9IGluaXRDaGFycw0KICAgICAgICAgICAgc2VsZi5ib2R5Q2hhcnMgPSBzZXQoaW5pdENoYXJzKQ0KDQogICAgICAgIHNlbGYubWF4U3BlY2lmaWVkID0gbWF4ID4gMA0KDQogICAgICAgIGlmIG1pbiA8IDE6DQogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJjYW5ub3Qgc3BlY2lmeSBhIG1pbmltdW0gbGVuZ3RoIDwgMTsgdXNlIE9wdGlvbmFsKFdvcmQoKSkgaWYgemVyby1sZW5ndGggd29yZCBpcyBwZXJtaXR0ZWQiKQ0KDQogICAgICAgIHNlbGYubWluTGVuID0gbWluDQoNCiAgICAgICAgaWYgbWF4ID4gMDoNCiAgICAgICAgICAgIHNlbGYubWF4TGVuID0gbWF4DQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzZWxmLm1heExlbiA9IF9NQVhfSU5UDQoNCiAgICAgICAgaWYgZXhhY3QgPiAwOg0KICAgICAgICAgICAgc2VsZi5tYXhMZW4gPSBleGFjdA0KICAgICAgICAgICAgc2VsZi5taW5MZW4gPSBleGFjdA0KDQogICAgICAgIHNlbGYubmFtZSA9IF91c3RyKHNlbGYpDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICIgKyBzZWxmLm5hbWUNCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UNCiAgICAgICAgc2VsZi5hc0tleXdvcmQgPSBhc0tleXdvcmQNCg0KICAgICAgICBpZiAnICcgbm90IGluIHNlbGYuaW5pdENoYXJzT3JpZytzZWxmLmJvZHlDaGFyc09yaWcgYW5kIChtaW49PTEgYW5kIG1heD09MCBhbmQgZXhhY3Q9PTApOg0KICAgICAgICAgICAgaWYgc2VsZi5ib2R5Q2hhcnNPcmlnID09IHNlbGYuaW5pdENoYXJzT3JpZzoNCiAgICAgICAgICAgICAgICBzZWxmLnJlU3RyaW5nID0gIlslc10rIiAlIF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMoc2VsZi5pbml0Q2hhcnNPcmlnKQ0KICAgICAgICAgICAgZWxpZiBsZW4oc2VsZi5pbml0Q2hhcnNPcmlnKSA9PSAxOg0KICAgICAgICAgICAgICAgIHNlbGYucmVTdHJpbmcgPSAiJXNbJXNdKiIgJSBcDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZS5lc2NhcGUoc2VsZi5pbml0Q2hhcnNPcmlnKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhzZWxmLmJvZHlDaGFyc09yaWcpLCkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgc2VsZi5yZVN0cmluZyA9ICJbJXNdWyVzXSoiICUgXA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhzZWxmLmluaXRDaGFyc09yaWcpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKHNlbGYuYm9keUNoYXJzT3JpZyksKQ0KICAgICAgICAgICAgaWYgc2VsZi5hc0tleXdvcmQ6DQogICAgICAgICAgICAgICAgc2VsZi5yZVN0cmluZyA9IHIiXGIiK3NlbGYucmVTdHJpbmcrciJcYiINCiAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICBzZWxmLnJlID0gcmUuY29tcGlsZSggc2VsZi5yZVN0cmluZyApDQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOg0KICAgICAgICAgICAgICAgIHNlbGYucmUgPSBOb25lDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiBzZWxmLnJlOg0KICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5yZS5tYXRjaChpbnN0cmluZyxsb2MpDQogICAgICAgICAgICBpZiBub3QgcmVzdWx0Og0KICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQogICAgICAgICAgICBsb2MgPSByZXN1bHQuZW5kKCkNCiAgICAgICAgICAgIHJldHVybiBsb2MsIHJlc3VsdC5ncm91cCgpDQoNCiAgICAgICAgaWYgbm90KGluc3RyaW5nWyBsb2MgXSBpbiBzZWxmLmluaXRDaGFycyk6DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KICAgICAgICBzdGFydCA9IGxvYw0KICAgICAgICBsb2MgKz0gMQ0KICAgICAgICBpbnN0cmxlbiA9IGxlbihpbnN0cmluZykNCiAgICAgICAgYm9keWNoYXJzID0gc2VsZi5ib2R5Q2hhcnMNCiAgICAgICAgbWF4bG9jID0gc3RhcnQgKyBzZWxmLm1heExlbg0KICAgICAgICBtYXhsb2MgPSBtaW4oIG1heGxvYywgaW5zdHJsZW4gKQ0KICAgICAgICB3aGlsZSBsb2MgPCBtYXhsb2MgYW5kIGluc3RyaW5nW2xvY10gaW4gYm9keWNoYXJzOg0KICAgICAgICAgICAgbG9jICs9IDENCg0KICAgICAgICB0aHJvd0V4Y2VwdGlvbiA9IEZhbHNlDQogICAgICAgIGlmIGxvYyAtIHN0YXJ0IDwgc2VsZi5taW5MZW46DQogICAgICAgICAgICB0aHJvd0V4Y2VwdGlvbiA9IFRydWUNCiAgICAgICAgaWYgc2VsZi5tYXhTcGVjaWZpZWQgYW5kIGxvYyA8IGluc3RybGVuIGFuZCBpbnN0cmluZ1tsb2NdIGluIGJvZHljaGFyczoNCiAgICAgICAgICAgIHRocm93RXhjZXB0aW9uID0gVHJ1ZQ0KICAgICAgICBpZiBzZWxmLmFzS2V5d29yZDoNCiAgICAgICAgICAgIGlmIChzdGFydD4wIGFuZCBpbnN0cmluZ1tzdGFydC0xXSBpbiBib2R5Y2hhcnMpIG9yIChsb2M8aW5zdHJsZW4gYW5kIGluc3RyaW5nW2xvY10gaW4gYm9keWNoYXJzKToNCiAgICAgICAgICAgICAgICB0aHJvd0V4Y2VwdGlvbiA9IFRydWUNCg0KICAgICAgICBpZiB0aHJvd0V4Y2VwdGlvbjoNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQogICAgICAgIHJldHVybiBsb2MsIGluc3RyaW5nW3N0YXJ0OmxvY10NCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHJldHVybiBzdXBlcihXb3JkLHNlbGYpLl9fc3RyX18oKQ0KICAgICAgICBleGNlcHQgRXhjZXB0aW9uOg0KICAgICAgICAgICAgcGFzcw0KDQoNCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6DQoNCiAgICAgICAgICAgIGRlZiBjaGFyc0FzU3RyKHMpOg0KICAgICAgICAgICAgICAgIGlmIGxlbihzKT40Og0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gc1s6NF0rIi4uLiINCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gcw0KDQogICAgICAgICAgICBpZiAoIHNlbGYuaW5pdENoYXJzT3JpZyAhPSBzZWxmLmJvZHlDaGFyc09yaWcgKToNCiAgICAgICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAiVzooJXMsJXMpIiAlICggY2hhcnNBc1N0cihzZWxmLmluaXRDaGFyc09yaWcpLCBjaGFyc0FzU3RyKHNlbGYuYm9keUNoYXJzT3JpZykgKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAiVzooJXMpIiAlIGNoYXJzQXNTdHIoc2VsZi5pbml0Q2hhcnNPcmlnKQ0KDQogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHINCg0KDQpjbGFzcyBSZWdleChUb2tlbik6DQogICAgciIiIg0KICAgIFRva2VuIGZvciBtYXRjaGluZyBzdHJpbmdzIHRoYXQgbWF0Y2ggYSBnaXZlbiByZWd1bGFyIGV4cHJlc3Npb24uDQogICAgRGVmaW5lZCB3aXRoIHN0cmluZyBzcGVjaWZ5aW5nIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gaW4gYSBmb3JtIHJlY29nbml6ZWQgYnkgdGhlIGluYnVpbHQgUHl0aG9uIHJlIG1vZHVsZS4NCiAgICBJZiB0aGUgZ2l2ZW4gcmVnZXggY29udGFpbnMgbmFtZWQgZ3JvdXBzIChkZWZpbmVkIHVzaW5nIEN7KD9QPG5hbWU+Li4uKX0pLCB0aGVzZSB3aWxsIGJlIHByZXNlcnZlZCBhcyANCiAgICBuYW1lZCBwYXJzZSByZXN1bHRzLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIHJlYWxudW0gPSBSZWdleChyIlsrLV0/XGQrXC5cZCoiKQ0KICAgICAgICBkYXRlID0gUmVnZXgocicoP1A8eWVhcj5cZHs0fSktKD9QPG1vbnRoPlxkXGQ/KS0oP1A8ZGF5PlxkXGQ/KScpDQogICAgICAgICMgcmVmOiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzI2NzM5OS9ob3ctZG8teW91LW1hdGNoLW9ubHktdmFsaWQtcm9tYW4tbnVtZXJhbHMtd2l0aC1hLXJlZ3VsYXItZXhwcmVzc2lvbg0KICAgICAgICByb21hbiA9IFJlZ2V4KHIiTXswLDR9KENNfENEfEQ/Q3swLDN9KShYQ3xYTHxMP1h7MCwzfSkoSVh8SVZ8Vj9JezAsM30pIikNCiAgICAiIiINCiAgICBjb21waWxlZFJFdHlwZSA9IHR5cGUocmUuY29tcGlsZSgiW0EtWl0iKSkNCiAgICBkZWYgX19pbml0X18oIHNlbGYsIHBhdHRlcm4sIGZsYWdzPTApOg0KICAgICAgICAiIiJUaGUgcGFyYW1ldGVycyBDe3BhdHRlcm59IGFuZCBDe2ZsYWdzfSBhcmUgcGFzc2VkIHRvIHRoZSBDe3JlLmNvbXBpbGUoKX0gZnVuY3Rpb24gYXMtaXMuIFNlZSB0aGUgUHl0aG9uIEN7cmV9IG1vZHVsZSBmb3IgYW4gZXhwbGFuYXRpb24gb2YgdGhlIGFjY2VwdGFibGUgcGF0dGVybnMgYW5kIGZsYWdzLiIiIg0KICAgICAgICBzdXBlcihSZWdleCxzZWxmKS5fX2luaXRfXygpDQoNCiAgICAgICAgaWYgaXNpbnN0YW5jZShwYXR0ZXJuLCBiYXNlc3RyaW5nKToNCiAgICAgICAgICAgIGlmIG5vdCBwYXR0ZXJuOg0KICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIm51bGwgc3RyaW5nIHBhc3NlZCB0byBSZWdleDsgdXNlIEVtcHR5KCkgaW5zdGVhZCIsDQogICAgICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQoNCiAgICAgICAgICAgIHNlbGYucGF0dGVybiA9IHBhdHRlcm4NCiAgICAgICAgICAgIHNlbGYuZmxhZ3MgPSBmbGFncw0KDQogICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgc2VsZi5yZSA9IHJlLmNvbXBpbGUoc2VsZi5wYXR0ZXJuLCBzZWxmLmZsYWdzKQ0KICAgICAgICAgICAgICAgIHNlbGYucmVTdHJpbmcgPSBzZWxmLnBhdHRlcm4NCiAgICAgICAgICAgIGV4Y2VwdCBzcmVfY29uc3RhbnRzLmVycm9yOg0KICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oImludmFsaWQgcGF0dGVybiAoJXMpIHBhc3NlZCB0byBSZWdleCIgJSBwYXR0ZXJuLA0KICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQogICAgICAgICAgICAgICAgcmFpc2UNCg0KICAgICAgICBlbGlmIGlzaW5zdGFuY2UocGF0dGVybiwgUmVnZXguY29tcGlsZWRSRXR5cGUpOg0KICAgICAgICAgICAgc2VsZi5yZSA9IHBhdHRlcm4NCiAgICAgICAgICAgIHNlbGYucGF0dGVybiA9IFwNCiAgICAgICAgICAgIHNlbGYucmVTdHJpbmcgPSBzdHIocGF0dGVybikNCiAgICAgICAgICAgIHNlbGYuZmxhZ3MgPSBmbGFncw0KICAgICAgICAgICAgDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJSZWdleCBtYXkgb25seSBiZSBjb25zdHJ1Y3RlZCB3aXRoIGEgc3RyaW5nIG9yIGEgY29tcGlsZWQgUkUgb2JqZWN0IikNCg0KICAgICAgICBzZWxmLm5hbWUgPSBfdXN0cihzZWxmKQ0KICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCAiICsgc2VsZi5uYW1lDQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICByZXN1bHQgPSBzZWxmLnJlLm1hdGNoKGluc3RyaW5nLGxvYykNCiAgICAgICAgaWYgbm90IHJlc3VsdDoNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQogICAgICAgIGxvYyA9IHJlc3VsdC5lbmQoKQ0KICAgICAgICBkID0gcmVzdWx0Lmdyb3VwZGljdCgpDQogICAgICAgIHJldCA9IFBhcnNlUmVzdWx0cyhyZXN1bHQuZ3JvdXAoKSkNCiAgICAgICAgaWYgZDoNCiAgICAgICAgICAgIGZvciBrIGluIGQ6DQogICAgICAgICAgICAgICAgcmV0W2tdID0gZFtrXQ0KICAgICAgICByZXR1cm4gbG9jLHJldA0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgcmV0dXJuIHN1cGVyKFJlZ2V4LHNlbGYpLl9fc3RyX18oKQ0KICAgICAgICBleGNlcHQgRXhjZXB0aW9uOg0KICAgICAgICAgICAgcGFzcw0KDQogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOg0KICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gIlJlOiglcykiICUgcmVwcihzZWxmLnBhdHRlcm4pDQoNCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcg0KDQoNCmNsYXNzIFF1b3RlZFN0cmluZyhUb2tlbik6DQogICAgciIiIg0KICAgIFRva2VuIGZvciBtYXRjaGluZyBzdHJpbmdzIHRoYXQgYXJlIGRlbGltaXRlZCBieSBxdW90aW5nIGNoYXJhY3RlcnMuDQogICAgDQogICAgRGVmaW5lZCB3aXRoIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoNCiAgICAgICAgLSBxdW90ZUNoYXIgLSBzdHJpbmcgb2Ygb25lIG9yIG1vcmUgY2hhcmFjdGVycyBkZWZpbmluZyB0aGUgcXVvdGUgZGVsaW1pdGluZyBzdHJpbmcNCiAgICAgICAgLSBlc2NDaGFyIC0gY2hhcmFjdGVyIHRvIGVzY2FwZSBxdW90ZXMsIHR5cGljYWxseSBiYWNrc2xhc2ggKGRlZmF1bHQ9Q3tOb25lfSkNCiAgICAgICAgLSBlc2NRdW90ZSAtIHNwZWNpYWwgcXVvdGUgc2VxdWVuY2UgdG8gZXNjYXBlIGFuIGVtYmVkZGVkIHF1b3RlIHN0cmluZyAoc3VjaCBhcyBTUUwncyAiIiB0byBlc2NhcGUgYW4gZW1iZWRkZWQgIikgKGRlZmF1bHQ9Q3tOb25lfSkNCiAgICAgICAgLSBtdWx0aWxpbmUgLSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBxdW90ZXMgY2FuIHNwYW4gbXVsdGlwbGUgbGluZXMgKGRlZmF1bHQ9Q3tGYWxzZX0pDQogICAgICAgIC0gdW5xdW90ZVJlc3VsdHMgLSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgbWF0Y2hlZCB0ZXh0IHNob3VsZCBiZSB1bnF1b3RlZCAoZGVmYXVsdD1De1RydWV9KQ0KICAgICAgICAtIGVuZFF1b3RlQ2hhciAtIHN0cmluZyBvZiBvbmUgb3IgbW9yZSBjaGFyYWN0ZXJzIGRlZmluaW5nIHRoZSBlbmQgb2YgdGhlIHF1b3RlIGRlbGltaXRlZCBzdHJpbmcgKGRlZmF1bHQ9Q3tOb25lfSA9PiBzYW1lIGFzIHF1b3RlQ2hhcikNCiAgICAgICAgLSBjb252ZXJ0V2hpdGVzcGFjZUVzY2FwZXMgLSBjb252ZXJ0IGVzY2FwZWQgd2hpdGVzcGFjZSAoQ3snXHQnfSwgQ3snXG4nfSwgZXRjLikgdG8gYWN0dWFsIHdoaXRlc3BhY2UgKGRlZmF1bHQ9Q3tUcnVlfSkNCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBxcyA9IFF1b3RlZFN0cmluZygnIicpDQogICAgICAgIHByaW50KHFzLnNlYXJjaFN0cmluZygnbHNqZGYgIlRoaXMgaXMgdGhlIHF1b3RlIiBzbGRqZicpKQ0KICAgICAgICBjb21wbGV4X3FzID0gUXVvdGVkU3RyaW5nKCd7eycsIGVuZFF1b3RlQ2hhcj0nfX0nKQ0KICAgICAgICBwcmludChjb21wbGV4X3FzLnNlYXJjaFN0cmluZygnbHNqZGYge3tUaGlzIGlzIHRoZSAicXVvdGUifX0gc2xkamYnKSkNCiAgICAgICAgc3FsX3FzID0gUXVvdGVkU3RyaW5nKCciJywgZXNjUXVvdGU9JyIiJykNCiAgICAgICAgcHJpbnQoc3FsX3FzLnNlYXJjaFN0cmluZygnbHNqZGYgIlRoaXMgaXMgdGhlIHF1b3RlIHdpdGggIiJlbWJlZGRlZCIiIHF1b3RlcyIgc2xkamYnKSkNCiAgICBwcmludHM6Og0KICAgICAgICBbWydUaGlzIGlzIHRoZSBxdW90ZSddXQ0KICAgICAgICBbWydUaGlzIGlzIHRoZSAicXVvdGUiJ11dDQogICAgICAgIFtbJ1RoaXMgaXMgdGhlIHF1b3RlIHdpdGggImVtYmVkZGVkIiBxdW90ZXMnXV0NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIHF1b3RlQ2hhciwgZXNjQ2hhcj1Ob25lLCBlc2NRdW90ZT1Ob25lLCBtdWx0aWxpbmU9RmFsc2UsIHVucXVvdGVSZXN1bHRzPVRydWUsIGVuZFF1b3RlQ2hhcj1Ob25lLCBjb252ZXJ0V2hpdGVzcGFjZUVzY2FwZXM9VHJ1ZSk6DQogICAgICAgIHN1cGVyKFF1b3RlZFN0cmluZyxzZWxmKS5fX2luaXRfXygpDQoNCiAgICAgICAgIyByZW1vdmUgd2hpdGUgc3BhY2UgZnJvbSBxdW90ZSBjaGFycyAtIHdvbnQgd29yayBhbnl3YXkNCiAgICAgICAgcXVvdGVDaGFyID0gcXVvdGVDaGFyLnN0cmlwKCkNCiAgICAgICAgaWYgbm90IHF1b3RlQ2hhcjoNCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oInF1b3RlQ2hhciBjYW5ub3QgYmUgdGhlIGVtcHR5IHN0cmluZyIsU3ludGF4V2FybmluZyxzdGFja2xldmVsPTIpDQogICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvcigpDQoNCiAgICAgICAgaWYgZW5kUXVvdGVDaGFyIGlzIE5vbmU6DQogICAgICAgICAgICBlbmRRdW90ZUNoYXIgPSBxdW90ZUNoYXINCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIGVuZFF1b3RlQ2hhciA9IGVuZFF1b3RlQ2hhci5zdHJpcCgpDQogICAgICAgICAgICBpZiBub3QgZW5kUXVvdGVDaGFyOg0KICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oImVuZFF1b3RlQ2hhciBjYW5ub3QgYmUgdGhlIGVtcHR5IHN0cmluZyIsU3ludGF4V2FybmluZyxzdGFja2xldmVsPTIpDQogICAgICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IoKQ0KDQogICAgICAgIHNlbGYucXVvdGVDaGFyID0gcXVvdGVDaGFyDQogICAgICAgIHNlbGYucXVvdGVDaGFyTGVuID0gbGVuKHF1b3RlQ2hhcikNCiAgICAgICAgc2VsZi5maXJzdFF1b3RlQ2hhciA9IHF1b3RlQ2hhclswXQ0KICAgICAgICBzZWxmLmVuZFF1b3RlQ2hhciA9IGVuZFF1b3RlQ2hhcg0KICAgICAgICBzZWxmLmVuZFF1b3RlQ2hhckxlbiA9IGxlbihlbmRRdW90ZUNoYXIpDQogICAgICAgIHNlbGYuZXNjQ2hhciA9IGVzY0NoYXINCiAgICAgICAgc2VsZi5lc2NRdW90ZSA9IGVzY1F1b3RlDQogICAgICAgIHNlbGYudW5xdW90ZVJlc3VsdHMgPSB1bnF1b3RlUmVzdWx0cw0KICAgICAgICBzZWxmLmNvbnZlcnRXaGl0ZXNwYWNlRXNjYXBlcyA9IGNvbnZlcnRXaGl0ZXNwYWNlRXNjYXBlcw0KDQogICAgICAgIGlmIG11bHRpbGluZToNCiAgICAgICAgICAgIHNlbGYuZmxhZ3MgPSByZS5NVUxUSUxJTkUgfCByZS5ET1RBTEwNCiAgICAgICAgICAgIHNlbGYucGF0dGVybiA9IHInJXMoPzpbXiVzJXNdJyAlIFwNCiAgICAgICAgICAgICAgICAoIHJlLmVzY2FwZShzZWxmLnF1b3RlQ2hhciksDQogICAgICAgICAgICAgICAgICBfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKHNlbGYuZW5kUXVvdGVDaGFyWzBdKSwNCiAgICAgICAgICAgICAgICAgIChlc2NDaGFyIGlzIG5vdCBOb25lIGFuZCBfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKGVzY0NoYXIpIG9yICcnKSApDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzZWxmLmZsYWdzID0gMA0KICAgICAgICAgICAgc2VsZi5wYXR0ZXJuID0gciclcyg/OlteJXNcblxyJXNdJyAlIFwNCiAgICAgICAgICAgICAgICAoIHJlLmVzY2FwZShzZWxmLnF1b3RlQ2hhciksDQogICAgICAgICAgICAgICAgICBfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKHNlbGYuZW5kUXVvdGVDaGFyWzBdKSwNCiAgICAgICAgICAgICAgICAgIChlc2NDaGFyIGlzIG5vdCBOb25lIGFuZCBfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKGVzY0NoYXIpIG9yICcnKSApDQogICAgICAgIGlmIGxlbihzZWxmLmVuZFF1b3RlQ2hhcikgPiAxOg0KICAgICAgICAgICAgc2VsZi5wYXR0ZXJuICs9ICgNCiAgICAgICAgICAgICAgICAnfCg/OicgKyAnKXwoPzonLmpvaW4oIiVzW14lc10iICUgKHJlLmVzY2FwZShzZWxmLmVuZFF1b3RlQ2hhcls6aV0pLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKHNlbGYuZW5kUXVvdGVDaGFyW2ldKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzZWxmLmVuZFF1b3RlQ2hhciktMSwwLC0xKSkgKyAnKScNCiAgICAgICAgICAgICAgICApDQogICAgICAgIGlmIGVzY1F1b3RlOg0KICAgICAgICAgICAgc2VsZi5wYXR0ZXJuICs9IChyJ3woPzolcyknICUgcmUuZXNjYXBlKGVzY1F1b3RlKSkNCiAgICAgICAgaWYgZXNjQ2hhcjoNCiAgICAgICAgICAgIHNlbGYucGF0dGVybiArPSAocid8KD86JXMuKScgJSByZS5lc2NhcGUoZXNjQ2hhcikpDQogICAgICAgICAgICBzZWxmLmVzY0NoYXJSZXBsYWNlUGF0dGVybiA9IHJlLmVzY2FwZShzZWxmLmVzY0NoYXIpKyIoLikiDQogICAgICAgIHNlbGYucGF0dGVybiArPSAocicpKiVzJyAlIHJlLmVzY2FwZShzZWxmLmVuZFF1b3RlQ2hhcikpDQoNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgc2VsZi5yZSA9IHJlLmNvbXBpbGUoc2VsZi5wYXR0ZXJuLCBzZWxmLmZsYWdzKQ0KICAgICAgICAgICAgc2VsZi5yZVN0cmluZyA9IHNlbGYucGF0dGVybg0KICAgICAgICBleGNlcHQgc3JlX2NvbnN0YW50cy5lcnJvcjoNCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oImludmFsaWQgcGF0dGVybiAoJXMpIHBhc3NlZCB0byBSZWdleCIgJSBzZWxmLnBhdHRlcm4sDQogICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KICAgICAgICAgICAgcmFpc2UNCg0KICAgICAgICBzZWxmLm5hbWUgPSBfdXN0cihzZWxmKQ0KICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCAiICsgc2VsZi5uYW1lDQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICByZXN1bHQgPSBpbnN0cmluZ1tsb2NdID09IHNlbGYuZmlyc3RRdW90ZUNoYXIgYW5kIHNlbGYucmUubWF0Y2goaW5zdHJpbmcsbG9jKSBvciBOb25lDQogICAgICAgIGlmIG5vdCByZXN1bHQ6DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KICAgICAgICBsb2MgPSByZXN1bHQuZW5kKCkNCiAgICAgICAgcmV0ID0gcmVzdWx0Lmdyb3VwKCkNCg0KICAgICAgICBpZiBzZWxmLnVucXVvdGVSZXN1bHRzOg0KDQogICAgICAgICAgICAjIHN0cmlwIG9mZiBxdW90ZXMNCiAgICAgICAgICAgIHJldCA9IHJldFtzZWxmLnF1b3RlQ2hhckxlbjotc2VsZi5lbmRRdW90ZUNoYXJMZW5dDQoNCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UocmV0LGJhc2VzdHJpbmcpOg0KICAgICAgICAgICAgICAgICMgcmVwbGFjZSBlc2NhcGVkIHdoaXRlc3BhY2UNCiAgICAgICAgICAgICAgICBpZiAnXFwnIGluIHJldCBhbmQgc2VsZi5jb252ZXJ0V2hpdGVzcGFjZUVzY2FwZXM6DQogICAgICAgICAgICAgICAgICAgIHdzX21hcCA9IHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHInXHQnIDogJ1x0JywNCiAgICAgICAgICAgICAgICAgICAgICAgIHInXG4nIDogJ1xuJywNCiAgICAgICAgICAgICAgICAgICAgICAgIHInXGYnIDogJ1xmJywNCiAgICAgICAgICAgICAgICAgICAgICAgIHInXHInIDogJ1xyJywNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBmb3Igd3NsaXQsd3NjaGFyIGluIHdzX21hcC5pdGVtcygpOg0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gcmV0LnJlcGxhY2Uod3NsaXQsIHdzY2hhcikNCg0KICAgICAgICAgICAgICAgICMgcmVwbGFjZSBlc2NhcGVkIGNoYXJhY3RlcnMNCiAgICAgICAgICAgICAgICBpZiBzZWxmLmVzY0NoYXI6DQogICAgICAgICAgICAgICAgICAgIHJldCA9IHJlLnN1YihzZWxmLmVzY0NoYXJSZXBsYWNlUGF0dGVybiwgciJcZzwxPiIsIHJldCkNCg0KICAgICAgICAgICAgICAgICMgcmVwbGFjZSBlc2NhcGVkIHF1b3Rlcw0KICAgICAgICAgICAgICAgIGlmIHNlbGYuZXNjUXVvdGU6DQogICAgICAgICAgICAgICAgICAgIHJldCA9IHJldC5yZXBsYWNlKHNlbGYuZXNjUXVvdGUsIHNlbGYuZW5kUXVvdGVDaGFyKQ0KDQogICAgICAgIHJldHVybiBsb2MsIHJldA0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgcmV0dXJuIHN1cGVyKFF1b3RlZFN0cmluZyxzZWxmKS5fX3N0cl9fKCkNCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoNCiAgICAgICAgICAgIHBhc3MNCg0KICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToNCiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJxdW90ZWQgc3RyaW5nLCBzdGFydGluZyB3aXRoICVzIGVuZGluZyB3aXRoICVzIiAlIChzZWxmLnF1b3RlQ2hhciwgc2VsZi5lbmRRdW90ZUNoYXIpDQoNCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcg0KDQoNCmNsYXNzIENoYXJzTm90SW4oVG9rZW4pOg0KICAgICIiIg0KICAgIFRva2VuIGZvciBtYXRjaGluZyB3b3JkcyBjb21wb3NlZCBvZiBjaGFyYWN0ZXJzIEl7bm90fSBpbiBhIGdpdmVuIHNldCAod2lsbA0KICAgIGluY2x1ZGUgd2hpdGVzcGFjZSBpbiBtYXRjaGVkIGNoYXJhY3RlcnMgaWYgbm90IGxpc3RlZCBpbiB0aGUgcHJvdmlkZWQgZXhjbHVzaW9uIHNldCAtIHNlZSBleGFtcGxlKS4NCiAgICBEZWZpbmVkIHdpdGggc3RyaW5nIGNvbnRhaW5pbmcgYWxsIGRpc2FsbG93ZWQgY2hhcmFjdGVycywgYW5kIGFuIG9wdGlvbmFsDQogICAgbWluaW11bSwgbWF4aW11bSwgYW5kL29yIGV4YWN0IGxlbmd0aC4gIFRoZSBkZWZhdWx0IHZhbHVlIGZvciBDe21pbn0gaXMgMSAoYQ0KICAgIG1pbmltdW0gdmFsdWUgPCAxIGlzIG5vdCB2YWxpZCk7IHRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgQ3ttYXh9IGFuZCBDe2V4YWN0fQ0KICAgIGFyZSAwLCBtZWFuaW5nIG5vIG1heGltdW0gb3IgZXhhY3QgbGVuZ3RoIHJlc3RyaWN0aW9uLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgICMgZGVmaW5lIGEgY29tbWEtc2VwYXJhdGVkLXZhbHVlIGFzIGFueXRoaW5nIHRoYXQgaXMgbm90IGEgJywnDQogICAgICAgIGNzdl92YWx1ZSA9IENoYXJzTm90SW4oJywnKQ0KICAgICAgICBwcmludChkZWxpbWl0ZWRMaXN0KGNzdl92YWx1ZSkucGFyc2VTdHJpbmcoImRrbHMsbHNka2pmLHMxMiAzNCxAISMsMjEzIikpDQogICAgcHJpbnRzOjoNCiAgICAgICAgWydka2xzJywgJ2xzZGtqZicsICdzMTIgMzQnLCAnQCEjJywgJzIxMyddDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBub3RDaGFycywgbWluPTEsIG1heD0wLCBleGFjdD0wICk6DQogICAgICAgIHN1cGVyKENoYXJzTm90SW4sc2VsZikuX19pbml0X18oKQ0KICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gRmFsc2UNCiAgICAgICAgc2VsZi5ub3RDaGFycyA9IG5vdENoYXJzDQoNCiAgICAgICAgaWYgbWluIDwgMToNCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImNhbm5vdCBzcGVjaWZ5IGEgbWluaW11bSBsZW5ndGggPCAxOyB1c2UgT3B0aW9uYWwoQ2hhcnNOb3RJbigpKSBpZiB6ZXJvLWxlbmd0aCBjaGFyIGdyb3VwIGlzIHBlcm1pdHRlZCIpDQoNCiAgICAgICAgc2VsZi5taW5MZW4gPSBtaW4NCg0KICAgICAgICBpZiBtYXggPiAwOg0KICAgICAgICAgICAgc2VsZi5tYXhMZW4gPSBtYXgNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHNlbGYubWF4TGVuID0gX01BWF9JTlQNCg0KICAgICAgICBpZiBleGFjdCA+IDA6DQogICAgICAgICAgICBzZWxmLm1heExlbiA9IGV4YWN0DQogICAgICAgICAgICBzZWxmLm1pbkxlbiA9IGV4YWN0DQoNCiAgICAgICAgc2VsZi5uYW1lID0gX3VzdHIoc2VsZikNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgIiArIHNlbGYubmFtZQ0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gKCBzZWxmLm1pbkxlbiA9PSAwICkNCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGlmIGluc3RyaW5nW2xvY10gaW4gc2VsZi5ub3RDaGFyczoNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQogICAgICAgIHN0YXJ0ID0gbG9jDQogICAgICAgIGxvYyArPSAxDQogICAgICAgIG5vdGNoYXJzID0gc2VsZi5ub3RDaGFycw0KICAgICAgICBtYXhsZW4gPSBtaW4oIHN0YXJ0K3NlbGYubWF4TGVuLCBsZW4oaW5zdHJpbmcpICkNCiAgICAgICAgd2hpbGUgbG9jIDwgbWF4bGVuIGFuZCBcDQogICAgICAgICAgICAgIChpbnN0cmluZ1tsb2NdIG5vdCBpbiBub3RjaGFycyk6DQogICAgICAgICAgICBsb2MgKz0gMQ0KDQogICAgICAgIGlmIGxvYyAtIHN0YXJ0IDwgc2VsZi5taW5MZW46DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KICAgICAgICByZXR1cm4gbG9jLCBpbnN0cmluZ1tzdGFydDpsb2NdDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICB0cnk6DQogICAgICAgICAgICByZXR1cm4gc3VwZXIoQ2hhcnNOb3RJbiwgc2VsZikuX19zdHJfXygpDQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246DQogICAgICAgICAgICBwYXNzDQoNCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6DQogICAgICAgICAgICBpZiBsZW4oc2VsZi5ub3RDaGFycykgPiA0Og0KICAgICAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICIhVzooJXMuLi4pIiAlIHNlbGYubm90Q2hhcnNbOjRdDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICIhVzooJXMpIiAlIHNlbGYubm90Q2hhcnMNCg0KICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByDQoNCmNsYXNzIFdoaXRlKFRva2VuKToNCiAgICAiIiINCiAgICBTcGVjaWFsIG1hdGNoaW5nIGNsYXNzIGZvciBtYXRjaGluZyB3aGl0ZXNwYWNlLiAgTm9ybWFsbHksIHdoaXRlc3BhY2UgaXMgaWdub3JlZA0KICAgIGJ5IHB5cGFyc2luZyBncmFtbWFycy4gIFRoaXMgY2xhc3MgaXMgaW5jbHVkZWQgd2hlbiBzb21lIHdoaXRlc3BhY2Ugc3RydWN0dXJlcw0KICAgIGFyZSBzaWduaWZpY2FudC4gIERlZmluZSB3aXRoIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHdoaXRlc3BhY2UgY2hhcmFjdGVycyB0byBiZQ0KICAgIG1hdGNoZWQ7IGRlZmF1bHQgaXMgQ3siIFxcdFxcclxcbiJ9LiAgQWxzbyB0YWtlcyBvcHRpb25hbCBDe21pbn0sIEN7bWF4fSwgYW5kIEN7ZXhhY3R9IGFyZ3VtZW50cywNCiAgICBhcyBkZWZpbmVkIGZvciB0aGUgQ3tMe1dvcmR9fSBjbGFzcy4NCiAgICAiIiINCiAgICB3aGl0ZVN0cnMgPSB7DQogICAgICAgICIgIiA6ICI8U1BDPiIsDQogICAgICAgICJcdCI6ICI8VEFCPiIsDQogICAgICAgICJcbiI6ICI8TEY+IiwNCiAgICAgICAgIlxyIjogIjxDUj4iLA0KICAgICAgICAiXGYiOiAiPEZGPiIsDQogICAgICAgIH0NCiAgICBkZWYgX19pbml0X18oc2VsZiwgd3M9IiBcdFxyXG4iLCBtaW49MSwgbWF4PTAsIGV4YWN0PTApOg0KICAgICAgICBzdXBlcihXaGl0ZSxzZWxmKS5fX2luaXRfXygpDQogICAgICAgIHNlbGYubWF0Y2hXaGl0ZSA9IHdzDQogICAgICAgIHNlbGYuc2V0V2hpdGVzcGFjZUNoYXJzKCAiIi5qb2luKGMgZm9yIGMgaW4gc2VsZi53aGl0ZUNoYXJzIGlmIGMgbm90IGluIHNlbGYubWF0Y2hXaGl0ZSkgKQ0KICAgICAgICAjfiBzZWxmLmxlYXZlV2hpdGVzcGFjZSgpDQogICAgICAgIHNlbGYubmFtZSA9ICgiIi5qb2luKFdoaXRlLndoaXRlU3Ryc1tjXSBmb3IgYyBpbiBzZWxmLm1hdGNoV2hpdGUpKQ0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQ0KICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCAiICsgc2VsZi5uYW1lDQoNCiAgICAgICAgc2VsZi5taW5MZW4gPSBtaW4NCg0KICAgICAgICBpZiBtYXggPiAwOg0KICAgICAgICAgICAgc2VsZi5tYXhMZW4gPSBtYXgNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHNlbGYubWF4TGVuID0gX01BWF9JTlQNCg0KICAgICAgICBpZiBleGFjdCA+IDA6DQogICAgICAgICAgICBzZWxmLm1heExlbiA9IGV4YWN0DQogICAgICAgICAgICBzZWxmLm1pbkxlbiA9IGV4YWN0DQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiBub3QoaW5zdHJpbmdbIGxvYyBdIGluIHNlbGYubWF0Y2hXaGl0ZSk6DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCiAgICAgICAgc3RhcnQgPSBsb2MNCiAgICAgICAgbG9jICs9IDENCiAgICAgICAgbWF4bG9jID0gc3RhcnQgKyBzZWxmLm1heExlbg0KICAgICAgICBtYXhsb2MgPSBtaW4oIG1heGxvYywgbGVuKGluc3RyaW5nKSApDQogICAgICAgIHdoaWxlIGxvYyA8IG1heGxvYyBhbmQgaW5zdHJpbmdbbG9jXSBpbiBzZWxmLm1hdGNoV2hpdGU6DQogICAgICAgICAgICBsb2MgKz0gMQ0KDQogICAgICAgIGlmIGxvYyAtIHN0YXJ0IDwgc2VsZi5taW5MZW46DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KICAgICAgICByZXR1cm4gbG9jLCBpbnN0cmluZ1tzdGFydDpsb2NdDQoNCg0KY2xhc3MgX1Bvc2l0aW9uVG9rZW4oVG9rZW4pOg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiApOg0KICAgICAgICBzdXBlcihfUG9zaXRpb25Ub2tlbixzZWxmKS5fX2luaXRfXygpDQogICAgICAgIHNlbGYubmFtZT1zZWxmLl9fY2xhc3NfXy5fX25hbWVfXw0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQ0KICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQ0KDQpjbGFzcyBHb1RvQ29sdW1uKF9Qb3NpdGlvblRva2VuKToNCiAgICAiIiINCiAgICBUb2tlbiB0byBhZHZhbmNlIHRvIGEgc3BlY2lmaWMgY29sdW1uIG9mIGlucHV0IHRleHQ7IHVzZWZ1bCBmb3IgdGFidWxhciByZXBvcnQgc2NyYXBpbmcuDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBjb2xubyApOg0KICAgICAgICBzdXBlcihHb1RvQ29sdW1uLHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgc2VsZi5jb2wgPSBjb2xubw0KDQogICAgZGVmIHByZVBhcnNlKCBzZWxmLCBpbnN0cmluZywgbG9jICk6DQogICAgICAgIGlmIGNvbChsb2MsaW5zdHJpbmcpICE9IHNlbGYuY29sOg0KICAgICAgICAgICAgaW5zdHJsZW4gPSBsZW4oaW5zdHJpbmcpDQogICAgICAgICAgICBpZiBzZWxmLmlnbm9yZUV4cHJzOg0KICAgICAgICAgICAgICAgIGxvYyA9IHNlbGYuX3NraXBJZ25vcmFibGVzKCBpbnN0cmluZywgbG9jICkNCiAgICAgICAgICAgIHdoaWxlIGxvYyA8IGluc3RybGVuIGFuZCBpbnN0cmluZ1tsb2NdLmlzc3BhY2UoKSBhbmQgY29sKCBsb2MsIGluc3RyaW5nICkgIT0gc2VsZi5jb2wgOg0KICAgICAgICAgICAgICAgIGxvYyArPSAxDQogICAgICAgIHJldHVybiBsb2MNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIHRoaXNjb2wgPSBjb2woIGxvYywgaW5zdHJpbmcgKQ0KICAgICAgICBpZiB0aGlzY29sID4gc2VsZi5jb2w6DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbiggaW5zdHJpbmcsIGxvYywgIlRleHQgbm90IGluIGV4cGVjdGVkIGNvbHVtbiIsIHNlbGYgKQ0KICAgICAgICBuZXdsb2MgPSBsb2MgKyBzZWxmLmNvbCAtIHRoaXNjb2wNCiAgICAgICAgcmV0ID0gaW5zdHJpbmdbIGxvYzogbmV3bG9jIF0NCiAgICAgICAgcmV0dXJuIG5ld2xvYywgcmV0DQoNCg0KY2xhc3MgTGluZVN0YXJ0KF9Qb3NpdGlvblRva2VuKToNCiAgICAiIiINCiAgICBNYXRjaGVzIGlmIGN1cnJlbnQgcG9zaXRpb24gaXMgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUgd2l0aGluIHRoZSBwYXJzZSBzdHJpbmcNCiAgICANCiAgICBFeGFtcGxlOjoNCiAgICANCiAgICAgICAgdGVzdCA9ICcnJ1wNCiAgICAgICAgQUFBIHRoaXMgbGluZQ0KICAgICAgICBBQUEgYW5kIHRoaXMgbGluZQ0KICAgICAgICAgIEFBQSBidXQgbm90IHRoaXMgb25lDQogICAgICAgIEIgQUFBIGFuZCBkZWZpbml0ZWx5IG5vdCB0aGlzIG9uZQ0KICAgICAgICAnJycNCg0KICAgICAgICBmb3IgdCBpbiAoTGluZVN0YXJ0KCkgKyAnQUFBJyArIHJlc3RPZkxpbmUpLnNlYXJjaFN0cmluZyh0ZXN0KToNCiAgICAgICAgICAgIHByaW50KHQpDQogICAgDQogICAgUHJpbnRzOjoNCiAgICAgICAgWydBQUEnLCAnIHRoaXMgbGluZSddDQogICAgICAgIFsnQUFBJywgJyBhbmQgdGhpcyBsaW5lJ10gICAgDQoNCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYgKToNCiAgICAgICAgc3VwZXIoTGluZVN0YXJ0LHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgc3RhcnQgb2YgbGluZSINCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGlmIGNvbChsb2MsIGluc3RyaW5nKSA9PSAxOg0KICAgICAgICAgICAgcmV0dXJuIGxvYywgW10NCiAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCmNsYXNzIExpbmVFbmQoX1Bvc2l0aW9uVG9rZW4pOg0KICAgICIiIg0KICAgIE1hdGNoZXMgaWYgY3VycmVudCBwb3NpdGlvbiBpcyBhdCB0aGUgZW5kIG9mIGEgbGluZSB3aXRoaW4gdGhlIHBhcnNlIHN0cmluZw0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiApOg0KICAgICAgICBzdXBlcihMaW5lRW5kLHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgc2VsZi5zZXRXaGl0ZXNwYWNlQ2hhcnMoIFBhcnNlckVsZW1lbnQuREVGQVVMVF9XSElURV9DSEFSUy5yZXBsYWNlKCJcbiIsIiIpICkNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgZW5kIG9mIGxpbmUiDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiBsb2M8bGVuKGluc3RyaW5nKToNCiAgICAgICAgICAgIGlmIGluc3RyaW5nW2xvY10gPT0gIlxuIjoNCiAgICAgICAgICAgICAgICByZXR1cm4gbG9jKzEsICJcbiINCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQogICAgICAgIGVsaWYgbG9jID09IGxlbihpbnN0cmluZyk6DQogICAgICAgICAgICByZXR1cm4gbG9jKzEsIFtdDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KY2xhc3MgU3RyaW5nU3RhcnQoX1Bvc2l0aW9uVG9rZW4pOg0KICAgICIiIg0KICAgIE1hdGNoZXMgaWYgY3VycmVudCBwb3NpdGlvbiBpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYXJzZSBzdHJpbmcNCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYgKToNCiAgICAgICAgc3VwZXIoU3RyaW5nU3RhcnQsc2VsZikuX19pbml0X18oKQ0KICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCBzdGFydCBvZiB0ZXh0Ig0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgaWYgbG9jICE9IDA6DQogICAgICAgICAgICAjIHNlZSBpZiBlbnRpcmUgc3RyaW5nIHVwIHRvIGhlcmUgaXMganVzdCB3aGl0ZXNwYWNlIGFuZCBpZ25vcmVhYmxlcw0KICAgICAgICAgICAgaWYgbG9jICE9IHNlbGYucHJlUGFyc2UoIGluc3RyaW5nLCAwICk6DQogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQogICAgICAgIHJldHVybiBsb2MsIFtdDQoNCmNsYXNzIFN0cmluZ0VuZChfUG9zaXRpb25Ub2tlbik6DQogICAgIiIiDQogICAgTWF0Y2hlcyBpZiBjdXJyZW50IHBvc2l0aW9uIGlzIGF0IHRoZSBlbmQgb2YgdGhlIHBhcnNlIHN0cmluZw0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiApOg0KICAgICAgICBzdXBlcihTdHJpbmdFbmQsc2VsZikuX19pbml0X18oKQ0KICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCBlbmQgb2YgdGV4dCINCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGlmIGxvYyA8IGxlbihpbnN0cmluZyk6DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCiAgICAgICAgZWxpZiBsb2MgPT0gbGVuKGluc3RyaW5nKToNCiAgICAgICAgICAgIHJldHVybiBsb2MrMSwgW10NCiAgICAgICAgZWxpZiBsb2MgPiBsZW4oaW5zdHJpbmcpOg0KICAgICAgICAgICAgcmV0dXJuIGxvYywgW10NCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQpjbGFzcyBXb3JkU3RhcnQoX1Bvc2l0aW9uVG9rZW4pOg0KICAgICIiIg0KICAgIE1hdGNoZXMgaWYgdGhlIGN1cnJlbnQgcG9zaXRpb24gaXMgYXQgdGhlIGJlZ2lubmluZyBvZiBhIFdvcmQsIGFuZA0KICAgIGlzIG5vdCBwcmVjZWRlZCBieSBhbnkgY2hhcmFjdGVyIGluIGEgZ2l2ZW4gc2V0IG9mIEN7d29yZENoYXJzfQ0KICAgIChkZWZhdWx0PUN7cHJpbnRhYmxlc30pLiBUbyBlbXVsYXRlIHRoZSBDe1xifSBiZWhhdmlvciBvZiByZWd1bGFyIGV4cHJlc3Npb25zLA0KICAgIHVzZSBDe1dvcmRTdGFydChhbHBoYW51bXMpfS4gQ3tXb3JkU3RhcnR9IHdpbGwgYWxzbyBtYXRjaCBhdCB0aGUgYmVnaW5uaW5nIG9mDQogICAgdGhlIHN0cmluZyBiZWluZyBwYXJzZWQsIG9yIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLg0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3b3JkQ2hhcnMgPSBwcmludGFibGVzKToNCiAgICAgICAgc3VwZXIoV29yZFN0YXJ0LHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgc2VsZi53b3JkQ2hhcnMgPSBzZXQod29yZENoYXJzKQ0KICAgICAgICBzZWxmLmVycm1zZyA9ICJOb3QgYXQgdGhlIHN0YXJ0IG9mIGEgd29yZCINCg0KICAgIGRlZiBwYXJzZUltcGwoc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgaWYgbG9jICE9IDA6DQogICAgICAgICAgICBpZiAoaW5zdHJpbmdbbG9jLTFdIGluIHNlbGYud29yZENoYXJzIG9yDQogICAgICAgICAgICAgICAgaW5zdHJpbmdbbG9jXSBub3QgaW4gc2VsZi53b3JkQ2hhcnMpOg0KICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KICAgICAgICByZXR1cm4gbG9jLCBbXQ0KDQpjbGFzcyBXb3JkRW5kKF9Qb3NpdGlvblRva2VuKToNCiAgICAiIiINCiAgICBNYXRjaGVzIGlmIHRoZSBjdXJyZW50IHBvc2l0aW9uIGlzIGF0IHRoZSBlbmQgb2YgYSBXb3JkLCBhbmQNCiAgICBpcyBub3QgZm9sbG93ZWQgYnkgYW55IGNoYXJhY3RlciBpbiBhIGdpdmVuIHNldCBvZiBDe3dvcmRDaGFyc30NCiAgICAoZGVmYXVsdD1De3ByaW50YWJsZXN9KS4gVG8gZW11bGF0ZSB0aGUgQ3tcYn0gYmVoYXZpb3Igb2YgcmVndWxhciBleHByZXNzaW9ucywNCiAgICB1c2UgQ3tXb3JkRW5kKGFscGhhbnVtcyl9LiBDe1dvcmRFbmR9IHdpbGwgYWxzbyBtYXRjaCBhdCB0aGUgZW5kIG9mDQogICAgdGhlIHN0cmluZyBiZWluZyBwYXJzZWQsIG9yIGF0IHRoZSBlbmQgb2YgYSBsaW5lLg0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3b3JkQ2hhcnMgPSBwcmludGFibGVzKToNCiAgICAgICAgc3VwZXIoV29yZEVuZCxzZWxmKS5fX2luaXRfXygpDQogICAgICAgIHNlbGYud29yZENoYXJzID0gc2V0KHdvcmRDaGFycykNCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IEZhbHNlDQogICAgICAgIHNlbGYuZXJybXNnID0gIk5vdCBhdCB0aGUgZW5kIG9mIGEgd29yZCINCg0KICAgIGRlZiBwYXJzZUltcGwoc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgaW5zdHJsZW4gPSBsZW4oaW5zdHJpbmcpDQogICAgICAgIGlmIGluc3RybGVuPjAgYW5kIGxvYzxpbnN0cmxlbjoNCiAgICAgICAgICAgIGlmIChpbnN0cmluZ1tsb2NdIGluIHNlbGYud29yZENoYXJzIG9yDQogICAgICAgICAgICAgICAgaW5zdHJpbmdbbG9jLTFdIG5vdCBpbiBzZWxmLndvcmRDaGFycyk6DQogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQogICAgICAgIHJldHVybiBsb2MsIFtdDQoNCg0KY2xhc3MgUGFyc2VFeHByZXNzaW9uKFBhcnNlckVsZW1lbnQpOg0KICAgICIiIg0KICAgIEFic3RyYWN0IHN1YmNsYXNzIG9mIFBhcnNlckVsZW1lbnQsIGZvciBjb21iaW5pbmcgYW5kIHBvc3QtcHJvY2Vzc2luZyBwYXJzZWQgdG9rZW5zLg0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwcnMsIHNhdmVsaXN0ID0gRmFsc2UgKToNCiAgICAgICAgc3VwZXIoUGFyc2VFeHByZXNzaW9uLHNlbGYpLl9faW5pdF9fKHNhdmVsaXN0KQ0KICAgICAgICBpZiBpc2luc3RhbmNlKCBleHBycywgX2dlbmVyYXRvclR5cGUgKToNCiAgICAgICAgICAgIGV4cHJzID0gbGlzdChleHBycykNCg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBleHBycywgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgc2VsZi5leHBycyA9IFsgUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBleHBycyApIF0NCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKCBleHBycywgSXRlcmFibGUgKToNCiAgICAgICAgICAgIGV4cHJzID0gbGlzdChleHBycykNCiAgICAgICAgICAgICMgaWYgc2VxdWVuY2Ugb2Ygc3RyaW5ncyBwcm92aWRlZCwgd3JhcCB3aXRoIExpdGVyYWwNCiAgICAgICAgICAgIGlmIGFsbChpc2luc3RhbmNlKGV4cHIsIGJhc2VzdHJpbmcpIGZvciBleHByIGluIGV4cHJzKToNCiAgICAgICAgICAgICAgICBleHBycyA9IG1hcChQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MsIGV4cHJzKQ0KICAgICAgICAgICAgc2VsZi5leHBycyA9IGxpc3QoZXhwcnMpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgc2VsZi5leHBycyA9IGxpc3QoIGV4cHJzICkNCiAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6DQogICAgICAgICAgICAgICAgc2VsZi5leHBycyA9IFsgZXhwcnMgXQ0KICAgICAgICBzZWxmLmNhbGxQcmVwYXJzZSA9IEZhbHNlDQoNCiAgICBkZWYgX19nZXRpdGVtX18oIHNlbGYsIGkgKToNCiAgICAgICAgcmV0dXJuIHNlbGYuZXhwcnNbaV0NCg0KICAgIGRlZiBhcHBlbmQoIHNlbGYsIG90aGVyICk6DQogICAgICAgIHNlbGYuZXhwcnMuYXBwZW5kKCBvdGhlciApDQogICAgICAgIHNlbGYuc3RyUmVwciA9IE5vbmUNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBsZWF2ZVdoaXRlc3BhY2UoIHNlbGYgKToNCiAgICAgICAgIiIiRXh0ZW5kcyBDe2xlYXZlV2hpdGVzcGFjZX0gZGVmaW5lZCBpbiBiYXNlIGNsYXNzLCBhbmQgYWxzbyBpbnZva2VzIEN7bGVhdmVXaGl0ZXNwYWNlfSBvbg0KICAgICAgICAgICBhbGwgY29udGFpbmVkIGV4cHJlc3Npb25zLiIiIg0KICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gRmFsc2UNCiAgICAgICAgc2VsZi5leHBycyA9IFsgZS5jb3B5KCkgZm9yIGUgaW4gc2VsZi5leHBycyBdDQogICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnM6DQogICAgICAgICAgICBlLmxlYXZlV2hpdGVzcGFjZSgpDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgaWdub3JlKCBzZWxmLCBvdGhlciApOg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgU3VwcHJlc3MgKToNCiAgICAgICAgICAgIGlmIG90aGVyIG5vdCBpbiBzZWxmLmlnbm9yZUV4cHJzOg0KICAgICAgICAgICAgICAgIHN1cGVyKCBQYXJzZUV4cHJlc3Npb24sIHNlbGYpLmlnbm9yZSggb3RoZXIgKQ0KICAgICAgICAgICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnM6DQogICAgICAgICAgICAgICAgICAgIGUuaWdub3JlKCBzZWxmLmlnbm9yZUV4cHJzWy0xXSApDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzdXBlciggUGFyc2VFeHByZXNzaW9uLCBzZWxmKS5pZ25vcmUoIG90aGVyICkNCiAgICAgICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnM6DQogICAgICAgICAgICAgICAgZS5pZ25vcmUoIHNlbGYuaWdub3JlRXhwcnNbLTFdICkNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHJldHVybiBzdXBlcihQYXJzZUV4cHJlc3Npb24sc2VsZikuX19zdHJfXygpDQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246DQogICAgICAgICAgICBwYXNzDQoNCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6DQogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAiJXM6KCVzKSIgJSAoIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBfdXN0cihzZWxmLmV4cHJzKSApDQogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHINCg0KICAgIGRlZiBzdHJlYW1saW5lKCBzZWxmICk6DQogICAgICAgIHN1cGVyKFBhcnNlRXhwcmVzc2lvbixzZWxmKS5zdHJlYW1saW5lKCkNCg0KICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOg0KICAgICAgICAgICAgZS5zdHJlYW1saW5lKCkNCg0KICAgICAgICAjIGNvbGxhcHNlIG5lc3RlZCBBbmQncyBvZiB0aGUgZm9ybSBBbmQoIEFuZCggQW5kKCBhLGIpLCBjKSwgZCkgdG8gQW5kKCBhLGIsYyxkICkNCiAgICAgICAgIyBidXQgb25seSBpZiB0aGVyZSBhcmUgbm8gcGFyc2UgYWN0aW9ucyBvciByZXN1bHRzTmFtZXMgb24gdGhlIG5lc3RlZCBBbmQncw0KICAgICAgICAjIChsaWtld2lzZSBmb3IgT3IncyBhbmQgTWF0Y2hGaXJzdCdzKQ0KICAgICAgICBpZiAoIGxlbihzZWxmLmV4cHJzKSA9PSAyICk6DQogICAgICAgICAgICBvdGhlciA9IHNlbGYuZXhwcnNbMF0NCiAgICAgICAgICAgIGlmICggaXNpbnN0YW5jZSggb3RoZXIsIHNlbGYuX19jbGFzc19fICkgYW5kDQogICAgICAgICAgICAgICAgICBub3Qob3RoZXIucGFyc2VBY3Rpb24pIGFuZA0KICAgICAgICAgICAgICAgICAgb3RoZXIucmVzdWx0c05hbWUgaXMgTm9uZSBhbmQNCiAgICAgICAgICAgICAgICAgIG5vdCBvdGhlci5kZWJ1ZyApOg0KICAgICAgICAgICAgICAgIHNlbGYuZXhwcnMgPSBvdGhlci5leHByc1s6XSArIFsgc2VsZi5leHByc1sxXSBdDQogICAgICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gTm9uZQ0KICAgICAgICAgICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgfD0gb3RoZXIubWF5UmV0dXJuRW1wdHkNCiAgICAgICAgICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgIHw9IG90aGVyLm1heUluZGV4RXJyb3INCg0KICAgICAgICAgICAgb3RoZXIgPSBzZWxmLmV4cHJzWy0xXQ0KICAgICAgICAgICAgaWYgKCBpc2luc3RhbmNlKCBvdGhlciwgc2VsZi5fX2NsYXNzX18gKSBhbmQNCiAgICAgICAgICAgICAgICAgIG5vdChvdGhlci5wYXJzZUFjdGlvbikgYW5kDQogICAgICAgICAgICAgICAgICBvdGhlci5yZXN1bHRzTmFtZSBpcyBOb25lIGFuZA0KICAgICAgICAgICAgICAgICAgbm90IG90aGVyLmRlYnVnICk6DQogICAgICAgICAgICAgICAgc2VsZi5leHBycyA9IHNlbGYuZXhwcnNbOi0xXSArIG90aGVyLmV4cHJzWzpdDQogICAgICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gTm9uZQ0KICAgICAgICAgICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgfD0gb3RoZXIubWF5UmV0dXJuRW1wdHkNCiAgICAgICAgICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgIHw9IG90aGVyLm1heUluZGV4RXJyb3INCg0KICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCAiICsgX3VzdHIoc2VsZikNCiAgICAgICAgDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgc2V0UmVzdWx0c05hbWUoIHNlbGYsIG5hbWUsIGxpc3RBbGxNYXRjaGVzPUZhbHNlICk6DQogICAgICAgIHJldCA9IHN1cGVyKFBhcnNlRXhwcmVzc2lvbixzZWxmKS5zZXRSZXN1bHRzTmFtZShuYW1lLGxpc3RBbGxNYXRjaGVzKQ0KICAgICAgICByZXR1cm4gcmV0DQoNCiAgICBkZWYgdmFsaWRhdGUoIHNlbGYsIHZhbGlkYXRlVHJhY2U9W10gKToNCiAgICAgICAgdG1wID0gdmFsaWRhdGVUcmFjZVs6XStbc2VsZl0NCiAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoNCiAgICAgICAgICAgIGUudmFsaWRhdGUodG1wKQ0KICAgICAgICBzZWxmLmNoZWNrUmVjdXJzaW9uKCBbXSApDQogICAgICAgIA0KICAgIGRlZiBjb3B5KHNlbGYpOg0KICAgICAgICByZXQgPSBzdXBlcihQYXJzZUV4cHJlc3Npb24sc2VsZikuY29weSgpDQogICAgICAgIHJldC5leHBycyA9IFtlLmNvcHkoKSBmb3IgZSBpbiBzZWxmLmV4cHJzXQ0KICAgICAgICByZXR1cm4gcmV0DQoNCmNsYXNzIEFuZChQYXJzZUV4cHJlc3Npb24pOg0KICAgICIiIg0KICAgIFJlcXVpcmVzIGFsbCBnaXZlbiBDe1BhcnNlRXhwcmVzc2lvbn1zIHRvIGJlIGZvdW5kIGluIHRoZSBnaXZlbiBvcmRlci4NCiAgICBFeHByZXNzaW9ucyBtYXkgYmUgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UuDQogICAgTWF5IGJlIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSBDeycrJ30gb3BlcmF0b3IuDQogICAgTWF5IGFsc28gYmUgY29uc3RydWN0ZWQgdXNpbmcgdGhlIEN7Jy0nfSBvcGVyYXRvciwgd2hpY2ggd2lsbCBzdXBwcmVzcyBiYWNrdHJhY2tpbmcuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykNCiAgICAgICAgbmFtZV9leHByID0gT25lT3JNb3JlKFdvcmQoYWxwaGFzKSkNCg0KICAgICAgICBleHByID0gQW5kKFtpbnRlZ2VyKCJpZCIpLG5hbWVfZXhwcigibmFtZSIpLGludGVnZXIoImFnZSIpXSkNCiAgICAgICAgIyBtb3JlIGVhc2lseSB3cml0dGVuIGFzOg0KICAgICAgICBleHByID0gaW50ZWdlcigiaWQiKSArIG5hbWVfZXhwcigibmFtZSIpICsgaW50ZWdlcigiYWdlIikNCiAgICAiIiINCg0KICAgIGNsYXNzIF9FcnJvclN0b3AoRW1wdHkpOg0KICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToNCiAgICAgICAgICAgIHN1cGVyKEFuZC5fRXJyb3JTdG9wLHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3YXJncykNCiAgICAgICAgICAgIHNlbGYubmFtZSA9ICctJw0KICAgICAgICAgICAgc2VsZi5sZWF2ZVdoaXRlc3BhY2UoKQ0KDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHBycywgc2F2ZWxpc3QgPSBUcnVlICk6DQogICAgICAgIHN1cGVyKEFuZCxzZWxmKS5fX2luaXRfXyhleHBycywgc2F2ZWxpc3QpDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBhbGwoZS5tYXlSZXR1cm5FbXB0eSBmb3IgZSBpbiBzZWxmLmV4cHJzKQ0KICAgICAgICBzZWxmLnNldFdoaXRlc3BhY2VDaGFycyggc2VsZi5leHByc1swXS53aGl0ZUNoYXJzICkNCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IHNlbGYuZXhwcnNbMF0uc2tpcFdoaXRlc3BhY2UNCiAgICAgICAgc2VsZi5jYWxsUHJlcGFyc2UgPSBUcnVlDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICAjIHBhc3MgRmFsc2UgYXMgbGFzdCBhcmcgdG8gX3BhcnNlIGZvciBmaXJzdCBlbGVtZW50LCBzaW5jZSB3ZSBhbHJlYWR5DQogICAgICAgICMgcHJlLXBhcnNlZCB0aGUgc3RyaW5nIGFzIHBhcnQgb2Ygb3VyIEFuZCBwcmUtcGFyc2luZw0KICAgICAgICBsb2MsIHJlc3VsdGxpc3QgPSBzZWxmLmV4cHJzWzBdLl9wYXJzZSggaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zLCBjYWxsUHJlUGFyc2U9RmFsc2UgKQ0KICAgICAgICBlcnJvclN0b3AgPSBGYWxzZQ0KICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzWzE6XToNCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZSwgQW5kLl9FcnJvclN0b3ApOg0KICAgICAgICAgICAgICAgIGVycm9yU3RvcCA9IFRydWUNCiAgICAgICAgICAgICAgICBjb250aW51ZQ0KICAgICAgICAgICAgaWYgZXJyb3JTdG9wOg0KICAgICAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICAgICAgbG9jLCBleHBydG9rZW5zID0gZS5fcGFyc2UoIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucyApDQogICAgICAgICAgICAgICAgZXhjZXB0IFBhcnNlU3ludGF4RXhjZXB0aW9uOg0KICAgICAgICAgICAgICAgICAgICByYWlzZQ0KICAgICAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb24gYXMgcGU6DQogICAgICAgICAgICAgICAgICAgIHBlLl9fdHJhY2ViYWNrX18gPSBOb25lDQogICAgICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlU3ludGF4RXhjZXB0aW9uLl9mcm9tX2V4Y2VwdGlvbihwZSkNCiAgICAgICAgICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoNCiAgICAgICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VTeW50YXhFeGNlcHRpb24oaW5zdHJpbmcsIGxlbihpbnN0cmluZyksIHNlbGYuZXJybXNnLCBzZWxmKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBsb2MsIGV4cHJ0b2tlbnMgPSBlLl9wYXJzZSggaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zICkNCiAgICAgICAgICAgIGlmIGV4cHJ0b2tlbnMgb3IgZXhwcnRva2Vucy5oYXNrZXlzKCk6DQogICAgICAgICAgICAgICAgcmVzdWx0bGlzdCArPSBleHBydG9rZW5zDQogICAgICAgIHJldHVybiBsb2MsIHJlc3VsdGxpc3QNCg0KICAgIGRlZiBfX2lhZGRfXyhzZWxmLCBvdGhlciApOg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkNCiAgICAgICAgcmV0dXJuIHNlbGYuYXBwZW5kKCBvdGhlciApICNBbmQoIFsgc2VsZiwgb3RoZXIgXSApDQoNCiAgICBkZWYgY2hlY2tSZWN1cnNpb24oIHNlbGYsIHBhcnNlRWxlbWVudExpc3QgKToNCiAgICAgICAgc3ViUmVjQ2hlY2tMaXN0ID0gcGFyc2VFbGVtZW50TGlzdFs6XSArIFsgc2VsZiBdDQogICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnM6DQogICAgICAgICAgICBlLmNoZWNrUmVjdXJzaW9uKCBzdWJSZWNDaGVja0xpc3QgKQ0KICAgICAgICAgICAgaWYgbm90IGUubWF5UmV0dXJuRW1wdHk6DQogICAgICAgICAgICAgICAgYnJlYWsNCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwibmFtZSIpOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZQ0KDQogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOg0KICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gInsiICsgIiAiLmpvaW4oX3VzdHIoZSkgZm9yIGUgaW4gc2VsZi5leHBycykgKyAifSINCg0KICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByDQoNCg0KY2xhc3MgT3IoUGFyc2VFeHByZXNzaW9uKToNCiAgICAiIiINCiAgICBSZXF1aXJlcyB0aGF0IGF0IGxlYXN0IG9uZSBDe1BhcnNlRXhwcmVzc2lvbn0gaXMgZm91bmQuDQogICAgSWYgdHdvIGV4cHJlc3Npb25zIG1hdGNoLCB0aGUgZXhwcmVzc2lvbiB0aGF0IG1hdGNoZXMgdGhlIGxvbmdlc3Qgc3RyaW5nIHdpbGwgYmUgdXNlZC4NCiAgICBNYXkgYmUgY29uc3RydWN0ZWQgdXNpbmcgdGhlIEN7J14nfSBvcGVyYXRvci4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICAjIGNvbnN0cnVjdCBPciB1c2luZyAnXicgb3BlcmF0b3INCiAgICAgICAgDQogICAgICAgIG51bWJlciA9IFdvcmQobnVtcykgXiBDb21iaW5lKFdvcmQobnVtcykgKyAnLicgKyBXb3JkKG51bXMpKQ0KICAgICAgICBwcmludChudW1iZXIuc2VhcmNoU3RyaW5nKCIxMjMgMy4xNDE2IDc4OSIpKQ0KICAgIHByaW50czo6DQogICAgICAgIFtbJzEyMyddLCBbJzMuMTQxNiddLCBbJzc4OSddXQ0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwcnMsIHNhdmVsaXN0ID0gRmFsc2UgKToNCiAgICAgICAgc3VwZXIoT3Isc2VsZikuX19pbml0X18oZXhwcnMsIHNhdmVsaXN0KQ0KICAgICAgICBpZiBzZWxmLmV4cHJzOg0KICAgICAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IGFueShlLm1heVJldHVybkVtcHR5IGZvciBlIGluIHNlbGYuZXhwcnMpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgbWF4RXhjTG9jID0gLTENCiAgICAgICAgbWF4RXhjZXB0aW9uID0gTm9uZQ0KICAgICAgICBtYXRjaGVzID0gW10NCiAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoNCiAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICBsb2MyID0gZS50cnlQYXJzZSggaW5zdHJpbmcsIGxvYyApDQogICAgICAgICAgICBleGNlcHQgUGFyc2VFeGNlcHRpb24gYXMgZXJyOg0KICAgICAgICAgICAgICAgIGVyci5fX3RyYWNlYmFja19fID0gTm9uZQ0KICAgICAgICAgICAgICAgIGlmIGVyci5sb2MgPiBtYXhFeGNMb2M6DQogICAgICAgICAgICAgICAgICAgIG1heEV4Y2VwdGlvbiA9IGVycg0KICAgICAgICAgICAgICAgICAgICBtYXhFeGNMb2MgPSBlcnIubG9jDQogICAgICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoNCiAgICAgICAgICAgICAgICBpZiBsZW4oaW5zdHJpbmcpID4gbWF4RXhjTG9jOg0KICAgICAgICAgICAgICAgICAgICBtYXhFeGNlcHRpb24gPSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZyxsZW4oaW5zdHJpbmcpLGUuZXJybXNnLHNlbGYpDQogICAgICAgICAgICAgICAgICAgIG1heEV4Y0xvYyA9IGxlbihpbnN0cmluZykNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgIyBzYXZlIG1hdGNoIGFtb25nIGFsbCBtYXRjaGVzLCB0byByZXRyeSBsb25nZXN0IHRvIHNob3J0ZXN0DQogICAgICAgICAgICAgICAgbWF0Y2hlcy5hcHBlbmQoKGxvYzIsIGUpKQ0KDQogICAgICAgIGlmIG1hdGNoZXM6DQogICAgICAgICAgICBtYXRjaGVzLnNvcnQoa2V5PWxhbWJkYSB4OiAteFswXSkNCiAgICAgICAgICAgIGZvciBfLGUgaW4gbWF0Y2hlczoNCiAgICAgICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBlLl9wYXJzZSggaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zICkNCiAgICAgICAgICAgICAgICBleGNlcHQgUGFyc2VFeGNlcHRpb24gYXMgZXJyOg0KICAgICAgICAgICAgICAgICAgICBlcnIuX190cmFjZWJhY2tfXyA9IE5vbmUNCiAgICAgICAgICAgICAgICAgICAgaWYgZXJyLmxvYyA+IG1heEV4Y0xvYzoNCiAgICAgICAgICAgICAgICAgICAgICAgIG1heEV4Y2VwdGlvbiA9IGVycg0KICAgICAgICAgICAgICAgICAgICAgICAgbWF4RXhjTG9jID0gZXJyLmxvYw0KDQogICAgICAgIGlmIG1heEV4Y2VwdGlvbiBpcyBub3QgTm9uZToNCiAgICAgICAgICAgIG1heEV4Y2VwdGlvbi5tc2cgPSBzZWxmLmVycm1zZw0KICAgICAgICAgICAgcmFpc2UgbWF4RXhjZXB0aW9uDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCAibm8gZGVmaW5lZCBhbHRlcm5hdGl2ZXMgdG8gbWF0Y2giLCBzZWxmKQ0KDQoNCiAgICBkZWYgX19peG9yX18oc2VsZiwgb3RoZXIgKToNCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApDQogICAgICAgIHJldHVybiBzZWxmLmFwcGVuZCggb3RoZXIgKSAjT3IoIFsgc2VsZiwgb3RoZXIgXSApDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICBpZiBoYXNhdHRyKHNlbGYsIm5hbWUiKToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWUNCg0KICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToNCiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJ7IiArICIgXiAiLmpvaW4oX3VzdHIoZSkgZm9yIGUgaW4gc2VsZi5leHBycykgKyAifSINCg0KICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByDQoNCiAgICBkZWYgY2hlY2tSZWN1cnNpb24oIHNlbGYsIHBhcnNlRWxlbWVudExpc3QgKToNCiAgICAgICAgc3ViUmVjQ2hlY2tMaXN0ID0gcGFyc2VFbGVtZW50TGlzdFs6XSArIFsgc2VsZiBdDQogICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnM6DQogICAgICAgICAgICBlLmNoZWNrUmVjdXJzaW9uKCBzdWJSZWNDaGVja0xpc3QgKQ0KDQoNCmNsYXNzIE1hdGNoRmlyc3QoUGFyc2VFeHByZXNzaW9uKToNCiAgICAiIiINCiAgICBSZXF1aXJlcyB0aGF0IGF0IGxlYXN0IG9uZSBDe1BhcnNlRXhwcmVzc2lvbn0gaXMgZm91bmQuDQogICAgSWYgdHdvIGV4cHJlc3Npb25zIG1hdGNoLCB0aGUgZmlyc3Qgb25lIGxpc3RlZCBpcyB0aGUgb25lIHRoYXQgd2lsbCBtYXRjaC4NCiAgICBNYXkgYmUgY29uc3RydWN0ZWQgdXNpbmcgdGhlIEN7J3wnfSBvcGVyYXRvci4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICAjIGNvbnN0cnVjdCBNYXRjaEZpcnN0IHVzaW5nICd8JyBvcGVyYXRvcg0KICAgICAgICANCiAgICAgICAgIyB3YXRjaCB0aGUgb3JkZXIgb2YgZXhwcmVzc2lvbnMgdG8gbWF0Y2gNCiAgICAgICAgbnVtYmVyID0gV29yZChudW1zKSB8IENvbWJpbmUoV29yZChudW1zKSArICcuJyArIFdvcmQobnVtcykpDQogICAgICAgIHByaW50KG51bWJlci5zZWFyY2hTdHJpbmcoIjEyMyAzLjE0MTYgNzg5IikpICMgIEZhaWwhIC0+IFtbJzEyMyddLCBbJzMnXSwgWycxNDE2J10sIFsnNzg5J11dDQoNCiAgICAgICAgIyBwdXQgbW9yZSBzZWxlY3RpdmUgZXhwcmVzc2lvbiBmaXJzdA0KICAgICAgICBudW1iZXIgPSBDb21iaW5lKFdvcmQobnVtcykgKyAnLicgKyBXb3JkKG51bXMpKSB8IFdvcmQobnVtcykNCiAgICAgICAgcHJpbnQobnVtYmVyLnNlYXJjaFN0cmluZygiMTIzIDMuMTQxNiA3ODkiKSkgIyAgQmV0dGVyIC0+IFtbJzEyMyddLCBbJzMuMTQxNiddLCBbJzc4OSddXQ0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwcnMsIHNhdmVsaXN0ID0gRmFsc2UgKToNCiAgICAgICAgc3VwZXIoTWF0Y2hGaXJzdCxzZWxmKS5fX2luaXRfXyhleHBycywgc2F2ZWxpc3QpDQogICAgICAgIGlmIHNlbGYuZXhwcnM6DQogICAgICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gYW55KGUubWF5UmV0dXJuRW1wdHkgZm9yIGUgaW4gc2VsZi5leHBycykNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBtYXhFeGNMb2MgPSAtMQ0KICAgICAgICBtYXhFeGNlcHRpb24gPSBOb25lDQogICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnM6DQogICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgcmV0ID0gZS5fcGFyc2UoIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucyApDQogICAgICAgICAgICAgICAgcmV0dXJuIHJldA0KICAgICAgICAgICAgZXhjZXB0IFBhcnNlRXhjZXB0aW9uIGFzIGVycjoNCiAgICAgICAgICAgICAgICBpZiBlcnIubG9jID4gbWF4RXhjTG9jOg0KICAgICAgICAgICAgICAgICAgICBtYXhFeGNlcHRpb24gPSBlcnINCiAgICAgICAgICAgICAgICAgICAgbWF4RXhjTG9jID0gZXJyLmxvYw0KICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6DQogICAgICAgICAgICAgICAgaWYgbGVuKGluc3RyaW5nKSA+IG1heEV4Y0xvYzoNCiAgICAgICAgICAgICAgICAgICAgbWF4RXhjZXB0aW9uID0gUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsbGVuKGluc3RyaW5nKSxlLmVycm1zZyxzZWxmKQ0KICAgICAgICAgICAgICAgICAgICBtYXhFeGNMb2MgPSBsZW4oaW5zdHJpbmcpDQoNCiAgICAgICAgIyBvbmx5IGdvdCBoZXJlIGlmIG5vIGV4cHJlc3Npb24gbWF0Y2hlZCwgcmFpc2UgZXhjZXB0aW9uIGZvciBtYXRjaCB0aGF0IG1hZGUgaXQgdGhlIGZ1cnRoZXN0DQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBpZiBtYXhFeGNlcHRpb24gaXMgbm90IE5vbmU6DQogICAgICAgICAgICAgICAgbWF4RXhjZXB0aW9uLm1zZyA9IHNlbGYuZXJybXNnDQogICAgICAgICAgICAgICAgcmFpc2UgbWF4RXhjZXB0aW9uDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsICJubyBkZWZpbmVkIGFsdGVybmF0aXZlcyB0byBtYXRjaCIsIHNlbGYpDQoNCiAgICBkZWYgX19pb3JfXyhzZWxmLCBvdGhlciApOg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkNCiAgICAgICAgcmV0dXJuIHNlbGYuYXBwZW5kKCBvdGhlciApICNNYXRjaEZpcnN0KCBbIHNlbGYsIG90aGVyIF0gKQ0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCJuYW1lIik6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lDQoNCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6DQogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAieyIgKyAiIHwgIi5qb2luKF91c3RyKGUpIGZvciBlIGluIHNlbGYuZXhwcnMpICsgIn0iDQoNCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcg0KDQogICAgZGVmIGNoZWNrUmVjdXJzaW9uKCBzZWxmLCBwYXJzZUVsZW1lbnRMaXN0ICk6DQogICAgICAgIHN1YlJlY0NoZWNrTGlzdCA9IHBhcnNlRWxlbWVudExpc3RbOl0gKyBbIHNlbGYgXQ0KICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOg0KICAgICAgICAgICAgZS5jaGVja1JlY3Vyc2lvbiggc3ViUmVjQ2hlY2tMaXN0ICkNCg0KDQpjbGFzcyBFYWNoKFBhcnNlRXhwcmVzc2lvbik6DQogICAgIiIiDQogICAgUmVxdWlyZXMgYWxsIGdpdmVuIEN7UGFyc2VFeHByZXNzaW9ufXMgdG8gYmUgZm91bmQsIGJ1dCBpbiBhbnkgb3JkZXIuDQogICAgRXhwcmVzc2lvbnMgbWF5IGJlIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlLg0KICAgIE1heSBiZSBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgQ3snJid9IG9wZXJhdG9yLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIGNvbG9yID0gb25lT2YoIlJFRCBPUkFOR0UgWUVMTE9XIEdSRUVOIEJMVUUgUFVSUExFIEJMQUNLIFdISVRFIEJST1dOIikNCiAgICAgICAgc2hhcGVfdHlwZSA9IG9uZU9mKCJTUVVBUkUgQ0lSQ0xFIFRSSUFOR0xFIFNUQVIgSEVYQUdPTiBPQ1RBR09OIikNCiAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykNCiAgICAgICAgc2hhcGVfYXR0ciA9ICJzaGFwZToiICsgc2hhcGVfdHlwZSgic2hhcGUiKQ0KICAgICAgICBwb3NuX2F0dHIgPSAicG9zbjoiICsgR3JvdXAoaW50ZWdlcigieCIpICsgJywnICsgaW50ZWdlcigieSIpKSgicG9zbiIpDQogICAgICAgIGNvbG9yX2F0dHIgPSAiY29sb3I6IiArIGNvbG9yKCJjb2xvciIpDQogICAgICAgIHNpemVfYXR0ciA9ICJzaXplOiIgKyBpbnRlZ2VyKCJzaXplIikNCg0KICAgICAgICAjIHVzZSBFYWNoICh1c2luZyBvcGVyYXRvciAnJicpIHRvIGFjY2VwdCBhdHRyaWJ1dGVzIGluIGFueSBvcmRlciANCiAgICAgICAgIyAoc2hhcGUgYW5kIHBvc24gYXJlIHJlcXVpcmVkLCBjb2xvciBhbmQgc2l6ZSBhcmUgb3B0aW9uYWwpDQogICAgICAgIHNoYXBlX3NwZWMgPSBzaGFwZV9hdHRyICYgcG9zbl9hdHRyICYgT3B0aW9uYWwoY29sb3JfYXR0cikgJiBPcHRpb25hbChzaXplX2F0dHIpDQoNCiAgICAgICAgc2hhcGVfc3BlYy5ydW5UZXN0cygnJycNCiAgICAgICAgICAgIHNoYXBlOiBTUVVBUkUgY29sb3I6IEJMQUNLIHBvc246IDEwMCwgMTIwDQogICAgICAgICAgICBzaGFwZTogQ0lSQ0xFIHNpemU6IDUwIGNvbG9yOiBCTFVFIHBvc246IDUwLDgwDQogICAgICAgICAgICBjb2xvcjpHUkVFTiBzaXplOjIwIHNoYXBlOlRSSUFOR0xFIHBvc246MjAsNDANCiAgICAgICAgICAgICcnJw0KICAgICAgICAgICAgKQ0KICAgIHByaW50czo6DQogICAgICAgIHNoYXBlOiBTUVVBUkUgY29sb3I6IEJMQUNLIHBvc246IDEwMCwgMTIwDQogICAgICAgIFsnc2hhcGU6JywgJ1NRVUFSRScsICdjb2xvcjonLCAnQkxBQ0snLCAncG9zbjonLCBbJzEwMCcsICcsJywgJzEyMCddXQ0KICAgICAgICAtIGNvbG9yOiBCTEFDSw0KICAgICAgICAtIHBvc246IFsnMTAwJywgJywnLCAnMTIwJ10NCiAgICAgICAgICAtIHg6IDEwMA0KICAgICAgICAgIC0geTogMTIwDQogICAgICAgIC0gc2hhcGU6IFNRVUFSRQ0KDQoNCiAgICAgICAgc2hhcGU6IENJUkNMRSBzaXplOiA1MCBjb2xvcjogQkxVRSBwb3NuOiA1MCw4MA0KICAgICAgICBbJ3NoYXBlOicsICdDSVJDTEUnLCAnc2l6ZTonLCAnNTAnLCAnY29sb3I6JywgJ0JMVUUnLCAncG9zbjonLCBbJzUwJywgJywnLCAnODAnXV0NCiAgICAgICAgLSBjb2xvcjogQkxVRQ0KICAgICAgICAtIHBvc246IFsnNTAnLCAnLCcsICc4MCddDQogICAgICAgICAgLSB4OiA1MA0KICAgICAgICAgIC0geTogODANCiAgICAgICAgLSBzaGFwZTogQ0lSQ0xFDQogICAgICAgIC0gc2l6ZTogNTANCg0KDQogICAgICAgIGNvbG9yOiBHUkVFTiBzaXplOiAyMCBzaGFwZTogVFJJQU5HTEUgcG9zbjogMjAsNDANCiAgICAgICAgWydjb2xvcjonLCAnR1JFRU4nLCAnc2l6ZTonLCAnMjAnLCAnc2hhcGU6JywgJ1RSSUFOR0xFJywgJ3Bvc246JywgWycyMCcsICcsJywgJzQwJ11dDQogICAgICAgIC0gY29sb3I6IEdSRUVODQogICAgICAgIC0gcG9zbjogWycyMCcsICcsJywgJzQwJ10NCiAgICAgICAgICAtIHg6IDIwDQogICAgICAgICAgLSB5OiA0MA0KICAgICAgICAtIHNoYXBlOiBUUklBTkdMRQ0KICAgICAgICAtIHNpemU6IDIwDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHBycywgc2F2ZWxpc3QgPSBUcnVlICk6DQogICAgICAgIHN1cGVyKEVhY2gsc2VsZikuX19pbml0X18oZXhwcnMsIHNhdmVsaXN0KQ0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gYWxsKGUubWF5UmV0dXJuRW1wdHkgZm9yIGUgaW4gc2VsZi5leHBycykNCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IFRydWUNCiAgICAgICAgc2VsZi5pbml0RXhwckdyb3VwcyA9IFRydWUNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGlmIHNlbGYuaW5pdEV4cHJHcm91cHM6DQogICAgICAgICAgICBzZWxmLm9wdDFtYXAgPSBkaWN0KChpZChlLmV4cHIpLGUpIGZvciBlIGluIHNlbGYuZXhwcnMgaWYgaXNpbnN0YW5jZShlLE9wdGlvbmFsKSkNCiAgICAgICAgICAgIG9wdDEgPSBbIGUuZXhwciBmb3IgZSBpbiBzZWxmLmV4cHJzIGlmIGlzaW5zdGFuY2UoZSxPcHRpb25hbCkgXQ0KICAgICAgICAgICAgb3B0MiA9IFsgZSBmb3IgZSBpbiBzZWxmLmV4cHJzIGlmIGUubWF5UmV0dXJuRW1wdHkgYW5kIG5vdCBpc2luc3RhbmNlKGUsT3B0aW9uYWwpXQ0KICAgICAgICAgICAgc2VsZi5vcHRpb25hbHMgPSBvcHQxICsgb3B0Mg0KICAgICAgICAgICAgc2VsZi5tdWx0aW9wdGlvbmFscyA9IFsgZS5leHByIGZvciBlIGluIHNlbGYuZXhwcnMgaWYgaXNpbnN0YW5jZShlLFplcm9Pck1vcmUpIF0NCiAgICAgICAgICAgIHNlbGYubXVsdGlyZXF1aXJlZCA9IFsgZS5leHByIGZvciBlIGluIHNlbGYuZXhwcnMgaWYgaXNpbnN0YW5jZShlLE9uZU9yTW9yZSkgXQ0KICAgICAgICAgICAgc2VsZi5yZXF1aXJlZCA9IFsgZSBmb3IgZSBpbiBzZWxmLmV4cHJzIGlmIG5vdCBpc2luc3RhbmNlKGUsKE9wdGlvbmFsLFplcm9Pck1vcmUsT25lT3JNb3JlKSkgXQ0KICAgICAgICAgICAgc2VsZi5yZXF1aXJlZCArPSBzZWxmLm11bHRpcmVxdWlyZWQNCiAgICAgICAgICAgIHNlbGYuaW5pdEV4cHJHcm91cHMgPSBGYWxzZQ0KICAgICAgICB0bXBMb2MgPSBsb2MNCiAgICAgICAgdG1wUmVxZCA9IHNlbGYucmVxdWlyZWRbOl0NCiAgICAgICAgdG1wT3B0ICA9IHNlbGYub3B0aW9uYWxzWzpdDQogICAgICAgIG1hdGNoT3JkZXIgPSBbXQ0KDQogICAgICAgIGtlZXBNYXRjaGluZyA9IFRydWUNCiAgICAgICAgd2hpbGUga2VlcE1hdGNoaW5nOg0KICAgICAgICAgICAgdG1wRXhwcnMgPSB0bXBSZXFkICsgdG1wT3B0ICsgc2VsZi5tdWx0aW9wdGlvbmFscyArIHNlbGYubXVsdGlyZXF1aXJlZA0KICAgICAgICAgICAgZmFpbGVkID0gW10NCiAgICAgICAgICAgIGZvciBlIGluIHRtcEV4cHJzOg0KICAgICAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICAgICAgdG1wTG9jID0gZS50cnlQYXJzZSggaW5zdHJpbmcsIHRtcExvYyApDQogICAgICAgICAgICAgICAgZXhjZXB0IFBhcnNlRXhjZXB0aW9uOg0KICAgICAgICAgICAgICAgICAgICBmYWlsZWQuYXBwZW5kKGUpDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgbWF0Y2hPcmRlci5hcHBlbmQoc2VsZi5vcHQxbWFwLmdldChpZChlKSxlKSkNCiAgICAgICAgICAgICAgICAgICAgaWYgZSBpbiB0bXBSZXFkOg0KICAgICAgICAgICAgICAgICAgICAgICAgdG1wUmVxZC5yZW1vdmUoZSkNCiAgICAgICAgICAgICAgICAgICAgZWxpZiBlIGluIHRtcE9wdDoNCiAgICAgICAgICAgICAgICAgICAgICAgIHRtcE9wdC5yZW1vdmUoZSkNCiAgICAgICAgICAgIGlmIGxlbihmYWlsZWQpID09IGxlbih0bXBFeHBycyk6DQogICAgICAgICAgICAgICAga2VlcE1hdGNoaW5nID0gRmFsc2UNCg0KICAgICAgICBpZiB0bXBSZXFkOg0KICAgICAgICAgICAgbWlzc2luZyA9ICIsICIuam9pbihfdXN0cihlKSBmb3IgZSBpbiB0bXBSZXFkKQ0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsbG9jLCJNaXNzaW5nIG9uZSBvciBtb3JlIHJlcXVpcmVkIGVsZW1lbnRzICglcykiICUgbWlzc2luZyApDQoNCiAgICAgICAgIyBhZGQgYW55IHVubWF0Y2hlZCBPcHRpb25hbHMsIGluIGNhc2UgdGhleSBoYXZlIGRlZmF1bHQgdmFsdWVzIGRlZmluZWQNCiAgICAgICAgbWF0Y2hPcmRlciArPSBbZSBmb3IgZSBpbiBzZWxmLmV4cHJzIGlmIGlzaW5zdGFuY2UoZSxPcHRpb25hbCkgYW5kIGUuZXhwciBpbiB0bXBPcHRdDQoNCiAgICAgICAgcmVzdWx0bGlzdCA9IFtdDQogICAgICAgIGZvciBlIGluIG1hdGNoT3JkZXI6DQogICAgICAgICAgICBsb2MscmVzdWx0cyA9IGUuX3BhcnNlKGluc3RyaW5nLGxvYyxkb0FjdGlvbnMpDQogICAgICAgICAgICByZXN1bHRsaXN0LmFwcGVuZChyZXN1bHRzKQ0KDQogICAgICAgIGZpbmFsUmVzdWx0cyA9IHN1bShyZXN1bHRsaXN0LCBQYXJzZVJlc3VsdHMoW10pKQ0KICAgICAgICByZXR1cm4gbG9jLCBmaW5hbFJlc3VsdHMNCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwibmFtZSIpOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZQ0KDQogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOg0KICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gInsiICsgIiAmICIuam9pbihfdXN0cihlKSBmb3IgZSBpbiBzZWxmLmV4cHJzKSArICJ9Ig0KDQogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHINCg0KICAgIGRlZiBjaGVja1JlY3Vyc2lvbiggc2VsZiwgcGFyc2VFbGVtZW50TGlzdCApOg0KICAgICAgICBzdWJSZWNDaGVja0xpc3QgPSBwYXJzZUVsZW1lbnRMaXN0WzpdICsgWyBzZWxmIF0NCiAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoNCiAgICAgICAgICAgIGUuY2hlY2tSZWN1cnNpb24oIHN1YlJlY0NoZWNrTGlzdCApDQoNCg0KY2xhc3MgUGFyc2VFbGVtZW50RW5oYW5jZShQYXJzZXJFbGVtZW50KToNCiAgICAiIiINCiAgICBBYnN0cmFjdCBzdWJjbGFzcyBvZiBDe1BhcnNlckVsZW1lbnR9LCBmb3IgY29tYmluaW5nIGFuZCBwb3N0LXByb2Nlc3NpbmcgcGFyc2VkIHRva2Vucy4NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHIsIHNhdmVsaXN0PUZhbHNlICk6DQogICAgICAgIHN1cGVyKFBhcnNlRWxlbWVudEVuaGFuY2Usc2VsZikuX19pbml0X18oc2F2ZWxpc3QpDQogICAgICAgIGlmIGlzaW5zdGFuY2UoIGV4cHIsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIGlmIGlzc3ViY2xhc3MoUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzLCBUb2tlbik6DQogICAgICAgICAgICAgICAgZXhwciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyhleHByKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBleHByID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKExpdGVyYWwoZXhwcikpDQogICAgICAgIHNlbGYuZXhwciA9IGV4cHINCiAgICAgICAgc2VsZi5zdHJSZXByID0gTm9uZQ0KICAgICAgICBpZiBleHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gZXhwci5tYXlJbmRleEVycm9yDQogICAgICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gZXhwci5tYXlSZXR1cm5FbXB0eQ0KICAgICAgICAgICAgc2VsZi5zZXRXaGl0ZXNwYWNlQ2hhcnMoIGV4cHIud2hpdGVDaGFycyApDQogICAgICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gZXhwci5za2lwV2hpdGVzcGFjZQ0KICAgICAgICAgICAgc2VsZi5zYXZlQXNMaXN0ID0gZXhwci5zYXZlQXNMaXN0DQogICAgICAgICAgICBzZWxmLmNhbGxQcmVwYXJzZSA9IGV4cHIuY2FsbFByZXBhcnNlDQogICAgICAgICAgICBzZWxmLmlnbm9yZUV4cHJzLmV4dGVuZChleHByLmlnbm9yZUV4cHJzKQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYuZXhwci5fcGFyc2UoIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucywgY2FsbFByZVBhcnNlPUZhbHNlICkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKCIiLGxvYyxzZWxmLmVycm1zZyxzZWxmKQ0KDQogICAgZGVmIGxlYXZlV2hpdGVzcGFjZSggc2VsZiApOg0KICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gRmFsc2UNCiAgICAgICAgc2VsZi5leHByID0gc2VsZi5leHByLmNvcHkoKQ0KICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICBzZWxmLmV4cHIubGVhdmVXaGl0ZXNwYWNlKCkNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBpZ25vcmUoIHNlbGYsIG90aGVyICk6DQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBTdXBwcmVzcyApOg0KICAgICAgICAgICAgaWYgb3RoZXIgbm90IGluIHNlbGYuaWdub3JlRXhwcnM6DQogICAgICAgICAgICAgICAgc3VwZXIoIFBhcnNlRWxlbWVudEVuaGFuY2UsIHNlbGYpLmlnbm9yZSggb3RoZXIgKQ0KICAgICAgICAgICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgICAgICAgICAgc2VsZi5leHByLmlnbm9yZSggc2VsZi5pZ25vcmVFeHByc1stMV0gKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc3VwZXIoIFBhcnNlRWxlbWVudEVuaGFuY2UsIHNlbGYpLmlnbm9yZSggb3RoZXIgKQ0KICAgICAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgICAgIHNlbGYuZXhwci5pZ25vcmUoIHNlbGYuaWdub3JlRXhwcnNbLTFdICkNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBzdHJlYW1saW5lKCBzZWxmICk6DQogICAgICAgIHN1cGVyKFBhcnNlRWxlbWVudEVuaGFuY2Usc2VsZikuc3RyZWFtbGluZSgpDQogICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgIHNlbGYuZXhwci5zdHJlYW1saW5lKCkNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBjaGVja1JlY3Vyc2lvbiggc2VsZiwgcGFyc2VFbGVtZW50TGlzdCApOg0KICAgICAgICBpZiBzZWxmIGluIHBhcnNlRWxlbWVudExpc3Q6DQogICAgICAgICAgICByYWlzZSBSZWN1cnNpdmVHcmFtbWFyRXhjZXB0aW9uKCBwYXJzZUVsZW1lbnRMaXN0K1tzZWxmXSApDQogICAgICAgIHN1YlJlY0NoZWNrTGlzdCA9IHBhcnNlRWxlbWVudExpc3RbOl0gKyBbIHNlbGYgXQ0KICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICBzZWxmLmV4cHIuY2hlY2tSZWN1cnNpb24oIHN1YlJlY0NoZWNrTGlzdCApDQoNCiAgICBkZWYgdmFsaWRhdGUoIHNlbGYsIHZhbGlkYXRlVHJhY2U9W10gKToNCiAgICAgICAgdG1wID0gdmFsaWRhdGVUcmFjZVs6XStbc2VsZl0NCiAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgc2VsZi5leHByLnZhbGlkYXRlKHRtcCkNCiAgICAgICAgc2VsZi5jaGVja1JlY3Vyc2lvbiggW10gKQ0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgcmV0dXJuIHN1cGVyKFBhcnNlRWxlbWVudEVuaGFuY2Usc2VsZikuX19zdHJfXygpDQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246DQogICAgICAgICAgICBwYXNzDQoNCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmUgYW5kIHNlbGYuZXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICIlczooJXMpIiAlICggc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIF91c3RyKHNlbGYuZXhwcikgKQ0KICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByDQoNCg0KY2xhc3MgRm9sbG93ZWRCeShQYXJzZUVsZW1lbnRFbmhhbmNlKToNCiAgICAiIiINCiAgICBMb29rYWhlYWQgbWF0Y2hpbmcgb2YgdGhlIGdpdmVuIHBhcnNlIGV4cHJlc3Npb24uICBDe0ZvbGxvd2VkQnl9DQogICAgZG9lcyBJe25vdH0gYWR2YW5jZSB0aGUgcGFyc2luZyBwb3NpdGlvbiB3aXRoaW4gdGhlIGlucHV0IHN0cmluZywgaXQgb25seQ0KICAgIHZlcmlmaWVzIHRoYXQgdGhlIHNwZWNpZmllZCBwYXJzZSBleHByZXNzaW9uIG1hdGNoZXMgYXQgdGhlIGN1cnJlbnQNCiAgICBwb3NpdGlvbi4gIEN7Rm9sbG93ZWRCeX0gYWx3YXlzIHJldHVybnMgYSBudWxsIHRva2VuIGxpc3QuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgIyB1c2UgRm9sbG93ZWRCeSB0byBtYXRjaCBhIGxhYmVsIG9ubHkgaWYgaXQgaXMgZm9sbG93ZWQgYnkgYSAnOicNCiAgICAgICAgZGF0YV93b3JkID0gV29yZChhbHBoYXMpDQogICAgICAgIGxhYmVsID0gZGF0YV93b3JkICsgRm9sbG93ZWRCeSgnOicpDQogICAgICAgIGF0dHJfZXhwciA9IEdyb3VwKGxhYmVsICsgU3VwcHJlc3MoJzonKSArIE9uZU9yTW9yZShkYXRhX3dvcmQsIHN0b3BPbj1sYWJlbCkuc2V0UGFyc2VBY3Rpb24oJyAnLmpvaW4pKQ0KICAgICAgICANCiAgICAgICAgT25lT3JNb3JlKGF0dHJfZXhwcikucGFyc2VTdHJpbmcoInNoYXBlOiBTUVVBUkUgY29sb3I6IEJMQUNLIHBvc246IHVwcGVyIGxlZnQiKS5wcHJpbnQoKQ0KICAgIHByaW50czo6DQogICAgICAgIFtbJ3NoYXBlJywgJ1NRVUFSRSddLCBbJ2NvbG9yJywgJ0JMQUNLJ10sIFsncG9zbicsICd1cHBlciBsZWZ0J11dDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHByICk6DQogICAgICAgIHN1cGVyKEZvbGxvd2VkQnksc2VsZikuX19pbml0X18oZXhwcikNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIHNlbGYuZXhwci50cnlQYXJzZSggaW5zdHJpbmcsIGxvYyApDQogICAgICAgIHJldHVybiBsb2MsIFtdDQoNCg0KY2xhc3MgTm90QW55KFBhcnNlRWxlbWVudEVuaGFuY2UpOg0KICAgICIiIg0KICAgIExvb2thaGVhZCB0byBkaXNhbGxvdyBtYXRjaGluZyB3aXRoIHRoZSBnaXZlbiBwYXJzZSBleHByZXNzaW9uLiAgQ3tOb3RBbnl9DQogICAgZG9lcyBJe25vdH0gYWR2YW5jZSB0aGUgcGFyc2luZyBwb3NpdGlvbiB3aXRoaW4gdGhlIGlucHV0IHN0cmluZywgaXQgb25seQ0KICAgIHZlcmlmaWVzIHRoYXQgdGhlIHNwZWNpZmllZCBwYXJzZSBleHByZXNzaW9uIGRvZXMgSXtub3R9IG1hdGNoIGF0IHRoZSBjdXJyZW50DQogICAgcG9zaXRpb24uICBBbHNvLCBDe05vdEFueX0gZG9lcyBJe25vdH0gc2tpcCBvdmVyIGxlYWRpbmcgd2hpdGVzcGFjZS4gQ3tOb3RBbnl9DQogICAgYWx3YXlzIHJldHVybnMgYSBudWxsIHRva2VuIGxpc3QuICBNYXkgYmUgY29uc3RydWN0ZWQgdXNpbmcgdGhlICd+JyBvcGVyYXRvci4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICANCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHIgKToNCiAgICAgICAgc3VwZXIoTm90QW55LHNlbGYpLl9faW5pdF9fKGV4cHIpDQogICAgICAgICN+IHNlbGYubGVhdmVXaGl0ZXNwYWNlKCkNCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IEZhbHNlICAjIGRvIE5PVCB1c2Ugc2VsZi5sZWF2ZVdoaXRlc3BhY2UoKSwgZG9uJ3Qgd2FudCB0byBwcm9wYWdhdGUgdG8gZXhwcnMNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRm91bmQgdW53YW50ZWQgdG9rZW4sICIrX3VzdHIoc2VsZi5leHByKQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgaWYgc2VsZi5leHByLmNhblBhcnNlTmV4dChpbnN0cmluZywgbG9jKToNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KICAgICAgICByZXR1cm4gbG9jLCBbXQ0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCJuYW1lIik6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lDQoNCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6DQogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAifnsiICsgX3VzdHIoc2VsZi5leHByKSArICJ9Ig0KDQogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHINCg0KY2xhc3MgX011bHRpcGxlTWF0Y2goUGFyc2VFbGVtZW50RW5oYW5jZSk6DQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHByLCBzdG9wT249Tm9uZSk6DQogICAgICAgIHN1cGVyKF9NdWx0aXBsZU1hdGNoLCBzZWxmKS5fX2luaXRfXyhleHByKQ0KICAgICAgICBzZWxmLnNhdmVBc0xpc3QgPSBUcnVlDQogICAgICAgIGVuZGVyID0gc3RvcE9uDQogICAgICAgIGlmIGlzaW5zdGFuY2UoZW5kZXIsIGJhc2VzdHJpbmcpOg0KICAgICAgICAgICAgZW5kZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoZW5kZXIpDQogICAgICAgIHNlbGYubm90X2VuZGVyID0gfmVuZGVyIGlmIGVuZGVyIGlzIG5vdCBOb25lIGVsc2UgTm9uZQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgc2VsZl9leHByX3BhcnNlID0gc2VsZi5leHByLl9wYXJzZQ0KICAgICAgICBzZWxmX3NraXBfaWdub3JhYmxlcyA9IHNlbGYuX3NraXBJZ25vcmFibGVzDQogICAgICAgIGNoZWNrX2VuZGVyID0gc2VsZi5ub3RfZW5kZXIgaXMgbm90IE5vbmUNCiAgICAgICAgaWYgY2hlY2tfZW5kZXI6DQogICAgICAgICAgICB0cnlfbm90X2VuZGVyID0gc2VsZi5ub3RfZW5kZXIudHJ5UGFyc2UNCiAgICAgICAgDQogICAgICAgICMgbXVzdCBiZSBhdCBsZWFzdCBvbmUgKGJ1dCBmaXJzdCBzZWUgaWYgd2UgYXJlIHRoZSBzdG9wT24gc2VudGluZWw7DQogICAgICAgICMgaWYgc28sIGZhaWwpDQogICAgICAgIGlmIGNoZWNrX2VuZGVyOg0KICAgICAgICAgICAgdHJ5X25vdF9lbmRlcihpbnN0cmluZywgbG9jKQ0KICAgICAgICBsb2MsIHRva2VucyA9IHNlbGZfZXhwcl9wYXJzZSggaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zLCBjYWxsUHJlUGFyc2U9RmFsc2UgKQ0KICAgICAgICB0cnk6DQogICAgICAgICAgICBoYXNJZ25vcmVFeHBycyA9IChub3Qgbm90IHNlbGYuaWdub3JlRXhwcnMpDQogICAgICAgICAgICB3aGlsZSAxOg0KICAgICAgICAgICAgICAgIGlmIGNoZWNrX2VuZGVyOg0KICAgICAgICAgICAgICAgICAgICB0cnlfbm90X2VuZGVyKGluc3RyaW5nLCBsb2MpDQogICAgICAgICAgICAgICAgaWYgaGFzSWdub3JlRXhwcnM6DQogICAgICAgICAgICAgICAgICAgIHByZWxvYyA9IHNlbGZfc2tpcF9pZ25vcmFibGVzKCBpbnN0cmluZywgbG9jICkNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICBwcmVsb2MgPSBsb2MNCiAgICAgICAgICAgICAgICBsb2MsIHRtcHRva2VucyA9IHNlbGZfZXhwcl9wYXJzZSggaW5zdHJpbmcsIHByZWxvYywgZG9BY3Rpb25zICkNCiAgICAgICAgICAgICAgICBpZiB0bXB0b2tlbnMgb3IgdG1wdG9rZW5zLmhhc2tleXMoKToNCiAgICAgICAgICAgICAgICAgICAgdG9rZW5zICs9IHRtcHRva2Vucw0KICAgICAgICBleGNlcHQgKFBhcnNlRXhjZXB0aW9uLEluZGV4RXJyb3IpOg0KICAgICAgICAgICAgcGFzcw0KDQogICAgICAgIHJldHVybiBsb2MsIHRva2Vucw0KICAgICAgICANCmNsYXNzIE9uZU9yTW9yZShfTXVsdGlwbGVNYXRjaCk6DQogICAgIiIiDQogICAgUmVwZXRpdGlvbiBvZiBvbmUgb3IgbW9yZSBvZiB0aGUgZ2l2ZW4gZXhwcmVzc2lvbi4NCiAgICANCiAgICBQYXJhbWV0ZXJzOg0KICAgICAtIGV4cHIgLSBleHByZXNzaW9uIHRoYXQgbXVzdCBtYXRjaCBvbmUgb3IgbW9yZSB0aW1lcw0KICAgICAtIHN0b3BPbiAtIChkZWZhdWx0PUN7Tm9uZX0pIC0gZXhwcmVzc2lvbiBmb3IgYSB0ZXJtaW5hdGluZyBzZW50aW5lbA0KICAgICAgICAgIChvbmx5IHJlcXVpcmVkIGlmIHRoZSBzZW50aW5lbCB3b3VsZCBvcmRpbmFyaWx5IG1hdGNoIHRoZSByZXBldGl0aW9uIA0KICAgICAgICAgIGV4cHJlc3Npb24pICAgICAgICAgIA0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIGRhdGFfd29yZCA9IFdvcmQoYWxwaGFzKQ0KICAgICAgICBsYWJlbCA9IGRhdGFfd29yZCArIEZvbGxvd2VkQnkoJzonKQ0KICAgICAgICBhdHRyX2V4cHIgPSBHcm91cChsYWJlbCArIFN1cHByZXNzKCc6JykgKyBPbmVPck1vcmUoZGF0YV93b3JkKS5zZXRQYXJzZUFjdGlvbignICcuam9pbikpDQoNCiAgICAgICAgdGV4dCA9ICJzaGFwZTogU1FVQVJFIHBvc246IHVwcGVyIGxlZnQgY29sb3I6IEJMQUNLIg0KICAgICAgICBPbmVPck1vcmUoYXR0cl9leHByKS5wYXJzZVN0cmluZyh0ZXh0KS5wcHJpbnQoKSAgIyBGYWlsISByZWFkICdjb2xvcicgYXMgZGF0YSBpbnN0ZWFkIG9mIG5leHQgbGFiZWwgLT4gW1snc2hhcGUnLCAnU1FVQVJFIGNvbG9yJ11dDQoNCiAgICAgICAgIyB1c2Ugc3RvcE9uIGF0dHJpYnV0ZSBmb3IgT25lT3JNb3JlIHRvIGF2b2lkIHJlYWRpbmcgbGFiZWwgc3RyaW5nIGFzIHBhcnQgb2YgdGhlIGRhdGENCiAgICAgICAgYXR0cl9leHByID0gR3JvdXAobGFiZWwgKyBTdXBwcmVzcygnOicpICsgT25lT3JNb3JlKGRhdGFfd29yZCwgc3RvcE9uPWxhYmVsKS5zZXRQYXJzZUFjdGlvbignICcuam9pbikpDQogICAgICAgIE9uZU9yTW9yZShhdHRyX2V4cHIpLnBhcnNlU3RyaW5nKHRleHQpLnBwcmludCgpICMgQmV0dGVyIC0+IFtbJ3NoYXBlJywgJ1NRVUFSRSddLCBbJ3Bvc24nLCAndXBwZXIgbGVmdCddLCBbJ2NvbG9yJywgJ0JMQUNLJ11dDQogICAgICAgIA0KICAgICAgICAjIGNvdWxkIGFsc28gYmUgd3JpdHRlbiBhcw0KICAgICAgICAoYXR0cl9leHByICogKDEsKSkucGFyc2VTdHJpbmcodGV4dCkucHByaW50KCkNCiAgICAiIiINCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwibmFtZSIpOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZQ0KDQogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOg0KICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gInsiICsgX3VzdHIoc2VsZi5leHByKSArICJ9Li4uIg0KDQogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHINCg0KY2xhc3MgWmVyb09yTW9yZShfTXVsdGlwbGVNYXRjaCk6DQogICAgIiIiDQogICAgT3B0aW9uYWwgcmVwZXRpdGlvbiBvZiB6ZXJvIG9yIG1vcmUgb2YgdGhlIGdpdmVuIGV4cHJlc3Npb24uDQogICAgDQogICAgUGFyYW1ldGVyczoNCiAgICAgLSBleHByIC0gZXhwcmVzc2lvbiB0aGF0IG11c3QgbWF0Y2ggemVybyBvciBtb3JlIHRpbWVzDQogICAgIC0gc3RvcE9uIC0gKGRlZmF1bHQ9Q3tOb25lfSkgLSBleHByZXNzaW9uIGZvciBhIHRlcm1pbmF0aW5nIHNlbnRpbmVsDQogICAgICAgICAgKG9ubHkgcmVxdWlyZWQgaWYgdGhlIHNlbnRpbmVsIHdvdWxkIG9yZGluYXJpbHkgbWF0Y2ggdGhlIHJlcGV0aXRpb24gDQogICAgICAgICAgZXhwcmVzc2lvbikgICAgICAgICAgDQoNCiAgICBFeGFtcGxlOiBzaW1pbGFyIHRvIEx7T25lT3JNb3JlfQ0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwciwgc3RvcE9uPU5vbmUpOg0KICAgICAgICBzdXBlcihaZXJvT3JNb3JlLHNlbGYpLl9faW5pdF9fKGV4cHIsIHN0b3BPbj1zdG9wT24pDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlDQogICAgICAgIA0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHJldHVybiBzdXBlcihaZXJvT3JNb3JlLCBzZWxmKS5wYXJzZUltcGwoaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zKQ0KICAgICAgICBleGNlcHQgKFBhcnNlRXhjZXB0aW9uLEluZGV4RXJyb3IpOg0KICAgICAgICAgICAgcmV0dXJuIGxvYywgW10NCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwibmFtZSIpOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZQ0KDQogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOg0KICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gIlsiICsgX3VzdHIoc2VsZi5leHByKSArICJdLi4uIg0KDQogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHINCg0KY2xhc3MgX051bGxUb2tlbihvYmplY3QpOg0KICAgIGRlZiBfX2Jvb2xfXyhzZWxmKToNCiAgICAgICAgcmV0dXJuIEZhbHNlDQogICAgX19ub256ZXJvX18gPSBfX2Jvb2xfXw0KICAgIGRlZiBfX3N0cl9fKHNlbGYpOg0KICAgICAgICByZXR1cm4gIiINCg0KX29wdGlvbmFsTm90TWF0Y2hlZCA9IF9OdWxsVG9rZW4oKQ0KY2xhc3MgT3B0aW9uYWwoUGFyc2VFbGVtZW50RW5oYW5jZSk6DQogICAgIiIiDQogICAgT3B0aW9uYWwgbWF0Y2hpbmcgb2YgdGhlIGdpdmVuIGV4cHJlc3Npb24uDQoNCiAgICBQYXJhbWV0ZXJzOg0KICAgICAtIGV4cHIgLSBleHByZXNzaW9uIHRoYXQgbXVzdCBtYXRjaCB6ZXJvIG9yIG1vcmUgdGltZXMNCiAgICAgLSBkZWZhdWx0IChvcHRpb25hbCkgLSB2YWx1ZSB0byBiZSByZXR1cm5lZCBpZiB0aGUgb3B0aW9uYWwgZXhwcmVzc2lvbiBpcyBub3QgZm91bmQuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgIyBVUyBwb3N0YWwgY29kZSBjYW4gYmUgYSA1LWRpZ2l0IHppcCwgcGx1cyBvcHRpb25hbCA0LWRpZ2l0IHF1YWxpZmllcg0KICAgICAgICB6aXAgPSBDb21iaW5lKFdvcmQobnVtcywgZXhhY3Q9NSkgKyBPcHRpb25hbCgnLScgKyBXb3JkKG51bXMsIGV4YWN0PTQpKSkNCiAgICAgICAgemlwLnJ1blRlc3RzKCcnJw0KICAgICAgICAgICAgIyB0cmFkaXRpb25hbCBaSVAgY29kZQ0KICAgICAgICAgICAgMTIzNDUNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgIyBaSVArNCBmb3JtDQogICAgICAgICAgICAxMjEwMS0wMDAxDQogICAgICAgICAgICANCiAgICAgICAgICAgICMgaW52YWxpZCBaSVANCiAgICAgICAgICAgIDk4NzY1LQ0KICAgICAgICAgICAgJycnKQ0KICAgIHByaW50czo6DQogICAgICAgICMgdHJhZGl0aW9uYWwgWklQIGNvZGUNCiAgICAgICAgMTIzNDUNCiAgICAgICAgWycxMjM0NSddDQoNCiAgICAgICAgIyBaSVArNCBmb3JtDQogICAgICAgIDEyMTAxLTAwMDENCiAgICAgICAgWycxMjEwMS0wMDAxJ10NCg0KICAgICAgICAjIGludmFsaWQgWklQDQogICAgICAgIDk4NzY1LQ0KICAgICAgICAgICAgIF4NCiAgICAgICAgRkFJTDogRXhwZWN0ZWQgZW5kIG9mIHRleHQgKGF0IGNoYXIgNSksIChsaW5lOjEsIGNvbDo2KQ0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwciwgZGVmYXVsdD1fb3B0aW9uYWxOb3RNYXRjaGVkICk6DQogICAgICAgIHN1cGVyKE9wdGlvbmFsLHNlbGYpLl9faW5pdF9fKCBleHByLCBzYXZlbGlzdD1GYWxzZSApDQogICAgICAgIHNlbGYuc2F2ZUFzTGlzdCA9IHNlbGYuZXhwci5zYXZlQXNMaXN0DQogICAgICAgIHNlbGYuZGVmYXVsdFZhbHVlID0gZGVmYXVsdA0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgbG9jLCB0b2tlbnMgPSBzZWxmLmV4cHIuX3BhcnNlKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMsIGNhbGxQcmVQYXJzZT1GYWxzZSApDQogICAgICAgIGV4Y2VwdCAoUGFyc2VFeGNlcHRpb24sSW5kZXhFcnJvcik6DQogICAgICAgICAgICBpZiBzZWxmLmRlZmF1bHRWYWx1ZSBpcyBub3QgX29wdGlvbmFsTm90TWF0Y2hlZDoNCiAgICAgICAgICAgICAgICBpZiBzZWxmLmV4cHIucmVzdWx0c05hbWU6DQogICAgICAgICAgICAgICAgICAgIHRva2VucyA9IFBhcnNlUmVzdWx0cyhbIHNlbGYuZGVmYXVsdFZhbHVlIF0pDQogICAgICAgICAgICAgICAgICAgIHRva2Vuc1tzZWxmLmV4cHIucmVzdWx0c05hbWVdID0gc2VsZi5kZWZhdWx0VmFsdWUNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICB0b2tlbnMgPSBbIHNlbGYuZGVmYXVsdFZhbHVlIF0NCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgdG9rZW5zID0gW10NCiAgICAgICAgcmV0dXJuIGxvYywgdG9rZW5zDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICBpZiBoYXNhdHRyKHNlbGYsIm5hbWUiKToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWUNCg0KICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToNCiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJbIiArIF91c3RyKHNlbGYuZXhwcikgKyAiXSINCg0KICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByDQoNCmNsYXNzIFNraXBUbyhQYXJzZUVsZW1lbnRFbmhhbmNlKToNCiAgICAiIiINCiAgICBUb2tlbiBmb3Igc2tpcHBpbmcgb3ZlciBhbGwgdW5kZWZpbmVkIHRleHQgdW50aWwgdGhlIG1hdGNoZWQgZXhwcmVzc2lvbiBpcyBmb3VuZC4NCg0KICAgIFBhcmFtZXRlcnM6DQogICAgIC0gZXhwciAtIHRhcmdldCBleHByZXNzaW9uIG1hcmtpbmcgdGhlIGVuZCBvZiB0aGUgZGF0YSB0byBiZSBza2lwcGVkDQogICAgIC0gaW5jbHVkZSAtIChkZWZhdWx0PUN7RmFsc2V9KSBpZiBUcnVlLCB0aGUgdGFyZ2V0IGV4cHJlc3Npb24gaXMgYWxzbyBwYXJzZWQgDQogICAgICAgICAgKHRoZSBza2lwcGVkIHRleHQgYW5kIHRhcmdldCBleHByZXNzaW9uIGFyZSByZXR1cm5lZCBhcyBhIDItZWxlbWVudCBsaXN0KS4NCiAgICAgLSBpZ25vcmUgLSAoZGVmYXVsdD1De05vbmV9KSB1c2VkIHRvIGRlZmluZSBncmFtbWFycyAodHlwaWNhbGx5IHF1b3RlZCBzdHJpbmdzIGFuZCANCiAgICAgICAgICBjb21tZW50cykgdGhhdCBtaWdodCBjb250YWluIGZhbHNlIG1hdGNoZXMgdG8gdGhlIHRhcmdldCBleHByZXNzaW9uDQogICAgIC0gZmFpbE9uIC0gKGRlZmF1bHQ9Q3tOb25lfSkgZGVmaW5lIGV4cHJlc3Npb25zIHRoYXQgYXJlIG5vdCBhbGxvd2VkIHRvIGJlIA0KICAgICAgICAgIGluY2x1ZGVkIGluIHRoZSBza2lwcGVkIHRlc3Q7IGlmIGZvdW5kIGJlZm9yZSB0aGUgdGFyZ2V0IGV4cHJlc3Npb24gaXMgZm91bmQsIA0KICAgICAgICAgIHRoZSBTa2lwVG8gaXMgbm90IGEgbWF0Y2gNCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICByZXBvcnQgPSAnJycNCiAgICAgICAgICAgIE91dHN0YW5kaW5nIElzc3VlcyBSZXBvcnQgLSAxIEphbiAyMDAwDQoNCiAgICAgICAgICAgICAgICMgfCBTZXZlcml0eSB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIERheXMgT3Blbg0KICAgICAgICAgICAgLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tDQogICAgICAgICAgICAgMTAxIHwgQ3JpdGljYWwgfCBJbnRlcm1pdHRlbnQgc3lzdGVtIGNyYXNoICAgICAgICAgICAgICAgICB8ICAgICAgICAgIDYNCiAgICAgICAgICAgICAgOTQgfCBDb3NtZXRpYyB8IFNwZWxsaW5nIGVycm9yIG9uIExvZ2luICgnbG9nfG4nKSAgICAgICAgIHwgICAgICAgICAxNA0KICAgICAgICAgICAgICA3OSB8IE1pbm9yICAgIHwgU3lzdGVtIHNsb3cgd2hlbiBydW5uaW5nIHRvbyBtYW55IHJlcG9ydHMgfCAgICAgICAgIDQ3DQogICAgICAgICAgICAnJycNCiAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykNCiAgICAgICAgU0VQID0gU3VwcHJlc3MoJ3wnKQ0KICAgICAgICAjIHVzZSBTa2lwVG8gdG8gc2ltcGx5IG1hdGNoIGV2ZXJ5dGhpbmcgdXAgdW50aWwgdGhlIG5leHQgU0VQDQogICAgICAgICMgLSBpZ25vcmUgcXVvdGVkIHN0cmluZ3MsIHNvIHRoYXQgYSAnfCcgY2hhcmFjdGVyIGluc2lkZSBhIHF1b3RlZCBzdHJpbmcgZG9lcyBub3QgbWF0Y2gNCiAgICAgICAgIyAtIHBhcnNlIGFjdGlvbiB3aWxsIGNhbGwgdG9rZW4uc3RyaXAoKSBmb3IgZWFjaCBtYXRjaGVkIHRva2VuLCBpLmUuLCB0aGUgZGVzY3JpcHRpb24gYm9keQ0KICAgICAgICBzdHJpbmdfZGF0YSA9IFNraXBUbyhTRVAsIGlnbm9yZT1xdW90ZWRTdHJpbmcpDQogICAgICAgIHN0cmluZ19kYXRhLnNldFBhcnNlQWN0aW9uKHRva2VuTWFwKHN0ci5zdHJpcCkpDQogICAgICAgIHRpY2tldF9leHByID0gKGludGVnZXIoImlzc3VlX251bSIpICsgU0VQIA0KICAgICAgICAgICAgICAgICAgICAgICsgc3RyaW5nX2RhdGEoInNldiIpICsgU0VQIA0KICAgICAgICAgICAgICAgICAgICAgICsgc3RyaW5nX2RhdGEoImRlc2MiKSArIFNFUCANCiAgICAgICAgICAgICAgICAgICAgICArIGludGVnZXIoImRheXNfb3BlbiIpKQ0KICAgICAgICANCiAgICAgICAgZm9yIHRrdCBpbiB0aWNrZXRfZXhwci5zZWFyY2hTdHJpbmcocmVwb3J0KToNCiAgICAgICAgICAgIHByaW50IHRrdC5kdW1wKCkNCiAgICBwcmludHM6Og0KICAgICAgICBbJzEwMScsICdDcml0aWNhbCcsICdJbnRlcm1pdHRlbnQgc3lzdGVtIGNyYXNoJywgJzYnXQ0KICAgICAgICAtIGRheXNfb3BlbjogNg0KICAgICAgICAtIGRlc2M6IEludGVybWl0dGVudCBzeXN0ZW0gY3Jhc2gNCiAgICAgICAgLSBpc3N1ZV9udW06IDEwMQ0KICAgICAgICAtIHNldjogQ3JpdGljYWwNCiAgICAgICAgWyc5NCcsICdDb3NtZXRpYycsICJTcGVsbGluZyBlcnJvciBvbiBMb2dpbiAoJ2xvZ3xuJykiLCAnMTQnXQ0KICAgICAgICAtIGRheXNfb3BlbjogMTQNCiAgICAgICAgLSBkZXNjOiBTcGVsbGluZyBlcnJvciBvbiBMb2dpbiAoJ2xvZ3xuJykNCiAgICAgICAgLSBpc3N1ZV9udW06IDk0DQogICAgICAgIC0gc2V2OiBDb3NtZXRpYw0KICAgICAgICBbJzc5JywgJ01pbm9yJywgJ1N5c3RlbSBzbG93IHdoZW4gcnVubmluZyB0b28gbWFueSByZXBvcnRzJywgJzQ3J10NCiAgICAgICAgLSBkYXlzX29wZW46IDQ3DQogICAgICAgIC0gZGVzYzogU3lzdGVtIHNsb3cgd2hlbiBydW5uaW5nIHRvbyBtYW55IHJlcG9ydHMNCiAgICAgICAgLSBpc3N1ZV9udW06IDc5DQogICAgICAgIC0gc2V2OiBNaW5vcg0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgb3RoZXIsIGluY2x1ZGU9RmFsc2UsIGlnbm9yZT1Ob25lLCBmYWlsT249Tm9uZSApOg0KICAgICAgICBzdXBlciggU2tpcFRvLCBzZWxmICkuX19pbml0X18oIG90aGVyICkNCiAgICAgICAgc2VsZi5pZ25vcmVFeHByID0gaWdub3JlDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlDQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlDQogICAgICAgIHNlbGYuaW5jbHVkZU1hdGNoID0gaW5jbHVkZQ0KICAgICAgICBzZWxmLmFzTGlzdCA9IEZhbHNlDQogICAgICAgIGlmIGlzaW5zdGFuY2UoZmFpbE9uLCBiYXNlc3RyaW5nKToNCiAgICAgICAgICAgIHNlbGYuZmFpbE9uID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKGZhaWxPbikNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHNlbGYuZmFpbE9uID0gZmFpbE9uDQogICAgICAgIHNlbGYuZXJybXNnID0gIk5vIG1hdGNoIGZvdW5kIGZvciAiK191c3RyKHNlbGYuZXhwcikNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIHN0YXJ0bG9jID0gbG9jDQogICAgICAgIGluc3RybGVuID0gbGVuKGluc3RyaW5nKQ0KICAgICAgICBleHByID0gc2VsZi5leHByDQogICAgICAgIGV4cHJfcGFyc2UgPSBzZWxmLmV4cHIuX3BhcnNlDQogICAgICAgIHNlbGZfZmFpbE9uX2NhblBhcnNlTmV4dCA9IHNlbGYuZmFpbE9uLmNhblBhcnNlTmV4dCBpZiBzZWxmLmZhaWxPbiBpcyBub3QgTm9uZSBlbHNlIE5vbmUNCiAgICAgICAgc2VsZl9pZ25vcmVFeHByX3RyeVBhcnNlID0gc2VsZi5pZ25vcmVFeHByLnRyeVBhcnNlIGlmIHNlbGYuaWdub3JlRXhwciBpcyBub3QgTm9uZSBlbHNlIE5vbmUNCiAgICAgICAgDQogICAgICAgIHRtcGxvYyA9IGxvYw0KICAgICAgICB3aGlsZSB0bXBsb2MgPD0gaW5zdHJsZW46DQogICAgICAgICAgICBpZiBzZWxmX2ZhaWxPbl9jYW5QYXJzZU5leHQgaXMgbm90IE5vbmU6DQogICAgICAgICAgICAgICAgIyBicmVhayBpZiBmYWlsT24gZXhwcmVzc2lvbiBtYXRjaGVzDQogICAgICAgICAgICAgICAgaWYgc2VsZl9mYWlsT25fY2FuUGFyc2VOZXh0KGluc3RyaW5nLCB0bXBsb2MpOg0KICAgICAgICAgICAgICAgICAgICBicmVhaw0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgIGlmIHNlbGZfaWdub3JlRXhwcl90cnlQYXJzZSBpcyBub3QgTm9uZToNCiAgICAgICAgICAgICAgICAjIGFkdmFuY2UgcGFzdCBpZ25vcmUgZXhwcmVzc2lvbnMNCiAgICAgICAgICAgICAgICB3aGlsZSAxOg0KICAgICAgICAgICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgICAgICAgICB0bXBsb2MgPSBzZWxmX2lnbm9yZUV4cHJfdHJ5UGFyc2UoaW5zdHJpbmcsIHRtcGxvYykNCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbjoNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrDQogICAgICAgICAgICANCiAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICBleHByX3BhcnNlKGluc3RyaW5nLCB0bXBsb2MsIGRvQWN0aW9ucz1GYWxzZSwgY2FsbFByZVBhcnNlPUZhbHNlKQ0KICAgICAgICAgICAgZXhjZXB0IChQYXJzZUV4Y2VwdGlvbiwgSW5kZXhFcnJvcik6DQogICAgICAgICAgICAgICAgIyBubyBtYXRjaCwgYWR2YW5jZSBsb2MgaW4gc3RyaW5nDQogICAgICAgICAgICAgICAgdG1wbG9jICs9IDENCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgIyBtYXRjaGVkIHNraXB0byBleHByLCBkb25lDQogICAgICAgICAgICAgICAgYnJlYWsNCg0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgIyByYW4gb2ZmIHRoZSBlbmQgb2YgdGhlIGlucHV0IHN0cmluZyB3aXRob3V0IG1hdGNoaW5nIHNraXB0byBleHByLCBmYWlsDQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KICAgICAgICAjIGJ1aWxkIHVwIHJldHVybiB2YWx1ZXMNCiAgICAgICAgbG9jID0gdG1wbG9jDQogICAgICAgIHNraXB0ZXh0ID0gaW5zdHJpbmdbc3RhcnRsb2M6bG9jXQ0KICAgICAgICBza2lwcmVzdWx0ID0gUGFyc2VSZXN1bHRzKHNraXB0ZXh0KQ0KICAgICAgICANCiAgICAgICAgaWYgc2VsZi5pbmNsdWRlTWF0Y2g6DQogICAgICAgICAgICBsb2MsIG1hdCA9IGV4cHJfcGFyc2UoaW5zdHJpbmcsbG9jLGRvQWN0aW9ucyxjYWxsUHJlUGFyc2U9RmFsc2UpDQogICAgICAgICAgICBza2lwcmVzdWx0ICs9IG1hdA0KDQogICAgICAgIHJldHVybiBsb2MsIHNraXByZXN1bHQNCg0KY2xhc3MgRm9yd2FyZChQYXJzZUVsZW1lbnRFbmhhbmNlKToNCiAgICAiIiINCiAgICBGb3J3YXJkIGRlY2xhcmF0aW9uIG9mIGFuIGV4cHJlc3Npb24gdG8gYmUgZGVmaW5lZCBsYXRlciAtDQogICAgdXNlZCBmb3IgcmVjdXJzaXZlIGdyYW1tYXJzLCBzdWNoIGFzIGFsZ2VicmFpYyBpbmZpeCBub3RhdGlvbi4NCiAgICBXaGVuIHRoZSBleHByZXNzaW9uIGlzIGtub3duLCBpdCBpcyBhc3NpZ25lZCB0byB0aGUgQ3tGb3J3YXJkfSB2YXJpYWJsZSB1c2luZyB0aGUgJzw8JyBvcGVyYXRvci4NCg0KICAgIE5vdGU6IHRha2UgY2FyZSB3aGVuIGFzc2lnbmluZyB0byBDe0ZvcndhcmR9IG5vdCB0byBvdmVybG9vayBwcmVjZWRlbmNlIG9mIG9wZXJhdG9ycy4NCiAgICBTcGVjaWZpY2FsbHksICd8JyBoYXMgYSBsb3dlciBwcmVjZWRlbmNlIHRoYW4gJzw8Jywgc28gdGhhdDo6DQogICAgICAgIGZ3ZEV4cHIgPDwgYSB8IGIgfCBjDQogICAgd2lsbCBhY3R1YWxseSBiZSBldmFsdWF0ZWQgYXM6Og0KICAgICAgICAoZndkRXhwciA8PCBhKSB8IGIgfCBjDQogICAgdGhlcmVieSBsZWF2aW5nIGIgYW5kIGMgb3V0IGFzIHBhcnNlYWJsZSBhbHRlcm5hdGl2ZXMuICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IHlvdQ0KICAgIGV4cGxpY2l0bHkgZ3JvdXAgdGhlIHZhbHVlcyBpbnNlcnRlZCBpbnRvIHRoZSBDe0ZvcndhcmR9OjoNCiAgICAgICAgZndkRXhwciA8PCAoYSB8IGIgfCBjKQ0KICAgIENvbnZlcnRpbmcgdG8gdXNlIHRoZSAnPDw9JyBvcGVyYXRvciBpbnN0ZWFkIHdpbGwgYXZvaWQgdGhpcyBwcm9ibGVtLg0KDQogICAgU2VlIEx7UGFyc2VSZXN1bHRzLnBwcmludH0gZm9yIGFuIGV4YW1wbGUgb2YgYSByZWN1cnNpdmUgcGFyc2VyIGNyZWF0ZWQgdXNpbmcNCiAgICBDe0ZvcndhcmR9Lg0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgb3RoZXI9Tm9uZSApOg0KICAgICAgICBzdXBlcihGb3J3YXJkLHNlbGYpLl9faW5pdF9fKCBvdGhlciwgc2F2ZWxpc3Q9RmFsc2UgKQ0KDQogICAgZGVmIF9fbHNoaWZ0X18oIHNlbGYsIG90aGVyICk6DQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyhvdGhlcikNCiAgICAgICAgc2VsZi5leHByID0gb3RoZXINCiAgICAgICAgc2VsZi5zdHJSZXByID0gTm9uZQ0KICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBzZWxmLmV4cHIubWF5SW5kZXhFcnJvcg0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gc2VsZi5leHByLm1heVJldHVybkVtcHR5DQogICAgICAgIHNlbGYuc2V0V2hpdGVzcGFjZUNoYXJzKCBzZWxmLmV4cHIud2hpdGVDaGFycyApDQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBzZWxmLmV4cHIuc2tpcFdoaXRlc3BhY2UNCiAgICAgICAgc2VsZi5zYXZlQXNMaXN0ID0gc2VsZi5leHByLnNhdmVBc0xpc3QNCiAgICAgICAgc2VsZi5pZ25vcmVFeHBycy5leHRlbmQoc2VsZi5leHByLmlnbm9yZUV4cHJzKQ0KICAgICAgICByZXR1cm4gc2VsZg0KICAgICAgICANCiAgICBkZWYgX19pbHNoaWZ0X18oc2VsZiwgb3RoZXIpOg0KICAgICAgICByZXR1cm4gc2VsZiA8PCBvdGhlcg0KICAgIA0KICAgIGRlZiBsZWF2ZVdoaXRlc3BhY2UoIHNlbGYgKToNCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IEZhbHNlDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgc3RyZWFtbGluZSggc2VsZiApOg0KICAgICAgICBpZiBub3Qgc2VsZi5zdHJlYW1saW5lZDoNCiAgICAgICAgICAgIHNlbGYuc3RyZWFtbGluZWQgPSBUcnVlDQogICAgICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICAgICAgc2VsZi5leHByLnN0cmVhbWxpbmUoKQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIHZhbGlkYXRlKCBzZWxmLCB2YWxpZGF0ZVRyYWNlPVtdICk6DQogICAgICAgIGlmIHNlbGYgbm90IGluIHZhbGlkYXRlVHJhY2U6DQogICAgICAgICAgICB0bXAgPSB2YWxpZGF0ZVRyYWNlWzpdK1tzZWxmXQ0KICAgICAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgICAgIHNlbGYuZXhwci52YWxpZGF0ZSh0bXApDQogICAgICAgIHNlbGYuY2hlY2tSZWN1cnNpb24oW10pDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICBpZiBoYXNhdHRyKHNlbGYsIm5hbWUiKToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWUNCiAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fICsgIjogLi4uIg0KDQogICAgICAgICMgc3R1YmJlZCBvdXQgZm9yIG5vdyAtIGNyZWF0ZXMgYXdmdWwgbWVtb3J5IGFuZCBwZXJmIGlzc3Vlcw0KICAgICAgICBzZWxmLl9yZXZlcnRDbGFzcyA9IHNlbGYuX19jbGFzc19fDQogICAgICAgIHNlbGYuX19jbGFzc19fID0gX0ZvcndhcmROb1JlY3Vyc2UNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgICAgIHJldFN0cmluZyA9IF91c3RyKHNlbGYuZXhwcikNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcmV0U3RyaW5nID0gIk5vbmUiDQogICAgICAgIGZpbmFsbHk6DQogICAgICAgICAgICBzZWxmLl9fY2xhc3NfXyA9IHNlbGYuX3JldmVydENsYXNzDQogICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXyArICI6ICIgKyByZXRTdHJpbmcNCg0KICAgIGRlZiBjb3B5KHNlbGYpOg0KICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICByZXR1cm4gc3VwZXIoRm9yd2FyZCxzZWxmKS5jb3B5KCkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJldCA9IEZvcndhcmQoKQ0KICAgICAgICAgICAgcmV0IDw8PSBzZWxmDQogICAgICAgICAgICByZXR1cm4gcmV0DQoNCmNsYXNzIF9Gb3J3YXJkTm9SZWN1cnNlKEZvcndhcmQpOg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIHJldHVybiAiLi4uIg0KDQpjbGFzcyBUb2tlbkNvbnZlcnRlcihQYXJzZUVsZW1lbnRFbmhhbmNlKToNCiAgICAiIiINCiAgICBBYnN0cmFjdCBzdWJjbGFzcyBvZiBDe1BhcnNlRXhwcmVzc2lvbn0sIGZvciBjb252ZXJ0aW5nIHBhcnNlZCByZXN1bHRzLg0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwciwgc2F2ZWxpc3Q9RmFsc2UgKToNCiAgICAgICAgc3VwZXIoVG9rZW5Db252ZXJ0ZXIsc2VsZikuX19pbml0X18oIGV4cHIgKSMsIHNhdmVsaXN0ICkNCiAgICAgICAgc2VsZi5zYXZlQXNMaXN0ID0gRmFsc2UNCg0KY2xhc3MgQ29tYmluZShUb2tlbkNvbnZlcnRlcik6DQogICAgIiIiDQogICAgQ29udmVydGVyIHRvIGNvbmNhdGVuYXRlIGFsbCBtYXRjaGluZyB0b2tlbnMgdG8gYSBzaW5nbGUgc3RyaW5nLg0KICAgIEJ5IGRlZmF1bHQsIHRoZSBtYXRjaGluZyBwYXR0ZXJucyBtdXN0IGFsc28gYmUgY29udGlndW91cyBpbiB0aGUgaW5wdXQgc3RyaW5nOw0KICAgIHRoaXMgY2FuIGJlIGRpc2FibGVkIGJ5IHNwZWNpZnlpbmcgQ3snYWRqYWNlbnQ9RmFsc2UnfSBpbiB0aGUgY29uc3RydWN0b3IuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgcmVhbCA9IFdvcmQobnVtcykgKyAnLicgKyBXb3JkKG51bXMpDQogICAgICAgIHByaW50KHJlYWwucGFyc2VTdHJpbmcoJzMuMTQxNicpKSAjIC0+IFsnMycsICcuJywgJzE0MTYnXQ0KICAgICAgICAjIHdpbGwgYWxzbyBlcnJvbmVvdXNseSBtYXRjaCB0aGUgZm9sbG93aW5nDQogICAgICAgIHByaW50KHJlYWwucGFyc2VTdHJpbmcoJzMuIDE0MTYnKSkgIyAtPiBbJzMnLCAnLicsICcxNDE2J10NCg0KICAgICAgICByZWFsID0gQ29tYmluZShXb3JkKG51bXMpICsgJy4nICsgV29yZChudW1zKSkNCiAgICAgICAgcHJpbnQocmVhbC5wYXJzZVN0cmluZygnMy4xNDE2JykpICMgLT4gWyczLjE0MTYnXQ0KICAgICAgICAjIG5vIG1hdGNoIHdoZW4gdGhlcmUgYXJlIGludGVybmFsIHNwYWNlcw0KICAgICAgICBwcmludChyZWFsLnBhcnNlU3RyaW5nKCczLiAxNDE2JykpICMgLT4gRXhjZXB0aW9uOiBFeHBlY3RlZCBXOigwMTIzLi4uKQ0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwciwgam9pblN0cmluZz0iIiwgYWRqYWNlbnQ9VHJ1ZSApOg0KICAgICAgICBzdXBlcihDb21iaW5lLHNlbGYpLl9faW5pdF9fKCBleHByICkNCiAgICAgICAgIyBzdXBwcmVzcyB3aGl0ZXNwYWNlLXN0cmlwcGluZyBpbiBjb250YWluZWQgcGFyc2UgZXhwcmVzc2lvbnMsIGJ1dCByZS1lbmFibGUgaXQgb24gdGhlIENvbWJpbmUgaXRzZWxmDQogICAgICAgIGlmIGFkamFjZW50Og0KICAgICAgICAgICAgc2VsZi5sZWF2ZVdoaXRlc3BhY2UoKQ0KICAgICAgICBzZWxmLmFkamFjZW50ID0gYWRqYWNlbnQNCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IFRydWUNCiAgICAgICAgc2VsZi5qb2luU3RyaW5nID0gam9pblN0cmluZw0KICAgICAgICBzZWxmLmNhbGxQcmVwYXJzZSA9IFRydWUNCg0KICAgIGRlZiBpZ25vcmUoIHNlbGYsIG90aGVyICk6DQogICAgICAgIGlmIHNlbGYuYWRqYWNlbnQ6DQogICAgICAgICAgICBQYXJzZXJFbGVtZW50Lmlnbm9yZShzZWxmLCBvdGhlcikNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHN1cGVyKCBDb21iaW5lLCBzZWxmKS5pZ25vcmUoIG90aGVyICkNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBwb3N0UGFyc2UoIHNlbGYsIGluc3RyaW5nLCBsb2MsIHRva2VubGlzdCApOg0KICAgICAgICByZXRUb2tzID0gdG9rZW5saXN0LmNvcHkoKQ0KICAgICAgICBkZWwgcmV0VG9rc1s6XQ0KICAgICAgICByZXRUb2tzICs9IFBhcnNlUmVzdWx0cyhbICIiLmpvaW4odG9rZW5saXN0Ll9hc1N0cmluZ0xpc3Qoc2VsZi5qb2luU3RyaW5nKSkgXSwgbW9kYWw9c2VsZi5tb2RhbFJlc3VsdHMpDQoNCiAgICAgICAgaWYgc2VsZi5yZXN1bHRzTmFtZSBhbmQgcmV0VG9rcy5oYXNrZXlzKCk6DQogICAgICAgICAgICByZXR1cm4gWyByZXRUb2tzIF0NCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJldHVybiByZXRUb2tzDQoNCmNsYXNzIEdyb3VwKFRva2VuQ29udmVydGVyKToNCiAgICAiIiINCiAgICBDb252ZXJ0ZXIgdG8gcmV0dXJuIHRoZSBtYXRjaGVkIHRva2VucyBhcyBhIGxpc3QgLSB1c2VmdWwgZm9yIHJldHVybmluZyB0b2tlbnMgb2YgQ3tMe1plcm9Pck1vcmV9fSBhbmQgQ3tMe09uZU9yTW9yZX19IGV4cHJlc3Npb25zLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIGlkZW50ID0gV29yZChhbHBoYXMpDQogICAgICAgIG51bSA9IFdvcmQobnVtcykNCiAgICAgICAgdGVybSA9IGlkZW50IHwgbnVtDQogICAgICAgIGZ1bmMgPSBpZGVudCArIE9wdGlvbmFsKGRlbGltaXRlZExpc3QodGVybSkpDQogICAgICAgIHByaW50KGZ1bmMucGFyc2VTdHJpbmcoImZuIGEsYiwxMDAiKSkgICMgLT4gWydmbicsICdhJywgJ2InLCAnMTAwJ10NCg0KICAgICAgICBmdW5jID0gaWRlbnQgKyBHcm91cChPcHRpb25hbChkZWxpbWl0ZWRMaXN0KHRlcm0pKSkNCiAgICAgICAgcHJpbnQoZnVuYy5wYXJzZVN0cmluZygiZm4gYSxiLDEwMCIpKSAgIyAtPiBbJ2ZuJywgWydhJywgJ2InLCAnMTAwJ11dDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHByICk6DQogICAgICAgIHN1cGVyKEdyb3VwLHNlbGYpLl9faW5pdF9fKCBleHByICkNCiAgICAgICAgc2VsZi5zYXZlQXNMaXN0ID0gVHJ1ZQ0KDQogICAgZGVmIHBvc3RQYXJzZSggc2VsZiwgaW5zdHJpbmcsIGxvYywgdG9rZW5saXN0ICk6DQogICAgICAgIHJldHVybiBbIHRva2VubGlzdCBdDQoNCmNsYXNzIERpY3QoVG9rZW5Db252ZXJ0ZXIpOg0KICAgICIiIg0KICAgIENvbnZlcnRlciB0byByZXR1cm4gYSByZXBldGl0aXZlIGV4cHJlc3Npb24gYXMgYSBsaXN0LCBidXQgYWxzbyBhcyBhIGRpY3Rpb25hcnkuDQogICAgRWFjaCBlbGVtZW50IGNhbiBhbHNvIGJlIHJlZmVyZW5jZWQgdXNpbmcgdGhlIGZpcnN0IHRva2VuIGluIHRoZSBleHByZXNzaW9uIGFzIGl0cyBrZXkuDQogICAgVXNlZnVsIGZvciB0YWJ1bGFyIHJlcG9ydCBzY3JhcGluZyB3aGVuIHRoZSBmaXJzdCBjb2x1bW4gY2FuIGJlIHVzZWQgYXMgYSBpdGVtIGtleS4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBkYXRhX3dvcmQgPSBXb3JkKGFscGhhcykNCiAgICAgICAgbGFiZWwgPSBkYXRhX3dvcmQgKyBGb2xsb3dlZEJ5KCc6JykNCiAgICAgICAgYXR0cl9leHByID0gR3JvdXAobGFiZWwgKyBTdXBwcmVzcygnOicpICsgT25lT3JNb3JlKGRhdGFfd29yZCkuc2V0UGFyc2VBY3Rpb24oJyAnLmpvaW4pKQ0KDQogICAgICAgIHRleHQgPSAic2hhcGU6IFNRVUFSRSBwb3NuOiB1cHBlciBsZWZ0IGNvbG9yOiBsaWdodCBibHVlIHRleHR1cmU6IGJ1cmxhcCINCiAgICAgICAgYXR0cl9leHByID0gKGxhYmVsICsgU3VwcHJlc3MoJzonKSArIE9uZU9yTW9yZShkYXRhX3dvcmQsIHN0b3BPbj1sYWJlbCkuc2V0UGFyc2VBY3Rpb24oJyAnLmpvaW4pKQ0KICAgICAgICANCiAgICAgICAgIyBwcmludCBhdHRyaWJ1dGVzIGFzIHBsYWluIGdyb3Vwcw0KICAgICAgICBwcmludChPbmVPck1vcmUoYXR0cl9leHByKS5wYXJzZVN0cmluZyh0ZXh0KS5kdW1wKCkpDQogICAgICAgIA0KICAgICAgICAjIGluc3RlYWQgb2YgT25lT3JNb3JlKGV4cHIpLCBwYXJzZSB1c2luZyBEaWN0KE9uZU9yTW9yZShHcm91cChleHByKSkpIC0gRGljdCB3aWxsIGF1dG8tYXNzaWduIG5hbWVzDQogICAgICAgIHJlc3VsdCA9IERpY3QoT25lT3JNb3JlKEdyb3VwKGF0dHJfZXhwcikpKS5wYXJzZVN0cmluZyh0ZXh0KQ0KICAgICAgICBwcmludChyZXN1bHQuZHVtcCgpKQ0KICAgICAgICANCiAgICAgICAgIyBhY2Nlc3MgbmFtZWQgZmllbGRzIGFzIGRpY3QgZW50cmllcywgb3Igb3V0cHV0IGFzIGRpY3QNCiAgICAgICAgcHJpbnQocmVzdWx0WydzaGFwZSddKSAgICAgICAgDQogICAgICAgIHByaW50KHJlc3VsdC5hc0RpY3QoKSkNCiAgICBwcmludHM6Og0KICAgICAgICBbJ3NoYXBlJywgJ1NRVUFSRScsICdwb3NuJywgJ3VwcGVyIGxlZnQnLCAnY29sb3InLCAnbGlnaHQgYmx1ZScsICd0ZXh0dXJlJywgJ2J1cmxhcCddDQoNCiAgICAgICAgW1snc2hhcGUnLCAnU1FVQVJFJ10sIFsncG9zbicsICd1cHBlciBsZWZ0J10sIFsnY29sb3InLCAnbGlnaHQgYmx1ZSddLCBbJ3RleHR1cmUnLCAnYnVybGFwJ11dDQogICAgICAgIC0gY29sb3I6IGxpZ2h0IGJsdWUNCiAgICAgICAgLSBwb3NuOiB1cHBlciBsZWZ0DQogICAgICAgIC0gc2hhcGU6IFNRVUFSRQ0KICAgICAgICAtIHRleHR1cmU6IGJ1cmxhcA0KICAgICAgICBTUVVBUkUNCiAgICAgICAgeydjb2xvcic6ICdsaWdodCBibHVlJywgJ3Bvc24nOiAndXBwZXIgbGVmdCcsICd0ZXh0dXJlJzogJ2J1cmxhcCcsICdzaGFwZSc6ICdTUVVBUkUnfQ0KICAgIFNlZSBtb3JlIGV4YW1wbGVzIGF0IEx7UGFyc2VSZXN1bHRzfSBvZiBhY2Nlc3NpbmcgZmllbGRzIGJ5IHJlc3VsdHMgbmFtZS4NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHIgKToNCiAgICAgICAgc3VwZXIoRGljdCxzZWxmKS5fX2luaXRfXyggZXhwciApDQogICAgICAgIHNlbGYuc2F2ZUFzTGlzdCA9IFRydWUNCg0KICAgIGRlZiBwb3N0UGFyc2UoIHNlbGYsIGluc3RyaW5nLCBsb2MsIHRva2VubGlzdCApOg0KICAgICAgICBmb3IgaSx0b2sgaW4gZW51bWVyYXRlKHRva2VubGlzdCk6DQogICAgICAgICAgICBpZiBsZW4odG9rKSA9PSAwOg0KICAgICAgICAgICAgICAgIGNvbnRpbnVlDQogICAgICAgICAgICBpa2V5ID0gdG9rWzBdDQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGlrZXksaW50KToNCiAgICAgICAgICAgICAgICBpa2V5ID0gX3VzdHIodG9rWzBdKS5zdHJpcCgpDQogICAgICAgICAgICBpZiBsZW4odG9rKT09MToNCiAgICAgICAgICAgICAgICB0b2tlbmxpc3RbaWtleV0gPSBfUGFyc2VSZXN1bHRzV2l0aE9mZnNldCgiIixpKQ0KICAgICAgICAgICAgZWxpZiBsZW4odG9rKT09MiBhbmQgbm90IGlzaW5zdGFuY2UodG9rWzFdLFBhcnNlUmVzdWx0cyk6DQogICAgICAgICAgICAgICAgdG9rZW5saXN0W2lrZXldID0gX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQodG9rWzFdLGkpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIGRpY3R2YWx1ZSA9IHRvay5jb3B5KCkgI1BhcnNlUmVzdWx0cyhpKQ0KICAgICAgICAgICAgICAgIGRlbCBkaWN0dmFsdWVbMF0NCiAgICAgICAgICAgICAgICBpZiBsZW4oZGljdHZhbHVlKSE9IDEgb3IgKGlzaW5zdGFuY2UoZGljdHZhbHVlLFBhcnNlUmVzdWx0cykgYW5kIGRpY3R2YWx1ZS5oYXNrZXlzKCkpOg0KICAgICAgICAgICAgICAgICAgICB0b2tlbmxpc3RbaWtleV0gPSBfUGFyc2VSZXN1bHRzV2l0aE9mZnNldChkaWN0dmFsdWUsaSkNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICB0b2tlbmxpc3RbaWtleV0gPSBfUGFyc2VSZXN1bHRzV2l0aE9mZnNldChkaWN0dmFsdWVbMF0saSkNCg0KICAgICAgICBpZiBzZWxmLnJlc3VsdHNOYW1lOg0KICAgICAgICAgICAgcmV0dXJuIFsgdG9rZW5saXN0IF0NCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJldHVybiB0b2tlbmxpc3QNCg0KDQpjbGFzcyBTdXBwcmVzcyhUb2tlbkNvbnZlcnRlcik6DQogICAgIiIiDQogICAgQ29udmVydGVyIGZvciBpZ25vcmluZyB0aGUgcmVzdWx0cyBvZiBhIHBhcnNlZCBleHByZXNzaW9uLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIHNvdXJjZSA9ICJhLCBiLCBjLGQiDQogICAgICAgIHdkID0gV29yZChhbHBoYXMpDQogICAgICAgIHdkX2xpc3QxID0gd2QgKyBaZXJvT3JNb3JlKCcsJyArIHdkKQ0KICAgICAgICBwcmludCh3ZF9saXN0MS5wYXJzZVN0cmluZyhzb3VyY2UpKQ0KDQogICAgICAgICMgb2Z0ZW4sIGRlbGltaXRlcnMgdGhhdCBhcmUgdXNlZnVsIGR1cmluZyBwYXJzaW5nIGFyZSBqdXN0IGluIHRoZQ0KICAgICAgICAjIHdheSBhZnRlcndhcmQgLSB1c2UgU3VwcHJlc3MgdG8ga2VlcCB0aGVtIG91dCBvZiB0aGUgcGFyc2VkIG91dHB1dA0KICAgICAgICB3ZF9saXN0MiA9IHdkICsgWmVyb09yTW9yZShTdXBwcmVzcygnLCcpICsgd2QpDQogICAgICAgIHByaW50KHdkX2xpc3QyLnBhcnNlU3RyaW5nKHNvdXJjZSkpDQogICAgcHJpbnRzOjoNCiAgICAgICAgWydhJywgJywnLCAnYicsICcsJywgJ2MnLCAnLCcsICdkJ10NCiAgICAgICAgWydhJywgJ2InLCAnYycsICdkJ10NCiAgICAoU2VlIGFsc28gTHtkZWxpbWl0ZWRMaXN0fS4pDQogICAgIiIiDQogICAgZGVmIHBvc3RQYXJzZSggc2VsZiwgaW5zdHJpbmcsIGxvYywgdG9rZW5saXN0ICk6DQogICAgICAgIHJldHVybiBbXQ0KDQogICAgZGVmIHN1cHByZXNzKCBzZWxmICk6DQogICAgICAgIHJldHVybiBzZWxmDQoNCg0KY2xhc3MgT25seU9uY2Uob2JqZWN0KToNCiAgICAiIiINCiAgICBXcmFwcGVyIGZvciBwYXJzZSBhY3Rpb25zLCB0byBlbnN1cmUgdGhleSBhcmUgb25seSBjYWxsZWQgb25jZS4NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oc2VsZiwgbWV0aG9kQ2FsbCk6DQogICAgICAgIHNlbGYuY2FsbGFibGUgPSBfdHJpbV9hcml0eShtZXRob2RDYWxsKQ0KICAgICAgICBzZWxmLmNhbGxlZCA9IEZhbHNlDQogICAgZGVmIF9fY2FsbF9fKHNlbGYscyxsLHQpOg0KICAgICAgICBpZiBub3Qgc2VsZi5jYWxsZWQ6DQogICAgICAgICAgICByZXN1bHRzID0gc2VsZi5jYWxsYWJsZShzLGwsdCkNCiAgICAgICAgICAgIHNlbGYuY2FsbGVkID0gVHJ1ZQ0KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHMNCiAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24ocyxsLCIiKQ0KICAgIGRlZiByZXNldChzZWxmKToNCiAgICAgICAgc2VsZi5jYWxsZWQgPSBGYWxzZQ0KDQpkZWYgdHJhY2VQYXJzZUFjdGlvbihmKToNCiAgICAiIiINCiAgICBEZWNvcmF0b3IgZm9yIGRlYnVnZ2luZyBwYXJzZSBhY3Rpb25zLiANCiAgICANCiAgICBXaGVuIHRoZSBwYXJzZSBhY3Rpb24gaXMgY2FsbGVkLCB0aGlzIGRlY29yYXRvciB3aWxsIHByaW50IEN7Ij4+IGVudGVyaW5nIEl7bWV0aG9kLW5hbWV9KGxpbmU6SXtjdXJyZW50X3NvdXJjZV9saW5lfSwgSXtwYXJzZV9sb2NhdGlvbn0sIEl7bWF0Y2hlZF90b2tlbnN9KSIufQ0KICAgIFdoZW4gdGhlIHBhcnNlIGFjdGlvbiBjb21wbGV0ZXMsIHRoZSBkZWNvcmF0b3Igd2lsbCBwcmludCBDeyI8PCJ9IGZvbGxvd2VkIGJ5IHRoZSByZXR1cm5lZCB2YWx1ZSwgb3IgYW55IGV4Y2VwdGlvbiB0aGF0IHRoZSBwYXJzZSBhY3Rpb24gcmFpc2VkLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIHdkID0gV29yZChhbHBoYXMpDQoNCiAgICAgICAgQHRyYWNlUGFyc2VBY3Rpb24NCiAgICAgICAgZGVmIHJlbW92ZV9kdXBsaWNhdGVfY2hhcnModG9rZW5zKToNCiAgICAgICAgICAgIHJldHVybiAnJy5qb2luKHNvcnRlZChzZXQoJycuam9pbih0b2tlbnMpKSkpDQoNCiAgICAgICAgd2RzID0gT25lT3JNb3JlKHdkKS5zZXRQYXJzZUFjdGlvbihyZW1vdmVfZHVwbGljYXRlX2NoYXJzKQ0KICAgICAgICBwcmludCh3ZHMucGFyc2VTdHJpbmcoInNsa2RqcyBzbGQgc2xkZCBzZGxmIHNkbGpmIikpDQogICAgcHJpbnRzOjoNCiAgICAgICAgPj5lbnRlcmluZyByZW1vdmVfZHVwbGljYXRlX2NoYXJzKGxpbmU6ICdzbGtkanMgc2xkIHNsZGQgc2RsZiBzZGxqZicsIDAsIChbJ3Nsa2RqcycsICdzbGQnLCAnc2xkZCcsICdzZGxmJywgJ3NkbGpmJ10sIHt9KSkNCiAgICAgICAgPDxsZWF2aW5nIHJlbW92ZV9kdXBsaWNhdGVfY2hhcnMgKHJldDogJ2RmamtscycpDQogICAgICAgIFsnZGZqa2xzJ10NCiAgICAiIiINCiAgICBmID0gX3RyaW1fYXJpdHkoZikNCiAgICBkZWYgeigqcGFBcmdzKToNCiAgICAgICAgdGhpc0Z1bmMgPSBmLl9fbmFtZV9fDQogICAgICAgIHMsbCx0ID0gcGFBcmdzWy0zOl0NCiAgICAgICAgaWYgbGVuKHBhQXJncyk+MzoNCiAgICAgICAgICAgIHRoaXNGdW5jID0gcGFBcmdzWzBdLl9fY2xhc3NfXy5fX25hbWVfXyArICcuJyArIHRoaXNGdW5jDQogICAgICAgIHN5cy5zdGRlcnIud3JpdGUoICI+PmVudGVyaW5nICVzKGxpbmU6ICclcycsICVkLCAlcilcbiIgJSAodGhpc0Z1bmMsbGluZShsLHMpLGwsdCkgKQ0KICAgICAgICB0cnk6DQogICAgICAgICAgICByZXQgPSBmKCpwYUFyZ3MpDQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXhjOg0KICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSggIjw8bGVhdmluZyAlcyAoZXhjZXB0aW9uOiAlcylcbiIgJSAodGhpc0Z1bmMsZXhjKSApDQogICAgICAgICAgICByYWlzZQ0KICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCAiPDxsZWF2aW5nICVzIChyZXQ6ICVyKVxuIiAlICh0aGlzRnVuYyxyZXQpICkNCiAgICAgICAgcmV0dXJuIHJldA0KICAgIHRyeToNCiAgICAgICAgei5fX25hbWVfXyA9IGYuX19uYW1lX18NCiAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6DQogICAgICAgIHBhc3MNCiAgICByZXR1cm4geg0KDQojDQojIGdsb2JhbCBoZWxwZXJzDQojDQpkZWYgZGVsaW1pdGVkTGlzdCggZXhwciwgZGVsaW09IiwiLCBjb21iaW5lPUZhbHNlICk6DQogICAgIiIiDQogICAgSGVscGVyIHRvIGRlZmluZSBhIGRlbGltaXRlZCBsaXN0IG9mIGV4cHJlc3Npb25zIC0gdGhlIGRlbGltaXRlciBkZWZhdWx0cyB0byAnLCcuDQogICAgQnkgZGVmYXVsdCwgdGhlIGxpc3QgZWxlbWVudHMgYW5kIGRlbGltaXRlcnMgY2FuIGhhdmUgaW50ZXJ2ZW5pbmcgd2hpdGVzcGFjZSwgYW5kDQogICAgY29tbWVudHMsIGJ1dCB0aGlzIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHBhc3NpbmcgQ3tjb21iaW5lPVRydWV9IGluIHRoZSBjb25zdHJ1Y3Rvci4NCiAgICBJZiBDe2NvbWJpbmV9IGlzIHNldCB0byBDe1RydWV9LCB0aGUgbWF0Y2hpbmcgdG9rZW5zIGFyZSByZXR1cm5lZCBhcyBhIHNpbmdsZSB0b2tlbg0KICAgIHN0cmluZywgd2l0aCB0aGUgZGVsaW1pdGVycyBpbmNsdWRlZDsgb3RoZXJ3aXNlLCB0aGUgbWF0Y2hpbmcgdG9rZW5zIGFyZSByZXR1cm5lZA0KICAgIGFzIGEgbGlzdCBvZiB0b2tlbnMsIHdpdGggdGhlIGRlbGltaXRlcnMgc3VwcHJlc3NlZC4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBkZWxpbWl0ZWRMaXN0KFdvcmQoYWxwaGFzKSkucGFyc2VTdHJpbmcoImFhLGJiLGNjIikgIyAtPiBbJ2FhJywgJ2JiJywgJ2NjJ10NCiAgICAgICAgZGVsaW1pdGVkTGlzdChXb3JkKGhleG51bXMpLCBkZWxpbT0nOicsIGNvbWJpbmU9VHJ1ZSkucGFyc2VTdHJpbmcoIkFBOkJCOkNDOkREOkVFIikgIyAtPiBbJ0FBOkJCOkNDOkREOkVFJ10NCiAgICAiIiINCiAgICBkbE5hbWUgPSBfdXN0cihleHByKSsiIFsiK191c3RyKGRlbGltKSsiICIrX3VzdHIoZXhwcikrIl0uLi4iDQogICAgaWYgY29tYmluZToNCiAgICAgICAgcmV0dXJuIENvbWJpbmUoIGV4cHIgKyBaZXJvT3JNb3JlKCBkZWxpbSArIGV4cHIgKSApLnNldE5hbWUoZGxOYW1lKQ0KICAgIGVsc2U6DQogICAgICAgIHJldHVybiAoIGV4cHIgKyBaZXJvT3JNb3JlKCBTdXBwcmVzcyggZGVsaW0gKSArIGV4cHIgKSApLnNldE5hbWUoZGxOYW1lKQ0KDQpkZWYgY291bnRlZEFycmF5KCBleHByLCBpbnRFeHByPU5vbmUgKToNCiAgICAiIiINCiAgICBIZWxwZXIgdG8gZGVmaW5lIGEgY291bnRlZCBsaXN0IG9mIGV4cHJlc3Npb25zLg0KICAgIFRoaXMgaGVscGVyIGRlZmluZXMgYSBwYXR0ZXJuIG9mIHRoZSBmb3JtOjoNCiAgICAgICAgaW50ZWdlciBleHByIGV4cHIgZXhwci4uLg0KICAgIHdoZXJlIHRoZSBsZWFkaW5nIGludGVnZXIgdGVsbHMgaG93IG1hbnkgZXhwciBleHByZXNzaW9ucyBmb2xsb3cuDQogICAgVGhlIG1hdGNoZWQgdG9rZW5zIHJldHVybnMgdGhlIGFycmF5IG9mIGV4cHIgdG9rZW5zIGFzIGEgbGlzdCAtIHRoZSBsZWFkaW5nIGNvdW50IHRva2VuIGlzIHN1cHByZXNzZWQuDQogICAgDQogICAgSWYgQ3tpbnRFeHByfSBpcyBzcGVjaWZpZWQsIGl0IHNob3VsZCBiZSBhIHB5cGFyc2luZyBleHByZXNzaW9uIHRoYXQgcHJvZHVjZXMgYW4gaW50ZWdlciB2YWx1ZS4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBjb3VudGVkQXJyYXkoV29yZChhbHBoYXMpKS5wYXJzZVN0cmluZygnMiBhYiBjZCBlZicpICAjIC0+IFsnYWInLCAnY2QnXQ0KDQogICAgICAgICMgaW4gdGhpcyBwYXJzZXIsIHRoZSBsZWFkaW5nIGludGVnZXIgdmFsdWUgaXMgZ2l2ZW4gaW4gYmluYXJ5LA0KICAgICAgICAjICcxMCcgaW5kaWNhdGluZyB0aGF0IDIgdmFsdWVzIGFyZSBpbiB0aGUgYXJyYXkNCiAgICAgICAgYmluYXJ5Q29uc3RhbnQgPSBXb3JkKCcwMScpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0OiBpbnQodFswXSwgMikpDQogICAgICAgIGNvdW50ZWRBcnJheShXb3JkKGFscGhhcyksIGludEV4cHI9YmluYXJ5Q29uc3RhbnQpLnBhcnNlU3RyaW5nKCcxMCBhYiBjZCBlZicpICAjIC0+IFsnYWInLCAnY2QnXQ0KICAgICIiIg0KICAgIGFycmF5RXhwciA9IEZvcndhcmQoKQ0KICAgIGRlZiBjb3VudEZpZWxkUGFyc2VBY3Rpb24ocyxsLHQpOg0KICAgICAgICBuID0gdFswXQ0KICAgICAgICBhcnJheUV4cHIgPDwgKG4gYW5kIEdyb3VwKEFuZChbZXhwcl0qbikpIG9yIEdyb3VwKGVtcHR5KSkNCiAgICAgICAgcmV0dXJuIFtdDQogICAgaWYgaW50RXhwciBpcyBOb25lOg0KICAgICAgICBpbnRFeHByID0gV29yZChudW1zKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdDppbnQodFswXSkpDQogICAgZWxzZToNCiAgICAgICAgaW50RXhwciA9IGludEV4cHIuY29weSgpDQogICAgaW50RXhwci5zZXROYW1lKCJhcnJheUxlbiIpDQogICAgaW50RXhwci5hZGRQYXJzZUFjdGlvbihjb3VudEZpZWxkUGFyc2VBY3Rpb24sIGNhbGxEdXJpbmdUcnk9VHJ1ZSkNCiAgICByZXR1cm4gKCBpbnRFeHByICsgYXJyYXlFeHByICkuc2V0TmFtZSgnKGxlbikgJyArIF91c3RyKGV4cHIpICsgJy4uLicpDQoNCmRlZiBfZmxhdHRlbihMKToNCiAgICByZXQgPSBbXQ0KICAgIGZvciBpIGluIEw6DQogICAgICAgIGlmIGlzaW5zdGFuY2UoaSxsaXN0KToNCiAgICAgICAgICAgIHJldC5leHRlbmQoX2ZsYXR0ZW4oaSkpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByZXQuYXBwZW5kKGkpDQogICAgcmV0dXJuIHJldA0KDQpkZWYgbWF0Y2hQcmV2aW91c0xpdGVyYWwoZXhwcik6DQogICAgIiIiDQogICAgSGVscGVyIHRvIGRlZmluZSBhbiBleHByZXNzaW9uIHRoYXQgaXMgaW5kaXJlY3RseSBkZWZpbmVkIGZyb20NCiAgICB0aGUgdG9rZW5zIG1hdGNoZWQgaW4gYSBwcmV2aW91cyBleHByZXNzaW9uLCB0aGF0IGlzLCBpdCBsb29rcw0KICAgIGZvciBhICdyZXBlYXQnIG9mIGEgcHJldmlvdXMgZXhwcmVzc2lvbi4gIEZvciBleGFtcGxlOjoNCiAgICAgICAgZmlyc3QgPSBXb3JkKG51bXMpDQogICAgICAgIHNlY29uZCA9IG1hdGNoUHJldmlvdXNMaXRlcmFsKGZpcnN0KQ0KICAgICAgICBtYXRjaEV4cHIgPSBmaXJzdCArICI6IiArIHNlY29uZA0KICAgIHdpbGwgbWF0Y2ggQ3siMToxIn0sIGJ1dCBub3QgQ3siMToyIn0uICBCZWNhdXNlIHRoaXMgbWF0Y2hlcyBhDQogICAgcHJldmlvdXMgbGl0ZXJhbCwgd2lsbCBhbHNvIG1hdGNoIHRoZSBsZWFkaW5nIEN7IjE6MSJ9IGluIEN7IjE6MTAifS4NCiAgICBJZiB0aGlzIGlzIG5vdCBkZXNpcmVkLCB1c2UgQ3ttYXRjaFByZXZpb3VzRXhwcn0uDQogICAgRG8gSXtub3R9IHVzZSB3aXRoIHBhY2tyYXQgcGFyc2luZyBlbmFibGVkLg0KICAgICIiIg0KICAgIHJlcCA9IEZvcndhcmQoKQ0KICAgIGRlZiBjb3B5VG9rZW5Ub1JlcGVhdGVyKHMsbCx0KToNCiAgICAgICAgaWYgdDoNCiAgICAgICAgICAgIGlmIGxlbih0KSA9PSAxOg0KICAgICAgICAgICAgICAgIHJlcCA8PCB0WzBdDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICMgZmxhdHRlbiB0IHRva2Vucw0KICAgICAgICAgICAgICAgIHRmbGF0ID0gX2ZsYXR0ZW4odC5hc0xpc3QoKSkNCiAgICAgICAgICAgICAgICByZXAgPDwgQW5kKExpdGVyYWwodHQpIGZvciB0dCBpbiB0ZmxhdCkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJlcCA8PCBFbXB0eSgpDQogICAgZXhwci5hZGRQYXJzZUFjdGlvbihjb3B5VG9rZW5Ub1JlcGVhdGVyLCBjYWxsRHVyaW5nVHJ5PVRydWUpDQogICAgcmVwLnNldE5hbWUoJyhwcmV2KSAnICsgX3VzdHIoZXhwcikpDQogICAgcmV0dXJuIHJlcA0KDQpkZWYgbWF0Y2hQcmV2aW91c0V4cHIoZXhwcik6DQogICAgIiIiDQogICAgSGVscGVyIHRvIGRlZmluZSBhbiBleHByZXNzaW9uIHRoYXQgaXMgaW5kaXJlY3RseSBkZWZpbmVkIGZyb20NCiAgICB0aGUgdG9rZW5zIG1hdGNoZWQgaW4gYSBwcmV2aW91cyBleHByZXNzaW9uLCB0aGF0IGlzLCBpdCBsb29rcw0KICAgIGZvciBhICdyZXBlYXQnIG9mIGEgcHJldmlvdXMgZXhwcmVzc2lvbi4gIEZvciBleGFtcGxlOjoNCiAgICAgICAgZmlyc3QgPSBXb3JkKG51bXMpDQogICAgICAgIHNlY29uZCA9IG1hdGNoUHJldmlvdXNFeHByKGZpcnN0KQ0KICAgICAgICBtYXRjaEV4cHIgPSBmaXJzdCArICI6IiArIHNlY29uZA0KICAgIHdpbGwgbWF0Y2ggQ3siMToxIn0sIGJ1dCBub3QgQ3siMToyIn0uICBCZWNhdXNlIHRoaXMgbWF0Y2hlcyBieQ0KICAgIGV4cHJlc3Npb25zLCB3aWxsIEl7bm90fSBtYXRjaCB0aGUgbGVhZGluZyBDeyIxOjEifSBpbiBDeyIxOjEwIn07DQogICAgdGhlIGV4cHJlc3Npb25zIGFyZSBldmFsdWF0ZWQgZmlyc3QsIGFuZCB0aGVuIGNvbXBhcmVkLCBzbw0KICAgIEN7IjEifSBpcyBjb21wYXJlZCB3aXRoIEN7IjEwIn0uDQogICAgRG8gSXtub3R9IHVzZSB3aXRoIHBhY2tyYXQgcGFyc2luZyBlbmFibGVkLg0KICAgICIiIg0KICAgIHJlcCA9IEZvcndhcmQoKQ0KICAgIGUyID0gZXhwci5jb3B5KCkNCiAgICByZXAgPDw9IGUyDQogICAgZGVmIGNvcHlUb2tlblRvUmVwZWF0ZXIocyxsLHQpOg0KICAgICAgICBtYXRjaFRva2VucyA9IF9mbGF0dGVuKHQuYXNMaXN0KCkpDQogICAgICAgIGRlZiBtdXN0TWF0Y2hUaGVzZVRva2VucyhzLGwsdCk6DQogICAgICAgICAgICB0aGVzZVRva2VucyA9IF9mbGF0dGVuKHQuYXNMaXN0KCkpDQogICAgICAgICAgICBpZiAgdGhlc2VUb2tlbnMgIT0gbWF0Y2hUb2tlbnM6DQogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oIiIsMCwiIikNCiAgICAgICAgcmVwLnNldFBhcnNlQWN0aW9uKCBtdXN0TWF0Y2hUaGVzZVRva2VucywgY2FsbER1cmluZ1RyeT1UcnVlICkNCiAgICBleHByLmFkZFBhcnNlQWN0aW9uKGNvcHlUb2tlblRvUmVwZWF0ZXIsIGNhbGxEdXJpbmdUcnk9VHJ1ZSkNCiAgICByZXAuc2V0TmFtZSgnKHByZXYpICcgKyBfdXN0cihleHByKSkNCiAgICByZXR1cm4gcmVwDQoNCmRlZiBfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKHMpOg0KICAgICN+ICBlc2NhcGUgdGhlc2UgY2hhcnM6IF4tXQ0KICAgIGZvciBjIGluIHIiXF4tXSI6DQogICAgICAgIHMgPSBzLnJlcGxhY2UoYyxfYnNsYXNoK2MpDQogICAgcyA9IHMucmVwbGFjZSgiXG4iLHIiXG4iKQ0KICAgIHMgPSBzLnJlcGxhY2UoIlx0IixyIlx0IikNCiAgICByZXR1cm4gX3VzdHIocykNCg0KZGVmIG9uZU9mKCBzdHJzLCBjYXNlbGVzcz1GYWxzZSwgdXNlUmVnZXg9VHJ1ZSApOg0KICAgICIiIg0KICAgIEhlbHBlciB0byBxdWlja2x5IGRlZmluZSBhIHNldCBvZiBhbHRlcm5hdGl2ZSBMaXRlcmFscywgYW5kIG1ha2VzIHN1cmUgdG8gZG8NCiAgICBsb25nZXN0LWZpcnN0IHRlc3Rpbmcgd2hlbiB0aGVyZSBpcyBhIGNvbmZsaWN0LCByZWdhcmRsZXNzIG9mIHRoZSBpbnB1dCBvcmRlciwNCiAgICBidXQgcmV0dXJucyBhIEN7THtNYXRjaEZpcnN0fX0gZm9yIGJlc3QgcGVyZm9ybWFuY2UuDQoNCiAgICBQYXJhbWV0ZXJzOg0KICAgICAtIHN0cnMgLSBhIHN0cmluZyBvZiBzcGFjZS1kZWxpbWl0ZWQgbGl0ZXJhbHMsIG9yIGEgY29sbGVjdGlvbiBvZiBzdHJpbmcgbGl0ZXJhbHMNCiAgICAgLSBjYXNlbGVzcyAtIChkZWZhdWx0PUN7RmFsc2V9KSAtIHRyZWF0IGFsbCBsaXRlcmFscyBhcyBjYXNlbGVzcw0KICAgICAtIHVzZVJlZ2V4IC0gKGRlZmF1bHQ9Q3tUcnVlfSkgLSBhcyBhbiBvcHRpbWl6YXRpb24sIHdpbGwgZ2VuZXJhdGUgYSBSZWdleA0KICAgICAgICAgIG9iamVjdDsgb3RoZXJ3aXNlLCB3aWxsIGdlbmVyYXRlIGEgQ3tNYXRjaEZpcnN0fSBvYmplY3QgKGlmIEN7Y2FzZWxlc3M9VHJ1ZX0sIG9yDQogICAgICAgICAgaWYgY3JlYXRpbmcgYSBDe1JlZ2V4fSByYWlzZXMgYW4gZXhjZXB0aW9uKQ0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIGNvbXBfb3BlciA9IG9uZU9mKCI8ID0gPiA8PSA+PSAhPSIpDQogICAgICAgIHZhciA9IFdvcmQoYWxwaGFzKQ0KICAgICAgICBudW1iZXIgPSBXb3JkKG51bXMpDQogICAgICAgIHRlcm0gPSB2YXIgfCBudW1iZXINCiAgICAgICAgY29tcGFyaXNvbl9leHByID0gdGVybSArIGNvbXBfb3BlciArIHRlcm0NCiAgICAgICAgcHJpbnQoY29tcGFyaXNvbl9leHByLnNlYXJjaFN0cmluZygiQiA9IDEyICBBQT0yMyBCPD1BQSBBQT4xMiIpKQ0KICAgIHByaW50czo6DQogICAgICAgIFtbJ0InLCAnPScsICcxMiddLCBbJ0FBJywgJz0nLCAnMjMnXSwgWydCJywgJzw9JywgJ0FBJ10sIFsnQUEnLCAnPicsICcxMiddXQ0KICAgICIiIg0KICAgIGlmIGNhc2VsZXNzOg0KICAgICAgICBpc2VxdWFsID0gKCBsYW1iZGEgYSxiOiBhLnVwcGVyKCkgPT0gYi51cHBlcigpICkNCiAgICAgICAgbWFza3MgPSAoIGxhbWJkYSBhLGI6IGIudXBwZXIoKS5zdGFydHN3aXRoKGEudXBwZXIoKSkgKQ0KICAgICAgICBwYXJzZUVsZW1lbnRDbGFzcyA9IENhc2VsZXNzTGl0ZXJhbA0KICAgIGVsc2U6DQogICAgICAgIGlzZXF1YWwgPSAoIGxhbWJkYSBhLGI6IGEgPT0gYiApDQogICAgICAgIG1hc2tzID0gKCBsYW1iZGEgYSxiOiBiLnN0YXJ0c3dpdGgoYSkgKQ0KICAgICAgICBwYXJzZUVsZW1lbnRDbGFzcyA9IExpdGVyYWwNCg0KICAgIHN5bWJvbHMgPSBbXQ0KICAgIGlmIGlzaW5zdGFuY2Uoc3RycyxiYXNlc3RyaW5nKToNCiAgICAgICAgc3ltYm9scyA9IHN0cnMuc3BsaXQoKQ0KICAgIGVsaWYgaXNpbnN0YW5jZShzdHJzLCBJdGVyYWJsZSk6DQogICAgICAgIHN5bWJvbHMgPSBsaXN0KHN0cnMpDQogICAgZWxzZToNCiAgICAgICAgd2FybmluZ3Mud2FybigiSW52YWxpZCBhcmd1bWVudCB0byBvbmVPZiwgZXhwZWN0ZWQgc3RyaW5nIG9yIGl0ZXJhYmxlIiwNCiAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQogICAgaWYgbm90IHN5bWJvbHM6DQogICAgICAgIHJldHVybiBOb01hdGNoKCkNCg0KICAgIGkgPSAwDQogICAgd2hpbGUgaSA8IGxlbihzeW1ib2xzKS0xOg0KICAgICAgICBjdXIgPSBzeW1ib2xzW2ldDQogICAgICAgIGZvciBqLG90aGVyIGluIGVudW1lcmF0ZShzeW1ib2xzW2krMTpdKToNCiAgICAgICAgICAgIGlmICggaXNlcXVhbChvdGhlciwgY3VyKSApOg0KICAgICAgICAgICAgICAgIGRlbCBzeW1ib2xzW2kraisxXQ0KICAgICAgICAgICAgICAgIGJyZWFrDQogICAgICAgICAgICBlbGlmICggbWFza3MoY3VyLCBvdGhlcikgKToNCiAgICAgICAgICAgICAgICBkZWwgc3ltYm9sc1tpK2orMV0NCiAgICAgICAgICAgICAgICBzeW1ib2xzLmluc2VydChpLG90aGVyKQ0KICAgICAgICAgICAgICAgIGN1ciA9IG90aGVyDQogICAgICAgICAgICAgICAgYnJlYWsNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIGkgKz0gMQ0KDQogICAgaWYgbm90IGNhc2VsZXNzIGFuZCB1c2VSZWdleDoNCiAgICAgICAgI34gcHJpbnQgKHN0cnMsIi0+IiwgInwiLmpvaW4oIFsgX2VzY2FwZVJlZ2V4Q2hhcnMoc3ltKSBmb3Igc3ltIGluIHN5bWJvbHNdICkpDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIGlmIGxlbihzeW1ib2xzKT09bGVuKCIiLmpvaW4oc3ltYm9scykpOg0KICAgICAgICAgICAgICAgIHJldHVybiBSZWdleCggIlslc10iICUgIiIuam9pbihfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKHN5bSkgZm9yIHN5bSBpbiBzeW1ib2xzKSApLnNldE5hbWUoJyB8ICcuam9pbihzeW1ib2xzKSkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcmV0dXJuIFJlZ2V4KCAifCIuam9pbihyZS5lc2NhcGUoc3ltKSBmb3Igc3ltIGluIHN5bWJvbHMpICkuc2V0TmFtZSgnIHwgJy5qb2luKHN5bWJvbHMpKQ0KICAgICAgICBleGNlcHQgRXhjZXB0aW9uOg0KICAgICAgICAgICAgd2FybmluZ3Mud2FybigiRXhjZXB0aW9uIGNyZWF0aW5nIFJlZ2V4IGZvciBvbmVPZiwgYnVpbGRpbmcgTWF0Y2hGaXJzdCIsDQogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCg0KDQogICAgIyBsYXN0IHJlc29ydCwganVzdCB1c2UgTWF0Y2hGaXJzdA0KICAgIHJldHVybiBNYXRjaEZpcnN0KHBhcnNlRWxlbWVudENsYXNzKHN5bSkgZm9yIHN5bSBpbiBzeW1ib2xzKS5zZXROYW1lKCcgfCAnLmpvaW4oc3ltYm9scykpDQoNCmRlZiBkaWN0T2YoIGtleSwgdmFsdWUgKToNCiAgICAiIiINCiAgICBIZWxwZXIgdG8gZWFzaWx5IGFuZCBjbGVhcmx5IGRlZmluZSBhIGRpY3Rpb25hcnkgYnkgc3BlY2lmeWluZyB0aGUgcmVzcGVjdGl2ZSBwYXR0ZXJucw0KICAgIGZvciB0aGUga2V5IGFuZCB2YWx1ZS4gIFRha2VzIGNhcmUgb2YgZGVmaW5pbmcgdGhlIEN7THtEaWN0fX0sIEN7THtaZXJvT3JNb3JlfX0sIGFuZCBDe0x7R3JvdXB9fSB0b2tlbnMNCiAgICBpbiB0aGUgcHJvcGVyIG9yZGVyLiAgVGhlIGtleSBwYXR0ZXJuIGNhbiBpbmNsdWRlIGRlbGltaXRpbmcgbWFya2VycyBvciBwdW5jdHVhdGlvbiwNCiAgICBhcyBsb25nIGFzIHRoZXkgYXJlIHN1cHByZXNzZWQsIHRoZXJlYnkgbGVhdmluZyB0aGUgc2lnbmlmaWNhbnQga2V5IHRleHQuICBUaGUgdmFsdWUNCiAgICBwYXR0ZXJuIGNhbiBpbmNsdWRlIG5hbWVkIHJlc3VsdHMsIHNvIHRoYXQgdGhlIEN7RGljdH0gcmVzdWx0cyBjYW4gaW5jbHVkZSBuYW1lZCB0b2tlbg0KICAgIGZpZWxkcy4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICB0ZXh0ID0gInNoYXBlOiBTUVVBUkUgcG9zbjogdXBwZXIgbGVmdCBjb2xvcjogbGlnaHQgYmx1ZSB0ZXh0dXJlOiBidXJsYXAiDQogICAgICAgIGF0dHJfZXhwciA9IChsYWJlbCArIFN1cHByZXNzKCc6JykgKyBPbmVPck1vcmUoZGF0YV93b3JkLCBzdG9wT249bGFiZWwpLnNldFBhcnNlQWN0aW9uKCcgJy5qb2luKSkNCiAgICAgICAgcHJpbnQoT25lT3JNb3JlKGF0dHJfZXhwcikucGFyc2VTdHJpbmcodGV4dCkuZHVtcCgpKQ0KICAgICAgICANCiAgICAgICAgYXR0cl9sYWJlbCA9IGxhYmVsDQogICAgICAgIGF0dHJfdmFsdWUgPSBTdXBwcmVzcygnOicpICsgT25lT3JNb3JlKGRhdGFfd29yZCwgc3RvcE9uPWxhYmVsKS5zZXRQYXJzZUFjdGlvbignICcuam9pbikNCg0KICAgICAgICAjIHNpbWlsYXIgdG8gRGljdCwgYnV0IHNpbXBsZXIgY2FsbCBmb3JtYXQNCiAgICAgICAgcmVzdWx0ID0gZGljdE9mKGF0dHJfbGFiZWwsIGF0dHJfdmFsdWUpLnBhcnNlU3RyaW5nKHRleHQpDQogICAgICAgIHByaW50KHJlc3VsdC5kdW1wKCkpDQogICAgICAgIHByaW50KHJlc3VsdFsnc2hhcGUnXSkNCiAgICAgICAgcHJpbnQocmVzdWx0LnNoYXBlKSAgIyBvYmplY3QgYXR0cmlidXRlIGFjY2VzcyB3b3JrcyB0b28NCiAgICAgICAgcHJpbnQocmVzdWx0LmFzRGljdCgpKQ0KICAgIHByaW50czo6DQogICAgICAgIFtbJ3NoYXBlJywgJ1NRVUFSRSddLCBbJ3Bvc24nLCAndXBwZXIgbGVmdCddLCBbJ2NvbG9yJywgJ2xpZ2h0IGJsdWUnXSwgWyd0ZXh0dXJlJywgJ2J1cmxhcCddXQ0KICAgICAgICAtIGNvbG9yOiBsaWdodCBibHVlDQogICAgICAgIC0gcG9zbjogdXBwZXIgbGVmdA0KICAgICAgICAtIHNoYXBlOiBTUVVBUkUNCiAgICAgICAgLSB0ZXh0dXJlOiBidXJsYXANCiAgICAgICAgU1FVQVJFDQogICAgICAgIFNRVUFSRQ0KICAgICAgICB7J2NvbG9yJzogJ2xpZ2h0IGJsdWUnLCAnc2hhcGUnOiAnU1FVQVJFJywgJ3Bvc24nOiAndXBwZXIgbGVmdCcsICd0ZXh0dXJlJzogJ2J1cmxhcCd9DQogICAgIiIiDQogICAgcmV0dXJuIERpY3QoIFplcm9Pck1vcmUoIEdyb3VwICgga2V5ICsgdmFsdWUgKSApICkNCg0KZGVmIG9yaWdpbmFsVGV4dEZvcihleHByLCBhc1N0cmluZz1UcnVlKToNCiAgICAiIiINCiAgICBIZWxwZXIgdG8gcmV0dXJuIHRoZSBvcmlnaW5hbCwgdW50b2tlbml6ZWQgdGV4dCBmb3IgYSBnaXZlbiBleHByZXNzaW9uLiAgVXNlZnVsIHRvDQogICAgcmVzdG9yZSB0aGUgcGFyc2VkIGZpZWxkcyBvZiBhbiBIVE1MIHN0YXJ0IHRhZyBpbnRvIHRoZSByYXcgdGFnIHRleHQgaXRzZWxmLCBvciB0bw0KICAgIHJldmVydCBzZXBhcmF0ZSB0b2tlbnMgd2l0aCBpbnRlcnZlbmluZyB3aGl0ZXNwYWNlIGJhY2sgdG8gdGhlIG9yaWdpbmFsIG1hdGNoaW5nDQogICAgaW5wdXQgdGV4dC4gQnkgZGVmYXVsdCwgcmV0dXJucyBhc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG9yaWdpbmFsIHBhcnNlZCB0ZXh0LiAgDQogICAgICAgDQogICAgSWYgdGhlIG9wdGlvbmFsIEN7YXNTdHJpbmd9IGFyZ3VtZW50IGlzIHBhc3NlZCBhcyBDe0ZhbHNlfSwgdGhlbiB0aGUgcmV0dXJuIHZhbHVlIGlzIGEgDQogICAgQ3tMe1BhcnNlUmVzdWx0c319IGNvbnRhaW5pbmcgYW55IHJlc3VsdHMgbmFtZXMgdGhhdCB3ZXJlIG9yaWdpbmFsbHkgbWF0Y2hlZCwgYW5kIGEgDQogICAgc2luZ2xlIHRva2VuIGNvbnRhaW5pbmcgdGhlIG9yaWdpbmFsIG1hdGNoZWQgdGV4dCBmcm9tIHRoZSBpbnB1dCBzdHJpbmcuICBTbyBpZiANCiAgICB0aGUgZXhwcmVzc2lvbiBwYXNzZWQgdG8gQ3tMe29yaWdpbmFsVGV4dEZvcn19IGNvbnRhaW5zIGV4cHJlc3Npb25zIHdpdGggZGVmaW5lZA0KICAgIHJlc3VsdHMgbmFtZXMsIHlvdSBtdXN0IHNldCBDe2FzU3RyaW5nfSB0byBDe0ZhbHNlfSBpZiB5b3Ugd2FudCB0byBwcmVzZXJ2ZSB0aG9zZQ0KICAgIHJlc3VsdHMgbmFtZSB2YWx1ZXMuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgc3JjID0gInRoaXMgaXMgdGVzdCA8Yj4gYm9sZCA8aT50ZXh0PC9pPiA8L2I+IG5vcm1hbCB0ZXh0ICINCiAgICAgICAgZm9yIHRhZyBpbiAoImIiLCJpIik6DQogICAgICAgICAgICBvcGVuZXIsY2xvc2VyID0gbWFrZUhUTUxUYWdzKHRhZykNCiAgICAgICAgICAgIHBhdHQgPSBvcmlnaW5hbFRleHRGb3Iob3BlbmVyICsgU2tpcFRvKGNsb3NlcikgKyBjbG9zZXIpDQogICAgICAgICAgICBwcmludChwYXR0LnNlYXJjaFN0cmluZyhzcmMpWzBdKQ0KICAgIHByaW50czo6DQogICAgICAgIFsnPGI+IGJvbGQgPGk+dGV4dDwvaT4gPC9iPiddDQogICAgICAgIFsnPGk+dGV4dDwvaT4nXQ0KICAgICIiIg0KICAgIGxvY01hcmtlciA9IEVtcHR5KCkuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsbG9jLHQ6IGxvYykNCiAgICBlbmRsb2NNYXJrZXIgPSBsb2NNYXJrZXIuY29weSgpDQogICAgZW5kbG9jTWFya2VyLmNhbGxQcmVwYXJzZSA9IEZhbHNlDQogICAgbWF0Y2hFeHByID0gbG9jTWFya2VyKCJfb3JpZ2luYWxfc3RhcnQiKSArIGV4cHIgKyBlbmRsb2NNYXJrZXIoIl9vcmlnaW5hbF9lbmQiKQ0KICAgIGlmIGFzU3RyaW5nOg0KICAgICAgICBleHRyYWN0VGV4dCA9IGxhbWJkYSBzLGwsdDogc1t0Ll9vcmlnaW5hbF9zdGFydDp0Ll9vcmlnaW5hbF9lbmRdDQogICAgZWxzZToNCiAgICAgICAgZGVmIGV4dHJhY3RUZXh0KHMsbCx0KToNCiAgICAgICAgICAgIHRbOl0gPSBbc1t0LnBvcCgnX29yaWdpbmFsX3N0YXJ0Jyk6dC5wb3AoJ19vcmlnaW5hbF9lbmQnKV1dDQogICAgbWF0Y2hFeHByLnNldFBhcnNlQWN0aW9uKGV4dHJhY3RUZXh0KQ0KICAgIG1hdGNoRXhwci5pZ25vcmVFeHBycyA9IGV4cHIuaWdub3JlRXhwcnMNCiAgICByZXR1cm4gbWF0Y2hFeHByDQoNCmRlZiB1bmdyb3VwKGV4cHIpOiANCiAgICAiIiINCiAgICBIZWxwZXIgdG8gdW5kbyBweXBhcnNpbmcncyBkZWZhdWx0IGdyb3VwaW5nIG9mIEFuZCBleHByZXNzaW9ucywgZXZlbg0KICAgIGlmIGFsbCBidXQgb25lIGFyZSBub24tZW1wdHkuDQogICAgIiIiDQogICAgcmV0dXJuIFRva2VuQ29udmVydGVyKGV4cHIpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0OnRbMF0pDQoNCmRlZiBsb2NhdGVkRXhwcihleHByKToNCiAgICAiIiINCiAgICBIZWxwZXIgdG8gZGVjb3JhdGUgYSByZXR1cm5lZCB0b2tlbiB3aXRoIGl0cyBzdGFydGluZyBhbmQgZW5kaW5nIGxvY2F0aW9ucyBpbiB0aGUgaW5wdXQgc3RyaW5nLg0KICAgIFRoaXMgaGVscGVyIGFkZHMgdGhlIGZvbGxvd2luZyByZXN1bHRzIG5hbWVzOg0KICAgICAtIGxvY25fc3RhcnQgPSBsb2NhdGlvbiB3aGVyZSBtYXRjaGVkIGV4cHJlc3Npb24gYmVnaW5zDQogICAgIC0gbG9jbl9lbmQgPSBsb2NhdGlvbiB3aGVyZSBtYXRjaGVkIGV4cHJlc3Npb24gZW5kcw0KICAgICAtIHZhbHVlID0gdGhlIGFjdHVhbCBwYXJzZWQgcmVzdWx0cw0KDQogICAgQmUgY2FyZWZ1bCBpZiB0aGUgaW5wdXQgdGV4dCBjb250YWlucyBDezxUQUI+fSBjaGFyYWN0ZXJzLCB5b3UgbWF5IHdhbnQgdG8gY2FsbA0KICAgIEN7THtQYXJzZXJFbGVtZW50LnBhcnNlV2l0aFRhYnN9fQ0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIHdkID0gV29yZChhbHBoYXMpDQogICAgICAgIGZvciBtYXRjaCBpbiBsb2NhdGVkRXhwcih3ZCkuc2VhcmNoU3RyaW5nKCJsanNkZjEyM2xrc2RqamYxMjNsa2tqajEyMjIiKToNCiAgICAgICAgICAgIHByaW50KG1hdGNoKQ0KICAgIHByaW50czo6DQogICAgICAgIFtbMCwgJ2xqc2RmJywgNV1dDQogICAgICAgIFtbOCwgJ2xrc2RqamYnLCAxNV1dDQogICAgICAgIFtbMTgsICdsa2tqaicsIDIzXV0NCiAgICAiIiINCiAgICBsb2NhdG9yID0gRW1wdHkoKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcyxsLHQ6IGwpDQogICAgcmV0dXJuIEdyb3VwKGxvY2F0b3IoImxvY25fc3RhcnQiKSArIGV4cHIoInZhbHVlIikgKyBsb2NhdG9yLmNvcHkoKS5sZWF2ZVdoaXRlc3BhY2UoKSgibG9jbl9lbmQiKSkNCg0KDQojIGNvbnZlbmllbmNlIGNvbnN0YW50cyBmb3IgcG9zaXRpb25hbCBleHByZXNzaW9ucw0KZW1wdHkgICAgICAgPSBFbXB0eSgpLnNldE5hbWUoImVtcHR5IikNCmxpbmVTdGFydCAgID0gTGluZVN0YXJ0KCkuc2V0TmFtZSgibGluZVN0YXJ0IikNCmxpbmVFbmQgICAgID0gTGluZUVuZCgpLnNldE5hbWUoImxpbmVFbmQiKQ0Kc3RyaW5nU3RhcnQgPSBTdHJpbmdTdGFydCgpLnNldE5hbWUoInN0cmluZ1N0YXJ0IikNCnN0cmluZ0VuZCAgID0gU3RyaW5nRW5kKCkuc2V0TmFtZSgic3RyaW5nRW5kIikNCg0KX2VzY2FwZWRQdW5jID0gV29yZCggX2JzbGFzaCwgciJcW10tKi4kK14/KCl+ICIsIGV4YWN0PTIgKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcyxsLHQ6dFswXVsxXSkNCl9lc2NhcGVkSGV4Q2hhciA9IFJlZ2V4KHIiXFwwP1t4WF1bMC05YS1mQS1GXSsiKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcyxsLHQ6dW5pY2hyKGludCh0WzBdLmxzdHJpcChyJ1wweCcpLDE2KSkpDQpfZXNjYXBlZE9jdENoYXIgPSBSZWdleChyIlxcMFswLTddKyIpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLGwsdDp1bmljaHIoaW50KHRbMF1bMTpdLDgpKSkNCl9zaW5nbGVDaGFyID0gX2VzY2FwZWRQdW5jIHwgX2VzY2FwZWRIZXhDaGFyIHwgX2VzY2FwZWRPY3RDaGFyIHwgQ2hhcnNOb3RJbihyJ1xdJywgZXhhY3Q9MSkNCl9jaGFyUmFuZ2UgPSBHcm91cChfc2luZ2xlQ2hhciArIFN1cHByZXNzKCItIikgKyBfc2luZ2xlQ2hhcikNCl9yZUJyYWNrZXRFeHByID0gTGl0ZXJhbCgiWyIpICsgT3B0aW9uYWwoIl4iKS5zZXRSZXN1bHRzTmFtZSgibmVnYXRlIikgKyBHcm91cCggT25lT3JNb3JlKCBfY2hhclJhbmdlIHwgX3NpbmdsZUNoYXIgKSApLnNldFJlc3VsdHNOYW1lKCJib2R5IikgKyAiXSINCg0KZGVmIHNyYW5nZShzKToNCiAgICByIiIiDQogICAgSGVscGVyIHRvIGVhc2lseSBkZWZpbmUgc3RyaW5nIHJhbmdlcyBmb3IgdXNlIGluIFdvcmQgY29uc3RydWN0aW9uLiAgQm9ycm93cw0KICAgIHN5bnRheCBmcm9tIHJlZ2V4cCAnW10nIHN0cmluZyByYW5nZSBkZWZpbml0aW9uczo6DQogICAgICAgIHNyYW5nZSgiWzAtOV0iKSAgIC0+ICIwMTIzNDU2Nzg5Ig0KICAgICAgICBzcmFuZ2UoIlthLXpdIikgICAtPiAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiDQogICAgICAgIHNyYW5nZSgiW2EteiRfXSIpIC0+ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiRfIg0KICAgIFRoZSBpbnB1dCBzdHJpbmcgbXVzdCBiZSBlbmNsb3NlZCBpbiBbXSdzLCBhbmQgdGhlIHJldHVybmVkIHN0cmluZyBpcyB0aGUgZXhwYW5kZWQNCiAgICBjaGFyYWN0ZXIgc2V0IGpvaW5lZCBpbnRvIGEgc2luZ2xlIHN0cmluZy4NCiAgICBUaGUgdmFsdWVzIGVuY2xvc2VkIGluIHRoZSBbXSdzIG1heSBiZToNCiAgICAgLSBhIHNpbmdsZSBjaGFyYWN0ZXINCiAgICAgLSBhbiBlc2NhcGVkIGNoYXJhY3RlciB3aXRoIGEgbGVhZGluZyBiYWNrc2xhc2ggKHN1Y2ggYXMgQ3tcLX0gb3IgQ3tcXX0pDQogICAgIC0gYW4gZXNjYXBlZCBoZXggY2hhcmFjdGVyIHdpdGggYSBsZWFkaW5nIEN7J1x4J30gKEN7XHgyMX0sIHdoaWNoIGlzIGEgQ3snISd9IGNoYXJhY3RlcikgDQogICAgICAgICAoQ3tcMHgjI30gaXMgYWxzbyBzdXBwb3J0ZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5KSANCiAgICAgLSBhbiBlc2NhcGVkIG9jdGFsIGNoYXJhY3RlciB3aXRoIGEgbGVhZGluZyBDeydcMCd9IChDe1wwNDF9LCB3aGljaCBpcyBhIEN7JyEnfSBjaGFyYWN0ZXIpDQogICAgIC0gYSByYW5nZSBvZiBhbnkgb2YgdGhlIGFib3ZlLCBzZXBhcmF0ZWQgYnkgYSBkYXNoIChDeydhLXonfSwgZXRjLikNCiAgICAgLSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGFib3ZlIChDeydhZWlvdXknfSwgQ3snYS16QS1aMC05XyQnfSwgZXRjLikNCiAgICAiIiINCiAgICBfZXhwYW5kZWQgPSBsYW1iZGEgcDogcCBpZiBub3QgaXNpbnN0YW5jZShwLFBhcnNlUmVzdWx0cykgZWxzZSAnJy5qb2luKHVuaWNocihjKSBmb3IgYyBpbiByYW5nZShvcmQocFswXSksb3JkKHBbMV0pKzEpKQ0KICAgIHRyeToNCiAgICAgICAgcmV0dXJuICIiLmpvaW4oX2V4cGFuZGVkKHBhcnQpIGZvciBwYXJ0IGluIF9yZUJyYWNrZXRFeHByLnBhcnNlU3RyaW5nKHMpLmJvZHkpDQogICAgZXhjZXB0IEV4Y2VwdGlvbjoNCiAgICAgICAgcmV0dXJuICIiDQoNCmRlZiBtYXRjaE9ubHlBdENvbChuKToNCiAgICAiIiINCiAgICBIZWxwZXIgbWV0aG9kIGZvciBkZWZpbmluZyBwYXJzZSBhY3Rpb25zIHRoYXQgcmVxdWlyZSBtYXRjaGluZyBhdCBhIHNwZWNpZmljDQogICAgY29sdW1uIGluIHRoZSBpbnB1dCB0ZXh0Lg0KICAgICIiIg0KICAgIGRlZiB2ZXJpZnlDb2woc3RyZyxsb2NuLHRva3MpOg0KICAgICAgICBpZiBjb2wobG9jbixzdHJnKSAhPSBuOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oc3RyZyxsb2NuLCJtYXRjaGVkIHRva2VuIG5vdCBhdCBjb2x1bW4gJWQiICUgbikNCiAgICByZXR1cm4gdmVyaWZ5Q29sDQoNCmRlZiByZXBsYWNlV2l0aChyZXBsU3RyKToNCiAgICAiIiINCiAgICBIZWxwZXIgbWV0aG9kIGZvciBjb21tb24gcGFyc2UgYWN0aW9ucyB0aGF0IHNpbXBseSByZXR1cm4gYSBsaXRlcmFsIHZhbHVlLiAgRXNwZWNpYWxseQ0KICAgIHVzZWZ1bCB3aGVuIHVzZWQgd2l0aCBDe0x7dHJhbnNmb3JtU3RyaW5nPFBhcnNlckVsZW1lbnQudHJhbnNmb3JtU3RyaW5nPn0oKX0uDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgbnVtID0gV29yZChudW1zKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdG9rczogaW50KHRva3NbMF0pKQ0KICAgICAgICBuYSA9IG9uZU9mKCJOL0EgTkEiKS5zZXRQYXJzZUFjdGlvbihyZXBsYWNlV2l0aChtYXRoLm5hbikpDQogICAgICAgIHRlcm0gPSBuYSB8IG51bQ0KICAgICAgICANCiAgICAgICAgT25lT3JNb3JlKHRlcm0pLnBhcnNlU3RyaW5nKCIzMjQgMjM0IE4vQSAyMzQiKSAjIC0+IFszMjQsIDIzNCwgbmFuLCAyMzRdDQogICAgIiIiDQogICAgcmV0dXJuIGxhbWJkYSBzLGwsdDogW3JlcGxTdHJdDQoNCmRlZiByZW1vdmVRdW90ZXMocyxsLHQpOg0KICAgICIiIg0KICAgIEhlbHBlciBwYXJzZSBhY3Rpb24gZm9yIHJlbW92aW5nIHF1b3RhdGlvbiBtYXJrcyBmcm9tIHBhcnNlZCBxdW90ZWQgc3RyaW5ncy4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICAjIGJ5IGRlZmF1bHQsIHF1b3RhdGlvbiBtYXJrcyBhcmUgaW5jbHVkZWQgaW4gcGFyc2VkIHJlc3VsdHMNCiAgICAgICAgcXVvdGVkU3RyaW5nLnBhcnNlU3RyaW5nKCInTm93IGlzIHRoZSBXaW50ZXIgb2Ygb3VyIERpc2NvbnRlbnQnIikgIyAtPiBbIidOb3cgaXMgdGhlIFdpbnRlciBvZiBvdXIgRGlzY29udGVudCciXQ0KDQogICAgICAgICMgdXNlIHJlbW92ZVF1b3RlcyB0byBzdHJpcCBxdW90YXRpb24gbWFya3MgZnJvbSBwYXJzZWQgcmVzdWx0cw0KICAgICAgICBxdW90ZWRTdHJpbmcuc2V0UGFyc2VBY3Rpb24ocmVtb3ZlUXVvdGVzKQ0KICAgICAgICBxdW90ZWRTdHJpbmcucGFyc2VTdHJpbmcoIidOb3cgaXMgdGhlIFdpbnRlciBvZiBvdXIgRGlzY29udGVudCciKSAjIC0+IFsiTm93IGlzIHRoZSBXaW50ZXIgb2Ygb3VyIERpc2NvbnRlbnQiXQ0KICAgICIiIg0KICAgIHJldHVybiB0WzBdWzE6LTFdDQoNCmRlZiB0b2tlbk1hcChmdW5jLCAqYXJncyk6DQogICAgIiIiDQogICAgSGVscGVyIHRvIGRlZmluZSBhIHBhcnNlIGFjdGlvbiBieSBtYXBwaW5nIGEgZnVuY3Rpb24gdG8gYWxsIGVsZW1lbnRzIG9mIGEgUGFyc2VSZXN1bHRzIGxpc3QuSWYgYW55IGFkZGl0aW9uYWwgDQogICAgYXJncyBhcmUgcGFzc2VkLCB0aGV5IGFyZSBmb3J3YXJkZWQgdG8gdGhlIGdpdmVuIGZ1bmN0aW9uIGFzIGFkZGl0aW9uYWwgYXJndW1lbnRzIGFmdGVyDQogICAgdGhlIHRva2VuLCBhcyBpbiBDe2hleF9pbnRlZ2VyID0gV29yZChoZXhudW1zKS5zZXRQYXJzZUFjdGlvbih0b2tlbk1hcChpbnQsIDE2KSl9LCB3aGljaCB3aWxsIGNvbnZlcnQgdGhlDQogICAgcGFyc2VkIGRhdGEgdG8gYW4gaW50ZWdlciB1c2luZyBiYXNlIDE2Lg0KDQogICAgRXhhbXBsZSAoY29tcGFyZSB0aGUgbGFzdCB0byBleGFtcGxlIGluIEx7UGFyc2VyRWxlbWVudC50cmFuc2Zvcm1TdHJpbmd9OjoNCiAgICAgICAgaGV4X2ludHMgPSBPbmVPck1vcmUoV29yZChoZXhudW1zKSkuc2V0UGFyc2VBY3Rpb24odG9rZW5NYXAoaW50LCAxNikpDQogICAgICAgIGhleF9pbnRzLnJ1blRlc3RzKCcnJw0KICAgICAgICAgICAgMDAgMTEgMjIgYWEgRkYgMGEgMGQgMWENCiAgICAgICAgICAgICcnJykNCiAgICAgICAgDQogICAgICAgIHVwcGVyd29yZCA9IFdvcmQoYWxwaGFzKS5zZXRQYXJzZUFjdGlvbih0b2tlbk1hcChzdHIudXBwZXIpKQ0KICAgICAgICBPbmVPck1vcmUodXBwZXJ3b3JkKS5ydW5UZXN0cygnJycNCiAgICAgICAgICAgIG15IGtpbmdkb20gZm9yIGEgaG9yc2UNCiAgICAgICAgICAgICcnJykNCg0KICAgICAgICB3ZCA9IFdvcmQoYWxwaGFzKS5zZXRQYXJzZUFjdGlvbih0b2tlbk1hcChzdHIudGl0bGUpKQ0KICAgICAgICBPbmVPck1vcmUod2QpLnNldFBhcnNlQWN0aW9uKCcgJy5qb2luKS5ydW5UZXN0cygnJycNCiAgICAgICAgICAgIG5vdyBpcyB0aGUgd2ludGVyIG9mIG91ciBkaXNjb250ZW50IG1hZGUgZ2xvcmlvdXMgc3VtbWVyIGJ5IHRoaXMgc3VuIG9mIHlvcmsNCiAgICAgICAgICAgICcnJykNCiAgICBwcmludHM6Og0KICAgICAgICAwMCAxMSAyMiBhYSBGRiAwYSAwZCAxYQ0KICAgICAgICBbMCwgMTcsIDM0LCAxNzAsIDI1NSwgMTAsIDEzLCAyNl0NCg0KICAgICAgICBteSBraW5nZG9tIGZvciBhIGhvcnNlDQogICAgICAgIFsnTVknLCAnS0lOR0RPTScsICdGT1InLCAnQScsICdIT1JTRSddDQoNCiAgICAgICAgbm93IGlzIHRoZSB3aW50ZXIgb2Ygb3VyIGRpc2NvbnRlbnQgbWFkZSBnbG9yaW91cyBzdW1tZXIgYnkgdGhpcyBzdW4gb2YgeW9yaw0KICAgICAgICBbJ05vdyBJcyBUaGUgV2ludGVyIE9mIE91ciBEaXNjb250ZW50IE1hZGUgR2xvcmlvdXMgU3VtbWVyIEJ5IFRoaXMgU3VuIE9mIFlvcmsnXQ0KICAgICIiIg0KICAgIGRlZiBwYShzLGwsdCk6DQogICAgICAgIHJldHVybiBbZnVuYyh0b2tuLCAqYXJncykgZm9yIHRva24gaW4gdF0NCg0KICAgIHRyeToNCiAgICAgICAgZnVuY19uYW1lID0gZ2V0YXR0cihmdW5jLCAnX19uYW1lX18nLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRhdHRyKGZ1bmMsICdfX2NsYXNzX18nKS5fX25hbWVfXykNCiAgICBleGNlcHQgRXhjZXB0aW9uOg0KICAgICAgICBmdW5jX25hbWUgPSBzdHIoZnVuYykNCiAgICBwYS5fX25hbWVfXyA9IGZ1bmNfbmFtZQ0KDQogICAgcmV0dXJuIHBhDQoNCnVwY2FzZVRva2VucyA9IHRva2VuTWFwKGxhbWJkYSB0OiBfdXN0cih0KS51cHBlcigpKQ0KIiIiKERlcHJlY2F0ZWQpIEhlbHBlciBwYXJzZSBhY3Rpb24gdG8gY29udmVydCB0b2tlbnMgdG8gdXBwZXIgY2FzZS4gRGVwcmVjYXRlZCBpbiBmYXZvciBvZiBMe3B5cGFyc2luZ19jb21tb24udXBjYXNlVG9rZW5zfSIiIg0KDQpkb3duY2FzZVRva2VucyA9IHRva2VuTWFwKGxhbWJkYSB0OiBfdXN0cih0KS5sb3dlcigpKQ0KIiIiKERlcHJlY2F0ZWQpIEhlbHBlciBwYXJzZSBhY3Rpb24gdG8gY29udmVydCB0b2tlbnMgdG8gbG93ZXIgY2FzZS4gRGVwcmVjYXRlZCBpbiBmYXZvciBvZiBMe3B5cGFyc2luZ19jb21tb24uZG93bmNhc2VUb2tlbnN9IiIiDQogICAgDQpkZWYgX21ha2VUYWdzKHRhZ1N0ciwgeG1sKToNCiAgICAiIiJJbnRlcm5hbCBoZWxwZXIgdG8gY29uc3RydWN0IG9wZW5pbmcgYW5kIGNsb3NpbmcgdGFnIGV4cHJlc3Npb25zLCBnaXZlbiBhIHRhZyBuYW1lIiIiDQogICAgaWYgaXNpbnN0YW5jZSh0YWdTdHIsYmFzZXN0cmluZyk6DQogICAgICAgIHJlc25hbWUgPSB0YWdTdHINCiAgICAgICAgdGFnU3RyID0gS2V5d29yZCh0YWdTdHIsIGNhc2VsZXNzPW5vdCB4bWwpDQogICAgZWxzZToNCiAgICAgICAgcmVzbmFtZSA9IHRhZ1N0ci5uYW1lDQoNCiAgICB0YWdBdHRyTmFtZSA9IFdvcmQoYWxwaGFzLGFscGhhbnVtcysiXy06IikNCiAgICBpZiAoeG1sKToNCiAgICAgICAgdGFnQXR0clZhbHVlID0gZGJsUXVvdGVkU3RyaW5nLmNvcHkoKS5zZXRQYXJzZUFjdGlvbiggcmVtb3ZlUXVvdGVzICkNCiAgICAgICAgb3BlblRhZyA9IFN1cHByZXNzKCI8IikgKyB0YWdTdHIoInRhZyIpICsgXA0KICAgICAgICAgICAgICAgIERpY3QoWmVyb09yTW9yZShHcm91cCggdGFnQXR0ck5hbWUgKyBTdXBwcmVzcygiPSIpICsgdGFnQXR0clZhbHVlICkpKSArIFwNCiAgICAgICAgICAgICAgICBPcHRpb25hbCgiLyIsZGVmYXVsdD1bRmFsc2VdKS5zZXRSZXN1bHRzTmFtZSgiZW1wdHkiKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcyxsLHQ6dFswXT09Jy8nKSArIFN1cHByZXNzKCI+IikNCiAgICBlbHNlOg0KICAgICAgICBwcmludGFibGVzTGVzc1JBYnJhY2sgPSAiIi5qb2luKGMgZm9yIGMgaW4gcHJpbnRhYmxlcyBpZiBjIG5vdCBpbiAiPiIpDQogICAgICAgIHRhZ0F0dHJWYWx1ZSA9IHF1b3RlZFN0cmluZy5jb3B5KCkuc2V0UGFyc2VBY3Rpb24oIHJlbW92ZVF1b3RlcyApIHwgV29yZChwcmludGFibGVzTGVzc1JBYnJhY2spDQogICAgICAgIG9wZW5UYWcgPSBTdXBwcmVzcygiPCIpICsgdGFnU3RyKCJ0YWciKSArIFwNCiAgICAgICAgICAgICAgICBEaWN0KFplcm9Pck1vcmUoR3JvdXAoIHRhZ0F0dHJOYW1lLnNldFBhcnNlQWN0aW9uKGRvd25jYXNlVG9rZW5zKSArIFwNCiAgICAgICAgICAgICAgICBPcHRpb25hbCggU3VwcHJlc3MoIj0iKSArIHRhZ0F0dHJWYWx1ZSApICkpKSArIFwNCiAgICAgICAgICAgICAgICBPcHRpb25hbCgiLyIsZGVmYXVsdD1bRmFsc2VdKS5zZXRSZXN1bHRzTmFtZSgiZW1wdHkiKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcyxsLHQ6dFswXT09Jy8nKSArIFN1cHByZXNzKCI+IikNCiAgICBjbG9zZVRhZyA9IENvbWJpbmUoX0woIjwvIikgKyB0YWdTdHIgKyAiPiIpDQoNCiAgICBvcGVuVGFnID0gb3BlblRhZy5zZXRSZXN1bHRzTmFtZSgic3RhcnQiKyIiLmpvaW4ocmVzbmFtZS5yZXBsYWNlKCI6IiwiICIpLnRpdGxlKCkuc3BsaXQoKSkpLnNldE5hbWUoIjwlcz4iICUgcmVzbmFtZSkNCiAgICBjbG9zZVRhZyA9IGNsb3NlVGFnLnNldFJlc3VsdHNOYW1lKCJlbmQiKyIiLmpvaW4ocmVzbmFtZS5yZXBsYWNlKCI6IiwiICIpLnRpdGxlKCkuc3BsaXQoKSkpLnNldE5hbWUoIjwvJXM+IiAlIHJlc25hbWUpDQogICAgb3BlblRhZy50YWcgPSByZXNuYW1lDQogICAgY2xvc2VUYWcudGFnID0gcmVzbmFtZQ0KICAgIHJldHVybiBvcGVuVGFnLCBjbG9zZVRhZw0KDQpkZWYgbWFrZUhUTUxUYWdzKHRhZ1N0cik6DQogICAgIiIiDQogICAgSGVscGVyIHRvIGNvbnN0cnVjdCBvcGVuaW5nIGFuZCBjbG9zaW5nIHRhZyBleHByZXNzaW9ucyBmb3IgSFRNTCwgZ2l2ZW4gYSB0YWcgbmFtZS4gTWF0Y2hlcw0KICAgIHRhZ3MgaW4gZWl0aGVyIHVwcGVyIG9yIGxvd2VyIGNhc2UsIGF0dHJpYnV0ZXMgd2l0aCBuYW1lc3BhY2VzIGFuZCB3aXRoIHF1b3RlZCBvciB1bnF1b3RlZCB2YWx1ZXMuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgdGV4dCA9ICc8dGQ+TW9yZSBpbmZvIGF0IHRoZSA8YSBocmVmPSJodHRwOi8vcHlwYXJzaW5nLndpa2lzcGFjZXMuY29tIj5weXBhcnNpbmc8L2E+IHdpa2kgcGFnZTwvdGQ+Jw0KICAgICAgICAjIG1ha2VIVE1MVGFncyByZXR1cm5zIHB5cGFyc2luZyBleHByZXNzaW9ucyBmb3IgdGhlIG9wZW5pbmcgYW5kIGNsb3NpbmcgdGFncyBhcyBhIDItdHVwbGUNCiAgICAgICAgYSxhX2VuZCA9IG1ha2VIVE1MVGFncygiQSIpDQogICAgICAgIGxpbmtfZXhwciA9IGEgKyBTa2lwVG8oYV9lbmQpKCJsaW5rX3RleHQiKSArIGFfZW5kDQogICAgICAgIA0KICAgICAgICBmb3IgbGluayBpbiBsaW5rX2V4cHIuc2VhcmNoU3RyaW5nKHRleHQpOg0KICAgICAgICAgICAgIyBhdHRyaWJ1dGVzIGluIHRoZSA8QT4gdGFnIChsaWtlICJocmVmIiBzaG93biBoZXJlKSBhcmUgYWxzbyBhY2Nlc3NpYmxlIGFzIG5hbWVkIHJlc3VsdHMNCiAgICAgICAgICAgIHByaW50KGxpbmsubGlua190ZXh0LCAnLT4nLCBsaW5rLmhyZWYpDQogICAgcHJpbnRzOjoNCiAgICAgICAgcHlwYXJzaW5nIC0+IGh0dHA6Ly9weXBhcnNpbmcud2lraXNwYWNlcy5jb20NCiAgICAiIiINCiAgICByZXR1cm4gX21ha2VUYWdzKCB0YWdTdHIsIEZhbHNlICkNCg0KZGVmIG1ha2VYTUxUYWdzKHRhZ1N0cik6DQogICAgIiIiDQogICAgSGVscGVyIHRvIGNvbnN0cnVjdCBvcGVuaW5nIGFuZCBjbG9zaW5nIHRhZyBleHByZXNzaW9ucyBmb3IgWE1MLCBnaXZlbiBhIHRhZyBuYW1lLiBNYXRjaGVzDQogICAgdGFncyBvbmx5IGluIHRoZSBnaXZlbiB1cHBlci9sb3dlciBjYXNlLg0KDQogICAgRXhhbXBsZTogc2ltaWxhciB0byBMe21ha2VIVE1MVGFnc30NCiAgICAiIiINCiAgICByZXR1cm4gX21ha2VUYWdzKCB0YWdTdHIsIFRydWUgKQ0KDQpkZWYgd2l0aEF0dHJpYnV0ZSgqYXJncywqKmF0dHJEaWN0KToNCiAgICAiIiINCiAgICBIZWxwZXIgdG8gY3JlYXRlIGEgdmFsaWRhdGluZyBwYXJzZSBhY3Rpb24gdG8gYmUgdXNlZCB3aXRoIHN0YXJ0IHRhZ3MgY3JlYXRlZA0KICAgIHdpdGggQ3tMe21ha2VYTUxUYWdzfX0gb3IgQ3tMe21ha2VIVE1MVGFnc319LiBVc2UgQ3t3aXRoQXR0cmlidXRlfSB0byBxdWFsaWZ5IGEgc3RhcnRpbmcgdGFnDQogICAgd2l0aCBhIHJlcXVpcmVkIGF0dHJpYnV0ZSB2YWx1ZSwgdG8gYXZvaWQgZmFsc2UgbWF0Y2hlcyBvbiBjb21tb24gdGFncyBzdWNoIGFzDQogICAgQ3s8VEQ+fSBvciBDezxESVY+fS4NCg0KICAgIENhbGwgQ3t3aXRoQXR0cmlidXRlfSB3aXRoIGEgc2VyaWVzIG9mIGF0dHJpYnV0ZSBuYW1lcyBhbmQgdmFsdWVzLiBTcGVjaWZ5IHRoZSBsaXN0DQogICAgb2YgZmlsdGVyIGF0dHJpYnV0ZXMgbmFtZXMgYW5kIHZhbHVlcyBhczoNCiAgICAgLSBrZXl3b3JkIGFyZ3VtZW50cywgYXMgaW4gQ3soYWxpZ249InJpZ2h0Iil9LCBvcg0KICAgICAtIGFzIGFuIGV4cGxpY2l0IGRpY3Qgd2l0aCBDeyoqfSBvcGVyYXRvciwgd2hlbiBhbiBhdHRyaWJ1dGUgbmFtZSBpcyBhbHNvIGEgUHl0aG9uDQogICAgICAgICAgcmVzZXJ2ZWQgd29yZCwgYXMgaW4gQ3sqKnsiY2xhc3MiOiJDdXN0b21lciIsICJhbGlnbiI6InJpZ2h0In19DQogICAgIC0gYSBsaXN0IG9mIG5hbWUtdmFsdWUgdHVwbGVzLCBhcyBpbiAoICgibnMxOmNsYXNzIiwgIkN1c3RvbWVyIiksICgibnMyOmFsaWduIiwicmlnaHQiKSApDQogICAgRm9yIGF0dHJpYnV0ZSBuYW1lcyB3aXRoIGEgbmFtZXNwYWNlIHByZWZpeCwgeW91IG11c3QgdXNlIHRoZSBzZWNvbmQgZm9ybS4gIEF0dHJpYnV0ZQ0KICAgIG5hbWVzIGFyZSBtYXRjaGVkIGluc2Vuc2l0aXZlIHRvIHVwcGVyL2xvd2VyIGNhc2UuDQogICAgICAgDQogICAgSWYganVzdCB0ZXN0aW5nIGZvciBDe2NsYXNzfSAod2l0aCBvciB3aXRob3V0IGEgbmFtZXNwYWNlKSwgdXNlIEN7THt3aXRoQ2xhc3N9fS4NCg0KICAgIFRvIHZlcmlmeSB0aGF0IHRoZSBhdHRyaWJ1dGUgZXhpc3RzLCBidXQgd2l0aG91dCBzcGVjaWZ5aW5nIGEgdmFsdWUsIHBhc3MNCiAgICBDe3dpdGhBdHRyaWJ1dGUuQU5ZX1ZBTFVFfSBhcyB0aGUgdmFsdWUuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgaHRtbCA9ICcnJw0KICAgICAgICAgICAgPGRpdj4NCiAgICAgICAgICAgIFNvbWUgdGV4dA0KICAgICAgICAgICAgPGRpdiB0eXBlPSJncmlkIj4xIDQgMCAxIDA8L2Rpdj4NCiAgICAgICAgICAgIDxkaXYgdHlwZT0iZ3JhcGgiPjEsMyAyLDMgMSwxPC9kaXY+DQogICAgICAgICAgICA8ZGl2PnRoaXMgaGFzIG5vIHR5cGU8L2Rpdj4NCiAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgIA0KICAgICAgICAnJycNCiAgICAgICAgZGl2LGRpdl9lbmQgPSBtYWtlSFRNTFRhZ3MoImRpdiIpDQoNCiAgICAgICAgIyBvbmx5IG1hdGNoIGRpdiB0YWcgaGF2aW5nIGEgdHlwZSBhdHRyaWJ1dGUgd2l0aCB2YWx1ZSAiZ3JpZCINCiAgICAgICAgZGl2X2dyaWQgPSBkaXYoKS5zZXRQYXJzZUFjdGlvbih3aXRoQXR0cmlidXRlKHR5cGU9ImdyaWQiKSkNCiAgICAgICAgZ3JpZF9leHByID0gZGl2X2dyaWQgKyBTa2lwVG8oZGl2IHwgZGl2X2VuZCkoImJvZHkiKQ0KICAgICAgICBmb3IgZ3JpZF9oZWFkZXIgaW4gZ3JpZF9leHByLnNlYXJjaFN0cmluZyhodG1sKToNCiAgICAgICAgICAgIHByaW50KGdyaWRfaGVhZGVyLmJvZHkpDQogICAgICAgIA0KICAgICAgICAjIGNvbnN0cnVjdCBhIG1hdGNoIHdpdGggYW55IGRpdiB0YWcgaGF2aW5nIGEgdHlwZSBhdHRyaWJ1dGUsIHJlZ2FyZGxlc3Mgb2YgdGhlIHZhbHVlDQogICAgICAgIGRpdl9hbnlfdHlwZSA9IGRpdigpLnNldFBhcnNlQWN0aW9uKHdpdGhBdHRyaWJ1dGUodHlwZT13aXRoQXR0cmlidXRlLkFOWV9WQUxVRSkpDQogICAgICAgIGRpdl9leHByID0gZGl2X2FueV90eXBlICsgU2tpcFRvKGRpdiB8IGRpdl9lbmQpKCJib2R5IikNCiAgICAgICAgZm9yIGRpdl9oZWFkZXIgaW4gZGl2X2V4cHIuc2VhcmNoU3RyaW5nKGh0bWwpOg0KICAgICAgICAgICAgcHJpbnQoZGl2X2hlYWRlci5ib2R5KQ0KICAgIHByaW50czo6DQogICAgICAgIDEgNCAwIDEgMA0KDQogICAgICAgIDEgNCAwIDEgMA0KICAgICAgICAxLDMgMiwzIDEsMQ0KICAgICIiIg0KICAgIGlmIGFyZ3M6DQogICAgICAgIGF0dHJzID0gYXJnc1s6XQ0KICAgIGVsc2U6DQogICAgICAgIGF0dHJzID0gYXR0ckRpY3QuaXRlbXMoKQ0KICAgIGF0dHJzID0gWyhrLHYpIGZvciBrLHYgaW4gYXR0cnNdDQogICAgZGVmIHBhKHMsbCx0b2tlbnMpOg0KICAgICAgICBmb3IgYXR0ck5hbWUsYXR0clZhbHVlIGluIGF0dHJzOg0KICAgICAgICAgICAgaWYgYXR0ck5hbWUgbm90IGluIHRva2VuczoNCiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihzLGwsIm5vIG1hdGNoaW5nIGF0dHJpYnV0ZSAiICsgYXR0ck5hbWUpDQogICAgICAgICAgICBpZiBhdHRyVmFsdWUgIT0gd2l0aEF0dHJpYnV0ZS5BTllfVkFMVUUgYW5kIHRva2Vuc1thdHRyTmFtZV0gIT0gYXR0clZhbHVlOg0KICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKHMsbCwiYXR0cmlidXRlICclcycgaGFzIHZhbHVlICclcycsIG11c3QgYmUgJyVzJyIgJQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXR0ck5hbWUsIHRva2Vuc1thdHRyTmFtZV0sIGF0dHJWYWx1ZSkpDQogICAgcmV0dXJuIHBhDQp3aXRoQXR0cmlidXRlLkFOWV9WQUxVRSA9IG9iamVjdCgpDQoNCmRlZiB3aXRoQ2xhc3MoY2xhc3NuYW1lLCBuYW1lc3BhY2U9JycpOg0KICAgICIiIg0KICAgIFNpbXBsaWZpZWQgdmVyc2lvbiBvZiBDe0x7d2l0aEF0dHJpYnV0ZX19IHdoZW4gbWF0Y2hpbmcgb24gYSBkaXYgY2xhc3MgLSBtYWRlDQogICAgZGlmZmljdWx0IGJlY2F1c2UgQ3tjbGFzc30gaXMgYSByZXNlcnZlZCB3b3JkIGluIFB5dGhvbi4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBodG1sID0gJycnDQogICAgICAgICAgICA8ZGl2Pg0KICAgICAgICAgICAgU29tZSB0ZXh0DQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJncmlkIj4xIDQgMCAxIDA8L2Rpdj4NCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImdyYXBoIj4xLDMgMiwzIDEsMTwvZGl2Pg0KICAgICAgICAgICAgPGRpdj50aGlzICZsdDtkaXYmZ3Q7IGhhcyBubyBjbGFzczwvZGl2Pg0KICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgDQogICAgICAgICcnJw0KICAgICAgICBkaXYsZGl2X2VuZCA9IG1ha2VIVE1MVGFncygiZGl2IikNCiAgICAgICAgZGl2X2dyaWQgPSBkaXYoKS5zZXRQYXJzZUFjdGlvbih3aXRoQ2xhc3MoImdyaWQiKSkNCiAgICAgICAgDQogICAgICAgIGdyaWRfZXhwciA9IGRpdl9ncmlkICsgU2tpcFRvKGRpdiB8IGRpdl9lbmQpKCJib2R5IikNCiAgICAgICAgZm9yIGdyaWRfaGVhZGVyIGluIGdyaWRfZXhwci5zZWFyY2hTdHJpbmcoaHRtbCk6DQogICAgICAgICAgICBwcmludChncmlkX2hlYWRlci5ib2R5KQ0KICAgICAgICANCiAgICAgICAgZGl2X2FueV90eXBlID0gZGl2KCkuc2V0UGFyc2VBY3Rpb24od2l0aENsYXNzKHdpdGhBdHRyaWJ1dGUuQU5ZX1ZBTFVFKSkNCiAgICAgICAgZGl2X2V4cHIgPSBkaXZfYW55X3R5cGUgKyBTa2lwVG8oZGl2IHwgZGl2X2VuZCkoImJvZHkiKQ0KICAgICAgICBmb3IgZGl2X2hlYWRlciBpbiBkaXZfZXhwci5zZWFyY2hTdHJpbmcoaHRtbCk6DQogICAgICAgICAgICBwcmludChkaXZfaGVhZGVyLmJvZHkpDQogICAgcHJpbnRzOjoNCiAgICAgICAgMSA0IDAgMSAwDQoNCiAgICAgICAgMSA0IDAgMSAwDQogICAgICAgIDEsMyAyLDMgMSwxDQogICAgIiIiDQogICAgY2xhc3NhdHRyID0gIiVzOmNsYXNzIiAlIG5hbWVzcGFjZSBpZiBuYW1lc3BhY2UgZWxzZSAiY2xhc3MiDQogICAgcmV0dXJuIHdpdGhBdHRyaWJ1dGUoKip7Y2xhc3NhdHRyIDogY2xhc3NuYW1lfSkgICAgICAgIA0KDQpvcEFzc29jID0gX0NvbnN0YW50cygpDQpvcEFzc29jLkxFRlQgPSBvYmplY3QoKQ0Kb3BBc3NvYy5SSUdIVCA9IG9iamVjdCgpDQoNCmRlZiBpbmZpeE5vdGF0aW9uKCBiYXNlRXhwciwgb3BMaXN0LCBscGFyPVN1cHByZXNzKCcoJyksIHJwYXI9U3VwcHJlc3MoJyknKSApOg0KICAgICIiIg0KICAgIEhlbHBlciBtZXRob2QgZm9yIGNvbnN0cnVjdGluZyBncmFtbWFycyBvZiBleHByZXNzaW9ucyBtYWRlIHVwIG9mDQogICAgb3BlcmF0b3JzIHdvcmtpbmcgaW4gYSBwcmVjZWRlbmNlIGhpZXJhcmNoeS4gIE9wZXJhdG9ycyBtYXkgYmUgdW5hcnkgb3INCiAgICBiaW5hcnksIGxlZnQtIG9yIHJpZ2h0LWFzc29jaWF0aXZlLiAgUGFyc2UgYWN0aW9ucyBjYW4gYWxzbyBiZSBhdHRhY2hlZA0KICAgIHRvIG9wZXJhdG9yIGV4cHJlc3Npb25zLiBUaGUgZ2VuZXJhdGVkIHBhcnNlciB3aWxsIGFsc28gcmVjb2duaXplIHRoZSB1c2UgDQogICAgb2YgcGFyZW50aGVzZXMgdG8gb3ZlcnJpZGUgb3BlcmF0b3IgcHJlY2VkZW5jZXMgKHNlZSBleGFtcGxlIGJlbG93KS4NCiAgICANCiAgICBOb3RlOiBpZiB5b3UgZGVmaW5lIGEgZGVlcCBvcGVyYXRvciBsaXN0LCB5b3UgbWF5IHNlZSBwZXJmb3JtYW5jZSBpc3N1ZXMNCiAgICB3aGVuIHVzaW5nIGluZml4Tm90YXRpb24uIFNlZSBMe1BhcnNlckVsZW1lbnQuZW5hYmxlUGFja3JhdH0gZm9yIGENCiAgICBtZWNoYW5pc20gdG8gcG90ZW50aWFsbHkgaW1wcm92ZSB5b3VyIHBhcnNlciBwZXJmb3JtYW5jZS4NCg0KICAgIFBhcmFtZXRlcnM6DQogICAgIC0gYmFzZUV4cHIgLSBleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgbW9zdCBiYXNpYyBlbGVtZW50IGZvciB0aGUgbmVzdGVkDQogICAgIC0gb3BMaXN0IC0gbGlzdCBvZiB0dXBsZXMsIG9uZSBmb3IgZWFjaCBvcGVyYXRvciBwcmVjZWRlbmNlIGxldmVsIGluIHRoZQ0KICAgICAgZXhwcmVzc2lvbiBncmFtbWFyOyBlYWNoIHR1cGxlIGlzIG9mIHRoZSBmb3JtDQogICAgICAob3BFeHByLCBudW1UZXJtcywgcmlnaHRMZWZ0QXNzb2MsIHBhcnNlQWN0aW9uKSwgd2hlcmU6DQogICAgICAgLSBvcEV4cHIgaXMgdGhlIHB5cGFyc2luZyBleHByZXNzaW9uIGZvciB0aGUgb3BlcmF0b3I7DQogICAgICAgICAgbWF5IGFsc28gYmUgYSBzdHJpbmcsIHdoaWNoIHdpbGwgYmUgY29udmVydGVkIHRvIGEgTGl0ZXJhbDsNCiAgICAgICAgICBpZiBudW1UZXJtcyBpcyAzLCBvcEV4cHIgaXMgYSB0dXBsZSBvZiB0d28gZXhwcmVzc2lvbnMsIGZvciB0aGUNCiAgICAgICAgICB0d28gb3BlcmF0b3JzIHNlcGFyYXRpbmcgdGhlIDMgdGVybXMNCiAgICAgICAtIG51bVRlcm1zIGlzIHRoZSBudW1iZXIgb2YgdGVybXMgZm9yIHRoaXMgb3BlcmF0b3IgKG11c3QNCiAgICAgICAgICBiZSAxLCAyLCBvciAzKQ0KICAgICAgIC0gcmlnaHRMZWZ0QXNzb2MgaXMgdGhlIGluZGljYXRvciB3aGV0aGVyIHRoZSBvcGVyYXRvciBpcw0KICAgICAgICAgIHJpZ2h0IG9yIGxlZnQgYXNzb2NpYXRpdmUsIHVzaW5nIHRoZSBweXBhcnNpbmctZGVmaW5lZA0KICAgICAgICAgIGNvbnN0YW50cyBDe29wQXNzb2MuUklHSFR9IGFuZCBDe29wQXNzb2MuTEVGVH0uDQogICAgICAgLSBwYXJzZUFjdGlvbiBpcyB0aGUgcGFyc2UgYWN0aW9uIHRvIGJlIGFzc29jaWF0ZWQgd2l0aA0KICAgICAgICAgIGV4cHJlc3Npb25zIG1hdGNoaW5nIHRoaXMgb3BlcmF0b3IgZXhwcmVzc2lvbiAodGhlDQogICAgICAgICAgcGFyc2UgYWN0aW9uIHR1cGxlIG1lbWJlciBtYXkgYmUgb21pdHRlZCk7IGlmIHRoZSBwYXJzZSBhY3Rpb24NCiAgICAgICAgICBpcyBwYXNzZWQgYSB0dXBsZSBvciBsaXN0IG9mIGZ1bmN0aW9ucywgdGhpcyBpcyBlcXVpdmFsZW50IHRvDQogICAgICAgICAgY2FsbGluZyBDe3NldFBhcnNlQWN0aW9uKCpmbil9IChMe1BhcnNlckVsZW1lbnQuc2V0UGFyc2VBY3Rpb259KQ0KICAgICAtIGxwYXIgLSBleHByZXNzaW9uIGZvciBtYXRjaGluZyBsZWZ0LXBhcmVudGhlc2VzIChkZWZhdWx0PUN7U3VwcHJlc3MoJygnKX0pDQogICAgIC0gcnBhciAtIGV4cHJlc3Npb24gZm9yIG1hdGNoaW5nIHJpZ2h0LXBhcmVudGhlc2VzIChkZWZhdWx0PUN7U3VwcHJlc3MoJyknKX0pDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgIyBzaW1wbGUgZXhhbXBsZSBvZiBmb3VyLWZ1bmN0aW9uIGFyaXRobWV0aWMgd2l0aCBpbnRzIGFuZCB2YXJpYWJsZSBuYW1lcw0KICAgICAgICBpbnRlZ2VyID0gcHlwYXJzaW5nX2NvbW1vbi5zaWduZWRfaW50ZWdlcg0KICAgICAgICB2YXJuYW1lID0gcHlwYXJzaW5nX2NvbW1vbi5pZGVudGlmaWVyIA0KICAgICAgICANCiAgICAgICAgYXJpdGhfZXhwciA9IGluZml4Tm90YXRpb24oaW50ZWdlciB8IHZhcm5hbWUsDQogICAgICAgICAgICBbDQogICAgICAgICAgICAoJy0nLCAxLCBvcEFzc29jLlJJR0hUKSwNCiAgICAgICAgICAgIChvbmVPZignKiAvJyksIDIsIG9wQXNzb2MuTEVGVCksDQogICAgICAgICAgICAob25lT2YoJysgLScpLCAyLCBvcEFzc29jLkxFRlQpLA0KICAgICAgICAgICAgXSkNCiAgICAgICAgDQogICAgICAgIGFyaXRoX2V4cHIucnVuVGVzdHMoJycnDQogICAgICAgICAgICA1KzMqNg0KICAgICAgICAgICAgKDUrMykqNg0KICAgICAgICAgICAgLTItLTExDQogICAgICAgICAgICAnJycsIGZ1bGxEdW1wPUZhbHNlKQ0KICAgIHByaW50czo6DQogICAgICAgIDUrMyo2DQogICAgICAgIFtbNSwgJysnLCBbMywgJyonLCA2XV1dDQoNCiAgICAgICAgKDUrMykqNg0KICAgICAgICBbW1s1LCAnKycsIDNdLCAnKicsIDZdXQ0KDQogICAgICAgIC0yLS0xMQ0KICAgICAgICBbW1snLScsIDJdLCAnLScsIFsnLScsIDExXV1dDQogICAgIiIiDQogICAgcmV0ID0gRm9yd2FyZCgpDQogICAgbGFzdEV4cHIgPSBiYXNlRXhwciB8ICggbHBhciArIHJldCArIHJwYXIgKQ0KICAgIGZvciBpLG9wZXJEZWYgaW4gZW51bWVyYXRlKG9wTGlzdCk6DQogICAgICAgIG9wRXhwcixhcml0eSxyaWdodExlZnRBc3NvYyxwYSA9IChvcGVyRGVmICsgKE5vbmUsKSlbOjRdDQogICAgICAgIHRlcm1OYW1lID0gIiVzIHRlcm0iICUgb3BFeHByIGlmIGFyaXR5IDwgMyBlbHNlICIlcyVzIHRlcm0iICUgb3BFeHByDQogICAgICAgIGlmIGFyaXR5ID09IDM6DQogICAgICAgICAgICBpZiBvcEV4cHIgaXMgTm9uZSBvciBsZW4ob3BFeHByKSAhPSAyOg0KICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImlmIG51bXRlcm1zPTMsIG9wRXhwciBtdXN0IGJlIGEgdHVwbGUgb3IgbGlzdCBvZiB0d28gZXhwcmVzc2lvbnMiKQ0KICAgICAgICAgICAgb3BFeHByMSwgb3BFeHByMiA9IG9wRXhwcg0KICAgICAgICB0aGlzRXhwciA9IEZvcndhcmQoKS5zZXROYW1lKHRlcm1OYW1lKQ0KICAgICAgICBpZiByaWdodExlZnRBc3NvYyA9PSBvcEFzc29jLkxFRlQ6DQogICAgICAgICAgICBpZiBhcml0eSA9PSAxOg0KICAgICAgICAgICAgICAgIG1hdGNoRXhwciA9IEZvbGxvd2VkQnkobGFzdEV4cHIgKyBvcEV4cHIpICsgR3JvdXAoIGxhc3RFeHByICsgT25lT3JNb3JlKCBvcEV4cHIgKSApDQogICAgICAgICAgICBlbGlmIGFyaXR5ID09IDI6DQogICAgICAgICAgICAgICAgaWYgb3BFeHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgICAgICAgICBtYXRjaEV4cHIgPSBGb2xsb3dlZEJ5KGxhc3RFeHByICsgb3BFeHByICsgbGFzdEV4cHIpICsgR3JvdXAoIGxhc3RFeHByICsgT25lT3JNb3JlKCBvcEV4cHIgKyBsYXN0RXhwciApICkNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICBtYXRjaEV4cHIgPSBGb2xsb3dlZEJ5KGxhc3RFeHByK2xhc3RFeHByKSArIEdyb3VwKCBsYXN0RXhwciArIE9uZU9yTW9yZShsYXN0RXhwcikgKQ0KICAgICAgICAgICAgZWxpZiBhcml0eSA9PSAzOg0KICAgICAgICAgICAgICAgIG1hdGNoRXhwciA9IEZvbGxvd2VkQnkobGFzdEV4cHIgKyBvcEV4cHIxICsgbGFzdEV4cHIgKyBvcEV4cHIyICsgbGFzdEV4cHIpICsgXA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwKCBsYXN0RXhwciArIG9wRXhwcjEgKyBsYXN0RXhwciArIG9wRXhwcjIgKyBsYXN0RXhwciApDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm9wZXJhdG9yIG11c3QgYmUgdW5hcnkgKDEpLCBiaW5hcnkgKDIpLCBvciB0ZXJuYXJ5ICgzKSIpDQogICAgICAgIGVsaWYgcmlnaHRMZWZ0QXNzb2MgPT0gb3BBc3NvYy5SSUdIVDoNCiAgICAgICAgICAgIGlmIGFyaXR5ID09IDE6DQogICAgICAgICAgICAgICAgIyB0cnkgdG8gYXZvaWQgTFIgd2l0aCB0aGlzIGV4dHJhIHRlc3QNCiAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvcEV4cHIsIE9wdGlvbmFsKToNCiAgICAgICAgICAgICAgICAgICAgb3BFeHByID0gT3B0aW9uYWwob3BFeHByKQ0KICAgICAgICAgICAgICAgIG1hdGNoRXhwciA9IEZvbGxvd2VkQnkob3BFeHByLmV4cHIgKyB0aGlzRXhwcikgKyBHcm91cCggb3BFeHByICsgdGhpc0V4cHIgKQ0KICAgICAgICAgICAgZWxpZiBhcml0eSA9PSAyOg0KICAgICAgICAgICAgICAgIGlmIG9wRXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgICAgICAgICAgbWF0Y2hFeHByID0gRm9sbG93ZWRCeShsYXN0RXhwciArIG9wRXhwciArIHRoaXNFeHByKSArIEdyb3VwKCBsYXN0RXhwciArIE9uZU9yTW9yZSggb3BFeHByICsgdGhpc0V4cHIgKSApDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgbWF0Y2hFeHByID0gRm9sbG93ZWRCeShsYXN0RXhwciArIHRoaXNFeHByKSArIEdyb3VwKCBsYXN0RXhwciArIE9uZU9yTW9yZSggdGhpc0V4cHIgKSApDQogICAgICAgICAgICBlbGlmIGFyaXR5ID09IDM6DQogICAgICAgICAgICAgICAgbWF0Y2hFeHByID0gRm9sbG93ZWRCeShsYXN0RXhwciArIG9wRXhwcjEgKyB0aGlzRXhwciArIG9wRXhwcjIgKyB0aGlzRXhwcikgKyBcDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXAoIGxhc3RFeHByICsgb3BFeHByMSArIHRoaXNFeHByICsgb3BFeHByMiArIHRoaXNFeHByICkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigib3BlcmF0b3IgbXVzdCBiZSB1bmFyeSAoMSksIGJpbmFyeSAoMiksIG9yIHRlcm5hcnkgKDMpIikNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm9wZXJhdG9yIG11c3QgaW5kaWNhdGUgcmlnaHQgb3IgbGVmdCBhc3NvY2lhdGl2aXR5IikNCiAgICAgICAgaWYgcGE6DQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHBhLCAodHVwbGUsIGxpc3QpKToNCiAgICAgICAgICAgICAgICBtYXRjaEV4cHIuc2V0UGFyc2VBY3Rpb24oKnBhKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBtYXRjaEV4cHIuc2V0UGFyc2VBY3Rpb24ocGEpDQogICAgICAgIHRoaXNFeHByIDw8PSAoIG1hdGNoRXhwci5zZXROYW1lKHRlcm1OYW1lKSB8IGxhc3RFeHByICkNCiAgICAgICAgbGFzdEV4cHIgPSB0aGlzRXhwcg0KICAgIHJldCA8PD0gbGFzdEV4cHINCiAgICByZXR1cm4gcmV0DQoNCm9wZXJhdG9yUHJlY2VkZW5jZSA9IGluZml4Tm90YXRpb24NCiIiIihEZXByZWNhdGVkKSBGb3JtZXIgbmFtZSBvZiBDe0x7aW5maXhOb3RhdGlvbn19LCB3aWxsIGJlIGRyb3BwZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS4iIiINCg0KZGJsUXVvdGVkU3RyaW5nID0gQ29tYmluZShSZWdleChyJyIoPzpbXiJcblxyXFxdfCg/OiIiKXwoPzpcXCg/OlteeF18eFswLTlhLWZBLUZdKykpKSonKSsnIicpLnNldE5hbWUoInN0cmluZyBlbmNsb3NlZCBpbiBkb3VibGUgcXVvdGVzIikNCnNnbFF1b3RlZFN0cmluZyA9IENvbWJpbmUoUmVnZXgociInKD86W14nXG5cclxcXXwoPzonJyl8KD86XFwoPzpbXnhdfHhbMC05YS1mQS1GXSspKSkqIikrIiciKS5zZXROYW1lKCJzdHJpbmcgZW5jbG9zZWQgaW4gc2luZ2xlIHF1b3RlcyIpDQpxdW90ZWRTdHJpbmcgPSBDb21iaW5lKFJlZ2V4KHInIig/OlteIlxuXHJcXF18KD86IiIpfCg/OlxcKD86W154XXx4WzAtOWEtZkEtRl0rKSkpKicpKyciJ3wNCiAgICAgICAgICAgICAgICAgICAgICAgUmVnZXgociInKD86W14nXG5cclxcXXwoPzonJyl8KD86XFwoPzpbXnhdfHhbMC05YS1mQS1GXSspKSkqIikrIiciKS5zZXROYW1lKCJxdW90ZWRTdHJpbmcgdXNpbmcgc2luZ2xlIG9yIGRvdWJsZSBxdW90ZXMiKQ0KdW5pY29kZVN0cmluZyA9IENvbWJpbmUoX0woJ3UnKSArIHF1b3RlZFN0cmluZy5jb3B5KCkpLnNldE5hbWUoInVuaWNvZGUgc3RyaW5nIGxpdGVyYWwiKQ0KDQpkZWYgbmVzdGVkRXhwcihvcGVuZXI9IigiLCBjbG9zZXI9IikiLCBjb250ZW50PU5vbmUsIGlnbm9yZUV4cHI9cXVvdGVkU3RyaW5nLmNvcHkoKSk6DQogICAgIiIiDQogICAgSGVscGVyIG1ldGhvZCBmb3IgZGVmaW5pbmcgbmVzdGVkIGxpc3RzIGVuY2xvc2VkIGluIG9wZW5pbmcgYW5kIGNsb3NpbmcNCiAgICBkZWxpbWl0ZXJzICgiKCIgYW5kICIpIiBhcmUgdGhlIGRlZmF1bHQpLg0KDQogICAgUGFyYW1ldGVyczoNCiAgICAgLSBvcGVuZXIgLSBvcGVuaW5nIGNoYXJhY3RlciBmb3IgYSBuZXN0ZWQgbGlzdCAoZGVmYXVsdD1DeyIoIn0pOyBjYW4gYWxzbyBiZSBhIHB5cGFyc2luZyBleHByZXNzaW9uDQogICAgIC0gY2xvc2VyIC0gY2xvc2luZyBjaGFyYWN0ZXIgZm9yIGEgbmVzdGVkIGxpc3QgKGRlZmF1bHQ9Q3siKSJ9KTsgY2FuIGFsc28gYmUgYSBweXBhcnNpbmcgZXhwcmVzc2lvbg0KICAgICAtIGNvbnRlbnQgLSBleHByZXNzaW9uIGZvciBpdGVtcyB3aXRoaW4gdGhlIG5lc3RlZCBsaXN0cyAoZGVmYXVsdD1De05vbmV9KQ0KICAgICAtIGlnbm9yZUV4cHIgLSBleHByZXNzaW9uIGZvciBpZ25vcmluZyBvcGVuaW5nIGFuZCBjbG9zaW5nIGRlbGltaXRlcnMgKGRlZmF1bHQ9Q3txdW90ZWRTdHJpbmd9KQ0KDQogICAgSWYgYW4gZXhwcmVzc2lvbiBpcyBub3QgcHJvdmlkZWQgZm9yIHRoZSBjb250ZW50IGFyZ3VtZW50LCB0aGUgbmVzdGVkDQogICAgZXhwcmVzc2lvbiB3aWxsIGNhcHR1cmUgYWxsIHdoaXRlc3BhY2UtZGVsaW1pdGVkIGNvbnRlbnQgYmV0d2VlbiBkZWxpbWl0ZXJzDQogICAgYXMgYSBsaXN0IG9mIHNlcGFyYXRlIHZhbHVlcy4NCg0KICAgIFVzZSB0aGUgQ3tpZ25vcmVFeHByfSBhcmd1bWVudCB0byBkZWZpbmUgZXhwcmVzc2lvbnMgdGhhdCBtYXkgY29udGFpbg0KICAgIG9wZW5pbmcgb3IgY2xvc2luZyBjaGFyYWN0ZXJzIHRoYXQgc2hvdWxkIG5vdCBiZSB0cmVhdGVkIGFzIG9wZW5pbmcNCiAgICBvciBjbG9zaW5nIGNoYXJhY3RlcnMgZm9yIG5lc3RpbmcsIHN1Y2ggYXMgcXVvdGVkU3RyaW5nIG9yIGEgY29tbWVudA0KICAgIGV4cHJlc3Npb24uICBTcGVjaWZ5IG11bHRpcGxlIGV4cHJlc3Npb25zIHVzaW5nIGFuIEN7THtPcn19IG9yIEN7THtNYXRjaEZpcnN0fX0uDQogICAgVGhlIGRlZmF1bHQgaXMgTHtxdW90ZWRTdHJpbmd9LCBidXQgaWYgbm8gZXhwcmVzc2lvbnMgYXJlIHRvIGJlIGlnbm9yZWQsDQogICAgdGhlbiBwYXNzIEN7Tm9uZX0gZm9yIHRoaXMgYXJndW1lbnQuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgZGF0YV90eXBlID0gb25lT2YoInZvaWQgaW50IHNob3J0IGxvbmcgY2hhciBmbG9hdCBkb3VibGUiKQ0KICAgICAgICBkZWNsX2RhdGFfdHlwZSA9IENvbWJpbmUoZGF0YV90eXBlICsgT3B0aW9uYWwoV29yZCgnKicpKSkNCiAgICAgICAgaWRlbnQgPSBXb3JkKGFscGhhcysnXycsIGFscGhhbnVtcysnXycpDQogICAgICAgIG51bWJlciA9IHB5cGFyc2luZ19jb21tb24ubnVtYmVyDQogICAgICAgIGFyZyA9IEdyb3VwKGRlY2xfZGF0YV90eXBlICsgaWRlbnQpDQogICAgICAgIExQQVIsUlBBUiA9IG1hcChTdXBwcmVzcywgIigpIikNCg0KICAgICAgICBjb2RlX2JvZHkgPSBuZXN0ZWRFeHByKCd7JywgJ30nLCBpZ25vcmVFeHByPShxdW90ZWRTdHJpbmcgfCBjU3R5bGVDb21tZW50KSkNCg0KICAgICAgICBjX2Z1bmN0aW9uID0gKGRlY2xfZGF0YV90eXBlKCJ0eXBlIikgDQogICAgICAgICAgICAgICAgICAgICAgKyBpZGVudCgibmFtZSIpDQogICAgICAgICAgICAgICAgICAgICAgKyBMUEFSICsgT3B0aW9uYWwoZGVsaW1pdGVkTGlzdChhcmcpLCBbXSkoImFyZ3MiKSArIFJQQVIgDQogICAgICAgICAgICAgICAgICAgICAgKyBjb2RlX2JvZHkoImJvZHkiKSkNCiAgICAgICAgY19mdW5jdGlvbi5pZ25vcmUoY1N0eWxlQ29tbWVudCkNCiAgICAgICAgDQogICAgICAgIHNvdXJjZV9jb2RlID0gJycnDQogICAgICAgICAgICBpbnQgaXNfb2RkKGludCB4KSB7IA0KICAgICAgICAgICAgICAgIHJldHVybiAoeCUyKTsgDQogICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICBpbnQgZGVjX3RvX2hleChjaGFyIGhjaGFyKSB7IA0KICAgICAgICAgICAgICAgIGlmIChoY2hhciA+PSAnMCcgJiYgaGNoYXIgPD0gJzknKSB7IA0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG9yZChoY2hhciktb3JkKCcwJykpOyANCiAgICAgICAgICAgICAgICB9IGVsc2UgeyANCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgxMCtvcmQoaGNoYXIpLW9yZCgnQScpKTsNCiAgICAgICAgICAgICAgICB9IA0KICAgICAgICAgICAgfQ0KICAgICAgICAnJycNCiAgICAgICAgZm9yIGZ1bmMgaW4gY19mdW5jdGlvbi5zZWFyY2hTdHJpbmcoc291cmNlX2NvZGUpOg0KICAgICAgICAgICAgcHJpbnQoIiUobmFtZSlzICglKHR5cGUpcykgYXJnczogJShhcmdzKXMiICUgZnVuYykNCg0KICAgIHByaW50czo6DQogICAgICAgIGlzX29kZCAoaW50KSBhcmdzOiBbWydpbnQnLCAneCddXQ0KICAgICAgICBkZWNfdG9faGV4IChpbnQpIGFyZ3M6IFtbJ2NoYXInLCAnaGNoYXInXV0NCiAgICAiIiINCiAgICBpZiBvcGVuZXIgPT0gY2xvc2VyOg0KICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJvcGVuaW5nIGFuZCBjbG9zaW5nIHN0cmluZ3MgY2Fubm90IGJlIHRoZSBzYW1lIikNCiAgICBpZiBjb250ZW50IGlzIE5vbmU6DQogICAgICAgIGlmIGlzaW5zdGFuY2Uob3BlbmVyLGJhc2VzdHJpbmcpIGFuZCBpc2luc3RhbmNlKGNsb3NlcixiYXNlc3RyaW5nKToNCiAgICAgICAgICAgIGlmIGxlbihvcGVuZXIpID09IDEgYW5kIGxlbihjbG9zZXIpPT0xOg0KICAgICAgICAgICAgICAgIGlmIGlnbm9yZUV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSAoQ29tYmluZShPbmVPck1vcmUofmlnbm9yZUV4cHIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnNOb3RJbihvcGVuZXIrY2xvc2VyK1BhcnNlckVsZW1lbnQuREVGQVVMVF9XSElURV9DSEFSUyxleGFjdD0xKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdDp0WzBdLnN0cmlwKCkpKQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSAoZW1wdHkuY29weSgpK0NoYXJzTm90SW4ob3BlbmVyK2Nsb3NlcitQYXJzZXJFbGVtZW50LkRFRkFVTFRfV0hJVEVfQ0hBUlMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdDp0WzBdLnN0cmlwKCkpKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBpZiBpZ25vcmVFeHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gKENvbWJpbmUoT25lT3JNb3JlKH5pZ25vcmVFeHByICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+TGl0ZXJhbChvcGVuZXIpICsgfkxpdGVyYWwoY2xvc2VyKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyc05vdEluKFBhcnNlckVsZW1lbnQuREVGQVVMVF9XSElURV9DSEFSUyxleGFjdD0xKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdDp0WzBdLnN0cmlwKCkpKQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSAoQ29tYmluZShPbmVPck1vcmUofkxpdGVyYWwob3BlbmVyKSArIH5MaXRlcmFsKGNsb3NlcikgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnNOb3RJbihQYXJzZXJFbGVtZW50LkRFRkFVTFRfV0hJVEVfQ0hBUlMsZXhhY3Q9MSkpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHQ6dFswXS5zdHJpcCgpKSkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm9wZW5pbmcgYW5kIGNsb3NpbmcgYXJndW1lbnRzIG11c3QgYmUgc3RyaW5ncyBpZiBubyBjb250ZW50IGV4cHJlc3Npb24gaXMgZ2l2ZW4iKQ0KICAgIHJldCA9IEZvcndhcmQoKQ0KICAgIGlmIGlnbm9yZUV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgIHJldCA8PD0gR3JvdXAoIFN1cHByZXNzKG9wZW5lcikgKyBaZXJvT3JNb3JlKCBpZ25vcmVFeHByIHwgcmV0IHwgY29udGVudCApICsgU3VwcHJlc3MoY2xvc2VyKSApDQogICAgZWxzZToNCiAgICAgICAgcmV0IDw8PSBHcm91cCggU3VwcHJlc3Mob3BlbmVyKSArIFplcm9Pck1vcmUoIHJldCB8IGNvbnRlbnQgKSAgKyBTdXBwcmVzcyhjbG9zZXIpICkNCiAgICByZXQuc2V0TmFtZSgnbmVzdGVkICVzJXMgZXhwcmVzc2lvbicgJSAob3BlbmVyLGNsb3NlcikpDQogICAgcmV0dXJuIHJldA0KDQpkZWYgaW5kZW50ZWRCbG9jayhibG9ja1N0YXRlbWVudEV4cHIsIGluZGVudFN0YWNrLCBpbmRlbnQ9VHJ1ZSk6DQogICAgIiIiDQogICAgSGVscGVyIG1ldGhvZCBmb3IgZGVmaW5pbmcgc3BhY2UtZGVsaW1pdGVkIGluZGVudGF0aW9uIGJsb2Nrcywgc3VjaCBhcw0KICAgIHRob3NlIHVzZWQgdG8gZGVmaW5lIGJsb2NrIHN0YXRlbWVudHMgaW4gUHl0aG9uIHNvdXJjZSBjb2RlLg0KDQogICAgUGFyYW1ldGVyczoNCiAgICAgLSBibG9ja1N0YXRlbWVudEV4cHIgLSBleHByZXNzaW9uIGRlZmluaW5nIHN5bnRheCBvZiBzdGF0ZW1lbnQgdGhhdA0KICAgICAgICAgICAgaXMgcmVwZWF0ZWQgd2l0aGluIHRoZSBpbmRlbnRlZCBibG9jaw0KICAgICAtIGluZGVudFN0YWNrIC0gbGlzdCBjcmVhdGVkIGJ5IGNhbGxlciB0byBtYW5hZ2UgaW5kZW50YXRpb24gc3RhY2sNCiAgICAgICAgICAgIChtdWx0aXBsZSBzdGF0ZW1lbnRXaXRoSW5kZW50ZWRCbG9jayBleHByZXNzaW9ucyB3aXRoaW4gYSBzaW5nbGUgZ3JhbW1hcg0KICAgICAgICAgICAgc2hvdWxkIHNoYXJlIGEgY29tbW9uIGluZGVudFN0YWNrKQ0KICAgICAtIGluZGVudCAtIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGJsb2NrIG11c3QgYmUgaW5kZW50ZWQgYmV5b25kIHRoZQ0KICAgICAgICAgICAgdGhlIGN1cnJlbnQgbGV2ZWw7IHNldCB0byBGYWxzZSBmb3IgYmxvY2sgb2YgbGVmdC1tb3N0IHN0YXRlbWVudHMNCiAgICAgICAgICAgIChkZWZhdWx0PUN7VHJ1ZX0pDQoNCiAgICBBIHZhbGlkIGJsb2NrIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgQ3tibG9ja1N0YXRlbWVudH0uDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgZGF0YSA9ICcnJw0KICAgICAgICBkZWYgQSh6KToNCiAgICAgICAgICBBMQ0KICAgICAgICAgIEIgPSAxMDANCiAgICAgICAgICBHID0gQTINCiAgICAgICAgICBBMg0KICAgICAgICAgIEEzDQogICAgICAgIEINCiAgICAgICAgZGVmIEJCKGEsYixjKToNCiAgICAgICAgICBCQjENCiAgICAgICAgICBkZWYgQkJBKCk6DQogICAgICAgICAgICBiYmExDQogICAgICAgICAgICBiYmEyDQogICAgICAgICAgICBiYmEzDQogICAgICAgIEMNCiAgICAgICAgRA0KICAgICAgICBkZWYgc3BhbSh4LHkpOg0KICAgICAgICAgICAgIGRlZiBlZ2dzKHopOg0KICAgICAgICAgICAgICAgICBwYXNzDQogICAgICAgICcnJw0KDQoNCiAgICAgICAgaW5kZW50U3RhY2sgPSBbMV0NCiAgICAgICAgc3RtdCA9IEZvcndhcmQoKQ0KDQogICAgICAgIGlkZW50aWZpZXIgPSBXb3JkKGFscGhhcywgYWxwaGFudW1zKQ0KICAgICAgICBmdW5jRGVjbCA9ICgiZGVmIiArIGlkZW50aWZpZXIgKyBHcm91cCggIigiICsgT3B0aW9uYWwoIGRlbGltaXRlZExpc3QoaWRlbnRpZmllcikgKSArICIpIiApICsgIjoiKQ0KICAgICAgICBmdW5jX2JvZHkgPSBpbmRlbnRlZEJsb2NrKHN0bXQsIGluZGVudFN0YWNrKQ0KICAgICAgICBmdW5jRGVmID0gR3JvdXAoIGZ1bmNEZWNsICsgZnVuY19ib2R5ICkNCg0KICAgICAgICBydmFsdWUgPSBGb3J3YXJkKCkNCiAgICAgICAgZnVuY0NhbGwgPSBHcm91cChpZGVudGlmaWVyICsgIigiICsgT3B0aW9uYWwoZGVsaW1pdGVkTGlzdChydmFsdWUpKSArICIpIikNCiAgICAgICAgcnZhbHVlIDw8IChmdW5jQ2FsbCB8IGlkZW50aWZpZXIgfCBXb3JkKG51bXMpKQ0KICAgICAgICBhc3NpZ25tZW50ID0gR3JvdXAoaWRlbnRpZmllciArICI9IiArIHJ2YWx1ZSkNCiAgICAgICAgc3RtdCA8PCAoIGZ1bmNEZWYgfCBhc3NpZ25tZW50IHwgaWRlbnRpZmllciApDQoNCiAgICAgICAgbW9kdWxlX2JvZHkgPSBPbmVPck1vcmUoc3RtdCkNCg0KICAgICAgICBwYXJzZVRyZWUgPSBtb2R1bGVfYm9keS5wYXJzZVN0cmluZyhkYXRhKQ0KICAgICAgICBwYXJzZVRyZWUucHByaW50KCkNCiAgICBwcmludHM6Og0KICAgICAgICBbWydkZWYnLA0KICAgICAgICAgICdBJywNCiAgICAgICAgICBbJygnLCAneicsICcpJ10sDQogICAgICAgICAgJzonLA0KICAgICAgICAgIFtbJ0ExJ10sIFtbJ0InLCAnPScsICcxMDAnXV0sIFtbJ0cnLCAnPScsICdBMiddXSwgWydBMiddLCBbJ0EzJ11dXSwNCiAgICAgICAgICdCJywNCiAgICAgICAgIFsnZGVmJywNCiAgICAgICAgICAnQkInLA0KICAgICAgICAgIFsnKCcsICdhJywgJ2InLCAnYycsICcpJ10sDQogICAgICAgICAgJzonLA0KICAgICAgICAgIFtbJ0JCMSddLCBbWydkZWYnLCAnQkJBJywgWycoJywgJyknXSwgJzonLCBbWydiYmExJ10sIFsnYmJhMiddLCBbJ2JiYTMnXV1dXV1dLA0KICAgICAgICAgJ0MnLA0KICAgICAgICAgJ0QnLA0KICAgICAgICAgWydkZWYnLA0KICAgICAgICAgICdzcGFtJywNCiAgICAgICAgICBbJygnLCAneCcsICd5JywgJyknXSwNCiAgICAgICAgICAnOicsDQogICAgICAgICAgW1tbJ2RlZicsICdlZ2dzJywgWycoJywgJ3onLCAnKSddLCAnOicsIFtbJ3Bhc3MnXV1dXV1dXSANCiAgICAiIiINCiAgICBkZWYgY2hlY2tQZWVySW5kZW50KHMsbCx0KToNCiAgICAgICAgaWYgbCA+PSBsZW4ocyk6IHJldHVybg0KICAgICAgICBjdXJDb2wgPSBjb2wobCxzKQ0KICAgICAgICBpZiBjdXJDb2wgIT0gaW5kZW50U3RhY2tbLTFdOg0KICAgICAgICAgICAgaWYgY3VyQ29sID4gaW5kZW50U3RhY2tbLTFdOg0KICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRmF0YWxFeGNlcHRpb24ocyxsLCJpbGxlZ2FsIG5lc3RpbmciKQ0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24ocyxsLCJub3QgYSBwZWVyIGVudHJ5IikNCg0KICAgIGRlZiBjaGVja1N1YkluZGVudChzLGwsdCk6DQogICAgICAgIGN1ckNvbCA9IGNvbChsLHMpDQogICAgICAgIGlmIGN1ckNvbCA+IGluZGVudFN0YWNrWy0xXToNCiAgICAgICAgICAgIGluZGVudFN0YWNrLmFwcGVuZCggY3VyQ29sICkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKHMsbCwibm90IGEgc3ViZW50cnkiKQ0KDQogICAgZGVmIGNoZWNrVW5pbmRlbnQocyxsLHQpOg0KICAgICAgICBpZiBsID49IGxlbihzKTogcmV0dXJuDQogICAgICAgIGN1ckNvbCA9IGNvbChsLHMpDQogICAgICAgIGlmIG5vdChpbmRlbnRTdGFjayBhbmQgY3VyQ29sIDwgaW5kZW50U3RhY2tbLTFdIGFuZCBjdXJDb2wgPD0gaW5kZW50U3RhY2tbLTJdKToNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKHMsbCwibm90IGFuIHVuaW5kZW50IikNCiAgICAgICAgaW5kZW50U3RhY2sucG9wKCkNCg0KICAgIE5MID0gT25lT3JNb3JlKExpbmVFbmQoKS5zZXRXaGl0ZXNwYWNlQ2hhcnMoIlx0ICIpLnN1cHByZXNzKCkpDQogICAgSU5ERU5UID0gKEVtcHR5KCkgKyBFbXB0eSgpLnNldFBhcnNlQWN0aW9uKGNoZWNrU3ViSW5kZW50KSkuc2V0TmFtZSgnSU5ERU5UJykNCiAgICBQRUVSICAgPSBFbXB0eSgpLnNldFBhcnNlQWN0aW9uKGNoZWNrUGVlckluZGVudCkuc2V0TmFtZSgnJykNCiAgICBVTkRFTlQgPSBFbXB0eSgpLnNldFBhcnNlQWN0aW9uKGNoZWNrVW5pbmRlbnQpLnNldE5hbWUoJ1VOSU5ERU5UJykNCiAgICBpZiBpbmRlbnQ6DQogICAgICAgIHNtRXhwciA9IEdyb3VwKCBPcHRpb25hbChOTCkgKw0KICAgICAgICAgICAgI34gRm9sbG93ZWRCeShibG9ja1N0YXRlbWVudEV4cHIpICsNCiAgICAgICAgICAgIElOREVOVCArIChPbmVPck1vcmUoIFBFRVIgKyBHcm91cChibG9ja1N0YXRlbWVudEV4cHIpICsgT3B0aW9uYWwoTkwpICkpICsgVU5ERU5UKQ0KICAgIGVsc2U6DQogICAgICAgIHNtRXhwciA9IEdyb3VwKCBPcHRpb25hbChOTCkgKw0KICAgICAgICAgICAgKE9uZU9yTW9yZSggUEVFUiArIEdyb3VwKGJsb2NrU3RhdGVtZW50RXhwcikgKyBPcHRpb25hbChOTCkgKSkgKQ0KICAgIGJsb2NrU3RhdGVtZW50RXhwci5pZ25vcmUoX2JzbGFzaCArIExpbmVFbmQoKSkNCiAgICByZXR1cm4gc21FeHByLnNldE5hbWUoJ2luZGVudGVkIGJsb2NrJykNCg0KYWxwaGFzOGJpdCA9IHNyYW5nZShyIltcMHhjMC1cMHhkNlwweGQ4LVwweGY2XDB4ZjgtXDB4ZmZdIikNCnB1bmM4Yml0ID0gc3JhbmdlKHIiW1wweGExLVwweGJmXDB4ZDdcMHhmN10iKQ0KDQphbnlPcGVuVGFnLGFueUNsb3NlVGFnID0gbWFrZUhUTUxUYWdzKFdvcmQoYWxwaGFzLGFscGhhbnVtcysiXzoiKS5zZXROYW1lKCdhbnkgdGFnJykpDQpfaHRtbEVudGl0eU1hcCA9IGRpY3QoemlwKCJndCBsdCBhbXAgbmJzcCBxdW90IGFwb3MiLnNwbGl0KCksJz48JiAiXCcnKSkNCmNvbW1vbkhUTUxFbnRpdHkgPSBSZWdleCgnJig/UDxlbnRpdHk+JyArICd8Jy5qb2luKF9odG1sRW50aXR5TWFwLmtleXMoKSkgKyIpOyIpLnNldE5hbWUoImNvbW1vbiBIVE1MIGVudGl0eSIpDQpkZWYgcmVwbGFjZUhUTUxFbnRpdHkodCk6DQogICAgIiIiSGVscGVyIHBhcnNlciBhY3Rpb24gdG8gcmVwbGFjZSBjb21tb24gSFRNTCBlbnRpdGllcyB3aXRoIHRoZWlyIHNwZWNpYWwgY2hhcmFjdGVycyIiIg0KICAgIHJldHVybiBfaHRtbEVudGl0eU1hcC5nZXQodC5lbnRpdHkpDQoNCiMgaXQncyBlYXN5IHRvIGdldCB0aGVzZSBjb21tZW50IHN0cnVjdHVyZXMgd3JvbmcgLSB0aGV5J3JlIHZlcnkgY29tbW9uLCBzbyBtYXkgYXMgd2VsbCBtYWtlIHRoZW0gYXZhaWxhYmxlDQpjU3R5bGVDb21tZW50ID0gQ29tYmluZShSZWdleChyIi9cKig/OlteKl18XCooPyEvKSkqIikgKyAnKi8nKS5zZXROYW1lKCJDIHN0eWxlIGNvbW1lbnQiKQ0KIkNvbW1lbnQgb2YgdGhlIGZvcm0gQ3svKiAuLi4gKi99Ig0KDQpodG1sQ29tbWVudCA9IFJlZ2V4KHIiPCEtLVtcc1xTXSo/LS0+Iikuc2V0TmFtZSgiSFRNTCBjb21tZW50IikNCiJDb21tZW50IG9mIHRoZSBmb3JtIEN7PCEtLSAuLi4gLS0+fSINCg0KcmVzdE9mTGluZSA9IFJlZ2V4KHIiLioiKS5sZWF2ZVdoaXRlc3BhY2UoKS5zZXROYW1lKCJyZXN0IG9mIGxpbmUiKQ0KZGJsU2xhc2hDb21tZW50ID0gUmVnZXgociIvLyg/OlxcXG58W15cbl0pKiIpLnNldE5hbWUoIi8vIGNvbW1lbnQiKQ0KIkNvbW1lbnQgb2YgdGhlIGZvcm0gQ3svLyAuLi4gKHRvIGVuZCBvZiBsaW5lKX0iDQoNCmNwcFN0eWxlQ29tbWVudCA9IENvbWJpbmUoUmVnZXgociIvXCooPzpbXipdfFwqKD8hLykpKiIpICsgJyovJ3wgZGJsU2xhc2hDb21tZW50KS5zZXROYW1lKCJDKysgc3R5bGUgY29tbWVudCIpDQoiQ29tbWVudCBvZiBlaXRoZXIgZm9ybSBDe0x7Y1N0eWxlQ29tbWVudH19IG9yIEN7THtkYmxTbGFzaENvbW1lbnR9fSINCg0KamF2YVN0eWxlQ29tbWVudCA9IGNwcFN0eWxlQ29tbWVudA0KIlNhbWUgYXMgQ3tMe2NwcFN0eWxlQ29tbWVudH19Ig0KDQpweXRob25TdHlsZUNvbW1lbnQgPSBSZWdleChyIiMuKiIpLnNldE5hbWUoIlB5dGhvbiBzdHlsZSBjb21tZW50IikNCiJDb21tZW50IG9mIHRoZSBmb3JtIEN7IyAuLi4gKHRvIGVuZCBvZiBsaW5lKX0iDQoNCl9jb21tYXNlcGl0ZW0gPSBDb21iaW5lKE9uZU9yTW9yZShXb3JkKHByaW50YWJsZXMsIGV4Y2x1ZGVDaGFycz0nLCcpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbCggV29yZCgiIFx0IikgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+TGl0ZXJhbCgiLCIpICsgfkxpbmVFbmQoKSApICkgKS5zdHJlYW1saW5lKCkuc2V0TmFtZSgiY29tbWFJdGVtIikNCmNvbW1hU2VwYXJhdGVkTGlzdCA9IGRlbGltaXRlZExpc3QoIE9wdGlvbmFsKCBxdW90ZWRTdHJpbmcuY29weSgpIHwgX2NvbW1hc2VwaXRlbSwgZGVmYXVsdD0iIikgKS5zZXROYW1lKCJjb21tYVNlcGFyYXRlZExpc3QiKQ0KIiIiKERlcHJlY2F0ZWQpIFByZWRlZmluZWQgZXhwcmVzc2lvbiBvZiAxIG9yIG1vcmUgcHJpbnRhYmxlIHdvcmRzIG9yIHF1b3RlZCBzdHJpbmdzLCBzZXBhcmF0ZWQgYnkgY29tbWFzLg0KICAgVGhpcyBleHByZXNzaW9uIGlzIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgTHtweXBhcnNpbmdfY29tbW9uLmNvbW1hX3NlcGFyYXRlZF9saXN0fS4iIiINCg0KIyBzb21lIG90aGVyIHVzZWZ1bCBleHByZXNzaW9ucyAtIHVzaW5nIGxvd2VyLWNhc2UgY2xhc3MgbmFtZSBzaW5jZSB3ZSBhcmUgcmVhbGx5IHVzaW5nIHRoaXMgYXMgYSBuYW1lc3BhY2UNCmNsYXNzIHB5cGFyc2luZ19jb21tb246DQogICAgIiIiDQogICAgSGVyZSBhcmUgc29tZSBjb21tb24gbG93LWxldmVsIGV4cHJlc3Npb25zIHRoYXQgbWF5IGJlIHVzZWZ1bCBpbiBqdW1wLXN0YXJ0aW5nIHBhcnNlciBkZXZlbG9wbWVudDoNCiAgICAgLSBudW1lcmljIGZvcm1zIChMe2ludGVnZXJzPGludGVnZXI+fSwgTHtyZWFsczxyZWFsPn0sIEx7c2NpZW50aWZpYyBub3RhdGlvbjxzY2lfcmVhbD59KQ0KICAgICAtIGNvbW1vbiBMe3Byb2dyYW1taW5nIGlkZW50aWZpZXJzPGlkZW50aWZpZXI+fQ0KICAgICAtIG5ldHdvcmsgYWRkcmVzc2VzIChMe01BQzxtYWNfYWRkcmVzcz59LCBMe0lQdjQ8aXB2NF9hZGRyZXNzPn0sIEx7SVB2NjxpcHY2X2FkZHJlc3M+fSkNCiAgICAgLSBJU084NjAxIEx7ZGF0ZXM8aXNvODYwMV9kYXRlPn0gYW5kIEx7ZGF0ZXRpbWU8aXNvODYwMV9kYXRldGltZT59DQogICAgIC0gTHtVVUlEPHV1aWQ+fQ0KICAgICAtIEx7Y29tbWEtc2VwYXJhdGVkIGxpc3Q8Y29tbWFfc2VwYXJhdGVkX2xpc3Q+fQ0KICAgIFBhcnNlIGFjdGlvbnM6DQogICAgIC0gQ3tMe2NvbnZlcnRUb0ludGVnZXJ9fQ0KICAgICAtIEN7THtjb252ZXJ0VG9GbG9hdH19DQogICAgIC0gQ3tMe2NvbnZlcnRUb0RhdGV9fQ0KICAgICAtIEN7THtjb252ZXJ0VG9EYXRldGltZX19DQogICAgIC0gQ3tMe3N0cmlwSFRNTFRhZ3N9fQ0KICAgICAtIEN7THt1cGNhc2VUb2tlbnN9fQ0KICAgICAtIEN7THtkb3duY2FzZVRva2Vuc319DQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgcHlwYXJzaW5nX2NvbW1vbi5udW1iZXIucnVuVGVzdHMoJycnDQogICAgICAgICAgICAjIGFueSBpbnQgb3IgcmVhbCBudW1iZXIsIHJldHVybmVkIGFzIHRoZSBhcHByb3ByaWF0ZSB0eXBlDQogICAgICAgICAgICAxMDANCiAgICAgICAgICAgIC0xMDANCiAgICAgICAgICAgICsxMDANCiAgICAgICAgICAgIDMuMTQxNTkNCiAgICAgICAgICAgIDYuMDJlMjMNCiAgICAgICAgICAgIDFlLTEyDQogICAgICAgICAgICAnJycpDQoNCiAgICAgICAgcHlwYXJzaW5nX2NvbW1vbi5mbnVtYmVyLnJ1blRlc3RzKCcnJw0KICAgICAgICAgICAgIyBhbnkgaW50IG9yIHJlYWwgbnVtYmVyLCByZXR1cm5lZCBhcyBmbG9hdA0KICAgICAgICAgICAgMTAwDQogICAgICAgICAgICAtMTAwDQogICAgICAgICAgICArMTAwDQogICAgICAgICAgICAzLjE0MTU5DQogICAgICAgICAgICA2LjAyZTIzDQogICAgICAgICAgICAxZS0xMg0KICAgICAgICAgICAgJycnKQ0KDQogICAgICAgIHB5cGFyc2luZ19jb21tb24uaGV4X2ludGVnZXIucnVuVGVzdHMoJycnDQogICAgICAgICAgICAjIGhleCBudW1iZXJzDQogICAgICAgICAgICAxMDANCiAgICAgICAgICAgIEZGDQogICAgICAgICAgICAnJycpDQoNCiAgICAgICAgcHlwYXJzaW5nX2NvbW1vbi5mcmFjdGlvbi5ydW5UZXN0cygnJycNCiAgICAgICAgICAgICMgZnJhY3Rpb25zDQogICAgICAgICAgICAxLzINCiAgICAgICAgICAgIC0zLzQNCiAgICAgICAgICAgICcnJykNCg0KICAgICAgICBweXBhcnNpbmdfY29tbW9uLm1peGVkX2ludGVnZXIucnVuVGVzdHMoJycnDQogICAgICAgICAgICAjIG1peGVkIGZyYWN0aW9ucw0KICAgICAgICAgICAgMQ0KICAgICAgICAgICAgMS8yDQogICAgICAgICAgICAtMy80DQogICAgICAgICAgICAxLTMvNA0KICAgICAgICAgICAgJycnKQ0KDQogICAgICAgIGltcG9ydCB1dWlkDQogICAgICAgIHB5cGFyc2luZ19jb21tb24udXVpZC5zZXRQYXJzZUFjdGlvbih0b2tlbk1hcCh1dWlkLlVVSUQpKQ0KICAgICAgICBweXBhcnNpbmdfY29tbW9uLnV1aWQucnVuVGVzdHMoJycnDQogICAgICAgICAgICAjIHV1aWQNCiAgICAgICAgICAgIDEyMzQ1Njc4LTEyMzQtNTY3OC0xMjM0LTU2NzgxMjM0NTY3OA0KICAgICAgICAgICAgJycnKQ0KICAgIHByaW50czo6DQogICAgICAgICMgYW55IGludCBvciByZWFsIG51bWJlciwgcmV0dXJuZWQgYXMgdGhlIGFwcHJvcHJpYXRlIHR5cGUNCiAgICAgICAgMTAwDQogICAgICAgIFsxMDBdDQoNCiAgICAgICAgLTEwMA0KICAgICAgICBbLTEwMF0NCg0KICAgICAgICArMTAwDQogICAgICAgIFsxMDBdDQoNCiAgICAgICAgMy4xNDE1OQ0KICAgICAgICBbMy4xNDE1OV0NCg0KICAgICAgICA2LjAyZTIzDQogICAgICAgIFs2LjAyZSsyM10NCg0KICAgICAgICAxZS0xMg0KICAgICAgICBbMWUtMTJdDQoNCiAgICAgICAgIyBhbnkgaW50IG9yIHJlYWwgbnVtYmVyLCByZXR1cm5lZCBhcyBmbG9hdA0KICAgICAgICAxMDANCiAgICAgICAgWzEwMC4wXQ0KDQogICAgICAgIC0xMDANCiAgICAgICAgWy0xMDAuMF0NCg0KICAgICAgICArMTAwDQogICAgICAgIFsxMDAuMF0NCg0KICAgICAgICAzLjE0MTU5DQogICAgICAgIFszLjE0MTU5XQ0KDQogICAgICAgIDYuMDJlMjMNCiAgICAgICAgWzYuMDJlKzIzXQ0KDQogICAgICAgIDFlLTEyDQogICAgICAgIFsxZS0xMl0NCg0KICAgICAgICAjIGhleCBudW1iZXJzDQogICAgICAgIDEwMA0KICAgICAgICBbMjU2XQ0KDQogICAgICAgIEZGDQogICAgICAgIFsyNTVdDQoNCiAgICAgICAgIyBmcmFjdGlvbnMNCiAgICAgICAgMS8yDQogICAgICAgIFswLjVdDQoNCiAgICAgICAgLTMvNA0KICAgICAgICBbLTAuNzVdDQoNCiAgICAgICAgIyBtaXhlZCBmcmFjdGlvbnMNCiAgICAgICAgMQ0KICAgICAgICBbMV0NCg0KICAgICAgICAxLzINCiAgICAgICAgWzAuNV0NCg0KICAgICAgICAtMy80DQogICAgICAgIFstMC43NV0NCg0KICAgICAgICAxLTMvNA0KICAgICAgICBbMS43NV0NCg0KICAgICAgICAjIHV1aWQNCiAgICAgICAgMTIzNDU2NzgtMTIzNC01Njc4LTEyMzQtNTY3ODEyMzQ1Njc4DQogICAgICAgIFtVVUlEKCcxMjM0NTY3OC0xMjM0LTU2NzgtMTIzNC01Njc4MTIzNDU2NzgnKV0NCiAgICAiIiINCg0KICAgIGNvbnZlcnRUb0ludGVnZXIgPSB0b2tlbk1hcChpbnQpDQogICAgIiIiDQogICAgUGFyc2UgYWN0aW9uIGZvciBjb252ZXJ0aW5nIHBhcnNlZCBpbnRlZ2VycyB0byBQeXRob24gaW50DQogICAgIiIiDQoNCiAgICBjb252ZXJ0VG9GbG9hdCA9IHRva2VuTWFwKGZsb2F0KQ0KICAgICIiIg0KICAgIFBhcnNlIGFjdGlvbiBmb3IgY29udmVydGluZyBwYXJzZWQgbnVtYmVycyB0byBQeXRob24gZmxvYXQNCiAgICAiIiINCg0KICAgIGludGVnZXIgPSBXb3JkKG51bXMpLnNldE5hbWUoImludGVnZXIiKS5zZXRQYXJzZUFjdGlvbihjb252ZXJ0VG9JbnRlZ2VyKQ0KICAgICIiImV4cHJlc3Npb24gdGhhdCBwYXJzZXMgYW4gdW5zaWduZWQgaW50ZWdlciwgcmV0dXJucyBhbiBpbnQiIiINCg0KICAgIGhleF9pbnRlZ2VyID0gV29yZChoZXhudW1zKS5zZXROYW1lKCJoZXggaW50ZWdlciIpLnNldFBhcnNlQWN0aW9uKHRva2VuTWFwKGludCwxNikpDQogICAgIiIiZXhwcmVzc2lvbiB0aGF0IHBhcnNlcyBhIGhleGFkZWNpbWFsIGludGVnZXIsIHJldHVybnMgYW4gaW50IiIiDQoNCiAgICBzaWduZWRfaW50ZWdlciA9IFJlZ2V4KHInWystXT9cZCsnKS5zZXROYW1lKCJzaWduZWQgaW50ZWdlciIpLnNldFBhcnNlQWN0aW9uKGNvbnZlcnRUb0ludGVnZXIpDQogICAgIiIiZXhwcmVzc2lvbiB0aGF0IHBhcnNlcyBhbiBpbnRlZ2VyIHdpdGggb3B0aW9uYWwgbGVhZGluZyBzaWduLCByZXR1cm5zIGFuIGludCIiIg0KDQogICAgZnJhY3Rpb24gPSAoc2lnbmVkX2ludGVnZXIoKS5zZXRQYXJzZUFjdGlvbihjb252ZXJ0VG9GbG9hdCkgKyAnLycgKyBzaWduZWRfaW50ZWdlcigpLnNldFBhcnNlQWN0aW9uKGNvbnZlcnRUb0Zsb2F0KSkuc2V0TmFtZSgiZnJhY3Rpb24iKQ0KICAgICIiImZyYWN0aW9uYWwgZXhwcmVzc2lvbiBvZiBhbiBpbnRlZ2VyIGRpdmlkZWQgYnkgYW4gaW50ZWdlciwgcmV0dXJucyBhIGZsb2F0IiIiDQogICAgZnJhY3Rpb24uYWRkUGFyc2VBY3Rpb24obGFtYmRhIHQ6IHRbMF0vdFstMV0pDQoNCiAgICBtaXhlZF9pbnRlZ2VyID0gKGZyYWN0aW9uIHwgc2lnbmVkX2ludGVnZXIgKyBPcHRpb25hbChPcHRpb25hbCgnLScpLnN1cHByZXNzKCkgKyBmcmFjdGlvbikpLnNldE5hbWUoImZyYWN0aW9uIG9yIG1peGVkIGludGVnZXItZnJhY3Rpb24iKQ0KICAgICIiIm1peGVkIGludGVnZXIgb2YgdGhlIGZvcm0gJ2ludGVnZXIgLSBmcmFjdGlvbicsIHdpdGggb3B0aW9uYWwgbGVhZGluZyBpbnRlZ2VyLCByZXR1cm5zIGZsb2F0IiIiDQogICAgbWl4ZWRfaW50ZWdlci5hZGRQYXJzZUFjdGlvbihzdW0pDQoNCiAgICByZWFsID0gUmVnZXgocidbKy1dP1xkK1wuXGQqJykuc2V0TmFtZSgicmVhbCBudW1iZXIiKS5zZXRQYXJzZUFjdGlvbihjb252ZXJ0VG9GbG9hdCkNCiAgICAiIiJleHByZXNzaW9uIHRoYXQgcGFyc2VzIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGFuZCByZXR1cm5zIGEgZmxvYXQiIiINCg0KICAgIHNjaV9yZWFsID0gUmVnZXgocidbKy1dP1xkKyhbZUVdWystXT9cZCt8XC5cZCooW2VFXVsrLV0/XGQrKT8pJykuc2V0TmFtZSgicmVhbCBudW1iZXIgd2l0aCBzY2llbnRpZmljIG5vdGF0aW9uIikuc2V0UGFyc2VBY3Rpb24oY29udmVydFRvRmxvYXQpDQogICAgIiIiZXhwcmVzc2lvbiB0aGF0IHBhcnNlcyBhIGZsb2F0aW5nIHBvaW50IG51bWJlciB3aXRoIG9wdGlvbmFsIHNjaWVudGlmaWMgbm90YXRpb24gYW5kIHJldHVybnMgYSBmbG9hdCIiIg0KDQogICAgIyBzdHJlYW1saW5pbmcgdGhpcyBleHByZXNzaW9uIG1ha2VzIHRoZSBkb2NzIG5pY2VyLWxvb2tpbmcNCiAgICBudW1iZXIgPSAoc2NpX3JlYWwgfCByZWFsIHwgc2lnbmVkX2ludGVnZXIpLnN0cmVhbWxpbmUoKQ0KICAgICIiImFueSBudW1lcmljIGV4cHJlc3Npb24sIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgUHl0aG9uIHR5cGUiIiINCg0KICAgIGZudW1iZXIgPSBSZWdleChyJ1srLV0/XGQrXC4/XGQqKFtlRV1bKy1dP1xkKyk/Jykuc2V0TmFtZSgiZm51bWJlciIpLnNldFBhcnNlQWN0aW9uKGNvbnZlcnRUb0Zsb2F0KQ0KICAgICIiImFueSBpbnQgb3IgcmVhbCBudW1iZXIsIHJldHVybmVkIGFzIGZsb2F0IiIiDQogICAgDQogICAgaWRlbnRpZmllciA9IFdvcmQoYWxwaGFzKydfJywgYWxwaGFudW1zKydfJykuc2V0TmFtZSgiaWRlbnRpZmllciIpDQogICAgIiIidHlwaWNhbCBjb2RlIGlkZW50aWZpZXIgKGxlYWRpbmcgYWxwaGEgb3IgJ18nLCBmb2xsb3dlZCBieSAwIG9yIG1vcmUgYWxwaGFzLCBudW1zLCBvciAnXycpIiIiDQogICAgDQogICAgaXB2NF9hZGRyZXNzID0gUmVnZXgocicoMjVbMC01XXwyWzAtNF1bMC05XXwxP1swLTldezEsMn0pKFwuKDI1WzAtNV18MlswLTRdWzAtOV18MT9bMC05XXsxLDJ9KSl7M30nKS5zZXROYW1lKCJJUHY0IGFkZHJlc3MiKQ0KICAgICJJUHY0IGFkZHJlc3MgKEN7MC4wLjAuMCAtIDI1NS4yNTUuMjU1LjI1NX0pIg0KDQogICAgX2lwdjZfcGFydCA9IFJlZ2V4KHInWzAtOWEtZkEtRl17MSw0fScpLnNldE5hbWUoImhleF9pbnRlZ2VyIikNCiAgICBfZnVsbF9pcHY2X2FkZHJlc3MgPSAoX2lwdjZfcGFydCArICgnOicgKyBfaXB2Nl9wYXJ0KSo3KS5zZXROYW1lKCJmdWxsIElQdjYgYWRkcmVzcyIpDQogICAgX3Nob3J0X2lwdjZfYWRkcmVzcyA9IChPcHRpb25hbChfaXB2Nl9wYXJ0ICsgKCc6JyArIF9pcHY2X3BhcnQpKigwLDYpKSArICI6OiIgKyBPcHRpb25hbChfaXB2Nl9wYXJ0ICsgKCc6JyArIF9pcHY2X3BhcnQpKigwLDYpKSkuc2V0TmFtZSgic2hvcnQgSVB2NiBhZGRyZXNzIikNCiAgICBfc2hvcnRfaXB2Nl9hZGRyZXNzLmFkZENvbmRpdGlvbihsYW1iZGEgdDogc3VtKDEgZm9yIHR0IGluIHQgaWYgcHlwYXJzaW5nX2NvbW1vbi5faXB2Nl9wYXJ0Lm1hdGNoZXModHQpKSA8IDgpDQogICAgX21peGVkX2lwdjZfYWRkcmVzcyA9ICgiOjpmZmZmOiIgKyBpcHY0X2FkZHJlc3MpLnNldE5hbWUoIm1peGVkIElQdjYgYWRkcmVzcyIpDQogICAgaXB2Nl9hZGRyZXNzID0gQ29tYmluZSgoX2Z1bGxfaXB2Nl9hZGRyZXNzIHwgX21peGVkX2lwdjZfYWRkcmVzcyB8IF9zaG9ydF9pcHY2X2FkZHJlc3MpLnNldE5hbWUoIklQdjYgYWRkcmVzcyIpKS5zZXROYW1lKCJJUHY2IGFkZHJlc3MiKQ0KICAgICJJUHY2IGFkZHJlc3MgKGxvbmcsIHNob3J0LCBvciBtaXhlZCBmb3JtKSINCiAgICANCiAgICBtYWNfYWRkcmVzcyA9IFJlZ2V4KHInWzAtOWEtZkEtRl17Mn0oWzouLV0pWzAtOWEtZkEtRl17Mn0oPzpcMVswLTlhLWZBLUZdezJ9KXs0fScpLnNldE5hbWUoIk1BQyBhZGRyZXNzIikNCiAgICAiTUFDIGFkZHJlc3MgeHg6eHg6eHg6eHg6eHggKG1heSBhbHNvIGhhdmUgJy0nIG9yICcuJyBkZWxpbWl0ZXJzKSINCg0KICAgIEBzdGF0aWNtZXRob2QNCiAgICBkZWYgY29udmVydFRvRGF0ZShmbXQ9IiVZLSVtLSVkIik6DQogICAgICAgICIiIg0KICAgICAgICBIZWxwZXIgdG8gY3JlYXRlIGEgcGFyc2UgYWN0aW9uIGZvciBjb252ZXJ0aW5nIHBhcnNlZCBkYXRlIHN0cmluZyB0byBQeXRob24gZGF0ZXRpbWUuZGF0ZQ0KDQogICAgICAgIFBhcmFtcyAtDQogICAgICAgICAtIGZtdCAtIGZvcm1hdCB0byBiZSBwYXNzZWQgdG8gZGF0ZXRpbWUuc3RycHRpbWUgKGRlZmF1bHQ9Q3siJVktJW0tJWQifSkNCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIGRhdGVfZXhwciA9IHB5cGFyc2luZ19jb21tb24uaXNvODYwMV9kYXRlLmNvcHkoKQ0KICAgICAgICAgICAgZGF0ZV9leHByLnNldFBhcnNlQWN0aW9uKHB5cGFyc2luZ19jb21tb24uY29udmVydFRvRGF0ZSgpKQ0KICAgICAgICAgICAgcHJpbnQoZGF0ZV9leHByLnBhcnNlU3RyaW5nKCIxOTk5LTEyLTMxIikpDQogICAgICAgIHByaW50czo6DQogICAgICAgICAgICBbZGF0ZXRpbWUuZGF0ZSgxOTk5LCAxMiwgMzEpXQ0KICAgICAgICAiIiINCiAgICAgICAgZGVmIGN2dF9mbihzLGwsdCk6DQogICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgcmV0dXJuIGRhdGV0aW1lLnN0cnB0aW1lKHRbMF0sIGZtdCkuZGF0ZSgpDQogICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvciBhcyB2ZToNCiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihzLCBsLCBzdHIodmUpKQ0KICAgICAgICByZXR1cm4gY3Z0X2ZuDQoNCiAgICBAc3RhdGljbWV0aG9kDQogICAgZGVmIGNvbnZlcnRUb0RhdGV0aW1lKGZtdD0iJVktJW0tJWRUJUg6JU06JVMuJWYiKToNCiAgICAgICAgIiIiDQogICAgICAgIEhlbHBlciB0byBjcmVhdGUgYSBwYXJzZSBhY3Rpb24gZm9yIGNvbnZlcnRpbmcgcGFyc2VkIGRhdGV0aW1lIHN0cmluZyB0byBQeXRob24gZGF0ZXRpbWUuZGF0ZXRpbWUNCg0KICAgICAgICBQYXJhbXMgLQ0KICAgICAgICAgLSBmbXQgLSBmb3JtYXQgdG8gYmUgcGFzc2VkIHRvIGRhdGV0aW1lLnN0cnB0aW1lIChkZWZhdWx0PUN7IiVZLSVtLSVkVCVIOiVNOiVTLiVmIn0pDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBkdF9leHByID0gcHlwYXJzaW5nX2NvbW1vbi5pc284NjAxX2RhdGV0aW1lLmNvcHkoKQ0KICAgICAgICAgICAgZHRfZXhwci5zZXRQYXJzZUFjdGlvbihweXBhcnNpbmdfY29tbW9uLmNvbnZlcnRUb0RhdGV0aW1lKCkpDQogICAgICAgICAgICBwcmludChkdF9leHByLnBhcnNlU3RyaW5nKCIxOTk5LTEyLTMxVDIzOjU5OjU5Ljk5OSIpKQ0KICAgICAgICBwcmludHM6Og0KICAgICAgICAgICAgW2RhdGV0aW1lLmRhdGV0aW1lKDE5OTksIDEyLCAzMSwgMjMsIDU5LCA1OSwgOTk5MDAwKV0NCiAgICAgICAgIiIiDQogICAgICAgIGRlZiBjdnRfZm4ocyxsLHQpOg0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIHJldHVybiBkYXRldGltZS5zdHJwdGltZSh0WzBdLCBmbXQpDQogICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvciBhcyB2ZToNCiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihzLCBsLCBzdHIodmUpKQ0KICAgICAgICByZXR1cm4gY3Z0X2ZuDQoNCiAgICBpc284NjAxX2RhdGUgPSBSZWdleChyJyg/UDx5ZWFyPlxkezR9KSg/Oi0oP1A8bW9udGg+XGRcZCkoPzotKD9QPGRheT5cZFxkKSk/KT8nKS5zZXROYW1lKCJJU084NjAxIGRhdGUiKQ0KICAgICJJU084NjAxIGRhdGUgKEN7eXl5eS1tbS1kZH0pIg0KDQogICAgaXNvODYwMV9kYXRldGltZSA9IFJlZ2V4KHInKD9QPHllYXI+XGR7NH0pLSg/UDxtb250aD5cZFxkKS0oP1A8ZGF5PlxkXGQpW1QgXSg/UDxob3VyPlxkXGQpOig/UDxtaW51dGU+XGRcZCkoOig/UDxzZWNvbmQ+XGRcZChcLlxkKik/KT8pPyg/UDx0ej5afFsrLV1cZFxkOj9cZFxkKT8nKS5zZXROYW1lKCJJU084NjAxIGRhdGV0aW1lIikNCiAgICAiSVNPODYwMSBkYXRldGltZSAoQ3t5eXl5LW1tLWRkVGhoOm1tOnNzLnMoWnwrLTAwOjAwKX0pIC0gdHJhaWxpbmcgc2Vjb25kcywgbWlsbGlzZWNvbmRzLCBhbmQgdGltZXpvbmUgb3B0aW9uYWw7IGFjY2VwdHMgc2VwYXJhdGluZyBDeydUJ30gb3IgQ3snICd9Ig0KDQogICAgdXVpZCA9IFJlZ2V4KHInWzAtOWEtZkEtRl17OH0oLVswLTlhLWZBLUZdezR9KXszfS1bMC05YS1mQS1GXXsxMn0nKS5zZXROYW1lKCJVVUlEIikNCiAgICAiVVVJRCAoQ3t4eHh4eHh4eC14eHh4LXh4eHgteHh4eC14eHh4eHh4eHh4eHh9KSINCg0KICAgIF9odG1sX3N0cmlwcGVyID0gYW55T3BlblRhZy5zdXBwcmVzcygpIHwgYW55Q2xvc2VUYWcuc3VwcHJlc3MoKQ0KICAgIEBzdGF0aWNtZXRob2QNCiAgICBkZWYgc3RyaXBIVE1MVGFncyhzLCBsLCB0b2tlbnMpOg0KICAgICAgICAiIiINCiAgICAgICAgUGFyc2UgYWN0aW9uIHRvIHJlbW92ZSBIVE1MIHRhZ3MgZnJvbSB3ZWIgcGFnZSBIVE1MIHNvdXJjZQ0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgIyBzdHJpcCBIVE1MIGxpbmtzIGZyb20gbm9ybWFsIHRleHQgDQogICAgICAgICAgICB0ZXh0ID0gJzx0ZD5Nb3JlIGluZm8gYXQgdGhlIDxhIGhyZWY9Imh0dHA6Ly9weXBhcnNpbmcud2lraXNwYWNlcy5jb20iPnB5cGFyc2luZzwvYT4gd2lraSBwYWdlPC90ZD4nDQogICAgICAgICAgICB0ZCx0ZF9lbmQgPSBtYWtlSFRNTFRhZ3MoIlREIikNCiAgICAgICAgICAgIHRhYmxlX3RleHQgPSB0ZCArIFNraXBUbyh0ZF9lbmQpLnNldFBhcnNlQWN0aW9uKHB5cGFyc2luZ19jb21tb24uc3RyaXBIVE1MVGFncykoImJvZHkiKSArIHRkX2VuZA0KICAgICAgICAgICAgDQogICAgICAgICAgICBwcmludCh0YWJsZV90ZXh0LnBhcnNlU3RyaW5nKHRleHQpLmJvZHkpICMgLT4gJ01vcmUgaW5mbyBhdCB0aGUgcHlwYXJzaW5nIHdpa2kgcGFnZScNCiAgICAgICAgIiIiDQogICAgICAgIHJldHVybiBweXBhcnNpbmdfY29tbW9uLl9odG1sX3N0cmlwcGVyLnRyYW5zZm9ybVN0cmluZyh0b2tlbnNbMF0pDQoNCiAgICBfY29tbWFzZXBpdGVtID0gQ29tYmluZShPbmVPck1vcmUofkxpdGVyYWwoIiwiKSArIH5MaW5lRW5kKCkgKyBXb3JkKHByaW50YWJsZXMsIGV4Y2x1ZGVDaGFycz0nLCcpIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgT3B0aW9uYWwoIFdoaXRlKCIgXHQiKSApICkgKS5zdHJlYW1saW5lKCkuc2V0TmFtZSgiY29tbWFJdGVtIikNCiAgICBjb21tYV9zZXBhcmF0ZWRfbGlzdCA9IGRlbGltaXRlZExpc3QoIE9wdGlvbmFsKCBxdW90ZWRTdHJpbmcuY29weSgpIHwgX2NvbW1hc2VwaXRlbSwgZGVmYXVsdD0iIikgKS5zZXROYW1lKCJjb21tYSBzZXBhcmF0ZWQgbGlzdCIpDQogICAgIiIiUHJlZGVmaW5lZCBleHByZXNzaW9uIG9mIDEgb3IgbW9yZSBwcmludGFibGUgd29yZHMgb3IgcXVvdGVkIHN0cmluZ3MsIHNlcGFyYXRlZCBieSBjb21tYXMuIiIiDQoNCiAgICB1cGNhc2VUb2tlbnMgPSBzdGF0aWNtZXRob2QodG9rZW5NYXAobGFtYmRhIHQ6IF91c3RyKHQpLnVwcGVyKCkpKQ0KICAgICIiIlBhcnNlIGFjdGlvbiB0byBjb252ZXJ0IHRva2VucyB0byB1cHBlciBjYXNlLiIiIg0KDQogICAgZG93bmNhc2VUb2tlbnMgPSBzdGF0aWNtZXRob2QodG9rZW5NYXAobGFtYmRhIHQ6IF91c3RyKHQpLmxvd2VyKCkpKQ0KICAgICIiIlBhcnNlIGFjdGlvbiB0byBjb252ZXJ0IHRva2VucyB0byBsb3dlciBjYXNlLiIiIg0KDQoNCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6DQoNCiAgICBzZWxlY3RUb2tlbiAgICA9IENhc2VsZXNzTGl0ZXJhbCgic2VsZWN0IikNCiAgICBmcm9tVG9rZW4gICAgICA9IENhc2VsZXNzTGl0ZXJhbCgiZnJvbSIpDQoNCiAgICBpZGVudCAgICAgICAgICA9IFdvcmQoYWxwaGFzLCBhbHBoYW51bXMgKyAiXyQiKQ0KDQogICAgY29sdW1uTmFtZSAgICAgPSBkZWxpbWl0ZWRMaXN0KGlkZW50LCAiLiIsIGNvbWJpbmU9VHJ1ZSkuc2V0UGFyc2VBY3Rpb24odXBjYXNlVG9rZW5zKQ0KICAgIGNvbHVtbk5hbWVMaXN0ID0gR3JvdXAoZGVsaW1pdGVkTGlzdChjb2x1bW5OYW1lKSkuc2V0TmFtZSgiY29sdW1ucyIpDQogICAgY29sdW1uU3BlYyAgICAgPSAoJyonIHwgY29sdW1uTmFtZUxpc3QpDQoNCiAgICB0YWJsZU5hbWUgICAgICA9IGRlbGltaXRlZExpc3QoaWRlbnQsICIuIiwgY29tYmluZT1UcnVlKS5zZXRQYXJzZUFjdGlvbih1cGNhc2VUb2tlbnMpDQogICAgdGFibGVOYW1lTGlzdCAgPSBHcm91cChkZWxpbWl0ZWRMaXN0KHRhYmxlTmFtZSkpLnNldE5hbWUoInRhYmxlcyIpDQogICAgDQogICAgc2ltcGxlU1FMICAgICAgPSBzZWxlY3RUb2tlbigiY29tbWFuZCIpICsgY29sdW1uU3BlYygiY29sdW1ucyIpICsgZnJvbVRva2VuICsgdGFibGVOYW1lTGlzdCgidGFibGVzIikNCg0KICAgICMgZGVtbyBydW5UZXN0cyBtZXRob2QsIGluY2x1ZGluZyBlbWJlZGRlZCBjb21tZW50cyBpbiB0ZXN0IHN0cmluZw0KICAgIHNpbXBsZVNRTC5ydW5UZXN0cygiIiINCiAgICAgICAgIyAnKicgYXMgY29sdW1uIGxpc3QgYW5kIGRvdHRlZCB0YWJsZSBuYW1lDQogICAgICAgIHNlbGVjdCAqIGZyb20gU1lTLlhZWlpZDQoNCiAgICAgICAgIyBjYXNlbGVzcyBtYXRjaCBvbiAiU0VMRUNUIiwgYW5kIGNhc3RzIGJhY2sgdG8gInNlbGVjdCINCiAgICAgICAgU0VMRUNUICogZnJvbSBYWVpaWSwgQUJDDQoNCiAgICAgICAgIyBsaXN0IG9mIGNvbHVtbiBuYW1lcywgYW5kIG1peGVkIGNhc2UgU0VMRUNUIGtleXdvcmQNCiAgICAgICAgU2VsZWN0IEFBLEJCLENDIGZyb20gU3lzLmR1YWwNCg0KICAgICAgICAjIG11bHRpcGxlIHRhYmxlcw0KICAgICAgICBTZWxlY3QgQSwgQiwgQyBmcm9tIFN5cy5kdWFsLCBUYWJsZTINCg0KICAgICAgICAjIGludmFsaWQgU0VMRUNUIGtleXdvcmQgLSBzaG91bGQgZmFpbA0KICAgICAgICBYZWxlY3QgQSwgQiwgQyBmcm9tIFN5cy5kdWFsDQoNCiAgICAgICAgIyBpbmNvbXBsZXRlIGNvbW1hbmQgLSBzaG91bGQgZmFpbA0KICAgICAgICBTZWxlY3QNCg0KICAgICAgICAjIGludmFsaWQgY29sdW1uIG5hbWUgLSBzaG91bGQgZmFpbA0KICAgICAgICBTZWxlY3QgXl5eIGZyb3ggU3lzLmR1YWwNCg0KICAgICAgICAiIiIpDQoNCiAgICBweXBhcnNpbmdfY29tbW9uLm51bWJlci5ydW5UZXN0cygiIiINCiAgICAgICAgMTAwDQogICAgICAgIC0xMDANCiAgICAgICAgKzEwMA0KICAgICAgICAzLjE0MTU5DQogICAgICAgIDYuMDJlMjMNCiAgICAgICAgMWUtMTINCiAgICAgICAgIiIiKQ0KDQogICAgIyBhbnkgaW50IG9yIHJlYWwgbnVtYmVyLCByZXR1cm5lZCBhcyBmbG9hdA0KICAgIHB5cGFyc2luZ19jb21tb24uZm51bWJlci5ydW5UZXN0cygiIiINCiAgICAgICAgMTAwDQogICAgICAgIC0xMDANCiAgICAgICAgKzEwMA0KICAgICAgICAzLjE0MTU5DQogICAgICAgIDYuMDJlMjMNCiAgICAgICAgMWUtMTINCiAgICAgICAgIiIiKQ0KDQogICAgcHlwYXJzaW5nX2NvbW1vbi5oZXhfaW50ZWdlci5ydW5UZXN0cygiIiINCiAgICAgICAgMTAwDQogICAgICAgIEZGDQogICAgICAgICIiIikNCg0KICAgIGltcG9ydCB1dWlkDQogICAgcHlwYXJzaW5nX2NvbW1vbi51dWlkLnNldFBhcnNlQWN0aW9uKHRva2VuTWFwKHV1aWQuVVVJRCkpDQogICAgcHlwYXJzaW5nX2NvbW1vbi51dWlkLnJ1blRlc3RzKCIiIg0KICAgICAgICAxMjM0NTY3OC0xMjM0LTU2NzgtMTIzNC01Njc4MTIzNDU2NzgNCiAgICAgICAgIiIiKQ0KUEsDBBQAAAAAAAAAIQCZWE1aknUAAJJ1AAA+AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvX3ZlbmRvci9zaXgucHkiIiJVdGlsaXRpZXMgZm9yIHdyaXRpbmcgY29kZSB0aGF0IHJ1bnMgb24gUHl0aG9uIDIgYW5kIDMiIiIKCiMgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTUgQmVuamFtaW4gUGV0ZXJzb24KIwojIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKIyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAojIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKIyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCiMgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCiMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIwojIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAojIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCiMKIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgojIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAojIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQojIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKIyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAojIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCiMgU09GVFdBUkUuCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGZ1bmN0b29scwppbXBvcnQgaXRlcnRvb2xzCmltcG9ydCBvcGVyYXRvcgppbXBvcnQgc3lzCmltcG9ydCB0eXBlcwoKX19hdXRob3JfXyA9ICJCZW5qYW1pbiBQZXRlcnNvbiA8YmVuamFtaW5AcHl0aG9uLm9yZz4iCl9fdmVyc2lvbl9fID0gIjEuMTAuMCIKCgojIFVzZWZ1bCBmb3IgdmVyeSBjb2Fyc2UgdmVyc2lvbiBkaWZmZXJlbnRpYXRpb24uClBZMiA9IHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMgpQWTMgPSBzeXMudmVyc2lvbl9pbmZvWzBdID09IDMKUFkzNCA9IHN5cy52ZXJzaW9uX2luZm9bMDoyXSA+PSAoMywgNCkKCmlmIFBZMzoKICAgIHN0cmluZ190eXBlcyA9IHN0ciwKICAgIGludGVnZXJfdHlwZXMgPSBpbnQsCiAgICBjbGFzc190eXBlcyA9IHR5cGUsCiAgICB0ZXh0X3R5cGUgPSBzdHIKICAgIGJpbmFyeV90eXBlID0gYnl0ZXMKCiAgICBNQVhTSVpFID0gc3lzLm1heHNpemUKZWxzZToKICAgIHN0cmluZ190eXBlcyA9IGJhc2VzdHJpbmcsCiAgICBpbnRlZ2VyX3R5cGVzID0gKGludCwgbG9uZykKICAgIGNsYXNzX3R5cGVzID0gKHR5cGUsIHR5cGVzLkNsYXNzVHlwZSkKICAgIHRleHRfdHlwZSA9IHVuaWNvZGUKICAgIGJpbmFyeV90eXBlID0gc3RyCgogICAgaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoImphdmEiKToKICAgICAgICAjIEp5dGhvbiBhbHdheXMgdXNlcyAzMiBiaXRzLgogICAgICAgIE1BWFNJWkUgPSBpbnQoKDEgPDwgMzEpIC0gMSkKICAgIGVsc2U6CiAgICAgICAgIyBJdCdzIHBvc3NpYmxlIHRvIGhhdmUgc2l6ZW9mKGxvbmcpICE9IHNpemVvZihQeV9zc2l6ZV90KS4KICAgICAgICBjbGFzcyBYKG9iamVjdCk6CgogICAgICAgICAgICBkZWYgX19sZW5fXyhzZWxmKToKICAgICAgICAgICAgICAgIHJldHVybiAxIDw8IDMxCiAgICAgICAgdHJ5OgogICAgICAgICAgICBsZW4oWCgpKQogICAgICAgIGV4Y2VwdCBPdmVyZmxvd0Vycm9yOgogICAgICAgICAgICAjIDMyLWJpdAogICAgICAgICAgICBNQVhTSVpFID0gaW50KCgxIDw8IDMxKSAtIDEpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyA2NC1iaXQKICAgICAgICAgICAgTUFYU0laRSA9IGludCgoMSA8PCA2MykgLSAxKQogICAgICAgIGRlbCBYCgoKZGVmIF9hZGRfZG9jKGZ1bmMsIGRvYyk6CiAgICAiIiJBZGQgZG9jdW1lbnRhdGlvbiB0byBhIGZ1bmN0aW9uLiIiIgogICAgZnVuYy5fX2RvY19fID0gZG9jCgoKZGVmIF9pbXBvcnRfbW9kdWxlKG5hbWUpOgogICAgIiIiSW1wb3J0IG1vZHVsZSwgcmV0dXJuaW5nIHRoZSBtb2R1bGUgYWZ0ZXIgdGhlIGxhc3QgZG90LiIiIgogICAgX19pbXBvcnRfXyhuYW1lKQogICAgcmV0dXJuIHN5cy5tb2R1bGVzW25hbWVdCgoKY2xhc3MgX0xhenlEZXNjcihvYmplY3QpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lKToKICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCgogICAgZGVmIF9fZ2V0X18oc2VsZiwgb2JqLCB0cCk6CiAgICAgICAgcmVzdWx0ID0gc2VsZi5fcmVzb2x2ZSgpCiAgICAgICAgc2V0YXR0cihvYmosIHNlbGYubmFtZSwgcmVzdWx0KSAgIyBJbnZva2VzIF9fc2V0X18uCiAgICAgICAgdHJ5OgogICAgICAgICAgICAjIFRoaXMgaXMgYSBiaXQgdWdseSwgYnV0IGl0IGF2b2lkcyBydW5uaW5nIHRoaXMgYWdhaW4gYnkKICAgICAgICAgICAgIyByZW1vdmluZyB0aGlzIGRlc2NyaXB0b3IuCiAgICAgICAgICAgIGRlbGF0dHIob2JqLl9fY2xhc3NfXywgc2VsZi5uYW1lKQogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgcGFzcwogICAgICAgIHJldHVybiByZXN1bHQKCgpjbGFzcyBNb3ZlZE1vZHVsZShfTGF6eURlc2NyKToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgb2xkLCBuZXc9Tm9uZSk6CiAgICAgICAgc3VwZXIoTW92ZWRNb2R1bGUsIHNlbGYpLl9faW5pdF9fKG5hbWUpCiAgICAgICAgaWYgUFkzOgogICAgICAgICAgICBpZiBuZXcgaXMgTm9uZToKICAgICAgICAgICAgICAgIG5ldyA9IG5hbWUKICAgICAgICAgICAgc2VsZi5tb2QgPSBuZXcKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLm1vZCA9IG9sZAoKICAgIGRlZiBfcmVzb2x2ZShzZWxmKToKICAgICAgICByZXR1cm4gX2ltcG9ydF9tb2R1bGUoc2VsZi5tb2QpCgogICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIGF0dHIpOgogICAgICAgIF9tb2R1bGUgPSBzZWxmLl9yZXNvbHZlKCkKICAgICAgICB2YWx1ZSA9IGdldGF0dHIoX21vZHVsZSwgYXR0cikKICAgICAgICBzZXRhdHRyKHNlbGYsIGF0dHIsIHZhbHVlKQogICAgICAgIHJldHVybiB2YWx1ZQoKCmNsYXNzIF9MYXp5TW9kdWxlKHR5cGVzLk1vZHVsZVR5cGUpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lKToKICAgICAgICBzdXBlcihfTGF6eU1vZHVsZSwgc2VsZikuX19pbml0X18obmFtZSkKICAgICAgICBzZWxmLl9fZG9jX18gPSBzZWxmLl9fY2xhc3NfXy5fX2RvY19fCgogICAgZGVmIF9fZGlyX18oc2VsZik6CiAgICAgICAgYXR0cnMgPSBbIl9fZG9jX18iLCAiX19uYW1lX18iXQogICAgICAgIGF0dHJzICs9IFthdHRyLm5hbWUgZm9yIGF0dHIgaW4gc2VsZi5fbW92ZWRfYXR0cmlidXRlc10KICAgICAgICByZXR1cm4gYXR0cnMKCiAgICAjIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMKICAgIF9tb3ZlZF9hdHRyaWJ1dGVzID0gW10KCgpjbGFzcyBNb3ZlZEF0dHJpYnV0ZShfTGF6eURlc2NyKToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgb2xkX21vZCwgbmV3X21vZCwgb2xkX2F0dHI9Tm9uZSwgbmV3X2F0dHI9Tm9uZSk6CiAgICAgICAgc3VwZXIoTW92ZWRBdHRyaWJ1dGUsIHNlbGYpLl9faW5pdF9fKG5hbWUpCiAgICAgICAgaWYgUFkzOgogICAgICAgICAgICBpZiBuZXdfbW9kIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBuZXdfbW9kID0gbmFtZQogICAgICAgICAgICBzZWxmLm1vZCA9IG5ld19tb2QKICAgICAgICAgICAgaWYgbmV3X2F0dHIgaXMgTm9uZToKICAgICAgICAgICAgICAgIGlmIG9sZF9hdHRyIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgbmV3X2F0dHIgPSBuYW1lCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG5ld19hdHRyID0gb2xkX2F0dHIKICAgICAgICAgICAgc2VsZi5hdHRyID0gbmV3X2F0dHIKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLm1vZCA9IG9sZF9tb2QKICAgICAgICAgICAgaWYgb2xkX2F0dHIgaXMgTm9uZToKICAgICAgICAgICAgICAgIG9sZF9hdHRyID0gbmFtZQogICAgICAgICAgICBzZWxmLmF0dHIgPSBvbGRfYXR0cgoKICAgIGRlZiBfcmVzb2x2ZShzZWxmKToKICAgICAgICBtb2R1bGUgPSBfaW1wb3J0X21vZHVsZShzZWxmLm1vZCkKICAgICAgICByZXR1cm4gZ2V0YXR0cihtb2R1bGUsIHNlbGYuYXR0cikKCgpjbGFzcyBfU2l4TWV0YVBhdGhJbXBvcnRlcihvYmplY3QpOgoKICAgICIiIgogICAgQSBtZXRhIHBhdGggaW1wb3J0ZXIgdG8gaW1wb3J0IHNpeC5tb3ZlcyBhbmQgaXRzIHN1Ym1vZHVsZXMuCgogICAgVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGEgUEVQMzAyIGZpbmRlciBhbmQgbG9hZGVyLiBJdCBzaG91bGQgYmUgY29tcGF0aWJsZQogICAgd2l0aCBQeXRob24gMi41IGFuZCBhbGwgZXhpc3RpbmcgdmVyc2lvbnMgb2YgUHl0aG9uMwogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHNpeF9tb2R1bGVfbmFtZSk6CiAgICAgICAgc2VsZi5uYW1lID0gc2l4X21vZHVsZV9uYW1lCiAgICAgICAgc2VsZi5rbm93bl9tb2R1bGVzID0ge30KCiAgICBkZWYgX2FkZF9tb2R1bGUoc2VsZiwgbW9kLCAqZnVsbG5hbWVzKToKICAgICAgICBmb3IgZnVsbG5hbWUgaW4gZnVsbG5hbWVzOgogICAgICAgICAgICBzZWxmLmtub3duX21vZHVsZXNbc2VsZi5uYW1lICsgIi4iICsgZnVsbG5hbWVdID0gbW9kCgogICAgZGVmIF9nZXRfbW9kdWxlKHNlbGYsIGZ1bGxuYW1lKToKICAgICAgICByZXR1cm4gc2VsZi5rbm93bl9tb2R1bGVzW3NlbGYubmFtZSArICIuIiArIGZ1bGxuYW1lXQoKICAgIGRlZiBmaW5kX21vZHVsZShzZWxmLCBmdWxsbmFtZSwgcGF0aD1Ob25lKToKICAgICAgICBpZiBmdWxsbmFtZSBpbiBzZWxmLmtub3duX21vZHVsZXM6CiAgICAgICAgICAgIHJldHVybiBzZWxmCiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBkZWYgX19nZXRfbW9kdWxlKHNlbGYsIGZ1bGxuYW1lKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmtub3duX21vZHVsZXNbZnVsbG5hbWVdCiAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvcigiVGhpcyBsb2FkZXIgZG9lcyBub3Qga25vdyBtb2R1bGUgIiArIGZ1bGxuYW1lKQoKICAgIGRlZiBsb2FkX21vZHVsZShzZWxmLCBmdWxsbmFtZSk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICAjIGluIGNhc2Ugb2YgYSByZWxvYWQKICAgICAgICAgICAgcmV0dXJuIHN5cy5tb2R1bGVzW2Z1bGxuYW1lXQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgcGFzcwogICAgICAgIG1vZCA9IHNlbGYuX19nZXRfbW9kdWxlKGZ1bGxuYW1lKQogICAgICAgIGlmIGlzaW5zdGFuY2UobW9kLCBNb3ZlZE1vZHVsZSk6CiAgICAgICAgICAgIG1vZCA9IG1vZC5fcmVzb2x2ZSgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbW9kLl9fbG9hZGVyX18gPSBzZWxmCiAgICAgICAgc3lzLm1vZHVsZXNbZnVsbG5hbWVdID0gbW9kCiAgICAgICAgcmV0dXJuIG1vZAoKICAgIGRlZiBpc19wYWNrYWdlKHNlbGYsIGZ1bGxuYW1lKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gdHJ1ZSwgaWYgdGhlIG5hbWVkIG1vZHVsZSBpcyBhIHBhY2thZ2UuCgogICAgICAgIFdlIG5lZWQgdGhpcyBtZXRob2QgdG8gZ2V0IGNvcnJlY3Qgc3BlYyBvYmplY3RzIHdpdGgKICAgICAgICBQeXRob24gMy40IChzZWUgUEVQNDUxKQogICAgICAgICIiIgogICAgICAgIHJldHVybiBoYXNhdHRyKHNlbGYuX19nZXRfbW9kdWxlKGZ1bGxuYW1lKSwgIl9fcGF0aF9fIikKCiAgICBkZWYgZ2V0X2NvZGUoc2VsZiwgZnVsbG5hbWUpOgogICAgICAgICIiIlJldHVybiBOb25lCgogICAgICAgIFJlcXVpcmVkLCBpZiBpc19wYWNrYWdlIGlzIGltcGxlbWVudGVkIiIiCiAgICAgICAgc2VsZi5fX2dldF9tb2R1bGUoZnVsbG5hbWUpICAjIGV2ZW50dWFsbHkgcmFpc2VzIEltcG9ydEVycm9yCiAgICAgICAgcmV0dXJuIE5vbmUKICAgIGdldF9zb3VyY2UgPSBnZXRfY29kZSAgIyBzYW1lIGFzIGdldF9jb2RlCgpfaW1wb3J0ZXIgPSBfU2l4TWV0YVBhdGhJbXBvcnRlcihfX25hbWVfXykKCgpjbGFzcyBfTW92ZWRJdGVtcyhfTGF6eU1vZHVsZSk6CgogICAgIiIiTGF6eSBsb2FkaW5nIG9mIG1vdmVkIG9iamVjdHMiIiIKICAgIF9fcGF0aF9fID0gW10gICMgbWFyayBhcyBwYWNrYWdlCgoKX21vdmVkX2F0dHJpYnV0ZXMgPSBbCiAgICBNb3ZlZEF0dHJpYnV0ZSgiY1N0cmluZ0lPIiwgImNTdHJpbmdJTyIsICJpbyIsICJTdHJpbmdJTyIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImZpbHRlciIsICJpdGVydG9vbHMiLCAiYnVpbHRpbnMiLCAiaWZpbHRlciIsICJmaWx0ZXIiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJmaWx0ZXJmYWxzZSIsICJpdGVydG9vbHMiLCAiaXRlcnRvb2xzIiwgImlmaWx0ZXJmYWxzZSIsICJmaWx0ZXJmYWxzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImlucHV0IiwgIl9fYnVpbHRpbl9fIiwgImJ1aWx0aW5zIiwgInJhd19pbnB1dCIsICJpbnB1dCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImludGVybiIsICJfX2J1aWx0aW5fXyIsICJzeXMiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJtYXAiLCAiaXRlcnRvb2xzIiwgImJ1aWx0aW5zIiwgImltYXAiLCAibWFwIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiZ2V0Y3dkIiwgIm9zIiwgIm9zIiwgImdldGN3ZHUiLCAiZ2V0Y3dkIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiZ2V0Y3dkYiIsICJvcyIsICJvcyIsICJnZXRjd2QiLCAiZ2V0Y3dkYiIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInJhbmdlIiwgIl9fYnVpbHRpbl9fIiwgImJ1aWx0aW5zIiwgInhyYW5nZSIsICJyYW5nZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInJlbG9hZF9tb2R1bGUiLCAiX19idWlsdGluX18iLCAiaW1wb3J0bGliIiBpZiBQWTM0IGVsc2UgImltcCIsICJyZWxvYWQiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJyZWR1Y2UiLCAiX19idWlsdGluX18iLCAiZnVuY3Rvb2xzIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgic2hsZXhfcXVvdGUiLCAicGlwZXMiLCAic2hsZXgiLCAicXVvdGUiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJTdHJpbmdJTyIsICJTdHJpbmdJTyIsICJpbyIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlVzZXJEaWN0IiwgIlVzZXJEaWN0IiwgImNvbGxlY3Rpb25zIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiVXNlckxpc3QiLCAiVXNlckxpc3QiLCAiY29sbGVjdGlvbnMiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJVc2VyU3RyaW5nIiwgIlVzZXJTdHJpbmciLCAiY29sbGVjdGlvbnMiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ4cmFuZ2UiLCAiX19idWlsdGluX18iLCAiYnVpbHRpbnMiLCAieHJhbmdlIiwgInJhbmdlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiemlwIiwgIml0ZXJ0b29scyIsICJidWlsdGlucyIsICJpemlwIiwgInppcCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInppcF9sb25nZXN0IiwgIml0ZXJ0b29scyIsICJpdGVydG9vbHMiLCAiaXppcF9sb25nZXN0IiwgInppcF9sb25nZXN0IiksCiAgICBNb3ZlZE1vZHVsZSgiYnVpbHRpbnMiLCAiX19idWlsdGluX18iKSwKICAgIE1vdmVkTW9kdWxlKCJjb25maWdwYXJzZXIiLCAiQ29uZmlnUGFyc2VyIiksCiAgICBNb3ZlZE1vZHVsZSgiY29weXJlZyIsICJjb3B5X3JlZyIpLAogICAgTW92ZWRNb2R1bGUoImRibV9nbnUiLCAiZ2RibSIsICJkYm0uZ251IiksCiAgICBNb3ZlZE1vZHVsZSgiX2R1bW15X3RocmVhZCIsICJkdW1teV90aHJlYWQiLCAiX2R1bW15X3RocmVhZCIpLAogICAgTW92ZWRNb2R1bGUoImh0dHBfY29va2llamFyIiwgImNvb2tpZWxpYiIsICJodHRwLmNvb2tpZWphciIpLAogICAgTW92ZWRNb2R1bGUoImh0dHBfY29va2llcyIsICJDb29raWUiLCAiaHR0cC5jb29raWVzIiksCiAgICBNb3ZlZE1vZHVsZSgiaHRtbF9lbnRpdGllcyIsICJodG1sZW50aXR5ZGVmcyIsICJodG1sLmVudGl0aWVzIiksCiAgICBNb3ZlZE1vZHVsZSgiaHRtbF9wYXJzZXIiLCAiSFRNTFBhcnNlciIsICJodG1sLnBhcnNlciIpLAogICAgTW92ZWRNb2R1bGUoImh0dHBfY2xpZW50IiwgImh0dHBsaWIiLCAiaHR0cC5jbGllbnQiKSwKICAgIE1vdmVkTW9kdWxlKCJlbWFpbF9taW1lX211bHRpcGFydCIsICJlbWFpbC5NSU1FTXVsdGlwYXJ0IiwgImVtYWlsLm1pbWUubXVsdGlwYXJ0IiksCiAgICBNb3ZlZE1vZHVsZSgiZW1haWxfbWltZV9ub25tdWx0aXBhcnQiLCAiZW1haWwuTUlNRU5vbk11bHRpcGFydCIsICJlbWFpbC5taW1lLm5vbm11bHRpcGFydCIpLAogICAgTW92ZWRNb2R1bGUoImVtYWlsX21pbWVfdGV4dCIsICJlbWFpbC5NSU1FVGV4dCIsICJlbWFpbC5taW1lLnRleHQiKSwKICAgIE1vdmVkTW9kdWxlKCJlbWFpbF9taW1lX2Jhc2UiLCAiZW1haWwuTUlNRUJhc2UiLCAiZW1haWwubWltZS5iYXNlIiksCiAgICBNb3ZlZE1vZHVsZSgiQmFzZUhUVFBTZXJ2ZXIiLCAiQmFzZUhUVFBTZXJ2ZXIiLCAiaHR0cC5zZXJ2ZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJDR0lIVFRQU2VydmVyIiwgIkNHSUhUVFBTZXJ2ZXIiLCAiaHR0cC5zZXJ2ZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJTaW1wbGVIVFRQU2VydmVyIiwgIlNpbXBsZUhUVFBTZXJ2ZXIiLCAiaHR0cC5zZXJ2ZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJjUGlja2xlIiwgImNQaWNrbGUiLCAicGlja2xlIiksCiAgICBNb3ZlZE1vZHVsZSgicXVldWUiLCAiUXVldWUiKSwKICAgIE1vdmVkTW9kdWxlKCJyZXBybGliIiwgInJlcHIiKSwKICAgIE1vdmVkTW9kdWxlKCJzb2NrZXRzZXJ2ZXIiLCAiU29ja2V0U2VydmVyIiksCiAgICBNb3ZlZE1vZHVsZSgiX3RocmVhZCIsICJ0aHJlYWQiLCAiX3RocmVhZCIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXIiLCAiVGtpbnRlciIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfZGlhbG9nIiwgIkRpYWxvZyIsICJ0a2ludGVyLmRpYWxvZyIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfZmlsZWRpYWxvZyIsICJGaWxlRGlhbG9nIiwgInRraW50ZXIuZmlsZWRpYWxvZyIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfc2Nyb2xsZWR0ZXh0IiwgIlNjcm9sbGVkVGV4dCIsICJ0a2ludGVyLnNjcm9sbGVkdGV4dCIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfc2ltcGxlZGlhbG9nIiwgIlNpbXBsZURpYWxvZyIsICJ0a2ludGVyLnNpbXBsZWRpYWxvZyIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfdGl4IiwgIlRpeCIsICJ0a2ludGVyLnRpeCIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfdHRrIiwgInR0ayIsICJ0a2ludGVyLnR0ayIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfY29uc3RhbnRzIiwgIlRrY29uc3RhbnRzIiwgInRraW50ZXIuY29uc3RhbnRzIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9kbmQiLCAiVGtkbmQiLCAidGtpbnRlci5kbmQiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX2NvbG9yY2hvb3NlciIsICJ0a0NvbG9yQ2hvb3NlciIsCiAgICAgICAgICAgICAgICAidGtpbnRlci5jb2xvcmNob29zZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX2NvbW1vbmRpYWxvZyIsICJ0a0NvbW1vbkRpYWxvZyIsCiAgICAgICAgICAgICAgICAidGtpbnRlci5jb21tb25kaWFsb2ciKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX3RrZmlsZWRpYWxvZyIsICJ0a0ZpbGVEaWFsb2ciLCAidGtpbnRlci5maWxlZGlhbG9nIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9mb250IiwgInRrRm9udCIsICJ0a2ludGVyLmZvbnQiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX21lc3NhZ2Vib3giLCAidGtNZXNzYWdlQm94IiwgInRraW50ZXIubWVzc2FnZWJveCIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfdGtzaW1wbGVkaWFsb2ciLCAidGtTaW1wbGVEaWFsb2ciLAogICAgICAgICAgICAgICAgInRraW50ZXIuc2ltcGxlZGlhbG9nIiksCiAgICBNb3ZlZE1vZHVsZSgidXJsbGliX3BhcnNlIiwgX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYl9wYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkTW9kdWxlKCJ1cmxsaWJfZXJyb3IiLCBfX25hbWVfXyArICIubW92ZXMudXJsbGliX2Vycm9yIiwgInVybGxpYi5lcnJvciIpLAogICAgTW92ZWRNb2R1bGUoInVybGxpYiIsIF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWIiLCBfX25hbWVfXyArICIubW92ZXMudXJsbGliIiksCiAgICBNb3ZlZE1vZHVsZSgidXJsbGliX3JvYm90cGFyc2VyIiwgInJvYm90cGFyc2VyIiwgInVybGxpYi5yb2JvdHBhcnNlciIpLAogICAgTW92ZWRNb2R1bGUoInhtbHJwY19jbGllbnQiLCAieG1scnBjbGliIiwgInhtbHJwYy5jbGllbnQiKSwKICAgIE1vdmVkTW9kdWxlKCJ4bWxycGNfc2VydmVyIiwgIlNpbXBsZVhNTFJQQ1NlcnZlciIsICJ4bWxycGMuc2VydmVyIiksCl0KIyBBZGQgd2luZG93cyBzcGVjaWZpYyBtb2R1bGVzLgppZiBzeXMucGxhdGZvcm0gPT0gIndpbjMyIjoKICAgIF9tb3ZlZF9hdHRyaWJ1dGVzICs9IFsKICAgICAgICBNb3ZlZE1vZHVsZSgid2lucmVnIiwgIl93aW5yZWciKSwKICAgIF0KCmZvciBhdHRyIGluIF9tb3ZlZF9hdHRyaWJ1dGVzOgogICAgc2V0YXR0cihfTW92ZWRJdGVtcywgYXR0ci5uYW1lLCBhdHRyKQogICAgaWYgaXNpbnN0YW5jZShhdHRyLCBNb3ZlZE1vZHVsZSk6CiAgICAgICAgX2ltcG9ydGVyLl9hZGRfbW9kdWxlKGF0dHIsICJtb3Zlcy4iICsgYXR0ci5uYW1lKQpkZWwgYXR0cgoKX01vdmVkSXRlbXMuX21vdmVkX2F0dHJpYnV0ZXMgPSBfbW92ZWRfYXR0cmlidXRlcwoKbW92ZXMgPSBfTW92ZWRJdGVtcyhfX25hbWVfXyArICIubW92ZXMiKQpfaW1wb3J0ZXIuX2FkZF9tb2R1bGUobW92ZXMsICJtb3ZlcyIpCgoKY2xhc3MgTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcGFyc2UoX0xhenlNb2R1bGUpOgoKICAgICIiIkxhenkgbG9hZGluZyBvZiBtb3ZlZCBvYmplY3RzIGluIHNpeC5tb3Zlcy51cmxsaWJfcGFyc2UiIiIKCgpfdXJsbGliX3BhcnNlX21vdmVkX2F0dHJpYnV0ZXMgPSBbCiAgICBNb3ZlZEF0dHJpYnV0ZSgiUGFyc2VSZXN1bHQiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiU3BsaXRSZXN1bHQiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicGFyc2VfcXMiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicGFyc2VfcXNsIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybGRlZnJhZyIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxqb2luIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybHBhcnNlIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybHNwbGl0IiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybHVucGFyc2UiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsdW5zcGxpdCIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJxdW90ZSIsICJ1cmxsaWIiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicXVvdGVfcGx1cyIsICJ1cmxsaWIiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidW5xdW90ZSIsICJ1cmxsaWIiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidW5xdW90ZV9wbHVzIiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxlbmNvZGUiLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInNwbGl0cXVlcnkiLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInNwbGl0dGFnIiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJzcGxpdHVzZXIiLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVzZXNfZnJhZ21lbnQiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXNlc19uZXRsb2MiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXNlc19wYXJhbXMiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXNlc19xdWVyeSIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1c2VzX3JlbGF0aXZlIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLApdCmZvciBhdHRyIGluIF91cmxsaWJfcGFyc2VfbW92ZWRfYXR0cmlidXRlczoKICAgIHNldGF0dHIoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcGFyc2UsIGF0dHIubmFtZSwgYXR0cikKZGVsIGF0dHIKCk1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3BhcnNlLl9tb3ZlZF9hdHRyaWJ1dGVzID0gX3VybGxpYl9wYXJzZV9tb3ZlZF9hdHRyaWJ1dGVzCgpfaW1wb3J0ZXIuX2FkZF9tb2R1bGUoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcGFyc2UoX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYl9wYXJzZSIpLAogICAgICAgICAgICAgICAgICAgICAgIm1vdmVzLnVybGxpYl9wYXJzZSIsICJtb3Zlcy51cmxsaWIucGFyc2UiKQoKCmNsYXNzIE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX2Vycm9yKF9MYXp5TW9kdWxlKToKCiAgICAiIiJMYXp5IGxvYWRpbmcgb2YgbW92ZWQgb2JqZWN0cyBpbiBzaXgubW92ZXMudXJsbGliX2Vycm9yIiIiCgoKX3VybGxpYl9lcnJvcl9tb3ZlZF9hdHRyaWJ1dGVzID0gWwogICAgTW92ZWRBdHRyaWJ1dGUoIlVSTEVycm9yIiwgInVybGxpYjIiLCAidXJsbGliLmVycm9yIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUEVycm9yIiwgInVybGxpYjIiLCAidXJsbGliLmVycm9yIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiQ29udGVudFRvb1Nob3J0RXJyb3IiLCAidXJsbGliIiwgInVybGxpYi5lcnJvciIpLApdCmZvciBhdHRyIGluIF91cmxsaWJfZXJyb3JfbW92ZWRfYXR0cmlidXRlczoKICAgIHNldGF0dHIoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfZXJyb3IsIGF0dHIubmFtZSwgYXR0cikKZGVsIGF0dHIKCk1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX2Vycm9yLl9tb3ZlZF9hdHRyaWJ1dGVzID0gX3VybGxpYl9lcnJvcl9tb3ZlZF9hdHRyaWJ1dGVzCgpfaW1wb3J0ZXIuX2FkZF9tb2R1bGUoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfZXJyb3IoX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYi5lcnJvciIpLAogICAgICAgICAgICAgICAgICAgICAgIm1vdmVzLnVybGxpYl9lcnJvciIsICJtb3Zlcy51cmxsaWIuZXJyb3IiKQoKCmNsYXNzIE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JlcXVlc3QoX0xhenlNb2R1bGUpOgoKICAgICIiIkxhenkgbG9hZGluZyBvZiBtb3ZlZCBvYmplY3RzIGluIHNpeC5tb3Zlcy51cmxsaWJfcmVxdWVzdCIiIgoKCl91cmxsaWJfcmVxdWVzdF9tb3ZlZF9hdHRyaWJ1dGVzID0gWwogICAgTW92ZWRBdHRyaWJ1dGUoInVybG9wZW4iLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImluc3RhbGxfb3BlbmVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJidWlsZF9vcGVuZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInBhdGhuYW1lMnVybCIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmwycGF0aG5hbWUiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiZ2V0cHJveGllcyIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJSZXF1ZXN0IiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJPcGVuZXJEaXJlY3RvciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUERlZmF1bHRFcnJvckhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBSZWRpcmVjdEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBDb29raWVQcm9jZXNzb3IiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlByb3h5SGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiQmFzZUhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBQYXNzd29yZE1nciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUFBhc3N3b3JkTWdyV2l0aERlZmF1bHRSZWFsbSIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiQWJzdHJhY3RCYXNpY0F1dGhIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQQmFzaWNBdXRoSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiUHJveHlCYXNpY0F1dGhIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJBYnN0cmFjdERpZ2VzdEF1dGhIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQRGlnZXN0QXV0aEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlByb3h5RGlnZXN0QXV0aEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQU0hhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkZpbGVIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJGVFBIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJDYWNoZUZUUEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlVua25vd25IYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQRXJyb3JQcm9jZXNzb3IiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybHJldHJpZXZlIiwgInVybGxpYiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybGNsZWFudXAiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiVVJMb3BlbmVyIiwgInVybGxpYiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkZhbmN5VVJMb3BlbmVyIiwgInVybGxpYiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInByb3h5X2J5cGFzcyIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKXQpmb3IgYXR0ciBpbiBfdXJsbGliX3JlcXVlc3RfbW92ZWRfYXR0cmlidXRlczoKICAgIHNldGF0dHIoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcmVxdWVzdCwgYXR0ci5uYW1lLCBhdHRyKQpkZWwgYXR0cgoKTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcmVxdWVzdC5fbW92ZWRfYXR0cmlidXRlcyA9IF91cmxsaWJfcmVxdWVzdF9tb3ZlZF9hdHRyaWJ1dGVzCgpfaW1wb3J0ZXIuX2FkZF9tb2R1bGUoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcmVxdWVzdChfX25hbWVfXyArICIubW92ZXMudXJsbGliLnJlcXVlc3QiKSwKICAgICAgICAgICAgICAgICAgICAgICJtb3Zlcy51cmxsaWJfcmVxdWVzdCIsICJtb3Zlcy51cmxsaWIucmVxdWVzdCIpCgoKY2xhc3MgTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcmVzcG9uc2UoX0xhenlNb2R1bGUpOgoKICAgICIiIkxhenkgbG9hZGluZyBvZiBtb3ZlZCBvYmplY3RzIGluIHNpeC5tb3Zlcy51cmxsaWJfcmVzcG9uc2UiIiIKCgpfdXJsbGliX3Jlc3BvbnNlX21vdmVkX2F0dHJpYnV0ZXMgPSBbCiAgICBNb3ZlZEF0dHJpYnV0ZSgiYWRkYmFzZSIsICJ1cmxsaWIiLCAidXJsbGliLnJlc3BvbnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiYWRkY2xvc2Vob29rIiwgInVybGxpYiIsICJ1cmxsaWIucmVzcG9uc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJhZGRpbmZvIiwgInVybGxpYiIsICJ1cmxsaWIucmVzcG9uc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJhZGRpbmZvdXJsIiwgInVybGxpYiIsICJ1cmxsaWIucmVzcG9uc2UiKSwKXQpmb3IgYXR0ciBpbiBfdXJsbGliX3Jlc3BvbnNlX21vdmVkX2F0dHJpYnV0ZXM6CiAgICBzZXRhdHRyKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3Jlc3BvbnNlLCBhdHRyLm5hbWUsIGF0dHIpCmRlbCBhdHRyCgpNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXNwb25zZS5fbW92ZWRfYXR0cmlidXRlcyA9IF91cmxsaWJfcmVzcG9uc2VfbW92ZWRfYXR0cmlidXRlcwoKX2ltcG9ydGVyLl9hZGRfbW9kdWxlKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3Jlc3BvbnNlKF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWIucmVzcG9uc2UiKSwKICAgICAgICAgICAgICAgICAgICAgICJtb3Zlcy51cmxsaWJfcmVzcG9uc2UiLCAibW92ZXMudXJsbGliLnJlc3BvbnNlIikKCgpjbGFzcyBNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yb2JvdHBhcnNlcihfTGF6eU1vZHVsZSk6CgogICAgIiIiTGF6eSBsb2FkaW5nIG9mIG1vdmVkIG9iamVjdHMgaW4gc2l4Lm1vdmVzLnVybGxpYl9yb2JvdHBhcnNlciIiIgoKCl91cmxsaWJfcm9ib3RwYXJzZXJfbW92ZWRfYXR0cmlidXRlcyA9IFsKICAgIE1vdmVkQXR0cmlidXRlKCJSb2JvdEZpbGVQYXJzZXIiLCAicm9ib3RwYXJzZXIiLCAidXJsbGliLnJvYm90cGFyc2VyIiksCl0KZm9yIGF0dHIgaW4gX3VybGxpYl9yb2JvdHBhcnNlcl9tb3ZlZF9hdHRyaWJ1dGVzOgogICAgc2V0YXR0cihNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yb2JvdHBhcnNlciwgYXR0ci5uYW1lLCBhdHRyKQpkZWwgYXR0cgoKTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcm9ib3RwYXJzZXIuX21vdmVkX2F0dHJpYnV0ZXMgPSBfdXJsbGliX3JvYm90cGFyc2VyX21vdmVkX2F0dHJpYnV0ZXMKCl9pbXBvcnRlci5fYWRkX21vZHVsZShNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yb2JvdHBhcnNlcihfX25hbWVfXyArICIubW92ZXMudXJsbGliLnJvYm90cGFyc2VyIiksCiAgICAgICAgICAgICAgICAgICAgICAibW92ZXMudXJsbGliX3JvYm90cGFyc2VyIiwgIm1vdmVzLnVybGxpYi5yb2JvdHBhcnNlciIpCgoKY2xhc3MgTW9kdWxlX3NpeF9tb3Zlc191cmxsaWIodHlwZXMuTW9kdWxlVHlwZSk6CgogICAgIiIiQ3JlYXRlIGEgc2l4Lm1vdmVzLnVybGxpYiBuYW1lc3BhY2UgdGhhdCByZXNlbWJsZXMgdGhlIFB5dGhvbiAzIG5hbWVzcGFjZSIiIgogICAgX19wYXRoX18gPSBbXSAgIyBtYXJrIGFzIHBhY2thZ2UKICAgIHBhcnNlID0gX2ltcG9ydGVyLl9nZXRfbW9kdWxlKCJtb3Zlcy51cmxsaWJfcGFyc2UiKQogICAgZXJyb3IgPSBfaW1wb3J0ZXIuX2dldF9tb2R1bGUoIm1vdmVzLnVybGxpYl9lcnJvciIpCiAgICByZXF1ZXN0ID0gX2ltcG9ydGVyLl9nZXRfbW9kdWxlKCJtb3Zlcy51cmxsaWJfcmVxdWVzdCIpCiAgICByZXNwb25zZSA9IF9pbXBvcnRlci5fZ2V0X21vZHVsZSgibW92ZXMudXJsbGliX3Jlc3BvbnNlIikKICAgIHJvYm90cGFyc2VyID0gX2ltcG9ydGVyLl9nZXRfbW9kdWxlKCJtb3Zlcy51cmxsaWJfcm9ib3RwYXJzZXIiKQoKICAgIGRlZiBfX2Rpcl9fKHNlbGYpOgogICAgICAgIHJldHVybiBbJ3BhcnNlJywgJ2Vycm9yJywgJ3JlcXVlc3QnLCAncmVzcG9uc2UnLCAncm9ib3RwYXJzZXInXQoKX2ltcG9ydGVyLl9hZGRfbW9kdWxlKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliKF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWIiKSwKICAgICAgICAgICAgICAgICAgICAgICJtb3Zlcy51cmxsaWIiKQoKCmRlZiBhZGRfbW92ZShtb3ZlKToKICAgICIiIkFkZCBhbiBpdGVtIHRvIHNpeC5tb3Zlcy4iIiIKICAgIHNldGF0dHIoX01vdmVkSXRlbXMsIG1vdmUubmFtZSwgbW92ZSkKCgpkZWYgcmVtb3ZlX21vdmUobmFtZSk6CiAgICAiIiJSZW1vdmUgaXRlbSBmcm9tIHNpeC5tb3Zlcy4iIiIKICAgIHRyeToKICAgICAgICBkZWxhdHRyKF9Nb3ZlZEl0ZW1zLCBuYW1lKQogICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgIHRyeToKICAgICAgICAgICAgZGVsIG1vdmVzLl9fZGljdF9fW25hbWVdCiAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcigibm8gc3VjaCBtb3ZlLCAlciIgJSAobmFtZSwpKQoKCmlmIFBZMzoKICAgIF9tZXRoX2Z1bmMgPSAiX19mdW5jX18iCiAgICBfbWV0aF9zZWxmID0gIl9fc2VsZl9fIgoKICAgIF9mdW5jX2Nsb3N1cmUgPSAiX19jbG9zdXJlX18iCiAgICBfZnVuY19jb2RlID0gIl9fY29kZV9fIgogICAgX2Z1bmNfZGVmYXVsdHMgPSAiX19kZWZhdWx0c19fIgogICAgX2Z1bmNfZ2xvYmFscyA9ICJfX2dsb2JhbHNfXyIKZWxzZToKICAgIF9tZXRoX2Z1bmMgPSAiaW1fZnVuYyIKICAgIF9tZXRoX3NlbGYgPSAiaW1fc2VsZiIKCiAgICBfZnVuY19jbG9zdXJlID0gImZ1bmNfY2xvc3VyZSIKICAgIF9mdW5jX2NvZGUgPSAiZnVuY19jb2RlIgogICAgX2Z1bmNfZGVmYXVsdHMgPSAiZnVuY19kZWZhdWx0cyIKICAgIF9mdW5jX2dsb2JhbHMgPSAiZnVuY19nbG9iYWxzIgoKCnRyeToKICAgIGFkdmFuY2VfaXRlcmF0b3IgPSBuZXh0CmV4Y2VwdCBOYW1lRXJyb3I6CiAgICBkZWYgYWR2YW5jZV9pdGVyYXRvcihpdCk6CiAgICAgICAgcmV0dXJuIGl0Lm5leHQoKQpuZXh0ID0gYWR2YW5jZV9pdGVyYXRvcgoKCnRyeToKICAgIGNhbGxhYmxlID0gY2FsbGFibGUKZXhjZXB0IE5hbWVFcnJvcjoKICAgIGRlZiBjYWxsYWJsZShvYmopOgogICAgICAgIHJldHVybiBhbnkoIl9fY2FsbF9fIiBpbiBrbGFzcy5fX2RpY3RfXyBmb3Iga2xhc3MgaW4gdHlwZShvYmopLl9fbXJvX18pCgoKaWYgUFkzOgogICAgZGVmIGdldF91bmJvdW5kX2Z1bmN0aW9uKHVuYm91bmQpOgogICAgICAgIHJldHVybiB1bmJvdW5kCgogICAgY3JlYXRlX2JvdW5kX21ldGhvZCA9IHR5cGVzLk1ldGhvZFR5cGUKCiAgICBkZWYgY3JlYXRlX3VuYm91bmRfbWV0aG9kKGZ1bmMsIGNscyk6CiAgICAgICAgcmV0dXJuIGZ1bmMKCiAgICBJdGVyYXRvciA9IG9iamVjdAplbHNlOgogICAgZGVmIGdldF91bmJvdW5kX2Z1bmN0aW9uKHVuYm91bmQpOgogICAgICAgIHJldHVybiB1bmJvdW5kLmltX2Z1bmMKCiAgICBkZWYgY3JlYXRlX2JvdW5kX21ldGhvZChmdW5jLCBvYmopOgogICAgICAgIHJldHVybiB0eXBlcy5NZXRob2RUeXBlKGZ1bmMsIG9iaiwgb2JqLl9fY2xhc3NfXykKCiAgICBkZWYgY3JlYXRlX3VuYm91bmRfbWV0aG9kKGZ1bmMsIGNscyk6CiAgICAgICAgcmV0dXJuIHR5cGVzLk1ldGhvZFR5cGUoZnVuYywgTm9uZSwgY2xzKQoKICAgIGNsYXNzIEl0ZXJhdG9yKG9iamVjdCk6CgogICAgICAgIGRlZiBuZXh0KHNlbGYpOgogICAgICAgICAgICByZXR1cm4gdHlwZShzZWxmKS5fX25leHRfXyhzZWxmKQoKICAgIGNhbGxhYmxlID0gY2FsbGFibGUKX2FkZF9kb2MoZ2V0X3VuYm91bmRfZnVuY3Rpb24sCiAgICAgICAgICIiIkdldCB0aGUgZnVuY3Rpb24gb3V0IG9mIGEgcG9zc2libHkgdW5ib3VuZCBmdW5jdGlvbiIiIikKCgpnZXRfbWV0aG9kX2Z1bmN0aW9uID0gb3BlcmF0b3IuYXR0cmdldHRlcihfbWV0aF9mdW5jKQpnZXRfbWV0aG9kX3NlbGYgPSBvcGVyYXRvci5hdHRyZ2V0dGVyKF9tZXRoX3NlbGYpCmdldF9mdW5jdGlvbl9jbG9zdXJlID0gb3BlcmF0b3IuYXR0cmdldHRlcihfZnVuY19jbG9zdXJlKQpnZXRfZnVuY3Rpb25fY29kZSA9IG9wZXJhdG9yLmF0dHJnZXR0ZXIoX2Z1bmNfY29kZSkKZ2V0X2Z1bmN0aW9uX2RlZmF1bHRzID0gb3BlcmF0b3IuYXR0cmdldHRlcihfZnVuY19kZWZhdWx0cykKZ2V0X2Z1bmN0aW9uX2dsb2JhbHMgPSBvcGVyYXRvci5hdHRyZ2V0dGVyKF9mdW5jX2dsb2JhbHMpCgoKaWYgUFkzOgogICAgZGVmIGl0ZXJrZXlzKGQsICoqa3cpOgogICAgICAgIHJldHVybiBpdGVyKGQua2V5cygqKmt3KSkKCiAgICBkZWYgaXRlcnZhbHVlcyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gaXRlcihkLnZhbHVlcygqKmt3KSkKCiAgICBkZWYgaXRlcml0ZW1zKGQsICoqa3cpOgogICAgICAgIHJldHVybiBpdGVyKGQuaXRlbXMoKiprdykpCgogICAgZGVmIGl0ZXJsaXN0cyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gaXRlcihkLmxpc3RzKCoqa3cpKQoKICAgIHZpZXdrZXlzID0gb3BlcmF0b3IubWV0aG9kY2FsbGVyKCJrZXlzIikKCiAgICB2aWV3dmFsdWVzID0gb3BlcmF0b3IubWV0aG9kY2FsbGVyKCJ2YWx1ZXMiKQoKICAgIHZpZXdpdGVtcyA9IG9wZXJhdG9yLm1ldGhvZGNhbGxlcigiaXRlbXMiKQplbHNlOgogICAgZGVmIGl0ZXJrZXlzKGQsICoqa3cpOgogICAgICAgIHJldHVybiBkLml0ZXJrZXlzKCoqa3cpCgogICAgZGVmIGl0ZXJ2YWx1ZXMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGQuaXRlcnZhbHVlcygqKmt3KQoKICAgIGRlZiBpdGVyaXRlbXMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGQuaXRlcml0ZW1zKCoqa3cpCgogICAgZGVmIGl0ZXJsaXN0cyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gZC5pdGVybGlzdHMoKiprdykKCiAgICB2aWV3a2V5cyA9IG9wZXJhdG9yLm1ldGhvZGNhbGxlcigidmlld2tleXMiKQoKICAgIHZpZXd2YWx1ZXMgPSBvcGVyYXRvci5tZXRob2RjYWxsZXIoInZpZXd2YWx1ZXMiKQoKICAgIHZpZXdpdGVtcyA9IG9wZXJhdG9yLm1ldGhvZGNhbGxlcigidmlld2l0ZW1zIikKCl9hZGRfZG9jKGl0ZXJrZXlzLCAiUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGtleXMgb2YgYSBkaWN0aW9uYXJ5LiIpCl9hZGRfZG9jKGl0ZXJ2YWx1ZXMsICJSZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGUgdmFsdWVzIG9mIGEgZGljdGlvbmFyeS4iKQpfYWRkX2RvYyhpdGVyaXRlbXMsCiAgICAgICAgICJSZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGUgKGtleSwgdmFsdWUpIHBhaXJzIG9mIGEgZGljdGlvbmFyeS4iKQpfYWRkX2RvYyhpdGVybGlzdHMsCiAgICAgICAgICJSZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGUgKGtleSwgW3ZhbHVlc10pIHBhaXJzIG9mIGEgZGljdGlvbmFyeS4iKQoKCmlmIFBZMzoKICAgIGRlZiBiKHMpOgogICAgICAgIHJldHVybiBzLmVuY29kZSgibGF0aW4tMSIpCgogICAgZGVmIHUocyk6CiAgICAgICAgcmV0dXJuIHMKICAgIHVuaWNociA9IGNocgogICAgaW1wb3J0IHN0cnVjdAogICAgaW50MmJ5dGUgPSBzdHJ1Y3QuU3RydWN0KCI+QiIpLnBhY2sKICAgIGRlbCBzdHJ1Y3QKICAgIGJ5dGUyaW50ID0gb3BlcmF0b3IuaXRlbWdldHRlcigwKQogICAgaW5kZXhieXRlcyA9IG9wZXJhdG9yLmdldGl0ZW0KICAgIGl0ZXJieXRlcyA9IGl0ZXIKICAgIGltcG9ydCBpbwogICAgU3RyaW5nSU8gPSBpby5TdHJpbmdJTwogICAgQnl0ZXNJTyA9IGlvLkJ5dGVzSU8KICAgIF9hc3NlcnRDb3VudEVxdWFsID0gImFzc2VydENvdW50RXF1YWwiCiAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzFdIDw9IDE6CiAgICAgICAgX2Fzc2VydFJhaXNlc1JlZ2V4ID0gImFzc2VydFJhaXNlc1JlZ2V4cCIKICAgICAgICBfYXNzZXJ0UmVnZXggPSAiYXNzZXJ0UmVnZXhwTWF0Y2hlcyIKICAgIGVsc2U6CiAgICAgICAgX2Fzc2VydFJhaXNlc1JlZ2V4ID0gImFzc2VydFJhaXNlc1JlZ2V4IgogICAgICAgIF9hc3NlcnRSZWdleCA9ICJhc3NlcnRSZWdleCIKZWxzZToKICAgIGRlZiBiKHMpOgogICAgICAgIHJldHVybiBzCiAgICAjIFdvcmthcm91bmQgZm9yIHN0YW5kYWxvbmUgYmFja3NsYXNoCgogICAgZGVmIHUocyk6CiAgICAgICAgcmV0dXJuIHVuaWNvZGUocy5yZXBsYWNlKHInXFwnLCByJ1xcXFwnKSwgInVuaWNvZGVfZXNjYXBlIikKICAgIHVuaWNociA9IHVuaWNocgogICAgaW50MmJ5dGUgPSBjaHIKCiAgICBkZWYgYnl0ZTJpbnQoYnMpOgogICAgICAgIHJldHVybiBvcmQoYnNbMF0pCgogICAgZGVmIGluZGV4Ynl0ZXMoYnVmLCBpKToKICAgICAgICByZXR1cm4gb3JkKGJ1ZltpXSkKICAgIGl0ZXJieXRlcyA9IGZ1bmN0b29scy5wYXJ0aWFsKGl0ZXJ0b29scy5pbWFwLCBvcmQpCiAgICBpbXBvcnQgU3RyaW5nSU8KICAgIFN0cmluZ0lPID0gQnl0ZXNJTyA9IFN0cmluZ0lPLlN0cmluZ0lPCiAgICBfYXNzZXJ0Q291bnRFcXVhbCA9ICJhc3NlcnRJdGVtc0VxdWFsIgogICAgX2Fzc2VydFJhaXNlc1JlZ2V4ID0gImFzc2VydFJhaXNlc1JlZ2V4cCIKICAgIF9hc3NlcnRSZWdleCA9ICJhc3NlcnRSZWdleHBNYXRjaGVzIgpfYWRkX2RvYyhiLCAiIiJCeXRlIGxpdGVyYWwiIiIpCl9hZGRfZG9jKHUsICIiIlRleHQgbGl0ZXJhbCIiIikKCgpkZWYgYXNzZXJ0Q291bnRFcXVhbChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgcmV0dXJuIGdldGF0dHIoc2VsZiwgX2Fzc2VydENvdW50RXF1YWwpKCphcmdzLCAqKmt3YXJncykKCgpkZWYgYXNzZXJ0UmFpc2VzUmVnZXgoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgIHJldHVybiBnZXRhdHRyKHNlbGYsIF9hc3NlcnRSYWlzZXNSZWdleCkoKmFyZ3MsICoqa3dhcmdzKQoKCmRlZiBhc3NlcnRSZWdleChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgcmV0dXJuIGdldGF0dHIoc2VsZiwgX2Fzc2VydFJlZ2V4KSgqYXJncywgKiprd2FyZ3MpCgoKaWYgUFkzOgogICAgZXhlY18gPSBnZXRhdHRyKG1vdmVzLmJ1aWx0aW5zLCAiZXhlYyIpCgogICAgZGVmIHJlcmFpc2UodHAsIHZhbHVlLCB0Yj1Ob25lKToKICAgICAgICBpZiB2YWx1ZSBpcyBOb25lOgogICAgICAgICAgICB2YWx1ZSA9IHRwKCkKICAgICAgICBpZiB2YWx1ZS5fX3RyYWNlYmFja19fIGlzIG5vdCB0YjoKICAgICAgICAgICAgcmFpc2UgdmFsdWUud2l0aF90cmFjZWJhY2sodGIpCiAgICAgICAgcmFpc2UgdmFsdWUKCmVsc2U6CiAgICBkZWYgZXhlY18oX2NvZGVfLCBfZ2xvYnNfPU5vbmUsIF9sb2NzXz1Ob25lKToKICAgICAgICAiIiJFeGVjdXRlIGNvZGUgaW4gYSBuYW1lc3BhY2UuIiIiCiAgICAgICAgaWYgX2dsb2JzXyBpcyBOb25lOgogICAgICAgICAgICBmcmFtZSA9IHN5cy5fZ2V0ZnJhbWUoMSkKICAgICAgICAgICAgX2dsb2JzXyA9IGZyYW1lLmZfZ2xvYmFscwogICAgICAgICAgICBpZiBfbG9jc18gaXMgTm9uZToKICAgICAgICAgICAgICAgIF9sb2NzXyA9IGZyYW1lLmZfbG9jYWxzCiAgICAgICAgICAgIGRlbCBmcmFtZQogICAgICAgIGVsaWYgX2xvY3NfIGlzIE5vbmU6CiAgICAgICAgICAgIF9sb2NzXyA9IF9nbG9ic18KICAgICAgICBleGVjKCIiImV4ZWMgX2NvZGVfIGluIF9nbG9ic18sIF9sb2NzXyIiIikKCiAgICBleGVjXygiIiJkZWYgcmVyYWlzZSh0cCwgdmFsdWUsIHRiPU5vbmUpOgogICAgcmFpc2UgdHAsIHZhbHVlLCB0YgoiIiIpCgoKaWYgc3lzLnZlcnNpb25faW5mb1s6Ml0gPT0gKDMsIDIpOgogICAgZXhlY18oIiIiZGVmIHJhaXNlX2Zyb20odmFsdWUsIGZyb21fdmFsdWUpOgogICAgaWYgZnJvbV92YWx1ZSBpcyBOb25lOgogICAgICAgIHJhaXNlIHZhbHVlCiAgICByYWlzZSB2YWx1ZSBmcm9tIGZyb21fdmFsdWUKIiIiKQplbGlmIHN5cy52ZXJzaW9uX2luZm9bOjJdID4gKDMsIDIpOgogICAgZXhlY18oIiIiZGVmIHJhaXNlX2Zyb20odmFsdWUsIGZyb21fdmFsdWUpOgogICAgcmFpc2UgdmFsdWUgZnJvbSBmcm9tX3ZhbHVlCiIiIikKZWxzZToKICAgIGRlZiByYWlzZV9mcm9tKHZhbHVlLCBmcm9tX3ZhbHVlKToKICAgICAgICByYWlzZSB2YWx1ZQoKCnByaW50XyA9IGdldGF0dHIobW92ZXMuYnVpbHRpbnMsICJwcmludCIsIE5vbmUpCmlmIHByaW50XyBpcyBOb25lOgogICAgZGVmIHByaW50XygqYXJncywgKiprd2FyZ3MpOgogICAgICAgICIiIlRoZSBuZXctc3R5bGUgcHJpbnQgZnVuY3Rpb24gZm9yIFB5dGhvbiAyLjQgYW5kIDIuNS4iIiIKICAgICAgICBmcCA9IGt3YXJncy5wb3AoImZpbGUiLCBzeXMuc3Rkb3V0KQogICAgICAgIGlmIGZwIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBkZWYgd3JpdGUoZGF0YSk6CiAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGRhdGEsIGJhc2VzdHJpbmcpOgogICAgICAgICAgICAgICAgZGF0YSA9IHN0cihkYXRhKQogICAgICAgICAgICAjIElmIHRoZSBmaWxlIGhhcyBhbiBlbmNvZGluZywgZW5jb2RlIHVuaWNvZGUgd2l0aCBpdC4KICAgICAgICAgICAgaWYgKGlzaW5zdGFuY2UoZnAsIGZpbGUpIGFuZAogICAgICAgICAgICAgICAgICAgIGlzaW5zdGFuY2UoZGF0YSwgdW5pY29kZSkgYW5kCiAgICAgICAgICAgICAgICAgICAgZnAuZW5jb2RpbmcgaXMgbm90IE5vbmUpOgogICAgICAgICAgICAgICAgZXJyb3JzID0gZ2V0YXR0cihmcCwgImVycm9ycyIsIE5vbmUpCiAgICAgICAgICAgICAgICBpZiBlcnJvcnMgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICBlcnJvcnMgPSAic3RyaWN0IgogICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEuZW5jb2RlKGZwLmVuY29kaW5nLCBlcnJvcnMpCiAgICAgICAgICAgIGZwLndyaXRlKGRhdGEpCiAgICAgICAgd2FudF91bmljb2RlID0gRmFsc2UKICAgICAgICBzZXAgPSBrd2FyZ3MucG9wKCJzZXAiLCBOb25lKQogICAgICAgIGlmIHNlcCBpcyBub3QgTm9uZToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzZXAsIHVuaWNvZGUpOgogICAgICAgICAgICAgICAgd2FudF91bmljb2RlID0gVHJ1ZQogICAgICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKHNlcCwgc3RyKToKICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigic2VwIG11c3QgYmUgTm9uZSBvciBhIHN0cmluZyIpCiAgICAgICAgZW5kID0ga3dhcmdzLnBvcCgiZW5kIiwgTm9uZSkKICAgICAgICBpZiBlbmQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZW5kLCB1bmljb2RlKToKICAgICAgICAgICAgICAgIHdhbnRfdW5pY29kZSA9IFRydWUKICAgICAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShlbmQsIHN0cik6CiAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImVuZCBtdXN0IGJlIE5vbmUgb3IgYSBzdHJpbmciKQogICAgICAgIGlmIGt3YXJnczoKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJpbnZhbGlkIGtleXdvcmQgYXJndW1lbnRzIHRvIHByaW50KCkiKQogICAgICAgIGlmIG5vdCB3YW50X3VuaWNvZGU6CiAgICAgICAgICAgIGZvciBhcmcgaW4gYXJnczoKICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYXJnLCB1bmljb2RlKToKICAgICAgICAgICAgICAgICAgICB3YW50X3VuaWNvZGUgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBpZiB3YW50X3VuaWNvZGU6CiAgICAgICAgICAgIG5ld2xpbmUgPSB1bmljb2RlKCJcbiIpCiAgICAgICAgICAgIHNwYWNlID0gdW5pY29kZSgiICIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbmV3bGluZSA9ICJcbiIKICAgICAgICAgICAgc3BhY2UgPSAiICIKICAgICAgICBpZiBzZXAgaXMgTm9uZToKICAgICAgICAgICAgc2VwID0gc3BhY2UKICAgICAgICBpZiBlbmQgaXMgTm9uZToKICAgICAgICAgICAgZW5kID0gbmV3bGluZQogICAgICAgIGZvciBpLCBhcmcgaW4gZW51bWVyYXRlKGFyZ3MpOgogICAgICAgICAgICBpZiBpOgogICAgICAgICAgICAgICAgd3JpdGUoc2VwKQogICAgICAgICAgICB3cml0ZShhcmcpCiAgICAgICAgd3JpdGUoZW5kKQppZiBzeXMudmVyc2lvbl9pbmZvWzoyXSA8ICgzLCAzKToKICAgIF9wcmludCA9IHByaW50XwoKICAgIGRlZiBwcmludF8oKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICBmcCA9IGt3YXJncy5nZXQoImZpbGUiLCBzeXMuc3Rkb3V0KQogICAgICAgIGZsdXNoID0ga3dhcmdzLnBvcCgiZmx1c2giLCBGYWxzZSkKICAgICAgICBfcHJpbnQoKmFyZ3MsICoqa3dhcmdzKQogICAgICAgIGlmIGZsdXNoIGFuZCBmcCBpcyBub3QgTm9uZToKICAgICAgICAgICAgZnAuZmx1c2goKQoKX2FkZF9kb2MocmVyYWlzZSwgIiIiUmVyYWlzZSBhbiBleGNlcHRpb24uIiIiKQoKaWYgc3lzLnZlcnNpb25faW5mb1swOjJdIDwgKDMsIDQpOgogICAgZGVmIHdyYXBzKHdyYXBwZWQsIGFzc2lnbmVkPWZ1bmN0b29scy5XUkFQUEVSX0FTU0lHTk1FTlRTLAogICAgICAgICAgICAgIHVwZGF0ZWQ9ZnVuY3Rvb2xzLldSQVBQRVJfVVBEQVRFUyk6CiAgICAgICAgZGVmIHdyYXBwZXIoZik6CiAgICAgICAgICAgIGYgPSBmdW5jdG9vbHMud3JhcHMod3JhcHBlZCwgYXNzaWduZWQsIHVwZGF0ZWQpKGYpCiAgICAgICAgICAgIGYuX193cmFwcGVkX18gPSB3cmFwcGVkCiAgICAgICAgICAgIHJldHVybiBmCiAgICAgICAgcmV0dXJuIHdyYXBwZXIKZWxzZToKICAgIHdyYXBzID0gZnVuY3Rvb2xzLndyYXBzCgoKZGVmIHdpdGhfbWV0YWNsYXNzKG1ldGEsICpiYXNlcyk6CiAgICAiIiJDcmVhdGUgYSBiYXNlIGNsYXNzIHdpdGggYSBtZXRhY2xhc3MuIiIiCiAgICAjIFRoaXMgcmVxdWlyZXMgYSBiaXQgb2YgZXhwbGFuYXRpb246IHRoZSBiYXNpYyBpZGVhIGlzIHRvIG1ha2UgYSBkdW1teQogICAgIyBtZXRhY2xhc3MgZm9yIG9uZSBsZXZlbCBvZiBjbGFzcyBpbnN0YW50aWF0aW9uIHRoYXQgcmVwbGFjZXMgaXRzZWxmIHdpdGgKICAgICMgdGhlIGFjdHVhbCBtZXRhY2xhc3MuCiAgICBjbGFzcyBtZXRhY2xhc3MobWV0YSk6CgogICAgICAgIGRlZiBfX25ld19fKGNscywgbmFtZSwgdGhpc19iYXNlcywgZCk6CiAgICAgICAgICAgIHJldHVybiBtZXRhKG5hbWUsIGJhc2VzLCBkKQogICAgcmV0dXJuIHR5cGUuX19uZXdfXyhtZXRhY2xhc3MsICd0ZW1wb3JhcnlfY2xhc3MnLCAoKSwge30pCgoKZGVmIGFkZF9tZXRhY2xhc3MobWV0YWNsYXNzKToKICAgICIiIkNsYXNzIGRlY29yYXRvciBmb3IgY3JlYXRpbmcgYSBjbGFzcyB3aXRoIGEgbWV0YWNsYXNzLiIiIgogICAgZGVmIHdyYXBwZXIoY2xzKToKICAgICAgICBvcmlnX3ZhcnMgPSBjbHMuX19kaWN0X18uY29weSgpCiAgICAgICAgc2xvdHMgPSBvcmlnX3ZhcnMuZ2V0KCdfX3Nsb3RzX18nKQogICAgICAgIGlmIHNsb3RzIGlzIG5vdCBOb25lOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNsb3RzLCBzdHIpOgogICAgICAgICAgICAgICAgc2xvdHMgPSBbc2xvdHNdCiAgICAgICAgICAgIGZvciBzbG90c192YXIgaW4gc2xvdHM6CiAgICAgICAgICAgICAgICBvcmlnX3ZhcnMucG9wKHNsb3RzX3ZhcikKICAgICAgICBvcmlnX3ZhcnMucG9wKCdfX2RpY3RfXycsIE5vbmUpCiAgICAgICAgb3JpZ192YXJzLnBvcCgnX193ZWFrcmVmX18nLCBOb25lKQogICAgICAgIHJldHVybiBtZXRhY2xhc3MoY2xzLl9fbmFtZV9fLCBjbHMuX19iYXNlc19fLCBvcmlnX3ZhcnMpCiAgICByZXR1cm4gd3JhcHBlcgoKCmRlZiBweXRob25fMl91bmljb2RlX2NvbXBhdGlibGUoa2xhc3MpOgogICAgIiIiCiAgICBBIGRlY29yYXRvciB0aGF0IGRlZmluZXMgX191bmljb2RlX18gYW5kIF9fc3RyX18gbWV0aG9kcyB1bmRlciBQeXRob24gMi4KICAgIFVuZGVyIFB5dGhvbiAzIGl0IGRvZXMgbm90aGluZy4KCiAgICBUbyBzdXBwb3J0IFB5dGhvbiAyIGFuZCAzIHdpdGggYSBzaW5nbGUgY29kZSBiYXNlLCBkZWZpbmUgYSBfX3N0cl9fIG1ldGhvZAogICAgcmV0dXJuaW5nIHRleHQgYW5kIGFwcGx5IHRoaXMgZGVjb3JhdG9yIHRvIHRoZSBjbGFzcy4KICAgICIiIgogICAgaWYgUFkyOgogICAgICAgIGlmICdfX3N0cl9fJyBub3QgaW4ga2xhc3MuX19kaWN0X186CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkBweXRob25fMl91bmljb2RlX2NvbXBhdGlibGUgY2Fubm90IGJlIGFwcGxpZWQgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0byAlcyBiZWNhdXNlIGl0IGRvZXNuJ3QgZGVmaW5lIF9fc3RyX18oKS4iICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbGFzcy5fX25hbWVfXykKICAgICAgICBrbGFzcy5fX3VuaWNvZGVfXyA9IGtsYXNzLl9fc3RyX18KICAgICAgICBrbGFzcy5fX3N0cl9fID0gbGFtYmRhIHNlbGY6IHNlbGYuX191bmljb2RlX18oKS5lbmNvZGUoJ3V0Zi04JykKICAgIHJldHVybiBrbGFzcwoKCiMgQ29tcGxldGUgdGhlIG1vdmVzIGltcGxlbWVudGF0aW9uLgojIFRoaXMgY29kZSBpcyBhdCB0aGUgZW5kIG9mIHRoaXMgbW9kdWxlIHRvIHNwZWVkIHVwIG1vZHVsZSBsb2FkaW5nLgojIFR1cm4gdGhpcyBtb2R1bGUgaW50byBhIHBhY2thZ2UuCl9fcGF0aF9fID0gW10gICMgcmVxdWlyZWQgZm9yIFBFUCAzMDIgYW5kIFBFUCA0NTEKX19wYWNrYWdlX18gPSBfX25hbWVfXyAgIyBzZWUgUEVQIDM2NiBAUmVzZXJ2ZWRBc3NpZ25tZW50CmlmIGdsb2JhbHMoKS5nZXQoIl9fc3BlY19fIikgaXMgbm90IE5vbmU6CiAgICBfX3NwZWNfXy5zdWJtb2R1bGVfc2VhcmNoX2xvY2F0aW9ucyA9IFtdICAjIFBFUCA0NTEgQFVuZGVmaW5lZFZhcmlhYmxlCiMgUmVtb3ZlIG90aGVyIHNpeCBtZXRhIHBhdGggaW1wb3J0ZXJzLCBzaW5jZSB0aGV5IGNhdXNlIHByb2JsZW1zLiBUaGlzIGNhbgojIGhhcHBlbiBpZiBzaXggaXMgcmVtb3ZlZCBmcm9tIHN5cy5tb2R1bGVzIGFuZCB0aGVuIHJlbG9hZGVkLiAoU2V0dXB0b29scyBkb2VzCiMgdGhpcyBmb3Igc29tZSByZWFzb24uKQppZiBzeXMubWV0YV9wYXRoOgogICAgZm9yIGksIGltcG9ydGVyIGluIGVudW1lcmF0ZShzeXMubWV0YV9wYXRoKToKICAgICAgICAjIEhlcmUncyBzb21lIHJlYWwgbmFzdGluZXNzOiBBbm90aGVyICJpbnN0YW5jZSIgb2YgdGhlIHNpeCBtb2R1bGUgbWlnaHQKICAgICAgICAjIGJlIGZsb2F0aW5nIGFyb3VuZC4gVGhlcmVmb3JlLCB3ZSBjYW4ndCB1c2UgaXNpbnN0YW5jZSgpIHRvIGNoZWNrIGZvcgogICAgICAgICMgdGhlIHNpeCBtZXRhIHBhdGggaW1wb3J0ZXIsIHNpbmNlIHRoZSBvdGhlciBzaXggaW5zdGFuY2Ugd2lsbCBoYXZlCiAgICAgICAgIyBpbnNlcnRlZCBhbiBpbXBvcnRlciB3aXRoIGRpZmZlcmVudCBjbGFzcy4KICAgICAgICBpZiAodHlwZShpbXBvcnRlcikuX19uYW1lX18gPT0gIl9TaXhNZXRhUGF0aEltcG9ydGVyIiBhbmQKICAgICAgICAgICAgICAgIGltcG9ydGVyLm5hbWUgPT0gX19uYW1lX18pOgogICAgICAgICAgICBkZWwgc3lzLm1ldGFfcGF0aFtpXQogICAgICAgICAgICBicmVhawogICAgZGVsIGksIGltcG9ydGVyCiMgRmluYWxseSwgYWRkIHRoZSBpbXBvcnRlciB0byB0aGUgbWV0YSBwYXRoIGltcG9ydCBob29rLgpzeXMubWV0YV9wYXRoLmFwcGVuZChfaW1wb3J0ZXIpClBLAwQUAAAAAAAAACEApYdlUcAZAADAGQAAPwAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2FyY2hpdmVfdXRpbC5weSIiIlV0aWxpdGllcyBmb3IgZXh0cmFjdGluZyBjb21tb24gYXJjaGl2ZSBmb3JtYXRzIiIiCgppbXBvcnQgemlwZmlsZQppbXBvcnQgdGFyZmlsZQppbXBvcnQgb3MKaW1wb3J0IHNodXRpbAppbXBvcnQgcG9zaXhwYXRoCmltcG9ydCBjb250ZXh0bGliCmZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzRXJyb3IKCmZyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgZW5zdXJlX2RpcmVjdG9yeQoKX19hbGxfXyA9IFsKICAgICJ1bnBhY2tfYXJjaGl2ZSIsICJ1bnBhY2tfemlwZmlsZSIsICJ1bnBhY2tfdGFyZmlsZSIsICJkZWZhdWx0X2ZpbHRlciIsCiAgICAiVW5yZWNvZ25pemVkRm9ybWF0IiwgImV4dHJhY3Rpb25fZHJpdmVycyIsICJ1bnBhY2tfZGlyZWN0b3J5IiwKXQoKCmNsYXNzIFVucmVjb2duaXplZEZvcm1hdChEaXN0dXRpbHNFcnJvcik6CiAgICAiIiJDb3VsZG4ndCByZWNvZ25pemUgdGhlIGFyY2hpdmUgdHlwZSIiIgoKCmRlZiBkZWZhdWx0X2ZpbHRlcihzcmMsIGRzdCk6CiAgICAiIiJUaGUgZGVmYXVsdCBwcm9ncmVzcy9maWx0ZXIgY2FsbGJhY2s7IHJldHVybnMgVHJ1ZSBmb3IgYWxsIGZpbGVzIiIiCiAgICByZXR1cm4gZHN0CgoKZGVmIHVucGFja19hcmNoaXZlKGZpbGVuYW1lLCBleHRyYWN0X2RpciwgcHJvZ3Jlc3NfZmlsdGVyPWRlZmF1bHRfZmlsdGVyLAogICAgICAgIGRyaXZlcnM9Tm9uZSk6CiAgICAiIiJVbnBhY2sgYGZpbGVuYW1lYCB0byBgZXh0cmFjdF9kaXJgLCBvciByYWlzZSBgYFVucmVjb2duaXplZEZvcm1hdGBgCgogICAgYHByb2dyZXNzX2ZpbHRlcmAgaXMgYSBmdW5jdGlvbiB0YWtpbmcgdHdvIGFyZ3VtZW50czogYSBzb3VyY2UgcGF0aAogICAgaW50ZXJuYWwgdG8gdGhlIGFyY2hpdmUgKCcvJy1zZXBhcmF0ZWQpLCBhbmQgYSBmaWxlc3lzdGVtIHBhdGggd2hlcmUgaXQKICAgIHdpbGwgYmUgZXh0cmFjdGVkLiAgVGhlIGNhbGxiYWNrIG11c3QgcmV0dXJuIHRoZSBkZXNpcmVkIGV4dHJhY3QgcGF0aAogICAgKHdoaWNoIG1heSBiZSB0aGUgc2FtZSBhcyB0aGUgb25lIHBhc3NlZCBpbiksIG9yIGVsc2UgYGBOb25lYGAgdG8gc2tpcAogICAgdGhhdCBmaWxlIG9yIGRpcmVjdG9yeS4gIFRoZSBjYWxsYmFjayBjYW4gdGh1cyBiZSB1c2VkIHRvIHJlcG9ydCBvbiB0aGUKICAgIHByb2dyZXNzIG9mIHRoZSBleHRyYWN0aW9uLCBhcyB3ZWxsIGFzIHRvIGZpbHRlciB0aGUgaXRlbXMgZXh0cmFjdGVkIG9yCiAgICBhbHRlciB0aGVpciBleHRyYWN0aW9uIHBhdGhzLgoKICAgIGBkcml2ZXJzYCwgaWYgc3VwcGxpZWQsIG11c3QgYmUgYSBub24tZW1wdHkgc2VxdWVuY2Ugb2YgZnVuY3Rpb25zIHdpdGggdGhlCiAgICBzYW1lIHNpZ25hdHVyZSBhcyB0aGlzIGZ1bmN0aW9uIChtaW51cyB0aGUgYGRyaXZlcnNgIGFyZ3VtZW50KSwgdGhhdCByYWlzZQogICAgYGBVbnJlY29nbml6ZWRGb3JtYXRgYCBpZiB0aGV5IGRvIG5vdCBzdXBwb3J0IGV4dHJhY3RpbmcgdGhlIGRlc2lnbmF0ZWQKICAgIGFyY2hpdmUgdHlwZS4gIFRoZSBgZHJpdmVyc2AgYXJlIHRyaWVkIGluIHNlcXVlbmNlIHVudGlsIG9uZSBpcyBmb3VuZCB0aGF0CiAgICBkb2VzIG5vdCByYWlzZSBhbiBlcnJvciwgb3IgdW50aWwgYWxsIGFyZSBleGhhdXN0ZWQgKGluIHdoaWNoIGNhc2UKICAgIGBgVW5yZWNvZ25pemVkRm9ybWF0YGAgaXMgcmFpc2VkKS4gIElmIHlvdSBkbyBub3Qgc3VwcGx5IGEgc2VxdWVuY2Ugb2YKICAgIGRyaXZlcnMsIHRoZSBtb2R1bGUncyBgYGV4dHJhY3Rpb25fZHJpdmVyc2BgIGNvbnN0YW50IHdpbGwgYmUgdXNlZCwgd2hpY2gKICAgIG1lYW5zIHRoYXQgYGB1bnBhY2tfemlwZmlsZWBgIGFuZCBgYHVucGFja190YXJmaWxlYGAgd2lsbCBiZSB0cmllZCwgaW4gdGhhdAogICAgb3JkZXIuCiAgICAiIiIKICAgIGZvciBkcml2ZXIgaW4gZHJpdmVycyBvciBleHRyYWN0aW9uX2RyaXZlcnM6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBkcml2ZXIoZmlsZW5hbWUsIGV4dHJhY3RfZGlyLCBwcm9ncmVzc19maWx0ZXIpCiAgICAgICAgZXhjZXB0IFVucmVjb2duaXplZEZvcm1hdDoKICAgICAgICAgICAgY29udGludWUKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4KICAgIGVsc2U6CiAgICAgICAgcmFpc2UgVW5yZWNvZ25pemVkRm9ybWF0KAogICAgICAgICAgICAiTm90IGEgcmVjb2duaXplZCBhcmNoaXZlIHR5cGU6ICVzIiAlIGZpbGVuYW1lCiAgICAgICAgKQoKCmRlZiB1bnBhY2tfZGlyZWN0b3J5KGZpbGVuYW1lLCBleHRyYWN0X2RpciwgcHJvZ3Jlc3NfZmlsdGVyPWRlZmF1bHRfZmlsdGVyKToKICAgICIiIiJVbnBhY2siIGEgZGlyZWN0b3J5LCB1c2luZyB0aGUgc2FtZSBpbnRlcmZhY2UgYXMgZm9yIGFyY2hpdmVzCgogICAgUmFpc2VzIGBgVW5yZWNvZ25pemVkRm9ybWF0YGAgaWYgYGZpbGVuYW1lYCBpcyBub3QgYSBkaXJlY3RvcnkKICAgICIiIgogICAgaWYgbm90IG9zLnBhdGguaXNkaXIoZmlsZW5hbWUpOgogICAgICAgIHJhaXNlIFVucmVjb2duaXplZEZvcm1hdCgiJXMgaXMgbm90IGEgZGlyZWN0b3J5IiAlIGZpbGVuYW1lKQoKICAgIHBhdGhzID0gewogICAgICAgIGZpbGVuYW1lOiAoJycsIGV4dHJhY3RfZGlyKSwKICAgIH0KICAgIGZvciBiYXNlLCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKGZpbGVuYW1lKToKICAgICAgICBzcmMsIGRzdCA9IHBhdGhzW2Jhc2VdCiAgICAgICAgZm9yIGQgaW4gZGlyczoKICAgICAgICAgICAgcGF0aHNbb3MucGF0aC5qb2luKGJhc2UsIGQpXSA9IHNyYyArIGQgKyAnLycsIG9zLnBhdGguam9pbihkc3QsIGQpCiAgICAgICAgZm9yIGYgaW4gZmlsZXM6CiAgICAgICAgICAgIHRhcmdldCA9IG9zLnBhdGguam9pbihkc3QsIGYpCiAgICAgICAgICAgIHRhcmdldCA9IHByb2dyZXNzX2ZpbHRlcihzcmMgKyBmLCB0YXJnZXQpCiAgICAgICAgICAgIGlmIG5vdCB0YXJnZXQ6CiAgICAgICAgICAgICAgICAjIHNraXAgbm9uLWZpbGVzCiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBlbnN1cmVfZGlyZWN0b3J5KHRhcmdldCkKICAgICAgICAgICAgZiA9IG9zLnBhdGguam9pbihiYXNlLCBmKQogICAgICAgICAgICBzaHV0aWwuY29weWZpbGUoZiwgdGFyZ2V0KQogICAgICAgICAgICBzaHV0aWwuY29weXN0YXQoZiwgdGFyZ2V0KQoKCmRlZiB1bnBhY2tfemlwZmlsZShmaWxlbmFtZSwgZXh0cmFjdF9kaXIsIHByb2dyZXNzX2ZpbHRlcj1kZWZhdWx0X2ZpbHRlcik6CiAgICAiIiJVbnBhY2sgemlwIGBmaWxlbmFtZWAgdG8gYGV4dHJhY3RfZGlyYAoKICAgIFJhaXNlcyBgYFVucmVjb2duaXplZEZvcm1hdGBgIGlmIGBmaWxlbmFtZWAgaXMgbm90IGEgemlwZmlsZSAoYXMgZGV0ZXJtaW5lZAogICAgYnkgYGB6aXBmaWxlLmlzX3ppcGZpbGUoKWBgKS4gIFNlZSBgYHVucGFja19hcmNoaXZlKClgYCBmb3IgYW4gZXhwbGFuYXRpb24KICAgIG9mIHRoZSBgcHJvZ3Jlc3NfZmlsdGVyYCBhcmd1bWVudC4KICAgICIiIgoKICAgIGlmIG5vdCB6aXBmaWxlLmlzX3ppcGZpbGUoZmlsZW5hbWUpOgogICAgICAgIHJhaXNlIFVucmVjb2duaXplZEZvcm1hdCgiJXMgaXMgbm90IGEgemlwIGZpbGUiICUgKGZpbGVuYW1lLCkpCgogICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoZmlsZW5hbWUpIGFzIHo6CiAgICAgICAgZm9yIGluZm8gaW4gei5pbmZvbGlzdCgpOgogICAgICAgICAgICBuYW1lID0gaW5mby5maWxlbmFtZQoKICAgICAgICAgICAgIyBkb24ndCBleHRyYWN0IGFic29sdXRlIHBhdGhzIG9yIG9uZXMgd2l0aCAuLiBpbiB0aGVtCiAgICAgICAgICAgIGlmIG5hbWUuc3RhcnRzd2l0aCgnLycpIG9yICcuLicgaW4gbmFtZS5zcGxpdCgnLycpOgogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgIHRhcmdldCA9IG9zLnBhdGguam9pbihleHRyYWN0X2RpciwgKm5hbWUuc3BsaXQoJy8nKSkKICAgICAgICAgICAgdGFyZ2V0ID0gcHJvZ3Jlc3NfZmlsdGVyKG5hbWUsIHRhcmdldCkKICAgICAgICAgICAgaWYgbm90IHRhcmdldDoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIG5hbWUuZW5kc3dpdGgoJy8nKToKICAgICAgICAgICAgICAgICMgZGlyZWN0b3J5CiAgICAgICAgICAgICAgICBlbnN1cmVfZGlyZWN0b3J5KHRhcmdldCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgZmlsZQogICAgICAgICAgICAgICAgZW5zdXJlX2RpcmVjdG9yeSh0YXJnZXQpCiAgICAgICAgICAgICAgICBkYXRhID0gei5yZWFkKGluZm8uZmlsZW5hbWUpCiAgICAgICAgICAgICAgICB3aXRoIG9wZW4odGFyZ2V0LCAnd2InKSBhcyBmOgogICAgICAgICAgICAgICAgICAgIGYud3JpdGUoZGF0YSkKICAgICAgICAgICAgdW5peF9hdHRyaWJ1dGVzID0gaW5mby5leHRlcm5hbF9hdHRyID4+IDE2CiAgICAgICAgICAgIGlmIHVuaXhfYXR0cmlidXRlczoKICAgICAgICAgICAgICAgIG9zLmNobW9kKHRhcmdldCwgdW5peF9hdHRyaWJ1dGVzKQoKCmRlZiB1bnBhY2tfdGFyZmlsZShmaWxlbmFtZSwgZXh0cmFjdF9kaXIsIHByb2dyZXNzX2ZpbHRlcj1kZWZhdWx0X2ZpbHRlcik6CiAgICAiIiJVbnBhY2sgdGFyL3Rhci5nei90YXIuYnoyIGBmaWxlbmFtZWAgdG8gYGV4dHJhY3RfZGlyYAoKICAgIFJhaXNlcyBgYFVucmVjb2duaXplZEZvcm1hdGBgIGlmIGBmaWxlbmFtZWAgaXMgbm90IGEgdGFyZmlsZSAoYXMgZGV0ZXJtaW5lZAogICAgYnkgYGB0YXJmaWxlLm9wZW4oKWBgKS4gIFNlZSBgYHVucGFja19hcmNoaXZlKClgYCBmb3IgYW4gZXhwbGFuYXRpb24KICAgIG9mIHRoZSBgcHJvZ3Jlc3NfZmlsdGVyYCBhcmd1bWVudC4KICAgICIiIgogICAgdHJ5OgogICAgICAgIHRhcm9iaiA9IHRhcmZpbGUub3BlbihmaWxlbmFtZSkKICAgIGV4Y2VwdCB0YXJmaWxlLlRhckVycm9yOgogICAgICAgIHJhaXNlIFVucmVjb2duaXplZEZvcm1hdCgKICAgICAgICAgICAgIiVzIGlzIG5vdCBhIGNvbXByZXNzZWQgb3IgdW5jb21wcmVzc2VkIHRhciBmaWxlIiAlIChmaWxlbmFtZSwpCiAgICAgICAgKQogICAgd2l0aCBjb250ZXh0bGliLmNsb3NpbmcodGFyb2JqKToKICAgICAgICAjIGRvbid0IGRvIGFueSBjaG93bmluZyEKICAgICAgICB0YXJvYmouY2hvd24gPSBsYW1iZGEgKmFyZ3M6IE5vbmUKICAgICAgICBmb3IgbWVtYmVyIGluIHRhcm9iajoKICAgICAgICAgICAgbmFtZSA9IG1lbWJlci5uYW1lCiAgICAgICAgICAgICMgZG9uJ3QgZXh0cmFjdCBhYnNvbHV0ZSBwYXRocyBvciBvbmVzIHdpdGggLi4gaW4gdGhlbQogICAgICAgICAgICBpZiBub3QgbmFtZS5zdGFydHN3aXRoKCcvJykgYW5kICcuLicgbm90IGluIG5hbWUuc3BsaXQoJy8nKToKICAgICAgICAgICAgICAgIHByZWxpbV9kc3QgPSBvcy5wYXRoLmpvaW4oZXh0cmFjdF9kaXIsICpuYW1lLnNwbGl0KCcvJykpCgogICAgICAgICAgICAgICAgIyByZXNvbHZlIGFueSBsaW5rcyBhbmQgdG8gZXh0cmFjdCB0aGUgbGluayB0YXJnZXRzIGFzIG5vcm1hbAogICAgICAgICAgICAgICAgIyBmaWxlcwogICAgICAgICAgICAgICAgd2hpbGUgbWVtYmVyIGlzIG5vdCBOb25lIGFuZCAobWVtYmVyLmlzbG5rKCkgb3IgbWVtYmVyLmlzc3ltKCkpOgogICAgICAgICAgICAgICAgICAgIGxpbmtwYXRoID0gbWVtYmVyLmxpbmtuYW1lCiAgICAgICAgICAgICAgICAgICAgaWYgbWVtYmVyLmlzc3ltKCk6CiAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgPSBwb3NpeHBhdGguZGlybmFtZShtZW1iZXIubmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgbGlua3BhdGggPSBwb3NpeHBhdGguam9pbihiYXNlLCBsaW5rcGF0aCkKICAgICAgICAgICAgICAgICAgICAgICAgbGlua3BhdGggPSBwb3NpeHBhdGgubm9ybXBhdGgobGlua3BhdGgpCiAgICAgICAgICAgICAgICAgICAgbWVtYmVyID0gdGFyb2JqLl9nZXRtZW1iZXIobGlua3BhdGgpCgogICAgICAgICAgICAgICAgaWYgbWVtYmVyIGlzIG5vdCBOb25lIGFuZCAobWVtYmVyLmlzZmlsZSgpIG9yIG1lbWJlci5pc2RpcigpKToKICAgICAgICAgICAgICAgICAgICBmaW5hbF9kc3QgPSBwcm9ncmVzc19maWx0ZXIobmFtZSwgcHJlbGltX2RzdCkKICAgICAgICAgICAgICAgICAgICBpZiBmaW5hbF9kc3Q6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGZpbmFsX2RzdC5lbmRzd2l0aChvcy5zZXApOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxfZHN0ID0gZmluYWxfZHN0WzotMV0KICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBYWFggVWdoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJvYmouX2V4dHJhY3RfbWVtYmVyKG1lbWJlciwgZmluYWxfZHN0KQogICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgdGFyZmlsZS5FeHRyYWN0RXJyb3I6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGNob3duL2NobW9kL21rZmlmby9ta25vZGUvbWFrZWRldiBmYWlsZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICByZXR1cm4gVHJ1ZQoKCmV4dHJhY3Rpb25fZHJpdmVycyA9IHVucGFja19kaXJlY3RvcnksIHVucGFja196aXBmaWxlLCB1bnBhY2tfdGFyZmlsZQpQSwMEFAAAAAAAAAAhAMa1smN9JQAAfSUAAD0AAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9idWlsZF9tZXRhLnB5IiIiQSBQRVAgNTE3IGludGVyZmFjZSB0byBzZXR1cHRvb2xzCgpQcmV2aW91c2x5LCB3aGVuIGEgdXNlciBvciBhIGNvbW1hbmQgbGluZSB0b29sIChsZXQncyBjYWxsIGl0IGEgImZyb250ZW5kIikKbmVlZGVkIHRvIG1ha2UgYSByZXF1ZXN0IG9mIHNldHVwdG9vbHMgdG8gdGFrZSBhIGNlcnRhaW4gYWN0aW9uLCBmb3IKZXhhbXBsZSwgZ2VuZXJhdGluZyBhIGxpc3Qgb2YgaW5zdGFsbGF0aW9uIHJlcXVpcmVtZW50cywgdGhlIGZyb250ZW5kIHdvdWxkCndvdWxkIGNhbGwgInNldHVwLnB5IGVnZ19pbmZvIiBvciAic2V0dXAucHkgYmRpc3Rfd2hlZWwiIG9uIHRoZSBjb21tYW5kIGxpbmUuCgpQRVAgNTE3IGRlZmluZXMgYSBkaWZmZXJlbnQgbWV0aG9kIG9mIGludGVyZmFjaW5nIHdpdGggc2V0dXB0b29scy4gUmF0aGVyCnRoYW4gY2FsbGluZyAic2V0dXAucHkiIGRpcmVjdGx5LCB0aGUgZnJvbnRlbmQgc2hvdWxkOgoKICAxLiBTZXQgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHRvIHRoZSBkaXJlY3Rvcnkgd2l0aCBhIHNldHVwLnB5IGZpbGUKICAyLiBJbXBvcnQgdGhpcyBtb2R1bGUgaW50byBhIHNhZmUgcHl0aG9uIGludGVycHJldGVyIChvbmUgaW4gd2hpY2gKICAgICBzZXR1cHRvb2xzIGNhbiBwb3RlbnRpYWxseSBzZXQgZ2xvYmFsIHZhcmlhYmxlcyBvciBjcmFzaCBoYXJkKS4KICAzLiBDYWxsIG9uZSBvZiB0aGUgZnVuY3Rpb25zIGRlZmluZWQgaW4gUEVQIDUxNy4KCldoYXQgZWFjaCBmdW5jdGlvbiBkb2VzIGlzIGRlZmluZWQgaW4gUEVQIDUxNy4gSG93ZXZlciwgaGVyZSBpcyBhICJjYXN1YWwiCmRlZmluaXRpb24gb2YgdGhlIGZ1bmN0aW9ucyAodGhpcyBkZWZpbml0aW9uIHNob3VsZCBub3QgYmUgcmVsaWVkIG9uIGZvcgpidWcgcmVwb3J0cyBvciBBUEkgc3RhYmlsaXR5KToKCiAgLSBgYnVpbGRfd2hlZWxgOiBidWlsZCBhIHdoZWVsIGluIHRoZSBmb2xkZXIgYW5kIHJldHVybiB0aGUgYmFzZW5hbWUKICAtIGBnZXRfcmVxdWlyZXNfZm9yX2J1aWxkX3doZWVsYDogZ2V0IHRoZSBgc2V0dXBfcmVxdWlyZXNgIHRvIGJ1aWxkCiAgLSBgcHJlcGFyZV9tZXRhZGF0YV9mb3JfYnVpbGRfd2hlZWxgOiBnZXQgdGhlIGBpbnN0YWxsX3JlcXVpcmVzYAogIC0gYGJ1aWxkX3NkaXN0YDogYnVpbGQgYW4gc2Rpc3QgaW4gdGhlIGZvbGRlciBhbmQgcmV0dXJuIHRoZSBiYXNlbmFtZQogIC0gYGdldF9yZXF1aXJlc19mb3JfYnVpbGRfc2Rpc3RgOiBnZXQgdGhlIGBzZXR1cF9yZXF1aXJlc2AgdG8gYnVpbGQKCkFnYWluLCB0aGlzIGlzIG5vdCBhIGZvcm1hbCBkZWZpbml0aW9uISBKdXN0IGEgInRhc3RlIiBvZiB0aGUgbW9kdWxlLgoiIiIKCmltcG9ydCBpbwppbXBvcnQgb3MKaW1wb3J0IHN5cwppbXBvcnQgdG9rZW5pemUKaW1wb3J0IHNodXRpbAppbXBvcnQgY29udGV4dGxpYgoKaW1wb3J0IHNldHVwdG9vbHMKaW1wb3J0IGRpc3R1dGlscwpmcm9tIHNldHVwdG9vbHMucHkzMWNvbXBhdCBpbXBvcnQgVGVtcG9yYXJ5RGlyZWN0b3J5Cgpmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0IHBhcnNlX3JlcXVpcmVtZW50cwpmcm9tIHBrZ19yZXNvdXJjZXMucHkzMWNvbXBhdCBpbXBvcnQgbWFrZWRpcnMKCl9fYWxsX18gPSBbJ2dldF9yZXF1aXJlc19mb3JfYnVpbGRfc2Rpc3QnLAogICAgICAgICAgICdnZXRfcmVxdWlyZXNfZm9yX2J1aWxkX3doZWVsJywKICAgICAgICAgICAncHJlcGFyZV9tZXRhZGF0YV9mb3JfYnVpbGRfd2hlZWwnLAogICAgICAgICAgICdidWlsZF93aGVlbCcsCiAgICAgICAgICAgJ2J1aWxkX3NkaXN0JywKICAgICAgICAgICAnX19sZWdhY3lfXycsCiAgICAgICAgICAgJ1NldHVwUmVxdWlyZW1lbnRzRXJyb3InXQoKY2xhc3MgU2V0dXBSZXF1aXJlbWVudHNFcnJvcihCYXNlRXhjZXB0aW9uKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzcGVjaWZpZXJzKToKICAgICAgICBzZWxmLnNwZWNpZmllcnMgPSBzcGVjaWZpZXJzCgoKY2xhc3MgRGlzdHJpYnV0aW9uKHNldHVwdG9vbHMuZGlzdC5EaXN0cmlidXRpb24pOgogICAgZGVmIGZldGNoX2J1aWxkX2VnZ3Moc2VsZiwgc3BlY2lmaWVycyk6CiAgICAgICAgc3BlY2lmaWVyX2xpc3QgPSBsaXN0KG1hcChzdHIsIHBhcnNlX3JlcXVpcmVtZW50cyhzcGVjaWZpZXJzKSkpCgogICAgICAgIHJhaXNlIFNldHVwUmVxdWlyZW1lbnRzRXJyb3Ioc3BlY2lmaWVyX2xpc3QpCgogICAgQGNsYXNzbWV0aG9kCiAgICBAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgogICAgZGVmIHBhdGNoKGNscyk6CiAgICAgICAgIiIiCiAgICAgICAgUmVwbGFjZQogICAgICAgIGRpc3R1dGlscy5kaXN0LkRpc3RyaWJ1dGlvbiB3aXRoIHRoaXMgY2xhc3MKICAgICAgICBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoaXMgY29udGV4dC4KICAgICAgICAiIiIKICAgICAgICBvcmlnID0gZGlzdHV0aWxzLmNvcmUuRGlzdHJpYnV0aW9uCiAgICAgICAgZGlzdHV0aWxzLmNvcmUuRGlzdHJpYnV0aW9uID0gY2xzCiAgICAgICAgdHJ5OgogICAgICAgICAgICB5aWVsZAogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGRpc3R1dGlscy5jb3JlLkRpc3RyaWJ1dGlvbiA9IG9yaWcKCgpkZWYgX3RvX3N0cihzKToKICAgICIiIgogICAgQ29udmVydCBhIGZpbGVuYW1lIHRvIGEgc3RyaW5nIChvbiBQeXRob24gMiwgZXhwbGljaXRseQogICAgYSBieXRlIHN0cmluZywgbm90IFVuaWNvZGUpIGFzIGRpc3R1dGlscyBjaGVja3MgZm9yIHRoZQogICAgZXhhY3QgdHlwZSBzdHIuCiAgICAiIiIKICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMiBhbmQgbm90IGlzaW5zdGFuY2Uocywgc3RyKToKICAgICAgICAjIEFzc3VtZSBpdCdzIFVuaWNvZGUsIGFzIHRoYXQncyB3aGF0IHRoZSBQRVAgc2F5cwogICAgICAgICMgc2hvdWxkIGJlIHByb3ZpZGVkLgogICAgICAgIHJldHVybiBzLmVuY29kZShzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCkpCiAgICByZXR1cm4gcwoKCmRlZiBfZ2V0X2ltbWVkaWF0ZV9zdWJkaXJlY3RvcmllcyhhX2Rpcik6CiAgICByZXR1cm4gW25hbWUgZm9yIG5hbWUgaW4gb3MubGlzdGRpcihhX2RpcikKICAgICAgICAgICAgaWYgb3MucGF0aC5pc2Rpcihvcy5wYXRoLmpvaW4oYV9kaXIsIG5hbWUpKV0KCgpkZWYgX2ZpbGVfd2l0aF9leHRlbnNpb24oZGlyZWN0b3J5LCBleHRlbnNpb24pOgogICAgbWF0Y2hpbmcgPSAoCiAgICAgICAgZiBmb3IgZiBpbiBvcy5saXN0ZGlyKGRpcmVjdG9yeSkKICAgICAgICBpZiBmLmVuZHN3aXRoKGV4dGVuc2lvbikKICAgICkKICAgIGZpbGUsID0gbWF0Y2hpbmcKICAgIHJldHVybiBmaWxlCgoKZGVmIF9vcGVuX3NldHVwX3NjcmlwdChzZXR1cF9zY3JpcHQpOgogICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNldHVwX3NjcmlwdCk6CiAgICAgICAgIyBTdXBwbHkgYSBkZWZhdWx0IHNldHVwLnB5CiAgICAgICAgcmV0dXJuIGlvLlN0cmluZ0lPKHUiZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBzZXR1cDsgc2V0dXAoKSIpCgogICAgcmV0dXJuIGdldGF0dHIodG9rZW5pemUsICdvcGVuJywgb3Blbikoc2V0dXBfc2NyaXB0KQoKCmNsYXNzIF9CdWlsZE1ldGFCYWNrZW5kKG9iamVjdCk6CgogICAgZGVmIF9maXhfY29uZmlnKHNlbGYsIGNvbmZpZ19zZXR0aW5ncyk6CiAgICAgICAgY29uZmlnX3NldHRpbmdzID0gY29uZmlnX3NldHRpbmdzIG9yIHt9CiAgICAgICAgY29uZmlnX3NldHRpbmdzLnNldGRlZmF1bHQoJy0tZ2xvYmFsLW9wdGlvbicsIFtdKQogICAgICAgIHJldHVybiBjb25maWdfc2V0dGluZ3MKCiAgICBkZWYgX2dldF9idWlsZF9yZXF1aXJlcyhzZWxmLCBjb25maWdfc2V0dGluZ3MsIHJlcXVpcmVtZW50cyk6CiAgICAgICAgY29uZmlnX3NldHRpbmdzID0gc2VsZi5fZml4X2NvbmZpZyhjb25maWdfc2V0dGluZ3MpCgogICAgICAgIHN5cy5hcmd2ID0gc3lzLmFyZ3ZbOjFdICsgWydlZ2dfaW5mbyddICsgXAogICAgICAgICAgICBjb25maWdfc2V0dGluZ3NbIi0tZ2xvYmFsLW9wdGlvbiJdCiAgICAgICAgdHJ5OgogICAgICAgICAgICB3aXRoIERpc3RyaWJ1dGlvbi5wYXRjaCgpOgogICAgICAgICAgICAgICAgc2VsZi5ydW5fc2V0dXAoKQogICAgICAgIGV4Y2VwdCBTZXR1cFJlcXVpcmVtZW50c0Vycm9yIGFzIGU6CiAgICAgICAgICAgIHJlcXVpcmVtZW50cyArPSBlLnNwZWNpZmllcnMKCiAgICAgICAgcmV0dXJuIHJlcXVpcmVtZW50cwoKICAgIGRlZiBydW5fc2V0dXAoc2VsZiwgc2V0dXBfc2NyaXB0PSdzZXR1cC5weScpOgogICAgICAgICMgTm90ZSB0aGF0IHdlIGNhbiByZXVzZSBvdXIgYnVpbGQgZGlyZWN0b3J5IGJldHdlZW4gY2FsbHMKICAgICAgICAjIENvcnJlY3RuZXNzIGNvbWVzIGZpcnN0LCB0aGVuIG9wdGltaXphdGlvbiBsYXRlcgogICAgICAgIF9fZmlsZV9fID0gc2V0dXBfc2NyaXB0CiAgICAgICAgX19uYW1lX18gPSAnX19tYWluX18nCgogICAgICAgIHdpdGggX29wZW5fc2V0dXBfc2NyaXB0KF9fZmlsZV9fKSBhcyBmOgogICAgICAgICAgICBjb2RlID0gZi5yZWFkKCkucmVwbGFjZShyJ1xyXG4nLCByJ1xuJykKCiAgICAgICAgZXhlYyhjb21waWxlKGNvZGUsIF9fZmlsZV9fLCAnZXhlYycpLCBsb2NhbHMoKSkKCiAgICBkZWYgZ2V0X3JlcXVpcmVzX2Zvcl9idWlsZF93aGVlbChzZWxmLCBjb25maWdfc2V0dGluZ3M9Tm9uZSk6CiAgICAgICAgY29uZmlnX3NldHRpbmdzID0gc2VsZi5fZml4X2NvbmZpZyhjb25maWdfc2V0dGluZ3MpCiAgICAgICAgcmV0dXJuIHNlbGYuX2dldF9idWlsZF9yZXF1aXJlcyhjb25maWdfc2V0dGluZ3MsIHJlcXVpcmVtZW50cz1bJ3doZWVsJ10pCgogICAgZGVmIGdldF9yZXF1aXJlc19mb3JfYnVpbGRfc2Rpc3Qoc2VsZiwgY29uZmlnX3NldHRpbmdzPU5vbmUpOgogICAgICAgIGNvbmZpZ19zZXR0aW5ncyA9IHNlbGYuX2ZpeF9jb25maWcoY29uZmlnX3NldHRpbmdzKQogICAgICAgIHJldHVybiBzZWxmLl9nZXRfYnVpbGRfcmVxdWlyZXMoY29uZmlnX3NldHRpbmdzLCByZXF1aXJlbWVudHM9W10pCgogICAgZGVmIHByZXBhcmVfbWV0YWRhdGFfZm9yX2J1aWxkX3doZWVsKHNlbGYsIG1ldGFkYXRhX2RpcmVjdG9yeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdfc2V0dGluZ3M9Tm9uZSk6CiAgICAgICAgc3lzLmFyZ3YgPSBzeXMuYXJndls6MV0gKyBbJ2Rpc3RfaW5mbycsICctLWVnZy1iYXNlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdG9fc3RyKG1ldGFkYXRhX2RpcmVjdG9yeSldCiAgICAgICAgc2VsZi5ydW5fc2V0dXAoKQoKICAgICAgICBkaXN0X2luZm9fZGlyZWN0b3J5ID0gbWV0YWRhdGFfZGlyZWN0b3J5CiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgZGlzdF9pbmZvcyA9IFtmIGZvciBmIGluIG9zLmxpc3RkaXIoZGlzdF9pbmZvX2RpcmVjdG9yeSkKICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBmLmVuZHN3aXRoKCcuZGlzdC1pbmZvJyldCgogICAgICAgICAgICBpZiAobGVuKGRpc3RfaW5mb3MpID09IDAgYW5kCiAgICAgICAgICAgICAgICBsZW4oX2dldF9pbW1lZGlhdGVfc3ViZGlyZWN0b3JpZXMoZGlzdF9pbmZvX2RpcmVjdG9yeSkpID09IDEpOgoKICAgICAgICAgICAgICAgIGRpc3RfaW5mb19kaXJlY3RvcnkgPSBvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgICAgICAgICAgZGlzdF9pbmZvX2RpcmVjdG9yeSwgb3MubGlzdGRpcihkaXN0X2luZm9fZGlyZWN0b3J5KVswXSkKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICBhc3NlcnQgbGVuKGRpc3RfaW5mb3MpID09IDEKICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgIyBQRVAgNTE3IHJlcXVpcmVzIHRoYXQgdGhlIC5kaXN0LWluZm8gZGlyZWN0b3J5IGJlIHBsYWNlZCBpbiB0aGUKICAgICAgICAjIG1ldGFkYXRhX2RpcmVjdG9yeS4gVG8gY29tcGx5LCB3ZSBNVVNUIGNvcHkgdGhlIGRpcmVjdG9yeSB0byB0aGUgcm9vdAogICAgICAgIGlmIGRpc3RfaW5mb19kaXJlY3RvcnkgIT0gbWV0YWRhdGFfZGlyZWN0b3J5OgogICAgICAgICAgICBzaHV0aWwubW92ZSgKICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihkaXN0X2luZm9fZGlyZWN0b3J5LCBkaXN0X2luZm9zWzBdKSwKICAgICAgICAgICAgICAgIG1ldGFkYXRhX2RpcmVjdG9yeSkKICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShkaXN0X2luZm9fZGlyZWN0b3J5LCBpZ25vcmVfZXJyb3JzPVRydWUpCgogICAgICAgIHJldHVybiBkaXN0X2luZm9zWzBdCgogICAgZGVmIF9idWlsZF93aXRoX3RlbXBfZGlyKHNlbGYsIHNldHVwX2NvbW1hbmQsIHJlc3VsdF9leHRlbnNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0X2RpcmVjdG9yeSwgY29uZmlnX3NldHRpbmdzKToKICAgICAgICBjb25maWdfc2V0dGluZ3MgPSBzZWxmLl9maXhfY29uZmlnKGNvbmZpZ19zZXR0aW5ncykKICAgICAgICByZXN1bHRfZGlyZWN0b3J5ID0gb3MucGF0aC5hYnNwYXRoKHJlc3VsdF9kaXJlY3RvcnkpCgogICAgICAgICMgQnVpbGQgaW4gYSB0ZW1wb3JhcnkgZGlyZWN0b3J5LCB0aGVuIGNvcHkgdG8gdGhlIHRhcmdldC4KICAgICAgICBtYWtlZGlycyhyZXN1bHRfZGlyZWN0b3J5LCBleGlzdF9vaz1UcnVlKQogICAgICAgIHdpdGggVGVtcG9yYXJ5RGlyZWN0b3J5KGRpcj1yZXN1bHRfZGlyZWN0b3J5KSBhcyB0bXBfZGlzdF9kaXI6CiAgICAgICAgICAgIHN5cy5hcmd2ID0gKHN5cy5hcmd2WzoxXSArIHNldHVwX2NvbW1hbmQgKwogICAgICAgICAgICAgICAgICAgICAgICBbJy0tZGlzdC1kaXInLCB0bXBfZGlzdF9kaXJdICsKICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnX3NldHRpbmdzWyItLWdsb2JhbC1vcHRpb24iXSkKICAgICAgICAgICAgc2VsZi5ydW5fc2V0dXAoKQoKICAgICAgICAgICAgcmVzdWx0X2Jhc2VuYW1lID0gX2ZpbGVfd2l0aF9leHRlbnNpb24odG1wX2Rpc3RfZGlyLCByZXN1bHRfZXh0ZW5zaW9uKQogICAgICAgICAgICByZXN1bHRfcGF0aCA9IG9zLnBhdGguam9pbihyZXN1bHRfZGlyZWN0b3J5LCByZXN1bHRfYmFzZW5hbWUpCiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHJlc3VsdF9wYXRoKToKICAgICAgICAgICAgICAgICMgb3MucmVuYW1lIHdpbGwgZmFpbCBvdmVyd3JpdGluZyBvbiBub24tVW5peC4KICAgICAgICAgICAgICAgIG9zLnJlbW92ZShyZXN1bHRfcGF0aCkKICAgICAgICAgICAgb3MucmVuYW1lKG9zLnBhdGguam9pbih0bXBfZGlzdF9kaXIsIHJlc3VsdF9iYXNlbmFtZSksIHJlc3VsdF9wYXRoKQoKICAgICAgICByZXR1cm4gcmVzdWx0X2Jhc2VuYW1lCgoKICAgIGRlZiBidWlsZF93aGVlbChzZWxmLCB3aGVlbF9kaXJlY3RvcnksIGNvbmZpZ19zZXR0aW5ncz1Ob25lLAogICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhX2RpcmVjdG9yeT1Ob25lKToKICAgICAgICByZXR1cm4gc2VsZi5fYnVpbGRfd2l0aF90ZW1wX2RpcihbJ2JkaXN0X3doZWVsJ10sICcud2hsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVlbF9kaXJlY3RvcnksIGNvbmZpZ19zZXR0aW5ncykKCiAgICBkZWYgYnVpbGRfc2Rpc3Qoc2VsZiwgc2Rpc3RfZGlyZWN0b3J5LCBjb25maWdfc2V0dGluZ3M9Tm9uZSk6CiAgICAgICAgcmV0dXJuIHNlbGYuX2J1aWxkX3dpdGhfdGVtcF9kaXIoWydzZGlzdCcsICctLWZvcm1hdHMnLCAnZ3p0YXInXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLnRhci5neicsIHNkaXN0X2RpcmVjdG9yeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdfc2V0dGluZ3MpCgoKY2xhc3MgX0J1aWxkTWV0YUxlZ2FjeUJhY2tlbmQoX0J1aWxkTWV0YUJhY2tlbmQpOgogICAgIiIiQ29tcGF0aWJpbGl0eSBiYWNrZW5kIGZvciBzZXR1cHRvb2xzCgogICAgVGhpcyBpcyBhIHZlcnNpb24gb2Ygc2V0dXB0b29scy5idWlsZF9tZXRhIHRoYXQgZW5kZWF2b3JzIHRvIG1haW50YWluIGJhY2t3YXJkcwogICAgY29tcGF0aWJpbGl0eSB3aXRoIHByZS1QRVAgNTE3IG1vZGVzIG9mIGludm9jYXRpb24uIEl0IGV4aXN0cyBhcyBhIHRlbXBvcmFyeQogICAgYnJpZGdlIGJldHdlZW4gdGhlIG9sZCBwYWNrYWdpbmcgbWVjaGFuaXNtIGFuZCB0aGUgbmV3IHBhY2thZ2luZyBtZWNoYW5pc20sCiAgICBhbmQgd2lsbCBldmVudHVhbGx5IGJlIHJlbW92ZWQuCiAgICAiIiIKICAgIGRlZiBydW5fc2V0dXAoc2VsZiwgc2V0dXBfc2NyaXB0PSdzZXR1cC5weScpOgogICAgICAgICMgSW4gb3JkZXIgdG8gbWFpbnRhaW4gY29tcGF0aWJpbGl0eSB3aXRoIHNjcmlwdHMgYXNzdW1pbmcgdGhhdAogICAgICAgICMgdGhlIHNldHVwLnB5IHNjcmlwdCBpcyBpbiBhIGRpcmVjdG9yeSBvbiB0aGUgUFlUSE9OUEFUSCwgaW5qZWN0CiAgICAgICAgIyAnJyBpbnRvIHN5cy5wYXRoLiAocHlwYS9zZXR1cHRvb2xzIzE2NDIpCiAgICAgICAgc3lzX3BhdGggPSBsaXN0KHN5cy5wYXRoKSAgICAgICAgICAgIyBTYXZlIHRoZSBvcmlnaW5hbCBwYXRoCgogICAgICAgIHNjcmlwdF9kaXIgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5hYnNwYXRoKHNldHVwX3NjcmlwdCkpCiAgICAgICAgaWYgc2NyaXB0X2RpciBub3QgaW4gc3lzLnBhdGg6CiAgICAgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBzY3JpcHRfZGlyKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHN1cGVyKF9CdWlsZE1ldGFMZWdhY3lCYWNrZW5kLAogICAgICAgICAgICAgICAgICBzZWxmKS5ydW5fc2V0dXAoc2V0dXBfc2NyaXB0PXNldHVwX3NjcmlwdCkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAjIFdoaWxlIFBFUCA1MTcgZnJvbnRlbmRzIHNob3VsZCBiZSBjYWxsaW5nIGVhY2ggaG9vayBpbiBhIGZyZXNoCiAgICAgICAgICAgICMgc3VicHJvY2VzcyBhY2NvcmRpbmcgdG8gdGhlIHN0YW5kYXJkIChhbmQgdGh1cyBpdCBzaG91bGQgbm90IGJlCiAgICAgICAgICAgICMgc3RyaWN0bHkgbmVjZXNzYXJ5IHRvIHJlc3RvcmUgdGhlIG9sZCBzeXMucGF0aCksIHdlJ2xsIHJlc3RvcmUKICAgICAgICAgICAgIyB0aGUgb3JpZ2luYWwgcGF0aCBzbyB0aGF0IHRoZSBwYXRoIG1hbmlwdWxhdGlvbiBkb2VzIG5vdCBwZXJzaXN0CiAgICAgICAgICAgICMgd2l0aGluIHRoZSBob29rIGFmdGVyIHJ1bl9zZXR1cCBpcyBjYWxsZWQuCiAgICAgICAgICAgIHN5cy5wYXRoWzpdID0gc3lzX3BhdGgKCiMgVGhlIHByaW1hcnkgYmFja2VuZApfQkFDS0VORCA9IF9CdWlsZE1ldGFCYWNrZW5kKCkKCmdldF9yZXF1aXJlc19mb3JfYnVpbGRfd2hlZWwgPSBfQkFDS0VORC5nZXRfcmVxdWlyZXNfZm9yX2J1aWxkX3doZWVsCmdldF9yZXF1aXJlc19mb3JfYnVpbGRfc2Rpc3QgPSBfQkFDS0VORC5nZXRfcmVxdWlyZXNfZm9yX2J1aWxkX3NkaXN0CnByZXBhcmVfbWV0YWRhdGFfZm9yX2J1aWxkX3doZWVsID0gX0JBQ0tFTkQucHJlcGFyZV9tZXRhZGF0YV9mb3JfYnVpbGRfd2hlZWwKYnVpbGRfd2hlZWwgPSBfQkFDS0VORC5idWlsZF93aGVlbApidWlsZF9zZGlzdCA9IF9CQUNLRU5ELmJ1aWxkX3NkaXN0CgoKIyBUaGUgbGVnYWN5IGJhY2tlbmQKX19sZWdhY3lfXyA9IF9CdWlsZE1ldGFMZWdhY3lCYWNrZW5kKCkKUEsDBBQAAAAAAAAAIQD1hnppAAABAAAAAQA6AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvY2xpLTMyLmV4ZU1akAADAAAABAAAAP//AAC4AAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAOH7oOALQJzSG4AUzN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O9kPhF3///+KE4mN2P3//4mN4P3//4mNvP3//4iV7/3//4TSD4QfCgAAQ4O92P3//wCJncT9//8PjAsKAACKwiwgPFh3EQ++wg++gFjiQACD4A8z9usEM/YzwA++hMF44kAAagfB+ARZiYWU/f//O8EPh60JAAD/JIXfMkAAg43o/f///4m1kP3//4m1wP3//4m1zP3//4m10P3//4m18P3//4m1yP3//+l2CQAAD77Cg+ggdEqD6AN0NoPoCHQlSEh0FYPoAw+FVwkAAION8P3//wjpSwkAAION8P3//wTpPwkAAION8P3//wHpMwkAAIGN8P3//4AAAADpJAkAAION8P3//wLpGAkAAID6KnUsg8cEib3c/f//i3/8O/6Jvcz9//8PjfkIAACDjfD9//8E953M/f//6ecIAACLhcz9//9rwAoPvsqNRAjQiYXM/f//6cwIAACJtej9///pwQgAAID6KnUmg8cEib3c/f//i3/8O/6Jvej9//8PjaIIAACDjej9////6ZYIAACLhej9//9rwAoPvsqNRAjQiYXo/f//6XsIAACA+kl0VYD6aHREgPpsdBiA+ncPhWMIAACBjfD9//8ACAAA6VQIAACAO2x1FkOBjfD9//8AEAAAiZ3E/f//6TkIAACDjfD9//8Q6S0IAACDjfD9//8g6SEIAACKAzw2dR2AewE0dRdDQ4GN8P3//wCAAACJncT9///p/gcAADwzdR2AewEydRdDQ4Gl8P3///9///+JncT9///p3QcAADxkD4TVBwAAPGkPhM0HAAA8bw+ExQcAADx1D4S9BwAAPHgPhLUHAAA8WA+ErQcAAIm1lP3//42FpP3//1APtsJQibXI/f//6KQ8AABZhcCKhe/9//9ZdCKLjbT9//+Ntdj9///opPv//4oDQ4mdxP3//4TAD4Sk/P//i420/f//jbXY/f//6IL7///pTQcAAA++woP4ZA+P6AEAAA+EeQIAAIP4Uw+P8gAAAA+EgAAAAIPoQXQQSEh0WEhIdAhISA+FkgUAAIDCIMeFkP3//wEAAACIle/9//+DjfD9//9AObXo/f//jZ30/f//uAACAACJneT9//+JhaD9//8PjUgCAADHhej9//8GAAAA6aUCAAD3hfD9//8wCAAAD4WYAAAAgY3w/f//AAgAAOmJAAAA94Xw/f//MAgAAHUKgY3w/f//AAgAAIuN6P3//4P5/3UFuf///3+DxwT3hfD9//8QCAAAib3c/f//i3/8ib3k/f//D4SxBAAAO/51C6GUEkEAiYXk/f//i4Xk/f//x4XI/f//AQAAAOl/BAAAg+hYD4TaAgAASEh0eSvBD4Qn////SEgPhZ4EAACDxwT3hfD9//8QCAAAib3c/f//dDAPt0f8UGgAAgAAjYX0/f//UI2F4P3//1Do5zoAAIPEEIXAdB/HhcD9//8BAAAA6xOKR/yIhfT9///HheD9//8BAAAAjYX0/f//iYXk/f//6TUEAACLB4PHBIm93P3//zvGdDuLSAQ7znQ094Xw/f//AAgAAA+/AImN5P3//3QUmSvC0fjHhcj9//8BAAAA6fADAACJtcj9///p5QMAAKGQEkEAiYXk/f//UOheOAAAWenOAwAAg/hwD4/7AQAAD4TjAQAAg/hlD4y8AwAAg/hnD440/v//g/hpdHGD+G50KIP4bw+FoAMAAPaF8P3//4DHheD9//8IAAAAdGGBjfD9//8AAgAA61WLN4PHBIm93P3//+jXNwAAhcAPhC/6///2hfD9//8gdAxmi4XY/f//ZokG6wiLhdj9//+JBseFwP3//wEAAADppgQAAION8P3//0DHheD9//8KAAAAi43w/f//98EAgAAAD4SpAQAAiweLVwSDxwjp1QEAAHURgPpndWXHhej9//8BAAAA61k5hej9//9+BomF6P3//4G96P3//6MAAAB+P4u16P3//4HGXQEAAFboHgsAAIqV7/3//1mJhbz9//+FwHQQiYXk/f//ibWg/f//i9jrCseF6P3//6MAAAAz9osHg8cIiYWI/f//i0f8iYWM/f//jYWk/f//UP+1kP3//w++wv+16P3//4m93P3//1D/taD9//+NhYj9//9TUP81WBxBAOg9IAAAWf/Qi73w/f//g8QcgeeAAAAAdCA5tej9//91GI2FpP3//1BT/zVkHEEA6A4gAABZ/9BZWYC97/3//2d1HDv+dRiNhaT9//9QU/81YBxBAOjpHwAAWf/QWVmAOy11EYGN8P3//wABAABDiZ3k/f//U+kD/v//x4Xo/f//CAAAAImNuP3//+skg+hzD4S2/P//SEgPhIn+//+D6AMPhbYBAADHhbj9//8nAAAA9oXw/f//gMeF4P3//xAAAAAPhGn+//+Khbj9//8EUcaF1P3//zCIhdX9///HhdD9//8CAAAA6UX+///3wQAQAAAPhUv+//+DxwT2wSB0GIm93P3///bBQHQGD79H/OsED7dH/JnrE4tH/PbBQHQDmesCM9KJvdz9///2wUB0GzvWfxd8BDvGcxH32IPSAPfagY3w/f//AAEAAPeF8P3//wCQAACL2ov4dQIz24O96P3//wB9DMeF6P3//wEAAADrGoOl8P3///e4AAIAADmF6P3//34GiYXo/f//i8cLw3UGIYXQ/f//jXXzi4Xo/f///43o/f//hcB/BovHC8N0LYuF4P3//5lSUFNX6IA3AACDwTCD+TmJnaD9//+L+IvafgYDjbj9//+IDk7rvY1F8yvGRveF8P3//wACAACJheD9//+JteT9//90YYXAdAeLzoA5MHRW/43k/f//i43k/f//xgEwQOs+SWY5MHQGQEA7znX0K4Xk/f//0fjrKDv+dQuhkBJBAImF5P3//4uF5P3//+sHSYA4AHQFQDvOdfUrheT9//+JheD9//+DvcD9//8AD4VcAQAAi4Xw/f//qEB0MqkAAQAAdAnGhdT9//8t6xioAXQJxoXU/f//K+sLqAJ0EcaF1P3//yDHhdD9//8BAAAAi53M/f//K53g/f//K53Q/f//9oXw/f//DHUX/7W0/f//jYXY/f//U2og6HD1//+DxAz/tdD9//+LvbT9//+Nhdj9//+NjdT9///odvX///aF8P3//whZdBv2hfD9//8EdRJXU2owjYXY/f//6C71//+DxAyDvcj9//8Ai4Xg/f//dGaFwH5ii7Xk/f//iYWg/f//D7cG/42g/f//UGoGjUX0UI2FmP3//0ZQRuiBNQAAg8QQhcB1KDmFmP3//3Qg/7WY/f//jYXY/f//jU306PH0//+DvaD9//8AWXW16xyDjdj9////6xOLjeT9//9QjYXY/f//6Mr0//9Zg73Y/f//AHwb9oXw/f//BHQSV1NqII2F2P3//+iC9P//g8QMg728/f//AHQT/7W8/f//6AQIAACDpbz9//8AWYudxP3//4oDiIXv/f//hMB0E4uNlP3//4u93P3//4rQ6eH1//+AvbD9//8AdAqLhaz9//+DYHD9i4XY/f//i038X14zzVvoBuz//8nDkOoqQADrKEAAGylAAHkpQADFKUAA0ClAABYq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//+IVA80iw6JRA846Q4DAAAzyYsGA8f2QASAD4S/AgAAi4U05f//iY1A5f//hNsPhcoAAACJhTzl//85TRAPhiADAADrBou1KOX//4uNPOX//4OlROX//wArjTTl//+NhUjl//87TRBzOYuVPOX///+FPOX//4oSQYD6CnUQ/4Uw5f//xgANQP+FROX//4gQQP+FROX//4G9ROX///8TAABywovYjYVI5f//K9hqAI2FLOX//1BTjYVI5f//UIsG/zQH/xWY4EAAhcAPhEICAACLhSzl//8BhTjl//87ww+MOgIAAIuFPOX//yuFNOX//ztFEA+CTP///+kgAgAAiYVE5f//gPsCD4XRAAAAOU0QD4ZNAgAA6waLtSjl//+LjUTl//+DpTzl//8AK4005f//jYVI5f//O00Qc0aLlUTl//+DhUTl//8CD7cSQUFmg/oKdRaDhTDl//8Cag1bZokYQECDhTzl//8Cg4U85f//AmaJEEBAgb085f///hMAAHK1i9iNhUjl//8r2GoAjYUs5f//UFONhUjl//9Qiwb/NAf/FZjgQACFwA+EYgEAAIuFLOX//wGFOOX//zvDD4xaAQAAi4VE5f//K4U05f//O0UQD4I/////6UABAAA5TRAPhnwBAACLjUTl//+DpTzl//8AK4005f//agKNhUj5//9eO00QczyLlUTl//8PtxIBtUTl//8DzmaD+gp1DmoNW2aJGAPGAbU85f//AbU85f//ZokQA8aBvTzl//+oBgAAcr8z9lZWaFUNAACNjfDr//9RjY1I+f//K8GZK8LR+FCLwVBWaOn9AAD/FbDgQACL2DveD4SXAAAAagCNhSzl//9Qi8MrxlCNhDXw6///UIuFKOX//4sA/zQH/xWY4EAAhcB0DAO1LOX//zvef8vrDP8VXOBAAImFQOX//zvef1yLhUTl//8rhTTl//+JhTjl//87RRAPggr////rP2oAjY0s5f//Uf91EP+1NOX///8w/xWY4EAAhcB0FYuFLOX//4OlQOX//wCJhTjl///rDP8VXOBAAImFQOX//4O9OOX//wB1bIO9QOX//wB0LWoFXjm1QOX//3UU6Ba3///HAAkAAADoHrf//4kw6z//tUDl///oIrf//1nrMYu1KOX//4sG9kQHBEB0D4uFNOX//4A4GnUEM8DrJOjWtv//xwAc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GP91FP91EP91DOgW/v//g8QcgH38AHQHi034g2Fw/cnDi/9Vi+xWi3UIhfYPhIEBAAD/dgTodq////92COhur////3YM6Gav////dhDoXq////92FOhWr////3YY6E6v////NuhHr////3Yg6D+v////diToN6////92KOgvr////3Ys6Cev////djDoH6////92NOgXr////3Yc6A+v////djjoB6////92POj/rv//g8RA/3ZA6PSu////dkTo7K7///92SOjkrv///3ZM6Nyu////dlDo1K7///92VOjMrv///3ZY6MSu////dlzovK7///92YOi0rv///3Zk6Kyu////dmjopK7///92bOicrv///3Zw6JSu////dnTojK7///92eOiErv///3Z86Hyu//+DxED/toAAAADobq7///+2hAAAAOhjrv///7aIAAAA6Fiu////towAAADoTa7///+2kAAAAOhCrv///7aUAAAA6Deu////tpgAAADoLK7///+2nAAAAOghrv///7agAAAA6Bau////tqQAAADoC67///+2qAAAAOgArv//g8QsXl3Di/9Vi+xWi3UIhfZ0NYsGOwVIHUEAdAdQ6N2t//9Zi0YEOwVMHUEAdAdQ6Mut//9Zi3YIOzVQHUEAdAdW6Lmt//9ZXl3Di/9Vi+xWi3UIhfZ0fotGDDsFVB1BAHQHUOiXrf//WYtGEDsFWB1BAHQHUOiFrf//WYtGFDsFXB1BAHQHUOhzrf//WYtGGDsFYB1BAHQHUOhhrf//WYtGHDsFZB1BAHQHUOhPrf//WYtGIDsFaB1BAHQHUOg9rf//WYt2JDs1bB1BAHQHVugrrf//WV5dw4v/VYvsi0UIUzPbVlc7w3QHi30MO/t3G+ihqf//ahZeiTBTU1NTU+gqqf//g8QUi8brPIt1EDvzdQSIGOvai9A4GnQEQk91+Dv7dO6KDogKQkY6y3QDT3XzO/t1EIgY6Fqp//9qIlmJCIvx67UzwF9eW13DzMzMzMzMVYvsVjPAUFBQUFBQUFCLVQyNSQCKAgrAdAmDwgEPqwQk6/GLdQiDyf+NSQCDwQGKBgrAdAmDxgEPowQkc+6LwYPEIF7Jw4v/VYvsU1aLdQgz21c5XRR1EDvzdRA5XQx1EjPAX15bXcM783QHi30MO/t3G+jMqP//ahZeiTBTU1NT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cHJvY2Vzcy4KAAAgJXMAJXMAAENvdWxkIG5vdCBleGVjICVzAAAAQ2Fubm90IGZpbmQgUHl0aG9uIGV4ZWN1dGFibGUgJXMKAAAAIyFweXRob24uZXhlAAAAACMhAABDYW5ub3Qgb3BlbiAlcwoALXNjcmlwdC5weQAAQ29yRXhpdFByb2Nlc3MAAG0AcwBjAG8AcgBlAGUALgBkAGwAbAAAACgAbgB1AGwAbAApAAAAAAAobnVsbCkAAAAAAAAGAAAGAAEAABAAAwYABgIQBEVFRQUFBQUFNTAAUAAAAAAoIDhQWAcIADcwMFdQBwAAICAIAAAAAAhgaGBgYGAAAHhweHh4eAgHCAAABwAICAgAAAgACAAHCAAAAKghQQAAIkEAAAAAAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn8APQAAAEVuY29kZVBvaW50ZXIAAABLAEUAUgBOAEUATAAzADIALgBEAEwATAAAAAAARGVjb2RlUG9pbnRlcgAAAEZsc0ZyZWUARmxzU2V0VmFsdWUARmxzR2V0VmFsdWUARmxzQWxsb2MAAAAAcnVudGltZSBlcnJvciAAAA0KAABUTE9TUyBlcnJvcg0KAAAAU0lORyBlcnJvcg0KAAAAAERPTUFJTiBlcnJvcg0KAABSNjAzNA0KQW4gYXBwbGljYXRpb24gaGFzIG1hZGUgYW4gYXR0ZW1wdCB0byBsb2FkIHRoZSBDIHJ1bnRpbWUgbGlicmFyeSBpbmNvcnJlY3RseS4KUGxlYXNlIGNvbnRhY3QgdGhlIGFwcGxpY2F0aW9uJ3Mgc3VwcG9ydCB0ZWFtIGZvciBtb3JlIGluZm9ybWF0aW9uLg0KAAAAAAAAUjYwMzMNCi0gQXR0ZW1wdCB0byB1c2UgTVNJTCBjb2RlIGZyb20gdGhpcyBhc3NlbWJseSBkdXJpbmcgbmF0aXZlIGNvZGUgaW5pdGlhbGl6YXRpb24KVGhpcyBpbmRpY2F0ZXMgYSBidWcgaW4geW91ciBhcHBsaWNhdGlvbi4gSXQgaXMgbW9zdCBsaWtlbHkgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIGFuIE1TSUwtY29tcGlsZWQgKC9jbHIpIGZ1bmN0aW9uIGZyb20gYSBuYXRpdmUgY29uc3RydWN0b3Igb3IgZnJvbSBEbGxNYWluLg0KAABSNjAzMg0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBsb2NhbGUgaW5mb3JtYXRpb24NCgAAAAAAAFI2MDMxDQotIEF0dGVtcHQgdG8gaW5pdGlhbGl6ZSB0aGUgQ1JUIG1vcmUgdGhhbiBvbmNlLgpUaGlzIGluZGljYXRlcyBhIGJ1ZyBpbiB5b3VyIGFwcGxpY2F0aW9uLg0KAABSNjAzMA0KLSBDUlQgbm90IGluaXRpYWxpemVkDQoAAFI2MDI4DQotIHVuYWJsZSB0byBpbml0aWFsaXplIGhlYXANCgAAAABSNjAyNw0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBsb3dpbyBpbml0aWFsaXphdGlvbg0KAAAAAFI2MDI2DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIHN0ZGlvIGluaXRpYWxpemF0aW9uDQoAAAAAUjYwMjUNCi0gcHVyZSB2aXJ0dWFsIGZ1bmN0aW9uIGNhbGwNCgAAAFI2MDI0DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIF9vbmV4aXQvYXRleGl0IHRhYmxlDQoAAAAAUjYwMTkNCi0gdW5hYmxlIHRvIG9wZW4gY29uc29sZSBkZXZpY2UNCgAAAABSNjAxOA0KLSB1bmV4cGVjdGVkIGhlYXAgZXJyb3INCgAAAABSNjAxNw0KLSB1bmV4cGVjdGVkIG11bHRpdGhyZWFkIGxvY2sgZXJyb3INCgAAAABSNjAxNg0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciB0aHJlYWQgZGF0YQ0KAA0KVGhpcyBhcHBsaWNhdGlvbiBoYXMgcmVxdWVzdGVkIHRoZSBSdW50aW1lIHRvIHRlcm1pbmF0ZSBpdCBpbiBhbiB1bnVzdWFsIHdheS4KUGxlYXNlIGNvbnRhY3QgdGhlIGFwcGxpY2F0aW9uJ3Mgc3VwcG9ydCB0ZWFtIGZvciBtb3JlIGluZm9ybWF0aW9uLg0KAAAAUjYwMDkNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgZW52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eQAAVGh1cnNkYXkAAAAAV2VkbmVzZGF5AAAAVHVlc2RheQBNb25kYXkAAFN1bmRheQAAU2F0AEZyaQBUaHUAV2VkAFR1ZQBNb24AU3VuAEdldFByb2Nlc3NXaW5kb3dTdGF0aW9uAEdldFVzZXJPYmplY3RJbmZvcm1hdGlvbkEAAABHZXRMYXN0QWN0aXZlUG9wdXAAAEdldEFjdGl2ZVdpbmRvdwBNZXNzYWdlQm94QQBVU0VSMzIuRExMAABTdW5Nb25UdWVXZWRUaHVGcmlTYXQAAABKYW5GZWJNYXJBcHJNYXlKdW5KdWxBdWdTZXBPY3ROb3ZEZWMAAAAAQ09OT1VUJAAuY29tAAAAAC5leGUAAAAALmJhdAAAAAAuY21kAAAAAC5cAABTeXN0ZW1Sb290AAAAAAAASAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgBJBAND0QAADAAAA0DcAACBpAAAQmQAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAADXGEAAAAAAAP7///8AAAAAyP///wAAAAD+////AAAAALwjQAAAAAAA/v///wAAAADM////AAAAAP7///+pJUAAvSVAAAAAAAD+////AAAAAIz///8AAAAA/v///zw1QABANUAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAOM6QAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAAsTtAAAAAAAD+////AAAAAMz///8AAAAA/v///wAAAAA7PUAAAAAAAAAAAAAHPUAA/v///wAAAADU////AAAAAP7///8AAAAAwD5AAAAAAAD+////AAAAANT///8AAAAA/v///wAAAADzP0AAAAAAAP7///8AAAAA1P///wAAAAD+////HUFAADlBQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAALUdAAAAAAAD+////AAAAAMz///8AAAAA/v///wAAAAD7SkAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAGtOQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAArVBAAP7///8AAAAAvFBAAP7///8AAAAA2P///wAAAAD+////AAAAAG9SQAD+////AAAAAHtSQAD+////AAAAANT///8AAAAA/v///wAAAAA1WUAAAAAAAP7///8AAAAA2P///wAAAAD+////21pAAO9aQAAAAAAA/v///wAAAADY////AAAAAP7///8tW0AAMVtAAAAAAAD+////AAAAAMD///8AAAAA/v///wAAAACIXkAAAAAAAP7///8AAAAA0P///wAAAAD+////GF9AAC9fQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAKWpAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAAA6bEAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAD55QAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAAToFAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAAAvgkAAAAAAAP7///8AAAAAzP///wAAAAD+////AAAAACSVQAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAAvZdAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAABUoUAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAMulQAAAAAAA/v///wAAAADI////AAAAAP7///8AAAAAkadAAAAAAAAAAAAAzaZAAP7///8AAAAA0P///wAAAAD+////AAAAAEyuQAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAAaMJAAAAAAAD+////AAAAAMz///8AAAAA/v///wAAAAALykAAVPkAAAAAAAAAAAAADgABAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJT6AACw+gAAxvoAANz6AADu+gAABvsAABz7AAA0+wAATPsAAGD7AABo+wAAevsAAIj7AACa+wAArPsAALz7AADK+wAA3PsAAPT7AAAI/AAAHPwAADj8AABW/AAAavwAAHr8AACG/AAAkvwAAJ78AAC2/AAAzvwAANj8AADk/AAA9vwAAAT9AAAQ/QAAHv0AACj9AAA4/QAATv0AAFr9AABq/QAAkv0AAKz9AADE/QAA3v0AAPT9AAAO/gAAHP4AACr+AABE/gAAVP4AAGr+AACE/gAAkP4AAJ7+AACu/gAAvv4AAND+AADk/gAA9P4AAAr/AAAa/wAALP8AAD7/AABQ/wAAYv8AAG7/AAB8/wAAjP8AAKL/AACy/wAAwv8AAND/AADi/wAA9P8AABwAAQAoAAEAOAABAEoAAQAAAAAAUgFHZW5lcmF0ZUNvbnNvbGVDdHJsRXZlbnQAAMYBR2V0RXhpdENvZGVQcm9jZXNzAABuBFdhaXRGb3JTaW5nbGVPYmplY3QAlQBDcmVhdGVQcm9jZXNzQQAArwNTZXRDb25zb2xlQ3RybEhhbmRsZXIA9QFHZXRNb2R1bGVGaWxlTmFtZUEAANoARW50ZXJDcml0aWNhbFNlY3Rpb24AAPQCTGVhdmVDcml0aWNhbFNlY3Rpb24AAPoBR2V0TW9kdWxlSGFuZGxlVwAAKwRTbGVlcAAiAkdldFByb2NBZGRyZXNzAAAFAUV4aXRQcm9jZXNzAHABR2V0Q29tbWFuZExpbmVBAPADU2V0SGFuZGxlQ291bnQAAD4CR2V0U3RkSGFuZGxlAADYAUdldEZpbGVUeXBlADwCR2V0U3RhcnR1cEluZm9BAL8ARGVsZXRlQ3JpdGljYWxTZWN0aW9uADcEVGVybWluYXRlUHJvY2VzcwAAqgFHZXRDdXJyZW50UHJvY2VzcwBIBFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcgAAHwRTZXRVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIA1gJJc0RlYnVnZ2VyUHJlc2VudADnAUdldExhc3RFcnJvcgAApgJIZWFwRnJlZQAAogJIZWFwQWxsb2MAXAFHZXRDUEluZm8AxQJJbnRlcmxvY2tlZEluY3JlbWVudAAAwQJJbnRlcmxvY2tlZERlY3JlbWVudAAAUwFHZXRBQ1AAABQCR2V0T0VNQ1AAAOACSXNWYWxpZENvZGVQYWdlAD4EVGxzR2V0VmFsdWUAPARUbHNBbGxvYwAAPwRUbHNTZXRWYWx1ZQA9BFRsc0ZyZWUA9ANTZXRMYXN0RXJyb3IAAK4BR2V0Q3VycmVudFRocmVhZElkAACXBFdyaXRlRmlsZQD2AkxvYWRMaWJyYXJ5QQAAugJJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uQW5kU3BpbkNvdW50AEsBRnJlZUVudmlyb25tZW50U3RyaW5nc0EAwAFHZXRFbnZpcm9ubWVudFN0cmluZ3MATAFGcmVlRW52aXJvbm1lbnRTdHJpbmdzVwCEBFdpZGVDaGFyVG9NdWx0aUJ5dGUAwgFHZXRFbnZpcm9ubWVudFN0cmluZ3NXAACkAkhlYXBDcmVhdGUAAGEEVmlydHVhbEZyZWUAWQNRdWVyeVBlcmZvcm1hbmNlQ291bnRlcgBqAkdldFRpY2tDb3VudAAAqwFHZXRDdXJyZW50UHJvY2Vzc0lkAFMCR2V0U3lzdGVtVGltZUFzRmlsZVRpbWUAmgNSdGxVbndpbmQAqQJIZWFwUmVBbGxvYwBeBFZpcnR1YWxBbGxvYwAAhAFHZXRDb25zb2xlQ1AAAJYBR2V0Q29uc29sZU1vZGUAAEIBRmx1c2hGaWxlQnVmZmVycwAA5gJMQ01hcFN0cmluZ0EAAB8DTXVsdGlCeXRlVG9XaWRlQ2hhcgDoAkxDTWFwU3RyaW5nVwAAQAJHZXRTdHJpbmdUeXBlQQAAQwJHZXRTdHJpbmdUeXBlVwAA6QFHZXRMb2NhbGVJbmZvQQAA5wNTZXRGaWxlUG9pbnRlcgAAqwJIZWFwU2l6ZQAARABDbG9zZUhhbmRsZQCMBFdyaXRlQ29uc29sZUEAmgFHZXRDb25zb2xlT3V0cHV0Q1AAAJYEV3JpdGVDb25zb2xlVwAGBFNldFN0ZEhhbmRsZQAAeQBDcmVhdGVGaWxlQQBTAENvbXBhcmVTdHJpbmdBAABWAENvbXBhcmVTdHJpbmdXAADYA1NldEVudmlyb25tZW50VmFyaWFibGVBAEtFUk5FTDMyLmRsbAAAbgNSZWFkRmlsZQAA1QNTZXRFbmRPZkZpbGUAACYCR2V0UHJvY2Vzc0hlYXAAAMoBR2V0RmlsZUF0dHJpYnV0ZXNBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMArQQAAAAAAwCtBAAEBAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABO5kC7sRm/ROojQAABAAAAbOJAAFziQAD/////gAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAABYAAAACAAAAAgAAAAMAAAACAAAABAAAABgAAAAFAAAADQAAAAYAAAAJAAAABwAAAAwAAAAIAAAADAAAAAkAAAAMAAAACgAAAAcAAAALAAAACAAAAAwAAAAWAAAADQAAABYAAAAPAAAAAgAAABAAAAANAAAAEQAAABIAAAASAAAAAgAAACEAAAANAAAANQAAAAIAAABBAAAADQAAAEMAAAACAAAAUAAAABEAAABSAAAADQAAAFMAAAANAAAAVwAAABYAAABZAAAACwAAAGwAAAANAAAAbQAAACAAAABwAAAAHAAAAHIAAAAJAAAABgAAABYAAACAAAAACgAAAIEAAAAKAAAAggAAAAkAAACDAAAAFgAAAIQAAAANAAAAkQAAACkAAACeAAAADQAAAKEAAAACAAAApAAAAAsAAACnAAAADQAAALcAAAARAAAAzgAAAAIAAADXAAAACwAAABgHAAAMAAAADAAAAAgAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AQAAEAADBgAGAhAERUVFBQUFBQU1MABQAAAAACggOFBYBwgANzAwV1AHAAAgIAgAAAAACGBoYGBgYAAAeHB4eHh4CAcIAAAHAAgICAAACAAIAAcIAAAAAAAAABA4AUABAAAAsDgBQAEAAAABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/AD0AAAAAAAAAcnVudGltZSBlcnJvciAAAA0KAAAAAAAAVExPU1MgZXJyb3INCgAAAFNJTkcgZXJyb3INCgAAAABET01BSU4gZXJyb3INCgAAUjYwMzQNCkFuIGFwcGxpY2F0aW9uIGhhcyBtYWRlIGFuIGF0dGVtcHQgdG8gbG9hZCB0aGUgQyBydW50aW1lIGxpYnJhcnkgaW5jb3JyZWN0bHkuClBsZWFzZSBjb250YWN0IHRoZSBhcHBsaWNhdGlvbidzIHN1cHBvcnQgdGVhbSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4NCgAAAAAAAFI2MDMzDQotIEF0dGVtcHQgdG8gdXNlIE1TSUwgY29kZSBmcm9tIHRoaXMgYXNzZW1ibHkgZHVyaW5nIG5hdGl2ZSBjb2RlIGluaXRpYWxpemF0aW9uClRoaXMgaW5kaWNhdGVzIGEgYnVnIGluIHlvdXIgYXBwbGljYXRpb24uIEl0IGlzIG1vc3QgbGlrZWx5IHRoZSByZXN1bHQgb2YgY2FsbGluZyBhbiBNU0lMLWNvbXBpbGVkICgvY2xyKSBmdW5jdGlvbiBmcm9tIGEgbmF0aXZlIGNvbnN0cnVjdG9yIG9yIGZyb20gRGxsTWFpbi4NCgAAUjYwMzINCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgbG9jYWxlIGluZm9ybWF0aW9uDQoAAAAAAABSNjAzMQ0KLSBBdHRlbXB0IHRvIGluaXRpYWxpemUgdGhlIENSVCBtb3JlIHRoYW4gb25jZS4KVGhpcyBpbmRpY2F0ZXMgYSBidWcgaW4geW91ciBhcHBsaWNhdGlvbi4NCgAAAAAAAFI2MDMwDQotIENSVCBub3QgaW5pdGlhbGl6ZWQNCgAAUjYwMjgNCi0gdW5hYmxlIHRvIGluaXRpYWxpemUgaGVhcA0KAAAAAFI2MDI3DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGxvd2lvIGluaXRpYWxpemF0aW9uDQoAAAAAUjYwMjYNCi0gbm90IGVub3VnaCBzcGFjZSBmb3Igc3RkaW8gaW5pdGlhbGl6YXRpb24NCgAAAABSNjAyNQ0KLSBwdXJlIHZpcnR1YWwgZnVuY3Rpb24gY2FsbA0KAAAAUjYwMjQNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgX29uZXhpdC9hdGV4aXQgdGFibGUNCgAAAABSNjAxOQ0KLSB1bmFibGUgdG8gb3BlbiBjb25zb2xlIGRldmljZQ0KAAAAAAAAAABSNjAxOA0KLSB1bmV4cGVjdGVkIGhlYXAgZXJyb3INCgAAAAAAAAAAUjYwMTcNCi0gdW5leHBlY3RlZCBtdWx0aXRocmVhZCBsb2NrIGVycm9yDQoAAAAAUjYwMTYNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgdGhyZWFkIGRhdGENCgAAAAAAAAAAAAAAAAANClRoaXMgYXBwbGljYXRpb24gaGFzIHJlcXVlc3RlZCB0aGUgUnVudGltZSB0byB0ZXJtaW5hdGUgaXQgaW4gYW4gdW51c3VhbCB3YXkuClBsZWFzZSBjb250YWN0IHRoZSBhcHBsaWNhdGlvbidzIHN1cHBvcnQgdGVhbSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4NCgAAAFI2MDA5DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGVudmlyb25tZW50DQoAAAAAAFI2MDA4DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGFyZ3VtZW50cw0KAAAAAAAAAFI2MDAyDQotIGZsb2F0aW5nIHBvaW50IHN1cHBvcnQgbm90IGxvYWRlZA0KAAAAAE1pY3Jvc29mdCBWaXN1YWwgQysrIFJ1bnRpbWUgTGlicmFyeQAAAAAKCgAALi4uADxwcm9ncmFtIG5hbWUgdW5rbm93bj4AAFJ1bnRpbWUgRXJyb3IhCgpQcm9ncmFtOiAAAAAAAAAABQAAwAsAAAAAAAAAAAAAAB0AAMAEAAAAAAAAAAAAAACWAADABAAAAAAAAAAAAAAAjQAAwAgAAAAAAAAAAAAAAI4AAMAIAAAAAAAAAAAAAACPAADACAAAAAAAAAAAAAAAkAAAwAgAAAAAAAAAAAAAAJEAAMAIAAAAAAAAAAAAAACSAADACAAAAAAAAAAAAAAAkwAAwAgAAAAAAAAAAAAAAAaAgIaAgYAAABADhoCGgoAUBQVFRUWFhYUFAAAwMIBQgIgACAAoJzhQV4AABwA3MDBQUIgAAAAgKICIgIAAAABgaGBoaGgICAd4cHB3cHAICAAACAAIAAcIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgACAAIAAgACAAIAAgACAAIAAoACgAKAAoACgAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAASAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACEAIQAhACEAIQAhACEAIQAhACEABAAEAAQABAAEAAQABAAgQCBAIEAgQCBAIEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABAAEAAQABAAEAAQAIIAggCCAIIAggCCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAQABAAEAAQACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgACAAIAAgACAAIAAgACAAaAAoACgAKAAoACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAEgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAhACEAIQAhACEAIQAhACEAIQAhAAQABAAEAAQABAAEAAQAIEBgQGBAYEBgQGBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEQABAAEAAQABAAEACCAYIBggGCAYIBggECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBEAAQABAAEAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIABIABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAUABQAEAAQABAAEAAQABQAEAAQABAAEAAQABAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBARAAAQEBAQEBAQEBAQEBAQECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgEQAAIBAgECAQIBAgECAQIBAgEBAQAAAAAAAAAAAAAAAICBgoOEhYaHiImKi4yNjo+QkZKTlJWWl5iZmpucnZ6foKGio6SlpqeoqaqrrK2ur7CxsrO0tba3uLm6u7y9vr/AwcLDxMXGx8jJysvMzc7P0NHS09TV1tfY2drb3N3e3+Dh4uPk5ebn6Onq6+zt7u/w8fLz9PX29/j5+vv8/f7/AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/4CBgoOEhYaHiImKi4yNjo+QkZKTlJWWl5iZmpucnZ6foKGio6SlpqeoqaqrrK2ur7CxsrO0tba3uLm6u7y9vr/AwcLDxMXGx8jJysvMzc7P0NHS09TV1tfY2drb3N3e3+Dh4uPk5ebn6Onq6+zt7u/w8fLz9PX29/j5+vv8/f7/AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlae3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/0hIOm1tOnNzAAAAAAAAAABkZGRkLCBNTU1NIGRkLCB5eXl5AAAAAABNTS9kZC95eQAAAABQTQAAQU0AAAAAAABEZWNlbWJlcgAAAAAAAAAATm92ZW1iZXIAAAAAAAAAAE9jdG9iZXIAU2VwdGVtYmVyAAAAQXVndXN0AABKdWx5AAAAAEp1bmUAAAAAQXByaWwAAABNYXJjaAAAAAAAAABGZWJydWFyeQAAAAAAAAAASmFudWFyeQBEZWMATm92AE9jdABTZXAAQXVnAEp1bABKdW4ATWF5AEFwcgBNYXIARmViAEphbgBTYXR1cmRheQAAAABGcmlkYXkAAAAAAABUaHVyc2RheQAAAAAAAAAAV2VkbmVzZGF5AAAAAAAAAFR1ZXNkYXkATW9uZGF5AABTdW5kYXkAAFNhdABGcmkAVGh1AFdlZABUdWUATW9uAFN1bgAAAAAAR2V0UHJvY2Vzc1dpbmRvd1N0YXRpb24AR2V0VXNlck9iamVjdEluZm9ybWF0aW9uQQAAAAAAAABHZXRMYXN0QWN0aXZlUG9wdXAAAAAAAABHZXRBY3RpdmVXaW5kb3cATWVzc2FnZUJveEEAAAAAAFVTRVIzMi5ETEwAAAAAAABTdW5Nb25UdWVXZWRUaHVGcmlTYXQAAABKYW5GZWJNYXJBcHJNYXlKdW5KdWxBdWdTZXBPY3ROb3ZEZWMAAAAAQ09OT1VUJAAuY29tAAAAAC5leGUAAAAALmJhdAAAAAAuY21kAAAAAC5cAAAAAAAAU3lzdGVtUm9vdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAR4MAB50CwAeZAoAHlQJAB40CAAeMhrgGNAWwBkfBQANNJAADQGMAAZwAACoHwAAUAQAAAENBQANNB8ADQEcAAZwAAABGAoAGGQKABhUCQAYNAgAGDIU0BLAEHAhAAAA8BUAANoWAAA8BwEAIQAAANoWAACuFwAAKAcBACEABAAA1EgAAMRJANoWAACuFwAAKAcBACEcBgAc1EgAFMRJAAhkSgDaFgAArhcAACgHAQAhCAIACFRSAPAVAADaFgAAPAcBABkgBgAOAUsAB/AF4ANwAjCoHwAAMAIAABEcBQAcYhjAFnAVYBQwAACMKwAAAQAAAHwZAABJGgAAYOEAAAAAAAABGQoAGTQPABlSFfAT4BHQD8ANcAxgC1ABBgIABnICMAEUAgAUshAwAQYCAAYyAjABDwQADzQGAA8yC3ARHAoAHGQPABw0DgAcchjwFuAU0BLAEHCMKwAAAQAAAOMnAADsKAAAeOEAAAAAAAAJCgQACjQJAApSBnCMKwAAAQAAALcqAABTKwAAmuEAAFMrAAABBAEABEIAAAEgDAAgZBEAIFQQACA0DgAgchzwGuAY0BbAFHABEAYAEHQHABA0BgAQMgzAAQkCAAkyBTABGAgAGGQIABhUBwAYNAYAGDIUcBkpCwAXNGQAFwFaABDwDuAM0ArACHAHYAZQAACoHwAAyAIAAAkgDQAgxBkAIHQYACBkFwAgNBYAIAESABnwF+AV0AAAjCsAAAEAAABgOgAAbDoAAAEAAAAIPQAAAQkDAAkBvAACMAAAARkKABl0CQAZZAgAGVQHABk0BgAZMhXAAQoCAAoyBjAREAYAEGQJABA0CAAQUgzAjCsAAAEAAABLQgAAw0IAALbhAAAAAAAAERkKABnEDAAZdAsAGWQKABlSFfAT4BHQjCsAAAIAAAAHRAAATUQAAM/hAAAAAAAAzkMAAGpEAAD/4QAAAAAAAAEVCAAVdAgAFWQHABU0BgAVMhHAARQIABRkCAAUVAcAFDQGABQyEHARFQgAFXQIABVkBwAVNAYAFTIR0IwrAAABAAAAT0YAAI9GAAAY4gAAAAAAAAEKBAAKNAgAClIGcAEUCAAUZAoAFFQJABQ0CAAUUhBwAQ8GAA9kCwAPNAoAD3ILcAEMAgAMAREAGSQHABJktAASNLMAEgGwAAtwAACoHwAAcAUAABEKBAAKNAcACjIGcIwrAAABAAAAvk0AABdOAAA04gAAAAAAABkfCAAQNBAAEHIM0ArACHAHYAZQqB8AADgAAAARGQoAGcQLABl0CgAZZAkAGTQIABlSFdCMKwAAAQAAAC1SAADnUgAANOIAAAAAAAARBgIABjICMIwrAAABAAAAt1YAAM1WAABN4gAAAAAAABEKBAAKNAYACjIGcIwrAAACAAAAilcAAJVXAABm4gAAAAAAAKpXAADRVwAAhuIAAAAAAAAREwQAEzQHABMyD3CMKwAAAgAAAC5ZAABcWQAAZuIAAAAAAABxWQAAqFkAAIbiAAAAAAAAAQ8GAA9kEAAPVA8AD7ILcAEXCAAXZAkAF1QIABc0BwAXMhNwARUIABXUCwAVdAoAFTQIABVSEeARGQoAGXQKABlkCQAZNAgAGTIV4BPQEcCMKwAAAQAAALpfAAB7YAAAn+IAAAAAAAABBgIABjICUAkEAQAEQgAAjCsAAAEAAADnYQAAGmIAAMDiAAAaYgAACQQBAARCAACMKwAAAQAAADliAAA9YgAAAQAAAD1iAAARFwoAF2QQABc0DwAXchPwEeAP0A3AC3CMKwAAAQAAAOBlAABzZgAA4eIAAAAAAAAJBAEABGIAAIwrAAABAAAA9GYAAANnAAD94gAAA2cAAAEdDAAddAsAHWQKAB1UCQAdNAgAHTIZ4BfQFcABDwYAD2QLAA80CgAPUgtwARkKABl0DQAZZAwAGVQLABk0CgAZchXAAQgBAAhCAAABCgQACjQIAAoyBnAAAAAAAQcCAAcBmwABBAEABGIAAAESBgASNBAAErIOcA1gDFABDwYAD2QJAA80CAAPUgtwEQ8EAA80CQAPUgtwjCsAAAEAAAD3dQAAAXYAAB/jAAAAAAAAGS8LAB00cQMdAWYDEPAO4AzQCsAIcAdgBlAAAKgfAAAgGwAAERsKABtkDgAbNA0AG1IX8BXgE9ARwA9wjCsAAAEAAAAsfgAAXX4AAE7jAAAAAAAAEREGABE0DAARUg3AC3AKYIwrAAABAAAAP38AAIN/AAA34wAAAAAAAAEKBAAKNAwACpIGcAEYCgAYZBAAGFQPABg0DgAYkhTQEsAQcBktDUUfdBQAG2QTABc0EgATQw6yCvAI4AbQBMACUAAAqB8AAFgAAAABDwYAD2QRAA80EAAP0gtwGTENNSN0EAAfZA8AGzQOABczEnIO8AzgCtAIwAZQAACoHwAAOAAAAAEPBgAPZA8ADzQOAA+yC3ABDgIADjIKMAEGAgAGUgIwERsKABtkDgAbNA0AG1IX8BXgE9ARwA9wjCsAAAEAAADWlgAACZcAAE7jAAAAAAAAARYKABZUDwAWNA4AFnIS4BDQDsAMcAtgAQcCAAcBtQABHQwAHXQRAB1kEAAdVA8AHTQOAB2SGeAX0BXAAQoEAAo0BgAKMgZwERcIABdkDQAXNAwAF1IT0BHAD3CMKwAAAQAAAAOfAAAonwAAN+MAAAAAAAAZEwEABMIAAKgfAABQAAAAAQQBAAQSAAABDwYAD1QHAA80BgAPMgtwERkKABnECQAZdAgAGWQHABk0BgAZMhXQjCsAAAEAAABrpAAAi6QAAGXjAAAAAAAAERkKABnEDgAZdA0AGTQMABlyFfAT4BHQjCsAAAIAAACNpQAAs6UAAH7jAAAAAAAANKUAAOWmAACe4wAAAAAAABkTAQAEYgAAqB8AACgAAAAZJwtFGUMUAREADfAL4AnQB8AFcARgAzACUAAAqB8AAHAAAAABBAEABIIAAAEGAgAGUgJQERUIABV0CgAVZAkAFTQIABVSEcCMKwAAAQAAAPGsAADZrQAAt+MAAAAAAAABCgQAClQRAArSBnABFAgAFGQQABRUDwAUNA4AFLIQcAEPBgAPVAwADzQLAA9yC3AZJAo1FjMRwg3wC+AJ0AfABXAEYAMwAlCoHwAAWAAAAAEYCgAYNBAAGFIU8BLgENAOwAxwC2AKUAEZCQAZohXwE+AR0A/ADXAMYAtQCjAAABEbCgAbZA4AGzQNABtSF/AV4BPQEcAPcIwrAAABAAAADMYAAD7GAABO4wAAAAAAAAEhCgAhNBkAIfIa8BjgFtAUwBJwEWAQUAEGAgAGcgJQERQDABSiEHAPYAAAjCsAAAEAAADvzgAAHM8AANDjAAAAAAAAAR0MAB10CwAdZAoAHVQJAB00CAAdMhnwF9AVwAEPBgAPZAcADzQGAA8yC3ABBQIABTQBAAEcCQAcARwAFfAT4BHQD8ANcAxQCzAAABkjCgAUAREADfAL4AnQB8AFcARgA1ACMKgfAAB4AAAAAQ8GAA9kDQAPNAwAD5ILcAEUCAAUZA4AFFQNABQ0DAAUkhBwGBEBAAAAAAAAAAAAThkBAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACoEwEAAAAAAMQTAQAAAAAA2hMBAAAAAADwEwEAAAAAAAIUAQAAAAAAGhQBAAAAAAAwFAEAAAAAAEgUAQAAAAAAYBQBAAAAAAB0FAEAAAAAAHwUAQAAAAAAjhQBAAAAAACcFAEAAAAAAK4UAQAAAAAAvBQBAAAAAADOFAEAAAAAAN4UAQAAAAAA7BQBAAAAAAD+FAEAAAAAABYVAQAAAAAAKhUBAAAAAAA+FQEAAAAAAFoVAQAAAAAAeBUBAAAAAACMFQEAAAAAAKAVAQAAAAAAuhUBAAAAAADOFQEAAAAAAN4VAQAAAAAA6hUBAAAAAAD2FQEAAAAAAAIWAQAAAAAADBYBAAAAAAAYFgEAAAAAACoWAQAAAAAAOhYBAAAAAABKFgEAAAAAAFgWAQAAAAAAZhYBAAAAAABwFgEAAAAAAIAWAQAAAAAAlhYBAAAAAACiFgEAAAAAAK4WAQAAAAAAvhYBAAAAAADmFgEAAAAAAAAXAQAAAAAAGBcBAAAAAAAyFwEAAAAAAEgXAQAAAAAAYhcBAAAAAAB4FwEAAAAAAIYXAQAAAAAAoBcBAAAAAACwFwEAAAAAAMYXAQAAAAAA4BcBAAAAAADuFwEAAAAAAP4XAQAAAAAAEBgBAAAAAAAkGAEAAAAAADQYAQAAAAAAShgBAAAAAABaGAEAAAAAAGwYAQAAAAAAfhgBAAAAAACQGAEAAAAAAKIYAQAAAAAArhgBAAAAAAC8GAEAAAAAAMwYAQAAAAAA4hgBAAAAAADyGAEAAAAAAAIZAQAAAAAAEBkBAAAAAAAiGQEAAAAAADQZAQAAAAAAXBkBAAAAAABoGQEAAAAAAHgZAQAAAAAAihkBAAAAAAAAAAAAAAAAAFMBR2VuZXJhdGVDb25zb2xlQ3RybEV2ZW50AADHAUdldEV4aXRDb2RlUHJvY2VzcwAAcgRXYWl0Rm9yU2luZ2xlT2JqZWN0AJYAQ3JlYXRlUHJvY2Vzc0EAALQDU2V0Q29uc29sZUN0cmxIYW5kbGVyAPUBR2V0TW9kdWxlRmlsZU5hbWVBAADbAEVudGVyQ3JpdGljYWxTZWN0aW9uAADuAkxlYXZlQ3JpdGljYWxTZWN0aW9uAAD6AUdldE1vZHVsZUhhbmRsZVcAAC8EU2xlZXAAIgJHZXRQcm9jQWRkcmVzcwAABgFFeGl0UHJvY2VzcwBxAUdldENvbW1hbmRMaW5lQQCeA1J0bFVud2luZEV4APQDU2V0SGFuZGxlQ291bnQAAD4CR2V0U3RkSGFuZGxlAADZAUdldEZpbGVUeXBlADwCR2V0U3RhcnR1cEluZm9BAMAARGVsZXRlQ3JpdGljYWxTZWN0aW9uADsEVGVybWluYXRlUHJvY2VzcwAAqwFHZXRDdXJyZW50UHJvY2VzcwBMBFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcgAAIwRTZXRVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIA0AJJc0RlYnVnZ2VyUHJlc2VudACfA1J0bFZpcnR1YWxVbndpbmQAAJgDUnRsTG9va3VwRnVuY3Rpb25FbnRyeQAAkQNSdGxDYXB0dXJlQ29udGV4dADnAUdldExhc3RFcnJvcgAApgJIZWFwRnJlZQAAogJIZWFwQWxsb2MAXQFHZXRDUEluZm8AVAFHZXRBQ1AAABQCR2V0T0VNQ1AAANoCSXNWYWxpZENvZGVQYWdlANcARW5jb2RlUG9pbnRlcgC5AERlY29kZVBvaW50ZXIAQAFGbHNHZXRWYWx1ZQBBAUZsc1NldFZhbHVlAD8BRmxzRnJlZQD4A1NldExhc3RFcnJvcgAArwFHZXRDdXJyZW50VGhyZWFkSWQAAD4BRmxzQWxsb2MAAJsEV3JpdGVGaWxlAPACTG9hZExpYnJhcnlBAAC6AkluaXRpYWxpemVDcml0aWNhbFNlY3Rpb25BbmRTcGluQ291bnQATAFGcmVlRW52aXJvbm1lbnRTdHJpbmdzQQDBAUdldEVudmlyb25tZW50U3RyaW5ncwBNAUZyZWVFbnZpcm9ubWVudFN0cmluZ3NXAIgEV2lkZUNoYXJUb011bHRpQnl0ZQDDAUdldEVudmlyb25tZW50U3RyaW5nc1cAAKoCSGVhcFNldEluZm9ybWF0aW9uAACkAkhlYXBDcmVhdGUAAFMDUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIAagJHZXRUaWNrQ291bnQAAKwBR2V0Q3VycmVudFByb2Nlc3NJZABTAkdldFN5c3RlbVRpbWVBc0ZpbGVUaW1lAKkCSGVhcFJlQWxsb2MAhQFHZXRDb25zb2xlQ1AAAJcBR2V0Q29uc29sZU1vZGUAAEMBRmx1c2hGaWxlQnVmZmVycwAA4AJMQ01hcFN0cmluZ0EAABkDTXVsdGlCeXRlVG9XaWRlQ2hhcgDiAkxDTWFwU3RyaW5nVwAAQAJHZXRTdHJpbmdUeXBlQQAAQwJHZXRTdHJpbmdUeXBlVwAA6QFHZXRMb2NhbGVJbmZvQQAA7ANTZXRGaWxlUG9pbnRlcgAAqwJIZWFwU2l6ZQAARABDbG9zZUhhbmRsZQCQBFdyaXRlQ29uc29sZUEAmwFHZXRDb25zb2xlT3V0cHV0Q1AAAJoEV3JpdGVDb25zb2xlVwAKBFNldFN0ZEhhbmRsZQAAegBDcmVhdGVGaWxlQQBTAENvbXBhcmVTdHJpbmdBAABWAENvbXBhcmVTdHJpbmdXAADdA1NldEVudmlyb25tZW50VmFyaWFibGVBAEtFUk5FTDMyLmRsbAAAaANSZWFkRmlsZQAA2gNTZXRFbmRPZkZpbGUAACYCR2V0UHJvY2Vzc0hlYXAAAMsBR2V0RmlsZUF0dHJpYnV0ZXNBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgRQFAAQAAAAAAAAAAAAAA4EUBQAEAAAABAQAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyot8tmSsAAM1dINJm1P//TCkAQAEAAAABAAAAAAAAAAD0AEABAAAA8PMAQAEAAAD//////////4AKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAFgAAAAIAAAACAAAAAwAAAAIAAAAEAAAAGAAAAAUAAAANAAAABgAAAAkAAAAHAAAADAAAAAgAAAAMAAAACQAAAAwAAAAKAAAABwAAAAsAAAAIAAAADAAAABYAAAANAAAAFgAAAA8AAAACAAAAEAAAAA0AAAARAAAAEgAAABIAAAACAAAAIQAAAA0AAAA1AAAAAgAAAEEAAAANAAAAQwAAAAIAAABQAAAAEQAAAFIAAAANAAAAUwAAAA0AAABXAAAAFgAAAFkAAAALAAAAbAAAAA0AAABtAAAAIAAAAHAAAAAcAAAAcgAAAAkAAAAGAAAAFgAAAIAAAAAKAAAAgQAAAAoAAACCAAAACQAAAIMAAAAWAAAAhAAAAA0AAACRAAAAKQAAAJ4AAAANAAAAoQAAAAIAAACkAAAACwAAAKcAAAANAAAAtwAAABEAAADOAAAAAgAAANcAAAALAAAAGAcAAAwAAAAMAAAACAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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CQEAgE0AADxOAAD0CQEAPE4AAMxOAACUBwEAzE4AAENRAAAYCgEARFEAADxTAAA0CgEAPFMAAGRTAAAMCAEAZFMAAN5UAAB4EAEAIFYAAHdWAACkBwEAeFYAAO1WAABkCgEADFcAADFXAAAMCAEANFcAAOZXAACECgEA6FcAAGxYAAAoDgEAbFgAAJBYAACkBwEAkFgAAMVZAAC4CgEAyFkAAElaAACkBwEATFoAAFVbAADsCgEAWFsAAOVcAAD8CgEA6FwAAA1fAAAQCwEAEF8AAFNfAAAMCAEAVF8AAJZfAACkBwEAmF8AAJ1gAAAkCwEAoGAAALdgAAAMCAEAuGAAAPBgAAAoDgEA8GAAAChhAAAoDgEAKGEAAF5hAAAoDgEA4GEAACFiAABcCwEAJGIAAEdiAAB8CwEASGIAAGRiAAAMCAEAaGIAADZkAABgCQEAZGQAANVmAACcCwEA8GYAACVnAADMCwEAMGcAAGJnAACkBwEAZGcAAKVnAAAMCAEAqGcAAMBnAAAMCAEAwGcAAO9oAACsCQEA8GgAAL9qAADsCwEAwGoAALZrAAAIDAEAuGsAAGptAAAYDAEAbG0AALhtAAAwDAEAuG0AAGtuAAA4DAEAgG4AAKRuAABIDAEA5G4AAFNvAABQDAEAVG8AAJlvAACUBwEAnG8AAONvAACUBwEAwHAAANByAABYDAEA0HIAAORyAABQDAEA7HIAAKJzAAB4EAEApHMAAHd0AAB4EAEAeHQAABJ1AABoDAEAFHUAAJ11AACgCQEAoHUAABZ2AAB4DAEAGHYAAHZ9AACcDAEAeH0AAKl+AADADAEArH4AAL9/AADwDAEAwH8AAHqAAAAYDQEAhIAAACuDAAAkDQEALIMAAGmIAAA8DQEAbIgAAAKJAABkDQEABIkAAG6LAAB0DQEAcIsAAPmLAACcDQEARI8AAC6RAACsDQEAMJEAAHiRAADcCAEAeJEAAA2SAACsDQEAEJIAAJmSAAC0DQEAnJIAAHGTAAC0DQEAdJMAAOWTAAC0DQEAiJUAAB2WAAAoDgEAIJYAAFeXAAC8DQEAWJcAAKuXAACkBwEArJcAAKCZAADsDQEAoJkAAPCZAABQDAEA8JkAADaaAABQDAEARJoAAOWaAAAEDgEA6JoAAGqdAAAMDgEAbJ0AAJydAABQDAEAnJ0AAFieAAAo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Awy1oCpBAOsCi8r2QSR/dZGD+P90GYP4/nQUi8iD4B/B+QXB4AYDBI2gKkEA6wKLwvZAJIAPhWf///8zyTvZD4Rd////ihOJjdj9//+JjeD9//+Jjbz9//+Ile/9//+E0g+EHwoAAEODvdj9//8AiZ3E/f//D4wLCgAAisIsIDxYdxEPvsIPvoBY4kAAg+APM/brBDP2M8APvoTBeOJAAGoHwfgEWYmFlP3//zvBD4etCQAA/ySF3zJAAION6P3///+JtZD9//+JtcD9//+Jtcz9//+JtdD9//+JtfD9//+Jtcj9///pdgkAAA++woPoIHRKg+gDdDaD6Ah0JUhIdBWD6AMPhVcJAACDjfD9//8I6UsJAACDjfD9//8E6T8JAACDjfD9//8B6TMJAACBjfD9//+AAAAA6SQJAACDjfD9//8C6RgJAACA+ip1LIPHBIm93P3//4t//Dv+ib3M/f//D435CAAAg43w/f//BPedzP3//+nnCAAAi4XM/f//a8AKD77KjUQI0ImFzP3//+nMCAAAibXo/f//6cEIAACA+ip1JoPHBIm93P3//4t//Dv+ib3o/f//D42iCAAAg43o/f///+mWCAAAi4Xo/f//a8AKD77KjUQI0ImF6P3//+l7CAAAgPpJdFWA+mh0RID6bHQYgPp3D4VjCAAAgY3w/f//AAgAAOlUCAAAgDtsdRZDgY3w/f//ABAAAImdxP3//+k5CAAAg43w/f//EOktCAAAg43w/f//IOkhCAAAigM8NnUdgHsBNHUXQ0OBjfD9//8AgAAAiZ3E/f//6f4HAAA8M3UdgHsBMnUXQ0OBpfD9////f///iZ3E/f//6d0HAAA8ZA+E1QcAADxpD4TNBwAAPG8PhMUHAAA8dQ+EvQcAADx4D4S1BwAAPFgPhK0HAACJtZT9//+NhaT9//9QD7bCUIm1yP3//+ikPAAAWYXAioXv/f//WXQii420/f//jbXY/f//6KT7//+KA0OJncT9//+EwA+EpPz//4uNtP3//4212P3//+iC+///6U0HAAAPvsKD+GQPj+gBAAAPhHkCAACD+FMPj/IAAAAPhIAAAACD6EF0EEhIdFhISHQISEgPhZIFAACAwiDHhZD9//8BAAAAiJXv/f//g43w/f//QDm16P3//42d9P3//7gAAgAAiZ3k/f//iYWg/f//D41IAgAAx4Xo/f//BgAAAOmlAgAA94Xw/f//MAgAAA+FmAAAAIGN8P3//wAIAADpiQAAAPeF8P3//zAIAAB1CoGN8P3//wAIAACLjej9//+D+f91Bbn///9/g8cE94Xw/f//EAgAAIm93P3//4t//Im95P3//w+EsQQAADv+dQuhlBJBAImF5P3//4uF5P3//8eFyP3//wEAAADpfwQAAIPoWA+E2gIAAEhIdHkrwQ+EJ////0hID4WeBAAAg8cE94Xw/f//EAgAAIm93P3//3QwD7dH/FBoAAIAAI2F9P3//1CNheD9//9Q6Oc6AACDxBCFwHQfx4XA/f//AQAAAOsTikf8iIX0/f//x4Xg/f//AQAAAI2F9P3//4mF5P3//+k1BAAAiweDxwSJvdz9//87xnQ7i0gEO850NPeF8P3//wAIAAAPvwCJjeT9//90FJkrwtH4x4XI/f//AQAAAOnwAwAAibXI/f//6eUDAAChkBJBAImF5P3//1DoXjgAAFnpzgMAAIP4cA+P+wEAAA+E4wEAAIP4ZQ+MvAMAAIP4Zw+ONP7//4P4aXRxg/hudCiD+G8PhaADAAD2hfD9//+Ax4Xg/f//CAAAAHRhgY3w/f//AAIAAOtVizeDxwSJvdz9///o1zcAAIXAD4Qv+v//9oXw/f//IHQMZouF2P3//2aJBusIi4XY/f//iQbHhcD9//8BAAAA6aYEAACDjfD9//9Ax4Xg/f//CgAAAIuN8P3///fBAIAAAA+EqQEAAIsHi1cEg8cI6dUBAAB1EYD6Z3Vlx4Xo/f//AQAAAOtZOYXo/f//fgaJhej9//+Bvej9//+jAAAAfj+Ltej9//+Bxl0BAABW6B4LAACKle/9//9ZiYW8/f//hcB0EImF5P3//4m1oP3//4vY6wrHhej9//+jAAAAM/aLB4PHCImFiP3//4tH/ImFjP3//42FpP3//1D/tZD9//8PvsL/tej9//+Jvdz9//9Q/7Wg/f//jYWI/f//U1D/NVgcQQDoPSAAAFn/0Iu98P3//4PEHIHngAAAAHQgObXo/f//dRiNhaT9//9QU/81ZBxBAOgOIAAAWf/QWVmAve/9//9ndRw7/nUYjYWk/f//UFP/NWAcQQDo6R8AAFn/0FlZgDstdRGBjfD9//8AAQAAQ4md5P3//1PpA/7//8eF6P3//wgAAACJjbj9///rJIPocw+Etvz//0hID4SJ/v//g+gDD4W2AQAAx4W4/f//JwAAAPaF8P3//4DHheD9//8QAAAAD4Rp/v//ioW4/f//BFHGhdT9//8wiIXV/f//x4XQ/f//AgAAAOlF/v//98EAEAAAD4VL/v//g8cE9sEgdBiJvdz9///2wUB0Bg+/R/zrBA+3R/yZ6xOLR/z2wUB0A5nrAjPSib3c/f//9sFAdBs71n8XfAQ7xnMR99iD0gD32oGN8P3//wABAAD3hfD9//8AkAAAi9qL+HUCM9uDvej9//8AfQzHhej9//8BAAAA6xqDpfD9///3uAACAAA5hej9//9+BomF6P3//4vHC8N1BiGF0P3//41184uF6P3///+N6P3//4XAfwaLxwvDdC2LheD9//+ZUlBTV+iANwAAg8Ewg/k5iZ2g/f//i/iL2n4GA424/f//iA5O672NRfMrxkb3hfD9//8AAgAAiYXg/f//ibXk/f//dGGFwHQHi86AOTB0Vv+N5P3//4uN5P3//8YBMEDrPklmOTB0BkBAO8519CuF5P3//9H46yg7/nULoZASQQCJheT9//+LheT9///rB0mAOAB0BUA7znX1K4Xk/f//iYXg/f//g73A/f//AA+FXAEAAIuF8P3//6hAdDKpAAEAAHQJxoXU/f//LesYqAF0CcaF1P3//yvrC6gCdBHGhdT9//8gx4XQ/f//AQAAAIudzP3//yud4P3//yud0P3///aF8P3//wx1F/+1tP3//42F2P3//1NqIOhw9f//g8QM/7XQ/f//i720/f//jYXY/f//jY3U/f//6Hb1///2hfD9//8IWXQb9oXw/f//BHUSV1NqMI2F2P3//+gu9f//g8QMg73I/f//AIuF4P3//3RmhcB+You15P3//4mFoP3//w+3Bv+NoP3//1BqBo1F9FCNhZj9//9GUEbogTUAAIPEEIXAdSg5hZj9//90IP+1mP3//42F2P3//41N9Ojx9P//g72g/f//AFl1tescg43Y/f///+sTi43k/f//UI2F2P3//+jK9P//WYO92P3//wB8G/aF8P3//wR0EldTaiCNhdj9///ogvT//4PEDIO9vP3//wB0E/+1vP3//+gECAAAg6W8/f//AFmLncT9//+KA4iF7/3//4TAdBOLjZT9//+Lvdz9//+K0Onh9f//gL2w/f//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///o+CQAAFlmO4VA5f//D4U7AwAA/4U45f///4Uw5f//i0UQOYVE5f//D4L5/f//6ScDAACLDooT/4U45f//iFQPNIsOiUQPOOkOAwAAM8mLBgPH9kAEgA+EvwIAAIuFNOX//4mNQOX//4TbD4XKAAAAiYU85f//OU0QD4YgAwAA6waLtSjl//+LjTzl//+DpUTl//8AK4005f//jYVI5f//O00QczmLlTzl////hTzl//+KEkGA+gp1EP+FMOX//8YADUD/hUTl//+IEED/hUTl//+BvUTl////EwAAcsKL2I2FSOX//yvYagCNhSzl//9QU42FSOX//1CLBv80B/8VmOBAAIXAD4RCAgAAi4Us5f//AYU45f//O8MPjDoCAACLhTzl//8rhTTl//87RRAPgkz////pIAIAAImFROX//4D7Ag+F0QAAADlNEA+GTQIAAOsGi7Uo5f//i41E5f//g6U85f//ACuNNOX//42FSOX//ztNEHNGi5VE5f//g4VE5f//Ag+3EkFBZoP6CnUWg4Uw5f//AmoNW2aJGEBAg4U85f//AoOFPOX//wJmiRBAQIG9POX///4TAABytYvYjYVI5f//K9hqAI2FLOX//1BTjYVI5f//UIsG/zQH/xWY4EAAhcAPhGIBAACLhSzl//8BhTjl//87ww+MWgEAAIuFROX//yuFNOX//ztFEA+CP////+lAAQAAOU0QD4Z8AQAAi41E5f//g6U85f//ACuNNOX//2oCjYVI+f//XjtNEHM8i5VE5f//D7cSAbVE5f//A85mg/oKdQ5qDVtmiRgDxgG1POX//wG1POX//2aJEAPGgb085f//qAYAAHK/M/ZWVmhVDQAAjY3w6///UY2NSPn//yvBmSvC0fhQi8FQVmjp/QAA/xWw4EAAi9g73g+ElwAAAGoAjYUs5f//UIvDK8ZQjYQ18Ov//1CLhSjl//+LAP80B/8VmOBAAIXAdAwDtSzl//873n/L6wz/FVzgQACJhUDl//873n9ci4VE5f//K4U05f//iYU45f//O0UQD4IK////6z9qAI2NLOX//1H/dRD/tTTl////MP8VmOBAAIXAdBWLhSzl//+DpUDl//8AiYU45f//6wz/FVzgQACJhUDl//+DvTjl//8AdWyDvUDl//8AdC1qBV45tUDl//91FOgWt///xwAJAAAA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B1bo5q///1mLx41l7F9eW4tN/DPN6CiU///Jw4v/VYvsg+wQ/3UIjU3w6CKU////dSSNTfD/dSD/dRz/dRj/dRT/dRD/dQzoFv7//4PEHIB9/AB0B4tN+INhcP3Jw4v/VYvsVot1CIX2D4SBAQAA/3YE6Hav////dgjobq////92DOhmr////3YQ6F6v////dhToVq////92GOhOr////zboR6////92IOg/r////3Yk6Dev////dijoL6////92LOgnr////3Yw6B+v////djToF6////92HOgPr////3Y46Aev////djzo/67//4PEQP92QOj0rv///3ZE6Oyu////dkjo5K7///92TOjcrv///3ZQ6NSu////dlTozK7///92WOjErv///3Zc6Lyu////dmDotK7///92ZOisrv///3Zo6KSu////dmzonK7///92cOiUrv///3Z06Iyu////dnjohK7///92fOh8rv//g8RA/7aAAAAA6G6u////toQAAADoY67///+2iAAAAOhYrv///7aMAAAA6E2u////tpAAAADoQq7///+2lAAAAOg3rv///7aYAAAA6Cyu////tpwAAADoIa7///+2oAAAAOgWrv///7akAAAA6Auu////tqgAAADoAK7//4PELF5dw4v/VYvsVot1CIX2dDWLBjsFSB1BAHQHUOjdrf//WYtGBDsFTB1BAHQHUOjLrf//WYt2CDs1UB1BAHQHVui5rf//WV5dw4v/VYvsVot1CIX2dH6LRgw7BVQdQQB0B1Dol63//1mLRhA7BVgdQQB0B1Doha3//1mLRhQ7BVwdQQB0B1Doc63//1mLRhg7BWAdQQB0B1DoYa3//1mLRhw7BWQdQQB0B1DoT63//1mLRiA7BWgdQQB0B1DoPa3//1mLdiQ7NWwdQQB0B1boK63//1leXcOL/1WL7ItFCFMz21ZXO8N0B4t9DDv7dxvooan//2oWXokwU1NTU1PoKqn//4PEFIvG6zyLdRA783UEiBjr2ovQOBp0BEJPdfg7+3Tuig6ICkJGOst0A0918zv7dRCIGOhaqf//aiJZiQiL8eu1M8BfXltdw8zMzMzMzFWL7FYzwFBQUFBQUFBQi1UMjUkAigIKwHQJg8IBD6sEJOvxi3UIg8n/jUkAg8EBigYKwHQJg8YBD6MEJHPui8GDxCBe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AAAAAGZhaWxlZCB0byBnZXQgZXhpdCBjb2RlIGZyb20gcHJvY2Vzcy4KAABmYWlsZWQgdG8gY3JlYXRlIHByb2Nlc3MuCgAAICVzACVzAABDb3VsZCBub3QgZXhlYyAlcwAAAENhbm5vdCBmaW5kIFB5dGhvbiBleGVjdXRhYmxlICVzCgAAACMhcHl0aG9uLmV4ZQAAAAAjIQAAQ2Fubm90IG9wZW4gJXMKAC1zY3JpcHQucHkAAENvckV4aXRQcm9jZXNzAABtAHMAYwBvAHIAZQBlAC4AZABsAGwAAAAoAG4AdQBsAGwAKQAAAAAAKG51bGwpAAAAAAAABgAABgABAAAQAAMGAAYCEARFRUUFBQUFBTUwAFAAAAAAKCA4UFgHCAA3MDBXUAcAACAgCAAAAAAIYGhgYGBgAAB4cHh4eHgIBwgAAAcACAgIAAAIAAgABwgAAACoIUEAACJBAAAAAAABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/AD0AAABFbmNvZGVQb2ludGVyAAAASwBFAFIATgBFAEwAMwAyAC4ARABMAEwAAAAAAERlY29kZVBvaW50ZXIAAABGbHNGcmVlAEZsc1NldFZhbHVlAEZsc0dldFZhbHVlAEZsc0FsbG9jAAAAAHJ1bnRpbWUgZXJyb3IgAAANCgAAVExPU1MgZXJyb3INCgAAAFNJTkcgZXJyb3INCgAAAABET01BSU4gZXJyb3INCgAAUjYwMzQNCkFuIGFwcGxpY2F0aW9uIGhhcyBtYWRlIGFuIGF0dGVtcHQgdG8gbG9hZCB0aGUgQyBydW50aW1lIGxpYnJhcnkgaW5jb3JyZWN0bHkuClBsZWFzZSBjb250YWN0IHRoZSBhcHBsaWNhdGlvbidzIHN1cHBvcnQgdGVhbSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4NCgAAAAAAAFI2MDMzDQotIEF0dGVtcHQgdG8gdXNlIE1TSUwgY29kZSBmcm9tIHRoaXMgYXNzZW1ibHkgZHVyaW5nIG5hdGl2ZSBjb2RlIGluaXRpYWxpemF0aW9uClRoaXMgaW5kaWNhdGVzIGEgYnVnIGluIHlvdXIgYXBwbGljYXRpb24uIEl0IGlzIG1vc3QgbGlrZWx5IHRoZSByZXN1bHQgb2YgY2FsbGluZyBhbiBNU0lMLWNvbXBpbGVkICgvY2xyKSBmdW5jdGlvbiBmcm9tIGEgbmF0aXZlIGNvbnN0cnVjdG9yIG9yIGZyb20gRGxsTWFpbi4NCgAAUjYwMzINCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgbG9jYWxlIGluZm9ybWF0aW9uDQoAAAAAAABSNjAzMQ0KLSBBdHRlbXB0IHRvIGluaXRpYWxpemUgdGhlIENSVCBtb3JlIHRoYW4gb25jZS4KVGhpcyBpbmRpY2F0ZXMgYSBidWcgaW4geW91ciBhcHBsaWNhdGlvbi4NCgAAUjYwMzANCi0gQ1JUIG5vdCBpbml0aWFsaXplZA0KAABSNjAyOA0KLSB1bmFibGUgdG8gaW5pdGlhbGl6ZSBoZWFwDQoAAAAAUjYwMjcNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgbG93aW8gaW5pdGlhbGl6YXRpb24NCgAAAABSNjAyNg0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBzdGRpbyBpbml0aWFsaXphdGlvbg0KAAAAAFI2MDI1DQotIHB1cmUgdmlydHVhbCBmdW5jdGlvbiBjYWxsDQoAAABSNjAyNA0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBfb25leGl0L2F0ZXhpdCB0YWJsZQ0KAAAAAFI2MDE5DQotIHVuYWJsZSB0byBvcGVuIGNvbnNvbGUgZGV2aWNlDQoAAAAAUjYwMTgNCi0gdW5leHBlY3RlZCBoZWFwIGVycm9yDQoAAAAAUjYwMTcNCi0gdW5leHBlY3RlZCBtdWx0aXRocmVhZCBsb2NrIGVycm9yDQoAAAAAUjYwMTYNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgdGhyZWFkIGRhdGENCgANClRoaXMgYXBwbGljYXRpb24gaGFzIHJlcXVlc3RlZCB0aGUgUnVudGltZSB0byB0ZXJtaW5hdGUgaXQgaW4gYW4gdW51c3VhbCB3YXkuClBsZWFzZSBjb250YWN0IHRoZSBhcHBsaWNhdGlvbidzIHN1cHBvcnQgdGVhbSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4NCgAAAFI2MDA5DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGVudmlyb25tZW50DQoAUjYwMDgNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgYXJndW1lbnRzDQoAAABSNjAwMg0KLSBmbG9hdGluZyBwb2ludCBzdXBwb3J0IG5vdCBsb2FkZWQNCgAAAABNaWNyb3NvZnQgVmlzdWFsIEMrKyBSdW50aW1lIExpYnJhcnkAAAAACgoAAC4uLgA8cHJvZ3JhbSBuYW1lIHVua25vd24+AABSdW50aW1lIEVycm9yIQoKUHJvZ3JhbTogAAAAAAAAAAUAAMALAAAAAAAAAB0AAMAEAAAAAAAAAJYAAMAEAAAAAAAAAI0AAMAIAAAAAAAAAI4AAMAIAAAAAAAAAI8AAMAIAAAAAAAAAJAAAMAIAAAAAAAAAJEAAMAIAAAAAAAAAJIAAMAIAAAAAAAAAJMAAMAIAAAAAAAAAAaAgIaAgYAAABADhoCGgoAUBQVFRUWFhYUFAAAwMIBQgIgACAAoJzhQV4AABwA3MDBQUIgAAAAgKICIgIAAAABgaGBoaGgICAd4cHB3cHAICAAACAAIAAcIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgACAAIAAgACAAIAAgACAAIAAoACgAKAAoACgAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAASAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACEAIQAhACEAIQAhACEAIQAhACEABAAEAAQABAAEAAQABAAgQCBAIEAgQCBAIEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABAAEAAQABAAEAAQAIIAggCCAIIAggCCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAQABAAEAAQACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgACAAIAAgACAAIAAgACAAaAAoACgAKAAoACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAEgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAhACEAIQAhACEAIQAhACEAIQAhAAQABAAEAAQABAAEAAQAIEBgQGBAYEBgQGBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEQABAAEAAQABAAEACCAYIBggGCAYIBggECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBEAAQABAAEAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIABIABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAUABQAEAAQABAAEAAQABQAEAAQABAAEAAQABAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBARAAAQEBAQEBAQEBAQEBAQECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgEQAAIBAgECAQIBAgECAQIBAgEBAQAAAACAgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/wABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKjpKWmp6ipqqusra6vsLGys7S1tre4ubq7vL2+v8DBwsPExcbHyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dx8vP09fb3+Pn6+/z9/v+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/wABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXF1eX2BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWnt8fX5/gIGCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKjpKWmp6ipqqusra6vsLGys7S1tre4ubq7vL2+v8DBwsPExcbHyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dx8vP09fb3+Pn6+/z9/v9ISDptbTpzcwAAAABkZGRkLCBNTU1NIGRkLCB5eXl5AE1NL2RkL3l5AAAAAFBNAABBTQAARGVjZW1iZXIAAAAATm92ZW1iZXIAAAAAT2N0b2JlcgBTZXB0ZW1iZXIAAABBdWd1c3QAAEp1bHkAAAAASnVuZQAAAABBcHJpbAAAAE1hcmNoAAAARmVicnVhcnkAAAAASmFudWFyeQBEZWMATm92AE9jdABTZXAAQXVnAEp1bABKdW4ATWF5AEFwcgBNYXIARmViAEphbgBTYXR1cmRheQAAAABGcmlkYXkAAFRodXJzZGF5AAAAAFdlZG5lc2RheQAAAFR1ZXNkYXkATW9uZGF5AABTdW5kYXkAAFNhdABGcmkAVGh1AFdlZABUdWUATW9uAFN1bgBHZXRQcm9jZXNzV2luZG93U3RhdGlvbgBHZXRVc2VyT2JqZWN0SW5mb3JtYXRpb25BAAAAR2V0TGFzdEFjdGl2ZVBvcHVwAABHZXRBY3RpdmVXaW5kb3cATWVzc2FnZUJveEEAVVNFUjMyLkRMTAAAU3VuTW9uVHVlV2VkVGh1RnJpU2F0AAAASmFuRmViTWFyQXByTWF5SnVuSnVsQXVnU2VwT2N0Tm92RGVjAAAAAENPTk9VVCQALmNvbQAAAAAuZXhlAAAAAC5iYXQAAAAALmNtZAAAAAAuXAAAU3lzdGVtUm9vdAAAAAAAAEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIASQQDQ9EAAAwAAANA3AAAgaQAAEJkAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAA1xhAAAAAAAD+////AAAAAMj///8AAAAA/v///wAAAAC8I0AAAAAAAP7///8AAAAAzP///wAAAAD+////qSVAAL0lQAAAAAAA/v///wAAAACM////AAAAAP7///88NUAAQDVAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAADjOkAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAALE7QAAAAAAA/v///wAAAADM////AAAAAP7///8AAAAAOz1AAAAAAAAAAAAABz1AAP7///8AAAAA1P///wAAAAD+////AAAAAMA+QAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAA8z9AAAAAAAD+////AAAAANT///8AAAAA/v///x1BQAA5QUAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAC1HQAAAAAAA/v///wAAAADM////AAAAAP7///8AAAAA+0pAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAABrTkAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAK1QQAD+////AAAAALxQQAD+////AAAAANj///8AAAAA/v///wAAAABvUkAA/v///wAAAAB7UkAA/v///wAAAADU////AAAAAP7///8AAAAANVlAAAAAAAD+////AAAAANj///8AAAAA/v///9taQADvWkAAAAAAAP7///8AAAAA2P///wAAAAD+////LVtAADFbQAAAAAAA/v///wAAAADA////AAAAAP7///8AAAAAiF5AAAAAAAD+////AAAAAND///8AAAAA/v///xhfQAAvX0AAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAClqQAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAAOmxAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAAA+eUAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAE6BQAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAAL4JAAAAAAAD+////AAAAAMz///8AAAAA/v///wAAAAAklUAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAL2XQAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAAVKFAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAADLpUAAAAAAAP7///8AAAAAyP///wAAAAD+////AAAAAJGnQAAAAAAAAAAAAM2mQAD+////AAAAAND///8AAAAA/v///wAAAABMrkAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAGjCQAAAAAAA/v///wAAAADM////AAAAAP7///8AAAAAC8pAAFT5AAAAAAAAAAAAAA4AAQAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAACU+gAAsPoAAMb6AADc+gAA7voAAAb7AAAc+wAANPsAAEz7AABg+wAAaPsAAHr7AACI+wAAmvsAAKz7AAC8+wAAyvsAANz7AAD0+wAACPwAABz8AAA4/AAAVvwAAGr8AAB6/AAAhvwAAJL8AACe/AAAtvwAAM78AADY/AAA5PwAAPb8AAAE/QAAEP0AAB79AAAo/QAAOP0AAE79AABa/QAAav0AAJL9AACs/QAAxP0AAN79AAD0/QAADv4AABz+AAAq/gAARP4AAFT+AABq/gAAhP4AAJD+AACe/gAArv4AAL7+AADQ/gAA5P4AAPT+AAAK/wAAGv8AACz/AAA+/wAAUP8AAGL/AABu/wAAfP8AAIz/AACi/wAAsv8AAML/AADQ/wAA4v8AAPT/AAAcAAEAKAABADgAAQBKAAEAAAAAAFIBR2VuZXJhdGVDb25zb2xlQ3RybEV2ZW50AADGAUdldEV4aXRDb2RlUHJvY2VzcwAAbgRXYWl0Rm9yU2luZ2xlT2JqZWN0AJUAQ3JlYXRlUHJvY2Vzc0EAAK8DU2V0Q29uc29sZUN0cmxIYW5kbGVyAPUBR2V0TW9kdWxlRmlsZU5hbWVBAADaAEVudGVyQ3JpdGljYWxTZWN0aW9uAAD0AkxlYXZlQ3JpdGljYWxTZWN0aW9uAAD6AUdldE1vZHVsZUhhbmRsZVcAACsEU2xlZXAAIgJHZXRQcm9jQWRkcmVzcwAABQFFeGl0UHJvY2VzcwBwAUdldENvbW1hbmRMaW5lQQDwA1NldEhhbmRsZUNvdW50AAA+AkdldFN0ZEhhbmRsZQAA2AFHZXRGaWxlVHlwZQA8AkdldFN0YXJ0dXBJbmZvQQC/AERlbGV0ZUNyaXRpY2FsU2VjdGlvbgA3BFRlcm1pbmF0ZVByb2Nlc3MAAKoBR2V0Q3VycmVudFByb2Nlc3MASARVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIAAB8EU2V0VW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyANYCSXNEZWJ1Z2dlclByZXNlbnQA5wFHZXRMYXN0RXJyb3IAAKYCSGVhcEZyZWUAAKICSGVhcEFsbG9jAFwBR2V0Q1BJbmZvAMUCSW50ZXJsb2NrZWRJbmNyZW1lbnQAAMECSW50ZXJsb2NrZWREZWNyZW1lbnQAAFMBR2V0QUNQAAAUAkdldE9FTUNQAADgAklzVmFsaWRDb2RlUGFnZQA+BFRsc0dldFZhbHVlADwEVGxzQWxsb2MAAD8EVGxzU2V0VmFsdWUAPQRUbHNGcmVlAPQDU2V0TGFzdEVycm9yAACuAUdldEN1cnJlbnRUaHJlYWRJZAAAlwRXcml0ZUZpbGUA9gJMb2FkTGlicmFyeUEAALoCSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbkFuZFNwaW5Db3VudABLAUZyZWVFbnZpcm9ubWVudFN0cmluZ3NBAMABR2V0RW52aXJvbm1lbnRTdHJpbmdzAEwBRnJlZUVudmlyb25tZW50U3RyaW5nc1cAhARXaWRlQ2hhclRvTXVsdGlCeXRlAMIBR2V0RW52aXJvbm1lbnRTdHJpbmdzVwAApAJIZWFwQ3JlYXRlAABhBFZpcnR1YWxGcmVlAFkDUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIAagJHZXRUaWNrQ291bnQAAKsBR2V0Q3VycmVudFByb2Nlc3NJZABTAkdldFN5c3RlbVRpbWVBc0ZpbGVUaW1lAJoDUnRsVW53aW5kAKkCSGVhcFJlQWxsb2MAXgRWaXJ0dWFsQWxsb2MAAIQBR2V0Q29uc29sZUNQAACWAUdldENvbnNvbGVNb2RlAABCAUZsdXNoRmlsZUJ1ZmZlcnMAAOYCTENNYXBTdHJpbmdBAAAfA011bHRpQnl0ZVRvV2lkZUNoYXIA6AJMQ01hcFN0cmluZ1cAAEACR2V0U3RyaW5nVHlwZUEAAEMCR2V0U3RyaW5nVHlwZVcAAOkBR2V0TG9jYWxlSW5mb0EAAOcDU2V0RmlsZVBvaW50ZXIAAKsCSGVhcFNpemUAAEQAQ2xvc2VIYW5kbGUAjARXcml0ZUNvbnNvbGVBAJoBR2V0Q29uc29sZU91dHB1dENQAACWBFdyaXRlQ29uc29sZVcABgRTZXRTdGRIYW5kbGUAAHkAQ3JlYXRlRmlsZUEAUwBDb21wYXJlU3RyaW5nQQAAVgBDb21wYXJlU3RyaW5nVwAA2ANTZXRFbnZpcm9ubWVudFZhcmlhYmxlQQBLRVJORUwzMi5kbGwAAG4DUmVhZEZpbGUAANUDU2V0RW5kT2ZGaWxlAAAmAkdldFByb2Nlc3NIZWFwAADKAUdldEZpbGVBdHRyaWJ1dGVzQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAK0EAAAAAAMArQQABAQAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATuZAu7EZv0TqI0AAAQAAAGziQABc4kAA/////4AKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAWAAAAAgAAAAIAAAADAAAAAgAAAAQAAAAYAAAABQAAAA0AAAAGAAAACQAAAAcAAAAMAAAACAAAAAwAAAAJAAAADAAAAAoAAAAHAAAACwAAAAgAAAAMAAAAFgAAAA0AAAAWAAAADwAAAAIAAAAQAAAADQAAABEAAAASAAAAEgAAAAIAAAAhAAAADQAAADUAAAACAAAAQQAAAA0AAABDAAAAAgAAAFAAAAARAAAAUgAAAA0AAABTAAAADQAAAFcAAAAWAAAAWQAAAAsAAABsAAAADQAAAG0AAAAgAAAAcAAAABwAAAByAAAACQAAAAYAAAAWAAAAgAAAAAoAAACBAAAACgAAAIIAAAAJAAAAgwAAABYAAACEAAAADQAAAJEAAAApAAAAngAAAA0AAAChAAAAAgAAAKQAAAALAAAApwAAAA0AAAC3AAAAEQAAAM4AAAACAAAA1wAAAAsAAAAYBwAADAAAAAwAAAAIAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5egAAAAAAAEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoAAAAAAABBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoFUEAAQIECKQDAABggnmCIQAAAAAAAACm3wAAAAAAAKGlAAAAAAAAgZ/g/AAAAABAfoD8AAAAAKgDAADBo9qjIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgf4AAAAAAABA/gAAAAAAALUDAADBo9qjIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgf4AAAAAAABB/gAAAAAAALYDAADPouSiGgDlouiiWwAAAAAAAAAAAAAAAAAAAAAAgf4AAAAAAABAfqH+AAAAAFEFAABR2l7aIABf2mraMgAAAAAAAAAAAAAAAAAAAAAAgdPY3uD5AAAxfoH+AAAAAGztQAD+////QwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkBpBAAAAAAAAAAAAAAAAAJAaQQAAAAAAAAAAAAAAAACQGkEAAAAAAAAAAAAAAAAAkBpBAAAAAAAAAAAAAAAAAJAaQQAAAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAEgdQQAAAAAAAAAAAGjrQADw70AAcPFAAIgcQQCYGkEAAQAAAJgaQQBoFUEA//////////8CAAAA+OhAAAgAAADM6EAACQAAAKDoQAAKAAAACOhAABAAAADc50AAEQAAAKznQAASAAAAiOdAABMAAABc50AAGAAAACTnQAAZAAAA/OZAABoAAADE5kAAGwAAAIzmQAAcAAAAZOZAAB4AAABE5kAAHwAAAODlQAAgAAAAqOVAACEAAACw5EAAIgAAABDkQAB4AAAAAORAAHkAAADw40AAegAAAODjQAD8AAAA3ONAAP8AAADM40AAzpdAAM6XQADOl0AAzpdAAM6XQADOl0AAzpdAAM6XQADOl0AAzpdAAAMAAAAHAAAAeAAAAAoAAAAQAAAAAAAAAGjrQABq7UAAmPNAAJTzQACQ80AAjPNAAIjzQACE80AAgPNAAHjzQABw80AAaPNAAFzzQABQ80AASPNAADzzQAA480AANPNAADDzQAAs80AAKPNAACTzQAAg80AAHPNAABjzQAAU80AAEPNAAAzzQAAE80AA+PJAAPDyQADo8kAAKPNAAODyQADY8kAA0PJAAMTyQAC88kAAsPJAAKTyQACg8kAAnPJAAJDyQAB88kAAcPJAAAkEAAABAAAAAAAAAIgcQQAuAAAARB1BAIwpQQCMKUEAjClBAIwpQQCMKUEAjClBAIwpQQCMKUEAjClBAH9/f39/f39/SB1BAAEAAAAuAAAAAQAAAAAAAAAAAAAAAwAAACAFkxkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAgHAAAAEAAADw8f//AAAAAFBTVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQRFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0B1BABAeQQD/////AAAAAAAAAAD/////AAAAAAAAAAD+/////v////////8eAAAAOwAAAFoAAAB4AAAAlwAAALUAAADUAAAA8wAAABEBAAAwAQAATgEAAG0BAAD/////HgAAADoAAABZAAAAdwAAAJYAAAC0AAAA0wAAAPIAAAAQAQAALwEAAE0BAABsAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECAgICAgICAgICAgICAgICAwMDAwMDAwMAAAAAAAAAAGz0QABk9EAAXPRAAFT0QAACAAAAAAAAAAAAAAAAAAAAUEsDBBQAAAAAAAAAIQAW7xkFOAIAADgCAABDAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvY29tbWFuZC9fX2luaXRfXy5weV9fYWxsX18gPSBbCiAgICAnYWxpYXMnLCAnYmRpc3RfZWdnJywgJ2JkaXN0X3JwbScsICdidWlsZF9leHQnLCAnYnVpbGRfcHknLCAnZGV2ZWxvcCcsCiAgICAnZWFzeV9pbnN0YWxsJywgJ2VnZ19pbmZvJywgJ2luc3RhbGwnLCAnaW5zdGFsbF9saWInLCAncm90YXRlJywgJ3NhdmVvcHRzJywKICAgICdzZGlzdCcsICdzZXRvcHQnLCAndGVzdCcsICdpbnN0YWxsX2VnZ19pbmZvJywgJ2luc3RhbGxfc2NyaXB0cycsCiAgICAnYmRpc3Rfd2luaW5zdCcsICd1cGxvYWRfZG9jcycsICdidWlsZF9jbGliJywgJ2Rpc3RfaW5mbycsCl0KCmZyb20gZGlzdHV0aWxzLmNvbW1hbmQuYmRpc3QgaW1wb3J0IGJkaXN0CmltcG9ydCBzeXMKCmZyb20gc2V0dXB0b29scy5jb21tYW5kIGltcG9ydCBpbnN0YWxsX3NjcmlwdHMKCmlmICdlZ2cnIG5vdCBpbiBiZGlzdC5mb3JtYXRfY29tbWFuZHM6CiAgICBiZGlzdC5mb3JtYXRfY29tbWFuZFsnZWdnJ10gPSAoJ2JkaXN0X2VnZycsICJQeXRob24gLmVnZyBmaWxlIikKICAgIGJkaXN0LmZvcm1hdF9jb21tYW5kcy5hcHBlbmQoJ2VnZycpCgpkZWwgYmRpc3QsIHN5cwpQSwMEFAAAAAAAAAAhAFD4I/J6CQAAegkAAEAAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9jb21tYW5kL2FsaWFzLnB5ZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNPcHRpb25FcnJvcgoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5zaXgubW92ZXMgaW1wb3J0IG1hcAoKZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQuc2V0b3B0IGltcG9ydCBlZGl0X2NvbmZpZywgb3B0aW9uX2Jhc2UsIGNvbmZpZ19maWxlCgoKZGVmIHNocXVvdGUoYXJnKToKICAgICIiIlF1b3RlIGFuIGFyZ3VtZW50IGZvciBsYXRlciBwYXJzaW5nIGJ5IHNobGV4LnNwbGl0KCkiIiIKICAgIGZvciBjIGluICciJywgIiciLCAiXFwiLCAiIyI6CiAgICAgICAgaWYgYyBpbiBhcmc6CiAgICAgICAgICAgIHJldHVybiByZXByKGFyZykKICAgIGlmIGFyZy5zcGxpdCgpICE9IFthcmddOgogICAgICAgIHJldHVybiByZXByKGFyZykKICAgIHJldHVybiBhcmcKCgpjbGFzcyBhbGlhcyhvcHRpb25fYmFzZSk6CiAgICAiIiJEZWZpbmUgYSBzaG9ydGN1dCB0aGF0IGludm9rZXMgb25lIG9yIG1vcmUgY29tbWFuZHMiIiIKCiAgICBkZXNjcmlwdGlvbiA9ICJkZWZpbmUgYSBzaG9ydGN1dCB0byBpbnZva2Ugb25lIG9yIG1vcmUgY29tbWFuZHMiCiAgICBjb21tYW5kX2NvbnN1bWVzX2FyZ3VtZW50cyA9IFRydWUKCiAgICB1c2VyX29wdGlvbnMgPSBbCiAgICAgICAgKCdyZW1vdmUnLCAncicsICdyZW1vdmUgKHVuc2V0KSB0aGUgYWxpYXMnKSwKICAgIF0gKyBvcHRpb25fYmFzZS51c2VyX29wdGlvbnMKCiAgICBib29sZWFuX29wdGlvbnMgPSBvcHRpb25fYmFzZS5ib29sZWFuX29wdGlvbnMgKyBbJ3JlbW92ZSddCgogICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBvcHRpb25fYmFzZS5pbml0aWFsaXplX29wdGlvbnMoc2VsZikKICAgICAgICBzZWxmLmFyZ3MgPSBOb25lCiAgICAgICAgc2VsZi5yZW1vdmUgPSBOb25lCgogICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgb3B0aW9uX2Jhc2UuZmluYWxpemVfb3B0aW9ucyhzZWxmKQogICAgICAgIGlmIHNlbGYucmVtb3ZlIGFuZCBsZW4oc2VsZi5hcmdzKSAhPSAxOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigKICAgICAgICAgICAgICAgICJNdXN0IHNwZWNpZnkgZXhhY3RseSBvbmUgYXJndW1lbnQgKHRoZSBhbGlhcyBuYW1lKSB3aGVuICIKICAgICAgICAgICAgICAgICJ1c2luZyAtLXJlbW92ZSIKICAgICAgICAgICAgKQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgYWxpYXNlcyA9IHNlbGYuZGlzdHJpYnV0aW9uLmdldF9vcHRpb25fZGljdCgnYWxpYXNlcycpCgogICAgICAgIGlmIG5vdCBzZWxmLmFyZ3M6CiAgICAgICAgICAgIHByaW50KCJDb21tYW5kIEFsaWFzZXMiKQogICAgICAgICAgICBwcmludCgiLS0tLS0tLS0tLS0tLS0tIikKICAgICAgICAgICAgZm9yIGFsaWFzIGluIGFsaWFzZXM6CiAgICAgICAgICAgICAgICBwcmludCgic2V0dXAucHkgYWxpYXMiLCBmb3JtYXRfYWxpYXMoYWxpYXMsIGFsaWFzZXMpKQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgZWxpZiBsZW4oc2VsZi5hcmdzKSA9PSAxOgogICAgICAgICAgICBhbGlhcywgPSBzZWxmLmFyZ3MKICAgICAgICAgICAgaWYgc2VsZi5yZW1vdmU6CiAgICAgICAgICAgICAgICBjb21tYW5kID0gTm9uZQogICAgICAgICAgICBlbGlmIGFsaWFzIGluIGFsaWFzZXM6CiAgICAgICAgICAgICAgICBwcmludCgic2V0dXAucHkgYWxpYXMiLCBmb3JtYXRfYWxpYXMoYWxpYXMsIGFsaWFzZXMpKQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwcmludCgiTm8gYWxpYXMgZGVmaW5pdGlvbiBmb3VuZCBmb3IgJXIiICUgYWxpYXMpCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICBlbHNlOgogICAgICAgICAgICBhbGlhcyA9IHNlbGYuYXJnc1swXQogICAgICAgICAgICBjb21tYW5kID0gJyAnLmpvaW4obWFwKHNocXVvdGUsIHNlbGYuYXJnc1sxOl0pKQoKICAgICAgICBlZGl0X2NvbmZpZyhzZWxmLmZpbGVuYW1lLCB7J2FsaWFzZXMnOiB7YWxpYXM6IGNvbW1hbmR9fSwgc2VsZi5kcnlfcnVuKQoKCmRlZiBmb3JtYXRfYWxpYXMobmFtZSwgYWxpYXNlcyk6CiAgICBzb3VyY2UsIGNvbW1hbmQgPSBhbGlhc2VzW25hbWVdCiAgICBpZiBzb3VyY2UgPT0gY29uZmlnX2ZpbGUoJ2dsb2JhbCcpOgogICAgICAgIHNvdXJjZSA9ICctLWdsb2JhbC1jb25maWcgJwogICAgZWxpZiBzb3VyY2UgPT0gY29uZmlnX2ZpbGUoJ3VzZXInKToKICAgICAgICBzb3VyY2UgPSAnLS11c2VyLWNvbmZpZyAnCiAgICBlbGlmIHNvdXJjZSA9PSBjb25maWdfZmlsZSgnbG9jYWwnKToKICAgICAgICBzb3VyY2UgPSAnJwogICAgZWxzZToKICAgICAgICBzb3VyY2UgPSAnLS1maWxlbmFtZT0lcicgJSBzb3VyY2UKICAgIHJldHVybiBzb3VyY2UgKyBuYW1lICsgJyAnICsgY29tbWFuZApQSwMEFAAAAAAAAAAhAJxsOTAJRwAACUcAAEQAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9jb21tYW5kL2JkaXN0X2VnZy5weSIiInNldHVwdG9vbHMuY29tbWFuZC5iZGlzdF9lZ2cKCkJ1aWxkIC5lZ2cgZGlzdHJpYnV0aW9ucyIiIgoKZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNTZXR1cEVycm9yCmZyb20gZGlzdHV0aWxzLmRpcl91dGlsIGltcG9ydCByZW1vdmVfdHJlZSwgbWtwYXRoCmZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKZnJvbSB0eXBlcyBpbXBvcnQgQ29kZVR5cGUKaW1wb3J0IHN5cwppbXBvcnQgb3MKaW1wb3J0IHJlCmltcG9ydCB0ZXh0d3JhcAppbXBvcnQgbWFyc2hhbAoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybiBpbXBvcnQgc2l4Cgpmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0IGdldF9idWlsZF9wbGF0Zm9ybSwgRGlzdHJpYnV0aW9uLCBlbnN1cmVfZGlyZWN0b3J5CmZyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgRW50cnlQb2ludApmcm9tIHNldHVwdG9vbHMuZXh0ZW5zaW9uIGltcG9ydCBMaWJyYXJ5CmZyb20gc2V0dXB0b29scyBpbXBvcnQgQ29tbWFuZAoKdHJ5OgogICAgIyBQeXRob24gMi43IG9yID49My4yCiAgICBmcm9tIHN5c2NvbmZpZyBpbXBvcnQgZ2V0X3BhdGgsIGdldF9weXRob25fdmVyc2lvbgoKICAgIGRlZiBfZ2V0X3B1cmVsaWIoKToKICAgICAgICByZXR1cm4gZ2V0X3BhdGgoInB1cmVsaWIiKQpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBmcm9tIGRpc3R1dGlscy5zeXNjb25maWcgaW1wb3J0IGdldF9weXRob25fbGliLCBnZXRfcHl0aG9uX3ZlcnNpb24KCiAgICBkZWYgX2dldF9wdXJlbGliKCk6CiAgICAgICAgcmV0dXJuIGdldF9weXRob25fbGliKEZhbHNlKQoKCmRlZiBzdHJpcF9tb2R1bGUoZmlsZW5hbWUpOgogICAgaWYgJy4nIGluIGZpbGVuYW1lOgogICAgICAgIGZpbGVuYW1lID0gb3MucGF0aC5zcGxpdGV4dChmaWxlbmFtZSlbMF0KICAgIGlmIGZpbGVuYW1lLmVuZHN3aXRoKCdtb2R1bGUnKToKICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lWzotNl0KICAgIHJldHVybiBmaWxlbmFtZQoKCmRlZiBzb3J0ZWRfd2FsayhkaXIpOgogICAgIiIiRG8gb3Mud2FsayBpbiBhIHJlcHJvZHVjaWJsZSB3YXksCiAgICBpbmRlcGVuZGVudCBvZiBpbmRldGVybWluaXN0aWMgZmlsZXN5c3RlbSByZWFkZGlyIG9yZGVyCiAgICAiIiIKICAgIGZvciBiYXNlLCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKGRpcik6CiAgICAgICAgZGlycy5zb3J0KCkKICAgICAgICBmaWxlcy5zb3J0KCkKICAgICAgICB5aWVsZCBiYXNlLCBkaXJzLCBmaWxlcwoKCmRlZiB3cml0ZV9zdHViKHJlc291cmNlLCBweWZpbGUpOgogICAgX3N0dWJfdGVtcGxhdGUgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiCiAgICAgICAgZGVmIF9fYm9vdHN0cmFwX18oKToKICAgICAgICAgICAgZ2xvYmFsIF9fYm9vdHN0cmFwX18sIF9fbG9hZGVyX18sIF9fZmlsZV9fCiAgICAgICAgICAgIGltcG9ydCBzeXMsIHBrZ19yZXNvdXJjZXMsIGltcAogICAgICAgICAgICBfX2ZpbGVfXyA9IHBrZ19yZXNvdXJjZXMucmVzb3VyY2VfZmlsZW5hbWUoX19uYW1lX18sICVyKQogICAgICAgICAgICBfX2xvYWRlcl9fID0gTm9uZTsgZGVsIF9fYm9vdHN0cmFwX18sIF9fbG9hZGVyX18KICAgICAgICAgICAgaW1wLmxvYWRfZHluYW1pYyhfX25hbWVfXyxfX2ZpbGVfXykKICAgICAgICBfX2Jvb3RzdHJhcF9fKCkKICAgICAgICAiIiIpLmxzdHJpcCgpCiAgICB3aXRoIG9wZW4ocHlmaWxlLCAndycpIGFzIGY6CiAgICAgICAgZi53cml0ZShfc3R1Yl90ZW1wbGF0ZSAlIHJlc291cmNlKQoKCmNsYXNzIGJkaXN0X2VnZyhDb21tYW5kKToKICAgIGRlc2NyaXB0aW9uID0gImNyZWF0ZSBhbiBcImVnZ1wiIGRpc3RyaWJ1dGlvbiIKCiAgICB1c2VyX29wdGlvbnMgPSBbCiAgICAgICAgKCdiZGlzdC1kaXI9JywgJ2InLAogICAgICAgICAidGVtcG9yYXJ5IGRpcmVjdG9yeSBmb3IgY3JlYXRpbmcgdGhlIGRpc3RyaWJ1dGlvbiIpLAogICAgICAgICgncGxhdC1uYW1lPScsICdwJywgInBsYXRmb3JtIG5hbWUgdG8gZW1iZWQgaW4gZ2VuZXJhdGVkIGZpbGVuYW1lcyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKGRlZmF1bHQ6ICVzKSIgJSBnZXRfYnVpbGRfcGxhdGZvcm0oKSksCiAgICAgICAgKCdleGNsdWRlLXNvdXJjZS1maWxlcycsIE5vbmUsCiAgICAgICAgICJyZW1vdmUgYWxsIC5weSBmaWxlcyBmcm9tIHRoZSBnZW5lcmF0ZWQgZWdnIiksCiAgICAgICAgKCdrZWVwLXRlbXAnLCAnaycsCiAgICAgICAgICJrZWVwIHRoZSBwc2V1ZG8taW5zdGFsbGF0aW9uIHRyZWUgYXJvdW5kIGFmdGVyICIgKwogICAgICAgICAiY3JlYXRpbmcgdGhlIGRpc3RyaWJ1dGlvbiBhcmNoaXZlIiksCiAgICAgICAgKCdkaXN0LWRpcj0nLCAnZCcsCiAgICAgICAgICJkaXJlY3RvcnkgdG8gcHV0IGZpbmFsIGJ1aWx0IGRpc3RyaWJ1dGlvbnMgaW4iKSwKICAgICAgICAoJ3NraXAtYnVpbGQnLCBOb25lLAogICAgICAgICAic2tpcCByZWJ1aWxkaW5nIGV2ZXJ5dGhpbmcgKGZvciB0ZXN0aW5nL2RlYnVnZ2luZykiKSwKICAgIF0KCiAgICBib29sZWFuX29wdGlvbnMgPSBbCiAgICAgICAgJ2tlZXAtdGVtcCcsICdza2lwLWJ1aWxkJywgJ2V4Y2x1ZGUtc291cmNlLWZpbGVzJwogICAgXQoKICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgc2VsZi5iZGlzdF9kaXIgPSBOb25lCiAgICAgICAgc2VsZi5wbGF0X25hbWUgPSBOb25lCiAgICAgICAgc2VsZi5rZWVwX3RlbXAgPSAwCiAgICAgICAgc2VsZi5kaXN0X2RpciA9IE5vbmUKICAgICAgICBzZWxmLnNraXBfYnVpbGQgPSAwCiAgICAgICAgc2VsZi5lZ2dfb3V0cHV0ID0gTm9uZQogICAgICAgIHNlbGYuZXhjbHVkZV9zb3VyY2VfZmlsZXMgPSBOb25lCgogICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgZWlfY21kID0gc2VsZi5laV9jbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgiZWdnX2luZm8iKQogICAgICAgIHNlbGYuZWdnX2luZm8gPSBlaV9jbWQuZWdnX2luZm8KCiAgICAgICAgaWYgc2VsZi5iZGlzdF9kaXIgaXMgTm9uZToKICAgICAgICAgICAgYmRpc3RfYmFzZSA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdiZGlzdCcpLmJkaXN0X2Jhc2UKICAgICAgICAgICAgc2VsZi5iZGlzdF9kaXIgPSBvcy5wYXRoLmpvaW4oYmRpc3RfYmFzZSwgJ2VnZycpCgogICAgICAgIGlmIHNlbGYucGxhdF9uYW1lIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYucGxhdF9uYW1lID0gZ2V0X2J1aWxkX3BsYXRmb3JtKCkKCiAgICAgICAgc2VsZi5zZXRfdW5kZWZpbmVkX29wdGlvbnMoJ2JkaXN0JywgKCdkaXN0X2RpcicsICdkaXN0X2RpcicpKQoKICAgICAgICBpZiBzZWxmLmVnZ19vdXRwdXQgaXMgTm9uZToKCiAgICAgICAgICAgICMgQ29tcHV0ZSBmaWxlbmFtZSBvZiB0aGUgb3V0cHV0IGVnZwogICAgICAgICAgICBiYXNlbmFtZSA9IERpc3RyaWJ1dGlvbigKICAgICAgICAgICAgICAgIE5vbmUsIE5vbmUsIGVpX2NtZC5lZ2dfbmFtZSwgZWlfY21kLmVnZ192ZXJzaW9uLAogICAgICAgICAgICAgICAgZ2V0X3B5dGhvbl92ZXJzaW9uKCksCiAgICAgICAgICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfZXh0X21vZHVsZXMoKSBhbmQgc2VsZi5wbGF0X25hbWUKICAgICAgICAgICAgKS5lZ2dfbmFtZSgpCgogICAgICAgICAgICBzZWxmLmVnZ19vdXRwdXQgPSBvcy5wYXRoLmpvaW4oc2VsZi5kaXN0X2RpciwgYmFzZW5hbWUgKyAnLmVnZycpCgogICAgZGVmIGRvX2luc3RhbGxfZGF0YShzZWxmKToKICAgICAgICAjIEhhY2sgZm9yIHBhY2thZ2VzIHRoYXQgaW5zdGFsbCBkYXRhIHRvIGluc3RhbGwncyAtLWluc3RhbGwtbGliCiAgICAgICAgc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2luc3RhbGwnKS5pbnN0YWxsX2xpYiA9IHNlbGYuYmRpc3RfZGlyCgogICAgICAgIHNpdGVfcGFja2FnZXMgPSBvcy5wYXRoLm5vcm1jYXNlKG9zLnBhdGgucmVhbHBhdGgoX2dldF9wdXJlbGliKCkpKQogICAgICAgIG9sZCwgc2VsZi5kaXN0cmlidXRpb24uZGF0YV9maWxlcyA9IHNlbGYuZGlzdHJpYnV0aW9uLmRhdGFfZmlsZXMsIFtdCgogICAgICAgIGZvciBpdGVtIGluIG9sZDoKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShpdGVtLCB0dXBsZSkgYW5kIGxlbihpdGVtKSA9PSAyOgogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2FicyhpdGVtWzBdKToKICAgICAgICAgICAgICAgICAgICByZWFscGF0aCA9IG9zLnBhdGgucmVhbHBhdGgoaXRlbVswXSkKICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkID0gb3MucGF0aC5ub3JtY2FzZShyZWFscGF0aCkKICAgICAgICAgICAgICAgICAgICBpZiBub3JtYWxpemVkID09IHNpdGVfcGFja2FnZXMgb3Igbm9ybWFsaXplZC5zdGFydHN3aXRoKAogICAgICAgICAgICAgICAgICAgICAgICBzaXRlX3BhY2thZ2VzICsgb3Muc2VwCiAgICAgICAgICAgICAgICAgICAgKToKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSA9IHJlYWxwYXRoW2xlbihzaXRlX3BhY2thZ2VzKSArIDE6XSwgaXRlbVsxXQogICAgICAgICAgICAgICAgICAgICAgICAjIFhYWCBlbHNlOiByYWlzZSA/Pz8KICAgICAgICAgICAgc2VsZi5kaXN0cmlidXRpb24uZGF0YV9maWxlcy5hcHBlbmQoaXRlbSkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBsb2cuaW5mbygiaW5zdGFsbGluZyBwYWNrYWdlIGRhdGEgdG8gJXMiLCBzZWxmLmJkaXN0X2RpcikKICAgICAgICAgICAgc2VsZi5jYWxsX2NvbW1hbmQoJ2luc3RhbGxfZGF0YScsIGZvcmNlPTAsIHJvb3Q9Tm9uZSkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbi5kYXRhX2ZpbGVzID0gb2xkCgogICAgZGVmIGdldF9vdXRwdXRzKHNlbGYpOgogICAgICAgIHJldHVybiBbc2VsZi5lZ2dfb3V0cHV0XQoKICAgIGRlZiBjYWxsX2NvbW1hbmQoc2VsZiwgY21kbmFtZSwgKiprdyk6CiAgICAgICAgIiIiSW52b2tlIHJlaW5pdGlhbGl6ZWQgY29tbWFuZCBgY21kbmFtZWAgd2l0aCBrZXl3b3JkIGFyZ3MiIiIKICAgICAgICBmb3IgZGlybmFtZSBpbiBJTlNUQUxMX0RJUkVDVE9SWV9BVFRSUzoKICAgICAgICAgICAga3cuc2V0ZGVmYXVsdChkaXJuYW1lLCBzZWxmLmJkaXN0X2RpcikKICAgICAgICBrdy5zZXRkZWZhdWx0KCdza2lwX2J1aWxkJywgc2VsZi5za2lwX2J1aWxkKQogICAgICAgIGt3LnNldGRlZmF1bHQoJ2RyeV9ydW4nLCBzZWxmLmRyeV9ydW4pCiAgICAgICAgY21kID0gc2VsZi5yZWluaXRpYWxpemVfY29tbWFuZChjbWRuYW1lLCAqKmt3KQogICAgICAgIHNlbGYucnVuX2NvbW1hbmQoY21kbmFtZSkKICAgICAgICByZXR1cm4gY21kCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICAjIEdlbmVyYXRlIG1ldGFkYXRhIGZpcnN0CiAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgiZWdnX2luZm8iKQogICAgICAgICMgV2UgcnVuIGluc3RhbGxfbGliIGJlZm9yZSBpbnN0YWxsX2RhdGEsIGJlY2F1c2Ugc29tZSBkYXRhIGhhY2tzCiAgICAgICAgIyBwdWxsIHRoZWlyIGRhdGEgcGF0aCBmcm9tIHRoZSBpbnN0YWxsX2xpYiBjb21tYW5kLgogICAgICAgIGxvZy5pbmZvKCJpbnN0YWxsaW5nIGxpYnJhcnkgY29kZSB0byAlcyIsIHNlbGYuYmRpc3RfZGlyKQogICAgICAgIGluc3RjbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnaW5zdGFsbCcpCiAgICAgICAgb2xkX3Jvb3QgPSBpbnN0Y21kLnJvb3QKICAgICAgICBpbnN0Y21kLnJvb3QgPSBOb25lCiAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24uaGFzX2NfbGlicmFyaWVzKCkgYW5kIG5vdCBzZWxmLnNraXBfYnVpbGQ6CiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2J1aWxkX2NsaWInKQogICAgICAgIGNtZCA9IHNlbGYuY2FsbF9jb21tYW5kKCdpbnN0YWxsX2xpYicsIHdhcm5fZGlyPTApCiAgICAgICAgaW5zdGNtZC5yb290ID0gb2xkX3Jvb3QKCiAgICAgICAgYWxsX291dHB1dHMsIGV4dF9vdXRwdXRzID0gc2VsZi5nZXRfZXh0X291dHB1dHMoKQogICAgICAgIHNlbGYuc3R1YnMgPSBbXQogICAgICAgIHRvX2NvbXBpbGUgPSBbXQogICAgICAgIGZvciAocCwgZXh0X25hbWUpIGluIGVudW1lcmF0ZShleHRfb3V0cHV0cyk6CiAgICAgICAgICAgIGZpbGVuYW1lLCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KGV4dF9uYW1lKQogICAgICAgICAgICBweWZpbGUgPSBvcy5wYXRoLmpvaW4oc2VsZi5iZGlzdF9kaXIsIHN0cmlwX21vZHVsZShmaWxlbmFtZSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy5weScpCiAgICAgICAgICAgIHNlbGYuc3R1YnMuYXBwZW5kKHB5ZmlsZSkKICAgICAgICAgICAgbG9nLmluZm8oImNyZWF0aW5nIHN0dWIgbG9hZGVyIGZvciAlcyIsIGV4dF9uYW1lKQogICAgICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICAgICAgd3JpdGVfc3R1Yihvcy5wYXRoLmJhc2VuYW1lKGV4dF9uYW1lKSwgcHlmaWxlKQogICAgICAgICAgICB0b19jb21waWxlLmFwcGVuZChweWZpbGUpCiAgICAgICAgICAgIGV4dF9vdXRwdXRzW3BdID0gZXh0X25hbWUucmVwbGFjZShvcy5zZXAsICcvJykKCiAgICAgICAgaWYgdG9fY29tcGlsZToKICAgICAgICAgICAgY21kLmJ5dGVfY29tcGlsZSh0b19jb21waWxlKQogICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLmRhdGFfZmlsZXM6CiAgICAgICAgICAgIHNlbGYuZG9faW5zdGFsbF9kYXRhKCkKCiAgICAgICAgIyBNYWtlIHRoZSBFR0ctSU5GTyBkaXJlY3RvcnkKICAgICAgICBhcmNoaXZlX3Jvb3QgPSBzZWxmLmJkaXN0X2RpcgogICAgICAgIGVnZ19pbmZvID0gb3MucGF0aC5qb2luKGFyY2hpdmVfcm9vdCwgJ0VHRy1JTkZPJykKICAgICAgICBzZWxmLm1rcGF0aChlZ2dfaW5mbykKICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5zY3JpcHRzOgogICAgICAgICAgICBzY3JpcHRfZGlyID0gb3MucGF0aC5qb2luKGVnZ19pbmZvLCAnc2NyaXB0cycpCiAgICAgICAgICAgIGxvZy5pbmZvKCJpbnN0YWxsaW5nIHNjcmlwdHMgdG8gJXMiLCBzY3JpcHRfZGlyKQogICAgICAgICAgICBzZWxmLmNhbGxfY29tbWFuZCgnaW5zdGFsbF9zY3JpcHRzJywgaW5zdGFsbF9kaXI9c2NyaXB0X2RpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9fZXA9MSkKCiAgICAgICAgc2VsZi5jb3B5X21ldGFkYXRhX3RvKGVnZ19pbmZvKQogICAgICAgIG5hdGl2ZV9saWJzID0gb3MucGF0aC5qb2luKGVnZ19pbmZvLCAibmF0aXZlX2xpYnMudHh0IikKICAgICAgICBpZiBhbGxfb3V0cHV0czoKICAgICAgICAgICAgbG9nLmluZm8oIndyaXRpbmcgJXMiLCBuYXRpdmVfbGlicykKICAgICAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgICAgIGVuc3VyZV9kaXJlY3RvcnkobmF0aXZlX2xpYnMpCiAgICAgICAgICAgICAgICBsaWJzX2ZpbGUgPSBvcGVuKG5hdGl2ZV9saWJzLCAnd3QnKQogICAgICAgICAgICAgICAgbGlic19maWxlLndyaXRlKCdcbicuam9pbihhbGxfb3V0cHV0cykpCiAgICAgICAgICAgICAgICBsaWJzX2ZpbGUud3JpdGUoJ1xuJykKICAgICAgICAgICAgICAgIGxpYnNfZmlsZS5jbG9zZSgpCiAgICAgICAgZWxpZiBvcy5wYXRoLmlzZmlsZShuYXRpdmVfbGlicyk6CiAgICAgICAgICAgIGxvZy5pbmZvKCJyZW1vdmluZyAlcyIsIG5hdGl2ZV9saWJzKQogICAgICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICAgICAgb3MudW5saW5rKG5hdGl2ZV9saWJzKQoKICAgICAgICB3cml0ZV9zYWZldHlfZmxhZygKICAgICAgICAgICAgb3MucGF0aC5qb2luKGFyY2hpdmVfcm9vdCwgJ0VHRy1JTkZPJyksIHNlbGYuemlwX3NhZmUoKQogICAgICAgICkKCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKHNlbGYuZWdnX2luZm8sICdkZXBlbmRzLnR4dCcpKToKICAgICAgICAgICAgbG9nLndhcm4oCiAgICAgICAgICAgICAgICAiV0FSTklORzogJ2RlcGVuZHMudHh0JyB3aWxsIG5vdCBiZSB1c2VkIGJ5IHNldHVwdG9vbHMgMC42IVxuIgogICAgICAgICAgICAgICAgIlVzZSB0aGUgaW5zdGFsbF9yZXF1aXJlcy9leHRyYXNfcmVxdWlyZSBzZXR1cCgpIGFyZ3MgaW5zdGVhZC4iCiAgICAgICAgICAgICkKCiAgICAgICAgaWYgc2VsZi5leGNsdWRlX3NvdXJjZV9maWxlczoKICAgICAgICAgICAgc2VsZi56YXBfcHlmaWxlcygpCgogICAgICAgICMgTWFrZSB0aGUgYXJjaGl2ZQogICAgICAgIG1ha2VfemlwZmlsZShzZWxmLmVnZ19vdXRwdXQsIGFyY2hpdmVfcm9vdCwgdmVyYm9zZT1zZWxmLnZlcmJvc2UsCiAgICAgICAgICAgICAgICAgICAgIGRyeV9ydW49c2VsZi5kcnlfcnVuLCBtb2RlPXNlbGYuZ2VuX2hlYWRlcigpKQogICAgICAgIGlmIG5vdCBzZWxmLmtlZXBfdGVtcDoKICAgICAgICAgICAgcmVtb3ZlX3RyZWUoc2VsZi5iZGlzdF9kaXIsIGRyeV9ydW49c2VsZi5kcnlfcnVuKQoKICAgICAgICAjIEFkZCB0byAnRGlzdHJpYnV0aW9uLmRpc3RfZmlsZXMnIHNvIHRoYXQgdGhlICJ1cGxvYWQiIGNvbW1hbmQgd29ya3MKICAgICAgICBnZXRhdHRyKHNlbGYuZGlzdHJpYnV0aW9uLCAnZGlzdF9maWxlcycsIFtdKS5hcHBlbmQoCiAgICAgICAgICAgICgnYmRpc3RfZWdnJywgZ2V0X3B5dGhvbl92ZXJzaW9uKCksIHNlbGYuZWdnX291dHB1dCkpCgogICAgZGVmIHphcF9weWZpbGVzKHNlbGYpOgogICAgICAgIGxvZy5pbmZvKCJSZW1vdmluZyAucHkgZmlsZXMgZnJvbSB0ZW1wb3JhcnkgZGlyZWN0b3J5IikKICAgICAgICBmb3IgYmFzZSwgZGlycywgZmlsZXMgaW4gd2Fsa19lZ2coc2VsZi5iZGlzdF9kaXIpOgogICAgICAgICAgICBmb3IgbmFtZSBpbiBmaWxlczoKICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oYmFzZSwgbmFtZSkKCiAgICAgICAgICAgICAgICBpZiBuYW1lLmVuZHN3aXRoKCcucHknKToKICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkRlbGV0aW5nICVzIiwgcGF0aCkKICAgICAgICAgICAgICAgICAgICBvcy51bmxpbmsocGF0aCkKCiAgICAgICAgICAgICAgICBpZiBiYXNlLmVuZHN3aXRoKCdfX3B5Y2FjaGVfXycpOgogICAgICAgICAgICAgICAgICAgIHBhdGhfb2xkID0gcGF0aAoKICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gcicoP1A8bmFtZT4uKylcLig/UDxtYWdpYz5bXi5dKylcLnB5YycKICAgICAgICAgICAgICAgICAgICBtID0gcmUubWF0Y2gocGF0dGVybiwgbmFtZSkKICAgICAgICAgICAgICAgICAgICBwYXRoX25ldyA9IG9zLnBhdGguam9pbigKICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSwgb3MucGFyZGlyLCBtLmdyb3VwKCduYW1lJykgKyAnLnB5YycpCiAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oCiAgICAgICAgICAgICAgICAgICAgICAgICJSZW5hbWluZyBmaWxlIGZyb20gWyVzXSB0byBbJXNdIgogICAgICAgICAgICAgICAgICAgICAgICAlIChwYXRoX29sZCwgcGF0aF9uZXcpKQogICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgb3MucmVtb3ZlKHBhdGhfbmV3KQogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgogICAgICAgICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgICAgICAgICAgb3MucmVuYW1lKHBhdGhfb2xkLCBwYXRoX25ldykKCiAgICBkZWYgemlwX3NhZmUoc2VsZik6CiAgICAgICAgc2FmZSA9IGdldGF0dHIoc2VsZi5kaXN0cmlidXRpb24sICd6aXBfc2FmZScsIE5vbmUpCiAgICAgICAgaWYgc2FmZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIHNhZmUKICAgICAgICBsb2cud2FybigiemlwX3NhZmUgZmxhZyBub3Qgc2V0OyBhbmFseXppbmcgYXJjaGl2ZSBjb250ZW50cy4uLiIpCiAgICAgICAgcmV0dXJuIGFuYWx5emVfZWdnKHNlbGYuYmRpc3RfZGlyLCBzZWxmLnN0dWJzKQoKICAgIGRlZiBnZW5faGVhZGVyKHNlbGYpOgogICAgICAgIGVwbSA9IEVudHJ5UG9pbnQucGFyc2VfbWFwKHNlbGYuZGlzdHJpYnV0aW9uLmVudHJ5X3BvaW50cyBvciAnJykKICAgICAgICBlcCA9IGVwbS5nZXQoJ3NldHVwdG9vbHMuaW5zdGFsbGF0aW9uJywge30pLmdldCgnZWdnc2VjdXRhYmxlJykKICAgICAgICBpZiBlcCBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4gJ3cnICAjIG5vdCBhbiBlZ2dzZWN1dGFibGUsIGRvIGl0IHRoZSB1c3VhbCB3YXkuCgogICAgICAgIGlmIG5vdCBlcC5hdHRycyBvciBlcC5leHRyYXM6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCiAgICAgICAgICAgICAgICAiZWdnc2VjdXRhYmxlIGVudHJ5IHBvaW50ICglcikgY2Fubm90IGhhdmUgJ2V4dHJhcycgIgogICAgICAgICAgICAgICAgIm9yIHJlZmVyIHRvIGEgbW9kdWxlIiAlIChlcCwpCiAgICAgICAgICAgICkKCiAgICAgICAgcHl2ZXIgPSAne30ue30nLmZvcm1hdCgqc3lzLnZlcnNpb25faW5mbykKICAgICAgICBwa2cgPSBlcC5tb2R1bGVfbmFtZQogICAgICAgIGZ1bGwgPSAnLicuam9pbihlcC5hdHRycykKICAgICAgICBiYXNlID0gZXAuYXR0cnNbMF0KICAgICAgICBiYXNlbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUoc2VsZi5lZ2dfb3V0cHV0KQoKICAgICAgICBoZWFkZXIgPSAoCiAgICAgICAgICAgICIjIS9iaW4vc2hcbiIKICAgICAgICAgICAgJ2lmIFsgYGJhc2VuYW1lICQwYCA9ICIlKGJhc2VuYW1lKXMiIF1cbicKICAgICAgICAgICAgJ3RoZW4gZXhlYyBweXRob24lKHB5dmVyKXMgLWMgIicKICAgICAgICAgICAgImltcG9ydCBzeXMsIG9zOyBzeXMucGF0aC5pbnNlcnQoMCwgb3MucGF0aC5hYnNwYXRoKCckMCcpKTsgIgogICAgICAgICAgICAiZnJvbSAlKHBrZylzIGltcG9ydCAlKGJhc2Upczsgc3lzLmV4aXQoJShmdWxsKXMoKSkiCiAgICAgICAgICAgICciICIkQCJcbicKICAgICAgICAgICAgJ2Vsc2VcbicKICAgICAgICAgICAgJyAgZWNobyAkMCBpcyBub3QgdGhlIGNvcnJlY3QgbmFtZSBmb3IgdGhpcyBlZ2cgZmlsZS5cbicKICAgICAgICAgICAgJyAgZWNobyBQbGVhc2UgcmVuYW1lIGl0IGJhY2sgdG8gJShiYXNlbmFtZSlzIGFuZCB0cnkgYWdhaW4uXG4nCiAgICAgICAgICAgICcgIGV4ZWMgZmFsc2VcbicKICAgICAgICAgICAgJ2ZpXG4nCiAgICAgICAgKSAlIGxvY2FscygpCgogICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgIG1rcGF0aChvcy5wYXRoLmRpcm5hbWUoc2VsZi5lZ2dfb3V0cHV0KSwgZHJ5X3J1bj1zZWxmLmRyeV9ydW4pCiAgICAgICAgICAgIGYgPSBvcGVuKHNlbGYuZWdnX291dHB1dCwgJ3cnKQogICAgICAgICAgICBmLndyaXRlKGhlYWRlcikKICAgICAgICAgICAgZi5jbG9zZSgpCiAgICAgICAgcmV0dXJuICdhJwoKICAgIGRlZiBjb3B5X21ldGFkYXRhX3RvKHNlbGYsIHRhcmdldF9kaXIpOgogICAgICAgICJDb3B5IG1ldGFkYXRhIChlZ2cgaW5mbykgdG8gdGhlIHRhcmdldF9kaXIiCiAgICAgICAgIyBub3JtYWxpemUgdGhlIHBhdGggKHNvIHRoYXQgYSBmb3J3YXJkLXNsYXNoIGluIGVnZ19pbmZvIHdpbGwKICAgICAgICAjIG1hdGNoIHVzaW5nIHN0YXJ0c3dpdGggYmVsb3cpCiAgICAgICAgbm9ybV9lZ2dfaW5mbyA9IG9zLnBhdGgubm9ybXBhdGgoc2VsZi5lZ2dfaW5mbykKICAgICAgICBwcmVmaXggPSBvcy5wYXRoLmpvaW4obm9ybV9lZ2dfaW5mbywgJycpCiAgICAgICAgZm9yIHBhdGggaW4gc2VsZi5laV9jbWQuZmlsZWxpc3QuZmlsZXM6CiAgICAgICAgICAgIGlmIHBhdGguc3RhcnRzd2l0aChwcmVmaXgpOgogICAgICAgICAgICAgICAgdGFyZ2V0ID0gb3MucGF0aC5qb2luKHRhcmdldF9kaXIsIHBhdGhbbGVuKHByZWZpeCk6XSkKICAgICAgICAgICAgICAgIGVuc3VyZV9kaXJlY3RvcnkodGFyZ2V0KQogICAgICAgICAgICAgICAgc2VsZi5jb3B5X2ZpbGUocGF0aCwgdGFyZ2V0KQoKICAgIGRlZiBnZXRfZXh0X291dHB1dHMoc2VsZik6CiAgICAgICAgIiIiR2V0IGEgbGlzdCBvZiByZWxhdGl2ZSBwYXRocyB0byBDIGV4dGVuc2lvbnMgaW4gdGhlIG91dHB1dCBkaXN0cm8iIiIKCiAgICAgICAgYWxsX291dHB1dHMgPSBbXQogICAgICAgIGV4dF9vdXRwdXRzID0gW10KCiAgICAgICAgcGF0aHMgPSB7c2VsZi5iZGlzdF9kaXI6ICcnfQogICAgICAgIGZvciBiYXNlLCBkaXJzLCBmaWxlcyBpbiBzb3J0ZWRfd2FsayhzZWxmLmJkaXN0X2Rpcik6CiAgICAgICAgICAgIGZvciBmaWxlbmFtZSBpbiBmaWxlczoKICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguc3BsaXRleHQoZmlsZW5hbWUpWzFdLmxvd2VyKCkgaW4gTkFUSVZFX0VYVEVOU0lPTlM6CiAgICAgICAgICAgICAgICAgICAgYWxsX291dHB1dHMuYXBwZW5kKHBhdGhzW2Jhc2VdICsgZmlsZW5hbWUpCiAgICAgICAgICAgIGZvciBmaWxlbmFtZSBpbiBkaXJzOgogICAgICAgICAgICAgICAgcGF0aHNbb3MucGF0aC5qb2luKGJhc2UsIGZpbGVuYW1lKV0gPSAocGF0aHNbYmFzZV0gKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUgKyAnLycpCgogICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLmhhc19leHRfbW9kdWxlcygpOgogICAgICAgICAgICBidWlsZF9jbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGRfZXh0JykKICAgICAgICAgICAgZm9yIGV4dCBpbiBidWlsZF9jbWQuZXh0ZW5zaW9uczoKICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXh0LCBMaWJyYXJ5KToKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgZnVsbG5hbWUgPSBidWlsZF9jbWQuZ2V0X2V4dF9mdWxsbmFtZShleHQubmFtZSkKICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gYnVpbGRfY21kLmdldF9leHRfZmlsZW5hbWUoZnVsbG5hbWUpCiAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5iYXNlbmFtZShmaWxlbmFtZSkuc3RhcnRzd2l0aCgnZGwtJyk6CiAgICAgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKHNlbGYuYmRpc3RfZGlyLCBmaWxlbmFtZSkpOgogICAgICAgICAgICAgICAgICAgICAgICBleHRfb3V0cHV0cy5hcHBlbmQoZmlsZW5hbWUpCgogICAgICAgIHJldHVybiBhbGxfb3V0cHV0cywgZXh0X291dHB1dHMKCgpOQVRJVkVfRVhURU5TSU9OUyA9IGRpY3QuZnJvbWtleXMoJy5kbGwgLnNvIC5keWxpYiAucHlkJy5zcGxpdCgpKQoKCmRlZiB3YWxrX2VnZyhlZ2dfZGlyKToKICAgICIiIldhbGsgYW4gdW5wYWNrZWQgZWdnJ3MgY29udGVudHMsIHNraXBwaW5nIHRoZSBtZXRhZGF0YSBkaXJlY3RvcnkiIiIKICAgIHdhbGtlciA9IHNvcnRlZF93YWxrKGVnZ19kaXIpCiAgICBiYXNlLCBkaXJzLCBmaWxlcyA9IG5leHQod2Fsa2VyKQogICAgaWYgJ0VHRy1JTkZPJyBpbiBkaXJzOgogICAgICAgIGRpcnMucmVtb3ZlKCdFR0ctSU5GTycpCiAgICB5aWVsZCBiYXNlLCBkaXJzLCBmaWxlcwogICAgZm9yIGJkZiBpbiB3YWxrZXI6CiAgICAgICAgeWllbGQgYmRmCgoKZGVmIGFuYWx5emVfZWdnKGVnZ19kaXIsIHN0dWJzKToKICAgICMgY2hlY2sgZm9yIGV4aXN0aW5nIGZsYWcgaW4gRUdHLUlORk8KICAgIGZvciBmbGFnLCBmbiBpbiBzYWZldHlfZmxhZ3MuaXRlbXMoKToKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4oZWdnX2RpciwgJ0VHRy1JTkZPJywgZm4pKToKICAgICAgICAgICAgcmV0dXJuIGZsYWcKICAgIGlmIG5vdCBjYW5fc2NhbigpOgogICAgICAgIHJldHVybiBGYWxzZQogICAgc2FmZSA9IFRydWUKICAgIGZvciBiYXNlLCBkaXJzLCBmaWxlcyBpbiB3YWxrX2VnZyhlZ2dfZGlyKToKICAgICAgICBmb3IgbmFtZSBpbiBmaWxlczoKICAgICAgICAgICAgaWYgbmFtZS5lbmRzd2l0aCgnLnB5Jykgb3IgbmFtZS5lbmRzd2l0aCgnLnB5dycpOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgZWxpZiBuYW1lLmVuZHN3aXRoKCcucHljJykgb3IgbmFtZS5lbmRzd2l0aCgnLnB5bycpOgogICAgICAgICAgICAgICAgIyBhbHdheXMgc2NhbiwgZXZlbiBpZiB3ZSBhbHJlYWR5IGtub3cgd2UncmUgbm90IHNhZmUKICAgICAgICAgICAgICAgIHNhZmUgPSBzY2FuX21vZHVsZShlZ2dfZGlyLCBiYXNlLCBuYW1lLCBzdHVicykgYW5kIHNhZmUKICAgIHJldHVybiBzYWZlCgoKZGVmIHdyaXRlX3NhZmV0eV9mbGFnKGVnZ19kaXIsIHNhZmUpOgogICAgIyBXcml0ZSBvciByZW1vdmUgemlwIHNhZmV0eSBmbGFnIGZpbGUocykKICAgIGZvciBmbGFnLCBmbiBpbiBzYWZldHlfZmxhZ3MuaXRlbXMoKToKICAgICAgICBmbiA9IG9zLnBhdGguam9pbihlZ2dfZGlyLCBmbikKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhmbik6CiAgICAgICAgICAgIGlmIHNhZmUgaXMgTm9uZSBvciBib29sKHNhZmUpICE9IGZsYWc6CiAgICAgICAgICAgICAgICBvcy51bmxpbmsoZm4pCiAgICAgICAgZWxpZiBzYWZlIGlzIG5vdCBOb25lIGFuZCBib29sKHNhZmUpID09IGZsYWc6CiAgICAgICAgICAgIGYgPSBvcGVuKGZuLCAnd3QnKQogICAgICAgICAgICBmLndyaXRlKCdcbicpCiAgICAgICAgICAgIGYuY2xvc2UoKQoKCnNhZmV0eV9mbGFncyA9IHsKICAgIFRydWU6ICd6aXAtc2FmZScsCiAgICBGYWxzZTogJ25vdC16aXAtc2FmZScsCn0KCgpkZWYgc2Nhbl9tb2R1bGUoZWdnX2RpciwgYmFzZSwgbmFtZSwgc3R1YnMpOgogICAgIiIiQ2hlY2sgd2hldGhlciBtb2R1bGUgcG9zc2libHkgdXNlcyB1bnNhZmUtZm9yLXppcGZpbGUgc3R1ZmYiIiIKCiAgICBmaWxlbmFtZSA9IG9zLnBhdGguam9pbihiYXNlLCBuYW1lKQogICAgaWYgZmlsZW5hbWVbOi0xXSBpbiBzdHViczoKICAgICAgICByZXR1cm4gVHJ1ZSAgIyBFeHRlbnNpb24gbW9kdWxlCiAgICBwa2cgPSBiYXNlW2xlbihlZ2dfZGlyKSArIDE6XS5yZXBsYWNlKG9zLnNlcCwgJy4nKQogICAgbW9kdWxlID0gcGtnICsgKHBrZyBhbmQgJy4nIG9yICcnKSArIG9zLnBhdGguc3BsaXRleHQobmFtZSlbMF0KICAgIGlmIHNpeC5QWTI6CiAgICAgICAgc2tpcCA9IDggICMgc2tpcCBtYWdpYyAmIGRhdGUKICAgIGVsaWYgc3lzLnZlcnNpb25faW5mbyA8ICgzLCA3KToKICAgICAgICBza2lwID0gMTIgICMgc2tpcCBtYWdpYyAmIGRhdGUgJiBmaWxlIHNpemUKICAgIGVsc2U6CiAgICAgICAgc2tpcCA9IDE2ICAjIHNraXAgbWFnaWMgJiByZXNlcnZlZD8gJiBkYXRlICYgZmlsZSBzaXplCiAgICBmID0gb3BlbihmaWxlbmFtZSwgJ3JiJykKICAgIGYucmVhZChza2lwKQogICAgY29kZSA9IG1hcnNoYWwubG9hZChmKQogICAgZi5jbG9zZSgpCiAgICBzYWZlID0gVHJ1ZQogICAgc3ltYm9scyA9IGRpY3QuZnJvbWtleXMoaXRlcl9zeW1ib2xzKGNvZGUpKQogICAgZm9yIGJhZCBpbiBbJ19fZmlsZV9fJywgJ19fcGF0aF9fJ106CiAgICAgICAgaWYgYmFkIGluIHN5bWJvbHM6CiAgICAgICAgICAgIGxvZy53YXJuKCIlczogbW9kdWxlIHJlZmVyZW5jZXMgJXMiLCBtb2R1bGUsIGJhZCkKICAgICAgICAgICAgc2FmZSA9IEZhbHNlCiAgICBpZiAnaW5zcGVjdCcgaW4gc3ltYm9sczoKICAgICAgICBmb3IgYmFkIGluIFsKICAgICAgICAgICAgJ2dldHNvdXJjZScsICdnZXRhYnNmaWxlJywgJ2dldHNvdXJjZWZpbGUnLCAnZ2V0ZmlsZScKICAgICAgICAgICAgJ2dldHNvdXJjZWxpbmVzJywgJ2ZpbmRzb3VyY2UnLCAnZ2V0Y29tbWVudHMnLCAnZ2V0ZnJhbWVpbmZvJywKICAgICAgICAgICAgJ2dldGlubmVyZnJhbWVzJywgJ2dldG91dGVyZnJhbWVzJywgJ3N0YWNrJywgJ3RyYWNlJwogICAgICAgIF06CiAgICAgICAgICAgIGlmIGJhZCBpbiBzeW1ib2xzOgogICAgICAgICAgICAgICAgbG9nLndhcm4oIiVzOiBtb2R1bGUgTUFZIGJlIHVzaW5nIGluc3BlY3QuJXMiLCBtb2R1bGUsIGJhZCkKICAgICAgICAgICAgICAgIHNhZmUgPSBGYWxzZQogICAgcmV0dXJuIHNhZmUKCgpkZWYgaXRlcl9zeW1ib2xzKGNvZGUpOgogICAgIiIiWWllbGQgbmFtZXMgYW5kIHN0cmluZ3MgdXNlZCBieSBgY29kZWAgYW5kIGl0cyBuZXN0ZWQgY29kZSBvYmplY3RzIiIiCiAgICBmb3IgbmFtZSBpbiBjb2RlLmNvX25hbWVzOgogICAgICAgIHlpZWxkIG5hbWUKICAgIGZvciBjb25zdCBpbiBjb2RlLmNvX2NvbnN0czoKICAgICAgICBpZiBpc2luc3RhbmNlKGNvbnN0LCBzaXguc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgeWllbGQgY29uc3QKICAgICAgICBlbGlmIGlzaW5zdGFuY2UoY29uc3QsIENvZGVUeXBlKToKICAgICAgICAgICAgZm9yIG5hbWUgaW4gaXRlcl9zeW1ib2xzKGNvbnN0KToKICAgICAgICAgICAgICAgIHlpZWxkIG5hbWUKCgpkZWYgY2FuX3NjYW4oKToKICAgIGlmIG5vdCBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnamF2YScpIGFuZCBzeXMucGxhdGZvcm0gIT0gJ2NsaSc6CiAgICAgICAgIyBDUHl0aG9uLCBQeVB5LCBldGMuCiAgICAgICAgcmV0dXJuIFRydWUKICAgIGxvZy53YXJuKCJVbmFibGUgdG8gYW5hbHl6ZSBjb21waWxlZCBjb2RlIG9uIHRoaXMgcGxhdGZvcm0uIikKICAgIGxvZy53YXJuKCJQbGVhc2UgYXNrIHRoZSBhdXRob3IgdG8gaW5jbHVkZSBhICd6aXBfc2FmZSciCiAgICAgICAgICAgICAiIHNldHRpbmcgKGVpdGhlciBUcnVlIG9yIEZhbHNlKSBpbiB0aGUgcGFja2FnZSdzIHNldHVwLnB5IikKCgojIEF0dHJpYnV0ZSBuYW1lcyBvZiBvcHRpb25zIGZvciBjb21tYW5kcyB0aGF0IG1pZ2h0IG5lZWQgdG8gYmUgY29udmluY2VkIHRvCiMgaW5zdGFsbCB0byB0aGUgZWdnIGJ1aWxkIGRpcmVjdG9yeQoKSU5TVEFMTF9ESVJFQ1RPUllfQVRUUlMgPSBbCiAgICAnaW5zdGFsbF9saWInLCAnaW5zdGFsbF9kaXInLCAnaW5zdGFsbF9kYXRhJywgJ2luc3RhbGxfYmFzZScKXQoKCmRlZiBtYWtlX3ppcGZpbGUoemlwX2ZpbGVuYW1lLCBiYXNlX2RpciwgdmVyYm9zZT0wLCBkcnlfcnVuPTAsIGNvbXByZXNzPVRydWUsCiAgICAgICAgICAgICAgICAgbW9kZT0ndycpOgogICAgIiIiQ3JlYXRlIGEgemlwIGZpbGUgZnJvbSBhbGwgdGhlIGZpbGVzIHVuZGVyICdiYXNlX2RpcicuICBUaGUgb3V0cHV0CiAgICB6aXAgZmlsZSB3aWxsIGJlIG5hbWVkICdiYXNlX2RpcicgKyAiLnppcCIuICBVc2VzIGVpdGhlciB0aGUgInppcGZpbGUiCiAgICBQeXRob24gbW9kdWxlIChpZiBhdmFpbGFibGUpIG9yIHRoZSBJbmZvWklQICJ6aXAiIHV0aWxpdHkgKGlmIGluc3RhbGxlZAogICAgYW5kIGZvdW5kIG9uIHRoZSBkZWZhdWx0IHNlYXJjaCBwYXRoKS4gIElmIG5laXRoZXIgdG9vbCBpcyBhdmFpbGFibGUsCiAgICByYWlzZXMgRGlzdHV0aWxzRXhlY0Vycm9yLiAgUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgb3V0cHV0IHppcCBmaWxlLgogICAgIiIiCiAgICBpbXBvcnQgemlwZmlsZQoKICAgIG1rcGF0aChvcy5wYXRoLmRpcm5hbWUoemlwX2ZpbGVuYW1lKSwgZHJ5X3J1bj1kcnlfcnVuKQogICAgbG9nLmluZm8oImNyZWF0aW5nICclcycgYW5kIGFkZGluZyAnJXMnIHRvIGl0IiwgemlwX2ZpbGVuYW1lLCBiYXNlX2RpcikKCiAgICBkZWYgdmlzaXQoeiwgZGlybmFtZSwgbmFtZXMpOgogICAgICAgIGZvciBuYW1lIGluIG5hbWVzOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLmpvaW4oZGlybmFtZSwgbmFtZSkpCiAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKHBhdGgpOgogICAgICAgICAgICAgICAgcCA9IHBhdGhbbGVuKGJhc2VfZGlyKSArIDE6XQogICAgICAgICAgICAgICAgaWYgbm90IGRyeV9ydW46CiAgICAgICAgICAgICAgICAgICAgei53cml0ZShwYXRoLCBwKQogICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJhZGRpbmcgJyVzJyIsIHApCgogICAgY29tcHJlc3Npb24gPSB6aXBmaWxlLlpJUF9ERUZMQVRFRCBpZiBjb21wcmVzcyBlbHNlIHppcGZpbGUuWklQX1NUT1JFRAogICAgaWYgbm90IGRyeV9ydW46CiAgICAgICAgeiA9IHppcGZpbGUuWmlwRmlsZSh6aXBfZmlsZW5hbWUsIG1vZGUsIGNvbXByZXNzaW9uPWNvbXByZXNzaW9uKQogICAgICAgIGZvciBkaXJuYW1lLCBkaXJzLCBmaWxlcyBpbiBzb3J0ZWRfd2FsayhiYXNlX2Rpcik6CiAgICAgICAgICAgIHZpc2l0KHosIGRpcm5hbWUsIGZpbGVzKQogICAgICAgIHouY2xvc2UoKQogICAgZWxzZToKICAgICAgICBmb3IgZGlybmFtZSwgZGlycywgZmlsZXMgaW4gc29ydGVkX3dhbGsoYmFzZV9kaXIpOgogICAgICAgICAgICB2aXNpdChOb25lLCBkaXJuYW1lLCBmaWxlcykKICAgIHJldHVybiB6aXBfZmlsZW5hbWUKUEsDBBQAAAAAAAAAIQDr0nQW5AUAAOQFAABEAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvY29tbWFuZC9iZGlzdF9ycG0ucHlpbXBvcnQgZGlzdHV0aWxzLmNvbW1hbmQuYmRpc3RfcnBtIGFzIG9yaWcKCgpjbGFzcyBiZGlzdF9ycG0ob3JpZy5iZGlzdF9ycG0pOgogICAgIiIiCiAgICBPdmVycmlkZSB0aGUgZGVmYXVsdCBiZGlzdF9ycG0gYmVoYXZpb3IgdG8gZG8gdGhlIGZvbGxvd2luZzoKCiAgICAxLiBSdW4gZWdnX2luZm8gdG8gZW5zdXJlIHRoZSBuYW1lIGFuZCB2ZXJzaW9uIGFyZSBwcm9wZXJseSBjYWxjdWxhdGVkLgogICAgMi4gQWx3YXlzIHJ1biAnaW5zdGFsbCcgdXNpbmcgLS1zaW5nbGUtdmVyc2lvbi1leHRlcm5hbGx5LW1hbmFnZWQgdG8KICAgICAgIGRpc2FibGUgZWdncyBpbiBSUE0gZGlzdHJpYnV0aW9ucy4KICAgIDMuIFJlcGxhY2UgZGFzaCB3aXRoIHVuZGVyc2NvcmUgaW4gdGhlIHZlcnNpb24gbnVtYmVycyBmb3IgYmV0dGVyIFJQTQogICAgICAgY29tcGF0aWJpbGl0eS4KICAgICIiIgoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgIyBlbnN1cmUgZGlzdHJvIG5hbWUgaXMgdXAtdG8tZGF0ZQogICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2VnZ19pbmZvJykKCiAgICAgICAgb3JpZy5iZGlzdF9ycG0ucnVuKHNlbGYpCgogICAgZGVmIF9tYWtlX3NwZWNfZmlsZShzZWxmKToKICAgICAgICB2ZXJzaW9uID0gc2VsZi5kaXN0cmlidXRpb24uZ2V0X3ZlcnNpb24oKQogICAgICAgIHJwbXZlcnNpb24gPSB2ZXJzaW9uLnJlcGxhY2UoJy0nLCAnXycpCiAgICAgICAgc3BlYyA9IG9yaWcuYmRpc3RfcnBtLl9tYWtlX3NwZWNfZmlsZShzZWxmKQogICAgICAgIGxpbmUyMyA9ICclZGVmaW5lIHZlcnNpb24gJyArIHZlcnNpb24KICAgICAgICBsaW5lMjQgPSAnJWRlZmluZSB2ZXJzaW9uICcgKyBycG12ZXJzaW9uCiAgICAgICAgc3BlYyA9IFsKICAgICAgICAgICAgbGluZS5yZXBsYWNlKAogICAgICAgICAgICAgICAgIlNvdXJjZTA6ICV7bmFtZX0tJXt2ZXJzaW9ufS50YXIiLAogICAgICAgICAgICAgICAgIlNvdXJjZTA6ICV7bmFtZX0tJXt1bm1hbmdsZWRfdmVyc2lvbn0udGFyIgogICAgICAgICAgICApLnJlcGxhY2UoCiAgICAgICAgICAgICAgICAic2V0dXAucHkgaW5zdGFsbCAiLAogICAgICAgICAgICAgICAgInNldHVwLnB5IGluc3RhbGwgLS1zaW5nbGUtdmVyc2lvbi1leHRlcm5hbGx5LW1hbmFnZWQgIgogICAgICAgICAgICApLnJlcGxhY2UoCiAgICAgICAgICAgICAgICAiJXNldHVwIiwKICAgICAgICAgICAgICAgICIlc2V0dXAgLW4gJXtuYW1lfS0le3VubWFuZ2xlZF92ZXJzaW9ufSIKICAgICAgICAgICAgKS5yZXBsYWNlKGxpbmUyMywgbGluZTI0KQogICAgICAgICAgICBmb3IgbGluZSBpbiBzcGVjCiAgICAgICAgXQogICAgICAgIGluc2VydF9sb2MgPSBzcGVjLmluZGV4KGxpbmUyNCkgKyAxCiAgICAgICAgdW5tYW5nbGVkX3ZlcnNpb24gPSAiJWRlZmluZSB1bm1hbmdsZWRfdmVyc2lvbiAiICsgdmVyc2lvbgogICAgICAgIHNwZWMuaW5zZXJ0KGluc2VydF9sb2MsIHVubWFuZ2xlZF92ZXJzaW9uKQogICAgICAgIHJldHVybiBzcGVjClBLAwQUAAAAAAAAACEAIIx1FH0CAAB9AgAASAAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2NvbW1hbmQvYmRpc3Rfd2luaW5zdC5weWltcG9ydCBkaXN0dXRpbHMuY29tbWFuZC5iZGlzdF93aW5pbnN0IGFzIG9yaWcKCgpjbGFzcyBiZGlzdF93aW5pbnN0KG9yaWcuYmRpc3Rfd2luaW5zdCk6CiAgICBkZWYgcmVpbml0aWFsaXplX2NvbW1hbmQoc2VsZiwgY29tbWFuZCwgcmVpbml0X3N1YmNvbW1hbmRzPTApOgogICAgICAgICIiIgogICAgICAgIFN1cHBsZW1lbnQgcmVpbml0aWFsaXplX2NvbW1hbmQgdG8gd29yayBhcm91bmQKICAgICAgICBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMjA4MTkKICAgICAgICAiIiIKICAgICAgICBjbWQgPSBzZWxmLmRpc3RyaWJ1dGlvbi5yZWluaXRpYWxpemVfY29tbWFuZCgKICAgICAgICAgICAgY29tbWFuZCwgcmVpbml0X3N1YmNvbW1hbmRzKQogICAgICAgIGlmIGNvbW1hbmQgaW4gKCdpbnN0YWxsJywgJ2luc3RhbGxfbGliJyk6CiAgICAgICAgICAgIGNtZC5pbnN0YWxsX2xpYiA9IE5vbmUKICAgICAgICByZXR1cm4gY21kCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICBzZWxmLl9pc19ydW5uaW5nID0gVHJ1ZQogICAgICAgIHRyeToKICAgICAgICAgICAgb3JpZy5iZGlzdF93aW5pbnN0LnJ1bihzZWxmKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIHNlbGYuX2lzX3J1bm5pbmcgPSBGYWxzZQpQSwMEFAAAAAAAAAAhACcajRuEEQAAhBEAAEUAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9jb21tYW5kL2J1aWxkX2NsaWIucHlpbXBvcnQgZGlzdHV0aWxzLmNvbW1hbmQuYnVpbGRfY2xpYiBhcyBvcmlnCmZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzU2V0dXBFcnJvcgpmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCmZyb20gc2V0dXB0b29scy5kZXBfdXRpbCBpbXBvcnQgbmV3ZXJfcGFpcndpc2VfZ3JvdXAKCgpjbGFzcyBidWlsZF9jbGliKG9yaWcuYnVpbGRfY2xpYik6CiAgICAiIiIKICAgIE92ZXJyaWRlIHRoZSBkZWZhdWx0IGJ1aWxkX2NsaWIgYmVoYXZpb3VyIHRvIGRvIHRoZSBmb2xsb3dpbmc6CgogICAgMS4gSW1wbGVtZW50IGEgcnVkaW1lbnRhcnkgdGltZXN0YW1wLWJhc2VkIGRlcGVuZGVuY3kgc3lzdGVtCiAgICAgICBzbyAnY29tcGlsZSgpJyBkb2Vzbid0IHJ1biBldmVyeSB0aW1lLgogICAgMi4gQWRkIG1vcmUga2V5cyB0byB0aGUgJ2J1aWxkX2luZm8nIGRpY3Rpb25hcnk6CiAgICAgICAgKiBvYmpfZGVwcyAtIHNwZWNpZnkgZGVwZW5kZW5jaWVzIGZvciBlYWNoIG9iamVjdCBjb21waWxlZC4KICAgICAgICAgICAgICAgICAgICAgdGhpcyBzaG91bGQgYmUgYSBkaWN0aW9uYXJ5IG1hcHBpbmcgYSBrZXkKICAgICAgICAgICAgICAgICAgICAgd2l0aCB0aGUgc291cmNlIGZpbGVuYW1lIHRvIGEgbGlzdCBvZgogICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmNpZXMuIFVzZSBhbiBlbXB0eSBzdHJpbmcgZm9yIGdsb2JhbAogICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmNpZXMuCiAgICAgICAgKiBjZmxhZ3MgICAtIHNwZWNpZnkgYSBsaXN0IG9mIGFkZGl0aW9uYWwgZmxhZ3MgdG8gcGFzcyB0bwogICAgICAgICAgICAgICAgICAgICB0aGUgY29tcGlsZXIuCiAgICAiIiIKCiAgICBkZWYgYnVpbGRfbGlicmFyaWVzKHNlbGYsIGxpYnJhcmllcyk6CiAgICAgICAgZm9yIChsaWJfbmFtZSwgYnVpbGRfaW5mbykgaW4gbGlicmFyaWVzOgogICAgICAgICAgICBzb3VyY2VzID0gYnVpbGRfaW5mby5nZXQoJ3NvdXJjZXMnKQogICAgICAgICAgICBpZiBzb3VyY2VzIGlzIE5vbmUgb3Igbm90IGlzaW5zdGFuY2Uoc291cmNlcywgKGxpc3QsIHR1cGxlKSk6CiAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICJpbiAnbGlicmFyaWVzJyBvcHRpb24gKGxpYnJhcnkgJyVzJyksICIKICAgICAgICAgICAgICAgICAgICAgICAiJ3NvdXJjZXMnIG11c3QgYmUgcHJlc2VudCBhbmQgbXVzdCBiZSAiCiAgICAgICAgICAgICAgICAgICAgICAgImEgbGlzdCBvZiBzb3VyY2UgZmlsZW5hbWVzIiAlIGxpYl9uYW1lKQogICAgICAgICAgICBzb3VyY2VzID0gbGlzdChzb3VyY2VzKQoKICAgICAgICAgICAgbG9nLmluZm8oImJ1aWxkaW5nICclcycgbGlicmFyeSIsIGxpYl9uYW1lKQoKICAgICAgICAgICAgIyBNYWtlIHN1cmUgZXZlcnl0aGluZyBpcyB0aGUgY29ycmVjdCB0eXBlLgogICAgICAgICAgICAjIG9ial9kZXBzIHNob3VsZCBiZSBhIGRpY3Rpb25hcnkgb2Yga2V5cyBhcyBzb3VyY2VzCiAgICAgICAgICAgICMgYW5kIGEgbGlzdC90dXBsZSBvZiBmaWxlcyB0aGF0IGFyZSBpdHMgZGVwZW5kZW5jaWVzLgogICAgICAgICAgICBvYmpfZGVwcyA9IGJ1aWxkX2luZm8uZ2V0KCdvYmpfZGVwcycsIGRpY3QoKSkKICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob2JqX2RlcHMsIGRpY3QpOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAiaW4gJ2xpYnJhcmllcycgb3B0aW9uIChsaWJyYXJ5ICclcycpLCAiCiAgICAgICAgICAgICAgICAgICAgICAgIidvYmpfZGVwcycgbXVzdCBiZSBhIGRpY3Rpb25hcnkgb2YgIgogICAgICAgICAgICAgICAgICAgICAgICJ0eXBlICdzb3VyY2U6IGxpc3QnIiAlIGxpYl9uYW1lKQogICAgICAgICAgICBkZXBlbmRlbmNpZXMgPSBbXQoKICAgICAgICAgICAgIyBHZXQgdGhlIGdsb2JhbCBkZXBlbmRlbmNpZXMgdGhhdCBhcmUgc3BlY2lmaWVkIGJ5IHRoZSAnJyBrZXkuCiAgICAgICAgICAgICMgVGhlc2Ugd2lsbCBnbyBpbnRvIGV2ZXJ5IHNvdXJjZSdzIGRlcGVuZGVuY3kgbGlzdC4KICAgICAgICAgICAgZ2xvYmFsX2RlcHMgPSBvYmpfZGVwcy5nZXQoJycsIGxpc3QoKSkKICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZ2xvYmFsX2RlcHMsIChsaXN0LCB0dXBsZSkpOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAiaW4gJ2xpYnJhcmllcycgb3B0aW9uIChsaWJyYXJ5ICclcycpLCAiCiAgICAgICAgICAgICAgICAgICAgICAgIidvYmpfZGVwcycgbXVzdCBiZSBhIGRpY3Rpb25hcnkgb2YgIgogICAgICAgICAgICAgICAgICAgICAgICJ0eXBlICdzb3VyY2U6IGxpc3QnIiAlIGxpYl9uYW1lKQoKICAgICAgICAgICAgIyBCdWlsZCB0aGUgbGlzdCB0byBiZSB1c2VkIGJ5IG5ld2VyX3BhaXJ3aXNlX2dyb3VwCiAgICAgICAgICAgICMgZWFjaCBzb3VyY2Ugd2lsbCBiZSBhdXRvLWFkZGVkIHRvIGl0cyBkZXBlbmRlbmNpZXMuCiAgICAgICAgICAgIGZvciBzb3VyY2UgaW4gc291cmNlczoKICAgICAgICAgICAgICAgIHNyY19kZXBzID0gW3NvdXJjZV0KICAgICAgICAgICAgICAgIHNyY19kZXBzLmV4dGVuZChnbG9iYWxfZGVwcykKICAgICAgICAgICAgICAgIGV4dHJhX2RlcHMgPSBvYmpfZGVwcy5nZXQoc291cmNlLCBsaXN0KCkpCiAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShleHRyYV9kZXBzLCAobGlzdCwgdHVwbGUpKToKICAgICAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gJ2xpYnJhcmllcycgb3B0aW9uIChsaWJyYXJ5ICclcycpLCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICInb2JqX2RlcHMnIG11c3QgYmUgYSBkaWN0aW9uYXJ5IG9mICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUgJ3NvdXJjZTogbGlzdCciICUgbGliX25hbWUpCiAgICAgICAgICAgICAgICBzcmNfZGVwcy5leHRlbmQoZXh0cmFfZGVwcykKICAgICAgICAgICAgICAgIGRlcGVuZGVuY2llcy5hcHBlbmQoc3JjX2RlcHMpCgogICAgICAgICAgICBleHBlY3RlZF9vYmplY3RzID0gc2VsZi5jb21waWxlci5vYmplY3RfZmlsZW5hbWVzKAogICAgICAgICAgICAgICAgICAgIHNvdXJjZXMsCiAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2Rpcj1zZWxmLmJ1aWxkX3RlbXAKICAgICAgICAgICAgICAgICAgICApCgogICAgICAgICAgICBpZiBuZXdlcl9wYWlyd2lzZV9ncm91cChkZXBlbmRlbmNpZXMsIGV4cGVjdGVkX29iamVjdHMpICE9IChbXSwgW10pOgogICAgICAgICAgICAgICAgIyBGaXJzdCwgY29tcGlsZSB0aGUgc291cmNlIGNvZGUgdG8gb2JqZWN0IGZpbGVzIGluIHRoZSBsaWJyYXJ5CiAgICAgICAgICAgICAgICAjIGRpcmVjdG9yeS4gIChUaGlzIHNob3VsZCBwcm9iYWJseSBjaGFuZ2UgdG8gcHV0dGluZyBvYmplY3QKICAgICAgICAgICAgICAgICMgZmlsZXMgaW4gYSB0ZW1wb3JhcnkgYnVpbGQgZGlyZWN0b3J5LikKICAgICAgICAgICAgICAgIG1hY3JvcyA9IGJ1aWxkX2luZm8uZ2V0KCdtYWNyb3MnKQogICAgICAgICAgICAgICAgaW5jbHVkZV9kaXJzID0gYnVpbGRfaW5mby5nZXQoJ2luY2x1ZGVfZGlycycpCiAgICAgICAgICAgICAgICBjZmxhZ3MgPSBidWlsZF9pbmZvLmdldCgnY2ZsYWdzJykKICAgICAgICAgICAgICAgIG9iamVjdHMgPSBzZWxmLmNvbXBpbGVyLmNvbXBpbGUoCiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXMsCiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9kaXI9c2VsZi5idWlsZF90ZW1wLAogICAgICAgICAgICAgICAgICAgICAgICBtYWNyb3M9bWFjcm9zLAogICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlX2RpcnM9aW5jbHVkZV9kaXJzLAogICAgICAgICAgICAgICAgICAgICAgICBleHRyYV9wb3N0YXJncz1jZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnPXNlbGYuZGVidWcKICAgICAgICAgICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgIyBOb3cgImxpbmsiIHRoZSBvYmplY3QgZmlsZXMgdG9nZXRoZXIgaW50byBhIHN0YXRpYyBsaWJyYXJ5LgogICAgICAgICAgICAjIChPbiBVbml4IGF0IGxlYXN0LCB0aGlzIGlzbid0IHJlYWxseSBsaW5raW5nIC0tIGl0IGp1c3QKICAgICAgICAgICAgIyBidWlsZHMgYW4gYXJjaGl2ZS4gIFdoYXRldmVyLikKICAgICAgICAgICAgc2VsZi5jb21waWxlci5jcmVhdGVfc3RhdGljX2xpYigKICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9vYmplY3RzLAogICAgICAgICAgICAgICAgICAgIGxpYl9uYW1lLAogICAgICAgICAgICAgICAgICAgIG91dHB1dF9kaXI9c2VsZi5idWlsZF9jbGliLAogICAgICAgICAgICAgICAgICAgIGRlYnVnPXNlbGYuZGVidWcKICAgICAgICAgICAgICAgICAgICApClBLAwQUAAAAAAAAACEAjSj9cNsyAADbMgAARAAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2NvbW1hbmQvYnVpbGRfZXh0LnB5aW1wb3J0IG9zCmltcG9ydCBzeXMKaW1wb3J0IGl0ZXJ0b29scwpmcm9tIGRpc3R1dGlscy5jb21tYW5kLmJ1aWxkX2V4dCBpbXBvcnQgYnVpbGRfZXh0IGFzIF9kdV9idWlsZF9leHQKZnJvbSBkaXN0dXRpbHMuZmlsZV91dGlsIGltcG9ydCBjb3B5X2ZpbGUKZnJvbSBkaXN0dXRpbHMuY2NvbXBpbGVyIGltcG9ydCBuZXdfY29tcGlsZXIKZnJvbSBkaXN0dXRpbHMuc3lzY29uZmlnIGltcG9ydCBjdXN0b21pemVfY29tcGlsZXIsIGdldF9jb25maWdfdmFyCmZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzRXJyb3IKZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZwoKZnJvbSBzZXR1cHRvb2xzLmV4dGVuc2lvbiBpbXBvcnQgTGlicmFyeQpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuIGltcG9ydCBzaXgKCmlmIHNpeC5QWTI6CiAgICBpbXBvcnQgaW1wCgogICAgRVhURU5TSU9OX1NVRkZJWEVTID0gW3MgZm9yIHMsIF8sIHRwIGluIGltcC5nZXRfc3VmZml4ZXMoKSBpZiB0cCA9PSBpbXAuQ19FWFRFTlNJT05dCmVsc2U6CiAgICBmcm9tIGltcG9ydGxpYi5tYWNoaW5lcnkgaW1wb3J0IEVYVEVOU0lPTl9TVUZGSVhFUwoKdHJ5OgogICAgIyBBdHRlbXB0IHRvIHVzZSBDeXRob24gZm9yIGJ1aWxkaW5nIGV4dGVuc2lvbnMsIGlmIGF2YWlsYWJsZQogICAgZnJvbSBDeXRob24uRGlzdHV0aWxzLmJ1aWxkX2V4dCBpbXBvcnQgYnVpbGRfZXh0IGFzIF9idWlsZF9leHQKICAgICMgQWRkaXRpb25hbGx5LCBhc3NlcnQgdGhhdCB0aGUgY29tcGlsZXIgbW9kdWxlIHdpbGwgbG9hZAogICAgIyBhbHNvLiBSZWYgIzEyMjkuCiAgICBfX2ltcG9ydF9fKCdDeXRob24uQ29tcGlsZXIuTWFpbicpCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIF9idWlsZF9leHQgPSBfZHVfYnVpbGRfZXh0CgojIG1ha2Ugc3VyZSBfY29uZmlnX3ZhcnMgaXMgaW5pdGlhbGl6ZWQKZ2V0X2NvbmZpZ192YXIoIkxEU0hBUkVEIikKZnJvbSBkaXN0dXRpbHMuc3lzY29uZmlnIGltcG9ydCBfY29uZmlnX3ZhcnMgYXMgX0NPTkZJR19WQVJTCgoKZGVmIF9jdXN0b21pemVfY29tcGlsZXJfZm9yX3NobGliKGNvbXBpbGVyKToKICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIjoKICAgICAgICAjIGJ1aWxkaW5nIC5keWxpYiByZXF1aXJlcyBhZGRpdGlvbmFsIGNvbXBpbGVyIGZsYWdzIG9uIE9TWDsgaGVyZSB3ZQogICAgICAgICMgdGVtcG9yYXJpbHkgc3Vic3RpdHV0ZSB0aGUgcHljb25maWcuaCB2YXJpYWJsZXMgc28gdGhhdCBkaXN0dXRpbHMnCiAgICAgICAgIyAnY3VzdG9taXplX2NvbXBpbGVyJyB1c2VzIHRoZW0gYmVmb3JlIHdlIGJ1aWxkIHRoZSBzaGFyZWQgbGlicmFyaWVzLgogICAgICAgIHRtcCA9IF9DT05GSUdfVkFSUy5jb3B5KCkKICAgICAgICB0cnk6CiAgICAgICAgICAgICMgWFhYIEhlbHAhICBJIGRvbid0IGhhdmUgYW55IGlkZWEgd2hldGhlciB0aGVzZSBhcmUgcmlnaHQuLi4KICAgICAgICAgICAgX0NPTkZJR19WQVJTWydMRFNIQVJFRCddID0gKAogICAgICAgICAgICAgICAgImdjYyAtV2wsLXggLWR5bmFtaWNsaWIgLXVuZGVmaW5lZCBkeW5hbWljX2xvb2t1cCIpCiAgICAgICAgICAgIF9DT05GSUdfVkFSU1snQ0NTSEFSRUQnXSA9ICIgLWR5bmFtaWNsaWIiCiAgICAgICAgICAgIF9DT05GSUdfVkFSU1snU08nXSA9ICIuZHlsaWIiCiAgICAgICAgICAgIGN1c3RvbWl6ZV9jb21waWxlcihjb21waWxlcikKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBfQ09ORklHX1ZBUlMuY2xlYXIoKQogICAgICAgICAgICBfQ09ORklHX1ZBUlMudXBkYXRlKHRtcCkKICAgIGVsc2U6CiAgICAgICAgY3VzdG9taXplX2NvbXBpbGVyKGNvbXBpbGVyKQoKCmhhdmVfcnRsZCA9IEZhbHNlCnVzZV9zdHVicyA9IEZhbHNlCmxpYnR5cGUgPSAnc2hhcmVkJwoKaWYgc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iOgogICAgdXNlX3N0dWJzID0gVHJ1ZQplbGlmIG9zLm5hbWUgIT0gJ250JzoKICAgIHRyeToKICAgICAgICBpbXBvcnQgZGwKICAgICAgICB1c2Vfc3R1YnMgPSBoYXZlX3J0bGQgPSBoYXNhdHRyKGRsLCAnUlRMRF9OT1cnKQogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgIHBhc3MKCmlmX2RsID0gbGFtYmRhIHM6IHMgaWYgaGF2ZV9ydGxkIGVsc2UgJycKCgpkZWYgZ2V0X2FiaTNfc3VmZml4KCk6CiAgICAiIiJSZXR1cm4gdGhlIGZpbGUgZXh0ZW5zaW9uIGZvciBhbiBhYmkzLWNvbXBsaWFudCBFeHRlbnNpb24oKSIiIgogICAgZm9yIHN1ZmZpeCBpbiBFWFRFTlNJT05fU1VGRklYRVM6CiAgICAgICAgaWYgJy5hYmkzJyBpbiBzdWZmaXg6ICAjIFVuaXgKICAgICAgICAgICAgcmV0dXJuIHN1ZmZpeAogICAgICAgIGVsaWYgc3VmZml4ID09ICcucHlkJzogICMgV2luZG93cwogICAgICAgICAgICByZXR1cm4gc3VmZml4CgoKY2xhc3MgYnVpbGRfZXh0KF9idWlsZF9leHQpOgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICAiIiJCdWlsZCBleHRlbnNpb25zIGluIGJ1aWxkIGRpcmVjdG9yeSwgdGhlbiBjb3B5IGlmIC0taW5wbGFjZSIiIgogICAgICAgIG9sZF9pbnBsYWNlLCBzZWxmLmlucGxhY2UgPSBzZWxmLmlucGxhY2UsIDAKICAgICAgICBfYnVpbGRfZXh0LnJ1bihzZWxmKQogICAgICAgIHNlbGYuaW5wbGFjZSA9IG9sZF9pbnBsYWNlCiAgICAgICAgaWYgb2xkX2lucGxhY2U6CiAgICAgICAgICAgIHNlbGYuY29weV9leHRlbnNpb25zX3RvX3NvdXJjZSgpCgogICAgZGVmIGNvcHlfZXh0ZW5zaW9uc190b19zb3VyY2Uoc2VsZik6CiAgICAgICAgYnVpbGRfcHkgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGRfcHknKQogICAgICAgIGZvciBleHQgaW4gc2VsZi5leHRlbnNpb25zOgogICAgICAgICAgICBmdWxsbmFtZSA9IHNlbGYuZ2V0X2V4dF9mdWxsbmFtZShleHQubmFtZSkKICAgICAgICAgICAgZmlsZW5hbWUgPSBzZWxmLmdldF9leHRfZmlsZW5hbWUoZnVsbG5hbWUpCiAgICAgICAgICAgIG1vZHBhdGggPSBmdWxsbmFtZS5zcGxpdCgnLicpCiAgICAgICAgICAgIHBhY2thZ2UgPSAnLicuam9pbihtb2RwYXRoWzotMV0pCiAgICAgICAgICAgIHBhY2thZ2VfZGlyID0gYnVpbGRfcHkuZ2V0X3BhY2thZ2VfZGlyKHBhY2thZ2UpCiAgICAgICAgICAgIGRlc3RfZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4ocGFja2FnZV9kaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5iYXNlbmFtZShmaWxlbmFtZSkpCiAgICAgICAgICAgIHNyY19maWxlbmFtZSA9IG9zLnBhdGguam9pbihzZWxmLmJ1aWxkX2xpYiwgZmlsZW5hbWUpCgogICAgICAgICAgICAjIEFsd2F5cyBjb3B5LCBldmVuIGlmIHNvdXJjZSBpcyBvbGRlciB0aGFuIGRlc3RpbmF0aW9uLCB0byBlbnN1cmUKICAgICAgICAgICAgIyB0aGF0IHRoZSByaWdodCBleHRlbnNpb25zIGZvciB0aGUgY3VycmVudCBQeXRob24vcGxhdGZvcm0gYXJlCiAgICAgICAgICAgICMgdXNlZC4KICAgICAgICAgICAgY29weV9maWxlKAogICAgICAgICAgICAgICAgc3JjX2ZpbGVuYW1lLCBkZXN0X2ZpbGVuYW1lLCB2ZXJib3NlPXNlbGYudmVyYm9zZSwKICAgICAgICAgICAgICAgIGRyeV9ydW49c2VsZi5kcnlfcnVuCiAgICAgICAgICAgICkKICAgICAgICAgICAgaWYgZXh0Ll9uZWVkc19zdHViOgogICAgICAgICAgICAgICAgc2VsZi53cml0ZV9zdHViKHBhY2thZ2VfZGlyIG9yIG9zLmN1cmRpciwgZXh0LCBUcnVlKQoKICAgIGRlZiBnZXRfZXh0X2ZpbGVuYW1lKHNlbGYsIGZ1bGxuYW1lKToKICAgICAgICBmaWxlbmFtZSA9IF9idWlsZF9leHQuZ2V0X2V4dF9maWxlbmFtZShzZWxmLCBmdWxsbmFtZSkKICAgICAgICBpZiBmdWxsbmFtZSBpbiBzZWxmLmV4dF9tYXA6CiAgICAgICAgICAgIGV4dCA9IHNlbGYuZXh0X21hcFtmdWxsbmFtZV0KICAgICAgICAgICAgdXNlX2FiaTMgPSAoCiAgICAgICAgICAgICAgICBzaXguUFkzCiAgICAgICAgICAgICAgICBhbmQgZ2V0YXR0cihleHQsICdweV9saW1pdGVkX2FwaScpCiAgICAgICAgICAgICAgICBhbmQgZ2V0X2FiaTNfc3VmZml4KCkKICAgICAgICAgICAgKQogICAgICAgICAgICBpZiB1c2VfYWJpMzoKICAgICAgICAgICAgICAgIHNvX2V4dCA9IGdldF9jb25maWdfdmFyKCdFWFRfU1VGRklYJykKICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWVbOi1sZW4oc29fZXh0KV0KICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWUgKyBnZXRfYWJpM19zdWZmaXgoKQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV4dCwgTGlicmFyeSk6CiAgICAgICAgICAgICAgICBmbiwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChmaWxlbmFtZSkKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnNobGliX2NvbXBpbGVyLmxpYnJhcnlfZmlsZW5hbWUoZm4sIGxpYnR5cGUpCiAgICAgICAgICAgIGVsaWYgdXNlX3N0dWJzIGFuZCBleHQuX2xpbmtzX3RvX2R5bmFtaWM6CiAgICAgICAgICAgICAgICBkLCBmbiA9IG9zLnBhdGguc3BsaXQoZmlsZW5hbWUpCiAgICAgICAgICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKGQsICdkbC0nICsgZm4pCiAgICAgICAgcmV0dXJuIGZpbGVuYW1lCgogICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBfYnVpbGRfZXh0LmluaXRpYWxpemVfb3B0aW9ucyhzZWxmKQogICAgICAgIHNlbGYuc2hsaWJfY29tcGlsZXIgPSBOb25lCiAgICAgICAgc2VsZi5zaGxpYnMgPSBbXQogICAgICAgIHNlbGYuZXh0X21hcCA9IHt9CgogICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgX2J1aWxkX2V4dC5maW5hbGl6ZV9vcHRpb25zKHNlbGYpCiAgICAgICAgc2VsZi5leHRlbnNpb25zID0gc2VsZi5leHRlbnNpb25zIG9yIFtdCiAgICAgICAgc2VsZi5jaGVja19leHRlbnNpb25zX2xpc3Qoc2VsZi5leHRlbnNpb25zKQogICAgICAgIHNlbGYuc2hsaWJzID0gW2V4dCBmb3IgZXh0IGluIHNlbGYuZXh0ZW5zaW9ucwogICAgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXh0LCBMaWJyYXJ5KV0KICAgICAgICBpZiBzZWxmLnNobGliczoKICAgICAgICAgICAgc2VsZi5zZXR1cF9zaGxpYl9jb21waWxlcigpCiAgICAgICAgZm9yIGV4dCBpbiBzZWxmLmV4dGVuc2lvbnM6CiAgICAgICAgICAgIGV4dC5fZnVsbF9uYW1lID0gc2VsZi5nZXRfZXh0X2Z1bGxuYW1lKGV4dC5uYW1lKQogICAgICAgIGZvciBleHQgaW4gc2VsZi5leHRlbnNpb25zOgogICAgICAgICAgICBmdWxsbmFtZSA9IGV4dC5fZnVsbF9uYW1lCiAgICAgICAgICAgIHNlbGYuZXh0X21hcFtmdWxsbmFtZV0gPSBleHQKCiAgICAgICAgICAgICMgZGlzdHV0aWxzIDMuMSB3aWxsIGFsc28gYXNrIGZvciBtb2R1bGUgbmFtZXMKICAgICAgICAgICAgIyBYWFggd2hhdCB0byBkbyB3aXRoIGNvbmZsaWN0cz8KICAgICAgICAgICAgc2VsZi5leHRfbWFwW2Z1bGxuYW1lLnNwbGl0KCcuJylbLTFdXSA9IGV4dAoKICAgICAgICAgICAgbHRkID0gc2VsZi5zaGxpYnMgYW5kIHNlbGYubGlua3NfdG9fZHluYW1pYyhleHQpIG9yIEZhbHNlCiAgICAgICAgICAgIG5zID0gbHRkIGFuZCB1c2Vfc3R1YnMgYW5kIG5vdCBpc2luc3RhbmNlKGV4dCwgTGlicmFyeSkKICAgICAgICAgICAgZXh0Ll9saW5rc190b19keW5hbWljID0gbHRkCiAgICAgICAgICAgIGV4dC5fbmVlZHNfc3R1YiA9IG5zCiAgICAgICAgICAgIGZpbGVuYW1lID0gZXh0Ll9maWxlX25hbWUgPSBzZWxmLmdldF9leHRfZmlsZW5hbWUoZnVsbG5hbWUpCiAgICAgICAgICAgIGxpYmRpciA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmpvaW4oc2VsZi5idWlsZF9saWIsIGZpbGVuYW1lKSkKICAgICAgICAgICAgaWYgbHRkIGFuZCBsaWJkaXIgbm90IGluIGV4dC5saWJyYXJ5X2RpcnM6CiAgICAgICAgICAgICAgICBleHQubGlicmFyeV9kaXJzLmFwcGVuZChsaWJkaXIpCiAgICAgICAgICAgIGlmIGx0ZCBhbmQgdXNlX3N0dWJzIGFuZCBvcy5jdXJkaXIgbm90IGluIGV4dC5ydW50aW1lX2xpYnJhcnlfZGlyczoKICAgICAgICAgICAgICAgIGV4dC5ydW50aW1lX2xpYnJhcnlfZGlycy5hcHBlbmQob3MuY3VyZGlyKQoKICAgIGRlZiBzZXR1cF9zaGxpYl9jb21waWxlcihzZWxmKToKICAgICAgICBjb21waWxlciA9IHNlbGYuc2hsaWJfY29tcGlsZXIgPSBuZXdfY29tcGlsZXIoCiAgICAgICAgICAgIGNvbXBpbGVyPXNlbGYuY29tcGlsZXIsIGRyeV9ydW49c2VsZi5kcnlfcnVuLCBmb3JjZT1zZWxmLmZvcmNlCiAgICAgICAgKQogICAgICAgIF9jdXN0b21pemVfY29tcGlsZXJfZm9yX3NobGliKGNvbXBpbGVyKQoKICAgICAgICBpZiBzZWxmLmluY2x1ZGVfZGlycyBpcyBub3QgTm9uZToKICAgICAgICAgICAgY29tcGlsZXIuc2V0X2luY2x1ZGVfZGlycyhzZWxmLmluY2x1ZGVfZGlycykKICAgICAgICBpZiBzZWxmLmRlZmluZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgIyAnZGVmaW5lJyBvcHRpb24gaXMgYSBsaXN0IG9mIChuYW1lLHZhbHVlKSB0dXBsZXMKICAgICAgICAgICAgZm9yIChuYW1lLCB2YWx1ZSkgaW4gc2VsZi5kZWZpbmU6CiAgICAgICAgICAgICAgICBjb21waWxlci5kZWZpbmVfbWFjcm8obmFtZSwgdmFsdWUpCiAgICAgICAgaWYgc2VsZi51bmRlZiBpcyBub3QgTm9uZToKICAgICAgICAgICAgZm9yIG1hY3JvIGluIHNlbGYudW5kZWY6CiAgICAgICAgICAgICAgICBjb21waWxlci51bmRlZmluZV9tYWNybyhtYWNybykKICAgICAgICBpZiBzZWxmLmxpYnJhcmllcyBpcyBub3QgTm9uZToKICAgICAgICAgICAgY29tcGlsZXIuc2V0X2xpYnJhcmllcyhzZWxmLmxpYnJhcmllcykKICAgICAgICBpZiBzZWxmLmxpYnJhcnlfZGlycyBpcyBub3QgTm9uZToKICAgICAgICAgICAgY29tcGlsZXIuc2V0X2xpYnJhcnlfZGlycyhzZWxmLmxpYnJhcnlfZGlycykKICAgICAgICBpZiBzZWxmLnJwYXRoIGlzIG5vdCBOb25lOgogICAgICAgICAgICBjb21waWxlci5zZXRfcnVudGltZV9saWJyYXJ5X2RpcnMoc2VsZi5ycGF0aCkKICAgICAgICBpZiBzZWxmLmxpbmtfb2JqZWN0cyBpcyBub3QgTm9uZToKICAgICAgICAgICAgY29tcGlsZXIuc2V0X2xpbmtfb2JqZWN0cyhzZWxmLmxpbmtfb2JqZWN0cykKCiAgICAgICAgIyBoYWNrIHNvIGRpc3R1dGlscycgYnVpbGRfZXh0ZW5zaW9uKCkgYnVpbGRzIGEgbGlicmFyeSBpbnN0ZWFkCiAgICAgICAgY29tcGlsZXIubGlua19zaGFyZWRfb2JqZWN0ID0gbGlua19zaGFyZWRfb2JqZWN0Ll9fZ2V0X18oY29tcGlsZXIpCgogICAgZGVmIGdldF9leHBvcnRfc3ltYm9scyhzZWxmLCBleHQpOgogICAgICAgIGlmIGlzaW5zdGFuY2UoZXh0LCBMaWJyYXJ5KToKICAgICAgICAgICAgcmV0dXJuIGV4dC5leHBvcnRfc3ltYm9scwogICAgICAgIHJldHVybiBfYnVpbGRfZXh0LmdldF9leHBvcnRfc3ltYm9scyhzZWxmLCBleHQpCgogICAgZGVmIGJ1aWxkX2V4dGVuc2lvbihzZWxmLCBleHQpOgogICAgICAgIGV4dC5fY29udmVydF9weXhfc291cmNlc190b19sYW5nKCkKICAgICAgICBfY29tcGlsZXIgPSBzZWxmLmNvbXBpbGVyCiAgICAgICAgdHJ5OgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV4dCwgTGlicmFyeSk6CiAgICAgICAgICAgICAgICBzZWxmLmNvbXBpbGVyID0gc2VsZi5zaGxpYl9jb21waWxlcgogICAgICAgICAgICBfYnVpbGRfZXh0LmJ1aWxkX2V4dGVuc2lvbihzZWxmLCBleHQpCiAgICAgICAgICAgIGlmIGV4dC5fbmVlZHNfc3R1YjoKICAgICAgICAgICAgICAgIGNtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZF9weScpLmJ1aWxkX2xpYgogICAgICAgICAgICAgICAgc2VsZi53cml0ZV9zdHViKGNtZCwgZXh0KQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIHNlbGYuY29tcGlsZXIgPSBfY29tcGlsZXIKCiAgICBkZWYgbGlua3NfdG9fZHluYW1pYyhzZWxmLCBleHQpOgogICAgICAgICIiIlJldHVybiB0cnVlIGlmICdleHQnIGxpbmtzIHRvIGEgZHluYW1pYyBsaWIgaW4gdGhlIHNhbWUgcGFja2FnZSIiIgogICAgICAgICMgWFhYIHRoaXMgc2hvdWxkIGNoZWNrIHRvIGVuc3VyZSB0aGUgbGliIGlzIGFjdHVhbGx5IGJlaW5nIGJ1aWx0CiAgICAgICAgIyBYWFggYXMgZHluYW1pYywgYW5kIG5vdCBqdXN0IHVzaW5nIGEgbG9jYWxseS1mb3VuZCB2ZXJzaW9uIG9yIGEKICAgICAgICAjIFhYWCBzdGF0aWMtY29tcGlsZWQgdmVyc2lvbgogICAgICAgIGxpYm5hbWVzID0gZGljdC5mcm9ta2V5cyhbbGliLl9mdWxsX25hbWUgZm9yIGxpYiBpbiBzZWxmLnNobGlic10pCiAgICAgICAgcGtnID0gJy4nLmpvaW4oZXh0Ll9mdWxsX25hbWUuc3BsaXQoJy4nKVs6LTFdICsgWycnXSkKICAgICAgICByZXR1cm4gYW55KHBrZyArIGxpYm5hbWUgaW4gbGlibmFtZXMgZm9yIGxpYm5hbWUgaW4gZXh0LmxpYnJhcmllcykKCiAgICBkZWYgZ2V0X291dHB1dHMoc2VsZik6CiAgICAgICAgcmV0dXJuIF9idWlsZF9leHQuZ2V0X291dHB1dHMoc2VsZikgKyBzZWxmLl9fZ2V0X3N0dWJzX291dHB1dHMoKQoKICAgIGRlZiBfX2dldF9zdHVic19vdXRwdXRzKHNlbGYpOgogICAgICAgICMgYXNzZW1ibGUgdGhlIGJhc2UgbmFtZSBmb3IgZWFjaCBleHRlbnNpb24gdGhhdCBuZWVkcyBhIHN0dWIKICAgICAgICBuc19leHRfYmFzZXMgPSAoCiAgICAgICAgICAgIG9zLnBhdGguam9pbihzZWxmLmJ1aWxkX2xpYiwgKmV4dC5fZnVsbF9uYW1lLnNwbGl0KCcuJykpCiAgICAgICAgICAgIGZvciBleHQgaW4gc2VsZi5leHRlbnNpb25zCiAgICAgICAgICAgIGlmIGV4dC5fbmVlZHNfc3R1YgogICAgICAgICkKICAgICAgICAjIHBhaXIgZWFjaCBiYXNlIHdpdGggdGhlIGV4dGVuc2lvbgogICAgICAgIHBhaXJzID0gaXRlcnRvb2xzLnByb2R1Y3QobnNfZXh0X2Jhc2VzLCBzZWxmLl9fZ2V0X291dHB1dF9leHRlbnNpb25zKCkpCiAgICAgICAgcmV0dXJuIGxpc3QoYmFzZSArIGZuZXh0IGZvciBiYXNlLCBmbmV4dCBpbiBwYWlycykKCiAgICBkZWYgX19nZXRfb3V0cHV0X2V4dGVuc2lvbnMoc2VsZik6CiAgICAgICAgeWllbGQgJy5weScKICAgICAgICB5aWVsZCAnLnB5YycKICAgICAgICBpZiBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGRfcHknKS5vcHRpbWl6ZToKICAgICAgICAgICAgeWllbGQgJy5weW8nCgogICAgZGVmIHdyaXRlX3N0dWIoc2VsZiwgb3V0cHV0X2RpciwgZXh0LCBjb21waWxlPUZhbHNlKToKICAgICAgICBsb2cuaW5mbygid3JpdGluZyBzdHViIGxvYWRlciBmb3IgJXMgdG8gJXMiLCBleHQuX2Z1bGxfbmFtZSwKICAgICAgICAgICAgICAgICBvdXRwdXRfZGlyKQogICAgICAgIHN0dWJfZmlsZSA9IChvcy5wYXRoLmpvaW4ob3V0cHV0X2RpciwgKmV4dC5fZnVsbF9uYW1lLnNwbGl0KCcuJykpICsKICAgICAgICAgICAgICAgICAgICAgJy5weScpCiAgICAgICAgaWYgY29tcGlsZSBhbmQgb3MucGF0aC5leGlzdHMoc3R1Yl9maWxlKToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3Ioc3R1Yl9maWxlICsgIiBhbHJlYWR5IGV4aXN0cyEgUGxlYXNlIGRlbGV0ZS4iKQogICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgIGYgPSBvcGVuKHN0dWJfZmlsZSwgJ3cnKQogICAgICAgICAgICBmLndyaXRlKAogICAgICAgICAgICAgICAgJ1xuJy5qb2luKFsKICAgICAgICAgICAgICAgICAgICAiZGVmIF9fYm9vdHN0cmFwX18oKToiLAogICAgICAgICAgICAgICAgICAgICIgICBnbG9iYWwgX19ib290c3RyYXBfXywgX19maWxlX18sIF9fbG9hZGVyX18iLAogICAgICAgICAgICAgICAgICAgICIgICBpbXBvcnQgc3lzLCBvcywgcGtnX3Jlc291cmNlcywgaW1wIiArIGlmX2RsKCIsIGRsIiksCiAgICAgICAgICAgICAgICAgICAgIiAgIF9fZmlsZV9fID0gcGtnX3Jlc291cmNlcy5yZXNvdXJjZV9maWxlbmFtZSIKICAgICAgICAgICAgICAgICAgICAiKF9fbmFtZV9fLCVyKSIKICAgICAgICAgICAgICAgICAgICAlIG9zLnBhdGguYmFzZW5hbWUoZXh0Ll9maWxlX25hbWUpLAogICAgICAgICAgICAgICAgICAgICIgICBkZWwgX19ib290c3RyYXBfXyIsCiAgICAgICAgICAgICAgICAgICAgIiAgIGlmICdfX2xvYWRlcl9fJyBpbiBnbG9iYWxzKCk6IiwKICAgICAgICAgICAgICAgICAgICAiICAgICAgIGRlbCBfX2xvYWRlcl9fIiwKICAgICAgICAgICAgICAgICAgICBpZl9kbCgiICAgb2xkX2ZsYWdzID0gc3lzLmdldGRsb3BlbmZsYWdzKCkiKSwKICAgICAgICAgICAgICAgICAgICAiICAgb2xkX2RpciA9IG9zLmdldGN3ZCgpIiwKICAgICAgICAgICAgICAgICAgICAiICAgdHJ5OiIsCiAgICAgICAgICAgICAgICAgICAgIiAgICAgb3MuY2hkaXIob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkiLAogICAgICAgICAgICAgICAgICAgIGlmX2RsKCIgICAgIHN5cy5zZXRkbG9wZW5mbGFncyhkbC5SVExEX05PVykiKSwKICAgICAgICAgICAgICAgICAgICAiICAgICBpbXAubG9hZF9keW5hbWljKF9fbmFtZV9fLF9fZmlsZV9fKSIsCiAgICAgICAgICAgICAgICAgICAgIiAgIGZpbmFsbHk6IiwKICAgICAgICAgICAgICAgICAgICBpZl9kbCgiICAgICBzeXMuc2V0ZGxvcGVuZmxhZ3Mob2xkX2ZsYWdzKSIpLAogICAgICAgICAgICAgICAgICAgICIgICAgIG9zLmNoZGlyKG9sZF9kaXIpIiwKICAgICAgICAgICAgICAgICAgICAiX19ib290c3RyYXBfXygpIiwKICAgICAgICAgICAgICAgICAgICAiIiAgIyB0ZXJtaW5hbCBcbgogICAgICAgICAgICAgICAgXSkKICAgICAgICAgICAgKQogICAgICAgICAgICBmLmNsb3NlKCkKICAgICAgICBpZiBjb21waWxlOgogICAgICAgICAgICBmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBieXRlX2NvbXBpbGUKCiAgICAgICAgICAgIGJ5dGVfY29tcGlsZShbc3R1Yl9maWxlXSwgb3B0aW1pemU9MCwKICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlPVRydWUsIGRyeV9ydW49c2VsZi5kcnlfcnVuKQogICAgICAgICAgICBvcHRpbWl6ZSA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdpbnN0YWxsX2xpYicpLm9wdGltaXplCiAgICAgICAgICAgIGlmIG9wdGltaXplID4gMDoKICAgICAgICAgICAgICAgIGJ5dGVfY29tcGlsZShbc3R1Yl9maWxlXSwgb3B0aW1pemU9b3B0aW1pemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2U9VHJ1ZSwgZHJ5X3J1bj1zZWxmLmRyeV9ydW4pCiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHN0dWJfZmlsZSkgYW5kIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgICAgICBvcy51bmxpbmsoc3R1Yl9maWxlKQoKCmlmIHVzZV9zdHVicyBvciBvcy5uYW1lID09ICdudCc6CiAgICAjIEJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMKICAgICMKICAgIGRlZiBsaW5rX3NoYXJlZF9vYmplY3QoCiAgICAgICAgICAgIHNlbGYsIG9iamVjdHMsIG91dHB1dF9saWJuYW1lLCBvdXRwdXRfZGlyPU5vbmUsIGxpYnJhcmllcz1Ob25lLAogICAgICAgICAgICBsaWJyYXJ5X2RpcnM9Tm9uZSwgcnVudGltZV9saWJyYXJ5X2RpcnM9Tm9uZSwgZXhwb3J0X3N5bWJvbHM9Tm9uZSwKICAgICAgICAgICAgZGVidWc9MCwgZXh0cmFfcHJlYXJncz1Ob25lLCBleHRyYV9wb3N0YXJncz1Ob25lLCBidWlsZF90ZW1wPU5vbmUsCiAgICAgICAgICAgIHRhcmdldF9sYW5nPU5vbmUpOgogICAgICAgIHNlbGYubGluaygKICAgICAgICAgICAgc2VsZi5TSEFSRURfTElCUkFSWSwgb2JqZWN0cywgb3V0cHV0X2xpYm5hbWUsCiAgICAgICAgICAgIG91dHB1dF9kaXIsIGxpYnJhcmllcywgbGlicmFyeV9kaXJzLCBydW50aW1lX2xpYnJhcnlfZGlycywKICAgICAgICAgICAgZXhwb3J0X3N5bWJvbHMsIGRlYnVnLCBleHRyYV9wcmVhcmdzLCBleHRyYV9wb3N0YXJncywKICAgICAgICAgICAgYnVpbGRfdGVtcCwgdGFyZ2V0X2xhbmcKICAgICAgICApCmVsc2U6CiAgICAjIEJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMgZXZlcnl3aGVyZSBlbHNlCiAgICBsaWJ0eXBlID0gJ3N0YXRpYycKCiAgICBkZWYgbGlua19zaGFyZWRfb2JqZWN0KAogICAgICAgICAgICBzZWxmLCBvYmplY3RzLCBvdXRwdXRfbGlibmFtZSwgb3V0cHV0X2Rpcj1Ob25lLCBsaWJyYXJpZXM9Tm9uZSwKICAgICAgICAgICAgbGlicmFyeV9kaXJzPU5vbmUsIHJ1bnRpbWVfbGlicmFyeV9kaXJzPU5vbmUsIGV4cG9ydF9zeW1ib2xzPU5vbmUsCiAgICAgICAgICAgIGRlYnVnPTAsIGV4dHJhX3ByZWFyZ3M9Tm9uZSwgZXh0cmFfcG9zdGFyZ3M9Tm9uZSwgYnVpbGRfdGVtcD1Ob25lLAogICAgICAgICAgICB0YXJnZXRfbGFuZz1Ob25lKToKICAgICAgICAjIFhYWCB3ZSBuZWVkIHRvIGVpdGhlciBkaXNhbGxvdyB0aGVzZSBhdHRycyBvbiBMaWJyYXJ5IGluc3RhbmNlcywKICAgICAgICAjIG9yIHdhcm4vYWJvcnQgaGVyZSBpZiBzZXQsIG9yIHNvbWV0aGluZy4uLgogICAgICAgICMgbGlicmFyaWVzPU5vbmUsIGxpYnJhcnlfZGlycz1Ob25lLCBydW50aW1lX2xpYnJhcnlfZGlycz1Ob25lLAogICAgICAgICMgZXhwb3J0X3N5bWJvbHM9Tm9uZSwgZXh0cmFfcHJlYXJncz1Ob25lLCBleHRyYV9wb3N0YXJncz1Ob25lLAogICAgICAgICMgYnVpbGRfdGVtcD1Ob25lCgogICAgICAgIGFzc2VydCBvdXRwdXRfZGlyIGlzIE5vbmUgICMgZGlzdHV0aWxzIGJ1aWxkX2V4dCBkb2Vzbid0IHBhc3MgdGhpcwogICAgICAgIG91dHB1dF9kaXIsIGZpbGVuYW1lID0gb3MucGF0aC5zcGxpdChvdXRwdXRfbGlibmFtZSkKICAgICAgICBiYXNlbmFtZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChmaWxlbmFtZSkKICAgICAgICBpZiBzZWxmLmxpYnJhcnlfZmlsZW5hbWUoIngiKS5zdGFydHN3aXRoKCdsaWInKToKICAgICAgICAgICAgIyBzdHJpcCAnbGliJyBwcmVmaXg7IHRoaXMgaXMga2x1ZGd5IGlmIHNvbWUgcGxhdGZvcm0gdXNlcwogICAgICAgICAgICAjIGEgZGlmZmVyZW50IHByZWZpeAogICAgICAgICAgICBiYXNlbmFtZSA9IGJhc2VuYW1lWzM6XQoKICAgICAgICBzZWxmLmNyZWF0ZV9zdGF0aWNfbGliKAogICAgICAgICAgICBvYmplY3RzLCBiYXNlbmFtZSwgb3V0cHV0X2RpciwgZGVidWcsIHRhcmdldF9sYW5nCiAgICAgICAgKQpQSwMEFAAAAAAAAAAhAEBGQtx8JQAAfCUAAEMAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9jb21tYW5kL2J1aWxkX3B5LnB5ZnJvbSBnbG9iIGltcG9ydCBnbG9iCmZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGNvbnZlcnRfcGF0aAppbXBvcnQgZGlzdHV0aWxzLmNvbW1hbmQuYnVpbGRfcHkgYXMgb3JpZwppbXBvcnQgb3MKaW1wb3J0IGZubWF0Y2gKaW1wb3J0IHRleHR3cmFwCmltcG9ydCBpbwppbXBvcnQgZGlzdHV0aWxzLmVycm9ycwppbXBvcnQgaXRlcnRvb2xzCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuIGltcG9ydCBzaXgKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5zaXgubW92ZXMgaW1wb3J0IG1hcCwgZmlsdGVyLCBmaWx0ZXJmYWxzZQoKdHJ5OgogICAgZnJvbSBzZXR1cHRvb2xzLmxpYjJ0bzNfZXggaW1wb3J0IE1peGluMnRvMwpleGNlcHQgSW1wb3J0RXJyb3I6CgogICAgY2xhc3MgTWl4aW4ydG8zOgogICAgICAgIGRlZiBydW5fMnRvMyhzZWxmLCBmaWxlcywgZG9jdGVzdHM9VHJ1ZSk6CiAgICAgICAgICAgICJkbyBub3RoaW5nIgoKCmNsYXNzIGJ1aWxkX3B5KG9yaWcuYnVpbGRfcHksIE1peGluMnRvMyk6CiAgICAiIiJFbmhhbmNlZCAnYnVpbGRfcHknIGNvbW1hbmQgdGhhdCBpbmNsdWRlcyBkYXRhIGZpbGVzIHdpdGggcGFja2FnZXMKCiAgICBUaGUgZGF0YSBmaWxlcyBhcmUgc3BlY2lmaWVkIHZpYSBhICdwYWNrYWdlX2RhdGEnIGFyZ3VtZW50IHRvICdzZXR1cCgpJy4KICAgIFNlZSAnc2V0dXB0b29scy5kaXN0LkRpc3RyaWJ1dGlvbicgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBBbHNvLCB0aGlzIHZlcnNpb24gb2YgdGhlICdidWlsZF9weScgY29tbWFuZCBhbGxvd3MgeW91IHRvIHNwZWNpZnkgYm90aAogICAgJ3B5X21vZHVsZXMnIGFuZCAncGFja2FnZXMnIGluIHRoZSBzYW1lIHNldHVwIG9wZXJhdGlvbi4KICAgICIiIgoKICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIG9yaWcuYnVpbGRfcHkuZmluYWxpemVfb3B0aW9ucyhzZWxmKQogICAgICAgIHNlbGYucGFja2FnZV9kYXRhID0gc2VsZi5kaXN0cmlidXRpb24ucGFja2FnZV9kYXRhCiAgICAgICAgc2VsZi5leGNsdWRlX3BhY2thZ2VfZGF0YSA9IChzZWxmLmRpc3RyaWJ1dGlvbi5leGNsdWRlX3BhY2thZ2VfZGF0YSBvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge30pCiAgICAgICAgaWYgJ2RhdGFfZmlsZXMnIGluIHNlbGYuX19kaWN0X186CiAgICAgICAgICAgIGRlbCBzZWxmLl9fZGljdF9fWydkYXRhX2ZpbGVzJ10KICAgICAgICBzZWxmLl9fdXBkYXRlZF9maWxlcyA9IFtdCiAgICAgICAgc2VsZi5fX2RvY3Rlc3RzXzJ0bzMgPSBbXQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgIiIiQnVpbGQgbW9kdWxlcywgcGFja2FnZXMsIGFuZCBjb3B5IGRhdGEgZmlsZXMgdG8gYnVpbGQgZGlyZWN0b3J5IiIiCiAgICAgICAgaWYgbm90IHNlbGYucHlfbW9kdWxlcyBhbmQgbm90IHNlbGYucGFja2FnZXM6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBpZiBzZWxmLnB5X21vZHVsZXM6CiAgICAgICAgICAgIHNlbGYuYnVpbGRfbW9kdWxlcygpCgogICAgICAgIGlmIHNlbGYucGFja2FnZXM6CiAgICAgICAgICAgIHNlbGYuYnVpbGRfcGFja2FnZXMoKQogICAgICAgICAgICBzZWxmLmJ1aWxkX3BhY2thZ2VfZGF0YSgpCgogICAgICAgIHNlbGYucnVuXzJ0bzMoc2VsZi5fX3VwZGF0ZWRfZmlsZXMsIEZhbHNlKQogICAgICAgIHNlbGYucnVuXzJ0bzMoc2VsZi5fX3VwZGF0ZWRfZmlsZXMsIFRydWUpCiAgICAgICAgc2VsZi5ydW5fMnRvMyhzZWxmLl9fZG9jdGVzdHNfMnRvMywgVHJ1ZSkKCiAgICAgICAgIyBPbmx5IGNvbXBpbGUgYWN0dWFsIC5weSBmaWxlcywgdXNpbmcgb3VyIGJhc2UgY2xhc3MnIGlkZWEgb2Ygd2hhdCBvdXIKICAgICAgICAjIG91dHB1dCBmaWxlcyBhcmUuCiAgICAgICAgc2VsZi5ieXRlX2NvbXBpbGUob3JpZy5idWlsZF9weS5nZXRfb3V0cHV0cyhzZWxmLCBpbmNsdWRlX2J5dGVjb2RlPTApKQoKICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBhdHRyKToKICAgICAgICAibGF6aWx5IGNvbXB1dGUgZGF0YSBmaWxlcyIKICAgICAgICBpZiBhdHRyID09ICdkYXRhX2ZpbGVzJzoKICAgICAgICAgICAgc2VsZi5kYXRhX2ZpbGVzID0gc2VsZi5fZ2V0X2RhdGFfZmlsZXMoKQogICAgICAgICAgICByZXR1cm4gc2VsZi5kYXRhX2ZpbGVzCiAgICAgICAgcmV0dXJuIG9yaWcuYnVpbGRfcHkuX19nZXRhdHRyX18oc2VsZiwgYXR0cikKCiAgICBkZWYgYnVpbGRfbW9kdWxlKHNlbGYsIG1vZHVsZSwgbW9kdWxlX2ZpbGUsIHBhY2thZ2UpOgogICAgICAgIGlmIHNpeC5QWTIgYW5kIGlzaW5zdGFuY2UocGFja2FnZSwgc2l4LnN0cmluZ190eXBlcyk6CiAgICAgICAgICAgICMgYXZvaWQgZXJyb3JzIG9uIFB5dGhvbiAyIHdoZW4gdW5pY29kZSBpcyBwYXNzZWQgKCMxOTApCiAgICAgICAgICAgIHBhY2thZ2UgPSBwYWNrYWdlLnNwbGl0KCcuJykKICAgICAgICBvdXRmaWxlLCBjb3BpZWQgPSBvcmlnLmJ1aWxkX3B5LmJ1aWxkX21vZHVsZShzZWxmLCBtb2R1bGUsIG1vZHVsZV9maWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2UpCiAgICAgICAgaWYgY29waWVkOgogICAgICAgICAgICBzZWxmLl9fdXBkYXRlZF9maWxlcy5hcHBlbmQob3V0ZmlsZSkKICAgICAgICByZXR1cm4gb3V0ZmlsZSwgY29waWVkCgogICAgZGVmIF9nZXRfZGF0YV9maWxlcyhzZWxmKToKICAgICAgICAiIiJHZW5lcmF0ZSBsaXN0IG9mICcocGFja2FnZSxzcmNfZGlyLGJ1aWxkX2RpcixmaWxlbmFtZXMpJyB0dXBsZXMiIiIKICAgICAgICBzZWxmLmFuYWx5emVfbWFuaWZlc3QoKQogICAgICAgIHJldHVybiBsaXN0KG1hcChzZWxmLl9nZXRfcGtnX2RhdGFfZmlsZXMsIHNlbGYucGFja2FnZXMgb3IgKCkpKQoKICAgIGRlZiBfZ2V0X3BrZ19kYXRhX2ZpbGVzKHNlbGYsIHBhY2thZ2UpOgogICAgICAgICMgTG9jYXRlIHBhY2thZ2Ugc291cmNlIGRpcmVjdG9yeQogICAgICAgIHNyY19kaXIgPSBzZWxmLmdldF9wYWNrYWdlX2RpcihwYWNrYWdlKQoKICAgICAgICAjIENvbXB1dGUgcGFja2FnZSBidWlsZCBkaXJlY3RvcnkKICAgICAgICBidWlsZF9kaXIgPSBvcy5wYXRoLmpvaW4oKihbc2VsZi5idWlsZF9saWJdICsgcGFja2FnZS5zcGxpdCgnLicpKSkKCiAgICAgICAgIyBTdHJpcCBkaXJlY3RvcnkgZnJvbSBnbG9iYmVkIGZpbGVuYW1lcwogICAgICAgIGZpbGVuYW1lcyA9IFsKICAgICAgICAgICAgb3MucGF0aC5yZWxwYXRoKGZpbGUsIHNyY19kaXIpCiAgICAgICAgICAgIGZvciBmaWxlIGluIHNlbGYuZmluZF9kYXRhX2ZpbGVzKHBhY2thZ2UsIHNyY19kaXIpCiAgICAgICAgXQogICAgICAgIHJldHVybiBwYWNrYWdlLCBzcmNfZGlyLCBidWlsZF9kaXIsIGZpbGVuYW1lcwoKICAgIGRlZiBmaW5kX2RhdGFfZmlsZXMoc2VsZiwgcGFja2FnZSwgc3JjX2Rpcik6CiAgICAgICAgIiIiUmV0dXJuIGZpbGVuYW1lcyBmb3IgcGFja2FnZSdzIGRhdGEgZmlsZXMgaW4gJ3NyY19kaXInIiIiCiAgICAgICAgcGF0dGVybnMgPSBzZWxmLl9nZXRfcGxhdGZvcm1fcGF0dGVybnMoCiAgICAgICAgICAgIHNlbGYucGFja2FnZV9kYXRhLAogICAgICAgICAgICBwYWNrYWdlLAogICAgICAgICAgICBzcmNfZGlyLAogICAgICAgICkKICAgICAgICBnbG9ic19leHBhbmRlZCA9IG1hcChnbG9iLCBwYXR0ZXJucykKICAgICAgICAjIGZsYXR0ZW4gdGhlIGV4cGFuZGVkIGdsb2JzIGludG8gYW4gaXRlcmFibGUgb2YgbWF0Y2hlcwogICAgICAgIGdsb2JzX21hdGNoZXMgPSBpdGVydG9vbHMuY2hhaW4uZnJvbV9pdGVyYWJsZShnbG9ic19leHBhbmRlZCkKICAgICAgICBnbG9iX2ZpbGVzID0gZmlsdGVyKG9zLnBhdGguaXNmaWxlLCBnbG9ic19tYXRjaGVzKQogICAgICAgIGZpbGVzID0gaXRlcnRvb2xzLmNoYWluKAogICAgICAgICAgICBzZWxmLm1hbmlmZXN0X2ZpbGVzLmdldChwYWNrYWdlLCBbXSksCiAgICAgICAgICAgIGdsb2JfZmlsZXMsCiAgICAgICAgKQogICAgICAgIHJldHVybiBzZWxmLmV4Y2x1ZGVfZGF0YV9maWxlcyhwYWNrYWdlLCBzcmNfZGlyLCBmaWxlcykKCiAgICBkZWYgYnVpbGRfcGFja2FnZV9kYXRhKHNlbGYpOgogICAgICAgICIiIkNvcHkgZGF0YSBmaWxlcyBpbnRvIGJ1aWxkIGRpcmVjdG9yeSIiIgogICAgICAgIGZvciBwYWNrYWdlLCBzcmNfZGlyLCBidWlsZF9kaXIsIGZpbGVuYW1lcyBpbiBzZWxmLmRhdGFfZmlsZXM6CiAgICAgICAgICAgIGZvciBmaWxlbmFtZSBpbiBmaWxlbmFtZXM6CiAgICAgICAgICAgICAgICB0YXJnZXQgPSBvcy5wYXRoLmpvaW4oYnVpbGRfZGlyLCBmaWxlbmFtZSkKICAgICAgICAgICAgICAgIHNlbGYubWtwYXRoKG9zLnBhdGguZGlybmFtZSh0YXJnZXQpKQogICAgICAgICAgICAgICAgc3JjZmlsZSA9IG9zLnBhdGguam9pbihzcmNfZGlyLCBmaWxlbmFtZSkKICAgICAgICAgICAgICAgIG91dGYsIGNvcGllZCA9IHNlbGYuY29weV9maWxlKHNyY2ZpbGUsIHRhcmdldCkKICAgICAgICAgICAgICAgIHNyY2ZpbGUgPSBvcy5wYXRoLmFic3BhdGgoc3JjZmlsZSkKICAgICAgICAgICAgICAgIGlmIChjb3BpZWQgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgIHNyY2ZpbGUgaW4gc2VsZi5kaXN0cmlidXRpb24uY29udmVydF8ydG8zX2RvY3Rlc3RzKToKICAgICAgICAgICAgICAgICAgICBzZWxmLl9fZG9jdGVzdHNfMnRvMy5hcHBlbmQob3V0ZikKCiAgICBkZWYgYW5hbHl6ZV9tYW5pZmVzdChzZWxmKToKICAgICAgICBzZWxmLm1hbmlmZXN0X2ZpbGVzID0gbWYgPSB7fQogICAgICAgIGlmIG5vdCBzZWxmLmRpc3RyaWJ1dGlvbi5pbmNsdWRlX3BhY2thZ2VfZGF0YToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc3JjX2RpcnMgPSB7fQogICAgICAgIGZvciBwYWNrYWdlIGluIHNlbGYucGFja2FnZXMgb3IgKCk6CiAgICAgICAgICAgICMgTG9jYXRlIHBhY2thZ2Ugc291cmNlIGRpcmVjdG9yeQogICAgICAgICAgICBzcmNfZGlyc1thc3NlcnRfcmVsYXRpdmUoc2VsZi5nZXRfcGFja2FnZV9kaXIocGFja2FnZSkpXSA9IHBhY2thZ2UKCiAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnZWdnX2luZm8nKQogICAgICAgIGVpX2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdlZ2dfaW5mbycpCiAgICAgICAgZm9yIHBhdGggaW4gZWlfY21kLmZpbGVsaXN0LmZpbGVzOgogICAgICAgICAgICBkLCBmID0gb3MucGF0aC5zcGxpdChhc3NlcnRfcmVsYXRpdmUocGF0aCkpCiAgICAgICAgICAgIHByZXYgPSBOb25lCiAgICAgICAgICAgIG9sZGYgPSBmCiAgICAgICAgICAgIHdoaWxlIGQgYW5kIGQgIT0gcHJldiBhbmQgZCBub3QgaW4gc3JjX2RpcnM6CiAgICAgICAgICAgICAgICBwcmV2ID0gZAogICAgICAgICAgICAgICAgZCwgZGYgPSBvcy5wYXRoLnNwbGl0KGQpCiAgICAgICAgICAgICAgICBmID0gb3MucGF0aC5qb2luKGRmLCBmKQogICAgICAgICAgICBpZiBkIGluIHNyY19kaXJzOgogICAgICAgICAgICAgICAgaWYgcGF0aC5lbmRzd2l0aCgnLnB5JykgYW5kIGYgPT0gb2xkZjoKICAgICAgICAgICAgICAgICAgICBjb250aW51ZSAgIyBpdCdzIGEgbW9kdWxlLCBub3QgZGF0YQogICAgICAgICAgICAgICAgbWYuc2V0ZGVmYXVsdChzcmNfZGlyc1tkXSwgW10pLmFwcGVuZChwYXRoKQoKICAgIGRlZiBnZXRfZGF0YV9maWxlcyhzZWxmKToKICAgICAgICBwYXNzICAjIExhemlseSBjb21wdXRlIGRhdGEgZmlsZXMgaW4gX2dldF9kYXRhX2ZpbGVzKCkgZnVuY3Rpb24uCgogICAgZGVmIGNoZWNrX3BhY2thZ2Uoc2VsZiwgcGFja2FnZSwgcGFja2FnZV9kaXIpOgogICAgICAgICIiIkNoZWNrIG5hbWVzcGFjZSBwYWNrYWdlcycgX19pbml0X18gZm9yIGRlY2xhcmVfbmFtZXNwYWNlIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYWNrYWdlc19jaGVja2VkW3BhY2thZ2VdCiAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICBwYXNzCgogICAgICAgIGluaXRfcHkgPSBvcmlnLmJ1aWxkX3B5LmNoZWNrX3BhY2thZ2Uoc2VsZiwgcGFja2FnZSwgcGFja2FnZV9kaXIpCiAgICAgICAgc2VsZi5wYWNrYWdlc19jaGVja2VkW3BhY2thZ2VdID0gaW5pdF9weQoKICAgICAgICBpZiBub3QgaW5pdF9weSBvciBub3Qgc2VsZi5kaXN0cmlidXRpb24ubmFtZXNwYWNlX3BhY2thZ2VzOgogICAgICAgICAgICByZXR1cm4gaW5pdF9weQoKICAgICAgICBmb3IgcGtnIGluIHNlbGYuZGlzdHJpYnV0aW9uLm5hbWVzcGFjZV9wYWNrYWdlczoKICAgICAgICAgICAgaWYgcGtnID09IHBhY2thZ2Ugb3IgcGtnLnN0YXJ0c3dpdGgocGFja2FnZSArICcuJyk6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBpbml0X3B5CgogICAgICAgIHdpdGggaW8ub3Blbihpbml0X3B5LCAncmInKSBhcyBmOgogICAgICAgICAgICBjb250ZW50cyA9IGYucmVhZCgpCiAgICAgICAgaWYgYidkZWNsYXJlX25hbWVzcGFjZScgbm90IGluIGNvbnRlbnRzOgogICAgICAgICAgICByYWlzZSBkaXN0dXRpbHMuZXJyb3JzLkRpc3R1dGlsc0Vycm9yKAogICAgICAgICAgICAgICAgIk5hbWVzcGFjZSBwYWNrYWdlIHByb2JsZW06ICVzIGlzIGEgbmFtZXNwYWNlIHBhY2thZ2UsIGJ1dCAiCiAgICAgICAgICAgICAgICAiaXRzXG5fX2luaXRfXy5weSBkb2VzIG5vdCBjYWxsIGRlY2xhcmVfbmFtZXNwYWNlKCkhIFBsZWFzZSAiCiAgICAgICAgICAgICAgICAnZml4IGl0LlxuKFNlZSB0aGUgc2V0dXB0b29scyBtYW51YWwgdW5kZXIgJwogICAgICAgICAgICAgICAgJyJOYW1lc3BhY2UgUGFja2FnZXMiIGZvciBkZXRhaWxzLilcbiInICUgKHBhY2thZ2UsKQogICAgICAgICAgICApCiAgICAgICAgcmV0dXJuIGluaXRfcHkKCiAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIHNlbGYucGFja2FnZXNfY2hlY2tlZCA9IHt9CiAgICAgICAgb3JpZy5idWlsZF9weS5pbml0aWFsaXplX29wdGlvbnMoc2VsZikKCiAgICBkZWYgZ2V0X3BhY2thZ2VfZGlyKHNlbGYsIHBhY2thZ2UpOgogICAgICAgIHJlcyA9IG9yaWcuYnVpbGRfcHkuZ2V0X3BhY2thZ2VfZGlyKHNlbGYsIHBhY2thZ2UpCiAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24uc3JjX3Jvb3QgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oc2VsZi5kaXN0cmlidXRpb24uc3JjX3Jvb3QsIHJlcykKICAgICAgICByZXR1cm4gcmVzCgogICAgZGVmIGV4Y2x1ZGVfZGF0YV9maWxlcyhzZWxmLCBwYWNrYWdlLCBzcmNfZGlyLCBmaWxlcyk6CiAgICAgICAgIiIiRmlsdGVyIGZpbGVuYW1lcyBmb3IgcGFja2FnZSdzIGRhdGEgZmlsZXMgaW4gJ3NyY19kaXInIiIiCiAgICAgICAgZmlsZXMgPSBsaXN0KGZpbGVzKQogICAgICAgIHBhdHRlcm5zID0gc2VsZi5fZ2V0X3BsYXRmb3JtX3BhdHRlcm5zKAogICAgICAgICAgICBzZWxmLmV4Y2x1ZGVfcGFja2FnZV9kYXRhLAogICAgICAgICAgICBwYWNrYWdlLAogICAgICAgICAgICBzcmNfZGlyLAogICAgICAgICkKICAgICAgICBtYXRjaF9ncm91cHMgPSAoCiAgICAgICAgICAgIGZubWF0Y2guZmlsdGVyKGZpbGVzLCBwYXR0ZXJuKQogICAgICAgICAgICBmb3IgcGF0dGVybiBpbiBwYXR0ZXJucwogICAgICAgICkKICAgICAgICAjIGZsYXR0ZW4gdGhlIGdyb3VwcyBvZiBtYXRjaGVzIGludG8gYW4gaXRlcmFibGUgb2YgbWF0Y2hlcwogICAgICAgIG1hdGNoZXMgPSBpdGVydG9vbHMuY2hhaW4uZnJvbV9pdGVyYWJsZShtYXRjaF9ncm91cHMpCiAgICAgICAgYmFkID0gc2V0KG1hdGNoZXMpCiAgICAgICAga2VlcGVycyA9ICgKICAgICAgICAgICAgZm4KICAgICAgICAgICAgZm9yIGZuIGluIGZpbGVzCiAgICAgICAgICAgIGlmIGZuIG5vdCBpbiBiYWQKICAgICAgICApCiAgICAgICAgIyBkaXRjaCBkdXBlcwogICAgICAgIHJldHVybiBsaXN0KF91bmlxdWVfZXZlcnNlZW4oa2VlcGVycykpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9nZXRfcGxhdGZvcm1fcGF0dGVybnMoc3BlYywgcGFja2FnZSwgc3JjX2Rpcik6CiAgICAgICAgIiIiCiAgICAgICAgeWllbGQgcGxhdGZvcm0tc3BlY2lmaWMgcGF0aCBwYXR0ZXJucyAoc3VpdGFibGUgZm9yIGdsb2IKICAgICAgICBvciBmbl9tYXRjaCkgZnJvbSBhIGdsb2ItYmFzZWQgc3BlYyAoc3VjaCBhcwogICAgICAgIHNlbGYucGFja2FnZV9kYXRhIG9yIHNlbGYuZXhjbHVkZV9wYWNrYWdlX2RhdGEpCiAgICAgICAgbWF0Y2hpbmcgcGFja2FnZSBpbiBzcmNfZGlyLgogICAgICAgICIiIgogICAgICAgIHJhd19wYXR0ZXJucyA9IGl0ZXJ0b29scy5jaGFpbigKICAgICAgICAgICAgc3BlYy5nZXQoJycsIFtdKSwKICAgICAgICAgICAgc3BlYy5nZXQocGFja2FnZSwgW10pLAogICAgICAgICkKICAgICAgICByZXR1cm4gKAogICAgICAgICAgICAjIEVhY2ggcGF0dGVybiBoYXMgdG8gYmUgY29udmVydGVkIHRvIGEgcGxhdGZvcm0tc3BlY2lmaWMgcGF0aAogICAgICAgICAgICBvcy5wYXRoLmpvaW4oc3JjX2RpciwgY29udmVydF9wYXRoKHBhdHRlcm4pKQogICAgICAgICAgICBmb3IgcGF0dGVybiBpbiByYXdfcGF0dGVybnMKICAgICAgICApCgoKIyBmcm9tIFB5dGhvbiBkb2NzCmRlZiBfdW5pcXVlX2V2ZXJzZWVuKGl0ZXJhYmxlLCBrZXk9Tm9uZSk6CiAgICAiTGlzdCB1bmlxdWUgZWxlbWVudHMsIHByZXNlcnZpbmcgb3JkZXIuIFJlbWVtYmVyIGFsbCBlbGVtZW50cyBldmVyIHNlZW4uIgogICAgIyB1bmlxdWVfZXZlcnNlZW4oJ0FBQUFCQkJDQ0RBQUJCQicpIC0tPiBBIEIgQyBECiAgICAjIHVuaXF1ZV9ldmVyc2VlbignQUJCQ2NBRCcsIHN0ci5sb3dlcikgLS0+IEEgQiBDIEQKICAgIHNlZW4gPSBzZXQoKQogICAgc2Vlbl9hZGQgPSBzZWVuLmFkZAogICAgaWYga2V5IGlzIE5vbmU6CiAgICAgICAgZm9yIGVsZW1lbnQgaW4gZmlsdGVyZmFsc2Uoc2Vlbi5fX2NvbnRhaW5zX18sIGl0ZXJhYmxlKToKICAgICAgICAgICAgc2Vlbl9hZGQoZWxlbWVudCkKICAgICAgICAgICAgeWllbGQgZWxlbWVudAogICAgZWxzZToKICAgICAgICBmb3IgZWxlbWVudCBpbiBpdGVyYWJsZToKICAgICAgICAgICAgayA9IGtleShlbGVtZW50KQogICAgICAgICAgICBpZiBrIG5vdCBpbiBzZWVuOgogICAgICAgICAgICAgICAgc2Vlbl9hZGQoaykKICAgICAgICAgICAgICAgIHlpZWxkIGVsZW1lbnQKCgpkZWYgYXNzZXJ0X3JlbGF0aXZlKHBhdGgpOgogICAgaWYgbm90IG9zLnBhdGguaXNhYnMocGF0aCk6CiAgICAgICAgcmV0dXJuIHBhdGgKICAgIGZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzU2V0dXBFcnJvcgoKICAgIG1zZyA9IHRleHR3cmFwLmRlZGVudCgiIiIKICAgICAgICBFcnJvcjogc2V0dXAgc2NyaXB0IHNwZWNpZmllcyBhbiBhYnNvbHV0ZSBwYXRoOgoKICAgICAgICAgICAgJXMKCiAgICAgICAgc2V0dXAoKSBhcmd1bWVudHMgbXVzdCAqYWx3YXlzKiBiZSAvLXNlcGFyYXRlZCBwYXRocyByZWxhdGl2ZSB0byB0aGUKICAgICAgICBzZXR1cC5weSBkaXJlY3RvcnksICpuZXZlciogYWJzb2x1dGUgcGF0aHMuCiAgICAgICAgIiIiKS5sc3RyaXAoKSAlIHBhdGgKICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IobXNnKQpQSwMEFAAAAAAAAAAhANDN8z34HwAA+B8AAEIAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9jb21tYW5kL2RldmVsb3AucHlmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBjb252ZXJ0X3BhdGgKZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZwpmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc0Vycm9yLCBEaXN0dXRpbHNPcHRpb25FcnJvcgppbXBvcnQgb3MKaW1wb3J0IGdsb2IKaW1wb3J0IGlvCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuIGltcG9ydCBzaXgKCmltcG9ydCBwa2dfcmVzb3VyY2VzCmZyb20gc2V0dXB0b29scy5jb21tYW5kLmVhc3lfaW5zdGFsbCBpbXBvcnQgZWFzeV9pbnN0YWxsCmZyb20gc2V0dXB0b29scyBpbXBvcnQgbmFtZXNwYWNlcwppbXBvcnQgc2V0dXB0b29scwoKX19tZXRhY2xhc3NfXyA9IHR5cGUKCgpjbGFzcyBkZXZlbG9wKG5hbWVzcGFjZXMuRGV2ZWxvcEluc3RhbGxlciwgZWFzeV9pbnN0YWxsKToKICAgICIiIlNldCB1cCBwYWNrYWdlIGZvciBkZXZlbG9wbWVudCIiIgoKICAgIGRlc2NyaXB0aW9uID0gImluc3RhbGwgcGFja2FnZSBpbiAnZGV2ZWxvcG1lbnQgbW9kZSciCgogICAgdXNlcl9vcHRpb25zID0gZWFzeV9pbnN0YWxsLnVzZXJfb3B0aW9ucyArIFsKICAgICAgICAoInVuaW5zdGFsbCIsICJ1IiwgIlVuaW5zdGFsbCB0aGlzIHNvdXJjZSBwYWNrYWdlIiksCiAgICAgICAgKCJlZ2ctcGF0aD0iLCBOb25lLCAiU2V0IHRoZSBwYXRoIHRvIGJlIHVzZWQgaW4gdGhlIC5lZ2ctbGluayBmaWxlIiksCiAgICBdCgogICAgYm9vbGVhbl9vcHRpb25zID0gZWFzeV9pbnN0YWxsLmJvb2xlYW5fb3B0aW9ucyArIFsndW5pbnN0YWxsJ10KCiAgICBjb21tYW5kX2NvbnN1bWVzX2FyZ3VtZW50cyA9IEZhbHNlICAjIG92ZXJyaWRlIGJhc2UKCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgIGlmIHNlbGYudW5pbnN0YWxsOgogICAgICAgICAgICBzZWxmLm11bHRpX3ZlcnNpb24gPSBUcnVlCiAgICAgICAgICAgIHNlbGYudW5pbnN0YWxsX2xpbmsoKQogICAgICAgICAgICBzZWxmLnVuaW5zdGFsbF9uYW1lc3BhY2VzKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmluc3RhbGxfZm9yX2RldmVsb3BtZW50KCkKICAgICAgICBzZWxmLndhcm5fZGVwcmVjYXRlZF9vcHRpb25zKCkKCiAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIHNlbGYudW5pbnN0YWxsID0gTm9uZQogICAgICAgIHNlbGYuZWdnX3BhdGggPSBOb25lCiAgICAgICAgZWFzeV9pbnN0YWxsLmluaXRpYWxpemVfb3B0aW9ucyhzZWxmKQogICAgICAgIHNlbGYuc2V0dXBfcGF0aCA9IE5vbmUKICAgICAgICBzZWxmLmFsd2F5c19jb3B5X2Zyb20gPSAnLicgICMgYWx3YXlzIGNvcHkgZWdncyBpbnN0YWxsZWQgaW4gY3VyZGlyCgogICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgZWkgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgiZWdnX2luZm8iKQogICAgICAgIGlmIGVpLmJyb2tlbl9lZ2dfaW5mbzoKICAgICAgICAgICAgdGVtcGxhdGUgPSAiUGxlYXNlIHJlbmFtZSAlciB0byAlciBiZWZvcmUgdXNpbmcgJ2RldmVsb3AnIgogICAgICAgICAgICBhcmdzID0gZWkuZWdnX2luZm8sIGVpLmJyb2tlbl9lZ2dfaW5mbwogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcih0ZW1wbGF0ZSAlIGFyZ3MpCiAgICAgICAgc2VsZi5hcmdzID0gW2VpLmVnZ19uYW1lXQoKICAgICAgICBlYXN5X2luc3RhbGwuZmluYWxpemVfb3B0aW9ucyhzZWxmKQogICAgICAgIHNlbGYuZXhwYW5kX2Jhc2VkaXJzKCkKICAgICAgICBzZWxmLmV4cGFuZF9kaXJzKCkKICAgICAgICAjIHBpY2sgdXAgc2V0dXAtZGlyIC5lZ2cgZmlsZXMgb25seTogbm8gLmVnZy1pbmZvCiAgICAgICAgc2VsZi5wYWNrYWdlX2luZGV4LnNjYW4oZ2xvYi5nbG9iKCcqLmVnZycpKQoKICAgICAgICBlZ2dfbGlua19mbiA9IGVpLmVnZ19uYW1lICsgJy5lZ2ctbGluaycKICAgICAgICBzZWxmLmVnZ19saW5rID0gb3MucGF0aC5qb2luKHNlbGYuaW5zdGFsbF9kaXIsIGVnZ19saW5rX2ZuKQogICAgICAgIHNlbGYuZWdnX2Jhc2UgPSBlaS5lZ2dfYmFzZQogICAgICAgIGlmIHNlbGYuZWdnX3BhdGggaXMgTm9uZToKICAgICAgICAgICAgc2VsZi5lZ2dfcGF0aCA9IG9zLnBhdGguYWJzcGF0aChlaS5lZ2dfYmFzZSkKCiAgICAgICAgdGFyZ2V0ID0gcGtnX3Jlc291cmNlcy5ub3JtYWxpemVfcGF0aChzZWxmLmVnZ19iYXNlKQogICAgICAgIGVnZ19wYXRoID0gcGtnX3Jlc291cmNlcy5ub3JtYWxpemVfcGF0aCgKICAgICAgICAgICAgb3MucGF0aC5qb2luKHNlbGYuaW5zdGFsbF9kaXIsIHNlbGYuZWdnX3BhdGgpKQogICAgICAgIGlmIGVnZ19wYXRoICE9IHRhcmdldDoKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAiLS1lZ2ctcGF0aCBtdXN0IGJlIGEgcmVsYXRpdmUgcGF0aCBmcm9tIHRoZSBpbnN0YWxsIgogICAgICAgICAgICAgICAgIiBkaXJlY3RvcnkgdG8gIiArIHRhcmdldAogICAgICAgICAgICApCgogICAgICAgICMgTWFrZSBhIGRpc3RyaWJ1dGlvbiBmb3IgdGhlIHBhY2thZ2UncyBzb3VyY2UKICAgICAgICBzZWxmLmRpc3QgPSBwa2dfcmVzb3VyY2VzLkRpc3RyaWJ1dGlvbigKICAgICAgICAgICAgdGFyZ2V0LAogICAgICAgICAgICBwa2dfcmVzb3VyY2VzLlBhdGhNZXRhZGF0YSh0YXJnZXQsIG9zLnBhdGguYWJzcGF0aChlaS5lZ2dfaW5mbykpLAogICAgICAgICAgICBwcm9qZWN0X25hbWU9ZWkuZWdnX25hbWUKICAgICAgICApCgogICAgICAgIHNlbGYuc2V0dXBfcGF0aCA9IHNlbGYuX3Jlc29sdmVfc2V0dXBfcGF0aCgKICAgICAgICAgICAgc2VsZi5lZ2dfYmFzZSwKICAgICAgICAgICAgc2VsZi5pbnN0YWxsX2RpciwKICAgICAgICAgICAgc2VsZi5lZ2dfcGF0aCwKICAgICAgICApCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9yZXNvbHZlX3NldHVwX3BhdGgoZWdnX2Jhc2UsIGluc3RhbGxfZGlyLCBlZ2dfcGF0aCk6CiAgICAgICAgIiIiCiAgICAgICAgR2VuZXJhdGUgYSBwYXRoIGZyb20gZWdnX2Jhc2UgYmFjayB0byAnLicgd2hlcmUgdGhlCiAgICAgICAgc2V0dXAgc2NyaXB0IHJlc2lkZXMgYW5kIGVuc3VyZSB0aGF0IHBhdGggcG9pbnRzIHRvIHRoZQogICAgICAgIHNldHVwIHBhdGggZnJvbSAkaW5zdGFsbF9kaXIvJGVnZ19wYXRoLgogICAgICAgICIiIgogICAgICAgIHBhdGhfdG9fc2V0dXAgPSBlZ2dfYmFzZS5yZXBsYWNlKG9zLnNlcCwgJy8nKS5yc3RyaXAoJy8nKQogICAgICAgIGlmIHBhdGhfdG9fc2V0dXAgIT0gb3MuY3VyZGlyOgogICAgICAgICAgICBwYXRoX3RvX3NldHVwID0gJy4uLycgKiAocGF0aF90b19zZXR1cC5jb3VudCgnLycpICsgMSkKICAgICAgICByZXNvbHZlZCA9IHBrZ19yZXNvdXJjZXMubm9ybWFsaXplX3BhdGgoCiAgICAgICAgICAgIG9zLnBhdGguam9pbihpbnN0YWxsX2RpciwgZWdnX3BhdGgsIHBhdGhfdG9fc2V0dXApCiAgICAgICAgKQogICAgICAgIGlmIHJlc29sdmVkICE9IHBrZ19yZXNvdXJjZXMubm9ybWFsaXplX3BhdGgob3MuY3VyZGlyKToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAiQ2FuJ3QgZ2V0IGEgY29uc2lzdGVudCBwYXRoIHRvIHNldHVwIHNjcmlwdCBmcm9tIgogICAgICAgICAgICAgICAgIiBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IiwgcmVzb2x2ZWQsCiAgICAgICAgICAgICAgICBwa2dfcmVzb3VyY2VzLm5vcm1hbGl6ZV9wYXRoKG9zLmN1cmRpcikpCiAgICAgICAgcmV0dXJuIHBhdGhfdG9fc2V0dXAKCiAgICBkZWYgaW5zdGFsbF9mb3JfZGV2ZWxvcG1lbnQoc2VsZik6CiAgICAgICAgaWYgc2l4LlBZMyBhbmQgZ2V0YXR0cihzZWxmLmRpc3RyaWJ1dGlvbiwgJ3VzZV8ydG8zJywgRmFsc2UpOgogICAgICAgICAgICAjIElmIHdlIHJ1biAydG8zIHdlIGNhbiBub3QgZG8gdGhpcyBpbnBsYWNlOgoKICAgICAgICAgICAgIyBFbnN1cmUgbWV0YWRhdGEgaXMgdXAtdG8tZGF0ZQogICAgICAgICAgICBzZWxmLnJlaW5pdGlhbGl6ZV9jb21tYW5kKCdidWlsZF9weScsIGlucGxhY2U9MCkKICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnYnVpbGRfcHknKQogICAgICAgICAgICBicHlfY21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoImJ1aWxkX3B5IikKICAgICAgICAgICAgYnVpbGRfcGF0aCA9IHBrZ19yZXNvdXJjZXMubm9ybWFsaXplX3BhdGgoYnB5X2NtZC5idWlsZF9saWIpCgogICAgICAgICAgICAjIEJ1aWxkIGV4dGVuc2lvbnMKICAgICAgICAgICAgc2VsZi5yZWluaXRpYWxpemVfY29tbWFuZCgnZWdnX2luZm8nLCBlZ2dfYmFzZT1idWlsZF9wYXRoKQogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdlZ2dfaW5mbycpCgogICAgICAgICAgICBzZWxmLnJlaW5pdGlhbGl6ZV9jb21tYW5kKCdidWlsZF9leHQnLCBpbnBsYWNlPTApCiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2J1aWxkX2V4dCcpCgogICAgICAgICAgICAjIEZpeHVwIGVnZy1saW5rIGFuZCBlYXN5LWluc3RhbGwucHRoCiAgICAgICAgICAgIGVpX2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCJlZ2dfaW5mbyIpCiAgICAgICAgICAgIHNlbGYuZWdnX3BhdGggPSBidWlsZF9wYXRoCiAgICAgICAgICAgIHNlbGYuZGlzdC5sb2NhdGlvbiA9IGJ1aWxkX3BhdGgKICAgICAgICAgICAgIyBYWFgKICAgICAgICAgICAgc2VsZi5kaXN0Ll9wcm92aWRlciA9IHBrZ19yZXNvdXJjZXMuUGF0aE1ldGFkYXRhKAogICAgICAgICAgICAgICAgYnVpbGRfcGF0aCwgZWlfY21kLmVnZ19pbmZvKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgV2l0aG91dCAydG8zIGlucGxhY2Ugd29ya3MgZmluZToKICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnZWdnX2luZm8nKQoKICAgICAgICAgICAgIyBCdWlsZCBleHRlbnNpb25zIGluLXBsYWNlCiAgICAgICAgICAgIHNlbGYucmVpbml0aWFsaXplX2NvbW1hbmQoJ2J1aWxkX2V4dCcsIGlucGxhY2U9MSkKICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnYnVpbGRfZXh0JykKCiAgICAgICAgc2VsZi5pbnN0YWxsX3NpdGVfcHkoKSAgIyBlbnN1cmUgdGhhdCB0YXJnZXQgZGlyIGlzIHNpdGUtc2FmZQogICAgICAgIGlmIHNldHVwdG9vbHMuYm9vdHN0cmFwX2luc3RhbGxfZnJvbToKICAgICAgICAgICAgc2VsZi5lYXN5X2luc3RhbGwoc2V0dXB0b29scy5ib290c3RyYXBfaW5zdGFsbF9mcm9tKQogICAgICAgICAgICBzZXR1cHRvb2xzLmJvb3RzdHJhcF9pbnN0YWxsX2Zyb20gPSBOb25lCgogICAgICAgIHNlbGYuaW5zdGFsbF9uYW1lc3BhY2VzKCkKCiAgICAgICAgIyBjcmVhdGUgYW4gLmVnZy1saW5rIGluIHRoZSBpbnN0YWxsYXRpb24gZGlyLCBwb2ludGluZyB0byBvdXIgZWdnCiAgICAgICAgbG9nLmluZm8oIkNyZWF0aW5nICVzIChsaW5rIHRvICVzKSIsIHNlbGYuZWdnX2xpbmssIHNlbGYuZWdnX2Jhc2UpCiAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgd2l0aCBvcGVuKHNlbGYuZWdnX2xpbmssICJ3IikgYXMgZjoKICAgICAgICAgICAgICAgIGYud3JpdGUoc2VsZi5lZ2dfcGF0aCArICJcbiIgKyBzZWxmLnNldHVwX3BhdGgpCiAgICAgICAgIyBwb3N0cHJvY2VzcyB0aGUgaW5zdGFsbGVkIGRpc3RybywgZml4aW5nIHVwIC5wdGgsIGluc3RhbGxpbmcgc2NyaXB0cywKICAgICAgICAjIGFuZCBoYW5kbGluZyByZXF1aXJlbWVudHMKICAgICAgICBzZWxmLnByb2Nlc3NfZGlzdHJpYnV0aW9uKE5vbmUsIHNlbGYuZGlzdCwgbm90IHNlbGYubm9fZGVwcykKCiAgICBkZWYgdW5pbnN0YWxsX2xpbmsoc2VsZik6CiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoc2VsZi5lZ2dfbGluayk6CiAgICAgICAgICAgIGxvZy5pbmZvKCJSZW1vdmluZyAlcyAobGluayB0byAlcykiLCBzZWxmLmVnZ19saW5rLCBzZWxmLmVnZ19iYXNlKQogICAgICAgICAgICBlZ2dfbGlua19maWxlID0gb3BlbihzZWxmLmVnZ19saW5rKQogICAgICAgICAgICBjb250ZW50cyA9IFtsaW5lLnJzdHJpcCgpIGZvciBsaW5lIGluIGVnZ19saW5rX2ZpbGVdCiAgICAgICAgICAgIGVnZ19saW5rX2ZpbGUuY2xvc2UoKQogICAgICAgICAgICBpZiBjb250ZW50cyBub3QgaW4gKFtzZWxmLmVnZ19wYXRoXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZi5lZ2dfcGF0aCwgc2VsZi5zZXR1cF9wYXRoXSk6CiAgICAgICAgICAgICAgICBsb2cud2FybigiTGluayBwb2ludHMgdG8gJXM6IHVuaW5zdGFsbCBhYm9ydGVkIiwgY29udGVudHMpCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgICAgIG9zLnVubGluayhzZWxmLmVnZ19saW5rKQogICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgIHNlbGYudXBkYXRlX3B0aChzZWxmLmRpc3QpICAjIHJlbW92ZSBhbnkgLnB0aCBsaW5rIHRvIHVzCiAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24uc2NyaXB0czoKICAgICAgICAgICAgIyBYWFggc2hvdWxkIGFsc28gY2hlY2sgZm9yIGVudHJ5IHBvaW50IHNjcmlwdHMhCiAgICAgICAgICAgIGxvZy53YXJuKCJOb3RlOiB5b3UgbXVzdCB1bmluc3RhbGwgb3IgcmVwbGFjZSBzY3JpcHRzIG1hbnVhbGx5ISIpCgogICAgZGVmIGluc3RhbGxfZWdnX3NjcmlwdHMoc2VsZiwgZGlzdCk6CiAgICAgICAgaWYgZGlzdCBpcyBub3Qgc2VsZi5kaXN0OgogICAgICAgICAgICAjIEluc3RhbGxpbmcgYSBkZXBlbmRlbmN5LCBzbyBmYWxsIGJhY2sgdG8gbm9ybWFsIGJlaGF2aW9yCiAgICAgICAgICAgIHJldHVybiBlYXN5X2luc3RhbGwuaW5zdGFsbF9lZ2dfc2NyaXB0cyhzZWxmLCBkaXN0KQoKICAgICAgICAjIGNyZWF0ZSB3cmFwcGVyIHNjcmlwdHMgaW4gdGhlIHNjcmlwdCBkaXIsIHBvaW50aW5nIHRvIGRpc3Quc2NyaXB0cwoKICAgICAgICAjIG5ldy1zdHlsZS4uLgogICAgICAgIHNlbGYuaW5zdGFsbF93cmFwcGVyX3NjcmlwdHMoZGlzdCkKCiAgICAgICAgIyAuLi5hbmQgb2xkLXN0eWxlCiAgICAgICAgZm9yIHNjcmlwdF9uYW1lIGluIHNlbGYuZGlzdHJpYnV0aW9uLnNjcmlwdHMgb3IgW106CiAgICAgICAgICAgIHNjcmlwdF9wYXRoID0gb3MucGF0aC5hYnNwYXRoKGNvbnZlcnRfcGF0aChzY3JpcHRfbmFtZSkpCiAgICAgICAgICAgIHNjcmlwdF9uYW1lID0gb3MucGF0aC5iYXNlbmFtZShzY3JpcHRfcGF0aCkKICAgICAgICAgICAgd2l0aCBpby5vcGVuKHNjcmlwdF9wYXRoKSBhcyBzdHJtOgogICAgICAgICAgICAgICAgc2NyaXB0X3RleHQgPSBzdHJtLnJlYWQoKQogICAgICAgICAgICBzZWxmLmluc3RhbGxfc2NyaXB0KGRpc3QsIHNjcmlwdF9uYW1lLCBzY3JpcHRfdGV4dCwgc2NyaXB0X3BhdGgpCgogICAgZGVmIGluc3RhbGxfd3JhcHBlcl9zY3JpcHRzKHNlbGYsIGRpc3QpOgogICAgICAgIGRpc3QgPSBWZXJzaW9ubGVzc1JlcXVpcmVtZW50KGRpc3QpCiAgICAgICAgcmV0dXJuIGVhc3lfaW5zdGFsbC5pbnN0YWxsX3dyYXBwZXJfc2NyaXB0cyhzZWxmLCBkaXN0KQoKCmNsYXNzIFZlcnNpb25sZXNzUmVxdWlyZW1lbnQ6CiAgICAiIiIKICAgIEFkYXB0IGEgcGtnX3Jlc291cmNlcy5EaXN0cmlidXRpb24gdG8gc2ltcGx5IHJldHVybiB0aGUgcHJvamVjdAogICAgbmFtZSBhcyB0aGUgJ3JlcXVpcmVtZW50JyBzbyB0aGF0IHNjcmlwdHMgd2lsbCB3b3JrIGFjcm9zcwogICAgbXVsdGlwbGUgdmVyc2lvbnMuCgogICAgPj4+IGZyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgRGlzdHJpYnV0aW9uCiAgICA+Pj4gZGlzdCA9IERpc3RyaWJ1dGlvbihwcm9qZWN0X25hbWU9J2ZvbycsIHZlcnNpb249JzEuMCcpCiAgICA+Pj4gc3RyKGRpc3QuYXNfcmVxdWlyZW1lbnQoKSkKICAgICdmb289PTEuMCcKICAgID4+PiBhZGFwdGVkX2Rpc3QgPSBWZXJzaW9ubGVzc1JlcXVpcmVtZW50KGRpc3QpCiAgICA+Pj4gc3RyKGFkYXB0ZWRfZGlzdC5hc19yZXF1aXJlbWVudCgpKQogICAgJ2ZvbycKICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkaXN0KToKICAgICAgICBzZWxmLl9fZGlzdCA9IGRpc3QKCiAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSk6CiAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZi5fX2Rpc3QsIG5hbWUpCgogICAgZGVmIGFzX3JlcXVpcmVtZW50KHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnByb2plY3RfbmFtZQpQSwMEFAAAAAAAAAAhAP/o9pHAAwAAwAMAAEQAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9jb21tYW5kL2Rpc3RfaW5mby5weSIiIgpDcmVhdGUgYSBkaXN0X2luZm8gZGlyZWN0b3J5CkFzIGRlZmluZWQgaW4gdGhlIHdoZWVsIHNwZWNpZmljYXRpb24KIiIiCgppbXBvcnQgb3MKCmZyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IENvbW1hbmQKZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZwoKCmNsYXNzIGRpc3RfaW5mbyhDb21tYW5kKToKCiAgICBkZXNjcmlwdGlvbiA9ICdjcmVhdGUgYSAuZGlzdC1pbmZvIGRpcmVjdG9yeScKCiAgICB1c2VyX29wdGlvbnMgPSBbCiAgICAgICAgKCdlZ2ctYmFzZT0nLCAnZScsICJkaXJlY3RvcnkgY29udGFpbmluZyAuZWdnLWluZm8gZGlyZWN0b3JpZXMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKGRlZmF1bHQ6IHRvcCBvZiB0aGUgc291cmNlIHRyZWUpIiksCiAgICBdCgogICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBzZWxmLmVnZ19iYXNlID0gTm9uZQoKICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIHBhc3MKCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgIGVnZ19pbmZvID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2VnZ19pbmZvJykKICAgICAgICBlZ2dfaW5mby5lZ2dfYmFzZSA9IHNlbGYuZWdnX2Jhc2UKICAgICAgICBlZ2dfaW5mby5maW5hbGl6ZV9vcHRpb25zKCkKICAgICAgICBlZ2dfaW5mby5ydW4oKQogICAgICAgIGRpc3RfaW5mb19kaXIgPSBlZ2dfaW5mby5lZ2dfaW5mb1s6LWxlbignLmVnZy1pbmZvJyldICsgJy5kaXN0LWluZm8nCiAgICAgICAgbG9nLmluZm8oImNyZWF0aW5nICd7fSciLmZvcm1hdChvcy5wYXRoLmFic3BhdGgoZGlzdF9pbmZvX2RpcikpKQoKICAgICAgICBiZGlzdF93aGVlbCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdiZGlzdF93aGVlbCcpCiAgICAgICAgYmRpc3Rfd2hlZWwuZWdnMmRpc3QoZWdnX2luZm8uZWdnX2luZm8sIGRpc3RfaW5mb19kaXIpClBLAwQUAAAAAAAAACEAVmOaRfhVAQD4VQEARwAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2NvbW1hbmQvZWFzeV9pbnN0YWxsLnB5IyEvdXNyL2Jpbi9lbnYgcHl0aG9uCiIiIgpFYXN5IEluc3RhbGwKLS0tLS0tLS0tLS0tCgpBIHRvb2wgZm9yIGRvaW5nIGF1dG9tYXRpYyBkb3dubG9hZC9leHRyYWN0L2J1aWxkIG9mIGRpc3R1dGlscy1iYXNlZCBQeXRob24KcGFja2FnZXMuICBGb3IgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgRWFzeUluc3RhbGwudHh0CmZpbGUsIG9yIHZpc2l0IHRoZSBgRWFzeUluc3RhbGwgaG9tZSBwYWdlYF9fLgoKX18gaHR0cHM6Ly9zZXR1cHRvb2xzLnJlYWR0aGVkb2NzLmlvL2VuL2xhdGVzdC9lYXN5X2luc3RhbGwuaHRtbAoKIiIiCgpmcm9tIGdsb2IgaW1wb3J0IGdsb2IKZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgZ2V0X3BsYXRmb3JtCmZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGNvbnZlcnRfcGF0aCwgc3Vic3RfdmFycwpmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0ICgKICAgIERpc3R1dGlsc0FyZ0Vycm9yLCBEaXN0dXRpbHNPcHRpb25FcnJvciwKICAgIERpc3R1dGlsc0Vycm9yLCBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yLAopCmZyb20gZGlzdHV0aWxzLmNvbW1hbmQuaW5zdGFsbCBpbXBvcnQgSU5TVEFMTF9TQ0hFTUVTLCBTQ0hFTUVfS0VZUwpmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nLCBkaXJfdXRpbApmcm9tIGRpc3R1dGlscy5jb21tYW5kLmJ1aWxkX3NjcmlwdHMgaW1wb3J0IGZpcnN0X2xpbmVfcmUKZnJvbSBkaXN0dXRpbHMuc3Bhd24gaW1wb3J0IGZpbmRfZXhlY3V0YWJsZQppbXBvcnQgc3lzCmltcG9ydCBvcwppbXBvcnQgemlwaW1wb3J0CmltcG9ydCBzaHV0aWwKaW1wb3J0IHRlbXBmaWxlCmltcG9ydCB6aXBmaWxlCmltcG9ydCByZQppbXBvcnQgc3RhdAppbXBvcnQgcmFuZG9tCmltcG9ydCB0ZXh0d3JhcAppbXBvcnQgd2FybmluZ3MKaW1wb3J0IHNpdGUKaW1wb3J0IHN0cnVjdAppbXBvcnQgY29udGV4dGxpYgppbXBvcnQgc3VicHJvY2VzcwppbXBvcnQgc2hsZXgKaW1wb3J0IGlvCgoKZnJvbSBzeXNjb25maWcgaW1wb3J0IGdldF9jb25maWdfdmFycywgZ2V0X3BhdGgKCmZyb20gc2V0dXB0b29scyBpbXBvcnQgU2V0dXB0b29sc0RlcHJlY2F0aW9uV2FybmluZwoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybiBpbXBvcnQgc2l4CmZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4Lm1vdmVzIGltcG9ydCBjb25maWdwYXJzZXIsIG1hcAoKZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBDb21tYW5kCmZyb20gc2V0dXB0b29scy5zYW5kYm94IGltcG9ydCBydW5fc2V0dXAKZnJvbSBzZXR1cHRvb2xzLnB5Mjdjb21wYXQgaW1wb3J0IHJtdHJlZV9zYWZlCmZyb20gc2V0dXB0b29scy5jb21tYW5kIGltcG9ydCBzZXRvcHQKZnJvbSBzZXR1cHRvb2xzLmFyY2hpdmVfdXRpbCBpbXBvcnQgdW5wYWNrX2FyY2hpdmUKZnJvbSBzZXR1cHRvb2xzLnBhY2thZ2VfaW5kZXggaW1wb3J0ICgKICAgIFBhY2thZ2VJbmRleCwgcGFyc2VfcmVxdWlyZW1lbnRfYXJnLCBVUkxfU0NIRU1FLAopCmZyb20gc2V0dXB0b29scy5jb21tYW5kIGltcG9ydCBiZGlzdF9lZ2csIGVnZ19pbmZvCmZyb20gc2V0dXB0b29scy53aGVlbCBpbXBvcnQgV2hlZWwKZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCAoCiAgICB5aWVsZF9saW5lcywgbm9ybWFsaXplX3BhdGgsIHJlc291cmNlX3N0cmluZywgZW5zdXJlX2RpcmVjdG9yeSwKICAgIGdldF9kaXN0cmlidXRpb24sIGZpbmRfZGlzdHJpYnV0aW9ucywgRW52aXJvbm1lbnQsIFJlcXVpcmVtZW50LAogICAgRGlzdHJpYnV0aW9uLCBQYXRoTWV0YWRhdGEsIEVnZ01ldGFkYXRhLCBXb3JraW5nU2V0LCBEaXN0cmlidXRpb25Ob3RGb3VuZCwKICAgIFZlcnNpb25Db25mbGljdCwgREVWRUxPUF9ESVNULAopCmltcG9ydCBwa2dfcmVzb3VyY2VzLnB5MzFjb21wYXQKCl9fbWV0YWNsYXNzX18gPSB0eXBlCgojIFR1cm4gb24gUEVQNDQwV2FybmluZ3MKd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImRlZmF1bHQiLCBjYXRlZ29yeT1wa2dfcmVzb3VyY2VzLlBFUDQ0MFdhcm5pbmcpCgpfX2FsbF9fID0gWwogICAgJ3NhbWVmaWxlJywgJ2Vhc3lfaW5zdGFsbCcsICdQdGhEaXN0cmlidXRpb25zJywgJ2V4dHJhY3Rfd2luaW5zdF9jZmcnLAogICAgJ21haW4nLCAnZ2V0X2V4ZV9wcmVmaXhlcycsCl0KCgpkZWYgaXNfNjRiaXQoKToKICAgIHJldHVybiBzdHJ1Y3QuY2FsY3NpemUoIlAiKSA9PSA4CgoKZGVmIHNhbWVmaWxlKHAxLCBwMik6CiAgICAiIiIKICAgIERldGVybWluZSBpZiB0d28gcGF0aHMgcmVmZXJlbmNlIHRoZSBzYW1lIGZpbGUuCgogICAgQXVnbWVudHMgb3MucGF0aC5zYW1lZmlsZSB0byB3b3JrIG9uIFdpbmRvd3MgYW5kCiAgICBzdXBwcmVzc2VzIGVycm9ycyBpZiB0aGUgcGF0aCBkb2Vzbid0IGV4aXN0LgogICAgIiIiCiAgICBib3RoX2V4aXN0ID0gb3MucGF0aC5leGlzdHMocDEpIGFuZCBvcy5wYXRoLmV4aXN0cyhwMikKICAgIHVzZV9zYW1lZmlsZSA9IGhhc2F0dHIob3MucGF0aCwgJ3NhbWVmaWxlJykgYW5kIGJvdGhfZXhpc3QKICAgIGlmIHVzZV9zYW1lZmlsZToKICAgICAgICByZXR1cm4gb3MucGF0aC5zYW1lZmlsZShwMSwgcDIpCiAgICBub3JtX3AxID0gb3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLm5vcm1jYXNlKHAxKSkKICAgIG5vcm1fcDIgPSBvcy5wYXRoLm5vcm1wYXRoKG9zLnBhdGgubm9ybWNhc2UocDIpKQogICAgcmV0dXJuIG5vcm1fcDEgPT0gbm9ybV9wMgoKCmlmIHNpeC5QWTI6CgogICAgZGVmIF90b19ieXRlcyhzKToKICAgICAgICByZXR1cm4gcwoKICAgIGRlZiBpc2FzY2lpKHMpOgogICAgICAgIHRyeToKICAgICAgICAgICAgc2l4LnRleHRfdHlwZShzLCAnYXNjaWknKQogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIGV4Y2VwdCBVbmljb2RlRXJyb3I6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQplbHNlOgoKICAgIGRlZiBfdG9fYnl0ZXMocyk6CiAgICAgICAgcmV0dXJuIHMuZW5jb2RlKCd1dGY4JykKCiAgICBkZWYgaXNhc2NpaShzKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHMuZW5jb2RlKCdhc2NpaScpCiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgZXhjZXB0IFVuaWNvZGVFcnJvcjoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgoKX29uZV9saW5lciA9IGxhbWJkYSB0ZXh0OiB0ZXh0d3JhcC5kZWRlbnQodGV4dCkuc3RyaXAoKS5yZXBsYWNlKCdcbicsICc7ICcpCgoKY2xhc3MgZWFzeV9pbnN0YWxsKENvbW1hbmQpOgogICAgIiIiTWFuYWdlIGEgZG93bmxvYWQvYnVpbGQvaW5zdGFsbCBwcm9jZXNzIiIiCiAgICBkZXNjcmlwdGlvbiA9ICJGaW5kL2dldC9pbnN0YWxsIFB5dGhvbiBwYWNrYWdlcyIKICAgIGNvbW1hbmRfY29uc3VtZXNfYXJndW1lbnRzID0gVHJ1ZQoKICAgIHVzZXJfb3B0aW9ucyA9IFsKICAgICAgICAoJ3ByZWZpeD0nLCBOb25lLCAiaW5zdGFsbGF0aW9uIHByZWZpeCIpLAogICAgICAgICgiemlwLW9rIiwgInoiLCAiaW5zdGFsbCBwYWNrYWdlIGFzIGEgemlwZmlsZSIpLAogICAgICAgICgibXVsdGktdmVyc2lvbiIsICJtIiwgIm1ha2UgYXBwcyBoYXZlIHRvIHJlcXVpcmUoKSBhIHZlcnNpb24iKSwKICAgICAgICAoInVwZ3JhZGUiLCAiVSIsICJmb3JjZSB1cGdyYWRlIChzZWFyY2hlcyBQeVBJIGZvciBsYXRlc3QgdmVyc2lvbnMpIiksCiAgICAgICAgKCJpbnN0YWxsLWRpcj0iLCAiZCIsICJpbnN0YWxsIHBhY2thZ2UgdG8gRElSIiksCiAgICAgICAgKCJzY3JpcHQtZGlyPSIsICJzIiwgImluc3RhbGwgc2NyaXB0cyB0byBESVIiKSwKICAgICAgICAoImV4Y2x1ZGUtc2NyaXB0cyIsICJ4IiwgIkRvbid0IGluc3RhbGwgc2NyaXB0cyIpLAogICAgICAgICgiYWx3YXlzLWNvcHkiLCAiYSIsICJDb3B5IGFsbCBuZWVkZWQgcGFja2FnZXMgdG8gaW5zdGFsbCBkaXIiKSwKICAgICAgICAoImluZGV4LXVybD0iLCAiaSIsICJiYXNlIFVSTCBvZiBQeXRob24gUGFja2FnZSBJbmRleCIpLAogICAgICAgICgiZmluZC1saW5rcz0iLCAiZiIsICJhZGRpdGlvbmFsIFVSTChzKSB0byBzZWFyY2ggZm9yIHBhY2thZ2VzIiksCiAgICAgICAgKCJidWlsZC1kaXJlY3Rvcnk9IiwgImIiLAogICAgICAgICAiZG93bmxvYWQvZXh0cmFjdC9idWlsZCBpbiBESVI7IGtlZXAgdGhlIHJlc3VsdHMiKSwKICAgICAgICAoJ29wdGltaXplPScsICdPJywKICAgICAgICAgImFsc28gY29tcGlsZSB3aXRoIG9wdGltaXphdGlvbjogLU8xIGZvciBcInB5dGhvbiAtT1wiLCAiCiAgICAgICAgICItTzIgZm9yIFwicHl0aG9uIC1PT1wiLCBhbmQgLU8wIHRvIGRpc2FibGUgW2RlZmF1bHQ6IC1PMF0iKSwKICAgICAgICAoJ3JlY29yZD0nLCBOb25lLAogICAgICAgICAiZmlsZW5hbWUgaW4gd2hpY2ggdG8gcmVjb3JkIGxpc3Qgb2YgaW5zdGFsbGVkIGZpbGVzIiksCiAgICAgICAgKCdhbHdheXMtdW56aXAnLCAnWicsICJkb24ndCBpbnN0YWxsIGFzIGEgemlwZmlsZSwgbm8gbWF0dGVyIHdoYXQiKSwKICAgICAgICAoJ3NpdGUtZGlycz0nLCAnUycsICJsaXN0IG9mIGRpcmVjdG9yaWVzIHdoZXJlIC5wdGggZmlsZXMgd29yayIpLAogICAgICAgICgnZWRpdGFibGUnLCAnZScsICJJbnN0YWxsIHNwZWNpZmllZCBwYWNrYWdlcyBpbiBlZGl0YWJsZSBmb3JtIiksCiAgICAgICAgKCduby1kZXBzJywgJ04nLCAiZG9uJ3QgaW5zdGFsbCBkZXBlbmRlbmNpZXMiKSwKICAgICAgICAoJ2FsbG93LWhvc3RzPScsICdIJywgInBhdHRlcm4ocykgdGhhdCBob3N0bmFtZXMgbXVzdCBtYXRjaCIpLAogICAgICAgICgnbG9jYWwtc25hcHNob3RzLW9rJywgJ2wnLAogICAgICAgICAiYWxsb3cgYnVpbGRpbmcgZWdncyBmcm9tIGxvY2FsIGNoZWNrb3V0cyIpLAogICAgICAgICgndmVyc2lvbicsIE5vbmUsICJwcmludCB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0IiksCiAgICAgICAgKCduby1maW5kLWxpbmtzJywgTm9uZSwKICAgICAgICAgIkRvbid0IGxvYWQgZmluZC1saW5rcyBkZWZpbmVkIGluIHBhY2thZ2VzIGJlaW5nIGluc3RhbGxlZCIpCiAgICBdCiAgICBib29sZWFuX29wdGlvbnMgPSBbCiAgICAgICAgJ3ppcC1vaycsICdtdWx0aS12ZXJzaW9uJywgJ2V4Y2x1ZGUtc2NyaXB0cycsICd1cGdyYWRlJywgJ2Fsd2F5cy1jb3B5JywKICAgICAgICAnZWRpdGFibGUnLAogICAgICAgICduby1kZXBzJywgJ2xvY2FsLXNuYXBzaG90cy1vaycsICd2ZXJzaW9uJwogICAgXQoKICAgIGlmIHNpdGUuRU5BQkxFX1VTRVJfU0lURToKICAgICAgICBoZWxwX21zZyA9ICJpbnN0YWxsIGluIHVzZXIgc2l0ZS1wYWNrYWdlICclcyciICUgc2l0ZS5VU0VSX1NJVEUKICAgICAgICB1c2VyX29wdGlvbnMuYXBwZW5kKCgndXNlcicsIE5vbmUsIGhlbHBfbXNnKSkKICAgICAgICBib29sZWFuX29wdGlvbnMuYXBwZW5kKCd1c2VyJykKCiAgICBuZWdhdGl2ZV9vcHQgPSB7J2Fsd2F5cy11bnppcCc6ICd6aXAtb2snfQogICAgY3JlYXRlX2luZGV4ID0gUGFja2FnZUluZGV4CgogICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICAjIHRoZSAtLXVzZXIgb3B0aW9uIHNlZW1zIHRvIGJlIGFuIG9wdC1pbiBvbmUsCiAgICAgICAgIyBzbyB0aGUgZGVmYXVsdCBzaG91bGQgYmUgRmFsc2UuCiAgICAgICAgc2VsZi51c2VyID0gMAogICAgICAgIHNlbGYuemlwX29rID0gc2VsZi5sb2NhbF9zbmFwc2hvdHNfb2sgPSBOb25lCiAgICAgICAgc2VsZi5pbnN0YWxsX2RpciA9IHNlbGYuc2NyaXB0X2RpciA9IHNlbGYuZXhjbHVkZV9zY3JpcHRzID0gTm9uZQogICAgICAgIHNlbGYuaW5kZXhfdXJsID0gTm9uZQogICAgICAgIHNlbGYuZmluZF9saW5rcyA9IE5vbmUKICAgICAgICBzZWxmLmJ1aWxkX2RpcmVjdG9yeSA9IE5vbmUKICAgICAgICBzZWxmLmFyZ3MgPSBOb25lCiAgICAgICAgc2VsZi5vcHRpbWl6ZSA9IHNlbGYucmVjb3JkID0gTm9uZQogICAgICAgIHNlbGYudXBncmFkZSA9IHNlbGYuYWx3YXlzX2NvcHkgPSBzZWxmLm11bHRpX3ZlcnNpb24gPSBOb25lCiAgICAgICAgc2VsZi5lZGl0YWJsZSA9IHNlbGYubm9fZGVwcyA9IHNlbGYuYWxsb3dfaG9zdHMgPSBOb25lCiAgICAgICAgc2VsZi5yb290ID0gc2VsZi5wcmVmaXggPSBzZWxmLm5vX3JlcG9ydCA9IE5vbmUKICAgICAgICBzZWxmLnZlcnNpb24gPSBOb25lCiAgICAgICAgc2VsZi5pbnN0YWxsX3B1cmVsaWIgPSBOb25lICAjIGZvciBwdXJlIG1vZHVsZSBkaXN0cmlidXRpb25zCiAgICAgICAgc2VsZi5pbnN0YWxsX3BsYXRsaWIgPSBOb25lICAjIG5vbi1wdXJlIChkaXN0cyB3LyBleHRlbnNpb25zKQogICAgICAgIHNlbGYuaW5zdGFsbF9oZWFkZXJzID0gTm9uZSAgIyBmb3IgQy9DKysgaGVhZGVycwogICAgICAgIHNlbGYuaW5zdGFsbF9saWIgPSBOb25lICAjIHNldCB0byBlaXRoZXIgcHVyZWxpYiBvciBwbGF0bGliCiAgICAgICAgc2VsZi5pbnN0YWxsX3NjcmlwdHMgPSBOb25lCiAgICAgICAgc2VsZi5pbnN0YWxsX2RhdGEgPSBOb25lCiAgICAgICAgc2VsZi5pbnN0YWxsX2Jhc2UgPSBOb25lCiAgICAgICAgc2VsZi5pbnN0YWxsX3BsYXRiYXNlID0gTm9uZQogICAgICAgIGlmIHNpdGUuRU5BQkxFX1VTRVJfU0lURToKICAgICAgICAgICAgc2VsZi5pbnN0YWxsX3VzZXJiYXNlID0gc2l0ZS5VU0VSX0JBU0UKICAgICAgICAgICAgc2VsZi5pbnN0YWxsX3VzZXJzaXRlID0gc2l0ZS5VU0VSX1NJVEUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmluc3RhbGxfdXNlcmJhc2UgPSBOb25lCiAgICAgICAgICAgIHNlbGYuaW5zdGFsbF91c2Vyc2l0ZSA9IE5vbmUKICAgICAgICBzZWxmLm5vX2ZpbmRfbGlua3MgPSBOb25lCgogICAgICAgICMgT3B0aW9ucyBub3Qgc3BlY2lmaWFibGUgdmlhIGNvbW1hbmQgbGluZQogICAgICAgIHNlbGYucGFja2FnZV9pbmRleCA9IE5vbmUKICAgICAgICBzZWxmLnB0aF9maWxlID0gc2VsZi5hbHdheXNfY29weV9mcm9tID0gTm9uZQogICAgICAgIHNlbGYuc2l0ZV9kaXJzID0gTm9uZQogICAgICAgIHNlbGYuaW5zdGFsbGVkX3Byb2plY3RzID0ge30KICAgICAgICBzZWxmLnNpdGVweV9pbnN0YWxsZWQgPSBGYWxzZQogICAgICAgICMgQWx3YXlzIHJlYWQgZWFzeV9pbnN0YWxsIG9wdGlvbnMsIGV2ZW4gaWYgd2UgYXJlIHN1YmNsYXNzZWQsIG9yIGhhdmUKICAgICAgICAjIGFuIGluZGVwZW5kZW50IGluc3RhbmNlIGNyZWF0ZWQuICBUaGlzIGVuc3VyZXMgdGhhdCBkZWZhdWx0cyB3aWxsCiAgICAgICAgIyBhbHdheXMgY29tZSBmcm9tIHRoZSBzdGFuZGFyZCBjb25maWd1cmF0aW9uIGZpbGUocyknICJlYXN5X2luc3RhbGwiCiAgICAgICAgIyBzZWN0aW9uLCBldmVuIGlmIHRoaXMgaXMgYSAiZGV2ZWxvcCIgb3IgImluc3RhbGwiIGNvbW1hbmQsIG9yIHNvbWUKICAgICAgICAjIG90aGVyIGVtYmVkZGluZy4KICAgICAgICBzZWxmLl9kcnlfcnVuID0gTm9uZQogICAgICAgIHNlbGYudmVyYm9zZSA9IHNlbGYuZGlzdHJpYnV0aW9uLnZlcmJvc2UKICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbi5fc2V0X2NvbW1hbmRfb3B0aW9ucygKICAgICAgICAgICAgc2VsZiwgc2VsZi5kaXN0cmlidXRpb24uZ2V0X29wdGlvbl9kaWN0KCdlYXN5X2luc3RhbGwnKQogICAgICAgICkKCiAgICBkZWYgZGVsZXRlX2Jsb2NrZXJzKHNlbGYsIGJsb2NrZXJzKToKICAgICAgICBleHRhbnRfYmxvY2tlcnMgPSAoCiAgICAgICAgICAgIGZpbGVuYW1lIGZvciBmaWxlbmFtZSBpbiBibG9ja2VycwogICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhmaWxlbmFtZSkgb3Igb3MucGF0aC5pc2xpbmsoZmlsZW5hbWUpCiAgICAgICAgKQogICAgICAgIGxpc3QobWFwKHNlbGYuX2RlbGV0ZV9wYXRoLCBleHRhbnRfYmxvY2tlcnMpKQoKICAgIGRlZiBfZGVsZXRlX3BhdGgoc2VsZiwgcGF0aCk6CiAgICAgICAgbG9nLmluZm8oIkRlbGV0aW5nICVzIiwgcGF0aCkKICAgICAgICBpZiBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBpc190cmVlID0gb3MucGF0aC5pc2RpcihwYXRoKSBhbmQgbm90IG9zLnBhdGguaXNsaW5rKHBhdGgpCiAgICAgICAgcmVtb3ZlciA9IHJtdHJlZSBpZiBpc190cmVlIGVsc2Ugb3MudW5saW5rCiAgICAgICAgcmVtb3ZlcihwYXRoKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfcmVuZGVyX3ZlcnNpb24oKToKICAgICAgICAiIiIKICAgICAgICBSZW5kZXIgdGhlIFNldHVwdG9vbHMgdmVyc2lvbiBhbmQgaW5zdGFsbGF0aW9uIGRldGFpbHMsIHRoZW4gZXhpdC4KICAgICAgICAiIiIKICAgICAgICB2ZXIgPSAne30ue30nLmZvcm1hdCgqc3lzLnZlcnNpb25faW5mbykKICAgICAgICBkaXN0ID0gZ2V0X2Rpc3RyaWJ1dGlvbignc2V0dXB0b29scycpCiAgICAgICAgdG1wbCA9ICdzZXR1cHRvb2xzIHtkaXN0LnZlcnNpb259IGZyb20ge2Rpc3QubG9jYXRpb259IChQeXRob24ge3Zlcn0pJwogICAgICAgIHByaW50KHRtcGwuZm9ybWF0KCoqbG9jYWxzKCkpKQogICAgICAgIHJhaXNlIFN5c3RlbUV4aXQoKQoKICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIHNlbGYudmVyc2lvbiBhbmQgc2VsZi5fcmVuZGVyX3ZlcnNpb24oKQoKICAgICAgICBweV92ZXJzaW9uID0gc3lzLnZlcnNpb24uc3BsaXQoKVswXQogICAgICAgIHByZWZpeCwgZXhlY19wcmVmaXggPSBnZXRfY29uZmlnX3ZhcnMoJ3ByZWZpeCcsICdleGVjX3ByZWZpeCcpCgogICAgICAgIHNlbGYuY29uZmlnX3ZhcnMgPSB7CiAgICAgICAgICAgICdkaXN0X25hbWUnOiBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfbmFtZSgpLAogICAgICAgICAgICAnZGlzdF92ZXJzaW9uJzogc2VsZi5kaXN0cmlidXRpb24uZ2V0X3ZlcnNpb24oKSwKICAgICAgICAgICAgJ2Rpc3RfZnVsbG5hbWUnOiBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfZnVsbG5hbWUoKSwKICAgICAgICAgICAgJ3B5X3ZlcnNpb24nOiBweV92ZXJzaW9uLAogICAgICAgICAgICAncHlfdmVyc2lvbl9zaG9ydCc6IHB5X3ZlcnNpb25bMDozXSwKICAgICAgICAgICAgJ3B5X3ZlcnNpb25fbm9kb3QnOiBweV92ZXJzaW9uWzBdICsgcHlfdmVyc2lvblsyXSwKICAgICAgICAgICAgJ3N5c19wcmVmaXgnOiBwcmVmaXgsCiAgICAgICAgICAgICdwcmVmaXgnOiBwcmVmaXgsCiAgICAgICAgICAgICdzeXNfZXhlY19wcmVmaXgnOiBleGVjX3ByZWZpeCwKICAgICAgICAgICAgJ2V4ZWNfcHJlZml4JzogZXhlY19wcmVmaXgsCiAgICAgICAgICAgICMgT25seSBweXRob24gMy4yKyBoYXMgYWJpZmxhZ3MKICAgICAgICAgICAgJ2FiaWZsYWdzJzogZ2V0YXR0cihzeXMsICdhYmlmbGFncycsICcnKSwKICAgICAgICB9CgogICAgICAgIGlmIHNpdGUuRU5BQkxFX1VTRVJfU0lURToKICAgICAgICAgICAgc2VsZi5jb25maWdfdmFyc1sndXNlcmJhc2UnXSA9IHNlbGYuaW5zdGFsbF91c2VyYmFzZQogICAgICAgICAgICBzZWxmLmNvbmZpZ192YXJzWyd1c2Vyc2l0ZSddID0gc2VsZi5pbnN0YWxsX3VzZXJzaXRlCgogICAgICAgIHNlbGYuX2ZpeF9pbnN0YWxsX2Rpcl9mb3JfdXNlcl9zaXRlKCkKCiAgICAgICAgc2VsZi5leHBhbmRfYmFzZWRpcnMoKQogICAgICAgIHNlbGYuZXhwYW5kX2RpcnMoKQoKICAgICAgICBzZWxmLl9leHBhbmQoCiAgICAgICAgICAgICdpbnN0YWxsX2RpcicsICdzY3JpcHRfZGlyJywgJ2J1aWxkX2RpcmVjdG9yeScsCiAgICAgICAgICAgICdzaXRlX2RpcnMnLAogICAgICAgICkKICAgICAgICAjIElmIGEgbm9uLWRlZmF1bHQgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSB3YXMgc3BlY2lmaWVkLCBkZWZhdWx0IHRoZQogICAgICAgICMgc2NyaXB0IGRpcmVjdG9yeSB0byBtYXRjaCBpdC4KICAgICAgICBpZiBzZWxmLnNjcmlwdF9kaXIgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi5zY3JpcHRfZGlyID0gc2VsZi5pbnN0YWxsX2RpcgoKICAgICAgICBpZiBzZWxmLm5vX2ZpbmRfbGlua3MgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi5ub19maW5kX2xpbmtzID0gRmFsc2UKCiAgICAgICAgIyBMZXQgaW5zdGFsbF9kaXIgZ2V0IHNldCBieSBpbnN0YWxsX2xpYiBjb21tYW5kLCB3aGljaCBpbiB0dXJuCiAgICAgICAgIyBnZXRzIGl0cyBpbmZvIGZyb20gdGhlIGluc3RhbGwgY29tbWFuZCwgYW5kIHRha2VzIGludG8gYWNjb3VudAogICAgICAgICMgLS1wcmVmaXggYW5kIC0taG9tZSBhbmQgYWxsIHRoYXQgb3RoZXIgY3J1ZC4KICAgICAgICBzZWxmLnNldF91bmRlZmluZWRfb3B0aW9ucygKICAgICAgICAgICAgJ2luc3RhbGxfbGliJywgKCdpbnN0YWxsX2RpcicsICdpbnN0YWxsX2RpcicpCiAgICAgICAgKQogICAgICAgICMgTGlrZXdpc2UsIHNldCBkZWZhdWx0IHNjcmlwdF9kaXIgZnJvbSAnaW5zdGFsbF9zY3JpcHRzLmluc3RhbGxfZGlyJwogICAgICAgIHNlbGYuc2V0X3VuZGVmaW5lZF9vcHRpb25zKAogICAgICAgICAgICAnaW5zdGFsbF9zY3JpcHRzJywgKCdpbnN0YWxsX2RpcicsICdzY3JpcHRfZGlyJykKICAgICAgICApCgogICAgICAgIGlmIHNlbGYudXNlciBhbmQgc2VsZi5pbnN0YWxsX3B1cmVsaWI6CiAgICAgICAgICAgIHNlbGYuaW5zdGFsbF9kaXIgPSBzZWxmLmluc3RhbGxfcHVyZWxpYgogICAgICAgICAgICBzZWxmLnNjcmlwdF9kaXIgPSBzZWxmLmluc3RhbGxfc2NyaXB0cwogICAgICAgICMgZGVmYXVsdCAtLXJlY29yZCBmcm9tIHRoZSBpbnN0YWxsIGNvbW1hbmQKICAgICAgICBzZWxmLnNldF91bmRlZmluZWRfb3B0aW9ucygnaW5zdGFsbCcsICgncmVjb3JkJywgJ3JlY29yZCcpKQogICAgICAgICMgU2hvdWxkIHRoaXMgYmUgbW92ZWQgdG8gdGhlIGlmIHN0YXRlbWVudCBiZWxvdz8gSXQncyBub3QgdXNlZAogICAgICAgICMgZWxzZXdoZXJlCiAgICAgICAgbm9ybXBhdGggPSBtYXAobm9ybWFsaXplX3BhdGgsIHN5cy5wYXRoKQogICAgICAgIHNlbGYuYWxsX3NpdGVfZGlycyA9IGdldF9zaXRlX2RpcnMoKQogICAgICAgIGlmIHNlbGYuc2l0ZV9kaXJzIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzaXRlX2RpcnMgPSBbCiAgICAgICAgICAgICAgICBvcy5wYXRoLmV4cGFuZHVzZXIocy5zdHJpcCgpKSBmb3IgcyBpbgogICAgICAgICAgICAgICAgc2VsZi5zaXRlX2RpcnMuc3BsaXQoJywnKQogICAgICAgICAgICBdCiAgICAgICAgICAgIGZvciBkIGluIHNpdGVfZGlyczoKICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKGQpOgogICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCIlcyAoaW4gLS1zaXRlLWRpcnMpIGRvZXMgbm90IGV4aXN0IiwgZCkKICAgICAgICAgICAgICAgIGVsaWYgbm9ybWFsaXplX3BhdGgoZCkgbm90IGluIG5vcm1wYXRoOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICBkICsgIiAoaW4gLS1zaXRlLWRpcnMpIGlzIG5vdCBvbiBzeXMucGF0aCIKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHNlbGYuYWxsX3NpdGVfZGlycy5hcHBlbmQobm9ybWFsaXplX3BhdGgoZCkpCiAgICAgICAgaWYgbm90IHNlbGYuZWRpdGFibGU6CiAgICAgICAgICAgIHNlbGYuY2hlY2tfc2l0ZV9kaXIoKQogICAgICAgIHNlbGYuaW5kZXhfdXJsID0gc2VsZi5pbmRleF91cmwgb3IgImh0dHBzOi8vcHlwaS5vcmcvc2ltcGxlLyIKICAgICAgICBzZWxmLnNoYWRvd19wYXRoID0gc2VsZi5hbGxfc2l0ZV9kaXJzWzpdCiAgICAgICAgZm9yIHBhdGhfaXRlbSBpbiBzZWxmLmluc3RhbGxfZGlyLCBub3JtYWxpemVfcGF0aChzZWxmLnNjcmlwdF9kaXIpOgogICAgICAgICAgICBpZiBwYXRoX2l0ZW0gbm90IGluIHNlbGYuc2hhZG93X3BhdGg6CiAgICAgICAgICAgICAgICBzZWxmLnNoYWRvd19wYXRoLmluc2VydCgwLCBwYXRoX2l0ZW0pCgogICAgICAgIGlmIHNlbGYuYWxsb3dfaG9zdHMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGhvc3RzID0gW3Muc3RyaXAoKSBmb3IgcyBpbiBzZWxmLmFsbG93X2hvc3RzLnNwbGl0KCcsJyldCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaG9zdHMgPSBbJyonXQogICAgICAgIGlmIHNlbGYucGFja2FnZV9pbmRleCBpcyBOb25lOgogICAgICAgICAgICBzZWxmLnBhY2thZ2VfaW5kZXggPSBzZWxmLmNyZWF0ZV9pbmRleCgKICAgICAgICAgICAgICAgIHNlbGYuaW5kZXhfdXJsLCBzZWFyY2hfcGF0aD1zZWxmLnNoYWRvd19wYXRoLCBob3N0cz1ob3N0cywKICAgICAgICAgICAgKQogICAgICAgIHNlbGYubG9jYWxfaW5kZXggPSBFbnZpcm9ubWVudChzZWxmLnNoYWRvd19wYXRoICsgc3lzLnBhdGgpCgogICAgICAgIGlmIHNlbGYuZmluZF9saW5rcyBpcyBub3QgTm9uZToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLmZpbmRfbGlua3MsIHNpeC5zdHJpbmdfdHlwZXMpOgogICAgICAgICAgICAgICAgc2VsZi5maW5kX2xpbmtzID0gc2VsZi5maW5kX2xpbmtzLnNwbGl0KCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmZpbmRfbGlua3MgPSBbXQogICAgICAgIGlmIHNlbGYubG9jYWxfc25hcHNob3RzX29rOgogICAgICAgICAgICBzZWxmLnBhY2thZ2VfaW5kZXguc2Nhbl9lZ2dfbGlua3Moc2VsZi5zaGFkb3dfcGF0aCArIHN5cy5wYXRoKQogICAgICAgIGlmIG5vdCBzZWxmLm5vX2ZpbmRfbGlua3M6CiAgICAgICAgICAgIHNlbGYucGFja2FnZV9pbmRleC5hZGRfZmluZF9saW5rcyhzZWxmLmZpbmRfbGlua3MpCiAgICAgICAgc2VsZi5zZXRfdW5kZWZpbmVkX29wdGlvbnMoJ2luc3RhbGxfbGliJywgKCdvcHRpbWl6ZScsICdvcHRpbWl6ZScpKQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHNlbGYub3B0aW1pemUsIGludCk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHNlbGYub3B0aW1pemUgPSBpbnQoc2VsZi5vcHRpbWl6ZSkKICAgICAgICAgICAgICAgIGlmIG5vdCAoMCA8PSBzZWxmLm9wdGltaXplIDw9IDIpOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IKICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigiLS1vcHRpbWl6ZSBtdXN0IGJlIDAsIDEsIG9yIDIiKQoKICAgICAgICBpZiBzZWxmLmVkaXRhYmxlIGFuZCBub3Qgc2VsZi5idWlsZF9kaXJlY3Rvcnk6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0FyZ0Vycm9yKAogICAgICAgICAgICAgICAgIk11c3Qgc3BlY2lmeSBhIGJ1aWxkIGRpcmVjdG9yeSAoLWIpIHdoZW4gdXNpbmcgLS1lZGl0YWJsZSIKICAgICAgICAgICAgKQogICAgICAgIGlmIG5vdCBzZWxmLmFyZ3M6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0FyZ0Vycm9yKAogICAgICAgICAgICAgICAgIk5vIHVybHMsIGZpbGVuYW1lcywgb3IgcmVxdWlyZW1lbnRzIHNwZWNpZmllZCAoc2VlIC0taGVscCkiKQoKICAgICAgICBzZWxmLm91dHB1dHMgPSBbXQoKICAgIGRlZiBfZml4X2luc3RhbGxfZGlyX2Zvcl91c2VyX3NpdGUoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgRml4IHRoZSBpbnN0YWxsX2RpciBpZiAiLS11c2VyIiB3YXMgdXNlZC4KICAgICAgICAiIiIKICAgICAgICBpZiBub3Qgc2VsZi51c2VyIG9yIG5vdCBzaXRlLkVOQUJMRV9VU0VSX1NJVEU6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBzZWxmLmNyZWF0ZV9ob21lX3BhdGgoKQogICAgICAgIGlmIHNlbGYuaW5zdGFsbF91c2VyYmFzZSBpcyBOb25lOgogICAgICAgICAgICBtc2cgPSAiVXNlciBiYXNlIGRpcmVjdG9yeSBpcyBub3Qgc3BlY2lmaWVkIgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yKG1zZykKICAgICAgICBzZWxmLmluc3RhbGxfYmFzZSA9IHNlbGYuaW5zdGFsbF9wbGF0YmFzZSA9IHNlbGYuaW5zdGFsbF91c2VyYmFzZQogICAgICAgIHNjaGVtZV9uYW1lID0gb3MubmFtZS5yZXBsYWNlKCdwb3NpeCcsICd1bml4JykgKyAnX3VzZXInCiAgICAgICAgc2VsZi5zZWxlY3Rfc2NoZW1lKHNjaGVtZV9uYW1lKQoKICAgIGRlZiBfZXhwYW5kX2F0dHJzKHNlbGYsIGF0dHJzKToKICAgICAgICBmb3IgYXR0ciBpbiBhdHRyczoKICAgICAgICAgICAgdmFsID0gZ2V0YXR0cihzZWxmLCBhdHRyKQogICAgICAgICAgICBpZiB2YWwgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBpZiBvcy5uYW1lID09ICdwb3NpeCcgb3Igb3MubmFtZSA9PSAnbnQnOgogICAgICAgICAgICAgICAgICAgIHZhbCA9IG9zLnBhdGguZXhwYW5kdXNlcih2YWwpCiAgICAgICAgICAgICAgICB2YWwgPSBzdWJzdF92YXJzKHZhbCwgc2VsZi5jb25maWdfdmFycykKICAgICAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgYXR0ciwgdmFsKQoKICAgIGRlZiBleHBhbmRfYmFzZWRpcnMoc2VsZik6CiAgICAgICAgIiIiQ2FsbHMgYG9zLnBhdGguZXhwYW5kdXNlcmAgb24gaW5zdGFsbF9iYXNlLCBpbnN0YWxsX3BsYXRiYXNlIGFuZAogICAgICAgIHJvb3QuIiIiCiAgICAgICAgc2VsZi5fZXhwYW5kX2F0dHJzKFsnaW5zdGFsbF9iYXNlJywgJ2luc3RhbGxfcGxhdGJhc2UnLCAncm9vdCddKQoKICAgIGRlZiBleHBhbmRfZGlycyhzZWxmKToKICAgICAgICAiIiJDYWxscyBgb3MucGF0aC5leHBhbmR1c2VyYCBvbiBpbnN0YWxsIGRpcnMuIiIiCiAgICAgICAgZGlycyA9IFsKICAgICAgICAgICAgJ2luc3RhbGxfcHVyZWxpYicsCiAgICAgICAgICAgICdpbnN0YWxsX3BsYXRsaWInLAogICAgICAgICAgICAnaW5zdGFsbF9saWInLAogICAgICAgICAgICAnaW5zdGFsbF9oZWFkZXJzJywKICAgICAgICAgICAgJ2luc3RhbGxfc2NyaXB0cycsCiAgICAgICAgICAgICdpbnN0YWxsX2RhdGEnLAogICAgICAgIF0KICAgICAgICBzZWxmLl9leHBhbmRfYXR0cnMoZGlycykKCiAgICBkZWYgcnVuKHNlbGYsIHNob3dfZGVwcmVjYXRpb249VHJ1ZSk6CiAgICAgICAgaWYgc2hvd19kZXByZWNhdGlvbjoKICAgICAgICAgICAgc2VsZi5hbm5vdW5jZSgKICAgICAgICAgICAgICAgICJXQVJOSU5HOiBUaGUgZWFzeV9pbnN0YWxsIGNvbW1hbmQgaXMgZGVwcmVjYXRlZCAiCiAgICAgICAgICAgICAgICAiYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uLiIKICAgICAgICAgICAgICAgICwgbG9nLldBUk4sCiAgICAgICAgICAgICkKICAgICAgICBpZiBzZWxmLnZlcmJvc2UgIT0gc2VsZi5kaXN0cmlidXRpb24udmVyYm9zZToKICAgICAgICAgICAgbG9nLnNldF92ZXJib3NpdHkoc2VsZi52ZXJib3NlKQogICAgICAgIHRyeToKICAgICAgICAgICAgZm9yIHNwZWMgaW4gc2VsZi5hcmdzOgogICAgICAgICAgICAgICAgc2VsZi5lYXN5X2luc3RhbGwoc3BlYywgbm90IHNlbGYubm9fZGVwcykKICAgICAgICAgICAgaWYgc2VsZi5yZWNvcmQ6CiAgICAgICAgICAgICAgICBvdXRwdXRzID0gc2VsZi5vdXRwdXRzCiAgICAgICAgICAgICAgICBpZiBzZWxmLnJvb3Q6ICAjIHN0cmlwIGFueSBwYWNrYWdlIHByZWZpeAogICAgICAgICAgICAgICAgICAgIHJvb3RfbGVuID0gbGVuKHNlbGYucm9vdCkKICAgICAgICAgICAgICAgICAgICBmb3IgY291bnRlciBpbiByYW5nZShsZW4ob3V0cHV0cykpOgogICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRzW2NvdW50ZXJdID0gb3V0cHV0c1tjb3VudGVyXVtyb290X2xlbjpdCiAgICAgICAgICAgICAgICBmcm9tIGRpc3R1dGlscyBpbXBvcnQgZmlsZV91dGlsCgogICAgICAgICAgICAgICAgc2VsZi5leGVjdXRlKAogICAgICAgICAgICAgICAgICAgIGZpbGVfdXRpbC53cml0ZV9maWxlLCAoc2VsZi5yZWNvcmQsIG91dHB1dHMpLAogICAgICAgICAgICAgICAgICAgICJ3cml0aW5nIGxpc3Qgb2YgaW5zdGFsbGVkIGZpbGVzIHRvICclcyciICUKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlY29yZAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICBzZWxmLndhcm5fZGVwcmVjYXRlZF9vcHRpb25zKCkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBsb2cuc2V0X3ZlcmJvc2l0eShzZWxmLmRpc3RyaWJ1dGlvbi52ZXJib3NlKQoKICAgIGRlZiBwc2V1ZG9fdGVtcG5hbWUoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIGEgcHNldWRvLXRlbXBuYW1lIGJhc2UgaW4gdGhlIGluc3RhbGwgZGlyZWN0b3J5LgogICAgICAgIFRoaXMgY29kZSBpcyBpbnRlbnRpb25hbGx5IG5haXZlOyBpZiBhIG1hbGljaW91cyBwYXJ0eSBjYW4gd3JpdGUgdG8KICAgICAgICB0aGUgdGFyZ2V0IGRpcmVjdG9yeSB5b3UncmUgYWxyZWFkeSBpbiBkZWVwIGRvb2Rvby4KICAgICAgICAiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIHBpZCA9IG9zLmdldHBpZCgpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgcGlkID0gcmFuZG9tLnJhbmRpbnQoMCwgc3lzLm1heHNpemUpCiAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihzZWxmLmluc3RhbGxfZGlyLCAidGVzdC1lYXN5LWluc3RhbGwtJXMiICUgcGlkKQoKICAgIGRlZiB3YXJuX2RlcHJlY2F0ZWRfb3B0aW9ucyhzZWxmKToKICAgICAgICBwYXNzCgogICAgZGVmIGNoZWNrX3NpdGVfZGlyKHNlbGYpOgogICAgICAgICIiIlZlcmlmeSB0aGF0IHNlbGYuaW5zdGFsbF9kaXIgaXMgLnB0aC1jYXBhYmxlIGRpciwgaWYgbmVlZGVkIiIiCgogICAgICAgIGluc3RkaXIgPSBub3JtYWxpemVfcGF0aChzZWxmLmluc3RhbGxfZGlyKQogICAgICAgIHB0aF9maWxlID0gb3MucGF0aC5qb2luKGluc3RkaXIsICdlYXN5LWluc3RhbGwucHRoJykKCiAgICAgICAgIyBJcyBpdCBhIGNvbmZpZ3VyZWQsIFBZVEhPTlBBVEgsIGltcGxpY2l0LCBvciBleHBsaWNpdCBzaXRlIGRpcj8KICAgICAgICBpc19zaXRlX2RpciA9IGluc3RkaXIgaW4gc2VsZi5hbGxfc2l0ZV9kaXJzCgogICAgICAgIGlmIG5vdCBpc19zaXRlX2RpciBhbmQgbm90IHNlbGYubXVsdGlfdmVyc2lvbjoKICAgICAgICAgICAgIyBObz8gIFRoZW4gZGlyZWN0bHkgdGVzdCB3aGV0aGVyIGl0IGRvZXMgLnB0aCBmaWxlIHByb2Nlc3NpbmcKICAgICAgICAgICAgaXNfc2l0ZV9kaXIgPSBzZWxmLmNoZWNrX3B0aF9wcm9jZXNzaW5nKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIG1ha2Ugc3VyZSB3ZSBjYW4gd3JpdGUgdG8gdGFyZ2V0IGRpcgogICAgICAgICAgICB0ZXN0ZmlsZSA9IHNlbGYucHNldWRvX3RlbXBuYW1lKCkgKyAnLndyaXRlLXRlc3QnCiAgICAgICAgICAgIHRlc3RfZXhpc3RzID0gb3MucGF0aC5leGlzdHModGVzdGZpbGUpCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGlmIHRlc3RfZXhpc3RzOgogICAgICAgICAgICAgICAgICAgIG9zLnVubGluayh0ZXN0ZmlsZSkKICAgICAgICAgICAgICAgIG9wZW4odGVzdGZpbGUsICd3JykuY2xvc2UoKQogICAgICAgICAgICAgICAgb3MudW5saW5rKHRlc3RmaWxlKQogICAgICAgICAgICBleGNlcHQgKE9TRXJyb3IsIElPRXJyb3IpOgogICAgICAgICAgICAgICAgc2VsZi5jYW50X3dyaXRlX3RvX3RhcmdldCgpCgogICAgICAgIGlmIG5vdCBpc19zaXRlX2RpciBhbmQgbm90IHNlbGYubXVsdGlfdmVyc2lvbjoKICAgICAgICAgICAgIyBDYW4ndCBpbnN0YWxsIG5vbi1tdWx0aSB0byBub24tc2l0ZSBkaXIKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3Ioc2VsZi5ub19kZWZhdWx0X3ZlcnNpb25fbXNnKCkpCgogICAgICAgIGlmIGlzX3NpdGVfZGlyOgogICAgICAgICAgICBpZiBzZWxmLnB0aF9maWxlIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBzZWxmLnB0aF9maWxlID0gUHRoRGlzdHJpYnV0aW9ucyhwdGhfZmlsZSwgc2VsZi5hbGxfc2l0ZV9kaXJzKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYucHRoX2ZpbGUgPSBOb25lCgogICAgICAgIGlmIGluc3RkaXIgbm90IGluIG1hcChub3JtYWxpemVfcGF0aCwgX3B5dGhvbnBhdGgoKSk6CiAgICAgICAgICAgICMgb25seSBQWVRIT05QQVRIIGRpcnMgbmVlZCBhIHNpdGUucHksIHNvIHByZXRlbmQgaXQncyB0aGVyZQogICAgICAgICAgICBzZWxmLnNpdGVweV9pbnN0YWxsZWQgPSBUcnVlCiAgICAgICAgZWxpZiBzZWxmLm11bHRpX3ZlcnNpb24gYW5kIG5vdCBvcy5wYXRoLmV4aXN0cyhwdGhfZmlsZSk6CiAgICAgICAgICAgIHNlbGYuc2l0ZXB5X2luc3RhbGxlZCA9IFRydWUgICMgZG9uJ3QgbmVlZCBzaXRlLnB5IGluIHRoaXMgY2FzZQogICAgICAgICAgICBzZWxmLnB0aF9maWxlID0gTm9uZSAgIyBhbmQgZG9uJ3QgY3JlYXRlIGEgLnB0aCBmaWxlCiAgICAgICAgc2VsZi5pbnN0YWxsX2RpciA9IGluc3RkaXIKCiAgICBfX2NhbnRfd3JpdGVfbXNnID0gdGV4dHdyYXAuZGVkZW50KCIiIgogICAgICAgIGNhbid0IGNyZWF0ZSBvciByZW1vdmUgZmlsZXMgaW4gaW5zdGFsbCBkaXJlY3RvcnkKCiAgICAgICAgVGhlIGZvbGxvd2luZyBlcnJvciBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gYWRkIG9yIHJlbW92ZSBmaWxlcyBpbiB0aGUKICAgICAgICBpbnN0YWxsYXRpb24gZGlyZWN0b3J5OgoKICAgICAgICAgICAgJXMKCiAgICAgICAgVGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgeW91IHNwZWNpZmllZCAodmlhIC0taW5zdGFsbC1kaXIsIC0tcHJlZml4LCBvcgogICAgICAgIHRoZSBkaXN0dXRpbHMgZGVmYXVsdCBzZXR0aW5nKSB3YXM6CgogICAgICAgICAgICAlcwogICAgICAgICIiIikubHN0cmlwKCkKCiAgICBfX25vdF9leGlzdHNfaWQgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiCiAgICAgICAgVGhpcyBkaXJlY3RvcnkgZG9lcyBub3QgY3VycmVudGx5IGV4aXN0LiAgUGxlYXNlIGNyZWF0ZSBpdCBhbmQgdHJ5IGFnYWluLCBvcgogICAgICAgIGNob29zZSBhIGRpZmZlcmVudCBpbnN0YWxsYXRpb24gZGlyZWN0b3J5ICh1c2luZyB0aGUgLWQgb3IgLS1pbnN0YWxsLWRpcgogICAgICAgIG9wdGlvbikuCiAgICAgICAgIiIiKS5sc3RyaXAoKQoKICAgIF9fYWNjZXNzX21zZyA9IHRleHR3cmFwLmRlZGVudCgiIiIKICAgICAgICBQZXJoYXBzIHlvdXIgYWNjb3VudCBkb2VzIG5vdCBoYXZlIHdyaXRlIGFjY2VzcyB0byB0aGlzIGRpcmVjdG9yeT8gIElmIHRoZQogICAgICAgIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgaXMgYSBzeXN0ZW0tb3duZWQgZGlyZWN0b3J5LCB5b3UgbWF5IG5lZWQgdG8gc2lnbiBpbgogICAgICAgIGFzIHRoZSBhZG1pbmlzdHJhdG9yIG9yICJyb290IiBhY2NvdW50LiAgSWYgeW91IGRvIG5vdCBoYXZlIGFkbWluaXN0cmF0aXZlCiAgICAgICAgYWNjZXNzIHRvIHRoaXMgbWFjaGluZSwgeW91IG1heSB3aXNoIHRvIGNob29zZSBhIGRpZmZlcmVudCBpbnN0YWxsYXRpb24KICAgICAgICBkaXJlY3RvcnksIHByZWZlcmFibHkgb25lIHRoYXQgaXMgbGlzdGVkIGluIHlvdXIgUFlUSE9OUEFUSCBlbnZpcm9ubWVudAogICAgICAgIHZhcmlhYmxlLgoKICAgICAgICBGb3IgaW5mb3JtYXRpb24gb24gb3RoZXIgb3B0aW9ucywgeW91IG1heSB3aXNoIHRvIGNvbnN1bHQgdGhlCiAgICAgICAgZG9jdW1lbnRhdGlvbiBhdDoKCiAgICAgICAgICBodHRwczovL3NldHVwdG9vbHMucmVhZHRoZWRvY3MuaW8vZW4vbGF0ZXN0L2Vhc3lfaW5zdGFsbC5odG1sCgogICAgICAgIFBsZWFzZSBtYWtlIHRoZSBhcHByb3ByaWF0ZSBjaGFuZ2VzIGZvciB5b3VyIHN5c3RlbSBhbmQgdHJ5IGFnYWluLgogICAgICAgICIiIikubHN0cmlwKCkKCiAgICBkZWYgY2FudF93cml0ZV90b190YXJnZXQoc2VsZik6CiAgICAgICAgbXNnID0gc2VsZi5fX2NhbnRfd3JpdGVfbXNnICUgKHN5cy5leGNfaW5mbygpWzFdLCBzZWxmLmluc3RhbGxfZGlyLCkKCiAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNlbGYuaW5zdGFsbF9kaXIpOgogICAgICAgICAgICBtc2cgKz0gJ1xuJyArIHNlbGYuX19ub3RfZXhpc3RzX2lkCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbXNnICs9ICdcbicgKyBzZWxmLl9fYWNjZXNzX21zZwogICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKG1zZykKCiAgICBkZWYgY2hlY2tfcHRoX3Byb2Nlc3Npbmcoc2VsZik6CiAgICAgICAgIiIiRW1waXJpY2FsbHkgdmVyaWZ5IHdoZXRoZXIgLnB0aCBmaWxlcyBhcmUgc3VwcG9ydGVkIGluIGluc3QuIGRpciIiIgogICAgICAgIGluc3RkaXIgPSBzZWxmLmluc3RhbGxfZGlyCiAgICAgICAgbG9nLmluZm8oIkNoZWNraW5nIC5wdGggZmlsZSBzdXBwb3J0IGluICVzIiwgaW5zdGRpcikKICAgICAgICBwdGhfZmlsZSA9IHNlbGYucHNldWRvX3RlbXBuYW1lKCkgKyAiLnB0aCIKICAgICAgICBva19maWxlID0gcHRoX2ZpbGUgKyAnLm9rJwogICAgICAgIG9rX2V4aXN0cyA9IG9zLnBhdGguZXhpc3RzKG9rX2ZpbGUpCiAgICAgICAgdG1wbCA9IF9vbmVfbGluZXIoIiIiCiAgICAgICAgICAgIGltcG9ydCBvcwogICAgICAgICAgICBmID0gb3Blbih7b2tfZmlsZSFyfSwgJ3cnKQogICAgICAgICAgICBmLndyaXRlKCdPSycpCiAgICAgICAgICAgIGYuY2xvc2UoKQogICAgICAgICAgICAiIiIpICsgJ1xuJwogICAgICAgIHRyeToKICAgICAgICAgICAgaWYgb2tfZXhpc3RzOgogICAgICAgICAgICAgICAgb3MudW5saW5rKG9rX2ZpbGUpCiAgICAgICAgICAgIGRpcm5hbWUgPSBvcy5wYXRoLmRpcm5hbWUob2tfZmlsZSkKICAgICAgICAgICAgcGtnX3Jlc291cmNlcy5weTMxY29tcGF0Lm1ha2VkaXJzKGRpcm5hbWUsIGV4aXN0X29rPVRydWUpCiAgICAgICAgICAgIGYgPSBvcGVuKHB0aF9maWxlLCAndycpCiAgICAgICAgZXhjZXB0IChPU0Vycm9yLCBJT0Vycm9yKToKICAgICAgICAgICAgc2VsZi5jYW50X3dyaXRlX3RvX3RhcmdldCgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgZi53cml0ZSh0bXBsLmZvcm1hdCgqKmxvY2FscygpKSkKICAgICAgICAgICAgICAgIGYuY2xvc2UoKQogICAgICAgICAgICAgICAgZiA9IE5vbmUKICAgICAgICAgICAgICAgIGV4ZWN1dGFibGUgPSBzeXMuZXhlY3V0YWJsZQogICAgICAgICAgICAgICAgaWYgb3MubmFtZSA9PSAnbnQnOgogICAgICAgICAgICAgICAgICAgIGRpcm5hbWUsIGJhc2VuYW1lID0gb3MucGF0aC5zcGxpdChleGVjdXRhYmxlKQogICAgICAgICAgICAgICAgICAgIGFsdCA9IG9zLnBhdGguam9pbihkaXJuYW1lLCAncHl0aG9udy5leGUnKQogICAgICAgICAgICAgICAgICAgIHVzZV9hbHQgPSAoCiAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VuYW1lLmxvd2VyKCkgPT0gJ3B5dGhvbi5leGUnIGFuZAogICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmV4aXN0cyhhbHQpCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIGlmIHVzZV9hbHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICMgdXNlIHB5dGhvbncuZXhlIHRvIGF2b2lkIG9wZW5pbmcgYSBjb25zb2xlIHdpbmRvdwogICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRhYmxlID0gYWx0CgogICAgICAgICAgICAgICAgZnJvbSBkaXN0dXRpbHMuc3Bhd24gaW1wb3J0IHNwYXduCgogICAgICAgICAgICAgICAgc3Bhd24oW2V4ZWN1dGFibGUsICctRScsICctYycsICdwYXNzJ10sIDApCgogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMob2tfZmlsZSk6CiAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oCiAgICAgICAgICAgICAgICAgICAgICAgICJURVNUIFBBU1NFRDogJXMgYXBwZWFycyB0byBzdXBwb3J0IC5wdGggZmlsZXMiLAogICAgICAgICAgICAgICAgICAgICAgICBpbnN0ZGlyCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICBpZiBmOgogICAgICAgICAgICAgICAgICAgIGYuY2xvc2UoKQogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMob2tfZmlsZSk6CiAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rKG9rX2ZpbGUpCiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhwdGhfZmlsZSk6CiAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rKHB0aF9maWxlKQogICAgICAgIGlmIG5vdCBzZWxmLm11bHRpX3ZlcnNpb246CiAgICAgICAgICAgIGxvZy53YXJuKCJURVNUIEZBSUxFRDogJXMgZG9lcyBOT1Qgc3VwcG9ydCAucHRoIGZpbGVzIiwgaW5zdGRpcikKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgaW5zdGFsbF9lZ2dfc2NyaXB0cyhzZWxmLCBkaXN0KToKICAgICAgICAiIiJXcml0ZSBhbGwgdGhlIHNjcmlwdHMgZm9yIGBkaXN0YCwgdW5sZXNzIHNjcmlwdHMgYXJlIGV4Y2x1ZGVkIiIiCiAgICAgICAgaWYgbm90IHNlbGYuZXhjbHVkZV9zY3JpcHRzIGFuZCBkaXN0Lm1ldGFkYXRhX2lzZGlyKCdzY3JpcHRzJyk6CiAgICAgICAgICAgIGZvciBzY3JpcHRfbmFtZSBpbiBkaXN0Lm1ldGFkYXRhX2xpc3RkaXIoJ3NjcmlwdHMnKToKICAgICAgICAgICAgICAgIGlmIGRpc3QubWV0YWRhdGFfaXNkaXIoJ3NjcmlwdHMvJyArIHNjcmlwdF9uYW1lKToKICAgICAgICAgICAgICAgICAgICAjIFRoZSAic2NyaXB0IiBpcyBhIGRpcmVjdG9yeSwgbGlrZWx5IGEgUHl0aG9uIDMKICAgICAgICAgICAgICAgICAgICAjIF9fcHljYWNoZV9fIGRpcmVjdG9yeSwgc28gc2tpcCBpdC4KICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgc2VsZi5pbnN0YWxsX3NjcmlwdCgKICAgICAgICAgICAgICAgICAgICBkaXN0LCBzY3JpcHRfbmFtZSwKICAgICAgICAgICAgICAgICAgICBkaXN0LmdldF9tZXRhZGF0YSgnc2NyaXB0cy8nICsgc2NyaXB0X25hbWUpCiAgICAgICAgICAgICAgICApCiAgICAgICAgc2VsZi5pbnN0YWxsX3dyYXBwZXJfc2NyaXB0cyhkaXN0KQoKICAgIGRlZiBhZGRfb3V0cHV0KHNlbGYsIHBhdGgpOgogICAgICAgIGlmIG9zLnBhdGguaXNkaXIocGF0aCk6CiAgICAgICAgICAgIGZvciBiYXNlLCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKHBhdGgpOgogICAgICAgICAgICAgICAgZm9yIGZpbGVuYW1lIGluIGZpbGVzOgogICAgICAgICAgICAgICAgICAgIHNlbGYub3V0cHV0cy5hcHBlbmQob3MucGF0aC5qb2luKGJhc2UsIGZpbGVuYW1lKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLm91dHB1dHMuYXBwZW5kKHBhdGgpCgogICAgZGVmIG5vdF9lZGl0YWJsZShzZWxmLCBzcGVjKToKICAgICAgICBpZiBzZWxmLmVkaXRhYmxlOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNBcmdFcnJvcigKICAgICAgICAgICAgICAgICJJbnZhbGlkIGFyZ3VtZW50ICVyOiB5b3UgY2FuJ3QgdXNlIGZpbGVuYW1lcyBvciBVUkxzICIKICAgICAgICAgICAgICAgICJ3aXRoIC0tZWRpdGFibGUgKGV4Y2VwdCB2aWEgdGhlIC0tZmluZC1saW5rcyBvcHRpb24pLiIKICAgICAgICAgICAgICAgICUgKHNwZWMsKQogICAgICAgICAgICApCgogICAgZGVmIGNoZWNrX2VkaXRhYmxlKHNlbGYsIHNwZWMpOgogICAgICAgIGlmIG5vdCBzZWxmLmVkaXRhYmxlOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKHNlbGYuYnVpbGRfZGlyZWN0b3J5LCBzcGVjLmtleSkpOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNBcmdFcnJvcigKICAgICAgICAgICAgICAgICIlciBhbHJlYWR5IGV4aXN0cyBpbiAlczsgY2FuJ3QgZG8gYSBjaGVja291dCB0aGVyZSIgJQogICAgICAgICAgICAgICAgKHNwZWMua2V5LCBzZWxmLmJ1aWxkX2RpcmVjdG9yeSkKICAgICAgICAgICAgKQoKICAgIEBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCiAgICBkZWYgX3RtcGRpcihzZWxmKToKICAgICAgICB0bXBkaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKHByZWZpeD11ImVhc3lfaW5zdGFsbC0iKQogICAgICAgIHRyeToKICAgICAgICAgICAgIyBjYXN0IHRvIHN0ciBhcyB3b3JrYXJvdW5kIGZvciAjNzA5IGFuZCAjNzEwIGFuZCAjNzEyCiAgICAgICAgICAgIHlpZWxkIHN0cih0bXBkaXIpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgb3MucGF0aC5leGlzdHModG1wZGlyKSBhbmQgcm10cmVlKHJtdHJlZV9zYWZlKHRtcGRpcikpCgogICAgZGVmIGVhc3lfaW5zdGFsbChzZWxmLCBzcGVjLCBkZXBzPUZhbHNlKToKICAgICAgICBpZiBub3Qgc2VsZi5lZGl0YWJsZToKICAgICAgICAgICAgc2VsZi5pbnN0YWxsX3NpdGVfcHkoKQoKICAgICAgICB3aXRoIHNlbGYuX3RtcGRpcigpIGFzIHRtcGRpcjoKICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoc3BlYywgUmVxdWlyZW1lbnQpOgogICAgICAgICAgICAgICAgaWYgVVJMX1NDSEVNRShzcGVjKToKICAgICAgICAgICAgICAgICAgICAjIEl0J3MgYSB1cmwsIGRvd25sb2FkIGl0IHRvIHRtcGRpciBhbmQgcHJvY2VzcwogICAgICAgICAgICAgICAgICAgIHNlbGYubm90X2VkaXRhYmxlKHNwZWMpCiAgICAgICAgICAgICAgICAgICAgZGwgPSBzZWxmLnBhY2thZ2VfaW5kZXguZG93bmxvYWQoc3BlYywgdG1wZGlyKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmluc3RhbGxfaXRlbShOb25lLCBkbCwgdG1wZGlyLCBkZXBzLCBUcnVlKQoKICAgICAgICAgICAgICAgIGVsaWYgb3MucGF0aC5leGlzdHMoc3BlYyk6CiAgICAgICAgICAgICAgICAgICAgIyBFeGlzdGluZyBmaWxlIG9yIGRpcmVjdG9yeSwganVzdCBwcm9jZXNzIGl0IGRpcmVjdGx5CiAgICAgICAgICAgICAgICAgICAgc2VsZi5ub3RfZWRpdGFibGUoc3BlYykKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5pbnN0YWxsX2l0ZW0oTm9uZSwgc3BlYywgdG1wZGlyLCBkZXBzLCBUcnVlKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBzcGVjID0gcGFyc2VfcmVxdWlyZW1lbnRfYXJnKHNwZWMpCgogICAgICAgICAgICBzZWxmLmNoZWNrX2VkaXRhYmxlKHNwZWMpCiAgICAgICAgICAgIGRpc3QgPSBzZWxmLnBhY2thZ2VfaW5kZXguZmV0Y2hfZGlzdHJpYnV0aW9uKAogICAgICAgICAgICAgICAgc3BlYywgdG1wZGlyLCBzZWxmLnVwZ3JhZGUsIHNlbGYuZWRpdGFibGUsCiAgICAgICAgICAgICAgICBub3Qgc2VsZi5hbHdheXNfY29weSwgc2VsZi5sb2NhbF9pbmRleAogICAgICAgICAgICApCiAgICAgICAgICAgIGlmIGRpc3QgaXMgTm9uZToKICAgICAgICAgICAgICAgIG1zZyA9ICJDb3VsZCBub3QgZmluZCBzdWl0YWJsZSBkaXN0cmlidXRpb24gZm9yICVyIiAlIHNwZWMKICAgICAgICAgICAgICAgIGlmIHNlbGYuYWx3YXlzX2NvcHk6CiAgICAgICAgICAgICAgICAgICAgbXNnICs9ICIgKC0tYWx3YXlzLWNvcHkgc2tpcHMgc3lzdGVtIGFuZCBkZXZlbG9wbWVudCBlZ2dzKSIKICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKG1zZykKICAgICAgICAgICAgZWxpZiBkaXN0LnByZWNlZGVuY2UgPT0gREVWRUxPUF9ESVNUOgogICAgICAgICAgICAgICAgIyAuZWdnLWluZm8gZGlzdHMgZG9uJ3QgbmVlZCBpbnN0YWxsaW5nLCBqdXN0IHByb2Nlc3MgZGVwcwogICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzX2Rpc3RyaWJ1dGlvbihzcGVjLCBkaXN0LCBkZXBzLCAiVXNpbmciKQogICAgICAgICAgICAgICAgcmV0dXJuIGRpc3QKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmluc3RhbGxfaXRlbShzcGVjLCBkaXN0LmxvY2F0aW9uLCB0bXBkaXIsIGRlcHMpCgogICAgZGVmIGluc3RhbGxfaXRlbShzZWxmLCBzcGVjLCBkb3dubG9hZCwgdG1wZGlyLCBkZXBzLCBpbnN0YWxsX25lZWRlZD1GYWxzZSk6CgogICAgICAgICMgSW5zdGFsbGF0aW9uIGlzIGFsc28gbmVlZGVkIGlmIGZpbGUgaW4gdG1wZGlyIG9yIGlzIG5vdCBhbiBlZ2cKICAgICAgICBpbnN0YWxsX25lZWRlZCA9IGluc3RhbGxfbmVlZGVkIG9yIHNlbGYuYWx3YXlzX2NvcHkKICAgICAgICBpbnN0YWxsX25lZWRlZCA9IGluc3RhbGxfbmVlZGVkIG9yIG9zLnBhdGguZGlybmFtZShkb3dubG9hZCkgPT0gdG1wZGlyCiAgICAgICAgaW5zdGFsbF9uZWVkZWQgPSBpbnN0YWxsX25lZWRlZCBvciBub3QgZG93bmxvYWQuZW5kc3dpdGgoJy5lZ2cnKQogICAgICAgIGluc3RhbGxfbmVlZGVkID0gaW5zdGFsbF9uZWVkZWQgb3IgKAogICAgICAgICAgICBzZWxmLmFsd2F5c19jb3B5X2Zyb20gaXMgbm90IE5vbmUgYW5kCiAgICAgICAgICAgIG9zLnBhdGguZGlybmFtZShub3JtYWxpemVfcGF0aChkb3dubG9hZCkpID09CiAgICAgICAgICAgIG5vcm1hbGl6ZV9wYXRoKHNlbGYuYWx3YXlzX2NvcHlfZnJvbSkKICAgICAgICApCgogICAgICAgIGlmIHNwZWMgYW5kIG5vdCBpbnN0YWxsX25lZWRlZDoKICAgICAgICAgICAgIyBhdCB0aGlzIHBvaW50LCB3ZSBrbm93IGl0J3MgYSBsb2NhbCAuZWdnLCB3ZSBqdXN0IGRvbid0IGtub3cgaWYKICAgICAgICAgICAgIyBpdCdzIGFscmVhZHkgaW5zdGFsbGVkLgogICAgICAgICAgICBmb3IgZGlzdCBpbiBzZWxmLmxvY2FsX2luZGV4W3NwZWMucHJvamVjdF9uYW1lXToKICAgICAgICAgICAgICAgIGlmIGRpc3QubG9jYXRpb24gPT0gZG93bmxvYWQ6CiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGluc3RhbGxfbmVlZGVkID0gVHJ1ZSAgIyBpdCdzIG5vdCBpbiB0aGUgbG9jYWwgaW5kZXgKCiAgICAgICAgbG9nLmluZm8oIlByb2Nlc3NpbmcgJXMiLCBvcy5wYXRoLmJhc2VuYW1lKGRvd25sb2FkKSkKCiAgICAgICAgaWYgaW5zdGFsbF9uZWVkZWQ6CiAgICAgICAgICAgIGRpc3RzID0gc2VsZi5pbnN0YWxsX2VnZ3Moc3BlYywgZG93bmxvYWQsIHRtcGRpcikKICAgICAgICAgICAgZm9yIGRpc3QgaW4gZGlzdHM6CiAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3NfZGlzdHJpYnV0aW9uKHNwZWMsIGRpc3QsIGRlcHMpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZGlzdHMgPSBbc2VsZi5lZ2dfZGlzdHJpYnV0aW9uKGRvd25sb2FkKV0KICAgICAgICAgICAgc2VsZi5wcm9jZXNzX2Rpc3RyaWJ1dGlvbihzcGVjLCBkaXN0c1swXSwgZGVwcywgIlVzaW5nIikKCiAgICAgICAgaWYgc3BlYyBpcyBub3QgTm9uZToKICAgICAgICAgICAgZm9yIGRpc3QgaW4gZGlzdHM6CiAgICAgICAgICAgICAgICBpZiBkaXN0IGluIHNwZWM6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRpc3QKCiAgICBkZWYgc2VsZWN0X3NjaGVtZShzZWxmLCBuYW1lKToKICAgICAgICAiIiJTZXRzIHRoZSBpbnN0YWxsIGRpcmVjdG9yaWVzIGJ5IGFwcGx5aW5nIHRoZSBpbnN0YWxsIHNjaGVtZXMuIiIiCiAgICAgICAgIyBpdCdzIHRoZSBjYWxsZXIncyBwcm9ibGVtIGlmIHRoZXkgc3VwcGx5IGEgYmFkIG5hbWUhCiAgICAgICAgc2NoZW1lID0gSU5TVEFMTF9TQ0hFTUVTW25hbWVdCiAgICAgICAgZm9yIGtleSBpbiBTQ0hFTUVfS0VZUzoKICAgICAgICAgICAgYXR0cm5hbWUgPSAnaW5zdGFsbF8nICsga2V5CiAgICAgICAgICAgIGlmIGdldGF0dHIoc2VsZiwgYXR0cm5hbWUpIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGF0dHJuYW1lLCBzY2hlbWVba2V5XSkKCiAgICBkZWYgcHJvY2Vzc19kaXN0cmlidXRpb24oc2VsZiwgcmVxdWlyZW1lbnQsIGRpc3QsIGRlcHM9VHJ1ZSwgKmluZm8pOgogICAgICAgIHNlbGYudXBkYXRlX3B0aChkaXN0KQogICAgICAgIHNlbGYucGFja2FnZV9pbmRleC5hZGQoZGlzdCkKICAgICAgICBpZiBkaXN0IGluIHNlbGYubG9jYWxfaW5kZXhbZGlzdC5rZXldOgogICAgICAgICAgICBzZWxmLmxvY2FsX2luZGV4LnJlbW92ZShkaXN0KQogICAgICAgIHNlbGYubG9jYWxfaW5kZXguYWRkKGRpc3QpCiAgICAgICAgc2VsZi5pbnN0YWxsX2VnZ19zY3JpcHRzKGRpc3QpCiAgICAgICAgc2VsZi5pbnN0YWxsZWRfcHJvamVjdHNbZGlzdC5rZXldID0gZGlzdAogICAgICAgIGxvZy5pbmZvKHNlbGYuaW5zdGFsbGF0aW9uX3JlcG9ydChyZXF1aXJlbWVudCwgZGlzdCwgKmluZm8pKQogICAgICAgIGlmIChkaXN0Lmhhc19tZXRhZGF0YSgnZGVwZW5kZW5jeV9saW5rcy50eHQnKSBhbmQKICAgICAgICAgICAgICAgIG5vdCBzZWxmLm5vX2ZpbmRfbGlua3MpOgogICAgICAgICAgICBzZWxmLnBhY2thZ2VfaW5kZXguYWRkX2ZpbmRfbGlua3MoCiAgICAgICAgICAgICAgICBkaXN0LmdldF9tZXRhZGF0YV9saW5lcygnZGVwZW5kZW5jeV9saW5rcy50eHQnKQogICAgICAgICAgICApCiAgICAgICAgaWYgbm90IGRlcHMgYW5kIG5vdCBzZWxmLmFsd2F5c19jb3B5OgogICAgICAgICAgICByZXR1cm4KICAgICAgICBlbGlmIHJlcXVpcmVtZW50IGlzIG5vdCBOb25lIGFuZCBkaXN0LmtleSAhPSByZXF1aXJlbWVudC5rZXk6CiAgICAgICAgICAgIGxvZy53YXJuKCJTa2lwcGluZyBkZXBlbmRlbmNpZXMgZm9yICVzIiwgZGlzdCkKICAgICAgICAgICAgcmV0dXJuICAjIFhYWCB0aGlzIGlzIG5vdCB0aGUgZGlzdHJpYnV0aW9uIHdlIHdlcmUgbG9va2luZyBmb3IKICAgICAgICBlbGlmIHJlcXVpcmVtZW50IGlzIE5vbmUgb3IgZGlzdCBub3QgaW4gcmVxdWlyZW1lbnQ6CiAgICAgICAgICAgICMgaWYgd2Ugd291bmQgdXAgd2l0aCBhIGRpZmZlcmVudCB2ZXJzaW9uLCByZXNvbHZlIHdoYXQgd2UndmUgZ290CiAgICAgICAgICAgIGRpc3RyZXEgPSBkaXN0LmFzX3JlcXVpcmVtZW50KCkKICAgICAgICAgICAgcmVxdWlyZW1lbnQgPSBSZXF1aXJlbWVudChzdHIoZGlzdHJlcSkpCiAgICAgICAgbG9nLmluZm8oIlByb2Nlc3NpbmcgZGVwZW5kZW5jaWVzIGZvciAlcyIsIHJlcXVpcmVtZW50KQogICAgICAgIHRyeToKICAgICAgICAgICAgZGlzdHJvcyA9IFdvcmtpbmdTZXQoW10pLnJlc29sdmUoCiAgICAgICAgICAgICAgICBbcmVxdWlyZW1lbnRdLCBzZWxmLmxvY2FsX2luZGV4LCBzZWxmLmVhc3lfaW5zdGFsbAogICAgICAgICAgICApCiAgICAgICAgZXhjZXB0IERpc3RyaWJ1dGlvbk5vdEZvdW5kIGFzIGU6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKHN0cihlKSkKICAgICAgICBleGNlcHQgVmVyc2lvbkNvbmZsaWN0IGFzIGU6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKGUucmVwb3J0KCkpCiAgICAgICAgaWYgc2VsZi5hbHdheXNfY29weSBvciBzZWxmLmFsd2F5c19jb3B5X2Zyb206CiAgICAgICAgICAgICMgRm9yY2UgYWxsIHRoZSByZWxldmFudCBkaXN0cm9zIHRvIGJlIGNvcGllZCBvciBhY3RpdmF0ZWQKICAgICAgICAgICAgZm9yIGRpc3QgaW4gZGlzdHJvczoKICAgICAgICAgICAgICAgIGlmIGRpc3Qua2V5IG5vdCBpbiBzZWxmLmluc3RhbGxlZF9wcm9qZWN0czoKICAgICAgICAgICAgICAgICAgICBzZWxmLmVhc3lfaW5zdGFsbChkaXN0LmFzX3JlcXVpcmVtZW50KCkpCiAgICAgICAgbG9nLmluZm8oIkZpbmlzaGVkIHByb2Nlc3NpbmcgZGVwZW5kZW5jaWVzIGZvciAlcyIsIHJlcXVpcmVtZW50KQoKICAgIGRlZiBzaG91bGRfdW56aXAoc2VsZiwgZGlzdCk6CiAgICAgICAgaWYgc2VsZi56aXBfb2sgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBub3Qgc2VsZi56aXBfb2sKICAgICAgICBpZiBkaXN0Lmhhc19tZXRhZGF0YSgnbm90LXppcC1zYWZlJyk6CiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgaWYgbm90IGRpc3QuaGFzX21ldGFkYXRhKCd6aXAtc2FmZScpOgogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBtYXliZV9tb3ZlKHNlbGYsIHNwZWMsIGRpc3RfZmlsZW5hbWUsIHNldHVwX2Jhc2UpOgogICAgICAgIGRzdCA9IG9zLnBhdGguam9pbihzZWxmLmJ1aWxkX2RpcmVjdG9yeSwgc3BlYy5rZXkpCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZHN0KToKICAgICAgICAgICAgbXNnID0gKAogICAgICAgICAgICAgICAgIiVyIGFscmVhZHkgZXhpc3RzIGluICVzOyBidWlsZCBkaXJlY3RvcnkgJXMgd2lsbCBub3QgYmUga2VwdCIKICAgICAgICAgICAgKQogICAgICAgICAgICBsb2cud2Fybihtc2csIHNwZWMua2V5LCBzZWxmLmJ1aWxkX2RpcmVjdG9yeSwgc2V0dXBfYmFzZSkKICAgICAgICAgICAgcmV0dXJuIHNldHVwX2Jhc2UKICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGRpc3RfZmlsZW5hbWUpOgogICAgICAgICAgICBzZXR1cF9iYXNlID0gZGlzdF9maWxlbmFtZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIG9zLnBhdGguZGlybmFtZShkaXN0X2ZpbGVuYW1lKSA9PSBzZXR1cF9iYXNlOgogICAgICAgICAgICAgICAgb3MudW5saW5rKGRpc3RfZmlsZW5hbWUpICAjIGdldCBpdCBvdXQgb2YgdGhlIHRtcCBkaXIKICAgICAgICAgICAgY29udGVudHMgPSBvcy5saXN0ZGlyKHNldHVwX2Jhc2UpCiAgICAgICAgICAgIGlmIGxlbihjb250ZW50cykgPT0gMToKICAgICAgICAgICAgICAgIGRpc3RfZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oc2V0dXBfYmFzZSwgY29udGVudHNbMF0pCiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGRpc3RfZmlsZW5hbWUpOgogICAgICAgICAgICAgICAgICAgICMgaWYgdGhlIG9ubHkgdGhpbmcgdGhlcmUgaXMgYSBkaXJlY3RvcnksIG1vdmUgaXQgaW5zdGVhZAogICAgICAgICAgICAgICAgICAgIHNldHVwX2Jhc2UgPSBkaXN0X2ZpbGVuYW1lCiAgICAgICAgZW5zdXJlX2RpcmVjdG9yeShkc3QpCiAgICAgICAgc2h1dGlsLm1vdmUoc2V0dXBfYmFzZSwgZHN0KQogICAgICAgIHJldHVybiBkc3QKCiAgICBkZWYgaW5zdGFsbF93cmFwcGVyX3NjcmlwdHMoc2VsZiwgZGlzdCk6CiAgICAgICAgaWYgc2VsZi5leGNsdWRlX3NjcmlwdHM6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGZvciBhcmdzIGluIFNjcmlwdFdyaXRlci5iZXN0KCkuZ2V0X2FyZ3MoZGlzdCk6CiAgICAgICAgICAgIHNlbGYud3JpdGVfc2NyaXB0KCphcmdzKQoKICAgIGRlZiBpbnN0YWxsX3NjcmlwdChzZWxmLCBkaXN0LCBzY3JpcHRfbmFtZSwgc2NyaXB0X3RleHQsIGRldl9wYXRoPU5vbmUpOgogICAgICAgICIiIkdlbmVyYXRlIGEgbGVnYWN5IHNjcmlwdCB3cmFwcGVyIGFuZCBpbnN0YWxsIGl0IiIiCiAgICAgICAgc3BlYyA9IHN0cihkaXN0LmFzX3JlcXVpcmVtZW50KCkpCiAgICAgICAgaXNfc2NyaXB0ID0gaXNfcHl0aG9uX3NjcmlwdChzY3JpcHRfdGV4dCwgc2NyaXB0X25hbWUpCgogICAgICAgIGlmIGlzX3NjcmlwdDoKICAgICAgICAgICAgYm9keSA9IHNlbGYuX2xvYWRfdGVtcGxhdGUoZGV2X3BhdGgpICUgbG9jYWxzKCkKICAgICAgICAgICAgc2NyaXB0X3RleHQgPSBTY3JpcHRXcml0ZXIuZ2V0X2hlYWRlcihzY3JpcHRfdGV4dCkgKyBib2R5CiAgICAgICAgc2VsZi53cml0ZV9zY3JpcHQoc2NyaXB0X25hbWUsIF90b19ieXRlcyhzY3JpcHRfdGV4dCksICdiJykKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2xvYWRfdGVtcGxhdGUoZGV2X3BhdGgpOgogICAgICAgICIiIgogICAgICAgIFRoZXJlIGFyZSBhIGNvdXBsZSBvZiB0ZW1wbGF0ZSBzY3JpcHRzIGluIHRoZSBwYWNrYWdlLiBUaGlzCiAgICAgICAgZnVuY3Rpb24gbG9hZHMgb25lIG9mIHRoZW0gYW5kIHByZXBhcmVzIGl0IGZvciB1c2UuCiAgICAgICAgIiIiCiAgICAgICAgIyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvc2V0dXB0b29scy9pc3N1ZXMvMTM0IGZvciBpbmZvCiAgICAgICAgIyBvbiBzY3JpcHQgZmlsZSBuYW1pbmcgYW5kIGRvd25zdHJlYW0gaXNzdWVzIHdpdGggU1ZSNAogICAgICAgIG5hbWUgPSAnc2NyaXB0LnRtcGwnCiAgICAgICAgaWYgZGV2X3BhdGg6CiAgICAgICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoJy50bXBsJywgJyAoZGV2KS50bXBsJykKCiAgICAgICAgcmF3X2J5dGVzID0gcmVzb3VyY2Vfc3RyaW5nKCdzZXR1cHRvb2xzJywgbmFtZSkKICAgICAgICByZXR1cm4gcmF3X2J5dGVzLmRlY29kZSgndXRmLTgnKQoKICAgIGRlZiB3cml0ZV9zY3JpcHQoc2VsZiwgc2NyaXB0X25hbWUsIGNvbnRlbnRzLCBtb2RlPSJ0IiwgYmxvY2tlcnM9KCkpOgogICAgICAgICIiIldyaXRlIGFuIGV4ZWN1dGFibGUgZmlsZSB0byB0aGUgc2NyaXB0cyBkaXJlY3RvcnkiIiIKICAgICAgICBzZWxmLmRlbGV0ZV9ibG9ja2VycyggICMgY2xlYW4gdXAgb2xkIC5weS8ucHl3IHcvbyBhIHNjcmlwdAogICAgICAgICAgICBbb3MucGF0aC5qb2luKHNlbGYuc2NyaXB0X2RpciwgeCkgZm9yIHggaW4gYmxvY2tlcnNdCiAgICAgICAgKQogICAgICAgIGxvZy5pbmZvKCJJbnN0YWxsaW5nICVzIHNjcmlwdCB0byAlcyIsIHNjcmlwdF9uYW1lLCBzZWxmLnNjcmlwdF9kaXIpCiAgICAgICAgdGFyZ2V0ID0gb3MucGF0aC5qb2luKHNlbGYuc2NyaXB0X2Rpciwgc2NyaXB0X25hbWUpCiAgICAgICAgc2VsZi5hZGRfb3V0cHV0KHRhcmdldCkKCiAgICAgICAgaWYgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgbWFzayA9IGN1cnJlbnRfdW1hc2soKQogICAgICAgIGVuc3VyZV9kaXJlY3RvcnkodGFyZ2V0KQogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHRhcmdldCk6CiAgICAgICAgICAgIG9zLnVubGluayh0YXJnZXQpCiAgICAgICAgd2l0aCBvcGVuKHRhcmdldCwgInciICsgbW9kZSkgYXMgZjoKICAgICAgICAgICAgZi53cml0ZShjb250ZW50cykKICAgICAgICBjaG1vZCh0YXJnZXQsIDBvNzc3IC0gbWFzaykKCiAgICBkZWYgaW5zdGFsbF9lZ2dzKHNlbGYsIHNwZWMsIGRpc3RfZmlsZW5hbWUsIHRtcGRpcik6CiAgICAgICAgIyAuZWdnIGRpcnMgb3IgZmlsZXMgYXJlIGFscmVhZHkgYnVpbHQsIHNvIGp1c3QgcmV0dXJuIHRoZW0KICAgICAgICBpZiBkaXN0X2ZpbGVuYW1lLmxvd2VyKCkuZW5kc3dpdGgoJy5lZ2cnKToKICAgICAgICAgICAgcmV0dXJuIFtzZWxmLmluc3RhbGxfZWdnKGRpc3RfZmlsZW5hbWUsIHRtcGRpcildCiAgICAgICAgZWxpZiBkaXN0X2ZpbGVuYW1lLmxvd2VyKCkuZW5kc3dpdGgoJy5leGUnKToKICAgICAgICAgICAgcmV0dXJuIFtzZWxmLmluc3RhbGxfZXhlKGRpc3RfZmlsZW5hbWUsIHRtcGRpcildCiAgICAgICAgZWxpZiBkaXN0X2ZpbGVuYW1lLmxvd2VyKCkuZW5kc3dpdGgoJy53aGwnKToKICAgICAgICAgICAgcmV0dXJuIFtzZWxmLmluc3RhbGxfd2hlZWwoZGlzdF9maWxlbmFtZSwgdG1wZGlyKV0KCiAgICAgICAgIyBBbnl0aGluZyBlbHNlLCB0cnkgdG8gZXh0cmFjdCBhbmQgYnVpbGQKICAgICAgICBzZXR1cF9iYXNlID0gdG1wZGlyCiAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoZGlzdF9maWxlbmFtZSkgYW5kIG5vdCBkaXN0X2ZpbGVuYW1lLmVuZHN3aXRoKCcucHknKToKICAgICAgICAgICAgdW5wYWNrX2FyY2hpdmUoZGlzdF9maWxlbmFtZSwgdG1wZGlyLCBzZWxmLnVucGFja19wcm9ncmVzcykKICAgICAgICBlbGlmIG9zLnBhdGguaXNkaXIoZGlzdF9maWxlbmFtZSk6CiAgICAgICAgICAgIHNldHVwX2Jhc2UgPSBvcy5wYXRoLmFic3BhdGgoZGlzdF9maWxlbmFtZSkKCiAgICAgICAgaWYgKHNldHVwX2Jhc2Uuc3RhcnRzd2l0aCh0bXBkaXIpICAjIHNvbWV0aGluZyB3ZSBkb3dubG9hZGVkCiAgICAgICAgICAgICAgICBhbmQgc2VsZi5idWlsZF9kaXJlY3RvcnkgYW5kIHNwZWMgaXMgbm90IE5vbmUpOgogICAgICAgICAgICBzZXR1cF9iYXNlID0gc2VsZi5tYXliZV9tb3ZlKHNwZWMsIGRpc3RfZmlsZW5hbWUsIHNldHVwX2Jhc2UpCgogICAgICAgICMgRmluZCB0aGUgc2V0dXAucHkgZmlsZQogICAgICAgIHNldHVwX3NjcmlwdCA9IG9zLnBhdGguam9pbihzZXR1cF9iYXNlLCAnc2V0dXAucHknKQoKICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc2V0dXBfc2NyaXB0KToKICAgICAgICAgICAgc2V0dXBzID0gZ2xvYihvcy5wYXRoLmpvaW4oc2V0dXBfYmFzZSwgJyonLCAnc2V0dXAucHknKSkKICAgICAgICAgICAgaWYgbm90IHNldHVwczoKICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKAogICAgICAgICAgICAgICAgICAgICJDb3VsZG4ndCBmaW5kIGEgc2V0dXAgc2NyaXB0IGluICVzIiAlCiAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5hYnNwYXRoKGRpc3RfZmlsZW5hbWUpCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIGlmIGxlbihzZXR1cHMpID4gMToKICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKAogICAgICAgICAgICAgICAgICAgICJNdWx0aXBsZSBzZXR1cCBzY3JpcHRzIGluICVzIiAlCiAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5hYnNwYXRoKGRpc3RfZmlsZW5hbWUpCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHNldHVwX3NjcmlwdCA9IHNldHVwc1swXQoKICAgICAgICAjIE5vdyBydW4gaXQsIGFuZCByZXR1cm4gdGhlIHJlc3VsdAogICAgICAgIGlmIHNlbGYuZWRpdGFibGU6CiAgICAgICAgICAgIGxvZy5pbmZvKHNlbGYucmVwb3J0X2VkaXRhYmxlKHNwZWMsIHNldHVwX3NjcmlwdCkpCiAgICAgICAgICAgIHJldHVybiBbXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmJ1aWxkX2FuZF9pbnN0YWxsKHNldHVwX3NjcmlwdCwgc2V0dXBfYmFzZSkKCiAgICBkZWYgZWdnX2Rpc3RyaWJ1dGlvbihzZWxmLCBlZ2dfcGF0aCk6CiAgICAgICAgaWYgb3MucGF0aC5pc2RpcihlZ2dfcGF0aCk6CiAgICAgICAgICAgIG1ldGFkYXRhID0gUGF0aE1ldGFkYXRhKGVnZ19wYXRoLCBvcy5wYXRoLmpvaW4oZWdnX3BhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0VHRy1JTkZPJykpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbWV0YWRhdGEgPSBFZ2dNZXRhZGF0YSh6aXBpbXBvcnQuemlwaW1wb3J0ZXIoZWdnX3BhdGgpKQogICAgICAgIHJldHVybiBEaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZShlZ2dfcGF0aCwgbWV0YWRhdGE9bWV0YWRhdGEpCgogICAgZGVmIGluc3RhbGxfZWdnKHNlbGYsIGVnZ19wYXRoLCB0bXBkaXIpOgogICAgICAgIGRlc3RpbmF0aW9uID0gb3MucGF0aC5qb2luKAogICAgICAgICAgICBzZWxmLmluc3RhbGxfZGlyLAogICAgICAgICAgICBvcy5wYXRoLmJhc2VuYW1lKGVnZ19wYXRoKSwKICAgICAgICApCiAgICAgICAgZGVzdGluYXRpb24gPSBvcy5wYXRoLmFic3BhdGgoZGVzdGluYXRpb24pCiAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgZW5zdXJlX2RpcmVjdG9yeShkZXN0aW5hdGlvbikKCiAgICAgICAgZGlzdCA9IHNlbGYuZWdnX2Rpc3RyaWJ1dGlvbihlZ2dfcGF0aCkKICAgICAgICBpZiBub3Qgc2FtZWZpbGUoZWdnX3BhdGgsIGRlc3RpbmF0aW9uKToKICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihkZXN0aW5hdGlvbikgYW5kIG5vdCBvcy5wYXRoLmlzbGluayhkZXN0aW5hdGlvbik6CiAgICAgICAgICAgICAgICBkaXJfdXRpbC5yZW1vdmVfdHJlZShkZXN0aW5hdGlvbiwgZHJ5X3J1bj1zZWxmLmRyeV9ydW4pCiAgICAgICAgICAgIGVsaWYgb3MucGF0aC5leGlzdHMoZGVzdGluYXRpb24pOgogICAgICAgICAgICAgICAgc2VsZi5leGVjdXRlKAogICAgICAgICAgICAgICAgICAgIG9zLnVubGluaywKICAgICAgICAgICAgICAgICAgICAoZGVzdGluYXRpb24sKSwKICAgICAgICAgICAgICAgICAgICAiUmVtb3ZpbmcgIiArIGRlc3RpbmF0aW9uLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBuZXdfZGlzdF9pc196aXBwZWQgPSBGYWxzZQogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihlZ2dfcGF0aCk6CiAgICAgICAgICAgICAgICAgICAgaWYgZWdnX3BhdGguc3RhcnRzd2l0aCh0bXBkaXIpOgogICAgICAgICAgICAgICAgICAgICAgICBmLCBtID0gc2h1dGlsLm1vdmUsICJNb3ZpbmciCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgZiwgbSA9IHNodXRpbC5jb3B5dHJlZSwgIkNvcHlpbmciCiAgICAgICAgICAgICAgICBlbGlmIHNlbGYuc2hvdWxkX3VuemlwKGRpc3QpOgogICAgICAgICAgICAgICAgICAgIHNlbGYubWtwYXRoKGRlc3RpbmF0aW9uKQogICAgICAgICAgICAgICAgICAgIGYsIG0gPSBzZWxmLnVucGFja19hbmRfY29tcGlsZSwgIkV4dHJhY3RpbmciCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG5ld19kaXN0X2lzX3ppcHBlZCA9IFRydWUKICAgICAgICAgICAgICAgICAgICBpZiBlZ2dfcGF0aC5zdGFydHN3aXRoKHRtcGRpcik6CiAgICAgICAgICAgICAgICAgICAgICAgIGYsIG0gPSBzaHV0aWwubW92ZSwgIk1vdmluZyIKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBmLCBtID0gc2h1dGlsLmNvcHkyLCAiQ29weWluZyIKICAgICAgICAgICAgICAgIHNlbGYuZXhlY3V0ZSgKICAgICAgICAgICAgICAgICAgICBmLAogICAgICAgICAgICAgICAgICAgIChlZ2dfcGF0aCwgZGVzdGluYXRpb24pLAogICAgICAgICAgICAgICAgICAgIChtICsgIiAlcyB0byAlcyIpICUgKAogICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmJhc2VuYW1lKGVnZ19wYXRoKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5kaXJuYW1lKGRlc3RpbmF0aW9uKQogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB1cGRhdGVfZGlzdF9jYWNoZXMoCiAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24sCiAgICAgICAgICAgICAgICAgICAgZml4X3ppcGltcG9ydGVyX2NhY2hlcz1uZXdfZGlzdF9pc196aXBwZWQsCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICAgICB1cGRhdGVfZGlzdF9jYWNoZXMoZGVzdGluYXRpb24sIGZpeF96aXBpbXBvcnRlcl9jYWNoZXM9RmFsc2UpCiAgICAgICAgICAgICAgICByYWlzZQoKICAgICAgICBzZWxmLmFkZF9vdXRwdXQoZGVzdGluYXRpb24pCiAgICAgICAgcmV0dXJuIHNlbGYuZWdnX2Rpc3RyaWJ1dGlvbihkZXN0aW5hdGlvbikKCiAgICBkZWYgaW5zdGFsbF9leGUoc2VsZiwgZGlzdF9maWxlbmFtZSwgdG1wZGlyKToKICAgICAgICAjIFNlZSBpZiBpdCdzIHZhbGlkLCBnZXQgZGF0YQogICAgICAgIGNmZyA9IGV4dHJhY3Rfd2luaW5zdF9jZmcoZGlzdF9maWxlbmFtZSkKICAgICAgICBpZiBjZmcgaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoCiAgICAgICAgICAgICAgICAiJXMgaXMgbm90IGEgdmFsaWQgZGlzdHV0aWxzIFdpbmRvd3MgLmV4ZSIgJSBkaXN0X2ZpbGVuYW1lCiAgICAgICAgICAgICkKICAgICAgICAjIENyZWF0ZSBhIGR1bW15IGRpc3RyaWJ1dGlvbiBvYmplY3QgdW50aWwgd2UgYnVpbGQgdGhlIHJlYWwgZGlzdHJvCiAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbigKICAgICAgICAgICAgTm9uZSwKICAgICAgICAgICAgcHJvamVjdF9uYW1lPWNmZy5nZXQoJ21ldGFkYXRhJywgJ25hbWUnKSwKICAgICAgICAgICAgdmVyc2lvbj1jZmcuZ2V0KCdtZXRhZGF0YScsICd2ZXJzaW9uJyksIHBsYXRmb3JtPWdldF9wbGF0Zm9ybSgpLAogICAgICAgICkKCiAgICAgICAgIyBDb252ZXJ0IHRoZSAuZXhlIHRvIGFuIHVucGFja2VkIGVnZwogICAgICAgIGVnZ19wYXRoID0gb3MucGF0aC5qb2luKHRtcGRpciwgZGlzdC5lZ2dfbmFtZSgpICsgJy5lZ2cnKQogICAgICAgIGRpc3QubG9jYXRpb24gPSBlZ2dfcGF0aAogICAgICAgIGVnZ190bXAgPSBlZ2dfcGF0aCArICcudG1wJwogICAgICAgIF9lZ2dfaW5mbyA9IG9zLnBhdGguam9pbihlZ2dfdG1wLCAnRUdHLUlORk8nKQogICAgICAgIHBrZ19pbmYgPSBvcy5wYXRoLmpvaW4oX2VnZ19pbmZvLCAnUEtHLUlORk8nKQogICAgICAgIGVuc3VyZV9kaXJlY3RvcnkocGtnX2luZikgICMgbWFrZSBzdXJlIEVHRy1JTkZPIGRpciBleGlzdHMKICAgICAgICBkaXN0Ll9wcm92aWRlciA9IFBhdGhNZXRhZGF0YShlZ2dfdG1wLCBfZWdnX2luZm8pICAjIFhYWAogICAgICAgIHNlbGYuZXhlX3RvX2VnZyhkaXN0X2ZpbGVuYW1lLCBlZ2dfdG1wKQoKICAgICAgICAjIFdyaXRlIEVHRy1JTkZPL1BLRy1JTkZPCiAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHBrZ19pbmYpOgogICAgICAgICAgICBmID0gb3Blbihwa2dfaW5mLCAndycpCiAgICAgICAgICAgIGYud3JpdGUoJ01ldGFkYXRhLVZlcnNpb246IDEuMFxuJykKICAgICAgICAgICAgZm9yIGssIHYgaW4gY2ZnLml0ZW1zKCdtZXRhZGF0YScpOgogICAgICAgICAgICAgICAgaWYgayAhPSAndGFyZ2V0X3ZlcnNpb24nOgogICAgICAgICAgICAgICAgICAgIGYud3JpdGUoJyVzOiAlc1xuJyAlIChrLnJlcGxhY2UoJ18nLCAnLScpLnRpdGxlKCksIHYpKQogICAgICAgICAgICBmLmNsb3NlKCkKICAgICAgICBzY3JpcHRfZGlyID0gb3MucGF0aC5qb2luKF9lZ2dfaW5mbywgJ3NjcmlwdHMnKQogICAgICAgICMgZGVsZXRlIGVudHJ5LXBvaW50IHNjcmlwdHMgdG8gYXZvaWQgZHVwaW5nCiAgICAgICAgc2VsZi5kZWxldGVfYmxvY2tlcnMoWwogICAgICAgICAgICBvcy5wYXRoLmpvaW4oc2NyaXB0X2RpciwgYXJnc1swXSkKICAgICAgICAgICAgZm9yIGFyZ3MgaW4gU2NyaXB0V3JpdGVyLmdldF9hcmdzKGRpc3QpCiAgICAgICAgXSkKICAgICAgICAjIEJ1aWxkIC5lZ2cgZmlsZSBmcm9tIHRtcGRpcgogICAgICAgIGJkaXN0X2VnZy5tYWtlX3ppcGZpbGUoCiAgICAgICAgICAgIGVnZ19wYXRoLCBlZ2dfdG1wLCB2ZXJib3NlPXNlbGYudmVyYm9zZSwgZHJ5X3J1bj1zZWxmLmRyeV9ydW4sCiAgICAgICAgKQogICAgICAgICMgaW5zdGFsbCB0aGUgLmVnZwogICAgICAgIHJldHVybiBzZWxmLmluc3RhbGxfZWdnKGVnZ19wYXRoLCB0bXBkaXIpCgogICAgZGVmIGV4ZV90b19lZ2coc2VsZiwgZGlzdF9maWxlbmFtZSwgZWdnX3RtcCk6CiAgICAgICAgIiIiRXh0cmFjdCBhIGJkaXN0X3dpbmluc3QgdG8gdGhlIGRpcmVjdG9yaWVzIGFuIGVnZyB3b3VsZCB1c2UiIiIKICAgICAgICAjIENoZWNrIGZvciAucHRoIGZpbGUgYW5kIHNldCB1cCBwcmVmaXggdHJhbnNsYXRpb25zCiAgICAgICAgcHJlZml4ZXMgPSBnZXRfZXhlX3ByZWZpeGVzKGRpc3RfZmlsZW5hbWUpCiAgICAgICAgdG9fY29tcGlsZSA9IFtdCiAgICAgICAgbmF0aXZlX2xpYnMgPSBbXQogICAgICAgIHRvcF9sZXZlbCA9IHt9CgogICAgICAgIGRlZiBwcm9jZXNzKHNyYywgZHN0KToKICAgICAgICAgICAgcyA9IHNyYy5sb3dlcigpCiAgICAgICAgICAgIGZvciBvbGQsIG5ldyBpbiBwcmVmaXhlczoKICAgICAgICAgICAgICAgIGlmIHMuc3RhcnRzd2l0aChvbGQpOgogICAgICAgICAgICAgICAgICAgIHNyYyA9IG5ldyArIHNyY1tsZW4ob2xkKTpdCiAgICAgICAgICAgICAgICAgICAgcGFydHMgPSBzcmMuc3BsaXQoJy8nKQogICAgICAgICAgICAgICAgICAgIGRzdCA9IG9zLnBhdGguam9pbihlZ2dfdG1wLCAqcGFydHMpCiAgICAgICAgICAgICAgICAgICAgZGwgPSBkc3QubG93ZXIoKQogICAgICAgICAgICAgICAgICAgIGlmIGRsLmVuZHN3aXRoKCcucHlkJykgb3IgZGwuZW5kc3dpdGgoJy5kbGwnKToKICAgICAgICAgICAgICAgICAgICAgICAgcGFydHNbLTFdID0gYmRpc3RfZWdnLnN0cmlwX21vZHVsZShwYXJ0c1stMV0pCiAgICAgICAgICAgICAgICAgICAgICAgIHRvcF9sZXZlbFtvcy5wYXRoLnNwbGl0ZXh0KHBhcnRzWzBdKVswXV0gPSAxCiAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9saWJzLmFwcGVuZChzcmMpCiAgICAgICAgICAgICAgICAgICAgZWxpZiBkbC5lbmRzd2l0aCgnLnB5JykgYW5kIG9sZCAhPSAnU0NSSVBUUy8nOgogICAgICAgICAgICAgICAgICAgICAgICB0b3BfbGV2ZWxbb3MucGF0aC5zcGxpdGV4dChwYXJ0c1swXSlbMF1dID0gMQogICAgICAgICAgICAgICAgICAgICAgICB0b19jb21waWxlLmFwcGVuZChkc3QpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRzdAogICAgICAgICAgICBpZiBub3Qgc3JjLmVuZHN3aXRoKCcucHRoJyk6CiAgICAgICAgICAgICAgICBsb2cud2FybigiV0FSTklORzogY2FuJ3QgcHJvY2VzcyAlcyIsIHNyYykKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgIyBleHRyYWN0LCB0cmFja2luZyAucHlkLy5kbGwtPm5hdGl2ZV9saWJzIGFuZCAucHkgLT4gdG9fY29tcGlsZQogICAgICAgIHVucGFja19hcmNoaXZlKGRpc3RfZmlsZW5hbWUsIGVnZ190bXAsIHByb2Nlc3MpCiAgICAgICAgc3R1YnMgPSBbXQogICAgICAgIGZvciByZXMgaW4gbmF0aXZlX2xpYnM6CiAgICAgICAgICAgIGlmIHJlcy5sb3dlcigpLmVuZHN3aXRoKCcucHlkJyk6ICAjIGNyZWF0ZSBzdHVicyBmb3IgLnB5ZCdzCiAgICAgICAgICAgICAgICBwYXJ0cyA9IHJlcy5zcGxpdCgnLycpCiAgICAgICAgICAgICAgICByZXNvdXJjZSA9IHBhcnRzWy0xXQogICAgICAgICAgICAgICAgcGFydHNbLTFdID0gYmRpc3RfZWdnLnN0cmlwX21vZHVsZShwYXJ0c1stMV0pICsgJy5weScKICAgICAgICAgICAgICAgIHB5ZmlsZSA9IG9zLnBhdGguam9pbihlZ2dfdG1wLCAqcGFydHMpCiAgICAgICAgICAgICAgICB0b19jb21waWxlLmFwcGVuZChweWZpbGUpCiAgICAgICAgICAgICAgICBzdHVicy5hcHBlbmQocHlmaWxlKQogICAgICAgICAgICAgICAgYmRpc3RfZWdnLndyaXRlX3N0dWIocmVzb3VyY2UsIHB5ZmlsZSkKICAgICAgICBzZWxmLmJ5dGVfY29tcGlsZSh0b19jb21waWxlKSAgIyBjb21waWxlIC5weSdzCiAgICAgICAgYmRpc3RfZWdnLndyaXRlX3NhZmV0eV9mbGFnKAogICAgICAgICAgICBvcy5wYXRoLmpvaW4oZWdnX3RtcCwgJ0VHRy1JTkZPJyksCiAgICAgICAgICAgIGJkaXN0X2VnZy5hbmFseXplX2VnZyhlZ2dfdG1wLCBzdHVicykpICAjIHdyaXRlIHppcC1zYWZldHkgZmxhZwoKICAgICAgICBmb3IgbmFtZSBpbiAndG9wX2xldmVsJywgJ25hdGl2ZV9saWJzJzoKICAgICAgICAgICAgaWYgbG9jYWxzKClbbmFtZV06CiAgICAgICAgICAgICAgICB0eHQgPSBvcy5wYXRoLmpvaW4oZWdnX3RtcCwgJ0VHRy1JTkZPJywgbmFtZSArICcudHh0JykKICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyh0eHQpOgogICAgICAgICAgICAgICAgICAgIGYgPSBvcGVuKHR4dCwgJ3cnKQogICAgICAgICAgICAgICAgICAgIGYud3JpdGUoJ1xuJy5qb2luKGxvY2FscygpW25hbWVdKSArICdcbicpCiAgICAgICAgICAgICAgICAgICAgZi5jbG9zZSgpCgogICAgZGVmIGluc3RhbGxfd2hlZWwoc2VsZiwgd2hlZWxfcGF0aCwgdG1wZGlyKToKICAgICAgICB3aGVlbCA9IFdoZWVsKHdoZWVsX3BhdGgpCiAgICAgICAgYXNzZXJ0IHdoZWVsLmlzX2NvbXBhdGlibGUoKQogICAgICAgIGRlc3RpbmF0aW9uID0gb3MucGF0aC5qb2luKHNlbGYuaW5zdGFsbF9kaXIsIHdoZWVsLmVnZ19uYW1lKCkpCiAgICAgICAgZGVzdGluYXRpb24gPSBvcy5wYXRoLmFic3BhdGgoZGVzdGluYXRpb24pCiAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgZW5zdXJlX2RpcmVjdG9yeShkZXN0aW5hdGlvbikKICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGRlc3RpbmF0aW9uKSBhbmQgbm90IG9zLnBhdGguaXNsaW5rKGRlc3RpbmF0aW9uKToKICAgICAgICAgICAgZGlyX3V0aWwucmVtb3ZlX3RyZWUoZGVzdGluYXRpb24sIGRyeV9ydW49c2VsZi5kcnlfcnVuKQogICAgICAgIGVsaWYgb3MucGF0aC5leGlzdHMoZGVzdGluYXRpb24pOgogICAgICAgICAgICBzZWxmLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICBvcy51bmxpbmssCiAgICAgICAgICAgICAgICAoZGVzdGluYXRpb24sKSwKICAgICAgICAgICAgICAgICJSZW1vdmluZyAiICsgZGVzdGluYXRpb24sCiAgICAgICAgICAgICkKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYuZXhlY3V0ZSgKICAgICAgICAgICAgICAgIHdoZWVsLmluc3RhbGxfYXNfZWdnLAogICAgICAgICAgICAgICAgKGRlc3RpbmF0aW9uLCksCiAgICAgICAgICAgICAgICAoIkluc3RhbGxpbmcgJXMgdG8gJXMiKSAlICgKICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmJhc2VuYW1lKHdoZWVsX3BhdGgpLAogICAgICAgICAgICAgICAgICAgIG9zLnBhdGguZGlybmFtZShkZXN0aW5hdGlvbikKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICB1cGRhdGVfZGlzdF9jYWNoZXMoZGVzdGluYXRpb24sIGZpeF96aXBpbXBvcnRlcl9jYWNoZXM9RmFsc2UpCiAgICAgICAgc2VsZi5hZGRfb3V0cHV0KGRlc3RpbmF0aW9uKQogICAgICAgIHJldHVybiBzZWxmLmVnZ19kaXN0cmlidXRpb24oZGVzdGluYXRpb24pCgogICAgX19tdl93YXJuaW5nID0gdGV4dHdyYXAuZGVkZW50KCIiIgogICAgICAgIEJlY2F1c2UgdGhpcyBkaXN0cmlidXRpb24gd2FzIGluc3RhbGxlZCAtLW11bHRpLXZlcnNpb24sIGJlZm9yZSB5b3UgY2FuCiAgICAgICAgaW1wb3J0IG1vZHVsZXMgZnJvbSB0aGlzIHBhY2thZ2UgaW4gYW4gYXBwbGljYXRpb24sIHlvdSB3aWxsIG5lZWQgdG8KICAgICAgICAnaW1wb3J0IHBrZ19yZXNvdXJjZXMnIGFuZCB0aGVuIHVzZSBhICdyZXF1aXJlKCknIGNhbGwgc2ltaWxhciB0byBvbmUgb2YKICAgICAgICB0aGVzZSBleGFtcGxlcywgaW4gb3JkZXIgdG8gc2VsZWN0IHRoZSBkZXNpcmVkIHZlcnNpb246CgogICAgICAgICAgICBwa2dfcmVzb3VyY2VzLnJlcXVpcmUoIiUobmFtZSlzIikgICMgbGF0ZXN0IGluc3RhbGxlZCB2ZXJzaW9uCiAgICAgICAgICAgIHBrZ19yZXNvdXJjZXMucmVxdWlyZSgiJShuYW1lKXM9PSUodmVyc2lvbilzIikgICMgdGhpcyBleGFjdCB2ZXJzaW9uCiAgICAgICAgICAgIHBrZ19yZXNvdXJjZXMucmVxdWlyZSgiJShuYW1lKXM+PSUodmVyc2lvbilzIikgICMgdGhpcyB2ZXJzaW9uIG9yIGhpZ2hlcgogICAgICAgICIiIikubHN0cmlwKCkKCiAgICBfX2lkX3dhcm5pbmcgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiCiAgICAgICAgTm90ZSBhbHNvIHRoYXQgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgbXVzdCBiZSBvbiBzeXMucGF0aCBhdCBydW50aW1lIGZvcgogICAgICAgIHRoaXMgdG8gd29yay4gIChlLmcuIGJ5IGJlaW5nIHRoZSBhcHBsaWNhdGlvbidzIHNjcmlwdCBkaXJlY3RvcnksIGJ5IGJlaW5nIG9uCiAgICAgICAgUFlUSE9OUEFUSCwgb3IgYnkgYmVpbmcgYWRkZWQgdG8gc3lzLnBhdGggYnkgeW91ciBjb2RlLikKICAgICAgICAiIiIpCgogICAgZGVmIGluc3RhbGxhdGlvbl9yZXBvcnQoc2VsZiwgcmVxLCBkaXN0LCB3aGF0PSJJbnN0YWxsZWQiKToKICAgICAgICAiIiJIZWxwZnVsIGluc3RhbGxhdGlvbiBtZXNzYWdlIGZvciBkaXNwbGF5IHRvIHBhY2thZ2UgdXNlcnMiIiIKICAgICAgICBtc2cgPSAiXG4lKHdoYXQpcyAlKGVnZ2xvYylzJShleHRyYXMpcyIKICAgICAgICBpZiBzZWxmLm11bHRpX3ZlcnNpb24gYW5kIG5vdCBzZWxmLm5vX3JlcG9ydDoKICAgICAgICAgICAgbXNnICs9ICdcbicgKyBzZWxmLl9fbXZfd2FybmluZwogICAgICAgICAgICBpZiBzZWxmLmluc3RhbGxfZGlyIG5vdCBpbiBtYXAobm9ybWFsaXplX3BhdGgsIHN5cy5wYXRoKToKICAgICAgICAgICAgICAgIG1zZyArPSAnXG4nICsgc2VsZi5fX2lkX3dhcm5pbmcKCiAgICAgICAgZWdnbG9jID0gZGlzdC5sb2NhdGlvbgogICAgICAgIG5hbWUgPSBkaXN0LnByb2plY3RfbmFtZQogICAgICAgIHZlcnNpb24gPSBkaXN0LnZlcnNpb24KICAgICAgICBleHRyYXMgPSAnJyAgIyBUT0RPOiBzZWxmLnJlcG9ydF9leHRyYXMocmVxLCBkaXN0KQogICAgICAgIHJldHVybiBtc2cgJSBsb2NhbHMoKQoKICAgIF9fZWRpdGFibGVfbXNnID0gdGV4dHdyYXAuZGVkZW50KCIiIgogICAgICAgIEV4dHJhY3RlZCBlZGl0YWJsZSB2ZXJzaW9uIG9mICUoc3BlYylzIHRvICUoZGlybmFtZSlzCgogICAgICAgIElmIGl0IHVzZXMgc2V0dXB0b29scyBpbiBpdHMgc2V0dXAgc2NyaXB0LCB5b3UgY2FuIGFjdGl2YXRlIGl0IGluCiAgICAgICAgImRldmVsb3BtZW50IiBtb2RlIGJ5IGdvaW5nIHRvIHRoYXQgZGlyZWN0b3J5IGFuZCBydW5uaW5nOjoKCiAgICAgICAgICAgICUocHl0aG9uKXMgc2V0dXAucHkgZGV2ZWxvcAoKICAgICAgICBTZWUgdGhlIHNldHVwdG9vbHMgZG9jdW1lbnRhdGlvbiBmb3IgdGhlICJkZXZlbG9wIiBjb21tYW5kIGZvciBtb3JlIGluZm8uCiAgICAgICAgIiIiKS5sc3RyaXAoKQoKICAgIGRlZiByZXBvcnRfZWRpdGFibGUoc2VsZiwgc3BlYywgc2V0dXBfc2NyaXB0KToKICAgICAgICBkaXJuYW1lID0gb3MucGF0aC5kaXJuYW1lKHNldHVwX3NjcmlwdCkKICAgICAgICBweXRob24gPSBzeXMuZXhlY3V0YWJsZQogICAgICAgIHJldHVybiAnXG4nICsgc2VsZi5fX2VkaXRhYmxlX21zZyAlIGxvY2FscygpCgogICAgZGVmIHJ1bl9zZXR1cChzZWxmLCBzZXR1cF9zY3JpcHQsIHNldHVwX2Jhc2UsIGFyZ3MpOgogICAgICAgIHN5cy5tb2R1bGVzLnNldGRlZmF1bHQoJ2Rpc3R1dGlscy5jb21tYW5kLmJkaXN0X2VnZycsIGJkaXN0X2VnZykKICAgICAgICBzeXMubW9kdWxlcy5zZXRkZWZhdWx0KCdkaXN0dXRpbHMuY29tbWFuZC5lZ2dfaW5mbycsIGVnZ19pbmZvKQoKICAgICAgICBhcmdzID0gbGlzdChhcmdzKQogICAgICAgIGlmIHNlbGYudmVyYm9zZSA+IDI6CiAgICAgICAgICAgIHYgPSAndicgKiAoc2VsZi52ZXJib3NlIC0gMSkKICAgICAgICAgICAgYXJncy5pbnNlcnQoMCwgJy0nICsgdikKICAgICAgICBlbGlmIHNlbGYudmVyYm9zZSA8IDI6CiAgICAgICAgICAgIGFyZ3MuaW5zZXJ0KDAsICctcScpCiAgICAgICAgaWYgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICBhcmdzLmluc2VydCgwLCAnLW4nKQogICAgICAgIGxvZy5pbmZvKAogICAgICAgICAgICAiUnVubmluZyAlcyAlcyIsIHNldHVwX3NjcmlwdFtsZW4oc2V0dXBfYmFzZSkgKyAxOl0sICcgJy5qb2luKGFyZ3MpCiAgICAgICAgKQogICAgICAgIHRyeToKICAgICAgICAgICAgcnVuX3NldHVwKHNldHVwX3NjcmlwdCwgYXJncykKICAgICAgICBleGNlcHQgU3lzdGVtRXhpdCBhcyB2OgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigiU2V0dXAgc2NyaXB0IGV4aXRlZCB3aXRoICVzIiAlICh2LmFyZ3NbMF0sKSkKCiAgICBkZWYgYnVpbGRfYW5kX2luc3RhbGwoc2VsZiwgc2V0dXBfc2NyaXB0LCBzZXR1cF9iYXNlKToKICAgICAgICBhcmdzID0gWydiZGlzdF9lZ2cnLCAnLS1kaXN0LWRpciddCgogICAgICAgIGRpc3RfZGlyID0gdGVtcGZpbGUubWtkdGVtcCgKICAgICAgICAgICAgcHJlZml4PSdlZ2ctZGlzdC10bXAtJywgZGlyPW9zLnBhdGguZGlybmFtZShzZXR1cF9zY3JpcHQpCiAgICAgICAgKQogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5fc2V0X2ZldGNoZXJfb3B0aW9ucyhvcy5wYXRoLmRpcm5hbWUoc2V0dXBfc2NyaXB0KSkKICAgICAgICAgICAgYXJncy5hcHBlbmQoZGlzdF9kaXIpCgogICAgICAgICAgICBzZWxmLnJ1bl9zZXR1cChzZXR1cF9zY3JpcHQsIHNldHVwX2Jhc2UsIGFyZ3MpCiAgICAgICAgICAgIGFsbF9lZ2dzID0gRW52aXJvbm1lbnQoW2Rpc3RfZGlyXSkKICAgICAgICAgICAgZWdncyA9IFtdCiAgICAgICAgICAgIGZvciBrZXkgaW4gYWxsX2VnZ3M6CiAgICAgICAgICAgICAgICBmb3IgZGlzdCBpbiBhbGxfZWdnc1trZXldOgogICAgICAgICAgICAgICAgICAgIGVnZ3MuYXBwZW5kKHNlbGYuaW5zdGFsbF9lZ2coZGlzdC5sb2NhdGlvbiwgc2V0dXBfYmFzZSkpCiAgICAgICAgICAgIGlmIG5vdCBlZ2dzIGFuZCBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICAgICAgbG9nLndhcm4oIk5vIGVnZ3MgZm91bmQgaW4gJXMgKHNldHVwIHNjcmlwdCBwcm9ibGVtPykiLAogICAgICAgICAgICAgICAgICAgICAgICAgZGlzdF9kaXIpCiAgICAgICAgICAgIHJldHVybiBlZ2dzCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgcm10cmVlKGRpc3RfZGlyKQogICAgICAgICAgICBsb2cuc2V0X3ZlcmJvc2l0eShzZWxmLnZlcmJvc2UpICAjIHJlc3RvcmUgb3VyIGxvZyB2ZXJib3NpdHkKCiAgICBkZWYgX3NldF9mZXRjaGVyX29wdGlvbnMoc2VsZiwgYmFzZSk6CiAgICAgICAgIiIiCiAgICAgICAgV2hlbiBlYXN5X2luc3RhbGwgaXMgYWJvdXQgdG8gcnVuIGJkaXN0X2VnZyBvbiBhIHNvdXJjZSBkaXN0LCB0aGF0CiAgICAgICAgc291cmNlIGRpc3QgbWlnaHQgaGF2ZSAnc2V0dXBfcmVxdWlyZXMnIGRpcmVjdGl2ZXMsIHJlcXVpcmluZwogICAgICAgIGFkZGl0aW9uYWwgZmV0Y2hpbmcuIEVuc3VyZSB0aGUgZmV0Y2hlciBvcHRpb25zIGdpdmVuIHRvIGVhc3lfaW5zdGFsbAogICAgICAgIGFyZSBhdmFpbGFibGUgdG8gdGhhdCBjb21tYW5kIGFzIHdlbGwuCiAgICAgICAgIiIiCiAgICAgICAgIyBmaW5kIHRoZSBmZXRjaCBvcHRpb25zIGZyb20gZWFzeV9pbnN0YWxsIGFuZCB3cml0ZSB0aGVtIG91dAogICAgICAgICMgdG8gdGhlIHNldHVwLmNmZyBmaWxlLgogICAgICAgIGVpX29wdHMgPSBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfb3B0aW9uX2RpY3QoJ2Vhc3lfaW5zdGFsbCcpLmNvcHkoKQogICAgICAgIGZldGNoX2RpcmVjdGl2ZXMgPSAoCiAgICAgICAgICAgICdmaW5kX2xpbmtzJywgJ3NpdGVfZGlycycsICdpbmRleF91cmwnLCAnb3B0aW1pemUnLCAnYWxsb3dfaG9zdHMnLAogICAgICAgICkKICAgICAgICBmZXRjaF9vcHRpb25zID0ge30KICAgICAgICBmb3Iga2V5LCB2YWwgaW4gZWlfb3B0cy5pdGVtcygpOgogICAgICAgICAgICBpZiBrZXkgbm90IGluIGZldGNoX2RpcmVjdGl2ZXM6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBmZXRjaF9vcHRpb25zW2tleS5yZXBsYWNlKCdfJywgJy0nKV0gPSB2YWxbMV0KICAgICAgICAjIGNyZWF0ZSBhIHNldHRpbmdzIGRpY3Rpb25hcnkgc3VpdGFibGUgZm9yIGBlZGl0X2NvbmZpZ2AKICAgICAgICBzZXR0aW5ncyA9IGRpY3QoZWFzeV9pbnN0YWxsPWZldGNoX29wdGlvbnMpCiAgICAgICAgY2ZnX2ZpbGVuYW1lID0gb3MucGF0aC5qb2luKGJhc2UsICdzZXR1cC5jZmcnKQogICAgICAgIHNldG9wdC5lZGl0X2NvbmZpZyhjZmdfZmlsZW5hbWUsIHNldHRpbmdzKQoKICAgIGRlZiB1cGRhdGVfcHRoKHNlbGYsIGRpc3QpOgogICAgICAgIGlmIHNlbGYucHRoX2ZpbGUgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGZvciBkIGluIHNlbGYucHRoX2ZpbGVbZGlzdC5rZXldOiAgIyBkcm9wIG9sZCBlbnRyaWVzCiAgICAgICAgICAgIGlmIHNlbGYubXVsdGlfdmVyc2lvbiBvciBkLmxvY2F0aW9uICE9IGRpc3QubG9jYXRpb246CiAgICAgICAgICAgICAgICBsb2cuaW5mbygiUmVtb3ZpbmcgJXMgZnJvbSBlYXN5LWluc3RhbGwucHRoIGZpbGUiLCBkKQogICAgICAgICAgICAgICAgc2VsZi5wdGhfZmlsZS5yZW1vdmUoZCkKICAgICAgICAgICAgICAgIGlmIGQubG9jYXRpb24gaW4gc2VsZi5zaGFkb3dfcGF0aDoKICAgICAgICAgICAgICAgICAgICBzZWxmLnNoYWRvd19wYXRoLnJlbW92ZShkLmxvY2F0aW9uKQoKICAgICAgICBpZiBub3Qgc2VsZi5tdWx0aV92ZXJzaW9uOgogICAgICAgICAgICBpZiBkaXN0LmxvY2F0aW9uIGluIHNlbGYucHRoX2ZpbGUucGF0aHM6CiAgICAgICAgICAgICAgICBsb2cuaW5mbygKICAgICAgICAgICAgICAgICAgICAiJXMgaXMgYWxyZWFkeSB0aGUgYWN0aXZlIHZlcnNpb24gaW4gZWFzeS1pbnN0YWxsLnB0aCIsCiAgICAgICAgICAgICAgICAgICAgZGlzdCwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJBZGRpbmcgJXMgdG8gZWFzeS1pbnN0YWxsLnB0aCBmaWxlIiwgZGlzdCkKICAgICAgICAgICAgICAgIHNlbGYucHRoX2ZpbGUuYWRkKGRpc3QpICAjIGFkZCBuZXcgZW50cnkKICAgICAgICAgICAgICAgIGlmIGRpc3QubG9jYXRpb24gbm90IGluIHNlbGYuc2hhZG93X3BhdGg6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zaGFkb3dfcGF0aC5hcHBlbmQoZGlzdC5sb2NhdGlvbikKCiAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKCiAgICAgICAgICAgIHNlbGYucHRoX2ZpbGUuc2F2ZSgpCgogICAgICAgICAgICBpZiBkaXN0LmtleSA9PSAnc2V0dXB0b29scyc6CiAgICAgICAgICAgICAgICAjIEVuc3VyZSB0aGF0IHNldHVwdG9vbHMgaXRzZWxmIG5ldmVyIGJlY29tZXMgdW5hdmFpbGFibGUhCiAgICAgICAgICAgICAgICAjIFhYWCBzaG91bGQgdGhpcyBjaGVjayBmb3IgbGF0ZXN0IHZlcnNpb24/CiAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGguam9pbihzZWxmLmluc3RhbGxfZGlyLCAnc2V0dXB0b29scy5wdGgnKQogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2xpbmsoZmlsZW5hbWUpOgogICAgICAgICAgICAgICAgICAgIG9zLnVubGluayhmaWxlbmFtZSkKICAgICAgICAgICAgICAgIGYgPSBvcGVuKGZpbGVuYW1lLCAnd3QnKQogICAgICAgICAgICAgICAgZi53cml0ZShzZWxmLnB0aF9maWxlLm1ha2VfcmVsYXRpdmUoZGlzdC5sb2NhdGlvbikgKyAnXG4nKQogICAgICAgICAgICAgICAgZi5jbG9zZSgpCgogICAgZGVmIHVucGFja19wcm9ncmVzcyhzZWxmLCBzcmMsIGRzdCk6CiAgICAgICAgIyBQcm9ncmVzcyBmaWx0ZXIgZm9yIHVucGFja2luZwogICAgICAgIGxvZy5kZWJ1ZygiVW5wYWNraW5nICVzIHRvICVzIiwgc3JjLCBkc3QpCiAgICAgICAgcmV0dXJuIGRzdCAgIyBvbmx5IHVucGFjay1hbmQtY29tcGlsZSBza2lwcyBmaWxlcyBmb3IgZHJ5IHJ1bgoKICAgIGRlZiB1bnBhY2tfYW5kX2NvbXBpbGUoc2VsZiwgZWdnX3BhdGgsIGRlc3RpbmF0aW9uKToKICAgICAgICB0b19jb21waWxlID0gW10KICAgICAgICB0b19jaG1vZCA9IFtdCgogICAgICAgIGRlZiBwZihzcmMsIGRzdCk6CiAgICAgICAgICAgIGlmIGRzdC5lbmRzd2l0aCgnLnB5JykgYW5kIG5vdCBzcmMuc3RhcnRzd2l0aCgnRUdHLUlORk8vJyk6CiAgICAgICAgICAgICAgICB0b19jb21waWxlLmFwcGVuZChkc3QpCiAgICAgICAgICAgIGVsaWYgZHN0LmVuZHN3aXRoKCcuZGxsJykgb3IgZHN0LmVuZHN3aXRoKCcuc28nKToKICAgICAgICAgICAgICAgIHRvX2NobW9kLmFwcGVuZChkc3QpCiAgICAgICAgICAgIHNlbGYudW5wYWNrX3Byb2dyZXNzKHNyYywgZHN0KQogICAgICAgICAgICByZXR1cm4gbm90IHNlbGYuZHJ5X3J1biBhbmQgZHN0IG9yIE5vbmUKCiAgICAgICAgdW5wYWNrX2FyY2hpdmUoZWdnX3BhdGgsIGRlc3RpbmF0aW9uLCBwZikKICAgICAgICBzZWxmLmJ5dGVfY29tcGlsZSh0b19jb21waWxlKQogICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgIGZvciBmIGluIHRvX2NobW9kOgogICAgICAgICAgICAgICAgbW9kZSA9ICgob3Muc3RhdChmKVtzdGF0LlNUX01PREVdKSB8IDBvNTU1KSAmIDBvNzc1NQogICAgICAgICAgICAgICAgY2htb2QoZiwgbW9kZSkKCiAgICBkZWYgYnl0ZV9jb21waWxlKHNlbGYsIHRvX2NvbXBpbGUpOgogICAgICAgIGlmIHN5cy5kb250X3dyaXRlX2J5dGVjb2RlOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgYnl0ZV9jb21waWxlCgogICAgICAgIHRyeToKICAgICAgICAgICAgIyB0cnkgdG8gbWFrZSB0aGUgYnl0ZSBjb21waWxlIG1lc3NhZ2VzIHF1aWV0ZXIKICAgICAgICAgICAgbG9nLnNldF92ZXJib3NpdHkoc2VsZi52ZXJib3NlIC0gMSkKCiAgICAgICAgICAgIGJ5dGVfY29tcGlsZSh0b19jb21waWxlLCBvcHRpbWl6ZT0wLCBmb3JjZT0xLCBkcnlfcnVuPXNlbGYuZHJ5X3J1bikKICAgICAgICAgICAgaWYgc2VsZi5vcHRpbWl6ZToKICAgICAgICAgICAgICAgIGJ5dGVfY29tcGlsZSgKICAgICAgICAgICAgICAgICAgICB0b19jb21waWxlLCBvcHRpbWl6ZT1zZWxmLm9wdGltaXplLCBmb3JjZT0xLAogICAgICAgICAgICAgICAgICAgIGRyeV9ydW49c2VsZi5kcnlfcnVuLAogICAgICAgICAgICAgICAgKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGxvZy5zZXRfdmVyYm9zaXR5KHNlbGYudmVyYm9zZSkgICMgcmVzdG9yZSBvcmlnaW5hbCB2ZXJib3NpdHkKCiAgICBfX25vX2RlZmF1bHRfbXNnID0gdGV4dHdyYXAuZGVkZW50KCIiIgogICAgICAgIGJhZCBpbnN0YWxsIGRpcmVjdG9yeSBvciBQWVRIT05QQVRICgogICAgICAgIFlvdSBhcmUgYXR0ZW1wdGluZyB0byBpbnN0YWxsIGEgcGFja2FnZSB0byBhIGRpcmVjdG9yeSB0aGF0IGlzIG5vdAogICAgICAgIG9uIFBZVEhPTlBBVEggYW5kIHdoaWNoIFB5dGhvbiBkb2VzIG5vdCByZWFkICIucHRoIiBmaWxlcyBmcm9tLiAgVGhlCiAgICAgICAgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSB5b3Ugc3BlY2lmaWVkICh2aWEgLS1pbnN0YWxsLWRpciwgLS1wcmVmaXgsIG9yCiAgICAgICAgdGhlIGRpc3R1dGlscyBkZWZhdWx0IHNldHRpbmcpIHdhczoKCiAgICAgICAgICAgICVzCgogICAgICAgIGFuZCB5b3VyIFBZVEhPTlBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUgY3VycmVudGx5IGNvbnRhaW5zOgoKICAgICAgICAgICAgJXIKCiAgICAgICAgSGVyZSBhcmUgc29tZSBvZiB5b3VyIG9wdGlvbnMgZm9yIGNvcnJlY3RpbmcgdGhlIHByb2JsZW06CgogICAgICAgICogWW91IGNhbiBjaG9vc2UgYSBkaWZmZXJlbnQgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSwgaS5lLiwgb25lIHRoYXQgaXMKICAgICAgICAgIG9uIFBZVEhPTlBBVEggb3Igc3VwcG9ydHMgLnB0aCBmaWxlcwoKICAgICAgICAqIFlvdSBjYW4gYWRkIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IHRvIHRoZSBQWVRIT05QQVRIIGVudmlyb25tZW50CiAgICAgICAgICB2YXJpYWJsZS4gIChJdCBtdXN0IHRoZW4gYWxzbyBiZSBvbiBQWVRIT05QQVRIIHdoZW5ldmVyIHlvdSBydW4KICAgICAgICAgIFB5dGhvbiBhbmQgd2FudCB0byB1c2UgdGhlIHBhY2thZ2UocykgeW91IGFyZSBpbnN0YWxsaW5nLikKCiAgICAgICAgKiBZb3UgY2FuIHNldCB1cCB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSB0byBzdXBwb3J0ICIucHRoIiBmaWxlcyBieQogICAgICAgICAgdXNpbmcgb25lIG9mIHRoZSBhcHByb2FjaGVzIGRlc2NyaWJlZCBoZXJlOgoKICAgICAgICAgIGh0dHBzOi8vc2V0dXB0b29scy5yZWFkdGhlZG9jcy5pby9lbi9sYXRlc3QvZWFzeV9pbnN0YWxsLmh0bWwjY3VzdG9tLWluc3RhbGxhdGlvbi1sb2NhdGlvbnMKCgogICAgICAgIFBsZWFzZSBtYWtlIHRoZSBhcHByb3ByaWF0ZSBjaGFuZ2VzIGZvciB5b3VyIHN5c3RlbSBhbmQgdHJ5IGFnYWluLiIiIikubHN0cmlwKCkKCiAgICBkZWYgbm9fZGVmYXVsdF92ZXJzaW9uX21zZyhzZWxmKToKICAgICAgICB0ZW1wbGF0ZSA9IHNlbGYuX19ub19kZWZhdWx0X21zZwogICAgICAgIHJldHVybiB0ZW1wbGF0ZSAlIChzZWxmLmluc3RhbGxfZGlyLCBvcy5lbnZpcm9uLmdldCgnUFlUSE9OUEFUSCcsICcnKSkKCiAgICBkZWYgaW5zdGFsbF9zaXRlX3B5KHNlbGYpOgogICAgICAgICIiIk1ha2Ugc3VyZSB0aGVyZSdzIGEgc2l0ZS5weSBpbiB0aGUgdGFyZ2V0IGRpciwgaWYgbmVlZGVkIiIiCgogICAgICAgIGlmIHNlbGYuc2l0ZXB5X2luc3RhbGxlZDoKICAgICAgICAgICAgcmV0dXJuICAjIGFscmVhZHkgZGlkIGl0LCBvciBkb24ndCBuZWVkIHRvCgogICAgICAgIHNpdGVweSA9IG9zLnBhdGguam9pbihzZWxmLmluc3RhbGxfZGlyLCAic2l0ZS5weSIpCiAgICAgICAgc291cmNlID0gcmVzb3VyY2Vfc3RyaW5nKCJzZXR1cHRvb2xzIiwgInNpdGUtcGF0Y2gucHkiKQogICAgICAgIHNvdXJjZSA9IHNvdXJjZS5kZWNvZGUoJ3V0Zi04JykKICAgICAgICBjdXJyZW50ID0gIiIKCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoc2l0ZXB5KToKICAgICAgICAgICAgbG9nLmRlYnVnKCJDaGVja2luZyBleGlzdGluZyBzaXRlLnB5IGluICVzIiwgc2VsZi5pbnN0YWxsX2RpcikKICAgICAgICAgICAgd2l0aCBpby5vcGVuKHNpdGVweSkgYXMgc3RybToKICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBzdHJtLnJlYWQoKQoKICAgICAgICAgICAgaWYgbm90IGN1cnJlbnQuc3RhcnRzd2l0aCgnZGVmIF9fYm9vdCgpOicpOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgIiVzIGlzIG5vdCBhIHNldHVwdG9vbHMtZ2VuZXJhdGVkIHNpdGUucHk7IHBsZWFzZSIKICAgICAgICAgICAgICAgICAgICAiIHJlbW92ZSBpdC4iICUgc2l0ZXB5CiAgICAgICAgICAgICAgICApCgogICAgICAgIGlmIGN1cnJlbnQgIT0gc291cmNlOgogICAgICAgICAgICBsb2cuaW5mbygiQ3JlYXRpbmcgJXMiLCBzaXRlcHkpCiAgICAgICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgICAgICBlbnN1cmVfZGlyZWN0b3J5KHNpdGVweSkKICAgICAgICAgICAgICAgIHdpdGggaW8ub3BlbihzaXRlcHksICd3JywgZW5jb2Rpbmc9J3V0Zi04JykgYXMgc3RybToKICAgICAgICAgICAgICAgICAgICBzdHJtLndyaXRlKHNvdXJjZSkKICAgICAgICAgICAgc2VsZi5ieXRlX2NvbXBpbGUoW3NpdGVweV0pCgogICAgICAgIHNlbGYuc2l0ZXB5X2luc3RhbGxlZCA9IFRydWUKCiAgICBkZWYgY3JlYXRlX2hvbWVfcGF0aChzZWxmKToKICAgICAgICAiIiJDcmVhdGUgZGlyZWN0b3JpZXMgdW5kZXIgfi4iIiIKICAgICAgICBpZiBub3Qgc2VsZi51c2VyOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBob21lID0gY29udmVydF9wYXRoKG9zLnBhdGguZXhwYW5kdXNlcigifiIpKQogICAgICAgIGZvciBuYW1lLCBwYXRoIGluIHNpeC5pdGVyaXRlbXMoc2VsZi5jb25maWdfdmFycyk6CiAgICAgICAgICAgIGlmIHBhdGguc3RhcnRzd2l0aChob21lKSBhbmQgbm90IG9zLnBhdGguaXNkaXIocGF0aCk6CiAgICAgICAgICAgICAgICBzZWxmLmRlYnVnX3ByaW50KCJvcy5tYWtlZGlycygnJXMnLCAwbzcwMCkiICUgcGF0aCkKICAgICAgICAgICAgICAgIG9zLm1ha2VkaXJzKHBhdGgsIDBvNzAwKQoKICAgIElOU1RBTExfU0NIRU1FUyA9IGRpY3QoCiAgICAgICAgcG9zaXg9ZGljdCgKICAgICAgICAgICAgaW5zdGFsbF9kaXI9JyRiYXNlL2xpYi9weXRob24kcHlfdmVyc2lvbl9zaG9ydC9zaXRlLXBhY2thZ2VzJywKICAgICAgICAgICAgc2NyaXB0X2Rpcj0nJGJhc2UvYmluJywKICAgICAgICApLAogICAgKQoKICAgIERFRkFVTFRfU0NIRU1FID0gZGljdCgKICAgICAgICBpbnN0YWxsX2Rpcj0nJGJhc2UvTGliL3NpdGUtcGFja2FnZXMnLAogICAgICAgIHNjcmlwdF9kaXI9JyRiYXNlL1NjcmlwdHMnLAogICAgKQoKICAgIGRlZiBfZXhwYW5kKHNlbGYsICphdHRycyk6CiAgICAgICAgY29uZmlnX3ZhcnMgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnaW5zdGFsbCcpLmNvbmZpZ192YXJzCgogICAgICAgIGlmIHNlbGYucHJlZml4OgogICAgICAgICAgICAjIFNldCBkZWZhdWx0IGluc3RhbGxfZGlyL3NjcmlwdHMgZnJvbSAtLXByZWZpeAogICAgICAgICAgICBjb25maWdfdmFycyA9IGNvbmZpZ192YXJzLmNvcHkoKQogICAgICAgICAgICBjb25maWdfdmFyc1snYmFzZSddID0gc2VsZi5wcmVmaXgKICAgICAgICAgICAgc2NoZW1lID0gc2VsZi5JTlNUQUxMX1NDSEVNRVMuZ2V0KG9zLm5hbWUsIHNlbGYuREVGQVVMVF9TQ0hFTUUpCiAgICAgICAgICAgIGZvciBhdHRyLCB2YWwgaW4gc2NoZW1lLml0ZW1zKCk6CiAgICAgICAgICAgICAgICBpZiBnZXRhdHRyKHNlbGYsIGF0dHIsIE5vbmUpIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBhdHRyLCB2YWwpCgogICAgICAgIGZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IHN1YnN0X3ZhcnMKCiAgICAgICAgZm9yIGF0dHIgaW4gYXR0cnM6CiAgICAgICAgICAgIHZhbCA9IGdldGF0dHIoc2VsZiwgYXR0cikKICAgICAgICAgICAgaWYgdmFsIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgdmFsID0gc3Vic3RfdmFycyh2YWwsIGNvbmZpZ192YXJzKQogICAgICAgICAgICAgICAgaWYgb3MubmFtZSA9PSAncG9zaXgnOgogICAgICAgICAgICAgICAgICAgIHZhbCA9IG9zLnBhdGguZXhwYW5kdXNlcih2YWwpCiAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGF0dHIsIHZhbCkKCgpkZWYgX3B5dGhvbnBhdGgoKToKICAgIGl0ZW1zID0gb3MuZW52aXJvbi5nZXQoJ1BZVEhPTlBBVEgnLCAnJykuc3BsaXQob3MucGF0aHNlcCkKICAgIHJldHVybiBmaWx0ZXIoTm9uZSwgaXRlbXMpCgoKZGVmIGdldF9zaXRlX2RpcnMoKToKICAgICIiIgogICAgUmV0dXJuIGEgbGlzdCBvZiAnc2l0ZScgZGlycwogICAgIiIiCgogICAgc2l0ZWRpcnMgPSBbXQoKICAgICMgc3RhcnQgd2l0aCBQWVRIT05QQVRICiAgICBzaXRlZGlycy5leHRlbmQoX3B5dGhvbnBhdGgoKSkKCiAgICBwcmVmaXhlcyA9IFtzeXMucHJlZml4XQogICAgaWYgc3lzLmV4ZWNfcHJlZml4ICE9IHN5cy5wcmVmaXg6CiAgICAgICAgcHJlZml4ZXMuYXBwZW5kKHN5cy5leGVjX3ByZWZpeCkKICAgIGZvciBwcmVmaXggaW4gcHJlZml4ZXM6CiAgICAgICAgaWYgcHJlZml4OgogICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0gaW4gKCdvczJlbXgnLCAncmlzY29zJyk6CiAgICAgICAgICAgICAgICBzaXRlZGlycy5hcHBlbmQob3MucGF0aC5qb2luKHByZWZpeCwgIkxpYiIsICJzaXRlLXBhY2thZ2VzIikpCiAgICAgICAgICAgIGVsaWYgb3Muc2VwID09ICcvJzoKICAgICAgICAgICAgICAgIHNpdGVkaXJzLmV4dGVuZChbCiAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKAogICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICJsaWIiLAogICAgICAgICAgICAgICAgICAgICAgICAicHl0aG9ue30ue30iLmZvcm1hdCgqc3lzLnZlcnNpb25faW5mbyksCiAgICAgICAgICAgICAgICAgICAgICAgICJzaXRlLXBhY2thZ2VzIiwKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihwcmVmaXgsICJsaWIiLCAic2l0ZS1weXRob24iKSwKICAgICAgICAgICAgICAgIF0pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzaXRlZGlycy5leHRlbmQoWwogICAgICAgICAgICAgICAgICAgIHByZWZpeCwKICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4ocHJlZml4LCAibGliIiwgInNpdGUtcGFja2FnZXMiKSwKICAgICAgICAgICAgICAgIF0pCiAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKICAgICAgICAgICAgICAgICMgZm9yIGZyYW1ld29yayBidWlsZHMgKm9ubHkqIHdlIGFkZCB0aGUgc3RhbmRhcmQgQXBwbGUKICAgICAgICAgICAgICAgICMgbG9jYXRpb25zLiBDdXJyZW50bHkgb25seSBwZXItdXNlciwgYnV0IC9MaWJyYXJ5IGFuZAogICAgICAgICAgICAgICAgIyAvTmV0d29yay9MaWJyYXJ5IGNvdWxkIGJlIGFkZGVkIHRvbwogICAgICAgICAgICAgICAgaWYgJ1B5dGhvbi5mcmFtZXdvcmsnIGluIHByZWZpeDoKICAgICAgICAgICAgICAgICAgICBob21lID0gb3MuZW52aXJvbi5nZXQoJ0hPTUUnKQogICAgICAgICAgICAgICAgICAgIGlmIGhvbWU6CiAgICAgICAgICAgICAgICAgICAgICAgIGhvbWVfc3AgPSBvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob21lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0xpYnJhcnknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1B5dGhvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAne30ue30nLmZvcm1hdCgqc3lzLnZlcnNpb25faW5mbyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2l0ZS1wYWNrYWdlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgc2l0ZWRpcnMuYXBwZW5kKGhvbWVfc3ApCiAgICBsaWJfcGF0aHMgPSBnZXRfcGF0aCgncHVyZWxpYicpLCBnZXRfcGF0aCgncGxhdGxpYicpCiAgICBmb3Igc2l0ZV9saWIgaW4gbGliX3BhdGhzOgogICAgICAgIGlmIHNpdGVfbGliIG5vdCBpbiBzaXRlZGlyczoKICAgICAgICAgICAgc2l0ZWRpcnMuYXBwZW5kKHNpdGVfbGliKQoKICAgIGlmIHNpdGUuRU5BQkxFX1VTRVJfU0lURToKICAgICAgICBzaXRlZGlycy5hcHBlbmQoc2l0ZS5VU0VSX1NJVEUpCgogICAgdHJ5OgogICAgICAgIHNpdGVkaXJzLmV4dGVuZChzaXRlLmdldHNpdGVwYWNrYWdlcygpKQogICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgIHBhc3MKCiAgICBzaXRlZGlycyA9IGxpc3QobWFwKG5vcm1hbGl6ZV9wYXRoLCBzaXRlZGlycykpCgogICAgcmV0dXJuIHNpdGVkaXJzCgoKZGVmIGV4cGFuZF9wYXRocyhpbnB1dHMpOgogICAgIiIiWWllbGQgc3lzLnBhdGggZGlyZWN0b3JpZXMgdGhhdCBtaWdodCBjb250YWluICJvbGQtc3R5bGUiIHBhY2thZ2VzIiIiCgogICAgc2VlbiA9IHt9CgogICAgZm9yIGRpcm5hbWUgaW4gaW5wdXRzOgogICAgICAgIGRpcm5hbWUgPSBub3JtYWxpemVfcGF0aChkaXJuYW1lKQogICAgICAgIGlmIGRpcm5hbWUgaW4gc2VlbjoKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgc2VlbltkaXJuYW1lXSA9IDEKICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihkaXJuYW1lKToKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgZmlsZXMgPSBvcy5saXN0ZGlyKGRpcm5hbWUpCiAgICAgICAgeWllbGQgZGlybmFtZSwgZmlsZXMKCiAgICAgICAgZm9yIG5hbWUgaW4gZmlsZXM6CiAgICAgICAgICAgIGlmIG5vdCBuYW1lLmVuZHN3aXRoKCcucHRoJyk6CiAgICAgICAgICAgICAgICAjIFdlIG9ubHkgY2FyZSBhYm91dCB0aGUgLnB0aCBmaWxlcwogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgbmFtZSBpbiAoJ2Vhc3ktaW5zdGFsbC5wdGgnLCAnc2V0dXB0b29scy5wdGgnKToKICAgICAgICAgICAgICAgICMgSWdub3JlIC5wdGggZmlsZXMgdGhhdCB3ZSBjb250cm9sCiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgIyBSZWFkIHRoZSAucHRoIGZpbGUKICAgICAgICAgICAgZiA9IG9wZW4ob3MucGF0aC5qb2luKGRpcm5hbWUsIG5hbWUpKQogICAgICAgICAgICBsaW5lcyA9IGxpc3QoeWllbGRfbGluZXMoZikpCiAgICAgICAgICAgIGYuY2xvc2UoKQoKICAgICAgICAgICAgIyBZaWVsZCBleGlzdGluZyBub24tZHVwZSwgbm9uLWltcG9ydCBkaXJlY3RvcnkgbGluZXMgZnJvbSBpdAogICAgICAgICAgICBmb3IgbGluZSBpbiBsaW5lczoKICAgICAgICAgICAgICAgIGlmIG5vdCBsaW5lLnN0YXJ0c3dpdGgoImltcG9ydCIpOgogICAgICAgICAgICAgICAgICAgIGxpbmUgPSBub3JtYWxpemVfcGF0aChsaW5lLnJzdHJpcCgpKQogICAgICAgICAgICAgICAgICAgIGlmIGxpbmUgbm90IGluIHNlZW46CiAgICAgICAgICAgICAgICAgICAgICAgIHNlZW5bbGluZV0gPSAxCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKGxpbmUpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgbGluZSwgb3MubGlzdGRpcihsaW5lKQoKCmRlZiBleHRyYWN0X3dpbmluc3RfY2ZnKGRpc3RfZmlsZW5hbWUpOgogICAgIiIiRXh0cmFjdCBjb25maWd1cmF0aW9uIGRhdGEgZnJvbSBhIGJkaXN0X3dpbmluc3QgLmV4ZQoKICAgIFJldHVybnMgYSBjb25maWdwYXJzZXIuUmF3Q29uZmlnUGFyc2VyLCBvciBOb25lCiAgICAiIiIKICAgIGYgPSBvcGVuKGRpc3RfZmlsZW5hbWUsICdyYicpCiAgICB0cnk6CiAgICAgICAgZW5kcmVjID0gemlwZmlsZS5fRW5kUmVjRGF0YShmKQogICAgICAgIGlmIGVuZHJlYyBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICBwcmVwZW5kZWQgPSAoZW5kcmVjWzldIC0gZW5kcmVjWzVdKSAtIGVuZHJlY1s2XQogICAgICAgIGlmIHByZXBlbmRlZCA8IDEyOiAgIyBubyB3aW5pbnN0IGRhdGEgaGVyZQogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIGYuc2VlayhwcmVwZW5kZWQgLSAxMikKCiAgICAgICAgdGFnLCBjZmdsZW4sIGJtbGVuID0gc3RydWN0LnVucGFjaygiPGlpaSIsIGYucmVhZCgxMikpCiAgICAgICAgaWYgdGFnIG5vdCBpbiAoMHgxMjM0NTY3QSwgMHgxMjM0NTY3Qik6CiAgICAgICAgICAgIHJldHVybiBOb25lICAjIG5vdCBhIHZhbGlkIHRhZwoKICAgICAgICBmLnNlZWsocHJlcGVuZGVkIC0gKDEyICsgY2ZnbGVuKSkKICAgICAgICBpbml0ID0geyd2ZXJzaW9uJzogJycsICd0YXJnZXRfdmVyc2lvbic6ICcnfQogICAgICAgIGNmZyA9IGNvbmZpZ3BhcnNlci5SYXdDb25maWdQYXJzZXIoaW5pdCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIHBhcnQgPSBmLnJlYWQoY2ZnbGVuKQogICAgICAgICAgICAjIFJlYWQgdXAgdG8gdGhlIGZpcnN0IG51bGwgYnl0ZS4KICAgICAgICAgICAgY29uZmlnID0gcGFydC5zcGxpdChiJ1wwJywgMSlbMF0KICAgICAgICAgICAgIyBOb3cgdGhlIGNvbmZpZyBpcyBpbiBieXRlcywgYnV0IGZvciBSYXdDb25maWdQYXJzZXIsIGl0IHNob3VsZAogICAgICAgICAgICAjICBiZSB0ZXh0LCBzbyBkZWNvZGUgaXQuCiAgICAgICAgICAgIGNvbmZpZyA9IGNvbmZpZy5kZWNvZGUoc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpKQogICAgICAgICAgICBjZmcucmVhZGZwKHNpeC5TdHJpbmdJTyhjb25maWcpKQogICAgICAgIGV4Y2VwdCBjb25maWdwYXJzZXIuRXJyb3I6CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgaWYgbm90IGNmZy5oYXNfc2VjdGlvbignbWV0YWRhdGEnKSBvciBub3QgY2ZnLmhhc19zZWN0aW9uKCdTZXR1cCcpOgogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIHJldHVybiBjZmcKCiAgICBmaW5hbGx5OgogICAgICAgIGYuY2xvc2UoKQoKCmRlZiBnZXRfZXhlX3ByZWZpeGVzKGV4ZV9maWxlbmFtZSk6CiAgICAiIiJHZXQgZXhlLT5lZ2cgcGF0aCB0cmFuc2xhdGlvbnMgZm9yIGEgZ2l2ZW4gLmV4ZSBmaWxlIiIiCgogICAgcHJlZml4ZXMgPSBbCiAgICAgICAgKCdQVVJFTElCLycsICcnKSwKICAgICAgICAoJ1BMQVRMSUIvcHl3aW4zMl9zeXN0ZW0zMicsICcnKSwKICAgICAgICAoJ1BMQVRMSUIvJywgJycpLAogICAgICAgICgnU0NSSVBUUy8nLCAnRUdHLUlORk8vc2NyaXB0cy8nKSwKICAgICAgICAoJ0RBVEEvbGliL3NpdGUtcGFja2FnZXMnLCAnJyksCiAgICBdCiAgICB6ID0gemlwZmlsZS5aaXBGaWxlKGV4ZV9maWxlbmFtZSkKICAgIHRyeToKICAgICAgICBmb3IgaW5mbyBpbiB6LmluZm9saXN0KCk6CiAgICAgICAgICAgIG5hbWUgPSBpbmZvLmZpbGVuYW1lCiAgICAgICAgICAgIHBhcnRzID0gbmFtZS5zcGxpdCgnLycpCiAgICAgICAgICAgIGlmIGxlbihwYXJ0cykgPT0gMyBhbmQgcGFydHNbMl0gPT0gJ1BLRy1JTkZPJzoKICAgICAgICAgICAgICAgIGlmIHBhcnRzWzFdLmVuZHN3aXRoKCcuZWdnLWluZm8nKToKICAgICAgICAgICAgICAgICAgICBwcmVmaXhlcy5pbnNlcnQoMCwgKCcvJy5qb2luKHBhcnRzWzoyXSksICdFR0ctSU5GTy8nKSkKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBpZiBsZW4ocGFydHMpICE9IDIgb3Igbm90IG5hbWUuZW5kc3dpdGgoJy5wdGgnKToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIG5hbWUuZW5kc3dpdGgoJy1uc3BrZy5wdGgnKToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIHBhcnRzWzBdLnVwcGVyKCkgaW4gKCdQVVJFTElCJywgJ1BMQVRMSUInKToKICAgICAgICAgICAgICAgIGNvbnRlbnRzID0gei5yZWFkKG5hbWUpCiAgICAgICAgICAgICAgICBpZiBzaXguUFkzOgogICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzID0gY29udGVudHMuZGVjb2RlKCkKICAgICAgICAgICAgICAgIGZvciBwdGggaW4geWllbGRfbGluZXMoY29udGVudHMpOgogICAgICAgICAgICAgICAgICAgIHB0aCA9IHB0aC5zdHJpcCgpLnJlcGxhY2UoJ1xcJywgJy8nKQogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBwdGguc3RhcnRzd2l0aCgnaW1wb3J0Jyk6CiAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeGVzLmFwcGVuZCgoKCclcy8lcy8nICUgKHBhcnRzWzBdLCBwdGgpKSwgJycpKQogICAgZmluYWxseToKICAgICAgICB6LmNsb3NlKCkKICAgIHByZWZpeGVzID0gWyh4Lmxvd2VyKCksIHkpIGZvciB4LCB5IGluIHByZWZpeGVzXQogICAgcHJlZml4ZXMuc29ydCgpCiAgICBwcmVmaXhlcy5yZXZlcnNlKCkKICAgIHJldHVybiBwcmVmaXhlcwoKCmNsYXNzIFB0aERpc3RyaWJ1dGlvbnMoRW52aXJvbm1lbnQpOgogICAgIiIiQSAucHRoIGZpbGUgd2l0aCBEaXN0cmlidXRpb24gcGF0aHMgaW4gaXQiIiIKCiAgICBkaXJ0eSA9IEZhbHNlCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVuYW1lLCBzaXRlZGlycz0oKSk6CiAgICAgICAgc2VsZi5maWxlbmFtZSA9IGZpbGVuYW1lCiAgICAgICAgc2VsZi5zaXRlZGlycyA9IGxpc3QobWFwKG5vcm1hbGl6ZV9wYXRoLCBzaXRlZGlycykpCiAgICAgICAgc2VsZi5iYXNlZGlyID0gbm9ybWFsaXplX3BhdGgob3MucGF0aC5kaXJuYW1lKHNlbGYuZmlsZW5hbWUpKQogICAgICAgIHNlbGYuX2xvYWQoKQogICAgICAgIEVudmlyb25tZW50Ll9faW5pdF9fKHNlbGYsIFtdLCBOb25lLCBOb25lKQogICAgICAgIGZvciBwYXRoIGluIHlpZWxkX2xpbmVzKHNlbGYucGF0aHMpOgogICAgICAgICAgICBsaXN0KG1hcChzZWxmLmFkZCwgZmluZF9kaXN0cmlidXRpb25zKHBhdGgsIFRydWUpKSkKCiAgICBkZWYgX2xvYWQoc2VsZik6CiAgICAgICAgc2VsZi5wYXRocyA9IFtdCiAgICAgICAgc2F3X2ltcG9ydCA9IEZhbHNlCiAgICAgICAgc2VlbiA9IGRpY3QuZnJvbWtleXMoc2VsZi5zaXRlZGlycykKICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShzZWxmLmZpbGVuYW1lKToKICAgICAgICAgICAgZiA9IG9wZW4oc2VsZi5maWxlbmFtZSwgJ3J0JykKICAgICAgICAgICAgZm9yIGxpbmUgaW4gZjoKICAgICAgICAgICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgnaW1wb3J0Jyk6CiAgICAgICAgICAgICAgICAgICAgc2F3X2ltcG9ydCA9IFRydWUKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgcGF0aCA9IGxpbmUucnN0cmlwKCkKICAgICAgICAgICAgICAgIHNlbGYucGF0aHMuYXBwZW5kKHBhdGgpCiAgICAgICAgICAgICAgICBpZiBub3QgcGF0aC5zdHJpcCgpIG9yIHBhdGguc3RyaXAoKS5zdGFydHN3aXRoKCcjJyk6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICMgc2tpcCBub24tZXhpc3RlbnQgcGF0aHMsIGluIGNhc2Ugc29tZWJvZHkgZGVsZXRlZCBhIHBhY2thZ2UKICAgICAgICAgICAgICAgICMgbWFudWFsbHksIGFuZCBkdXBsaWNhdGUgcGF0aHMgYXMgd2VsbAogICAgICAgICAgICAgICAgcGF0aCA9IHNlbGYucGF0aHNbLTFdID0gbm9ybWFsaXplX3BhdGgoCiAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHNlbGYuYmFzZWRpciwgcGF0aCkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhwYXRoKSBvciBwYXRoIGluIHNlZW46CiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXRocy5wb3AoKSAgIyBza2lwIGl0CiAgICAgICAgICAgICAgICAgICAgc2VsZi5kaXJ0eSA9IFRydWUgICMgd2UgY2xlYW5lZCB1cCwgc28gd2UncmUgZGlydHkgbm93IDopCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIHNlZW5bcGF0aF0gPSAxCiAgICAgICAgICAgIGYuY2xvc2UoKQoKICAgICAgICBpZiBzZWxmLnBhdGhzIGFuZCBub3Qgc2F3X2ltcG9ydDoKICAgICAgICAgICAgc2VsZi5kaXJ0eSA9IFRydWUgICMgZW5zdXJlIGFueXRoaW5nIHdlIHRvdWNoIGhhcyBpbXBvcnQgd3JhcHBlcnMKICAgICAgICB3aGlsZSBzZWxmLnBhdGhzIGFuZCBub3Qgc2VsZi5wYXRoc1stMV0uc3RyaXAoKToKICAgICAgICAgICAgc2VsZi5wYXRocy5wb3AoKQoKICAgIGRlZiBzYXZlKHNlbGYpOgogICAgICAgICIiIldyaXRlIGNoYW5nZWQgLnB0aCBmaWxlIGJhY2sgdG8gZGlzayIiIgogICAgICAgIGlmIG5vdCBzZWxmLmRpcnR5OgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgcmVsX3BhdGhzID0gbGlzdChtYXAoc2VsZi5tYWtlX3JlbGF0aXZlLCBzZWxmLnBhdGhzKSkKICAgICAgICBpZiByZWxfcGF0aHM6CiAgICAgICAgICAgIGxvZy5kZWJ1ZygiU2F2aW5nICVzIiwgc2VsZi5maWxlbmFtZSkKICAgICAgICAgICAgbGluZXMgPSBzZWxmLl93cmFwX2xpbmVzKHJlbF9wYXRocykKICAgICAgICAgICAgZGF0YSA9ICdcbicuam9pbihsaW5lcykgKyAnXG4nCgogICAgICAgICAgICBpZiBvcy5wYXRoLmlzbGluayhzZWxmLmZpbGVuYW1lKToKICAgICAgICAgICAgICAgIG9zLnVubGluayhzZWxmLmZpbGVuYW1lKQogICAgICAgICAgICB3aXRoIG9wZW4oc2VsZi5maWxlbmFtZSwgJ3d0JykgYXMgZjoKICAgICAgICAgICAgICAgIGYud3JpdGUoZGF0YSkKCiAgICAgICAgZWxpZiBvcy5wYXRoLmV4aXN0cyhzZWxmLmZpbGVuYW1lKToKICAgICAgICAgICAgbG9nLmRlYnVnKCJEZWxldGluZyBlbXB0eSAlcyIsIHNlbGYuZmlsZW5hbWUpCiAgICAgICAgICAgIG9zLnVubGluayhzZWxmLmZpbGVuYW1lKQoKICAgICAgICBzZWxmLmRpcnR5ID0gRmFsc2UKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX3dyYXBfbGluZXMobGluZXMpOgogICAgICAgIHJldHVybiBsaW5lcwoKICAgIGRlZiBhZGQoc2VsZiwgZGlzdCk6CiAgICAgICAgIiIiQWRkIGBkaXN0YCB0byB0aGUgZGlzdHJpYnV0aW9uIG1hcCIiIgogICAgICAgIG5ld19wYXRoID0gKAogICAgICAgICAgICBkaXN0LmxvY2F0aW9uIG5vdCBpbiBzZWxmLnBhdGhzIGFuZCAoCiAgICAgICAgICAgICAgICBkaXN0LmxvY2F0aW9uIG5vdCBpbiBzZWxmLnNpdGVkaXJzIG9yCiAgICAgICAgICAgICAgICAjIGFjY291bnQgZm9yICcuJyBiZWluZyBpbiBQWVRIT05QQVRICiAgICAgICAgICAgICAgICBkaXN0LmxvY2F0aW9uID09IG9zLmdldGN3ZCgpCiAgICAgICAgICAgICkKICAgICAgICApCiAgICAgICAgaWYgbmV3X3BhdGg6CiAgICAgICAgICAgIHNlbGYucGF0aHMuYXBwZW5kKGRpc3QubG9jYXRpb24pCiAgICAgICAgICAgIHNlbGYuZGlydHkgPSBUcnVlCiAgICAgICAgRW52aXJvbm1lbnQuYWRkKHNlbGYsIGRpc3QpCgogICAgZGVmIHJlbW92ZShzZWxmLCBkaXN0KToKICAgICAgICAiIiJSZW1vdmUgYGRpc3RgIGZyb20gdGhlIGRpc3RyaWJ1dGlvbiBtYXAiIiIKICAgICAgICB3aGlsZSBkaXN0LmxvY2F0aW9uIGluIHNlbGYucGF0aHM6CiAgICAgICAgICAgIHNlbGYucGF0aHMucmVtb3ZlKGRpc3QubG9jYXRpb24pCiAgICAgICAgICAgIHNlbGYuZGlydHkgPSBUcnVlCiAgICAgICAgRW52aXJvbm1lbnQucmVtb3ZlKHNlbGYsIGRpc3QpCgogICAgZGVmIG1ha2VfcmVsYXRpdmUoc2VsZiwgcGF0aCk6CiAgICAgICAgbnBhdGgsIGxhc3QgPSBvcy5wYXRoLnNwbGl0KG5vcm1hbGl6ZV9wYXRoKHBhdGgpKQogICAgICAgIGJhc2VsZW4gPSBsZW4oc2VsZi5iYXNlZGlyKQogICAgICAgIHBhcnRzID0gW2xhc3RdCiAgICAgICAgc2VwID0gb3MuYWx0c2VwID09ICcvJyBhbmQgJy8nIG9yIG9zLnNlcAogICAgICAgIHdoaWxlIGxlbihucGF0aCkgPj0gYmFzZWxlbjoKICAgICAgICAgICAgaWYgbnBhdGggPT0gc2VsZi5iYXNlZGlyOgogICAgICAgICAgICAgICAgcGFydHMuYXBwZW5kKG9zLmN1cmRpcikKICAgICAgICAgICAgICAgIHBhcnRzLnJldmVyc2UoKQogICAgICAgICAgICAgICAgcmV0dXJuIHNlcC5qb2luKHBhcnRzKQogICAgICAgICAgICBucGF0aCwgbGFzdCA9IG9zLnBhdGguc3BsaXQobnBhdGgpCiAgICAgICAgICAgIHBhcnRzLmFwcGVuZChsYXN0KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBwYXRoCgoKY2xhc3MgUmV3cml0ZVB0aERpc3RyaWJ1dGlvbnMoUHRoRGlzdHJpYnV0aW9ucyk6CiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfd3JhcF9saW5lcyhjbHMsIGxpbmVzKToKICAgICAgICB5aWVsZCBjbHMucHJlbHVkZQogICAgICAgIGZvciBsaW5lIGluIGxpbmVzOgogICAgICAgICAgICB5aWVsZCBsaW5lCiAgICAgICAgeWllbGQgY2xzLnBvc3RsdWRlCgogICAgcHJlbHVkZSA9IF9vbmVfbGluZXIoIiIiCiAgICAgICAgaW1wb3J0IHN5cwogICAgICAgIHN5cy5fX3BsZW4gPSBsZW4oc3lzLnBhdGgpCiAgICAgICAgIiIiKQogICAgcG9zdGx1ZGUgPSBfb25lX2xpbmVyKCIiIgogICAgICAgIGltcG9ydCBzeXMKICAgICAgICBuZXcgPSBzeXMucGF0aFtzeXMuX19wbGVuOl0KICAgICAgICBkZWwgc3lzLnBhdGhbc3lzLl9fcGxlbjpdCiAgICAgICAgcCA9IGdldGF0dHIoc3lzLCAnX19lZ2dpbnNlcnQnLCAwKQogICAgICAgIHN5cy5wYXRoW3A6cF0gPSBuZXcKICAgICAgICBzeXMuX19lZ2dpbnNlcnQgPSBwICsgbGVuKG5ldykKICAgICAgICAiIiIpCgoKaWYgb3MuZW52aXJvbi5nZXQoJ1NFVFVQVE9PTFNfU1lTX1BBVEhfVEVDSE5JUVVFJywgJ3JhdycpID09ICdyZXdyaXRlJzoKICAgIFB0aERpc3RyaWJ1dGlvbnMgPSBSZXdyaXRlUHRoRGlzdHJpYnV0aW9ucwoKCmRlZiBfZmlyc3RfbGluZV9yZSgpOgogICAgIiIiCiAgICBSZXR1cm4gYSByZWd1bGFyIGV4cHJlc3Npb24gYmFzZWQgb24gZmlyc3RfbGluZV9yZSBzdWl0YWJsZSBmb3IgbWF0Y2hpbmcKICAgIHN0cmluZ3MuCiAgICAiIiIKICAgIGlmIGlzaW5zdGFuY2UoZmlyc3RfbGluZV9yZS5wYXR0ZXJuLCBzdHIpOgogICAgICAgIHJldHVybiBmaXJzdF9saW5lX3JlCgogICAgIyBmaXJzdF9saW5lX3JlIGluIFB5dGhvbiA+PTMuMS40IGFuZCA+PTMuMi4xIGlzIGEgYnl0ZXMgcGF0dGVybi4KICAgIHJldHVybiByZS5jb21waWxlKGZpcnN0X2xpbmVfcmUucGF0dGVybi5kZWNvZGUoKSkKCgpkZWYgYXV0b19jaG1vZChmdW5jLCBhcmcsIGV4Yyk6CiAgICBpZiBmdW5jIGluIFtvcy51bmxpbmssIG9zLnJlbW92ZV0gYW5kIG9zLm5hbWUgPT0gJ250JzoKICAgICAgICBjaG1vZChhcmcsIHN0YXQuU19JV1JJVEUpCiAgICAgICAgcmV0dXJuIGZ1bmMoYXJnKQogICAgZXQsIGV2LCBfID0gc3lzLmV4Y19pbmZvKCkKICAgIHNpeC5yZXJhaXNlKGV0LCAoZXZbMF0sIGV2WzFdICsgKCIgJXMgJXMiICUgKGZ1bmMsIGFyZykpKSkKCgpkZWYgdXBkYXRlX2Rpc3RfY2FjaGVzKGRpc3RfcGF0aCwgZml4X3ppcGltcG9ydGVyX2NhY2hlcyk6CiAgICAiIiIKICAgIEZpeCBhbnkgZ2xvYmFsbHkgY2FjaGVkIGBkaXN0X3BhdGhgIHJlbGF0ZWQgZGF0YQoKICAgIGBkaXN0X3BhdGhgIHNob3VsZCBiZSBhIHBhdGggb2YgYSBuZXdseSBpbnN0YWxsZWQgZWdnIGRpc3RyaWJ1dGlvbiAoemlwcGVkCiAgICBvciB1bnppcHBlZCkuCgogICAgc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGUgY29udGFpbnMgZmluZGVyIG9iamVjdHMgdGhhdCBoYXZlIGJlZW4gY2FjaGVkIHdoZW4KICAgIGltcG9ydGluZyBkYXRhIGZyb20gdGhlIG9yaWdpbmFsIGRpc3RyaWJ1dGlvbi4gQW55IHN1Y2ggZmluZGVycyBuZWVkIHRvIGJlCiAgICBjbGVhcmVkIHNpbmNlIHRoZSByZXBsYWNlbWVudCBkaXN0cmlidXRpb24gbWlnaHQgYmUgcGFja2FnZWQgZGlmZmVyZW50bHksCiAgICBlLmcuIGEgemlwcGVkIGVnZyBkaXN0cmlidXRpb24gbWlnaHQgZ2V0IHJlcGxhY2VkIHdpdGggYW4gdW56aXBwZWQgZWdnCiAgICBmb2xkZXIgb3IgdmljZSB2ZXJzYS4gSGF2aW5nIHRoZSBvbGQgZmluZGVycyBjYWNoZWQgbWF5IHRoZW4gY2F1c2UgUHl0aG9uCiAgICB0byBhdHRlbXB0IGxvYWRpbmcgbW9kdWxlcyBmcm9tIHRoZSByZXBsYWNlbWVudCBkaXN0cmlidXRpb24gdXNpbmcgYW4KICAgIGluY29ycmVjdCBsb2FkZXIuCgogICAgemlwaW1wb3J0LnppcGltcG9ydGVyIG9iamVjdHMgYXJlIFB5dGhvbiBsb2FkZXJzIGNoYXJnZWQgd2l0aCBpbXBvcnRpbmcKICAgIGRhdGEgcGFja2FnZWQgaW5zaWRlIHppcCBhcmNoaXZlcy4gSWYgc3RhbGUgbG9hZGVycyByZWZlcmVuY2luZyB0aGUKICAgIG9yaWdpbmFsIGRpc3RyaWJ1dGlvbiwgYXJlIGxlZnQgYmVoaW5kLCB0aGV5IGNhbiBmYWlsIHRvIGxvYWQgbW9kdWxlcyBmcm9tCiAgICB0aGUgcmVwbGFjZW1lbnQgZGlzdHJpYnV0aW9uLiBFLmcuIGlmIGFuIG9sZCB6aXBpbXBvcnQuemlwaW1wb3J0ZXIgaW5zdGFuY2UKICAgIGlzIHVzZWQgdG8gbG9hZCBkYXRhIGZyb20gYSBuZXcgemlwcGVkIGVnZyBhcmNoaXZlLCBpdCBtYXkgY2F1c2UgdGhlCiAgICBvcGVyYXRpb24gdG8gYXR0ZW1wdCB0byBsb2NhdGUgdGhlIHJlcXVlc3RlZCBkYXRhIGluIHRoZSB3cm9uZyBsb2NhdGlvbiAtCiAgICBvbmUgaW5kaWNhdGVkIGJ5IHRoZSBvcmlnaW5hbCBkaXN0cmlidXRpb24ncyB6aXAgYXJjaGl2ZSBkaXJlY3RvcnkKICAgIGluZm9ybWF0aW9uLiBTdWNoIGFuIG9wZXJhdGlvbiBtYXkgdGhlbiBmYWlsIG91dHJpZ2h0LCBlLmcuIHJlcG9ydCBoYXZpbmcKICAgIHJlYWQgYSAnYmFkIGxvY2FsIGZpbGUgaGVhZGVyJywgb3IgZXZlbiB3b3JzZSwgaXQgbWF5IGZhaWwgc2lsZW50bHkgJgogICAgcmV0dXJuIGludmFsaWQgZGF0YS4KCiAgICB6aXBpbXBvcnQuX3ppcF9kaXJlY3RvcnlfY2FjaGUgY29udGFpbnMgY2FjaGVkIHppcCBhcmNoaXZlIGRpcmVjdG9yeQogICAgaW5mb3JtYXRpb24gZm9yIGFsbCBleGlzdGluZyB6aXBpbXBvcnQuemlwaW1wb3J0ZXIgaW5zdGFuY2VzIGFuZCBhbGwgc3VjaAogICAgaW5zdGFuY2VzIGNvbm5lY3RlZCB0byB0aGUgc2FtZSBhcmNoaXZlIHNoYXJlIHRoZSBzYW1lIGNhY2hlZCBkaXJlY3RvcnkKICAgIGluZm9ybWF0aW9uLgoKICAgIElmIGFza2VkLCBhbmQgdGhlIHVuZGVybHlpbmcgUHl0aG9uIGltcGxlbWVudGF0aW9uIGFsbG93cyBpdCwgd2UgY2FuIGZpeAogICAgYWxsIGV4aXN0aW5nIHppcGltcG9ydC56aXBpbXBvcnRlciBpbnN0YW5jZXMgaW5zdGVhZCBvZiBoYXZpbmcgdG8gdHJhY2sKICAgIHRoZW0gZG93biBhbmQgcmVtb3ZlIHRoZW0gb25lIGJ5IG9uZSwgYnkgdXBkYXRpbmcgdGhlaXIgc2hhcmVkIGNhY2hlZCB6aXAKICAgIGFyY2hpdmUgZGlyZWN0b3J5IGluZm9ybWF0aW9uLiBUaGlzLCBvZiBjb3Vyc2UsIGFzc3VtZXMgdGhhdCB0aGUKICAgIHJlcGxhY2VtZW50IGRpc3RyaWJ1dGlvbiBpcyBwYWNrYWdlZCBhcyBhIHppcHBlZCBlZ2cuCgogICAgSWYgbm90IGFza2VkIHRvIGZpeCBleGlzdGluZyB6aXBpbXBvcnQuemlwaW1wb3J0ZXIgaW5zdGFuY2VzLCB3ZSBzdGlsbCBkbwogICAgb3VyIGJlc3QgdG8gY2xlYXIgYW55IHJlbWFpbmluZyB6aXBpbXBvcnQuemlwaW1wb3J0ZXIgcmVsYXRlZCBjYWNoZWQgZGF0YQogICAgdGhhdCBtaWdodCBzb21laG93IGxhdGVyIGdldCB1c2VkIHdoZW4gYXR0ZW1wdGluZyB0byBsb2FkIGRhdGEgZnJvbSB0aGUgbmV3CiAgICBkaXN0cmlidXRpb24gYW5kIHRodXMgY2F1c2Ugc3VjaCBsb2FkIG9wZXJhdGlvbnMgdG8gZmFpbC4gTm90ZSB0aGF0IHdoZW4KICAgIHRyYWNraW5nIGRvd24gc3VjaCByZW1haW5pbmcgc3RhbGUgZGF0YSwgd2UgY2FuIG5vdCBjYXRjaCBldmVyeSBjb25jZWl2YWJsZQogICAgdXNhZ2UgZnJvbSBoZXJlLCBhbmQgd2UgY2xlYXIgb25seSB0aG9zZSB0aGF0IHdlIGtub3cgb2YgYW5kIGhhdmUgZm91bmQgdG8KICAgIGNhdXNlIHByb2JsZW1zIGlmIGxlZnQgYWxpdmUuIEFueSByZW1haW5pbmcgY2FjaGVzIHNob3VsZCBiZSB1cGRhdGVkIGJ5CiAgICB3aG9tZXZlciBpcyBpbiBjaGFyZ2Ugb2YgbWFpbnRhaW5pbmcgdGhlbSwgaS5lLiB0aGV5IHNob3VsZCBiZSByZWFkeSB0bwogICAgaGFuZGxlIHVzIHJlcGxhY2luZyB0aGVpciB6aXAgYXJjaGl2ZXMgd2l0aCBuZXcgZGlzdHJpYnV0aW9ucyBhdCBydW50aW1lLgoKICAgICIiIgogICAgIyBUaGVyZSBhcmUgc2V2ZXJhbCBvdGhlciBrbm93biBzb3VyY2VzIG9mIHN0YWxlIHppcGltcG9ydC56aXBpbXBvcnRlcgogICAgIyBpbnN0YW5jZXMgdGhhdCB3ZSBkbyBub3QgY2xlYXIgaGVyZSwgYnV0IG1pZ2h0IGlmIGV2ZXIgZ2l2ZW4gYSByZWFzb24gdG8KICAgICMgZG8gc286CiAgICAjICogR2xvYmFsIHNldHVwdG9vbHMgcGtnX3Jlc291cmNlcy53b3JraW5nX3NldCAoYS5rLmEuICdtYXN0ZXIgd29ya2luZwogICAgIyBzZXQnKSBtYXkgY29udGFpbiBkaXN0cmlidXRpb25zIHdoaWNoIG1heSBpbiB0dXJuIGNvbnRhaW4gdGhlaXIKICAgICMgICB6aXBpbXBvcnQuemlwaW1wb3J0ZXIgbG9hZGVycy4KICAgICMgKiBTZXZlcmFsIHppcGltcG9ydC56aXBpbXBvcnRlciBsb2FkZXJzIGhlbGQgYnkgbG9jYWwgdmFyaWFibGVzIGZ1cnRoZXIKICAgICMgICB1cCB0aGUgZnVuY3Rpb24gY2FsbCBzdGFjayB3aGVuIHJ1bm5pbmcgdGhlIHNldHVwdG9vbHMgaW5zdGFsbGF0aW9uLgogICAgIyAqIEFscmVhZHkgbG9hZGVkIG1vZHVsZXMgbWF5IGhhdmUgdGhlaXIgX19sb2FkZXJfXyBhdHRyaWJ1dGUgc2V0IHRvIHRoZQogICAgIyAgIGV4YWN0IGxvYWRlciBpbnN0YW5jZSB1c2VkIHdoZW4gaW1wb3J0aW5nIHRoZW0uIFB5dGhvbiAzLjQgZG9jcyBzdGF0ZQogICAgIyAgIHRoYXQgdGhpcyBpbmZvcm1hdGlvbiBpcyBpbnRlbmRlZCBtb3N0bHkgZm9yIGludHJvc3BlY3Rpb24gYW5kIHNvIGlzCiAgICAjICAgbm90IGV4cGVjdGVkIHRvIGNhdXNlIHVzIHByb2JsZW1zLgogICAgbm9ybWFsaXplZF9wYXRoID0gbm9ybWFsaXplX3BhdGgoZGlzdF9wYXRoKQogICAgX3VuY2FjaGUobm9ybWFsaXplZF9wYXRoLCBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZSkKICAgIGlmIGZpeF96aXBpbXBvcnRlcl9jYWNoZXM6CiAgICAgICAgX3JlcGxhY2VfemlwX2RpcmVjdG9yeV9jYWNoZV9kYXRhKG5vcm1hbGl6ZWRfcGF0aCkKICAgIGVsc2U6CiAgICAgICAgIyBIZXJlLCBldmVuIHRob3VnaCB3ZSBkbyBub3Qgd2FudCB0byBmaXggZXhpc3RpbmcgYW5kIG5vdyBzdGFsZQogICAgICAgICMgemlwaW1wb3J0ZXIgY2FjaGUgaW5mb3JtYXRpb24sIHdlIHN0aWxsIHdhbnQgdG8gcmVtb3ZlIGl0LiBSZWxhdGVkIHRvCiAgICAgICAgIyBQeXRob24ncyB6aXAgYXJjaGl2ZSBkaXJlY3RvcnkgaW5mb3JtYXRpb24gY2FjaGUsIHdlIGNsZWFyIGVhY2ggb2YKICAgICAgICAjIGl0cyBzdGFsZSBlbnRyaWVzIGluIHR3byBwaGFzZXM6CiAgICAgICAgIyAgIDEuIENsZWFyIHRoZSBlbnRyeSBzbyBhdHRlbXB0aW5nIHRvIGFjY2VzcyB6aXAgYXJjaGl2ZSBpbmZvcm1hdGlvbgogICAgICAgICMgICAgICB2aWEgYW55IGV4aXN0aW5nIHN0YWxlIHppcGltcG9ydC56aXBpbXBvcnRlciBpbnN0YW5jZXMgZmFpbHMuCiAgICAgICAgIyAgIDIuIFJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgY2FjaGUgc28gYW55IG5ld2x5IGNvbnN0cnVjdGVkCiAgICAgICAgIyAgICAgIHppcGltcG9ydC56aXBpbXBvcnRlciBpbnN0YW5jZXMgZG8gbm90IGVuZCB1cCB1c2luZyBvbGQgc3RhbGUKICAgICAgICAjICAgICAgemlwIGFyY2hpdmUgZGlyZWN0b3J5IGluZm9ybWF0aW9uLgogICAgICAgICMgVGhpcyB3aG9sZSBzdGFsZSBkYXRhIHJlbW92YWwgc3RlcCBkb2VzIG5vdCBzZWVtIHN0cmljdGx5IG5lY2Vzc2FyeSwKICAgICAgICAjIGJ1dCBoYXMgYmVlbiBsZWZ0IGluIGJlY2F1c2UgaXQgd2FzIGRvbmUgYmVmb3JlIHdlIHN0YXJ0ZWQgcmVwbGFjaW5nCiAgICAgICAgIyB0aGUgemlwIGFyY2hpdmUgZGlyZWN0b3J5IGluZm9ybWF0aW9uIGNhY2hlIGNvbnRlbnQgaWYgcG9zc2libGUsIGFuZAogICAgICAgICMgdGhlcmUgYXJlIG5vIHJlbGV2YW50IHVuaXQgdGVzdHMgdGhhdCB3ZSBjYW4gZGVwZW5kIG9uIHRvIHRlbGwgdXMgaWYKICAgICAgICAjIHRoaXMgaXMgcmVhbGx5IG5lZWRlZC4KICAgICAgICBfcmVtb3ZlX2FuZF9jbGVhcl96aXBfZGlyZWN0b3J5X2NhY2hlX2RhdGEobm9ybWFsaXplZF9wYXRoKQoKCmRlZiBfY29sbGVjdF96aXBpbXBvcnRlcl9jYWNoZV9lbnRyaWVzKG5vcm1hbGl6ZWRfcGF0aCwgY2FjaGUpOgogICAgIiIiCiAgICBSZXR1cm4gemlwaW1wb3J0ZXIgY2FjaGUgZW50cnkga2V5cyByZWxhdGVkIHRvIGEgZ2l2ZW4gbm9ybWFsaXplZCBwYXRoLgoKICAgIEFsdGVybmF0aXZlIHBhdGggc3BlbGxpbmdzIChlLmcuIHRob3NlIHVzaW5nIGRpZmZlcmVudCBjaGFyYWN0ZXIgY2FzZSBvcgogICAgdGhvc2UgdXNpbmcgYWx0ZXJuYXRpdmUgcGF0aCBzZXBhcmF0b3JzKSByZWxhdGVkIHRvIHRoZSBzYW1lIHBhdGggYXJlCiAgICBpbmNsdWRlZC4gQW55IHN1Yi1wYXRoIGVudHJpZXMgYXJlIGluY2x1ZGVkIGFzIHdlbGwsIGkuZS4gdGhvc2UKICAgIGNvcnJlc3BvbmRpbmcgdG8gemlwIGFyY2hpdmVzIGVtYmVkZGVkIGluIG90aGVyIHppcCBhcmNoaXZlcy4KCiAgICAiIiIKICAgIHJlc3VsdCA9IFtdCiAgICBwcmVmaXhfbGVuID0gbGVuKG5vcm1hbGl6ZWRfcGF0aCkKICAgIGZvciBwIGluIGNhY2hlOgogICAgICAgIG5wID0gbm9ybWFsaXplX3BhdGgocCkKICAgICAgICBpZiAobnAuc3RhcnRzd2l0aChub3JtYWxpemVkX3BhdGgpIGFuZAogICAgICAgICAgICAgICAgbnBbcHJlZml4X2xlbjpwcmVmaXhfbGVuICsgMV0gaW4gKG9zLnNlcCwgJycpKToKICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChwKQogICAgcmV0dXJuIHJlc3VsdAoKCmRlZiBfdXBkYXRlX3ppcGltcG9ydGVyX2NhY2hlKG5vcm1hbGl6ZWRfcGF0aCwgY2FjaGUsIHVwZGF0ZXI9Tm9uZSk6CiAgICAiIiIKICAgIFVwZGF0ZSB6aXBpbXBvcnRlciBjYWNoZSBkYXRhIGZvciBhIGdpdmVuIG5vcm1hbGl6ZWQgcGF0aC4KCiAgICBBbnkgc3ViLXBhdGggZW50cmllcyBhcmUgcHJvY2Vzc2VkIGFzIHdlbGwsIGkuZS4gdGhvc2UgY29ycmVzcG9uZGluZyB0byB6aXAKICAgIGFyY2hpdmVzIGVtYmVkZGVkIGluIG90aGVyIHppcCBhcmNoaXZlcy4KCiAgICBHaXZlbiB1cGRhdGVyIGlzIGEgY2FsbGFibGUgdGFraW5nIGEgY2FjaGUgZW50cnkga2V5IGFuZCB0aGUgb3JpZ2luYWwgZW50cnkKICAgIChhZnRlciBhbHJlYWR5IHJlbW92aW5nIHRoZSBlbnRyeSBmcm9tIHRoZSBjYWNoZSksIGFuZCBleHBlY3RlZCB0byB1cGRhdGUKICAgIHRoZSBlbnRyeSBhbmQgcG9zc2libHkgcmV0dXJuIGEgbmV3IG9uZSB0byBiZSBpbnNlcnRlZCBpbiBpdHMgcGxhY2UuCiAgICBSZXR1cm5pbmcgTm9uZSBpbmRpY2F0ZXMgdGhhdCB0aGUgZW50cnkgc2hvdWxkIG5vdCBiZSByZXBsYWNlZCB3aXRoIGEgbmV3CiAgICBvbmUuIElmIG5vIHVwZGF0ZXIgaXMgZ2l2ZW4sIHRoZSBjYWNoZSBlbnRyaWVzIGFyZSBzaW1wbHkgcmVtb3ZlZCB3aXRob3V0CiAgICBhbnkgYWRkaXRpb25hbCBwcm9jZXNzaW5nLCB0aGUgc2FtZSBhcyBpZiB0aGUgdXBkYXRlciBzaW1wbHkgcmV0dXJuZWQgTm9uZS4KCiAgICAiIiIKICAgIGZvciBwIGluIF9jb2xsZWN0X3ppcGltcG9ydGVyX2NhY2hlX2VudHJpZXMobm9ybWFsaXplZF9wYXRoLCBjYWNoZSk6CiAgICAgICAgIyBOLkIuIHB5cHkncyBjdXN0b20gemlwaW1wb3J0Ll96aXBfZGlyZWN0b3J5X2NhY2hlIGltcGxlbWVudGF0aW9uIGRvZXMKICAgICAgICAjIG5vdCBzdXBwb3J0IHRoZSBjb21wbGV0ZSBkaWN0IGludGVyZmFjZToKICAgICAgICAjICogRG9lcyBub3Qgc3VwcG9ydCBpdGVtIGFzc2lnbm1lbnQsIHRodXMgbm90IGFsbG93aW5nIHRoaXMgZnVuY3Rpb24KICAgICAgICAjICAgIHRvIGJlIHVzZWQgb25seSBmb3IgcmVtb3ZpbmcgZXhpc3RpbmcgY2FjaGUgZW50cmllcy4KICAgICAgICAjICAqIERvZXMgbm90IHN1cHBvcnQgdGhlIGRpY3QucG9wKCkgbWV0aG9kLCBmb3JjaW5nIHVzIHRvIHVzZSB0aGUKICAgICAgICAjICAgIGdldC9kZWwgcGF0dGVybnMgaW5zdGVhZC4gRm9yIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gc2VlIHRoZQogICAgICAgICMgICAgZm9sbG93aW5nIGxpbmtzOgogICAgICAgICMgICAgICBodHRwczovL2dpdGh1Yi5jb20vcHlwYS9zZXR1cHRvb2xzL2lzc3Vlcy8yMDIjaXNzdWVjb21tZW50LTIwMjkxMzQyMAogICAgICAgICMgICAgICBodHRwOi8vYml0Lmx5LzJoOWl0SlgKICAgICAgICBvbGRfZW50cnkgPSBjYWNoZVtwXQogICAgICAgIGRlbCBjYWNoZVtwXQogICAgICAgIG5ld19lbnRyeSA9IHVwZGF0ZXIgYW5kIHVwZGF0ZXIocCwgb2xkX2VudHJ5KQogICAgICAgIGlmIG5ld19lbnRyeSBpcyBub3QgTm9uZToKICAgICAgICAgICAgY2FjaGVbcF0gPSBuZXdfZW50cnkKCgpkZWYgX3VuY2FjaGUobm9ybWFsaXplZF9wYXRoLCBjYWNoZSk6CiAgICBfdXBkYXRlX3ppcGltcG9ydGVyX2NhY2hlKG5vcm1hbGl6ZWRfcGF0aCwgY2FjaGUpCgoKZGVmIF9yZW1vdmVfYW5kX2NsZWFyX3ppcF9kaXJlY3RvcnlfY2FjaGVfZGF0YShub3JtYWxpemVkX3BhdGgpOgogICAgZGVmIGNsZWFyX2FuZF9yZW1vdmVfY2FjaGVkX3ppcF9hcmNoaXZlX2RpcmVjdG9yeV9kYXRhKHBhdGgsIG9sZF9lbnRyeSk6CiAgICAgICAgb2xkX2VudHJ5LmNsZWFyKCkKCiAgICBfdXBkYXRlX3ppcGltcG9ydGVyX2NhY2hlKAogICAgICAgIG5vcm1hbGl6ZWRfcGF0aCwgemlwaW1wb3J0Ll96aXBfZGlyZWN0b3J5X2NhY2hlLAogICAgICAgIHVwZGF0ZXI9Y2xlYXJfYW5kX3JlbW92ZV9jYWNoZWRfemlwX2FyY2hpdmVfZGlyZWN0b3J5X2RhdGEpCgoKIyBQeVB5IFB5dGhvbiBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBhbGxvdyBkaXJlY3RseSB3cml0aW5nIHRvIHRoZQojIHppcGltcG9ydC5femlwX2RpcmVjdG9yeV9jYWNoZSBhbmQgc28gcHJldmVudHMgdXMgZnJvbSBhdHRlbXB0aW5nIHRvIGNvcnJlY3QKIyBpdHMgY29udGVudC4gVGhlIGJlc3Qgd2UgY2FuIGRvIHRoZXJlIGlzIGNsZWFyIHRoZSBwcm9ibGVtYXRpYyBjYWNoZSBjb250ZW50CiMgYW5kIGhhdmUgUHlQeSByZXBvcHVsYXRlIGl0IGFzIG5lZWRlZC4gVGhlIGRvd25zaWRlIGlzIHRoYXQgaWYgdGhlcmUgYXJlIGFueQojIHN0YWxlIHppcGltcG9ydC56aXBpbXBvcnRlciBpbnN0YW5jZXMgbGF5aW5nIGFyb3VuZCwgYXR0ZW1wdGluZyB0byB1c2UgdGhlbQojIHdpbGwgZmFpbCBkdWUgdG8gbm90IGhhdmluZyBpdHMgemlwIGFyY2hpdmUgZGlyZWN0b3J5IGluZm9ybWF0aW9uIGF2YWlsYWJsZQojIGluc3RlYWQgb2YgYmVpbmcgYXV0b21hdGljYWxseSBjb3JyZWN0ZWQgdG8gdXNlIHRoZSBuZXcgY29ycmVjdCB6aXAgYXJjaGl2ZQojIGRpcmVjdG9yeSBpbmZvcm1hdGlvbi4KaWYgJ19fcHlweV9fJyBpbiBzeXMuYnVpbHRpbl9tb2R1bGVfbmFtZXM6CiAgICBfcmVwbGFjZV96aXBfZGlyZWN0b3J5X2NhY2hlX2RhdGEgPSBcCiAgICAgICAgX3JlbW92ZV9hbmRfY2xlYXJfemlwX2RpcmVjdG9yeV9jYWNoZV9kYXRhCmVsc2U6CgogICAgZGVmIF9yZXBsYWNlX3ppcF9kaXJlY3RvcnlfY2FjaGVfZGF0YShub3JtYWxpemVkX3BhdGgpOgogICAgICAgIGRlZiByZXBsYWNlX2NhY2hlZF96aXBfYXJjaGl2ZV9kaXJlY3RvcnlfZGF0YShwYXRoLCBvbGRfZW50cnkpOgogICAgICAgICAgICAjIE4uQi4gSW4gdGhlb3J5LCB3ZSBjb3VsZCBsb2FkIHRoZSB6aXAgZGlyZWN0b3J5IGluZm9ybWF0aW9uIGp1c3QKICAgICAgICAgICAgIyBvbmNlIGZvciBhbGwgdXBkYXRlZCBwYXRoIHNwZWxsaW5ncywgYW5kIHRoZW4gY29weSBpdCBsb2NhbGx5IGFuZAogICAgICAgICAgICAjIHVwZGF0ZSBpdHMgY29udGFpbmVkIHBhdGggc3RyaW5ncyB0byBjb250YWluIHRoZSBjb3JyZWN0CiAgICAgICAgICAgICMgc3BlbGxpbmcsIGJ1dCB0aGF0IHNlZW1zIGxpa2UgYSB3YXkgdG9vIGludmFzaXZlIG1vdmUgKHRoaXMgY2FjaGUKICAgICAgICAgICAgIyBzdHJ1Y3R1cmUgaXMgbm90IG9mZmljaWFsbHkgZG9jdW1lbnRlZCBhbnl3aGVyZSBhbmQgY291bGQgaW4KICAgICAgICAgICAgIyB0aGVvcnkgY2hhbmdlIHdpdGggbmV3IFB5dGhvbiByZWxlYXNlcykgZm9yIG5vIHNpZ25pZmljYW50CiAgICAgICAgICAgICMgYmVuZWZpdC4KICAgICAgICAgICAgb2xkX2VudHJ5LmNsZWFyKCkKICAgICAgICAgICAgemlwaW1wb3J0LnppcGltcG9ydGVyKHBhdGgpCiAgICAgICAgICAgIG9sZF9lbnRyeS51cGRhdGUoemlwaW1wb3J0Ll96aXBfZGlyZWN0b3J5X2NhY2hlW3BhdGhdKQogICAgICAgICAgICByZXR1cm4gb2xkX2VudHJ5CgogICAgICAgIF91cGRhdGVfemlwaW1wb3J0ZXJfY2FjaGUoCiAgICAgICAgICAgIG5vcm1hbGl6ZWRfcGF0aCwgemlwaW1wb3J0Ll96aXBfZGlyZWN0b3J5X2NhY2hlLAogICAgICAgICAgICB1cGRhdGVyPXJlcGxhY2VfY2FjaGVkX3ppcF9hcmNoaXZlX2RpcmVjdG9yeV9kYXRhKQoKCmRlZiBpc19weXRob24odGV4dCwgZmlsZW5hbWU9JzxzdHJpbmc+Jyk6CiAgICAiSXMgdGhpcyBzdHJpbmcgYSB2YWxpZCBQeXRob24gc2NyaXB0PyIKICAgIHRyeToKICAgICAgICBjb21waWxlKHRleHQsIGZpbGVuYW1lLCAnZXhlYycpCiAgICBleGNlcHQgKFN5bnRheEVycm9yLCBUeXBlRXJyb3IpOgogICAgICAgIHJldHVybiBGYWxzZQogICAgZWxzZToKICAgICAgICByZXR1cm4gVHJ1ZQoKCmRlZiBpc19zaChleGVjdXRhYmxlKToKICAgICIiIkRldGVybWluZSBpZiB0aGUgc3BlY2lmaWVkIGV4ZWN1dGFibGUgaXMgYSAuc2ggKGNvbnRhaW5zIGEgIyEgbGluZSkiIiIKICAgIHRyeToKICAgICAgICB3aXRoIGlvLm9wZW4oZXhlY3V0YWJsZSwgZW5jb2Rpbmc9J2xhdGluLTEnKSBhcyBmcDoKICAgICAgICAgICAgbWFnaWMgPSBmcC5yZWFkKDIpCiAgICBleGNlcHQgKE9TRXJyb3IsIElPRXJyb3IpOgogICAgICAgIHJldHVybiBleGVjdXRhYmxlCiAgICByZXR1cm4gbWFnaWMgPT0gJyMhJwoKCmRlZiBudF9xdW90ZV9hcmcoYXJnKToKICAgICIiIlF1b3RlIGEgY29tbWFuZCBsaW5lIGFyZ3VtZW50IGFjY29yZGluZyB0byBXaW5kb3dzIHBhcnNpbmcgcnVsZXMiIiIKICAgIHJldHVybiBzdWJwcm9jZXNzLmxpc3QyY21kbGluZShbYXJnXSkKCgpkZWYgaXNfcHl0aG9uX3NjcmlwdChzY3JpcHRfdGV4dCwgZmlsZW5hbWUpOgogICAgIiIiSXMgdGhpcyB0ZXh0LCBhcyBhIHdob2xlLCBhIFB5dGhvbiBzY3JpcHQ/IChhcyBvcHBvc2VkIHRvIHNoZWxsL2JhdC9ldGMuCiAgICAiIiIKICAgIGlmIGZpbGVuYW1lLmVuZHN3aXRoKCcucHknKSBvciBmaWxlbmFtZS5lbmRzd2l0aCgnLnB5dycpOgogICAgICAgIHJldHVybiBUcnVlICAjIGV4dGVuc2lvbiBzYXlzIGl0J3MgUHl0aG9uCiAgICBpZiBpc19weXRob24oc2NyaXB0X3RleHQsIGZpbGVuYW1lKToKICAgICAgICByZXR1cm4gVHJ1ZSAgIyBpdCdzIHN5bnRhY3RpY2FsbHkgdmFsaWQgUHl0aG9uCiAgICBpZiBzY3JpcHRfdGV4dC5zdGFydHN3aXRoKCcjIScpOgogICAgICAgICMgSXQgYmVnaW5zIHdpdGggYSAnIyEnIGxpbmUsIHNvIGNoZWNrIGlmICdweXRob24nIGlzIGluIGl0IHNvbWV3aGVyZQogICAgICAgIHJldHVybiAncHl0aG9uJyBpbiBzY3JpcHRfdGV4dC5zcGxpdGxpbmVzKClbMF0ubG93ZXIoKQoKICAgIHJldHVybiBGYWxzZSAgIyBOb3QgYW55IFB5dGhvbiBJIGNhbiByZWNvZ25pemUKCgp0cnk6CiAgICBmcm9tIG9zIGltcG9ydCBjaG1vZCBhcyBfY2htb2QKZXhjZXB0IEltcG9ydEVycm9yOgogICAgIyBKeXRob24gY29tcGF0aWJpbGl0eQogICAgZGVmIF9jaG1vZCgqYXJncyk6CiAgICAgICAgcGFzcwoKCmRlZiBjaG1vZChwYXRoLCBtb2RlKToKICAgIGxvZy5kZWJ1ZygiY2hhbmdpbmcgbW9kZSBvZiAlcyB0byAlbyIsIHBhdGgsIG1vZGUpCiAgICB0cnk6CiAgICAgICAgX2NobW9kKHBhdGgsIG1vZGUpCiAgICBleGNlcHQgb3MuZXJyb3IgYXMgZToKICAgICAgICBsb2cuZGVidWcoImNobW9kIGZhaWxlZDogJXMiLCBlKQoKCmNsYXNzIENvbW1hbmRTcGVjKGxpc3QpOgogICAgIiIiCiAgICBBIGNvbW1hbmQgc3BlYyBmb3IgYSAjISBoZWFkZXIsIHNwZWNpZmllZCBhcyBhIGxpc3Qgb2YgYXJndW1lbnRzIGFraW4gdG8KICAgIHRob3NlIHBhc3NlZCB0byBQb3Blbi4KICAgICIiIgoKICAgIG9wdGlvbnMgPSBbXQogICAgc3BsaXRfYXJncyA9IGRpY3QoKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGJlc3QoY2xzKToKICAgICAgICAiIiIKICAgICAgICBDaG9vc2UgdGhlIGJlc3QgQ29tbWFuZFNwZWMgY2xhc3MgYmFzZWQgb24gZW52aXJvbm1lbnRhbCBjb25kaXRpb25zLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBjbHMKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfc3lzX2V4ZWN1dGFibGUoY2xzKToKICAgICAgICBfZGVmYXVsdCA9IG9zLnBhdGgubm9ybXBhdGgoc3lzLmV4ZWN1dGFibGUpCiAgICAgICAgcmV0dXJuIG9zLmVudmlyb24uZ2V0KCdfX1BZVkVOVl9MQVVOQ0hFUl9fJywgX2RlZmF1bHQpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZnJvbV9wYXJhbShjbHMsIHBhcmFtKToKICAgICAgICAiIiIKICAgICAgICBDb25zdHJ1Y3QgYSBDb21tYW5kU3BlYyBmcm9tIGEgcGFyYW1ldGVyIHRvIGJ1aWxkX3NjcmlwdHMsIHdoaWNoIG1heQogICAgICAgIGJlIE5vbmUuCiAgICAgICAgIiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZShwYXJhbSwgY2xzKToKICAgICAgICAgICAgcmV0dXJuIHBhcmFtCiAgICAgICAgaWYgaXNpbnN0YW5jZShwYXJhbSwgbGlzdCk6CiAgICAgICAgICAgIHJldHVybiBjbHMocGFyYW0pCiAgICAgICAgaWYgcGFyYW0gaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIGNscy5mcm9tX2Vudmlyb25tZW50KCkKICAgICAgICAjIG90aGVyd2lzZSwgYXNzdW1lIGl0J3MgYSBzdHJpbmcuCiAgICAgICAgcmV0dXJuIGNscy5mcm9tX3N0cmluZyhwYXJhbSkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBmcm9tX2Vudmlyb25tZW50KGNscyk6CiAgICAgICAgcmV0dXJuIGNscyhbY2xzLl9zeXNfZXhlY3V0YWJsZSgpXSkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBmcm9tX3N0cmluZyhjbHMsIHN0cmluZyk6CiAgICAgICAgIiIiCiAgICAgICAgQ29uc3RydWN0IGEgY29tbWFuZCBzcGVjIGZyb20gYSBzaW1wbGUgc3RyaW5nIHJlcHJlc2VudGluZyBhIGNvbW1hbmQKICAgICAgICBsaW5lIHBhcnNlYWJsZSBieSBzaGxleC5zcGxpdC4KICAgICAgICAiIiIKICAgICAgICBpdGVtcyA9IHNobGV4LnNwbGl0KHN0cmluZywgKipjbHMuc3BsaXRfYXJncykKICAgICAgICByZXR1cm4gY2xzKGl0ZW1zKQoKICAgIGRlZiBpbnN0YWxsX29wdGlvbnMoc2VsZiwgc2NyaXB0X3RleHQpOgogICAgICAgIHNlbGYub3B0aW9ucyA9IHNobGV4LnNwbGl0KHNlbGYuX2V4dHJhY3Rfb3B0aW9ucyhzY3JpcHRfdGV4dCkpCiAgICAgICAgY21kbGluZSA9IHN1YnByb2Nlc3MubGlzdDJjbWRsaW5lKHNlbGYpCiAgICAgICAgaWYgbm90IGlzYXNjaWkoY21kbGluZSk6CiAgICAgICAgICAgIHNlbGYub3B0aW9uc1s6MF0gPSBbJy14J10KCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2V4dHJhY3Rfb3B0aW9ucyhvcmlnX3NjcmlwdCk6CiAgICAgICAgIiIiCiAgICAgICAgRXh0cmFjdCBhbnkgb3B0aW9ucyBmcm9tIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBzY3JpcHQuCiAgICAgICAgIiIiCiAgICAgICAgZmlyc3QgPSAob3JpZ19zY3JpcHQgKyAnXG4nKS5zcGxpdGxpbmVzKClbMF0KICAgICAgICBtYXRjaCA9IF9maXJzdF9saW5lX3JlKCkubWF0Y2goZmlyc3QpCiAgICAgICAgb3B0aW9ucyA9IG1hdGNoLmdyb3VwKDEpIG9yICcnIGlmIG1hdGNoIGVsc2UgJycKICAgICAgICByZXR1cm4gb3B0aW9ucy5zdHJpcCgpCgogICAgZGVmIGFzX2hlYWRlcihzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fcmVuZGVyKHNlbGYgKyBsaXN0KHNlbGYub3B0aW9ucykpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9zdHJpcF9xdW90ZXMoaXRlbSk6CiAgICAgICAgX1FVT1RFUyA9ICciXCcnCiAgICAgICAgZm9yIHEgaW4gX1FVT1RFUzoKICAgICAgICAgICAgaWYgaXRlbS5zdGFydHN3aXRoKHEpIGFuZCBpdGVtLmVuZHN3aXRoKHEpOgogICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1bMTotMV0KICAgICAgICByZXR1cm4gaXRlbQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfcmVuZGVyKGl0ZW1zKToKICAgICAgICBjbWRsaW5lID0gc3VicHJvY2Vzcy5saXN0MmNtZGxpbmUoCiAgICAgICAgICAgIENvbW1hbmRTcGVjLl9zdHJpcF9xdW90ZXMoaXRlbS5zdHJpcCgpKSBmb3IgaXRlbSBpbiBpdGVtcykKICAgICAgICByZXR1cm4gJyMhJyArIGNtZGxpbmUgKyAnXG4nCgoKIyBGb3IgcGJyIGNvbXBhdDsgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24uCnN5c19leGVjdXRhYmxlID0gQ29tbWFuZFNwZWMuX3N5c19leGVjdXRhYmxlKCkKCgpjbGFzcyBXaW5kb3dzQ29tbWFuZFNwZWMoQ29tbWFuZFNwZWMpOgogICAgc3BsaXRfYXJncyA9IGRpY3QocG9zaXg9RmFsc2UpCgoKY2xhc3MgU2NyaXB0V3JpdGVyOgogICAgIiIiCiAgICBFbmNhcHN1bGF0ZXMgYmVoYXZpb3IgYXJvdW5kIHdyaXRpbmcgZW50cnkgcG9pbnQgc2NyaXB0cyBmb3IgY29uc29sZSBhbmQKICAgIGd1aSBhcHBzLgogICAgIiIiCgogICAgdGVtcGxhdGUgPSB0ZXh0d3JhcC5kZWRlbnQociIiIgogICAgICAgICMgRUFTWS1JTlNUQUxMLUVOVFJZLVNDUklQVDogJShzcGVjKXIsJShncm91cClyLCUobmFtZSlyCiAgICAgICAgX19yZXF1aXJlc19fID0gJShzcGVjKXIKICAgICAgICBpbXBvcnQgcmUKICAgICAgICBpbXBvcnQgc3lzCiAgICAgICAgZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCBsb2FkX2VudHJ5X3BvaW50CgogICAgICAgIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgICAgICAgIHN5cy5hcmd2WzBdID0gcmUuc3ViKHInKC1zY3JpcHRcLnB5dz98XC5leGUpPyQnLCAnJywgc3lzLmFyZ3ZbMF0pCiAgICAgICAgICAgIHN5cy5leGl0KAogICAgICAgICAgICAgICAgbG9hZF9lbnRyeV9wb2ludCglKHNwZWMpciwgJShncm91cClyLCAlKG5hbWUpcikoKQogICAgICAgICAgICApCiAgICAiIiIpLmxzdHJpcCgpCgogICAgY29tbWFuZF9zcGVjX2NsYXNzID0gQ29tbWFuZFNwZWMKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBnZXRfc2NyaXB0X2FyZ3MoY2xzLCBkaXN0LCBleGVjdXRhYmxlPU5vbmUsIHdpbmluc3Q9RmFsc2UpOgogICAgICAgICMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKICAgICAgICB3YXJuaW5ncy53YXJuKCJVc2UgZ2V0X2FyZ3MiLCBFYXN5SW5zdGFsbERlcHJlY2F0aW9uV2FybmluZykKICAgICAgICB3cml0ZXIgPSAoV2luZG93c1NjcmlwdFdyaXRlciBpZiB3aW5pbnN0IGVsc2UgU2NyaXB0V3JpdGVyKS5iZXN0KCkKICAgICAgICBoZWFkZXIgPSBjbHMuZ2V0X3NjcmlwdF9oZWFkZXIoIiIsIGV4ZWN1dGFibGUsIHdpbmluc3QpCiAgICAgICAgcmV0dXJuIHdyaXRlci5nZXRfYXJncyhkaXN0LCBoZWFkZXIpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZ2V0X3NjcmlwdF9oZWFkZXIoY2xzLCBzY3JpcHRfdGV4dCwgZXhlY3V0YWJsZT1Ob25lLCB3aW5pbnN0PUZhbHNlKToKICAgICAgICAjIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CiAgICAgICAgd2FybmluZ3Mud2FybigiVXNlIGdldF9oZWFkZXIiLCBFYXN5SW5zdGFsbERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQogICAgICAgIGlmIHdpbmluc3Q6CiAgICAgICAgICAgIGV4ZWN1dGFibGUgPSAicHl0aG9uLmV4ZSIKICAgICAgICByZXR1cm4gY2xzLmdldF9oZWFkZXIoc2NyaXB0X3RleHQsIGV4ZWN1dGFibGUpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZ2V0X2FyZ3MoY2xzLCBkaXN0LCBoZWFkZXI9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgWWllbGQgd3JpdGVfc2NyaXB0KCkgYXJndW1lbnQgdHVwbGVzIGZvciBhIGRpc3RyaWJ1dGlvbidzCiAgICAgICAgY29uc29sZV9zY3JpcHRzIGFuZCBndWlfc2NyaXB0cyBlbnRyeSBwb2ludHMuCiAgICAgICAgIiIiCiAgICAgICAgaWYgaGVhZGVyIGlzIE5vbmU6CiAgICAgICAgICAgIGhlYWRlciA9IGNscy5nZXRfaGVhZGVyKCkKICAgICAgICBzcGVjID0gc3RyKGRpc3QuYXNfcmVxdWlyZW1lbnQoKSkKICAgICAgICBmb3IgdHlwZV8gaW4gJ2NvbnNvbGUnLCAnZ3VpJzoKICAgICAgICAgICAgZ3JvdXAgPSB0eXBlXyArICdfc2NyaXB0cycKICAgICAgICAgICAgZm9yIG5hbWUsIGVwIGluIGRpc3QuZ2V0X2VudHJ5X21hcChncm91cCkuaXRlbXMoKToKICAgICAgICAgICAgICAgIGNscy5fZW5zdXJlX3NhZmVfbmFtZShuYW1lKQogICAgICAgICAgICAgICAgc2NyaXB0X3RleHQgPSBjbHMudGVtcGxhdGUgJSBsb2NhbHMoKQogICAgICAgICAgICAgICAgYXJncyA9IGNscy5fZ2V0X3NjcmlwdF9hcmdzKHR5cGVfLCBuYW1lLCBoZWFkZXIsIHNjcmlwdF90ZXh0KQogICAgICAgICAgICAgICAgZm9yIHJlcyBpbiBhcmdzOgogICAgICAgICAgICAgICAgICAgIHlpZWxkIHJlcwoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfZW5zdXJlX3NhZmVfbmFtZShuYW1lKToKICAgICAgICAiIiIKICAgICAgICBQcmV2ZW50IHBhdGhzIGluICpfc2NyaXB0cyBlbnRyeSBwb2ludCBuYW1lcy4KICAgICAgICAiIiIKICAgICAgICBoYXNfcGF0aF9zZXAgPSByZS5zZWFyY2gocidbXFwvXScsIG5hbWUpCiAgICAgICAgaWYgaGFzX3BhdGhfc2VwOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJQYXRoIHNlcGFyYXRvcnMgbm90IGFsbG93ZWQgaW4gc2NyaXB0IG5hbWVzIikKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBnZXRfd3JpdGVyKGNscywgZm9yY2Vfd2luZG93cyk6CiAgICAgICAgIyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQogICAgICAgIHdhcm5pbmdzLndhcm4oIlVzZSBiZXN0IiwgRWFzeUluc3RhbGxEZXByZWNhdGlvbldhcm5pbmcpCiAgICAgICAgcmV0dXJuIFdpbmRvd3NTY3JpcHRXcml0ZXIuYmVzdCgpIGlmIGZvcmNlX3dpbmRvd3MgZWxzZSBjbHMuYmVzdCgpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgYmVzdChjbHMpOgogICAgICAgICIiIgogICAgICAgIFNlbGVjdCB0aGUgYmVzdCBTY3JpcHRXcml0ZXIgZm9yIHRoaXMgZW52aXJvbm1lbnQuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICd3aW4zMicgb3IgKG9zLm5hbWUgPT0gJ2phdmEnIGFuZCBvcy5fbmFtZSA9PSAnbnQnKToKICAgICAgICAgICAgcmV0dXJuIFdpbmRvd3NTY3JpcHRXcml0ZXIuYmVzdCgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIGNscwoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9nZXRfc2NyaXB0X2FyZ3MoY2xzLCB0eXBlXywgbmFtZSwgaGVhZGVyLCBzY3JpcHRfdGV4dCk6CiAgICAgICAgIyBTaW1wbHkgd3JpdGUgdGhlIHN0dWIgd2l0aCBubyBleHRlbnNpb24uCiAgICAgICAgeWllbGQgKG5hbWUsIGhlYWRlciArIHNjcmlwdF90ZXh0KQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGdldF9oZWFkZXIoY2xzLCBzY3JpcHRfdGV4dD0iIiwgZXhlY3V0YWJsZT1Ob25lKToKICAgICAgICAiIiJDcmVhdGUgYSAjISBsaW5lLCBnZXR0aW5nIG9wdGlvbnMgKGlmIGFueSkgZnJvbSBzY3JpcHRfdGV4dCIiIgogICAgICAgIGNtZCA9IGNscy5jb21tYW5kX3NwZWNfY2xhc3MuYmVzdCgpLmZyb21fcGFyYW0oZXhlY3V0YWJsZSkKICAgICAgICBjbWQuaW5zdGFsbF9vcHRpb25zKHNjcmlwdF90ZXh0KQogICAgICAgIHJldHVybiBjbWQuYXNfaGVhZGVyKCkKCgpjbGFzcyBXaW5kb3dzU2NyaXB0V3JpdGVyKFNjcmlwdFdyaXRlcik6CiAgICBjb21tYW5kX3NwZWNfY2xhc3MgPSBXaW5kb3dzQ29tbWFuZFNwZWMKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBnZXRfd3JpdGVyKGNscyk6CiAgICAgICAgIyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQogICAgICAgIHdhcm5pbmdzLndhcm4oIlVzZSBiZXN0IiwgRWFzeUluc3RhbGxEZXByZWNhdGlvbldhcm5pbmcpCiAgICAgICAgcmV0dXJuIGNscy5iZXN0KCkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBiZXN0KGNscyk6CiAgICAgICAgIiIiCiAgICAgICAgU2VsZWN0IHRoZSBiZXN0IFNjcmlwdFdyaXRlciBzdWl0YWJsZSBmb3IgV2luZG93cwogICAgICAgICIiIgogICAgICAgIHdyaXRlcl9sb29rdXAgPSBkaWN0KAogICAgICAgICAgICBleGVjdXRhYmxlPVdpbmRvd3NFeGVjdXRhYmxlTGF1bmNoZXJXcml0ZXIsCiAgICAgICAgICAgIG5hdHVyYWw9Y2xzLAogICAgICAgICkKICAgICAgICAjIGZvciBjb21wYXRpYmlsaXR5LCB1c2UgdGhlIGV4ZWN1dGFibGUgbGF1bmNoZXIgYnkgZGVmYXVsdAogICAgICAgIGxhdW5jaGVyID0gb3MuZW52aXJvbi5nZXQoJ1NFVFVQVE9PTFNfTEFVTkNIRVInLCAnZXhlY3V0YWJsZScpCiAgICAgICAgcmV0dXJuIHdyaXRlcl9sb29rdXBbbGF1bmNoZXJdCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX2dldF9zY3JpcHRfYXJncyhjbHMsIHR5cGVfLCBuYW1lLCBoZWFkZXIsIHNjcmlwdF90ZXh0KToKICAgICAgICAiRm9yIFdpbmRvd3MsIGFkZCBhIC5weSBleHRlbnNpb24iCiAgICAgICAgZXh0ID0gZGljdChjb25zb2xlPScucHlhJywgZ3VpPScucHl3JylbdHlwZV9dCiAgICAgICAgaWYgZXh0IG5vdCBpbiBvcy5lbnZpcm9uWydQQVRIRVhUJ10ubG93ZXIoKS5zcGxpdCgnOycpOgogICAgICAgICAgICBtc2cgPSAoCiAgICAgICAgICAgICAgICAie2V4dH0gbm90IGxpc3RlZCBpbiBQQVRIRVhUOyBzY3JpcHRzIHdpbGwgbm90IGJlICIKICAgICAgICAgICAgICAgICJyZWNvZ25pemVkIGFzIGV4ZWN1dGFibGVzLiIKICAgICAgICAgICAgKS5mb3JtYXQoKipsb2NhbHMoKSkKICAgICAgICAgICAgd2FybmluZ3Mud2Fybihtc2csIFVzZXJXYXJuaW5nKQogICAgICAgIG9sZCA9IFsnLnB5YScsICcucHknLCAnLXNjcmlwdC5weScsICcucHljJywgJy5weW8nLCAnLnB5dycsICcuZXhlJ10KICAgICAgICBvbGQucmVtb3ZlKGV4dCkKICAgICAgICBoZWFkZXIgPSBjbHMuX2FkanVzdF9oZWFkZXIodHlwZV8sIGhlYWRlcikKICAgICAgICBibG9ja2VycyA9IFtuYW1lICsgeCBmb3IgeCBpbiBvbGRdCiAgICAgICAgeWllbGQgbmFtZSArIGV4dCwgaGVhZGVyICsgc2NyaXB0X3RleHQsICd0JywgYmxvY2tlcnMKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfYWRqdXN0X2hlYWRlcihjbHMsIHR5cGVfLCBvcmlnX2hlYWRlcik6CiAgICAgICAgIiIiCiAgICAgICAgTWFrZSBzdXJlICdweXRob253JyBpcyB1c2VkIGZvciBndWkgYW5kIGFuZCAncHl0aG9uJyBpcyB1c2VkIGZvcgogICAgICAgIGNvbnNvbGUgKHJlZ2FyZGxlc3Mgb2Ygd2hhdCBzeXMuZXhlY3V0YWJsZSBpcykuCiAgICAgICAgIiIiCiAgICAgICAgcGF0dGVybiA9ICdweXRob253LmV4ZScKICAgICAgICByZXBsID0gJ3B5dGhvbi5leGUnCiAgICAgICAgaWYgdHlwZV8gPT0gJ2d1aSc6CiAgICAgICAgICAgIHBhdHRlcm4sIHJlcGwgPSByZXBsLCBwYXR0ZXJuCiAgICAgICAgcGF0dGVybl9vYiA9IHJlLmNvbXBpbGUocmUuZXNjYXBlKHBhdHRlcm4pLCByZS5JR05PUkVDQVNFKQogICAgICAgIG5ld19oZWFkZXIgPSBwYXR0ZXJuX29iLnN1YihzdHJpbmc9b3JpZ19oZWFkZXIsIHJlcGw9cmVwbCkKICAgICAgICByZXR1cm4gbmV3X2hlYWRlciBpZiBjbHMuX3VzZV9oZWFkZXIobmV3X2hlYWRlcikgZWxzZSBvcmlnX2hlYWRlcgoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfdXNlX2hlYWRlcihuZXdfaGVhZGVyKToKICAgICAgICAiIiIKICAgICAgICBTaG91bGQgX2FkanVzdF9oZWFkZXIgdXNlIHRoZSByZXBsYWNlZCBoZWFkZXI/CgogICAgICAgIE9uIG5vbi13aW5kb3dzIHN5c3RlbXMsIGFsd2F5cyB1c2UuIE9uCiAgICAgICAgV2luZG93cyBzeXN0ZW1zLCBvbmx5IHVzZSB0aGUgcmVwbGFjZWQgaGVhZGVyIGlmIGl0IHJlc29sdmVzCiAgICAgICAgdG8gYW4gZXhlY3V0YWJsZSBvbiB0aGUgc3lzdGVtLgogICAgICAgICIiIgogICAgICAgIGNsZWFuX2hlYWRlciA9IG5ld19oZWFkZXJbMjotMV0uc3RyaXAoJyInKQogICAgICAgIHJldHVybiBzeXMucGxhdGZvcm0gIT0gJ3dpbjMyJyBvciBmaW5kX2V4ZWN1dGFibGUoY2xlYW5faGVhZGVyKQoKCmNsYXNzIFdpbmRvd3NFeGVjdXRhYmxlTGF1bmNoZXJXcml0ZXIoV2luZG93c1NjcmlwdFdyaXRlcik6CiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfZ2V0X3NjcmlwdF9hcmdzKGNscywgdHlwZV8sIG5hbWUsIGhlYWRlciwgc2NyaXB0X3RleHQpOgogICAgICAgICIiIgogICAgICAgIEZvciBXaW5kb3dzLCBhZGQgYSAucHkgZXh0ZW5zaW9uIGFuZCBhbiAuZXhlIGxhdW5jaGVyCiAgICAgICAgIiIiCiAgICAgICAgaWYgdHlwZV8gPT0gJ2d1aSc6CiAgICAgICAgICAgIGxhdW5jaGVyX3R5cGUgPSAnZ3VpJwogICAgICAgICAgICBleHQgPSAnLXNjcmlwdC5weXcnCiAgICAgICAgICAgIG9sZCA9IFsnLnB5dyddCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbGF1bmNoZXJfdHlwZSA9ICdjbGknCiAgICAgICAgICAgIGV4dCA9ICctc2NyaXB0LnB5JwogICAgICAgICAgICBvbGQgPSBbJy5weScsICcucHljJywgJy5weW8nXQogICAgICAgIGhkciA9IGNscy5fYWRqdXN0X2hlYWRlcih0eXBlXywgaGVhZGVyKQogICAgICAgIGJsb2NrZXJzID0gW25hbWUgKyB4IGZvciB4IGluIG9sZF0KICAgICAgICB5aWVsZCAobmFtZSArIGV4dCwgaGRyICsgc2NyaXB0X3RleHQsICd0JywgYmxvY2tlcnMpCiAgICAgICAgeWllbGQgKAogICAgICAgICAgICBuYW1lICsgJy5leGUnLCBnZXRfd2luX2xhdW5jaGVyKGxhdW5jaGVyX3R5cGUpLAogICAgICAgICAgICAnYicgICMgd3JpdGUgaW4gYmluYXJ5IG1vZGUKICAgICAgICApCiAgICAgICAgaWYgbm90IGlzXzY0Yml0KCk6CiAgICAgICAgICAgICMgaW5zdGFsbCBhIG1hbmlmZXN0IGZvciB0aGUgbGF1bmNoZXIgdG8gcHJldmVudCBXaW5kb3dzCiAgICAgICAgICAgICMgZnJvbSBkZXRlY3RpbmcgaXQgYXMgYW4gaW5zdGFsbGVyICh3aGljaCBpdCB3aWxsIGZvcgogICAgICAgICAgICAjICBsYXVuY2hlcnMgbGlrZSBlYXN5X2luc3RhbGwuZXhlKS4gQ29uc2lkZXIgb25seQogICAgICAgICAgICAjICBhZGRpbmcgYSBtYW5pZmVzdCBmb3IgbGF1bmNoZXJzIGRldGVjdGVkIGFzIGluc3RhbGxlcnMuCiAgICAgICAgICAgICMgIFNlZSBEaXN0cmlidXRlICMxNDMgZm9yIGRldGFpbHMuCiAgICAgICAgICAgIG1fbmFtZSA9IG5hbWUgKyAnLmV4ZS5tYW5pZmVzdCcKICAgICAgICAgICAgeWllbGQgKG1fbmFtZSwgbG9hZF9sYXVuY2hlcl9tYW5pZmVzdChuYW1lKSwgJ3QnKQoKCiMgZm9yIGJhY2t3YXJkLWNvbXBhdGliaWxpdHkKZ2V0X3NjcmlwdF9hcmdzID0gU2NyaXB0V3JpdGVyLmdldF9zY3JpcHRfYXJncwpnZXRfc2NyaXB0X2hlYWRlciA9IFNjcmlwdFdyaXRlci5nZXRfc2NyaXB0X2hlYWRlcgoKCmRlZiBnZXRfd2luX2xhdW5jaGVyKHR5cGUpOgogICAgIiIiCiAgICBMb2FkIHRoZSBXaW5kb3dzIGxhdW5jaGVyIChleGVjdXRhYmxlKSBzdWl0YWJsZSBmb3IgbGF1bmNoaW5nIGEgc2NyaXB0LgoKICAgIGB0eXBlYCBzaG91bGQgYmUgZWl0aGVyICdjbGknIG9yICdndWknCgogICAgUmV0dXJucyB0aGUgZXhlY3V0YWJsZSBhcyBhIGJ5dGUgc3RyaW5nLgogICAgIiIiCiAgICBsYXVuY2hlcl9mbiA9ICclcy5leGUnICUgdHlwZQogICAgaWYgaXNfNjRiaXQoKToKICAgICAgICBsYXVuY2hlcl9mbiA9IGxhdW5jaGVyX2ZuLnJlcGxhY2UoIi4iLCAiLTY0LiIpCiAgICBlbHNlOgogICAgICAgIGxhdW5jaGVyX2ZuID0gbGF1bmNoZXJfZm4ucmVwbGFjZSgiLiIsICItMzIuIikKICAgIHJldHVybiByZXNvdXJjZV9zdHJpbmcoJ3NldHVwdG9vbHMnLCBsYXVuY2hlcl9mbikKCgpkZWYgbG9hZF9sYXVuY2hlcl9tYW5pZmVzdChuYW1lKToKICAgIG1hbmlmZXN0ID0gcGtnX3Jlc291cmNlcy5yZXNvdXJjZV9zdHJpbmcoX19uYW1lX18sICdsYXVuY2hlciBtYW5pZmVzdC54bWwnKQogICAgaWYgc2l4LlBZMjoKICAgICAgICByZXR1cm4gbWFuaWZlc3QgJSB2YXJzKCkKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIG1hbmlmZXN0LmRlY29kZSgndXRmLTgnKSAlIHZhcnMoKQoKCmRlZiBybXRyZWUocGF0aCwgaWdub3JlX2Vycm9ycz1GYWxzZSwgb25lcnJvcj1hdXRvX2NobW9kKToKICAgIHJldHVybiBzaHV0aWwucm10cmVlKHBhdGgsIGlnbm9yZV9lcnJvcnMsIG9uZXJyb3IpCgoKZGVmIGN1cnJlbnRfdW1hc2soKToKICAgIHRtcCA9IG9zLnVtYXNrKDBvMDIyKQogICAgb3MudW1hc2sodG1wKQogICAgcmV0dXJuIHRtcAoKCmRlZiBib290c3RyYXAoKToKICAgICMgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBzZXR1cHRvb2xzKi5lZ2cgaXMgcnVuIHVzaW5nIC9iaW4vc2gKICAgIGltcG9ydCBzZXR1cHRvb2xzCgogICAgYXJndjAgPSBvcy5wYXRoLmRpcm5hbWUoc2V0dXB0b29scy5fX3BhdGhfX1swXSkKICAgIHN5cy5hcmd2WzBdID0gYXJndjAKICAgIHN5cy5hcmd2LmFwcGVuZChhcmd2MCkKICAgIG1haW4oKQoKCmRlZiBtYWluKGFyZ3Y9Tm9uZSwgKiprdyk6CiAgICBmcm9tIHNldHVwdG9vbHMgaW1wb3J0IHNldHVwCiAgICBmcm9tIHNldHVwdG9vbHMuZGlzdCBpbXBvcnQgRGlzdHJpYnV0aW9uCgogICAgY2xhc3MgRGlzdHJpYnV0aW9uV2l0aG91dEhlbHBDb21tYW5kcyhEaXN0cmlidXRpb24pOgogICAgICAgIGNvbW1vbl91c2FnZSA9ICIiCgogICAgICAgIGRlZiBfc2hvd19oZWxwKHNlbGYsICphcmdzLCAqKmt3KToKICAgICAgICAgICAgd2l0aCBfcGF0Y2hfdXNhZ2UoKToKICAgICAgICAgICAgICAgIERpc3RyaWJ1dGlvbi5fc2hvd19oZWxwKHNlbGYsICphcmdzLCAqKmt3KQoKICAgIGlmIGFyZ3YgaXMgTm9uZToKICAgICAgICBhcmd2ID0gc3lzLmFyZ3ZbMTpdCgogICAgd2l0aCBfcGF0Y2hfdXNhZ2UoKToKICAgICAgICBzZXR1cCgKICAgICAgICAgICAgc2NyaXB0X2FyZ3M9WyctcScsICdlYXN5X2luc3RhbGwnLCAnLXYnXSArIGFyZ3YsCiAgICAgICAgICAgIHNjcmlwdF9uYW1lPXN5cy5hcmd2WzBdIG9yICdlYXN5X2luc3RhbGwnLAogICAgICAgICAgICBkaXN0Y2xhc3M9RGlzdHJpYnV0aW9uV2l0aG91dEhlbHBDb21tYW5kcywKICAgICAgICAgICAgKiprdwogICAgICAgICkKCgpAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgpkZWYgX3BhdGNoX3VzYWdlKCk6CiAgICBpbXBvcnQgZGlzdHV0aWxzLmNvcmUKICAgIFVTQUdFID0gdGV4dHdyYXAuZGVkZW50KCIiIgogICAgICAgIHVzYWdlOiAlKHNjcmlwdClzIFtvcHRpb25zXSByZXF1aXJlbWVudF9vcl91cmwgLi4uCiAgICAgICAgICAgb3I6ICUoc2NyaXB0KXMgLS1oZWxwCiAgICAgICAgIiIiKS5sc3RyaXAoKQoKICAgIGRlZiBnZW5fdXNhZ2Uoc2NyaXB0X25hbWUpOgogICAgICAgIHJldHVybiBVU0FHRSAlIGRpY3QoCiAgICAgICAgICAgIHNjcmlwdD1vcy5wYXRoLmJhc2VuYW1lKHNjcmlwdF9uYW1lKSwKICAgICAgICApCgogICAgc2F2ZWQgPSBkaXN0dXRpbHMuY29yZS5nZW5fdXNhZ2UKICAgIGRpc3R1dGlscy5jb3JlLmdlbl91c2FnZSA9IGdlbl91c2FnZQogICAgdHJ5OgogICAgICAgIHlpZWxkCiAgICBmaW5hbGx5OgogICAgICAgIGRpc3R1dGlscy5jb3JlLmdlbl91c2FnZSA9IHNhdmVkCgpjbGFzcyBFYXN5SW5zdGFsbERlcHJlY2F0aW9uV2FybmluZyhTZXR1cHRvb2xzRGVwcmVjYXRpb25XYXJuaW5nKToKICAgICIiIkNsYXNzIGZvciB3YXJuaW5nIGFib3V0IGRlcHJlY2F0aW9ucyBpbiBFYXN5SW5zdGFsbCBpbiBTZXR1cFRvb2xzLiBOb3QgaWdub3JlZCBieSBkZWZhdWx0LCB1bmxpa2UgRGVwcmVjYXRpb25XYXJuaW5nLiIiIgogICAgClBLAwQUAAAAAAAAACEAMYn09uJjAADiYwAAQwAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2NvbW1hbmQvZWdnX2luZm8ucHkiIiJzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm8KCkNyZWF0ZSBhIGRpc3RyaWJ1dGlvbidzIC5lZ2ctaW5mbyBkaXJlY3RvcnkgYW5kIGNvbnRlbnRzIiIiCgpmcm9tIGRpc3R1dGlscy5maWxlbGlzdCBpbXBvcnQgRmlsZUxpc3QgYXMgX0ZpbGVMaXN0CmZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzSW50ZXJuYWxFcnJvcgpmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBjb252ZXJ0X3BhdGgKZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZwppbXBvcnQgZGlzdHV0aWxzLmVycm9ycwppbXBvcnQgZGlzdHV0aWxzLmZpbGVsaXN0CmltcG9ydCBvcwppbXBvcnQgcmUKaW1wb3J0IHN5cwppbXBvcnQgaW8KaW1wb3J0IHdhcm5pbmdzCmltcG9ydCB0aW1lCmltcG9ydCBjb2xsZWN0aW9ucwoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybiBpbXBvcnQgc2l4CmZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4Lm1vdmVzIGltcG9ydCBtYXAKCmZyb20gc2V0dXB0b29scyBpbXBvcnQgQ29tbWFuZApmcm9tIHNldHVwdG9vbHMuY29tbWFuZC5zZGlzdCBpbXBvcnQgc2Rpc3QKZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQuc2Rpc3QgaW1wb3J0IHdhbGtfcmV2Y3RybApmcm9tIHNldHVwdG9vbHMuY29tbWFuZC5zZXRvcHQgaW1wb3J0IGVkaXRfY29uZmlnCmZyb20gc2V0dXB0b29scy5jb21tYW5kIGltcG9ydCBiZGlzdF9lZ2cKZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCAoCiAgICBwYXJzZV9yZXF1aXJlbWVudHMsIHNhZmVfbmFtZSwgcGFyc2VfdmVyc2lvbiwKICAgIHNhZmVfdmVyc2lvbiwgeWllbGRfbGluZXMsIEVudHJ5UG9pbnQsIGl0ZXJfZW50cnlfcG9pbnRzLCB0b19maWxlbmFtZSkKaW1wb3J0IHNldHVwdG9vbHMudW5pY29kZV91dGlscyBhcyB1bmljb2RlX3V0aWxzCmZyb20gc2V0dXB0b29scy5nbG9iIGltcG9ydCBnbG9iCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuIGltcG9ydCBwYWNrYWdpbmcKZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBTZXR1cHRvb2xzRGVwcmVjYXRpb25XYXJuaW5nCgpkZWYgdHJhbnNsYXRlX3BhdHRlcm4oZ2xvYik6CiAgICAiIiIKICAgIFRyYW5zbGF0ZSBhIGZpbGUgcGF0aCBnbG9iIGxpa2UgJyoudHh0JyBpbiB0byBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4KICAgIFRoaXMgZGlmZmVycyBmcm9tIGZubWF0Y2gudHJhbnNsYXRlIHdoaWNoIGFsbG93cyB3aWxkY2FyZHMgdG8gbWF0Y2gKICAgIGRpcmVjdG9yeSBzZXBhcmF0b3JzLiBJdCBhbHNvIGtub3dzIGFib3V0ICcqKi8nIHdoaWNoIG1hdGNoZXMgYW55IG51bWJlciBvZgogICAgZGlyZWN0b3JpZXMuCiAgICAiIiIKICAgIHBhdCA9ICcnCgogICAgIyBUaGlzIHdpbGwgc3BsaXQgb24gJy8nIHdpdGhpbiBbY2hhcmFjdGVyIGNsYXNzZXNdLiBUaGlzIGlzIGRlbGliZXJhdGUuCiAgICBjaHVua3MgPSBnbG9iLnNwbGl0KG9zLnBhdGguc2VwKQoKICAgIHNlcCA9IHJlLmVzY2FwZShvcy5zZXApCiAgICB2YWxpZF9jaGFyID0gJ1teJXNdJyAlIChzZXAsKQoKICAgIGZvciBjLCBjaHVuayBpbiBlbnVtZXJhdGUoY2h1bmtzKToKICAgICAgICBsYXN0X2NodW5rID0gYyA9PSBsZW4oY2h1bmtzKSAtIDEKCiAgICAgICAgIyBDaHVua3MgdGhhdCBhcmUgYSBsaXRlcmFsICoqIGFyZSBnbG9ic3RhcnMuIFRoZXkgbWF0Y2ggYW55dGhpbmcuCiAgICAgICAgaWYgY2h1bmsgPT0gJyoqJzoKICAgICAgICAgICAgaWYgbGFzdF9jaHVuazoKICAgICAgICAgICAgICAgICMgTWF0Y2ggYW55dGhpbmcgaWYgdGhpcyBpcyB0aGUgbGFzdCBjb21wb25lbnQKICAgICAgICAgICAgICAgIHBhdCArPSAnLionCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIE1hdGNoICcobmFtZS8pKicKICAgICAgICAgICAgICAgIHBhdCArPSAnKD86JXMrJXMpKicgJSAodmFsaWRfY2hhciwgc2VwKQogICAgICAgICAgICBjb250aW51ZSAgIyBCcmVhayBoZXJlIGFzIHRoZSB3aG9sZSBwYXRoIGNvbXBvbmVudCBoYXMgYmVlbiBoYW5kbGVkCgogICAgICAgICMgRmluZCBhbnkgc3BlY2lhbCBjaGFyYWN0ZXJzIGluIHRoZSByZW1haW5kZXIKICAgICAgICBpID0gMAogICAgICAgIGNodW5rX2xlbiA9IGxlbihjaHVuaykKICAgICAgICB3aGlsZSBpIDwgY2h1bmtfbGVuOgogICAgICAgICAgICBjaGFyID0gY2h1bmtbaV0KICAgICAgICAgICAgaWYgY2hhciA9PSAnKic6CiAgICAgICAgICAgICAgICAjIE1hdGNoIGFueSBudW1iZXIgb2YgbmFtZSBjaGFyYWN0ZXJzCiAgICAgICAgICAgICAgICBwYXQgKz0gdmFsaWRfY2hhciArICcqJwogICAgICAgICAgICBlbGlmIGNoYXIgPT0gJz8nOgogICAgICAgICAgICAgICAgIyBNYXRjaCBhIG5hbWUgY2hhcmFjdGVyCiAgICAgICAgICAgICAgICBwYXQgKz0gdmFsaWRfY2hhcgogICAgICAgICAgICBlbGlmIGNoYXIgPT0gJ1snOgogICAgICAgICAgICAgICAgIyBDaGFyYWN0ZXIgY2xhc3MKICAgICAgICAgICAgICAgIGlubmVyX2kgPSBpICsgMQogICAgICAgICAgICAgICAgIyBTa2lwIGluaXRpYWwgIS9dIGNoYXJzCiAgICAgICAgICAgICAgICBpZiBpbm5lcl9pIDwgY2h1bmtfbGVuIGFuZCBjaHVua1tpbm5lcl9pXSA9PSAnISc6CiAgICAgICAgICAgICAgICAgICAgaW5uZXJfaSA9IGlubmVyX2kgKyAxCiAgICAgICAgICAgICAgICBpZiBpbm5lcl9pIDwgY2h1bmtfbGVuIGFuZCBjaHVua1tpbm5lcl9pXSA9PSAnXSc6CiAgICAgICAgICAgICAgICAgICAgaW5uZXJfaSA9IGlubmVyX2kgKyAxCgogICAgICAgICAgICAgICAgIyBMb29wIHRpbGwgdGhlIGNsb3NpbmcgXSBpcyBmb3VuZAogICAgICAgICAgICAgICAgd2hpbGUgaW5uZXJfaSA8IGNodW5rX2xlbiBhbmQgY2h1bmtbaW5uZXJfaV0gIT0gJ10nOgogICAgICAgICAgICAgICAgICAgIGlubmVyX2kgPSBpbm5lcl9pICsgMQoKICAgICAgICAgICAgICAgIGlmIGlubmVyX2kgPj0gY2h1bmtfbGVuOgogICAgICAgICAgICAgICAgICAgICMgR290IHRvIHRoZSBlbmQgb2YgdGhlIHN0cmluZyB3aXRob3V0IGZpbmRpbmcgYSBjbG9zaW5nIF0KICAgICAgICAgICAgICAgICAgICAjIERvIG5vdCB0cmVhdCB0aGlzIGFzIGEgbWF0Y2hpbmcgZ3JvdXAsIGJ1dCBhcyBhIGxpdGVyYWwgWwogICAgICAgICAgICAgICAgICAgIHBhdCArPSByZS5lc2NhcGUoY2hhcikKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgIyBHcmFiIHRoZSBpbnNpZGVzIG9mIHRoZSBbYnJhY2tldHNdCiAgICAgICAgICAgICAgICAgICAgaW5uZXIgPSBjaHVua1tpICsgMTppbm5lcl9pXQogICAgICAgICAgICAgICAgICAgIGNoYXJfY2xhc3MgPSAnJwoKICAgICAgICAgICAgICAgICAgICAjIENsYXNzIG5lZ2F0aW9uCiAgICAgICAgICAgICAgICAgICAgaWYgaW5uZXJbMF0gPT0gJyEnOgogICAgICAgICAgICAgICAgICAgICAgICBjaGFyX2NsYXNzID0gJ14nCiAgICAgICAgICAgICAgICAgICAgICAgIGlubmVyID0gaW5uZXJbMTpdCgogICAgICAgICAgICAgICAgICAgIGNoYXJfY2xhc3MgKz0gcmUuZXNjYXBlKGlubmVyKQogICAgICAgICAgICAgICAgICAgIHBhdCArPSAnWyVzXScgJSAoY2hhcl9jbGFzcywpCgogICAgICAgICAgICAgICAgICAgICMgU2tpcCB0byB0aGUgZW5kIF0KICAgICAgICAgICAgICAgICAgICBpID0gaW5uZXJfaQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcGF0ICs9IHJlLmVzY2FwZShjaGFyKQogICAgICAgICAgICBpICs9IDEKCiAgICAgICAgIyBKb2luIGVhY2ggY2h1bmsgd2l0aCB0aGUgZGlyIHNlcGFyYXRvcgogICAgICAgIGlmIG5vdCBsYXN0X2NodW5rOgogICAgICAgICAgICBwYXQgKz0gc2VwCgogICAgcGF0ICs9IHInXFonCiAgICByZXR1cm4gcmUuY29tcGlsZShwYXQsIGZsYWdzPXJlLk1VTFRJTElORXxyZS5ET1RBTEwpCgoKY2xhc3MgSW5mb0NvbW1vbjoKICAgIHRhZ19idWlsZCA9IE5vbmUKICAgIHRhZ19kYXRlID0gTm9uZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIG5hbWUoc2VsZik6CiAgICAgICAgcmV0dXJuIHNhZmVfbmFtZShzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfbmFtZSgpKQoKICAgIGRlZiB0YWdnZWRfdmVyc2lvbihzZWxmKToKICAgICAgICB2ZXJzaW9uID0gc2VsZi5kaXN0cmlidXRpb24uZ2V0X3ZlcnNpb24oKQogICAgICAgICMgZWdnX2luZm8gbWF5IGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZSBmb3IgYSBkaXN0cmlidXRpb24sCiAgICAgICAgIyBpbiB3aGljaCBjYXNlIHRoZSB2ZXJzaW9uIHN0cmluZyBhbHJlYWR5IGNvbnRhaW5zIGFsbCB0YWdzLgogICAgICAgIGlmIHNlbGYudnRhZ3MgYW5kIHZlcnNpb24uZW5kc3dpdGgoc2VsZi52dGFncyk6CiAgICAgICAgICAgIHJldHVybiBzYWZlX3ZlcnNpb24odmVyc2lvbikKICAgICAgICByZXR1cm4gc2FmZV92ZXJzaW9uKHZlcnNpb24gKyBzZWxmLnZ0YWdzKQoKICAgIGRlZiB0YWdzKHNlbGYpOgogICAgICAgIHZlcnNpb24gPSAnJwogICAgICAgIGlmIHNlbGYudGFnX2J1aWxkOgogICAgICAgICAgICB2ZXJzaW9uICs9IHNlbGYudGFnX2J1aWxkCiAgICAgICAgaWYgc2VsZi50YWdfZGF0ZToKICAgICAgICAgICAgdmVyc2lvbiArPSB0aW1lLnN0cmZ0aW1lKCItJVklbSVkIikKICAgICAgICByZXR1cm4gdmVyc2lvbgogICAgdnRhZ3MgPSBwcm9wZXJ0eSh0YWdzKQoKCmNsYXNzIGVnZ19pbmZvKEluZm9Db21tb24sIENvbW1hbmQpOgogICAgZGVzY3JpcHRpb24gPSAiY3JlYXRlIGEgZGlzdHJpYnV0aW9uJ3MgLmVnZy1pbmZvIGRpcmVjdG9yeSIKCiAgICB1c2VyX29wdGlvbnMgPSBbCiAgICAgICAgKCdlZ2ctYmFzZT0nLCAnZScsICJkaXJlY3RvcnkgY29udGFpbmluZyAuZWdnLWluZm8gZGlyZWN0b3JpZXMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKGRlZmF1bHQ6IHRvcCBvZiB0aGUgc291cmNlIHRyZWUpIiksCiAgICAgICAgKCd0YWctZGF0ZScsICdkJywgIkFkZCBkYXRlIHN0YW1wIChlLmcuIDIwMDUwNTI4KSB0byB2ZXJzaW9uIG51bWJlciIpLAogICAgICAgICgndGFnLWJ1aWxkPScsICdiJywgIlNwZWNpZnkgZXhwbGljaXQgdGFnIHRvIGFkZCB0byB2ZXJzaW9uIG51bWJlciIpLAogICAgICAgICgnbm8tZGF0ZScsICdEJywgIkRvbid0IGluY2x1ZGUgZGF0ZSBzdGFtcCBbZGVmYXVsdF0iKSwKICAgIF0KCiAgICBib29sZWFuX29wdGlvbnMgPSBbJ3RhZy1kYXRlJ10KICAgIG5lZ2F0aXZlX29wdCA9IHsKICAgICAgICAnbm8tZGF0ZSc6ICd0YWctZGF0ZScsCiAgICB9CgogICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBzZWxmLmVnZ19iYXNlID0gTm9uZQogICAgICAgIHNlbGYuZWdnX25hbWUgPSBOb25lCiAgICAgICAgc2VsZi5lZ2dfaW5mbyA9IE5vbmUKICAgICAgICBzZWxmLmVnZ192ZXJzaW9uID0gTm9uZQogICAgICAgIHNlbGYuYnJva2VuX2VnZ19pbmZvID0gRmFsc2UKCiAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICMgYWxsb3cgdGhlICd0YWdfc3ZuX3JldmlzaW9uJyB0byBiZSBkZXRlY3RlZCBhbmQKICAgICMgc2V0LCBzdXBwb3J0aW5nIHNkaXN0cyBidWlsdCBvbiBvbGRlciBTZXR1cHRvb2xzLgogICAgQHByb3BlcnR5CiAgICBkZWYgdGFnX3N2bl9yZXZpc2lvbihzZWxmKToKICAgICAgICBwYXNzCgogICAgQHRhZ19zdm5fcmV2aXNpb24uc2V0dGVyCiAgICBkZWYgdGFnX3N2bl9yZXZpc2lvbihzZWxmLCB2YWx1ZSk6CiAgICAgICAgcGFzcwogICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgZGVmIHNhdmVfdmVyc2lvbl9pbmZvKHNlbGYsIGZpbGVuYW1lKToKICAgICAgICAiIiIKICAgICAgICBNYXRlcmlhbGl6ZSB0aGUgdmFsdWUgb2YgZGF0ZSBpbnRvIHRoZQogICAgICAgIGJ1aWxkIHRhZy4gSW5zdGFsbCBidWlsZCBrZXlzIGluIGEgZGV0ZXJtaW5pc3RpYyBvcmRlcgogICAgICAgIHRvIGF2b2lkIGFyYml0cmFyeSByZW9yZGVyaW5nIG9uIHN1YnNlcXVlbnQgYnVpbGRzLgogICAgICAgICIiIgogICAgICAgIGVnZ19pbmZvID0gY29sbGVjdGlvbnMuT3JkZXJlZERpY3QoKQogICAgICAgICMgZm9sbG93IHRoZSBvcmRlciB0aGVzZSBrZXlzIHdvdWxkIGhhdmUgYmVlbiBhZGRlZAogICAgICAgICMgd2hlbiBQWVRIT05IQVNIU0VFRD0wCiAgICAgICAgZWdnX2luZm9bJ3RhZ19idWlsZCddID0gc2VsZi50YWdzKCkKICAgICAgICBlZ2dfaW5mb1sndGFnX2RhdGUnXSA9IDAKICAgICAgICBlZGl0X2NvbmZpZyhmaWxlbmFtZSwgZGljdChlZ2dfaW5mbz1lZ2dfaW5mbykpCgogICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgIyBOb3RlOiB3ZSBuZWVkIHRvIGNhcHR1cmUgdGhlIGN1cnJlbnQgdmFsdWUgcmV0dXJuZWQKICAgICAgICAjIGJ5IGBzZWxmLnRhZ2dlZF92ZXJzaW9uKClgLCBzbyB3ZSBjYW4gbGF0ZXIgdXBkYXRlCiAgICAgICAgIyBgc2VsZi5kaXN0cmlidXRpb24ubWV0YWRhdGEudmVyc2lvbmAgd2l0aG91dAogICAgICAgICMgcmVwZXJjdXNzaW9ucy4KICAgICAgICBzZWxmLmVnZ19uYW1lID0gc2VsZi5uYW1lCiAgICAgICAgc2VsZi5lZ2dfdmVyc2lvbiA9IHNlbGYudGFnZ2VkX3ZlcnNpb24oKQogICAgICAgIHBhcnNlZF92ZXJzaW9uID0gcGFyc2VfdmVyc2lvbihzZWxmLmVnZ192ZXJzaW9uKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGlzX3ZlcnNpb24gPSBpc2luc3RhbmNlKHBhcnNlZF92ZXJzaW9uLCBwYWNrYWdpbmcudmVyc2lvbi5WZXJzaW9uKQogICAgICAgICAgICBzcGVjID0gKAogICAgICAgICAgICAgICAgIiVzPT0lcyIgaWYgaXNfdmVyc2lvbiBlbHNlICIlcz09PSVzIgogICAgICAgICAgICApCiAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgICBwYXJzZV9yZXF1aXJlbWVudHMoc3BlYyAlIChzZWxmLmVnZ19uYW1lLCBzZWxmLmVnZ192ZXJzaW9uKSkKICAgICAgICAgICAgKQogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICByYWlzZSBkaXN0dXRpbHMuZXJyb3JzLkRpc3R1dGlsc09wdGlvbkVycm9yKAogICAgICAgICAgICAgICAgIkludmFsaWQgZGlzdHJpYnV0aW9uIG5hbWUgb3IgdmVyc2lvbiBzeW50YXg6ICVzLSVzIiAlCiAgICAgICAgICAgICAgICAoc2VsZi5lZ2dfbmFtZSwgc2VsZi5lZ2dfdmVyc2lvbikKICAgICAgICAgICAgKQoKICAgICAgICBpZiBzZWxmLmVnZ19iYXNlIGlzIE5vbmU6CiAgICAgICAgICAgIGRpcnMgPSBzZWxmLmRpc3RyaWJ1dGlvbi5wYWNrYWdlX2RpcgogICAgICAgICAgICBzZWxmLmVnZ19iYXNlID0gKGRpcnMgb3Ige30pLmdldCgnJywgb3MuY3VyZGlyKQoKICAgICAgICBzZWxmLmVuc3VyZV9kaXJuYW1lKCdlZ2dfYmFzZScpCiAgICAgICAgc2VsZi5lZ2dfaW5mbyA9IHRvX2ZpbGVuYW1lKHNlbGYuZWdnX25hbWUpICsgJy5lZ2ctaW5mbycKICAgICAgICBpZiBzZWxmLmVnZ19iYXNlICE9IG9zLmN1cmRpcjoKICAgICAgICAgICAgc2VsZi5lZ2dfaW5mbyA9IG9zLnBhdGguam9pbihzZWxmLmVnZ19iYXNlLCBzZWxmLmVnZ19pbmZvKQogICAgICAgIGlmICctJyBpbiBzZWxmLmVnZ19uYW1lOgogICAgICAgICAgICBzZWxmLmNoZWNrX2Jyb2tlbl9lZ2dfaW5mbygpCgogICAgICAgICMgU2V0IHBhY2thZ2UgdmVyc2lvbiBmb3IgdGhlIGJlbmVmaXQgb2YgZHVtYmVyIGNvbW1hbmRzCiAgICAgICAgIyAoZS5nLiBzZGlzdCwgYmRpc3Rfd2luaW5zdCwgZXRjLikKICAgICAgICAjCiAgICAgICAgc2VsZi5kaXN0cmlidXRpb24ubWV0YWRhdGEudmVyc2lvbiA9IHNlbGYuZWdnX3ZlcnNpb24KCiAgICAgICAgIyBJZiB3ZSBib290c3RyYXBwZWQgYXJvdW5kIHRoZSBsYWNrIG9mIGEgUEtHLUlORk8sIGFzIG1pZ2h0IGJlIHRoZQogICAgICAgICMgY2FzZSBpbiBhIGZyZXNoIGNoZWNrb3V0LCBtYWtlIHN1cmUgdGhhdCBhbnkgc3BlY2lhbCB0YWdzIGdldCBhZGRlZAogICAgICAgICMgdG8gdGhlIHZlcnNpb24gaW5mbwogICAgICAgICMKICAgICAgICBwZCA9IHNlbGYuZGlzdHJpYnV0aW9uLl9wYXRjaGVkX2Rpc3QKICAgICAgICBpZiBwZCBpcyBub3QgTm9uZSBhbmQgcGQua2V5ID09IHNlbGYuZWdnX25hbWUubG93ZXIoKToKICAgICAgICAgICAgcGQuX3ZlcnNpb24gPSBzZWxmLmVnZ192ZXJzaW9uCiAgICAgICAgICAgIHBkLl9wYXJzZWRfdmVyc2lvbiA9IHBhcnNlX3ZlcnNpb24oc2VsZi5lZ2dfdmVyc2lvbikKICAgICAgICAgICAgc2VsZi5kaXN0cmlidXRpb24uX3BhdGNoZWRfZGlzdCA9IE5vbmUKCiAgICBkZWYgd3JpdGVfb3JfZGVsZXRlX2ZpbGUoc2VsZiwgd2hhdCwgZmlsZW5hbWUsIGRhdGEsIGZvcmNlPUZhbHNlKToKICAgICAgICAiIiJXcml0ZSBgZGF0YWAgdG8gYGZpbGVuYW1lYCBvciBkZWxldGUgaWYgZW1wdHkKCiAgICAgICAgSWYgYGRhdGFgIGlzIG5vbi1lbXB0eSwgdGhpcyByb3V0aW5lIGlzIHRoZSBzYW1lIGFzIGBgd3JpdGVfZmlsZSgpYGAuCiAgICAgICAgSWYgYGRhdGFgIGlzIGVtcHR5IGJ1dCBub3QgYGBOb25lYGAsIHRoaXMgaXMgdGhlIHNhbWUgYXMgY2FsbGluZwogICAgICAgIGBgZGVsZXRlX2ZpbGUoZmlsZW5hbWUpYC4gIElmIGBkYXRhYCBpcyBgYE5vbmVgYCwgdGhlbiB0aGlzIGlzIGEgbm8tb3AKICAgICAgICB1bmxlc3MgYGZpbGVuYW1lYCBleGlzdHMsIGluIHdoaWNoIGNhc2UgYSB3YXJuaW5nIGlzIGlzc3VlZCBhYm91dCB0aGUKICAgICAgICBvcnBoYW5lZCBmaWxlIChpZiBgZm9yY2VgIGlzIGZhbHNlKSwgb3IgZGVsZXRlZCAoaWYgYGZvcmNlYCBpcyB0cnVlKS4KICAgICAgICAiIiIKICAgICAgICBpZiBkYXRhOgogICAgICAgICAgICBzZWxmLndyaXRlX2ZpbGUod2hhdCwgZmlsZW5hbWUsIGRhdGEpCiAgICAgICAgZWxpZiBvcy5wYXRoLmV4aXN0cyhmaWxlbmFtZSk6CiAgICAgICAgICAgIGlmIGRhdGEgaXMgTm9uZSBhbmQgbm90IGZvcmNlOgogICAgICAgICAgICAgICAgbG9nLndhcm4oCiAgICAgICAgICAgICAgICAgICAgIiVzIG5vdCBzZXQgaW4gc2V0dXAoKSwgYnV0ICVzIGV4aXN0cyIsIHdoYXQsIGZpbGVuYW1lCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYuZGVsZXRlX2ZpbGUoZmlsZW5hbWUpCgogICAgZGVmIHdyaXRlX2ZpbGUoc2VsZiwgd2hhdCwgZmlsZW5hbWUsIGRhdGEpOgogICAgICAgICIiIldyaXRlIGBkYXRhYCB0byBgZmlsZW5hbWVgIChpZiBub3QgYSBkcnkgcnVuKSBhZnRlciBhbm5vdW5jaW5nIGl0CgogICAgICAgIGB3aGF0YCBpcyB1c2VkIGluIGEgbG9nIG1lc3NhZ2UgdG8gaWRlbnRpZnkgd2hhdCBpcyBiZWluZyB3cml0dGVuCiAgICAgICAgdG8gdGhlIGZpbGUuCiAgICAgICAgIiIiCiAgICAgICAgbG9nLmluZm8oIndyaXRpbmcgJXMgdG8gJXMiLCB3aGF0LCBmaWxlbmFtZSkKICAgICAgICBpZiBzaXguUFkzOgogICAgICAgICAgICBkYXRhID0gZGF0YS5lbmNvZGUoInV0Zi04IikKICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICBmID0gb3BlbihmaWxlbmFtZSwgJ3diJykKICAgICAgICAgICAgZi53cml0ZShkYXRhKQogICAgICAgICAgICBmLmNsb3NlKCkKCiAgICBkZWYgZGVsZXRlX2ZpbGUoc2VsZiwgZmlsZW5hbWUpOgogICAgICAgICIiIkRlbGV0ZSBgZmlsZW5hbWVgIChpZiBub3QgYSBkcnkgcnVuKSBhZnRlciBhbm5vdW5jaW5nIGl0IiIiCiAgICAgICAgbG9nLmluZm8oImRlbGV0aW5nICVzIiwgZmlsZW5hbWUpCiAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgb3MudW5saW5rKGZpbGVuYW1lKQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgc2VsZi5ta3BhdGgoc2VsZi5lZ2dfaW5mbykKICAgICAgICBvcy51dGltZShzZWxmLmVnZ19pbmZvLCBOb25lKQogICAgICAgIGluc3RhbGxlciA9IHNlbGYuZGlzdHJpYnV0aW9uLmZldGNoX2J1aWxkX2VnZwogICAgICAgIGZvciBlcCBpbiBpdGVyX2VudHJ5X3BvaW50cygnZWdnX2luZm8ud3JpdGVycycpOgogICAgICAgICAgICBlcC5yZXF1aXJlKGluc3RhbGxlcj1pbnN0YWxsZXIpCiAgICAgICAgICAgIHdyaXRlciA9IGVwLnJlc29sdmUoKQogICAgICAgICAgICB3cml0ZXIoc2VsZiwgZXAubmFtZSwgb3MucGF0aC5qb2luKHNlbGYuZWdnX2luZm8sIGVwLm5hbWUpKQoKICAgICAgICAjIEdldCByaWQgb2YgbmF0aXZlX2xpYnMudHh0IGlmIGl0IHdhcyBwdXQgdGhlcmUgYnkgb2xkZXIgYmRpc3RfZWdnCiAgICAgICAgbmwgPSBvcy5wYXRoLmpvaW4oc2VsZi5lZ2dfaW5mbywgIm5hdGl2ZV9saWJzLnR4dCIpCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMobmwpOgogICAgICAgICAgICBzZWxmLmRlbGV0ZV9maWxlKG5sKQoKICAgICAgICBzZWxmLmZpbmRfc291cmNlcygpCgogICAgZGVmIGZpbmRfc291cmNlcyhzZWxmKToKICAgICAgICAiIiJHZW5lcmF0ZSBTT1VSQ0VTLnR4dCBtYW5pZmVzdCBmaWxlIiIiCiAgICAgICAgbWFuaWZlc3RfZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi5lZ2dfaW5mbywgIlNPVVJDRVMudHh0IikKICAgICAgICBtbSA9IG1hbmlmZXN0X21ha2VyKHNlbGYuZGlzdHJpYnV0aW9uKQogICAgICAgIG1tLm1hbmlmZXN0ID0gbWFuaWZlc3RfZmlsZW5hbWUKICAgICAgICBtbS5ydW4oKQogICAgICAgIHNlbGYuZmlsZWxpc3QgPSBtbS5maWxlbGlzdAoKICAgIGRlZiBjaGVja19icm9rZW5fZWdnX2luZm8oc2VsZik6CiAgICAgICAgYmVpID0gc2VsZi5lZ2dfbmFtZSArICcuZWdnLWluZm8nCiAgICAgICAgaWYgc2VsZi5lZ2dfYmFzZSAhPSBvcy5jdXJkaXI6CiAgICAgICAgICAgIGJlaSA9IG9zLnBhdGguam9pbihzZWxmLmVnZ19iYXNlLCBiZWkpCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoYmVpKToKICAgICAgICAgICAgbG9nLndhcm4oCiAgICAgICAgICAgICAgICAiLSIgKiA3OCArICdcbicKICAgICAgICAgICAgICAgICJOb3RlOiBZb3VyIGN1cnJlbnQgLmVnZy1pbmZvIGRpcmVjdG9yeSBoYXMgYSAnLScgaW4gaXRzIG5hbWU7IgogICAgICAgICAgICAgICAgJ1xudGhpcyB3aWxsIG5vdCB3b3JrIGNvcnJlY3RseSB3aXRoICJzZXR1cC5weSBkZXZlbG9wIi5cblxuJwogICAgICAgICAgICAgICAgJ1BsZWFzZSByZW5hbWUgJXMgdG8gJXMgdG8gY29ycmVjdCB0aGlzIHByb2JsZW0uXG4nICsgJy0nICogNzgsCiAgICAgICAgICAgICAgICBiZWksIHNlbGYuZWdnX2luZm8KICAgICAgICAgICAgKQogICAgICAgICAgICBzZWxmLmJyb2tlbl9lZ2dfaW5mbyA9IHNlbGYuZWdnX2luZm8KICAgICAgICAgICAgc2VsZi5lZ2dfaW5mbyA9IGJlaSAgIyBtYWtlIGl0IHdvcmsgZm9yIG5vdwoKCmNsYXNzIEZpbGVMaXN0KF9GaWxlTGlzdCk6CiAgICAjIEltcGxlbWVudGF0aW9ucyBvZiB0aGUgdmFyaW91cyBNQU5JRkVTVC5pbiBjb21tYW5kcwoKICAgIGRlZiBwcm9jZXNzX3RlbXBsYXRlX2xpbmUoc2VsZiwgbGluZSk6CiAgICAgICAgIyBQYXJzZSB0aGUgbGluZTogc3BsaXQgaXQgdXAsIG1ha2Ugc3VyZSB0aGUgcmlnaHQgbnVtYmVyIG9mIHdvcmRzCiAgICAgICAgIyBpcyB0aGVyZSwgYW5kIHJldHVybiB0aGUgcmVsZXZhbnQgd29yZHMuICAnYWN0aW9uJyBpcyBhbHdheXMKICAgICAgICAjIGRlZmluZWQ6IGl0J3MgdGhlIGZpcnN0IHdvcmQgb2YgdGhlIGxpbmUuICBXaGljaCBvZiB0aGUgb3RoZXIKICAgICAgICAjIHRocmVlIGFyZSBkZWZpbmVkIGRlcGVuZHMgb24gdGhlIGFjdGlvbjsgaXQnbGwgYmUgZWl0aGVyCiAgICAgICAgIyBwYXR0ZXJucywgKGRpciBhbmQgcGF0dGVybnMpLCBvciAoZGlyX3BhdHRlcm4pLgogICAgICAgIChhY3Rpb24sIHBhdHRlcm5zLCBkaXIsIGRpcl9wYXR0ZXJuKSA9IHNlbGYuX3BhcnNlX3RlbXBsYXRlX2xpbmUobGluZSkKCiAgICAgICAgIyBPSywgbm93IHdlIGtub3cgdGhhdCB0aGUgYWN0aW9uIGlzIHZhbGlkIGFuZCB3ZSBoYXZlIHRoZQogICAgICAgICMgcmlnaHQgbnVtYmVyIG9mIHdvcmRzIG9uIHRoZSBsaW5lIGZvciB0aGF0IGFjdGlvbiAtLSBzbyB3ZQogICAgICAgICMgY2FuIHByb2NlZWQgd2l0aCBtaW5pbWFsIGVycm9yLWNoZWNraW5nLgogICAgICAgIGlmIGFjdGlvbiA9PSAnaW5jbHVkZSc6CiAgICAgICAgICAgIHNlbGYuZGVidWdfcHJpbnQoImluY2x1ZGUgIiArICcgJy5qb2luKHBhdHRlcm5zKSkKICAgICAgICAgICAgZm9yIHBhdHRlcm4gaW4gcGF0dGVybnM6CiAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5pbmNsdWRlKHBhdHRlcm4pOgogICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCJ3YXJuaW5nOiBubyBmaWxlcyBmb3VuZCBtYXRjaGluZyAnJXMnIiwgcGF0dGVybikKCiAgICAgICAgZWxpZiBhY3Rpb24gPT0gJ2V4Y2x1ZGUnOgogICAgICAgICAgICBzZWxmLmRlYnVnX3ByaW50KCJleGNsdWRlICIgKyAnICcuam9pbihwYXR0ZXJucykpCiAgICAgICAgICAgIGZvciBwYXR0ZXJuIGluIHBhdHRlcm5zOgogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuZXhjbHVkZShwYXR0ZXJuKToKICAgICAgICAgICAgICAgICAgICBsb2cud2FybigoIndhcm5pbmc6IG5vIHByZXZpb3VzbHktaW5jbHVkZWQgZmlsZXMgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm91bmQgbWF0Y2hpbmcgJyVzJyIpLCBwYXR0ZXJuKQoKICAgICAgICBlbGlmIGFjdGlvbiA9PSAnZ2xvYmFsLWluY2x1ZGUnOgogICAgICAgICAgICBzZWxmLmRlYnVnX3ByaW50KCJnbG9iYWwtaW5jbHVkZSAiICsgJyAnLmpvaW4ocGF0dGVybnMpKQogICAgICAgICAgICBmb3IgcGF0dGVybiBpbiBwYXR0ZXJuczoKICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmdsb2JhbF9pbmNsdWRlKHBhdHRlcm4pOgogICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCgid2FybmluZzogbm8gZmlsZXMgZm91bmQgbWF0Y2hpbmcgJyVzJyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbnl3aGVyZSBpbiBkaXN0cmlidXRpb24iKSwgcGF0dGVybikKCiAgICAgICAgZWxpZiBhY3Rpb24gPT0gJ2dsb2JhbC1leGNsdWRlJzoKICAgICAgICAgICAgc2VsZi5kZWJ1Z19wcmludCgiZ2xvYmFsLWV4Y2x1ZGUgIiArICcgJy5qb2luKHBhdHRlcm5zKSkKICAgICAgICAgICAgZm9yIHBhdHRlcm4gaW4gcGF0dGVybnM6CiAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5nbG9iYWxfZXhjbHVkZShwYXR0ZXJuKToKICAgICAgICAgICAgICAgICAgICBsb2cud2FybigoIndhcm5pbmc6IG5vIHByZXZpb3VzbHktaW5jbHVkZWQgZmlsZXMgbWF0Y2hpbmcgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyVzJyBmb3VuZCBhbnl3aGVyZSBpbiBkaXN0cmlidXRpb24iKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuKQoKICAgICAgICBlbGlmIGFjdGlvbiA9PSAncmVjdXJzaXZlLWluY2x1ZGUnOgogICAgICAgICAgICBzZWxmLmRlYnVnX3ByaW50KCJyZWN1cnNpdmUtaW5jbHVkZSAlcyAlcyIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkaXIsICcgJy5qb2luKHBhdHRlcm5zKSkpCiAgICAgICAgICAgIGZvciBwYXR0ZXJuIGluIHBhdHRlcm5zOgogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYucmVjdXJzaXZlX2luY2x1ZGUoZGlyLCBwYXR0ZXJuKToKICAgICAgICAgICAgICAgICAgICBsb2cud2FybigoIndhcm5pbmc6IG5vIGZpbGVzIGZvdW5kIG1hdGNoaW5nICclcycgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5kZXIgZGlyZWN0b3J5ICclcyciKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuLCBkaXIpCgogICAgICAgIGVsaWYgYWN0aW9uID09ICdyZWN1cnNpdmUtZXhjbHVkZSc6CiAgICAgICAgICAgIHNlbGYuZGVidWdfcHJpbnQoInJlY3Vyc2l2ZS1leGNsdWRlICVzICVzIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRpciwgJyAnLmpvaW4ocGF0dGVybnMpKSkKICAgICAgICAgICAgZm9yIHBhdHRlcm4gaW4gcGF0dGVybnM6CiAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5yZWN1cnNpdmVfZXhjbHVkZShkaXIsIHBhdHRlcm4pOgogICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCgid2FybmluZzogbm8gcHJldmlvdXNseS1pbmNsdWRlZCBmaWxlcyBtYXRjaGluZyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInJXMnIGZvdW5kIHVuZGVyIGRpcmVjdG9yeSAnJXMnIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiwgZGlyKQoKICAgICAgICBlbGlmIGFjdGlvbiA9PSAnZ3JhZnQnOgogICAgICAgICAgICBzZWxmLmRlYnVnX3ByaW50KCJncmFmdCAiICsgZGlyX3BhdHRlcm4pCiAgICAgICAgICAgIGlmIG5vdCBzZWxmLmdyYWZ0KGRpcl9wYXR0ZXJuKToKICAgICAgICAgICAgICAgIGxvZy53YXJuKCJ3YXJuaW5nOiBubyBkaXJlY3RvcmllcyBmb3VuZCBtYXRjaGluZyAnJXMnIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGRpcl9wYXR0ZXJuKQoKICAgICAgICBlbGlmIGFjdGlvbiA9PSAncHJ1bmUnOgogICAgICAgICAgICBzZWxmLmRlYnVnX3ByaW50KCJwcnVuZSAiICsgZGlyX3BhdHRlcm4pCiAgICAgICAgICAgIGlmIG5vdCBzZWxmLnBydW5lKGRpcl9wYXR0ZXJuKToKICAgICAgICAgICAgICAgIGxvZy53YXJuKCgibm8gcHJldmlvdXNseS1pbmNsdWRlZCBkaXJlY3RvcmllcyBmb3VuZCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hdGNoaW5nICclcyciKSwgZGlyX3BhdHRlcm4pCgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0ludGVybmFsRXJyb3IoCiAgICAgICAgICAgICAgICAidGhpcyBjYW5ub3QgaGFwcGVuOiBpbnZhbGlkIGFjdGlvbiAnJXMnIiAlIGFjdGlvbikKCiAgICBkZWYgX3JlbW92ZV9maWxlcyhzZWxmLCBwcmVkaWNhdGUpOgogICAgICAgICIiIgogICAgICAgIFJlbW92ZSBhbGwgZmlsZXMgZnJvbSB0aGUgZmlsZSBsaXN0IHRoYXQgbWF0Y2ggdGhlIHByZWRpY2F0ZS4KICAgICAgICBSZXR1cm4gVHJ1ZSBpZiBhbnkgbWF0Y2hpbmcgZmlsZXMgd2VyZSByZW1vdmVkCiAgICAgICAgIiIiCiAgICAgICAgZm91bmQgPSBGYWxzZQogICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzZWxmLmZpbGVzKSAtIDEsIC0xLCAtMSk6CiAgICAgICAgICAgIGlmIHByZWRpY2F0ZShzZWxmLmZpbGVzW2ldKToKICAgICAgICAgICAgICAgIHNlbGYuZGVidWdfcHJpbnQoIiByZW1vdmluZyAiICsgc2VsZi5maWxlc1tpXSkKICAgICAgICAgICAgICAgIGRlbCBzZWxmLmZpbGVzW2ldCiAgICAgICAgICAgICAgICBmb3VuZCA9IFRydWUKICAgICAgICByZXR1cm4gZm91bmQKCiAgICBkZWYgaW5jbHVkZShzZWxmLCBwYXR0ZXJuKToKICAgICAgICAiIiJJbmNsdWRlIGZpbGVzIHRoYXQgbWF0Y2ggJ3BhdHRlcm4nLiIiIgogICAgICAgIGZvdW5kID0gW2YgZm9yIGYgaW4gZ2xvYihwYXR0ZXJuKSBpZiBub3Qgb3MucGF0aC5pc2RpcihmKV0KICAgICAgICBzZWxmLmV4dGVuZChmb3VuZCkKICAgICAgICByZXR1cm4gYm9vbChmb3VuZCkKCiAgICBkZWYgZXhjbHVkZShzZWxmLCBwYXR0ZXJuKToKICAgICAgICAiIiJFeGNsdWRlIGZpbGVzIHRoYXQgbWF0Y2ggJ3BhdHRlcm4nLiIiIgogICAgICAgIG1hdGNoID0gdHJhbnNsYXRlX3BhdHRlcm4ocGF0dGVybikKICAgICAgICByZXR1cm4gc2VsZi5fcmVtb3ZlX2ZpbGVzKG1hdGNoLm1hdGNoKQoKICAgIGRlZiByZWN1cnNpdmVfaW5jbHVkZShzZWxmLCBkaXIsIHBhdHRlcm4pOgogICAgICAgICIiIgogICAgICAgIEluY2x1ZGUgYWxsIGZpbGVzIGFueXdoZXJlIGluICdkaXIvJyB0aGF0IG1hdGNoIHRoZSBwYXR0ZXJuLgogICAgICAgICIiIgogICAgICAgIGZ1bGxfcGF0dGVybiA9IG9zLnBhdGguam9pbihkaXIsICcqKicsIHBhdHRlcm4pCiAgICAgICAgZm91bmQgPSBbZiBmb3IgZiBpbiBnbG9iKGZ1bGxfcGF0dGVybiwgcmVjdXJzaXZlPVRydWUpCiAgICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguaXNkaXIoZildCiAgICAgICAgc2VsZi5leHRlbmQoZm91bmQpCiAgICAgICAgcmV0dXJuIGJvb2woZm91bmQpCgogICAgZGVmIHJlY3Vyc2l2ZV9leGNsdWRlKHNlbGYsIGRpciwgcGF0dGVybik6CiAgICAgICAgIiIiCiAgICAgICAgRXhjbHVkZSBhbnkgZmlsZSBhbnl3aGVyZSBpbiAnZGlyLycgdGhhdCBtYXRjaCB0aGUgcGF0dGVybi4KICAgICAgICAiIiIKICAgICAgICBtYXRjaCA9IHRyYW5zbGF0ZV9wYXR0ZXJuKG9zLnBhdGguam9pbihkaXIsICcqKicsIHBhdHRlcm4pKQogICAgICAgIHJldHVybiBzZWxmLl9yZW1vdmVfZmlsZXMobWF0Y2gubWF0Y2gpCgogICAgZGVmIGdyYWZ0KHNlbGYsIGRpcik6CiAgICAgICAgIiIiSW5jbHVkZSBhbGwgZmlsZXMgZnJvbSAnZGlyLycuIiIiCiAgICAgICAgZm91bmQgPSBbCiAgICAgICAgICAgIGl0ZW0KICAgICAgICAgICAgZm9yIG1hdGNoX2RpciBpbiBnbG9iKGRpcikKICAgICAgICAgICAgZm9yIGl0ZW0gaW4gZGlzdHV0aWxzLmZpbGVsaXN0LmZpbmRhbGwobWF0Y2hfZGlyKQogICAgICAgIF0KICAgICAgICBzZWxmLmV4dGVuZChmb3VuZCkKICAgICAgICByZXR1cm4gYm9vbChmb3VuZCkKCiAgICBkZWYgcHJ1bmUoc2VsZiwgZGlyKToKICAgICAgICAiIiJGaWx0ZXIgb3V0IGZpbGVzIGZyb20gJ2Rpci8nLiIiIgogICAgICAgIG1hdGNoID0gdHJhbnNsYXRlX3BhdHRlcm4ob3MucGF0aC5qb2luKGRpciwgJyoqJykpCiAgICAgICAgcmV0dXJuIHNlbGYuX3JlbW92ZV9maWxlcyhtYXRjaC5tYXRjaCkKCiAgICBkZWYgZ2xvYmFsX2luY2x1ZGUoc2VsZiwgcGF0dGVybik6CiAgICAgICAgIiIiCiAgICAgICAgSW5jbHVkZSBhbGwgZmlsZXMgYW55d2hlcmUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHRoYXQgbWF0Y2ggdGhlCiAgICAgICAgcGF0dGVybi4gVGhpcyBpcyB2ZXJ5IGluZWZmaWNpZW50IG9uIGxhcmdlIGZpbGUgdHJlZXMuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5hbGxmaWxlcyBpcyBOb25lOgogICAgICAgICAgICBzZWxmLmZpbmRhbGwoKQogICAgICAgIG1hdGNoID0gdHJhbnNsYXRlX3BhdHRlcm4ob3MucGF0aC5qb2luKCcqKicsIHBhdHRlcm4pKQogICAgICAgIGZvdW5kID0gW2YgZm9yIGYgaW4gc2VsZi5hbGxmaWxlcyBpZiBtYXRjaC5tYXRjaChmKV0KICAgICAgICBzZWxmLmV4dGVuZChmb3VuZCkKICAgICAgICByZXR1cm4gYm9vbChmb3VuZCkKCiAgICBkZWYgZ2xvYmFsX2V4Y2x1ZGUoc2VsZiwgcGF0dGVybik6CiAgICAgICAgIiIiCiAgICAgICAgRXhjbHVkZSBhbGwgZmlsZXMgYW55d2hlcmUgdGhhdCBtYXRjaCB0aGUgcGF0dGVybi4KICAgICAgICAiIiIKICAgICAgICBtYXRjaCA9IHRyYW5zbGF0ZV9wYXR0ZXJuKG9zLnBhdGguam9pbignKionLCBwYXR0ZXJuKSkKICAgICAgICByZXR1cm4gc2VsZi5fcmVtb3ZlX2ZpbGVzKG1hdGNoLm1hdGNoKQoKICAgIGRlZiBhcHBlbmQoc2VsZiwgaXRlbSk6CiAgICAgICAgaWYgaXRlbS5lbmRzd2l0aCgnXHInKTogICMgRml4IG9sZGVyIHNkaXN0cyBidWlsdCBvbiBXaW5kb3dzCiAgICAgICAgICAgIGl0ZW0gPSBpdGVtWzotMV0KICAgICAgICBwYXRoID0gY29udmVydF9wYXRoKGl0ZW0pCgogICAgICAgIGlmIHNlbGYuX3NhZmVfcGF0aChwYXRoKToKICAgICAgICAgICAgc2VsZi5maWxlcy5hcHBlbmQocGF0aCkKCiAgICBkZWYgZXh0ZW5kKHNlbGYsIHBhdGhzKToKICAgICAgICBzZWxmLmZpbGVzLmV4dGVuZChmaWx0ZXIoc2VsZi5fc2FmZV9wYXRoLCBwYXRocykpCgogICAgZGVmIF9yZXBhaXIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmVwbGFjZSBzZWxmLmZpbGVzIHdpdGggb25seSBzYWZlIHBhdGhzCgogICAgICAgIEJlY2F1c2Ugc29tZSBvd25lcnMgb2YgRmlsZUxpc3QgbWFuaXB1bGF0ZSB0aGUgdW5kZXJseWluZwogICAgICAgIGBgZmlsZXNgYCBhdHRyaWJ1dGUgZGlyZWN0bHksIHRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIHRvCiAgICAgICAgcmVwYWlyIHRob3NlIHBhdGhzLgogICAgICAgICIiIgogICAgICAgIHNlbGYuZmlsZXMgPSBsaXN0KGZpbHRlcihzZWxmLl9zYWZlX3BhdGgsIHNlbGYuZmlsZXMpKQoKICAgIGRlZiBfc2FmZV9wYXRoKHNlbGYsIHBhdGgpOgogICAgICAgIGVuY193YXJuID0gIiclcycgbm90ICVzIGVuY29kYWJsZSAtLSBza2lwcGluZyIKCiAgICAgICAgIyBUbyBhdm9pZCBhY2NpZGVudGFsIHRyYW5zLWNvZGluZ3MgZXJyb3JzLCBmaXJzdCB0byB1bmljb2RlCiAgICAgICAgdV9wYXRoID0gdW5pY29kZV91dGlscy5maWxlc3lzX2RlY29kZShwYXRoKQogICAgICAgIGlmIHVfcGF0aCBpcyBOb25lOgogICAgICAgICAgICBsb2cud2FybigiJyVzJyBpbiB1bmV4cGVjdGVkIGVuY29kaW5nIC0tIHNraXBwaW5nIiAlIHBhdGgpCiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAjIE11c3QgZW5zdXJlIHV0Zi04IGVuY29kYWJpbGl0eQogICAgICAgIHV0ZjhfcGF0aCA9IHVuaWNvZGVfdXRpbHMudHJ5X2VuY29kZSh1X3BhdGgsICJ1dGYtOCIpCiAgICAgICAgaWYgdXRmOF9wYXRoIGlzIE5vbmU6CiAgICAgICAgICAgIGxvZy53YXJuKGVuY193YXJuLCBwYXRoLCAndXRmLTgnKQogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgdHJ5OgogICAgICAgICAgICAjIGFjY2VwdCBpcyBlaXRoZXIgd2F5IGNoZWNrcyBvdXQKICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHModV9wYXRoKSBvciBvcy5wYXRoLmV4aXN0cyh1dGY4X3BhdGgpOgogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICAjIHRoaXMgd2lsbCBjYXRjaCBhbnkgZW5jb2RlIGVycm9ycyBkZWNvZGluZyB1X3BhdGgKICAgICAgICBleGNlcHQgVW5pY29kZUVuY29kZUVycm9yOgogICAgICAgICAgICBsb2cud2FybihlbmNfd2FybiwgcGF0aCwgc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpKQoKCmNsYXNzIG1hbmlmZXN0X21ha2VyKHNkaXN0KToKICAgIHRlbXBsYXRlID0gIk1BTklGRVNULmluIgoKICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgc2VsZi51c2VfZGVmYXVsdHMgPSAxCiAgICAgICAgc2VsZi5wcnVuZSA9IDEKICAgICAgICBzZWxmLm1hbmlmZXN0X29ubHkgPSAxCiAgICAgICAgc2VsZi5mb3JjZV9tYW5pZmVzdCA9IDEKCiAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBwYXNzCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICBzZWxmLmZpbGVsaXN0ID0gRmlsZUxpc3QoKQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLm1hbmlmZXN0KToKICAgICAgICAgICAgc2VsZi53cml0ZV9tYW5pZmVzdCgpICAjIGl0IG11c3QgZXhpc3Qgc28gaXQnbGwgZ2V0IGluIHRoZSBsaXN0CiAgICAgICAgc2VsZi5hZGRfZGVmYXVsdHMoKQogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHNlbGYudGVtcGxhdGUpOgogICAgICAgICAgICBzZWxmLnJlYWRfdGVtcGxhdGUoKQogICAgICAgIHNlbGYucHJ1bmVfZmlsZV9saXN0KCkKICAgICAgICBzZWxmLmZpbGVsaXN0LnNvcnQoKQogICAgICAgIHNlbGYuZmlsZWxpc3QucmVtb3ZlX2R1cGxpY2F0ZXMoKQogICAgICAgIHNlbGYud3JpdGVfbWFuaWZlc3QoKQoKICAgIGRlZiBfbWFuaWZlc3Rfbm9ybWFsaXplKHNlbGYsIHBhdGgpOgogICAgICAgIHBhdGggPSB1bmljb2RlX3V0aWxzLmZpbGVzeXNfZGVjb2RlKHBhdGgpCiAgICAgICAgcmV0dXJuIHBhdGgucmVwbGFjZShvcy5zZXAsICcvJykKCiAgICBkZWYgd3JpdGVfbWFuaWZlc3Qoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgV3JpdGUgdGhlIGZpbGUgbGlzdCBpbiAnc2VsZi5maWxlbGlzdCcgdG8gdGhlIG1hbmlmZXN0IGZpbGUKICAgICAgICBuYW1lZCBieSAnc2VsZi5tYW5pZmVzdCcuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5maWxlbGlzdC5fcmVwYWlyKCkKCiAgICAgICAgIyBOb3cgX3JlcGFpcnMgc2hvdWxkIGVuY29kYWJpbGl0eSwgYnV0IG5vdCB1bmljb2RlCiAgICAgICAgZmlsZXMgPSBbc2VsZi5fbWFuaWZlc3Rfbm9ybWFsaXplKGYpIGZvciBmIGluIHNlbGYuZmlsZWxpc3QuZmlsZXNdCiAgICAgICAgbXNnID0gIndyaXRpbmcgbWFuaWZlc3QgZmlsZSAnJXMnIiAlIHNlbGYubWFuaWZlc3QKICAgICAgICBzZWxmLmV4ZWN1dGUod3JpdGVfZmlsZSwgKHNlbGYubWFuaWZlc3QsIGZpbGVzKSwgbXNnKQoKICAgIGRlZiB3YXJuKHNlbGYsIG1zZyk6CiAgICAgICAgaWYgbm90IHNlbGYuX3Nob3VsZF9zdXBwcmVzc193YXJuaW5nKG1zZyk6CiAgICAgICAgICAgIHNkaXN0Lndhcm4oc2VsZiwgbXNnKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfc2hvdWxkX3N1cHByZXNzX3dhcm5pbmcobXNnKToKICAgICAgICAiIiIKICAgICAgICBzdXBwcmVzcyBtaXNzaW5nLWZpbGUgd2FybmluZ3MgZnJvbSBzZGlzdAogICAgICAgICIiIgogICAgICAgIHJldHVybiByZS5tYXRjaChyInN0YW5kYXJkIGZpbGUgLipub3QgZm91bmQiLCBtc2cpCgogICAgZGVmIGFkZF9kZWZhdWx0cyhzZWxmKToKICAgICAgICBzZGlzdC5hZGRfZGVmYXVsdHMoc2VsZikKICAgICAgICBzZWxmLmNoZWNrX2xpY2Vuc2UoKQogICAgICAgIHNlbGYuZmlsZWxpc3QuYXBwZW5kKHNlbGYudGVtcGxhdGUpCiAgICAgICAgc2VsZi5maWxlbGlzdC5hcHBlbmQoc2VsZi5tYW5pZmVzdCkKICAgICAgICByY2ZpbGVzID0gbGlzdCh3YWxrX3JldmN0cmwoKSkKICAgICAgICBpZiByY2ZpbGVzOgogICAgICAgICAgICBzZWxmLmZpbGVsaXN0LmV4dGVuZChyY2ZpbGVzKQogICAgICAgIGVsaWYgb3MucGF0aC5leGlzdHMoc2VsZi5tYW5pZmVzdCk6CiAgICAgICAgICAgIHNlbGYucmVhZF9tYW5pZmVzdCgpCgogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKCJzZXR1cC5weSIpOgogICAgICAgICAgICAjIHNldHVwLnB5IHNob3VsZCBiZSBpbmNsdWRlZCBieSBkZWZhdWx0LCBldmVuIGlmIGl0J3Mgbm90CiAgICAgICAgICAgICMgdGhlIHNjcmlwdCBjYWxsZWQgdG8gY3JlYXRlIHRoZSBzZGlzdAogICAgICAgICAgICBzZWxmLmZpbGVsaXN0LmFwcGVuZCgic2V0dXAucHkiKQoKICAgICAgICBlaV9jbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnZWdnX2luZm8nKQogICAgICAgIHNlbGYuZmlsZWxpc3QuZ3JhZnQoZWlfY21kLmVnZ19pbmZvKQoKICAgIGRlZiBwcnVuZV9maWxlX2xpc3Qoc2VsZik6CiAgICAgICAgYnVpbGQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGQnKQogICAgICAgIGJhc2VfZGlyID0gc2VsZi5kaXN0cmlidXRpb24uZ2V0X2Z1bGxuYW1lKCkKICAgICAgICBzZWxmLmZpbGVsaXN0LnBydW5lKGJ1aWxkLmJ1aWxkX2Jhc2UpCiAgICAgICAgc2VsZi5maWxlbGlzdC5wcnVuZShiYXNlX2RpcikKICAgICAgICBzZXAgPSByZS5lc2NhcGUob3Muc2VwKQogICAgICAgIHNlbGYuZmlsZWxpc3QuZXhjbHVkZV9wYXR0ZXJuKHInKF58JyArIHNlcCArIHInKShSQ1N8Q1ZTfFwuc3ZuKScgKyBzZXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfcmVnZXg9MSkKCgpkZWYgd3JpdGVfZmlsZShmaWxlbmFtZSwgY29udGVudHMpOgogICAgIiIiQ3JlYXRlIGEgZmlsZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgd3JpdGUgJ2NvbnRlbnRzJyAoYQogICAgc2VxdWVuY2Ugb2Ygc3RyaW5ncyB3aXRob3V0IGxpbmUgdGVybWluYXRvcnMpIHRvIGl0LgogICAgIiIiCiAgICBjb250ZW50cyA9ICJcbiIuam9pbihjb250ZW50cykKCiAgICAjIGFzc3VtaW5nIHRoZSBjb250ZW50cyBoYXMgYmVlbiB2ZXR0ZWQgZm9yIHV0Zi04IGVuY29kaW5nCiAgICBjb250ZW50cyA9IGNvbnRlbnRzLmVuY29kZSgidXRmLTgiKQoKICAgIHdpdGggb3BlbihmaWxlbmFtZSwgIndiIikgYXMgZjogICMgYWx3YXlzIHdyaXRlIFBPU0lYLXN0eWxlIG1hbmlmZXN0CiAgICAgICAgZi53cml0ZShjb250ZW50cykKCgpkZWYgd3JpdGVfcGtnX2luZm8oY21kLCBiYXNlbmFtZSwgZmlsZW5hbWUpOgogICAgbG9nLmluZm8oIndyaXRpbmcgJXMiLCBmaWxlbmFtZSkKICAgIGlmIG5vdCBjbWQuZHJ5X3J1bjoKICAgICAgICBtZXRhZGF0YSA9IGNtZC5kaXN0cmlidXRpb24ubWV0YWRhdGEKICAgICAgICBtZXRhZGF0YS52ZXJzaW9uLCBvbGR2ZXIgPSBjbWQuZWdnX3ZlcnNpb24sIG1ldGFkYXRhLnZlcnNpb24KICAgICAgICBtZXRhZGF0YS5uYW1lLCBvbGRuYW1lID0gY21kLmVnZ19uYW1lLCBtZXRhZGF0YS5uYW1lCgogICAgICAgIHRyeToKICAgICAgICAgICAgIyB3cml0ZSB1bmVzY2FwZWQgZGF0YSB0byBQS0ctSU5GTywgc28gb2xkZXIgcGtnX3Jlc291cmNlcwogICAgICAgICAgICAjIGNhbiBzdGlsbCBwYXJzZSBpdAogICAgICAgICAgICBtZXRhZGF0YS53cml0ZV9wa2dfaW5mbyhjbWQuZWdnX2luZm8pCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgbWV0YWRhdGEubmFtZSwgbWV0YWRhdGEudmVyc2lvbiA9IG9sZG5hbWUsIG9sZHZlcgoKICAgICAgICBzYWZlID0gZ2V0YXR0cihjbWQuZGlzdHJpYnV0aW9uLCAnemlwX3NhZmUnLCBOb25lKQoKICAgICAgICBiZGlzdF9lZ2cud3JpdGVfc2FmZXR5X2ZsYWcoY21kLmVnZ19pbmZvLCBzYWZlKQoKCmRlZiB3YXJuX2RlcGVuZHNfb2Jzb2xldGUoY21kLCBiYXNlbmFtZSwgZmlsZW5hbWUpOgogICAgaWYgb3MucGF0aC5leGlzdHMoZmlsZW5hbWUpOgogICAgICAgIGxvZy53YXJuKAogICAgICAgICAgICAiV0FSTklORzogJ2RlcGVuZHMudHh0JyBpcyBub3QgdXNlZCBieSBzZXR1cHRvb2xzIDAuNiFcbiIKICAgICAgICAgICAgIlVzZSB0aGUgaW5zdGFsbF9yZXF1aXJlcy9leHRyYXNfcmVxdWlyZSBzZXR1cCgpIGFyZ3MgaW5zdGVhZC4iCiAgICAgICAgKQoKCmRlZiBfd3JpdGVfcmVxdWlyZW1lbnRzKHN0cmVhbSwgcmVxcyk6CiAgICBsaW5lcyA9IHlpZWxkX2xpbmVzKHJlcXMgb3IgKCkpCiAgICBhcHBlbmRfY3IgPSBsYW1iZGEgbGluZTogbGluZSArICdcbicKICAgIGxpbmVzID0gbWFwKGFwcGVuZF9jciwgbGluZXMpCiAgICBzdHJlYW0ud3JpdGVsaW5lcyhsaW5lcykKCgpkZWYgd3JpdGVfcmVxdWlyZW1lbnRzKGNtZCwgYmFzZW5hbWUsIGZpbGVuYW1lKToKICAgIGRpc3QgPSBjbWQuZGlzdHJpYnV0aW9uCiAgICBkYXRhID0gc2l4LlN0cmluZ0lPKCkKICAgIF93cml0ZV9yZXF1aXJlbWVudHMoZGF0YSwgZGlzdC5pbnN0YWxsX3JlcXVpcmVzKQogICAgZXh0cmFzX3JlcXVpcmUgPSBkaXN0LmV4dHJhc19yZXF1aXJlIG9yIHt9CiAgICBmb3IgZXh0cmEgaW4gc29ydGVkKGV4dHJhc19yZXF1aXJlKToKICAgICAgICBkYXRhLndyaXRlKCdcblt7ZXh0cmF9XVxuJy5mb3JtYXQoKip2YXJzKCkpKQogICAgICAgIF93cml0ZV9yZXF1aXJlbWVudHMoZGF0YSwgZXh0cmFzX3JlcXVpcmVbZXh0cmFdKQogICAgY21kLndyaXRlX29yX2RlbGV0ZV9maWxlKCJyZXF1aXJlbWVudHMiLCBmaWxlbmFtZSwgZGF0YS5nZXR2YWx1ZSgpKQoKCmRlZiB3cml0ZV9zZXR1cF9yZXF1aXJlbWVudHMoY21kLCBiYXNlbmFtZSwgZmlsZW5hbWUpOgogICAgZGF0YSA9IGlvLlN0cmluZ0lPKCkKICAgIF93cml0ZV9yZXF1aXJlbWVudHMoZGF0YSwgY21kLmRpc3RyaWJ1dGlvbi5zZXR1cF9yZXF1aXJlcykKICAgIGNtZC53cml0ZV9vcl9kZWxldGVfZmlsZSgic2V0dXAtcmVxdWlyZW1lbnRzIiwgZmlsZW5hbWUsIGRhdGEuZ2V0dmFsdWUoKSkKCgpkZWYgd3JpdGVfdG9wbGV2ZWxfbmFtZXMoY21kLCBiYXNlbmFtZSwgZmlsZW5hbWUpOgogICAgcGtncyA9IGRpY3QuZnJvbWtleXMoCiAgICAgICAgWwogICAgICAgICAgICBrLnNwbGl0KCcuJywgMSlbMF0KICAgICAgICAgICAgZm9yIGsgaW4gY21kLmRpc3RyaWJ1dGlvbi5pdGVyX2Rpc3RyaWJ1dGlvbl9uYW1lcygpCiAgICAgICAgXQogICAgKQogICAgY21kLndyaXRlX2ZpbGUoInRvcC1sZXZlbCBuYW1lcyIsIGZpbGVuYW1lLCAnXG4nLmpvaW4oc29ydGVkKHBrZ3MpKSArICdcbicpCgoKZGVmIG92ZXJ3cml0ZV9hcmcoY21kLCBiYXNlbmFtZSwgZmlsZW5hbWUpOgogICAgd3JpdGVfYXJnKGNtZCwgYmFzZW5hbWUsIGZpbGVuYW1lLCBUcnVlKQoKCmRlZiB3cml0ZV9hcmcoY21kLCBiYXNlbmFtZSwgZmlsZW5hbWUsIGZvcmNlPUZhbHNlKToKICAgIGFyZ25hbWUgPSBvcy5wYXRoLnNwbGl0ZXh0KGJhc2VuYW1lKVswXQogICAgdmFsdWUgPSBnZXRhdHRyKGNtZC5kaXN0cmlidXRpb24sIGFyZ25hbWUsIE5vbmUpCiAgICBpZiB2YWx1ZSBpcyBub3QgTm9uZToKICAgICAgICB2YWx1ZSA9ICdcbicuam9pbih2YWx1ZSkgKyAnXG4nCiAgICBjbWQud3JpdGVfb3JfZGVsZXRlX2ZpbGUoYXJnbmFtZSwgZmlsZW5hbWUsIHZhbHVlLCBmb3JjZSkKCgpkZWYgd3JpdGVfZW50cmllcyhjbWQsIGJhc2VuYW1lLCBmaWxlbmFtZSk6CiAgICBlcCA9IGNtZC5kaXN0cmlidXRpb24uZW50cnlfcG9pbnRzCgogICAgaWYgaXNpbnN0YW5jZShlcCwgc2l4LnN0cmluZ190eXBlcykgb3IgZXAgaXMgTm9uZToKICAgICAgICBkYXRhID0gZXAKICAgIGVsaWYgZXAgaXMgbm90IE5vbmU6CiAgICAgICAgZGF0YSA9IFtdCiAgICAgICAgZm9yIHNlY3Rpb24sIGNvbnRlbnRzIGluIHNvcnRlZChlcC5pdGVtcygpKToKICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoY29udGVudHMsIHNpeC5zdHJpbmdfdHlwZXMpOgogICAgICAgICAgICAgICAgY29udGVudHMgPSBFbnRyeVBvaW50LnBhcnNlX2dyb3VwKHNlY3Rpb24sIGNvbnRlbnRzKQogICAgICAgICAgICAgICAgY29udGVudHMgPSAnXG4nLmpvaW4oc29ydGVkKG1hcChzdHIsIGNvbnRlbnRzLnZhbHVlcygpKSkpCiAgICAgICAgICAgIGRhdGEuYXBwZW5kKCdbJXNdXG4lc1xuXG4nICUgKHNlY3Rpb24sIGNvbnRlbnRzKSkKICAgICAgICBkYXRhID0gJycuam9pbihkYXRhKQoKICAgIGNtZC53cml0ZV9vcl9kZWxldGVfZmlsZSgnZW50cnkgcG9pbnRzJywgZmlsZW5hbWUsIGRhdGEsIFRydWUpCgoKZGVmIGdldF9wa2dfaW5mb19yZXZpc2lvbigpOgogICAgIiIiCiAgICBHZXQgYSAtciMjIyBvZmYgb2YgUEtHLUlORk8gVmVyc2lvbiBpbiBjYXNlIHRoaXMgaXMgYW4gc2Rpc3Qgb2YKICAgIGEgc3VidmVyc2lvbiByZXZpc2lvbi4KICAgICIiIgogICAgd2FybmluZ3Mud2FybigiZ2V0X3BrZ19pbmZvX3JldmlzaW9uIGlzIGRlcHJlY2F0ZWQuIiwgRWdnSW5mb0RlcHJlY2F0aW9uV2FybmluZykKICAgIGlmIG9zLnBhdGguZXhpc3RzKCdQS0ctSU5GTycpOgogICAgICAgIHdpdGggaW8ub3BlbignUEtHLUlORk8nKSBhcyBmOgogICAgICAgICAgICBmb3IgbGluZSBpbiBmOgogICAgICAgICAgICAgICAgbWF0Y2ggPSByZS5tYXRjaChyIlZlcnNpb246LiotcihcZCspXHMqJCIsIGxpbmUpCiAgICAgICAgICAgICAgICBpZiBtYXRjaDoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW50KG1hdGNoLmdyb3VwKDEpKQogICAgcmV0dXJuIDAKCgpjbGFzcyBFZ2dJbmZvRGVwcmVjYXRpb25XYXJuaW5nKFNldHVwdG9vbHNEZXByZWNhdGlvbldhcm5pbmcpOgogICAgIiIiQ2xhc3MgZm9yIHdhcm5pbmcgYWJvdXQgZGVwcmVjYXRpb25zIGluIGVnZ0luZm8gaW4gc2V0dXBUb29scy4gTm90IGlnbm9yZWQgYnkgZGVmYXVsdCwgdW5saWtlIERlcHJlY2F0aW9uV2FybmluZy4iIiIKUEsDBBQAAAAAAAAAIQBQYRGsYRIAAGESAABCAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvY29tbWFuZC9pbnN0YWxsLnB5ZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNBcmdFcnJvcgppbXBvcnQgaW5zcGVjdAppbXBvcnQgZ2xvYgppbXBvcnQgd2FybmluZ3MKaW1wb3J0IHBsYXRmb3JtCmltcG9ydCBkaXN0dXRpbHMuY29tbWFuZC5pbnN0YWxsIGFzIG9yaWcKCmltcG9ydCBzZXR1cHRvb2xzCgojIFByaW9yIHRvIG51bXB5IDEuOSwgTnVtUHkgcmVsaWVzIG9uIHRoZSAnX2luc3RhbGwnIG5hbWUsIHNvIHByb3ZpZGUgaXQgZm9yCiMgbm93LiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvc2V0dXB0b29scy9pc3N1ZXMvMTk5LwpfaW5zdGFsbCA9IG9yaWcuaW5zdGFsbAoKCmNsYXNzIGluc3RhbGwob3JpZy5pbnN0YWxsKToKICAgICIiIlVzZSBlYXN5X2luc3RhbGwgdG8gaW5zdGFsbCB0aGUgcGFja2FnZSwgdy9kZXBlbmRlbmNpZXMiIiIKCiAgICB1c2VyX29wdGlvbnMgPSBvcmlnLmluc3RhbGwudXNlcl9vcHRpb25zICsgWwogICAgICAgICgnb2xkLWFuZC11bm1hbmFnZWFibGUnLCBOb25lLCAiVHJ5IG5vdCB0byB1c2UgdGhpcyEiKSwKICAgICAgICAoJ3NpbmdsZS12ZXJzaW9uLWV4dGVybmFsbHktbWFuYWdlZCcsIE5vbmUsCiAgICAgICAgICJ1c2VkIGJ5IHN5c3RlbSBwYWNrYWdlIGJ1aWxkZXJzIHRvIGNyZWF0ZSAnZmxhdCcgZWdncyIpLAogICAgXQogICAgYm9vbGVhbl9vcHRpb25zID0gb3JpZy5pbnN0YWxsLmJvb2xlYW5fb3B0aW9ucyArIFsKICAgICAgICAnb2xkLWFuZC11bm1hbmFnZWFibGUnLCAnc2luZ2xlLXZlcnNpb24tZXh0ZXJuYWxseS1tYW5hZ2VkJywKICAgIF0KICAgIG5ld19jb21tYW5kcyA9IFsKICAgICAgICAoJ2luc3RhbGxfZWdnX2luZm8nLCBsYW1iZGEgc2VsZjogVHJ1ZSksCiAgICAgICAgKCdpbnN0YWxsX3NjcmlwdHMnLCBsYW1iZGEgc2VsZjogVHJ1ZSksCiAgICBdCiAgICBfbmMgPSBkaWN0KG5ld19jb21tYW5kcykKCiAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIG9yaWcuaW5zdGFsbC5pbml0aWFsaXplX29wdGlvbnMoc2VsZikKICAgICAgICBzZWxmLm9sZF9hbmRfdW5tYW5hZ2VhYmxlID0gTm9uZQogICAgICAgIHNlbGYuc2luZ2xlX3ZlcnNpb25fZXh0ZXJuYWxseV9tYW5hZ2VkID0gTm9uZQoKICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIG9yaWcuaW5zdGFsbC5maW5hbGl6ZV9vcHRpb25zKHNlbGYpCiAgICAgICAgaWYgc2VsZi5yb290OgogICAgICAgICAgICBzZWxmLnNpbmdsZV92ZXJzaW9uX2V4dGVybmFsbHlfbWFuYWdlZCA9IFRydWUKICAgICAgICBlbGlmIHNlbGYuc2luZ2xlX3ZlcnNpb25fZXh0ZXJuYWxseV9tYW5hZ2VkOgogICAgICAgICAgICBpZiBub3Qgc2VsZi5yb290IGFuZCBub3Qgc2VsZi5yZWNvcmQ6CiAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNBcmdFcnJvcigKICAgICAgICAgICAgICAgICAgICAiWW91IG11c3Qgc3BlY2lmeSAtLXJlY29yZCBvciAtLXJvb3Qgd2hlbiBidWlsZGluZyBzeXN0ZW0iCiAgICAgICAgICAgICAgICAgICAgIiBwYWNrYWdlcyIKICAgICAgICAgICAgICAgICkKCiAgICBkZWYgaGFuZGxlX2V4dHJhX3BhdGgoc2VsZik6CiAgICAgICAgaWYgc2VsZi5yb290IG9yIHNlbGYuc2luZ2xlX3ZlcnNpb25fZXh0ZXJuYWxseV9tYW5hZ2VkOgogICAgICAgICAgICAjIGV4cGxpY2l0IGJhY2t3YXJkLWNvbXBhdGliaWxpdHkgbW9kZSwgYWxsb3cgZXh0cmFfcGF0aCB0byB3b3JrCiAgICAgICAgICAgIHJldHVybiBvcmlnLmluc3RhbGwuaGFuZGxlX2V4dHJhX3BhdGgoc2VsZikKCiAgICAgICAgIyBJZ25vcmUgZXh0cmFfcGF0aCB3aGVuIGluc3RhbGxpbmcgYW4gZWdnIChvciBiZWluZyBydW4gYnkgYW5vdGhlcgogICAgICAgICMgY29tbWFuZCB3aXRob3V0IC0tcm9vdCBvciAtLXNpbmdsZS12ZXJzaW9uLWV4dGVybmFsbHktbWFuYWdlZAogICAgICAgIHNlbGYucGF0aF9maWxlID0gTm9uZQogICAgICAgIHNlbGYuZXh0cmFfZGlycyA9ICcnCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICAjIEV4cGxpY2l0IHJlcXVlc3QgZm9yIG9sZC1zdHlsZSBpbnN0YWxsPyAgSnVzdCBkbyBpdAogICAgICAgIGlmIHNlbGYub2xkX2FuZF91bm1hbmFnZWFibGUgb3Igc2VsZi5zaW5nbGVfdmVyc2lvbl9leHRlcm5hbGx5X21hbmFnZWQ6CiAgICAgICAgICAgIHJldHVybiBvcmlnLmluc3RhbGwucnVuKHNlbGYpCgogICAgICAgIGlmIG5vdCBzZWxmLl9jYWxsZWRfZnJvbV9zZXR1cChpbnNwZWN0LmN1cnJlbnRmcmFtZSgpKToKICAgICAgICAgICAgIyBSdW4gaW4gYmFja3dhcmQtY29tcGF0aWJpbGl0eSBtb2RlIHRvIHN1cHBvcnQgYmRpc3RfKiBjb21tYW5kcy4KICAgICAgICAgICAgb3JpZy5pbnN0YWxsLnJ1bihzZWxmKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuZG9fZWdnX2luc3RhbGwoKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfY2FsbGVkX2Zyb21fc2V0dXAocnVuX2ZyYW1lKToKICAgICAgICAiIiIKICAgICAgICBBdHRlbXB0IHRvIGRldGVjdCB3aGV0aGVyIHJ1bigpIHdhcyBjYWxsZWQgZnJvbSBzZXR1cCgpIG9yIGJ5IGFub3RoZXIKICAgICAgICBjb21tYW5kLiAgSWYgY2FsbGVkIGJ5IHNldHVwKCksIHRoZSBwYXJlbnQgY2FsbGVyIHdpbGwgYmUgdGhlCiAgICAgICAgJ3J1bl9jb21tYW5kJyBtZXRob2QgaW4gJ2Rpc3R1dGlscy5kaXN0JywgYW5kICppdHMqIGNhbGxlciB3aWxsIGJlCiAgICAgICAgdGhlICdydW5fY29tbWFuZHMnIG1ldGhvZC4gIElmIGNhbGxlZCBhbnkgb3RoZXIgd2F5LCB0aGUKICAgICAgICBpbW1lZGlhdGUgY2FsbGVyICptaWdodCogYmUgJ3J1bl9jb21tYW5kJywgYnV0IGl0IHdvbid0IGhhdmUgYmVlbgogICAgICAgIGNhbGxlZCBieSAncnVuX2NvbW1hbmRzJy4gUmV0dXJuIFRydWUgaW4gdGhhdCBjYXNlIG9yIGlmIGEgY2FsbCBzdGFjawogICAgICAgIGlzIHVuYXZhaWxhYmxlLiBSZXR1cm4gRmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICIiIgogICAgICAgIGlmIHJ1bl9mcmFtZSBpcyBOb25lOgogICAgICAgICAgICBtc2cgPSAiQ2FsbCBzdGFjayBub3QgYXZhaWxhYmxlLiBiZGlzdF8qIGNvbW1hbmRzIG1heSBmYWlsLiIKICAgICAgICAgICAgd2FybmluZ3Mud2Fybihtc2cpCiAgICAgICAgICAgIGlmIHBsYXRmb3JtLnB5dGhvbl9pbXBsZW1lbnRhdGlvbigpID09ICdJcm9uUHl0aG9uJzoKICAgICAgICAgICAgICAgIG1zZyA9ICJGb3IgYmVzdCByZXN1bHRzLCBwYXNzIC1YOkZyYW1lcyB0byBlbmFibGUgY2FsbCBzdGFjay4iCiAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKG1zZykKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICByZXMgPSBpbnNwZWN0LmdldG91dGVyZnJhbWVzKHJ1bl9mcmFtZSlbMl0KICAgICAgICBjYWxsZXIsID0gcmVzWzoxXQogICAgICAgIGluZm8gPSBpbnNwZWN0LmdldGZyYW1laW5mbyhjYWxsZXIpCiAgICAgICAgY2FsbGVyX21vZHVsZSA9IGNhbGxlci5mX2dsb2JhbHMuZ2V0KCdfX25hbWVfXycsICcnKQogICAgICAgIHJldHVybiAoCiAgICAgICAgICAgIGNhbGxlcl9tb2R1bGUgPT0gJ2Rpc3R1dGlscy5kaXN0JwogICAgICAgICAgICBhbmQgaW5mby5mdW5jdGlvbiA9PSAncnVuX2NvbW1hbmRzJwogICAgICAgICkKCiAgICBkZWYgZG9fZWdnX2luc3RhbGwoc2VsZik6CgogICAgICAgIGVhc3lfaW5zdGFsbCA9IHNlbGYuZGlzdHJpYnV0aW9uLmdldF9jb21tYW5kX2NsYXNzKCdlYXN5X2luc3RhbGwnKQoKICAgICAgICBjbWQgPSBlYXN5X2luc3RhbGwoCiAgICAgICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uLCBhcmdzPSJ4Iiwgcm9vdD1zZWxmLnJvb3QsIHJlY29yZD1zZWxmLnJlY29yZCwKICAgICAgICApCiAgICAgICAgY21kLmVuc3VyZV9maW5hbGl6ZWQoKSAgIyBmaW5hbGl6ZSBiZWZvcmUgYmRpc3RfZWdnIG11bmdlcyBpbnN0YWxsIGNtZAogICAgICAgIGNtZC5hbHdheXNfY29weV9mcm9tID0gJy4nICAjIG1ha2Ugc3VyZSBsb2NhbC1kaXIgZWdncyBnZXQgaW5zdGFsbGVkCgogICAgICAgICMgcGljayB1cCBzZXR1cC1kaXIgLmVnZyBmaWxlcyBvbmx5OiBubyAuZWdnLWluZm8KICAgICAgICBjbWQucGFja2FnZV9pbmRleC5zY2FuKGdsb2IuZ2xvYignKi5lZ2cnKSkKCiAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnYmRpc3RfZWdnJykKICAgICAgICBhcmdzID0gW3NlbGYuZGlzdHJpYnV0aW9uLmdldF9jb21tYW5kX29iaignYmRpc3RfZWdnJykuZWdnX291dHB1dF0KCiAgICAgICAgaWYgc2V0dXB0b29scy5ib290c3RyYXBfaW5zdGFsbF9mcm9tOgogICAgICAgICAgICAjIEJvb3RzdHJhcCBzZWxmLWluc3RhbGxhdGlvbiBvZiBzZXR1cHRvb2xzCiAgICAgICAgICAgIGFyZ3MuaW5zZXJ0KDAsIHNldHVwdG9vbHMuYm9vdHN0cmFwX2luc3RhbGxfZnJvbSkKCiAgICAgICAgY21kLmFyZ3MgPSBhcmdzCiAgICAgICAgY21kLnJ1bihzaG93X2RlcHJlY2F0aW9uPUZhbHNlKQogICAgICAgIHNldHVwdG9vbHMuYm9vdHN0cmFwX2luc3RhbGxfZnJvbSA9IE5vbmUKCgojIFhYWCBQeXRob24gMy4xIGRvZXNuJ3Qgc2VlIF9uYyBpZiB0aGlzIGlzIGluc2lkZSB0aGUgY2xhc3MKaW5zdGFsbC5zdWJfY29tbWFuZHMgPSAoCiAgICBbY21kIGZvciBjbWQgaW4gb3JpZy5pbnN0YWxsLnN1Yl9jb21tYW5kcyBpZiBjbWRbMF0gbm90IGluIGluc3RhbGwuX25jXSArCiAgICBpbnN0YWxsLm5ld19jb21tYW5kcwopClBLAwQUAAAAAAAAACEAXNKo5ZsIAACbCAAASwAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2NvbW1hbmQvaW5zdGFsbF9lZ2dfaW5mby5weWZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2csIGRpcl91dGlsCmltcG9ydCBvcwoKZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBDb21tYW5kCmZyb20gc2V0dXB0b29scyBpbXBvcnQgbmFtZXNwYWNlcwpmcm9tIHNldHVwdG9vbHMuYXJjaGl2ZV91dGlsIGltcG9ydCB1bnBhY2tfYXJjaGl2ZQppbXBvcnQgcGtnX3Jlc291cmNlcwoKCmNsYXNzIGluc3RhbGxfZWdnX2luZm8obmFtZXNwYWNlcy5JbnN0YWxsZXIsIENvbW1hbmQpOgogICAgIiIiSW5zdGFsbCBhbiAuZWdnLWluZm8gZGlyZWN0b3J5IGZvciB0aGUgcGFja2FnZSIiIgoKICAgIGRlc2NyaXB0aW9uID0gIkluc3RhbGwgYW4gLmVnZy1pbmZvIGRpcmVjdG9yeSBmb3IgdGhlIHBhY2thZ2UiCgogICAgdXNlcl9vcHRpb25zID0gWwogICAgICAgICgnaW5zdGFsbC1kaXI9JywgJ2QnLCAiZGlyZWN0b3J5IHRvIGluc3RhbGwgdG8iKSwKICAgIF0KCiAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIHNlbGYuaW5zdGFsbF9kaXIgPSBOb25lCgogICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgc2VsZi5zZXRfdW5kZWZpbmVkX29wdGlvbnMoJ2luc3RhbGxfbGliJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2luc3RhbGxfZGlyJywgJ2luc3RhbGxfZGlyJykpCiAgICAgICAgZWlfY21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoImVnZ19pbmZvIikKICAgICAgICBiYXNlbmFtZSA9IHBrZ19yZXNvdXJjZXMuRGlzdHJpYnV0aW9uKAogICAgICAgICAgICBOb25lLCBOb25lLCBlaV9jbWQuZWdnX25hbWUsIGVpX2NtZC5lZ2dfdmVyc2lvbgogICAgICAgICkuZWdnX25hbWUoKSArICcuZWdnLWluZm8nCiAgICAgICAgc2VsZi5zb3VyY2UgPSBlaV9jbWQuZWdnX2luZm8KICAgICAgICBzZWxmLnRhcmdldCA9IG9zLnBhdGguam9pbihzZWxmLmluc3RhbGxfZGlyLCBiYXNlbmFtZSkKICAgICAgICBzZWxmLm91dHB1dHMgPSBbXQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnZWdnX2luZm8nKQogICAgICAgIGlmIG9zLnBhdGguaXNkaXIoc2VsZi50YXJnZXQpIGFuZCBub3Qgb3MucGF0aC5pc2xpbmsoc2VsZi50YXJnZXQpOgogICAgICAgICAgICBkaXJfdXRpbC5yZW1vdmVfdHJlZShzZWxmLnRhcmdldCwgZHJ5X3J1bj1zZWxmLmRyeV9ydW4pCiAgICAgICAgZWxpZiBvcy5wYXRoLmV4aXN0cyhzZWxmLnRhcmdldCk6CiAgICAgICAgICAgIHNlbGYuZXhlY3V0ZShvcy51bmxpbmssIChzZWxmLnRhcmdldCwpLCAiUmVtb3ZpbmcgIiArIHNlbGYudGFyZ2V0KQogICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgIHBrZ19yZXNvdXJjZXMuZW5zdXJlX2RpcmVjdG9yeShzZWxmLnRhcmdldCkKICAgICAgICBzZWxmLmV4ZWN1dGUoCiAgICAgICAgICAgIHNlbGYuY29weXRyZWUsICgpLCAiQ29weWluZyAlcyB0byAlcyIgJSAoc2VsZi5zb3VyY2UsIHNlbGYudGFyZ2V0KQogICAgICAgICkKICAgICAgICBzZWxmLmluc3RhbGxfbmFtZXNwYWNlcygpCgogICAgZGVmIGdldF9vdXRwdXRzKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLm91dHB1dHMKCiAgICBkZWYgY29weXRyZWUoc2VsZik6CiAgICAgICAgIyBDb3B5IHRoZSAuZWdnLWluZm8gdHJlZSB0byBzaXRlLXBhY2thZ2VzCiAgICAgICAgZGVmIHNraW1tZXIoc3JjLCBkc3QpOgogICAgICAgICAgICAjIGZpbHRlciBvdXQgc291cmNlLWNvbnRyb2wgZGlyZWN0b3JpZXM7IG5vdGUgdGhhdCAnc3JjJyBpcyBhbHdheXMKICAgICAgICAgICAgIyBhICcvJy1zZXBhcmF0ZWQgcGF0aCwgcmVnYXJkbGVzcyBvZiBwbGF0Zm9ybS4gICdkc3QnIGlzIGEKICAgICAgICAgICAgIyBwbGF0Zm9ybS1zcGVjaWZpYyBwYXRoLgogICAgICAgICAgICBmb3Igc2tpcCBpbiAnLnN2bi8nLCAnQ1ZTLyc6CiAgICAgICAgICAgICAgICBpZiBzcmMuc3RhcnRzd2l0aChza2lwKSBvciAnLycgKyBza2lwIGluIHNyYzoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgICAgICBzZWxmLm91dHB1dHMuYXBwZW5kKGRzdCkKICAgICAgICAgICAgbG9nLmRlYnVnKCJDb3B5aW5nICVzIHRvICVzIiwgc3JjLCBkc3QpCiAgICAgICAgICAgIHJldHVybiBkc3QKCiAgICAgICAgdW5wYWNrX2FyY2hpdmUoc2VsZi5zb3VyY2UsIHNlbGYudGFyZ2V0LCBza2ltbWVyKQpQSwMEFAAAAAAAAAAhABLTjCoWDwAAFg8AAEYAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9jb21tYW5kL2luc3RhbGxfbGliLnB5aW1wb3J0IG9zCmltcG9ydCBzeXMKZnJvbSBpdGVydG9vbHMgaW1wb3J0IHByb2R1Y3QsIHN0YXJtYXAKaW1wb3J0IGRpc3R1dGlscy5jb21tYW5kLmluc3RhbGxfbGliIGFzIG9yaWcKCgpjbGFzcyBpbnN0YWxsX2xpYihvcmlnLmluc3RhbGxfbGliKToKICAgICIiIkRvbid0IGFkZCBjb21waWxlZCBmbGFncyB0byBmaWxlbmFtZXMgb2Ygbm9uLVB5dGhvbiBmaWxlcyIiIgoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgc2VsZi5idWlsZCgpCiAgICAgICAgb3V0ZmlsZXMgPSBzZWxmLmluc3RhbGwoKQogICAgICAgIGlmIG91dGZpbGVzIGlzIG5vdCBOb25lOgogICAgICAgICAgICAjIGFsd2F5cyBjb21waWxlLCBpbiBjYXNlIHdlIGhhdmUgYW55IGV4dGVuc2lvbiBzdHVicyB0byBkZWFsIHdpdGgKICAgICAgICAgICAgc2VsZi5ieXRlX2NvbXBpbGUob3V0ZmlsZXMpCgogICAgZGVmIGdldF9leGNsdXNpb25zKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBhIGNvbGxlY3Rpb25zLlNpemVkIGNvbGxlY3Rpb25zLkNvbnRhaW5lciBvZiBwYXRocyB0byBiZQogICAgICAgIGV4Y2x1ZGVkIGZvciBzaW5nbGVfdmVyc2lvbl9leHRlcm5hbGx5X21hbmFnZWQgaW5zdGFsbGF0aW9ucy4KICAgICAgICAiIiIKICAgICAgICBhbGxfcGFja2FnZXMgPSAoCiAgICAgICAgICAgIHBrZwogICAgICAgICAgICBmb3IgbnNfcGtnIGluIHNlbGYuX2dldF9TVkVNX05TUHMoKQogICAgICAgICAgICBmb3IgcGtnIGluIHNlbGYuX2FsbF9wYWNrYWdlcyhuc19wa2cpCiAgICAgICAgKQoKICAgICAgICBleGNsX3NwZWNzID0gcHJvZHVjdChhbGxfcGFja2FnZXMsIHNlbGYuX2dlbl9leGNsdXNpb25fcGF0aHMoKSkKICAgICAgICByZXR1cm4gc2V0KHN0YXJtYXAoc2VsZi5fZXhjbHVkZV9wa2dfcGF0aCwgZXhjbF9zcGVjcykpCgogICAgZGVmIF9leGNsdWRlX3BrZ19wYXRoKHNlbGYsIHBrZywgZXhjbHVzaW9uX3BhdGgpOgogICAgICAgICIiIgogICAgICAgIEdpdmVuIGEgcGFja2FnZSBuYW1lIGFuZCBleGNsdXNpb24gcGF0aCB3aXRoaW4gdGhhdCBwYWNrYWdlLAogICAgICAgIGNvbXB1dGUgdGhlIGZ1bGwgZXhjbHVzaW9uIHBhdGguCiAgICAgICAgIiIiCiAgICAgICAgcGFydHMgPSBwa2cuc3BsaXQoJy4nKSArIFtleGNsdXNpb25fcGF0aF0KICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKHNlbGYuaW5zdGFsbF9kaXIsICpwYXJ0cykKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2FsbF9wYWNrYWdlcyhwa2dfbmFtZSk6CiAgICAgICAgIiIiCiAgICAgICAgPj4+IGxpc3QoaW5zdGFsbF9saWIuX2FsbF9wYWNrYWdlcygnZm9vLmJhci5iYXonKSkKICAgICAgICBbJ2Zvby5iYXIuYmF6JywgJ2Zvby5iYXInLCAnZm9vJ10KICAgICAgICAiIiIKICAgICAgICB3aGlsZSBwa2dfbmFtZToKICAgICAgICAgICAgeWllbGQgcGtnX25hbWUKICAgICAgICAgICAgcGtnX25hbWUsIHNlcCwgY2hpbGQgPSBwa2dfbmFtZS5ycGFydGl0aW9uKCcuJykKCiAgICBkZWYgX2dldF9TVkVNX05TUHMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgR2V0IG5hbWVzcGFjZSBwYWNrYWdlcyAobGlzdCkgYnV0IG9ubHkgZm9yCiAgICAgICAgc2luZ2xlX3ZlcnNpb25fZXh0ZXJuYWxseV9tYW5hZ2VkIGluc3RhbGxhdGlvbnMgYW5kIGVtcHR5IG90aGVyd2lzZS4KICAgICAgICAiIiIKICAgICAgICAjIFRPRE86IGlzIGl0IG5lY2Vzc2FyeSB0byBzaG9ydC1jaXJjdWl0IGhlcmU/IGkuZS4gd2hhdCdzIHRoZSBjb3N0CiAgICAgICAgIyBpZiBnZXRfZmluYWxpemVkX2NvbW1hbmQgaXMgY2FsbGVkIGV2ZW4gd2hlbiBuYW1lc3BhY2VfcGFja2FnZXMgaXMKICAgICAgICAjIEZhbHNlPwogICAgICAgIGlmIG5vdCBzZWxmLmRpc3RyaWJ1dGlvbi5uYW1lc3BhY2VfcGFja2FnZXM6CiAgICAgICAgICAgIHJldHVybiBbXQoKICAgICAgICBpbnN0YWxsX2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdpbnN0YWxsJykKICAgICAgICBzdmVtID0gaW5zdGFsbF9jbWQuc2luZ2xlX3ZlcnNpb25fZXh0ZXJuYWxseV9tYW5hZ2VkCgogICAgICAgIHJldHVybiBzZWxmLmRpc3RyaWJ1dGlvbi5uYW1lc3BhY2VfcGFja2FnZXMgaWYgc3ZlbSBlbHNlIFtdCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9nZW5fZXhjbHVzaW9uX3BhdGhzKCk6CiAgICAgICAgIiIiCiAgICAgICAgR2VuZXJhdGUgZmlsZSBwYXRocyB0byBiZSBleGNsdWRlZCBmb3IgbmFtZXNwYWNlIHBhY2thZ2VzIChieXRlY29kZQogICAgICAgIGNhY2hlIGZpbGVzKS4KICAgICAgICAiIiIKICAgICAgICAjIGFsd2F5cyBleGNsdWRlIHRoZSBwYWNrYWdlIG1vZHVsZSBpdHNlbGYKICAgICAgICB5aWVsZCAnX19pbml0X18ucHknCgogICAgICAgIHlpZWxkICdfX2luaXRfXy5weWMnCiAgICAgICAgeWllbGQgJ19faW5pdF9fLnB5bycKCiAgICAgICAgaWYgbm90IGhhc2F0dHIoc3lzLCAnaW1wbGVtZW50YXRpb24nKToKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGJhc2UgPSBvcy5wYXRoLmpvaW4oJ19fcHljYWNoZV9fJywgJ19faW5pdF9fLicgKyBzeXMuaW1wbGVtZW50YXRpb24uY2FjaGVfdGFnKQogICAgICAgIHlpZWxkIGJhc2UgKyAnLnB5YycKICAgICAgICB5aWVsZCBiYXNlICsgJy5weW8nCiAgICAgICAgeWllbGQgYmFzZSArICcub3B0LTEucHljJwogICAgICAgIHlpZWxkIGJhc2UgKyAnLm9wdC0yLnB5YycKCiAgICBkZWYgY29weV90cmVlKAogICAgICAgICAgICBzZWxmLCBpbmZpbGUsIG91dGZpbGUsCiAgICAgICAgICAgIHByZXNlcnZlX21vZGU9MSwgcHJlc2VydmVfdGltZXM9MSwgcHJlc2VydmVfc3ltbGlua3M9MCwgbGV2ZWw9MQogICAgKToKICAgICAgICBhc3NlcnQgcHJlc2VydmVfbW9kZSBhbmQgcHJlc2VydmVfdGltZXMgYW5kIG5vdCBwcmVzZXJ2ZV9zeW1saW5rcwogICAgICAgIGV4Y2x1ZGUgPSBzZWxmLmdldF9leGNsdXNpb25zKCkKCiAgICAgICAgaWYgbm90IGV4Y2x1ZGU6CiAgICAgICAgICAgIHJldHVybiBvcmlnLmluc3RhbGxfbGliLmNvcHlfdHJlZShzZWxmLCBpbmZpbGUsIG91dGZpbGUpCgogICAgICAgICMgRXhjbHVkZSBuYW1lc3BhY2UgcGFja2FnZSBfX2luaXRfXy5weSogZmlsZXMgZnJvbSB0aGUgb3V0cHV0CgogICAgICAgIGZyb20gc2V0dXB0b29scy5hcmNoaXZlX3V0aWwgaW1wb3J0IHVucGFja19kaXJlY3RvcnkKICAgICAgICBmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCgogICAgICAgIG91dGZpbGVzID0gW10KCiAgICAgICAgZGVmIHBmKHNyYywgZHN0KToKICAgICAgICAgICAgaWYgZHN0IGluIGV4Y2x1ZGU6CiAgICAgICAgICAgICAgICBsb2cud2FybigiU2tpcHBpbmcgaW5zdGFsbGF0aW9uIG9mICVzIChuYW1lc3BhY2UgcGFja2FnZSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgZHN0KQogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICAgICBsb2cuaW5mbygiY29weWluZyAlcyAtPiAlcyIsIHNyYywgb3MucGF0aC5kaXJuYW1lKGRzdCkpCiAgICAgICAgICAgIG91dGZpbGVzLmFwcGVuZChkc3QpCiAgICAgICAgICAgIHJldHVybiBkc3QKCiAgICAgICAgdW5wYWNrX2RpcmVjdG9yeShpbmZpbGUsIG91dGZpbGUsIHBmKQogICAgICAgIHJldHVybiBvdXRmaWxlcwoKICAgIGRlZiBnZXRfb3V0cHV0cyhzZWxmKToKICAgICAgICBvdXRwdXRzID0gb3JpZy5pbnN0YWxsX2xpYi5nZXRfb3V0cHV0cyhzZWxmKQogICAgICAgIGV4Y2x1ZGUgPSBzZWxmLmdldF9leGNsdXNpb25zKCkKICAgICAgICBpZiBleGNsdWRlOgogICAgICAgICAgICByZXR1cm4gW2YgZm9yIGYgaW4gb3V0cHV0cyBpZiBmIG5vdCBpbiBleGNsdWRlXQogICAgICAgIHJldHVybiBvdXRwdXRzClBLAwQUAAAAAAAAACEARj/xHocJAACHCQAASgAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2NvbW1hbmQvaW5zdGFsbF9zY3JpcHRzLnB5ZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZwppbXBvcnQgZGlzdHV0aWxzLmNvbW1hbmQuaW5zdGFsbF9zY3JpcHRzIGFzIG9yaWcKaW1wb3J0IG9zCmltcG9ydCBzeXMKCmZyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgRGlzdHJpYnV0aW9uLCBQYXRoTWV0YWRhdGEsIGVuc3VyZV9kaXJlY3RvcnkKCgpjbGFzcyBpbnN0YWxsX3NjcmlwdHMob3JpZy5pbnN0YWxsX3NjcmlwdHMpOgogICAgIiIiRG8gbm9ybWFsIHNjcmlwdCBpbnN0YWxsLCBwbHVzIGFueSBlZ2dfaW5mbyB3cmFwcGVyIHNjcmlwdHMiIiIKCiAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIG9yaWcuaW5zdGFsbF9zY3JpcHRzLmluaXRpYWxpemVfb3B0aW9ucyhzZWxmKQogICAgICAgIHNlbGYubm9fZXAgPSBGYWxzZQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgaW1wb3J0IHNldHVwdG9vbHMuY29tbWFuZC5lYXN5X2luc3RhbGwgYXMgZWkKCiAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgiZWdnX2luZm8iKQogICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLnNjcmlwdHM6CiAgICAgICAgICAgIG9yaWcuaW5zdGFsbF9zY3JpcHRzLnJ1bihzZWxmKSAgIyBydW4gZmlyc3QgdG8gc2V0IHVwIHNlbGYub3V0ZmlsZXMKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLm91dGZpbGVzID0gW10KICAgICAgICBpZiBzZWxmLm5vX2VwOgogICAgICAgICAgICAjIGRvbid0IGluc3RhbGwgZW50cnkgcG9pbnQgc2NyaXB0cyBpbnRvIC5lZ2cgZmlsZSEKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGVpX2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCJlZ2dfaW5mbyIpCiAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbigKICAgICAgICAgICAgZWlfY21kLmVnZ19iYXNlLCBQYXRoTWV0YWRhdGEoZWlfY21kLmVnZ19iYXNlLCBlaV9jbWQuZWdnX2luZm8pLAogICAgICAgICAgICBlaV9jbWQuZWdnX25hbWUsIGVpX2NtZC5lZ2dfdmVyc2lvbiwKICAgICAgICApCiAgICAgICAgYnNfY21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkX3NjcmlwdHMnKQogICAgICAgIGV4ZWNfcGFyYW0gPSBnZXRhdHRyKGJzX2NtZCwgJ2V4ZWN1dGFibGUnLCBOb25lKQogICAgICAgIGJ3X2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCJiZGlzdF93aW5pbnN0IikKICAgICAgICBpc193aW5pbnN0ID0gZ2V0YXR0cihid19jbWQsICdfaXNfcnVubmluZycsIEZhbHNlKQogICAgICAgIHdyaXRlciA9IGVpLlNjcmlwdFdyaXRlcgogICAgICAgIGlmIGlzX3dpbmluc3Q6CiAgICAgICAgICAgIGV4ZWNfcGFyYW0gPSAicHl0aG9uLmV4ZSIKICAgICAgICAgICAgd3JpdGVyID0gZWkuV2luZG93c1NjcmlwdFdyaXRlcgogICAgICAgIGlmIGV4ZWNfcGFyYW0gPT0gc3lzLmV4ZWN1dGFibGU6CiAgICAgICAgICAgICMgSW4gY2FzZSB0aGUgcGF0aCB0byB0aGUgUHl0aG9uIGV4ZWN1dGFibGUgY29udGFpbnMgYSBzcGFjZSwgd3JhcAogICAgICAgICAgICAjIGl0IHNvIGl0J3Mgbm90IHNwbGl0IHVwLgogICAgICAgICAgICBleGVjX3BhcmFtID0gW2V4ZWNfcGFyYW1dCiAgICAgICAgIyByZXNvbHZlIHRoZSB3cml0ZXIgdG8gdGhlIGVudmlyb25tZW50CiAgICAgICAgd3JpdGVyID0gd3JpdGVyLmJlc3QoKQogICAgICAgIGNtZCA9IHdyaXRlci5jb21tYW5kX3NwZWNfY2xhc3MuYmVzdCgpLmZyb21fcGFyYW0oZXhlY19wYXJhbSkKICAgICAgICBmb3IgYXJncyBpbiB3cml0ZXIuZ2V0X2FyZ3MoZGlzdCwgY21kLmFzX2hlYWRlcigpKToKICAgICAgICAgICAgc2VsZi53cml0ZV9zY3JpcHQoKmFyZ3MpCgogICAgZGVmIHdyaXRlX3NjcmlwdChzZWxmLCBzY3JpcHRfbmFtZSwgY29udGVudHMsIG1vZGU9InQiLCAqaWdub3JlZCk6CiAgICAgICAgIiIiV3JpdGUgYW4gZXhlY3V0YWJsZSBmaWxlIHRvIHRoZSBzY3JpcHRzIGRpcmVjdG9yeSIiIgogICAgICAgIGZyb20gc2V0dXB0b29scy5jb21tYW5kLmVhc3lfaW5zdGFsbCBpbXBvcnQgY2htb2QsIGN1cnJlbnRfdW1hc2sKCiAgICAgICAgbG9nLmluZm8oIkluc3RhbGxpbmcgJXMgc2NyaXB0IHRvICVzIiwgc2NyaXB0X25hbWUsIHNlbGYuaW5zdGFsbF9kaXIpCiAgICAgICAgdGFyZ2V0ID0gb3MucGF0aC5qb2luKHNlbGYuaW5zdGFsbF9kaXIsIHNjcmlwdF9uYW1lKQogICAgICAgIHNlbGYub3V0ZmlsZXMuYXBwZW5kKHRhcmdldCkKCiAgICAgICAgbWFzayA9IGN1cnJlbnRfdW1hc2soKQogICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgIGVuc3VyZV9kaXJlY3RvcnkodGFyZ2V0KQogICAgICAgICAgICBmID0gb3Blbih0YXJnZXQsICJ3IiArIG1vZGUpCiAgICAgICAgICAgIGYud3JpdGUoY29udGVudHMpCiAgICAgICAgICAgIGYuY2xvc2UoKQogICAgICAgICAgICBjaG1vZCh0YXJnZXQsIDBvNzc3IC0gbWFzaykKUEsDBBQAAAAAAAAAIQB9c2C/ehMAAHoTAABFAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvY29tbWFuZC9weTM2Y29tcGF0LnB5aW1wb3J0IG9zCmZyb20gZ2xvYiBpbXBvcnQgZ2xvYgpmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBjb252ZXJ0X3BhdGgKZnJvbSBkaXN0dXRpbHMuY29tbWFuZCBpbXBvcnQgc2Rpc3QKCmZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4Lm1vdmVzIGltcG9ydCBmaWx0ZXIKCgpjbGFzcyBzZGlzdF9hZGRfZGVmYXVsdHM6CiAgICAiIiIKICAgIE1peC1pbiBwcm92aWRpbmcgZm9yd2FyZC1jb21wYXRpYmlsaXR5IGZvciBmdW5jdGlvbmFsaXR5IGFzIGZvdW5kIGluCiAgICBkaXN0dXRpbHMgb24gUHl0aG9uIDMuNy4KCiAgICBEbyBub3QgZWRpdCB0aGUgY29kZSBpbiB0aGlzIGNsYXNzIGV4Y2VwdCB0byB1cGRhdGUgZnVuY3Rpb25hbGl0eQogICAgYXMgaW1wbGVtZW50ZWQgaW4gZGlzdHV0aWxzLiBJbnN0ZWFkLCBvdmVycmlkZSBpbiB0aGUgc3ViY2xhc3MuCiAgICAiIiIKCiAgICBkZWYgYWRkX2RlZmF1bHRzKHNlbGYpOgogICAgICAgICIiIkFkZCBhbGwgdGhlIGRlZmF1bHQgZmlsZXMgdG8gc2VsZi5maWxlbGlzdDoKICAgICAgICAgIC0gUkVBRE1FIG9yIFJFQURNRS50eHQKICAgICAgICAgIC0gc2V0dXAucHkKICAgICAgICAgIC0gdGVzdC90ZXN0Ki5weQogICAgICAgICAgLSBhbGwgcHVyZSBQeXRob24gbW9kdWxlcyBtZW50aW9uZWQgaW4gc2V0dXAgc2NyaXB0CiAgICAgICAgICAtIGFsbCBmaWxlcyBwb2ludGVkIGJ5IHBhY2thZ2VfZGF0YSAoYnVpbGRfcHkpCiAgICAgICAgICAtIGFsbCBmaWxlcyBkZWZpbmVkIGluIGRhdGFfZmlsZXMuCiAgICAgICAgICAtIGFsbCBmaWxlcyBkZWZpbmVkIGFzIHNjcmlwdHMuCiAgICAgICAgICAtIGFsbCBDIHNvdXJjZXMgbGlzdGVkIGFzIHBhcnQgb2YgZXh0ZW5zaW9ucyBvciBDIGxpYnJhcmllcwogICAgICAgICAgICBpbiB0aGUgc2V0dXAgc2NyaXB0IChkb2Vzbid0IGNhdGNoIEMgaGVhZGVycyEpCiAgICAgICAgV2FybnMgaWYgKFJFQURNRSBvciBSRUFETUUudHh0KSBvciBzZXR1cC5weSBhcmUgbWlzc2luZzsgZXZlcnl0aGluZwogICAgICAgIGVsc2UgaXMgb3B0aW9uYWwuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5fYWRkX2RlZmF1bHRzX3N0YW5kYXJkcygpCiAgICAgICAgc2VsZi5fYWRkX2RlZmF1bHRzX29wdGlvbmFsKCkKICAgICAgICBzZWxmLl9hZGRfZGVmYXVsdHNfcHl0aG9uKCkKICAgICAgICBzZWxmLl9hZGRfZGVmYXVsdHNfZGF0YV9maWxlcygpCiAgICAgICAgc2VsZi5fYWRkX2RlZmF1bHRzX2V4dCgpCiAgICAgICAgc2VsZi5fYWRkX2RlZmF1bHRzX2NfbGlicygpCiAgICAgICAgc2VsZi5fYWRkX2RlZmF1bHRzX3NjcmlwdHMoKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfY3NfcGF0aF9leGlzdHMoZnNwYXRoKToKICAgICAgICAiIiIKICAgICAgICBDYXNlLXNlbnNpdGl2ZSBwYXRoIGV4aXN0ZW5jZSBjaGVjawoKICAgICAgICA+Pj4gc2Rpc3RfYWRkX2RlZmF1bHRzLl9jc19wYXRoX2V4aXN0cyhfX2ZpbGVfXykKICAgICAgICBUcnVlCiAgICAgICAgPj4+IHNkaXN0X2FkZF9kZWZhdWx0cy5fY3NfcGF0aF9leGlzdHMoX19maWxlX18udXBwZXIoKSkKICAgICAgICBGYWxzZQogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhmc3BhdGgpOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAjIG1ha2UgYWJzb2x1dGUgc28gd2UgYWx3YXlzIGhhdmUgYSBkaXJlY3RvcnkKICAgICAgICBhYnNwYXRoID0gb3MucGF0aC5hYnNwYXRoKGZzcGF0aCkKICAgICAgICBkaXJlY3RvcnksIGZpbGVuYW1lID0gb3MucGF0aC5zcGxpdChhYnNwYXRoKQogICAgICAgIHJldHVybiBmaWxlbmFtZSBpbiBvcy5saXN0ZGlyKGRpcmVjdG9yeSkKCiAgICBkZWYgX2FkZF9kZWZhdWx0c19zdGFuZGFyZHMoc2VsZik6CiAgICAgICAgc3RhbmRhcmRzID0gW3NlbGYuUkVBRE1FUywgc2VsZi5kaXN0cmlidXRpb24uc2NyaXB0X25hbWVdCiAgICAgICAgZm9yIGZuIGluIHN0YW5kYXJkczoKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShmbiwgdHVwbGUpOgogICAgICAgICAgICAgICAgYWx0cyA9IGZuCiAgICAgICAgICAgICAgICBnb3RfaXQgPSBGYWxzZQogICAgICAgICAgICAgICAgZm9yIGZuIGluIGFsdHM6CiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5fY3NfcGF0aF9leGlzdHMoZm4pOgogICAgICAgICAgICAgICAgICAgICAgICBnb3RfaXQgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZWxpc3QuYXBwZW5kKGZuKQogICAgICAgICAgICAgICAgICAgICAgICBicmVhawoKICAgICAgICAgICAgICAgIGlmIG5vdCBnb3RfaXQ6CiAgICAgICAgICAgICAgICAgICAgc2VsZi53YXJuKCJzdGFuZGFyZCBmaWxlIG5vdCBmb3VuZDogc2hvdWxkIGhhdmUgb25lIG9mICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLCAnLmpvaW4oYWx0cykpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpZiBzZWxmLl9jc19wYXRoX2V4aXN0cyhmbik6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5hcHBlbmQoZm4pCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHNlbGYud2Fybigic3RhbmRhcmQgZmlsZSAnJXMnIG5vdCBmb3VuZCIgJSBmbikKCiAgICBkZWYgX2FkZF9kZWZhdWx0c19vcHRpb25hbChzZWxmKToKICAgICAgICBvcHRpb25hbCA9IFsndGVzdC90ZXN0Ki5weScsICdzZXR1cC5jZmcnXQogICAgICAgIGZvciBwYXR0ZXJuIGluIG9wdGlvbmFsOgogICAgICAgICAgICBmaWxlcyA9IGZpbHRlcihvcy5wYXRoLmlzZmlsZSwgZ2xvYihwYXR0ZXJuKSkKICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5leHRlbmQoZmlsZXMpCgogICAgZGVmIF9hZGRfZGVmYXVsdHNfcHl0aG9uKHNlbGYpOgogICAgICAgICMgYnVpbGRfcHkgaXMgdXNlZCB0byBnZXQ6CiAgICAgICAgIyAgLSBweXRob24gbW9kdWxlcwogICAgICAgICMgIC0gZmlsZXMgZGVmaW5lZCBpbiBwYWNrYWdlX2RhdGEKICAgICAgICBidWlsZF9weSA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZF9weScpCgogICAgICAgICMgZ2V0dGluZyBweXRob24gZmlsZXMKICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfcHVyZV9tb2R1bGVzKCk6CiAgICAgICAgICAgIHNlbGYuZmlsZWxpc3QuZXh0ZW5kKGJ1aWxkX3B5LmdldF9zb3VyY2VfZmlsZXMoKSkKCiAgICAgICAgIyBnZXR0aW5nIHBhY2thZ2VfZGF0YSBmaWxlcwogICAgICAgICMgKGNvbXB1dGVkIGluIGJ1aWxkX3B5LmRhdGFfZmlsZXMgYnkgYnVpbGRfcHkuZmluYWxpemVfb3B0aW9ucykKICAgICAgICBmb3IgcGtnLCBzcmNfZGlyLCBidWlsZF9kaXIsIGZpbGVuYW1lcyBpbiBidWlsZF9weS5kYXRhX2ZpbGVzOgogICAgICAgICAgICBmb3IgZmlsZW5hbWUgaW4gZmlsZW5hbWVzOgogICAgICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5hcHBlbmQob3MucGF0aC5qb2luKHNyY19kaXIsIGZpbGVuYW1lKSkKCiAgICBkZWYgX2FkZF9kZWZhdWx0c19kYXRhX2ZpbGVzKHNlbGYpOgogICAgICAgICMgZ2V0dGluZyBkaXN0cmlidXRpb24uZGF0YV9maWxlcwogICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLmhhc19kYXRhX2ZpbGVzKCk6CiAgICAgICAgICAgIGZvciBpdGVtIGluIHNlbGYuZGlzdHJpYnV0aW9uLmRhdGFfZmlsZXM6CiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGl0ZW0sIHN0cik6CiAgICAgICAgICAgICAgICAgICAgIyBwbGFpbiBmaWxlCiAgICAgICAgICAgICAgICAgICAgaXRlbSA9IGNvbnZlcnRfcGF0aChpdGVtKQogICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGl0ZW0pOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbGVsaXN0LmFwcGVuZChpdGVtKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAjIGEgKGRpcm5hbWUsIGZpbGVuYW1lcykgdHVwbGUKICAgICAgICAgICAgICAgICAgICBkaXJuYW1lLCBmaWxlbmFtZXMgPSBpdGVtCiAgICAgICAgICAgICAgICAgICAgZm9yIGYgaW4gZmlsZW5hbWVzOgogICAgICAgICAgICAgICAgICAgICAgICBmID0gY29udmVydF9wYXRoKGYpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGYpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5hcHBlbmQoZikKCiAgICBkZWYgX2FkZF9kZWZhdWx0c19leHQoc2VsZik6CiAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24uaGFzX2V4dF9tb2R1bGVzKCk6CiAgICAgICAgICAgIGJ1aWxkX2V4dCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZF9leHQnKQogICAgICAgICAgICBzZWxmLmZpbGVsaXN0LmV4dGVuZChidWlsZF9leHQuZ2V0X3NvdXJjZV9maWxlcygpKQoKICAgIGRlZiBfYWRkX2RlZmF1bHRzX2NfbGlicyhzZWxmKToKICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfY19saWJyYXJpZXMoKToKICAgICAgICAgICAgYnVpbGRfY2xpYiA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZF9jbGliJykKICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5leHRlbmQoYnVpbGRfY2xpYi5nZXRfc291cmNlX2ZpbGVzKCkpCgogICAgZGVmIF9hZGRfZGVmYXVsdHNfc2NyaXB0cyhzZWxmKToKICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfc2NyaXB0cygpOgogICAgICAgICAgICBidWlsZF9zY3JpcHRzID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkX3NjcmlwdHMnKQogICAgICAgICAgICBzZWxmLmZpbGVsaXN0LmV4dGVuZChidWlsZF9zY3JpcHRzLmdldF9zb3VyY2VfZmlsZXMoKSkKCgppZiBoYXNhdHRyKHNkaXN0LnNkaXN0LCAnX2FkZF9kZWZhdWx0c19zdGFuZGFyZHMnKToKICAgICMgZGlzYWJsZSB0aGUgZnVuY3Rpb25hbGl0eSBhbHJlYWR5IGF2YWlsYWJsZSB1cHN0cmVhbQogICAgY2xhc3Mgc2Rpc3RfYWRkX2RlZmF1bHRzOgogICAgICAgIHBhc3MKUEsDBBQAAAAAAAAAIQB20uq11AEAANQBAABDAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvY29tbWFuZC9yZWdpc3Rlci5weWZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKaW1wb3J0IGRpc3R1dGlscy5jb21tYW5kLnJlZ2lzdGVyIGFzIG9yaWcKCmZyb20gc2V0dXB0b29scy5lcnJvcnMgaW1wb3J0IFJlbW92ZWRDb21tYW5kRXJyb3IKCgpjbGFzcyByZWdpc3RlcihvcmlnLnJlZ2lzdGVyKToKICAgICIiIkZvcm1lcmx5IHVzZWQgdG8gcmVnaXN0ZXIgcGFja2FnZXMgb24gUHlQSS4iIiIKCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgIG1zZyA9ICgKICAgICAgICAgICAgIlRoZSByZWdpc3RlciBjb21tYW5kIGhhcyBiZWVuIHJlbW92ZWQsIHVzZSB0d2luZSB0byB1cGxvYWQgIgogICAgICAgICAgICArICJpbnN0ZWFkIChodHRwczovL3B5cGkub3JnL3AvdHdpbmUpIgogICAgICAgICkKCiAgICAgICAgc2VsZi5hbm5vdW5jZSgiRVJST1I6ICIgKyBtc2csIGxvZy5FUlJPUikKCiAgICAgICAgcmFpc2UgUmVtb3ZlZENvbW1hbmRFcnJvcihtc2cpClBLAwQUAAAAAAAAACEAGcrUpHQIAAB0CAAAQQAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2NvbW1hbmQvcm90YXRlLnB5ZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgY29udmVydF9wYXRoCmZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNPcHRpb25FcnJvcgppbXBvcnQgb3MKaW1wb3J0IHNodXRpbAoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybiBpbXBvcnQgc2l4Cgpmcm9tIHNldHVwdG9vbHMgaW1wb3J0IENvbW1hbmQKCgpjbGFzcyByb3RhdGUoQ29tbWFuZCk6CiAgICAiIiJEZWxldGUgb2xkZXIgZGlzdHJpYnV0aW9ucyIiIgoKICAgIGRlc2NyaXB0aW9uID0gImRlbGV0ZSBvbGRlciBkaXN0cmlidXRpb25zLCBrZWVwaW5nIE4gbmV3ZXN0IGZpbGVzIgogICAgdXNlcl9vcHRpb25zID0gWwogICAgICAgICgnbWF0Y2g9JywgJ20nLCAicGF0dGVybnMgdG8gbWF0Y2ggKHJlcXVpcmVkKSIpLAogICAgICAgICgnZGlzdC1kaXI9JywgJ2QnLCAiZGlyZWN0b3J5IHdoZXJlIHRoZSBkaXN0cmlidXRpb25zIGFyZSIpLAogICAgICAgICgna2VlcD0nLCAnaycsICJudW1iZXIgb2YgbWF0Y2hpbmcgZGlzdHJpYnV0aW9ucyB0byBrZWVwIiksCiAgICBdCgogICAgYm9vbGVhbl9vcHRpb25zID0gW10KCiAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIHNlbGYubWF0Y2ggPSBOb25lCiAgICAgICAgc2VsZi5kaXN0X2RpciA9IE5vbmUKICAgICAgICBzZWxmLmtlZXAgPSBOb25lCgogICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgaWYgc2VsZi5tYXRjaCBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigKICAgICAgICAgICAgICAgICJNdXN0IHNwZWNpZnkgb25lIG9yIG1vcmUgKGNvbW1hLXNlcGFyYXRlZCkgbWF0Y2ggcGF0dGVybnMgIgogICAgICAgICAgICAgICAgIihlLmcuICcuemlwJyBvciAnLmVnZycpIgogICAgICAgICAgICApCiAgICAgICAgaWYgc2VsZi5rZWVwIGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKCJNdXN0IHNwZWNpZnkgbnVtYmVyIG9mIGZpbGVzIHRvIGtlZXAiKQogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5rZWVwID0gaW50KHNlbGYua2VlcCkKICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoIi0ta2VlcCBtdXN0IGJlIGFuIGludGVnZXIiKQogICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5tYXRjaCwgc2l4LnN0cmluZ190eXBlcyk6CiAgICAgICAgICAgIHNlbGYubWF0Y2ggPSBbCiAgICAgICAgICAgICAgICBjb252ZXJ0X3BhdGgocC5zdHJpcCgpKSBmb3IgcCBpbiBzZWxmLm1hdGNoLnNwbGl0KCcsJykKICAgICAgICAgICAgXQogICAgICAgIHNlbGYuc2V0X3VuZGVmaW5lZF9vcHRpb25zKCdiZGlzdCcsICgnZGlzdF9kaXInLCAnZGlzdF9kaXInKSkKCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgIHNlbGYucnVuX2NvbW1hbmQoImVnZ19pbmZvIikKICAgICAgICBmcm9tIGdsb2IgaW1wb3J0IGdsb2IKCiAgICAgICAgZm9yIHBhdHRlcm4gaW4gc2VsZi5tYXRjaDoKICAgICAgICAgICAgcGF0dGVybiA9IHNlbGYuZGlzdHJpYnV0aW9uLmdldF9uYW1lKCkgKyAnKicgKyBwYXR0ZXJuCiAgICAgICAgICAgIGZpbGVzID0gZ2xvYihvcy5wYXRoLmpvaW4oc2VsZi5kaXN0X2RpciwgcGF0dGVybikpCiAgICAgICAgICAgIGZpbGVzID0gWyhvcy5wYXRoLmdldG10aW1lKGYpLCBmKSBmb3IgZiBpbiBmaWxlc10KICAgICAgICAgICAgZmlsZXMuc29ydCgpCiAgICAgICAgICAgIGZpbGVzLnJldmVyc2UoKQoKICAgICAgICAgICAgbG9nLmluZm8oIiVkIGZpbGUocykgbWF0Y2hpbmcgJXMiLCBsZW4oZmlsZXMpLCBwYXR0ZXJuKQogICAgICAgICAgICBmaWxlcyA9IGZpbGVzW3NlbGYua2VlcDpdCiAgICAgICAgICAgIGZvciAodCwgZikgaW4gZmlsZXM6CiAgICAgICAgICAgICAgICBsb2cuaW5mbygiRGVsZXRpbmcgJXMiLCBmKQogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGYpOgogICAgICAgICAgICAgICAgICAgICAgICBzaHV0aWwucm10cmVlKGYpCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rKGYpClBLAwQUAAAAAAAAACEABIHWNJICAACSAgAAQwAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2NvbW1hbmQvc2F2ZW9wdHMucHlmcm9tIHNldHVwdG9vbHMuY29tbWFuZC5zZXRvcHQgaW1wb3J0IGVkaXRfY29uZmlnLCBvcHRpb25fYmFzZQoKCmNsYXNzIHNhdmVvcHRzKG9wdGlvbl9iYXNlKToKICAgICIiIlNhdmUgY29tbWFuZC1saW5lIG9wdGlvbnMgdG8gYSBmaWxlIiIiCgogICAgZGVzY3JpcHRpb24gPSAic2F2ZSBzdXBwbGllZCBvcHRpb25zIHRvIHNldHVwLmNmZyBvciBvdGhlciBjb25maWcgZmlsZSIKCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgIGRpc3QgPSBzZWxmLmRpc3RyaWJ1dGlvbgogICAgICAgIHNldHRpbmdzID0ge30KCiAgICAgICAgZm9yIGNtZCBpbiBkaXN0LmNvbW1hbmRfb3B0aW9uczoKCiAgICAgICAgICAgIGlmIGNtZCA9PSAnc2F2ZW9wdHMnOgogICAgICAgICAgICAgICAgY29udGludWUgICMgZG9uJ3Qgc2F2ZSBvdXIgb3duIG9wdGlvbnMhCgogICAgICAgICAgICBmb3Igb3B0LCAoc3JjLCB2YWwpIGluIGRpc3QuZ2V0X29wdGlvbl9kaWN0KGNtZCkuaXRlbXMoKToKICAgICAgICAgICAgICAgIGlmIHNyYyA9PSAiY29tbWFuZCBsaW5lIjoKICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5zZXRkZWZhdWx0KGNtZCwge30pW29wdF0gPSB2YWwKCiAgICAgICAgZWRpdF9jb25maWcoc2VsZi5maWxlbmFtZSwgc2V0dGluZ3MsIHNlbGYuZHJ5X3J1bikKUEsDBBQAAAAAAAAAIQBwijYHmB8AAJgfAABAAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvY29tbWFuZC9zZGlzdC5weWZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKaW1wb3J0IGRpc3R1dGlscy5jb21tYW5kLnNkaXN0IGFzIG9yaWcKaW1wb3J0IG9zCmltcG9ydCBzeXMKaW1wb3J0IGlvCmltcG9ydCBjb250ZXh0bGliCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuIGltcG9ydCBzaXgsIG9yZGVyZWRfc2V0Cgpmcm9tIC5weTM2Y29tcGF0IGltcG9ydCBzZGlzdF9hZGRfZGVmYXVsdHMKCmltcG9ydCBwa2dfcmVzb3VyY2VzCgpfZGVmYXVsdF9yZXZjdHJsID0gbGlzdAoKCmRlZiB3YWxrX3JldmN0cmwoZGlybmFtZT0nJyk6CiAgICAiIiJGaW5kIGFsbCBmaWxlcyB1bmRlciByZXZpc2lvbiBjb250cm9sIiIiCiAgICBmb3IgZXAgaW4gcGtnX3Jlc291cmNlcy5pdGVyX2VudHJ5X3BvaW50cygnc2V0dXB0b29scy5maWxlX2ZpbmRlcnMnKToKICAgICAgICBmb3IgaXRlbSBpbiBlcC5sb2FkKCkoZGlybmFtZSk6CiAgICAgICAgICAgIHlpZWxkIGl0ZW0KCgpjbGFzcyBzZGlzdChzZGlzdF9hZGRfZGVmYXVsdHMsIG9yaWcuc2Rpc3QpOgogICAgIiIiU21hcnQgc2Rpc3QgdGhhdCBmaW5kcyBhbnl0aGluZyBzdXBwb3J0ZWQgYnkgcmV2aXNpb24gY29udHJvbCIiIgoKICAgIHVzZXJfb3B0aW9ucyA9IFsKICAgICAgICAoJ2Zvcm1hdHM9JywgTm9uZSwKICAgICAgICAgImZvcm1hdHMgZm9yIHNvdXJjZSBkaXN0cmlidXRpb24gKGNvbW1hLXNlcGFyYXRlZCBsaXN0KSIpLAogICAgICAgICgna2VlcC10ZW1wJywgJ2snLAogICAgICAgICAia2VlcCB0aGUgZGlzdHJpYnV0aW9uIHRyZWUgYXJvdW5kIGFmdGVyIGNyZWF0aW5nICIgKwogICAgICAgICAiYXJjaGl2ZSBmaWxlKHMpIiksCiAgICAgICAgKCdkaXN0LWRpcj0nLCAnZCcsCiAgICAgICAgICJkaXJlY3RvcnkgdG8gcHV0IHRoZSBzb3VyY2UgZGlzdHJpYnV0aW9uIGFyY2hpdmUocykgaW4gIgogICAgICAgICAiW2RlZmF1bHQ6IGRpc3RdIiksCiAgICBdCgogICAgbmVnYXRpdmVfb3B0ID0ge30KCiAgICBSRUFETUVfRVhURU5TSU9OUyA9IFsnJywgJy5yc3QnLCAnLnR4dCcsICcubWQnXQogICAgUkVBRE1FUyA9IHR1cGxlKCdSRUFETUV7MH0nLmZvcm1hdChleHQpIGZvciBleHQgaW4gUkVBRE1FX0VYVEVOU0lPTlMpCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdlZ2dfaW5mbycpCiAgICAgICAgZWlfY21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2VnZ19pbmZvJykKICAgICAgICBzZWxmLmZpbGVsaXN0ID0gZWlfY21kLmZpbGVsaXN0CiAgICAgICAgc2VsZi5maWxlbGlzdC5hcHBlbmQob3MucGF0aC5qb2luKGVpX2NtZC5lZ2dfaW5mbywgJ1NPVVJDRVMudHh0JykpCiAgICAgICAgc2VsZi5jaGVja19yZWFkbWUoKQoKICAgICAgICAjIFJ1biBzdWIgY29tbWFuZHMKICAgICAgICBmb3IgY21kX25hbWUgaW4gc2VsZi5nZXRfc3ViX2NvbW1hbmRzKCk6CiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoY21kX25hbWUpCgogICAgICAgIHNlbGYubWFrZV9kaXN0cmlidXRpb24oKQoKICAgICAgICBkaXN0X2ZpbGVzID0gZ2V0YXR0cihzZWxmLmRpc3RyaWJ1dGlvbiwgJ2Rpc3RfZmlsZXMnLCBbXSkKICAgICAgICBmb3IgZmlsZSBpbiBzZWxmLmFyY2hpdmVfZmlsZXM6CiAgICAgICAgICAgIGRhdGEgPSAoJ3NkaXN0JywgJycsIGZpbGUpCiAgICAgICAgICAgIGlmIGRhdGEgbm90IGluIGRpc3RfZmlsZXM6CiAgICAgICAgICAgICAgICBkaXN0X2ZpbGVzLmFwcGVuZChkYXRhKQoKICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgb3JpZy5zZGlzdC5pbml0aWFsaXplX29wdGlvbnMoc2VsZikKCiAgICAgICAgc2VsZi5fZGVmYXVsdF90b19nenRhcigpCgogICAgZGVmIF9kZWZhdWx0X3RvX2d6dGFyKHNlbGYpOgogICAgICAgICMgb25seSBuZWVkZWQgb24gUHl0aG9uIHByaW9yIHRvIDMuNi4KICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvID49ICgzLCA2LCAwLCAnYmV0YScsIDEpOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBzZWxmLmZvcm1hdHMgPSBbJ2d6dGFyJ10KCiAgICBkZWYgbWFrZV9kaXN0cmlidXRpb24oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgV29ya2Fyb3VuZCBmb3IgIzUxNgogICAgICAgICIiIgogICAgICAgIHdpdGggc2VsZi5fcmVtb3ZlX29zX2xpbmsoKToKICAgICAgICAgICAgb3JpZy5zZGlzdC5tYWtlX2Rpc3RyaWJ1dGlvbihzZWxmKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIEBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCiAgICBkZWYgX3JlbW92ZV9vc19saW5rKCk6CiAgICAgICAgIiIiCiAgICAgICAgSW4gYSBjb250ZXh0LCByZW1vdmUgYW5kIHJlc3RvcmUgb3MubGluayBpZiBpdCBleGlzdHMKICAgICAgICAiIiIKCiAgICAgICAgY2xhc3MgTm9WYWx1ZToKICAgICAgICAgICAgcGFzcwoKICAgICAgICBvcmlnX3ZhbCA9IGdldGF0dHIob3MsICdsaW5rJywgTm9WYWx1ZSkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGRlbCBvcy5saW5rCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgcGFzcwogICAgICAgIHRyeToKICAgICAgICAgICAgeWllbGQKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBpZiBvcmlnX3ZhbCBpcyBub3QgTm9WYWx1ZToKICAgICAgICAgICAgICAgIHNldGF0dHIob3MsICdsaW5rJywgb3JpZ192YWwpCgogICAgZGVmIF9fcmVhZF90ZW1wbGF0ZV9oYWNrKHNlbGYpOgogICAgICAgICMgVGhpcyBncm9keSBoYWNrIGNsb3NlcyB0aGUgdGVtcGxhdGUgZmlsZSAoTUFOSUZFU1QuaW4pIGlmIGFuCiAgICAgICAgIyAgZXhjZXB0aW9uIG9jY3VycyBkdXJpbmcgcmVhZF90ZW1wbGF0ZS4KICAgICAgICAjIERvaW5nIHNvIHByZXZlbnRzIGFuIGVycm9yIHdoZW4gZWFzeV9pbnN0YWxsIGF0dGVtcHRzIHRvIGRlbGV0ZSB0aGUKICAgICAgICAjICBmaWxlLgogICAgICAgIHRyeToKICAgICAgICAgICAgb3JpZy5zZGlzdC5yZWFkX3RlbXBsYXRlKHNlbGYpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgXywgXywgdGIgPSBzeXMuZXhjX2luZm8oKQogICAgICAgICAgICB0Yi50Yl9uZXh0LnRiX2ZyYW1lLmZfbG9jYWxzWyd0ZW1wbGF0ZSddLmNsb3NlKCkKICAgICAgICAgICAgcmFpc2UKCiAgICAjIEJlZ2lubmluZyB3aXRoIFB5dGhvbiAyLjcuMiwgMy4xLjQsIGFuZCAzLjIuMSwgdGhpcyBsZWFreSBmaWxlIGhhbmRsZQogICAgIyAgaGFzIGJlZW4gZml4ZWQsIHNvIG9ubHkgb3ZlcnJpZGUgdGhlIG1ldGhvZCBpZiB3ZSdyZSB1c2luZyBhbiBlYXJsaWVyCiAgICAjICBQeXRob24uCiAgICBoYXNfbGVha3lfaGFuZGxlID0gKAogICAgICAgIHN5cy52ZXJzaW9uX2luZm8gPCAoMiwgNywgMikKICAgICAgICBvciAoMywgMCkgPD0gc3lzLnZlcnNpb25faW5mbyA8ICgzLCAxLCA0KQogICAgICAgIG9yICgzLCAyKSA8PSBzeXMudmVyc2lvbl9pbmZvIDwgKDMsIDIsIDEpCiAgICApCiAgICBpZiBoYXNfbGVha3lfaGFuZGxlOgogICAgICAgIHJlYWRfdGVtcGxhdGUgPSBfX3JlYWRfdGVtcGxhdGVfaGFjawoKICAgIGRlZiBfYWRkX2RlZmF1bHRzX29wdGlvbmFsKHNlbGYpOgogICAgICAgIGlmIHNpeC5QWTI6CiAgICAgICAgICAgIHNkaXN0X2FkZF9kZWZhdWx0cy5fYWRkX2RlZmF1bHRzX29wdGlvbmFsKHNlbGYpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc3VwZXIoKS5fYWRkX2RlZmF1bHRzX29wdGlvbmFsKCkKICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZSgncHlwcm9qZWN0LnRvbWwnKToKICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5hcHBlbmQoJ3B5cHJvamVjdC50b21sJykKCiAgICBkZWYgX2FkZF9kZWZhdWx0c19weXRob24oc2VsZik6CiAgICAgICAgIiIiZ2V0dGluZyBweXRob24gZmlsZXMiIiIKICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfcHVyZV9tb2R1bGVzKCk6CiAgICAgICAgICAgIGJ1aWxkX3B5ID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkX3B5JykKICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5leHRlbmQoYnVpbGRfcHkuZ2V0X3NvdXJjZV9maWxlcygpKQogICAgICAgICAgICBzZWxmLl9hZGRfZGF0YV9maWxlcyhzZWxmLl9zYWZlX2RhdGFfZmlsZXMoYnVpbGRfcHkpKQoKICAgIGRlZiBfc2FmZV9kYXRhX2ZpbGVzKHNlbGYsIGJ1aWxkX3B5KToKICAgICAgICAiIiIKICAgICAgICBFeHRyYWN0aW5nIGRhdGFfZmlsZXMgZnJvbSBidWlsZF9weSBpcyBrbm93biB0byBjYXVzZQogICAgICAgIGluZmluaXRlIHJlY3Vyc2lvbiBlcnJvcnMgd2hlbiBgaW5jbHVkZV9wYWNrYWdlX2RhdGFgCiAgICAgICAgaXMgZW5hYmxlZCwgc28gc3VwcHJlc3MgaXQgaW4gdGhhdCBjYXNlLgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLmluY2x1ZGVfcGFja2FnZV9kYXRhOgogICAgICAgICAgICByZXR1cm4gKCkKICAgICAgICByZXR1cm4gYnVpbGRfcHkuZGF0YV9maWxlcwoKICAgIGRlZiBfYWRkX2RhdGFfZmlsZXMoc2VsZiwgZGF0YV9maWxlcyk6CiAgICAgICAgIiIiCiAgICAgICAgQWRkIGRhdGEgZmlsZXMgYXMgZm91bmQgaW4gYnVpbGRfcHkuZGF0YV9maWxlcy4KICAgICAgICAiIiIKICAgICAgICBzZWxmLmZpbGVsaXN0LmV4dGVuZCgKICAgICAgICAgICAgb3MucGF0aC5qb2luKHNyY19kaXIsIG5hbWUpCiAgICAgICAgICAgIGZvciBfLCBzcmNfZGlyLCBfLCBmaWxlbmFtZXMgaW4gZGF0YV9maWxlcwogICAgICAgICAgICBmb3IgbmFtZSBpbiBmaWxlbmFtZXMKICAgICAgICApCgogICAgZGVmIF9hZGRfZGVmYXVsdHNfZGF0YV9maWxlcyhzZWxmKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIGlmIHNpeC5QWTI6CiAgICAgICAgICAgICAgICBzZGlzdF9hZGRfZGVmYXVsdHMuX2FkZF9kZWZhdWx0c19kYXRhX2ZpbGVzKHNlbGYpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzdXBlcigpLl9hZGRfZGVmYXVsdHNfZGF0YV9maWxlcygpCiAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKICAgICAgICAgICAgbG9nLndhcm4oImRhdGFfZmlsZXMgY29udGFpbnMgdW5leHBlY3RlZCBvYmplY3RzIikKCiAgICBkZWYgY2hlY2tfcmVhZG1lKHNlbGYpOgogICAgICAgIGZvciBmIGluIHNlbGYuUkVBRE1FUzoKICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZik6CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLndhcm4oCiAgICAgICAgICAgICAgICAic3RhbmRhcmQgZmlsZSBub3QgZm91bmQ6IHNob3VsZCBoYXZlIG9uZSBvZiAiICsKICAgICAgICAgICAgICAgICcsICcuam9pbihzZWxmLlJFQURNRVMpCiAgICAgICAgICAgICkKCiAgICBkZWYgbWFrZV9yZWxlYXNlX3RyZWUoc2VsZiwgYmFzZV9kaXIsIGZpbGVzKToKICAgICAgICBvcmlnLnNkaXN0Lm1ha2VfcmVsZWFzZV90cmVlKHNlbGYsIGJhc2VfZGlyLCBmaWxlcykKCiAgICAgICAgIyBTYXZlIGFueSBlZ2dfaW5mbyBjb21tYW5kIGxpbmUgb3B0aW9ucyB1c2VkIHRvIGNyZWF0ZSB0aGlzIHNkaXN0CiAgICAgICAgZGVzdCA9IG9zLnBhdGguam9pbihiYXNlX2RpciwgJ3NldHVwLmNmZycpCiAgICAgICAgaWYgaGFzYXR0cihvcywgJ2xpbmsnKSBhbmQgb3MucGF0aC5leGlzdHMoZGVzdCk6CiAgICAgICAgICAgICMgdW5saW5rIGFuZCByZS1jb3B5LCBzaW5jZSBpdCBtaWdodCBiZSBoYXJkLWxpbmtlZCwgYW5kCiAgICAgICAgICAgICMgd2UgZG9uJ3Qgd2FudCB0byBjaGFuZ2UgdGhlIHNvdXJjZSB2ZXJzaW9uCiAgICAgICAgICAgIG9zLnVubGluayhkZXN0KQogICAgICAgICAgICBzZWxmLmNvcHlfZmlsZSgnc2V0dXAuY2ZnJywgZGVzdCkKCiAgICAgICAgc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2VnZ19pbmZvJykuc2F2ZV92ZXJzaW9uX2luZm8oZGVzdCkKCiAgICBkZWYgX21hbmlmZXN0X2lzX25vdF9nZW5lcmF0ZWQoc2VsZik6CiAgICAgICAgIyBjaGVjayBmb3Igc3BlY2lhbCBjb21tZW50IHVzZWQgaW4gMi43LjEgYW5kIGhpZ2hlcgogICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZmlsZShzZWxmLm1hbmlmZXN0KToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgIHdpdGggaW8ub3BlbihzZWxmLm1hbmlmZXN0LCAncmInKSBhcyBmcDoKICAgICAgICAgICAgZmlyc3RfbGluZSA9IGZwLnJlYWRsaW5lKCkKICAgICAgICByZXR1cm4gKGZpcnN0X2xpbmUgIT0KICAgICAgICAgICAgICAgICcjIGZpbGUgR0VORVJBVEVEIGJ5IGRpc3R1dGlscywgZG8gTk9UIGVkaXRcbicuZW5jb2RlKCkpCgogICAgZGVmIHJlYWRfbWFuaWZlc3Qoc2VsZik6CiAgICAgICAgIiIiUmVhZCB0aGUgbWFuaWZlc3QgZmlsZSAobmFtZWQgYnkgJ3NlbGYubWFuaWZlc3QnKSBhbmQgdXNlIGl0IHRvCiAgICAgICAgZmlsbCBpbiAnc2VsZi5maWxlbGlzdCcsIHRoZSBsaXN0IG9mIGZpbGVzIHRvIGluY2x1ZGUgaW4gdGhlIHNvdXJjZQogICAgICAgIGRpc3RyaWJ1dGlvbi4KICAgICAgICAiIiIKICAgICAgICBsb2cuaW5mbygicmVhZGluZyBtYW5pZmVzdCBmaWxlICclcyciLCBzZWxmLm1hbmlmZXN0KQogICAgICAgIG1hbmlmZXN0ID0gb3BlbihzZWxmLm1hbmlmZXN0LCAncmInKQogICAgICAgIGZvciBsaW5lIGluIG1hbmlmZXN0OgogICAgICAgICAgICAjIFRoZSBtYW5pZmVzdCBtdXN0IGNvbnRhaW4gVVRGLTguIFNlZSAjMzAzLgogICAgICAgICAgICBpZiBzaXguUFkzOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLmRlY29kZSgnVVRGLTgnKQogICAgICAgICAgICAgICAgZXhjZXB0IFVuaWNvZGVEZWNvZGVFcnJvcjoKICAgICAgICAgICAgICAgICAgICBsb2cud2FybigiJXIgbm90IFVURi04IGRlY29kYWJsZSAtLSBza2lwcGluZyIgJSBsaW5lKQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICMgaWdub3JlIGNvbW1lbnRzIGFuZCBibGFuayBsaW5lcwogICAgICAgICAgICBsaW5lID0gbGluZS5zdHJpcCgpCiAgICAgICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgnIycpIG9yIG5vdCBsaW5lOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5hcHBlbmQobGluZSkKICAgICAgICBtYW5pZmVzdC5jbG9zZSgpCgogICAgZGVmIGNoZWNrX2xpY2Vuc2Uoc2VsZik6CiAgICAgICAgIiIiQ2hlY2tzIGlmIGxpY2Vuc2VfZmlsZScgb3IgJ2xpY2Vuc2VfZmlsZXMnIGlzIGNvbmZpZ3VyZWQgYW5kIGFkZHMgYW55CiAgICAgICAgdmFsaWQgcGF0aHMgdG8gJ3NlbGYuZmlsZWxpc3QnLgogICAgICAgICIiIgoKICAgICAgICBmaWxlcyA9IG9yZGVyZWRfc2V0Lk9yZGVyZWRTZXQoKQoKICAgICAgICBvcHRzID0gc2VsZi5kaXN0cmlidXRpb24uZ2V0X29wdGlvbl9kaWN0KCdtZXRhZGF0YScpCgogICAgICAgICMgaWdub3JlIHRoZSBzb3VyY2Ugb2YgdGhlIHZhbHVlCiAgICAgICAgXywgbGljZW5zZV9maWxlID0gb3B0cy5nZXQoJ2xpY2Vuc2VfZmlsZScsIChOb25lLCBOb25lKSkKCiAgICAgICAgaWYgbGljZW5zZV9maWxlIGlzIE5vbmU6CiAgICAgICAgICAgIGxvZy5kZWJ1ZygiJ2xpY2Vuc2VfZmlsZScgb3B0aW9uIHdhcyBub3Qgc3BlY2lmaWVkIikKICAgICAgICBlbHNlOgogICAgICAgICAgICBmaWxlcy5hZGQobGljZW5zZV9maWxlKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZpbGVzLnVwZGF0ZShzZWxmLmRpc3RyaWJ1dGlvbi5tZXRhZGF0YS5saWNlbnNlX2ZpbGVzKQogICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CiAgICAgICAgICAgIGxvZy53YXJuKCJ3YXJuaW5nOiAnbGljZW5zZV9maWxlcycgb3B0aW9uIGlzIG1hbGZvcm1lZCIpCgogICAgICAgIGZvciBmIGluIGZpbGVzOgogICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZik6CiAgICAgICAgICAgICAgICBsb2cud2FybigKICAgICAgICAgICAgICAgICAgICAid2FybmluZzogRmFpbGVkIHRvIGZpbmQgdGhlIGNvbmZpZ3VyZWQgbGljZW5zZSBmaWxlICclcyciLAogICAgICAgICAgICAgICAgICAgIGYpCiAgICAgICAgICAgICAgICBmaWxlcy5yZW1vdmUoZikKCiAgICAgICAgc2VsZi5maWxlbGlzdC5leHRlbmQoZmlsZXMpClBLAwQUAAAAAAAAACEAm3DLx90TAADdEwAAQQAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2NvbW1hbmQvc2V0b3B0LnB5ZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgY29udmVydF9wYXRoCmZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNPcHRpb25FcnJvcgppbXBvcnQgZGlzdHV0aWxzCmltcG9ydCBvcwoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5zaXgubW92ZXMgaW1wb3J0IGNvbmZpZ3BhcnNlcgoKZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBDb21tYW5kCgpfX2FsbF9fID0gWydjb25maWdfZmlsZScsICdlZGl0X2NvbmZpZycsICdvcHRpb25fYmFzZScsICdzZXRvcHQnXQoKCmRlZiBjb25maWdfZmlsZShraW5kPSJsb2NhbCIpOgogICAgIiIiR2V0IHRoZSBmaWxlbmFtZSBvZiB0aGUgZGlzdHV0aWxzLCBsb2NhbCwgZ2xvYmFsLCBvciBwZXItdXNlciBjb25maWcKCiAgICBga2luZGAgbXVzdCBiZSBvbmUgb2YgImxvY2FsIiwgImdsb2JhbCIsIG9yICJ1c2VyIgogICAgIiIiCiAgICBpZiBraW5kID09ICdsb2NhbCc6CiAgICAgICAgcmV0dXJuICdzZXR1cC5jZmcnCiAgICBpZiBraW5kID09ICdnbG9iYWwnOgogICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgIG9zLnBhdGguZGlybmFtZShkaXN0dXRpbHMuX19maWxlX18pLCAnZGlzdHV0aWxzLmNmZycKICAgICAgICApCiAgICBpZiBraW5kID09ICd1c2VyJzoKICAgICAgICBkb3QgPSBvcy5uYW1lID09ICdwb3NpeCcgYW5kICcuJyBvciAnJwogICAgICAgIHJldHVybiBvcy5wYXRoLmV4cGFuZHVzZXIoY29udmVydF9wYXRoKCJ+LyVzcHlkaXN0dXRpbHMuY2ZnIiAlIGRvdCkpCiAgICByYWlzZSBWYWx1ZUVycm9yKAogICAgICAgICJjb25maWdfZmlsZSgpIHR5cGUgbXVzdCBiZSAnbG9jYWwnLCAnZ2xvYmFsJywgb3IgJ3VzZXInIiwga2luZAogICAgKQoKCmRlZiBlZGl0X2NvbmZpZyhmaWxlbmFtZSwgc2V0dGluZ3MsIGRyeV9ydW49RmFsc2UpOgogICAgIiIiRWRpdCBhIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBpbmNsdWRlIGBzZXR0aW5nc2AKCiAgICBgc2V0dGluZ3NgIGlzIGEgZGljdGlvbmFyeSBvZiBkaWN0aW9uYXJpZXMgb3IgYGBOb25lYGAgdmFsdWVzLCBrZXllZCBieQogICAgY29tbWFuZC9zZWN0aW9uIG5hbWUuICBBIGBgTm9uZWBgIHZhbHVlIG1lYW5zIHRvIGRlbGV0ZSB0aGUgZW50aXJlIHNlY3Rpb24sCiAgICB3aGlsZSBhIGRpY3Rpb25hcnkgbGlzdHMgc2V0dGluZ3MgdG8gYmUgY2hhbmdlZCBvciBkZWxldGVkIGluIHRoYXQgc2VjdGlvbi4KICAgIEEgc2V0dGluZyBvZiBgYE5vbmVgYCBtZWFucyB0byBkZWxldGUgdGhhdCBzZXR0aW5nLgogICAgIiIiCiAgICBsb2cuZGVidWcoIlJlYWRpbmcgY29uZmlndXJhdGlvbiBmcm9tICVzIiwgZmlsZW5hbWUpCiAgICBvcHRzID0gY29uZmlncGFyc2VyLlJhd0NvbmZpZ1BhcnNlcigpCiAgICBvcHRzLnJlYWQoW2ZpbGVuYW1lXSkKICAgIGZvciBzZWN0aW9uLCBvcHRpb25zIGluIHNldHRpbmdzLml0ZW1zKCk6CiAgICAgICAgaWYgb3B0aW9ucyBpcyBOb25lOgogICAgICAgICAgICBsb2cuaW5mbygiRGVsZXRpbmcgc2VjdGlvbiBbJXNdIGZyb20gJXMiLCBzZWN0aW9uLCBmaWxlbmFtZSkKICAgICAgICAgICAgb3B0cy5yZW1vdmVfc2VjdGlvbihzZWN0aW9uKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIG5vdCBvcHRzLmhhc19zZWN0aW9uKHNlY3Rpb24pOgogICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBZGRpbmcgbmV3IHNlY3Rpb24gWyVzXSB0byAlcyIsIHNlY3Rpb24sIGZpbGVuYW1lKQogICAgICAgICAgICAgICAgb3B0cy5hZGRfc2VjdGlvbihzZWN0aW9uKQogICAgICAgICAgICBmb3Igb3B0aW9uLCB2YWx1ZSBpbiBvcHRpb25zLml0ZW1zKCk6CiAgICAgICAgICAgICAgICBpZiB2YWx1ZSBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygKICAgICAgICAgICAgICAgICAgICAgICAgIkRlbGV0aW5nICVzLiVzIGZyb20gJXMiLAogICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uLCBvcHRpb24sIGZpbGVuYW1lCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIG9wdHMucmVtb3ZlX29wdGlvbihzZWN0aW9uLCBvcHRpb24pCiAgICAgICAgICAgICAgICAgICAgaWYgbm90IG9wdHMub3B0aW9ucyhzZWN0aW9uKToKICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oIkRlbGV0aW5nIGVtcHR5IFslc10gc2VjdGlvbiBmcm9tICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbiwgZmlsZW5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgIG9wdHMucmVtb3ZlX3NlY3Rpb24oc2VjdGlvbikKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKAogICAgICAgICAgICAgICAgICAgICAgICAiU2V0dGluZyAlcy4lcyB0byAlciBpbiAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24sIG9wdGlvbiwgdmFsdWUsIGZpbGVuYW1lCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIG9wdHMuc2V0KHNlY3Rpb24sIG9wdGlvbiwgdmFsdWUpCgogICAgbG9nLmluZm8oIldyaXRpbmcgJXMiLCBmaWxlbmFtZSkKICAgIGlmIG5vdCBkcnlfcnVuOgogICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgJ3cnKSBhcyBmOgogICAgICAgICAgICBvcHRzLndyaXRlKGYpCgoKY2xhc3Mgb3B0aW9uX2Jhc2UoQ29tbWFuZCk6CiAgICAiIiJBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBjb21tYW5kcyB0aGF0IG1lc3Mgd2l0aCBjb25maWcgZmlsZXMiIiIKCiAgICB1c2VyX29wdGlvbnMgPSBbCiAgICAgICAgKCdnbG9iYWwtY29uZmlnJywgJ2cnLAogICAgICAgICAic2F2ZSBvcHRpb25zIHRvIHRoZSBzaXRlLXdpZGUgZGlzdHV0aWxzLmNmZyBmaWxlIiksCiAgICAgICAgKCd1c2VyLWNvbmZpZycsICd1JywKICAgICAgICAgInNhdmUgb3B0aW9ucyB0byB0aGUgY3VycmVudCB1c2VyJ3MgcHlkaXN0dXRpbHMuY2ZnIGZpbGUiKSwKICAgICAgICAoJ2ZpbGVuYW1lPScsICdmJywKICAgICAgICAgImNvbmZpZ3VyYXRpb24gZmlsZSB0byB1c2UgKGRlZmF1bHQ9c2V0dXAuY2ZnKSIpLAogICAgXQoKICAgIGJvb2xlYW5fb3B0aW9ucyA9IFsKICAgICAgICAnZ2xvYmFsLWNvbmZpZycsICd1c2VyLWNvbmZpZycsCiAgICBdCgogICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBzZWxmLmdsb2JhbF9jb25maWcgPSBOb25lCiAgICAgICAgc2VsZi51c2VyX2NvbmZpZyA9IE5vbmUKICAgICAgICBzZWxmLmZpbGVuYW1lID0gTm9uZQoKICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIGZpbGVuYW1lcyA9IFtdCiAgICAgICAgaWYgc2VsZi5nbG9iYWxfY29uZmlnOgogICAgICAgICAgICBmaWxlbmFtZXMuYXBwZW5kKGNvbmZpZ19maWxlKCdnbG9iYWwnKSkKICAgICAgICBpZiBzZWxmLnVzZXJfY29uZmlnOgogICAgICAgICAgICBmaWxlbmFtZXMuYXBwZW5kKGNvbmZpZ19maWxlKCd1c2VyJykpCiAgICAgICAgaWYgc2VsZi5maWxlbmFtZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgZmlsZW5hbWVzLmFwcGVuZChzZWxmLmZpbGVuYW1lKQogICAgICAgIGlmIG5vdCBmaWxlbmFtZXM6CiAgICAgICAgICAgIGZpbGVuYW1lcy5hcHBlbmQoY29uZmlnX2ZpbGUoJ2xvY2FsJykpCiAgICAgICAgaWYgbGVuKGZpbGVuYW1lcykgPiAxOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigKICAgICAgICAgICAgICAgICJNdXN0IHNwZWNpZnkgb25seSBvbmUgY29uZmlndXJhdGlvbiBmaWxlIG9wdGlvbiIsCiAgICAgICAgICAgICAgICBmaWxlbmFtZXMKICAgICAgICAgICAgKQogICAgICAgIHNlbGYuZmlsZW5hbWUsID0gZmlsZW5hbWVzCgoKY2xhc3Mgc2V0b3B0KG9wdGlvbl9iYXNlKToKICAgICIiIlNhdmUgY29tbWFuZC1saW5lIG9wdGlvbnMgdG8gYSBmaWxlIiIiCgogICAgZGVzY3JpcHRpb24gPSAic2V0IGFuIG9wdGlvbiBpbiBzZXR1cC5jZmcgb3IgYW5vdGhlciBjb25maWcgZmlsZSIKCiAgICB1c2VyX29wdGlvbnMgPSBbCiAgICAgICAgKCdjb21tYW5kPScsICdjJywgJ2NvbW1hbmQgdG8gc2V0IGFuIG9wdGlvbiBmb3InKSwKICAgICAgICAoJ29wdGlvbj0nLCAnbycsICdvcHRpb24gdG8gc2V0JyksCiAgICAgICAgKCdzZXQtdmFsdWU9JywgJ3MnLCAndmFsdWUgb2YgdGhlIG9wdGlvbicpLAogICAgICAgICgncmVtb3ZlJywgJ3InLCAncmVtb3ZlICh1bnNldCkgdGhlIHZhbHVlJyksCiAgICBdICsgb3B0aW9uX2Jhc2UudXNlcl9vcHRpb25zCgogICAgYm9vbGVhbl9vcHRpb25zID0gb3B0aW9uX2Jhc2UuYm9vbGVhbl9vcHRpb25zICsgWydyZW1vdmUnXQoKICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgb3B0aW9uX2Jhc2UuaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpCiAgICAgICAgc2VsZi5jb21tYW5kID0gTm9uZQogICAgICAgIHNlbGYub3B0aW9uID0gTm9uZQogICAgICAgIHNlbGYuc2V0X3ZhbHVlID0gTm9uZQogICAgICAgIHNlbGYucmVtb3ZlID0gTm9uZQoKICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIG9wdGlvbl9iYXNlLmZpbmFsaXplX29wdGlvbnMoc2VsZikKICAgICAgICBpZiBzZWxmLmNvbW1hbmQgaXMgTm9uZSBvciBzZWxmLm9wdGlvbiBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigiTXVzdCBzcGVjaWZ5IC0tY29tbWFuZCAqYW5kKiAtLW9wdGlvbiIpCiAgICAgICAgaWYgc2VsZi5zZXRfdmFsdWUgaXMgTm9uZSBhbmQgbm90IHNlbGYucmVtb3ZlOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigiTXVzdCBzcGVjaWZ5IC0tc2V0LXZhbHVlIG9yIC0tcmVtb3ZlIikKCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgIGVkaXRfY29uZmlnKAogICAgICAgICAgICBzZWxmLmZpbGVuYW1lLCB7CiAgICAgICAgICAgICAgICBzZWxmLmNvbW1hbmQ6IHtzZWxmLm9wdGlvbi5yZXBsYWNlKCctJywgJ18nKTogc2VsZi5zZXRfdmFsdWV9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHNlbGYuZHJ5X3J1bgogICAgICAgICkKUEsDBBQAAAAAAAAAIQDdlpzPgiUAAIIlAAA/AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvY29tbWFuZC90ZXN0LnB5aW1wb3J0IG9zCmltcG9ydCBvcGVyYXRvcgppbXBvcnQgc3lzCmltcG9ydCBjb250ZXh0bGliCmltcG9ydCBpdGVydG9vbHMKaW1wb3J0IHVuaXR0ZXN0CmZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzRXJyb3IsIERpc3R1dGlsc09wdGlvbkVycm9yCmZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKZnJvbSB1bml0dGVzdCBpbXBvcnQgVGVzdExvYWRlcgoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybiBpbXBvcnQgc2l4CmZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4Lm1vdmVzIGltcG9ydCBtYXAsIGZpbHRlcgoKZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCAocmVzb3VyY2VfbGlzdGRpciwgcmVzb3VyY2VfZXhpc3RzLCBub3JtYWxpemVfcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2luZ19zZXQsIF9uYW1lc3BhY2VfcGFja2FnZXMsIGV2YWx1YXRlX21hcmtlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX2FjdGl2YXRpb25fbGlzdGVuZXIsIHJlcXVpcmUsIEVudHJ5UG9pbnQpCmZyb20gc2V0dXB0b29scyBpbXBvcnQgQ29tbWFuZApmcm9tIC5idWlsZF9weSBpbXBvcnQgX3VuaXF1ZV9ldmVyc2VlbgoKX19tZXRhY2xhc3NfXyA9IHR5cGUKCgpjbGFzcyBTY2FubmluZ0xvYWRlcihUZXN0TG9hZGVyKToKCiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgVGVzdExvYWRlci5fX2luaXRfXyhzZWxmKQogICAgICAgIHNlbGYuX3Zpc2l0ZWQgPSBzZXQoKQoKICAgIGRlZiBsb2FkVGVzdHNGcm9tTW9kdWxlKHNlbGYsIG1vZHVsZSwgcGF0dGVybj1Ob25lKToKICAgICAgICAiIiJSZXR1cm4gYSBzdWl0ZSBvZiBhbGwgdGVzdHMgY2FzZXMgY29udGFpbmVkIGluIHRoZSBnaXZlbiBtb2R1bGUKCiAgICAgICAgSWYgdGhlIG1vZHVsZSBpcyBhIHBhY2thZ2UsIGxvYWQgdGVzdHMgZnJvbSBhbGwgdGhlIG1vZHVsZXMgaW4gaXQuCiAgICAgICAgSWYgdGhlIG1vZHVsZSBoYXMgYW4gYGBhZGRpdGlvbmFsX3Rlc3RzYGAgZnVuY3Rpb24sIGNhbGwgaXQgYW5kIGFkZAogICAgICAgIHRoZSByZXR1cm4gdmFsdWUgdG8gdGhlIHRlc3RzLgogICAgICAgICIiIgogICAgICAgIGlmIG1vZHVsZSBpbiBzZWxmLl92aXNpdGVkOgogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIHNlbGYuX3Zpc2l0ZWQuYWRkKG1vZHVsZSkKCiAgICAgICAgdGVzdHMgPSBbXQogICAgICAgIHRlc3RzLmFwcGVuZChUZXN0TG9hZGVyLmxvYWRUZXN0c0Zyb21Nb2R1bGUoc2VsZiwgbW9kdWxlKSkKCiAgICAgICAgaWYgaGFzYXR0cihtb2R1bGUsICJhZGRpdGlvbmFsX3Rlc3RzIik6CiAgICAgICAgICAgIHRlc3RzLmFwcGVuZChtb2R1bGUuYWRkaXRpb25hbF90ZXN0cygpKQoKICAgICAgICBpZiBoYXNhdHRyKG1vZHVsZSwgJ19fcGF0aF9fJyk6CiAgICAgICAgICAgIGZvciBmaWxlIGluIHJlc291cmNlX2xpc3RkaXIobW9kdWxlLl9fbmFtZV9fLCAnJyk6CiAgICAgICAgICAgICAgICBpZiBmaWxlLmVuZHN3aXRoKCcucHknKSBhbmQgZmlsZSAhPSAnX19pbml0X18ucHknOgogICAgICAgICAgICAgICAgICAgIHN1Ym1vZHVsZSA9IG1vZHVsZS5fX25hbWVfXyArICcuJyArIGZpbGVbOi0zXQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBpZiByZXNvdXJjZV9leGlzdHMobW9kdWxlLl9fbmFtZV9fLCBmaWxlICsgJy9fX2luaXRfXy5weScpOgogICAgICAgICAgICAgICAgICAgICAgICBzdWJtb2R1bGUgPSBtb2R1bGUuX19uYW1lX18gKyAnLicgKyBmaWxlCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIHRlc3RzLmFwcGVuZChzZWxmLmxvYWRUZXN0c0Zyb21OYW1lKHN1Ym1vZHVsZSkpCgogICAgICAgIGlmIGxlbih0ZXN0cykgIT0gMToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuc3VpdGVDbGFzcyh0ZXN0cykKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gdGVzdHNbMF0gICMgZG9uJ3QgY3JlYXRlIGEgbmVzdGVkIHN1aXRlIGZvciBvbmx5IG9uZSByZXR1cm4KCgojIGFkYXB0ZWQgZnJvbSBqYXJhY28uY2xhc3Nlcy5wcm9wZXJ0aWVzOk5vbkRhdGFQcm9wZXJ0eQpjbGFzcyBOb25EYXRhUHJvcGVydHk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgZmdldCk6CiAgICAgICAgc2VsZi5mZ2V0ID0gZmdldAoKICAgIGRlZiBfX2dldF9fKHNlbGYsIG9iaiwgb2JqdHlwZT1Ob25lKToKICAgICAgICBpZiBvYmogaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYKICAgICAgICByZXR1cm4gc2VsZi5mZ2V0KG9iaikKCgpjbGFzcyB0ZXN0KENvbW1hbmQpOgogICAgIiIiQ29tbWFuZCB0byBydW4gdW5pdCB0ZXN0cyBhZnRlciBpbi1wbGFjZSBidWlsZCIiIgoKICAgIGRlc2NyaXB0aW9uID0gInJ1biB1bml0IHRlc3RzIGFmdGVyIGluLXBsYWNlIGJ1aWxkIChkZXByZWNhdGVkKSIKCiAgICB1c2VyX29wdGlvbnMgPSBbCiAgICAgICAgKCd0ZXN0LW1vZHVsZT0nLCAnbScsICJSdW4gJ3Rlc3Rfc3VpdGUnIGluIHNwZWNpZmllZCBtb2R1bGUiKSwKICAgICAgICAoJ3Rlc3Qtc3VpdGU9JywgJ3MnLAogICAgICAgICAiUnVuIHNpbmdsZSB0ZXN0LCBjYXNlIG9yIHN1aXRlIChlLmcuICdtb2R1bGUudGVzdF9zdWl0ZScpIiksCiAgICAgICAgKCd0ZXN0LXJ1bm5lcj0nLCAncicsICJUZXN0IHJ1bm5lciB0byB1c2UiKSwKICAgIF0KCiAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIHNlbGYudGVzdF9zdWl0ZSA9IE5vbmUKICAgICAgICBzZWxmLnRlc3RfbW9kdWxlID0gTm9uZQogICAgICAgIHNlbGYudGVzdF9sb2FkZXIgPSBOb25lCiAgICAgICAgc2VsZi50ZXN0X3J1bm5lciA9IE5vbmUKCiAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKCiAgICAgICAgaWYgc2VsZi50ZXN0X3N1aXRlIGFuZCBzZWxmLnRlc3RfbW9kdWxlOgogICAgICAgICAgICBtc2cgPSAiWW91IG1heSBzcGVjaWZ5IGEgbW9kdWxlIG9yIGEgc3VpdGUsIGJ1dCBub3QgYm90aCIKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IobXNnKQoKICAgICAgICBpZiBzZWxmLnRlc3Rfc3VpdGUgaXMgTm9uZToKICAgICAgICAgICAgaWYgc2VsZi50ZXN0X21vZHVsZSBpcyBOb25lOgogICAgICAgICAgICAgICAgc2VsZi50ZXN0X3N1aXRlID0gc2VsZi5kaXN0cmlidXRpb24udGVzdF9zdWl0ZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi50ZXN0X3N1aXRlID0gc2VsZi50ZXN0X21vZHVsZSArICIudGVzdF9zdWl0ZSIKCiAgICAgICAgaWYgc2VsZi50ZXN0X2xvYWRlciBpcyBOb25lOgogICAgICAgICAgICBzZWxmLnRlc3RfbG9hZGVyID0gZ2V0YXR0cihzZWxmLmRpc3RyaWJ1dGlvbiwgJ3Rlc3RfbG9hZGVyJywgTm9uZSkKICAgICAgICBpZiBzZWxmLnRlc3RfbG9hZGVyIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYudGVzdF9sb2FkZXIgPSAic2V0dXB0b29scy5jb21tYW5kLnRlc3Q6U2Nhbm5pbmdMb2FkZXIiCiAgICAgICAgaWYgc2VsZi50ZXN0X3J1bm5lciBpcyBOb25lOgogICAgICAgICAgICBzZWxmLnRlc3RfcnVubmVyID0gZ2V0YXR0cihzZWxmLmRpc3RyaWJ1dGlvbiwgJ3Rlc3RfcnVubmVyJywgTm9uZSkKCiAgICBATm9uRGF0YVByb3BlcnR5CiAgICBkZWYgdGVzdF9hcmdzKHNlbGYpOgogICAgICAgIHJldHVybiBsaXN0KHNlbGYuX3Rlc3RfYXJncygpKQoKICAgIGRlZiBfdGVzdF9hcmdzKHNlbGYpOgogICAgICAgIGlmIG5vdCBzZWxmLnRlc3Rfc3VpdGUgYW5kIHN5cy52ZXJzaW9uX2luZm8gPj0gKDIsIDcpOgogICAgICAgICAgICB5aWVsZCAnZGlzY292ZXInCiAgICAgICAgaWYgc2VsZi52ZXJib3NlOgogICAgICAgICAgICB5aWVsZCAnLS12ZXJib3NlJwogICAgICAgIGlmIHNlbGYudGVzdF9zdWl0ZToKICAgICAgICAgICAgeWllbGQgc2VsZi50ZXN0X3N1aXRlCgogICAgZGVmIHdpdGhfcHJvamVjdF9vbl9zeXNfcGF0aChzZWxmLCBmdW5jKToKICAgICAgICAiIiIKICAgICAgICBCYWNrd2FyZCBjb21wYXRpYmlsaXR5IGZvciBwcm9qZWN0X29uX3N5c19wYXRoIGNvbnRleHQuCiAgICAgICAgIiIiCiAgICAgICAgd2l0aCBzZWxmLnByb2plY3Rfb25fc3lzX3BhdGgoKToKICAgICAgICAgICAgZnVuYygpCgogICAgQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKICAgIGRlZiBwcm9qZWN0X29uX3N5c19wYXRoKHNlbGYsIGluY2x1ZGVfZGlzdHM9W10pOgogICAgICAgIHdpdGhfMnRvMyA9IHNpeC5QWTMgYW5kIGdldGF0dHIoc2VsZi5kaXN0cmlidXRpb24sICd1c2VfMnRvMycsIEZhbHNlKQoKICAgICAgICBpZiB3aXRoXzJ0bzM6CiAgICAgICAgICAgICMgSWYgd2UgcnVuIDJ0bzMgd2UgY2FuIG5vdCBkbyB0aGlzIGlucGxhY2U6CgogICAgICAgICAgICAjIEVuc3VyZSBtZXRhZGF0YSBpcyB1cC10by1kYXRlCiAgICAgICAgICAgIHNlbGYucmVpbml0aWFsaXplX2NvbW1hbmQoJ2J1aWxkX3B5JywgaW5wbGFjZT0wKQogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdidWlsZF9weScpCiAgICAgICAgICAgIGJweV9jbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgiYnVpbGRfcHkiKQogICAgICAgICAgICBidWlsZF9wYXRoID0gbm9ybWFsaXplX3BhdGgoYnB5X2NtZC5idWlsZF9saWIpCgogICAgICAgICAgICAjIEJ1aWxkIGV4dGVuc2lvbnMKICAgICAgICAgICAgc2VsZi5yZWluaXRpYWxpemVfY29tbWFuZCgnZWdnX2luZm8nLCBlZ2dfYmFzZT1idWlsZF9wYXRoKQogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdlZ2dfaW5mbycpCgogICAgICAgICAgICBzZWxmLnJlaW5pdGlhbGl6ZV9jb21tYW5kKCdidWlsZF9leHQnLCBpbnBsYWNlPTApCiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2J1aWxkX2V4dCcpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBXaXRob3V0IDJ0bzMgaW5wbGFjZSB3b3JrcyBmaW5lOgogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdlZ2dfaW5mbycpCgogICAgICAgICAgICAjIEJ1aWxkIGV4dGVuc2lvbnMgaW4tcGxhY2UKICAgICAgICAgICAgc2VsZi5yZWluaXRpYWxpemVfY29tbWFuZCgnYnVpbGRfZXh0JywgaW5wbGFjZT0xKQogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdidWlsZF9leHQnKQoKICAgICAgICBlaV9jbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgiZWdnX2luZm8iKQoKICAgICAgICBvbGRfcGF0aCA9IHN5cy5wYXRoWzpdCiAgICAgICAgb2xkX21vZHVsZXMgPSBzeXMubW9kdWxlcy5jb3B5KCkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBwcm9qZWN0X3BhdGggPSBub3JtYWxpemVfcGF0aChlaV9jbWQuZWdnX2Jhc2UpCiAgICAgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBwcm9qZWN0X3BhdGgpCiAgICAgICAgICAgIHdvcmtpbmdfc2V0Ll9faW5pdF9fKCkKICAgICAgICAgICAgYWRkX2FjdGl2YXRpb25fbGlzdGVuZXIobGFtYmRhIGRpc3Q6IGRpc3QuYWN0aXZhdGUoKSkKICAgICAgICAgICAgcmVxdWlyZSgnJXM9PSVzJyAlIChlaV9jbWQuZWdnX25hbWUsIGVpX2NtZC5lZ2dfdmVyc2lvbikpCiAgICAgICAgICAgIHdpdGggc2VsZi5wYXRoc19vbl9weXRob25wYXRoKFtwcm9qZWN0X3BhdGhdKToKICAgICAgICAgICAgICAgIHlpZWxkCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgc3lzLnBhdGhbOl0gPSBvbGRfcGF0aAogICAgICAgICAgICBzeXMubW9kdWxlcy5jbGVhcigpCiAgICAgICAgICAgIHN5cy5tb2R1bGVzLnVwZGF0ZShvbGRfbW9kdWxlcykKICAgICAgICAgICAgd29ya2luZ19zZXQuX19pbml0X18oKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIEBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCiAgICBkZWYgcGF0aHNfb25fcHl0aG9ucGF0aChwYXRocyk6CiAgICAgICAgIiIiCiAgICAgICAgQWRkIHRoZSBpbmRpY2F0ZWQgcGF0aHMgdG8gdGhlIGhlYWQgb2YgdGhlIFBZVEhPTlBBVEggZW52aXJvbm1lbnQKICAgICAgICB2YXJpYWJsZSBzbyB0aGF0IHN1YnByb2Nlc3NlcyB3aWxsIGFsc28gc2VlIHRoZSBwYWNrYWdlcyBhdAogICAgICAgIHRoZXNlIHBhdGhzLgoKICAgICAgICBEbyB0aGlzIGluIGEgY29udGV4dCB0aGF0IHJlc3RvcmVzIHRoZSB2YWx1ZSBvbiBleGl0LgogICAgICAgICIiIgogICAgICAgIG5vdGhpbmcgPSBvYmplY3QoKQogICAgICAgIG9yaWdfcHl0aG9ucGF0aCA9IG9zLmVudmlyb24uZ2V0KCdQWVRIT05QQVRIJywgbm90aGluZykKICAgICAgICBjdXJyZW50X3B5dGhvbnBhdGggPSBvcy5lbnZpcm9uLmdldCgnUFlUSE9OUEFUSCcsICcnKQogICAgICAgIHRyeToKICAgICAgICAgICAgcHJlZml4ID0gb3MucGF0aHNlcC5qb2luKF91bmlxdWVfZXZlcnNlZW4ocGF0aHMpKQogICAgICAgICAgICB0b19qb2luID0gZmlsdGVyKE5vbmUsIFtwcmVmaXgsIGN1cnJlbnRfcHl0aG9ucGF0aF0pCiAgICAgICAgICAgIG5ld19wYXRoID0gb3MucGF0aHNlcC5qb2luKHRvX2pvaW4pCiAgICAgICAgICAgIGlmIG5ld19wYXRoOgogICAgICAgICAgICAgICAgb3MuZW52aXJvblsnUFlUSE9OUEFUSCddID0gbmV3X3BhdGgKICAgICAgICAgICAgeWllbGQKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBpZiBvcmlnX3B5dGhvbnBhdGggaXMgbm90aGluZzoKICAgICAgICAgICAgICAgIG9zLmVudmlyb24ucG9wKCdQWVRIT05QQVRIJywgTm9uZSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIG9zLmVudmlyb25bJ1BZVEhPTlBBVEgnXSA9IG9yaWdfcHl0aG9ucGF0aAoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBpbnN0YWxsX2Rpc3RzKGRpc3QpOgogICAgICAgICIiIgogICAgICAgIEluc3RhbGwgdGhlIHJlcXVpcmVtZW50cyBpbmRpY2F0ZWQgYnkgc2VsZi5kaXN0cmlidXRpb24gYW5kCiAgICAgICAgcmV0dXJuIGFuIGl0ZXJhYmxlIG9mIHRoZSBkaXN0cyB0aGF0IHdlcmUgYnVpbHQuCiAgICAgICAgIiIiCiAgICAgICAgaXJfZCA9IGRpc3QuZmV0Y2hfYnVpbGRfZWdncyhkaXN0Lmluc3RhbGxfcmVxdWlyZXMpCiAgICAgICAgdHJfZCA9IGRpc3QuZmV0Y2hfYnVpbGRfZWdncyhkaXN0LnRlc3RzX3JlcXVpcmUgb3IgW10pCiAgICAgICAgZXJfZCA9IGRpc3QuZmV0Y2hfYnVpbGRfZWdncygKICAgICAgICAgICAgdiBmb3IgaywgdiBpbiBkaXN0LmV4dHJhc19yZXF1aXJlLml0ZW1zKCkKICAgICAgICAgICAgaWYgay5zdGFydHN3aXRoKCc6JykgYW5kIGV2YWx1YXRlX21hcmtlcihrWzE6XSkKICAgICAgICApCiAgICAgICAgcmV0dXJuIGl0ZXJ0b29scy5jaGFpbihpcl9kLCB0cl9kLCBlcl9kKQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgc2VsZi5hbm5vdW5jZSgKICAgICAgICAgICAgIldBUk5JTkc6IFRlc3RpbmcgdmlhIHRoaXMgY29tbWFuZCBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlICIKICAgICAgICAgICAgInJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbi4gVXNlcnMgbG9va2luZyBmb3IgYSBnZW5lcmljIHRlc3QgIgogICAgICAgICAgICAiZW50cnkgcG9pbnQgaW5kZXBlbmRlbnQgb2YgdGVzdCBydW5uZXIgYXJlIGVuY291cmFnZWQgdG8gdXNlICIKICAgICAgICAgICAgInRveC4iLAogICAgICAgICAgICBsb2cuV0FSTiwKICAgICAgICApCgogICAgICAgIGluc3RhbGxlZF9kaXN0cyA9IHNlbGYuaW5zdGFsbF9kaXN0cyhzZWxmLmRpc3RyaWJ1dGlvbikKCiAgICAgICAgY21kID0gJyAnLmpvaW4oc2VsZi5fYXJndikKICAgICAgICBpZiBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgIHNlbGYuYW5ub3VuY2UoJ3NraXBwaW5nICIlcyIgKGRyeSBydW4pJyAlIGNtZCkKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHNlbGYuYW5ub3VuY2UoJ3J1bm5pbmcgIiVzIicgJSBjbWQpCgogICAgICAgIHBhdGhzID0gbWFwKG9wZXJhdG9yLmF0dHJnZXR0ZXIoJ2xvY2F0aW9uJyksIGluc3RhbGxlZF9kaXN0cykKICAgICAgICB3aXRoIHNlbGYucGF0aHNfb25fcHl0aG9ucGF0aChwYXRocyk6CiAgICAgICAgICAgIHdpdGggc2VsZi5wcm9qZWN0X29uX3N5c19wYXRoKCk6CiAgICAgICAgICAgICAgICBzZWxmLnJ1bl90ZXN0cygpCgogICAgZGVmIHJ1bl90ZXN0cyhzZWxmKToKICAgICAgICAjIFB1cmdlIG1vZHVsZXMgdW5kZXIgdGVzdCBmcm9tIHN5cy5tb2R1bGVzLiBUaGUgdGVzdCBsb2FkZXIgd2lsbAogICAgICAgICMgcmUtaW1wb3J0IHRoZW0gZnJvbSB0aGUgYnVpbGQgbG9jYXRpb24uIFJlcXVpcmVkIHdoZW4gMnRvMyBpcyB1c2VkCiAgICAgICAgIyB3aXRoIG5hbWVzcGFjZSBwYWNrYWdlcy4KICAgICAgICBpZiBzaXguUFkzIGFuZCBnZXRhdHRyKHNlbGYuZGlzdHJpYnV0aW9uLCAndXNlXzJ0bzMnLCBGYWxzZSk6CiAgICAgICAgICAgIG1vZHVsZSA9IHNlbGYudGVzdF9zdWl0ZS5zcGxpdCgnLicpWzBdCiAgICAgICAgICAgIGlmIG1vZHVsZSBpbiBfbmFtZXNwYWNlX3BhY2thZ2VzOgogICAgICAgICAgICAgICAgZGVsX21vZHVsZXMgPSBbXQogICAgICAgICAgICAgICAgaWYgbW9kdWxlIGluIHN5cy5tb2R1bGVzOgogICAgICAgICAgICAgICAgICAgIGRlbF9tb2R1bGVzLmFwcGVuZChtb2R1bGUpCiAgICAgICAgICAgICAgICBtb2R1bGUgKz0gJy4nCiAgICAgICAgICAgICAgICBmb3IgbmFtZSBpbiBzeXMubW9kdWxlczoKICAgICAgICAgICAgICAgICAgICBpZiBuYW1lLnN0YXJ0c3dpdGgobW9kdWxlKToKICAgICAgICAgICAgICAgICAgICAgICAgZGVsX21vZHVsZXMuYXBwZW5kKG5hbWUpCiAgICAgICAgICAgICAgICBsaXN0KG1hcChzeXMubW9kdWxlcy5fX2RlbGl0ZW1fXywgZGVsX21vZHVsZXMpKQoKICAgICAgICB0ZXN0ID0gdW5pdHRlc3QubWFpbigKICAgICAgICAgICAgTm9uZSwgTm9uZSwgc2VsZi5fYXJndiwKICAgICAgICAgICAgdGVzdExvYWRlcj1zZWxmLl9yZXNvbHZlX2FzX2VwKHNlbGYudGVzdF9sb2FkZXIpLAogICAgICAgICAgICB0ZXN0UnVubmVyPXNlbGYuX3Jlc29sdmVfYXNfZXAoc2VsZi50ZXN0X3J1bm5lciksCiAgICAgICAgICAgIGV4aXQ9RmFsc2UsCiAgICAgICAgKQogICAgICAgIGlmIG5vdCB0ZXN0LnJlc3VsdC53YXNTdWNjZXNzZnVsKCk6CiAgICAgICAgICAgIG1zZyA9ICdUZXN0IGZhaWxlZDogJXMnICUgdGVzdC5yZXN1bHQKICAgICAgICAgICAgc2VsZi5hbm5vdW5jZShtc2csIGxvZy5FUlJPUikKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IobXNnKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIF9hcmd2KHNlbGYpOgogICAgICAgIHJldHVybiBbJ3VuaXR0ZXN0J10gKyBzZWxmLnRlc3RfYXJncwoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfcmVzb2x2ZV9hc19lcCh2YWwpOgogICAgICAgICIiIgogICAgICAgIExvYWQgdGhlIGluZGljYXRlZCBhdHRyaWJ1dGUgdmFsdWUsIGNhbGxlZCwgYXMgYSBhcyBpZiBpdCB3ZXJlCiAgICAgICAgc3BlY2lmaWVkIGFzIGFuIGVudHJ5IHBvaW50LgogICAgICAgICIiIgogICAgICAgIGlmIHZhbCBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBwYXJzZWQgPSBFbnRyeVBvaW50LnBhcnNlKCJ4PSIgKyB2YWwpCiAgICAgICAgcmV0dXJuIHBhcnNlZC5yZXNvbHZlKCkoKQpQSwMEFAAAAAAAAAAhACIAXUvOAQAAzgEAAEEAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9jb21tYW5kL3VwbG9hZC5weWZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKZnJvbSBkaXN0dXRpbHMuY29tbWFuZCBpbXBvcnQgdXBsb2FkIGFzIG9yaWcKCmZyb20gc2V0dXB0b29scy5lcnJvcnMgaW1wb3J0IFJlbW92ZWRDb21tYW5kRXJyb3IKCgpjbGFzcyB1cGxvYWQob3JpZy51cGxvYWQpOgogICAgIiIiRm9ybWVybHkgdXNlZCB0byB1cGxvYWQgcGFja2FnZXMgdG8gUHlQSS4iIiIKCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgIG1zZyA9ICgKICAgICAgICAgICAgIlRoZSB1cGxvYWQgY29tbWFuZCBoYXMgYmVlbiByZW1vdmVkLCB1c2UgdHdpbmUgdG8gdXBsb2FkICIKICAgICAgICAgICAgKyAiaW5zdGVhZCAoaHR0cHM6Ly9weXBpLm9yZy9wL3R3aW5lKSIKICAgICAgICApCgogICAgICAgIHNlbGYuYW5ub3VuY2UoIkVSUk9SOiAiICsgbXNnLCBsb2cuRVJST1IpCiAgICAgICAgcmFpc2UgUmVtb3ZlZENvbW1hbmRFcnJvcihtc2cpClBLAwQUAAAAAAAAACEA8pfzxo8cAACPHAAARgAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2NvbW1hbmQvdXBsb2FkX2RvY3MucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQoiIiJ1cGxvYWRfZG9jcwoKSW1wbGVtZW50cyBhIERpc3R1dGlscyAndXBsb2FkX2RvY3MnIHN1YmNvbW1hbmQgKHVwbG9hZCBkb2N1bWVudGF0aW9uIHRvClB5UEkncyBweXRob25ob3N0ZWQub3JnKS4KIiIiCgpmcm9tIGJhc2U2NCBpbXBvcnQgc3RhbmRhcmRfYjY0ZW5jb2RlCmZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNPcHRpb25FcnJvcgppbXBvcnQgb3MKaW1wb3J0IHNvY2tldAppbXBvcnQgemlwZmlsZQppbXBvcnQgdGVtcGZpbGUKaW1wb3J0IHNodXRpbAppbXBvcnQgaXRlcnRvb2xzCmltcG9ydCBmdW5jdG9vbHMKCmZyb20gc2V0dXB0b29scy5leHRlcm4gaW1wb3J0IHNpeApmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnNpeC5tb3ZlcyBpbXBvcnQgaHR0cF9jbGllbnQsIHVybGxpYgoKZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCBpdGVyX2VudHJ5X3BvaW50cwpmcm9tIC51cGxvYWQgaW1wb3J0IHVwbG9hZAoKCmRlZiBfZW5jb2RlKHMpOgogICAgZXJyb3JzID0gJ3N1cnJvZ2F0ZWVzY2FwZScgaWYgc2l4LlBZMyBlbHNlICdzdHJpY3QnCiAgICByZXR1cm4gcy5lbmNvZGUoJ3V0Zi04JywgZXJyb3JzKQoKCmNsYXNzIHVwbG9hZF9kb2NzKHVwbG9hZCk6CiAgICAjIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHJlcG9zaXRvcnkgYXMgdXBsb2FkX2RvY3MgaXNuJ3QKICAgICMgc3VwcG9ydGVkIGJ5IFdhcmVob3VzZSAoYW5kIHdvbid0IGJlKS4KICAgIERFRkFVTFRfUkVQT1NJVE9SWSA9ICdodHRwczovL3B5cGkucHl0aG9uLm9yZy9weXBpLycKCiAgICBkZXNjcmlwdGlvbiA9ICdVcGxvYWQgZG9jdW1lbnRhdGlvbiB0byBQeVBJJwoKICAgIHVzZXJfb3B0aW9ucyA9IFsKICAgICAgICAoJ3JlcG9zaXRvcnk9JywgJ3InLAogICAgICAgICAidXJsIG9mIHJlcG9zaXRvcnkgW2RlZmF1bHQ6ICVzXSIgJSB1cGxvYWQuREVGQVVMVF9SRVBPU0lUT1JZKSwKICAgICAgICAoJ3Nob3ctcmVzcG9uc2UnLCBOb25lLAogICAgICAgICAnZGlzcGxheSBmdWxsIHJlc3BvbnNlIHRleHQgZnJvbSBzZXJ2ZXInKSwKICAgICAgICAoJ3VwbG9hZC1kaXI9JywgTm9uZSwgJ2RpcmVjdG9yeSB0byB1cGxvYWQnKSwKICAgIF0KICAgIGJvb2xlYW5fb3B0aW9ucyA9IHVwbG9hZC5ib29sZWFuX29wdGlvbnMKCiAgICBkZWYgaGFzX3NwaGlueChzZWxmKToKICAgICAgICBpZiBzZWxmLnVwbG9hZF9kaXIgaXMgTm9uZToKICAgICAgICAgICAgZm9yIGVwIGluIGl0ZXJfZW50cnlfcG9pbnRzKCdkaXN0dXRpbHMuY29tbWFuZHMnLCAnYnVpbGRfc3BoaW54Jyk6CiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIHN1Yl9jb21tYW5kcyA9IFsoJ2J1aWxkX3NwaGlueCcsIGhhc19zcGhpbngpXQoKICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgdXBsb2FkLmluaXRpYWxpemVfb3B0aW9ucyhzZWxmKQogICAgICAgIHNlbGYudXBsb2FkX2RpciA9IE5vbmUKICAgICAgICBzZWxmLnRhcmdldF9kaXIgPSBOb25lCgogICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgdXBsb2FkLmZpbmFsaXplX29wdGlvbnMoc2VsZikKICAgICAgICBpZiBzZWxmLnVwbG9hZF9kaXIgaXMgTm9uZToKICAgICAgICAgICAgaWYgc2VsZi5oYXNfc3BoaW54KCk6CiAgICAgICAgICAgICAgICBidWlsZF9zcGhpbnggPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGRfc3BoaW54JykKICAgICAgICAgICAgICAgIHNlbGYudGFyZ2V0X2RpciA9IGJ1aWxkX3NwaGlueC5idWlsZGVyX3RhcmdldF9kaXIKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGJ1aWxkID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkJykKICAgICAgICAgICAgICAgIHNlbGYudGFyZ2V0X2RpciA9IG9zLnBhdGguam9pbihidWlsZC5idWlsZF9iYXNlLCAnZG9jcycpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5lbnN1cmVfZGlybmFtZSgndXBsb2FkX2RpcicpCiAgICAgICAgICAgIHNlbGYudGFyZ2V0X2RpciA9IHNlbGYudXBsb2FkX2RpcgogICAgICAgIGlmICdweXBpLnB5dGhvbi5vcmcnIGluIHNlbGYucmVwb3NpdG9yeToKICAgICAgICAgICAgbG9nLndhcm4oIlVwbG9hZF9kb2NzIGNvbW1hbmQgaXMgZGVwcmVjYXRlZC4gVXNlIFJURCBpbnN0ZWFkLiIpCiAgICAgICAgc2VsZi5hbm5vdW5jZSgnVXNpbmcgdXBsb2FkIGRpcmVjdG9yeSAlcycgJSBzZWxmLnRhcmdldF9kaXIpCgogICAgZGVmIGNyZWF0ZV96aXBmaWxlKHNlbGYsIGZpbGVuYW1lKToKICAgICAgICB6aXBfZmlsZSA9IHppcGZpbGUuWmlwRmlsZShmaWxlbmFtZSwgInciKQogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5ta3BhdGgoc2VsZi50YXJnZXRfZGlyKSAgIyBqdXN0IGluIGNhc2UKICAgICAgICAgICAgZm9yIHJvb3QsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsoc2VsZi50YXJnZXRfZGlyKToKICAgICAgICAgICAgICAgIGlmIHJvb3QgPT0gc2VsZi50YXJnZXRfZGlyIGFuZCBub3QgZmlsZXM6CiAgICAgICAgICAgICAgICAgICAgdG1wbCA9ICJubyBmaWxlcyBmb3VuZCBpbiB1cGxvYWQgZGlyZWN0b3J5ICclcyciCiAgICAgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IodG1wbCAlIHNlbGYudGFyZ2V0X2RpcikKICAgICAgICAgICAgICAgIGZvciBuYW1lIGluIGZpbGVzOgogICAgICAgICAgICAgICAgICAgIGZ1bGwgPSBvcy5wYXRoLmpvaW4ocm9vdCwgbmFtZSkKICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZSA9IHJvb3RbbGVuKHNlbGYudGFyZ2V0X2Rpcik6XS5sc3RyaXAob3MucGF0aC5zZXApCiAgICAgICAgICAgICAgICAgICAgZGVzdCA9IG9zLnBhdGguam9pbihyZWxhdGl2ZSwgbmFtZSkKICAgICAgICAgICAgICAgICAgICB6aXBfZmlsZS53cml0ZShmdWxsLCBkZXN0KQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIHppcF9maWxlLmNsb3NlKCkKCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgICMgUnVuIHN1YiBjb21tYW5kcwogICAgICAgIGZvciBjbWRfbmFtZSBpbiBzZWxmLmdldF9zdWJfY29tbWFuZHMoKToKICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZChjbWRfbmFtZSkKCiAgICAgICAgdG1wX2RpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQogICAgICAgIG5hbWUgPSBzZWxmLmRpc3RyaWJ1dGlvbi5tZXRhZGF0YS5nZXRfbmFtZSgpCiAgICAgICAgemlwX2ZpbGUgPSBvcy5wYXRoLmpvaW4odG1wX2RpciwgIiVzLnppcCIgJSBuYW1lKQogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5jcmVhdGVfemlwZmlsZSh6aXBfZmlsZSkKICAgICAgICAgICAgc2VsZi51cGxvYWRfZmlsZSh6aXBfZmlsZSkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBzaHV0aWwucm10cmVlKHRtcF9kaXIpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9idWlsZF9wYXJ0KGl0ZW0sIHNlcF9ib3VuZGFyeSk6CiAgICAgICAga2V5LCB2YWx1ZXMgPSBpdGVtCiAgICAgICAgdGl0bGUgPSAnXG5Db250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9IiVzIicgJSBrZXkKICAgICAgICAjIGhhbmRsZSBtdWx0aXBsZSBlbnRyaWVzIGZvciB0aGUgc2FtZSBuYW1lCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodmFsdWVzLCBsaXN0KToKICAgICAgICAgICAgdmFsdWVzID0gW3ZhbHVlc10KICAgICAgICBmb3IgdmFsdWUgaW4gdmFsdWVzOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCB0dXBsZSk6CiAgICAgICAgICAgICAgICB0aXRsZSArPSAnOyBmaWxlbmFtZT0iJXMiJyAlIHZhbHVlWzBdCiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlWzFdCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB2YWx1ZSA9IF9lbmNvZGUodmFsdWUpCiAgICAgICAgICAgIHlpZWxkIHNlcF9ib3VuZGFyeQogICAgICAgICAgICB5aWVsZCBfZW5jb2RlKHRpdGxlKQogICAgICAgICAgICB5aWVsZCBiIlxuXG4iCiAgICAgICAgICAgIHlpZWxkIHZhbHVlCiAgICAgICAgICAgIGlmIHZhbHVlIGFuZCB2YWx1ZVstMTpdID09IGInXHInOgogICAgICAgICAgICAgICAgeWllbGQgYidcbicgICMgd3JpdGUgYW4gZXh0cmEgbmV3bGluZSAobHVydmUgTWFjcykKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfYnVpbGRfbXVsdGlwYXJ0KGNscywgZGF0YSk6CiAgICAgICAgIiIiCiAgICAgICAgQnVpbGQgdXAgdGhlIE1JTUUgcGF5bG9hZCBmb3IgdGhlIFBPU1QgZGF0YQogICAgICAgICIiIgogICAgICAgIGJvdW5kYXJ5ID0gYictLS0tLS0tLS0tLS0tLUdIU0tGSkRMR0RTNzU0M0ZKS0xGSFJFNzU2NDI3NTY3NDMyNTQnCiAgICAgICAgc2VwX2JvdW5kYXJ5ID0gYidcbi0tJyArIGJvdW5kYXJ5CiAgICAgICAgZW5kX2JvdW5kYXJ5ID0gc2VwX2JvdW5kYXJ5ICsgYictLScKICAgICAgICBlbmRfaXRlbXMgPSBlbmRfYm91bmRhcnksIGIiXG4iLAogICAgICAgIGJ1aWxkZXIgPSBmdW5jdG9vbHMucGFydGlhbCgKICAgICAgICAgICAgY2xzLl9idWlsZF9wYXJ0LAogICAgICAgICAgICBzZXBfYm91bmRhcnk9c2VwX2JvdW5kYXJ5LAogICAgICAgICkKICAgICAgICBwYXJ0X2dyb3VwcyA9IG1hcChidWlsZGVyLCBkYXRhLml0ZW1zKCkpCiAgICAgICAgcGFydHMgPSBpdGVydG9vbHMuY2hhaW4uZnJvbV9pdGVyYWJsZShwYXJ0X2dyb3VwcykKICAgICAgICBib2R5X2l0ZW1zID0gaXRlcnRvb2xzLmNoYWluKHBhcnRzLCBlbmRfaXRlbXMpCiAgICAgICAgY29udGVudF90eXBlID0gJ211bHRpcGFydC9mb3JtLWRhdGE7IGJvdW5kYXJ5PSVzJyAlIGJvdW5kYXJ5LmRlY29kZSgnYXNjaWknKQogICAgICAgIHJldHVybiBiJycuam9pbihib2R5X2l0ZW1zKSwgY29udGVudF90eXBlCgogICAgZGVmIHVwbG9hZF9maWxlKHNlbGYsIGZpbGVuYW1lKToKICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICdyYicpIGFzIGY6CiAgICAgICAgICAgIGNvbnRlbnQgPSBmLnJlYWQoKQogICAgICAgIG1ldGEgPSBzZWxmLmRpc3RyaWJ1dGlvbi5tZXRhZGF0YQogICAgICAgIGRhdGEgPSB7CiAgICAgICAgICAgICc6YWN0aW9uJzogJ2RvY191cGxvYWQnLAogICAgICAgICAgICAnbmFtZSc6IG1ldGEuZ2V0X25hbWUoKSwKICAgICAgICAgICAgJ2NvbnRlbnQnOiAob3MucGF0aC5iYXNlbmFtZShmaWxlbmFtZSksIGNvbnRlbnQpLAogICAgICAgIH0KICAgICAgICAjIHNldCB1cCB0aGUgYXV0aGVudGljYXRpb24KICAgICAgICBjcmVkZW50aWFscyA9IF9lbmNvZGUoc2VsZi51c2VybmFtZSArICc6JyArIHNlbGYucGFzc3dvcmQpCiAgICAgICAgY3JlZGVudGlhbHMgPSBzdGFuZGFyZF9iNjRlbmNvZGUoY3JlZGVudGlhbHMpCiAgICAgICAgaWYgc2l4LlBZMzoKICAgICAgICAgICAgY3JlZGVudGlhbHMgPSBjcmVkZW50aWFscy5kZWNvZGUoJ2FzY2lpJykKICAgICAgICBhdXRoID0gIkJhc2ljICIgKyBjcmVkZW50aWFscwoKICAgICAgICBib2R5LCBjdCA9IHNlbGYuX2J1aWxkX211bHRpcGFydChkYXRhKQoKICAgICAgICBtc2cgPSAiU3VibWl0dGluZyBkb2N1bWVudGF0aW9uIHRvICVzIiAlIChzZWxmLnJlcG9zaXRvcnkpCiAgICAgICAgc2VsZi5hbm5vdW5jZShtc2csIGxvZy5JTkZPKQoKICAgICAgICAjIGJ1aWxkIHRoZSBSZXF1ZXN0CiAgICAgICAgIyBXZSBjYW4ndCB1c2UgdXJsbGliMiBzaW5jZSB3ZSBuZWVkIHRvIHNlbmQgdGhlIEJhc2ljCiAgICAgICAgIyBhdXRoIHJpZ2h0IHdpdGggdGhlIGZpcnN0IHJlcXVlc3QKICAgICAgICBzY2hlbWEsIG5ldGxvYywgdXJsLCBwYXJhbXMsIHF1ZXJ5LCBmcmFnbWVudHMgPSBcCiAgICAgICAgICAgIHVybGxpYi5wYXJzZS51cmxwYXJzZShzZWxmLnJlcG9zaXRvcnkpCiAgICAgICAgYXNzZXJ0IG5vdCBwYXJhbXMgYW5kIG5vdCBxdWVyeSBhbmQgbm90IGZyYWdtZW50cwogICAgICAgIGlmIHNjaGVtYSA9PSAnaHR0cCc6CiAgICAgICAgICAgIGNvbm4gPSBodHRwX2NsaWVudC5IVFRQQ29ubmVjdGlvbihuZXRsb2MpCiAgICAgICAgZWxpZiBzY2hlbWEgPT0gJ2h0dHBzJzoKICAgICAgICAgICAgY29ubiA9IGh0dHBfY2xpZW50LkhUVFBTQ29ubmVjdGlvbihuZXRsb2MpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoInVuc3VwcG9ydGVkIHNjaGVtYSAiICsgc2NoZW1hKQoKICAgICAgICBkYXRhID0gJycKICAgICAgICB0cnk6CiAgICAgICAgICAgIGNvbm4uY29ubmVjdCgpCiAgICAgICAgICAgIGNvbm4ucHV0cmVxdWVzdCgiUE9TVCIsIHVybCkKICAgICAgICAgICAgY29udGVudF90eXBlID0gY3QKICAgICAgICAgICAgY29ubi5wdXRoZWFkZXIoJ0NvbnRlbnQtdHlwZScsIGNvbnRlbnRfdHlwZSkKICAgICAgICAgICAgY29ubi5wdXRoZWFkZXIoJ0NvbnRlbnQtbGVuZ3RoJywgc3RyKGxlbihib2R5KSkpCiAgICAgICAgICAgIGNvbm4ucHV0aGVhZGVyKCdBdXRob3JpemF0aW9uJywgYXV0aCkKICAgICAgICAgICAgY29ubi5lbmRoZWFkZXJzKCkKICAgICAgICAgICAgY29ubi5zZW5kKGJvZHkpCiAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvciBhcyBlOgogICAgICAgICAgICBzZWxmLmFubm91bmNlKHN0cihlKSwgbG9nLkVSUk9SKQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgciA9IGNvbm4uZ2V0cmVzcG9uc2UoKQogICAgICAgIGlmIHIuc3RhdHVzID09IDIwMDoKICAgICAgICAgICAgbXNnID0gJ1NlcnZlciByZXNwb25zZSAoJXMpOiAlcycgJSAoci5zdGF0dXMsIHIucmVhc29uKQogICAgICAgICAgICBzZWxmLmFubm91bmNlKG1zZywgbG9nLklORk8pCiAgICAgICAgZWxpZiByLnN0YXR1cyA9PSAzMDE6CiAgICAgICAgICAgIGxvY2F0aW9uID0gci5nZXRoZWFkZXIoJ0xvY2F0aW9uJykKICAgICAgICAgICAgaWYgbG9jYXRpb24gaXMgTm9uZToKICAgICAgICAgICAgICAgIGxvY2F0aW9uID0gJ2h0dHBzOi8vcHl0aG9uaG9zdGVkLm9yZy8lcy8nICUgbWV0YS5nZXRfbmFtZSgpCiAgICAgICAgICAgIG1zZyA9ICdVcGxvYWQgc3VjY2Vzc2Z1bC4gVmlzaXQgJXMnICUgbG9jYXRpb24KICAgICAgICAgICAgc2VsZi5hbm5vdW5jZShtc2csIGxvZy5JTkZPKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG1zZyA9ICdVcGxvYWQgZmFpbGVkICglcyk6ICVzJyAlIChyLnN0YXR1cywgci5yZWFzb24pCiAgICAgICAgICAgIHNlbGYuYW5ub3VuY2UobXNnLCBsb2cuRVJST1IpCiAgICAgICAgaWYgc2VsZi5zaG93X3Jlc3BvbnNlOgogICAgICAgICAgICBwcmludCgnLScgKiA3NSwgci5yZWFkKCksICctJyAqIDc1KQpQSwMEFAAAAAAAAAAhAE3v0lNfUAAAX1AAADkAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9jb25maWcucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgdW5pY29kZV9saXRlcmFscwppbXBvcnQgaW8KaW1wb3J0IG9zCmltcG9ydCBzeXMKCmltcG9ydCB3YXJuaW5ncwppbXBvcnQgZnVuY3Rvb2xzCmZyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlZmF1bHRkaWN0CmZyb20gZnVuY3Rvb2xzIGltcG9ydCBwYXJ0aWFsCmZyb20gZnVuY3Rvb2xzIGltcG9ydCB3cmFwcwpmcm9tIGltcG9ydGxpYiBpbXBvcnQgaW1wb3J0X21vZHVsZQoKZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNPcHRpb25FcnJvciwgRGlzdHV0aWxzRmlsZUVycm9yCmZyb20gc2V0dXB0b29scy5leHRlcm4ucGFja2FnaW5nLnZlcnNpb24gaW1wb3J0IExlZ2FjeVZlcnNpb24sIHBhcnNlCmZyb20gc2V0dXB0b29scy5leHRlcm4ucGFja2FnaW5nLnNwZWNpZmllcnMgaW1wb3J0IFNwZWNpZmllclNldApmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnNpeCBpbXBvcnQgc3RyaW5nX3R5cGVzLCBQWTMKCgpfX21ldGFjbGFzc19fID0gdHlwZQoKCmRlZiByZWFkX2NvbmZpZ3VyYXRpb24oCiAgICAgICAgZmlsZXBhdGgsIGZpbmRfb3RoZXJzPUZhbHNlLCBpZ25vcmVfb3B0aW9uX2Vycm9ycz1GYWxzZSk6CiAgICAiIiJSZWFkIGdpdmVuIGNvbmZpZ3VyYXRpb24gZmlsZSBhbmQgcmV0dXJucyBvcHRpb25zIGZyb20gaXQgYXMgYSBkaWN0LgoKICAgIDpwYXJhbSBzdHJ8dW5pY29kZSBmaWxlcGF0aDogUGF0aCB0byBjb25maWd1cmF0aW9uIGZpbGUKICAgICAgICB0byBnZXQgb3B0aW9ucyBmcm9tLgoKICAgIDpwYXJhbSBib29sIGZpbmRfb3RoZXJzOiBXaGV0aGVyIHRvIHNlYXJjaCBmb3Igb3RoZXIgY29uZmlndXJhdGlvbiBmaWxlcwogICAgICAgIHdoaWNoIGNvdWxkIGJlIG9uIGluIHZhcmlvdXMgcGxhY2VzLgoKICAgIDpwYXJhbSBib29sIGlnbm9yZV9vcHRpb25fZXJyb3JzOiBXaGV0aGVyIHRvIHNpbGVudGx5IGlnbm9yZQogICAgICAgIG9wdGlvbnMsIHZhbHVlcyBvZiB3aGljaCBjb3VsZCBub3QgYmUgcmVzb2x2ZWQgKGUuZy4gZHVlIHRvIGV4Y2VwdGlvbnMKICAgICAgICBpbiBkaXJlY3RpdmVzIHN1Y2ggYXMgZmlsZTosIGF0dHI6LCBldGMuKS4KICAgICAgICBJZiBGYWxzZSBleGNlcHRpb25zIGFyZSBwcm9wYWdhdGVkIGFzIGV4cGVjdGVkLgoKICAgIDpydHlwZTogZGljdAogICAgIiIiCiAgICBmcm9tIHNldHVwdG9vbHMuZGlzdCBpbXBvcnQgRGlzdHJpYnV0aW9uLCBfRGlzdHJpYnV0aW9uCgogICAgZmlsZXBhdGggPSBvcy5wYXRoLmFic3BhdGgoZmlsZXBhdGgpCgogICAgaWYgbm90IG9zLnBhdGguaXNmaWxlKGZpbGVwYXRoKToKICAgICAgICByYWlzZSBEaXN0dXRpbHNGaWxlRXJyb3IoCiAgICAgICAgICAgICdDb25maWd1cmF0aW9uIGZpbGUgJXMgZG9lcyBub3QgZXhpc3QuJyAlIGZpbGVwYXRoKQoKICAgIGN1cnJlbnRfZGlyZWN0b3J5ID0gb3MuZ2V0Y3dkKCkKICAgIG9zLmNoZGlyKG9zLnBhdGguZGlybmFtZShmaWxlcGF0aCkpCgogICAgdHJ5OgogICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oKQoKICAgICAgICBmaWxlbmFtZXMgPSBkaXN0LmZpbmRfY29uZmlnX2ZpbGVzKCkgaWYgZmluZF9vdGhlcnMgZWxzZSBbXQogICAgICAgIGlmIGZpbGVwYXRoIG5vdCBpbiBmaWxlbmFtZXM6CiAgICAgICAgICAgIGZpbGVuYW1lcy5hcHBlbmQoZmlsZXBhdGgpCgogICAgICAgIF9EaXN0cmlidXRpb24ucGFyc2VfY29uZmlnX2ZpbGVzKGRpc3QsIGZpbGVuYW1lcz1maWxlbmFtZXMpCgogICAgICAgIGhhbmRsZXJzID0gcGFyc2VfY29uZmlndXJhdGlvbigKICAgICAgICAgICAgZGlzdCwgZGlzdC5jb21tYW5kX29wdGlvbnMsCiAgICAgICAgICAgIGlnbm9yZV9vcHRpb25fZXJyb3JzPWlnbm9yZV9vcHRpb25fZXJyb3JzKQoKICAgIGZpbmFsbHk6CiAgICAgICAgb3MuY2hkaXIoY3VycmVudF9kaXJlY3RvcnkpCgogICAgcmV0dXJuIGNvbmZpZ3VyYXRpb25fdG9fZGljdChoYW5kbGVycykKCgpkZWYgX2dldF9vcHRpb24odGFyZ2V0X29iaiwga2V5KToKICAgICIiIgogICAgR2l2ZW4gYSB0YXJnZXQgb2JqZWN0IGFuZCBvcHRpb24ga2V5LCBnZXQgdGhhdCBvcHRpb24gZnJvbQogICAgdGhlIHRhcmdldCBvYmplY3QsIGVpdGhlciB0aHJvdWdoIGEgZ2V0X3trZXl9IG1ldGhvZCBvcgogICAgZnJvbSBhbiBhdHRyaWJ1dGUgZGlyZWN0bHkuCiAgICAiIiIKICAgIGdldHRlcl9uYW1lID0gJ2dldF97a2V5fScuZm9ybWF0KCoqbG9jYWxzKCkpCiAgICBieV9hdHRyaWJ1dGUgPSBmdW5jdG9vbHMucGFydGlhbChnZXRhdHRyLCB0YXJnZXRfb2JqLCBrZXkpCiAgICBnZXR0ZXIgPSBnZXRhdHRyKHRhcmdldF9vYmosIGdldHRlcl9uYW1lLCBieV9hdHRyaWJ1dGUpCiAgICByZXR1cm4gZ2V0dGVyKCkKCgpkZWYgY29uZmlndXJhdGlvbl90b19kaWN0KGhhbmRsZXJzKToKICAgICIiIlJldHVybnMgY29uZmlndXJhdGlvbiBkYXRhIGdhdGhlcmVkIGJ5IGdpdmVuIGhhbmRsZXJzIGFzIGEgZGljdC4KCiAgICA6cGFyYW0gbGlzdFtDb25maWdIYW5kbGVyXSBoYW5kbGVyczogSGFuZGxlcnMgbGlzdCwKICAgICAgICB1c3VhbGx5IGZyb20gcGFyc2VfY29uZmlndXJhdGlvbigpCgogICAgOnJ0eXBlOiBkaWN0CiAgICAiIiIKICAgIGNvbmZpZ19kaWN0ID0gZGVmYXVsdGRpY3QoZGljdCkKCiAgICBmb3IgaGFuZGxlciBpbiBoYW5kbGVyczoKICAgICAgICBmb3Igb3B0aW9uIGluIGhhbmRsZXIuc2V0X29wdGlvbnM6CiAgICAgICAgICAgIHZhbHVlID0gX2dldF9vcHRpb24oaGFuZGxlci50YXJnZXRfb2JqLCBvcHRpb24pCiAgICAgICAgICAgIGNvbmZpZ19kaWN0W2hhbmRsZXIuc2VjdGlvbl9wcmVmaXhdW29wdGlvbl0gPSB2YWx1ZQoKICAgIHJldHVybiBjb25maWdfZGljdAoKCmRlZiBwYXJzZV9jb25maWd1cmF0aW9uKAogICAgICAgIGRpc3RyaWJ1dGlvbiwgY29tbWFuZF9vcHRpb25zLCBpZ25vcmVfb3B0aW9uX2Vycm9ycz1GYWxzZSk6CiAgICAiIiJQZXJmb3JtcyBhZGRpdGlvbmFsIHBhcnNpbmcgb2YgY29uZmlndXJhdGlvbiBvcHRpb25zCiAgICBmb3IgYSBkaXN0cmlidXRpb24uCgogICAgUmV0dXJucyBhIGxpc3Qgb2YgdXNlZCBvcHRpb24gaGFuZGxlcnMuCgogICAgOnBhcmFtIERpc3RyaWJ1dGlvbiBkaXN0cmlidXRpb246CiAgICA6cGFyYW0gZGljdCBjb21tYW5kX29wdGlvbnM6CiAgICA6cGFyYW0gYm9vbCBpZ25vcmVfb3B0aW9uX2Vycm9yczogV2hldGhlciB0byBzaWxlbnRseSBpZ25vcmUKICAgICAgICBvcHRpb25zLCB2YWx1ZXMgb2Ygd2hpY2ggY291bGQgbm90IGJlIHJlc29sdmVkIChlLmcuIGR1ZSB0byBleGNlcHRpb25zCiAgICAgICAgaW4gZGlyZWN0aXZlcyBzdWNoIGFzIGZpbGU6LCBhdHRyOiwgZXRjLikuCiAgICAgICAgSWYgRmFsc2UgZXhjZXB0aW9ucyBhcmUgcHJvcGFnYXRlZCBhcyBleHBlY3RlZC4KICAgIDpydHlwZTogbGlzdAogICAgIiIiCiAgICBvcHRpb25zID0gQ29uZmlnT3B0aW9uc0hhbmRsZXIoCiAgICAgICAgZGlzdHJpYnV0aW9uLCBjb21tYW5kX29wdGlvbnMsIGlnbm9yZV9vcHRpb25fZXJyb3JzKQogICAgb3B0aW9ucy5wYXJzZSgpCgogICAgbWV0YSA9IENvbmZpZ01ldGFkYXRhSGFuZGxlcigKICAgICAgICBkaXN0cmlidXRpb24ubWV0YWRhdGEsIGNvbW1hbmRfb3B0aW9ucywgaWdub3JlX29wdGlvbl9lcnJvcnMsCiAgICAgICAgZGlzdHJpYnV0aW9uLnBhY2thZ2VfZGlyKQogICAgbWV0YS5wYXJzZSgpCgogICAgcmV0dXJuIG1ldGEsIG9wdGlvbnMKCgpjbGFzcyBDb25maWdIYW5kbGVyOgogICAgIiIiSGFuZGxlcyBtZXRhZGF0YSBzdXBwbGllZCBpbiBjb25maWd1cmF0aW9uIGZpbGVzLiIiIgoKICAgIHNlY3Rpb25fcHJlZml4ID0gTm9uZQogICAgIiIiUHJlZml4IGZvciBjb25maWcgc2VjdGlvbnMgaGFuZGxlZCBieSB0aGlzIGhhbmRsZXIuCiAgICBNdXN0IGJlIHByb3ZpZGVkIGJ5IGNsYXNzIGhlaXJzLgoKICAgICIiIgoKICAgIGFsaWFzZXMgPSB7fQogICAgIiIiT3B0aW9ucyBhbGlhc2VzLgogICAgRm9yIGNvbXBhdGliaWxpdHkgd2l0aCB2YXJpb3VzIHBhY2thZ2VzLiBFLmcuOiBkMnRvMSBhbmQgcGJyLgogICAgTm90ZTogYC1gIGluIGtleXMgaXMgcmVwbGFjZWQgd2l0aCBgX2AgYnkgY29uZmlnIHBhcnNlci4KCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgdGFyZ2V0X29iaiwgb3B0aW9ucywgaWdub3JlX29wdGlvbl9lcnJvcnM9RmFsc2UpOgogICAgICAgIHNlY3Rpb25zID0ge30KCiAgICAgICAgc2VjdGlvbl9wcmVmaXggPSBzZWxmLnNlY3Rpb25fcHJlZml4CiAgICAgICAgZm9yIHNlY3Rpb25fbmFtZSwgc2VjdGlvbl9vcHRpb25zIGluIG9wdGlvbnMuaXRlbXMoKToKICAgICAgICAgICAgaWYgbm90IHNlY3Rpb25fbmFtZS5zdGFydHN3aXRoKHNlY3Rpb25fcHJlZml4KToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICBzZWN0aW9uX25hbWUgPSBzZWN0aW9uX25hbWUucmVwbGFjZShzZWN0aW9uX3ByZWZpeCwgJycpLnN0cmlwKCcuJykKICAgICAgICAgICAgc2VjdGlvbnNbc2VjdGlvbl9uYW1lXSA9IHNlY3Rpb25fb3B0aW9ucwoKICAgICAgICBzZWxmLmlnbm9yZV9vcHRpb25fZXJyb3JzID0gaWdub3JlX29wdGlvbl9lcnJvcnMKICAgICAgICBzZWxmLnRhcmdldF9vYmogPSB0YXJnZXRfb2JqCiAgICAgICAgc2VsZi5zZWN0aW9ucyA9IHNlY3Rpb25zCiAgICAgICAgc2VsZi5zZXRfb3B0aW9ucyA9IFtdCgogICAgQHByb3BlcnR5CiAgICBkZWYgcGFyc2VycyhzZWxmKToKICAgICAgICAiIiJNZXRhZGF0YSBpdGVtIG5hbWUgdG8gcGFyc2VyIGZ1bmN0aW9uIG1hcHBpbmcuIiIiCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigKICAgICAgICAgICAgJyVzIG11c3QgcHJvdmlkZSAucGFyc2VycyBwcm9wZXJ0eScgJSBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXykKCiAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwgb3B0aW9uX25hbWUsIHZhbHVlKToKICAgICAgICB1bmtub3duID0gdHVwbGUoKQogICAgICAgIHRhcmdldF9vYmogPSBzZWxmLnRhcmdldF9vYmoKCiAgICAgICAgIyBUcmFuc2xhdGUgYWxpYXMgaW50byByZWFsIG5hbWUuCiAgICAgICAgb3B0aW9uX25hbWUgPSBzZWxmLmFsaWFzZXMuZ2V0KG9wdGlvbl9uYW1lLCBvcHRpb25fbmFtZSkKCiAgICAgICAgY3VycmVudF92YWx1ZSA9IGdldGF0dHIodGFyZ2V0X29iaiwgb3B0aW9uX25hbWUsIHVua25vd24pCgogICAgICAgIGlmIGN1cnJlbnRfdmFsdWUgaXMgdW5rbm93bjoKICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3Iob3B0aW9uX25hbWUpCgogICAgICAgIGlmIGN1cnJlbnRfdmFsdWU6CiAgICAgICAgICAgICMgQWxyZWFkeSBpbmhhYml0ZWQuIFNraXBwaW5nLgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgc2tpcF9vcHRpb24gPSBGYWxzZQogICAgICAgIHBhcnNlciA9IHNlbGYucGFyc2Vycy5nZXQob3B0aW9uX25hbWUpCiAgICAgICAgaWYgcGFyc2VyOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICB2YWx1ZSA9IHBhcnNlcih2YWx1ZSkKCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICAgICBza2lwX29wdGlvbiA9IFRydWUKICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmlnbm9yZV9vcHRpb25fZXJyb3JzOgogICAgICAgICAgICAgICAgICAgIHJhaXNlCgogICAgICAgIGlmIHNraXBfb3B0aW9uOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgc2V0dGVyID0gZ2V0YXR0cih0YXJnZXRfb2JqLCAnc2V0XyVzJyAlIG9wdGlvbl9uYW1lLCBOb25lKQogICAgICAgIGlmIHNldHRlciBpcyBOb25lOgogICAgICAgICAgICBzZXRhdHRyKHRhcmdldF9vYmosIG9wdGlvbl9uYW1lLCB2YWx1ZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZXR0ZXIodmFsdWUpCgogICAgICAgIHNlbGYuc2V0X29wdGlvbnMuYXBwZW5kKG9wdGlvbl9uYW1lKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9wYXJzZV9saXN0KGNscywgdmFsdWUsIHNlcGFyYXRvcj0nLCcpOgogICAgICAgICIiIlJlcHJlc2VudHMgdmFsdWUgYXMgYSBsaXN0LgoKICAgICAgICBWYWx1ZSBpcyBzcGxpdCBlaXRoZXIgYnkgc2VwYXJhdG9yIChkZWZhdWx0cyB0byBjb21tYSkgb3IgYnkgbGluZXMuCgogICAgICAgIDpwYXJhbSB2YWx1ZToKICAgICAgICA6cGFyYW0gc2VwYXJhdG9yOiBMaXN0IGl0ZW1zIHNlcGFyYXRvciBjaGFyYWN0ZXIuCiAgICAgICAgOnJ0eXBlOiBsaXN0CiAgICAgICAgIiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgbGlzdCk6ICAjIF9nZXRfcGFyc2VyX2NvbXBvdW5kIGNhc2UKICAgICAgICAgICAgcmV0dXJuIHZhbHVlCgogICAgICAgIGlmICdcbicgaW4gdmFsdWU6CiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc3BsaXRsaW5lcygpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zcGxpdChzZXBhcmF0b3IpCgogICAgICAgIHJldHVybiBbY2h1bmsuc3RyaXAoKSBmb3IgY2h1bmsgaW4gdmFsdWUgaWYgY2h1bmsuc3RyaXAoKV0KCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfcGFyc2VfZGljdChjbHMsIHZhbHVlKToKICAgICAgICAiIiJSZXByZXNlbnRzIHZhbHVlIGFzIGEgZGljdC4KCiAgICAgICAgOnBhcmFtIHZhbHVlOgogICAgICAgIDpydHlwZTogZGljdAogICAgICAgICIiIgogICAgICAgIHNlcGFyYXRvciA9ICc9JwogICAgICAgIHJlc3VsdCA9IHt9CiAgICAgICAgZm9yIGxpbmUgaW4gY2xzLl9wYXJzZV9saXN0KHZhbHVlKToKICAgICAgICAgICAga2V5LCBzZXAsIHZhbCA9IGxpbmUucGFydGl0aW9uKHNlcGFyYXRvcikKICAgICAgICAgICAgaWYgc2VwICE9IHNlcGFyYXRvcjoKICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKAogICAgICAgICAgICAgICAgICAgICdVbmFibGUgdG8gcGFyc2Ugb3B0aW9uIHZhbHVlIHRvIGRpY3Q6ICVzJyAlIHZhbHVlKQogICAgICAgICAgICByZXN1bHRba2V5LnN0cmlwKCldID0gdmFsLnN0cmlwKCkKCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9wYXJzZV9ib29sKGNscywgdmFsdWUpOgogICAgICAgICIiIlJlcHJlc2VudHMgdmFsdWUgYXMgYm9vbGVhbi4KCiAgICAgICAgOnBhcmFtIHZhbHVlOgogICAgICAgIDpydHlwZTogYm9vbAogICAgICAgICIiIgogICAgICAgIHZhbHVlID0gdmFsdWUubG93ZXIoKQogICAgICAgIHJldHVybiB2YWx1ZSBpbiAoJzEnLCAndHJ1ZScsICd5ZXMnKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9leGNsdWRlX2ZpbGVzX3BhcnNlcihjbHMsIGtleSk6CiAgICAgICAgIiIiUmV0dXJucyBhIHBhcnNlciBmdW5jdGlvbiB0byBtYWtlIHN1cmUgZmllbGQgaW5wdXRzCiAgICAgICAgYXJlIG5vdCBmaWxlcy4KCiAgICAgICAgUGFyc2VzIGEgdmFsdWUgYWZ0ZXIgZ2V0dGluZyB0aGUga2V5IHNvIGVycm9yIG1lc3NhZ2VzIGFyZQogICAgICAgIG1vcmUgaW5mb3JtYXRpdmUuCgogICAgICAgIDpwYXJhbSBrZXk6CiAgICAgICAgOnJ0eXBlOiBjYWxsYWJsZQogICAgICAgICIiIgogICAgICAgIGRlZiBwYXJzZXIodmFsdWUpOgogICAgICAgICAgICBleGNsdWRlX2RpcmVjdGl2ZSA9ICdmaWxlOicKICAgICAgICAgICAgaWYgdmFsdWUuc3RhcnRzd2l0aChleGNsdWRlX2RpcmVjdGl2ZSk6CiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAogICAgICAgICAgICAgICAgICAgICdPbmx5IHN0cmluZ3MgYXJlIGFjY2VwdGVkIGZvciB0aGUgezB9IGZpZWxkLCAnCiAgICAgICAgICAgICAgICAgICAgJ2ZpbGVzIGFyZSBub3QgYWNjZXB0ZWQnLmZvcm1hdChrZXkpKQogICAgICAgICAgICByZXR1cm4gdmFsdWUKICAgICAgICByZXR1cm4gcGFyc2VyCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX3BhcnNlX2ZpbGUoY2xzLCB2YWx1ZSk6CiAgICAgICAgIiIiUmVwcmVzZW50cyB2YWx1ZSBhcyBhIHN0cmluZywgYWxsb3dpbmcgaW5jbHVkaW5nIHRleHQKICAgICAgICBmcm9tIG5lYXJlc3QgZmlsZXMgdXNpbmcgYGZpbGU6YCBkaXJlY3RpdmUuCgogICAgICAgIERpcmVjdGl2ZSBpcyBzYW5kYm94ZWQgYW5kIHdvbid0IHJlYWNoIGFueXRoaW5nIG91dHNpZGUKICAgICAgICBkaXJlY3Rvcnkgd2l0aCBzZXR1cC5weS4KCiAgICAgICAgRXhhbXBsZXM6CiAgICAgICAgICAgIGZpbGU6IFJFQURNRS5yc3QsIENIQU5HRUxPRy5tZCwgc3JjL2ZpbGUudHh0CgogICAgICAgIDpwYXJhbSBzdHIgdmFsdWU6CiAgICAgICAgOnJ0eXBlOiBzdHIKICAgICAgICAiIiIKICAgICAgICBpbmNsdWRlX2RpcmVjdGl2ZSA9ICdmaWxlOicKCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodmFsdWUsIHN0cmluZ190eXBlcyk6CiAgICAgICAgICAgIHJldHVybiB2YWx1ZQoKICAgICAgICBpZiBub3QgdmFsdWUuc3RhcnRzd2l0aChpbmNsdWRlX2RpcmVjdGl2ZSk6CiAgICAgICAgICAgIHJldHVybiB2YWx1ZQoKICAgICAgICBzcGVjID0gdmFsdWVbbGVuKGluY2x1ZGVfZGlyZWN0aXZlKTpdCiAgICAgICAgZmlsZXBhdGhzID0gKG9zLnBhdGguYWJzcGF0aChwYXRoLnN0cmlwKCkpIGZvciBwYXRoIGluIHNwZWMuc3BsaXQoJywnKSkKICAgICAgICByZXR1cm4gJ1xuJy5qb2luKAogICAgICAgICAgICBjbHMuX3JlYWRfZmlsZShwYXRoKQogICAgICAgICAgICBmb3IgcGF0aCBpbiBmaWxlcGF0aHMKICAgICAgICAgICAgaWYgKGNscy5fYXNzZXJ0X2xvY2FsKHBhdGgpIG9yIFRydWUpCiAgICAgICAgICAgIGFuZCBvcy5wYXRoLmlzZmlsZShwYXRoKQogICAgICAgICkKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2Fzc2VydF9sb2NhbChmaWxlcGF0aCk6CiAgICAgICAgaWYgbm90IGZpbGVwYXRoLnN0YXJ0c3dpdGgob3MuZ2V0Y3dkKCkpOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigKICAgICAgICAgICAgICAgICdgZmlsZTpgIGRpcmVjdGl2ZSBjYW4gbm90IGFjY2VzcyAlcycgJSBmaWxlcGF0aCkKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX3JlYWRfZmlsZShmaWxlcGF0aCk6CiAgICAgICAgd2l0aCBpby5vcGVuKGZpbGVwYXRoLCBlbmNvZGluZz0ndXRmLTgnKSBhcyBmOgogICAgICAgICAgICByZXR1cm4gZi5yZWFkKCkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfcGFyc2VfYXR0cihjbHMsIHZhbHVlLCBwYWNrYWdlX2Rpcj1Ob25lKToKICAgICAgICAiIiJSZXByZXNlbnRzIHZhbHVlIGFzIGEgbW9kdWxlIGF0dHJpYnV0ZS4KCiAgICAgICAgRXhhbXBsZXM6CiAgICAgICAgICAgIGF0dHI6IHBhY2thZ2UuYXR0cgogICAgICAgICAgICBhdHRyOiBwYWNrYWdlLm1vZHVsZS5hdHRyCgogICAgICAgIDpwYXJhbSBzdHIgdmFsdWU6CiAgICAgICAgOnJ0eXBlOiBzdHIKICAgICAgICAiIiIKICAgICAgICBhdHRyX2RpcmVjdGl2ZSA9ICdhdHRyOicKICAgICAgICBpZiBub3QgdmFsdWUuc3RhcnRzd2l0aChhdHRyX2RpcmVjdGl2ZSk6CiAgICAgICAgICAgIHJldHVybiB2YWx1ZQoKICAgICAgICBhdHRyc19wYXRoID0gdmFsdWUucmVwbGFjZShhdHRyX2RpcmVjdGl2ZSwgJycpLnN0cmlwKCkuc3BsaXQoJy4nKQogICAgICAgIGF0dHJfbmFtZSA9IGF0dHJzX3BhdGgucG9wKCkKCiAgICAgICAgbW9kdWxlX25hbWUgPSAnLicuam9pbihhdHRyc19wYXRoKQogICAgICAgIG1vZHVsZV9uYW1lID0gbW9kdWxlX25hbWUgb3IgJ19faW5pdF9fJwoKICAgICAgICBwYXJlbnRfcGF0aCA9IG9zLmdldGN3ZCgpCiAgICAgICAgaWYgcGFja2FnZV9kaXI6CiAgICAgICAgICAgIGlmIGF0dHJzX3BhdGhbMF0gaW4gcGFja2FnZV9kaXI6CiAgICAgICAgICAgICAgICAjIEEgY3VzdG9tIHBhdGggd2FzIHNwZWNpZmllZCBmb3IgdGhlIG1vZHVsZSB3ZSB3YW50IHRvIGltcG9ydAogICAgICAgICAgICAgICAgY3VzdG9tX3BhdGggPSBwYWNrYWdlX2RpclthdHRyc19wYXRoWzBdXQogICAgICAgICAgICAgICAgcGFydHMgPSBjdXN0b21fcGF0aC5yc3BsaXQoJy8nLCAxKQogICAgICAgICAgICAgICAgaWYgbGVuKHBhcnRzKSA+IDE6CiAgICAgICAgICAgICAgICAgICAgcGFyZW50X3BhdGggPSBvcy5wYXRoLmpvaW4ob3MuZ2V0Y3dkKCksIHBhcnRzWzBdKQogICAgICAgICAgICAgICAgICAgIG1vZHVsZV9uYW1lID0gcGFydHNbMV0KICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbW9kdWxlX25hbWUgPSBjdXN0b21fcGF0aAogICAgICAgICAgICBlbGlmICcnIGluIHBhY2thZ2VfZGlyOgogICAgICAgICAgICAgICAgIyBBIGN1c3RvbSBwYXJlbnQgZGlyZWN0b3J5IHdhcyBzcGVjaWZpZWQgZm9yIGFsbCByb290IG1vZHVsZXMKICAgICAgICAgICAgICAgIHBhcmVudF9wYXRoID0gb3MucGF0aC5qb2luKG9zLmdldGN3ZCgpLCBwYWNrYWdlX2RpclsnJ10pCiAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIHBhcmVudF9wYXRoKQogICAgICAgIHRyeToKICAgICAgICAgICAgbW9kdWxlID0gaW1wb3J0X21vZHVsZShtb2R1bGVfbmFtZSkKICAgICAgICAgICAgdmFsdWUgPSBnZXRhdHRyKG1vZHVsZSwgYXR0cl9uYW1lKQoKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBzeXMucGF0aCA9IHN5cy5wYXRoWzE6XQoKICAgICAgICByZXR1cm4gdmFsdWUKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfZ2V0X3BhcnNlcl9jb21wb3VuZChjbHMsICpwYXJzZV9tZXRob2RzKToKICAgICAgICAiIiJSZXR1cm5zIHBhcnNlciBmdW5jdGlvbiB0byByZXByZXNlbnRzIHZhbHVlIGFzIGEgbGlzdC4KCiAgICAgICAgUGFyc2VzIGEgdmFsdWUgYXBwbHlpbmcgZ2l2ZW4gbWV0aG9kcyBvbmUgYWZ0ZXIgYW5vdGhlci4KCiAgICAgICAgOnBhcmFtIHBhcnNlX21ldGhvZHM6CiAgICAgICAgOnJ0eXBlOiBjYWxsYWJsZQogICAgICAgICIiIgogICAgICAgIGRlZiBwYXJzZSh2YWx1ZSk6CiAgICAgICAgICAgIHBhcnNlZCA9IHZhbHVlCgogICAgICAgICAgICBmb3IgbWV0aG9kIGluIHBhcnNlX21ldGhvZHM6CiAgICAgICAgICAgICAgICBwYXJzZWQgPSBtZXRob2QocGFyc2VkKQoKICAgICAgICAgICAgcmV0dXJuIHBhcnNlZAoKICAgICAgICByZXR1cm4gcGFyc2UKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfcGFyc2Vfc2VjdGlvbl90b19kaWN0KGNscywgc2VjdGlvbl9vcHRpb25zLCB2YWx1ZXNfcGFyc2VyPU5vbmUpOgogICAgICAgICIiIlBhcnNlcyBzZWN0aW9uIG9wdGlvbnMgaW50byBhIGRpY3Rpb25hcnkuCgogICAgICAgIE9wdGlvbmFsbHkgYXBwbGllcyBhIGdpdmVuIHBhcnNlciB0byB2YWx1ZXMuCgogICAgICAgIDpwYXJhbSBkaWN0IHNlY3Rpb25fb3B0aW9uczoKICAgICAgICA6cGFyYW0gY2FsbGFibGUgdmFsdWVzX3BhcnNlcjoKICAgICAgICA6cnR5cGU6IGRpY3QKICAgICAgICAiIiIKICAgICAgICB2YWx1ZSA9IHt9CiAgICAgICAgdmFsdWVzX3BhcnNlciA9IHZhbHVlc19wYXJzZXIgb3IgKGxhbWJkYSB2YWw6IHZhbCkKICAgICAgICBmb3Iga2V5LCAoXywgdmFsKSBpbiBzZWN0aW9uX29wdGlvbnMuaXRlbXMoKToKICAgICAgICAgICAgdmFsdWVba2V5XSA9IHZhbHVlc19wYXJzZXIodmFsKQogICAgICAgIHJldHVybiB2YWx1ZQoKICAgIGRlZiBwYXJzZV9zZWN0aW9uKHNlbGYsIHNlY3Rpb25fb3B0aW9ucyk6CiAgICAgICAgIiIiUGFyc2VzIGNvbmZpZ3VyYXRpb24gZmlsZSBzZWN0aW9uLgoKICAgICAgICA6cGFyYW0gZGljdCBzZWN0aW9uX29wdGlvbnM6CiAgICAgICAgIiIiCiAgICAgICAgZm9yIChuYW1lLCAoXywgdmFsdWUpKSBpbiBzZWN0aW9uX29wdGlvbnMuaXRlbXMoKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgc2VsZltuYW1lXSA9IHZhbHVlCgogICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgICAgICBwYXNzICAjIEtlZXAgc2lsZW50IGZvciBhIG5ldyBvcHRpb24gbWF5IGFwcGVhciBhbnl0aW1lLgoKICAgIGRlZiBwYXJzZShzZWxmKToKICAgICAgICAiIiJQYXJzZXMgY29uZmlndXJhdGlvbiBmaWxlIGl0ZW1zIGZyb20gb25lCiAgICAgICAgb3IgbW9yZSByZWxhdGVkIHNlY3Rpb25zLgoKICAgICAgICAiIiIKICAgICAgICBmb3Igc2VjdGlvbl9uYW1lLCBzZWN0aW9uX29wdGlvbnMgaW4gc2VsZi5zZWN0aW9ucy5pdGVtcygpOgoKICAgICAgICAgICAgbWV0aG9kX3Bvc3RmaXggPSAnJwogICAgICAgICAgICBpZiBzZWN0aW9uX25hbWU6ICAjIFtzZWN0aW9uLm9wdGlvbl0gdmFyaWFudAogICAgICAgICAgICAgICAgbWV0aG9kX3Bvc3RmaXggPSAnXyVzJyAlIHNlY3Rpb25fbmFtZQoKICAgICAgICAgICAgc2VjdGlvbl9wYXJzZXJfbWV0aG9kID0gZ2V0YXR0cigKICAgICAgICAgICAgICAgIHNlbGYsCiAgICAgICAgICAgICAgICAjIERvdHMgaW4gc2VjdGlvbiBuYW1lcyBhcmUgdHJhbnNsYXRlZCBpbnRvIGR1bmRlcnNjb3Jlcy4KICAgICAgICAgICAgICAgICgncGFyc2Vfc2VjdGlvbiVzJyAlIG1ldGhvZF9wb3N0Zml4KS5yZXBsYWNlKCcuJywgJ19fJyksCiAgICAgICAgICAgICAgICBOb25lKQoKICAgICAgICAgICAgaWYgc2VjdGlvbl9wYXJzZXJfbWV0aG9kIGlzIE5vbmU6CiAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigKICAgICAgICAgICAgICAgICAgICAnVW5zdXBwb3J0ZWQgZGlzdHJpYnV0aW9uIG9wdGlvbiBzZWN0aW9uOiBbJXMuJXNdJyAlICgKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZWN0aW9uX3ByZWZpeCwgc2VjdGlvbl9uYW1lKSkKCiAgICAgICAgICAgIHNlY3Rpb25fcGFyc2VyX21ldGhvZChzZWN0aW9uX29wdGlvbnMpCgogICAgZGVmIF9kZXByZWNhdGVkX2NvbmZpZ19oYW5kbGVyKHNlbGYsIGZ1bmMsIG1zZywgd2FybmluZ19jbGFzcyk6CiAgICAgICAgIiIiIHRoaXMgZnVuY3Rpb24gd2lsbCB3cmFwIGFyb3VuZCBwYXJhbWV0ZXJzIHRoYXQgYXJlIGRlcHJlY2F0ZWQKCiAgICAgICAgOnBhcmFtIG1zZzogZGVwcmVjYXRpb24gbWVzc2FnZQogICAgICAgIDpwYXJhbSB3YXJuaW5nX2NsYXNzOiBjbGFzcyBvZiB3YXJuaW5nIGV4Y2VwdGlvbiB0byBiZSByYWlzZWQKICAgICAgICA6cGFyYW0gZnVuYzogZnVuY3Rpb24gdG8gYmUgd3JhcHBlZCBhcm91bmQKICAgICAgICAiIiIKICAgICAgICBAd3JhcHMoZnVuYykKICAgICAgICBkZWYgY29uZmlnX2hhbmRsZXIoKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAgICAgd2FybmluZ3Mud2Fybihtc2csIHdhcm5pbmdfY2xhc3MpCiAgICAgICAgICAgIHJldHVybiBmdW5jKCphcmdzLCAqKmt3YXJncykKCiAgICAgICAgcmV0dXJuIGNvbmZpZ19oYW5kbGVyCgoKY2xhc3MgQ29uZmlnTWV0YWRhdGFIYW5kbGVyKENvbmZpZ0hhbmRsZXIpOgoKICAgIHNlY3Rpb25fcHJlZml4ID0gJ21ldGFkYXRhJwoKICAgIGFsaWFzZXMgPSB7CiAgICAgICAgJ2hvbWVfcGFnZSc6ICd1cmwnLAogICAgICAgICdzdW1tYXJ5JzogJ2Rlc2NyaXB0aW9uJywKICAgICAgICAnY2xhc3NpZmllcic6ICdjbGFzc2lmaWVycycsCiAgICAgICAgJ3BsYXRmb3JtJzogJ3BsYXRmb3JtcycsCiAgICB9CgogICAgc3RyaWN0X21vZGUgPSBGYWxzZQogICAgIiIiV2UgbmVlZCB0byBrZWVwIGl0IGxvb3NlLCB0byBiZSBwYXJ0aWFsbHkgY29tcGF0aWJsZSB3aXRoCiAgICBgcGJyYCBhbmQgYGQydG8xYCBwYWNrYWdlcyB3aGljaCBhbHNvIHVzZXMgYG1ldGFkYXRhYCBzZWN0aW9uLgoKICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0YXJnZXRfb2JqLCBvcHRpb25zLCBpZ25vcmVfb3B0aW9uX2Vycm9ycz1GYWxzZSwKICAgICAgICAgICAgICAgICBwYWNrYWdlX2Rpcj1Ob25lKToKICAgICAgICBzdXBlcihDb25maWdNZXRhZGF0YUhhbmRsZXIsIHNlbGYpLl9faW5pdF9fKHRhcmdldF9vYmosIG9wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVfb3B0aW9uX2Vycm9ycykKICAgICAgICBzZWxmLnBhY2thZ2VfZGlyID0gcGFja2FnZV9kaXIKCiAgICBAcHJvcGVydHkKICAgIGRlZiBwYXJzZXJzKHNlbGYpOgogICAgICAgICIiIk1ldGFkYXRhIGl0ZW0gbmFtZSB0byBwYXJzZXIgZnVuY3Rpb24gbWFwcGluZy4iIiIKICAgICAgICBwYXJzZV9saXN0ID0gc2VsZi5fcGFyc2VfbGlzdAogICAgICAgIHBhcnNlX2ZpbGUgPSBzZWxmLl9wYXJzZV9maWxlCiAgICAgICAgcGFyc2VfZGljdCA9IHNlbGYuX3BhcnNlX2RpY3QKICAgICAgICBleGNsdWRlX2ZpbGVzX3BhcnNlciA9IHNlbGYuX2V4Y2x1ZGVfZmlsZXNfcGFyc2VyCgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICdwbGF0Zm9ybXMnOiBwYXJzZV9saXN0LAogICAgICAgICAgICAna2V5d29yZHMnOiBwYXJzZV9saXN0LAogICAgICAgICAgICAncHJvdmlkZXMnOiBwYXJzZV9saXN0LAogICAgICAgICAgICAncmVxdWlyZXMnOiBzZWxmLl9kZXByZWNhdGVkX2NvbmZpZ19oYW5kbGVyKAogICAgICAgICAgICAgICAgcGFyc2VfbGlzdCwKICAgICAgICAgICAgICAgICJUaGUgcmVxdWlyZXMgcGFyYW1ldGVyIGlzIGRlcHJlY2F0ZWQsIHBsZWFzZSB1c2UgIgogICAgICAgICAgICAgICAgImluc3RhbGxfcmVxdWlyZXMgZm9yIHJ1bnRpbWUgZGVwZW5kZW5jaWVzLiIsCiAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpLAogICAgICAgICAgICAnb2Jzb2xldGVzJzogcGFyc2VfbGlzdCwKICAgICAgICAgICAgJ2NsYXNzaWZpZXJzJzogc2VsZi5fZ2V0X3BhcnNlcl9jb21wb3VuZChwYXJzZV9maWxlLCBwYXJzZV9saXN0KSwKICAgICAgICAgICAgJ2xpY2Vuc2UnOiBleGNsdWRlX2ZpbGVzX3BhcnNlcignbGljZW5zZScpLAogICAgICAgICAgICAnbGljZW5zZV9maWxlcyc6IHBhcnNlX2xpc3QsCiAgICAgICAgICAgICdkZXNjcmlwdGlvbic6IHBhcnNlX2ZpbGUsCiAgICAgICAgICAgICdsb25nX2Rlc2NyaXB0aW9uJzogcGFyc2VfZmlsZSwKICAgICAgICAgICAgJ3ZlcnNpb24nOiBzZWxmLl9wYXJzZV92ZXJzaW9uLAogICAgICAgICAgICAncHJvamVjdF91cmxzJzogcGFyc2VfZGljdCwKICAgICAgICB9CgogICAgZGVmIF9wYXJzZV92ZXJzaW9uKHNlbGYsIHZhbHVlKToKICAgICAgICAiIiJQYXJzZXMgYHZlcnNpb25gIG9wdGlvbiB2YWx1ZS4KCiAgICAgICAgOnBhcmFtIHZhbHVlOgogICAgICAgIDpydHlwZTogc3RyCgogICAgICAgICIiIgogICAgICAgIHZlcnNpb24gPSBzZWxmLl9wYXJzZV9maWxlKHZhbHVlKQoKICAgICAgICBpZiB2ZXJzaW9uICE9IHZhbHVlOgogICAgICAgICAgICB2ZXJzaW9uID0gdmVyc2lvbi5zdHJpcCgpCiAgICAgICAgICAgICMgQmUgc3RyaWN0IGFib3V0IHZlcnNpb25zIGxvYWRlZCBmcm9tIGZpbGUgYmVjYXVzZSBpdCdzIGVhc3kgdG8KICAgICAgICAgICAgIyBhY2NpZGVudGFsbHkgaW5jbHVkZSBuZXdsaW5lcyBhbmQgb3RoZXIgdW5pbnRlbmRlZCBjb250ZW50CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UocGFyc2UodmVyc2lvbiksIExlZ2FjeVZlcnNpb24pOgogICAgICAgICAgICAgICAgdG1wbCA9ICgKICAgICAgICAgICAgICAgICAgICAnVmVyc2lvbiBsb2FkZWQgZnJvbSB7dmFsdWV9IGRvZXMgbm90ICcKICAgICAgICAgICAgICAgICAgICAnY29tcGx5IHdpdGggUEVQIDQ0MDoge3ZlcnNpb259JwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IodG1wbC5mb3JtYXQoKipsb2NhbHMoKSkpCgogICAgICAgICAgICByZXR1cm4gdmVyc2lvbgoKICAgICAgICB2ZXJzaW9uID0gc2VsZi5fcGFyc2VfYXR0cih2YWx1ZSwgc2VsZi5wYWNrYWdlX2RpcikKCiAgICAgICAgaWYgY2FsbGFibGUodmVyc2lvbik6CiAgICAgICAgICAgIHZlcnNpb24gPSB2ZXJzaW9uKCkKCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodmVyc2lvbiwgc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgaWYgaGFzYXR0cih2ZXJzaW9uLCAnX19pdGVyX18nKToKICAgICAgICAgICAgICAgIHZlcnNpb24gPSAnLicuam9pbihtYXAoc3RyLCB2ZXJzaW9uKSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHZlcnNpb24gPSAnJXMnICUgdmVyc2lvbgoKICAgICAgICByZXR1cm4gdmVyc2lvbgoKCmNsYXNzIENvbmZpZ09wdGlvbnNIYW5kbGVyKENvbmZpZ0hhbmRsZXIpOgoKICAgIHNlY3Rpb25fcHJlZml4ID0gJ29wdGlvbnMnCgogICAgQHByb3BlcnR5CiAgICBkZWYgcGFyc2VycyhzZWxmKToKICAgICAgICAiIiJNZXRhZGF0YSBpdGVtIG5hbWUgdG8gcGFyc2VyIGZ1bmN0aW9uIG1hcHBpbmcuIiIiCiAgICAgICAgcGFyc2VfbGlzdCA9IHNlbGYuX3BhcnNlX2xpc3QKICAgICAgICBwYXJzZV9saXN0X3NlbWljb2xvbiA9IHBhcnRpYWwoc2VsZi5fcGFyc2VfbGlzdCwgc2VwYXJhdG9yPSc7JykKICAgICAgICBwYXJzZV9ib29sID0gc2VsZi5fcGFyc2VfYm9vbAogICAgICAgIHBhcnNlX2RpY3QgPSBzZWxmLl9wYXJzZV9kaWN0CgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICd6aXBfc2FmZSc6IHBhcnNlX2Jvb2wsCiAgICAgICAgICAgICd1c2VfMnRvMyc6IHBhcnNlX2Jvb2wsCiAgICAgICAgICAgICdpbmNsdWRlX3BhY2thZ2VfZGF0YSc6IHBhcnNlX2Jvb2wsCiAgICAgICAgICAgICdwYWNrYWdlX2Rpcic6IHBhcnNlX2RpY3QsCiAgICAgICAgICAgICd1c2VfMnRvM19maXhlcnMnOiBwYXJzZV9saXN0LAogICAgICAgICAgICAndXNlXzJ0bzNfZXhjbHVkZV9maXhlcnMnOiBwYXJzZV9saXN0LAogICAgICAgICAgICAnY29udmVydF8ydG8zX2RvY3Rlc3RzJzogcGFyc2VfbGlzdCwKICAgICAgICAgICAgJ3NjcmlwdHMnOiBwYXJzZV9saXN0LAogICAgICAgICAgICAnZWFnZXJfcmVzb3VyY2VzJzogcGFyc2VfbGlzdCwKICAgICAgICAgICAgJ2RlcGVuZGVuY3lfbGlua3MnOiBwYXJzZV9saXN0LAogICAgICAgICAgICAnbmFtZXNwYWNlX3BhY2thZ2VzJzogcGFyc2VfbGlzdCwKICAgICAgICAgICAgJ2luc3RhbGxfcmVxdWlyZXMnOiBwYXJzZV9saXN0X3NlbWljb2xvbiwKICAgICAgICAgICAgJ3NldHVwX3JlcXVpcmVzJzogcGFyc2VfbGlzdF9zZW1pY29sb24sCiAgICAgICAgICAgICd0ZXN0c19yZXF1aXJlJzogcGFyc2VfbGlzdF9zZW1pY29sb24sCiAgICAgICAgICAgICdwYWNrYWdlcyc6IHNlbGYuX3BhcnNlX3BhY2thZ2VzLAogICAgICAgICAgICAnZW50cnlfcG9pbnRzJzogc2VsZi5fcGFyc2VfZmlsZSwKICAgICAgICAgICAgJ3B5X21vZHVsZXMnOiBwYXJzZV9saXN0LAogICAgICAgICAgICAncHl0aG9uX3JlcXVpcmVzJzogU3BlY2lmaWVyU2V0LAogICAgICAgIH0KCiAgICBkZWYgX3BhcnNlX3BhY2thZ2VzKHNlbGYsIHZhbHVlKToKICAgICAgICAiIiJQYXJzZXMgYHBhY2thZ2VzYCBvcHRpb24gdmFsdWUuCgogICAgICAgIDpwYXJhbSB2YWx1ZToKICAgICAgICA6cnR5cGU6IGxpc3QKICAgICAgICAiIiIKICAgICAgICBmaW5kX2RpcmVjdGl2ZXMgPSBbJ2ZpbmQ6JywgJ2ZpbmRfbmFtZXNwYWNlOiddCiAgICAgICAgdHJpbW1lZF92YWx1ZSA9IHZhbHVlLnN0cmlwKCkKCiAgICAgICAgaWYgdHJpbW1lZF92YWx1ZSBub3QgaW4gZmluZF9kaXJlY3RpdmVzOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fcGFyc2VfbGlzdCh2YWx1ZSkKCiAgICAgICAgZmluZG5zID0gdHJpbW1lZF92YWx1ZSA9PSBmaW5kX2RpcmVjdGl2ZXNbMV0KICAgICAgICBpZiBmaW5kbnMgYW5kIG5vdCBQWTM6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKAogICAgICAgICAgICAgICAgJ2ZpbmRfbmFtZXNwYWNlOiBkaXJlY3RpdmUgaXMgdW5zdXBwb3J0ZWQgb24gUHl0aG9uIDwgMy4zJykKCiAgICAgICAgIyBSZWFkIGZ1bmN0aW9uIGFyZ3VtZW50cyBmcm9tIGEgZGVkaWNhdGVkIHNlY3Rpb24uCiAgICAgICAgZmluZF9rd2FyZ3MgPSBzZWxmLnBhcnNlX3NlY3Rpb25fcGFja2FnZXNfX2ZpbmQoCiAgICAgICAgICAgIHNlbGYuc2VjdGlvbnMuZ2V0KCdwYWNrYWdlcy5maW5kJywge30pKQoKICAgICAgICBpZiBmaW5kbnM6CiAgICAgICAgICAgIGZyb20gc2V0dXB0b29scyBpbXBvcnQgZmluZF9uYW1lc3BhY2VfcGFja2FnZXMgYXMgZmluZF9wYWNrYWdlcwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGZyb20gc2V0dXB0b29scyBpbXBvcnQgZmluZF9wYWNrYWdlcwoKICAgICAgICByZXR1cm4gZmluZF9wYWNrYWdlcygqKmZpbmRfa3dhcmdzKQoKICAgIGRlZiBwYXJzZV9zZWN0aW9uX3BhY2thZ2VzX19maW5kKHNlbGYsIHNlY3Rpb25fb3B0aW9ucyk6CiAgICAgICAgIiIiUGFyc2VzIGBwYWNrYWdlcy5maW5kYCBjb25maWd1cmF0aW9uIGZpbGUgc2VjdGlvbi4KCiAgICAgICAgVG8gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIF9wYXJzZV9wYWNrYWdlcygpLgoKICAgICAgICA6cGFyYW0gZGljdCBzZWN0aW9uX29wdGlvbnM6CiAgICAgICAgIiIiCiAgICAgICAgc2VjdGlvbl9kYXRhID0gc2VsZi5fcGFyc2Vfc2VjdGlvbl90b19kaWN0KAogICAgICAgICAgICBzZWN0aW9uX29wdGlvbnMsIHNlbGYuX3BhcnNlX2xpc3QpCgogICAgICAgIHZhbGlkX2tleXMgPSBbJ3doZXJlJywgJ2luY2x1ZGUnLCAnZXhjbHVkZSddCgogICAgICAgIGZpbmRfa3dhcmdzID0gZGljdCgKICAgICAgICAgICAgWyhrLCB2KSBmb3IgaywgdiBpbiBzZWN0aW9uX2RhdGEuaXRlbXMoKSBpZiBrIGluIHZhbGlkX2tleXMgYW5kIHZdKQoKICAgICAgICB3aGVyZSA9IGZpbmRfa3dhcmdzLmdldCgnd2hlcmUnKQogICAgICAgIGlmIHdoZXJlIGlzIG5vdCBOb25lOgogICAgICAgICAgICBmaW5kX2t3YXJnc1snd2hlcmUnXSA9IHdoZXJlWzBdICAjIGNhc3QgbGlzdCB0byBzaW5nbGUgdmFsCgogICAgICAgIHJldHVybiBmaW5kX2t3YXJncwoKICAgIGRlZiBwYXJzZV9zZWN0aW9uX2VudHJ5X3BvaW50cyhzZWxmLCBzZWN0aW9uX29wdGlvbnMpOgogICAgICAgICIiIlBhcnNlcyBgZW50cnlfcG9pbnRzYCBjb25maWd1cmF0aW9uIGZpbGUgc2VjdGlvbi4KCiAgICAgICAgOnBhcmFtIGRpY3Qgc2VjdGlvbl9vcHRpb25zOgogICAgICAgICIiIgogICAgICAgIHBhcnNlZCA9IHNlbGYuX3BhcnNlX3NlY3Rpb25fdG9fZGljdChzZWN0aW9uX29wdGlvbnMsIHNlbGYuX3BhcnNlX2xpc3QpCiAgICAgICAgc2VsZlsnZW50cnlfcG9pbnRzJ10gPSBwYXJzZWQKCiAgICBkZWYgX3BhcnNlX3BhY2thZ2VfZGF0YShzZWxmLCBzZWN0aW9uX29wdGlvbnMpOgogICAgICAgIHBhcnNlZCA9IHNlbGYuX3BhcnNlX3NlY3Rpb25fdG9fZGljdChzZWN0aW9uX29wdGlvbnMsIHNlbGYuX3BhcnNlX2xpc3QpCgogICAgICAgIHJvb3QgPSBwYXJzZWQuZ2V0KCcqJykKICAgICAgICBpZiByb290OgogICAgICAgICAgICBwYXJzZWRbJyddID0gcm9vdAogICAgICAgICAgICBkZWwgcGFyc2VkWycqJ10KCiAgICAgICAgcmV0dXJuIHBhcnNlZAoKICAgIGRlZiBwYXJzZV9zZWN0aW9uX3BhY2thZ2VfZGF0YShzZWxmLCBzZWN0aW9uX29wdGlvbnMpOgogICAgICAgICIiIlBhcnNlcyBgcGFja2FnZV9kYXRhYCBjb25maWd1cmF0aW9uIGZpbGUgc2VjdGlvbi4KCiAgICAgICAgOnBhcmFtIGRpY3Qgc2VjdGlvbl9vcHRpb25zOgogICAgICAgICIiIgogICAgICAgIHNlbGZbJ3BhY2thZ2VfZGF0YSddID0gc2VsZi5fcGFyc2VfcGFja2FnZV9kYXRhKHNlY3Rpb25fb3B0aW9ucykKCiAgICBkZWYgcGFyc2Vfc2VjdGlvbl9leGNsdWRlX3BhY2thZ2VfZGF0YShzZWxmLCBzZWN0aW9uX29wdGlvbnMpOgogICAgICAgICIiIlBhcnNlcyBgZXhjbHVkZV9wYWNrYWdlX2RhdGFgIGNvbmZpZ3VyYXRpb24gZmlsZSBzZWN0aW9uLgoKICAgICAgICA6cGFyYW0gZGljdCBzZWN0aW9uX29wdGlvbnM6CiAgICAgICAgIiIiCiAgICAgICAgc2VsZlsnZXhjbHVkZV9wYWNrYWdlX2RhdGEnXSA9IHNlbGYuX3BhcnNlX3BhY2thZ2VfZGF0YSgKICAgICAgICAgICAgc2VjdGlvbl9vcHRpb25zKQoKICAgIGRlZiBwYXJzZV9zZWN0aW9uX2V4dHJhc19yZXF1aXJlKHNlbGYsIHNlY3Rpb25fb3B0aW9ucyk6CiAgICAgICAgIiIiUGFyc2VzIGBleHRyYXNfcmVxdWlyZWAgY29uZmlndXJhdGlvbiBmaWxlIHNlY3Rpb24uCgogICAgICAgIDpwYXJhbSBkaWN0IHNlY3Rpb25fb3B0aW9uczoKICAgICAgICAiIiIKICAgICAgICBwYXJzZV9saXN0ID0gcGFydGlhbChzZWxmLl9wYXJzZV9saXN0LCBzZXBhcmF0b3I9JzsnKQogICAgICAgIHNlbGZbJ2V4dHJhc19yZXF1aXJlJ10gPSBzZWxmLl9wYXJzZV9zZWN0aW9uX3RvX2RpY3QoCiAgICAgICAgICAgIHNlY3Rpb25fb3B0aW9ucywgcGFyc2VfbGlzdCkKCiAgICBkZWYgcGFyc2Vfc2VjdGlvbl9kYXRhX2ZpbGVzKHNlbGYsIHNlY3Rpb25fb3B0aW9ucyk6CiAgICAgICAgIiIiUGFyc2VzIGBkYXRhX2ZpbGVzYCBjb25maWd1cmF0aW9uIGZpbGUgc2VjdGlvbi4KCiAgICAgICAgOnBhcmFtIGRpY3Qgc2VjdGlvbl9vcHRpb25zOgogICAgICAgICIiIgogICAgICAgIHBhcnNlZCA9IHNlbGYuX3BhcnNlX3NlY3Rpb25fdG9fZGljdChzZWN0aW9uX29wdGlvbnMsIHNlbGYuX3BhcnNlX2xpc3QpCiAgICAgICAgc2VsZlsnZGF0YV9maWxlcyddID0gWyhrLCB2KSBmb3IgaywgdiBpbiBwYXJzZWQuaXRlbXMoKV0KUEsDBBQAAAAAAAAAIQAaIgQypwMAAKcDAAA7AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvZGVwX3V0aWwucHlmcm9tIGRpc3R1dGlscy5kZXBfdXRpbCBpbXBvcnQgbmV3ZXJfZ3JvdXAKCiMgeWVzLCB0aGlzIGlzIHdhcyBhbG1vc3QgZW50aXJlbHkgY29weS1wYXN0ZWQgZnJvbQojICduZXdlcl9wYWlyd2lzZSgpJywgdGhpcyBpcyBqdXN0IGFub3RoZXIgY29udmVuaWVuY2UKIyBmdW5jdGlvbi4KZGVmIG5ld2VyX3BhaXJ3aXNlX2dyb3VwKHNvdXJjZXNfZ3JvdXBzLCB0YXJnZXRzKToKICAgICIiIldhbGsgYm90aCBhcmd1bWVudHMgaW4gcGFyYWxsZWwsIHRlc3RpbmcgaWYgZWFjaCBzb3VyY2UgZ3JvdXAgaXMgbmV3ZXIKICAgIHRoYW4gaXRzIGNvcnJlc3BvbmRpbmcgdGFyZ2V0LiBSZXR1cm5zIGEgcGFpciBvZiBsaXN0cyAoc291cmNlc19ncm91cHMsCiAgICB0YXJnZXRzKSB3aGVyZSBzb3VyY2VzIGlzIG5ld2VyIHRoYW4gdGFyZ2V0LCBhY2NvcmRpbmcgdG8gdGhlIHNlbWFudGljcwogICAgb2YgJ25ld2VyX2dyb3VwKCknLgogICAgIiIiCiAgICBpZiBsZW4oc291cmNlc19ncm91cHMpICE9IGxlbih0YXJnZXRzKToKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCInc291cmNlc19ncm91cCcgYW5kICd0YXJnZXRzJyBtdXN0IGJlIHRoZSBzYW1lIGxlbmd0aCIpCgogICAgIyBidWlsZCBhIHBhaXIgb2YgbGlzdHMgKHNvdXJjZXNfZ3JvdXBzLCB0YXJnZXRzKSB3aGVyZSBzb3VyY2UgaXMgbmV3ZXIKICAgIG5fc291cmNlcyA9IFtdCiAgICBuX3RhcmdldHMgPSBbXQogICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNvdXJjZXNfZ3JvdXBzKSk6CiAgICAgICAgaWYgbmV3ZXJfZ3JvdXAoc291cmNlc19ncm91cHNbaV0sIHRhcmdldHNbaV0pOgogICAgICAgICAgICBuX3NvdXJjZXMuYXBwZW5kKHNvdXJjZXNfZ3JvdXBzW2ldKQogICAgICAgICAgICBuX3RhcmdldHMuYXBwZW5kKHRhcmdldHNbaV0pCgogICAgcmV0dXJuIG5fc291cmNlcywgbl90YXJnZXRzClBLAwQUAAAAAAAAACEA/RlbCo0VAACNFQAAOgAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2RlcGVuZHMucHlpbXBvcnQgc3lzCmltcG9ydCBtYXJzaGFsCmltcG9ydCBjb250ZXh0bGliCmZyb20gZGlzdHV0aWxzLnZlcnNpb24gaW1wb3J0IFN0cmljdFZlcnNpb24KCmZyb20gLnB5MzNjb21wYXQgaW1wb3J0IEJ5dGVjb2RlCgpmcm9tIC5weTI3Y29tcGF0IGltcG9ydCBmaW5kX21vZHVsZSwgUFlfQ09NUElMRUQsIFBZX0ZST1pFTiwgUFlfU09VUkNFCmZyb20gLiBpbXBvcnQgcHkyN2NvbXBhdAoKCl9fYWxsX18gPSBbCiAgICAnUmVxdWlyZScsICdmaW5kX21vZHVsZScsICdnZXRfbW9kdWxlX2NvbnN0YW50JywgJ2V4dHJhY3RfY29uc3RhbnQnCl0KCgpjbGFzcyBSZXF1aXJlOgogICAgIiIiQSBwcmVyZXF1aXNpdGUgdG8gYnVpbGRpbmcgb3IgaW5zdGFsbGluZyBhIGRpc3RyaWJ1dGlvbiIiIgoKICAgIGRlZiBfX2luaXRfXygKICAgICAgICAgICAgc2VsZiwgbmFtZSwgcmVxdWVzdGVkX3ZlcnNpb24sIG1vZHVsZSwgaG9tZXBhZ2U9JycsCiAgICAgICAgICAgIGF0dHJpYnV0ZT1Ob25lLCBmb3JtYXQ9Tm9uZSk6CgogICAgICAgIGlmIGZvcm1hdCBpcyBOb25lIGFuZCByZXF1ZXN0ZWRfdmVyc2lvbiBpcyBub3QgTm9uZToKICAgICAgICAgICAgZm9ybWF0ID0gU3RyaWN0VmVyc2lvbgoKICAgICAgICBpZiBmb3JtYXQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJlcXVlc3RlZF92ZXJzaW9uID0gZm9ybWF0KHJlcXVlc3RlZF92ZXJzaW9uKQogICAgICAgICAgICBpZiBhdHRyaWJ1dGUgaXMgTm9uZToKICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICdfX3ZlcnNpb25fXycKCiAgICAgICAgc2VsZi5fX2RpY3RfXy51cGRhdGUobG9jYWxzKCkpCiAgICAgICAgZGVsIHNlbGYuc2VsZgoKICAgIGRlZiBmdWxsX25hbWUoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIGZ1bGwgcGFja2FnZS9kaXN0cmlidXRpb24gbmFtZSwgdy92ZXJzaW9uIiIiCiAgICAgICAgaWYgc2VsZi5yZXF1ZXN0ZWRfdmVyc2lvbiBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuICclcy0lcycgJSAoc2VsZi5uYW1lLCBzZWxmLnJlcXVlc3RlZF92ZXJzaW9uKQogICAgICAgIHJldHVybiBzZWxmLm5hbWUKCiAgICBkZWYgdmVyc2lvbl9vayhzZWxmLCB2ZXJzaW9uKToKICAgICAgICAiIiJJcyAndmVyc2lvbicgc3VmZmljaWVudGx5IHVwLXRvLWRhdGU/IiIiCiAgICAgICAgcmV0dXJuIHNlbGYuYXR0cmlidXRlIGlzIE5vbmUgb3Igc2VsZi5mb3JtYXQgaXMgTm9uZSBvciBcCiAgICAgICAgICAgIHN0cih2ZXJzaW9uKSAhPSAidW5rbm93biIgYW5kIHZlcnNpb24gPj0gc2VsZi5yZXF1ZXN0ZWRfdmVyc2lvbgoKICAgIGRlZiBnZXRfdmVyc2lvbihzZWxmLCBwYXRocz1Ob25lLCBkZWZhdWx0PSJ1bmtub3duIik6CiAgICAgICAgIiIiR2V0IHZlcnNpb24gbnVtYmVyIG9mIGluc3RhbGxlZCBtb2R1bGUsICdOb25lJywgb3IgJ2RlZmF1bHQnCgogICAgICAgIFNlYXJjaCAncGF0aHMnIGZvciBtb2R1bGUuICBJZiBub3QgZm91bmQsIHJldHVybiAnTm9uZScuICBJZiBmb3VuZCwKICAgICAgICByZXR1cm4gdGhlIGV4dHJhY3RlZCB2ZXJzaW9uIGF0dHJpYnV0ZSwgb3IgJ2RlZmF1bHQnIGlmIG5vIHZlcnNpb24KICAgICAgICBhdHRyaWJ1dGUgd2FzIHNwZWNpZmllZCwgb3IgdGhlIHZhbHVlIGNhbm5vdCBiZSBkZXRlcm1pbmVkIHdpdGhvdXQKICAgICAgICBpbXBvcnRpbmcgdGhlIG1vZHVsZS4gIFRoZSB2ZXJzaW9uIGlzIGZvcm1hdHRlZCBhY2NvcmRpbmcgdG8gdGhlCiAgICAgICAgcmVxdWlyZW1lbnQncyB2ZXJzaW9uIGZvcm1hdCAoaWYgYW55KSwgdW5sZXNzIGl0IGlzICdOb25lJyBvciB0aGUKICAgICAgICBzdXBwbGllZCAnZGVmYXVsdCcuCiAgICAgICAgIiIiCgogICAgICAgIGlmIHNlbGYuYXR0cmlidXRlIGlzIE5vbmU6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGYsIHAsIGkgPSBmaW5kX21vZHVsZShzZWxmLm1vZHVsZSwgcGF0aHMpCiAgICAgICAgICAgICAgICBpZiBmOgogICAgICAgICAgICAgICAgICAgIGYuY2xvc2UoKQogICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHQKICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgdiA9IGdldF9tb2R1bGVfY29uc3RhbnQoc2VsZi5tb2R1bGUsIHNlbGYuYXR0cmlidXRlLCBkZWZhdWx0LCBwYXRocykKCiAgICAgICAgaWYgdiBpcyBub3QgTm9uZSBhbmQgdiBpcyBub3QgZGVmYXVsdCBhbmQgc2VsZi5mb3JtYXQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmZvcm1hdCh2KQoKICAgICAgICByZXR1cm4gdgoKICAgIGRlZiBpc19wcmVzZW50KHNlbGYsIHBhdGhzPU5vbmUpOgogICAgICAgICIiIlJldHVybiB0cnVlIGlmIGRlcGVuZGVuY3kgaXMgcHJlc2VudCBvbiAncGF0aHMnIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuZ2V0X3ZlcnNpb24ocGF0aHMpIGlzIG5vdCBOb25lCgogICAgZGVmIGlzX2N1cnJlbnQoc2VsZiwgcGF0aHM9Tm9uZSk6CiAgICAgICAgIiIiUmV0dXJuIHRydWUgaWYgZGVwZW5kZW5jeSBpcyBwcmVzZW50IGFuZCB1cC10by1kYXRlIG9uICdwYXRocyciIiIKICAgICAgICB2ZXJzaW9uID0gc2VsZi5nZXRfdmVyc2lvbihwYXRocykKICAgICAgICBpZiB2ZXJzaW9uIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIHJldHVybiBzZWxmLnZlcnNpb25fb2sodmVyc2lvbikKCgpkZWYgbWF5YmVfY2xvc2UoZik6CiAgICBAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgogICAgZGVmIGVtcHR5KCk6CiAgICAgICAgeWllbGQKICAgICAgICByZXR1cm4KICAgIGlmIG5vdCBmOgogICAgICAgIHJldHVybiBlbXB0eSgpCgogICAgcmV0dXJuIGNvbnRleHRsaWIuY2xvc2luZyhmKQoKCmRlZiBnZXRfbW9kdWxlX2NvbnN0YW50KG1vZHVsZSwgc3ltYm9sLCBkZWZhdWx0PS0xLCBwYXRocz1Ob25lKToKICAgICIiIkZpbmQgJ21vZHVsZScgYnkgc2VhcmNoaW5nICdwYXRocycsIGFuZCBleHRyYWN0ICdzeW1ib2wnCgogICAgUmV0dXJuICdOb25lJyBpZiAnbW9kdWxlJyBkb2VzIG5vdCBleGlzdCBvbiAncGF0aHMnLCBvciBpdCBkb2VzIG5vdCBkZWZpbmUKICAgICdzeW1ib2wnLiAgSWYgdGhlIG1vZHVsZSBkZWZpbmVzICdzeW1ib2wnIGFzIGEgY29uc3RhbnQsIHJldHVybiB0aGUKICAgIGNvbnN0YW50LiAgT3RoZXJ3aXNlLCByZXR1cm4gJ2RlZmF1bHQnLiIiIgoKICAgIHRyeToKICAgICAgICBmLCBwYXRoLCAoc3VmZml4LCBtb2RlLCBraW5kKSA9IGluZm8gPSBmaW5kX21vZHVsZShtb2R1bGUsIHBhdGhzKQogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICMgTW9kdWxlIGRvZXNuJ3QgZXhpc3QKICAgICAgICByZXR1cm4gTm9uZQoKICAgIHdpdGggbWF5YmVfY2xvc2UoZik6CiAgICAgICAgaWYga2luZCA9PSBQWV9DT01QSUxFRDoKICAgICAgICAgICAgZi5yZWFkKDgpICAjIHNraXAgbWFnaWMgJiBkYXRlCiAgICAgICAgICAgIGNvZGUgPSBtYXJzaGFsLmxvYWQoZikKICAgICAgICBlbGlmIGtpbmQgPT0gUFlfRlJPWkVOOgogICAgICAgICAgICBjb2RlID0gcHkyN2NvbXBhdC5nZXRfZnJvemVuX29iamVjdChtb2R1bGUsIHBhdGhzKQogICAgICAgIGVsaWYga2luZCA9PSBQWV9TT1VSQ0U6CiAgICAgICAgICAgIGNvZGUgPSBjb21waWxlKGYucmVhZCgpLCBwYXRoLCAnZXhlYycpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBOb3Qgc29tZXRoaW5nIHdlIGNhbiBwYXJzZTsgd2UnbGwgaGF2ZSB0byBpbXBvcnQgaXQuICA6KAogICAgICAgICAgICBpbXBvcnRlZCA9IHB5Mjdjb21wYXQuZ2V0X21vZHVsZShtb2R1bGUsIHBhdGhzLCBpbmZvKQogICAgICAgICAgICByZXR1cm4gZ2V0YXR0cihpbXBvcnRlZCwgc3ltYm9sLCBOb25lKQoKICAgIHJldHVybiBleHRyYWN0X2NvbnN0YW50KGNvZGUsIHN5bWJvbCwgZGVmYXVsdCkKCgpkZWYgZXh0cmFjdF9jb25zdGFudChjb2RlLCBzeW1ib2wsIGRlZmF1bHQ9LTEpOgogICAgIiIiRXh0cmFjdCB0aGUgY29uc3RhbnQgdmFsdWUgb2YgJ3N5bWJvbCcgZnJvbSAnY29kZScKCiAgICBJZiB0aGUgbmFtZSAnc3ltYm9sJyBpcyBib3VuZCB0byBhIGNvbnN0YW50IHZhbHVlIGJ5IHRoZSBQeXRob24gY29kZQogICAgb2JqZWN0ICdjb2RlJywgcmV0dXJuIHRoYXQgdmFsdWUuICBJZiAnc3ltYm9sJyBpcyBib3VuZCB0byBhbiBleHByZXNzaW9uLAogICAgcmV0dXJuICdkZWZhdWx0Jy4gIE90aGVyd2lzZSwgcmV0dXJuICdOb25lJy4KCiAgICBSZXR1cm4gdmFsdWUgaXMgYmFzZWQgb24gdGhlIGZpcnN0IGFzc2lnbm1lbnQgdG8gJ3N5bWJvbCcuICAnc3ltYm9sJyBtdXN0CiAgICBiZSBhIGdsb2JhbCwgb3IgYXQgbGVhc3QgYSBub24tImZhc3QiIGxvY2FsIGluIHRoZSBjb2RlIGJsb2NrLiAgVGhhdCBpcywKICAgIG9ubHkgJ1NUT1JFX05BTUUnIGFuZCAnU1RPUkVfR0xPQkFMJyBvcGNvZGVzIGFyZSBjaGVja2VkLCBhbmQgJ3N5bWJvbCcKICAgIG11c3QgYmUgcHJlc2VudCBpbiAnY29kZS5jb19uYW1lcycuCiAgICAiIiIKICAgIGlmIHN5bWJvbCBub3QgaW4gY29kZS5jb19uYW1lczoKICAgICAgICAjIG5hbWUncyBub3QgdGhlcmUsIGNhbid0IHBvc3NpYmx5IGJlIGFuIGFzc2lnbm1lbnQKICAgICAgICByZXR1cm4gTm9uZQoKICAgIG5hbWVfaWR4ID0gbGlzdChjb2RlLmNvX25hbWVzKS5pbmRleChzeW1ib2wpCgogICAgU1RPUkVfTkFNRSA9IDkwCiAgICBTVE9SRV9HTE9CQUwgPSA5NwogICAgTE9BRF9DT05TVCA9IDEwMAoKICAgIGNvbnN0ID0gZGVmYXVsdAoKICAgIGZvciBieXRlX2NvZGUgaW4gQnl0ZWNvZGUoY29kZSk6CiAgICAgICAgb3AgPSBieXRlX2NvZGUub3Bjb2RlCiAgICAgICAgYXJnID0gYnl0ZV9jb2RlLmFyZwoKICAgICAgICBpZiBvcCA9PSBMT0FEX0NPTlNUOgogICAgICAgICAgICBjb25zdCA9IGNvZGUuY29fY29uc3RzW2FyZ10KICAgICAgICBlbGlmIGFyZyA9PSBuYW1lX2lkeCBhbmQgKG9wID09IFNUT1JFX05BTUUgb3Igb3AgPT0gU1RPUkVfR0xPQkFMKToKICAgICAgICAgICAgcmV0dXJuIGNvbnN0CiAgICAgICAgZWxzZToKICAgICAgICAgICAgY29uc3QgPSBkZWZhdWx0CgoKZGVmIF91cGRhdGVfZ2xvYmFscygpOgogICAgIiIiCiAgICBQYXRjaCB0aGUgZ2xvYmFscyB0byByZW1vdmUgdGhlIG9iamVjdHMgbm90IGF2YWlsYWJsZSBvbiBzb21lIHBsYXRmb3Jtcy4KCiAgICBYWFggaXQnZCBiZSBiZXR0ZXIgdG8gdGVzdCBhc3NlcnRpb25zIGFib3V0IGJ5dGVjb2RlIGluc3RlYWQuCiAgICAiIiIKCiAgICBpZiBub3Qgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2phdmEnKSBhbmQgc3lzLnBsYXRmb3JtICE9ICdjbGknOgogICAgICAgIHJldHVybgogICAgaW5jb21wYXRpYmxlID0gJ2V4dHJhY3RfY29uc3RhbnQnLCAnZ2V0X21vZHVsZV9jb25zdGFudCcKICAgIGZvciBuYW1lIGluIGluY29tcGF0aWJsZToKICAgICAgICBkZWwgZ2xvYmFscygpW25hbWVdCiAgICAgICAgX19hbGxfXy5yZW1vdmUobmFtZSkKCgpfdXBkYXRlX2dsb2JhbHMoKQpQSwMEFAAAAAAAAAAhABXyX5TBwgAAwcIAADcAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9kaXN0LnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KX19hbGxfXyA9IFsnRGlzdHJpYnV0aW9uJ10KCmltcG9ydCBpbwppbXBvcnQgc3lzCmltcG9ydCByZQppbXBvcnQgb3MKaW1wb3J0IHdhcm5pbmdzCmltcG9ydCBudW1iZXJzCmltcG9ydCBkaXN0dXRpbHMubG9nCmltcG9ydCBkaXN0dXRpbHMuY29yZQppbXBvcnQgZGlzdHV0aWxzLmNtZAppbXBvcnQgZGlzdHV0aWxzLmRpc3QKZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgc3RydG9ib29sCmZyb20gZGlzdHV0aWxzLmRlYnVnIGltcG9ydCBERUJVRwpmcm9tIGRpc3R1dGlscy5mYW5jeV9nZXRvcHQgaW1wb3J0IHRyYW5zbGF0ZV9sb25nb3B0CmltcG9ydCBpdGVydG9vbHMKCmZyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlZmF1bHRkaWN0CmZyb20gZW1haWwgaW1wb3J0IG1lc3NhZ2VfZnJvbV9maWxlCgpmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0ICgKICAgIERpc3R1dGlsc09wdGlvbkVycm9yLCBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yLCBEaXN0dXRpbHNTZXR1cEVycm9yLAopCmZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IHJmYzgyMl9lc2NhcGUKZnJvbSBkaXN0dXRpbHMudmVyc2lvbiBpbXBvcnQgU3RyaWN0VmVyc2lvbgoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybiBpbXBvcnQgc2l4CmZyb20gc2V0dXB0b29scy5leHRlcm4gaW1wb3J0IHBhY2thZ2luZwpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuIGltcG9ydCBvcmRlcmVkX3NldApmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnNpeC5tb3ZlcyBpbXBvcnQgbWFwLCBmaWx0ZXIsIGZpbHRlcmZhbHNlCgpmcm9tIC4gaW1wb3J0IFNldHVwdG9vbHNEZXByZWNhdGlvbldhcm5pbmcKCmZyb20gc2V0dXB0b29scy5kZXBlbmRzIGltcG9ydCBSZXF1aXJlCmZyb20gc2V0dXB0b29scyBpbXBvcnQgd2luZG93c19zdXBwb3J0CmZyb20gc2V0dXB0b29scy5tb25rZXkgaW1wb3J0IGdldF91bnBhdGNoZWQKZnJvbSBzZXR1cHRvb2xzLmNvbmZpZyBpbXBvcnQgcGFyc2VfY29uZmlndXJhdGlvbgppbXBvcnQgcGtnX3Jlc291cmNlcwoKX19pbXBvcnRfXygnc2V0dXB0b29scy5leHRlcm4ucGFja2FnaW5nLnNwZWNpZmllcnMnKQpfX2ltcG9ydF9fKCdzZXR1cHRvb2xzLmV4dGVybi5wYWNrYWdpbmcudmVyc2lvbicpCgoKZGVmIF9nZXRfdW5wYXRjaGVkKGNscyk6CiAgICB3YXJuaW5ncy53YXJuKCJEbyBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uIiwgRGlzdERlcHJlY2F0aW9uV2FybmluZykKICAgIHJldHVybiBnZXRfdW5wYXRjaGVkKGNscykKCgpkZWYgZ2V0X21ldGFkYXRhX3ZlcnNpb24oc2VsZik6CiAgICBtdiA9IGdldGF0dHIoc2VsZiwgJ21ldGFkYXRhX3ZlcnNpb24nLCBOb25lKQoKICAgIGlmIG12IGlzIE5vbmU6CiAgICAgICAgaWYgc2VsZi5sb25nX2Rlc2NyaXB0aW9uX2NvbnRlbnRfdHlwZSBvciBzZWxmLnByb3ZpZGVzX2V4dHJhczoKICAgICAgICAgICAgbXYgPSBTdHJpY3RWZXJzaW9uKCcyLjEnKQogICAgICAgIGVsaWYgKHNlbGYubWFpbnRhaW5lciBpcyBub3QgTm9uZSBvcgogICAgICAgICAgICAgIHNlbGYubWFpbnRhaW5lcl9lbWFpbCBpcyBub3QgTm9uZSBvcgogICAgICAgICAgICAgIGdldGF0dHIoc2VsZiwgJ3B5dGhvbl9yZXF1aXJlcycsIE5vbmUpIGlzIG5vdCBOb25lIG9yCiAgICAgICAgICAgICAgc2VsZi5wcm9qZWN0X3VybHMpOgogICAgICAgICAgICBtdiA9IFN0cmljdFZlcnNpb24oJzEuMicpCiAgICAgICAgZWxpZiAoc2VsZi5wcm92aWRlcyBvciBzZWxmLnJlcXVpcmVzIG9yIHNlbGYub2Jzb2xldGVzIG9yCiAgICAgICAgICAgICAgICBzZWxmLmNsYXNzaWZpZXJzIG9yIHNlbGYuZG93bmxvYWRfdXJsKToKICAgICAgICAgICAgbXYgPSBTdHJpY3RWZXJzaW9uKCcxLjEnKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG12ID0gU3RyaWN0VmVyc2lvbignMS4wJykKCiAgICAgICAgc2VsZi5tZXRhZGF0YV92ZXJzaW9uID0gbXYKCiAgICByZXR1cm4gbXYKCgpkZWYgcmVhZF9wa2dfZmlsZShzZWxmLCBmaWxlKToKICAgICIiIlJlYWRzIHRoZSBtZXRhZGF0YSB2YWx1ZXMgZnJvbSBhIGZpbGUgb2JqZWN0LiIiIgogICAgbXNnID0gbWVzc2FnZV9mcm9tX2ZpbGUoZmlsZSkKCiAgICBkZWYgX3JlYWRfZmllbGQobmFtZSk6CiAgICAgICAgdmFsdWUgPSBtc2dbbmFtZV0KICAgICAgICBpZiB2YWx1ZSA9PSAnVU5LTk9XTic6CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgcmV0dXJuIHZhbHVlCgogICAgZGVmIF9yZWFkX2xpc3QobmFtZSk6CiAgICAgICAgdmFsdWVzID0gbXNnLmdldF9hbGwobmFtZSwgTm9uZSkKICAgICAgICBpZiB2YWx1ZXMgPT0gW106CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgcmV0dXJuIHZhbHVlcwoKICAgIHNlbGYubWV0YWRhdGFfdmVyc2lvbiA9IFN0cmljdFZlcnNpb24obXNnWydtZXRhZGF0YS12ZXJzaW9uJ10pCiAgICBzZWxmLm5hbWUgPSBfcmVhZF9maWVsZCgnbmFtZScpCiAgICBzZWxmLnZlcnNpb24gPSBfcmVhZF9maWVsZCgndmVyc2lvbicpCiAgICBzZWxmLmRlc2NyaXB0aW9uID0gX3JlYWRfZmllbGQoJ3N1bW1hcnknKQogICAgIyB3ZSBhcmUgZmlsbGluZyBhdXRob3Igb25seS4KICAgIHNlbGYuYXV0aG9yID0gX3JlYWRfZmllbGQoJ2F1dGhvcicpCiAgICBzZWxmLm1haW50YWluZXIgPSBOb25lCiAgICBzZWxmLmF1dGhvcl9lbWFpbCA9IF9yZWFkX2ZpZWxkKCdhdXRob3ItZW1haWwnKQogICAgc2VsZi5tYWludGFpbmVyX2VtYWlsID0gTm9uZQogICAgc2VsZi51cmwgPSBfcmVhZF9maWVsZCgnaG9tZS1wYWdlJykKICAgIHNlbGYubGljZW5zZSA9IF9yZWFkX2ZpZWxkKCdsaWNlbnNlJykKCiAgICBpZiAnZG93bmxvYWQtdXJsJyBpbiBtc2c6CiAgICAgICAgc2VsZi5kb3dubG9hZF91cmwgPSBfcmVhZF9maWVsZCgnZG93bmxvYWQtdXJsJykKICAgIGVsc2U6CiAgICAgICAgc2VsZi5kb3dubG9hZF91cmwgPSBOb25lCgogICAgc2VsZi5sb25nX2Rlc2NyaXB0aW9uID0gX3JlYWRfZmllbGQoJ2Rlc2NyaXB0aW9uJykKICAgIHNlbGYuZGVzY3JpcHRpb24gPSBfcmVhZF9maWVsZCgnc3VtbWFyeScpCgogICAgaWYgJ2tleXdvcmRzJyBpbiBtc2c6CiAgICAgICAgc2VsZi5rZXl3b3JkcyA9IF9yZWFkX2ZpZWxkKCdrZXl3b3JkcycpLnNwbGl0KCcsJykKCiAgICBzZWxmLnBsYXRmb3JtcyA9IF9yZWFkX2xpc3QoJ3BsYXRmb3JtJykKICAgIHNlbGYuY2xhc3NpZmllcnMgPSBfcmVhZF9saXN0KCdjbGFzc2lmaWVyJykKCiAgICAjIFBFUCAzMTQgLSB0aGVzZSBmaWVsZHMgb25seSBleGlzdCBpbiAxLjEKICAgIGlmIHNlbGYubWV0YWRhdGFfdmVyc2lvbiA9PSBTdHJpY3RWZXJzaW9uKCcxLjEnKToKICAgICAgICBzZWxmLnJlcXVpcmVzID0gX3JlYWRfbGlzdCgncmVxdWlyZXMnKQogICAgICAgIHNlbGYucHJvdmlkZXMgPSBfcmVhZF9saXN0KCdwcm92aWRlcycpCiAgICAgICAgc2VsZi5vYnNvbGV0ZXMgPSBfcmVhZF9saXN0KCdvYnNvbGV0ZXMnKQogICAgZWxzZToKICAgICAgICBzZWxmLnJlcXVpcmVzID0gTm9uZQogICAgICAgIHNlbGYucHJvdmlkZXMgPSBOb25lCiAgICAgICAgc2VsZi5vYnNvbGV0ZXMgPSBOb25lCgoKIyBCYXNlZCBvbiBQeXRob24gMy41IHZlcnNpb24KZGVmIHdyaXRlX3BrZ19maWxlKHNlbGYsIGZpbGUpOgogICAgIiIiV3JpdGUgdGhlIFBLRy1JTkZPIGZvcm1hdCBkYXRhIHRvIGEgZmlsZSBvYmplY3QuCiAgICAiIiIKICAgIHZlcnNpb24gPSBzZWxmLmdldF9tZXRhZGF0YV92ZXJzaW9uKCkKCiAgICBpZiBzaXguUFkyOgogICAgICAgIGRlZiB3cml0ZV9maWVsZChrZXksIHZhbHVlKToKICAgICAgICAgICAgZmlsZS53cml0ZSgiJXM6ICVzXG4iICUgKGtleSwgc2VsZi5fZW5jb2RlX2ZpZWxkKHZhbHVlKSkpCiAgICBlbHNlOgogICAgICAgIGRlZiB3cml0ZV9maWVsZChrZXksIHZhbHVlKToKICAgICAgICAgICAgZmlsZS53cml0ZSgiJXM6ICVzXG4iICUgKGtleSwgdmFsdWUpKQoKICAgIHdyaXRlX2ZpZWxkKCdNZXRhZGF0YS1WZXJzaW9uJywgc3RyKHZlcnNpb24pKQogICAgd3JpdGVfZmllbGQoJ05hbWUnLCBzZWxmLmdldF9uYW1lKCkpCiAgICB3cml0ZV9maWVsZCgnVmVyc2lvbicsIHNlbGYuZ2V0X3ZlcnNpb24oKSkKICAgIHdyaXRlX2ZpZWxkKCdTdW1tYXJ5Jywgc2VsZi5nZXRfZGVzY3JpcHRpb24oKSkKICAgIHdyaXRlX2ZpZWxkKCdIb21lLXBhZ2UnLCBzZWxmLmdldF91cmwoKSkKCiAgICBpZiB2ZXJzaW9uIDwgU3RyaWN0VmVyc2lvbignMS4yJyk6CiAgICAgICAgd3JpdGVfZmllbGQoJ0F1dGhvcicsIHNlbGYuZ2V0X2NvbnRhY3QoKSkKICAgICAgICB3cml0ZV9maWVsZCgnQXV0aG9yLWVtYWlsJywgc2VsZi5nZXRfY29udGFjdF9lbWFpbCgpKQogICAgZWxzZToKICAgICAgICBvcHRpb25hbF9maWVsZHMgPSAoCiAgICAgICAgICAgICgnQXV0aG9yJywgJ2F1dGhvcicpLAogICAgICAgICAgICAoJ0F1dGhvci1lbWFpbCcsICdhdXRob3JfZW1haWwnKSwKICAgICAgICAgICAgKCdNYWludGFpbmVyJywgJ21haW50YWluZXInKSwKICAgICAgICAgICAgKCdNYWludGFpbmVyLWVtYWlsJywgJ21haW50YWluZXJfZW1haWwnKSwKICAgICAgICApCgogICAgICAgIGZvciBmaWVsZCwgYXR0ciBpbiBvcHRpb25hbF9maWVsZHM6CiAgICAgICAgICAgIGF0dHJfdmFsID0gZ2V0YXR0cihzZWxmLCBhdHRyKQoKICAgICAgICAgICAgaWYgYXR0cl92YWwgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICB3cml0ZV9maWVsZChmaWVsZCwgYXR0cl92YWwpCgogICAgd3JpdGVfZmllbGQoJ0xpY2Vuc2UnLCBzZWxmLmdldF9saWNlbnNlKCkpCiAgICBpZiBzZWxmLmRvd25sb2FkX3VybDoKICAgICAgICB3cml0ZV9maWVsZCgnRG93bmxvYWQtVVJMJywgc2VsZi5kb3dubG9hZF91cmwpCiAgICBmb3IgcHJvamVjdF91cmwgaW4gc2VsZi5wcm9qZWN0X3VybHMuaXRlbXMoKToKICAgICAgICB3cml0ZV9maWVsZCgnUHJvamVjdC1VUkwnLCAgJyVzLCAlcycgJSBwcm9qZWN0X3VybCkKCiAgICBsb25nX2Rlc2MgPSByZmM4MjJfZXNjYXBlKHNlbGYuZ2V0X2xvbmdfZGVzY3JpcHRpb24oKSkKICAgIHdyaXRlX2ZpZWxkKCdEZXNjcmlwdGlvbicsIGxvbmdfZGVzYykKCiAgICBrZXl3b3JkcyA9ICcsJy5qb2luKHNlbGYuZ2V0X2tleXdvcmRzKCkpCiAgICBpZiBrZXl3b3JkczoKICAgICAgICB3cml0ZV9maWVsZCgnS2V5d29yZHMnLCBrZXl3b3JkcykKCiAgICBpZiB2ZXJzaW9uID49IFN0cmljdFZlcnNpb24oJzEuMicpOgogICAgICAgIGZvciBwbGF0Zm9ybSBpbiBzZWxmLmdldF9wbGF0Zm9ybXMoKToKICAgICAgICAgICAgd3JpdGVfZmllbGQoJ1BsYXRmb3JtJywgcGxhdGZvcm0pCiAgICBlbHNlOgogICAgICAgIHNlbGYuX3dyaXRlX2xpc3QoZmlsZSwgJ1BsYXRmb3JtJywgc2VsZi5nZXRfcGxhdGZvcm1zKCkpCgogICAgc2VsZi5fd3JpdGVfbGlzdChmaWxlLCAnQ2xhc3NpZmllcicsIHNlbGYuZ2V0X2NsYXNzaWZpZXJzKCkpCgogICAgIyBQRVAgMzE0CiAgICBzZWxmLl93cml0ZV9saXN0KGZpbGUsICdSZXF1aXJlcycsIHNlbGYuZ2V0X3JlcXVpcmVzKCkpCiAgICBzZWxmLl93cml0ZV9saXN0KGZpbGUsICdQcm92aWRlcycsIHNlbGYuZ2V0X3Byb3ZpZGVzKCkpCiAgICBzZWxmLl93cml0ZV9saXN0KGZpbGUsICdPYnNvbGV0ZXMnLCBzZWxmLmdldF9vYnNvbGV0ZXMoKSkKCiAgICAjIFNldHVwdG9vbHMgc3BlY2lmaWMgZm9yIFBFUCAzNDUKICAgIGlmIGhhc2F0dHIoc2VsZiwgJ3B5dGhvbl9yZXF1aXJlcycpOgogICAgICAgIHdyaXRlX2ZpZWxkKCdSZXF1aXJlcy1QeXRob24nLCBzZWxmLnB5dGhvbl9yZXF1aXJlcykKCiAgICAjIFBFUCA1NjYKICAgIGlmIHNlbGYubG9uZ19kZXNjcmlwdGlvbl9jb250ZW50X3R5cGU6CiAgICAgICAgd3JpdGVfZmllbGQoCiAgICAgICAgICAgICdEZXNjcmlwdGlvbi1Db250ZW50LVR5cGUnLAogICAgICAgICAgICBzZWxmLmxvbmdfZGVzY3JpcHRpb25fY29udGVudF90eXBlCiAgICAgICAgKQogICAgaWYgc2VsZi5wcm92aWRlc19leHRyYXM6CiAgICAgICAgZm9yIGV4dHJhIGluIHNlbGYucHJvdmlkZXNfZXh0cmFzOgogICAgICAgICAgICB3cml0ZV9maWVsZCgnUHJvdmlkZXMtRXh0cmEnLCBleHRyYSkKCgpzZXF1ZW5jZSA9IHR1cGxlLCBsaXN0CgoKZGVmIGNoZWNrX2ltcG9ydGFibGUoZGlzdCwgYXR0ciwgdmFsdWUpOgogICAgdHJ5OgogICAgICAgIGVwID0gcGtnX3Jlc291cmNlcy5FbnRyeVBvaW50LnBhcnNlKCd4PScgKyB2YWx1ZSkKICAgICAgICBhc3NlcnQgbm90IGVwLmV4dHJhcwogICAgZXhjZXB0IChUeXBlRXJyb3IsIFZhbHVlRXJyb3IsIEF0dHJpYnV0ZUVycm9yLCBBc3NlcnRpb25FcnJvcik6CiAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKICAgICAgICAgICAgIiVyIG11c3QgYmUgaW1wb3J0YWJsZSAnbW9kdWxlOmF0dHJzJyBzdHJpbmcgKGdvdCAlcikiCiAgICAgICAgICAgICUgKGF0dHIsIHZhbHVlKQogICAgICAgICkKCgpkZWYgYXNzZXJ0X3N0cmluZ19saXN0KGRpc3QsIGF0dHIsIHZhbHVlKToKICAgICIiIlZlcmlmeSB0aGF0IHZhbHVlIGlzIGEgc3RyaW5nIGxpc3QiIiIKICAgIHRyeToKICAgICAgICAjIHZlcmlmeSB0aGF0IHZhbHVlIGlzIGEgbGlzdCBvciB0dXBsZSB0byBleGNsdWRlIHVub3JkZXJlZAogICAgICAgICMgb3Igc2luZ2xlLXVzZSBpdGVyYWJsZXMKICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh2YWx1ZSwgKGxpc3QsIHR1cGxlKSkKICAgICAgICAjIHZlcmlmeSB0aGF0IGVsZW1lbnRzIG9mIHZhbHVlIGFyZSBzdHJpbmdzCiAgICAgICAgYXNzZXJ0ICcnLmpvaW4odmFsdWUpICE9IHZhbHVlCiAgICBleGNlcHQgKFR5cGVFcnJvciwgVmFsdWVFcnJvciwgQXR0cmlidXRlRXJyb3IsIEFzc2VydGlvbkVycm9yKToKICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAogICAgICAgICAgICAiJXIgbXVzdCBiZSBhIGxpc3Qgb2Ygc3RyaW5ncyAoZ290ICVyKSIgJSAoYXR0ciwgdmFsdWUpCiAgICAgICAgKQoKCmRlZiBjaGVja19uc3AoZGlzdCwgYXR0ciwgdmFsdWUpOgogICAgIiIiVmVyaWZ5IHRoYXQgbmFtZXNwYWNlIHBhY2thZ2VzIGFyZSB2YWxpZCIiIgogICAgbnNfcGFja2FnZXMgPSB2YWx1ZQogICAgYXNzZXJ0X3N0cmluZ19saXN0KGRpc3QsIGF0dHIsIG5zX3BhY2thZ2VzKQogICAgZm9yIG5zcCBpbiBuc19wYWNrYWdlczoKICAgICAgICBpZiBub3QgZGlzdC5oYXNfY29udGVudHNfZm9yKG5zcCk6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCiAgICAgICAgICAgICAgICAiRGlzdHJpYnV0aW9uIGNvbnRhaW5zIG5vIG1vZHVsZXMgb3IgcGFja2FnZXMgZm9yICIgKwogICAgICAgICAgICAgICAgIm5hbWVzcGFjZSBwYWNrYWdlICVyIiAlIG5zcAogICAgICAgICAgICApCiAgICAgICAgcGFyZW50LCBzZXAsIGNoaWxkID0gbnNwLnJwYXJ0aXRpb24oJy4nKQogICAgICAgIGlmIHBhcmVudCBhbmQgcGFyZW50IG5vdCBpbiBuc19wYWNrYWdlczoKICAgICAgICAgICAgZGlzdHV0aWxzLmxvZy53YXJuKAogICAgICAgICAgICAgICAgIldBUk5JTkc6ICVyIGlzIGRlY2xhcmVkIGFzIGEgcGFja2FnZSBuYW1lc3BhY2UsIGJ1dCAlciIKICAgICAgICAgICAgICAgICIgaXMgbm90OiBwbGVhc2UgY29ycmVjdCB0aGlzIGluIHNldHVwLnB5IiwgbnNwLCBwYXJlbnQKICAgICAgICAgICAgKQoKCmRlZiBjaGVja19leHRyYXMoZGlzdCwgYXR0ciwgdmFsdWUpOgogICAgIiIiVmVyaWZ5IHRoYXQgZXh0cmFzX3JlcXVpcmUgbWFwcGluZyBpcyB2YWxpZCIiIgogICAgdHJ5OgogICAgICAgIGxpc3QoaXRlcnRvb2xzLnN0YXJtYXAoX2NoZWNrX2V4dHJhLCB2YWx1ZS5pdGVtcygpKSkKICAgIGV4Y2VwdCAoVHlwZUVycm9yLCBWYWx1ZUVycm9yLCBBdHRyaWJ1dGVFcnJvcik6CiAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKICAgICAgICAgICAgIidleHRyYXNfcmVxdWlyZScgbXVzdCBiZSBhIGRpY3Rpb25hcnkgd2hvc2UgdmFsdWVzIGFyZSAiCiAgICAgICAgICAgICJzdHJpbmdzIG9yIGxpc3RzIG9mIHN0cmluZ3MgY29udGFpbmluZyB2YWxpZCBwcm9qZWN0L3ZlcnNpb24gIgogICAgICAgICAgICAicmVxdWlyZW1lbnQgc3BlY2lmaWVycy4iCiAgICAgICAgKQoKCmRlZiBfY2hlY2tfZXh0cmEoZXh0cmEsIHJlcXMpOgogICAgbmFtZSwgc2VwLCBtYXJrZXIgPSBleHRyYS5wYXJ0aXRpb24oJzonKQogICAgaWYgbWFya2VyIGFuZCBwa2dfcmVzb3VyY2VzLmludmFsaWRfbWFya2VyKG1hcmtlcik6CiAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigiSW52YWxpZCBlbnZpcm9ubWVudCBtYXJrZXI6ICIgKyBtYXJrZXIpCiAgICBsaXN0KHBrZ19yZXNvdXJjZXMucGFyc2VfcmVxdWlyZW1lbnRzKHJlcXMpKQoKCmRlZiBhc3NlcnRfYm9vbChkaXN0LCBhdHRyLCB2YWx1ZSk6CiAgICAiIiJWZXJpZnkgdGhhdCB2YWx1ZSBpcyBUcnVlLCBGYWxzZSwgMCwgb3IgMSIiIgogICAgaWYgYm9vbCh2YWx1ZSkgIT0gdmFsdWU6CiAgICAgICAgdG1wbCA9ICJ7YXR0ciFyfSBtdXN0IGJlIGEgYm9vbGVhbiB2YWx1ZSAoZ290IHt2YWx1ZSFyfSkiCiAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcih0bXBsLmZvcm1hdChhdHRyPWF0dHIsIHZhbHVlPXZhbHVlKSkKCgpkZWYgY2hlY2tfcmVxdWlyZW1lbnRzKGRpc3QsIGF0dHIsIHZhbHVlKToKICAgICIiIlZlcmlmeSB0aGF0IGluc3RhbGxfcmVxdWlyZXMgaXMgYSB2YWxpZCByZXF1aXJlbWVudHMgbGlzdCIiIgogICAgdHJ5OgogICAgICAgIGxpc3QocGtnX3Jlc291cmNlcy5wYXJzZV9yZXF1aXJlbWVudHModmFsdWUpKQogICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIChkaWN0LCBzZXQpKToKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJVbm9yZGVyZWQgdHlwZXMgYXJlIG5vdCBhbGxvd2VkIikKICAgIGV4Y2VwdCAoVHlwZUVycm9yLCBWYWx1ZUVycm9yKSBhcyBlcnJvcjoKICAgICAgICB0bXBsID0gKAogICAgICAgICAgICAie2F0dHIhcn0gbXVzdCBiZSBhIHN0cmluZyBvciBsaXN0IG9mIHN0cmluZ3MgIgogICAgICAgICAgICAiY29udGFpbmluZyB2YWxpZCBwcm9qZWN0L3ZlcnNpb24gcmVxdWlyZW1lbnQgc3BlY2lmaWVyczsge2Vycm9yfSIKICAgICAgICApCiAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcih0bXBsLmZvcm1hdChhdHRyPWF0dHIsIGVycm9yPWVycm9yKSkKCgpkZWYgY2hlY2tfc3BlY2lmaWVyKGRpc3QsIGF0dHIsIHZhbHVlKToKICAgICIiIlZlcmlmeSB0aGF0IHZhbHVlIGlzIGEgdmFsaWQgdmVyc2lvbiBzcGVjaWZpZXIiIiIKICAgIHRyeToKICAgICAgICBwYWNrYWdpbmcuc3BlY2lmaWVycy5TcGVjaWZpZXJTZXQodmFsdWUpCiAgICBleGNlcHQgcGFja2FnaW5nLnNwZWNpZmllcnMuSW52YWxpZFNwZWNpZmllciBhcyBlcnJvcjoKICAgICAgICB0bXBsID0gKAogICAgICAgICAgICAie2F0dHIhcn0gbXVzdCBiZSBhIHN0cmluZyAiCiAgICAgICAgICAgICJjb250YWluaW5nIHZhbGlkIHZlcnNpb24gc3BlY2lmaWVyczsge2Vycm9yfSIKICAgICAgICApCiAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcih0bXBsLmZvcm1hdChhdHRyPWF0dHIsIGVycm9yPWVycm9yKSkKCgpkZWYgY2hlY2tfZW50cnlfcG9pbnRzKGRpc3QsIGF0dHIsIHZhbHVlKToKICAgICIiIlZlcmlmeSB0aGF0IGVudHJ5X3BvaW50cyBtYXAgaXMgcGFyc2VhYmxlIiIiCiAgICB0cnk6CiAgICAgICAgcGtnX3Jlc291cmNlcy5FbnRyeVBvaW50LnBhcnNlX21hcCh2YWx1ZSkKICAgIGV4Y2VwdCBWYWx1ZUVycm9yIGFzIGU6CiAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcihlKQoKCmRlZiBjaGVja190ZXN0X3N1aXRlKGRpc3QsIGF0dHIsIHZhbHVlKToKICAgIGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLCBzaXguc3RyaW5nX3R5cGVzKToKICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKCJ0ZXN0X3N1aXRlIG11c3QgYmUgYSBzdHJpbmciKQoKCmRlZiBjaGVja19wYWNrYWdlX2RhdGEoZGlzdCwgYXR0ciwgdmFsdWUpOgogICAgIiIiVmVyaWZ5IHRoYXQgdmFsdWUgaXMgYSBkaWN0aW9uYXJ5IG9mIHBhY2thZ2UgbmFtZXMgdG8gZ2xvYiBsaXN0cyIiIgogICAgaWYgbm90IGlzaW5zdGFuY2UodmFsdWUsIGRpY3QpOgogICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCiAgICAgICAgICAgICJ7IXJ9IG11c3QgYmUgYSBkaWN0aW9uYXJ5IG1hcHBpbmcgcGFja2FnZSBuYW1lcyB0byBsaXN0cyBvZiAiCiAgICAgICAgICAgICJzdHJpbmcgd2lsZGNhcmQgcGF0dGVybnMiLmZvcm1hdChhdHRyKSkKICAgIGZvciBrLCB2IGluIHZhbHVlLml0ZW1zKCk6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoaywgc2l4LnN0cmluZ190eXBlcyk6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCiAgICAgICAgICAgICAgICAia2V5cyBvZiB7IXJ9IGRpY3QgbXVzdCBiZSBzdHJpbmdzIChnb3QgeyFyfSkiCiAgICAgICAgICAgICAgICAuZm9ybWF0KGF0dHIsIGspCiAgICAgICAgICAgICkKICAgICAgICBhc3NlcnRfc3RyaW5nX2xpc3QoZGlzdCwgJ3ZhbHVlcyBvZiB7IXJ9IGRpY3QnLmZvcm1hdChhdHRyKSwgdikKCgpkZWYgY2hlY2tfcGFja2FnZXMoZGlzdCwgYXR0ciwgdmFsdWUpOgogICAgZm9yIHBrZ25hbWUgaW4gdmFsdWU6CiAgICAgICAgaWYgbm90IHJlLm1hdGNoKHInXHcrKFwuXHcrKSonLCBwa2duYW1lKToKICAgICAgICAgICAgZGlzdHV0aWxzLmxvZy53YXJuKAogICAgICAgICAgICAgICAgIldBUk5JTkc6ICVyIG5vdCBhIHZhbGlkIHBhY2thZ2UgbmFtZTsgcGxlYXNlIHVzZSBvbmx5ICIKICAgICAgICAgICAgICAgICIuLXNlcGFyYXRlZCBwYWNrYWdlIG5hbWVzIGluIHNldHVwLnB5IiwgcGtnbmFtZQogICAgICAgICAgICApCgoKX0Rpc3RyaWJ1dGlvbiA9IGdldF91bnBhdGNoZWQoZGlzdHV0aWxzLmNvcmUuRGlzdHJpYnV0aW9uKQoKCmNsYXNzIERpc3RyaWJ1dGlvbihfRGlzdHJpYnV0aW9uKToKICAgICIiIkRpc3RyaWJ1dGlvbiB3aXRoIHN1cHBvcnQgZm9yIGZlYXR1cmVzLCB0ZXN0cywgYW5kIHBhY2thZ2UgZGF0YQoKICAgIFRoaXMgaXMgYW4gZW5oYW5jZWQgdmVyc2lvbiBvZiAnZGlzdHV0aWxzLmRpc3QuRGlzdHJpYnV0aW9uJyB0aGF0CiAgICBlZmZlY3RpdmVseSBhZGRzIHRoZSBmb2xsb3dpbmcgbmV3IG9wdGlvbmFsIGtleXdvcmQgYXJndW1lbnRzIHRvICdzZXR1cCgpJzoKCiAgICAgJ2luc3RhbGxfcmVxdWlyZXMnIC0tIGEgc3RyaW5nIG9yIHNlcXVlbmNlIG9mIHN0cmluZ3Mgc3BlY2lmeWluZyBwcm9qZWN0CiAgICAgICAgdmVyc2lvbnMgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIHJlcXVpcmVzIHdoZW4gaW5zdGFsbGVkLCBpbiB0aGUgZm9ybWF0CiAgICAgICAgdXNlZCBieSAncGtnX3Jlc291cmNlcy5yZXF1aXJlKCknLiAgVGhleSB3aWxsIGJlIGluc3RhbGxlZAogICAgICAgIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgcGFja2FnZSBpcyBpbnN0YWxsZWQuICBJZiB5b3Ugd2lzaCB0byB1c2UKICAgICAgICBwYWNrYWdlcyB0aGF0IGFyZSBub3QgYXZhaWxhYmxlIGluIFB5UEksIG9yIHdhbnQgdG8gZ2l2ZSB5b3VyIHVzZXJzIGFuCiAgICAgICAgYWx0ZXJuYXRlIGRvd25sb2FkIGxvY2F0aW9uLCB5b3UgY2FuIGFkZCBhICdmaW5kX2xpbmtzJyBvcHRpb24gdG8gdGhlCiAgICAgICAgJ1tlYXN5X2luc3RhbGxdJyBzZWN0aW9uIG9mIHlvdXIgcHJvamVjdCdzICdzZXR1cC5jZmcnIGZpbGUsIGFuZCB0aGVuCiAgICAgICAgc2V0dXB0b29scyB3aWxsIHNjYW4gdGhlIGxpc3RlZCB3ZWIgcGFnZXMgZm9yIGxpbmtzIHRoYXQgc2F0aXNmeSB0aGUKICAgICAgICByZXF1aXJlbWVudHMuCgogICAgICdleHRyYXNfcmVxdWlyZScgLS0gYSBkaWN0aW9uYXJ5IG1hcHBpbmcgbmFtZXMgb2Ygb3B0aW9uYWwgImV4dHJhcyIgdG8gdGhlCiAgICAgICAgYWRkaXRpb25hbCByZXF1aXJlbWVudChzKSB0aGF0IHVzaW5nIHRob3NlIGV4dHJhcyBpbmN1cnMuIEZvciBleGFtcGxlLAogICAgICAgIHRoaXM6OgoKICAgICAgICAgICAgZXh0cmFzX3JlcXVpcmUgPSBkaWN0KHJlU1QgPSBbImRvY3V0aWxzPj0wLjMiLCAicmVTVGVkaXQiXSkKCiAgICAgICAgaW5kaWNhdGVzIHRoYXQgdGhlIGRpc3RyaWJ1dGlvbiBjYW4gb3B0aW9uYWxseSBwcm92aWRlIGFuIGV4dHJhCiAgICAgICAgY2FwYWJpbGl0eSBjYWxsZWQgInJlU1QiLCBidXQgaXQgY2FuIG9ubHkgYmUgdXNlZCBpZiBkb2N1dGlscyBhbmQKICAgICAgICByZVNUZWRpdCBhcmUgaW5zdGFsbGVkLiAgSWYgdGhlIHVzZXIgaW5zdGFsbHMgeW91ciBwYWNrYWdlIHVzaW5nCiAgICAgICAgRWFzeUluc3RhbGwgYW5kIHJlcXVlc3RzIG9uZSBvZiB5b3VyIGV4dHJhcywgdGhlIGNvcnJlc3BvbmRpbmcKICAgICAgICBhZGRpdGlvbmFsIHJlcXVpcmVtZW50cyB3aWxsIGJlIGluc3RhbGxlZCBpZiBuZWVkZWQuCgogICAgICdmZWF0dXJlcycgKipkZXByZWNhdGVkKiogLS0gYSBkaWN0aW9uYXJ5IG1hcHBpbmcgb3B0aW9uIG5hbWVzIHRvCiAgICAgICAgJ3NldHVwdG9vbHMuRmVhdHVyZScKICAgICAgICBvYmplY3RzLiAgRmVhdHVyZXMgYXJlIGEgcG9ydGlvbiBvZiB0aGUgZGlzdHJpYnV0aW9uIHRoYXQgY2FuIGJlCiAgICAgICAgaW5jbHVkZWQgb3IgZXhjbHVkZWQgYmFzZWQgb24gdXNlciBvcHRpb25zLCBpbnRlci1mZWF0dXJlIGRlcGVuZGVuY2llcywKICAgICAgICBhbmQgYXZhaWxhYmlsaXR5IG9uIHRoZSBjdXJyZW50IHN5c3RlbS4gIEV4Y2x1ZGVkIGZlYXR1cmVzIGFyZSBvbWl0dGVkCiAgICAgICAgZnJvbSBhbGwgc2V0dXAgY29tbWFuZHMsIGluY2x1ZGluZyBzb3VyY2UgYW5kIGJpbmFyeSBkaXN0cmlidXRpb25zLCBzbwogICAgICAgIHlvdSBjYW4gY3JlYXRlIG11bHRpcGxlIGRpc3RyaWJ1dGlvbnMgZnJvbSB0aGUgc2FtZSBzb3VyY2UgdHJlZS4KICAgICAgICBGZWF0dXJlIG5hbWVzIHNob3VsZCBiZSB2YWxpZCBQeXRob24gaWRlbnRpZmllcnMsIGV4Y2VwdCB0aGF0IHRoZXkgbWF5CiAgICAgICAgY29udGFpbiB0aGUgJy0nIChtaW51cykgc2lnbi4gIEZlYXR1cmVzIGNhbiBiZSBpbmNsdWRlZCBvciBleGNsdWRlZAogICAgICAgIHZpYSB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMgJy0td2l0aC1YJyBhbmQgJy0td2l0aG91dC1YJywgd2hlcmUgJ1gnIGlzCiAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGZlYXR1cmUuICBXaGV0aGVyIGEgZmVhdHVyZSBpcyBpbmNsdWRlZCBieSBkZWZhdWx0LCBhbmQKICAgICAgICB3aGV0aGVyIHlvdSBhcmUgYWxsb3dlZCB0byBjb250cm9sIHRoaXMgZnJvbSB0aGUgY29tbWFuZCBsaW5lLCBpcwogICAgICAgIGRldGVybWluZWQgYnkgdGhlIEZlYXR1cmUgb2JqZWN0LiAgU2VlIHRoZSAnRmVhdHVyZScgY2xhc3MgZm9yIG1vcmUKICAgICAgICBpbmZvcm1hdGlvbi4KCiAgICAgJ3Rlc3Rfc3VpdGUnIC0tIHRoZSBuYW1lIG9mIGEgdGVzdCBzdWl0ZSB0byBydW4gZm9yIHRoZSAndGVzdCcgY29tbWFuZC4KICAgICAgICBJZiB0aGUgdXNlciBydW5zICdweXRob24gc2V0dXAucHkgdGVzdCcsIHRoZSBwYWNrYWdlIHdpbGwgYmUgaW5zdGFsbGVkLAogICAgICAgIGFuZCB0aGUgbmFtZWQgdGVzdCBzdWl0ZSB3aWxsIGJlIHJ1bi4gIFRoZSBmb3JtYXQgaXMgdGhlIHNhbWUgYXMKICAgICAgICB3b3VsZCBiZSB1c2VkIG9uIGEgJ3VuaXR0ZXN0LnB5JyBjb21tYW5kIGxpbmUuICBUaGF0IGlzLCBpdCBpcyB0aGUKICAgICAgICBkb3R0ZWQgbmFtZSBvZiBhbiBvYmplY3QgdG8gaW1wb3J0IGFuZCBjYWxsIHRvIGdlbmVyYXRlIGEgdGVzdCBzdWl0ZS4KCiAgICAgJ3BhY2thZ2VfZGF0YScgLS0gYSBkaWN0aW9uYXJ5IG1hcHBpbmcgcGFja2FnZSBuYW1lcyB0byBsaXN0cyBvZiBmaWxlbmFtZXMKICAgICAgICBvciBnbG9icyB0byB1c2UgdG8gZmluZCBkYXRhIGZpbGVzIGNvbnRhaW5lZCBpbiB0aGUgbmFtZWQgcGFja2FnZXMuCiAgICAgICAgSWYgdGhlIGRpY3Rpb25hcnkgaGFzIGZpbGVuYW1lcyBvciBnbG9icyBsaXN0ZWQgdW5kZXIgJyIiJyAodGhlIGVtcHR5CiAgICAgICAgc3RyaW5nKSwgdGhvc2UgbmFtZXMgd2lsbCBiZSBzZWFyY2hlZCBmb3IgaW4gZXZlcnkgcGFja2FnZSwgaW4gYWRkaXRpb24KICAgICAgICB0byBhbnkgbmFtZXMgZm9yIHRoZSBzcGVjaWZpYyBwYWNrYWdlLiAgRGF0YSBmaWxlcyBmb3VuZCB1c2luZyB0aGVzZQogICAgICAgIG5hbWVzL2dsb2JzIHdpbGwgYmUgaW5zdGFsbGVkIGFsb25nIHdpdGggdGhlIHBhY2thZ2UsIGluIHRoZSBzYW1lCiAgICAgICAgbG9jYXRpb24gYXMgdGhlIHBhY2thZ2UuICBOb3RlIHRoYXQgZ2xvYnMgYXJlIGFsbG93ZWQgdG8gcmVmZXJlbmNlCiAgICAgICAgdGhlIGNvbnRlbnRzIG9mIG5vbi1wYWNrYWdlIHN1YmRpcmVjdG9yaWVzLCBhcyBsb25nIGFzIHlvdSB1c2UgJy8nIGFzCiAgICAgICAgYSBwYXRoIHNlcGFyYXRvci4gIChHbG9icyBhcmUgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgdG8KICAgICAgICBwbGF0Zm9ybS1zcGVjaWZpYyBwYXRocyBhdCBydW50aW1lLikKCiAgICBJbiBhZGRpdGlvbiB0byB0aGVzZSBuZXcga2V5d29yZHMsIHRoaXMgY2xhc3MgYWxzbyBoYXMgc2V2ZXJhbCBuZXcgbWV0aG9kcwogICAgZm9yIG1hbmlwdWxhdGluZyB0aGUgZGlzdHJpYnV0aW9uJ3MgY29udGVudHMuICBGb3IgZXhhbXBsZSwgdGhlICdpbmNsdWRlKCknCiAgICBhbmQgJ2V4Y2x1ZGUoKScgbWV0aG9kcyBjYW4gYmUgdGhvdWdodCBvZiBhcyBpbi1wbGFjZSBhZGQgYW5kIHN1YnRyYWN0CiAgICBjb21tYW5kcyB0aGF0IGFkZCBvciByZW1vdmUgcGFja2FnZXMsIG1vZHVsZXMsIGV4dGVuc2lvbnMsIGFuZCBzbyBvbiBmcm9tCiAgICB0aGUgZGlzdHJpYnV0aW9uLiAgVGhleSBhcmUgdXNlZCBieSB0aGUgZmVhdHVyZSBzdWJzeXN0ZW0gdG8gY29uZmlndXJlIHRoZQogICAgZGlzdHJpYnV0aW9uIGZvciB0aGUgaW5jbHVkZWQgYW5kIGV4Y2x1ZGVkIGZlYXR1cmVzLgogICAgIiIiCgogICAgX0RJU1RVVElMU19VTlNVUFBPUlRFRF9NRVRBREFUQSA9IHsKICAgICAgICAnbG9uZ19kZXNjcmlwdGlvbl9jb250ZW50X3R5cGUnOiBOb25lLAogICAgICAgICdwcm9qZWN0X3VybHMnOiBkaWN0LAogICAgICAgICdwcm92aWRlc19leHRyYXMnOiBvcmRlcmVkX3NldC5PcmRlcmVkU2V0LAogICAgICAgICdsaWNlbnNlX2ZpbGVzJzogb3JkZXJlZF9zZXQuT3JkZXJlZFNldCwKICAgIH0KCiAgICBfcGF0Y2hlZF9kaXN0ID0gTm9uZQoKICAgIGRlZiBwYXRjaF9taXNzaW5nX3BrZ19pbmZvKHNlbGYsIGF0dHJzKToKICAgICAgICAjIEZha2UgdXAgYSByZXBsYWNlbWVudCBmb3IgdGhlIGRhdGEgdGhhdCB3b3VsZCBub3JtYWxseSBjb21lIGZyb20KICAgICAgICAjIFBLRy1JTkZPLCBidXQgd2hpY2ggbWlnaHQgbm90IHlldCBiZSBidWlsdCBpZiB0aGlzIGlzIGEgZnJlc2gKICAgICAgICAjIGNoZWNrb3V0LgogICAgICAgICMKICAgICAgICBpZiBub3QgYXR0cnMgb3IgJ25hbWUnIG5vdCBpbiBhdHRycyBvciAndmVyc2lvbicgbm90IGluIGF0dHJzOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBrZXkgPSBwa2dfcmVzb3VyY2VzLnNhZmVfbmFtZShzdHIoYXR0cnNbJ25hbWUnXSkpLmxvd2VyKCkKICAgICAgICBkaXN0ID0gcGtnX3Jlc291cmNlcy53b3JraW5nX3NldC5ieV9rZXkuZ2V0KGtleSkKICAgICAgICBpZiBkaXN0IGlzIG5vdCBOb25lIGFuZCBub3QgZGlzdC5oYXNfbWV0YWRhdGEoJ1BLRy1JTkZPJyk6CiAgICAgICAgICAgIGRpc3QuX3ZlcnNpb24gPSBwa2dfcmVzb3VyY2VzLnNhZmVfdmVyc2lvbihzdHIoYXR0cnNbJ3ZlcnNpb24nXSkpCiAgICAgICAgICAgIHNlbGYuX3BhdGNoZWRfZGlzdCA9IGRpc3QKCiAgICBkZWYgX19pbml0X18oc2VsZiwgYXR0cnM9Tm9uZSk6CiAgICAgICAgaGF2ZV9wYWNrYWdlX2RhdGEgPSBoYXNhdHRyKHNlbGYsICJwYWNrYWdlX2RhdGEiKQogICAgICAgIGlmIG5vdCBoYXZlX3BhY2thZ2VfZGF0YToKICAgICAgICAgICAgc2VsZi5wYWNrYWdlX2RhdGEgPSB7fQogICAgICAgIGF0dHJzID0gYXR0cnMgb3Ige30KICAgICAgICBpZiAnZmVhdHVyZXMnIGluIGF0dHJzIG9yICdyZXF1aXJlX2ZlYXR1cmVzJyBpbiBhdHRyczoKICAgICAgICAgICAgRmVhdHVyZS53YXJuX2RlcHJlY2F0ZWQoKQogICAgICAgIHNlbGYucmVxdWlyZV9mZWF0dXJlcyA9IFtdCiAgICAgICAgc2VsZi5mZWF0dXJlcyA9IHt9CiAgICAgICAgc2VsZi5kaXN0X2ZpbGVzID0gW10KICAgICAgICAjIEZpbHRlci1vdXQgc2V0dXB0b29scycgc3BlY2lmaWMgb3B0aW9ucy4KICAgICAgICBzZWxmLnNyY19yb290ID0gYXR0cnMucG9wKCJzcmNfcm9vdCIsIE5vbmUpCiAgICAgICAgc2VsZi5wYXRjaF9taXNzaW5nX3BrZ19pbmZvKGF0dHJzKQogICAgICAgIHNlbGYuZGVwZW5kZW5jeV9saW5rcyA9IGF0dHJzLnBvcCgnZGVwZW5kZW5jeV9saW5rcycsIFtdKQogICAgICAgIHNlbGYuc2V0dXBfcmVxdWlyZXMgPSBhdHRycy5wb3AoJ3NldHVwX3JlcXVpcmVzJywgW10pCiAgICAgICAgZm9yIGVwIGluIHBrZ19yZXNvdXJjZXMuaXRlcl9lbnRyeV9wb2ludHMoJ2Rpc3R1dGlscy5zZXR1cF9rZXl3b3JkcycpOgogICAgICAgICAgICB2YXJzKHNlbGYpLnNldGRlZmF1bHQoZXAubmFtZSwgTm9uZSkKICAgICAgICBfRGlzdHJpYnV0aW9uLl9faW5pdF9fKHNlbGYsIHsKICAgICAgICAgICAgazogdiBmb3IgaywgdiBpbiBhdHRycy5pdGVtcygpCiAgICAgICAgICAgIGlmIGsgbm90IGluIHNlbGYuX0RJU1RVVElMU19VTlNVUFBPUlRFRF9NRVRBREFUQQogICAgICAgIH0pCgogICAgICAgICMgRmlsbC1pbiBtaXNzaW5nIG1ldGFkYXRhIGZpZWxkcyBub3Qgc3VwcG9ydGVkIGJ5IGRpc3R1dGlscy4KICAgICAgICAjIE5vdGUgc29tZSBmaWVsZHMgbWF5IGhhdmUgYmVlbiBzZXQgYnkgb3RoZXIgdG9vbHMgKGUuZy4gcGJyKQogICAgICAgICMgYWJvdmU7IHRoZXkgYXJlIHRha2VuIHByZWZlcnJlbnRpYWxseSB0byBzZXR1cCgpIGFyZ3VtZW50cwogICAgICAgIGZvciBvcHRpb24sIGRlZmF1bHQgaW4gc2VsZi5fRElTVFVUSUxTX1VOU1VQUE9SVEVEX01FVEFEQVRBLml0ZW1zKCk6CiAgICAgICAgICAgIGZvciBzb3VyY2UgaW4gc2VsZi5tZXRhZGF0YS5fX2RpY3RfXywgYXR0cnM6CiAgICAgICAgICAgICAgICBpZiBvcHRpb24gaW4gc291cmNlOgogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc291cmNlW29wdGlvbl0KICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgdmFsdWUgPSBkZWZhdWx0KCkgaWYgZGVmYXVsdCBlbHNlIE5vbmUKICAgICAgICAgICAgc2V0YXR0cihzZWxmLm1ldGFkYXRhLCBvcHRpb24sIHZhbHVlKQoKICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYubWV0YWRhdGEudmVyc2lvbiwgbnVtYmVycy5OdW1iZXIpOgogICAgICAgICAgICAjIFNvbWUgcGVvcGxlIGFwcGFyZW50bHkgdGFrZSAidmVyc2lvbiBudW1iZXIiIHRvbyBsaXRlcmFsbHkgOikKICAgICAgICAgICAgc2VsZi5tZXRhZGF0YS52ZXJzaW9uID0gc3RyKHNlbGYubWV0YWRhdGEudmVyc2lvbikKCiAgICAgICAgaWYgc2VsZi5tZXRhZGF0YS52ZXJzaW9uIGlzIG5vdCBOb25lOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICB2ZXIgPSBwYWNrYWdpbmcudmVyc2lvbi5WZXJzaW9uKHNlbGYubWV0YWRhdGEudmVyc2lvbikKICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRfdmVyc2lvbiA9IHN0cih2ZXIpCiAgICAgICAgICAgICAgICBpZiBzZWxmLm1ldGFkYXRhLnZlcnNpb24gIT0gbm9ybWFsaXplZF92ZXJzaW9uOgogICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICAgICAgICAgICAgICJOb3JtYWxpemluZyAnJXMnIHRvICclcyciICUgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tZXRhZGF0YS52ZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZF92ZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHNlbGYubWV0YWRhdGEudmVyc2lvbiA9IG5vcm1hbGl6ZWRfdmVyc2lvbgogICAgICAgICAgICBleGNlcHQgKHBhY2thZ2luZy52ZXJzaW9uLkludmFsaWRWZXJzaW9uLCBUeXBlRXJyb3IpOgogICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgICAgICAgICAiVGhlIHZlcnNpb24gc3BlY2lmaWVkICglcikgaXMgYW4gaW52YWxpZCB2ZXJzaW9uLCB0aGlzICIKICAgICAgICAgICAgICAgICAgICAibWF5IG5vdCB3b3JrIGFzIGV4cGVjdGVkIHdpdGggbmV3ZXIgdmVyc2lvbnMgb2YgIgogICAgICAgICAgICAgICAgICAgICJzZXR1cHRvb2xzLCBwaXAsIGFuZCBQeVBJLiBQbGVhc2Ugc2VlIFBFUCA0NDAgZm9yIG1vcmUgIgogICAgICAgICAgICAgICAgICAgICJkZXRhaWxzLiIgJSBzZWxmLm1ldGFkYXRhLnZlcnNpb24KICAgICAgICAgICAgICAgICkKICAgICAgICBzZWxmLl9maW5hbGl6ZV9yZXF1aXJlcygpCgogICAgZGVmIF9maW5hbGl6ZV9yZXF1aXJlcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBTZXQgYG1ldGFkYXRhLnB5dGhvbl9yZXF1aXJlc2AgYW5kIGZpeCBlbnZpcm9ubWVudCBtYXJrZXJzCiAgICAgICAgaW4gYGluc3RhbGxfcmVxdWlyZXNgIGFuZCBgZXh0cmFzX3JlcXVpcmVgLgogICAgICAgICIiIgogICAgICAgIGlmIGdldGF0dHIoc2VsZiwgJ3B5dGhvbl9yZXF1aXJlcycsIE5vbmUpOgogICAgICAgICAgICBzZWxmLm1ldGFkYXRhLnB5dGhvbl9yZXF1aXJlcyA9IHNlbGYucHl0aG9uX3JlcXVpcmVzCgogICAgICAgIGlmIGdldGF0dHIoc2VsZiwgJ2V4dHJhc19yZXF1aXJlJywgTm9uZSk6CiAgICAgICAgICAgIGZvciBleHRyYSBpbiBzZWxmLmV4dHJhc19yZXF1aXJlLmtleXMoKToKICAgICAgICAgICAgICAgICMgU2luY2UgdGhpcyBnZXRzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBhdCBwb2ludHMgd2hlcmUgdGhlCiAgICAgICAgICAgICAgICAjIGtleXMgaGF2ZSBiZWNvbWUgJ2NvbnZlcnRlZCcgZXh0cmFzLCBlbnN1cmUgdGhhdCB3ZSBhcmUgb25seQogICAgICAgICAgICAgICAgIyB0cnVseSBhZGRpbmcgZXh0cmFzIHdlIGhhdmVuJ3Qgc2VlbiBiZWZvcmUgaGVyZS4KICAgICAgICAgICAgICAgIGV4dHJhID0gZXh0cmEuc3BsaXQoJzonKVswXQogICAgICAgICAgICAgICAgaWYgZXh0cmE6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5tZXRhZGF0YS5wcm92aWRlc19leHRyYXMuYWRkKGV4dHJhKQoKICAgICAgICBzZWxmLl9jb252ZXJ0X2V4dHJhc19yZXF1aXJlbWVudHMoKQogICAgICAgIHNlbGYuX21vdmVfaW5zdGFsbF9yZXF1aXJlbWVudHNfbWFya2VycygpCgogICAgZGVmIF9jb252ZXJ0X2V4dHJhc19yZXF1aXJlbWVudHMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgQ29udmVydCByZXF1aXJlbWVudHMgaW4gYGV4dHJhc19yZXF1aXJlYCBvZiB0aGUgZm9ybQogICAgICAgIGAiZXh0cmEiOiBbImJhcmJhenF1dXg7IHttYXJrZXJ9Il1gIHRvCiAgICAgICAgYCJleHRyYTp7bWFya2VyfSI6IFsiYmFyYmF6cXV1eCJdYC4KICAgICAgICAiIiIKICAgICAgICBzcGVjX2V4dF9yZXFzID0gZ2V0YXR0cihzZWxmLCAnZXh0cmFzX3JlcXVpcmUnLCBOb25lKSBvciB7fQogICAgICAgIHNlbGYuX3RtcF9leHRyYXNfcmVxdWlyZSA9IGRlZmF1bHRkaWN0KGxpc3QpCiAgICAgICAgZm9yIHNlY3Rpb24sIHYgaW4gc3BlY19leHRfcmVxcy5pdGVtcygpOgogICAgICAgICAgICAjIERvIG5vdCBzdHJpcCBlbXB0eSBzZWN0aW9ucy4KICAgICAgICAgICAgc2VsZi5fdG1wX2V4dHJhc19yZXF1aXJlW3NlY3Rpb25dCiAgICAgICAgICAgIGZvciByIGluIHBrZ19yZXNvdXJjZXMucGFyc2VfcmVxdWlyZW1lbnRzKHYpOgogICAgICAgICAgICAgICAgc3VmZml4ID0gc2VsZi5fc3VmZml4X2ZvcihyKQogICAgICAgICAgICAgICAgc2VsZi5fdG1wX2V4dHJhc19yZXF1aXJlW3NlY3Rpb24gKyBzdWZmaXhdLmFwcGVuZChyKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfc3VmZml4X2ZvcihyZXEpOgogICAgICAgICIiIgogICAgICAgIEZvciBhIHJlcXVpcmVtZW50LCByZXR1cm4gdGhlICdleHRyYXNfcmVxdWlyZScgc3VmZml4IGZvcgogICAgICAgIHRoYXQgcmVxdWlyZW1lbnQuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuICc6JyArIHN0cihyZXEubWFya2VyKSBpZiByZXEubWFya2VyIGVsc2UgJycKCiAgICBkZWYgX21vdmVfaW5zdGFsbF9yZXF1aXJlbWVudHNfbWFya2VycyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNb3ZlIHJlcXVpcmVtZW50cyBpbiBgaW5zdGFsbF9yZXF1aXJlc2AgdGhhdCBhcmUgdXNpbmcgZW52aXJvbm1lbnQKICAgICAgICBtYXJrZXJzIGBleHRyYXNfcmVxdWlyZWAuCiAgICAgICAgIiIiCgogICAgICAgICMgZGl2aWRlIHRoZSBpbnN0YWxsX3JlcXVpcmVzIGludG8gdHdvIHNldHMsIHNpbXBsZSBvbmVzIHN0aWxsCiAgICAgICAgIyBoYW5kbGVkIGJ5IGluc3RhbGxfcmVxdWlyZXMgYW5kIG1vcmUgY29tcGxleCBvbmVzIGhhbmRsZWQKICAgICAgICAjIGJ5IGV4dHJhc19yZXF1aXJlLgoKICAgICAgICBkZWYgaXNfc2ltcGxlX3JlcShyZXEpOgogICAgICAgICAgICByZXR1cm4gbm90IHJlcS5tYXJrZXIKCiAgICAgICAgc3BlY19pbnN0X3JlcXMgPSBnZXRhdHRyKHNlbGYsICdpbnN0YWxsX3JlcXVpcmVzJywgTm9uZSkgb3IgKCkKICAgICAgICBpbnN0X3JlcXMgPSBsaXN0KHBrZ19yZXNvdXJjZXMucGFyc2VfcmVxdWlyZW1lbnRzKHNwZWNfaW5zdF9yZXFzKSkKICAgICAgICBzaW1wbGVfcmVxcyA9IGZpbHRlcihpc19zaW1wbGVfcmVxLCBpbnN0X3JlcXMpCiAgICAgICAgY29tcGxleF9yZXFzID0gZmlsdGVyZmFsc2UoaXNfc2ltcGxlX3JlcSwgaW5zdF9yZXFzKQogICAgICAgIHNlbGYuaW5zdGFsbF9yZXF1aXJlcyA9IGxpc3QobWFwKHN0ciwgc2ltcGxlX3JlcXMpKQoKICAgICAgICBmb3IgciBpbiBjb21wbGV4X3JlcXM6CiAgICAgICAgICAgIHNlbGYuX3RtcF9leHRyYXNfcmVxdWlyZVsnOicgKyBzdHIoci5tYXJrZXIpXS5hcHBlbmQocikKICAgICAgICBzZWxmLmV4dHJhc19yZXF1aXJlID0gZGljdCgKICAgICAgICAgICAgKGssIFtzdHIocikgZm9yIHIgaW4gbWFwKHNlbGYuX2NsZWFuX3JlcSwgdildKQogICAgICAgICAgICBmb3IgaywgdiBpbiBzZWxmLl90bXBfZXh0cmFzX3JlcXVpcmUuaXRlbXMoKQogICAgICAgICkKCiAgICBkZWYgX2NsZWFuX3JlcShzZWxmLCByZXEpOgogICAgICAgICIiIgogICAgICAgIEdpdmVuIGEgUmVxdWlyZW1lbnQsIHJlbW92ZSBlbnZpcm9ubWVudCBtYXJrZXJzIGFuZCByZXR1cm4gaXQuCiAgICAgICAgIiIiCiAgICAgICAgcmVxLm1hcmtlciA9IE5vbmUKICAgICAgICByZXR1cm4gcmVxCgogICAgZGVmIF9wYXJzZV9jb25maWdfZmlsZXMoc2VsZiwgZmlsZW5hbWVzPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIEFkYXB0ZWQgZnJvbSBkaXN0dXRpbHMuZGlzdC5EaXN0cmlidXRpb24ucGFyc2VfY29uZmlnX2ZpbGVzLAogICAgICAgIHRoaXMgbWV0aG9kIHByb3ZpZGVzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgaW4gc3VidGx5LWltcHJvdmVkCiAgICAgICAgd2F5cy4KICAgICAgICAiIiIKICAgICAgICBmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnNpeC5tb3Zlcy5jb25maWdwYXJzZXIgaW1wb3J0IENvbmZpZ1BhcnNlcgoKICAgICAgICAjIElnbm9yZSBpbnN0YWxsIGRpcmVjdG9yeSBvcHRpb25zIGlmIHdlIGhhdmUgYSB2ZW52CiAgICAgICAgaWYgc2l4LlBZMyBhbmQgc3lzLnByZWZpeCAhPSBzeXMuYmFzZV9wcmVmaXg6CiAgICAgICAgICAgIGlnbm9yZV9vcHRpb25zID0gWwogICAgICAgICAgICAgICAgJ2luc3RhbGwtYmFzZScsICdpbnN0YWxsLXBsYXRiYXNlJywgJ2luc3RhbGwtbGliJywKICAgICAgICAgICAgICAgICdpbnN0YWxsLXBsYXRsaWInLCAnaW5zdGFsbC1wdXJlbGliJywgJ2luc3RhbGwtaGVhZGVycycsCiAgICAgICAgICAgICAgICAnaW5zdGFsbC1zY3JpcHRzJywgJ2luc3RhbGwtZGF0YScsICdwcmVmaXgnLCAnZXhlYy1wcmVmaXgnLAogICAgICAgICAgICAgICAgJ2hvbWUnLCAndXNlcicsICdyb290J10KICAgICAgICBlbHNlOgogICAgICAgICAgICBpZ25vcmVfb3B0aW9ucyA9IFtdCgogICAgICAgIGlnbm9yZV9vcHRpb25zID0gZnJvemVuc2V0KGlnbm9yZV9vcHRpb25zKQoKICAgICAgICBpZiBmaWxlbmFtZXMgaXMgTm9uZToKICAgICAgICAgICAgZmlsZW5hbWVzID0gc2VsZi5maW5kX2NvbmZpZ19maWxlcygpCgogICAgICAgIGlmIERFQlVHOgogICAgICAgICAgICBzZWxmLmFubm91bmNlKCJEaXN0cmlidXRpb24ucGFyc2VfY29uZmlnX2ZpbGVzKCk6IikKCiAgICAgICAgcGFyc2VyID0gQ29uZmlnUGFyc2VyKCkKICAgICAgICBmb3IgZmlsZW5hbWUgaW4gZmlsZW5hbWVzOgogICAgICAgICAgICB3aXRoIGlvLm9wZW4oZmlsZW5hbWUsIGVuY29kaW5nPSd1dGYtOCcpIGFzIHJlYWRlcjoKICAgICAgICAgICAgICAgIGlmIERFQlVHOgogICAgICAgICAgICAgICAgICAgIHNlbGYuYW5ub3VuY2UoIiAgcmVhZGluZyB7ZmlsZW5hbWV9Ii5mb3JtYXQoKipsb2NhbHMoKSkpCiAgICAgICAgICAgICAgICAocGFyc2VyLnJlYWRfZmlsZSBpZiBzaXguUFkzIGVsc2UgcGFyc2VyLnJlYWRmcCkocmVhZGVyKQogICAgICAgICAgICBmb3Igc2VjdGlvbiBpbiBwYXJzZXIuc2VjdGlvbnMoKToKICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBwYXJzZXIub3B0aW9ucyhzZWN0aW9uKQogICAgICAgICAgICAgICAgb3B0X2RpY3QgPSBzZWxmLmdldF9vcHRpb25fZGljdChzZWN0aW9uKQoKICAgICAgICAgICAgICAgIGZvciBvcHQgaW4gb3B0aW9uczoKICAgICAgICAgICAgICAgICAgICBpZiBvcHQgIT0gJ19fbmFtZV9fJyBhbmQgb3B0IG5vdCBpbiBpZ25vcmVfb3B0aW9uczoKICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gc2VsZi5fdHJ5X3N0cihwYXJzZXIuZ2V0KHNlY3Rpb24sIG9wdCkpCiAgICAgICAgICAgICAgICAgICAgICAgIG9wdCA9IG9wdC5yZXBsYWNlKCctJywgJ18nKQogICAgICAgICAgICAgICAgICAgICAgICBvcHRfZGljdFtvcHRdID0gKGZpbGVuYW1lLCB2YWwpCgogICAgICAgICAgICAjIE1ha2UgdGhlIENvbmZpZ1BhcnNlciBmb3JnZXQgZXZlcnl0aGluZyAoc28gd2UgcmV0YWluCiAgICAgICAgICAgICMgdGhlIG9yaWdpbmFsIGZpbGVuYW1lcyB0aGF0IG9wdGlvbnMgY29tZSBmcm9tKQogICAgICAgICAgICBwYXJzZXIuX19pbml0X18oKQoKICAgICAgICAjIElmIHRoZXJlIHdhcyBhICJnbG9iYWwiIHNlY3Rpb24gaW4gdGhlIGNvbmZpZyBmaWxlLCB1c2UgaXQKICAgICAgICAjIHRvIHNldCBEaXN0cmlidXRpb24gb3B0aW9ucy4KCiAgICAgICAgaWYgJ2dsb2JhbCcgaW4gc2VsZi5jb21tYW5kX29wdGlvbnM6CiAgICAgICAgICAgIGZvciAob3B0LCAoc3JjLCB2YWwpKSBpbiBzZWxmLmNvbW1hbmRfb3B0aW9uc1snZ2xvYmFsJ10uaXRlbXMoKToKICAgICAgICAgICAgICAgIGFsaWFzID0gc2VsZi5uZWdhdGl2ZV9vcHQuZ2V0KG9wdCkKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBpZiBhbGlhczoKICAgICAgICAgICAgICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBhbGlhcywgbm90IHN0cnRvYm9vbCh2YWwpKQogICAgICAgICAgICAgICAgICAgIGVsaWYgb3B0IGluICgndmVyYm9zZScsICdkcnlfcnVuJyk6ICAjIHVnaCEKICAgICAgICAgICAgICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBvcHQsIHN0cnRvYm9vbCh2YWwpKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgb3B0LCB2YWwpCiAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvciBhcyBtc2c6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IobXNnKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfdHJ5X3N0cih2YWwpOgogICAgICAgICIiIgogICAgICAgIE9uIFB5dGhvbiAyLCBtdWNoIG9mIGRpc3R1dGlscyByZWxpZXMgb24gc3RyaW5nIHZhbHVlcyBiZWluZyBvZgogICAgICAgIHR5cGUgJ3N0cicgKGJ5dGVzKSBhbmQgbm90IHVuaWNvZGUgdGV4dC4gSWYgdGhlIHZhbHVlIGNhbiBiZSBzYWZlbHkKICAgICAgICBlbmNvZGVkIHRvIGJ5dGVzIHVzaW5nIHRoZSBkZWZhdWx0IGVuY29kaW5nLCBwcmVmZXIgdGhhdC4KCiAgICAgICAgV2h5IHRoZSBkZWZhdWx0IGVuY29kaW5nPyBCZWNhdXNlIHRoYXQgdmFsdWUgY2FuIGJlIGltcGxpY2l0bHkKICAgICAgICBkZWNvZGVkIGJhY2sgdG8gdGV4dCBpZiBuZWVkZWQuCgogICAgICAgIFJlZiAjMTY1MwogICAgICAgICIiIgogICAgICAgIGlmIHNpeC5QWTM6CiAgICAgICAgICAgIHJldHVybiB2YWwKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiB2YWwuZW5jb2RlKCkKICAgICAgICBleGNlcHQgVW5pY29kZUVuY29kZUVycm9yOgogICAgICAgICAgICBwYXNzCiAgICAgICAgcmV0dXJuIHZhbAoKICAgIGRlZiBfc2V0X2NvbW1hbmRfb3B0aW9ucyhzZWxmLCBjb21tYW5kX29iaiwgb3B0aW9uX2RpY3Q9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgU2V0IHRoZSBvcHRpb25zIGZvciAnY29tbWFuZF9vYmonIGZyb20gJ29wdGlvbl9kaWN0Jy4gIEJhc2ljYWxseQogICAgICAgIHRoaXMgbWVhbnMgY29weWluZyBlbGVtZW50cyBvZiBhIGRpY3Rpb25hcnkgKCdvcHRpb25fZGljdCcpIHRvCiAgICAgICAgYXR0cmlidXRlcyBvZiBhbiBpbnN0YW5jZSAoJ2NvbW1hbmQnKS4KCiAgICAgICAgJ2NvbW1hbmRfb2JqJyBtdXN0IGJlIGEgQ29tbWFuZCBpbnN0YW5jZS4gIElmICdvcHRpb25fZGljdCcgaXMgbm90CiAgICAgICAgc3VwcGxpZWQsIHVzZXMgdGhlIHN0YW5kYXJkIG9wdGlvbiBkaWN0aW9uYXJ5IGZvciB0aGlzIGNvbW1hbmQKICAgICAgICAoZnJvbSAnc2VsZi5jb21tYW5kX29wdGlvbnMnKS4KCiAgICAgICAgKEFkb3B0ZWQgZnJvbSBkaXN0dXRpbHMuZGlzdC5EaXN0cmlidXRpb24uX3NldF9jb21tYW5kX29wdGlvbnMpCiAgICAgICAgIiIiCiAgICAgICAgY29tbWFuZF9uYW1lID0gY29tbWFuZF9vYmouZ2V0X2NvbW1hbmRfbmFtZSgpCiAgICAgICAgaWYgb3B0aW9uX2RpY3QgaXMgTm9uZToKICAgICAgICAgICAgb3B0aW9uX2RpY3QgPSBzZWxmLmdldF9vcHRpb25fZGljdChjb21tYW5kX25hbWUpCgogICAgICAgIGlmIERFQlVHOgogICAgICAgICAgICBzZWxmLmFubm91bmNlKCIgIHNldHRpbmcgb3B0aW9ucyBmb3IgJyVzJyBjb21tYW5kOiIgJSBjb21tYW5kX25hbWUpCiAgICAgICAgZm9yIChvcHRpb24sIChzb3VyY2UsIHZhbHVlKSkgaW4gb3B0aW9uX2RpY3QuaXRlbXMoKToKICAgICAgICAgICAgaWYgREVCVUc6CiAgICAgICAgICAgICAgICBzZWxmLmFubm91bmNlKCIgICAgJXMgPSAlcyAoZnJvbSAlcykiICUgKG9wdGlvbiwgdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSkpCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGJvb2xfb3B0cyA9IFt0cmFuc2xhdGVfbG9uZ29wdChvKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBvIGluIGNvbW1hbmRfb2JqLmJvb2xlYW5fb3B0aW9uc10KICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICAgICAgYm9vbF9vcHRzID0gW10KICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgbmVnX29wdCA9IGNvbW1hbmRfb2JqLm5lZ2F0aXZlX29wdAogICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgICAgICBuZWdfb3B0ID0ge30KCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGlzX3N0cmluZyA9IGlzaW5zdGFuY2UodmFsdWUsIHNpeC5zdHJpbmdfdHlwZXMpCiAgICAgICAgICAgICAgICBpZiBvcHRpb24gaW4gbmVnX29wdCBhbmQgaXNfc3RyaW5nOgogICAgICAgICAgICAgICAgICAgIHNldGF0dHIoY29tbWFuZF9vYmosIG5lZ19vcHRbb3B0aW9uXSwgbm90IHN0cnRvYm9vbCh2YWx1ZSkpCiAgICAgICAgICAgICAgICBlbGlmIG9wdGlvbiBpbiBib29sX29wdHMgYW5kIGlzX3N0cmluZzoKICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKGNvbW1hbmRfb2JqLCBvcHRpb24sIHN0cnRvYm9vbCh2YWx1ZSkpCiAgICAgICAgICAgICAgICBlbGlmIGhhc2F0dHIoY29tbWFuZF9vYmosIG9wdGlvbik6CiAgICAgICAgICAgICAgICAgICAgc2V0YXR0cihjb21tYW5kX29iaiwgb3B0aW9uLCB2YWx1ZSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvciBpbiAlczogY29tbWFuZCAnJXMnIGhhcyBubyBzdWNoIG9wdGlvbiAnJXMnIgogICAgICAgICAgICAgICAgICAgICAgICAlIChzb3VyY2UsIGNvbW1hbmRfbmFtZSwgb3B0aW9uKSkKICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IgYXMgbXNnOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IobXNnKQoKICAgIGRlZiBwYXJzZV9jb25maWdfZmlsZXMoc2VsZiwgZmlsZW5hbWVzPU5vbmUsIGlnbm9yZV9vcHRpb25fZXJyb3JzPUZhbHNlKToKICAgICAgICAiIiJQYXJzZXMgY29uZmlndXJhdGlvbiBmaWxlcyBmcm9tIHZhcmlvdXMgbGV2ZWxzCiAgICAgICAgYW5kIGxvYWRzIGNvbmZpZ3VyYXRpb24uCgogICAgICAgICIiIgogICAgICAgIHNlbGYuX3BhcnNlX2NvbmZpZ19maWxlcyhmaWxlbmFtZXM9ZmlsZW5hbWVzKQoKICAgICAgICBwYXJzZV9jb25maWd1cmF0aW9uKHNlbGYsIHNlbGYuY29tbWFuZF9vcHRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlX29wdGlvbl9lcnJvcnM9aWdub3JlX29wdGlvbl9lcnJvcnMpCiAgICAgICAgc2VsZi5fZmluYWxpemVfcmVxdWlyZXMoKQoKICAgIGRlZiBwYXJzZV9jb21tYW5kX2xpbmUoc2VsZik6CiAgICAgICAgIiIiUHJvY2VzcyBmZWF0dXJlcyBhZnRlciBwYXJzaW5nIGNvbW1hbmQgbGluZSBvcHRpb25zIiIiCiAgICAgICAgcmVzdWx0ID0gX0Rpc3RyaWJ1dGlvbi5wYXJzZV9jb21tYW5kX2xpbmUoc2VsZikKICAgICAgICBpZiBzZWxmLmZlYXR1cmVzOgogICAgICAgICAgICBzZWxmLl9maW5hbGl6ZV9mZWF0dXJlcygpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBfZmVhdHVyZV9hdHRybmFtZShzZWxmLCBuYW1lKToKICAgICAgICAiIiJDb252ZXJ0IGZlYXR1cmUgbmFtZSB0byBjb3JyZXNwb25kaW5nIG9wdGlvbiBhdHRyaWJ1dGUgbmFtZSIiIgogICAgICAgIHJldHVybiAnd2l0aF8nICsgbmFtZS5yZXBsYWNlKCctJywgJ18nKQoKICAgIGRlZiBmZXRjaF9idWlsZF9lZ2dzKHNlbGYsIHJlcXVpcmVzKToKICAgICAgICAiIiJSZXNvbHZlIHByZS1zZXR1cCByZXF1aXJlbWVudHMiIiIKICAgICAgICByZXNvbHZlZF9kaXN0cyA9IHBrZ19yZXNvdXJjZXMud29ya2luZ19zZXQucmVzb2x2ZSgKICAgICAgICAgICAgcGtnX3Jlc291cmNlcy5wYXJzZV9yZXF1aXJlbWVudHMocmVxdWlyZXMpLAogICAgICAgICAgICBpbnN0YWxsZXI9c2VsZi5mZXRjaF9idWlsZF9lZ2csCiAgICAgICAgICAgIHJlcGxhY2VfY29uZmxpY3Rpbmc9VHJ1ZSwKICAgICAgICApCiAgICAgICAgZm9yIGRpc3QgaW4gcmVzb2x2ZWRfZGlzdHM6CiAgICAgICAgICAgIHBrZ19yZXNvdXJjZXMud29ya2luZ19zZXQuYWRkKGRpc3QsIHJlcGxhY2U9VHJ1ZSkKICAgICAgICByZXR1cm4gcmVzb2x2ZWRfZGlzdHMKCiAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBBbGxvdyBwbHVnaW5zIHRvIGFwcGx5IGFyYml0cmFyeSBvcGVyYXRpb25zIHRvIHRoZQogICAgICAgIGRpc3RyaWJ1dGlvbi4gRWFjaCBob29rIG1heSBvcHRpb25hbGx5IGRlZmluZSBhICdvcmRlcicKICAgICAgICB0byBpbmZsdWVuY2UgdGhlIG9yZGVyIG9mIGV4ZWN1dGlvbi4gU21hbGxlciBudW1iZXJzCiAgICAgICAgZ28gZmlyc3QgYW5kIHRoZSBkZWZhdWx0IGlzIDAuCiAgICAgICAgIiIiCiAgICAgICAgaG9va19rZXkgPSAnc2V0dXB0b29scy5maW5hbGl6ZV9kaXN0cmlidXRpb25fb3B0aW9ucycKCiAgICAgICAgZGVmIGJ5X29yZGVyKGhvb2spOgogICAgICAgICAgICByZXR1cm4gZ2V0YXR0cihob29rLCAnb3JkZXInLCAwKQogICAgICAgIGVwcyA9IHBrZ19yZXNvdXJjZXMuaXRlcl9lbnRyeV9wb2ludHMoaG9va19rZXkpCiAgICAgICAgZm9yIGVwIGluIHNvcnRlZChlcHMsIGtleT1ieV9vcmRlcik6CiAgICAgICAgICAgIGVwLmxvYWQoKShzZWxmKQoKICAgIGRlZiBfZmluYWxpemVfc2V0dXBfa2V5d29yZHMoc2VsZik6CiAgICAgICAgZm9yIGVwIGluIHBrZ19yZXNvdXJjZXMuaXRlcl9lbnRyeV9wb2ludHMoJ2Rpc3R1dGlscy5zZXR1cF9rZXl3b3JkcycpOgogICAgICAgICAgICB2YWx1ZSA9IGdldGF0dHIoc2VsZiwgZXAubmFtZSwgTm9uZSkKICAgICAgICAgICAgaWYgdmFsdWUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBlcC5yZXF1aXJlKGluc3RhbGxlcj1zZWxmLmZldGNoX2J1aWxkX2VnZykKICAgICAgICAgICAgICAgIGVwLmxvYWQoKShzZWxmLCBlcC5uYW1lLCB2YWx1ZSkKCiAgICBkZWYgX2ZpbmFsaXplXzJ0bzNfZG9jdGVzdHMoc2VsZik6CiAgICAgICAgaWYgZ2V0YXR0cihzZWxmLCAnY29udmVydF8ydG8zX2RvY3Rlc3RzJywgTm9uZSk6CiAgICAgICAgICAgICMgWFhYIG1heSBjb252ZXJ0IHRvIHNldCBoZXJlIHdoZW4gd2UgY2FuIHJlbHkgb24gc2V0IGJlaW5nIGJ1aWx0aW4KICAgICAgICAgICAgc2VsZi5jb252ZXJ0XzJ0bzNfZG9jdGVzdHMgPSBbCiAgICAgICAgICAgICAgICBvcy5wYXRoLmFic3BhdGgocCkKICAgICAgICAgICAgICAgIGZvciBwIGluIHNlbGYuY29udmVydF8ydG8zX2RvY3Rlc3RzCiAgICAgICAgICAgIF0KICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmNvbnZlcnRfMnRvM19kb2N0ZXN0cyA9IFtdCgogICAgZGVmIGdldF9lZ2dfY2FjaGVfZGlyKHNlbGYpOgogICAgICAgIGVnZ19jYWNoZV9kaXIgPSBvcy5wYXRoLmpvaW4ob3MuY3VyZGlyLCAnLmVnZ3MnKQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhlZ2dfY2FjaGVfZGlyKToKICAgICAgICAgICAgb3MubWtkaXIoZWdnX2NhY2hlX2RpcikKICAgICAgICAgICAgd2luZG93c19zdXBwb3J0LmhpZGVfZmlsZShlZ2dfY2FjaGVfZGlyKQogICAgICAgICAgICByZWFkbWVfdHh0X2ZpbGVuYW1lID0gb3MucGF0aC5qb2luKGVnZ19jYWNoZV9kaXIsICdSRUFETUUudHh0JykKICAgICAgICAgICAgd2l0aCBvcGVuKHJlYWRtZV90eHRfZmlsZW5hbWUsICd3JykgYXMgZjoKICAgICAgICAgICAgICAgIGYud3JpdGUoJ1RoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIGVnZ3MgdGhhdCB3ZXJlIGRvd25sb2FkZWQgJwogICAgICAgICAgICAgICAgICAgICAgICAnYnkgc2V0dXB0b29scyB0byBidWlsZCwgdGVzdCwgYW5kIHJ1biBwbHVnLWlucy5cblxuJykKICAgICAgICAgICAgICAgIGYud3JpdGUoJ1RoaXMgZGlyZWN0b3J5IGNhY2hlcyB0aG9zZSBlZ2dzIHRvIHByZXZlbnQgJwogICAgICAgICAgICAgICAgICAgICAgICAncmVwZWF0ZWQgZG93bmxvYWRzLlxuXG4nKQogICAgICAgICAgICAgICAgZi53cml0ZSgnSG93ZXZlciwgaXQgaXMgc2FmZSB0byBkZWxldGUgdGhpcyBkaXJlY3RvcnkuXG5cbicpCgogICAgICAgIHJldHVybiBlZ2dfY2FjaGVfZGlyCgogICAgZGVmIGZldGNoX2J1aWxkX2VnZyhzZWxmLCByZXEpOgogICAgICAgICIiIkZldGNoIGFuIGVnZyBuZWVkZWQgZm9yIGJ1aWxkaW5nIiIiCiAgICAgICAgZnJvbSBzZXR1cHRvb2xzLmluc3RhbGxlciBpbXBvcnQgZmV0Y2hfYnVpbGRfZWdnCiAgICAgICAgcmV0dXJuIGZldGNoX2J1aWxkX2VnZyhzZWxmLCByZXEpCgogICAgZGVmIF9maW5hbGl6ZV9mZWF0dXJlX29wdHMoc2VsZik6CiAgICAgICAgIiIiQWRkIC0td2l0aC1YLy0td2l0aG91dC1YIG9wdGlvbnMgYmFzZWQgb24gb3B0aW9uYWwgZmVhdHVyZXMiIiIKCiAgICAgICAgaWYgbm90IHNlbGYuZmVhdHVyZXM6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBnbyA9IFtdCiAgICAgICAgbm8gPSBzZWxmLm5lZ2F0aXZlX29wdC5jb3B5KCkKCiAgICAgICAgZm9yIG5hbWUsIGZlYXR1cmUgaW4gc2VsZi5mZWF0dXJlcy5pdGVtcygpOgogICAgICAgICAgICBzZWxmLl9zZXRfZmVhdHVyZShuYW1lLCBOb25lKQogICAgICAgICAgICBmZWF0dXJlLnZhbGlkYXRlKHNlbGYpCgogICAgICAgICAgICBpZiBmZWF0dXJlLm9wdGlvbmFsOgogICAgICAgICAgICAgICAgZGVzY3IgPSBmZWF0dXJlLmRlc2NyaXB0aW9uCiAgICAgICAgICAgICAgICBpbmNkZWYgPSAnIChkZWZhdWx0KScKICAgICAgICAgICAgICAgIGV4Y2RlZiA9ICcnCiAgICAgICAgICAgICAgICBpZiBub3QgZmVhdHVyZS5pbmNsdWRlX2J5X2RlZmF1bHQoKToKICAgICAgICAgICAgICAgICAgICBleGNkZWYsIGluY2RlZiA9IGluY2RlZiwgZXhjZGVmCgogICAgICAgICAgICAgICAgbmV3ID0gKAogICAgICAgICAgICAgICAgICAgICgnd2l0aC0nICsgbmFtZSwgTm9uZSwgJ2luY2x1ZGUgJyArIGRlc2NyICsgaW5jZGVmKSwKICAgICAgICAgICAgICAgICAgICAoJ3dpdGhvdXQtJyArIG5hbWUsIE5vbmUsICdleGNsdWRlICcgKyBkZXNjciArIGV4Y2RlZiksCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBnby5leHRlbmQobmV3KQogICAgICAgICAgICAgICAgbm9bJ3dpdGhvdXQtJyArIG5hbWVdID0gJ3dpdGgtJyArIG5hbWUKCiAgICAgICAgc2VsZi5nbG9iYWxfb3B0aW9ucyA9IHNlbGYuZmVhdHVyZV9vcHRpb25zID0gZ28gKyBzZWxmLmdsb2JhbF9vcHRpb25zCiAgICAgICAgc2VsZi5uZWdhdGl2ZV9vcHQgPSBzZWxmLmZlYXR1cmVfbmVnb3B0ID0gbm8KCiAgICBkZWYgX2ZpbmFsaXplX2ZlYXR1cmVzKHNlbGYpOgogICAgICAgICIiIkFkZC9yZW1vdmUgZmVhdHVyZXMgYW5kIHJlc29sdmUgZGVwZW5kZW5jaWVzIGJldHdlZW4gdGhlbSIiIgoKICAgICAgICAjIEZpcnN0LCBmbGFnIGFsbCB0aGUgZW5hYmxlZCBpdGVtcyAoYW5kIHRodXMgdGhlaXIgZGVwZW5kZW5jaWVzKQogICAgICAgIGZvciBuYW1lLCBmZWF0dXJlIGluIHNlbGYuZmVhdHVyZXMuaXRlbXMoKToKICAgICAgICAgICAgZW5hYmxlZCA9IHNlbGYuZmVhdHVyZV9pc19pbmNsdWRlZChuYW1lKQogICAgICAgICAgICBpZiBlbmFibGVkIG9yIChlbmFibGVkIGlzIE5vbmUgYW5kIGZlYXR1cmUuaW5jbHVkZV9ieV9kZWZhdWx0KCkpOgogICAgICAgICAgICAgICAgZmVhdHVyZS5pbmNsdWRlX2luKHNlbGYpCiAgICAgICAgICAgICAgICBzZWxmLl9zZXRfZmVhdHVyZShuYW1lLCAxKQoKICAgICAgICAjIFRoZW4gZGlzYWJsZSB0aGUgcmVzdCwgc28gdGhhdCBvZmYtYnktZGVmYXVsdCBmZWF0dXJlcyBkb24ndAogICAgICAgICMgZ2V0IGZsYWdnZWQgYXMgZXJyb3JzIHdoZW4gdGhleSdyZSByZXF1aXJlZCBieSBhbiBlbmFibGVkIGZlYXR1cmUKICAgICAgICBmb3IgbmFtZSwgZmVhdHVyZSBpbiBzZWxmLmZlYXR1cmVzLml0ZW1zKCk6CiAgICAgICAgICAgIGlmIG5vdCBzZWxmLmZlYXR1cmVfaXNfaW5jbHVkZWQobmFtZSk6CiAgICAgICAgICAgICAgICBmZWF0dXJlLmV4Y2x1ZGVfZnJvbShzZWxmKQogICAgICAgICAgICAgICAgc2VsZi5fc2V0X2ZlYXR1cmUobmFtZSwgMCkKCiAgICBkZWYgZ2V0X2NvbW1hbmRfY2xhc3Moc2VsZiwgY29tbWFuZCk6CiAgICAgICAgIiIiUGx1Z2dhYmxlIHZlcnNpb24gb2YgZ2V0X2NvbW1hbmRfY2xhc3MoKSIiIgogICAgICAgIGlmIGNvbW1hbmQgaW4gc2VsZi5jbWRjbGFzczoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuY21kY2xhc3NbY29tbWFuZF0KCiAgICAgICAgZXBzID0gcGtnX3Jlc291cmNlcy5pdGVyX2VudHJ5X3BvaW50cygnZGlzdHV0aWxzLmNvbW1hbmRzJywgY29tbWFuZCkKICAgICAgICBmb3IgZXAgaW4gZXBzOgogICAgICAgICAgICBlcC5yZXF1aXJlKGluc3RhbGxlcj1zZWxmLmZldGNoX2J1aWxkX2VnZykKICAgICAgICAgICAgc2VsZi5jbWRjbGFzc1tjb21tYW5kXSA9IGNtZGNsYXNzID0gZXAubG9hZCgpCiAgICAgICAgICAgIHJldHVybiBjbWRjbGFzcwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBfRGlzdHJpYnV0aW9uLmdldF9jb21tYW5kX2NsYXNzKHNlbGYsIGNvbW1hbmQpCgogICAgZGVmIHByaW50X2NvbW1hbmRzKHNlbGYpOgogICAgICAgIGZvciBlcCBpbiBwa2dfcmVzb3VyY2VzLml0ZXJfZW50cnlfcG9pbnRzKCdkaXN0dXRpbHMuY29tbWFuZHMnKToKICAgICAgICAgICAgaWYgZXAubmFtZSBub3QgaW4gc2VsZi5jbWRjbGFzczoKICAgICAgICAgICAgICAgICMgZG9uJ3QgcmVxdWlyZSBleHRyYXMgYXMgdGhlIGNvbW1hbmRzIHdvbid0IGJlIGludm9rZWQKICAgICAgICAgICAgICAgIGNtZGNsYXNzID0gZXAucmVzb2x2ZSgpCiAgICAgICAgICAgICAgICBzZWxmLmNtZGNsYXNzW2VwLm5hbWVdID0gY21kY2xhc3MKICAgICAgICByZXR1cm4gX0Rpc3RyaWJ1dGlvbi5wcmludF9jb21tYW5kcyhzZWxmKQoKICAgIGRlZiBnZXRfY29tbWFuZF9saXN0KHNlbGYpOgogICAgICAgIGZvciBlcCBpbiBwa2dfcmVzb3VyY2VzLml0ZXJfZW50cnlfcG9pbnRzKCdkaXN0dXRpbHMuY29tbWFuZHMnKToKICAgICAgICAgICAgaWYgZXAubmFtZSBub3QgaW4gc2VsZi5jbWRjbGFzczoKICAgICAgICAgICAgICAgICMgZG9uJ3QgcmVxdWlyZSBleHRyYXMgYXMgdGhlIGNvbW1hbmRzIHdvbid0IGJlIGludm9rZWQKICAgICAgICAgICAgICAgIGNtZGNsYXNzID0gZXAucmVzb2x2ZSgpCiAgICAgICAgICAgICAgICBzZWxmLmNtZGNsYXNzW2VwLm5hbWVdID0gY21kY2xhc3MKICAgICAgICByZXR1cm4gX0Rpc3RyaWJ1dGlvbi5nZXRfY29tbWFuZF9saXN0KHNlbGYpCgogICAgZGVmIF9zZXRfZmVhdHVyZShzZWxmLCBuYW1lLCBzdGF0dXMpOgogICAgICAgICIiIlNldCBmZWF0dXJlJ3MgaW5jbHVzaW9uIHN0YXR1cyIiIgogICAgICAgIHNldGF0dHIoc2VsZiwgc2VsZi5fZmVhdHVyZV9hdHRybmFtZShuYW1lKSwgc3RhdHVzKQoKICAgIGRlZiBmZWF0dXJlX2lzX2luY2x1ZGVkKHNlbGYsIG5hbWUpOgogICAgICAgICIiIlJldHVybiAxIGlmIGZlYXR1cmUgaXMgaW5jbHVkZWQsIDAgaWYgZXhjbHVkZWQsICdOb25lJyBpZiB1bmtub3duIiIiCiAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZiwgc2VsZi5fZmVhdHVyZV9hdHRybmFtZShuYW1lKSkKCiAgICBkZWYgaW5jbHVkZV9mZWF0dXJlKHNlbGYsIG5hbWUpOgogICAgICAgICIiIlJlcXVlc3QgaW5jbHVzaW9uIG9mIGZlYXR1cmUgbmFtZWQgJ25hbWUnIiIiCgogICAgICAgIGlmIHNlbGYuZmVhdHVyZV9pc19pbmNsdWRlZChuYW1lKSA9PSAwOgogICAgICAgICAgICBkZXNjciA9IHNlbGYuZmVhdHVyZXNbbmFtZV0uZGVzY3JpcHRpb24KICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICBkZXNjciArICIgaXMgcmVxdWlyZWQsIGJ1dCB3YXMgZXhjbHVkZWQgb3IgaXMgbm90IGF2YWlsYWJsZSIKICAgICAgICAgICAgKQogICAgICAgIHNlbGYuZmVhdHVyZXNbbmFtZV0uaW5jbHVkZV9pbihzZWxmKQogICAgICAgIHNlbGYuX3NldF9mZWF0dXJlKG5hbWUsIDEpCgogICAgZGVmIGluY2x1ZGUoc2VsZiwgKiphdHRycyk6CiAgICAgICAgIiIiQWRkIGl0ZW1zIHRvIGRpc3RyaWJ1dGlvbiB0aGF0IGFyZSBuYW1lZCBpbiBrZXl3b3JkIGFyZ3VtZW50cwoKICAgICAgICBGb3IgZXhhbXBsZSwgJ2Rpc3QuaW5jbHVkZShweV9tb2R1bGVzPVsieCJdKScgd291bGQgYWRkICd4JyB0bwogICAgICAgIHRoZSBkaXN0cmlidXRpb24ncyAncHlfbW9kdWxlcycgYXR0cmlidXRlLCBpZiBpdCB3YXMgbm90IGFscmVhZHkKICAgICAgICB0aGVyZS4KCiAgICAgICAgQ3VycmVudGx5LCB0aGlzIG1ldGhvZCBvbmx5IHN1cHBvcnRzIGluY2x1c2lvbiBmb3IgYXR0cmlidXRlcyB0aGF0IGFyZQogICAgICAgIGxpc3RzIG9yIHR1cGxlcy4gIElmIHlvdSBuZWVkIHRvIGFkZCBzdXBwb3J0IGZvciBhZGRpbmcgdG8gb3RoZXIKICAgICAgICBhdHRyaWJ1dGVzIGluIHRoaXMgb3IgYSBzdWJjbGFzcywgeW91IGNhbiBhZGQgYW4gJ19pbmNsdWRlX1gnIG1ldGhvZCwKICAgICAgICB3aGVyZSAnWCcgaXMgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS4gIFRoZSBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2l0aAogICAgICAgIHRoZSB2YWx1ZSBwYXNzZWQgdG8gJ2luY2x1ZGUoKScuICBTbywgJ2Rpc3QuaW5jbHVkZShmb289eyJiYXIiOiJiYXoifSknCiAgICAgICAgd2lsbCB0cnkgdG8gY2FsbCAnZGlzdC5faW5jbHVkZV9mb28oeyJiYXIiOiJiYXoifSknLCB3aGljaCBjYW4gdGhlbgogICAgICAgIGhhbmRsZSB3aGF0ZXZlciBzcGVjaWFsIGluY2x1c2lvbiBsb2dpYyBpcyBuZWVkZWQuCiAgICAgICAgIiIiCiAgICAgICAgZm9yIGssIHYgaW4gYXR0cnMuaXRlbXMoKToKICAgICAgICAgICAgaW5jbHVkZSA9IGdldGF0dHIoc2VsZiwgJ19pbmNsdWRlXycgKyBrLCBOb25lKQogICAgICAgICAgICBpZiBpbmNsdWRlOgogICAgICAgICAgICAgICAgaW5jbHVkZSh2KQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5faW5jbHVkZV9taXNjKGssIHYpCgogICAgZGVmIGV4Y2x1ZGVfcGFja2FnZShzZWxmLCBwYWNrYWdlKToKICAgICAgICAiIiJSZW1vdmUgcGFja2FnZXMsIG1vZHVsZXMsIGFuZCBleHRlbnNpb25zIGluIG5hbWVkIHBhY2thZ2UiIiIKCiAgICAgICAgcGZ4ID0gcGFja2FnZSArICcuJwogICAgICAgIGlmIHNlbGYucGFja2FnZXM6CiAgICAgICAgICAgIHNlbGYucGFja2FnZXMgPSBbCiAgICAgICAgICAgICAgICBwIGZvciBwIGluIHNlbGYucGFja2FnZXMKICAgICAgICAgICAgICAgIGlmIHAgIT0gcGFja2FnZSBhbmQgbm90IHAuc3RhcnRzd2l0aChwZngpCiAgICAgICAgICAgIF0KCiAgICAgICAgaWYgc2VsZi5weV9tb2R1bGVzOgogICAgICAgICAgICBzZWxmLnB5X21vZHVsZXMgPSBbCiAgICAgICAgICAgICAgICBwIGZvciBwIGluIHNlbGYucHlfbW9kdWxlcwogICAgICAgICAgICAgICAgaWYgcCAhPSBwYWNrYWdlIGFuZCBub3QgcC5zdGFydHN3aXRoKHBmeCkKICAgICAgICAgICAgXQoKICAgICAgICBpZiBzZWxmLmV4dF9tb2R1bGVzOgogICAgICAgICAgICBzZWxmLmV4dF9tb2R1bGVzID0gWwogICAgICAgICAgICAgICAgcCBmb3IgcCBpbiBzZWxmLmV4dF9tb2R1bGVzCiAgICAgICAgICAgICAgICBpZiBwLm5hbWUgIT0gcGFja2FnZSBhbmQgbm90IHAubmFtZS5zdGFydHN3aXRoKHBmeCkKICAgICAgICAgICAgXQoKICAgIGRlZiBoYXNfY29udGVudHNfZm9yKHNlbGYsIHBhY2thZ2UpOgogICAgICAgICIiIlJldHVybiB0cnVlIGlmICdleGNsdWRlX3BhY2thZ2UocGFja2FnZSknIHdvdWxkIGRvIHNvbWV0aGluZyIiIgoKICAgICAgICBwZnggPSBwYWNrYWdlICsgJy4nCgogICAgICAgIGZvciBwIGluIHNlbGYuaXRlcl9kaXN0cmlidXRpb25fbmFtZXMoKToKICAgICAgICAgICAgaWYgcCA9PSBwYWNrYWdlIG9yIHAuc3RhcnRzd2l0aChwZngpOgogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgX2V4Y2x1ZGVfbWlzYyhzZWxmLCBuYW1lLCB2YWx1ZSk6CiAgICAgICAgIiIiSGFuZGxlICdleGNsdWRlKCknIGZvciBsaXN0L3R1cGxlIGF0dHJzIHdpdGhvdXQgYSBzcGVjaWFsIGhhbmRsZXIiIiIKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh2YWx1ZSwgc2VxdWVuY2UpOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAogICAgICAgICAgICAgICAgIiVzOiBzZXR0aW5nIG11c3QgYmUgYSBsaXN0IG9yIHR1cGxlICglcikiICUgKG5hbWUsIHZhbHVlKQogICAgICAgICAgICApCiAgICAgICAgdHJ5OgogICAgICAgICAgICBvbGQgPSBnZXRhdHRyKHNlbGYsIG5hbWUpCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAogICAgICAgICAgICAgICAgIiVzOiBObyBzdWNoIGRpc3RyaWJ1dGlvbiBzZXR0aW5nIiAlIG5hbWUKICAgICAgICAgICAgKQogICAgICAgIGlmIG9sZCBpcyBub3QgTm9uZSBhbmQgbm90IGlzaW5zdGFuY2Uob2xkLCBzZXF1ZW5jZSk6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCiAgICAgICAgICAgICAgICBuYW1lICsgIjogdGhpcyBzZXR0aW5nIGNhbm5vdCBiZSBjaGFuZ2VkIHZpYSBpbmNsdWRlL2V4Y2x1ZGUiCiAgICAgICAgICAgICkKICAgICAgICBlbGlmIG9sZDoKICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBuYW1lLCBbaXRlbSBmb3IgaXRlbSBpbiBvbGQgaWYgaXRlbSBub3QgaW4gdmFsdWVdKQoKICAgIGRlZiBfaW5jbHVkZV9taXNjKHNlbGYsIG5hbWUsIHZhbHVlKToKICAgICAgICAiIiJIYW5kbGUgJ2luY2x1ZGUoKScgZm9yIGxpc3QvdHVwbGUgYXR0cnMgd2l0aG91dCBhIHNwZWNpYWwgaGFuZGxlciIiIgoKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh2YWx1ZSwgc2VxdWVuY2UpOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAogICAgICAgICAgICAgICAgIiVzOiBzZXR0aW5nIG11c3QgYmUgYSBsaXN0ICglcikiICUgKG5hbWUsIHZhbHVlKQogICAgICAgICAgICApCiAgICAgICAgdHJ5OgogICAgICAgICAgICBvbGQgPSBnZXRhdHRyKHNlbGYsIG5hbWUpCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAogICAgICAgICAgICAgICAgIiVzOiBObyBzdWNoIGRpc3RyaWJ1dGlvbiBzZXR0aW5nIiAlIG5hbWUKICAgICAgICAgICAgKQogICAgICAgIGlmIG9sZCBpcyBOb25lOgogICAgICAgICAgICBzZXRhdHRyKHNlbGYsIG5hbWUsIHZhbHVlKQogICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2Uob2xkLCBzZXF1ZW5jZSk6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCiAgICAgICAgICAgICAgICBuYW1lICsgIjogdGhpcyBzZXR0aW5nIGNhbm5vdCBiZSBjaGFuZ2VkIHZpYSBpbmNsdWRlL2V4Y2x1ZGUiCiAgICAgICAgICAgICkKICAgICAgICBlbHNlOgogICAgICAgICAgICBuZXcgPSBbaXRlbSBmb3IgaXRlbSBpbiB2YWx1ZSBpZiBpdGVtIG5vdCBpbiBvbGRdCiAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgbmFtZSwgb2xkICsgbmV3KQoKICAgIGRlZiBleGNsdWRlKHNlbGYsICoqYXR0cnMpOgogICAgICAgICIiIlJlbW92ZSBpdGVtcyBmcm9tIGRpc3RyaWJ1dGlvbiB0aGF0IGFyZSBuYW1lZCBpbiBrZXl3b3JkIGFyZ3VtZW50cwoKICAgICAgICBGb3IgZXhhbXBsZSwgJ2Rpc3QuZXhjbHVkZShweV9tb2R1bGVzPVsieCJdKScgd291bGQgcmVtb3ZlICd4JyBmcm9tCiAgICAgICAgdGhlIGRpc3RyaWJ1dGlvbidzICdweV9tb2R1bGVzJyBhdHRyaWJ1dGUuICBFeGNsdWRpbmcgcGFja2FnZXMgdXNlcwogICAgICAgIHRoZSAnZXhjbHVkZV9wYWNrYWdlKCknIG1ldGhvZCwgc28gYWxsIG9mIHRoZSBwYWNrYWdlJ3MgY29udGFpbmVkCiAgICAgICAgcGFja2FnZXMsIG1vZHVsZXMsIGFuZCBleHRlbnNpb25zIGFyZSBhbHNvIGV4Y2x1ZGVkLgoKICAgICAgICBDdXJyZW50bHksIHRoaXMgbWV0aG9kIG9ubHkgc3VwcG9ydHMgZXhjbHVzaW9uIGZyb20gYXR0cmlidXRlcyB0aGF0IGFyZQogICAgICAgIGxpc3RzIG9yIHR1cGxlcy4gIElmIHlvdSBuZWVkIHRvIGFkZCBzdXBwb3J0IGZvciBleGNsdWRpbmcgZnJvbSBvdGhlcgogICAgICAgIGF0dHJpYnV0ZXMgaW4gdGhpcyBvciBhIHN1YmNsYXNzLCB5b3UgY2FuIGFkZCBhbiAnX2V4Y2x1ZGVfWCcgbWV0aG9kLAogICAgICAgIHdoZXJlICdYJyBpcyB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLiAgVGhlIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aXRoCiAgICAgICAgdGhlIHZhbHVlIHBhc3NlZCB0byAnZXhjbHVkZSgpJy4gIFNvLCAnZGlzdC5leGNsdWRlKGZvbz17ImJhciI6ImJheiJ9KScKICAgICAgICB3aWxsIHRyeSB0byBjYWxsICdkaXN0Ll9leGNsdWRlX2Zvbyh7ImJhciI6ImJheiJ9KScsIHdoaWNoIGNhbiB0aGVuCiAgICAgICAgaGFuZGxlIHdoYXRldmVyIHNwZWNpYWwgZXhjbHVzaW9uIGxvZ2ljIGlzIG5lZWRlZC4KICAgICAgICAiIiIKICAgICAgICBmb3IgaywgdiBpbiBhdHRycy5pdGVtcygpOgogICAgICAgICAgICBleGNsdWRlID0gZ2V0YXR0cihzZWxmLCAnX2V4Y2x1ZGVfJyArIGssIE5vbmUpCiAgICAgICAgICAgIGlmIGV4Y2x1ZGU6CiAgICAgICAgICAgICAgICBleGNsdWRlKHYpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLl9leGNsdWRlX21pc2MoaywgdikKCiAgICBkZWYgX2V4Y2x1ZGVfcGFja2FnZXMoc2VsZiwgcGFja2FnZXMpOgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHBhY2thZ2VzLCBzZXF1ZW5jZSk6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCiAgICAgICAgICAgICAgICAicGFja2FnZXM6IHNldHRpbmcgbXVzdCBiZSBhIGxpc3Qgb3IgdHVwbGUgKCVyKSIgJSAocGFja2FnZXMsKQogICAgICAgICAgICApCiAgICAgICAgbGlzdChtYXAoc2VsZi5leGNsdWRlX3BhY2thZ2UsIHBhY2thZ2VzKSkKCiAgICBkZWYgX3BhcnNlX2NvbW1hbmRfb3B0cyhzZWxmLCBwYXJzZXIsIGFyZ3MpOgogICAgICAgICMgUmVtb3ZlIC0td2l0aC1YLy0td2l0aG91dC1YIG9wdGlvbnMgd2hlbiBwcm9jZXNzaW5nIGNvbW1hbmQgYXJncwogICAgICAgIHNlbGYuZ2xvYmFsX29wdGlvbnMgPSBzZWxmLl9fY2xhc3NfXy5nbG9iYWxfb3B0aW9ucwogICAgICAgIHNlbGYubmVnYXRpdmVfb3B0ID0gc2VsZi5fX2NsYXNzX18ubmVnYXRpdmVfb3B0CgogICAgICAgICMgRmlyc3QsIGV4cGFuZCBhbnkgYWxpYXNlcwogICAgICAgIGNvbW1hbmQgPSBhcmdzWzBdCiAgICAgICAgYWxpYXNlcyA9IHNlbGYuZ2V0X29wdGlvbl9kaWN0KCdhbGlhc2VzJykKICAgICAgICB3aGlsZSBjb21tYW5kIGluIGFsaWFzZXM6CiAgICAgICAgICAgIHNyYywgYWxpYXMgPSBhbGlhc2VzW2NvbW1hbmRdCiAgICAgICAgICAgIGRlbCBhbGlhc2VzW2NvbW1hbmRdICAjIGVuc3VyZSBlYWNoIGFsaWFzIGNhbiBleHBhbmQgb25seSBvbmNlIQogICAgICAgICAgICBpbXBvcnQgc2hsZXgKICAgICAgICAgICAgYXJnc1s6MV0gPSBzaGxleC5zcGxpdChhbGlhcywgVHJ1ZSkKICAgICAgICAgICAgY29tbWFuZCA9IGFyZ3NbMF0KCiAgICAgICAgbmFyZ3MgPSBfRGlzdHJpYnV0aW9uLl9wYXJzZV9jb21tYW5kX29wdHMoc2VsZiwgcGFyc2VyLCBhcmdzKQoKICAgICAgICAjIEhhbmRsZSBjb21tYW5kcyB0aGF0IHdhbnQgdG8gY29uc3VtZSBhbGwgcmVtYWluaW5nIGFyZ3VtZW50cwogICAgICAgIGNtZF9jbGFzcyA9IHNlbGYuZ2V0X2NvbW1hbmRfY2xhc3MoY29tbWFuZCkKICAgICAgICBpZiBnZXRhdHRyKGNtZF9jbGFzcywgJ2NvbW1hbmRfY29uc3VtZXNfYXJndW1lbnRzJywgTm9uZSk6CiAgICAgICAgICAgIHNlbGYuZ2V0X29wdGlvbl9kaWN0KGNvbW1hbmQpWydhcmdzJ10gPSAoImNvbW1hbmQgbGluZSIsIG5hcmdzKQogICAgICAgICAgICBpZiBuYXJncyBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIHJldHVybiBbXQoKICAgICAgICByZXR1cm4gbmFyZ3MKCiAgICBkZWYgZ2V0X2NtZGxpbmVfb3B0aW9ucyhzZWxmKToKICAgICAgICAiIiJSZXR1cm4gYSAne2NtZDoge29wdDp2YWx9fScgbWFwIG9mIGFsbCBjb21tYW5kLWxpbmUgb3B0aW9ucwoKICAgICAgICBPcHRpb24gbmFtZXMgYXJlIGFsbCBsb25nLCBidXQgZG8gbm90IGluY2x1ZGUgdGhlIGxlYWRpbmcgJy0tJywgYW5kCiAgICAgICAgY29udGFpbiBkYXNoZXMgcmF0aGVyIHRoYW4gdW5kZXJzY29yZXMuICBJZiB0aGUgb3B0aW9uIGRvZXNuJ3QgdGFrZQogICAgICAgIGFuIGFyZ3VtZW50IChlLmcuICctLXF1aWV0JyksIHRoZSAndmFsJyBpcyAnTm9uZScuCgogICAgICAgIE5vdGUgdGhhdCBvcHRpb25zIHByb3ZpZGVkIGJ5IGNvbmZpZyBmaWxlcyBhcmUgaW50ZW50aW9uYWxseSBleGNsdWRlZC4KICAgICAgICAiIiIKCiAgICAgICAgZCA9IHt9CgogICAgICAgIGZvciBjbWQsIG9wdHMgaW4gc2VsZi5jb21tYW5kX29wdGlvbnMuaXRlbXMoKToKCiAgICAgICAgICAgIGZvciBvcHQsIChzcmMsIHZhbCkgaW4gb3B0cy5pdGVtcygpOgoKICAgICAgICAgICAgICAgIGlmIHNyYyAhPSAiY29tbWFuZCBsaW5lIjoKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgICAgIG9wdCA9IG9wdC5yZXBsYWNlKCdfJywgJy0nKQoKICAgICAgICAgICAgICAgIGlmIHZhbCA9PSAwOgogICAgICAgICAgICAgICAgICAgIGNtZG9iaiA9IHNlbGYuZ2V0X2NvbW1hbmRfb2JqKGNtZCkKICAgICAgICAgICAgICAgICAgICBuZWdfb3B0ID0gc2VsZi5uZWdhdGl2ZV9vcHQuY29weSgpCiAgICAgICAgICAgICAgICAgICAgbmVnX29wdC51cGRhdGUoZ2V0YXR0cihjbWRvYmosICduZWdhdGl2ZV9vcHQnLCB7fSkpCiAgICAgICAgICAgICAgICAgICAgZm9yIG5lZywgcG9zIGluIG5lZ19vcHQuaXRlbXMoKToKICAgICAgICAgICAgICAgICAgICAgICAgaWYgcG9zID09IG9wdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdCA9IG5lZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gTm9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigiU2hvdWxkbid0IGJlIGFibGUgdG8gZ2V0IGhlcmUiKQoKICAgICAgICAgICAgICAgIGVsaWYgdmFsID09IDE6CiAgICAgICAgICAgICAgICAgICAgdmFsID0gTm9uZQoKICAgICAgICAgICAgICAgIGQuc2V0ZGVmYXVsdChjbWQsIHt9KVtvcHRdID0gdmFsCgogICAgICAgIHJldHVybiBkCgogICAgZGVmIGl0ZXJfZGlzdHJpYnV0aW9uX25hbWVzKHNlbGYpOgogICAgICAgICIiIllpZWxkIGFsbCBwYWNrYWdlcywgbW9kdWxlcywgYW5kIGV4dGVuc2lvbiBuYW1lcyBpbiBkaXN0cmlidXRpb24iIiIKCiAgICAgICAgZm9yIHBrZyBpbiBzZWxmLnBhY2thZ2VzIG9yICgpOgogICAgICAgICAgICB5aWVsZCBwa2cKCiAgICAgICAgZm9yIG1vZHVsZSBpbiBzZWxmLnB5X21vZHVsZXMgb3IgKCk6CiAgICAgICAgICAgIHlpZWxkIG1vZHVsZQoKICAgICAgICBmb3IgZXh0IGluIHNlbGYuZXh0X21vZHVsZXMgb3IgKCk6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXh0LCB0dXBsZSk6CiAgICAgICAgICAgICAgICBuYW1lLCBidWlsZGluZm8gPSBleHQKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIG5hbWUgPSBleHQubmFtZQogICAgICAgICAgICBpZiBuYW1lLmVuZHN3aXRoKCdtb2R1bGUnKToKICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lWzotNl0KICAgICAgICAgICAgeWllbGQgbmFtZQoKICAgIGRlZiBoYW5kbGVfZGlzcGxheV9vcHRpb25zKHNlbGYsIG9wdGlvbl9vcmRlcik6CiAgICAgICAgIiIiSWYgdGhlcmUgd2VyZSBhbnkgbm9uLWdsb2JhbCAiZGlzcGxheS1vbmx5IiBvcHRpb25zCiAgICAgICAgKC0taGVscC1jb21tYW5kcyBvciB0aGUgbWV0YWRhdGEgZGlzcGxheSBvcHRpb25zKSBvbiB0aGUgY29tbWFuZAogICAgICAgIGxpbmUsIGRpc3BsYXkgdGhlIHJlcXVlc3RlZCBpbmZvIGFuZCByZXR1cm4gdHJ1ZTsgZWxzZSByZXR1cm4KICAgICAgICBmYWxzZS4KICAgICAgICAiIiIKICAgICAgICBpbXBvcnQgc3lzCgogICAgICAgIGlmIHNpeC5QWTIgb3Igc2VsZi5oZWxwX2NvbW1hbmRzOgogICAgICAgICAgICByZXR1cm4gX0Rpc3RyaWJ1dGlvbi5oYW5kbGVfZGlzcGxheV9vcHRpb25zKHNlbGYsIG9wdGlvbl9vcmRlcikKCiAgICAgICAgIyBTdGRvdXQgbWF5IGJlIFN0cmluZ0lPIChlLmcuIGluIHRlc3RzKQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHN5cy5zdGRvdXQsIGlvLlRleHRJT1dyYXBwZXIpOgogICAgICAgICAgICByZXR1cm4gX0Rpc3RyaWJ1dGlvbi5oYW5kbGVfZGlzcGxheV9vcHRpb25zKHNlbGYsIG9wdGlvbl9vcmRlcikKCiAgICAgICAgIyBEb24ndCB3cmFwIHN0ZG91dCBpZiB1dGYtOCBpcyBhbHJlYWR5IHRoZSBlbmNvZGluZy4gUHJvdmlkZXMKICAgICAgICAjICB3b3JrYXJvdW5kIGZvciAjMzM0LgogICAgICAgIGlmIHN5cy5zdGRvdXQuZW5jb2RpbmcubG93ZXIoKSBpbiAoJ3V0Zi04JywgJ3V0ZjgnKToKICAgICAgICAgICAgcmV0dXJuIF9EaXN0cmlidXRpb24uaGFuZGxlX2Rpc3BsYXlfb3B0aW9ucyhzZWxmLCBvcHRpb25fb3JkZXIpCgogICAgICAgICMgUHJpbnQgbWV0YWRhdGEgaW4gVVRGLTggbm8gbWF0dGVyIHRoZSBwbGF0Zm9ybQogICAgICAgIGVuY29kaW5nID0gc3lzLnN0ZG91dC5lbmNvZGluZwogICAgICAgIGVycm9ycyA9IHN5cy5zdGRvdXQuZXJyb3JzCiAgICAgICAgbmV3bGluZSA9IHN5cy5wbGF0Zm9ybSAhPSAnd2luMzInIGFuZCAnXG4nIG9yIE5vbmUKICAgICAgICBsaW5lX2J1ZmZlcmluZyA9IHN5cy5zdGRvdXQubGluZV9idWZmZXJpbmcKCiAgICAgICAgc3lzLnN0ZG91dCA9IGlvLlRleHRJT1dyYXBwZXIoCiAgICAgICAgICAgIHN5cy5zdGRvdXQuZGV0YWNoKCksICd1dGYtOCcsIGVycm9ycywgbmV3bGluZSwgbGluZV9idWZmZXJpbmcpCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gX0Rpc3RyaWJ1dGlvbi5oYW5kbGVfZGlzcGxheV9vcHRpb25zKHNlbGYsIG9wdGlvbl9vcmRlcikKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBzeXMuc3Rkb3V0ID0gaW8uVGV4dElPV3JhcHBlcigKICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQuZGV0YWNoKCksIGVuY29kaW5nLCBlcnJvcnMsIG5ld2xpbmUsIGxpbmVfYnVmZmVyaW5nKQoKCmNsYXNzIEZlYXR1cmU6CiAgICAiIiIKICAgICoqZGVwcmVjYXRlZCoqIC0tIFRoZSBgRmVhdHVyZWAgZmFjaWxpdHkgd2FzIG5ldmVyIGNvbXBsZXRlbHkgaW1wbGVtZW50ZWQKICAgIG9yIHN1cHBvcnRlZCwgYGhhcyByZXBvcnRlZCBpc3N1ZXMKICAgIDxodHRwczovL2dpdGh1Yi5jb20vcHlwYS9zZXR1cHRvb2xzL2lzc3Vlcy81OD5gXyBhbmQgd2lsbCBiZSByZW1vdmVkIGluCiAgICBhIGZ1dHVyZSB2ZXJzaW9uLgoKICAgIEEgc3Vic2V0IG9mIHRoZSBkaXN0cmlidXRpb24gdGhhdCBjYW4gYmUgZXhjbHVkZWQgaWYgdW5uZWVkZWQvd2FudGVkCgogICAgRmVhdHVyZXMgYXJlIGNyZWF0ZWQgdXNpbmcgdGhlc2Uga2V5d29yZCBhcmd1bWVudHM6CgogICAgICAnZGVzY3JpcHRpb24nIC0tIGEgc2hvcnQsIGh1bWFuIHJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlLCB0bwogICAgICAgICBiZSB1c2VkIGluIGVycm9yIG1lc3NhZ2VzLCBhbmQgb3B0aW9uIGhlbHAgbWVzc2FnZXMuCgogICAgICAnc3RhbmRhcmQnIC0tIGlmIHRydWUsIHRoZSBmZWF0dXJlIGlzIGluY2x1ZGVkIGJ5IGRlZmF1bHQgaWYgaXQgaXMKICAgICAgICAgYXZhaWxhYmxlIG9uIHRoZSBjdXJyZW50IHN5c3RlbS4gIE90aGVyd2lzZSwgdGhlIGZlYXR1cmUgaXMgb25seQogICAgICAgICBpbmNsdWRlZCBpZiByZXF1ZXN0ZWQgdmlhIGEgY29tbWFuZCBsaW5lICctLXdpdGgtWCcgb3B0aW9uLCBvciBpZgogICAgICAgICBhbm90aGVyIGluY2x1ZGVkIGZlYXR1cmUgcmVxdWlyZXMgaXQuICBUaGUgZGVmYXVsdCBzZXR0aW5nIGlzICdGYWxzZScuCgogICAgICAnYXZhaWxhYmxlJyAtLSBpZiB0cnVlLCB0aGUgZmVhdHVyZSBpcyBhdmFpbGFibGUgZm9yIGluc3RhbGxhdGlvbiBvbiB0aGUKICAgICAgICAgY3VycmVudCBzeXN0ZW0uICBUaGUgZGVmYXVsdCBzZXR0aW5nIGlzICdUcnVlJy4KCiAgICAgICdvcHRpb25hbCcgLS0gaWYgdHJ1ZSwgdGhlIGZlYXR1cmUncyBpbmNsdXNpb24gY2FuIGJlIGNvbnRyb2xsZWQgZnJvbSB0aGUKICAgICAgICAgY29tbWFuZCBsaW5lLCB1c2luZyB0aGUgJy0td2l0aC1YJyBvciAnLS13aXRob3V0LVgnIG9wdGlvbnMuICBJZgogICAgICAgICBmYWxzZSwgdGhlIGZlYXR1cmUncyBpbmNsdXNpb24gc3RhdHVzIGlzIGRldGVybWluZWQgYXV0b21hdGljYWxseSwKICAgICAgICAgYmFzZWQgb24gJ2F2YWlsYWJpbGUnLCAnc3RhbmRhcmQnLCBhbmQgd2hldGhlciBhbnkgb3RoZXIgZmVhdHVyZQogICAgICAgICByZXF1aXJlcyBpdC4gIFRoZSBkZWZhdWx0IHNldHRpbmcgaXMgJ1RydWUnLgoKICAgICAgJ3JlcXVpcmVfZmVhdHVyZXMnIC0tIGEgc3RyaW5nIG9yIHNlcXVlbmNlIG9mIHN0cmluZ3MgbmFtaW5nIGZlYXR1cmVzCiAgICAgICAgIHRoYXQgc2hvdWxkIGFsc28gYmUgaW5jbHVkZWQgaWYgdGhpcyBmZWF0dXJlIGlzIGluY2x1ZGVkLiAgRGVmYXVsdHMgdG8KICAgICAgICAgZW1wdHkgbGlzdC4gIE1heSBhbHNvIGNvbnRhaW4gJ1JlcXVpcmUnIG9iamVjdHMgdGhhdCBzaG91bGQgYmUKICAgICAgICAgYWRkZWQvcmVtb3ZlZCBmcm9tIHRoZSBkaXN0cmlidXRpb24uCgogICAgICAncmVtb3ZlJyAtLSBhIHN0cmluZyBvciBsaXN0IG9mIHN0cmluZ3MgbmFtaW5nIHBhY2thZ2VzIHRvIGJlIHJlbW92ZWQKICAgICAgICAgZnJvbSB0aGUgZGlzdHJpYnV0aW9uIGlmIHRoaXMgZmVhdHVyZSBpcyAqbm90KiBpbmNsdWRlZC4gIElmIHRoZQogICAgICAgICBmZWF0dXJlICppcyogaW5jbHVkZWQsIHRoaXMgYXJndW1lbnQgaXMgaWdub3JlZC4gIFRoaXMgYXJndW1lbnQgZXhpc3RzCiAgICAgICAgIHRvIHN1cHBvcnQgcmVtb3ZpbmcgZmVhdHVyZXMgdGhhdCAiY3Jvc3NjdXQiIGEgZGlzdHJpYnV0aW9uLCBzdWNoIGFzCiAgICAgICAgIGRlZmluaW5nIGEgJ3Rlc3RzJyBmZWF0dXJlIHRoYXQgcmVtb3ZlcyBhbGwgdGhlICd0ZXN0cycgc3VicGFja2FnZXMKICAgICAgICAgcHJvdmlkZWQgYnkgb3RoZXIgZmVhdHVyZXMuICBUaGUgZGVmYXVsdCBmb3IgdGhpcyBhcmd1bWVudCBpcyBhbiBlbXB0eQogICAgICAgICBsaXN0LiAgKE5vdGU6IHRoZSBuYW1lZCBwYWNrYWdlKHMpIG9yIG1vZHVsZXMgbXVzdCBleGlzdCBpbiB0aGUgYmFzZQogICAgICAgICBkaXN0cmlidXRpb24gd2hlbiB0aGUgJ3NldHVwKCknIGZ1bmN0aW9uIGlzIGluaXRpYWxseSBjYWxsZWQuKQoKICAgICAgb3RoZXIga2V5d29yZHMgLS0gYW55IG90aGVyIGtleXdvcmQgYXJndW1lbnRzIGFyZSBzYXZlZCwgYW5kIHBhc3NlZCB0bwogICAgICAgICB0aGUgZGlzdHJpYnV0aW9uJ3MgJ2luY2x1ZGUoKScgYW5kICdleGNsdWRlKCknIG1ldGhvZHMgd2hlbiB0aGUKICAgICAgICAgZmVhdHVyZSBpcyBpbmNsdWRlZCBvciBleGNsdWRlZCwgcmVzcGVjdGl2ZWx5LiAgU28sIGZvciBleGFtcGxlLCB5b3UKICAgICAgICAgY291bGQgcGFzcyAncGFja2FnZXM9WyJhIiwiYiJdJyB0byBjYXVzZSBwYWNrYWdlcyAnYScgYW5kICdiJyB0byBiZQogICAgICAgICBhZGRlZCBvciByZW1vdmVkIGZyb20gdGhlIGRpc3RyaWJ1dGlvbiBhcyBhcHByb3ByaWF0ZS4KCiAgICBBIGZlYXR1cmUgbXVzdCBpbmNsdWRlIGF0IGxlYXN0IG9uZSAncmVxdWlyZXMnLCAncmVtb3ZlJywgb3Igb3RoZXIKICAgIGtleXdvcmQgYXJndW1lbnQuICBPdGhlcndpc2UsIGl0IGNhbid0IGFmZmVjdCB0aGUgZGlzdHJpYnV0aW9uIGluIGFueSB3YXkuCiAgICBOb3RlIGFsc28gdGhhdCB5b3UgY2FuIHN1YmNsYXNzICdGZWF0dXJlJyB0byBjcmVhdGUgeW91ciBvd24gc3BlY2lhbGl6ZWQKICAgIGZlYXR1cmUgdHlwZXMgdGhhdCBtb2RpZnkgdGhlIGRpc3RyaWJ1dGlvbiBpbiBvdGhlciB3YXlzIHdoZW4gaW5jbHVkZWQgb3IKICAgIGV4Y2x1ZGVkLiAgU2VlIHRoZSBkb2NzdHJpbmdzIGZvciB0aGUgdmFyaW91cyBtZXRob2RzIGhlcmUgZm9yIG1vcmUgZGV0YWlsLgogICAgQXNpZGUgZnJvbSB0aGUgbWV0aG9kcywgdGhlIG9ubHkgZmVhdHVyZSBhdHRyaWJ1dGVzIHRoYXQgZGlzdHJpYnV0aW9ucyBsb29rCiAgICBhdCBhcmUgJ2Rlc2NyaXB0aW9uJyBhbmQgJ29wdGlvbmFsJy4KICAgICIiIgoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiB3YXJuX2RlcHJlY2F0ZWQoKToKICAgICAgICBtc2cgPSAoCiAgICAgICAgICAgICJGZWF0dXJlcyBhcmUgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlICIKICAgICAgICAgICAgInZlcnNpb24uIFNlZSBodHRwczovL2dpdGh1Yi5jb20vcHlwYS9zZXR1cHRvb2xzL2lzc3Vlcy82NS4iCiAgICAgICAgKQogICAgICAgIHdhcm5pbmdzLndhcm4obXNnLCBEaXN0RGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTMpCgogICAgZGVmIF9faW5pdF9fKAogICAgICAgICAgICBzZWxmLCBkZXNjcmlwdGlvbiwgc3RhbmRhcmQ9RmFsc2UsIGF2YWlsYWJsZT1UcnVlLAogICAgICAgICAgICBvcHRpb25hbD1UcnVlLCByZXF1aXJlX2ZlYXR1cmVzPSgpLCByZW1vdmU9KCksICoqZXh0cmFzKToKICAgICAgICBzZWxmLndhcm5fZGVwcmVjYXRlZCgpCgogICAgICAgIHNlbGYuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbgogICAgICAgIHNlbGYuc3RhbmRhcmQgPSBzdGFuZGFyZAogICAgICAgIHNlbGYuYXZhaWxhYmxlID0gYXZhaWxhYmxlCiAgICAgICAgc2VsZi5vcHRpb25hbCA9IG9wdGlvbmFsCiAgICAgICAgaWYgaXNpbnN0YW5jZShyZXF1aXJlX2ZlYXR1cmVzLCAoc3RyLCBSZXF1aXJlKSk6CiAgICAgICAgICAgIHJlcXVpcmVfZmVhdHVyZXMgPSByZXF1aXJlX2ZlYXR1cmVzLAoKICAgICAgICBzZWxmLnJlcXVpcmVfZmVhdHVyZXMgPSBbCiAgICAgICAgICAgIHIgZm9yIHIgaW4gcmVxdWlyZV9mZWF0dXJlcyBpZiBpc2luc3RhbmNlKHIsIHN0cikKICAgICAgICBdCiAgICAgICAgZXIgPSBbciBmb3IgciBpbiByZXF1aXJlX2ZlYXR1cmVzIGlmIG5vdCBpc2luc3RhbmNlKHIsIHN0cildCiAgICAgICAgaWYgZXI6CiAgICAgICAgICAgIGV4dHJhc1sncmVxdWlyZV9mZWF0dXJlcyddID0gZXIKCiAgICAgICAgaWYgaXNpbnN0YW5jZShyZW1vdmUsIHN0cik6CiAgICAgICAgICAgIHJlbW92ZSA9IHJlbW92ZSwKICAgICAgICBzZWxmLnJlbW92ZSA9IHJlbW92ZQogICAgICAgIHNlbGYuZXh0cmFzID0gZXh0cmFzCgogICAgICAgIGlmIG5vdCByZW1vdmUgYW5kIG5vdCByZXF1aXJlX2ZlYXR1cmVzIGFuZCBub3QgZXh0cmFzOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAogICAgICAgICAgICAgICAgIkZlYXR1cmUgJXM6IG11c3QgZGVmaW5lICdyZXF1aXJlX2ZlYXR1cmVzJywgJ3JlbW92ZScsIG9yICIKICAgICAgICAgICAgICAgICJhdCBsZWFzdCBvbmUgb2YgJ3BhY2thZ2VzJywgJ3B5X21vZHVsZXMnLCBldGMuIgogICAgICAgICAgICApCgogICAgZGVmIGluY2x1ZGVfYnlfZGVmYXVsdChzZWxmKToKICAgICAgICAiIiJTaG91bGQgdGhpcyBmZWF0dXJlIGJlIGluY2x1ZGVkIGJ5IGRlZmF1bHQ/IiIiCiAgICAgICAgcmV0dXJuIHNlbGYuYXZhaWxhYmxlIGFuZCBzZWxmLnN0YW5kYXJkCgogICAgZGVmIGluY2x1ZGVfaW4oc2VsZiwgZGlzdCk6CiAgICAgICAgIiIiRW5zdXJlIGZlYXR1cmUgYW5kIGl0cyByZXF1aXJlbWVudHMgYXJlIGluY2x1ZGVkIGluIGRpc3RyaWJ1dGlvbgoKICAgICAgICBZb3UgbWF5IG92ZXJyaWRlIHRoaXMgaW4gYSBzdWJjbGFzcyB0byBwZXJmb3JtIGFkZGl0aW9uYWwgb3BlcmF0aW9ucyBvbgogICAgICAgIHRoZSBkaXN0cmlidXRpb24uICBOb3RlIHRoYXQgdGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZQogICAgICAgIHBlciBmZWF0dXJlLCBhbmQgc28gc2hvdWxkIGJlIGlkZW1wb3RlbnQuCgogICAgICAgICIiIgoKICAgICAgICBpZiBub3Qgc2VsZi5hdmFpbGFibGU6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IoCiAgICAgICAgICAgICAgICBzZWxmLmRlc2NyaXB0aW9uICsgIiBpcyByZXF1aXJlZCwgIgogICAgICAgICAgICAgICAgImJ1dCBpcyBub3QgYXZhaWxhYmxlIG9uIHRoaXMgcGxhdGZvcm0iCiAgICAgICAgICAgICkKCiAgICAgICAgZGlzdC5pbmNsdWRlKCoqc2VsZi5leHRyYXMpCgogICAgICAgIGZvciBmIGluIHNlbGYucmVxdWlyZV9mZWF0dXJlczoKICAgICAgICAgICAgZGlzdC5pbmNsdWRlX2ZlYXR1cmUoZikKCiAgICBkZWYgZXhjbHVkZV9mcm9tKHNlbGYsIGRpc3QpOgogICAgICAgICIiIkVuc3VyZSBmZWF0dXJlIGlzIGV4Y2x1ZGVkIGZyb20gZGlzdHJpYnV0aW9uCgogICAgICAgIFlvdSBtYXkgb3ZlcnJpZGUgdGhpcyBpbiBhIHN1YmNsYXNzIHRvIHBlcmZvcm0gYWRkaXRpb25hbCBvcGVyYXRpb25zIG9uCiAgICAgICAgdGhlIGRpc3RyaWJ1dGlvbi4gIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGF0IG1vc3Qgb25jZSBwZXIKICAgICAgICBmZWF0dXJlLCBhbmQgb25seSBhZnRlciBhbGwgaW5jbHVkZWQgZmVhdHVyZXMgaGF2ZSBiZWVuIGFza2VkIHRvCiAgICAgICAgaW5jbHVkZSB0aGVtc2VsdmVzLgogICAgICAgICIiIgoKICAgICAgICBkaXN0LmV4Y2x1ZGUoKipzZWxmLmV4dHJhcykKCiAgICAgICAgaWYgc2VsZi5yZW1vdmU6CiAgICAgICAgICAgIGZvciBpdGVtIGluIHNlbGYucmVtb3ZlOgogICAgICAgICAgICAgICAgZGlzdC5leGNsdWRlX3BhY2thZ2UoaXRlbSkKCiAgICBkZWYgdmFsaWRhdGUoc2VsZiwgZGlzdCk6CiAgICAgICAgIiIiVmVyaWZ5IHRoYXQgZmVhdHVyZSBtYWtlcyBzZW5zZSBpbiBjb250ZXh0IG9mIGRpc3RyaWJ1dGlvbgoKICAgICAgICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIGRpc3RyaWJ1dGlvbiBqdXN0IGJlZm9yZSBpdCBwYXJzZXMgaXRzCiAgICAgICAgY29tbWFuZCBsaW5lLiAgSXQgY2hlY2tzIHRvIGVuc3VyZSB0aGF0IHRoZSAncmVtb3ZlJyBhdHRyaWJ1dGUsIGlmIGFueSwKICAgICAgICBjb250YWlucyBvbmx5IHZhbGlkIHBhY2thZ2UvbW9kdWxlIG5hbWVzIHRoYXQgYXJlIHByZXNlbnQgaW4gdGhlIGJhc2UKICAgICAgICBkaXN0cmlidXRpb24gd2hlbiAnc2V0dXAoKScgaXMgY2FsbGVkLiAgWW91IG1heSBvdmVycmlkZSBpdCBpbiBhCiAgICAgICAgc3ViY2xhc3MgdG8gcGVyZm9ybSBhbnkgb3RoZXIgcmVxdWlyZWQgdmFsaWRhdGlvbiBvZiB0aGUgZmVhdHVyZQogICAgICAgIGFnYWluc3QgYSB0YXJnZXQgZGlzdHJpYnV0aW9uLgogICAgICAgICIiIgoKICAgICAgICBmb3IgaXRlbSBpbiBzZWxmLnJlbW92ZToKICAgICAgICAgICAgaWYgbm90IGRpc3QuaGFzX2NvbnRlbnRzX2ZvcihpdGVtKToKICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgIiVzIHdhbnRzIHRvIGJlIGFibGUgdG8gcmVtb3ZlICVzLCBidXQgdGhlIGRpc3RyaWJ1dGlvbiIKICAgICAgICAgICAgICAgICAgICAiIGRvZXNuJ3QgY29udGFpbiBhbnkgcGFja2FnZXMgb3IgbW9kdWxlcyB1bmRlciAlcyIKICAgICAgICAgICAgICAgICAgICAlIChzZWxmLmRlc2NyaXB0aW9uLCBpdGVtLCBpdGVtKQogICAgICAgICAgICAgICAgKQoKCmNsYXNzIERpc3REZXByZWNhdGlvbldhcm5pbmcoU2V0dXB0b29sc0RlcHJlY2F0aW9uV2FybmluZyk6CiAgICAiIiJDbGFzcyBmb3Igd2FybmluZyBhYm91dCBkZXByZWNhdGlvbnMgaW4gZGlzdCBpbgogICAgc2V0dXB0b29scy4gTm90IGlnbm9yZWQgYnkgZGVmYXVsdCwgdW5saWtlIERlcHJlY2F0aW9uV2FybmluZy4iIiIKUEsDBBQAAAAAAAAAIQC7/1HmDAIAAAwCAAA5AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvZXJyb3JzLnB5IiIic2V0dXB0b29scy5lcnJvcnMKClByb3ZpZGVzIGV4Y2VwdGlvbnMgdXNlZCBieSBzZXR1cHRvb2xzIG1vZHVsZXMuCiIiIgoKZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNFcnJvcgoKCmNsYXNzIFJlbW92ZWRDb21tYW5kRXJyb3IoRGlzdHV0aWxzRXJyb3IsIFJ1bnRpbWVFcnJvcik6CiAgICAiIiJFcnJvciB1c2VkIGZvciBjb21tYW5kcyB0aGF0IGhhdmUgYmVlbiByZW1vdmVkIGluIHNldHVwdG9vbHMuCgogICAgU2luY2UgYGBzZXR1cHRvb2xzYGAgaXMgYnVpbHQgb24gYGBkaXN0dXRpbHNgYCwgc2ltcGx5IHJlbW92aW5nIGEgY29tbWFuZAogICAgZnJvbSBgYHNldHVwdG9vbHNgYCB3aWxsIG1ha2UgdGhlIGJlaGF2aW9yIGZhbGwgYmFjayB0byBgYGRpc3R1dGlsc2BgOyB0aGlzCiAgICBlcnJvciBpcyByYWlzZWQgaWYgYSBjb21tYW5kIGV4aXN0cyBpbiBgYGRpc3R1dGlsc2BgIGJ1dCBoYXMgYmVlbiBhY3RpdmVseQogICAgcmVtb3ZlZCBpbiBgYHNldHVwdG9vbHNgYC4KICAgICIiIgpQSwMEFAAAAAAAAAAhALmqke7BBgAAwQYAADwAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9leHRlbnNpb24ucHlpbXBvcnQgcmUKaW1wb3J0IGZ1bmN0b29scwppbXBvcnQgZGlzdHV0aWxzLmNvcmUKaW1wb3J0IGRpc3R1dGlscy5lcnJvcnMKaW1wb3J0IGRpc3R1dGlscy5leHRlbnNpb24KCmZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4Lm1vdmVzIGltcG9ydCBtYXAKCmZyb20gLm1vbmtleSBpbXBvcnQgZ2V0X3VucGF0Y2hlZAoKCmRlZiBfaGF2ZV9jeXRob24oKToKICAgICIiIgogICAgUmV0dXJuIFRydWUgaWYgQ3l0aG9uIGNhbiBiZSBpbXBvcnRlZC4KICAgICIiIgogICAgY3l0aG9uX2ltcGwgPSAnQ3l0aG9uLkRpc3R1dGlscy5idWlsZF9leHQnCiAgICB0cnk6CiAgICAgICAgIyBmcm9tIChjeXRob25faW1wbCkgaW1wb3J0IGJ1aWxkX2V4dAogICAgICAgIF9faW1wb3J0X18oY3l0aG9uX2ltcGwsIGZyb21saXN0PVsnYnVpbGRfZXh0J10pLmJ1aWxkX2V4dAogICAgICAgIHJldHVybiBUcnVlCiAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgIHBhc3MKICAgIHJldHVybiBGYWxzZQoKCiMgZm9yIGNvbXBhdGliaWxpdHkKaGF2ZV9weXJleCA9IF9oYXZlX2N5dGhvbgoKX0V4dGVuc2lvbiA9IGdldF91bnBhdGNoZWQoZGlzdHV0aWxzLmNvcmUuRXh0ZW5zaW9uKQoKCmNsYXNzIEV4dGVuc2lvbihfRXh0ZW5zaW9uKToKICAgICIiIkV4dGVuc2lvbiB0aGF0IHVzZXMgJy5jJyBmaWxlcyBpbiBwbGFjZSBvZiAnLnB5eCcgZmlsZXMiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgc291cmNlcywgKmFyZ3MsICoqa3cpOgogICAgICAgICMgVGhlICphcmdzIGlzIG5lZWRlZCBmb3IgY29tcGF0aWJpbGl0eSBhcyBjYWxscyBtYXkgdXNlIHBvc2l0aW9uYWwKICAgICAgICAjIGFyZ3VtZW50cy4gcHlfbGltaXRlZF9hcGkgbWF5IGJlIHNldCBvbmx5IHZpYSBrZXl3b3JkLgogICAgICAgIHNlbGYucHlfbGltaXRlZF9hcGkgPSBrdy5wb3AoInB5X2xpbWl0ZWRfYXBpIiwgRmFsc2UpCiAgICAgICAgX0V4dGVuc2lvbi5fX2luaXRfXyhzZWxmLCBuYW1lLCBzb3VyY2VzLCAqYXJncywgKiprdykKCiAgICBkZWYgX2NvbnZlcnRfcHl4X3NvdXJjZXNfdG9fbGFuZyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXBsYWNlIHNvdXJjZXMgd2l0aCAucHl4IGV4dGVuc2lvbnMgdG8gc291cmNlcyB3aXRoIHRoZSB0YXJnZXQKICAgICAgICBsYW5ndWFnZSBleHRlbnNpb24uIFRoaXMgbWVjaGFuaXNtIGFsbG93cyBsYW5ndWFnZSBhdXRob3JzIHRvIHN1cHBseQogICAgICAgIHByZS1jb252ZXJ0ZWQgc291cmNlcyBidXQgdG8gcHJlZmVyIHRoZSAucHl4IHNvdXJjZXMuCiAgICAgICAgIiIiCiAgICAgICAgaWYgX2hhdmVfY3l0aG9uKCk6CiAgICAgICAgICAgICMgdGhlIGJ1aWxkIGhhcyBDeXRob24sIHNvIGFsbG93IGl0IHRvIGNvbXBpbGUgdGhlIC5weXggZmlsZXMKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgbGFuZyA9IHNlbGYubGFuZ3VhZ2Ugb3IgJycKICAgICAgICB0YXJnZXRfZXh0ID0gJy5jcHAnIGlmIGxhbmcubG93ZXIoKSA9PSAnYysrJyBlbHNlICcuYycKICAgICAgICBzdWIgPSBmdW5jdG9vbHMucGFydGlhbChyZS5zdWIsICcucHl4JCcsIHRhcmdldF9leHQpCiAgICAgICAgc2VsZi5zb3VyY2VzID0gbGlzdChtYXAoc3ViLCBzZWxmLnNvdXJjZXMpKQoKCmNsYXNzIExpYnJhcnkoRXh0ZW5zaW9uKToKICAgICIiIkp1c3QgbGlrZSBhIHJlZ3VsYXIgRXh0ZW5zaW9uLCBidXQgYnVpbHQgYXMgYSBsaWJyYXJ5IGluc3RlYWQiIiIKUEsDBBQAAAAAAAAAIQDHJGyT0gkAANIJAABCAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvZXh0ZXJuL19faW5pdF9fLnB5aW1wb3J0IHN5cwoKCmNsYXNzIFZlbmRvckltcG9ydGVyOgogICAgIiIiCiAgICBBIFBFUCAzMDIgbWV0YSBwYXRoIGltcG9ydGVyIGZvciBmaW5kaW5nIG9wdGlvbmFsbHktdmVuZG9yZWQKICAgIG9yIG90aGVyd2lzZSBuYXR1cmFsbHktaW5zdGFsbGVkIHBhY2thZ2VzIGZyb20gcm9vdF9uYW1lLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHJvb3RfbmFtZSwgdmVuZG9yZWRfbmFtZXM9KCksIHZlbmRvcl9wa2c9Tm9uZSk6CiAgICAgICAgc2VsZi5yb290X25hbWUgPSByb290X25hbWUKICAgICAgICBzZWxmLnZlbmRvcmVkX25hbWVzID0gc2V0KHZlbmRvcmVkX25hbWVzKQogICAgICAgIHNlbGYudmVuZG9yX3BrZyA9IHZlbmRvcl9wa2cgb3Igcm9vdF9uYW1lLnJlcGxhY2UoJ2V4dGVybicsICdfdmVuZG9yJykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBzZWFyY2hfcGF0aChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBTZWFyY2ggZmlyc3QgdGhlIHZlbmRvciBwYWNrYWdlIHRoZW4gYXMgYSBuYXR1cmFsIHBhY2thZ2UuCiAgICAgICAgIiIiCiAgICAgICAgeWllbGQgc2VsZi52ZW5kb3JfcGtnICsgJy4nCiAgICAgICAgeWllbGQgJycKCiAgICBkZWYgZmluZF9tb2R1bGUoc2VsZiwgZnVsbG5hbWUsIHBhdGg9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIHNlbGYgd2hlbiBmdWxsbmFtZSBzdGFydHMgd2l0aCByb290X25hbWUgYW5kIHRoZQogICAgICAgIHRhcmdldCBtb2R1bGUgaXMgb25lIHZlbmRvcmVkIHRocm91Z2ggdGhpcyBpbXBvcnRlci4KICAgICAgICAiIiIKICAgICAgICByb290LCBiYXNlLCB0YXJnZXQgPSBmdWxsbmFtZS5wYXJ0aXRpb24oc2VsZi5yb290X25hbWUgKyAnLicpCiAgICAgICAgaWYgcm9vdDoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgaWYgbm90IGFueShtYXAodGFyZ2V0LnN0YXJ0c3dpdGgsIHNlbGYudmVuZG9yZWRfbmFtZXMpKToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgbG9hZF9tb2R1bGUoc2VsZiwgZnVsbG5hbWUpOgogICAgICAgICIiIgogICAgICAgIEl0ZXJhdGUgb3ZlciB0aGUgc2VhcmNoIHBhdGggdG8gbG9jYXRlIGFuZCBsb2FkIGZ1bGxuYW1lLgogICAgICAgICIiIgogICAgICAgIHJvb3QsIGJhc2UsIHRhcmdldCA9IGZ1bGxuYW1lLnBhcnRpdGlvbihzZWxmLnJvb3RfbmFtZSArICcuJykKICAgICAgICBmb3IgcHJlZml4IGluIHNlbGYuc2VhcmNoX3BhdGg6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGV4dGFudCA9IHByZWZpeCArIHRhcmdldAogICAgICAgICAgICAgICAgX19pbXBvcnRfXyhleHRhbnQpCiAgICAgICAgICAgICAgICBtb2QgPSBzeXMubW9kdWxlc1tleHRhbnRdCiAgICAgICAgICAgICAgICBzeXMubW9kdWxlc1tmdWxsbmFtZV0gPSBtb2QKICAgICAgICAgICAgICAgICMgbXlzdGVyaW91cyBoYWNrOgogICAgICAgICAgICAgICAgIyBSZW1vdmUgdGhlIHJlZmVyZW5jZSB0byB0aGUgZXh0YW50IHBhY2thZ2UvbW9kdWxlCiAgICAgICAgICAgICAgICAjIG9uIGxhdGVyIFB5dGhvbiB2ZXJzaW9ucyB0byBjYXVzZSByZWxhdGl2ZSBpbXBvcnRzCiAgICAgICAgICAgICAgICAjIGluIHRoZSB2ZW5kb3IgcGFja2FnZSB0byByZXNvbHZlIHRoZSBzYW1lIG1vZHVsZXMKICAgICAgICAgICAgICAgICMgYXMgdGhvc2UgZ29pbmcgdGhyb3VnaCB0aGlzIGltcG9ydGVyLgogICAgICAgICAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mbyA+PSAoMywgKToKICAgICAgICAgICAgICAgICAgICBkZWwgc3lzLm1vZHVsZXNbZXh0YW50XQogICAgICAgICAgICAgICAgcmV0dXJuIG1vZAogICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoCiAgICAgICAgICAgICAgICAiVGhlICd7dGFyZ2V0fScgcGFja2FnZSBpcyByZXF1aXJlZDsgIgogICAgICAgICAgICAgICAgIm5vcm1hbGx5IHRoaXMgaXMgYnVuZGxlZCB3aXRoIHRoaXMgcGFja2FnZSBzbyBpZiB5b3UgZ2V0ICIKICAgICAgICAgICAgICAgICJ0aGlzIHdhcm5pbmcsIGNvbnN1bHQgdGhlIHBhY2thZ2VyIG9mIHlvdXIgIgogICAgICAgICAgICAgICAgImRpc3RyaWJ1dGlvbi4iLmZvcm1hdCgqKmxvY2FscygpKQogICAgICAgICAgICApCgogICAgZGVmIGluc3RhbGwoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgSW5zdGFsbCB0aGlzIGltcG9ydGVyIGludG8gc3lzLm1ldGFfcGF0aCBpZiBub3QgYWxyZWFkeSBwcmVzZW50LgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYgbm90IGluIHN5cy5tZXRhX3BhdGg6CiAgICAgICAgICAgIHN5cy5tZXRhX3BhdGguYXBwZW5kKHNlbGYpCgoKbmFtZXMgPSAnc2l4JywgJ3BhY2thZ2luZycsICdweXBhcnNpbmcnLCAnb3JkZXJlZF9zZXQnLApWZW5kb3JJbXBvcnRlcihfX25hbWVfXywgbmFtZXMsICdzZXR1cHRvb2xzLl92ZW5kb3InKS5pbnN0YWxsKCkKUEsDBBQAAAAAAAAAIQCOyE9r3BMAANwTAAA3AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvZ2xvYi5weSIiIgpGaWxlbmFtZSBnbG9iYmluZyB1dGlsaXR5LiBNb3N0bHkgYSBjb3B5IG9mIGBnbG9iYCBmcm9tIFB5dGhvbiAzLjUuCgpDaGFuZ2VzIGluY2x1ZGU6CiAqIGB5aWVsZCBmcm9tYCBhbmQgUEVQMzEwMiBgKmAgcmVtb3ZlZC4KICogSGlkZGVuIGZpbGVzIGFyZSBub3QgaWdub3JlZC4KIiIiCgppbXBvcnQgb3MKaW1wb3J0IHJlCmltcG9ydCBmbm1hdGNoCgpfX2FsbF9fID0gWyJnbG9iIiwgImlnbG9iIiwgImVzY2FwZSJdCgoKZGVmIGdsb2IocGF0aG5hbWUsIHJlY3Vyc2l2ZT1GYWxzZSk6CiAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIHBhdGhzIG1hdGNoaW5nIGEgcGF0aG5hbWUgcGF0dGVybi4KCiAgICBUaGUgcGF0dGVybiBtYXkgY29udGFpbiBzaW1wbGUgc2hlbGwtc3R5bGUgd2lsZGNhcmRzIGEgbGEKICAgIGZubWF0Y2guIEhvd2V2ZXIsIHVubGlrZSBmbm1hdGNoLCBmaWxlbmFtZXMgc3RhcnRpbmcgd2l0aCBhCiAgICBkb3QgYXJlIHNwZWNpYWwgY2FzZXMgdGhhdCBhcmUgbm90IG1hdGNoZWQgYnkgJyonIGFuZCAnPycKICAgIHBhdHRlcm5zLgoKICAgIElmIHJlY3Vyc2l2ZSBpcyB0cnVlLCB0aGUgcGF0dGVybiAnKionIHdpbGwgbWF0Y2ggYW55IGZpbGVzIGFuZAogICAgemVybyBvciBtb3JlIGRpcmVjdG9yaWVzIGFuZCBzdWJkaXJlY3Rvcmllcy4KICAgICIiIgogICAgcmV0dXJuIGxpc3QoaWdsb2IocGF0aG5hbWUsIHJlY3Vyc2l2ZT1yZWN1cnNpdmUpKQoKCmRlZiBpZ2xvYihwYXRobmFtZSwgcmVjdXJzaXZlPUZhbHNlKToKICAgICIiIlJldHVybiBhbiBpdGVyYXRvciB3aGljaCB5aWVsZHMgdGhlIHBhdGhzIG1hdGNoaW5nIGEgcGF0aG5hbWUgcGF0dGVybi4KCiAgICBUaGUgcGF0dGVybiBtYXkgY29udGFpbiBzaW1wbGUgc2hlbGwtc3R5bGUgd2lsZGNhcmRzIGEgbGEKICAgIGZubWF0Y2guIEhvd2V2ZXIsIHVubGlrZSBmbm1hdGNoLCBmaWxlbmFtZXMgc3RhcnRpbmcgd2l0aCBhCiAgICBkb3QgYXJlIHNwZWNpYWwgY2FzZXMgdGhhdCBhcmUgbm90IG1hdGNoZWQgYnkgJyonIGFuZCAnPycKICAgIHBhdHRlcm5zLgoKICAgIElmIHJlY3Vyc2l2ZSBpcyB0cnVlLCB0aGUgcGF0dGVybiAnKionIHdpbGwgbWF0Y2ggYW55IGZpbGVzIGFuZAogICAgemVybyBvciBtb3JlIGRpcmVjdG9yaWVzIGFuZCBzdWJkaXJlY3Rvcmllcy4KICAgICIiIgogICAgaXQgPSBfaWdsb2IocGF0aG5hbWUsIHJlY3Vyc2l2ZSkKICAgIGlmIHJlY3Vyc2l2ZSBhbmQgX2lzcmVjdXJzaXZlKHBhdGhuYW1lKToKICAgICAgICBzID0gbmV4dChpdCkgICMgc2tpcCBlbXB0eSBzdHJpbmcKICAgICAgICBhc3NlcnQgbm90IHMKICAgIHJldHVybiBpdAoKCmRlZiBfaWdsb2IocGF0aG5hbWUsIHJlY3Vyc2l2ZSk6CiAgICBkaXJuYW1lLCBiYXNlbmFtZSA9IG9zLnBhdGguc3BsaXQocGF0aG5hbWUpCiAgICBpZiBub3QgaGFzX21hZ2ljKHBhdGhuYW1lKToKICAgICAgICBpZiBiYXNlbmFtZToKICAgICAgICAgICAgaWYgb3MucGF0aC5sZXhpc3RzKHBhdGhuYW1lKToKICAgICAgICAgICAgICAgIHlpZWxkIHBhdGhuYW1lCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBQYXR0ZXJucyBlbmRpbmcgd2l0aCBhIHNsYXNoIHNob3VsZCBtYXRjaCBvbmx5IGRpcmVjdG9yaWVzCiAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZGlybmFtZSk6CiAgICAgICAgICAgICAgICB5aWVsZCBwYXRobmFtZQogICAgICAgIHJldHVybgogICAgaWYgbm90IGRpcm5hbWU6CiAgICAgICAgaWYgcmVjdXJzaXZlIGFuZCBfaXNyZWN1cnNpdmUoYmFzZW5hbWUpOgogICAgICAgICAgICBmb3IgeCBpbiBnbG9iMihkaXJuYW1lLCBiYXNlbmFtZSk6CiAgICAgICAgICAgICAgICB5aWVsZCB4CiAgICAgICAgZWxzZToKICAgICAgICAgICAgZm9yIHggaW4gZ2xvYjEoZGlybmFtZSwgYmFzZW5hbWUpOgogICAgICAgICAgICAgICAgeWllbGQgeAogICAgICAgIHJldHVybgogICAgIyBgb3MucGF0aC5zcGxpdCgpYCByZXR1cm5zIHRoZSBhcmd1bWVudCBpdHNlbGYgYXMgYSBkaXJuYW1lIGlmIGl0IGlzIGEKICAgICMgZHJpdmUgb3IgVU5DIHBhdGguICBQcmV2ZW50IGFuIGluZmluaXRlIHJlY3Vyc2lvbiBpZiBhIGRyaXZlIG9yIFVOQyBwYXRoCiAgICAjIGNvbnRhaW5zIG1hZ2ljIGNoYXJhY3RlcnMgKGkuZS4gcidcXD9cQzonKS4KICAgIGlmIGRpcm5hbWUgIT0gcGF0aG5hbWUgYW5kIGhhc19tYWdpYyhkaXJuYW1lKToKICAgICAgICBkaXJzID0gX2lnbG9iKGRpcm5hbWUsIHJlY3Vyc2l2ZSkKICAgIGVsc2U6CiAgICAgICAgZGlycyA9IFtkaXJuYW1lXQogICAgaWYgaGFzX21hZ2ljKGJhc2VuYW1lKToKICAgICAgICBpZiByZWN1cnNpdmUgYW5kIF9pc3JlY3Vyc2l2ZShiYXNlbmFtZSk6CiAgICAgICAgICAgIGdsb2JfaW5fZGlyID0gZ2xvYjIKICAgICAgICBlbHNlOgogICAgICAgICAgICBnbG9iX2luX2RpciA9IGdsb2IxCiAgICBlbHNlOgogICAgICAgIGdsb2JfaW5fZGlyID0gZ2xvYjAKICAgIGZvciBkaXJuYW1lIGluIGRpcnM6CiAgICAgICAgZm9yIG5hbWUgaW4gZ2xvYl9pbl9kaXIoZGlybmFtZSwgYmFzZW5hbWUpOgogICAgICAgICAgICB5aWVsZCBvcy5wYXRoLmpvaW4oZGlybmFtZSwgbmFtZSkKCgojIFRoZXNlIDIgaGVscGVyIGZ1bmN0aW9ucyBub24tcmVjdXJzaXZlbHkgZ2xvYiBpbnNpZGUgYSBsaXRlcmFsIGRpcmVjdG9yeS4KIyBUaGV5IHJldHVybiBhIGxpc3Qgb2YgYmFzZW5hbWVzLiBgZ2xvYjFgIGFjY2VwdHMgYSBwYXR0ZXJuIHdoaWxlIGBnbG9iMGAKIyB0YWtlcyBhIGxpdGVyYWwgYmFzZW5hbWUgKHNvIGl0IG9ubHkgaGFzIHRvIGNoZWNrIGZvciBpdHMgZXhpc3RlbmNlKS4KCgpkZWYgZ2xvYjEoZGlybmFtZSwgcGF0dGVybik6CiAgICBpZiBub3QgZGlybmFtZToKICAgICAgICBpZiBpc2luc3RhbmNlKHBhdHRlcm4sIGJ5dGVzKToKICAgICAgICAgICAgZGlybmFtZSA9IG9zLmN1cmRpci5lbmNvZGUoJ0FTQ0lJJykKICAgICAgICBlbHNlOgogICAgICAgICAgICBkaXJuYW1lID0gb3MuY3VyZGlyCiAgICB0cnk6CiAgICAgICAgbmFtZXMgPSBvcy5saXN0ZGlyKGRpcm5hbWUpCiAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICByZXR1cm4gW10KICAgIHJldHVybiBmbm1hdGNoLmZpbHRlcihuYW1lcywgcGF0dGVybikKCgpkZWYgZ2xvYjAoZGlybmFtZSwgYmFzZW5hbWUpOgogICAgaWYgbm90IGJhc2VuYW1lOgogICAgICAgICMgYG9zLnBhdGguc3BsaXQoKWAgcmV0dXJucyBhbiBlbXB0eSBiYXNlbmFtZSBmb3IgcGF0aHMgZW5kaW5nIHdpdGggYQogICAgICAgICMgZGlyZWN0b3J5IHNlcGFyYXRvci4gICdxKngvJyBzaG91bGQgbWF0Y2ggb25seSBkaXJlY3Rvcmllcy4KICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGRpcm5hbWUpOgogICAgICAgICAgICByZXR1cm4gW2Jhc2VuYW1lXQogICAgZWxzZToKICAgICAgICBpZiBvcy5wYXRoLmxleGlzdHMob3MucGF0aC5qb2luKGRpcm5hbWUsIGJhc2VuYW1lKSk6CiAgICAgICAgICAgIHJldHVybiBbYmFzZW5hbWVdCiAgICByZXR1cm4gW10KCgojIFRoaXMgaGVscGVyIGZ1bmN0aW9uIHJlY3Vyc2l2ZWx5IHlpZWxkcyByZWxhdGl2ZSBwYXRobmFtZXMgaW5zaWRlIGEgbGl0ZXJhbAojIGRpcmVjdG9yeS4KCgpkZWYgZ2xvYjIoZGlybmFtZSwgcGF0dGVybik6CiAgICBhc3NlcnQgX2lzcmVjdXJzaXZlKHBhdHRlcm4pCiAgICB5aWVsZCBwYXR0ZXJuWzowXQogICAgZm9yIHggaW4gX3JsaXN0ZGlyKGRpcm5hbWUpOgogICAgICAgIHlpZWxkIHgKCgojIFJlY3Vyc2l2ZWx5IHlpZWxkcyByZWxhdGl2ZSBwYXRobmFtZXMgaW5zaWRlIGEgbGl0ZXJhbCBkaXJlY3RvcnkuCmRlZiBfcmxpc3RkaXIoZGlybmFtZSk6CiAgICBpZiBub3QgZGlybmFtZToKICAgICAgICBpZiBpc2luc3RhbmNlKGRpcm5hbWUsIGJ5dGVzKToKICAgICAgICAgICAgZGlybmFtZSA9IG9zLmN1cmRpci5lbmNvZGUoJ0FTQ0lJJykKICAgICAgICBlbHNlOgogICAgICAgICAgICBkaXJuYW1lID0gb3MuY3VyZGlyCiAgICB0cnk6CiAgICAgICAgbmFtZXMgPSBvcy5saXN0ZGlyKGRpcm5hbWUpCiAgICBleGNlcHQgb3MuZXJyb3I6CiAgICAgICAgcmV0dXJuCiAgICBmb3IgeCBpbiBuYW1lczoKICAgICAgICB5aWVsZCB4CiAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihkaXJuYW1lLCB4KSBpZiBkaXJuYW1lIGVsc2UgeAogICAgICAgIGZvciB5IGluIF9ybGlzdGRpcihwYXRoKToKICAgICAgICAgICAgeWllbGQgb3MucGF0aC5qb2luKHgsIHkpCgoKbWFnaWNfY2hlY2sgPSByZS5jb21waWxlKCcoWyo/W10pJykKbWFnaWNfY2hlY2tfYnl0ZXMgPSByZS5jb21waWxlKGInKFsqP1tdKScpCgoKZGVmIGhhc19tYWdpYyhzKToKICAgIGlmIGlzaW5zdGFuY2UocywgYnl0ZXMpOgogICAgICAgIG1hdGNoID0gbWFnaWNfY2hlY2tfYnl0ZXMuc2VhcmNoKHMpCiAgICBlbHNlOgogICAgICAgIG1hdGNoID0gbWFnaWNfY2hlY2suc2VhcmNoKHMpCiAgICByZXR1cm4gbWF0Y2ggaXMgbm90IE5vbmUKCgpkZWYgX2lzcmVjdXJzaXZlKHBhdHRlcm4pOgogICAgaWYgaXNpbnN0YW5jZShwYXR0ZXJuLCBieXRlcyk6CiAgICAgICAgcmV0dXJuIHBhdHRlcm4gPT0gYicqKicKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIHBhdHRlcm4gPT0gJyoqJwoKCmRlZiBlc2NhcGUocGF0aG5hbWUpOgogICAgIiIiRXNjYXBlIGFsbCBzcGVjaWFsIGNoYXJhY3RlcnMuCiAgICAiIiIKICAgICMgRXNjYXBpbmcgaXMgZG9uZSBieSB3cmFwcGluZyBhbnkgb2YgIio/WyIgYmV0d2VlbiBzcXVhcmUgYnJhY2tl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f/w7/om96P3//w+NoggAAION6P3////plggAAIuF6P3//2vACg++yo1ECNCJhej9///pewgAAID6SXRVgPpodESA+mx0GID6dw+FYwgAAIGN8P3//wAIAADpVAgAAIA7bHUWQ4GN8P3//wAQAACJncT9///pOQgAAION8P3//xDpLQgAAION8P3//yDpIQgAAIoDPDZ1HYB7ATR1F0NDgY3w/f//AIAAAImdxP3//+n+BwAAPDN1HYB7ATJ1F0NDgaXw/f///3///4mdxP3//+ndBwAAPGQPhNUHAAA8aQ+EzQcAADxvD4TFBwAAPHUPhL0HAAA8eA+EtQcAADxYD4StBwAAibWU/f//jYWk/f//UA+2wlCJtcj9///oCD0AAFmFwIqF7/3//1l0IouNtP3//4212P3//+ik+///igNDiZ3E/f//hMAPhKT8//+LjbT9//+Ntdj9///ogvv//+lNBwAAD77Cg/hkD4/oAQAAD4R5AgAAg/hTD4/yAAAAD4SAAAAAg+hBdBBISHRYSEh0CEhID4WSBQAAgMIgx4WQ/f//AQAAAIiV7/3//4ON8P3//0A5tej9//+NnfT9//+4AAIAAImd5P3//4mFoP3//w+NSAIAAMeF6P3//wYAAADppQIAAPeF8P3//zAIAAAPhZgAAACBjfD9//8ACAAA6YkAAAD3hfD9//8wCAAAdQqBjfD9//8ACAAAi43o/f//g/n/dQW5////f4PHBPeF8P3//xAIAACJvdz9//+Lf/yJveT9//8PhLEEAAA7/nULoZQSQQCJheT9//+LheT9///Hhcj9//8BAAAA6X8EAACD6FgPhNoCAABISHR5K8EPhCf///9ISA+FngQAAIPHBPeF8P3//xAIAACJvdz9//90MA+3R/xQaAACAACNhfT9//9QjYXg/f//UOhLOwAAg8QQhcB0H8eFwP3//wEAAADrE4pH/IiF9P3//8eF4P3//wEAAACNhfT9//+JheT9///pNQQAAIsHg8cEib3c/f//O8Z0O4tIBDvOdDT3hfD9//8ACAAAD78AiY3k/f//dBSZK8LR+MeFyP3//wEAAADp8AMAAIm1yP3//+nlAwAAoZASQQCJheT9//9Q6MI4AABZ6c4DAACD+HAPj/sBAAAPhOMBAACD+GUPjLwDAACD+GcPjjT+//+D+Gl0cYP4bnQog/hvD4WgAwAA9oXw/f//gMeF4P3//wgAAAB0YYGN8P3//wACAADrVYs3g8cEib3c/f//6Do4AACFwA+EL/r///aF8P3//yB0DGaLhdj9//9miQbrCIuF2P3//4kGx4XA/f//AQAAAOmmBAAAg43w/f//QMeF4P3//woAAACLjfD9///3wQCAAAAPhKkBAACLB4tXBIPHCOnVAQAAdRGA+md1ZceF6P3//wEAAADrWTmF6P3//34GiYXo/f//gb3o/f//owAAAH4/i7Xo/f//gcZdAQAAVugiCwAAipXv/f//WYmFvP3//4XAdBCJheT9//+JtaD9//+L2OsKx4Xo/f//owAAADP2iweDxwiJhYj9//+LR/yJhYz9//+NhaT9//9Q/7WQ/f//D77C/7Xo/f//ib3c/f//UP+1oP3//42FiP3//1NQ/zVYHEEA6EEgAABZ/9CLvfD9//+DxByB54AAAAB0IDm16P3//3UYjYWk/f//UFP/NWQcQQDoEiAAAFn/0FlZgL3v/f//Z3UcO/51GI2FpP3//1BT/zVgHEEA6O0fAABZ/9BZWYA7LXURgY3w/f//AAEAAEOJneT9//9T6QP+///Hhej9//8IAAAAiY24/f//6ySD6HMPhLb8//9ISA+Eif7//4PoAw+FtgEAAMeFuP3//ycAAAD2hfD9//+Ax4Xg/f//EAAAAA+Eaf7//4qFuP3//wRRxoXU/f//MIiF1f3//8eF0P3//wIAAADpRf7///fBABAAAA+FS/7//4PHBPbBIHQYib3c/f//9sFAdAYPv0f86wQPt0f8mesTi0f89sFAdAOZ6wIz0om93P3///bBQHQbO9Z/F3wEO8ZzEffYg9IA99qBjfD9//8AAQAA94Xw/f//AJAAAIvai/h1AjPbg73o/f//AH0Mx4Xo/f//AQAAAOsag6Xw/f//97gAAgAAOYXo/f//fgaJhej9//+LxwvDdQYhhdD9//+NdfOLhej9////jej9//+FwH8Gi8cLw3Qti4Xg/f//mVJQU1fo5DcAAIPBMIP5OYmdoP3//4v4i9p+BgONuP3//4gOTuu9jUXzK8ZG94Xw/f//AAIAAImF4P3//4m15P3//3RhhcB0B4vOgDkwdFb/jeT9//+LjeT9///GATBA6z5JZjkwdAZAQDvOdfQrheT9///R+OsoO/51C6GQEkEAiYXk/f//i4Xk/f//6wdJgDgAdAVAO8519SuF5P3//4mF4P3//4O9wP3//wAPhVwBAACLhfD9//+oQHQyqQABAAB0CcaF1P3//y3rGKgBdAnGhdT9//8r6wuoAnQRxoXU/f//IMeF0P3//wEAAACLncz9//8rneD9//8rndD9///2hfD9//8MdRf/tbT9//+Nhdj9//9TaiDocPX//4PEDP+10P3//4u9tP3//42F2P3//42N1P3//+h29f//9oXw/f//CFl0G/aF8P3//wR1EldTajCNhdj9///oLvX//4PEDIO9yP3//wCLheD9//90ZoXAfmKLteT9//+JhaD9//8Ptwb/jaD9//9QagaNRfRQjYWY/f//RlBG6OU1AACDxBCFwHUoOYWY/f//dCD/tZj9//+Nhdj9//+NTfTo8fT//4O9oP3//wBZdbXrHION2P3////rE4uN5P3//1CNhdj9///oyvT//1mDvdj9//8AfBv2hfD9//8EdBJXU2ogjYXY/f//6IL0//+DxAyDvbz9//8AdBP/tbz9///oCAgAAIOlvP3//wBZi53E/f//igOIhe/9//+EwHQTi42U/f//i73c/f//itDp4fX//4C9sP3//wB0CouFrP3//4NgcP2Lhdj9//+LTfxfXjPNW+ja6///ycOQFitAABcpQABHKUAApSlAAPEpQAD8KUAAQipAAHArQABqVGhY9UAA6GUEAAAz/4l9/I1FnFD/FTTgQADHRfz+////akBqIF5W6HkGAABZWTvHD4QUAgAAo6AqQQCJNZAqQQCNiAAIAADrMMZABACDCP/GQAUKiXgIxkAkAMZAJQrGQCYKiXg4xkA0AIPAQIsNoCpBAIHBAAgAADvBcsxmOX3OD4QKAQAAi0XQO8cPhP8AAACLOI1YBI0EO4lF5L4ACAAAO/58Aov+x0XgAQAAAOtbakBqIOjrBQAAWVmFwHRWi03gjQyNoCpBAIkBgwWQKkEAII2QAAgAAOsqxkAEAIMI/8ZABQqDYAgAgGAkgMZAJQrGQCYKg2A4AMZANACDwECLEQPWO8Jy0v9F4Dk9kCpBAHyd6waLPZAqQQCDZeAAhf9+bYtF5IsIg/n/dFaD+f50UYoDqAF0S6gIdQtR/xVA4EAAhcB0PIt14IvGwfgFg+YfweYGAzSFoCpBAItF5IsAiQaKA4hGBGig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yTlIFI2FHOX//w+UwVCLBv80B4mNIOX///8V4OBAAIXAD4RgAgAAM8k5jSDl//90CITbD4RQAgAA/xXc4EAAi5005f//iYUc5f//M8CJhTzl//85RRAPhkIFAACJhUTl//+KhSfl//+EwA+FZwEAAIoLi7Uo5f//M8CA+QoPlMCJhSDl//+LBgPHg3g4AHQVilA0iFX0iE31g2A4AGoCjUX0UOtLD77BUOjX7P//WYXAdDqLjTTl//8rywNNEDPAQDvID4alAQAAagKNhUDl//9TUOg8KAAAg8QMg/j/D4SxBAAAQ/+FROX//+sbagFTjYVA5f//UOgYKAAAg8QMg/j/D4SNBAAAM8BQUGoFjU30UWoBjY1A5f//UVD/tRzl//9D/4VE5f///xWw4EAAi/CF9g+EXAQAAGoAjYU85f//UFaNRfRQi4Uo5f//iwD/NAf/FZjgQACFwA+EKQQAAIuFROX//4uNMOX//wPBObU85f//iYU45f//D4wVBAAAg70g5f//AA+EzQAAAGoAjYU85f//UGoBjUX0UIuFKOX//4sAxkX0Df80B/8VmOBAAIXAD4TQAwAAg7085f//AQ+MzwMAAP+FMOX///+FOOX//+mDAAAAPAF0BDwCdSEPtzMzyWaD/goPlMFDQ4OFROX//wKJtUDl//+JjSDl//88AXQEPAJ1Uv+1QOX//+glJQAAWWY7hUDl//8PhWgDAACDhTjl//8Cg70g5f//AHQpag1YUImFQOX//+j4JAAAWWY7hUDl//8PhTsDAAD/hTjl////hTDl//+LRRA5hUTl//8Pgvn9///pJwMAAIsOihP/hTjl//+IVA80iw6JRA846Q4DAAAzyYsGA8f2QASAD4S/AgAAi4U05f//iY1A5f//hNsPhcoAAACJhTzl//85TRAPhiADAADrBou1KOX//4uNPOX//4OlROX//wArjTTl//+NhUjl//87TRBzOYuVPOX///+FPOX//4oSQYD6CnUQ/4Uw5f//xgANQP+FROX//4gQQP+FROX//4G9ROX///8TAABywovYjYVI5f//K9hqAI2FLOX//1BTjYVI5f//UIsG/zQH/xWY4EAAhcAPhEICAACLhSzl//8BhTjl//87ww+MOgIAAIuFPOX//yuFNOX//ztFEA+CTP///+kgAgAAiYVE5f//gPsCD4XRAAAAOU0QD4ZNAgAA6waLtSjl//+LjUTl//+DpTzl//8AK4005f//jYVI5f//O00Qc0aLlUTl//+DhUTl//8CD7cSQUFmg/oKdRaDhTDl//8Cag1bZokYQECDhTzl//8Cg4U85f//AmaJEEBAgb085f///hMAAHK1i9iNhUjl//8r2GoAjYUs5f//UFONhUjl//9Qiwb/NAf/FZjgQACFwA+EYgEAAIuFLOX//wGFOOX//zvDD4xaAQAAi4VE5f//K4U05f//O0UQD4I/////6UABAAA5TRAPhnwBAACLjUTl//+DpTzl//8AK4005f//agKNhUj5//9eO00QczyLlUTl//8PtxIBtUTl//8DzmaD+gp1DmoNW2aJGAPGAbU85f//AbU85f//ZokQA8aBvTzl//+oBgAAcr8z9lZWaFUNAACNjfDr//9RjY1I+f//K8GZK8LR+FCLwVBWaOn9AAD/FbDgQACL2DveD4SXAAAAagCNhSzl//9Qi8MrxlCNhDXw6///UIuFKOX//4sA/zQH/xWY4EAAhcB0DAO1LOX//zvef8vrDP8VXOBAAImFQOX//zvef1yLhUTl//8rhTTl//+JhTjl//87RRAPggr////rP2oAjY0s5f//Uf91EP+1NOX///8w/xWY4EAAhcB0FYuFLOX//4OlQOX//wCJhTjl///rDP8VXOBAAImFQOX//4O9OOX//wB1bIO9QOX//wB0LWoFXjm1QOX//3UU6LK2///HAAkAAADourb//4kw6z//tUDl///ovrb//1nrMYu1KOX//4sG9kQHBEB0D4uFNOX//4A4GnUEM8DrJOhytv//xwAcAAAA6Hq2//+DIACDyP/rDIuFOOX//yuFMOX//19bi038M81e6Nid///Jw2oQaPD3QADohLb//4tFCIP4/nUb6D62//+DIADoI7b//8cACQAAAIPI/+mdAAAAM/87x3wIOwWQKkEAciHoFbb//4k46Pu1///HAAkAAABXV1dXV+iDtf//g8QU68mLyMH5BY0cjaAqQQCL8IPmH8HmBosLD75MMQSD4QF0v1DoOSQAAFmJffyLA/ZEMAQBdBb/dRD/dQz/dQjoLvj//4PEDIlF5OsW6Ji1///HAAkAAADooLX//4k4g03k/8dF/P7////oCQAAAItF5OgEtv//w/91COiDJAAAWcNqEGgQ+EAA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jfz//1nrGv91HP91GP91FP91EP91DP91CP8V6OBAAIvwOV30dAn/dfTomLH//1mLRfA7w3QMOUUYdAdQ6IWx//9Zi8aNZeBfXluLTfwzzeiXlf//ycOL/1WL7IPsEP91CI1N8OiRlf///3UojU3w/3Uk/3Ug/3Uc/3UY/3UU/3UQ/3UM6Cj8//+DxCCAffwAdAeLTfiDYXD9ycOL/1WL7FFRoYASQQAzxYlF/KGIKUEAU1Yz21eL+TvDdTqNRfhQM/ZGVmhk6kAAVv8V+OBAAIXAdAiJNYgpQQDrNP8VXOBAAIP4eHUKagJYo4gpQQDrBaGIKUEAg/gCD4TPAAAAO8MPhMcAAACD+AEPhegAAACJXfg5XRh1CIsHi0AEiUUYizXs4EAAM8A5XSBTU/91EA+VwP91DI0ExQEAAABQ/3UY/9aL+Dv7D4SrAAAAfjyB//D//393NI1EPwg9AAQAAHcT6NIfAACLxDvDdBzHAMzMAADrEVDoUOD//1k7w3QJxwDd3QAAg8AIi9iF23RpjQQ/UGoAU+hOkP//g8QMV1P/dRD/dQxqAf91GP/WhcB0Ef91FFBT/3UI/xX44EAAiUX4U+jJ+v//i0X4Wet1M/Y5XRx1CIsHi0AUiUUcOV0YdQiLB4tABIlFGP91HOhBHQAAWYP4/3UEM8DrRztFGHQeU1ONTRBR/3UMUP91GOhpHQAAi/CDxBg783TciXUM/3UU/3UQ/3UM/3UI/3Uc/xX04EAAi/g783QHVuiGr///WYvHjWXsX15bi038M83omJP//8nDi/9Vi+yD7BD/dQiNTfDokpP///91JI1N8P91IP91HP91GP91FP91EP91DOgW/v//g8QcgH38AHQHi034g2Fw/cnDi/9Vi+xWi3UIhfYPhIEBAAD/dgToFq////92COgOr////3YM6Aav////dhDo/q7///92FOj2rv///3YY6O6u////Nujnrv///3Yg6N+u////diTo167///92KOjPrv///3Ys6Meu////djDov67///92NOi3rv///3Yc6K+u////djjop67///92POifrv//g8RA/3ZA6JSu////dkTojK7///92SOiErv///3ZM6Hyu////dlDodK7///92VOhsrv///3ZY6GSu////dlzoXK7///92YOhUrv///3Zk6Eyu////dmjoRK7///92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V+g97///i/BZWTvzdXNX6Ema//+L8IPGA2oBVujtbf//i/iDxAyJffw7+w+ErQAAAGh09EAAVlfoa8P//4PEDIXAdA1TU1NTU+ivaf//g8QU/3UIVlfo2MH//4PEDIXAdA1TU1NTU+iRaf//g8QUjXcCi30I6wo783QEO8Z2Aovwg03w/2ouVuhoCwAAWVmFwHQsU/91/OgUCgAAWVmFwA+F7AAAAP91EP91DP91/Ohg/v//g8QMiUXw6dMAAAD/dfzolpn//4vwg8YFagFW6Dpt//+DxAyJRfg7w3UIg8j/6b0AAAD/dfxWUOi4wv//g8QMhcB0DVNTU1NT6Pxo//+DxBT/dfzoUZn//4v4A334Weh2av//iwCJReyLRfgr9wPwx0X07B9BAItF9P8wVlfocsL//4PEDIXAdA1TU1NTU+i2aP//g8QUU/91+OhdCQAAWVmFwHQPg230BIF99OAfQQB9xOse6CBq////dRCLTez/dQyJCP91+OiU/f//g8QMiUXw/3X46Gxt//+LfQhZOX38dAn/dfzoW23//1mLRfBeX1vJw4v/VYvsg+wYU1ZXM9tqAVNT/3UIiV3wiV306JbG//+JRegjwoPEEIlV7IP4/3RZagJTU/91COh6xv//i8gjyoPEEIP5/3RBi3UMi30QK/Ab+g+IxgAAAH8IO/MPhrwAAAC7ABAAAFNqCP8VNOFAAFD/FWTgQACJRfyFwHUX6GNp///HAAwAAADoWGn//4sAX15bycNoAIAAAP91COiKAQAAWVmJRfiF/3wKfwQ783IEi8PrAovGUP91/P91COisq///g8QMg/j/dDaZK/Ab+ngGf9OF9nfPi3Xw/3X4/3UI6EYBAABZWf91/GoA/xU04UAAUP8VYOBAADPb6YYAAADo82j//4M4BXUL6NZo///HAA0AAACDzv+JdfTrvTv7f3F8BDvzc2tT/3UQ/3UM/3UI6H/F//8jwoPEEIP4/w+ERP////91COib1v//WVD/FTDhQAD32BvA99hImYlF8CPCiVX0g/j/dSnod2j//8cADQAAAOh/aP//i/D/FVzgQACJBot18CN19IP+/w+E9v7//1P/dez/dej/dQjoFMX//yPCg8QQg/j/D4TZ/v//M8Dp2f7//4v/VYvsVot1CFboItb//1mD+P91EOgVaP//xwAJAAAAg8j/601X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eHl6e3x9fn8APQAAAEVuY29kZVBvaW50ZXIAAABLAEUAUgBOAEUATAAzADIALgBEAEwATAAAAAAARGVjb2RlUG9pbnRlcgAAAEZsc0ZyZWUARmxzU2V0VmFsdWUARmxzR2V0VmFsdWUARmxzQWxsb2MAAAAAcnVudGltZSBlcnJvciAAAA0KAABUTE9TUyBlcnJvcg0KAAAAU0lORyBlcnJvcg0KAAAAAERPTUFJTiBlcnJvcg0KAABSNjAzNA0KQW4gYXBwbGljYXRpb24gaGFzIG1hZGUgYW4gYXR0ZW1wdCB0byBsb2FkIHRoZSBDIHJ1bnRpbWUgbGlicmFyeSBpbmNvcnJlY3RseS4KUGxlYXNlIGNvbnRhY3QgdGhlIGFwcGxpY2F0aW9uJ3Mgc3VwcG9ydCB0ZWFtIGZvciBtb3JlIGluZm9ybWF0aW9uLg0KAAAAAAAAUjYwMzMNCi0gQXR0ZW1wdCB0byB1c2UgTVNJTCBjb2RlIGZyb20gdGhpcyBhc3NlbWJseSBkdXJpbmcgbmF0aXZlIGNvZGUgaW5pdGlhbGl6YXRpb24KVGhpcyBpbmRpY2F0ZXMgYSBidWcgaW4geW91ciBhcHBsaWNhdGlvbi4gSXQgaXMgbW9zdCBsaWtlbHkgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIGFuIE1TSUwtY29tcGlsZWQgKC9jbHIpIGZ1bmN0aW9uIGZyb20gYSBuYXRpdmUgY29uc3RydWN0b3Igb3IgZnJvbSBEbGxNYWluLg0KAABSNjAzMg0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBsb2NhbGUgaW5mb3JtYXRpb24NCgAAAAAAAFI2MDMxDQotIEF0dGVtcHQgdG8gaW5pdGlhbGl6ZSB0aGUgQ1JUIG1vcmUgdGhhbiBvbmNlLgpUaGlzIGluZGljYXRlcyBhIGJ1ZyBpbiB5b3VyIGFwcGxpY2F0aW9uLg0KAABSNjAzMA0KLSBDUlQgbm90IGluaXRpYWxpemVkDQoAAFI2MDI4DQotIHVuYWJsZSB0byBpbml0aWFsaXplIGhlYXANCgAAAABSNjAyNw0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBsb3dpbyBpbml0aWFsaXphdGlvbg0KAAAAAFI2MDI2DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIHN0ZGlvIGluaXRpYWxpemF0aW9uDQoAAAAAUjYwMjUNCi0gcHVyZSB2aXJ0dWFsIGZ1bmN0aW9uIGNhbGwNCgAAAFI2MDI0DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIF9vbmV4aXQvYXRleGl0IHRhYmxlDQoAAAAAUjYwMTkNCi0gdW5hYmxlIHRvIG9wZW4gY29uc29sZSBkZXZpY2UNCgAAAABSNjAxOA0KLSB1bmV4cGVjdGVkIGhlYXAgZXJyb3INCgAAAABSNjAxNw0KLSB1bmV4cGVjdGVkIG11bHRpdGhyZWFkIGxvY2sgZXJyb3INCgAAAABSNjAxNg0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciB0aHJlYWQgZGF0YQ0KAA0KVGhpcyBhcHBsaWNhdGlvbiBoYXMgcmVxdWVzdGVkIHRoZSBSdW50aW1lIHRvIHRlcm1pbmF0ZSBpdCBpbiBhbiB1bnVzdWFsIHdheS4KUGxlYXNlIGNvbnRhY3QgdGhlIGFwcGxpY2F0aW9uJ3Mgc3VwcG9ydCB0ZWFtIGZvciBtb3JlIGluZm9ybWF0aW9uLg0KAAAAUjYwMDkNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgZW52aXJvbm1lbnQNCgBSNjAwOA0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBhcmd1bWVudHMNCgAAAFI2MDAyDQotIGZsb2F0aW5nIHBvaW50IHN1cHBvcnQgbm90IGxvYWRlZA0KAAAAAE1pY3Jvc29mdCBWaXN1YWwgQysrIFJ1bnRpbWUgTGlicmFyeQAAAAAKCgAALi4uADxwcm9ncmFtIG5hbWUgdW5rbm93bj4AAFJ1bnRpbWUgRXJyb3IhCgpQcm9ncmFtOiAAAAAAAAAABQAAwAsAAAAAAAAAHQAAwAQAAAAAAAAAlgAAwAQAAAAAAAAAjQAAwAgAAAAAAAAAjgAAwAgAAAAAAAAAjwAAwAgAAAAAAAAAkAAAwAgAAAAAAAAAkQAAwAgAAAAAAAAAkgAAwAgAAAAAAAAAkwAAwAgAAAAAAAAABoCAhoCBgAAAEAOGgIaCgBQFBUVFRYWFhQUAADAwgFCAiAAIACgnOFBXgAAHADcwMFBQiAAAACAogIiAgAAAAGBoYGhoaAgIB3hwcHdwcAgIAAAIAAgABwgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAIAAgACAAIAAgACAAIAAgACgAKAAoACgAKAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIABIABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAIQAhACEAIQAhACEAIQAhACEAIQAEAAQABAAEAAQABAAEACBAIEAgQCBAIEAgQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAEAAQABAAEAAQABAAggCCAIIAggCCAIIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACABAAEAAQABAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgACAAIAAgACAAIAAgACAAIABoACgAKAAoACgAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAASAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACEAIQAhACEAIQAhACEAIQAhACEABAAEAAQ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AAAAAAD+////AAAAANT///8AAAAA/v///wAAAADcGEAAAAAAAP7///8AAAAAyP///wAAAAD+////AAAAALwjQAAAAAAA/v///wAAAACI////AAAAAP7////6JUAA/iVAAP7////AJUAA1CVAAP7///8AAAAAjP///wAAAAD+////aDVAAGw1QAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAEztAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAADhO0AAAAAAAP7///8AAAAAzP///wAAAAD+////AAAAAGs9QAAAAAAAAAAAADc9QAD+////AAAAANT///8AAAAA/v///wAAAADwPkAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAACNAQAAAAAAA/v///wAAAADU////AAAAAP7///9NQUAAaUFAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAABdR0AAAAAAAP7///8AAAAAzP///wAAAAD+////AAAAACtLQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAm05AAAAAAAD+////AAAAANT///8AAAAA/v///wAAAADdUEAA/v///wAAAADsUEAA/v///wAAAADY////AAAAAP7///8AAAAAn1JAAP7///8AAAAAq1JAAP7///8AAAAA1P///wAAAAD+////AAAAAGVZQAAAAAAA/v///wAAAADY////AAAAAP7///8LW0AAH1tAAAAAAAD+////AAAAANj///8AAAAA/v///11bQABhW0AAAAAAAP7///8AAAAAwP///wAAAAD+////AAAAALheQAAAAAAA/v///wAAAADQ////AAAAAP7///9IX0AAX19AAAAAAAD+////AAAAANT///8AAAAA/v///wAAAAC5akAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAMpsQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAznlAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAADegUAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAL+CQAAAAAAA/v///wAAAADM////AAAAAP7///8AAAAAtJVAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAABNmEAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAOShQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAW6ZAAAAAAAD+////AAAAAMj///8AAAAA/v///wAAAAAhqEAAAAAAAAAAAABdp0AA/v///wAAAADQ////AAAAAP7///8AAAAA3K5AAAAAAAD+////AAAAAND///8AAAAA/v///wAAAAD4wkAAAAAAAP7///8AAAAAzP///wAAAAD+////AAAAAJvKQABc+QAAAAAAAAAAAAAWAAEAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnPoAALj6AADO+gAA5PoAAPb6AAAO+wAAJPsAADz7AABU+wAAaPsAAHD7AACC+wAAkPsAAKL7AAC0+wAAxvsAANb7AADk+wAA/PsAABD8AAAk/AAAQPwAAF78AABy/AAAgvwAAI78AACa/AAApvwAAL78AADW/AAA4PwAAOz8AAD+/AAADP0AABj9AAAm/QAAMP0AAED9AABW/QAAYv0AAHL9AACa/QAAtP0AAMz9AADm/QAA/P0AABb+AAAk/gAAMv4AAEz+AABc/gAAcv4AAIz+AACY/gAApv4AALb+AADG/gAA2P4AAOz+AAD8/gAAEv8AACL/AAA0/wAARv8AAFj/AABq/wAAdv8AAIT/AACU/wAAqv8AALr/AADK/wAA2P8AAOr/AAD8/wAAJAABADAAAQBAAAEAUgABAAAAAABSAUdlbmVyYXRlQ29uc29sZUN0cmxFdmVudAAAxgFHZXRFeGl0Q29kZVByb2Nlc3MAAG4EV2FpdEZvclNpbmdsZU9iamVjdACVAENyZWF0ZVByb2Nlc3NBAACvA1NldENvbnNvbGVDdHJsSGFuZGxlcgD1AUdldE1vZHVsZUZpbGVOYW1lQQAA2gBFbnRlckNyaXRpY2FsU2VjdGlvbgAA9AJMZWF2ZUNyaXRpY2FsU2VjdGlvbgAA+gFHZXRNb2R1bGVIYW5kbGVXAAArBFNsZWVwACICR2V0UHJvY0FkZHJlc3MAAAUBRXhpdFByb2Nlc3MAcAFHZXRDb21tYW5kTGluZUEAPAJHZXRTdGFydHVwSW5mb0EA8ANTZXRIYW5kbGVDb3VudAAAPgJHZXRTdGRIYW5kbGUAANgBR2V0RmlsZVR5cGUAvwBEZWxldGVDcml0aWNhbFNlY3Rpb24ANwRUZXJtaW5hdGVQcm9jZXNzAACqAUdldEN1cnJlbnRQcm9jZXNzAEgEVW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyAAAfBFNldFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcgDWAklzRGVidWdnZXJQcmVzZW50AOcBR2V0TGFzdEVycm9yAACmAkhlYXBGcmVlAACiAkhlYXBBbGxvYwBcAUdldENQSW5mbwDFAkludGVybG9ja2VkSW5jcmVtZW50AADBAkludGVybG9ja2VkRGVjcmVtZW50AABTAUdldEFDUAAAFAJHZXRPRU1DUAAA4AJJc1ZhbGlkQ29kZVBhZ2UAPgRUbHNHZXRWYWx1ZQA8BFRsc0FsbG9jAAA/BFRsc1NldFZhbHVlAD0EVGxzRnJlZQD0A1NldExhc3RFcnJvcgAArgFHZXRDdXJyZW50VGhyZWFkSWQAAJcEV3JpdGVGaWxlAPYCTG9hZExpYnJhcnlBAAC6AkluaXRpYWxpemVDcml0aWNhbFNlY3Rpb25BbmRTcGluQ291bnQASwFGcmVlRW52aXJvbm1lbnRTdHJpbmdzQQDAAUdldEVudmlyb25tZW50U3RyaW5ncwBMAUZyZWVFbnZpcm9ubWVudFN0cmluZ3NXAIQEV2lkZUNoYXJUb011bHRpQnl0ZQDCAUdldEVudmlyb25tZW50U3RyaW5nc1cAAKQCSGVhcENyZWF0ZQAAYQRWaXJ0dWFsRnJlZQBZA1F1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyAGoCR2V0VGlja0NvdW50AACrAUdldEN1cnJlbnRQcm9jZXNzSWQAUwJHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZQCaA1J0bFVud2luZACpAkhlYXBSZUFsbG9jAF4EVmlydHVhbEFsbG9jAACEAUdldENvbnNvbGVDUAAAlgFHZXRDb25zb2xlTW9kZQAAQgFGbHVzaEZpbGVCdWZmZXJzAADmAkxDTWFwU3RyaW5nQQAAHwNNdWx0aUJ5dGVUb1dpZGVDaGFyAOgCTENNYXBTdHJpbmdXAABAAkdldFN0cmluZ1R5cGVBAABDAkdldFN0cmluZ1R5cGVXAADpAUdldExvY2FsZUluZm9BAADnA1NldEZpbGVQb2ludGVyAACrAkhlYXBTaXplAABEAENsb3NlSGFuZGxlAIwEV3JpdGVDb25zb2xlQQCaAUdldENvbnNvbGVPdXRwdXRDUAAAlgRXcml0ZUNvbnNvbGVXAAYEU2V0U3RkSGFuZGxlAAB5AENyZWF0ZUZpbGVBAFMAQ29tcGFyZVN0cmluZ0EAAFYAQ29tcGFyZVN0cmluZ1cAANgDU2V0RW52aXJvbm1lbnRWYXJpYWJsZUEAS0VSTkVMMzIuZGxsAABuA1JlYWRGaWxlAADVA1NldEVuZE9mRmlsZQAAJgJHZXRQcm9jZXNzSGVhcAAAygFHZXRGaWxlQXR0cmlidXRlc0EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMArQQAAAAAAwCtBAAEBAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABO5kC7sRm/ROojQAACAAAAbOJAAFziQAD/////gAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAABYAAAACAAAAAgAAAAMAAAACAAAABAAAABgAAAAFAAAADQAAAAYAAAAJAAAABwAAAAwAAAAIAAAADAAAAAkAAAAMAAAACgAAAAcAAAALAAAACAAAAAwAAAAWAAAADQAAABYAAAAPAAAAAgAAABAAAAANAAAAEQAAABIAAAASAAAAAgAAACEAAAANAAAANQAAAAIAAABBAAAADQAAAEMAAAACAAAAUAAAABEAAABSAAAADQAAAFMAAAANAAAAVwAAABYAAABZAAAACwAAAGwAAAANAAAAbQAAACAAAABwAAAAHAAAAHIAAAAJAAAABgAAABYAAACAAAAACgAAAIEAAAAKAAAAggAAAAkAAACDAAAAFgAAAIQAAAANAAAAkQAAACkAAACeAAAADQAAAKEAAAACAAAApAAAAAsAAACnAAAADQAAALcAAAARAAAAzgAAAAIAAADXAAAACwAAABgHAAAMAAAADAAAAAgAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6AAAAAAAAQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5egAAAAAAAEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGgVQQABAgQIpAMAAGCCeYIhAAAAAAAAAKbfAAAAAAAAoaUAAAAAAACBn+D8AAAAAEB+gPwAAAAAqAMAAMGj2qMgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACB/gAAAAAAAED+AAAAAAAAtQMAAMGj2qMgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACB/gAAAAAAAEH+AAAAAAAAtgMAAM+i5KIaAOWi6KJbAAAAAAAAAAAAAAAAAAAAAACB/gAAAAAAAEB+of4AAAAAUQUAAFHaXtogAF/aatoyAAAAAAAAAAAAAAAAAAAAAACB09je4PkAADF+gf4AAAAAbO1AAP7///9DAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQGkEAAAAAAAAAAAAAAAAAkBpBAAAAAAAAAAAAAAAAAJAaQQAAAAAAAAAAAAAAAACQGkEAAAAAAAAAAAAAAAAAkBpBAAAAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAASB1BAAAAAAAAAAAAaOtAAPDvQABw8UAAiBxBAJgaQQABAAAAmBpBAGgVQQD//////////wIAAAD46EAACAAAAMzoQAAJAAAAoOhAAAoAAAAI6EAAEAAAANznQAARAAAArOdAABIAAACI50AAEwAAAFznQAAYAAAAJOdAABkAAAD85kAAGgAAAMTmQAAbAAAAjOZAABwAAABk5kAAHgAAAETmQAAfAAAA4OVAACAAAACo5UAAIQAAALDkQAAiAAAAEORAAHgAAAAA5EAAeQAAAPDjQAB6AAAA4ONAAPwAAADc40AA/wAAAMzjQABemEAAXphAAF6YQABemEAAXphAAF6YQABemEAAXphAAF6YQABemEAAAwAAAAcAAAB4AAAACgAAABAAAAAAAAAAaOtAAGrtQACY80AAlPNAAJDzQACM80AAiPNAAITzQACA80AAePNAAHDzQABo80AAXPNAAFDzQABI80AAPPNAADjzQAA080AAMPNAACzzQAAo80AAJPNAACDzQAAc80AAGPNAABTzQAAQ80AADPNAAATzQAD48kAA8PJAAOjyQAAo80AA4PJAANjyQADQ8kAAxPJAALzyQACw8kAApPJAAKDyQACc8kAAkPJAAHzyQABw8kAACQQAAAEAAAAAAAAAiBxBAC4AAABEHUEAjClBAIwpQQCMKUEAjClBAIwpQQCMKUEAjClBAIwpQQCMKUEAf39/f39/f39IHUEAAQAAAC4AAAABAAAAAAAAAAAAAAADAAAAIAWTGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAACAcAAAAQAAAPDx//8AAAAAUFNUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBEVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQHUEAEB5BAP////8AAAAAAAAAAP////8AAAAAAAAAAP7////+/////////x4AAAA7AAAAWgAAAHgAAACXAAAAtQAAANQAAADzAAAAEQEAADABAABOAQAAbQEAAP////8eAAAAOgAAAFkAAAB3AAAAlgAAALQAAADTAAAA8gAAABABAAAvAQAATQEAAGwBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQICAgICAgICAgICAgICAgIDAwMDAwMDAwAAAAAAAAAAbPRAAGT0QABc9EAAVPRAAAIAAAAAAAAAAAAAAAAAAABQSwMEFAAAAAAAAAAhANgOq/QAJgEAACYBADoAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9ndWktNjQuZXhlTVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2AAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZSBydW4gaW4gRE9TIG1vZGUuDQ0KJAAAAAAAAAAjXqSbZz/KyGc/yshnP8rIQPmxyGQ/yshnP8vIOj/KyNpwXMhjP8rIeW1OyEM/ysh5bV/IbT/KyHltScgJP8rIeW1byGY/yshSaWNoZz/KyAAAAAAAAAAAUEUAAGSGBAAZsYtRAAAAAAAAAADwACMACwIJAADWAAAAbAAAAAAAAMwrAAAAEAAAAAAAQAEAAAAAEAAAAAIAAAUAAgAAAAAABQACAAAAAAAAcAEAAAQAAAAAAAACAACAAAAQAAAAAAAAEAAAAAAAAAAAEAAAAAAAABAAAAAAAAAAAAAAEAAAAAAAAAAAAAAABBEBACgAAAAAAAAAAAAAAABgAQAICgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAACQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALnRleHQAAAD81AAAABAAAADWAAAABAAAAAAAAAAAAAAAAAAAIAAAYC5yZGF0YQAAuCkAAADwAAAAKgAAANoAAAAAAAAAAAAAAAAAAEAAAEAuZGF0YQAAAOQ1AAAAIAEAABYAAAAEAQAAAAAAAAAAAAAAAABAAADALnBkYXRhAAAICgAAAGABAAAMAAAAGgEAAAAAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEiJXCQISIlsJBBIiXQkGEiJfCQgQVRBVUFWSIPsIEyL4UiDyf8zwEmL/LoBAAAA8q5I99GNRAkBSI15/0hjyOhQDAAAM/Yz7Uxj78YAIkiNWAFMi/CF/35lDx+AAAAAAEEPtgwsgPlcdQT/xusngPkidSCF9n4URIvGslxIi8uL/uhqDAAASAPfK/bGA1xI/8PrAjP2QQ+2BCxI/8VI/8NJO+2IQ/98uIX2fhJEi8ayXEiLy4v+6DUMAABIA99Ii2wkSEiLdCRQSIt8JFjGAyLGQwEASItcJEBJi8ZIg8QgQV5BXUFcw8zMzMzMzMzMzEiJXCQYV0iB7GAEAABIiwW8EgEASDPESImEJFAEAABIi9lIi8EPtglIi/qEyXQTkEj/wID5L3UExkD/XIoIhMl17kiNhCRAAQAATI2MJEACAABMjUQkQEiNVCQwSIvLSIlEJCDoTxEAAIB8JDAAD4WuAAAAgHwkQFwPhKMAAABIjYQkQAEAAEyNjCRAAgAATI1EJEBIjVQkMEiLz0iJRCQg6BIRAABIg8n/M8BIjXwkQPKuSI1EJEBI99FI/8hI/8lIA8iAOVx1CEj/yYA5XHQVSI1EJEBIO8hyC8YBAEj/yYA5XHXrTI1EJEBIjVQkMEiNjCRAAwAATIvLSMdEJCAAAAAA6N8NAAC6AQAAALkEAQAA6IwKAABIjZQkQAMAAOsSugEAAAC5BAEAAOhzCgAASIvTQbgEAQAASIvISIv46LsLAABIi8dIi4wkUAQAAEgzzOgIEQAASIucJIAEAABIgcRgBAAAX8PMzMzMzMzMSIlcJAhIiWwkEEiJdCQYSIl8JCBBVEFVQVZIg+wgSIvZSIPJ/zPATIvqSIv7jVAI8q5I99FI/8no9wkAADP/SIvzQYl9AA++C0yL8EUz5EiJGOhlEQAAhcB0FQ8fRAAAD75LAUj/w+hQEQAAhcB18A+2K0j/w0CE7XRbQA++zeg4EQAAhcB0BUWF5HRJQID9XHUE/8fr2UCA/SJ1FkD2xwF1DjPARYXkD5TAQDLtRIvg0f+F/3QSTIvHslxIi87ozAkAAEgD9zP/QITtdKJAiC5I/8brmoX/dBJMi8eyXEiLzuipCQAASAP3M//GBgBB/0UASWNFAEj/xkmJNMZAhO10Jg++C+ixEAAAhcB0EZAPvksBSP/D6KAQAACFwHXwgDsAD4VH////SItcJEBIi2wkSEiLdCRQSIt8JFhJi8ZIg8QgQV5BXUFcw8zMzMzMSIPsKIXJdRKLDYIhAQCFyXQIM9L/FTbcAAC4AQAAAEiDxCjDzMzMzMzMzMzMzMzMSIlcJBBXSIHs4AAAADPAM/9Ii9lIjUwkcESNR2gz0om8JPAAAABIiUQkUEiJRCRYSIlEJGDo1ggAAI1XAUiNDYz////HRCRwaAAAAP8V7tsAAEyNXCRQSI1EJHBMiVwkSEiJRCRASIl8JDhIiXwkMEUzyUUzwEiL0zPJiXwkKMdEJCABAAAA/xWr2wAAhcB1KOj6BQAASI0Vq94AAEiNSGDocgQAADPASIucJPgAAABIgcTgAAAAX8OLRCRgSItMJFCDyv+JBZUgAQD/FV/bAABIi0wkUEiNlCTwAAAA/xVE2wAAhcB1KOijBQAASI0VLN4AAEiNSGDoGwQAADPASIucJPgAAABIgcTgAAAAX8OLhCTwAAAASIucJPgAAABIgcTgAAAAX8PMzMzMzMzMzEiJXCQISIlsJBBIiXQkGFdBVEFVSIPsIEyL6UiDyf8zwLsBAAAASYv9SWPo8q5IO91Ii/JI99FMi8tMjVEBfRpKizzKSIPJ/zPA8q5J/8FI99FEA9FMO8185kljykiL0+gfBwAASI0VzN0AAE2LxUiLyEyL4OgSDwAASIPJ/zPASYv98q5IO91I99FMjWn/fTBMiwTeSWPNSI0Vld0AAEkDzOjlDgAASIs83kiDyf8zwEj/w/KuSPfRRAPpSDvdfNBIi1wkQEiLbCRISIt0JFBJi8RIg8QgQV1BXF/DzMzMQFNXQVZBV0iB7FgCAABIiwW7DQEASDPESImEJDACAABMi/JEiUQkIExj+UiNVCQwQbgAAQAAM8n/FfrZAABIg8n/M8BIjXwkMPKuSPfRSI1EDC9IjUwkMEg7wXYYDx8AgDgudBBIjVQkMMYAAEj/yEg7wnfrxgAAM8BIg8n/SI18JDAz0vKuSIsFOt0AAEiNTCQwSIlH/4sFM90AAIlHB+jXuAAAi9iD+P91IujPAwAATI1EJDBIjRX73AAASI1IYOhCAgAAjUMD6fkBAABIjZQkMAEAAEG4AAEAAIvISImsJJACAADoHa8AAEhjyEiNvAwwAQAAi8voS4gAAEiNlCQwAQAASP/KSP/CSDvXcw8PtgKEwHQIPAp0BDwNdenGAgBIjYwkMAEAAEiNFX/cAABBuAIAAADoJA4AAIXAdCVIiwVZ3AAASI2MJDABAABIiQGLBVDcAACJQQgPtgVK3AAAiEEMSI1UJCRIjYwkMgEAAOj5+v//SI1UJDBIizhIi9hIi8/odvn//0iL6EiFwHUg6OkCAABIjRXa2wAATIvHSI1IYOheAQAAjUUC6Q0BAABIibQkUAIAAIt0JCRMiaQkSAIAAEyJrCRAAgAARY0sN7oIAAAAQY1FAUhjyOjBBAAASIvNTIvg6CL4//+D/gFJiQQkSY18JAh+IEiDwwj/zkiLC+gG+P//SIPHCEiDwwhIg+4BSIlH+HXmSI1MJDDo6vf//7sBAAAASIPHCEk730iJR/h9IQ8fhAAAAAAASYsM3ujH9///SP/DSIPHCEk730iJR/h854N8JCAASIu0JFACAABIxwcAAAAAdCpJi9RIi83ouqUAAOgBAgAASI0V2toAAEiNSGBMi8XodgAAALgCAAAA6xZFi8VJi9RIi83oefz//0iLyOhB+///TIukJEgCAABMi6wkQAIAAEiLrCSQAgAASIuMJDACAABIM8zoiQoAAEiBxFgCAABBX0FeX1vDzMzMzMzMzMzMzMxIixVpHAEAiw1fHAEAQbgBAAAA6fj8//9Ii8RIiVAQSIlICEyJQBhMiUggU1ZXQVRIg+w4SIv5M9uL84vDSDvLD5XAO8N1J+iQJgAAxwAWAAAASIlcJCBFM8lFM8Az0jPJ6KYlAACDyP/pFQEAAIvDSDvTD5XAO8N1J+hdJgAAxwAWAAAASIlcJCBFM8lFM8Az0jPJ6HMlAACDyP/p4gAAAEyNZCRw6PkBAACQ9kcYQA+FlQAAAEiLz+jmIwAAg/j/dCqD+P50JUhj0EiLykjB+QVMjQXHKQEAg+IfSGvSWEkDFMhIjQ0lCgEA6xFIjQ0cCgEASIvRTI0FoikBAPZCOH91JYP4/3Qag/j+dBVIY8hIi8FIwfgFg+EfSGvJWEkDDMD2QTiAdCLoriUAAMcAFgAAAEiJXCQgRTPJRTPAM9IzyejEJAAAg87/O/N1KkiLz+hNEwAAi9hNi8xFM8BIi1QkaEiLz+hgFQAAi/BIi9eLy+gAFAAAkEiLz+izAQAAi8ZIg8Q4QVxfXlvDzMzMSI0FiQUBAMNAU0iD7CCLBVw7AQC7FAAAAIXAdQe4AAIAAOsFO8MPTMNIY8i6CAAAAIkFOTsBAOgEJgAASIkFDSsBAEiFwHUkjVAISIvLiR0cOwEA6OclAABIiQXwKgEASIXAdQe4GgAAAOt4M8lIjRUbBQEASIkUAUiDwjBIg8EISIPrAXQJSIsFwioBAOvlRTPASI0VEgUBAEWNSANJi8hMjRVoKAEASYvASMH4BYPhH0mLBMJIa8lYTIsUAUmD+v90C0mD+v50BU2F0nUGxwL+////Sf/ASIPCMEmD6QF1vDPASIPEIFvDzMxIg+wo6IcpAACAPSQaAQAAdAXoEScAAEiLDUYqAQBIg8Qo6cEmAADMQFNIg+wgSIvZSI0NbAQBAEg72XI6SI0F8AcBAEg72HcuSIvTSLirqqqqqqqqKkgr0Uj36kjB+gNIi8pIwek/jUwREOg8KwAAD7prGA/rCkiNSzD/FVPUAABIg8QgW8PMQFNIg+wgg/kUSIvafQ+DwRDoDisAAA+6axgP6wpIjUow/xUl1AAASIPEIFvDzMzMSIPsKEiNFeEDAQBIO8pyN0iNBWUHAQBIO8h3Kw+6cRgPSCvKSLirqqqqqqqqKkj36UjB+gNIi8pIwek/jUwREOivKQAA6wpIg8Ew/xXT0wAASIPEKMPMzEiD7CiD+RR9Dw+6chgPg8EQ6IYpAADrCkiNSjD/FarTAABIg8Qow8xAU0iD7CCDZCRAAEyNRCRA6KMqAABIi9hIhcB1GzlEJEB0FegAIwAASIXAdAvo9iIAAItMJECJCEiLw0iDxCBbw8zMzMzMzMzMzMzMzMzMzMzMZmYPH4QAAAAAAEiLwUmD+AhyUw+20km5AQEBAQEBAQFJD6/RSYP4QHIeSPfZg+EHdAZMK8FIiRBIA8hNi8hJg+A/ScHpBnU5TYvISYPgB0nB6QN0EWZmZpCQSIkRSIPBCEn/yXX0TYXAdAqIEUj/wUn/yHX2ww8fQABmZmaQZmaQSYH5ABwAAHMwSIkRSIlRCEiJURBIg8FASIlR2EiJUeBJ/8lIiVHoSIlR8EiJUfh12OuUZg8fRAAASA/DEUgPw1EISA/DURBIg8FASA/DUdhID8NR4En/yUgPw1HoSA/DUfBID8NR+HXQ8IAMJADpVP///8zMzMzMzMzMzMzMzGZmDx+EAAAAAABMi9lNC8B0JEgryvbCB3QoigKEwIgEEQ+E4wAAAEj/wkn/yHQH9sIHdebrDEmLw8NIiQQRSIPCCEiLAkmD6AhyJkm5//7+/v7+/n5MA8hMi9BJg/L/TTPRSbkAAQEBAQEBgU2F0XTJSYPACA+EiwAAAITAiAQRD4SEAAAASP/CSf/IdHiE5IgkEXR1SP/CSf/IdGlIwegQhMCIBBF0Ykj/wkn/yHRWhOSIJBF0U0j/wkn/yHRHSMHoEITAiAQRdEBI/8JJ/8h0NITkiCQRdDFI/8JJ/8h0JcHoEITAiAQRdB9I/8JJ/8h0E4TkiCQRdBBI/8JJ/8gPhTz///9Ji8PDSAPKSDPSSYP4EHJF9sEHdApI/8GIEUn/yOvxSYPoIHIZSIkRSIlRCEiJURBIiVEYSIPBIEmD6CBz50mDwCBJg+gIcglIiRFIg8EI6/FJg8AISYPoAXIHiBFI/8Hr80mLw8PMzEBTSIPsIEWLGEiL2kyLyUGD4/hB9gAETIvRdBNBi0AITWNQBPfYTAPRSGPITCPRSWPDSosUEEiLQxCLSAhIA0sI9kEDD3QMD7ZBA4Pg8EiYTAPITDPKSYvJSIPEIFvpmQMAAMxIg+woTYtBOEiLykmL0eiJ////uAEAAABIg8Qow8zMzEiD7DhIi0QkYEiJRCQoTIlMJCBNi8hMi8JIg8r/6AIoAABIg8Q4w8xIiVwkEEyJRCQYVVZXQVRBVUFWQVdIg+wwTIukJKgAAABMi6wkmAAAAEiL+UyL8jPSTYv5i8qJVCRwSDv6dApMO/J1D0w7wnQPuQEAAADpvAEAAEw7wnTxTDvKdQxIOZQkkAAAAHXi6wpIOZQkkAAAAHTWTDvqdQxIOZQkoAAAAHXH6wpIOZQkoAAAAHS7TDvidQxIOZQksAAAAHWs6wpIOZQksAAAAHSguAEAAABIi984E3QLSP/ISP/DSDvCd/GAOzp1LEw78nQhSYP4Aw+COwEAAEG5AgAAAEyLx0iDyv9Ji87oEykAADPSSI17AesITDvydANBiBZIi+pIi/JIi984F3RlD74L6NooAAAz0jvCdAVI/8PrF4oDPC90DTxcdAk8LnUJSIvz6wRIjWsBSP/DOBN1z0g76nQvTDv6dCVMi81MK89MOYwkkAAAAA+GqgAAAEyLx0iDyv9Ji8/omCgAADPSSIv96whMO/p0A0GIF0g78nRRSDv3ckxMO+p0IUyLzkwrz0w5jCSgAAAAdnFMi8dIg8r/SYvN6FsoAAAz0kw74nRQSCveSDmcJLAAAAB2TkyLy0yLxkiDyv9Ji8zoNSgAAOsvTDvqdCFIK99IOZwkoAAAAHYoTIvLTIvHSIPK/0mLzegPKAAAM9JMO+J0BEGIFCQzwOmRAAAAi8rrBItMJHBMi4QkgAAAAEw78nQITDvCdgNBiBZMO/p0DUg5lCSQAAAAdgNBiBdMO+p0Dkg5lCSgAAAAdgRBiFUATDvidA5IOZQksAAAAHYEQYgUJEg7+nUl6F4dAABIg2QkIAC7FgAAAEUzyUUzwDPSM8mJGOhyHAAAi8PrEjvKddfoNR0AALkiAAAAiQiLwUiLXCR4SIPEMEFfQV5BXUFcX15dw8zMzEiJXCQISIl0JBBXSIPsUEmL2EiL+kG4AAEAAEiL8UiLjCSAAAAASIvBSPfYSYvBTRvbTSPYSPfYSIvDTRvSTIlcJEBIiUwkOE0j0Ej32EiLx0gb0kyJVCQwTIlMJChJI9BI99hMi8tNG8BIiVQkIEiL10GD4ANIi87o2vz//0iLXCRgSIt0JGhIg8RQX8PMzMzMzMzMzMzMzMzMzMzMZmYPH4QAAAAAAEg7DWkAAQB1EUjBwRBm98H//3UC88NIwckQ6aEmAADMQFNIg+wgSIvZxkEYAEiF0g+FggAAAOg1NQAASIlDEEiLkMAAAABIiRNIi4i4AAAASIlLCEiLDQULAQBIO9F0FouAyAAAAIUFfAkBAHUI6AkzAABIiQNIiwVjCAEASDlDCHQbSItDEIuIyAAAAIUNVQkBAHUJ6OopAABIiUMISItDEPaAyAAAAAJ1FYOIyAAAAALGQxgB6wjzD28C8w9/AUiLw0iDxCBbw8zMzEBTSIPsQIM9dxkBAABIY9l1EEiLBVsKAQAPtwRYg+AI61ZIjUwkIDPS6Cb///9Ii0QkIIO4DAEAAAF+FkyNRCQguggAAACLy+g3NgAARIvY6xBIi4BAAQAARA+3HFhBg+MIgHwkOAB0DEiLRCQwg6DIAAAA/UGLw0iDxEBbw8zMSIlUJBBMiUQkGEyJTCQgU0iD7GBIhdJ1JegCGwAASINkJCAARTPJRTPAM9IzyccAFgAAAOgXGgAAg8j/61VIhcl01kiJTCRASIlMJDBMjYwkgAAAAEiNTCQwRTPAx0QkOP///3/HRCRIQgAAAOieCgAAg2wkOAGL2HgKSItMJDDGAQDrDEiNVCQwM8nofzYAAIvDSIPEYFvDzMzMzMzMzMzMzMzMzMzMzMxmZg8fhAAAAAAATYXAdHVIK9FMi8pJuwABAQEBAQGB9sEHdB+KAUKKFAlI/8E6wnVXSf/IdE6EwHRKSPfBBwAAAHXhSo0UCWaB4v8PZoH6+A930UiLAUqLFAlIO8J1xUiDwQhJg+gISbr//v7+/v7+fnYRSIPw/0wD0kkzwkmFw3TB6wxIM8DDSBvASIPY/8OE0nQnhPZ0I0jB6hCE0nQbhPZ0F0jB6hCE0nQPhPZ0C8HqEITSdASE9nWISDPAw8zMzEBTSIPsIIvZ6E85AACLy+ggNwAASIsNrf0AAOgwMQAAuf8AAABIg8QgW0j/4MzMzEBTSIPsIIvZSI0Nkc0AAP8V88kAAEiFwHQZSI0Vb80AAEiLyP8V7skAAEiFwHQEi8v/0EiDxCBbw8zMzEBTSIPsIIvZ6Lf///+Ly/8Vz8kAAMzMzLkIAAAA6XIgAADMzLkIAAAA6WYfAADMzEg7ynMtSIlcJAhXSIPsIEiL+kiL2UiLA0iFwHQC/9BIg8MISDvfcu1Ii1wkMEiDxCBfw8xIiVwkCFdIg+wgM8BIi/pIi9lIO8pzF4XAdRNIiwtIhcl0Av/RSIPDCEg733LpSItcJDBIg8QgX8PMzMxIiVwkCFdIg+wgSIM9ih4BAACL2XQYSI0Nfx4BAOgKOwAAhcB0CIvL/xVuHgEA6DU6AABIjRV6ywAASI0NS8sAAOh+////hcB1WkiNDd85AADoijkAAEiNHR/LAABIjT0gywAA6w5IiwNIhcB0Av/QSIPDCEg733LtSIM9Ix4BAAB0H0iNDRoeAQDonToAAIXAdA9FM8AzyUGNUAL/FQIeAQAzwEiLXCQwSIPEIF/DzEiJXCQISIl0JBBEiUQkGFdBVEFVQVZBV0iD7EBFi+CL2kSL+bkIAAAA6BYfAACQgz2eDQEAAQ+E/AAAAMcFig0BAAEAAABEiCV/DQEAhdsPhc8AAABIiw2AHQEA6DMvAABIi/BIiUQkMEiFwA+EnwAAAEiLDVsdAQDoFi8AAEiL+EiJRCQgTIv2SIl0JChMi+hIiUQkOEiD7whIiXwkIEg7/nIM6N8uAABIOQd1AuvmSDv+clxIiw/o1y4AAEiL2OjDLgAASIkH/9NIiw0LHQEA6L4uAABIi9hIiw30HAEA6K8uAABMO/N1BUw76HQgTIvzSIlcJChIi/NIiVwkMEyL6EiJRCQ4SIv4SIlEJCDrhUiNFQzKAABIjQ3tyQAA6Lz9//9IjRUJygAASI0N+skAAOip/f//kEWF5HQKuQgAAADo/RwAAEWF5HUmxwV+DAEAAQAAAEGNTCQI6OQcAABBi8/oDP3//0GLz/8VI8cAAMxIi1wkcEiLdCR4SIPEQEFfQV5BXUFcX8PMzEUzwDPS6Wr+///MzEUzwEGNUAHpXP7//zPSM8lEjUIB6U/+///MzMy6AQAAADPJRIvC6T3+///MQFNIg+wg6LktAABIi8hIi9jo6j0AAEiLy+iiPQAASIvL6A4UAABIi8voij0AAEiLy+h6PQAASIvL6NI6AABIi8vo9jgAAEiLy+jSOAAASI0Nf////+hiLQAASIkF5/kAAEiDxCBbw8xIiVwkEEiJdCQYV0iB7KAAAABIjUwkMP8VW8YAAJC4TVoAAGY5BebV//91YkhjBRnW//9IjTXW1f//SAPGgThQRQAAdAsz24mcJLAAAADrTrkLAgAAZjlIGHQLM9uJnCSwAAAA6ziDuIQAAAAOdwsz24mcJLAAAADrJDPbOZj4AAAAD5XDiZwksAAAAOsQM9uJnCSwAAAASI01ctX//78BAAAAi8/orkMAAIXAdSE5PQwLAQB1Bei5NAAAuRwAAADohzIAALn/AAAA6LX7///oWC8AAIXAdSE5PeIKAQB1BeiPNAAAuRAAAADoXTIAALn/AAAA6Iv7///oHjYAAJDooA8AAIXAeQq5GwAAAOgG+////xVYxQAASIkFeRoBAOiAQQAASIkFhQoBAOh8QAAAhcB5CrkIAAAA6Nr6///oaT0AAIXAeQq5CQAAAOjH+v//i8/ozPv//4XAdAeLyOi1+v//6Mg8AABAhHwkbA+3VCRwQbkKAAAARA9FykyLwDPSSIvO6Gft//+L+IlEJCCF23UHi8joxv3//+jZ/f//6xqL+IO8JLAAAAAAdQiLyOi4/f//zOjO/f//kIvH6wW4/wAAAEyNnCSgAAAASYtbGEmLcyBJi+Nfw8zMzEiD7Cjov0IAAEiDxCjpEv7//8zMSIvESIlYCEiJaBhIiXAgSIlQEFdBVEFVQVZBV0iD7EBNi3kITYshSYtxOE0r5/ZBBGZNi/FIi+pMi+kPhdwAAAAz/0iJSMhMiUDQOT4PhisBAABIjV4Mi0P4TDvgD4KnAAAAi0P8TDvgD4ObAAAAg3sEAA+EkQAAAIM7AXQZiwNIjUwkMEiL1UkDx//QhcAPiIQAAAB+c0GBfQBjc23gdShIgz33GAEAAHQeSI0N7hgBAOipNQAAhcB0DroBAAAASYvN/xXXGAEAi0sEQbgBAAAASIvVSQPP6NNCAABJi0ZAi1METWNNAEiJRCQoSYtGKEkD102LxUiLzUiJRCQg/xWLwwAA6NZCAAD/x0iDwxA7PnNq6T7///8zwOtmSYt5IDPtSSv/OS52VEiNXhCLS/RMO+FyPotD+Ew74HM2SDv5cgxIO/hzB0H2RQQgdS+DOwB0CYsDSDv4dCPrF0iLVCR4SQPHsQFJiQZEi0P8TQPHQf/Q/8VIg8MQOy5ysLgBAAAATI1cJEBJi1swSYtrQEmLc0hJi+NBX0FeQV1BXF/DzMzMSIlcJAhIiXwkEEFUSIPsIEiL2ejoDwAAi8joIUIAAIXAD4SXAAAA6MDs//9Ig8AwSDvYdQQzwOsT6K7s//9Ig8BgSDvYdXe4AQAAAP8FbgcBAPdDGAwBAAB1Y0yNJdIHAQBIY/hJgzz8AHUruQAQAADoShIAAEmJBPxIhcB1GEiNQyBIiUMQSIkDuAIAAACJQySJQwjrGUmLDPzHQyQAEAAAx0MIABAAAEiJSxBIiQuBSxgCEQAAuAEAAADrAjPASItcJDBIi3wkOEiDxCBBXMPMzMyFyXQwU0iD7CAPumIYDEiL2nMcSIvK6MEUAACBYxj/7v//g2MkAEiDIwBIg2MQAEiDxCBbw8zMzEBTSIPsIPZCGEBJi9h0DEiDehAAdQVB/wDrJoNCCP94DUiLAogISP8CD7bB6wgPvsno5iwAAIP4/3UECQPrAv8DSIPEIFvDzIXSfkxIiVwkCEiJbCQQSIl0JBhXSIPsIEmL+UmL8IvaQIrpTIvHSIvWQIrN/8vohf///4M//3QEhdt/50iLXCQwSItsJDhIi3QkQEiDxCBfw8zMzEiJXCQISIlsJBBIiXQkGFdIg+wgQfZAGEBJi/lJi/CL2kiL6XQMSYN4EAB1BUEBEes3hdJ+M4pNAEyLx0iL1v/L6B7///9I/8WDP/91F+g9EAAAgzgqdRFMi8dIi9axP+j//v//hdt/zUiLXCQwSItsJDhIi3QkQEiDxCBfw8zMSIlcJBhVVldBVEFVQVZBV0iB7NACAABIiwX28wAASDPESImEJMgCAAAzwEiL2UiJTCRoSIv6SI1MJHhJi9BNi+mJRCRgRIvgiUQkVESL8IlEJEiJRCRYiUQkUOhk8///RTPSSTvadUHoow8AADPbRTPJRTPAM9IzyccAFgAAAEiJXCQg6LcOAAA4nCSQAAAAdA9Ii4QkiAAAAIOgyAAAAP2DyP/p/QcAAEGDz//2QxhATI0NnM///w+FugAAAEiLy+gSDQAASI0Vd/MAAEE7x3Qog/j+dCNMY8BMjQ1zz///SYvIQYPgH0jB+QVNa8BYTQOEyYBDAQDrCkyLwkyNDVDP//9B9kA4f3UpQTvHdB6D+P50GUhj0EiLwoPiH0jB+AVIa9JYSQOUwYBDAQD2QjiAdEHo1w4AADPbRTPJRTPAM9IzyccAFgAAAEiJXCQg6OsNAAA4nCSQAAAAdA9Ii4QkiAAAAIOgyAAAAP1Bi8fpMQcAAEUz0kk7+nS3QIovQYvyRIlUJEBEiVQkREGL0kyJlCSYAAAAQTrqD4TqBgAASIucJKgAAABBuwACAABI/8dBO/JIibwksAAAAA+MyAYAAI1F4DxYdxJID77FQg++jAjw8wAAg+EP6wNBi8pIY8JIY8lIjRTIQg++lAoQ9AAAwfoEiVQkXIvKQTvSD4R5BwAAg+kBD4SICAAAg+kBD4QvCAAAg+kBD4TrBwAAg+kBD4TaBwAAg+kBD4SgBwAAg+kBD4SXBgAAg/kBD4U8BgAAQA++xYP4ZA+PfgEAAA+EgAIAAIP4QQ+EQAEAAIP4Qw+E0AAAAIP4RQ+ELgEAAIP4Rw+EJQEAAIP4U3Rtg/hYD4TkAQAAg/hadBeD+GEPhBUBAACD+GMPhKcAAADpSAQAAEmLRQBJg8UISTvCdC9Ii1gISTvadCZBD7rkCw+/AHMSmcdEJFABAAAAK8LR+OkSBAAARIlUJFDpCAQAAEiLHU3xAADp8QMAAEH3xDAIAAB1BUEPuuwLSYtdAEU790GLxrn///9/D0TBSYPFCEH3xBAIAAAPhBoBAABJO9rHRCRQAQAAAEgPRB0M8QAASIvL6fIAAABB98QwCAAAdQVBD7rsC0mDxQhB98QQCAAAdCxFD7dN+EiNlCTAAAAASI1MJERNi8Pol0AAAEUz0kE7wnQdx0QkWAEAAADrE0GKRfjHRCREAQAAAIiEJMAAAABIjZwkwAAAAOlNAwAAx0QkcAEAAABAgMUgQYPMQEU78kiNnCTAAAAAQYvzD40tAgAAQb4GAAAA6WsCAACD+GUPjBUDAACD+Gd+z4P4aQ+E8QAAAIP4bg+EtQAAAIP4bw+EmgAAAIP4cHRlg/hzD4T1/v//g/h1D4TMAAAAg/h4D4XVAgAAuCcAAADrU//IZkQ5EXQJSIPBAkE7wnXvSCvLSNH56yFJO9pID0Qd8u8AAEiLy+sK/8hEOBF0CEj/wUE7wnXxK8uJTCRE6YsCAABBvhAAAABBD7rsD7gHAAAAiUQkYEG5EAAAAEWE5HlgBFHGRCRMMEGNUfKIRCRN61NBuQgAAABFhOR5REEPuuwJ6z1Ji30ASYPFCOgsPQAARTPSQTvCD4R4/P//QfbEIHQFZok36wKJN8dEJFgBAAAA6WwDAABBg8xAQbkKAAAAi1QkSEEPuuQPcgdBD7rkDHMKTYtFAEmDxQjrLkmDxQhB9sQgdBRB9sRAdAdND79F+OsXRQ+3RfjrEEH2xEB0Bk1jRfjrBEWLRfhB9sRAdA1NO8J9CEn32EEPuuwIQQ+65A9yCkEPuuQMcgNFi8BFO/J9CEG+AQAAAOsLQYPk90U780UPT/NEi3wkYEmLwEiNnCS/AgAASPfYG8kjyolMJEhBi85B/85BO8p/BU07wnQgM9JJi8BJY8lI9/FMi8CNQjCD+Dl+A0EDx4gDSP/L69BIjYQkvwIAAEG//////yvDSP/DQQ+65AmJRCRED4MZAQAAQTvCdAmAOzAPhAsBAABI/8v/RCRExgMw6fwAAAB1DkCA/Wd1QUG+AQAAAOs5RTvzRQ9P80GB/qMAAAB+KUGNvl0BAABIY8/oeQoAAEiJhCSYAAAASIXAdAdIi9iL9+sGQb6jAAAASYtFAEiLDZD6AABJg8UIQA++/Uhj9kiJhCSoAAAA6FAhAABIjUwkeESLz0iJTCQwi0wkcEyLxolMJChIjYwkqAAAAEiL00SJdCQg/9BBi/wzwIHngAAAAHQdRDvwdRhIiw1N+gAA6AghAABIjVQkeEiLy//QM8BAgP1ndRo7+HUWSIsNI/oAAOjmIAAASI1UJHhIi8v/0IA7LXUIQQ+67AhI/8NIi8voTzoAAEUz0olEJEREOVQkWA+FSwEAAEH2xEB0MUEPuuQIcwfGRCRMLesLQfbEAXQQxkQkTCu/AQAAAIl8JEjrEUH2xAJ0B8ZEJEwg6+iLfCRIi3QkVEiLbCRoK3QkRCv3QfbEDHURTI1MJEBMi8WL1rEg6NT3//9MjUwkQEiNTCRMTIvFi9foFPj//0H2xAh0F0H2xAR1EUyNTCRATIvFi9axMOij9///i3wkRDPAOUQkUHR1O/h+cUiL60QPt00ASI2UJMACAABIjYwkoAAAAEG4BgAAAP/PSIPFAuhCPAAARTPSQTvCdTKLlCSgAAAAQTvSdCZMi0QkaEyNTCRASI2MJMACAADok/f//0Uz0kE7+nWnSItsJGjrI0iLbCRoQYvHiUQkQOsZTI1MJEBMi8WL10iLy+hk9///RTPSi0QkQEE7wnwaQfbEBHQUTI1MJEBMi8WL1rEg6O32//9FM9JIi4QkmAAAAEk7wnQTSIvI6EEKAABFM9JMiZQkmAAAAEiLvCSwAAAAi3QkQItUJFxMjQ3bx///QbsAAgAAQIovQTrqD4Uk+f//RDiUJJAAAAB0D0iLjCSIAAAAg6HIAAAA/YvGSIuMJMgCAABIM8zo7ur//0iLnCQgAwAASIHE0AIAAEFfQV5BXUFcX15dw0CA/Ul0OkCA/Wh0K0CA/Wx0DUCA/Xd1lkEPuuwL64+AP2x1Ckj/x0EPuuwM64BBg8wQ6Xf///9Bg8wg6W7///+KB0EPuuwPPDZ1FIB/ATR1DkiDxwJBD7rsD+lP////PDN1FIB/ATJ1DkiDxwJBD7r0D+k3////PGQPhC////88aQ+EJ////zxvD4Qf////PHUPhBf///88eA+ED////zxYD4QH////RIlUJFxIjVQkeEAPts1EiVQkUOj4NgAAM/Y7xnQhSItUJGhMjUQkQECKzeg89f//QIovSP/HQDruD4QCAQAASItUJGhMjUQkQECKzegb9f//RTPS6Zn+//9AgP0qdRlFi3UASYPFCEU78g+Nl/7//0WL9+mP/v//Q40MtkAPvsVEjXRI0Ol9/v//RYvy6XX+//9AgP0qdR1Bi0UASYPFCEE7wolEJFQPjVr+//9Bg8wE99jrD4tEJFSNDIBAD77FjURI0IlEJFTpOv7//0CA/SB0QUCA/SN0MUCA/St0IkCA/S10E0CA/TAPhRj+//9Bg8wI6Q/+//9Bg8wE6Qb+//9Bg8wB6f39//9BD7rsB+nz/f//QYPMAunq/f//RIlUJHBEiVQkWESJVCRURIlUJEhFi+JFi/dEiVQkUOnG/f//6FIFAABFM8lFM8Az0jPJSIl0JCDHABYAAADoaAQAAEA4tCSQAAAA6Xf2///MzMxIi8RIiVgISIlwEEiJeBhMiWAgQVVBVkFXSIHskAAAAEiNTCQg/xWptQAAkLpYAAAARI1iyEmLzOjfBQAATIvYRTP/STvHdQiDyP/pewIAAEiJBZUIAQBBi8yJDXQIAQBIBQALAABMO9hzQ0WIewhJgwv/QcZDCQpFiXsMRYh7OEHGQzkKQcZDOgpFiXtQRYh7TEmDw1hIiwVPCAEASAUACwAATDvYcsOLDSYIAQBmRDl8JGIPhEkBAABIi0QkaEk7xw+EOwEAAEyNaARIYzBJA/W7AAgAADkYD0wYvwEAAAA7yw+NjQAAAEyNNfwHAQC6WAAAAEmLzOgfBQAATIvYSTvHdGlJiQT+iwXFBwEAQQPEiQW8BwEASY2LAAsAAEw72XNBRYh7CEmDC/9BxkMJCkWJewxBgGM4gEHGQzkKQcZDOgpFiXtQRYh7TEmDw1hJiwT+SAUACwAATDvYcsWLBW8HAQBI/8c7w3yE6w+LHWAHAQDrB0yNNW8HAQBBi/9BO99+fkiDPv90a0iDPv50ZUH2RQABdF5B9kUACHUOSIsO/xVMtAAAQTvHdElMY+dJi8RIwfgFQYPkH01r5FhNAyTGSIsGSYkEJEGKRQBBiEQkCEmNTCQQuqAPAADo2ioAAEE7x3QHQf9EJAzrCIPI/+nVAAAA/8dJ/8VIg8YIO/t8gkWL50mL/0iL30hr21hIAx3VBgEASIM7/3QMSIM7/nQGgEsIgOt/xkMIgUGNRCT/99gbyYPB9bj2////RTvnD0TI/xWiswAASIvwSIP4/3RKSTvHdEVIi8j/FZOzAABBO8d0N0iJMw+2wIP4AnUGgEsIQOsJg/gDdQSASwgISI1LELqgDwAA6C4qAABBO8d0Bf9DDOsQg8j/6y6ASwhASMcD/v///0H/xEj/x0iD/wMPjFH///+LDRYGAQD/FSCzAAAzwOsDg8j/TI2cJJAAAABJi1sgSYtzKEmLezBNi2M4SYvjQV9BXkFdw8zMzEiD7DhIhcl1JegqAgAASINkJCAARTPJRTPAM9IzyccAFgAAAOg/AQAAg8j/6wOLQRxIg8Q4w8zMSIkNBfgAAMNAU0iB7OAFAACDZCRwAEiNTCR0M9JBuJQAAADoDN///0yNXCRwSI2EJBABAABIjYwkEAEAAEyJXCRISIlEJFD/FceyAABIi5wkCAIAAEiNVCRASIvLRTPA6P1/AABIhcB0O0iDZCQ4AEiLVCRASI1MJGBIiUwkMEiNTCRYTIvISIlMJChIjYwkEAEAAEyLw0iJTCQgM8nouX8AAOsgSIuEJOgFAABIiYQkCAIAAEiNhCToBQAASImEJKgBAABIi4Qk6AUAAMdEJHAXBADAx0QkdAEAAABIiYQkgAAAAP8VEbIAADPJi9j/Ff+xAABIjUwkSP8V7LEAAIXAdQyF23UIjUgC6Pg0AAD/Fc6xAAC6FwQAwEiLyP8VuLEAAEiBxOAFAABbw8zMzEiJXCQISIlsJBBIiXQkGFdIg+wwSIvpSIsNvvYAAEGL2UmL+EiL8uhAGAAASIXAdBpMi1QkYESLy0yLx0iL1kiLzUyJVCQg/9DrJbkCAAAA6IM0AABMi1wkYESLy0yLx0iL1kiLzUyJXCQg6Gj+//9Ii1wkQEiLbCRISIt0JFBIg8QwX8PMzMxMjQ3V5AAAM8BJi9FEjUAIOwp0K//ASQPQg/gtcvKNQe2D+BF3BrgNAAAAw4HBRP///7gWAAAAg/kOQQ9GwMNImEGLRMEEw8xIg+wo6HcYAABIhcB1CUiNBeflAADrBEiDwBBIg8Qow0iD7CjoVxgAAEiFwHUJSI0Fy+UAAOsESIPAFEiDxCjDQFNIg+wgi9noMxgAAEiFwHUJSI0Fp+UAAOsESIPAFIkY6BoYAABMjRWP5QAASIXAdARMjVAQi8voO////0GJAkiDxCBbw8zMSIlcJAhIiWwkEEiJdCQYV0iD7CAz/0iL8YPN/0iLzuhkMwAASIvYSIXAdSg5BVr1AAB2IIvP/xXIrwAARI2f6AMAAEQ7HUL1AABBi/sPR/07/XXISItsJDhIi3QkQEiLw0iLXCQwSIPEIF/DSIvESIlYCEiJaBBIiXAYSIl4IEFUSIPsIDP/SIvySIvpQYPM/0UzwEiL1kiLzehpBgAASIvYSIXAdSo5Bd/0AAB2IovP/xVNrwAARI2f6AMAAEQ7Hcf0AABBi/tBD0f8QTv8dcBIi2wkOEiLdCRASIt8JEhIi8NIi1wkMEiDxCBBXMPMSIvESIlYCEiJaBBIiXAYSIl4IEFUSIPsIDP2SIv6SIvpQYPM/0iL10iLzeggMwAASIvYSIXAdS9Ihf90KjkFWfQAAHYii87/FceuAABEjZ7oAwAARDsdQfQAAEGL80EPR/RBO/R1vkiLbCQ4SIt0JEBIi3wkSEiLw0iLXCQwSIPEIEFcw8zMzEiJXCQISIlsJBBIiXQkGFdBVEFVSIPsIDP2SYv4SIvqQYPN/0yL4UyLx0iL1UmLzOhnMwAASIvYSIXAdS9Ihf90KjkFzPMAAHYii87/FTquAABEjZ7oAwAARDsdtPMAAEGL80EPR/VBO/V1u0iLbCRISIt0JFBIi8NIi1wkQEiDxCBBXUFcX8NIhcl0N1NIg+wgTIvBSIsN+P8AADPS/xWArgAAhcB1F+hT/f//SIvY/xVmrgAAi8jo+/z//4kDSIPEIFvDzMzMSIlcJAhIiXQkEEFUSIPsMDP2jU4B6GoEAACQjV4DiVwkIDsdNBMBAH1pTGPjSIsFCAMBAEqDPOAAdFBKiwzg9kEYg3QQ6LIzAACD+P90Bv/GiXQkJIP7FHwxSIsF2wIBAEqLDOBIg8Ew/xWdrQAASIsNxgIBAEqLDOHoQf///0yLHbYCAQBLgyTjAP/DiVwkIOuPuQEAAADo5wIAAIvGSItcJEBIi3QkSEiDxDBBXMNIiVwkCEiJdCQQV0iD7CCLQRgz9kiL2SQDPAJ1P/dBGAgBAAB0Nos5K3kQhf9+Legc+v//SItTEESLx4vI6OI6AAA7x3UPi0MYhMB5D4Pg/YlDGOsHg0sYIIPO/0iLSxCDYwgAi8ZIi3QkOEiJC0iLXCQwSIPEIF/DzMzMQFNIg+wgSIvZSIXJdQfoNQAAAOss6Gr///+FwHQFg8j/6x4PumMYDnMVSIvL6KL5//+LyOijOwAA99gbwOsCM8BIg8QgW8PMSIl0JAhIiXwkEEyJZCQYQVVBVkFXSIPsMESL8UUz5DP2jU4B6OcCAACQM/+JfCQgQYPP/zs9rhEBAA+NhgAAAExj70iLBX4BAQBKgzzoAHRqSosU6PZCGIN0YIvP6IrX//+QSIsFXgEBAEqLDOj2QRiDdDVBg/4BdRToOf///0E7x3QlQf/ERIlkJCTrG0WF9nUW9kEYAnQQ6Br///9BO8dBD0T3iXQkKEiLFRgBAQBKixTqi8/oudf////HiXwkIOlu////uQEAAADoQAEAAEGD/gFBD0T0i8ZIi3QkUEiLfCRYTItkJGBIg8QwQV9BXkFdw7kBAAAA6QL////MzEiJXCQISIl0JBBIiXwkGEFUSIPsIEyNJazgAAAz9jP/SYvcg3sIAXUlSGPGuqAPAAD/xkiNDIBIjQWq8AAASI0MyEiJC+gOIgAAhcB0LUiNBbPiAABIg8MQ/8dIO9h8w7gBAAAASItcJDBIi3QkOEiLfCRASIPEIEFcw0hjx0gDwEmDJMQAM8Dr28zMSIlcJAhIiWwkEEiJdCQYV0iD7CBIjR0h4AAASI0tWuIAAEiL+0iLN0iF9nQbg38IAXQVSIvO/xXQqgAASIvO6Hz8//9IgycASIPHEEg7/XzUSIsLSIXJdAyDewgBdQb/FaeqAABIg8MQSDvdfONIi1wkMEiLbCQ4SIt0JEBIg8QgX8PMSGPJSI0Frt8AAEgDyUiLDMhI/yUYqgAASIlcJAhIiXQkEEiJfCQYQVVIg+wgSGPZvgEAAABIgz0L/AAAAHUX6BgZAACNTh3o6BYAALn/AAAA6Bbg//9Ii/tIA/9MjS1V3wAASYN8/QAAdASLxut7uSgAAADow/n//0iL2EiFwHUP6C75///HAAwAAAAzwOtauQoAAADoZgAAAJBJg3z9AAB1L7qgDwAASIvL6JggAACFwHUXSIvL6ID7///o8/j//8cADAAAADP26xBJiVz9AOsJSIvL6GL7//+QSIsNdt8AAP8VSKkAAIvGSItcJDBIi3QkOEiLfCRASIPEIEFdw0iJXCQIV0iD7CBIY9lIjT2k3gAASAPbSIM83wB1Eej1/v//hcB1CI1IEejR3v//SIsM30iLXCQwSIPEIF9I/yXkqAAASIlcJAhXSIPsMEmL2EiL+kiFyXQyM9JIjULgSPfxSDvHcyToSPj//0iDZCQgAEUzyUUzwDPSM8nHAAwAAADoXff//zPA611ID6/5uAEAAABIhf9ID0T4M8BIg//gdxhIiw2e+gAAjVAITIvH/xUqqQAASIXAdS2DPZb6AAAAdBlIi8/ovB8AAIXAdctIhdt0sscDDAAAAOuqSIXbdAbHAwwAAABIi1wkQEiDxDBfw8xIiVwkCEiJbCQQSIl0JBhXSIPsMEiL8kiL6UiFyQ+E+wAAAEiF0g+E8gAAADP/SIvZTYXAdCFBigCEwHQavwIAAABIO9cPhrwAAABIjVkBiAHGAzpI/8NJi9FNhcl0QUGAOQB0O0j/x0g7/g+DlgAAAIoCSP/CiANI/8OAOgB15UmLyejYOAAAgDgvdBOAOFx0Dkj/x0g7/nNtxgNcSP/DSItMJGBIhcl0GesSSP/HSDv+c1OKAYgDSP/DSP/BgDkAdelIi0wkaEiFyXQxigGEwHQrPC50Ikj/x0g7/nMoxgMuSP/D6xJI/8dIO/5zGIoBiANI/8NI/8GAOQB16UiNRwFIO8Z2EMZFAADosPb//7siAAAA6xHGAwAzwOsj6J32//+7FgAAAEiDZCQgAEUzyUUzwDPSM8mJGOix9f//i8NIi1wkQEiLbCRISIt0JFBIg8QwX8PMzEiJXCQISIl0JBBXSIPsQIvaSIvRSI1MJCBBi/lBi/Do+Nn//0iLRCQoRA+220GEfAMddR+F9nQVSItEJCBIi4hAAQAAQg+3BFkjxusCM8CFwHQFuAEAAACAfCQ4AHQMSItMJDCDocgAAAD9SItcJFBIi3QkWEiDxEBfw8xIi8KL0UG5BAAAAEiLyEUzwOlu////zMyL0UG5BAAAAEUzwDPJ6Vr////MzEiD7DhIg2QkIADoWTcAAEiDxDjDSIlMJAhIgeyIAAAASI0Nje4AAP8Vp6YAAEyLHXjvAABMiVwkWEUzwEiNVCRgSItMJFjo13MAAEiJRCRQSIN8JFAAdEFIx0QkOAAAAABIjUQkSEiJRCQwSI1EJEBIiUQkKEiNBTjuAABIiUQkIEyLTCRQTItEJFhIi1QkYDPJ6IVzAADrIkiLhCSIAAAASIkFBO8AAEiNhCSIAAAASIPACEiJBZHuAABIiwXq7gAASIkFW+0AAEiLhCSQAAAASIkFXO4AAMcFMu0AAAkEAMDHBSztAAABAAAASIsF0dgAAEiJRCRoSIsFzdgAAEiJRCRw/xWypQAAiQWc7QAAuQEAAADorigAADPJ/xWSpQAASI0NS6kAAP8VfaUAAIM9du0AAAB1CrkBAAAA6IYoAAD/FVylAAC6CQQAwEiLyP8VRqUAAEiBxIgAAADDzMxIiVwkCEiJbCQQSIl0JBhXSIPsIEiNWRxIi+m+AQEAAEiLy0yLxjPS6GfR//9FM9tIjX0QQY1LBkEPt8NEiV0ERIldCESJXQxm86tIjT1S3AAASCv9igQfiANI/8NIg+4BdfJIjY0dAQAAugABAACKBDmIAUj/wUiD6gF18kiLXCQwSItsJDhIi3QkQEiDxCBfw8zMSIlcJBBIiXQkGFdIgeyABQAASIsFt9cAAEgzxEiJhCRwBQAASIvxi0kESI1UJFD/FcukAAC7AAEAAIXAD4Q9AQAAM8BIjVQkcIgC/8BI/8I7w3L1ikQkVsZEJHAgSI18JFbrKQ+2VwFED7bARDvCdxZBK9BJi8BKjUwEcESNQgGyIOh50P//SIPHAooHhMB104tGDINkJDgATI1EJHCJRCQwi0YERIvLiUQkKEiNhCRwAwAAugEAAAAzyUiJRCQg6Js/AACDZCRAAItGBItWDIlEJDhIjYQkcAEAAIlcJDBIiUQkKEyNTCRwRIvDM8mJXCQg6GQ8AACDZCRAAItGBItWDIlEJDhIjYQkcAIAAIlcJDBIiUQkKEyNTCRwQbgAAgAAM8mJXCQg6C48AABMjZwkcAMAAEiNTh0z0kH2AwF0DIAJEIqEFHABAADrEEH2AwJ0EoAJIIqEFHACAACIgQABAADrB8aBAAEAAABI/8FI/8JJg8MCSIPrAXW/6z8z0kiNTh1EjUKfQY1AIIP4GXcIgAkQjUIg6wxBg/gZdw6ACSCNQuCIgQABAADrB8aBAAEAAAD/wkj/wTvTcsdIi4wkcAUAAEgzzOiS1f//TI2cJIAFAABJi1sYSYtzIEmL41/DzEiJXCQQV0iD7CDo3QoAAEiL+IuIyAAAAIUNRt8AAHQTSIO4wAAAAAB0CUiLmLgAAADrbrkNAAAA6Pf4//+QSIufuAAAAEiJXCQwSDsdC94AAHRESIXbdBzwgwP/dRZIjQXH2QAASItMJDBIO8h0Bej88///SIsF4d0AAEiJh7gAAABIiwXT3QAASIlEJDDwgwABSItcJDC5DQAAAOiT9///SIXbdQiNSyDohtf//0iLw0iLXCQ4SIPEIF/DQFNIg+xAi9lIjUwkIDPS6MzU//+DJdXuAAAAg/v+dSXHBcbuAAABAAAA/xVAogAAgHwkOAB0U0iLTCQwg6HIAAAA/etFg/v9dRLHBZzuAAABAAAA/xUOogAA69SD+/x1FEiLRCQgxwWA7gAAAQAAAItABOu7gHwkOAB0DEiLRCQwg6DIAAAA/YvDSIPEQFvDSIlcJBhVVldBVEFVSIPsQEiLBYnUAABIM8RIiUQkOEiL8uhJ////M9uL+DvDdQ1Ii87oBfz//+kYAgAATI0t3dwAAIvLSIvrSYvFQbwBAAAAOTgPhCcBAABBA8xJA+xIg8Awg/kFcumB/+j9AAAPhAQBAACB/+n9AAAPhPgAAAAPt8//FV+hAAA7ww+E5wAAAEiNVCQgi8//FTKhAAA7ww+ExgAAAEiNThwz0kG4AQEAAOgZzf//iX4EiV4MRDlkJCAPho0AAABIjUQkJjhcJCZ0LThYAXQoD7Y4D7ZIATv5dxUrz0iNVDcdQQPMgAoESQPUSSvMdfVIg8ACOBh100iNRh65/gAAAIAICEkDxEkrzHX1i04EgemkAwAAdCiD6QR0HIPpDXQQQTvMdASLw+sauAQEAADrE7gSBAAA6wy4BAgAAOsFuBEEAACJRgxEiWYI6wOJXghIjX4QD7fDuQYAAABm86vp4AAAADkd7uwAAA+Ft/7//4PI/+nWAAAASI1OHDPSQbgBAQAA6D/M//9IjWxtAEyNHXvbAABIA+1BugQAAABNjUTtEEmLyEE4GHQxOFkBdCwPthEPtkEBO9B3GUyNTDIdQYoDQQPUQQgBD7ZBAU0DzDvQduxIg8ECOBl1z0mDwAhNA9xNK9R1u4l+BIHvpAMAAESJZgh0JIPvBHQYg+8NdAxBO/x1GrsEBAAA6xO7EgQAAOsMuwQIAADrBbsRBAAAiV4MSI1WEEmNfO0EuQYAAAAPtwdIg8cCZokCSIPCAkkrzHXtSIvO6Hz6//8zwEiLTCQ4SDPM6M3R//9Ii5wkgAAAAEiDxEBBXUFcX15dw8xIi8RIiVgISIlwEEiJeBhMiWAgQVVIg+wwi/lBg83/6AQHAABIi/DoEPz//0iLnrgAAACLz+i+/P//RIvgO0MED4SPAQAAuSACAADoXO7//0iL2DP/SDvHD4R8AQAASIuWuAAAAEiLyEG4IAIAAOjlOgAAiTtIi9NBi8zoCP3//0SL6DvHD4UkAQAASIuOuAAAAPCDAf91GkiLjrgAAABMjSXC1QAASTvMdA7o/O///+sHTI0lr9UAAEiJnrgAAADwgwMB9obIAAAAAg+FCQEAAPYFyNoAAAEPhfwAAAC5DQAAAOiI9P//kItDBIkFCusAAItDCIkFBesAAItDDIkFAOsAAIvXiVQkIEyNBVet//+D+gV9GUhjyg+3REsQZkGJhEiIPQEA/8KJVCQg6+KL14lUJCCB+gEBAAB9F0hjyopEGRxCiIQBICoBAP/CiVQkIOvhiXwkIIH/AAEAAH0aSGPPioQZHQEAAEKIhAEwKwEA/8eJfCQg695IiwUX2QAA8IMA/3URSIsNCtkAAEk7zHQF6BTv//9IiR352AAA8IMDAbkNAAAA6MPy///rK4P4/3UmTI0lrdQAAEk73HQISIvL6OTu///oV+z//8cAFgAAAOsFM/9Ei+9Bi8VIi1wkQEiLdCRISIt8JFBMi2QkWEiDxDBBXcNIg+wogz0N8gAAAHUUuf3////o8f3//8cF9/EAAAEAAAAzwEiDxCjDSIlcJAhIiXQkEFdIg+wgSIuBKAEAAEiL2UiFwHR5SI0Nc94AAEg7wXRtSIuDEAEAAEiFwHRhgzgAdVxIi4sgAQAASIXJdBaDOQB1Eeg77v//SIuLKAEAAOhDPgAASIuLGAEAAEiFyXQWgzkAdRHoGe7//0iLiygBAADo2T0AAEiLixABAADoAe7//0iLiygBAADo9e3//0iLgzABAABIhcB0R4M4AHVCSIuLOAEAAEiB6f4AAADo0e3//0iLi0gBAAC/gAAAAEgrz+i97f//SIuLUAEAAEgrz+iu7f//SIuLMAEAAOii7f//SIuLWAEAAEiNBSDcAABIO8h0GoO5YAEAAAB1EehhOwAASIuLWAEAAOh17f//SI17WL4GAAAASI0FYdgAAEg5R/B0EkiLD0iFyXQKgzkAdQXoTe3//0iDf/gAdBNIi08ISIXJdAqDOQB1Begz7f//SIPHIEiD7gF1vUiLy0iLXCQwSIt0JDhIg8QgX+kS7f//zMzwgwEBSIuBEAEAAEiFwHQE8IMAAUiLgSABAABIhcB0BPCDAAFIi4EYAQAASIXAdATwgwABSIuBMAEAAEiFwHQE8IMAAUiNQVhBuAYAAABIjRW31wAASDlQ8HQMSIsQSIXSdATwgwIBSIN4+AB0DUiLUAhIhdJ0BPCDAgFIg8AgSYPoAXXJSIuBWAEAAPCDgGABAAABw8zMzEiFyQ+EmAAAAEGDyf/wRAEJSIuBEAEAAEiFwHQE8EQBCEiLgSABAABIhcB0BPBEAQhIi4EYAQAASIXAdATwRAEISIuBMAEAAEiFwHQE8EQBCEiNQVhBuAYAAABIjRUS1wAASDlQ8HQMSIsQSIXSdATwRAEKSIN4+AB0DUiLUAhIhdJ0BPBEAQpIg8AgSYPoAXXJSIuBWAEAAPBEAYhgAQAASIvBw8zMzEBTSIPsIEiL2kiF0nRBSIXJdDxMixFMO9J0L0iJEUiLyuia/v//TYXSdB9Ji8roJf///0GDOgB1EUiNBZzWAABMO9B0Bej6/P//SIvD6wIzwEiDxCBbw8xAU0iD7CDo6QEAAEiL2IuIyAAAAIUNUtYAAHQYSIO4wAAAAAB0DujJAQAASIuYwAAAAOsruQwAAADo/u///5BIjYvAAAAASIsVl9cAAOhW////SIvYuQwAAADo3e7//0iF23UIjUsg6NDO//9Ii8NIg8QgW8PMzMxI/yXFmQAAzDPJSP8lu5kAAMzMzEj/JbmZAADMSIPsKIsNZtcAAIP5/3QN/xW7mQAAgw1U1wAA/0iDxCjp/+3//8zMzEiJXCQIV0iD7CBIi/pIi9lIjQVRowAASImBoAAAAMdBHAEAAADHgcgAAAABAAAAxoF0AQAAQ8aB9wEAAENIjQU00AAASImBuAAAALkNAAAA6Cvv//+QSIuDuAAAAPCDAAG5DQAAAOgV7v//uQwAAADoC+///5BIibvAAAAASIX/dQ5IiwWf1gAASImDwAAAAEiLi8AAAADoEP3//5C5DAAAAOjZ7f//SItcJDBIg8QgX8PMzEiJXCQIV0iD7CD/FYyYAACLDX7WAACL+P8VxpgAAEiL2EiFwHVIjUgBusgCAADoQej//0iL2EiFwHQziw1T1gAASIvQ/xWimAAASIvLhcB0FjPS6PT+////FaaYAABIg0sI/4kD6wfonOn//zPbi8//FYaYAABIi8NIi1wkMEiDxCBfw0BTSIPsIOhx////SIvYSIXAdQiNSBDoLc3//0iLw0iDxCBbw0iFyQ+EKwEAAEiJXCQQV0iD7CBIi9lIi0k4SIXJdAXoPOn//0iLS0hIhcl0Begu6f//SItLWEiFyXQF6CDp//9Ii0toSIXJdAXoEun//0iLS3BIhcl0BegE6f//SItLeEiFyXQF6Pbo//9Ii4uAAAAASIXJdAXo5ej//0iLi6AAAABIjQWDoQAASDvIdAXozej//7kNAAAA6Ift//+QSIuLuAAAAEiJTCQwSIXJdB3wgwH/dRdIjQVgzgAASItMJDBIO8h0BuiV6P//kLkNAAAA6E7s//+5DAAAAOhE7f//kEiLu8AAAABIhf90K0iLz+jz+///SDs90NQAAHQaSI0FZ9MAAEg7+HQOgz8AdQlIi8/ovfn//5C5DAAAAOgC7P//SIvL6Dbo//9Ii1wkOEiDxCBfw8zMzEBTSIPsIOhhz///6Mzq//+FwHRgSI0Nrf7///8VC5cAAIkFjdQAAIP4/3RIusgCAAC5AQAAAOhZ5v//SIvYSIXAdDGLDWvUAABIi9D/FbqWAACFwHQeM9JIi8voDP3///8VvpYAAEiDSwj/iQO4AQAAAOsH6Mv8//8zwEiDxCBbw8zMzEiJbCQQSIl0JBhXSIPsYEhj+YvqSI1MJEBJi9Dor8j//0SNXwFBgfsAAQAAdxVIi0QkQEiLiEABAAAPtwR56Z8AAACL90iNVCRAwf4IQA+2zug+FQAAugEAAACFwHQeQIi0JIgAAABAiLwkiQAAAMaEJIoAAAAARI1KAesTQIi8JIgAAADGhCSJAAAAAESLykiLTCRAiVQkOEyNhCSIAAAAi0EUiUQkMItBBEiNTCRAiUQkKEiNRCRwSIlEJCDo7TAAAIXAdRY4RCRYdAxIi0QkUIOgyAAAAP0zwOsaD7dEJHAjxYB8JFgAdAxIi0wkUIOhyAAAAP1MjVwkYEmLaxhJi3MgSYvjX8PMzMxIi8RIiVgQSIloGEiJcCCJSAhXSIPsIEiLykiL2ui24f//i0sYSGPw9sGCdRfo3uP//8cACQAAAINLGCCDyP/pNAEAAPbBQHQN6MLj///HACIAAADr4jP/9sEBdBmJewj2wRAPhIkAAABIi0MQg+H+SIkDiUsYi0MYiXsIg+Dvg8gCiUMYqQwBAAB1L+gzvv//SIPAMEg72HQO6CW+//9Ig8BgSDvYdQuLzuhpEwAAO8d1CEiLy+jROwAA90MYCAEAAA+EjQAAAIsrSItTECtrEEiNQgFIiQOLQyT/yDvviUMIfhlEi8WLzui+IQAAi/jrV4PJIIlLGOk/////g/7/dCOD/v50HkiLzkiLxkiNFcDmAACD4R9IwfgFSGvJWEgDDMLrB0iNDRjHAAD2QQggdBcz0ovORI1CAugVOgAASIP4/w+E7/7//0iLSxCKRCQwiAHrFr0BAAAASI1UJDCLzkSLxehDIQAAi/g7/Q+Fxf7//w+2RCQwSItcJDhIi2wkQEiLdCRISIPEIF/DzMzMSIlcJAhIiXwkGEyJbCQgQVZIg+wwTI01iNEAAIv5M9tJi8Y7CHQL/8NIg8AQg/sXcvGD+xcPg9QBAAC5AwAAAOj/PAAAg/gBD4R8AQAAuQMAAADo7DwAAIXAdQ2DPTnGAAABD4RhAQAAgf/8AAAAD4SaAQAASI09GOAAAEG9FAMAAEyNBQudAABIi89Ji9XohDYAAIXAdBVIg2QkIABFM8lFM8Az0jPJ6Nvf//9IjRX53wAAQbgEAQAAM8nGBe7gAAAA/xUjkgAAhcB1MUyNBaicAABIjQ3S3wAAuvsCAADoMzYAAIXAdBVIg2QkIABFM8lFM8Az0jPJ6Irf//9IjQ2o3wAA6JoSAABI/8BIg/g8dkZIjQ2T3wAA6IUSAABIjRWC4gAATI0FS5wAAEiNTDjeQbkDAAAASCvR6AA1AACFwHQVSINkJCAARTPJRTPAM9Izyegv3///TI0FFJwAAEmL1UiLz+hJNAAAhcB0FUiDZCQgAEUzyUUzwDPSM8noBN///0xjw0mL1UiLz00DwE+LRMYI6Bo0AACFwHQVSINkJCAARTPJRTPAM9IzyejV3v//SI0VkpsAAEG4ECABAEiLz+iIOQAA60W59P////8Vb5EAAEiL+EiFwHQySIP4/3QsSGPbSAPbSYtM3gjosREAAEmLVN4ISINkJCAATI1MJEhMi8BIi8//FQWSAABIi1wkQEiLfCRQTItsJFhIg8QwQV7DzMzMSIPsKLkDAAAA6A47AACD+AF0F7kDAAAA6P86AACFwHUdgz1MxAAAAXUUufwAAADopP3//7n/AAAA6Jr9//9Ig8Qow8xAU0iD7CC6CAAAAI1KGOj14P//SIvISIvY6H73//9IiQXT5QAASIkFxOUAAEiF23UFjUMY6wZIgyMAM8BIg8QgW8PMzEiJXCQISIl0JBBIiXwkGEFUQVVBVkiD7CBMi/Hof8b//5BIiw2L5QAA6D73//9Mi+BIiw105QAA6C/3//9Ii9hJO8QPgpgAAABIi/hJK/xMjW8ISYP9CA+ChAAAAEmLzOh/OgAASIvwSTvFc1S6ABAAAEg7wkgPQtBIA9BIO9ByEUmLzOi/4P//M9tIO8N1GusCM9tIjVYgSDvWckZJi8zoo+D//0g7w3Q5SMH/A0iNHPhIi8jonvb//0iJBfPkAABJi87oj/b//0iJA0iNSwjog/b//0iJBdDkAABJi97rAjPb6MTF//9Ii8NIi1wkQEiLdCRISIt8JFBIg8QgQV5BXUFcw8zMzEiD7Cjo7/7//0j32BvA99j/yEiDxCjDzEiJXCQIV0iD7CBIjR1DpQAASI09PKUAAOsOSIsDSIXAdAL/0EiDwwhIO99y7UiLXCQwSIPEIF/DSIlcJAhXSIPsIEiNHRulAABIjT0UpQAA6w5IiwNIhcB0Av/QSIPDCEg733LtSItcJDBIg8QgX8NIiVwkCFdIg+wgSI0dw84AAL8KAAAASIsL6Kr1//9IiQNIg8MISIPvAXXrSItcJDBIg8QgX8PMzMzMzMzMzMzMzMzMzEiLwblNWgAAZjkIdAMzwMNIY0g8SAPIM8CBOVBFAAB1DLoLAgAAZjlRGA+UwPPDzExjQTxFM8lMi9JMA8FBD7dAFEUPt1gGSo1MABhFhdt0HotRDEw70nIKi0EIA8JMO9ByD0H/wUiDwShFO8ty4jPAw0iLwcPMzMzMzMzMzMzMSIPsKEyLwUyNDbKd//9Ji8noav///4XAdCJNK8FJi9BJi8noiP///0iFwHQPi0Akwegf99CD4AHrAjPASIPEKMPMzMxIg+wo6DP2//9Ii4jQAAAASIXJdAT/0esA6II4AABIg8Qow8xIg+woSI0N0f///+iM9P//SIkFKd4AAEiDxCjDwgAAzEiJXCQISIlsJBBIiXQkGFdIg+wgSIvyi/noVvX//0Uz20iL2Ek7ww+EigEAAEiLiKAAAABMYwWpzQAASIvROTp0E0mLwEiDwhBIweAESAPBSDvQculJi8BIweAESAPBSDvQcwQ5OnQDSYvTSTvTD4RDAQAATItCCE07ww+ENgEAAEmD+AV1DUyJWghBjUD86SUBAABJg/gBdQiDyP/pFwEAAEiLq6gAAABIibOoAAAAi0oEg/kID4XoAAAATGMVFc0AAIsNE80AAEEDyk2LykQ70X0qScHhBEiLg6AAAABB/8JJg8EQTYlcAfiLDefMAACLBeXMAAADyEQ70XzagTqOAADAi7uwAAAAdQzHg7AAAACDAAAA63aBOpAAAMB1DMeDsAAAAIEAAADrYoE6kQAAwHUMx4OwAAAAhAAAAOtOgTqTAADAdQzHg7AAAACFAAAA6zqBOo0AAMB1DMeDsAAAAIIAAADrJoE6jwAAwHUMx4OwAAAAhgAAAOsSgTqSAADAdQrHg7AAAACKAAAAi5OwAAAAuQgAAABB/9CJu7AAAADrB0yJWghB/9BIiauoAAAA6eP+//8zwEiLXCQwSItsJDhIi3QkQEiDxCBfw8zMSIkNUdwAAEiJDVLcAABIiQ1T3AAASIkNVNwAAMPMzMxIiw1B3AAA6ZTy//9IiVwkEEiJdCQYV0FUQVVBVkFXSIPsQIvZM/+JfCRwM/aL0YPqAg+ECQEAAIPqAg+EogAAAIPqAg+EgAAAAIPqAg+EkAAAAIPqAw+EhwAAAIPqBHRNg+oGdCyD+gF0X+iU2v//xwAWAAAASCF0JCBFM8lFM8Az0jPJ6KrZ//+DyP/p0QEAAEyNJafbAABIiw2g2wAAvwEAAACJfCRw6aoAAABMjSWb2wAASIsNlNsAAL8BAAAAiXwkcOmOAAAATI0ld9sAAEiLDXDbAAC/AQAAAIl8JHDrdeic8v//SIvwSIXAdQiDyP/pawEAAEiLkKAAAABIi8pMYwXrygAAOVkEdBNIg8EQSYvASMHgBEgDwkg7yHLoSYvASMHgBEgDwkg7yHMFOVkEdAIzyUyNYQhNiywk6x9MjSXw2gAASIsN6doAAL8BAAAAiXwkcOhD8f//TIvoSYP9AXUHM8Dp9gAAAE2F7XUKQY1NA+gpw///zIX/dAgzyejJ4P//kIP7CHQWg/sLdBGD+wR0DEyLfCQ4RIt0JHDrMUyLvqgAAABMiXwkOEiDpqgAAAAAg/sIdRNEi7awAAAAx4awAAAAjAAAAOsFRIt0JHCD+wh1OYsNCcoAAIvRiUwkMIsFAcoAAAPIO9F9KkhjykgDyUiLhqAAAABIg2TICAD/wolUJDCLDdjJAADr0+h98P//SYkEJIX/dAczyegq3///vwgAAAA733UNi5awAAAAi89B/9XrBYvLQf/VO990CoP7C3QFg/sEdRJMib6oAAAAO991B0SJtrAAAAAzwEyNXCRASYtbOEmLc0BJi+NBX0FeQV1BXF/DzMzMSIkN2dkAAMNIiQ3h2QAAw0iJDeHZAADDSIPsOP8VBooAAESL2IlEJCDrGj0XAADAdQu5CAAAAP8Vw4kAAEUz20SJXCQgQYvDSIPEOMPMzMxIiQ2p2QAAw0BTSIPsIEiL2UiLDZjZAADos+///0iFwHQQSIvL/9CFwHQHuAEAAADrAjPASIPEIFvDzMxIg+woSIsBgThjc23gdSuDeBgEdSWLQCA9IAWTGXQVPSEFkxl0Dj0iBZMZdAc9AECZAXUG6If6///MM8BIg8Qow8zMzEiD7ChIjQ2x/////xWXiAAAM8BIg8Qow0iJXCQIV0iD7CAz/zk9dt0AAHUF6Ffr//9Iix1I3QAASI0Fu4wAAEiF20gPRNiAOyB3CYA7AHQzhf90KYA7InUJM8CF/w+UwIv4D7YL6Hbh//+FwHQDSP/DSP/D69A8IHcJSP/DigOEwHXzSIvDSItcJDBIg8QgX8PMzMxIiVwkCEiJbCQQSIl0JBhXSIPsMIM98dwAAAB1BejS6v//SIsd28wAADP/SIXbdRuDyP/pyQAAADw9dAL/x0iLy+j+BwAASI1cAwGKA4TAdeeNRwG6CAAAAEhjyOiz1///SIv4SIkFWcwAAEiFwHTASIsdjcwAAIA7AHRlSIvL6MAHAACAOz2NcAF0Q0hj7roBAAAASIvN6HjX//9IiQdIhcB0ckyLw0iL1UiLyOgGKwAAhcB0FUiDZCQgAEUzyUUzwDPSM8noXdT//0iDxwhIY8ZIA9iAOwB1okiLHSPMAABIi8vov9j//0iDJRPMAAAASIMnAMcF9dsAAAEAAAAzwEiLXCRASItsJEhIi3QkUEiDxDBfw0iLDafLAADohtj//0iDJZrLAAAA6QH////MSIvESIlYCEiJaBBIiXAYSIl4IEFUQVVBVkiD7CBMi2wkYE2L8UmL+EGDZQAATIviSIvZQccBAQAAAEiF0nQHTIkCSYPECDPtgDsidREzwIXtQLYiD5TASP/Di+jrOUH/RQBIhf90B4oDiAdI/8cPtjNI/8OLzuih3///hcB0E0H/RQBIhf90B4oDiAdI/8dI/8NAhPZ0G4Xtda1AgP4gdAZAgP4JdaFIhf90CcZH/wDrA0j/yzP2gDsAD4TjAAAAgDsgdAWAOwl1BUj/w+vxgDsAD4TLAAAATYXkdAhJiTwkSYPECEH/BroBAAAAM8nrBUj/w//BgDtcdPaAOyJ1NoTKdR2F9nQOSI1DAYA4InUFSIvY6wszwDPShfYPlMCL8NHp6xH/yUiF/3QGxgdcSP/HQf9FAIXJdeuKA4TAdE+F9nUIPCB0RzwJdEOF0nQ3D77I6MTe//9Ihf90G4XAdA6KA0j/w4gHSP/HQf9FAIoDiAdI/8frC4XAdAdI/8NB/0UAQf9FAEj/w+lZ////SIX/dAbGBwBI/8dB/0UA6RT///9NheR0BUmDJCQAQf8GSItcJEBIi2wkSEiLdCRQSIt8JFhIg8QgQV5BXUFcw8xIiVwkGEiJdCQgV0iD7DCDPfbZAAAAdQXo1+f//0iNPYDVAABBuAQBAAAzyUiL18YFctYAAAD/FVCEAABIix2p2QAASIk9mskAAEiF23QFgDsAdQNIi99IjUQkSEyNTCRARTPAM9JIi8tIiUQkIOi9/f//SGN0JEBIuf////////8fSDvxc1xIY0wkSEiD+f9zUUiNFPFIO9FySEiLyugF1P//SIv4SIXAdDhMjQTwSI1EJEhMjUwkQEiL10iLy0iJRCQg6Gf9//9Ei1wkQEiJPd/IAABB/8szwESJHc/IAADrA4PI/0iLXCRQSIt0JFhIg8QwX8PMzEiLxEiJWAhIiWgQSIlwGEiJeCBBVEiD7ECLDZXVAABFM+RJi9xBjXQkAkE7zHUy/xW/hAAASIvYSTvEdAzHBW3VAAABAAAA6yH/FfWDAACLDV/VAACD+HgPRM6JDVPVAACD+QEPhboAAABJO9x1Ff8Vf4QAAEiL2Ek7xHUHM8DpEwEAAEiL+2ZEOSN0EkgD/mZEOSd190gD/mZEOSd17kyJZCQ4TIlkJDBIK/tI0f9Mi8Mz0kSNTwEzyUSJZCQoTIlkJCD/FSKEAABIY+hBO+x0QUiLzejW0v//SIvwSTvEdDFMiWQkOEyJZCQwRI1PAUyLwzPSM8mJbCQoSIlEJCD/FeaDAABBO8R1C0iLzuid1P//SYv0SIvL/xXFgwAASIvG63M7znQJQTvMD4VM/////xWlgwAASIvYSTvED4Q6////RDggdBBI/8BEOCB1+Ej/wEQ4IHXwK8P/wEhj8EiLzuhJ0v//SIv4STvEdQ5Ii8v/FVyDAADpAP///0yLxkiL00iLyOjRHgAASIvL/xVAgwAASIvHSItcJFBIi2wkWEiLdCRgSIt8JGhIg8RAQVzDzMyJTCQISIPsKEUzwLoAEAAAM8n/FTiDAABIiQXp0wAASIXAdCNMjUQkMEG5BAAAADPSSIvIx0QkMAIAAAD/FQaDAAC4AQAAAEiDxCjDSIlcJBhXSIPsIEiLBRu1AABIg2QkMABIvzKi3y2ZKwAASDvHdAxI99BIiQUEtQAA63ZIjUwkMP8V54IAAEiLXCQw/xXUggAARIvYSTPb/xVYggAARIvYSTPb/xW0ggAASI1MJDhEi9hJM9v/FZuCAABMi1wkOEwz20i4////////AABMI9hIuDOi3y2ZKwAATDvfTA9E2EyJHY60AABJ99NMiR2MtAAASItcJEBIg8QgX8PMzMzMzMzMzMzMzMzMzMxmZg8fhAAAAAAASIHs2AQAAE0zwE0zyUiJZCQgTIlEJCjolk4AAEiBxNgEAADDzMzMzMzMZg8fRAAASIlMJAhIiVQkGESJRCQQScfBIAWTGesIzMzMzMzMZpDDzMzMzMzMZg8fhAAAAAAAw8zMzEiD7DiD+f51Dejqz///xwAJAAAA61KFyXguOw2E0wAAcyZIY8lIjRWQ0wAASIvBg+EfSMH4BUhryVhIiwTCD75ECAiD4EDrIuirz///SINkJCAARTPJRTPAM9IzyccACQAAAOjAzv//M8BIg8Q4w8xAU0iD7ECL2UiNTCQg6Cqz//9Ii0QkIEQPtttIi4hAAQAAQg+3BFklAIAAAIB8JDgAdAxIi0wkMIOhyAAAAP1Ig8RAW8PMzMxAU0iD7ECL2UiNTCQgM9Lo4LL//0iLRCQgRA+220iLiEABAABCD7cEWSUAgAAAgHwkOAB0DEiLTCQwg6HIAAAA/UiDxEBbw8zMzMzMzMzMzMzMzMzMzMzMzMxmZg8fhAAAAAAASIvBSPfZSKkHAAAAdA9mkIoQSP/AhNJ0X6gHdfNJuP/+/v7+/v5+SbsAAQEBAQEBgUiLEE2LyEiDwAhMA8pI99JJM9FJI9N06EiLUPiE0nRRhPZ0R0jB6hCE0nQ5hPZ0L0jB6hCE0nQhhPZ0F8HqEITSdAqE9nW5SI1EAf/DSI1EAf7DSI1EAf3DSI1EAfzDSI1EAfvDSI1EAfrDSI1EAfnDSI1EAfjDSIsNMbIAADPASIPJAUg5DbzQAAAPlMDDSIlcJAhmRIlMJCBVVldIg+xgM+1Ji/hIi/JIi9lIO9V1E0w7xXYOSDvNdAKJKTPA6aQAAABIO810A4MJ/0mB+P///392JOjRzf//uxYAAABFM8lFM8Az0jPJiRhIiWwkIOjmzP//i8Prb0iLlCSgAAAASI1MJEDoVLH//0yLXCRAQTlrFA+FzQAAAA+3hCSYAAAAuf8AAABmO8F2TEg79XQSSDv9dg1Mi8cz0kiLzuicqv//6GPN///HACoAAADoWM3//4sAQDhsJFh0DEiLTCRQg6HIAAAA/UiLnCSAAAAASIPEYF9eXcNIO/V0Q0g7/Xc86CTN//+7IgAAAEUzyUUzwDPSM8mJGEiJbCQg6DnM//9AOGwkWA+ESP///0iLTCRQg6HIAAAA/ek3////iAZIO910BscDAQAAAEA4bCRYD4Tn/v//SItEJFCDoMgAAAD96db+//9IjYQkiAAAAImsJIgAAABBi0sESIlEJDhIiWwkMEyNhCSYAAAAQbkBAAAAM9KJfCQoSIl0JCD/FUx+AAA7xXQWOawkiAAAAA+FD////0g73XSSiQPrjv8VhH0AAIP4eg+F9/7//0g79XQSSDv9dg1Mi8cz0kiLzuh8qf//6EPM//+7IgAAAEUzyUUzwDPSM8mJGEiJbCQg6FjL//9AOGwkWA+EZ/7//0iLRCRQg6DIAAAA/elW/v//SIPsOEiDZCQgAOjh/f//SIPEOMODJZnPAAAAw0iJXCQISIl0JBBXSIPsIEiL2UiD+eB3fL8BAAAASIXJSA9F+UiLDVnOAABIhcl1IOhj6///uR4AAADoMen//7n/AAAA6F+y//9Iiw00zgAATIvHM9L/FcF8AABIi/BIhcB1LDkFK84AAHQOSIvL6FHz//+FwHQN66vocsv//8cADAAAAOhny///xwAMAAAASIvG6xLoK/P//+hSy///xwAMAAAAM8BIi1wkMEiLdCQ4SIPEIF/DzMxIiVwkCEiJdCQQV0iD7CBIi9pIi/lIhcl1CkiLyugm////62pIhdJ1B+iSzf//61xIg/rgd0NIiw2PzQAAuAEAAABIhdtID0TYTIvHM9JMi8v/FeV8AABIi/BIhcB1bzkFd80AAHRQSIvL6J3y//+FwHQrSIP74Ha9SIvL6Ivy///ossr//8cADAAAADPASItcJDBIi3QkOEiDxCBfw+iVyv//SIvY/xWoewAAi8joPcr//4kD69XofMr//0iL2P8Vj3sAAIvI6CTK//+JA0iLxuu7zEiJXCQISIl0JBBXSIPsMDP/SIvaSIvxSIXSdDEz0kiNR+BI9/NJO8BzI+g1yv//SCF8JCBFM8lFM8Az0jPJxwAMAAAA6EvJ//8zwOs9SQ+v2EiFyXQI6B0lAABIi/hIi9NIi87ow/7//0iL8EiFwHQWSDv7cxFIK99IjQwHM9JMi8PoEaf//0iLxkiLXCRASIt0JEhIg8QwX8PMzEiJXCQIV0iD7DCDz/9Ii9lIhcl1I+iuyf//SCFcJCBFM8lFM8Az0jPJxwAWAAAA6MTI//8Lx+tG9kEYg3Q66P3M//9Ii8uL+OgPKgAASIvL6DvH//+LyOjoKAAAhcB5BYPP/+sTSItLKEiFyXQK6N3L//9Ig2MoAINjGACLx0iLXCRASIPEMF/DzMzMSIlcJBBIiUwkCFdIg+wwSIvZg8//M8BIhckPlcCFwHUk6BbJ///HABYAAABIg2QkIABFM8lFM8Az0jPJ6CvI//+Lx+sm9kEYQHQGg2EYAOsY6K6k//+QSIvL6BX///+L+EiLy+grpf//i8dIi1wkSEiDxDBfw8zMSIlcJCBVVldBVEFVQVZBV7gwGwAA6N5qAABIK+BIiwWkrAAASDPESImEJCAbAAAz7TP/RYvoTIviSGPZiWwkQEWFwHUHM8Dp5wYAAEiF0nUu6I7I//8hOOhnyP//SCF8JCBFM8lFM8Az0jPJxwAWAAAA6H3H//+DyP/ptAYAAEyL+0yL80iNBfzLAABJwf4FQYPnH0qLDPBMiXQkUE1r/1hBinQPOEAC9kDQ/kCA/gJ0BkCA/gF1CUGLxffQqAF0kEH2RA8IIHQNM9KLy0SNQgLomh4AAIvL6O/3//+FwA+E8QIAAEiNBZzLAABKiwTwQfZEBwiAD4TaAgAA6Mfg//8z20iNVCRYSIuIwAAAAEiNBXLLAAA5WRRKiwzwSYsMDw+Uw/8VrnkAAIXAD4SkAgAAhdt0CUCE9g+ElwIAAP8Vi3kAACF8JExJi9yJRCRYRYXtD4R3AgAARIt0JFi9DQAAAECE9g+FgwEAAEiLVCRQigtFM/aA+QpIjS0IywAASItU1QBBD5TGQYN8F1AAdCBBikQXTIhMJF1BuAIAAACIRCRcQYNkF1AASI1UJFzrSQ++yejL9///hcB0NEmLxUgrw0kDxEiD+AEPjs8BAABIjUwkREG4AgAAAEiL0+g1KgAAg/j/D4R2AQAASP/D6xxBuAEAAABIi9NIjUwkROgUKgAAg/j/D4RVAQAASINkJDgASINkJDAAi0wkWEiNRCRcTI1EJERBuQEAAAAz0sdEJCgFAAAASP/DSIlEJCD/FUN4AACL6IXAD4QTAQAASItEJFBIg2QkIABIjQ0nygAASIsMwUyNTCRMSI1UJFxJiwwPRIvF/xXcdwAAhcAPhEIBAACL+0Er/AN8JEA5bCRMD4zLAAAAvQ0AAABFhfYPhK8AAABIi0QkUEiDZCQgAECIbCRcSI0NzMkAAEyNTCRMRI1F9EiLDMFIjVQkXEmLDA//FYB3AACFwA+E5gAAAIN8JEwBfHv/RCRA/8frZUCA/gF0BkCA/gJ1Fw+3A0Uz9maD+ApmiUQkREEPlMZIg8MCQID+AXQGQID+AnU2D7dMJEToaCYAAGY7RCRED4WTAAAAg8cCRYX2dBmLzWaJbCRE6EkmAABmO0QkRHV4/8f/RCRAi8NBK8RBO8UPggH+//+LXCRMTIt0JFCLbCRAhf8PhbgDAACF2w+EegMAAIP7BQ+FZQMAAOg3xf//xwAJAAAA6EzF//+JGOnY/P//igNMi3QkUP/HSotM9QBBiEQPTEqLRPUAQcdEB1ABAAAAi1wkTOul/xUUdgAAi9jrlotcJEzroUiNBavIAABKiwzwQfZEDwiAD4TKAgAAM9tJi+xAhPYPhdAAAABFhe0PhPwCAACNUw1Ei3QkQEiNtCQgBwAAM8mLxUErxEE7xXMmikUASP/FPAp1C4gWQf/GSP/GSP/BSP/BiAZI/8ZIgfn/EwAActBIIVwkIEiNhCQgBwAARIvGRCvASI0FKMgAAESJdCRATIt0JFBMjUwkSEiNlCQgBwAASosM8EmLDA//FdN1AACFwHQ1A3wkSEiNhCQgBwAASCvwSGNEJEhIO8YPjMX+//+LxboNAAAAQSvEQTvFD4JO////6a3+////FRx1AACL2Omg/v//QID+Ag+F1AAAAEWF7Q+EIgIAALoNAAAARIt0JEBIjbQkIAcAADPJi8VBK8RBO8VzMQ+3RQBIg8UCZoP4CnUPZokWQYPGAkiDxgJIg8ECSIPBAmaJBkiDxgJIgfn+EwAAcsVIIVwkIEiNhCQgBwAARIvGRCvASI0FQccAAESJdCRATIt0JFBMjUwkSEiNlCQgBwAASosM8EmLDA//Fex0AACFwA+ESv///wN8JEhIjYQkIAcAAEgr8EhjRCRISDvGD4za/f//i8W6DQAAAEErxEE7xQ+CP////+nC/f//RYXtD4ROAQAAQbgNAAAASI1MJHAz0ovFQSvEQTvFcy4Pt0UASIPFAmaD+Ap1DGZEiQFIg8ECSIPCAkiDwgJmiQFIg8ECSIH6qAYAAHLISINkJDgASINkJDAASI1EJHAryEyNRCRwx0QkKFUNAACLwbnp/QAAmSvCM9LR+ESLyEiNhCQgBwAASIlEJCD/FU10AABEi/CFwA+EgP3//zP2SItEJFBIg2QkIABIY85IjZQMIAcAAEWLxkiNDSDGAABIiwzBTI1MJEhEK8ZJiwwP/xXacwAAhcB0CwN0JEhEO/Z/vesI/xVNcwAAi9hEO/YPj8j8//+L/UG4DQAAAEEr/EE7/Q+CBv///+mv/P//SYsMD0ghfCQgTI1MJEhFi8VJi9T/FYdzAACFwHQLi3wkSDPb6Y/8////FfpyAACL2OmC/P//i8voEML//+l++f//SI0FiMUAAEqLBPBB9kQHCEB0C0GAPCQaD4Qu+f//6KjB///HABwAAADovcH//4MgAOlI+f//K/2Lx0iLjCQgGwAASDPM6BWl//9Ii5wkiBsAAEiBxDAbAABBX0FeQV1BXF9eXcPMzEiJXCQQSIl0JBiJTCQIV0FUQVVBVkFXSIPsMEWL4EyL6khj2YP7/nUc6FbB//8z/4k46C3B///HAAkAAACDyP/p1AAAADP/O98PjKEAAAA7HbvEAAAPg5UAAABIi/NMi/NJwf4FTI09vMQAAIPmH0hr9lhLiwT3D75MMAiD4QF1K+j+wP//iTjo18D//8cACQAAAEiJfCQgRTPJRTPAM9Izyejtv///g8j/622Ly+j1JQAAkEuLBPf2RDAIAXQRRYvESYvVi8vo1Pf//4v46xXoj8D//8cACQAAAOikwP//iTiDz/+Ly+hkJgAAi8frKeiPwP//iTjoaMD//8cACQAAAEiJfCQgRTPJRTPAM9Izyeh+v///g8j/SItcJGhIi3QkcEiDxDBBX0FeQV1BXF/DzMzMSIlcJBiJTCQIVldBVEiD7DBIY/mD//51E+gSwP//xwAJAAAAg8j/6dkAAACFyQ+IrgAAADs9osMAAA+DogAAAEiL30iL90jB/gVMjSWjwwAAg+MfSGvbWEmLBPQPvkwYCIPhAXUl6MW////HAAkAAABIg2QkIABFM8lFM8Az0jPJ6Nq+//+DyP/reovP6OIkAACQSYsE9PZEGAgBdCuLz+hLJAAASIvI/xWecQAAhcB1Cv8VlHAAAIvY6wIz24XbdBXoib///4kY6GK////HAAkAAACDy/+Lz+g+JQAAi8PrI+hJv///xwAJAAAASINkJCAARTPJRTPAM9Izyehevv//g8j/SItcJGBIg8QwQVxfXsPMSIlcJAhXSIPsUEiL2kiL+UiFyXUk6AK///9Ig2QkIABFM8lFM8Az0jPJxwAWAAAA6Be+//8zwOt2SIXSdNdIO8pz8kiNTCQwSYvQ6ICi//9Mi1wkOEGDewgAdRmAfCRIAEiNQ/90SEiLTCRAg6HIAAAA/es6SI1T/0j/ykg7+ncLD7YCQvZEGB0Ede1Ii8tIK8qD4QFIK9mAfCRIAHQMSItMJECDocgAAAD9SI1D/0iLXCRgSIPEUF/DzMxFM8DpPP///0iJXCQISIlsJBBIiXQkGFdBVEFVSIPsUEUz7UmL+UmL8EiL6kiL2U07zXUOSTvNdQ5JO9V1IDPA6z5JO810F0k71XYSTTvNdQVEiCnr6E07xXU/RIgp6P29//+7FgAAAEUzyUUzwDPSM8mJGEyJbCQg6BK9//+Lw0yNXCRQSYtbIEmLayhJi3MwSYvjQV1BXF/DSIuUJJAAAABIjUwkMOhoof//TItcJDhIi9VIi8tFOWsIdSBMi89Mi8boWBEAAEQ4bCRIdLFIi0wkQIOhyAAAAP3ro0iD//91F4oGSP/GiAFI/8FBOsV0LkiD6gF16+smigZI/8aIAUj/wUE6xXQMSIPqAXQGSIPvAXXlSTv9dQZEiClI/8FJO9UPhQUBAABEOC50BkiD/wF1WUyNYf9Ji/RMO+NyGg+2DkiNVCQw6CfH//9BO8V0CEj/zkg783PmQYvEK8aoAXQqRYgsJOj0vP//uioAAACJEEQ4bCRIdAxIi0wkQIOhyAAAAP2Lwunz/v//SIP//3VcSIP9AXZPSI10K/5Ii/5IO/NyGg+2D0iNVCQw6MHG//9BO8V0CEj/z0g7+3Pmi8Yrx6gBdCBEiC5EOGwkSHQMSItEJECDoMgAAAD9uFAAAADpmP7//0SIbCv/69xEiCvoabz//7siAAAARTPJRTPAM9IzyYkYTIlsJCDofrv//0Q4bCRID4Rh/v//SItMJECDocgAAAD96VD+//9Ii8FIK8NIg/gCfFlIjXH+SIv+SDvzchoPtg9IjVQkMOghxv//QTvFdAhI/89IO/tz5ovGK8eoAXQrRIgu6PC7//+6KgAAAIkQRDhsJEgPhAT///9Ii0QkQIOgyAAAAP3p8/7//0Q4bCRID4Sg/f//SItEJECDoMgAAAD96Y/9///MQFVBVEFVQVZBV0iD7GBIjWwkQEiJXVBIiXVYSIl9YEiLBY6fAABIM8VIiUUYRIsVJL4AAL4CAAAAM/9Ni9lMiU0QRIlFAESL8olVCEiL2USNbv9EO9d1T0yNBYF3AABFi826AAEAADPJiXwkKEiJfCQg/xVsbQAAO8d0DEWL1USJLdK9AADrG/8VPmwAAESLFcO9AACD+HhED0TWRIkVtb0AAEyLXRBEi01wRDvPfjVBi8lJi8NBK81AODh0CkkDxTvPdfGDyf9Bi8ErwUErxUE7wX0KRI1IAUSJTXDrBkSLyIlFcEQ71g+EXAIAAEQ71w+EUwIAAEU71Q+FgAIAAESLpYgAAACL90Q753UHSIsDRItgBPedkAAAAE2Lw0GLzBvSiXwkKEiJfCQgg+IIQQPV/xWkbAAATGP4RDv/D4Q8AgAASLvw////////D0G+3d0AAEG9AAQAAH5bM9JIjULgSff3SIP4AnJMS41MPxBJO813LkiNQQ9IO8F3A0iLw0iD4PDoWlwAAEgr4EiNfCRASIX/D4TlAQAAxwfMzAAA6xDoGO7//0iL+EiFwHQHRIkwSIPHEEiF/w+EwAEAAESLTXBMi0UQugEAAABBi8xEiXwkKEiJfCQg/xX8awAAM8k7wQ+ESwEAAItVAIlMJChIiUwkIItNCEWLz0yLx/8V32sAAEUzwEhj8EE78A+EIQEAAESLVQBBD7riCnM7i4WAAAAAQTvAD4QHAQAAO/APj/8AAACLTQiJRCQoSItFeEWLz0yLx0GL0kiJRCQg/xWPawAA6dsAAABBO/B+YDPSSI1C4Ej39kiD+AJyUUiNTDYQSTvNdypIjUEPSDvBdwNIi8NIg+Dw6FdbAABIK+BIjVwkQEk72HQfxwPMzAAA6xPoGe3//0UzwEiL2Ek7wHQHRIkwSIPDEESLVQDrA0mL2Ek72HRui00IRYvPTIvHQYvSiXQkKEiJXCQg/xUCawAAM8k7wXQ/i4WAAAAAM9JIiUwkOESLzkyLw0iJTCQwO8F1C4lMJChIiUwkIOsNiUQkKEiLRXhIiUQkIEGLzP8VT2oAAIvwSI1L8EQ5MXUF6AO7//9IjU/wRDkxdQXo9br//4vG6c0BAABIi/dMi+dEO/d1C0iLA0SLcBREiXUIi72IAAAAhf91BkiLA4t4BEGLzuhoIAAARIvog/j/dQczwOmQAQAATIt9eEyLRRA7xw+EPAEAADPbTI1NcIvQi8+JXCQoSIlcJCDohSAAAEiL8Eg7w3TJRItNcItVAEyLwEGLzolcJChIiVwkIP8VAWoAAExjyESJTQREO8t1B4v76RABAABEO8tBvt3dAAB+YkmLyUmD+eB3WUiDwRBIgfkABAAAdzRIjVkPSDvZdwpIu/D///////8PSIPj8EiLw+i+WQAASCvjSI1cJEBIhdt0JccDzMwAAOsQ6IDr//9Ii9hIhcB0B0SJMEiDwxBEi00ESIXbdQQz2+uDTWPBM9JIi8voe5T//0SLXQREi01wi1UAi00IRIlcJChMi8ZIiVwkIP8VSmkAAIlFBIXAdQQz/+sui4WAAAAATI1NBEyLw4lEJCiL10GLzUyJfCQg6H8fAACLfQRMi+AzwEw74A9E+EiNS/BEOTF1KOhnuf//6yGLhYAAAABEi01wi1UAiUQkKEGLzkyJfCQg/xXiaAAAi/gz20g783QISIvO6DW5//9MO+N0DU07/HQISYvM6CO5//+Lx0iLTRhIM83oIZr//0iLXVBIi3VYSIt9YEiNZSBBX0FeQV1BXF3DzMzMSIlcJAhIiXQkEFdIg+xwi/JIi9FIjUwkUEmL2UGL+OgAmv//i4QkuAAAAESLnCTAAAAASI1MJFBEiVwkQIlEJDiLhCSwAAAAiUQkMEiLhCSoAAAATIvLSIlEJCiLhCSgAAAARIvHi9aJRCQg6E/6//+AfCRoAHQMSItMJGCDocgAAAD9TI1cJHBJi1sQSYtzGEmL41/DzMxEiUwkIFVBVEFVQVZBV0iD7EBIjWwkMEiJXUBIiXVISIl9UEiLBbKZAABIM8VIiUUIRIsNTLgAAL8BAAAAM9tNi/BEi/pMi+mNdwFEO8t1PUyNTQBIjRWtcQAARIvHi8//FbZnAAA7w3QIiT0UuAAA6zb/FXxmAABEiw0FuAAAg/h4RA9EzkSJDfe3AABEO84PhCYBAABEO8sPhB0BAABEO88PhUMBAACLdWg783UHSYtFAItwBPddeESLTVhNi8Yb0ovOiVwkKIPiCEiJXCQgA9f/FSxnAABMY+BEO+MPhAcBAABBvd3dAAB+aEi48P///////39MO+B3WUuNTCQQSIH5AAQAAHc1SI1BD0g7wXcKSLjw////////D0iD4PDo51YAAEgr4EiNfCQwSDv7D4S1AAAAxwfMzAAA6xDopej//0iL+Eg7w3QMRIkoSIPHEOsDSIv7SDv7D4SLAAAATYvEM9JIi89NA8DonJH//0SLTVhNi8a6AQAAAIvORIlkJChIiXwkIP8VdmYAADvDdBVMi01gRIvASIvXQYvP/xV3ZgAAi9hIjU/wRDkpdQXoq7b//4vD6YgAAABEi2VwSIv7RDvjdQhJi0UARItgFIt1aDvzdQdJi0UAi3AEQYvM6CIcAACD+P91BDPA61U7xnQkTI1NWE2LxovQi86JXCQoSIlcJCDoUBwAAEiL+Eg7w3TXTIvwSItFYESLTVhNi8ZBi9dBi8xIiUQkIP8V4WUAAIvwSDv7dAhIi8/oHrb//4vGSItNCEgzzegcl///SItdQEiLdUhIi31QSI1lEEFfQV5BXUFcXcPMzEiJXCQISIl0JBBXSIPsYIvySIvRSI1MJEBBi9lJi/jo/Jb//4uEJKAAAABEi5wkqAAAAEiNTCRARIlcJDiJRCQwi4QkmAAAAIlEJChIi4QkkAAAAESLy0yLx4vWSIlEJCDoLv3//4B8JFgAdAxIi0wkUIOhyAAAAP1Ii1wkcEiLdCR4SIPEYF/DzMzMzMzMzMzMzMzMzGZmDx+EAAAAAABMi9lIK9EPgp4BAABJg/gIcmH2wQd0NvbBAXQLigQKSf/IiAFI/8H2wQJ0D2aLBApJg+gCZokBSIPBAvbBBHQNiwQKSYPoBIkBSIPBBE2LyEnB6QV1UU2LyEnB6QN0FEiLBApIiQFIg8EISf/JdfBJg+AHTYXAdQhJi8PDDx9AAIoECogBSP/BSf/IdfNJi8PDZmZmZmZmZg8fhAAAAAAAZmZmkGZmkEmB+QAgAABzQkiLBApMi1QKCEiDwSBIiUHgTIlR6EiLRArwTItUCvhJ/8lIiUHwTIlR+HXUSYPgH+lx////ZmZmDx+EAAAAAABmkEiB+gAQAABytbggAAAADxgECg8YRApASIHBgAAAAP/IdexIgekAEAAAuEAAAABMiwwKTItUCghMD8MJTA/DUQhMi0wKEEyLVAoYTA/DSRBMD8NRGEyLTAogTItUCihIg8FATA/DSeBMD8NR6EyLTArwTItUCvj/yEwPw0nwTA/DUfh1qkmB6AAQAABJgfgAEAAAD4Nx////8IAMJADpuf7//2ZmZmYPH4QAAAAAAGZmZpBmZmaQZpBJA8hJg/gIcmH2wQd0NvbBAXQLSP/JigQKSf/IiAH2wQJ0D0iD6QJmiwQKSYPoAmaJAfbBBHQNSIPpBIsECkmD6ASJAU2LyEnB6QV1UE2LyEnB6QN0FEiD6QhIiwQKSf/JSIkBdfBJg+AHTYXAdQdJi8PDDx8ASP/JigQKSf/IiAF180mLw8NmZmZmZmZmDx+EAAAAAABmZmaQZmaQSYH5ACAAAHNCSItECvhMi1QK8EiD6SBIiUEYTIlREEiLRAoITIsUCkn/yUiJQQhMiRF11UmD4B/pc////2ZmZmYPH4QAAAAAAGaQSIH6APD//3e1uCAAAABIgemAAAAADxgECg8YRApA/8h17EiBwQAQAAC4QAAAAEyLTAr4TItUCvBMD8NJ+EwPw1HwTItMCuhMi1QK4EwPw0noTA/DUeBMi0wK2EyLVArQSIPpQEwPw0kYTA/DURBMi0wKCEyLFAr/yEwPw0kITA/DEXWqSYHoABAAAEmB+AAQAAAPg3H////wgAwkAOm6/v//SIXJD4TgAQAAU0iD7CBIi9lIi0kI6Aay//9Ii0sQ6P2x//9Ii0sY6PSx//9Ii0sg6Oux//9Ii0so6OKx//9Ii0sw6Nmx//9Iiwvo0bH//0iLS0DoyLH//0iLS0jov7H//0iLS1DotrH//0iLS1jorbH//0iLS2DopLH//0iLS2jom7H//0iLSzjokrH//0iLS3DoibH//0iLS3jogLH//0iLi4AAAADodLH//0iLi4gAAADoaLH//0iLi5AAAADoXLH//0iLi5gAAADoULH//0iLi6AAAADoRLH//0iLi6gAAADoOLH//0iLi7AAAADoLLH//0iLi7gAAADoILH//0iLi8AAAADoFLH//0iLi8gAAADoCLH//0iLi9AAAADo/LD//0iLi9gAAADo8LD//0iLi+AAAADo5LD//0iLi+gAAADo2LD//0iLi/AAAADozLD//0iLi/gAAADowLD//0iLiwABAADotLD//0iLiwgBAADoqLD//0iLixABAADonLD//0iLixgBAADokLD//0iLiyABAADohLD//0iLiygBAADoeLD//0iLizABAADobLD//0iLizgBAADoYLD//0iLi0ABAADoVLD//0iLi0gBAADoSLD//0iLi1ABAADoPLD//0iDxCBbw8zMSIXJdEJTSIPsIEiL2UiLCUg7DSmgAAB0BegWsP//SItLCEg7DR+gAAB0BegEsP//SItLEEg7DRWgAAB0Bejyr///SIPEIFvDSIXJD4SLAAAAU0iD7CBIi9lIi0kYSDsN9J8AAHQF6Mmv//9Ii0sgSDsN6p8AAHQF6Lev//9Ii0soSDsN4J8AAHQF6KWv//9Ii0swSDsN1p8AAHQF6JOv//9Ii0s4SDsNzJ8AAHQF6IGv//9Ii0tASDsNwp8AAHQF6G+v//9Ii0tISDsNuJ8AAHQF6F2v//9Ig8QgW8PMzMxAU0iD7DBMi8lIhcl0DUiF0nQITYXAdSxEiAHorKz//7sWAAAASINkJCAARTPJRTPAM9IzyYkY6MCr//+Lw0iDxDBbw4A5AHQJSP/BSIPqAXXySIXSdQVBiBHrv0GKAEn/wIgBSP/BhMB0BkiD6gF160iF0nUPQYgR6E6s//+7IgAAAOugM8DrtczMzEBTSIPsME2L2E2FyXUOSIXJdQ5IhdJ1IDPA6z9Ihcl0F0iF0nQSTYXJdQVEiAnr6E2FwHUsRIgB6AOs//+7FgAAAEiDZCQgAEUzyUUzwDPSM8mJ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IHRoZSBhcHBsaWNhdGlvbidzIHN1cHBvcnQgdGVhbSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4NCgAAAAAAAFI2MDMzDQotIEF0dGVtcHQgdG8gdXNlIE1TSUwgY29kZSBmcm9tIHRoaXMgYXNzZW1ibHkgZHVyaW5nIG5hdGl2ZSBjb2RlIGluaXRpYWxpemF0aW9uClRoaXMgaW5kaWNhdGVzIGEgYnVnIGluIHlvdXIgYXBwbGljYXRpb24uIEl0IGlzIG1vc3QgbGlrZWx5IHRoZSByZXN1bHQgb2YgY2FsbGluZyBhbiBNU0lMLWNvbXBpbGVkICgvY2xyKSBmdW5jdGlvbiBmcm9tIGEgbmF0aXZlIGNvbnN0cnVjdG9yIG9yIGZyb20gRGxsTWFpbi4NCgAAUjYwMzINCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgbG9jYWxlIGluZm9ybWF0aW9uDQoAAAAAAABSNjAzMQ0KLSBBdHRlbXB0IHRvIGluaXRpYWxpemUgdGhlIENSVCBtb3JlIHRoYW4gb25jZS4KVGhpcyBpbmRpY2F0ZXMgYSBidWcgaW4geW91ciBhcHBsaWNhdGlvbi4NCgAAAAAAAFI2MDMwDQotIENSVCBub3QgaW5pdGlhbGl6ZWQNCgAAUjYwMjgNCi0gdW5hYmxlIHRvIGluaXRpYWxpemUgaGVhcA0KAAAAAFI2MDI3DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGxvd2lvIGluaXRpYWxpemF0aW9uDQoAAAAAUjYwMjYNCi0gbm90IGVub3VnaCBzcGFjZSBmb3Igc3RkaW8gaW5pdGlhbGl6YXRpb24NCgAAAABSNjAyNQ0KLSBwdXJlIHZpcnR1YWwgZnVuY3Rpb24gY2FsbA0KAAAAUjYwMjQNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgX29uZXhpdC9hdGV4aXQgdGFibGUNCgAAAABSNjAxOQ0KLSB1bmFibGUgdG8gb3BlbiBjb25zb2xlIGRldmljZQ0KAAAAAAAAAABSNjAxOA0KLSB1bmV4cGVjdGVkIGhlYXAgZXJyb3INCgAAAAAAAAAAUjYwMTcNCi0gdW5leHBlY3RlZCBtdWx0aXRocmVhZCBsb2NrIGVycm9yDQoAAAAAUjYwMTYNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgdGhyZWFkIGRhdGENCgAAAAAAAAAAAAAAAAANClRoaXMgYXBwbGljYXRpb24gaGFzIHJlcXVlc3RlZCB0aGUgUnVudGltZSB0byB0ZXJtaW5hdGUgaXQgaW4gYW4gdW51c3VhbCB3YXkuClBsZWFzZSBjb250YWN0IHRoZSBhcHBsaWNhdGlvbidzIHN1cHBvcnQgdGVhbSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4NCgAAAFI2MDA5DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGVudmlyb25tZW50DQoAAAAAAFI2MDA4DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGFyZ3VtZW50cw0KAAAAAAAAAFI2MDAyDQotIGZsb2F0aW5nIHBvaW50IHN1cHBvcnQgbm90IGxvYWRlZA0KAAAAAE1pY3Jvc29mdCBWaXN1YWwgQysrIFJ1bnRpbWUgTGlicmFyeQAAAAAKCgAALi4uADxwcm9ncmFtIG5hbWUgdW5rbm93bj4AAFJ1bnRpbWUgRXJyb3IhCgpQcm9ncmFtOiAAAAAAAAAABQAAwAsAAAAAAAAAAAAAAB0AAMAEAAAAAAAAAAAAAACWAADABAAAAAAAAAAAAAAAjQAAwAgAAAAAAAAAAAAAAI4AAMAIAAAAAAAAAAAAAACPAADACAAAAAAAAAAAAAAAkAAAwAgAAAAAAAAAAAAAAJEAAMAIAAAAAAAAAAAAAACSAADACAAAAAAAAAAAAAAAkwAAwAgAAAAAAAAAAAAAAAaAgIaAgYAAABADhoCGgoAUBQVFRUWFhYUFAAAwMIBQgIgACAAoJzhQV4AABwA3MDBQUIgAAAAgKICIgIAAAABgaGBoaGgICAd4cHB3cHAICAAACAAIAAcIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgACAAIAAgACAAIAAgACAAIAAoACgAKAAoACgAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAASAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACEAIQAhACEAIQAhACEAIQAhACEABAAEAAQABAAEAAQABAAgQCBAIEAgQCBAIEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABAAEAAQABAAEAAQAIIAggCCAIIAggCCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAQABAAEAAQACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgACAAIAAgACAAIAAgACAAaAAoACgAKAAoACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAEgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAhACEAIQAhACEAIQAhACEAIQAhAAQABAAEAAQABAAEAAQAIEBgQGBAYEBgQGBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEQABAAEAAQABAAEACCAYIBggGCAYIBggECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBEAAQABAAEAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIABIABAAEAAQABAAEAAQ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BFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcgAAIwRTZXRVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIA0AJJc0RlYnVnZ2VyUHJlc2VudACfA1J0bFZpcnR1YWxVbndpbmQAAJgDUnRsTG9va3VwRnVuY3Rpb25FbnRyeQAAkQNSdGxDYXB0dXJlQ29udGV4dADnAUdldExhc3RFcnJvcgAApgJIZWFwRnJlZQAAogJIZWFwQWxsb2MAXQFHZXRDUEluZm8AVAFHZXRBQ1AAABQCR2V0T0VNQ1AAANoCSXNWYWxpZENvZGVQYWdlANcARW5jb2RlUG9pbnRlcgC5AERlY29kZVBvaW50ZXIAQAFGbHNHZXRWYWx1ZQBBAUZsc1NldFZhbHVlAD8BRmxzRnJlZQD4A1NldExhc3RFcnJvcgAArwFHZXRDdXJyZW50VGhyZWFkSWQAAD4BRmxzQWxsb2MAAJsEV3JpdGVGaWxlAPACTG9hZExpYnJhcnlBAAC6AkluaXRpYWxpemVDcml0aWNhbFNlY3Rpb25BbmRTcGluQ291bnQATAFGcmVlRW52aXJvbm1lbnRTdHJpbmdzQQDBAUdldEVudmlyb25tZW50U3RyaW5ncwBNAUZyZWVFbnZpcm9ubWVudFN0cmluZ3NXAIgEV2lkZUNoYXJUb011bHRpQnl0ZQDDAUdldEVudmlyb25tZW50U3RyaW5nc1cAAKoCSGVhcFNldEluZm9ybWF0aW9uAACkAkhlYXBDcmVhdGUAAFMDUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIAagJHZXRUaWNrQ291bnQAAKwBR2V0Q3VycmVudFByb2Nlc3NJZABTAkdldFN5c3RlbVRpbWVBc0ZpbGVUaW1lAKkCSGVhcFJlQWxsb2MAhQFHZXRDb25zb2xlQ1AAAJcBR2V0Q29uc29sZU1vZGUAAEMBRmx1c2hGaWxlQnVmZmVycwAA4AJMQ01hcFN0cmluZ0EAABkDTXVsdGlCeXRlVG9XaWRlQ2hhcgDiAkxDTWFwU3RyaW5nVwAAQAJHZXRTdHJpbmdUeXBlQQAAQwJHZXRTdHJpbmdUeXBlVwAA6QFHZXRMb2NhbGVJbmZvQQAA7ANTZXRGaWxlUG9pbnRlcgAAqwJIZWFwU2l6ZQAARABDbG9zZUhhbmRsZQCQBFdyaXRl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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYWJjZGVmZ2hp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/f//iYXw/f//iYXM/f//iYXo/f//iYXQ/f//iYXA/f//iYXI/f//6Pf2//+F9nU16E0PAADHABYAAAAzwFBQUFBQ6NMOAACDxBSAvbD9//8AdAqLhaz9//+DYHD9g8j/6cgKAAD2RgxAdV5W6EANAABZupgSQQCD+P90G4P4/nQWi8iD4R+L8MH+BcHhBgMMtaAqQQDrAovK9kEkf3WRg/j/dBmD+P50FIvIg+AfwfkFweAGAwSNoCpBAOsCi8L2QCSAD4Vn////M8k72Q+EXf///4oTiY3Y/f//iY3g/f//iY28/f//iJXv/f//hNIPhB8KAABDg73Y/f//AImdxP3//w+MCwoAAIrCLCA8WHcRD77CD76AWOJAAIPgDzP26wQz9jPAD76EwXjiQABqB8H4BFmJhZT9//87wQ+HrQkAAP8khQszQACDjej9////ibWQ/f//ibXA/f//ibXM/f//ibXQ/f//ibXw/f//ibXI/f//6XYJAAAPvsKD6CB0SoPoA3Q2g+gIdCVISHQVg+gDD4VXCQAAg43w/f//COlLCQAAg43w/f//BOk/CQAAg43w/f//AekzCQAAgY3w/f//gAAAAOkkCQAAg43w/f//AukYCQAAgPoqdSyDxwSJvdz9//+Lf/w7/om9zP3//w+N+QgAAION8P3//wT3ncz9///p5wgAAIuFzP3//2vACg++yo1ECNCJhcz9///pzAgAAIm16P3//+nBCAAAgPoqdSaDxwSJvdz9//+Lf/w7/om96P3//w+NoggAAION6P3////plggAAIuF6P3//2vACg++yo1ECNCJhej9///pewgAAID6SXRVgPpodESA+mx0GID6dw+FYwgAAIGN8P3//wAIAADpVAgAAIA7bHUWQ4GN8P3//wAQAACJncT9///pOQgAAION8P3//xDpLQgAAION8P3//yDpIQgAAIoDPDZ1HYB7ATR1F0NDgY3w/f//AIAAAImdxP3//+n+BwAAPDN1HYB7ATJ1F0NDgaXw/f///3///4mdxP3//+ndBwAAPGQPhNUHAAA8aQ+EzQcAADxvD4TFBwAAPHUPhL0HAAA8eA+EtQcAADxYD4StBwAAibWU/f//jYWk/f//UA+2wlCJtcj9///oCD0AAFmFwIqF7/3//1l0IouNtP3//4212P3//+ik+///igNDiZ3E/f//hMAPhKT8//+LjbT9//+Ntdj9///ogvv//+lNBwAAD77Cg/hkD4/oAQAAD4R5AgAAg/hTD4/yAAAAD4SAAAAAg+hBdBBISHRYSEh0CEhID4WSBQAAgMIgx4WQ/f//AQAAAIiV7/3//4ON8P3//0A5tej9//+NnfT9//+4AAIAAImd5P3//4mFoP3//w+NSAIAAMeF6P3//wYAAADppQIAAPeF8P3//zAIAAAPhZgAAACBjfD9//8ACAAA6YkAAAD3hfD9//8wCAAAdQqBjfD9//8ACAAAi43o/f//g/n/dQW5////f4PHBPeF8P3//xAIAACJvdz9//+Lf/yJveT9//8PhLEEAAA7/nULoZQSQQCJheT9//+LheT9///Hhcj9//8BAAAA6X8EAACD6FgPhNoCAABISHR5K8EPhCf///9ISA+FngQAAIPHBPeF8P3//xAIAACJvdz9//90MA+3R/xQaAACAACNhfT9//9QjYXg/f//UOhLOwAAg8QQhcB0H8eFwP3//wEAAADrE4pH/IiF9P3//8eF4P3//wEAAACNhfT9//+JheT9///pNQQAAIsHg8cEib3c/f//O8Z0O4tIBDvOdDT3hfD9//8ACAAAD78AiY3k/f//dBSZK8LR+MeFyP3//wEAAADp8AMAAIm1yP3//+nlAwAAoZASQQCJheT9//9Q6MI4AABZ6c4DAACD+HAPj/sBAAAPhOMBAACD+GUPjLwDAACD+GcPjjT+//+D+Gl0cYP4bnQog/hvD4WgAwAA9oXw/f//gMeF4P3//wgAAAB0YYGN8P3//wACAADrVYs3g8cEib3c/f//6Do4AACFwA+EL/r///aF8P3//yB0DGaLhdj9//9miQbrCIuF2P3//4kGx4XA/f//AQAAAOmmBAAAg43w/f//QMeF4P3//woAAACLjfD9///3wQCAAAAPhKkBAACLB4tXBIPHCOnVAQAAdRGA+md1ZceF6P3//wEAAADrWTmF6P3//34GiYXo/f//gb3o/f//owAAAH4/i7Xo/f//gcZdAQAAVugiCwAAipXv/f//WYmFvP3//4XAdBCJheT9//+JtaD9//+L2OsKx4Xo/f//owAAADP2iweDxwiJhYj9//+LR/yJhYz9//+NhaT9//9Q/7WQ/f//D77C/7Xo/f//ib3c/f//UP+1oP3//42FiP3//1NQ/zVYHEEA6EEgAABZ/9CLvfD9//+DxByB54AAAAB0IDm16P3//3UYjYWk/f//UFP/NWQcQQDoEiAAAFn/0FlZgL3v/f//Z3UcO/51GI2FpP3//1BT/zVgHEEA6O0fAABZ/9BZWYA7LXURgY3w/f//AAEAAEOJneT9//9T6QP+///Hhej9//8IAAAAiY24/f//6ySD6HMPhLb8//9ISA+Eif7//4PoAw+FtgEAAMeFuP3//ycAAAD2hfD9//+Ax4Xg/f//EAAAAA+Eaf7//4qFuP3//wRRxoXU/f//MIiF1f3//8eF0P3//wIAAADpRf7///fBABAAAA+FS/7//4PHBPbBIHQYib3c/f//9sFAdAYPv0f86wQPt0f8mesTi0f89sFAdAOZ6wIz0om93P3///bBQHQbO9Z/F3wEO8ZzEffYg9IA99qBjfD9//8AAQAA94Xw/f//AJAAAIvai/h1AjPbg73o/f//AH0Mx4Xo/f//AQAAAOsag6Xw/f//97gAAgAAOYXo/f//fgaJhej9//+LxwvDdQYhhdD9//+NdfOLhej9////jej9//+FwH8Gi8cLw3Qti4Xg/f//mVJQU1fo5DcAAIPBMIP5OYmdoP3//4v4i9p+BgONuP3//4gOTuu9jUXzK8ZG94Xw/f//AAIAAImF4P3//4m15P3//3RhhcB0B4vOgDkwdFb/jeT9//+LjeT9///GATBA6z5JZjkwdAZAQDvOdfQrheT9///R+OsoO/51C6GQEkEAiYXk/f//i4Xk/f//6wdJgDgAdAVAO8519SuF5P3//4mF4P3//4O9wP3//wAPhVwBAACLhfD9//+oQHQyqQABAAB0CcaF1P3//y3rGKgBdAnGhdT9//8r6wuoAnQRxoXU/f//IMeF0P3//wEAAACLncz9//8rneD9//8rndD9///2hfD9//8MdRf/tbT9//+Nhdj9//9TaiDocPX//4PEDP+10P3//4u9tP3//42F2P3//42N1P3//+h29f//9oXw/f//CFl0G/aF8P3//wR1EldTajCNhdj9///oLvX//4PEDIO9yP3//wCLheD9//90ZoXAfmKLteT9//+JhaD9//8Ptwb/jaD9//9QagaNRfRQjYWY/f//RlBG6OU1AACDxBCFwHUoOYWY/f//dCD/tZj9//+Nhdj9//+NTfTo8fT//4O9oP3/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i4Uo5f//iwD/NAf/FZjgQACFwA+EKQQAAIuFROX//4uNMOX//wPBObU85f//iYU45f//D4wVBAAAg70g5f//AA+EzQAAAGoAjYU85f//UGoBjUX0UIuFKOX//4sAxkX0Df80B/8VmOBAAIXAD4TQAwAAg7085f//AQ+MzwMAAP+FMOX///+FOOX//+mDAAAAPAF0BDwCdSEPtzMzyWaD/goPlMFDQ4OFROX//wKJtUDl//+JjSDl//88AXQEPAJ1Uv+1QOX//+glJQAAWWY7hUDl//8PhWgDAACDhTjl//8Cg70g5f//AHQpag1YUImFQOX//+j4JAAAWWY7hUDl//8PhTsDAAD/hTjl////hTDl//+LRRA5hUTl//8Pgvn9///pJwMAAIsOihP/hTjl//+IVA80iw6JRA846Q4DAAAzyYsGA8f2QASAD4S/AgAAi4U05f//iY1A5f//hNsPhcoAAACJhTzl//85TRAPhiADAADrBou1KOX//4uNPOX//4OlROX//wArjTTl//+NhUjl//87TRBzOYuVPOX///+FPOX//4oSQYD6CnUQ/4Uw5f//xgANQP+FROX//4gQQP+FROX//4G9ROX///8TAABywovYjYVI5f//K9hqAI2FLOX//1BTjYVI5f//UIsG/zQH/xWY4EAAhcAPhEICAACLhSzl//8BhTjl//87ww+MOgIAAIuFPOX//yuFNOX//ztFEA+CTP///+kgAgAAiYVE5f//gPsCD4XRAAAAOU0QD4ZNAgAA6waLtSjl//+LjUTl//+DpTzl//8AK4005f//jYVI5f//O00Qc0aLlUTl//+DhUTl//8CD7cSQUFmg/oKdRaDhTDl//8Cag1bZokYQECDhTzl//8Cg4U85f//AmaJEEBAgb085f///hMAAHK1i9iNhUjl//8r2GoAjYUs5f//UFONhUjl//9Qiwb/NAf/FZjgQACFwA+EYgEAAIuFLOX//wGFOOX//zvDD4xaAQAAi4VE5f//K4U05f//O0UQD4I/////6UABAAA5TRAPhnwBAACLjUTl//+DpTzl//8AK4005f//agKNhUj5//9eO00QczyLlUTl//8PtxIBtUTl//8DzmaD+gp1DmoNW2aJGAPGAbU85f//AbU85f//ZokQA8aBvTzl//+oBgAAcr8z9lZWaFUNAACNjfDr//9RjY1I+f//K8GZK8LR+FCLwVBWaOn9AAD/FbDgQACL2DveD4SXAAAAagCNhSzl//9Qi8MrxlCNhDXw6///UIuFKOX//4sA/zQH/xWY4EAAhcB0DAO1LOX//zvef8vrDP8VXOBAAImFQOX//zvef1yLhUTl//8rhTTl//+JhTjl//87RRAPggr////rP2oAjY0s5f//Uf91EP+1NOX///8w/xWY4EAAhcB0FYuFLOX//4OlQOX//wCJhTjl///rDP8VXOBAAImFQOX//4O9OOX//wB1bIO9QOX//wB0LWoFXjm1QOX//3UU6LK2///HAAkAAADourb//4kw6z//tUDl///ovrb//1nrMYu1KOX//4sG9kQHBEB0D4uFNOX//4A4GnUEM8DrJOhytv//xwAcAAAA6Hq2//+DIACDyP/rDIuFOOX//yuFMOX//19bi038M81e6Nid///Jw2oQaPD3QADohLb//4tFCIP4/nUb6D62//+DIADoI7b//8cACQAAAIPI/+mdAAAAM/87x3wIOwWQKkEAciHoFbb//4k46Pu1///HAAkAAABXV1dXV+iDtf//g8QU68mLyMH5BY0cjaAqQQCL8IPmH8HmBosLD75MMQSD4QF0v1DoOSQAAFmJffyLA/ZEMAQBdBb/dRD/dQz/dQjoLvj//4PEDIlF5OsW6Ji1///HAAkAAADooLX//4k4g03k/8dF/P7////oCQAAAItF5OgEtv//w/91COiDJAAAWcNqEGgQ+EAA6Ki1//+LRQiD+P51E+hPtf//xwAJAAAAg8j/6aoAAAAz2zvDfAg7BZAqQQByGugutf//xwAJAAAAU1NTU1PotrT//4PEFOvQi8jB+QWNPI2gKkEAi/CD5h/B5gaLDw++TA4Eg+EBdMZQ6GwjAABZiV38iwf2RAYEAXQx/3UI6OAiAABZUP8V5OBAAIXAdQv/FVzgQACJReTrA4ld5Dld5HQZ6M20//+LTeSJCOiwtP//xwAJAAAAg03k/8dF/P7////oCQAAAItF5Ogjtf//w/91COiiIwAAWcOL/1WL7IPsEFMz2zldCHUc6HK0//9TU1NTU8cAFgAAAOj6s///g8QUM8DralaLdQw783Ua6E60//9TU1NTU8cAFgAAAOjWs///g8QU6wU5dQhyBDPA6z7/dRCNTfDoxpv//4tN9I1G/zlZCHQc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D4SrAAAAfjyB//D//393NI1EPwg9AAQAAHcT6NIfAACLxDvDdBzHAMzMAADrEVDoUOD//1k7w3QJxwDd3QAAg8AIi9iF23RpjQQ/UGoAU+hOkP//g8QMV1P/dRD/dQxqAf91GP/WhcB0Ef91FFBT/3UI/xX44EAAiUX4U+jJ+v//i0X4Wet1M/Y5XRx1CIsHi0AUiUUcOV0YdQiLB4tABIlFGP91HOhBHQAAWYP4/3UEM8DrRztFGHQeU1ONTRBR/3UMUP91GOhpHQAAi/CDxBg783TciXUM/3UU/3UQ/3UM/3UI/3Uc/xX04EAAi/g783QHVuiGr///WYvHjWXsX15bi038M83omJP//8nDi/9Vi+yD7BD/dQiNTfDokpP///91JI1N8P91IP91HP91GP91FP91EP91DOgW/v//g8QcgH38AHQHi034g2Fw/cnDi/9Vi+xWi3UIhfYPhIEBAAD/dgToFq////92COgOr////3YM6Aav////dhDo/q7///92FOj2rv///3YY6O6u////Nujnrv///3Yg6N+u////diTo167///92KOjPrv///3Ys6Meu////djDov67///92NOi3rv///3Yc6K+u////djjop67///92POifrv//g8RA/3ZA6JSu////dkTojK7///92SOiErv///3ZM6Hyu////dlDodK7///92VOhsrv///3ZY6GSu////dlzoXK7///92YOhUrv///3Zk6Eyu////dmjoRK7///92bOg8rv///3Zw6DSu////dnToLK7///92eOgkrv///3Z86Byu//+DxED/toAAAADoDq7///+2hAAAAOgDrv///7aIAAAA6Pit////towAAADo7a3///+2kAAAAOjirf///7aUAAAA6Net////tpgAAADozK3///+2nAAAAOjBrf///7agAAAA6Lat////tqQAAADoq63///+2qAAAAOigrf//g8QsXl3Di/9Vi+xWi3UIhfZ0NYsGOwVIHUEAdAdQ6H2t//9Zi0YEOwVMHUEAdAdQ6Gut//9Zi3YIOzVQHUEAdAdW6Fmt//9ZXl3Di/9Vi+xWi3UIhfZ0fotGDDsFVB1BAHQHUOg3rf//WYtGEDsFWB1BAHQHUOglrf//WYtGFDsFXB1BAHQHUOgTrf//WYtGGDsFYB1BAHQHUOgBrf//WYtGHDsF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Zm9ybWF0aW9uLg0KAAAAAAAAUjYwMzMNCi0gQXR0ZW1wdCB0byB1c2UgTVNJTCBjb2RlIGZyb20gdGhpcyBhc3NlbWJseSBkdXJpbmcgbmF0aXZlIGNvZGUgaW5pdGlhbGl6YXRpb24KVGhpcyBpbmRpY2F0ZXMgYSBidWcgaW4geW91ciBhcHBsaWNhdGlvbi4gSXQgaXMgbW9zdCBsaWtlbHkgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIGFuIE1TSUwtY29tcGlsZWQgKC9jbHIpIGZ1bmN0aW9uIGZyb20gYSBuYXRpdmUgY29uc3RydWN0b3Igb3IgZnJvbSBEbGxNYWluLg0KAABSNjAzMg0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBsb2NhbGUgaW5mb3JtYXRpb24NCgAAAAAAAFI2MDMxDQotIEF0dGVtcHQgdG8gaW5pdGlhbGl6ZSB0aGUgQ1JUIG1vcmUgdGhhbiBvbmNlLgpUaGlzIGluZGljYXRlcyBhIGJ1ZyBpbiB5b3VyIGFwcGxpY2F0aW9uLg0KAABSNjAzMA0KLSBDUlQgbm90IGluaXRpYWxpemVkDQoAAFI2MDI4DQotIHVuYWJsZSB0byBpbml0aWFsaXplIGhlYXANCgAAAABSNjAyNw0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBsb3dpbyBpbml0aWFsaXphdGlvbg0KAAAAAFI2MDI2DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIHN0ZGlvIGluaXRpYWxpemF0aW9uDQoAAAAAUjYwMjUNCi0gcHVyZSB2aXJ0dWFsIGZ1bmN0aW9uIGNhbGwNCgAAAFI2MDI0DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIF9vbmV4aXQvYXRleGl0IHRhYmxlDQoAAAAAUjYwMTkNCi0gdW5hYmxlIHRvIG9wZW4gY29uc29sZSBkZXZpY2UNCgAAAABSNjAxOA0KLSB1bmV4cGVjdGVkIGhlYXAgZXJyb3INCgAAAABSNjAxNw0KLSB1bmV4cGVjdGVkIG11bHRpdGhyZWFkIGxvY2sgZXJyb3INCgAAAABSNjAxNg0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciB0aHJlYWQgZGF0YQ0KAA0KVGhpcyBhcHBsaWNhdGlvbiBoYXMgcmVxdWVzdGVkIHRoZSBSdW50aW1lIHRvIHRlcm1pbmF0ZSBpdCBpbiBhbiB1bnVzdWFsIHdheS4KUGxlYXNlIGNvbnRhY3QgdGhlIGFwcGxpY2F0aW9uJ3Mgc3VwcG9ydCB0ZWFtIGZvciBtb3JlIGluZm9ybWF0aW9uLg0KAAAAUjYwMDkNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgZW52aXJvbm1lbnQNCgBSNjAwOA0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBhcmd1bWVudHMNCgAAAFI2MDAyDQotIGZsb2F0aW5nIHBvaW50IHN1cHBvcnQgbm90IGxvYWRlZA0KAAAAAE1pY3Jvc29mdCBWaXN1YWwgQysrIFJ1bnRpbWUgTGlicmFyeQAAAAAKCgAALi4uADxwcm9ncmFtIG5hbWUgdW5rbm93bj4AAFJ1bnRpbWUgRXJyb3IhCgpQcm9ncmFtOiAAAAAAAAAABQAAwAsAAAAAAAAAHQAAwAQAAAAAAAAAlgAAwAQAAAAAAAAAjQAAwAgAAAAAAAAAjgAAwAgAAAAAAAAAjwAAwAgAAAAAAAAAkAAAwAgAAAAAAAAAkQAAwAgAAAAAAAAAkgAAwAgAAAAAAAAAkwAAwAgAAAAAAAAABoCAhoCBgAAAEAOGgIaCgBQFBUVFRYWFhQUAADAwgFCAiAAIACgnOFBXgAAHADcwMFBQiAAAACAogIiAgAAAAGBoYGhoaAgIB3hwcHdwcAgIAAAIAAgABwgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAIAAgACAAIAAgACAAIAAgACgAKAAoACgAKAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIABIABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAIQAhACEAIQAhACEAIQAhACEAIQAEAAQABAAEAAQABAAEACBAIEAgQCBAIEAgQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAEAAQABAAEAAQABAAggCCAIIAggCCAIIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACABAAEAAQABAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgACAAIAAgACAAIAAgACAAIABoACgAKAAoACgAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAASAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACEAIQAhACEAIQAhACEAIQAhACEABAAEAAQABAAEAAQABAAgQGBAYEBgQGBAYEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBARAAEAAQABAAEAAQAIIBggGCAYIBggGCAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgEQABAAEAAQACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAEgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABQAFAAQABAAEAAQABAAFAAQABAAEAAQABAAEAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBEAABAQEBAQEBAQEBAQEBAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECARAAAgECAQIBAgECAQIBAgECAQEBAAAAAICBgoOEhYaHiImKi4yNjo+QkZKTlJWWl5iZmpucnZ6foKGio6SlpqeoqaqrrK2ur7CxsrO0tba3uLm6u7y9vr/AwcLDxMXGx8jJysvMzc7P0NHS09TV1tfY2drb3N3e3+Dh4uPk5ebn6Onq6+zt7u/w8fLz9PX29/j5+vv8/f7/AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/4CBgoOEhYaHiImKi4yNjo+QkZKTlJWWl5iZmpucnZ6foKGio6SlpqeoqaqrrK2ur7CxsrO0tba3uLm6u7y9vr/AwcLDxMXGx8jJysvMzc7P0NHS09TV1tfY2drb3N3e3+Dh4uPk5ebn6Onq6+zt7u/w8fLz9PX29/j5+vv8/f7/AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlae3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/0hIOm1tOnNzAAAAAGRkZGQsIE1NTU0gZGQsIHl5eXkATU0vZGQveXkAAAAAUE0AAEFNAABEZWNlbWJlcgAAAABOb3ZlbWJlcgAAAABPY3RvYmVyAFNlcHRlbWJlcgAAAEF1Z3VzdAAASnVseQAAAABKdW5lAAAAAEFwcmlsAAAATWFyY2gAAABGZWJydWFyeQAAAABKYW51YXJ5AERlYwBOb3YAT2N0AFNlcABBdWcASnVsAEp1bgBNYXkAQXByAE1hcgBGZWIASmFuAFNhdHVyZGF5AAAAAEZyaWRheQAAVGh1cnNkYXkAAAAAV2VkbmVzZGF5AAAAVHVlc2RheQBNb25kYXkAAFN1bmRheQAAU2F0AEZyaQBUaHUAV2VkAFR1ZQBNb24AU3VuAEdldFByb2Nlc3NXaW5kb3dTdGF0aW9uAEdldFVzZXJPYmplY3RJbmZvcm1hdGlvbkEAAABHZXRMYXN0QWN0aXZlUG9wdXAAAEdldEFjdGl2ZVdpbmRvdwBNZXNzYWdlQm94QQBVU0VSMzIuRExMAABTdW5Nb25UdWVXZWRUaHVGcmlTYXQAAABKYW5GZWJNYXJBcHJNYXlKdW5KdWxBdWdTZXBPY3ROb3ZEZWMAAAAAQ09OT1VUJAAuY29tAAAAAC5leGUAAAAALmJhdAAAAAAuY21kAAAAAC5cAABTeXN0ZW1Sb290AAAAAAAASAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgBJBAND0QAADAAAAADgAALBpAACgmQAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAADcGEAAAAAAAP7///8AAAAAyP///wAAAAD+////AAAAALwjQAAAAAAA/v///wAAAACI////AAAAAP7////6JUAA/iVAAP7////AJUAA1CVAAP7///8AAAAAjP///wAAAAD+////aDVAAGw1QAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAEztAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAADhO0AAAAAAAP7///8AAAAAzP///wAAAAD+////AAAAAGs9QAAAAAAAAAAAADc9QAD+////AAAAANT///8AAAAA/v///wAAAADwPkAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAACNAQAAAAAAA/v///wAAAADU////AAAAAP7///9NQUAAaUFAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAABdR0AAAAAAAP7///8AAAAAzP///wAAAAD+////AAAAACtLQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAm05AAAAAAAD+////AAAAANT///8AAAAA/v///wAAAADdUEAA/v///wAAAADsUEAA/v///wAAAADY////AAAAAP7///8AAAAAn1JAAP7///8AAAAAq1JAAP7///8AAAAA1P///wAAAAD+////AAAAAGVZQAAAAAAA/v///wAAAADY////AAAAAP7///8LW0AAH1tAAAAAAAD+////AAAAANj///8AAAAA/v///11bQABhW0AAAAAAAP7///8AAAAAwP///wAAAAD+////AAAAALheQAAAAAAA/v///wAAAADQ////AAAAAP7///9IX0AAX19AAAAAAAD+////AAAAANT///8AAAAA/v///wAAAAC5akAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAMpsQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAznlAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAADegUAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAL+CQAAAAAAA/v///wAAAADM////AAAAAP7///8AAAAAtJVAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAABNmEAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAOShQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAW6ZAAAAAAAD+////AAAAAMj///8AAAAA/v///wAAAAAhqEAAAAAAAAAAAABdp0AA/v///wAAAADQ////AAAAAP7///8AAAAA3K5AAAAAAAD+////AAAAAND///8AAAAA/v///wAAAAD4wkAAAAAAAP7///8AAAAAzP///wAAAAD+////AAAAAJvKQABc+QAAAAAAAAAAAAAWAAEAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnPoAALj6AADO+gAA5PoAAPb6AAAO+wAAJPsAADz7AABU+wAAaPsAAHD7AACC+wAAkPsAAKL7AAC0+wAAxvsAANb7AADk+wAA/PsAABD8AAAk/AAAQPwAAF78AABy/AAAgvwAAI78AACa/AAApvwAAL78AADW/AAA4PwAAOz8AAD+/AAADP0AABj9AAAm/QAAMP0AAED9AABW/QAAYv0AAHL9AACa/QAAtP0AAMz9AADm/QAA/P0AABb+AAAk/gAAMv4AAEz+AABc/gAAcv4AAIz+AACY/gAApv4AALb+AADG/gAA2P4AAOz+AAD8/gAAEv8AACL/AAA0/wAARv8AAFj/AABq/wAAdv8AAIT/AACU/wAAqv8AALr/AADK/wAA2P8AAOr/AAD8/wAAJAABADAAAQBAAAEAUgABAAAAAABSAUdlbmVyYXRlQ29uc29sZUN0cmxFdmVudAAAxgFHZXRFeGl0Q29kZVByb2Nlc3MAAG4EV2FpdEZvclNpbmdsZU9iamVjdACVAENyZWF0ZVByb2Nlc3NBAACvA1NldENvbnNvbGVDdHJsSGFuZGxlcgD1AUdldE1vZHVsZUZpbGVOYW1lQQAA2gBFbnRlckNyaXRpY2FsU2VjdGlvbgAA9AJMZWF2ZUNyaXRpY2FsU2VjdGlvbgAA+gFHZXRNb2R1bGVIYW5kbGVXAAArBFNsZWVwACICR2V0UHJvY0FkZHJlc3MAAAUBRXhpdFByb2Nlc3MAcAFHZXRDb21tYW5kTGluZUEAPAJHZXRTdGFydHVwSW5mb0EA8ANTZXRIYW5kbGVDb3VudAAAPgJHZXRTdGRIYW5kbGUAANgBR2V0RmlsZVR5cGUAvwBEZWxldGVDcml0aWNhbFNlY3Rpb24ANwRUZXJtaW5hdGVQcm9jZXNzAACqAUdldEN1cnJlbnRQcm9jZXNzAEgEVW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyAAAfBFNldFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcgDWAklzRGVidWdnZXJQcmVzZW50AOcBR2V0TGFzdEVycm9yAACmAkhlYXBGcmVlAACiAkhlYXBBbGxvYwBcAUdldENQSW5mbwDFAkludGVybG9ja2VkSW5jcmVtZW50AADBAkludGVybG9ja2VkRGVjcmVtZW50AABTAUdldEFDUAAAFAJHZXRPRU1DUAAA4AJJc1ZhbGlkQ29kZVBhZ2UAPgRUbHNHZXRWYWx1ZQA8BFRsc0FsbG9jAAA/BFRsc1NldFZhbHVlAD0EVGxzRnJlZQD0A1NldExhc3RFcnJvcgAArgFHZXRDdXJyZW50VGhyZWFkSWQAAJcEV3JpdGVGaWxlAPYCTG9hZExpYnJhcnlBAAC6AkluaXRpYWxpemVDcml0aWNhbFNlY3Rpb25BbmRTcGluQ291bnQASwFGcmVlRW52aXJvbm1lbnRTdHJpbmdzQQDAAUdldEVudmlyb25tZW50U3RyaW5ncwBMAUZyZWVFbnZpcm9ubWVudFN0cmluZ3NXAIQEV2lkZUNoYXJUb011bHRpQnl0ZQDCAUdldEVudmlyb25tZW50U3RyaW5nc1cAAKQCSGVhcENyZWF0ZQAAYQRWaXJ0dWFsRnJlZQBZA1F1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyAGoCR2V0VGlja0NvdW50AACrAUdldEN1cnJlbnRQcm9jZXNzSWQAUwJHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZQCaA1J0bFVud2luZACpAkhlYXBSZUFsbG9jAF4EVmlydHVhbEFsbG9jAACEAUdldENvbnNvbGVDUAAAlgFHZXRDb25zb2xlTW9kZQAAQgFGbHVzaEZpbGVCdWZmZXJzAADmAkxDTWFwU3RyaW5nQQAAHwNNdWx0aUJ5dGVUb1dpZGVDaGFyAOgCTENNYXBTdHJpbmdXAABAAkdldFN0cmluZ1R5cGVBAABDAkdldFN0cmluZ1R5cGVXAADpAUdldExvY2FsZUluZm9BAADnA1NldEZpbGVQb2ludGVyAACrAkhlYXBTaXplAABEAENsb3NlSGFuZGxlAIwEV3JpdGVDb25zb2xlQQCaAUdldENvbnNvbGVPdXRwdXRDUAAAlgRXcml0ZUNvbnNvbGVXAAYEU2V0U3RkSGFuZGxlAAB5AENyZWF0ZUZpbGVBAFMAQ29tcGFyZVN0cmluZ0EAAFYAQ29tcGFyZVN0cmluZ1cAANgDU2V0RW52aXJvbm1lbnRWYXJpYWJsZUEAS0VSTkVMMzIuZGxsAABuA1JlYWRGaWxlAADVA1NldEVuZE9mRmlsZQAAJgJHZXRQcm9jZXNzSGVhcAAAygFHZXRGaWxlQXR0cmlidXRlc0EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMArQQAAAAAAwCtBAAEBAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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YWxsZXIucHlpbXBvcnQgZ2xvYgppbXBvcnQgb3MKaW1wb3J0IHN1YnByb2Nlc3MKaW1wb3J0IHN5cwpmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCmZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzRXJyb3IKCmltcG9ydCBwa2dfcmVzb3VyY2VzCmZyb20gc2V0dXB0b29scy5jb21tYW5kLmVhc3lfaW5zdGFsbCBpbXBvcnQgZWFzeV9pbnN0YWxsCmZyb20gc2V0dXB0b29scy5leHRlcm4gaW1wb3J0IHNpeApmcm9tIHNldHVwdG9vbHMud2hlZWwgaW1wb3J0IFdoZWVsCgpmcm9tIC5weTMxY29tcGF0IGltcG9ydCBUZW1wb3JhcnlEaXJlY3RvcnkKCgpkZWYgX2ZpeHVwX2ZpbmRfbGlua3MoZmluZF9saW5rcyk6CiAgICAiIiJFbnN1cmUgZmluZC1saW5rcyBvcHRpb24gZW5kLXVwIGJlaW5nIGEgbGlzdCBvZiBzdHJpbmdzLiIiIgogICAgaWYgaXNpbnN0YW5jZShmaW5kX2xpbmtzLCBzaXguc3RyaW5nX3R5cGVzKToKICAgICAgICByZXR1cm4gZmluZF9saW5rcy5zcGxpdCgpCiAgICBhc3NlcnQgaXNpbnN0YW5jZShmaW5kX2xpbmtzLCAodHVwbGUsIGxpc3QpKQogICAgcmV0dXJuIGZpbmRfbGlua3MKCgpkZWYgX2xlZ2FjeV9mZXRjaF9idWlsZF9lZ2coZGlzdCwgcmVxKToKICAgICIiIkZldGNoIGFuIGVnZyBuZWVkZWQgZm9yIGJ1aWxkaW5nLgoKICAgIExlZ2FjeSBwYXRoIHVzaW5nIEVhc3lJbnN0YWxsLgogICAgIiIiCiAgICB0bXBfZGlzdCA9IGRpc3QuX19jbGFzc19fKHsnc2NyaXB0X2FyZ3MnOiBbJ2Vhc3lfaW5zdGFsbCddfSkKICAgIG9wdHMgPSB0bXBfZGlzdC5nZXRfb3B0aW9uX2RpY3QoJ2Vhc3lfaW5zdGFsbCcpCiAgICBvcHRzLmNsZWFyKCkKICAgIG9wdHMudXBkYXRlKAogICAgICAgIChrLCB2KQogICAgICAgIGZvciBrLCB2IGluIGRpc3QuZ2V0X29wdGlvbl9kaWN0KCdlYXN5X2luc3RhbGwnKS5pdGVtcygpCiAgICAgICAgaWYgayBpbiAoCiAgICAgICAgICAgICMgZG9uJ3QgdXNlIGFueSBvdGhlciBzZXR0aW5ncwogICAgICAgICAgICAnZmluZF9saW5rcycsICdzaXRlX2RpcnMnLCAnaW5kZXhfdXJsJywKICAgICAgICAgICAgJ29wdGltaXplJywgJ3NpdGVfZGlycycsICdhbGxvd19ob3N0cycsCiAgICAgICAgKSkKICAgIGlmIGRpc3QuZGVwZW5kZW5jeV9saW5rczoKICAgICAgICBsaW5rcyA9IGRpc3QuZGVwZW5kZW5jeV9saW5rc1s6XQogICAgICAgIGlmICdmaW5kX2xpbmtzJyBpbiBvcHRzOgogICAgICAgICAgICBsaW5rcyA9IF9maXh1cF9maW5kX2xpbmtzKG9wdHNbJ2ZpbmRfbGlua3MnXVsxXSkgKyBsaW5rcwogICAgICAgIG9wdHNbJ2ZpbmRfbGlua3MnXSA9ICgnc2V0dXAnLCBsaW5rcykKICAgIGluc3RhbGxfZGlyID0gZGlzdC5nZXRfZWdnX2NhY2hlX2RpcigpCiAgICBjbWQgPSBlYXN5X2luc3RhbGwoCiAgICAgICAgdG1wX2Rpc3QsIGFyZ3M9WyJ4Il0sIGluc3RhbGxfZGlyPWluc3RhbGxfZGlyLAogICAgICAgIGV4Y2x1ZGVfc2NyaXB0cz1UcnVlLAogICAgICAgIGFsd2F5c19jb3B5PUZhbHNlLCBidWlsZF9kaXJlY3Rvcnk9Tm9uZSwgZWRpdGFibGU9RmFsc2UsCiAgICAgICAgdXBncmFkZT1GYWxzZSwgbXVsdGlfdmVyc2lvbj1UcnVlLCBub19yZXBvcnQ9VHJ1ZSwgdXNlcj1GYWxzZQogICAgKQogICAgY21kLmVuc3VyZV9maW5hbGl6ZWQoKQogICAgcmV0dXJuIGNtZC5lYXN5X2luc3RhbGwocmVxKQoKCmRlZiBmZXRjaF9idWlsZF9lZ2coZGlzdCwgcmVxKToKICAgICIiIkZldGNoIGFuIGVnZyBuZWVkZWQgZm9yIGJ1aWxkaW5nLgoKICAgIFVzZSBwaXAvd2hlZWwgdG8gZmV0Y2gvYnVpbGQgYSB3aGVlbC4iIiIKICAgICMgQ2hlY2sgcGlwIGlzIGF2YWlsYWJsZS4KICAgIHRyeToKICAgICAgICBwa2dfcmVzb3VyY2VzLmdldF9kaXN0cmlidXRpb24oJ3BpcCcpCiAgICBleGNlcHQgcGtnX3Jlc291cmNlcy5EaXN0cmlidXRpb25Ob3RGb3VuZDoKICAgICAgICBkaXN0LmFubm91bmNlKAogICAgICAgICAgICAnV0FSTklORzogVGhlIHBpcCBwYWNrYWdlIGlzIG5vdCBhdmFpbGFibGUsIGZhbGxpbmcgYmFjayAnCiAgICAgICAgICAgICd0byBFYXN5SW5zdGFsbCBmb3IgaGFuZGxpbmcgc2V0dXBfcmVxdWlyZXMvdGVzdF9yZXF1aXJlczsgJwogICAgICAgICAgICAndGhpcyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbi4nCiAgICAgICAgICAgICwgbG9nLldBUk4KICAgICAgICApCiAgICAgICAgcmV0dXJuIF9sZWdhY3lfZmV0Y2hfYnVpbGRfZWdnKGRpc3QsIHJlcSkKICAgICMgV2FybiBpZiB3aGVlbCBpcyBub3QuCiAgICB0cnk6CiAgICAgICAgcGtnX3Jlc291cmNlcy5nZXRfZGlzdHJpYnV0aW9uKCd3aGVlbCcpCiAgICBleGNlcHQgcGtnX3Jlc291cmNlcy5EaXN0cmlidXRpb25Ob3RGb3VuZDoKICAgICAgICBkaXN0LmFubm91bmNlKCdXQVJOSU5HOiBUaGUgd2hlZWwgcGFja2FnZSBpcyBub3QgYXZhaWxhYmxlLicsIGxvZy5XQVJOKQogICAgIyBJZ25vcmUgZW52aXJvbm1lbnQgbWFya2VyczsgaWYgc3VwcGxpZWQsIGl0IGlzIHJlcXVpcmVkLgogICAgcmVxID0gc3RyaXBfbWFya2VyKHJlcSkKICAgICMgVGFrZSBlYXN5X2luc3RhbGwgb3B0aW9ucyBpbnRvIGFjY291bnQsIGJ1dCBkbyBub3Qgb3ZlcnJpZGUgcmVsZXZhbnQKICAgICMgcGlwIGVudmlyb25tZW50IHZhcmlhYmxlcyAobGlrZSBQSVBfSU5ERVhfVVJMIG9yIFBJUF9RVUlFVCk7IHRoZXknbGwKICAgICMgdGFrZSBwcmVjZWRlbmNlLgogICAgb3B0cyA9IGRpc3QuZ2V0X29wdGlvbl9kaWN0KCdlYXN5X2luc3RhbGwnKQogICAgaWYgJ2FsbG93X2hvc3RzJyBpbiBvcHRzOgogICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKCd0aGUgYGFsbG93LWhvc3RzYCBvcHRpb24gaXMgbm90IHN1cHBvcnRlZCAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3doZW4gdXNpbmcgcGlwIHRvIGluc3RhbGwgcmVxdWlyZW1lbnRzLicpCiAgICBpZiAnUElQX1FVSUVUJyBpbiBvcy5lbnZpcm9uIG9yICdQSVBfVkVSQk9TRScgaW4gb3MuZW52aXJvbjoKICAgICAgICBxdWlldCA9IEZhbHNlCiAgICBlbHNlOgogICAgICAgIHF1aWV0ID0gVHJ1ZQogICAgaWYgJ1BJUF9JTkRFWF9VUkwnIGluIG9zLmVudmlyb246CiAgICAgICAgaW5kZXhfdXJsID0gTm9uZQogICAgZWxpZiAnaW5kZXhfdXJsJyBpbiBvcHRzOgogICAgICAgIGluZGV4X3VybCA9IG9wdHNbJ2luZGV4X3VybCddWzFdCiAgICBlbHNlOgogICAgICAgIGluZGV4X3VybCA9IE5vbmUKICAgIGlmICdmaW5kX2xpbmtzJyBpbiBvcHRzOgogICAgICAgIGZpbmRfbGlua3MgPSBfZml4dXBfZmluZF9saW5rcyhvcHRzWydmaW5kX2xpbmtzJ11bMV0pWzpdCiAgICBlbHNlOgogICAgICAgIGZpbmRfbGlua3MgPSBbXQogICAgaWYgZGlzdC5kZXBlbmRlbmN5X2xpbmtzOgogICAgICAgIGZpbmRfbGlua3MuZXh0ZW5kKGRpc3QuZGVwZW5kZW5jeV9saW5rcykKICAgIGVnZ3NfZGlyID0gb3MucGF0aC5yZWFscGF0aChkaXN0LmdldF9lZ2dfY2FjaGVfZGlyKCkpCiAgICBlbnZpcm9ubWVudCA9IHBrZ19yZXNvdXJjZXMuRW52aXJvbm1lbnQoKQogICAgZm9yIGVnZ19kaXN0IGluIHBrZ19yZXNvdXJjZXMuZmluZF9kaXN0cmlidXRpb25zKGVnZ3NfZGlyKToKICAgICAgICBpZiBlZ2dfZGlzdCBpbiByZXEgYW5kIGVudmlyb25tZW50LmNhbl9hZGQoZWdnX2Rpc3QpOgogICAgICAgICAgICByZXR1cm4gZWdnX2Rpc3QKICAgIHdpdGggVGVtcG9yYXJ5RGlyZWN0b3J5KCkgYXMgdG1wZGlyOgogICAgICAgIGNtZCA9IFsKICAgICAgICAgICAgc3lzLmV4ZWN1dGFibGUsICctbScsICdwaXAnLAogICAgICAgICAgICAnLS1kaXNhYmxlLXBpcC12ZXJzaW9uLWNoZWNrJywKICAgICAgICAgICAgJ3doZWVsJywgJy0tbm8tZGVwcycsCiAgICAgICAgICAgICctdycsIHRtcGRpciwKICAgICAgICBdCiAgICAgICAgaWYgcXVpZXQ6CiAgICAgICAgICAgIGNtZC5hcHBlbmQoJy0tcXVpZXQnKQogICAgICAgIGlmIGluZGV4X3VybCBpcyBub3QgTm9uZToKICAgICAgICAgICAgY21kLmV4dGVuZCgoJy0taW5kZXgtdXJsJywgaW5kZXhfdXJsKSkKICAgICAgICBpZiBmaW5kX2xpbmtzIGlzIG5vdCBOb25lOgogICAgICAgICAgICBmb3IgbGluayBpbiBmaW5kX2xpbmtzOgogICAgICAgICAgICAgICAgY21kLmV4dGVuZCgoJy0tZmluZC1saW5rcycsIGxpbmspKQogICAgICAgICMgSWYgcmVxdWlyZW1lbnQgaXMgYSBQRVAgNTA4IGRpcmVjdCBVUkwsIGRpcmVjdGx5IHBhc3MKICAgICAgICAjIHRoZSBVUkwgdG8gcGlwLCBhcyBgcmVxIEAgdXJsYCBkb2VzIG5vdCB3b3JrIG9uIHRoZQogICAgICAgICMgY29tbWFuZCBsaW5lLgogICAgICAgIGlmIHJlcS51cmw6CiAgICAgICAgICAgIGNtZC5hcHBlbmQocmVxLnVybCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBjbWQuYXBwZW5kKHN0cihyZXEpKQogICAgICAgIHRyeToKICAgICAgICAgICAgc3VicHJvY2Vzcy5jaGVja19jYWxsKGNtZCkKICAgICAgICBleGNlcHQgc3VicHJvY2Vzcy5DYWxsZWRQcm9jZXNzRXJyb3IgYXMgZToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3Ioc3RyKGUpKQogICAgICAgIHdoZWVsID0gV2hlZWwoZ2xvYi5nbG9iKG9zLnBhdGguam9pbih0bXBkaXIsICcqLndobCcpKVswXSkKICAgICAgICBkaXN0X2xvY2F0aW9uID0gb3MucGF0aC5qb2luKGVnZ3NfZGlyLCB3aGVlbC5lZ2dfbmFtZSgpKQogICAgICAgIHdoZWVsLmluc3RhbGxfYXNfZWdnKGRpc3RfbG9jYXRpb24pCiAgICAgICAgZGlzdF9tZXRhZGF0YSA9IHBrZ19yZXNvdXJjZXMuUGF0aE1ldGFkYXRhKAogICAgICAgICAgICBkaXN0X2xvY2F0aW9uLCBvcy5wYXRoLmpvaW4oZGlzdF9sb2NhdGlvbiwgJ0VHRy1JTkZPJykpCiAgICAgICAgZGlzdCA9IHBrZ19yZXNvdXJjZXMuRGlzdHJpYnV0aW9uLmZyb21fZmlsZW5hbWUoCiAgICAgICAgICAgIGRpc3RfbG9jYXRpb24sIG1ldGFkYXRhPWRpc3RfbWV0YWRhdGEpCiAgICAgICAgcmV0dXJuIGRpc3QKCgpkZWYgc3RyaXBfbWFya2VyKHJlcSk6CiAgICAiIiIKICAgIFJldHVybiBhIG5ldyByZXF1aXJlbWVudCB3aXRob3V0IHRoZSBlbnZpcm9ubWVudCBtYXJrZXIgdG8gYXZvaWQKICAgIGNhbGxpbmcgcGlwIHdpdGggc29tZXRoaW5nIGxpa2UgYGJhYmVsOyBleHRyYSA9PSAiaTE4biJgLCB3aGljaAogICAgd291bGQgYWx3YXlzIGJlIGlnbm9yZWQuCiAgICAiIiIKICAgICMgY3JlYXRlIGEgY29weSB0byBhdm9pZCBtdXRhdGluZyB0aGUgaW5wdXQKICAgIHJlcSA9IHBrZ19yZXNvdXJjZXMuUmVxdWlyZW1lbnQucGFyc2Uoc3RyKHJlcSkpCiAgICByZXEubWFya2VyID0gTm9uZQogICAgcmV0dXJuIHJlcQpQSwMEFAAAAAAAAAAhAGT5fpsTAwAAEwMAADkAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9sYXVuY2gucHkiIiIKTGF1bmNoIHRoZSBQeXRob24gc2NyaXB0IG9uIHRoZSBjb21tYW5kIGxpbmUgYWZ0ZXIKc2V0dXB0b29scyBpcyBib290c3RyYXBwZWQgdmlhIGltcG9ydC4KIiIiCgojIE5vdGUgdGhhdCBzZXR1cHRvb2xzIGdldHMgaW1wb3J0ZWQgaW1wbGljaXRseSBieSB0aGUKIyBpbnZvY2F0aW9uIG9mIHRoaXMgc2NyaXB0IHVzaW5nIHB5dGhvbiAtbSBzZXR1cHRvb2xzLmxhdW5jaAoKaW1wb3J0IHRva2VuaXplCmltcG9ydCBzeXMKCgpkZWYgcnVuKCk6CiAgICAiIiIKICAgIFJ1biB0aGUgc2NyaXB0IGluIHN5cy5hcmd2WzFdIGFzIGlmIGl0IGhhZAogICAgYmVlbiBpbnZva2VkIG5hdHVyYWxseS4KICAgICIiIgogICAgX19idWlsdGluc19fCiAgICBzY3JpcHRfbmFtZSA9IHN5cy5hcmd2WzFdCiAgICBuYW1lc3BhY2UgPSBkaWN0KAogICAgICAgIF9fZmlsZV9fPXNjcmlwdF9uYW1lLAogICAgICAgIF9fbmFtZV9fPSdfX21haW5fXycsCiAgICAgICAgX19kb2NfXz1Ob25lLAogICAgKQogICAgc3lzLmFyZ3ZbOl0gPSBzeXMuYXJndlsxOl0KCiAgICBvcGVuXyA9IGdldGF0dHIodG9rZW5pemUsICdvcGVuJywgb3BlbikKICAgIHNjcmlwdCA9IG9wZW5fKHNjcmlwdF9uYW1lKS5yZWFkKCkKICAgIG5vcm1fc2NyaXB0ID0gc2NyaXB0LnJlcGxhY2UoJ1xcclxcbicsICdcXG4nKQogICAgY29kZSA9IGNvbXBpbGUobm9ybV9zY3JpcHQsIHNjcmlwdF9uYW1lLCAnZXhlYycpCiAgICBleGVjKGNvZGUsIG5hbWVzcGFjZSkKCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgcnVuKCkKUEsDBBQAAAAAAAAAIQCHUeui3QcAAN0HAAA9AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvbGliMnRvM19leC5weSIiIgpDdXN0b21pemVkIE1peGluMnRvMyBzdXBwb3J0OgoKIC0gYWRkcyBzdXBwb3J0IGZvciBjb252ZXJ0aW5nIGRvY3Rlc3RzCgoKVGhpcyBtb2R1bGUgcmFpc2VzIGFuIEltcG9ydEVycm9yIG9uIFB5dGhvbiAyLgoiIiIKCmZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IE1peGluMnRvMyBhcyBfTWl4aW4ydG8zCmZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKZnJvbSBsaWIydG8zLnJlZmFjdG9yIGltcG9ydCBSZWZhY3RvcmluZ1Rvb2wsIGdldF9maXhlcnNfZnJvbV9wYWNrYWdlCgppbXBvcnQgc2V0dXB0b29scwoKCmNsYXNzIERpc3R1dGlsc1JlZmFjdG9yaW5nVG9vbChSZWZhY3RvcmluZ1Rvb2wpOgogICAgZGVmIGxvZ19lcnJvcihzZWxmLCBtc2csICphcmdzLCAqKmt3KToKICAgICAgICBsb2cuZXJyb3IobXNnLCAqYXJncykKCiAgICBkZWYgbG9nX21lc3NhZ2Uoc2VsZiwgbXNnLCAqYXJncyk6CiAgICAgICAgbG9nLmluZm8obXNnLCAqYXJncykKCiAgICBkZWYgbG9nX2RlYnVnKHNlbGYsIG1zZywgKmFyZ3MpOgogICAgICAgIGxvZy5kZWJ1Zyhtc2csICphcmdzKQoKCmNsYXNzIE1peGluMnRvMyhfTWl4aW4ydG8zKToKICAgIGRlZiBydW5fMnRvMyhzZWxmLCBmaWxlcywgZG9jdGVzdHM9RmFsc2UpOgogICAgICAgICMgU2VlIG9mIHRoZSBkaXN0cmlidXRpb24gb3B0aW9uIGhhcyBiZWVuIHNldCwgb3RoZXJ3aXNlIGNoZWNrIHRoZQogICAgICAgICMgc2V0dXB0b29scyBkZWZhdWx0LgogICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLnVzZV8ydG8zIGlzIG5vdCBUcnVlOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBpZiBub3QgZmlsZXM6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGxvZy5pbmZvKCJGaXhpbmcgIiArICIgIi5qb2luKGZpbGVzKSkKICAgICAgICBzZWxmLl9fYnVpbGRfZml4ZXJfbmFtZXMoKQogICAgICAgIHNlbGYuX19leGNsdWRlX2ZpeGVycygpCiAgICAgICAgaWYgZG9jdGVzdHM6CiAgICAgICAgICAgIGlmIHNldHVwdG9vbHMucnVuXzJ0bzNfb25fZG9jdGVzdHM6CiAgICAgICAgICAgICAgICByID0gRGlzdHV0aWxzUmVmYWN0b3JpbmdUb29sKHNlbGYuZml4ZXJfbmFtZXMpCiAgICAgICAgICAgICAgICByLnJlZmFjdG9yKGZpbGVzLCB3cml0ZT1UcnVlLCBkb2N0ZXN0c19vbmx5PVRydWUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgX01peGluMnRvMy5ydW5fMnRvMyhzZWxmLCBmaWxlcykKCiAgICBkZWYgX19idWlsZF9maXhlcl9uYW1lcyhzZWxmKToKICAgICAgICBpZiBzZWxmLmZpeGVyX25hbWVzOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBzZWxmLmZpeGVyX25hbWVzID0gW10KICAgICAgICBmb3IgcCBpbiBzZXR1cHRvb2xzLmxpYjJ0bzNfZml4ZXJfcGFja2FnZXM6CiAgICAgICAgICAgIHNlbGYuZml4ZXJfbmFtZXMuZXh0ZW5kKGdldF9maXhlcnNfZnJvbV9wYWNrYWdlKHApKQogICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLnVzZV8ydG8zX2ZpeGVycyBpcyBub3QgTm9uZToKICAgICAgICAgICAgZm9yIHAgaW4gc2VsZi5kaXN0cmlidXRpb24udXNlXzJ0bzNfZml4ZXJzOgogICAgICAgICAgICAgICAgc2VsZi5maXhlcl9uYW1lcy5leHRlbmQoZ2V0X2ZpeGVyc19mcm9tX3BhY2thZ2UocCkpCgogICAgZGVmIF9fZXhjbHVkZV9maXhlcnMoc2VsZik6CiAgICAgICAgZXhjbHVkZWRfZml4ZXJzID0gZ2V0YXR0cihzZWxmLCAnZXhjbHVkZV9maXhlcnMnLCBbXSkKICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi51c2VfMnRvM19leGNsdWRlX2ZpeGVycyBpcyBub3QgTm9uZToKICAgICAgICAgICAgZXhjbHVkZWRfZml4ZXJzLmV4dGVuZChzZWxmLmRpc3RyaWJ1dGlvbi51c2VfMnRvM19leGNsdWRlX2ZpeGVycykKICAgICAgICBmb3IgZml4ZXJfbmFtZSBpbiBleGNsdWRlZF9maXhlcnM6CiAgICAgICAgICAgIGlmIGZpeGVyX25hbWUgaW4gc2VsZi5maXhlcl9uYW1lczoKICAgICAgICAgICAgICAgIHNlbGYuZml4ZXJfbmFtZXMucmVtb3ZlKGZpeGVyX25hbWUpClBLAwQUAAAAAAAAACEAFGNIy5AUAACQFAAAOQAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL21vbmtleS5weSIiIgpNb25rZXkgcGF0Y2hpbmcgb2YgZGlzdHV0aWxzLgoiIiIKCmltcG9ydCBzeXMKaW1wb3J0IGRpc3R1dGlscy5maWxlbGlzdAppbXBvcnQgcGxhdGZvcm0KaW1wb3J0IHR5cGVzCmltcG9ydCBmdW5jdG9vbHMKZnJvbSBpbXBvcnRsaWIgaW1wb3J0IGltcG9ydF9tb2R1bGUKaW1wb3J0IGluc3BlY3QKCmZyb20gc2V0dXB0b29scy5leHRlcm4gaW1wb3J0IHNpeAoKaW1wb3J0IHNldHVwdG9vbHMKCl9fYWxsX18gPSBbXQoiIiIKRXZlcnl0aGluZyBpcyBwcml2YXRlLiBDb250YWN0IHRoZSBwcm9qZWN0IHRlYW0KaWYgeW91IHRoaW5rIHlvdSBuZWVkIHRoaXMgZnVuY3Rpb25hbGl0eS4KIiIiCgoKZGVmIF9nZXRfbXJvKGNscyk6CiAgICAiIiIKICAgIFJldHVybnMgdGhlIGJhc2VzIGNsYXNzZXMgZm9yIGNscyBzb3J0ZWQgYnkgdGhlIE1STy4KCiAgICBXb3JrcyBhcm91bmQgYW4gaXNzdWUgb24gSnl0aG9uIHdoZXJlIGluc3BlY3QuZ2V0bXJvIHdpbGwgbm90IHJldHVybiBhbGwKICAgIGJhc2UgY2xhc3NlcyBpZiBtdWx0aXBsZSBjbGFzc2VzIHNoYXJlIHRoZSBzYW1lIG5hbWUuIEluc3RlYWQsIHRoaXMKICAgIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGEgdHVwbGUgY29udGFpbmluZyB0aGUgY2xhc3MgaXRzZWxmLCBhbmQgdGhlIGNvbnRlbnRzCiAgICBvZiBjbHMuX19iYXNlc19fLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvc2V0dXB0b29scy9pc3N1ZXMvMTAyNC4KICAgICIiIgogICAgaWYgcGxhdGZvcm0ucHl0aG9uX2ltcGxlbWVudGF0aW9uKCkgPT0gIkp5dGhvbiI6CiAgICAgICAgcmV0dXJuIChjbHMsKSArIGNscy5fX2Jhc2VzX18KICAgIHJldHVybiBpbnNwZWN0LmdldG1ybyhjbHMpCgoKZGVmIGdldF91bnBhdGNoZWQoaXRlbSk6CiAgICBsb29rdXAgPSAoCiAgICAgICAgZ2V0X3VucGF0Y2hlZF9jbGFzcyBpZiBpc2luc3RhbmNlKGl0ZW0sIHNpeC5jbGFzc190eXBlcykgZWxzZQogICAgICAgIGdldF91bnBhdGNoZWRfZnVuY3Rpb24gaWYgaXNpbnN0YW5jZShpdGVtLCB0eXBlcy5GdW5jdGlvblR5cGUpIGVsc2UKICAgICAgICBsYW1iZGEgaXRlbTogTm9uZQogICAgKQogICAgcmV0dXJuIGxvb2t1cChpdGVtKQoKCmRlZiBnZXRfdW5wYXRjaGVkX2NsYXNzKGNscyk6CiAgICAiIiJQcm90ZWN0IGFnYWluc3QgcmUtcGF0Y2hpbmcgdGhlIGRpc3R1dGlscyBpZiByZWxvYWRlZAoKICAgIEFsc28gZW5zdXJlcyB0aGF0IG5vIG90aGVyIGRpc3R1dGlscyBleHRlbnNpb24gbW9ua2V5cGF0Y2hlZCB0aGUgZGlzdHV0aWxzCiAgICBmaXJzdC4KICAgICIiIgogICAgZXh0ZXJuYWxfYmFzZXMgPSAoCiAgICAgICAgY2xzCiAgICAgICAgZm9yIGNscyBpbiBfZ2V0X21ybyhjbHMpCiAgICAgICAgaWYgbm90IGNscy5fX21vZHVsZV9fLnN0YXJ0c3dpdGgoJ3NldHVwdG9vbHMnKQogICAgKQogICAgYmFzZSA9IG5leHQoZXh0ZXJuYWxfYmFzZXMpCiAgICBpZiBub3QgYmFzZS5fX21vZHVsZV9fLnN0YXJ0c3dpdGgoJ2Rpc3R1dGlscycpOgogICAgICAgIG1zZyA9ICJkaXN0dXRpbHMgaGFzIGFscmVhZHkgYmVlbiBwYXRjaGVkIGJ5ICVyIiAlIGNscwogICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKG1zZykKICAgIHJldHVybiBiYXNlCgoKZGVmIHBhdGNoX2FsbCgpOgogICAgIyB3ZSBjYW4ndCBwYXRjaCBkaXN0dXRpbHMuY21kLCBhbGFzCiAgICBkaXN0dXRpbHMuY29yZS5Db21tYW5kID0gc2V0dXB0b29scy5Db21tYW5kCgogICAgaGFzX2lzc3VlXzEyODg1ID0gc3lzLnZlcnNpb25faW5mbyA8PSAoMywgNSwgMykKCiAgICBpZiBoYXNfaXNzdWVfMTI4ODU6CiAgICAgICAgIyBmaXggZmluZGFsbCBidWcgaW4gZGlzdHV0aWxzIChodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMTI4ODUpCiAgICAgICAgZGlzdHV0aWxzLmZpbGVsaXN0LmZpbmRhbGwgPSBzZXR1cHRvb2xzLmZpbmRhbGwKCiAgICBuZWVkc193YXJlaG91c2UgPSAoCiAgICAgICAgc3lzLnZlcnNpb25faW5mbyA8ICgyLCA3LCAxMykKICAgICAgICBvcgogICAgICAgICgzLCA0KSA8IHN5cy52ZXJzaW9uX2luZm8gPCAoMywgNCwgNikKICAgICAgICBvcgogICAgICAgICgzLCA1KSA8IHN5cy52ZXJzaW9uX2luZm8gPD0gKDMsIDUsIDMpCiAgICApCgogICAgaWYgbmVlZHNfd2FyZWhvdXNlOgogICAgICAgIHdhcmVob3VzZSA9ICdodHRwczovL3VwbG9hZC5weXBpLm9yZy9sZWdhY3kvJwogICAgICAgIGRpc3R1dGlscy5jb25maWcuUHlQSVJDQ29tbWFuZC5ERUZBVUxUX1JFUE9TSVRPUlkgPSB3YXJlaG91c2UKCiAgICBfcGF0Y2hfZGlzdHJpYnV0aW9uX21ldGFkYXRhKCkKCiAgICAjIEluc3RhbGwgRGlzdHJpYnV0aW9uIHRocm91Z2hvdXQgdGhlIGRpc3R1dGlscwogICAgZm9yIG1vZHVsZSBpbiBkaXN0dXRpbHMuZGlzdCwgZGlzdHV0aWxzLmNvcmUsIGRpc3R1dGlscy5jbWQ6CiAgICAgICAgbW9kdWxlLkRpc3RyaWJ1dGlvbiA9IHNldHVwdG9vbHMuZGlzdC5EaXN0cmlidXRpb24KCiAgICAjIEluc3RhbGwgdGhlIHBhdGNoZWQgRXh0ZW5zaW9uCiAgICBkaXN0dXRpbHMuY29yZS5FeHRlbnNpb24gPSBzZXR1cHRvb2xzLmV4dGVuc2lvbi5FeHRlbnNpb24KICAgIGRpc3R1dGlscy5leHRlbnNpb24uRXh0ZW5zaW9uID0gc2V0dXB0b29scy5leHRlbnNpb24uRXh0ZW5zaW9uCiAgICBpZiAnZGlzdHV0aWxzLmNvbW1hbmQuYnVpbGRfZXh0JyBpbiBzeXMubW9kdWxlczoKICAgICAgICBzeXMubW9kdWxlc1snZGlzdHV0aWxzLmNvbW1hbmQuYnVpbGRfZXh0J10uRXh0ZW5zaW9uID0gKAogICAgICAgICAgICBzZXR1cHRvb2xzLmV4dGVuc2lvbi5FeHRlbnNpb24KICAgICAgICApCgogICAgcGF0Y2hfZm9yX21zdmNfc3BlY2lhbGl6ZWRfY29tcGlsZXIoKQoKCmRlZiBfcGF0Y2hfZGlzdHJpYnV0aW9uX21ldGFkYXRhKCk6CiAgICAiIiJQYXRjaCB3cml0ZV9wa2dfZmlsZSBhbmQgcmVhZF9wa2dfZmlsZSBmb3IgaGlnaGVyIG1ldGFkYXRhIHN0YW5kYXJkcyIiIgogICAgZm9yIGF0dHIgaW4gKCd3cml0ZV9wa2dfZmlsZScsICdyZWFkX3BrZ19maWxlJywgJ2dldF9tZXRhZGF0YV92ZXJzaW9uJyk6CiAgICAgICAgbmV3X3ZhbCA9IGdldGF0dHIoc2V0dXB0b29scy5kaXN0LCBhdHRyKQogICAgICAgIHNldGF0dHIoZGlzdHV0aWxzLmRpc3QuRGlzdHJpYnV0aW9uTWV0YWRhdGEsIGF0dHIsIG5ld192YWwpCgoKZGVmIHBhdGNoX2Z1bmMocmVwbGFjZW1lbnQsIHRhcmdldF9tb2QsIGZ1bmNfbmFtZSk6CiAgICAiIiIKICAgIFBhdGNoIGZ1bmNfbmFtZSBpbiB0YXJnZXRfbW9kIHdpdGggcmVwbGFjZW1lbnQKCiAgICBJbXBvcnRhbnQgLSBvcmlnaW5hbCBtdXN0IGJlIHJlc29sdmVkIGJ5IG5hbWUgdG8gYXZvaWQKICAgIHBhdGNoaW5nIGFuIGFscmVhZHkgcGF0Y2hlZCBmdW5jdGlvbi4KICAgICIiIgogICAgb3JpZ2luYWwgPSBnZXRhdHRyKHRhcmdldF9tb2QsIGZ1bmNfbmFtZSkKCiAgICAjIHNldCB0aGUgJ3VucGF0Y2hlZCcgYXR0cmlidXRlIG9uIHRoZSByZXBsYWNlbWVudCB0bwogICAgIyBwb2ludCB0byB0aGUgb3JpZ2luYWwuCiAgICB2YXJzKHJlcGxhY2VtZW50KS5zZXRkZWZhdWx0KCd1bnBhdGNoZWQnLCBvcmlnaW5hbCkKCiAgICAjIHJlcGxhY2UgdGhlIGZ1bmN0aW9uIGluIHRoZSBvcmlnaW5hbCBtb2R1bGUKICAgIHNldGF0dHIodGFyZ2V0X21vZCwgZnVuY19uYW1lLCByZXBsYWNlbWVudCkKCgpkZWYgZ2V0X3VucGF0Y2hlZF9mdW5jdGlvbihjYW5kaWRhdGUpOgogICAgcmV0dXJuIGdldGF0dHIoY2FuZGlkYXRlLCAndW5wYXRjaGVkJykKCgpkZWYgcGF0Y2hfZm9yX21zdmNfc3BlY2lhbGl6ZWRfY29tcGlsZXIoKToKICAgICIiIgogICAgUGF0Y2ggZnVuY3Rpb25zIGluIGRpc3R1dGlscyB0byB1c2Ugc3RhbmRhbG9uZSBNaWNyb3NvZnQgVmlzdWFsIEMrKwogICAgY29tcGlsZXJzLgogICAgIiIiCiAgICAjIGltcG9ydCBsYXRlIHRvIGF2b2lkIGNpcmN1bGFyIGltcG9ydHMgb24gUHl0aG9uIDwgMy41CiAgICBtc3ZjID0gaW1wb3J0X21vZHVsZSgnc2V0dXB0b29scy5tc3ZjJykKCiAgICBpZiBwbGF0Zm9ybS5zeXN0ZW0oKSAhPSAnV2luZG93cyc6CiAgICAgICAgIyBDb21waWxlcnMgb25seSBhdmFpbGFibGVzIG9uIE1pY3Jvc29mdCBXaW5kb3dzCiAgICAgICAgcmV0dXJuCgogICAgZGVmIHBhdGNoX3BhcmFtcyhtb2RfbmFtZSwgZnVuY19uYW1lKToKICAgICAgICAiIiIKICAgICAgICBQcmVwYXJlIHRoZSBwYXJhbWV0ZXJzIGZvciBwYXRjaF9mdW5jIHRvIHBhdGNoIGluZGljYXRlZCBmdW5jdGlvbi4KICAgICAgICAiIiIKICAgICAgICByZXBsX3ByZWZpeCA9ICdtc3ZjOV8nIGlmICdtc3ZjOScgaW4gbW9kX25hbWUgZWxzZSAnbXN2YzE0XycKICAgICAgICByZXBsX25hbWUgPSByZXBsX3ByZWZpeCArIGZ1bmNfbmFtZS5sc3RyaXAoJ18nKQogICAgICAgIHJlcGwgPSBnZXRhdHRyKG1zdmMsIHJlcGxfbmFtZSkKICAgICAgICBtb2QgPSBpbXBvcnRfbW9kdWxlKG1vZF9uYW1lKQogICAgICAgIGlmIG5vdCBoYXNhdHRyKG1vZCwgZnVuY19uYW1lKToKICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoZnVuY19uYW1lKQogICAgICAgIHJldHVybiByZXBsLCBtb2QsIGZ1bmNfbmFtZQoKICAgICMgUHl0aG9uIDIuNyB0byAzLjQKICAgIG1zdmM5ID0gZnVuY3Rvb2xzLnBhcnRpYWwocGF0Y2hfcGFyYW1zLCAnZGlzdHV0aWxzLm1zdmM5Y29tcGlsZXInKQoKICAgICMgUHl0aG9uIDMuNSsKICAgIG1zdmMxNCA9IGZ1bmN0b29scy5wYXJ0aWFsKHBhdGNoX3BhcmFtcywgJ2Rpc3R1dGlscy5fbXN2Y2NvbXBpbGVyJykKCiAgICB0cnk6CiAgICAgICAgIyBQYXRjaCBkaXN0dXRpbHMubXN2Yzljb21waWxlcgogICAgICAgIHBhdGNoX2Z1bmMoKm1zdmM5KCdmaW5kX3ZjdmFyc2FsbCcpKQogICAgICAgIHBhdGNoX2Z1bmMoKm1zdmM5KCdxdWVyeV92Y3ZhcnNhbGwnKSkKICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICBwYXNzCgogICAgdHJ5OgogICAgICAgICMgUGF0Y2ggZGlzdHV0aWxzLl9tc3ZjY29tcGlsZXIuX2dldF92Y19lbnYKICAgICAgICBwYXRjaF9mdW5jKCptc3ZjMTQoJ19nZXRfdmNfZW52JykpCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgcGFzcwoKICAgIHRyeToKICAgICAgICAjIFBhdGNoIGRpc3R1dGlscy5fbXN2Y2NvbXBpbGVyLmdlbl9saWJfb3B0aW9ucyBmb3IgTnVtcHkKICAgICAgICBwYXRjaF9mdW5jKCptc3ZjMTQoJ2dlbl9saWJfb3B0aW9ucycpKQogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgIHBhc3MKUEsDBBQAAAAAAAAAIQAyp/xcn7YAAJ+2AAA3AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvbXN2Yy5weSIiIgpJbXByb3ZlZCBzdXBwb3J0IGZvciBNaWNyb3NvZnQgVmlzdWFsIEMrKyBjb21waWxlcnMuCgpLbm93biBzdXBwb3J0ZWQgY29tcGlsZXJzOgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpNaWNyb3NvZnQgVmlzdWFsIEMrKyA5LjA6CiAgICBNaWNyb3NvZnQgVmlzdWFsIEMrKyBDb21waWxlciBmb3IgUHl0aG9uIDIuNyAoeDg2LCBhbWQ2NCkKICAgIE1pY3Jvc29mdCBXaW5kb3dzIFNESyA2LjEgKHg4NiwgeDY0LCBpYTY0KQogICAgTWljcm9zb2Z0IFdpbmRvd3MgU0RLIDcuMCAoeDg2LCB4NjQsIGlhNjQpCgpNaWNyb3NvZnQgVmlzdWFsIEMrKyAxMC4wOgogICAgTWljcm9zb2Z0IFdpbmRvd3MgU0RLIDcuMSAoeDg2LCB4NjQsIGlhNjQpCgpNaWNyb3NvZnQgVmlzdWFsIEMrKyAxNC5YOgogICAgTWljcm9zb2Z0IFZpc3VhbCBDKysgQnVpbGQgVG9vbHMgMjAxNSAoeDg2LCB4NjQsIGFybSkKICAgIE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIEJ1aWxkIFRvb2xzIDIwMTcgKHg4NiwgeDY0LCBhcm0sIGFybTY0KQogICAgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gQnVpbGQgVG9vbHMgMjAxOSAoeDg2LCB4NjQsIGFybSwgYXJtNjQpCgpUaGlzIG1heSBhbHNvIHN1cHBvcnQgY29tcGlsZXJzIHNoaXBwZWQgd2l0aCBjb21wYXRpYmxlIFZpc3VhbCBTdHVkaW8gdmVyc2lvbnMuCiIiIgoKaW1wb3J0IGpzb24KZnJvbSBpbyBpbXBvcnQgb3Blbgpmcm9tIG9zIGltcG9ydCBsaXN0ZGlyLCBwYXRoc2VwCmZyb20gb3MucGF0aCBpbXBvcnQgam9pbiwgaXNmaWxlLCBpc2RpciwgZGlybmFtZQppbXBvcnQgc3lzCmltcG9ydCBwbGF0Zm9ybQppbXBvcnQgaXRlcnRvb2xzCmltcG9ydCBkaXN0dXRpbHMuZXJyb3JzCmZyb20gc2V0dXB0b29scy5leHRlcm4ucGFja2FnaW5nLnZlcnNpb24gaW1wb3J0IExlZ2FjeVZlcnNpb24KCmZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4Lm1vdmVzIGltcG9ydCBmaWx0ZXJmYWxzZQoKZnJvbSAubW9ua2V5IGltcG9ydCBnZXRfdW5wYXRjaGVkCgppZiBwbGF0Zm9ybS5zeXN0ZW0oKSA9PSAnV2luZG93cyc6CiAgICBmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnNpeC5tb3ZlcyBpbXBvcnQgd2lucmVnCiAgICBmcm9tIG9zIGltcG9ydCBlbnZpcm9uCmVsc2U6CiAgICAjIE1vY2sgd2lucmVnIGFuZCBlbnZpcm9uIHNvIHRoZSBtb2R1bGUgY2FuIGJlIGltcG9ydGVkIG9uIHRoaXMgcGxhdGZvcm0uCgogICAgY2xhc3Mgd2lucmVnOgogICAgICAgIEhLRVlfVVNFUlMgPSBOb25lCiAgICAgICAgSEtFWV9DVVJSRU5UX1VTRVIgPSBOb25lCiAgICAgICAgSEtFWV9MT0NBTF9NQUNISU5FID0gTm9uZQogICAgICAgIEhLRVlfQ0xBU1NFU19ST09UID0gTm9uZQoKICAgIGVudmlyb24gPSBkaWN0KCkKCl9tc3ZjOV9zdXBwcmVzc19lcnJvcnMgPSAoCiAgICAjIG1zdmM5Y29tcGlsZXIgaXNuJ3QgYXZhaWxhYmxlIG9uIHNvbWUgcGxhdGZvcm1zCiAgICBJbXBvcnRFcnJvciwKCiAgICAjIG1zdmM5Y29tcGlsZXIgcmFpc2VzIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IgaW4gc29tZQogICAgIyBlbnZpcm9ubWVudHMuIFNlZSAjMTExOC4KICAgIGRpc3R1dGlscy5lcnJvcnMuRGlzdHV0aWxzUGxhdGZvcm1FcnJvciwKKQoKdHJ5OgogICAgZnJvbSBkaXN0dXRpbHMubXN2Yzljb21waWxlciBpbXBvcnQgUmVnCmV4Y2VwdCBfbXN2Yzlfc3VwcHJlc3NfZXJyb3JzOgogICAgcGFzcwoKCmRlZiBtc3ZjOV9maW5kX3ZjdmFyc2FsbCh2ZXJzaW9uKToKICAgICIiIgogICAgUGF0Y2hlZCAiZGlzdHV0aWxzLm1zdmM5Y29tcGlsZXIuZmluZF92Y3ZhcnNhbGwiIHRvIHVzZSB0aGUgc3RhbmRhbG9uZQogICAgY29tcGlsZXIgYnVpbGQgZm9yIFB5dGhvbgogICAgKFZDRm9yUHl0aG9uIC8gTWljcm9zb2Z0IFZpc3VhbCBDKysgQ29tcGlsZXIgZm9yIFB5dGhvbiAyLjcpLgoKICAgIEZhbGwgYmFjayB0byBvcmlnaW5hbCBiZWhhdmlvciB3aGVuIHRoZSBzdGFuZGFsb25lIGNvbXBpbGVyIGlzIG5vdAogICAgYXZhaWxhYmxlLgoKICAgIFJlZGlyZWN0IHRoZSBwYXRoIG9mICJ2Y3ZhcnNhbGwuYmF0Ii4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICB2ZXJzaW9uOiBmbG9hdAogICAgICAgIFJlcXVpcmVkIE1pY3Jvc29mdCBWaXN1YWwgQysrIHZlcnNpb24uCgogICAgUmV0dXJuCiAgICAtLS0tLS0KICAgIHN0cgogICAgICAgIHZjdmFyc2FsbC5iYXQgcGF0aAogICAgIiIiCiAgICB2Y19iYXNlID0gcidTb2Z0d2FyZVwlc01pY3Jvc29mdFxEZXZEaXZcVkNGb3JQeXRob25cJTAuMWYnCiAgICBrZXkgPSB2Y19iYXNlICUgKCcnLCB2ZXJzaW9uKQogICAgdHJ5OgogICAgICAgICMgUGVyLXVzZXIgaW5zdGFsbHMgcmVnaXN0ZXIgdGhlIGNvbXBpbGVyIHBhdGggaGVyZQogICAgICAgIHByb2R1Y3RkaXIgPSBSZWcuZ2V0X3ZhbHVlKGtleSwgImluc3RhbGxkaXIiKQogICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgIHRyeToKICAgICAgICAgICAgIyBBbGwtdXNlciBpbnN0YWxscyBvbiBhIDY0LWJpdCBzeXN0ZW0gcmVnaXN0ZXIgaGVyZQogICAgICAgICAgICBrZXkgPSB2Y19iYXNlICUgKCdXb3c2NDMyTm9kZVxcJywgdmVyc2lvbikKICAgICAgICAgICAgcHJvZHVjdGRpciA9IFJlZy5nZXRfdmFsdWUoa2V5LCAiaW5zdGFsbGRpciIpCiAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICBwcm9kdWN0ZGlyID0gTm9uZQoKICAgIGlmIHByb2R1Y3RkaXI6CiAgICAgICAgdmN2YXJzYWxsID0gam9pbihwcm9kdWN0ZGlyLCAidmN2YXJzYWxsLmJhdCIpCiAgICAgICAgaWYgaXNmaWxlKHZjdmFyc2FsbCk6CiAgICAgICAgICAgIHJldHVybiB2Y3ZhcnNhbGwKCiAgICByZXR1cm4gZ2V0X3VucGF0Y2hlZChtc3ZjOV9maW5kX3ZjdmFyc2FsbCkodmVyc2lvbikKCgpkZWYgbXN2YzlfcXVlcnlfdmN2YXJzYWxsKHZlciwgYXJjaD0neDg2JywgKmFyZ3MsICoqa3dhcmdzKToKICAgICIiIgogICAgUGF0Y2hlZCAiZGlzdHV0aWxzLm1zdmM5Y29tcGlsZXIucXVlcnlfdmN2YXJzYWxsIiBmb3Igc3VwcG9ydCBleHRyYQogICAgTWljcm9zb2Z0IFZpc3VhbCBDKysgOS4wIGFuZCAxMC4wIGNvbXBpbGVycy4KCiAgICBTZXQgZW52aXJvbm1lbnQgd2l0aG91dCB1c2Ugb2YgInZjdmFyc2FsbC5iYXQiLgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIHZlcjogZmxvYXQKICAgICAgICBSZXF1aXJlZCBNaWNyb3NvZnQgVmlzdWFsIEMrKyB2ZXJzaW9uLgogICAgYXJjaDogc3RyCiAgICAgICAgVGFyZ2V0IGFyY2hpdGVjdHVyZS4KCiAgICBSZXR1cm4KICAgIC0tLS0tLQogICAgZGljdAogICAgICAgIGVudmlyb25tZW50CiAgICAiIiIKICAgICMgVHJ5IHRvIGdldCBlbnZpcm9ubWVudCBmcm9tIHZjdmFyc2FsbC5iYXQgKENsYXNzaWNhbCB3YXkpCiAgICB0cnk6CiAgICAgICAgb3JpZyA9IGdldF91bnBhdGNoZWQobXN2YzlfcXVlcnlfdmN2YXJzYWxsKQogICAgICAgIHJldHVybiBvcmlnKHZlciwgYXJjaCwgKmFyZ3MsICoqa3dhcmdzKQogICAgZXhjZXB0IGRpc3R1dGlscy5lcnJvcnMuRGlzdHV0aWxzUGxhdGZvcm1FcnJvcjoKICAgICAgICAjIFBhc3MgZXJyb3IgaWYgVmN2YXJzYWxsLmJhdCBpcyBtaXNzaW5nCiAgICAgICAgcGFzcwogICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgIyBQYXNzIGVycm9yIGlmIGVudmlyb25tZW50IG5vdCBzZXQgYWZ0ZXIgZXhlY3V0aW5nIHZjdmFyc2FsbC5iYXQKICAgICAgICBwYXNzCgogICAgIyBJZiBlcnJvciwgdHJ5IHRvIHNldCBlbnZpcm9ubWVudCBkaXJlY3RseQogICAgdHJ5OgogICAgICAgIHJldHVybiBFbnZpcm9ubWVudEluZm8oYXJjaCwgdmVyKS5yZXR1cm5fZW52KCkKICAgIGV4Y2VwdCBkaXN0dXRpbHMuZXJyb3JzLkRpc3R1dGlsc1BsYXRmb3JtRXJyb3IgYXMgZXhjOgogICAgICAgIF9hdWdtZW50X2V4Y2VwdGlvbihleGMsIHZlciwgYXJjaCkKICAgICAgICByYWlzZQoKCmRlZiBtc3ZjMTRfZ2V0X3ZjX2VudihwbGF0X3NwZWMpOgogICAgIiIiCiAgICBQYXRjaGVkICJkaXN0dXRpbHMuX21zdmNjb21waWxlci5fZ2V0X3ZjX2VudiIgZm9yIHN1cHBvcnQgZXh0cmEKICAgIE1pY3Jvc29mdCBWaXN1YWwgQysrIDE0LlggY29tcGlsZXJzLgoKICAgIFNldCBlbnZpcm9ubWVudCB3aXRob3V0IHVzZSBvZiAidmN2YXJzYWxsLmJhdCIuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgcGxhdF9zcGVjOiBzdHIKICAgICAgICBUYXJnZXQgYXJjaGl0ZWN0dXJlLgoKICAgIFJldHVybgogICAgLS0tLS0tCiAgICBkaWN0CiAgICAgICAgZW52aXJvbm1lbnQKICAgICIiIgogICAgIyBUcnkgdG8gZ2V0IGVudmlyb25tZW50IGZyb20gdmN2YXJzYWxsLmJhdCAoQ2xhc3NpY2FsIHdheSkKICAgIHRyeToKICAgICAgICByZXR1cm4gZ2V0X3VucGF0Y2hlZChtc3ZjMTRfZ2V0X3ZjX2VudikocGxhdF9zcGVjKQogICAgZXhjZXB0IGRpc3R1dGlscy5lcnJvcnMuRGlzdHV0aWxzUGxhdGZvcm1FcnJvcjoKICAgICAgICAjIFBhc3MgZXJyb3IgVmN2YXJzYWxsLmJhdCBpcyBtaXNzaW5nCiAgICAgICAgcGFzcwoKICAgICMgSWYgZXJyb3IsIHRyeSB0byBzZXQgZW52aXJvbm1lbnQgZGlyZWN0bHkKICAgIHRyeToKICAgICAgICByZXR1cm4gRW52aXJvbm1lbnRJbmZvKHBsYXRfc3BlYywgdmNfbWluX3Zlcj0xNC4wKS5yZXR1cm5fZW52KCkKICAgIGV4Y2VwdCBkaXN0dXRpbHMuZXJyb3JzLkRpc3R1dGlsc1BsYXRmb3JtRXJyb3IgYXMgZXhjOgogICAgICAgIF9hdWdtZW50X2V4Y2VwdGlvbihleGMsIDE0LjApCiAgICAgICAgcmFpc2UKCgpkZWYgbXN2YzE0X2dlbl9saWJfb3B0aW9ucygqYXJncywgKiprd2FyZ3MpOgogICAgIiIiCiAgICBQYXRjaGVkICJkaXN0dXRpbHMuX21zdmNjb21waWxlci5nZW5fbGliX29wdGlvbnMiIGZvciBmaXgKICAgIGNvbXBhdGliaWxpdHkgYmV0d2VlbiAibnVtcHkuZGlzdHV0aWxzIiBhbmQgImRpc3R1dGlscy5fbXN2Y2NvbXBpbGVyIgogICAgKGZvciBOdW1weSA8IDEuMTEuMikKICAgICIiIgogICAgaWYgIm51bXB5LmRpc3R1dGlscyIgaW4gc3lzLm1vZHVsZXM6CiAgICAgICAgaW1wb3J0IG51bXB5IGFzIG5wCiAgICAgICAgaWYgTGVnYWN5VmVyc2lvbihucC5fX3ZlcnNpb25fXykgPCBMZWdhY3lWZXJzaW9uKCcxLjExLjInKToKICAgICAgICAgICAgcmV0dXJuIG5wLmRpc3R1dGlscy5jY29tcGlsZXIuZ2VuX2xpYl9vcHRpb25zKCphcmdzLCAqKmt3YXJncykKICAgIHJldHVybiBnZXRfdW5wYXRjaGVkKG1zdmMxNF9nZW5fbGliX29wdGlvbnMpKCphcmdzLCAqKmt3YXJncykKCgpkZWYgX2F1Z21lbnRfZXhjZXB0aW9uKGV4YywgdmVyc2lvbiwgYXJjaD0nJyk6CiAgICAiIiIKICAgIEFkZCBkZXRhaWxzIHRvIHRoZSBleGNlcHRpb24gbWVzc2FnZSB0byBoZWxwIGd1aWRlIHRoZSB1c2VyCiAgICBhcyB0byB3aGF0IGFjdGlvbiB3aWxsIHJlc29sdmUgaXQuCiAgICAiIiIKICAgICMgRXJyb3IgaWYgTVNWQysrIGRpcmVjdG9yeSBub3QgZm91bmQgb3IgZW52aXJvbm1lbnQgbm90IHNldAogICAgbWVzc2FnZSA9IGV4Yy5hcmdzWzBdCgogICAgaWYgInZjdmFyc2FsbCIgaW4gbWVzc2FnZS5sb3dlcigpIG9yICJ2aXN1YWwgYyIgaW4gbWVzc2FnZS5sb3dlcigpOgogICAgICAgICMgU3BlY2lhbCBlcnJvciBtZXNzYWdlIGlmIE1TVkMrKyBub3QgaW5zdGFsbGVkCiAgICAgICAgdG1wbCA9ICdNaWNyb3NvZnQgVmlzdWFsIEMrKyB7dmVyc2lvbjowLjFmfSBpcyByZXF1aXJlZC4nCiAgICAgICAgbWVzc2FnZSA9IHRtcGwuZm9ybWF0KCoqbG9jYWxzKCkpCiAgICAgICAgbXNkb3dubG9hZCA9ICd3d3cubWljcm9zb2Z0LmNvbS9kb3dubG9hZC9kZXRhaWxzLmFzcHg/aWQ9JWQnCiAgICAgICAgaWYgdmVyc2lvbiA9PSA5LjA6CiAgICAgICAgICAgIGlmIGFyY2gubG93ZXIoKS5maW5kKCdpYTY0JykgPiAtMToKICAgICAgICAgICAgICAgICMgRm9yIFZDKysgOS4wLCBpZiBJQTY0IHN1cHBvcnQgaXMgbmVlZGVkLCByZWRpcmVjdCB1c2VyCiAgICAgICAgICAgICAgICAjIHRvIFdpbmRvd3MgU0RLIDcuMC4KICAgICAgICAgICAgICAgICMgTm90ZTogTm8gZG93bmxvYWQgbGluayBhdmFpbGFibGUgZnJvbSBNaWNyb3NvZnQuCiAgICAgICAgICAgICAgICBtZXNzYWdlICs9ICcgR2V0IGl0IHdpdGggIk1pY3Jvc29mdCBXaW5kb3dzIFNESyA3LjAiJwogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBGb3IgVkMrKyA5LjAgcmVkaXJlY3QgdXNlciB0byBWYysrIGZvciBQeXRob24gMi43IDoKICAgICAgICAgICAgICAgICMgVGhpcyByZWRpcmVjdGlvbiBsaW5rIGlzIG1haW50YWluZWQgYnkgTWljcm9zb2Z0LgogICAgICAgICAgICAgICAgIyBDb250YWN0IHZzcHl0aG9uQG1pY3Jvc29mdC5jb20gaWYgaXQgbmVlZHMgdXBkYXRpbmcuCiAgICAgICAgICAgICAgICBtZXNzYWdlICs9ICcgR2V0IGl0IGZyb20gaHR0cDovL2FrYS5tcy92Y3B5dGhvbjI3JwogICAgICAgIGVsaWYgdmVyc2lvbiA9PSAxMC4wOgogICAgICAgICAgICAjIEZvciBWQysrIDEwLjAgUmVkaXJlY3QgdXNlciB0byBXaW5kb3dzIFNESyA3LjEKICAgICAgICAgICAgbWVzc2FnZSArPSAnIEdldCBpdCB3aXRoICJNaWNyb3NvZnQgV2luZG93cyBTREsgNy4xIjogJwogICAgICAgICAgICBtZXNzYWdlICs9IG1zZG93bmxvYWQgJSA4Mjc5CiAgICAgICAgZWxpZiB2ZXJzaW9uID49IDE0LjA6CiAgICAgICAgICAgICMgRm9yIFZDKysgMTQuWCBSZWRpcmVjdCB1c2VyIHRvIGxhdGVzdCBWaXN1YWwgQysrIEJ1aWxkIFRvb2xzCiAgICAgICAgICAgIG1lc3NhZ2UgKz0gKCcgR2V0IGl0IHdpdGggIkJ1aWxkIFRvb2xzIGZvciBWaXN1YWwgU3R1ZGlvIjogJwogICAgICAgICAgICAgICAgICAgICAgICByJ2h0dHBzOi8vdmlzdWFsc3R1ZGlvLm1pY3Jvc29mdC5jb20vZG93bmxvYWRzLycpCgogICAgZXhjLmFyZ3MgPSAobWVzc2FnZSwgKQoKCmNsYXNzIFBsYXRmb3JtSW5mbzoKICAgICIiIgogICAgQ3VycmVudCBhbmQgVGFyZ2V0IEFyY2hpdGVjdHVyZXMgaW5mb3JtYXRpb24uCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgYXJjaDogc3RyCiAgICAgICAgVGFyZ2V0IGFyY2hpdGVjdHVyZS4KICAgICIiIgogICAgY3VycmVudF9jcHUgPSBlbnZpcm9uLmdldCgncHJvY2Vzc29yX2FyY2hpdGVjdHVyZScsICcnKS5sb3dlcigpCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGFyY2gpOgogICAgICAgIHNlbGYuYXJjaCA9IGFyY2gubG93ZXIoKS5yZXBsYWNlKCd4NjQnLCAnYW1kNjQnKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHRhcmdldF9jcHUoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIFRhcmdldCBDUFUgYXJjaGl0ZWN0dXJlLgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBzdHIKICAgICAgICAgICAgVGFyZ2V0IENQVQogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLmFyY2hbc2VsZi5hcmNoLmZpbmQoJ18nKSArIDE6XQoKICAgIGRlZiB0YXJnZXRfaXNfeDg2KHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBUcnVlIGlmIHRhcmdldCBDUFUgaXMgeDg2IDMyIGJpdHMuLgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBib29sCiAgICAgICAgICAgIENQVSBpcyB4ODYgMzIgYml0cwogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLnRhcmdldF9jcHUgPT0gJ3g4NicKCiAgICBkZWYgY3VycmVudF9pc194ODYoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIFRydWUgaWYgY3VycmVudCBDUFUgaXMgeDg2IDMyIGJpdHMuLgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBib29sCiAgICAgICAgICAgIENQVSBpcyB4ODYgMzIgYml0cwogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLmN1cnJlbnRfY3B1ID09ICd4ODYnCgogICAgZGVmIGN1cnJlbnRfZGlyKHNlbGYsIGhpZGV4ODY9RmFsc2UsIHg2ND1GYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgQ3VycmVudCBwbGF0Zm9ybSBzcGVjaWZpYyBzdWJmb2xkZXIuCgogICAgICAgIFBhcmFtZXRlcnMKICAgICAgICAtLS0tLS0tLS0tCiAgICAgICAgaGlkZXg4NjogYm9vbAogICAgICAgICAgICByZXR1cm4gJycgYW5kIG5vdCAnXHg4NicgaWYgYXJjaGl0ZWN0dXJlIGlzIHg4Ni4KICAgICAgICB4NjQ6IGJvb2wKICAgICAgICAgICAgcmV0dXJuICdceDY0JyBhbmQgbm90ICdcYW1kNjQnIGlmIGFyY2hpdGVjdHVyZSBpcyBhbWQ2NC4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgc3RyCiAgICAgICAgICAgIHN1YmZvbGRlcjogJ1x0YXJnZXQnLCBvciAnJyAoc2VlIGhpZGV4ODYgcGFyYW1ldGVyKQogICAgICAgICIiIgogICAgICAgIHJldHVybiAoCiAgICAgICAgICAgICcnIGlmIChzZWxmLmN1cnJlbnRfY3B1ID09ICd4ODYnIGFuZCBoaWRleDg2KSBlbHNlCiAgICAgICAgICAgIHInXHg2NCcgaWYgKHNlbGYuY3VycmVudF9jcHUgPT0gJ2FtZDY0JyBhbmQgeDY0KSBlbHNlCiAgICAgICAgICAgIHInXCVzJyAlIHNlbGYuY3VycmVudF9jcHUKICAgICAgICApCgogICAgZGVmIHRhcmdldF9kaXIoc2VsZiwgaGlkZXg4Nj1GYWxzZSwgeDY0PUZhbHNlKToKICAgICAgICByIiIiCiAgICAgICAgVGFyZ2V0IHBsYXRmb3JtIHNwZWNpZmljIHN1YmZvbGRlci4KCiAgICAgICAgUGFyYW1ldGVycwogICAgICAgIC0tLS0tLS0tLS0KICAgICAgICBoaWRleDg2OiBib29sCiAgICAgICAgICAgIHJldHVybiAnJyBhbmQgbm90ICdceDg2JyBpZiBhcmNoaXRlY3R1cmUgaXMgeDg2LgogICAgICAgIHg2NDogYm9vbAogICAgICAgICAgICByZXR1cm4gJ1x4NjQnIGFuZCBub3QgJ1xhbWQ2NCcgaWYgYXJjaGl0ZWN0dXJlIGlzIGFtZDY0LgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBzdHIKICAgICAgICAgICAgc3ViZm9sZGVyOiAnXGN1cnJlbnQnLCBvciAnJyAoc2VlIGhpZGV4ODYgcGFyYW1ldGVyKQogICAgICAgICIiIgogICAgICAgIHJldHVybiAoCiAgICAgICAgICAgICcnIGlmIChzZWxmLnRhcmdldF9jcHUgPT0gJ3g4NicgYW5kIGhpZGV4ODYpIGVsc2UKICAgICAgICAgICAgcidceDY0JyBpZiAoc2VsZi50YXJnZXRfY3B1ID09ICdhbWQ2NCcgYW5kIHg2NCkgZWxzZQogICAgICAgICAgICByJ1wlcycgJSBzZWxmLnRhcmdldF9jcHUKICAgICAgICApCgogICAgZGVmIGNyb3NzX2RpcihzZWxmLCBmb3JjZXg4Nj1GYWxzZSk6CiAgICAgICAgciIiIgogICAgICAgIENyb3NzIHBsYXRmb3JtIHNwZWNpZmljIHN1YmZvbGRlci4KCiAgICAgICAgUGFyYW1ldGVycwogICAgICAgIC0tLS0tLS0tLS0KICAgICAgICBmb3JjZXg4NjogYm9vbAogICAgICAgICAgICBVc2UgJ3g4NicgYXMgY3VycmVudCBhcmNoaXRlY3R1cmUgZXZlbiBpZiBjdXJyZW50IGFyY2hpdGVjdHVyZSBpcwogICAgICAgICAgICBub3QgeDg2LgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBzdHIKICAgICAgICAgICAgc3ViZm9sZGVyOiAnJyBpZiB0YXJnZXQgYXJjaGl0ZWN0dXJlIGlzIGN1cnJlbnQgYXJjaGl0ZWN0dXJlLAogICAgICAgICAgICAnXGN1cnJlbnRfdGFyZ2V0JyBpZiBub3QuCiAgICAgICAgIiIiCiAgICAgICAgY3VycmVudCA9ICd4ODYnIGlmIGZvcmNleDg2IGVsc2Ugc2VsZi5jdXJyZW50X2NwdQogICAgICAgIHJldHVybiAoCiAgICAgICAgICAgICcnIGlmIHNlbGYudGFyZ2V0X2NwdSA9PSBjdXJyZW50IGVsc2UKICAgICAgICAgICAgc2VsZi50YXJnZXRfZGlyKCkucmVwbGFjZSgnXFwnLCAnXFwlc18nICUgY3VycmVudCkKICAgICAgICApCgoKY2xhc3MgUmVnaXN0cnlJbmZvOgogICAgIiIiCiAgICBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyByZWxhdGVkIHJlZ2lzdHJ5IGluZm9ybWF0aW9uLgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIHBsYXRmb3JtX2luZm86IFBsYXRmb3JtSW5mbwogICAgICAgICJQbGF0Zm9ybUluZm8iIGluc3RhbmNlLgogICAgIiIiCiAgICBIS0VZUyA9ICh3aW5yZWcuSEtFWV9VU0VSUywKICAgICAgICAgICAgIHdpbnJlZy5IS0VZX0NVUlJFTlRfVVNFUiwKICAgICAgICAgICAgIHdpbnJlZy5IS0VZX0xPQ0FMX01BQ0hJTkUsCiAgICAgICAgICAgICB3aW5yZWcuSEtFWV9DTEFTU0VTX1JPT1QpCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHBsYXRmb3JtX2luZm8pOgogICAgICAgIHNlbGYucGkgPSBwbGF0Zm9ybV9pbmZvCgogICAgQHByb3BlcnR5CiAgICBkZWYgdmlzdWFsc3R1ZGlvKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIHJvb3QgcmVnaXN0cnkga2V5LgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBzdHIKICAgICAgICAgICAgUmVnaXN0cnkga2V5CiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuICdWaXN1YWxTdHVkaW8nCgogICAgQHByb3BlcnR5CiAgICBkZWYgc3hzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFN4UyByZWdpc3RyeSBrZXkuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIHN0cgogICAgICAgICAgICBSZWdpc3RyeSBrZXkKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gam9pbihzZWxmLnZpc3VhbHN0dWRpbywgJ1N4UycpCgogICAgQHByb3BlcnR5CiAgICBkZWYgdmMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBDKysgVkM3IHJlZ2lzdHJ5IGtleS4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgc3RyCiAgICAgICAgICAgIFJlZ2lzdHJ5IGtleQogICAgICAgICIiIgogICAgICAgIHJldHVybiBqb2luKHNlbGYuc3hzLCAnVkM3JykKCiAgICBAcHJvcGVydHkKICAgIGRlZiB2cyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBWUzcgcmVnaXN0cnkga2V5LgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBzdHIKICAgICAgICAgICAgUmVnaXN0cnkga2V5CiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGpvaW4oc2VsZi5zeHMsICdWUzcnKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHZjX2Zvcl9weXRob24oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBDKysgZm9yIFB5dGhvbiByZWdpc3RyeSBrZXkuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIHN0cgogICAgICAgICAgICBSZWdpc3RyeSBrZXkKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gcidEZXZEaXZcVkNGb3JQeXRob24nCgogICAgQHByb3BlcnR5CiAgICBkZWYgbWljcm9zb2Z0X3NkayhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgU0RLIHJlZ2lzdHJ5IGtleS4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgc3RyCiAgICAgICAgICAgIFJlZ2lzdHJ5IGtleQogICAgICAgICIiIgogICAgICAgIHJldHVybiAnTWljcm9zb2Z0IFNES3MnCgogICAgQHByb3BlcnR5CiAgICBkZWYgd2luZG93c19zZGsoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFdpbmRvd3MvUGxhdGZvcm0gU0RLIHJlZ2lzdHJ5IGtleS4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgc3RyCiAgICAgICAgICAgIFJlZ2lzdHJ5IGtleQogICAgICAgICIiIgogICAgICAgIHJldHVybiBqb2luKHNlbGYubWljcm9zb2Z0X3NkaywgJ1dpbmRvd3MnKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIG5ldGZ4X3NkayhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgLk5FVCBGcmFtZXdvcmsgU0RLIHJlZ2lzdHJ5IGtleS4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgc3RyCiAgICAgICAgICAgIFJlZ2lzdHJ5IGtleQogICAgICAgICIiIgogICAgICAgIHJldHVybiBqb2luKHNlbGYubWljcm9zb2Z0X3NkaywgJ05FVEZYU0RLJykKCiAgICBAcHJvcGVydHkKICAgIGRlZiB3aW5kb3dzX2tpdHNfcm9vdHMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFdpbmRvd3MgS2l0cyBSb290cyByZWdpc3RyeSBrZXkuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIHN0cgogICAgICAgICAgICBSZWdpc3RyeSBrZXkKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gcidXaW5kb3dzIEtpdHNcSW5zdGFsbGVkIFJvb3RzJwoKICAgIGRlZiBtaWNyb3NvZnQoc2VsZiwga2V5LCB4ODY9RmFsc2UpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBrZXkgaW4gTWljcm9zb2Z0IHNvZnR3YXJlIHJlZ2lzdHJ5LgoKICAgICAgICBQYXJhbWV0ZXJzCiAgICAgICAgLS0tLS0tLS0tLQogICAgICAgIGtleTogc3RyCiAgICAgICAgICAgIFJlZ2lzdHJ5IGtleSBwYXRoIHdoZXJlIGxvb2suCiAgICAgICAgeDg2OiBzdHIKICAgICAgICAgICAgRm9yY2UgeDg2IHNvZnR3YXJlIHJlZ2lzdHJ5LgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBzdHIKICAgICAgICAgICAgUmVnaXN0cnkga2V5CiAgICAgICAgIiIiCiAgICAgICAgbm9kZTY0ID0gJycgaWYgc2VsZi5waS5jdXJyZW50X2lzX3g4NigpIG9yIHg4NiBlbHNlICdXb3c2NDMyTm9kZScKICAgICAgICByZXR1cm4gam9pbignU29mdHdhcmUnLCBub2RlNjQsICdNaWNyb3NvZnQnLCBrZXkpCgogICAgZGVmIGxvb2t1cChzZWxmLCBrZXksIG5hbWUpOgogICAgICAgICIiIgogICAgICAgIExvb2sgZm9yIHZhbHVlcyBpbiByZWdpc3RyeSBpbiBNaWNyb3NvZnQgc29mdHdhcmUgcmVnaXN0cnkuCgogICAgICAgIFBhcmFtZXRlcnMKICAgICAgICAtLS0tLS0tLS0tCiAgICAgICAga2V5OiBzdHIKICAgICAgICAgICAgUmVnaXN0cnkga2V5IHBhdGggd2hlcmUgbG9vay4KICAgICAgICBuYW1lOiBzdHIKICAgICAgICAgICAgVmFsdWUgbmFtZSB0byBmaW5kLgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBzdHIKICAgICAgICAgICAgdmFsdWUKICAgICAgICAiIiIKICAgICAgICBrZXlfcmVhZCA9IHdpbnJlZy5LRVlfUkVBRAogICAgICAgIG9wZW5rZXkgPSB3aW5yZWcuT3BlbktleQogICAgICAgIG1zID0gc2VsZi5taWNyb3NvZnQKICAgICAgICBmb3IgaGtleSBpbiBzZWxmLkhLRVlTOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBia2V5ID0gb3BlbmtleShoa2V5LCBtcyhrZXkpLCAwLCBrZXlfcmVhZCkKICAgICAgICAgICAgZXhjZXB0IChPU0Vycm9yLCBJT0Vycm9yKToKICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLnBpLmN1cnJlbnRfaXNfeDg2KCk6CiAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICBia2V5ID0gb3BlbmtleShoa2V5LCBtcyhrZXksIFRydWUpLCAwLCBrZXlfcmVhZCkKICAgICAgICAgICAgICAgICAgICBleGNlcHQgKE9TRXJyb3IsIElPRXJyb3IpOgogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZXR1cm4gd2lucmVnLlF1ZXJ5VmFsdWVFeChia2V5LCBuYW1lKVswXQogICAgICAgICAgICBleGNlcHQgKE9TRXJyb3IsIElPRXJyb3IpOgogICAgICAgICAgICAgICAgcGFzcwoKCmNsYXNzIFN5c3RlbUluZm86CiAgICAiIiIKICAgIE1pY3Jvc29mdCBXaW5kb3dzIGFuZCBWaXN1YWwgU3R1ZGlvIHJlbGF0ZWQgc3lzdGVtIGluZm9ybWF0aW9uLgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIHJlZ2lzdHJ5X2luZm86IFJlZ2lzdHJ5SW5mbwogICAgICAgICJSZWdpc3RyeUluZm8iIGluc3RhbmNlLgogICAgdmNfdmVyOiBmbG9hdAogICAgICAgIFJlcXVpcmVkIE1pY3Jvc29mdCBWaXN1YWwgQysrIHZlcnNpb24uCiAgICAiIiIKCiAgICAjIFZhcmlhYmxlcyBhbmQgcHJvcGVydGllcyBpbiB0aGlzIGNsYXNzIHVzZSBvcmlnaW5hbHMgQ2FtZWxDYXNlIHZhcmlhYmxlcwogICAgIyBuYW1lcyBmcm9tIE1pY3Jvc29mdCBzb3VyY2UgZmlsZXMgZm9yIG1vcmUgZWFzeSBjb21wYXJpc29uLgogICAgV2luRGlyID0gZW52aXJvbi5nZXQoJ1dpbkRpcicsICcnKQogICAgUHJvZ3JhbUZpbGVzID0gZW52aXJvbi5nZXQoJ1Byb2dyYW1GaWxlcycsICcnKQogICAgUHJvZ3JhbUZpbGVzeDg2ID0gZW52aXJvbi5nZXQoJ1Byb2dyYW1GaWxlcyh4ODYpJywgUHJvZ3JhbUZpbGVzKQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCByZWdpc3RyeV9pbmZvLCB2Y192ZXI9Tm9uZSk6CiAgICAgICAgc2VsZi5yaSA9IHJlZ2lzdHJ5X2luZm8KICAgICAgICBzZWxmLnBpID0gc2VsZi5yaS5waQoKICAgICAgICBzZWxmLmtub3duX3ZzX3BhdGhzID0gc2VsZi5maW5kX3Byb2dyYW1kYXRhX3ZzX3ZlcnMoKQoKICAgICAgICAjIEV4Y2VwdCBmb3IgVlMxNSssIFZDIHZlcnNpb24gaXMgYWxpZ25lZCB3aXRoIFZTIHZlcnNpb24KICAgICAgICBzZWxmLnZzX3ZlciA9IHNlbGYudmNfdmVyID0gKAogICAgICAgICAgICAgICAgdmNfdmVyIG9yIHNlbGYuX2ZpbmRfbGF0ZXN0X2F2YWlsYWJsZV92c192ZXIoKSkKCiAgICBkZWYgX2ZpbmRfbGF0ZXN0X2F2YWlsYWJsZV92c192ZXIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgRmluZCB0aGUgbGF0ZXN0IFZDIHZlcnNpb24KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgZmxvYXQKICAgICAgICAgICAgdmVyc2lvbgogICAgICAgICIiIgogICAgICAgIHJlZ192Y192ZXJzID0gc2VsZi5maW5kX3JlZ192c192ZXJzKCkKCiAgICAgICAgaWYgbm90IChyZWdfdmNfdmVycyBvciBzZWxmLmtub3duX3ZzX3BhdGhzKToKICAgICAgICAgICAgcmFpc2UgZGlzdHV0aWxzLmVycm9ycy5EaXN0dXRpbHNQbGF0Zm9ybUVycm9yKAogICAgICAgICAgICAgICAgJ05vIE1pY3Jvc29mdCBWaXN1YWwgQysrIHZlcnNpb24gZm91bmQnKQoKICAgICAgICB2Y192ZXJzID0gc2V0KHJlZ192Y192ZXJzKQogICAgICAgIHZjX3ZlcnMudXBkYXRlKHNlbGYua25vd25fdnNfcGF0aHMpCiAgICAgICAgcmV0dXJuIHNvcnRlZCh2Y192ZXJzKVstMV0KCiAgICBkZWYgZmluZF9yZWdfdnNfdmVycyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBGaW5kIE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIHZlcnNpb25zIGF2YWlsYWJsZSBpbiByZWdpc3RyeS4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgbGlzdCBvZiBmbG9hdAogICAgICAgICAgICBWZXJzaW9ucwogICAgICAgICIiIgogICAgICAgIG1zID0gc2VsZi5yaS5taWNyb3NvZnQKICAgICAgICB2Y2tleXMgPSAoc2VsZi5yaS52Yywgc2VsZi5yaS52Y19mb3JfcHl0aG9uLCBzZWxmLnJpLnZzKQogICAgICAgIHZzX3ZlcnMgPSBbXQogICAgICAgIGZvciBoa2V5IGluIHNlbGYucmkuSEtFWVM6CiAgICAgICAgICAgIGZvciBrZXkgaW4gdmNrZXlzOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGJrZXkgPSB3aW5yZWcuT3BlbktleShoa2V5LCBtcyhrZXkpLCAwLCB3aW5yZWcuS0VZX1JFQUQpCiAgICAgICAgICAgICAgICBleGNlcHQgKE9TRXJyb3IsIElPRXJyb3IpOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBzdWJrZXlzLCB2YWx1ZXMsIF8gPSB3aW5yZWcuUXVlcnlJbmZvS2V5KGJrZXkpCiAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSh2YWx1ZXMpOgogICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgdmVyID0gZmxvYXQod2lucmVnLkVudW1WYWx1ZShia2V5LCBpKVswXSkKICAgICAgICAgICAgICAgICAgICAgICAgaWYgdmVyIG5vdCBpbiB2c192ZXJzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdnNfdmVycy5hcHBlbmQodmVyKQogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShzdWJrZXlzKToKICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgIHZlciA9IGZsb2F0KHdpbnJlZy5FbnVtS2V5KGJrZXksIGkpKQogICAgICAgICAgICAgICAgICAgICAgICBpZiB2ZXIgbm90IGluIHZzX3ZlcnM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2c192ZXJzLmFwcGVuZCh2ZXIpCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICByZXR1cm4gc29ydGVkKHZzX3ZlcnMpCgogICAgZGVmIGZpbmRfcHJvZ3JhbWRhdGFfdnNfdmVycyhzZWxmKToKICAgICAgICByIiIiCiAgICAgICAgRmluZCBWaXN1YWwgc3R1ZGlvIDIwMTcrIHZlcnNpb25zIGZyb20gaW5mb3JtYXRpb24gaW4KICAgICAgICAiQzpcUHJvZ3JhbURhdGFcTWljcm9zb2Z0XFZpc3VhbFN0dWRpb1xQYWNrYWdlc1xfSW5zdGFuY2VzIi4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgZGljdAogICAgICAgICAgICBmbG9hdCB2ZXJzaW9uIGFzIGtleSwgcGF0aCBhcyB2YWx1ZS4KICAgICAgICAiIiIKICAgICAgICB2c192ZXJzaW9ucyA9IHt9CiAgICAgICAgaW5zdGFuY2VzX2RpciA9IFwKICAgICAgICAgICAgcidDOlxQcm9ncmFtRGF0YVxNaWNyb3NvZnRcVmlzdWFsU3R1ZGlvXFBhY2thZ2VzXF9JbnN0YW5jZXMnCgogICAgICAgIHRyeToKICAgICAgICAgICAgaGFzaGVkX25hbWVzID0gbGlzdGRpcihpbnN0YW5jZXNfZGlyKQoKICAgICAgICBleGNlcHQgKE9TRXJyb3IsIElPRXJyb3IpOgogICAgICAgICAgICAjIERpcmVjdG9yeSBub3QgZXhpc3RzIHdpdGggYWxsIFZpc3VhbCBTdHVkaW8gdmVyc2lvbnMKICAgICAgICAgICAgcmV0dXJuIHZzX3ZlcnNpb25zCgogICAgICAgIGZvciBuYW1lIGluIGhhc2hlZF9uYW1lczoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIyBHZXQgVlMgaW5zdGFsbGF0aW9uIHBhdGggZnJvbSAic3RhdGUuanNvbiIgZmlsZQogICAgICAgICAgICAgICAgc3RhdGVfcGF0aCA9IGpvaW4oaW5zdGFuY2VzX2RpciwgbmFtZSwgJ3N0YXRlLmpzb24nKQogICAgICAgICAgICAgICAgd2l0aCBvcGVuKHN0YXRlX3BhdGgsICdydCcsIGVuY29kaW5nPSd1dGYtOCcpIGFzIHN0YXRlX2ZpbGU6CiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBqc29uLmxvYWQoc3RhdGVfZmlsZSkKICAgICAgICAgICAgICAgIHZzX3BhdGggPSBzdGF0ZVsnaW5zdGFsbGF0aW9uUGF0aCddCgogICAgICAgICAgICAgICAgIyBSYWlzZXMgT1NFcnJvciBpZiB0aGlzIFZTIGluc3RhbGxhdGlvbiBkb2VzIG5vdCBjb250YWluIFZDCiAgICAgICAgICAgICAgICBsaXN0ZGlyKGpvaW4odnNfcGF0aCwgcidWQ1xUb29sc1xNU1ZDJykpCgogICAgICAgICAgICAgICAgIyBTdG9yZSB2ZXJzaW9uIGFuZCBwYXRoCiAgICAgICAgICAgICAgICB2c192ZXJzaW9uc1tzZWxmLl9hc19mbG9hdF92ZXJzaW9uKAogICAgICAgICAgICAgICAgICAgIHN0YXRlWydpbnN0YWxsYXRpb25WZXJzaW9uJ10pXSA9IHZzX3BhdGgKCiAgICAgICAgICAgIGV4Y2VwdCAoT1NFcnJvciwgSU9FcnJvciwgS2V5RXJyb3IpOgogICAgICAgICAgICAgICAgIyBTa2lwIGlmICJzdGF0ZS5qc29uIiBmaWxlIGlzIG1pc3Npbmcgb3IgYmFkIGZvcm1hdAogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgcmV0dXJuIHZzX3ZlcnNpb25zCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9hc19mbG9hdF92ZXJzaW9uKHZlcnNpb24pOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBhIHN0cmluZyB2ZXJzaW9uIGFzIGEgc2ltcGxpZmllZCBmbG9hdCB2ZXJzaW9uIChtYWpvci5taW5vcikKCiAgICAgICAgUGFyYW1ldGVycwogICAgICAgIC0tLS0tLS0tLS0KICAgICAgICB2ZXJzaW9uOiBzdHIKICAgICAgICAgICAgVmVyc2lvbi4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgZmxvYXQKICAgICAgICAgICAgdmVyc2lvbgogICAgICAgICIiIgogICAgICAgIHJldHVybiBmbG9hdCgnLicuam9pbih2ZXJzaW9uLnNwbGl0KCcuJylbOjJdKSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBWU0luc3RhbGxEaXIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gZGlyZWN0b3J5LgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBzdHIKICAgICAgICAgICAgcGF0aAogICAgICAgICIiIgogICAgICAgICMgRGVmYXVsdCBwYXRoCiAgICAgICAgZGVmYXVsdCA9IGpvaW4oc2VsZi5Qcm9ncmFtRmlsZXN4ODYsCiAgICAgICAgICAgICAgICAgICAgICAgJ01pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvICUwLjFmJyAlIHNlbGYudnNfdmVyKQoKICAgICAgICAjIFRyeSB0byBnZXQgcGF0aCBmcm9tIHJlZ2lzdHJ5LCBpZiBmYWlsIHVzZSBkZWZhdWx0IHBhdGgKICAgICAgICByZXR1cm4gc2VsZi5yaS5sb29rdXAoc2VsZi5yaS52cywgJyUwLjFmJyAlIHNlbGYudnNfdmVyKSBvciBkZWZhdWx0CgogICAgQHByb3BlcnR5CiAgICBkZWYgVkNJbnN0YWxsRGlyKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgQysrIGRpcmVjdG9yeS4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgc3RyCiAgICAgICAgICAgIHBhdGgKICAgICAgICAiIiIKICAgICAgICBwYXRoID0gc2VsZi5fZ3Vlc3NfdmMoKSBvciBzZWxmLl9ndWVzc192Y19sZWdhY3koKQoKICAgICAgICBpZiBub3QgaXNkaXIocGF0aCk6CiAgICAgICAgICAgIG1zZyA9ICdNaWNyb3NvZnQgVmlzdWFsIEMrKyBkaXJlY3Rvcnkgbm90IGZvdW5kJwogICAgICAgICAgICByYWlzZSBkaXN0dXRpbHMuZXJyb3JzLkRpc3R1dGlsc1BsYXRmb3JtRXJyb3IobXNnKQoKICAgICAgICByZXR1cm4gcGF0aAoKICAgIGRlZiBfZ3Vlc3NfdmMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTG9jYXRlIFZpc3VhbCBDKysgZm9yIFZTMjAxNysuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIHN0cgogICAgICAgICAgICBwYXRoCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi52c192ZXIgPD0gMTQuMDoKICAgICAgICAgICAgcmV0dXJuICcnCgogICAgICAgIHRyeToKICAgICAgICAgICAgIyBGaXJzdCBzZWFyY2ggaW4ga25vd24gVlMgcGF0aHMKICAgICAgICAgICAgdnNfZGlyID0gc2VsZi5rbm93bl92c19wYXRoc1tzZWxmLnZzX3Zlcl0KICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgICMgRWxzZSwgc2VhcmNoIHdpdGggcGF0aCBmcm9tIHJlZ2lzdHJ5CiAgICAgICAgICAgIHZzX2RpciA9IHNlbGYuVlNJbnN0YWxsRGlyCgogICAgICAgIGd1ZXNzX3ZjID0gam9pbih2c19kaXIsIHInVkNcVG9vbHNcTVNWQycpCgogICAgICAgICMgU3ViZGlyIHdpdGggVkMgZXhhY3QgdmVyc2lvbiBhcyBuYW1lCiAgICAgICAgdHJ5OgogICAgICAgICAgICAjIFVwZGF0ZSB0aGUgVkMgdmVyc2lvbiB3aXRoIHJlYWwgb25lIGluc3RlYWQgb2YgVlMgdmVyc2lvbgogICAgICAgICAgICB2Y192ZXIgPSBsaXN0ZGlyKGd1ZXNzX3ZjKVstMV0KICAgICAgICAgICAgc2VsZi52Y192ZXIgPSBzZWxmLl9hc19mbG9hdF92ZXJzaW9uKHZjX3ZlcikKICAgICAgICAgICAgcmV0dXJuIGpvaW4oZ3Vlc3NfdmMsIHZjX3ZlcikKICAgICAgICBleGNlcHQgKE9TRXJyb3IsIElPRXJyb3IsIEluZGV4RXJyb3IpOgogICAgICAgICAgICByZXR1cm4gJycKCiAgICBkZWYgX2d1ZXNzX3ZjX2xlZ2FjeShzZWxmKToKICAgICAgICAiIiIKICAgICAgICBMb2NhdGUgVmlzdWFsIEMrKyBmb3IgdmVyc2lvbnMgcHJpb3IgdG8gMjAxNy4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgc3RyCiAgICAgICAgICAgIHBhdGgKICAgICAgICAiIiIKICAgICAgICBkZWZhdWx0ID0gam9pbihzZWxmLlByb2dyYW1GaWxlc3g4NiwKICAgICAgICAgICAgICAgICAgICAgICByJ01pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvICUwLjFmXFZDJyAlIHNlbGYudnNfdmVyKQoKICAgICAgICAjIFRyeSB0byBnZXQgIlZDKysgZm9yIFB5dGhvbiIgcGF0aCBmcm9tIHJlZ2lzdHJ5IGFzIGRlZmF1bHQgcGF0aAogICAgICAgIHJlZ19wYXRoID0gam9pbihzZWxmLnJpLnZjX2Zvcl9weXRob24sICclMC4xZicgJSBzZWxmLnZzX3ZlcikKICAgICAgICBweXRob25fdmMgPSBzZWxmLnJpLmxvb2t1cChyZWdfcGF0aCwgJ2luc3RhbGxkaXInKQogICAgICAgIGRlZmF1bHRfdmMgPSBqb2luKHB5dGhvbl92YywgJ1ZDJykgaWYgcHl0aG9uX3ZjIGVsc2UgZGVmYXVsdAoKICAgICAgICAjIFRyeSB0byBnZXQgcGF0aCBmcm9tIHJlZ2lzdHJ5LCBpZiBmYWlsIHVzZSBkZWZhdWx0IHBhdGgKICAgICAgICByZXR1cm4gc2VsZi5yaS5sb29rdXAoc2VsZi5yaS52YywgJyUwLjFmJyAlIHNlbGYudnNfdmVyKSBvciBkZWZhdWx0X3ZjCgogICAgQHByb3BlcnR5CiAgICBkZWYgV2luZG93c1Nka1ZlcnNpb24oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFdpbmRvd3MgU0RLIHZlcnNpb25zIGZvciBzcGVjaWZpZWQgTVNWQysrIHZlcnNpb24uCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIHR1cGxlIG9mIHN0cgogICAgICAgICAgICB2ZXJzaW9ucwogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYudnNfdmVyIDw9IDkuMDoKICAgICAgICAgICAgcmV0dXJuICc3LjAnLCAnNi4xJywgJzYuMGEnCiAgICAgICAgZWxpZiBzZWxmLnZzX3ZlciA9PSAxMC4wOgogICAgICAgICAgICByZXR1cm4gJzcuMScsICc3LjBhJwogICAgICAgIGVsaWYgc2VsZi52c192ZXIgPT0gMTEuMDoKICAgICAgICAgICAgcmV0dXJuICc4LjAnLCAnOC4wYScKICAgICAgICBlbGlmIHNlbGYudnNfdmVyID09IDEyLjA6CiAgICAgICAgICAgIHJldHVybiAnOC4xJywgJzguMWEnCiAgICAgICAgZWxpZiBzZWxmLnZzX3ZlciA+PSAxNC4wOgogICAgICAgICAgICByZXR1cm4gJzEwLjAnLCAnOC4xJwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIFdpbmRvd3NTZGtMYXN0VmVyc2lvbihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgV2luZG93cyBTREsgbGFzdCB2ZXJzaW9uLgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBzdHIKICAgICAgICAgICAgdmVyc2lvbgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLl91c2VfbGFzdF9kaXJfbmFtZShqb2luKHNlbGYuV2luZG93c1Nka0RpciwgJ2xpYicpKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIFdpbmRvd3NTZGtEaXIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFdpbmRvd3MgU0RLIGRpcmVjdG9yeS4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgc3RyCiAgICAgICAgICAgIHBhdGgKICAgICAgICAiIiIKICAgICAgICBzZGtkaXIgPSAnJwogICAgICAgIGZvciB2ZXIgaW4gc2VsZi5XaW5kb3dzU2RrVmVyc2lvbjoKICAgICAgICAgICAgIyBUcnkgdG8gZ2V0IGl0IGZyb20gcmVnaXN0cnkKICAgICAgICAgICAgbG9jID0gam9pbihzZWxmLnJpLndpbmRvd3Nfc2RrLCAndiVzJyAlIHZlcikKICAgICAgICAgICAgc2RrZGlyID0gc2VsZi5yaS5sb29rdXAobG9jLCAnaW5zdGFsbGF0aW9uZm9sZGVyJykKICAgICAgICAgICAgaWYgc2RrZGlyOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBpZiBub3Qgc2RrZGlyIG9yIG5vdCBpc2RpcihzZGtkaXIpOgogICAgICAgICAgICAjIFRyeSB0byBnZXQgIlZDKysgZm9yIFB5dGhvbiIgdmVyc2lvbiBmcm9tIHJlZ2lzdHJ5CiAgICAgICAgICAgIHBhdGggPSBqb2luKHNlbGYucmkudmNfZm9yX3B5dGhvbiwgJyUwLjFmJyAlIHNlbGYudmNfdmVyKQogICAgICAgICAgICBpbnN0YWxsX2Jhc2UgPSBzZWxmLnJpLmxvb2t1cChwYXRoLCAnaW5zdGFsbGRpcicpCiAgICAgICAgICAgIGlmIGluc3RhbGxfYmFzZToKICAgICAgICAgICAgICAgIHNka2RpciA9IGpvaW4oaW5zdGFsbF9iYXNlLCAnV2luU0RLJykKICAgICAgICBpZiBub3Qgc2RrZGlyIG9yIG5vdCBpc2RpcihzZGtkaXIpOgogICAgICAgICAgICAjIElmIGZhaWwsIHVzZSBkZWZhdWx0IG5ldyBwYXRoCiAgICAgICAgICAgIGZvciB2ZXIgaW4gc2VsZi5XaW5kb3dzU2RrVmVyc2lvbjoKICAgICAgICAgICAgICAgIGludHZlciA9IHZlcls6dmVyLnJmaW5kKCcuJyldCiAgICAgICAgICAgICAgICBwYXRoID0gcidNaWNyb3NvZnQgU0RLc1xXaW5kb3dzIEtpdHNcJXMnICUgaW50dmVyCiAgICAgICAgICAgICAgICBkID0gam9pbihzZWxmLlByb2dyYW1GaWxlcywgcGF0aCkKICAgICAgICAgICAgICAgIGlmIGlzZGlyKGQpOgogICAgICAgICAgICAgICAgICAgIHNka2RpciA9IGQKICAgICAgICBpZiBub3Qgc2RrZGlyIG9yIG5vdCBpc2RpcihzZGtkaXIpOgogICAgICAgICAgICAjIElmIGZhaWwsIHVzZSBkZWZhdWx0IG9sZCBwYXRoCiAgICAgICAgICAgIGZvciB2ZXIgaW4gc2VsZi5XaW5kb3dzU2RrVmVyc2lvbjoKICAgICAgICAgICAgICAgIHBhdGggPSByJ01pY3Jvc29mdCBTREtzXFdpbmRvd3NcdiVzJyAlIHZlcgogICAgICAgICAgICAgICAgZCA9IGpvaW4oc2VsZi5Qcm9ncmFtRmlsZXMsIHBhdGgpCiAgICAgICAgICAgICAgICBpZiBpc2RpcihkKToKICAgICAgICAgICAgICAgICAgICBzZGtkaXIgPSBkCiAgICAgICAgaWYgbm90IHNka2RpcjoKICAgICAgICAgICAgIyBJZiBmYWlsLCB1c2UgUGxhdGZvcm0gU0RLCiAgICAgICAgICAgIHNka2RpciA9IGpvaW4oc2VsZi5WQ0luc3RhbGxEaXIsICdQbGF0Zm9ybVNESycpCiAgICAgICAgcmV0dXJuIHNka2RpcgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIFdpbmRvd3NTREtFeGVjdXRhYmxlUGF0aChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgV2luZG93cyBTREsgZXhlY3V0YWJsZSBkaXJlY3RvcnkuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIHN0cgogICAgICAgICAgICBwYXRoCiAgICAgICAgIiIiCiAgICAgICAgIyBGaW5kIFdpblNESyBOZXRGeCBUb29scyByZWdpc3RyeSBkaXIgbmFtZQogICAgICAgIGlmIHNlbGYudnNfdmVyIDw9IDExLjA6CiAgICAgICAgICAgIG5ldGZ4dmVyID0gMzUKICAgICAgICAgICAgYXJjaCA9ICcnCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbmV0Znh2ZXIgPSA0MAogICAgICAgICAgICBoaWRleDg2ID0gVHJ1ZSBpZiBzZWxmLnZzX3ZlciA8PSAxMi4wIGVsc2UgRmFsc2UKICAgICAgICAgICAgYXJjaCA9IHNlbGYucGkuY3VycmVudF9kaXIoeDY0PVRydWUsIGhpZGV4ODY9aGlkZXg4NikKICAgICAgICBmeCA9ICdXaW5TREstTmV0RnglZFRvb2xzJXMnICUgKG5ldGZ4dmVyLCBhcmNoLnJlcGxhY2UoJ1xcJywgJy0nKSkKCiAgICAgICAgIyBsaXN0IGFsbCBwb3NzaWJsZXMgcmVnaXN0cnkgcGF0aHMKICAgICAgICByZWdwYXRocyA9IFtdCiAgICAgICAgaWYgc2VsZi52c192ZXIgPj0gMTQuMDoKICAgICAgICAgICAgZm9yIHZlciBpbiBzZWxmLk5ldEZ4U2RrVmVyc2lvbjoKICAgICAgICAgICAgICAgIHJlZ3BhdGhzICs9IFtqb2luKHNlbGYucmkubmV0Znhfc2RrLCB2ZXIsIGZ4KV0KCiAgICAgICAgZm9yIHZlciBpbiBzZWxmLldpbmRvd3NTZGtWZXJzaW9uOgogICAgICAgICAgICByZWdwYXRocyArPSBbam9pbihzZWxmLnJpLndpbmRvd3Nfc2RrLCAndiVzQScgJSB2ZXIsIGZ4KV0KCiAgICAgICAgIyBSZXR1cm4gaW5zdGFsbGF0aW9uIGZvbGRlciBmcm9tIHRoZSBtb3JlIHJlY2VudCBwYXRoCiAgICAgICAgZm9yIHBhdGggaW4gcmVncGF0aHM6CiAgICAgICAgICAgIGV4ZWNwYXRoID0gc2VsZi5yaS5sb29rdXAocGF0aCwgJ2luc3RhbGxhdGlvbmZvbGRlcicpCiAgICAgICAgICAgIGlmIGV4ZWNwYXRoOgogICAgICAgICAgICAgICAgcmV0dXJuIGV4ZWNwYXRoCgogICAgQHByb3BlcnR5CiAgICBkZWYgRlNoYXJwSW5zdGFsbERpcihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIEYjIGRpcmVjdG9yeS4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgc3RyCiAgICAgICAgICAgIHBhdGgKICAgICAgICAiIiIKICAgICAgICBwYXRoID0gam9pbihzZWxmLnJpLnZpc3VhbHN0dWRpbywgciclMC4xZlxTZXR1cFxGIycgJSBzZWxmLnZzX3ZlcikKICAgICAgICByZXR1cm4gc2VsZi5yaS5sb29rdXAocGF0aCwgJ3Byb2R1Y3RkaXInKSBvciAnJwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIFVuaXZlcnNhbENSVFNka0RpcihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVW5pdmVyc2FsIENSVCBTREsgZGlyZWN0b3J5LgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBzdHIKICAgICAgICAgICAgcGF0aAogICAgICAgICIiIgogICAgICAgICMgU2V0IEtpdCBSb290cyB2ZXJzaW9ucyBmb3Igc3BlY2lmaWVkIE1TVkMrKyB2ZXJzaW9uCiAgICAgICAgdmVycyA9ICgnMTAnLCAnODEnKSBpZiBzZWxmLnZzX3ZlciA+PSAxNC4wIGVsc2UgKCkKCiAgICAgICAgIyBGaW5kIHBhdGggb2YgdGhlIG1vcmUgcmVjZW50IEtpdAogICAgICAgIGZvciB2ZXIgaW4gdmVyczoKICAgICAgICAgICAgc2RrZGlyID0gc2VsZi5yaS5sb29rdXAoc2VsZi5yaS53aW5kb3dzX2tpdHNfcm9vdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdraXRzcm9vdCVzJyAlIHZlcikKICAgICAgICAgICAgaWYgc2RrZGlyOgogICAgICAgICAgICAgICAgcmV0dXJuIHNka2RpciBvciAnJwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIFVuaXZlcnNhbENSVFNka0xhc3RWZXJzaW9uKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBVbml2ZXJzYWwgQyBSdW50aW1lIFNESyBsYXN0IHZlcnNpb24uCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIHN0cgogICAgICAgICAgICB2ZXJzaW9uCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuX3VzZV9sYXN0X2Rpcl9uYW1lKGpvaW4oc2VsZi5Vbml2ZXJzYWxDUlRTZGtEaXIsICdsaWInKSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBOZXRGeFNka1ZlcnNpb24oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IC5ORVQgRnJhbWV3b3JrIFNESyB2ZXJzaW9ucy4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgdHVwbGUgb2Ygc3RyCiAgICAgICAgICAgIHZlcnNpb25zCiAgICAgICAgIiIiCiAgICAgICAgIyBTZXQgRnhTZGsgdmVyc2lvbnMgZm9yIHNwZWNpZmllZCBWUyB2ZXJzaW9uCiAgICAgICAgcmV0dXJuICgoJzQuNy4yJywgJzQuNy4xJywgJzQuNycsCiAgICAgICAgICAgICAgICAgJzQuNi4yJywgJzQuNi4xJywgJzQuNicsCiAgICAgICAgICAgICAgICAgJzQuNS4yJywgJzQuNS4xJywgJzQuNScpCiAgICAgICAgICAgICAgICBpZiBzZWxmLnZzX3ZlciA+PSAxNC4wIGVsc2UgKCkpCgogICAgQHByb3BlcnR5CiAgICBkZWYgTmV0RnhTZGtEaXIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IC5ORVQgRnJhbWV3b3JrIFNESyBkaXJlY3RvcnkuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIHN0cgogICAgICAgICAgICBwYXRoCiAgICAgICAgIiIiCiAgICAgICAgc2RrZGlyID0gJycKICAgICAgICBmb3IgdmVyIGluIHNlbGYuTmV0RnhTZGtWZXJzaW9uOgogICAgICAgICAgICBsb2MgPSBqb2luKHNlbGYucmkubmV0Znhfc2RrLCB2ZXIpCiAgICAgICAgICAgIHNka2RpciA9IHNlbGYucmkubG9va3VwKGxvYywgJ2tpdHNpbnN0YWxsYXRpb25mb2xkZXInKQogICAgICAgICAgICBpZiBzZGtkaXI6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgIHJldHVybiBzZGtkaXIKCiAgICBAcHJvcGVydHkKICAgIGRlZiBGcmFtZXdvcmtEaXIzMihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgLk5FVCBGcmFtZXdvcmsgMzJiaXQgZGlyZWN0b3J5LgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBzdHIKICAgICAgICAgICAgcGF0aAogICAgICAgICIiIgogICAgICAgICMgRGVmYXVsdCBwYXRoCiAgICAgICAgZ3Vlc3NfZncgPSBqb2luKHNlbGYuV2luRGlyLCByJ01pY3Jvc29mdC5ORVRcRnJhbWV3b3JrJykKCiAgICAgICAgIyBUcnkgdG8gZ2V0IHBhdGggZnJvbSByZWdpc3RyeSwgaWYgZmFpbCB1c2UgZGVmYXVsdCBwYXRoCiAgICAgICAgcmV0dXJuIHNlbGYucmkubG9va3VwKHNlbGYucmkudmMsICdmcmFtZXdvcmtkaXIzMicpIG9yIGd1ZXNzX2Z3CgogICAgQHByb3BlcnR5CiAgICBkZWYgRnJhbWV3b3JrRGlyNjQoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IC5ORVQgRnJhbWV3b3JrIDY0Yml0IGRpcmVjdG9yeS4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgc3RyCiAgICAgICAgICAgIHBhdGgKICAgICAgICAiIiIKICAgICAgICAjIERlZmF1bHQgcGF0aAogICAgICAgIGd1ZXNzX2Z3ID0gam9pbihzZWxmLldpbkRpciwgcidNaWNyb3NvZnQuTkVUXEZyYW1ld29yazY0JykKCiAgICAgICAgIyBUcnkgdG8gZ2V0IHBhdGggZnJvbSByZWdpc3RyeSwgaWYgZmFpbCB1c2UgZGVmYXVsdCBwYXRoCiAgICAgICAgcmV0dXJuIHNlbGYucmkubG9va3VwKHNlbGYucmkudmMsICdmcmFtZXdvcmtkaXI2NCcpIG9yIGd1ZXNzX2Z3CgogICAgQHByb3BlcnR5CiAgICBkZWYgRnJhbWV3b3JrVmVyc2lvbjMyKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCAuTkVUIEZyYW1ld29yayAzMmJpdCB2ZXJzaW9ucy4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgdHVwbGUgb2Ygc3RyCiAgICAgICAgICAgIHZlcnNpb25zCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbmRfZG90X25ldF92ZXJzaW9ucygzMikKCiAgICBAcHJvcGVydHkKICAgIGRlZiBGcmFtZXdvcmtWZXJzaW9uNjQoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IC5ORVQgRnJhbWV3b3JrIDY0Yml0IHZlcnNpb25zLgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICB0dXBsZSBvZiBzdHIKICAgICAgICAgICAgdmVyc2lvbnMKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5fZmluZF9kb3RfbmV0X3ZlcnNpb25zKDY0KQoKICAgIGRlZiBfZmluZF9kb3RfbmV0X3ZlcnNpb25zKHNlbGYsIGJpdHMpOgogICAgICAgICIiIgogICAgICAgIEZpbmQgTWljcm9zb2Z0IC5ORVQgRnJhbWV3b3JrIHZlcnNpb25zLgoKICAgICAgICBQYXJhbWV0ZXJzCiAgICAgICAgLS0tLS0tLS0tLQogICAgICAgIGJpdHM6IGludAogICAgICAgICAgICBQbGF0Zm9ybSBudW1iZXIgb2YgYml0czogMzIgb3IgNjQuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIHR1cGxlIG9mIHN0cgogICAgICAgICAgICB2ZXJzaW9ucwogICAgICAgICIiIgogICAgICAgICMgRmluZCBhY3R1YWwgLk5FVCB2ZXJzaW9uIGluIHJlZ2lzdHJ5CiAgICAgICAgcmVnX3ZlciA9IHNlbGYucmkubG9va3VwKHNlbGYucmkudmMsICdmcmFtZXdvcmt2ZXIlZCcgJSBiaXRzKQogICAgICAgIGRvdF9uZXRfZGlyID0gZ2V0YXR0cihzZWxmLCAnRnJhbWV3b3JrRGlyJWQnICUgYml0cykKICAgICAgICB2ZXIgPSByZWdfdmVyIG9yIHNlbGYuX3VzZV9sYXN0X2Rpcl9uYW1lKGRvdF9uZXRfZGlyLCAndicpIG9yICcnCgogICAgICAgICMgU2V0IC5ORVQgdmVyc2lvbnMgZm9yIHNwZWNpZmllZCBNU1ZDKysgdmVyc2lvbgogICAgICAgIGlmIHNlbGYudnNfdmVyID49IDEyLjA6CiAgICAgICAgICAgIHJldHVybiB2ZXIsICd2NC4wJwogICAgICAgIGVsaWYgc2VsZi52c192ZXIgPj0gMTAuMDoKICAgICAgICAgICAgcmV0dXJuICd2NC4wLjMwMzE5JyBpZiB2ZXIubG93ZXIoKVs6Ml0gIT0gJ3Y0JyBlbHNlIHZlciwgJ3YzLjUnCiAgICAgICAgZWxpZiBzZWxmLnZzX3ZlciA9PSA5LjA6CiAgICAgICAgICAgIHJldHVybiAndjMuNScsICd2Mi4wLjUwNzI3JwogICAgICAgIGVsaWYgc2VsZi52c192ZXIgPT0gOC4wOgogICAgICAgICAgICByZXR1cm4gJ3YzLjAnLCAndjIuMC41MDcyNycKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX3VzZV9sYXN0X2Rpcl9uYW1lKHBhdGgsIHByZWZpeD0nJyk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIG5hbWUgb2YgdGhlIGxhc3QgZGlyIGluIHBhdGggb3IgJycgaWYgbm8gZGlyIGZvdW5kLgoKICAgICAgICBQYXJhbWV0ZXJzCiAgICAgICAgLS0tLS0tLS0tLQogICAgICAgIHBhdGg6IHN0cgogICAgICAgICAgICBVc2UgZGlycyBpbiB0aGlzIHBhdGgKICAgICAgICBwcmVmaXg6IHN0cgogICAgICAgICAgICBVc2Ugb25seSBkaXJzIHN0YXJ0aW5nIGJ5IHRoaXMgcHJlZml4CgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIHN0cgogICAgICAgICAgICBuYW1lCiAgICAgICAgIiIiCiAgICAgICAgbWF0Y2hpbmdfZGlycyA9ICgKICAgICAgICAgICAgZGlyX25hbWUKICAgICAgICAgICAgZm9yIGRpcl9uYW1lIGluIHJldmVyc2VkKGxpc3RkaXIocGF0aCkpCiAgICAgICAgICAgIGlmIGlzZGlyKGpvaW4ocGF0aCwgZGlyX25hbWUpKSBhbmQKICAgICAgICAgICAgZGlyX25hbWUuc3RhcnRzd2l0aChwcmVmaXgpCiAgICAgICAgKQogICAgICAgIHJldHVybiBuZXh0KG1hdGNoaW5nX2RpcnMsIE5vbmUpIG9yICcnCgoKY2xhc3MgRW52aXJvbm1lbnRJbmZvOgogICAgIiIiCiAgICBSZXR1cm4gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBzcGVjaWZpZWQgTWljcm9zb2Z0IFZpc3VhbCBDKysgdmVyc2lvbgogICAgYW5kIHBsYXRmb3JtIDogTGliLCBJbmNsdWRlLCBQYXRoIGFuZCBsaWJwYXRoLgoKICAgIFRoaXMgZnVuY3Rpb24gaXMgY29tcGF0aWJsZSB3aXRoIE1pY3Jvc29mdCBWaXN1YWwgQysrIDkuMCB0byAxNC5YLgoKICAgIFNjcmlwdCBjcmVhdGVkIGJ5IGFuYWx5c2luZyBNaWNyb3NvZnQgZW52aXJvbm1lbnQgY29uZmlndXJhdGlvbiBmaWxlcyBsaWtlCiAgICAidmN2YXJzWy4uLl0uYmF0IiwgIlNldEVudi5DbWQiLCAidmNidWlsZHRvb2xzLmJhdCIsIC4uLgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIGFyY2g6IHN0cgogICAgICAgIFRhcmdldCBhcmNoaXRlY3R1cmUuCiAgICB2Y192ZXI6IGZsb2F0CiAgICAgICAgUmVxdWlyZWQgTWljcm9zb2Z0IFZpc3VhbCBDKysgdmVyc2lvbi4gSWYgbm90IHNldCwgYXV0b2RldGVjdCB0aGUgbGFzdAogICAgICAgIHZlcnNpb24uCiAgICB2Y19taW5fdmVyOiBmbG9hdAogICAgICAgIE1pbmltdW0gTWljcm9zb2Z0IFZpc3VhbCBDKysgdmVyc2lvbi4KICAgICIiIgoKICAgICMgVmFyaWFibGVzIGFuZCBwcm9wZXJ0aWVzIGluIHRoaXMgY2xhc3MgdXNlIG9yaWdpbmFscyBDYW1lbENhc2UgdmFyaWFibGVzCiAgICAjIG5hbWVzIGZyb20gTWljcm9zb2Z0IHNvdXJjZSBmaWxlcyBmb3IgbW9yZSBlYXN5IGNvbXBhcmlzb24uCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGFyY2gsIHZjX3Zlcj1Ob25lLCB2Y19taW5fdmVyPTApOgogICAgICAgIHNlbGYucGkgPSBQbGF0Zm9ybUluZm8oYXJjaCkKICAgICAgICBzZWxmLnJpID0gUmVnaXN0cnlJbmZvKHNlbGYucGkpCiAgICAgICAgc2VsZi5zaSA9IFN5c3RlbUluZm8oc2VsZi5yaSwgdmNfdmVyKQoKICAgICAgICBpZiBzZWxmLnZjX3ZlciA8IHZjX21pbl92ZXI6CiAgICAgICAgICAgIGVyciA9ICdObyBzdWl0YWJsZSBNaWNyb3NvZnQgVmlzdWFsIEMrKyB2ZXJzaW9uIGZvdW5kJwogICAgICAgICAgICByYWlzZSBkaXN0dXRpbHMuZXJyb3JzLkRpc3R1dGlsc1BsYXRmb3JtRXJyb3IoZXJyKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHZzX3ZlcihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpby4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgZmxvYXQKICAgICAgICAgICAgdmVyc2lvbgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLnNpLnZzX3ZlcgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHZjX3ZlcihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIEMrKyB2ZXJzaW9uLgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBmbG9hdAogICAgICAgICAgICB2ZXJzaW9uCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuc2kudmNfdmVyCgogICAgQHByb3BlcnR5CiAgICBkZWYgVlNUb29scyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBUb29scy4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgbGlzdCBvZiBzdHIKICAgICAgICAgICAgcGF0aHMKICAgICAgICAiIiIKICAgICAgICBwYXRocyA9IFtyJ0NvbW1vbjdcSURFJywgcidDb21tb243XFRvb2xzJ10KCiAgICAgICAgaWYgc2VsZi52c192ZXIgPj0gMTQuMDoKICAgICAgICAgICAgYXJjaF9zdWJkaXIgPSBzZWxmLnBpLmN1cnJlbnRfZGlyKGhpZGV4ODY9VHJ1ZSwgeDY0PVRydWUpCiAgICAgICAgICAgIHBhdGhzICs9IFtyJ0NvbW1vbjdcSURFXENvbW1vbkV4dGVuc2lvbnNcTWljcm9zb2Z0XFRlc3RXaW5kb3cnXQogICAgICAgICAgICBwYXRocyArPSBbcidUZWFtIFRvb2xzXFBlcmZvcm1hbmNlIFRvb2xzJ10KICAgICAgICAgICAgcGF0aHMgKz0gW3InVGVhbSBUb29sc1xQZXJmb3JtYW5jZSBUb29scyVzJyAlIGFyY2hfc3ViZGlyXQoKICAgICAgICByZXR1cm4gW2pvaW4oc2VsZi5zaS5WU0luc3RhbGxEaXIsIHBhdGgpIGZvciBwYXRoIGluIHBhdGhzXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIFZDSW5jbHVkZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBDKysgJiBNaWNyb3NvZnQgRm91bmRhdGlvbiBDbGFzcyBJbmNsdWRlcy4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgbGlzdCBvZiBzdHIKICAgICAgICAgICAgcGF0aHMKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gW2pvaW4oc2VsZi5zaS5WQ0luc3RhbGxEaXIsICdJbmNsdWRlJyksCiAgICAgICAgICAgICAgICBqb2luKHNlbGYuc2kuVkNJbnN0YWxsRGlyLCByJ0FUTE1GQ1xJbmNsdWRlJyldCgogICAgQHByb3BlcnR5CiAgICBkZWYgVkNMaWJyYXJpZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBDKysgJiBNaWNyb3NvZnQgRm91bmRhdGlvbiBDbGFzcyBMaWJyYXJpZXMuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIGxpc3Qgb2Ygc3RyCiAgICAgICAgICAgIHBhdGhzCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi52c192ZXIgPj0gMTUuMDoKICAgICAgICAgICAgYXJjaF9zdWJkaXIgPSBzZWxmLnBpLnRhcmdldF9kaXIoeDY0PVRydWUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYXJjaF9zdWJkaXIgPSBzZWxmLnBpLnRhcmdldF9kaXIoaGlkZXg4Nj1UcnVlKQogICAgICAgIHBhdGhzID0gWydMaWIlcycgJSBhcmNoX3N1YmRpciwgcidBVExNRkNcTGliJXMnICUgYXJjaF9zdWJkaXJdCgogICAgICAgIGlmIHNlbGYudnNfdmVyID49IDE0LjA6CiAgICAgICAgICAgIHBhdGhzICs9IFtyJ0xpYlxzdG9yZSVzJyAlIGFyY2hfc3ViZGlyXQoKICAgICAgICByZXR1cm4gW2pvaW4oc2VsZi5zaS5WQ0luc3RhbGxEaXIsIHBhdGgpIGZvciBwYXRoIGluIHBhdGhzXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIFZDU3RvcmVSZWZzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgQysrIHN0b3JlIHJlZmVyZW5jZXMgTGlicmFyaWVzLgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBsaXN0IG9mIHN0cgogICAgICAgICAgICBwYXRocwogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYudnNfdmVyIDwgMTQuMDoKICAgICAgICAgICAgcmV0dXJuIFtdCiAgICAgICAgcmV0dXJuIFtqb2luKHNlbGYuc2kuVkNJbnN0YWxsRGlyLCByJ0xpYlxzdG9yZVxyZWZlcmVuY2VzJyldCgogICAgQHByb3BlcnR5CiAgICBkZWYgVkNUb29scyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIEMrKyBUb29scy4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgbGlzdCBvZiBzdHIKICAgICAgICAgICAgcGF0aHMKICAgICAgICAiIiIKICAgICAgICBzaSA9IHNlbGYuc2kKICAgICAgICB0b29scyA9IFtqb2luKHNpLlZDSW5zdGFsbERpciwgJ1ZDUGFja2FnZXMnKV0KCiAgICAgICAgZm9yY2V4ODYgPSBUcnVlIGlmIHNlbGYudnNfdmVyIDw9IDEwLjAgZWxzZSBGYWxzZQogICAgICAgIGFyY2hfc3ViZGlyID0gc2VsZi5waS5jcm9zc19kaXIoZm9yY2V4ODYpCiAgICAgICAgaWYgYXJjaF9zdWJkaXI6CiAgICAgICAgICAgIHRvb2xzICs9IFtqb2luKHNpLlZDSW5zdGFsbERpciwgJ0JpbiVzJyAlIGFyY2hfc3ViZGlyKV0KCiAgICAgICAgaWYgc2VsZi52c192ZXIgPT0gMTQuMDoKICAgICAgICAgICAgcGF0aCA9ICdCaW4lcycgJSBzZWxmLnBpLmN1cnJlbnRfZGlyKGhpZGV4ODY9VHJ1ZSkKICAgICAgICAgICAgdG9vbHMgKz0gW2pvaW4oc2kuVkNJbnN0YWxsRGlyLCBwYXRoKV0KCiAgICAgICAgZWxpZiBzZWxmLnZzX3ZlciA+PSAxNS4wOgogICAgICAgICAgICBob3N0X2RpciA9IChyJ2JpblxIb3N0WDg2JXMnIGlmIHNlbGYucGkuY3VycmVudF9pc194ODYoKSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHInYmluXEhvc3RYNjQlcycpCiAgICAgICAgICAgIHRvb2xzICs9IFtqb2luKAogICAgICAgICAgICAgICAgc2kuVkNJbnN0YWxsRGlyLCBob3N0X2RpciAlIHNlbGYucGkudGFyZ2V0X2Rpcih4NjQ9VHJ1ZSkpXQoKICAgICAgICAgICAgaWYgc2VsZi5waS5jdXJyZW50X2NwdSAhPSBzZWxmLnBpLnRhcmdldF9jcHU6CiAgICAgICAgICAgICAgICB0b29scyArPSBbam9pbigKICAgICAgICAgICAgICAgICAgICBzaS5WQ0luc3RhbGxEaXIsIGhvc3RfZGlyICUgc2VsZi5waS5jdXJyZW50X2Rpcih4NjQ9VHJ1ZSkpXQoKICAgICAgICBlbHNlOgogICAgICAgICAgICB0b29scyArPSBbam9pbihzaS5WQ0luc3RhbGxEaXIsICdCaW4nKV0KCiAgICAgICAgcmV0dXJuIHRvb2xzCgogICAgQHByb3BlcnR5CiAgICBkZWYgT1NMaWJyYXJpZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFdpbmRvd3MgU0RLIExpYnJhcmllcy4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgbGlzdCBvZiBzdHIKICAgICAgICAgICAgcGF0aHMKICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLnZzX3ZlciA8PSAxMC4wOgogICAgICAgICAgICBhcmNoX3N1YmRpciA9IHNlbGYucGkudGFyZ2V0X2RpcihoaWRleDg2PVRydWUsIHg2ND1UcnVlKQogICAgICAgICAgICByZXR1cm4gW2pvaW4oc2VsZi5zaS5XaW5kb3dzU2RrRGlyLCAnTGliJXMnICUgYXJjaF9zdWJkaXIpXQoKICAgICAgICBlbHNlOgogICAgICAgICAgICBhcmNoX3N1YmRpciA9IHNlbGYucGkudGFyZ2V0X2Rpcih4NjQ9VHJ1ZSkKICAgICAgICAgICAgbGliID0gam9pbihzZWxmLnNpLldpbmRvd3NTZGtEaXIsICdsaWInKQogICAgICAgICAgICBsaWJ2ZXIgPSBzZWxmLl9zZGtfc3ViZGlyCiAgICAgICAgICAgIHJldHVybiBbam9pbihsaWIsICclc3VtJXMnICUgKGxpYnZlciAsIGFyY2hfc3ViZGlyKSldCgogICAgQHByb3BlcnR5CiAgICBkZWYgT1NJbmNsdWRlcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgV2luZG93cyBTREsgSW5jbHVkZS4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgbGlzdCBvZiBzdHIKICAgICAgICAgICAgcGF0aHMKICAgICAgICAiIiIKICAgICAgICBpbmNsdWRlID0gam9pbihzZWxmLnNpLldpbmRvd3NTZGtEaXIsICdpbmNsdWRlJykKCiAgICAgICAgaWYgc2VsZi52c192ZXIgPD0gMTAuMDoKICAgICAgICAgICAgcmV0dXJuIFtpbmNsdWRlLCBqb2luKGluY2x1ZGUsICdnbCcpXQoKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBzZWxmLnZzX3ZlciA+PSAxNC4wOgogICAgICAgICAgICAgICAgc2RrdmVyID0gc2VsZi5fc2RrX3N1YmRpcgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2RrdmVyID0gJycKICAgICAgICAgICAgcmV0dXJuIFtqb2luKGluY2x1ZGUsICclc3NoYXJlZCcgJSBzZGt2ZXIpLAogICAgICAgICAgICAgICAgICAgIGpvaW4oaW5jbHVkZSwgJyVzdW0nICUgc2RrdmVyKSwKICAgICAgICAgICAgICAgICAgICBqb2luKGluY2x1ZGUsICclc3dpbnJ0JyAlIHNka3ZlcildCgogICAgQHByb3BlcnR5CiAgICBkZWYgT1NMaWJwYXRoKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBXaW5kb3dzIFNESyBMaWJyYXJpZXMgUGF0aHMuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIGxpc3Qgb2Ygc3RyCiAgICAgICAgICAgIHBhdGhzCiAgICAgICAgIiIiCiAgICAgICAgcmVmID0gam9pbihzZWxmLnNpLldpbmRvd3NTZGtEaXIsICdSZWZlcmVuY2VzJykKICAgICAgICBsaWJwYXRoID0gW10KCiAgICAgICAgaWYgc2VsZi52c192ZXIgPD0gOS4wOgogICAgICAgICAgICBsaWJwYXRoICs9IHNlbGYuT1NMaWJyYXJpZXMKCiAgICAgICAgaWYgc2VsZi52c192ZXIgPj0gMTEuMDoKICAgICAgICAgICAgbGlicGF0aCArPSBbam9pbihyZWYsIHInQ29tbW9uQ29uZmlndXJhdGlvblxOZXV0cmFsJyldCgogICAgICAgIGlmIHNlbGYudnNfdmVyID49IDE0LjA6CiAgICAgICAgICAgIGxpYnBhdGggKz0gWwogICAgICAgICAgICAgICAgcmVmLAogICAgICAgICAgICAgICAgam9pbihzZWxmLnNpLldpbmRvd3NTZGtEaXIsICdVbmlvbk1ldGFkYXRhJyksCiAgICAgICAgICAgICAgICBqb2luKHJlZiwgJ1dpbmRvd3MuRm91bmRhdGlvbi5Vbml2ZXJzYWxBcGlDb250cmFjdCcsICcxLjAuMC4wJyksCiAgICAgICAgICAgICAgICBqb2luKHJlZiwgJ1dpbmRvd3MuRm91bmRhdGlvbi5Gb3VuZGF0aW9uQ29udHJhY3QnLCAnMS4wLjAuMCcpLAogICAgICAgICAgICAgICAgam9pbihyZWYsJ1dpbmRvd3MuTmV0d29ya2luZy5Db25uZWN0aXZpdHkuV3dhbkNvbnRyYWN0JywKICAgICAgICAgICAgICAgICAgICAgJzEuMC4wLjAnKSwKICAgICAgICAgICAgICAgIGpvaW4oc2VsZi5zaS5XaW5kb3dzU2RrRGlyLCAnRXh0ZW5zaW9uU0RLcycsICdNaWNyb3NvZnQuVkNMaWJzJywKICAgICAgICAgICAgICAgICAgICAgJyUwLjFmJyAlIHNlbGYudnNfdmVyLCAnUmVmZXJlbmNlcycsICdDb21tb25Db25maWd1cmF0aW9uJywKICAgICAgICAgICAgICAgICAgICAgJ25ldXRyYWwnKSwKICAgICAgICAgICAgXQogICAgICAgIHJldHVybiBsaWJwYXRoCgogICAgQHByb3BlcnR5CiAgICBkZWYgU2RrVG9vbHMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFdpbmRvd3MgU0RLIFRvb2xzLgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBsaXN0IG9mIHN0cgogICAgICAgICAgICBwYXRocwogICAgICAgICIiIgogICAgICAgIHJldHVybiBsaXN0KHNlbGYuX3Nka190b29scygpKQoKICAgIGRlZiBfc2RrX3Rvb2xzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBXaW5kb3dzIFNESyBUb29scyBwYXRocyBnZW5lcmF0b3IuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIGdlbmVyYXRvciBvZiBzdHIKICAgICAgICAgICAgcGF0aHMKICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLnZzX3ZlciA8IDE1LjA6CiAgICAgICAgICAgIGJpbl9kaXIgPSAnQmluJyBpZiBzZWxmLnZzX3ZlciA8PSAxMS4wIGVsc2UgcidCaW5ceDg2JwogICAgICAgICAgICB5aWVsZCBqb2luKHNlbGYuc2kuV2luZG93c1Nka0RpciwgYmluX2RpcikKCiAgICAgICAgaWYgbm90IHNlbGYucGkuY3VycmVudF9pc194ODYoKToKICAgICAgICAgICAgYXJjaF9zdWJkaXIgPSBzZWxmLnBpLmN1cnJlbnRfZGlyKHg2ND1UcnVlKQogICAgICAgICAgICBwYXRoID0gJ0JpbiVzJyAlIGFyY2hfc3ViZGlyCiAgICAgICAgICAgIHlpZWxkIGpvaW4oc2VsZi5zaS5XaW5kb3dzU2RrRGlyLCBwYXRoKQoKICAgICAgICBpZiBzZWxmLnZzX3ZlciBpbiAoMTAuMCwgMTEuMCk6CiAgICAgICAgICAgIGlmIHNlbGYucGkudGFyZ2V0X2lzX3g4NigpOgogICAgICAgICAgICAgICAgYXJjaF9zdWJkaXIgPSAnJwogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgYXJjaF9zdWJkaXIgPSBzZWxmLnBpLmN1cnJlbnRfZGlyKGhpZGV4ODY9VHJ1ZSwgeDY0PVRydWUpCiAgICAgICAgICAgIHBhdGggPSByJ0JpblxORVRGWCA0LjAgVG9vbHMlcycgJSBhcmNoX3N1YmRpcgogICAgICAgICAgICB5aWVsZCBqb2luKHNlbGYuc2kuV2luZG93c1Nka0RpciwgcGF0aCkKCiAgICAgICAgZWxpZiBzZWxmLnZzX3ZlciA+PSAxNS4wOgogICAgICAgICAgICBwYXRoID0gam9pbihzZWxmLnNpLldpbmRvd3NTZGtEaXIsICdCaW4nKQogICAgICAgICAgICBhcmNoX3N1YmRpciA9IHNlbGYucGkuY3VycmVudF9kaXIoeDY0PVRydWUpCiAgICAgICAgICAgIHNka3ZlciA9IHNlbGYuc2kuV2luZG93c1Nka0xhc3RWZXJzaW9uCiAgICAgICAgICAgIHlpZWxkIGpvaW4ocGF0aCwgJyVzJXMnICUgKHNka3ZlciwgYXJjaF9zdWJkaXIpKQoKICAgICAgICBpZiBzZWxmLnNpLldpbmRvd3NTREtFeGVjdXRhYmxlUGF0aDoKICAgICAgICAgICAgeWllbGQgc2VsZi5zaS5XaW5kb3dzU0RLRXhlY3V0YWJsZVBhdGgKCiAgICBAcHJvcGVydHkKICAgIGRlZiBfc2RrX3N1YmRpcihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgV2luZG93cyBTREsgdmVyc2lvbiBzdWJkaXIuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIHN0cgogICAgICAgICAgICBzdWJkaXIKICAgICAgICAiIiIKICAgICAgICB1Y3J0dmVyID0gc2VsZi5zaS5XaW5kb3dzU2RrTGFzdFZlcnNpb24KICAgICAgICByZXR1cm4gKCclc1xcJyAlIHVjcnR2ZXIpIGlmIHVjcnR2ZXIgZWxzZSAnJwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIFNka1NldHVwKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBXaW5kb3dzIFNESyBTZXR1cC4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgbGlzdCBvZiBzdHIKICAgICAgICAgICAgcGF0aHMKICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLnZzX3ZlciA+IDkuMDoKICAgICAgICAgICAgcmV0dXJuIFtdCgogICAgICAgIHJldHVybiBbam9pbihzZWxmLnNpLldpbmRvd3NTZGtEaXIsICdTZXR1cCcpXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIEZ4VG9vbHMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IC5ORVQgRnJhbWV3b3JrIFRvb2xzLgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBsaXN0IG9mIHN0cgogICAgICAgICAgICBwYXRocwogICAgICAgICIiIgogICAgICAgIHBpID0gc2VsZi5waQogICAgICAgIHNpID0gc2VsZi5zaQoKICAgICAgICBpZiBzZWxmLnZzX3ZlciA8PSAxMC4wOgogICAgICAgICAgICBpbmNsdWRlMzIgPSBUcnVlCiAgICAgICAgICAgIGluY2x1ZGU2NCA9IG5vdCBwaS50YXJnZXRfaXNfeDg2KCkgYW5kIG5vdCBwaS5jdXJyZW50X2lzX3g4NigpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaW5jbHVkZTMyID0gcGkudGFyZ2V0X2lzX3g4NigpIG9yIHBpLmN1cnJlbnRfaXNfeDg2KCkKICAgICAgICAgICAgaW5jbHVkZTY0ID0gcGkuY3VycmVudF9jcHUgPT0gJ2FtZDY0JyBvciBwaS50YXJnZXRfY3B1ID09ICdhbWQ2NCcKCiAgICAgICAgdG9vbHMgPSBbXQogICAgICAgIGlmIGluY2x1ZGUzMjoKICAgICAgICAgICAgdG9vbHMgKz0gW2pvaW4oc2kuRnJhbWV3b3JrRGlyMzIsIHZlcikKICAgICAgICAgICAgICAgICAgICAgIGZvciB2ZXIgaW4gc2kuRnJhbWV3b3JrVmVyc2lvbjMyXQogICAgICAgIGlmIGluY2x1ZGU2NDoKICAgICAgICAgICAgdG9vbHMgKz0gW2pvaW4oc2kuRnJhbWV3b3JrRGlyNjQsIHZlcikKICAgICAgICAgICAgICAgICAgICAgIGZvciB2ZXIgaW4gc2kuRnJhbWV3b3JrVmVyc2lvbjY0XQogICAgICAgIHJldHVybiB0b29scwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIE5ldEZ4U0RLTGlicmFyaWVzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCAuTmV0IEZyYW1ld29yayBTREsgTGlicmFyaWVzLgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBsaXN0IG9mIHN0cgogICAgICAgICAgICBwYXRocwogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYudnNfdmVyIDwgMTQuMCBvciBub3Qgc2VsZi5zaS5OZXRGeFNka0RpcjoKICAgICAgICAgICAgcmV0dXJuIFtdCgogICAgICAgIGFyY2hfc3ViZGlyID0gc2VsZi5waS50YXJnZXRfZGlyKHg2ND1UcnVlKQogICAgICAgIHJldHVybiBbam9pbihzZWxmLnNpLk5ldEZ4U2RrRGlyLCByJ2xpYlx1bSVzJyAlIGFyY2hfc3ViZGlyKV0KCiAgICBAcHJvcGVydHkKICAgIGRlZiBOZXRGeFNES0luY2x1ZGVzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCAuTmV0IEZyYW1ld29yayBTREsgSW5jbHVkZXMuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIGxpc3Qgb2Ygc3RyCiAgICAgICAgICAgIHBhdGhzCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi52c192ZXIgPCAxNC4wIG9yIG5vdCBzZWxmLnNpLk5ldEZ4U2RrRGlyOgogICAgICAgICAgICByZXR1cm4gW10KCiAgICAgICAgcmV0dXJuIFtqb2luKHNlbGYuc2kuTmV0RnhTZGtEaXIsIHInaW5jbHVkZVx1bScpXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIFZzVERiKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFRlYW0gU3lzdGVtIERhdGFiYXNlLgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBsaXN0IG9mIHN0cgogICAgICAgICAgICBwYXRocwogICAgICAgICIiIgogICAgICAgIHJldHVybiBbam9pbihzZWxmLnNpLlZTSW5zdGFsbERpciwgcidWU1RTREJcRGVwbG95JyldCgogICAgQHByb3BlcnR5CiAgICBkZWYgTVNCdWlsZChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgQnVpbGQgRW5naW5lLgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBsaXN0IG9mIHN0cgogICAgICAgICAgICBwYXRocwogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYudnNfdmVyIDwgMTIuMDoKICAgICAgICAgICAgcmV0dXJuIFtdCiAgICAgICAgZWxpZiBzZWxmLnZzX3ZlciA8IDE1LjA6CiAgICAgICAgICAgIGJhc2VfcGF0aCA9IHNlbGYuc2kuUHJvZ3JhbUZpbGVzeDg2CiAgICAgICAgICAgIGFyY2hfc3ViZGlyID0gc2VsZi5waS5jdXJyZW50X2RpcihoaWRleDg2PVRydWUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYmFzZV9wYXRoID0gc2VsZi5zaS5WU0luc3RhbGxEaXIKICAgICAgICAgICAgYXJjaF9zdWJkaXIgPSAnJwoKICAgICAgICBwYXRoID0gcidNU0J1aWxkXCUwLjFmXGJpbiVzJyAlIChzZWxmLnZzX3ZlciwgYXJjaF9zdWJkaXIpCiAgICAgICAgYnVpbGQgPSBbam9pbihiYXNlX3BhdGgsIHBhdGgpXQoKICAgICAgICBpZiBzZWxmLnZzX3ZlciA+PSAxNS4wOgogICAgICAgICAgICAjIEFkZCBSb3NseW4gQyMgJiBWaXN1YWwgQmFzaWMgQ29tcGlsZXIKICAgICAgICAgICAgYnVpbGQgKz0gW2pvaW4oYmFzZV9wYXRoLCBwYXRoLCAnUm9zbHluJyldCgogICAgICAgIHJldHVybiBidWlsZAoKICAgIEBwcm9wZXJ0eQogICAgZGVmIEhUTUxIZWxwV29ya3Nob3Aoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IEhUTUwgSGVscCBXb3Jrc2hvcC4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgbGlzdCBvZiBzdHIKICAgICAgICAgICAgcGF0aHMKICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLnZzX3ZlciA8IDExLjA6CiAgICAgICAgICAgIHJldHVybiBbXQoKICAgICAgICByZXR1cm4gW2pvaW4oc2VsZi5zaS5Qcm9ncmFtRmlsZXN4ODYsICdIVE1MIEhlbHAgV29ya3Nob3AnKV0KCiAgICBAcHJvcGVydHkKICAgIGRlZiBVQ1JUTGlicmFyaWVzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBVbml2ZXJzYWwgQyBSdW50aW1lIFNESyBMaWJyYXJpZXMuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIGxpc3Qgb2Ygc3RyCiAgICAgICAgICAgIHBhdGhzCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi52c192ZXIgPCAxNC4wOgogICAgICAgICAgICByZXR1cm4gW10KCiAgICAgICAgYXJjaF9zdWJkaXIgPSBzZWxmLnBpLnRhcmdldF9kaXIoeDY0PVRydWUpCiAgICAgICAgbGliID0gam9pbihzZWxmLnNpLlVuaXZlcnNhbENSVFNka0RpciwgJ2xpYicpCiAgICAgICAgdWNydHZlciA9IHNlbGYuX3VjcnRfc3ViZGlyCiAgICAgICAgcmV0dXJuIFtqb2luKGxpYiwgJyVzdWNydCVzJyAlICh1Y3J0dmVyLCBhcmNoX3N1YmRpcikpXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIFVDUlRJbmNsdWRlcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVW5pdmVyc2FsIEMgUnVudGltZSBTREsgSW5jbHVkZS4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgbGlzdCBvZiBzdHIKICAgICAgICAgICAgcGF0aHMKICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLnZzX3ZlciA8IDE0LjA6CiAgICAgICAgICAgIHJldHVybiBbXQoKICAgICAgICBpbmNsdWRlID0gam9pbihzZWxmLnNpLlVuaXZlcnNhbENSVFNka0RpciwgJ2luY2x1ZGUnKQogICAgICAgIHJldHVybiBbam9pbihpbmNsdWRlLCAnJXN1Y3J0JyAlIHNlbGYuX3VjcnRfc3ViZGlyKV0KCiAgICBAcHJvcGVydHkKICAgIGRlZiBfdWNydF9zdWJkaXIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFVuaXZlcnNhbCBDIFJ1bnRpbWUgU0RLIHZlcnNpb24gc3ViZGlyLgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBzdHIKICAgICAgICAgICAgc3ViZGlyCiAgICAgICAgIiIiCiAgICAgICAgdWNydHZlciA9IHNlbGYuc2kuVW5pdmVyc2FsQ1JUU2RrTGFzdFZlcnNpb24KICAgICAgICByZXR1cm4gKCclc1xcJyAlIHVjcnR2ZXIpIGlmIHVjcnR2ZXIgZWxzZSAnJwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIEZTaGFycChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIEYjLgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBsaXN0IG9mIHN0cgogICAgICAgICAgICBwYXRocwogICAgICAgICIiIgogICAgICAgIGlmIDExLjAgPiBzZWxmLnZzX3ZlciA+IDEyLjA6CiAgICAgICAgICAgIHJldHVybiBbXQoKICAgICAgICByZXR1cm4gW3NlbGYuc2kuRlNoYXJwSW5zdGFsbERpcl0KCiAgICBAcHJvcGVydHkKICAgIGRlZiBWQ1J1bnRpbWVSZWRpc3Qoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBDKysgcnVudGltZSByZWRpc3RyaWJ1dGFibGUgZGxsLgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBzdHIKICAgICAgICAgICAgcGF0aAogICAgICAgICIiIgogICAgICAgIHZjcnVudGltZSA9ICd2Y3J1bnRpbWUlZDAuZGxsJyAlIHNlbGYudmNfdmVyCiAgICAgICAgYXJjaF9zdWJkaXIgPSBzZWxmLnBpLnRhcmdldF9kaXIoeDY0PVRydWUpLnN0cmlwKCdcXCcpCgogICAgICAgICMgSW5zdGFsbGF0aW9uIHByZWZpeGVzIGNhbmRpZGF0ZXMKICAgICAgICBwcmVmaXhlcyA9IFtdCiAgICAgICAgdG9vbHNfcGF0aCA9IHNlbGYuc2kuVkNJbnN0YWxsRGlyCiAgICAgICAgcmVkaXN0X3BhdGggPSBkaXJuYW1lKHRvb2xzX3BhdGgucmVwbGFjZShyJ1xUb29scycsIHInXFJlZGlzdCcpKQogICAgICAgIGlmIGlzZGlyKHJlZGlzdF9wYXRoKToKICAgICAgICAgICAgIyBSZWRpc3QgdmVyc2lvbiBtYXkgbm90IGJlIGV4YWN0bHkgdGhlIHNhbWUgYXMgdG9vbHMKICAgICAgICAgICAgcmVkaXN0X3BhdGggPSBqb2luKHJlZGlzdF9wYXRoLCBsaXN0ZGlyKHJlZGlzdF9wYXRoKVstMV0pCiAgICAgICAgICAgIHByZWZpeGVzICs9IFtyZWRpc3RfcGF0aCwgam9pbihyZWRpc3RfcGF0aCwgJ29uZWNvcmUnKV0KCiAgICAgICAgcHJlZml4ZXMgKz0gW2pvaW4odG9vbHNfcGF0aCwgJ3JlZGlzdCcpXSAgIyBWUzE0IGxlZ2FjeSBwYXRoCgogICAgICAgICMgQ1JUIGRpcmVjdG9yeQogICAgICAgIGNydF9kaXJzID0gKCdNaWNyb3NvZnQuVkMlZC5DUlQnICUgKHNlbGYudmNfdmVyICogMTApLAogICAgICAgICAgICAgICAgICAgICMgU29tZXRpbWUgc3RvcmUgaW4gZGlyZWN0b3J5IHdpdGggVlMgdmVyc2lvbiBpbnN0ZWFkIG9mIFZDCiAgICAgICAgICAgICAgICAgICAgJ01pY3Jvc29mdC5WQyVkLkNSVCcgJSAoaW50KHNlbGYudnNfdmVyKSAqIDEwKSkKCiAgICAgICAgIyB2Y3J1bnRpbWUgcGF0aAogICAgICAgIGZvciBwcmVmaXgsIGNydF9kaXIgaW4gaXRlcnRvb2xzLnByb2R1Y3QocHJlZml4ZXMsIGNydF9kaXJzKToKICAgICAgICAgICAgcGF0aCA9IGpvaW4ocHJlZml4LCBhcmNoX3N1YmRpciwgY3J0X2RpciwgdmNydW50aW1lKQogICAgICAgICAgICBpZiBpc2ZpbGUocGF0aCk6CiAgICAgICAgICAgICAgICByZXR1cm4gcGF0aAoKICAgIGRlZiByZXR1cm5fZW52KHNlbGYsIGV4aXN0cz1UcnVlKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gZW52aXJvbm1lbnQgZGljdC4KCiAgICAgICAgUGFyYW1ldGVycwogICAgICAgIC0tLS0tLS0tLS0KICAgICAgICBleGlzdHM6IGJvb2wKICAgICAgICAgICAgSXQgVHJ1ZSwgb25seSByZXR1cm4gZXhpc3RpbmcgcGF0aHMuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIGRpY3QKICAgICAgICAgICAgZW52aXJvbm1lbnQKICAgICAgICAiIiIKICAgICAgICBlbnYgPSBkaWN0KAogICAgICAgICAgICBpbmNsdWRlPXNlbGYuX2J1aWxkX3BhdGhzKCdpbmNsdWRlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZi5WQ0luY2x1ZGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLk9TSW5jbHVkZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuVUNSVEluY2x1ZGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLk5ldEZ4U0RLSW5jbHVkZXNdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0cyksCiAgICAgICAgICAgIGxpYj1zZWxmLl9idWlsZF9wYXRocygnbGliJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxmLlZDTGlicmFyaWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuT1NMaWJyYXJpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5GeFRvb2xzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuVUNSVExpYnJhcmllcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLk5ldEZ4U0RLTGlicmFyaWVzXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0cyksCiAgICAgICAgICAgIGxpYnBhdGg9c2VsZi5fYnVpbGRfcGF0aHMoJ2xpYnBhdGgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxmLlZDTGlicmFyaWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLkZ4VG9vbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuVkNTdG9yZVJlZnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuT1NMaWJwYXRoXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdHMpLAogICAgICAgICAgICBwYXRoPXNlbGYuX2J1aWxkX3BhdGhzKCdwYXRoJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZi5WQ1Rvb2xzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLlZTVG9vbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuVnNURGIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuU2RrVG9vbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuU2RrU2V0dXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuRnhUb29scywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5NU0J1aWxkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLkhUTUxIZWxwV29ya3Nob3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuRlNoYXJwXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdHMpLAogICAgICAgICkKICAgICAgICBpZiBzZWxmLnZzX3ZlciA+PSAxNCBhbmQgaXNmaWxlKHNlbGYuVkNSdW50aW1lUmVkaXN0KToKICAgICAgICAgICAgZW52WydweV92Y3J1bnRpbWVfcmVkaXN0J10gPSBzZWxmLlZDUnVudGltZVJlZGlzdAogICAgICAgIHJldHVybiBlbnYKCiAgICBkZWYgX2J1aWxkX3BhdGhzKHNlbGYsIG5hbWUsIHNwZWNfcGF0aF9saXN0cywgZXhpc3RzKToKICAgICAgICAiIiIKICAgICAgICBHaXZlbiBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lIGFuZCBzcGVjaWZpZWQgcGF0aHMsCiAgICAgICAgcmV0dXJuIGEgcGF0aHNlcC1zZXBhcmF0ZWQgc3RyaW5nIG9mIHBhdGhzIGNvbnRhaW5pbmcKICAgICAgICB1bmlxdWUsIGV4dGFudCwgZGlyZWN0b3JpZXMgZnJvbSB0aG9zZSBwYXRocyBhbmQgZnJvbQogICAgICAgIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZS4gUmFpc2UgYW4gZXJyb3IgaWYgbm8gcGF0aHMKICAgICAgICBhcmUgcmVzb2x2ZWQuCgogICAgICAgIFBhcmFtZXRlcnMKICAgICAgICAtLS0tLS0tLS0tCiAgICAgICAgbmFtZTogc3RyCiAgICAgICAgICAgIEVudmlyb25tZW50IHZhcmlhYmxlIG5hbWUKICAgICAgICBzcGVjX3BhdGhfbGlzdHM6IGxpc3Qgb2Ygc3RyCiAgICAgICAgICAgIFBhdGhzCiAgICAgICAgZXhpc3RzOiBib29sCiAgICAgICAgICAgIEl0IFRydWUsIG9ubHkgcmV0dXJuIGV4aXN0aW5nIHBhdGhzLgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBzdHIKICAgICAgICAgICAgUGF0aHNlcC1zZXBhcmF0ZWQgcGF0aHMKICAgICAgICAiIiIKICAgICAgICAjIGZsYXR0ZW4gc3BlY19wYXRoX2xpc3RzCiAgICAgICAgc3BlY19wYXRocyA9IGl0ZXJ0b29scy5jaGFpbi5mcm9tX2l0ZXJhYmxlKHNwZWNfcGF0aF9saXN0cykKICAgICAgICBlbnZfcGF0aHMgPSBlbnZpcm9uLmdldChuYW1lLCAnJykuc3BsaXQocGF0aHNlcCkKICAgICAgICBwYXRocyA9IGl0ZXJ0b29scy5jaGFpbihzcGVjX3BhdGhzLCBlbnZfcGF0aHMpCiAgICAgICAgZXh0YW50X3BhdGhzID0gbGlzdChmaWx0ZXIoaXNkaXIsIHBhdGhzKSkgaWYgZXhpc3RzIGVsc2UgcGF0aHMKICAgICAgICBpZiBub3QgZXh0YW50X3BhdGhzOgogICAgICAgICAgICBtc2cgPSAiJXMgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgZW1wdHkiICUgbmFtZS51cHBlcigpCiAgICAgICAgICAgIHJhaXNlIGRpc3R1dGlscy5lcnJvcnMuRGlzdHV0aWxzUGxhdGZvcm1FcnJvcihtc2cpCiAgICAgICAgdW5pcXVlX3BhdGhzID0gc2VsZi5fdW5pcXVlX2V2ZXJzZWVuKGV4dGFudF9wYXRocykKICAgICAgICByZXR1cm4gcGF0aHNlcC5qb2luKHVuaXF1ZV9wYXRocykKCiAgICAjIGZyb20gUHl0aG9uIGRvY3MKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfdW5pcXVlX2V2ZXJzZWVuKGl0ZXJhYmxlLCBrZXk9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgTGlzdCB1bmlxdWUgZWxlbWVudHMsIHByZXNlcnZpbmcgb3JkZXIuCiAgICAgICAgUmVtZW1iZXIgYWxsIGVsZW1lbnRzIGV2ZXIgc2Vlbi4KCiAgICAgICAgX3VuaXF1ZV9ldmVyc2VlbignQUFBQUJCQkNDREFBQkJCJykgLS0+IEEgQiBDIEQKCiAgICAgICAgX3VuaXF1ZV9ldmVyc2VlbignQUJCQ2NBRCcsIHN0ci5sb3dlcikgLS0+IEEgQiBDIEQKICAgICAgICAiIiIKICAgICAgICBzZWVuID0gc2V0KCkKICAgICAgICBzZWVuX2FkZCA9IHNlZW4uYWRkCiAgICAgICAgaWYga2V5IGlzIE5vbmU6CiAgICAgICAgICAgIGZvciBlbGVtZW50IGluIGZpbHRlcmZhbHNlKHNlZW4uX19jb250YWluc19fLCBpdGVyYWJsZSk6CiAgICAgICAgICAgICAgICBzZWVuX2FkZChlbGVtZW50KQogICAgICAgICAgICAgICAgeWllbGQgZWxlbWVudAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGZvciBlbGVtZW50IGluIGl0ZXJhYmxlOgogICAgICAgICAgICAgICAgayA9IGtleShlbGVtZW50KQogICAgICAgICAgICAgICAgaWYgayBub3QgaW4gc2VlbjoKICAgICAgICAgICAgICAgICAgICBzZWVuX2FkZChrKQogICAgICAgICAgICAgICAgICAgIHlpZWxkIGVsZW1lbnQKUEsDBBQAAAAAAAAAIQBjC+PWfwwAAH8MAAA9AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvbmFtZXNwYWNlcy5weWltcG9ydCBvcwpmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCmltcG9ydCBpdGVydG9vbHMKCmZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4Lm1vdmVzIGltcG9ydCBtYXAKCgpmbGF0dGVuID0gaXRlcnRvb2xzLmNoYWluLmZyb21faXRlcmFibGUKCgpjbGFzcyBJbnN0YWxsZXI6CgogICAgbnNwa2dfZXh0ID0gJy1uc3BrZy5wdGgnCgogICAgZGVmIGluc3RhbGxfbmFtZXNwYWNlcyhzZWxmKToKICAgICAgICBuc3AgPSBzZWxmLl9nZXRfYWxsX25zX3BhY2thZ2VzKCkKICAgICAgICBpZiBub3QgbnNwOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBmaWxlbmFtZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChzZWxmLl9nZXRfdGFyZ2V0KCkpCiAgICAgICAgZmlsZW5hbWUgKz0gc2VsZi5uc3BrZ19leHQKICAgICAgICBzZWxmLm91dHB1dHMuYXBwZW5kKGZpbGVuYW1lKQogICAgICAgIGxvZy5pbmZvKCJJbnN0YWxsaW5nICVzIiwgZmlsZW5hbWUpCiAgICAgICAgbGluZXMgPSBtYXAoc2VsZi5fZ2VuX25zcGtnX2xpbmUsIG5zcCkKCiAgICAgICAgaWYgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICAjIGFsd2F5cyBnZW5lcmF0ZSB0aGUgbGluZXMsIGV2ZW4gaW4gZHJ5IHJ1bgogICAgICAgICAgICBsaXN0KGxpbmVzKQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAnd3QnKSBhcyBmOgogICAgICAgICAgICBmLndyaXRlbGluZXMobGluZXMpCgogICAgZGVmIHVuaW5zdGFsbF9uYW1lc3BhY2VzKHNlbGYpOgogICAgICAgIGZpbGVuYW1lLCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KHNlbGYuX2dldF90YXJnZXQoKSkKICAgICAgICBmaWxlbmFtZSArPSBzZWxmLm5zcGtnX2V4dAogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhmaWxlbmFtZSk6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGxvZy5pbmZvKCJSZW1vdmluZyAlcyIsIGZpbGVuYW1lKQogICAgICAgIG9zLnJlbW92ZShmaWxlbmFtZSkKCiAgICBkZWYgX2dldF90YXJnZXQoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYudGFyZ2V0CgogICAgX25zcGtnX3RtcGwgPSAoCiAgICAgICAgImltcG9ydCBzeXMsIHR5cGVzLCBvcyIsCiAgICAgICAgImhhc19tZnMgPSBzeXMudmVyc2lvbl9pbmZvID4gKDMsIDUpIiwKICAgICAgICAicCA9IG9zLnBhdGguam9pbiglKHJvb3QpcywgKiUocHRoKXIpIiwKICAgICAgICAiaW1wb3J0bGliID0gaGFzX21mcyBhbmQgX19pbXBvcnRfXygnaW1wb3J0bGliLnV0aWwnKSIsCiAgICAgICAgImhhc19tZnMgYW5kIF9faW1wb3J0X18oJ2ltcG9ydGxpYi5tYWNoaW5lcnknKSIsCiAgICAgICAgIm0gPSBoYXNfbWZzIGFuZCAiCiAgICAgICAgICAgICJzeXMubW9kdWxlcy5zZXRkZWZhdWx0KCUocGtnKXIsICIKICAgICAgICAgICAgICAgICJpbXBvcnRsaWIudXRpbC5tb2R1bGVfZnJvbV9zcGVjKCIKICAgICAgICAgICAgICAgICAgICAiaW1wb3J0bGliLm1hY2hpbmVyeS5QYXRoRmluZGVyLmZpbmRfc3BlYyglKHBrZylyLCAiCiAgICAgICAgICAgICAgICAgICAgICAgICJbb3MucGF0aC5kaXJuYW1lKHApXSkpKSIsCiAgICAgICAgIm0gPSBtIG9yICIKICAgICAgICAgICAgInN5cy5tb2R1bGVzLnNldGRlZmF1bHQoJShwa2cpciwgdHlwZXMuTW9kdWxlVHlwZSglKHBrZylyKSkiLAogICAgICAgICJtcCA9IChtIG9yIFtdKSBhbmQgbS5fX2RpY3RfXy5zZXRkZWZhdWx0KCdfX3BhdGhfXycsW10pIiwKICAgICAgICAiKHAgbm90IGluIG1wKSBhbmQgbXAuYXBwZW5kKHApIiwKICAgICkKICAgICJsaW5lcyBmb3IgdGhlIG5hbWVzcGFjZSBpbnN0YWxsZXIiCgogICAgX25zcGtnX3RtcGxfbXVsdGkgPSAoCiAgICAgICAgJ20gYW5kIHNldGF0dHIoc3lzLm1vZHVsZXNbJShwYXJlbnQpcl0sICUoY2hpbGQpciwgbSknLAogICAgKQogICAgImFkZGl0aW9uYWwgbGluZShzKSB3aGVuIGEgcGFyZW50IHBhY2thZ2UgaXMgaW5kaWNhdGVkIgoKICAgIGRlZiBfZ2V0X3Jvb3Qoc2VsZik6CiAgICAgICAgcmV0dXJuICJzeXMuX2dldGZyYW1lKDEpLmZfbG9jYWxzWydzaXRlZGlyJ10iCgogICAgZGVmIF9nZW5fbnNwa2dfbGluZShzZWxmLCBwa2cpOgogICAgICAgICMgZW5zdXJlIHBrZyBpcyBub3QgYSB1bmljb2RlIHN0cmluZyB1bmRlciBQeXRob24gMi43CiAgICAgICAgcGtnID0gc3RyKHBrZykKICAgICAgICBwdGggPSB0dXBsZShwa2cuc3BsaXQoJy4nKSkKICAgICAgICByb290ID0gc2VsZi5fZ2V0X3Jvb3QoKQogICAgICAgIHRtcGxfbGluZXMgPSBzZWxmLl9uc3BrZ190bXBsCiAgICAgICAgcGFyZW50LCBzZXAsIGNoaWxkID0gcGtnLnJwYXJ0aXRpb24oJy4nKQogICAgICAgIGlmIHBhcmVudDoKICAgICAgICAgICAgdG1wbF9saW5lcyArPSBzZWxmLl9uc3BrZ190bXBsX211bHRpCiAgICAgICAgcmV0dXJuICc7Jy5qb2luKHRtcGxfbGluZXMpICUgbG9jYWxzKCkgKyAnXG4nCgogICAgZGVmIF9nZXRfYWxsX25zX3BhY2thZ2VzKHNlbGYpOgogICAgICAgICIiIlJldHVybiBzb3J0ZWQgbGlzdCBvZiBhbGwgcGFja2FnZSBuYW1lc3BhY2VzIiIiCiAgICAgICAgcGtncyA9IHNlbGYuZGlzdHJpYnV0aW9uLm5hbWVzcGFjZV9wYWNrYWdlcyBvciBbXQogICAgICAgIHJldHVybiBzb3J0ZWQoZmxhdHRlbihtYXAoc2VsZi5fcGtnX25hbWVzLCBwa2dzKSkpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9wa2dfbmFtZXMocGtnKToKICAgICAgICAiIiIKICAgICAgICBHaXZlbiBhIG5hbWVzcGFjZSBwYWNrYWdlLCB5aWVsZCB0aGUgY29tcG9uZW50cyBvZiB0aGF0CiAgICAgICAgcGFja2FnZS4KCiAgICAgICAgPj4+IG5hbWVzID0gSW5zdGFsbGVyLl9wa2dfbmFtZXMoJ2EuYi5jJykKICAgICAgICA+Pj4gc2V0KG5hbWVzKSA9PSBzZXQoWydhJywgJ2EuYicsICdhLmIuYyddKQogICAgICAgIFRydWUKICAgICAgICAiIiIKICAgICAgICBwYXJ0cyA9IHBrZy5zcGxpdCgnLicpCiAgICAgICAgd2hpbGUgcGFydHM6CiAgICAgICAgICAgIHlpZWxkICcuJy5qb2luKHBhcnRzKQogICAgICAgICAgICBwYXJ0cy5wb3AoKQoKCmNsYXNzIERldmVsb3BJbnN0YWxsZXIoSW5zdGFsbGVyKToKICAgIGRlZiBfZ2V0X3Jvb3Qoc2VsZik6CiAgICAgICAgcmV0dXJuIHJlcHIoc3RyKHNlbGYuZWdnX3BhdGgpKQoKICAgIGRlZiBfZ2V0X3RhcmdldChzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5lZ2dfbGluawpQSwMEFAAAAAAAAAAhAJ4F2I2dngAAnZ4AAEAAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9wYWNrYWdlX2luZGV4LnB5IiIiUHlQSSBhbmQgZGlyZWN0IHBhY2thZ2UgZG93bmxvYWRpbmciIiIKaW1wb3J0IHN5cwppbXBvcnQgb3MKaW1wb3J0IHJlCmltcG9ydCBzaHV0aWwKaW1wb3J0IHNvY2tldAppbXBvcnQgYmFzZTY0CmltcG9ydCBoYXNobGliCmltcG9ydCBpdGVydG9vbHMKaW1wb3J0IHdhcm5pbmdzCmZyb20gZnVuY3Rvb2xzIGltcG9ydCB3cmFwcwoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybiBpbXBvcnQgc2l4CmZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4Lm1vdmVzIGltcG9ydCB1cmxsaWIsIGh0dHBfY2xpZW50LCBjb25maWdwYXJzZXIsIG1hcAoKaW1wb3J0IHNldHVwdG9vbHMKZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCAoCiAgICBDSEVDS09VVF9ESVNULCBEaXN0cmlidXRpb24sIEJJTkFSWV9ESVNULCBub3JtYWxpemVfcGF0aCwgU09VUkNFX0RJU1QsCiAgICBFbnZpcm9ubWVudCwgZmluZF9kaXN0cmlidXRpb25zLCBzYWZlX25hbWUsIHNhZmVfdmVyc2lvbiwKICAgIHRvX2ZpbGVuYW1lLCBSZXF1aXJlbWVudCwgREVWRUxPUF9ESVNULCBFR0dfRElTVCwKKQpmcm9tIHNldHVwdG9vbHMgaW1wb3J0IHNzbF9zdXBwb3J0CmZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNFcnJvcgpmcm9tIGZubWF0Y2ggaW1wb3J0IHRyYW5zbGF0ZQpmcm9tIHNldHVwdG9vbHMucHkyN2NvbXBhdCBpbXBvcnQgZ2V0X2FsbF9oZWFkZXJzCmZyb20gc2V0dXB0b29scy5weTMzY29tcGF0IGltcG9ydCB1bmVzY2FwZQpmcm9tIHNldHVwdG9vbHMud2hlZWwgaW1wb3J0IFdoZWVsCgpfX21ldGFjbGFzc19fID0gdHlwZQoKRUdHX0ZSQUdNRU5UID0gcmUuY29tcGlsZShyJ15lZ2c9KFstQS1aYS16MC05Xy4rIV0rKSQnKQpIUkVGID0gcmUuY29tcGlsZShyIiIiaHJlZlxzKj1ccypbJyJdPyhbXiciPiBdKykiIiIsIHJlLkkpClBZUElfTUQ1ID0gcmUuY29tcGlsZSgKICAgIHInPGEgaHJlZj0iKFteIiNdKykiPihbXjxdKyk8L2E+XG5ccytcKDxhICg/OnRpdGxlPSJNRDUgaGFzaCJcblxzKyknCiAgICByJ2hyZWY9IlteP10rXD86YWN0aW9uPXNob3dfbWQ1JmFtcDtkaWdlc3Q9KFswLTlhLWZdezMyfSkiPm1kNTwvYT5cKScKKQpVUkxfU0NIRU1FID0gcmUuY29tcGlsZSgnKFstKy5hLXowLTldezIsfSk6JywgcmUuSSkubWF0Y2gKRVhURU5TSU9OUyA9ICIudGFyLmd6IC50YXIuYnoyIC50YXIgLnppcCAudGd6Ii5zcGxpdCgpCgpfX2FsbF9fID0gWwogICAgJ1BhY2thZ2VJbmRleCcsICdkaXN0cm9zX2Zvcl91cmwnLCAncGFyc2VfYmRpc3Rfd2luaW5zdCcsCiAgICAnaW50ZXJwcmV0X2Rpc3Ryb19uYW1lJywKXQoKX1NPQ0tFVF9USU1FT1VUID0gMTUKCl90bXBsID0gInNldHVwdG9vbHMve3NldHVwdG9vbHMuX192ZXJzaW9uX199IFB5dGhvbi11cmxsaWIve3B5X21ham9yfSIKdXNlcl9hZ2VudCA9IF90bXBsLmZvcm1hdChweV9tYWpvcj0ne30ue30nLmZvcm1hdCgqc3lzLnZlcnNpb25faW5mbyksIHNldHVwdG9vbHM9c2V0dXB0b29scykKCgpkZWYgcGFyc2VfcmVxdWlyZW1lbnRfYXJnKHNwZWMpOgogICAgdHJ5OgogICAgICAgIHJldHVybiBSZXF1aXJlbWVudC5wYXJzZShzcGVjKQogICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoCiAgICAgICAgICAgICJOb3QgYSBVUkwsIGV4aXN0aW5nIGZpbGUsIG9yIHJlcXVpcmVtZW50IHNwZWM6ICVyIiAlIChzcGVjLCkKICAgICAgICApCgoKZGVmIHBhcnNlX2JkaXN0X3dpbmluc3QobmFtZSk6CiAgICAiIiJSZXR1cm4gKGJhc2UscHl2ZXJzaW9uKSBvciAoTm9uZSxOb25lKSBmb3IgcG9zc2libGUgLmV4ZSBuYW1lIiIiCgogICAgbG93ZXIgPSBuYW1lLmxvd2VyKCkKICAgIGJhc2UsIHB5X3ZlciwgcGxhdCA9IE5vbmUsIE5vbmUsIE5vbmUKCiAgICBpZiBsb3dlci5lbmRzd2l0aCgnLmV4ZScpOgogICAgICAgIGlmIGxvd2VyLmVuZHN3aXRoKCcud2luMzIuZXhlJyk6CiAgICAgICAgICAgIGJhc2UgPSBuYW1lWzotMTBdCiAgICAgICAgICAgIHBsYXQgPSAnd2luMzInCiAgICAgICAgZWxpZiBsb3dlci5zdGFydHN3aXRoKCcud2luMzItcHknLCAtMTYpOgogICAgICAgICAgICBweV92ZXIgPSBuYW1lWy03Oi00XQogICAgICAgICAgICBiYXNlID0gbmFtZVs6LTE2XQogICAgICAgICAgICBwbGF0ID0gJ3dpbjMyJwogICAgICAgIGVsaWYgbG93ZXIuZW5kc3dpdGgoJy53aW4tYW1kNjQuZXhlJyk6CiAgICAgICAgICAgIGJhc2UgPSBuYW1lWzotMTRdCiAgICAgICAgICAgIHBsYXQgPSAnd2luLWFtZDY0JwogICAgICAgIGVsaWYgbG93ZXIuc3RhcnRzd2l0aCgnLndpbi1hbWQ2NC1weScsIC0yMCk6CiAgICAgICAgICAgIHB5X3ZlciA9IG5hbWVbLTc6LTRdCiAgICAgICAgICAgIGJhc2UgPSBuYW1lWzotMjBdCiAgICAgICAgICAgIHBsYXQgPSAnd2luLWFtZDY0JwogICAgcmV0dXJuIGJhc2UsIHB5X3ZlciwgcGxhdAoKCmRlZiBlZ2dfaW5mb19mb3JfdXJsKHVybCk6CiAgICBwYXJ0cyA9IHVybGxpYi5wYXJzZS51cmxwYXJzZSh1cmwpCiAgICBzY2hlbWUsIHNlcnZlciwgcGF0aCwgcGFyYW1ldGVycywgcXVlcnksIGZyYWdtZW50ID0gcGFydHMKICAgIGJhc2UgPSB1cmxsaWIucGFyc2UudW5xdW90ZShwYXRoLnNwbGl0KCcvJylbLTFdKQogICAgaWYgc2VydmVyID09ICdzb3VyY2Vmb3JnZS5uZXQnIGFuZCBiYXNlID09ICdkb3dubG9hZCc6ICAjIFhYWCBZdWNrCiAgICAgICAgYmFzZSA9IHVybGxpYi5wYXJzZS51bnF1b3RlKHBhdGguc3BsaXQoJy8nKVstMl0pCiAgICBpZiAnIycgaW4gYmFzZToKICAgICAgICBiYXNlLCBmcmFnbWVudCA9IGJhc2Uuc3BsaXQoJyMnLCAxKQogICAgcmV0dXJuIGJhc2UsIGZyYWdtZW50CgoKZGVmIGRpc3Ryb3NfZm9yX3VybCh1cmwsIG1ldGFkYXRhPU5vbmUpOgogICAgIiIiWWllbGQgZWdnIG9yIHNvdXJjZSBkaXN0cmlidXRpb24gb2JqZWN0cyB0aGF0IG1pZ2h0IGJlIGZvdW5kIGF0IGEgVVJMIiIiCiAgICBiYXNlLCBmcmFnbWVudCA9IGVnZ19pbmZvX2Zvcl91cmwodXJsKQogICAgZm9yIGRpc3QgaW4gZGlzdHJvc19mb3JfbG9jYXRpb24odXJsLCBiYXNlLCBtZXRhZGF0YSk6CiAgICAgICAgeWllbGQgZGlzdAogICAgaWYgZnJhZ21lbnQ6CiAgICAgICAgbWF0Y2ggPSBFR0dfRlJBR01FTlQubWF0Y2goZnJhZ21lbnQpCiAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgIGZvciBkaXN0IGluIGludGVycHJldF9kaXN0cm9fbmFtZSgKICAgICAgICAgICAgICAgIHVybCwgbWF0Y2guZ3JvdXAoMSksIG1ldGFkYXRhLCBwcmVjZWRlbmNlPUNIRUNLT1VUX0RJU1QKICAgICAgICAgICAgKToKICAgICAgICAgICAgICAgIHlpZWxkIGRpc3QKCgpkZWYgZGlzdHJvc19mb3JfbG9jYXRpb24obG9jYXRpb24sIGJhc2VuYW1lLCBtZXRhZGF0YT1Ob25lKToKICAgICIiIllpZWxkIGVnZyBvciBzb3VyY2UgZGlzdHJpYnV0aW9uIG9iamVjdHMgYmFzZWQgb24gYmFzZW5hbWUiIiIKICAgIGlmIGJhc2VuYW1lLmVuZHN3aXRoKCcuZWdnLnppcCcpOgogICAgICAgIGJhc2VuYW1lID0gYmFzZW5hbWVbOi00XSAgIyBzdHJpcCB0aGUgLnppcAogICAgaWYgYmFzZW5hbWUuZW5kc3dpdGgoJy5lZ2cnKSBhbmQgJy0nIGluIGJhc2VuYW1lOgogICAgICAgICMgb25seSBvbmUsIHVuYW1iaWd1b3VzIGludGVycHJldGF0aW9uCiAgICAgICAgcmV0dXJuIFtEaXN0cmlidXRpb24uZnJvbV9sb2NhdGlvbihsb2NhdGlvbiwgYmFzZW5hbWUsIG1ldGFkYXRhKV0KICAgIGlmIGJhc2VuYW1lLmVuZHN3aXRoKCcud2hsJykgYW5kICctJyBpbiBiYXNlbmFtZToKICAgICAgICB3aGVlbCA9IFdoZWVsKGJhc2VuYW1lKQogICAgICAgIGlmIG5vdCB3aGVlbC5pc19jb21wYXRpYmxlKCk6CiAgICAgICAgICAgIHJldHVybiBbXQogICAgICAgIHJldHVybiBbRGlzdHJpYnV0aW9uKAogICAgICAgICAgICBsb2NhdGlvbj1sb2NhdGlvbiwKICAgICAgICAgICAgcHJvamVjdF9uYW1lPXdoZWVsLnByb2plY3RfbmFtZSwKICAgICAgICAgICAgdmVyc2lvbj13aGVlbC52ZXJzaW9uLAogICAgICAgICAgICAjIEluY3JlYXNlIHByaW9yaXR5IG92ZXIgZWdncy4KICAgICAgICAgICAgcHJlY2VkZW5jZT1FR0dfRElTVCArIDEsCiAgICAgICAgKV0KICAgIGlmIGJhc2VuYW1lLmVuZHN3aXRoKCcuZXhlJyk6CiAgICAgICAgd2luX2Jhc2UsIHB5X3ZlciwgcGxhdGZvcm0gPSBwYXJzZV9iZGlzdF93aW5pbnN0KGJhc2VuYW1lKQogICAgICAgIGlmIHdpbl9iYXNlIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gaW50ZXJwcmV0X2Rpc3Ryb19uYW1lKAogICAgICAgICAgICAgICAgbG9jYXRpb24sIHdpbl9iYXNlLCBtZXRhZGF0YSwgcHlfdmVyLCBCSU5BUllfRElTVCwgcGxhdGZvcm0KICAgICAgICAgICAgKQogICAgIyBUcnkgc291cmNlIGRpc3RybyBleHRlbnNpb25zICguemlwLCAudGd6LCBldGMuKQogICAgIwogICAgZm9yIGV4dCBpbiBFWFRFTlNJT05TOgogICAgICAgIGlmIGJhc2VuYW1lLmVuZHN3aXRoKGV4dCk6CiAgICAgICAgICAgIGJhc2VuYW1lID0gYmFzZW5hbWVbOi1sZW4oZXh0KV0KICAgICAgICAgICAgcmV0dXJuIGludGVycHJldF9kaXN0cm9fbmFtZShsb2NhdGlvbiwgYmFzZW5hbWUsIG1ldGFkYXRhKQogICAgcmV0dXJuIFtdICAjIG5vIGV4dGVuc2lvbiBtYXRjaGVkCgoKZGVmIGRpc3Ryb3NfZm9yX2ZpbGVuYW1lKGZpbGVuYW1lLCBtZXRhZGF0YT1Ob25lKToKICAgICIiIllpZWxkIHBvc3NpYmxlIGVnZyBvciBzb3VyY2UgZGlzdHJpYnV0aW9uIG9iamVjdHMgYmFzZWQgb24gYSBmaWxlbmFtZSIiIgogICAgcmV0dXJuIGRpc3Ryb3NfZm9yX2xvY2F0aW9uKAogICAgICAgIG5vcm1hbGl6ZV9wYXRoKGZpbGVuYW1lKSwgb3MucGF0aC5iYXNlbmFtZShmaWxlbmFtZSksIG1ldGFkYXRhCiAgICApCgoKZGVmIGludGVycHJldF9kaXN0cm9fbmFtZSgKICAgICAgICBsb2NhdGlvbiwgYmFzZW5hbWUsIG1ldGFkYXRhLCBweV92ZXJzaW9uPU5vbmUsIHByZWNlZGVuY2U9U09VUkNFX0RJU1QsCiAgICAgICAgcGxhdGZvcm09Tm9uZQopOgogICAgIiIiR2VuZXJhdGUgYWx0ZXJuYXRpdmUgaW50ZXJwcmV0YXRpb25zIG9mIGEgc291cmNlIGRpc3RybyBuYW1lCgogICAgTm90ZTogaWYgYGxvY2F0aW9uYCBpcyBhIGZpbGVzeXN0ZW0gZmlsZW5hbWUsIHlvdSBzaG91bGQgY2FsbAogICAgYGBwa2dfcmVzb3VyY2VzLm5vcm1hbGl6ZV9wYXRoKClgYCBvbiBpdCBiZWZvcmUgcGFzc2luZyBpdCB0byB0aGlzCiAgICByb3V0aW5lIQogICAgIiIiCiAgICAjIEdlbmVyYXRlIGFsdGVybmF0aXZlIGludGVycHJldGF0aW9ucyBvZiBhIHNvdXJjZSBkaXN0cm8gbmFtZQogICAgIyBCZWNhdXNlIHNvbWUgcGFja2FnZXMgYXJlIGFtYmlndW91cyBhcyB0byBuYW1lL3ZlcnNpb25zIHNwbGl0CiAgICAjIGUuZy4gImFkbnMtcHl0aG9uLTEuMS4wIiwgImVnZW5peC1teC1jb21tZXJjaWFsIiwgZXRjLgogICAgIyBTbywgd2UgZ2VuZXJhdGUgZWFjaCBwb3NzaWJsZSBpbnRlcmVwcmV0YXRpb24gKGUuZy4gImFkbnMsIHB5dGhvbi0xLjEuMCIKICAgICMgImFkbnMtcHl0aG9uLCAxLjEuMCIsIGFuZCAiYWRucy1weXRob24tMS4xLjAsIG5vIHZlcnNpb24iKS4gIEluIHByYWN0aWNlLAogICAgIyB0aGUgc3B1cmlvdXMgaW50ZXJwcmV0YXRpb25zIHNob3VsZCBiZSBpZ25vcmVkLCBiZWNhdXNlIGluIHRoZSBldmVudAogICAgIyB0aGVyZSdzIGFsc28gYW4gImFkbnMiIHBhY2thZ2UsIHRoZSBzcHVyaW91cyAicHl0aG9uLTEuMS4wIiB2ZXJzaW9uIHdpbGwKICAgICMgY29tcGFyZSBsb3dlciB0aGFuIGFueSBudW1lcmljIHZlcnNpb24gbnVtYmVyLCBhbmQgaXMgdGhlcmVmb3JlIHVubGlrZWx5CiAgICAjIHRvIG1hdGNoIGEgcmVxdWVzdCBmb3IgaXQuICBJdCdzIHN0aWxsIGEgcG90ZW50aWFsIHByb2JsZW0sIHRob3VnaCwgYW5kCiAgICAjIGluIHRoZSBsb25nIHJ1biBQeVBJIGFuZCB0aGUgZGlzdHV0aWxzIHNob3VsZCBnbyBmb3IgInNhZmUiIG5hbWVzIGFuZAogICAgIyB2ZXJzaW9ucyBpbiBkaXN0cmlidXRpb24gYXJjaGl2ZSBuYW1lcyAoc2Rpc3QgYW5kIGJkaXN0KS4KCiAgICBwYXJ0cyA9IGJhc2VuYW1lLnNwbGl0KCctJykKICAgIGlmIG5vdCBweV92ZXJzaW9uIGFuZCBhbnkocmUubWF0Y2gocidweVxkXC5cZCQnLCBwKSBmb3IgcCBpbiBwYXJ0c1syOl0pOgogICAgICAgICMgaXQgaXMgYSBiZGlzdF9kdW1iLCBub3QgYW4gc2Rpc3QgLS0gYmFpbCBvdXQKICAgICAgICByZXR1cm4KCiAgICBmb3IgcCBpbiByYW5nZSgxLCBsZW4ocGFydHMpICsgMSk6CiAgICAgICAgeWllbGQgRGlzdHJpYnV0aW9uKAogICAgICAgICAgICBsb2NhdGlvbiwgbWV0YWRhdGEsICctJy5qb2luKHBhcnRzWzpwXSksICctJy5qb2luKHBhcnRzW3A6XSksCiAgICAgICAgICAgIHB5X3ZlcnNpb249cHlfdmVyc2lvbiwgcHJlY2VkZW5jZT1wcmVjZWRlbmNlLAogICAgICAgICAgICBwbGF0Zm9ybT1wbGF0Zm9ybQogICAgICAgICkKCgojIEZyb20gUHl0aG9uIDIuNyBkb2NzCmRlZiB1bmlxdWVfZXZlcnNlZW4oaXRlcmFibGUsIGtleT1Ob25lKToKICAgICJMaXN0IHVuaXF1ZSBlbGVtZW50cywgcHJlc2VydmluZyBvcmRlci4gUmVtZW1iZXIgYWxsIGVsZW1lbnRzIGV2ZXIgc2Vlbi4iCiAgICAjIHVuaXF1ZV9ldmVyc2VlbignQUFBQUJCQkNDREFBQkJCJykgLS0+IEEgQiBDIEQKICAgICMgdW5pcXVlX2V2ZXJzZWVuKCdBQkJDY0FEJywgc3RyLmxvd2VyKSAtLT4gQSBCIEMgRAogICAgc2VlbiA9IHNldCgpCiAgICBzZWVuX2FkZCA9IHNlZW4uYWRkCiAgICBpZiBrZXkgaXMgTm9uZToKICAgICAgICBmb3IgZWxlbWVudCBpbiBzaXgubW92ZXMuZmlsdGVyZmFsc2Uoc2Vlbi5fX2NvbnRhaW5zX18sIGl0ZXJhYmxlKToKICAgICAgICAgICAgc2Vlbl9hZGQoZWxlbWVudCkKICAgICAgICAgICAgeWllbGQgZWxlbWVudAogICAgZWxzZToKICAgICAgICBmb3IgZWxlbWVudCBpbiBpdGVyYWJsZToKICAgICAgICAgICAgayA9IGtleShlbGVtZW50KQogICAgICAgICAgICBpZiBrIG5vdCBpbiBzZWVuOgogICAgICAgICAgICAgICAgc2Vlbl9hZGQoaykKICAgICAgICAgICAgICAgIHlpZWxkIGVsZW1lbnQKCgpkZWYgdW5pcXVlX3ZhbHVlcyhmdW5jKToKICAgICIiIgogICAgV3JhcCBhIGZ1bmN0aW9uIHJldHVybmluZyBhbiBpdGVyYWJsZSBzdWNoIHRoYXQgdGhlIHJlc3VsdGluZyBpdGVyYWJsZQogICAgb25seSBldmVyIHlpZWxkcyB1bmlxdWUgaXRlbXMuCiAgICAiIiIKCiAgICBAd3JhcHMoZnVuYykKICAgIGRlZiB3cmFwcGVyKCphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgcmV0dXJuIHVuaXF1ZV9ldmVyc2VlbihmdW5jKCphcmdzLCAqKmt3YXJncykpCgogICAgcmV0dXJuIHdyYXBwZXIKCgpSRUwgPSByZS5jb21waWxlKHIiIiI8KFtePl0qXHNyZWxccyo9XHMqWyciXT8oW14nIj5dKylbXj5dKik+IiIiLCByZS5JKQojIHRoaXMgbGluZSBpcyBoZXJlIHRvIGZpeCBlbWFjcycgY3J1ZGR5IGJyb2tlbiBzeW50YXggaGlnaGxpZ2h0aW5nCgoKQHVuaXF1ZV92YWx1ZXMKZGVmIGZpbmRfZXh0ZXJuYWxfbGlua3ModXJsLCBwYWdlKToKICAgICIiIkZpbmQgcmVsPSJob21lcGFnZSIgYW5kIHJlbD0iZG93bmxvYWQiIGxpbmtzIGluIGBwYWdlYCwgeWllbGRpbmcgVVJMcyIiIgoKICAgIGZvciBtYXRjaCBpbiBSRUwuZmluZGl0ZXIocGFnZSk6CiAgICAgICAgdGFnLCByZWwgPSBtYXRjaC5ncm91cHMoKQogICAgICAgIHJlbHMgPSBzZXQobWFwKHN0ci5zdHJpcCwgcmVsLmxvd2VyKCkuc3BsaXQoJywnKSkpCiAgICAgICAgaWYgJ2hvbWVwYWdlJyBpbiByZWxzIG9yICdkb3dubG9hZCcgaW4gcmVsczoKICAgICAgICAgICAgZm9yIG1hdGNoIGluIEhSRUYuZmluZGl0ZXIodGFnKToKICAgICAgICAgICAgICAgIHlpZWxkIHVybGxpYi5wYXJzZS51cmxqb2luKHVybCwgaHRtbGRlY29kZShtYXRjaC5ncm91cCgxKSkpCgogICAgZm9yIHRhZyBpbiAoIjx0aD5Ib21lIFBhZ2UiLCAiPHRoPkRvd25sb2FkIFVSTCIpOgogICAgICAgIHBvcyA9IHBhZ2UuZmluZCh0YWcpCiAgICAgICAgaWYgcG9zICE9IC0xOgogICAgICAgICAgICBtYXRjaCA9IEhSRUYuc2VhcmNoKHBhZ2UsIHBvcykKICAgICAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgICAgICB5aWVsZCB1cmxsaWIucGFyc2UudXJsam9pbih1cmwsIGh0bWxkZWNvZGUobWF0Y2guZ3JvdXAoMSkpKQoKCmNsYXNzIENvbnRlbnRDaGVja2VyOgogICAgIiIiCiAgICBBIG51bGwgY29udGVudCBjaGVja2VyIHRoYXQgZGVmaW5lcyB0aGUgaW50ZXJmYWNlIGZvciBjaGVja2luZyBjb250ZW50CiAgICAiIiIKCiAgICBkZWYgZmVlZChzZWxmLCBibG9jayk6CiAgICAgICAgIiIiCiAgICAgICAgRmVlZCBhIGJsb2NrIG9mIGRhdGEgdG8gdGhlIGhhc2guCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuCgogICAgZGVmIGlzX3ZhbGlkKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIENoZWNrIHRoZSBoYXNoLiBSZXR1cm4gRmFsc2UgaWYgdmFsaWRhdGlvbiBmYWlscy4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiByZXBvcnQoc2VsZiwgcmVwb3J0ZXIsIHRlbXBsYXRlKToKICAgICAgICAiIiIKICAgICAgICBDYWxsIHJlcG9ydGVyIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNoZWNrZXIgKGhhc2ggbmFtZSkKICAgICAgICBzdWJzdGl0dXRlZCBpbnRvIHRoZSB0ZW1wbGF0ZS4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4KCgpjbGFzcyBIYXNoQ2hlY2tlcihDb250ZW50Q2hlY2tlcik6CiAgICBwYXR0ZXJuID0gcmUuY29tcGlsZSgKICAgICAgICByJyg/UDxoYXNoX25hbWU+c2hhMXxzaGEyMjR8c2hhMzg0fHNoYTI1NnxzaGE1MTJ8bWQ1KT0nCiAgICAgICAgcicoP1A8ZXhwZWN0ZWQ+W2EtZjAtOV0rKScKICAgICkKCiAgICBkZWYgX19pbml0X18oc2VsZiwgaGFzaF9uYW1lLCBleHBlY3RlZCk6CiAgICAgICAgc2VsZi5oYXNoX25hbWUgPSBoYXNoX25hbWUKICAgICAgICBzZWxmLmhhc2ggPSBoYXNobGliLm5ldyhoYXNoX25hbWUpCiAgICAgICAgc2VsZi5leHBlY3RlZCA9IGV4cGVjdGVkCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZnJvbV91cmwoY2xzLCB1cmwpOgogICAgICAgICJDb25zdHJ1Y3QgYSAocG9zc2libHkgbnVsbCkgQ29udGVudENoZWNrZXIgZnJvbSBhIFVSTCIKICAgICAgICBmcmFnbWVudCA9IHVybGxpYi5wYXJzZS51cmxwYXJzZSh1cmwpWy0xXQogICAgICAgIGlmIG5vdCBmcmFnbWVudDoKICAgICAgICAgICAgcmV0dXJuIENvbnRlbnRDaGVja2VyKCkKICAgICAgICBtYXRjaCA9IGNscy5wYXR0ZXJuLnNlYXJjaChmcmFnbWVudCkKICAgICAgICBpZiBub3QgbWF0Y2g6CiAgICAgICAgICAgIHJldHVybiBDb250ZW50Q2hlY2tlcigpCiAgICAgICAgcmV0dXJuIGNscygqKm1hdGNoLmdyb3VwZGljdCgpKQoKICAgIGRlZiBmZWVkKHNlbGYsIGJsb2NrKToKICAgICAgICBzZWxmLmhhc2gudXBkYXRlKGJsb2NrKQoKICAgIGRlZiBpc192YWxpZChzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5oYXNoLmhleGRpZ2VzdCgpID09IHNlbGYuZXhwZWN0ZWQKCiAgICBkZWYgcmVwb3J0KHNlbGYsIHJlcG9ydGVyLCB0ZW1wbGF0ZSk6CiAgICAgICAgbXNnID0gdGVtcGxhdGUgJSBzZWxmLmhhc2hfbmFtZQogICAgICAgIHJldHVybiByZXBvcnRlcihtc2cpCgoKY2xhc3MgUGFja2FnZUluZGV4KEVudmlyb25tZW50KToKICAgICIiIkEgZGlzdHJpYnV0aW9uIGluZGV4IHRoYXQgc2NhbnMgd2ViIHBhZ2VzIGZvciBkb3dubG9hZCBVUkxzIiIiCgogICAgZGVmIF9faW5pdF9fKAogICAgICAgICAgICBzZWxmLCBpbmRleF91cmw9Imh0dHBzOi8vcHlwaS5vcmcvc2ltcGxlLyIsIGhvc3RzPSgnKicsKSwKICAgICAgICAgICAgY2FfYnVuZGxlPU5vbmUsIHZlcmlmeV9zc2w9VHJ1ZSwgKmFyZ3MsICoqa3cKICAgICk6CiAgICAgICAgRW52aXJvbm1lbnQuX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3cpCiAgICAgICAgc2VsZi5pbmRleF91cmwgPSBpbmRleF91cmwgKyAiLyIgWzpub3QgaW5kZXhfdXJsLmVuZHN3aXRoKCcvJyldCiAgICAgICAgc2VsZi5zY2FubmVkX3VybHMgPSB7fQogICAgICAgIHNlbGYuZmV0Y2hlZF91cmxzID0ge30KICAgICAgICBzZWxmLnBhY2thZ2VfcGFnZXMgPSB7fQogICAgICAgIHNlbGYuYWxsb3dzID0gcmUuY29tcGlsZSgnfCcuam9pbihtYXAodHJhbnNsYXRlLCBob3N0cykpKS5tYXRjaAogICAgICAgIHNlbGYudG9fc2NhbiA9IFtdCiAgICAgICAgdXNlX3NzbCA9ICgKICAgICAgICAgICAgdmVyaWZ5X3NzbAogICAgICAgICAgICBhbmQgc3NsX3N1cHBvcnQuaXNfYXZhaWxhYmxlCiAgICAgICAgICAgIGFuZCAoY2FfYnVuZGxlIG9yIHNzbF9zdXBwb3J0LmZpbmRfY2FfYnVuZGxlKCkpCiAgICAgICAgKQogICAgICAgIGlmIHVzZV9zc2w6CiAgICAgICAgICAgIHNlbGYub3BlbmVyID0gc3NsX3N1cHBvcnQub3BlbmVyX2ZvcihjYV9idW5kbGUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5vcGVuZXIgPSB1cmxsaWIucmVxdWVzdC51cmxvcGVuCgogICAgZGVmIHByb2Nlc3NfdXJsKHNlbGYsIHVybCwgcmV0cmlldmU9RmFsc2UpOgogICAgICAgICIiIkV2YWx1YXRlIGEgVVJMIGFzIGEgcG9zc2libGUgZG93bmxvYWQsIGFuZCBtYXliZSByZXRyaWV2ZSBpdCIiIgogICAgICAgIGlmIHVybCBpbiBzZWxmLnNjYW5uZWRfdXJscyBhbmQgbm90IHJldHJpZXZlOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBzZWxmLnNjYW5uZWRfdXJsc1t1cmxdID0gVHJ1ZQogICAgICAgIGlmIG5vdCBVUkxfU0NIRU1FKHVybCk6CiAgICAgICAgICAgIHNlbGYucHJvY2Vzc19maWxlbmFtZSh1cmwpCiAgICAgICAgICAgIHJldHVybgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGRpc3RzID0gbGlzdChkaXN0cm9zX2Zvcl91cmwodXJsKSkKICAgICAgICAgICAgaWYgZGlzdHM6CiAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi51cmxfb2sodXJsKToKICAgICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICAgIHNlbGYuZGVidWcoIkZvdW5kIGxpbms6ICVzIiwgdXJsKQoKICAgICAgICBpZiBkaXN0cyBvciBub3QgcmV0cmlldmUgb3IgdXJsIGluIHNlbGYuZmV0Y2hlZF91cmxzOgogICAgICAgICAgICBsaXN0KG1hcChzZWxmLmFkZCwgZGlzdHMpKQogICAgICAgICAgICByZXR1cm4gICMgZG9uJ3QgbmVlZCB0aGUgYWN0dWFsIHBhZ2UKCiAgICAgICAgaWYgbm90IHNlbGYudXJsX29rKHVybCk6CiAgICAgICAgICAgIHNlbGYuZmV0Y2hlZF91cmxzW3VybF0gPSBUcnVlCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBzZWxmLmluZm8oIlJlYWRpbmcgJXMiLCB1cmwpCiAgICAgICAgc2VsZi5mZXRjaGVkX3VybHNbdXJsXSA9IFRydWUgICMgcHJldmVudCBtdWx0aXBsZSBmZXRjaCBhdHRlbXB0cwogICAgICAgIHRtcGwgPSAiRG93bmxvYWQgZXJyb3Igb24gJXM6ICUlcyAtLSBTb21lIHBhY2thZ2VzIG1heSBub3QgYmUgZm91bmQhIgogICAgICAgIGYgPSBzZWxmLm9wZW5fdXJsKHVybCwgdG1wbCAlIHVybCkKICAgICAgICBpZiBmIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHNlbGYuZmV0Y2hlZF91cmxzW2YudXJsXSA9IFRydWUKICAgICAgICBpZiAnaHRtbCcgbm90IGluIGYuaGVhZGVycy5nZXQoJ2NvbnRlbnQtdHlwZScsICcnKS5sb3dlcigpOgogICAgICAgICAgICBmLmNsb3NlKCkgICMgbm90IGh0bWwsIHdlIGNhbid0IHByb2Nlc3MgaXQKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGJhc2UgPSBmLnVybCAgIyBoYW5kbGUgcmVkaXJlY3RzCiAgICAgICAgcGFnZSA9IGYucmVhZCgpCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UocGFnZSwgc3RyKToKICAgICAgICAgICAgIyBJbiBQeXRob24gMyBhbmQgZ290IGJ5dGVzIGJ1dCB3YW50IHN0ci4KICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShmLCB1cmxsaWIuZXJyb3IuSFRUUEVycm9yKToKICAgICAgICAgICAgICAgICMgRXJyb3JzIGhhdmUgbm8gY2hhcnNldCwgYXNzdW1lIGxhdGluMToKICAgICAgICAgICAgICAgIGNoYXJzZXQgPSAnbGF0aW4tMScKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBmLmhlYWRlcnMuZ2V0X3BhcmFtKCdjaGFyc2V0Jykgb3IgJ2xhdGluLTEnCiAgICAgICAgICAgIHBhZ2UgPSBwYWdlLmRlY29kZShjaGFyc2V0LCAiaWdub3JlIikKICAgICAgICBmLmNsb3NlKCkKICAgICAgICBmb3IgbWF0Y2ggaW4gSFJFRi5maW5kaXRlcihwYWdlKToKICAgICAgICAgICAgbGluayA9IHVybGxpYi5wYXJzZS51cmxqb2luKGJhc2UsIGh0bWxkZWNvZGUobWF0Y2guZ3JvdXAoMSkpKQogICAgICAgICAgICBzZWxmLnByb2Nlc3NfdXJsKGxpbmspCiAgICAgICAgaWYgdXJsLnN0YXJ0c3dpdGgoc2VsZi5pbmRleF91cmwpIGFuZCBnZXRhdHRyKGYsICdjb2RlJywgTm9uZSkgIT0gNDA0OgogICAgICAgICAgICBwYWdlID0gc2VsZi5wcm9jZXNzX2luZGV4KHVybCwgcGFnZSkKCiAgICBkZWYgcHJvY2Vzc19maWxlbmFtZShzZWxmLCBmbiwgbmVzdGVkPUZhbHNlKToKICAgICAgICAjIHByb2Nlc3MgZmlsZW5hbWVzIG9yIGRpcmVjdG9yaWVzCiAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGZuKToKICAgICAgICAgICAgc2VsZi53YXJuKCJOb3QgZm91bmQ6ICVzIiwgZm4pCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGZuKSBhbmQgbm90IG5lc3RlZDoKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGgucmVhbHBhdGgoZm4pCiAgICAgICAgICAgIGZvciBpdGVtIGluIG9zLmxpc3RkaXIocGF0aCk6CiAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3NfZmlsZW5hbWUob3MucGF0aC5qb2luKHBhdGgsIGl0ZW0pLCBUcnVlKQoKICAgICAgICBkaXN0cyA9IGRpc3Ryb3NfZm9yX2ZpbGVuYW1lKGZuKQogICAgICAgIGlmIGRpc3RzOgogICAgICAgICAgICBzZWxmLmRlYnVnKCJGb3VuZDogJXMiLCBmbikKICAgICAgICAgICAgbGlzdChtYXAoc2VsZi5hZGQsIGRpc3RzKSkKCiAgICBkZWYgdXJsX29rKHNlbGYsIHVybCwgZmF0YWw9RmFsc2UpOgogICAgICAgIHMgPSBVUkxfU0NIRU1FKHVybCkKICAgICAgICBpc19maWxlID0gcyBhbmQgcy5ncm91cCgxKS5sb3dlcigpID09ICdmaWxlJwogICAgICAgIGlmIGlzX2ZpbGUgb3Igc2VsZi5hbGxvd3ModXJsbGliLnBhcnNlLnVybHBhcnNlKHVybClbMV0pOgogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIG1zZyA9ICgKICAgICAgICAgICAgIlxuTm90ZTogQnlwYXNzaW5nICVzIChkaXNhbGxvd2VkIGhvc3Q7IHNlZSAiCiAgICAgICAgICAgICJodHRwOi8vYml0Lmx5LzJockltblkgZm9yIGRldGFpbHMpLlxuIikKICAgICAgICBpZiBmYXRhbDoKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IobXNnICUgdXJsKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYud2Fybihtc2csIHVybCkKCiAgICBkZWYgc2Nhbl9lZ2dfbGlua3Moc2VsZiwgc2VhcmNoX3BhdGgpOgogICAgICAgIGRpcnMgPSBmaWx0ZXIob3MucGF0aC5pc2Rpciwgc2VhcmNoX3BhdGgpCiAgICAgICAgZWdnX2xpbmtzID0gKAogICAgICAgICAgICAocGF0aCwgZW50cnkpCiAgICAgICAgICAgIGZvciBwYXRoIGluIGRpcnMKICAgICAgICAgICAgZm9yIGVudHJ5IGluIG9zLmxpc3RkaXIocGF0aCkKICAgICAgICAgICAgaWYgZW50cnkuZW5kc3dpdGgoJy5lZ2ctbGluaycpCiAgICAgICAgKQogICAgICAgIGxpc3QoaXRlcnRvb2xzLnN0YXJtYXAoc2VsZi5zY2FuX2VnZ19saW5rLCBlZ2dfbGlua3MpKQoKICAgIGRlZiBzY2FuX2VnZ19saW5rKHNlbGYsIHBhdGgsIGVudHJ5KToKICAgICAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKHBhdGgsIGVudHJ5KSkgYXMgcmF3X2xpbmVzOgogICAgICAgICAgICAjIGZpbHRlciBub24tZW1wdHkgbGluZXMKICAgICAgICAgICAgbGluZXMgPSBsaXN0KGZpbHRlcihOb25lLCBtYXAoc3RyLnN0cmlwLCByYXdfbGluZXMpKSkKCiAgICAgICAgaWYgbGVuKGxpbmVzKSAhPSAyOgogICAgICAgICAgICAjIGZvcm1hdCBpcyBub3QgcmVjb2duaXplZDsgcHVudAogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgZWdnX3BhdGgsIHNldHVwX3BhdGggPSBsaW5lcwoKICAgICAgICBmb3IgZGlzdCBpbiBmaW5kX2Rpc3RyaWJ1dGlvbnMob3MucGF0aC5qb2luKHBhdGgsIGVnZ19wYXRoKSk6CiAgICAgICAgICAgIGRpc3QubG9jYXRpb24gPSBvcy5wYXRoLmpvaW4ocGF0aCwgKmxpbmVzKQogICAgICAgICAgICBkaXN0LnByZWNlZGVuY2UgPSBTT1VSQ0VfRElTVAogICAgICAgICAgICBzZWxmLmFkZChkaXN0KQoKICAgIGRlZiBwcm9jZXNzX2luZGV4KHNlbGYsIHVybCwgcGFnZSk6CiAgICAgICAgIiIiUHJvY2VzcyB0aGUgY29udGVudHMgb2YgYSBQeVBJIHBhZ2UiIiIKCiAgICAgICAgZGVmIHNjYW4obGluayk6CiAgICAgICAgICAgICMgUHJvY2VzcyBhIFVSTCB0byBzZWUgaWYgaXQncyBmb3IgYSBwYWNrYWdlIHBhZ2UKICAgICAgICAgICAgaWYgbGluay5zdGFydHN3aXRoKHNlbGYuaW5kZXhfdXJsKToKICAgICAgICAgICAgICAgIHBhcnRzID0gbGlzdChtYXAoCiAgICAgICAgICAgICAgICAgICAgdXJsbGliLnBhcnNlLnVucXVvdGUsIGxpbmtbbGVuKHNlbGYuaW5kZXhfdXJsKTpdLnNwbGl0KCcvJykKICAgICAgICAgICAgICAgICkpCiAgICAgICAgICAgICAgICBpZiBsZW4ocGFydHMpID09IDIgYW5kICcjJyBub3QgaW4gcGFydHNbMV06CiAgICAgICAgICAgICAgICAgICAgIyBpdCdzIGEgcGFja2FnZSBwYWdlLCBzYW5pdGl6ZSBhbmQgaW5kZXggaXQKICAgICAgICAgICAgICAgICAgICBwa2cgPSBzYWZlX25hbWUocGFydHNbMF0pCiAgICAgICAgICAgICAgICAgICAgdmVyID0gc2FmZV92ZXJzaW9uKHBhcnRzWzFdKQogICAgICAgICAgICAgICAgICAgIHNlbGYucGFja2FnZV9wYWdlcy5zZXRkZWZhdWx0KHBrZy5sb3dlcigpLCB7fSlbbGlua10gPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRvX2ZpbGVuYW1lKHBrZyksIHRvX2ZpbGVuYW1lKHZlcikKICAgICAgICAgICAgcmV0dXJuIE5vbmUsIE5vbmUKCiAgICAgICAgIyBwcm9jZXNzIGFuIGluZGV4IHBhZ2UgaW50byB0aGUgcGFja2FnZS1wYWdlIGluZGV4CiAgICAgICAgZm9yIG1hdGNoIGluIEhSRUYuZmluZGl0ZXIocGFnZSk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHNjYW4odXJsbGliLnBhcnNlLnVybGpvaW4odXJsLCBodG1sZGVjb2RlKG1hdGNoLmdyb3VwKDEpKSkpCiAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgcGFzcwoKICAgICAgICBwa2csIHZlciA9IHNjYW4odXJsKSAgIyBlbnN1cmUgdGhpcyBwYWdlIGlzIGluIHRoZSBwYWdlIGluZGV4CiAgICAgICAgaWYgcGtnOgogICAgICAgICAgICAjIHByb2Nlc3MgaW5kaXZpZHVhbCBwYWNrYWdlIHBhZ2UKICAgICAgICAgICAgZm9yIG5ld191cmwgaW4gZmluZF9leHRlcm5hbF9saW5rcyh1cmwsIHBhZ2UpOgogICAgICAgICAgICAgICAgIyBQcm9jZXNzIHRoZSBmb3VuZCBVUkwKICAgICAgICAgICAgICAgIGJhc2UsIGZyYWcgPSBlZ2dfaW5mb19mb3JfdXJsKG5ld191cmwpCiAgICAgICAgICAgICAgICBpZiBiYXNlLmVuZHN3aXRoKCcucHknKSBhbmQgbm90IGZyYWc6CiAgICAgICAgICAgICAgICAgICAgaWYgdmVyOgogICAgICAgICAgICAgICAgICAgICAgICBuZXdfdXJsICs9ICcjZWdnPSVzLSVzJyAlIChwa2csIHZlcikKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm5lZWRfdmVyc2lvbl9pbmZvKHVybCkKICAgICAgICAgICAgICAgIHNlbGYuc2Nhbl91cmwobmV3X3VybCkKCiAgICAgICAgICAgIHJldHVybiBQWVBJX01ENS5zdWIoCiAgICAgICAgICAgICAgICBsYW1iZGEgbTogJzxhIGhyZWY9IiVzI21kNT0lcyI+JXM8L2E+JyAlIG0uZ3JvdXAoMSwgMywgMiksIHBhZ2UKICAgICAgICAgICAgKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiAiIiAgIyBubyBzZW5zZSBkb3VibGUtc2Nhbm5pbmcgbm9uLXBhY2thZ2UgcGFnZXMKCiAgICBkZWYgbmVlZF92ZXJzaW9uX2luZm8oc2VsZiwgdXJsKToKICAgICAgICBzZWxmLnNjYW5fYWxsKAogICAgICAgICAgICAiUGFnZSBhdCAlcyBsaW5rcyB0byAucHkgZmlsZShzKSB3aXRob3V0IHZlcnNpb24gaW5mbzsgYW4gaW5kZXggIgogICAgICAgICAgICAic2NhbiBpcyByZXF1aXJlZC4iLCB1cmwKICAgICAgICApCgogICAgZGVmIHNjYW5fYWxsKHNlbGYsIG1zZz1Ob25lLCAqYXJncyk6CiAgICAgICAgaWYgc2VsZi5pbmRleF91cmwgbm90IGluIHNlbGYuZmV0Y2hlZF91cmxzOgogICAgICAgICAgICBpZiBtc2c6CiAgICAgICAgICAgICAgICBzZWxmLndhcm4obXNnLCAqYXJncykKICAgICAgICAgICAgc2VsZi5pbmZvKAogICAgICAgICAgICAgICAgIlNjYW5uaW5nIGluZGV4IG9mIGFsbCBwYWNrYWdlcyAodGhpcyBtYXkgdGFrZSBhIHdoaWxlKSIKICAgICAgICAgICAgKQogICAgICAgIHNlbGYuc2Nhbl91cmwoc2VsZi5pbmRleF91cmwpCgogICAgZGVmIGZpbmRfcGFja2FnZXMoc2VsZiwgcmVxdWlyZW1lbnQpOgogICAgICAgIHNlbGYuc2Nhbl91cmwoc2VsZi5pbmRleF91cmwgKyByZXF1aXJlbWVudC51bnNhZmVfbmFtZSArICcvJykKCiAgICAgICAgaWYgbm90IHNlbGYucGFja2FnZV9wYWdlcy5nZXQocmVxdWlyZW1lbnQua2V5KToKICAgICAgICAgICAgIyBGYWxsIGJhY2sgdG8gc2FmZSB2ZXJzaW9uIG9mIHRoZSBuYW1lCiAgICAgICAgICAgIHNlbGYuc2Nhbl91cmwoc2VsZi5pbmRleF91cmwgKyByZXF1aXJlbWVudC5wcm9qZWN0X25hbWUgKyAnLycpCgogICAgICAgIGlmIG5vdCBzZWxmLnBhY2thZ2VfcGFnZXMuZ2V0KHJlcXVpcmVtZW50LmtleSk6CiAgICAgICAgICAgICMgV2UgY291bGRuJ3QgZmluZCB0aGUgdGFyZ2V0IHBhY2thZ2UsIHNvIHNlYXJjaCB0aGUgaW5kZXggcGFnZSB0b28KICAgICAgICAgICAgc2VsZi5ub3RfZm91bmRfaW5faW5kZXgocmVxdWlyZW1lbnQpCgogICAgICAgIGZvciB1cmwgaW4gbGlzdChzZWxmLnBhY2thZ2VfcGFnZXMuZ2V0KHJlcXVpcmVtZW50LmtleSwgKCkpKToKICAgICAgICAgICAgIyBzY2FuIGVhY2ggcGFnZSB0aGF0IG1pZ2h0IGJlIHJlbGF0ZWQgdG8gdGhlIGRlc2lyZWQgcGFja2FnZQogICAgICAgICAgICBzZWxmLnNjYW5fdXJsKHVybCkKCiAgICBkZWYgb2J0YWluKHNlbGYsIHJlcXVpcmVtZW50LCBpbnN0YWxsZXI9Tm9uZSk6CiAgICAgICAgc2VsZi5wcmVzY2FuKCkKICAgICAgICBzZWxmLmZpbmRfcGFja2FnZXMocmVxdWlyZW1lbnQpCiAgICAgICAgZm9yIGRpc3QgaW4gc2VsZltyZXF1aXJlbWVudC5rZXldOgogICAgICAgICAgICBpZiBkaXN0IGluIHJlcXVpcmVtZW50OgogICAgICAgICAgICAgICAgcmV0dXJuIGRpc3QKICAgICAgICAgICAgc2VsZi5kZWJ1ZygiJXMgZG9lcyBub3QgbWF0Y2ggJXMiLCByZXF1aXJlbWVudCwgZGlzdCkKICAgICAgICByZXR1cm4gc3VwZXIoUGFja2FnZUluZGV4LCBzZWxmKS5vYnRhaW4ocmVxdWlyZW1lbnQsIGluc3RhbGxlcikKCiAgICBkZWYgY2hlY2tfaGFzaChzZWxmLCBjaGVja2VyLCBmaWxlbmFtZSwgdGZwKToKICAgICAgICAiIiIKICAgICAgICBjaGVja2VyIGlzIGEgQ29udGVudENoZWNrZXIKICAgICAgICAiIiIKICAgICAgICBjaGVja2VyLnJlcG9ydCgKICAgICAgICAgICAgc2VsZi5kZWJ1ZywKICAgICAgICAgICAgIlZhbGlkYXRpbmcgJSVzIGNoZWNrc3VtIGZvciAlcyIgJSBmaWxlbmFtZSkKICAgICAgICBpZiBub3QgY2hlY2tlci5pc192YWxpZCgpOgogICAgICAgICAgICB0ZnAuY2xvc2UoKQogICAgICAgICAgICBvcy51bmxpbmsoZmlsZW5hbWUpCiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKAogICAgICAgICAgICAgICAgIiVzIHZhbGlkYXRpb24gZmFpbGVkIGZvciAlczsgIgogICAgICAgICAgICAgICAgInBvc3NpYmxlIGRvd25sb2FkIHByb2JsZW0/IgogICAgICAgICAgICAgICAgJSAoY2hlY2tlci5oYXNoLm5hbWUsIG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpKQogICAgICAgICAgICApCgogICAgZGVmIGFkZF9maW5kX2xpbmtzKHNlbGYsIHVybHMpOgogICAgICAgICIiIkFkZCBgdXJsc2AgdG8gdGhlIGxpc3QgdGhhdCB3aWxsIGJlIHByZXNjYW5uZWQgZm9yIHNlYXJjaGVzIiIiCiAgICAgICAgZm9yIHVybCBpbiB1cmxzOgogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBzZWxmLnRvX3NjYW4gaXMgTm9uZSAgIyBpZiB3ZSBoYXZlIGFscmVhZHkgImdvbmUgb25saW5lIgogICAgICAgICAgICAgICAgb3Igbm90IFVSTF9TQ0hFTUUodXJsKSAgIyBvciBpdCdzIGEgbG9jYWwgZmlsZS9kaXJlY3RvcnkKICAgICAgICAgICAgICAgIG9yIHVybC5zdGFydHN3aXRoKCdmaWxlOicpCiAgICAgICAgICAgICAgICBvciBsaXN0KGRpc3Ryb3NfZm9yX3VybCh1cmwpKSAgIyBvciBhIGRpcmVjdCBwYWNrYWdlIGxpbmsKICAgICAgICAgICAgKToKICAgICAgICAgICAgICAgICMgdGhlbiBnbyBhaGVhZCBhbmQgcHJvY2VzcyBpdCBub3cKICAgICAgICAgICAgICAgIHNlbGYuc2Nhbl91cmwodXJsKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBvdGhlcndpc2UsIGRlZmVyIHJldHJpZXZhbCB0aWxsIGxhdGVyCiAgICAgICAgICAgICAgICBzZWxmLnRvX3NjYW4uYXBwZW5kKHVybCkKCiAgICBkZWYgcHJlc2NhbihzZWxmKToKICAgICAgICAiIiJTY2FuIHVybHMgc2NoZWR1bGVkIGZvciBwcmVzY2FubmluZyAoZS5nLiAtLWZpbmQtbGlua3MpIiIiCiAgICAgICAgaWYgc2VsZi50b19zY2FuOgogICAgICAgICAgICBsaXN0KG1hcChzZWxmLnNjYW5fdXJsLCBzZWxmLnRvX3NjYW4pKQogICAgICAgIHNlbGYudG9fc2NhbiA9IE5vbmUgICMgZnJvbSBub3cgb24sIGdvIGFoZWFkIGFuZCBwcm9jZXNzIGltbWVkaWF0ZWx5CgogICAgZGVmIG5vdF9mb3VuZF9pbl9pbmRleChzZWxmLCByZXF1aXJlbWVudCk6CiAgICAgICAgaWYgc2VsZltyZXF1aXJlbWVudC5rZXldOiAgIyB3ZSd2ZSBzZWVuIGF0IGxlYXN0IG9uZSBkaXN0cm8KICAgICAgICAgICAgbWV0aCwgbXNnID0gc2VsZi5pbmZvLCAiQ291bGRuJ3QgcmV0cmlldmUgaW5kZXggcGFnZSBmb3IgJXIiCiAgICAgICAgZWxzZTogICMgbm8gZGlzdHJvcyBzZWVuIGZvciB0aGlzIG5hbWUsIG1pZ2h0IGJlIG1pc3NwZWxsZWQKICAgICAgICAgICAgbWV0aCwgbXNnID0gKAogICAgICAgICAgICAgICAgc2VsZi53YXJuLAogICAgICAgICAgICAgICAgIkNvdWxkbid0IGZpbmQgaW5kZXggcGFnZSBmb3IgJXIgKG1heWJlIG1pc3NwZWxsZWQ/KSIpCiAgICAgICAgbWV0aChtc2csIHJlcXVpcmVtZW50LnVuc2FmZV9uYW1lKQogICAgICAgIHNlbGYuc2Nhbl9hbGwoKQoKICAgIGRlZiBkb3dubG9hZChzZWxmLCBzcGVjLCB0bXBkaXIpOgogICAgICAgICIiIkxvY2F0ZSBhbmQvb3IgZG93bmxvYWQgYHNwZWNgIHRvIGB0bXBkaXJgLCByZXR1cm5pbmcgYSBsb2NhbCBwYXRoCgogICAgICAgIGBzcGVjYCBtYXkgYmUgYSBgYFJlcXVpcmVtZW50YGAgb2JqZWN0LCBvciBhIHN0cmluZyBjb250YWluaW5nIGEgVVJMLAogICAgICAgIGFuIGV4aXN0aW5nIGxvY2FsIGZpbGVuYW1lLCBvciBhIHByb2plY3QvdmVyc2lvbiByZXF1aXJlbWVudCBzcGVjCiAgICAgICAgKGkuZS4gdGhlIHN0cmluZyBmb3JtIG9mIGEgYGBSZXF1aXJlbWVudGBgIG9iamVjdCkuICBJZiBpdCBpcyB0aGUgVVJMCiAgICAgICAgb2YgYSAucHkgZmlsZSB3aXRoIGFuIHVuYW1iaWd1b3VzIGBgI2VnZz1uYW1lLXZlcnNpb25gYCB0YWcgKGkuZS4sIG9uZQogICAgICAgIHRoYXQgZXNjYXBlcyBgYC1gYCBhcyBgYF9gYCB0aHJvdWdob3V0KSwgYSB0cml2aWFsIGBgc2V0dXAucHlgYCBpcwogICAgICAgIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBhbG9uZ3NpZGUgdGhlIGRvd25sb2FkZWQgZmlsZS4KCiAgICAgICAgSWYgYHNwZWNgIGlzIGEgYGBSZXF1aXJlbWVudGBgIG9iamVjdCBvciBhIHN0cmluZyBjb250YWluaW5nIGEKICAgICAgICBwcm9qZWN0L3ZlcnNpb24gcmVxdWlyZW1lbnQgc3BlYywgdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgbG9jYXRpb24gb2YKICAgICAgICBhIG1hdGNoaW5nIGRpc3RyaWJ1dGlvbiAocG9zc2libHkgYWZ0ZXIgZG93bmxvYWRpbmcgaXQgdG8gYHRtcGRpcmApLgogICAgICAgIElmIGBzcGVjYCBpcyBhIGxvY2FsbHkgZXhpc3RpbmcgZmlsZSBvciBkaXJlY3RvcnkgbmFtZSwgaXQgaXMgc2ltcGx5CiAgICAgICAgcmV0dXJuZWQgdW5jaGFuZ2VkLiAgSWYgYHNwZWNgIGlzIGEgVVJMLCBpdCBpcyBkb3dubG9hZGVkIHRvIGEgc3VicGF0aAogICAgICAgIG9mIGB0bXBkaXJgLCBhbmQgdGhlIGxvY2FsIGZpbGVuYW1lIGlzIHJldHVybmVkLiAgVmFyaW91cyBlcnJvcnMgbWF5IGJlCiAgICAgICAgcmFpc2VkIGlmIGEgcHJvYmxlbSBvY2N1cnMgZHVyaW5nIGRvd25sb2FkaW5nLgogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHNwZWMsIFJlcXVpcmVtZW50KToKICAgICAgICAgICAgc2NoZW1lID0gVVJMX1NDSEVNRShzcGVjKQogICAgICAgICAgICBpZiBzY2hlbWU6CiAgICAgICAgICAgICAgICAjIEl0J3MgYSB1cmwsIGRvd25sb2FkIGl0IHRvIHRtcGRpcgogICAgICAgICAgICAgICAgZm91bmQgPSBzZWxmLl9kb3dubG9hZF91cmwoc2NoZW1lLmdyb3VwKDEpLCBzcGVjLCB0bXBkaXIpCiAgICAgICAgICAgICAgICBiYXNlLCBmcmFnbWVudCA9IGVnZ19pbmZvX2Zvcl91cmwoc3BlYykKICAgICAgICAgICAgICAgIGlmIGJhc2UuZW5kc3dpdGgoJy5weScpOgogICAgICAgICAgICAgICAgICAgIGZvdW5kID0gc2VsZi5nZW5fc2V0dXAoZm91bmQsIGZyYWdtZW50LCB0bXBkaXIpCiAgICAgICAgICAgICAgICByZXR1cm4gZm91bmQKICAgICAgICAgICAgZWxpZiBvcy5wYXRoLmV4aXN0cyhzcGVjKToKICAgICAgICAgICAgICAgICMgRXhpc3RpbmcgZmlsZSBvciBkaXJlY3RvcnksIGp1c3QgcmV0dXJuIGl0CiAgICAgICAgICAgICAgICByZXR1cm4gc3BlYwogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc3BlYyA9IHBhcnNlX3JlcXVpcmVtZW50X2FyZyhzcGVjKQogICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYuZmV0Y2hfZGlzdHJpYnV0aW9uKHNwZWMsIHRtcGRpciksICdsb2NhdGlvbicsIE5vbmUpCgogICAgZGVmIGZldGNoX2Rpc3RyaWJ1dGlvbigKICAgICAgICAgICAgc2VsZiwgcmVxdWlyZW1lbnQsIHRtcGRpciwgZm9yY2Vfc2Nhbj1GYWxzZSwgc291cmNlPUZhbHNlLAogICAgICAgICAgICBkZXZlbG9wX29rPUZhbHNlLCBsb2NhbF9pbmRleD1Ob25lKToKICAgICAgICAiIiJPYnRhaW4gYSBkaXN0cmlidXRpb24gc3VpdGFibGUgZm9yIGZ1bGZpbGxpbmcgYHJlcXVpcmVtZW50YAoKICAgICAgICBgcmVxdWlyZW1lbnRgIG11c3QgYmUgYSBgYHBrZ19yZXNvdXJjZXMuUmVxdWlyZW1lbnRgYCBpbnN0YW5jZS4KICAgICAgICBJZiBuZWNlc3NhcnksIG9yIGlmIHRoZSBgZm9yY2Vfc2NhbmAgZmxhZyBpcyBzZXQsIHRoZSByZXF1aXJlbWVudCBpcwogICAgICAgIHNlYXJjaGVkIGZvciBpbiB0aGUgKG9ubGluZSkgcGFja2FnZSBpbmRleCBhcyB3ZWxsIGFzIHRoZSBsb2NhbGx5CiAgICAgICAgaW5zdGFsbGVkIHBhY2thZ2VzLiAgSWYgYSBkaXN0cmlidXRpb24gbWF0Y2hpbmcgYHJlcXVpcmVtZW50YCBpcyBmb3VuZCwKICAgICAgICB0aGUgcmV0dXJuZWQgZGlzdHJpYnV0aW9uJ3MgYGBsb2NhdGlvbmBgIGlzIHRoZSB2YWx1ZSB5b3Ugd291bGQgaGF2ZQogICAgICAgIGdvdHRlbiBmcm9tIGNhbGxpbmcgdGhlIGBgZG93bmxvYWQoKWBgIG1ldGhvZCB3aXRoIHRoZSBtYXRjaGluZwogICAgICAgIGRpc3RyaWJ1dGlvbidzIFVSTCBvciBmaWxlbmFtZS4gIElmIG5vIG1hdGNoaW5nIGRpc3RyaWJ1dGlvbiBpcyBmb3VuZCwKICAgICAgICBgYE5vbmVgYCBpcyByZXR1cm5lZC4KCiAgICAgICAgSWYgdGhlIGBzb3VyY2VgIGZsYWcgaXMgc2V0LCBvbmx5IHNvdXJjZSBkaXN0cmlidXRpb25zIGFuZCBzb3VyY2UKICAgICAgICBjaGVja291dCBsaW5rcyB3aWxsIGJlIGNvbnNpZGVyZWQuICBVbmxlc3MgdGhlIGBkZXZlbG9wX29rYCBmbGFnIGlzCiAgICAgICAgc2V0LCBkZXZlbG9wbWVudCBhbmQgc3lzdGVtIGVnZ3MgKGkuZS4sIHRob3NlIHVzaW5nIHRoZSBgYC5lZ2ctaW5mb2BgCiAgICAgICAgZm9ybWF0KSB3aWxsIGJlIGlnbm9yZWQuCiAgICAgICAgIiIiCiAgICAgICAgIyBwcm9jZXNzIGEgUmVxdWlyZW1lbnQKICAgICAgICBzZWxmLmluZm8oIlNlYXJjaGluZyBmb3IgJXMiLCByZXF1aXJlbWVudCkKICAgICAgICBza2lwcGVkID0ge30KICAgICAgICBkaXN0ID0gTm9uZQoKICAgICAgICBkZWYgZmluZChyZXEsIGVudj1Ob25lKToKICAgICAgICAgICAgaWYgZW52IGlzIE5vbmU6CiAgICAgICAgICAgICAgICBlbnYgPSBzZWxmCiAgICAgICAgICAgICMgRmluZCBhIG1hdGNoaW5nIGRpc3RyaWJ1dGlvbjsgbWF5IGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZQoKICAgICAgICAgICAgZm9yIGRpc3QgaW4gZW52W3JlcS5rZXldOgoKICAgICAgICAgICAgICAgIGlmIGRpc3QucHJlY2VkZW5jZSA9PSBERVZFTE9QX0RJU1QgYW5kIG5vdCBkZXZlbG9wX29rOgogICAgICAgICAgICAgICAgICAgIGlmIGRpc3Qgbm90IGluIHNraXBwZWQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud2FybigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTa2lwcGluZyBkZXZlbG9wbWVudCBvciBzeXN0ZW0gZWdnOiAlcyIsIGRpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgc2tpcHBlZFtkaXN0XSA9IDEKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgICAgIHRlc3QgPSAoCiAgICAgICAgICAgICAgICAgICAgZGlzdCBpbiByZXEKICAgICAgICAgICAgICAgICAgICBhbmQgKGRpc3QucHJlY2VkZW5jZSA8PSBTT1VSQ0VfRElTVCBvciBub3Qgc291cmNlKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgaWYgdGVzdDoKICAgICAgICAgICAgICAgICAgICBsb2MgPSBzZWxmLmRvd25sb2FkKGRpc3QubG9jYXRpb24sIHRtcGRpcikKICAgICAgICAgICAgICAgICAgICBkaXN0LmRvd25sb2FkX2xvY2F0aW9uID0gbG9jCiAgICAgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZGlzdC5kb3dubG9hZF9sb2NhdGlvbik6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkaXN0CgogICAgICAgIGlmIGZvcmNlX3NjYW46CiAgICAgICAgICAgIHNlbGYucHJlc2NhbigpCiAgICAgICAgICAgIHNlbGYuZmluZF9wYWNrYWdlcyhyZXF1aXJlbWVudCkKICAgICAgICAgICAgZGlzdCA9IGZpbmQocmVxdWlyZW1lbnQpCgogICAgICAgIGlmIG5vdCBkaXN0IGFuZCBsb2NhbF9pbmRleCBpcyBub3QgTm9uZToKICAgICAgICAgICAgZGlzdCA9IGZpbmQocmVxdWlyZW1lbnQsIGxvY2FsX2luZGV4KQoKICAgICAgICBpZiBkaXN0IGlzIE5vbmU6CiAgICAgICAgICAgIGlmIHNlbGYudG9fc2NhbiBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIHNlbGYucHJlc2NhbigpCiAgICAgICAgICAgIGRpc3QgPSBmaW5kKHJlcXVpcmVtZW50KQoKICAgICAgICBpZiBkaXN0IGlzIE5vbmUgYW5kIG5vdCBmb3JjZV9zY2FuOgogICAgICAgICAgICBzZWxmLmZpbmRfcGFja2FnZXMocmVxdWlyZW1lbnQpCiAgICAgICAgICAgIGRpc3QgPSBmaW5kKHJlcXVpcmVtZW50KQoKICAgICAgICBpZiBkaXN0IGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYud2FybigKICAgICAgICAgICAgICAgICJObyBsb2NhbCBwYWNrYWdlcyBvciB3b3JraW5nIGRvd25sb2FkIGxpbmtzIGZvdW5kIGZvciAlcyVzIiwKICAgICAgICAgICAgICAgIChzb3VyY2UgYW5kICJhIHNvdXJjZSBkaXN0cmlidXRpb24gb2YgIiBvciAiIiksCiAgICAgICAgICAgICAgICByZXF1aXJlbWVudCwKICAgICAgICAgICAgKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuaW5mbygiQmVzdCBtYXRjaDogJXMiLCBkaXN0KQogICAgICAgICAgICByZXR1cm4gZGlzdC5jbG9uZShsb2NhdGlvbj1kaXN0LmRvd25sb2FkX2xvY2F0aW9uKQoKICAgIGRlZiBmZXRjaChzZWxmLCByZXF1aXJlbWVudCwgdG1wZGlyLCBmb3JjZV9zY2FuPUZhbHNlLCBzb3VyY2U9RmFsc2UpOgogICAgICAgICIiIk9idGFpbiBhIGZpbGUgc3VpdGFibGUgZm9yIGZ1bGZpbGxpbmcgYHJlcXVpcmVtZW50YAoKICAgICAgICBERVBSRUNBVEVEOyB1c2UgdGhlIGBgZmV0Y2hfZGlzdHJpYnV0aW9uKClgYCBtZXRob2Qgbm93IGluc3RlYWQuICBGb3IKICAgICAgICBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB0aGlzIHJvdXRpbmUgaXMgaWRlbnRpY2FsIGJ1dCByZXR1cm5zIHRoZQogICAgICAgIGBgbG9jYXRpb25gYCBvZiB0aGUgZG93bmxvYWRlZCBkaXN0cmlidXRpb24gaW5zdGVhZCBvZiBhIGRpc3RyaWJ1dGlvbgogICAgICAgIG9iamVjdC4KICAgICAgICAiIiIKICAgICAgICBkaXN0ID0gc2VsZi5mZXRjaF9kaXN0cmlidXRpb24ocmVxdWlyZW1lbnQsIHRtcGRpciwgZm9yY2Vfc2Nhbiwgc291cmNlKQogICAgICAgIGlmIGRpc3QgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBkaXN0LmxvY2F0aW9uCiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBkZWYgZ2VuX3NldHVwKHNlbGYsIGZpbGVuYW1lLCBmcmFnbWVudCwgdG1wZGlyKToKICAgICAgICBtYXRjaCA9IEVHR19GUkFHTUVOVC5tYXRjaChmcmFnbWVudCkKICAgICAgICBkaXN0cyA9IG1hdGNoIGFuZCBbCiAgICAgICAgICAgIGQgZm9yIGQgaW4KICAgICAgICAgICAgaW50ZXJwcmV0X2Rpc3Ryb19uYW1lKGZpbGVuYW1lLCBtYXRjaC5ncm91cCgxKSwgTm9uZSkgaWYgZC52ZXJzaW9uCiAgICAgICAgXSBvciBbXQoKICAgICAgICBpZiBsZW4oZGlzdHMpID09IDE6ICAjIHVuYW1iaWd1b3VzIGBgI2VnZ2BgIGZyYWdtZW50CiAgICAgICAgICAgIGJhc2VuYW1lID0gb3MucGF0aC5iYXNlbmFtZShmaWxlbmFtZSkKCiAgICAgICAgICAgICMgTWFrZSBzdXJlIHRoZSBmaWxlIGhhcyBiZWVuIGRvd25sb2FkZWQgdG8gdGhlIHRlbXAgZGlyLgogICAgICAgICAgICBpZiBvcy5wYXRoLmRpcm5hbWUoZmlsZW5hbWUpICE9IHRtcGRpcjoKICAgICAgICAgICAgICAgIGRzdCA9IG9zLnBhdGguam9pbih0bXBkaXIsIGJhc2VuYW1lKQogICAgICAgICAgICAgICAgZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQuZWFzeV9pbnN0YWxsIGltcG9ydCBzYW1lZmlsZQogICAgICAgICAgICAgICAgaWYgbm90IHNhbWVmaWxlKGZpbGVuYW1lLCBkc3QpOgogICAgICAgICAgICAgICAgICAgIHNodXRpbC5jb3B5MihmaWxlbmFtZSwgZHN0KQogICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gZHN0CgogICAgICAgICAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKHRtcGRpciwgJ3NldHVwLnB5JyksICd3JykgYXMgZmlsZToKICAgICAgICAgICAgICAgIGZpbGUud3JpdGUoCiAgICAgICAgICAgICAgICAgICAgImZyb20gc2V0dXB0b29scyBpbXBvcnQgc2V0dXBcbiIKICAgICAgICAgICAgICAgICAgICAic2V0dXAobmFtZT0lciwgdmVyc2lvbj0lciwgcHlfbW9kdWxlcz1bJXJdKVxuIgogICAgICAgICAgICAgICAgICAgICUgKAogICAgICAgICAgICAgICAgICAgICAgICBkaXN0c1swXS5wcm9qZWN0X25hbWUsIGRpc3RzWzBdLnZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguc3BsaXRleHQoYmFzZW5hbWUpWzBdCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICByZXR1cm4gZmlsZW5hbWUKCiAgICAgICAgZWxpZiBtYXRjaDoKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoCiAgICAgICAgICAgICAgICAiQ2FuJ3QgdW5hbWJpZ3VvdXNseSBpbnRlcnByZXQgcHJvamVjdC92ZXJzaW9uIGlkZW50aWZpZXIgJXI7ICIKICAgICAgICAgICAgICAgICJhbnkgZGFzaGVzIGluIHRoZSBuYW1lIG9yIHZlcnNpb24gc2hvdWxkIGJlIGVzY2FwZWQgdXNpbmcgIgogICAgICAgICAgICAgICAgInVuZGVyc2NvcmVzLiAlciIgJSAoZnJhZ21lbnQsIGRpc3RzKQogICAgICAgICAgICApCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoCiAgICAgICAgICAgICAgICAiQ2FuJ3QgcHJvY2VzcyBwbGFpbiAucHkgZmlsZXMgd2l0aG91dCBhbiAnI2VnZz1uYW1lLXZlcnNpb24nIgogICAgICAgICAgICAgICAgIiBzdWZmaXggdG8gZW5hYmxlIGF1dG9tYXRpYyBzZXR1cCBzY3JpcHQgZ2VuZXJhdGlvbi4iCiAgICAgICAgICAgICkKCiAgICBkbF9ibG9ja3NpemUgPSA4MTkyCgogICAgZGVmIF9kb3dubG9hZF90byhzZWxmLCB1cmwsIGZpbGVuYW1lKToKICAgICAgICBzZWxmLmluZm8oIkRvd25sb2FkaW5nICVzIiwgdXJsKQogICAgICAgICMgRG93bmxvYWQgdGhlIGZpbGUKICAgICAgICBmcCA9IE5vbmUKICAgICAgICB0cnk6CiAgICAgICAgICAgIGNoZWNrZXIgPSBIYXNoQ2hlY2tlci5mcm9tX3VybCh1cmwpCiAgICAgICAgICAgIGZwID0gc2VsZi5vcGVuX3VybCh1cmwpCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZnAsIHVybGxpYi5lcnJvci5IVFRQRXJyb3IpOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgIkNhbid0IGRvd25sb2FkICVzOiAlcyAlcyIgJSAodXJsLCBmcC5jb2RlLCBmcC5tc2cpCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIGhlYWRlcnMgPSBmcC5pbmZvKCkKICAgICAgICAgICAgYmxvY2tudW0gPSAwCiAgICAgICAgICAgIGJzID0gc2VsZi5kbF9ibG9ja3NpemUKICAgICAgICAgICAgc2l6ZSA9IC0xCiAgICAgICAgICAgIGlmICJjb250ZW50LWxlbmd0aCIgaW4gaGVhZGVyczoKICAgICAgICAgICAgICAgICMgU29tZSBzZXJ2ZXJzIHJldHVybiBtdWx0aXBsZSBDb250ZW50LUxlbmd0aCBoZWFkZXJzIDooCiAgICAgICAgICAgICAgICBzaXplcyA9IGdldF9hbGxfaGVhZGVycyhoZWFkZXJzLCAnQ29udGVudC1MZW5ndGgnKQogICAgICAgICAgICAgICAgc2l6ZSA9IG1heChtYXAoaW50LCBzaXplcykpCiAgICAgICAgICAgICAgICBzZWxmLnJlcG9ydGhvb2sodXJsLCBmaWxlbmFtZSwgYmxvY2tudW0sIGJzLCBzaXplKQogICAgICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICd3YicpIGFzIHRmcDoKICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICAgICAgICAgYmxvY2sgPSBmcC5yZWFkKGJzKQogICAgICAgICAgICAgICAgICAgIGlmIGJsb2NrOgogICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VyLmZlZWQoYmxvY2spCiAgICAgICAgICAgICAgICAgICAgICAgIHRmcC53cml0ZShibG9jaykKICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tudW0gKz0gMQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlcG9ydGhvb2sodXJsLCBmaWxlbmFtZSwgYmxvY2tudW0sIGJzLCBzaXplKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICBzZWxmLmNoZWNrX2hhc2goY2hlY2tlciwgZmlsZW5hbWUsIHRmcCkKICAgICAgICAgICAgcmV0dXJuIGhlYWRlcnMKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBpZiBmcDoKICAgICAgICAgICAgICAgIGZwLmNsb3NlKCkKCiAgICBkZWYgcmVwb3J0aG9vayhzZWxmLCB1cmwsIGZpbGVuYW1lLCBibG9ja251bSwgYmxrc2l6ZSwgc2l6ZSk6CiAgICAgICAgcGFzcyAgIyBuby1vcAoKICAgIGRlZiBvcGVuX3VybChzZWxmLCB1cmwsIHdhcm5pbmc9Tm9uZSk6CiAgICAgICAgaWYgdXJsLnN0YXJ0c3dpdGgoJ2ZpbGU6Jyk6CiAgICAgICAgICAgIHJldHVybiBsb2NhbF9vcGVuKHVybCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBvcGVuX3dpdGhfYXV0aCh1cmwsIHNlbGYub3BlbmVyKQogICAgICAgIGV4Y2VwdCAoVmFsdWVFcnJvciwgaHR0cF9jbGllbnQuSW52YWxpZFVSTCkgYXMgdjoKICAgICAgICAgICAgbXNnID0gJyAnLmpvaW4oW3N0cihhcmcpIGZvciBhcmcgaW4gdi5hcmdzXSkKICAgICAgICAgICAgaWYgd2FybmluZzoKICAgICAgICAgICAgICAgIHNlbGYud2Fybih3YXJuaW5nLCBtc2cpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcignJXMgJXMnICUgKHVybCwgbXNnKSkKICAgICAgICBleGNlcHQgdXJsbGliLmVycm9yLkhUVFBFcnJvciBhcyB2OgogICAgICAgICAgICByZXR1cm4gdgogICAgICAgIGV4Y2VwdCB1cmxsaWIuZXJyb3IuVVJMRXJyb3IgYXMgdjoKICAgICAgICAgICAgaWYgd2FybmluZzoKICAgICAgICAgICAgICAgIHNlbGYud2Fybih3YXJuaW5nLCB2LnJlYXNvbikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKCJEb3dubG9hZCBlcnJvciBmb3IgJXM6ICVzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAodXJsLCB2LnJlYXNvbikpCiAgICAgICAgZXhjZXB0IGh0dHBfY2xpZW50LkJhZFN0YXR1c0xpbmUgYXMgdjoKICAgICAgICAgICAgaWYgd2FybmluZzoKICAgICAgICAgICAgICAgIHNlbGYud2Fybih3YXJuaW5nLCB2LmxpbmUpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigKICAgICAgICAgICAgICAgICAgICAnJXMgcmV0dXJuZWQgYSBiYWQgc3RhdHVzIGxpbmUuIFRoZSBzZXJ2ZXIgbWlnaHQgYmUgJwogICAgICAgICAgICAgICAgICAgICdkb3duLCAlcycgJQogICAgICAgICAgICAgICAgICAgICh1cmwsIHYubGluZSkKICAgICAgICAgICAgICAgICkKICAgICAgICBleGNlcHQgKGh0dHBfY2xpZW50LkhUVFBFeGNlcHRpb24sIHNvY2tldC5lcnJvcikgYXMgdjoKICAgICAgICAgICAgaWYgd2FybmluZzoKICAgICAgICAgICAgICAgIHNlbGYud2Fybih3YXJuaW5nLCB2KQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoIkRvd25sb2FkIGVycm9yIGZvciAlczogJXMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlICh1cmwsIHYpKQoKICAgIGRlZiBfZG93bmxvYWRfdXJsKHNlbGYsIHNjaGVtZSwgdXJsLCB0bXBkaXIpOgogICAgICAgICMgRGV0ZXJtaW5lIGRvd25sb2FkIGZpbGVuYW1lCiAgICAgICAgIwogICAgICAgIG5hbWUsIGZyYWdtZW50ID0gZWdnX2luZm9fZm9yX3VybCh1cmwpCiAgICAgICAgaWYgbmFtZToKICAgICAgICAgICAgd2hpbGUgJy4uJyBpbiBuYW1lOgogICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgnLi4nLCAnLicpLnJlcGxhY2UoJ1xcJywgJ18nKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG5hbWUgPSAiX19kb3dubG9hZGVkX18iICAjIGRlZmF1bHQgaWYgVVJMIGhhcyBubyBwYXRoIGNvbnRlbnRzCgogICAgICAgIGlmIG5hbWUuZW5kc3dpdGgoJy5lZ2cuemlwJyk6CiAgICAgICAgICAgIG5hbWUgPSBuYW1lWzotNF0gICMgc3RyaXAgdGhlIGV4dHJhIC56aXAgYmVmb3JlIGRvd25sb2FkCgogICAgICAgIGZpbGVuYW1lID0gb3MucGF0aC5qb2luKHRtcGRpciwgbmFtZSkKCiAgICAgICAgIyBEb3dubG9hZCB0aGUgZmlsZQogICAgICAgICMKICAgICAgICBpZiBzY2hlbWUgPT0gJ3N2bicgb3Igc2NoZW1lLnN0YXJ0c3dpdGgoJ3N2bisnKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2Rvd25sb2FkX3N2bih1cmwsIGZpbGVuYW1lKQogICAgICAgIGVsaWYgc2NoZW1lID09ICdnaXQnIG9yIHNjaGVtZS5zdGFydHN3aXRoKCdnaXQrJyk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9kb3dubG9hZF9naXQodXJsLCBmaWxlbmFtZSkKICAgICAgICBlbGlmIHNjaGVtZS5zdGFydHN3aXRoKCdoZysnKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2Rvd25sb2FkX2hnKHVybCwgZmlsZW5hbWUpCiAgICAgICAgZWxpZiBzY2hlbWUgPT0gJ2ZpbGUnOgogICAgICAgICAgICByZXR1cm4gdXJsbGliLnJlcXVlc3QudXJsMnBhdGhuYW1lKHVybGxpYi5wYXJzZS51cmxwYXJzZSh1cmwpWzJdKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudXJsX29rKHVybCwgVHJ1ZSkgICMgcmFpc2VzIGVycm9yIGlmIG5vdCBhbGxvd2VkCiAgICAgICAgICAgIHJldHVybiBzZWxmLl9hdHRlbXB0X2Rvd25sb2FkKHVybCwgZmlsZW5hbWUpCgogICAgZGVmIHNjYW5fdXJsKHNlbGYsIHVybCk6CiAgICAgICAgc2VsZi5wcm9jZXNzX3VybCh1cmwsIFRydWUpCgogICAgZGVmIF9hdHRlbXB0X2Rvd25sb2FkKHNlbGYsIHVybCwgZmlsZW5hbWUpOgogICAgICAgIGhlYWRlcnMgPSBzZWxmLl9kb3dubG9hZF90byh1cmwsIGZpbGVuYW1lKQogICAgICAgIGlmICdodG1sJyBpbiBoZWFkZXJzLmdldCgnY29udGVudC10eXBlJywgJycpLmxvd2VyKCk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9kb3dubG9hZF9odG1sKHVybCwgaGVhZGVycywgZmlsZW5hbWUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIGZpbGVuYW1lCgogICAgZGVmIF9kb3dubG9hZF9odG1sKHNlbGYsIHVybCwgaGVhZGVycywgZmlsZW5hbWUpOgogICAgICAgIGZpbGUgPSBvcGVuKGZpbGVuYW1lKQogICAgICAgIGZvciBsaW5lIGluIGZpbGU6CiAgICAgICAgICAgIGlmIGxpbmUuc3RyaXAoKToKICAgICAgICAgICAgICAgICMgQ2hlY2sgZm9yIGEgc3VidmVyc2lvbiBpbmRleCBwYWdlCiAgICAgICAgICAgICAgICBpZiByZS5zZWFyY2gocic8dGl0bGU+KFteLSBdKyAtICk/UmV2aXNpb24gXGQrOicsIGxpbmUpOgogICAgICAgICAgICAgICAgICAgICMgaXQncyBhIHN1YnZlcnNpb24gaW5kZXggcGFnZToKICAgICAgICAgICAgICAgICAgICBmaWxlLmNsb3NlKCkKICAgICAgICAgICAgICAgICAgICBvcy51bmxpbmsoZmlsZW5hbWUpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2Rvd25sb2FkX3N2bih1cmwsIGZpbGVuYW1lKQogICAgICAgICAgICAgICAgYnJlYWsgICMgbm90IGFuIGluZGV4IHBhZ2UKICAgICAgICBmaWxlLmNsb3NlKCkKICAgICAgICBvcy51bmxpbmsoZmlsZW5hbWUpCiAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoIlVuZXhwZWN0ZWQgSFRNTCBwYWdlIGZvdW5kIGF0ICIgKyB1cmwpCgogICAgZGVmIF9kb3dubG9hZF9zdm4oc2VsZiwgdXJsLCBmaWxlbmFtZSk6CiAgICAgICAgd2FybmluZ3Mud2FybigiU1ZOIGRvd25sb2FkIHN1cHBvcnQgaXMgZGVwcmVjYXRlZCIsIFVzZXJXYXJuaW5nKQogICAgICAgIHVybCA9IHVybC5zcGxpdCgnIycsIDEpWzBdICAjIHJlbW92ZSBhbnkgZnJhZ21lbnQgZm9yIHN2bidzIHNha2UKICAgICAgICBjcmVkcyA9ICcnCiAgICAgICAgaWYgdXJsLmxvd2VyKCkuc3RhcnRzd2l0aCgnc3ZuOicpIGFuZCAnQCcgaW4gdXJsOgogICAgICAgICAgICBzY2hlbWUsIG5ldGxvYywgcGF0aCwgcCwgcSwgZiA9IHVybGxpYi5wYXJzZS51cmxwYXJzZSh1cmwpCiAgICAgICAgICAgIGlmIG5vdCBuZXRsb2MgYW5kIHBhdGguc3RhcnRzd2l0aCgnLy8nKSBhbmQgJy8nIGluIHBhdGhbMjpdOgogICAgICAgICAgICAgICAgbmV0bG9jLCBwYXRoID0gcGF0aFsyOl0uc3BsaXQoJy8nLCAxKQogICAgICAgICAgICAgICAgYXV0aCwgaG9zdCA9IF9zcGxpdHVzZXIobmV0bG9jKQogICAgICAgICAgICAgICAgaWYgYXV0aDoKICAgICAgICAgICAgICAgICAgICBpZiAnOicgaW4gYXV0aDoKICAgICAgICAgICAgICAgICAgICAgICAgdXNlciwgcHcgPSBhdXRoLnNwbGl0KCc6JywgMSkKICAgICAgICAgICAgICAgICAgICAgICAgY3JlZHMgPSAiIC0tdXNlcm5hbWU9JXMgLS1wYXNzd29yZD0lcyIgJSAodXNlciwgcHcpCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgY3JlZHMgPSAiIC0tdXNlcm5hbWU9IiArIGF1dGgKICAgICAgICAgICAgICAgICAgICBuZXRsb2MgPSBob3N0CiAgICAgICAgICAgICAgICAgICAgcGFydHMgPSBzY2hlbWUsIG5ldGxvYywgdXJsLCBwLCBxLCBmCiAgICAgICAgICAgICAgICAgICAgdXJsID0gdXJsbGliLnBhcnNlLnVybHVucGFyc2UocGFydHMpCiAgICAgICAgc2VsZi5pbmZvKCJEb2luZyBzdWJ2ZXJzaW9uIGNoZWNrb3V0IGZyb20gJXMgdG8gJXMiLCB1cmwsIGZpbGVuYW1lKQogICAgICAgIG9zLnN5c3RlbSgic3ZuIGNoZWNrb3V0JXMgLXEgJXMgJXMiICUgKGNyZWRzLCB1cmwsIGZpbGVuYW1lKSkKICAgICAgICByZXR1cm4gZmlsZW5hbWUKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX3Zjc19zcGxpdF9yZXZfZnJvbV91cmwodXJsLCBwb3BfcHJlZml4PUZhbHNlKToKICAgICAgICBzY2hlbWUsIG5ldGxvYywgcGF0aCwgcXVlcnksIGZyYWcgPSB1cmxsaWIucGFyc2UudXJsc3BsaXQodXJsKQoKICAgICAgICBzY2hlbWUgPSBzY2hlbWUuc3BsaXQoJysnLCAxKVstMV0KCiAgICAgICAgIyBTb21lIGZyYWdtZW50IGlkZW50aWZpY2F0aW9uIGZhaWxzCiAgICAgICAgcGF0aCA9IHBhdGguc3BsaXQoJyMnLCAxKVswXQoKICAgICAgICByZXYgPSBOb25lCiAgICAgICAgaWYgJ0AnIGluIHBhdGg6CiAgICAgICAgICAgIHBhdGgsIHJldiA9IHBhdGgucnNwbGl0KCdAJywgMSkKCiAgICAgICAgIyBBbHNvLCBkaXNjYXJkIGZyYWdtZW50CiAgICAgICAgdXJsID0gdXJsbGliLnBhcnNlLnVybHVuc3BsaXQoKHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBxdWVyeSwgJycpKQoKICAgICAgICByZXR1cm4gdXJsLCByZXYKCiAgICBkZWYgX2Rvd25sb2FkX2dpdChzZWxmLCB1cmwsIGZpbGVuYW1lKToKICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lLnNwbGl0KCcjJywgMSlbMF0KICAgICAgICB1cmwsIHJldiA9IHNlbGYuX3Zjc19zcGxpdF9yZXZfZnJvbV91cmwodXJsLCBwb3BfcHJlZml4PVRydWUpCgogICAgICAgIHNlbGYuaW5mbygiRG9pbmcgZ2l0IGNsb25lIGZyb20gJXMgdG8gJXMiLCB1cmwsIGZpbGVuYW1lKQogICAgICAgIG9zLnN5c3RlbSgiZ2l0IGNsb25lIC0tcXVpZXQgJXMgJXMiICUgKHVybCwgZmlsZW5hbWUpKQoKICAgICAgICBpZiByZXYgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYuaW5mbygiQ2hlY2tpbmcgb3V0ICVzIiwgcmV2KQogICAgICAgICAgICBvcy5zeXN0ZW0oImdpdCAtQyAlcyBjaGVja291dCAtLXF1aWV0ICVzIiAlICgKICAgICAgICAgICAgICAgIGZpbGVuYW1lLAogICAgICAgICAgICAgICAgcmV2LAogICAgICAgICAgICApKQoKICAgICAgICByZXR1cm4gZmlsZW5hbWUKCiAgICBkZWYgX2Rvd25sb2FkX2hnKHNlbGYsIHVybCwgZmlsZW5hbWUpOgogICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWUuc3BsaXQoJyMnLCAxKVswXQogICAgICAgIHVybCwgcmV2ID0gc2VsZi5fdmNzX3NwbGl0X3Jldl9mcm9tX3VybCh1cmwsIHBvcF9wcmVmaXg9VHJ1ZSkKCiAgICAgICAgc2VsZi5pbmZvKCJEb2luZyBoZyBjbG9uZSBmcm9tICVzIHRvICVzIiwgdXJsLCBmaWxlbmFtZSkKICAgICAgICBvcy5zeXN0ZW0oImhnIGNsb25lIC0tcXVpZXQgJXMgJXMiICUgKHVybCwgZmlsZW5hbWUpKQoKICAgICAgICBpZiByZXYgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYuaW5mbygiVXBkYXRpbmcgdG8gJXMiLCByZXYpCiAgICAgICAgICAgIG9zLnN5c3RlbSgiaGcgLS1jd2QgJXMgdXAgLUMgLXIgJXMgLXEiICUgKAogICAgICAgICAgICAgICAgZmlsZW5hbWUsCiAgICAgICAgICAgICAgICByZXYsCiAgICAgICAgICAgICkpCgogICAgICAgIHJldHVybiBmaWxlbmFtZQoKICAgIGRlZiBkZWJ1ZyhzZWxmLCBtc2csICphcmdzKToKICAgICAgICBsb2cuZGVidWcobXNnLCAqYXJncykKCiAgICBkZWYgaW5mbyhzZWxmLCBtc2csICphcmdzKToKICAgICAgICBsb2cuaW5mbyhtc2csICphcmdzKQoKICAgIGRlZiB3YXJuKHNlbGYsIG1zZywgKmFyZ3MpOgogICAgICAgIGxvZy53YXJuKG1zZywgKmFyZ3MpCgoKIyBUaGlzIHBhdHRlcm4gbWF0Y2hlcyBhIGNoYXJhY3RlciBlbnRpdHkgcmVmZXJlbmNlIChhIGRlY2ltYWwgbnVtZXJpYwojIHJlZmVyZW5jZXMsIGEgaGV4YWRlY2ltYWwgbnVtZXJpYyByZWZlcmVuY2UsIG9yIGEgbmFtZWQgcmVmZXJlbmNlKS4KZW50aXR5X3N1YiA9IHJlLmNvbXBpbGUocicmKCMoXGQrfHhbXGRhLWZBLUZdKyl8W1x3LjotXSspOz8nKS5zdWIKCgpkZWYgZGVjb2RlX2VudGl0eShtYXRjaCk6CiAgICB3aGF0ID0gbWF0Y2guZ3JvdXAoMCkKICAgIHJldHVybiB1bmVzY2FwZSh3aGF0KQoKCmRlZiBodG1sZGVjb2RlKHRleHQpOgogICAgIiIiCiAgICBEZWNvZGUgSFRNTCBlbnRpdGllcyBpbiB0aGUgZ2l2ZW4gdGV4dC4KCiAgICA+Pj4gaHRtbGRlY29kZSgKICAgIC4uLiAgICAgJ2h0dHBzOi8vLi4vcGFja2FnZV9uYW1lLTAuMS4yLnRhci5neicKICAgIC4uLiAgICAgJz90b2tlbmE9QSZhbXA7dG9rZW5iPUIiPnBhY2thZ2VfbmFtZS0wLjEuMi50YXIuZ3onKQogICAgJ2h0dHBzOi8vLi4vcGFja2FnZV9uYW1lLTAuMS4yLnRhci5nej90b2tlbmE9QSZ0b2tlbmI9QiI+cGFja2FnZV9uYW1lLTAuMS4yLnRhci5neicKICAgICIiIgogICAgcmV0dXJuIGVudGl0eV9zdWIoZGVjb2RlX2VudGl0eSwgdGV4dCkKCgpkZWYgc29ja2V0X3RpbWVvdXQodGltZW91dD0xNSk6CiAgICBkZWYgX3NvY2tldF90aW1lb3V0KGZ1bmMpOgogICAgICAgIGRlZiBfc29ja2V0X3RpbWVvdXQoKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAgICAgb2xkX3RpbWVvdXQgPSBzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKQogICAgICAgICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQodGltZW91dCkKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmMoKmFyZ3MsICoqa3dhcmdzKQogICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KG9sZF90aW1lb3V0KQoKICAgICAgICByZXR1cm4gX3NvY2tldF90aW1lb3V0CgogICAgcmV0dXJuIF9zb2NrZXRfdGltZW91dAoKCmRlZiBfZW5jb2RlX2F1dGgoYXV0aCk6CiAgICAiIiIKICAgIEEgZnVuY3Rpb24gY29tcGF0aWJsZSB3aXRoIFB5dGhvbiAyLjMtMy4zIHRoYXQgd2lsbCBlbmNvZGUKICAgIGF1dGggZnJvbSBhIFVSTCBzdWl0YWJsZSBmb3IgYW4gSFRUUCBoZWFkZXIuCiAgICA+Pj4gc3RyKF9lbmNvZGVfYXV0aCgndXNlcm5hbWUlM0FwYXNzd29yZCcpKQogICAgJ2RYTmxjbTVoYldVNmNHRnpjM2R2Y21RPScKCiAgICBMb25nIGF1dGggc3RyaW5ncyBzaG91bGQgbm90IGNhdXNlIGEgbmV3bGluZSB0byBiZSBpbnNlcnRlZC4KICAgID4+PiBsb25nX2F1dGggPSAndXNlcm5hbWU6JyArICdwYXNzd29yZCcqMTAKICAgID4+PiBjaHIoMTApIGluIHN0cihfZW5jb2RlX2F1dGgobG9uZ19hdXRoKSkKICAgIEZhbHNlCiAgICAiIiIKICAgIGF1dGhfcyA9IHVybGxpYi5wYXJzZS51bnF1b3RlKGF1dGgpCiAgICAjIGNvbnZlcnQgdG8gYnl0ZXMKICAgIGF1dGhfYnl0ZXMgPSBhdXRoX3MuZW5jb2RlKCkKICAgIGVuY29kZWRfYnl0ZXMgPSBiYXNlNjQuYjY0ZW5jb2RlKGF1dGhfYnl0ZXMpCiAgICAjIGNvbnZlcnQgYmFjayB0byBhIHN0cmluZwogICAgZW5jb2RlZCA9IGVuY29kZWRfYnl0ZXMuZGVjb2RlKCkKICAgICMgc3RyaXAgdGhlIHRyYWlsaW5nIGNhcnJpYWdlIHJldHVybgogICAgcmV0dXJuIGVuY29kZWQucmVwbGFjZSgnXG4nLCAnJykKCgpjbGFzcyBDcmVkZW50aWFsOgogICAgIiIiCiAgICBBIHVzZXJuYW1lL3Bhc3N3b3JkIHBhaXIuIFVzZSBsaWtlIGEgbmFtZWR0dXBsZS4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB1c2VybmFtZSwgcGFzc3dvcmQpOgogICAgICAgIHNlbGYudXNlcm5hbWUgPSB1c2VybmFtZQogICAgICAgIHNlbGYucGFzc3dvcmQgPSBwYXNzd29yZAoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICB5aWVsZCBzZWxmLnVzZXJuYW1lCiAgICAgICAgeWllbGQgc2VsZi5wYXNzd29yZAoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiAnJSh1c2VybmFtZSlzOiUocGFzc3dvcmQpcycgJSB2YXJzKHNlbGYpCgoKY2xhc3MgUHlQSUNvbmZpZyhjb25maWdwYXJzZXIuUmF3Q29uZmlnUGFyc2VyKToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBMb2FkIGZyb20gfi8ucHlwaXJjCiAgICAgICAgIiIiCiAgICAgICAgZGVmYXVsdHMgPSBkaWN0LmZyb21rZXlzKFsndXNlcm5hbWUnLCAncGFzc3dvcmQnLCAncmVwb3NpdG9yeSddLCAnJykKICAgICAgICBjb25maWdwYXJzZXIuUmF3Q29uZmlnUGFyc2VyLl9faW5pdF9fKHNlbGYsIGRlZmF1bHRzKQoKICAgICAgICByYyA9IG9zLnBhdGguam9pbihvcy5wYXRoLmV4cGFuZHVzZXIoJ34nKSwgJy5weXBpcmMnKQogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHJjKToKICAgICAgICAgICAgc2VsZi5yZWFkKHJjKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNyZWRzX2J5X3JlcG9zaXRvcnkoc2VsZik6CiAgICAgICAgc2VjdGlvbnNfd2l0aF9yZXBvc2l0b3JpZXMgPSBbCiAgICAgICAgICAgIHNlY3Rpb24gZm9yIHNlY3Rpb24gaW4gc2VsZi5zZWN0aW9ucygpCiAgICAgICAgICAgIGlmIHNlbGYuZ2V0KHNlY3Rpb24sICdyZXBvc2l0b3J5Jykuc3RyaXAoKQogICAgICAgIF0KCiAgICAgICAgcmV0dXJuIGRpY3QobWFwKHNlbGYuX2dldF9yZXBvX2NyZWQsIHNlY3Rpb25zX3dpdGhfcmVwb3NpdG9yaWVzKSkKCiAgICBkZWYgX2dldF9yZXBvX2NyZWQoc2VsZiwgc2VjdGlvbik6CiAgICAgICAgcmVwbyA9IHNlbGYuZ2V0KHNlY3Rpb24sICdyZXBvc2l0b3J5Jykuc3RyaXAoKQogICAgICAgIHJldHVybiByZXBvLCBDcmVkZW50aWFsKAogICAgICAgICAgICBzZWxmLmdldChzZWN0aW9uLCAndXNlcm5hbWUnKS5zdHJpcCgpLAogICAgICAgICAgICBzZWxmLmdldChzZWN0aW9uLCAncGFzc3dvcmQnKS5zdHJpcCgpLAogICAgICAgICkKCiAgICBkZWYgZmluZF9jcmVkZW50aWFsKHNlbGYsIHVybCk6CiAgICAgICAgIiIiCiAgICAgICAgSWYgdGhlIFVSTCBpbmRpY2F0ZWQgYXBwZWFycyB0byBiZSBhIHJlcG9zaXRvcnkgZGVmaW5lZCBpbiB0aGlzCiAgICAgICAgY29uZmlnLCByZXR1cm4gdGhlIGNyZWRlbnRpYWwgZm9yIHRoYXQgcmVwb3NpdG9yeS4KICAgICAgICAiIiIKICAgICAgICBmb3IgcmVwb3NpdG9yeSwgY3JlZCBpbiBzZWxmLmNyZWRzX2J5X3JlcG9zaXRvcnkuaXRlbXMoKToKICAgICAgICAgICAgaWYgdXJsLnN0YXJ0c3dpdGgocmVwb3NpdG9yeSk6CiAgICAgICAgICAgICAgICByZXR1cm4gY3JlZAoKCmRlZiBvcGVuX3dpdGhfYXV0aCh1cmwsIG9wZW5lcj11cmxsaWIucmVxdWVzdC51cmxvcGVuKToKICAgICIiIk9wZW4gYSB1cmxsaWIyIHJlcXVlc3QsIGhhbmRsaW5nIEhUVFAgYXV0aGVudGljYXRpb24iIiIKCiAgICBwYXJzZWQgPSB1cmxsaWIucGFyc2UudXJscGFyc2UodXJsKQogICAgc2NoZW1lLCBuZXRsb2MsIHBhdGgsIHBhcmFtcywgcXVlcnksIGZyYWcgPSBwYXJzZWQKCiAgICAjIERvdWJsZSBzY2hlbWUgZG9lcyBub3QgcmFpc2Ugb24gTWFjIE9TIFggYXMgcmV2ZWFsZWQgYnkgYQogICAgIyBmYWlsaW5nIHRlc3QuIFdlIHdvdWxkIGV4cGVjdCAibm9ubnVtZXJpYyBwb3J0Ii4gUmVmcyAjMjAuCiAgICBpZiBuZXRsb2MuZW5kc3dpdGgoJzonKToKICAgICAgICByYWlzZSBodHRwX2NsaWVudC5JbnZhbGlkVVJMKCJub25udW1lcmljIHBvcnQ6ICcnIikKCiAgICBpZiBzY2hlbWUgaW4gKCdodHRwJywgJ2h0dHBzJyk6CiAgICAgICAgYXV0aCwgYWRkcmVzcyA9IF9zcGxpdHVzZXIobmV0bG9jKQogICAgZWxzZToKICAgICAgICBhdXRoID0gTm9uZQoKICAgIGlmIG5vdCBhdXRoOgogICAgICAgIGNyZWQgPSBQeVBJQ29uZmlnKCkuZmluZF9jcmVkZW50aWFsKHVybCkKICAgICAgICBpZiBjcmVkOgogICAgICAgICAgICBhdXRoID0gc3RyKGNyZWQpCiAgICAgICAgICAgIGluZm8gPSBjcmVkLnVzZXJuYW1lLCB1cmwKICAgICAgICAgICAgbG9nLmluZm8oJ0F1dGhlbnRpY2F0aW5nIGFzICVzIGZvciAlcyAoZnJvbSAucHlwaXJjKScsICppbmZvKQoKICAgIGlmIGF1dGg6CiAgICAgICAgYXV0aCA9ICJCYXNpYyAiICsgX2VuY29kZV9hdXRoKGF1dGgpCiAgICAgICAgcGFydHMgPSBzY2hlbWUsIGFkZHJlc3MsIHBhdGgsIHBhcmFtcywgcXVlcnksIGZyYWcKICAgICAgICBuZXdfdXJsID0gdXJsbGliLnBhcnNlLnVybHVucGFyc2UocGFydHMpCiAgICAgICAgcmVxdWVzdCA9IHVybGxpYi5yZXF1ZXN0LlJlcXVlc3QobmV3X3VybCkKICAgICAgICByZXF1ZXN0LmFkZF9oZWFkZXIoIkF1dGhvcml6YXRpb24iLCBhdXRoKQogICAgZWxzZToKICAgICAgICByZXF1ZXN0ID0gdXJsbGliLnJlcXVlc3QuUmVxdWVzdCh1cmwpCgogICAgcmVxdWVzdC5hZGRfaGVhZGVyKCdVc2VyLUFnZW50JywgdXNlcl9hZ2VudCkKICAgIGZwID0gb3BlbmVyKHJlcXVlc3QpCgogICAgaWYgYXV0aDoKICAgICAgICAjIFB1dCBhdXRoZW50aWNhdGlvbiBpbmZvIGJhY2sgaW50byByZXF1ZXN0IFVSTCBpZiBzYW1lIGhvc3QsCiAgICAgICAgIyBzbyB0aGF0IGxpbmtzIGZvdW5kIG9uIHRoZSBwYWdlIHdpbGwgd29yawogICAgICAgIHMyLCBoMiwgcGF0aDIsIHBhcmFtMiwgcXVlcnkyLCBmcmFnMiA9IHVybGxpYi5wYXJzZS51cmxwYXJzZShmcC51cmwpCiAgICAgICAgaWYgczIgPT0gc2NoZW1lIGFuZCBoMiA9PSBhZGRyZXNzOgogICAgICAgICAgICBwYXJ0cyA9IHMyLCBuZXRsb2MsIHBhdGgyLCBwYXJhbTIsIHF1ZXJ5MiwgZnJhZzIKICAgICAgICAgICAgZnAudXJsID0gdXJsbGliLnBhcnNlLnVybHVucGFyc2UocGFydHMpCgogICAgcmV0dXJuIGZwCgoKIyBjb3B5IG9mIHVybGxpYi5wYXJzZS5fc3BsaXR1c2VyIGZyb20gUHl0aG9uIDMuOApkZWYgX3NwbGl0dXNlcihob3N0KToKICAgICIiInNwbGl0dXNlcigndXNlcls6cGFzc3dkXUBob3N0Wzpwb3J0XScpIC0tPiAndXNlcls6cGFzc3dkXScsICdob3N0Wzpwb3J0XScuIiIiCiAgICB1c2VyLCBkZWxpbSwgaG9zdCA9IGhvc3QucnBhcnRpdGlvbignQCcpCiAgICByZXR1cm4gKHVzZXIgaWYgZGVsaW0gZWxzZSBOb25lKSwgaG9zdAoKCiMgYWRkaW5nIGEgdGltZW91dCB0byBhdm9pZCBmcmVlemluZyBwYWNrYWdlX2luZGV4Cm9wZW5fd2l0aF9hdXRoID0gc29ja2V0X3RpbWVvdXQoX1NPQ0tFVF9USU1FT1VUKShvcGVuX3dpdGhfYXV0aCkKCgpkZWYgZml4X3NmX3VybCh1cmwpOgogICAgcmV0dXJuIHVybCAgIyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CgoKZGVmIGxvY2FsX29wZW4odXJsKToKICAgICIiIlJlYWQgYSBsb2NhbCBwYXRoLCB3aXRoIHNwZWNpYWwgc3VwcG9ydCBmb3IgZGlyZWN0b3JpZXMiIiIKICAgIHNjaGVtZSwgc2VydmVyLCBwYXRoLCBwYXJhbSwgcXVlcnksIGZyYWcgPSB1cmxsaWIucGFyc2UudXJscGFyc2UodXJsKQogICAgZmlsZW5hbWUgPSB1cmxsaWIucmVxdWVzdC51cmwycGF0aG5hbWUocGF0aCkKICAgIGlmIG9zLnBhdGguaXNmaWxlKGZpbGVuYW1lKToKICAgICAgICByZXR1cm4gdXJsbGliLnJlcXVlc3QudXJsb3Blbih1cmwpCiAgICBlbGlmIHBhdGguZW5kc3dpdGgoJy8nKSBhbmQgb3MucGF0aC5pc2RpcihmaWxlbmFtZSk6CiAgICAgICAgZmlsZXMgPSBbXQogICAgICAgIGZvciBmIGluIG9zLmxpc3RkaXIoZmlsZW5hbWUpOgogICAgICAgICAgICBmaWxlcGF0aCA9IG9zLnBhdGguam9pbihmaWxlbmFtZSwgZikKICAgICAgICAgICAgaWYgZiA9PSAnaW5kZXguaHRtbCc6CiAgICAgICAgICAgICAgICB3aXRoIG9wZW4oZmlsZXBhdGgsICdyJykgYXMgZnA6CiAgICAgICAgICAgICAgICAgICAgYm9keSA9IGZwLnJlYWQoKQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZWxpZiBvcy5wYXRoLmlzZGlyKGZpbGVwYXRoKToKICAgICAgICAgICAgICAgIGYgKz0gJy8nCiAgICAgICAgICAgIGZpbGVzLmFwcGVuZCgnPGEgaHJlZj0ie25hbWV9Ij57bmFtZX08L2E+Jy5mb3JtYXQobmFtZT1mKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICB0bXBsID0gKAogICAgICAgICAgICAgICAgIjxodG1sPjxoZWFkPjx0aXRsZT57dXJsfTwvdGl0bGU+IgogICAgICAgICAgICAgICAgIjwvaGVhZD48Ym9keT57ZmlsZXN9PC9ib2R5PjwvaHRtbD4iKQogICAgICAgICAgICBib2R5ID0gdG1wbC5mb3JtYXQodXJsPXVybCwgZmlsZXM9J1xuJy5qb2luKGZpbGVzKSkKICAgICAgICBzdGF0dXMsIG1lc3NhZ2UgPSAyMDAsICJPSyIKICAgIGVsc2U6CiAgICAgICAgc3RhdHVzLCBtZXNzYWdlLCBib2R5ID0gNDA0LCAiUGF0aCBub3QgZm91bmQiLCAiTm90IGZvdW5kIgoKICAgIGhlYWRlcnMgPSB7J2NvbnRlbnQtdHlwZSc6ICd0ZXh0L2h0bWwnfQogICAgYm9keV9zdHJlYW0gPSBzaXguU3RyaW5nSU8oYm9keSkKICAgIHJldHVybiB1cmxsaWIuZXJyb3IuSFRUUEVycm9yKHVybCwgc3RhdHVzLCBtZXNzYWdlLCBoZWFkZXJzLCBib2R5X3N0cmVhbSkKUEsDBBQAAAAAAAAAIQD+BUTU2AUAANgFAAA9AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvcHkyN2NvbXBhdC5weSIiIgpDb21wYXRpYmlsaXR5IFN1cHBvcnQgZm9yIFB5dGhvbiAyLjcgYW5kIGVhcmxpZXIKIiIiCgppbXBvcnQgc3lzCmltcG9ydCBwbGF0Zm9ybQoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybiBpbXBvcnQgc2l4CgoKZGVmIGdldF9hbGxfaGVhZGVycyhtZXNzYWdlLCBrZXkpOgogICAgIiIiCiAgICBHaXZlbiBhbiBIVFRQTWVzc2FnZSwgcmV0dXJuIGFsbCBoZWFkZXJzIG1hdGNoaW5nIGEgZ2l2ZW4ga2V5LgogICAgIiIiCiAgICByZXR1cm4gbWVzc2FnZS5nZXRfYWxsKGtleSkKCgppZiBzaXguUFkyOgogICAgZGVmIGdldF9hbGxfaGVhZGVycyhtZXNzYWdlLCBrZXkpOgogICAgICAgIHJldHVybiBtZXNzYWdlLmdldGhlYWRlcnMoa2V5KQoKCmxpbnV4X3B5Ml9hc2NpaSA9ICgKICAgIHBsYXRmb3JtLnN5c3RlbSgpID09ICdMaW51eCcgYW5kCiAgICBzaXguUFkyCikKCnJtdHJlZV9zYWZlID0gc3RyIGlmIGxpbnV4X3B5Ml9hc2NpaSBlbHNlIGxhbWJkYSB4OiB4CiIiIldvcmthcm91bmQgZm9yIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUyNDY3MiIiIgoKCnRyeToKICAgIGZyb20gLl9pbXAgaW1wb3J0IGZpbmRfbW9kdWxlLCBQWV9DT01QSUxFRCwgUFlfRlJPWkVOLCBQWV9TT1VSQ0UKICAgIGZyb20gLl9pbXAgaW1wb3J0IGdldF9mcm96ZW5fb2JqZWN0LCBnZXRfbW9kdWxlCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGltcG9ydCBpbXAKICAgIGZyb20gaW1wIGltcG9ydCBQWV9DT01QSUxFRCwgUFlfRlJPWkVOLCBQWV9TT1VSQ0UgICMgbm9xYQoKICAgIGRlZiBmaW5kX21vZHVsZShtb2R1bGUsIHBhdGhzPU5vbmUpOgogICAgICAgICIiIkp1c3QgbGlrZSAnaW1wLmZpbmRfbW9kdWxlKCknLCBidXQgd2l0aCBwYWNrYWdlIHN1cHBvcnQiIiIKICAgICAgICBwYXJ0cyA9IG1vZHVsZS5zcGxpdCgnLicpCiAgICAgICAgd2hpbGUgcGFydHM6CiAgICAgICAgICAgIHBhcnQgPSBwYXJ0cy5wb3AoMCkKICAgICAgICAgICAgZiwgcGF0aCwgKHN1ZmZpeCwgbW9kZSwga2luZCkgPSBpbmZvID0gaW1wLmZpbmRfbW9kdWxlKHBhcnQsIHBhdGhzKQoKICAgICAgICAgICAgaWYga2luZCA9PSBpbXAuUEtHX0RJUkVDVE9SWToKICAgICAgICAgICAgICAgIHBhcnRzID0gcGFydHMgb3IgWydfX2luaXRfXyddCiAgICAgICAgICAgICAgICBwYXRocyA9IFtwYXRoXQoKICAgICAgICAgICAgZWxpZiBwYXJ0czoKICAgICAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCJDYW4ndCBmaW5kICVyIGluICVzIiAlIChwYXJ0cywgbW9kdWxlKSkKCiAgICAgICAgcmV0dXJuIGluZm8KCiAgICBkZWYgZ2V0X2Zyb3plbl9vYmplY3QobW9kdWxlLCBwYXRocyk6CiAgICAgICAgcmV0dXJuIGltcC5nZXRfZnJvemVuX29iamVjdChtb2R1bGUpCgogICAgZGVmIGdldF9tb2R1bGUobW9kdWxlLCBwYXRocywgaW5mbyk6CiAgICAgICAgaW1wLmxvYWRfbW9kdWxlKG1vZHVsZSwgKmluZm8pCiAgICAgICAgcmV0dXJuIHN5cy5tb2R1bGVzW21vZHVsZV0KUEsDBBQAAAAAAAAAIQDeyzDiRgMAAEYDAAA9AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvcHkzMWNvbXBhdC5weV9fYWxsX18gPSBbXQoKX19tZXRhY2xhc3NfXyA9IHR5cGUKCgp0cnk6CiAgICAjIFB5dGhvbiA+PTMuMgogICAgZnJvbSB0ZW1wZmlsZSBpbXBvcnQgVGVtcG9yYXJ5RGlyZWN0b3J5CmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGltcG9ydCBzaHV0aWwKICAgIGltcG9ydCB0ZW1wZmlsZQoKICAgIGNsYXNzIFRlbXBvcmFyeURpcmVjdG9yeToKICAgICAgICAiIiIKICAgICAgICBWZXJ5IHNpbXBsZSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGNvbnRleHQgbWFuYWdlci4KICAgICAgICBXaWxsIHRyeSB0byBkZWxldGUgYWZ0ZXJ3YXJkLCBidXQgd2lsbCBhbHNvIGlnbm9yZSBPUyBhbmQgc2ltaWxhcgogICAgICAgIGVycm9ycyBvbiBkZWxldGlvbi4KICAgICAgICAiIiIKCiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsICoqa3dhcmdzKToKICAgICAgICAgICAgc2VsZi5uYW1lID0gTm9uZSAgIyBIYW5kbGUgbWtkdGVtcCByYWlzaW5nIGFuIGV4Y2VwdGlvbgogICAgICAgICAgICBzZWxmLm5hbWUgPSB0ZW1wZmlsZS5ta2R0ZW1wKCoqa3dhcmdzKQoKICAgICAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lCgogICAgICAgIGRlZiBfX2V4aXRfXyhzZWxmLCBleGN0eXBlLCBleGN2YWx1ZSwgZXhjdHJhY2UpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBzaHV0aWwucm10cmVlKHNlbGYubmFtZSwgVHJ1ZSkKICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6ICAjIHJlbW92YWwgZXJyb3JzIGFyZSBub3QgdGhlIG9ubHkgcG9zc2libGUKICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgc2VsZi5uYW1lID0gTm9uZQpQSwMEFAAAAAAAAAAhAAdh2KIyBQAAMgUAAD0AAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9weTMzY29tcGF0LnB5aW1wb3J0IGRpcwppbXBvcnQgYXJyYXkKaW1wb3J0IGNvbGxlY3Rpb25zCgp0cnk6CiAgICBpbXBvcnQgaHRtbApleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBodG1sID0gTm9uZQoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybiBpbXBvcnQgc2l4CmZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4Lm1vdmVzIGltcG9ydCBodG1sX3BhcnNlcgoKX19tZXRhY2xhc3NfXyA9IHR5cGUKCk9wQXJnID0gY29sbGVjdGlvbnMubmFtZWR0dXBsZSgnT3BBcmcnLCAnb3Bjb2RlIGFyZycpCgoKY2xhc3MgQnl0ZWNvZGVfY29tcGF0OgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvZGUpOgogICAgICAgIHNlbGYuY29kZSA9IGNvZGUKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgIiIiWWllbGQgJyhvcCxhcmcpJyBwYWlyIGZvciBlYWNoIG9wZXJhdGlvbiBpbiBjb2RlIG9iamVjdCAnY29kZSciIiIKCiAgICAgICAgYnl0ZXMgPSBhcnJheS5hcnJheSgnYicsIHNlbGYuY29kZS5jb19jb2RlKQogICAgICAgIGVvZiA9IGxlbihzZWxmLmNvZGUuY29fY29kZSkKCiAgICAgICAgcHRyID0gMAogICAgICAgIGV4dGVuZGVkX2FyZyA9IDAKCiAgICAgICAgd2hpbGUgcHRyIDwgZW9mOgoKICAgICAgICAgICAgb3AgPSBieXRlc1twdHJdCgogICAgICAgICAgICBpZiBvcCA+PSBkaXMuSEFWRV9BUkdVTUVOVDoKCiAgICAgICAgICAgICAgICBhcmcgPSBieXRlc1twdHIgKyAxXSArIGJ5dGVzW3B0ciArIDJdICogMjU2ICsgZXh0ZW5kZWRfYXJnCiAgICAgICAgICAgICAgICBwdHIgKz0gMwoKICAgICAgICAgICAgICAgIGlmIG9wID09IGRpcy5FWFRFTkRFRF9BUkc6CiAgICAgICAgICAgICAgICAgICAgbG9uZ190eXBlID0gc2l4LmludGVnZXJfdHlwZXNbLTFdCiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRfYXJnID0gYXJnICogbG9uZ190eXBlKDY1NTM2KQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgYXJnID0gTm9uZQogICAgICAgICAgICAgICAgcHRyICs9IDEKCiAgICAgICAgICAgIHlpZWxkIE9wQXJnKG9wLCBhcmcpCgoKQnl0ZWNvZGUgPSBnZXRhdHRyKGRpcywgJ0J5dGVjb2RlJywgQnl0ZWNvZGVfY29tcGF0KQoKCnVuZXNjYXBlID0gZ2V0YXR0cihodG1sLCAndW5lc2NhcGUnLCBOb25lKQppZiB1bmVzY2FwZSBpcyBOb25lOgogICAgIyBIVE1MUGFyc2VyLnVuZXNjYXBlIGlzIGRlcHJlY2F0ZWQgc2luY2UgUHl0aG9uIDMuNCwgYW5kIHdpbGwgYmUgcmVtb3ZlZAogICAgIyBmcm9tIDMuOS4KICAgIHVuZXNjYXBlID0gaHRtbF9wYXJzZXIuSFRNTFBhcnNlcigpLnVuZXNjYXBlClBLAwQUAAAAAAAAACEAjlbQRPUAAAD1AAAAPQAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL3B5MzRjb21wYXQucHlpbXBvcnQgaW1wb3J0bGliCgp0cnk6CiAgICBpbXBvcnQgaW1wb3J0bGliLnV0aWwKZXhjZXB0IEltcG9ydEVycm9yOgogICAgcGFzcwoKCnRyeToKICAgIG1vZHVsZV9mcm9tX3NwZWMgPSBpbXBvcnRsaWIudXRpbC5tb2R1bGVfZnJvbV9zcGVjCmV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgIGRlZiBtb2R1bGVfZnJvbV9zcGVjKHNwZWMpOgogICAgICAgIHJldHVybiBzcGVjLmxvYWRlci5sb2FkX21vZHVsZShzcGVjLm5hbWUpClBLAwQUAAAAAAAAACEAjFOaY8Q3AADENwAAOgAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL3NhbmRib3gucHlpbXBvcnQgb3MKaW1wb3J0IHN5cwppbXBvcnQgdGVtcGZpbGUKaW1wb3J0IG9wZXJhdG9yCmltcG9ydCBmdW5jdG9vbHMKaW1wb3J0IGl0ZXJ0b29scwppbXBvcnQgcmUKaW1wb3J0IGNvbnRleHRsaWIKaW1wb3J0IHBpY2tsZQppbXBvcnQgdGV4dHdyYXAKCmZyb20gc2V0dXB0b29scy5leHRlcm4gaW1wb3J0IHNpeApmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnNpeC5tb3ZlcyBpbXBvcnQgYnVpbHRpbnMsIG1hcAoKaW1wb3J0IHBrZ19yZXNvdXJjZXMucHkzMWNvbXBhdAoKaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2phdmEnKToKICAgIGltcG9ydCBvcmcucHl0aG9uLm1vZHVsZXMucG9zaXguUG9zaXhNb2R1bGUgYXMgX29zCmVsc2U6CiAgICBfb3MgPSBzeXMubW9kdWxlc1tvcy5uYW1lXQp0cnk6CiAgICBfZmlsZSA9IGZpbGUKZXhjZXB0IE5hbWVFcnJvcjoKICAgIF9maWxlID0gTm9uZQpfb3BlbiA9IG9wZW4KZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNFcnJvcgpmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0IHdvcmtpbmdfc2V0CgoKX19hbGxfXyA9IFsKICAgICJBYnN0cmFjdFNhbmRib3giLCAiRGlyZWN0b3J5U2FuZGJveCIsICJTYW5kYm94VmlvbGF0aW9uIiwgInJ1bl9zZXR1cCIsCl0KCgpkZWYgX2V4ZWNmaWxlKGZpbGVuYW1lLCBnbG9iYWxzLCBsb2NhbHM9Tm9uZSk6CiAgICAiIiIKICAgIFB5dGhvbiAzIGltcGxlbWVudGF0aW9uIG9mIGV4ZWNmaWxlLgogICAgIiIiCiAgICBtb2RlID0gJ3JiJwogICAgd2l0aCBvcGVuKGZpbGVuYW1lLCBtb2RlKSBhcyBzdHJlYW06CiAgICAgICAgc2NyaXB0ID0gc3RyZWFtLnJlYWQoKQogICAgaWYgbG9jYWxzIGlzIE5vbmU6CiAgICAgICAgbG9jYWxzID0gZ2xvYmFscwogICAgY29kZSA9IGNvbXBpbGUoc2NyaXB0LCBmaWxlbmFtZSwgJ2V4ZWMnKQogICAgZXhlYyhjb2RlLCBnbG9iYWxzLCBsb2NhbHMpCgoKQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKZGVmIHNhdmVfYXJndihyZXBsPU5vbmUpOgogICAgc2F2ZWQgPSBzeXMuYXJndls6XQogICAgaWYgcmVwbCBpcyBub3QgTm9uZToKICAgICAgICBzeXMuYXJndls6XSA9IHJlcGwKICAgIHRyeToKICAgICAgICB5aWVsZCBzYXZlZAogICAgZmluYWxseToKICAgICAgICBzeXMuYXJndls6XSA9IHNhdmVkCgoKQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKZGVmIHNhdmVfcGF0aCgpOgogICAgc2F2ZWQgPSBzeXMucGF0aFs6XQogICAgdHJ5OgogICAgICAgIHlpZWxkIHNhdmVkCiAgICBmaW5hbGx5OgogICAgICAgIHN5cy5wYXRoWzpdID0gc2F2ZWQKCgpAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgpkZWYgb3ZlcnJpZGVfdGVtcChyZXBsYWNlbWVudCk6CiAgICAiIiIKICAgIE1vbmtleS1wYXRjaCB0ZW1wZmlsZS50ZW1wZGlyIHdpdGggcmVwbGFjZW1lbnQsIGVuc3VyaW5nIGl0IGV4aXN0cwogICAgIiIiCiAgICBwa2dfcmVzb3VyY2VzLnB5MzFjb21wYXQubWFrZWRpcnMocmVwbGFjZW1lbnQsIGV4aXN0X29rPVRydWUpCgogICAgc2F2ZWQgPSB0ZW1wZmlsZS50ZW1wZGlyCgogICAgdGVtcGZpbGUudGVtcGRpciA9IHJlcGxhY2VtZW50CgogICAgdHJ5OgogICAgICAgIHlpZWxkCiAgICBmaW5hbGx5OgogICAgICAgIHRlbXBmaWxlLnRlbXBkaXIgPSBzYXZlZAoKCkBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCmRlZiBwdXNoZCh0YXJnZXQpOgogICAgc2F2ZWQgPSBvcy5nZXRjd2QoKQogICAgb3MuY2hkaXIodGFyZ2V0KQogICAgdHJ5OgogICAgICAgIHlpZWxkIHNhdmVkCiAgICBmaW5hbGx5OgogICAgICAgIG9zLmNoZGlyKHNhdmVkKQoKCmNsYXNzIFVucGlja2xlYWJsZUV4Y2VwdGlvbihFeGNlcHRpb24pOgogICAgIiIiCiAgICBBbiBleGNlcHRpb24gcmVwcmVzZW50aW5nIGFub3RoZXIgRXhjZXB0aW9uIHRoYXQgY291bGQgbm90IGJlIHBpY2tsZWQuCiAgICAiIiIKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgZHVtcCh0eXBlLCBleGMpOgogICAgICAgICIiIgogICAgICAgIEFsd2F5cyByZXR1cm4gYSBkdW1wZWQgKHBpY2tsZWQpIHR5cGUgYW5kIGV4Yy4gSWYgZXhjIGNhbid0IGJlIHBpY2tsZWQsCiAgICAgICAgd3JhcCBpdCBpbiBVbnBpY2tsZWFibGVFeGNlcHRpb24gZmlyc3QuCiAgICAgICAgIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gcGlja2xlLmR1bXBzKHR5cGUpLCBwaWNrbGUuZHVtcHMoZXhjKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICMgZ2V0IFVucGlja2xlYWJsZUV4Y2VwdGlvbiBpbnNpZGUgdGhlIHNhbmRib3gKICAgICAgICAgICAgZnJvbSBzZXR1cHRvb2xzLnNhbmRib3ggaW1wb3J0IFVucGlja2xlYWJsZUV4Y2VwdGlvbiBhcyBjbHMKICAgICAgICAgICAgcmV0dXJuIGNscy5kdW1wKGNscywgY2xzKHJlcHIoZXhjKSkpCgoKY2xhc3MgRXhjZXB0aW9uU2F2ZXI6CiAgICAiIiIKICAgIEEgQ29udGV4dCBNYW5hZ2VyIHRoYXQgd2lsbCBzYXZlIGFuIGV4Y2VwdGlvbiwgc2VyaWFsaXplZCwgYW5kIHJlc3RvcmUgaXQKICAgIGxhdGVyLgogICAgIiIiCgogICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBfX2V4aXRfXyhzZWxmLCB0eXBlLCBleGMsIHRiKToKICAgICAgICBpZiBub3QgZXhjOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgIyBkdW1wIHRoZSBleGNlcHRpb24KICAgICAgICBzZWxmLl9zYXZlZCA9IFVucGlja2xlYWJsZUV4Y2VwdGlvbi5kdW1wKHR5cGUsIGV4YykKICAgICAgICBzZWxmLl90YiA9IHRiCgogICAgICAgICMgc3VwcHJlc3MgdGhlIGV4Y2VwdGlvbgogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHJlc3VtZShzZWxmKToKICAgICAgICAicmVzdG9yZSBhbmQgcmUtcmFpc2UgYW55IGV4Y2VwdGlvbiIKCiAgICAgICAgaWYgJ19zYXZlZCcgbm90IGluIHZhcnMoc2VsZik6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICB0eXBlLCBleGMgPSBtYXAocGlja2xlLmxvYWRzLCBzZWxmLl9zYXZlZCkKICAgICAgICBzaXgucmVyYWlzZSh0eXBlLCBleGMsIHNlbGYuX3RiKQoKCkBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCmRlZiBzYXZlX21vZHVsZXMoKToKICAgICIiIgogICAgQ29udGV4dCBpbiB3aGljaCBpbXBvcnRlZCBtb2R1bGVzIGFyZSBzYXZlZC4KCiAgICBUcmFuc2xhdGVzIGV4Y2VwdGlvbnMgaW50ZXJuYWwgdG8gdGhlIGNvbnRleHQgaW50byB0aGUgZXF1aXZhbGVudCBleGNlcHRpb24KICAgIG91dHNpZGUgdGhlIGNvbnRleHQuCiAgICAiIiIKICAgIHNhdmVkID0gc3lzLm1vZHVsZXMuY29weSgpCiAgICB3aXRoIEV4Y2VwdGlvblNhdmVyKCkgYXMgc2F2ZWRfZXhjOgogICAgICAgIHlpZWxkIHNhdmVkCgogICAgc3lzLm1vZHVsZXMudXBkYXRlKHNhdmVkKQogICAgIyByZW1vdmUgYW55IG1vZHVsZXMgaW1wb3J0ZWQgc2luY2UKICAgIGRlbF9tb2R1bGVzID0gKAogICAgICAgIG1vZF9uYW1lIGZvciBtb2RfbmFtZSBpbiBzeXMubW9kdWxlcwogICAgICAgIGlmIG1vZF9uYW1lIG5vdCBpbiBzYXZlZAogICAgICAgICMgZXhjbHVkZSBhbnkgZW5jb2RpbmdzIG1vZHVsZXMuIFNlZSAjMjg1CiAgICAgICAgYW5kIG5vdCBtb2RfbmFtZS5zdGFydHN3aXRoKCdlbmNvZGluZ3MuJykKICAgICkKICAgIF9jbGVhcl9tb2R1bGVzKGRlbF9tb2R1bGVzKQoKICAgIHNhdmVkX2V4Yy5yZXN1bWUoKQoKCmRlZiBfY2xlYXJfbW9kdWxlcyhtb2R1bGVfbmFtZXMpOgogICAgZm9yIG1vZF9uYW1lIGluIGxpc3QobW9kdWxlX25hbWVzKToKICAgICAgICBkZWwgc3lzLm1vZHVsZXNbbW9kX25hbWVdCgoKQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKZGVmIHNhdmVfcGtnX3Jlc291cmNlc19zdGF0ZSgpOgogICAgc2F2ZWQgPSBwa2dfcmVzb3VyY2VzLl9fZ2V0c3RhdGVfXygpCiAgICB0cnk6CiAgICAgICAgeWllbGQgc2F2ZWQKICAgIGZpbmFsbHk6CiAgICAgICAgcGtnX3Jlc291cmNlcy5fX3NldHN0YXRlX18oc2F2ZWQpCgoKQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKZGVmIHNldHVwX2NvbnRleHQoc2V0dXBfZGlyKToKICAgIHRlbXBfZGlyID0gb3MucGF0aC5qb2luKHNldHVwX2RpciwgJ3RlbXAnKQogICAgd2l0aCBzYXZlX3BrZ19yZXNvdXJjZXNfc3RhdGUoKToKICAgICAgICB3aXRoIHNhdmVfbW9kdWxlcygpOgogICAgICAgICAgICBoaWRlX3NldHVwdG9vbHMoKQogICAgICAgICAgICB3aXRoIHNhdmVfcGF0aCgpOgogICAgICAgICAgICAgICAgd2l0aCBzYXZlX2FyZ3YoKToKICAgICAgICAgICAgICAgICAgICB3aXRoIG92ZXJyaWRlX3RlbXAodGVtcF9kaXIpOgogICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHB1c2hkKHNldHVwX2Rpcik6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGVuc3VyZSBzZXR1cHRvb2xzIGNvbW1hbmRzIGFyZSBhdmFpbGFibGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faW1wb3J0X18oJ3NldHVwdG9vbHMnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQKCgpkZWYgX25lZWRzX2hpZGluZyhtb2RfbmFtZSk6CiAgICAiIiIKICAgID4+PiBfbmVlZHNfaGlkaW5nKCdzZXR1cHRvb2xzJykKICAgIFRydWUKICAgID4+PiBfbmVlZHNfaGlkaW5nKCdwa2dfcmVzb3VyY2VzJykKICAgIFRydWUKICAgID4+PiBfbmVlZHNfaGlkaW5nKCdzZXR1cHRvb2xzX3BsdWdpbicpCiAgICBGYWxzZQogICAgPj4+IF9uZWVkc19oaWRpbmcoJ3NldHVwdG9vbHMuX19pbml0X18nKQogICAgVHJ1ZQogICAgPj4+IF9uZWVkc19oaWRpbmcoJ2Rpc3R1dGlscycpCiAgICBUcnVlCiAgICA+Pj4gX25lZWRzX2hpZGluZygnb3MnKQogICAgRmFsc2UKICAgID4+PiBfbmVlZHNfaGlkaW5nKCdDeXRob24nKQogICAgVHJ1ZQogICAgIiIiCiAgICBwYXR0ZXJuID0gcmUuY29tcGlsZShyJyhzZXR1cHRvb2xzfHBrZ19yZXNvdXJjZXN8ZGlzdHV0aWxzfEN5dGhvbikoXC58JCknKQogICAgcmV0dXJuIGJvb2wocGF0dGVybi5tYXRjaChtb2RfbmFtZSkpCgoKZGVmIGhpZGVfc2V0dXB0b29scygpOgogICAgIiIiCiAgICBSZW1vdmUgcmVmZXJlbmNlcyB0byBzZXR1cHRvb2xzJyBtb2R1bGVzIGZyb20gc3lzLm1vZHVsZXMgdG8gYWxsb3cgdGhlCiAgICBpbnZvY2F0aW9uIHRvIGltcG9ydCB0aGUgbW9zdCBhcHByb3ByaWF0ZSBzZXR1cHRvb2xzLiBUaGlzIHRlY2huaXF1ZSBpcwogICAgbmVjZXNzYXJ5IHRvIGF2b2lkIGlzc3VlcyBzdWNoIGFzICMzMTUgd2hlcmUgc2V0dXB0b29scyB1cGdyYWRpbmcgaXRzZWxmCiAgICB3b3VsZCBmYWlsIHRvIGZpbmQgYSBmdW5jdGlvbiBkZWNsYXJlZCBpbiB0aGUgbWV0YWRhdGEuCiAgICAiIiIKICAgIG1vZHVsZXMgPSBmaWx0ZXIoX25lZWRzX2hpZGluZywgc3lzLm1vZHVsZXMpCiAgICBfY2xlYXJfbW9kdWxlcyhtb2R1bGVzKQoKCmRlZiBydW5fc2V0dXAoc2V0dXBfc2NyaXB0LCBhcmdzKToKICAgICIiIlJ1biBhIGRpc3R1dGlscyBzZXR1cCBzY3JpcHQsIHNhbmRib3hlZCBpbiBpdHMgZGlyZWN0b3J5IiIiCiAgICBzZXR1cF9kaXIgPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5kaXJuYW1lKHNldHVwX3NjcmlwdCkpCiAgICB3aXRoIHNldHVwX2NvbnRleHQoc2V0dXBfZGlyKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHN5cy5hcmd2WzpdID0gW3NldHVwX3NjcmlwdF0gKyBsaXN0KGFyZ3MpCiAgICAgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBzZXR1cF9kaXIpCiAgICAgICAgICAgICMgcmVzZXQgdG8gaW5jbHVkZSBzZXR1cCBkaXIsIHcvY2xlYW4gY2FsbGJhY2sgbGlzdAogICAgICAgICAgICB3b3JraW5nX3NldC5fX2luaXRfXygpCiAgICAgICAgICAgIHdvcmtpbmdfc2V0LmNhbGxiYWNrcy5hcHBlbmQobGFtYmRhIGRpc3Q6IGRpc3QuYWN0aXZhdGUoKSkKCiAgICAgICAgICAgICMgX19maWxlX18gc2hvdWxkIGJlIGEgYnl0ZSBzdHJpbmcgb24gUHl0aG9uIDIgKCM3MTIpCiAgICAgICAgICAgIGR1bmRlcl9maWxlID0gKAogICAgICAgICAgICAgICAgc2V0dXBfc2NyaXB0CiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNldHVwX3NjcmlwdCwgc3RyKSBlbHNlCiAgICAgICAgICAgICAgICBzZXR1cF9zY3JpcHQuZW5jb2RlKHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKSkKICAgICAgICAgICAgKQoKICAgICAgICAgICAgd2l0aCBEaXJlY3RvcnlTYW5kYm94KHNldHVwX2Rpcik6CiAgICAgICAgICAgICAgICBucyA9IGRpY3QoX19maWxlX189ZHVuZGVyX2ZpbGUsIF9fbmFtZV9fPSdfX21haW5fXycpCiAgICAgICAgICAgICAgICBfZXhlY2ZpbGUoc2V0dXBfc2NyaXB0LCBucykKICAgICAgICBleGNlcHQgU3lzdGVtRXhpdCBhcyB2OgogICAgICAgICAgICBpZiB2LmFyZ3MgYW5kIHYuYXJnc1swXToKICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgICAgICMgTm9ybWFsIGV4aXQsIGp1c3QgcmV0dXJuCgoKY2xhc3MgQWJzdHJhY3RTYW5kYm94OgogICAgIiIiV3JhcCAnb3MnIG1vZHVsZSBhbmQgJ29wZW4oKScgYnVpbHRpbiBmb3IgdmlydHVhbGl6aW5nIHNldHVwIHNjcmlwdHMiIiIKCiAgICBfYWN0aXZlID0gRmFsc2UKCiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc2VsZi5fYXR0cnMgPSBbCiAgICAgICAgICAgIG5hbWUgZm9yIG5hbWUgaW4gZGlyKF9vcykKICAgICAgICAgICAgaWYgbm90IG5hbWUuc3RhcnRzd2l0aCgnXycpIGFuZCBoYXNhdHRyKHNlbGYsIG5hbWUpCiAgICAgICAgXQoKICAgIGRlZiBfY29weShzZWxmLCBzb3VyY2UpOgogICAgICAgIGZvciBuYW1lIGluIHNlbGYuX2F0dHJzOgogICAgICAgICAgICBzZXRhdHRyKG9zLCBuYW1lLCBnZXRhdHRyKHNvdXJjZSwgbmFtZSkpCgogICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKICAgICAgICBzZWxmLl9jb3B5KHNlbGYpCiAgICAgICAgaWYgX2ZpbGU6CiAgICAgICAgICAgIGJ1aWx0aW5zLmZpbGUgPSBzZWxmLl9maWxlCiAgICAgICAgYnVpbHRpbnMub3BlbiA9IHNlbGYuX29wZW4KICAgICAgICBzZWxmLl9hY3RpdmUgPSBUcnVlCgogICAgZGVmIF9fZXhpdF9fKHNlbGYsIGV4Y190eXBlLCBleGNfdmFsdWUsIHRyYWNlYmFjayk6CiAgICAgICAgc2VsZi5fYWN0aXZlID0gRmFsc2UKICAgICAgICBpZiBfZmlsZToKICAgICAgICAgICAgYnVpbHRpbnMuZmlsZSA9IF9maWxlCiAgICAgICAgYnVpbHRpbnMub3BlbiA9IF9vcGVuCiAgICAgICAgc2VsZi5fY29weShfb3MpCgogICAgZGVmIHJ1bihzZWxmLCBmdW5jKToKICAgICAgICAiIiJSdW4gJ2Z1bmMnIHVuZGVyIG9zIHNhbmRib3hpbmciIiIKICAgICAgICB3aXRoIHNlbGY6CiAgICAgICAgICAgIHJldHVybiBmdW5jKCkKCiAgICBkZWYgX21rX2R1YWxfcGF0aF93cmFwcGVyKG5hbWUpOgogICAgICAgIG9yaWdpbmFsID0gZ2V0YXR0cihfb3MsIG5hbWUpCgogICAgICAgIGRlZiB3cmFwKHNlbGYsIHNyYywgZHN0LCAqYXJncywgKiprdyk6CiAgICAgICAgICAgIGlmIHNlbGYuX2FjdGl2ZToKICAgICAgICAgICAgICAgIHNyYywgZHN0ID0gc2VsZi5fcmVtYXBfcGFpcihuYW1lLCBzcmMsIGRzdCwgKmFyZ3MsICoqa3cpCiAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbChzcmMsIGRzdCwgKmFyZ3MsICoqa3cpCgogICAgICAgIHJldHVybiB3cmFwCgogICAgZm9yIG5hbWUgaW4gWyJyZW5hbWUiLCAibGluayIsICJzeW1saW5rIl06CiAgICAgICAgaWYgaGFzYXR0cihfb3MsIG5hbWUpOgogICAgICAgICAgICBsb2NhbHMoKVtuYW1lXSA9IF9ta19kdWFsX3BhdGhfd3JhcHBlcihuYW1lKQoKICAgIGRlZiBfbWtfc2luZ2xlX3BhdGhfd3JhcHBlcihuYW1lLCBvcmlnaW5hbD1Ob25lKToKICAgICAgICBvcmlnaW5hbCA9IG9yaWdpbmFsIG9yIGdldGF0dHIoX29zLCBuYW1lKQoKICAgICAgICBkZWYgd3JhcChzZWxmLCBwYXRoLCAqYXJncywgKiprdyk6CiAgICAgICAgICAgIGlmIHNlbGYuX2FjdGl2ZToKICAgICAgICAgICAgICAgIHBhdGggPSBzZWxmLl9yZW1hcF9pbnB1dChuYW1lLCBwYXRoLCAqYXJncywgKiprdykKICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsKHBhdGgsICphcmdzLCAqKmt3KQoKICAgICAgICByZXR1cm4gd3JhcAoKICAgIGlmIF9maWxlOgogICAgICAgIF9maWxlID0gX21rX3NpbmdsZV9wYXRoX3dyYXBwZXIoJ2ZpbGUnLCBfZmlsZSkKICAgIF9vcGVuID0gX21rX3NpbmdsZV9wYXRoX3dyYXBwZXIoJ29wZW4nLCBfb3BlbikKICAgIGZvciBuYW1lIGluIFsKICAgICAgICAic3RhdCIsICJsaXN0ZGlyIiwgImNoZGlyIiwgIm9wZW4iLCAiY2htb2QiLCAiY2hvd24iLCAibWtkaXIiLAogICAgICAgICJyZW1vdmUiLCAidW5saW5rIiwgInJtZGlyIiwgInV0aW1lIiwgImxjaG93biIsICJjaHJvb3QiLCAibHN0YXQiLAogICAgICAgICJzdGFydGZpbGUiLCAibWtmaWZvIiwgIm1rbm9kIiwgInBhdGhjb25mIiwgImFjY2VzcyIKICAgIF06CiAgICAgICAgaWYgaGFzYXR0cihfb3MsIG5hbWUpOgogICAgICAgICAgICBsb2NhbHMoKVtuYW1lXSA9IF9ta19zaW5nbGVfcGF0aF93cmFwcGVyKG5hbWUpCgogICAgZGVmIF9ta19zaW5nbGVfd2l0aF9yZXR1cm4obmFtZSk6CiAgICAgICAgb3JpZ2luYWwgPSBnZXRhdHRyKF9vcywgbmFtZSkKCiAgICAgICAgZGVmIHdyYXAoc2VsZiwgcGF0aCwgKmFyZ3MsICoqa3cpOgogICAgICAgICAgICBpZiBzZWxmLl9hY3RpdmU6CiAgICAgICAgICAgICAgICBwYXRoID0gc2VsZi5fcmVtYXBfaW5wdXQobmFtZSwgcGF0aCwgKmFyZ3MsICoqa3cpCiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fcmVtYXBfb3V0cHV0KG5hbWUsIG9yaWdpbmFsKHBhdGgsICphcmdzLCAqKmt3KSkKICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsKHBhdGgsICphcmdzLCAqKmt3KQoKICAgICAgICByZXR1cm4gd3JhcAoKICAgIGZvciBuYW1lIGluIFsncmVhZGxpbmsnLCAndGVtcG5hbSddOgogICAgICAgIGlmIGhhc2F0dHIoX29zLCBuYW1lKToKICAgICAgICAgICAgbG9jYWxzKClbbmFtZV0gPSBfbWtfc2luZ2xlX3dpdGhfcmV0dXJuKG5hbWUpCgogICAgZGVmIF9ta19xdWVyeShuYW1lKToKICAgICAgICBvcmlnaW5hbCA9IGdldGF0dHIoX29zLCBuYW1lKQoKICAgICAgICBkZWYgd3JhcChzZWxmLCAqYXJncywgKiprdyk6CiAgICAgICAgICAgIHJldHZhbCA9IG9yaWdpbmFsKCphcmdzLCAqKmt3KQogICAgICAgICAgICBpZiBzZWxmLl9hY3RpdmU6CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fcmVtYXBfb3V0cHV0KG5hbWUsIHJldHZhbCkKICAgICAgICAgICAgcmV0dXJuIHJldHZhbAoKICAgICAgICByZXR1cm4gd3JhcAoKICAgIGZvciBuYW1lIGluIFsnZ2V0Y3dkJywgJ3RtcG5hbSddOgogICAgICAgIGlmIGhhc2F0dHIoX29zLCBuYW1lKToKICAgICAgICAgICAgbG9jYWxzKClbbmFtZV0gPSBfbWtfcXVlcnkobmFtZSkKCiAgICBkZWYgX3ZhbGlkYXRlX3BhdGgoc2VsZiwgcGF0aCk6CiAgICAgICAgIiIiQ2FsbGVkIHRvIHJlbWFwIG9yIHZhbGlkYXRlIGFueSBwYXRoLCB3aGV0aGVyIGlucHV0IG9yIG91dHB1dCIiIgogICAgICAgIHJldHVybiBwYXRoCgogICAgZGVmIF9yZW1hcF9pbnB1dChzZWxmLCBvcGVyYXRpb24sIHBhdGgsICphcmdzLCAqKmt3KToKICAgICAgICAiIiJDYWxsZWQgZm9yIHBhdGggaW5wdXRzIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuX3ZhbGlkYXRlX3BhdGgocGF0aCkKCiAgICBkZWYgX3JlbWFwX291dHB1dChzZWxmLCBvcGVyYXRpb24sIHBhdGgpOgogICAgICAgICIiIkNhbGxlZCBmb3IgcGF0aCBvdXRwdXRzIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuX3ZhbGlkYXRlX3BhdGgocGF0aCkKCiAgICBkZWYgX3JlbWFwX3BhaXIoc2VsZiwgb3BlcmF0aW9uLCBzcmMsIGRzdCwgKmFyZ3MsICoqa3cpOgogICAgICAgICIiIkNhbGxlZCBmb3IgcGF0aCBwYWlycyBsaWtlIHJlbmFtZSwgbGluaywgYW5kIHN5bWxpbmsgb3BlcmF0aW9ucyIiIgogICAgICAgIHJldHVybiAoCiAgICAgICAgICAgIHNlbGYuX3JlbWFwX2lucHV0KG9wZXJhdGlvbiArICctZnJvbScsIHNyYywgKmFyZ3MsICoqa3cpLAogICAgICAgICAgICBzZWxmLl9yZW1hcF9pbnB1dChvcGVyYXRpb24gKyAnLXRvJywgZHN0LCAqYXJncywgKiprdykKICAgICAgICApCgoKaWYgaGFzYXR0cihvcywgJ2Rldm51bGwnKToKICAgIF9FWENFUFRJT05TID0gW29zLmRldm51bGwsXQplbHNlOgogICAgX0VYQ0VQVElPTlMgPSBbXQoKCmNsYXNzIERpcmVjdG9yeVNhbmRib3goQWJzdHJhY3RTYW5kYm94KToKICAgICIiIlJlc3RyaWN0IG9wZXJhdGlvbnMgdG8gYSBzaW5nbGUgc3ViZGlyZWN0b3J5IC0gcHNldWRvLWNocm9vdCIiIgoKICAgIHdyaXRlX29wcyA9IGRpY3QuZnJvbWtleXMoWwogICAgICAgICJvcGVuIiwgImNobW9kIiwgImNob3duIiwgIm1rZGlyIiwgInJlbW92ZSIsICJ1bmxpbmsiLCAicm1kaXIiLAogICAgICAgICJ1dGltZSIsICJsY2hvd24iLCAiY2hyb290IiwgIm1rZmlmbyIsICJta25vZCIsICJ0ZW1wbmFtIiwKICAgIF0pCgogICAgX2V4Y2VwdGlvbl9wYXR0ZXJucyA9IFsKICAgICAgICAjIEFsbG93IGxpYjJ0bzMgdG8gYXR0ZW1wdCB0byBzYXZlIGEgcGlja2xlZCBncmFtbWFyIG9iamVjdCAoIzEyMSkKICAgICAgICByJy4qbGliMnRvMy4qXC5waWNrbGUkJywKICAgIF0KICAgICJleGVtcHQgd3JpdGluZyB0byBwYXRocyB0aGF0IG1hdGNoIHRoZSBwYXR0ZXJuIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzYW5kYm94LCBleGNlcHRpb25zPV9FWENFUFRJT05TKToKICAgICAgICBzZWxmLl9zYW5kYm94ID0gb3MucGF0aC5ub3JtY2FzZShvcy5wYXRoLnJlYWxwYXRoKHNhbmRib3gpKQogICAgICAgIHNlbGYuX3ByZWZpeCA9IG9zLnBhdGguam9pbihzZWxmLl9zYW5kYm94LCAnJykKICAgICAgICBzZWxmLl9leGNlcHRpb25zID0gWwogICAgICAgICAgICBvcy5wYXRoLm5vcm1jYXNlKG9zLnBhdGgucmVhbHBhdGgocGF0aCkpCiAgICAgICAgICAgIGZvciBwYXRoIGluIGV4Y2VwdGlvbnMKICAgICAgICBdCiAgICAgICAgQWJzdHJhY3RTYW5kYm94Ll9faW5pdF9fKHNlbGYpCgogICAgZGVmIF92aW9sYXRpb24oc2VsZiwgb3BlcmF0aW9uLCAqYXJncywgKiprdyk6CiAgICAgICAgZnJvbSBzZXR1cHRvb2xzLnNhbmRib3ggaW1wb3J0IFNhbmRib3hWaW9sYXRpb24KICAgICAgICByYWlzZSBTYW5kYm94VmlvbGF0aW9uKG9wZXJhdGlvbiwgYXJncywga3cpCgogICAgaWYgX2ZpbGU6CgogICAgICAgIGRlZiBfZmlsZShzZWxmLCBwYXRoLCBtb2RlPSdyJywgKmFyZ3MsICoqa3cpOgogICAgICAgICAgICBpZiBtb2RlIG5vdCBpbiAoJ3InLCAncnQnLCAncmInLCAnclUnLCAnVScpIGFuZCBub3Qgc2VsZi5fb2socGF0aCk6CiAgICAgICAgICAgICAgICBzZWxmLl92aW9sYXRpb24oImZpbGUiLCBwYXRoLCBtb2RlLCAqYXJncywgKiprdykKICAgICAgICAgICAgcmV0dXJuIF9maWxlKHBhdGgsIG1vZGUsICphcmdzLCAqKmt3KQoKICAgIGRlZiBfb3BlbihzZWxmLCBwYXRoLCBtb2RlPSdyJywgKmFyZ3MsICoqa3cpOgogICAgICAgIGlmIG1vZGUgbm90IGluICgncicsICdydCcsICdyYicsICdyVScsICdVJykgYW5kIG5vdCBzZWxmLl9vayhwYXRoKToKICAgICAgICAgICAgc2VsZi5fdmlvbGF0aW9uKCJvcGVuIiwgcGF0aCwgbW9kZSwgKmFyZ3MsICoqa3cpCiAgICAgICAgcmV0dXJuIF9vcGVuKHBhdGgsIG1vZGUsICphcmdzLCAqKmt3KQoKICAgIGRlZiB0bXBuYW0oc2VsZik6CiAgICAgICAgc2VsZi5fdmlvbGF0aW9uKCJ0bXBuYW0iKQoKICAgIGRlZiBfb2soc2VsZiwgcGF0aCk6CiAgICAgICAgYWN0aXZlID0gc2VsZi5fYWN0aXZlCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLl9hY3RpdmUgPSBGYWxzZQogICAgICAgICAgICByZWFscGF0aCA9IG9zLnBhdGgubm9ybWNhc2Uob3MucGF0aC5yZWFscGF0aChwYXRoKSkKICAgICAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgICAgIHNlbGYuX2V4ZW1wdGVkKHJlYWxwYXRoKQogICAgICAgICAgICAgICAgb3IgcmVhbHBhdGggPT0gc2VsZi5fc2FuZGJveAogICAgICAgICAgICAgICAgb3IgcmVhbHBhdGguc3RhcnRzd2l0aChzZWxmLl9wcmVmaXgpCiAgICAgICAgICAgICkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBzZWxmLl9hY3RpdmUgPSBhY3RpdmUKCiAgICBkZWYgX2V4ZW1wdGVkKHNlbGYsIGZpbGVwYXRoKToKICAgICAgICBzdGFydF9tYXRjaGVzID0gKAogICAgICAgICAgICBmaWxlcGF0aC5zdGFydHN3aXRoKGV4Y2VwdGlvbikKICAgICAgICAgICAgZm9yIGV4Y2VwdGlvbiBpbiBzZWxmLl9leGNlcHRpb25zCiAgICAgICAgKQogICAgICAgIHBhdHRlcm5fbWF0Y2hlcyA9ICgKICAgICAgICAgICAgcmUubWF0Y2gocGF0dGVybiwgZmlsZXBhdGgpCiAgICAgICAgICAgIGZvciBwYXR0ZXJuIGluIHNlbGYuX2V4Y2VwdGlvbl9wYXR0ZXJucwogICAgICAgICkKICAgICAgICBjYW5kaWRhdGVzID0gaXRlcnRvb2xzLmNoYWluKHN0YXJ0X21hdGNoZXMsIHBhdHRlcm5fbWF0Y2hlcykKICAgICAgICByZXR1cm4gYW55KGNhbmRpZGF0ZXMpCgogICAgZGVmIF9yZW1hcF9pbnB1dChzZWxmLCBvcGVyYXRpb24sIHBhdGgsICphcmdzLCAqKmt3KToKICAgICAgICAiIiJDYWxsZWQgZm9yIHBhdGggaW5wdXRzIiIiCiAgICAgICAgaWYgb3BlcmF0aW9uIGluIHNlbGYud3JpdGVfb3BzIGFuZCBub3Qgc2VsZi5fb2socGF0aCk6CiAgICAgICAgICAgIHNlbGYuX3Zpb2xhdGlvbihvcGVyYXRpb24sIG9zLnBhdGgucmVhbHBhdGgocGF0aCksICphcmdzLCAqKmt3KQogICAgICAgIHJldHVybiBwYXRoCgogICAgZGVmIF9yZW1hcF9wYWlyKHNlbGYsIG9wZXJhdGlvbiwgc3JjLCBkc3QsICphcmdzLCAqKmt3KToKICAgICAgICAiIiJDYWxsZWQgZm9yIHBhdGggcGFpcnMgbGlrZSByZW5hbWUsIGxpbmssIGFuZCBzeW1saW5rIG9wZXJhdGlvbnMiIiIKICAgICAgICBpZiBub3Qgc2VsZi5fb2soc3JjKSBvciBub3Qgc2VsZi5fb2soZHN0KToKICAgICAgICAgICAgc2VsZi5fdmlvbGF0aW9uKG9wZXJhdGlvbiwgc3JjLCBkc3QsICphcmdzLCAqKmt3KQogICAgICAgIHJldHVybiAoc3JjLCBkc3QpCgogICAgZGVmIG9wZW4oc2VsZiwgZmlsZSwgZmxhZ3MsIG1vZGU9MG83NzcsICphcmdzLCAqKmt3KToKICAgICAgICAiIiJDYWxsZWQgZm9yIGxvdy1sZXZlbCBvcy5vcGVuKCkiIiIKICAgICAgICBpZiBmbGFncyAmIFdSSVRFX0ZMQUdTIGFuZCBub3Qgc2VsZi5fb2soZmlsZSk6CiAgICAgICAgICAgIHNlbGYuX3Zpb2xhdGlvbigib3Mub3BlbiIsIGZpbGUsIGZsYWdzLCBtb2RlLCAqYXJncywgKiprdykKICAgICAgICByZXR1cm4gX29zLm9wZW4oZmlsZSwgZmxhZ3MsIG1vZGUsICphcmdzLCAqKmt3KQoKCldSSVRFX0ZMQUdTID0gZnVuY3Rvb2xzLnJlZHVjZSgKICAgIG9wZXJhdG9yLm9yXywgW2dldGF0dHIoX29zLCBhLCAwKSBmb3IgYSBpbgogICAgICAgICJPX1dST05MWSBPX1JEV1IgT19BUFBFTkQgT19DUkVBVCBPX1RSVU5DIE9fVEVNUE9SQVJZIi5zcGxpdCgpXQopCgoKY2xhc3MgU2FuZGJveFZpb2xhdGlvbihEaXN0dXRpbHNFcnJvcik6CiAgICAiIiJBIHNldHVwIHNjcmlwdCBhdHRlbXB0ZWQgdG8gbW9kaWZ5IHRoZSBmaWxlc3lzdGVtIG91dHNpZGUgdGhlIHNhbmRib3giIiIKCiAgICB0bXBsID0gdGV4dHdyYXAuZGVkZW50KCIiIgogICAgICAgIFNhbmRib3hWaW9sYXRpb246IHtjbWR9e2FyZ3Mhcn0ge2t3YXJnc30KCiAgICAgICAgVGhlIHBhY2thZ2Ugc2V0dXAgc2NyaXB0IGhhcyBhdHRlbXB0ZWQgdG8gbW9kaWZ5IGZpbGVzIG9uIHlvdXIgc3lzdGVtCiAgICAgICAgdGhhdCBhcmUgbm90IHdpdGhpbiB0aGUgRWFzeUluc3RhbGwgYnVpbGQgYXJlYSwgYW5kIGhhcyBiZWVuIGFib3J0ZWQuCgogICAgICAgIFRoaXMgcGFja2FnZSBjYW5ub3QgYmUgc2FmZWx5IGluc3RhbGxlZCBieSBFYXN5SW5zdGFsbCwgYW5kIG1heSBub3QKICAgICAgICBzdXBwb3J0IGFsdGVybmF0ZSBpbnN0YWxsYXRpb24gbG9jYXRpb25zIGV2ZW4gaWYgeW91IHJ1biBpdHMgc2V0dXAKICAgICAgICBzY3JpcHQgYnkgaGFuZC4gIFBsZWFzZSBpbmZvcm0gdGhlIHBhY2thZ2UncyBhdXRob3IgYW5kIHRoZSBFYXN5SW5zdGFsbAogICAgICAgIG1haW50YWluZXJzIHRvIGZpbmQgb3V0IGlmIGEgZml4IG9yIHdvcmthcm91bmQgaXMgYXZhaWxhYmxlLgogICAgICAgICIiIikubHN0cmlwKCkKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICBjbWQsIGFyZ3MsIGt3YXJncyA9IHNlbGYuYXJncwogICAgICAgIHJldHVybiBzZWxmLnRtcGwuZm9ybWF0KCoqbG9jYWxzKCkpClBLAwQUAAAAAAAAACEAqDO0vooAAACKAAAAOwAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL3NjcmlwdC50bXBsIyBFQVNZLUlOU1RBTEwtU0NSSVBUOiAlKHNwZWMpciwlKHNjcmlwdF9uYW1lKXIKX19yZXF1aXJlc19fID0gJShzcGVjKXIKX19pbXBvcnRfXygncGtnX3Jlc291cmNlcycpLnJ1bl9zY3JpcHQoJShzcGVjKXIsICUoc2NyaXB0X25hbWUpcikKUEsDBBQAAAAAAAAAIQCtKoM2/ggAAP4IAAA9AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvc2l0ZS1wYXRjaC5weWRlZiBfX2Jvb3QoKToKICAgIGltcG9ydCBzeXMKICAgIGltcG9ydCBvcwogICAgUFlUSE9OUEFUSCA9IG9zLmVudmlyb24uZ2V0KCdQWVRIT05QQVRIJykKICAgIGlmIFBZVEhPTlBBVEggaXMgTm9uZSBvciAoc3lzLnBsYXRmb3JtID09ICd3aW4zMicgYW5kIG5vdCBQWVRIT05QQVRIKToKICAgICAgICBQWVRIT05QQVRIID0gW10KICAgIGVsc2U6CiAgICAgICAgUFlUSE9OUEFUSCA9IFBZVEhPTlBBVEguc3BsaXQob3MucGF0aHNlcCkKCiAgICBwaWMgPSBnZXRhdHRyKHN5cywgJ3BhdGhfaW1wb3J0ZXJfY2FjaGUnLCB7fSkKICAgIHN0ZHBhdGggPSBzeXMucGF0aFtsZW4oUFlUSE9OUEFUSCk6XQogICAgbXlkaXIgPSBvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pCgogICAgZm9yIGl0ZW0gaW4gc3RkcGF0aDoKICAgICAgICBpZiBpdGVtID09IG15ZGlyIG9yIG5vdCBpdGVtOgogICAgICAgICAgICBjb250aW51ZSAgIyBza2lwIGlmIGN1cnJlbnQgZGlyLiBvbiBXaW5kb3dzLCBvciBteSBvd24gZGlyZWN0b3J5CiAgICAgICAgaW1wb3J0ZXIgPSBwaWMuZ2V0KGl0ZW0pCiAgICAgICAgaWYgaW1wb3J0ZXIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGxvYWRlciA9IGltcG9ydGVyLmZpbmRfbW9kdWxlKCdzaXRlJykKICAgICAgICAgICAgaWYgbG9hZGVyIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgIyBUaGlzIHNob3VsZCBhY3R1YWxseSByZWxvYWQgdGhlIGN1cnJlbnQgbW9kdWxlCiAgICAgICAgICAgICAgICBsb2FkZXIubG9hZF9tb2R1bGUoJ3NpdGUnKQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBlbHNlOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBpbXBvcnQgaW1wICAjIEF2b2lkIGltcG9ydCBsb29wIGluIFB5dGhvbiAzCiAgICAgICAgICAgICAgICBzdHJlYW0sIHBhdGgsIGRlc2NyID0gaW1wLmZpbmRfbW9kdWxlKCdzaXRlJywgW2l0ZW1dKQogICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBzdHJlYW0gaXMgTm9uZToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICMgVGhpcyBzaG91bGQgYWN0dWFsbHkgcmVsb2FkIHRoZSBjdXJyZW50IG1vZHVsZQogICAgICAgICAgICAgICAgaW1wLmxvYWRfbW9kdWxlKCdzaXRlJywgc3RyZWFtLCBwYXRoLCBkZXNjcikKICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgIHN0cmVhbS5jbG9zZSgpCiAgICAgICAgICAgIGJyZWFrCiAgICBlbHNlOgogICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCJDb3VsZG4ndCBmaW5kIHRoZSByZWFsICdzaXRlJyBtb2R1bGUiKQoKICAgIGtub3duX3BhdGhzID0gZGljdChbKG1ha2VwYXRoKGl0ZW0pWzFdLCAxKSBmb3IgaXRlbSBpbiBzeXMucGF0aF0pICAjIDIuMiBjb21wCgogICAgb2xkcG9zID0gZ2V0YXR0cihzeXMsICdfX2VnZ2luc2VydCcsIDApICAjIHNhdmUgb2xkIGluc2VydGlvbiBwb3NpdGlvbgogICAgc3lzLl9fZWdnaW5zZXJ0ID0gMCAgIyBhbmQgcmVzZXQgdGhlIGN1cnJlbnQgb25lCgogICAgZm9yIGl0ZW0gaW4gUFlUSE9OUEFUSDoKICAgICAgICBhZGRzaXRlZGlyKGl0ZW0pCgogICAgc3lzLl9fZWdnaW5zZXJ0ICs9IG9sZHBvcyAgIyByZXN0b3JlIGVmZmVjdGl2ZSBvbGQgcG9zaXRpb24KCiAgICBkLCBuZCA9IG1ha2VwYXRoKHN0ZHBhdGhbMF0pCiAgICBpbnNlcnRfYXQgPSBOb25lCiAgICBuZXdfcGF0aCA9IFtdCgogICAgZm9yIGl0ZW0gaW4gc3lzLnBhdGg6CiAgICAgICAgcCwgbnAgPSBtYWtlcGF0aChpdGVtKQoKICAgICAgICBpZiBucCA9PSBuZCBhbmQgaW5zZXJ0X2F0IGlzIE5vbmU6CiAgICAgICAgICAgICMgV2UndmUgaGl0IHRoZSBmaXJzdCAnc3lzdGVtJyBwYXRoIGVudHJ5LCBzbyBhZGRlZCBlbnRyaWVzIGdvIGhlcmUKICAgICAgICAgICAgaW5zZXJ0X2F0ID0gbGVuKG5ld19wYXRoKQoKICAgICAgICBpZiBucCBpbiBrbm93bl9wYXRocyBvciBpbnNlcnRfYXQgaXMgTm9uZToKICAgICAgICAgICAgbmV3X3BhdGguYXBwZW5kKGl0ZW0pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBuZXcgcGF0aCBhZnRlciB0aGUgaW5zZXJ0IHBvaW50LCBiYWNrLWluc2VydCBpdAogICAgICAgICAgICBuZXdfcGF0aC5pbnNlcnQoaW5zZXJ0X2F0LCBpdGVtKQogICAgICAgICAgICBpbnNlcnRfYXQgKz0gMQoKICAgIHN5cy5wYXRoWzpdID0gbmV3X3BhdGgKCgppZiBfX25hbWVfXyA9PSAnc2l0ZSc6CiAgICBfX2Jvb3QoKQogICAgZGVsIF9fYm9vdApQSwMEFAAAAAAAAAAhAM6VNI4tIQAALSEAAD4AAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9zc2xfc3VwcG9ydC5weWltcG9ydCBvcwppbXBvcnQgc29ja2V0CmltcG9ydCBhdGV4aXQKaW1wb3J0IHJlCmltcG9ydCBmdW5jdG9vbHMKCmZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4Lm1vdmVzIGltcG9ydCB1cmxsaWIsIGh0dHBfY2xpZW50LCBtYXAsIGZpbHRlcgoKZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCBSZXNvbHV0aW9uRXJyb3IsIEV4dHJhY3Rpb25FcnJvcgoKdHJ5OgogICAgaW1wb3J0IHNzbApleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBzc2wgPSBOb25lCgpfX2FsbF9fID0gWwogICAgJ1ZlcmlmeWluZ0hUVFBTSGFuZGxlcicsICdmaW5kX2NhX2J1bmRsZScsICdpc19hdmFpbGFibGUnLCAnY2VydF9wYXRocycsCiAgICAnb3BlbmVyX2ZvcicKXQoKY2VydF9wYXRocyA9ICIiIgovZXRjL3BraS90bHMvY2VydHMvY2EtYnVuZGxlLmNydAovZXRjL3NzbC9jZXJ0cy9jYS1jZXJ0aWZpY2F0ZXMuY3J0Ci91c3Ivc2hhcmUvc3NsL2NlcnRzL2NhLWJ1bmRsZS5jcnQKL3Vzci9sb2NhbC9zaGFyZS9jZXJ0cy9jYS1yb290LmNydAovZXRjL3NzbC9jZXJ0LnBlbQovU3lzdGVtL0xpYnJhcnkvT3BlblNTTC9jZXJ0cy9jZXJ0LnBlbQovdXNyL2xvY2FsL3NoYXJlL2NlcnRzL2NhLXJvb3QtbnNzLmNydAovZXRjL3NzbC9jYS1idW5kbGUucGVtCiIiIi5zdHJpcCgpLnNwbGl0KCkKCnRyeToKICAgIEhUVFBTSGFuZGxlciA9IHVybGxpYi5yZXF1ZXN0LkhUVFBTSGFuZGxlcgogICAgSFRUUFNDb25uZWN0aW9uID0gaHR0cF9jbGllbnQuSFRUUFNDb25uZWN0aW9uCmV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgIEhUVFBTSGFuZGxlciA9IEhUVFBTQ29ubmVjdGlvbiA9IG9iamVjdAoKaXNfYXZhaWxhYmxlID0gc3NsIGlzIG5vdCBOb25lIGFuZCBvYmplY3Qgbm90IGluIChIVFRQU0hhbmRsZXIsIEhUVFBTQ29ubmVjdGlvbikKCgp0cnk6CiAgICBmcm9tIHNzbCBpbXBvcnQgQ2VydGlmaWNhdGVFcnJvciwgbWF0Y2hfaG9zdG5hbWUKZXhjZXB0IEltcG9ydEVycm9yOgogICAgdHJ5OgogICAgICAgIGZyb20gYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZSBpbXBvcnQgQ2VydGlmaWNhdGVFcnJvcgogICAgICAgIGZyb20gYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZSBpbXBvcnQgbWF0Y2hfaG9zdG5hbWUKICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICBDZXJ0aWZpY2F0ZUVycm9yID0gTm9uZQogICAgICAgIG1hdGNoX2hvc3RuYW1lID0gTm9uZQoKaWYgbm90IENlcnRpZmljYXRlRXJyb3I6CgogICAgY2xhc3MgQ2VydGlmaWNhdGVFcnJvcihWYWx1ZUVycm9yKToKICAgICAgICBwYXNzCgoKaWYgbm90IG1hdGNoX2hvc3RuYW1lOgoKICAgIGRlZiBfZG5zbmFtZV9tYXRjaChkbiwgaG9zdG5hbWUsIG1heF93aWxkY2FyZHM9MSk6CiAgICAgICAgIiIiTWF0Y2hpbmcgYWNjb3JkaW5nIHRvIFJGQyA2MTI1LCBzZWN0aW9uIDYuNC4zCgogICAgICAgIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2MTI1I3NlY3Rpb24tNi40LjMKICAgICAgICAiIiIKICAgICAgICBwYXRzID0gW10KICAgICAgICBpZiBub3QgZG46CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAjIFBvcnRlZCBmcm9tIHB5dGhvbjMtc3ludGF4OgogICAgICAgICMgbGVmdG1vc3QsICpyZW1haW5kZXIgPSBkbi5zcGxpdChyJy4nKQogICAgICAgIHBhcnRzID0gZG4uc3BsaXQocicuJykKICAgICAgICBsZWZ0bW9zdCA9IHBhcnRzWzBdCiAgICAgICAgcmVtYWluZGVyID0gcGFydHNbMTpdCgogICAgICAgIHdpbGRjYXJkcyA9IGxlZnRtb3N0LmNvdW50KCcqJykKICAgICAgICBpZiB3aWxkY2FyZHMgPiBtYXhfd2lsZGNhcmRzOgogICAgICAgICAgICAjIElzc3VlICMxNzk4MDogYXZvaWQgZGVuaWFscyBvZiBzZXJ2aWNlIGJ5IHJlZnVzaW5nIG1vcmUKICAgICAgICAgICAgIyB0aGFuIG9uZSB3aWxkY2FyZCBwZXIgZnJhZ21lbnQuICBBIHN1cnZleSBvZiBlc3RhYmxpc2hlZAogICAgICAgICAgICAjIHBvbGljeSBhbW9uZyBTU0wgaW1wbGVtZW50YXRpb25zIHNob3dlZCBpdCB0byBiZSBhCiAgICAgICAgICAgICMgcmVhc29uYWJsZSBjaG9pY2UuCiAgICAgICAgICAgIHJhaXNlIENlcnRpZmljYXRlRXJyb3IoCiAgICAgICAgICAgICAgICAidG9vIG1hbnkgd2lsZGNhcmRzIGluIGNlcnRpZmljYXRlIEROUyBuYW1lOiAiICsgcmVwcihkbikpCgogICAgICAgICMgc3BlZWQgdXAgY29tbW9uIGNhc2Ugdy9vIHdpbGRjYXJkcwogICAgICAgIGlmIG5vdCB3aWxkY2FyZHM6CiAgICAgICAgICAgIHJldHVybiBkbi5sb3dlcigpID09IGhvc3RuYW1lLmxvd2VyKCkKCiAgICAgICAgIyBSRkMgNjEyNSwgc2VjdGlvbiA2LjQuMywgc3ViaXRlbSAxLgogICAgICAgICMgVGhlIGNsaWVudCBTSE9VTEQgTk9UIGF0dGVtcHQgdG8gbWF0Y2ggYSBwcmVzZW50ZWQgaWRlbnRpZmllciBpbiB3aGljaAogICAgICAgICMgdGhlIHdpbGRjYXJkIGNoYXJhY3RlciBjb21wcmlzZXMgYSBsYWJlbCBvdGhlciB0aGFuIHRoZSBsZWZ0LW1vc3QgbGFiZWwuCiAgICAgICAgaWYgbGVmdG1vc3QgPT0gJyonOgogICAgICAgICAgICAjIFdoZW4gJyonIGlzIGEgZnJhZ21lbnQgYnkgaXRzZWxmLCBpdCBtYXRjaGVzIGEgbm9uLWVtcHR5IGRvdGxlc3MKICAgICAgICAgICAgIyBmcmFnbWVudC4KICAgICAgICAgICAgcGF0cy5hcHBlbmQoJ1teLl0rJykKICAgICAgICBlbGlmIGxlZnRtb3N0LnN0YXJ0c3dpdGgoJ3huLS0nKSBvciBob3N0bmFtZS5zdGFydHN3aXRoKCd4bi0tJyk6CiAgICAgICAgICAgICMgUkZDIDYxMjUsIHNlY3Rpb24gNi40LjMsIHN1Yml0ZW0gMy4KICAgICAgICAgICAgIyBUaGUgY2xpZW50IFNIT1VMRCBOT1QgYXR0ZW1wdCB0byBtYXRjaCBhIHByZXNlbnRlZCBpZGVudGlmaWVyCiAgICAgICAgICAgICMgd2hlcmUgdGhlIHdpbGRjYXJkIGNoYXJhY3RlciBpcyBlbWJlZGRlZCB3aXRoaW4gYW4gQS1sYWJlbCBvcgogICAgICAgICAgICAjIFUtbGFiZWwgb2YgYW4gaW50ZXJuYXRpb25hbGl6ZWQgZG9tYWluIG5hbWUuCiAgICAgICAgICAgIHBhdHMuYXBwZW5kKHJlLmVzY2FwZShsZWZ0bW9zdCkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBPdGhlcndpc2UsICcqJyBtYXRjaGVzIGFueSBkb3RsZXNzIHN0cmluZywgZS5nLiB3d3cqCiAgICAgICAgICAgIHBhdHMuYXBwZW5kKHJlLmVzY2FwZShsZWZ0bW9zdCkucmVwbGFjZShyJ1wqJywgJ1teLl0qJykpCgogICAgICAgICMgYWRkIHRoZSByZW1haW5pbmcgZnJhZ21lbnRzLCBpZ25vcmUgYW55IHdpbGRjYXJkcwogICAgICAgIGZvciBmcmFnIGluIHJlbWFpbmRlcjoKICAgICAgICAgICAgcGF0cy5hcHBlbmQocmUuZXNjYXBlKGZyYWcpKQoKICAgICAgICBwYXQgPSByZS5jb21waWxlKHInXEEnICsgcidcLicuam9pbihwYXRzKSArIHInXFonLCByZS5JR05PUkVDQVNFKQogICAgICAgIHJldHVybiBwYXQubWF0Y2goaG9zdG5hbWUpCgogICAgZGVmIG1hdGNoX2hvc3RuYW1lKGNlcnQsIGhvc3RuYW1lKToKICAgICAgICAiIiJWZXJpZnkgdGhhdCAqY2VydCogKGluIGRlY29kZWQgZm9ybWF0IGFzIHJldHVybmVkIGJ5CiAgICAgICAgU1NMU29ja2V0LmdldHBlZXJjZXJ0KCkpIG1hdGNoZXMgdGhlICpob3N0bmFtZSouICBSRkMgMjgxOCBhbmQgUkZDIDYxMjUKICAgICAgICBydWxlcyBhcmUgZm9sbG93ZWQsIGJ1dCBJUCBhZGRyZXNzZXMgYXJlIG5vdCBhY2NlcHRlZCBmb3IgKmhvc3RuYW1lKi4KCiAgICAgICAgQ2VydGlmaWNhdGVFcnJvciBpcyByYWlzZWQgb24gZmFpbHVyZS4gT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uCiAgICAgICAgcmV0dXJucyBub3RoaW5nLgogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBjZXJ0OgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJlbXB0eSBvciBubyBjZXJ0aWZpY2F0ZSIpCiAgICAgICAgZG5zbmFtZXMgPSBbXQogICAgICAgIHNhbiA9IGNlcnQuZ2V0KCdzdWJqZWN0QWx0TmFtZScsICgpKQogICAgICAgIGZvciBrZXksIHZhbHVlIGluIHNhbjoKICAgICAgICAgICAgaWYga2V5ID09ICdETlMnOgogICAgICAgICAgICAgICAgaWYgX2Ruc25hbWVfbWF0Y2godmFsdWUsIGhvc3RuYW1lKToKICAgICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICAgIGRuc25hbWVzLmFwcGVuZCh2YWx1ZSkKICAgICAgICBpZiBub3QgZG5zbmFtZXM6CiAgICAgICAgICAgICMgVGhlIHN1YmplY3QgaXMgb25seSBjaGVja2VkIHdoZW4gdGhlcmUgaXMgbm8gZE5TTmFtZSBlbnRyeQogICAgICAgICAgICAjIGluIHN1YmplY3RBbHROYW1lCiAgICAgICAgICAgIGZvciBzdWIgaW4gY2VydC5nZXQoJ3N1YmplY3QnLCAoKSk6CiAgICAgICAgICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzdWI6CiAgICAgICAgICAgICAgICAgICAgIyBYWFggYWNjb3JkaW5nIHRvIFJGQyAyODE4LCB0aGUgbW9zdCBzcGVjaWZpYyBDb21tb24gTmFtZQogICAgICAgICAgICAgICAgICAgICMgbXVzdCBiZSB1c2VkLgogICAgICAgICAgICAgICAgICAgIGlmIGtleSA9PSAnY29tbW9uTmFtZSc6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIF9kbnNuYW1lX21hdGNoKHZhbHVlLCBob3N0bmFtZSk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICAgICAgICAgICAgZG5zbmFtZXMuYXBwZW5kKHZhbHVlKQogICAgICAgIGlmIGxlbihkbnNuYW1lcykgPiAxOgogICAgICAgICAgICByYWlzZSBDZXJ0aWZpY2F0ZUVycm9yKCJob3N0bmFtZSAlciAiCiAgICAgICAgICAgICAgICAiZG9lc24ndCBtYXRjaCBlaXRoZXIgb2YgJXMiCiAgICAgICAgICAgICAgICAlIChob3N0bmFtZSwgJywgJy5qb2luKG1hcChyZXByLCBkbnNuYW1lcykpKSkKICAgICAgICBlbGlmIGxlbihkbnNuYW1lcykgPT0gMToKICAgICAgICAgICAgcmFpc2UgQ2VydGlmaWNhdGVFcnJvcigiaG9zdG5hbWUgJXIgIgogICAgICAgICAgICAgICAgImRvZXNuJ3QgbWF0Y2ggJXIiCiAgICAgICAgICAgICAgICAlIChob3N0bmFtZSwgZG5zbmFtZXNbMF0pKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIENlcnRpZmljYXRlRXJyb3IoIm5vIGFwcHJvcHJpYXRlIGNvbW1vbk5hbWUgb3IgIgogICAgICAgICAgICAgICAgInN1YmplY3RBbHROYW1lIGZpZWxkcyB3ZXJlIGZvdW5kIikKCgpjbGFzcyBWZXJpZnlpbmdIVFRQU0hhbmRsZXIoSFRUUFNIYW5kbGVyKToKICAgICIiIlNpbXBsZSB2ZXJpZnlpbmcgaGFuZGxlcjogbm8gYXV0aCwgc3ViY2xhc3NlcywgdGltZW91dHMsIGV0Yy4iIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgY2FfYnVuZGxlKToKICAgICAgICBzZWxmLmNhX2J1bmRsZSA9IGNhX2J1bmRsZQogICAgICAgIEhUVFBTSGFuZGxlci5fX2luaXRfXyhzZWxmKQoKICAgIGRlZiBodHRwc19vcGVuKHNlbGYsIHJlcSk6CiAgICAgICAgcmV0dXJuIHNlbGYuZG9fb3BlbigKICAgICAgICAgICAgbGFtYmRhIGhvc3QsICoqa3c6IFZlcmlmeWluZ0hUVFBTQ29ubihob3N0LCBzZWxmLmNhX2J1bmRsZSwgKiprdyksIHJlcQogICAgICAgICkKCgpjbGFzcyBWZXJpZnlpbmdIVFRQU0Nvbm4oSFRUUFNDb25uZWN0aW9uKToKICAgICIiIlNpbXBsZSB2ZXJpZnlpbmcgY29ubmVjdGlvbjogbm8gYXV0aCwgc3ViY2xhc3NlcywgdGltZW91dHMsIGV0Yy4iIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgaG9zdCwgY2FfYnVuZGxlLCAqKmt3KToKICAgICAgICBIVFRQU0Nvbm5lY3Rpb24uX19pbml0X18oc2VsZiwgaG9zdCwgKiprdykKICAgICAgICBzZWxmLmNhX2J1bmRsZSA9IGNhX2J1bmRsZQoKICAgIGRlZiBjb25uZWN0KHNlbGYpOgogICAgICAgIHNvY2sgPSBzb2NrZXQuY3JlYXRlX2Nvbm5lY3Rpb24oCiAgICAgICAgICAgIChzZWxmLmhvc3QsIHNlbGYucG9ydCksIGdldGF0dHIoc2VsZiwgJ3NvdXJjZV9hZGRyZXNzJywgTm9uZSkKICAgICAgICApCgogICAgICAgICMgSGFuZGxlIHRoZSBzb2NrZXQgaWYgYSAocHJveHkpIHR1bm5lbCBpcyBwcmVzZW50CiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCAnX3R1bm5lbCcpIGFuZCBnZXRhdHRyKHNlbGYsICdfdHVubmVsX2hvc3QnLCBOb25lKToKICAgICAgICAgICAgc2VsZi5zb2NrID0gc29jawogICAgICAgICAgICBzZWxmLl90dW5uZWwoKQogICAgICAgICAgICAjIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWU3Nzc2OiBQeXRob24+PTMuNC4xIGFuZCA+PTIuNy43CiAgICAgICAgICAgICMgY2hhbmdlIHNlbGYuaG9zdCB0byBtZWFuIHRoZSBwcm94eSBzZXJ2ZXIgaG9zdCB3aGVuIHR1bm5lbGluZyBpcwogICAgICAgICAgICAjIGJlaW5nIHVzZWQuIEFkYXB0LCBzaW5jZSB3ZSBhcmUgaW50ZXJlc3RlZCBpbiB0aGUgZGVzdGluYXRpb24KICAgICAgICAgICAgIyBob3N0IGZvciB0aGUgbWF0Y2hfaG9zdG5hbWUoKSBjb21wYXJpc29uLgogICAgICAgICAgICBhY3R1YWxfaG9zdCA9IHNlbGYuX3R1bm5lbF9ob3N0CiAgICAgICAgZWxzZToKICAgICAgICAgICAgYWN0dWFsX2hvc3QgPSBzZWxmLmhvc3QKCiAgICAgICAgaWYgaGFzYXR0cihzc2wsICdjcmVhdGVfZGVmYXVsdF9jb250ZXh0Jyk6CiAgICAgICAgICAgIGN0eCA9IHNzbC5jcmVhdGVfZGVmYXVsdF9jb250ZXh0KGNhZmlsZT1zZWxmLmNhX2J1bmRsZSkKICAgICAgICAgICAgc2VsZi5zb2NrID0gY3R4LndyYXBfc29ja2V0KHNvY2ssIHNlcnZlcl9ob3N0bmFtZT1hY3R1YWxfaG9zdCkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIFRoaXMgaXMgZm9yIHB5dGhvbiA8IDIuNy45IGFuZCA8IDMuND8KICAgICAgICAgICAgc2VsZi5zb2NrID0gc3NsLndyYXBfc29ja2V0KAogICAgICAgICAgICAgICAgc29jaywgY2VydF9yZXFzPXNzbC5DRVJUX1JFUVVJUkVELCBjYV9jZXJ0cz1zZWxmLmNhX2J1bmRsZQogICAgICAgICAgICApCiAgICAgICAgdHJ5OgogICAgICAgICAgICBtYXRjaF9ob3N0bmFtZShzZWxmLnNvY2suZ2V0cGVlcmNlcnQoKSwgYWN0dWFsX2hvc3QpCiAgICAgICAgZXhjZXB0IENlcnRpZmljYXRlRXJyb3I6CiAgICAgICAgICAgIHNlbGYuc29jay5zaHV0ZG93bihzb2NrZXQuU0hVVF9SRFdSKQogICAgICAgICAgICBzZWxmLnNvY2suY2xvc2UoKQogICAgICAgICAgICByYWlzZQoKCmRlZiBvcGVuZXJfZm9yKGNhX2J1bmRsZT1Ob25lKToKICAgICIiIkdldCBhIHVybG9wZW4oKSByZXBsYWNlbWVudCB0aGF0IHVzZXMgY2FfYnVuZGxlIGZvciB2ZXJpZmljYXRpb24iIiIKICAgIHJldHVybiB1cmxsaWIucmVxdWVzdC5idWlsZF9vcGVuZXIoCiAgICAgICAgVmVyaWZ5aW5nSFRUUFNIYW5kbGVyKGNhX2J1bmRsZSBvciBmaW5kX2NhX2J1bmRsZSgpKQogICAgKS5vcGVuCgoKIyBmcm9tIGphcmFjby5mdW5jdG9vbHMKZGVmIG9uY2UoZnVuYyk6CiAgICBAZnVuY3Rvb2xzLndyYXBzKGZ1bmMpCiAgICBkZWYgd3JhcHBlcigqYXJncywgKiprd2FyZ3MpOgogICAgICAgIGlmIG5vdCBoYXNhdHRyKGZ1bmMsICdhbHdheXNfcmV0dXJucycpOgogICAgICAgICAgICBmdW5jLmFsd2F5c19yZXR1cm5zID0gZnVuYygqYXJncywgKiprd2FyZ3MpCiAgICAgICAgcmV0dXJuIGZ1bmMuYWx3YXlzX3JldHVybnMKICAgIHJldHVybiB3cmFwcGVyCgoKQG9uY2UKZGVmIGdldF93aW5fY2VydGZpbGUoKToKICAgIHRyeToKICAgICAgICBpbXBvcnQgd2luY2VydHN0b3JlCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBjbGFzcyBDZXJ0RmlsZSh3aW5jZXJ0c3RvcmUuQ2VydEZpbGUpOgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAgICAgc3VwZXIoQ2VydEZpbGUsIHNlbGYpLl9faW5pdF9fKCkKICAgICAgICAgICAgYXRleGl0LnJlZ2lzdGVyKHNlbGYuY2xvc2UpCgogICAgICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgc3VwZXIoQ2VydEZpbGUsIHNlbGYpLmNsb3NlKCkKICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAgICAgICAgICBwYXNzCgogICAgX3dpbmNlcnRzID0gQ2VydEZpbGUoKQogICAgX3dpbmNlcnRzLmFkZHN0b3JlKCdDQScpCiAgICBfd2luY2VydHMuYWRkc3RvcmUoJ1JPT1QnKQogICAgcmV0dXJuIF93aW5jZXJ0cy5uYW1lCgoKZGVmIGZpbmRfY2FfYnVuZGxlKCk6CiAgICAiIiJSZXR1cm4gYW4gZXhpc3RpbmcgQ0EgYnVuZGxlIHBhdGgsIG9yIE5vbmUiIiIKICAgIGV4dGFudF9jZXJ0X3BhdGhzID0gZmlsdGVyKG9zLnBhdGguaXNmaWxlLCBjZXJ0X3BhdGhzKQogICAgcmV0dXJuICgKICAgICAgICBnZXRfd2luX2NlcnRmaWxlKCkKICAgICAgICBvciBuZXh0KGV4dGFudF9jZXJ0X3BhdGhzLCBOb25lKQogICAgICAgIG9yIF9jZXJ0aWZpX3doZXJlKCkKICAgICkKCgpkZWYgX2NlcnRpZmlfd2hlcmUoKToKICAgIHRyeToKICAgICAgICByZXR1cm4gX19pbXBvcnRfXygnY2VydGlmaScpLndoZXJlKCkKICAgIGV4Y2VwdCAoSW1wb3J0RXJyb3IsIFJlc29sdXRpb25FcnJvciwgRXh0cmFjdGlvbkVycm9yKToKICAgICAgICBwYXNzClBLAwQUAAAAAAAAACEAmkLXmuQDAADkAwAAQAAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL3VuaWNvZGVfdXRpbHMucHlpbXBvcnQgdW5pY29kZWRhdGEKaW1wb3J0IHN5cwoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybiBpbXBvcnQgc2l4CgoKIyBIRlMgUGx1cyB1c2VzIGRlY29tcG9zZWQgVVRGLTgKZGVmIGRlY29tcG9zZShwYXRoKToKICAgIGlmIGlzaW5zdGFuY2UocGF0aCwgc2l4LnRleHRfdHlwZSk6CiAgICAgICAgcmV0dXJuIHVuaWNvZGVkYXRhLm5vcm1hbGl6ZSgnTkZEJywgcGF0aCkKICAgIHRyeToKICAgICAgICBwYXRoID0gcGF0aC5kZWNvZGUoJ3V0Zi04JykKICAgICAgICBwYXRoID0gdW5pY29kZWRhdGEubm9ybWFsaXplKCdORkQnLCBwYXRoKQogICAgICAgIHBhdGggPSBwYXRoLmVuY29kZSgndXRmLTgnKQogICAgZXhjZXB0IFVuaWNvZGVFcnJvcjoKICAgICAgICBwYXNzICAjIE5vdCBVVEYtOAogICAgcmV0dXJuIHBhdGgKCgpkZWYgZmlsZXN5c19kZWNvZGUocGF0aCk6CiAgICAiIiIKICAgIEVuc3VyZSB0aGF0IHRoZSBnaXZlbiBwYXRoIGlzIGRlY29kZWQsCiAgICBOT05FIHdoZW4gbm8gZXhwZWN0ZWQgZW5jb2Rpbmcgd29ya3MKICAgICIiIgoKICAgIGlmIGlzaW5zdGFuY2UocGF0aCwgc2l4LnRleHRfdHlwZSk6CiAgICAgICAgcmV0dXJuIHBhdGgKCiAgICBmc19lbmMgPSBzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCkgb3IgJ3V0Zi04JwogICAgY2FuZGlkYXRlcyA9IGZzX2VuYywgJ3V0Zi04JwoKICAgIGZvciBlbmMgaW4gY2FuZGlkYXRlczoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBwYXRoLmRlY29kZShlbmMpCiAgICAgICAgZXhjZXB0IFVuaWNvZGVEZWNvZGVFcnJvcjoKICAgICAgICAgICAgY29udGludWUKCgpkZWYgdHJ5X2VuY29kZShzdHJpbmcsIGVuYyk6CiAgICAidHVybiB1bmljb2RlIGVuY29kaW5nIGludG8gYSBmdW5jdGlvbmFsIHJvdXRpbmUiCiAgICB0cnk6CiAgICAgICAgcmV0dXJuIHN0cmluZy5lbmNvZGUoZW5jKQogICAgZXhjZXB0IFVuaWNvZGVFbmNvZGVFcnJvcjoKICAgICAgICByZXR1cm4gTm9uZQpQSwMEFAAAAAAAAAAhAEixTGKQAAAAkAAAADoAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy92ZXJzaW9uLnB5aW1wb3J0IHBrZ19yZXNvdXJjZXMKCnRyeToKICAgIF9fdmVyc2lvbl9fID0gcGtnX3Jlc291cmNlcy5nZXRfZGlzdHJpYnV0aW9uKCdzZXR1cHRvb2xzJykudmVyc2lvbgpleGNlcHQgRXhjZXB0aW9uOgogICAgX192ZXJzaW9uX18gPSAndW5rbm93bicKUEsDBBQAAAAAAAAAIQCwxUWAByEAAAchAAA4AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvd2hlZWwucHkiIiJXaGVlbHMgc3VwcG9ydC4iIiIKCmZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGdldF9wbGF0Zm9ybQpmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCmltcG9ydCBlbWFpbAppbXBvcnQgaXRlcnRvb2xzCmltcG9ydCBvcwppbXBvcnQgcG9zaXhwYXRoCmltcG9ydCByZQppbXBvcnQgemlwZmlsZQoKaW1wb3J0IHBrZ19yZXNvdXJjZXMKaW1wb3J0IHNldHVwdG9vbHMKZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCBwYXJzZV92ZXJzaW9uCmZyb20gc2V0dXB0b29scy5leHRlcm4ucGFja2FnaW5nLnRhZ3MgaW1wb3J0IHN5c190YWdzCmZyb20gc2V0dXB0b29scy5leHRlcm4ucGFja2FnaW5nLnV0aWxzIGltcG9ydCBjYW5vbmljYWxpemVfbmFtZQpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnNpeCBpbXBvcnQgUFkzCmZyb20gc2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvIGltcG9ydCB3cml0ZV9yZXF1aXJlbWVudHMKCgpfX21ldGFjbGFzc19fID0gdHlwZQoKCldIRUVMX05BTUUgPSByZS5jb21waWxlKAogICAgciIiIl4oP1A8cHJvamVjdF9uYW1lPi4rPyktKD9QPHZlcnNpb24+XGQuKj8pCiAgICAoKC0oP1A8YnVpbGQ+XGQuKj8pKT8tKD9QPHB5X3ZlcnNpb24+Lis/KS0oP1A8YWJpPi4rPyktKD9QPHBsYXRmb3JtPi4rPykKICAgIClcLndobCQiIiIsCiAgICByZS5WRVJCT1NFKS5tYXRjaAoKTkFNRVNQQUNFX1BBQ0tBR0VfSU5JVCA9ICcnJ1wKdHJ5OgogICAgX19pbXBvcnRfXygncGtnX3Jlc291cmNlcycpLmRlY2xhcmVfbmFtZXNwYWNlKF9fbmFtZV9fKQpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBfX3BhdGhfXyA9IF9faW1wb3J0X18oJ3BrZ3V0aWwnKS5leHRlbmRfcGF0aChfX3BhdGhfXywgX19uYW1lX18pCicnJwoKCmRlZiB1bnBhY2soc3JjX2RpciwgZHN0X2Rpcik6CiAgICAnJydNb3ZlIGV2ZXJ5dGhpbmcgdW5kZXIgYHNyY19kaXJgIHRvIGBkc3RfZGlyYCwgYW5kIGRlbGV0ZSB0aGUgZm9ybWVyLicnJwogICAgZm9yIGRpcnBhdGgsIGRpcm5hbWVzLCBmaWxlbmFtZXMgaW4gb3Mud2FsayhzcmNfZGlyKToKICAgICAgICBzdWJkaXIgPSBvcy5wYXRoLnJlbHBhdGgoZGlycGF0aCwgc3JjX2RpcikKICAgICAgICBmb3IgZiBpbiBmaWxlbmFtZXM6CiAgICAgICAgICAgIHNyYyA9IG9zLnBhdGguam9pbihkaXJwYXRoLCBmKQogICAgICAgICAgICBkc3QgPSBvcy5wYXRoLmpvaW4oZHN0X2Rpciwgc3ViZGlyLCBmKQogICAgICAgICAgICBvcy5yZW5hbWVzKHNyYywgZHN0KQogICAgICAgIGZvciBuLCBkIGluIHJldmVyc2VkKGxpc3QoZW51bWVyYXRlKGRpcm5hbWVzKSkpOgogICAgICAgICAgICBzcmMgPSBvcy5wYXRoLmpvaW4oZGlycGF0aCwgZCkKICAgICAgICAgICAgZHN0ID0gb3MucGF0aC5qb2luKGRzdF9kaXIsIHN1YmRpciwgZCkKICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGRzdCk6CiAgICAgICAgICAgICAgICAjIERpcmVjdG9yeSBkb2VzIG5vdCBleGlzdCBpbiBkZXN0aW5hdGlvbiwKICAgICAgICAgICAgICAgICMgcmVuYW1lIGl0IGFuZCBwcnVuZSBpdCBmcm9tIG9zLndhbGsgbGlzdC4KICAgICAgICAgICAgICAgIG9zLnJlbmFtZXMoc3JjLCBkc3QpCiAgICAgICAgICAgICAgICBkZWwgZGlybmFtZXNbbl0KICAgICMgQ2xlYW51cC4KICAgIGZvciBkaXJwYXRoLCBkaXJuYW1lcywgZmlsZW5hbWVzIGluIG9zLndhbGsoc3JjX2RpciwgdG9wZG93bj1UcnVlKToKICAgICAgICBhc3NlcnQgbm90IGZpbGVuYW1lcwogICAgICAgIG9zLnJtZGlyKGRpcnBhdGgpCgoKY2xhc3MgV2hlZWw6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVuYW1lKToKICAgICAgICBtYXRjaCA9IFdIRUVMX05BTUUob3MucGF0aC5iYXNlbmFtZShmaWxlbmFtZSkpCiAgICAgICAgaWYgbWF0Y2ggaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignaW52YWxpZCB3aGVlbCBuYW1lOiAlcicgJSBmaWxlbmFtZSkKICAgICAgICBzZWxmLmZpbGVuYW1lID0gZmlsZW5hbWUKICAgICAgICBmb3IgaywgdiBpbiBtYXRjaC5ncm91cGRpY3QoKS5pdGVtcygpOgogICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGssIHYpCgogICAgZGVmIHRhZ3Moc2VsZik6CiAgICAgICAgJycnTGlzdCB0YWdzIChweV92ZXJzaW9uLCBhYmksIHBsYXRmb3JtKSBzdXBwb3J0ZWQgYnkgdGhpcyB3aGVlbC4nJycKICAgICAgICByZXR1cm4gaXRlcnRvb2xzLnByb2R1Y3QoCiAgICAgICAgICAgIHNlbGYucHlfdmVyc2lvbi5zcGxpdCgnLicpLAogICAgICAgICAgICBzZWxmLmFiaS5zcGxpdCgnLicpLAogICAgICAgICAgICBzZWxmLnBsYXRmb3JtLnNwbGl0KCcuJyksCiAgICAgICAgKQoKICAgIGRlZiBpc19jb21wYXRpYmxlKHNlbGYpOgogICAgICAgICcnJ0lzIHRoZSB3aGVlbCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIGN1cnJlbnQgcGxhdGZvcm0/JycnCiAgICAgICAgc3VwcG9ydGVkX3RhZ3MgPSBzZXQoKHQuaW50ZXJwcmV0ZXIsIHQuYWJpLCB0LnBsYXRmb3JtKSBmb3IgdCBpbiBzeXNfdGFncygpKQogICAgICAgIHJldHVybiBuZXh0KChUcnVlIGZvciB0IGluIHNlbGYudGFncygpIGlmIHQgaW4gc3VwcG9ydGVkX3RhZ3MpLCBGYWxzZSkKCiAgICBkZWYgZWdnX25hbWUoc2VsZik6CiAgICAgICAgcmV0dXJuIHBrZ19yZXNvdXJjZXMuRGlzdHJpYnV0aW9uKAogICAgICAgICAgICBwcm9qZWN0X25hbWU9c2VsZi5wcm9qZWN0X25hbWUsIHZlcnNpb249c2VsZi52ZXJzaW9uLAogICAgICAgICAgICBwbGF0Zm9ybT0oTm9uZSBpZiBzZWxmLnBsYXRmb3JtID09ICdhbnknIGVsc2UgZ2V0X3BsYXRmb3JtKCkpLAogICAgICAgICkuZWdnX25hbWUoKSArICcuZWdnJwoKICAgIGRlZiBnZXRfZGlzdF9pbmZvKHNlbGYsIHpmKToKICAgICAgICAjIGZpbmQgdGhlIGNvcnJlY3QgbmFtZSBvZiB0aGUgLmRpc3QtaW5mbyBkaXIgaW4gdGhlIHdoZWVsIGZpbGUKICAgICAgICBmb3IgbWVtYmVyIGluIHpmLm5hbWVsaXN0KCk6CiAgICAgICAgICAgIGRpcm5hbWUgPSBwb3NpeHBhdGguZGlybmFtZShtZW1iZXIpCiAgICAgICAgICAgIGlmIChkaXJuYW1lLmVuZHN3aXRoKCcuZGlzdC1pbmZvJykgYW5kCiAgICAgICAgICAgICAgICAgICAgY2Fub25pY2FsaXplX25hbWUoZGlybmFtZSkuc3RhcnRzd2l0aCgKICAgICAgICAgICAgICAgICAgICAgICAgY2Fub25pY2FsaXplX25hbWUoc2VsZi5wcm9qZWN0X25hbWUpKSk6CiAgICAgICAgICAgICAgICByZXR1cm4gZGlybmFtZQogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInVuc3VwcG9ydGVkIHdoZWVsIGZvcm1hdC4gLmRpc3QtaW5mbyBub3QgZm91bmQiKQoKICAgIGRlZiBpbnN0YWxsX2FzX2VnZyhzZWxmLCBkZXN0aW5hdGlvbl9lZ2dkaXIpOgogICAgICAgICcnJ0luc3RhbGwgd2hlZWwgYXMgYW4gZWdnIGRpcmVjdG9yeS4nJycKICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShzZWxmLmZpbGVuYW1lKSBhcyB6ZjoKICAgICAgICAgICAgc2VsZi5faW5zdGFsbF9hc19lZ2coZGVzdGluYXRpb25fZWdnZGlyLCB6ZikKCiAgICBkZWYgX2luc3RhbGxfYXNfZWdnKHNlbGYsIGRlc3RpbmF0aW9uX2VnZ2RpciwgemYpOgogICAgICAgIGRpc3RfYmFzZW5hbWUgPSAnJXMtJXMnICUgKHNlbGYucHJvamVjdF9uYW1lLCBzZWxmLnZlcnNpb24pCiAgICAgICAgZGlzdF9pbmZvID0gc2VsZi5nZXRfZGlzdF9pbmZvKHpmKQogICAgICAgIGRpc3RfZGF0YSA9ICclcy5kYXRhJyAlIGRpc3RfYmFzZW5hbWUKICAgICAgICBlZ2dfaW5mbyA9IG9zLnBhdGguam9pbihkZXN0aW5hdGlvbl9lZ2dkaXIsICdFR0ctSU5GTycpCgogICAgICAgIHNlbGYuX2NvbnZlcnRfbWV0YWRhdGEoemYsIGRlc3RpbmF0aW9uX2VnZ2RpciwgZGlzdF9pbmZvLCBlZ2dfaW5mbykKICAgICAgICBzZWxmLl9tb3ZlX2RhdGFfZW50cmllcyhkZXN0aW5hdGlvbl9lZ2dkaXIsIGRpc3RfZGF0YSkKICAgICAgICBzZWxmLl9maXhfbmFtZXNwYWNlX3BhY2thZ2VzKGVnZ19pbmZvLCBkZXN0aW5hdGlvbl9lZ2dkaXIpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9jb252ZXJ0X21ldGFkYXRhKHpmLCBkZXN0aW5hdGlvbl9lZ2dkaXIsIGRpc3RfaW5mbywgZWdnX2luZm8pOgogICAgICAgIGRlZiBnZXRfbWV0YWRhdGEobmFtZSk6CiAgICAgICAgICAgIHdpdGggemYub3Blbihwb3NpeHBhdGguam9pbihkaXN0X2luZm8sIG5hbWUpKSBhcyBmcDoKICAgICAgICAgICAgICAgIHZhbHVlID0gZnAucmVhZCgpLmRlY29kZSgndXRmLTgnKSBpZiBQWTMgZWxzZSBmcC5yZWFkKCkKICAgICAgICAgICAgICAgIHJldHVybiBlbWFpbC5wYXJzZXIuUGFyc2VyKCkucGFyc2VzdHIodmFsdWUpCgogICAgICAgIHdoZWVsX21ldGFkYXRhID0gZ2V0X21ldGFkYXRhKCdXSEVFTCcpCiAgICAgICAgIyBDaGVjayB3aGVlbCBmb3JtYXQgdmVyc2lvbiBpcyBzdXBwb3J0ZWQuCiAgICAgICAgd2hlZWxfdmVyc2lvbiA9IHBhcnNlX3ZlcnNpb24od2hlZWxfbWV0YWRhdGEuZ2V0KCdXaGVlbC1WZXJzaW9uJykpCiAgICAgICAgd2hlZWxfdjEgPSAoCiAgICAgICAgICAgIHBhcnNlX3ZlcnNpb24oJzEuMCcpIDw9IHdoZWVsX3ZlcnNpb24gPCBwYXJzZV92ZXJzaW9uKCcyLjBkZXYwJykKICAgICAgICApCiAgICAgICAgaWYgbm90IHdoZWVsX3YxOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAogICAgICAgICAgICAgICAgJ3Vuc3VwcG9ydGVkIHdoZWVsIGZvcm1hdCB2ZXJzaW9uOiAlcycgJSB3aGVlbF92ZXJzaW9uKQogICAgICAgICMgRXh0cmFjdCB0byB0YXJnZXQgZGlyZWN0b3J5LgogICAgICAgIG9zLm1rZGlyKGRlc3RpbmF0aW9uX2VnZ2RpcikKICAgICAgICB6Zi5leHRyYWN0YWxsKGRlc3RpbmF0aW9uX2VnZ2RpcikKICAgICAgICAjIENvbnZlcnQgbWV0YWRhdGEuCiAgICAgICAgZGlzdF9pbmZvID0gb3MucGF0aC5qb2luKGRlc3RpbmF0aW9uX2VnZ2RpciwgZGlzdF9pbmZvKQogICAgICAgIGRpc3QgPSBwa2dfcmVzb3VyY2VzLkRpc3RyaWJ1dGlvbi5mcm9tX2xvY2F0aW9uKAogICAgICAgICAgICBkZXN0aW5hdGlvbl9lZ2dkaXIsIGRpc3RfaW5mbywKICAgICAgICAgICAgbWV0YWRhdGE9cGtnX3Jlc291cmNlcy5QYXRoTWV0YWRhdGEoZGVzdGluYXRpb25fZWdnZGlyLCBkaXN0X2luZm8pLAogICAgICAgICkKCiAgICAgICAgIyBOb3RlOiBFdmFsdWF0ZSBhbmQgc3RyaXAgbWFya2VycyBub3csCiAgICAgICAgIyBhcyBpdCdzIGRpZmZpY3VsdCB0byBjb252ZXJ0IGJhY2sgZnJvbSB0aGUgc3ludGF4OgogICAgICAgICMgZm9vYmFyOyAibGludXgiIGluIHN5c19wbGF0Zm9ybSBhbmQgZXh0cmEgPT0gJ3Rlc3QnCiAgICAgICAgZGVmIHJhd19yZXEocmVxKToKICAgICAgICAgICAgcmVxLm1hcmtlciA9IE5vbmUKICAgICAgICAgICAgcmV0dXJuIHN0cihyZXEpCiAgICAgICAgaW5zdGFsbF9yZXF1aXJlcyA9IGxpc3Qoc29ydGVkKG1hcChyYXdfcmVxLCBkaXN0LnJlcXVpcmVzKCkpKSkKICAgICAgICBleHRyYXNfcmVxdWlyZSA9IHsKICAgICAgICAgICAgZXh0cmE6IHNvcnRlZCgKICAgICAgICAgICAgICAgIHJlcQogICAgICAgICAgICAgICAgZm9yIHJlcSBpbiBtYXAocmF3X3JlcSwgZGlzdC5yZXF1aXJlcygoZXh0cmEsKSkpCiAgICAgICAgICAgICAgICBpZiByZXEgbm90IGluIGluc3RhbGxfcmVxdWlyZXMKICAgICAgICAgICAgKQogICAgICAgICAgICBmb3IgZXh0cmEgaW4gZGlzdC5leHRyYXMKICAgICAgICB9CiAgICAgICAgb3MucmVuYW1lKGRpc3RfaW5mbywgZWdnX2luZm8pCiAgICAgICAgb3MucmVuYW1lKAogICAgICAgICAgICBvcy5wYXRoLmpvaW4oZWdnX2luZm8sICdNRVRBREFUQScpLAogICAgICAgICAgICBvcy5wYXRoLmpvaW4oZWdnX2luZm8sICdQS0ctSU5GTycpLAogICAgICAgICkKICAgICAgICBzZXR1cF9kaXN0ID0gc2V0dXB0b29scy5EaXN0cmlidXRpb24oCiAgICAgICAgICAgIGF0dHJzPWRpY3QoCiAgICAgICAgICAgICAgICBpbnN0YWxsX3JlcXVpcmVzPWluc3RhbGxfcmVxdWlyZXMsCiAgICAgICAgICAgICAgICBleHRyYXNfcmVxdWlyZT1leHRyYXNfcmVxdWlyZSwKICAgICAgICAgICAgKSwKICAgICAgICApCiAgICAgICAgIyBUZW1wb3JhcmlseSBkaXNhYmxlIGluZm8gdHJhY2VzLgogICAgICAgIGxvZ190aHJlc2hvbGQgPSBsb2cuX2dsb2JhbF9sb2cudGhyZXNob2xkCiAgICAgICAgbG9nLnNldF90aHJlc2hvbGQobG9nLldBUk4pCiAgICAgICAgdHJ5OgogICAgICAgICAgICB3cml0ZV9yZXF1aXJlbWVudHMoCiAgICAgICAgICAgICAgICBzZXR1cF9kaXN0LmdldF9jb21tYW5kX29iaignZWdnX2luZm8nKSwKICAgICAgICAgICAgICAgIE5vbmUsCiAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oZWdnX2luZm8sICdyZXF1aXJlcy50eHQnKSwKICAgICAgICAgICAgKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGxvZy5zZXRfdGhyZXNob2xkKGxvZ190aHJlc2hvbGQpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9tb3ZlX2RhdGFfZW50cmllcyhkZXN0aW5hdGlvbl9lZ2dkaXIsIGRpc3RfZGF0YSk6CiAgICAgICAgIiIiTW92ZSBkYXRhIGVudHJpZXMgdG8gdGhlaXIgY29ycmVjdCBsb2NhdGlvbi4iIiIKICAgICAgICBkaXN0X2RhdGEgPSBvcy5wYXRoLmpvaW4oZGVzdGluYXRpb25fZWdnZGlyLCBkaXN0X2RhdGEpCiAgICAgICAgZGlzdF9kYXRhX3NjcmlwdHMgPSBvcy5wYXRoLmpvaW4oZGlzdF9kYXRhLCAnc2NyaXB0cycpCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZGlzdF9kYXRhX3NjcmlwdHMpOgogICAgICAgICAgICBlZ2dfaW5mb19zY3JpcHRzID0gb3MucGF0aC5qb2luKAogICAgICAgICAgICAgICAgZGVzdGluYXRpb25fZWdnZGlyLCAnRUdHLUlORk8nLCAnc2NyaXB0cycpCiAgICAgICAgICAgIG9zLm1rZGlyKGVnZ19pbmZvX3NjcmlwdHMpCiAgICAgICAgICAgIGZvciBlbnRyeSBpbiBvcy5saXN0ZGlyKGRpc3RfZGF0YV9zY3JpcHRzKToKICAgICAgICAgICAgICAgICMgUmVtb3ZlIGJ5dGVjb2RlLCBhcyBpdCdzIG5vdCBwcm9wZXJseSBoYW5kbGVkCiAgICAgICAgICAgICAgICAjIGR1cmluZyBlYXN5X2luc3RhbGwgc2NyaXB0cyBpbnN0YWxsIHBoYXNlLgogICAgICAgICAgICAgICAgaWYgZW50cnkuZW5kc3dpdGgoJy5weWMnKToKICAgICAgICAgICAgICAgICAgICBvcy51bmxpbmsob3MucGF0aC5qb2luKGRpc3RfZGF0YV9zY3JpcHRzLCBlbnRyeSkpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG9zLnJlbmFtZSgKICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKGRpc3RfZGF0YV9zY3JpcHRzLCBlbnRyeSksCiAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihlZ2dfaW5mb19zY3JpcHRzLCBlbnRyeSksCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICBvcy5ybWRpcihkaXN0X2RhdGFfc2NyaXB0cykKICAgICAgICBmb3Igc3ViZGlyIGluIGZpbHRlcihvcy5wYXRoLmV4aXN0cywgKAogICAgICAgICAgICBvcy5wYXRoLmpvaW4oZGlzdF9kYXRhLCBkKQogICAgICAgICAgICBmb3IgZCBpbiAoJ2RhdGEnLCAnaGVhZGVycycsICdwdXJlbGliJywgJ3BsYXRsaWInKQogICAgICAgICkpOgogICAgICAgICAgICB1bnBhY2soc3ViZGlyLCBkZXN0aW5hdGlvbl9lZ2dkaXIpCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZGlzdF9kYXRhKToKICAgICAgICAgICAgb3Mucm1kaXIoZGlzdF9kYXRhKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfZml4X25hbWVzcGFjZV9wYWNrYWdlcyhlZ2dfaW5mbywgZGVzdGluYXRpb25fZWdnZGlyKToKICAgICAgICBuYW1lc3BhY2VfcGFja2FnZXMgPSBvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgIGVnZ19pbmZvLCAnbmFtZXNwYWNlX3BhY2thZ2VzLnR4dCcpCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMobmFtZXNwYWNlX3BhY2thZ2VzKToKICAgICAgICAgICAgd2l0aCBvcGVuKG5hbWVzcGFjZV9wYWNrYWdlcykgYXMgZnA6CiAgICAgICAgICAgICAgICBuYW1lc3BhY2VfcGFja2FnZXMgPSBmcC5yZWFkKCkuc3BsaXQoKQogICAgICAgICAgICBmb3IgbW9kIGluIG5hbWVzcGFjZV9wYWNrYWdlczoKICAgICAgICAgICAgICAgIG1vZF9kaXIgPSBvcy5wYXRoLmpvaW4oZGVzdGluYXRpb25fZWdnZGlyLCAqbW9kLnNwbGl0KCcuJykpCiAgICAgICAgICAgICAgICBtb2RfaW5pdCA9IG9zLnBhdGguam9pbihtb2RfZGlyLCAnX19pbml0X18ucHknKQogICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKG1vZF9kaXIpOgogICAgICAgICAgICAgICAgICAgIG9zLm1rZGlyKG1vZF9kaXIpCiAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMobW9kX2luaXQpOgogICAgICAgICAgICAgICAgICAgIHdpdGggb3Blbihtb2RfaW5pdCwgJ3cnKSBhcyBmcDoKICAgICAgICAgICAgICAgICAgICAgICAgZnAud3JpdGUoTkFNRVNQQUNFX1BBQ0tBR0VfSU5JVCkKUEsDBBQAAAAAAAAAIQD5y+4NygIAAMoCAABCAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvd2luZG93c19zdXBwb3J0LnB5aW1wb3J0IHBsYXRmb3JtCmltcG9ydCBjdHlwZXMKCgpkZWYgd2luZG93c19vbmx5KGZ1bmMpOgogICAgaWYgcGxhdGZvcm0uc3lzdGVtKCkgIT0gJ1dpbmRvd3MnOgogICAgICAgIHJldHVybiBsYW1iZGEgKmFyZ3MsICoqa3dhcmdzOiBOb25lCiAgICByZXR1cm4gZnVuYwoKCkB3aW5kb3dzX29ubHkKZGVmIGhpZGVfZmlsZShwYXRoKToKICAgICIiIgogICAgU2V0IHRoZSBoaWRkZW4gYXR0cmlidXRlIG9uIGEgZmlsZSBvciBkaXJlY3RvcnkuCgogICAgRnJvbSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzE5NjIyMTMzLwoKICAgIGBwYXRoYCBtdXN0IGJlIHRleHQuCiAgICAiIiIKICAgIF9faW1wb3J0X18oJ2N0eXBlcy53aW50eXBlcycpCiAgICBTZXRGaWxlQXR0cmlidXRlcyA9IGN0eXBlcy53aW5kbGwua2VybmVsMzIuU2V0RmlsZUF0dHJpYnV0ZXNXCiAgICBTZXRGaWxlQXR0cmlidXRlcy5hcmd0eXBlcyA9IGN0eXBlcy53aW50eXBlcy5MUFdTVFIsIGN0eXBlcy53aW50eXBlcy5EV09SRAogICAgU2V0RmlsZUF0dHJpYnV0ZXMucmVzdHlwZSA9IGN0eXBlcy53aW50eXBlcy5CT09MCgogICAgRklMRV9BVFRSSUJVVEVfSElEREVOID0gMHgwMgoKICAgIHJldCA9IFNldEZpbGVBdHRyaWJ1dGVzKHBhdGgsIEZJTEVfQVRUUklCVVRFX0hJRERFTikKICAgIGlmIG5vdCByZXQ6CiAgICAgICAgcmFpc2UgY3R5cGVzLldpbkVycm9yKCkKUEsDBBQAAAAAAAAAIQAAAAAAAAAAAAAAAAAiAAAAcnVsZXNfcHl0aG9uL3BhY2thZ2luZy9fX2luaXRfXy5weVBLAwQUAAAAAAAAACEAf7l+D4gWAACIFgAAHQAAAHJ1bGVzX3B5dGhvbi9wYWNrYWdpbmcvd2hsLnB5IyBDb3B5cmlnaHQgMjAxNyBUaGUgQmF6ZWwgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIwojIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwojIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIwojICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAojCiMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQojIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAojIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoiIiJUaGUgd2hsIG1vZHVsZXMgZGVmaW5lcyBjbGFzc2VzIGZvciBpbnRlcmFjdGluZyB3aXRoIFB5dGhvbiBwYWNrYWdlcy4iIiIKCmltcG9ydCBhcmdwYXJzZQppbXBvcnQganNvbgppbXBvcnQgb3MKaW1wb3J0IHBrZ19yZXNvdXJjZXMKaW1wb3J0IHJlCmltcG9ydCB6aXBmaWxlCgoKY2xhc3MgV2hlZWwob2JqZWN0KToKCiAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGgpOgogICAgc2VsZi5fcGF0aCA9IHBhdGgKCiAgZGVmIHBhdGgoc2VsZik6CiAgICByZXR1cm4gc2VsZi5fcGF0aAoKICBkZWYgYmFzZW5hbWUoc2VsZik6CiAgICByZXR1cm4gb3MucGF0aC5iYXNlbmFtZShzZWxmLnBhdGgoKSkKCiAgZGVmIGRpc3RyaWJ1dGlvbihzZWxmKToKICAgICMgU2VlIGh0dHBzOi8vd3d3LnB5dGhvbi5vcmcvZGV2L3BlcHMvcGVwLTA0MjcvI2ZpbGUtbmFtZS1jb252ZW50aW9uCiAgICBwYXJ0cyA9IHNlbGYuYmFzZW5hbWUoKS5zcGxpdCgnLScpCiAgICByZXR1cm4gcGFydHNbMF0KCiAgZGVmIHZlcnNpb24oc2VsZik6CiAgICAjIFNlZSBodHRwczovL3d3dy5weXRob24ub3JnL2Rldi9wZXBzL3BlcC0wNDI3LyNmaWxlLW5hbWUtY29udmVudGlvbgogICAgcGFydHMgPSBzZWxmLmJhc2VuYW1lKCkuc3BsaXQoJy0nKQogICAgcmV0dXJuIHBhcnRzWzFdCgogIGRlZiByZXBvc2l0b3J5X3N1ZmZpeChzZWxmKToKICAgICMgUmV0dXJucyBhIGNhbm9uaWNhbCBzdWZmaXggdGhhdCB3aWxsIGZvcm0gcGFydCBvZiB0aGUgbmFtZSBvZiB0aGUgQmF6ZWwKICAgICMgcmVwb3NpdG9yeSBmb3IgdGhpcyBwYWNrYWdlLgogICAgY2Fub25pY2FsID0gJ3B5cGlfX3t9X3t9Jy5mb3JtYXQoc2VsZi5kaXN0cmlidXRpb24oKSwgc2VsZi52ZXJzaW9uKCkpCiAgICAjIEVzY2FwZSBhbnkgaWxsZWdhbCBjaGFyYWN0ZXJzIHdpdGggdW5kZXJzY29yZS4KICAgIHJldHVybiByZS5zdWIoJ1stLitdJywgJ18nLCBjYW5vbmljYWwpCgogIGRlZiBfZGlzdF9pbmZvKHNlbGYpOgogICAgIyBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGRpc3QtaW5mbyBkaXJlY3Rvcnkgd2l0aGluIHRoZSAud2hsIGZpbGUuCiAgICAjIGUuZy4gZ29vZ2xlX2Nsb3VkLTAuMjcuMC1weTIucHkzLW5vbmUtYW55LndobCAtPgogICAgIyAgICAgIGdvb2dsZV9jbG91ZC0wLjI3LjAuZGlzdC1pbmZvCiAgICByZXR1cm4gJ3t9LXt9LmRpc3QtaW5mbycuZm9ybWF0KHNlbGYuZGlzdHJpYnV0aW9uKCksIHNlbGYudmVyc2lvbigpKQoKICBkZWYgbWV0YWRhdGEoc2VsZik6CiAgICAjIEV4dHJhY3QgdGhlIHN0cnVjdHVyZWQgZGF0YSBmcm9tIG1ldGFkYXRhLmpzb24gaW4gdGhlIFdITCdzIGRpc3QtaW5mbwogICAgIyBkaXJlY3RvcnkuCiAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShzZWxmLnBhdGgoKSwgJ3InKSBhcyB3aGw6CiAgICAgICMgZmlyc3QgY2hlY2sgZm9yIG1ldGFkYXRhLmpzb24KICAgICAgdHJ5OgogICAgICAgIHdpdGggd2hsLm9wZW4oc2VsZi5fZGlzdF9pbmZvKCkgKyAnL21ldGFkYXRhLmpzb24nKSBhcyBmOgogICAgICAgICAgcmV0dXJuIGpzb24ubG9hZHMoZi5yZWFkKCkuZGVjb2RlKCJ1dGYtOCIpKQogICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICBwYXNzCiAgICAgICMgZmFsbCBiYWNrIHRvIE1FVEFEQVRBIGZpbGUgKGh0dHBzOi8vd3d3LnB5dGhvbi5vcmcvZGV2L3BlcHMvcGVwLTA0MjcvKQogICAgICB3aXRoIHdobC5vcGVuKHNlbGYuX2Rpc3RfaW5mbygpICsgJy9NRVRBREFUQScpIGFzIGY6CiAgICAgICAgcmV0dXJuIHNlbGYuX3BhcnNlX21ldGFkYXRhKGYucmVhZCgpLmRlY29kZSgidXRmLTgiKSkKCiAgZGVmIG5hbWUoc2VsZik6CiAgICByZXR1cm4gc2VsZi5tZXRhZGF0YSgpLmdldCgnbmFtZScpCgogIGRlZiBkZXBlbmRlbmNpZXMoc2VsZiwgZXh0cmE9Tm9uZSk6CiAgICAiIiJBY2Nlc3MgdGhlIGRlcGVuZGVuY2llcyBvZiB0aGlzIFdoZWVsLgoKICAgIEFyZ3M6CiAgICAgIGV4dHJhOiBpZiBzcGVjaWZpZWQsIGluY2x1ZGUgdGhlIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzCiAgICAgICAgICAgIG9mIHRoZSBuYW1lZCAiZXh0cmEiLgoKICAgIFlpZWxkczoKICAgICAgdGhlIG5hbWVzIG9mIHJlcXVpcmVtZW50cyBmcm9tIHRoZSBtZXRhZGF0YS5qc29uCiAgICAiIiIKICAgICMgVE9ETyhtYXR0bW9vcik6IElzIHRoZXJlIGEgc2NoZW1hIHRvIGZvbGxvdyBmb3IgdGhpcz8KICAgIGRlcGVuZGVuY3lfc2V0ID0gc2V0KCkKCiAgICBydW5fcmVxdWlyZXMgPSBzZWxmLm1ldGFkYXRhKCkuZ2V0KCdydW5fcmVxdWlyZXMnLCBbXSkKICAgIGZvciByZXF1aXJlbWVudCBpbiBydW5fcmVxdWlyZXM6CiAgICAgIGlmIHJlcXVpcmVtZW50LmdldCgnZXh0cmEnKSAhPSBleHRyYToKICAgICAgICAjIE1hdGNoIHRoZSByZXF1aXJlbWVudHMgZm9yIHRoZSBleHRyYSB3ZSdyZSBsb29raW5nIGZvci4KICAgICAgICBjb250aW51ZQogICAgICBtYXJrZXIgPSByZXF1aXJlbWVudC5nZXQoJ2Vudmlyb25tZW50JykKICAgICAgaWYgbWFya2VyIGFuZCBub3QgcGtnX3Jlc291cmNlcy5ldmFsdWF0ZV9tYXJrZXIobWFya2VyKToKICAgICAgICAjIFRoZSBjdXJyZW50IGVudmlyb25tZW50IGRvZXMgbm90IG1hdGNoIHRoZSBwcm92aWRlZCBQRVAgNTA4IG1hcmtlciwKICAgICAgICAjIHNvIGlnbm9yZSB0aGlzIHJlcXVpcmVtZW50LgogICAgICAgIGNvbnRpbnVlCiAgICAgIHJlcXVpcmVzID0gcmVxdWlyZW1lbnQuZ2V0KCdyZXF1aXJlcycsIFtdKQogICAgICBmb3IgZW50cnkgaW4gcmVxdWlyZXM6CiAgICAgICAgIyBTdHJpcCBvZmYgYW55IHRyYWlsaW5nIHZlcnNpb25pbmcgZGF0YS4KICAgICAgICBwYXJ0cyA9IHJlLnNwbGl0KCdbID48PSgpXScsIGVudHJ5KQogICAgICAgIGRlcGVuZGVuY3lfc2V0LmFkZChwYXJ0c1swXSkKCiAgICByZXR1cm4gZGVwZW5kZW5jeV9zZXQKCiAgZGVmIGV4dHJhcyhzZWxmKToKICAgIHJldHVybiBzZWxmLm1ldGFkYXRhKCkuZ2V0KCdleHRyYXMnLCBbXSkKCiAgZGVmIGV4cGFuZChzZWxmLCBkaXJlY3RvcnkpOgogICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoc2VsZi5wYXRoKCksICdyJykgYXMgd2hsOgogICAgICB3aGwuZXh0cmFjdGFsbChkaXJlY3RvcnkpCgogICMgX3BhcnNlX21ldGFkYXRhIHBhcnNlcyBNRVRBREFUQSBmaWxlcyBhY2NvcmRpbmcgdG8gaHR0cHM6Ly93d3cucHl0aG9uLm9yZy9kZXYvcGVwcy9wZXAtMDMxNC8KICBkZWYgX3BhcnNlX21ldGFkYXRhKHNlbGYsIGNvbnRlbnQpOgogICAgIyBUT0RPOiBoYW5kbGUgZmllbGRzIG90aGVyIHRoYW4ganVzdCBuYW1lCiAgICBuYW1lX3BhdHRlcm4gPSByZS5jb21waWxlKCdOYW1lOiAoLiopJykKICAgIHJldHVybiB7ICduYW1lJzogbmFtZV9wYXR0ZXJuLnNlYXJjaChjb250ZW50KS5ncm91cCgxKSB9CgoKcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoCiAgICBkZXNjcmlwdGlvbj0nVW5wYWNrIGEgV0hMIGZpbGUgYXMgYSBweV9saWJyYXJ5LicpCgpwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXdobCcsIGFjdGlvbj0nc3RvcmUnLAogICAgICAgICAgICAgICAgICAgIGhlbHA9KCdUaGUgLndobCBmaWxlIHdlIGFyZSBleHBhbmRpbmcuJykpCgpwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXJlcXVpcmVtZW50cycsIGFjdGlvbj0nc3RvcmUnLAogICAgICAgICAgICAgICAgICAgIGhlbHA9J1RoZSBwaXBfaW1wb3J0IGZyb20gd2hpY2ggdG8gZHJhdyBkZXBlbmRlbmNpZXMuJykKCnBhcnNlci5hZGRfYXJndW1lbnQoJy0tZGlyZWN0b3J5JywgYWN0aW9uPSdzdG9yZScsIGRlZmF1bHQ9Jy4nLAogICAgICAgICAgICAgICAgICAgIGhlbHA9J1RoZSBkaXJlY3RvcnkgaW50byB3aGljaCB0byBleHBhbmQgdGhpbmdzLicpCgpwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWV4dHJhcycsIGFjdGlvbj0nYXBwZW5kJywKICAgICAgICAgICAgICAgICAgICBoZWxwPSdUaGUgc2V0IG9mIGV4dHJhcyBmb3Igd2hpY2ggdG8gZ2VuZXJhdGUgbGlicmFyeSB0YXJnZXRzLicpCgpkZWYgbWFpbigpOgogIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCiAgd2hsID0gV2hlZWwoYXJncy53aGwpCgogICMgRXh0cmFjdCB0aGUgZmlsZXMgaW50byB0aGUgY3VycmVudCBkaXJlY3RvcnkKICB3aGwuZXhwYW5kKGFyZ3MuZGlyZWN0b3J5KQoKICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKGFyZ3MuZGlyZWN0b3J5LCAnQlVJTEQnKSwgJ3cnKSBhcyBmOgogICAgZi53cml0ZSgiIiIKcGFja2FnZShkZWZhdWx0X3Zpc2liaWxpdHkgPSBbIi8vdmlzaWJpbGl0eTpwdWJsaWMiXSkKCmxvYWQoIkBydWxlc19weXRob24vL3B5dGhvbjpkZWZzLmJ6bCIsICJweV9saWJyYXJ5IikKbG9hZCgie3JlcXVpcmVtZW50c30iLCAicmVxdWlyZW1lbnQiKQoKcHlfbGlicmFyeSgKICAgIG5hbWUgPSAicGtnIiwKICAgIHNyY3MgPSBnbG9iKFsiKiovKi5weSJdKSwKICAgIGRhdGEgPSBnbG9iKFsiKiovKiJdLCBleGNsdWRlPVsiKiovKi5weSIsICIqKi8qICoiLCAiQlVJTEQiLCAiV09SS1NQQUNFIl0pLAogICAgIyBUaGlzIG1ha2VzIHRoaXMgZGlyZWN0b3J5IGEgdG9wLWxldmVsIGluIHRoZSBweXRob24gaW1wb3J0CiAgICAjIHNlYXJjaCBwYXRoIGZvciBhbnl0aGluZyB0aGF0IGRlcGVuZHMgb24gdGhpcy4KICAgIGltcG9ydHMgPSBbIi4iXSwKICAgIGRlcHMgPSBbe2RlcGVuZGVuY2llc31dLAopCntleHRyYXN9IiIiLmZvcm1hdCgKICByZXF1aXJlbWVudHM9YXJncy5yZXF1aXJlbWVudHMsCiAgZGVwZW5kZW5jaWVzPScsJy5qb2luKFsKICAgICdyZXF1aXJlbWVudCgiJXMiKScgJSBkCiAgICBmb3IgZCBpbiB3aGwuZGVwZW5kZW5jaWVzKCkKICBdKSwKICBleHRyYXM9J1xuXG4nLmpvaW4oWwogICAgIiIicHlfbGlicmFyeSgKICAgIG5hbWUgPSAie2V4dHJhfSIsCiAgICBkZXBzID0gWwogICAgICAgICI6cGtnIix7ZGVwc30KICAgIF0sCikiIiIuZm9ybWF0KGV4dHJhPWV4dHJhLAogICAgICAgICAgICBkZXBzPScsJy5qb2luKFsKICAgICAgICAgICAgICAgICdyZXF1aXJlbWVudCgiJXMiKScgJSBkZXAKICAgICAgICAgICAgICAgIGZvciBkZXAgaW4gd2hsLmRlcGVuZGVuY2llcyhleHRyYSkKICAgICAgICAgICAgXSkpCiAgICBmb3IgZXh0cmEgaW4gYXJncy5leHRyYXMgb3IgW10KICBdKSkpCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogIG1haW4oKQpQSwMEFAAAAAAAAAAhAHdSnVX6MQAA+jEAAB4AAABydWxlc19weXRob24vcGFja2FnaW5nL3dobHRvb2wjIS91c3IvYmluL2VudiBweXRob24KCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KCmltcG9ydCBvcwppbXBvcnQgcmUKaW1wb3J0IHRlbXBmaWxlCmltcG9ydCBzaHV0aWwKaW1wb3J0IHN5cwppbXBvcnQgc3VicHJvY2VzcwppbXBvcnQgemlwZmlsZQoKIyBSZXR1cm4gVHJ1ZSBpZiBydW5uaW5nIG9uIFdpbmRvd3MKZGVmIElzV2luZG93cygpOgogIHJldHVybiBvcy5uYW1lID09ICdudCcKCmRlZiBHZXRXaW5kb3dzUGF0aFdpdGhVTkNQcmVmaXgocGF0aCk6CiAgIiIiCiAgQWRkaW5nIFVOQyBwcmVmaXggYWZ0ZXIgZ2V0dGluZyBhIG5vcm1hbGl6ZWQgYWJzb2x1dGUgV2luZG93cyBwYXRoLAogIGl0J3Mgbm8tb3AgZm9yIG5vbi1XaW5kb3dzIHBsYXRmb3JtcyBvciBpZiBydW5uaW5nIHVuZGVyIHB5dGhvbjIuCiAgIiIiCiAgcGF0aCA9IHBhdGguc3RyaXAoKQoKICAjIE5vIG5lZWQgdG8gYWRkIHByZWZpeCBmb3Igbm9uLVdpbmRvd3MgcGxhdGZvcm1zLgogICMgQW5kIFxcP1wgZG9lc24ndCB3b3JrIGluIHB5dGhvbiAyCiAgaWYgbm90IElzV2luZG93cygpIG9yIHN5cy52ZXJzaW9uX2luZm9bMF0gPCAzOgogICAgcmV0dXJuIHBhdGgKCiAgIyBMZXRzIHN0YXJ0IHRoZSB1bmljb2RlIGZ1bgogIHVuaWNvZGVfcHJlZml4ID0gIlxcXFw/XFwiCiAgaWYgcGF0aC5zdGFydHN3aXRoKHVuaWNvZGVfcHJlZml4KToKICAgIHJldHVybiBwYXRoCgogICMgb3MucGF0aC5hYnNwYXRoIHJldHVybnMgYSBub3JtYWxpemVkIGFic29sdXRlIHBhdGgKICByZXR1cm4gdW5pY29kZV9wcmVmaXggKyBvcy5wYXRoLmFic3BhdGgocGF0aCkKCmRlZiBIYXNXaW5kb3dzRXhlY3V0YWJsZUV4dGVuc2lvbihwYXRoKToKICByZXR1cm4gcGF0aC5lbmRzd2l0aCgnLmV4ZScpIG9yIHBhdGguZW5kc3dpdGgoJy5jb20nKSBvciBwYXRoLmVuZHN3aXRoKCcuYmF0JykKClBZVEhPTl9CSU5BUlkgPSAnYmF6ZWxfdG9vbHMvdG9vbHMvcHl0aG9uL3B5M3dyYXBwZXIuc2gnCmlmIElzV2luZG93cygpIGFuZCBub3QgSGFzV2luZG93c0V4ZWN1dGFibGVFeHRlbnNpb24oUFlUSE9OX0JJTkFSWSk6CiAgUFlUSE9OX0JJTkFSWSA9IFBZVEhPTl9CSU5BUlkgKyAnLmV4ZScKCiMgRmluZCBhIGZpbGUgaW4gYSBnaXZlbiBzZWFyY2ggcGF0aC4KZGVmIFNlYXJjaFBhdGgobmFtZSk6CiAgc2VhcmNoX3BhdGggPSBvcy5nZXRlbnYoJ1BBVEgnLCBvcy5kZWZwYXRoKS5zcGxpdChvcy5wYXRoc2VwKQogIGZvciBkaXJlY3RvcnkgaW4gc2VhcmNoX3BhdGg6CiAgICBpZiBkaXJlY3RvcnkgPT0gJyc6IGNvbnRpbnVlCiAgICBwYXRoID0gb3MucGF0aC5qb2luKGRpcmVjdG9yeSwgbmFtZSkKICAgIGlmIG9zLnBhdGguaXNmaWxlKHBhdGgpIGFuZCBvcy5hY2Nlc3MocGF0aCwgb3MuWF9PSyk6CiAgICAgIHJldHVybiBwYXRoCiAgcmV0dXJuIE5vbmUKCmRlZiBJc1J1bm5pbmdGcm9tWmlwKCk6CiAgcmV0dXJuIEZhbHNlCgojIEZpbmQgdGhlIHJlYWwgUHl0aG9uIGJpbmFyeSBpZiBpdCdzIG5vdCBhIG5vcm1hbCBhYnNvbHV0ZSBwYXRoCmRlZiBGaW5kUHl0aG9uQmluYXJ5KG1vZHVsZV9zcGFjZSk6CiAgaWYgUFlUSE9OX0JJTkFSWS5zdGFydHN3aXRoKCcvLycpOgogICAgIyBDYXNlIDE6IFBhdGggaXMgYSBsYWJlbC4gTm90IHN1cHBvcnRlZCB5ZXQuCiAgICByYWlzZSBBc3NlcnRpb25FcnJvcigKICAgICAgJ0JhemVsIGRvZXMgbm90IHN1cHBvcnQgZXhlY3V0aW9uIG9mIFB5dGhvbiBpbnRlcnByZXRlcnMgdmlhIGxhYmVscyB5ZXQnKQogIGVsaWYgb3MucGF0aC5pc2FicyhQWVRIT05fQklOQVJZKToKICAgICMgQ2FzZSAyOiBBYnNvbHV0ZSBwYXRoLgogICAgcmV0dXJuIFBZVEhPTl9CSU5BUlkKICAjIFVzZSBub3JtcGF0aCgpIHRvIGNvbnZlcnQgc2xhc2hlcyB0byBvcy5zZXAgb24gV2luZG93cy4KICBlbGlmIG9zLnNlcCBpbiBvcy5wYXRoLm5vcm1wYXRoKFBZVEhPTl9CSU5BUlkpOgogICAgIyBDYXNlIDM6IFBhdGggaXMgcmVsYXRpdmUgdG8gdGhlIHJlcG8gcm9vdC4KICAgIHJldHVybiBvcy5wYXRoLmpvaW4obW9kdWxlX3NwYWNlLCBQWVRIT05fQklOQVJZKQogIGVsc2U6CiAgICAjIENhc2UgNDogUGF0aCBoYXMgdG8gYmUgbG9va2VkIHVwIGluIHRoZSBzZWFyY2ggcGF0aC4KICAgIHJldHVybiBTZWFyY2hQYXRoKFBZVEhPTl9CSU5BUlkpCgpkZWYgQ3JlYXRlUHl0aG9uUGF0aEVudHJpZXMocHl0aG9uX2ltcG9ydHMsIG1vZHVsZV9zcGFjZSk6CiAgcGFydHMgPSBweXRob25faW1wb3J0cy5zcGxpdCgnOicpOwogIHJldHVybiBbbW9kdWxlX3NwYWNlXSArIFsiJXMvJXMiICUgKG1vZHVsZV9zcGFjZSwgcGF0aCkgZm9yIHBhdGggaW4gcGFydHNdCgojIEZpbmQgdGhlIHJ1bmZpbGVzIHRyZWUKZGVmIEZpbmRNb2R1bGVTcGFjZSgpOgogIHN0dWJfZmlsZW5hbWUgPSBzeXMuYXJndlswXQogIGlmIG5vdCBvcy5wYXRoLmlzYWJzKHN0dWJfZmlsZW5hbWUpOgogICAgc3R1Yl9maWxlbmFtZSA9IG9zLnBhdGguam9pbihvcy5nZXRjd2QoKSwgc3R1Yl9maWxlbmFtZSkKCiAgd2hpbGUgVHJ1ZToKICAgIG1vZHVsZV9zcGFjZSA9IHN0dWJfZmlsZW5hbWUgKyAoJy5leGUnIGlmIElzV2luZG93cygpIGVsc2UgJycpICsgJy5ydW5maWxlcycKICAgIGlmIG9zLnBhdGguaXNkaXIobW9kdWxlX3NwYWNlKToKICAgICAgcmV0dXJuIG1vZHVsZV9zcGFjZQoKICAgIHJ1bmZpbGVzX3BhdHRlcm4gPSByJyguKlwucnVuZmlsZXMpJyArIChyJ1xcJyBpZiBJc1dpbmRvd3MoKSBlbHNlICcvJykgKyAnLionCiAgICBtYXRjaG9iaiA9IHJlLm1hdGNoKHJ1bmZpbGVzX3BhdHRlcm4sIHN0dWJfZmlsZW5hbWUpCiAgICBpZiBtYXRjaG9iajoKICAgICAgcmV0dXJuIG1hdGNob2JqLmdyb3VwKDEpCgogICAgaWYgbm90IG9zLnBhdGguaXNsaW5rKHN0dWJfZmlsZW5hbWUpOgogICAgICBicmVhawogICAgdGFyZ2V0ID0gb3MucmVhZGxpbmsoc3R1Yl9maWxlbmFtZSkKICAgIGlmIG9zLnBhdGguaXNhYnModGFyZ2V0KToKICAgICAgc3R1Yl9maWxlbmFtZSA9IHRhcmdldAogICAgZWxzZToKICAgICAgc3R1Yl9maWxlbmFtZSA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoc3R1Yl9maWxlbmFtZSksIHRhcmdldCkKCiAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoJ0Nhbm5vdCBmaW5kIC5ydW5maWxlcyBkaXJlY3RvcnkgZm9yICVzJyAlIHN5cy5hcmd2WzBdKQoKZGVmIEV4dHJhY3RaaXAoemlwX3BhdGgsIGRlc3RfZGlyKToKICAiIiJFeHRyYWN0cyB0aGUgY29udGVudHMgb2YgYSB6aXAgZmlsZSwgcHJlc2VydmluZyB0aGUgdW5peCBmaWxlIG1vZGUgYml0cy4KCiAgVGhlc2UgaW5jbHVkZSB0aGUgcGVybWlzc2lvbiBiaXRzLCBhbmQgaW4gcGFydGljdWxhciwgdGhlIGV4ZWN1dGFibGUgYml0LgoKICBJZGVhbGx5IHRoZSB6aXBmaWxlIG1vZHVsZSBzaG91bGQgc2V0IHRoZXNlIGJpdHMsIGJ1dCBpdCBkb2Vzbid0LiBTZWU6CiAgaHR0cHM6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUxNTc5NS4KCiAgQXJnczoKICAgICAgemlwX3BhdGg6IFRoZSBwYXRoIHRvIHRoZSB6aXAgZmlsZSB0byBleHRyYWN0CiAgICAgIGRlc3RfZGlyOiBUaGUgcGF0aCB0byB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5CiAgIiIiCiAgemlwX3BhdGggPSBHZXRXaW5kb3dzUGF0aFdpdGhVTkNQcmVmaXgoemlwX3BhdGgpCiAgZGVzdF9kaXIgPSBHZXRXaW5kb3dzUGF0aFdpdGhVTkNQcmVmaXgoZGVzdF9kaXIpCiAgd2l0aCB6aXBmaWxlLlppcEZpbGUoemlwX3BhdGgpIGFzIHpmOgogICAgZm9yIGluZm8gaW4gemYuaW5mb2xpc3QoKToKICAgICAgemYuZXh0cmFjdChpbmZvLCBkZXN0X2RpcikKICAgICAgIyBVTkMtcHJlZml4ZWQgcGF0aHMgbXVzdCBiZSBhYnNvbHV0ZS9ub3JtYWxpemVkLiBTZWUKICAgICAgIyBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy93aW5kb3dzL2Rlc2t0b3AvZmlsZWlvL25hbWluZy1hLWZpbGUjbWF4aW11bS1wYXRoLWxlbmd0aC1saW1pdGF0aW9uCiAgICAgIGZpbGVfcGF0aCA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmpvaW4oZGVzdF9kaXIsIGluZm8uZmlsZW5hbWUpKQogICAgICAjIFRoZSBVbml4IHN0X21vZGUgYml0cyAoc2VlICJtYW4gNyBpbm9kZSIpIGFyZSBzdG9yZWQgaW4gdGhlIHVwcGVyIDE2CiAgICAgICMgYml0cyBvZiBleHRlcm5hbF9hdHRyLiBPZiB0aG9zZSwgd2Ugc2V0IHRoZSBsb3dlciAxMiBiaXRzLCB3aGljaCBhcmUgdGhlCiAgICAgICMgZmlsZSBtb2RlIGJpdHMgKHNpbmNlIHRoZSBmaWxlIHR5cGUgYml0cyBjYW4ndCBiZSBzZXQgYnkgY2htb2QgYW55d2F5KS4KICAgICAgYXR0cnMgPSBpbmZvLmV4dGVybmFsX2F0dHIgPj4gMTYKICAgICAgaWYgYXR0cnMgIT0gMDogICMgUnVtb3IgaGFzIGl0IHRoZXNlIGNhbiBiZSAwIGZvciB6aXBzIGNyZWF0ZWQgb24gV2luZG93cy4KICAgICAgICBvcy5jaG1vZChmaWxlX3BhdGgsIGF0dHJzICYgMG83Nzc3KQoKIyBDcmVhdGUgdGhlIHJ1bmZpbGVzIHRyZWUgYnkgZXh0cmFjdGluZyB0aGUgemlwIGZpbGUKZGVmIENyZWF0ZU1vZHVsZVNwYWNlKCk6CiAgdGVtcF9kaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCIiLCAiQmF6ZWwucnVuZmlsZXNfIikKICBFeHRyYWN0WmlwKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXyksIHRlbXBfZGlyKQogIHJldHVybiBvcy5wYXRoLmpvaW4odGVtcF9kaXIsICJydW5maWxlcyIpCgojIFJldHVybnMgcmVwb3NpdG9yeSByb290cyB0byBhZGQgdG8gdGhlIGltcG9ydCBwYXRoLgpkZWYgR2V0UmVwb3NpdG9yaWVzSW1wb3J0cyhtb2R1bGVfc3BhY2UsIGltcG9ydF9hbGwpOgogIGlmIGltcG9ydF9hbGw6CiAgICByZXBvX2RpcnMgPSBbb3MucGF0aC5qb2luKG1vZHVsZV9zcGFjZSwgZCkgZm9yIGQgaW4gb3MubGlzdGRpcihtb2R1bGVfc3BhY2UpXQogICAgcmV0dXJuIFtkIGZvciBkIGluIHJlcG9fZGlycyBpZiBvcy5wYXRoLmlzZGlyKGQpXQogIHJldHVybiBbb3MucGF0aC5qb2luKG1vZHVsZV9zcGFjZSwgInJ1bGVzX3B5dGhvbiIpXQoKIyBGaW5kcyB0aGUgcnVuZmlsZXMgbWFuaWZlc3Qgb3IgdGhlIHJ1bmZpbGVzIGRpcmVjdG9yeS4KZGVmIFJ1bmZpbGVzRW52dmFyKG1vZHVsZV9zcGFjZSk6CiAgIyBJZiB0aGlzIGJpbmFyeSBpcyB0aGUgZGF0YS1kZXBlbmRlbmN5IG9mIGFub3RoZXIgb25lLCB0aGUgb3RoZXIgc2V0cwogICMgUlVORklMRVNfTUFOSUZFU1RfRklMRSBvciBSVU5GSUxFU19ESVIgZm9yIG91ciBzYWtlLgogIHJ1bmZpbGVzID0gb3MuZW52aXJvbi5nZXQoJ1JVTkZJTEVTX01BTklGRVNUX0ZJTEUnLCBOb25lKQogIGlmIHJ1bmZpbGVzOgogICAgcmV0dXJuICgnUlVORklMRVNfTUFOSUZFU1RfRklMRScsIHJ1bmZpbGVzKQoKICBydW5maWxlcyA9IG9zLmVudmlyb24uZ2V0KCdSVU5GSUxFU19ESVInLCBOb25lKQogIGlmIHJ1bmZpbGVzOgogICAgcmV0dXJuICgnUlVORklMRVNfRElSJywgcnVuZmlsZXMpCgogICMgSWYgcnVubmluZyBmcm9tIGEgemlwLCB0aGVyZSdzIG5vIG1hbmlmZXN0IGZpbGUuCiAgaWYgSXNSdW5uaW5nRnJvbVppcCgpOgogICAgcmV0dXJuICgnUlVORklMRVNfRElSJywgbW9kdWxlX3NwYWNlKQoKICAjIExvb2sgZm9yIHRoZSBydW5maWxlcyAib3V0cHV0IiBtYW5pZmVzdCwgYXJndlswXSArICIucnVuZmlsZXNfbWFuaWZlc3QiCiAgcnVuZmlsZXMgPSBtb2R1bGVfc3BhY2UgKyAnX21hbmlmZXN0JwogIGlmIG9zLnBhdGguZXhpc3RzKHJ1bmZpbGVzKToKICAgIHJldHVybiAoJ1JVTkZJTEVTX01BTklGRVNUX0ZJTEUnLCBydW5maWxlcykKCiAgIyBMb29rIGZvciB0aGUgcnVuZmlsZXMgImlucHV0IiBtYW5pZmVzdCwgYXJndlswXSArICIucnVuZmlsZXMvTUFOSUZFU1QiCiAgcnVuZmlsZXMgPSBvcy5wYXRoLmpvaW4obW9kdWxlX3NwYWNlLCAnTUFOSUZFU1QnKQogIGlmIG9zLnBhdGguZXhpc3RzKHJ1bmZpbGVzKToKICAgIHJldHVybiAoJ1JVTkZJTEVTX0RJUicsIHJ1bmZpbGVzKQoKICAjIElmIHJ1bm5pbmcgaW4gYSBzYW5kYm94IGFuZCBubyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIHNldCwgdGhlbgogICMgTG9vayBmb3IgdGhlIHJ1bmZpbGVzICBuZXh0IHRvIHRoZSBiaW5hcnkuCiAgaWYgbW9kdWxlX3NwYWNlLmVuZHN3aXRoKCcucnVuZmlsZXMnKSBhbmQgb3MucGF0aC5pc2Rpcihtb2R1bGVfc3BhY2UpOgogICAgcmV0dXJuICgnUlVORklMRVNfRElSJywgbW9kdWxlX3NwYWNlKQoKICByZXR1cm4gKE5vbmUsIE5vbmUpCgojIFRPRE8oIzY0NDMpOiBSZW1vdmUgdGhpcyBvbmNlIHRoZXJlJ3Mgbm8gbG9uZ2VyIGEgaG9zdCBjb25maWd1cmF0aW9uIGZvcgojIFB5dGhvbiB0YXJnZXRzIHRvIGFwcGVhciBpbi4KZGVmIE1heWJlRW1pdEhvc3RWZXJzaW9uV2FybmluZyhyZXRfY29kZSk6CiAgIiIiV2FybiB0aGUgdXNlciBpZiBhIGZhaWx1cmUgbWF5IGJlIGR1ZSB0byB0aGUgaG9zdCBjb25maWcncyB2ZXJzaW9uLgoKICBUaGlzIGVtaXRzIGEgbWVzc2FnZSB0byBzdGRlcnIgaWYKICAgIDEpIHJldF9jb2RlIGlzIG5vbi16ZXJvLAogICAgMikgdGhlIHRhcmdldCB3YXMgYnVpbHQgaW4gdGhlIGhvc3QgY29uZmlnIGFuZCB3aXRoIHRvb2xjaGFpbnMgZW5hYmxlZCwgYW5kCiAgICAzKSBhdCBhbmFseXNpcyB0aW1lIHdlIGRldGVjdGVkIGEgbWlzbWF0Y2ggYmV0d2VlbiB0aGUgaG9zdCBjb25maWcncyB2ZXJzaW9uCiAgICAgICBhbmQgdGhpcyB0YXJnZXQncyBleHBsaWNpdGx5IGRlY2xhcmVkIHZlcnNpb24sIG9yIGVsc2UgdGhpcyB0YXJnZXQgZGlkCiAgICAgICBub3QgZXhwbGljaXRseSBkZWNsYXJlIGl0cyB2ZXJzaW9uLiAoVGhlIGZvcm1lciBkaWFnbm9zZXMgdGFyZ2V0cwogICAgICAgYWZmZWN0ZWQgYnkgIzY0NDMsIGFuZCB0aGUgbGF0dGVyIGRpYWdub3NlcyB0YXJnZXRzIHRoYXQgYXJlIGJyb2tlbiBieQogICAgICAgZml4aW5nICM0ODE1LikKCiAgU2VlIGFsc28gIzc4OTksICM4NTQ5LCBhbmQgUHlDb21tb24jc2hvdWxkV2FybkFib3V0SG9zdFZlcnNpb25VcG9uRmFpbHVyZS4KCiAgU2luY2UgdGhpcyB3YXJuaW5nIGlzIGVtaXR0ZWQgaGVyZSBpbiB0aGUgc3R1YiBzY3JpcHQgYW5kIG5vdCBpbiBCYXplbCBpdHNlbGYsCiAgaXQgd2lsbCBiZSBwcmVzZW50IGluIGFsbCBmYWlsaW5nIHJ1bnMgb2YgYWZmZWN0ZWQgdGFyZ2V0cywgZXZlbiB3aGVuIGV4ZWN1dGVkCiAgZGlyZWN0bHkgYW5kIG5vdCB2aWEgYGJhemVsIHJ1bmAuIEhvd2V2ZXIsIG5vdGUgdGhhdCB0aGlzIHdhcm5pbmcgaXMgbmV2ZXIKICBhZGRlZCB0byBub24taG9zdC1jb25maWd1cmVkIHRhcmdldHMsIGFuZCB0aGF0IGl0IGNhbiBiZSBkaXNhYmxlZCBieSBlbnN1cmluZwogIHRoZSBjb3JyZWN0IFB5dGhvbiB2ZXJzaW9uIGlzIHBhc3NlZCB0byAtLWhvc3RfZm9yY2VfcHl0aG9uIGFuZCBkZWNsYXJlZCBpbgogIHRvb2xzJyBweXRob25fdmVyc2lvbiBhdHRyaWJ1dGVzLgoKICBBcmdzOgogICAgICByZXRfY29kZTogVGhlIGV4aXQgY29kZSBvZiB0aGUgcGF5bG9hZCB1c2VyIHByb2dyYW0KICAiIiIKICBpZiByZXRfY29kZSA9PSAwOgogICAgcmV0dXJuCiAgaWYgbm90IEZhbHNlOgogICAgcmV0dXJuCgogIGhvc3RfdmVyc2lvbiA9ICIzIgogIHRhcmdldF92ZXJzaW9uID0gIjMiCiAgb3Bwb3NpdGVfb2ZfaG9zdF92ZXJzaW9uID0gIjIiIGlmIGhvc3RfdmVyc2lvbiA9PSAiMyIgZWxzZSAiMyIKCiAgaWYgRmFsc2U6CiAgICAjIE1pc21hdGNoIHdpdGggZXhwbGljaXRseSBkZWNsYXJlZCB2ZXJzaW9uLgogICAgZGlhZ25vc3RpYyA9ICIiIlwKTm90ZTogVGhlIGZhaWx1cmUgb2YgdGFyZ2V0IHt0YXJnZXR9ICh3aXRoIGV4aXQgY29kZSB7cmV0X2NvZGV9KSBtYXkgaGF2ZSBiZWVuIFwKY2F1c2VkIGJ5IHRoZSBmYWN0IHRoYXQgaXQgaXMgYSBQeXRob24ge3RhcmdldF92ZXJzaW9ufSBwcm9ncmFtIHRoYXQgd2FzIGJ1aWx0IFwKaW4gdGhlIGhvc3QgY29uZmlndXJhdGlvbiwgd2hpY2ggdXNlcyBQeXRob24ge2hvc3RfdmVyc2lvbn0uIFlvdSBjYW4gY2hhbmdlIFwKdGhlIGhvc3QgY29uZmlndXJhdGlvbiAoZm9yIHRoZSBlbnRpcmUgYnVpbGQpIHRvIGluc3RlYWQgdXNlIFB5dGhvbiBcCnt0YXJnZXRfdmVyc2lvbn0gYnkgc2V0dGluZyAtLWhvc3RfZm9yY2VfcHl0aG9uPVBZe3RhcmdldF92ZXJzaW9ufS5cCiIiIi5mb3JtYXQoCiAgICB0YXJnZXQ9Ii8vcGFja2FnaW5nOndobHRvb2wiLAogICAgcmV0X2NvZGU9cmV0X2NvZGUsCiAgICB0YXJnZXRfdmVyc2lvbj10YXJnZXRfdmVyc2lvbiwKICAgIGhvc3RfdmVyc2lvbj1ob3N0X3ZlcnNpb24pCiAgZWxzZToKICAgIGRpYWdub3N0aWMgPSAiIiJcCk5vdGU6IFRoZSBmYWlsdXJlIG9mIHRhcmdldCB7dGFyZ2V0fSAod2l0aCBleGl0IGNvZGUge3JldF9jb2RlfSkgbWF5IGhhdmUgYmVlbiBcCmNhdXNlZCBieSB0aGUgZmFjdCB0aGF0IGl0IGlzIHJ1bm5pbmcgdW5kZXIgUHl0aG9uIHtob3N0X3ZlcnNpb259IGluc3RlYWQgb2YgXApQeXRob24ge29wcG9zaXRlX29mX2hvc3RfdmVyc2lvbn0uIEV4YW1pbmUgdGhlIGVycm9yIHRvIGRldGVybWluZSBpZiB0aGF0IFwKYXBwZWFycyB0byBiZSB0aGUgcHJvYmxlbS4gU2luY2UgdGhpcyB0YXJnZXQgaXMgYnVpbHQgaW4gdGhlIGhvc3QgXApjb25maWd1cmF0aW9uLCB0aGUgb25seSB3YXkgdG8gY2hhbmdlIGl0cyB2ZXJzaW9uIGlzIHRvIHNldCBcCi0taG9zdF9mb3JjZV9weXRob249UFl7b3Bwb3NpdGVfb2ZfaG9zdF92ZXJzaW9ufSwgd2hpY2ggYWZmZWN0cyB0aGUgZW50aXJlIFwKYnVpbGQuXAoiIiIuZm9ybWF0KAogICAgdGFyZ2V0PSIvL3BhY2thZ2luZzp3aGx0b29sIiwKICAgIHJldF9jb2RlPXJldF9jb2RlLAogICAgaG9zdF92ZXJzaW9uPWhvc3RfdmVyc2lvbiwKICAgIG9wcG9zaXRlX29mX2hvc3RfdmVyc2lvbj1vcHBvc2l0ZV9vZl9ob3N0X3ZlcnNpb24pCgogICMgVE9ETyhicmFuZGpvbik6IENoYW5nZSB0aGUgd29yZGluZyAiWW91IGFyZSBsaWtlbHkgc2VlaW5nIHRoaXMgbWVzc2FnZQogICMgYmVjYXVzZSIgdG8gc29tZXRoaW5nIGxlc3Mgc3Ryb25nIGFmdGVyIGEgZmV3IHJlbGVhc2VzIGZyb20gMC4yNy4gQnkgdGhhdAogICMgcG9pbnQsIG1pZ3JhdGlvbiBmb3IgdG9vbGNoYWlucyB3b24ndCBiZSB0aGUgbWFpbiByZWFzb24gdGhpcyBlcnJvciBpcyBzZWVuCiAgIyBieSB1c2Vycy4KICBtZXNzYWdlID0gIiIiXAotLS0tLS0tLS0tLS0tLS0tCntkaWFnbm9zdGljfQoKSWYgdGhpcyBlcnJvciBzdGFydGVkIG9jY3VycmluZyBpbiBCYXplbCAwLjI3IGFuZCBsYXRlciwgaXQgbWF5IGJlIGJlY2F1c2UgdGhlIFwKUHl0aG9uIHRvb2xjaGFpbiBub3cgZW5mb3JjZXMgdGhhdCB0YXJnZXRzIGFuYWx5emVkIGFzIFBZMiBhbmQgUFkzIHJ1biB1bmRlciBhIFwKUHl0aG9uIDIgYW5kIFB5dGhvbiAzIGludGVycHJldGVyLCByZXNwZWN0aXZlbHkuIFNlZSBcCmh0dHBzOi8vZ2l0aHViLmNvbS9iYXplbGJ1aWxkL2JhemVsL2lzc3Vlcy83ODk5IGZvciBtb3JlIGluZm9ybWF0aW9uLgotLS0tLS0tLS0tLS0tLS0tIiIiLmZvcm1hdChkaWFnbm9zdGljPWRpYWdub3N0aWMpCiAgcHJpbnQobWVzc2FnZSwgZmlsZT1zeXMuc3RkZXJyKQoKZGVmIE1haW4oKToKICBhcmdzID0gc3lzLmFyZ3ZbMTpdCgogIG5ld19lbnYgPSB7fQoKICBpZiBJc1J1bm5pbmdGcm9tWmlwKCk6CiAgICBtb2R1bGVfc3BhY2UgPSBDcmVhdGVNb2R1bGVTcGFjZSgpCiAgZWxzZToKICAgIG1vZHVsZV9zcGFjZSA9IEZpbmRNb2R1bGVTcGFjZSgpCgogIHB5dGhvbl9pbXBvcnRzID0gJ3BpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMCcKICBweXRob25fcGF0aF9lbnRyaWVzID0gQ3JlYXRlUHl0aG9uUGF0aEVudHJpZXMocHl0aG9uX2ltcG9ydHMsIG1vZHVsZV9zcGFjZSkKICBweXRob25fcGF0aF9lbnRyaWVzICs9IEdldFJlcG9zaXRvcmllc0ltcG9ydHMobW9kdWxlX3NwYWNlLCBUcnVlKQoKICBweXRob25fcGF0aF9lbnRyaWVzID0gW0dldFdpbmRvd3NQYXRoV2l0aFVOQ1ByZWZpeChkKSBmb3IgZCBpbiBweXRob25fcGF0aF9lbnRyaWVzXQoKICBvbGRfcHl0aG9uX3BhdGggPSBvcy5lbnZpcm9uLmdldCgnUFlUSE9OUEFUSCcpCiAgcHl0aG9uX3BhdGggPSBvcy5wYXRoc2VwLmpvaW4ocHl0aG9uX3BhdGhfZW50cmllcykKICBpZiBvbGRfcHl0aG9uX3BhdGg6CiAgICBweXRob25fcGF0aCArPSBvcy5wYXRoc2VwICsgb2xkX3B5dGhvbl9wYXRoCgogIGlmIElzV2luZG93cygpOgogICAgcHl0aG9uX3BhdGggPSBweXRob25fcGF0aC5yZXBsYWNlKCIvIiwgb3Muc2VwKQoKICBuZXdfZW52WydQWVRIT05QQVRIJ10gPSBweXRob25fcGF0aAogIHJ1bmZpbGVzX2VudmtleSwgcnVuZmlsZXNfZW52dmFsdWUgPSBSdW5maWxlc0VudnZhcihtb2R1bGVfc3BhY2UpCiAgaWYgcnVuZmlsZXNfZW52a2V5OgogICAgbmV3X2VudltydW5maWxlc19lbnZrZXldID0gcnVuZmlsZXNfZW52dmFsdWUKCiAgIyBOb3cgbG9vayBmb3IgbXkgbWFpbiBweXRob24gc291cmNlIGZpbGUuCiAgIyBUaGUgbWFnaWMgc3RyaW5nIHBlcmNlbnQtbWFpbi1wZXJjZW50IGlzIHJlcGxhY2VkIHdpdGggdGhlIGZpbGVuYW1lIG9mIHRoZQogICMgbWFpbiBmaWxlIG9mIHRoZSBQeXRob24gYmluYXJ5IGluIEJhemVsUHl0aG9uU2VtYW50aWNzLmphdmEuCiAgcmVsX3BhdGggPSAncnVsZXNfcHl0aG9uL3BhY2thZ2luZy93aGwucHknCiAgaWYgSXNXaW5kb3dzKCk6CiAgICByZWxfcGF0aCA9IHJlbF9wYXRoLnJlcGxhY2UoIi8iLCBvcy5zZXApCgogIG1haW5fZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4obW9kdWxlX3NwYWNlLCByZWxfcGF0aCkKICBtYWluX2ZpbGVuYW1lID0gR2V0V2luZG93c1BhdGhXaXRoVU5DUHJlZml4KG1haW5fZmlsZW5hbWUpCiAgYXNzZXJ0IG9zLnBhdGguZXhpc3RzKG1haW5fZmlsZW5hbWUpLCBcCiAgICAgICAgICdDYW5ub3QgZXhlYygpICVyOiBmaWxlIG5vdCBmb3VuZC4nICUgbWFpbl9maWxlbmFtZQogIGFzc2VydCBvcy5hY2Nlc3MobWFpbl9maWxlbmFtZSwgb3MuUl9PSyksIFwKICAgICAgICAgJ0Nhbm5vdCBleGVjKCkgJXI6IGZpbGUgbm90IHJlYWRhYmxlLicgJSBtYWluX2ZpbGVuYW1lCgogIHByb2dyYW0gPSBweXRob25fcHJvZ3JhbSA9IEZpbmRQeXRob25CaW5hcnkobW9kdWxlX3NwYWNlKQogIGlmIHB5dGhvbl9wcm9ncmFtIGlzIE5vbmU6CiAgICByYWlzZSBBc3NlcnRpb25FcnJvcignQ291bGQgbm90IGZpbmQgcHl0aG9uIGJpbmFyeTogJyArIFBZVEhPTl9CSU5BUlkpCiAgYXJncyA9IFtweXRob25fcHJvZ3JhbSwgbWFpbl9maWxlbmFtZV0gKyBhcmdzCgogIG9zLmVudmlyb24udXBkYXRlKG5ld19lbnYpCgogIHRyeToKICAgIHN5cy5zdGRvdXQuZmx1c2goKQogICAgaWYgSXNSdW5uaW5nRnJvbVppcCgpOgogICAgICAjIElmIFJVTl9VTkRFUl9SVU5GSUxFUyBlcXVhbHMgMSwgaXQgbWVhbnMgd2UgbmVlZCB0bwogICAgICAjIGNoYW5nZSBkaXJlY3RvcnkgdG8gdGhlIHJpZ2h0IHJ1bmZpbGVzIGRpcmVjdG9yeS4KICAgICAgIyAoU28gdGhhdCB0aGUgZGF0YSBmaWxlcyBhcmUgYWNjZXNzaWJsZSkKICAgICAgaWYgb3MuZW52aXJvbi5nZXQoIlJVTl9VTkRFUl9SVU5GSUxFUyIpID09ICIxIjoKICAgICAgICBvcy5jaGRpcihvcy5wYXRoLmpvaW4obW9kdWxlX3NwYWNlLCAicnVsZXNfcHl0aG9uIikpCiAgICAgIHJldF9jb2RlID0gc3VicHJvY2Vzcy5jYWxsKGFyZ3MpCiAgICAgIHNodXRpbC5ybXRyZWUob3MucGF0aC5kaXJuYW1lKG1vZHVsZV9zcGFjZSksIFRydWUpCiAgICAgIE1heWJlRW1pdEhvc3RWZXJzaW9uV2FybmluZyhyZXRfY29kZSkKICAgICAgc3lzLmV4aXQocmV0X2NvZGUpCiAgICBlbHNlOgogICAgICAjIE9uIFdpbmRvd3MsIG9zLmV4ZWN2IGRvZXNuJ3QgaGFuZGxlIGFyZ3VtZW50cyB3aXRoIHNwYWNlcyBjb3JyZWN0bHksCiAgICAgICMgYW5kIGl0IGFjdHVhbGx5IHN0YXJ0cyBhIHN1YnByb2Nlc3MganVzdCBsaWtlIHN1YnByb2Nlc3MuY2FsbC4KICAgICAgIwogICAgICAjIElmIHdlIG1heSBuZWVkIHRvIGVtaXQgYSBob3N0IGNvbmZpZyB3YXJuaW5nIGFmdGVyIGV4ZWN1dGlvbiwgZG9uJ3QKICAgICAgIyBleGVjdiBiZWNhdXNlIHdlIG5lZWQgY29udHJvbCB0byByZXR1cm4gaGVyZS4gVGhpcyBvbmx5IGhhcHBlbnMgZm9yCiAgICAgICMgdGFyZ2V0cyBidWlsdCBpbiB0aGUgaG9zdCBjb25maWcsIHNvIG90aGVyIHRhcmdldHMgc3RpbGwgZ2V0IHRvIHRha2UKICAgICAgIyBhZHZhbnRhZ2Ugb2YgdGhlIHBlcmZvcm1hbmNlIGJlbmVmaXRzIG9mIGV4ZWN2LgogICAgICBpZiBJc1dpbmRvd3MoKSBvciBGYWxzZToKICAgICAgICByZXRfY29kZSA9IHN1YnByb2Nlc3MuY2FsbChhcmdzKQogICAgICAgIE1heWJlRW1pdEhvc3RWZXJzaW9uV2FybmluZyhyZXRfY29kZSkKICAgICAgICBzeXMuZXhpdChyZXRfY29kZSkKICAgICAgZWxzZToKICAgICAgICBvcy5leGVjdihhcmdzWzBdLCBhcmdzKQogIGV4Y2VwdCBFbnZpcm9ubWVudEVycm9yOgogICAgIyBUaGlzIHdvcmtzIGZyb20gUHl0aG9uIDIuNCBhbGwgdGhlIHdheSB0byAzLnguCiAgICBlID0gc3lzLmV4Y19pbmZvKClbMV0KICAgICMgVGhpcyBleGNlcHRpb24gb2NjdXJzIHdoZW4gb3MuZXhlY3YoKSBmYWlscyBmb3Igc29tZSByZWFzb24uCiAgICBpZiBub3QgZ2V0YXR0cihlLCAnZmlsZW5hbWUnLCBOb25lKToKICAgICAgZS5maWxlbmFtZSA9IHByb2dyYW0gICMgQWRkIGluZm8gdG8gZXJyb3IgbWVzc2FnZQogICAgcmFpc2UKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgTWFpbigpClBLAwQUAAAAAAAAACEAAAAAAAAAAAAAAAAAEgAAAHN1YnBhci9fX2luaXRfXy5weVBLAwQUAAAAAAAAACEAAAAAAAAAAAAAAAAAGgAAAHN1YnBhci9ydW50aW1lL19faW5pdF9fLnB5UEsDBBQAAAAAAAAAIQCPoHM8ty4AALcuAAAZAAAAc3VicGFyL3J1bnRpbWUvc3VwcG9ydC5weSMgQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwojIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIwojICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIwojIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAojIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgojIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCiIiIlJ1bnRpbWUgc3VwcG9ydCBjb2RlIGZvciBleGVjdXRhYmxlcyBjcmVhdGVkIGJ5IFN1YnBhci4KCjEuIFRoaXJkLXBhcnR5IG1vZHVsZXMgcmVxdWlyZSBzb21lIFBZVEhPTlBBVEggbWFuaXB1bGF0aW9uLgoKMi4gUHl0aG9uIGNhbiBuYXRpdmVseSBpbXBvcnQgcHl0aG9uIG1vZHVsZXMgZnJvbSBhIHppcCBhcmNoaXZlLCBidXQKICAgQyBleHRlbnNpb24gbW9kdWxlcyByZXF1aXJlIHNvbWUgaGVscC4KCjMuIFJlc291cmNlcyBzdG9yZWQgaW4gYSAucGFyIGZpbGUgbWF5IG5lZWQgdG8gYmUgZXhwb3NlZCBhcyBPUy1sZXZlbAogICBmaWxlcyBpbnN0ZWFkIG9mIFB5dGhvbiBGaWxlIG9iamVjdHMuCgpXZSBob29rIGludG8gdGhlIHBrZ19yZXNvdXJjZXMgbW9kdWxlLCBpZiBwcmVzZW50LCB0byBhY2hpZXZlIDIgYW5kIDMuCgpMaW1pdGF0aW9uczoKCkEuIFJldHJpZXZpbmcgcmVzb3VyY2VzIGZyb20gcGFja2FnZXMKCkl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBkbyB0aGlzOgogICAgZm4gPSBwa2dfcmVzb3VyY2VzLnJlc291cmNlX2ZpbGVuYW1lKCdteXBhY2thZ2UnLCAnbXlmaWxlJykKQnV0IGluc3RlYWQgb25lIG11c3QgZG8KICAgIGZuID0gcGtnX3Jlc291cmNlcy5yZXNvdXJjZV9maWxlbmFtZSgKICAgICAgICAgICAgIHBrZ19yZXNvdXJjZXMuUmVxdWlyZW1lbnQucGFyc2Uuc3BlYygnbXlwYWNrYWdlJyksCiAgICAgICAgICAgICAnbXlmaWxlJykKCkIuIEV4dHJhY3Rpb24gZGlyCgpZb3Ugc2hvdWxkIGV4cGxpY2l0bHkgc2V0IHRoZSBkZWZhdWx0IGV4dHJhY3Rpb24gZGlyZWN0b3J5LCB2aWEKYHBrZ19yZXNvdXJjZXMuc2V0X2V4dHJhY3Rpb25fcGF0aChteV9kaXJlY3RvcnkpYCwgc2luY2UgdGhlIGRlZmF1bHQKaXMgbm90IHNhZmUuICBGb3IgZXhhbXBsZToKCiAgICB0bXBkaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKICAgIHBrZ19yZXNvdXJjZXMuc2V0X2V4dHJhY3Rpb24odG1wZGlyKQoKWW91IHNob3VsZCBhcnJhbmdlIGZvciB0aGF0IGRpcmVjdG9yeSB0byBiZSBkZWxldGVkIGF0IHNvbWUgcG9pbnQuCk5vdGUgdGhhdCBwa2dfcmVzb3VyY2VzLmNsZWFudXBfcmVzb3VyY2VzKCkgaXMgYW4gdW5pbXBsZW1lbnRlZCBuby1vcCwKc28gdXNlIHNvbWV0aGluZyBlbHNlLiAgRm9yIGV4YW1wbGU6CgogICAgYXRleGl0LnJlZ2lzdGVyKGxhbWJkYTogc2h1dGlsLnJtdHJlZSh0bXBkaXIsIGlnbm9yZV9lcnJvcnM9VHJ1ZSkpCgoiIiIKCmltcG9ydCBhdGV4aXQKaW1wb3J0IG9zCmltcG9ydCBwa2d1dGlsCmltcG9ydCBzaHV0aWwKaW1wb3J0IHN5cwppbXBvcnQgdGVtcGZpbGUKaW1wb3J0IHdhcm5pbmdzCmltcG9ydCB6aXBmaWxlCmltcG9ydCB6aXBpbXBvcnQKCgpkZWYgX2xvZyhtc2cpOgogICAgIiIiUHJpbnQgYSBkZWJ1Z2dpbmcgbWVzc2FnZSBpbiB0aGUgc2FtZSBmb3JtYXQgYXMgcHl0aG9uIC12diBvdXRwdXQiIiIKICAgIGlmIHN5cy5mbGFncy52ZXJib3NlOgogICAgICAgIHN5cy5zdGRlcnIud3JpdGUobXNnKQogICAgICAgIHN5cy5zdGRlcnIud3JpdGUoJ1xuJykKCgpkZWYgX2ZpbmRfYXJjaGl2ZSgpOgogICAgIiIiRmluZCB0aGUgcGF0aCB0byB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyAucGFyIGZpbGUKCiAgICBXZSBkb24ndCBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgcHJlZml4IGlzIG5vbi1lbXB0eS4KICAgICIiIgogICAgbWFpbiA9IHN5cy5tb2R1bGVzLmdldCgnX19tYWluX18nKQogICAgaWYgbm90IG1haW46CiAgICAgICAgX2xvZygnIyBfX21haW5fXyBtb2R1bGUgbm90IGZvdW5kJykKICAgICAgICByZXR1cm4gTm9uZQogICAgbWFpbl9sb2FkZXIgPSBnZXRhdHRyKG1haW4sICdfX2xvYWRlcl9fJykKICAgIGlmIG5vdCBtYWluX2xvYWRlcjoKICAgICAgICBfbG9nKCcjIF9fbWFpbl9fLl9fbG9hZGVyX18gbm90IHNldCcpCiAgICAgICAgcmV0dXJuIE5vbmUKICAgIHByZWZpeCA9IGdldGF0dHIobWFpbl9sb2FkZXIsICdwcmVmaXgnKQogICAgaWYgcHJlZml4ICE9ICcnOgogICAgICAgIF9sb2coJyMgdW5leHBlY3RlZCBwcmVmaXggZm9yIF9fbWFpbl9fLl9fbG9hZGVyX18gaXMgJXMnICUKICAgICAgICAgICAgIG1haW5fbG9hZGVyLnByZWZpeCkKICAgICAgICByZXR1cm4gTm9uZQogICAgYXJjaGl2ZV9wYXRoID0gZ2V0YXR0cihtYWluX2xvYWRlciwgJ2FyY2hpdmUnKQogICAgaWYgbm90IGFyY2hpdmVfcGF0aDoKICAgICAgICBfbG9nKCcjIG1pc3NpbmcgYXJjaGl2ZSBmb3IgX19tYWluX18uX19sb2FkZXJfXycpCiAgICAgICAgcmV0dXJuIE5vbmUKICAgIHJldHVybiBhcmNoaXZlX3BhdGgKCgpkZWYgX2V4dHJhY3RfZmlsZXMoYXJjaGl2ZV9wYXRoKToKICAgICIiIkV4dHJhY3QgdGhlIGNvbnRlbnRzIG9mIHRoaXMgLnBhciBmaWxlIHRvIGRpc2suCgogICAgVGhpcyBjcmVhdGVzIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSwgYW5kIHJlZ2lzdGVycyBhbiBhdGV4aXQKICAgIGhhbmRsZXIgdG8gY2xlYW4gdGhhdCBkaXJlY3Rvcnkgb24gcHJvZ3JhbSBleGl0LiAgRXh0cmFjdGlvbiBhbmQKICAgIGNsZWFudXAgd2lsbCBwb3RlbnRpYWxseSB1c2Ugc2lnbmlmaWNhbnQgdGltZSBhbmQgZGlzayBzcGFjZS4KCiAgICBSZXR1cm5zOgogICAgICAgIERpcmVjdG9yeSB3aGVyZSBjb250ZW50cyB3ZXJlIGV4dHJhY3RlZCB0by4KICAgICIiIgogICAgZXh0cmFjdF9kaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKCiAgICBkZWYgX2V4dHJhY3RfZmlsZXNfY2xlYW51cCgpOgogICAgICAgIHNodXRpbC5ybXRyZWUoZXh0cmFjdF9kaXIsIGlnbm9yZV9lcnJvcnM9VHJ1ZSkKICAgIGF0ZXhpdC5yZWdpc3RlcihfZXh0cmFjdF9maWxlc19jbGVhbnVwKQogICAgX2xvZygnIyBleHRyYWN0aW5nICVzIHRvICVzJyAlIChhcmNoaXZlX3BhdGgsIGV4dHJhY3RfZGlyKSkKCiAgICB6aXBfZmlsZSA9IHppcGZpbGUuWmlwRmlsZShhcmNoaXZlX3BhdGgsIG1vZGU9J3InKQogICAgemlwX2ZpbGUuZXh0cmFjdGFsbChleHRyYWN0X2RpcikKICAgIHppcF9maWxlLmNsb3NlKCkKCiAgICByZXR1cm4gZXh0cmFjdF9kaXIKCgpkZWYgX3ZlcnNpb25fY2hlY2tfcGtnX3Jlc291cmNlcyhwa2dfcmVzb3VyY2VzKToKICAgICIiIkNoZWNrIHRoYXQgcGtnX3Jlc291cmNlcyBzdXBwb3J0cyB0aGUgQVBJcyB3ZSBuZWVkLiIiIgogICAgIyBDaGVjayB0aGF0IHBrZ19yZXNvdXJjZXMgaXMgbmV3IGVub3VnaC4KICAgICMKICAgICMgRGV0ZXJtaW5pbmcgdGhlIHZlcnNpb24gb2YgYW4gYXJiaXRyYXJpbHkgb2xkIHZlcnNpb24gb2YKICAgICMgcGtnX3Jlc291cmNlcyBpcyB0b3VnaCwgc2luY2UgaXQgZG9lc24ndCBoYXZlIGEgdmVyc2lvbiBsaXRlcmFsLAogICAgIyBhbmQgdGhlIGFjY29tcGFueWluZyBzZXR1cHRvb2xzIHBhY2thZ2UgY29tcHV0ZXMgaXRzIHZlcnNpb24KICAgICMgZHluYW1pY2FsbHkgZnJvbSBtZXRhZGF0YSB0aGF0IG1pZ2h0IG5vdCBleGlzdC4gIEFsc28gc2V0dXB0b29scwogICAgIyBtaWdodCBub3QgZXhpc3QsIGVzcGVjaWFsbHkgaW4gdGhlIGNhc2Ugb2YgdGhlIHBpcC12ZW5kb3JlZCBjb3B5CiAgICAjIG9mIHBrZ19yZXNvdXJjZXMuCiAgICAjCiAgICAjIFdlIGRvIGEgZmVhdHVyZSBkZXRlY3Rpb24gaW5zdGVhZC4gIFdlIGV4YW1pbmUKICAgICMgcGtnX3Jlc291cmNlcy5Xb3JraW5nU2V0LmFkZCwgYW5kIHNlZSBpZiBpdCBoYXMgYXQgbGVhc3QgdGhlCiAgICAjIHRoaXJkIGRlZmF1bHQgYXJndW1lbnQgKCdyZXBsYWNlJykuCiAgICB0cnk6CiAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA8IDM6CiAgICAgICAgICAgIGRlZmF1bHRzID0gcGtnX3Jlc291cmNlcy5Xb3JraW5nU2V0LmFkZC5pbV9mdW5jLmZ1bmNfZGVmYXVsdHMKICAgICAgICBlbHNlOgogICAgICAgICAgICBkZWZhdWx0cyA9IHBrZ19yZXNvdXJjZXMuV29ya2luZ1NldC5hZGQuX19kZWZhdWx0c19fCiAgICAgICAgcmV0dXJuIGxlbihkZWZhdWx0cykgPj0gMwogICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgIHJldHVybiBGYWxzZQoKCmRlZiBfc2V0dXBfcGtnX3Jlc291cmNlcyhwa2dfcmVzb3VyY2VzX25hbWUpOgogICAgIiIiU2V0dXAgaG9va3MgaW50byB0aGUgYHBrZ19yZXNvdXJjZXNgIG1vZHVsZQoKICAgIFRoaXMgZW5hYmxlcyB0aGUgcGtnX3Jlc291cmNlcyBtb2R1bGUgdG8gZmluZCBtZXRhZGF0YSBmcm9tIHdoZWVscwogICAgdGhhdCBoYXZlIGJlZW4gaW5jbHVkZWQgaW4gdGhpcyAucGFyIGZpbGUuCgogICAgVGhlIGZ1bmN0aW9ucyBhbmQgY2xhc3NlcyBoZXJlIGFyZSBzY29wZWQgdG8gdGhpcyBmdW5jdGlvbiwgc2luY2UKICAgIHdlIG1pZ2h0IGhhdmUgbXVsdGl0cGxlIHBrZ19yZXNvdXJjZXMgbW9kdWxlcywgb3Igbm9uZS4KICAgICIiIgoKICAgIHRyeToKICAgICAgICBfX2ltcG9ydF9fKHBrZ19yZXNvdXJjZXNfbmFtZSkKICAgICAgICBwa2dfcmVzb3VyY2VzID0gc3lzLm1vZHVsZXMuZ2V0KHBrZ19yZXNvdXJjZXNfbmFtZSkKICAgICAgICBpZiBwa2dfcmVzb3VyY2VzIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybgogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICMgU2tpcCBzZXR1cAogICAgICAgIHJldHVybgoKICAgIGlmIG5vdCBfdmVyc2lvbl9jaGVja19wa2dfcmVzb3VyY2VzKHBrZ19yZXNvdXJjZXMpOgogICAgICAgICMgU2tpcCBzZXR1cAogICAgICAgIHJldHVybgoKICAgIGNsYXNzIERpc3RJbmZvTWV0YWRhdGEocGtnX3Jlc291cmNlcy5FZ2dNZXRhZGF0YSk6CiAgICAgICAgIiIiTWV0YWRhdGEgcHJvdmlkZXIgZm9yIHppcCBmaWxlcyBjb250YWluaW5nIC5kaXN0LWluZm8KCiAgICAgICAgSW4gZmluZF9kaXN0X2luZm9faW5femlwKCksIHdlIGNhbGwKICAgICAgICBtZXRhZGF0YS5yZXNvdXJjZV9saXN0ZGlyKGRpcmVjdG9yeV9uYW1lKS4gIEhvd2V2ZXIsIGl0IGRvZXNuJ3QKICAgICAgICB3b3JrIHdpdGggRWdnTWV0YWRhdGEsIGJlY2F1c2UgX3ppcGluZm9fbmFtZSgpIGV4cGVjdHMgdGhlCiAgICAgICAgZGlyZWN0b3J5IG5hbWUgdG8gZW5kIHdpdGggYSAvLCBidXQgbWV0YWRhdGEuX2xpc3RkaXIoKSB3aGljaAogICAgICAgIGV4cGVjdHMgdGhlIGRpcmVjdG9yeSB0byBfbm90XyBlbmQgd2l0aCBhIC8uCgogICAgICAgIFRoZXJlZm9yZSB0aGlzIGNsYXNzIGV4aXN0cy4KICAgICAgICAiIiIKCiAgICAgICAgZGVmIF96aXBpbmZvX25hbWUoc2VsZiwgZnNwYXRoKToKICAgICAgICAgICAgIiIiT3ZlcnJpZGVzIEVnZ01ldGFkYXRhLl96aXBpbmZvX25hbWUiIiIKICAgICAgICAgICAgIyBDb252ZXJ0IGEgdmlydHVhbCBmaWxlbmFtZSAoZnVsbCBwYXRoIHRvIGZpbGUpIGludG8gYQogICAgICAgICAgICAjIHppcGZpbGUgc3VicGF0aCB1c2FibGUgd2l0aCB0aGUgemlwaW1wb3J0IGRpcmVjdG9yeQogICAgICAgICAgICAjIGNhY2hlIGZvciBvdXIgdGFyZ2V0IGFyY2hpdmUKICAgICAgICAgICAgZnNwYXRoID0gZnNwYXRoLnJzdHJpcChvcy5zZXApCiAgICAgICAgICAgIGlmIGZzcGF0aCA9PSBzZWxmLmxvYWRlci5hcmNoaXZlOgogICAgICAgICAgICAgICAgcmV0dXJuICcnCiAgICAgICAgICAgIGlmIGZzcGF0aC5zdGFydHN3aXRoKHNlbGYuemlwX3ByZSk6CiAgICAgICAgICAgICAgICByZXR1cm4gZnNwYXRoW2xlbihzZWxmLnppcF9wcmUpOl0KICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAiJXMgaXMgbm90IGEgc3VicGF0aCBvZiAlcyIgJSAoZnNwYXRoLCBzZWxmLnppcF9wcmUpCiAgICAgICAgICAgICkKCiAgICAgICAgZGVmIF9wYXJ0cyhzZWxmLCB6aXBfcGF0aCk6CiAgICAgICAgICAgICIiIk92ZXJyaWRlcyBFZ2dNZXRhZGF0YS5fcGFydHMiIiIKICAgICAgICAgICAgIyBDb252ZXJ0IGEgemlwZmlsZSBzdWJwYXRoIGludG8gYW4gZWdnLXJlbGF0aXZlIHBhdGggcGFydAogICAgICAgICAgICAjIGxpc3QuCiAgICAgICAgICAgIGZzcGF0aCA9IHNlbGYuemlwX3ByZSArIHppcF9wYXRoCiAgICAgICAgICAgIGlmIGZzcGF0aCA9PSBzZWxmLmVnZ19yb290OgogICAgICAgICAgICAgICAgcmV0dXJuIFtdCiAgICAgICAgICAgIGlmIGZzcGF0aC5zdGFydHN3aXRoKHNlbGYuZWdnX3Jvb3QgKyBvcy5zZXApOgogICAgICAgICAgICAgICAgcmV0dXJuIGZzcGF0aFtsZW4oc2VsZi5lZ2dfcm9vdCkgKyAxOl0uc3BsaXQob3Muc2VwKQogICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigKICAgICAgICAgICAgICAgICIlcyBpcyBub3QgYSBzdWJwYXRoIG9mICVzIiAlIChmc3BhdGgsIHNlbGYuZWdnX3Jvb3QpCiAgICAgICAgICAgICkKCiAgICBkZWYgZmluZF9kaXN0X2luZm9faW5femlwKGltcG9ydGVyLCBwYXRoX2l0ZW0sIG9ubHk9RmFsc2UpOgogICAgICAgICIiIkZpbmQgZGlzdC1pbmZvIHN0eWxlIG1ldGFkYXRhIGluIHppcCBmaWxlcy4KCiAgICAgICAgaW1wb3J0ZXI6IFBFUCAzMDItc3R5bGUgSW1wb3J0ZXIgb2JqZWN0CiAgICAgICAgcGF0aF9pdGVtIChzdHIpOiBmaWxlbmFtZSBvciBwc2V1ZG8tZmlsZW5hbWUgbGlrZToKICAgICAgICAgICAgL3Vzci9zb21lZGlycy9tYWluLnBhcgogICAgICAgICAgICBvcgogICAgICAgICAgICAvdXNyL3NvbWVkaXJzL21haW4ucGFyL3B5cGlfX3BvcnRwaWNrZXJfMV8yXzAKICAgICAgICBvbmx5IChib29sKTogV2UgaWdub3JlIHRoZSBgb25seWAgZmxhZyBiZWNhdXNlIGl0J3Mgbm90IGNsZWFyCiAgICAgICAgICAgIHdoYXQgaXQgc2hvdWxkIGFjdHVhbGx5IGRvIGluIHRoaXMgY2FzZS4KCiAgICAgICAgWWllbGRzIHBrZ19yZXNvdXJjZXMuRGlzdHJpYnV0aW9uIG9iamVjdHMKICAgICAgICAiIiIKICAgICAgICBtZXRhZGF0YSA9IERpc3RJbmZvTWV0YWRhdGEoaW1wb3J0ZXIpCiAgICAgICAgZm9yIHN1Yml0ZW0gaW4gbWV0YWRhdGEucmVzb3VyY2VfbGlzdGRpcignLycpOgogICAgICAgICAgICBiYXNlbmFtZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChzdWJpdGVtKQogICAgICAgICAgICBpZiBleHQubG93ZXIoKSA9PSAnLmRpc3QtaW5mbyc6CiAgICAgICAgICAgICAgICAjIFBhcnNlIGRpc3RyaWJ1dGlvbiBuYW1lCiAgICAgICAgICAgICAgICBtYXRjaCA9IHBrZ19yZXNvdXJjZXMuRUdHX05BTUUoYmFzZW5hbWUpCiAgICAgICAgICAgICAgICBwcm9qZWN0X25hbWUgPSAndW5rbm93bicKICAgICAgICAgICAgICAgIGlmIG1hdGNoOgogICAgICAgICAgICAgICAgICAgIHByb2plY3RfbmFtZSA9IG1hdGNoLmdyb3VwKCduYW1lJykKICAgICAgICAgICAgICAgICMgQ3JlYXRlIG1ldGFkYXRhIG9iamVjdAogICAgICAgICAgICAgICAgc3VicGF0aCA9IG9zLnBhdGguam9pbihwYXRoX2l0ZW0sIHN1Yml0ZW0pCiAgICAgICAgICAgICAgICBzdWJtZXRhID0gRGlzdEluZm9NZXRhZGF0YSgKICAgICAgICAgICAgICAgICAgICB6aXBpbXBvcnQuemlwaW1wb3J0ZXIocGF0aF9pdGVtKSkKICAgICAgICAgICAgICAgICMgT3ZlcnJpZGUgcGtnX3Jlc291cmNlcyBkZWZhdWx0cyB0byBhdm9pZAogICAgICAgICAgICAgICAgIyAicmVzb3VyY2VfZmlsZW5hbWUoKSBvbmx5IHN1cHBvcnRlZCBmb3IgLmVnZywgbm90CiAgICAgICAgICAgICAgICAjIC56aXAiIG1lc3NhZ2UKICAgICAgICAgICAgICAgIHN1Ym1ldGEuZWdnX25hbWUgPSBwcm9qZWN0X25hbWUKICAgICAgICAgICAgICAgIHN1Ym1ldGEuZWdnX2luZm8gPSBzdWJwYXRoCiAgICAgICAgICAgICAgICBzdWJtZXRhLmVnZ19yb290ID0gcGF0aF9pdGVtCiAgICAgICAgICAgICAgICBkaXN0ID0gcGtnX3Jlc291cmNlcy5EaXN0cmlidXRpb24uZnJvbV9sb2NhdGlvbigKICAgICAgICAgICAgICAgICAgICBwYXRoX2l0ZW0sIHN1Yml0ZW0sIHN1Ym1ldGEpCiAgICAgICAgICAgICAgICB5aWVsZCBkaXN0CgogICAgZGVmIGZpbmRfZWdnc19hbmRfZGlzdF9pbmZvX2luX3ppcChpbXBvcnRlciwgcGF0aF9pdGVtLCBvbmx5PUZhbHNlKToKICAgICAgICAiIiJDaGFpbiB0b2dldGhlciBvdXIgZmluZGVyIGFuZCB0aGUgc3RhbmRhcmQgcGtnX3Jlc291cmNlcyBmaW5kZXIKCiAgICAgICAgRm9yIHNpbXBsaWNpdHksIGFuZCBzaW5jZSBwa2dfcmVzb3VyY2VzIGRvZXNuJ3QgcHJvdmlkZSBhIHB1YmxpYwogICAgICAgIGludGVyZmFjZSB0byBkbyBzbywgd2UgaGFyZGNvZGUgdGhlIGNoYWluaW5nIChmaW5kX2VnZ3NfaW5femlwKS4KICAgICAgICAiIiIKICAgICAgICAjIE91ciBmaW5kZXIKICAgICAgICBmb3IgZGlzdCBpbiBmaW5kX2Rpc3RfaW5mb19pbl96aXAoaW1wb3J0ZXIsIHBhdGhfaXRlbSwgb25seSk6CiAgICAgICAgICAgIHlpZWxkIGRpc3QKICAgICAgICAjIFRoZSBzdGFuZGFyZCBwa2dfcmVzb3VyY2VzIGZpbmRlcgogICAgICAgIGZvciBkaXN0IGluIHBrZ19yZXNvdXJjZXMuZmluZF9lZ2dzX2luX3ppcChpbXBvcnRlciwgcGF0aF9pdGVtLCBvbmx5KToKICAgICAgICAgICAgeWllbGQgZGlzdAogICAgICAgIHJldHVybgoKICAgICMgVGhpcyBvdmVyd3JpdGVzIHRoZSBleGlzdGluZyByZWdpc3RlcmVkIGZpbmRlci4KICAgIHBrZ19yZXNvdXJjZXMucmVnaXN0ZXJfZmluZGVyKHppcGltcG9ydC56aXBpbXBvcnRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRfZWdnc19hbmRfZGlzdF9pbmZvX2luX3ppcCkKCiAgICAjIE5vdGUgdGhhdCB0aGUgZGVmYXVsdCBXb3JraW5nU2V0IGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZCwgYW5kCiAgICAjIHRoZXJlIGlzIG5vIHB1YmxpYyBpbnRlcmZhY2UgdG8gZWFzaWx5IHJlZnJlc2gvcmVsb2FkIGl0IHRoYXQKICAgICMgZG9lc24ndCBhbHNvIGhhdmUgYSAiRG9uJ3QgdXNlIHRoaXMiIHdhcm5pbmcuICBTbyB3ZSBtYW51YWxseQogICAgIyBhZGQganVzdCB0aGUgZW50cmllcyB3ZSBrbm93IGFib3V0IHRvIHRoZSBleGlzdGluZyBXb3JraW5nU2V0LgogICAgZm9yIGVudHJ5IGluIHN5cy5wYXRoOgogICAgICAgIGltcG9ydGVyID0gcGtndXRpbC5nZXRfaW1wb3J0ZXIoZW50cnkpCiAgICAgICAgaWYgaXNpbnN0YW5jZShpbXBvcnRlciwgemlwaW1wb3J0LnppcGltcG9ydGVyKToKICAgICAgICAgICAgZm9yIGRpc3QgaW4gZmluZF9kaXN0X2luZm9faW5femlwKGltcG9ydGVyLCBlbnRyeSwgb25seT1UcnVlKToKICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZGlzdC5fcHJvdmlkZXIsIERpc3RJbmZvTWV0YWRhdGEpOgogICAgICAgICAgICAgICAgICAgIHBrZ19yZXNvdXJjZXMud29ya2luZ19zZXQuYWRkKGRpc3QsIGVudHJ5LCBpbnNlcnQ9RmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZT1UcnVlKQoKCmRlZiBfaW5pdGlhbGl6ZV9pbXBvcnRfcGF0aChpbXBvcnRfcm9vdHMsIGltcG9ydF9wcmVmaXgpOgogICAgIiIiQWRkIGV4dHJhIGVudHJpZXMgdG8gUFlUSE9OUEFUSCBzbyB0aGF0IG1vZHVsZXMgY2FuIGJlIGltcG9ydGVkLiIiIgogICAgIyBXZSB0cnkgdG8gbWF0Y2ggdG8gb3JkZXIgb2YgQmF6ZWwncyBzdHViCiAgICBmdWxsX3Jvb3RzID0gWwogICAgICAgIG9zLnBhdGguam9pbihpbXBvcnRfcHJlZml4LCBpbXBvcnRfcm9vdCkKICAgICAgICBmb3IgaW1wb3J0X3Jvb3QgaW4gaW1wb3J0X3Jvb3RzXQogICAgc3lzLnBhdGhbMToxXSA9IGZ1bGxfcm9vdHMKICAgIF9sb2coJyMgYWRkaW5nICVzIHRvIHN5cy5wYXRoJyAlIGZ1bGxfcm9vdHMpCgoKZGVmIHNldHVwKGltcG9ydF9yb290cywgemlwX3NhZmUpOgogICAgIiIiSW5pdGlhbGl6ZSBzdWJwYXIgcnVuLXRpbWUgc3VwcG9ydAoKICAgIEFyZ3M6CiAgICAgIGltcG9ydF9yb290IChsaXN0KTogc3ViZGlycyBpbnNpZGUgLnBhciBmaWxlIHRvIGFkZCB0byB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUgaW1wb3J0IHBhdGggYXQgcnVudGltZS4KICAgICAgemlwX3NhZmUgKGJvb2wpOiBJZiBGYWxzZSwgZXh0cmFjdCB0aGUgLnBhciBmaWxlIGNvbnRlbnRzIHRvIGEKICAgICAgICAgICAgICAgICAgICAgICB0ZW1wb3JhcnkgZGlyZWN0b3J5LCBhbmQgaW1wb3J0IGV2ZXJ5dGhpbmcgZnJvbQogICAgICAgICAgICAgICAgICAgICAgIHRoYXQgZGlyZWN0b3J5LgoKICAgIFJldHVybnM6CiAgICAgIFRydWUgaWYgc2V0dXAgd2FzIHN1Y2Nlc3NmdWwsIGVsc2UgRmFsc2UKICAgICIiIgogICAgYXJjaGl2ZV9wYXRoID0gX2ZpbmRfYXJjaGl2ZSgpCiAgICBpZiBub3QgYXJjaGl2ZV9wYXRoOgogICAgICAgIHdhcm5pbmdzLndhcm4oJ0ZhaWxlZCB0byBpbml0aWFsaXplIC5wYXIgZmlsZSBydW50aW1lIHN1cHBvcnQnLAogICAgICAgICAgICAgICAgICAgICAgVXNlcldhcm5pbmcpCiAgICAgICAgcmV0dXJuIEZhbHNlCiAgICBpZiBvcy5wYXRoLmFic3BhdGgoc3lzLnBhdGhbMF0pICE9IG9zLnBhdGguYWJzcGF0aChhcmNoaXZlX3BhdGgpOgogICAgICAgIHdhcm5pbmdzLndhcm4oJ0ZhaWxlZCB0byBpbml0aWFsaXplIC5wYXIgZmlsZSBydW50aW1lIHN1cHBvcnQuICcgKwogICAgICAgICAgICAgICAgICAgICAgJ2FyY2hpdmVfcGF0aCB3YXMgJXIsIHN5cy5wYXRoIHdhcyAlcicgJSAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJjaGl2ZV9wYXRoLCBzeXMucGF0aCksCiAgICAgICAgICAgICAgICAgICAgICBVc2VyV2FybmluZykKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAjIEV4dHJhY3QgZmlsZXMgdG8gZGlzayBpZiBuZWNlc3NhcnkKICAgIGlmIG5vdCB6aXBfc2FmZToKICAgICAgICBleHRyYWN0X2RpciA9IF9leHRyYWN0X2ZpbGVzKGFyY2hpdmVfcGF0aCkKICAgICAgICAjIHN5cy5wYXRoWzBdIGlzIHRoZSBuYW1lIG9mIHRoZSBleGVjdXRpbmcgLnBhciBmaWxlLiAgUG9pbnQKICAgICAgICAjIGl0IHRvIHRoZSBleHRyYWN0IGRpcmVjdG9yeSBpbnN0ZWFkLCBzbyB0aGF0IFB5dGhvbiBzZWFyY2hlcwogICAgICAgICMgdGhlcmUgZm9yIGltcG9ydHMuCiAgICAgICAgc3lzLnBhdGhbMF0gPSBleHRyYWN0X2RpcgogICAgICAgIGltcG9ydF9wcmVmaXggPSBleHRyYWN0X2RpcgogICAgZWxzZTogICMgSW1wb3J0IGRpcmVjdGx5IGZyb20gLnBhciBmaWxlCiAgICAgICAgZXh0cmFjdF9kaXIgPSBOb25lCiAgICAgICAgaW1wb3J0X3ByZWZpeCA9IGFyY2hpdmVfcGF0aAoKICAgICMgSW5pdGlhbGl6ZSBpbXBvcnQgcGF0aAogICAgX2luaXRpYWxpemVfaW1wb3J0X3BhdGgoaW1wb3J0X3Jvb3RzLCBpbXBvcnRfcHJlZml4KQoKICAgICMgQWRkIGhvb2sgZm9yIHBhY2thZ2UgbWV0YWRhdGEKICAgIF9zZXR1cF9wa2dfcmVzb3VyY2VzKCdwa2dfcmVzb3VyY2VzJykKICAgIF9zZXR1cF9wa2dfcmVzb3VyY2VzKCdwaXAuX3ZlbmRvci5wa2dfcmVzb3VyY2VzJykKCiAgICByZXR1cm4gVHJ1ZQpQSwECFAMUAAAAAAAAACEAAAAAAAAAAAAAAAAACwAAAAAAAAAAAAAAAAAXAAAAX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAwX/1g5YXAACWFwAACwAAAAAAAAAAAAAAAABAAAAAX19tYWluX18ucHlQSwECFAMUAAAAAAAAACEATzlpVeINAADiDQAAJgAAAAAAAAAAAAAAAAD/FwAAYmF6ZWxfdG9vbHMvdG9vbHMvcHl0aG9uL3B5M3dyYXBwZXIuc2hQSwECFAMUAAAAAAAAACEAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAlJgAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAFxPukV+AAAAfgAAADQAAAAAAAAAAAAAAAAAcyYAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9lYXN5X2luc3RhbGwucHlQSwECFAMUAAAAAAAAACEAHGyyTz2nAQA9pwEAPgAAAAAAAAAAAAAAAABDJwAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3BrZ19yZXNvdXJjZXMvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAAAAAAAAAAAAAAAAARgAAAAAAAAAAAAAAAADczgEAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQCG82HUfWAAAH1gAABFAAAAAAAAAAAAAAAAAEDPAQBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvcGtnX3Jlc291cmNlcy9fdmVuZG9yL2FwcGRpcnMucHlQSwECFAMUAAAAAAAAACEAPClYxtACAADQAgAAUQAAAAAAAAAAAAAAAAAgMAIAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvX19hYm91dF9fLnB5UEsBAhQDFAAAAAAAAAAhAIF2lsoBAgAAAQIAAFAAAAAAAAAAAAAAAAAAXzMCAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAOZpSuNcAwAAXAMAAE8AAAAAAAAAAAAAAAAAzjUCAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL19jb21wYXQucHlQSwECFAMUAAAAAAAAACEA+v2kEogFAACIBQAAUwAAAAAAAAAAAAAAAACXOQIAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvX3N0cnVjdHVyZXMucHlQSwECFAMUAAAAAAAAACEAMPgT3DggAAA4IAAATwAAAAAAAAAAAAAAAACQPwIAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvbWFya2Vycy5weVBLAQIUAxQAAAAAAAAAIQClhh3bAxEAAAMRAABUAAAAAAAAAAAAAAAAADVgAgBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9yZXF1aXJlbWVudHMucHlQSwECFAMUAAAAAAAAACEAfEWDjHltAAB5bQAAUgAAAAAAAAAAAAAAAACqcQIAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvc3BlY2lmaWVycy5weVBLAQIUAxQAAAAAAAAAIQDF6icPpQEAAKUBAABNAAAAAAAAAAAAAAAAAJPfAgBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy91dGlscy5weVBLAQIUAxQAAAAAAAAAIQAO78ahJC0AACQtAABPAAAAAAAAAAAAAAAAAKPhAgBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy92ZXJzaW9uLnB5UEsBAhQDFAAAAAAAAAAhAGYPhLF3igMAd4oDAEcAAAAAAAAAAAAAAAAANA8DAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvcHlwYXJzaW5nLnB5UEsBAhQDFAAAAAAAAAAhAJlYTVqSdQAAknUAAEEAAAAAAAAAAAAAAAAAEJoGAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9wa2dfcmVzb3VyY2VzL192ZW5kb3Ivc2l4LnB5UEsBAhQDFAAAAAAAAAAhAPOd8sHCCQAAwgkAAEUAAAAAAAAAAAAAAAAAARAHAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9wa2dfcmVzb3VyY2VzL2V4dGVybi9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQCLwJJGLgIAAC4CAABAAAAAAAAAAAAAAAAAACYaBwBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvcGtnX3Jlc291cmNlcy9weTMxY29tcGF0LnB5UEsBAhQDFAAAAAAAAAAhAFDXqwc2BAAANgQAAEgAAAAAAAAAAAAAAAAAshwHAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzLTQ0LjAuMC5kaXN0LWluZm8vTElDRU5TRVBLAQIUAxQAAAAAAAAAIQAxkN6geA4AAHgOAABJAAAAAAAAAAAAAAAAAE4hBwBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy00NC4wLjAuZGlzdC1pbmZvL01FVEFEQVRBUEsBAhQDFAAAAAAAAAAhAHPPiYUoIwAAKCMAAEcAAAAAAAAAAAAAAAAALTAHAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzLTQ0LjAuMC5kaXN0LWluZm8vUkVDT1JEUEsBAhQDFAAAAAAAAAAhAKrgRvZuAAAAbgAAAEYAAAAAAAAAAAAAAAAAulMHAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzLTQ0LjAuMC5kaXN0LWluZm8vV0hFRUxQSwECFAMUAAAAAAAAACEAN9lf3e8AAADvAAAAVQAAAAAAAAAAAAAAAACMVAcAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMtNDQuMC4wLmRpc3QtaW5mby9kZXBlbmRlbmN5X2xpbmtzLnR4dFBLAQIUAxQAAAAAAAAAIQCsdR8IhgwAAIYMAABRAAAAAAAAAAAAAAAAAO5VBwBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy00NC4wLjAuZGlzdC1pbmZvL2VudHJ5X3BvaW50cy50eHRQSwECFAMUAAAAAAAAACEAMFwBkSYAAAAmAAAATgAAAAAAAAAAAAAAAADjYgcAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMtNDQuMC4wLmRpc3QtaW5mby90b3BfbGV2ZWwudHh0UEsBAhQDFAAAAAAAAAAhAJMG1zIBAAAAAQAAAEkAAAAAAAAAAAAAAAAAdWMHAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzLTQ0LjAuMC5kaXN0LWluZm8vemlwLXNhZmVQSwECFAMUAAAAAAAAACEA0cDf6nMcAABzHAAAOwAAAAAAAAAAAAAAAADdYwcAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEADqwSStoAAADaAAAARwAAAAAAAAAAAAAAAACpgAcAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvX2RlcHJlY2F0aW9uX3dhcm5pbmcucHlQSwECFAMUAAAAAAAAACEAWxREjq8IAACvCAAANwAAAAAAAAAAAAAAAADogQcAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvX2ltcC5weVBLAQIUAxQAAAAAAAAAIQAAAAAAAAAAAAAAAABDAAAAAAAAAAAAAAAAAOyKBwBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9fdmVuZG9yL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAETDKgMaOwAAGjsAAEYAAAAAAAAAAAAAAAAATYsHAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL192ZW5kb3Ivb3JkZXJlZF9zZXQucHlQSwECFAMUAAAAAAAAACEAitd/0OgCAADoAgAATgAAAAAAAAAAAAAAAADLxgcAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvX3ZlbmRvci9wYWNrYWdpbmcvX19hYm91dF9fLnB5UEsBAhQDFAAAAAAAAAAhAGUbEUQyAgAAMgIAAE0AAAAAAAAAAAAAAAAAH8oHAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL192ZW5kb3IvcGFja2FnaW5nL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAGaK2uNhAwAAYQMAAEwAAAAAAAAAAAAAAAAAvMwHAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL192ZW5kb3IvcGFja2FnaW5nL19jb21wYXQucHlQSwECFAMUAAAAAAAAACEAa48clYgFAACIBQAAUAAAAAAAAAAAAAAAAACH0AcAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvX3ZlbmRvci9wYWNrYWdpbmcvX3N0cnVjdHVyZXMucHlQSwECFAMUAAAAAAAAACEALzniskwgAABMIAAATAAAAAAAAAAAAAAAAAB91gcAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvX3ZlbmRvci9wYWNrYWdpbmcvbWFya2Vycy5weVBLAQIUAxQAAAAAAAAAIQA4+ldchhIAAIYSAABRAAAAAAAAAAAAAAAAADP3BwBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9fdmVuZG9yL3BhY2thZ2luZy9yZXF1aXJlbWVudHMucHlQSwECFAMUAAAAAAAAACEA8ohG04JsAACCbAAATwAAAAAAAAAAAAAAAAAoCggAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvX3ZlbmRvci9wYWNrYWdpbmcvc3BlY2lmaWVycy5weVBLAQIUAxQAAAAAAAAAIQDz9of/hTIAAIUyAABJAAAAAAAAAAAAAAAAABd3CABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9fdmVuZG9yL3BhY2thZ2luZy90YWdzLnB5UEsBAhQDFAAAAAAAAAAhAGE9rZ3wBQAA8AUAAEoAAAAAAAAAAAAAAAAAA6oIAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL192ZW5kb3IvcGFja2FnaW5nL3V0aWxzLnB5UEsBAhQDFAAAAAAAAAAhAPEzcuvKLgAAyi4AAEwAAAAAAAAAAAAAAAAAW7AIAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL192ZW5kb3IvcGFja2FnaW5nL3ZlcnNpb24ucHlQSwECFAMUAAAAAAAAACEAZg+EsXeKAwB3igMARAAAAAAAAAAAAAAAAACP3wgAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvX3ZlbmRvci9weXBhcnNpbmcucHlQSwECFAMUAAAAAAAAACEAmVhNWpJ1AACSdQAAPgAAAAAAAAAAAAAAAABoagwAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvX3ZlbmRvci9zaXgucHlQSwECFAMUAAAAAAAAACEApYdlUcAZAADAGQAAPwAAAAAAAAAAAAAAAABW4AwAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvYXJjaGl2ZV91dGlsLnB5UEsBAhQDFAAAAAAAAAAhAMa1smN9JQAAfSUAAD0AAAAAAAAAAAAAAAAAc/oMAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2J1aWxkX21ldGEucHlQSwECFAMUAAAAAAAAACEA9YZ6aQAAAQAAAAEAOgAAAAAAAAAAAAAAAABLIA0AcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvY2xpLTMyLmV4ZVBLAQIUAxQAAAAAAAAAIQBicM7bACQBAAAkAQA6AAAAAAAAAAAAAAAAAKMgDgBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9jbGktNjQuZXhlUEsBAhQDFAAAAAAAAAAhAPWGemkAAAEAAAABADcAAAAAAAAAAAAAAAAA+0QPAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2NsaS5leGVQSwECFAMUAAAAAAAAACEAFu8ZBTgCAAA4AgAAQwAAAAAAAAAAAAAAAABQRRAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvY29tbWFuZC9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQBQ+CPyegkAAHoJAABAAAAAAAAAAAAAAAAAAOlHEABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9jb21tYW5kL2FsaWFzLnB5UEsBAhQDFAAAAAAAAAAhAJxsOTAJRwAACUcAAEQAAAAAAAAAAAAAAAAAwVEQAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2NvbW1hbmQvYmRpc3RfZWdnLnB5UEsBAhQDFAAAAAAAAAAhAOvSdBbkBQAA5AUAAEQAAAAAAAAAAAAAAAAALJkQAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2NvbW1hbmQvYmRpc3RfcnBtLnB5UEsBAhQDFAAAAAAAAAAhACCMdRR9AgAAfQIAAEgAAAAAAAAAAAAAAAAAcp8QAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2NvbW1hbmQvYmRpc3Rfd2luaW5zdC5weVBLAQIUAxQAAAAAAAAAIQAnGo0bhBEAAIQRAABFAAAAAAAAAAAAAAAAAFWiEABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9jb21tYW5kL2J1aWxkX2NsaWIucHlQSwECFAMUAAAAAAAAACEAjSj9cNsyAADbMgAARAAAAAAAAAAAAAAAAAA8tBAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvY29tbWFuZC9idWlsZF9leHQucHlQSwECFAMUAAAAAAAAACEAQEZC3HwlAAB8JQAAQwAAAAAAAAAAAAAAAAB55xAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvY29tbWFuZC9idWlsZF9weS5weVBLAQIUAxQAAAAAAAAAIQDQzfM9+B8AAPgfAABCAAAAAAAAAAAAAAAAAFYNEQBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9jb21tYW5kL2RldmVsb3AucHlQSwECFAMUAAAAAAAAACEA/+j2kcADAADAAwAARAAAAAAAAAAAAAAAAACuLREAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvY29tbWFuZC9kaXN0X2luZm8ucHlQSwECFAMUAAAAAAAAACEAVmOaRfhVAQD4VQEARwAAAAAAAAAAAAAAAADQMREAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvY29tbWFuZC9lYXN5X2luc3RhbGwucHlQSwECFAMUAAAAAAAAACEAMYn09uJjAADiYwAAQwAAAAAAAAAAAAAAAAAtiBIAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvY29tbWFuZC9lZ2dfaW5mby5weVBLAQIUAxQAAAAAAAAAIQBQYRGsYRIAAGESAABCAAAAAAAAAAAAAAAAAHDsEgBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9jb21tYW5kL2luc3RhbGwucHlQSwECFAMUAAAAAAAAACEAXNKo5ZsIAACbCAAASwAAAAAAAAAAAAAAAAAx/xIAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvY29tbWFuZC9pbnN0YWxsX2VnZ19pbmZvLnB5UEsBAhQDFAAAAAAAAAAhABLTjCoWDwAAFg8AAEYAAAAAAAAAAAAAAAAANQgTAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2NvbW1hbmQvaW5zdGFsbF9saWIucHlQSwECFAMUAAAAAAAAACEARj/xHocJAACHCQAASgAAAAAAAAAAAAAAAACvFxMAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvY29tbWFuZC9pbnN0YWxsX3NjcmlwdHMucHlQSwECFAMUAAAAAAAAACEAfXNgv3oTAAB6EwAARQAAAAAAAAAAAAAAAACeIRMAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvY29tbWFuZC9weTM2Y29tcGF0LnB5UEsBAhQDFAAAAAAAAAAhAHbS6rXUAQAA1AEAAEMAAAAAAAAAAAAAAAAAezUTAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2NvbW1hbmQvcmVnaXN0ZXIucHlQSwECFAMUAAAAAAAAACEAGcrUpHQIAAB0CAAAQQAAAAAAAAAAAAAAAACwNxMAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvY29tbWFuZC9yb3RhdGUucHlQSwECFAMUAAAAAAAAACEABIHWNJICAACSAgAAQwAAAAAAAAAAAAAAAACDQBMAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvY29tbWFuZC9zYXZlb3B0cy5weVBLAQIUAxQAAAAAAAAAIQBwijYHmB8AAJgfAABAAAAAAAAAAAAAAAAAAHZDEwBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9jb21tYW5kL3NkaXN0LnB5UEsBAhQDFAAAAAAAAAAhAJtwy8fdEwAA3RMAAEEAAAAAAAAAAAAAAAAAbGMTAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2NvbW1hbmQvc2V0b3B0LnB5UEsBAhQDFAAAAAAAAAAhAN2WnM+CJQAAgiUAAD8AAAAAAAAAAAAAAAAAqHcTAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2NvbW1hbmQvdGVzdC5weVBLAQIUAxQAAAAAAAAAIQAiAF1LzgEAAM4BAABBAAAAAAAAAAAAAAAAAIedEwBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9jb21tYW5kL3VwbG9hZC5weVBLAQIUAxQAAAAAAAAAIQDyl/PGjxwAAI8cAABGAAAAAAAAAAAAAAAAALSfEwBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9jb21tYW5kL3VwbG9hZF9kb2NzLnB5UEsBAhQDFAAAAAAAAAAhAE3v0lNfUAAAX1AAADkAAAAAAAAAAAAAAAAAp7wTAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2NvbmZpZy5weVBLAQIUAxQAAAAAAAAAIQAaIgQypwMAAKcDAAA7AAAAAAAAAAAAAAAAAF0NFABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9kZXBfdXRpbC5weVBLAQIUAxQAAAAAAAAAIQD9GVsKjRUAAI0VAAA6AAAAAAAAAAAAAAAAAF0RFABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9kZXBlbmRzLnB5UEsBAhQDFAAAAAAAAAAhABXyX5TBwgAAwcIAADcAAAAAAAAAAAAAAAAAQicUAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2Rpc3QucHlQSwECFAMUAAAAAAAAACEAu/9R5gwCAAAMAgAAOQAAAAAAAAAAAAAAAABY6hQAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvZXJyb3JzLnB5UEsBAhQDFAAAAAAAAAAhALmqke7BBgAAwQYAADwAAAAAAAAAAAAAAAAAu+wUAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2V4dGVuc2lvbi5weVBLAQIUAxQAAAAAAAAAIQDHJGyT0gkAANIJAABCAAAAAAAAAAAAAAAAANbzFABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9leHRlcm4vX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAjshPa9wTAADcEwAANwAAAAAAAAAAAAAAAAAI/hQAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvZ2xvYi5weVBLAQIUAxQAAAAAAAAAIQAQ+fwpAAABAAAAAQA6AAAAAAAAAAAAAAAAADkSFQBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9ndWktMzIuZXhlUEsBAhQDFAAAAAAAAAAhANgOq/QAJgEAACYBADoAAAAAAAAAAAAAAAAAkRIWAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2d1aS02NC5leGVQSwECFAMUAAAAAAAAACEAEPn8KQAAAQAAAAEANwAAAAAAAAAAAAAAAADpOBcAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvZ3VpLmV4ZVBLAQIUAxQAAAAAAAAAIQCA3RAn2RQAANkUAAA8AAAAAAAAAAAAAAAAAD45GABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9pbnN0YWxsZXIucHlQSwECFAMUAAAAAAAAACEAZPl+mxMDAAATAwAAOQAAAAAAAAAAAAAAAABxThgAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvbGF1bmNoLnB5UEsBAhQDFAAAAAAAAAAhAIdR66LdBwAA3QcAAD0AAAAAAAAAAAAAAAAA21EYAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2xpYjJ0bzNfZXgucHlQSwECFAMUAAAAAAAAACEAFGNIy5AUAACQFAAAOQAAAAAAAAAAAAAAAAATWhgAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvbW9ua2V5LnB5UEsBAhQDFAAAAAAAAAAhADKn/FyftgAAn7YAADcAAAAAAAAAAAAAAAAA+m4YAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL21zdmMucHlQSwECFAMUAAAAAAAAACEAYwvj1n8MAAB/DAAAPQAAAAAAAAAAAAAAAADuJRkAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvbmFtZXNwYWNlcy5weVBLAQIUAxQAAAAAAAAAIQCeBdiNnZ4AAJ2eAABAAAAAAAAAAAAAAAAAAMgyGQBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9wYWNrYWdlX2luZGV4LnB5UEsBAhQDFAAAAAAAAAAhAP4FRNTYBQAA2AUAAD0AAAAAAAAAAAAAAAAAw9EZAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL3B5Mjdjb21wYXQucHlQSwECFAMUAAAAAAAAACEA3ssw4kYDAABGAwAAPQAAAAAAAAAAAAAAAAD21xkAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvcHkzMWNvbXBhdC5weVBLAQIUAxQAAAAAAAAAIQAHYdiiMgUAADIFAAA9AAAAAAAAAAAAAAAAAJfbGQBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9weTMzY29tcGF0LnB5UEsBAhQDFAAAAAAAAAAhAI5W0ET1AAAA9QAAAD0AAAAAAAAAAAAAAAAAJOEZAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL3B5MzRjb21wYXQucHlQSwECFAMUAAAAAAAAACEAjFOaY8Q3AADENwAAOgAAAAAAAAAAAAAAAAB04hkAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvc2FuZGJveC5weVBLAQIUAxQAAAAAAAAAIQCoM7S+igAAAIoAAAA7AAAAAAAAAAAAAAAAAJAaGgBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9zY3JpcHQudG1wbFBLAQIUAxQAAAAAAAAAIQCtKoM2/ggAAP4IAAA9AAAAAAAAAAAAAAAAAHMbGgBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9zaXRlLXBhdGNoLnB5UEsBAhQDFAAAAAAAAAAhAM6VNI4tIQAALSEAAD4AAAAAAAAAAAAAAAAAzCQaAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL3NzbF9zdXBwb3J0LnB5UEsBAhQDFAAAAAAAAAAhAJpC15rkAwAA5AMAAEAAAAAAAAAAAAAAAAAAVUYaAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL3VuaWNvZGVfdXRpbHMucHlQSwECFAMUAAAAAAAAACEASLFMYpAAAACQAAAAOgAAAAAAAAAAAAAAAACXShoAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvdmVyc2lvbi5weVBLAQIUAxQAAAAAAAAAIQCwxUWAByEAAAchAAA4AAAAAAAAAAAAAAAAAH9LGgBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy93aGVlbC5weVBLAQIUAxQAAAAAAAAAIQD5y+4NygIAAMoCAABCAAAAAAAAAAAAAAAAANxsGgBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy93aW5kb3dzX3N1cHBvcnQucHlQSwECFAMUAAAAAAAAACEAAAAAAAAAAAAAAAAAIgAAAAAAAAAAAAAAAAAGcBoAcnVsZXNfcHl0aG9uL3BhY2thZ2luZy9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQB/uX4PiBYAAIgWAAAdAAAAAAAAAAAAAAAAAEZwGgBydWxlc19weXRob24vcGFja2FnaW5nL3dobC5weVBLAQIUAxQAAAAAAAAAIQB3Up1V+jEAAPoxAAAeAAAAAAAAAAAAAAAAAAmHGgBydWxlc19weXRob24vcGFja2FnaW5nL3dobHRvb2xQSwECFAMUAAAAAAAAACEAAAAAAAAAAAAAAAAAEgAAAAAAAAAAAAAAAAA/uRoAc3VicGFyL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAAAAAAAAAAAAAAAAABoAAAAAAAAAAAAAAAAAb7kaAHN1YnBhci9ydW50aW1lL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAI+gczy3LgAAty4AABkAAAAAAAAAAAAAAAAAp7kaAHN1YnBhci9ydW50aW1lL3N1cHBvcnQucHlQSwUGAAAAAHAAcADoLwAAlegaAAAA