Advertisement
xiaomianao666

插件名:global_百度网盘秒传转存助手支持PC及移动端永久无广告绿色版

Sep 24th, 2023
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. 海阔视界规则分享,当前分享的是:网页插件¥js_url¥global_百度网盘秒传转存助手支持PC及移动端永久无广告绿色版@base64://Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICAgIOeZvuW6pue9keebmOenkuS8oOi9rOWtmOWKqeaJiyDmlK/mjIFQQ+WPiuenu+WKqOerryDmsLjkuYXml6Dlub/lkYrnu7/oibLniYgKLy8gQHZlcnNpb24gICAgICAgIDMuMS44LjEKLy8gQGF1dGhvciAgICAgICAgIHRvdXNha2FzcAovLyBAZGVzY3JpcHRpb24gICAg55m+5bqm572R55uY56eS5Lyg6ZO+5o6l6L2s5a2Y5Y+K55Sf5oiQIOawuOS5heaXoOW5v+WRiue7v+iJsueJiCDmlK/mjIHnp7vliqjnq6/nlYzpnaIgLS0g5YaN5qyh5oSf6LCi5Yid5Luj5aSn5L2s5Lyf5aSn6LSh54yuCi8vIEBtYXRjaCAgICAgICAgICAqOi8vcGFuLmJhaWR1LmNvbS9kaXNrL2hvbWUqCi8vIEBtYXRjaCAgICAgICAgICAqOi8vcGFuLmJhaWR1LmNvbS9kaXNrL21haW4qCi8vIEBtYXRjaCAgICAgICAgICAqOi8vcGFuLmJhaWR1LmNvbS9kaXNrL3N5bmNocm9uaXphdGlvbioKLy8gQG1hdGNoICAgICAgICAgICo6Ly9wYW4uYmFpZHUuY29tL3MvKgovLyBAbWF0Y2ggICAgICAgICAgKjovL3l1bi5iYWlkdS5jb20vZGlzay9ob21lKgovLyBAbWF0Y2ggICAgICAgICAgKjovL3l1bi5iYWlkdS5jb20vZGlzay9tYWluKgovLyBAbWF0Y2ggICAgICAgICAgKjovL3l1bi5iYWlkdS5jb20vZGlzay9zeW5jaHJvbml6YXRpb24qCi8vIEBtYXRjaCAgICAgICAgICAqOi8veXVuLmJhaWR1LmNvbS9zLyoKLy8gQG1hdGNoICAgICAgICAgICo6Ly93YW5ncGFuLmJhaWR1LmNvbS9kaXNrL2hvbWUqCi8vIEBtYXRjaCAgICAgICAgICAqOi8vd2FuZ3Bhbi5iYWlkdS5jb20vZGlzay9tYWluKgovLyBAbWF0Y2ggICAgICAgICAgKjovL3dhbmdwYW4uYmFpZHUuY29tL2Rpc2svc3luY2hyb25pemF0aW9uKgovLyBAbWF0Y2ggICAgICAgICAgKjovL3dhbmdwYW4uYmFpZHUuY29tL3MvKgovLyBAbWF0Y2ggICAgICAgICAgKjovL3Bhbi5iYWlkdS5jb20vd2FwL2hvbWUqCi8vIEBtYXRjaCAgICAgICAgICAqOi8vb3BlbmFwaS5iYWlkdS5jb20vb2F1dGgvMi4wL2xvZ2luX3N1Y2Nlc3MKLy8gQGxpY2Vuc2UgICAgICAgIEdQTHYzCi8vIEBpY29uICAgICAgICAgICBkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQVlBQUFBZjgvOWhBQUFCQlVsRVFWUjRBWlRUSlJCVVVSVEg0VHREd1h1UGRQcmdiaEhYaWtzZjNDUHVjUk5TY0hkM2QzZDN1TzliS2V1N2I3OStmdW44UTE3Q05IeU1NVXFhaVBFNGZFeVlWampHTktuTndRNGxwZ1Y4bE1hbkVmd2Zvc0xIRUdQVTFOM1puQXY0cWxUK05pUTU2dVBXU2pLQnJ6dFVTbklhQjY2c1kxdmd4Z3hvTVhCNU5ic0NCOXJ4Y0I1Zk4yTTUvMTZuQ0Z4ZVM2WVRlenB6c0IxUHUvQzJPNy83OC85OWVZQllIWGgrZ3FkSE9iR0lLNEdIZ2V2alZJdDFBZ0FuaHZFNGNHZThldW9IYml6Z1l1RDJSR2d4OE8wUnB3SVBSbXNtSkRHcWNyQU5kM3BMby9xVnIwM2hVbGNwZlN3ZjAvdkQzSndrUGRQSzUvemhrT3orL2YxRklEdi9SY25PQUVqeXdIL0RoZ0FEQUFBQUFFbEZUa1N1UW1DQwovLyBAbmFtZXNwYWNlICAgICAgc3AubWVuZ3pvbmVmaXJlL2ZvcmsvcmluCi8vIEBob21lcGFnZVVSTCAgICAKLy8gQGRlc2NyaXB0aW9uOmVuIGlucHV0IGJkbGluayB0byBnZXQgZmlsZXMgb3IgZ2V0IGJkbGluayBmb3IgQmFpZHXihKIgV2ViRGlzay4KLy8gQGNvbXBhdGlibGUgICAgIGZpcmVmb3ggVmlvbGVudG1vbmtleQovLyBAY29tcGF0aWJsZSAgICAgZmlyZWZveCBUYW1wZXJtb25rZXkKLy8gQGNvbXBhdGlibGUgICAgIGNocm9tZSBWaW9sZW50bW9ua2V5Ci8vIEBjb21wYXRpYmxlICAgICBjaHJvbWUgVGFtcGVybW9ua2V5Ci8vIEBjb21wYXRpYmxlICAgICBlZGdlIFZpb2xlbnRtb25rZXkKLy8gQGNvbXBhdGlibGUgICAgIGVkZ2UgVGFtcGVybW9ua2V5Ci8vIEBncmFudCAgICAgICAgICBHTV9zZXRWYWx1ZQovLyBAZ3JhbnQgICAgICAgICAgR01fZ2V0VmFsdWUKLy8gQGdyYW50ICAgICAgICAgIEdNX2xpc3RWYWx1ZXMKLy8gQGdyYW50ICAgICAgICAgIEdNX2RlbGV0ZVZhbHVlCi8vIEBncmFudCAgICAgICAgICBHTV9zZXRDbGlwYm9hcmQKLy8gQGdyYW50ICAgICAgICAgIEdNX2FkZFN0eWxlCi8vIEBncmFudCAgICAgICAgICBHTV94bWxodHRwUmVxdWVzdAovLyBAZ3JhbnQgICAgICAgICAgR01fcmVnaXN0ZXJNZW51Q29tbWFuZAovLyBAZ3JhbnQgICAgICAgICAgdW5zYWZlV2luZG93Ci8vIEBydW4tYXQgICAgICAgICBkb2N1bWVudC1ib2R5Ci8vIEBjb25uZWN0ICAgICAgICBiYWlkdS5jb20KLy8gQGNvbm5lY3QgICAgICAgIGJhaWR1cGNzLmNvbQovLyBAY29ubmVjdCAgICAgICAgdW5wa2cuY29tCi8vIEBjb25uZWN0ICAgICAgICAqCi8vIEByZXF1aXJlICAgICAgICBodHRwczovL3VucGtnLmNvbS9qcXVlcnlAMy43LjAvZGlzdC9qcXVlcnkubWluLmpzCi8vIEByZXF1aXJlICAgICAgICBodHRwczovL3VucGtnLmNvbS9qcy1iYXNlNjRAMy43LjUvYmFzZTY0LmpzCi8vIEByZXF1aXJlICAgICAgICBodHRwczovL3VucGtnLmNvbS9zd2VldGFsZXJ0MkAxMS40LjgvZGlzdC9zd2VldGFsZXJ0Mi5taW4uanMKLy8gQHJlcXVpcmUgICAgICAgIGh0dHBzOi8vdW5wa2cuY29tL3NwYXJrLW1kNUAzLjAuMi9zcGFyay1tZDUubWluLmpzCi8vID09L1VzZXJTY3JpcHQ9PQoKLyoqKioqKi8gKCgpID0+IHsgLy8gd2VicGFja0Jvb3RzdHJhcAovKioqKioqLyAJdmFyIF9fd2VicGFja19tb2R1bGVzX18gPSAoewoKLyoqKi8gNjU6Ci8qKiovICgobW9kdWxlKSA9PiB7Cgptb2R1bGUuZXhwb3J0cyA9ICIubXpmX2J0bnt0ZXh0LWFsaWduOmNlbnRlcjtmb250LXNpemU6Ljg1ZW07Y29sb3I6IzA5YWFmZjtib3JkZXI6MnB4IHNvbGlkICNjM2VhZmY7Ym9yZGVyLXJhZGl1czo0cHg7bWFyZ2luLWxlZnQ6NXB4O3BhZGRpbmc6MTBweDtwYWRkaW5nLXRvcDo1cHg7cGFkZGluZy1ib3R0b206NXB4O2N1cnNvcjpwb2ludGVyfS5temZfYnRuMnt0ZXh0LWFsaWduOmNlbnRlcjtjb2xvcjojMDlhYWZmO21hcmdpbi1sZWZ0OjVweDtjdXJzb3I6cG9pbnRlcn0ubXpmX2xpbmt7Zm9udC1mYW1pbHk6aW5oZXJpdDtjb2xvcjojMDlhYWZmO3RleHQtZGVjb3JhdGlvbjpub25lO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lfS5temZfdGV4dHtmb250LWZlYXR1cmUtc2V0dGluZ3M6XCJsbnVtXCI7LXdlYmtpdC1mb250LXNtb290aGluZzphbnRpYWxpYXNlZDtmb250LWZhbWlseTppbmhlcml0O2NvbG9yOiM1NDU0NTQ7Zm9udC13ZWlnaHQ6NDAwO3dvcmQtYnJlYWs6YnJlYWstd29yZDstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7bWFyZ2luOjA7cGFkZGluZzowO3dpZHRoOjEwMCU7aGVpZ2h0OjM0cHg7ZGlzcGxheTpibG9jaztsaW5lLWhlaWdodDozNHB4O3RleHQtYWxpZ246Y2VudGVyO3doaXRlLXNwYWNlOm5vd3JhcH0ubXpmX2Fycm93e21hcmdpbi1yaWdodDo1cHg7dHJhbnNmb3JtOnJvdGF0ZSgxODBkZWcpO3RyYW5zaXRpb246dHJhbnNmb3JtIC4ycztmaWxsOm5vbmU7c3Ryb2tlOmdyYXl9Lm16Zl9kZXRhaWxze2N1cnNvcjpwb2ludGVyfS5temZfZGV0YWlscyBzdW1tYXJ5e3doaXRlLXNwYWNlOm5vd3JhcH0ubXpmX2NvbnRlbnR7bWF4LWhlaWdodDowO21hcmdpbjowO3RyYW5zaXRpb246bWF4LWhlaWdodCAuNXM7b3ZlcmZsb3c6aGlkZGVufS5temZfZGV0YWlsc1tvcGVuXT5zdW1tYXJ5PnN2Z3t0cmFuc2Zvcm06cm90YXRlKDBkZWcpfS5temZfZGV0YWlsc1tvcGVuXSsubXpmX2NvbnRlbnR7bWF4LWhlaWdodDoxMDAlfS5temZfaHRtbF9jb250YWluZXJ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOm1pbm1heCgwLCAxMDAlKTthbGlnbi1zZWxmOmNlbnRlcjtqdXN0aWZ5LXNlbGY6Y2VudGVyO3dpZHRoOjMyZW07bWF4LXdpZHRoOjEwMCV9Lm16Zl91cGRhdGVJbmZve2JvcmRlcjoxcHggIzAwMDt3aWR0aDoxMDAlO21hcmdpbjowIGF1dG87dGV4dC1hbGlnbjpsZWZ0fS5temZfdXBkYXRlSW5mbyBkbHtkaXNwbGF5OmZsZXg7ZmxleC13cmFwOndyYXA7bGluZS1oZWlnaHQ6MjZweH0ubXpmX3VwZGF0ZUluZm8gZGw+ZHR7Zm9udC1mYW1pbHk6bW9ub3NwYWNlO2ZvbnQtc2l6ZTouOWVtO2NvbG9yOiMxODZhOGM7ZmxleC1iYXNpczozZW07ZmxleC1ncm93OjA7ZmxleC1zaHJpbms6MH0ubXpmX3VwZGF0ZUluZm8gZGw+ZHR+ZHQsLm16Zl91cGRhdGVJbmZvIGRsPmR0fmR0K2Rke21hcmdpbi10b3A6LjNlbTtib3JkZXItdG9wOjFweCBzb2xpZCAjY2NjfS5temZfdXBkYXRlSW5mbyBkbD5kZHtmbGV4OjF9Lm16Zl91cGRhdGVJbmZvIGRsPmRkK2Rke3BhZGRpbmctbGVmdDozZW07ZmxleC1iYXNpczoxMDAlfS5temZfdXBkYXRlSW5mbyBzcGFue3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lfSIKCi8qKiovIH0pLAoKLyoqKi8gMTg0OgovKioqLyAoKG1vZHVsZSkgPT4gewoKbW9kdWxlLmV4cG9ydHMgPSAiPGRpdiBjbGFzcz1cInBhbmVsLWJvZHlcIiBzdHlsZT1cImhlaWdodDogMjIwcHg7XCI+XHJcbiAgPGRpdiBjbGFzcz1cIm16Zl91cGRhdGVJbmZvXCI+XHJcbiAgICA8cD7mm7TmlrDml6Xlv5c6PC9wPlxyXG4gICAgPGRsPlxyXG4gICAgICA8ZHQ+My4xLjguMTwvZHQ+XHJcbiAgICAgIDxkZD7kv67mraPmjojmnYPnoIHlpLHotKXml7bplJnor6/kv6Hmga88L2RkPlxyXG4gICAgICA8ZGQ+PC9kZD5cclxuXHJcbiAgICAgIDxkdD4zLjEuODwvZHQ+XHJcbiAgICAgIDxkZD7kvJjljJbnqLPlrprmgKflj4rmlLnlloTplJnor6/ml7bkv6Hmga88L2RkPlxyXG4gICAgICA8ZGQ+PC9kZD5cclxuXHJcbiAgICAgIDxkdD4zLjEuNzwvZHQ+XHJcbiAgICAgIDxkZD7mlLnlloTmr4/mrKHnmbvlhaXml6DpnIDph43mlrDojrflj5bmjojmnYPnoIE8L2RkPlxyXG4gICAgICA8ZGQ+PC9kZD5cclxuXHJcbiAgICAgIDxkdD4zLjEuNjwvZHQ+XHJcbiAgICAgIDxkZD7mgaLlpI3mlK/mjIHnn63pk77lj4rmoIflh4bpk748L2RkPlxyXG4gICAgICA8ZGQ+PC9kZD5cclxuXHJcbiAgICAgIDxkdD4zLjEuNTwvZHQ+XHJcbiAgICAgIDxkZD7mlLnlloTplJnor6/kv6Hmga88L2RkPlxyXG4gICAgICA8ZGQ+PC9kZD5cclxuXHJcbiAgICAgIDxkdD4zLjEuNDwvZHQ+XHJcbiAgICAgIDxkZD7mlLnnlKh1bnBrZyBjZG48L2RkPlxyXG4gICAgICA8ZGQ+PC9kZD5cclxuXHJcbiAgICAgIDxkdD4zLjEuMzwvZHQ+XHJcbiAgICAgIDxkZD7ovazlrZjlhajlpLHotKXml7bkuI3mt7vliqDmiZPlvIDnm67lvZXmjInpkq48L2RkPlxyXG4gICAgICA8ZGQ+5aSW6YOo5bqT5YiH5o2i5Li65L2/55SoQ0ROPC9kZD5cclxuICAgICAgPGRkPuabtOato+S7o+eggeWGheWFg+aVsOaNrjwvZGQ+XHJcbiAgICAgIDxkZD48L2RkPlxyXG5cclxuICAgICAgPGR0PjMuMS4yPC9kdD5cclxuICAgICAgPGRkPijlj6rmlLnlkI0pPC9kZD5cclxuICAgICAgPGRkPjwvZGQ+XHJcblxyXG4gICAgICA8ZHQ+My4xLjE8L2R0PlxyXG4gICAgICA8ZGQ+5L+u5q2j56e75Yqo54mI5L+d5a2Y6Lev5b6E5peg5pWI6Zeu6aKYPC9kZD5cclxuICAgICAgPGRkPjwvZGQ+XHJcblxyXG4gICAgICA8ZHQ+My4wLjk8L2R0PlxyXG4gICAgICA8ZGQ+5pyJ6ZmQ5bqm5pSv5oyB56e75Yqo56uv55WM6Z2iPC9kZD5cclxuICAgICAgPGRkPuaPkOmGkjIwR+WPiuefremTvuS4jeaUr+aMgSAoMjU2S+S7peWGheaUr+aMgSk8L2RkPlxyXG4gICAgICA8ZGQ+PC9kZD5cclxuXHJcbiAgICAgIDxkdD4zLjAuODwvZHQ+XHJcbiAgICAgIDxkZD7kv67mraPnlJ/miJDph43or5Xml7blsI9CVUc8L2RkPlxyXG4gICAgICA8ZGQ+PC9kZD5cclxuXHJcbiAgICAgIDxkdD4zLjAuNzwvZHQ+XHJcbiAgICAgIDxkZD7kvJjljJbnp5LkvKDnlJ/miJDnqLPlrprmgKc8L2RkPlxyXG4gICAgICA8ZGQ+PC9kZD5cclxuICBcclxuICAgICAgPGR0PjMuMC42PC9kdD5cclxuICAgICAgPGRkPuenkuS8oOaUr+aMgeepuuebruW9lSAo5paH5Lu25aS557uT5p6E5L2/55So5pe2KTwvZGQ+XHJcbiAgICAgIDxkZD7lop7liqDpmo/mnLrlpKflsI/lhpnlsJ3or5XmrKHmlbA8L2RkPlxyXG4gICAgICA8ZGQ+PC9kZD5cclxuICBcclxuICAgICAgPGR0PjMuMC41PC9kdD5cclxuICAgICAgPGRkPuaPkOmrmOaXp+enkuS8oOWFvOWuueaApzwvZGQ+XHJcbiAgICAgIDxkZD48L2RkPlxyXG4gIFxyXG4gICAgICA8ZHQ+My4wLjQ8L2R0PlxyXG4gICAgICA8ZGQ+KOayoeacieWPkeW4gyk8L2RkPlxyXG4gICAgICA8ZGQ+PC9kZD5cclxuICBcclxuICAgICAgPGR0PjMuMC4zPC9kdD5cclxuICAgICAgPGRkPuaUueeUqHJhcGlkdXBsb2Fk5o6l5Y+jPC9kZD5cclxuICAgICAgPGRkPjwvZGQ+XHJcbiAgXHJcbiAgICAgIDxkdD4zLjAuMjwvZHQ+XHJcbiAgICAgIDxkZD4zLjAuMiDkv67mraM0MDTml7bmraPnoa7miqXplJk8L2RkPlxyXG4gICAgICA8ZGQ+PC9kZD5cclxuICBcclxuICAgICAgPGR0PjMuMC4xPC9kdD5cclxuICAgICAgPGRkPuaLkue7neefreenkuS8oOi+k+WFpTwvZGQ+XHJcbiAgICAgIDxkZD48L2RkPlxyXG4gIFxyXG4gICAgICA8ZHQ+My4wLjA8L2R0PlxyXG4gICAgICA8ZGQ+5oy95pWR56eS5Lyg5Yqf6IO9PC9kZD5cclxuICAgICAgPGRkPjwvZGQ+XHJcbiAgICA8L2RsPlxyXG4gIDwvZGl2PlxyXG48L2Rpdj4iCgovKioqLyB9KSwKCi8qKiovIDE0OToKLyoqKi8gKChtb2R1bGUpID0+IHsKCm1vZHVsZS5leHBvcnRzID0gIi8q6Ieq5a6a5LmJ5Y2V6YCJ5qGG5qC35byPKi9cclxuLm16Zl9jaGVjayB7XHJcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xyXG4gIGJvcmRlci1yYWRpdXM6IDVweDtcclxuICBib3JkZXI6IDFweCBzb2xpZCAjZDNkM2QzO1xyXG4gIHdpZHRoOiAyMHB4O1xyXG4gIGhlaWdodDogMjBweDtcclxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcclxuICBsaW5lLWhlaWdodDogMjBweDtcclxuICBtYXJnaW4tbGVmdDogMTBweDtcclxufVxyXG4ubXpmX2NoZWNrX29yaTpjaGVja2VkICsgLm16Zl9jaGVjayB7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogI2VlZTtcclxufVxyXG4ubXpmX2NoZWNrX29yaTpjaGVja2VkICsgLm16Zl9jaGVjazo6YWZ0ZXIge1xyXG4gIGNvbnRlbnQ6IFwi4pyTXCI7XHJcbn1cclxuLm16Zl9jaGVja19vcmkge1xyXG4gIGRpc3BsYXk6IG5vbmU7XHJcbn1cclxuXHJcbi8q5paw54mI5bqm55uY6aG16Z2i55qE5oyJ6ZKu5qC35byPKOebtOaOpeaLt+i0nSkqL1xyXG4ubXpmX25ld19idG4ge1xyXG4gIC13ZWJraXQtdGV4dC1zaXplLWFkanVzdDogMTAwJTtcclxuICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDtcclxuICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHRyYW5zcGFyZW50O1xyXG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XHJcbiAgZm9udDogaW5oZXJpdDtcclxuICBvdmVyZmxvdzogdmlzaWJsZTtcclxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcclxuICBmb250LWZhbWlseTogU0ZVSVRleHQsIFBpbmdGYW5nU0MtUmVndWxhciwgSGVsdmV0aWNhIE5ldWUsIEhlbHZldGljYSwgQXJpYWwsXHJcbiAgICBzYW5zLXNlcmlmO1xyXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcclxuICBsaW5lLWhlaWdodDogMTtcclxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xyXG4gIGN1cnNvcjogcG9pbnRlcjtcclxuICBiYWNrZ3JvdW5kOiAjZmZmO1xyXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcclxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gIG91dGxpbmU6IDA7XHJcbiAgbWFyZ2luOiAwO1xyXG4gIHRyYW5zaXRpb246IDAuMXM7XHJcbiAgY29sb3I6ICNmZmY7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogIzA2YTdmZjtcclxuICBmb250LXdlaWdodDogNzAwO1xyXG4gIHBhZGRpbmc6IDhweCAyNHB4O1xyXG4gIGhlaWdodDogMzJweDtcclxuICBmb250LXNpemU6IDE0cHg7XHJcbiAgYm9yZGVyLXJhZGl1czogMTZweDtcclxuICBib3JkZXI6IG5vbmU7XHJcbiAgbWFyZ2luLWxlZnQ6IDhweDtcclxufVxyXG4ubXpmX25ld19idG5faWNvbl9vbmx5IHtcclxuICBwYWRkaW5nOiA4cHggOHB4O1xyXG59XHJcbi5temZfbmV3X2J0bl9yZWQge1xyXG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmU4ZTg7XHJcbiAgY29sb3I6ICNEQjM3MTA7XHJcbn1cclxuI216Zi1yYXBpZC1pbnB1dC5zd2FsMi10ZXh0YXJlYSB7XHJcbiAgaGVpZ2h0OiAxMGVtO1xyXG59XHJcbiNtemYtYWNjZXNzdG9rZW4taW5wdXQge1xyXG4gIGJhY2tncm91bmQ6IHJnYigyNTUsIDI1MiwgMjIyKTtcclxuICBmb250LXNpemU6IDAuOGVtO1xyXG4gIG1hcmdpbi1sZWZ0OiAwO1xyXG4gIG1hcmdpbi1yaWdodDogMDtcclxufVxyXG4jbXpmLWFjY2Vzc3Rva2VuLWlucHV0Lm16Zi1hdXRvLWZpbGxlZCB7XHJcbiAgYmFja2dyb3VuZDogI0VFRTtcclxufVxyXG4jbXpmLWFjY2Vzc3Rva2VuLWFjcXVpcmUge1xyXG4gIGZvbnQtc2l6ZTogMC44ZW07XHJcbn0iCgovKioqLyB9KSwKCi8qKiovIDgyNToKLyoqKi8gKChtb2R1bGUpID0+IHsKCm1vZHVsZS5leHBvcnRzID0gIiNnZW5fYmRsaW5rX2J0biB7XHJcbiAgZGlzcGxheTogbm9uZTtcclxuICBmb250LXNpemU6IC4yOHJlbTtcclxuICBwYWRkaW5nOiAwLjNlbTtcclxuICBjb2xvcjogI2E1NzQwNjtcclxufVxyXG5oZWFkZXJbc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiXSB+ICNnZW5fYmRsaW5rX2J0biB7XHJcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXG4gIHBvc2l0aW9uOiBmaXhlZDtcclxuICB0b3A6IDAuNGVtO1xyXG4gIGxlZnQ6IDMuNWVtO1xyXG4gIHotaW5kZXg6IDk5OTk5O1xyXG59XHJcbiNnZW5fYmRsaW5rX2J0bi5tb2JpbGUtc2hhcmUtcGFnZSB7XHJcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXG4gIHBvc2l0aW9uOiBmaXhlZDtcclxuICB0b3A6IDAuN2VtO1xyXG4gIHJpZ2h0OiAxLjNlbTtcclxuICB6LWluZGV4OiA5OTk5OTtcclxufVxyXG4jZ2VuX2JkbGlua19idG46YWZ0ZXIge1xyXG4gIGNvbnRlbnQ6IFwiXFwyNkEx55Sf5oiQXCI7XHJcbn1cclxuaHRtbC5zd2FsMi1zaG93biB7XHJcbiAgZm9udC1zaXplOiAxNnB4ICFpbXBvcnRhbnQ7XHJcbn1cclxuLm16Zl9uZXdfYnRuIHtcclxuICBwYWRkaW5nOiAzcHggOXB4O1xyXG59XHJcbi5zd2FsMi10aXRsZSB7XHJcbiAgZm9udC1zaXplOiAxLjVyZW07XHJcbn1cclxuLm16Zl91cGRhdGVJbmZvIHtcclxuICBmb250LXNpemU6IDFyZW07XHJcbn0iCgovKioqLyB9KQoKLyoqKioqKi8gCX0pOwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqLyAJLy8gVGhlIG1vZHVsZSBjYWNoZQovKioqKioqLyAJdmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9OwovKioqKioqLyAJCi8qKioqKiovIAkvLyBUaGUgcmVxdWlyZSBmdW5jdGlvbgovKioqKioqLyAJZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkgewovKioqKioqLyAJCS8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZQovKioqKioqLyAJCXZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdOwovKioqKioqLyAJCWlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkgewovKioqKioqLyAJCQlyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7Ci8qKioqKiovIAkJfQovKioqKioqLyAJCS8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpCi8qKioqKiovIAkJdmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7Ci8qKioqKiovIAkJCS8vIG5vIG1vZHVsZS5pZCBuZWVkZWQKLyoqKioqKi8gCQkJLy8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWQKLyoqKioqKi8gCQkJZXhwb3J0czoge30KLyoqKioqKi8gCQl9OwovKioqKioqLyAJCi8qKioqKiovIAkJLy8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uCi8qKioqKiovIAkJX193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7Ci8qKioqKiovIAkKLyoqKioqKi8gCQkvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZQovKioqKioqLyAJCXJldHVybiBtb2R1bGUuZXhwb3J0czsKLyoqKioqKi8gCX0KLyoqKioqKi8gCQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqLyAJLyogd2VicGFjay9ydW50aW1lL2NvbXBhdCBnZXQgZGVmYXVsdCBleHBvcnQgKi8KLyoqKioqKi8gCSgoKSA9PiB7Ci8qKioqKiovIAkJLy8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXMKLyoqKioqKi8gCQlfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSAobW9kdWxlKSA9PiB7Ci8qKioqKiovIAkJCXZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgPwovKioqKioqLyAJCQkJKCkgPT4gKG1vZHVsZVsnZGVmYXVsdCddKSA6Ci8qKioqKiovIAkJCQkoKSA9PiAobW9kdWxlKTsKLyoqKioqKi8gCQkJX193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7Ci8qKioqKiovIAkJCXJldHVybiBnZXR0ZXI7Ci8qKioqKiovIAkJfTsKLyoqKioqKi8gCX0pKCk7Ci8qKioqKiovIAkKLyoqKioqKi8gCS8qIHdlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyAqLwovKioqKioqLyAJKCgpID0+IHsKLyoqKioqKi8gCQkvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzCi8qKioqKiovIAkJX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHsKLyoqKioqKi8gCQkJZm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikgewovKioqKioqLyAJCQkJaWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7Ci8qKioqKiovIAkJCQkJT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTsKLyoqKioqKi8gCQkJCX0KLyoqKioqKi8gCQkJfQovKioqKioqLyAJCX07Ci8qKioqKiovIAl9KSgpOwovKioqKioqLyAJCi8qKioqKiovIAkvKiB3ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kICovCi8qKioqKiovIAkoKCkgPT4gewovKioqKioqLyAJCV9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkKLyoqKioqKi8gCX0pKCk7Ci8qKioqKiovIAkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KdmFyIF9fd2VicGFja19leHBvcnRzX18gPSB7fTsKLy8gVGhpcyBlbnRyeSBuZWVkIHRvIGJlIHdyYXBwZWQgaW4gYW4gSUlGRSBiZWNhdXNlIGl0IG5lZWQgdG8gYmUgaW4gc3RyaWN0IG1vZGUuCigoKSA9PiB7CiJ1c2Ugc3RyaWN0IjsKCi8vIEVYVEVSTkFMIE1PRFVMRTogLi9zcmMvY3NzL2FwcC5jc3MKdmFyIGFwcCA9IF9fd2VicGFja19yZXF1aXJlX18oMTQ5KTsKdmFyIGFwcF9kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihhcHApOwovLyBFWFRFUk5BTCBNT0RVTEU6IC4vc3JjL2Nzcy9tb2JpbGUtYXBwLmNzcwp2YXIgbW9iaWxlX2FwcCA9IF9fd2VicGFja19yZXF1aXJlX18oODI1KTsKdmFyIG1vYmlsZV9hcHBfZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4obW9iaWxlX2FwcCk7Ci8vIEVYVEVSTkFMIE1PRFVMRTogLi9zcmMvY3NzL2FwcC5zY3NzCnZhciBjc3NfYXBwID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NSk7CnZhciBjc3NfYXBwX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNzc19hcHApOwo7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvY29tbW9uL2NvbnN0LnRzeAovKgogKiBAQXV0aG9yOiBtZW5nem9uZWZpcmUKICogQExhc3RFZGl0b3JzOiB0b3VzYWthc3AKICogQERlc2NyaXB0aW9uOiDlrZjmlL7lkITnp43lhajlsYDluLjph4/lr7nosaEKICovCnZhciB2ZXJzaW9uID0gIjMuMS44LjEiOyAvLyDlvZPliY3niYjmnKzlj7cKdmFyIHVwZGF0ZURhdGUgPSAiMjMuOS4xNiI7IC8vIOabtOaWsOW8ueeql+aYvuekuueahOaXpeacnwp2YXIgdXBkYXRlSW5mb1ZlciA9ICIzLjEuOCI7IC8vIOabtOaWsOW8ueeql+eahOeJiOacrCwg5rKh5b+F6KaB5o+Q56S655qE6Z2e5Yqf6IO95oCn5pu05paw5bCx5LiN5by556qX5LqGCnZhciBzd2FsQ3NzVmVyID0gIjMuMS42IjsgLy8g55Sx5LqO5YW25LuW5Li76aKY55qEQ3Nz5Luj56CB5Lya57yT5a2Y5Yiw5pys5ZywLCDmlYXmm7TmlrDkuLvpopjljIXniYjmnKwodXJsKeaXtiwg6ZyA6KaB5ZCM5pe25pu05paw6K+l5a2X5q615Lul5Yi35paw57yT5a2YCnZhciBsb2NVcmwgPSBsb2NhdGlvbi5ocmVmOwp2YXIgYmFpZHVNb2JpbGVQYWdlID0gImJhaWR1LmNvbS93YXAvaG9tZSI7CnZhciBiYWlkdU5ld1BhZ2UgPSAiYmFpZHUuY29tL2Rpc2svbWFpbiI7IC8vIOWMuemFjeaWsOeJiOW6puebmOeVjOmdogp2YXIgYmFpZHVTeW5jUGFnZSA9ICJiYWlkdS5jb20vZGlzay9zeW5jaHJvbml6YXRpb24iOyAvLyDljLnphY3lkIzmraXnqbrpl7QKdmFyIGJhaWR1U2hhcmVQYWdlID0gImJhaWR1LmNvbS9zLyI7IC8vIOWMuemFjeWIhuS6q+mhtQp2YXIgVEFHID0gIlvnp5LkvKDovazlrZjliqnmiYsgbW9kIGJ5IHRvdXNha2FzcF0iOwp2YXIgYWpheEVycm9yID0gNTE0OyAvLyDoh6rlrprkuYlhamF46K+35rGC5aSx6LSl5pe255qE6ZSZ6K+v56CBKOS4jeiDveS4jmh0dHAgc3RhdHVzQ29kZeWGsueqgSkKdmFyIGJkbGlua1ByZWZpeCA9ICJodHRwczovL3Bhbi5iYWlkdS5jb20vI2JkbGluaz0iOyAvLyDkuIDplK7np5LkvKDpk77mjqXnmoTliY3nvIAKdmFyIGNvbW1hbmRMaXN0ID0gWyJzZXQiLCAiZ2VuIiwgImluZm8iXTsgLy8g6L2s5a2Y6L6T5YWl5qGG5YaF5pSv5oyB6L6T5YWl55qE5ZG95LukCnZhciBVQSA9ICJuZXRkaXNrOyI7IC8vIOiHquWumuS5iVVzZXItQWdlbnQKdmFyIGV4dENzc1VybCA9IHsKICAgIERlZmF1bHQ6ICJodHRwczovL3VucGtnLmNvbS9Ac3dlZXRhbGVydDIvdGhlbWUtZGVmYXVsdEA1LjAuMTUvZGVmYXVsdC5taW4uY3NzIiwKICAgIERhcms6ICJodHRwczovL3VucGtnLmNvbS9Ac3dlZXRhbGVydDIvdGhlbWUtZGFya0A1LjAuMTUvZGFyay5taW4uY3NzIiwKICAgICJXb3JkUHJlc3MgQWRtaW4iOiAiaHR0cHM6Ly91bnBrZy5jb20vQHN3ZWV0YWxlcnQyL3RoZW1lLXdvcmRwcmVzcy1hZG1pbkA1LjAuMTUvd29yZHByZXNzLWFkbWluLm1pbi5jc3MiLAogICAgIk1hdGVyaWFsIFVJIjogImh0dHBzOi8vdW5wa2cuY29tL0Bzd2VldGFsZXJ0Mi90aGVtZS1tYXRlcmlhbC11aUA1LjAuMTUvbWF0ZXJpYWwtdWkubWluLmNzcyIsCiAgICBCdWxtYTogImh0dHBzOi8vdW5wa2cuY29tL0Bzd2VldGFsZXJ0Mi90aGVtZS1idWxtYUA1LjAuMTUvYnVsbWEubWluLmNzcyIsCiAgICAiQm9vdHN0cmFwIDQiOiAiaHR0cHM6Ly91bnBrZy5jb20vQHN3ZWV0YWxlcnQyL3RoZW1lLWJvb3RzdHJhcC00QDUuMC4xNS9ib290c3RyYXAtNC5taW4uY3NzIiwKfTsgLy8g5ZCE5Li76aKY5YyF5a+55bqU55qEdXJsCnZhciBhcHBFcnJvciA9IHsKICAgIFN3YWxDc3NJbnZhbGlkOiAiXHU2ODM3XHU1RjBGXHU1MzA1XHU2NTcwXHU2MzZFXHU5NTE5XHU4QkVGLCBcdTgxRUFcdTUyQThcdTRGN0ZcdTc1MjhcdTUxODVcdTdGNkVcdTY4MzdcdTVGMEYgKFx1OEJGN1x1NzBCOVx1Nzg2RVx1NUI5QSkiLAogICAgU3dhbENzc0VyclJlcTogIlx1NjgzN1x1NUYwRlx1NTMwNVx1NTJBMFx1OEY3RFx1NTkzMVx1OEQyNSwgXHU4MUVBXHU1MkE4XHU0RjdGXHU3NTI4XHU1MTg1XHU3RjZFXHU2ODM3XHU1RjBGIChcdThCRjdcdTcwQjlcdTc4NkVcdTVCOUEpLCBcdTk1MTlcdThCRUZcdTRFRTNcdTc4MDE6ICIsCiAgICBDbGlwYm9hcmRQcmVtaXNzaW9uRXJyOiAn5L2/55SoICLnm5HlkKzliarotLTmnb8iIOWKn+iDvemcgOimgeWFgeiuuOWJqui0tOadv+adg+mZkCFcbuivpeWKn+iDveWPquaUr+aMgUNocm9tZeezuy9FZGdlL09wZXJh5rWP6KeI5ZmoLCDkuI3mlK/mjIFGaXJlZm94LCDlkIzml7bms6jmhI/kvb/nlKhodHRwc+iuv+mXrumhtemdoiAoaHR0cOiuv+mXruS8muWvvOiHtOa1j+iniOWZqOebtOaOpeemgeatouWJqui0tOadv+adg+mZkCknLAp9OyAvLyDkuLvnqIvluo/lvILluLgKdmFyIGRvY1ByZWZpeDIgPSAiaHR0cHM6Ly94dHNhdC5naXRodWIuaW8vcmFwaWQtdXBsb2FkLXVzZXJzY3JpcHQtZG9jL2RvY3VtZW50IjsKdmFyIGRvYzIgPSB7CiAgICBzaGFyZURvYzogZG9jUHJlZml4MiArICIvRkFRL1x1OTUxOVx1OEJFRlx1NEVFM1x1NzgwMSIsCiAgICBsaW5rVHlwZURvYzogZG9jUHJlZml4MiArICIvSW5mby9cdTc5RDJcdTRGMjBcdTY4M0NcdTVGMEYiLAogICAgYmRsaW5rRG9jOiBkb2NQcmVmaXgyICsgIi9cdTc5RDJcdTRGMjBcdTk0RkVcdTYzQTVcdTc1MUZcdTYyMTAvXHU0RTAwXHU5NTJFXHU3OUQyXHU0RjIwIiwKfTsgLy8g5paH5qGj6L2954K5Mgp2YXIgbGlua1N0eWxlID0gJ2NsYXNzPSJtemZfbGluayIgcmVsPSJub29wZW5lciBub3JlZmVycmVyIiB0YXJnZXQ9Il9ibGFuayInOwp2YXIgYnRuU3R5bGUgPSAnY2xhc3M9Im16Zl9idG4iIHJlbD0ibm9vcGVuZXIgbm9yZWZlcnJlciIgdGFyZ2V0PSJfYmxhbmsiJzsKdmFyIGJkbGlua1BhdHRlcm4gPSAvI2JkbGluaz0oW1xkYS16QS1aKy89XSspLzsgLy8gYjY05Y+v6IO95Ye6546w55qE5a2X56ymOiDlpKflsI/lhpnlrZfmr41hLXpBLVosIOaVsOWtlzAtOSwgKywgLywgPSAoPeeUqOS6juacq+WwvuihpeS9jSkKLy8gZXhwb3J0IGNvbnN0IGh0bWxEb2N1bWVudCA9IGA8cCBjbGFzcz0ibXpmX3RleHQiPuenkuS8oOaXoOaViDwvcD5gOwovLyBleHBvcnQgY29uc3QgaHRtbEFib3V0QmRsaW5rID0gYOS7gOS5iOaYr+S4gOmUruenkuS8oD86IDxhIGhyZWY9IiR7ZG9jMi5iZGxpbmtEb2N9IiAke2xpbmtTdHlsZX0+5paH5qGj6L2954K5PC9hPmA7CnZhciBjb3B5RmFpbExpc3QgPSAnPGEgaWQ9ImNvcHlfZmFpbF9saXN0IiBjbGFzcz0ibXpmX2J0bjIiPuWkjeWItuWIl+ihqDwvYT4nOwp2YXIgY29weUZhaWxCcmFuY2hMaXN0ID0gJzxhIGlkPSJjb3B5X2ZhaWxfYnJhbmNoX2xpc3QiIGNsYXNzPSJtemZfYnRuMiI+5aSN5Yi25YiX6KGoPC9hPic7CnZhciBjb3B5U3VjY2Vzc0xpc3QgPSAnPGEgaWQ9ImNvcHlfc3VjY2Vzc19saXN0IiBjbGFzcz0ibXpmX2J0bjIiPuWkjeWItuWIl+ihqDwvYT4nOwoKOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2NvbW1vbi9kdVBhcnNlci50c3gKLyoKICogQEF1dGhvcjogbWVuZ3pvbmVmaXJlCiAqIEBMYXN0RWRpdG9yczogdG91c2FrYXNwCiAqIEBEZXNjcmlwdGlvbjog5ZCE56eN6Kej5p6Q5ZmoCiAqLwoKCi8qKgogKiBAZGVzY3JpcHRpb246IOS7jnVybOS4reino+aekOenkuS8oOmTvuaOpQogKi8KZnVuY3Rpb24gcGFyc2VRdWVyeUxpbmsodXJsKSB7CiAgICB2YXIgYmRsaW5rQjY0ID0gdXJsLm1hdGNoKGJkbGlua1BhdHRlcm4pOwogICAgcmV0dXJuIGJkbGlua0I2NCA/IGJkbGlua0I2NFsxXS5mcm9tQmFzZTY0KCkgOiAiIjsKfQovKioKICogQGRlc2NyaXB0aW9uOiDnp5LkvKDpk77mjqXop6PmnpDlmagKICovCmZ1bmN0aW9uIER1UGFyc2VyKCkgeyB9CkR1UGFyc2VyLnBhcnNlID0gZnVuY3Rpb24gZ2VuZXJhbER1Q29kZVBhcnNlKHN6VXJsKSB7CiAgICB2YXIgcjsKICAgIGlmIChzelVybC5pbmRleE9mKCJiZHBhbiIpID09PSAwKSB7CiAgICAgICAgciA9IER1UGFyc2VyLnBhcnNlRHVfdjEoc3pVcmwpOwogICAgICAgIHIudmVyID0gIlBhbkRMIjsKICAgIH0KICAgIGVsc2UgaWYgKHN6VXJsLmluZGV4T2YoIkJhaWR1UENTLUdvIikgPT09IDApIHsKICAgICAgICByID0gRHVQYXJzZXIucGFyc2VEdV92MihzelVybCk7CiAgICAgICAgci52ZXIgPSAiUENTLUdvIjsKICAgIH0KICAgIGVsc2UgaWYgKHN6VXJsLmluZGV4T2YoIkJETElOSyIpID09PSAwKSB7CiAgICAgICAgciA9IER1UGFyc2VyLnBhcnNlRHVfdjMoc3pVcmwpOwogICAgICAgIHIudmVyID0gIua4uOS+oCB2MSI7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByID0gRHVQYXJzZXIucGFyc2VEdV92NChzelVybCk7CiAgICAgICAgci52ZXIgPSAi5qKm5aes5qCH5YeGIjsKICAgIH0KICAgIHJldHVybiByOwp9OwpEdVBhcnNlci5wYXJzZUR1X3YxID0gZnVuY3Rpb24gcGFyc2VEdV92MShzelVybCkgewogICAgcmV0dXJuIHN6VXJsCiAgICAgICAgLnJlcGxhY2UoL1xzKmJkcGFuOlwvXC8vZywgIiAiKQogICAgICAgIC50cmltKCkKICAgICAgICAuc3BsaXQoIiAiKQogICAgICAgIC5tYXAoZnVuY3Rpb24gKHopIHsKICAgICAgICByZXR1cm4gegogICAgICAgICAgICAudHJpbSgpCiAgICAgICAgICAgIC5mcm9tQmFzZTY0KCkKICAgICAgICAgICAgLm1hdGNoKC8oW1xzXFNdKylcfChbXGRdezEsMjB9KVx8KFtcZGEtZl17MzJ9KSg/Olx8KFtcZGEtZl17MzJ9KSk/L2kpOwogICAgfSkKICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uICh6KSB7CiAgICAgICAgcmV0dXJuIHo7CiAgICB9KQogICAgICAgIC5tYXAoZnVuY3Rpb24gKGluZm8pIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBtZDU6IGluZm9bM10sCiAgICAgICAgICAgIG1kNXM6IGluZm9bNF0gfHwgJycsCiAgICAgICAgICAgIHNpemU6IE51bWJlci5wYXJzZUludChpbmZvWzJdKSwKICAgICAgICAgICAgcGF0aDogaW5mb1sxXSwKICAgICAgICB9OwogICAgfSk7Cn07CkR1UGFyc2VyLnBhcnNlRHVfdjIgPSBmdW5jdGlvbiBwYXJzZUR1X3YyKHN6VXJsKSB7CiAgICByZXR1cm4gc3pVcmwKICAgICAgICAuc3BsaXQoIlxuIikKICAgICAgICAubWFwKGZ1bmN0aW9uICh6KSB7CiAgICAgICAgLy8gdW5zaWduZWQgbG9uZyBsb25nOiAwfjE4NDQ2NzQ0MDczNzA5NTUxNjE1CiAgICAgICAgcmV0dXJuIHoKICAgICAgICAgICAgLnRyaW0oKQogICAgICAgICAgICAubWF0Y2goLy1sZW5ndGg9KFtcZF17MSwyMH0pIC1tZDU9KFtcZGEtZl17MzJ9KSg/OiAtc2xpY2VtZDU9KFtcZGEtZl17MzJ9KSk/W1xzXFNdKyIoW1xzXFNdKykiL2kpOwogICAgfSkKICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uICh6KSB7CiAgICAgICAgcmV0dXJuIHo7CiAgICB9KQogICAgICAgIC5tYXAoZnVuY3Rpb24gKGluZm8pIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBtZDU6IGluZm9bMl0sCiAgICAgICAgICAgIG1kNXM6IGluZm9bM10gfHwgJycsCiAgICAgICAgICAgIHNpemU6IE51bWJlci5wYXJzZUludChpbmZvWzFdKSwKICAgICAgICAgICAgcGF0aDogaW5mb1s0XSwKICAgICAgICB9OwogICAgfSk7Cn07CkR1UGFyc2VyLnBhcnNlRHVfdjMgPSBmdW5jdGlvbiBwYXJzZUR1X3YzKHN6VXJsKSB7CiAgICB2YXIgcmF3ID0gYXRvYihzelVybC5zbGljZSg2KS5yZXBsYWNlKC9ccy9nLCAiIikpOwogICAgaWYgKHJhdy5zbGljZSgwLCA1KSAhPT0gIkJERlNceDAwIikgewogICAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgdmFyIGJ1ZiA9IG5ldyBTaW1wbGVCdWZmZXIocmF3KTsKICAgIHZhciBwdHIgPSA5OwogICAgdmFyIGFyckZpbGVzID0gW107CiAgICB2YXIgZmlsZUluZm8sIG5hbWVTaXplOwogICAgdmFyIHRvdGFsID0gYnVmLnJlYWRVSW50KDUpOwogICAgdmFyIGk7CiAgICBmb3IgKGkgPSAwOyBpIDwgdG90YWw7IGkrKykgewogICAgICAgIC8vIOWkp+WwjyAoOCBieXRlcykKICAgICAgICAvLyBNRDUgKyBNRDVTICgweDIwKQogICAgICAgIC8vIG5hbWVTaXplICg0IGJ5dGVzKQogICAgICAgIC8vIE5hbWUgKHVuaWNvZGUpCiAgICAgICAgZmlsZUluZm8gPSB7fTsKICAgICAgICBmaWxlSW5mby5zaXplID0gYnVmLnJlYWRVTG9uZyhwdHIgKyAwKTsKICAgICAgICBmaWxlSW5mby5tZDUgPSBidWYucmVhZEhleChwdHIgKyA4LCAweDEwKTsKICAgICAgICBmaWxlSW5mby5tZDVzID0gYnVmLnJlYWRIZXgocHRyICsgMHgxOCwgMHgxMCk7CiAgICAgICAgbmFtZVNpemUgPSBidWYucmVhZFVJbnQocHRyICsgMHgyOCkgPDwgMTsKICAgICAgICBmaWxlSW5mby5uYW1lU2l6ZSA9IG5hbWVTaXplOwogICAgICAgIHB0ciArPSAweDJjOwogICAgICAgIGZpbGVJbmZvLnBhdGggPSBidWYucmVhZFVuaWNvZGUocHRyLCBuYW1lU2l6ZSk7CiAgICAgICAgYXJyRmlsZXMucHVzaChmaWxlSW5mbyk7CiAgICAgICAgcHRyICs9IG5hbWVTaXplOwogICAgfQogICAgcmV0dXJuIGFyckZpbGVzOwp9OwpEdVBhcnNlci5wYXJzZUR1X3Y0ID0gZnVuY3Rpb24gcGFyc2VEdV92MyhzelVybCkgewogICAgdmFyIGxpc3QgPSBzelVybAogICAgICAgIC5zcGxpdCgiXG4iKQogICAgICAgIC5tYXAoZnVuY3Rpb24gKHopIHsKICAgICAgICByZXR1cm4gegogICAgICAgICAgICAudHJpbSgpCiAgICAgICAgICAgIC5tYXRjaCgvXihbXGRhLWZdezl9W1xkYS16XVtcZGEtZl17MjJ9KSg/OiMoW1xkYS1mXXs5fVtcZGEtel1bXGRhLWZdezIyfSkpPyMoW1xkXXsxLDIwfSkjKFtcc1xTXSspL2kpOyAvLyAyMi44LjI55paw5aKe5pSv5oyB56ysMTDkvY3kuLpnLXrnmoTliqDlr4ZtZDUsIOi+k+WFpeWQjuiHquWKqOino+Wvhui9rOWtmAogICAgfSkKICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uICh6KSB7CiAgICAgICAgcmV0dXJuIHo7CiAgICB9KQogICAgICAgIC5tYXAoZnVuY3Rpb24gKGluZm8pIHsKICAgICAgICB2YXIgbWQ1ID0gZGVjcnlwdE1kNShpbmZvWzFdLnRvTG93ZXJDYXNlKCkpOwogICAgICAgIHZhciBtZDVzID0gaW5mb1syXSA/IGRlY3J5cHRNZDUoaW5mb1syXS50b0xvd2VyQ2FzZSgpKSA6IG51bGw7CiAgICAgICAgdmFyIGZzID0gTnVtYmVyLnBhcnNlSW50KGluZm9bM10pOwogICAgICAgIGlmIChtZDVzID09IG51bGwpIHsgLy8gMjU2S2lCIG1lYW5zIG1kNXMgPSBtZDUKICAgICAgICAgICAgaWYgKGZzIDw9IDI2MjE0NCkgewogICAgICAgICAgICAgICAgbWQ1cyA9IG1kNTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIG1kNXMgPSAnJzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gewogICAgICAgICAgICAvLyDmoIflh4bnoIEgLyDnn63niYjmoIflh4bnoIEo5pegbWQ1cykKICAgICAgICAgICAgbWQ1OiBtZDUsCiAgICAgICAgICAgIG1kNXM6IG1kNXMsCiAgICAgICAgICAgIHNpemU6IGZzLAogICAgICAgICAgICBwYXRoOiBpbmZvWzRdLAogICAgICAgIH07CiAgICB9KTsKICAgIHJldHVybiBsaXN0Owp9OwovKioKICog5LiA5Liq566A5Y2V55qE57G75Ly85LqOIE5vZGVKUyBCdWZmZXIg55qE5a6e546wLgogKiDnlKjkuo7op6PmnpDmuLjkvqDluqblqJjmj5Dlj5bnoIHjgIIKICogQHBhcmFtIHtTaW1wbGVCdWZmZXJ9CiAqLwpmdW5jdGlvbiBTaW1wbGVCdWZmZXIoc3RyKSB7CiAgICB0aGlzLmZyb21TdHJpbmcoc3RyKTsKfQpTaW1wbGVCdWZmZXIudG9TdGRIZXggPSBmdW5jdGlvbiB0b1N0ZEhleChuKSB7CiAgICByZXR1cm4gKCIwIiArIG4udG9TdHJpbmcoMTYpKS5zbGljZSgtMik7Cn07ClNpbXBsZUJ1ZmZlci5wcm90b3R5cGUuZnJvbVN0cmluZyA9IGZ1bmN0aW9uIGZyb21TdHJpbmcoc3RyKSB7CiAgICB2YXIgbGVuID0gc3RyLmxlbmd0aDsKICAgIHRoaXMuYnVmID0gbmV3IFVpbnQ4QXJyYXkobGVuKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICB0aGlzLmJ1ZltpXSA9IHN0ci5jaGFyQ29kZUF0KGkpOwogICAgfQp9OwpTaW1wbGVCdWZmZXIucHJvdG90eXBlLnJlYWRVbmljb2RlID0gZnVuY3Rpb24gcmVhZFVuaWNvZGUoaW5kZXgsIHNpemUpIHsKICAgIGlmIChzaXplICYgMSkgewogICAgICAgIHNpemUrKzsKICAgIH0KICAgIHZhciBidWZUZXh0ID0gQXJyYXkucHJvdG90eXBlLnNsaWNlCiAgICAgICAgLmNhbGwodGhpcy5idWYsIGluZGV4LCBpbmRleCArIHNpemUpCiAgICAgICAgLm1hcChTaW1wbGVCdWZmZXIudG9TdGRIZXgpOwogICAgdmFyIGJ1ZiA9IFsiIl07CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7IGkgKz0gMikgewogICAgICAgIGJ1Zi5wdXNoKGJ1ZlRleHRbaSArIDFdICsgYnVmVGV4dFtpXSk7CiAgICB9CiAgICByZXR1cm4gSlNPTi5wYXJzZSgnIicgKyBidWYuam9pbigiXFx1IikgKyAnIicpOwp9OwpTaW1wbGVCdWZmZXIucHJvdG90eXBlLnJlYWROdW1iZXIgPSBmdW5jdGlvbiByZWFkTnVtYmVyKGluZGV4LCBzaXplKSB7CiAgICB2YXIgcmV0ID0gMDsKICAgIGZvciAodmFyIGkgPSBpbmRleCArIHNpemU7IGkgPiBpbmRleDspIHsKICAgICAgICByZXQgPSB0aGlzLmJ1ZlstLWldICsgcmV0ICogMjU2OwogICAgfQogICAgcmV0dXJuIHJldDsKfTsKU2ltcGxlQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludCA9IGZ1bmN0aW9uIHJlYWRVSW50KGluZGV4KSB7CiAgICByZXR1cm4gdGhpcy5yZWFkTnVtYmVyKGluZGV4LCA0KTsKfTsKU2ltcGxlQnVmZmVyLnByb3RvdHlwZS5yZWFkVUxvbmcgPSBmdW5jdGlvbiByZWFkVUxvbmcoaW5kZXgpIHsKICAgIHJldHVybiB0aGlzLnJlYWROdW1iZXIoaW5kZXgsIDgpOwp9OwpTaW1wbGVCdWZmZXIucHJvdG90eXBlLnJlYWRIZXggPSBmdW5jdGlvbiByZWFkSGV4KGluZGV4LCBzaXplKSB7CiAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlCiAgICAgICAgLmNhbGwodGhpcy5idWYsIGluZGV4LCBpbmRleCArIHNpemUpCiAgICAgICAgLm1hcChTaW1wbGVCdWZmZXIudG9TdGRIZXgpCiAgICAgICAgLmpvaW4oIiIpOwp9OwoKLy8gRVhURVJOQUwgTU9EVUxFOiAuL3NyYy9jb21wb25lbnRzL3VwZGF0ZUluZm8uaHRtbAp2YXIgdXBkYXRlSW5mbyA9IF9fd2VicGFja19yZXF1aXJlX18oMTg0KTsKdmFyIHVwZGF0ZUluZm9fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4odXBkYXRlSW5mbyk7CjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9jb21tb24vc3dhbENvbmZpZy50c3gKLyoKICogQEF1dGhvcjogbWVuZ3pvbmVmaXJlCiAqIEBEYXRlOiAyMDIxLTA4LTI2IDEyOjE2OjU3CiAqIEBMYXN0RWRpdFRpbWU6IDIwMjMtMDItMTggMjE6Mjc6MzYKICogQExhc3RFZGl0b3JzOiBtZW5nem9uZWZpcmUKICogQERlc2NyaXB0aW9uOiDlrZjmlL7lkIRTd2Fs5by556qX55qE5Zu65a6a5Y+C5pWw6YWN572uCiAqLwoKCnZhciBTd2FsQ29uZmlnID0gewogICAgaW5wdXRWaWV3OiB7CiAgICAgICAgdGl0bGU6ICLor7fovpPlhaXnp5LkvKAm5L+d5a2Y6Lev5b6EIiwKICAgICAgICBzaG93Q2FuY2VsQnV0dG9uOiB0cnVlLAogICAgICAgIGh0bWw6ICI8dGV4dGFyZWEgaWQ9XCJtemYtcmFwaWQtaW5wdXRcIiBjbGFzcz1cInN3YWwyLXRleHRhcmVhXCIgcGxhY2Vob2xkZXI9XCJcdTAwQjcgXHU2NTJGXHU2MzAxXHU2Mjc5XHU5MUNGXHU4RjZDXHU1QjU4XHU1OTFBXHU2NzYxXHU3OUQyXHU0RjIwKFx1NjM2Mlx1ODg0Q1x1NTIwNlx1OTY5NClcblx1MDBCNyBcdTY1MkZcdTYzMDFQYW5ETC9cdTZFMzhcdTRGQTAvXHU2ODA3XHU1MUM2XHU3ODAxL1BDUy1HT1x1NjgzQ1x1NUYwRlxuXHUwMEI3IFx1NjUyRlx1NjMwMVx1OEY5M1x1NTE2NVx1NEUwMFx1OTUyRVx1NzlEMlx1NEYyMChcdTgxRUFcdTUyQThcdThGNkNcdTYzNjJcdTRFM0FcdTY2NkVcdTkwMUFcdTc5RDJcdTRGMjApXG5cdTAwQjcgXHU1M0VGXHU1NzI4XHU4QkJFXHU3RjZFXHU5ODc1XHU1RjAwXHU1NDJGXHU3NkQxXHU1NDJDXHU1MjZBXHU4RDM0XHU2NzdGLFx1ODFFQVx1NTJBOFx1N0M5OFx1OEQzNFx1NzlEMlx1NEYyMFxuXHUwMEI3IFx1OEY5M1x1NTE2NXNldFx1NjI1M1x1NUYwMFx1OEJCRVx1N0Y2RSwgZ2VuXHU4RkRCXHU1MTY1XHU3NTFGXHU2MjEwXHU5ODc1XG5cdTAwQjcgaW5mb1x1NjYzRVx1NzkzQVx1NzI0OFx1NjcyQ1x1NEZFMVx1NjA2RlwiIHN0eWxlPVwiZGlzcGxheTogZmxleDtwYWRkaW5nOiAwLjRlbTtcIj48L3RleHRhcmVhPlxuICAgIDxpbnB1dCBpZD1cIm16Zi1wYXRoLWlucHV0XCIgY2xhc3M9XCJzd2FsMi1pbnB1dFwiIHBsYWNlaG9sZGVyPVwiXHU0RkREXHU1QjU4XHU4REVGXHU1Rjg0LCBcdTc5M0FcdTRGOEI6IC9HVEE1LywgXHU3NTU5XHU3QTdBXHU0RkREXHU1QjU4XHU1NzI4XHU1RjUzXHU1MjREXHU3NkVFXHU1RjU1XCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4O21hcmdpbi10b3A6IDEwcHg7XCI+XG4gICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7YWxpZ24taXRlbXM6ZmxleC1lbmQ7bWFyZ2luOiAxMHB4IDJlbSAwIDJlbTtcIj5cbiAgICA8aW5wdXQgaWQ9XCJtemYtYWNjZXNzdG9rZW4taW5wdXRcIiBjbGFzcz1cInN3YWwyLWlucHV0XCIgcGxhY2Vob2xkZXI9XCJcdTYzODhcdTY3NDNcdTc4MDEgKFx1NzU1OVx1N0E3QVx1NTIxOVx1OTFDRFx1NzUyOFx1NEUwRFx1NTNEOClcIiBzdHlsZT1cImZsZXg6MVwiPlxuICAgIDxhIGhyZWY9XCJodHRwczovL29wZW5hcGkuYmFpZHUuY29tL29hdXRoLzIuMC9hdXRob3JpemU/cmVzcG9uc2VfdHlwZT10b2tlbiZjbGllbnRfaWQ9MHBzMURJbHJaQkNVSGxHanBiYWlCZGdHNGNqQnNkUjkmcmVkaXJlY3RfdXJpPW9vYiZzY29wZT1uZXRkaXNrXCIgY2xhc3M9XCJzd2FsMi1zdHlsZWRcIiBpZD1cIm16Zi1hY2Nlc3N0b2tlbi1hY3F1aXJlXCIgcmVsPVwibm9yZWZlcnJlclwiIHRhcmdldD1cIl9ibGFua1wiPlx1ODNCN1x1NTNENjwvYT5cbiAgICA8L2Rpdj5cbiAgICAiLAogICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiAi56Gu5a6aIiwKICAgICAgICBjYW5jZWxCdXR0b25UZXh0OiAi5Y+W5raIIiwKICAgICAgICBjdXN0b21DbGFzczogeyBodG1sQ29udGFpbmVyOiAibXpmX2h0bWxfY29udGFpbmVyIiB9LAogICAgfSwKICAgIHByb2Nlc3NWaWV3OiB7CiAgICAgICAgc2hvd0Nsb3NlQnV0dG9uOiB0cnVlLAogICAgICAgIHNob3dDb25maXJtQnV0dG9uOiBmYWxzZSwKICAgICAgICBhbGxvd091dHNpZGVDbGljazogZmFsc2UsCiAgICB9LAogICAgZmluaXNoVmlldzogewogICAgICAgIHNob3dDbG9zZUJ1dHRvbjogdHJ1ZSwKICAgICAgICBhbGxvd091dHNpZGVDbGljazogZmFsc2UsCiAgICB9LAogICAgZ2VuVW5maW5pc2g6IHsKICAgICAgICB0aXRsZTogIuajgOa1i+WIsOS4iuasoeacquWujOaIkOeahOenkuS8oOS7u+WKoSIsCiAgICAgICAgdGV4dDogIuaYr+WQpue7p+e7reivpeS7u+WKoT8iLAogICAgICAgIHNob3dDYW5jZWxCdXR0b246IHRydWUsCiAgICAgICAgYWxsb3dPdXRzaWRlQ2xpY2s6IGZhbHNlLAogICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiAi5pivIiwKICAgICAgICBjYW5jZWxCdXR0b25UZXh0OiAi5ZCmIiwKICAgIH0sCiAgICBnZW5VbmZpbmlzaDI6IHsKICAgICAgICB0aXRsZTogIuajgOa1i+WIsOS4iuasoeacquato+W4uOmAgOWHuueahOenkuS8oOS7u+WKoSIsCiAgICAgICAgdGV4dDogIuaYr+WQpuaBouWkjeivpeS7u+WKoT8iLAogICAgICAgIHNob3dDYW5jZWxCdXR0b246IHRydWUsCiAgICAgICAgYWxsb3dPdXRzaWRlQ2xpY2s6IGZhbHNlLAogICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiAi5pivIiwKICAgICAgICBjYW5jZWxCdXR0b25UZXh0OiAi5ZCmIiwKICAgIH0sCiAgICBnZW5WaWV3OiB7CiAgICAgICAgdGl0bGU6ICLor7fovpPlhaXpnIDopoHnlJ/miJDnmoTmlofku7bot6/lvoQiLAogICAgICAgIGlucHV0OiAidGV4dGFyZWEiLAogICAgICAgIHNob3dDYW5jZWxCdXR0b246IHRydWUsCiAgICAgICAgc2hvd0Nsb3NlQnV0dG9uOiB0cnVlLAogICAgICAgIGlucHV0UGxhY2Vob2xkZXI6ICJb5pSv5oyB5om56YePKOaNouihjOWIhumalCldIiwKICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogIuehruWumiIsCiAgICAgICAgY2FuY2VsQnV0dG9uVGV4dDogIuWPlua2iCIsCiAgICAgICAgaW5wdXRWYWxpZGF0b3I6IGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgICAgICBpZiAoIXZhbHVlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIuaWh+S7tui3r+W+hOS4jeiDveS4uuepuiI7CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgfSwKICAgIHVwZGF0ZUluZm86IHsKICAgICAgICB0aXRsZTogIlx1NzlEMlx1NEYyMFx1OTRGRVx1NjNBNVx1NjNEMFx1NTNENiB2IiArIHZlcnNpb24gKyAiICgiICsgdXBkYXRlRGF0ZSArICIpIiwKICAgICAgICBzaG93Q2xvc2VCdXR0b246IHRydWUsCiAgICAgICAgYWxsb3dPdXRzaWRlQ2xpY2s6IGZhbHNlLAogICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiAi55+l6YGT5LqGIiwKICAgICAgICBodG1sOiAodXBkYXRlSW5mb19kZWZhdWx0KCkpLAogICAgfSwKICAgIGNoZWNrUmVjdXJzaXZlOiB7CiAgICAgICAgaWNvbjogImluZm8iLAogICAgICAgIHRpdGxlOiAi5YyF5ZCr5paH5Lu25aS5LCDmmK/lkKbpgJLlvZLnlJ/miJA/IiwKICAgICAgICB0ZXh0OiAi6Iul6YCJ5pivLCDlsIblkIzml7bnlJ/miJDlkITnuqflrZDmlofku7blpLnkuIvnmoTmlofku7YiLAogICAgICAgIGFsbG93T3V0c2lkZUNsaWNrOiBmYWxzZSwKICAgICAgICBmb2N1c0NhbmNlbDogdHJ1ZSwKICAgICAgICBzaG93Q2FuY2VsQnV0dG9uOiB0cnVlLAogICAgICAgIHJldmVyc2VCdXR0b25zOiB0cnVlLAogICAgICAgIHNob3dDbG9zZUJ1dHRvbjogdHJ1ZSwKICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogIuaYryIsCiAgICAgICAgY2FuY2VsQnV0dG9uVGV4dDogIuWQpiIsCiAgICB9LAogICAgc2V0dGluZ1ZpZXc6IHsKICAgICAgICB0aXRsZTogIuenkuS8oOmTvuaOpeaPkOWPliDorr7nva7pobUiLAogICAgICAgIHNob3dDbG9zZUJ1dHRvbjogdHJ1ZSwKICAgICAgICBzaG93Q2FuY2VsQnV0dG9uOiB0cnVlLAogICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiAi56Gu5a6aIiwKICAgICAgICBjYW5jZWxCdXR0b25UZXh0OiAi5Y+W5raIIiwKICAgICAgICBhbGxvd091dHNpZGVDbGljazogZmFsc2UsCiAgICAgICAgaHRtbDogIjxsYWJlbCBmb3I9XCJtemYtdGhlbWVcIiBjbGFzcz1cInN3YWwyLWlucHV0LWxhYmVsXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAwcHhcIiA+XHU0RTNCXHU5ODk4XHU4QkJFXHU3RjZFPC9sYWJlbCA+IDxzZWxlY3QgY2xhc3M9XCJzd2FsMi1zZWxlY3RcIiBpZD1cIm16Zi10aGVtZVwiIHN0eWxlPVwiIGRpc3BsYXk6IGZsZXg7IGJvcmRlci13aWR0aDogMXB4OyBib3JkZXItc3R5bGU6IHNvbGlkOyB0ZXh0LWFsaWduLWxhc3Q6IGNlbnRlcjsgXCIgPiA8b3B0aW9uIHZhbHVlPVwiRGVmYXVsdFwiPkRlZmF1bHQgXHU3NjdEXHU4MjcyXHU0RTNCXHU5ODk4KFx1OUVEOFx1OEJBNCk8L29wdGlvbj4gPG9wdGlvbiB2YWx1ZT1cIkJ1bG1hXCI+QnVsbWEgXHU3NjdEXHU4MjcyXHU3QjgwXHU3RUE2PC9vcHRpb24+IDxvcHRpb24gdmFsdWU9XCJCb290c3RyYXAgNFwiPkJvb3RzdHJhcDQgXHU3NjdEXHU4MjcyXHU3QjgwXHU3RUE2PC9vcHRpb24+IDxvcHRpb24gdmFsdWU9XCJNYXRlcmlhbCBVSVwiPk1hdGVyaWFsVUkgXHU3NjdEXHU4MjcyXHU0RTNCXHU5ODk4PC9vcHRpb24+IDxvcHRpb24gdmFsdWU9XCJEYXJrXCI+RGFyayBcdTlFRDFcdTgyNzJcdTRFM0JcdTk4OTg8L29wdGlvbj4gPG9wdGlvbiB2YWx1ZT1cIldvcmRQcmVzcyBBZG1pblwiPldvcmRQcmVzc0FkbWluIFx1NzA3MFx1ODI3Mlx1NEUzQlx1OTg5ODwvb3B0aW9uPiA8L3NlbGVjdD4gPGxhYmVsIGZvcj1cIm16Zi1wYXRoVHlwZVwiIGNsYXNzPVwic3dhbDItaW5wdXQtbGFiZWxcIiA+XHU3NTFGXHU2MjEwXHU3OUQyXHU0RjIwXHU1QkZDXHU1MUZBXHU4REVGXHU1Rjg0XHU4QkJFXHU3RjZFPC9sYWJlbCA+IDxzZWxlY3QgY2xhc3M9XCJzd2FsMi1zZWxlY3RcIiBpZD1cIm16Zi1wYXRoVHlwZVwiIHN0eWxlPVwiIGRpc3BsYXk6IGZsZXg7IGJvcmRlci13aWR0aDogMXB4OyBib3JkZXItc3R5bGU6IHNvbGlkOyB0ZXh0LWFsaWduLWxhc3Q6IGNlbnRlcjsgXCIgPiA8b3B0aW9uIHZhbHVlPVwicmVsYXRpdmVcIj5cdTVCRkNcdTUxRkFcdTc2RjhcdTVCRjlcdThERUZcdTVGODQ8L29wdGlvbj4gPG9wdGlvbiB2YWx1ZT1cImFic29sdXRlXCI+XHU1QkZDXHU1MUZBXHU3RUREXHU1QkY5XHU4REVGXHU1Rjg0PC9vcHRpb24+IDwvc2VsZWN0PiA8bGFiZWwgZm9yPVwibXpmLWxpc3Rlbi1jbGlwYm9hcmRcIiBjbGFzcz1cInN3YWwyLWNoZWNrYm94XCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4XCIgPjxzcGFuIGNsYXNzPVwic3dhbDItbGFiZWxcIj5cdTc2RDFcdTU0MkNcdTUyNkFcdThEMzRcdTY3N0YgKFx1OTcwMFx1ODk4MVx1NTE0MVx1OEJCOFx1NTI2QVx1OEQzNFx1Njc3Rlx1Njc0M1x1OTY1MCk8L3NwYW4gPjxpbnB1dCBjbGFzcz1cIm16Zl9jaGVja19vcmlcIiB0eXBlPVwiY2hlY2tib3hcIiB2YWx1ZT1cIjFcIiBpZD1cIm16Zi1saXN0ZW4tY2xpcGJvYXJkXCIgLz48c3BhbiBjbGFzcz1cIm16Zl9jaGVja1wiPjwvc3BhbiA+PC9sYWJlbD4iLAogICAgfSwKICAgIHNldHRpbmdXYXJuaW5nOiB7CiAgICAgICAgdGl0bGU6ICLorr7nva7miJDlip8g5Yi35paw6aG16Z2i55Sf5pWIIiwKICAgICAgICBzaG93Q2xvc2VCdXR0b246IHRydWUsCiAgICAgICAgYWxsb3dPdXRzaWRlQ2xpY2s6IGZhbHNlLAogICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiAi55+l6YGT5LqGIiwKICAgIH0sCiAgICBzZWxlY3ROb0ZpbGVXYXJuaW5nOiB7CiAgICAgICAgdGl0bGU6ICLor7fli77pgInopoHnlJ/miJDnp5LkvKDnmoTmlofku7Yv5paH5Lu25aS5IiwKICAgICAgICBpY29uOiAiZXJyb3IiLAogICAgICAgIHNob3dDbG9zZUJ1dHRvbjogdHJ1ZSwKICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogIuefpemBk+S6hiIsCiAgICB9LAp9OwoKOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IGV4dGVybmFsICJTd2FsIgpjb25zdCBleHRlcm5hbF9Td2FsX25hbWVzcGFjZU9iamVjdCA9IFN3YWw7CnZhciBleHRlcm5hbF9Td2FsX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGV4dGVybmFsX1N3YWxfbmFtZXNwYWNlT2JqZWN0KTsKOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2NvbW1vbi9zd2FsQmFzZS50c3gKLyoKICogQEF1dGhvcjogbWVuZ3pvbmVmaXJlCiAqIEBMYXN0RWRpdG9yczogdG91c2FrYXNwCiAqIEBEZXNjcmlwdGlvbjog5a6a5LmJ5YWo5aWX55qE5YmN5Y+w5by556qX6YC76L6RLCDlnKhTd2Fs55qE5Zue6LCD5Ye95pWw5YaF6LCD55SoKioqVGFza+exu+WGheWumuS5ieeahOS7u+WKoeS7o+eggQogKi8KdmFyIF9fYXNzaWduID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX19hc3NpZ24pIHx8IGZ1bmN0aW9uICgpIHsKICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbih0KSB7CiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07CiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkKICAgICAgICAgICAgICAgIHRbcF0gPSBzW3BdOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdDsKICAgIH07CiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKfTsKdmFyIF9fYXdhaXRlciA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikgewogICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9CiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9CiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbInRocm93Il0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfQogICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9CiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpOwogICAgfSk7Cn07CnZhciBfX2dlbmVyYXRvciA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fZ2VuZXJhdG9yKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgYm9keSkgewogICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZzsKICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCAidGhyb3ciOiB2ZXJiKDEpLCAicmV0dXJuIjogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnOwogICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9CiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7CiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy4iKTsKICAgICAgICB3aGlsZSAoXykgdHJ5IHsKICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVsicmV0dXJuIl0gOiBvcFswXSA/IHlbInRocm93Il0gfHwgKCh0ID0geVsicmV0dXJuIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0OwogICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07CiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHsKICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTsKICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTsKICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH0KICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH0KICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpOwogICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7CiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfQogICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9OwogICAgfQp9Owp2YXIgX19zcHJlYWRBcnJheSA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fc3ByZWFkQXJyYXkpIHx8IGZ1bmN0aW9uICh0bywgZnJvbSkgewogICAgZm9yICh2YXIgaSA9IDAsIGlsID0gZnJvbS5sZW5ndGgsIGogPSB0by5sZW5ndGg7IGkgPCBpbDsgaSsrLCBqKyspCiAgICAgICAgdG9bal0gPSBmcm9tW2ldOwogICAgcmV0dXJuIHRvOwp9OwoKCgoKCgp2YXIgU3dhbGJhc2UgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7CiAgICBmdW5jdGlvbiBTd2FsYmFzZShyYXBpZHVwbG9hZFRhc2ssIGdlbmVyYXRlYmRsaW5rVGFzaykgewogICAgICAgIHRoaXMucmFwaWR1cGxvYWRUYXNrID0gcmFwaWR1cGxvYWRUYXNrOwogICAgICAgIHRoaXMuZ2VuZXJhdGViZGxpbmtUYXNrID0gZ2VuZXJhdGViZGxpbmtUYXNrOwogICAgfQogICAgLy8g5ZCI5bm2c3dhbOWPguaVsAogICAgU3dhbGJhc2UucHJvdG90eXBlLm1lcmdlQXJnID0gZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBpbnB1dEFyZ3MgPSBbXTsKICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykgewogICAgICAgICAgICBpbnB1dEFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTsKICAgICAgICB9CiAgICAgICAgdmFyIG91dHB1dCA9IHt9OwogICAgICAgIHZhciBzd2FsQ2ZnQXJncyA9IHsKICAgICAgICAgICAgLy8g56aB55SoYmFja2Ryb3DliqjnlLssIOmYu+atouWkmuasoeW8ueeql+aXtueahOWxj+mXqgogICAgICAgICAgICBzaG93Q2xhc3M6IHsgYmFja2Ryb3A6ICJzd2FsMi1ub2FuaW1hdGlvbiIgfSwKICAgICAgICAgICAgaGlkZUNsYXNzOiB7IGJhY2tkcm9wOiAic3dhbDItbm9hbmltYXRpb24iIH0sCiAgICAgICAgfTsKICAgICAgICAkLmV4dGVuZC5hcHBseSgkLCBfX3NwcmVhZEFycmF5KFtvdXRwdXQsIHRoaXMuc3dhbEdsb2JhbEFyZ3MsIHN3YWxDZmdBcmdzXSwgaW5wdXRBcmdzKSk7CiAgICAgICAgcmV0dXJuIG91dHB1dDsKICAgIH07CiAgICAvLyDngrnlh7sgIuenkuS8oOmTvuaOpSIg5ZCO5pi+56S655qE5by556qXCiAgICBTd2FsYmFzZS5wcm90b3R5cGUuaW5wdXRWaWV3ID0gZnVuY3Rpb24gKGlucHV0VmFsdWUpIHsKICAgICAgICBpZiAoaW5wdXRWYWx1ZSA9PT0gdm9pZCAwKSB7IGlucHV0VmFsdWUgPSAiIjsgfQogICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIGFjY2Vzc1Rva2VuUHJvcEtleSwgbGFzdEFjY2Vzc1Rva2VuLCBwYXRoVmFsdWUsIGFjY2Vzc1Rva2VuLCBwcmVDb25maXJtLCB3aWxsT3BlbjsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkgewogICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkgewogICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzVG9rZW5Qcm9wS2V5ID0gJyMnICsgZ2V0VXNlcklkKCkgKyAnOjphY2Nlc3NfdG9rZW4nOwogICAgICAgICAgICAgICAgICAgICAgICBsYXN0QWNjZXNzVG9rZW4gPSBHTV9nZXRWYWx1ZShhY2Nlc3NUb2tlblByb3BLZXkpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShHTV9nZXRWYWx1ZSgibGlzdGVuLWNsaXBib2FyZCIpICYmICFpbnB1dFZhbHVlKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHBhcnNlQ2xpcGJvYXJkKCldOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgLy8g5qCH5b+X5L2NdHJ1ZSDkuJQgaW5wdXRWYWx1ZeS4uuepuijpnZ7kuIDplK7np5LkvKDov5vlhaXml7YpIOS7juWJqui0tOadv+ivu+WPluacieaViOeahOenkuS8oOmTvuaOpQogICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFZhbHVlID0gX2Euc2VudCgpOwogICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDI7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICBwYXRoVmFsdWUgPSBHTV9nZXRWYWx1ZSgibGFzdF9kaXIiKSB8fCAiIjsKICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzVG9rZW4gPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgcHJlQ29uZmlybSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOaJi+WKqOivu+WPlk11bHRpcGxlIGlucHV0c+WGheeahOaVsOaNriwg55Sx5LqO5pyq6K6+572uaW5wdXTlj4LmlbAsIOWOn+eUn1ZhbGlkYXRvcuS4jeeUn+aViCwg6Ieq6KGM5re75YqgVmFsaWRhdG9y6YC76L6RCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFZhbHVlID0gJCgiI216Zi1yYXBpZC1pbnB1dCIpWzBdLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzVG9rZW4gPSAkKCIjbXpmLWFjY2Vzc3Rva2VuLWlucHV0IilbMF0udmFsdWUudHJpbSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aFZhbHVlID0gJCgiI216Zi1wYXRoLWlucHV0IilbMF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudmFsdWUudHJpbSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLyhccyspP1wvKFxzKyk/L2csICIvIik7IC8vIOS/ruato+S4jeWQiOinhOeahOi3r+W+hCjnqbrnmb3lvIDlpLQv57uT5bC+KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbnB1dFZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1hbmRMaXN0LmluY2x1ZGVzKGlucHV0VmFsdWUudHJpbSgpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOi+k+WFpeaUr+aMgeeahOWRveS7pCwg6Lez5Ye65qOA5p+lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRWYWx1ZSA9IGlucHV0VmFsdWUudHJpbSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFEdVBhcnNlci5wYXJzZShpbnB1dFZhbHVlKS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWxfU3dhbF9kZWZhdWx0KCkuc2hvd1ZhbGlkYXRpb25NZXNzYWdlKCI8cD5cdTY3MkFcdThCQzZcdTUyMkJcdTUyMzBcdTZCNjNcdTc4NkVcdTc2ODRcdTk0RkVcdTYzQTUgPGEgaHJlZj1cIiIgKyBkb2MyLmxpbmtUeXBlRG9jICsgIlwiICIgKyBsaW5rU3R5bGUgKyAiPlx1NjdFNVx1NzcwQlx1NjUyRlx1NjMwMVx1NjgzQ1x1NUYwRjwvYT48L3A+Iik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsX1N3YWxfZGVmYXVsdCgpLnNob3dWYWxpZGF0aW9uTWVzc2FnZSgiPHA+IiArICgnJyArIGUpICsgIjwvcD4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGF0aFZhbHVlLm1hdGNoKGlsbGVnYWxQYXRoUGF0dGVybikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbF9Td2FsX2RlZmF1bHQoKS5zaG93VmFsaWRhdGlvbk1lc3NhZ2UoJ+S/neWtmOi3r+W+hOS4jeiDveWQq+acieWtl+esplxcIjoqPzw+fCwg56S65L6L77yaL0dUQTUvJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhY2Nlc3NUb2tlbiAmJiAhbGFzdEFjY2Vzc1Rva2VuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWxfU3dhbF9kZWZhdWx0KCkuc2hvd1ZhbGlkYXRpb25NZXNzYWdlKCfor7floavlhpnmjojmnYPnoIEnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHdpbGxPcGVuID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlcXVlc3RJZCA9ICcnICsgRGF0ZS5ub3coKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNwb25zZVByZWZpeCA9ICJhY2Nlc3NUb2tlbjoiICsgcmVxdWVzdElkICsgIjoiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgR01fc2V0VmFsdWUoImFjY2Vzc1Rva2VuUmVxdWVzdCIsICJyZXF1ZXN0OiIgKyByZXF1ZXN0SWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgiI216Zi1hY2Nlc3N0b2tlbi1pbnB1dCIpLmRhdGEoJ3JlcXVlc3QtaWQnLCByZXF1ZXN0SWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgiI3N3YWwyLWh0bWwtY29udGFpbmVyIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3NzKCJmb250LXNpemUiLCAiMXJlbSIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNzcygiZGlzcGxheSIsICJncmlkIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3NzKCJtYXJnaW4iLCAiMCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RBY2Nlc3NUb2tlbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoIiNtemYtYWNjZXNzdG9rZW4taW5wdXQiKVswXS5jbGFzc0xpc3QuYWRkKCdtemYtYXV0by1maWxsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoIiNtemYtcmFwaWQtaW5wdXQiKVswXS52YWx1ZSA9IGlucHV0VmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCIjbXpmLXBhdGgtaW5wdXQiKVswXS52YWx1ZSA9IHBhdGhWYWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoIiNtemYtcmFwaWQtaW5wdXQiKS5vbigiaW5wdXQiLCBmdW5jdGlvbiAoZXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gcGFyc2VRdWVyeUxpbmsoZXZlbnQudGFyZ2V0LnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRHVQYXJzZXIucGFyc2UocmVzdWx0KS5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnRhcmdldC52YWx1ZSA9IHJlc3VsdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOyAvLyDnu5HlrprovpPlhaXmoYbkuovku7YsIOi+k+WFpeS4gOmUruenkuS8oOWQjuWwneivlei9rOaNouS4uuaZrumAmuenkuS8oAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgiI216Zi1hY2Nlc3N0b2tlbi1pbnB1dCIpLm9uKCJpbnB1dCIsIGZ1bmN0aW9uIChldmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudC50YXJnZXQudmFsdWUuc3RhcnRzV2l0aCgnaHR0cHM6Ly9vcGVuYXBpLmJhaWR1LmNvbS9vYXV0aC8yLjAvbG9naW5fc3VjY2VzcyMnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG0gPSBuZXcgVVJMKGV2ZW50LnRhcmdldC52YWx1ZSkuaGFzaC5tYXRjaCgvJmFjY2Vzc190b2tlbj0oW14gPSZdKykmLyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnRhcmdldC52YWx1ZSA9IG1bMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHsgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcG9sbEFjY2Vzc1Rva2VuKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWwgPSBHTV9nZXRWYWx1ZSgiYWNjZXNzVG9rZW5SZXF1ZXN0Iik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCAmJiB2YWwuc3RhcnRzV2l0aChyZXNwb25zZVByZWZpeCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzVG9rZW4gPSB2YWwuc3Vic3RyaW5nKHJlc3BvbnNlUHJlZml4Lmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoIiNtemYtYWNjZXNzdG9rZW4taW5wdXQiKVswXS52YWx1ZSA9IGFjY2Vzc1Rva2VuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgiYWNjZXNzVG9rZW5SZXF1ZXN0IiwgIiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZShhY2Nlc3NUb2tlblByb3BLZXksIGFjY2Vzc1Rva2VuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZWxlbSA9ICQoIiNtemYtYWNjZXNzdG9rZW4taW5wdXQiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbS5sZW5ndGggPT09IDEgJiYgZWxlbS5kYXRhKCdyZXF1ZXN0LWlkJykgPT09IHJlcXVlc3RJZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KHBvbGxBY2Nlc3NUb2tlbiwgMTAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2xsQWNjZXNzVG9rZW4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWxfU3dhbF9kZWZhdWx0KCkuZmlyZSh0aGlzLm1lcmdlQXJnKFN3YWxDb25maWcuaW5wdXRWaWV3LCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVDb25maXJtOiBwcmVDb25maXJtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbE9wZW46IHdpbGxPcGVuLAogICAgICAgICAgICAgICAgICAgICAgICB9KSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmlzQ29uZmlybWVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2Vzc1Rva2VuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKGFjY2Vzc1Rva2VuUHJvcEtleSwgYWNjZXNzVG9rZW4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlucHV0VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRWYWx1ZSA9PT0gInNldCIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnNldHRpbmdWaWV3KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaW5wdXRWYWx1ZSA9PT0gImdlbiIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmdlblZpZXcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpbnB1dFZhbHVlID09PSAiaW5mbyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnVwZGF0ZUluZm8oZnVuY3Rpb24gKCkgeyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMucmFwaWR1cGxvYWRUYXNrLnJlc2V0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnJhcGlkdXBsb2FkVGFzay5hY2Nlc3NUb2tlbiA9IGFjY2Vzc1Rva2VuIHx8IGxhc3RBY2Nlc3NUb2tlbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMucmFwaWR1cGxvYWRUYXNrLmZpbGVJbmZvTGlzdCA9IER1UGFyc2VyLnBhcnNlKGlucHV0VmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgibGFzdF9kaXIiLCBwYXRoVmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhdGhWYWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g6Lev5b6E55WZ56m6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5yYXBpZHVwbG9hZFRhc2suaXNEZWZhdWx0UGF0aCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbm93UGF0aCA9IGxvY2F0aW9uLmhyZWYubWF0Y2goL3BhdGg9KC4rPykoPzomfCQpLyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobm93UGF0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhWYWx1ZSA9IGRlY29kZVVSSUNvbXBvbmVudChub3dQYXRoWzFdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vd1BhdGggPSBsb2NhdGlvbi5ocmVmLm1hdGNoKC9cL1wvcGFuXC5iYWlkdVwuY29tXC93YXBcL2hvbWUjXC9kaXJcLyguKz8pKD86JnwkKS8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub3dQYXRoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhWYWx1ZSA9IGRlY29kZVVSSUNvbXBvbmVudChub3dQYXRoWzFdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhWYWx1ZSA9ICIvIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGhWYWx1ZS5jaGFyQXQoMCkgIT09ICIvIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhWYWx1ZSA9ICIvIiArIHBhdGhWYWx1ZTsgLy8g6KGl6b2Q6Lev5b6E5YmN57yA5pac5p2gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXRoVmFsdWUuY2hhckF0KHBhdGhWYWx1ZS5sZW5ndGggLSAxKSAhPT0gIi8iKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aFZhbHVlICs9ICIvIjsgLy8g6KGl5YWo6Lev5b6E57uT5bC+55qE5pac5p2gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NVcmwuaW5jbHVkZXMoYmFpZHVTeW5jUGFnZSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFwYXRoVmFsdWUuaW5jbHVkZXMoc3luY1BhdGhQcmVmaXgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aFZhbHVlID0gc3luY1BhdGhQcmVmaXggKyBwYXRoVmFsdWU7IC8vIOihpeWFqOWQjOatpemhtei3r+W+hOWJjee8gAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygiXHU3OUQyXHU0RjIwXHU2NTg3XHU0RUY2XHU0RkREXHU1QjU4XHU1MjMwOiAiICsgcGF0aFZhbHVlKTsgLy8gZGVidWcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMucmFwaWR1cGxvYWRUYXNrLnNhdmVQYXRoID0gcGF0aFZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5wcm9jZXNzVmlldyhmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgIH07CiAgICAvLyDovazlrZgv55Sf5oiQ6L+H56iL5Lit55qE5by556qXCiAgICBTd2FsYmFzZS5wcm90b3R5cGUucHJvY2Vzc1ZpZXcgPSBmdW5jdGlvbiAoaXNHZW4pIHsKICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgIHZhciBzd2FsQXJnOwogICAgICAgIGlmIChpc0dlbikgewogICAgICAgICAgICBzd2FsQXJnID0gewogICAgICAgICAgICAgICAgdGl0bGU6ICLnp5LkvKDnlJ/miJDkuK0iLAogICAgICAgICAgICAgICAgaHRtbDogIjxwPuato+WcqOeUn+aIkOesrCA8ZmlsZV9udW0+MDwvZmlsZV9udW0+IOS4qjwvcD48cD48Z2VuX3Byb2c+5q2j5Zyo6I635Y+W5paH5Lu25YiX6KGoLi4uPC9nZW5fcHJvZz48L3A+IiwKICAgICAgICAgICAgICAgIHdpbGxPcGVuOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWxfU3dhbF9kZWZhdWx0KCkuc2hvd0xvYWRpbmcoKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBzd2FsQXJnID0gewogICAgICAgICAgICAgICAgdGl0bGU6ICLmlofku7bovazlrZjkuK0iLAogICAgICAgICAgICAgICAgaHRtbDogIuato+WcqOi9rOWtmOesrCA8ZmlsZV9udW0+MDwvZmlsZV9udW0+IOS4qiIsCiAgICAgICAgICAgICAgICB3aWxsT3BlbjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGV4dGVybmFsX1N3YWxfZGVmYXVsdCgpLnNob3dMb2FkaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMuc2F2ZUZpbGVXb3JrKCk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBleHRlcm5hbF9Td2FsX2RlZmF1bHQoKS5maXJlKHRoaXMubWVyZ2VBcmcoU3dhbENvbmZpZy5wcm9jZXNzVmlldywgc3dhbEFyZykpOwogICAgfTsKICAgIFN3YWxiYXNlLnByb3RvdHlwZS5nZXRCZGxpbmtzID0gZnVuY3Rpb24gKGJkY29kZSwgd2l0aF9wYXRoLCBhYnNvbHV0ZV9wYXRoX21vZGUpIHsKICAgICAgICB2YXIgYmRsaW5rcyA9IGJkY29kZS5zcGxpdCgnXG4nKTsKICAgICAgICBpZiAoIXdpdGhfcGF0aCkgewogICAgICAgICAgICAvLyDljrvpmaTnp5LkvKDpk77mjqXkuK3nmoTnm67lvZXnu5PmnoQo5LuF5L+d55WZ5paH5Lu25ZCNKQogICAgICAgICAgICBiZGxpbmtzID0gYmRsaW5rcy5tYXAoZnVuY3Rpb24gKGxuaykgeyByZXR1cm4gbG5rLnJlcGxhY2UoL14oWzAtOUEtWmEtel17MzJ9Iyg/OlswLTlBLVphLXpdezMyfSMpP1xkKyMpLipcLyhbXi9dKikkLywgIiQxJDIiKTsgfSk7CiAgICAgICAgICAgIGJkbGlua3MgPSBiZGxpbmtzLmZpbHRlcihmdW5jdGlvbiAobG5rKSB7IHJldHVybiBsbmsubWF0Y2goL14wezMyfSMoPzowezMyfSMpPzAjLykgPT0gbnVsbDsgfSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCFhYnNvbHV0ZV9wYXRoX21vZGUpIHsKICAgICAgICAgICAgLy8g5Y676Zmk5YmN572u55qE6Lev5b6E5Lul5Y+K6Lev5b6E5byA5aS055qEJy8nLCDlsIbnu53lr7not6/lvoTovazmjaLkuLrnm7jlr7not6/lvoQgKOm7mOiupOaJp+ihjCkKICAgICAgICAgICAgdmFyIGxvY2FsUGF0aFByZWZpeF8xID0gIiI7CiAgICAgICAgICAgIHZhciBub3dQYXRoID0gbG9jYXRpb24uaHJlZi5tYXRjaCgvcGF0aD0oLis/KSg/OiZ8JCkvKTsKICAgICAgICAgICAgaWYgKG5vd1BhdGgpCiAgICAgICAgICAgICAgICBsb2NhbFBhdGhQcmVmaXhfMSA9IGRlY29kZVVSSUNvbXBvbmVudChub3dQYXRoWzFdKTsKICAgICAgICAgICAgYmRsaW5rcyA9IGJkbGlua3MubWFwKGZ1bmN0aW9uIChsbmspIHsKICAgICAgICAgICAgICAgIHZhciBwYXJ0cyA9IGxuay5zcGxpdCgnIycpOwogICAgICAgICAgICAgICAgaWYgKHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdLnN0YXJ0c1dpdGgobG9jYWxQYXRoUHJlZml4XzEgKyAnLycpKSB7CiAgICAgICAgICAgICAgICAgICAgcGFydHNbcGFydHMubGVuZ3RoIC0gMV0gPSBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXS5zdWJzdHJpbmcobG9jYWxQYXRoUHJlZml4XzEubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXSA9IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdLnJlcGxhY2UoL15cLysvLCAiIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gcGFydHMuam9pbignIycpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8vIOS/neeVmeWujOaVtOeahOaWh+S7tui3r+W+hCjnu53lr7not6/lvoQpCiAgICAgICAgfQogICAgICAgIHJldHVybiBiZGxpbmtzOwogICAgfTsKICAgIC8vIOi9rOWtmC/nlJ/miJDnp5LkvKDlrozmiJDnmoTlvLnnqpcKICAgIFN3YWxiYXNlLnByb3RvdHlwZS5maW5pc2hWaWV3ID0gZnVuY3Rpb24gKGlzR2VuKSB7CiAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICB2YXIgZmlsZUluZm9MaXN0ID0gaXNHZW4KICAgICAgICAgICAgPyB0aGlzLmdlbmVyYXRlYmRsaW5rVGFzay5maWxlSW5mb0xpc3QKICAgICAgICAgICAgOiB0aGlzLnJhcGlkdXBsb2FkVGFzay5maWxlSW5mb0xpc3Q7CiAgICAgICAgdmFyIGFjdGlvbiA9IGlzR2VuID8gIueUn+aIkCIgOiAi6L2s5a2YIjsKICAgICAgICB2YXIgcGFyc2VSZXN1bHQgPSBwYXJzZWZpbGVJbmZvKGZpbGVJbmZvTGlzdCk7CiAgICAgICAgdGhpcy5wYXJzZVJlc3VsdCA9IHBhcnNlUmVzdWx0OwogICAgICAgIHZhciBjaGVja2JveEFyZyA9IHsKICAgICAgICAgICAgaW5wdXQ6ICJjaGVja2JveCIsCiAgICAgICAgICAgIGlucHV0VmFsdWU6IEdNX2dldFZhbHVlKCJ3aXRoX3BhdGgiKSwKICAgICAgICAgICAgaW5wdXRQbGFjZWhvbGRlcjogIuWvvOWHuuaWh+S7tuWkueebruW9lee7k+aehCIsCiAgICAgICAgfTsgLy8g5YWo6YOo5aSx6LSl5LiN5pi+56S65q2kY2hlY2tib3gsIDIyLjUuMjI6IOWFqOmDqOWksei0peS5n+aYvuekugogICAgICAgIHZhciBodG1sID0gKHBhcnNlUmVzdWx0Lmh0bWxJbmZvICYmIGlzR2VuID8gIjxicj4iIDogIiIpICsKICAgICAgICAgICAgcGFyc2VSZXN1bHQuaHRtbEluZm87IC8vIOa3u+WKoOWksei0peWIl+ihqCwg55Sf5oiQ5qih5byP5LiL5re75Yqg6aG26YOo56m66KGM5YiG6ZqUCiAgICAgICAgdmFyIGh0bWxGb290ZXIgPSAiIjsKICAgICAgICBpZiAoaHRtbEZvb3RlcikKICAgICAgICAgICAgaHRtbEZvb3RlciA9ICI8YnI+IiArIGh0bWxGb290ZXI7IC8vIOa3u+WKoOW6lemDqOepuuihjOWIhumalAogICAgICAgIHZhciBzdWNjZXNzQW55ID0gZmlsZUluZm9MaXN0Lmxlbmd0aCAtIHBhcnNlUmVzdWx0LmZhaWxMaXN0Lmxlbmd0aCA+IDA7CiAgICAgICAgdmFyIHN3YWxBcmcgPSBfX2Fzc2lnbihfX2Fzc2lnbih7IHRpdGxlOiBhY3Rpb24gKyAiXHU1QjhDXHU2QkQ1IFx1NTE3MSIgKyBmaWxlSW5mb0xpc3QubGVuZ3RoICsgIlx1NEUyQSwgXHU1OTMxXHU4RDI1IiArIHBhcnNlUmVzdWx0LmZhaWxMaXN0Lmxlbmd0aCArICJcdTRFMkEhIiwgY29uZmlybUJ1dHRvblRleHQ6IGlzR2VuID8gIuWkjeWItuenkuS8oOS7o+eggSIgOiAi56Gu6K6kIiwgc2hvd0RlbnlCdXR0b246IGlzR2VuLCBkZW55QnV0dG9uVGV4dDogIuWkjeWItuS4gOmUruenkuS8oCIsIGRlbnlCdXR0b25Db2xvcjogIiNlY2FlM2MiLCByZXZlcnNlQnV0dG9uczogdHJ1ZSwgaHRtbDogaHRtbCArIGh0bWxGb290ZXIgfSwgKGlzR2VuICYmIGNoZWNrYm94QXJnKSksIHsgd2lsbE9wZW46IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmIChpc0dlbikgewogICAgICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCJ1bkNsb3NlIiwgdHJ1ZSk7IC8vIOeUn+aIkOaooeW8j+iuvue9rue7k+aenOeql+WPo+acquWFs+mXreeahOagh+iusAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoc3VjY2Vzc0FueSAmJiAhaXNHZW4pIHsKICAgICAgICAgICAgICAgICAgICBfdGhpcy5hZGRPcGVuRGlyQnRuKCk7IC8vIOi9rOWtmOaooeW8j+aXtua3u+WKoCAi5omT5byA55uu5b2VIiDmjInpkq4KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgCiAgICAgICAgICAgIC8vIOenkuS8oOeUn+aIkOeahCAi5aSN5Yi25LiA6ZSu56eS5LygIiDmjInpkq7lm57osIMKICAgICAgICAgICAgcHJlRGVueTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIHdpdGhfcGF0aCA9ICQoIiNzd2FsMi1jaGVja2JveCIpWzBdLmNoZWNrZWQ7CiAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgid2l0aF9wYXRoIiwgd2l0aF9wYXRoKTsKICAgICAgICAgICAgICAgIEdNX3NldENsaXBib2FyZCgKICAgICAgICAgICAgICAgIC8vIOi9rOaNouS4uuS4gOmUruenkuS8oAogICAgICAgICAgICAgICAgYmRsaW5rUHJlZml4ICsgX3RoaXMuZ2V0QmRsaW5rcyhwYXJzZVJlc3VsdC5iZGNvZGUsIHdpdGhfcGF0aCwgR01fZ2V0VmFsdWUoInBhdGhUeXBlIikgPT0gImFic29sdXRlIikuam9pbignXG4nKS50b0Jhc2U2NCgpKTsKICAgICAgICAgICAgICAgIGV4dGVybmFsX1N3YWxfZGVmYXVsdCgpLmdldERlbnlCdXR0b24oKS5pbm5lclRleHQgPSAi5aSN5Yi25oiQ5YqfLOeCueWHu+WPs+S4iuWFs+mXrSI7CiAgICAgICAgICAgICAgICB2YXIgZm9vdGVyID0gZXh0ZXJuYWxfU3dhbF9kZWZhdWx0KCkuZ2V0Rm9vdGVyKCk7CiAgICAgICAgICAgICAgICAvLyBmb290ZXIuaW5uZXJIVE1MID0gaHRtbEFib3V0QmRsaW5rOwogICAgICAgICAgICAgICAgZm9vdGVyLnN0eWxlLmRpc3BsYXkgPSAiZmxleCI7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0sIHByZUNvbmZpcm06IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmIChpc0dlbikgewogICAgICAgICAgICAgICAgICAgIC8vIOeUn+aIkOaooeW8jywgIuWkjeWItuenkuS8oOS7o+eggSLmjInpkq4KICAgICAgICAgICAgICAgICAgICB2YXIgd2l0aF9wYXRoID0gJCgiI3N3YWwyLWNoZWNrYm94IilbMF0uY2hlY2tlZDsKICAgICAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgid2l0aF9wYXRoIiwgd2l0aF9wYXRoKTsKICAgICAgICAgICAgICAgICAgICBHTV9zZXRDbGlwYm9hcmQoX3RoaXMuZ2V0QmRsaW5rcyhwYXJzZVJlc3VsdC5iZGNvZGUsIHdpdGhfcGF0aCwgR01fZ2V0VmFsdWUoInBhdGhUeXBlIikgPT0gImFic29sdXRlIikuam9pbignXG4nKSk7CiAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWxfU3dhbF9kZWZhdWx0KCkuZ2V0Q29uZmlybUJ1dHRvbigpLmlubmVyVGV4dCA9ICLlpI3liLbmiJDlip8s54K55Ye75Y+z5LiK5YWz6ZetIjsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvLyDovazlrZjmqKHlvI8sICLnoa7lrpoiIOaMiemSrgogICAgICAgICAgICAgICAgICAgIGlmICghaXNHZW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaExpc3QoKTsgLy8g6LCD55So5Yi35paw5paH5Lu25YiX6KGo55qE5pa55rOVCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gfSk7CiAgICAgICAgZXh0ZXJuYWxfU3dhbF9kZWZhdWx0KCkuZmlyZSh0aGlzLm1lcmdlQXJnKFN3YWxDb25maWcuZmluaXNoVmlldywgc3dhbEFyZykpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkgewogICAgICAgICAgICBpZiAocmVzdWx0LmlzRGlzbWlzc2VkIHx8IHJlc3VsdC5kaXNtaXNzID09PSAoZXh0ZXJuYWxfU3dhbF9kZWZhdWx0KCkpLkRpc21pc3NSZWFzb24uY2xvc2UpIHsKICAgICAgICAgICAgICAgIEdNX2RlbGV0ZVZhbHVlKCJ1bmZpbmlzaCIpOyAvLyDngrnlh7vkuoblj7PkuIrop5LnmoTlhbPpl63mjInpkq4sIOa4hemZpOS7u+WKoei/m+W6puaVsOaNrgogICAgICAgICAgICAgICAgR01fc2V0VmFsdWUoInVuQ2xvc2UiLCBmYWxzZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH07CiAgICAvLyDnlJ/miJDmlofku7blpLnnp5LkvKAsIOaYr+WQpumAkuW9kueUn+aIkOaPkOekugogICAgU3dhbGJhc2UucHJvdG90eXBlLmNoZWNrUmVjdXJzaXZlID0gZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgZXh0ZXJuYWxfU3dhbF9kZWZhdWx0KCkuZmlyZSh0aGlzLm1lcmdlQXJnKFN3YWxDb25maWcuY2hlY2tSZWN1cnNpdmUpKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHsKICAgICAgICAgICAgaWYgKHJlc3VsdC5pc0NvbmZpcm1lZCkgewogICAgICAgICAgICAgICAgX3RoaXMuZ2VuZXJhdGViZGxpbmtUYXNrLnJlY3Vyc2l2ZSA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0LmRpc21pc3MgPT09IChleHRlcm5hbF9Td2FsX2RlZmF1bHQoKSkuRGlzbWlzc1JlYXNvbi5jYW5jZWwpCiAgICAgICAgICAgICAgICBfdGhpcy5nZW5lcmF0ZWJkbGlua1Rhc2sucmVjdXJzaXZlID0gZmFsc2U7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgX3RoaXMucHJvY2Vzc1ZpZXcodHJ1ZSk7CiAgICAgICAgICAgIF90aGlzLmdlbmVyYXRlYmRsaW5rVGFzay5zY2FuRmlsZSgwKTsKICAgICAgICB9KTsKICAgIH07CiAgICAvLyDorr7nva7pobUKICAgIFN3YWxiYXNlLnByb3RvdHlwZS5zZXR0aW5nVmlldyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgIHZhciB3aWxsT3BlbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgJCgiI3N3YWwyLWh0bWwtY29udGFpbmVyIikKICAgICAgICAgICAgICAgIC5jc3MoImZvbnQtc2l6ZSIsICIxcmVtIikKICAgICAgICAgICAgICAgIC5jc3MoImRpc3BsYXkiLCAiZ3JpZCIpCiAgICAgICAgICAgICAgICAuY3NzKCJtYXJnaW4iLCAiMCIpOwogICAgICAgICAgICAkKCIjbXpmLXRoZW1lIilbMF0udmFsdWUgPSBHTV9nZXRWYWx1ZSgic3dhbFRoZW1lcyIpIHx8ICJEZWZhdWx0IjsKICAgICAgICAgICAgJCgiI216Zi1wYXRoVHlwZSIpWzBdLnZhbHVlID0gR01fZ2V0VmFsdWUoInBhdGhUeXBlIikgfHwgInJlbGF0aXZlIjsKICAgICAgICAgICAgJCgiI216Zi1saXN0ZW4tY2xpcGJvYXJkIilbMF0uY2hlY2tlZCA9IEJvb2xlYW4oR01fZ2V0VmFsdWUoImxpc3Rlbi1jbGlwYm9hcmQiKSk7CiAgICAgICAgfTsKICAgICAgICB2YXIgcHJlQ29uZmlybSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIF9fYXdhaXRlcihfdGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIGVycm9yXzE7CiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHsKICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHsKICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIOiuvue9ruS4u+mimAogICAgICAgICAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgic3dhbFRoZW1lcyIsICQoIiNtemYtdGhlbWUiKVswXS52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIOiuvue9rueUn+aIkOenkuS8oOWvvOWHuui3r+W+hCjnm7jlr7kv57ud5a+5KQogICAgICAgICAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgicGF0aFR5cGUiLCAkKCIjbXpmLXBhdGhUeXBlIilbMF0udmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISQoIiNtemYtbGlzdGVuLWNsaXBib2FyZCIpWzBdLmNoZWNrZWQpIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdOwogICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDE7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzEsIDMsICwgNF0pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBuYXZpZ2F0b3IuY2xpcGJvYXJkLnJlYWRUZXh0KCldOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpOwogICAgICAgICAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgibGlzdGVuLWNsaXBib2FyZCIsICQoIiNtemYtbGlzdGVuLWNsaXBib2FyZCIpWzBdLmNoZWNrZWQpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA0XTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yXzEgPSBfYS5zZW50KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dBbGVydChhcHBFcnJvci5DbGlwYm9hcmRQcmVtaXNzaW9uRXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuIFsyIC8qcmV0dXJuKi9dOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9KTsgfTsKICAgICAgICBleHRlcm5hbF9Td2FsX2RlZmF1bHQoKS5maXJlKHRoaXMubWVyZ2VBcmcoU3dhbENvbmZpZy5zZXR0aW5nVmlldywgewogICAgICAgICAgICB3aWxsT3Blbjogd2lsbE9wZW4sCiAgICAgICAgICAgIHByZUNvbmZpcm06IHByZUNvbmZpcm0sCiAgICAgICAgfSkpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkgewogICAgICAgICAgICBpZiAocmVzdWx0LmlzQ29uZmlybWVkKQogICAgICAgICAgICAgICAgZXh0ZXJuYWxfU3dhbF9kZWZhdWx0KCkuZmlyZShfdGhpcy5tZXJnZUFyZyhTd2FsQ29uZmlnLnNldHRpbmdXYXJuaW5nKSk7CiAgICAgICAgfSk7CiAgICB9OwogICAgLy8g55Sf5oiQ6aG1ICjovpPlhaXot6/lvoTliJfooajov5vooYznp5LkvKDnlJ/miJApCiAgICBTd2FsYmFzZS5wcm90b3R5cGUuZ2VuVmlldyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgIGV4dGVybmFsX1N3YWxfZGVmYXVsdCgpLmZpcmUodGhpcy5tZXJnZUFyZyhTd2FsQ29uZmlnLmdlblZpZXcpKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHsKICAgICAgICAgICAgaWYgKHJlc3VsdC5pc0NvbmZpcm1lZCkgewogICAgICAgICAgICAgICAgX3RoaXMuZ2VuZXJhdGViZGxpbmtUYXNrLnJlc2V0KCk7CiAgICAgICAgICAgICAgICByZXN1bHQudmFsdWUuc3BsaXQoIlxuIikuZm9yRWFjaChmdW5jdGlvbiAoZmlsZVBhdGgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZVBhdGguY2hhckF0KDApICE9PSAiLyIpCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVQYXRoID0gIi8iICsgZmlsZVBhdGg7IC8vIOihpem9kOi3r+W+hOWJjee8gOaWnOadoAogICAgICAgICAgICAgICAgICAgIGlmIChsb2NVcmwuaW5jbHVkZXMoYmFpZHVTeW5jUGFnZSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgIWZpbGVQYXRoLmluY2x1ZGVzKHN5bmNQYXRoUHJlZml4KSkKICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVBhdGggPSBzeW5jUGF0aFByZWZpeCArIGZpbGVQYXRoOyAvLyDooaXlhajlkIzmraXpobXot6/lvoTliY3nvIAKICAgICAgICAgICAgICAgICAgICBfdGhpcy5nZW5lcmF0ZWJkbGlua1Rhc2suZmlsZUluZm9MaXN0LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiBmaWxlUGF0aCwKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgX3RoaXMucHJvY2Vzc1ZpZXcodHJ1ZSk7IC8vIOaYvuekuui/m+W6puW8ueeqlwogICAgICAgICAgICAgICAgX3RoaXMuZ2VuRmlsZVdvcmsoZmFsc2UsIHRydWUpOyAvLyDot7Pov4fojrflj5bpgInmi6nmlofku7bliJfooajlkozmiavmj4/mlofku7blpLnnmoTmraXpqqQKICAgICAgICAgICAgICAgIF90aGlzLmdlbmVyYXRlYmRsaW5rVGFzay5nZW5lcmF0ZUJkbGluaygwKTsgLy8g5byA5aeL55Sf5oiQ5Lu75YqhCiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH07CiAgICAvLyDnlJ/miJDnp5LkvKDmnKrlrozmiJDku7vliqHmj5DnpLoKICAgIFN3YWxiYXNlLnByb3RvdHlwZS5nZW5VbmZpbmlzaCA9IGZ1bmN0aW9uIChvbkNvbmZpcm0sIG9uQ2FuY2VsKSB7CiAgICAgICAgZXh0ZXJuYWxfU3dhbF9kZWZhdWx0KCkuZmlyZSh0aGlzLm1lcmdlQXJnKEdNX2dldFZhbHVlKCJ1bkNsb3NlIikKICAgICAgICAgICAgPyBTd2FsQ29uZmlnLmdlblVuZmluaXNoMgogICAgICAgICAgICA6IFN3YWxDb25maWcuZ2VuVW5maW5pc2gpKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHsKICAgICAgICAgICAgaWYgKHJlc3VsdC5pc0NvbmZpcm1lZCkKICAgICAgICAgICAgICAgIG9uQ29uZmlybSgpOwogICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQuZGlzbWlzcyA9PT0gKGV4dGVybmFsX1N3YWxfZGVmYXVsdCgpKS5EaXNtaXNzUmVhc29uLmNhbmNlbCkKICAgICAgICAgICAgICAgIG9uQ2FuY2VsKCk7CiAgICAgICAgfSk7CiAgICB9OwogICAgLy8g55Sf5oiQ56eS5LygLCDmnKrpgInmi6nku7vkvZXmlofku7bnmoTmj5DnpLoKICAgIFN3YWxiYXNlLnByb3RvdHlwZS5zZWxlY3ROb0ZpbGVXYXJuaW5nID0gZnVuY3Rpb24gKCkgewogICAgICAgIGV4dGVybmFsX1N3YWxfZGVmYXVsdCgpLmZpcmUodGhpcy5tZXJnZUFyZyhTd2FsQ29uZmlnLnNlbGVjdE5vRmlsZVdhcm5pbmcpKTsKICAgIH07CiAgICAvLyDmm7TmlrDkv6Hmga/pobUKICAgIFN3YWxiYXNlLnByb3RvdHlwZS51cGRhdGVJbmZvID0gZnVuY3Rpb24gKG9uQ29uZmlybSkgewogICAgICAgIGV4dGVybmFsX1N3YWxfZGVmYXVsdCgpLmZpcmUodGhpcy5tZXJnZUFyZyhTd2FsQ29uZmlnLnVwZGF0ZUluZm8pKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHsKICAgICAgICAgICAgaWYgKHJlc3VsdC5pc0NvbmZpcm1lZCkKICAgICAgICAgICAgICAgIG9uQ29uZmlybSgpOwogICAgICAgIH0pOwogICAgfTsKICAgIC8vIOS7peS4i+eahOaWueazlemDveaYr+S7u+WKoeaTjeS9nOmAu+i+kSwg5LiN5piv5by556qX6YC76L6RCiAgICBTd2FsYmFzZS5wcm90b3R5cGUuc2F2ZUZpbGVXb3JrID0gZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgdGhpcy5yYXBpZHVwbG9hZFRhc2sub25GaW5pc2ggPSBmdW5jdGlvbiAoKSB7IHJldHVybiBfdGhpcy5maW5pc2hWaWV3KGZhbHNlKTsgfTsKICAgICAgICB0aGlzLnJhcGlkdXBsb2FkVGFzay5vblByb2Nlc3MgPSBmdW5jdGlvbiAoaSwgZmlsZUluZm9MaXN0KSB7CiAgICAgICAgICAgIGV4dGVybmFsX1N3YWxfZGVmYXVsdCgpLmdldEh0bWxDb250YWluZXIoKS5xdWVyeVNlbGVjdG9yKCJmaWxlX251bSIpLnRleHRDb250ZW50ID0gaSArIDEgKyAiIC8gIiArIGZpbGVJbmZvTGlzdC5sZW5ndGg7CiAgICAgICAgfTsKICAgICAgICB0aGlzLnJhcGlkdXBsb2FkVGFzay5zdGFydCgpOyAvLyDlvIDlp4vovazlrZjku7vliqEKICAgIH07CiAgICBTd2FsYmFzZS5wcm90b3R5cGUuZ2VuRmlsZVdvcmsgPSBmdW5jdGlvbiAoaXNVbmZpbmlzaCwgaXNHZW5WaWV3KSB7CiAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICBpZiAodGhpcy5nZW5lcmF0ZWJkbGlua1Rhc2suaXNTaGFyZVBhZ2UpCiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGViZGxpbmtUYXNrLnNlbGVjdExpc3QgPSBnZXRTaGFyZUZpbGVMaXN0KCk7CiAgICAgICAgZWxzZSBpZiAoIWlzR2VuVmlldykKICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZWJkbGlua1Rhc2suc2VsZWN0TGlzdCA9IGdldFNlbGVjdGVkRmlsZUxpc3QoKTsKICAgICAgICBpZiAoCiAgICAgICAgLy8g5pyq6YCJ5oup5paH5Lu2ICsg5peg5pyq5a6M5oiQ55qE55Sf5oiQ5Lu75YqhICsg5LiN5Zyo55Sf5oiQ6aG1IC0+IOW8ueWHuuacqumAieaLqeeUn+aIkOaWh+S7tueahOitpuWRiuW8ueWHugogICAgICAgICF0aGlzLmdlbmVyYXRlYmRsaW5rVGFzay5zZWxlY3RMaXN0Lmxlbmd0aCAmJgogICAgICAgICAgICAhaXNHZW5WaWV3ICYmCiAgICAgICAgICAgICFpc1VuZmluaXNoKSB7CiAgICAgICAgICAgIHRoaXMuc2VsZWN0Tm9GaWxlV2FybmluZygpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRoaXMuZ2VuZXJhdGViZGxpbmtUYXNrLm9uUHJvY2VzcyA9IGZ1bmN0aW9uIChpLCBmaWxlSW5mb0xpc3QpIHsKICAgICAgICAgICAgZXh0ZXJuYWxfU3dhbF9kZWZhdWx0KCkuZ2V0SHRtbENvbnRhaW5lcigpLnF1ZXJ5U2VsZWN0b3IoImZpbGVfbnVtIikudGV4dENvbnRlbnQgPSBpICsgMSArICIgLyAiICsgZmlsZUluZm9MaXN0Lmxlbmd0aDsKICAgICAgICAgICAgZXh0ZXJuYWxfU3dhbF9kZWZhdWx0KCkuZ2V0SHRtbENvbnRhaW5lcigpLnF1ZXJ5U2VsZWN0b3IoImdlbl9wcm9nIikudGV4dENvbnRlbnQgPSAiMCUiOwogICAgICAgIH07CiAgICAgICAgdGhpcy5nZW5lcmF0ZWJkbGlua1Rhc2sub25Qcm9ncmVzcyA9IGZ1bmN0aW9uIChlLCB0ZXh0KSB7CiAgICAgICAgICAgIGlmICh0ZXh0ID09PSB2b2lkIDApIHsgdGV4dCA9ICIiOyB9CiAgICAgICAgICAgIGlmICh0ZXh0KSB7CiAgICAgICAgICAgICAgICAvLyDmmL7npLroh6rlrprkuYnmlofmnKwKICAgICAgICAgICAgICAgIGV4dGVybmFsX1N3YWxfZGVmYXVsdCgpLmdldEh0bWxDb250YWluZXIoKS5xdWVyeVNlbGVjdG9yKCJnZW5fcHJvZyIpLnRleHRDb250ZW50ID0gdGV4dDsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWUgfHwgdHlwZW9mIGUudG90YWwgIT09ICJudW1iZXIiKQogICAgICAgICAgICAgICAgcmV0dXJuOyAvLyDlj4LmlbDmlbDmja7kuI3mraPnoa4g6Lez6L+HCiAgICAgICAgICAgIGV4dGVybmFsX1N3YWxfZGVmYXVsdCgpLmdldEh0bWxDb250YWluZXIoKS5xdWVyeVNlbGVjdG9yKCJnZW5fcHJvZyIpLnRleHRDb250ZW50ID0gKChlLmxvYWRlZCAvIGUudG90YWwpICogMTAwKS50b0ZpeGVkKDApICsgIiUiOwogICAgICAgIH07CiAgICAgICAgaWYgKHRoaXMuZ2VuZXJhdGViZGxpbmtUYXNrLmlzU2hhcmVQYWdlKSB7CiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGViZGxpbmtUYXNrLm9uSGFzTm9EaXIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBfdGhpcy5wcm9jZXNzVmlldyh0cnVlKTsKICAgICAgICAgICAgICAgIF90aGlzLmdlbmVyYXRlYmRsaW5rVGFzay5zY2FuU2hhcmVGaWxlKDApOwogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZWJkbGlua1Rhc2sub25IYXNOb0RpciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIF90aGlzLnByb2Nlc3NWaWV3KHRydWUpOwogICAgICAgICAgICAgICAgX3RoaXMuZ2VuZXJhdGViZGxpbmtUYXNrLmdlbmVyYXRlQmRsaW5rKDApOwogICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLmdlbmVyYXRlYmRsaW5rVGFzay5vbkhhc0RpciA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIF90aGlzLmNoZWNrUmVjdXJzaXZlKCk7IH07CiAgICAgICAgfQogICAgICAgIHRoaXMuZ2VuZXJhdGViZGxpbmtUYXNrLm9uRmluaXNoID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gX3RoaXMuZmluaXNoVmlldyh0cnVlKTsgfTsKICAgICAgICBpZiAoIWlzVW5maW5pc2ggJiYgIWlzR2VuVmlldykKICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZWJkbGlua1Rhc2suc3RhcnQoKTsgLy8g5omn6KGM5paw5Lu75Yqh5Yid5aeL5YyWCiAgICB9OwogICAgU3dhbGJhc2UucHJvdG90eXBlLmNoZWNrVW5maW5pc2ggPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICBpZiAoR01fZ2V0VmFsdWUoInVuZmluaXNoIikpIHsKICAgICAgICAgICAgdGhpcy5nZW5VbmZpbmlzaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBfdGhpcy5wcm9jZXNzVmlldyh0cnVlKTsKICAgICAgICAgICAgICAgIF90aGlzLmdlbkZpbGVXb3JrKHRydWUsIGZhbHNlKTsKICAgICAgICAgICAgICAgIHZhciB1bmZpbmlzaEluZm8gPSBHTV9nZXRWYWx1ZSgidW5maW5pc2giKTsKICAgICAgICAgICAgICAgIF90aGlzLmdlbmVyYXRlYmRsaW5rVGFzay5maWxlSW5mb0xpc3QgPSB1bmZpbmlzaEluZm8uZmlsZV9pbmZvX2xpc3Q7CiAgICAgICAgICAgICAgICB1bmZpbmlzaEluZm8uaXNDaGVja01kNQogICAgICAgICAgICAgICAgICAgID8gX3RoaXMuZ2VuZXJhdGViZGxpbmtUYXNrLmNoZWNrTWQ1KHVuZmluaXNoSW5mby5maWxlX2lkKQogICAgICAgICAgICAgICAgICAgIDogX3RoaXMuZ2VuZXJhdGViZGxpbmtUYXNrLmdlbmVyYXRlQmRsaW5rKHVuZmluaXNoSW5mby5maWxlX2lkKTsKICAgICAgICAgICAgfSwgLy8g56Gu6K6k57un57ut5pyq5a6M5oiQ5Lu75YqhCiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIEdNX2RlbGV0ZVZhbHVlKCJ1bmZpbmlzaCIpOwogICAgICAgICAgICAgICAgX3RoaXMuZ2VuRmlsZVdvcmsoZmFsc2UsIGZhbHNlKTsKICAgICAgICAgICAgfSAvLyDkuI3nu6fnu63mnKrlrozmiJDku7vliqEsIOa4hemZpOaVsOaNriwg5byA5ZCv5paw5Lu75YqhCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB0aGlzLmdlbkZpbGVXb3JrKGZhbHNlLCBmYWxzZSk7CiAgICAgICAgfSAvLyDmsqHmnInmnKrlrozmiJDku7vliqEsIOebtOaOpeW8gOWQr+aWsOS7u+WKoQogICAgfTsKICAgIC8vIOa3u+WKoCAi5omT5byA55uu5b2VIiDmjInpkq4KICAgIFN3YWxiYXNlLnByb3RvdHlwZS5hZGRPcGVuRGlyQnRuID0gZnVuY3Rpb24gKCkgewogICAgICAgIGlmICh0aGlzLnJhcGlkdXBsb2FkVGFzay5pc0RlZmF1bHRQYXRoKQogICAgICAgICAgICByZXR1cm47IC8vIOi9rOWtmOi3r+W+hOeVmeepuiwg6Lez5Ye6CiAgICAgICAgdmFyIF9kaXIgPSAodGhpcy5yYXBpZHVwbG9hZFRhc2suc2F2ZVBhdGggfHwgIiIpLnJlcGxhY2UoL1wvJC8sICIiKTsgLy8g5Y676Zmk6Lev5b6E57uT5bC+55qEIi8iCiAgICAgICAgaWYgKF9kaXIuY2hhckF0KDApICE9PSAiLyIpCiAgICAgICAgICAgIF9kaXIgPSAiLyIgKyBfZGlyOyAvLyDooaXpvZDot6/lvoTlvIDlpLTnmoQiLyIKICAgICAgICB2YXIgY0J0biA9IGV4dGVybmFsX1N3YWxfZGVmYXVsdCgpLmdldENvbmZpcm1CdXR0b24oKTsKICAgICAgICB2YXIgYnRuID0gY0J0bi5jbG9uZU5vZGUoKTsKICAgICAgICBidG4udGV4dENvbnRlbnQgPSAi5omT5byA55uu5b2VIjsKICAgICAgICBidG4uc3R5bGUuYmFja2dyb3VuZENvbG9yID0gIiNlY2FlM2MiOwogICAgICAgIHZhciBub3dQYXRoID0gbG9jYXRpb24uaHJlZi5tYXRjaCgvKHBhdGg9KC4rPykpKD86JnwkKS8pOwogICAgICAgIGJ0bi5vbmNsaWNrID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAobm93UGF0aCkgewogICAgICAgICAgICAgICAgbG9jYXRpb24uaHJlZiA9IGxvY2F0aW9uLmhyZWYucmVwbGFjZSgKICAgICAgICAgICAgICAgIC8vIOS7heabv+aNonBhdGjlj4LmlbAsIOS4jeS/ruaUueWFtuS7luWPguaVsAogICAgICAgICAgICAgICAgbm93UGF0aFsxXSwgInBhdGg9IiArIGVuY29kZVVSSUNvbXBvbmVudChfZGlyKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB2YXIgY29ubmVjdENoYXIgPSBsb2NhdGlvbi5ocmVmLmluY2x1ZGVzKCI/IikgPyAiJiIgOiAiPyI7IC8vIOehruWumuWPguaVsOeahOi/nuaOpeespgogICAgICAgICAgICAgICAgbG9jYXRpb24uaHJlZiArPSBjb25uZWN0Q2hhciArICJwYXRoPSIgKyBlbmNvZGVVUklDb21wb25lbnQoX2Rpcik7CiAgICAgICAgICAgIH0gLy8g5rKh5pyJ5om+5YiwcGF0aOWPguaVsCwg55u05o6l5re75YqgCiAgICAgICAgICAgIGV4dGVybmFsX1N3YWxfZGVmYXVsdCgpLmNsb3NlKCk7CiAgICAgICAgfTsKICAgICAgICBpZiAoKG5vd1BhdGggPyBub3dQYXRoWzJdIDogIiUyRiIpICE9IGVuY29kZVVSSUNvbXBvbmVudChfZGlyKSkKICAgICAgICAgICAgLy8g5b2T5YmN5bey5Zyo6L2s5a2Y55uu5b2V5pe25LiN5re75Yqg5oyJ6ZKuCiAgICAgICAgICAgIGNCdG4uYmVmb3JlKGJ0bik7CiAgICB9OwogICAgcmV0dXJuIFN3YWxiYXNlOwp9KCkpOwovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIGNvbnN0IHN3YWxCYXNlID0gKFN3YWxiYXNlKTsKCjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9jb21tb24vYWpheC50c3gKLyoKICogQEF1dGhvcjogbWVuZ3pvbmVmaXJlCiAqIEBEYXRlOiAyMDIxLTA4LTI3IDE0OjQ4OjI0CiAqIEBMYXN0RWRpdFRpbWU6IDIwMjMtMDItMTQgMDQ6MTA6MDkKICogQExhc3RFZGl0VGltZTogMjAyMy0wOS0xNgogKiBATGFzdEVkaXRvcnM6IG1lbmd6b25lZmlyZQogKiBATGFzdEVkaXRvcnM6IHRvdXNha2FzcAogKiBARGVzY3JpcHRpb246IOiHquWwgeijhUpRIGFqYXjmlrnms5UKICovCnZhciBhamF4X2Fzc2lnbiA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fYXNzaWduKSB8fCBmdW5jdGlvbiAoKSB7CiAgICBhamF4X2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24odCkgewogICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykgewogICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldOwogICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpCiAgICAgICAgICAgICAgICB0W3BdID0gc1twXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHQ7CiAgICB9OwogICAgcmV0dXJuIGFqYXhfYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Cn07Cgp2YXIgREVCVUcgPSBmYWxzZTsKZnVuY3Rpb24gYWpheChjb25maWcsIGNhbGxiYWNrLCBmYWlsYmFjaywgcmV0cnkpIHsKICAgIGlmIChyZXRyeSA9PT0gdm9pZCAwKSB7IHJldHJ5ID0gewogICAgICAgIG1heDogMCwKICAgICAgICBkZWxheTogMCwKICAgICAgICBhY2NlcHRzOiBmdW5jdGlvbiAoKSB7IHJldHVybiB0cnVlOyB9CiAgICB9OyB9CiAgICBmdW5jdGlvbiBleGVjdXRlKHJldHJ5TGVmdCkgewogICAgICAgIEdNX3htbGh0dHBSZXF1ZXN0KGFqYXhfYXNzaWduKGFqYXhfYXNzaWduKHt9LCBjb25maWcpLCB7IG9ubG9hZDogZnVuY3Rpb24gKHIpIHsKICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHIpOyAvLyBkZWJ1ZwogICAgICAgICAgICAgICAgaWYgKE1hdGguZmxvb3Ioci5zdGF0dXMgLyAxMDApID09PSAyKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbygiJXMgdmVyc2lvbjogJXMg5o6l5Y+j6L+U5ZueOiAlcyIsIFRBRywgdmVyc2lvbiwgSlNPTi5zdHJpbmdpZnkoci5yZXNwb25zZSkpOyAvLyB1c2VyIGRlYnVnCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChyZXRyeUxlZnQgPD0gMCB8fCByZXRyeS5hY2NlcHRzKHIuc3RhdHVzLCByLnJlc3BvbnNlKSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlUmV0cnkoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAocmV0cnlMZWZ0IDw9IDAgfHwgcmV0cnkuYWNjZXB0cyhyLnN0YXR1cywgbnVsbCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZmFpbGJhY2soci5zdGF0dXMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVSZXRyeSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgb25lcnJvcjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgaWYgKHJldHJ5TGVmdCA8PSAwIHx8IHJldHJ5LmFjY2VwdHMoYWpheEVycm9yLCBudWxsKSkgewogICAgICAgICAgICAgICAgICAgIGZhaWxiYWNrKGFqYXhFcnJvcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZVJldHJ5KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gfSkpOwogICAgICAgIGZ1bmN0aW9uIHNjaGVkdWxlUmV0cnkoKSB7CiAgICAgICAgICAgIGNvbnNvbGUuaW5mbygiXHU5MUNEXHU4QkQ1ICIgKyBjb25maWcudXJsKTsKICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHJldHVybiBleGVjdXRlKHJldHJ5TGVmdCAtIDEpOyB9LCByZXRyeS5kZWxheSk7CiAgICAgICAgfQogICAgfQogICAgZXhlY3V0ZShyZXRyeS5tYXgpOwp9Cgo7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvYmFpZHUvY29tbW9uL3JhcGlkdXBsb2FkVGFzay50c3gKLyoKICogQEF1dGhvcjogbWVuZ3pvbmVmaXJlCiAqIEBMYXN0RWRpdG9yczogdG91c2FrYXNwCiAqIEBEZXNjcmlwdGlvbjog55m+5bqm572R55uYIOenkuS8oOi9rOWtmOS7u+WKoeWunueOsAogKi8KCgoKdmFyIFJhcGlkdXBsb2FkVGFzayA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHsKICAgIGZ1bmN0aW9uIFJhcGlkdXBsb2FkVGFzaygpIHsKICAgIH0KICAgIFJhcGlkdXBsb2FkVGFzay5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgdGhpcy5hY2Nlc3NUb2tlbiA9ICIiOwogICAgICAgIHRoaXMuYmRzdG9rZW4gPSBnZXRCZHN0b2tlbigpOwogICAgICAgIGNvbnNvbGUubG9nKCJiZHN0b2tlblx1NzJCNlx1NjAwMTogIiArICh0aGlzLmJkc3Rva2VuID8gIuiOt+WPluaIkOWKnyIgOiAi6I635Y+W5aSx6LSlIikpOyAvLyBkZWJ1ZwogICAgICAgIHRoaXMuZmlsZUluZm9MaXN0ID0gW107CiAgICAgICAgdGhpcy5zYXZlUGF0aCA9ICIiOwogICAgICAgIHRoaXMuaXNEZWZhdWx0UGF0aCA9IGZhbHNlOwogICAgICAgIHRoaXMub25GaW5pc2ggPSBmdW5jdGlvbiAoKSB7IH07CiAgICAgICAgdGhpcy5vblByb2Nlc3MgPSBmdW5jdGlvbiAoKSB7IH07CiAgICB9OwogICAgUmFwaWR1cGxvYWRUYXNrLnByb3RvdHlwZS5zdGFydCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB0aGlzLnNhdmVGaWxlVjIoMCk7CiAgICB9OwogICAgLyoqCiAgICAgKiBAZGVzY3JpcHRpb246IOi9rOWtmOenkuS8oCDmjqXlj6MyCiAgICAgKiBAcGFyYW0ge251bWJlcn0gaQogICAgICovCiAgICBSYXBpZHVwbG9hZFRhc2sucHJvdG90eXBlLnNhdmVGaWxlVjIgPSBmdW5jdGlvbiAoaSkgewogICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgaWYgKGkgPj0gdGhpcy5maWxlSW5mb0xpc3QubGVuZ3RoKSB7CiAgICAgICAgICAgIHRoaXMub25GaW5pc2godGhpcy5maWxlSW5mb0xpc3QpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRoaXMub25Qcm9jZXNzKGksIHRoaXMuZmlsZUluZm9MaXN0KTsKICAgICAgICB2YXIgZmlsZSA9IHRoaXMuZmlsZUluZm9MaXN0W2ldOwogICAgICAgIHZhciBvbkZhaWxlZCA9IGZ1bmN0aW9uIChzdGF0dXNDb2RlKSB7CiAgICAgICAgICAgIGZpbGUuZXJybm8gPSBzdGF0dXNDb2RlOwogICAgICAgICAgICBfdGhpcy5zYXZlRmlsZVYyKGkgKyAxKTsKICAgICAgICB9OwogICAgICAgIGlmIChmaWxlLnBhdGguZW5kc1dpdGgoIi8iKSAmJiBmaWxlLnNpemUgPT09IDApIHsKICAgICAgICAgICAgY3JlYXRlRGlyLmNhbGwodGhpcywgZmlsZS5wYXRoLnJlcGxhY2UoL1wvKyQvLCAnJyksIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5yZXNwb25zZTsKICAgICAgICAgICAgICAgIGZpbGUuZXJybm8gPSBkYXRhLmVycm5vOwogICAgICAgICAgICAgICAgX3RoaXMuc2F2ZUZpbGVWMihpICsgMSk7CiAgICAgICAgICAgIH0sIG9uRmFpbGVkKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAvLyDmlofku7blkI3kuLrnqboKICAgICAgICBpZiAoZmlsZS5wYXRoID09PSAiLyIpIHsKICAgICAgICAgICAgZmlsZS5lcnJubyA9IC03OwogICAgICAgICAgICB0aGlzLnNhdmVGaWxlVjIoaSArIDEpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHJhcGlkdXBsb2FkQ3JlYXRlRmlsZS5jYWxsKHRoaXMsIGZpbGUsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgIGRhdGEgPSBkYXRhLnJlc3BvbnNlOwogICAgICAgICAgICBmaWxlLmVycm5vID0gMiA9PT0gZGF0YS5lcnJubyA/IDExNCA6IGRhdGEuZXJybm87CiAgICAgICAgICAgIGZpbGUuZXJybm8gPSAzMTE5MCA9PT0gZmlsZS5lcnJubyA/IDQwNCA6IGZpbGUuZXJybm87CiAgICAgICAgICAgIF90aGlzLnNhdmVGaWxlVjIoaSArIDEpOwogICAgICAgIH0sIG9uRmFpbGVkKTsKICAgIH07CiAgICByZXR1cm4gUmFwaWR1cGxvYWRUYXNrOwp9KCkpOwovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIGNvbnN0IHJhcGlkdXBsb2FkVGFzayA9IChSYXBpZHVwbG9hZFRhc2spOwpmdW5jdGlvbiBjcmVhdGVEaXIocGF0aCwgb25SZXNwb25zZWQsIG9uRmFpbGVkKSB7CiAgICBhamF4KHsKICAgICAgICB1cmw6ICIiICsgY3JlYXRlZGlyX3VybCArICh0aGlzLmJkc3Rva2VuID8gIiZiZHN0b2tlbj0iICsgdGhpcy5iZHN0b2tlbiA6ICIiKSwKICAgICAgICBtZXRob2Q6ICJQT1NUIiwKICAgICAgICByZXNwb25zZVR5cGU6ICJqc29uIiwKICAgICAgICBkYXRhOiBjb252ZXJ0RGF0YSh7CiAgICAgICAgICAgIGJsb2NrX2xpc3Q6IEpTT04uc3RyaW5naWZ5KFtdKSwKICAgICAgICAgICAgcGF0aDogdGhpcy5zYXZlUGF0aCArIHBhdGgsCiAgICAgICAgICAgIGlzZGlyOiAxLAogICAgICAgICAgICBydHlwZTogMywKICAgICAgICB9KSwKICAgICAgICBoZWFkZXJzOiB7CiAgICAgICAgICAgICJDb250ZW50LVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwKICAgICAgICB9CiAgICB9LCBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgIGlmIChkYXRhLnJlc3BvbnNlLmVycm5vICE9IG51bGwgJiYgMCAhPT0gZGF0YS5yZXNwb25zZS5lcnJubykgewogICAgICAgICAgICBvbkZhaWxlZChkYXRhLnJlc3BvbnNlLmVycm5vKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG9uUmVzcG9uc2VkKGRhdGEpOwogICAgICAgIH0KICAgIH0sIG9uRmFpbGVkKTsKfQovLyDmraTmjqXlj6PmtYvor5Xnu5PmnpzlpoLkuIs6IOmUmeivr21kNS0+6L+U5ZueImVycm5vIjogMzExOTAsIOato+ehrm1kNSvplJnor69zaXplLT7ov5Tlm54iZXJybm8iOiAyCi8vIOatpOWkliwg5Y2z5L2/bWQ15ZKMc2l6ZeWdh+ato+ehriwg6L+e57ut6K+35rGC5pe25L6d5pen5pyJ5bCP5qaC546H6L+U5ZueImVycm5vIjogMiwg5pWF5bu66K6u5Yqg5YWlcmV0cnnnrZbnlaUKLy8gaGVhZGVy5YaF5re75YqgIkNvbnRlbnQtVHlwZSI6ICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQi77yM6buY6K6kdHlwZeS4unRleHTlr7zoh7Tpmo/mnLojMgovLyBvcGVuYXBpIOaOpeWPo+aXoOmcgOmHjeivleS4jeeUqOWGmeazlQpmdW5jdGlvbiByYXBpZHVwbG9hZENyZWF0ZUZpbGUoZmlsZSwgb25SZXNwb25zZWQsIG9uRmFpbGVkKSB7CiAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgdmFyIGNvbnRlbnRNZDUgPSBmaWxlLm1kNS50b0xvd2VyQ2FzZSgpOwogICAgdmFyIHJldHJ5UG9saWN5ID0gewogICAgICAgIG1heDogMSwKICAgICAgICBkZWxheTogNTAwLAogICAgICAgIGFjY2VwdHM6IGZ1bmN0aW9uIChzdGF0dXNDb2RlLCByZXNwb25zZSkgewogICAgICAgICAgICBpZiAoc3RhdHVzQ29kZSA9PSAyMDApIHsKICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZSAhPSBudWxsICYmIHJlc3BvbnNlLmVycm5vID09PSAyKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHN0YXR1c0NsYXNzID0gTWF0aC5mbG9vcihzdGF0dXNDb2RlIC8gMTAwKTsKICAgICAgICAgICAgaWYgKHN0YXR1c0NsYXNzIDw9IDMpCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgaWYgKHN0YXR1c0NvZGUgPT09IDQwMyB8fCBzdGF0dXNDb2RlID09PSA0MDQpCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH07CiAgICBhamF4KHsKICAgICAgICB1cmw6IGNyZWF0ZV91cmwgKyAiJmFjY2Vzc190b2tlbj0iICsgZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuYWNjZXNzVG9rZW4pLAogICAgICAgIG1ldGhvZDogIlBPU1QiLAogICAgICAgIHJlc3BvbnNlVHlwZTogImpzb24iLAogICAgICAgIGRhdGE6IGNvbnZlcnREYXRhKHsKICAgICAgICAgICAgYmxvY2tfbGlzdDogSlNPTi5zdHJpbmdpZnkoW2NvbnRlbnRNZDVdKSwKICAgICAgICAgICAgcGF0aDogdGhpcy5zYXZlUGF0aCArIGZpbGUucGF0aC5yZXBsYWNlKGlsbGVnYWxQYXRoUGF0dGVybiwgIl8iKS5yZXBsYWNlKC9cLnJhciQvLCAnLlJBUicpLAogICAgICAgICAgICBzaXplOiBmaWxlLnNpemUsCiAgICAgICAgICAgIGlzZGlyOiAwLAogICAgICAgICAgICBydHlwZTogMCwgLy8gcnR5cGU9M+imhuebluaWh+S7tiwgcnR5cGU9MOWImei/lOWbnuaKpemUmSwg5LiN6KaG55uW5paH5Lu2LCDpu5jorqTkuLpydHlwZT0xICjoh6rliqjph43lkb3lkI0sIDHlkowy5piv5Lik56eN5LiN5ZCM55qE6YeN5ZG95ZCN562W55WlKQogICAgICAgIH0pLAogICAgICAgIGhlYWRlcnM6IHsKICAgICAgICAgICAgImNvb2tpZSI6ICIiLAogICAgICAgICAgICAiQ29udGVudC1UeXBlIjogImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIsCiAgICAgICAgfSwKICAgICAgICBhbm9ueW1vdXM6IHRydWUKICAgIH0sIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgLy8gY29uc29sZS5sb2coZGF0YS5yZXNwb25zZSk7IC8vIGRlYnVnCiAgICAgICAgaWYgKDMxMDM5ID09PSBkYXRhLnJlc3BvbnNlLmVycm5vICYmIDMxMDM5ICE9IGZpbGUuZXJybm8pIHsKICAgICAgICAgICAgZmlsZS5lcnJubyA9IDMxMDM5OwogICAgICAgICAgICBmaWxlLnBhdGggPSBzdWZmaXhDaGFuZ2UoZmlsZS5wYXRoKTsKICAgICAgICAgICAgcmFwaWR1cGxvYWRDcmVhdGVGaWxlLmNhbGwoX3RoaXMsIGZpbGUsIG9uUmVzcG9uc2VkLCBvbkZhaWxlZCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKDAgIT09IGRhdGEucmVzcG9uc2UuZXJybm8pIHsKICAgICAgICAgICAgb25GYWlsZWQoZGF0YS5yZXNwb25zZS5lcnJubyA9PT0gLTYgPyA5MDE5IDogZGF0YS5yZXNwb25zZS5lcnJubyk7IC8vIC02IOS6puinhuS4uiBvcGVuYXBp5o6I5p2D56CB6K6k6K+B5aSx6LSlIOaKpeWRiuS4ujkwMTkKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgICAgICBvblJlc3BvbnNlZChkYXRhKTsKICAgIH0sIG9uRmFpbGVkLCByZXRyeVBvbGljeSk7Cn0KCjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9iYWlkdS9jb21tb24vZ2VuZXJhdGViZGxpbmtUYXNrLnRzeAovKgogKiBAQXV0aG9yOiBtZW5nem9uZWZpcmUKICogQExhc3RFZGl0b3JzOiB0b3VzYWthc3AKICogQERlc2NyaXB0aW9uOiDnmb7luqbnvZHnm5gg56eS5Lyg55Sf5oiQ5Lu75Yqh5a6e546wCiAqLwoKCgoKLy8gaW1wb3J0IHsgY3JlYXRlRmlsZVYyIH0gZnJvbSAiLi9yYXBpZHVwbG9hZFRhc2siOwovLyBpbXBvcnQgU3BhcmtNRDUgZnJvbSAic3BhcmstbWQ1IjsKCnZhciBsaXN0TWluRGVsYXlNc2VjID0gMTAwMDsKdmFyIHJldHJ5RGVsYXlTZWMgPSAzMDsKdmFyIHN0YW5kYXJkUmV0cnkgPSB7CiAgICBtYXg6IDMsCiAgICBkZWxheTogMTAwMCwKICAgIGFjY2VwdHM6IGZ1bmN0aW9uIChzdGF0dXNDb2RlLCByZXNwb25zZSkgewogICAgICAgIGlmIChzdGF0dXNDb2RlID09IDIwMCkgewogICAgICAgICAgICBpZiAocmVzcG9uc2UgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmVycm5vID09PSAyIHx8IHJlc3BvbnNlLmVycm5vID09PSAtNiB8fCByZXNwb25zZS5lcnJubyA9PT0gNTE0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICB2YXIgc3RhdHVzQ2xhc3MgPSBNYXRoLmZsb29yKHN0YXR1c0NvZGUgLyAxMDApOwogICAgICAgIGlmIChzdGF0dXNDbGFzcyA8PSAzKQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICBpZiAoc3RhdHVzQ29kZSA9PT0gNDAzKSAvLyBhc3N1bWUgdW5yZWNvdmVyYWJsZQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9Cn07Ci8vIOaZrumAmueUn+aIkDoKdmFyIEdlbmVyYXRlYmRsaW5rVGFzayA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHsKICAgIGZ1bmN0aW9uIEdlbmVyYXRlYmRsaW5rVGFzaygpIHsKICAgIH0KICAgIEdlbmVyYXRlYmRsaW5rVGFzay5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgdGhpcy5pc1NoYXJlUGFnZSA9IGZhbHNlOwogICAgICAgIHRoaXMucmVjdXJzaXZlID0gZmFsc2U7CiAgICAgICAgdGhpcy5zYXZlUGF0aCA9ICIiOwogICAgICAgIHRoaXMuYmRzdG9rZW4gPSBnZXRCZHN0b2tlbigpOyAvLyDmraTlpIRiZHN0b2tlbuS4jeWPr+WIoOmZpCwg5Lya5Zyo5LiL5pa5Y3JlYXRlRmlsZVYy5pa55rOV6LCD55SoCiAgICAgICAgdGhpcy5kaXJMaXN0ID0gW107CiAgICAgICAgdGhpcy5zZWxlY3RMaXN0ID0gW107CiAgICAgICAgdGhpcy5maWxlSW5mb0xpc3QgPSBbXTsKICAgICAgICB0aGlzLm9uRmluaXNoID0gZnVuY3Rpb24gKCkgeyB9OwogICAgICAgIHRoaXMub25Qcm9jZXNzID0gZnVuY3Rpb24gKCkgeyB9OwogICAgICAgIHRoaXMub25Qcm9ncmVzcyA9IGZ1bmN0aW9uICgpIHsgfTsKICAgICAgICB0aGlzLm9uSGFzRGlyID0gZnVuY3Rpb24gKCkgeyB9OwogICAgICAgIHRoaXMub25IYXNOb0RpciA9IGZ1bmN0aW9uICgpIHsgfTsKICAgIH07CiAgICAvKioKICAgICAqIEBkZXNjcmlwdGlvbjog5omn6KGM5paw5Lu75Yqh55qE5Yid5aeL5YyW5q2l6aqkIOaJq+aPj+mAieaLqeeahOaWh+S7tuWIl+ihqAogICAgICovCiAgICBHZW5lcmF0ZWJkbGlua1Rhc2sucHJvdG90eXBlLnN0YXJ0ID0gZnVuY3Rpb24gKCkgewogICAgICAgIGlmICh0aGlzLmlzU2hhcmVQYWdlKSB7CiAgICAgICAgICAgIHRoaXMubG9naWQgPSBnZXRMb2dpZCgpOwogICAgICAgICAgICB0aGlzLnN1cmwgPSBnZXRTdXJsKCk7CiAgICAgICAgICAgIGlmICghdGhpcy5zdXJsKSB7CiAgICAgICAgICAgICAgICBzaG93QWxlcnQoInN1cmzojrflj5blpLHotKUiKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnBhcnNlU2hhcmVGaWxlTGlzdCgpOwogICAgICAgICAgICB0aGlzLm9uSGFzTm9EaXIoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHRoaXMucGFyc2VNYWluRmlsZUxpc3QoKTsKICAgICAgICAgICAgaWYgKHRoaXMuZGlyTGlzdC5sZW5ndGgpCiAgICAgICAgICAgICAgICB0aGlzLm9uSGFzRGlyKCk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHRoaXMub25IYXNOb0RpcigpOwogICAgICAgIH0KICAgIH07CiAgICBHZW5lcmF0ZWJkbGlua1Rhc2sucHJvdG90eXBlLnNjYW5TaGFyZUZpbGUgPSBmdW5jdGlvbiAoaSwgcGFnZSwgcmV0cnlBbGxvd2VkKSB7CiAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICBpZiAocGFnZSA9PT0gdm9pZCAwKSB7IHBhZ2UgPSAxOyB9CiAgICAgICAgaWYgKHJldHJ5QWxsb3dlZCA9PT0gdm9pZCAwKSB7IHJldHJ5QWxsb3dlZCA9IDU7IH0KICAgICAgICBpZiAoaSA+PSB0aGlzLmRpckxpc3QubGVuZ3RoKSB7CiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVCZGxpbmsoMCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy5vblByb2dyZXNzKGZhbHNlLCAiXHU2QjYzXHU1NzI4XHU4M0I3XHU1M0Q2XHU2NTg3XHU0RUY2XHU1MjE3XHU4ODY4LCBcdTdCMkMiICsgKGkgKyAxKSArICJcdTRFMkEiKTsKICAgICAgICB2YXIgc2hhcmVpZCA9IHVuc2FmZVdpbmRvdy55dW5EYXRhID8gdW5zYWZlV2luZG93Lnl1bkRhdGEuc2hhcmVpZCA6IHVuc2FmZVdpbmRvdy5sb2NhbHMuc2hhcmVpZDsKICAgICAgICB2YXIgdWsgPSB1bnNhZmVXaW5kb3cueXVuRGF0YSA/IHVuc2FmZVdpbmRvdy55dW5EYXRhLnNoYXJlX3VrIDogdW5zYWZlV2luZG93LmxvY2Fscy5zaGFyZV91azsKICAgICAgICBhamF4KHsKICAgICAgICAgICAgdXJsOiBzaGFyZWxpc3RfdXJsICsgIiZkaXI9IiArIGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLmRpckxpc3RbaV0pICsgIiZsb2dpZD0iICsgdGhpcy5sb2dpZCArICImc2hhcmVpZD0iICsgc2hhcmVpZCArICImdWs9IiArIHVrICsgIiZwYWdlPSIgKyBwYWdlLAogICAgICAgICAgICBtZXRob2Q6ICJHRVQiLAogICAgICAgICAgICByZXNwb25zZVR5cGU6ICJqc29uIiwKICAgICAgICB9LCBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICBkYXRhID0gZGF0YS5yZXNwb25zZTsKICAgICAgICAgICAgaWYgKCFkYXRhLmVycm5vKSB7CiAgICAgICAgICAgICAgICBpZiAoIWRhdGEubGlzdC5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAvLyDov5Tlm57liJfooajkuLrnqbosIOWNs+atpOaWh+S7tuWkueaWh+S7tuWFqOmDqOaJq+aPj+WujOaIkAogICAgICAgICAgICAgICAgICAgIGlmIChwYWdlID09PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmZpbGVJbmZvTGlzdC5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IF90aGlzLmRpckxpc3RbaV0gKyAnLycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnNfaWQ6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWQ1OiAnMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnLAogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnNjYW5TaGFyZUZpbGUoaSArIDEpOwogICAgICAgICAgICAgICAgICAgIH0sIGxpc3RNaW5EZWxheU1zZWMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMucGFyc2VTaGFyZUZpbGVMaXN0KGRhdGEubGlzdCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEubGlzdC5sZW5ndGggPj0gbGlzdExpbWl0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuc2NhblNoYXJlRmlsZShpLCBwYWdlICsgMSk7IC8vIOS4i+S4gOmhtQogICAgICAgICAgICAgICAgICAgICAgICB9LCBsaXN0TWluRGVsYXlNc2VjKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuc2NhblNoYXJlRmlsZShpICsgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGxpc3RNaW5EZWxheU1zZWMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIF90aGlzLmZpbGVJbmZvTGlzdC5wdXNoKHsKICAgICAgICAgICAgICAgICAgICBwYXRoOiBfdGhpcy5kaXJMaXN0W2ldLAogICAgICAgICAgICAgICAgICAgIGlzZGlyOiAxLAogICAgICAgICAgICAgICAgICAgIGVycm5vOiBkYXRhLmVycm5vLAogICAgICAgICAgICAgICAgfSk7IC8vIGxpc3TmjqXlj6Porr/pl67lpLHotKUsIOa3u+WKoOWksei0peS/oeaBrwogICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMuc2NhblNoYXJlRmlsZShpICsgMSk7CiAgICAgICAgICAgICAgICB9LCBsaXN0TWluRGVsYXlNc2VjKTsKICAgICAgICAgICAgfQogICAgICAgIH0sIGZ1bmN0aW9uIChzdGF0dXNDb2RlKSB7CiAgICAgICAgICAgIGlmIChzdGF0dXNDb2RlID09PSA0MDAgJiYgcmV0cnlBbGxvd2VkID4gMCkgeyAvLyByYXRlIGxpbWl0CiAgICAgICAgICAgICAgICBfdGhpcy5vblByb2dyZXNzKGZhbHNlLCByZXRyeURlbGF5U2VjICsgIlx1NzlEMlx1NTQwRVx1OTFDRFx1OEJENSAuLi4iKTsKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIF90aGlzLnNjYW5TaGFyZUZpbGUoaSwgcGFnZSwgcmV0cnlBbGxvd2VkIC0gMSk7CiAgICAgICAgICAgICAgICB9LCBsaXN0TWluRGVsYXlNc2VjICsgcmV0cnlEZWxheVNlYyAqIDEwMDApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgX3RoaXMuZmlsZUluZm9MaXN0LnB1c2goewogICAgICAgICAgICAgICAgICAgIHBhdGg6IF90aGlzLmRpckxpc3RbaV0sCiAgICAgICAgICAgICAgICAgICAgZXJybm86IHN0YXR1c0NvZGUsCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIF90aGlzLnNjYW5TaGFyZUZpbGUoaSArIDEpOwogICAgICAgICAgICAgICAgfSwgbGlzdE1pbkRlbGF5TXNlYyk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH07CiAgICAvKioKICAgICAqIEBkZXNjcmlwdGlvbjog6YCJ5oup55qE5YiX6KGo5YyF5ZCr5paH5Lu25aS5LCDojrflj5bmlofku7blpLnkuIvnmoTlrZDmlofku7YKICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpIOadoeebrmluZGV4CiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3RhcnQg5YiX6KGo5o6l5Y+j5qOA57Si6LW354K5KOWNs+e/u+mhteWPguaVsCkKICAgICAqLwogICAgR2VuZXJhdGViZGxpbmtUYXNrLnByb3RvdHlwZS5zY2FuRmlsZSA9IGZ1bmN0aW9uIChpLCBzdGFydCwgcmV0cnlBbGxvd2VkKSB7CiAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICBpZiAoc3RhcnQgPT09IHZvaWQgMCkgeyBzdGFydCA9IDA7IH0KICAgICAgICBpZiAocmV0cnlBbGxvd2VkID09PSB2b2lkIDApIHsgcmV0cnlBbGxvd2VkID0gNTsgfQogICAgICAgIGlmIChpID49IHRoaXMuZGlyTGlzdC5sZW5ndGgpIHsKICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUJkbGluaygwKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBhamF4KHsKICAgICAgICAgICAgdXJsOiAiIiArIGxpc3RfdXJsICsgZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuZGlyTGlzdFtpXSkgKyAiJnJlY3Vyc2lvbj0iICsgKHRoaXMucmVjdXJzaXZlID8gMSA6IDApICsgIiZzdGFydD0iICsgc3RhcnQsCiAgICAgICAgICAgIG1ldGhvZDogIkdFVCIsCiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogImpzb24iLAogICAgICAgIH0sIC8vIGxpc3TmjqXlj6Poh6rluKbpgJLlvZLlj4LmlbByZWN1cnNpb24KICAgICAgICBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICBkYXRhID0gZGF0YS5yZXNwb25zZTsKICAgICAgICAgICAgaWYgKCFkYXRhLmVycm5vKSB7CiAgICAgICAgICAgICAgICBpZiAoIWRhdGEubGlzdC5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAvLyDov5Tlm57liJfooajkuLrnqbosIOWNs+atpOaWh+S7tuWkueaWh+S7tuWFqOmDqOaJq+aPj+WujOaIkAogICAgICAgICAgICAgICAgICAgIGlmIChzdGFydCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5maWxlSW5mb0xpc3QucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiBfdGhpcy5kaXJMaXN0W2ldICsgJy8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzX2lkOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1kNTogJzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJywKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5zY2FuRmlsZShpICsgMSk7CiAgICAgICAgICAgICAgICAgICAgfSwgbGlzdE1pbkRlbGF5TXNlYyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmxpc3QuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWl0ZW0uaXNkaXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmZpbGVJbmZvTGlzdC5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiBpdGVtLnBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogaXRlbS5zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzX2lkOiBpdGVtLmZzX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1kNTogIiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsgLy8g562b6YCJ5paH5Lu2KGlzZGlyPTApCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5oYXNfbW9yZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnNjYW5GaWxlKGksIHN0YXJ0ICsgbGlzdExpbWl0KTsgLy8g5LuO5LiL5LiA5Liq6LW354K557un57ut5qOA57Si5YiX6KGoCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGxpc3RNaW5EZWxheU1zZWMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5zY2FuRmlsZShpICsgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGxpc3RNaW5EZWxheU1zZWMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIF90aGlzLmZpbGVJbmZvTGlzdC5wdXNoKHsKICAgICAgICAgICAgICAgICAgICBwYXRoOiBfdGhpcy5kaXJMaXN0W2ldLAogICAgICAgICAgICAgICAgICAgIGlzZGlyOiAxLAogICAgICAgICAgICAgICAgICAgIGVycm5vOiBkYXRhLmVycm5vLAogICAgICAgICAgICAgICAgfSk7IC8vIGxpc3TmjqXlj6Porr/pl67lpLHotKUsIOa3u+WKoOWksei0peS/oeaBrwogICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMuc2NhbkZpbGUoaSArIDEpOwogICAgICAgICAgICAgICAgfSwgbGlzdE1pbkRlbGF5TXNlYyk7CiAgICAgICAgICAgIH0KICAgICAgICB9LCBmdW5jdGlvbiAoc3RhdHVzQ29kZSkgewogICAgICAgICAgICBpZiAoc3RhdHVzQ29kZSA9PT0gNDAwICYmIHJldHJ5QWxsb3dlZCA+IDApIHsgLy8gcmF0ZSBsaW1pdAogICAgICAgICAgICAgICAgX3RoaXMub25Qcm9ncmVzcyhmYWxzZSwgcmV0cnlEZWxheVNlYyArICJcdTc5RDJcdTU0MEVcdTkxQ0RcdThCRDUgLi4uIik7CiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBfdGhpcy5zY2FuRmlsZShpLCBzdGFydCwgcmV0cnlBbGxvd2VkIC0gMSk7CiAgICAgICAgICAgICAgICB9LCBsaXN0TWluRGVsYXlNc2VjICsgcmV0cnlEZWxheVNlYyAqIDEwMDApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgX3RoaXMuZmlsZUluZm9MaXN0LnB1c2goewogICAgICAgICAgICAgICAgICAgIHBhdGg6IF90aGlzLmRpckxpc3RbaV0sCiAgICAgICAgICAgICAgICAgICAgZXJybm86IHN0YXR1c0NvZGUsCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIF90aGlzLnNjYW5GaWxlKGkgKyAxKTsKICAgICAgICAgICAgICAgIH0sIGxpc3RNaW5EZWxheU1zZWMpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9OwogICAgLyoqCiAgICAgKiBAZGVzY3JpcHRpb246IOmhuuW6j+aJp+ihjOeUn+aIkOS7u+WKoQogICAgICogQHBhcmFtIHtudW1iZXJ9IGkKICAgICAqLwogICAgR2VuZXJhdGViZGxpbmtUYXNrLnByb3RvdHlwZS5nZW5lcmF0ZUJkbGluayA9IGZ1bmN0aW9uIChpKSB7CiAgICAgICAgLy8g5L+d5a2Y5Lu75Yqh6L+b5bqm5pWw5o2uLCDliIbkuqvpobXnlJ/miJDkuI3kv53lrZgKICAgICAgICBpZiAoIXRoaXMuaXNTaGFyZVBhZ2UpCiAgICAgICAgICAgIEdNX3NldFZhbHVlKCJ1bmZpbmlzaCIsIHsKICAgICAgICAgICAgICAgIGZpbGVfaW5mb19saXN0OiB0aGlzLmZpbGVJbmZvTGlzdCwKICAgICAgICAgICAgICAgIGZpbGVfaWQ6IGksCiAgICAgICAgICAgIH0pOwogICAgICAgIC8vIOeUn+aIkOWujOaIkAogICAgICAgIGlmIChpID49IHRoaXMuZmlsZUluZm9MaXN0Lmxlbmd0aCkgewogICAgICAgICAgICB0aGlzLm9uRmluaXNoKHRoaXMuZmlsZUluZm9MaXN0KTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB2YXIgZmlsZSA9IHRoaXMuZmlsZUluZm9MaXN0W2ldOwogICAgICAgIGlmIChmaWxlLmZzX2lkID09PSAnJykgewogICAgICAgICAgICB0aGlzLmdlbmVyYXRlQmRsaW5rKGkgKyAxKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8vICDliLfmlrDlvLnnqpflhoXnmoTku7vliqHov5vluqYKICAgICAgICAgICAgdGhpcy5vblByb2Nlc3MoaSwgdGhpcy5maWxlSW5mb0xpc3QpOwogICAgICAgICAgICAvLyDot7Pov4fmiavmj4/lpLHotKXnmoTnm67lvZXot6/lvoQKICAgICAgICAgICAgaWYgKGZpbGUuZXJybm8gJiYgZmlsZS5pc2RpcikgewogICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUJkbGluayhpICsgMSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8g5pmu6YCa55Sf5oiQ5q2l6aqkCiAgICAgICAgICAgIHRoaXMuaXNTaGFyZVBhZ2UgPyB0aGlzLmdldFNoYXJlRGxpbmsoaSkgOiB0aGlzLmdldERsaW5rKGkpOwogICAgICAgIH0KICAgIH07CiAgICAvKioKICAgICAqIEBkZXNjcmlwdGlvbjog6I635Y+W5paH5Lu25L+h5oGvOiBzaXplLCBtZDUo5Y+v6IO96ZSZ6K+vKSwgZnNfaWQKICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpCiAgICAgKi8KICAgIEdlbmVyYXRlYmRsaW5rVGFzay5wcm90b3R5cGUuZ2V0RmlsZUluZm8gPSBmdW5jdGlvbiAoaSkgewogICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgdmFyIGZpbGUgPSB0aGlzLmZpbGVJbmZvTGlzdFtpXTsKICAgICAgICBhamF4KHsKICAgICAgICAgICAgdXJsOiBtZXRhX3VybCArIGVuY29kZVVSSUNvbXBvbmVudChmaWxlLnBhdGgpLAogICAgICAgICAgICByZXNwb25zZVR5cGU6ICJqc29uIiwKICAgICAgICAgICAgbWV0aG9kOiAiR0VUIiwKICAgICAgICB9LCBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICBkYXRhID0gZGF0YS5yZXNwb25zZTsKICAgICAgICAgICAgaWYgKCFkYXRhLmVycm9yX2NvZGUpIHsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmxpc3RbMF0uaXNkaXIpIHsKICAgICAgICAgICAgICAgICAgICBmaWxlLmlzZGlyID0gMTsKICAgICAgICAgICAgICAgICAgICBmaWxlLmVycm5vID0gOTAwOwogICAgICAgICAgICAgICAgICAgIF90aGlzLmdlbmVyYXRlQmRsaW5rKGkgKyAxKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmaWxlLnNpemUgPSBkYXRhLmxpc3RbMF0uc2l6ZTsKICAgICAgICAgICAgICAgIGZpbGUuZnNfaWQgPSBkYXRhLmxpc3RbMF0uZnNfaWQ7CiAgICAgICAgICAgICAgICBmaWxlLm1kNSA9ICIiOwogICAgICAgICAgICAgICAgX3RoaXMuZ2V0RGxpbmsoaSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBmaWxlLmVycm5vID0gZGF0YS5lcnJvcl9jb2RlOwogICAgICAgICAgICAgICAgX3RoaXMuZ2VuZXJhdGVCZGxpbmsoaSArIDEpOwogICAgICAgICAgICB9CiAgICAgICAgfSwgZnVuY3Rpb24gKHN0YXR1c0NvZGUpIHsKICAgICAgICAgICAgZmlsZS5lcnJubyA9IHN0YXR1c0NvZGUgPT09IDQwNCA/IDkwOSA6IHN0YXR1c0NvZGU7CiAgICAgICAgICAgIF90aGlzLmdlbmVyYXRlQmRsaW5rKGkgKyAxKTsKICAgICAgICB9LCBzdGFuZGFyZFJldHJ5KTsKICAgIH07CiAgICAvKioKICAgICAqIEBkZXNjcmlwdGlvbjog6I635Y+W5YiG5Lqr6aG155qE5paH5Lu2ZGxpbmso5LiL6L2955u06ZO+KQogICAgICogQHBhcmFtIHtudW1iZXJ9IGkKICAgICAqLwogICAgR2VuZXJhdGViZGxpbmtUYXNrLnByb3RvdHlwZS5nZXRTaGFyZURsaW5rID0gZnVuY3Rpb24gKGkpIHsKICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgIHZhciBzaWduLCB0aW1lc3RhbXAsIGZpbGUgPSB0aGlzLmZpbGVJbmZvTGlzdFtpXSwgb25GYWlsZWQgPSBmdW5jdGlvbiAoZXJybm8pIHsKICAgICAgICAgICAgZmlsZS5lcnJubyA9IGVycm5vOwogICAgICAgICAgICBfdGhpcy5nZXRTaGFyZURsaW5rKGkgKyAxKTsKICAgICAgICAgICAgLy8gbWQ15Li656m65Y+q5Zyo5YiG5Lqr5Y2V5Liq5paH5Lu25pe25Ye6546wLCDmlYXml6DpnIDogIPomZHojrflj5blpJrmlofku7ZtZDUo6Lez6L2sZ2VuZXJhdGVCZGxpbmspLCDnm7TmjqXot7PovaxjaGVja01kNeWNs+WPrwogICAgICAgIH07CiAgICAgICAgZnVuY3Rpb24gZ2V0VHBsY29uZmlnKGZpbGUpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgYWpheCh7CiAgICAgICAgICAgICAgICB1cmw6IHRwbF91cmwgKyAiJnN1cmw9IiArIHRoaXMuc3VybCArICImbG9naWQ9IiArIHRoaXMubG9naWQsCiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6ICJqc29uIiwKICAgICAgICAgICAgICAgIG1ldGhvZDogIkdFVCIsCiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5yZXNwb25zZTsKICAgICAgICAgICAgICAgIC8vIOivt+axguato+W4uAogICAgICAgICAgICAgICAgaWYgKCFkYXRhLmVycm5vKSB7CiAgICAgICAgICAgICAgICAgICAgc2lnbiA9IGRhdGEuZGF0YS5zaWduOwogICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcCA9IGRhdGEuZGF0YS50aW1lc3RhbXA7CiAgICAgICAgICAgICAgICAgICAgZ2V0RGxpbmsuY2FsbChfdGhpcywgZmlsZSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8g6K+35rGC5oql6ZSZCiAgICAgICAgICAgICAgICBvbkZhaWxlZChkYXRhLmVycm5vKTsKICAgICAgICAgICAgfSwgb25GYWlsZWQsIHN0YW5kYXJkUmV0cnkpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBnZXREbGluayhmaWxlKSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgIGFqYXgoewogICAgICAgICAgICAgICAgdXJsOiBzaGFyZWRvd25sb2FkX3VybCArICImc2lnbj0iICsgc2lnbiArICImdGltZXN0YW1wPSIgKyB0aW1lc3RhbXAsCiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6ICJqc29uIiwKICAgICAgICAgICAgICAgIG1ldGhvZDogIlBPU1QiLAogICAgICAgICAgICAgICAgZGF0YTogY29udmVydERhdGEoewogICAgICAgICAgICAgICAgICAgIGV4dHJhOiBnZXRFeHRyYSgpLAogICAgICAgICAgICAgICAgICAgIGxvZ2lkOiB0aGlzLmxvZ2lkLAogICAgICAgICAgICAgICAgICAgIGZpZF9saXN0OiBKU09OLnN0cmluZ2lmeShbZmlsZS5mc19pZF0pLAogICAgICAgICAgICAgICAgICAgIHByaW1hcnlpZDogdW5zYWZlV2luZG93Lnl1bkRhdGEgPyB1bnNhZmVXaW5kb3cueXVuRGF0YS5zaGFyZWlkIDogdW5zYWZlV2luZG93LmxvY2Fscy5zaGFyZWlkLAogICAgICAgICAgICAgICAgICAgIHVrOiB1bnNhZmVXaW5kb3cueXVuRGF0YSA/IHVuc2FmZVdpbmRvdy55dW5EYXRhLnNoYXJlX3VrIDogdW5zYWZlV2luZG93LmxvY2Fscy5zaGFyZV91aywKICAgICAgICAgICAgICAgICAgICBwcm9kdWN0OiAic2hhcmUiLAogICAgICAgICAgICAgICAgICAgIGVuY3J5cHQ6IDAsCiAgICAgICAgICAgICAgICB9KSwKICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLnJlc3BvbnNlOwogICAgICAgICAgICAgICAgLy8g6K+35rGC5q2j5bi4CiAgICAgICAgICAgICAgICBpZiAoIWRhdGEuZXJybm8pIHsKICAgICAgICAgICAgICAgICAgICBpZiAoX3RoaXMuaXNEb3dubG9hZCkgewogICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5kaXJlY3RGaWxlRG93bmxvYWQoaSwgZGF0YS5saXN0WzBdLmRsaW5rKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmFjcXVpcmVGaWxlTWQ1KGksIGRhdGEubGlzdFswXS5kbGluayk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIOivt+axguaKpemUmQogICAgICAgICAgICAgICAgb25GYWlsZWQoZGF0YS5lcnJubyk7CiAgICAgICAgICAgIH0sIG9uRmFpbGVkLCBzdGFuZGFyZFJldHJ5KTsKICAgICAgICB9CiAgICAgICAgZ2V0VHBsY29uZmlnLmNhbGwodGhpcywgZmlsZSk7CiAgICB9OwogICAgLyoqCiAgICAgKiBAZGVzY3JpcHRpb246IOiOt+WPluaWh+S7tmRsaW5rKOS4i+i9veebtOmTvikKICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpCiAgICAgKi8KICAgIEdlbmVyYXRlYmRsaW5rVGFzay5wcm90b3R5cGUuZ2V0RGxpbmsgPSBmdW5jdGlvbiAoaSkgewogICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgdmFyIGZpbGUgPSB0aGlzLmZpbGVJbmZvTGlzdFtpXTsKICAgICAgICAvLyDkvb/nlKjnlJ/miJDpobXml7bku4XmnIlwYXRo5rKh5pyJZnNfaWQsIOi3s+i9rOWIsOiOt+WPlmZzX2lkCiAgICAgICAgaWYgKCFmaWxlLmZzX2lkKSB7CiAgICAgICAgICAgIHRoaXMuZ2V0RmlsZUluZm8oaSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgYWpheCh7CiAgICAgICAgICAgIHVybDogbWV0YV91cmwyICsgSlNPTi5zdHJpbmdpZnkoW1N0cmluZyhmaWxlLmZzX2lkKV0pLAogICAgICAgICAgICByZXNwb25zZVR5cGU6ICJqc29uIiwKICAgICAgICAgICAgbWV0aG9kOiAiR0VUIiwKICAgICAgICAgICAgaGVhZGVyczogeyAiVXNlci1BZ2VudCI6IFVBIH0sCiAgICAgICAgfSwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgZGF0YSA9IGRhdGEucmVzcG9uc2U7CiAgICAgICAgICAgIC8vIOivt+axguato+W4uAogICAgICAgICAgICBpZiAoIWRhdGEuZXJybm8pIHsKICAgICAgICAgICAgICAgIF90aGlzLmFjcXVpcmVGaWxlTWQ1KGksIGRhdGEuaW5mb1swXS5kbGluayk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8g6K+35rGC5oql6ZSZCiAgICAgICAgICAgIGZpbGUuZXJybm8gPSBkYXRhLmVycm5vOwogICAgICAgICAgICBfdGhpcy5nZW5lcmF0ZUJkbGluayhpICsgMSk7CiAgICAgICAgfSwgZnVuY3Rpb24gKHN0YXR1c0NvZGUpIHsKICAgICAgICAgICAgZmlsZS5lcnJubyA9IHN0YXR1c0NvZGU7CiAgICAgICAgICAgIF90aGlzLmdlbmVyYXRlQmRsaW5rKGkgKyAxKTsKICAgICAgICB9LCBzdGFuZGFyZFJldHJ5KTsKICAgIH07CiAgICAvKioKICAgICAqIEBkZXNjcmlwdGlvbjogZ2V0IE1ENQogICAgICogQHBhcmFtIHtudW1iZXJ9IGkKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkbGluawogICAgICovCiAgICBHZW5lcmF0ZWJkbGlua1Rhc2sucHJvdG90eXBlLmFjcXVpcmVGaWxlTWQ1ID0gZnVuY3Rpb24gKGksIGRsaW5rKSB7CiAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICB2YXIgZmlsZSA9IHRoaXMuZmlsZUluZm9MaXN0W2ldOwogICAgICAgIC8vbGV0IGRsU2l6ZSA9IGZpbGUuc2l6ZSA8IDI2MjE0NCA/IDEgOiAyNjIxNDM7IC8vc2xpY2UtbWQ1OiDmlofku7bliY0yNTZLaULnmoRtZDUsIHNpemU8MjU2S2lC5YiZ55u05o6l5Y+WbWQ15Y2z5Y+vLCDml6DpnIDkuIvovb3mlofku7bmlbDmja4KICAgICAgICB2YXIgZGxTaXplID0gMTsKICAgICAgICBhamF4KHsKICAgICAgICAgICAgdXJsOiBkbGluaywKICAgICAgICAgICAgbWV0aG9kOiAiR0VUIiwKICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiAiYXJyYXlidWZmZXIiLAogICAgICAgICAgICBoZWFkZXJzOiB7CiAgICAgICAgICAgICAgICBSYW5nZTogImJ5dGVzPTAtIiArIGRsU2l6ZSwKICAgICAgICAgICAgICAgICJVc2VyLUFnZW50IjogVUEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG9ucHJvZ3Jlc3M6IHRoaXMub25Qcm9ncmVzcywKICAgICAgICB9LCBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICBfdGhpcy5vblByb2dyZXNzKHsgbG9hZGVkOiAxMDAsIHRvdGFsOiAxMDAgfSk7IC8vIDEwMCUKICAgICAgICAgICAgX3RoaXMucGFyc2VEb3dubG9hZERhdGEoaSwgZGF0YSk7CiAgICAgICAgfSwgZnVuY3Rpb24gKHN0YXR1c0NvZGUpIHsKICAgICAgICAgICAgaWYgKHN0YXR1c0NvZGUgPT09IDQwNCkKICAgICAgICAgICAgICAgIGZpbGUuZXJybm8gPSA5MDk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGZpbGUuZXJybm8gPSBzdGF0dXNDb2RlOwogICAgICAgICAgICBfdGhpcy5nZW5lcmF0ZUJkbGluayhpICsgMSk7CiAgICAgICAgfSwgc3RhbmRhcmRSZXRyeSk7CiAgICB9OwogICAgLyoqCiAgICAgKiBAZGVzY3JpcHRpb246IOino+aekOebtOmTvuivt+axgui/lOWbnueahOaVsOaNrgogICAgICogQHBhcmFtIHtudW1iZXJ9IGkKICAgICAqIEBwYXJhbSB7YW55fSBkYXRhCiAgICAgKi8KICAgIEdlbmVyYXRlYmRsaW5rVGFzay5wcm90b3R5cGUucGFyc2VEb3dubG9hZERhdGEgPSBmdW5jdGlvbiAoaSwgZGF0YSkgewogICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgdmFyIGZpbGUgPSB0aGlzLmZpbGVJbmZvTGlzdFtpXTsKICAgICAgICBjb25zb2xlLmxvZygiZGxfdXJsOiAiICsgZGF0YS5maW5hbFVybCk7IC8vIGRlYnVnCiAgICAgICAgLy8g5LiL6L2955u06ZO+6YeN5a6a5ZCR5Yiw5q2k5Z+f5ZCNLCDliKTlrprkuLrmlofku7blkozosJAKICAgICAgICBpZiAoZGF0YS5maW5hbFVybC5pbmNsdWRlcygiaXNzdWVjZG4uYmFpZHVwY3MuY29tIikpIHsKICAgICAgICAgICAgZmlsZS5lcnJubyA9IDE5MTk7CiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVCZGxpbmsoaSArIDEpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIC8vIOS7juS4i+i9veaOpeWPo+iOt+WPlm1kNSwg5q2k5q2l6aqk5Y+v56Gu5L+d6I635Y+W5Yiw5q2j56GubWQ1CiAgICAgICAgdmFyIGZpbGVNZDUgPSBkYXRhLnJlc3BvbnNlSGVhZGVycy5tYXRjaCgvY29udGVudC1tZDU6IChbXGRhLWZdezMyfSkvaSk7CiAgICAgICAgaWYgKGZpbGVNZDUpCiAgICAgICAgICAgIGZpbGUubWQ1ID0gZmlsZU1kNVsxXTsKICAgICAgICBlbHNlIGlmIChmaWxlLnNpemUgPD0gMzkwMDAwMDAwMCAmJiAhZmlsZS5yZXRyeV85OTYgJiYgIXRoaXMuaXNTaGFyZVBhZ2UpIHsKICAgICAgICAgICAgLy8g6buY6K6k5LiL6L295o6l5Y+j5pyq5ou/5YiwbWQ1LCDlsJ3or5Xkvb/nlKjml6fkuIvovb3mjqXlj6MsIOaXp+aOpeWPo+ivt+axguaWh+S7tnNpemXlpKfkuo4zLjlH5Lya6L+U5ZueNDAzCiAgICAgICAgICAgIC8vIOWIhuS6q+mhteeahOeUn+aIkOS7u+WKoeS4jeimgeiwg+eUqOaXp+aOpeWPowogICAgICAgICAgICBmaWxlLnJldHJ5Xzk5NiA9IHRydWU7CiAgICAgICAgICAgIHRoaXMuYWNxdWlyZUZpbGVNZDUoaSwgcGNzX3VybCArICgiJnBhdGg9IiArIGVuY29kZVVSSUNvbXBvbmVudChmaWxlLnBhdGgpKSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8vIOS4pOS4quS4i+i9veaOpeWPo+Wdh+acquaLv+WIsG1kNSwg5aSx6LSl6Lez5Ye6CiAgICAgICAgICAgIGZpbGUuZXJybm8gPSA5OTY7CiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVCZGxpbmsoaSArIDEpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHZhciBpbnRlcnZhbCA9IHRoaXMuZmlsZUluZm9MaXN0Lmxlbmd0aCA+IDEgPyAyMDAwIDogMTAwMDsKICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgX3RoaXMuZ2VuZXJhdGVCZGxpbmsoaSArIDEpOwogICAgICAgIH0sIGludGVydmFsKTsKICAgIH07CiAgICAvKioKICAgICAqIEBkZXNjcmlwdGlvbjogIuaegemAn+eUn+aIkCIg5Y+v6IO95b6X5Yiw6ZSZ6K+vbWQ1LCDmlYXmiafooYzpqozor4HmraXpqqQsIOiLpemqjOivgeS4jemAmui/h+WImeaJp+ihjOaZrumAmueUn+aIkAogICAgICogQHBhcmFtIHtudW1iZXJ9IGkKICAgICAqLwogICAgR2VuZXJhdGViZGxpbmtUYXNrLnByb3RvdHlwZS5jaGVja01kNSA9IGZ1bmN0aW9uIChpKSB7CiAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICBpZiAoaSA+PSB0aGlzLmZpbGVJbmZvTGlzdC5sZW5ndGgpIHsKICAgICAgICAgICAgdGhpcy5vbkZpbmlzaCh0aGlzLmZpbGVJbmZvTGlzdCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdmFyIGZpbGUgPSB0aGlzLmZpbGVJbmZvTGlzdFtpXTsKICAgICAgICAvLyDot7Pov4fmiavmj4/lpLHotKXnmoTnm67lvZXot6/lvoQKICAgICAgICBpZiAoZmlsZS5lcnJubyAmJiBmaWxlLmlzZGlyKSB7CiAgICAgICAgICAgIHRoaXMuY2hlY2tNZDUoaSArIDEpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRoaXMub25Qcm9jZXNzKGksIHRoaXMuZmlsZUluZm9MaXN0KTsKICAgICAgICB0aGlzLm9uUHJvZ3Jlc3MoZmFsc2UsICLmnoHpgJ/nlJ/miJDkuK0uLi4iKTsKICAgICAgICB0aGlzLmlzU2hhcmVQYWdlID8gdGhpcy5nZXRTaGFyZURsaW5rKGkpIDogdGhpcy5nZXREbGluayhpKTsKICAgICAgICAvLyB0aGlzLmlzU2hhcmVQYWdlID8gdGhpcy5nZXRTaGFyZURsaW5rKGkpIDogdGhpcy5nZXREbGluayhpKTsKICAgICAgICAvLyAyMy40LjI3OiDplJnor69tZDXlnKjmlofku7bkuIrkvKDogIXotKblj7fkvb/nlKjmraTmjqXlj6PmraPluLjovazlrZgsIOWcqOWFtuS7lui0puWPt+WImeaKpemUmSM0MDQoIzMxMTkwKSwg5a+86Ie055Sf5oiQ56eS5Lyg5a6M5YWo5peg5rOV6aqM6K+BLCDmlYXlvIPnlKhtZXRh5YaF55qEbWQ1CiAgICAgICAgLy8gMjMuNS40OiDlj5HnjrDplJnor69tZDXlj6ropoHmlLnmiJDlpKflhpksIOWcqOS4iuS8oOiAhei0puWPt+WwseiDveato+W4uOi/lOWbniMzMTE5MCwg6ICM5q2j56GubWQ15YiZ5aSn5bCP5YaZ6YO96IO95q2j5bi46L2s5a2YLCDmlYXph43mlrDlkK/nlKjmraTpqozor4Hov4fnqIsKICAgICAgICAvLyDkuLvopoHmmK/lm6DkuLrpopHnuYHor7fmsYLnm7Tpk77mjqXlj6Pojrflj5bmraPnoa5tZDXkvJrlr7zoh7QjOTAxOemUmeivryjljbPotKblj7fooqvpmZDliLYpLCDlr7nlpKfmibnph4/nlJ/miJDnp5LkvKDmnInlvojlpKflvbHlk40sIOaegemAn+eUn+aIkOWKn+iDveS9v+eUqOatpOmqjOivgeWImeWPr+S7peiKgue6puivt+axguS7pemBv+WFjeatpOmXrumimAogICAgICAgIC8vIOS4uumBv+WFjeeZvuW6puWQjumdouWPiOaUueaOpeWPo+WvvOiHtOeUn+aIkOmUmeivr+enkuS8oOmXrumimCwg6L+Z5Liq5o6l5Y+j54m55oCn5oiR5Lya5YaZ5Liq5a6a5pe26ISa5pys5q+P5aSp5rWL6K+V5LiA5qyhLCDlh7rkuobpl67popjlsLHog73ljbPkvb/mm7TmlrAKICAgICAgICAvLyDnm67liY3lj5HnjrDmmK/pgJrov4fnp5LkvKDmi7/liLDnmoTmlofku7blho3nlJ/miJDnp5LkvKDkuI3kvJrmnInov5npl67popgsIOS4iuS8oOeahOaWh+S7tuaIlumAmui/h+WIhuS6q+i9rOWtmOeahOWIq+S6uuS4iuS8oOeahOaWh+S7tuWImeS8muaciQogICAgICAgIHJhcGlkdXBsb2FkQ3JlYXRlRmlsZS5jYWxsKHRoaXMsIGZpbGUsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgIGRhdGEgPSBkYXRhLnJlc3BvbnNlOwogICAgICAgICAgICBpZiAoMCA9PT0gZGF0YS5lcnJubykKICAgICAgICAgICAgICAgIF90aGlzLmNoZWNrTWQ1KGkgKyAxKTsgLy8gbWQ16aqM6K+B5oiQ5YqfCiAgICAgICAgICAgIGVsc2UgaWYgKDMxMTkwID09PSBkYXRhLmVycm5vKSB7CiAgICAgICAgICAgICAgICAvLyBtZDXpqozor4HlpLHotKUsIOaJp+ihjOaZrumAmueUn+aIkCwg5LuF5Zyo5q2k5aSE5L+d5a2Y5Lu75Yqh6L+b5bqmLCDnlJ/miJDpobXkuI3kv53lrZjov5vluqYKICAgICAgICAgICAgICAgIGlmICghX3RoaXMuaXNTaGFyZVBhZ2UpCiAgICAgICAgICAgICAgICAgICAgR01fc2V0VmFsdWUoInVuZmluaXNoIiwgewogICAgICAgICAgICAgICAgICAgICAgICBmaWxlX2luZm9fbGlzdDogX3RoaXMuZmlsZUluZm9MaXN0LAogICAgICAgICAgICAgICAgICAgICAgICBmaWxlX2lkOiBpLAogICAgICAgICAgICAgICAgICAgICAgICBpc0NoZWNrTWQ1OiB0cnVlLAogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgX3RoaXMuaXNTaGFyZVBhZ2UgPyBfdGhpcy5nZXRTaGFyZURsaW5rKGkpIDogX3RoaXMuZ2V0RGxpbmsoaSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvLyDmjqXlj6Porr/pl67lpLHotKUKICAgICAgICAgICAgICAgIGZpbGUuZXJybm8gPSBkYXRhLmVycm5vOwogICAgICAgICAgICAgICAgX3RoaXMuY2hlY2tNZDUoaSArIDEpOwogICAgICAgICAgICB9CiAgICAgICAgfSwgZnVuY3Rpb24gKHN0YXR1c0NvZGUpIHsKICAgICAgICAgICAgZmlsZS5lcnJubyA9IHN0YXR1c0NvZGU7CiAgICAgICAgICAgIF90aGlzLmNoZWNrTWQ1KGkgKyAxKTsKICAgICAgICB9LCAwLCB0cnVlKTsKICAgIH07CiAgICAvKioKICAgICAqIEBkZXNjcmlwdGlvbjog55So5LqO6Kej5p6Q5bqm55uY5Li76aG155qE5paH5Lu25YiX6KGo5pWw5o2uCiAgICAgKi8KICAgIEdlbmVyYXRlYmRsaW5rVGFzay5wcm90b3R5cGUucGFyc2VNYWluRmlsZUxpc3QgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBfYSA9IHRoaXMuc2VsZWN0TGlzdDsgX2kgPCBfYS5sZW5ndGg7IF9pKyspIHsKICAgICAgICAgICAgdmFyIGl0ZW0gPSBfYVtfaV07CiAgICAgICAgICAgIGlmIChpdGVtLmlzZGlyKQogICAgICAgICAgICAgICAgdGhpcy5kaXJMaXN0LnB1c2goaXRlbS5wYXRoKTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgdGhpcy5maWxlSW5mb0xpc3QucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgcGF0aDogaXRlbS5wYXRoLAogICAgICAgICAgICAgICAgICAgIHNpemU6IGl0ZW0uc2l6ZSwKICAgICAgICAgICAgICAgICAgICBmc19pZDogaXRlbS5mc19pZCwKICAgICAgICAgICAgICAgICAgICBtZDU6ICIiLAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgfTsKICAgIC8qKgogICAgICogQGRlc2NyaXB0aW9uOiDnlKjkuo7op6PmnpDliIbkuqvpobXnmoTmlofku7bliJfooajmlbDmja4KICAgICAqLwogICAgR2VuZXJhdGViZGxpbmtUYXNrLnByb3RvdHlwZS5wYXJzZVNoYXJlRmlsZUxpc3QgPSBmdW5jdGlvbiAobGlzdCkgewogICAgICAgIGlmIChsaXN0ID09PSB2b2lkIDApIHsgbGlzdCA9IHRoaXMuc2VsZWN0TGlzdDsgfQogICAgICAgIGZvciAodmFyIF9pID0gMCwgbGlzdF8xID0gbGlzdDsgX2kgPCBsaXN0XzEubGVuZ3RoOyBfaSsrKSB7CiAgICAgICAgICAgIHZhciBpdGVtID0gbGlzdF8xW19pXTsKICAgICAgICAgICAgdmFyIHBhdGggPSB2b2lkIDA7CiAgICAgICAgICAgIGlmICgiYXBwX2lkIiBpbiBpdGVtKQogICAgICAgICAgICAgICAgcGF0aCA9IGl0ZW0uaXNkaXIgPyBpdGVtLnBhdGggOiBpdGVtLnNlcnZlcl9maWxlbmFtZTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgcGF0aCA9IGl0ZW0ucGF0aDsKICAgICAgICAgICAgaWYgKCIvIiAhPT0gcGF0aC5jaGFyQXQoMCkpCiAgICAgICAgICAgICAgICBwYXRoID0gIi8iICsgcGF0aDsgLy8g6KGl6b2Q6Lev5b6E5byA5aS055qE5pac5p2gCiAgICAgICAgICAgIGlmIChpdGVtLmlzZGlyKQogICAgICAgICAgICAgICAgdGhpcy5kaXJMaXN0LnB1c2gocGF0aCk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHRoaXMuZmlsZUluZm9MaXN0LnB1c2goewogICAgICAgICAgICAgICAgICAgIHBhdGg6IHBhdGgsCiAgICAgICAgICAgICAgICAgICAgc2l6ZTogaXRlbS5zaXplLAogICAgICAgICAgICAgICAgICAgIGZzX2lkOiBpdGVtLmZzX2lkLAogICAgICAgICAgICAgICAgICAgIG1kNTogaXRlbS5tZDUgJiYgZGVjcnlwdE1kNShpdGVtLm1kNS50b0xvd2VyQ2FzZSgpKSwKICAgICAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH07CiAgICByZXR1cm4gR2VuZXJhdGViZGxpbmtUYXNrOwp9KCkpOwovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIGNvbnN0IGdlbmVyYXRlYmRsaW5rVGFzayA9IChHZW5lcmF0ZWJkbGlua1Rhc2spOwoKOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2JhaWR1L2NvbW1vbi9jb25zdC50c3gKLyoKICogQEF1dGhvcjogbWVuZ3pvbmVmaXJlCiAqIEBMYXN0RWRpdG9yczogdG91c2FrYXNwCiAqIEBEZXNjcmlwdGlvbjog5a2Y5pS+5ZCE56eN5YWo5bGA5bi46YeP5a+56LGhCiAqLwoKCgp2YXIgaG9zdCA9IGxvY2F0aW9uLmhvc3Q7CnZhciBsaXN0TGltaXQgPSAxMDAwMDsKdmFyIHN5bmNQYXRoUHJlZml4ID0gIi9fcGNzXy53b3Jrc3BhY2UiOwp2YXIgY3JlYXRlX3VybCA9ICJodHRwczovLyIgKyBob3N0ICsgIi9yZXN0LzIuMC94cGFuL2ZpbGU/bWV0aG9kPWNyZWF0ZSI7CnZhciBjcmVhdGVkaXJfdXJsID0gImh0dHBzOi8vIiArIGhvc3QgKyAiL2FwaS9jcmVhdGU/YT1jb21taXQmY2xpZW50dHlwZT0wJmFwcF9pZD0yNTA1Mjgmd2ViPTEiOwp2YXIgcHJlY3JlYXRlX3VybCA9ICJodHRwczovLyIgKyBob3N0ICsgIi9hcGkvcHJlY3JlYXRlIjsKdmFyIGxpc3RfdXJsID0gImh0dHBzOi8vIiArIGhvc3QgKyAiL3Jlc3QvMi4wL3hwYW4vbXVsdGltZWRpYT9tZXRob2Q9bGlzdGFsbCZvcmRlcj1uYW1lJmxpbWl0PSIgKyBsaXN0TGltaXQgKyAiJnBhdGg9IjsKdmFyIG1ldGFfdXJsID0gImh0dHBzOi8vcGNzLmJhaWR1LmNvbS9yZXN0LzIuMC9wY3MvZmlsZT9hcHBfaWQ9MjgyODI4MzUmbWV0aG9kPW1ldGEmcGF0aD0iOwp2YXIgbWV0YV91cmwyID0gImh0dHBzOi8vIiArIGhvc3QgKyAiL2FwaS9maWxlbWV0YXM/ZGxpbms9MSZmc2lkcz0iOwp2YXIgdHBsX3VybCA9ICJodHRwczovLyIgKyBob3N0ICsgIi9zaGFyZS90cGxjb25maWc/ZmllbGRzPXNpZ24sdGltZXN0YW1wJmNoYW5uZWw9Y2h1bmxlaSZ3ZWI9MSZhcHBfaWQ9MjUwNTI4JmNsaWVudHR5cGU9MCI7CnZhciBzaGFyZWRvd25sb2FkX3VybCA9ICJodHRwczovLyIgKyBob3N0ICsgIi9hcGkvc2hhcmVkb3dubG9hZD9jaGFubmVsPWNodW5sZWkmY2xpZW50dHlwZT0xMiZ3ZWI9MSZhcHBfaWQ9MjUwNTI4IjsKdmFyIHNoYXJlbGlzdF91cmwgPSAiaHR0cHM6Ly8iICsgaG9zdCArICIvc2hhcmUvbGlzdD9zaG93ZW1wdHk9MCZudW09IiArIGxpc3RMaW1pdCArICImY2hhbm5lbD1jaHVubGVpJndlYj0xJmFwcF9pZD0yNTA1MjgmY2xpZW50dHlwZT0wIjsKdmFyIHN5bmNkb3dubG9hZF91cmwgPSAiaHR0cHM6Ly8iICsgaG9zdCArICIvYXBpL2Rvd25sb2FkIjsKdmFyIHBjc191cmwgPSAiaHR0cHM6Ly9wY3MuYmFpZHUuY29tL3Jlc3QvMi4wL3Bjcy9maWxlP2FwcF9pZD0yODI4MjgzNSZtZXRob2Q9ZG93bmxvYWQiOwp2YXIgaWxsZWdhbFBhdGhQYXR0ZXJuID0gL1tcXCI6Kj88PnxdL2c7IC8vIOWMuemFjei3r+W+hOS4reeahOmdnuazleWtl+espgp2YXIgZ2V0QmRzdG9rZW47IC8vIOiOt+WPlmJkc3Rva2Vu55qE5a6e546wCmZ1bmN0aW9uIHNldEdldEJkc3Rva2VuKGZ1bmMpIHsKICAgIGdldEJkc3Rva2VuID0gZnVuYzsKfQp2YXIgZ2V0VXNlcklkOwpmdW5jdGlvbiBzZXRHZXRVc2VySWQoZnVuYykgewogICAgZ2V0VXNlcklkID0gZnVuYzsKfQp2YXIgcmVmcmVzaExpc3Q7IC8vIOWIt+aWsOaWh+S7tuWIl+ihqOeahOWunueOsApmdW5jdGlvbiBzZXRSZWZyZXNoTGlzdChmdW5jKSB7CiAgICByZWZyZXNoTGlzdCA9IGZ1bmM7Cn0KdmFyIGdldFNlbGVjdGVkRmlsZUxpc3Q7IC8vIOiOt+WPlumAieS4reeahOaWh+S7tuWIl+ihqOeahOWunueOsApmdW5jdGlvbiBzZXRHZXRTZWxlY3RlZEZpbGVMaXN0KGZ1bmMpIHsKICAgIGdldFNlbGVjdGVkRmlsZUxpc3QgPSBmdW5jOwp9CnZhciBnZXRTaGFyZUZpbGVMaXN0OwpmdW5jdGlvbiBzZXRHZXRTaGFyZUZpbGVMaXN0KGZ1bmMpIHsKICAgIGdldFNoYXJlRmlsZUxpc3QgPSBmdW5jOwp9CnZhciBzd2FsSW5zdGFuY2UgPSBuZXcgc3dhbEJhc2UobmV3IHJhcGlkdXBsb2FkVGFzaygpLCBuZXcgZ2VuZXJhdGViZGxpbmtUYXNrKCkpOwpmdW5jdGlvbiBiYWlkdUVycm5vKGVycm5vKSB7CiAgICBzd2l0Y2ggKGVycm5vKSB7CiAgICAgICAgY2FzZSAzMTA0NToKICAgICAgICBjYXNlIC02OgogICAgICAgICAgICByZXR1cm4gIuiupOivgeWksei0pSwg6K+36YeN5paw55m75YWlLCDliLfmlrDpobXpnaIiOwogICAgICAgIGNhc2UgLTc6CiAgICAgICAgICAgIHJldHVybiAi6L2s5a2Y6Lev5b6E5ZCr5pyJ6Z2e5rOV5a2X56ymLCDor7fmlLnlkI3lkI7ph43or5UiOwogICAgICAgIGNhc2UgLTg6CiAgICAgICAgICAgIHJldHVybiAi6Lev5b6E5LiL5a2Y5Zyo5ZCM5ZCN5paH5Lu2IjsKICAgICAgICBjYXNlIC05OgogICAgICAgICAgICByZXR1cm4gIumqjOivgeW3sui/h+acnywg6K+35Yi35paw6aG16Z2iIjsKICAgICAgICBjYXNlIDQwMDoKICAgICAgICAgICAgcmV0dXJuICLor7fmsYLplJnor68iOwogICAgICAgIGNhc2UgOTAxOToKICAgICAgICAgICAgcmV0dXJuICLor7fph43mlrDojrflj5bmjojmnYPnoIEiOwogICAgICAgIGNhc2UgNDAzOgogICAgICAgICAgICByZXR1cm4gIuaOpeWPo+mZkOWItuiuv+mXriI7CiAgICAgICAgY2FzZSA0MDQ6CiAgICAgICAgY2FzZSAzMTE5MDoKICAgICAgICAgICAgcmV0dXJuICLovazlrZjlpLHotKUsIOenkuS8oOacqueUn+aViCI7CiAgICAgICAgY2FzZSAxMTQ6CiAgICAgICAgICAgIHJldHVybiAi6L2s5a2Y5aSx6LSlIjsKICAgICAgICBjYXNlIDUxNDoKICAgICAgICAgICAgcmV0dXJuICLor7fmsYLlpLHotKUsIOW4uOingeeZvuW6pumXrumimCwg6K+356iN5ZCO6YeN6K+VIjsKICAgICAgICBjYXNlIDE5MTk6CiAgICAgICAgICAgIHJldHVybiAi5paH5Lu25bey6KKr5ZKM6LCQIjsKICAgICAgICBjYXNlIDk5NjoKICAgICAgICAgICAgcmV0dXJuICJtZDXojrflj5blpLHotKUiOwogICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgcmV0dXJuICLovazlrZjlpLHotKUsIOWPguaVsOmUmeivryI7CiAgICAgICAgY2FzZSAtMTA6CiAgICAgICAgICAgIHJldHVybiAi572R55uY5a656YeP5bey5ruhIjsKICAgICAgICBjYXNlIDUwMDoKICAgICAgICBjYXNlIDUwMjoKICAgICAgICBjYXNlIDUwMzoKICAgICAgICAgICAgcmV0dXJuICLmnI3liqHlmajplJnor68sIOivt+eojeWQjumHjeivlSI7CiAgICAgICAgY2FzZSAzMTA2NjoKICAgICAgICBjYXNlIDkwOToKICAgICAgICAgICAgcmV0dXJuICLot6/lvoTkuI3lrZjlnKgv5LqR56uv5paH5Lu25bey5o2f5Z2PIjsKICAgICAgICBjYXNlIDkwMDoKICAgICAgICAgICAgcmV0dXJuICLot6/lvoTkuLrmlofku7blpLksIOS4jeaUr+aMgeeUn+aIkOenkuS8oCI7CiAgICAgICAgY2FzZSAzMTAzOToKICAgICAgICAgICAgcmV0dXJuICLovazlrZjlpLHotKUsIOenkuS8oOaWh+S7tuWQjeWGsueqgSI7CiAgICAgICAgY2FzZSAxMTA6CiAgICAgICAgICAgIHJldHVybiAi6K+35YWI55m75b2V55m+5bqm6LSm5Y+3IjsKICAgICAgICBjYXNlIDkwMTM6CiAgICAgICAgICAgIHJldHVybiAi6LSm5Y+36KKr6ZmQ5Yi2LCDlsJ3or5Ug5pu05o2i6LSm5Y+3IOaIliDnrYnlvoXkuIDmrrXml7bpl7Tlho3ph43or5UiOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiAi5LiN5piO6ZSZ6K+vIjsKICAgIH0KfSAvLyDoh6rlrprkuYnnmb7luqZhcGnov5Tlm55lcnJub+eahOaKpemUmQoKOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2NvbW1vbi91dGlscy50c3gKLyoKICogQEF1dGhvcjogbWVuZ3pvbmVmaXJlCiAqIEBMYXN0RWRpdG9yczogdG91c2FrYXNwCiAqIEBEZXNjcmlwdGlvbjog5a2Y5pS+5bel5YW35Ye95pWwCiAqLwp2YXIgdXRpbHNfYXdhaXRlciA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikgewogICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9CiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9CiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbInRocm93Il0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfQogICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9CiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpOwogICAgfSk7Cn07CnZhciB1dGlsc19nZW5lcmF0b3IgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX2dlbmVyYXRvcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIGJvZHkpIHsKICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7CiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgInRocm93IjogdmVyYigxKSwgInJldHVybiI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZzsKICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfQogICAgZnVuY3Rpb24gc3RlcChvcCkgewogICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuIik7CiAgICAgICAgd2hpbGUgKF8pIHRyeSB7CiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbInJldHVybiJdIDogb3BbMF0gPyB5WyJ0aHJvdyJdIHx8ICgodCA9IHlbInJldHVybiJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDsKICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdOwogICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7CiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07CiAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7CiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfQogICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9CiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfQogICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTsKICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pOwogICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH0KICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTsKICAgIH0KfTsKCgoKLyoqCiAqIEBkZXNjcmlwdGlvbjog5by55Ye65LiA5Liq5paH5pys5o+Q56S65qGGCiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0CiAqLwpmdW5jdGlvbiBzaG93QWxlcnQodGV4dCkgewogICAgYWxlcnQoVEFHICsgIjpcbiIgKyB0ZXh0KTsKfQovKioKICogQGRlc2NyaXB0aW9uOiDop6PmnpDmlofku7bkv6Hmga8sIOi/lOWbnui9rOWtmOe7k+aenOWIl+ihqGh0bWwsIOenkuS8oOmTvuaOpSwg5aSx6LSl5paH5Lu25Liq5pWwLCDmiJDlip/nmoTmlofku7bkv6Hmga/liJfooagsIOWksei0peeahOaWh+S7tuS/oeaBr+WIl+ihqAogKiBAcGFyYW0ge0FycmF5fSBmaWxlSW5mb0xpc3Qg5paH5Lu25L+h5oGv5pWw5o2u5YiX6KGoCiAqLwpmdW5jdGlvbiBwYXJzZWZpbGVJbmZvKGZpbGVJbmZvTGlzdCkgewogICAgdmFyIGJkY29kZSA9ICIiOwogICAgdmFyIHN1Y2Nlc3NJbmZvID0gIiI7CiAgICB2YXIgZmFpbGVkSW5mbyA9ICIiOwogICAgdmFyIHN1Y2Nlc3NMaXN0ID0gW107CiAgICB2YXIgZmFpbExpc3QgPSBbXTsKICAgIHZhciBmYWlsQ29kZURpYyA9IHt9OwogICAgZmlsZUluZm9MaXN0LmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICBpdGVtLnBhdGggPSBpdGVtLnBhdGgucmVwbGFjZShzeW5jUGF0aFByZWZpeCwgIiIpOyAvLyDnp7vpmaTlkIzmraXpobXliY3nvIAKICAgICAgICAvLyDmiJDlip/mlofku7YKICAgICAgICBpZiAoMCA9PT0gaXRlbS5lcnJubyB8fCB1bmRlZmluZWQgPT09IGl0ZW0uZXJybm8pIHsKICAgICAgICAgICAgc3VjY2Vzc0luZm8gKz0gIjxwPiIgKyBpdGVtLnBhdGggKyAiPC9wPiI7CiAgICAgICAgICAgIGJkY29kZSArPSBpdGVtLm1kNSArICIjIiArIGl0ZW0uc2l6ZSArICIjIiArIGl0ZW0ucGF0aCArICJcbiI7CiAgICAgICAgICAgIHN1Y2Nlc3NMaXN0LnB1c2goaXRlbSk7CiAgICAgICAgfQogICAgICAgIC8vIOWksei0peaWh+S7tgogICAgICAgIGVsc2UgewogICAgICAgICAgICBmYWlsTGlzdC5wdXNoKGl0ZW0pOwogICAgICAgICAgICBpZiAoU3RyaW5nKGl0ZW0uZXJybm8pIGluIGZhaWxDb2RlRGljKQogICAgICAgICAgICAgICAgZmFpbENvZGVEaWNbU3RyaW5nKGl0ZW0uZXJybm8pXS5wdXNoKGl0ZW0pOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBmYWlsQ29kZURpY1tTdHJpbmcoaXRlbS5lcnJubyldID0gW2l0ZW1dOwogICAgICAgIH0KICAgIH0pOwogICAgdmFyIF9sb29wXzEgPSBmdW5jdGlvbiAoZmFpbENvZGUpIHsKICAgICAgICB2YXIgZmFpbEJyYW5jaEluZm8gPSAiIjsKICAgICAgICB2YXIgZmFpbEJyYW5jaExpc3QgPSBmYWlsQ29kZURpY1tmYWlsQ29kZV07CiAgICAgICAgZmFpbEJyYW5jaExpc3QuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkgewogICAgICAgICAgICBmYWlsQnJhbmNoSW5mbyArPSAiPHA+IiArIGl0ZW0ucGF0aCArICI8L3A+IjsKICAgICAgICB9KTsKICAgICAgICBmYWlsZWRJbmZvICs9ICI8ZGV0YWlscyBjbGFzcz1cIm16Zl9kZXRhaWxzIG16Zl9kZXRhaWxzX2JyYW5jaFwiPjxzdW1tYXJ5PjxzdmcgY2xhc3M9XCJtemZfYXJyb3dcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiN1wiPjxwb2x5bGluZSBwb2ludHM9XCIwLDAgOCw3IDE2LDBcIi8+PC9zdmc+PGI+IiArIGJhaWR1RXJybm8oTnVtYmVyKGZhaWxDb2RlKSkgKyAiICgjIiArIE51bWJlcihmYWlsQ29kZSkgKyAiKTo8L2I+IiArIGNvcHlGYWlsQnJhbmNoTGlzdCArICI8L3N1bW1hcnk+PC9kZXRhaWxzPjxkaXYgY2xhc3M9XCJtemZfY29udGVudFwiPiIgKyBmYWlsQnJhbmNoSW5mbyArICI8L2Rpdj4iOwogICAgfTsKICAgIGZvciAodmFyIGZhaWxDb2RlIGluIGZhaWxDb2RlRGljKSB7CiAgICAgICAgX2xvb3BfMShmYWlsQ29kZSk7CiAgICB9CiAgICBpZiAoZmFpbGVkSW5mbykKICAgICAgICBmYWlsZWRJbmZvID0gIjxkZXRhaWxzIGNsYXNzPVwibXpmX2RldGFpbHNcIj48c3VtbWFyeT48c3ZnIGNsYXNzPVwibXpmX2Fycm93XCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjdcIj48cG9seWxpbmUgcG9pbnRzPVwiMCwwIDgsNyAxNiwwXCIvPjwvc3ZnPjxiPlx1NTkzMVx1OEQyNVx1NjU4N1x1NEVGNlx1NTIxN1x1ODg2OChcdTcwQjlcdThGRDlcdTkxQ0NcdTc3MEJcdTU5MzFcdThEMjVcdTUzOUZcdTU2RTApOjwvYj4iICsgY29weUZhaWxMaXN0ICsgIjwvc3VtbWFyeT48L2RldGFpbHM+PGRpdiBjbGFzcz1cIm16Zl9jb250ZW50XCI+IiArIGZhaWxlZEluZm8gKyAiPC9kaXY+IjsKICAgIGlmIChzdWNjZXNzSW5mbykKICAgICAgICBzdWNjZXNzSW5mbyA9ICI8ZGV0YWlscyBjbGFzcz1cIm16Zl9kZXRhaWxzXCI+PHN1bW1hcnk+PHN2ZyBjbGFzcz1cIm16Zl9hcnJvd1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCI3XCI+PHBvbHlsaW5lIHBvaW50cz1cIjAsMCA4LDcgMTYsMFwiLz48L3N2Zz48Yj5cdTYyMTBcdTUyOUZcdTY1ODdcdTRFRjZcdTUyMTdcdTg4NjgoXHU3MEI5XHU1MUZCXHU1QzU1XHU1RjAwKTo8L2I+IiArIGNvcHlTdWNjZXNzTGlzdCArICI8L3N1bW1hcnk+PC9kZXRhaWxzPjxkaXYgY2xhc3M9XCJtemZfY29udGVudFwiPiIgKyBzdWNjZXNzSW5mbyArICI8L2Rpdj4iOwogICAgYmRjb2RlID0gYmRjb2RlLnRyaW0oKTsKICAgIHJldHVybiB7CiAgICAgICAgaHRtbEluZm86IHN1Y2Nlc3NJbmZvICYmIGZhaWxlZEluZm8KICAgICAgICAgICAgPyBzdWNjZXNzSW5mbyArICI8cD48YnIgLz48L3A+IiArIGZhaWxlZEluZm8KICAgICAgICAgICAgOiBzdWNjZXNzSW5mbyArIGZhaWxlZEluZm8sCiAgICAgICAgYmRjb2RlOiBiZGNvZGUsCiAgICAgICAgc3VjY2Vzc0xpc3Q6IHN1Y2Nlc3NMaXN0LAogICAgICAgIGZhaWxMaXN0OiBmYWlsTGlzdCwKICAgIH07Cn0KLyoqCiAqIEBkZXNjcmlwdGlvbjog6I635Y+W5YiG5Lqr6aG155qE5paH5Lu25YiX6KGoCiAqLwpmdW5jdGlvbiB1dGlsc19nZXRTaGFyZUZpbGVMaXN0KCkgewogICAgdmFyIGJkTGlzdEluc3RhbmNlID0gdW5zYWZlV2luZG93LnJlcXVpcmUoInN5c3RlbS1jb3JlOmNvbnRleHQvY29udGV4dC5qcyIpCiAgICAgICAgLmluc3RhbmNlRm9yU3lzdGVtLmxpc3Q7CiAgICB2YXIgc2VsZWN0TGlzdCA9IGJkTGlzdEluc3RhbmNlLmdldFNlbGVjdGVkKCk7CiAgICBpZiAoIXNlbGVjdExpc3QubGVuZ3RoKQogICAgICAgIHNlbGVjdExpc3QgPSBiZExpc3RJbnN0YW5jZS5nZXRDdXJyZW50TGlzdCgpOwogICAgcmV0dXJuIHNlbGVjdExpc3Q7Cn0KLyoqCiAqIEBkZXNjcmlwdGlvbjog6I635Y+W6YCJ5oup55qE5paH5Lu25YiX6KGoKOaXp+eJiOeVjOmdoikKICovCmZ1bmN0aW9uIGdldFNlbGVjdGVkRmlsZUxpc3RMZWdhY3koKSB7CiAgICByZXR1cm4gdW5zYWZlV2luZG93CiAgICAgICAgLnJlcXVpcmUoInN5c3RlbS1jb3JlOmNvbnRleHQvY29udGV4dC5qcyIpCiAgICAgICAgLmluc3RhbmNlRm9yU3lzdGVtLmxpc3QuZ2V0U2VsZWN0ZWQoKTsKfQovKioKICogQGRlc2NyaXB0aW9uOiDojrflj5bpgInmi6nnmoTmlofku7bliJfooago5paw54mI55WM6Z2iKQogKiDmiJHku47ov5nph4zmioTnmoQsIOiwouiwouS9oDogaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy96aC1DTi9zY3JpcHRzLzQzNjQ0NgogKi8KZnVuY3Rpb24gZ2V0U2VsZWN0ZWRGaWxlTGlzdE5ldygpIHsKICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIubmQtbWFpbi1saXN0LCAubmQtbmV3LW1haW4tbGlzdCIpLl9fdnVlX18KICAgICAgICAuc2VsZWN0ZWRMaXN0Owp9Ci8qKgogKiBAZGVzY3JpcHRpb246IOWwhmRhdGHplK7lgLzlr7novazmjaLkuLpxdWVyeeWtl+espuS4sgogKiBAcGFyYW0ge2FueX0gZGF0YQogKiBAcmV0dXJuIHtzdHJpbmd9IHF1ZXJ5CiAqLwpmdW5jdGlvbiBjb252ZXJ0RGF0YShkYXRhKSB7CiAgICB2YXIgcXVlcnkgPSBbXTsKICAgIGZvciAodmFyIGtleSBpbiBkYXRhKSB7CiAgICAgICAgcXVlcnkucHVzaChrZXkgKyAiPSIgKyBlbmNvZGVVUklDb21wb25lbnQoZGF0YVtrZXldKSk7CiAgICB9CiAgICA7CiAgICByZXR1cm4gcXVlcnkuam9pbignJicpOwp9Ci8qKgogKiBAZGVzY3JpcHRpb246IOS7juWJqui0tOadv+iOt+WPluWtl+espuS4suaVsOaNrgogKiBAcmV0dXJuIHtzdHJpbmd9IGJkbGluawogKi8KZnVuY3Rpb24gcGFyc2VDbGlwYm9hcmQoKSB7CiAgICByZXR1cm4gdXRpbHNfYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBiZGxpbmssIGVycm9yXzE7CiAgICAgICAgcmV0dXJuIHV0aWxzX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHsKICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkgewogICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgIF9hLnRyeXMucHVzaChbMCwgMiwgLCAzXSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgbmF2aWdhdG9yLmNsaXBib2FyZC5yZWFkVGV4dCgpXTsKICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICBiZGxpbmsgPSBfYS5zZW50KCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFEdVBhcnNlci5wYXJzZShiZGxpbmspLmxlbmd0aCkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sICIiXTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgYmRsaW5rXTsKICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICBlcnJvcl8xID0gX2Euc2VudCgpOwogICAgICAgICAgICAgICAgICAgIHNob3dBbGVydChhcHBFcnJvci5DbGlwYm9hcmRQcmVtaXNzaW9uRXJyKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgIiJdOwogICAgICAgICAgICAgICAgY2FzZSAzOiByZXR1cm4gWzIgLypyZXR1cm4qL107CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0pOwp9Ci8qKgogKiBAZGVzY3JpcHRpb246IOino+WvhuW3suWKoOWvhueahG1kNQogKiBAcGFyYW0ge3N0cmluZ30gbWQ1ICjliqDlr4YpCiAqIEByZXR1cm4ge3N0cmluZ30gbWQ1ICjop6Plr4YpCiAqLwpmdW5jdGlvbiBkZWNyeXB0TWQ1KG1kNSkgewogICAgaWYgKCEoKHBhcnNlSW50KG1kNVs5XSkgPj0gMCAmJiBwYXJzZUludChtZDVbOV0pIDw9IDkpIHx8CiAgICAgICAgKG1kNVs5XSA+PSAiYSIgJiYgbWQ1WzldIDw9ICJmIikpKQogICAgICAgIHJldHVybiBkZWNyeXB0KG1kNSk7CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIG1kNTsKICAgIGZ1bmN0aW9uIGRlY3J5cHQoZW5jcnlwdE1kNSkgewogICAgICAgIHZhciBrZXkgPSAoZW5jcnlwdE1kNVs5XS5jaGFyQ29kZUF0KDApIC0gImciLmNoYXJDb2RlQXQoMCkpLnRvU3RyaW5nKDE2KTsKICAgICAgICB2YXIga2V5MiA9IGVuY3J5cHRNZDUuc2xpY2UoMCwgOSkgKyBrZXkgKyBlbmNyeXB0TWQ1LnNsaWNlKDEwKTsKICAgICAgICB2YXIga2V5MyA9ICIiOwogICAgICAgIGZvciAodmFyIGEgPSAwOyBhIDwga2V5Mi5sZW5ndGg7IGErKykKICAgICAgICAgICAga2V5MyArPSAocGFyc2VJbnQoa2V5MlthXSwgMTYpIF4gKDE1ICYgYSkpLnRvU3RyaW5nKDE2KTsKICAgICAgICB2YXIgbWQ1ID0ga2V5My5zbGljZSg4LCAxNikgKwogICAgICAgICAgICBrZXkzLnNsaWNlKDAsIDgpICsKICAgICAgICAgICAga2V5My5zbGljZSgyNCwgMzIpICsKICAgICAgICAgICAga2V5My5zbGljZSgxNiwgMjQpOwogICAgICAgIHJldHVybiBtZDU7CiAgICB9Cn0KLyoqCiAqIEBkZXNjcmlwdGlvbjog55So5LqO6Kej5YazIzMxMDM55oql6ZSZCiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIOWOn+aWh+S7tui3r+W+hAogKiBAcmV0dXJuIHtzdHJpbmd9IOS/ruaUueaWh+S7tuWQjue8gOeahOi3r+W+hAogKi8KZnVuY3Rpb24gc3VmZml4Q2hhbmdlKHBhdGgpIHsKICAgIHZhciBzdWZmaXggPSBwYXRoLnN1YnN0cmluZyhwYXRoLmxhc3RJbmRleE9mKCIuIikgKyAxKTsgLy8g6I635Y+W5ZCO57yACiAgICByZXR1cm4gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sZW5ndGggLSBzdWZmaXgubGVuZ3RoKSArIHJldmVyc2VTdHIoc3VmZml4KTsKfQovKioKICogQGRlc2NyaXB0aW9uOiDpgIbovazlrZfnrKbkuLLlpKflsI/lhpkKICogQHBhcmFtIHtzdHJpbmd9IHN0ciDovpPlhaXlrZfnrKbkuLIKICogQHJldHVybiB7c3RyaW5nfSDlpITnkIblkI7nmoTlrZfnrKbkuLIKICovCmZ1bmN0aW9uIHJldmVyc2VTdHIoc3RyKSB7CiAgICB2YXIgbmV3U3RyID0gIiI7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciByZXZlcnNlQ2hhciA9IHZvaWQgMDsKICAgICAgICBpZiAoc3RyLmNoYXJBdChpKSA+PSAiYSIpCiAgICAgICAgICAgIHJldmVyc2VDaGFyID0gc3RyLmNoYXJBdChpKS50b1VwcGVyQ2FzZSgpOwogICAgICAgIGVsc2UgaWYgKHN0ci5jaGFyQXQoaSkgPj0gIkEiKQogICAgICAgICAgICByZXZlcnNlQ2hhciA9IHN0ci5jaGFyQXQoaSkudG9Mb3dlckNhc2UoKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHJldmVyc2VDaGFyID0gc3RyLmNoYXJBdChpKTsKICAgICAgICBuZXdTdHIgKz0gcmV2ZXJzZUNoYXI7CiAgICB9CiAgICByZXR1cm4gbmV3U3RyOwp9Ci8vIOS4i+aWueWbm+S4qmZ1bmN0aW9u55So5LqO5YiG5Lqr6aG155Sf5oiQ56eS5LygCi8vIOS+neaXp+aYr+S7jui/memHjOaKhOeahDogaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy96aC1DTi9zY3JpcHRzLzQzNjQ0NgpmdW5jdGlvbiBnZXRDb29raWUobmFtZSkgewogICAgdmFyIGFyciA9IGRvY3VtZW50LmNvb2tpZS5yZXBsYWNlKC9ccy9nLCAiIikuc3BsaXQoIjsiKTsKICAgIGZvciAodmFyIGkgPSAwLCBsID0gYXJyLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICAgIHZhciB0ZW1wQXJyID0gYXJyW2ldLnNwbGl0KCI9Iik7CiAgICAgICAgaWYgKHRlbXBBcnJbMF0gPT09IG5hbWUpIHsKICAgICAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCh0ZW1wQXJyWzFdKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gIiI7Cn0KZnVuY3Rpb24gZ2V0TG9naWQoKSB7CiAgICByZXR1cm4gYnRvYShnZXRDb29raWUoIkJBSURVSUQiKSk7IC8vIEJBSURVSUQgaXMgYXNjaWlpCn0KZnVuY3Rpb24gZ2V0U3VybCgpIHsKICAgIHZhciByZWcgPSAvKHNcL3xzdXJsPSkoW2EtekEtWjAtOV8tXSspLzsKICAgIGlmIChyZWcudGVzdChsb2NhdGlvbi5ocmVmKSkgewogICAgICAgIHJldHVybiBsb2NhdGlvbi5ocmVmLm1hdGNoKHJlZylbMl07CiAgICB9CiAgICByZXR1cm4gIiI7Cn0KZnVuY3Rpb24gZ2V0RXh0cmEoKSB7CiAgICB2YXIgc2VLZXkgPSBkZWNvZGVVUklDb21wb25lbnQoZ2V0Q29va2llKCJCRENMTkQiKSk7CiAgICByZXR1cm4gInsiICsgJyJzZWtleSI6IicgKyBzZUtleSArICciJyArICJ9IjsKfQpmdW5jdGlvbiBpc01vYmlsZVZlcigpIHsKICAgIHJldHVybiBkb2N1bWVudC5sb2NhdGlvbi5wYXRobmFtZSA9PT0gJy93YXAvaG9tZScgfHwgZG9jdW1lbnQucXVlcnlTZWxlY3Rvcignc2NyaXB0W3NyY149Imh0dHBzOi8vaG0uYmFpZHUuY29tL2guanMiXTpub3QoW2FzeW5jXSknKSAhPSBudWxsOwp9Cgo7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvYmFpZHUvbmV3UGFnZS9sb2FkZXIudHN4Ci8qCiAqIEBBdXRob3I6IG1lbmd6b25lZmlyZQogKiBATGFzdEVkaXRvcnM6IHRvdXNha2FzcAogKiBARGVzY3JpcHRpb246IOaWsOeJiOW6puebmOeVjOmdomxvYWRlcuWFpeWPozogaHR0cHM6Ly9wYW4uYmFpZHUuY29tL2Rpc2svbWFpbgogKi8KCgoKdmFyIGh0bWxUYWdOZXcgPSAiZGl2Lm5kLWZpbGUtbGlzdC10b29sYmFyX19hY3Rpb25zIjsgLy8g5paw54mI55WM6Z2i56eS5Lyg5oyJ6ZKu55qEaHRtbOeItuWvueixoQp2YXIgaHRtbFRhZ05ldzIgPSAiZGl2LndwLXMtYWdpbGUtdG9vbC1iYXJfX2hlYWRlciI7IC8vIDIyLjUuMjQ6IOaWsOeJiOeVjOmdouaWsOWinueahOS4gOS4queItuWvueixoQp2YXIgaHRtbEJ0blJhcGlkTmV3ID0gLy8g5paw54mI55WM6Z2i56eS5Lyg5oyJ6ZKu55qEaHRtbOWFg+e0oAogJzxidXR0b24gaWQ9ImJkbGlua19idG4iIGNsYXNzPSJtemZfbmV3X2J0biI+PC9pPjxzcGFuPuenkuS8oDwvc3Bhbj48L2J1dHRvbj4nOwp2YXIgaHRtbEJ0bkdlbk5ldyA9IC8vIOaWsOeJiOeVjOmdouenkuS8oOeUn+aIkOaMiemSrueahGh0bWzlhYPntKAKICc8YnV0dG9uIGlkPSJnZW5fYmRsaW5rX2J0biIgY2xhc3M9Im16Zl9uZXdfYnRuIj48L2k+PHNwYW4+55Sf5oiQ56eS5LygPC9zcGFuPjwvYnV0dG9uPic7CmZ1bmN0aW9uIGluc3RhbGxOZXcoKSB7CiAgICBjb25zb2xlLmluZm8oIiVzIHZlcnNpb246ICVzIERPTeaWueW8j+WuieijhSAobmV3LXVpKSIsIFRBRywgdmVyc2lvbik7CiAgICBzd2FsSW5zdGFuY2Uuc3dhbEdsb2JhbEFyZ3MgPSB7CiAgICAgICAgaGVpZ2h0QXV0bzogZmFsc2UsCiAgICAgICAgc2Nyb2xsYmFyUGFkZGluZzogZmFsc2UsCiAgICB9OyAvLyDmt7vliqBzd2Fs5Y+C5pWw5Lul6Ziy5q2i5paw54mI55WM6Z2i5LiL55qEYm9keeagt+W8j+eqgeWPmAogICAgc2V0UmVmcmVzaExpc3QoZnVuY3Rpb24gKCkgewogICAgICAgIGRvY3VtZW50CiAgICAgICAgICAgIC5xdWVyeVNlbGVjdG9yKCIubmQtbWFpbi1saXN0LCAubmQtbmV3LW1haW4tbGlzdCIpCiAgICAgICAgICAgIC5fX3Z1ZV9fLnJlbG9hZExpc3QoKTsKICAgIH0pOwogICAgc2V0R2V0U2hhcmVGaWxlTGlzdCh1dGlsc19nZXRTaGFyZUZpbGVMaXN0KTsKICAgIHNldEdldFNlbGVjdGVkRmlsZUxpc3QoZ2V0U2VsZWN0ZWRGaWxlTGlzdE5ldyk7CiAgICBzZXRHZXRCZHN0b2tlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5uZC1tYWluLWxpc3QsIC5uZC1uZXctbWFpbi1saXN0IikuX192dWVfXy55dW5EYXRhCiAgICAgICAgICAgIC5iZHN0b2tlbjsKICAgIH0pOwogICAgc2V0R2V0VXNlcklkKGZ1bmN0aW9uICgpIHsgcmV0dXJuICcnICsgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLm5kLW1haW4tbGlzdCwgLm5kLW5ldy1tYWluLWxpc3QiKS5fX3Z1ZV9fLnl1bkRhdGEudWs7IH0pOwogICAgJChkb2N1bWVudCkub24oImNsaWNrIiwgIiNiZGxpbmtfYnRuIiwgZnVuY3Rpb24gKCkgewogICAgICAgIHN3YWxJbnN0YW5jZS5pbnB1dFZpZXcoKTsKICAgIH0pOyAvLyDnu5HlrprovazlrZjnp5LkvKDmjInpkq7kuovku7YKICAgICQoZG9jdW1lbnQpLm9uKCJjbGljayIsICIjZ2VuX2JkbGlua19idG4iLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgc3dhbEluc3RhbmNlLmdlbmVyYXRlYmRsaW5rVGFzay5yZXNldCgpOwogICAgICAgIHN3YWxJbnN0YW5jZS5jaGVja1VuZmluaXNoKCk7CiAgICB9KTsgLy8g57uR5a6a55Sf5oiQ56eS5Lyg5oyJ6ZKu5LqL5Lu2CiAgICBhZGRCdG4oKTsKfQpmdW5jdGlvbiBhZGRCdG4oKSB7CiAgICAvLyDova7or6Lmt7vliqDmjInpkq4sIOmYsuatouaWsOeJiOmhtemdoumHjeWkjWluaXTml7YsIOWwhuaMiemSruimhueblgogICAgdmFyIHRhcmdldCA9ICQoaHRtbFRhZ05ldyk7CiAgICBpZiAoIXRhcmdldC5sZW5ndGgpCiAgICAgICAgdGFyZ2V0ID0gJChodG1sVGFnTmV3Mik7CiAgICBpZiAodGFyZ2V0Lmxlbmd0aCAmJiAhJCgiI2JkbGlua19idG4iKS5sZW5ndGgpIHsKICAgICAgICB0YXJnZXQuYXBwZW5kKGh0bWxCdG5SYXBpZE5ldywgaHRtbEJ0bkdlbk5ldyk7CiAgICB9CiAgICBzZXRUaW1lb3V0KGFkZEJ0biwgNTAwKTsKfQoKOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2JhaWR1L2xlZ2FjeVBhZ2UvbG9hZGVyLnRzeAovKgogKiBAQXV0aG9yOiBtZW5nem9uZWZpcmUKICogQERhdGU6IDIwMjItMTAtMjAgMTA6MzY6NDMKICogQExhc3RFZGl0VGltZTogMjAyMi0xMi0yNCAxMDo1NzoyMwogKiBATGFzdEVkaXRvcnM6IG1lbmd6b25lZmlyZQogKiBARGVzY3JpcHRpb246IOaXp+eJiOW6puebmOeVjOmdomxvYWRlcuWFpeWPozogaHR0cHM6Ly9wYW4uYmFpZHUuY29tL2Rpc2svaG9tZT9zdGF5QXRIb21lPXRydWUKICovCgoKCnZhciBodG1sVGFnTGVnYWN5ID0gImRpdi50Y3VMQXUiOyAvLyDml6fniYjnlYzpnaLnp5LkvKDmjInpkq7nmoRodG1s54i25a+56LGhCnZhciBodG1sQnRuUmFwaWRMZWdhY3kgPSAvLyDml6fniYjnlYzpnaLnp5LkvKDmjInpkq7nmoRodG1s5YWD57SgCiAnPGEgY2xhc3M9ImctYnV0dG9uIGctYnV0dG9uLWJsdWUiIGlkPSJiZGxpbmtfYnRuIiB0aXRsZT0i56eS5Lyg6ZO+5o6lIiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyIiPjxzcGFuIGNsYXNzPSJnLWJ1dHRvbi1yaWdodCI+PGVtIGNsYXNzPSJpY29uIGljb24tZGlzayIgdGl0bGU9IuenkuS8oOmTvuaOpeaPkOWPliI+PC9lbT48c3BhbiBjbGFzcz0idGV4dCIgc3R5bGU9IndpZHRoOiBhdXRvOyI+56eS5Lyg6ZO+5o6lPC9zcGFuPjwvc3Bhbj48L2E+JzsKdmFyIGh0bWxCdG5HZW5MZWdhY3kgPSAvLyDml6fniYjnlYzpnaLnp5LkvKDnlJ/miJDmjInpkq7nmoRodG1s5YWD57SgCiAnPGEgY2xhc3M9ImctYnV0dG9uIiBpZD0iZ2VuX2JkbGlua19idG4iPjxzcGFuIGNsYXNzPSJnLWJ1dHRvbi1yaWdodCI+PGVtIGNsYXNzPSJpY29uIGljb24tc2hhcmUiPjwvZW0+PHNwYW4gY2xhc3M9InRleHQiIHN0eWxlPSJ3aWR0aDogYXV0bzsiPueUn+aIkOenkuS8oDwvc3Bhbj48L3NwYW4+PC9hPic7CmZ1bmN0aW9uIGluc3RhbGxMZWdhY3koKSB7CiAgICBjb25zb2xlLmluZm8oIiVzIHZlcnNpb246ICVzIERPTeaWueW8j+WuieijhSIsIFRBRywgdmVyc2lvbik7CiAgICBzZXRSZWZyZXNoTGlzdChmdW5jdGlvbiAoKSB7CiAgICAgICAgLy8g5pen54mI55WM6Z2iLCDosIPnlKjljp/nlJ/mlrnms5XliLfmlrDmlofku7bliJfooagsIOaXoOmcgOmHjeaWsOWKoOi9vemhtemdogogICAgICAgIHVuc2FmZVdpbmRvdwogICAgICAgICAgICAucmVxdWlyZSgic3lzdGVtLWNvcmU6c3lzdGVtL2Jhc2VTZXJ2aWNlL21lc3NhZ2UvbWVzc2FnZS5qcyIpCiAgICAgICAgICAgIC50cmlnZ2VyKCJzeXN0ZW0tcmVmcmVzaCIpOwogICAgfSk7CiAgICBzZXRHZXRTaGFyZUZpbGVMaXN0KHV0aWxzX2dldFNoYXJlRmlsZUxpc3QpOwogICAgc2V0R2V0U2VsZWN0ZWRGaWxlTGlzdChnZXRTZWxlY3RlZEZpbGVMaXN0TGVnYWN5KTsKICAgIHNldEdldEJkc3Rva2VuKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHVuc2FmZVdpbmRvdy5sb2NhbHMuZ2V0KCJiZHN0b2tlbiIpOyB9KTsKICAgIHNldEdldFVzZXJJZChmdW5jdGlvbiAoKSB7IHJldHVybiB1bnNhZmVXaW5kb3cubG9jYWxzLmdldCgidWsiKTsgfSk7CiAgICBsb2FkZXJfYWRkQnRuKCk7IC8vIERPTea3u+WKoOenkuS8oOaMiemSrgogICAgYWRkR2VuQnRuKCk7IC8vIERPTea3u+WKoOeUn+aIkOaMiemSrgogICAgJChkb2N1bWVudCkub24oImNsaWNrIiwgIiNiZGxpbmtfYnRuIiwgZnVuY3Rpb24gKCkgewogICAgICAgIHN3YWxJbnN0YW5jZS5pbnB1dFZpZXcoKTsKICAgIH0pOyAvLyDnu5Hlrprnp5LkvKDmjInpkq7kuovku7YKICAgICQoZG9jdW1lbnQpLm9uKCJjbGljayIsICIjZ2VuX2JkbGlua19idG4iLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgc3dhbEluc3RhbmNlLmdlbmVyYXRlYmRsaW5rVGFzay5yZXNldCgpOwogICAgICAgIHN3YWxJbnN0YW5jZS5jaGVja1VuZmluaXNoKCk7CiAgICB9KTsgLy8g57uR5a6a55Sf5oiQ5oyJ6ZKu5LqL5Lu2Cn0KZnVuY3Rpb24gZ2V0U3lzdGVtQ29udGV4dCgpIHsKICAgIHJldHVybiB1bnNhZmVXaW5kb3cucmVxdWlyZSgic3lzdGVtLWNvcmU6Y29udGV4dC9jb250ZXh0LmpzIikKICAgICAgICAuaW5zdGFuY2VGb3JTeXN0ZW07Cn0KZnVuY3Rpb24gYWRkR2VuQnRuKCkgewogICAgdmFyIGxpc3RUb29scyA9IGdldFN5c3RlbUNvbnRleHQoKS5Ccm9rZXIuZ2V0QnV0dG9uQnJva2VyKCJsaXN0VG9vbHMiKTsKICAgIGlmIChsaXN0VG9vbHMgJiYgbGlzdFRvb2xzLiRib3gpCiAgICAgICAgJChsaXN0VG9vbHMuJGJveCkuY2hpbGRyZW4oImRpdiIpLmFmdGVyKGh0bWxCdG5HZW5MZWdhY3kpOwogICAgZWxzZQogICAgICAgIHNldFRpbWVvdXQoYWRkR2VuQnRuLCAzMDApOwp9CmZ1bmN0aW9uIGxvYWRlcl9hZGRCdG4oKSB7CiAgICBpZiAoJChodG1sVGFnTGVnYWN5KS5sZW5ndGgpCiAgICAgICAgJChodG1sVGFnTGVnYWN5KS5hcHBlbmQoaHRtbEJ0blJhcGlkTGVnYWN5KTsKICAgIGVsc2UKICAgICAgICBzZXRUaW1lb3V0KGxvYWRlcl9hZGRCdG4sIDEwMCk7Cn0KCjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9iYWlkdS9zeW5jUGFnZS9sb2FkZXIudHN4Ci8qCiAqIEBBdXRob3I6IG1lbmd6b25lZmlyZQogKiBATGFzdEVkaXRvcnM6IHRvdXNha2FzcAogKiBARGVzY3JpcHRpb246IOWQjOatpeepuumXtGxvYWRlcuWFpeWPozogaHR0cHM6Ly9wYW4uYmFpZHUuY29tL2Rpc2svc3luY2hyb25pemF0aW9uIwogKi8KCgoKdmFyIGxvYWRlcl9odG1sVGFnTmV3ID0gImRpdi5uZC1idG4tZ3JvdXAgPiBzcGFuIjsKdmFyIGxvYWRlcl9odG1sQnRuUmFwaWROZXcgPSAnPGJ1dHRvbiBpZD0iYmRsaW5rX2J0biIgdHlwZT0iYnV0dG9uIiBjbGFzcz0idS1idXR0b24gaXMtcm91bmQgaXMtaGFzLWljb24iIHN0eWxlPSJiYWNrZ3JvdW5kOiAjMDZhN2ZmO2NvbG9yOiAjZmZmOyI+PHNwYW4+PGkgY2xhc3M9Imljb25mb250IGljb24tY29weSI+PC9pPjxzcGFuIGNsYXNzPSIgbmQtZmlsZS1saXN0LXRvb2xiYXItYWN0aW9uLWl0ZW0tdGV4dCI+56eS5LygPC9zcGFuPjwvc3Bhbj48L2J1dHRvbj4nOwovLyBjb25zdCBodG1sQnRuR2VuTmV3ID0KLy8gICAnPGJ1dHRvbiBpZD0iZ2VuX2JkbGlua19idG4iIHR5cGU9ImJ1dHRvbiIgY2xhc3M9InUtYnV0dG9uIGlzLXJvdW5kIGlzLWhhcy1pY29uIiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDhweDtiYWNrZ3JvdW5kOiAjMDZhN2ZmO2NvbG9yOiAjZmZmOyI+PHNwYW4+PGkgY2xhc3M9Imljb25mb250IGljb24tY29weSI+PC9pPjxzcGFuIGNsYXNzPSIgbmQtZmlsZS1saXN0LXRvb2xiYXItYWN0aW9uLWl0ZW0tdGV4dCI+55Sf5oiQ56eS5LygPC9zcGFuPjwvc3Bhbj48L2J1dHRvbj4nOwpmdW5jdGlvbiBpbnN0YWxsU3luYygpIHsKICAgIGNvbnNvbGUuaW5mbygiJXMgdmVyc2lvbjogJXMgRE9N5pa55byP5a6J6KOFIiwgVEFHLCB2ZXJzaW9uKTsKICAgIHN3YWxJbnN0YW5jZS5zd2FsR2xvYmFsQXJncyA9IHsKICAgICAgICBoZWlnaHRBdXRvOiBmYWxzZSwKICAgICAgICBzY3JvbGxiYXJQYWRkaW5nOiBmYWxzZSwKICAgIH07CiAgICBzZXRSZWZyZXNoTGlzdChmdW5jdGlvbiAoKSB7CiAgICAgICAgZG9jdW1lbnQKICAgICAgICAgICAgLnF1ZXJ5U2VsZWN0b3IoIi5uZC1tYWluLWxpc3QsIC5uZC1uZXctbWFpbi1saXN0IikKICAgICAgICAgICAgLl9fdnVlX18ucmVsb2FkTGlzdCgpOwogICAgfSk7CiAgICBzZXRHZXRTaGFyZUZpbGVMaXN0KHV0aWxzX2dldFNoYXJlRmlsZUxpc3QpOwogICAgc2V0R2V0U2VsZWN0ZWRGaWxlTGlzdChnZXRTZWxlY3RlZEZpbGVMaXN0TmV3KTsKICAgIHNldEdldEJkc3Rva2VuKGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLm5kLW1haW4tbGlzdCwgLm5kLW5ldy1tYWluLWxpc3QiKS5fX3Z1ZV9fLnl1bkRhdGEKICAgICAgICAgICAgLmJkc3Rva2VuOwogICAgfSk7CiAgICBzZXRHZXRVc2VySWQoZnVuY3Rpb24gKCkgeyByZXR1cm4gJycgKyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIubmQtbWFpbi1saXN0LCAubmQtbmV3LW1haW4tbGlzdCIpLl9fdnVlX18ueXVuRGF0YS51azsgfSk7CiAgICAkKGRvY3VtZW50KS5vbigiY2xpY2siLCAiI2JkbGlua19idG4iLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgc3dhbEluc3RhbmNlLmlucHV0VmlldygpOwogICAgfSk7IC8vIOe7keWumui9rOWtmOenkuS8oOaMiemSruS6i+S7tgogICAgJChkb2N1bWVudCkub24oImNsaWNrIiwgIiNnZW5fYmRsaW5rX2J0biIsIGZ1bmN0aW9uICgpIHsKICAgICAgICBzd2FsSW5zdGFuY2UuZ2VuZXJhdGViZGxpbmtUYXNrLnJlc2V0KCk7CiAgICAgICAgc3dhbEluc3RhbmNlLmNoZWNrVW5maW5pc2goKTsKICAgIH0pOyAvLyDnu5HlrprnlJ/miJDnp5LkvKDmjInpkq7kuovku7YKICAgIHN5bmNQYWdlX2xvYWRlcl9hZGRCdG4oKTsKfQpmdW5jdGlvbiBzeW5jUGFnZV9sb2FkZXJfYWRkQnRuKCkgewogICAgLy8g6L2u6K+i5re75Yqg5oyJ6ZKuLCDpmLLmraLmlrDniYjpobXpnaLph43lpI1pbml05pe2LCDlsIbmjInpkq7opobnm5YKICAgIHZhciB0YXJnZXQgPSAkKGxvYWRlcl9odG1sVGFnTmV3KTsKICAgIGlmICh0YXJnZXQubGVuZ3RoICYmICEkKCIjYmRsaW5rX2J0biIpLmxlbmd0aCkKICAgICAgICB0YXJnZXQuYXBwZW5kKGxvYWRlcl9odG1sQnRuUmFwaWROZXcpOwogICAgLy8gdGFyZ2V0LmFwcGVuZChodG1sQnRuUmFwaWROZXcsIGh0bWxCdG5HZW5OZXcpOwogICAgLy8g5ZCM5q2l6aG15Lit55qE5paH5Lu25L2/55So5Y+m5LiA56eN55qE5o6l5Y+j6I635Y+WZGxpbmssIOaVheaaguS4jea3u+WKoOeUn+aIkOWKn+iDvQogICAgc2V0VGltZW91dChzeW5jUGFnZV9sb2FkZXJfYWRkQnRuLCA1MDApOwp9Cgo7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvYmFpZHUvc2hhcmVQYWdlL2xvYWRlci50c3gKLyoKICogQEF1dGhvcjogbWVuZ3pvbmVmaXJlCiAqIEBMYXN0RWRpdG9yczogdG91c2FrYXNwCiAqIEBEZXNjcmlwdGlvbjog5paH5Lu25YiG5Lqr6aG1bG9hZGVy5YWl5Y+jOiBodHRwczovL3Bhbi5iYWlkdS5jb20vcy94eHgKICovCgoKCnZhciBodG1sQnRuR2VuU2hhcmUgPSAvLyDliIbkuqvpobXnmoTnp5LkvKDnlJ/miJDmjInpkq5odG1s5YWD57SgCiAnPGEgaWQ9Imdlbl9iZGxpbmtfYnRuX3NoYXJlUGFnZSIgdGl0bGU9IueUn+aIkOenkuS8oCIgY2xhc3M9ImctYnV0dG9uIGctYnV0dG9uLWJsdWUtbGFyZ2UiIHN0eWxlPSJtYXJnaW4tcmlnaHQ6IDVweDttYXJnaW4tbGVmdDogNXB4OyI+IDxzcGFuIGNsYXNzPSJnLWJ1dHRvbi1yaWdodCI+IDxlbSBjbGFzcz0iaWNvbiBpY29uLXNoYXJlIiBzdHlsZT0iY29sb3I6I2ZmZmZmZiIgdGl0bGU9IueUn+aIkOenkuS8oCI+PC9lbT4gPHNwYW4gY2xhc3M9InRleHQiIHN0eWxlPSJ3aWR0aDogYXV0bzsiPueUn+aIkOenkuS8oDwvc3Bhbj4gPC9zcGFuPiA8L2E+JzsKdmFyIGh0bWxUYWdTYWhyZSA9ICJbbm9kZS10eXBlPXFyQ29kZV0iOwpmdW5jdGlvbiBpbnN0YWxsU2hhcmUoKSB7CiAgICBjb25zb2xlLmluZm8oIiVzIHZlcnNpb246ICVzIERPTeaWueW8j+WuieijhSIsIFRBRywgdmVyc2lvbik7CiAgICBzZXRHZXRCZHN0b2tlbihmdW5jdGlvbiAoKSB7IHJldHVybiB1bnNhZmVXaW5kb3cubG9jYWxzLmdldCgiYmRzdG9rZW4iKTsgfSk7CiAgICBzZXRHZXRVc2VySWQoZnVuY3Rpb24gKCkgeyByZXR1cm4gdW5zYWZlV2luZG93LmxvY2Fscy5nZXQoInVrIik7IH0pOwogICAgc2V0R2V0U2hhcmVGaWxlTGlzdCh1dGlsc19nZXRTaGFyZUZpbGVMaXN0KTsKICAgIHNoYXJlUGFnZV9sb2FkZXJfYWRkQnRuKCk7CiAgICAkKGRvY3VtZW50KS5vbigiY2xpY2siLCAiI2dlbl9iZGxpbmtfYnRuX3NoYXJlUGFnZSIsIGZ1bmN0aW9uICgpIHsKICAgICAgICBzd2FsSW5zdGFuY2UuZ2VuZXJhdGViZGxpbmtUYXNrLnJlc2V0KCk7CiAgICAgICAgc3dhbEluc3RhbmNlLmdlbmVyYXRlYmRsaW5rVGFzay5pc1NoYXJlUGFnZSA9IHRydWU7CiAgICAgICAgc3dhbEluc3RhbmNlLmdlbkZpbGVXb3JrKGZhbHNlLCBmYWxzZSk7CiAgICB9KTsgLy8g57uR5a6a55Sf5oiQ5oyJ6ZKu5LqL5Lu2Cn0KZnVuY3Rpb24gc2hhcmVQYWdlX2xvYWRlcl9hZGRCdG4oKSB7CiAgICBpZiAoJChodG1sVGFnU2FocmUpLmxlbmd0aCkgewogICAgICAgICQoaHRtbFRhZ1NhaHJlKS5iZWZvcmUoaHRtbEJ0bkdlblNoYXJlKTsKICAgIH0KICAgIGVsc2UKICAgICAgICBzZXRUaW1lb3V0KHNoYXJlUGFnZV9sb2FkZXJfYWRkQnRuLCAxMDApOwp9Cgo7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvYmFpZHUvbW9iaWxlUGFnZS9sb2FkZXIudHN4CgoKCnZhciBtb2JpbGVQYWdlX2xvYWRlcl9odG1sQnRuUmFwaWROZXcgPSAvLyDmlrDniYjnlYzpnaLnp5LkvKDmjInpkq7nmoRodG1s5YWD57SgCiAnPGJ1dHRvbiBpZD0iYmRsaW5rX2J0biIgY2xhc3M9Im16Zl9uZXdfYnRuIj48L2k+PHNwYW4+56eS5LygPC9zcGFuPjwvYnV0dG9uPic7CmZ1bmN0aW9uIGluc3RhbGxNb2JpbGUoKSB7CiAgICBjb25zb2xlLmluZm8oIiVzIHZlcnNpb246ICVzIE1vYmlsZVZlcuaWueW8j+WuieijhSIsIFRBRywgdmVyc2lvbik7CiAgICBzd2FsSW5zdGFuY2Uuc3dhbEdsb2JhbEFyZ3MgPSB7CiAgICAgICAgaGVpZ2h0QXV0bzogZmFsc2UsCiAgICAgICAgc2Nyb2xsYmFyUGFkZGluZzogZmFsc2UsCiAgICB9OyAvLyDmt7vliqBzd2Fs5Y+C5pWw5Lul6Ziy5q2i5paw54mI55WM6Z2i5LiL55qEYm9keeagt+W8j+eqgeWPmAogICAgc2V0UmVmcmVzaExpc3QoZnVuY3Rpb24gKCkgeyByZXR1cm4gZG9jdW1lbnQubG9jYXRpb24ucmVsb2FkKCk7IH0pOwogICAgc2V0R2V0U2hhcmVGaWxlTGlzdCh1dGlsc19nZXRTaGFyZUZpbGVMaXN0KTsKICAgIHNldEdldFNlbGVjdGVkRmlsZUxpc3QoZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBmaWxlTGlzdCA9ICQoJy5tYWluLWNvbnRhaW5lciA+IC5tdWx0aWZpbGUgPiAuZmlsZS1saXN0JylbMF0uX192dWVfXy5hbGxGaWxlTGlzdDsKICAgICAgICByZXR1cm4gZmlsZUxpc3QuZmlsdGVyKGZ1bmN0aW9uIChpdGVtKSB7IHJldHVybiAhIWl0ZW0uc2VsZWN0ZWQ7IH0pOwogICAgfSk7CiAgICBzZXRHZXRCZHN0b2tlbihmdW5jdGlvbiAoKSB7IHJldHVybiB1bnNhZmVXaW5kb3cubG9jYWxzLmJkc3Rva2VuOyB9KTsKICAgIHNldEdldFVzZXJJZChmdW5jdGlvbiAoKSB7IHJldHVybiB1bnNhZmVXaW5kb3cubG9jYWxzLnVrOyB9KTsKICAgICQoZG9jdW1lbnQpLm9uKCJjbGljayIsICIjYmRsaW5rX2J0biIsIGZ1bmN0aW9uICgpIHsKICAgICAgICBzd2FsSW5zdGFuY2UuaW5wdXRWaWV3KCk7CiAgICB9KTsgLy8g57uR5a6a6L2s5a2Y56eS5Lyg5oyJ6ZKu5LqL5Lu2CiAgICAkKGRvY3VtZW50KS5vbigiY2xpY2siLCAiI2dlbl9iZGxpbmtfYnRuIiwgZnVuY3Rpb24gKCkgewogICAgICAgIHN3YWxJbnN0YW5jZS5nZW5lcmF0ZWJkbGlua1Rhc2sucmVzZXQoKTsKICAgICAgICBzd2FsSW5zdGFuY2UuY2hlY2tVbmZpbmlzaCgpOwogICAgfSk7IC8vIOe7keWumueUn+aIkOenkuS8oOaMiemSruS6i+S7tgogICAgbW9iaWxlUGFnZV9sb2FkZXJfYWRkQnRuKCk7Cn0KZnVuY3Rpb24gbW9iaWxlUGFnZV9sb2FkZXJfYWRkQnRuKCkgewogICAgLy8g6L2u6K+i5re75Yqg5oyJ6ZKuLCDpmLLmraLmlrDniYjpobXpnaLph43lpI1pbml05pe2LCDlsIbmjInpkq7opobnm5YKICAgIHZhciB0YXJnZXQgPSAkKCIubWFpbi1jb250YWluZXIgPiBoZWFkZXIiKTsKICAgIGlmICh0YXJnZXQubGVuZ3RoICYmICEkKCIjYmRsaW5rX2J0biIpLmxlbmd0aCkKICAgICAgICB0YXJnZXQuYXBwZW5kKG1vYmlsZVBhZ2VfbG9hZGVyX2h0bWxCdG5SYXBpZE5ldyk7CiAgICB2YXIgdGFyZ2V0MiA9ICQoIi5tYWluLWNvbnRhaW5lciIpOwogICAgaWYgKHRhcmdldDIubGVuZ3RoICYmICEkKCIjZ2VuX2JkbGlua19idG4iKS5sZW5ndGgpCiAgICAgICAgdGFyZ2V0Mi5hcHBlbmQoJzxzcGFuIGlkPSJnZW5fYmRsaW5rX2J0biIgY2xhc3M9IndhcGZvbnQgbm9uZS1wb2ludGVyIj48c3Bhbj4nKTsKICAgIHNldFRpbWVvdXQobW9iaWxlUGFnZV9sb2FkZXJfYWRkQnRuLCA1MDApOwp9Cgo7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvYmFpZHUvbW9iaWxlU2hhcmVQYWdlL2xvYWRlci50c3gKCgpmdW5jdGlvbiBpbnN0YWxsTW9iaWxlU2hhcmUoKSB7CiAgICBjb25zb2xlLmluZm8oIiVzIHZlcnNpb246ICVzIE1vYmlsZVZlcuaWueW8j+WuieijhSIsIFRBRywgdmVyc2lvbik7CiAgICBzd2FsSW5zdGFuY2Uuc3dhbEdsb2JhbEFyZ3MgPSB7CiAgICAgICAgaGVpZ2h0QXV0bzogZmFsc2UsCiAgICAgICAgc2Nyb2xsYmFyUGFkZGluZzogZmFsc2UsCiAgICB9OyAvLyDmt7vliqBzd2Fs5Y+C5pWw5Lul6Ziy5q2i5paw54mI55WM6Z2i5LiL55qEYm9keeagt+W8j+eqgeWPmAogICAgc2V0UmVmcmVzaExpc3QoZnVuY3Rpb24gKCkgeyByZXR1cm4gZG9jdW1lbnQubG9jYXRpb24ucmVsb2FkKCk7IH0pOwogICAgc2V0R2V0U2hhcmVGaWxlTGlzdChmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGZpbGVMaXN0ID0gJCgnLm1haW4tY29udGFpbmVyID4gLm11bHRpZmlsZSA+IC5maWxlLWxpc3QnKVswXS5fX3Z1ZV9fLmFsbEZpbGVMaXN0OwogICAgICAgIHJldHVybiBBcnJheS5mcm9tKGZpbGVMaXN0KS5tYXAoZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGl0ZW0sIHsKICAgICAgICAgICAgICAgIGNhdGVnb3J5OiBpdGVtLmNhdGVnb3J5ICogMSwKICAgICAgICAgICAgICAgIGZzX2lkOiBpdGVtLmZzX2lkICogMSwKICAgICAgICAgICAgICAgIGlzZGlyOiBpdGVtLmlzZGlyICogMSwKICAgICAgICAgICAgICAgIGxvY2FsX2N0aW1lOiBpdGVtLmxvY2FsX2N0aW1lICogMSwKICAgICAgICAgICAgICAgIGxvY2FsX210aW1lOiBpdGVtLmxvY2FsX210aW1lICogMSwKICAgICAgICAgICAgICAgIHNlcnZlcl9jdGltZTogaXRlbS5zZXJ2ZXJfY3RpbWUgKiAxLAogICAgICAgICAgICAgICAgc2VydmVyX210aW1lOiBpdGVtLnNlcnZlcl9tdGltZSAqIDEsCiAgICAgICAgICAgICAgICBzaXplOiBpdGVtLnNpemUgKiAxLAogICAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgIH0pOwogICAgc2V0R2V0QmRzdG9rZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4gdW5zYWZlV2luZG93LmxvY2Fscy5iZHN0b2tlbjsgfSk7CiAgICBzZXRHZXRVc2VySWQoZnVuY3Rpb24gKCkgeyByZXR1cm4gdW5zYWZlV2luZG93LmxvY2Fscy51azsgfSk7CiAgICAkKGRvY3VtZW50KS5vbigiY2xpY2siLCAiI2dlbl9iZGxpbmtfYnRuIiwgZnVuY3Rpb24gKCkgewogICAgICAgIHN3YWxJbnN0YW5jZS5nZW5lcmF0ZWJkbGlua1Rhc2sucmVzZXQoKTsKICAgICAgICBzd2FsSW5zdGFuY2UuZ2VuZXJhdGViZGxpbmtUYXNrLmlzU2hhcmVQYWdlID0gdHJ1ZTsKICAgICAgICBzd2FsSW5zdGFuY2UuY2hlY2tVbmZpbmlzaCgpOwogICAgfSk7IC8vIOe7keWumueUn+aIkOenkuS8oOaMiemSruS6i+S7tgogICAgbW9iaWxlU2hhcmVQYWdlX2xvYWRlcl9hZGRCdG4oKTsKfQpmdW5jdGlvbiBtb2JpbGVTaGFyZVBhZ2VfbG9hZGVyX2FkZEJ0bigpIHsKICAgIC8vIOi9ruivoua3u+WKoOaMiemSriwg6Ziy5q2i5paw54mI6aG16Z2i6YeN5aSNaW5pdOaXtiwg5bCG5oyJ6ZKu6KaG55uWCiAgICB2YXIgdGFyZ2V0ID0gJCgiLm1haW4tY29udGFpbmVyIik7CiAgICBpZiAodGFyZ2V0Lmxlbmd0aCAmJiAhJCgiI2dlbl9iZGxpbmtfYnRuIikubGVuZ3RoKQogICAgICAgIHRhcmdldC5hcHBlbmQoJzxzcGFuIGlkPSJnZW5fYmRsaW5rX2J0biIgY2xhc3M9IndhcGZvbnQgbm9uZS1wb2ludGVyIG1vYmlsZS1zaGFyZS1wYWdlIj48c3Bhbj4nKTsKICAgIHNldFRpbWVvdXQobW9iaWxlU2hhcmVQYWdlX2xvYWRlcl9hZGRCdG4sIDUwMCk7Cn0KCjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9iYWlkdS9sb2FkZXIudHN4Ci8qCiAqIEBBdXRob3I6IG1lbmd6b25lZmlyZQogKiBATGFzdEVkaXRvcnM6IHRvdXNha2FzcAogKiBARGVzY3JpcHRpb246IOS4u+WHveaVsOWFpeWPowogKi8KCgoKCgoKCgoKCmZ1bmN0aW9uIGxvYWRlckJhaWR1KCkgewogICAgLy8gcmVtb3ZlIGRlYWQga2V5cyBsZWZ0IGJlaGluZCBieSAzLjEuNgogICAgR01fbGlzdFZhbHVlcygpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgewogICAgICAgIGlmIChrZXkubWF0Y2goL15bXiNdW146XSs6OmFjY2Vzc190b2tlbiQvKSkgewogICAgICAgICAgICBHTV9kZWxldGVWYWx1ZShrZXkpOwogICAgICAgIH0KICAgIH0pOwogICAgdmFyIGxvYWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKGxvY1VybC5pbmNsdWRlcyhiYWlkdU5ld1BhZ2UpKSB7CiAgICAgICAgICAgIGluc3RhbGxOZXcoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAobG9jVXJsLmluY2x1ZGVzKGJhaWR1U2hhcmVQYWdlKSkgewogICAgICAgICAgICBpZiAoaXNNb2JpbGVWZXIoKSkgewogICAgICAgICAgICAgICAgaW5zdGFsbE1vYmlsZVNoYXJlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBpbnN0YWxsU2hhcmUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChsb2NVcmwuaW5jbHVkZXMoYmFpZHVTeW5jUGFnZSkpIHsKICAgICAgICAgICAgaW5zdGFsbFN5bmMoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoaXNNb2JpbGVWZXIoKSAmJiBsb2NVcmwuaW5jbHVkZXMoYmFpZHVNb2JpbGVQYWdlKSkgewogICAgICAgICAgICBpbnN0YWxsTW9iaWxlKCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBpbnN0YWxsTGVnYWN5KCk7CiAgICAgICAgfQogICAgICAgIC8vIOi/m+WFpemhtemdouWQjueahOW8ueeql+S7u+WKoQogICAgICAgIHZhciBiZGxpbmsgPSBwYXJzZVF1ZXJ5TGluayhsb2NVcmwpOyAvLyDop6PmnpB1cmzkuK3nmoTnp5LkvKDpk77mjqUKICAgICAgICBpZiAoYmRsaW5rKSB7CiAgICAgICAgICAgIC8vIOino+aekOWIsOenkuS8oOmTvuaOpSwg5by55Ye66L2s5a2Y56qX5Y+jCiAgICAgICAgICAgIHN3YWxJbnN0YW5jZS5pbnB1dFZpZXcoYmRsaW5rKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoIUdNX2dldFZhbHVlKHVwZGF0ZUluZm9WZXIgKyAiX25vX2ZpcnN0IikpCiAgICAgICAgICAgIC8vIOajgOafpeaYr+WQpummluasoei/kOihjCwg6Iul5piv5YiZ5by55Ye65pu05paw5L+h5oGv56qX5Y+jCiAgICAgICAgICAgIHN3YWxJbnN0YW5jZS51cGRhdGVJbmZvKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKHVwZGF0ZUluZm9WZXIgKyAiX25vX2ZpcnN0IiwgdHJ1ZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIC8vIOmihOWFiOe7keWumuWlveaMiemSruS6i+S7tgogICAgICAgICQoZG9jdW1lbnQpLm9uKCJjbGljayIsICIjY29weV9mYWlsX2xpc3QiLCBmdW5jdGlvbiAoYnRuKSB7CiAgICAgICAgICAgIHZhciBsaXN0VGV4dCA9ICIiOwogICAgICAgICAgICBmb3IgKHZhciBfaSA9IDAsIF9hID0gc3dhbEluc3RhbmNlLnBhcnNlUmVzdWx0LmZhaWxMaXN0OyBfaSA8IF9hLmxlbmd0aDsgX2krKykgewogICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBfYVtfaV07CiAgICAgICAgICAgICAgICBsaXN0VGV4dCArPSBpdGVtLnBhdGggKyAiXG4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIEdNX3NldENsaXBib2FyZChsaXN0VGV4dCk7CiAgICAgICAgICAgIGJ0bi50YXJnZXQuaW5uZXJUZXh0ID0gIuWkjeWItuaIkOWKnyI7CiAgICAgICAgfSk7IC8vIOWksei0peaWh+S7tuWIl+ihqOWkjeWItgogICAgICAgICQoZG9jdW1lbnQpLm9uKCJjbGljayIsICIjY29weV9zdWNjZXNzX2xpc3QiLCBmdW5jdGlvbiAoYnRuKSB7CiAgICAgICAgICAgIHZhciBsaXN0VGV4dCA9ICIiOwogICAgICAgICAgICBmb3IgKHZhciBfaSA9IDAsIF9hID0gc3dhbEluc3RhbmNlLnBhcnNlUmVzdWx0LnN1Y2Nlc3NMaXN0OyBfaSA8IF9hLmxlbmd0aDsgX2krKykgewogICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBfYVtfaV07CiAgICAgICAgICAgICAgICBsaXN0VGV4dCArPSBpdGVtLnBhdGggKyAiXG4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIEdNX3NldENsaXBib2FyZChsaXN0VGV4dCk7CiAgICAgICAgICAgIGJ0bi50YXJnZXQuaW5uZXJUZXh0ID0gIuWkjeWItuaIkOWKnyI7CiAgICAgICAgfSk7IC8vIOaIkOWKn+aWh+S7tuWIl+ihqOWkjeWItgogICAgICAgICQoZG9jdW1lbnQpLm9uKCJjbGljayIsICIjY29weV9mYWlsX2JyYW5jaF9saXN0IiwgZnVuY3Rpb24gKGJ0bikgewogICAgICAgICAgICB2YXIgZWxlID0gJChidG4udGFyZ2V0KTsKICAgICAgICAgICAgR01fc2V0Q2xpcGJvYXJkKGVsZQogICAgICAgICAgICAgICAgLnBhcmVudHMoImRldGFpbHMubXpmX2RldGFpbHNfYnJhbmNoIikKICAgICAgICAgICAgICAgIC5uZXh0KClbMF0KICAgICAgICAgICAgICAgIC5pbm5lclRleHQucmVwbGFjZSgvXG5cbi9nLCAiXG4iKSk7CiAgICAgICAgICAgIGJ0bi50YXJnZXQuaW5uZXJUZXh0ID0gIuWkjeWItuaIkOWKnyI7CiAgICAgICAgfSk7IC8vIOWksei0peaWh+S7tuWIhuaUr+WIl+ihqOWkjeWItgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIC8vIOa3u+WKoOayueeMtOaPkuS7tuiPnOWNleaMiemSrgogICAgICAgICAgICBHTV9yZWdpc3Rlck1lbnVDb21tYW5kKCLwn5WuIOeJiOacrOS/oeaBryIsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHN3YWxJbnN0YW5jZS51cGRhdGVJbmZvKGZ1bmN0aW9uICgpIHsgfSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBHTV9yZWdpc3Rlck1lbnVDb21tYW5kKCLimpkg5bel5YW36K6+572uIiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgc3dhbEluc3RhbmNlLnNldHRpbmdWaWV3KCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBHTV9yZWdpc3Rlck1lbnVDb21tYW5kKCLimqHnlJ/miJDnp5LkvKAo6L6T5YWl5paH5Lu26Lev5b6EKSIsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHN3YWxJbnN0YW5jZS5nZW5WaWV3KCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoXykgewogICAgICAgICAgICBjb25zb2xlLmluZm8oIiVzIHZlcnNpb246ICVzIOaPkuS7tuiPnOWNlea3u+WKoOWksei0pSwg5L2/55So55qE5o+S5Lu25LiN5pSv5oyBR01fcmVnaXN0ZXJNZW51Q29tbWFuZCIsIFRBRywgdmVyc2lvbik7CiAgICAgICAgfQogICAgfTsKICAgIC8vIOe7keWumuWFpeWPo+WHveaVsOWIsGRvbeS6i+S7tgogICAgdmFyIGdpdmVVcFRpbWUgPSBEYXRlLm5vdygpICsgMzAwMDA7CiAgICBmdW5jdGlvbiB0cnlMb2FkKCkgewogICAgICAgIGlmIChbImludGVyYWN0aXZlIiwgImNvbXBsZXRlIl0uaW5jbHVkZXMoZG9jdW1lbnQucmVhZHlTdGF0ZSkpIHsKICAgICAgICAgICAgbG9hZCgpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChnaXZlVXBUaW1lID4gRGF0ZS5ub3coKSkgewogICAgICAgICAgICBzZXRUaW1lb3V0KHRyeUxvYWQsIDEwMCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBjb25zb2xlLndhcm4oJ+aPkuS7tua3u+WKoOWksei0pScpOwogICAgICAgIH0KICAgIH0KICAgIHRyeUxvYWQoKTsKfQoKOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2NvbW1vbi9pbmplY3RTdHlsZS50c3gKLyoKICogQEF1dGhvcjogbWVuZ3pvbmVmaXJlCiAqIEBMYXN0RWRpdG9yczogdG91c2FrYXNwCiAqIEBEZXNjcmlwdGlvbjog5qC35byP5rOo5YWl5qih5Z2XCiAqLwoKCgoKCgoKLyoqCiAqIEBkZXNjcmlwdGlvbjog5rOo5YWl6ISa5pys5qC35byPCiAqLwpmdW5jdGlvbiBpbmplY3RTdHlsZSgpIHsKICAgIC8vIOazqOWFpeiHquWumuS5ieagt+W8jwogICAgR01fYWRkU3R5bGUoKGFwcF9kZWZhdWx0KCkpKTsKICAgIEdNX2FkZFN0eWxlKChjc3NfYXBwX2RlZmF1bHQoKSkpOwogICAgaWYgKGlzTW9iaWxlVmVyKCkpIHsKICAgICAgICBHTV9hZGRTdHlsZSgobW9iaWxlX2FwcF9kZWZhdWx0KCkpKTsKICAgIH0KICAgIHZhciBzd2FsVGhlbWVzID0gR01fZ2V0VmFsdWUoInN3YWxUaGVtZXMiKSB8fCAiRGVmYXVsdCI7IC8vIHN3ZWV0QWxlcnTnmoTkuLvpopgoY3NzKSwg6buY6K6k5Li6RGVmYXVsdAogICAgdmFyIFRoZW1lc0NzcyA9IEdNX2dldFZhbHVlKCIiICsgc3dhbENzc1ZlciArIHN3YWxUaGVtZXMpOyAvLyDku47nvJPlrZjojrflj5bpnZ7pu5jorqTkuLvpopjnmoRjc3Pku6PnoIEKICAgIGlmIChUaGVtZXNDc3MpIHsKICAgICAgICBHTV9hZGRTdHlsZShUaGVtZXNDc3MpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgZ2V0VGhlbWVzQ3NzKHN3YWxUaGVtZXMpOyAvLyDmnKrmib7liLDnvJPlrZgsIGZhbGxiYWNr5Yiw5LiL6L29Y3Nz5Luj56CBCiAgICAgICAgcmV0dXJuOwogICAgfQogICAgbG9hZGVyQmFpZHUoKTsKfQovKioKICogQGRlc2NyaXB0aW9uOiDkuIvovb3lubbms6jlhaXlr7nlupTkuLvpopjnmoRjc3PmoLflvI/ku6PnoIEsIOS8muWwhmNzc+S7o+eggee8k+WtmOacrOWcsAogKiBAcGFyYW0ge3N0cmluZ30gc3dhbFRoZW1lcyDkuLvpopjljIXlkI0KICovCmZ1bmN0aW9uIGdldFRoZW1lc0Nzcyhzd2FsVGhlbWVzKSB7CiAgICBhamF4KHsKICAgICAgICB1cmw6IGV4dENzc1VybFtzd2FsVGhlbWVzXSwKICAgICAgICBtZXRob2Q6ICJHRVQiLAogICAgfSwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICB2YXIgVGhlbWVzQ3NzID0gZGF0YS5yZXNwb25zZVRleHQ7CiAgICAgICAgaWYgKFRoZW1lc0Nzcy5sZW5ndGggPCAxMDApIHsKICAgICAgICAgICAgc2hvd0FsZXJ0KGFwcEVycm9yLlN3YWxDc3NJbnZhbGlkICsKICAgICAgICAgICAgICAgICgiXG5cdTk1MTlcdThCRUZcdTY1NzBcdTYzNkU6IiArIHN3YWxUaGVtZXMgKyAiIEludmFsaWRDc3M6XG4iICsgVGhlbWVzQ3NzKSk7CiAgICAgICAgICAgIEdNX3NldFZhbHVlKCJzd2FsVGhlbWVzIiwgIkRlZmF1bHQiKTsKICAgICAgICAgICAgbG9hZGVyQmFpZHUoKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0gLy8g6L+U5ZueZGF0YeaVsOaNrumVv+W6pui/h+Wwjywg5Yik5a6a5Li65peg5pWI5qC35byP5Luj56CBCiAgICAgICAgR01fc2V0VmFsdWUoIiIgKyBzd2FsQ3NzVmVyICsgc3dhbFRoZW1lcywgVGhlbWVzQ3NzKTsgLy8g57yT5a2YY3Nz5Luj56CBCiAgICAgICAgR01fYWRkU3R5bGUoVGhlbWVzQ3NzKTsgLy8g5rOo5YWlY3NzCiAgICAgICAgbG9hZGVyQmFpZHUoKTsKICAgIH0sIGZ1bmN0aW9uIChzdGF0dXNDb2RlKSB7CiAgICAgICAgc2hvd0FsZXJ0KGFwcEVycm9yLlN3YWxDc3NFcnJSZXEgKyAoIiMiICsgc3RhdHVzQ29kZSkpOwogICAgICAgIEdNX3NldFZhbHVlKCJzd2FsVGhlbWVzIiwgIkRlZmF1bHQiKTsKICAgICAgICBsb2FkZXJCYWlkdSgpOwogICAgfSk7Cn0KCjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiBleHRlcm5hbCAiQmFzZTY0Igpjb25zdCBleHRlcm5hbF9CYXNlNjRfbmFtZXNwYWNlT2JqZWN0ID0gQmFzZTY0Owo7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvYXBwLnRzeAoKCi8qKgogKiBAZGVzY3JpcHRpb246IOS4u+WHveaVsOWFpeWPowogKi8KZnVuY3Rpb24gYXBwX2FwcCgpIHsKICAgIGV4dGVybmFsX0Jhc2U2NF9uYW1lc3BhY2VPYmplY3QuQmFzZTY0LmV4dGVuZFN0cmluZygpOwogICAgaW5qZWN0U3R5bGUoKTsKfQpmdW5jdGlvbiBhY3F1aXJlQWNjZXNzVG9rZW4oKSB7CiAgICBpZiAoZG9jdW1lbnQubG9jYXRpb24ucGF0aG5hbWUgPT09ICIvb2F1dGgvMi4wL2xvZ2luX3N1Y2Nlc3MiKSB7CiAgICAgICAgdmFyIHJlcXVlc3QgPSBHTV9nZXRWYWx1ZSgiYWNjZXNzVG9rZW5SZXF1ZXN0Iik7CiAgICAgICAgaWYgKHJlcXVlc3Quc3RhcnRzV2l0aCgicmVxdWVzdDoiKSkgewogICAgICAgICAgICB2YXIgcmVxdWVzdElkID0gcmVxdWVzdC5zdWJzdHJpbmcoOCk7CiAgICAgICAgICAgIHZhciBtYXRjaCA9IGRvY3VtZW50LmxvY2F0aW9uLmhhc2gubWF0Y2goLyZhY2Nlc3NfdG9rZW49KFteID0mXSspJi8pOwogICAgICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCJhY2Nlc3NUb2tlblJlcXVlc3QiLCAiYWNjZXNzVG9rZW46IiArIHJlcXVlc3RJZCArICI6IiArIG1hdGNoWzFdKTsKICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbygiYWNjZXNzLXRva2VuID0gIiArIG1hdGNoWzFdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQovLyDlub/lkYrmi6bmiKrmj5Lku7bkvJrlr7zoh7TohJrmnKzmiqXplJnot7Plh7osIOe9kemhteWNoeatuywg5pWF5Yqg5YWl5byC5bi45aSE55CGCnRyeSB7CiAgICBpZiAoZG9jdW1lbnQubG9jYXRpb24uaG9zdCA9PT0gIm9wZW5hcGkuYmFpZHUuY29tIikgewogICAgICAgIGFjcXVpcmVBY2Nlc3NUb2tlbigpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgYXBwX2FwcCgpOwogICAgfQp9CmNhdGNoIChlcnJvcikgewogICAgY29uc29sZS5sb2coZXJyb3IpOwp9Cgp9KSgpOwoKLyoqKioqKi8gfSkoKQo7
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement