17 lines
416 KiB
HTML
17 lines
416 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="de"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover">
|
|
<title>Wohnung 3D</title>
|
|
<style>html,body{margin:0;height:100%;background:#1b1b19;overflow:hidden}iframe{position:fixed;inset:0;width:100%;height:100%;border:0;display:block}</style>
|
|
</head><body>
|
|
<script>
|
|
(function(){
|
|
var D = "PCFET0NUWVBFIGh0bWw+CjxodG1sPgo8aGVhZD4KICA8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CiAgPHRpdGxlPldvaG51bmcg4oCTIDNEIE1pbmlhdHVyPC90aXRsZT4KICA8c3R5bGU+CiAgICAqIHsgbWFyZ2luOiAwOyBwYWRkaW5nOiAwOyBib3gtc2l6aW5nOiBib3JkZXItYm94OyB9CiAgICBib2R5IHsgYmFja2dyb3VuZDogIzFiMWIxOTsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IG1pbi1oZWlnaHQ6IDEwMHZoOyBmb250LWZhbWlseTogLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCBzYW5zLXNlcmlmOyB9CiAgICAjX19idW5kbGVyX2xvYWRpbmcgeyBwb3NpdGlvbjogZml4ZWQ7IGJvdHRvbTogMjBweDsgcmlnaHQ6IDIwcHg7IGZvbnQ6IDEzcHgvMS40IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgc2Fucy1zZXJpZjsgY29sb3I6ICM2NjY7IGJhY2tncm91bmQ6ICNmZmY7IHBhZGRpbmc6IDhweCAxNHB4OyBib3JkZXItcmFkaXVzOiA4cHg7IGJveC1zaGFkb3c6IDAgMXB4IDRweCByZ2JhKDAsMCwwLDAuMTIpOyB6LWluZGV4OiAxMDAwMDsgfQogICAgI19fYnVuZGxlcl90aHVtYm5haWwgeyBwb3NpdGlvbjogZml4ZWQ7IGluc2V0OiAwOyB3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDAlOyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgYmFja2dyb3VuZDogIzFiMWIxOTsgei1pbmRleDogOTk5OTsgfQogICAgI19fYnVuZGxlcl90aHVtYm5haWwgc3ZnIHsgd2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTsgb2JqZWN0LWZpdDogY29udGFpbjsgfQogICAgI19fYnVuZGxlcl9wbGFjZWhvbGRlciB7IGNvbG9yOiAjOTk5OyBmb250LXNpemU6IDE0cHg7IH0KICA8L3N0eWxlPgogIDxub3NjcmlwdD4KICAgIDxzdHlsZT4jX19idW5kbGVyX2xvYWRpbmcgeyBkaXNwbGF5OiBub25lOyB9PC9zdHlsZT4KICAgIDxkaXYgc3R5bGU9InBvc2l0aW9uOmZpeGVkO2JvdHRvbToxMnB4O2xlZnQ6MTJweDtmb250OjEzcHgvMS40IC1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LHNhbnMtc2VyaWY7Y29sb3I6Izk5OTtiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsMC45KTtwYWRkaW5nOjZweCAxMnB4O2JvcmRlci1yYWRpdXM6NnB4O2JveC1zaGFkb3c6MCAxcHggNHB4IHJnYmEoMCwwLDAsMC4wOCk7ei1pbmRleDoxMDAwMDsiPgogICAgICBUaGlzIHBhZ2UgcmVxdWlyZXMgSmF2YVNjcmlwdCB0byBkaXNwbGF5LgogICAgPC9kaXY+CiAgPC9ub3NjcmlwdD4KPC9oZWFkPgo8Ym9keT4KICA8ZGl2IGlkPSJfX2J1bmRsZXJfdGh1bWJuYWlsIj48c3ZnIHZpZXdCb3g9IjAgMCAxMjAgMTIwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxyZWN0IHdpZHRoPSIxMjAiIGhlaWdodD0iMTIwIiBmaWxsPSIjMWIxYjE5Ij48L3JlY3Q+PHJlY3QgeD0iNDYiIHk9IjI2IiB3aWR0aD0iMjgiIGhlaWdodD0iNjgiIHJ4PSIxMCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZTllNmRlIiBzdHJva2Utd2lkdGg9IjQiPjwvcmVjdD48Y2lyY2xlIGN4PSI2MCIgY3k9IjQyIiByPSI1IiBmaWxsPSIjZTU0ODRkIj48L2NpcmNsZT48Y2lyY2xlIGN4PSI2MCIgY3k9IjYyIiByPSI3IiBmaWxsPSJub25lIiBzdHJva2U9IiNlOWU2ZGUiIHN0cm9rZS13aWR0aD0iNCI+PC9jaXJjbGU+PC9zdmc+PC9kaXY+CiAgPGRpdiBpZD0iX19idW5kbGVyX2xvYWRpbmciPlVucGFja2luZy4uLjwvZGl2PgoKICA8c2NyaXB0PgogICAgCmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBhc3luYyBmdW5jdGlvbigpIHsKICBjb25zdCBsb2FkaW5nID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ19fYnVuZGxlcl9sb2FkaW5nJyk7CiAgZnVuY3Rpb24gc2V0U3RhdHVzKG1zZykgeyBpZiAobG9hZGluZykgbG9hZGluZy50ZXh0Q29udGVudCA9IG1zZzsgfQoKICBjb25zdCBGT05UX01JTUUgPSAvXihmb250Wy9dfGFwcGxpY2F0aW9uWy9dKHgtKT9mb250LXxhcHBsaWNhdGlvblsvXXZuZFwubXMtZm9udG9iamVjdCkvaTsKICBjb25zdCBNSU1FX1RPS0VOID0gL15bXHcuKy1dK1svXVtcdy4rLV0rJC87CiAgZnVuY3Rpb24gdG9CYXNlNjQoYnl0ZXMpIHsKICAgIGxldCBiaW4gPSAnJzsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpICs9IDB4ODAwMCkgewogICAgICBiaW4gKz0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBieXRlcy5zdWJhcnJheShpLCBpICsgMHg4MDAwKSk7CiAgICB9CiAgICByZXR1cm4gYnRvYShiaW4pOwogIH0KCiAgLy8gRXJyb3Igc2luayBwZXJzaXN0cyBhY3Jvc3MgcmVwbGFjZVdpdGggc2luY2UgaXQncyBvbiB3aW5kb3csIG5vdCB0aGUgRE9NLgogIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGZ1bmN0aW9uKGUpIHsKICAgIC8vIEZhaWxlZCByZXNvdXJjZSBsb2FkcyAoQ1NQLWJsb2NrZWQgbGlua3MsIHNjcmlwdHMsIGltYWdlcykgZmlyZSBwbGFpbgogICAgLy8gZXZlbnRzIGF0IHRoZSBlbGVtZW50IOKAlCB3YXJuIG9ubHk7IHJlYWwgSlMgZXJyb3JzIGNhcnJ5IG1lc3NhZ2UvZXJyb3IuCiAgICBpZiAoIWUubWVzc2FnZSAmJiAhZS5lcnJvciAmJiBlLnRhcmdldCAmJiBlLnRhcmdldCAhPT0gd2luZG93KSB7CiAgICAgIGNvbnNvbGUud2FybignW2J1bmRsZV0gcmVzb3VyY2UgZmFpbGVkIHRvIGxvYWQ6JywKICAgICAgICBlLnRhcmdldC50YWdOYW1lLCBTdHJpbmcoZS50YXJnZXQuc3JjIHx8IGUudGFyZ2V0LmhyZWYgfHwgJycpKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgdmFyIHAgPSBkb2N1bWVudC5ib2R5IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKICAgIHZhciBkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ19fYnVuZGxlcl9lcnInKSB8fCBwLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKTsKICAgIGQuaWQgPSAnX19idW5kbGVyX2Vycic7CiAgICBkLnN0eWxlLmNzc1RleHQgPSAncG9zaXRpb246Zml4ZWQ7Ym90dG9tOjEycHg7bGVmdDoxMnB4O3JpZ2h0OjEycHg7Zm9udDoxMnB4LzEuNCB1aS1tb25vc3BhY2UsbW9ub3NwYWNlO2JhY2tncm91bmQ6IzJhMTIxNTtjb2xvcjojZmY4YTgwO3BhZGRpbmc6MTBweCAxNHB4O2JvcmRlci1yYWRpdXM6OHB4O2JvcmRlcjoxcHggc29saWQgIzVjMmIyZTt6LWluZGV4Ojk5OTk5O3doaXRlLXNwYWNlOnByZS13cmFwO21heC1oZWlnaHQ6NDB2aDtvdmVyZmxvdzphdXRvJzsKICAgIGQudGV4dENvbnRlbnQgPSAoZC50ZXh0Q29udGVudCA/IGQudGV4dENvbnRlbnQgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKDEwKSA6ICcnKSArCiAgICAgICdbYnVuZGxlXSAnICsgKGUubWVzc2FnZSB8fCBlLnR5cGUpICsKICAgICAgKGUuZmlsZW5hbWUgPyAnICgnICsgZS5maWxlbmFtZS5zbGljZSgwLCA2MCkgKyAnOicgKyBlLmxpbmVubyArICcpJyA6ICcnKTsKICB9LCB0cnVlKTsKCiAgdHJ5IHsKICAgIGNvbnN0IG1hbmlmZXN0RWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdzY3JpcHRbdHlwZT0iX19idW5kbGVyL21hbmlmZXN0Il0nKTsKICAgIGNvbnN0IHRlbXBsYXRlRWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdzY3JpcHRbdHlwZT0iX19idW5kbGVyL3RlbXBsYXRlIl0nKTsKICAgIGlmICghbWFuaWZlc3RFbCB8fCAhdGVtcGxhdGVFbCkgewogICAgICBzZXRTdGF0dXMoJ0Vycm9yOiBtaXNzaW5nIGJ1bmRsZSBkYXRhJyk7CiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tidW5kbGVyXSBNaXNzaW5nIHNjcmlwdCB0YWdzIOKAlCBtYW5pZmVzdEVsOicsICEhbWFuaWZlc3RFbCwgJ3RlbXBsYXRlRWw6JywgISF0ZW1wbGF0ZUVsKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGNvbnN0IG1hbmlmZXN0ID0gSlNPTi5wYXJzZShtYW5pZmVzdEVsLnRleHRDb250ZW50KTsKICAgIGxldCB0ZW1wbGF0ZSA9IEpTT04ucGFyc2UodGVtcGxhdGVFbC50ZXh0Q29udGVudCk7CgogICAgLy8gTmVzdGVkIHBhZ2UgYnVuZGxlcyAoaWZyYW1lIHRhcmdldHMpLiBFYWNoIHNoaXBzIE9OQ0UsIGluIHRoZSBST09UCiAgICAvLyBkb2N1bWVudCdzIG1hbmlmZXN0OyBmcmFtZSBzcmNzIGNhcnJ5IGFuIGFib3V0OmJsYW5rIzx1dWlkPiBtYXJrZXIKICAgIC8vIGluc3RlYWQgb2YgYSBzdWJzdGl0dXRhYmxlIHV1aWQuIEV2ZXJ5IGRvY3VtZW50IG1pbnRzIHRoZSBibG9icyBmb3IKICAgIC8vIGl0cyBPV04gZnJhbWVzIOKAlCBmcm9tIGxvY2FsIHRleHQgYXQgdGhlIHJvb3QsIG9yIHRleHQgb2J0YWluZWQgZnJvbQogICAgLy8gaXRzIERJUkVDVCBwYXJlbnQgb3ZlciB0aGUgcmVsYXkgcHJvdG9jb2wgYmVsb3cg4oCUIHNvIGVhY2ggZnJhbWUKICAgIC8vIG5hdmlnYXRpb24gc3RheXMgc2FtZS1vcmlnaW4gd2l0aCBpdHMgaW5pdGlhdG9yIGFuZCBhIGRlZHVwZWQgcGFnZQogICAgLy8gbG9hZHMgYXQgYW55IGRlcHRoIG9uIGFueSBob3N0LCBpbmNsdWRpbmcgYSBmaWxlOi8vIGRvd25sb2FkJ3MKICAgIC8vIG9wYXF1ZSBvcmlnaW5zICh3aGVyZSBhIGJsb2IgbWludGVkIGJ5IG9uZSBkb2N1bWVudCBjYW5ub3QgYmUKICAgIC8vIG5hdmlnYXRlZCB0byBieSBhbm90aGVyKS4KICAgIGNvbnN0IHBhZ2VPcmRlckVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcignc2NyaXB0W3R5cGU9Il9fYnVuZGxlci9wYWdlX29yZGVyIl0nKTsKICAgIGNvbnN0IHBhZ2VPcmRlciA9IHBhZ2VPcmRlckVsID8gSlNPTi5wYXJzZShwYWdlT3JkZXJFbC50ZXh0Q29udGVudCkgOiBbXTsKICAgIGNvbnN0IHBhZ2VTZXQgPSBuZXcgU2V0KHBhZ2VPcmRlcik7CiAgICBjb25zdCBwYWdlVGV4dHMgPSB7fTsKCiAgICAvLyDilIDilIAgTmVzdGVkLXBhZ2UgdGV4dCBwcm90b2NvbCAocGFyZW50LWNoYWluIHJlbGF5KSDilIDilIAKICAgIC8vIFBhZ2UgYnVuZGxlcyBzaGlwIG9uY2UsIGluIHRoZSBST09UIGRvY3VtZW50J3MgbWFuaWZlc3QuIEV2ZXJ5CiAgICAvLyBkb2N1bWVudCBtaW50cyB0aGUgYmxvYnMgZm9yIGl0cyBPV04gZnJhbWVzLCBvYnRhaW5pbmcgcGFnZSB0ZXh0CiAgICAvLyB0aHJvdWdoIGEgc3RyaWN0IHBhcmVudC1jaGFpbiByZWxheTogYSBkb2N1bWVudCBvbmx5IGV2ZXIgU0VORFMgdG8KICAgIC8vIGl0cyBkaXJlY3QgcGFyZW50ICh3aGljaCwgZm9yIGV2ZXJ5IGRvY3VtZW50IHRoZSBwdWJsaXNoZXIncyBvd24KICAgIC8vIHJ1bnRpbWUgbWludGVkLCBpcyBhbm90aGVyIHB1Ymxpc2hlciBkb2N1bWVudCkgYW5kIG9ubHkgQUNDRVBUUwogICAgLy8gdGV4dCBmcm9tIHRoYXQgZGlyZWN0IHBhcmVudDsgcmVxdWVzdHMgZnJvbSBiZWxvdyBhcmUgaG9ub3JlZCBvbmx5CiAgICAvLyBmb3IgdGhlIGRvY3VtZW50J3Mgb3duIGNoaWxkIGZyYW1lcywgYW5kIHRoZSBST09UIG5ldmVyIHNlbmRzCiAgICAvLyB1cHdhcmQgYXQgYWxsLiBUaGF0IGxhc3QgcnVsZSBpcyBsb2FkLWJlYXJpbmc6IHRoZSBhcnRpZmFjdCBob3N0J3MKICAgIC8vIGZyYW1lLWFuY2VzdG9ycyBhbGxvd3MgY2xhdWRlLmFpIChhbmQgZnJpZW5kcykgdG8gZnJhbWUgYW4KICAgIC8vIGFydGlmYWN0LCBzbyB3aW5kb3cudG9wIGNhbiBiZSBhIEZPUkVJR04gZG9jdW1lbnQg4oCUIGEgdG9wLWFkZHJlc3NlZAogICAgLy8gcHJvdG9jb2wgd291bGQgaGFuZCBwYWdlIHV1aWRzIHRvIHRoYXQgYW5jZXN0b3IgYW5kIGFjY2VwdCBmb3JnZWQKICAgIC8vICJwYWdlIHRleHQiIGZyb20gaXQsIG1pbnRpbmcgYXR0YWNrZXIgSFRNTCBhcyBhbiBhcnRpZmFjdC1vcmlnaW4KICAgIC8vIGJsb2IgZG9jdW1lbnQuIFRoZSBjaGFpbiBuZXZlciB0b3VjaGVzIHRoZSBhbmNlc3RvcjogcmVxdWVzdHMgc3RvcAogICAgLy8gYXQgdGhlIHJvb3QsIHJlcGxpZXMgYXJlIG9yaWdpbi1hZGRyZXNzZWQgcGVyIGhvcCAobmV2ZXIgJyonIHdoZW4KICAgIC8vIGFuIG9yaWdpbiBleGlzdHMpLCBhbmQgYm90aCBkaXJlY3Rpb25zIGFyZSBvcmlnaW4tZ2F0ZWQgKG9uIGh0dHBzCiAgICAvLyBhIGZvcmVpZ24gc2VuZGVyJ3Mgb3JpZ2luIGNhbiBuZXZlciBlcXVhbCB0aGlzIGRvY3VtZW50J3M7IGluCiAgICAvLyBvcGFxdWUgY29udGV4dHMg4oCUIGZpbGU6Ly8g4oCUIGV2ZXJ5dGhpbmcgc2VyaWFsaXplcyBhcyAnbnVsbCcsIHdoZXJlCiAgICAvLyBhbiBlbWJlZGRlZCBFWFRFUk5BTCBmcmFtZSBzdGlsbCBmYWlscyB0aGUgZ2F0ZSBieSBjYXJyeWluZyBpdHMKICAgIC8vIG93biByZWFsIG9yaWdpbiwgYW5kIGEgc2FuZGJveGVkIGNoaWxkIG9mIHN1Y2ggYSBmcmFtZSBpcyBleGNsdWRlZAogICAgLy8gYnkgdGhlIG93bi1jaGlsZC1mcmFtZXMgY2hlY2sgcGx1cyB1dWlkIHVuZ3Vlc3NhYmlsaXR5KS4gU2hhcGUgaXMKICAgIC8vIGRlbnktYnktZGVmYXVsdDogb25lIHJlcXVlc3QgZm9ybSwgb25lIHJlcGx5IGZvcm0sIG5vIGVycm9yCiAgICAvLyByZXBsaWVzLgogICAgLy8gd2luZG93Lm9yaWdpbiBpcyB0aGUgU0VSSUFMSVpFRCBTRUNVUklUWSBvcmlnaW4gKCdudWxsJyBpbiBvcGFxdWUKICAgIC8vIGNvbnRleHRzIHN1Y2ggYXMgYSBzYW5kYm94ZWQgcHJldmlldyBpZnJhbWUpIOKAlCBsb2NhdGlvbi5vcmlnaW4gaXMKICAgIC8vIGNvbXB1dGVkIGZyb20gdGhlIFVSTCBhbmQgc3RheXMgJ2h0dHBzOi8v4oCmJyBldmVuIHdoZW4gdGhlIGRvY3VtZW50CiAgICAvLyBpcyBzYW5kYm94ZWQsIHdoaWNoIHdvdWxkIG1pc2dhdGUgZXZlcnkgb3BhcXVlIGNoYWluLgogICAgY29uc3QgT1dOX1RBUkdFVCA9IC9eaHR0cHM/OlsvXVsvXS8udGVzdCh3aW5kb3cub3JpZ2luIHx8ICcnKQogICAgICA/IHdpbmRvdy5vcmlnaW4KICAgICAgOiAnKic7CiAgICBmdW5jdGlvbiB0cnVzdGVkT3JpZ2luKGUpIHsKICAgICAgaWYgKGUub3JpZ2luID09PSB3aW5kb3cub3JpZ2luKSByZXR1cm4gdHJ1ZTsgLy8gaHR0cHMgY2hhaW5zOyBvcGFxdWU9PW9wYXF1ZQogICAgICAvLyBmaWxlOi8vIHRyZWVzOiBDaHJvbWUgc2VyaWFsaXplcyB0aGUgZmlsZSBkb2N1bWVudCdzIG9yaWdpbiBhcwogICAgICAvLyAnZmlsZTovLycgd2hpbGUgdGhlIGJsb2I6IGRvY3VtZW50cyBpdCBtaW50cyBzZXJpYWxpemUgYXMgJ251bGwnLAogICAgICAvLyBzbyB0aGUgdHdvIGxlZ2l0aW1hdGUgc2hhcGVzIGNhbiBuZXZlciBzdHJpbmctbWF0Y2gg4oCUIGFjY2VwdCB0aGUKICAgICAgLy8gcGFpciBpbiBib3RoIGRpcmVjdGlvbnMuIGh0dHBzIG9yaWdpbnMgbmV2ZXIgc2VyaWFsaXplIGFzIGVpdGhlciwKICAgICAgLy8gYW5kIHNlbmRlciBpZGVudGl0eSAob3duIGNoaWxkIGZyYW1lIC8gZGlyZWN0IHBhcmVudCkgaXMgY2hlY2tlZAogICAgICAvLyBzZXBhcmF0ZWx5LgogICAgICByZXR1cm4gKAogICAgICAgIChlLm9yaWdpbiA9PT0gJ251bGwnICYmCiAgICAgICAgICAod2luZG93Lm9yaWdpbiA9PT0gJ2ZpbGU6Ly8nIHx8CiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCA9PT0gJ2ZpbGU6JykpIHx8CiAgICAgICAgKC9eZmlsZTovLnRlc3QoZS5vcmlnaW4pICYmIHdpbmRvdy5vcmlnaW4gPT09ICdudWxsJykKICAgICAgKTsKICAgIH0KICAgIC8vIE5vbi1lbXB0eSBvbmx5IGluIHRoZSByb290IGRvY3VtZW50IChuZXN0ZWQgYnVuZGxlcyBzaGlwIGFuIGVtcHR5CiAgICAvLyBpc2xhbmQpLCBzbyBpdCBkb3VibGVzIGFzIHRoZSByb290IG1hcmtlcjogdGhlIHJvb3QgYW5zd2VycyBmcm9tCiAgICAvLyBsb2NhbCB0ZXh0IGFuZCB0cmVhdHMgYSBtaXNzIGFzIGF1dGhvcml0YXRpdmUg4oCUIG5ldmVyIHJlbGF5aW5nIHRvCiAgICAvLyBpdHMgKHBvc3NpYmx5IGZvcmVpZ24pIHBhcmVudC4KICAgIGNvbnN0IGlzUGFnZVJvb3QgPSBwYWdlT3JkZXIubGVuZ3RoID4gMDsKICAgIGNvbnN0IGJsb2JVcmxzID0ge307CiAgICBjb25zdCByZXNvdXJjZUJsb2JzID0ge307CiAgICBjb25zdCBVVUlEX1NIQVBFID0gL15bMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXsxMn0kLzsKICAgIGNvbnN0IHBlbmRpbmdGcmFtZXMgPSB7fTsgLy8gdXVpZCAtPiBbe2VsLCBmcmFnfV0gYXdhaXRpbmcgdGV4dCBmb3Igb3duIGZyYW1lcwogICAgY29uc3QgcGVuZGluZ1JlbGF5cyA9IHt9OyAvLyB1dWlkIC0+IFtjaGlsZFdpbmRvd10gYXdhaXRpbmcgdGV4dCB0byBwYXNzIGRvd24KICAgIGZ1bmN0aW9uIG1vdW50UGFnZShlbCwgZnJhZywgdGV4dCkgewogICAgICBjb25zdCBwYWdlQmxvYiA9IG5ldyBCbG9iKFt0ZXh0XSwgeyB0eXBlOiAndGV4dC9odG1sJyB9KTsKICAgICAgY29uc3QgdSA9IFVSTC5jcmVhdGVPYmplY3RVUkwocGFnZUJsb2IpOwogICAgICByZXNvdXJjZUJsb2JzW3VdID0gcGFnZUJsb2I7CiAgICAgIGVsLnNyYyA9IHUgKyBmcmFnOwogICAgfQogICAgZnVuY3Rpb24gZGVsaXZlclBhZ2UodXVpZCwgdGV4dCkgewogICAgICBjb25zdCBmcmFtZXMgPSBwZW5kaW5nRnJhbWVzW3V1aWRdOwogICAgICBkZWxldGUgcGVuZGluZ0ZyYW1lc1t1dWlkXTsKICAgICAgaWYgKGZyYW1lcykgZm9yIChjb25zdCBmIG9mIGZyYW1lcykgbW91bnRQYWdlKGYuZWwsIGYuZnJhZywgdGV4dCk7CiAgICAgIGNvbnN0IHJlbGF5cyA9IHBlbmRpbmdSZWxheXNbdXVpZF07CiAgICAgIGRlbGV0ZSBwZW5kaW5nUmVsYXlzW3V1aWRdOwogICAgICBpZiAocmVsYXlzKSB7CiAgICAgICAgZm9yIChjb25zdCBjdyBvZiByZWxheXMpIHsKICAgICAgICAgIHRyeSB7IGN3LnBvc3RNZXNzYWdlKHsgX19idW5kbGVyX3BhZ2U6IHV1aWQsIF9fYnVuZGxlcl90ZXh0OiB0ZXh0IH0sIE9XTl9UQVJHRVQpOyB9IGNhdGNoIChlcnIpIHsgLyogZ29uZSAqLyB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBvd25GcmFtZVdpbmRvd3MoKSB7CiAgICAgIGNvbnN0IG91dCA9IFtdOwogICAgICBmb3IgKGNvbnN0IGYgb2YgQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpZnJhbWUnKSkpIHsKICAgICAgICB0cnkgeyBpZiAoZi5jb250ZW50V2luZG93KSBvdXQucHVzaChmLmNvbnRlbnRXaW5kb3cpOyB9IGNhdGNoIChlcnIpIHsgLyogZGV0YWNoZWQgKi8gfQogICAgICB9CiAgICAgIHJldHVybiBvdXQ7CiAgICB9CiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGZ1bmN0aW9uIChlKSB7CiAgICAgIGNvbnN0IGQgPSBlLmRhdGE7CiAgICAgIGlmICghZCB8fCB0eXBlb2YgZCAhPT0gJ29iamVjdCcgfHwgIWUuc291cmNlKSByZXR1cm47CiAgICAgIC8vIE9yaWdpbiBnYXRlIGZpcnN0OyB0aGUgc3RydWN0dXJhbCBjaGVja3MgYmVsb3cgKG93bi1jaGlsZC1mcmFtZXMKICAgICAgLy8gZm9yIHJlcXVlc3RzLCBkaXJlY3QtcGFyZW50ICsgc29saWNpdGVkLXV1aWQgZm9yIHJlcGxpZXMsIHRoZQogICAgICAvLyByb290J3MgbmV2ZXItcmVsYXkgcnVsZSkgYXJlIHdoYXQgaG9sZCBpbiBmdWxseSBvcGFxdWUgY2hhaW5zCiAgICAgIC8vIHdoZXJlIG9yaWdpbiBzdHJpbmdzIGNhbid0IGRpc2NyaW1pbmF0ZSDigJQgYSBzYW5kYm94ZWQgcm9vdCdzCiAgICAgIC8vIEZPUkVJR04gd3JhcHBlciBzdGlsbCBmYWlscyBhbGwgdGhyZWUgZXZlbiB0aG91Z2ggYm90aCBzZXJpYWxpemUKICAgICAgLy8gYXMgcmVhbC12cy0nbnVsbCcgcmF0aGVyIHRoYW4gbWF0Y2hpbmcuCiAgICAgIGlmICghdHJ1c3RlZE9yaWdpbihlKSkgcmV0dXJuOwogICAgICBpZiAodHlwZW9mIGQuX19idW5kbGVyX25lZWQgPT09ICdzdHJpbmcnICYmIFVVSURfU0hBUEUudGVzdChkLl9fYnVuZGxlcl9uZWVkKSkgewogICAgICAgIC8vIFJlcXVlc3RzIGFyZSBob25vcmVkIG9ubHkgZm9yIHRoaXMgZG9jdW1lbnQncyBvd24gY2hpbGQgZnJhbWVzLgogICAgICAgIGlmIChvd25GcmFtZVdpbmRvd3MoKS5pbmRleE9mKGUuc291cmNlKSA8IDApIHJldHVybjsKICAgICAgICBjb25zdCB1dWlkID0gZC5fX2J1bmRsZXJfbmVlZDsKICAgICAgICBjb25zdCB0ZXh0ID0gcGFnZVRleHRzW3V1aWRdOwogICAgICAgIGlmICh0eXBlb2YgdGV4dCA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgIHRyeSB7IGUuc291cmNlLnBvc3RNZXNzYWdlKHsgX19idW5kbGVyX3BhZ2U6IHV1aWQsIF9fYnVuZGxlcl90ZXh0OiB0ZXh0IH0sIE9XTl9UQVJHRVQpOyB9IGNhdGNoIChlcnIpIHsgLyogZ29uZSAqLyB9CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmIChpc1BhZ2VSb290IHx8IHdpbmRvdy5wYXJlbnQgPT09IHdpbmRvdykgcmV0dXJuOyAvLyBhdXRob3JpdGF0aXZlIG1pc3MKICAgICAgICBjb25zdCB3YWl0aW5nID0gcGVuZGluZ1JlbGF5c1t1dWlkXTsKICAgICAgICBpZiAod2FpdGluZykgewogICAgICAgICAgaWYgKHdhaXRpbmcuaW5kZXhPZihlLnNvdXJjZSkgPCAwKSB3YWl0aW5nLnB1c2goZS5zb3VyY2UpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAvLyBOZXZlci1hbnN3ZXJlZCB1dWlkcyB3b3VsZCBvdGhlcndpc2UgYWNjdW11bGF0ZSBmb3JldmVyIHVuZGVyIGEKICAgICAgICAvLyByZXF1ZXN0IHNwcmF5OyBwYXN0IHRoZSBjYXAgKGZhciBhYm92ZSBhbnkgcmVhbCBwYWdlIGNvdW50KSBuZXcKICAgICAgICAvLyByZWxheXMgYXJlIGRyb3BwZWQgcmF0aGVyIHRoYW4gcmVtZW1iZXJlZC4KICAgICAgICBpZiAoT2JqZWN0LmtleXMocGVuZGluZ1JlbGF5cykubGVuZ3RoID49IDEyOCkgcmV0dXJuOwogICAgICAgIHBlbmRpbmdSZWxheXNbdXVpZF0gPSBbZS5zb3VyY2VdOwogICAgICAgIHdpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2UoeyBfX2J1bmRsZXJfbmVlZDogdXVpZCB9LCBPV05fVEFSR0VUKTsKICAgICAgfSBlbHNlIGlmICgKICAgICAgICB0eXBlb2YgZC5fX2J1bmRsZXJfcGFnZSA9PT0gJ3N0cmluZycgJiYKICAgICAgICBVVUlEX1NIQVBFLnRlc3QoZC5fX2J1bmRsZXJfcGFnZSkgJiYKICAgICAgICB0eXBlb2YgZC5fX2J1bmRsZXJfdGV4dCA9PT0gJ3N0cmluZycKICAgICAgKSB7CiAgICAgICAgLy8gVGhlIHNoYXBlIHRlc3QgaXMgbG9hZC1iZWFyaW5nIGJleW9uZCB0aWRpbmVzczogdGhlIHNvbGljaXRlZAogICAgICAgIC8vIGNoZWNrIGJlbG93IHVzZXMgdGhlIGluIG9wZXJhdG9yLCB3aGljaCBtYXRjaGVzIHByb3RvdHlwZSBrZXlzCiAgICAgICAgLy8gKCdfX3Byb3RvX18nLCAnY29uc3RydWN0b3InKSDigJQgYW4gdW5zaGFwZWQga2V5IHdvdWxkIHJlYWNoCiAgICAgICAgLy8gZGVsaXZlclBhZ2UgYW5kIHRocm93LCBwYWludGluZyB0aGUgZXJyb3IgYmFubmVyLgogICAgICAgIC8vIFRleHQgaXMgYWNjZXB0ZWQgb25seSBmcm9tIHRoZSBkaXJlY3QgcGFyZW50IOKAlCB0aGUgZG9jdW1lbnQKICAgICAgICAvLyB0aGF0IG1pbnRlZCB0aGlzIG9uZS4KICAgICAgICBpZiAoZS5zb3VyY2UgIT09IHdpbmRvdy5wYXJlbnQgfHwgd2luZG93LnBhcmVudCA9PT0gd2luZG93KSByZXR1cm47CiAgICAgICAgaWYgKCEoZC5fX2J1bmRsZXJfcGFnZSBpbiBwZW5kaW5nRnJhbWVzKSAmJiAhKGQuX19idW5kbGVyX3BhZ2UgaW4gcGVuZGluZ1JlbGF5cykpIHJldHVybjsKICAgICAgICBkZWxpdmVyUGFnZShkLl9fYnVuZGxlcl9wYWdlLCBkLl9fYnVuZGxlcl90ZXh0KTsKICAgICAgfQogICAgfSk7CgogICAgY29uc3QgdXVpZHMgPSBPYmplY3Qua2V5cyhtYW5pZmVzdCk7CiAgICBzZXRTdGF0dXMoJ1VucGFja2luZyAnICsgdXVpZHMubGVuZ3RoICsgJyBhc3NldHMuLi4nKTsKCiAgICBhd2FpdCBQcm9taXNlLmFsbCh1dWlkcy5tYXAoYXN5bmMgKHV1aWQpID0+IHsKICAgICAgY29uc3QgZW50cnkgPSBtYW5pZmVzdFt1dWlkXTsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCBiaW5hcnlTdHIgPSBhdG9iKGVudHJ5LmRhdGEpOwogICAgICAgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYmluYXJ5U3RyLmxlbmd0aCk7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiaW5hcnlTdHIubGVuZ3RoOyBpKyspIGJ5dGVzW2ldID0gYmluYXJ5U3RyLmNoYXJDb2RlQXQoaSk7CgogICAgICAgIGxldCBmaW5hbEJ5dGVzID0gYnl0ZXM7CiAgICAgICAgaWYgKGVudHJ5LmNvbXByZXNzZWQpIHsKICAgICAgICAgIGlmICh0eXBlb2YgRGVjb21wcmVzc2lvblN0cmVhbSAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgY29uc3QgZHMgPSBuZXcgRGVjb21wcmVzc2lvblN0cmVhbSgnZ3ppcCcpOwogICAgICAgICAgICBjb25zdCB3cml0ZXIgPSBkcy53cml0YWJsZS5nZXRXcml0ZXIoKTsKICAgICAgICAgICAgY29uc3QgcmVhZGVyID0gZHMucmVhZGFibGUuZ2V0UmVhZGVyKCk7CiAgICAgICAgICAgIHdyaXRlci53cml0ZShieXRlcyk7CiAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOwogICAgICAgICAgICBjb25zdCBjaHVua3MgPSBbXTsKICAgICAgICAgICAgbGV0IHRvdGFsTGVuID0gMDsKICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpOwogICAgICAgICAgICAgIGlmIChkb25lKSBicmVhazsKICAgICAgICAgICAgICBjaHVua3MucHVzaCh2YWx1ZSk7CiAgICAgICAgICAgICAgdG90YWxMZW4gKz0gdmFsdWUubGVuZ3RoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZpbmFsQnl0ZXMgPSBuZXcgVWludDhBcnJheSh0b3RhbExlbik7CiAgICAgICAgICAgIGxldCBvZmZzZXQgPSAwOwogICAgICAgICAgICBmb3IgKGNvbnN0IGNodW5rIG9mIGNodW5rcykgeyBmaW5hbEJ5dGVzLnNldChjaHVuaywgb2Zmc2V0KTsgb2Zmc2V0ICs9IGNodW5rLmxlbmd0aDsgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS53YXJuKCdEZWNvbXByZXNzaW9uU3RyZWFtIG5vdCBhdmFpbGFibGUsIGFzc2V0ICcgKyB1dWlkICsgJyBtYXkgbm90IHJlbmRlcicpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKHBhZ2VTZXQuaGFzKHV1aWQpKSB7CiAgICAgICAgICBwYWdlVGV4dHNbdXVpZF0gPSBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUoZmluYWxCeXRlcyk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmIChGT05UX01JTUUudGVzdChlbnRyeS5taW1lKSAmJiBNSU1FX1RPS0VOLnRlc3QoZW50cnkubWltZSkpIHsKICAgICAgICAgIC8vIFN0cmljdCBhcnRpZmFjdCBob3N0cyBhbGxvdyBmb250LXNyYyBkYXRhOiBidXQgbm90IGJsb2I6LgogICAgICAgICAgYmxvYlVybHNbdXVpZF0gPSAnZGF0YTonICsgZW50cnkubWltZSArICc7YmFzZTY0LCcgKwogICAgICAgICAgICAoZW50cnkuY29tcHJlc3NlZCA/IHRvQmFzZTY0KGZpbmFsQnl0ZXMpIDogZW50cnkuZGF0YSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbZmluYWxCeXRlc10sIHsgdHlwZTogZW50cnkubWltZSB9KTsKICAgICAgICAgIGJsb2JVcmxzW3V1aWRdID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTsKICAgICAgICAgIHJlc291cmNlQmxvYnNbYmxvYlVybHNbdXVpZF1dID0gYmxvYjsKICAgICAgICB9CiAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBkZWNvZGUgYXNzZXQgJyArIHV1aWQgKyAnOicsIGVycik7CiAgICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtdLCB7IHR5cGU6IGVudHJ5Lm1pbWUgfSk7CiAgICAgICAgYmxvYlVybHNbdXVpZF0gPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpOwogICAgICAgIHJlc291cmNlQmxvYnNbYmxvYlVybHNbdXVpZF1dID0gYmxvYjsKICAgICAgfQogICAgfSkpOwoKICAgIGNvbnN0IGV4dFJlc0VsID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcignc2NyaXB0W3R5cGU9Il9fYnVuZGxlci9leHRfcmVzb3VyY2VzIl0nKTsKICAgIGNvbnN0IGV4dFJlc291cmNlcyA9IGV4dFJlc0VsID8gSlNPTi5wYXJzZShleHRSZXNFbC50ZXh0Q29udGVudCkgOiBbXTsKICAgIGNvbnN0IHJlc291cmNlTWFwID0ge307CiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGV4dFJlc291cmNlcykgewogICAgICBpZiAoYmxvYlVybHNbZW50cnkudXVpZF0pIHJlc291cmNlTWFwW2VudHJ5LmlkXSA9IGJsb2JVcmxzW2VudHJ5LnV1aWRdOwogICAgfQoKICAgIC8vIEFydGlmYWN0LWhvc3QgQ1NQIChjb25uZWN0LXNyYyAnc2VsZicpIHJlZnVzZXMgZmV0Y2goKSBvZiBibG9iOiBVUkxzIOKAlAogICAgLy8gY29uc3VtZXJzIHJlYWQgdGhlc2UgQmxvYnMgZGlyZWN0bHkuIFN1cnZpdmVzIHRoZSBzd2FwIGxpa2UgdGhlIGVycm9yIHNpbmsuCiAgICB3aW5kb3cuX19yZXNvdXJjZUJsb2JzID0gcmVzb3VyY2VCbG9iczsKCiAgICBzZXRTdGF0dXMoJ1JlbmRlcmluZy4uLicpOwogICAgLy8gUGFnZSB1dWlkcyBoYXZlIG5vIGJsb2IgaGVyZSDigJQgdGhleSByaWRlIGluc2lkZSBhYm91dDpibGFuayM8dXVpZD4KICAgIC8vIGZyYW1lIG1hcmtlcnMgdGhlIHBhc3MgYmVsb3cgcmVzb2x2ZXMgYWZ0ZXIgdGhlIHN3YXAuCiAgICBmb3IgKGNvbnN0IHV1aWQgb2YgdXVpZHMpIHsKICAgICAgaWYgKHBhZ2VTZXQuaGFzKHV1aWQpKSBjb250aW51ZTsKICAgICAgdGVtcGxhdGUgPSB0ZW1wbGF0ZS5zcGxpdCh1dWlkKS5qb2luKGJsb2JVcmxzW3V1aWRdKTsKICAgIH0KCiAgICAvLyBTdHJpcCBpbnRlZ3JpdHkgKyBjcm9zc29yaWdpbiDigJQgYmxvYiBVUkxzIGZyb20gYSBmaWxlOi8vIGRvY3VtZW50IGluaGVyaXQKICAgIC8vIGEgbnVsbCBvcmlnaW4sIHNvIGNyb3Nzb3JpZ2luIGZvcmNlcyBhIENPUlMgZmV0Y2ggdGhhdCBTUkkgdGhlbiByZWplY3RzLgogICAgLy8gVGhlIG1hbmlmZXN0IGJ5dGVzIGFyZSBvdXJzOyBTUkkgcHJvdGVjdHMgYWdhaW5zdCBDRE4gY29tcHJvbWlzZSwgbm90IHRoaXMuCiAgICB0ZW1wbGF0ZSA9IHRlbXBsYXRlLnJlcGxhY2UoL1xzK2ludGVncml0eT0iW14iXSoiL2dpLCAnJykucmVwbGFjZSgvXHMrY3Jvc3NvcmlnaW49IlteIl0qIi9naSwgJycpOwoKICAgIGNvbnN0IHJlc291cmNlU2NyaXB0ID0gJzxzY3JpcHQ+d2luZG93Ll9fcmVzb3VyY2VzID0gJyArCiAgICAgIEpTT04uc3RyaW5naWZ5KHJlc291cmNlTWFwKS5yZXBsYWNlKC88XC8vZywgJzxcXC8nKSArCiAgICAgICc7PC8nICsgJ3NjcmlwdD4nOwogICAgLy8gSW5qZWN0IGFmdGVyIDxoZWFkPiBzbyB0aGUgRE9DVFlQRSBzdGF5cyBmaXJzdDsgcHJlcGVuZGluZyB0aGUgc2NyaXB0CiAgICAvLyB3b3VsZCBwdXNoIHRoZSBwYXJzZXIgaW50byBxdWlya3MgbW9kZS4gRE9NUGFyc2VyIGFsd2F5cyBlbWl0cyBhIDxoZWFkPgogICAgLy8gKHN5bnRoZXNpemluZyBvbmUgaWYgdGhlIHNvdXJjZSBIVE1MIG9taXR0ZWQgaXQpIGJ1dCBtYXkgY2FycnkKICAgIC8vIGF0dHJpYnV0ZXMgdGhyb3VnaCwgc28gbWF0Y2ggdGhlIGZ1bGwgb3BlbmluZyB0YWcuIHNsaWNlKCkgcmF0aGVyIHRoYW4KICAgIC8vIHJlcGxhY2UoKSBrZWVwcyB1cyBjbGVhciBvZiAkLXBhdHRlcm4gc3Vic3RpdHV0aW9uIGluIHJlc291cmNlU2NyaXB0LgogICAgY29uc3QgaGVhZE9wZW4gPSB0ZW1wbGF0ZS5tYXRjaCgvPGhlYWRbXj5dKj4vaSk7CiAgICBpZiAoaGVhZE9wZW4pIHsKICAgICAgY29uc3QgaSA9IGhlYWRPcGVuLmluZGV4ICsgaGVhZE9wZW5bMF0ubGVuZ3RoOwogICAgICB0ZW1wbGF0ZSA9IHRlbXBsYXRlLnNsaWNlKDAsIGkpICsgcmVzb3VyY2VTY3JpcHQgKyB0ZW1wbGF0ZS5zbGljZShpKTsKICAgIH0KCiAgICAvLyBQYXJzZSB0aGUgdGVtcGxhdGUgYW5kIHN3YXAgdGhlIHJvb3QgZWxlbWVudC4gU2NyaXB0cyBpbnNlcnRlZCB2aWEKICAgIC8vIERPTVBhcnNlci9yZXBsYWNlV2l0aCBhcmUgaW5lcnQgcGVyIHNwZWMg4oCUIHJlLWNyZWF0ZSBlYWNoIHdpdGgKICAgIC8vIGNyZWF0ZUVsZW1lbnQgc28gdGhleSBleGVjdXRlLCBhd2FpdGluZyBvbmxvYWQgZm9yIHNyYyBzY3JpcHRzIHRvCiAgICAvLyBwcmVzZXJ2ZSBvcmRlcmluZyAoUmVhY3QgYmVmb3JlIFJlYWN0RE9NIGJlZm9yZSBCYWJlbCBiZWZvcmUgdGV4dC9iYWJlbCkuCiAgICBjb25zdCBkb2MgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKHRlbXBsYXRlLCAndGV4dC9odG1sJyk7CiAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQucmVwbGFjZVdpdGgoZG9jLmRvY3VtZW50RWxlbWVudCk7CgogICAgLy8gUmVzb2x2ZSBwYWdlLWZyYW1lIG1hcmtlcnM6IG1pbnQgdGhpcyBkb2N1bWVudCdzIG93biBibG9iIGZvciBlYWNoCiAgICAvLyBmcmFtZWQgcGFnZSDigJQgZnJvbSBsb2NhbCB0ZXh0IHdoZW4gdGhpcyBpcyB0aGUgcm9vdCwgb3RoZXJ3aXNlIGJ5CiAgICAvLyBhc2tpbmcgdGhlIGRpcmVjdCBwYXJlbnQgb3ZlciB0aGUgcmVsYXkgcHJvdG9jb2wgYWJvdmUuIEFuCiAgICAvLyB1bmFuc3dlcmVkIHJlcXVlc3QgbGVhdmVzIHRoZSBmcmFtZSBvbiBhYm91dDpibGFuaywgdGhlIHNhbWUKICAgIC8vIGRlZ3JhZGVkIHN0YXRlIGFzIGEgcmVmdXNlZCBlbWJlZC4KICAgIHsKICAgICAgY29uc3QgTUFSS0VSID0gL15hYm91dDpibGFuayMoWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17MTJ9KSgjLiopPyQvOwogICAgICBjb25zdCBuZWVkZWQgPSBbXTsKICAgICAgZm9yIChjb25zdCBlbCBvZiBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lmcmFtZScpKSkgewogICAgICAgIGNvbnN0IG0gPSBNQVJLRVIuZXhlYyhlbC5nZXRBdHRyaWJ1dGUoJ3NyYycpIHx8ICcnKTsKICAgICAgICBpZiAoIW0pIGNvbnRpbnVlOwogICAgICAgIGNvbnN0IHRleHQgPSBwYWdlVGV4dHNbbVsxXV07CiAgICAgICAgaWYgKHR5cGVvZiB0ZXh0ID09PSAnc3RyaW5nJykgewogICAgICAgICAgbW91bnRQYWdlKGVsLCBtWzJdIHx8ICcnLCB0ZXh0KTsKICAgICAgICB9IGVsc2UgaWYgKHdpbmRvdy5wYXJlbnQgIT09IHdpbmRvdyAmJiAhaXNQYWdlUm9vdCkgewogICAgICAgICAgY29uc3QgaGFkID0gcGVuZGluZ0ZyYW1lc1ttWzFdXTsKICAgICAgICAgIChwZW5kaW5nRnJhbWVzW21bMV1dID0gaGFkIHx8IFtdKS5wdXNoKHsgZWw6IGVsLCBmcmFnOiBtWzJdIHx8ICcnIH0pOwogICAgICAgICAgaWYgKCFoYWQpIG5lZWRlZC5wdXNoKG1bMV0pOwogICAgICAgIH0KICAgICAgfQogICAgICBmb3IgKGNvbnN0IHV1aWQgb2YgbmVlZGVkKSB7CiAgICAgICAgd2luZG93LnBhcmVudC5wb3N0TWVzc2FnZSh7IF9fYnVuZGxlcl9uZWVkOiB1dWlkIH0sIE9XTl9UQVJHRVQpOwogICAgICB9CiAgICB9CgogICAgY29uc3QgZGVhZCA9IEFycmF5LmZyb20oZG9jdW1lbnQuc2NyaXB0cyk7CiAgICBmb3IgKGNvbnN0IG9sZCBvZiBkZWFkKSB7CiAgICAgIGNvbnN0IHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsKICAgICAgZm9yIChjb25zdCBhIG9mIG9sZC5hdHRyaWJ1dGVzKSBzLnNldEF0dHJpYnV0ZShhLm5hbWUsIGEudmFsdWUpOwogICAgICBzLnRleHRDb250ZW50ID0gb2xkLnRleHRDb250ZW50OwogICAgICAvLyB0ZXh0L2JhYmVsIHNjcmlwdHMgd2l0aCBhIHNyYzogcmVhZCBhbmQgaW5saW5lLiB0cmFuc2Zvcm1TY3JpcHRUYWdzCiAgICAgIC8vIGRvZXMgWEhSIGFnYWluc3QgdGhlIHNyYywgYnV0IGJsb2I6bnVsbC8gZnJvbSBhIGZpbGU6Ly8gb3JpZ2luIGlzCiAgICAgIC8vIHNpbGVudGx5IGRyb3BwZWQuIElubGluaW5nIG1ha2VzIGl0IGEgcGxhaW4gaW5saW5lIGJhYmVsIHNjcmlwdCwKICAgICAgLy8gd2hpY2ggdHJhbnNmb3JtU2NyaXB0VGFncyBoYW5kbGVzIHVuY29uZGl0aW9uYWxseS4KICAgICAgaWYgKChzLnR5cGUgPT09ICd0ZXh0L2JhYmVsJyB8fCBzLnR5cGUgPT09ICd0ZXh0L2pzeCcpICYmIHMuc3JjKSB7CiAgICAgICAgY29uc3QgcHJlID0gcmVzb3VyY2VCbG9ic1tzLnNyYy5zcGxpdCgnIycpWzBdXTsKICAgICAgICBzLnRleHRDb250ZW50ID0gcHJlID8gYXdhaXQgcHJlLnRleHQoKSA6IGF3YWl0IChhd2FpdCBmZXRjaChzLnNyYykpLnRleHQoKTsKICAgICAgICBzLnJlbW92ZUF0dHJpYnV0ZSgnc3JjJyk7CiAgICAgIH0KICAgICAgY29uc3QgcCA9IHMuc3JjID8gbmV3IFByb21pc2UoZnVuY3Rpb24ocikgeyBzLm9ubG9hZCA9IHMub25lcnJvciA9IHI7IH0pIDogbnVsbDsKICAgICAgb2xkLnJlcGxhY2VXaXRoKHMpOwogICAgICBpZiAocCkgYXdhaXQgcDsKICAgIH0KICAgIC8vIEJhYmVsIHN0YW5kYWxvbmUgYXV0by10cmFuc2Zvcm1zIHR5cGU9dGV4dC9iYWJlbCBvbiBET01Db250ZW50TG9hZGVkLAogICAgLy8gd2hpY2ggZmlyZWQgYmVmb3JlIHdlIHN3YXBwZWQgdGhlIGRvY3VtZW50LiBUcmlnZ2VyIG1hbnVhbGx5IGlmIHByZXNlbnQuCiAgICBpZiAod2luZG93LkJhYmVsICYmIHR5cGVvZiB3aW5kb3cuQmFiZWwudHJhbnNmb3JtU2NyaXB0VGFncyA9PT0gJ2Z1bmN0aW9uJykgewogICAgICB3aW5kb3cuQmFiZWwudHJhbnNmb3JtU2NyaXB0VGFncygpOwogICAgfQogIH0gY2F0Y2ggKGVycikgewogICAgc2V0U3RhdHVzKCdFcnJvciB1bnBhY2tpbmc6ICcgKyBlcnIubWVzc2FnZSk7CiAgICBjb25zb2xlLmVycm9yKCdCdW5kbGUgdW5wYWNrIGVycm9yOicsIGVycik7CiAgfQp9KTsKCiAgPC9zY3JpcHQ+CgogIDxzY3JpcHQgdHlwZT0iX19idW5kbGVyL21hbmlmZXN0Ij4KeyI2ZjM0MzJkMC0xYmRlLTRlMmUtYmQ4Zi1kYmE4MmEyNTRhOTUiOnsibWltZSI6InRleHQvamF2YXNjcmlwdCIsImNvbXByZXNzZWQiOnRydWUsImRhdGEiOiJINHNJQUFBQUFBQUFFN1U3YTNJYk41UC9mWXFPVXJzY1d1U1FraVhIcHFMa3N4NSt5cFlqMlk2VGZGa0hNOU1rWWMwQVl3QWppbkZjbFR2c251Rzd3djdmbytRa1d3MWducVJzSjV0TlZTd1NhRFM2RzBDL09SckJQeEk5Wk1rY0ZZb1loM3dtcEVJWURrRm1tS0l4Q05vd1pWQ0JqdGwwS3RNRUFzVVdnQ2xtS0l3ZXpmRnFsRjlCdElRRU5aK0ovbzNSQ0E1bHpqRlp3UkhDR1E1VklRUVhNNGhsdm56ako5N0VNc3VsUUdGZ3djMGN6SnhydU9BaUFYbUphcUc0UWUwR3B6ekZFZ1loWlFhMWdVdFVta3NCUWM1bUNMRVVoakJ4RFlWZzB5bkdCcE4rZUdOMEV3Nk9Ieng2QmkvUDd6MDRocHVqRzZPYk4yL0FUZmphekJYaU1CbHF3MmI0RGZ6eCszL0JyU09RMFZ1TURWeHlYS0NDVGNDclhEcEp6REZOSWJDcndyZTZIOTRBaStmRjNISTZRNUFMb1MyQmk3bE1FWFNNQWlmd1BVWVBUa0NoU0ZDaEdvREF3aWlXZ2paRndpV2tmRFkzWE13SWxlV1FnWlpUQXpNbEM1R0Fuck5FTGdZZ1ZjU05aVkxKVkVPUUtEWURJOTM0QUJaenhKUysveXBsTmlCY2l2QU9TN0NjaWY0QUdNUXNROFdBRlVZT3A0cGxtTkFzMGV6NDdtbUlhRjg5QUlXYS80cUVhczVFa25JeEd3QVRDVEJJNUVLa2t0RlNtVVpNZ1prejR3WGxCQkFYU3RGaGVHRXlUV2hPRHg3REpqeDljUUpTd1lPVEF3Z2lMcGhhd2l4OWNiOGZ3djJEMXhBeklhU0JDRXU1SjhDRlJSa3B1ZENvOWdnVExlWnVKeTRNcW5qT3hBeGhLbFZHaEZ5aVdrSW1FMVNDVHBTb0JKNVo2c3BESzA4UmlBL0NwR1F4YzdlTGJsTlArd1dRc1R5RVJ5Sk9pd1RkWFR4K2ZlL3dCZVJjQ0V3SVZjWnlvdkhyT2JMa213RkVPS1czeElRbG9VZ1JWQ0cwdlYzK3dtb3JSaUo4cHJoWndwenBPVm9KYWNPV1lPUU16UndWQkpwbGFORVRXUnZWM2R3QWZjSFRGREltRW5vSi9ZbG5DdUJySFN1ZUd6RExIUGMzSEFzWnl6ZStjZFB2M1I4QVA2VTNKdlVZd0lhVnlzWUVOdWJHNUhveUdoVWl2NWlGc2N4R2R1b2Y0M0Ryems0NEhrVUZUeE0zRmpvdXc3ZDZZOUJGTldKSklvVWVsZGQyZEVxMzlkQi9veVdmc1JkZXNTeFBVWS9lNnV3am1LN2R2SHpBZW5SNjhQallmL2tyZTErTDZETzJmbkR5NHY3ZnMzY1hVN24zaDBGOXVPWFY2aHp2WHp2VkNXem9PYnQxWjJkNDUvN2hqMXY0NnZRMk56dWJlWVR4TmpzeTRvVmF2UDMrOVk4bmo4OE9ONS9lZTNENDZQblJUUDhnWHFwMGREeSt0LzFEZXY4T2wwK2ZQQm85YmducXp4QVRTOVVoSlZsc1Mva2NGK3o0a2JvM1MyL0wrMGNIV1hidy9lSHhYZm45M1pPcnN3ZnhkUEhqZUg1eWVaeXJYK1gyZUh2eE92M3E4dkNIaDJmcHVUaDk4YWRJK2N3YldGTzNvMzdsejY1T0QzNTg4dDN0dTN4enNUbTljL2ZKNDkzZEY0Yy92Q3NXOGZ4VmRMRDhicEd4VTN4MCtqbzVmYm45L09SSTNMbzRuYjUrdUhqMCtQRHVYNmZ1WTVmZEV5ZWloWkUvSGo5N2ZIVHIxYnZOZTRkUHhvZkZnKytTNTArTG8rOGZYckRzY1B2SjQ2T3Z4c2V2ZHNWMGR2dnRkMituZWY3a0ZObjRxeDhlUDl0OGR1dnZJRzdOYy9EVXZaTFRpOHY4d2UySHgyZnorNGMvUlBybDZVTjg5dnJnOE4yam8yMHhmWGZ4M1R2eDZ0ZmpyYmZ4U0Q2UGY5MTg5M2pyMXIyajVQWEQ4WjM1OFdiOFhmMGUzQWYvNSt1UjA0emZlRlg1VXJNWlRrcWxhWllwZnROeUJ5WkNtbUNTNEpRTFRQcnZMN25tRVUrNVdVN21QRWxRZlBoNjVGWjVGSzNGSUZpRyt4dEt4aGRvTnI3NWV0VDJOTnFxV3F0NGY2TUZRQUw1cGtud2ltSjNqN1BVNmtCdWdUYmVDZG1IUk1ZRmVXbmh1d0xWOGh4VGpJMVVRYSsxU2ErLzExNzlIbDQ4UERzK2hnK3dEMnpCdU1jWEttVEpzZ05MdGpXRmZSQzRjS3ZDQjBvV2VWRGpISTNnajkvL1pkK3d0VjV1aFN3TXlLa1ZUd0laa3RselBvOGZZUVlWWjZtMWxnMU1oSUFnTkVRWXl3eWR2d0lqS0RSbUpnVVVSbkhVcGFkUWVRNm5CNC8vK1AxZkpTTEhqa1p6YXExb1lFa3FLZTdlajN2R0tCNFZCclcvSkxTL3YvUmt5dDBlemkrTm1FWTdIU1E0WlVWcVlNUGkzdWk3cFJHTEw3dzNSMHNQejg4aGxxbFVFT0djbkYyaTJmcUtOUUlHQzZZeXlGbU9Db3dVNkZHUjM2YWtZUVl0cXNVY0JlUUtOUXBEM3AxTzVRSk1vWVJoVVlwUUNNTlRpNzdRcUp5cnhHS2pQWTlQN1psd0FRcFpPbHhJbGRLaDBQc2NRSXdFVE02OGs2bFVmTWJGQUpiREltOEl3SG90WE14UmNWUHowU01YbkJ2bjUwakZVUmhtdUJSaHcxZWU4alRWUUVCeUlTQ1NWL1lneU9NRTdzTUJxUkxuSDVMRUt0RnNqY2VYaXhIOU83ZXVHc3hSeWNvWlAvSlFHazJSVDY3enRTR1lZOFoxVHZFUGJNSUZMbUhUVWtRK3NxVmpqUWRPekR3N0JSU1hYRWxCRDh6NlppUU1MV0hPWjNPU0hrc0ZhazArSGVFUjBzeHBQeU5CNFRTMXZyQklmRENnUVNCVHd5aGw4VVVJaHl4dnJHZDJiMEl4RG0vOThmdC9qc01kdXpKbVNpMkJPVWhJcGJ3b2c0YklPdnlvN0hWMEY4ekpPN1pSR2FHeXQ1VnJXTXBDNlFtdzVHMmgzYkZad2VoQkk5cG8zbG91NEUwa3BRbnNMYlNYcm80WVFDQW1tcUlDUHAyaTlmcUpMRG9RQ3JYZytObFJIWHJkQ0lJKzdIOURYa21sdEpZcEtRSTBzQSsvM0tEM05abEwwa2MzM0d2THBlWjBlU2FnTUdXR1grS2VuMG00emxPMm5FQ1V5dmlpSEYzd3hNd25kRTMrclJ5YUk3Rm54eTduNVdETjN3UXVtUXFHVGk4T285a0F2cHlPRWZGMnY0U2xjSFNheXNVRW5QWjM0eC9zdnpFVGwwekQreTQ1cE94U1RnR2drQUwzUEhSWWhreXI3TEZJeTdRd0ZYdktFMzA3djZwb2xzYklyRDFXYlR0TnNScWNzWHdDZDJxZ3FSUm1PR1VaVDVjVEdMSThUM0dvbDlwZ05vQ0RsSXVMcHl3K3Q5L3ZTMUlsRytjNGt3Z3ZIMjBNNEV4RzBzZ0JhQ2IwVUtQaTB5YjdGVU5SWVl3VUZWOHN6NUVwSnVKU0FCVUxLa0UxZ2EzOENyUk1lUUpxRnJGZ2V6d0Erbi9yN2dESWQraTM0WWVLSmJ6UUxaNmFCK2h3N080T29QNW5ITjdkcnREWTl6Q0JMN2ZZMXQydDNiVmk4V3FzTlVmNmFBSmIyK0Z1UjVZTGY2VjJ4K055bkE1N1dGMjFjalJuU2NMRmJBSjM4eXZZMnE3UnhJWFNSSkxYYXgrUjZXUk85dy9ldHpqK2NqcWRybHdxRDg5aWVpYndIb3hpUWxOVVBIRWZLWEh5UTdDVlgvV3ZXZnBUd2pXWmp1Um5lQTh5WnpGNVBEQU9kL2NnbDlaK0RQR1NFa0NkV3kya3djKzQwaWxPUCtOR1oreHE2Ri94N2ZvUms5Z25zRE1lV3ltT3RzTGR2K3NpWDNjN1BuM0I3dXoyVjg1NWg4NTUzT1N3ZFlFYmZKSlJIbXJybmpYZmlCY3BxczlSRWx4b05CTVlyMmlENXB0aktaK0pJVGVZNlltMzdPVVVXUUErWFE1OTlxdzdYWEcxdmROK0FQYm13OWFPUFluYmYvOUozR0hiMCsyS0s0TlhabWk1NkJLNG1IT0RRNTB6MGpPNXdpRzl3bHFPdit6ZHVBRXdMVVJNNHFzU1YwR1V5bWhnN1NFNWJuMHZhR2VSQ2tXdTdjdXprekJXeUF3NmQvSGwyWWxkNVEvY2diS210KzJnajEyR05PaXhuZ2RsNFZ6aEZQWUpjVGxTWmREMkt5TGNWSVV0a3NreUpDVXFrc001VDVPQVZlamlsTWNYUWZWVllTWXZzZnl1MGJ6Z0djckNlRk5MakNpOGxCY05SZ3BGbnM3T2VEeTJxejZRa0VZM2I4SUx5bkNTYWJjV21JblN6V1hHWUpaYnI4cWs2TnhZWTNQQlJpMUJpblRwWEExYVJsVGNCQWdldm5oNjhzb21VZnVVK09KVGppNWpwMldoWXZSKzBKRENDenV1eVNmRU5OR2tFVkZvZm9ucDBpUHpPYlZZa2tjclpudVZYNFVwK1RwS2F1MlIyNXltUzJFeXRRemhRY0ZVZ2dsbzZWSFZaTWRNZ0tCY0lVUUsyWVZkWHAxTHpzdzhKSStsY1h1RXBLZml3dGJBNVJvSElDL0syME00eXdlNzRDS1JpekJuNUErRnVkVG1LV29LT1FNUEFLU2RsemxPb0ZlbXl5Y08vL0JXTW5SaTd3MThSbk1DOVc0VGtCZXd2NzhQUmhWb2t6Nyt2OTdObnYvc2I4SUhpSm1KNXhEUS9mNVFIbk9jTXEzaEJZV0NSK2ZXRThjcmd5TFJRQWZtYjIvelBhakNSby85aWpkZDVLaUNobVdsbDZDa0pBZU9FcVFoTTRiRjgzUHJTZ2J2YmVoSGJPWW9ldkNoczg2NmZ4OTVSWGErVnkyeVgwTlNCNGMrM2IvZjhDQXJ6MGxLMDNvN0ZxUkNZb2w4US9yMStuMFRmdGxiWFJCYTZUMmpLN1lQUFZTcWQrMlcxWm9PdzlaU2Z1YStCTnZla2taNnJlbTJMSHBIemJJQS9NOS9nNDZWVEt2S0FJMnNGQWF1WjRKMjZFaWg5QmYrbE9qOG9qWXZmckRYQnBYUjJ3TWpQb0xlT1NyZEhkeXlrSjRVNGZaQTYyRTZFaXVmZkZXZVdMK01KY2t4dVQ0blhCc1VxSUtlMWNPOUFUZzk2NEJWSWJ5QzZNbm9iYS9mSVhPV1JuK0ZPN2ZzNDl5Vk1OZHc5K0RrWVAyQ1A4M1hMSTFXK0NvUGVQVUZPT2w5TnJnanF2K0paK1hYZDdCcU5BZFdNdnBZV0NjMm1MSlUxeGVZTE53WmFwbGVsbW1uT3VjbFJZeU5SQXpYa0pJTFRZYXVrOFFxRmU1TmNyN2dsNVZVMlMrVURTanRrMkt4TjB3cGp4VGxNdWd3dkdHcEtMZnJmRHJ0dVpJWjF4Z0V5bEZLZFRneTIxWFkzT1RZTHZRc3dUNzRKWHZyb1d5d3Z1L1JsVENsUHJhMndlb29ZUXVuaHl4TnlmOXQ2SDArQlM5K3lnVmcwbStRTXhwUmpkY3Bma3lBVFNrUndjQzZKaXkxWWxTb2k0eEtvOHlRbDFydEJOcklQTWNrckpEVkc1VkYwK1pXTlZkdWpqSjY5d1RQYklicFJNcmNyMDJselB0N3E4c2svUHUvVjU5REdXbFVsMmpYTktBL1ZKOFVVajZ0RWxmcndqazVnTFBGZXl0VFFUKzBGamdJeUF5c096OHlLYzZrZWIrZG5pekY4YjN1R1JKazYyazNHT3RWeGN3cDQ2bXI2TnByOWsvUmc4MG00T0VjNHd0WHJiV1ZUbHZEdkw1b0NGTWxNNTgvSkUraGc0MnNnNmFuVWxVLzF4US9IZTd3bjZKTHpMbFJYTXhJTkhRZ3hGL21YQ1Q0dHZWdEFrMGp1dVpPQjgzNXpuMW1laW5pTW5sVmlkOVo0bWhXT2l3ek5GVytOK2pWWVYrdGh1bEtSck8rQTNjbnB0RThWekpIWlpaQnIwNGU5UVlRelRvMi95ZXJaUVpWOWY2cFRINnVzdXord1ljc1RZT2Y2amVRT1dWcmo3YlhINnlmK0dSOXRWNzVjMGRaT3NXMzd4UmdwU0ZITHB1c0x2RklzUVVYczRPQ2tucHdnWmg3UGNhMDhWNDJuWUhOTTl2blhxT3dYUjBVc0ZLaTFjZ2padGpMc3hNWVFhTFk0bEhHWnRpM0dvRlR0NEhWQnltNnZvRWFoNDRWb3RCemFXejVYa1BNY2xPb2xvNFcyaUJMcUtEQUlFcVp1UEM1dUxBbC9GSlB0TW9WdGlmanpNOEU5Yk5rd25DV2NxWW45azNYWW1kcFBtZmR3Yld5YWdQVi9tNVRYejNuVjVpZWtjWUtubEtna1hFUitKQWh3VXNlWXcwQXYvMEdXd1BZN3E5QlpEM3NweXdQMGRtN2ppWmFBK2c5Q0NlRTU0ZjN6K1hVbkplejdRdlNrRnY1c1FYZ2tKNlJnYVlraERJSDl1MEgxYTZKekx4Yk02aVZXSC92UnR2L3QwZlpQSnB6R2dtNnB0MkQyYjhkRkw2bHBZbmpPU3FkbzgyQ0hkclpZR2QzUUdJY2grT3RBYVV1NmhkcTU4TXl3MEtuRTl3YXdIYTRQWUNkRGhYVlR1NURsNDZ5TjhkUjBuanNZZXRaQm03MUFOWklxcWs0M0J0MlIzdkVzcHllVS91QUs2REVUZDluRktyQlByRjVwME42VFZ6NXNTSi9OSUpuclRySnhOVS85TVZ5NUNzQUM2Ym50c0JrRDMwWU0yMWZOeFZPYk9sZ1VLUHlMVUk4c3dVVlowSjhvVXRMMER5ZHk0TENYZTJENzVrRVZ3RXBRenc2WXZKS2cvbzhIMWJWbWhQYUxSaGZUZTEvQXhoZkpYZVM3WGhuQUZ2aHVOL1J1MFJlODFvY2NZVTJsR2RwRjg5MldPZUtMM0Radmc4N0EvaHFBTHN0QUJLQmV6bWRRNkZKSjZZd1kvazUvOVdhaW1CN3ZIT0hVdHc3ZC9wcklDUE82R2lHNDNBOEhtKzNqODV4Y1lITHZSVUpYZUN5dzdLVithZDUzc0hiOUJocWxtaGRtK25oN2dCdURXQllQNEo2WDFzcTYxeC9mMU9hZXo5RlBhOFRIbzNubVRLQkQxRGFQRXl3UGJhNS8zSER5RFcwZ1ZkT3JqQWN0SkxTVzNmZ1E3K2Q4d0JQUm1pTHBNVEtGWW5WS3RubmoyQUUyMTA0akpGZjR0cVQ5QkZKeVpmN3NDb01OMTZMd3kxclZHcTlsekZudXVGbDFQTzkxVWRQazJldHhRMThINEUrejlGYWdhMXdleFZxSmM2elhaaFZuRmNid2ZWazJGaXE2V1oxN2gzRkZtc3dhUU9Ma29rNHBWTHc5NVRhdDJadHJ3TTRid00rdExXVURtVFRqTkxqQ2hZRG1EZmNRNi9QbWRYL3NBOExHTUY4WmJySXFYUHV1Wkp2M2VONHlvemlWN1hWK1ZDL0M5TzFSVXI2UzM1bUd5UlBYUVNoZ2lrM0hVZ0tRZFpMeGNuWFVSSDAxM0RuUGdUMmxnMDgxYXZValVad2hEN21Xc3lwdWx1RkFndW1ZWW9tcGpEMFd6aW54a0tlcEM2aWJYbGFLeUZmR2FuWjYrR2RQbUxFRnZNOXN5QkZqWUV5R0VSRXFjR3IrSTNyd3hKNWZ6VjJ2VGI0K2xPUjNZZjJzMnRHeEVFVjNyZURnbWIwdVNiT0hZM2czTWpjazBGbXJ1YWN2amxCSjE3dWU2c0NiRXFHSkVrdHRaUk5EaWhGWHJsVjNHaE1weFErWFdCdTdMa3dvRXkrVFUyNFZwWWFVNWt2Z3F4d1NVUlFXQ2NtbkRMcWQrWGZpSjgvRlRPTHdtcjBGUVN5WHg5WExiZWdMVkJLckp6UDVRSUNLNm1GNkRmNkE2ajdPMDl0SG9UQ3dsemhKWmVGOXJNRGNBNk9kbHZmQk85aWFHbzg4WTI4U0w2SFFtMm9YNlJzU1BGcU9TZFQ0bm96YkZCUzQ3RnR5TTVoTTlJMm1yakc1aXI1VW5jQ09WSzY4V0VaSVRYaXBhYUF2ckFqZmRzNnZMRDY0RmlwbFRhcmlUOHJTdkRZSSs2bWkyREtsVGE5TmJJdnFXcDR3R1d0cHdXd2txMTBpczk5S0NmOVdSakZxQWtaZzBCMmxCTHRLME91eVdhMzB5M3llbC9IVFgvTWh0WXBrMjdtUDVKWExXZmhRRjdkQ3ZwME0rOHJtYlZQcGlYM1NGNkZYQjludVZrRy9aVWtsRzlvOFdKb1h4WjZXTlNDbGtuN2tHM3prZTFyQ2p1NnlUc0hsVDlFRGhodG0zRVJMcnRXeTdjUk9ZZ1ptZ05heThYczNJNDN2RmcvME85M01TUmN0ek02Z2NNWnVxSXhqTUE2TUlhSklHaEdJdUZVWGxJZmwvTnUrakNDVzdmSC9UN2NoSzN3MXU3cUx1MFkrSlZ0Qzd3VjJMQ0k2dGxiNGZadVB4UlVha3JKc3E0a1hUcXhVb1Bna0g3V1VWTHRLclQ5NWpUNVNRbFhZVmFraHVmcDhqeG1LVk1CTWQ2L2JodHFqb0o5eDEzR3Jpd3dqS2lKeDhWeDE2MmJ1dW9FUWQ4azZHdkFQdVVDZENPbjBEQTFRN09PMDJ1WHJCcjQ4c293S2dLMFQva20zT29pYWtRSW5tcnFvQ0NQbGpCOEd0cVdldXhHbndOdHJMZnllYkN1YitQektmbWt3N1VhN3R0THMxYkhyU2I2U2VXMGJkSU1EYndwT3pNYjF0M2xjNzJPYlNmK0NMTFhKMyt6WnpQOXZYNm9uT2tLUmovOXh6OFg0ZkRuemRGc0FMMDN2ZlplYXdpU290NnlWVVlxRzJ4Z0g3NlFvczJYcjhpc0EybFkydVBLS2xxelZ6Yk5WbjE0aGVEdkN0Y3dTM1Zqa0NQZkprdXRFYjYxRnB5TnRORWlGMlNQS0k4MzlRNk1IdmpxdkJXVnpmODZuTlZlS2RlbU1xUnZhS3ZuNUN5dTVGZ3paaWl1L2VublR0VVhVWGhkZEk0TkJ6dEZZeGw3UkRtTTFpQXpyYkdtcmZ1RVVmdWl0bXJ0WEg0MTdWcEEzRjlLd09kTW1UYzkySFNrMU9DT3NzMzkxY0FsdFFvYzdpbkZsaUhYOW04Z3cxSmNmZmdXNm04d2daL3Fiei9YdU9pd0FpODN5bW9TMXJZcHRnUm5kRU5Kc0NGM1AwdlNRZGJ2MjZpQ2k3WnRkdkJoczhlbFlxWmlOMk9lVzJZZTdiVmhTT3B0ZnB1bEVmQ3VjRURIU2VGdDRMZTZkaS8vWVpPZTBGL2IwVzVGaXNGdjFZU3pNc2tMUFEreU5hV2NaaWJXM21zQ1gzbGNwd0k3VFMva2V2cCtjdjlMT2RzY001Y0xtNzdpWlZkTW1YYStDWENHMWluVWxQQml0aWhEbVd2NmNaY0crMHVDRkN2UHBFQ1hPdFQwaTBHOFlyRkpsL2IzY3RCc2ZYSHROVUlPdlYrRFRLWExraEd1clpQSlJOV25FeERxc2xMUGEyU1ZacWs3dzExanZ2MFZYTisvZXZjelBsL0NyRjY1TDZYVWhXRFhrOUt1RDM3UmRsM2JENjdaSUFQZUUvWlliRWVMclpqRHQyV3kyTzV5R3IwTitqQnBqVDFJbzVZVHRiWXZwMkVSbXEwd3FsVkxYTHV5WFRRRzcrQ2pVbTFiMWE0d05hbjliSUZVUDZhb2lrRnJxenZYL2FhbjEvR292YkoxT3paMGNzZnZwdmJ3RXFvMGtHMFFHYjF0dUtPOXpLUXBqNmo2NXhadlFpL01UR29MZWxhSFo1VGlya2tMK3RUNHBLOEpVNnc2TjVTazdIMEp4K1ZQTmFJbHRPS21mOWJ0RFYyMVNHejJWNUpNc1ZVdjduY1Z2LzBHNzBGUml2RE9BR2IrYjJULzFybVR1bk9KZnZpNWI2dWZoRDIwQTdZSjMxNUtVV1FSS3JxWHpTblhGTnRCNVhPVFRXVFZVQmRWT1RGcDZqcVN5eVlCNG9JK1doMVpxY3lHU0VySWh2THJQVWtzZkJ5cTBNajcvQXFUWUtkUDYvendiUDF3MUJsZXN3djBubWdZaDl2ajhiajlaeTNzTTIweFc3ZmRobEZCc0FWREoyWUtUU2pUZSsxR2pnY3ZteFhLR2t0S3JWNTFkTkk5UEVobEZQd2tvN2MvRCtyMk9xcWFqL0tVY2R0OU5xaXZzTzNQMmJzZVQyYlN6OEtUbWJUakQ3WjBndFZXLzQ4Nm9mTlR1bTdyMFA5RkQwVEZ0S0tpZk9mTjdjcUhmby80YmIzMlFlTjl1aDk1WDFjV3JRUmZLK1hxQktKaTJqd0JhNnBHczlSTWh3Nm5QWWg2bi9KQXFFSEpqMWJuVW5ZL0Z0cFV4VFlkdXQvM2RYOFpOMmkyUi9iM2Juem9rK3orRi83WEtXZzFRUUFBIn19CiAgPC9zY3JpcHQ+CgogIDxzY3JpcHQgdHlwZT0iX19idW5kbGVyL2V4dF9yZXNvdXJjZXMiPgpbXQogIDwvc2NyaXB0PgoKICA8c2NyaXB0IHR5cGU9Il9fYnVuZGxlci9wYWdlX29yZGVyIj4KW10KICA8L3NjcmlwdD4KCiAgPHNjcmlwdCB0eXBlPSJfX2J1bmRsZXIvdGVtcGxhdGUiPgoiPCFET0NUWVBFIGh0bWw+XG48aHRtbCBsYW5nPVwiZGVcIj48aGVhZD5cbjxtZXRhIGNoYXJzZXQ9XCJ1dGYtOFwiPlxuPHRpdGxlPldvaG51bmcg4oCTIDNEIE1pbmlhdHVyPFx1MDAyRnRpdGxlPlxuPHNjcmlwdCB0eXBlPVwiaW1wb3J0bWFwXCI+XG57XG4gIFwiaW1wb3J0c1wiOiB7XG4gICAgXCJ0aHJlZVwiOiBcImh0dHBzOi8vdW5wa2cuY29tL3RocmVlQDAuMTg0LjAvYnVpbGQvdGhyZWUubW9kdWxlLmpzXCIsXG4gICAgXCJ0aHJlZS9hZGRvbnMvY29udHJvbHMvT3JiaXRDb250cm9scy5qc1wiOiBcImh0dHBzOi8vdW5wa2cuY29tL3RocmVlQDAuMTg0LjAvZXhhbXBsZXMvanNtL2NvbnRyb2xzL09yYml0Q29udHJvbHMuanNcIixcbiAgICBcInRocmVlL2FkZG9ucy9leHBvcnRlcnMvT0JKRXhwb3J0ZXIuanNcIjogXCJodHRwczovL3VucGtnLmNvbS90aHJlZUAwLjE4NC4wL2V4YW1wbGVzL2pzbS9leHBvcnRlcnMvT0JKRXhwb3J0ZXIuanNcIixcbiAgICBcInRocmVlL2FkZG9ucy9leHBvcnRlcnMvR0xURkV4cG9ydGVyLmpzXCI6IFwiaHR0cHM6Ly91bnBrZy5jb20vdGhyZWVAMC4xODQuMC9leGFtcGxlcy9qc20vZXhwb3J0ZXJzL0dMVEZFeHBvcnRlci5qc1wiLFxuICAgIFwidGhyZWUvZXhhbXBsZXMvanNtL1wiOiBcImh0dHBzOi8vdW5wa2cuY29tL3RocmVlQDAuMTg0LjAvZXhhbXBsZXMvanNtL1wiLFxuICAgIFwidGhyZWUvYWRkb25zL1wiOiBcImh0dHBzOi8vdW5wa2cuY29tL3RocmVlQDAuMTg0LjAvZXhhbXBsZXMvanNtL1wiLFxuICAgIFwidGhyZWUtbWVzaC1idmhcIjogXCJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL3RocmVlLW1lc2gtYnZoQDAuOS41L2J1aWxkL2luZGV4Lm1vZHVsZS5qc1wiLFxuICAgIFwidGhyZWUtZ3B1LXBhdGh0cmFjZXJcIjogXCJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL3RocmVlLWdwdS1wYXRodHJhY2VyQDAuMC4yNC9idWlsZC9pbmRleC5tb2R1bGUuanNcIixcbiAgICBcIm44YW9cIjogXCJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL244YW9AMS9kaXN0L044QU8uanNcIixcbiAgICBcInBvc3Rwcm9jZXNzaW5nXCI6IFwiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9wb3N0cHJvY2Vzc2luZ0A2L2J1aWxkL2luZGV4LmpzXCJcbiAgfSxcbiAgXCJpbnRlZ3JpdHlcIjoge1xuICAgIFwiaHR0cHM6Ly91bnBrZy5jb20vdGhyZWVAMC4xODQuMC9idWlsZC90aHJlZS5tb2R1bGUuanNcIjogXCJzaGEzODQtOEZDWjFlVk82aXQ0K3BiZWMyYUR0blRyd2pXWFpMSlJDK01BR0NJUERnc1luVXJsL0UwQTJZbEY4aW9NS0kvSlwiLFxuICAgIFwiaHR0cHM6Ly91bnBrZy5jb20vdGhyZWVAMC4xODQuMC9idWlsZC90aHJlZS5jb3JlLmpzXCI6IFwic2hhMzg0LWR3Mm9vUGV3YUVJckFnbDZvRkRCbW1CV0NFOW9XOUx4UkdjZndaMGhMdkVwcnpvMjAyd1hsN3ZDWUhSbFNuT1RcIixcbiAgICBcImh0dHBzOi8vdW5wa2cuY29tL3RocmVlQDAuMTg0LjAvZXhhbXBsZXMvanNtL2NvbnRyb2xzL09yYml0Q29udHJvbHMuanNcIjogXCJzaGEzODQtNHJ6aU54T0JaS1E2OWkrdytmODlLSjU1VENZcXV3Y2hWYkJ5UXdtYU9lSU9YZE9VMlBMRG4za09mWEh3SUpDOVwiLFxuICAgIFwiaHR0cHM6Ly91bnBrZy5jb20vdGhyZWVAMC4xODQuMC9leGFtcGxlcy9qc20vZXhwb3J0ZXJzL09CSkV4cG9ydGVyLmpzXCI6IFwic2hhMzg0LW5id3RvWkVOSkQzVnErQUNLMEN1R1FkUE11RFdIa2FtQzJLSkQ3MEVWNW5mZzZqUWpmcHBLT2VhMDdZSk4rTjNcIixcbiAgICBcImh0dHBzOi8vdW5wa2cuY29tL3RocmVlQDAuMTg0LjAvZXhhbXBsZXMvanNtL2V4cG9ydGVycy9HTFRGRXhwb3J0ZXIuanNcIjogXCJzaGEzODQtVm9ma3ZwRzZIRVJoRkNZYnNVT0hlTlhCQ3FJRDJuZnFrUXFuVnpFMWpjL29QY3orcUoxM0FEZFhIMDhoRStjUVwiXG4gIH1cbn1cbjxcdTAwMkZzY3JpcHQ+XG48c3R5bGU+XG4gIGh0bWwsYm9keXttYXJnaW46MDtoZWlnaHQ6MTAwJTtiYWNrZ3JvdW5kOiNlZmVjZTY7Zm9udC1mYW1pbHk6SGVsdmV0aWNhLEFyaWFsLHNhbnMtc2VyaWZ9XG4gIHRocmVlLWQtc3RhZ2U6bm90KDpkZWZpbmVkKXt2aXNpYmlsaXR5OmhpZGRlbn1cbiAgI3Jvb21ze3Bvc2l0aW9uOmZpeGVkO2xlZnQ6NTAlO2JvdHRvbToyMnB4O3RyYW5zZm9ybTp0cmFuc2xhdGVYKC01MCUpO2Rpc3BsYXk6ZmxleDtnYXA6NnB4O3BhZGRpbmc6NnB4O2JhY2tncm91bmQ6cmdiYSgyNTAsMjQ4LDI0NCwuODIpO2JhY2tkcm9wLWZpbHRlcjpibHVyKDEwcHgpOy13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOmJsdXIoMTBweCk7Ym9yZGVyLXJhZGl1czo5OTlweDtib3gtc2hhZG93OjAgNnB4IDI0cHggcmdiYSgzMCwyOCwyNCwuMTQpfVxuICAjcm9vbXMgYnV0dG9ue2FwcGVhcmFuY2U6bm9uZTtib3JkZXI6MDtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50O2NvbG9yOiMyZjJkMmE7Zm9udDo1MDAgMTRweC8xIEhlbHZldGljYSxBcmlhbCxzYW5zLXNlcmlmO3BhZGRpbmc6MTFweCAxOHB4O2JvcmRlci1yYWRpdXM6OTk5cHg7Y3Vyc29yOnBvaW50ZXI7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kIC4ycyxjb2xvciAuMnN9XG4gICNyb29tcyBidXR0b246aG92ZXJ7YmFja2dyb3VuZDpyZ2JhKDQ3LDQ1LDQyLC4wOCl9XG4gICNyb29tcyBidXR0b24ub257YmFja2dyb3VuZDojMmYyZDJhO2NvbG9yOiNmN2Y1ZjB9XG4gICNwb3Z7cG9zaXRpb246Zml4ZWQ7bGVmdDo1MCU7dG9wOjE4cHg7dHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLC04cHgpO29wYWNpdHk6MDtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSAuM3MsdHJhbnNmb3JtIC4zcztkaXNwbGF5OmZsZXg7Z2FwOjRweDtwYWRkaW5nOjRweDtiYWNrZ3JvdW5kOnJnYmEoMjUwLDI0OCwyNDQsLjgyKTtiYWNrZHJvcC1maWx0ZXI6Ymx1cigxMHB4KTstd2Via2l0LWJhY2tkcm9wLWZpbHRlcjpibHVyKDEwcHgpO2JvcmRlci1yYWRpdXM6OTk5cHg7Ym94LXNoYWRvdzowIDFweCAycHggcmdiYSgwLDAsMCwuMDYpLDAgNnB4IDIwcHggcmdiYSgwLDAsMCwuMDgpfVxuICAjcG92LnNob3d7b3BhY2l0eToxO3BvaW50ZXItZXZlbnRzOmF1dG87dHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLDApfVxuICAjcG92IGJ1dHRvbnthcHBlYXJhbmNlOm5vbmU7Ym9yZGVyOjA7YmFja2dyb3VuZDp0cmFuc3BhcmVudDtjb2xvcjojMmYyZDJhO2ZvbnQ6NTAwIDEzcHgvMSBIZWx2ZXRpY2EsQXJpYWwsc2Fucy1zZXJpZjtwYWRkaW5nOjlweCAxNHB4O2JvcmRlci1yYWRpdXM6OTk5cHg7Y3Vyc29yOnBvaW50ZXI7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kIC4ycyxjb2xvciAuMnN9XG4gICNwb3YgYnV0dG9uOmhvdmVye2JhY2tncm91bmQ6cmdiYSg0Nyw0NSw0MiwuMDgpfVxuICAjcG92IGJ1dHRvbi5vbntiYWNrZ3JvdW5kOiMyZjJkMmE7Y29sb3I6I2Y3ZjVmMH1cbiAgI2xhbXB7cG9zaXRpb246Zml4ZWQ7bGVmdDo1MCU7Ym90dG9tOjgycHg7dHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLDEwcHgpO29wYWNpdHk6MDtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSAuMzVzLHRyYW5zZm9ybSAuMzVzO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjRweDtwYWRkaW5nOjRweDtib3JkZXItcmFkaXVzOjk5OXB4O2JhY2tncm91bmQ6cmdiYSgyNTAsMjQ4LDI0NCwuODIpO2JhY2tkcm9wLWZpbHRlcjpibHVyKDEwcHgpOy13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOmJsdXIoMTBweCk7Y29sb3I6IzJmMmQyYTtmb250OjUwMCAxNHB4LzEgSGVsdmV0aWNhLEFyaWFsLHNhbnMtc2VyaWY7Ym94LXNoYWRvdzowIDRweCAxOHB4IHJnYmEoMCwwLDAsLjA4KX1cbiAgI2xhbXBUe2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjEwcHg7YXBwZWFyYW5jZTpub25lO2JvcmRlcjowO2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Y29sb3I6aW5oZXJpdDtmb250OmluaGVyaXQ7cGFkZGluZzo3cHggMTRweCA3cHggMTBweDtib3JkZXItcmFkaXVzOjk5OXB4O2N1cnNvcjpwb2ludGVyO3doaXRlLXNwYWNlOm5vd3JhcH1cbiAgI2xhbXBUOmhvdmVye2JhY2tncm91bmQ6cmdiYSg0Nyw0NSw0MiwuMDgpfVxuICAjbGFtcEN0bHtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDoxNHB4O21heC13aWR0aDowO292ZXJmbG93OmhpZGRlbjtvcGFjaXR5OjA7dHJhbnNpdGlvbjptYXgtd2lkdGggLjRzLG9wYWNpdHkgLjNzLHBhZGRpbmcgLjRzO3BhZGRpbmc6MH1cbiAgI2xhbXAub24gI2xhbXBDdGx7bWF4LXdpZHRoOjQyMHB4O29wYWNpdHk6MTtwYWRkaW5nOjAgMTJweCAwIDZweH1cbiAgI2xhbXBTd3tkaXNwbGF5OmZsZXg7Z2FwOjZweH1cbiAgI2xhbXBTdyBidXR0b257YXBwZWFyYW5jZTpub25lO3dpZHRoOjIycHg7aGVpZ2h0OjIycHg7Ym9yZGVyLXJhZGl1czo1MCU7Ym9yZGVyOjJweCBzb2xpZCByZ2JhKDI1MCwyNDgsMjQ0LC45KTtib3gtc2hhZG93OjAgMCAwIDFweCByZ2JhKDQ3LDQ1LDQyLC4xOCk7Y3Vyc29yOnBvaW50ZXI7cGFkZGluZzowfVxuICAjbGFtcFN3IGJ1dHRvbi5zZWx7Ym94LXNoYWRvdzowIDAgMCAycHggIzJmMmQyYX1cbiAgI2xhbXBTd3thbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweDtmb250LXNpemU6MTJweDtjb2xvcjojNmI2NjVlfVxuICAjbGFtcFN3IGlucHV0W3R5cGU9Y29sb3Jde2FwcGVhcmFuY2U6bm9uZTstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTt3aWR0aDoyNnB4O2hlaWdodDoyNnB4O2JvcmRlci1yYWRpdXM6NTAlO2JvcmRlcjoycHggc29saWQgcmdiYSgyNTAsMjQ4LDI0NCwuOSk7Ym94LXNoYWRvdzowIDAgMCAxcHggcmdiYSg0Nyw0NSw0MiwuMjUpO3BhZGRpbmc6MDtjdXJzb3I6cG9pbnRlcjtiYWNrZ3JvdW5kOm5vbmV9XG4gICNsYW1wU3cgaW5wdXRbdHlwZT1jb2xvcl06Oi13ZWJraXQtY29sb3Itc3dhdGNoLXdyYXBwZXJ7cGFkZGluZzowfVxuICAjbGFtcFN3IGlucHV0W3R5cGU9Y29sb3JdOjotd2Via2l0LWNvbG9yLXN3YXRjaHtib3JkZXI6MDtib3JkZXItcmFkaXVzOjUwJX1cbiAgI2xhbXBTdyBpbnB1dFt0eXBlPWNvbG9yXTo6LW1vei1jb2xvci1zd2F0Y2h7Ym9yZGVyOjA7Ym9yZGVyLXJhZGl1czo1MCV9XG4gICNsYW1wRGlte2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweDtmb250LXNpemU6MTJweDtjb2xvcjojNmI2NjVlfVxuICAjbGFtcERpbSBpbnB1dHt3aWR0aDoxMTBweDthY2NlbnQtY29sb3I6IzJmMmQyYX1cbiAgI2xhbXBEaW0gb3V0cHV0e3dpZHRoOjM0cHg7dGV4dC1hbGlnbjpyaWdodDtmb250LXZhcmlhbnQtbnVtZXJpYzp0YWJ1bGFyLW51bXN9XG4gICNsYW1wLnNob3d7b3BhY2l0eToxO3RyYW5zZm9ybTp0cmFuc2xhdGUoLTUwJSwwKTtwb2ludGVyLWV2ZW50czphdXRvfVxuICAjbGFtcCBpe3dpZHRoOjEycHg7aGVpZ2h0OjEycHg7Ym9yZGVyLXJhZGl1czo1MCU7YmFja2dyb3VuZDojYmRiOGFlO3RyYW5zaXRpb246YmFja2dyb3VuZCAuM3MsYm94LXNoYWRvdyAuM3N9XG4gICNwdHtwb3NpdGlvbjpmaXhlZDt0b3A6MThweDtyaWdodDoxOHB4O3BhZGRpbmc6OHB4IDEycHg7Ym9yZGVyLXJhZGl1czo5OTlweDtiYWNrZ3JvdW5kOnJnYmEoMjUwLDI0OCwyNDQsLjgyKTtiYWNrZHJvcC1maWx0ZXI6Ymx1cigxMHB4KTstd2Via2l0LWJhY2tkcm9wLWZpbHRlcjpibHVyKDEwcHgpO2NvbG9yOiMyZjJkMmE7Zm9udDo1MDAgMTJweC8xIHVpLW1vbm9zcGFjZSxNZW5sbyxtb25vc3BhY2U7b3BhY2l0eTowO3RyYW5zaXRpb246b3BhY2l0eSAuM3M7cG9pbnRlci1ldmVudHM6bm9uZX1cbiAgI3B0LnNob3d7b3BhY2l0eToxfVxuICAjcHR7dG9wOjYycHggIWltcG9ydGFudH1cbiAgI3J0e3Bvc2l0aW9uOmZpeGVkO3RvcDoxOHB4O3JpZ2h0OjE4cHg7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6OHB4O2FwcGVhcmFuY2U6bm9uZTtib3JkZXI6MDtwYWRkaW5nOjlweCAxNHB4IDlweCAxMXB4O2JvcmRlci1yYWRpdXM6OTk5cHg7YmFja2dyb3VuZDpyZ2JhKDI1MCwyNDgsMjQ0LC44Mik7YmFja2Ryb3AtZmlsdGVyOmJsdXIoMTBweCk7LXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6Ymx1cigxMHB4KTtjb2xvcjojMmYyZDJhO2ZvbnQ6NTAwIDEzcHgvMSBIZWx2ZXRpY2EsQXJpYWwsc2Fucy1zZXJpZjtjdXJzb3I6cG9pbnRlcjtib3gtc2hhZG93OjAgMXB4IDJweCByZ2JhKDAsMCwwLC4wNiksMCA2cHggMjBweCByZ2JhKDAsMCwwLC4wOCk7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kIC4ycyxjb2xvciAuMnN9XG4gICNydCBpe3dpZHRoOjEwcHg7aGVpZ2h0OjEwcHg7Ym9yZGVyLXJhZGl1czo1MCU7YmFja2dyb3VuZDojYmRiOGFlO3RyYW5zaXRpb246YmFja2dyb3VuZCAuMnN9XG4gICNydC5vbntiYWNrZ3JvdW5kOiMyZjJkMmE7Y29sb3I6I2Y3ZjVmMH1cbiAgI3J0Lm9uIGl7YmFja2dyb3VuZDojN2ZkMDhhfVxuICAjbGFtcC5vbiBpe2JhY2tncm91bmQ6I2ZmYzg2Yjtib3gtc2hhZG93OjAgMCAxMHB4IDNweCByZ2JhKDI1NSwxOTAsOTAsLjYpfVxuICAjbGFtcER7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTBweDthcHBlYXJhbmNlOm5vbmU7Ym9yZGVyOjA7YmFja2dyb3VuZDp0cmFuc3BhcmVudDtjb2xvcjppbmhlcml0O2ZvbnQ6aW5oZXJpdDtwYWRkaW5nOjdweCAxNHB4IDdweCAxMHB4O2JvcmRlci1yYWRpdXM6OTk5cHg7Y3Vyc29yOnBvaW50ZXI7d2hpdGUtc3BhY2U6bm93cmFwfVxuICAjbGFtcEQ6aG92ZXJ7YmFja2dyb3VuZDpyZ2JhKDQ3LDQ1LDQyLC4wOCl9XG4gICN0dkJ7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6OHB4O2FwcGVhcmFuY2U6bm9uZTtib3JkZXI6MDtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50O2NvbG9yOmluaGVyaXQ7Zm9udDppbmhlcml0O3BhZGRpbmc6N3B4IDE0cHggN3B4IDEwcHg7Ym9yZGVyLXJhZGl1czo5OTlweDtjdXJzb3I6cG9pbnRlcjt3aGl0ZS1zcGFjZTpub3dyYXB9XG4gICN0dkI6aG92ZXJ7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4xKX1cbiAgI3R2QiBzdmd7ZmxleDpub25lO3RyYW5zaXRpb246Y29sb3IgLjNzfVxuICAjdHZCYXJ7cG9zaXRpb246Zml4ZWQ7bGVmdDo1MCU7Ym90dG9tOjIycHg7dHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLDEwcHgpO29wYWNpdHk6MDtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSAuNHMsdHJhbnNmb3JtIC40cztkaXNwbGF5OmZsZXg7Z2FwOjRweDtwYWRkaW5nOjRweDtib3JkZXItcmFkaXVzOjk5OXB4O2JhY2tncm91bmQ6cmdiYSgyMCwyMCwxOCwuNTUpO2JhY2tkcm9wLWZpbHRlcjpibHVyKDEycHgpOy13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOmJsdXIoMTJweCk7ei1pbmRleDo2MH1cbiAgI3R2QmFyLnNob3d7b3BhY2l0eToxO3RyYW5zZm9ybTp0cmFuc2xhdGUoLTUwJSwwKTtwb2ludGVyLWV2ZW50czphdXRvfVxuICAjdHZVSXtwb3NpdGlvbjpmaXhlZDtpbnNldDowO3otaW5kZXg6NTU7b3BhY2l0eTowO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5IC41cztmb250LWZhbWlseTpIZWx2ZXRpY2EsQXJpYWwsc2Fucy1zZXJpZjtjb2xvcjojZjJmMWVjO2JhY2tncm91bmQ6IzBiMGMwZTtvdmVyZmxvdzpoaWRkZW59XG4gICN0dlVJLnNob3d7b3BhY2l0eToxO3BvaW50ZXItZXZlbnRzOmF1dG99XG4gICN0dlVJIC50di1oZXJvey0tYTojZTU0ODRkO3Bvc2l0aW9uOmFic29sdXRlO2luc2V0OjA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmQ7Z2FwOjZweDtwYWRkaW5nOjAgY2xhbXAoMjBweCw2dncsODBweCkgY2xhbXAoMTUwcHgsMjJ2aCwyMjBweCk7YmFja2dyb3VuZDpyYWRpYWwtZ3JhZGllbnQoMTIwJSA5MCUgYXQgODUlIDIwJSxjb2xvci1taXgoaW4gb2tsY2gsdmFyKC0tYSkgNTUlLHRyYW5zcGFyZW50KSx0cmFuc3BhcmVudCA2MCUpLGxpbmVhci1ncmFkaWVudCgxODBkZWcsIzBiMGMwZSAwJSwjMTIxMzE2IDEwMCUpO3RyYW5zaXRpb246YmFja2dyb3VuZCAuNXN9XG4gICN0dlVJIC50di1oZXJvIHNtYWxse2ZvbnQtc2l6ZTpjbGFtcCgxMnB4LDEuNHZ3LDE1cHgpO2xldHRlci1zcGFjaW5nOi4wOGVtO3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTtjb2xvcjojYmRiYWIyfVxuICAjdHZVSSAudHYtaGVybyBoMnttYXJnaW46MDtmb250LXdlaWdodDo3MDA7Zm9udC1zaXplOmNsYW1wKDQwcHgsOHZ3LDExMHB4KTtsaW5lLWhlaWdodDoxO2xldHRlci1zcGFjaW5nOi0uMDJlbTt0ZXh0LXdyYXA6YmFsYW5jZX1cbiAgI3R2VUkgLnR2LW5hdntwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjA7cmlnaHQ6MDt0b3A6Y2xhbXAoMTRweCwzdmgsMjhweCk7ZGlzcGxheTpmbGV4O2dhcDo4cHg7cGFkZGluZzo2cHggY2xhbXAoMjBweCw2dncsODBweCk7b3ZlcmZsb3cteDphdXRvO3Njcm9sbGJhci13aWR0aDpub25lOy13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOnRvdWNofVxuICAjdHZVSSAudHYtbmF2Ojotd2Via2l0LXNjcm9sbGJhcntkaXNwbGF5Om5vbmV9XG4gICN0dlVJIC50di1uYXYgYnV0dG9ue2ZsZXg6bm9uZTthcHBlYXJhbmNlOm5vbmU7Ym9yZGVyOjA7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4wOCk7Y29sb3I6I2YyZjFlYztmb250OjUwMCBjbGFtcCgxNHB4LDEuNXZ3LDE3cHgpLzEgSGVsdmV0aWNhLEFyaWFsLHNhbnMtc2VyaWY7cGFkZGluZzoxM3B4IDIwcHg7Ym9yZGVyLXJhZGl1czo5OTlweDtjdXJzb3I6cG9pbnRlcjt0cmFuc2l0aW9uOmJhY2tncm91bmQgLjJzLGNvbG9yIC4ycyx0cmFuc2Zvcm0gLjJzO21pbi1oZWlnaHQ6NDRweH1cbiAgI3R2VUkgLnR2LW5hdiBidXR0b246aG92ZXJ7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4xNil9XG4gICN0dlVJIC50di1uYXYgYnV0dG9uLm9ue2JhY2tncm91bmQ6I2YyZjFlYztjb2xvcjojMTExMjE0O3RyYW5zZm9ybTpzY2FsZSgxLjA0KX1cbiAgI3R2VUkgLnR2LXZvbHtwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDpjbGFtcCgxMnB4LDIuNXZ3LDMycHgpO3RvcDo1MCU7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTUwJSk7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjEwcHg7cGFkZGluZzoxMHB4IDhweDtib3JkZXItcmFkaXVzOjk5OXB4O2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwuMDgpO2JhY2tkcm9wLWZpbHRlcjpibHVyKDEwcHgpOy13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOmJsdXIoMTBweCl9XG4gICN0dlVJIC50di12YnthcHBlYXJhbmNlOm5vbmU7Ym9yZGVyOjA7d2lkdGg6NDRweDtoZWlnaHQ6NDRweDtib3JkZXItcmFkaXVzOjUwJTtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50O2NvbG9yOiNmMmYxZWM7Zm9udDo0MDAgMjJweC8xIEhlbHZldGljYSxBcmlhbCxzYW5zLXNlcmlmO2N1cnNvcjpwb2ludGVyfVxuICAjdHZVSSAudHYtdmI6aG92ZXJ7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9XG4gICN0dlVJIC50di12b2wgaW5wdXR7LS12OjM1JTstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTthcHBlYXJhbmNlOm5vbmU7d3JpdGluZy1tb2RlOnZlcnRpY2FsLWxyO2RpcmVjdGlvbjpydGw7d2lkdGg6NnB4O2hlaWdodDpjbGFtcCgxMjBweCwyOHZoLDIyMHB4KTtib3JkZXItcmFkaXVzOjNweDtiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCh0byB0b3AsI2YyZjFlYyB2YXIoLS12KSxyZ2JhKDI1NSwyNTUsMjU1LC4yKSB2YXIoLS12KSk7Y3Vyc29yOnBvaW50ZXI7bWFyZ2luOjB9XG4gICN0dlVJIC50di12b2wgaW5wdXQ6Oi13ZWJraXQtc2xpZGVyLXRodW1iey13ZWJraXQtYXBwZWFyYW5jZTpub25lO3dpZHRoOjE4cHg7aGVpZ2h0OjE4cHg7Ym9yZGVyLXJhZGl1czo1MCU7YmFja2dyb3VuZDojZjJmMWVjO2JveC1zaGFkb3c6MCAxcHggNHB4IHJnYmEoMCwwLDAsLjQpfVxuICAjdHZVSSAudHYtdm9sIGlucHV0OjotbW96LXJhbmdlLXRodW1ie3dpZHRoOjE4cHg7aGVpZ2h0OjE4cHg7Ym9yZGVyOjA7Ym9yZGVyLXJhZGl1czo1MCU7YmFja2dyb3VuZDojZjJmMWVjfVxuICAjdHZVSSAudHYtdm9sIG91dHB1dHtmb250OjUwMCAxMnB4LzEgSGVsdmV0aWNhLEFyaWFsLHNhbnMtc2VyaWY7Y29sb3I6I2JkYmFiMjtmb250LXZhcmlhbnQtbnVtZXJpYzp0YWJ1bGFyLW51bXM7cGFkZGluZy1ib3R0b206NHB4fVxuICBAbWVkaWEgKG1heC13aWR0aDo2MDBweCl7I3R2VUkgLnR2LW5hdiBidXR0b257cGFkZGluZzoxMnB4IDE2cHh9I3R2VUkgLnR2LXZvbHtyaWdodDoxMHB4O3BhZGRpbmc6NnB4IDRweH0jdHZVSSAudHYtaGVyb3twYWRkaW5nLXJpZ2h0OjgwcHh9fVxuICAjdHZCYXIgYnV0dG9ue2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweDthcHBlYXJhbmNlOm5vbmU7Ym9yZGVyOjA7YmFja2dyb3VuZDp0cmFuc3BhcmVudDtjb2xvcjojZjJmMWVjO2ZvbnQ6NTAwIDEzcHgvMSBIZWx2ZXRpY2EsQXJpYWwsc2Fucy1zZXJpZjtwYWRkaW5nOjlweCAxNHB4O2JvcmRlci1yYWRpdXM6OTk5cHg7Y3Vyc29yOnBvaW50ZXJ9XG4gICN0dkJhciBidXR0b246aG92ZXJ7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9XG4gIGJvZHkudHZmb2N1cyAjcm9vbXMsYm9keS50dmZvY3VzICNwb3YsYm9keS50dmZvY3VzICNydCxib2R5LnR2Zm9jdXMgI3B0LGJvZHkudHZmb2N1cyAjbGFtcCxib2R5LnR2Zm9jdXMgI2xhbXAyLGJvZHkudHZmb2N1cyAjbXB7b3BhY2l0eTowICFpbXBvcnRhbnQ7cG9pbnRlci1ldmVudHM6bm9uZSAhaW1wb3J0YW50O3RyYW5zaXRpb246b3BhY2l0eSAuNHN9XG4gICN0dkIgLnB3e3RyYW5zaXRpb246ZmlsbCAuM3Msc3Ryb2tlIC4zc31cbiAgI3R2Qi5vbiAucHd7ZmlsbDojZTU0ODRkO3N0cm9rZTojZTU0ODRkfVxuICAjdHZCLm9uIHN2Z3tmaWx0ZXI6ZHJvcC1zaGFkb3coMCAwIDRweCByZ2JhKDEyMCwxNzAsMjU1LC43KSl9XG4gICNsYW1wRCBie3dpZHRoOjEycHg7aGVpZ2h0OjEycHg7Ym9yZGVyLXJhZGl1czo1MCU7YmFja2dyb3VuZDojYmRiOGFlO3RyYW5zaXRpb246YmFja2dyb3VuZCAuM3MsYm94LXNoYWRvdyAuM3N9XG4gICNsYW1wRC5vbiBie2JhY2tncm91bmQ6I2ZmOWEzYztib3gtc2hhZG93OjAgMCAxMHB4IDNweCByZ2JhKDI1NSwxNTAsNjAsLjYpfVxuICAjbGFtcDJ7cG9zaXRpb246Zml4ZWQ7bGVmdDo1MCU7Ym90dG9tOjgycHg7dHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLDEwcHgpO29wYWNpdHk6MDtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSAuMzVzLHRyYW5zZm9ybSAuMzVzO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjRweDtwYWRkaW5nOjRweDtib3JkZXItcmFkaXVzOjk5OXB4O2JhY2tncm91bmQ6cmdiYSgyNTAsMjQ4LDI0NCwuODIpO2JhY2tkcm9wLWZpbHRlcjpibHVyKDEwcHgpOy13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOmJsdXIoMTBweCk7Y29sb3I6IzJmMmQyYTtmb250OjUwMCAxNHB4LzEgSGVsdmV0aWNhLEFyaWFsLHNhbnMtc2VyaWY7Ym94LXNoYWRvdzowIDRweCAxOHB4IHJnYmEoMCwwLDAsLjA4KX1cbiAgI2xhbXAyLnNob3d7b3BhY2l0eToxO3RyYW5zZm9ybTp0cmFuc2xhdGUoLTUwJSwwKTtwb2ludGVyLWV2ZW50czphdXRvfVxuICAjdHJpcFR7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTBweDthcHBlYXJhbmNlOm5vbmU7Ym9yZGVyOjA7YmFja2dyb3VuZDp0cmFuc3BhcmVudDtjb2xvcjppbmhlcml0O2ZvbnQ6aW5oZXJpdDtwYWRkaW5nOjdweCAxNHB4IDdweCAxMHB4O2JvcmRlci1yYWRpdXM6OTk5cHg7Y3Vyc29yOnBvaW50ZXI7d2hpdGUtc3BhY2U6bm93cmFwfVxuICAjdHJpcFQ6aG92ZXJ7YmFja2dyb3VuZDpyZ2JhKDQ3LDQ1LDQyLC4wOCl9XG4gICN0cmlwVCBpe3dpZHRoOjEycHg7aGVpZ2h0OjEycHg7Ym9yZGVyLXJhZGl1czo1MCU7YmFja2dyb3VuZDojYmRiOGFlO3RyYW5zaXRpb246YmFja2dyb3VuZCAuM3MsYm94LXNoYWRvdyAuM3N9XG4gICN0cmlwQ3Rse2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjE0cHg7bWF4LXdpZHRoOjA7b3ZlcmZsb3c6aGlkZGVuO29wYWNpdHk6MDt0cmFuc2l0aW9uOm1heC13aWR0aCAuNHMsb3BhY2l0eSAuM3MscGFkZGluZyAuNHM7cGFkZGluZzowfVxuICAjbGFtcDIub24gI3RyaXBDdGx7bWF4LXdpZHRoOjU2MHB4O29wYWNpdHk6MTtwYWRkaW5nOjAgMTJweCAwIDZweH1cbiAgI3RyaXBDdGwgbGFiZWx7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6OHB4O2ZvbnQtc2l6ZToxMnB4O2NvbG9yOiM2YjY2NWV9XG4gICN0cmlwQ3RsIGlucHV0W3R5cGU9cmFuZ2Vde3dpZHRoOjEwMHB4O2FjY2VudC1jb2xvcjojMmYyZDJhfVxuICAjdHJpcEN0bCBvdXRwdXR7d2lkdGg6MzRweDt0ZXh0LWFsaWduOnJpZ2h0O2ZvbnQtdmFyaWFudC1udW1lcmljOnRhYnVsYXItbnVtc31cbiAgI3RyaXBDdGwgaW5wdXRbdHlwZT1jb2xvcl17YXBwZWFyYW5jZTpub25lOy13ZWJraXQtYXBwZWFyYW5jZTpub25lO3dpZHRoOjI2cHg7aGVpZ2h0OjI2cHg7Ym9yZGVyLXJhZGl1czo1MCU7Ym9yZGVyOjJweCBzb2xpZCByZ2JhKDI1MCwyNDgsMjQ0LC45KTtib3gtc2hhZG93OjAgMCAwIDFweCByZ2JhKDQ3LDQ1LDQyLC4yNSk7cGFkZGluZzowO2N1cnNvcjpwb2ludGVyO2JhY2tncm91bmQ6bm9uZX1cbiAgI3RyaXBDdGwgaW5wdXRbdHlwZT1jb2xvcl06Oi13ZWJraXQtY29sb3Itc3dhdGNoLXdyYXBwZXJ7cGFkZGluZzowfVxuICAjdHJpcEN0bCBpbnB1dFt0eXBlPWNvbG9yXTo6LXdlYmtpdC1jb2xvci1zd2F0Y2h7Ym9yZGVyOjA7Ym9yZGVyLXJhZGl1czo1MCV9XG4gICN0cmlwQ3RsIGlucHV0W3R5cGU9Y29sb3JdOjotbW96LWNvbG9yLXN3YXRjaHtib3JkZXI6MDtib3JkZXItcmFkaXVzOjUwJX1cbiAgI3Jvb21zLCNwb3YsI3J0LCNwdCwjbGFtcCwjbGFtcDIsdGhyZWUtZC1zdGFnZTo6cGFydCh0b29sYmFyKXt0cmFuc2l0aW9uOm9wYWNpdHkgLjZzfVxuICBib2R5LmlkbGUgI3Jvb21zLGJvZHkuaWRsZSAjcG92LGJvZHkuaWRsZSAjcnQsYm9keS5pZGxlICNwdCxib2R5LmlkbGUgI2xhbXAsYm9keS5pZGxlICNsYW1wMntvcGFjaXR5OjAgIWltcG9ydGFudDtwb2ludGVyLWV2ZW50czpub25lfVxuICBib2R5LmlkbGV7Y3Vyc29yOm5vbmV9XG5cbiAgLyogbXVhdmluLUdyYWRpZW50IGbDvHIgR1VJLUxlaXN0ZW4gKi9cbiAgI3Jvb21zLCNwb3YsI2xhbXAsI2xhbXAyLCNwdCwjcnQsI21we2JhY2tncm91bmQtY29sb3I6IzAwMCAhaW1wb3J0YW50O2JhY2tncm91bmQtaW1hZ2U6cmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCA2NS4zNCUgNDQuNjIlLCByZ2JhKDk1LDk1LDk1LDEpIDAlLCByZ2JhKDk1LDk1LDk1LC44NDQpIDguNTMlLCByZ2JhKDk1LDk1LDk1LC41KSAxNy4wNSUsIHJnYmEoOTUsOTUsOTUsLjE1NikgMjUuNTglLCByZ2JhKDk1LDk1LDk1LDApIDM0LjElKSxyYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IDI4LjA3JSA3NC40OCUsIHJnYmEoNTMsNTQsNDgsMSkgMCUsIHJnYmEoNTMsNTQsNDgsLjg0NCkgMTEuNDElLCByZ2JhKDUzLDU0LDQ4LC41KSAyMi44MyUsIHJnYmEoNTMsNTQsNDgsLjE1NikgMzQuMjQlLCByZ2JhKDUzLDU0LDQ4LDApIDQ1LjY1JSkscmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCA1Mi40MiUgMTkuOTQlLCByZ2JhKDU2LDEyMiw1NiwxKSAwJSwgcmdiYSg1NiwxMjIsNTYsLjg0NCkgMTQuMzklLCByZ2JhKDU2LDEyMiw1NiwuNSkgMjguNzclLCByZ2JhKDU2LDEyMiw1NiwuMTU2KSA0My4xNiUsIHJnYmEoNTYsMTIyLDU2LDApIDU3LjU1JSkscmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCA4MC4zMSUgODQuNDclLCByZ2JhKDAsMCwwLDEpIDAlLCByZ2JhKDAsMCwwLC44NDQpIDE3LjI3JSwgcmdiYSgwLDAsMCwuNSkgMzQuNTUlLCByZ2JhKDAsMCwwLC4xNTYpIDUxLjgyJSwgcmdiYSgwLDAsMCwwKSA2OS4xJSkgIWltcG9ydGFudDtiYWNrZ3JvdW5kLXNpemU6MTAwJSAxMDAlICFpbXBvcnRhbnQ7Y29sb3I6I2YyZjFlYyAhaW1wb3J0YW50O2JveC1zaGFkb3c6MCA2cHggMjRweCByZ2JhKDAsMCwwLC4yNSksaW5zZXQgMCAwIDAgMXB4IHJnYmEoMjU1LDI1NSwyNTUsLjA4KX1cbiAgI3Jvb21zIGJ1dHRvbiwjcG92IGJ1dHRvbntjb2xvcjojZjJmMWVjfVxuICAjcm9vbXMgYnV0dG9uOmhvdmVyLCNwb3YgYnV0dG9uOmhvdmVyLCNsYW1wVDpob3ZlciwjbGFtcEQ6aG92ZXIsI3RyaXBUOmhvdmVye2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwuMSl9XG4gICNyb29tcyBidXR0b24ub24sI3BvdiBidXR0b24ub24sI3J0Lm9ue2JhY2tncm91bmQ6I2YyZjFlYyAhaW1wb3J0YW50O2JhY2tncm91bmQtaW1hZ2U6bm9uZSAhaW1wb3J0YW50O2NvbG9yOiMxNDE0MTIgIWltcG9ydGFudH1cbiAgI2xhbXBTdywjbGFtcERpbSwjdHJpcEN0bHtjb2xvcjojZDlkN2QwICFpbXBvcnRhbnR9XG4gICNsYW1wU3cgYnV0dG9uLnNlbHtib3gtc2hhZG93OjAgMCAwIDJweCAjZjJmMWVjfVxuICAjbGFtcERpbSBpbnB1dFt0eXBlPXJhbmdlXSwjdHJpcEN0bCBpbnB1dFt0eXBlPXJhbmdlXXthY2NlbnQtY29sb3I6I2YyZjFlY31cbiAgLmxwLXN3e2FwcGVhcmFuY2U6bm9uZTt3aWR0aDoyNnB4O2hlaWdodDoyNnB4O2JvcmRlci1yYWRpdXM6NTAlO2JvcmRlcjoycHggc29saWQgcmdiYSgyNTAsMjQ4LDI0NCwuOSk7Ym94LXNoYWRvdzowIDAgMCAxcHggcmdiYSg0Nyw0NSw0MiwuMjUpO3BhZGRpbmc6MDtjdXJzb3I6cG9pbnRlcjtmbGV4Om5vbmV9XG4gIC5scGlja3twb3NpdGlvbjpmaXhlZDt6LWluZGV4OjUwO3dpZHRoOjIzNnB4O3BhZGRpbmc6MTRweDtib3JkZXItcmFkaXVzOjE4cHg7YmFja2dyb3VuZDpyZ2JhKDI2LDI3LDI0LC4zOCk7YmFja2Ryb3AtZmlsdGVyOmJsdXIoMThweCkgc2F0dXJhdGUoMS4yKTstd2Via2l0LWJhY2tkcm9wLWZpbHRlcjpibHVyKDE4cHgpIHNhdHVyYXRlKDEuMik7Y29sb3I6I2YyZjFlYztmb250OjUwMCAxMnB4LzEuMiBIZWx2ZXRpY2EsQXJpYWwsc2Fucy1zZXJpZjtib3gtc2hhZG93OjAgMTBweCAzNnB4IHJnYmEoMCwwLDAsLjM1KSxpbnNldCAwIDAgMCAxcHggcmdiYSgyNTUsMjU1LDI1NSwuMDgpO2Rpc3BsYXk6bm9uZTtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Z2FwOjE0cHg7dHJhbnNpdGlvbjpvcGFjaXR5IC42c31cbiAgLmxwaWNrLm9wZW57ZGlzcGxheTpmbGV4fVxuICBib2R5LmxwZm9jdXMgI3Jvb21zLGJvZHkubHBmb2N1cyAjcG92LGJvZHkubHBmb2N1cyAjcnQsYm9keS5scGZvY3VzICNwdCxib2R5LmxwZm9jdXMgI2xhbXAsYm9keS5scGZvY3VzICNsYW1wMixib2R5LmxwZm9jdXMgdGhyZWUtZC1zdGFnZTo6cGFydCh0b29sYmFyKXtvcGFjaXR5OjAgIWltcG9ydGFudDtwb2ludGVyLWV2ZW50czpub25lICFpbXBvcnRhbnR9XG4gIC5scC1kb25le2FwcGVhcmFuY2U6bm9uZTtib3JkZXI6MDtib3JkZXItcmFkaXVzOjk5OXB4O3BhZGRpbmc6OXB4IDA7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4xKTtjb2xvcjojZjJmMWVjO2ZvbnQ6aW5oZXJpdDtjdXJzb3I6cG9pbnRlcn1cbiAgLmxwLWRvbmU6aG92ZXJ7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4xOCl9XG4gIGJvZHkuaWRsZSAubHBpY2t7b3BhY2l0eTowO3BvaW50ZXItZXZlbnRzOm5vbmV9XG4gIC5scC1zZWd7ZGlzcGxheTpncmlkO2dyaWQtdGVtcGxhdGUtY29sdW1uczoxZnIgMWZyO2dhcDozcHg7cGFkZGluZzozcHg7Ym9yZGVyLXJhZGl1czo5OTlweDtiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsLjA4KX1cbiAgLmxwLXNlZyBidXR0b257YXBwZWFyYW5jZTpub25lO2JvcmRlcjowO2JvcmRlci1yYWRpdXM6OTk5cHg7cGFkZGluZzo3cHggMDtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50O2NvbG9yOiNkOWQ3ZDA7Zm9udDppbmhlcml0O2N1cnNvcjpwb2ludGVyfVxuICAubHAtc2VnIGJ1dHRvbi5vbntiYWNrZ3JvdW5kOiNmMmYxZWM7Y29sb3I6IzE0MTQxMn1cbiAgLmxwLXJvd3tkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2dhcDo3cHh9XG4gIC5scC1yb3c+ZGl2e2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2Vlbjtjb2xvcjojZDlkN2QwfVxuICAubHAtcm93IG91dHB1dHtmb250LXZhcmlhbnQtbnVtZXJpYzp0YWJ1bGFyLW51bXM7Y29sb3I6I2YyZjFlY31cbiAgLmxwLXJvdyBzbWFsbHtkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47Y29sb3I6I2E5YTY5ZTtmb250LXNpemU6MTFweH1cbiAgLmxwaWNrIGlucHV0W3R5cGU9cmFuZ2Vde3dpZHRoOjEwMCU7bWFyZ2luOjA7YWNjZW50LWNvbG9yOiNmMmYxZWN9XG4gIC5scGljayBpbnB1dC5scC10ZW1we2FwcGVhcmFuY2U6bm9uZTstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTtoZWlnaHQ6MTBweDtib3JkZXItcmFkaXVzOjVweDtvdXRsaW5lOm5vbmV9XG4gIC5scC10ZW1wOjotd2Via2l0LXNsaWRlci10aHVtYnstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTt3aWR0aDoxOHB4O2hlaWdodDoxOHB4O2JvcmRlci1yYWRpdXM6NTAlO2JhY2tncm91bmQ6I2ZmZjtib3JkZXI6MnB4IHNvbGlkICMxYTFiMTg7Ym94LXNoYWRvdzowIDAgMCAxcHggcmdiYSgyNTUsMjU1LDI1NSwuNik7Y3Vyc29yOnBvaW50ZXJ9XG4gIC5scC10ZW1wOjotbW96LXJhbmdlLXRodW1ie3dpZHRoOjE0cHg7aGVpZ2h0OjE0cHg7Ym9yZGVyLXJhZGl1czo1MCU7YmFja2dyb3VuZDojZmZmO2JvcmRlcjoycHggc29saWQgIzFhMWIxODtjdXJzb3I6cG9pbnRlcn1cbiAgLmxwLXdoZWVse3Bvc2l0aW9uOnJlbGF0aXZlO3dpZHRoOjE4MHB4O2hlaWdodDoxODBweDttYXJnaW46MCBhdXRvO3RvdWNoLWFjdGlvbjpub25lO2N1cnNvcjpwb2ludGVyfVxuICAubHAtd2hlZWwgY2FudmFze3dpZHRoOjE4MHB4O2hlaWdodDoxODBweDtib3JkZXItcmFkaXVzOjUwJTtkaXNwbGF5OmJsb2NrfVxuICAubHAtd2hlZWwgaXtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxOHB4O2hlaWdodDoxOHB4O21hcmdpbjotOXB4IDAgMCAtOXB4O2JvcmRlci1yYWRpdXM6NTAlO2JvcmRlcjoycHggc29saWQgI2ZmZjtib3gtc2hhZG93OjAgMCAwIDFweCByZ2JhKDAsMCwwLC40KSwwIDJweCA2cHggcmdiYSgwLDAsMCwuNCk7cG9pbnRlci1ldmVudHM6bm9uZX1cblxuICAjbXB7cG9zaXRpb246Zml4ZWQ7dG9wOjE4cHg7bGVmdDoxOHB4O3otaW5kZXg6NDA7d2lkdGg6MzAwcHg7Ym94LXNpemluZzpib3JkZXItYm94O3BhZGRpbmc6MTJweCAxNHB4IDEycHggMTJweDtib3JkZXItcmFkaXVzOjIwcHg7Zm9udDo1MDAgMTNweC8xLjIgSGVsdmV0aWNhLEFyaWFsLHNhbnMtc2VyaWY7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtnYXA6MTBweDt0cmFuc2l0aW9uOm9wYWNpdHkgLjZzfVxuICAjbXAgLm1wLXRvcHtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDoxMnB4fVxuICAjbXAgLm1wLWRpc2N7ZmxleDpub25lO3dpZHRoOjQwcHg7aGVpZ2h0OjQwcHg7Ym9yZGVyLXJhZGl1czo1MCU7YmFja2dyb3VuZDpyYWRpYWwtZ3JhZGllbnQoY2lyY2xlLCMxNDE0MTIgMCA1cHgsI2YyZjFlYyA1cHggN3B4LCMyYTJiMjcgN3B4IDEwMCUpO2JveC1zaGFkb3c6aW5zZXQgMCAwIDAgMXB4IHJnYmEoMjU1LDI1NSwyNTUsLjEyKTthbmltYXRpb246bXBzcGluIDRzIGxpbmVhciBpbmZpbml0ZTthbmltYXRpb24tcGxheS1zdGF0ZTpwYXVzZWR9XG4gICNtcC5wbGF5IC5tcC1kaXNje2FuaW1hdGlvbi1wbGF5LXN0YXRlOnJ1bm5pbmd9XG4gICNtcCAubXAtbWV0YXtmbGV4OjE7bWluLXdpZHRoOjA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtnYXA6M3B4fVxuICAjbXAgLm1wLXR7d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2NvbG9yOiNmMmYxZWN9XG4gICNtcCAubXAtc3tmb250LXNpemU6MTFweDtjb2xvcjojYTlhNjllO3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpc31cbiAgI21wIC5tcC1jdGx7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MnB4fVxuICAjbXAgYnV0dG9ue2FwcGVhcmFuY2U6bm9uZTtib3JkZXI6MDtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50O2NvbG9yOiNmMmYxZWM7Y3Vyc29yOnBvaW50ZXI7d2lkdGg6MzJweDtoZWlnaHQ6MzJweDtib3JkZXItcmFkaXVzOjUwJTtkaXNwbGF5OmdyaWQ7cGxhY2UtaXRlbXM6Y2VudGVyO3BhZGRpbmc6MH1cbiAgI21wIGJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsLjEpfVxuICAjbXAgYnV0dG9uOmRpc2FibGVke29wYWNpdHk6LjM1O2N1cnNvcjpkZWZhdWx0O2JhY2tncm91bmQ6dHJhbnNwYXJlbnR9XG4gICNtcCBidXR0b24ubXAtcHB7YmFja2dyb3VuZDojZjJmMWVjO2NvbG9yOiMxNDE0MTJ9XG4gICNtcCBidXR0b24ubXAtcHA6aG92ZXJ7YmFja2dyb3VuZDojZmZmfVxuICAjbXAgYnV0dG9uLm1wLXBwOmRpc2FibGVke2JhY2tncm91bmQ6I2YyZjFlY31cbiAgI21wIHN2Z3t3aWR0aDoxNHB4O2hlaWdodDoxNHB4O2ZpbGw6Y3VycmVudENvbG9yO2Rpc3BsYXk6YmxvY2t9XG4gICNtcCAubXAtYmFye2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweDtmb250LXNpemU6MTFweDtjb2xvcjojYTlhNjllO2ZvbnQtdmFyaWFudC1udW1lcmljOnRhYnVsYXItbnVtc31cbiAgI21wIGlucHV0W3R5cGU9cmFuZ2Vde2ZsZXg6MTttYXJnaW46MDthY2NlbnQtY29sb3I6I2YyZjFlYztoZWlnaHQ6MTRweH1cbiAgI21wIC5tcC12b2x7d2lkdGg6NjRweDtmbGV4Om5vbmV9XG4gICNtcCAubXAtYWRke3dpZHRoOmF1dG87aGVpZ2h0OjI4cHg7cGFkZGluZzowIDEycHg7Ym9yZGVyLXJhZGl1czo5OTlweDtiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsLjEpO2ZvbnQ6aW5oZXJpdDtmb250LXNpemU6MTJweDt3aGl0ZS1zcGFjZTpub3dyYXB9XG4gICNtcCAubXAtYWRkOmhvdmVye2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwuMTgpfVxuICAjbXAuZW1wdHkgLm1wLWJhcntkaXNwbGF5Om5vbmV9XG4gICNtcC5kcmFne2JveC1zaGFkb3c6MCAwIDAgMnB4ICNmMmYxZWMsMCA2cHggMjRweCByZ2JhKDAsMCwwLC4yNSkgIWltcG9ydGFudH1cbiAgYm9keS5pZGxlICNtcCxib2R5LmxwZm9jdXMgI21we29wYWNpdHk6MCAhaW1wb3J0YW50O3BvaW50ZXItZXZlbnRzOm5vbmUgIWltcG9ydGFudH1cbiAgQGtleWZyYW1lcyBtcHNwaW57dG97dHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpfX1cbjxcdTAwMkZzdHlsZT5cbjxcdTAwMkZoZWFkPlxuPGJvZHk+XG5cbjx0aHJlZS1kLXN0YWdlIG5hbWU9XCJ3b2hudW5nXCIgYmFja2dyb3VuZD1cIiNlZmVjZTZcIj48XHUwMDJGdGhyZWUtZC1zdGFnZT5cbjxkaXYgaWQ9XCJyb29tc1wiPjxcdTAwMkZkaXY+XG48ZGl2IGlkPVwicG92XCI+PGJ1dHRvbiBkYXRhLW09XCJiaXJkXCIgY2xhc3M9XCJvblwiPlZvZ2VscGVyc3Bla3RpdmU8XHUwMDJGYnV0dG9uPjxidXR0b24gZGF0YS1tPVwiZnBcIj5GcmVpIHVtc2VoZW48XHUwMDJGYnV0dG9uPjxcdTAwMkZkaXY+XG48YnV0dG9uIGlkPVwicnRcIiBhcmlhLXByZXNzZWQ9XCJmYWxzZVwiPjxpPjxcdTAwMkZpPjxzcGFuPlJlbmRlciBhdXM8XHUwMDJGc3Bhbj48XHUwMDJGYnV0dG9uPlxuPGRpdiBpZD1cInB0XCI+PFx1MDAyRmRpdj5cbjxkaXYgaWQ9XCJtcFwiIGNsYXNzPVwiZW1wdHlcIj48ZGl2IGNsYXNzPVwibXAtdG9wXCI+PGRpdiBjbGFzcz1cIm1wLWRpc2NcIj48XHUwMDJGZGl2PjxkaXYgY2xhc3M9XCJtcC1tZXRhXCI+PGRpdiBjbGFzcz1cIm1wLXRcIj5LZWluZSBNdXNpazxcdTAwMkZkaXY+PGRpdiBjbGFzcz1cIm1wLXNcIj5EYXRlaWVuIGhpbnp1ZsO8Z2VuIG9kZXIgaGllcmhlciB6aWVoZW48XHUwMDJGZGl2PjxcdTAwMkZkaXY+PGRpdiBjbGFzcz1cIm1wLWN0bFwiPjxidXR0b24gY2xhc3M9XCJtcC1wcmV2XCIgdGl0bGU9XCJadXLDvGNrXCIgZGlzYWJsZWQ9XCJcIj48c3ZnIHZpZXdCb3g9XCIwIDAgMTYgMTZcIj48cmVjdCB4PVwiMlwiIHk9XCIzXCIgd2lkdGg9XCIyXCIgaGVpZ2h0PVwiMTBcIj48XHUwMDJGcmVjdD48cG9seWdvbiBwb2ludHM9XCIxNCwzIDE0LDEzIDUsOFwiPjxcdTAwMkZwb2x5Z29uPjxcdTAwMkZzdmc+PFx1MDAyRmJ1dHRvbj48YnV0dG9uIGNsYXNzPVwibXAtcHBcIiB0aXRsZT1cIkFic3BpZWxlblwiIGRpc2FibGVkPVwiXCI+PHN2ZyB2aWV3Qm94PVwiMCAwIDE2IDE2XCI+PHBvbHlnb24gcG9pbnRzPVwiNCwyIDQsMTQgMTQsOFwiPjxcdTAwMkZwb2x5Z29uPjxcdTAwMkZzdmc+PFx1MDAyRmJ1dHRvbj48YnV0dG9uIGNsYXNzPVwibXAtbmV4dFwiIHRpdGxlPVwiV2VpdGVyXCIgZGlzYWJsZWQ9XCJcIj48c3ZnIHZpZXdCb3g9XCIwIDAgMTYgMTZcIj48cmVjdCB4PVwiMTJcIiB5PVwiM1wiIHdpZHRoPVwiMlwiIGhlaWdodD1cIjEwXCI+PFx1MDAyRnJlY3Q+PHBvbHlnb24gcG9pbnRzPVwiMiwzIDIsMTMgMTEsOFwiPjxcdTAwMkZwb2x5Z29uPjxcdTAwMkZzdmc+PFx1MDAyRmJ1dHRvbj48XHUwMDJGZGl2PjxcdTAwMkZkaXY+PGRpdiBjbGFzcz1cIm1wLWJhclwiPjxzcGFuIGNsYXNzPVwibXAtY3VyXCI+MDowMDxcdTAwMkZzcGFuPjxpbnB1dCBjbGFzcz1cIm1wLXNlZWtcIiB0eXBlPVwicmFuZ2VcIiBtaW49XCIwXCIgbWF4PVwiMTAwMFwiIHZhbHVlPVwiMFwiPjxzcGFuIGNsYXNzPVwibXAtZHVyXCI+MDowMDxcdTAwMkZzcGFuPjxcdTAwMkZkaXY+PGRpdiBjbGFzcz1cIm1wLWJhclwiPjxidXR0b24gY2xhc3M9XCJtcC1hZGRcIj4rIE11c2lrPFx1MDAyRmJ1dHRvbj48c3BhbiBzdHlsZT1cIm1hcmdpbi1sZWZ0OmF1dG9cIj5MYXV0c3TDpHJrZTxcdTAwMkZzcGFuPjxpbnB1dCBjbGFzcz1cIm1wLXZvbFwiIHR5cGU9XCJyYW5nZVwiIG1pbj1cIjBcIiBtYXg9XCIxMDBcIiB2YWx1ZT1cIjgwXCI+PFx1MDAyRmRpdj48aW5wdXQgY2xhc3M9XCJtcC1maWxlXCIgdHlwZT1cImZpbGVcIiBhY2NlcHQ9XCJhdWRpby8qLC5tcDMsLm00YSwuYWFjLC53YXYsLmZsYWMsLm9nZywub3B1c1wiIG11bHRpcGxlPVwiXCIgaGlkZGVuPVwiXCI+PGJ1dHRvbiBjbGFzcz1cIm1wLWFkZCBtcC1hZGQwXCIgc3R5bGU9XCJhbGlnbi1zZWxmOmZsZXgtc3RhcnRcIj4rIE11c2lrIGhpbnp1ZsO8Z2VuPFx1MDAyRmJ1dHRvbj48YXVkaW8gY2xhc3M9XCJtcC1hXCIgcHJlbG9hZD1cIm1ldGFkYXRhXCI+PFx1MDAyRmF1ZGlvPjxcdTAwMkZkaXY+XG48ZGl2IGlkPVwibGFtcFwiPjxidXR0b24gaWQ9XCJsYW1wVFwiPjxpPjxcdTAwMkZpPjxzcGFuPkJvZ2VubGFtcGUgYW48XHUwMDJGc3Bhbj48XHUwMDJGYnV0dG9uPjxkaXYgaWQ9XCJsYW1wQ3RsXCI+PGRpdiBpZD1cImxhbXBTd1wiPjxcdTAwMkZkaXY+PGxhYmVsIGlkPVwibGFtcERpbVwiIHN0eWxlPVwiZGlzcGxheTpub25lXCI+PHNwYW4+U3TDpHJrZTxcdTAwMkZzcGFuPjxpbnB1dCB0eXBlPVwicmFuZ2VcIiBtaW49XCIxMFwiIG1heD1cIjIwMFwiIHN0ZXA9XCI1XCIgdmFsdWU9XCIxMDBcIj48b3V0cHV0PjEwMCU8XHUwMDJGb3V0cHV0PjxcdTAwMkZsYWJlbD48XHUwMDJGZGl2PjxidXR0b24gaWQ9XCJsYW1wRFwiIGFyaWEtcHJlc3NlZD1cImZhbHNlXCI+PGI+PFx1MDAyRmI+PHNwYW4+RG9udXQtTGFtcGUgYW48XHUwMDJGc3Bhbj48XHUwMDJGYnV0dG9uPjxidXR0b24gaWQ9XCJ0dkJcIiBhcmlhLXByZXNzZWQ9XCJmYWxzZVwiIHRpdGxlPVwiRmVybnNlaGVyIGFuL2F1c1wiPjxzdmcgdmlld0JveD1cIjAgMCAyNCAyNFwiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS42XCI+PHJlY3QgeD1cIjcuNVwiIHk9XCIyLjVcIiB3aWR0aD1cIjlcIiBoZWlnaHQ9XCIxOVwiIHJ4PVwiM1wiPjxcdTAwMkZyZWN0PjxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiN1wiIHI9XCIxLjZcIiBjbGFzcz1cInB3XCI+PFx1MDAyRmNpcmNsZT48Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyLjVcIiByPVwiMi4yXCI+PFx1MDAyRmNpcmNsZT48Y2lyY2xlIGN4PVwiMTAuM1wiIGN5PVwiMTcuM1wiIHI9XCIuNlwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIj48XHUwMDJGY2lyY2xlPjxjaXJjbGUgY3g9XCIxMy43XCIgY3k9XCIxNy4zXCIgcj1cIi42XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiPjxcdTAwMkZjaXJjbGU+PFx1MDAyRnN2Zz48c3Bhbj5GZXJuc2VoZXIgYW48XHUwMDJGc3Bhbj48XHUwMDJGYnV0dG9uPjxcdTAwMkZkaXY+XG48ZGl2IGlkPVwidHZVSVwiPjxkaXYgY2xhc3M9XCJ0di1oZXJvXCI+PHNtYWxsPlp1bGV0enQgZ2XDtmZmbmV0PFx1MDAyRnNtYWxsPjxoMj48XHUwMDJGaDI+PFx1MDAyRmRpdj48bmF2IGNsYXNzPVwidHYtbmF2XCI+PFx1MDAyRm5hdj48ZGl2IGNsYXNzPVwidHYtdm9sXCI+PGJ1dHRvbiBjbGFzcz1cInR2LXZiXCIgZGF0YS1kPVwiNVwiIGFyaWEtbGFiZWw9XCJMYXV0ZXJcIj4rPFx1MDAyRmJ1dHRvbj48aW5wdXQgdHlwZT1cInJhbmdlXCIgbWluPVwiMFwiIG1heD1cIjEwMFwiIHN0ZXA9XCIxXCIgYXJpYS1sYWJlbD1cIkxhdXRzdMOkcmtlXCI+PGJ1dHRvbiBjbGFzcz1cInR2LXZiXCIgZGF0YS1kPVwiLTVcIiBhcmlhLWxhYmVsPVwiTGVpc2VyXCI+4oiSPFx1MDAyRmJ1dHRvbj48b3V0cHV0PjxcdTAwMkZvdXRwdXQ+PFx1MDAyRmRpdj48XHUwMDJGZGl2PlxuPGRpdiBpZD1cInR2QmFyXCI+PGJ1dHRvbiBpZD1cInR2QmFja1wiPlp1csO8Y2s8XHUwMDJGYnV0dG9uPjxidXR0b24gaWQ9XCJ0dk9mZlwiPjxzdmcgdmlld0JveD1cIjAgMCAyNCAyNFwiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS42XCI+PHJlY3QgeD1cIjcuNVwiIHk9XCIyLjVcIiB3aWR0aD1cIjlcIiBoZWlnaHQ9XCIxOVwiIHJ4PVwiM1wiPjxcdTAwMkZyZWN0PjxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiN1wiIHI9XCIxLjZcIiBmaWxsPVwiI2U1NDg0ZFwiIHN0cm9rZT1cIiNlNTQ4NGRcIj48XHUwMDJGY2lyY2xlPjxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTIuNVwiIHI9XCIyLjJcIj48XHUwMDJGY2lyY2xlPjxjaXJjbGUgY3g9XCIxMC4zXCIgY3k9XCIxNy4zXCIgcj1cIi42XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiPjxcdTAwMkZjaXJjbGU+PGNpcmNsZSBjeD1cIjEzLjdcIiBjeT1cIjE3LjNcIiByPVwiLjZcIiBmaWxsPVwiY3VycmVudENvbG9yXCI+PFx1MDAyRmNpcmNsZT48XHUwMDJGc3ZnPjxzcGFuPkF1c3NjaGFsdGVuPFx1MDAyRnNwYW4+PFx1MDAyRmJ1dHRvbj48XHUwMDJGZGl2PlxuPGRpdiBpZD1cImxhbXAyXCI+PGJ1dHRvbiBpZD1cInRyaXBUXCI+PGk+PFx1MDAyRmk+PHNwYW4+VHJpcG9kLUxhbXBlIGFuPFx1MDAyRnNwYW4+PFx1MDAyRmJ1dHRvbj48ZGl2IGlkPVwidHJpcEN0bFwiPjxsYWJlbD48YnV0dG9uIGlkPVwidHJpcENvbFwiIGNsYXNzPVwibHAtc3dcIiB0aXRsZT1cIkxpY2h0IGVpbnN0ZWxsZW5cIj48XHUwMDJGYnV0dG9uPjxcdTAwMkZsYWJlbD48bGFiZWwgc3R5bGU9XCJkaXNwbGF5Om5vbmVcIj48c3Bhbj5TdMOkcmtlPFx1MDAyRnNwYW4+PGlucHV0IGlkPVwidHJpcERpbVwiIHR5cGU9XCJyYW5nZVwiIG1pbj1cIjEwXCIgbWF4PVwiMjAwXCIgc3RlcD1cIjVcIiB2YWx1ZT1cIjEwMFwiPjxvdXRwdXQ+MTAwJTxcdTAwMkZvdXRwdXQ+PFx1MDAyRmxhYmVsPjxsYWJlbD48c3Bhbj5LZWdlbDxcdTAwMkZzcGFuPjxpbnB1dCBpZD1cInRyaXBDb25lXCIgdHlwZT1cInJhbmdlXCIgbWluPVwiMTVcIiBtYXg9XCI4MFwiIHN0ZXA9XCIxXCIgdmFsdWU9XCIzMlwiPjxvdXRwdXQ+MzLCsDxcdTAwMkZvdXRwdXQ+PFx1MDAyRmxhYmVsPjxcdTAwMkZkaXY+PFx1MDAyRmRpdj5cbjxzY3JpcHQ+XG4oZnVuY3Rpb24oKXtcbmNvbnN0IFI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21wJyksJD1zPT5SLnF1ZXJ5U2VsZWN0b3IocyksQT0kKCcubXAtYScpLEY9JCgnLm1wLWZpbGUnKTtcbmNvbnN0IFA9XCI8c3ZnIHZpZXdCb3g9XFxcIjAgMCAxNiAxNlxcXCI+PHBvbHlnb24gcG9pbnRzPVxcXCI0LDIgNCwxNCAxNCw4XFxcIi8+PFx1MDAyRnN2Zz5cIixaPVwiPHN2ZyB2aWV3Qm94PVxcXCIwIDAgMTYgMTZcXFwiPjxyZWN0IHg9XFxcIjNcXFwiIHk9XFxcIjJcXFwiIHdpZHRoPVxcXCIzLjVcXFwiIGhlaWdodD1cXFwiMTJcXFwiLz48cmVjdCB4PVxcXCI5LjVcXFwiIHk9XFxcIjJcXFwiIHdpZHRoPVxcXCIzLjVcXFwiIGhlaWdodD1cXFwiMTJcXFwiLz48XHUwMDJGc3ZnPlwiO1xubGV0IGxpc3Q9W10saT0tMTtcbmNvbnN0IGZtdD1zPT5pc0Zpbml0ZShzKT9NYXRoLmZsb29yKHMvNjApKyc6JytTdHJpbmcoTWF0aC5mbG9vcihzJTYwKSkucGFkU3RhcnQoMiwnMCcpOicwOjAwJztcbmNvbnN0IHZvbD0rKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd3b2hudW5nLm1wLnZvbCcpPz84MCk7JCgnLm1wLXZvbCcpLnZhbHVlPXZvbDtBLnZvbHVtZT12b2wvMTAwO1xuZnVuY3Rpb24gdWkoKXtcbiAgY29uc3QgZT0hbGlzdC5sZW5ndGg7Ui5jbGFzc0xpc3QudG9nZ2xlKCdlbXB0eScsZSk7JCgnLm1wLWFkZDAnKS5zdHlsZS5kaXNwbGF5PWU/Jyc6J25vbmUnO1xuICAkKCcubXAtcHAnKS5kaXNhYmxlZD1lOyQoJy5tcC1wcmV2JykuZGlzYWJsZWQ9JCgnLm1wLW5leHQnKS5kaXNhYmxlZD1saXN0Lmxlbmd0aDwyO1xuICBjb25zdCB0PWxpc3RbaV07JCgnLm1wLXQnKS50ZXh0Q29udGVudD10P3QubmFtZTonS2VpbmUgTXVzaWsnO1xuICAkKCcubXAtcycpLnRleHRDb250ZW50PXQ/KCdUaXRlbCAnKyhpKzEpKycgdm9uICcrbGlzdC5sZW5ndGgpOidEYXRlaWVuIGhpbnp1ZsO8Z2VuIG9kZXIgaGllcmhlciB6aWVoZW4nO1xuICBjb25zdCBwbD0hQS5wYXVzZWQmJiEhdDtSLmNsYXNzTGlzdC50b2dnbGUoJ3BsYXknLHBsKTskKCcubXAtcHAnKS5pbm5lckhUTUw9cGw/WjpQOyQoJy5tcC1wcCcpLnRpdGxlPXBsPydQYXVzZSc6J0Fic3BpZWxlbic7XG59XG5mdW5jdGlvbiBsb2FkKG4sZ28pe2lmKCFsaXN0Lmxlbmd0aClyZXR1cm47aT0obitsaXN0Lmxlbmd0aCklbGlzdC5sZW5ndGg7QS5zcmM9bGlzdFtpXS51cmw7aWYoZ28pQS5wbGF5KCkuY2F0Y2goKCk9Pnt9KTt1aSgpO31cbmZ1bmN0aW9uIGFkZChmaWxlcyl7XG4gIGNvbnN0IGZzPVsuLi5maWxlc10uZmlsdGVyKGY9PmYudHlwZS5zdGFydHNXaXRoKCdhdWRpby8nKXx8L1xcLihtcDN8bTRhfGFhY3x3YXZ8ZmxhY3xvZ2d8b3B1cykkL2kudGVzdChmLm5hbWUpKTtcbiAgaWYoIWZzLmxlbmd0aClyZXR1cm47Y29uc3QgZmlyc3Q9IWxpc3QubGVuZ3RoO1xuICBmcy5mb3JFYWNoKGY9Pmxpc3QucHVzaCh7bmFtZTpmLm5hbWUucmVwbGFjZSgvXFwuW14uXSskLywnJykucmVwbGFjZSgvW19dKy9nLCcgJyksdXJsOlVSTC5jcmVhdGVPYmplY3RVUkwoZil9KSk7XG4gIGlmKGZpcnN0KWxvYWQoMCx0cnVlKTtlbHNlIHVpKCk7XG59XG5SLnF1ZXJ5U2VsZWN0b3JBbGwoJy5tcC1hZGQnKS5mb3JFYWNoKGI9PmIub25jbGljaz0oKT0+Ri5jbGljaygpKTtcbkYub25jaGFuZ2U9KCk9PnthZGQoRi5maWxlcyk7Ri52YWx1ZT0nJzt9O1xuJCgnLm1wLXBwJykub25jbGljaz0oKT0+e2lmKGk8MClyZXR1cm4gbG9hZCgwLHRydWUpO0EucGF1c2VkP0EucGxheSgpLmNhdGNoKCgpPT57fSk6QS5wYXVzZSgpO307XG4kKCcubXAtcHJldicpLm9uY2xpY2s9KCk9PntpZihBLmN1cnJlbnRUaW1lPjMpe0EuY3VycmVudFRpbWU9MDtyZXR1cm47fWxvYWQoaS0xLHRydWUpO307XG4kKCcubXAtbmV4dCcpLm9uY2xpY2s9KCk9PmxvYWQoaSsxLHRydWUpO1xuQS5vbmVuZGVkPSgpPT57aWYobGlzdC5sZW5ndGg+MXx8aTxsaXN0Lmxlbmd0aC0xKWxvYWQoaSsxLHRydWUpO2Vsc2UgdWkoKTt9O1xuQS5vbnBsYXk9QS5vbnBhdXNlPXVpO1xubGV0IHNlZWtpbmc9ZmFsc2U7Y29uc3Qgc2s9JCgnLm1wLXNlZWsnKTtcbnNrLm9uaW5wdXQ9KCk9PntzZWVraW5nPXRydWU7JCgnLm1wLWN1cicpLnRleHRDb250ZW50PWZtdChzay52YWx1ZS8xMDAwKkEuZHVyYXRpb24pO307XG5zay5vbmNoYW5nZT0oKT0+e2lmKGlzRmluaXRlKEEuZHVyYXRpb24pKUEuY3VycmVudFRpbWU9c2sudmFsdWUvMTAwMCpBLmR1cmF0aW9uO3NlZWtpbmc9ZmFsc2U7fTtcbkEub250aW1ldXBkYXRlPSgpPT57aWYoc2Vla2luZylyZXR1cm47JCgnLm1wLWN1cicpLnRleHRDb250ZW50PWZtdChBLmN1cnJlbnRUaW1lKTtpZihBLmR1cmF0aW9uKXNrLnZhbHVlPUEuY3VycmVudFRpbWUvQS5kdXJhdGlvbioxMDAwO307XG5BLm9ubG9hZGVkbWV0YWRhdGE9KCk9PnskKCcubXAtZHVyJykudGV4dENvbnRlbnQ9Zm10KEEuZHVyYXRpb24pO307XG4kKCcubXAtdm9sJykub25pbnB1dD1lPT57QS52b2x1bWU9ZS50YXJnZXQudmFsdWUvMTAwO2xvY2FsU3RvcmFnZS5zZXRJdGVtKCd3b2hudW5nLm1wLnZvbCcsZS50YXJnZXQudmFsdWUpO307XG5bJ2RyYWdlbnRlcicsJ2RyYWdvdmVyJ10uZm9yRWFjaCh0PT5SLmFkZEV2ZW50TGlzdGVuZXIodCxlPT57ZS5wcmV2ZW50RGVmYXVsdCgpO1IuY2xhc3NMaXN0LmFkZCgnZHJhZycpO30pKTtcblsnZHJhZ2xlYXZlJywnZHJvcCddLmZvckVhY2godD0+Ui5hZGRFdmVudExpc3RlbmVyKHQsZT0+e2UucHJldmVudERlZmF1bHQoKTtSLmNsYXNzTGlzdC5yZW1vdmUoJ2RyYWcnKTt9KSk7XG5SLmFkZEV2ZW50TGlzdGVuZXIoJ2Ryb3AnLGU9PmFkZChlLmRhdGFUcmFuc2Zlci5maWxlcykpO1xuWydwb2ludGVyZG93bicsJ2tleWRvd24nLCd3aGVlbCddLmZvckVhY2godD0+Ui5hZGRFdmVudExpc3RlbmVyKHQsZT0+ZS5zdG9wUHJvcGFnYXRpb24oKSkpO1xudWkoKTtcbn0pKCk7XG48XHUwMDJGc2NyaXB0PlxuPHNjcmlwdCBzcmM9XCI2ZjM0MzJkMC0xYmRlLTRlMmUtYmQ4Zi1kYmE4MmEyNTRhOTVcIj48XHUwMDJGc2NyaXB0PlxuPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4vLyBtb2ViZWwuanMgKGVpbmdlYmV0dGV0KVxuLy8gTcO2YmVsLUJ1aWxkZXIgKGF1cyBTb2ZhIDNEIC8gUmVnYWwgM0QgLyBCb2dlbmxhbXBlIDNEIMO8YmVybm9tbWVuKVxuY29uc3QgbWsgPSAoVEhSRUUsIG5hbWUsIGdlbywgbWF0LCB4PTAsIHk9MCwgej0wKSA9PiB7IGNvbnN0IG0gPSBuZXcgVEhSRUUuTWVzaChnZW8sIG1hdCk7IG0ubmFtZT1uYW1lOyBtLnBvc2l0aW9uLnNldCh4LHkseik7IHJldHVybiBtOyB9O1xuXG5mdW5jdGlvbiBidWlsZFNvZmEoVEhSRUUpe1xuICBjb25zdCBNID0ge1xuICAgIGZhYnJpYzogbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgbmFtZToncG9seV93b29sX2hlcnJpbmdib25lJywgY29sb3I6MHg4Yjg3ODAsIHJvdWdobmVzczowLjk1IH0pLFxuICAgIG1ldGFsOiAgbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgbmFtZTonYmxhY2tfcG93ZGVyY29hdCcsIGNvbG9yOjB4MWQxZDFmLCByb3VnaG5lc3M6MC40NSwgbWV0YWxuZXNzOjAuNiB9KSxcbiAgICBjdXA6ICAgIG5ldyBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCh7IG5hbWU6J2N1cGhvbGRlcl9ibGFjaycsIGNvbG9yOjB4MTUxNTE1LCByb3VnaG5lc3M6MC44IH0pLFxuICB9O1xuICBjb25zdCBURVggPSAwLjU7XG4gIGZ1bmN0aW9uIHJib3godywgaCwgZCwgciwgayA9IDcsIGJ1bGdlID0gMCl7XG4gICAgY29uc3QgaGFsZiA9IFt3LzIsIGgvMiwgZC8yXTtcbiAgICBjb25zdCBTID0gaGFsZi5tYXAoaGggPT4geyBjb25zdCBhPVtdOyBmb3IobGV0IGk9aztpPj0wO2ktLSkgYS5wdXNoKC0oaGgtcikgLSByKk1hdGguc2luKGkvaypNYXRoLlBJLzIpKTsgZm9yKGxldCBpPTA7aTw9aztpKyspIGEucHVzaCgoaGgtcikgKyByKk1hdGguc2luKGkvaypNYXRoLlBJLzIpKTsgcmV0dXJuIGE7IH0pO1xuICAgIGNvbnN0IHBvcz1bXSwgbm9yPVtdLCB1dj1bXSwgaWR4PVtdO1xuICAgIGZvciAobGV0IGE9MDthPDM7YSsrKSBmb3IgKGNvbnN0IHMgb2YgWzEsLTFdKXtcbiAgICAgIGNvbnN0IHU9KGErMSklMywgdj0oYSsyKSUzLCBzdT1TW3VdLCBzdj1TW3ZdLCBiYXNlPXBvcy5sZW5ndGgvMztcbiAgICAgIGZvciAobGV0IGo9MDtqPHN2Lmxlbmd0aDtqKyspIGZvciAobGV0IGk9MDtpPHN1Lmxlbmd0aDtpKyspe1xuICAgICAgICBjb25zdCBwPVswLDAsMF07IHBbYV09cypoYWxmW2FdOyBwW3VdPXN1W2ldOyBwW3ZdPXN2W2pdO1xuICAgICAgICBjb25zdCBjPXAubWFwKCh4LG0pPT5NYXRoLm1heCgtKGhhbGZbbV0tciksTWF0aC5taW4oaGFsZlttXS1yLHgpKSk7XG4gICAgICAgIGxldCBvPXAubWFwKCh4LG0pPT54LWNbbV0pOyBjb25zdCBMPU1hdGguaHlwb3QoLi4ubyl8fDE7IG89by5tYXAoeD0+eC9MKTtcbiAgICAgICAgY29uc3QgcT1jLm1hcCgoeCxtKT0+eCtvW21dKnIpO1xuICAgICAgICBwb3MucHVzaCguLi5xKTsgbm9yLnB1c2goLi4ubyk7XG4gICAgICAgIGNvbnN0IGF4PU1hdGguYWJzKG9bMF0pLGF5PU1hdGguYWJzKG9bMV0pLGF6PU1hdGguYWJzKG9bMl0pO1xuICAgICAgICBpZiAoYXk+PWF4JiZheT49YXopIHV2LnB1c2gocVswXS9URVgscVsyXS9URVgpOyBlbHNlIGlmIChheD49YXopIHV2LnB1c2gocVsyXS9URVgscVsxXS9URVgpOyBlbHNlIHV2LnB1c2gocVswXS9URVgscVsxXS9URVgpO1xuICAgICAgfVxuICAgICAgY29uc3QgbnU9c3UubGVuZ3RoO1xuICAgICAgZm9yIChsZXQgaj0wO2o8c3YubGVuZ3RoLTE7aisrKSBmb3IgKGxldCBpPTA7aTxudS0xO2krKyl7XG4gICAgICAgIGNvbnN0IEE9YmFzZStqKm51K2ksIEI9QSsxLCBDPUErbnUrMSwgRD1BK251O1xuICAgICAgICBpZiAocz4wKSBpZHgucHVzaChBLEIsQywgQSxDLEQpOyBlbHNlIGlkeC5wdXNoKEEsQyxCLCBBLEQsQyk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGcgPSBuZXcgVEhSRUUuQnVmZmVyR2VvbWV0cnkoKTtcbiAgICBnLnNldEF0dHJpYnV0ZSgncG9zaXRpb24nLCBuZXcgVEhSRUUuRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZShwb3MsMykpO1xuICAgIGcuc2V0QXR0cmlidXRlKCdub3JtYWwnLCBuZXcgVEhSRUUuRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZShub3IsMykpO1xuICAgIGcuc2V0QXR0cmlidXRlKCd1dicsIG5ldyBUSFJFRS5GbG9hdDMyQnVmZmVyQXR0cmlidXRlKHV2LDIpKTtcbiAgICBnLnNldEluZGV4KGlkeCk7XG4gICAgaWYgKGJ1bGdlKXtcbiAgICAgIGNvbnN0IHA9Zy5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuICAgICAgZm9yIChsZXQgaT0wO2k8cC5jb3VudDtpKyspeyBjb25zdCB4PXAuZ2V0WChpKS9oYWxmWzBdLCB5PXAuZ2V0WShpKS9oYWxmWzFdOyBwLnNldFooaSwgcC5nZXRaKGkpKigxK2J1bGdlKigxLXgqeCkqKDEteSp5KSkpOyB9XG4gICAgICBnLmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCk7XG4gICAgfVxuICAgIHJldHVybiBnO1xuICB9XG4gIGNvbnN0IG1lc2ggPSAoLi4uYSkgPT4gbWsoVEhSRUUsIC4uLmEpO1xuICBjb25zdCBXPTEuODUsIEQ9MC45MjUsIEw9MC4yMCwgQVJNPTAuMjQsIFRPUD0wLjIxLCBHPTAuMDA0O1xuICBjb25zdCBzb2ZhID0gbmV3IFRIUkVFLkdyb3VwKCk7IHNvZmEubmFtZSA9ICdzb2ZhJztcbiAgZm9yIChjb25zdCBbaSxzeF0gb2YgW1sxLC0xXSxbMiwxXV0pXG4gICAgc29mYS5hZGQobWVzaCgnbGFnZV91bnRlbl8nK2ksIHJib3goVy8yLUcsIEwtRywgRCwgMC4wMzUpLCBNLmZhYnJpYywgc3gqVy80LCBMLzIsIDApKTtcbiAgY29uc3QgaGluZ2UgPSBuZXcgVEhSRUUuR3JvdXAoKTsgaGluZ2UubmFtZT0na2xhcHB0ZWlsJzsgaGluZ2UucG9zaXRpb24uc2V0KDAsIEwsIEQvMik7XG4gIGZvciAoY29uc3QgW2ksc3hdIG9mIFtbMSwtMV0sWzIsMV1dKVxuICAgIGhpbmdlLmFkZChtZXNoKCdsYWdlX21pdHRlXycraSwgcmJveChXLzItRywgTC1HLCBELCAwLjAzNSksIE0uZmFicmljLCBzeCpXLzQsIEwvMiwgLUQvMikpO1xuICBzb2ZhLmFkZChoaW5nZSk7XG4gIGNvbnN0IHRvcCA9IG5ldyBUSFJFRS5Hcm91cCgpOyB0b3AubmFtZT0nYXVmYmF1JzsgdG9wLnBvc2l0aW9uLnkgPSAyKkw7XG4gIGZvciAoY29uc3QgW24sc3hdIG9mIFtbJ2xpbmtzJywtMV0sWydyZWNodHMnLDFdXSl7XG4gICAgY29uc3QgeCA9IHN4KihXLzItQVJNLzIpO1xuICAgIHRvcC5hZGQobWVzaCgnYXJtbGVobmVfJytuLCByYm94KEFSTSwgVE9QLCBELCAwLjA1KSwgTS5mYWJyaWMsIHgsIFRPUC8yLCAwKSk7XG4gICAgdG9wLmFkZChtZXNoKCdiZWNoZXJoYWx0ZXJfJytuLCBuZXcgVEhSRUUuQ3lsaW5kZXJHZW9tZXRyeSgwLjA0LDAuMDQsMC4wMTIsNDApLCBNLmN1cCwgeCwgVE9QKzAuMDAxLCBELzItMC4xKSk7XG4gICAgY29uc3QgcmluZyA9IG1lc2goJ2JlY2hlcmhhbHRlcl9yaW5nXycrbiwgbmV3IFRIUkVFLlRvcnVzR2VvbWV0cnkoMC4wNDIsMC4wMDUsMTIsNDApLCBNLm1ldGFsLCB4LCBUT1ArMC4wMDQsIEQvMi0wLjEpO1xuICAgIHJpbmcucm90YXRpb24ueCA9IE1hdGguUEkvMjsgdG9wLmFkZChyaW5nKTtcbiAgfVxuICBjb25zdCBiYWNrVyA9IChXLTIqQVJNKS8yIC0gRztcbiAgZm9yIChjb25zdCBbaSxzeF0gb2YgW1sxLC0xXSxbMiwxXV0pe1xuICAgIHRvcC5hZGQobWVzaCgncnVlY2tlbnRlaWxfJytpLCByYm94KGJhY2tXLCBUT1AsIEFSTSwgMC4wNSksIE0uZmFicmljLCBzeCooYmFja1cvMitHLzIpLCBUT1AvMiwgLUQvMitBUk0vMikpO1xuICAgIGNvbnN0IHAgPSBtZXNoKCdraXNzZW5fJytpLCByYm94KDAuNDUsIDAuNDUsIDAuMTAsIDAuMDQsIDcsIDAuNiksIE0uZmFicmljLCBzeCowLjMzLCAwLjIyLCAtRC8yK0FSTSswLjA4KTtcbiAgICBwLnJvdGF0aW9uLnggPSAtMC4yODsgcC5yb3RhdGlvbi56ID0gc3gqMC4wNjsgdG9wLmFkZChwKTtcbiAgfVxuICBzb2ZhLmFkZCh0b3ApO1xuICBjb25zdCBmejAgPSAtMC4wNSwgZnoxID0gMC4zMCwgZmggPSAwLjM0LCByciA9IDAuMDA4LCBSID0gMC4wNDUsIHkwID0gMC4wMiwgeXQgPSB5MCArIGZoO1xuICBmb3IgKGNvbnN0IFtuLHN4XSBvZiBbWydsaW5rcycsLTFdLFsncmVjaHRzJywxXV0pe1xuICAgIGNvbnN0IGZyYW1lID0gbmV3IFRIUkVFLkdyb3VwKCk7IGZyYW1lLm5hbWU9J3NlaXRlbmdlc3RlbGxfJytuO1xuICAgIGNvbnN0IGZ4ID0gc3gqKFcvMiArIDAuMDEyKTtcbiAgICBmb3IgKGNvbnN0IHogb2YgW2Z6MCwgZnoxXSkgZnJhbWUuYWRkKG1lc2goJ2dlc3RlbGxfc3RhYl8nK24sIG5ldyBUSFJFRS5DeWxpbmRlckdlb21ldHJ5KHJyLHJyLGZoLVIsMjApLCBNLm1ldGFsLCBmeCwgeTArKGZoLVIpLzIsIHopKTtcbiAgICBjb25zdCBiYXIgPSBtZXNoKCdnZXN0ZWxsX3F1ZXJfJytuLCBuZXcgVEhSRUUuQ3lsaW5kZXJHZW9tZXRyeShycixycixmejEtZnowLTIqUiwyMCksIE0ubWV0YWwsIGZ4LCB5dCwgKGZ6MCtmejEpLzIpOyBiYXIucm90YXRpb24ueD1NYXRoLlBJLzI7IGZyYW1lLmFkZChiYXIpO1xuICAgIGZvciAoY29uc3QgW3oscnldIG9mIFtbZnowK1IsIE1hdGguUEkvMl0sW2Z6MS1SLCAtTWF0aC5QSS8yXV0pe1xuICAgICAgY29uc3QgYyA9IG1lc2goJ2dlc3RlbGxfYm9nZW5fJytuLCBuZXcgVEhSRUUuVG9ydXNHZW9tZXRyeShSLCByciwgMTYsIDI0LCBNYXRoLlBJLzIpLCBNLm1ldGFsLCBmeCwgeXQtUiwgeik7IGMucm90YXRpb24ueSA9IHJ5OyBmcmFtZS5hZGQoYyk7XG4gICAgfVxuICAgIHNvZmEuYWRkKGZyYW1lKTtcbiAgfVxuICByZXR1cm4geyBncm91cDogc29mYSwgTSwgRCB9O1xufVxuXG5mdW5jdGlvbiBidWlsZFJlZ2FsKFRIUkVFLCBNKXtcbiAgY29uc3QgYm94ID0gKHcsIGgsIGQpID0+IHtcbiAgICBjb25zdCBnID0gbmV3IFRIUkVFLkJveEdlb21ldHJ5KHcsIGgsIGQpLCB1diA9IGcuYXR0cmlidXRlcy51djtcbiAgICBjb25zdCBmYWNlcyA9IFtbZCxoXSxbZCxoXSxbdyxkXSxbdyxkXSxbdyxoXSxbdyxoXV07XG4gICAgZm9yIChsZXQgZj0wOyBmPDY7IGYrKykgZm9yIChsZXQgaT0wO2k8NDtpKyspeyBjb25zdCBrPWYqNCtpOyB1di5zZXRYWShrLCB1di5nZXRYKGspKmZhY2VzW2ZdWzBdLCB1di5nZXRZKGspKmZhY2VzW2ZdWzFdKTsgfVxuICAgIHJldHVybiBnO1xuICB9O1xuICBjb25zdCBtZXNoID0gKC4uLmEpID0+IG1rKFRIUkVFLCAuLi5hKTtcbiAgY29uc3QgVz0wLjYwLCBEPTAuMjcsIEg9MC43NCwgQT0wLjAzLCBUPTAuMDAxNSwgTElQPTAuMDIsIEZPT1Q9MC4wMTI7XG4gIGNvbnN0IHNoZWxmVG9wcyA9IFswLjEwLCAwLjQyLCBIXTtcbiAgY29uc3QgcmVnYWwgPSBuZXcgVEhSRUUuR3JvdXAoKTsgcmVnYWwubmFtZT0ncmVnYWwnO1xuICBjb25zdCBwb3N0SCA9IEggLSBGT09UO1xuICBmb3IgKGNvbnN0IFtuLHN4LHN6XSBvZiBbWyd2bCcsLTEsMV0sWyd2cicsMSwxXSxbJ2hsJywtMSwtMV0sWydocicsMSwtMV1dKXtcbiAgICBjb25zdCBwID0gbmV3IFRIUkVFLkdyb3VwKCk7IHAubmFtZT0ncGZvc3Rlbl8nK247XG4gICAgY29uc3QgY3ggPSBzeCooVy8yIC0gQS8yKSwgY3ogPSBzeiooRC8yIC0gQS8yKSwgeSA9IEZPT1QgKyBwb3N0SC8yO1xuICAgIHAuYWRkKG1lc2goJ3Bmb3N0ZW5fJytuKydfYScsIGJveChBLCBwb3N0SCwgVCksIE0uY29uY3JldGUsIGN4LCB5LCBzeiooRC8yIC0gVC8yKSkpO1xuICAgIHAuYWRkKG1lc2goJ3Bmb3N0ZW5fJytuKydfYicsIGJveChULCBwb3N0SCwgQSksIE0uY29uY3JldGUsIHN4KihXLzIgLSBULzIpLCB5LCBjeikpO1xuICAgIHAuYWRkKG1lc2goJ2Z1c3NfJytuLCBib3goQSswLjAwMiwgRk9PVCwgQSswLjAwMiksIE0uZm9vdCwgY3gsIEZPT1QvMiwgY3opKTtcbiAgICBmb3IgKGNvbnN0IHRvcCBvZiBzaGVsZlRvcHMpe1xuICAgICAgY29uc3QgeWIgPSB0b3AgLSBMSVAvMjtcbiAgICAgIGNvbnN0IGIxID0gbWVzaCgnc2NocmF1YmVfJytuLCBuZXcgVEhSRUUuQ3lsaW5kZXJHZW9tZXRyeSgwLjAwNCwwLjAwNCwwLjAwMywxNiksIE0uYm9sdCwgY3gsIHliLCBzeiooRC8yKzAuMDAxKSk7IGIxLnJvdGF0aW9uLnggPSBNYXRoLlBJLzI7IHAuYWRkKGIxKTtcbiAgICAgIGNvbnN0IGIyID0gbWVzaCgnc2NocmF1YmVfJytuLCBuZXcgVEhSRUUuQ3lsaW5kZXJHZW9tZXRyeSgwLjAwNCwwLjAwNCwwLjAwMywxNiksIE0uYm9sdCwgc3gqKFcvMiswLjAwMSksIHliLCBjeik7IGIyLnJvdGF0aW9uLnogPSBNYXRoLlBJLzI7IHAuYWRkKGIyKTtcbiAgICB9XG4gICAgcmVnYWwuYWRkKHApO1xuICB9XG4gIHNoZWxmVG9wcy5mb3JFYWNoKCh0b3AsIGkpID0+IHtcbiAgICBjb25zdCBzID0gbmV3IFRIUkVFLkdyb3VwKCk7IHMubmFtZT0nYm9kZW5fJysoaSsxKTtcbiAgICBjb25zdCBpdyA9IFcgLSAyKlQsIGlkID0gRCAtIDIqVDtcbiAgICBzLmFkZChtZXNoKCdib2Rlbl8nKyhpKzEpKydfcGxhdHRlJywgYm94KGl3LCBULCBpZCksIE0uY29uY3JldGUsIDAsIHRvcCAtIFQvMiwgMCkpO1xuICAgIGZvciAoY29uc3Qgc3ogb2YgWzEsLTFdKSBzLmFkZChtZXNoKCdib2Rlbl8nKyhpKzEpKydfa2FudGVfeicsIGJveChpdywgTElQLCBUKSwgTS5jb25jcmV0ZSwgMCwgdG9wIC0gTElQLzIsIHN6KihpZC8yIC0gVC8yKSkpO1xuICAgIGZvciAoY29uc3Qgc3ggb2YgWzEsLTFdKSBzLmFkZChtZXNoKCdib2Rlbl8nKyhpKzEpKydfa2FudGVfeCcsIGJveChULCBMSVAsIGlkKSwgTS5jb25jcmV0ZSwgc3gqKGl3LzIgLSBULzIpLCB0b3AgLSBMSVAvMiwgMCkpO1xuICAgIHJlZ2FsLmFkZChzKTtcbiAgfSk7XG4gIHJldHVybiByZWdhbDtcbn1cbmZ1bmN0aW9uIHJlZ2FsTWF0ZXJpYWxzKFRIUkVFKXtcbiAgcmV0dXJuIHtcbiAgICBjb25jcmV0ZTogZ2FsdmFuaXplZE1hdGVyaWFsKFRIUkVFLCAxOCksIC8vIHZlcnppbmt0ZXIgU3RhaGwsIFRleHR1ciDigJ5GZWlu4oCcXG4gICAgZm9vdDogICAgIG5ldyBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCh7IG5hbWU6J2t1bnN0c3RvZmZfZnVzcycsIGNvbG9yOjB4MmEyYTJhLCByb3VnaG5lc3M6MC43IH0pLFxuICAgIGJvbHQ6ICAgICBuZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoeyBuYW1lOidzY2hyYXViZScsIGNvbG9yOjB4OGM4YzhjLCByb3VnaG5lc3M6MC4zNSwgbWV0YWxuZXNzOjAuOSB9KSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRMYW1wZShUSFJFRSl7XG4gIGNvbnN0IFYgPSAoeCx5LHo9MCkgPT4gbmV3IFRIUkVFLlZlY3RvcjMoeCx5LHopO1xuICBjb25zdCBNID0ge1xuICAgIGNocm9tOiAgbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgbmFtZTonY2hyb20nLCBjb2xvcjoweGQ4ZGFkZCwgbWV0YWxuZXNzOjAuNSwgcm91Z2huZXNzOjAuMjUgfSksXG4gICAgc2NoaXJtOiBuZXcgVEhSRUUuTWVzaFBoeXNpY2FsTWF0ZXJpYWwoeyBuYW1lOidhY3J5bF93ZWlzcycsIGNvbG9yOjB4ZjdmN2Y1LCByb3VnaG5lc3M6MC4yOCwgY2xlYXJjb2F0OjAuOCwgY2xlYXJjb2F0Um91Z2huZXNzOjAuMSwgc2lkZTpUSFJFRS5Eb3VibGVTaWRlIH0pLFxuICAgIGJpcm5lOiAgbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgbmFtZTonbGV1Y2h0bWl0dGVsJywgY29sb3I6MHhmZmZmZmYsIGVtaXNzaXZlOjB4ZmZmMWQ2LCBlbWlzc2l2ZUludGVuc2l0eTowLjIgfSksXG4gIH07XG4gIGNvbnN0IGFkZCA9IChwYXJlbnQsIG5hbWUsIGdlbywgbWF0LCBwPVswLDAsMF0sIHI9WzAsMCwwXSkgPT4geyBjb25zdCBtID0gbmV3IFRIUkVFLk1lc2goZ2VvLCBtYXQpOyBtLm5hbWUgPSBuYW1lOyBtLnBvc2l0aW9uLnNldCguLi5wKTsgbS5yb3RhdGlvbi5zZXQoLi4ucik7IHBhcmVudC5hZGQobSk7IHJldHVybiBtOyB9O1xuICBjb25zdCBsYW1wZSA9IG5ldyBUSFJFRS5Hcm91cCgpOyBsYW1wZS5uYW1lID0gJ2JvZ2VubGFtcGUnO1xuICBjb25zdCBIID0gMS42NiwgUkVBQ0ggPSAxLjIyLCBTSF9SID0gMC4xNSwgQkFTRV9SID0gMC4xMywgQkFTRV9IID0gMC4wMjgsIFBPTEVfUiA9IDAuMDEyNSwgQVJDX1IgPSAwLjAwODUsIFBPTEVfVE9QID0gMC43NDtcbiAgY29uc3QgcHJvZiA9IFtuZXcgVEhSRUUuVmVjdG9yMigwLCAwKSwgbmV3IFRIUkVFLlZlY3RvcjIoQkFTRV9SIC0gMC4wMDQsIDApXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPD0gMTA7IGkrKyl7IGNvbnN0IGEgPSAtTWF0aC5QSS8yICsgaS8xMCpNYXRoLlBJLzI7IHByb2YucHVzaChuZXcgVEhSRUUuVmVjdG9yMihCQVNFX1IgLSAwLjAwOCArIE1hdGguY29zKGEpKjAuMDA4LCAwLjAwOCArIE1hdGguc2luKGEpKjAuMDA4KSk7IH1cbiAgZm9yIChsZXQgaSA9IDA7IGkgPD0gMTA7IGkrKyl7IGNvbnN0IGEgPSBpLzEwKk1hdGguUEkvMjsgcHJvZi5wdXNoKG5ldyBUSFJFRS5WZWN0b3IyKEJBU0VfUiAtIDAuMDEyICsgTWF0aC5jb3MoYSkqMC4wMTIsIEJBU0VfSCAtIDAuMDEyICsgTWF0aC5zaW4oYSkqMC4wMTIpKTsgfVxuICBwcm9mLnB1c2gobmV3IFRIUkVFLlZlY3RvcjIoMCwgQkFTRV9IKSk7XG4gIGFkZChsYW1wZSwgJ2Z1c3MnLCBuZXcgVEhSRUUuTGF0aGVHZW9tZXRyeShwcm9mLCA5NiksIE0uY2hyb20pO1xuICBhZGQobGFtcGUsICdmdXNzX3Jvc2V0dGUnLCBuZXcgVEhSRUUuQ3lsaW5kZXJHZW9tZXRyeSgwLjAyMiwgMC4wMjYsIDAuMDEyLCA0OCksIE0uY2hyb20sIFswLCBCQVNFX0ggKyAwLjAwNiwgMF0pO1xuICBhZGQobGFtcGUsICdzdGFuZHJvaHInLCBuZXcgVEhSRUUuQ3lsaW5kZXJHZW9tZXRyeShQT0xFX1IsIFBPTEVfUiwgUE9MRV9UT1AgLSBCQVNFX0gsIDQ4KSwgTS5jaHJvbSwgWzAsIChQT0xFX1RPUCArIEJBU0VfSCkvMiwgMF0pO1xuICBhZGQobGFtcGUsICdtdWZmZV91bnRlbicsIG5ldyBUSFJFRS5DeWxpbmRlckdlb21ldHJ5KFBPTEVfUiArIDAuMDAxNSwgUE9MRV9SICsgMC4wMDE1LCAwLjAzLCA0OCksIE0uY2hyb20sIFswLCBQT0xFX1RPUCAtIDAuMDE1LCAwXSk7XG4gIGNvbnN0IEFSQ19FTkQgPSBWKFJFQUNIIC0gMC4wNCwgSCAtIEFSQ19SKTtcbiAgY29uc3QgYXJjID0gbmV3IFRIUkVFLkN1YmljQmV6aWVyQ3VydmUzKFYoMCwgUE9MRV9UT1AgLSAwLjAyKSwgVigwLCAxLjM4KSwgVigwLjQyLCBIIC0gQVJDX1IpLCBBUkNfRU5EKTtcbiAgYWRkKGxhbXBlLCAnYm9nZW4nLCBuZXcgVEhSRUUuVHViZUdlb21ldHJ5KGFyYywgMjQwLCBBUkNfUiwgMzIpLCBNLmNocm9tKTtcbiAgY29uc3QgcE0gPSBhcmMuZ2V0UG9pbnRBdCgwLjM2KSwgZE0gPSBhcmMuZ2V0VGFuZ2VudEF0KDAuMzYpO1xuICBjb25zdCBtdWZmZSA9IGFkZChsYW1wZSwgJ211ZmZlX2JvZ2VuJywgbmV3IFRIUkVFLkN5bGluZGVyR2VvbWV0cnkoQVJDX1IgKyAwLjAwMTgsIEFSQ19SICsgMC4wMDE4LCAwLjAzNSwgMzIpLCBNLmNocm9tLCBbcE0ueCwgcE0ueSwgMF0pO1xuICBtdWZmZS5xdWF0ZXJuaW9uLnNldEZyb21Vbml0VmVjdG9ycyhWKDAsMSwwKSwgZE0pO1xuICBhZGQobGFtcGUsICdlbmRrYXBwZScsIG5ldyBUSFJFRS5DeWxpbmRlckdlb21ldHJ5KEFSQ19SICsgMC4wMDIsIEFSQ19SICsgMC4wMDIsIDAuMDcsIDMyKSwgTS5jaHJvbSwgW0FSQ19FTkQueCAtIDAuMDIsIEFSQ19FTkQueSwgMF0sIFswLCAwLCBNYXRoLlBJLzJdKTtcbiAgY29uc3Qga29wZiA9IG5ldyBUSFJFRS5Hcm91cCgpOyBrb3BmLm5hbWUgPSAnc2NoaXJtX2dydXBwZSc7XG4gIGNvbnN0IFRJTFQgPSAwLjM7XG4gIGtvcGYucG9zaXRpb24uc2V0KFJFQUNIIC0gU0hfUipNYXRoLnNpbihUSUxUKSwgSCAtIEFSQ19SIC0gMC4wMzUsIDApO1xuICBrb3BmLnJvdGF0aW9uLnogPSBUSUxUO1xuICBhZGQobGFtcGUsICdnZWxlbmsnLCBuZXcgVEhSRUUuQ3lsaW5kZXJHZW9tZXRyeSgwLjAwNiwgMC4wMDYsIDAuMDMsIDIwKSwgTS5jaHJvbSwgW2tvcGYucG9zaXRpb24ueCwgSCAtIEFSQ19SIC0gMC4wMTgsIDBdKTtcbiAgbGFtcGUuYWRkKGtvcGYpO1xuICBhZGQoa29wZiwgJ3NjaGlybScsIG5ldyBUSFJFRS5TcGhlcmVHZW9tZXRyeShTSF9SLCA5NiwgNDgsIDAsIE1hdGguUEkqMiwgMCwgMS45NSksIE0uc2NoaXJtLCBbMCwgLVNIX1IsIDBdKTtcbiAgYWRkKGtvcGYsICdzY2hpcm1fbmFiZScsIG5ldyBUSFJFRS5DeWxpbmRlckdlb21ldHJ5KDAuMDE4LCAwLjAyOCwgMC4wMiwgNDApLCBNLmNocm9tLCBbMCwgLTAuMDA0LCAwXSk7XG4gIGFkZChrb3BmLCAnZmFzc3VuZycsIG5ldyBUSFJFRS5DeWxpbmRlckdlb21ldHJ5KDAuMDE2LCAwLjAxNiwgMC4wNSwgMzIpLCBNLmNocm9tLCBbMCwgLTAuMDQsIDBdKTtcbiAgYWRkKGtvcGYsICdsZXVjaHRtaXR0ZWwnLCBuZXcgVEhSRUUuU3BoZXJlR2VvbWV0cnkoMC4wMywgMzIsIDE2KSwgTS5iaXJuZSwgWzAsIC0wLjA5LCAwXSk7XG4gIHJldHVybiB7IGdyb3VwOiBsYW1wZSwgUkVBQ0ggfTtcbn1cblxuLy8gVmVyemlua3RlciBTdGFobCAoWmluay1TcGFuZ2xlLCBwcm96ZWR1cmFsKSDigJMgYXVzIFJlZ2FsIDNEXG5mdW5jdGlvbiBnYWx2YW5pemVkKHNpemU9MTAyNCwgY2VsbHM9MjQsIHNlZWQ9Nyl7XG4gIGxldCBzID0gc2VlZDsgY29uc3Qgcm5kID0gKCkgPT4gKHMgPSAocyoxNjgwNykgJSAyMTQ3NDgzNjQ3KSAvIDIxNDc0ODM2NDc7XG4gIGNvbnN0IGcgPSBjZWxscywgcHRzID0gW107XG4gIGZvciAobGV0IGo9MDtqPGc7aisrKSBmb3IgKGxldCBpPTA7aTxnO2krKyl7XG4gICAgY29uc3QgYSA9IHJuZCgpKk1hdGguUEkqMjtcbiAgICBwdHMucHVzaCh7IHg6KGkrcm5kKCkpL2csIHk6KGorcm5kKCkpL2csIGJhc2U6IDAuNzIgKyBybmQoKSowLjE4LCBneDpNYXRoLmNvcyhhKSwgZ3k6TWF0aC5zaW4oYSksIGs6IDAuMDMgKyBybmQoKSowLjA4LCByOiBybmQoKSB9KTtcbiAgfVxuICBjb25zdCBjb2wgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTsgY29sLndpZHRoID0gY29sLmhlaWdodCA9IHNpemU7XG4gIGNvbnN0IHJvdSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpOyByb3Uud2lkdGggPSByb3UuaGVpZ2h0ID0gc2l6ZTtcbiAgY29uc3QgY2MgPSBjb2wuZ2V0Q29udGV4dCgnMmQnKSwgcmMgPSByb3UuZ2V0Q29udGV4dCgnMmQnKTtcbiAgY29uc3QgY2kgPSBjYy5jcmVhdGVJbWFnZURhdGEoc2l6ZSxzaXplKSwgcmkgPSByYy5jcmVhdGVJbWFnZURhdGEoc2l6ZSxzaXplKTtcbiAgZm9yIChsZXQgeT0wO3k8c2l6ZTt5KyspIGZvciAobGV0IHg9MDt4PHNpemU7eCsrKXtcbiAgICBjb25zdCB1ID0geC9zaXplLCB2ID0geS9zaXplLCBjeCA9IE1hdGguZmxvb3IodSpnKSwgY3kgPSBNYXRoLmZsb29yKHYqZyk7XG4gICAgbGV0IGJlc3QgPSA5LCBzZWNvbmQgPSA5LCBicCA9IG51bGwsIGJkeD0wLCBiZHk9MDtcbiAgICBmb3IgKGxldCBveT0tMTtveTw9MTtveSsrKSBmb3IgKGxldCBveD0tMTtveDw9MTtveCsrKXtcbiAgICAgIGNvbnN0IGl4ID0gKGN4K294K2cpJWcsIGl5ID0gKGN5K295K2cpJWcsIHAgPSBwdHNbaXkqZytpeF07XG4gICAgICBjb25zdCBkeCA9IHUgLSAocC54ICsgTWF0aC5mbG9vcigoY3grb3gpL2cpICogMSArICgoY3grb3gpPDA/MDowKSkgLCBkeSA9IHYgLSAocC55ICsgTWF0aC5mbG9vcigoY3krb3kpL2cpKTtcbiAgICAgIGNvbnN0IGQgPSBkeCpkeCArIGR5KmR5O1xuICAgICAgaWYgKGQgPCBiZXN0KXsgc2Vjb25kID0gYmVzdDsgYmVzdCA9IGQ7IGJwID0gcDsgYmR4ID0gZHg7IGJkeSA9IGR5OyB9IGVsc2UgaWYgKGQgPCBzZWNvbmQpIHNlY29uZCA9IGQ7XG4gICAgfVxuICAgIGNvbnN0IGVkZ2UgPSBNYXRoLnNxcnQoc2Vjb25kKSAtIE1hdGguc3FydChiZXN0KTsgICAgICAgICAgICAvLyBBYnN0YW5kIHp1ciBLb3JuZ3JlbnplXG4gICAgbGV0IGwgPSBicC5iYXNlICsgKGJkeCpicC5neCArIGJkeSpicC5neSkgKiBnICogYnAuazsgICAgICAgIC8vIEZhY2V0dGVuLVZlcmxhdWYgcHJvIEtvcm5cbiAgICBsICs9IChNYXRoLnJhbmRvbSgpLTAuNSkqMC4wNTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmVpbmVzIEtvcm5cbiAgICBpZiAoZWRnZSA8IDAuMDAxOCkgbCAtPSAwLjAzNTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGR1bmtsZSBLb3JuZ3JlbnplblxuICAgIGlmIChNYXRoLnJhbmRvbSgpIDwgMC4wMDMpIGwgLT0gMC4xMjsgICAgICAgICAgICAgICAgICAgICAgICAvLyBkdW5rbGUgU3ByZW5rZWxcbiAgICBsID0gTWF0aC5tYXgoMC4yNSwgTWF0aC5taW4oMC45NywgbCkpO1xuICAgIGNvbnN0IG8gPSAoeSpzaXplK3gpKjQsIGMgPSBsKjI1NTtcbiAgICBjaS5kYXRhW29dPWMqMC45ODsgY2kuZGF0YVtvKzFdPWM7IGNpLmRhdGFbbysyXT1jKjEuMDI7IGNpLmRhdGFbbyszXT0yNTU7XG4gICAgY29uc3QgciA9ICgwLjI4ICsgKDEtbCkqMC4zNSArIGJwLnIqMC4xMikgKiAyNTU7ICAgICAgICAgICAgIC8vIGhlbGxlIEvDtnJuZXIgZ2zDpG56ZW5kZXJcbiAgICByaS5kYXRhW29dPXJpLmRhdGFbbysxXT1yaS5kYXRhW28rMl09cjsgcmkuZGF0YVtvKzNdPTI1NTtcbiAgfVxuICBjYy5wdXRJbWFnZURhdGEoY2ksMCwwKTsgcmMucHV0SW1hZ2VEYXRhKHJpLDAsMCk7XG4gIHJldHVybiB7IGNvbCwgcm91IH07XG59XG5mdW5jdGlvbiBnYWx2YW5pemVkTWF0ZXJpYWwoVEhSRUUsIHJlcGVhdCA9IDE4KXtcbiAgY29uc3QgeyBjb2wsIHJvdSB9ID0gZ2FsdmFuaXplZCgpO1xuICBjb25zdCBtayA9IChjLCBzcmdiKSA9PiB7IGNvbnN0IHQgPSBuZXcgVEhSRUUuQ2FudmFzVGV4dHVyZShjKTsgdC53cmFwUyA9IHQud3JhcFQgPSBUSFJFRS5SZXBlYXRXcmFwcGluZzsgdC5yZXBlYXQuc2V0KHJlcGVhdCwgcmVwZWF0KTtcbiAgICBpZiAoc3JnYikgdC5jb2xvclNwYWNlID0gVEhSRUUuU1JHQkNvbG9yU3BhY2U7IHQuYW5pc290cm9weSA9IDg7IHJldHVybiB0OyB9O1xuICByZXR1cm4gbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgbmFtZTonc3RhaGxfdmVyemlua3QnLCBtYXA6IG1rKGNvbCwgdHJ1ZSksIHJvdWdobmVzc01hcDogbWsocm91KSwgYnVtcE1hcDogbWsoY29sKSwgYnVtcFNjYWxlOiAwLjI1LFxuICAgIGNvbG9yOiAweGVjZWVmMCwgcm91Z2huZXNzOiAxLCBtZXRhbG5lc3M6IDAuMyB9KTtcbn1cblxuLy8gUmVnYWxsYXV0c3ByZWNoZXItUGFhciAoYXVzIEJveGVuIDNEKTogcGFzc2l2ICsgYWt0aXYgKEJlZGllbmZlbGQgYW4gbG9rYWxlciAreC1TZWl0ZSlcbmZ1bmN0aW9uIGJ1aWxkQm94ZW4oVEhSRUUpe1xuICBjb25zdCBNID0ge1xuICAgIHdvb2Q6ICAgbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgbmFtZTonZWljaGUnLCBjb2xvcjoweGI3N2EzZSwgcm91Z2huZXNzOjAuNTUgfSksXG4gICAgZmFicmljOiBuZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoeyBuYW1lOidzdG9mZl9ncmF1JywgY29sb3I6MHg2YzZjNmEsIHJvdWdobmVzczowLjk3IH0pLFxuICAgIHN0cmlwOiAgbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgbmFtZTonemllcmxlaXN0ZV9zaWxiZXInLCBjb2xvcjoweGM5YzljOSwgcm91Z2huZXNzOjAuMywgbWV0YWxuZXNzOjAuOSB9KSxcbiAgICBibGFjazogIG5ldyBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCh7IG5hbWU6J2t1bnN0c3RvZmZfc2Nod2FyeicsIGNvbG9yOjB4MWMxYzFjLCByb3VnaG5lc3M6MC42IH0pLFxuICAgIGtub2I6ICAgbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgbmFtZTonZHJlaHJlZ2xlcicsIGNvbG9yOjB4MTQxNDE0LCByb3VnaG5lc3M6MC40LCBtZXRhbG5lc3M6MC4yIH0pLFxuICAgIGFsdTogICAgbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgbmFtZTonaG9jaHRvZW5lcl9hbHUnLCBjb2xvcjoweGFhYWFhYSwgcm91Z2huZXNzOjAuMzUsIG1ldGFsbmVzczowLjggfSksXG4gICAgbGVkOiAgICBuZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoeyBuYW1lOidsZWQnLCBjb2xvcjoweDBhMmExMCwgZW1pc3NpdmU6MHgyYmQ0NWEsIGVtaXNzaXZlSW50ZW5zaXR5OjEuMiB9KSxcbiAgfTtcbiAgY29uc3QgVz0wLjE0NiwgRD0wLjE5NiwgSD0wLjIzNCwgUj0wLjAxNCwgQlY9MC4wMDI7XG4gIGNvbnN0IG1lc2ggPSAobmFtZSwgZ2VvLCBtYXQsIHg9MCwgeT0wLCB6PTApID0+IG1rKFRIUkVFLCBuYW1lLCBnZW8sIG1hdCwgeCwgeSwgeik7XG4gIGNvbnN0IHJyZWN0ID0gKHcsIGgsIHIpID0+IHsgY29uc3QgcyA9IG5ldyBUSFJFRS5TaGFwZSgpLCB4PS13LzIsIHk9LWgvMjtcbiAgICBzLm1vdmVUbyh4K3IseSk7IHMubGluZVRvKHgrdy1yLHkpOyBzLnF1YWRyYXRpY0N1cnZlVG8oeCt3LHkseCt3LHkrcik7IHMubGluZVRvKHgrdyx5K2gtcik7IHMucXVhZHJhdGljQ3VydmVUbyh4K3cseStoLHgrdy1yLHkraCk7XG4gICAgcy5saW5lVG8oeCtyLHkraCk7IHMucXVhZHJhdGljQ3VydmVUbyh4LHkraCx4LHkraC1yKTsgcy5saW5lVG8oeCx5K3IpOyBzLnF1YWRyYXRpY0N1cnZlVG8oeCx5LHgrcix5KTsgcmV0dXJuIHM7IH07XG4gIGNvbnN0IGNhYkdlbyA9IG5ldyBUSFJFRS5FeHRydWRlR2VvbWV0cnkocnJlY3QoVy0yKkJWLCBELTIqQlYsIFIpLCB7IGRlcHRoOkgtMipCViwgYmV2ZWxFbmFibGVkOnRydWUsIGJldmVsU2l6ZTpCViwgYmV2ZWxUaGlja25lc3M6QlYsIGJldmVsU2VnbWVudHM6MiwgY3VydmVTZWdtZW50czoxMCB9KTtcbiAgY2FiR2VvLnJvdGF0ZVgoLU1hdGguUEkvMik7IGNhYkdlby50cmFuc2xhdGUoMCwgQlYsIDApO1xuICB7IGNvbnN0IHAgPSBjYWJHZW8uYXR0cmlidXRlcy5wb3NpdGlvbiwgbiA9IGNhYkdlby5hdHRyaWJ1dGVzLm5vcm1hbCwgdXYgPSBjYWJHZW8uYXR0cmlidXRlcy51djtcbiAgICBmb3IgKGxldCBpPTA7aTxwLmNvdW50O2krKyl7IGNvbnN0IHg9cC5nZXRYKGkpLCB5PXAuZ2V0WShpKSwgej1wLmdldFooaSk7XG4gICAgICBpZiAoTWF0aC5hYnMobi5nZXRZKGkpKSA+IDAuNykgdXYuc2V0WFkoaSwgeCwgeik7IGVsc2UgdXYuc2V0WFkoaSwgTWF0aC5hYnMobi5nZXRYKGkpKSA+IE1hdGguYWJzKG4uZ2V0WihpKSkgPyB6IDogeCwgeSk7IH0gfVxuICBjb25zdCBHVz1XLTAuMDA2LCBHSD1ILTAuMDA2LCBHVD0wLjAwODtcbiAgY29uc3QgZ3JpbGxlR2VvID0gbmV3IFRIUkVFLkV4dHJ1ZGVHZW9tZXRyeShycmVjdChHVy0wLjAwNCwgR0gtMC4wMDQsIDAuMDA5KSwgeyBkZXB0aDpHVC0wLjAwMywgYmV2ZWxFbmFibGVkOnRydWUsIGJldmVsU2l6ZTowLjAwMiwgYmV2ZWxUaGlja25lc3M6MC4wMDE1LCBiZXZlbFNlZ21lbnRzOjMsIGN1cnZlU2VnbWVudHM6OCB9KTtcbiAgZnVuY3Rpb24gc3BlYWtlcihuYW1lLCBhY3RpdmUpe1xuICAgIGNvbnN0IHMgPSBuZXcgVEhSRUUuR3JvdXAoKTsgcy5uYW1lID0gbmFtZTtcbiAgICBzLmFkZChtZXNoKG5hbWUrJ19nZWhhZXVzZScsIGNhYkdlbywgTS53b29kKSk7XG4gICAgcy5hZGQobWVzaChuYW1lKydfc3RvZmYnLCBncmlsbGVHZW8sIE0uZmFicmljLCAwLCBILzIsIEQvMiArIDAuMDAxNSkpO1xuICAgIHMuYWRkKG1lc2gobmFtZSsnX3ppZXJsZWlzdGUnLCBuZXcgVEhSRUUuQm94R2VvbWV0cnkoR1cqMC43NCwgMC4wMDI2LCAwLjAwMTIpLCBNLnN0cmlwLCAwLCBIKjAuNTg1LCBELzIgKyBHVCArIDAuMDAwNSkpO1xuICAgIHMuYWRkKG1lc2gobmFtZSsnX2xvZ28nLCBuZXcgVEhSRUUuQm94R2VvbWV0cnkoMC4wMjYsIDAuMDA2LCAwLjAwMDgpLCBNLnN0cmlwLCAwLCAwLjAyNiwgRC8yICsgR1QgKyAwLjAwMDMpKTtcbiAgICBjb25zdCBwb3J0ID0gbWVzaChuYW1lKydfYmFzc3JlZmxleCcsIG5ldyBUSFJFRS5DeWxpbmRlckdlb21ldHJ5KDAuMDE0LCAwLjAxNCwgMC4wMDQsIDMyKSwgTS5ibGFjaywgMCwgMC4xNywgLUQvMiAtIDAuMDAxKTtcbiAgICBwb3J0LnJvdGF0aW9uLnggPSBNYXRoLlBJLzI7IHMuYWRkKHBvcnQpO1xuICAgIGZvciAoY29uc3QgW2Z4LGZ6XSBvZiBbWy0xLC0xXSxbMSwtMV0sWy0xLDFdLFsxLDFdXSlcbiAgICAgIHMuYWRkKG1lc2gobmFtZSsnX2Z1c3MnLCBuZXcgVEhSRUUuQ3lsaW5kZXJHZW9tZXRyeSgwLjAwNiwwLjAwNiwwLjAwMiwyMCksIE0uYmxhY2ssIGZ4KihXLzItMC4wMiksIDAuMDAxLCBmeiooRC8yLTAuMDI1KSkpO1xuICAgIGlmIChhY3RpdmUpe1xuICAgICAgY29uc3QgcHggPSBXLzIgKyAwLjAwMDQsIGN6ID0gLTAuMDEyO1xuICAgICAgcy5hZGQobWVzaChuYW1lKydfYmVkaWVuZmVsZCcsIG5ldyBUSFJFRS5Cb3hHZW9tZXRyeSgwLjAwMiwgMC4xMDgsIDAuMDU1KSwgTS5ibGFjaywgcHgsIDAuMTQsIGN6KSk7XG4gICAgICBbMC4xNzYsIDAuMTQzLCAwLjExXS5mb3JFYWNoKCh5LCBpKSA9PiB7XG4gICAgICAgIGNvbnN0IGsgPSBtZXNoKG5hbWUrJ19yZWdsZXJfJytbJ2hvZWhlbicsJ2Jhc3MnLCdsYXV0c3RhZXJrZSddW2ldLCBuZXcgVEhSRUUuQ3lsaW5kZXJHZW9tZXRyeSgwLjAwODUsIDAuMDA4NSwgMC4wMTEsIDI4KSwgTS5rbm9iLCBweCswLjAwNTUsIHksIGN6LTAuMDA0KTtcbiAgICAgICAgay5yb3RhdGlvbi56ID0gTWF0aC5QSS8yOyBzLmFkZChrKTtcbiAgICAgIH0pO1xuICAgICAgcy5hZGQobWVzaChuYW1lKydfbGVkJywgbmV3IFRIUkVFLlNwaGVyZUdlb21ldHJ5KDAuMDAxNSwgMTIsIDgpLCBNLmxlZCwgcHgrMC4wMDEsIDAuMDkzLCBjei0wLjAwNCkpO1xuICAgIH1cbiAgICBzLnRyYXZlcnNlKG8gPT4geyBpZiAoby5pc01lc2gpIG8ucG9zaXRpb24ueSArPSAwLjAwMjsgfSk7XG4gICAgcmV0dXJuIHM7XG4gIH1cbiAgcmV0dXJuIHsgVywgRCwgSCwgbGlua3M6IHNwZWFrZXIoJ2JveF9saW5rcycsIGZhbHNlKSwgcmVjaHRzOiBzcGVha2VyKCdib3hfcmVjaHRzX2FrdGl2JywgdHJ1ZSkgfTtcbn1cblxuLy8gVHJpcG9kLUxhbXBlIChhdXMgVHJpcG9kbGFtcGUgM0QpOiBFaWNoZW4tTGV1Y2h0a29wZiBtaXQgTEVELVNwb3QgYXVmIHNjaHdhcnplbSBEcmVpYmVpbjsgRnJvbnQgPSBsb2thbGUgK3pcbmZ1bmN0aW9uIGJ1aWxkVHJpcG9kKFRIUkVFKXtcbiAgY29uc3QgViA9ICh4LHkseikgPT4gbmV3IFRIUkVFLlZlY3RvcjMoeCx5LHopO1xuICBjb25zdCBjID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7IGMud2lkdGggPSBjLmhlaWdodCA9IDUxMjsgY29uc3QgZyA9IGMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgZy5maWxsU3R5bGUgPSAnI2M0OWE2Nic7IGcuZmlsbFJlY3QoMCwwLDUxMiw1MTIpO1xuICBsZXQgcyA9IDExOyBjb25zdCByID0gKCkgPT4gKHMgPSAocyoxNjgwNykgJSAyMTQ3NDgzNjQ3KSAvIDIxNDc0ODM2NDc7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgMjYwOyBpKyspe1xuICAgIGNvbnN0IHkgPSByKCkqNTEyLCBhID0gMC4wNCArIHIoKSowLjEyOyBnLnN0cm9rZVN0eWxlID0gcigpID4gMC41ID8gYHJnYmEoMTIwLDgwLDQwLCR7YX0pYCA6IGByZ2JhKDIzNSwyMDAsMTUwLCR7YX0pYDsgZy5saW5lV2lkdGggPSAwLjUgKyByKCkqMi4yO1xuICAgIGcuYmVnaW5QYXRoKCk7IGcubW92ZVRvKDAseSk7IGZvciAobGV0IHggPSAwOyB4IDw9IDUxMjsgeCArPSAzMikgZy5saW5lVG8oeCwgeSArIE1hdGguc2luKHgqMC4wMTIgKyBpKSo0ICsgKHIoKS0wLjUpKjEuNSk7IGcuc3Ryb2tlKCk7XG4gIH1cbiAgY29uc3QgdGV4ID0gbmV3IFRIUkVFLkNhbnZhc1RleHR1cmUoYyk7IHRleC5jb2xvclNwYWNlID0gVEhSRUUuU1JHQkNvbG9yU3BhY2U7XG4gIGNvbnN0IE0gPSB7XG4gICAgaG9sejogICBuZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoeyBuYW1lOid0cmlwb2RfZWljaGUnLCBtYXA6IHRleCwgcm91Z2huZXNzOjAuNiB9KSxcbiAgICBzdGFobDogIG5ldyBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCh7IG5hbWU6J3RyaXBvZF9zdGFobF9zY2h3YXJ6JywgY29sb3I6MHgxYjFiMWMsIHJvdWdobmVzczowLjQ1LCBtZXRhbG5lc3M6MC42IH0pLFxuICAgIGd1bW1pOiAgbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgbmFtZTondHJpcG9kX2d1bW1pJywgY29sb3I6MHgxMTExMTEsIHJvdWdobmVzczowLjkgfSksXG4gICAgYmxlbmRlOiBuZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoeyBuYW1lOid0cmlwb2RfcmVmbGVrdG9yJywgY29sb3I6MHg5YTlhOWEsIHJvdWdobmVzczowLjI1LCBtZXRhbG5lc3M6MC45IH0pLFxuICAgIGxlZDogICAgbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgbmFtZTondHJpcG9kX2xlZCcsIGNvbG9yOjB4ZDhkYWRkLCBlbWlzc2l2ZToweGY0ZjdmZiwgZW1pc3NpdmVJbnRlbnNpdHk6MCwgcm91Z2huZXNzOjAuMiB9KSxcbiAgICBrYWJlbDogIG5ldyBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCh7IG5hbWU6J3RyaXBvZF9rYWJlbCcsIGNvbG9yOjB4MTUxNTE1LCByb3VnaG5lc3M6MC43IH0pLFxuICB9O1xuICBjb25zdCBhZGQgPSAocCwgbiwgZ2VvLCBtYXQsIHBvcz1bMCwwLDBdKSA9PiB7IGNvbnN0IG8gPSBtayhUSFJFRSwgbiwgZ2VvLCBtYXQsIC4uLnBvcyk7IHAuYWRkKG8pOyByZXR1cm4gbzsgfTtcbiAgY29uc3Qgcm9kID0gKHAsIG4sIGEsIGIsIHJyLCBtYXQpID0+IHsgY29uc3QgZCA9IGIuY2xvbmUoKS5zdWIoYSksIG8gPSBhZGQocCwgbiwgbmV3IFRIUkVFLkN5bGluZGVyR2VvbWV0cnkocnIsIHJyLCBkLmxlbmd0aCgpLCAyMCksIG1hdCk7XG4gICAgby5wb3NpdGlvbi5jb3B5KGEpLmFkZFNjYWxlZFZlY3RvcihkLCAwLjUpOyBvLnF1YXRlcm5pb24uc2V0RnJvbVVuaXRWZWN0b3JzKFYoMCwxLDApLCBkLm5vcm1hbGl6ZSgpKTsgcmV0dXJuIG87IH07XG4gIGNvbnN0IGdyb3VwID0gbmV3IFRIUkVFLkdyb3VwKCk7IGdyb3VwLm5hbWUgPSAndHJpcG9kbGFtcGUnO1xuICBjb25zdCBIVUIgPSBWKDAsIDAuMzYsIDApLCBGUiA9IDAuMTc7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgMzsgaSsrKXtcbiAgICBjb25zdCBhID0gTWF0aC5QSS8yICsgaSoyKk1hdGguUEkvMywgZm9vdCA9IFYoTWF0aC5jb3MoYSkqRlIsIDAuMDA2LCBNYXRoLnNpbihhKSpGUik7XG4gICAgcm9kKGdyb3VwLCAndHJpcG9kX2JlaW5fJysoaSsxKSwgZm9vdCwgSFVCLmNsb25lKCkuYWRkKFYoTWF0aC5jb3MoYSkqMC4wMTIsIDAsIE1hdGguc2luKGEpKjAuMDEyKSksIDAuMDA1LCBNLnN0YWhsKTtcbiAgICBhZGQoZ3JvdXAsICd0cmlwb2RfZnVzc18nKyhpKzEpLCBuZXcgVEhSRUUuQ3lsaW5kZXJHZW9tZXRyeSgwLjAwNTgsIDAuMDA1OCwgMC4wMTIsIDE2KSwgTS5ndW1taSwgW2Zvb3QueCwgMC4wMDYsIGZvb3Quel0pO1xuICB9XG4gIGFkZChncm91cCwgJ3RyaXBvZF9rbm90ZW4nLCBuZXcgVEhSRUUuQ3lsaW5kZXJHZW9tZXRyeSgwLjAxNiwgMC4wMTgsIDAuMDI4LCAyOCksIE0uc3RhaGwsIFswLCAwLjM2LCAwXSk7XG4gIGNvbnN0IEhXID0gMC4xNCwgSEggPSAwLjEyLCBIRCA9IDAuMTE7XG4gIGNvbnN0IGFybSA9IG5ldyBUSFJFRS5DYXRtdWxsUm9tQ3VydmUzKFtWKDAsMC4zNzQsMCksIFYoLTAuMDEsMC40MSwwKSwgVigtMC4wNDUsMC40NSwwLjAwNSksIFYoLTAuMDksMC40ODUsMC4wMSksIFYoLTAuMDkyLDAuNDk1LDAuMDEpLCBWKC1IVy8yLTAuMDA4LDAuNDksMC4wMSldKTtcbiAgYWRkKGdyb3VwLCAndHJpcG9kX2J1ZWdlbCcsIG5ldyBUSFJFRS5UdWJlR2VvbWV0cnkoYXJtLCA0OCwgMC4wMDU1LCAxMiksIE0uc3RhaGwpO1xuICBjb25zdCBrb3BmID0gbmV3IFRIUkVFLkdyb3VwKCk7IGtvcGYubmFtZSA9ICd0cmlwb2Rfa29wZic7IGtvcGYucG9zaXRpb24uc2V0KDAsIDAuNDksIDAuMDEpOyBrb3BmLnJvdGF0aW9uLnNldCgwLjEyLCAwLjE1LCAwKTsgZ3JvdXAuYWRkKGtvcGYpO1xuICBhZGQoa29wZiwgJ3RyaXBvZF9ob2x6a29lcnBlcicsIG5ldyBUSFJFRS5Cb3hHZW9tZXRyeShIVywgSEgsIEhEKSwgTS5ob2x6KTtcbiAgYWRkKGtvcGYsICd0cmlwb2RfZ2VsZW5rJywgbmV3IFRIUkVFLkN5bGluZGVyR2VvbWV0cnkoMC4wMTMsIDAuMDEzLCAwLjAxLCAyOCksIE0uc3RhaGwsIFstSFcvMi0wLjAwNSwgMCwgMF0pLnJvdGF0aW9uLnogPSBNYXRoLlBJLzI7XG4gIGFkZChrb3BmLCAndHJpcG9kX2JsZW5kZScsIG5ldyBUSFJFRS5Ub3J1c0dlb21ldHJ5KDAuMDM2LCAwLjAwNSwgMTIsIDQ4KSwgTS5ibGVuZGUsIFswLjAxLCAwLCBIRC8yKzAuMDAxXSk7XG4gIGFkZChrb3BmLCAndHJpcG9kX3JlZmxla3RvcicsIG5ldyBUSFJFRS5DeWxpbmRlckdlb21ldHJ5KDAuMDM2LCAwLjAzLCAwLjAxMiwgNDgsIDEsIHRydWUpLCBNLmJsZW5kZSwgWzAuMDEsIDAsIEhELzItMC4wMDVdKS5yb3RhdGlvbi54ID0gTWF0aC5QSS8yO1xuICBjb25zdCBsaW5zZSA9IGFkZChrb3BmLCAndHJpcG9kX2xlZF9saW5zZScsIG5ldyBUSFJFRS5DaXJjbGVHZW9tZXRyeSgwLjAzNCwgNDgpLCBNLmxlZCwgWzAuMDEsIDAsIEhELzItMC4wMDhdKTtcbiAgY29uc3Qga2FiZWwgPSBuZXcgVEhSRUUuQ2F0bXVsbFJvbUN1cnZlMyhbVigtMC4wMDUsMC4zNSwtMC4wMTIpLCBWKC0wLjAzLDAuMjgsLTAuMDQpLCBWKC0wLjA3LDAuMTYsLTAuMDgpLCBWKC0wLjExLDAuMDUsLTAuMTIpLCBWKC0wLjE0LDAuMDA0LC0wLjE2KSwgVigtMC4yOCwwLjAwNCwtMC4yNCksIFYoLTAuNDUsMC4wMDQsLTAuMildKTtcbiAgYWRkKGdyb3VwLCAndHJpcG9kX2thYmVsJywgbmV3IFRIUkVFLlR1YmVHZW9tZXRyeShrYWJlbCwgNjQsIDAuMDAyMiwgOCksIE0ua2FiZWwpO1xuICBncm91cC50cmF2ZXJzZShvID0+IHsgaWYgKG8uaXNNZXNoKXsgby5jYXN0U2hhZG93ID0gdHJ1ZTsgby5yZWNlaXZlU2hhZG93ID0gdHJ1ZTsgfSB9KTtcbiAgbGluc2UuY2FzdFNoYWRvdyA9IGZhbHNlO1xuICAvLyBMaWNodHF1ZWxsZW4gYW0gS29wZiAoSW50ZW5zaXTDpHQgMCA9IGF1cylcbiAgY29uc3Qgc3BvdCA9IG5ldyBUSFJFRS5TcG90TGlnaHQoMHhmMmY1ZmYsIDAsIDAsIDAuNTUsIDAuNSwgMik7XG4gIHNwb3QucG9zaXRpb24uc2V0KDAuMDEsIDAsIEhELzIgKyAwLjAwNSk7IHNwb3QudGFyZ2V0LnBvc2l0aW9uLnNldCgwLjAxLCAwLCBIRC8yICsgMSk7XG4gIHNwb3QuY2FzdFNoYWRvdyA9IHRydWU7IHNwb3Quc2hhZG93Lm1hcFNpemUuc2V0KDEwMjQsIDEwMjQpOyBzcG90LnNoYWRvdy5iaWFzID0gLTAuMDAwNTsgc3BvdC5zaGFkb3cubm9ybWFsQmlhcyA9IDAuMDI7XG4gIHNwb3Quc2hhZG93LmNhbWVyYS5uZWFyID0gMC4wMzsgc3BvdC5zaGFkb3cuY2FtZXJhLmZhciA9IDg7XG4gIGNvbnN0IGdsb3cgPSBuZXcgVEhSRUUuUG9pbnRMaWdodCgweGYyZjVmZiwgMCwgMywgMik7IGdsb3cucG9zaXRpb24uc2V0KDAuMDEsIDAsIEhELzIgKyAwLjA1KTtcbiAga29wZi5hZGQoc3BvdCwgc3BvdC50YXJnZXQsIGdsb3cpO1xuICByZXR1cm4geyBncm91cCwga29wZiwgTSwgc3BvdCwgZ2xvdyB9O1xufVxuXG5jb25zdCBzdGFnZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3RocmVlLWQtc3RhZ2UnKTtcbmNvbnN0IHsgVEhSRUUgfSA9IGF3YWl0IHN0YWdlLnJlYWR5O1xuY29uc3Qgc3RhdHVzRWwgPSB7IHNldCB0ZXh0Q29udGVudCh2KXt9IH07XG5mb3IgKGNvbnN0IHNlbCBvZiBbJy50b29sYmFyJywnLm5vdGUnXSkgeyBjb25zdCBlbCA9IHN0YWdlLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcihzZWwpOyBpZiAoZWwpIGVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7IH1cblxuLy8gLS0tLS0tLS0tLSBNYcOfZSBpbiBNZXRlcm4gKExpREFSLVNjYW4gMTAvMjAyNiwgYmVyZWluaWd0KSAtLS0tLS0tLS0tXG4vLyB4ID0gT3N0LCB6ID0gU8O8ZDsgVXJzcHJ1bmcgPSBJbm5lbmthbnRlIFdlc3R3YW5kIFNjaGxhZnppbW1lciAvIElubmVua2FudGUgTm9yZHdhbmRcbmNvbnN0IEggPSAyLjUsIFRFID0gMC4yLCBUSSA9IDAuMTsgICAgIC8vIFdhbmRow7ZoZSwgQXXDn2VuLS9Jbm5lbndhbmRcbmNvbnN0IERPT1JfVyA9IDAuOSwgRE9PUl9IID0gMi4xLCBXSU5fQiA9IDAuOSwgV0lOX1QgPSAyLjI7XG5cbi8vIC0tLS0tLS0tLS0gTWF0ZXJpYWxpZW4gLS0tLS0tLS0tLVxuY29uc3QgTSA9IHtcbiAgZmxvb3I6ICBuZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoeyBuYW1lOid3b29kX2Zsb29yJywgY29sb3I6MHg4YTYyNDIsIHJvdWdobmVzczowLjYgfSksXG4gIHdhbGw6ICAgbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgbmFtZTond2hpdGVfc3R1Y2NvJywgY29sb3I6MHhmMmVmZTksIHJvdWdobmVzczowLjk1IH0pLFxuICBicmljazogIG5ldyBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCh7IG5hbWU6J2JyaWNrX3dhbGxfMDQnLCBjb2xvcjoweDlhNWE0NCwgcm91Z2huZXNzOjAuOSB9KSxcbiAgY2FwOiAgICBuZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoeyBuYW1lOidyb3VnaF9wbGFzdGVyX2JyaWNrXzA0JywgY29sb3I6MHhiOGE4OTgsIHJvdWdobmVzczowLjk1IH0pLFxuICBwbGludGg6IG5ldyBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCh7IG5hbWU6J3BsaW50aCcsIGNvbG9yOjB4MmYyZDJhLCByb3VnaG5lc3M6MC43IH0pLFxuICB3b29kOiAgIG5ldyBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCh7IG5hbWU6J2Rvb3Jfd2hpdGVfbGFjcXVlcicsIGNvbG9yOjB4ZjdmNWYwLCByb3VnaG5lc3M6MC4zNSB9KSxcbiAgbWV0YWw6ICBuZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoeyBuYW1lOidicnVzaGVkX3N0ZWVsJywgY29sb3I6MHhiOWJjYzAsIHJvdWdobmVzczowLjMsIG1ldGFsbmVzczowLjM1IH0pLFxuICBnbGFzczogIG5ldyBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCh7IG5hbWU6J2dsYXNzJywgY29sb3I6MHhiZmQ4ZTQsIHJvdWdobmVzczowLjA1LCB0cmFuc3BhcmVudDp0cnVlLCBvcGFjaXR5OjAuMzUgfSksXG4gIGJhbGNvbnk6bmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgbmFtZTonYmFsY29ueV9jb25jcmV0ZScsIGNvbG9yOjB4YTlhNTlkLCByb3VnaG5lc3M6MC45IH0pLFxufTtcblxuLy8gV2VsdC1VVnMgKEJveC1Qcm9qZWt0aW9uKSwgZGFtaXQgVGV4dHVyZW4gbmljaHQgZ2VzdHJlY2t0IHdlcmRlblxuZnVuY3Rpb24gd29ybGRVVihnZW8sIHNjYWxlKXtcbiAgY29uc3QgcCA9IGdlby5hdHRyaWJ1dGVzLnBvc2l0aW9uLCBuID0gZ2VvLmF0dHJpYnV0ZXMubm9ybWFsLCB1diA9IGdlby5hdHRyaWJ1dGVzLnV2O1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHAuY291bnQ7IGkrKyl7XG4gICAgY29uc3QgYXggPSBNYXRoLmFicyhuLmdldFgoaSkpLCBheSA9IE1hdGguYWJzKG4uZ2V0WShpKSksIGF6ID0gTWF0aC5hYnMobi5nZXRaKGkpKTtcbiAgICBsZXQgdSwgdjtcbiAgICBpZiAoYXkgPj0gYXggJiYgYXkgPj0gYXopeyB1ID0gcC5nZXRYKGkpOyB2ID0gcC5nZXRaKGkpOyB9XG4gICAgZWxzZSBpZiAoYXggPj0gYXopeyB1ID0gcC5nZXRaKGkpOyB2ID0gcC5nZXRZKGkpOyB9XG4gICAgZWxzZSB7IHUgPSBwLmdldFgoaSk7IHYgPSBwLmdldFkoaSk7IH1cbiAgICB1di5zZXRYWShpLCB1L3NjYWxlLCB2L3NjYWxlKTtcbiAgfVxuICB1di5uZWVkc1VwZGF0ZSA9IHRydWU7XG4gIHJldHVybiBnZW87XG59XG4vLyBCb3ggaW4gV2VsdGtvb3JkaW5hdGVuIChtaW4vbWF4KVxuZnVuY3Rpb24gYm94KG5hbWUsIG1hdCwgeDAseTAsejAsIHgxLHkxLHoxLCB1dlNjYWxlKXtcbiAgY29uc3QgZyA9IG5ldyBUSFJFRS5Cb3hHZW9tZXRyeSh4MS14MCwgeTEteTAsIHoxLXowKTtcbiAgZy50cmFuc2xhdGUoKHgwK3gxKS8yLCAoeTAreTEpLzIsICh6MCt6MSkvMik7XG4gIGlmICh1dlNjYWxlKSB3b3JsZFVWKGcsIHV2U2NhbGUpO1xuICBjb25zdCBtID0gbmV3IFRIUkVFLk1lc2goZywgbWF0KTsgbS5uYW1lID0gbmFtZTsgcmV0dXJuIG07XG59XG5cbmNvbnN0IGhvbWUgPSBuZXcgVEhSRUUuR3JvdXAoKTsgaG9tZS5uYW1lID0gJ3dvaG51bmcnO1xuY29uc3Qgd2FsbHMgPSBuZXcgVEhSRUUuR3JvdXAoKTsgd2FsbHMubmFtZSA9ICd3YWVuZGUnO1xuY29uc3QgZG9vcnMgPSBuZXcgVEhSRUUuR3JvdXAoKTsgZG9vcnMubmFtZSA9ICd0dWVyZW4nO1xuY29uc3Qgd2luZG93cyA9IG5ldyBUSFJFRS5Hcm91cCgpOyB3aW5kb3dzLm5hbWUgPSAnZmVuc3Rlcic7XG5ob21lLmFkZCh3YWxscywgZG9vcnMsIHdpbmRvd3MpO1xuXG4vLyAtLS0tLS0tLS0tIFTDvHIgKHByb3plZHVyYWwsIEthc3NldHRlbnTDvHIpIC0tLS0tLS0tLS1cbmZ1bmN0aW9uIG1ha2VEb29yKG5hbWUsIHQsIG9wZW5EZWcsIGdsYXNzRG9vcj1mYWxzZSwgdz1ET09SX1cpe1xuICBjb25zdCBnID0gbmV3IFRIUkVFLkdyb3VwKCk7IGcubmFtZSA9IG5hbWU7XG4gIGNvbnN0IGQgPSB0ICsgMC4wMztcbiAgZy5hZGQoYm94KG5hbWUrJ196YXJnZV9sJywgTS53b29kLCAtdy8yLCAwLCAtZC8yLCAtdy8yKzAuMDQsIERPT1JfSCwgZC8yKSk7XG4gIGcuYWRkKGJveChuYW1lKydfemFyZ2VfcicsIE0ud29vZCwgIHcvMi0wLjA0LCAwLCAtZC8yLCB3LzIsIERPT1JfSCwgZC8yKSk7XG4gIGcuYWRkKGJveChuYW1lKydfemFyZ2Vfb2JlbicsIE0ud29vZCwgLXcvMiwgRE9PUl9ILTAuMDQsIC1kLzIsIHcvMiwgRE9PUl9ILCBkLzIpKTtcbiAgY29uc3QgbHcgPSB3IC0gMC4wOCwgbGggPSBET09SX0ggLSAwLjA1LCBsdCA9IDAuMDQ7XG4gIGNvbnN0IHBpdm90ID0gbmV3IFRIUkVFLkdyb3VwKCk7IHBpdm90Lm5hbWUgPSBuYW1lKydfYmxhdHQnO1xuICBwaXZvdC5wb3NpdGlvbi5zZXQoLXcvMiArIDAuMDQsIDAuMDA1LCAwKTtcbiAgcGl2b3Qucm90YXRpb24ueSA9IFRIUkVFLk1hdGhVdGlscy5kZWdUb1JhZChvcGVuRGVnKTtcbiAgcGl2b3QuYWRkKGJveChuYW1lKydfdHVlcmJsYXR0JywgTS53b29kLCAwLCAwLCAtbHQvMiwgbHcsIGxoLCBsdC8yKSk7XG4gIGZvciAoY29uc3QgcyBvZiBbMSwtMV0pe1xuICAgIGNvbnN0IHowID0gcyowLjAxNCwgejEgPSBzKjAuMDI2LCB6ej1bTWF0aC5taW4oejAsejEpLE1hdGgubWF4KHowLHoxKV07XG4gICAgaWYgKGdsYXNzRG9vcil7XG4gICAgICBwaXZvdC5hZGQoYm94KG5hbWUrJ19nbGFzJywgTS5nbGFzcywgMC4xLCAwLjM1LCAtMC4wMDYsIGx3LTAuMSwgbGgtMC4xMiwgMC4wMDYpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGl2b3QuYWRkKGJveChuYW1lKydfa2Fzc2V0dGVfbycrcywgTS53b29kLCAwLjExLCAxLjA1LCB6elswXSwgbHctMC4xMSwgbGgtMC4xNCwgenpbMV0pKTtcbiAgICAgIHBpdm90LmFkZChib3gobmFtZSsnX2thc3NldHRlX3UnK3MsIE0ud29vZCwgMC4xMSwgMC4xNCwgenpbMF0sIGx3LTAuMTEsIDAuOSwgenpbMV0pKTtcbiAgICB9XG4gICAgY29uc3Qgcm9zZSA9IG5ldyBUSFJFRS5NZXNoKG5ldyBUSFJFRS5DeWxpbmRlckdlb21ldHJ5KDAuMDI2LDAuMDI2LDAuMDEyLDMyKSwgTS5tZXRhbCk7XG4gICAgcm9zZS5uYW1lID0gbmFtZSsnX3Jvc2V0dGUnK3M7IHJvc2Uucm90YXRpb24ueCA9IE1hdGguUEkvMjsgcm9zZS5wb3NpdGlvbi5zZXQobHctMC4wNywgMS4wNSwgcyoobHQvMiswLjAwNikpOyBwaXZvdC5hZGQocm9zZSk7XG4gICAgY29uc3QgbmVjayA9IG5ldyBUSFJFRS5NZXNoKG5ldyBUSFJFRS5DeWxpbmRlckdlb21ldHJ5KDAuMDA5LDAuMDA5LDAuMDUsMjApLCBNLm1ldGFsKTtcbiAgICBuZWNrLm5hbWUgPSBuYW1lKydfaGFscycrczsgbmVjay5yb3RhdGlvbi54ID0gTWF0aC5QSS8yOyBuZWNrLnBvc2l0aW9uLnNldChsdy0wLjA3LCAxLjA1LCBzKihsdC8yKzAuMDMpKTsgcGl2b3QuYWRkKG5lY2spO1xuICAgIGNvbnN0IGxldmVyID0gbmV3IFRIUkVFLk1lc2gobmV3IFRIUkVFLkNhcHN1bGVHZW9tZXRyeSgwLjAwOSwgMC4xMiwgNiwgMTYpLCBNLm1ldGFsKTtcbiAgICBsZXZlci5uYW1lID0gbmFtZSsnX2RydWVja2VyJytzOyBsZXZlci5yb3RhdGlvbi56ID0gTWF0aC5QSS8yOyBsZXZlci5wb3NpdGlvbi5zZXQobHctMC4xMywgMS4wNSwgcyoobHQvMiswLjA1NSkpOyBwaXZvdC5hZGQobGV2ZXIpO1xuICB9XG4gIGZvciAoY29uc3QgeSBvZiBbMC4yNSwgbGgtMC4yNV0pe1xuICAgIGNvbnN0IGggPSBuZXcgVEhSRUUuTWVzaChuZXcgVEhSRUUuQ3lsaW5kZXJHZW9tZXRyeSgwLjAwOCwwLjAwOCwwLjEsMTYpLCBNLm1ldGFsKTtcbiAgICBoLm5hbWUgPSBuYW1lKydfYmFuZCc7IGgucG9zaXRpb24uc2V0KC0wLjAwNCwgeSwgbHQvMik7IHBpdm90LmFkZChoKTtcbiAgfVxuICBnLmFkZChwaXZvdCk7XG4gIHJldHVybiBnO1xufVxuXG4vLyAtLS0tLS0tLS0tIEZlbnN0ZXIgLS0tLS0tLS0tLVxuZnVuY3Rpb24gbWFrZVdpbmRvdyhuYW1lLCB3LCB0LCBib3R0b20sIHRvcCl7XG4gIGNvbnN0IGcgPSBuZXcgVEhSRUUuR3JvdXAoKTsgZy5uYW1lID0gbmFtZTtcbiAgY29uc3QgZiA9IDAuMDUsIGQgPSAwLjA3O1xuICBnLmFkZChib3gobmFtZSsnX3JhaG1lbl9sJywgTS53b29kLCAtdy8yLCBib3R0b20sIC1kLzIsIC13LzIrZiwgdG9wLCBkLzIpKTtcbiAgZy5hZGQoYm94KG5hbWUrJ19yYWhtZW5fcicsIE0ud29vZCwgdy8yLWYsIGJvdHRvbSwgLWQvMiwgdy8yLCB0b3AsIGQvMikpO1xuICBnLmFkZChib3gobmFtZSsnX3JhaG1lbl9vJywgTS53b29kLCAtdy8yK2YsIHRvcC1mLCAtZC8yLCB3LzItZiwgdG9wLCBkLzIpKTtcbiAgZy5hZGQoYm94KG5hbWUrJ19yYWhtZW5fdScsIE0ud29vZCwgLXcvMitmLCBib3R0b20sIC1kLzIsIHcvMi1mLCBib3R0b20rZiwgZC8yKSk7XG4gIGlmICh3ID4gMS4xKSBnLmFkZChib3gobmFtZSsnX3Bmb3N0ZW4nLCBNLndvb2QsIC0wLjAyNSwgYm90dG9tK2YsIC1kLzIrMC4wMDUsIDAuMDI1LCB0b3AtZiwgZC8yLTAuMDA1KSk7XG4gIGcuYWRkKGJveChuYW1lKydfZ2xhcycsIE0uZ2xhc3MsIC13LzIrZiwgYm90dG9tK2YsIC0wLjAwNSwgdy8yLWYsIHRvcC1mLCAwLjAwNSkpO1xuICBpZiAoYm90dG9tID4gMCkgZy5hZGQoYm94KG5hbWUrJ19iYW5rJywgTS53b29kLCAtdy8yLTAuMDUsIGJvdHRvbS0wLjAyNywgLXQvMi0wLjA0LCB3LzIrMC4wNSwgYm90dG9tKzAuMDEyLCB0LzIrMC4wNCkpO1xuICByZXR1cm4gZztcbn1cblxuLy8gLS0tLS0tLS0tLSBXYW5kIG1pdCDDlmZmbnVuZ2VuIChhY2hzcGFyYWxsZWwsIE1ldGVyKSAtLS0tLS0tLS0tXG4vLyBhLi5iOiBBdXNkZWhudW5nIGVudGxhbmcgZGVyIFdhbmQsIGZpeGVkOiBNaXR0ZWxsaW5pZTsgb3BzOiB7YywgdywgdHlwZTonZG9vcid8J3dpbmRvdyd8J2dsYXNzZG9vcicsIG9wZW4sIGZsaXAsIG5hbWV9XG4vLyBvdXRzaWRlOiBCb3gtRmFjZS1JbmRleCBkZXIgQXXDn2Vuc2VpdGUgKDA6K3ggMToteCA0Oit6IDU6LXopIOKGkiBLbGlua2VyIGF1w59lbiwgUHV0eiBpbm5lbjsgZW5kczogU3Rpcm5zZWl0ZW4gYXXDn2VuIHNpY2h0YmFyXG5mdW5jdGlvbiB3YWxsKG5hbWUsIGEsIGIsIGZpeGVkLCBob3Jpem9udGFsLCB0LCBoLCBvcHM9W10sIG91dHNpZGU9LTEsIGVuZHM9W2ZhbHNlLGZhbHNlXSl7XG4gIGNvbnN0IEYgPSBmaXhlZDtcbiAgY29uc3Qgc2VnID0gKG4sIHMwLCBzMSwgeTAsIHkxLCBlZj1bXSkgPT4ge1xuICAgIGlmIChzMSAtIHMwIDwgMC4wMDEpIHJldHVybjtcbiAgICBjb25zdCBtYXQgPSBBcnJheSg2KS5maWxsKE0ud2FsbCk7XG4gICAgaWYgKG91dHNpZGUgPj0gMCl7IG1hdFtvdXRzaWRlXSA9IE0uYnJpY2s7IGVmLmZvckVhY2goZSA9PiBtYXRbZV0gPSBNLmJyaWNrKTsgfVxuICAgIGlmICh5MSA+PSBoIC0gMC4wMDAxKSBtYXRbMl0gPSBNLmNhcDtcbiAgICB3YWxscy5hZGQoaG9yaXpvbnRhbCA/IGJveChuLCBtYXQsIHMwLCB5MCwgRi10LzIsIHMxLCB5MSwgRit0LzIsIDEuNSlcbiAgICAgICAgICAgICAgICAgICAgICAgICA6IGJveChuLCBtYXQsIEYtdC8yLCB5MCwgczAsIEYrdC8yLCB5MSwgczEsIDEuNSkpO1xuICB9O1xuICBjb25zdCBlbmRBID0gZW5kc1swXSA/IFtob3Jpem9udGFsID8gMSA6IDVdIDogW10sIGVuZEIgPSBlbmRzWzFdID8gW2hvcml6b250YWwgPyAwIDogNF0gOiBbXTtcbiAgY29uc3QgbGlzdCA9IFsuLi5vcHNdLnNvcnQoKHAscSk9PnAuYy1xLmMpO1xuICBsZXQgY3VyID0gYTtcbiAgbGlzdC5mb3JFYWNoKChvLCBpKSA9PiB7XG4gICAgY29uc3QgczAgPSBvLmMgLSBvLncvMiwgczEgPSBvLmMgKyBvLncvMjtcbiAgICBzZWcoYCR7bmFtZX1fJHtpfWAsIGN1ciwgczAsIDAsIGgsIGkgPT09IDAgPyBlbmRBIDogW10pO1xuICAgIHNlZyhgJHtuYW1lfV9zdHVyel8ke2l9YCwgczAsIHMxLCBvLnR5cGUgPT09ICdkb29yJyA/IERPT1JfSCA6IFdJTl9ULCBoKTtcbiAgICBpZiAoby50eXBlID09PSAnd2luZG93Jykgc2VnKGAke25hbWV9X2JydWVzdHVuZ18ke2l9YCwgczAsIHMxLCAwLCBXSU5fQik7XG4gICAgbGV0IGVsO1xuICAgIGlmIChvLnR5cGUgPT09ICdkb29yJykgeyBlbCA9IG1ha2VEb29yKG8ubmFtZSwgdCwgby5vcGVuID8/IDAsIGZhbHNlLCBvLncpOyBkb29ycy5hZGQoZWwpOyB9XG4gICAgZWxzZSBpZiAoby50eXBlID09PSAnZ2xhc3Nkb29yJykgeyBlbCA9IG1ha2VXaW5kb3coby5uYW1lLCBvLncsIHQsIDAsIFdJTl9UKTsgd2luZG93cy5hZGQoZWwpOyB9XG4gICAgZWxzZSB7IGVsID0gbWFrZVdpbmRvdyhvLm5hbWUsIG8udywgdCwgV0lOX0IsIFdJTl9UKTsgd2luZG93cy5hZGQoZWwpOyB9XG4gICAgaWYgKGhvcml6b250YWwpIGVsLnBvc2l0aW9uLnNldChvLmMsIDAsIEYpO1xuICAgIGVsc2UgeyBlbC5wb3NpdGlvbi5zZXQoRiwgMCwgby5jKTsgZWwucm90YXRpb24ueSA9IE1hdGguUEkvMjsgfVxuICAgIGlmIChvLmZsaXApIGVsLnJvdGF0aW9uLnkgKz0gTWF0aC5QSTtcbiAgICBjdXIgPSBzMTtcbiAgfSk7XG4gIHNlZyhgJHtuYW1lfV8ke2xpc3QubGVuZ3RofWAsIGN1ciwgYiwgMCwgaCwgbGlzdC5sZW5ndGggPT09IDAgPyBbLi4uZW5kQSwgLi4uZW5kQl0gOiBlbmRCKTtcbn1cblxuLy8gR3J1bmRyaXNzIG5hY2ggTGlEQVItU2NhbjogUmF1bW1hw59lLCBXYW5kbGFnZW4sIMOWZmZudW5nc21pdHRlbi4gTmljaHQgw7xiZXJub21tZW46IOKAnk90aGVyIDTigJwtU3BhbHQsIFNjYW4tTcO2YmVsLFxuLy8gc2NocsOkZ2VyIFdhbmRyZXN0IGltIEZsdXIsIDEwLWNtLVZlcnNhdHogZGVyIE9zdGZhc3NhZGUgKGJlZ3JhZGlndCkuIFTDvHItL0ZlbnN0ZXJicmVpdGVuICsgTWF1ZXJ2b3JzcHJ1bmcgPSBIYW5kbWHDn2UuXG5jb25zdCBISSA9IEggLSAwLjAwMzsgLy8gSW5uZW53w6RuZGUgbWluaW1hbCBuaWVkcmlnZXIg4oaSIGtlaW4gWi1GaWdodGluZyBhdWYgZGVuIE9iZXJrYW50ZW5cbmNvbnN0IFhfRkwgPSAxLjIxOyAgICAgICAgICAgICAgLy8gSW5uZW5rYW50ZSBXZXN0d2FuZCBCYWQvRmx1ciAoU2NobGFmemltbWVyIHNwcmluZ3QgMSwyMSBtIHdlaXRlciBuYWNoIFdlc3RlbilcbmNvbnN0IFhfU1cgPSAyLjY2OyAgICAgICAgICAgICAgLy8gV2FuZG1pdHRlIFNjaGxhZnppbW1lciB8IFdvaG56aW1tZXJcbmNvbnN0IFhfU0NIID0gMi4xMTsgICAgICAgICAgICAgLy8gV2VzdGthbnRlIFNjaGFjaHRcbmNvbnN0IFhfQksgPSAzLjI5OyAgICAgICAgICAgICAgLy8gV2FuZG1pdHRlIEJhZCB8IEvDvGNoZVxuY29uc3QgWF9GSyA9IDMuNTg7ICAgICAgICAgICAgICAvLyBXYW5kbWl0dGUgRmx1ciB8IEvDvGNoZVxuY29uc3QgWF9FSyA9IDYuMTcsIFhfRSA9IDYuMjc7ICAvLyBJbm5lbmthbnRlIE9zdHdhbmQgS8O8Y2hlIC8gV29obnppbW1lclxuY29uc3QgWl9TQ0gwID0gMi41NCwgWl9TQ0gxID0gMy4zMTsgLy8gU2NoYWNodCBOb3JkLS9Tw7xka2FudGVcbmNvbnN0IFpfQkYgPSAzLjEzOyAgICAgICAgICAgICAgLy8gV2FuZG1pdHRlIEJhZCB8IEZsdXJcbmNvbnN0IFpfU1AgPSA0LjQwOyAgICAgICAgICAgICAgLy8gV2FuZG1pdHRlIEvDvGNoZS9GbHVyIHwgV29obi0vU2NobGFmemltbWVyXG5jb25zdCBaX1MgPSA4LjQ5OyAgICAgICAgICAgICAgIC8vIElubmVua2FudGUgU8O8ZHdhbmRcbmNvbnN0IFpTVCA9IFpfU1AgKyBUSS8yIC0gVEU7ICAgLy8gQXXDn2Vua2FudGUgUsO8Y2tzcHJ1bmcgKFRyZXBwZW5oYXVzKVxuLy8gUmF1bS1Jbm5lbmthbnRlbiBbeDAsIHowLCB4MSwgejFdXG5jb25zdCBSTV9TWiAgPSBbMCwgWl9TUCArIFRJLzIsIFhfU1cgLSBUSS8yLCBaX1NdOyAgICAgICAgICAgIC8vIFNjaGxhZnppbW1lciAyLDYxIMOXIDQsMDRcbmNvbnN0IFJNX1daICA9IFtYX1NXICsgVEkvMiwgWl9TUCArIFRJLzIsIFhfRSwgWl9TXTsgICAgICAgICAgLy8gV29obnppbW1lciAzLDU2IMOXIDQsMDRcbmNvbnN0IFJNX0tVICA9IFtYX0JLICsgVEkvMiwgMCwgWF9FSywgWl9TUCAtIFRJLzJdOyAgICAgICAgICAgLy8gS8O8Y2hlIDIsODMgw5cgNCwzNVxuY29uc3QgUk1fQkFEID0gW1hfRkwsIDAsIFhfQksgLSBUSS8yLCBaX0JGIC0gVEkvMl07ICAgICAgICAgICAvLyBCYWQgMiwwMyDDlyAzLDA4XG5jb25zdCBSTV9GTCAgPSBbWF9GTCwgWl9CRiArIFRJLzIsIFhfRksgLSBUSS8yLCBaX1NQIC0gVEkvMl07IC8vIEZsdXIgMiwzMiDDlyAxLDE3XG5jb25zdCBCQURfRE9PUiA9IHsgYzogMS43MCwgdzogMC43NSB9LCBTWl9ET09SID0geyBjOiAxLjc0LCB3OiAwLjgzIH0sIFdaX0RPT1IgPSB7IGM6IDQuODUsIHc6IDAuODMgfTtcbmNvbnN0IEtVX1dJTiA9IHsgYzogUk1fS1VbMF0gKyAwLjQ4ICsgMC4zMjUsIHc6IDAuNjUgfSwgS1VfRE9PUiA9IHsgYzogUk1fS1VbMF0gKyAwLjQ4ICsgMC42NSArIDAuMTIgKyAwLjQyNSwgdzogMC44NSB9O1xuXG4vLyBBdcOfZW53w6RuZGVcbndhbGwoJ2F1c3Nlbl9ub3JkJywgWF9GTCAtIFRFLCBYX0UgKyBURSwgLVRFLzIsIHRydWUsIFRFLCBILCBbXG4gIHsgYzogMi4yNSwgdzogMC44LCB0eXBlOid3aW5kb3cnLCBuYW1lOidmZW5zdGVyX2JhZCcgfSxcbiAgLy8gS8O8Y2hlOiBGZW5zdGVyICsgQmFsa29udMO8ciBhbHMgRWluaGVpdFxuICB7IC4uLktVX1dJTiwgdHlwZTond2luZG93JywgbmFtZTonZmVuc3Rlcl9rdWVjaGUnIH0sXG4gIHsgLi4uS1VfRE9PUiwgdHlwZTonZ2xhc3Nkb29yJywgbmFtZTonYmFsa29udHVlcicgfSxcbl0sIDUsIFt0cnVlLCB0cnVlXSk7XG53YWxsKCdhdXNzZW5fc3VlZCcsIC1URSwgWF9FICsgVEUsIFpfUyArIFRFLzIsIHRydWUsIFRFLCBILCBbXG4gIHsgYzogMC45NCwgdzogMC43LCB0eXBlOid3aW5kb3cnLCBuYW1lOidmZW5zdGVyX3NjaGxhZnppbW1lcicgfSxcbiAgeyBjOiAzLjM3LCB3OiAwLjcsIHR5cGU6J3dpbmRvdycsIG5hbWU6J2ZlbnN0ZXJfd29obnppbW1lcl8xJyB9LFxuICB7IGM6IDUuNDIsIHc6IDAuNywgdHlwZTond2luZG93JywgbmFtZTonZmVuc3Rlcl93b2huemltbWVyXzInIH0sXG5dLCA0LCBbdHJ1ZSwgdHJ1ZV0pO1xud2FsbCgnYXVzc2VuX3dlc3Rfc2NobGFmemltbWVyJywgWl9TUCArIFRJLzIsIFpfUywgLVRFLzIsIGZhbHNlLCBURSwgSCwgW10sIDEpO1xud2FsbCgnYXVzc2VuX25vcmRfc2NobGFmemltbWVyJywgLVRFLCBYX0ZMLCBaU1QgKyBURS8yLCB0cnVlLCBURSwgSCwgW10sIDUsIFt0cnVlLCBmYWxzZV0pO1xud2FsbCgnYXVzc2VuX3dlc3QnLCAwLCBaU1QsIFhfRkwgLSBURS8yLCBmYWxzZSwgVEUsIEgsIFtcbiAgeyBjOiAoWl9CRiArIFpfU1ApLzIsIHc6IERPT1JfVywgdHlwZTonZG9vcicsIG9wZW46IC0zNSwgbmFtZTond29obnVuZ3N0dWVyJyB9LFxuXSwgMSk7XG4vLyBPc3RmYXNzYWRlIGF1w59lbiBnZXJhZGU7IEvDvGNoZW53YW5kIGlubmVuIDEwIGNtIGRpY2tlciAoU2NhbilcbndhbGwoJ2F1c3Nlbl9vc3Rfa3VlY2hlJywgMCwgWl9TUCwgKFhfRUsgKyBYX0UgKyBURSkvMiwgZmFsc2UsIFhfRSArIFRFIC0gWF9FSywgSCwgW10sIDApO1xud2FsbCgnYXVzc2VuX29zdCcsIFpfU1AsIFpfUywgWF9FICsgVEUvMiwgZmFsc2UsIFRFLCBILCBbXSwgMCk7XG4vLyBJbm5lbnfDpG5kZVxud2FsbCgnaW5uZW5fYmFkX2t1ZWNoZScsIDAsIFpfU0NIMCwgWF9CSywgZmFsc2UsIFRJLCBISSk7XG53YWxsKCdpbm5lbl9iYWRfZmx1cicsIFhfRkwsIFhfU0NILCBaX0JGLCB0cnVlLCBUSSwgSEksIFtcbiAgeyAuLi5CQURfRE9PUiwgdHlwZTonZG9vcicsIG9wZW46IDgwLCBuYW1lOid0dWVyX2JhZCcgfSxcbl0pO1xud2FsbCgnaW5uZW5fZmx1cl9rdWVjaGUnLCBaX1NDSDEsIFpfU1AgLSBUSS8yLCBYX0ZLLCBmYWxzZSwgVEksIEhJLCBbXG4gIHsgYzogMy43OCwgdzogMC44NiwgdHlwZTonZG9vcicsIG9wZW46IC03MCwgbmFtZTondHVlcl9rdWVjaGUnIH0sXG5dKTtcbndhbGwoJ2lubmVuX21pdHRlJywgWF9GTCwgWF9FLCBaX1NQLCB0cnVlLCBUSSwgSEksIFtcbiAgeyAuLi5TWl9ET09SLCB0eXBlOidkb29yJywgb3BlbjogNTUsIGZsaXA6dHJ1ZSwgbmFtZTondHVlcl9zY2hsYWZ6aW1tZXInIH0sXG4gIHsgLi4uV1pfRE9PUiwgdHlwZTonZG9vcicsIG9wZW46IDY1LCBmbGlwOnRydWUsIG5hbWU6J3R1ZXJfd29obnppbW1lcicgfSxcbl0pO1xud2FsbCgnaW5uZW5fc2NobGFmZW5fd29obmVuJywgWl9TUCArIFRJLzIsIFpfUywgWF9TVywgZmFsc2UsIFRJLCBISSk7XG4vLyBTY2hhY2h0IHp3aXNjaGVuIEJhZCwgRmx1ciB1bmQgS8O8Y2hlIChTY2FuOiBIb2hscmF1bSA1NiDDlyAxNDUgY20gb2huZSBXYW5kIHp1ciBLw7xjaGUg4oaSIGFscyBnZXNjaGxvc3NlbiBhbmdlbm9tbWVuKVxueyBjb25zdCBtID0gQXJyYXkoNikuZmlsbChNLndhbGwpOyBtWzJdID0gTS5jYXA7IHdhbGxzLmFkZChib3goJ3NjaGFjaHQnLCBtLCBYX1NDSCwgMCwgWl9TQ0gwLCBYX0ZLICsgVEkvMiwgSEksIFpfU0NIMSwgMS41KSk7IH1cblxuLy8gLS0tLS0tLS0tLSBCb2RlbiwgU29ja2VsLCBCYWxrb24gLS0tLS0tLS0tLVxuY29uc3QgT1VUTElORSA9IFtbWF9GTCAtIFRFLzIsIC1URS8yXSwgW1hfRSArIFRFLzIsIC1URS8yXSwgW1hfRSArIFRFLzIsIFpfUyArIFRFLzJdLCBbLVRFLzIsIFpfUyArIFRFLzJdLCBbLVRFLzIsIFpTVCArIFRFLzJdLCBbWF9GTCAtIFRFLzIsIFpTVCArIFRFLzJdXTtcbmNvbnN0IGZsb29yR2VvID0gbmV3IFRIUkVFLlNoYXBlR2VvbWV0cnkobmV3IFRIUkVFLlNoYXBlKE9VVExJTkUubWFwKChbeCwgel0pID0+IG5ldyBUSFJFRS5WZWN0b3IyKHgsIC16KSkpKTtcbmZsb29yR2VvLnJvdGF0ZVgoLU1hdGguUEkvMik7IGZsb29yR2VvLnRyYW5zbGF0ZSgwLCAwLjAwMiwgMCk7XG53b3JsZFVWKGZsb29yR2VvLCAxLjApO1xuY29uc3QgZmxvb3IgPSBuZXcgVEhSRUUuTWVzaChmbG9vckdlbywgTS5mbG9vcik7IGZsb29yLm5hbWUgPSAnYm9kZW5fd29vZF9mbG9vcic7XG5ob21lLmFkZChmbG9vcik7XG5ob21lLmFkZChib3goJ3NvY2tlbF9ub3JkJywgTS5wbGludGgsIFhfRkwgLSBURSAtIDAuMDUsIC0wLjEyLCAtVEUgLSAwLjA1LCBYX0UgKyBURSArIDAuMDUsIDAsIFpTVCAtIDAuMDUpKTtcbmhvbWUuYWRkKGJveCgnc29ja2VsX3N1ZWQnLCBNLnBsaW50aCwgLVRFIC0gMC4wNSwgLTAuMTIsIFpTVCAtIDAuMDUsIFhfRSArIFRFICsgMC4wNSwgMCwgWl9TICsgVEUgKyAwLjA1KSk7XG4vLyBCYWxrb24gw7xiZXIgZGllIGdhbnplIEvDvGNoZW5icmVpdGUsIDIsMjYgbSB0aWVmIChTY2FuKTsgQnLDvHN0dW5nZW4gc3RhdHQgZGVyIGdlc2Nhbm50ZW4gV8OkbmRlXG5jb25zdCBQSCA9IDEuMCwgUFQgPSAwLjA4O1xuY29uc3QgQlgwID0gUk1fS1VbMF0gLSBQVCwgQlgxID0gUk1fS1VbMl0gKyBQVCwgQloxID0gLVRFLCBCWjAgPSBCWjEgLSAyLjI2IC0gUFQ7XG5ob21lLmFkZChib3goJ2JhbGtvbl9wbGF0dGUnLCBNLmJhbGNvbnksIEJYMCwgLTAuMTIsIEJaMCwgQlgxLCAwLjAyLCBCWjEpKTtcbmhvbWUuYWRkKGJveCgnYmFsa29uX2JydWVzdHVuZ193JywgTS53YWxsLCBCWDAsIDAuMDIsIEJaMCwgQlgwK1BULCBQSCwgQloxLCAxLjUpKTtcbmhvbWUuYWRkKGJveCgnYmFsa29uX2JydWVzdHVuZ19vJywgTS53YWxsLCBCWDEtUFQsIDAuMDIsIEJaMCwgQlgxLCBQSCwgQloxLCAxLjUpKTtcbmhvbWUuYWRkKGJveCgnYmFsa29uX2JydWVzdHVuZ19uJywgTS53YWxsLCBCWDArUFQsIDAuMDIsIEJaMCwgQlgxLVBULCBQSC0wLjAwMiwgQlowK1BULCAxLjUpKTtcblxuLy8gLS0tLS0tLS0tLSBXb2huemltbWVyIChSYXVtIFPDvGQtT3N0KSAtLS0tLS0tLS0tXG5jb25zdCB3b2huID0gbmV3IFRIUkVFLkdyb3VwKCk7IHdvaG4ubmFtZSA9ICd3b2huemltbWVyJztcbmNvbnN0IElOX08gPSBYX0UsIElOX1MgPSBaX1MsIFdaX0NYID0gKFJNX1daWzBdICsgUk1fV1pbMl0pLzIsIFNPRkFfWiA9IFpfUyAtIDEuNzQ1OyAgIC8vIElubmVua2FudGVuIE9zdC0vU8O8ZHdhbmRcbi8vIFNvZmEgYW4gZGVyIE9zdHdhbmQsIFLDvGNrZW4genVyIFdhbmRcbmNvbnN0IHNvZmEgPSBidWlsZFNvZmEoVEhSRUUpO1xuc29mYS5ncm91cC5wb3NpdGlvbi5zZXQoSU5fTyAtIHNvZmEuRC8yIC0gMC4wMywgMC4wMDIsIFNPRkFfWik7XG5zb2ZhLmdyb3VwLnJvdGF0aW9uLnkgPSAtTWF0aC5QSS8yO1xud29obi5hZGQoc29mYS5ncm91cCk7XG4vLyAzIFJlZ2FsZSBuZWJlbmVpbmFuZGVyIHVudGVyIGRlbSBTw7xkZmVuc3RlciwgRnJvbnQgenVtIFJhdW1cbmNvbnN0IFJNID0gcmVnYWxNYXRlcmlhbHMoVEhSRUUpO1xuZm9yIChjb25zdCBbaSwgZHhdIG9mIFtbMSwtMC42MDNdLFsyLDBdLFszLDAuNjAzXV0pe1xuICBjb25zdCByID0gYnVpbGRSZWdhbChUSFJFRSwgUk0pOyByLm5hbWUgPSAncmVnYWxfJytpO1xuICByLnBvc2l0aW9uLnNldChXWl9DWCArIGR4LCAwLjAwMiwgSU5fUyAtIDAuMTM1IC0gMC4wMik7XG4gIHIucm90YXRpb24ueSA9IE1hdGguUEk7XG4gIHdvaG4uYWRkKHIpO1xufVxuLy8gQm94ZW4gb2JlbiBhdWYgZGVuIMOkdcOfZXJlbiBSZWdhbGVuLCBsZWljaHQgbmFjaCBpbm5lbiBnZWRyZWh0XG57XG4gIGNvbnN0IGJ4ID0gYnVpbGRCb3hlbihUSFJFRSksIHRvcCA9IG5ldyBUSFJFRS5Cb3gzKCkuc2V0RnJvbU9iamVjdCh3b2huLmdldE9iamVjdEJ5TmFtZSgncmVnYWxfMScpKS5tYXgueTtcbiAgY29uc3QgVFVSTiA9IFRIUkVFLk1hdGhVdGlscy5kZWdUb1JhZCgxNSksIFggPSAwLjYwMyArIDAuMzAgLSAwLjEwNSwgWiA9IElOX1MgLSAwLjEzNSAtIDAuMDI7XG4gIC8vIEFrdGl2Ym94IGxpbmtzICjigJN4KSwgQmVkaWVuZmVsZCB6ZWlndCBuYWNoIGF1w59lblxuICBieC5yZWNodHMucG9zaXRpb24uc2V0KFdaX0NYIC0gWCwgdG9wLCBaKTsgYngucmVjaHRzLnJvdGF0aW9uLnkgPSBNYXRoLlBJIC0gVFVSTjtcbiAgYngubGlua3MucG9zaXRpb24uc2V0KFdaX0NYICsgWCwgdG9wLCBaKTsgIGJ4LmxpbmtzLnJvdGF0aW9uLnkgPSBNYXRoLlBJICsgVFVSTjtcbiAgd29obi5hZGQoYngubGlua3MsIGJ4LnJlY2h0cyk7XG59XG4vLyBCb2dlbmxhbXBlIGluIGRlciBGZW5zdGVyZWNrZSwgU2NoaXJtIMO8YmVyIGRlbSBTb2ZhIOKAkyB6dXIgUmF1bW1pdHRlIHZlcnNldHp0XG5jb25zdCBsYW1wZSA9IGJ1aWxkTGFtcGUoVEhSRUUpO1xuY29uc3QgTEIgPSBuZXcgVEhSRUUuVmVjdG9yMihJTl9PIC0gMC4yMiwgSU5fUyAtIDAuMjUpO1xuY29uc3QgTFQgPSBuZXcgVEhSRUUuVmVjdG9yMihJTl9PIC0gMC45NSwgU09GQV9aICsgMC4yNSk7XG5sYW1wZS5ncm91cC5wb3NpdGlvbi5zZXQoTEIueCwgMC4wMDIsIExCLnkpO1xubGFtcGUuZ3JvdXAucm90YXRpb24ueSA9IE1hdGguYXRhbjIoLShMVC55IC0gTEIueSksIExULnggLSBMQi54KTtcbndvaG4uYWRkKGxhbXBlLmdyb3VwKTtcbi8vIERvbnV0LUxhbXBlICjDmCAzMCBjbSwgSCAxMSBjbSkgaW0gbGlua2VuIFJlZ2FsLCBtaXR0bGVyZXMgRmFjaCwgbWl0dGlnXG5jb25zdCBETSA9IHtcbiAga29lcnBlcjogbmV3IFRIUkVFLk1lc2hQaHlzaWNhbE1hdGVyaWFsKHsgbmFtZTonZG9udXRfb3BhbF9vcmFuZ2UnLCBjb2xvcjoweGZmYTA0YSwgcm91Z2huZXNzOjAuNiwgY2xlYXJjb2F0OjAuMiwgY2xlYXJjb2F0Um91Z2huZXNzOjAuNSwgZW1pc3NpdmU6MHhmZjhhMmEsIGVtaXNzaXZlSW50ZW5zaXR5OjAgfSksXG4gIHNvY2tlbDogIG5ldyBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCh7IG5hbWU6J2RvbnV0X3NvY2tlbCcsIGNvbG9yOjB4ZWU2YTNlLCByb3VnaG5lc3M6MC41LCBlbWlzc2l2ZToweGQwNGEyMCwgZW1pc3NpdmVJbnRlbnNpdHk6MCB9KSxcbiAga25vcGY6ICAgbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgbmFtZTonZG9udXRfa25vcGYnLCBjb2xvcjoweDlhNmE1OCwgcm91Z2huZXNzOjAuNDUgfSksXG59O1xuY29uc3QgZG9udXQgPSBuZXcgVEhSRUUuR3JvdXAoKTsgZG9udXQubmFtZSA9ICdkb251dGxhbXBlJztcbntcbiAgY29uc3QgVjIgPSAoeCx5KSA9PiBuZXcgVEhSRUUuVmVjdG9yMih4LHkpLCBkbSA9IChuLGcsbSx5PTApID0+IHsgY29uc3QgbyA9IG5ldyBUSFJFRS5NZXNoKGcsbSk7IG8ubmFtZSA9IG47IG8ucG9zaXRpb24ueSA9IHk7IGRvbnV0LmFkZChvKTsgfTtcbiAgY29uc3QgU0JfUiA9IDAuMTIsIFNCX0ggPSAwLjAxOCwgc3AgPSBbVjIoMCwwKSwgVjIoU0JfUi0wLjAwNiwwKV07XG4gIGZvciAobGV0IGkgPSAwOyBpIDw9IDEyOyBpKyspeyBjb25zdCBhID0gLU1hdGguUEkvMiArIGkvMTIqTWF0aC5QSTsgc3AucHVzaChWMihTQl9SLTAuMDA2K01hdGguY29zKGEpKjAuMDA2LCAwLjAwNitNYXRoLnNpbihhKSowLjAwNisoaT42PyhTQl9ILTAuMDEyKSooaS02KS82OjApKSk7IH1cbiAgc3AucHVzaChWMigwLCBTQl9IKSk7XG4gIGRtKCdkb251dF9zb2NrZWwnLCBuZXcgVEhSRUUuTGF0aGVHZW9tZXRyeShzcCwgOTYpLCBETS5zb2NrZWwpO1xuICBjb25zdCBSID0gMC4wODUsIEEgPSAwLjA2NSwgQiA9IDAuMDQ3NSwgQ1kgPSAwLjA2MjUsIHNnID0gdiA9PiBNYXRoLnNpZ24odikqTWF0aC5wb3coTWF0aC5hYnModiksIDAuOCksIGtwID0gW1YyKDAsMC4wMTUpXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPD0gNjA7IGkrKyl7IGNvbnN0IHQgPSAtTWF0aC5QSS8yICsgaS82MCoxLjM1Kk1hdGguUEk7IGtwLnB1c2goVjIoUitBKnNnKE1hdGguY29zKHQpKSwgQ1krQipzZyhNYXRoLnNpbih0KSkpKTsgfVxuICBrcC5wdXNoKFYyKDAuMDE4LDAuMDc4KSwgVjIoMC4wMDgsMC4wNzU1KSwgVjIoMCwwLjA3NSkpO1xuICBkbSgnZG9udXRfa29lcnBlcicsIG5ldyBUSFJFRS5MYXRoZUdlb21ldHJ5KGtwLCAxMjgpLCBETS5rb2VycGVyKTtcbiAgZG0oJ2RvbnV0X2tub3BmJywgbmV3IFRIUkVFLkN5bGluZGVyR2VvbWV0cnkoMC4wMiwgMC4wMjIsIDAuMDA0LCA0MCksIERNLmtub3BmLCAwLjA3Nyk7XG59XG5kb251dC5wb3NpdGlvbi5zZXQoV1pfQ1ggLSAwLjYwMywgMC4wMDIgKyAwLjQyLCBJTl9TIC0gMC4xMzUgLSAwLjAyKTtcbndvaG4uYWRkKGRvbnV0KTtcbi8vIEZlcm5zZWhlciAoNDNcIikgYXVmIHp3ZWkgU29mYS1LYXJ0b25zIGFuIGRlciBXZXN0d2FuZCwgZ2VnZW7DvGJlciBkZW0gU29mYVxue1xuICBjb25zdCB0diA9IG5ldyBUSFJFRS5Hcm91cCgpOyB0di5uYW1lID0gJ2Zlcm5zZWhlcic7XG4gIGNvbnN0IEsgPSBuZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoeyBuYW1lOidrYXJ0b24nLCBjb2xvcjoweGE5ODI1YSwgcm91Z2huZXNzOjAuOSB9KTtcbiAgY29uc3QgS1QgPSBuZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoeyBuYW1lOidrYXJ0b25fZHJ1Y2snLCBjb2xvcjoweDNhMmQyMiwgcm91Z2huZXNzOjAuOSB9KTtcbiAgY29uc3QgVFZNID0gbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgbmFtZTondHZfZ2VoYWV1c2UnLCBjb2xvcjoweDE0MTQxNiwgcm91Z2huZXNzOjAuNDUsIG1ldGFsbmVzczowLjIgfSk7XG4gIGNvbnN0IFNDUiA9IG5ldyBUSFJFRS5NZXNoUGh5c2ljYWxNYXRlcmlhbCh7IG5hbWU6J3R2X2JpbGRzY2hpcm0nLCBjb2xvcjoweDA1MDYwNywgcm91Z2huZXNzOjAuMDgsIGNsZWFyY29hdDoxLCBjbGVhcmNvYXRSb3VnaG5lc3M6MC4wNSB9KTtcbiAgY29uc3QgRlQgPSBuZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoeyBuYW1lOid0dl9mdXNzJywgY29sb3I6MHg5YTllYTMsIHJvdWdobmVzczowLjM1LCBtZXRhbG5lc3M6MC43IH0pO1xuICBjb25zdCB4MCA9IFJNX1daWzBdICsgMC4wMiwgemMgPSBTT0ZBX1osIEtXID0gMS4xNSwgS0QgPSAwLjUsIEtIID0gMC4zODtcbiAgdHYuYWRkKGJveCgna2FydG9uX3VudGVuJywgSywgeDAsIDAuMDAyLCB6YyAtIEtXLzIsIHgwICsgS0QsIEtILCB6YyArIEtXLzIpKTtcbiAgdHYuYWRkKGJveCgna2FydG9uX29iZW4nLCBLLCB4MCArIDAuMDEsIEtILCB6YyAtIEtXLzIgKyAwLjAxNSwgeDAgKyBLRCArIDAuMDA1LCAyKktILCB6YyArIEtXLzIgKyAwLjAxKSk7XG4gIGZvciAoY29uc3QgeSBvZiBbMC4zLCAwLjMgKyBLSF0pIHR2LmFkZChib3goJ2thcnRvbl9hdWZkcnVjaycsIEtULCB4MCArIEtEICsgMC4wMDQsIHkgLSAwLjAyLCB6YyAtIDAuMjUsIHgwICsgS0QgKyAwLjAwNywgeSwgemMgKyAwLjI1KSk7XG4gIGNvbnN0IHRvcCA9IDIqS0gsIHhiID0geDAgKyAwLjI0LCB0dyA9IDAuOTcsIHRoID0gMC41NywgZmggPSAwLjA3O1xuICB0di5hZGQoYm94KCd0dl9yYWhtZW4nLCBUVk0sIHhiLCB0b3AgKyBmaCwgemMgLSB0dy8yLCB4YiArIDAuMDQ1LCB0b3AgKyBmaCArIHRoLCB6YyArIHR3LzIpKTtcbiAgdHYuYWRkKGJveCgndHZfYmlsZHNjaGlybScsIFNDUiwgeGIgKyAwLjA0NSwgdG9wICsgZmggKyAwLjAxMiwgemMgLSB0dy8yICsgMC4wMTIsIHhiICsgMC4wNDcsIHRvcCArIGZoICsgdGggLSAwLjAxMiwgemMgKyB0dy8yIC0gMC4wMTIpKTtcbiAgdHYuYWRkKGJveCgndHZfcnVlY2tzZWl0ZScsIFRWTSwgeGIgLSAwLjA0LCB0b3AgKyBmaCArIDAuMDgsIHpjIC0gMC4zLCB4YiwgdG9wICsgZmggKyAwLjQ1LCB6YyArIDAuMykpO1xuICBmb3IgKGNvbnN0IHMgb2YgWy0xLCAxXSl7XG4gICAgY29uc3QgZiA9IGJveCgndHZfZnVzcycsIEZULCAtMC4wOSwgMCwgLTAuMDEyLCAwLjA5LCAwLjAxMiwgMC4wMTIpOyBmLnBvc2l0aW9uLnNldCh4YiArIDAuMDIsIHRvcCwgemMgKyBzKjAuNDEpOyBmLnJvdGF0aW9uLnkgPSBzKjAuNTsgdHYuYWRkKGYpO1xuICAgIHR2LmFkZChib3goJ3R2X2Z1c3Nfc3RlZycsIEZULCB4YiArIDAuMDEsIHRvcCwgemMgKyBzKjAuNDEgLSAwLjAxLCB4YiArIDAuMDMsIHRvcCArIGZoLCB6YyArIHMqMC40MSArIDAuMDEpKTtcbiAgfVxuICB0di5hZGQoYm94KCdyZWNlaXZlcicsIFRWTSwgeGIgKyAwLjA2LCB0b3AsIHpjIC0gMC4yOCwgeGIgKyAwLjIsIHRvcCArIDAuMDMsIHpjIC0gMC4wNikpO1xuICB0di50cmF2ZXJzZShvID0+IHsgaWYgKG8uaXNNZXNoKXsgby5jYXN0U2hhZG93ID0gdHJ1ZTsgby5yZWNlaXZlU2hhZG93ID0gdHJ1ZTsgfSB9KTtcbiAgd29obi5hZGQodHYpO1xufVxud29obi50cmF2ZXJzZShvID0+IHsgaWYgKG8uaXNNZXNoKXsgby5jYXN0U2hhZG93ID0gdHJ1ZTsgby5yZWNlaXZlU2hhZG93ID0gdHJ1ZTsgfSB9KTtcbmhvbWUuYWRkKHdvaG4pO1xuLy8gLS0tLS0tLS0tLSBTY2hsYWZ6aW1tZXI6IFRyaXBvZC1MYW1wZSBhdWYgZGVtIEJvZGVuLCBTw7xkd2VzdC1FY2tlLCBTcG90IHp1ciBSYXVtbWl0dGUgLS0tLS0tLS0tLVxuY29uc3QgdHJpcCA9IGJ1aWxkVHJpcG9kKFRIUkVFKTtcbntcbiAgY29uc3QgSU5fVyA9IFJNX1NaWzBdLCBweCA9IElOX1cgKyAwLjM1LCBweiA9IElOX1MgLSAwLjM1O1xuICBjb25zdCBjeCA9IChSTV9TWlswXSArIFJNX1NaWzJdKS8yLCBjeiA9IChSTV9TWlsxXSArIFJNX1NaWzNdKS8yO1xuICB0cmlwLmdyb3VwLnBvc2l0aW9uLnNldChweCwgMC4wMDIsIHB6KTtcbiAgdHJpcC5ncm91cC5yb3RhdGlvbi55ID0gTWF0aC5hdGFuMihjeCAtIHB4LCBjeiAtIHB6KTtcbiAgaG9tZS5hZGQodHJpcC5ncm91cCk7XG59XG5cblxuLy8gLS0tLS0tLS0tLSBTY2hsYWZ6aW1tZXI6IEJldHQgKDE0MCDDlyAyMDAsIEtvcGZ0ZWlsIE9zdHdhbmQsIHJlY2h0cyBhbiBkZXIgU8O8ZHdhbmQpICsgU2NobWlua3Rpc2NoIC0tLS0tLS0tLS1cbntcbiAgY29uc3Qgc3ogPSBuZXcgVEhSRUUuR3JvdXAoKTsgc3oubmFtZSA9ICdzY2hsYWZ6aW1tZXJfbW9lYmVsJztcbiAgY29uc3QgYWRkID0gbSA9PiB7IHN6LmFkZChtKTsgcmV0dXJuIG07IH07XG4gIGNvbnN0IExFID0gbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgbmFtZTonYmV0dF9rdW5zdGxlZGVyJywgY29sb3I6MHhlZWU4ZGMsIHJvdWdobmVzczowLjU1IH0pO1xuICBjb25zdCBTSCA9IG5ldyBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCh7IG5hbWU6J3NwYW5uYmV0dHR1Y2gnLCBjb2xvcjoweDY3Njk2ZSwgcm91Z2huZXNzOjAuOTUgfSk7XG4gIGNvbnN0IERFID0gbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgbmFtZTona3VzY2hlbGRlY2tlJywgY29sb3I6MHg1ODU4NWIsIHJvdWdobmVzczoxIH0pO1xuICBjb25zdCBLSSA9IG5ldyBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCh7IG5hbWU6J2tpc3NlbicsIGNvbG9yOjB4ZjRmM2VmLCByb3VnaG5lc3M6MC45IH0pO1xuICBjb25zdCBMSyA9IG5ldyBUSFJFRS5NZXNoUGh5c2ljYWxNYXRlcmlhbCh7IG5hbWU6J2xhY2tfd2Vpc3NfaG9jaGdsYW56JywgY29sb3I6MHhmNmY2ZjQsIHJvdWdobmVzczowLjE1LCBjbGVhcmNvYXQ6MC44LCBjbGVhcmNvYXRSb3VnaG5lc3M6MC4xIH0pO1xuICBjb25zdCBTUCA9IG5ldyBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCh7IG5hbWU6J3NwaWVnZWxfc2NobWlua3Rpc2NoJywgY29sb3I6MHhkZmU1ZTgsIHJvdWdobmVzczowLjAzLCBtZXRhbG5lc3M6MSB9KTtcbiAgY29uc3QgQlUgPSBuZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoeyBuYW1lOidzcGllZ2VsX2Jpcm5lJywgY29sb3I6MHhmZmZmZmYsIHJvdWdobmVzczowLjMsIGVtaXNzaXZlOjB4ZmZmMWQ4LCBlbWlzc2l2ZUludGVuc2l0eTowLjE1IH0pO1xuICBjb25zdCBFID0gUk1fU1pbMl0sIFMgPSBSTV9TWlszXTtcbiAgLy8gQmV0dFxuICBjb25zdCBIQiA9IDAuMSwgYngwID0gRSAtIEhCIC0gMi4wLCBiejAgPSBTIC0gMS40NiwgYnoxID0gUyAtIDAuMDE7XG4gIGFkZChib3goJ2JldHRfc29ja2VsJywgTS5wbGludGgsIGJ4MCArIDAuMDYsIDAsIGJ6MCArIDAuMDYsIEUgLSBIQiAtIDAuMDYsIDAuMDYsIGJ6MSAtIDAuMDYpKTtcbiAgYWRkKGJveCgnYmV0dF9yYWhtZW4nLCBMRSwgYngwLCAwLjA2LCBiejAsIEUgLSBIQiwgMC4zNiwgYnoxKSk7XG4gIGFkZChib3goJ2JldHRfbWF0cmF0emUnLCBTSCwgYngwICsgMC4wMiwgMC4zNiwgYnowICsgMC4wMywgRSAtIEhCIC0gMC4wMSwgMC41NiwgYnoxIC0gMC4wMykpO1xuICBhZGQoYm94KCdiZXR0X2tvcGZ0ZWlsJywgTEUsIEUgLSBIQiwgMC4wNiwgYnowLCBFIC0gMC4wMDIsIDEuMTIsIGJ6MSkpO1xuICBhZGQoYm94KCdiZXR0X2tvcGZ0ZWlsX2FibGFnZScsIExFLCBFIC0gSEIgLSAwLjA1LCAxLjA0LCBiejAsIEUgLSAwLjAwMiwgMS4xMiwgYnoxKSk7XG4gIGZvciAoY29uc3QgeSBvZiBbMC43MiwgMC44NiwgMS4wXSkgZm9yIChsZXQgaSA9IDA7IGkgPCAxMTsgaSsrKXtcbiAgICBjb25zdCBiID0gbmV3IFRIUkVFLk1lc2gobmV3IFRIUkVFLlNwaGVyZUdlb21ldHJ5KDAuMDA5LCAxMCwgOCksIExFKTsgYi5uYW1lID0gJ2JldHRfa25vcGYnO1xuICAgIGIucG9zaXRpb24uc2V0KEUgLSBIQiAtIDAuMDAyLCB5LCBiejAgKyAwLjEgKyBpKihiejEgLSBiejAgLSAwLjIpLzEwICsgKHkgPT09IDAuODYgPyAwLjA2IDogMCkpOyBpZiAoYi5wb3NpdGlvbi56IDwgYnoxIC0gMC4wNSkgYWRkKGIpO1xuICB9XG4gIGNvbnN0IHBpbCA9IGFkZChuZXcgVEhSRUUuTWVzaChuZXcgVEhSRUUuU3BoZXJlR2VvbWV0cnkoMSwgMzIsIDE2KSwgS0kpKTsgcGlsLm5hbWUgPSAna29wZmtpc3Nlbic7XG4gIHBpbC5zY2FsZS5zZXQoMC4yLCAwLjA3LCAwLjM0KTsgcGlsLnBvc2l0aW9uLnNldChFIC0gSEIgLSAwLjI0LCAwLjYsIGJ6MCArIDAuNSk7XG4gIGFkZChib3goJ2RlY2tlX29iZW4nLCBERSwgYngwICsgMC4wNSwgMC41NiwgYnowIC0gMC4wMiwgRSAtIEhCIC0gMC41LCAwLjYsIGJ6MSAtIDAuMDIpKTtcbiAgYWRkKGJveCgnZGVja2Vfc2VpdGUnLCBERSwgYngwICsgMC4wNSwgMC4zLCBiejAgLSAwLjAzLCBFIC0gSEIgLSAwLjUsIDAuNiwgYnowIC0gMC4wMSkpO1xuICBhZGQoYm94KCdkZWNrZV9mdXNzJywgREUsIGJ4MCArIDAuMDMsIDAuMzIsIGJ6MCAtIDAuMDIsIGJ4MCArIDAuMDUsIDAuNiwgYnoxIC0gMC4wMikpO1xuICAvLyBTY2htaW5rdGlzY2ggYW4gZGVyIE9zdHdhbmQgendpc2NoZW4gSGVpemvDtnJwZXIgdW5kIEJldHQsIFNjaHVibGFkZW4gbGlua3MgKE5vcmRlbilcbiAgY29uc3QgRCA9IDAuNDUsIHgxID0gRSwgeDAgPSBFIC0gRCwgejAgPSBSTV9TWlsxXSArIDEuMCwgejEgPSB6MCArIDEuMSwgSCA9IDAuNzYsIFBXID0gMC40LCBUID0gMC4wMTg7XG4gIGFkZChib3goJ3NjaG1pbmt0aXNjaF9wbGF0dGUnLCBMSywgeDAsIEggLSAwLjAyNSwgejAsIHgxLCBILCB6MSkpO1xuICBhZGQoYm94KCdzY2htaW5rdGlzY2hfa29ycHVzJywgTEssIHgwLCAwLjA0LCB6MCwgeDEsIEggLSAwLjAyNSwgejAgKyBQVykpO1xuICBhZGQoYm94KCdzY2htaW5rdGlzY2hfc29ja2VsJywgTEssIHgwICsgMC4wMiwgMCwgejAgKyAwLjAyLCB4MSwgMC4wNCwgejAgKyBQVyAtIDAuMDIpKTtcbiAgYWRkKGJveCgnc2NobWlua3Rpc2NoX3NlaXRlJywgTEssIHgwLCAwLCB6MSAtIFQsIHgxLCBIIC0gMC4wMjUsIHoxKSk7XG4gIGFkZChib3goJ3NjaG1pbmt0aXNjaF96YXJnZScsIExLLCB4MCwgSCAtIDAuMTUsIHowICsgUFcsIHgxLCBIIC0gMC4wMjUsIHoxIC0gVCkpO1xuICBhZGQoYm94KCdzY2htaW5rdGlzY2hfcnVlY2t3YW5kJywgTEssIHgxIC0gMC4wMTUsIDAuMDQsIHowICsgUFcsIHgxLCBIIC0gMC4xNSwgejEgLSBUKSk7XG4gIGNvbnN0IGZyb250cyA9IFtbMC4wNSwgMC4yMTVdLCBbMC4yMiwgMC4zODVdLCBbMC4zOSwgMC41NTVdLCBbMC41NiwgSCAtIDAuMDNdXTtcbiAgZnJvbnRzLmZvckVhY2goKFthLCBiXSwgaSkgPT4gYWRkKGJveCgnc2NodWJsYWRlXycgKyAoaSsxKSwgTEssIHgwIC0gMC4wMTIsIGEsIHowICsgMC4wMDQsIHgwLCBiLCB6MCArIFBXIC0gMC4wMDQpKSk7XG4gIGFkZChib3goJ3NjaHVibGFkZV9taXR0ZScsIExLLCB4MCAtIDAuMDEyLCBIIC0gMC4xNDUsIHowICsgUFcgKyAwLjAwNCwgeDAsIEggLSAwLjAzLCB6MSAtIFQgLSAwLjAwNCkpO1xuICAvLyBTcGllZ2VsIG1pdCBHbMO8aGJpcm5lbiwgYXVmIGRlciBQbGF0dGUgYW4gZGllIFdhbmQgZ2VsZWhudFxuICBjb25zdCBtejAgPSB6MCArIDAuMTcsIG16MSA9IHowICsgMC45NywgbXkwID0gSCwgbXkxID0gSCArIDAuNjI7XG4gIGNvbnN0IG1pciA9IG5ldyBUSFJFRS5Hcm91cCgpOyBtaXIubmFtZSA9ICdzY2htaW5rc3BpZWdlbCc7XG4gIG1pci5hZGQoYm94KCdzY2htaW5rc3BpZWdlbF9yYWhtZW4nLCBMSywgLTAuMDM1LCAwLCBtejAsIDAsIG15MSAtIG15MCwgbXoxKSk7XG4gIG1pci5hZGQoYm94KCdzY2htaW5rc3BpZWdlbF9nbGFzJywgU1AsIC0wLjAzNywgMC4wNiwgbXowICsgMC4wNiwgLTAuMDM1LCBteTEgLSBteTAgLSAwLjA2LCBtejEgLSAwLjA2KSk7XG4gIGNvbnN0IGJ1bGIgPSAoeSwgeikgPT4geyBjb25zdCBiID0gbmV3IFRIUkVFLk1lc2gobmV3IFRIUkVFLlNwaGVyZUdlb21ldHJ5KDAuMDIxLCAxNiwgMTIpLCBCVSk7IGIubmFtZSA9ICdzY2htaW5rc3BpZWdlbF9iaXJuZSc7IGIucG9zaXRpb24uc2V0KC0wLjA0NSwgeSwgeik7IG1pci5hZGQoYik7IH07XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgODsgaSsrKSBidWxiKG15MSAtIG15MCAtIDAuMDMsIG16MCArIDAuMDQgKyBpKihtejEgLSBtejAgLSAwLjA4KS83KTtcbiAgZm9yIChsZXQgaSA9IDE7IGkgPCA1OyBpKyspeyBjb25zdCB5ID0gbXkxIC0gbXkwIC0gMC4wMyAtIGkqMC4xMzsgYnVsYih5LCBtejAgKyAwLjAzNSk7IGJ1bGIoeSwgbXoxIC0gMC4wMzUpOyB9XG4gIG1pci5wb3NpdGlvbi5zZXQoeDEgLSAwLjEsIG15MCwgMCk7IG1pci5yb3RhdGlvbi56ID0gLTAuMDg7IHN6LmFkZChtaXIpO1xuICBzei50cmF2ZXJzZShvID0+IHsgaWYgKG8uaXNNZXNoKXsgby5jYXN0U2hhZG93ID0gdHJ1ZTsgby5yZWNlaXZlU2hhZG93ID0gdHJ1ZTsgfSB9KTtcbiAgaG9tZS5hZGQoc3opO1xufVxuLy8gLS0tLS0tLS0tLSBNYXVlcnZvcnNwcnVuZyBXb2huemltbWVyICg0MSw1IMOXIDQwIGNtLCBFY2tlIFTDvHItL0F1w59lbndhbmQpIC0tLS0tLS0tLS1cbntcbiAgY29uc3QgbWF0ID0gQXJyYXkoNikuZmlsbChNLndhbGwpOyBtYXRbMl0gPSBNLmNhcDtcbiAgd2FsbHMuYWRkKGJveCgnd29obnppbW1lcl92b3JzcHJ1bmcnLCBtYXQsIElOX08gLSAwLjQxNSwgMCwgUk1fV1pbMV0sIElOX08gKyAwLjAwMSwgSEksIFJNX1daWzFdICsgMC40MCwgMS41KSk7XG59XG4vLyAtLS0tLS0tLS0tIEvDvGNoZTogRmxpZXNlbnNwaWVnZWwgYW4gZGVyIFdhbmQgenVtIEJhZCwgYWIgRmVuc3RlcnVudGVya2FudGUgNjAgY20gaG9jaCAtLS0tLS0tLS0tXG5jb25zdCB0aWxlTWF0ID0gbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgbmFtZTonaW50ZXJpb3JfdGlsZXMnLCBjb2xvcjoweGYzZjJlZSwgcm91Z2huZXNzOjAuMiB9KTtcbntcbiAgY29uc3QgeDAgPSBSTV9LVVswXSwgejAgPSAwLCB6MSA9IFpfU0NIMDtcbiAgY29uc3QgdCA9IGJveCgna3VlY2hlX2ZsaWVzZW4nLCB0aWxlTWF0LCB4MCwgV0lOX0IsIHowLCB4MCArIDAuMDA4LCBXSU5fQiArIDAuNiwgejEsIDEuMCk7XG4gIC8vIHVtIGRpZSBFY2tlIGF1ZiBkaWUgRmVuc3RlcndhbmQsIGJpcyBhbiBkaWUgRmVuc3RlcmxhaWJ1bmdcbiAgY29uc3Qgd2luVyA9IEtVX1dJTi5jIC0gS1VfV0lOLncvMjtcbiAgY29uc3QgdDIgPSBib3goJ2t1ZWNoZV9mbGllc2VuX2ZlbnN0ZXJ3YW5kJywgdGlsZU1hdCwgeDAgKyAwLjAwOCwgV0lOX0IsIHowLCB3aW5XLCBXSU5fQiArIDAuNiwgejAgKyAwLjAwOCwgMS4wKTtcbiAgdC5yZWNlaXZlU2hhZG93ID0gdDIucmVjZWl2ZVNoYWRvdyA9IHRydWU7IGhvbWUuYWRkKHQsIHQyKTtcbn1cbi8vIC0tLS0tLS0tLS0gSGVpemvDtnJwZXIgLS0tLS0tLS0tLVxuY29uc3QgcmFkTWF0ID0gbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgbmFtZTonaGVpemtvZXJwZXJfd2Vpc3MnLCBjb2xvcjoweGY0ZjNlZiwgcm91Z2huZXNzOjAuNCwgbWV0YWxuZXNzOjAuMSB9KTtcbmZ1bmN0aW9uIG1ha2VSYWRpYXRvcihuYW1lLCBsZW4pe1xuICBjb25zdCBnID0gbmV3IFRIUkVFLkdyb3VwKCk7IGcubmFtZSA9IG5hbWU7XG4gIGNvbnN0IHkwID0gMC4xNSwgeTEgPSAwLjc1LCBuID0gTWF0aC5tYXgoMywgTWF0aC5yb3VuZChsZW4vMC4wNSkpLCBzdCA9IGxlbi9uO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKyl7IGNvbnN0IHggPSAtbGVuLzIgKyBzdCooaSswLjUpOyBnLmFkZChib3gobmFtZSsnX2dsaWVkJytpLCByYWRNYXQsIHgtc3QqMC4zOCwgeTAsIC0wLjAzNSwgeCtzdCowLjM4LCB5MSwgMC4wMzUpKTsgfVxuICBnLmFkZChib3gobmFtZSsnX3NhbW1sZXJfbycsIHJhZE1hdCwgLWxlbi8yLCB5MS0wLjA1LCAtMC4wMiwgbGVuLzIsIHkxLTAuMDEsIDAuMDIpKTtcbiAgZy5hZGQoYm94KG5hbWUrJ19zYW1tbGVyX3UnLCByYWRNYXQsIC1sZW4vMiwgeTArMC4wMSwgLTAuMDIsIGxlbi8yLCB5MCswLjA1LCAwLjAyKSk7XG4gIGNvbnN0IHYgPSBuZXcgVEhSRUUuTWVzaChuZXcgVEhSRUUuQ3lsaW5kZXJHZW9tZXRyeSgwLjAxOCwgMC4wMTgsIDAuMDgsIDIwKSwgcmFkTWF0KTsgdi5uYW1lID0gbmFtZSsnX3ZlbnRpbCc7IHYucG9zaXRpb24uc2V0KGxlbi8yKzAuMDMsIHkxLTAuMDQsIDApOyBnLmFkZCh2KTtcbiAgY29uc3QgcCA9IG5ldyBUSFJFRS5NZXNoKG5ldyBUSFJFRS5DeWxpbmRlckdlb21ldHJ5KDAuMDEsIDAuMDEsIHkwLCAxMiksIE0ubWV0YWwpOyBwLm5hbWUgPSBuYW1lKydfcm9ocic7IHAucG9zaXRpb24uc2V0KC1sZW4vMiswLjAyLCB5MC8yLCAwKTsgZy5hZGQocCk7XG4gIGcudHJhdmVyc2UobyA9PiB7IGlmIChvLmlzTWVzaCl7IG8uY2FzdFNoYWRvdyA9IHRydWU7IG8ucmVjZWl2ZVNoYWRvdyA9IHRydWU7IH0gfSk7XG4gIHJldHVybiBnO1xufVxue1xuICAvLyBTY2hsYWZ6aW1tZXI6IGFuIGRlciBNaXR0ZWx3YW5kLCA0MeKAkzg2IGNtIHZvbiBkZXIgVMO8cndhbmRcbiAgY29uc3QgaDEgPSBtYWtlUmFkaWF0b3IoJ2hlaXprb2VycGVyX3NjaGxhZnppbW1lcicsIDAuNDUpO1xuICBoMS5wb3NpdGlvbi5zZXQoUk1fU1pbMl0gLSAwLjA3NSwgMCwgUk1fU1pbMV0gKyAwLjQxICsgMC4yMjUpOyBoMS5yb3RhdGlvbi55ID0gTWF0aC5QSS8yO1xuICAvLyBXb2huemltbWVyOiBhbiBkZXIgVMO8cndhbmQgZGlyZWt0IG5lYmVuIGRlciBUw7xyLCBSaWNodHVuZyBNaXR0ZWx3YW5kXG4gIGNvbnN0IGgyID0gbWFrZVJhZGlhdG9yKCdoZWl6a29lcnBlcl93b2huemltbWVyJywgMC40OCk7XG4gIGgyLnBvc2l0aW9uLnNldChXWl9ET09SLmMgLSBXWl9ET09SLncvMiAtIDAuMDIgLSAwLjI0LCAwLCBSTV9XWlsxXSArIDAuMDc1KTtcbiAgaG9tZS5hZGQoaDEsIGgyKTtcbn1cblxuLy8gLS0tLS0tLS0tLSBCYWQgKG5hY2ggRm90byk6IFdhbm5lIHJlY2h0cywgV0MgKyBXYXNjaHRpc2NoIGxpbmtzLCBGbGllc2VuIC0tLS0tLS0tLS1cbntcbiAgY29uc3QgYmFkID0gbmV3IFRIUkVFLkdyb3VwKCk7IGJhZC5uYW1lID0gJ2JhZCc7XG4gIGNvbnN0IFtXLCBOLCBFLCBTWl0gPSBSTV9CQUQsIFRUID0gMC4wMDgsIFNDWCA9IFhfU0NILCBTQ1ogPSBaX1NDSDA7XG4gIGNvbnN0IGFkZCA9IG0gPT4geyBiYWQuYWRkKG0pOyByZXR1cm4gbTsgfTtcbiAgY29uc3QgYnggPSAobiwgbWF0LCAuLi5hKSA9PiBhZGQoYm94KG4sIG1hdCwgLi4uYSkpO1xuICBmdW5jdGlvbiBjeWwobiwgbWF0LCByLCBoLCB4LCB5LCB6LCBheGlzLCByMil7XG4gICAgY29uc3QgbSA9IG5ldyBUSFJFRS5NZXNoKG5ldyBUSFJFRS5DeWxpbmRlckdlb21ldHJ5KHIsIHIyID8/IHIsIGgsIDI4KSwgbWF0KTsgbS5uYW1lID0gbjsgbS5wb3NpdGlvbi5zZXQoeCwgeSwgeik7XG4gICAgaWYgKGF4aXMgPT09ICd4JykgbS5yb3RhdGlvbi56ID0gTWF0aC5QSS8yOyBpZiAoYXhpcyA9PT0gJ3onKSBtLnJvdGF0aW9uLnggPSBNYXRoLlBJLzI7IHJldHVybiBhZGQobSk7XG4gIH1cbiAgZnVuY3Rpb24gdGlsZVRleChweCwgbiwgYmFzZSwgZ3JvdXQsIHZlaW5zLCBzZWVkKXtcbiAgICBjb25zdCBjID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7IGMud2lkdGggPSBjLmhlaWdodCA9IHB4Km47IGNvbnN0IGcgPSBjLmdldENvbnRleHQoJzJkJyk7XG4gICAgZy5maWxsU3R5bGUgPSBiYXNlOyBnLmZpbGxSZWN0KDAsIDAsIGMud2lkdGgsIGMuaGVpZ2h0KTtcbiAgICBjb25zdCBybmQgPSAoKSA9PiAoc2VlZCA9IChzZWVkKjE2ODA3KSAlIDIxNDc0ODM2NDcpIC8gMjE0NzQ4MzY0NztcbiAgICBnLmxpbmVXaWR0aCA9IDEuNDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZlaW5zOyBpKyspe1xuICAgICAgZy5zdHJva2VTdHlsZSA9ICdyZ2JhKDEyNSwxMjcsMTMyLCcgKyAoMC4wNSArIHJuZCgpKjAuMDcpICsgJyknOyBnLmJlZ2luUGF0aCgpO1xuICAgICAgbGV0IHggPSBybmQoKSpjLndpZHRoLCB5ID0gcm5kKCkqYy5oZWlnaHQ7IGcubW92ZVRvKHgsIHkpO1xuICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCA0OyBrKyspeyBjb25zdCBjeCA9IHggKyAocm5kKCktLjUpKnB4LCBjeSA9IHkgKyAocm5kKCktLjUpKnB4OyB4ICs9IChybmQoKS0uNSkqcHgqMS4zOyB5ICs9IChybmQoKS0uNSkqcHgqMS4zOyBnLnF1YWRyYXRpY0N1cnZlVG8oY3gsIGN5LCB4LCB5KTsgfVxuICAgICAgZy5zdHJva2UoKTtcbiAgICB9XG4gICAgZy5maWxsU3R5bGUgPSBncm91dDsgY29uc3QgZ3cgPSBNYXRoLm1heCgzLCBweC8zMik7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspeyBnLmZpbGxSZWN0KGkqcHgsIDAsIGd3LCBjLmhlaWdodCk7IGcuZmlsbFJlY3QoMCwgaSpweCwgYy53aWR0aCwgZ3cpOyB9XG4gICAgY29uc3QgdCA9IG5ldyBUSFJFRS5DYW52YXNUZXh0dXJlKGMpOyB0LndyYXBTID0gdC53cmFwVCA9IFRIUkVFLlJlcGVhdFdyYXBwaW5nOyB0LmNvbG9yU3BhY2UgPSBUSFJFRS5TUkdCQ29sb3JTcGFjZTsgdC5hbmlzb3Ryb3B5ID0gODsgcmV0dXJuIHQ7XG4gIH1cbiAgY29uc3QgQk0gPSB7XG4gICAgd2FuZDogICBuZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoeyBuYW1lOidiYWRfd2FuZGZsaWVzZW4nLCBtYXA6IHRpbGVUZXgoMTI4LCA0LCAnI2YzZjNmMScsICcjYzZjNmMyJywgNDYsIDExKSwgcm91Z2huZXNzOjAuMTYgfSksXG4gICAgYm9kZW46ICBuZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoeyBuYW1lOidiYWRfYm9kZW5mbGllc2VuJywgbWFwOiB0aWxlVGV4KDEyOCwgNCwgJyNlZmVlZWInLCAnI2E2YTVhMCcsIDM0LCAyOSksIHJvdWdobmVzczowLjMyIH0pLFxuICAgIGVtYWlsOiAgbmV3IFRIUkVFLk1lc2hQaHlzaWNhbE1hdGVyaWFsKHsgbmFtZTonc2FuaXRhZXJfZW1haWwnLCBjb2xvcjoweGZiZmJmYSwgcm91Z2huZXNzOjAuMSwgY2xlYXJjb2F0OjEsIGNsZWFyY29hdFJvdWdobmVzczowLjA2IH0pLFxuICAgIGNocm9tOiAgbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgbmFtZTonY2hyb20nLCBjb2xvcjoweGU2ZThlYSwgcm91Z2huZXNzOjAuMDgsIG1ldGFsbmVzczoxIH0pLFxuICAgIHNwaWVnZWw6bmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgbmFtZTonc3BpZWdlbCcsIGNvbG9yOjB4ZTJlOGVjLCByb3VnaG5lc3M6MC4wMiwgbWV0YWxuZXNzOjEgfSksXG4gICAgZ2xhczogICBuZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoeyBuYW1lOidnbGFzYWJsYWdlJywgY29sb3I6MHhjZmU2ZTAsIHJvdWdobmVzczowLjA1LCB0cmFuc3BhcmVudDp0cnVlLCBvcGFjaXR5OjAuNDUgfSksXG4gICAgZGVrb3I6ICBuZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoeyBuYW1lOidkZWtvcmZsaWVzZScsIGNvbG9yOjB4OWZiMGMyLCByb3VnaG5lc3M6MC4yIH0pLFxuICAgIHBsYXN0OiAgbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgbmFtZTond2Nfc2l0eicsIGNvbG9yOjB4ZjdmN2Y1LCByb3VnaG5lc3M6MC4zIH0pLFxuICB9O1xuICBjb25zdCBlbWFpbEluID0gQk0uZW1haWwuY2xvbmUoKTsgZW1haWxJbi5uYW1lID0gJ3Nhbml0YWVyX2VtYWlsX2lubmVuJzsgZW1haWxJbi5zaWRlID0gVEhSRUUuQmFja1NpZGU7XG4gIGNvbnN0IGVtYWlsRFMgPSBCTS5lbWFpbC5jbG9uZSgpOyBlbWFpbERTLm5hbWUgPSAnc2FuaXRhZXJfZW1haWxfZHMnOyBlbWFpbERTLnNpZGUgPSBUSFJFRS5Eb3VibGVTaWRlO1xuICAvLyBNaWxjaGdsYXMgaW0gQmFkZmVuc3RlclxuICBjb25zdCBmZyA9IHdpbmRvd3MuZ2V0T2JqZWN0QnlOYW1lKCdmZW5zdGVyX2JhZF9nbGFzJyk7XG4gIGlmIChmZykgZmcubWF0ZXJpYWwgPSBuZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoeyBuYW1lOidtaWxjaGdsYXMnLCBjb2xvcjoweGYyZjVmNSwgcm91Z2huZXNzOjAuNywgdHJhbnNwYXJlbnQ6dHJ1ZSwgb3BhY2l0eTowLjg1IH0pO1xuXG4gIC8vIEJvZGVuICsgV2FuZGZsaWVzZW4gKGhhbGJob2NoIDEsMjUgbSwgdW0gZGllIFdhbm5lIDIsMDUgbSlcbiAgY29uc3QgSFQgPSAxLjI1LCBGVCA9IDIuMDU7XG4gIGNvbnN0IFRXID0gMC43OCwgVEwgPSAxLjc1LCBMRURHRSA9IDAuMiwgVFgwID0gRSAtIFRXLCBUWjEgPSBOICsgTEVER0UgKyBUTDtcbiAgY29uc3Qgd3hjID0gMi4yNSwgd2wgPSB3eGMgLSAwLjQsIHdyID0gd3hjICsgMC40LCBkeGMgPSBCQURfRE9PUi5jLCBEVyA9IEJBRF9ET09SLnc7XG4gIC8vIFZvcndhbmQgYW4gZGVyIEZlbnN0ZXJ3YW5kOiB2b24gZGVyIFdlc3R3YW5kIGJpcyBhbnMgRmVuc3RlciwgMTUgY20gdm9yZ2V6b2dlblxuICBjb25zdCBWRCA9IDAuMTU7XG4gIHsgY29uc3Qgdm0gPSBBcnJheSg2KS5maWxsKE0ud2FsbCk7IHZtWzJdID0gTS5jYXA7IHdhbGxzLmFkZChib3goJ2JhZF92b3J3YW5kJywgdm0sIFcsIDAsIE4sIHdsLCBISSwgTiArIFZELCAxLjUpKTsgfVxuICBieCgnYmFkX2JvZGVuJywgQk0uYm9kZW4sIFcsIDAsIE4sIEUsIDAuMDA4LCBTWiwgMC44KTtcbiAgYngoJ2JhZF9mbGllc2VuX3dlc3QnLCBCTS53YW5kLCBXLCAwLCBOICsgVkQgKyBUVCwgVyArIFRULCBIVCwgU1osIDAuNik7XG4gIGJ4KCdiYWRfZmxpZXNlbl92b3J3YW5kJywgQk0ud2FuZCwgVywgMCwgTiArIFZELCB3bCwgSFQsIE4gKyBWRCArIFRULCAwLjYpO1xuICBieCgnYmFkX2ZsaWVzZW5fdm9yd2FuZF9zZWl0ZScsIEJNLndhbmQsIHdsIC0gMC4wMDEsIDAsIE4sIHdsICsgVFQsIEhULCBOICsgVkQgKyBUVCwgMC42KTtcbiAgYngoJ2JhZF9mbGllc2VuX25vcmRfMicsIEJNLndhbmQsIHdsLCAwLCBOLCB3ciwgV0lOX0IgLSAwLjAzLCBOICsgVFQsIDAuNik7XG4gIGJ4KCdiYWRfZmxpZXNlbl9ub3JkXzMnLCBCTS53YW5kLCB3ciwgMCwgTiwgRSAtIFRULCBGVCwgTiArIFRULCAwLjYpO1xuICBieCgnYmFkX2ZsaWVzZW5fb3N0XzEnLCBCTS53YW5kLCBFIC0gVFQsIDAsIE4sIEUsIEZULCBUWjEsIDAuNik7XG4gIGJ4KCdiYWRfZmxpZXNlbl9vc3RfMicsIEJNLndhbmQsIEUgLSBUVCwgMCwgVFoxLCBFLCBIVCwgU0NaLCAwLjYpO1xuICBieCgnYmFkX2ZsaWVzZW5fc2NoYWNodF9uJywgQk0ud2FuZCwgU0NYIC0gVFQsIDAsIFNDWiAtIFRULCBFIC0gVFQsIEhULCBTQ1osIDAuNik7XG4gIGJ4KCdiYWRfZmxpZXNlbl9zY2hhY2h0X3cnLCBCTS53YW5kLCBTQ1ggLSBUVCwgMCwgU0NaLCBTQ1gsIEhULCBTWiwgMC42KTtcbiAgYngoJ2JhZF9mbGllc2VuX3N1ZWRfMScsIEJNLndhbmQsIFcgKyBUVCwgMCwgU1ogLSBUVCwgZHhjIC0gRFcvMiwgSFQsIFNaLCAwLjYpO1xuICBieCgnYmFkX2ZsaWVzZW5fc3VlZF8yJywgQk0ud2FuZCwgZHhjICsgRFcvMiwgMCwgU1ogLSBUVCwgU0NYIC0gVFQsIEhULCBTWiwgMC42KTtcbiAgZm9yIChjb25zdCBbeSwgel0gb2YgW1sxLjE1LCBOICsgMC43NV0sIFsxLjcyLCBOICsgMC41NV1dKXtcbiAgICBjb25zdCBkID0gYngoJ2JhZF9kZWtvcmZsaWVzZScsIEJNLmRla29yLCAtMC4wMDEsIC0wLjA0LCAtMC4wNCwgMC4wMDEsIDAuMDQsIDAuMDQpO1xuICAgIGQucm90YXRpb24ueCA9IE1hdGguUEkvNDsgZC5wb3NpdGlvbi5zZXQoRSAtIFRUIC0gMC4wMDEsIHksIHopO1xuICB9XG5cbiAgLy8gQmFkZXdhbm5lLCBlaW5nZWZsaWVzdCwgbWl0IEFibGFnZSBhbSBLb3BmZW5kZVxuICBieCgnd2FubmVfYWJsYWdlJywgQk0ud2FuZCwgVFgwLCAwLjAwOCwgTiArIFRULCBFIC0gVFQsIDAuNiwgTiArIExFREdFLCAwLjYpO1xuICBieCgnd2FubmVfc2NodWVyemUnLCBCTS53YW5kLCBUWDAsIDAuMDA4LCBOICsgTEVER0UsIFRYMCArIDAuMDMsIDAuNTY1LCBUWjEsIDAuNik7XG4gIGJ4KCd3YW5uZV9zY2h1ZXJ6ZV9lbmRlJywgQk0ud2FuZCwgVFgwLCAwLjAwOCwgVFoxIC0gMC4wMywgRSAtIFRULCAwLjU2NSwgVFoxLCAwLjYpO1xuICBmdW5jdGlvbiBycihwLCB3LCBkLCByKXsgY29uc3QgeCA9IC13LzIsIHkgPSAtZC8yO1xuICAgIHAubW92ZVRvKHggKyByLCB5KTsgcC5saW5lVG8oeCArIHcgLSByLCB5KTsgcC5xdWFkcmF0aWNDdXJ2ZVRvKHggKyB3LCB5LCB4ICsgdywgeSArIHIpOyBwLmxpbmVUbyh4ICsgdywgeSArIGQgLSByKTtcbiAgICBwLnF1YWRyYXRpY0N1cnZlVG8oeCArIHcsIHkgKyBkLCB4ICsgdyAtIHIsIHkgKyBkKTsgcC5saW5lVG8oeCArIHIsIHkgKyBkKTsgcC5xdWFkcmF0aWNDdXJ2ZVRvKHgsIHkgKyBkLCB4LCB5ICsgZCAtIHIpO1xuICAgIHAubGluZVRvKHgsIHkgKyByKTsgcC5xdWFkcmF0aWNDdXJ2ZVRvKHgsIHksIHggKyByLCB5KTsgcmV0dXJuIHA7IH1cbiAgY29uc3QgdGN4ID0gRSAtIFRULzIgLSBUVy8yICsgVFQvMiwgdGN6ID0gTiArIExFREdFICsgVEwvMiwgSVcgPSBUVyAtIDAuMTQsIElMID0gVEwgLSAwLjE4LCBJUiA9IDAuMjI7XG4gIGNvbnN0IHJpbVMgPSBycihuZXcgVEhSRUUuU2hhcGUoKSwgVFcgLSBUVCwgVEwsIDAuMDIpOyByaW1TLmhvbGVzLnB1c2gocnIobmV3IFRIUkVFLlBhdGgoKSwgSVcsIElMLCBJUikpO1xuICBjb25zdCByaW1HID0gbmV3IFRIUkVFLkV4dHJ1ZGVHZW9tZXRyeShyaW1TLCB7IGRlcHRoOjAuMDM1LCBiZXZlbEVuYWJsZWQ6ZmFsc2UsIGN1cnZlU2VnbWVudHM6MTYgfSk7XG4gIHJpbUcucm90YXRlWCgtTWF0aC5QSS8yKTsgcmltRy50cmFuc2xhdGUodGN4LCAwLjU2NSwgdGN6KTtcbiAgYWRkKG5ldyBUSFJFRS5NZXNoKHJpbUcsIEJNLmVtYWlsKSkubmFtZSA9ICd3YW5uZV9yYW5kJztcbiAgY29uc3QgYmFzRyA9IG5ldyBUSFJFRS5FeHRydWRlR2VvbWV0cnkocnIobmV3IFRIUkVFLlNoYXBlKCksIElXLCBJTCwgSVIpLCB7IGRlcHRoOjAuNDEsIGJldmVsRW5hYmxlZDpmYWxzZSwgY3VydmVTZWdtZW50czoxNiB9KTtcbiAgYmFzRy5yb3RhdGVYKC1NYXRoLlBJLzIpOyBiYXNHLnRyYW5zbGF0ZSh0Y3gsIDAuMTYsIHRjeik7XG4gIGFkZChuZXcgVEhSRUUuTWVzaChiYXNHLCBlbWFpbEluKSkubmFtZSA9ICd3YW5uZV9pbm5lbic7XG4gIGNvbnN0IG16MCA9IFRaMSAtIDAuMzU7XG4gIGN5bCgnd2FubmVfYWJsYXVmJywgQk0uY2hyb20sIDAuMDI0LCAwLjAwNCwgdGN4LCAwLjE2MywgbXowIC0gMC4wNSk7XG4gIC8vIFdhbm5lbmFybWF0dXIgYW4gZGVyIE9zdHdhbmRcbiAgY3lsKCdhcm1hdHVyX2tvZXJwZXInLCBCTS5jaHJvbSwgMC4wMjQsIDAuMiwgRSAtIDAuMDc1LCAwLjgsIG16MCwgJ3onKTtcbiAgZm9yIChjb25zdCBzIG9mIFstMSwgMV0pe1xuICAgIGN5bCgnYXJtYXR1cl9hbnNjaGx1c3MnLCBCTS5jaHJvbSwgMC4wMSwgMC4wNzUsIEUgLSAwLjA0LCAwLjgsIG16MCArIHMqMC4wOCwgJ3gnKTtcbiAgICBjeWwoJ2FybWF0dXJfcm9zZXR0ZScsIEJNLmNocm9tLCAwLjAzLCAwLjAwOCwgRSAtIFRUIC0gMC4wMDQsIDAuOCwgbXowICsgcyowLjA4LCAneCcpO1xuICB9XG4gIGN5bCgnYXJtYXR1cl9hdXNsYXVmJywgQk0uY2hyb20sIDAuMDEyLCAwLjExLCBFIC0gMC4xMzUsIDAuNzc1LCBtejAsICd4Jyk7XG4gIGJ4KCdhcm1hdHVyX2hlYmVsJywgQk0uY2hyb20sIEUgLSAwLjA4NSwgMC44MiwgbXowIC0gMC4wMTIsIEUgLSAwLjAzLCAwLjgzNSwgbXowICsgMC4wMTIpO1xuICAvLyBEdXNjaHN0YW5nZSArIEhhbmRicmF1c2UgKyBTY2hsYXVjaFxuICBjb25zdCByeiA9IFRaMSAtIDAuODUsIHJ4ID0gRSAtIDAuMDQ1O1xuICBjeWwoJ2R1c2Noc3RhbmdlJywgQk0uY2hyb20sIDAuMDEyLCAwLjk1LCByeCwgMS42LCByeik7XG4gIGZvciAoY29uc3QgeSBvZiBbMS4xMywgMi4wN10peyBjeWwoJ2R1c2Noc3RhbmdlX2hhbHRlcicsIEJNLmNocm9tLCAwLjAxLCAwLjA0NSwgRSAtIDAuMDIyLCB5LCByeiwgJ3gnKTsgY3lsKCdkdXNjaHN0YW5nZV9yb3NldHRlJywgQk0uY2hyb20sIDAuMDIyLCAwLjAxLCBFIC0gVFQgLSAwLjAwNSwgeSwgcnosICd4Jyk7IH1cbiAgYngoJ2R1c2Noc3RhbmdlX3NjaGllYmVyJywgQk0uY2hyb20sIHJ4IC0gMC4wMzUsIDEuNjgsIHJ6IC0gMC4wMjIsIHJ4ICsgMC4wMiwgMS43NiwgcnogKyAwLjAyMik7XG4gIGNvbnN0IGJyYXVzZSA9IG5ldyBUSFJFRS5Hcm91cCgpOyBicmF1c2UubmFtZSA9ICdoYW5kYnJhdXNlJzsgYnJhdXNlLnBvc2l0aW9uLnNldChyeCAtIDAuMDYsIDEuNzIsIHJ6KTsgYnJhdXNlLnJvdGF0aW9uLnogPSAwLjU7XG4gIHsgY29uc3QgaCA9IG5ldyBUSFJFRS5NZXNoKG5ldyBUSFJFRS5DeWxpbmRlckdlb21ldHJ5KDAuMDEzLCAwLjAxMSwgMC4yLCAyMCksIEJNLmNocm9tKTsgaC5uYW1lID0gJ2hhbmRicmF1c2VfZ3JpZmYnOyBicmF1c2UuYWRkKGgpO1xuICAgIGNvbnN0IGsgPSBuZXcgVEhSRUUuTWVzaChuZXcgVEhSRUUuQ3lsaW5kZXJHZW9tZXRyeSgwLjA0NSwgMC4wMywgMC4wMjUsIDMyKSwgQk0uY2hyb20pOyBrLm5hbWUgPSAnaGFuZGJyYXVzZV9rb3BmJzsgay5wb3NpdGlvbi55ID0gMC4xMTsgay5yb3RhdGlvbi56ID0gTWF0aC5QSS8yIC0gMC4zOyBicmF1c2UuYWRkKGspOyB9XG4gIGFkZChicmF1c2UpO1xuICBjb25zdCBoYjAgPSBuZXcgVEhSRUUuVmVjdG9yMyhyeCAtIDAuMDYgKyAwLjEqTWF0aC5zaW4oMC41KSwgMS43MiAtIDAuMSpNYXRoLmNvcygwLjUpLCByeik7XG4gIGNvbnN0IGhvc2UgPSBuZXcgVEhSRUUuQ2F0bXVsbFJvbUN1cnZlMyhbaGIwLCBuZXcgVEhSRUUuVmVjdG9yMyhFIC0gMC4wOSwgMS4yLCByeiArIDAuMDgpLCBuZXcgVEhSRUUuVmVjdG9yMyhFIC0gMC4yLCAwLjcsIChyeiArIG16MCkvMiArIDAuMDUpLCBuZXcgVEhSRUUuVmVjdG9yMyhFIC0gMC4xMiwgMC42NiwgbXowIC0gMC4wMiksIG5ldyBUSFJFRS5WZWN0b3IzKEUgLSAwLjA4NSwgMC43NywgbXowIC0gMC4wMyldKTtcbiAgYWRkKG5ldyBUSFJFRS5NZXNoKG5ldyBUSFJFRS5UdWJlR2VvbWV0cnkoaG9zZSwgODAsIDAuMDA3LCA4KSwgQk0uY2hyb20pKS5uYW1lID0gJ2JyYXVzZXNjaGxhdWNoJztcbiAgLy8gSGFsdGVncmlmZlxuICBjb25zdCBneiA9IFRaMSAtIDAuNjtcbiAgY3lsKCdoYWx0ZWdyaWZmJywgQk0uY2hyb20sIDAuMDEzLCAwLjM2LCBFIC0gMC4wNjUsIDEuMTIsIGd6KTtcbiAgZm9yIChjb25zdCB5IG9mIFswLjk2LCAxLjI4XSkgY3lsKCdoYWx0ZWdyaWZmX3N0dWV0emUnLCBCTS5jaHJvbSwgMC4wMTIsIDAuMDYsIEUgLSAwLjAzNSwgeSwgZ3osICd4Jyk7XG4gIC8vIFZvcmhhbmdzdGFuZ2Ugb2JlblxuICBjeWwoJ3ZvcmhhbmdzdGFuZ2UnLCBCTS5jaHJvbSwgMC4wMSwgVEwgLSAwLjIsIEUgLSAwLjA5LCAyLjE1LCBOICsgTEVER0UgKyBUTC8yIC0gMC4xLCAneicpO1xuICBjeWwoJ3ZvcmhhbmdzdGFuZ2VfaGFsdGVyJywgQk0uY2hyb20sIDAuMDA5LCAwLjA5LCBFIC0gMC4wNDUsIDIuMTUsIE4gKyBMRURHRSArIDAuMDUsICd4Jyk7XG5cbiAgLy8gV0MgYW4gZGVyIFdlc3R3YW5kIChCbGljayB6dXIgV2FubmUpLCBBdWZwdXR6LVNww7xsa2FzdGVuXG4gIGNvbnN0IHdjID0gbmV3IFRIUkVFLkdyb3VwKCk7IHdjLm5hbWUgPSAnd2MnOyB3Yy5wb3NpdGlvbi5zZXQoVyArIFRULCAwLCBOICsgVkQgKyAwLjQ1KTsgd2Mucm90YXRpb24ueSA9IE1hdGguUEkvMjtcbiAgeyBjb25zdCB3YSA9IG0gPT4geyB3Yy5hZGQobSk7IHJldHVybiBtOyB9O1xuICAgIHdhKGJveCgnd2Nfc29ja2VsX2hpbnRlbicsIEJNLmVtYWlsLCAtMC4xMywgMC4wMDgsIDAsIDAuMTMsIDAuMzgsIDAuMjIpKTtcbiAgICBjb25zdCBwID0gbmV3IFRIUkVFLk1lc2gobmV3IFRIUkVFLkN5bGluZGVyR2VvbWV0cnkoMC4xNSwgMC4xMTUsIDAuMzIsIDQwKSwgQk0uZW1haWwpOyBwLm5hbWUgPSAnd2NfZnVzcyc7IHAuc2NhbGUueiA9IDEuMzsgcC5wb3NpdGlvbi5zZXQoMCwgMC4xNjgsIDAuMzcpOyB3YShwKTtcbiAgICBjb25zdCBiID0gbmV3IFRIUkVFLk1lc2gobmV3IFRIUkVFLkN5bGluZGVyR2VvbWV0cnkoMC4xODUsIDAuMTUsIDAuMDgsIDQ4KSwgQk0uZW1haWwpOyBiLm5hbWUgPSAnd2NfYmVja2VuJzsgYi5zY2FsZS56ID0gMS4zOyBiLnBvc2l0aW9uLnNldCgwLCAwLjM2NSwgMC40MSk7IHdhKGIpO1xuICAgIGNvbnN0IHMgPSBuZXcgVEhSRUUuTWVzaChuZXcgVEhSRUUuQ3lsaW5kZXJHZW9tZXRyeSgwLjE4NSwgMC4xODUsIDAuMDIsIDQ4KSwgQk0ucGxhc3QpOyBzLm5hbWUgPSAnd2Nfc2l0eic7IHMuc2NhbGUueiA9IDEuMzsgcy5wb3NpdGlvbi5zZXQoMCwgMC40MTUsIDAuNDEpOyB3YShzKTtcbiAgICBjb25zdCBkID0gbmV3IFRIUkVFLk1lc2gobmV3IFRIUkVFLkN5bGluZGVyR2VvbWV0cnkoMC4xNzgsIDAuMTc4LCAwLjAyMiwgNDgpLCBCTS5wbGFzdCk7IGQubmFtZSA9ICd3Y19kZWNrZWwnOyBkLnNjYWxlLnogPSAxLjI4OyBkLnBvc2l0aW9uLnNldCgwLCAwLjQzNiwgMC40MSk7IHdhKGQpO1xuICAgIHdhKGJveCgnd2Nfc2NoYXJuaWVyJywgQk0ucGxhc3QsIC0wLjEsIDAuNDA1LCAwLjE1LCAwLjEsIDAuNDQsIDAuMikpO1xuICAgIHdhKGJveCgnd2Nfc3B1ZWxrYXN0ZW4nLCBCTS5lbWFpbCwgLTAuMiwgMC44LCAwLCAwLjIsIDEuMiwgMC4xNSkpO1xuICAgIGNvbnN0IHQgPSBuZXcgVEhSRUUuTWVzaChuZXcgVEhSRUUuQ3lsaW5kZXJHZW9tZXRyeSgwLjAyLCAwLjAyLCAwLjAyLCAyOCksIEJNLmVtYWlsKTsgdC5uYW1lID0gJ3djX3NwdWVsdGFzdGUnOyB0LnBvc2l0aW9uLnNldCgtMC4xMiwgMS4yMSwgMC4wOSk7IHdhKHQpO1xuICAgIGNvbnN0IHIgPSBuZXcgVEhSRUUuTWVzaChuZXcgVEhSRUUuQ3lsaW5kZXJHZW9tZXRyeSgwLjAyNSwgMC4wMjUsIDAuNCwgMjgpLCBCTS5lbWFpbCk7IHIubmFtZSA9ICd3Y19zcHVlbHJvaHInOyByLnBvc2l0aW9uLnNldCgwLCAwLjYsIDAuMDgpOyB3YShyKTsgfVxuICBhZGQod2MpO1xuICAvLyBXYXNzZXJ6w6RobGVyICsgVmVudGlsIGFuIGRlciBWb3J3YW5kLCBQYXBpZXJoYWx0ZXIgdW50ZXIgZGVtIEZlbnN0ZXJcbiAgY3lsKCdiYWRfd2Fzc2VyemFlaGxlcicsIEJNLmNocm9tLCAwLjA1NSwgMC4wMywgd2wgLSAwLjEzLCAwLjk4LCBOICsgVkQgKyBUVCArIDAuMDE1LCAneicpO1xuICBjeWwoJ2JhZF93YXNzZXJ6YWVobGVyX2dsYXMnLCBCTS5wbGFzdCwgMC4wMzUsIDAuMDM0LCB3bCAtIDAuMTMsIDAuOTgsIE4gKyBWRCArIFRUICsgMC4wMTcsICd6Jyk7XG4gIGN5bCgnYmFkX3ZlbnRpbCcsIEJNLmNocm9tLCAwLjAyOCwgMC4wNSwgd2wgLSAwLjEzLCAxLjIsIE4gKyBWRCArIFRUICsgMC4wMjUsICd6Jyk7XG4gIGJ4KCdwYXBpZXJoYWx0ZXInLCBCTS5jaHJvbSwgd3hjIC0gMC4wMiwgMC42MiwgTiArIFRULCB3eGMgKyAwLjEyLCAwLjcsIE4gKyAwLjA4KTtcblxuICAvLyBXYXNjaHRpc2NoIGFuIGRlciBXZXN0d2FuZCwgU3BpZWdlbCArIEdsYXNhYmxhZ2VuIGRhcsO8YmVyXG4gIGNvbnN0IGJ6ID0gTiArIDEuMzUsIEJSID0gMC4zLCBTWCA9IDAuODcsIFJZID0gMC44NSwgYmN4ID0gVyArIDAuMjtcbiAgeyBjb25zdCBvID0gbmV3IFRIUkVFLk1lc2gobmV3IFRIUkVFLkN5bGluZGVyR2VvbWV0cnkoQlIsIDAuMiwgMC4xNywgNDgsIDEsIHRydWUpLCBlbWFpbERTKTsgby5uYW1lID0gJ3dhc2NoYmVja2VuX2F1c3Nlbic7IG8uc2NhbGUueCA9IFNYOyBvLnBvc2l0aW9uLnNldChiY3gsIFJZIC0gMC4wODUsIGJ6KTsgYWRkKG8pO1xuICAgIGNvbnN0IGYgPSBuZXcgVEhSRUUuTWVzaChuZXcgVEhSRUUuQ2lyY2xlR2VvbWV0cnkoMC4yLCA0OCksIEJNLmVtYWlsKTsgZi5uYW1lID0gJ3dhc2NoYmVja2VuX3VudGVuJzsgZi5yb3RhdGlvbi54ID0gTWF0aC5QSS8yOyBmLnNjYWxlLnggPSBTWDsgZi5wb3NpdGlvbi5zZXQoYmN4LCBSWSAtIDAuMTcsIGJ6KTsgYWRkKGYpO1xuICAgIGNvbnN0IHIgPSBuZXcgVEhSRUUuTWVzaChuZXcgVEhSRUUuUmluZ0dlb21ldHJ5KDAuMjM1LCBCUiwgNDgpLCBCTS5lbWFpbCk7IHIubmFtZSA9ICd3YXNjaGJlY2tlbl9yYW5kJzsgci5yb3RhdGlvbi54ID0gLU1hdGguUEkvMjsgci5zY2FsZS54ID0gU1g7IHIucG9zaXRpb24uc2V0KGJjeCwgUlksIGJ6KTsgYWRkKHIpO1xuICAgIGNvbnN0IGkgPSBuZXcgVEhSRUUuTWVzaChuZXcgVEhSRUUuU3BoZXJlR2VvbWV0cnkoMC4yMzUsIDQ4LCAxNiwgMCwgTWF0aC5QSSoyLCBNYXRoLlBJLzIsIE1hdGguUEkvMiksIGVtYWlsRFMpOyBpLm5hbWUgPSAnd2FzY2hiZWNrZW5faW5uZW4nOyBpLnNjYWxlLnNldChTWCwgMC41NSwgMSk7IGkucG9zaXRpb24uc2V0KGJjeCwgUlksIGJ6KTsgYWRkKGkpOyB9XG4gIGN5bCgnd2FzY2h0aXNjaF9hcm1hdHVyJywgQk0uY2hyb20sIDAuMDIyLCAwLjEyLCBXICsgMC4wNzUsIFJZICsgMC4wNiwgYnopO1xuICB7IGNvbnN0IHMgPSBjeWwoJ3dhc2NodGlzY2hfYXVzbGF1ZicsIEJNLmNocm9tLCAwLjAxMSwgMC4xMywgVyArIDAuMTMsIFJZICsgMC4xLCBieiwgJ3gnKTsgcy5yb3RhdGlvbi56ID0gTWF0aC5QSS8yICsgMC4yNTsgfVxuICBieCgnd2FzY2h0aXNjaF9oZWJlbCcsIEJNLmNocm9tLCBXICsgMC4wNCwgUlkgKyAwLjEyLCBieiAtIDAuMDEyLCBXICsgMC4xLCBSWSArIDAuMTM1LCBieiArIDAuMDEyKTtcbiAgY3lsKCdzaXBob24nLCBCTS5jaHJvbSwgMC4wMiwgMC4yLCBiY3gsIDAuNTgsIGJ6KTtcbiAgY3lsKCdzaXBob25fcm9ocicsIEJNLmNocm9tLCAwLjAxOCwgMC4yLCBXICsgMC4xLCAwLjQ4LCBieiwgJ3gnKTtcbiAgY3lsKCdzaXBob25fcm9zZXR0ZScsIEJNLmNocm9tLCAwLjAzNSwgMC4wMSwgVyArIFRUICsgMC4wMDUsIDAuNDgsIGJ6LCAneCcpO1xuICBieCgnc3BpZWdlbCcsIEJNLnNwaWVnZWwsIFcgKyBUVCwgMS4zNCwgYnogLSAwLjMsIFcgKyBUVCArIDAuMDA2LCAyLjAsIGJ6ICsgMC4zKTtcbiAgZm9yIChjb25zdCB5IG9mIFsxLjMsIDEuMDVdKXtcbiAgICBieCgnZ2xhc2FibGFnZScsIEJNLmdsYXMsIFcgKyBUVCwgeSwgYnogLSAwLjMsIFcgKyAwLjE0LCB5ICsgMC4wMDgsIGJ6ICsgMC4zKTtcbiAgICBmb3IgKGNvbnN0IHMgb2YgWy0xLCAxXSkgYngoJ2dsYXNhYmxhZ2VfaGFsdGVyJywgQk0uY2hyb20sIFcgKyBUVCwgeSAtIDAuMDEyLCBieiArIHMqMC4zIC0gMC4wMTIsIFcgKyAwLjA2LCB5ICsgMC4wMTYsIGJ6ICsgcyowLjMgKyAwLjAxMik7XG4gIH1cblxuICBiYWQudHJhdmVyc2UobyA9PiB7IGlmIChvLmlzTWVzaCl7IG8uY2FzdFNoYWRvdyA9IHRydWU7IG8ucmVjZWl2ZVNoYWRvdyA9IHRydWU7IH0gfSk7XG4gIGJhZC5nZXRPYmplY3RCeU5hbWUoJ2JhZF9ib2RlbicpLmNhc3RTaGFkb3cgPSBmYWxzZTtcbiAgaG9tZS5hZGQoYmFkKTtcbn1cblxuXG5zdGFnZS5zZXRPYmplY3QoaG9tZSk7XG5cbi8vIC0tLS0tLS0tLS0gU2NoYXR0ZW46IGVuZ2VyIEZydXN0dW0sIDQwOTZlciBNYXAsIGhhcnRlciBQQ0Yg4oaSIHNjaGFyZiAmIG9obmUgRmxhY2tlcm4gLS0tLS0tLS0tLVxuY29uc3QgcmVuZGVyZXIgPSBzdGFnZS5fcmVuZGVyZXIsIHNjZW5lID0gc3RhZ2UuX3NjZW5lLCBrZXkgPSBzdGFnZS5fa2V5O1xucmVuZGVyZXIuc2hhZG93TWFwLnR5cGUgPSBUSFJFRS5QQ0ZTaGFkb3dNYXA7XG5jb25zdCBoYiA9IG5ldyBUSFJFRS5Cb3gzKCkuc2V0RnJvbU9iamVjdChob21lKSwgaGMgPSBoYi5nZXRDZW50ZXIobmV3IFRIUkVFLlZlY3RvcjMoKSksIGhzID0gaGIuZ2V0U2l6ZShuZXcgVEhSRUUuVmVjdG9yMygpKTtcbmNvbnN0IHN1bkRpciA9IG5ldyBUSFJFRS5WZWN0b3IzKDQsIDcsIDUpLm5vcm1hbGl6ZSgpO1xua2V5LnBvc2l0aW9uLmNvcHkoaGMpLmFkZFNjYWxlZFZlY3RvcihzdW5EaXIsIDMwKTtcbmtleS50YXJnZXQucG9zaXRpb24uY29weShoYyk7IHNjZW5lLmFkZChrZXkudGFyZ2V0KTtcbmNvbnN0IGhhbGYgPSBNYXRoLm1heChocy54LCBocy56KSAqIDAuNjI7XG5PYmplY3QuYXNzaWduKGtleS5zaGFkb3cuY2FtZXJhLCB7IGxlZnQ6LWhhbGYsIHJpZ2h0OmhhbGYsIHRvcDpoYWxmLCBib3R0b206LWhhbGYsIG5lYXI6MSwgZmFyOjYwIH0pO1xua2V5LnNoYWRvdy5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xua2V5LnNoYWRvdy5tYXBTaXplLnNldCgyMDQ4LCAyMDQ4KTtcbmtleS5zaGFkb3cuYmlhcyA9IC0wLjAwMDQ7IGtleS5zaGFkb3cubm9ybWFsQmlhcyA9IDAuMDE1O1xuaWYgKGtleS5zaGFkb3cubWFwKXsga2V5LnNoYWRvdy5tYXAuZGlzcG9zZSgpOyBrZXkuc2hhZG93Lm1hcCA9IG51bGw7IH1cbnJlbmRlcmVyLnRvbmVNYXBwaW5nID0gVEhSRUUuQUNFU0ZpbG1pY1RvbmVNYXBwaW5nO1xuaWYgKHN0YWdlLl9ncm91bmQpIHN0YWdlLl9ncm91bmQudmlzaWJsZSA9IGZhbHNlO1xuY29uc3QgaGVtaSA9IHNjZW5lLmNoaWxkcmVuLmZpbmQobyA9PiBvLmlzSGVtaXNwaGVyZUxpZ2h0KSwgaGVtaUJhc2UgPSBoZW1pID8gaGVtaS5pbnRlbnNpdHkgOiAwO1xuY29uc3QgZmlsbEwgPSBzY2VuZS5jaGlsZHJlbi5maW5kKG8gPT4gby5pc0RpcmVjdGlvbmFsTGlnaHQgJiYgbyAhPT0ga2V5KSwgZmlsbEJhc2UgPSBmaWxsTCA/IGZpbGxMLmludGVuc2l0eSA6IDA7XG5jb25zdCBFTlYgPSAwLjk7XG5sZXQgZW52SyA9IDEsIGhlbWlLID0gMSwgZmlsbEsgPSAxLCBleHBLID0gMTtcbi8vIElubmVucmF1bTogSGltbWVscy0vRsO8bGxsaWNodCBkcmluZ3QgbmljaHQgZHVyY2ggZGllIERlY2tlIOKGkiBudXIgbm9jaCBTb25uZSArIFVtZ2VidW5nIGR1cmNoIGRpZSBGZW5zdGVyXG5mdW5jdGlvbiBhcHBseUludGVyaW9yKG8pe1xuICBpZiAoaGVtaSkgaGVtaS5pbnRlbnNpdHkgPSBoZW1pQmFzZSAqIGhlbWlLICogKDEgLSAwLjg1Km8pO1xuICBpZiAoZmlsbEwpIGZpbGxMLmludGVuc2l0eSA9IGZpbGxCYXNlICogZmlsbEsgKiAoMSAtIG8pO1xuICBzY2VuZS5lbnZpcm9ubWVudEludGVuc2l0eSA9IEVOViAqIGVudksgKiAoMSAtIDAuNypvKTtcbiAgcmVuZGVyZXIudG9uZU1hcHBpbmdFeHBvc3VyZSA9ICgxICsgMC40NSpvKSAqIGV4cEs7XG59XG5cbi8vIC0tLS0tLS0tLS0gRGVja2UgKGJsZW5kZXQgZWluLCBzb2JhbGQgbWFuIGluIGVpbmVtIFJhdW0gc3RlaHQpIC0tLS0tLS0tLS1cbmNvbnN0IGNlaWxNYXQgPSBuZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoeyBuYW1lOidkZWNrZScsIGNvbG9yOjB4ZjRmMmVlLCByb3VnaG5lc3M6MC45NSwgdHJhbnNwYXJlbnQ6dHJ1ZSwgb3BhY2l0eTowLCBkZXB0aFdyaXRlOmZhbHNlIH0pO1xuY29uc3QgY2VpbGluZyA9IG5ldyBUSFJFRS5Hcm91cCgpOyBjZWlsaW5nLm5hbWUgPSAnZGVja2UnO1xuY2VpbGluZy5hZGQoYm94KCdkZWNrZV9ub3JkJywgY2VpbE1hdCwgWF9GTCAtIFRFLCBILCAtVEUsIFhfRSArIFRFLCBIKzAuMDQsIFpTVCksIGJveCgnZGVja2Vfc3VlZCcsIGNlaWxNYXQsIC1URSwgSCwgWlNULCBYX0UgKyBURSwgSCswLjA0LCBaX1MgKyBURSkpO1xuY2VpbGluZy50cmF2ZXJzZShvID0+IHsgaWYgKG8uaXNNZXNoKXsgby5yZWNlaXZlU2hhZG93ID0gdHJ1ZTsgby5jYXN0U2hhZG93ID0gdHJ1ZTsgfSB9KTsgY2VpbGluZy52aXNpYmxlID0gZmFsc2U7XG5ob21lLmFkZChjZWlsaW5nKTtcbmZ1bmN0aW9uIHNldENlaWwobyl7XG4gIGNlaWxNYXQub3BhY2l0eSA9IG87XG4gIGlmIChjZWlsaW5nLnZpc2libGUgIT09IChvID4gMC4wMDEpKXsgY2VpbGluZy52aXNpYmxlID0gbyA+IDAuMDAxOyBwdERpcnR5ID0gdHJ1ZTsgfVxuICBjb25zdCBzb2xpZCA9IG8gPj0gMC45OTk7XG4gIGlmIChjZWlsTWF0LnRyYW5zcGFyZW50ID09PSBzb2xpZCl7IGNlaWxNYXQudHJhbnNwYXJlbnQgPSAhc29saWQ7IGNlaWxNYXQuZGVwdGhXcml0ZSA9IHNvbGlkOyBjZWlsTWF0Lm5lZWRzVXBkYXRlID0gdHJ1ZTsgfVxuICBpZiAoIXB0T24pIGFwcGx5SW50ZXJpb3Iobyk7XG59XG5cbi8vIC0tLS0tLS0tLS0gQm9nZW5sYW1wZTogTGljaHQgYW4vYXVzIC0tLS0tLS0tLS1cbmhvbWUudXBkYXRlTWF0cml4V29ybGQodHJ1ZSk7XG5jb25zdCBidWxiID0gbGFtcGUuZ3JvdXAuZ2V0T2JqZWN0QnlOYW1lKCdsZXVjaHRtaXR0ZWwnKTtcbmNvbnN0IGJwID0gYnVsYi5nZXRXb3JsZFBvc2l0aW9uKG5ldyBUSFJFRS5WZWN0b3IzKCkpO1xuY29uc3QgbGFtcFNwb3QgPSBuZXcgVEhSRUUuU3BvdExpZ2h0KDB4ZmZkNmEwLCAwLCAwLCAxLjAsIDAuNiwgMik7XG5sYW1wU3BvdC5wb3NpdGlvbi5jb3B5KGJwKS5hZGQobmV3IFRIUkVFLlZlY3RvcjMoMCwgLTAuMDM1LCAwKSk7XG5sYW1wU3BvdC50YXJnZXQucG9zaXRpb24uc2V0KGJwLngsIDAsIGJwLnopO1xubGFtcFNwb3QuY2FzdFNoYWRvdyA9IHRydWU7XG5sYW1wU3BvdC5zaGFkb3cubWFwU2l6ZS5zZXQoMTAyNCwgMTAyNCk7XG5sYW1wU3BvdC5zaGFkb3cuYmlhcyA9IC0wLjAwMDU7IGxhbXBTcG90LnNoYWRvdy5ub3JtYWxCaWFzID0gMC4wMjtcbmxhbXBTcG90LnNoYWRvdy5jYW1lcmEubmVhciA9IDAuMDU7IGxhbXBTcG90LnNoYWRvdy5jYW1lcmEuZmFyID0gODtcbmNvbnN0IGxhbXBGaWxsID0gbmV3IFRIUkVFLlBvaW50TGlnaHQoMHhmZmQ2YTAsIDAsIDcsIDIpO1xubGFtcEZpbGwucG9zaXRpb24uY29weShicCk7XG5zY2VuZS5hZGQobGFtcFNwb3QsIGxhbXBTcG90LnRhcmdldCwgbGFtcEZpbGwpO1xuY29uc3Qgc2NoaXJtID0gbGFtcGUuZ3JvdXAuZ2V0T2JqZWN0QnlOYW1lKCdzY2hpcm0nKS5tYXRlcmlhbDtcbnNjaGlybS5lbWlzc2l2ZSA9IG5ldyBUSFJFRS5Db2xvcigweGZmZTJiOCk7XG5jb25zdCBsYW1wQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xhbXAnKTtcbmxldCBsYW1wT24gPSBmYWxzZSwgbGFtcEx2bCA9IDAsIGxhbXBBbmltID0gMDtcbmxldCByYXN0ZXJFbnYgPSBudWxsLCBwdEVudiA9IG51bGw7XG5sZXQgdHJhY2VyID0gbnVsbCwgcHRPbiA9IGZhbHNlLCBwdERpcnR5ID0gdHJ1ZSwgaW5Sb29tID0gZmFsc2UsIHN0aWxsU2luY2UgPSAwO1xuY29uc3QgTEFNUF9LRVkgPSAnd29obnVuZy1ib2dlbmxhbXBlLWZhcmJlJztcbmxldCBsYW1wSyA9IDE7XG5jb25zdCBsYW1wU3cgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGFtcFN3Jyk7XG5mdW5jdGlvbiBzZXRMYW1wQ29sb3IoaGV4KXtcbiAgY29uc3QgYyA9IG5ldyBUSFJFRS5Db2xvcihoZXgpLCBzID0gYy5jbG9uZSgpLmxlcnAobmV3IFRIUkVFLkNvbG9yKDB4ZmZmZmZmKSwgMC4zKTtcbiAgbGFtcFNwb3QuY29sb3IuY29weShjKTsgbGFtcEZpbGwuY29sb3IuY29weShjKTtcbiAgaWYgKGJ1bGIubWF0ZXJpYWwuZW1pc3NpdmUpIGJ1bGIubWF0ZXJpYWwuZW1pc3NpdmUuY29weShjKTtcbiAgc2NoaXJtLmVtaXNzaXZlLmNvcHkocyk7XG4gIHRyeSB7IGxvY2FsU3RvcmFnZS5zZXRJdGVtKExBTVBfS0VZLCBoZXgpOyB9IGNhdGNoKGUpe31cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2xhbXAgaScpLnN0eWxlLmNzc1RleHQgPSBsYW1wT24gPyBgYmFja2dyb3VuZDoke2hleH07Ym94LXNoYWRvdzowIDAgMTBweCAzcHggJHtoZXh9OTlgIDogJyc7XG4gIGlmIChwdE9uKXsgdHJhY2VyLnVwZGF0ZUxpZ2h0cygpOyB0cmFjZXIudXBkYXRlTWF0ZXJpYWxzKCk7IH1cbn1cbi8vIC0tLS0tLS0tLS0gTGljaHQtUGlja2VyOiBIZWxsIChMaWNodHRvbiArIEhlbGxpZ2tlaXQpIG9kZXIgRmFyYmUgKEZhcmJrcmVpcykgLS0tLS0tLS0tLVxuY29uc3QgS19DT0xEID0gODAwMCwgS19XQVJNID0gMjAwMDtcbmZ1bmN0aW9uIGtlbHZpbkhleChrKXtcbiAgY29uc3QgdCA9IGsvMTAwOyBsZXQgciwgZywgYjtcbiAgaWYgKHQgPD0gNjYpeyByID0gMjU1OyBnID0gOTkuNDcwODAyNTg2MSpNYXRoLmxvZyh0KSAtIDE2MS4xMTk1NjgxNjYxOyBiID0gdCA8PSAxOSA/IDAgOiAxMzguNTE3NzMxMjIzMSpNYXRoLmxvZyh0LTEwKSAtIDMwNS4wNDQ3OTI3MzA3OyB9XG4gIGVsc2UgeyByID0gMzI5LjY5ODcyNzQ0NipNYXRoLnBvdyh0LTYwLCAtMC4xMzMyMDQ3NTkyKTsgZyA9IDI4OC4xMjIxNjk1MjgzKk1hdGgucG93KHQtNjAsIC0wLjA3NTUxNDg0OTIpOyBiID0gMjU1OyB9XG4gIGNvbnN0IGMgPSB2ID0+IE1hdGgucm91bmQoTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCB2KSkpLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpO1xuICByZXR1cm4gJyMnICsgYyhyKSArIGMoZykgKyBjKGIpO1xufVxuY29uc3Qgd2FybUsgPSB3ID0+IE1hdGgucm91bmQoS19DT0xEIC0gdy8xMDAqKEtfQ09MRCAtIEtfV0FSTSkpO1xuZnVuY3Rpb24gaHN2UkdCKGgsIHMsIHYpeyBjb25zdCBmID0gbiA9PiB7IGNvbnN0IGsgPSAobiArIGgvNjApICUgNjsgcmV0dXJuIHYgLSB2KnMqTWF0aC5tYXgoMCwgTWF0aC5taW4oaywgNC1rLCAxKSk7IH07IHJldHVybiBbZig1KSwgZigzKSwgZigxKV07IH1cbmNvbnN0IHJnYkhleCA9IGEgPT4gJyMnICsgYS5tYXAoeCA9PiBNYXRoLnJvdW5kKHgqMjU1KS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKSkuam9pbignJyk7XG5mdW5jdGlvbiBtYWtlUGlja2VyKHN3LCBrZXksIGRlZiwgZGltSW4sIG9uQ2hhbmdlKXtcbiAgbGV0IHN0ID0geyBtb2RlOiAnd2hpdGUnLCB3YXJtOiA3MCwgaDogMzAsIHM6IDAuNiwgLi4uZGVmIH07XG4gIHRyeSB7IE9iamVjdC5hc3NpZ24oc3QsIEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KSB8fCAnbnVsbCcpIHx8IHt9KTsgfSBjYXRjaChlKXt9XG4gIGNvbnN0IHBvcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOyBwb3AuY2xhc3NOYW1lID0gJ2xwaWNrJztcbiAgcG9wLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwibHAtc2VnXCI+PGJ1dHRvbiBkYXRhLW09XCJ3aGl0ZVwiPkhlbGw8XHUwMDJGYnV0dG9uPjxidXR0b24gZGF0YS1tPVwiY29sb3JcIj5GYXJiZTxcdTAwMkZidXR0b24+PFx1MDAyRmRpdj4nXG4gICAgKyAnPGRpdiBjbGFzcz1cImxwLXJvdyBscC13XCI+PGRpdj48c3Bhbj5MaWNodHRvbjxcdTAwMkZzcGFuPjxvdXRwdXQgY2xhc3M9XCJscC1rdlwiPjxcdTAwMkZvdXRwdXQ+PFx1MDAyRmRpdj48aW5wdXQgY2xhc3M9XCJscC10ZW1wXCIgdHlwZT1cInJhbmdlXCIgbWluPVwiMFwiIG1heD1cIjEwMFwiIHN0ZXA9XCIxXCI+PHNtYWxsPjxzcGFuPlN0ZXJpbDxcdTAwMkZzcGFuPjxzcGFuPldhcm08XHUwMDJGc3Bhbj48XHUwMDJGc21hbGw+PFx1MDAyRmRpdj4nXG4gICAgKyAnPGRpdiBjbGFzcz1cImxwLWNcIj48ZGl2IGNsYXNzPVwibHAtd2hlZWxcIj48Y2FudmFzIHdpZHRoPVwiMzYwXCIgaGVpZ2h0PVwiMzYwXCI+PFx1MDAyRmNhbnZhcz48aT48XHUwMDJGaT48XHUwMDJGZGl2PjxcdTAwMkZkaXY+J1xuICAgICsgJzxkaXYgY2xhc3M9XCJscC1yb3dcIj48ZGl2PjxzcGFuPkhlbGxpZ2tlaXQ8XHUwMDJGc3Bhbj48b3V0cHV0IGNsYXNzPVwibHAtYnZcIj48XHUwMDJGb3V0cHV0PjxcdTAwMkZkaXY+PGlucHV0IGNsYXNzPVwibHAtZGltXCIgdHlwZT1cInJhbmdlXCIgbWluPVwiMTBcIiBtYXg9XCIyMDBcIiBzdGVwPVwiNVwiPjxcdTAwMkZkaXY+PGJ1dHRvbiBjbGFzcz1cImxwLWRvbmVcIj5GZXJ0aWc8XHUwMDJGYnV0dG9uPic7XG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQocG9wKTtcbiAgY29uc3QgJCA9IHMgPT4gcG9wLnF1ZXJ5U2VsZWN0b3IocyksIHRlbXAgPSAkKCcubHAtdGVtcCcpLCBicmkgPSAkKCcubHAtZGltJyksIGJ2ID0gJCgnLmxwLWJ2JyksIGRvdCA9ICQoJy5scC13aGVlbCBpJyksIHdoZWVsID0gJCgnLmxwLXdoZWVsJyk7XG4gIHRlbXAuc3R5bGUuYmFja2dyb3VuZCA9IGBsaW5lYXItZ3JhZGllbnQoOTBkZWcsJHtrZWx2aW5IZXgoS19DT0xEKX0sJHtrZWx2aW5IZXgoNDUwMCl9LCR7a2VsdmluSGV4KDMwMDApfSwke2tlbHZpbkhleChLX1dBUk0pfSlgO1xuICBjb25zdCBjdiA9ICQoJ2NhbnZhcycpLCBjdHggPSBjdi5nZXRDb250ZXh0KCcyZCcpLCBpbWcgPSBjdHguY3JlYXRlSW1hZ2VEYXRhKDM2MCwgMzYwKSwgUiA9IDE4MDtcbiAgZm9yIChsZXQgeSA9IDA7IHkgPCAzNjA7IHkrKykgZm9yIChsZXQgeCA9IDA7IHggPCAzNjA7IHgrKyl7XG4gICAgY29uc3QgZHggPSB4ICsgLjUgLSBSLCBkeSA9IHkgKyAuNSAtIFIsIGQgPSBNYXRoLmh5cG90KGR4LCBkeSkgLyBSLCBpID0gKHkqMzYwICsgeCkqNDtcbiAgICBjb25zdCByZ2IgPSBoc3ZSR0IoKE1hdGguYXRhbjIoZHksIGR4KSoxODAvTWF0aC5QSSArIDM2MCkgJSAzNjAsIDEsIDEpO1xuICAgIGltZy5kYXRhW2ldID0gcmdiWzBdKjI1NTsgaW1nLmRhdGFbaSsxXSA9IHJnYlsxXSoyNTU7IGltZy5kYXRhW2krMl0gPSByZ2JbMl0qMjU1O1xuICAgIGltZy5kYXRhW2krM10gPSAyNTUgKiBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCAoMSAtIGQpICogUiwgKGQgLSAwLjcyKSAqIFIpKTtcbiAgfVxuICBjdHgucHV0SW1hZ2VEYXRhKGltZywgMCwgMCk7XG4gIGNvbnN0IGhleCA9ICgpID0+IHN0Lm1vZGUgPT09ICd3aGl0ZScgPyBrZWx2aW5IZXgod2FybUsoc3Qud2FybSkpIDogcmdiSGV4KGhzdlJHQihzdC5oLCAxLCAxKSk7XG4gIGZ1bmN0aW9uIHVwZGF0ZShmaXJlID0gdHJ1ZSl7XG4gICAgcG9wLnF1ZXJ5U2VsZWN0b3JBbGwoJy5scC1zZWcgYnV0dG9uJykuZm9yRWFjaChiID0+IGIuY2xhc3NMaXN0LnRvZ2dsZSgnb24nLCBiLmRhdGFzZXQubSA9PT0gc3QubW9kZSkpO1xuICAgICQoJy5scC13Jykuc3R5bGUuZGlzcGxheSA9IHN0Lm1vZGUgPT09ICd3aGl0ZScgPyAnJyA6ICdub25lJztcbiAgICAkKCcubHAtYycpLnN0eWxlLmRpc3BsYXkgPSBzdC5tb2RlID09PSAnY29sb3InID8gJycgOiAnbm9uZSc7XG4gICAgdGVtcC52YWx1ZSA9IHN0Lndhcm07ICQoJy5scC1rdicpLnRleHRDb250ZW50ID0gd2FybUsoc3Qud2FybSkgKyAnIEsnO1xuICAgIGNvbnN0IGEgPSBzdC5oKk1hdGguUEkvMTgwO1xuICAgIGRvdC5zdHlsZS5sZWZ0ID0gKDkwICsgTWF0aC5jb3MoYSkqNzcpICsgJ3B4JzsgZG90LnN0eWxlLnRvcCA9ICg5MCArIE1hdGguc2luKGEpKjc3KSArICdweCc7XG4gICAgY29uc3QgaCA9IGhleCgpOyBkb3Quc3R5bGUuYmFja2dyb3VuZCA9IGg7IHN3LnN0eWxlLmJhY2tncm91bmQgPSBoO1xuICAgIHRyeSB7IGxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgSlNPTi5zdHJpbmdpZnkoc3QpKTsgfSBjYXRjaChlKXt9XG4gICAgaWYgKGZpcmUpIG9uQ2hhbmdlKGgpO1xuICB9XG4gIHBvcC5xdWVyeVNlbGVjdG9yQWxsKCcubHAtc2VnIGJ1dHRvbicpLmZvckVhY2goYiA9PiBiLm9uY2xpY2sgPSAoKSA9PiB7IHN0Lm1vZGUgPSBiLmRhdGFzZXQubTsgdXBkYXRlKCk7IH0pO1xuICB0ZW1wLm9uaW5wdXQgPSAoKSA9PiB7IHN0Lndhcm0gPSArdGVtcC52YWx1ZTsgdXBkYXRlKCk7IH07XG4gIGNvbnN0IHBpY2sgPSBlID0+IHsgY29uc3QgciA9IHdoZWVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBkeCA9IGUuY2xpZW50WCAtIHIubGVmdCAtIDkwLCBkeSA9IGUuY2xpZW50WSAtIHIudG9wIC0gOTA7XG4gICAgc3QuaCA9IChNYXRoLmF0YW4yKGR5LCBkeCkqMTgwL01hdGguUEkgKyAzNjApICUgMzYwOyB1cGRhdGUoKTsgfTtcbiAgd2hlZWwub25wb2ludGVyZG93biA9IGUgPT4geyBjb25zdCByID0gd2hlZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGQgPSBNYXRoLmh5cG90KGUuY2xpZW50WCAtIHIubGVmdCAtIDkwLCBlLmNsaWVudFkgLSByLnRvcCAtIDkwKTtcbiAgICBpZiAoZCA8IDU4IHx8IGQgPiA5NCkgcmV0dXJuOyB3aGVlbC5zZXRQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7IHBpY2soZSk7IH07XG4gIHdoZWVsLm9ucG9pbnRlcm1vdmUgPSBlID0+IHsgaWYgKHdoZWVsLmhhc1BvaW50ZXJDYXB0dXJlKGUucG9pbnRlcklkKSkgcGljayhlKTsgfTtcbiAgY29uc3Qgc3luY0JyaSA9ICgpID0+IHsgYnJpLnZhbHVlID0gZGltSW4udmFsdWU7IGJ2LnRleHRDb250ZW50ID0gZGltSW4udmFsdWUgKyAnJSc7IH07XG4gIGJyaS5vbmlucHV0ID0gKCkgPT4geyBkaW1Jbi52YWx1ZSA9IGJyaS52YWx1ZTsgZGltSW4ub25pbnB1dCgpOyBzeW5jQnJpKCk7IH07XG4gIGRpbUluLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0Jywgc3luY0JyaSk7XG4gIGNvbnN0IHBsYWNlID0gKCkgPT4geyBwb3Auc3R5bGUubGVmdCA9ICcxOHB4JzsgcG9wLnN0eWxlLnRvcCA9ICc1MCUnOyBwb3Auc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZVkoLTUwJSknOyB9O1xuICBzdy5vbmNsaWNrID0gZSA9PiB7IGUucHJldmVudERlZmF1bHQoKTsgZS5zdG9wUHJvcGFnYXRpb24oKTsgY29uc3QgbyA9ICFwb3AuY2xhc3NMaXN0LmNvbnRhaW5zKCdvcGVuJyk7XG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmxwaWNrLm9wZW4nKS5mb3JFYWNoKHAgPT4gcC5jbGFzc0xpc3QucmVtb3ZlKCdvcGVuJykpO1xuICAgIGlmIChvKXsgc3luY0JyaSgpOyBwbGFjZSgpOyBwb3AuY2xhc3NMaXN0LmFkZCgnb3BlbicpOyB9XG4gICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QudG9nZ2xlKCdscGZvY3VzJywgbyk7XG4gICAgZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2xwaWNrJywgeyBkZXRhaWw6IHsga2V5LCBvcGVuOiBvIH0gfSkpOyB9O1xuICAkKCcubHAtZG9uZScpLm9uY2xpY2sgPSAoKSA9PiB7IHBvcC5jbGFzc0xpc3QucmVtb3ZlKCdvcGVuJyk7IGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnbHBmb2N1cycpOyBkaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnbHBpY2snLCB7IGRldGFpbDogeyBrZXksIG9wZW46IGZhbHNlIH0gfSkpOyB9O1xuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIGUgPT4geyBpZiAocG9wLmNsYXNzTGlzdC5jb250YWlucygnb3BlbicpICYmICFwb3AuY29udGFpbnMoZS50YXJnZXQpICYmICFzdy5jb250YWlucyhlLnRhcmdldCkpeyBwb3AuY2xhc3NMaXN0LnJlbW92ZSgnb3BlbicpOyBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ2xwZm9jdXMnKTsgZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2xwaWNrJywgeyBkZXRhaWw6IHsga2V5LCBvcGVuOiBmYWxzZSB9IH0pKTsgfSB9KTtcbiAgYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgKCkgPT4gcG9wLmNsYXNzTGlzdC5jb250YWlucygnb3BlbicpICYmIHBsYWNlKCkpO1xuICB1cGRhdGUoKTtcbiAgcmV0dXJuIHBvcDtcbn1cblxubGV0IGxhbXBDb2wgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShMQU1QX0tFWSkgfHwgJyNmZmQ2YTAnO1xubGFtcFN3LmlubmVySFRNTCA9ICcnO1xuY29uc3QgY29sSW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTsgY29sSW4uY2xhc3NOYW1lID0gJ2xwLXN3JzsgY29sSW4udGl0bGUgPSAnTGljaHQgZWluc3RlbGxlbic7XG5sYW1wU3cuYXBwZW5kQ2hpbGQoY29sSW4pO1xuY29uc3QgZGltSW4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbGFtcERpbSBpbnB1dCcpLCBkaW1PdXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbGFtcERpbSBvdXRwdXQnKTtcbmRpbUluLm9uaW5wdXQgPSAoKSA9PiB7IGxhbXBLID0gZGltSW4udmFsdWUgLyAxMDA7IGRpbU91dC50ZXh0Q29udGVudCA9IGRpbUluLnZhbHVlICsgJyUnOyBhcHBseUxhbXAobGFtcEx2bCk7IGlmIChwdE9uKXsgdHJhY2VyLnVwZGF0ZUxpZ2h0cygpOyB0cmFjZXIudXBkYXRlTWF0ZXJpYWxzKCk7IH0gfTtcbmZ1bmN0aW9uIGFwcGx5TGFtcCh2KXtcbiAgdiAqPSBsYW1wSztcbiAgbGFtcFNwb3QuaW50ZW5zaXR5ID0gOSAqIHY7XG4gIGxhbXBGaWxsLmludGVuc2l0eSA9IDIuMiAqIHY7XG4gIGJ1bGIubWF0ZXJpYWwuZW1pc3NpdmVJbnRlbnNpdHkgPSAwLjIgKyA1ICogdjtcbiAgc2NoaXJtLmVtaXNzaXZlSW50ZW5zaXR5ID0gMC41NSAqIHY7XG59XG5hcHBseUxhbXAoMCk7XG5tYWtlUGlja2VyKGNvbEluLCBMQU1QX0tFWSArICctY2ZnJywgeyBtb2RlOiAnd2hpdGUnLCB3YXJtOiA3NSB9LCBkaW1JbiwgaCA9PiB7IGxhbXBDb2wgPSBoOyBzZXRMYW1wQ29sb3IoaCk7IH0pO1xuc2V0TGFtcENvbG9yKGxhbXBDb2wpO1xuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xhbXBUJykub25jbGljayA9ICgpID0+IHtcbiAgbGFtcE9uID0gIWxhbXBPbjtcbiAgbGFtcEJ0bi5jbGFzc0xpc3QudG9nZ2xlKCdvbicsIGxhbXBPbik7XG4gIGxhbXBCdG4ucXVlcnlTZWxlY3Rvcignc3BhbicpLnRleHRDb250ZW50ID0gbGFtcE9uID8gJ0JvZ2VubGFtcGUgYXVzJyA6ICdCb2dlbmxhbXBlIGFuJztcbiAgc2V0TGFtcENvbG9yKGxhbXBDb2wpO1xuICBjb25zdCBpZCA9ICsrbGFtcEFuaW0sIGZyb20gPSBsYW1wTHZsLCB0byA9IGxhbXBPbiA/IDEgOiAwLCB0MCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAoZnVuY3Rpb24gc3RlcChub3cpe1xuICAgIGlmIChpZCAhPT0gbGFtcEFuaW0pIHJldHVybjtcbiAgICBjb25zdCB0ID0gTWF0aC5taW4oMSwgKG5vdyAtIHQwKSAvIDQ1MCk7XG4gICAgbGFtcEx2bCA9IGZyb20gKyAodG8gLSBmcm9tKSAqICgxIC0gTWF0aC5wb3coMSAtIHQsIDMpKTtcbiAgICBhcHBseUxhbXAobGFtcEx2bCk7XG4gICAgaWYgKHB0T24peyB0cmFjZXIudXBkYXRlTGlnaHRzKCk7IHRyYWNlci51cGRhdGVNYXRlcmlhbHMoKTsgfVxuICAgIGlmICh0IDwgMSkgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHN0ZXApO1xuICB9KSh0MCk7XG59O1xuXG4vLyAtLS0tLS0tLS0tIERvbnV0LUxhbXBlOiBudXIgYW4vYXVzIC0tLS0tLS0tLS1cbmNvbnN0IGRvbnV0TGlnaHQgPSBuZXcgVEhSRUUuUG9pbnRMaWdodCgweGZmYTA1MCwgMCwgNC41LCAyKTtcbmRvbnV0TGlnaHQucG9zaXRpb24uY29weShkb251dC5nZXRXb3JsZFBvc2l0aW9uKG5ldyBUSFJFRS5WZWN0b3IzKCkpKS5hZGQobmV3IFRIUkVFLlZlY3RvcjMoMCwgMC4xMywgMCkpO1xuc2NlbmUuYWRkKGRvbnV0TGlnaHQpO1xuY29uc3QgZG9udXRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGFtcEQnKTtcbmRvbnV0QnRuLm9uY2xpY2sgPSAoKSA9PiB7XG4gIGNvbnN0IG9uID0gZG9udXRCdG4uZ2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnKSAhPT0gJ3RydWUnO1xuICBkb251dEJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcsIG9uKTsgZG9udXRCdG4uY2xhc3NMaXN0LnRvZ2dsZSgnb24nLCBvbik7XG4gIGRvbnV0QnRuLnF1ZXJ5U2VsZWN0b3IoJ3NwYW4nKS50ZXh0Q29udGVudCA9IG9uID8gJ0RvbnV0LUxhbXBlIGF1cycgOiAnRG9udXQtTGFtcGUgYW4nO1xuICBETS5rb2VycGVyLmVtaXNzaXZlSW50ZW5zaXR5ID0gb24gPyAyLjIgOiAwO1xuICBETS5zb2NrZWwuZW1pc3NpdmVJbnRlbnNpdHkgPSBvbiA/IDAuNiA6IDA7XG4gIGRvbnV0TGlnaHQuaW50ZW5zaXR5ID0gb24gPyAyLjYgOiAwO1xuICBpZiAocHRPbil7IHRyYWNlci51cGRhdGVMaWdodHMoKTsgdHJhY2VyLnVwZGF0ZU1hdGVyaWFscygpOyB9XG59O1xuXG4vLyAtLS0tLS0tLS0tIEZlcm5zZWhlcjogYW4vYXVzIHBlciBGZXJuYmVkaWVudW5nIC0tLS0tLS0tLS1cbntcbiAgY29uc3Qgc2NyID0gaG9tZS5nZXRPYmplY3RCeU5hbWUoJ2Zlcm5zZWhlcicpLmdldE9iamVjdEJ5TmFtZSgndHZfYmlsZHNjaGlybScpO1xuICBjb25zdCBjdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpOyBjdi53aWR0aCA9IDEwMjQ7IGN2LmhlaWdodCA9IDYwMDtcbiAgY29uc3QgYyA9IGN2LmdldENvbnRleHQoJzJkJyk7XG4gIGxldCBnID0gYy5jcmVhdGVMaW5lYXJHcmFkaWVudCgwLCAwLCAxMDI0LCA2MDApO1xuICBnLmFkZENvbG9yU3RvcCgwLCAnIzBiMWUzYScpOyBnLmFkZENvbG9yU3RvcCgwLjU1LCAnIzFkNGY3YScpOyBnLmFkZENvbG9yU3RvcCgxLCAnI2UwOGE0YScpO1xuICBjLmZpbGxTdHlsZSA9IGc7IGMuZmlsbFJlY3QoMCwgMCwgMTAyNCwgNjAwKTtcbiAgZyA9IGMuY3JlYXRlUmFkaWFsR3JhZGllbnQoNzYwLCAzODAsIDEwLCA3NjAsIDM4MCwgMzIwKTtcbiAgZy5hZGRDb2xvclN0b3AoMCwgJ3JnYmEoMjU1LDIxMCwxNTAsLjkpJyk7IGcuYWRkQ29sb3JTdG9wKDEsICdyZ2JhKDI1NSwyMTAsMTUwLDApJyk7XG4gIGMuZmlsbFN0eWxlID0gZzsgYy5maWxsUmVjdCgwLCAwLCAxMDI0LCA2MDApO1xuICBjLmZpbGxTdHlsZSA9ICcjMDgxMzIyJzsgYy5iZWdpblBhdGgoKTsgYy5tb3ZlVG8oMCwgNjAwKTsgYy5saW5lVG8oMCwgNDMwKTsgYy5saW5lVG8oMjIwLCAzNjApOyBjLmxpbmVUbyg0MjAsIDQ1MCk7IGMubGluZVRvKDY0MCwgMzgwKTsgYy5saW5lVG8oMTAyNCwgNDcwKTsgYy5saW5lVG8oMTAyNCwgNjAwKTsgYy5maWxsKCk7XG4gIGMuZmlsbFN0eWxlID0gJ3JnYmEoMjU1LDI1NSwyNTUsLjkyKSc7IGMuZm9udCA9ICc1MDAgNjRweCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmJzsgYy5maWxsVGV4dCgnMjA6MTUnLCA3MCwgMTIwKTtcbiAgYy5mb250ID0gJzQwMCAyOHB4IEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWYnOyBjLmZpbGxTdHlsZSA9ICdyZ2JhKDI1NSwyNTUsMjU1LC43KSc7IGMuZmlsbFRleHQoJ0d1dGVuIEFiZW5kJywgNzIsIDE2NSk7XG4gIGNvbnN0IHRleCA9IG5ldyBUSFJFRS5DYW52YXNUZXh0dXJlKGN2KTsgdGV4LmNvbG9yU3BhY2UgPSBUSFJFRS5TUkdCQ29sb3JTcGFjZTtcbiAgY29uc3QgTSA9IHNjci5tYXRlcmlhbDtcbiAgY29uc3QgdHZMaWdodCA9IG5ldyBUSFJFRS5Qb2ludExpZ2h0KDB4OWFiOGZmLCAwLCAzLjIsIDIpO1xuICBjb25zdCBzYiA9IG5ldyBUSFJFRS5Cb3gzKCkuc2V0RnJvbU9iamVjdChzY3IpLCBzYyA9IHNiLmdldENlbnRlcihuZXcgVEhSRUUuVmVjdG9yMygpKSwgc3MgPSBzYi5nZXRTaXplKG5ldyBUSFJFRS5WZWN0b3IzKCkpO1xuICB0dkxpZ2h0LnBvc2l0aW9uLmNvcHkoc2MpLmFkZChuZXcgVEhSRUUuVmVjdG9yMygwLjM1LCAwLjEsIDApKTtcbiAgc2NlbmUuYWRkKHR2TGlnaHQpO1xuICBjb25zdCBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndHZCJyk7XG4gIGxldCBsdmwgPSAwLCBhbmltID0gMDtcbiAgY29uc3QgYXBwbHkgPSAoKSA9PiB7IE0uZW1pc3NpdmVJbnRlbnNpdHkgPSAxLjYgKiBsdmw7IHR2TGlnaHQuaW50ZW5zaXR5ID0gMS40ICogbHZsOyBpZiAocHRPbil7IHRyYWNlci51cGRhdGVMaWdodHMoKTsgdHJhY2VyLnVwZGF0ZU1hdGVyaWFscygpOyB9IH07XG4gIGNvbnN0IGJhciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0dkJhcicpLCB1aSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0dlVJJyk7XG4gIGxldCBzYXZlZCA9IG51bGwsIHR2QW5pbSA9IDA7XG4gIGNvbnN0IHR3ZWVuID0gKHBvcywgdGd0LCBtcywgZG9uZSkgPT4ge1xuICAgIGNvbnN0IGlkID0gKyt0dkFuaW0sIHAwID0gY2FtLnBvc2l0aW9uLmNsb25lKCksIHEwID0gY3RsLnRhcmdldC5jbG9uZSgpLCB0MCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgIGNvbnN0IGVhc2UgPSB0ID0+IHQgPCAwLjUgPyA0KnQqdCp0IDogMSAtIE1hdGgucG93KC0yKnQrMiwgMykvMjtcbiAgICAoZnVuY3Rpb24gc3RlcChub3cpe1xuICAgICAgaWYgKGlkICE9PSB0dkFuaW0pIHJldHVybjtcbiAgICAgIGNvbnN0IHQgPSBNYXRoLm1pbigxLCAobm93IC0gdDApIC8gbXMpLCBlID0gZWFzZSh0KTtcbiAgICAgIGNhbS5wb3NpdGlvbi5sZXJwVmVjdG9ycyhwMCwgcG9zLCBlKTsgY3RsLnRhcmdldC5sZXJwVmVjdG9ycyhxMCwgdGd0LCBlKTsgY2FtLmxvb2tBdChjdGwudGFyZ2V0KTtcbiAgICAgIGlmICh0IDwgMSkgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHN0ZXApOyBlbHNlIGRvbmUgJiYgZG9uZSgpO1xuICAgIH0pKHQwKTtcbiAgfTtcbiAgY29uc3QgZW50ZXIgPSAoKSA9PiB7XG4gICAgaWYgKHNhdmVkKSByZXR1cm47XG4gICAgc2F2ZWQgPSB7IHBvczogY2FtLnBvc2l0aW9uLmNsb25lKCksIHRndDogY3RsLnRhcmdldC5jbG9uZSgpLCBlbjogY3RsLmVuYWJsZWQgfTtcbiAgICBjdGwuZW5hYmxlZCA9IGZhbHNlO1xuICAgIGNvbnN0IHRoID0gTWF0aC50YW4oVEhSRUUuTWF0aFV0aWxzLmRlZ1RvUmFkKGNhbS5mb3YpIC8gMik7XG4gICAgY29uc3QgZCA9IE1hdGgubWluKHNzLnkgLyAyIC8gdGgsIHNzLnogLyAyIC8gKHRoICogY2FtLmFzcGVjdCkpICogMC45ODtcbiAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJ3R2Zm9jdXMnKTtcbiAgICB0d2VlbihuZXcgVEhSRUUuVmVjdG9yMyhzYy54ICsgZCwgc2MueSwgc2MueiksIHNjLmNsb25lKCksIDE2MDAsICgpID0+IHsgYmFyLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTsgdWkuY2xhc3NMaXN0LmFkZCgnc2hvdycpOyB9KTtcbiAgfTtcbiAgY29uc3QgbGVhdmUgPSAoKSA9PiB7XG4gICAgaWYgKCFzYXZlZCkgcmV0dXJuO1xuICAgIGNvbnN0IHMgPSBzYXZlZDsgc2F2ZWQgPSBudWxsO1xuICAgIGJhci5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7IHVpLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTsgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCd0dmZvY3VzJyk7XG4gICAgdHdlZW4ocy5wb3MsIHMudGd0LCAxMjAwLCAoKSA9PiB7IGN0bC5lbmFibGVkID0gcy5lbjsgfSk7XG4gIH07XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0dkJhY2snKS5vbmNsaWNrID0gbGVhdmU7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0dk9mZicpLm9uY2xpY2sgPSAoKSA9PiB7IGxlYXZlKCk7IHBvd2VyKGZhbHNlKTsgfTtcbiAgYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGUgPT4geyBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSBsZWF2ZSgpOyB9KTtcbiAgYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgKCkgPT4geyBpZiAoc2F2ZWQgJiYgYmFyLmNsYXNzTGlzdC5jb250YWlucygnc2hvdycpKXsgY29uc3QgdGggPSBNYXRoLnRhbihUSFJFRS5NYXRoVXRpbHMuZGVnVG9SYWQoY2FtLmZvdikgLyAyKTsgY29uc3QgZCA9IE1hdGgubWluKHNzLnkgLyAyIC8gdGgsIHNzLnogLyAyIC8gKHRoICogY2FtLmFzcGVjdCkpICogMC45ODsgY2FtLnBvc2l0aW9uLnNldChzYy54ICsgZCwgc2MueSwgc2Mueik7IH0gfSk7XG4gIGNvbnN0IHBvd2VyID0gb24gPT4ge1xuICAgIGJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcsIG9uKTsgYnRuLmNsYXNzTGlzdC50b2dnbGUoJ29uJywgb24pO1xuICAgIGJ0bi5xdWVyeVNlbGVjdG9yKCdzcGFuJykudGV4dENvbnRlbnQgPSBvbiA/ICdGZXJuYmVkaWVudW5nJyA6ICdGZXJuc2VoZXIgYW4nO1xuICAgIGlmICghb24pIHVpLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgICBpZiAob24gJiYgIU0uZW1pc3NpdmVNYXApeyBNLmVtaXNzaXZlID0gbmV3IFRIUkVFLkNvbG9yKDB4ZmZmZmZmKTsgTS5lbWlzc2l2ZU1hcCA9IHRleDsgTS5uZWVkc1VwZGF0ZSA9IHRydWU7IH1cbiAgICBjb25zdCBpZCA9ICsrYW5pbSwgZnJvbSA9IGx2bCwgdG8gPSBvbiA/IDEgOiAwLCB0MCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgIChmdW5jdGlvbiBzdGVwKG5vdyl7XG4gICAgICBpZiAoaWQgIT09IGFuaW0pIHJldHVybjtcbiAgICAgIGNvbnN0IHQgPSBNYXRoLm1pbigxLCAobm93IC0gdDApIC8gKG9uID8gNjAwIDogMjUwKSk7XG4gICAgICBsdmwgPSBmcm9tICsgKHRvIC0gZnJvbSkgKiAoMSAtIE1hdGgucG93KDEgLSB0LCAzKSk7IGFwcGx5KCk7XG4gICAgICBpZiAodCA8IDEpIHJlcXVlc3RBbmltYXRpb25GcmFtZShzdGVwKTtcbiAgICB9KSh0MCk7XG4gIH07XG4gIGJ0bi5vbmNsaWNrID0gKCkgPT4geyBpZiAoYnRuLmdldEF0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJykgIT09ICd0cnVlJykgcG93ZXIodHJ1ZSk7IGVudGVyKCk7IH07XG4gIGNvbnN0IGFwcHMgPSBbWydZb3VUdWJlJywnI2U1NDg0ZCddLFsnTmV0ZmxpeCcsJyNkNjMwM2EnXSxbJ1ByaW1lIFZpZGVvJywnIzJmYThlMCddLFsnRGlzbmV5KycsJyMzYjZmZTAnXSxbJ1Nwb3RpZnknLCcjMmZiZjYyJ10sWydBUkQgTWVkaWF0aGVrJywnIzNkN2JlMCddLFsnWkRGJywnI2YwOGEyNCddLFsnVHdpdGNoJywnIzhiNWNmNiddXTtcbiAgY29uc3QgbmF2ID0gdWkucXVlcnlTZWxlY3RvcignLnR2LW5hdicpLCBoZXJvID0gdWkucXVlcnlTZWxlY3RvcignLnR2LWhlcm8nKSwgdm9sID0gdWkucXVlcnlTZWxlY3RvcignLnR2LXZvbCBpbnB1dCcpLCB2b2xPID0gdWkucXVlcnlTZWxlY3RvcignLnR2LXZvbCBvdXRwdXQnKTtcbiAgbGV0IHNlbCA9ICsobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3dvaG51bmcudHYuYXBwJykgfHwgMCk7XG4gIGFwcHMuZm9yRWFjaCgoW25dLCBpKSA9PiB7IGNvbnN0IGIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTsgYi50ZXh0Q29udGVudCA9IG47IGIub25jbGljayA9ICgpID0+IHBpY2soaSk7IG5hdi5hcHBlbmRDaGlsZChiKTsgfSk7XG4gIGZ1bmN0aW9uIHBpY2soaSl7XG4gICAgc2VsID0gKGkgKyBhcHBzLmxlbmd0aCkgJSBhcHBzLmxlbmd0aDsgdHJ5IHsgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3dvaG51bmcudHYuYXBwJywgc2VsKTsgfSBjYXRjaChlKXt9XG4gICAgY29uc3QgW24sIGNvbF0gPSBhcHBzW3NlbF07XG4gICAgbmF2LnF1ZXJ5U2VsZWN0b3JBbGwoJ2J1dHRvbicpLmZvckVhY2goKGIsIGopID0+IGIuY2xhc3NMaXN0LnRvZ2dsZSgnb24nLCBqID09PSBzZWwpKTtcbiAgICBjb25zdCBiID0gbmF2LmNoaWxkcmVuW3NlbF07IG5hdi5zY3JvbGxUbyh7IGxlZnQ6IGIub2Zmc2V0TGVmdCAtIG5hdi5jbGllbnRXaWR0aC8yICsgYi5vZmZzZXRXaWR0aC8yLCBiZWhhdmlvcjogJ3Ntb290aCcgfSk7XG4gICAgaGVyby5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1hJywgY29sKTsgaGVyby5xdWVyeVNlbGVjdG9yKCdoMicpLnRleHRDb250ZW50ID0gbjtcbiAgfVxuICBwaWNrKHNlbCk7XG4gIHZvbC52YWx1ZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd3b2hudW5nLnR2LnZvbCcpID8/IDM1O1xuICBjb25zdCBzZXRWb2wgPSAoKSA9PiB7IHZvbE8udGV4dENvbnRlbnQgPSB2b2wudmFsdWU7IHZvbC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS12Jywgdm9sLnZhbHVlICsgJyUnKTsgdHJ5IHsgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3dvaG51bmcudHYudm9sJywgdm9sLnZhbHVlKTsgfSBjYXRjaChlKXt9IH07XG4gIHZvbC5vbmlucHV0ID0gc2V0Vm9sOyBzZXRWb2woKTtcbiAgdWkucXVlcnlTZWxlY3RvckFsbCgnLnR2LXZiJykuZm9yRWFjaChiID0+IGIub25jbGljayA9ICgpID0+IHsgdm9sLnZhbHVlID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMTAwLCArdm9sLnZhbHVlICsgK2IuZGF0YXNldC5kKSk7IHNldFZvbCgpOyB9KTtcbiAgWydwb2ludGVyZG93bicsJ3doZWVsJywna2V5ZG93biddLmZvckVhY2godCA9PiB1aS5hZGRFdmVudExpc3RlbmVyKHQsIGUgPT4gZS5zdG9wUHJvcGFnYXRpb24oKSkpO1xuICBhZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZSA9PiB7IGlmICghdWkuY2xhc3NMaXN0LmNvbnRhaW5zKCdzaG93JykpIHJldHVybjtcbiAgICBpZiAoZS5rZXkgPT09ICdBcnJvd1JpZ2h0JykgcGljayhzZWwgKyAxKTsgZWxzZSBpZiAoZS5rZXkgPT09ICdBcnJvd0xlZnQnKSBwaWNrKHNlbCAtIDEpO1xuICAgIGVsc2UgaWYgKGUua2V5ID09PSAnQXJyb3dVcCcpeyB2b2wudmFsdWUgPSBNYXRoLm1pbigxMDAsICt2b2wudmFsdWUgKyA1KTsgc2V0Vm9sKCk7IH0gZWxzZSBpZiAoZS5rZXkgPT09ICdBcnJvd0Rvd24nKXsgdm9sLnZhbHVlID0gTWF0aC5tYXgoMCwgK3ZvbC52YWx1ZSAtIDUpOyBzZXRWb2woKTsgfSB9KTtcbn1cblxuLy8gLS0tLS0tLS0tLSBUcmlwb2QtTGFtcGU6IGFuL2F1cywgRmFyYmUsIFN0w6Rya2UsIEtlZ2VsIC0tLS0tLS0tLS1cbmNvbnN0IHRyaXBCb3ggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGFtcDInKSwgdHJpcERvdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN0cmlwVCBpJyk7XG5jb25zdCBUUklQX0tFWSA9ICd3b2hudW5nLXRyaXBvZC1mYXJiZSc7XG5jb25zdCB0cmlwQ29sSW4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndHJpcENvbCcpLCB0cmlwRGltSW4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndHJpcERpbScpLCB0cmlwQ29uZUluID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RyaXBDb25lJyk7XG5sZXQgdHJpcE9uID0gZmFsc2UsIHRyaXBMdmwgPSAwLCB0cmlwQW5pbSA9IDAsIHRyaXBLID0gMTtcbmxldCB0cmlwQ29sID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oVFJJUF9LRVkpIHx8ICcjZjJmNWZmJztcbmNvbnN0IHRyaXBTeW5jID0gKCkgPT4geyBpZiAocHRPbil7IHRyYWNlci51cGRhdGVMaWdodHMoKTsgdHJhY2VyLnVwZGF0ZU1hdGVyaWFscygpOyB9IH07XG5mdW5jdGlvbiBhcHBseVRyaXAoKXtcbiAgY29uc3QgdiA9IHRyaXBMdmwgKiB0cmlwSywgYyA9IG5ldyBUSFJFRS5Db2xvcih0cmlwQ29sKTtcbiAgdHJpcC5zcG90LmNvbG9yLmNvcHkoYyk7IHRyaXAuZ2xvdy5jb2xvci5jb3B5KGMpOyB0cmlwLk0ubGVkLmVtaXNzaXZlLmNvcHkoYyk7XG4gIHRyaXAuTS5sZWQuY29sb3Iuc2V0KHRyaXBMdmwgPiAwLjAxID8gMHhmZmZmZmYgOiAweGQ4ZGFkZCk7XG4gIHRyaXAuc3BvdC5pbnRlbnNpdHkgPSAxMiAqIHY7IHRyaXAuZ2xvdy5pbnRlbnNpdHkgPSAwLjM1ICogdjtcbiAgdHJpcC5NLmxlZC5lbWlzc2l2ZUludGVuc2l0eSA9IDQgKiB2O1xuICB0cmlwRG90LnN0eWxlLmNzc1RleHQgPSB0cmlwT24gPyBgYmFja2dyb3VuZDoke3RyaXBDb2x9O2JveC1zaGFkb3c6MCAwIDEwcHggM3B4ICR7dHJpcENvbH05OWAgOiAnJztcbn1cbnRyaXBEaW1Jbi5vbmlucHV0ID0gKCkgPT4geyB0cmlwSyA9IHRyaXBEaW1Jbi52YWx1ZS8xMDA7IHRyaXBEaW1Jbi5uZXh0RWxlbWVudFNpYmxpbmcudGV4dENvbnRlbnQgPSB0cmlwRGltSW4udmFsdWUgKyAnJSc7IGFwcGx5VHJpcCgpOyB0cmlwU3luYygpOyB9O1xubWFrZVBpY2tlcih0cmlwQ29sSW4sIFRSSVBfS0VZICsgJy1jZmcnLCB7IG1vZGU6ICd3aGl0ZScsIHdhcm06IDUgfSwgdHJpcERpbUluLCBoID0+IHsgdHJpcENvbCA9IGg7IHRyeSB7IGxvY2FsU3RvcmFnZS5zZXRJdGVtKFRSSVBfS0VZLCBoKTsgfSBjYXRjaChlKXt9IGFwcGx5VHJpcCgpOyB0cmlwU3luYygpOyB9KTtcbnRyaXBDb25lSW4ub25pbnB1dCA9ICgpID0+IHsgdHJpcC5zcG90LmFuZ2xlID0gVEhSRUUuTWF0aFV0aWxzLmRlZ1RvUmFkKHRyaXBDb25lSW4udmFsdWUpOyB0cmlwQ29uZUluLm5leHRFbGVtZW50U2libGluZy50ZXh0Q29udGVudCA9IHRyaXBDb25lSW4udmFsdWUgKyAnwrAnOyB0cmlwU3luYygpOyB9O1xudHJpcENvbmVJbi5vbmlucHV0KCk7XG5hcHBseVRyaXAoKTtcbmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0cmlwVCcpLm9uY2xpY2sgPSAoKSA9PiB7XG4gIHRyaXBPbiA9ICF0cmlwT247XG4gIHRyaXBCb3guY2xhc3NMaXN0LnRvZ2dsZSgnb24nLCB0cmlwT24pO1xuICB0cmlwQm94LnF1ZXJ5U2VsZWN0b3IoJyN0cmlwVCBzcGFuJykudGV4dENvbnRlbnQgPSB0cmlwT24gPyAnVHJpcG9kLUxhbXBlIGF1cycgOiAnVHJpcG9kLUxhbXBlIGFuJztcbiAgY29uc3QgaWQgPSArK3RyaXBBbmltLCBmcm9tID0gdHJpcEx2bCwgdG8gPSB0cmlwT24gPyAxIDogMCwgdDAgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgKGZ1bmN0aW9uIHN0ZXAobm93KXtcbiAgICBpZiAoaWQgIT09IHRyaXBBbmltKSByZXR1cm47XG4gICAgY29uc3QgdCA9IE1hdGgubWluKDEsIChub3cgLSB0MCkgLyA0NTApO1xuICAgIHRyaXBMdmwgPSBmcm9tICsgKHRvIC0gZnJvbSkgKiAoMSAtIE1hdGgucG93KDEgLSB0LCAzKSk7XG4gICAgYXBwbHlUcmlwKCk7IHRyaXBTeW5jKCk7XG4gICAgaWYgKHQgPCAxKSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoc3RlcCk7XG4gIH0pKHQwKTtcbn07XG5cbi8vIC0tLS0tLS0tLS0gUGF0aHRyYWNpbmcgKHRocmVlLWdwdS1wYXRodHJhY2VyKTogZWNodGUgTGljaHRiw7xuZGVsIG1pdCBNZWhyZmFjaC1SZWZsZXhpb24sIHNvYmFsZCBkaWUgS2FtZXJhIHN0aWxsc3RlaHQgLS0tLS0tLS0tLVxuXG5jb25zdCBwdExhYmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B0Jyk7XG5sZXQgcmVuZGVyT24gPSBmYWxzZTtcbi8vIFNwYXJzYW1lciBTdGFuZGFyZC1SZW5kZXJlcjogTjhBTyAoU2NyZWVuLVNwYWNlIEFtYmllbnQgT2NjbHVzaW9uKSArIFJlbmRlcm4gbnVyIGJlaSBBa3Rpdml0w6R0XG5sZXQgY29tcG9zZXIgPSBudWxsLCBhb1Bhc3MgPSBudWxsLCBsYXN0QWN0ID0gcGVyZm9ybWFuY2Uubm93KCksIGxhc3RJbnB1dCA9IGxhc3RBY3Q7XG5jb25zdCBhY3QgPSAoKSA9PiB7IGxhc3RBY3QgPSBsYXN0SW5wdXQgPSBwZXJmb3JtYW5jZS5ub3coKTsgfTtcbmZvciAoY29uc3QgZXYgb2YgWydwb2ludGVyZG93bicsJ3BvaW50ZXJtb3ZlJywnd2hlZWwnLCdrZXlkb3duJywnaW5wdXQnLCdjbGljaycsJ3Jlc2l6ZScsJ3RvdWNoc3RhcnQnXSkgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoZXYsIGFjdCwgdHJ1ZSk7XG5Qcm9taXNlLmFsbChbaW1wb3J0KCd0aHJlZS9leGFtcGxlcy9qc20vcG9zdHByb2Nlc3NpbmcvRWZmZWN0Q29tcG9zZXIuanMnKSwgaW1wb3J0KCd0aHJlZS9leGFtcGxlcy9qc20vcG9zdHByb2Nlc3NpbmcvUmVuZGVyUGFzcy5qcycpLCBpbXBvcnQoJ3RocmVlL2V4YW1wbGVzL2pzbS9wb3N0cHJvY2Vzc2luZy9PdXRwdXRQYXNzLmpzJyksIGltcG9ydCgnbjhhbycpXSkudGhlbigoW3tFZmZlY3RDb21wb3Nlcn0se1JlbmRlclBhc3N9LHtPdXRwdXRQYXNzfSx7TjhBT1Bhc3N9XSkgPT4ge1xuICBjb25zdCBzID0gcmVuZGVyZXIuZ2V0U2l6ZShuZXcgVEhSRUUuVmVjdG9yMigpKTtcbiAgY29tcG9zZXIgPSBuZXcgRWZmZWN0Q29tcG9zZXIocmVuZGVyZXIpO1xuICBhb1Bhc3MgPSBuZXcgTjhBT1Bhc3Moc2NlbmUsIGNhbSwgcy54LCBzLnkpO1xuICBPYmplY3QuYXNzaWduKGFvUGFzcy5jb25maWd1cmF0aW9uLCB7IGFvUmFkaXVzOiAwLjYsIGRpc3RhbmNlRmFsbG9mZjogMC41LCBpbnRlbnNpdHk6IDIuMiwgYW9TYW1wbGVzOiAxMiwgZGVub2lzZVNhbXBsZXM6IDYsIGRlbm9pc2VSYWRpdXM6IDEwLCBoYWxmUmVzOiB0cnVlLCBnYW1tYUNvcnJlY3Rpb246IGZhbHNlIH0pO1xuICBhb1Bhc3Muc2V0UXVhbGl0eU1vZGUgJiYgYW9QYXNzLnNldFF1YWxpdHlNb2RlKCdMb3cnKTtcbiAgY29tcG9zZXIuYWRkUGFzcyhhb1Bhc3MpOyBjb21wb3Nlci5hZGRQYXNzKG5ldyBPdXRwdXRQYXNzKCkpO1xuICBhY3QoKTtcbn0pLmNhdGNoKGUgPT4gY29uc29sZS53YXJuKCdOOEFPIG5pY2h0IHZlcmbDvGdiYXIg4oCTIGVpbmZhY2hlciBSYXN0ZXInLCBlKSk7XG5jb25zdCBfY3MgPSBuZXcgVEhSRUUuVmVjdG9yMigpO1xuY29uc3QgcnRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncnQnKTtcbnJ0QnRuLm9uY2xpY2sgPSAoKSA9PiB7XG4gIHJlbmRlck9uID0gIXJlbmRlck9uO1xuICBydEJ0bi5jbGFzc0xpc3QudG9nZ2xlKCdvbicsIHJlbmRlck9uKTsgcnRCdG4uc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCByZW5kZXJPbik7XG4gIHJ0QnRuLnF1ZXJ5U2VsZWN0b3IoJ3NwYW4nKS50ZXh0Q29udGVudCA9IHJlbmRlck9uID8gJ1JlbmRlciBhbicgOiAnUmVuZGVyIGF1cyc7XG4gIGlmICghcmVuZGVyT24gJiYgcHRPbikgc3RvcFBUKCk7XG4gIHN0aWxsU2luY2UgPSBwZXJmb3JtYW5jZS5ub3coKTtcbn07XG5pbXBvcnQoJ3RocmVlLWdwdS1wYXRodHJhY2VyJykudGhlbigoeyBXZWJHTFBhdGhUcmFjZXIgfSkgPT4ge1xuICB0cmFjZXIgPSBuZXcgV2ViR0xQYXRoVHJhY2VyKHJlbmRlcmVyKTtcbiAgdHJhY2VyLmJvdW5jZXMgPSA0O1xuICB0cmFjZXIucmVuZGVyU2NhbGUgPSAwLjU7XG4gIHRyYWNlci5keW5hbWljTG93UmVzID0gZmFsc2U7XG4gIHRyYWNlci5maWx0ZXJHbG9zc3lGYWN0b3IgPSAwLjU7XG4gIHRyYWNlci50aWxlcy5zZXQoNCwgNCk7XG4gIHRyYWNlci5taW5TYW1wbGVzID0gMjtcbiAgdHJhY2VyLmZhZGVEdXJhdGlvbiA9IDM1MDtcbiAgdHJhY2VyLnJlbmRlckRlbGF5ID0gMDtcbn0pLmNhdGNoKGUgPT4gY29uc29sZS53YXJuKCdQYXRodHJhY2VyIG5pY2h0IHZlcmbDvGdiYXIg4oCTIFJhc3Rlci1GYWxsYmFjaycsIGUpKTtcbmZ1bmN0aW9uIHN0YXJ0UFQoKXtcbiAgc2NlbmUuZW52aXJvbm1lbnQgPSBwdEVudjsgc2NlbmUuYmFja2dyb3VuZCA9IHB0RW52O1xuICBzY2VuZS5lbnZpcm9ubWVudEludGVuc2l0eSA9IEVOVjtcbiAgcmVuZGVyZXIudG9uZU1hcHBpbmdFeHBvc3VyZSA9IDIuNDtcbiAgaWYgKHB0RGlydHkpeyB0cmFjZXIuc2V0U2NlbmUoc2NlbmUsIGNhbSk7IHB0RGlydHkgPSBmYWxzZTsgfVxuICBlbHNlIHsgdHJhY2VyLnVwZGF0ZUNhbWVyYSgpOyB0cmFjZXIudXBkYXRlTWF0ZXJpYWxzKCk7IHRyYWNlci51cGRhdGVMaWdodHMoKTsgdHJhY2VyLnVwZGF0ZUVudmlyb25tZW50KCk7IH1cbiAgdHJhY2VyLnJlc2V0KCk7XG4gIHB0T24gPSB0cnVlOyBwdExhYmVsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbn1cbmZ1bmN0aW9uIHN0b3BQVCgpeyBwdE9uID0gZmFsc2U7IHNjZW5lLmVudmlyb25tZW50ID0gcmFzdGVyRW52OyBzY2VuZS5iYWNrZ3JvdW5kID0gY3ViZVJULnRleHR1cmU7IGFwcGx5SW50ZXJpb3IoY2VpbE1hdC5vcGFjaXR5KTsgcHRMYWJlbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7IH1cbmNvbnN0IE1BWF9TQU1QTEVTID0gMjU2OyBsZXQgcHRGcmFtZSA9IDA7XG5sZXQgbGFzdFVzZXIgPSAtMWU5O1xuY29uc3QgaW50ZXJydXB0ID0gKCkgPT4geyBzdGlsbFNpbmNlID0gbGFzdFVzZXIgPSBwZXJmb3JtYW5jZS5ub3coKTsgaWYgKHB0T24pIHN0b3BQVCgpOyB9O1xuZm9yIChjb25zdCBldiBvZiBbJ3BvaW50ZXJkb3duJywnd2hlZWwnLCdrZXlkb3duJ10pIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKGV2LCBpbnRlcnJ1cHQsIHRydWUpO1xucmVuZGVyZXIuZG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIGludGVycnVwdCwgdHJ1ZSk7XG5jb25zdCBsYXN0TSA9IG5ldyBUSFJFRS5NYXRyaXg0KCk7IGxldCBsYXN0QXNwZWN0ID0gMDtcbmZ1bmN0aW9uIGNhbU1vdmVkKCl7XG4gIGNvbnN0IGEgPSBjYW0ubWF0cml4V29ybGQuZWxlbWVudHMsIGIgPSBsYXN0TS5lbGVtZW50czsgbGV0IGQgPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IDE2OyBpKyspIGQgKz0gTWF0aC5hYnMoYVtpXSAtIGJbaV0pO1xuICBjb25zdCBtID0gZCA+IDFlLTUgfHwgY2FtLmFzcGVjdCAhPT0gbGFzdEFzcGVjdDtcbiAgbGFzdE0uY29weShjYW0ubWF0cml4V29ybGQpOyBsYXN0QXNwZWN0ID0gY2FtLmFzcGVjdDtcbiAgcmV0dXJuIG07XG59XG5jb25zdCBsb29wID0gKCkgPT4ge1xuICBjdGwuYXV0b1JvdGF0ZSA9ICFpblJvb20gJiYgIWxhbXBGb2N1cyAmJiBjdGwuZW5hYmxlZCAmJiBwZXJmb3JtYW5jZS5ub3coKSAtIGxhc3RVc2VyID4gNjAwMDtcbiAgY3RsLmF1dG9Sb3RhdGVTcGVlZCA9IDAuNDtcbiAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QudG9nZ2xlKCdpZGxlJywgcGVyZm9ybWFuY2Uubm93KCkgLSBsYXN0SW5wdXQgPiA4MDAwKTtcbiAgY3RsLnVwZGF0ZSgpOyBjYW0udXBkYXRlTWF0cml4V29ybGQoKTtcbiAgY29uc3Qgbm93ID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gIGlmIChjYW1Nb3ZlZCgpKXsgc3RpbGxTaW5jZSA9IG5vdzsgbGFzdEFjdCA9IG5vdzsgaWYgKHB0T24pIHN0b3BQVCgpOyB9XG4gIGlmICh0cmFjZXIgJiYgcmVuZGVyT24gJiYgIXB0T24gJiYgbm93IC0gc3RpbGxTaW5jZSA+IDM1MCAmJiAoY2VpbE1hdC5vcGFjaXR5ID49IDAuOTk5IHx8IGNlaWxNYXQub3BhY2l0eSA8PSAwLjAwMSkpe1xuICAgIHRyeSB7IHN0YXJ0UFQoKTsgfSBjYXRjaChlKXsgY29uc29sZS53YXJuKCdQYXRodHJhY2VyLUZlaGxlcjogJyArIChlICYmIGUubWVzc2FnZSksIGUpOyB0cmFjZXIgPSBudWxsOyBwdE9uID0gZmFsc2U7IHNjZW5lLmVudmlyb25tZW50ID0gcmFzdGVyRW52OyBzY2VuZS5iYWNrZ3JvdW5kID0gY3ViZVJULnRleHR1cmU7IHB0TGFiZWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpOyB9XG4gIH1cbiAgaWYgKHB0T24gJiYgdHJhY2VyLnNhbXBsZXMgPj0gTUFYX1NBTVBMRVMpeyBwdExhYmVsLnRleHRDb250ZW50ID0gJ1JheXRyYWNpbmcgwrcgZmVydGlnJzsgcmV0dXJuOyB9XG4gIGlmIChwdE9uKXsgcHRGcmFtZSBePSAxOyBpZiAocHRGcmFtZSkgdHJhY2VyLnJlbmRlclNhbXBsZSgpOyBwdExhYmVsLnRleHRDb250ZW50ID0gJ1JheXRyYWNpbmcgwrcgJyArIE1hdGguZmxvb3IodHJhY2VyLnNhbXBsZXMpICsgJyBTYW1wbGVzJzsgfVxuICBlbHNlIGlmIChub3cgLSBsYXN0QWN0IDwgMTUwMCkge1xuICAgIGlmIChjb21wb3Nlcil7IHJlbmRlcmVyLmdldFNpemUoX2NzKTsgaWYgKGNvbXBvc2VyLl93ICE9PSBfY3MueCB8fCBjb21wb3Nlci5faCAhPT0gX2NzLnkpeyBjb21wb3Nlci5zZXRTaXplKF9jcy54LCBfY3MueSk7IGNvbXBvc2VyLl93ID0gX2NzLng7IGNvbXBvc2VyLl9oID0gX2NzLnk7IH0gY29tcG9zZXIucmVuZGVyKCk7IH1cbiAgICBlbHNlIHJlbmRlcmVyLnJlbmRlcihzY2VuZSwgY2FtKTtcbiAgfVxufTtcbnN0YWdlLl9sb29wID0gbG9vcDtcbnJlbmRlcmVyLnNldEFuaW1hdGlvbkxvb3AobG9vcCk7XG5cbi8vIC0tLS0tLS0tLS0gUmF1bS1OYXZpZ2F0aW9uIC0tLS0tLS0tLS1cbmNvbnN0IGNhbSA9IHN0YWdlLl9jYW1lcmEsIGN0bCA9IHN0YWdlLl9jb250cm9scztcbmxldCBsYW1wRm9jdXMgPSBmYWxzZTtcbmNvbnN0IG92ZXJ2aWV3ID0geyBwb3M6IGNhbS5wb3NpdGlvbi5jbG9uZSgpLCB0Z3Q6IGN0bC50YXJnZXQuY2xvbmUoKSB9O1xuY29uc3QgRVlFID0gMS42O1xuLy8gU3RhbmRwdW5rdCBpbiBkZXIgUmF1bW1pdHRlLCBCbGljayBpbiBSaWNodHVuZyAoZHgsZHopOyBUYXJnZXQgbWluaW1hbCB2b3IgZGVyIEthbWVyYSDihpIgVW1zZWhlbiBzdGF0dCBVbWtyZWlzZW5cbmNvbnN0IHNwb3QgPSAoeCwgeiwgZHgsIGR6LCB5ID0gRVlFKSA9PiB7XG4gIGNvbnN0IGQgPSBuZXcgVEhSRUUuVmVjdG9yMyhkeCwgLTAuMTIsIGR6KS5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcigwLjA1KTtcbiAgY29uc3QgcG9zID0gbmV3IFRIUkVFLlZlY3RvcjMoeCwgeSwgeik7XG4gIHJldHVybiB7IHBvcywgdGd0OiBwb3MuY2xvbmUoKS5hZGQoZCksIGZwOiB0cnVlIH07XG59O1xuLy8gVm9nZWxwZXJzcGVrdGl2ZTogc2Vua3JlY2h0IMO8YmVyIGRlbSBSYXVtLCBsZWljaHQgZ2VuZWlndCwgRGVja2UgYXVzZ2VibGVuZGV0IOKAkyBnYW56ZXIgUmF1bSBpbSBCaWxkXG5jb25zdCBiaXJkID0gKHgwLHowLHgxLHoxKSA9PiB7XG4gIGNvbnN0IGN4ID0gKHgwK3gxKS8yLCBjeiA9ICh6MCt6MSkvMiwgdyA9IE1hdGguYWJzKHgxLXgwKSwgZCA9IE1hdGguYWJzKHoxLXowKTtcbiAgY29uc3QgZm92ID0gKGNhbS5mb3YgfHwgNTApICogTWF0aC5QSS8xODAsIGFzcCA9IE1hdGgubWF4KDAuNiwgaW5uZXJXaWR0aC9pbm5lckhlaWdodCk7XG4gIGNvbnN0IG5lZWQgPSBNYXRoLm1heChkLCB3L2FzcCkgKiAwLjUgKiAxLjI1OyAgICAgICAgICAgIC8vIGhhbGJlIEF1c2RlaG51bmcgKyBSYW5kXG4gIGNvbnN0IGhndCA9IG5lZWQgLyBNYXRoLnRhbihmb3YvMikgKyAxLjA7XG4gIHJldHVybiB7IHBvczogbmV3IFRIUkVFLlZlY3RvcjMoY3gsIGhndCwgY3ogKyBoZ3QqMC4yMiksIHRndDogbmV3IFRIUkVFLlZlY3RvcjMoY3gsIDAuMywgY3opLCBmcDogZmFsc2UgfTtcbn07XG5jb25zdCByb29tID0gKFt4MCx6MCx4MSx6MV0sIGR4LCBkeikgPT4gKHsgZnA6IHNwb3QoKHgwK3gxKS8yLCAoejArejEpLzIsIGR4LCBkeiksIGJpcmQ6IGJpcmQoeDAsIHowLCB4MSwgejEpIH0pO1xuY29uc3QgUk9PTVMgPSBbXG4gIFsnw5xiZXJzaWNodCcsIG92ZXJ2aWV3XSxcbiAgWydXb2huemltbWVyJywgcm9vbShSTV9XWiwgMSwgMC40KV0sXG4gIFsnS8O8Y2hlJywgcm9vbShSTV9LVSwgMSwgLTAuMyldLFxuICBbJ1NjaGxhZnppbW1lcicsIHJvb20oUk1fU1osIC0wLjMsIDEpXSxcbiAgWydCYWQnLCByb29tKFJNX0JBRCwgMCwgLTEpXSxcbiAgWydGbHVyJywgcm9vbShSTV9GTCwgLTEsIDApXSxcbiAgWydCYWxrb24nLCByb29tKFtCWDAsIEJaMCwgQlgxLCBCWjFdLCAwLCAtMSldLFxuXTtcbmxldCBhbmltID0gMDtcbmZ1bmN0aW9uIGZseVRvKHZpZXcpe1xuICBjb25zdCBpZCA9ICsrYW5pbTtcbiAgY29uc3QgcDAgPSBjYW0ucG9zaXRpb24uY2xvbmUoKSwgdDAgPSBjdGwudGFyZ2V0LmNsb25lKCk7XG4gIGNvbnN0IGMwID0gY2VpbE1hdC5vcGFjaXR5LCBjMSA9IHZpZXcuZnAgPyAxIDogMDtcbiAgaW5Sb29tID0gISF2aWV3LmZwO1xuICBjb25zdCBjbGFtcDAxID0geCA9PiBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCB4KSk7XG4gIGNvbnN0IGRpc3QgPSBwMC5kaXN0YW5jZVRvKHZpZXcucG9zKTtcbiAgY29uc3QgZHVyID0gTWF0aC5taW4oMjIwMCwgMTEwMCArIGRpc3QqOTApO1xuICBjb25zdCBsaWZ0ID0gTWF0aC5taW4oMywgZGlzdCowLjI1KTtcbiAgY29uc3Qgc3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgY3RsLmVuYWJsZWQgPSBmYWxzZTtcbiAgY3RsLmVuYWJsZVpvb20gPSBjdGwuZW5hYmxlUGFuID0gIXZpZXcuZnA7XG4gIGN0bC5yb3RhdGVTcGVlZCA9IHZpZXcuZnAgPyAtMC4zNSA6IDE7XG4gIGN0bC5taW5EaXN0YW5jZSA9IDA7XG4gIGNvbnN0IGVhc2UgPSB0ID0+IHQgPCAwLjUgPyA0KnQqdCp0IDogMSAtIE1hdGgucG93KC0yKnQrMiwgMykvMjtcbiAgKGZ1bmN0aW9uIHN0ZXAobm93KXtcbiAgICBpZiAoaWQgIT09IGFuaW0pIHJldHVybjtcbiAgICBjb25zdCB0ID0gTWF0aC5taW4oMSwgKG5vdyAtIHN0YXJ0KS9kdXIpLCBlID0gZWFzZSh0KTtcbiAgICBjYW0ucG9zaXRpb24ubGVycFZlY3RvcnMocDAsIHZpZXcucG9zLCBlKTtcbiAgICBjYW0ucG9zaXRpb24ueSArPSBNYXRoLnNpbihNYXRoLlBJKmUpICogbGlmdDtcbiAgICBjdGwudGFyZ2V0LmxlcnBWZWN0b3JzKHQwLCB2aWV3LnRndCwgZSk7XG4gICAgY2FtLmxvb2tBdChjdGwudGFyZ2V0KTtcbiAgICAvLyBFaW5ibGVuZGVuIGVyc3QgYW0gRW5kZSBkZXIgQW5mbHVncyAoS2FtZXJhIHNjaG9uIHVudGVyIERlY2tlbmjDtmhlKSwgQXVzYmxlbmRlbiBzb2ZvcnRcbiAgICBjb25zdCBrID0gYzEgPiBjMCA/IGNsYW1wMDEoKGUgLSAwLjYpIC8gMC40KSA6IGNsYW1wMDEoZSAvIDAuMyk7XG4gICAgc2V0Q2VpbChjMCArIChjMSAtIGMwKSAqIGspO1xuICAgIGlmICh0IDwgMSkgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHN0ZXApOyBlbHNlIGN0bC5lbmFibGVkID0gdHJ1ZTtcbiAgfSkoc3RhcnQpO1xufVxuY29uc3QgYmFyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jvb21zJyk7XG5jb25zdCBwb3ZCYXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncG92Jyk7XG5sZXQgY3VyVmlldyA9IG92ZXJ2aWV3LCBwb3ZNb2RlID0gJ2JpcmQnO1xuY29uc3Qgc2hvdyA9ICgpID0+IGZseVRvKGN1clZpZXcuYmlyZCA/IGN1clZpZXdbcG92TW9kZV0gOiBjdXJWaWV3KTtcblJPT01TLmZvckVhY2goKFtsYWJlbCwgdmlld10sIGkpID0+IHtcbiAgY29uc3QgYiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICBiLnRleHRDb250ZW50ID0gbGFiZWw7XG4gIGlmIChpID09PSAwKSBiLmNsYXNzTGlzdC5hZGQoJ29uJyk7XG4gIGIub25jbGljayA9ICgpID0+IHtcbiAgICBiYXIucXVlcnlTZWxlY3RvckFsbCgnYnV0dG9uJykuZm9yRWFjaCh4ID0+IHguY2xhc3NMaXN0LnRvZ2dsZSgnb24nLCB4ID09PSBiKSk7XG4gICAgbGFtcEJ0bi5jbGFzc0xpc3QudG9nZ2xlKCdzaG93JywgbGFiZWwgPT09ICdXb2huemltbWVyJyk7XG4gICAgdHJpcEJveC5jbGFzc0xpc3QudG9nZ2xlKCdzaG93JywgbGFiZWwgPT09ICdTY2hsYWZ6aW1tZXInKTtcbiAgICBwb3ZCYXIuY2xhc3NMaXN0LnRvZ2dsZSgnc2hvdycsICEhdmlldy5iaXJkKTtcbiAgICBjdXJWaWV3ID0gdmlldzsgcG92TW9kZSA9ICdiaXJkJztcbiAgICBwb3ZCYXIucXVlcnlTZWxlY3RvckFsbCgnYnV0dG9uJykuZm9yRWFjaCh4ID0+IHguY2xhc3NMaXN0LnRvZ2dsZSgnb24nLCB4LmRhdGFzZXQubSA9PT0gcG92TW9kZSkpO1xuICAgIHNob3coKTtcbiAgfTtcbiAgYmFyLmFwcGVuZENoaWxkKGIpO1xufSk7XG4vLyBMYW1wZSBrb25maWd1cmllcmVuIOKGkiBLYW1lcmEgZmxpZWd0IGFuIGRpZSBMYW1wZSwgRHJlaGVuIHN0b3BwdDsgYmVpbSBTY2hsaWXDn2VuIHp1csO8Y2tcbmNvbnN0IExBTVBfRk9DVVMgPSB7IFtMQU1QX0tFWSArICctY2ZnJ106IFticC5jbG9uZSgpLCAxXSwgW1RSSVBfS0VZICsgJy1jZmcnXTogW3RyaXAuc3BvdC5nZXRXb3JsZFBvc2l0aW9uKG5ldyBUSFJFRS5WZWN0b3IzKCkpLCAzXSB9O1xuYWRkRXZlbnRMaXN0ZW5lcignbHBpY2snLCBlID0+IHtcbiAgY29uc3QgZiA9IExBTVBfRk9DVVNbZS5kZXRhaWwua2V5XTsgaWYgKCFmKSByZXR1cm47XG4gIGlmIChlLmRldGFpbC5vcGVuKXtcbiAgICBsYW1wRm9jdXMgPSB0cnVlO1xuICAgIGNvbnN0IHAgPSBmWzBdLCBjID0gUk9PTVNbZlsxXV1bMV0uZnAucG9zLCBkaXIgPSBuZXcgVEhSRUUuVmVjdG9yMyhjLnggLSBwLngsIDAsIGMueiAtIHAueik7XG4gICAgY29uc3QgZGlzdCA9IE1hdGgubWluKDEuOCwgZGlyLmxlbmd0aCgpICogMC44NSk7IGRpci5ub3JtYWxpemUoKTtcbiAgICBjb25zdCBwb3MgPSBwLmNsb25lKCkuYWRkU2NhbGVkVmVjdG9yKGRpciwgZGlzdCkuYWRkKG5ldyBUSFJFRS5WZWN0b3IzKDAsIDAuMzUsIDApKTtcbiAgICBjb25zdCByaWdodCA9IG5ldyBUSFJFRS5WZWN0b3IzKC1kaXIueiwgMCwgZGlyLngpLm11bHRpcGx5U2NhbGFyKGRpc3QgKiAwLjMpOyAvLyBMYW1wZSBpbnMgcmVjaHRlIEJpbGRkcml0dGVsLCBQaWNrZXIgbGlua3NcbiAgICBmbHlUbyh7IHBvcywgdGd0OiBwLmNsb25lKCkuYWRkKG5ldyBUSFJFRS5WZWN0b3IzKDAsIC0wLjIsIDApKS5hZGQocmlnaHQpLCBmcDogZmFsc2UgfSk7XG4gIH0gZWxzZSB7IGxhbXBGb2N1cyA9IGZhbHNlOyBzaG93KCk7IH1cbn0pO1xucG92QmFyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZSA9PiB7XG4gIGNvbnN0IGIgPSBlLnRhcmdldC5jbG9zZXN0KCdidXR0b24nKTsgaWYgKCFiIHx8IGIuZGF0YXNldC5tID09PSBwb3ZNb2RlKSByZXR1cm47XG4gIHBvdk1vZGUgPSBiLmRhdGFzZXQubTtcbiAgcG92QmFyLnF1ZXJ5U2VsZWN0b3JBbGwoJ2J1dHRvbicpLmZvckVhY2goeCA9PiB4LmNsYXNzTGlzdC50b2dnbGUoJ29uJywgeCA9PT0gYikpO1xuICBzaG93KCk7XG59KTtcblxuLy8gLS0tLS0tLS0tLSBQb2x5IEhhdmVuIFRleHR1cmVuIC0tLS0tLS0tLS1cbmFzeW5jIGZ1bmN0aW9uIHBvbHlIYXZlbihhc3NldE5hbWUsIHJlcyl7XG4gIGNvbnN0IGFsbCA9IGF3YWl0IChhd2FpdCBmZXRjaCgnaHR0cHM6Ly9hcGkucG9seWhhdmVuLmNvbS9hc3NldHM/dD10ZXh0dXJlcycpKS5qc29uKCk7XG4gIGNvbnN0IHdhbnQgPSBhc3NldE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgaWQgPSAoYWxsW3dhbnRdID8gd2FudCA6IG51bGwpIHx8IE9iamVjdC5rZXlzKGFsbCkuZmluZChrID0+IChhbGxba10ubmFtZXx8JycpLnRvTG93ZXJDYXNlKCkgPT09IHdhbnQpXG4gICAgICAgICAgfHwgT2JqZWN0LmtleXMoYWxsKS5maW5kKGsgPT4gKGFsbFtrXS5uYW1lfHwnJykudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh3YW50KSlcbiAgICAgICAgICB8fCB3YW50LnJlcGxhY2UoL1xccysvZywnXycpO1xuICBjb25zdCBmaWxlcyA9IGF3YWl0IChhd2FpdCBmZXRjaChgaHR0cHM6Ly9hcGkucG9seWhhdmVuLmNvbS9maWxlcy8ke2lkfWApKS5qc29uKCk7XG4gIGNvbnN0IHBpY2sgPSBrZXkgPT4gZmlsZXNba2V5XT8uWycxayddPy5qcGc/LnVybCB8fCBmaWxlc1trZXldPy5bJzFrJ10/LnBuZz8udXJsO1xuICBjb25zdCBkaW0gPSBhbGxbaWRdPy5kaW1lbnNpb25zOyAvLyBtbSBbdyxoXVxuICByZXR1cm4geyBpZCwgZGltLCBkaWZmOiBwaWNrKCdEaWZmdXNlJyksIG5vcjogcGljaygnbm9yX2dsJyksIHJvdWdoOiBwaWNrKCdSb3VnaCcpIH07XG59XG5jb25zdCBsb2FkZXIgPSBuZXcgVEhSRUUuVGV4dHVyZUxvYWRlcigpO1xubG9hZGVyLnNldENyb3NzT3JpZ2luKCdhbm9ueW1vdXMnKTtcbmNvbnN0IGxvYWRUZXggPSAodXJsLCBzcmdiKSA9PiBuZXcgUHJvbWlzZSgocmVzLCByZWopID0+IGxvYWRlci5sb2FkKHVybCwgdCA9PiB7XG4gIHQud3JhcFMgPSB0LndyYXBUID0gVEhSRUUuUmVwZWF0V3JhcHBpbmc7XG4gIGlmIChzcmdiKSB0LmNvbG9yU3BhY2UgPSBUSFJFRS5TUkdCQ29sb3JTcGFjZTtcbiAgdC5hbmlzb3Ryb3B5ID0gODsgcmVzKHQpO1xufSwgdW5kZWZpbmVkLCByZWopKTtcbmFzeW5jIGZ1bmN0aW9uIGFwcGx5KG1hdCwgYXNzZXROYW1lLCB1dlNjYWxlLCByZXMpe1xuICBjb25zdCBmID0gYXdhaXQgcG9seUhhdmVuKGFzc2V0TmFtZSwgcmVzKTtcbiAgY29uc3QgW21hcCwgbm9ybWFsTWFwLCByb3VnaG5lc3NNYXBdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIGxvYWRUZXgoZi5kaWZmLCB0cnVlKSwgZi5ub3IgPyBsb2FkVGV4KGYubm9yKSA6IG51bGwsIGYucm91Z2ggPyBsb2FkVGV4KGYucm91Z2gpIDogbnVsbFxuICBdKTtcbiAgaWYgKHV2U2NhbGUpeyAvLyBlY2h0ZSBHcsO2w59lOiBVVnMgc2luZCBpbiAxL3V2U2NhbGUgbSwgVGV4dHVyIGRlY2t0IGRpbSBtbSBhYlxuICAgIGNvbnN0IHcgPSAoZi5kaW0/LlswXSB8fCAyMDAwKSAvIDEwMDAsIGhoID0gKGYuZGltPy5bMV0gfHwgZi5kaW0/LlswXSB8fCAyMDAwKSAvIDEwMDA7XG4gICAgZm9yIChjb25zdCB0IG9mIFttYXAsIG5vcm1hbE1hcCwgcm91Z2huZXNzTWFwXSkgaWYgKHQpIHQucmVwZWF0LnNldCh1dlNjYWxlIC8gdywgdXZTY2FsZSAvIGhoKTtcbiAgfVxuICBtYXQubWFwID0gbWFwOyBtYXQuY29sb3Iuc2V0KDB4ZmZmZmZmKTtcbiAgaWYgKG5vcm1hbE1hcCkgbWF0Lm5vcm1hbE1hcCA9IG5vcm1hbE1hcDtcbiAgaWYgKHJvdWdobmVzc01hcCkgeyBtYXQucm91Z2huZXNzTWFwID0gcm91Z2huZXNzTWFwOyBtYXQucm91Z2huZXNzID0gMTsgfVxuICBtYXQubmVlZHNVcGRhdGUgPSB0cnVlO1xuICBwdERpcnR5ID0gdHJ1ZTsgaWYgKHB0T24pIHN0b3BQVCgpO1xuICByZXR1cm4gZi5pZDtcbn1cbi8vIC0tLS0tLS0tLS0gVGFnZXN6ZWl0OiBwcm96ZWR1cmFsZXIgSGltbWVsICh0aHJlZS5qcyBTa3ksIFByZWV0aGFtLU1vZGVsbCkgLS0tLS0tLS0tLVxuY29uc3QgeyBTa3kgfSA9IGF3YWl0IGltcG9ydCgndGhyZWUvYWRkb25zL29iamVjdHMvU2t5LmpzJyk7XG5jb25zdCBza3kgPSBuZXcgU2t5KCk7IHNreS5zY2FsZS5zZXRTY2FsYXIoMTAwMCk7XG5jb25zdCBza3lTY2VuZSA9IG5ldyBUSFJFRS5TY2VuZSgpOyBza3lTY2VuZS5hZGQoc2t5KTtcbmNvbnN0IFNVID0gc2t5Lm1hdGVyaWFsLnVuaWZvcm1zO1xuU1UubWllQ29lZmZpY2llbnQudmFsdWUgPSAwLjAwNTsgU1UubWllRGlyZWN0aW9uYWxHLnZhbHVlID0gMC44O1xuLy8gTmFjaHQtL0TDpG1tZXJ1bmdzLU1pbmltdW06IGR1bmtsZXMgQmxhdSwgenVtIEhvcml6b250IGhlbGxlclxuc2t5Lm1hdGVyaWFsLnVuaWZvcm1zLm5pZ2h0Rmxvb3IgPSB7IHZhbHVlOiBuZXcgVEhSRUUuQ29sb3IoMCwwLDApIH07XG5za3kubWF0ZXJpYWwuZnJhZ21lbnRTaGFkZXIgPSAndW5pZm9ybSB2ZWMzIG5pZ2h0Rmxvb3I7XFxuJyArIHNreS5tYXRlcmlhbC5mcmFnbWVudFNoYWRlci5yZXBsYWNlKCcjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+JyxcbiAgJ2Zsb2F0IGh6RiA9IDEuMCAtIGNsYW1wKG5vcm1hbGl6ZSh2V29ybGRQb3NpdGlvbiAtIGNhbWVyYVBvc2l0aW9uKS55LCAwLjAsIDEuMCk7XFxuIGdsX0ZyYWdDb2xvci5yZ2IgPSBtYXgoZ2xfRnJhZ0NvbG9yLnJnYiwgbmlnaHRGbG9vciAqICgwLjU1ICsgMC45Kmh6RipoekYpKTtcXG4jaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+Jyk7XG5za3kubWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xuY29uc3QgY3ViZVJUID0gbmV3IFRIUkVFLldlYkdMQ3ViZVJlbmRlclRhcmdldCg1MTIsIHsgdHlwZTogVEhSRUUuSGFsZkZsb2F0VHlwZSB9KTtcbmNvbnN0IGN1YmVDYW0gPSBuZXcgVEhSRUUuQ3ViZUNhbWVyYSgxLCA1MDAwLCBjdWJlUlQpOyBza3lTY2VuZS5hZGQoY3ViZUNhbSk7XG5jb25zdCBwbXJlbSA9IG5ldyBUSFJFRS5QTVJFTUdlbmVyYXRvcihyZW5kZXJlcik7XG5sZXQgZW52UlQgPSBudWxsO1xuY29uc3Qga2V5QmFzZSA9IGtleS5pbnRlbnNpdHksIGhlbWlDb2wwID0gaGVtaSA/IGhlbWkuY29sb3IuY2xvbmUoKSA6IG51bGwsIGhlbWlHbmQwID0gaGVtaSA/IGhlbWkuZ3JvdW5kQ29sb3IuY2xvbmUoKSA6IG51bGw7XG5jb25zdCBTUyA9IFRIUkVFLk1hdGhVdGlscy5zbW9vdGhzdGVwLCBjb2wgPSAocixnLGIpID0+IG5ldyBUSFJFRS5Db2xvcihyLGcsYik7XG5mdW5jdGlvbiBtYWtlUFRFbnYoZCwgZGF5LCBnb2xkZW4pe1xuICBjb25zdCB3ID0gMjU2LCBoID0gMTI4LCBhcnIgPSBuZXcgRmxvYXQzMkFycmF5KHcqaCo0KTtcbiAgY29uc3QgemVuID0gY29sKC4wMywuMDQ1LC4xKS5sZXJwKGNvbCguMTYsLjMyLC43NSksIGRheSk7XG4gIGNvbnN0IGhvciA9IGNvbCguMDUsLjA3LC4xMykubGVycChjb2woLjc1LC44MiwuOTIpLmxlcnAoY29sKDEsLjU1LC4zKSwgZ29sZGVuKi44KSwgZGF5KTtcbiAgY29uc3QgZ25kID0gaG9yLmNsb25lKCkubXVsdGlwbHlTY2FsYXIoLjI1KTtcbiAgY29uc3Qgc3VuQyA9IGNvbCgxLC45NSwuODUpLmxlcnAoY29sKDEsLjUsLjIpLCBnb2xkZW4pLm11bHRpcGx5U2NhbGFyKDQwKmRheSk7XG4gIGZvciAobGV0IGogPSAwOyBqIDwgaDsgaisrKXtcbiAgICBjb25zdCBlbCA9ICgoaisuNSkvaCAtIC41KSpNYXRoLlBJLCBzeSA9IE1hdGguc2luKGVsKSwgY3kgPSBNYXRoLmNvcyhlbCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3OyBpKyspe1xuICAgICAgY29uc3QgYXogPSAoKGkrLjUpL3cgLSAuNSkqMipNYXRoLlBJLCB4ID0gTWF0aC5jb3MoYXopKmN5LCB6ID0gTWF0aC5zaW4oYXopKmN5O1xuICAgICAgbGV0IHIsIGcsIGJiO1xuICAgICAgaWYgKHN5ID49IDApeyBjb25zdCB0ID0gTWF0aC5zcXJ0KHN5KTsgciA9IGhvci5yKyh6ZW4uci1ob3IucikqdDsgZyA9IGhvci5nKyh6ZW4uZy1ob3IuZykqdDsgYmIgPSBob3IuYisoemVuLmItaG9yLmIpKnQ7IH1cbiAgICAgIGVsc2UgeyBjb25zdCB0ID0gTWF0aC5taW4oMSwgLXN5KjQpOyByID0gaG9yLnIrKGduZC5yLWhvci5yKSp0OyBnID0gaG9yLmcrKGduZC5nLWhvci5nKSp0OyBiYiA9IGhvci5iKyhnbmQuYi1ob3IuYikqdDsgfVxuICAgICAgY29uc3QgZG90ID0geCpkLnggKyBzeSpkLnkgKyB6KmQuejtcbiAgICAgIGlmIChkb3QgPiAwKXsgY29uc3QgZ2wgPSBNYXRoLnBvdyhkb3QsIDQ4KSpkYXkqKDErZ29sZGVuKTsgciArPSBnbDsgZyArPSBnbCooLjg1LS4zKmdvbGRlbik7IGJiICs9IGdsKiguNy0uNDUqZ29sZGVuKTsgfVxuICAgICAgaWYgKGRvdCA+IC45OTkgJiYgc3kgPiAtMC4wMil7IHIgPSBzdW5DLnI7IGcgPSBzdW5DLmc7IGJiID0gc3VuQy5iOyB9XG4gICAgICBjb25zdCBrID0gKGoqdyArIGkpKjQ7IGFycltrXSA9IHI7IGFycltrKzFdID0gZzsgYXJyW2srMl0gPSBiYjsgYXJyW2srM10gPSAxO1xuICAgIH1cbiAgfVxuICBjb25zdCBkdCA9IG5ldyBUSFJFRS5EYXRhVGV4dHVyZShhcnIsIHcsIGgsIFRIUkVFLlJHQkFGb3JtYXQsIFRIUkVFLkZsb2F0VHlwZSk7XG4gIGR0Lm1hcHBpbmcgPSBUSFJFRS5FcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZztcbiAgZHQubWluRmlsdGVyID0gZHQubWFnRmlsdGVyID0gVEhSRUUuTGluZWFyRmlsdGVyOyBkdC5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTsgZHQubmVlZHNVcGRhdGUgPSB0cnVlO1xuICByZXR1cm4gZHQ7XG59XG5jb25zdCBzdW5WID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcbmZ1bmN0aW9uIHNldFRpbWUoaHIpe1xuICAvLyBTb25uZW5iYWhuICh2ZXJlaW5mYWNodCk6IDcgVWhyIE9zdCAoK3gpIOKGkiAxMyBVaHIgU8O8ZCAoK3opIOKGkiAxOSBVaHIgV2VzdCwgbWF4LiA1MMKwIEjDtmhlXG4gIGNvbnN0IHBoaSA9IE1hdGguUEkqKGhyIC0gNykvMTIsIGUgPSBUSFJFRS5NYXRoVXRpbHMuZGVnVG9SYWQoNTApKk1hdGguc2luKHBoaSk7XG4gIHN1blYuc2V0KE1hdGguY29zKHBoaSkqTWF0aC5jb3MoZSksIE1hdGguc2luKGUpLCBNYXRoLnNpbihwaGkpKk1hdGguY29zKGUpKS5ub3JtYWxpemUoKTtcbiAgY29uc3QgcyA9IHN1blYueSwgZGF5ID0gU1MocywgLTAuMTQsIDAuMTgpLCBnb2xkZW4gPSAxIC0gU1MocywgMCwgMC40KSwgZHVzayA9IFNTKHMsIC0wLjIyLCAtMC4wMikgKiAoMSAtIFNTKHMsIDAuMDIsIDAuMikpO1xuICBTVS5zdW5Qb3NpdGlvbi52YWx1ZS5jb3B5KHN1blYpO1xuICBTVS5yYXlsZWlnaC52YWx1ZSA9IDIuNSArIDEuMipnb2xkZW47XG4gIFNVLnR1cmJpZGl0eS52YWx1ZSA9IDMgKyA1KmdvbGRlbjtcbiAgLy8gTmFjaHRibGF1LCB6dXIgYmxhdWVuIFN0dW5kZSBldHdhcyBoZWxsZXIvdmlvbGV0dGVyXG4gIFNVLm5pZ2h0Rmxvb3IudmFsdWUuc2V0UkdCKDAuMDEwICsgMC4wMypkdXNrLCAwLjAxNiArIDAuMDMqZHVzaywgMC4wNDUgKyAwLjA2KmR1c2spO1xuICBjdWJlQ2FtLnVwZGF0ZShyZW5kZXJlciwgc2t5U2NlbmUpO1xuICBlbnZSVCA9IHBtcmVtLmZyb21DdWJlbWFwKGN1YmVSVC50ZXh0dXJlLCBlbnZSVCk7XG4gIHJhc3RlckVudiA9IGVudlJULnRleHR1cmU7XG4gIGlmIChzID4gLTAuMDMpe1xuICAgIGtleS5wb3NpdGlvbi5jb3B5KGhjKS5hZGRTY2FsZWRWZWN0b3Ioc3VuViwgMzApO1xuICAgIGtleS5jb2xvci5zZXQoMHhmZjlhNTIpLmxlcnAobmV3IFRIUkVFLkNvbG9yKDB4ZmZmM2UyKSwgU1MocywgMCwgMC41KSk7XG4gICAga2V5LmludGVuc2l0eSA9IGtleUJhc2UgKiAxLjMgKiBNYXRoLm1heChkYXksIDAuMTUpO1xuICB9IGVsc2UgeyAvLyBNb25kbGljaHQsIGdlZ2Vuw7xiZXIgZGVyIFNvbm5lXG4gICAgY29uc3QgbSA9IG5ldyBUSFJFRS5WZWN0b3IzKC1zdW5WLngsIE1hdGguYWJzKHN1blYueSkqMC44ICsgMC4yLCAtc3VuVi56KS5ub3JtYWxpemUoKTtcbiAgICBrZXkucG9zaXRpb24uY29weShoYykuYWRkU2NhbGVkVmVjdG9yKG0sIDMwKTtcbiAgICBrZXkuY29sb3Iuc2V0KDB4OWZiNGZmKTsga2V5LmludGVuc2l0eSA9IGtleUJhc2UgKiAwLjI1O1xuICB9XG4gIGVudksgPSAwLjIgKyAwLjEqZGF5ICsgMC4xNSpkdXNrOyBoZW1pSyA9IDAuMyArIDAuNCpkYXk7IGZpbGxLID0gMC4xICsgMC41KmRheTsgZXhwSyA9IDEgLSAwLjQ1KmRheTtcbiAgaWYgKGhlbWkpeyBoZW1pLmNvbG9yLmNvcHkoaGVtaUNvbDApLmxlcnAobmV3IFRIUkVFLkNvbG9yKDB4MzQ0MjZlKSwgMSAtIGRheSk7IGhlbWkuZ3JvdW5kQ29sb3IuY29weShoZW1pR25kMCkubXVsdGlwbHlTY2FsYXIoMC4zICsgMC43KmRheSk7IH1cbiAgcHRFbnYgPSBtYWtlUFRFbnYoc3VuViwgZGF5LCBnb2xkZW4pO1xuICBzY2VuZS5iYWNrZ3JvdW5kID0gY3ViZVJULnRleHR1cmU7XG4gIHNjZW5lLmJhY2tncm91bmRJbnRlbnNpdHkgPSAwLjIgKyAxLjEqKDEgLSBkYXkpO1xuICBpZiAocHRPbikgc3RvcFBUKCk7IGVsc2UgeyBzY2VuZS5lbnZpcm9ubWVudCA9IHJhc3RlckVudjsgYXBwbHlJbnRlcmlvcihjZWlsTWF0Lm9wYWNpdHkpOyB9XG4gIGFjdCgpO1xufVxuLy8gSGltbWVsICYgTGljaHQgZm9sZ2VuIGRlciBlY2h0ZW4gVWhyemVpdFxuY29uc3Qgbm93SCA9ICgpID0+IHsgY29uc3QgbiA9IG5ldyBEYXRlKCk7IHJldHVybiBuLmdldEhvdXJzKCkgKyBuLmdldE1pbnV0ZXMoKS82MDsgfTtcbnNldFRpbWUobm93SCgpKTtcbnNldEludGVydmFsKCgpID0+IHNldFRpbWUobm93SCgpKSwgNjAwMDApO1xubGV0IHRleE1zZyA9ICdUZXh0dXJlbiB3ZXJkZW4gZ2VsYWRlbuKApic7XG5jb25zdCB1cGQgPSAoKSA9PiBzdGF0dXNFbC50ZXh0Q29udGVudCA9IHRleE1zZztcbnVwZCgpO1xuc29mYS5NLmZhYnJpYy5jb2xvci5zZXQoJyMzYTNhM2MnKTtcbmFwcGx5KHNvZmEuTS5mYWJyaWMsICdQb2x5IFdvb2wgSGVycmluZ2JvbmUnKS50aGVuKCgpID0+IHNvZmEuTS5mYWJyaWMuY29sb3Iuc2V0KCcjM2EzYTNjJykpLmNhdGNoKGUgPT4gY29uc29sZS53YXJuKGUpKTtcblByb21pc2UuYWxsKFthcHBseShNLmZsb29yLCAnd29vZF9mbG9vcicsIDEuMCksIGFwcGx5KE0ud2FsbCwgJ1doaXRlIFN0dWNjbycpLCBhcHBseShNLmJyaWNrLCAnQnJpY2sgV2FsbCAwNCcsIDEuNSksIGFwcGx5KE0uY2FwLCAnUm91Z2ggUGxhc3RlciBCcmljayAwNCcsIDEuNSksIGFwcGx5KHRpbGVNYXQsICdpbnRlcmlvcl90aWxlcycsIDEuMCwgJzJrJykudGhlbihpZCA9PiB7XG4gICAgLy8gbnVyIFJlbGllZi9HbGFueiBiZWhhbHRlbiwgRmFyYmUgd2Vpw587IFJhc3RlciBhY2hzcGFyYWxsZWwgZHJlaGVuLCBGbGllc2VuIGhhbGIgc28gZ3Jvw59cbiAgICB0aWxlTWF0Lm1hcCA9IG51bGw7IHRpbGVNYXQuY29sb3Iuc2V0KDB4ZjNmMmVlKTtcbiAgICAvLyBUZXh0dXI6IFJhdXRlbnJhc3RlciwgMyBGbGllc2VuIGplIEthY2hlbCDihpIgNDXCsCBnZWRyZWh0IGFjaHNwYXJhbGxlbDsgMTUtY20tRmxpZXNlbiwgRnVnZW4gYXVmIDAsOTAgLyAxLDUwIG1cbiAgICBjb25zdCBUSUxFID0gMC4xNSwgcmVwID0gMSAvICgzICogTWF0aC5TUVJUMiAqIFRJTEUpO1xuICAgIGZvciAoY29uc3QgdCBvZiBbdGlsZU1hdC5ub3JtYWxNYXAsIHRpbGVNYXQucm91Z2huZXNzTWFwXSkgaWYgKHQpeyB0LmNlbnRlci5zZXQoMCwgMCk7IHQub2Zmc2V0LnNldCgwLCAwKTsgdC5yb3RhdGlvbiA9IE1hdGguUEkvNDsgdC5yZXBlYXQuc2V0KHJlcCwgcmVwKTsgfVxuICAgIHRpbGVNYXQubmVlZHNVcGRhdGUgPSB0cnVlOyByZXR1cm4gaWQ7XG4gIH0pXSlcbiAgLnRoZW4oaWRzID0+IHsgdGV4TXNnID0gJ1RleHR1cmVuOiAnICsgaWRzLmpvaW4oJywgJyk7IHVwZCgpOyB9KVxuICAuY2F0Y2goZSA9PiB7IGNvbnNvbGUud2FybihlKTsgdGV4TXNnID0gJ1RleHR1cmVuIG5pY2h0IGVycmVpY2hiYXIg4oCTIEZhcmItRmFsbGJhY2snOyB1cGQoKTsgfSk7XG48XHUwMDJGc2NyaXB0PlxuXG5cbjxcdTAwMkZib2R5PjxcdTAwMkZodG1sPiIKICA8L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+", P = "PCFET0NUWVBFIGh0bWw+CjxodG1sPgo8aGVhZD4KICA8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CiAgPHRpdGxlPldvaG51bmcg4oCTIDNEIE1pbmlhdHVyIChIYW5keSk8L3RpdGxlPgogIDxzdHlsZT4KICAgICogeyBtYXJnaW46IDA7IHBhZGRpbmc6IDA7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IH0KICAgIGJvZHkgeyBiYWNrZ3JvdW5kOiAjMWIxYjE5OyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgbWluLWhlaWdodDogMTAwdmg7IGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsIHNhbnMtc2VyaWY7IH0KICAgICNfX2J1bmRsZXJfbG9hZGluZyB7IHBvc2l0aW9uOiBmaXhlZDsgYm90dG9tOiAyMHB4OyByaWdodDogMjBweDsgZm9udDogMTNweC8xLjQgLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCBzYW5zLXNlcmlmOyBjb2xvcjogIzY2NjsgYmFja2dyb3VuZDogI2ZmZjsgcGFkZGluZzogOHB4IDE0cHg7IGJvcmRlci1yYWRpdXM6IDhweDsgYm94LXNoYWRvdzogMCAxcHggNHB4IHJnYmEoMCwwLDAsMC4xMik7IHotaW5kZXg6IDEwMDAwOyB9CiAgICAjX19idW5kbGVyX3RodW1ibmFpbCB7IHBvc2l0aW9uOiBmaXhlZDsgaW5zZXQ6IDA7IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyOyBiYWNrZ3JvdW5kOiAjMWIxYjE5OyB6LWluZGV4OiA5OTk5OyB9CiAgICAjX19idW5kbGVyX3RodW1ibmFpbCBzdmcgeyB3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDAlOyBvYmplY3QtZml0OiBjb250YWluOyB9CiAgICAjX19idW5kbGVyX3BsYWNlaG9sZGVyIHsgY29sb3I6ICM5OTk7IGZvbnQtc2l6ZTogMTRweDsgfQogIDwvc3R5bGU+CiAgPG5vc2NyaXB0PgogICAgPHN0eWxlPiNfX2J1bmRsZXJfbG9hZGluZyB7IGRpc3BsYXk6IG5vbmU7IH08L3N0eWxlPgogICAgPGRpdiBzdHlsZT0icG9zaXRpb246Zml4ZWQ7Ym90dG9tOjEycHg7bGVmdDoxMnB4O2ZvbnQ6MTNweC8xLjQgLWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsc2Fucy1zZXJpZjtjb2xvcjojOTk5O2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwwLjkpO3BhZGRpbmc6NnB4IDEycHg7Ym9yZGVyLXJhZGl1czo2cHg7Ym94LXNoYWRvdzowIDFweCA0cHggcmdiYSgwLDAsMCwwLjA4KTt6LWluZGV4OjEwMDAwOyI+CiAgICAgIFRoaXMgcGFnZSByZXF1aXJlcyBKYXZhU2NyaXB0IHRvIGRpc3BsYXkuCiAgICA8L2Rpdj4KICA8L25vc2NyaXB0Pgo8L2hlYWQ+Cjxib2R5PgogIDxkaXYgaWQ9Il9fYnVuZGxlcl90aHVtYm5haWwiPjxzdmcgdmlld0JveD0iMCAwIDEyMCAxMjAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjEyMCIgaGVpZ2h0PSIxMjAiIGZpbGw9IiMxYjFiMTkiPjwvcmVjdD48cmVjdCB4PSI0NiIgeT0iMjYiIHdpZHRoPSIyOCIgaGVpZ2h0PSI2OCIgcng9IjEwIiBmaWxsPSJub25lIiBzdHJva2U9IiNlOWU2ZGUiIHN0cm9rZS13aWR0aD0iNCI+PC9yZWN0PjxjaXJjbGUgY3g9IjYwIiBjeT0iNDIiIHI9IjUiIGZpbGw9IiNlNTQ4NGQiPjwvY2lyY2xlPjxjaXJjbGUgY3g9IjYwIiBjeT0iNjIiIHI9IjciIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2U5ZTZkZSIgc3Ryb2tlLXdpZHRoPSI0Ij48L2NpcmNsZT48L3N2Zz48L2Rpdj4KICA8ZGl2IGlkPSJfX2J1bmRsZXJfbG9hZGluZyI+VW5wYWNraW5nLi4uPC9kaXY+CgogIDxzY3JpcHQ+CiAgICAKZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGFzeW5jIGZ1bmN0aW9uKCkgewogIGNvbnN0IGxvYWRpbmcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnX19idW5kbGVyX2xvYWRpbmcnKTsKICBmdW5jdGlvbiBzZXRTdGF0dXMobXNnKSB7IGlmIChsb2FkaW5nKSBsb2FkaW5nLnRleHRDb250ZW50ID0gbXNnOyB9CgogIGNvbnN0IEZPTlRfTUlNRSA9IC9eKGZvbnRbL118YXBwbGljYXRpb25bL10oeC0pP2ZvbnQtfGFwcGxpY2F0aW9uWy9ddm5kXC5tcy1mb250b2JqZWN0KS9pOwogIGNvbnN0IE1JTUVfVE9LRU4gPSAvXltcdy4rLV0rWy9dW1x3ListXSskLzsKICBmdW5jdGlvbiB0b0Jhc2U2NChieXRlcykgewogICAgbGV0IGJpbiA9ICcnOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkgKz0gMHg4MDAwKSB7CiAgICAgIGJpbiArPSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGJ5dGVzLnN1YmFycmF5KGksIGkgKyAweDgwMDApKTsKICAgIH0KICAgIHJldHVybiBidG9hKGJpbik7CiAgfQoKICAvLyBFcnJvciBzaW5rIHBlcnNpc3RzIGFjcm9zcyByZXBsYWNlV2l0aCBzaW5jZSBpdCdzIG9uIHdpbmRvdywgbm90IHRoZSBET00uCiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgZnVuY3Rpb24oZSkgewogICAgLy8gRmFpbGVkIHJlc291cmNlIGxvYWRzIChDU1AtYmxvY2tlZCBsaW5rcywgc2NyaXB0cywgaW1hZ2VzKSBmaXJlIHBsYWluCiAgICAvLyBldmVudHMgYXQgdGhlIGVsZW1lbnQg4oCUIHdhcm4gb25seTsgcmVhbCBKUyBlcnJvcnMgY2FycnkgbWVzc2FnZS9lcnJvci4KICAgIGlmICghZS5tZXNzYWdlICYmICFlLmVycm9yICYmIGUudGFyZ2V0ICYmIGUudGFyZ2V0ICE9PSB3aW5kb3cpIHsKICAgICAgY29uc29sZS53YXJuKCdbYnVuZGxlXSByZXNvdXJjZSBmYWlsZWQgdG8gbG9hZDonLAogICAgICAgIGUudGFyZ2V0LnRhZ05hbWUsIFN0cmluZyhlLnRhcmdldC5zcmMgfHwgZS50YXJnZXQuaHJlZiB8fCAnJykpOwogICAgICByZXR1cm47CiAgICB9CiAgICB2YXIgcCA9IGRvY3VtZW50LmJvZHkgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OwogICAgdmFyIGQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnX19idW5kbGVyX2VycicpIHx8IHAuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpOwogICAgZC5pZCA9ICdfX2J1bmRsZXJfZXJyJzsKICAgIGQuc3R5bGUuY3NzVGV4dCA9ICdwb3NpdGlvbjpmaXhlZDtib3R0b206MTJweDtsZWZ0OjEycHg7cmlnaHQ6MTJweDtmb250OjEycHgvMS40IHVpLW1vbm9zcGFjZSxtb25vc3BhY2U7YmFja2dyb3VuZDojMmExMjE1O2NvbG9yOiNmZjhhODA7cGFkZGluZzoxMHB4IDE0cHg7Ym9yZGVyLXJhZGl1czo4cHg7Ym9yZGVyOjFweCBzb2xpZCAjNWMyYjJlO3otaW5kZXg6OTk5OTk7d2hpdGUtc3BhY2U6cHJlLXdyYXA7bWF4LWhlaWdodDo0MHZoO292ZXJmbG93OmF1dG8nOwogICAgZC50ZXh0Q29udGVudCA9IChkLnRleHRDb250ZW50ID8gZC50ZXh0Q29udGVudCArIFN0cmluZy5mcm9tQ2hhckNvZGUoMTApIDogJycpICsKICAgICAgJ1tidW5kbGVdICcgKyAoZS5tZXNzYWdlIHx8IGUudHlwZSkgKwogICAgICAoZS5maWxlbmFtZSA/ICcgKCcgKyBlLmZpbGVuYW1lLnNsaWNlKDAsIDYwKSArICc6JyArIGUubGluZW5vICsgJyknIDogJycpOwogIH0sIHRydWUpOwoKICB0cnkgewogICAgY29uc3QgbWFuaWZlc3RFbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3NjcmlwdFt0eXBlPSJfX2J1bmRsZXIvbWFuaWZlc3QiXScpOwogICAgY29uc3QgdGVtcGxhdGVFbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3NjcmlwdFt0eXBlPSJfX2J1bmRsZXIvdGVtcGxhdGUiXScpOwogICAgaWYgKCFtYW5pZmVzdEVsIHx8ICF0ZW1wbGF0ZUVsKSB7CiAgICAgIHNldFN0YXR1cygnRXJyb3I6IG1pc3NpbmcgYnVuZGxlIGRhdGEnKTsKICAgICAgY29uc29sZS5lcnJvcignW2J1bmRsZXJdIE1pc3Npbmcgc2NyaXB0IHRhZ3Mg4oCUIG1hbmlmZXN0RWw6JywgISFtYW5pZmVzdEVsLCAndGVtcGxhdGVFbDonLCAhIXRlbXBsYXRlRWwpOwogICAgICByZXR1cm47CiAgICB9CgogICAgY29uc3QgbWFuaWZlc3QgPSBKU09OLnBhcnNlKG1hbmlmZXN0RWwudGV4dENvbnRlbnQpOwogICAgbGV0IHRlbXBsYXRlID0gSlNPTi5wYXJzZSh0ZW1wbGF0ZUVsLnRleHRDb250ZW50KTsKCiAgICAvLyBOZXN0ZWQgcGFnZSBidW5kbGVzIChpZnJhbWUgdGFyZ2V0cykuIEVhY2ggc2hpcHMgT05DRSwgaW4gdGhlIFJPT1QKICAgIC8vIGRvY3VtZW50J3MgbWFuaWZlc3Q7IGZyYW1lIHNyY3MgY2FycnkgYW4gYWJvdXQ6YmxhbmsjPHV1aWQ+IG1hcmtlcgogICAgLy8gaW5zdGVhZCBvZiBhIHN1YnN0aXR1dGFibGUgdXVpZC4gRXZlcnkgZG9jdW1lbnQgbWludHMgdGhlIGJsb2JzIGZvcgogICAgLy8gaXRzIE9XTiBmcmFtZXMg4oCUIGZyb20gbG9jYWwgdGV4dCBhdCB0aGUgcm9vdCwgb3IgdGV4dCBvYnRhaW5lZCBmcm9tCiAgICAvLyBpdHMgRElSRUNUIHBhcmVudCBvdmVyIHRoZSByZWxheSBwcm90b2NvbCBiZWxvdyDigJQgc28gZWFjaCBmcmFtZQogICAgLy8gbmF2aWdhdGlvbiBzdGF5cyBzYW1lLW9yaWdpbiB3aXRoIGl0cyBpbml0aWF0b3IgYW5kIGEgZGVkdXBlZCBwYWdlCiAgICAvLyBsb2FkcyBhdCBhbnkgZGVwdGggb24gYW55IGhvc3QsIGluY2x1ZGluZyBhIGZpbGU6Ly8gZG93bmxvYWQncwogICAgLy8gb3BhcXVlIG9yaWdpbnMgKHdoZXJlIGEgYmxvYiBtaW50ZWQgYnkgb25lIGRvY3VtZW50IGNhbm5vdCBiZQogICAgLy8gbmF2aWdhdGVkIHRvIGJ5IGFub3RoZXIpLgogICAgY29uc3QgcGFnZU9yZGVyRWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdzY3JpcHRbdHlwZT0iX19idW5kbGVyL3BhZ2Vfb3JkZXIiXScpOwogICAgY29uc3QgcGFnZU9yZGVyID0gcGFnZU9yZGVyRWwgPyBKU09OLnBhcnNlKHBhZ2VPcmRlckVsLnRleHRDb250ZW50KSA6IFtdOwogICAgY29uc3QgcGFnZVNldCA9IG5ldyBTZXQocGFnZU9yZGVyKTsKICAgIGNvbnN0IHBhZ2VUZXh0cyA9IHt9OwoKICAgIC8vIOKUgOKUgCBOZXN0ZWQtcGFnZSB0ZXh0IHByb3RvY29sIChwYXJlbnQtY2hhaW4gcmVsYXkpIOKUgOKUgAogICAgLy8gUGFnZSBidW5kbGVzIHNoaXAgb25jZSwgaW4gdGhlIFJPT1QgZG9jdW1lbnQncyBtYW5pZmVzdC4gRXZlcnkKICAgIC8vIGRvY3VtZW50IG1pbnRzIHRoZSBibG9icyBmb3IgaXRzIE9XTiBmcmFtZXMsIG9idGFpbmluZyBwYWdlIHRleHQKICAgIC8vIHRocm91Z2ggYSBzdHJpY3QgcGFyZW50LWNoYWluIHJlbGF5OiBhIGRvY3VtZW50IG9ubHkgZXZlciBTRU5EUyB0bwogICAgLy8gaXRzIGRpcmVjdCBwYXJlbnQgKHdoaWNoLCBmb3IgZXZlcnkgZG9jdW1lbnQgdGhlIHB1Ymxpc2hlcidzIG93bgogICAgLy8gcnVudGltZSBtaW50ZWQsIGlzIGFub3RoZXIgcHVibGlzaGVyIGRvY3VtZW50KSBhbmQgb25seSBBQ0NFUFRTCiAgICAvLyB0ZXh0IGZyb20gdGhhdCBkaXJlY3QgcGFyZW50OyByZXF1ZXN0cyBmcm9tIGJlbG93IGFyZSBob25vcmVkIG9ubHkKICAgIC8vIGZvciB0aGUgZG9jdW1lbnQncyBvd24gY2hpbGQgZnJhbWVzLCBhbmQgdGhlIFJPT1QgbmV2ZXIgc2VuZHMKICAgIC8vIHVwd2FyZCBhdCBhbGwuIFRoYXQgbGFzdCBydWxlIGlzIGxvYWQtYmVhcmluZzogdGhlIGFydGlmYWN0IGhvc3QncwogICAgLy8gZnJhbWUtYW5jZXN0b3JzIGFsbG93cyBjbGF1ZGUuYWkgKGFuZCBmcmllbmRzKSB0byBmcmFtZSBhbgogICAgLy8gYXJ0aWZhY3QsIHNvIHdpbmRvdy50b3AgY2FuIGJlIGEgRk9SRUlHTiBkb2N1bWVudCDigJQgYSB0b3AtYWRkcmVzc2VkCiAgICAvLyBwcm90b2NvbCB3b3VsZCBoYW5kIHBhZ2UgdXVpZHMgdG8gdGhhdCBhbmNlc3RvciBhbmQgYWNjZXB0IGZvcmdlZAogICAgLy8gInBhZ2UgdGV4dCIgZnJvbSBpdCwgbWludGluZyBhdHRhY2tlciBIVE1MIGFzIGFuIGFydGlmYWN0LW9yaWdpbgogICAgLy8gYmxvYiBkb2N1bWVudC4gVGhlIGNoYWluIG5ldmVyIHRvdWNoZXMgdGhlIGFuY2VzdG9yOiByZXF1ZXN0cyBzdG9wCiAgICAvLyBhdCB0aGUgcm9vdCwgcmVwbGllcyBhcmUgb3JpZ2luLWFkZHJlc3NlZCBwZXIgaG9wIChuZXZlciAnKicgd2hlbgogICAgLy8gYW4gb3JpZ2luIGV4aXN0cyksIGFuZCBib3RoIGRpcmVjdGlvbnMgYXJlIG9yaWdpbi1nYXRlZCAob24gaHR0cHMKICAgIC8vIGEgZm9yZWlnbiBzZW5kZXIncyBvcmlnaW4gY2FuIG5ldmVyIGVxdWFsIHRoaXMgZG9jdW1lbnQnczsgaW4KICAgIC8vIG9wYXF1ZSBjb250ZXh0cyDigJQgZmlsZTovLyDigJQgZXZlcnl0aGluZyBzZXJpYWxpemVzIGFzICdudWxsJywgd2hlcmUKICAgIC8vIGFuIGVtYmVkZGVkIEVYVEVSTkFMIGZyYW1lIHN0aWxsIGZhaWxzIHRoZSBnYXRlIGJ5IGNhcnJ5aW5nIGl0cwogICAgLy8gb3duIHJlYWwgb3JpZ2luLCBhbmQgYSBzYW5kYm94ZWQgY2hpbGQgb2Ygc3VjaCBhIGZyYW1lIGlzIGV4Y2x1ZGVkCiAgICAvLyBieSB0aGUgb3duLWNoaWxkLWZyYW1lcyBjaGVjayBwbHVzIHV1aWQgdW5ndWVzc2FiaWxpdHkpLiBTaGFwZSBpcwogICAgLy8gZGVueS1ieS1kZWZhdWx0OiBvbmUgcmVxdWVzdCBmb3JtLCBvbmUgcmVwbHkgZm9ybSwgbm8gZXJyb3IKICAgIC8vIHJlcGxpZXMuCiAgICAvLyB3aW5kb3cub3JpZ2luIGlzIHRoZSBTRVJJQUxJWkVEIFNFQ1VSSVRZIG9yaWdpbiAoJ251bGwnIGluIG9wYXF1ZQogICAgLy8gY29udGV4dHMgc3VjaCBhcyBhIHNhbmRib3hlZCBwcmV2aWV3IGlmcmFtZSkg4oCUIGxvY2F0aW9uLm9yaWdpbiBpcwogICAgLy8gY29tcHV0ZWQgZnJvbSB0aGUgVVJMIGFuZCBzdGF5cyAnaHR0cHM6Ly/igKYnIGV2ZW4gd2hlbiB0aGUgZG9jdW1lbnQKICAgIC8vIGlzIHNhbmRib3hlZCwgd2hpY2ggd291bGQgbWlzZ2F0ZSBldmVyeSBvcGFxdWUgY2hhaW4uCiAgICBjb25zdCBPV05fVEFSR0VUID0gL15odHRwcz86Wy9dWy9dLy50ZXN0KHdpbmRvdy5vcmlnaW4gfHwgJycpCiAgICAgID8gd2luZG93Lm9yaWdpbgogICAgICA6ICcqJzsKICAgIGZ1bmN0aW9uIHRydXN0ZWRPcmlnaW4oZSkgewogICAgICBpZiAoZS5vcmlnaW4gPT09IHdpbmRvdy5vcmlnaW4pIHJldHVybiB0cnVlOyAvLyBodHRwcyBjaGFpbnM7IG9wYXF1ZT09b3BhcXVlCiAgICAgIC8vIGZpbGU6Ly8gdHJlZXM6IENocm9tZSBzZXJpYWxpemVzIHRoZSBmaWxlIGRvY3VtZW50J3Mgb3JpZ2luIGFzCiAgICAgIC8vICdmaWxlOi8vJyB3aGlsZSB0aGUgYmxvYjogZG9jdW1lbnRzIGl0IG1pbnRzIHNlcmlhbGl6ZSBhcyAnbnVsbCcsCiAgICAgIC8vIHNvIHRoZSB0d28gbGVnaXRpbWF0ZSBzaGFwZXMgY2FuIG5ldmVyIHN0cmluZy1tYXRjaCDigJQgYWNjZXB0IHRoZQogICAgICAvLyBwYWlyIGluIGJvdGggZGlyZWN0aW9ucy4gaHR0cHMgb3JpZ2lucyBuZXZlciBzZXJpYWxpemUgYXMgZWl0aGVyLAogICAgICAvLyBhbmQgc2VuZGVyIGlkZW50aXR5IChvd24gY2hpbGQgZnJhbWUgLyBkaXJlY3QgcGFyZW50KSBpcyBjaGVja2VkCiAgICAgIC8vIHNlcGFyYXRlbHkuCiAgICAgIHJldHVybiAoCiAgICAgICAgKGUub3JpZ2luID09PSAnbnVsbCcgJiYKICAgICAgICAgICh3aW5kb3cub3JpZ2luID09PSAnZmlsZTovLycgfHwKICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnByb3RvY29sID09PSAnZmlsZTonKSkgfHwKICAgICAgICAoL15maWxlOi8udGVzdChlLm9yaWdpbikgJiYgd2luZG93Lm9yaWdpbiA9PT0gJ251bGwnKQogICAgICApOwogICAgfQogICAgLy8gTm9uLWVtcHR5IG9ubHkgaW4gdGhlIHJvb3QgZG9jdW1lbnQgKG5lc3RlZCBidW5kbGVzIHNoaXAgYW4gZW1wdHkKICAgIC8vIGlzbGFuZCksIHNvIGl0IGRvdWJsZXMgYXMgdGhlIHJvb3QgbWFya2VyOiB0aGUgcm9vdCBhbnN3ZXJzIGZyb20KICAgIC8vIGxvY2FsIHRleHQgYW5kIHRyZWF0cyBhIG1pc3MgYXMgYXV0aG9yaXRhdGl2ZSDigJQgbmV2ZXIgcmVsYXlpbmcgdG8KICAgIC8vIGl0cyAocG9zc2libHkgZm9yZWlnbikgcGFyZW50LgogICAgY29uc3QgaXNQYWdlUm9vdCA9IHBhZ2VPcmRlci5sZW5ndGggPiAwOwogICAgY29uc3QgYmxvYlVybHMgPSB7fTsKICAgIGNvbnN0IHJlc291cmNlQmxvYnMgPSB7fTsKICAgIGNvbnN0IFVVSURfU0hBUEUgPSAvXlswLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQvOwogICAgY29uc3QgcGVuZGluZ0ZyYW1lcyA9IHt9OyAvLyB1dWlkIC0+IFt7ZWwsIGZyYWd9XSBhd2FpdGluZyB0ZXh0IGZvciBvd24gZnJhbWVzCiAgICBjb25zdCBwZW5kaW5nUmVsYXlzID0ge307IC8vIHV1aWQgLT4gW2NoaWxkV2luZG93XSBhd2FpdGluZyB0ZXh0IHRvIHBhc3MgZG93bgogICAgZnVuY3Rpb24gbW91bnRQYWdlKGVsLCBmcmFnLCB0ZXh0KSB7CiAgICAgIGNvbnN0IHBhZ2VCbG9iID0gbmV3IEJsb2IoW3RleHRdLCB7IHR5cGU6ICd0ZXh0L2h0bWwnIH0pOwogICAgICBjb25zdCB1ID0gVVJMLmNyZWF0ZU9iamVjdFVSTChwYWdlQmxvYik7CiAgICAgIHJlc291cmNlQmxvYnNbdV0gPSBwYWdlQmxvYjsKICAgICAgZWwuc3JjID0gdSArIGZyYWc7CiAgICB9CiAgICBmdW5jdGlvbiBkZWxpdmVyUGFnZSh1dWlkLCB0ZXh0KSB7CiAgICAgIGNvbnN0IGZyYW1lcyA9IHBlbmRpbmdGcmFtZXNbdXVpZF07CiAgICAgIGRlbGV0ZSBwZW5kaW5nRnJhbWVzW3V1aWRdOwogICAgICBpZiAoZnJhbWVzKSBmb3IgKGNvbnN0IGYgb2YgZnJhbWVzKSBtb3VudFBhZ2UoZi5lbCwgZi5mcmFnLCB0ZXh0KTsKICAgICAgY29uc3QgcmVsYXlzID0gcGVuZGluZ1JlbGF5c1t1dWlkXTsKICAgICAgZGVsZXRlIHBlbmRpbmdSZWxheXNbdXVpZF07CiAgICAgIGlmIChyZWxheXMpIHsKICAgICAgICBmb3IgKGNvbnN0IGN3IG9mIHJlbGF5cykgewogICAgICAgICAgdHJ5IHsgY3cucG9zdE1lc3NhZ2UoeyBfX2J1bmRsZXJfcGFnZTogdXVpZCwgX19idW5kbGVyX3RleHQ6IHRleHQgfSwgT1dOX1RBUkdFVCk7IH0gY2F0Y2ggKGVycikgeyAvKiBnb25lICovIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIG93bkZyYW1lV2luZG93cygpIHsKICAgICAgY29uc3Qgb3V0ID0gW107CiAgICAgIGZvciAoY29uc3QgZiBvZiBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lmcmFtZScpKSkgewogICAgICAgIHRyeSB7IGlmIChmLmNvbnRlbnRXaW5kb3cpIG91dC5wdXNoKGYuY29udGVudFdpbmRvdyk7IH0gY2F0Y2ggKGVycikgeyAvKiBkZXRhY2hlZCAqLyB9CiAgICAgIH0KICAgICAgcmV0dXJuIG91dDsKICAgIH0KICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24gKGUpIHsKICAgICAgY29uc3QgZCA9IGUuZGF0YTsKICAgICAgaWYgKCFkIHx8IHR5cGVvZiBkICE9PSAnb2JqZWN0JyB8fCAhZS5zb3VyY2UpIHJldHVybjsKICAgICAgLy8gT3JpZ2luIGdhdGUgZmlyc3Q7IHRoZSBzdHJ1Y3R1cmFsIGNoZWNrcyBiZWxvdyAob3duLWNoaWxkLWZyYW1lcwogICAgICAvLyBmb3IgcmVxdWVzdHMsIGRpcmVjdC1wYXJlbnQgKyBzb2xpY2l0ZWQtdXVpZCBmb3IgcmVwbGllcywgdGhlCiAgICAgIC8vIHJvb3QncyBuZXZlci1yZWxheSBydWxlKSBhcmUgd2hhdCBob2xkIGluIGZ1bGx5IG9wYXF1ZSBjaGFpbnMKICAgICAgLy8gd2hlcmUgb3JpZ2luIHN0cmluZ3MgY2FuJ3QgZGlzY3JpbWluYXRlIOKAlCBhIHNhbmRib3hlZCByb290J3MKICAgICAgLy8gRk9SRUlHTiB3cmFwcGVyIHN0aWxsIGZhaWxzIGFsbCB0aHJlZSBldmVuIHRob3VnaCBib3RoIHNlcmlhbGl6ZQogICAgICAvLyBhcyByZWFsLXZzLSdudWxsJyByYXRoZXIgdGhhbiBtYXRjaGluZy4KICAgICAgaWYgKCF0cnVzdGVkT3JpZ2luKGUpKSByZXR1cm47CiAgICAgIGlmICh0eXBlb2YgZC5fX2J1bmRsZXJfbmVlZCA9PT0gJ3N0cmluZycgJiYgVVVJRF9TSEFQRS50ZXN0KGQuX19idW5kbGVyX25lZWQpKSB7CiAgICAgICAgLy8gUmVxdWVzdHMgYXJlIGhvbm9yZWQgb25seSBmb3IgdGhpcyBkb2N1bWVudCdzIG93biBjaGlsZCBmcmFtZXMuCiAgICAgICAgaWYgKG93bkZyYW1lV2luZG93cygpLmluZGV4T2YoZS5zb3VyY2UpIDwgMCkgcmV0dXJuOwogICAgICAgIGNvbnN0IHV1aWQgPSBkLl9fYnVuZGxlcl9uZWVkOwogICAgICAgIGNvbnN0IHRleHQgPSBwYWdlVGV4dHNbdXVpZF07CiAgICAgICAgaWYgKHR5cGVvZiB0ZXh0ID09PSAnc3RyaW5nJykgewogICAgICAgICAgdHJ5IHsgZS5zb3VyY2UucG9zdE1lc3NhZ2UoeyBfX2J1bmRsZXJfcGFnZTogdXVpZCwgX19idW5kbGVyX3RleHQ6IHRleHQgfSwgT1dOX1RBUkdFVCk7IH0gY2F0Y2ggKGVycikgeyAvKiBnb25lICovIH0KICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKGlzUGFnZVJvb3QgfHwgd2luZG93LnBhcmVudCA9PT0gd2luZG93KSByZXR1cm47IC8vIGF1dGhvcml0YXRpdmUgbWlzcwogICAgICAgIGNvbnN0IHdhaXRpbmcgPSBwZW5kaW5nUmVsYXlzW3V1aWRdOwogICAgICAgIGlmICh3YWl0aW5nKSB7CiAgICAgICAgICBpZiAod2FpdGluZy5pbmRleE9mKGUuc291cmNlKSA8IDApIHdhaXRpbmcucHVzaChlLnNvdXJjZSk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIC8vIE5ldmVyLWFuc3dlcmVkIHV1aWRzIHdvdWxkIG90aGVyd2lzZSBhY2N1bXVsYXRlIGZvcmV2ZXIgdW5kZXIgYQogICAgICAgIC8vIHJlcXVlc3Qgc3ByYXk7IHBhc3QgdGhlIGNhcCAoZmFyIGFib3ZlIGFueSByZWFsIHBhZ2UgY291bnQpIG5ldwogICAgICAgIC8vIHJlbGF5cyBhcmUgZHJvcHBlZCByYXRoZXIgdGhhbiByZW1lbWJlcmVkLgogICAgICAgIGlmIChPYmplY3Qua2V5cyhwZW5kaW5nUmVsYXlzKS5sZW5ndGggPj0gMTI4KSByZXR1cm47CiAgICAgICAgcGVuZGluZ1JlbGF5c1t1dWlkXSA9IFtlLnNvdXJjZV07CiAgICAgICAgd2luZG93LnBhcmVudC5wb3N0TWVzc2FnZSh7IF9fYnVuZGxlcl9uZWVkOiB1dWlkIH0sIE9XTl9UQVJHRVQpOwogICAgICB9IGVsc2UgaWYgKAogICAgICAgIHR5cGVvZiBkLl9fYnVuZGxlcl9wYWdlID09PSAnc3RyaW5nJyAmJgogICAgICAgIFVVSURfU0hBUEUudGVzdChkLl9fYnVuZGxlcl9wYWdlKSAmJgogICAgICAgIHR5cGVvZiBkLl9fYnVuZGxlcl90ZXh0ID09PSAnc3RyaW5nJwogICAgICApIHsKICAgICAgICAvLyBUaGUgc2hhcGUgdGVzdCBpcyBsb2FkLWJlYXJpbmcgYmV5b25kIHRpZGluZXNzOiB0aGUgc29saWNpdGVkCiAgICAgICAgLy8gY2hlY2sgYmVsb3cgdXNlcyB0aGUgaW4gb3BlcmF0b3IsIHdoaWNoIG1hdGNoZXMgcHJvdG90eXBlIGtleXMKICAgICAgICAvLyAoJ19fcHJvdG9fXycsICdjb25zdHJ1Y3RvcicpIOKAlCBhbiB1bnNoYXBlZCBrZXkgd291bGQgcmVhY2gKICAgICAgICAvLyBkZWxpdmVyUGFnZSBhbmQgdGhyb3csIHBhaW50aW5nIHRoZSBlcnJvciBiYW5uZXIuCiAgICAgICAgLy8gVGV4dCBpcyBhY2NlcHRlZCBvbmx5IGZyb20gdGhlIGRpcmVjdCBwYXJlbnQg4oCUIHRoZSBkb2N1bWVudAogICAgICAgIC8vIHRoYXQgbWludGVkIHRoaXMgb25lLgogICAgICAgIGlmIChlLnNvdXJjZSAhPT0gd2luZG93LnBhcmVudCB8fCB3aW5kb3cucGFyZW50ID09PSB3aW5kb3cpIHJldHVybjsKICAgICAgICBpZiAoIShkLl9fYnVuZGxlcl9wYWdlIGluIHBlbmRpbmdGcmFtZXMpICYmICEoZC5fX2J1bmRsZXJfcGFnZSBpbiBwZW5kaW5nUmVsYXlzKSkgcmV0dXJuOwogICAgICAgIGRlbGl2ZXJQYWdlKGQuX19idW5kbGVyX3BhZ2UsIGQuX19idW5kbGVyX3RleHQpOwogICAgICB9CiAgICB9KTsKCiAgICBjb25zdCB1dWlkcyA9IE9iamVjdC5rZXlzKG1hbmlmZXN0KTsKICAgIHNldFN0YXR1cygnVW5wYWNraW5nICcgKyB1dWlkcy5sZW5ndGggKyAnIGFzc2V0cy4uLicpOwoKICAgIGF3YWl0IFByb21pc2UuYWxsKHV1aWRzLm1hcChhc3luYyAodXVpZCkgPT4gewogICAgICBjb25zdCBlbnRyeSA9IG1hbmlmZXN0W3V1aWRdOwogICAgICB0cnkgewogICAgICAgIGNvbnN0IGJpbmFyeVN0ciA9IGF0b2IoZW50cnkuZGF0YSk7CiAgICAgICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShiaW5hcnlTdHIubGVuZ3RoKTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJpbmFyeVN0ci5sZW5ndGg7IGkrKykgYnl0ZXNbaV0gPSBiaW5hcnlTdHIuY2hhckNvZGVBdChpKTsKCiAgICAgICAgbGV0IGZpbmFsQnl0ZXMgPSBieXRlczsKICAgICAgICBpZiAoZW50cnkuY29tcHJlc3NlZCkgewogICAgICAgICAgaWYgKHR5cGVvZiBEZWNvbXByZXNzaW9uU3RyZWFtICE9PSAndW5kZWZpbmVkJykgewogICAgICAgICAgICBjb25zdCBkcyA9IG5ldyBEZWNvbXByZXNzaW9uU3RyZWFtKCdnemlwJyk7CiAgICAgICAgICAgIGNvbnN0IHdyaXRlciA9IGRzLndyaXRhYmxlLmdldFdyaXRlcigpOwogICAgICAgICAgICBjb25zdCByZWFkZXIgPSBkcy5yZWFkYWJsZS5nZXRSZWFkZXIoKTsKICAgICAgICAgICAgd3JpdGVyLndyaXRlKGJ5dGVzKTsKICAgICAgICAgICAgd3JpdGVyLmNsb3NlKCk7CiAgICAgICAgICAgIGNvbnN0IGNodW5rcyA9IFtdOwogICAgICAgICAgICBsZXQgdG90YWxMZW4gPSAwOwogICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgICAgIGNvbnN0IHsgZG9uZSwgdmFsdWUgfSA9IGF3YWl0IHJlYWRlci5yZWFkKCk7CiAgICAgICAgICAgICAgaWYgKGRvbmUpIGJyZWFrOwogICAgICAgICAgICAgIGNodW5rcy5wdXNoKHZhbHVlKTsKICAgICAgICAgICAgICB0b3RhbExlbiArPSB2YWx1ZS5sZW5ndGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZmluYWxCeXRlcyA9IG5ldyBVaW50OEFycmF5KHRvdGFsTGVuKTsKICAgICAgICAgICAgbGV0IG9mZnNldCA9IDA7CiAgICAgICAgICAgIGZvciAoY29uc3QgY2h1bmsgb2YgY2h1bmtzKSB7IGZpbmFsQnl0ZXMuc2V0KGNodW5rLCBvZmZzZXQpOyBvZmZzZXQgKz0gY2h1bmsubGVuZ3RoOyB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLndhcm4oJ0RlY29tcHJlc3Npb25TdHJlYW0gbm90IGF2YWlsYWJsZSwgYXNzZXQgJyArIHV1aWQgKyAnIG1heSBub3QgcmVuZGVyJyk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAocGFnZVNldC5oYXModXVpZCkpIHsKICAgICAgICAgIHBhZ2VUZXh0c1t1dWlkXSA9IG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShmaW5hbEJ5dGVzKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKEZPTlRfTUlNRS50ZXN0KGVudHJ5Lm1pbWUpICYmIE1JTUVfVE9LRU4udGVzdChlbnRyeS5taW1lKSkgewogICAgICAgICAgLy8gU3RyaWN0IGFydGlmYWN0IGhvc3RzIGFsbG93IGZvbnQtc3JjIGRhdGE6IGJ1dCBub3QgYmxvYjouCiAgICAgICAgICBibG9iVXJsc1t1dWlkXSA9ICdkYXRhOicgKyBlbnRyeS5taW1lICsgJztiYXNlNjQsJyArCiAgICAgICAgICAgIChlbnRyeS5jb21wcmVzc2VkID8gdG9CYXNlNjQoZmluYWxCeXRlcykgOiBlbnRyeS5kYXRhKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtmaW5hbEJ5dGVzXSwgeyB0eXBlOiBlbnRyeS5taW1lIH0pOwogICAgICAgICAgYmxvYlVybHNbdXVpZF0gPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpOwogICAgICAgICAgcmVzb3VyY2VCbG9ic1tibG9iVXJsc1t1dWlkXV0gPSBibG9iOwogICAgICAgIH0KICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGRlY29kZSBhc3NldCAnICsgdXVpZCArICc6JywgZXJyKTsKICAgICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW10sIHsgdHlwZTogZW50cnkubWltZSB9KTsKICAgICAgICBibG9iVXJsc1t1dWlkXSA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7CiAgICAgICAgcmVzb3VyY2VCbG9ic1tibG9iVXJsc1t1dWlkXV0gPSBibG9iOwogICAgICB9CiAgICB9KSk7CgogICAgY29uc3QgZXh0UmVzRWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdzY3JpcHRbdHlwZT0iX19idW5kbGVyL2V4dF9yZXNvdXJjZXMiXScpOwogICAgY29uc3QgZXh0UmVzb3VyY2VzID0gZXh0UmVzRWwgPyBKU09OLnBhcnNlKGV4dFJlc0VsLnRleHRDb250ZW50KSA6IFtdOwogICAgY29uc3QgcmVzb3VyY2VNYXAgPSB7fTsKICAgIGZvciAoY29uc3QgZW50cnkgb2YgZXh0UmVzb3VyY2VzKSB7CiAgICAgIGlmIChibG9iVXJsc1tlbnRyeS51dWlkXSkgcmVzb3VyY2VNYXBbZW50cnkuaWRdID0gYmxvYlVybHNbZW50cnkudXVpZF07CiAgICB9CgogICAgLy8gQXJ0aWZhY3QtaG9zdCBDU1AgKGNvbm5lY3Qtc3JjICdzZWxmJykgcmVmdXNlcyBmZXRjaCgpIG9mIGJsb2I6IFVSTHMg4oCUCiAgICAvLyBjb25zdW1lcnMgcmVhZCB0aGVzZSBCbG9icyBkaXJlY3RseS4gU3Vydml2ZXMgdGhlIHN3YXAgbGlrZSB0aGUgZXJyb3Igc2luay4KICAgIHdpbmRvdy5fX3Jlc291cmNlQmxvYnMgPSByZXNvdXJjZUJsb2JzOwoKICAgIHNldFN0YXR1cygnUmVuZGVyaW5nLi4uJyk7CiAgICAvLyBQYWdlIHV1aWRzIGhhdmUgbm8gYmxvYiBoZXJlIOKAlCB0aGV5IHJpZGUgaW5zaWRlIGFib3V0OmJsYW5rIzx1dWlkPgogICAgLy8gZnJhbWUgbWFya2VycyB0aGUgcGFzcyBiZWxvdyByZXNvbHZlcyBhZnRlciB0aGUgc3dhcC4KICAgIGZvciAoY29uc3QgdXVpZCBvZiB1dWlkcykgewogICAgICBpZiAocGFnZVNldC5oYXModXVpZCkpIGNvbnRpbnVlOwogICAgICB0ZW1wbGF0ZSA9IHRlbXBsYXRlLnNwbGl0KHV1aWQpLmpvaW4oYmxvYlVybHNbdXVpZF0pOwogICAgfQoKICAgIC8vIFN0cmlwIGludGVncml0eSArIGNyb3Nzb3JpZ2luIOKAlCBibG9iIFVSTHMgZnJvbSBhIGZpbGU6Ly8gZG9jdW1lbnQgaW5oZXJpdAogICAgLy8gYSBudWxsIG9yaWdpbiwgc28gY3Jvc3NvcmlnaW4gZm9yY2VzIGEgQ09SUyBmZXRjaCB0aGF0IFNSSSB0aGVuIHJlamVjdHMuCiAgICAvLyBUaGUgbWFuaWZlc3QgYnl0ZXMgYXJlIG91cnM7IFNSSSBwcm90ZWN0cyBhZ2FpbnN0IENETiBjb21wcm9taXNlLCBub3QgdGhpcy4KICAgIHRlbXBsYXRlID0gdGVtcGxhdGUucmVwbGFjZSgvXHMraW50ZWdyaXR5PSJbXiJdKiIvZ2ksICcnKS5yZXBsYWNlKC9ccytjcm9zc29yaWdpbj0iW14iXSoiL2dpLCAnJyk7CgogICAgY29uc3QgcmVzb3VyY2VTY3JpcHQgPSAnPHNjcmlwdD53aW5kb3cuX19yZXNvdXJjZXMgPSAnICsKICAgICAgSlNPTi5zdHJpbmdpZnkocmVzb3VyY2VNYXApLnJlcGxhY2UoLzxcLy9nLCAnPFxcLycpICsKICAgICAgJzs8LycgKyAnc2NyaXB0Pic7CiAgICAvLyBJbmplY3QgYWZ0ZXIgPGhlYWQ+IHNvIHRoZSBET0NUWVBFIHN0YXlzIGZpcnN0OyBwcmVwZW5kaW5nIHRoZSBzY3JpcHQKICAgIC8vIHdvdWxkIHB1c2ggdGhlIHBhcnNlciBpbnRvIHF1aXJrcyBtb2RlLiBET01QYXJzZXIgYWx3YXlzIGVtaXRzIGEgPGhlYWQ+CiAgICAvLyAoc3ludGhlc2l6aW5nIG9uZSBpZiB0aGUgc291cmNlIEhUTUwgb21pdHRlZCBpdCkgYnV0IG1heSBjYXJyeQogICAgLy8gYXR0cmlidXRlcyB0aHJvdWdoLCBzbyBtYXRjaCB0aGUgZnVsbCBvcGVuaW5nIHRhZy4gc2xpY2UoKSByYXRoZXIgdGhhbgogICAgLy8gcmVwbGFjZSgpIGtlZXBzIHVzIGNsZWFyIG9mICQtcGF0dGVybiBzdWJzdGl0dXRpb24gaW4gcmVzb3VyY2VTY3JpcHQuCiAgICBjb25zdCBoZWFkT3BlbiA9IHRlbXBsYXRlLm1hdGNoKC88aGVhZFtePl0qPi9pKTsKICAgIGlmIChoZWFkT3BlbikgewogICAgICBjb25zdCBpID0gaGVhZE9wZW4uaW5kZXggKyBoZWFkT3BlblswXS5sZW5ndGg7CiAgICAgIHRlbXBsYXRlID0gdGVtcGxhdGUuc2xpY2UoMCwgaSkgKyByZXNvdXJjZVNjcmlwdCArIHRlbXBsYXRlLnNsaWNlKGkpOwogICAgfQoKICAgIC8vIFBhcnNlIHRoZSB0ZW1wbGF0ZSBhbmQgc3dhcCB0aGUgcm9vdCBlbGVtZW50LiBTY3JpcHRzIGluc2VydGVkIHZpYQogICAgLy8gRE9NUGFyc2VyL3JlcGxhY2VXaXRoIGFyZSBpbmVydCBwZXIgc3BlYyDigJQgcmUtY3JlYXRlIGVhY2ggd2l0aAogICAgLy8gY3JlYXRlRWxlbWVudCBzbyB0aGV5IGV4ZWN1dGUsIGF3YWl0aW5nIG9ubG9hZCBmb3Igc3JjIHNjcmlwdHMgdG8KICAgIC8vIHByZXNlcnZlIG9yZGVyaW5nIChSZWFjdCBiZWZvcmUgUmVhY3RET00gYmVmb3JlIEJhYmVsIGJlZm9yZSB0ZXh0L2JhYmVsKS4KICAgIGNvbnN0IGRvYyA9IG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcodGVtcGxhdGUsICd0ZXh0L2h0bWwnKTsKICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5yZXBsYWNlV2l0aChkb2MuZG9jdW1lbnRFbGVtZW50KTsKCiAgICAvLyBSZXNvbHZlIHBhZ2UtZnJhbWUgbWFya2VyczogbWludCB0aGlzIGRvY3VtZW50J3Mgb3duIGJsb2IgZm9yIGVhY2gKICAgIC8vIGZyYW1lZCBwYWdlIOKAlCBmcm9tIGxvY2FsIHRleHQgd2hlbiB0aGlzIGlzIHRoZSByb290LCBvdGhlcndpc2UgYnkKICAgIC8vIGFza2luZyB0aGUgZGlyZWN0IHBhcmVudCBvdmVyIHRoZSByZWxheSBwcm90b2NvbCBhYm92ZS4gQW4KICAgIC8vIHVuYW5zd2VyZWQgcmVxdWVzdCBsZWF2ZXMgdGhlIGZyYW1lIG9uIGFib3V0OmJsYW5rLCB0aGUgc2FtZQogICAgLy8gZGVncmFkZWQgc3RhdGUgYXMgYSByZWZ1c2VkIGVtYmVkLgogICAgewogICAgICBjb25zdCBNQVJLRVIgPSAvXmFib3V0OmJsYW5rIyhbMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXsxMn0pKCMuKik/JC87CiAgICAgIGNvbnN0IG5lZWRlZCA9IFtdOwogICAgICBmb3IgKGNvbnN0IGVsIG9mIEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaWZyYW1lJykpKSB7CiAgICAgICAgY29uc3QgbSA9IE1BUktFUi5leGVjKGVsLmdldEF0dHJpYnV0ZSgnc3JjJykgfHwgJycpOwogICAgICAgIGlmICghbSkgY29udGludWU7CiAgICAgICAgY29uc3QgdGV4dCA9IHBhZ2VUZXh0c1ttWzFdXTsKICAgICAgICBpZiAodHlwZW9mIHRleHQgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICBtb3VudFBhZ2UoZWwsIG1bMl0gfHwgJycsIHRleHQpOwogICAgICAgIH0gZWxzZSBpZiAod2luZG93LnBhcmVudCAhPT0gd2luZG93ICYmICFpc1BhZ2VSb290KSB7CiAgICAgICAgICBjb25zdCBoYWQgPSBwZW5kaW5nRnJhbWVzW21bMV1dOwogICAgICAgICAgKHBlbmRpbmdGcmFtZXNbbVsxXV0gPSBoYWQgfHwgW10pLnB1c2goeyBlbDogZWwsIGZyYWc6IG1bMl0gfHwgJycgfSk7CiAgICAgICAgICBpZiAoIWhhZCkgbmVlZGVkLnB1c2gobVsxXSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGZvciAoY29uc3QgdXVpZCBvZiBuZWVkZWQpIHsKICAgICAgICB3aW5kb3cucGFyZW50LnBvc3RNZXNzYWdlKHsgX19idW5kbGVyX25lZWQ6IHV1aWQgfSwgT1dOX1RBUkdFVCk7CiAgICAgIH0KICAgIH0KCiAgICBjb25zdCBkZWFkID0gQXJyYXkuZnJvbShkb2N1bWVudC5zY3JpcHRzKTsKICAgIGZvciAoY29uc3Qgb2xkIG9mIGRlYWQpIHsKICAgICAgY29uc3QgcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpOwogICAgICBmb3IgKGNvbnN0IGEgb2Ygb2xkLmF0dHJpYnV0ZXMpIHMuc2V0QXR0cmlidXRlKGEubmFtZSwgYS52YWx1ZSk7CiAgICAgIHMudGV4dENvbnRlbnQgPSBvbGQudGV4dENvbnRlbnQ7CiAgICAgIC8vIHRleHQvYmFiZWwgc2NyaXB0cyB3aXRoIGEgc3JjOiByZWFkIGFuZCBpbmxpbmUuIHRyYW5zZm9ybVNjcmlwdFRhZ3MKICAgICAgLy8gZG9lcyBYSFIgYWdhaW5zdCB0aGUgc3JjLCBidXQgYmxvYjpudWxsLyBmcm9tIGEgZmlsZTovLyBvcmlnaW4gaXMKICAgICAgLy8gc2lsZW50bHkgZHJvcHBlZC4gSW5saW5pbmcgbWFrZXMgaXQgYSBwbGFpbiBpbmxpbmUgYmFiZWwgc2NyaXB0LAogICAgICAvLyB3aGljaCB0cmFuc2Zvcm1TY3JpcHRUYWdzIGhhbmRsZXMgdW5jb25kaXRpb25hbGx5LgogICAgICBpZiAoKHMudHlwZSA9PT0gJ3RleHQvYmFiZWwnIHx8IHMudHlwZSA9PT0gJ3RleHQvanN4JykgJiYgcy5zcmMpIHsKICAgICAgICBjb25zdCBwcmUgPSByZXNvdXJjZUJsb2JzW3Muc3JjLnNwbGl0KCcjJylbMF1dOwogICAgICAgIHMudGV4dENvbnRlbnQgPSBwcmUgPyBhd2FpdCBwcmUudGV4dCgpIDogYXdhaXQgKGF3YWl0IGZldGNoKHMuc3JjKSkudGV4dCgpOwogICAgICAgIHMucmVtb3ZlQXR0cmlidXRlKCdzcmMnKTsKICAgICAgfQogICAgICBjb25zdCBwID0gcy5zcmMgPyBuZXcgUHJvbWlzZShmdW5jdGlvbihyKSB7IHMub25sb2FkID0gcy5vbmVycm9yID0gcjsgfSkgOiBudWxsOwogICAgICBvbGQucmVwbGFjZVdpdGgocyk7CiAgICAgIGlmIChwKSBhd2FpdCBwOwogICAgfQogICAgLy8gQmFiZWwgc3RhbmRhbG9uZSBhdXRvLXRyYW5zZm9ybXMgdHlwZT10ZXh0L2JhYmVsIG9uIERPTUNvbnRlbnRMb2FkZWQsCiAgICAvLyB3aGljaCBmaXJlZCBiZWZvcmUgd2Ugc3dhcHBlZCB0aGUgZG9jdW1lbnQuIFRyaWdnZXIgbWFudWFsbHkgaWYgcHJlc2VudC4KICAgIGlmICh3aW5kb3cuQmFiZWwgJiYgdHlwZW9mIHdpbmRvdy5CYWJlbC50cmFuc2Zvcm1TY3JpcHRUYWdzID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHdpbmRvdy5CYWJlbC50cmFuc2Zvcm1TY3JpcHRUYWdzKCk7CiAgICB9CiAgfSBjYXRjaCAoZXJyKSB7CiAgICBzZXRTdGF0dXMoJ0Vycm9yIHVucGFja2luZzogJyArIGVyci5tZXNzYWdlKTsKICAgIGNvbnNvbGUuZXJyb3IoJ0J1bmRsZSB1bnBhY2sgZXJyb3I6JywgZXJyKTsKICB9Cn0pOwoKICA8L3NjcmlwdD4KCiAgPHNjcmlwdCB0eXBlPSJfX2J1bmRsZXIvbWFuaWZlc3QiPgp7Ijk1ZDdjNzBkLTBkYTMtNGVlMS1hZjY1LTE4ZjczYzc0ZTRlYiI6eyJtaW1lIjoidGV4dC9qYXZhc2NyaXB0IiwiY29tcHJlc3NlZCI6dHJ1ZSwiZGF0YSI6Ikg0c0lBQUFBQUFBQUU3VTdhM0liTjVQL2ZZcU9VcnNjV3VTUWtpWEhwcUxrc3g1K3lwWWoyWTZUZkZrSE05TWtZYzBBWXdBamluRmNsVHZzbnVHN3d2N2ZvK1FrV3cxZ25xUnNKNXROVlN3U2FEUzZHMEMvT1JyQlB4STlaTWtjRllvWWgzd21wRUlZRGtGbW1LSXhDTm93WlZDQmp0bDBLdE1FQXNVV2dDbG1LSXdlemZGcWxGOUJ0SVFFTlorSi9vM1JDQTVsempGWndSSENHUTVWSVFRWE00aGx2bnpqSjk3RU1zdWxRR0Znd2MwY3pKeHJ1T0FpQVhtSmFxRzRRZTBHcHp6RkVnWWhaUWExZ1V0VW1rc0JRYzVtQ0xFVWhqQnhEWVZnMHluR0JwTitlR04wRXc2T0h6eDZCaS9QN3owNGhwdWpHNk9iTjIvQVRmamF6QlhpTUJscXcyYjREZnp4KzMvQnJTT1EwVnVNRFZ4eVhLQ0NUY0NyWERwSnpERk5JYkNyd3JlNkg5NEFpK2ZGM0hJNlE1QUxvUzJCaTdsTUVYU01BaWZ3UFVZUFRrQ2hTRkNoR29EQXdpaVdnalpGd2lXa2ZEWTNYTXdJbGVXUWdaWlRBek1sQzVHQW5yTkVMZ1lnVmNTTlpWTEpWRU9RS0RZREk5MzRBQlp6eEpTKy95cGxOaUJjaXZBT1M3Q2NpZjRBR01Rc1E4V0FGVVlPcDRwbG1OQXMwZXo0N21tSWFGODlBSVdhLzRxRWFzNUVrbkl4R3dBVENUQkk1RUtra3RGU21VWk1nWmt6NHdYbEJCQVhTdEZoZUdFeVRXaE9EeDdESmp4OWNRSlN3WU9UQXdnaUxwaGF3aXg5Y2I4Znd2MkQxeEF6SWFTQkNFdTVKOENGUlJrcHVkQ285Z2dUTGVadUp5NE1xbmpPeEF4aEtsVkdoRnlpV2tJbUUxU0NUcFNvQko1WjZzcERLMDhSaUEvQ3BHUXhjN2VMYmxOUCt3V1FzVHlFUnlKT2l3VGRYVHgrZmUvd0JlUmNDRXdJVmNaeW92SHJPYkxrbXdGRU9LVzN4SVFsb1VnUlZDRzB2VjMrd21vclJpSjhwcmhad3B6cE9Wb0phY09XWU9RTXpSd1ZCSnBsYU5FVFdSdlYzZHdBZmNIVEZESW1Fbm9KL1lsbkN1QnJIU3VlR3pETEhQYzNIQXNaeXplK2NkUHYzUjhBUDZVM0p2VVl3SWFWeXNZRU51Ykc1SG95R2hVaXY1aUZzY3hHZHVvZjQzRHJ6azQ0SGtVRlR4TTNGam91dzdkNlk5QkZOV0pKSW9VZWxkZDJkRXEzOWRCL295V2ZzUmRlc1N4UFVZL2U2dXdqbUs3ZHZIekFlblI2OFBqWWYva3JlMStMNkRPMmZuRHk0djdmczNjWFU3bjNoMEY5dU9YVjZoenZYenZWQ1d6b09idDFaMmQ0NS83aGoxdjQ2dlEyTnp1YmVZVHhOanN5NG9WYXZQMys5WThuajg4T041L2VlM0Q0NlBuUlRQOGdYcXAwZER5K3QvMURldjhPbDArZlBCbzliZ25xenhBVFM5VWhKVmxzUy9rY0YrejRrYm8zUzIvTCswY0hXWGJ3L2VIeFhmbjkzWk9yc3dmeGRQSGplSDV5ZVp5clgrWDJlSHZ4T3YzcTh2Q0hoMmZwdVRoOThhZEkrY3diV0ZPM28zN2x6NjVPRDM1ODh0M3R1M3h6c1RtOWMvZko0OTNkRjRjL3ZDc1c4ZnhWZExEOGJwR3hVM3gwK2pvNWZibjkvT1JJM0xvNG5iNSt1SGowK1BEdVg2ZnVZNWZkRXllaWhaRS9Iajk3ZkhUcjFidk5lNGRQeG9mRmcrK1M1MCtMbys4ZlhyRHNjUHZKNDZPdnhzZXZkc1YwZHZ2dGQyK25lZjdrRk5uNHF4OGVQOXQ4ZHV2dklHN05jL0RVdlpMVGk4djh3ZTJIeDJmeis0Yy9SUHJsNlVOODl2cmc4TjJqbzIweGZYZngzVHZ4NnRmanJiZnhTRDZQZjkxODkzanIxcjJqNVBYRDhaMzU4V2I4WGYwZTNBZi81K3VSMDR6ZmVGWDVVck1aVGtxbGFaWXBmdE55QnlaQ21tQ1M0SlFMVFBydkw3bm1FVSs1V1U3bVBFbFFmUGg2NUZaNUZLM0ZJRmlHK3h0S3hoZG9Ocjc1ZXRUMk5OcXFXcXQ0ZjZNRlFBTDVwa253aW1KM2o3UFU2a0J1Z1RiZUNkbUhSTVlGZVduaHV3TFY4aHhUakkxVVFhKzFTYSsvMTE3OUhsNDhQRHMraGcrd0QyekJ1TWNYS21USnNnTkx0aldGZlJDNGNLdkNCMG9XZVZEakhJM2dqOS8vWmQrd3RWNXVoU3dNeUtrVlR3SVprdGx6UG84ZllRWVZaNm0xbGcxTWhJQWdORVFZeXd5ZHZ3SWpLRFJtSmdVVVJuSFVwYWRRZVE2bkI0Ly8rUDFmSlNMSGprWnphcTFvWUVrcUtlN2VqM3ZHS0I0VkJyVy9KTFMvdi9Sa3l0MGV6aStObUVZN0hTUTRaVVZxWU1QaTN1aTdwUkdMTDd3M1Iwc1B6ODhobHFsVUVPR2NuRjJpMmZxS05RSUdDNll5eUZtT0Nvd1U2RkdSMzZha1lRWXRxc1VjQmVRS05RcEQzcDFPNVFKTW9ZUmhVWXBRQ01OVGk3N1FxSnlyeEdLalBZOVA3Wmx3QVFwWk9seElsZEtoMFBzY1FJd0VUTTY4azZsVWZNYkZBSmJESW04SXdIb3RYTXhSY1ZQejBTTVhuQnZuNTBqRlVSaG11QlJodzFlZThqVFZRRUJ5SVNDU1YvWWd5T01FN3NNQnFSTG5INUxFS3RGc2pjZVhpeEg5TzdldUdzeFJ5Y29aUC9KUUdrMlJUNjd6dFNHWVk4WjFUdkVQYk1JRkxtSFRVa1Erc3FWampRZE96RHc3QlJTWFhFbEJEOHo2WmlRTUxXSE9aM09TSGtzRmFrMCtIZUVSMHN4cFB5TkI0VFMxdnJCSWZEQ2dRU0JUd3lobDhVVUloeXh2ckdkMmIwSXhEbS85OGZ0L2pzTWR1ekptU2kyQk9VaElwYndvZzRiSU92eW83SFYwRjh6Sk83WlJHYUd5dDVWcldNcEM2UW13NUcyaDNiRlp3ZWhCSTlwbzNsb3U0RTBrcFFuc0xiU1hybzRZUUNBbW1xSUNQcDJpOWZxSkxEb1FDclhnK05sUkhYcmRDSUkrN0g5RFhrbWx0SllwS1FJMHNBKy8zS0QzTlpsTDBrYzMzR3ZMcGVaMGVTYWdNR1dHWCtLZW4wbTR6bE8ybkVDVXl2aWlIRjN3eE13bmRFMytyUnlhSTdGbnh5N241V0ROM3dRdW1RcUdUaThPbzlrQXZweU9FZkYydjRTbGNIU2F5c1VFblBaMzR4L3N2ekVUbDB6RCt5NDVwT3hTVGdHZ2tBTDNQSFJZaGt5cjdMRkl5N1F3Rlh2S0UzMDd2NnBvbHNiSXJEMVdiVHROc1JxY3NYd0NkMnFncVJSbU9HVVpUNWNUR0xJOFQzR29sOXBnTm9DRGxJdUxweXcrdDkvdlMxSWxHK2M0a3dndkgyME00RXhHMHNnQmFDYjBVS1BpMHliN0ZVTlJZWXdVRlY4c3o1RXBKdUpTQUJVTEtrRTFnYTM4Q3JSTWVRSnFGckZnZXp3QStuL3I3Z0RJZCtpMzRZZUtKYnpRTFo2YUIraHc3TzRPb1A1bkhON2RydERZOXpDQkw3ZlkxdDJ0M2JWaThXcXNOVWY2YUFKYjIrRnVSNVlMZjZWMngrTnluQTU3V0YyMWNqUm5TY0xGYkFKMzh5dlkycTdSeElYU1JKTFhheCtSNldSTzl3L2V0emorY2pxZHJsd3FEODlpZWlid0hveGlRbE5VUEhFZktYSHlRN0NWWC9XdldmcFR3aldaanVSbmVBOHlaekY1UERBT2QvY2dsOVorRFBHU0VrQ2RXeTJrd2MrNDBpbE9QK05HWit4cTZGL3g3Zm9SazlnbnNETWVXeW1PdHNMZHYrc2lYM2M3UG4zQjd1ejJWODU1aDg1NTNPU3dkWUViZkpKUkhtcnJualhmaUJjcHFzOVJFbHhvTkJNWXIyaUQ1cHRqS1orSklUZVk2WW0zN09VVVdRQStYUTU5OXF3N1hYRzF2ZE4rQVBibXc5YU9QWW5iZi85SjNHSGIwKzJLSzROWFptaTU2Qks0bUhPRFE1MHowak81d2lHOXdscU92K3pkdUFFd0xVUk00cXNTVjBHVXltaGc3U0U1Ym4wdmFHZVJDa1d1N2N1emt6Qld5QXc2ZC9IbDJZbGQ1US9jZ2JLbXQrMmdqMTJHTk9peG5nZGw0VnpoRlBZSmNUbFNaZEQyS3lMY1ZJVXRrc2t5SkNVcWtzTTVUNU9BVmVqaWxNY1hRZlZWWVNZdnNmeXUwYnpnR2NyQ2VGTkxqQ2k4bEJjTlJncEZuczdPZUR5MnF6NlFrRVkzYjhJTHluQ1NhYmNXbUluU3pXWEdZSlpicjhxazZOeFlZM1BCUmkxQmluVHBYQTFhUmxUY0JBZ2V2bmg2OHNvbVVmdVUrT0pUamk1anAyV2hZdlIrMEpEQ0N6dXV5U2ZFTk5Ha0VWRm9mb25wMGlQek9iVllra2NyWm51Vlg0VXArVHBLYXUyUjI1eW1TMkV5dFF6aFFjRlVnZ2xvNlZIVlpNZE1nS0JjSVVRSzJZVmRYcDFMenN3OEpJK2xjWHVFcEtmaXd0YkE1Um9ISUMvSzIwTTR5d2U3NENLUml6Qm41QStGdWRUbUtXb0tPUU1QQUtTZGx6bE9vRmVteXljTy8vQldNblJpN3cxOFJuTUM5VzRUa0Jld3Y3OFBSaFZva3o3K3Y5N05udi9zYjhJSGlKbUo1eERRL2Y1UUhuT2NNcTNoQllXQ1IrZldFOGNyZ3lMUlFBZm1iMi96UGFqQ1JvLzlpamRkNUtpQ2htV2xsNkNrSkFlT0VxUWhNNGJGODNQclNnYnZiZWhIYk9Zb2V2Q2hzODY2Zng5NVJYYStWeTJ5WDBOU0I0YyszYi9mOENBcnowbEswM283RnFSQ1lvbDhRL3IxK24wVGZ0bGJYUkJhNlQyaks3WVBQVlNxZCsyVzFab093OVpTZnVhK0JOdmVra1o2cmVtMkxIcEh6YklBL005L2c0NlZUS3ZLQUkyc0ZBYXVaNEoyNkVpaDlCZitsT2o4b2pZdmZyRFhCcFhSMndNalBvTGVPU3JkSGR5eWtKNFU0ZlpBNjJFNkVpdWZmRldlV0wrTUpja3h1VDRuWEJzVXFJS2UxY085QVRnOTY0QlZJYnlDNk1ub2JhL2ZJWE9XUm4rRk83ZnM0OXlWTU5kdzkrRGtZUDJDUDgzWExJMVcrQ29QZVBVRk9PbDlOcmdqcXYrSlorWFhkN0JxTkFkV012cFlXQ2MybUxKVTF4ZVlMTndaYXBsZWxtbW5PdWNsUll5TlJBelhrSklMVFlhdWs4UXFGZTVOY3I3Z2w1VlUyUytVRFNqdGsyS3hOMHdwanhUbE11Z3d2R0dwS0xmcmZEcnR1WklaMXhnRXlsRktkVGd5MjFYWTNPVFlMdlFzd1Q3NEpYdnJvV3l3dnUvUmxUQ2xQcmEyd2Vvb1lRdW5oeXhOeWY5dDZIMCtCUzkreWdWZzBtK1FNeHBSamRjcGZreUFUU2tSd2NDNkppeTFZbFNvaTR4S284eVFsMXJ0Qk5ySVBNY2tySkRWRzVWRjArWldOVmR1ampKNjl3VFBiSWJwUk1yY3IwMmx6UHQ3cThzay9QdS9WNTlER1dsVWwyalhOS0EvVko4VVVqNnRFbGZyd2prNWdMUEZleXRUUVQrMEZqZ0l5QXlzT3o4eUtjNmtlYitkbml6RjhiM3VHUkprNjJrM0dPdFZ4Y3dwNDZtcjZOcHI5ay9SZzgwbTRPRWM0d3RYcmJXVlRsdkR2TDVvQ0ZNbE01OC9KRStoZzQyc2c2YW5VbFUvMXhRL0hlN3duNkpMekxsUlhNeElOSFFneEYvbVhDVDR0dlZ0QWswanV1Wk9CODM1em4xbWVpbmlNbmxWaWQ5WjRtaFdPaXd6TkZXK04ralZZVit0aHVsS1JyTytBM2NucHRFOFZ6SkhaWlpCcjA0ZTlRWVF6VG8yL3llclpRWlY5ZjZwVEg2dXN1eit3WWNzVFlPZjZqZVFPV1ZyajdiWEg2eWYrR1I5dFY3NWMwZFpPc1czN3hSZ3BTRkhMcHVzTHZGSXNRVVhzNE9Da25wd2daaDdQY2EwOFY0Mm5ZSE5NOXZuWHFPd1hSMFVzRktpMWNnalp0akxzeE1ZUWFMWTRsSEdadGkzR29GVHQ0SFZCeW02dm9FYWg0NFZvdEJ6YVd6NVhrUE1jbE9vbG80VzJpQkxxS0RBSUVxWnVQQzV1TEFsL0ZKUHRNb1Z0aWZqek04RTliTmt3bkNXY3FZbjlrM1hZbWRwUG1mZHdiV3lhZ1BWL201VFh6M25WNWlla2NZS25sS2drWEVSK0pBaHdVc2VZdzBBdi8wR1d3UFk3cTlCWkQzc3B5d1AwZG03amlaYUErZzlDQ2VFNTRmM3orWFVuSmV6N1F2U2tGdjVzUVhna0o2UmdhWWtoRElIOXUwSDFhNkp6THhiTTZpVldIL3ZSdHYvdDBmWlBKcHpHZ202cHQyRDJiOGRGTDZscFluak9TcWRvODJDSGRyWllHZDNRR0ljaCtPdEFhVXU2aGRxNThNeXcwS25FOXdhd0hhNFBZQ2REaFhWVHU1RGw0NnlOOGRSMG5qc1lldFpCbTcxQU5aSXFxazQzQnQyUjN2RXNweWVVL3VBSzZERVRkOW5GS3JCUHJGNXAwTjZUVno1c1NKL05JSm5yVHJKeE5VLzlNVnk1Q3NBQzZibnRzQmtEMzBZTTIxZk54Vk9iT2xnVUtQeUxVSThzd1VWWjBKOG9VdEwwRHlkeTRMQ1hlMkQ3NWtFVndFcFF6dzZZdkpLZy9vOEgxYlZtaFBhTFJoZlRlMS9BeGhmSlhlUzdYaG5BRnZodU4vUnUwUmU4MW9jY1lVMmxHZHBGODkyV09lS0wzRFp2Zzg3QS9ocUFMc3RBQktCZXptZFE2RkpKNll3WS9rNS85V2FpbUI3dkhPSFV0dzdkL3BySUNQTzZHaUc0M0E4SG0rM2o4NXhjWUhMdlJVSlhlQ3l3N0tWK2FkNTNzSGI5QmhxbG1oZG0rbmg3Z0J1RFdCWVA0SjZYMXNxNjF4L2YxT2FlejlGUGE4VEhvM25tVEtCRDFEYVBFeXdQYmE1LzNIRHlEVzBnVmRPcmpBY3RKTFNXM2ZnUTcrZDh3QlBSbWlMcE1US0ZZblZLdG5uajJBRTIxMDRqSkZmNHRxVDlCRkp5WmY3c0NvTU4xNkx3eTFyVkdxOWx6Rm51dUZsMVBPOTFVZFBrMmV0eFExOEg0RSt6OUZhZ2Exd2V4VnFKYzZ6WFpoVm5GY2J3ZlZrMkZpcTZXWjE3aDNGRm1zd2FRT0xrb2s0cFZMdzk1VGF0Mlp0cndNNGJ3TSt0TFdVRG1UVGpOTGpDaFlEbURmY1E2L1BtZFgvc0E4TEdNRjhaYnJJcVhQdXVaSnYzZU40eW96aVY3WFYrVkMvQzlPMVJVcjZTMzVtR3lSUFhRU2hnaWszSFVnS1FkWkx4Y25YVVJIMDEzRG5QZ1QybGcwODFhdlVqVVp3aEQ3bVdzeXB1bHVGQWd1bVlZb21wakQwV3ppbnhrS2VwQzZpYlhsYUt5RmZHYW5aNitHZFBtTEVGdk05c3lCRmpZRXlHRVJFcWNHcitJM3J3eEo1ZnpWMnZUYjQrbE9SM1lmMnMydEd4RUVWM3JlRGdtYjB1U2JPSFkzZzNNamNrMEZtcnVhY3ZqbEJKMTd1ZTZzQ2JFcUdKRWt0dFpSTkRpaEZYcmxWM0doTXB4UStYV0J1N0xrd29FeStUVTI0VnBZYVU1a3ZncXh3U1VSUVdDY21uRExxZCtYZmlKOC9GVE9Md21yMEZRU3lYeDlYTGJlZ0xWQktySnpQNVFJQ0s2bUY2RGY2QTZqN08wOXRIb1RDd2x6aEpaZUY5ck1EY0E2T2RsdmZCTzlpYUdvODhZMjhTTDZIUW0yb1g2UnNTUEZxT1NkVDRub3piRkJTNDdGdHlNNWhNOUkybXJqRzVpcjVVbmNDT1ZLNjhXRVpJVFhpcGFhQXZyQWpmZHM2dkxENjRGaXBsVGFyaVQ4clN2RFlJKzZtaTJES2xUYTlOYkl2cVdwNHdHV3Rwd1d3a3ExMGlzOTlLQ2Y5V1JqRnFBa1pnMEIybEJMdEswT3V5V2EzMHkzeWVsL0hUWC9NaHRZcGsyN21QNUpYTFdmaFFGN2RDdnAwTSs4cm1iVlBwaVgzU0Y2RlhCOW51VmtHL1pVa2xHOW84V0pvWHhaNldOU0Nsa243a0czemtlMXJDanU2eVRzSGxUOUVEaGh0bTNFUkxydFd5N2NST1lnWm1nTmF5OFhzM0k0M3ZGZy8wTzkzTVNSY3R6TTZnY01adXFJeGpNQTZNSWFKSUdoR0l1RlVYbElmbC9OdStqQ0NXN2ZIL1Q3Y2hLM3cxdTdxTHUwWStKVnRDN3dWMkxDSTZ0bGI0Zlp1UHhSVWFrckpzcTRrWFRxeFVvUGdrSDdXVVZMdEtyVDk1alQ1U1FsWFlWYWtodWZwOGp4bUtWTUJNZDYvYmh0cWpvSjl4MTNHcml3d2pLaUp4OFZ4MTYyYnV1b0VRZDhrNkd2QVB1VUNkQ09uMERBMVE3T08wMnVYckJyNDhzb3dLZ0swVC9rbTNPb2lha1FJbm1ycW9DQ1BsakI4R3RxV2V1eEdud050ckxmeWViQ3ViK1B6S2Zta3c3VWE3dHRMczFiSHJTYjZTZVcwYmRJTURid3BPek1iMXQzbGM3Mk9iU2YrQ0xMWEozK3paelA5dlg2b25Pa0tSai85eHo4WDRmRG56ZEZzQUwwM3ZmWmVhd2lTb3Q2eVZVWXFHMnhnSDc2UW9zMlhyOGlzQTJsWTJ1UEtLbHF6VnpiTlZuMTRoZUR2Q3Rjd1MzVmprQ1BmSmt1dEViNjFGcHlOdE5FaUYyU1BLSTgzOVE2TUh2anF2QldWemY4Nm5OVmVLZGVtTXFSdmFLdm41Q3l1NUZnelppaXUvZW5uVHRVWFVYaGRkSTROQnp0Rll4bDdSRG1NMWlBenJiR21yZnVFVWZ1aXRtcnRYSDQxN1ZwQTNGOUt3T2RNbVRjOTJIU2sxT0NPc3MzOTFjQWx0UW9jN2luRmxpSFg5bThndzFKY2ZmZ1c2bTh3Z1ovcWJ6L1h1T2l3QWk4M3ltb1MxcllwdGdSbmRFTkpzQ0YzUDB2U1FkYnYyNmlDaTdadGR2QmhzOGVsWXFaaU4yT2VXMlllN2JWaFNPcHRmcHVsRWZDdWNFREhTZUZ0NExlNmRpLy9ZWk9lMEYvYjBXNUZpc0Z2MVlTek1za0xQUSt5TmFXY1ppYlczbXNDWDNsY3B3STdUUy9rZXZwK2N2OUxPZHNjTTVjTG03N2laVmRNbVhhK0NYQ0cxaW5VbFBCaXRpaERtV3Y2Y1pjRyswdUNGQ3ZQcEVDWE90VDBpMEc4WXJGSmwvYjNjdEJzZlhIdE5VSU92VitEVEtYTGtoR3VyWlBKUk5XbkV4RHFzbExQYTJTVlpxazd3MTFqdnYwVlhOKy9ldmN6UGwvQ3JGNjVMNlhVaFdEWGs5S3VEMzdSZGwzYkQ2N1pJQVBlRS9aWWJFZUxyWmpEdDJXeTJPNXlHcjBOK2pCcGpUMUlvNVlUdGJZdnAyRVJtcTB3cWxWTFhMdXlYVFFHNytDalVtMWIxYTR3TmFuOWJJRlVQNmFvaWtGcnF6dlgvYWFuMS9Hb3ZiSjFPelowY3NmdnB2YndFcW8wa0cwUUdiMXR1S085ektRcGo2ajY1eFp2UWkvTVRHb0xlbGFIWjVUaXJra0wrdFQ0cEs4SlU2dzZONVNrN0gwSngrVlBOYUlsdE9LbWY5YnREVjIxU0d6MlY1Sk1zVlV2N25jVnYvMEc3MEZSaXZET0FHYitiMlQvMXJtVHVuT0pmdmk1YjZ1ZmhEMjBBN1lKMzE1S1VXUVJLcnFYelNuWEZOdEI1WE9UVFdUVlVCZFZPVEZwNmpxU3l5WUI0b0krV2gxWnFjeUdTRXJJaHZMclBVa3NmQnlxME1qNy9BcVRZS2RQNi96d2JQMXcxQmxlc3d2MG5tZ1loOXZqOGJqOVp5M3NNMjB4VzdmZGhsRkJzQVZESjJZS1RTalRlKzFHamdjdm14WEtHa3RLclY1MWROSTlQRWhsRlB3a283Yy9EK3IyT3FxYWovS1VjZHQ5TnFpdnNPM1AyYnNlVDJiU3o4S1RtYlRqRDdaMGd0VlcvNDg2b2ZOVHVtN3IwUDlGRDBURnRLS2lmT2ZON2NxSGZvLzRiYjMyUWVOOXVoOTVYMWNXclFSZksrWHFCS0ppMmp3QmE2cEdzOVJNaHc2blBZaDZuL0pBcUVISmoxYm5VblkvRnRwVXhUWWR1dC8zZFg4Wk4yaTJSL2IzYm56b2sreitGLzdYS1dnMVFRQUEifX0KICA8L3NjcmlwdD4KCiAgPHNjcmlwdCB0eXBlPSJfX2J1bmRsZXIvZXh0X3Jlc291cmNlcyI+CltdCiAgPC9zY3JpcHQ+CgogIDxzY3JpcHQgdHlwZT0iX19idW5kbGVyL3BhZ2Vfb3JkZXIiPgpbXQogIDwvc2NyaXB0PgoKICA8c2NyaXB0IHR5cGU9Il9fYnVuZGxlci90ZW1wbGF0ZSI+CiI8IURPQ1RZUEUgaHRtbD5cbjxodG1sIGxhbmc9XCJkZVwiPjxoZWFkPlxuPG1ldGEgY2hhcnNldD1cInV0Zi04XCI+XG48bWV0YSBuYW1lPVwidmlld3BvcnRcIiBjb250ZW50PVwid2lkdGg9ZGV2aWNlLXdpZHRoLGluaXRpYWwtc2NhbGU9MSxtYXhpbXVtLXNjYWxlPTEsdmlld3BvcnQtZml0PWNvdmVyXCI+XG48dGl0bGU+V29obnVuZyDigJMgM0QgTWluaWF0dXIgKEhhbmR5KTxcdTAwMkZ0aXRsZT5cbjxzY3JpcHQgdHlwZT1cImltcG9ydG1hcFwiPlxue1xuICBcImltcG9ydHNcIjoge1xuICAgIFwidGhyZWVcIjogXCJodHRwczovL3VucGtnLmNvbS90aHJlZUAwLjE4NC4wL2J1aWxkL3RocmVlLm1vZHVsZS5qc1wiLFxuICAgIFwidGhyZWUvYWRkb25zL2NvbnRyb2xzL09yYml0Q29udHJvbHMuanNcIjogXCJodHRwczovL3VucGtnLmNvbS90aHJlZUAwLjE4NC4wL2V4YW1wbGVzL2pzbS9jb250cm9scy9PcmJpdENvbnRyb2xzLmpzXCIsXG4gICAgXCJ0aHJlZS9hZGRvbnMvZXhwb3J0ZXJzL09CSkV4cG9ydGVyLmpzXCI6IFwiaHR0cHM6Ly91bnBrZy5jb20vdGhyZWVAMC4xODQuMC9leGFtcGxlcy9qc20vZXhwb3J0ZXJzL09CSkV4cG9ydGVyLmpzXCIsXG4gICAgXCJ0aHJlZS9hZGRvbnMvZXhwb3J0ZXJzL0dMVEZFeHBvcnRlci5qc1wiOiBcImh0dHBzOi8vdW5wa2cuY29tL3RocmVlQDAuMTg0LjAvZXhhbXBsZXMvanNtL2V4cG9ydGVycy9HTFRGRXhwb3J0ZXIuanNcIixcbiAgICBcInRocmVlL2V4YW1wbGVzL2pzbS9cIjogXCJodHRwczovL3VucGtnLmNvbS90aHJlZUAwLjE4NC4wL2V4YW1wbGVzL2pzbS9cIixcbiAgICBcInRocmVlL2FkZG9ucy9cIjogXCJodHRwczovL3VucGtnLmNvbS90aHJlZUAwLjE4NC4wL2V4YW1wbGVzL2pzbS9cIixcbiAgICBcInRocmVlLW1lc2gtYnZoXCI6IFwiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS90aHJlZS1tZXNoLWJ2aEAwLjkuNS9idWlsZC9pbmRleC5tb2R1bGUuanNcIixcbiAgICBcInRocmVlLWdwdS1wYXRodHJhY2VyXCI6IFwiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS90aHJlZS1ncHUtcGF0aHRyYWNlckAwLjAuMjQvYnVpbGQvaW5kZXgubW9kdWxlLmpzXCIsXG4gICAgXCJuOGFvXCI6IFwiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9uOGFvQDEvZGlzdC9OOEFPLmpzXCIsXG4gICAgXCJwb3N0cHJvY2Vzc2luZ1wiOiBcImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vcG9zdHByb2Nlc3NpbmdANi9idWlsZC9pbmRleC5qc1wiXG4gIH0sXG4gIFwiaW50ZWdyaXR5XCI6IHtcbiAgICBcImh0dHBzOi8vdW5wa2cuY29tL3RocmVlQDAuMTg0LjAvYnVpbGQvdGhyZWUubW9kdWxlLmpzXCI6IFwic2hhMzg0LThGQ1oxZVZPNml0NCtwYmVjMmFEdG5UcndqV1haTEpSQytNQUdDSVBEZ3NZblVybC9FMEEyWWxGOGlvTUtJL0pcIixcbiAgICBcImh0dHBzOi8vdW5wa2cuY29tL3RocmVlQDAuMTg0LjAvYnVpbGQvdGhyZWUuY29yZS5qc1wiOiBcInNoYTM4NC1kdzJvb1Bld2FFSXJBZ2w2b0ZEQm1tQldDRTlvVzlMeFJHY2Z3WjBoTHZFcHJ6bzIwMndYbDd2Q1lIUmxTbk9UXCIsXG4gICAgXCJodHRwczovL3VucGtnLmNvbS90aHJlZUAwLjE4NC4wL2V4YW1wbGVzL2pzbS9jb250cm9scy9PcmJpdENvbnRyb2xzLmpzXCI6IFwic2hhMzg0LTRyemlOeE9CWktRNjlpK3crZjg5S0o1NVRDWXF1d2NoVmJCeVF3bWFPZUlPWGRPVTJQTERuM2tPZlhId0lKQzlcIixcbiAgICBcImh0dHBzOi8vdW5wa2cuY29tL3RocmVlQDAuMTg0LjAvZXhhbXBsZXMvanNtL2V4cG9ydGVycy9PQkpFeHBvcnRlci5qc1wiOiBcInNoYTM4NC1uYnd0b1pFTkpEM1ZxK0FDSzBDdUdRZFBNdURXSGthbUMyS0pENzBFVjVuZmc2alFqZnBwS09lYTA3WUpOK04zXCIsXG4gICAgXCJodHRwczovL3VucGtnLmNvbS90aHJlZUAwLjE4NC4wL2V4YW1wbGVzL2pzbS9leHBvcnRlcnMvR0xURkV4cG9ydGVyLmpzXCI6IFwic2hhMzg0LVZvZmt2cEc2SEVSaEZDWWJzVU9IZU5YQkNxSUQybmZxa1FxblZ6RTFqYy9vUGN6K3FKMTNBRGRYSDA4aEUrY1FcIlxuICB9XG59XG48XHUwMDJGc2NyaXB0PlxuPHN0eWxlPlxuICBodG1sLGJvZHl7bWFyZ2luOjA7aGVpZ2h0OjEwMCU7YmFja2dyb3VuZDojZWZlY2U2O2ZvbnQtZmFtaWx5OkhlbHZldGljYSxBcmlhbCxzYW5zLXNlcmlmfVxuICB0aHJlZS1kLXN0YWdlOm5vdCg6ZGVmaW5lZCl7dmlzaWJpbGl0eTpoaWRkZW59XG4gICNyb29tc3twb3NpdGlvbjpmaXhlZDtsZWZ0OjUwJTtib3R0b206MjJweDt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtNTAlKTtkaXNwbGF5OmZsZXg7Z2FwOjZweDtwYWRkaW5nOjZweDtiYWNrZ3JvdW5kOnJnYmEoMjUwLDI0OCwyNDQsLjgyKTtiYWNrZHJvcC1maWx0ZXI6Ymx1cigxMHB4KTstd2Via2l0LWJhY2tkcm9wLWZpbHRlcjpibHVyKDEwcHgpO2JvcmRlci1yYWRpdXM6OTk5cHg7Ym94LXNoYWRvdzowIDZweCAyNHB4IHJnYmEoMzAsMjgsMjQsLjE0KX1cbiAgI3Jvb21zIGJ1dHRvbnthcHBlYXJhbmNlOm5vbmU7Ym9yZGVyOjA7YmFja2dyb3VuZDp0cmFuc3BhcmVudDtjb2xvcjojMmYyZDJhO2ZvbnQ6NTAwIDE0cHgvMSBIZWx2ZXRpY2EsQXJpYWwsc2Fucy1zZXJpZjtwYWRkaW5nOjExcHggMThweDtib3JkZXItcmFkaXVzOjk5OXB4O2N1cnNvcjpwb2ludGVyO3RyYW5zaXRpb246YmFja2dyb3VuZCAuMnMsY29sb3IgLjJzfVxuICAjcm9vbXMgYnV0dG9uOmhvdmVye2JhY2tncm91bmQ6cmdiYSg0Nyw0NSw0MiwuMDgpfVxuICAjcm9vbXMgYnV0dG9uLm9ue2JhY2tncm91bmQ6IzJmMmQyYTtjb2xvcjojZjdmNWYwfVxuICAjcG92e3Bvc2l0aW9uOmZpeGVkO2xlZnQ6NTAlO3RvcDoxOHB4O3RyYW5zZm9ybTp0cmFuc2xhdGUoLTUwJSwtOHB4KTtvcGFjaXR5OjA7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHkgLjNzLHRyYW5zZm9ybSAuM3M7ZGlzcGxheTpmbGV4O2dhcDo0cHg7cGFkZGluZzo0cHg7YmFja2dyb3VuZDpyZ2JhKDI1MCwyNDgsMjQ0LC44Mik7YmFja2Ryb3AtZmlsdGVyOmJsdXIoMTBweCk7LXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6Ymx1cigxMHB4KTtib3JkZXItcmFkaXVzOjk5OXB4O2JveC1zaGFkb3c6MCAxcHggMnB4IHJnYmEoMCwwLDAsLjA2KSwwIDZweCAyMHB4IHJnYmEoMCwwLDAsLjA4KX1cbiAgI3Bvdi5zaG93e29wYWNpdHk6MTtwb2ludGVyLWV2ZW50czphdXRvO3RyYW5zZm9ybTp0cmFuc2xhdGUoLTUwJSwwKX1cbiAgI3BvdiBidXR0b257YXBwZWFyYW5jZTpub25lO2JvcmRlcjowO2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Y29sb3I6IzJmMmQyYTtmb250OjUwMCAxM3B4LzEgSGVsdmV0aWNhLEFyaWFsLHNhbnMtc2VyaWY7cGFkZGluZzo5cHggMTRweDtib3JkZXItcmFkaXVzOjk5OXB4O2N1cnNvcjpwb2ludGVyO3RyYW5zaXRpb246YmFja2dyb3VuZCAuMnMsY29sb3IgLjJzfVxuICAjcG92IGJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kOnJnYmEoNDcsNDUsNDIsLjA4KX1cbiAgI3BvdiBidXR0b24ub257YmFja2dyb3VuZDojMmYyZDJhO2NvbG9yOiNmN2Y1ZjB9XG4gICNsYW1we3Bvc2l0aW9uOmZpeGVkO2xlZnQ6NTAlO2JvdHRvbTo4MnB4O3RyYW5zZm9ybTp0cmFuc2xhdGUoLTUwJSwxMHB4KTtvcGFjaXR5OjA7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHkgLjM1cyx0cmFuc2Zvcm0gLjM1cztkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDo0cHg7cGFkZGluZzo0cHg7Ym9yZGVyLXJhZGl1czo5OTlweDtiYWNrZ3JvdW5kOnJnYmEoMjUwLDI0OCwyNDQsLjgyKTtiYWNrZHJvcC1maWx0ZXI6Ymx1cigxMHB4KTstd2Via2l0LWJhY2tkcm9wLWZpbHRlcjpibHVyKDEwcHgpO2NvbG9yOiMyZjJkMmE7Zm9udDo1MDAgMTRweC8xIEhlbHZldGljYSxBcmlhbCxzYW5zLXNlcmlmO2JveC1zaGFkb3c6MCA0cHggMThweCByZ2JhKDAsMCwwLC4wOCl9XG4gICNsYW1wVHtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDoxMHB4O2FwcGVhcmFuY2U6bm9uZTtib3JkZXI6MDtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50O2NvbG9yOmluaGVyaXQ7Zm9udDppbmhlcml0O3BhZGRpbmc6N3B4IDE0cHggN3B4IDEwcHg7Ym9yZGVyLXJhZGl1czo5OTlweDtjdXJzb3I6cG9pbnRlcjt3aGl0ZS1zcGFjZTpub3dyYXB9XG4gICNsYW1wVDpob3ZlcntiYWNrZ3JvdW5kOnJnYmEoNDcsNDUsNDIsLjA4KX1cbiAgI2xhbXBDdGx7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTRweDttYXgtd2lkdGg6MDtvdmVyZmxvdzpoaWRkZW47b3BhY2l0eTowO3RyYW5zaXRpb246bWF4LXdpZHRoIC40cyxvcGFjaXR5IC4zcyxwYWRkaW5nIC40cztwYWRkaW5nOjB9XG4gICNsYW1wLm9uICNsYW1wQ3Rse21heC13aWR0aDo0MjBweDtvcGFjaXR5OjE7cGFkZGluZzowIDEycHggMCA2cHh9XG4gICNsYW1wU3d7ZGlzcGxheTpmbGV4O2dhcDo2cHh9XG4gICNsYW1wU3cgYnV0dG9ue2FwcGVhcmFuY2U6bm9uZTt3aWR0aDoyMnB4O2hlaWdodDoyMnB4O2JvcmRlci1yYWRpdXM6NTAlO2JvcmRlcjoycHggc29saWQgcmdiYSgyNTAsMjQ4LDI0NCwuOSk7Ym94LXNoYWRvdzowIDAgMCAxcHggcmdiYSg0Nyw0NSw0MiwuMTgpO2N1cnNvcjpwb2ludGVyO3BhZGRpbmc6MH1cbiAgI2xhbXBTdyBidXR0b24uc2Vse2JveC1zaGFkb3c6MCAwIDAgMnB4ICMyZjJkMmF9XG4gICNsYW1wU3d7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDo4cHg7Zm9udC1zaXplOjEycHg7Y29sb3I6IzZiNjY1ZX1cbiAgI2xhbXBTdyBpbnB1dFt0eXBlPWNvbG9yXXthcHBlYXJhbmNlOm5vbmU7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7d2lkdGg6MjZweDtoZWlnaHQ6MjZweDtib3JkZXItcmFkaXVzOjUwJTtib3JkZXI6MnB4IHNvbGlkIHJnYmEoMjUwLDI0OCwyNDQsLjkpO2JveC1zaGFkb3c6MCAwIDAgMXB4IHJnYmEoNDcsNDUsNDIsLjI1KTtwYWRkaW5nOjA7Y3Vyc29yOnBvaW50ZXI7YmFja2dyb3VuZDpub25lfVxuICAjbGFtcFN3IGlucHV0W3R5cGU9Y29sb3JdOjotd2Via2l0LWNvbG9yLXN3YXRjaC13cmFwcGVye3BhZGRpbmc6MH1cbiAgI2xhbXBTdyBpbnB1dFt0eXBlPWNvbG9yXTo6LXdlYmtpdC1jb2xvci1zd2F0Y2h7Ym9yZGVyOjA7Ym9yZGVyLXJhZGl1czo1MCV9XG4gICNsYW1wU3cgaW5wdXRbdHlwZT1jb2xvcl06Oi1tb3otY29sb3Itc3dhdGNoe2JvcmRlcjowO2JvcmRlci1yYWRpdXM6NTAlfVxuICAjbGFtcERpbXtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDo4cHg7Zm9udC1zaXplOjEycHg7Y29sb3I6IzZiNjY1ZX1cbiAgI2xhbXBEaW0gaW5wdXR7d2lkdGg6MTEwcHg7YWNjZW50LWNvbG9yOiMyZjJkMmF9XG4gICNsYW1wRGltIG91dHB1dHt3aWR0aDozNHB4O3RleHQtYWxpZ246cmlnaHQ7Zm9udC12YXJpYW50LW51bWVyaWM6dGFidWxhci1udW1zfVxuICAjbGFtcC5zaG93e29wYWNpdHk6MTt0cmFuc2Zvcm06dHJhbnNsYXRlKC01MCUsMCk7cG9pbnRlci1ldmVudHM6YXV0b31cbiAgI2xhbXAgaXt3aWR0aDoxMnB4O2hlaWdodDoxMnB4O2JvcmRlci1yYWRpdXM6NTAlO2JhY2tncm91bmQ6I2JkYjhhZTt0cmFuc2l0aW9uOmJhY2tncm91bmQgLjNzLGJveC1zaGFkb3cgLjNzfVxuICAjcHR7cG9zaXRpb246Zml4ZWQ7dG9wOjE4cHg7cmlnaHQ6MThweDtwYWRkaW5nOjhweCAxMnB4O2JvcmRlci1yYWRpdXM6OTk5cHg7YmFja2dyb3VuZDpyZ2JhKDI1MCwyNDgsMjQ0LC44Mik7YmFja2Ryb3AtZmlsdGVyOmJsdXIoMTBweCk7LXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6Ymx1cigxMHB4KTtjb2xvcjojMmYyZDJhO2ZvbnQ6NTAwIDEycHgvMSB1aS1tb25vc3BhY2UsTWVubG8sbW9ub3NwYWNlO29wYWNpdHk6MDt0cmFuc2l0aW9uOm9wYWNpdHkgLjNzO3BvaW50ZXItZXZlbnRzOm5vbmV9XG4gICNwdC5zaG93e29wYWNpdHk6MX1cbiAgI3B0e3RvcDo2MnB4ICFpbXBvcnRhbnR9XG4gICNydHtwb3NpdGlvbjpmaXhlZDt0b3A6MThweDtyaWdodDoxOHB4O2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweDthcHBlYXJhbmNlOm5vbmU7Ym9yZGVyOjA7cGFkZGluZzo5cHggMTRweCA5cHggMTFweDtib3JkZXItcmFkaXVzOjk5OXB4O2JhY2tncm91bmQ6cmdiYSgyNTAsMjQ4LDI0NCwuODIpO2JhY2tkcm9wLWZpbHRlcjpibHVyKDEwcHgpOy13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOmJsdXIoMTBweCk7Y29sb3I6IzJmMmQyYTtmb250OjUwMCAxM3B4LzEgSGVsdmV0aWNhLEFyaWFsLHNhbnMtc2VyaWY7Y3Vyc29yOnBvaW50ZXI7Ym94LXNoYWRvdzowIDFweCAycHggcmdiYSgwLDAsMCwuMDYpLDAgNnB4IDIwcHggcmdiYSgwLDAsMCwuMDgpO3RyYW5zaXRpb246YmFja2dyb3VuZCAuMnMsY29sb3IgLjJzfVxuICAjcnQgaXt3aWR0aDoxMHB4O2hlaWdodDoxMHB4O2JvcmRlci1yYWRpdXM6NTAlO2JhY2tncm91bmQ6I2JkYjhhZTt0cmFuc2l0aW9uOmJhY2tncm91bmQgLjJzfVxuICAjcnQub257YmFja2dyb3VuZDojMmYyZDJhO2NvbG9yOiNmN2Y1ZjB9XG4gICNydC5vbiBpe2JhY2tncm91bmQ6IzdmZDA4YX1cbiAgI2xhbXAub24gaXtiYWNrZ3JvdW5kOiNmZmM4NmI7Ym94LXNoYWRvdzowIDAgMTBweCAzcHggcmdiYSgyNTUsMTkwLDkwLC42KX1cbiAgI2xhbXBEe2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjEwcHg7YXBwZWFyYW5jZTpub25lO2JvcmRlcjowO2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Y29sb3I6aW5oZXJpdDtmb250OmluaGVyaXQ7cGFkZGluZzo3cHggMTRweCA3cHggMTBweDtib3JkZXItcmFkaXVzOjk5OXB4O2N1cnNvcjpwb2ludGVyO3doaXRlLXNwYWNlOm5vd3JhcH1cbiAgI2xhbXBEOmhvdmVye2JhY2tncm91bmQ6cmdiYSg0Nyw0NSw0MiwuMDgpfVxuICAjdHZCe2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweDthcHBlYXJhbmNlOm5vbmU7Ym9yZGVyOjA7YmFja2dyb3VuZDp0cmFuc3BhcmVudDtjb2xvcjppbmhlcml0O2ZvbnQ6aW5oZXJpdDtwYWRkaW5nOjdweCAxNHB4IDdweCAxMHB4O2JvcmRlci1yYWRpdXM6OTk5cHg7Y3Vyc29yOnBvaW50ZXI7d2hpdGUtc3BhY2U6bm93cmFwfVxuICAjdHZCOmhvdmVye2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwuMSl9XG4gICN0dkIgc3Zne2ZsZXg6bm9uZTt0cmFuc2l0aW9uOmNvbG9yIC4zc31cbiAgI3R2QmFye3Bvc2l0aW9uOmZpeGVkO2xlZnQ6NTAlO2JvdHRvbToyMnB4O3RyYW5zZm9ybTp0cmFuc2xhdGUoLTUwJSwxMHB4KTtvcGFjaXR5OjA7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHkgLjRzLHRyYW5zZm9ybSAuNHM7ZGlzcGxheTpmbGV4O2dhcDo0cHg7cGFkZGluZzo0cHg7Ym9yZGVyLXJhZGl1czo5OTlweDtiYWNrZ3JvdW5kOnJnYmEoMjAsMjAsMTgsLjU1KTtiYWNrZHJvcC1maWx0ZXI6Ymx1cigxMnB4KTstd2Via2l0LWJhY2tkcm9wLWZpbHRlcjpibHVyKDEycHgpO3otaW5kZXg6NjB9XG4gICN0dkJhci5zaG93e29wYWNpdHk6MTt0cmFuc2Zvcm06dHJhbnNsYXRlKC01MCUsMCk7cG9pbnRlci1ldmVudHM6YXV0b31cbiAgI3R2VUl7cG9zaXRpb246Zml4ZWQ7aW5zZXQ6MDt6LWluZGV4OjU1O29wYWNpdHk6MDtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSAuNXM7Zm9udC1mYW1pbHk6SGVsdmV0aWNhLEFyaWFsLHNhbnMtc2VyaWY7Y29sb3I6I2YyZjFlYztiYWNrZ3JvdW5kOiMwYjBjMGU7b3ZlcmZsb3c6aGlkZGVufVxuICAjdHZVSS5zaG93e29wYWNpdHk6MTtwb2ludGVyLWV2ZW50czphdXRvfVxuICAjdHZVSSAudHYtaGVyb3stLWE6I2U1NDg0ZDtwb3NpdGlvbjphYnNvbHV0ZTtpbnNldDowO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47anVzdGlmeS1jb250ZW50OmZsZXgtZW5kO2dhcDo2cHg7cGFkZGluZzowIGNsYW1wKDIwcHgsNnZ3LDgwcHgpIGNsYW1wKDE1MHB4LDIydmgsMjIwcHgpO2JhY2tncm91bmQ6cmFkaWFsLWdyYWRpZW50KDEyMCUgOTAlIGF0IDg1JSAyMCUsY29sb3ItbWl4KGluIG9rbGNoLHZhcigtLWEpIDU1JSx0cmFuc3BhcmVudCksdHJhbnNwYXJlbnQgNjAlKSxsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCMwYjBjMGUgMCUsIzEyMTMxNiAxMDAlKTt0cmFuc2l0aW9uOmJhY2tncm91bmQgLjVzfVxuICAjdHZVSSAudHYtaGVybyBzbWFsbHtmb250LXNpemU6Y2xhbXAoMTJweCwxLjR2dywxNXB4KTtsZXR0ZXItc3BhY2luZzouMDhlbTt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7Y29sb3I6I2JkYmFiMn1cbiAgI3R2VUkgLnR2LWhlcm8gaDJ7bWFyZ2luOjA7Zm9udC13ZWlnaHQ6NzAwO2ZvbnQtc2l6ZTpjbGFtcCg0MHB4LDh2dywxMTBweCk7bGluZS1oZWlnaHQ6MTtsZXR0ZXItc3BhY2luZzotLjAyZW07dGV4dC13cmFwOmJhbGFuY2V9XG4gICN0dlVJIC50di1uYXZ7cG9zaXRpb246YWJzb2x1dGU7bGVmdDowO3JpZ2h0OjA7dG9wOmNsYW1wKDE0cHgsM3ZoLDI4cHgpO2Rpc3BsYXk6ZmxleDtnYXA6OHB4O3BhZGRpbmc6NnB4IGNsYW1wKDIwcHgsNnZ3LDgwcHgpO292ZXJmbG93LXg6YXV0bztzY3JvbGxiYXItd2lkdGg6bm9uZTstd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzp0b3VjaH1cbiAgI3R2VUkgLnR2LW5hdjo6LXdlYmtpdC1zY3JvbGxiYXJ7ZGlzcGxheTpub25lfVxuICAjdHZVSSAudHYtbmF2IGJ1dHRvbntmbGV4Om5vbmU7YXBwZWFyYW5jZTpub25lO2JvcmRlcjowO2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwuMDgpO2NvbG9yOiNmMmYxZWM7Zm9udDo1MDAgY2xhbXAoMTRweCwxLjV2dywxN3B4KS8xIEhlbHZldGljYSxBcmlhbCxzYW5zLXNlcmlmO3BhZGRpbmc6MTNweCAyMHB4O2JvcmRlci1yYWRpdXM6OTk5cHg7Y3Vyc29yOnBvaW50ZXI7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kIC4ycyxjb2xvciAuMnMsdHJhbnNmb3JtIC4yczttaW4taGVpZ2h0OjQ0cHh9XG4gICN0dlVJIC50di1uYXYgYnV0dG9uOmhvdmVye2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwuMTYpfVxuICAjdHZVSSAudHYtbmF2IGJ1dHRvbi5vbntiYWNrZ3JvdW5kOiNmMmYxZWM7Y29sb3I6IzExMTIxNDt0cmFuc2Zvcm06c2NhbGUoMS4wNCl9XG4gICN0dlVJIC50di12b2x7cG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6Y2xhbXAoMTJweCwyLjV2dywzMnB4KTt0b3A6NTAlO3RyYW5zZm9ybTp0cmFuc2xhdGVZKC01MCUpO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47YWxpZ24taXRlbXM6Y2VudGVyO2dhcDoxMHB4O3BhZGRpbmc6MTBweCA4cHg7Ym9yZGVyLXJhZGl1czo5OTlweDtiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsLjA4KTtiYWNrZHJvcC1maWx0ZXI6Ymx1cigxMHB4KTstd2Via2l0LWJhY2tkcm9wLWZpbHRlcjpibHVyKDEwcHgpfVxuICAjdHZVSSAudHYtdmJ7YXBwZWFyYW5jZTpub25lO2JvcmRlcjowO3dpZHRoOjQ0cHg7aGVpZ2h0OjQ0cHg7Ym9yZGVyLXJhZGl1czo1MCU7YmFja2dyb3VuZDp0cmFuc3BhcmVudDtjb2xvcjojZjJmMWVjO2ZvbnQ6NDAwIDIycHgvMSBIZWx2ZXRpY2EsQXJpYWwsc2Fucy1zZXJpZjtjdXJzb3I6cG9pbnRlcn1cbiAgI3R2VUkgLnR2LXZiOmhvdmVye2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwuMTIpfVxuICAjdHZVSSAudHYtdm9sIGlucHV0ey0tdjozNSU7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7YXBwZWFyYW5jZTpub25lO3dyaXRpbmctbW9kZTp2ZXJ0aWNhbC1scjtkaXJlY3Rpb246cnRsO3dpZHRoOjZweDtoZWlnaHQ6Y2xhbXAoMTIwcHgsMjh2aCwyMjBweCk7Ym9yZGVyLXJhZGl1czozcHg7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQodG8gdG9wLCNmMmYxZWMgdmFyKC0tdikscmdiYSgyNTUsMjU1LDI1NSwuMikgdmFyKC0tdikpO2N1cnNvcjpwb2ludGVyO21hcmdpbjowfVxuICAjdHZVSSAudHYtdm9sIGlucHV0Ojotd2Via2l0LXNsaWRlci10aHVtYnstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTt3aWR0aDoxOHB4O2hlaWdodDoxOHB4O2JvcmRlci1yYWRpdXM6NTAlO2JhY2tncm91bmQ6I2YyZjFlYztib3gtc2hhZG93OjAgMXB4IDRweCByZ2JhKDAsMCwwLC40KX1cbiAgI3R2VUkgLnR2LXZvbCBpbnB1dDo6LW1vei1yYW5nZS10aHVtYnt3aWR0aDoxOHB4O2hlaWdodDoxOHB4O2JvcmRlcjowO2JvcmRlci1yYWRpdXM6NTAlO2JhY2tncm91bmQ6I2YyZjFlY31cbiAgI3R2VUkgLnR2LXZvbCBvdXRwdXR7Zm9udDo1MDAgMTJweC8xIEhlbHZldGljYSxBcmlhbCxzYW5zLXNlcmlmO2NvbG9yOiNiZGJhYjI7Zm9udC12YXJpYW50LW51bWVyaWM6dGFidWxhci1udW1zO3BhZGRpbmctYm90dG9tOjRweH1cbiAgQG1lZGlhIChtYXgtd2lkdGg6NjAwcHgpeyN0dlVJIC50di1uYXYgYnV0dG9ue3BhZGRpbmc6MTJweCAxNnB4fSN0dlVJIC50di12b2x7cmlnaHQ6MTBweDtwYWRkaW5nOjZweCA0cHh9I3R2VUkgLnR2LWhlcm97cGFkZGluZy1yaWdodDo4MHB4fX1cbiAgI3R2QmFyIGJ1dHRvbntkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDo4cHg7YXBwZWFyYW5jZTpub25lO2JvcmRlcjowO2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Y29sb3I6I2YyZjFlYztmb250OjUwMCAxM3B4LzEgSGVsdmV0aWNhLEFyaWFsLHNhbnMtc2VyaWY7cGFkZGluZzo5cHggMTRweDtib3JkZXItcmFkaXVzOjk5OXB4O2N1cnNvcjpwb2ludGVyfVxuICAjdHZCYXIgYnV0dG9uOmhvdmVye2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwuMTIpfVxuICBib2R5LnR2Zm9jdXMgI3Jvb21zLGJvZHkudHZmb2N1cyAjcG92LGJvZHkudHZmb2N1cyAjcnQsYm9keS50dmZvY3VzICNwdCxib2R5LnR2Zm9jdXMgI2xhbXAsYm9keS50dmZvY3VzICNsYW1wMixib2R5LnR2Zm9jdXMgI21we29wYWNpdHk6MCAhaW1wb3J0YW50O3BvaW50ZXItZXZlbnRzOm5vbmUgIWltcG9ydGFudDt0cmFuc2l0aW9uOm9wYWNpdHkgLjRzfVxuICAjdHZCIC5wd3t0cmFuc2l0aW9uOmZpbGwgLjNzLHN0cm9rZSAuM3N9XG4gICN0dkIub24gLnB3e2ZpbGw6I2U1NDg0ZDtzdHJva2U6I2U1NDg0ZH1cbiAgI3R2Qi5vbiBzdmd7ZmlsdGVyOmRyb3Atc2hhZG93KDAgMCA0cHggcmdiYSgxMjAsMTcwLDI1NSwuNykpfVxuICAjdHZCe3BhZGRpbmc6MTFweCAxNHB4IDExcHggMTBweDtmb250LXNpemU6MTNweH1cbiAgI3R2QmFye2JvdHRvbTptYXgoZW52KHNhZmUtYXJlYS1pbnNldC1ib3R0b20pLDE4cHgpfVxuICAjdHZVSSAudHYtbmF2e3RvcDptYXgoZW52KHNhZmUtYXJlYS1pbnNldC10b3ApLDE0cHgpfVxuICAjdHZVSSAudHYtaGVyb3twYWRkaW5nLWJvdHRvbTpjYWxjKDExMHB4ICsgZW52KHNhZmUtYXJlYS1pbnNldC1ib3R0b20pKX1cbiAgQG1lZGlhIChvcmllbnRhdGlvbjpsYW5kc2NhcGUpIGFuZCAobWF4LWhlaWdodDo1MDBweCl7I3R2VUkgLnR2LWhlcm97cGFkZGluZy1ib3R0b206ODBweH0jdHZVSSAudHYtaGVybyBoMntmb250LXNpemU6NDRweH0jdHZVSSAudHYtdm9sIGlucHV0e2hlaWdodDo5MHB4fSN0dlVJIC50di12Ynt3aWR0aDozNnB4O2hlaWdodDozNnB4fX1cbiAgI2xhbXBEIGJ7d2lkdGg6MTJweDtoZWlnaHQ6MTJweDtib3JkZXItcmFkaXVzOjUwJTtiYWNrZ3JvdW5kOiNiZGI4YWU7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kIC4zcyxib3gtc2hhZG93IC4zc31cbiAgI2xhbXBELm9uIGJ7YmFja2dyb3VuZDojZmY5YTNjO2JveC1zaGFkb3c6MCAwIDEwcHggM3B4IHJnYmEoMjU1LDE1MCw2MCwuNil9XG4gICNsYW1wMntwb3NpdGlvbjpmaXhlZDtsZWZ0OjUwJTtib3R0b206ODJweDt0cmFuc2Zvcm06dHJhbnNsYXRlKC01MCUsMTBweCk7b3BhY2l0eTowO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5IC4zNXMsdHJhbnNmb3JtIC4zNXM7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6NHB4O3BhZGRpbmc6NHB4O2JvcmRlci1yYWRpdXM6OTk5cHg7YmFja2dyb3VuZDpyZ2JhKDI1MCwyNDgsMjQ0LC44Mik7YmFja2Ryb3AtZmlsdGVyOmJsdXIoMTBweCk7LXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6Ymx1cigxMHB4KTtjb2xvcjojMmYyZDJhO2ZvbnQ6NTAwIDE0cHgvMSBIZWx2ZXRpY2EsQXJpYWwsc2Fucy1zZXJpZjtib3gtc2hhZG93OjAgNHB4IDE4cHggcmdiYSgwLDAsMCwuMDgpfVxuICAjbGFtcDIuc2hvd3tvcGFjaXR5OjE7dHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLDApO3BvaW50ZXItZXZlbnRzOmF1dG99XG4gICN0cmlwVHtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDoxMHB4O2FwcGVhcmFuY2U6bm9uZTtib3JkZXI6MDtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50O2NvbG9yOmluaGVyaXQ7Zm9udDppbmhlcml0O3BhZGRpbmc6N3B4IDE0cHggN3B4IDEwcHg7Ym9yZGVyLXJhZGl1czo5OTlweDtjdXJzb3I6cG9pbnRlcjt3aGl0ZS1zcGFjZTpub3dyYXB9XG4gICN0cmlwVDpob3ZlcntiYWNrZ3JvdW5kOnJnYmEoNDcsNDUsNDIsLjA4KX1cbiAgI3RyaXBUIGl7d2lkdGg6MTJweDtoZWlnaHQ6MTJweDtib3JkZXItcmFkaXVzOjUwJTtiYWNrZ3JvdW5kOiNiZGI4YWU7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kIC4zcyxib3gtc2hhZG93IC4zc31cbiAgI3RyaXBDdGx7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTRweDttYXgtd2lkdGg6MDtvdmVyZmxvdzpoaWRkZW47b3BhY2l0eTowO3RyYW5zaXRpb246bWF4LXdpZHRoIC40cyxvcGFjaXR5IC4zcyxwYWRkaW5nIC40cztwYWRkaW5nOjB9XG4gICNsYW1wMi5vbiAjdHJpcEN0bHttYXgtd2lkdGg6NTYwcHg7b3BhY2l0eToxO3BhZGRpbmc6MCAxMnB4IDAgNnB4fVxuICAjdHJpcEN0bCBsYWJlbHtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDo4cHg7Zm9udC1zaXplOjEycHg7Y29sb3I6IzZiNjY1ZX1cbiAgI3RyaXBDdGwgaW5wdXRbdHlwZT1yYW5nZV17d2lkdGg6MTAwcHg7YWNjZW50LWNvbG9yOiMyZjJkMmF9XG4gICN0cmlwQ3RsIG91dHB1dHt3aWR0aDozNHB4O3RleHQtYWxpZ246cmlnaHQ7Zm9udC12YXJpYW50LW51bWVyaWM6dGFidWxhci1udW1zfVxuICAjdHJpcEN0bCBpbnB1dFt0eXBlPWNvbG9yXXthcHBlYXJhbmNlOm5vbmU7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7d2lkdGg6MjZweDtoZWlnaHQ6MjZweDtib3JkZXItcmFkaXVzOjUwJTtib3JkZXI6MnB4IHNvbGlkIHJnYmEoMjUwLDI0OCwyNDQsLjkpO2JveC1zaGFkb3c6MCAwIDAgMXB4IHJnYmEoNDcsNDUsNDIsLjI1KTtwYWRkaW5nOjA7Y3Vyc29yOnBvaW50ZXI7YmFja2dyb3VuZDpub25lfVxuICAjdHJpcEN0bCBpbnB1dFt0eXBlPWNvbG9yXTo6LXdlYmtpdC1jb2xvci1zd2F0Y2gtd3JhcHBlcntwYWRkaW5nOjB9XG4gICN0cmlwQ3RsIGlucHV0W3R5cGU9Y29sb3JdOjotd2Via2l0LWNvbG9yLXN3YXRjaHtib3JkZXI6MDtib3JkZXItcmFkaXVzOjUwJX1cbiAgI3RyaXBDdGwgaW5wdXRbdHlwZT1jb2xvcl06Oi1tb3otY29sb3Itc3dhdGNoe2JvcmRlcjowO2JvcmRlci1yYWRpdXM6NTAlfVxuICAjcm9vbXMsI3BvdiwjcnQsI3B0LCNsYW1wLCNsYW1wMix0aHJlZS1kLXN0YWdlOjpwYXJ0KHRvb2xiYXIpe3RyYW5zaXRpb246b3BhY2l0eSAuNnN9XG4gIGJvZHkuaWRsZSAjcm9vbXMsYm9keS5pZGxlICNwb3YsYm9keS5pZGxlICNydCxib2R5LmlkbGUgI3B0LGJvZHkuaWRsZSAjbGFtcCxib2R5LmlkbGUgI2xhbXAye29wYWNpdHk6MCAhaW1wb3J0YW50O3BvaW50ZXItZXZlbnRzOm5vbmV9XG4gIGJvZHkuaWRsZXtjdXJzb3I6bm9uZX1cblxuICAvKiBtdWF2aW4tR3JhZGllbnQgZsO8ciBHVUktTGVpc3RlbiAqL1xuICAjcm9vbXMsI3BvdiwjbGFtcCwjbGFtcDIsI3B0LCNydHtiYWNrZ3JvdW5kLWNvbG9yOiMwMDAgIWltcG9ydGFudDtiYWNrZ3JvdW5kLWltYWdlOnJhZGlhbC1ncmFkaWVudChjaXJjbGUgYXQgNjUuMzQlIDQ0LjYyJSwgcmdiYSg5NSw5NSw5NSwxKSAwJSwgcmdiYSg5NSw5NSw5NSwuODQ0KSA4LjUzJSwgcmdiYSg5NSw5NSw5NSwuNSkgMTcuMDUlLCByZ2JhKDk1LDk1LDk1LC4xNTYpIDI1LjU4JSwgcmdiYSg5NSw5NSw5NSwwKSAzNC4xJSkscmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCAyOC4wNyUgNzQuNDglLCByZ2JhKDUzLDU0LDQ4LDEpIDAlLCByZ2JhKDUzLDU0LDQ4LC44NDQpIDExLjQxJSwgcmdiYSg1Myw1NCw0OCwuNSkgMjIuODMlLCByZ2JhKDUzLDU0LDQ4LC4xNTYpIDM0LjI0JSwgcmdiYSg1Myw1NCw0OCwwKSA0NS42NSUpLHJhZGlhbC1ncmFkaWVudChjaXJjbGUgYXQgNTIuNDIlIDE5Ljk0JSwgcmdiYSg1NiwxMjIsNTYsMSkgMCUsIHJnYmEoNTYsMTIyLDU2LC44NDQpIDE0LjM5JSwgcmdiYSg1NiwxMjIsNTYsLjUpIDI4Ljc3JSwgcmdiYSg1NiwxMjIsNTYsLjE1NikgNDMuMTYlLCByZ2JhKDU2LDEyMiw1NiwwKSA1Ny41NSUpLHJhZGlhbC1ncmFkaWVudChjaXJjbGUgYXQgODAuMzElIDg0LjQ3JSwgcmdiYSgwLDAsMCwxKSAwJSwgcmdiYSgwLDAsMCwuODQ0KSAxNy4yNyUsIHJnYmEoMCwwLDAsLjUpIDM0LjU1JSwgcmdiYSgwLDAsMCwuMTU2KSA1MS44MiUsIHJnYmEoMCwwLDAsMCkgNjkuMSUpICFpbXBvcnRhbnQ7YmFja2dyb3VuZC1zaXplOjEwMCUgMTAwJSAhaW1wb3J0YW50O2NvbG9yOiNmMmYxZWMgIWltcG9ydGFudDtib3gtc2hhZG93OjAgNnB4IDI0cHggcmdiYSgwLDAsMCwuMjUpLGluc2V0IDAgMCAwIDFweCByZ2JhKDI1NSwyNTUsMjU1LC4wOCl9XG4gICNyb29tcyBidXR0b24sI3BvdiBidXR0b257Y29sb3I6I2YyZjFlY31cbiAgI3Jvb21zIGJ1dHRvbjpob3ZlciwjcG92IGJ1dHRvbjpob3ZlciwjbGFtcFQ6aG92ZXIsI2xhbXBEOmhvdmVyLCN0cmlwVDpob3ZlcntiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsLjEpfVxuICAjcm9vbXMgYnV0dG9uLm9uLCNwb3YgYnV0dG9uLm9uLCNydC5vbntiYWNrZ3JvdW5kOiNmMmYxZWMgIWltcG9ydGFudDtiYWNrZ3JvdW5kLWltYWdlOm5vbmUgIWltcG9ydGFudDtjb2xvcjojMTQxNDEyICFpbXBvcnRhbnR9XG4gICNsYW1wU3csI2xhbXBEaW0sI3RyaXBDdGx7Y29sb3I6I2Q5ZDdkMCAhaW1wb3J0YW50fVxuICAjbGFtcFN3IGJ1dHRvbi5zZWx7Ym94LXNoYWRvdzowIDAgMCAycHggI2YyZjFlY31cbiAgI2xhbXBEaW0gaW5wdXRbdHlwZT1yYW5nZV0sI3RyaXBDdGwgaW5wdXRbdHlwZT1yYW5nZV17YWNjZW50LWNvbG9yOiNmMmYxZWN9XG4gIC5scC1zd3thcHBlYXJhbmNlOm5vbmU7d2lkdGg6MjZweDtoZWlnaHQ6MjZweDtib3JkZXItcmFkaXVzOjUwJTtib3JkZXI6MnB4IHNvbGlkIHJnYmEoMjUwLDI0OCwyNDQsLjkpO2JveC1zaGFkb3c6MCAwIDAgMXB4IHJnYmEoNDcsNDUsNDIsLjI1KTtwYWRkaW5nOjA7Y3Vyc29yOnBvaW50ZXI7ZmxleDpub25lfVxuICAubHBpY2t7cG9zaXRpb246Zml4ZWQ7ei1pbmRleDo1MDt3aWR0aDoyMzZweDtwYWRkaW5nOjE0cHg7Ym9yZGVyLXJhZGl1czoxOHB4O2JhY2tncm91bmQ6cmdiYSgyNiwyNywyNCwuMzgpO2JhY2tkcm9wLWZpbHRlcjpibHVyKDE4cHgpIHNhdHVyYXRlKDEuMik7LXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6Ymx1cigxOHB4KSBzYXR1cmF0ZSgxLjIpO2NvbG9yOiNmMmYxZWM7Zm9udDo1MDAgMTJweC8xLjIgSGVsdmV0aWNhLEFyaWFsLHNhbnMtc2VyaWY7Ym94LXNoYWRvdzowIDEwcHggMzZweCByZ2JhKDAsMCwwLC4zNSksaW5zZXQgMCAwIDAgMXB4IHJnYmEoMjU1LDI1NSwyNTUsLjA4KTtkaXNwbGF5Om5vbmU7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2dhcDoxNHB4O3RyYW5zaXRpb246b3BhY2l0eSAuNnN9XG4gIC5scGljay5vcGVue2Rpc3BsYXk6ZmxleH1cbiAgYm9keS5scGZvY3VzICNyb29tcyxib2R5LmxwZm9jdXMgI3Bvdixib2R5LmxwZm9jdXMgI3J0LGJvZHkubHBmb2N1cyAjcHQsYm9keS5scGZvY3VzICNsYW1wLGJvZHkubHBmb2N1cyAjbGFtcDIsYm9keS5scGZvY3VzIHRocmVlLWQtc3RhZ2U6OnBhcnQodG9vbGJhcil7b3BhY2l0eTowICFpbXBvcnRhbnQ7cG9pbnRlci1ldmVudHM6bm9uZSAhaW1wb3J0YW50fVxuICAubHAtZG9uZXthcHBlYXJhbmNlOm5vbmU7Ym9yZGVyOjA7Ym9yZGVyLXJhZGl1czo5OTlweDtwYWRkaW5nOjlweCAwO2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwuMSk7Y29sb3I6I2YyZjFlYztmb250OmluaGVyaXQ7Y3Vyc29yOnBvaW50ZXJ9XG4gIC5scC1kb25lOmhvdmVye2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwuMTgpfVxuICBib2R5LmlkbGUgLmxwaWNre29wYWNpdHk6MDtwb2ludGVyLWV2ZW50czpub25lfVxuICAubHAtc2Vne2Rpc3BsYXk6Z3JpZDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6MWZyIDFmcjtnYXA6M3B4O3BhZGRpbmc6M3B4O2JvcmRlci1yYWRpdXM6OTk5cHg7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4wOCl9XG4gIC5scC1zZWcgYnV0dG9ue2FwcGVhcmFuY2U6bm9uZTtib3JkZXI6MDtib3JkZXItcmFkaXVzOjk5OXB4O3BhZGRpbmc6N3B4IDA7YmFja2dyb3VuZDp0cmFuc3BhcmVudDtjb2xvcjojZDlkN2QwO2ZvbnQ6aW5oZXJpdDtjdXJzb3I6cG9pbnRlcn1cbiAgLmxwLXNlZyBidXR0b24ub257YmFja2dyb3VuZDojZjJmMWVjO2NvbG9yOiMxNDE0MTJ9XG4gIC5scC1yb3d7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtnYXA6N3B4fVxuICAubHAtcm93PmRpdntkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47Y29sb3I6I2Q5ZDdkMH1cbiAgLmxwLXJvdyBvdXRwdXR7Zm9udC12YXJpYW50LW51bWVyaWM6dGFidWxhci1udW1zO2NvbG9yOiNmMmYxZWN9XG4gIC5scC1yb3cgc21hbGx7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2NvbG9yOiNhOWE2OWU7Zm9udC1zaXplOjExcHh9XG4gIC5scGljayBpbnB1dFt0eXBlPXJhbmdlXXt3aWR0aDoxMDAlO21hcmdpbjowO2FjY2VudC1jb2xvcjojZjJmMWVjfVxuICAubHBpY2sgaW5wdXQubHAtdGVtcHthcHBlYXJhbmNlOm5vbmU7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7aGVpZ2h0OjEwcHg7Ym9yZGVyLXJhZGl1czo1cHg7b3V0bGluZTpub25lfVxuICAubHAtdGVtcDo6LXdlYmtpdC1zbGlkZXItdGh1bWJ7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7d2lkdGg6MThweDtoZWlnaHQ6MThweDtib3JkZXItcmFkaXVzOjUwJTtiYWNrZ3JvdW5kOiNmZmY7Ym9yZGVyOjJweCBzb2xpZCAjMWExYjE4O2JveC1zaGFkb3c6MCAwIDAgMXB4IHJnYmEoMjU1LDI1NSwyNTUsLjYpO2N1cnNvcjpwb2ludGVyfVxuICAubHAtdGVtcDo6LW1vei1yYW5nZS10aHVtYnt3aWR0aDoxNHB4O2hlaWdodDoxNHB4O2JvcmRlci1yYWRpdXM6NTAlO2JhY2tncm91bmQ6I2ZmZjtib3JkZXI6MnB4IHNvbGlkICMxYTFiMTg7Y3Vyc29yOnBvaW50ZXJ9XG4gIC5scC13aGVlbHtwb3NpdGlvbjpyZWxhdGl2ZTt3aWR0aDoxODBweDtoZWlnaHQ6MTgwcHg7bWFyZ2luOjAgYXV0bzt0b3VjaC1hY3Rpb246bm9uZTtjdXJzb3I6cG9pbnRlcn1cbiAgLmxwLXdoZWVsIGNhbnZhc3t3aWR0aDoxODBweDtoZWlnaHQ6MTgwcHg7Ym9yZGVyLXJhZGl1czo1MCU7ZGlzcGxheTpibG9ja31cbiAgLmxwLXdoZWVsIGl7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MThweDtoZWlnaHQ6MThweDttYXJnaW46LTlweCAwIDAgLTlweDtib3JkZXItcmFkaXVzOjUwJTtib3JkZXI6MnB4IHNvbGlkICNmZmY7Ym94LXNoYWRvdzowIDAgMCAxcHggcmdiYSgwLDAsMCwuNCksMCAycHggNnB4IHJnYmEoMCwwLDAsLjQpO3BvaW50ZXItZXZlbnRzOm5vbmV9XG4gIC8qIC0tLS0tLS0tLS0gSGFuZHktQW5zaWNodCAtLS0tLS0tLS0tICovXG4gIGh0bWwsYm9keXtvdmVyc2Nyb2xsLWJlaGF2aW9yOm5vbmU7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RvdWNoLWFjdGlvbjpub25lfVxuICBAbWVkaWEgKG1heC13aWR0aDo3MDBweCl7XG4gICAgI3Jvb21ze2xlZnQ6MTJweDtyaWdodDoxMnB4O3RyYW5zZm9ybTpub25lO2JvdHRvbTpjYWxjKDE0cHggKyBtYXgoZW52KHNhZmUtYXJlYS1pbnNldC1ib3R0b20pLCAxOHB4KSk7b3ZlcmZsb3cteDphdXRvO3Njcm9sbGJhci13aWR0aDpub25lO2p1c3RpZnktY29udGVudDpmbGV4LXN0YXJ0O2dhcDoycHg7cGFkZGluZzo1cHg7dG91Y2gtYWN0aW9uOnBhbi14fVxuICAgICNyb29tczo6LXdlYmtpdC1zY3JvbGxiYXJ7ZGlzcGxheTpub25lfVxuICAgICNyb29tcyBidXR0b257ZmxleDpub25lO3BhZGRpbmc6MTNweCAxNXB4O2ZvbnQtc2l6ZToxNHB4fVxuICAgICNwb3Z7bGVmdDoxMnB4O3RvcDpjYWxjKDEycHggKyBtYXgoZW52KHNhZmUtYXJlYS1pbnNldC10b3ApLCA0NnB4KSk7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLThweCl9XG4gICAgI3Bvdi5zaG93e3RyYW5zZm9ybTpub25lfVxuICAgICNwb3YgYnV0dG9ue3BhZGRpbmc6MTFweCAxMnB4O2ZvbnQtc2l6ZToxMnB4fVxuICAgICNydHt0b3A6Y2FsYygxMnB4ICsgbWF4KGVudihzYWZlLWFyZWEtaW5zZXQtdG9wKSwgNDZweCkpO3JpZ2h0OjEycHg7cGFkZGluZzoxMXB4IDEycHggMTFweCAxMHB4O2ZvbnQtc2l6ZToxMnB4fVxuICAgICNwdHt0b3A6Y2FsYyg2MnB4ICsgbWF4KGVudihzYWZlLWFyZWEtaW5zZXQtdG9wKSwgNDZweCkpICFpbXBvcnRhbnQ7cmlnaHQ6MTJweH1cbiAgICAjbGFtcCwjbGFtcDJ7bGVmdDoxMnB4O3JpZ2h0OjEycHg7Ym90dG9tOmNhbGMoNzhweCArIG1heChlbnYoc2FmZS1hcmVhLWluc2V0LWJvdHRvbSksIDE4cHgpKTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgxMHB4KTtmbGV4LXdyYXA6d3JhcDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2JvcmRlci1yYWRpdXM6MjRweDtyb3ctZ2FwOjJweH1cbiAgICAjbGFtcC5zaG93LCNsYW1wMi5zaG93e3RyYW5zZm9ybTpub25lfVxuICAgICNsYW1wVCwjbGFtcEQsI3RyaXBUe3BhZGRpbmc6MTFweCAxNHB4IDExcHggMTBweDtmb250LXNpemU6MTNweH1cbiAgICAjbGFtcC5vbiAjbGFtcEN0bCwjbGFtcDIub24gI3RyaXBDdGx7bWF4LXdpZHRoOjEwMCU7cGFkZGluZzo0cHggMTBweCA4cHh9XG4gICAgI3RyaXBDdGx7ZmxleC13cmFwOndyYXA7anVzdGlmeS1jb250ZW50OmNlbnRlcjtnYXA6MTJweH1cbiAgICAjdHJpcEN0bCBpbnB1dFt0eXBlPXJhbmdlXXt3aWR0aDoxMjBweH1cbiAgICAubHAtc3d7d2lkdGg6MzBweDtoZWlnaHQ6MzBweH1cbiAgICAubHBpY2t7bGVmdDowICFpbXBvcnRhbnQ7cmlnaHQ6MDt0b3A6YXV0byAhaW1wb3J0YW50O2JvdHRvbTowO3RyYW5zZm9ybTpub25lICFpbXBvcnRhbnQ7d2lkdGg6YXV0bztib3JkZXItcmFkaXVzOjI0cHggMjRweCAwIDA7cGFkZGluZzoxNnB4IDIwcHggY2FsYygyMHB4ICsgbWF4KGVudihzYWZlLWFyZWEtaW5zZXQtYm90dG9tKSwgMThweCkpO2dhcDoxNnB4O2ZvbnQtc2l6ZToxM3B4fVxuICAgIC5scC1zZWcgYnV0dG9uLC5scC1kb25le3BhZGRpbmc6MTJweCAwfVxuICAgIC5scC13aGVlbCwubHAtd2hlZWwgY2FudmFze3dpZHRoOjE4MHB4O2hlaWdodDoxODBweH1cbiAgfVxuICAvKiAtLS0tLS0tLS0tIEhhbmR5OiAzRCBvYmVuLCBGZXJuYmVkaWVudW5nIHVudGVuIC0tLS0tLS0tLS0gKi9cbiAgI3Jvb21zLCNwb3YsI3J0LCNwdCwjbGFtcCwjbGFtcDJ7ZGlzcGxheTpub25lICFpbXBvcnRhbnR9XG4gIGJvZHl7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtoZWlnaHQ6MTAwdmg7aGVpZ2h0OjEwMGR2aDtvdmVyZmxvdzpoaWRkZW47Y3Vyc29yOmF1dG8gIWltcG9ydGFudH1cbiAgdGhyZWUtZC1zdGFnZXtmbGV4Om5vbmU7aGVpZ2h0OjM2JTttaW4taGVpZ2h0OjB9XG4gICNyZW1vdGV7cG9zaXRpb246cmVsYXRpdmU7ei1pbmRleDo1O2ZsZXg6MTttaW4taGVpZ2h0OjA7bWFyZ2luLXRvcDotMjJweDtvdmVyZmxvdy15OmF1dG87dG91Y2gtYWN0aW9uOnBhbi15O2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Z2FwOjEycHg7cGFkZGluZzoxMHB4IDE2cHggbWF4KGVudihzYWZlLWFyZWEtaW5zZXQtYm90dG9tKSwgMjJweCk7Ym9yZGVyLXJhZGl1czoyOHB4IDI4cHggMCAwO2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDE4MGRlZywjMjYyNjI0LCMxNzE3MTYgNjAlKTtjb2xvcjojZjJmMWVjO2JveC1zaGFkb3c6MCAtMTBweCAzMHB4IHJnYmEoMCwwLDAsLjE4KSxpbnNldCAwIDFweCAwIHJnYmEoMjU1LDI1NSwyNTUsLjA4KTtmb250OjUwMCAxNHB4LzEuMiBIZWx2ZXRpY2EsQXJpYWwsc2Fucy1zZXJpZn1cbiAgI3JlbW90ZSBidXR0b257YXBwZWFyYW5jZTpub25lO2JvcmRlcjowO2ZvbnQ6aW5oZXJpdDtjb2xvcjppbmhlcml0O2N1cnNvcjpwb2ludGVyOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudH1cbiAgLnItZ3JpcHt3aWR0aDo0MHB4O2hlaWdodDo0cHg7Ym9yZGVyLXJhZGl1czoycHg7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4xOCk7bWFyZ2luOjAgYXV0byAycHg7ZmxleDpub25lfVxuICAuci1oZWFke2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47Z2FwOjEycHh9XG4gIC5yLXN0YXR7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtnYXA6NHB4fVxuICAuci1zdGF0IHNtYWxse2ZvbnQtc2l6ZToxMXB4O2xldHRlci1zcGFjaW5nOi4wOGVtO3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTtjb2xvcjojOWQ5YTkyfVxuICAuci1zdGF0IGJ7Zm9udC1zaXplOjE3cHg7Zm9udC13ZWlnaHQ6NjAwfVxuICAjclBvd2Vye2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjlweDtwYWRkaW5nOjAgMTZweCAwIDEycHg7aGVpZ2h0OjQ4cHg7Ym9yZGVyLXJhZGl1czoyNHB4O2JhY2tncm91bmQ6I2I4NDAyZiAhaW1wb3J0YW50O2NvbG9yOiNmZmYgIWltcG9ydGFudDtib3gtc2hhZG93OjAgNHB4IDE0cHggcmdiYSgxODQsNjQsNDcsLjM1KSxpbnNldCAwIDFweCAwIHJnYmEoMjU1LDI1NSwyNTUsLjIpO2ZvbnQtc2l6ZToxM3B4ICFpbXBvcnRhbnQ7Zm9udC13ZWlnaHQ6NjAwICFpbXBvcnRhbnQ7ZmxleDpub25lfVxuICAjclBvd2VyOmFjdGl2ZXt0cmFuc2Zvcm06c2NhbGUoLjk2KX1cbiAgLnItbGFiZWx7Zm9udC1zaXplOjExcHg7bGV0dGVyLXNwYWNpbmc6LjA4ZW07dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO2NvbG9yOiM5ZDlhOTI7bWFyZ2luOjRweCAycHggLTRweH1cbiAgI3JSb29tc3tkaXNwbGF5OmdyaWQ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOnJlcGVhdCg0LG1pbm1heCgwLDFmcikpO2dhcDo3cHh9XG4gIHRocmVlLWQtc3RhZ2V7dHJhbnNpdGlvbjpoZWlnaHQgLjVzIGN1YmljLWJlemllciguMywuOCwuMiwxKX1cbiAgI3JlbW90ZXtmbGV4Om5vbmUgIWltcG9ydGFudDtoZWlnaHQ6Y2FsYyg2NCUgKyAyMnB4KX1cbiAgYm9keS5scGZvY3VzIHRocmVlLWQtc3RhZ2V7aGVpZ2h0OmNhbGMoMTAwJSArIDIycHgpfVxuICAubHBpY2sub3BlbnthbmltYXRpb246bHBVcCAuNXMgY3ViaWMtYmV6aWVyKC4zLC44LC4yLDEpIC4xcyBib3RofVxuICBAa2V5ZnJhbWVzIGxwVXB7ZnJvbXt0cmFuc2xhdGU6MCAxMTAlfXRve3RyYW5zbGF0ZTowIDB9fVxuICAuci1rZXl7aGVpZ2h0OjQ4cHg7Ym9yZGVyLXJhZGl1czoxNHB4O2JhY2tncm91bmQ6IzJmMmYyYyAhaW1wb3J0YW50O2JveC1zaGFkb3c6aW5zZXQgMCAxcHggMCByZ2JhKDI1NSwyNTUsMjU1LC4wNyksMCAycHggMCAjMGUwZTBkO2ZvbnQtc2l6ZToxMnB4ICFpbXBvcnRhbnQ7cGFkZGluZzowIDRweDt0cmFuc2l0aW9uOmJhY2tncm91bmQgLjE1cyxjb2xvciAuMTVzLHRyYW5zZm9ybSAuMXN9XG4gIC5yLWtleS53aWRle2dyaWQtY29sdW1uOnNwYW4gMn1cbiAgLnIta2V5OmFjdGl2ZXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgxcHgpfVxuICAuci1rZXkub257YmFja2dyb3VuZDojZjJmMWVjICFpbXBvcnRhbnQ7Y29sb3I6IzE0MTQxMiAhaW1wb3J0YW50fVxuICAjclBvdntkaXNwbGF5OmdyaWQ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjFmciAxZnI7Z2FwOjNweDtwYWRkaW5nOjNweDtib3JkZXItcmFkaXVzOjE0cHg7YmFja2dyb3VuZDojMGYwZjBlO3RyYW5zaXRpb246b3BhY2l0eSAuMnN9XG4gICNyUG92IGJ1dHRvbntoZWlnaHQ6NDBweDtib3JkZXItcmFkaXVzOjExcHg7Zm9udC1zaXplOjEzcHggIWltcG9ydGFudDtjb2xvcjojYmRiYWIyICFpbXBvcnRhbnR9XG4gICNyUG92IGJ1dHRvbi5vbntiYWNrZ3JvdW5kOiMzYTNhMzc7Y29sb3I6I2YyZjFlYyAhaW1wb3J0YW50fVxuICAjclBvdi5vZmZ7b3BhY2l0eTouMzU7cG9pbnRlci1ldmVudHM6bm9uZX1cbiAgI3JMaWdodHN7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtnYXA6N3B4fVxuICAuci1sYW1we2Rpc3BsYXk6ZmxleDtnYXA6N3B4fVxuICAuci10b2d7ZmxleDoxO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjEycHg7aGVpZ2h0OjU2cHg7cGFkZGluZzowIDE0cHg7Ym9yZGVyLXJhZGl1czoxNnB4O2JhY2tncm91bmQ6IzJmMmYyYyAhaW1wb3J0YW50O2JveC1zaGFkb3c6aW5zZXQgMCAxcHggMCByZ2JhKDI1NSwyNTUsMjU1LC4wNyksMCAycHggMCAjMGUwZTBkO3RleHQtYWxpZ246bGVmdH1cbiAgLnItdG9nIGl7d2lkdGg6MTJweDtoZWlnaHQ6MTJweDtib3JkZXItcmFkaXVzOjUwJTtiYWNrZ3JvdW5kOiM1NTUzNGU7ZmxleDpub25lO3RyYW5zaXRpb246YmFja2dyb3VuZCAuM3MsYm94LXNoYWRvdyAuM3N9XG4gIC5yLXRvZyBzcGFue2ZsZXg6MTtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2dhcDozcHg7Zm9udC1zaXplOjE0cHh9XG4gIC5yLXRvZyBlbXtmb250LXN0eWxlOm5vcm1hbDtmb250LXNpemU6MTFweDtjb2xvcjojOWQ5YTkyfVxuICAuci10b2cgYnt3aWR0aDozOHB4O2hlaWdodDoyMnB4O2JvcmRlci1yYWRpdXM6MTFweDtiYWNrZ3JvdW5kOiM0YTQ5NDU7cG9zaXRpb246cmVsYXRpdmU7ZmxleDpub25lO3RyYW5zaXRpb246YmFja2dyb3VuZCAuMnN9XG4gIC5yLXRvZyBiOjphZnRlcntjb250ZW50OlwiXCI7cG9zaXRpb246YWJzb2x1dGU7dG9wOjNweDtsZWZ0OjNweDt3aWR0aDoxNnB4O2hlaWdodDoxNnB4O2JvcmRlci1yYWRpdXM6NTAlO2JhY2tncm91bmQ6I2YyZjFlYzt0cmFuc2l0aW9uOnRyYW5zZm9ybSAuMnN9XG4gIC5yLWxhbXAub24gLnItdG9nIGJ7YmFja2dyb3VuZDojZTllNmRlfVxuICAuci1sYW1wLm9uIC5yLXRvZyBiOjphZnRlcnt0cmFuc2Zvcm06dHJhbnNsYXRlWCgxNnB4KTtiYWNrZ3JvdW5kOiMxYjFiMTl9XG4gIC5yLWNvbHt3aWR0aDo1NnB4O2hlaWdodDo1NnB4O2JvcmRlci1yYWRpdXM6MTZweDtiYWNrZ3JvdW5kOiMyZjJmMmMgIWltcG9ydGFudDtib3gtc2hhZG93Omluc2V0IDAgMXB4IDAgcmdiYSgyNTUsMjU1LDI1NSwuMDcpLDAgMnB4IDAgIzBlMGUwZDtkaXNwbGF5OmdyaWQ7cGxhY2UtaXRlbXM6Y2VudGVyO2ZsZXg6bm9uZX1cbiAgLnItY29sOjphZnRlcntjb250ZW50OlwiXCI7d2lkdGg6MjRweDtoZWlnaHQ6MjRweDtib3JkZXItcmFkaXVzOjUwJTtiYWNrZ3JvdW5kOnZhcigtLWMsI2ZmZDZhMCk7Ym94LXNoYWRvdzowIDAgMCAycHggIzFiMWIxOSwwIDAgMCAzcHggcmdiYSgyNTUsMjU1LDI1NSwuMjUpfVxuICAuci10dntkaXNwbGF5OmZsZXg7Z2FwOjdweH1cbiAgLnItdHYub24gLnItdG9nIGJ7YmFja2dyb3VuZDojZTllNmRlfVxuICAuci10di5vbiAuci10b2cgYjo6YWZ0ZXJ7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMTZweCk7YmFja2dyb3VuZDojMWIxYjE5fVxuICAuci10diAuci10b2cgc3Zne2ZsZXg6bm9uZTtjb2xvcjojOWQ5YTkyfVxuICAuci10di5vbiAuci10b2cgLnB3e2ZpbGw6I2U1NDg0ZDtzdHJva2U6I2U1NDg0ZH1cbiAgLnItcmN7Y29sb3I6I2YyZjFlY31cbiAgLnItcmM6OmFmdGVye2Rpc3BsYXk6bm9uZX1cbiAgI3R2VUksI3R2QmFye2Rpc3BsYXk6bm9uZSAhaW1wb3J0YW50fVxuICAjclR2UGFuZWx7ZGlzcGxheTpub25lO2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtnYXA6MTJweH1cbiAgYm9keS50dmZvY3VzICNyZW1vdGUgPiA6bm90KC5yLWdyaXApOm5vdCgjclR2UGFuZWwpe2Rpc3BsYXk6bm9uZSAhaW1wb3J0YW50fVxuICBib2R5LnR2Zm9jdXMgI3JUdlBhbmVse2Rpc3BsYXk6ZmxleDthbmltYXRpb246dHZJbiAuNHMgY3ViaWMtYmV6aWVyKC4zLC44LC4yLDEpIGJvdGh9XG4gIEBrZXlmcmFtZXMgdHZJbntmcm9te29wYWNpdHk6MDt0cmFuc2xhdGU6MCAxMnB4fXRve29wYWNpdHk6MTt0cmFuc2xhdGU6MCAwfX1cbiAgLnR2cC1oZWFke2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweH1cbiAgLnR2cC1oZWFkIC5yLXN0YXR7ZmxleDoxfVxuICAudHZwLWlje3dpZHRoOjQ4cHg7aGVpZ2h0OjQ4cHg7Ym9yZGVyLXJhZGl1czoxNHB4O2Rpc3BsYXk6Z3JpZDtwbGFjZS1pdGVtczpjZW50ZXI7YmFja2dyb3VuZDojMmYyZjJjICFpbXBvcnRhbnQ7Ym94LXNoYWRvdzppbnNldCAwIDFweCAwIHJnYmEoMjU1LDI1NSwyNTUsLjA3KSwwIDJweCAwICMwZTBlMGQ7ZmxleDpub25lfVxuICAudHZwLWljLnBvd3tjb2xvcjojZTU0ODRkfVxuICAjdHZwQXBwc3tkaXNwbGF5OmZsZXg7Z2FwOjdweDtvdmVyZmxvdy14OmF1dG87c2Nyb2xsYmFyLXdpZHRoOm5vbmU7bWFyZ2luOjAgLTE2cHg7cGFkZGluZzoycHggMTZweCA0cHg7c2Nyb2xsLXBhZGRpbmc6MTZweH1cbiAgI3R2cEFwcHM6Oi13ZWJraXQtc2Nyb2xsYmFye2Rpc3BsYXk6bm9uZX1cbiAgI3R2cEFwcHMgYnV0dG9ue2ZsZXg6bm9uZTtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDo5cHg7aGVpZ2h0OjQ0cHg7cGFkZGluZzowIDE2cHggMCAxM3B4O2JvcmRlci1yYWRpdXM6OTk5cHg7d2hpdGUtc3BhY2U6bm93cmFwO2JhY2tncm91bmQ6IzJmMmYyYyAhaW1wb3J0YW50O2JveC1zaGFkb3c6aW5zZXQgMCAxcHggMCByZ2JhKDI1NSwyNTUsMjU1LC4wNyksMCAycHggMCAjMGUwZTBkO2ZvbnQtc2l6ZToxNHB4O3RleHQtYWxpZ246bGVmdH1cbiAgI3R2cEFwcHMgYnV0dG9uIGl7d2lkdGg6MTBweDtoZWlnaHQ6MTBweDtib3JkZXItcmFkaXVzOjUwJTtmbGV4Om5vbmV9XG4gICN0dnBBcHBzIGJ1dHRvbi5vbntiYWNrZ3JvdW5kOiNlOWU2ZGUgIWltcG9ydGFudDtjb2xvcjojMWIxYjE5fVxuICAudHZwLXBhZHtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7Z2FwOmNsYW1wKDEycHgsNXZ3LDI0cHgpO3BhZGRpbmc6NnB4IDAgNHB4fVxuICAudHZwLXZvbCwudHZwLXNpZGV7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47d2lkdGg6NTZweDtoZWlnaHQ6MTg0cHg7cGFkZGluZzo2cHggMDtib3JkZXItcmFkaXVzOjk5OXB4O2JhY2tncm91bmQ6IzJmMmYyYztib3gtc2hhZG93Omluc2V0IDAgMXB4IDAgcmdiYSgyNTUsMjU1LDI1NSwuMDcpLDAgMnB4IDAgIzBlMGUwZDtmbGV4Om5vbmV9XG4gIC50dnAtc2lkZXtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYXJvdW5kfVxuICAudHZwLXZvbCBidXR0b24sLnR2cC1zaWRlIGJ1dHRvbntiYWNrZ3JvdW5kOnRyYW5zcGFyZW50O2NvbG9yOiNmMmYxZWM7d2lkdGg6NDZweDtoZWlnaHQ6NDZweDtib3JkZXItcmFkaXVzOjUwJTtmb250LXNpemU6MjRweCAhaW1wb3J0YW50O2xpbmUtaGVpZ2h0OjE7ZGlzcGxheTpncmlkO3BsYWNlLWl0ZW1zOmNlbnRlcn1cbiAgLnR2cC12b2wgaW5wdXR7ZGlzcGxheTpub25lfVxuICAudHZwLXZvbCBvdXRwdXR7Zm9udC1zaXplOjEzcHg7Y29sb3I6IzlkOWE5Mjtmb250LXZhcmlhbnQtbnVtZXJpYzp0YWJ1bGFyLW51bXN9XG4gICN0dnBNdXRlIC54e2Rpc3BsYXk6bm9uZX1cbiAgI3R2cE11dGUub257Y29sb3I6I2U1NDg0ZH1cbiAgI3R2cE11dGUub24gLnh7ZGlzcGxheTppbmxpbmV9XG4gICN0dnBNdXRlLm9uIC53e2Rpc3BsYXk6bm9uZX1cbiAgLnR2cC1kcGFke3Bvc2l0aW9uOnJlbGF0aXZlO3dpZHRoOjE4NHB4O2hlaWdodDoxODRweDtib3JkZXItcmFkaXVzOjUwJTtmbGV4Om5vbmU7YmFja2dyb3VuZDpyYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IDUwJSAzNSUsIzNhM2EzNiwjMmEyYTI3IDcwJSk7Ym94LXNoYWRvdzppbnNldCAwIDFweCAwIHJnYmEoMjU1LDI1NSwyNTUsLjA4KSwwIDNweCAwICMwZTBlMGQsMCAxMHB4IDI0cHggcmdiYSgwLDAsMCwuMzUpfVxuICAudHZwLWRwYWQgYnV0dG9ue2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6NTZweDtoZWlnaHQ6NTZweDtkaXNwbGF5OmdyaWQ7cGxhY2UtaXRlbXM6Y2VudGVyO2JvcmRlci1yYWRpdXM6NTAlO2NvbG9yOiNkOWQ3ZDB9XG4gIC50dnAtZHBhZCBidXR0b246YWN0aXZle2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwuMDgpfVxuICAudHZwLWRwYWQgLmstdXB7dG9wOjRweDtsZWZ0OjY0cHh9XG4gIC50dnAtZHBhZCAuay1kb3due2JvdHRvbTo0cHg7bGVmdDo2NHB4fVxuICAudHZwLWRwYWQgLmstbGVmdHtsZWZ0OjRweDt0b3A6NjRweH1cbiAgLnR2cC1kcGFkIC5rLXJpZ2h0e3JpZ2h0OjRweDt0b3A6NjRweH1cbiAgLnR2cC1kcGFkIC5rLW9re2xlZnQ6NTJweDt0b3A6NTJweDt3aWR0aDo4MHB4O2hlaWdodDo4MHB4O2JhY2tncm91bmQ6I2U5ZTZkZSAhaW1wb3J0YW50O2NvbG9yOiMxYjFiMTkgIWltcG9ydGFudDtmb250LXNpemU6MTVweCAhaW1wb3J0YW50O2ZvbnQtd2VpZ2h0OjcwMDtsZXR0ZXItc3BhY2luZzouMDRlbTtib3gtc2hhZG93OjAgMnB4IDAgIzhlOGI4NCwwIDZweCAxNHB4IHJnYmEoMCwwLDAsLjM1KX1cbiAgLnR2cC1kcGFkIC5rLW9rOmFjdGl2ZXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgycHgpO2JveC1zaGFkb3c6MCAwIDAgIzhlOGI4NH1cbiAgLnR2cC1kcGFkIC5rLW9rLnBsYXl7YmFja2dyb3VuZDojZTU0ODRkICFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiAhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAycHggMCAjOGYyYTJlLDAgNnB4IDE0cHggcmdiYSgyMjksNzIsNzcsLjQpfVxuICAudHZwLXZvbCBidXR0b246YWN0aXZlLC50dnAtc2lkZSBidXR0b246YWN0aXZle2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwuMDgpfVxuICAudHZwLXZvbCBidXR0b246YWN0aXZlLCN0dnBBcHBzIGJ1dHRvbjphY3RpdmUsLnR2cC1pYzphY3RpdmV7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMXB4KX1cbiAgLnR2cC12b2wgaW5wdXR7ZmxleDoxO21pbi13aWR0aDowO2FjY2VudC1jb2xvcjojZTllNmRlfVxuICAudHZwLXZvbCBvdXRwdXR7d2lkdGg6MjhweDt0ZXh0LWFsaWduOnJpZ2h0O2ZvbnQtc2l6ZToxM3B4O2NvbG9yOiM5ZDlhOTI7Zm9udC12YXJpYW50LW51bWVyaWM6dGFidWxhci1udW1zfVxuICAuci10d297ZGlzcGxheTpncmlkO2dyaWQtdGVtcGxhdGUtY29sdW1uczoxZnIgMWZyO2dhcDo3cHh9XG4gIC5yLXR3byBidXR0b257aGVpZ2h0OjQ4cHg7Ym9yZGVyLXJhZGl1czoxNHB4O2JhY2tncm91bmQ6IzJmMmYyYyAhaW1wb3J0YW50O2JveC1zaGFkb3c6aW5zZXQgMCAxcHggMCByZ2JhKDI1NSwyNTUsMjU1LC4wNyksMCAycHggMCAjMGUwZTBkO2ZvbnQtc2l6ZToxNHB4ICFpbXBvcnRhbnR9XG4gIC5yLXR3byBidXR0b246YWN0aXZlLC5yLXRvZzphY3RpdmUsLnItY29sOmFjdGl2ZXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgxcHgpfVxuPFx1MDAyRnN0eWxlPlxuPFx1MDAyRmhlYWQ+XG48Ym9keT5cblxuPHRocmVlLWQtc3RhZ2UgbmFtZT1cIndvaG51bmdcIiBiYWNrZ3JvdW5kPVwiI2VmZWNlNlwiPjxcdTAwMkZ0aHJlZS1kLXN0YWdlPlxuPGRpdiBpZD1cInJlbW90ZVwiPlxuICA8ZGl2IGNsYXNzPVwici1ncmlwXCI+PFx1MDAyRmRpdj5cbiAgPGRpdiBpZD1cInJUdlBhbmVsXCI+XG4gICAgPGRpdiBjbGFzcz1cInR2cC1oZWFkXCI+PGJ1dHRvbiBjbGFzcz1cInR2cC1pY1wiIGlkPVwidHZwQmFja1wiIGFyaWEtbGFiZWw9XCJadXLDvGNrXCI+PHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgd2lkdGg9XCIyMlwiIGhlaWdodD1cIjIyXCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyLjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cGF0aCBkPVwiTTE1IDVsLTcgNyA3IDdcIj48XHUwMDJGcGF0aD48XHUwMDJGc3ZnPjxcdTAwMkZidXR0b24+PGRpdiBjbGFzcz1cInItc3RhdFwiPjxzbWFsbD5GZXJuc2VoZXI8XHUwMDJGc21hbGw+PGIgaWQ9XCJ0dnBTdGF0XCI+WW91VHViZTxcdTAwMkZiPjxcdTAwMkZkaXY+PGJ1dHRvbiBjbGFzcz1cInR2cC1pYyBwb3dcIiBpZD1cInR2cE9mZlwiIGFyaWEtbGFiZWw9XCJBdXNzY2hhbHRlblwiPjxzdmcgdmlld0JveD1cIjAgMCAyNCAyNFwiIHdpZHRoPVwiMjJcIiBoZWlnaHQ9XCIyMlwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMi40XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiPjxwYXRoIGQ9XCJNMTIgM3Y4XCI+PFx1MDAyRnBhdGg+PHBhdGggZD1cIk02LjMgNi44YTggOCAwIDEgMCAxMS40IDBcIj48XHUwMDJGcGF0aD48XHUwMDJGc3ZnPjxcdTAwMkZidXR0b24+PFx1MDAyRmRpdj5cbiAgICA8ZGl2IGNsYXNzPVwidHZwLXBhZFwiPlxuICAgICAgPGRpdiBjbGFzcz1cInR2cC12b2xcIj48YnV0dG9uIGRhdGEtZD1cIjVcIiBhcmlhLWxhYmVsPVwiTGF1dGVyXCI+KzxcdTAwMkZidXR0b24+PGlucHV0IHR5cGU9XCJyYW5nZVwiIG1pbj1cIjBcIiBtYXg9XCIxMDBcIiBzdGVwPVwiMVwiIGFyaWEtbGFiZWw9XCJMYXV0c3TDpHJrZVwiPjxvdXRwdXQ+PFx1MDAyRm91dHB1dD48YnV0dG9uIGRhdGEtZD1cIi01XCIgYXJpYS1sYWJlbD1cIkxlaXNlclwiPuKIkjxcdTAwMkZidXR0b24+PFx1MDAyRmRpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0dnAtZHBhZFwiPjxidXR0b24gZGF0YS1rPVwidXBcIiBjbGFzcz1cImstdXBcIiBhcmlhLWxhYmVsPVwiTGF1dGVyXCI+PHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgd2lkdGg9XCIyMlwiIGhlaWdodD1cIjIyXCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyLjRcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHlsZT1cInRyYW5zZm9ybTpyb3RhdGUoMGRlZylcIj48cGF0aCBkPVwiTTYgMTVsNi02IDYgNlwiPjxcdTAwMkZwYXRoPjxcdTAwMkZzdmc+PFx1MDAyRmJ1dHRvbj48YnV0dG9uIGRhdGEtaz1cInJpZ2h0XCIgY2xhc3M9XCJrLXJpZ2h0XCIgYXJpYS1sYWJlbD1cIk7DpGNoc3RlIEFwcFwiPjxzdmcgdmlld0JveD1cIjAgMCAyNCAyNFwiIHdpZHRoPVwiMjJcIiBoZWlnaHQ9XCIyMlwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMi40XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3R5bGU9XCJ0cmFuc2Zvcm06cm90YXRlKDkwZGVnKVwiPjxwYXRoIGQ9XCJNNiAxNWw2LTYgNiA2XCI+PFx1MDAyRnBhdGg+PFx1MDAyRnN2Zz48XHUwMDJGYnV0dG9uPjxidXR0b24gZGF0YS1rPVwiZG93blwiIGNsYXNzPVwiay1kb3duXCIgYXJpYS1sYWJlbD1cIkxlaXNlclwiPjxzdmcgdmlld0JveD1cIjAgMCAyNCAyNFwiIHdpZHRoPVwiMjJcIiBoZWlnaHQ9XCIyMlwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMi40XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3R5bGU9XCJ0cmFuc2Zvcm06cm90YXRlKDE4MGRlZylcIj48cGF0aCBkPVwiTTYgMTVsNi02IDYgNlwiPjxcdTAwMkZwYXRoPjxcdTAwMkZzdmc+PFx1MDAyRmJ1dHRvbj48YnV0dG9uIGRhdGEtaz1cImxlZnRcIiBjbGFzcz1cImstbGVmdFwiIGFyaWEtbGFiZWw9XCJWb3JoZXJpZ2UgQXBwXCI+PHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgd2lkdGg9XCIyMlwiIGhlaWdodD1cIjIyXCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyLjRcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHlsZT1cInRyYW5zZm9ybTpyb3RhdGUoMjcwZGVnKVwiPjxwYXRoIGQ9XCJNNiAxNWw2LTYgNiA2XCI+PFx1MDAyRnBhdGg+PFx1MDAyRnN2Zz48XHUwMDJGYnV0dG9uPjxidXR0b24gZGF0YS1rPVwib2tcIiBjbGFzcz1cImstb2tcIiBpZD1cInR2cE9rXCI+T0s8XHUwMDJGYnV0dG9uPjxcdTAwMkZkaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwidHZwLXNpZGVcIj48YnV0dG9uIGlkPVwidHZwTXV0ZVwiIGFyaWEtbGFiZWw9XCJTdHVtbVwiPjxzdmcgdmlld0JveD1cIjAgMCAyNCAyNFwiIHdpZHRoPVwiMjJcIiBoZWlnaHQ9XCIyMlwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwYXRoIGQ9XCJNNCA5aDRsNS00djE0bC01LTRINHpcIj48XHUwMDJGcGF0aD48cGF0aCBjbGFzcz1cIndcIiBkPVwiTTE2LjUgOC41YTUgNSAwIDAgMSAwIDdcIj48XHUwMDJGcGF0aD48cGF0aCBjbGFzcz1cInhcIiBkPVwiTTE2IDlsNSA2TTIxIDlsLTUgNlwiPjxcdTAwMkZwYXRoPjxcdTAwMkZzdmc+PFx1MDAyRmJ1dHRvbj48YnV0dG9uIGlkPVwidHZwSG9tZVwiIGFyaWEtbGFiZWw9XCJTdGFydHNlaXRlXCI+PHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgd2lkdGg9XCIyMlwiIGhlaWdodD1cIjIyXCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBhdGggZD1cIk00IDExbDgtNyA4IDd2OUg0elwiPjxcdTAwMkZwYXRoPjxcdTAwMkZzdmc+PFx1MDAyRmJ1dHRvbj48XHUwMDJGZGl2PlxuICAgIDxcdTAwMkZkaXY+XG4gICAgPGRpdiBjbGFzcz1cInItbGFiZWxcIj5BcHBzPFx1MDAyRmRpdj5cbiAgICA8ZGl2IGlkPVwidHZwQXBwc1wiPjxcdTAwMkZkaXY+XG4gIDxcdTAwMkZkaXY+XG4gIDxkaXYgY2xhc3M9XCJyLWhlYWRcIj5cbiAgICA8ZGl2IGNsYXNzPVwici1zdGF0XCI+PHNtYWxsPldvaG51bmc8XHUwMDJGc21hbGw+PGIgaWQ9XCJyU3RhdFwiPkFsbGUgTGljaHRlciBhdXM8XHUwMDJGYj48XHUwMDJGZGl2PlxuICAgIDxidXR0b24gaWQ9XCJyUG93ZXJcIiBhcmlhLWxhYmVsPVwiV29obnVuZyB2ZXJsYXNzZW5cIj48c3ZnIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiB3aWR0aD1cIjIyXCIgaGVpZ2h0PVwiMjJcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjIuNFwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIj48cGF0aCBkPVwiTTEyIDN2OFwiPjxcdTAwMkZwYXRoPjxwYXRoIGQ9XCJNNi4zIDYuOGE4IDggMCAxIDAgMTEuNCAwXCI+PFx1MDAyRnBhdGg+PFx1MDAyRnN2Zz48c3Bhbj5Xb2hudW5nIHZlcmxhc3NlbjxcdTAwMkZzcGFuPjxcdTAwMkZidXR0b24+XG4gIDxcdTAwMkZkaXY+XG4gIDxkaXYgY2xhc3M9XCJyLWxhYmVsXCI+UsOkdW1lPFx1MDAyRmRpdj5cbiAgPGRpdiBpZD1cInJSb29tc1wiPjxcdTAwMkZkaXY+XG4gIDxkaXYgY2xhc3M9XCJyLWxhYmVsXCIgaWQ9XCJyTGlnaHRzTGJsXCI+TGljaHQ8XHUwMDJGZGl2PlxuICA8ZGl2IGlkPVwickxpZ2h0c1wiPlxuICAgIDxkaXYgY2xhc3M9XCJyLWxhbXBcIiBkYXRhLWw9XCJib2dlblwiIGRhdGEtcm9vbT1cIjFcIj48YnV0dG9uIGNsYXNzPVwici10b2dcIj48aT48XHUwMDJGaT48c3Bhbj5Cb2dlbmxhbXBlPGVtPldvaG56aW1tZXI8XHUwMDJGZW0+PFx1MDAyRnNwYW4+PGI+PFx1MDAyRmI+PFx1MDAyRmJ1dHRvbj48YnV0dG9uIGNsYXNzPVwici1jb2xcIiBhcmlhLWxhYmVsPVwiRmFyYmVcIj48XHUwMDJGYnV0dG9uPjxcdTAwMkZkaXY+XG4gICAgPGRpdiBjbGFzcz1cInItbGFtcFwiIGRhdGEtbD1cImRvbnV0XCIgZGF0YS1yb29tPVwiMVwiPjxidXR0b24gY2xhc3M9XCJyLXRvZ1wiPjxpPjxcdTAwMkZpPjxzcGFuPkRvbnV0LUxhbXBlPGVtPldvaG56aW1tZXIgwrcgUmVnYWw8XHUwMDJGZW0+PFx1MDAyRnNwYW4+PGI+PFx1MDAyRmI+PFx1MDAyRmJ1dHRvbj48XHUwMDJGZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJyLWxhbXBcIiBkYXRhLWw9XCJ0cmlwXCIgZGF0YS1yb29tPVwiM1wiPjxidXR0b24gY2xhc3M9XCJyLXRvZ1wiPjxpPjxcdTAwMkZpPjxzcGFuPlRyaXBvZC1MYW1wZTxlbT5TY2hsYWZ6aW1tZXI8XHUwMDJGZW0+PFx1MDAyRnNwYW4+PGI+PFx1MDAyRmI+PFx1MDAyRmJ1dHRvbj48YnV0dG9uIGNsYXNzPVwici1jb2xcIiBhcmlhLWxhYmVsPVwiRmFyYmVcIj48XHUwMDJGYnV0dG9uPjxcdTAwMkZkaXY+XG4gIDxcdTAwMkZkaXY+XG4gIDxkaXYgY2xhc3M9XCJyLWxhYmVsXCIgaWQ9XCJyVHZMYmxcIj5GZXJuc2VoZXI8XHUwMDJGZGl2PlxuICA8ZGl2IGNsYXNzPVwici10dlwiIGlkPVwiclR2XCI+PGJ1dHRvbiBjbGFzcz1cInItdG9nXCIgaWQ9XCJyVHZQb3dcIj48c3ZnIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNlwiPjxyZWN0IHg9XCI3LjVcIiB5PVwiMi41XCIgd2lkdGg9XCI5XCIgaGVpZ2h0PVwiMTlcIiByeD1cIjNcIj48XHUwMDJGcmVjdD48Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjdcIiByPVwiMS42XCIgY2xhc3M9XCJwd1wiPjxcdTAwMkZjaXJjbGU+PGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMi41XCIgcj1cIjIuMlwiPjxcdTAwMkZjaXJjbGU+PFx1MDAyRnN2Zz48c3Bhbj5GZXJuc2VoZXI8ZW0+V29obnppbW1lciDCtyBXZXN0d2FuZDxcdTAwMkZlbT48XHUwMDJGc3Bhbj48Yj48XHUwMDJGYj48XHUwMDJGYnV0dG9uPjxidXR0b24gY2xhc3M9XCJyLWNvbCByLXJjXCIgaWQ9XCJyVHZPcGVuXCIgYXJpYS1sYWJlbD1cIkZlcm5iZWRpZW51bmcgw7ZmZm5lblwiPjxzdmcgdmlld0JveD1cIjAgMCAyNCAyNFwiIHdpZHRoPVwiMjJcIiBoZWlnaHQ9XCIyMlwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS42XCI+PHJlY3QgeD1cIjcuNVwiIHk9XCIyLjVcIiB3aWR0aD1cIjlcIiBoZWlnaHQ9XCIxOVwiIHJ4PVwiM1wiPjxcdTAwMkZyZWN0PjxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiN1wiIHI9XCIxLjZcIiBmaWxsPVwiI2U1NDg0ZFwiIHN0cm9rZT1cIiNlNTQ4NGRcIj48XHUwMDJGY2lyY2xlPjxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTIuNVwiIHI9XCIyLjJcIj48XHUwMDJGY2lyY2xlPjxjaXJjbGUgY3g9XCIxMC4zXCIgY3k9XCIxNy4zXCIgcj1cIi42XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiPjxcdTAwMkZjaXJjbGU+PGNpcmNsZSBjeD1cIjEzLjdcIiBjeT1cIjE3LjNcIiByPVwiLjZcIiBmaWxsPVwiY3VycmVudENvbG9yXCI+PFx1MDAyRmNpcmNsZT48XHUwMDJGc3ZnPjxcdTAwMkZidXR0b24+PFx1MDAyRmRpdj5cbiAgPGRpdiBjbGFzcz1cInItdHdvXCI+PGJ1dHRvbiBpZD1cInJBbGxPblwiPkFsbGUgYW48XHUwMDJGYnV0dG9uPjxidXR0b24gaWQ9XCJyQWxsT2ZmXCI+QWxsZXMgYXVzPFx1MDAyRmJ1dHRvbj48XHUwMDJGZGl2PlxuPFx1MDAyRmRpdj5cbjxkaXYgaWQ9XCJyb29tc1wiPjxcdTAwMkZkaXY+XG48ZGl2IGlkPVwicG92XCI+PGJ1dHRvbiBkYXRhLW09XCJiaXJkXCIgY2xhc3M9XCJvblwiPlZvZ2VscGVyc3Bla3RpdmU8XHUwMDJGYnV0dG9uPjxidXR0b24gZGF0YS1tPVwiZnBcIj5GcmVpIHVtc2VoZW48XHUwMDJGYnV0dG9uPjxcdTAwMkZkaXY+XG48YnV0dG9uIGlkPVwicnRcIiBhcmlhLXByZXNzZWQ9XCJmYWxzZVwiPjxpPjxcdTAwMkZpPjxzcGFuPlJlbmRlciBhdXM8XHUwMDJGc3Bhbj48XHUwMDJGYnV0dG9uPlxuPGRpdiBpZD1cInB0XCI+PFx1MDAyRmRpdj5cbjxkaXYgaWQ9XCJsYW1wXCI+PGJ1dHRvbiBpZD1cImxhbXBUXCI+PGk+PFx1MDAyRmk+PHNwYW4+Qm9nZW5sYW1wZSBhbjxcdTAwMkZzcGFuPjxcdTAwMkZidXR0b24+PGRpdiBpZD1cImxhbXBDdGxcIj48ZGl2IGlkPVwibGFtcFN3XCI+PFx1MDAyRmRpdj48bGFiZWwgaWQ9XCJsYW1wRGltXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmVcIj48c3Bhbj5TdMOkcmtlPFx1MDAyRnNwYW4+PGlucHV0IHR5cGU9XCJyYW5nZVwiIG1pbj1cIjEwXCIgbWF4PVwiMjAwXCIgc3RlcD1cIjVcIiB2YWx1ZT1cIjEwMFwiPjxvdXRwdXQ+MTAwJTxcdTAwMkZvdXRwdXQ+PFx1MDAyRmxhYmVsPjxcdTAwMkZkaXY+PGJ1dHRvbiBpZD1cImxhbXBEXCIgYXJpYS1wcmVzc2VkPVwiZmFsc2VcIj48Yj48XHUwMDJGYj48c3Bhbj5Eb251dC1MYW1wZSBhbjxcdTAwMkZzcGFuPjxcdTAwMkZidXR0b24+PGJ1dHRvbiBpZD1cInR2QlwiIGFyaWEtcHJlc3NlZD1cImZhbHNlXCIgdGl0bGU9XCJGZXJuc2VoZXIgYW4vYXVzXCI+PHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjZcIj48cmVjdCB4PVwiNy41XCIgeT1cIjIuNVwiIHdpZHRoPVwiOVwiIGhlaWdodD1cIjE5XCIgcng9XCIzXCI+PFx1MDAyRnJlY3Q+PGNpcmNsZSBjeD1cIjEyXCIgY3k9XCI3XCIgcj1cIjEuNlwiIGNsYXNzPVwicHdcIj48XHUwMDJGY2lyY2xlPjxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTIuNVwiIHI9XCIyLjJcIj48XHUwMDJGY2lyY2xlPjxjaXJjbGUgY3g9XCIxMC4zXCIgY3k9XCIxNy4zXCIgcj1cIi42XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiPjxcdTAwMkZjaXJjbGU+PGNpcmNsZSBjeD1cIjEzLjdcIiBjeT1cIjE3LjNcIiByPVwiLjZcIiBmaWxsPVwiY3VycmVudENvbG9yXCI+PFx1MDAyRmNpcmNsZT48XHUwMDJGc3ZnPjxzcGFuPkZlcm5zZWhlciBhbjxcdTAwMkZzcGFuPjxcdTAwMkZidXR0b24+PFx1MDAyRmRpdj5cbjxkaXYgaWQ9XCJ0dlVJXCI+PGRpdiBjbGFzcz1cInR2LWhlcm9cIj48c21hbGw+WnVsZXR6dCBnZcO2ZmZuZXQ8XHUwMDJGc21hbGw+PGgyPjxcdTAwMkZoMj48XHUwMDJGZGl2PjxuYXYgY2xhc3M9XCJ0di1uYXZcIj48XHUwMDJGbmF2PjxkaXYgY2xhc3M9XCJ0di12b2xcIj48YnV0dG9uIGNsYXNzPVwidHYtdmJcIiBkYXRhLWQ9XCI1XCIgYXJpYS1sYWJlbD1cIkxhdXRlclwiPis8XHUwMDJGYnV0dG9uPjxpbnB1dCB0eXBlPVwicmFuZ2VcIiBtaW49XCIwXCIgbWF4PVwiMTAwXCIgc3RlcD1cIjFcIiBhcmlhLWxhYmVsPVwiTGF1dHN0w6Rya2VcIj48YnV0dG9uIGNsYXNzPVwidHYtdmJcIiBkYXRhLWQ9XCItNVwiIGFyaWEtbGFiZWw9XCJMZWlzZXJcIj7iiJI8XHUwMDJGYnV0dG9uPjxvdXRwdXQ+PFx1MDAyRm91dHB1dD48XHUwMDJGZGl2PjxcdTAwMkZkaXY+XG48ZGl2IGlkPVwidHZCYXJcIj48YnV0dG9uIGlkPVwidHZCYWNrXCI+WnVyw7xjazxcdTAwMkZidXR0b24+PGJ1dHRvbiBpZD1cInR2T2ZmXCI+PHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjZcIj48cmVjdCB4PVwiNy41XCIgeT1cIjIuNVwiIHdpZHRoPVwiOVwiIGhlaWdodD1cIjE5XCIgcng9XCIzXCI+PFx1MDAyRnJlY3Q+PGNpcmNsZSBjeD1cIjEyXCIgY3k9XCI3XCIgcj1cIjEuNlwiIGZpbGw9XCIjZTU0ODRkXCIgc3Ryb2tlPVwiI2U1NDg0ZFwiPjxcdTAwMkZjaXJjbGU+PGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMi41XCIgcj1cIjIuMlwiPjxcdTAwMkZjaXJjbGU+PGNpcmNsZSBjeD1cIjEwLjNcIiBjeT1cIjE3LjNcIiByPVwiLjZcIiBmaWxsPVwiY3VycmVudENvbG9yXCI+PFx1MDAyRmNpcmNsZT48Y2lyY2xlIGN4PVwiMTMuN1wiIGN5PVwiMTcuM1wiIHI9XCIuNlwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIj48XHUwMDJGY2lyY2xlPjxcdTAwMkZzdmc+PHNwYW4+QXVzc2NoYWx0ZW48XHUwMDJGc3Bhbj48XHUwMDJGYnV0dG9uPjxcdTAwMkZkaXY+XG48ZGl2IGlkPVwibGFtcDJcIj48YnV0dG9uIGlkPVwidHJpcFRcIj48aT48XHUwMDJGaT48c3Bhbj5Ucmlwb2QtTGFtcGUgYW48XHUwMDJGc3Bhbj48XHUwMDJGYnV0dG9uPjxkaXYgaWQ9XCJ0cmlwQ3RsXCI+PGxhYmVsPjxidXR0b24gaWQ9XCJ0cmlwQ29sXCIgY2xhc3M9XCJscC1zd1wiIHRpdGxlPVwiTGljaHQgZWluc3RlbGxlblwiPjxcdTAwMkZidXR0b24+PFx1MDAyRmxhYmVsPjxsYWJlbCBzdHlsZT1cImRpc3BsYXk6bm9uZVwiPjxzcGFuPlN0w6Rya2U8XHUwMDJGc3Bhbj48aW5wdXQgaWQ9XCJ0cmlwRGltXCIgdHlwZT1cInJhbmdlXCIgbWluPVwiMTBcIiBtYXg9XCIyMDBcIiBzdGVwPVwiNVwiIHZhbHVlPVwiMTAwXCI+PG91dHB1dD4xMDAlPFx1MDAyRm91dHB1dD48XHUwMDJGbGFiZWw+PGxhYmVsPjxzcGFuPktlZ2VsPFx1MDAyRnNwYW4+PGlucHV0IGlkPVwidHJpcENvbmVcIiB0eXBlPVwicmFuZ2VcIiBtaW49XCIxNVwiIG1heD1cIjgwXCIgc3RlcD1cIjFcIiB2YWx1ZT1cIjMyXCI+PG91dHB1dD4zMsKwPFx1MDAyRm91dHB1dD48XHUwMDJGbGFiZWw+PFx1MDAyRmRpdj48XHUwMDJGZGl2PlxuPHNjcmlwdCBzcmM9XCI5NWQ3YzcwZC0wZGEzLTRlZTEtYWY2NS0xOGY3M2M3NGU0ZWJcIj48XHUwMDJGc2NyaXB0PlxuPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4vLyBtb2ViZWwuanMgKGVpbmdlYmV0dGV0KVxuLy8gTcO2YmVsLUJ1aWxkZXIgKGF1cyBTb2ZhIDNEIC8gUmVnYWwgM0QgLyBCb2dlbmxhbXBlIDNEIMO8YmVybm9tbWVuKVxuY29uc3QgbWsgPSAoVEhSRUUsIG5hbWUsIGdlbywgbWF0LCB4PTAsIHk9MCwgej0wKSA9PiB7IGNvbnN0IG0gPSBuZXcgVEhSRUUuTWVzaChnZW8sIG1hdCk7IG0ubmFtZT1uYW1lOyBtLnBvc2l0aW9uLnNldCh4LHkseik7IHJldHVybiBtOyB9O1xuXG5mdW5jdGlvbiBidWlsZFNvZmEoVEhSRUUpe1xuICBjb25zdCBNID0ge1xuICAgIGZhYnJpYzogbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgbmFtZToncG9seV93b29sX2hlcnJpbmdib25lJywgY29sb3I6MHg4Yjg3ODAsIHJvdWdobmVzczowLjk1IH0pLFxuICAgIG1ldGFsOiAgbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgbmFtZTonYmxhY2tfcG93ZGVyY29hdCcsIGNvbG9yOjB4MWQxZDFmLCByb3VnaG5lc3M6MC40NSwgbWV0YWxuZXNzOjAuNiB9KSxcbiAgICBjdXA6ICAgIG5ldyBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCh7IG5hbWU6J2N1cGhvbGRlcl9ibGFjaycsIGNvbG9yOjB4MTUxNTE1LCByb3VnaG5lc3M6MC44IH0pLFxuICB9O1xuICBjb25zdCBURVggPSAwLjU7XG4gIGZ1bmN0aW9uIHJib3godywgaCwgZCwgciwgayA9IDcsIGJ1bGdlID0gMCl7XG4gICAgY29uc3QgaGFsZiA9IFt3LzIsIGgvMiwgZC8yXTtcbiAgICBjb25zdCBTID0gaGFsZi5tYXAoaGggPT4geyBjb25zdCBhPVtdOyBmb3IobGV0IGk9aztpPj0wO2ktLSkgYS5wdXNoKC0oaGgtcikgLSByKk1hdGguc2luKGkvaypNYXRoLlBJLzIpKTsgZm9yKGxldCBpPTA7aTw9aztpKyspIGEucHVzaCgoaGgtcikgKyByKk1hdGguc2luKGkvaypNYXRoLlBJLzIpKTsgcmV0dXJuIGE7IH0pO1xuICAgIGNvbnN0IHBvcz1bXSwgbm9yPVtdLCB1dj1bXSwgaWR4PVtdO1xuICAgIGZvciAobGV0IGE9MDthPDM7YSsrKSBmb3IgKGNvbnN0IHMgb2YgWzEsLTFdKXtcbiAgICAgIGNvbnN0IHU9KGErMSklMywgdj0oYSsyKSUzLCBzdT1TW3VdLCBzdj1TW3ZdLCBiYXNlPXBvcy5sZW5ndGgvMztcbiAgICAgIGZvciAobGV0IGo9MDtqPHN2Lmxlbmd0aDtqKyspIGZvciAobGV0IGk9MDtpPHN1Lmxlbmd0aDtpKyspe1xuICAgICAgICBjb25zdCBwPVswLDAsMF07IHBbYV09cypoYWxmW2FdOyBwW3VdPXN1W2ldOyBwW3ZdPXN2W2pdO1xuICAgICAgICBjb25zdCBjPXAubWFwKCh4LG0pPT5NYXRoLm1heCgtKGhhbGZbbV0tciksTWF0aC5taW4oaGFsZlttXS1yLHgpKSk7XG4gICAgICAgIGxldCBvPXAubWFwKCh4LG0pPT54LWNbbV0pOyBjb25zdCBMPU1hdGguaHlwb3QoLi4ubyl8fDE7IG89by5tYXAoeD0+eC9MKTtcbiAgICAgICAgY29uc3QgcT1jLm1hcCgoeCxtKT0+eCtvW21dKnIpO1xuICAgICAgICBwb3MucHVzaCguLi5xKTsgbm9yLnB1c2goLi4ubyk7XG4gICAgICAgIGNvbnN0IGF4PU1hdGguYWJzKG9bMF0pLGF5PU1hdGguYWJzKG9bMV0pLGF6PU1hdGguYWJzKG9bMl0pO1xuICAgICAgICBpZiAoYXk+PWF4JiZheT49YXopIHV2LnB1c2gocVswXS9URVgscVsyXS9URVgpOyBlbHNlIGlmIChheD49YXopIHV2LnB1c2gocVsyXS9URVgscVsxXS9URVgpOyBlbHNlIHV2LnB1c2gocVswXS9URVgscVsxXS9URVgpO1xuICAgICAgfVxuICAgICAgY29uc3QgbnU9c3UubGVuZ3RoO1xuICAgICAgZm9yIChsZXQgaj0wO2o8c3YubGVuZ3RoLTE7aisrKSBmb3IgKGxldCBpPTA7aTxudS0xO2krKyl7XG4gICAgICAgIGNvbnN0IEE9YmFzZStqKm51K2ksIEI9QSsxLCBDPUErbnUrMSwgRD1BK251O1xuICAgICAgICBpZiAocz4wKSBpZHgucHVzaChBLEIsQywgQSxDLEQpOyBlbHNlIGlkeC5wdXNoKEEsQyxCLCBBLEQsQyk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGcgPSBuZXcgVEhSRUUuQnVmZmVyR2VvbWV0cnkoKTtcbiAgICBnLnNldEF0dHJpYnV0ZSgncG9zaXRpb24nLCBuZXcgVEhSRUUuRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZShwb3MsMykpO1xuICAgIGcuc2V0QXR0cmlidXRlKCdub3JtYWwnLCBuZXcgVEhSRUUuRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZShub3IsMykpO1xuICAgIGcuc2V0QXR0cmlidXRlKCd1dicsIG5ldyBUSFJFRS5GbG9hdDMyQnVmZmVyQXR0cmlidXRlKHV2LDIpKTtcbiAgICBnLnNldEluZGV4KGlkeCk7XG4gICAgaWYgKGJ1bGdlKXtcbiAgICAgIGNvbnN0IHA9Zy5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuICAgICAgZm9yIChsZXQgaT0wO2k8cC5jb3VudDtpKyspeyBjb25zdCB4PXAuZ2V0WChpKS9oYWxmWzBdLCB5PXAuZ2V0WShpKS9oYWxmWzFdOyBwLnNldFooaSwgcC5nZXRaKGkpKigxK2J1bGdlKigxLXgqeCkqKDEteSp5KSkpOyB9XG4gICAgICBnLmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCk7XG4gICAgfVxuICAgIHJldHVybiBnO1xuICB9XG4gIGNvbnN0IG1lc2ggPSAoLi4uYSkgPT4gbWsoVEhSRUUsIC4uLmEpO1xuICBjb25zdCBXPTEuODUsIEQ9MC45MjUsIEw9MC4yMCwgQVJNPTAuMjQsIFRPUD0wLjIxLCBHPTAuMDA0O1xuICBjb25zdCBzb2ZhID0gbmV3IFRIUkVFLkdyb3VwKCk7IHNvZmEubmFtZSA9ICdzb2ZhJztcbiAgZm9yIChjb25zdCBbaSxzeF0gb2YgW1sxLC0xXSxbMiwxXV0pXG4gICAgc29mYS5hZGQobWVzaCgnbGFnZV91bnRlbl8nK2ksIHJib3goVy8yLUcsIEwtRywgRCwgMC4wMzUpLCBNLmZhYnJpYywgc3gqVy80LCBMLzIsIDApKTtcbiAgY29uc3QgaGluZ2UgPSBuZXcgVEhSRUUuR3JvdXAoKTsgaGluZ2UubmFtZT0na2xhcHB0ZWlsJzsgaGluZ2UucG9zaXRpb24uc2V0KDAsIEwsIEQvMik7XG4gIGZvciAoY29uc3QgW2ksc3hdIG9mIFtbMSwtMV0sWzIsMV1dKVxuICAgIGhpbmdlLmFkZChtZXNoKCdsYWdlX21pdHRlXycraSwgcmJveChXLzItRywgTC1HLCBELCAwLjAzNSksIE0uZmFicmljLCBzeCpXLzQsIEwvMiwgLUQvMikpO1xuICBzb2ZhLmFkZChoaW5nZSk7XG4gIGNvbnN0IHRvcCA9IG5ldyBUSFJFRS5Hcm91cCgpOyB0b3AubmFtZT0nYXVmYmF1JzsgdG9wLnBvc2l0aW9uLnkgPSAyKkw7XG4gIGZvciAoY29uc3QgW24sc3hdIG9mIFtbJ2xpbmtzJywtMV0sWydyZWNodHMnLDFdXSl7XG4gICAgY29uc3QgeCA9IHN4KihXLzItQVJNLzIpO1xuICAgIHRvcC5hZGQobWVzaCgnYXJtbGVobmVfJytuLCByYm94KEFSTSwgVE9QLCBELCAwLjA1KSwgTS5mYWJyaWMsIHgsIFRPUC8yLCAwKSk7XG4gICAgdG9wLmFkZChtZXNoKCdiZWNoZXJoYWx0ZXJfJytuLCBuZXcgVEhSRUUuQ3lsaW5kZXJHZW9tZXRyeSgwLjA0LDAuMDQsMC4wMTIsNDApLCBNLmN1cCwgeCwgVE9QKzAuMDAxLCBELzItMC4xKSk7XG4gICAgY29uc3QgcmluZyA9IG1lc2goJ2JlY2hlcmhhbHRlcl9yaW5nXycrbiwgbmV3IFRIUkVFLlRvcnVzR2VvbWV0cnkoMC4wNDIsMC4wMDUsMTIsNDApLCBNLm1ldGFsLCB4LCBUT1ArMC4wMDQsIEQvMi0wLjEpO1xuICAgIHJpbmcucm90YXRpb24ueCA9IE1hdGguUEkvMjsgdG9wLmFkZChyaW5nKTtcbiAgfVxuICBjb25zdCBiYWNrVyA9IChXLTIqQVJNKS8yIC0gRztcbiAgZm9yIChjb25zdCBbaSxzeF0gb2YgW1sxLC0xXSxbMiwxXV0pe1xuICAgIHRvcC5hZGQobWVzaCgncnVlY2tlbnRlaWxfJytpLCByYm94KGJhY2tXLCBUT1AsIEFSTSwgMC4wNSksIE0uZmFicmljLCBzeCooYmFja1cvMitHLzIpLCBUT1AvMiwgLUQvMitBUk0vMikpO1xuICAgIGNvbnN0IHAgPSBtZXNoKCdraXNzZW5fJytpLCByYm94KDAuNDUsIDAuNDUsIDAuMTAsIDAuMDQsIDcsIDAuNiksIE0uZmFicmljLCBzeCowLjMzLCAwLjIyLCAtRC8yK0FSTSswLjA4KTtcbiAgICBwLnJvdGF0aW9uLnggPSAtMC4yODsgcC5yb3RhdGlvbi56ID0gc3gqMC4wNjsgdG9wLmFkZChwKTtcbiAgfVxuICBzb2ZhLmFkZCh0b3ApO1xuICBjb25zdCBmejAgPSAtMC4wNSwgZnoxID0gMC4zMCwgZmggPSAwLjM0LCByciA9IDAuMDA4LCBSID0gMC4wNDUsIHkwID0gMC4wMiwgeXQgPSB5MCArIGZoO1xuICBmb3IgKGNvbnN0IFtuLHN4XSBvZiBbWydsaW5rcycsLTFdLFsncmVjaHRzJywxXV0pe1xuICAgIGNvbnN0IGZyYW1lID0gbmV3IFRIUkVFLkdyb3VwKCk7IGZyYW1lLm5hbWU9J3NlaXRlbmdlc3RlbGxfJytuO1xuICAgIGNvbnN0IGZ4ID0gc3gqKFcvMiArIDAuMDEyKTtcbiAgICBmb3IgKGNvbnN0IHogb2YgW2Z6MCwgZnoxXSkgZnJhbWUuYWRkKG1lc2goJ2dlc3RlbGxfc3RhYl8nK24sIG5ldyBUSFJFRS5DeWxpbmRlckdlb21ldHJ5KHJyLHJyLGZoLVIsMjApLCBNLm1ldGFsLCBmeCwgeTArKGZoLVIpLzIsIHopKTtcbiAgICBjb25zdCBiYXIgPSBtZXNoKCdnZXN0ZWxsX3F1ZXJfJytuLCBuZXcgVEhSRUUuQ3lsaW5kZXJHZW9tZXRyeShycixycixmejEtZnowLTIqUiwyMCksIE0ubWV0YWwsIGZ4LCB5dCwgKGZ6MCtmejEpLzIpOyBiYXIucm90YXRpb24ueD1NYXRoLlBJLzI7IGZyYW1lLmFkZChiYXIpO1xuICAgIGZvciAoY29uc3QgW3oscnldIG9mIFtbZnowK1IsIE1hdGguUEkvMl0sW2Z6MS1SLCAtTWF0aC5QSS8yXV0pe1xuICAgICAgY29uc3QgYyA9IG1lc2goJ2dlc3RlbGxfYm9nZW5fJytuLCBuZXcgVEhSRUUuVG9ydXNHZW9tZXRyeShSLCByciwgMTYsIDI0LCBNYXRoLlBJLzIpLCBNLm1ldGFsLCBmeCwgeXQtUiwgeik7IGMucm90YXRpb24ueSA9IHJ5OyBmcmFtZS5hZGQoYyk7XG4gICAgfVxuICAgIHNvZmEuYWRkKGZyYW1lKTtcbiAgfVxuICByZXR1cm4geyBncm91cDogc29mYSwgTSwgRCB9O1xufVxuXG5mdW5jdGlvbiBidWlsZFJlZ2FsKFRIUkVFLCBNKXtcbiAgY29uc3QgYm94ID0gKHcsIGgsIGQpID0+IHtcbiAgICBjb25zdCBnID0gbmV3IFRIUkVFLkJveEdlb21ldHJ5KHcsIGgsIGQpLCB1diA9IGcuYXR0cmlidXRlcy51djtcbiAgICBjb25zdCBmYWNlcyA9IFtbZCxoXSxbZCxoXSxbdyxkXSxbdyxkXSxbdyxoXSxbdyxoXV07XG4gICAgZm9yIChsZXQgZj0wOyBmPDY7IGYrKykgZm9yIChsZXQgaT0wO2k8NDtpKyspeyBjb25zdCBrPWYqNCtpOyB1di5zZXRYWShrLCB1di5nZXRYKGspKmZhY2VzW2ZdWzBdLCB1di5nZXRZKGspKmZhY2VzW2ZdWzFdKTsgfVxuICAgIHJldHVybiBnO1xuICB9O1xuICBjb25zdCBtZXNoID0gKC4uLmEpID0+IG1rKFRIUkVFLCAuLi5hKTtcbiAgY29uc3QgVz0wLjYwLCBEPTAuMjcsIEg9MC43NCwgQT0wLjAzLCBUPTAuMDAxNSwgTElQPTAuMDIsIEZPT1Q9MC4wMTI7XG4gIGNvbnN0IHNoZWxmVG9wcyA9IFswLjEwLCAwLjQyLCBIXTtcbiAgY29uc3QgcmVnYWwgPSBuZXcgVEhSRUUuR3JvdXAoKTsgcmVnYWwubmFtZT0ncmVnYWwnO1xuICBjb25zdCBwb3N0SCA9IEggLSBGT09UO1xuICBmb3IgKGNvbnN0IFtuLHN4LHN6XSBvZiBbWyd2bCcsLTEsMV0sWyd2cicsMSwxXSxbJ2hsJywtMSwtMV0sWydocicsMSwtMV1dKXtcbiAgICBjb25zdCBwID0gbmV3IFRIUkVFLkdyb3VwKCk7IHAubmFtZT0ncGZvc3Rlbl8nK247XG4gICAgY29uc3QgY3ggPSBzeCooVy8yIC0gQS8yKSwgY3ogPSBzeiooRC8yIC0gQS8yKSwgeSA9IEZPT1QgKyBwb3N0SC8yO1xuICAgIHAuYWRkKG1lc2goJ3Bmb3N0ZW5fJytuKydfYScsIGJveChBLCBwb3N0SCwgVCksIE0uY29uY3JldGUsIGN4LCB5LCBzeiooRC8yIC0gVC8yKSkpO1xuICAgIHAuYWRkKG1lc2goJ3Bmb3N0ZW5fJytuKydfYicsIGJveChULCBwb3N0SCwgQSksIE0uY29uY3JldGUsIHN4KihXLzIgLSBULzIpLCB5LCBjeikpO1xuICAgIHAuYWRkKG1lc2goJ2Z1c3NfJytuLCBib3goQSswLjAwMiwgRk9PVCwgQSswLjAwMiksIE0uZm9vdCwgY3gsIEZPT1QvMiwgY3opKTtcbiAgICBmb3IgKGNvbnN0IHRvcCBvZiBzaGVsZlRvcHMpe1xuICAgICAgY29uc3QgeWIgPSB0b3AgLSBMSVAvMjtcbiAgICAgIGNvbnN0IGIxID0gbWVzaCgnc2NocmF1YmVfJytuLCBuZXcgVEhSRUUuQ3lsaW5kZXJHZW9tZXRyeSgwLjAwNCwwLjAwNCwwLjAwMywxNiksIE0uYm9sdCwgY3gsIHliLCBzeiooRC8yKzAuMDAxKSk7IGIxLnJvdGF0aW9uLnggPSBNYXRoLlBJLzI7IHAuYWRkKGIxKTtcbiAgICAgIGNvbnN0IGIyID0gbWVzaCgnc2NocmF1YmVfJytuLCBuZXcgVEhSRUUuQ3lsaW5kZXJHZW9tZXRyeSgwLjAwNCwwLjAwNCwwLjAwMywxNiksIE0uYm9sdCwgc3gqKFcvMiswLjAwMSksIHliLCBjeik7IGIyLnJvdGF0aW9uLnogPSBNYXRoLlBJLzI7IHAuYWRkKGIyKTtcbiAgICB9XG4gICAgcmVnYWwuYWRkKHApO1xuICB9XG4gIHNoZWxmVG9wcy5mb3JFYWNoKCh0b3AsIGkpID0+IHtcbiAgICBjb25zdCBzID0gbmV3IFRIUkVFLkdyb3VwKCk7IHMubmFtZT0nYm9kZW5fJysoaSsxKTtcbiAgICBjb25zdCBpdyA9IFcgLSAyKlQsIGlkID0gRCAtIDIqVDtcbiAgICBzLmFkZChtZXNoKCdib2Rlbl8nKyhpKzEpKydfcGxhdHRlJywgYm94KGl3LCBULCBpZCksIE0uY29uY3JldGUsIDAsIHRvcCAtIFQvMiwgMCkpO1xuICAgIGZvciAoY29uc3Qgc3ogb2YgWzEsLTFdKSBzLmFkZChtZXNoKCdib2Rlbl8nKyhpKzEpKydfa2FudGVfeicsIGJveChpdywgTElQLCBUKSwgTS5jb25jcmV0ZSwgMCwgdG9wIC0gTElQLzIsIHN6KihpZC8yIC0gVC8yKSkpO1xuICAgIGZvciAoY29uc3Qgc3ggb2YgWzEsLTFdKSBzLmFkZChtZXNoKCdib2Rlbl8nKyhpKzEpKydfa2FudGVfeCcsIGJveChULCBMSVAsIGlkKSwgTS5jb25jcmV0ZSwgc3gqKGl3LzIgLSBULzIpLCB0b3AgLSBMSVAvMiwgMCkpO1xuICAgIHJlZ2FsLmFkZChzKTtcbiAgfSk7XG4gIHJldHVybiByZWdhbDtcbn1cbmZ1bmN0aW9uIHJlZ2FsTWF0ZXJpYWxzKFRIUkVFKXtcbiAgcmV0dXJuIHtcbiAgICBjb25jcmV0ZTogZ2FsdmFuaXplZE1hdGVyaWFsKFRIUkVFLCAxOCksIC8vIHZlcnppbmt0ZXIgU3RhaGwsIFRleHR1ciDigJ5GZWlu4oCcXG4gICAgZm9vdDogICAgIG5ldyBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCh7IG5hbWU6J2t1bnN0c3RvZmZfZnVzcycsIGNvbG9yOjB4MmEyYTJhLCByb3VnaG5lc3M6MC43IH0pLFxuICAgIGJvbHQ6ICAgICBuZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoeyBuYW1lOidzY2hyYXViZScsIGNvbG9yOjB4OGM4YzhjLCByb3VnaG5lc3M6MC4zNSwgbWV0YWxuZXNzOjAuOSB9KSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRMYW1wZShUSFJFRSl7XG4gIGNvbnN0IFYgPSAoeCx5LHo9MCkgPT4gbmV3IFRIUkVFLlZlY3RvcjMoeCx5LHopO1xuICBjb25zdCBNID0ge1xuICAgIGNocm9tOiAgbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgbmFtZTonY2hyb20nLCBjb2xvcjoweGQ4ZGFkZCwgbWV0YWxuZXNzOjAuNSwgcm91Z2huZXNzOjAuMjUgfSksXG4gICAgc2NoaXJtOiBuZXcgVEhSRUUuTWVzaFBoeXNpY2FsTWF0ZXJpYWwoeyBuYW1lOidhY3J5bF93ZWlzcycsIGNvbG9yOjB4ZjdmN2Y1LCByb3VnaG5lc3M6MC4yOCwgY2xlYXJjb2F0OjAuOCwgY2xlYXJjb2F0Um91Z2huZXNzOjAuMSwgc2lkZTpUSFJFRS5Eb3VibGVTaWRlIH0pLFxuICAgIGJpcm5lOiAgbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgbmFtZTonbGV1Y2h0bWl0dGVsJywgY29sb3I6MHhmZmZmZmYsIGVtaXNzaXZlOjB4ZmZmMWQ2LCBlbWlzc2l2ZUludGVuc2l0eTowLjIgfSksXG4gIH07XG4gIGNvbnN0IGFkZCA9IChwYXJlbnQsIG5hbWUsIGdlbywgbWF0LCBwPVswLDAsMF0sIHI9WzAsMCwwXSkgPT4geyBjb25zdCBtID0gbmV3IFRIUkVFLk1lc2goZ2VvLCBtYXQpOyBtLm5hbWUgPSBuYW1lOyBtLnBvc2l0aW9uLnNldCguLi5wKTsgbS5yb3RhdGlvbi5zZXQoLi4ucik7IHBhcmVudC5hZGQobSk7IHJldHVybiBtOyB9O1xuICBjb25zdCBsYW1wZSA9IG5ldyBUSFJFRS5Hcm91cCgpOyBsYW1wZS5uYW1lID0gJ2JvZ2VubGFtcGUnO1xuICBjb25zdCBIID0gMS42NiwgUkVBQ0ggPSAxLjIyLCBTSF9SID0gMC4xNSwgQkFTRV9SID0gMC4xMywgQkFTRV9IID0gMC4wMjgsIFBPTEVfUiA9IDAuMDEyNSwgQVJDX1IgPSAwLjAwODUsIFBPTEVfVE9QID0gMC43NDtcbiAgY29uc3QgcHJvZiA9IFtuZXcgVEhSRUUuVmVjdG9yMigwLCAwKSwgbmV3IFRIUkVFLlZlY3RvcjIoQkFTRV9SIC0gMC4wMDQsIDApXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPD0gMTA7IGkrKyl7IGNvbnN0IGEgPSAtTWF0aC5QSS8yICsgaS8xMCpNYXRoLlBJLzI7IHByb2YucHVzaChuZXcgVEhSRUUuVmVjdG9yMihCQVNFX1IgLSAwLjAwOCArIE1hdGguY29zKGEpKjAuMDA4LCAwLjAwOCArIE1hdGguc2luKGEpKjAuMDA4KSk7IH1cbiAgZm9yIChsZXQgaSA9IDA7IGkgPD0gMTA7IGkrKyl7IGNvbnN0IGEgPSBpLzEwKk1hdGguUEkvMjsgcHJvZi5wdXNoKG5ldyBUSFJFRS5WZWN0b3IyKEJBU0VfUiAtIDAuMDEyICsgTWF0aC5jb3MoYSkqMC4wMTIsIEJBU0VfSCAtIDAuMDEyICsgTWF0aC5zaW4oYSkqMC4wMTIpKTsgfVxuICBwcm9mLnB1c2gobmV3IFRIUkVFLlZlY3RvcjIoMCwgQkFTRV9IKSk7XG4gIGFkZChsYW1wZSwgJ2Z1c3MnLCBuZXcgVEhSRUUuTGF0aGVHZW9tZXRyeShwcm9mLCA5NiksIE0uY2hyb20pO1xuICBhZGQobGFtcGUsICdmdXNzX3Jvc2V0dGUnLCBuZXcgVEhSRUUuQ3lsaW5kZXJHZW9tZXRyeSgwLjAyMiwgMC4wMjYsIDAuMDEyLCA0OCksIE0uY2hyb20sIFswLCBCQVNFX0ggKyAwLjAwNiwgMF0pO1xuICBhZGQobGFtcGUsICdzdGFuZHJvaHInLCBuZXcgVEhSRUUuQ3lsaW5kZXJHZW9tZXRyeShQT0xFX1IsIFBPTEVfUiwgUE9MRV9UT1AgLSBCQVNFX0gsIDQ4KSwgTS5jaHJvbSwgWzAsIChQT0xFX1RPUCArIEJBU0VfSCkvMiwgMF0pO1xuICBhZGQobGFtcGUsICdtdWZmZV91bnRlbicsIG5ldyBUSFJFRS5DeWxpbmRlckdlb21ldHJ5KFBPTEVfUiArIDAuMDAxNSwgUE9MRV9SICsgMC4wMDE1LCAwLjAzLCA0OCksIE0uY2hyb20sIFswLCBQT0xFX1RPUCAtIDAuMDE1LCAwXSk7XG4gIGNvbnN0IEFSQ19FTkQgPSBWKFJFQUNIIC0gMC4wNCwgSCAtIEFSQ19SKTtcbiAgY29uc3QgYXJjID0gbmV3IFRIUkVFLkN1YmljQmV6aWVyQ3VydmUzKFYoMCwgUE9MRV9UT1AgLSAwLjAyKSwgVigwLCAxLjM4KSwgVigwLjQyLCBIIC0gQVJDX1IpLCBBUkNfRU5EKTtcbiAgYWRkKGxhbXBlLCAnYm9nZW4nLCBuZXcgVEhSRUUuVHViZUdlb21ldHJ5KGFyYywgMjQwLCBBUkNfUiwgMzIpLCBNLmNocm9tKTtcbiAgY29uc3QgcE0gPSBhcmMuZ2V0UG9pbnRBdCgwLjM2KSwgZE0gPSBhcmMuZ2V0VGFuZ2VudEF0KDAuMzYpO1xuICBjb25zdCBtdWZmZSA9IGFkZChsYW1wZSwgJ211ZmZlX2JvZ2VuJywgbmV3IFRIUkVFLkN5bGluZGVyR2VvbWV0cnkoQVJDX1IgKyAwLjAwMTgsIEFSQ19SICsgMC4wMDE4LCAwLjAzNSwgMzIpLCBNLmNocm9tLCBbcE0ueCwgcE0ueSwgMF0pO1xuICBtdWZmZS5xdWF0ZXJuaW9uLnNldEZyb21Vbml0VmVjdG9ycyhWKDAsMSwwKSwgZE0pO1xuICBhZGQobGFtcGUsICdlbmRrYXBwZScsIG5ldyBUSFJFRS5DeWxpbmRlckdlb21ldHJ5KEFSQ19SICsgMC4wMDIsIEFSQ19SICsgMC4wMDIsIDAuMDcsIDMyKSwgTS5jaHJvbSwgW0FSQ19FTkQueCAtIDAuMDIsIEFSQ19FTkQueSwgMF0sIFswLCAwLCBNYXRoLlBJLzJdKTtcbiAgY29uc3Qga29wZiA9IG5ldyBUSFJFRS5Hcm91cCgpOyBrb3BmLm5hbWUgPSAnc2NoaXJtX2dydXBwZSc7XG4gIGNvbnN0IFRJTFQgPSAwLjM7XG4gIGtvcGYucG9zaXRpb24uc2V0KFJFQUNIIC0gU0hfUipNYXRoLnNpbihUSUxUKSwgSCAtIEFSQ19SIC0gMC4wMzUsIDApO1xuICBrb3BmLnJvdGF0aW9uLnogPSBUSUxUO1xuICBhZGQobGFtcGUsICdnZWxlbmsnLCBuZXcgVEhSRUUuQ3lsaW5kZXJHZW9tZXRyeSgwLjAwNiwgMC4wMDYsIDAuMDMsIDIwKSwgTS5jaHJvbSwgW2tvcGYucG9zaXRpb24ueCwgSCAtIEFSQ19SIC0gMC4wMTgsIDBdKTtcbiAgbGFtcGUuYWRkKGtvcGYpO1xuICBhZGQoa29wZiwgJ3NjaGlybScsIG5ldyBUSFJFRS5TcGhlcmVHZW9tZXRyeShTSF9SLCA5NiwgNDgsIDAsIE1hdGguUEkqMiwgMCwgMS45NSksIE0uc2NoaXJtLCBbMCwgLVNIX1IsIDBdKTtcbiAgYWRkKGtvcGYsICdzY2hpcm1fbmFiZScsIG5ldyBUSFJFRS5DeWxpbmRlckdlb21ldHJ5KDAuMDE4LCAwLjAyOCwgMC4wMiwgNDApLCBNLmNocm9tLCBbMCwgLTAuMDA0LCAwXSk7XG4gIGFkZChrb3BmLCAnZmFzc3VuZycsIG5ldyBUSFJFRS5DeWxpbmRlckdlb21ldHJ5KDAuMDE2LCAwLjAxNiwgMC4wNSwgMzIpLCBNLmNocm9tLCBbMCwgLTAuMDQsIDBdKTtcbiAgYWRkKGtvcGYsICdsZXVjaHRtaXR0ZWwnLCBuZXcgVEhSRUUuU3BoZXJlR2VvbWV0cnkoMC4wMywgMzIsIDE2KSwgTS5iaXJuZSwgWzAsIC0wLjA5LCAwXSk7XG4gIHJldHVybiB7IGdyb3VwOiBsYW1wZSwgUkVBQ0ggfTtcbn1cblxuLy8gVmVyemlua3RlciBTdGFobCAoWmluay1TcGFuZ2xlLCBwcm96ZWR1cmFsKSDigJMgYXVzIFJlZ2FsIDNEXG5mdW5jdGlvbiBnYWx2YW5pemVkKHNpemU9MTAyNCwgY2VsbHM9MjQsIHNlZWQ9Nyl7XG4gIGxldCBzID0gc2VlZDsgY29uc3Qgcm5kID0gKCkgPT4gKHMgPSAocyoxNjgwNykgJSAyMTQ3NDgzNjQ3KSAvIDIxNDc0ODM2NDc7XG4gIGNvbnN0IGcgPSBjZWxscywgcHRzID0gW107XG4gIGZvciAobGV0IGo9MDtqPGc7aisrKSBmb3IgKGxldCBpPTA7aTxnO2krKyl7XG4gICAgY29uc3QgYSA9IHJuZCgpKk1hdGguUEkqMjtcbiAgICBwdHMucHVzaCh7IHg6KGkrcm5kKCkpL2csIHk6KGorcm5kKCkpL2csIGJhc2U6IDAuNzIgKyBybmQoKSowLjE4LCBneDpNYXRoLmNvcyhhKSwgZ3k6TWF0aC5zaW4oYSksIGs6IDAuMDMgKyBybmQoKSowLjA4LCByOiBybmQoKSB9KTtcbiAgfVxuICBjb25zdCBjb2wgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTsgY29sLndpZHRoID0gY29sLmhlaWdodCA9IHNpemU7XG4gIGNvbnN0IHJvdSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpOyByb3Uud2lkdGggPSByb3UuaGVpZ2h0ID0gc2l6ZTtcbiAgY29uc3QgY2MgPSBjb2wuZ2V0Q29udGV4dCgnMmQnKSwgcmMgPSByb3UuZ2V0Q29udGV4dCgnMmQnKTtcbiAgY29uc3QgY2kgPSBjYy5jcmVhdGVJbWFnZURhdGEoc2l6ZSxzaXplKSwgcmkgPSByYy5jcmVhdGVJbWFnZURhdGEoc2l6ZSxzaXplKTtcbiAgZm9yIChsZXQgeT0wO3k8c2l6ZTt5KyspIGZvciAobGV0IHg9MDt4PHNpemU7eCsrKXtcbiAgICBjb25zdCB1ID0geC9zaXplLCB2ID0geS9zaXplLCBjeCA9IE1hdGguZmxvb3IodSpnKSwgY3kgPSBNYXRoLmZsb29yKHYqZyk7XG4gICAgbGV0IGJlc3QgPSA5LCBzZWNvbmQgPSA5LCBicCA9IG51bGwsIGJkeD0wLCBiZHk9MDtcbiAgICBmb3IgKGxldCBveT0tMTtveTw9MTtveSsrKSBmb3IgKGxldCBveD0tMTtveDw9MTtveCsrKXtcbiAgICAgIGNvbnN0IGl4ID0gKGN4K294K2cpJWcsIGl5ID0gKGN5K295K2cpJWcsIHAgPSBwdHNbaXkqZytpeF07XG4gICAgICBjb25zdCBkeCA9IHUgLSAocC54ICsgTWF0aC5mbG9vcigoY3grb3gpL2cpICogMSArICgoY3grb3gpPDA/MDowKSkgLCBkeSA9IHYgLSAocC55ICsgTWF0aC5mbG9vcigoY3krb3kpL2cpKTtcbiAgICAgIGNvbnN0IGQgPSBkeCpkeCArIGR5KmR5O1xuICAgICAgaWYgKGQgPCBiZXN0KXsgc2Vjb25kID0gYmVzdDsgYmVzdCA9IGQ7IGJwID0gcDsgYmR4ID0gZHg7IGJkeSA9IGR5OyB9IGVsc2UgaWYgKGQgPCBzZWNvbmQpIHNlY29uZCA9IGQ7XG4gICAgfVxuICAgIGNvbnN0IGVkZ2UgPSBNYXRoLnNxcnQoc2Vjb25kKSAtIE1hdGguc3FydChiZXN0KTsgICAgICAgICAgICAvLyBBYnN0YW5kIHp1ciBLb3JuZ3JlbnplXG4gICAgbGV0IGwgPSBicC5iYXNlICsgKGJkeCpicC5neCArIGJkeSpicC5neSkgKiBnICogYnAuazsgICAgICAgIC8vIEZhY2V0dGVuLVZlcmxhdWYgcHJvIEtvcm5cbiAgICBsICs9IChNYXRoLnJhbmRvbSgpLTAuNSkqMC4wNTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmVpbmVzIEtvcm5cbiAgICBpZiAoZWRnZSA8IDAuMDAxOCkgbCAtPSAwLjAzNTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGR1bmtsZSBLb3JuZ3JlbnplblxuICAgIGlmIChNYXRoLnJhbmRvbSgpIDwgMC4wMDMpIGwgLT0gMC4xMjsgICAgICAgICAgICAgICAgICAgICAgICAvLyBkdW5rbGUgU3ByZW5rZWxcbiAgICBsID0gTWF0aC5tYXgoMC4yNSwgTWF0aC5taW4oMC45NywgbCkpO1xuICAgIGNvbnN0IG8gPSAoeSpzaXplK3gpKjQsIGMgPSBsKjI1NTtcbiAgICBjaS5kYXRhW29dPWMqMC45ODsgY2kuZGF0YVtvKzFdPWM7IGNpLmRhdGFbbysyXT1jKjEuMDI7IGNpLmRhdGFbbyszXT0yNTU7XG4gICAgY29uc3QgciA9ICgwLjI4ICsgKDEtbCkqMC4zNSArIGJwLnIqMC4xMikgKiAyNTU7ICAgICAgICAgICAgIC8vIGhlbGxlIEvDtnJuZXIgZ2zDpG56ZW5kZXJcbiAgICByaS5kYXRhW29dPXJpLmRhdGFbbysxXT1yaS5kYXRhW28rMl09cjsgcmkuZGF0YVtvKzNdPTI1NTtcbiAgfVxuICBjYy5wdXRJbWFnZURhdGEoY2ksMCwwKTsgcmMucHV0SW1hZ2VEYXRhKHJpLDAsMCk7XG4gIHJldHVybiB7IGNvbCwgcm91IH07XG59XG5mdW5jdGlvbiBnYWx2YW5pemVkTWF0ZXJpYWwoVEhSRUUsIHJlcGVhdCA9IDE4KXtcbiAgY29uc3QgeyBjb2wsIHJvdSB9ID0gZ2FsdmFuaXplZCgpO1xuICBjb25zdCBtayA9IChjLCBzcmdiKSA9PiB7IGNvbnN0IHQgPSBuZXcgVEhSRUUuQ2FudmFzVGV4dHVyZShjKTsgdC53cmFwUyA9IHQud3JhcFQgPSBUSFJFRS5SZXBlYXRXcmFwcGluZzsgdC5yZXBlYXQuc2V0KHJlcGVhdCwgcmVwZWF0KTtcbiAgICBpZiAoc3JnYikgdC5jb2xvclNwYWNlID0gVEhSRUUuU1JHQkNvbG9yU3BhY2U7IHQuYW5pc290cm9weSA9IDg7IHJldHVybiB0OyB9O1xuICByZXR1cm4gbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgbmFtZTonc3RhaGxfdmVyemlua3QnLCBtYXA6IG1rKGNvbCwgdHJ1ZSksIHJvdWdobmVzc01hcDogbWsocm91KSwgYnVtcE1hcDogbWsoY29sKSwgYnVtcFNjYWxlOiAwLjI1LFxuICAgIGNvbG9yOiAweGVjZWVmMCwgcm91Z2huZXNzOiAxLCBtZXRhbG5lc3M6IDAuMyB9KTtcbn1cblxuLy8gUmVnYWxsYXV0c3ByZWNoZXItUGFhciAoYXVzIEJveGVuIDNEKTogcGFzc2l2ICsgYWt0aXYgKEJlZGllbmZlbGQgYW4gbG9rYWxlciAreC1TZWl0ZSlcbmZ1bmN0aW9uIGJ1aWxkQm94ZW4oVEhSRUUpe1xuICBjb25zdCBNID0ge1xuICAgIHdvb2Q6ICAgbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgbmFtZTonZWljaGUnLCBjb2xvcjoweGI3N2EzZSwgcm91Z2huZXNzOjAuNTUgfSksXG4gICAgZmFicmljOiBuZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoeyBuYW1lOidzdG9mZl9ncmF1JywgY29sb3I6MHg2YzZjNmEsIHJvdWdobmVzczowLjk3IH0pLFxuICAgIHN0cmlwOiAgbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgbmFtZTonemllcmxlaXN0ZV9zaWxiZXInLCBjb2xvcjoweGM5YzljOSwgcm91Z2huZXNzOjAuMywgbWV0YWxuZXNzOjAuOSB9KSxcbiAgICBibGFjazogIG5ldyBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCh7IG5hbWU6J2t1bnN0c3RvZmZfc2Nod2FyeicsIGNvbG9yOjB4MWMxYzFjLCByb3VnaG5lc3M6MC42IH0pLFxuICAgIGtub2I6ICAgbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgbmFtZTonZHJlaHJlZ2xlcicsIGNvbG9yOjB4MTQxNDE0LCByb3VnaG5lc3M6MC40LCBtZXRhbG5lc3M6MC4yIH0pLFxuICAgIGFsdTogICAgbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgbmFtZTonaG9jaHRvZW5lcl9hbHUnLCBjb2xvcjoweGFhYWFhYSwgcm91Z2huZXNzOjAuMzUsIG1ldGFsbmVzczowLjggfSksXG4gICAgbGVkOiAgICBuZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoeyBuYW1lOidsZWQnLCBjb2xvcjoweDBhMmExMCwgZW1pc3NpdmU6MHgyYmQ0NWEsIGVtaXNzaXZlSW50ZW5zaXR5OjEuMiB9KSxcbiAgfTtcbiAgY29uc3QgVz0wLjE0NiwgRD0wLjE5NiwgSD0wLjIzNCwgUj0wLjAxNCwgQlY9MC4wMDI7XG4gIGNvbnN0IG1lc2ggPSAobmFtZSwgZ2VvLCBtYXQsIHg9MCwgeT0wLCB6PTApID0+IG1rKFRIUkVFLCBuYW1lLCBnZW8sIG1hdCwgeCwgeSwgeik7XG4gIGNvbnN0IHJyZWN0ID0gKHcsIGgsIHIpID0+IHsgY29uc3QgcyA9IG5ldyBUSFJFRS5TaGFwZSgpLCB4PS13LzIsIHk9LWgvMjtcbiAgICBzLm1vdmVUbyh4K3IseSk7IHMubGluZVRvKHgrdy1yLHkpOyBzLnF1YWRyYXRpY0N1cnZlVG8oeCt3LHkseCt3LHkrcik7IHMubGluZVRvKHgrdyx5K2gtcik7IHMucXVhZHJhdGljQ3VydmVUbyh4K3cseStoLHgrdy1yLHkraCk7XG4gICAgcy5saW5lVG8oeCtyLHkraCk7IHMucXVhZHJhdGljQ3VydmVUbyh4LHkraCx4LHkraC1yKTsgcy5saW5lVG8oeCx5K3IpOyBzLnF1YWRyYXRpY0N1cnZlVG8oeCx5LHgrcix5KTsgcmV0dXJuIHM7IH07XG4gIGNvbnN0IGNhYkdlbyA9IG5ldyBUSFJFRS5FeHRydWRlR2VvbWV0cnkocnJlY3QoVy0yKkJWLCBELTIqQlYsIFIpLCB7IGRlcHRoOkgtMipCViwgYmV2ZWxFbmFibGVkOnRydWUsIGJldmVsU2l6ZTpCViwgYmV2ZWxUaGlja25lc3M6QlYsIGJldmVsU2VnbWVudHM6MiwgY3VydmVTZWdtZW50czoxMCB9KTtcbiAgY2FiR2VvLnJvdGF0ZVgoLU1hdGguUEkvMik7IGNhYkdlby50cmFuc2xhdGUoMCwgQlYsIDApO1xuICB7IGNvbnN0IHAgPSBjYWJHZW8uYXR0cmlidXRlcy5wb3NpdGlvbiwgbiA9IGNhYkdlby5hdHRyaWJ1dGVzLm5vcm1hbCwgdXYgPSBjYWJHZW8uYXR0cmlidXRlcy51djtcbiAgICBmb3IgKGxldCBpPTA7aTxwLmNvdW50O2krKyl7IGNvbnN0IHg9cC5nZXRYKGkpLCB5PXAuZ2V0WShpKSwgej1wLmdldFooaSk7XG4gICAgICBpZiAoTWF0aC5hYnMobi5nZXRZKGkpKSA+IDAuNykgdXYuc2V0WFkoaSwgeCwgeik7IGVsc2UgdXYuc2V0WFkoaSwgTWF0aC5hYnMobi5nZXRYKGkpKSA+IE1hdGguYWJzKG4uZ2V0WihpKSkgPyB6IDogeCwgeSk7IH0gfVxuICBjb25zdCBHVz1XLTAuMDA2LCBHSD1ILTAuMDA2LCBHVD0wLjAwODtcbiAgY29uc3QgZ3JpbGxlR2VvID0gbmV3IFRIUkVFLkV4dHJ1ZGVHZW9tZXRyeShycmVjdChHVy0wLjAwNCwgR0gtMC4wMDQsIDAuMDA5KSwgeyBkZXB0aDpHVC0wLjAwMywgYmV2ZWxFbmFibGVkOnRydWUsIGJldmVsU2l6ZTowLjAwMiwgYmV2ZWxUaGlja25lc3M6MC4wMDE1LCBiZXZlbFNlZ21lbnRzOjMsIGN1cnZlU2VnbWVudHM6OCB9KTtcbiAgZnVuY3Rpb24gc3BlYWtlcihuYW1lLCBhY3RpdmUpe1xuICAgIGNvbnN0IHMgPSBuZXcgVEhSRUUuR3JvdXAoKTsgcy5uYW1lID0gbmFtZTtcbiAgICBzLmFkZChtZXNoKG5hbWUrJ19nZWhhZXVzZScsIGNhYkdlbywgTS53b29kKSk7XG4gICAgcy5hZGQobWVzaChuYW1lKydfc3RvZmYnLCBncmlsbGVHZW8sIE0uZmFicmljLCAwLCBILzIsIEQvMiArIDAuMDAxNSkpO1xuICAgIHMuYWRkKG1lc2gobmFtZSsnX3ppZXJsZWlzdGUnLCBuZXcgVEhSRUUuQm94R2VvbWV0cnkoR1cqMC43NCwgMC4wMDI2LCAwLjAwMTIpLCBNLnN0cmlwLCAwLCBIKjAuNTg1LCBELzIgKyBHVCArIDAuMDAwNSkpO1xuICAgIHMuYWRkKG1lc2gobmFtZSsnX2xvZ28nLCBuZXcgVEhSRUUuQm94R2VvbWV0cnkoMC4wMjYsIDAuMDA2LCAwLjAwMDgpLCBNLnN0cmlwLCAwLCAwLjAyNiwgRC8yICsgR1QgKyAwLjAwMDMpKTtcbiAgICBjb25zdCBwb3J0ID0gbWVzaChuYW1lKydfYmFzc3JlZmxleCcsIG5ldyBUSFJFRS5DeWxpbmRlckdlb21ldHJ5KDAuMDE0LCAwLjAxNCwgMC4wMDQsIDMyKSwgTS5ibGFjaywgMCwgMC4xNywgLUQvMiAtIDAuMDAxKTtcbiAgICBwb3J0LnJvdGF0aW9uLnggPSBNYXRoLlBJLzI7IHMuYWRkKHBvcnQpO1xuICAgIGZvciAoY29uc3QgW2Z4LGZ6XSBvZiBbWy0xLC0xXSxbMSwtMV0sWy0xLDFdLFsxLDFdXSlcbiAgICAgIHMuYWRkKG1lc2gobmFtZSsnX2Z1c3MnLCBuZXcgVEhSRUUuQ3lsaW5kZXJHZW9tZXRyeSgwLjAwNiwwLjAwNiwwLjAwMiwyMCksIE0uYmxhY2ssIGZ4KihXLzItMC4wMiksIDAuMDAxLCBmeiooRC8yLTAuMDI1KSkpO1xuICAgIGlmIChhY3RpdmUpe1xuICAgICAgY29uc3QgcHggPSBXLzIgKyAwLjAwMDQsIGN6ID0gLTAuMDEyO1xuICAgICAgcy5hZGQobWVzaChuYW1lKydfYmVkaWVuZmVsZCcsIG5ldyBUSFJFRS5Cb3hHZW9tZXRyeSgwLjAwMiwgMC4xMDgsIDAuMDU1KSwgTS5ibGFjaywgcHgsIDAuMTQsIGN6KSk7XG4gICAgICBbMC4xNzYsIDAuMTQzLCAwLjExXS5mb3JFYWNoKCh5LCBpKSA9PiB7XG4gICAgICAgIGNvbnN0IGsgPSBtZXNoKG5hbWUrJ19yZWdsZXJfJytbJ2hvZWhlbicsJ2Jhc3MnLCdsYXV0c3RhZXJrZSddW2ldLCBuZXcgVEhSRUUuQ3lsaW5kZXJHZW9tZXRyeSgwLjAwODUsIDAuMDA4NSwgMC4wMTEsIDI4KSwgTS5rbm9iLCBweCswLjAwNTUsIHksIGN6LTAuMDA0KTtcbiAgICAgICAgay5yb3RhdGlvbi56ID0gTWF0aC5QSS8yOyBzLmFkZChrKTtcbiAgICAgIH0pO1xuICAgICAgcy5hZGQobWVzaChuYW1lKydfbGVkJywgbmV3IFRIUkVFLlNwaGVyZUdlb21ldHJ5KDAuMDAxNSwgMTIsIDgpLCBNLmxlZCwgcHgrMC4wMDEsIDAuMDkzLCBjei0wLjAwNCkpO1xuICAgIH1cbiAgICBzLnRyYXZlcnNlKG8gPT4geyBpZiAoby5pc01lc2gpIG8ucG9zaXRpb24ueSArPSAwLjAwMjsgfSk7XG4gICAgcmV0dXJuIHM7XG4gIH1cbiAgcmV0dXJuIHsgVywgRCwgSCwgbGlua3M6IHNwZWFrZXIoJ2JveF9saW5rcycsIGZhbHNlKSwgcmVjaHRzOiBzcGVha2VyKCdib3hfcmVjaHRzX2FrdGl2JywgdHJ1ZSkgfTtcbn1cblxuLy8gVHJpcG9kLUxhbXBlIChhdXMgVHJpcG9kbGFtcGUgM0QpOiBFaWNoZW4tTGV1Y2h0a29wZiBtaXQgTEVELVNwb3QgYXVmIHNjaHdhcnplbSBEcmVpYmVpbjsgRnJvbnQgPSBsb2thbGUgK3pcbmZ1bmN0aW9uIGJ1aWxkVHJpcG9kKFRIUkVFKXtcbiAgY29uc3QgViA9ICh4LHkseikgPT4gbmV3IFRIUkVFLlZlY3RvcjMoeCx5LHopO1xuICBjb25zdCBjID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7IGMud2lkdGggPSBjLmhlaWdodCA9IDUxMjsgY29uc3QgZyA9IGMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgZy5maWxsU3R5bGUgPSAnI2M0OWE2Nic7IGcuZmlsbFJlY3QoMCwwLDUxMiw1MTIpO1xuICBsZXQgcyA9IDExOyBjb25zdCByID0gKCkgPT4gKHMgPSAocyoxNjgwNykgJSAyMTQ3NDgzNjQ3KSAvIDIxNDc0ODM2NDc7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgMjYwOyBpKyspe1xuICAgIGNvbnN0IHkgPSByKCkqNTEyLCBhID0gMC4wNCArIHIoKSowLjEyOyBnLnN0cm9rZVN0eWxlID0gcigpID4gMC41ID8gYHJnYmEoMTIwLDgwLDQwLCR7YX0pYCA6IGByZ2JhKDIzNSwyMDAsMTUwLCR7YX0pYDsgZy5saW5lV2lkdGggPSAwLjUgKyByKCkqMi4yO1xuICAgIGcuYmVnaW5QYXRoKCk7IGcubW92ZVRvKDAseSk7IGZvciAobGV0IHggPSAwOyB4IDw9IDUxMjsgeCArPSAzMikgZy5saW5lVG8oeCwgeSArIE1hdGguc2luKHgqMC4wMTIgKyBpKSo0ICsgKHIoKS0wLjUpKjEuNSk7IGcuc3Ryb2tlKCk7XG4gIH1cbiAgY29uc3QgdGV4ID0gbmV3IFRIUkVFLkNhbnZhc1RleHR1cmUoYyk7IHRleC5jb2xvclNwYWNlID0gVEhSRUUuU1JHQkNvbG9yU3BhY2U7XG4gIGNvbnN0IE0gPSB7XG4gICAgaG9sejogICBuZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoeyBuYW1lOid0cmlwb2RfZWljaGUnLCBtYXA6IHRleCwgcm91Z2huZXNzOjAuNiB9KSxcbiAgICBzdGFobDogIG5ldyBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCh7IG5hbWU6J3RyaXBvZF9zdGFobF9zY2h3YXJ6JywgY29sb3I6MHgxYjFiMWMsIHJvdWdobmVzczowLjQ1LCBtZXRhbG5lc3M6MC42IH0pLFxuICAgIGd1bW1pOiAgbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgbmFtZTondHJpcG9kX2d1bW1pJywgY29sb3I6MHgxMTExMTEsIHJvdWdobmVzczowLjkgfSksXG4gICAgYmxlbmRlOiBuZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoeyBuYW1lOid0cmlwb2RfcmVmbGVrdG9yJywgY29sb3I6MHg5YTlhOWEsIHJvdWdobmVzczowLjI1LCBtZXRhbG5lc3M6MC45IH0pLFxuICAgIGxlZDogICAgbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgbmFtZTondHJpcG9kX2xlZCcsIGNvbG9yOjB4ZDhkYWRkLCBlbWlzc2l2ZToweGY0ZjdmZiwgZW1pc3NpdmVJbnRlbnNpdHk6MCwgcm91Z2huZXNzOjAuMiB9KSxcbiAgICBrYWJlbDogIG5ldyBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCh7IG5hbWU6J3RyaXBvZF9rYWJlbCcsIGNvbG9yOjB4MTUxNTE1LCByb3VnaG5lc3M6MC43IH0pLFxuICB9O1xuICBjb25zdCBhZGQgPSAocCwgbiwgZ2VvLCBtYXQsIHBvcz1bMCwwLDBdKSA9PiB7IGNvbnN0IG8gPSBtayhUSFJFRSwgbiwgZ2VvLCBtYXQsIC4uLnBvcyk7IHAuYWRkKG8pOyByZXR1cm4gbzsgfTtcbiAgY29uc3Qgcm9kID0gKHAsIG4sIGEsIGIsIHJyLCBtYXQpID0+IHsgY29uc3QgZCA9IGIuY2xvbmUoKS5zdWIoYSksIG8gPSBhZGQocCwgbiwgbmV3IFRIUkVFLkN5bGluZGVyR2VvbWV0cnkocnIsIHJyLCBkLmxlbmd0aCgpLCAyMCksIG1hdCk7XG4gICAgby5wb3NpdGlvbi5jb3B5KGEpLmFkZFNjYWxlZFZlY3RvcihkLCAwLjUpOyBvLnF1YXRlcm5pb24uc2V0RnJvbVVuaXRWZWN0b3JzKFYoMCwxLDApLCBkLm5vcm1hbGl6ZSgpKTsgcmV0dXJuIG87IH07XG4gIGNvbnN0IGdyb3VwID0gbmV3IFRIUkVFLkdyb3VwKCk7IGdyb3VwLm5hbWUgPSAndHJpcG9kbGFtcGUnO1xuICBjb25zdCBIVUIgPSBWKDAsIDAuMzYsIDApLCBGUiA9IDAuMTc7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgMzsgaSsrKXtcbiAgICBjb25zdCBhID0gTWF0aC5QSS8yICsgaSoyKk1hdGguUEkvMywgZm9vdCA9IFYoTWF0aC5jb3MoYSkqRlIsIDAuMDA2LCBNYXRoLnNpbihhKSpGUik7XG4gICAgcm9kKGdyb3VwLCAndHJpcG9kX2JlaW5fJysoaSsxKSwgZm9vdCwgSFVCLmNsb25lKCkuYWRkKFYoTWF0aC5jb3MoYSkqMC4wMTIsIDAsIE1hdGguc2luKGEpKjAuMDEyKSksIDAuMDA1LCBNLnN0YWhsKTtcbiAgICBhZGQoZ3JvdXAsICd0cmlwb2RfZnVzc18nKyhpKzEpLCBuZXcgVEhSRUUuQ3lsaW5kZXJHZW9tZXRyeSgwLjAwNTgsIDAuMDA1OCwgMC4wMTIsIDE2KSwgTS5ndW1taSwgW2Zvb3QueCwgMC4wMDYsIGZvb3Quel0pO1xuICB9XG4gIGFkZChncm91cCwgJ3RyaXBvZF9rbm90ZW4nLCBuZXcgVEhSRUUuQ3lsaW5kZXJHZW9tZXRyeSgwLjAxNiwgMC4wMTgsIDAuMDI4LCAyOCksIE0uc3RhaGwsIFswLCAwLjM2LCAwXSk7XG4gIGNvbnN0IEhXID0gMC4xNCwgSEggPSAwLjEyLCBIRCA9IDAuMTE7XG4gIGNvbnN0IGFybSA9IG5ldyBUSFJFRS5DYXRtdWxsUm9tQ3VydmUzKFtWKDAsMC4zNzQsMCksIFYoLTAuMDEsMC40MSwwKSwgVigtMC4wNDUsMC40NSwwLjAwNSksIFYoLTAuMDksMC40ODUsMC4wMSksIFYoLTAuMDkyLDAuNDk1LDAuMDEpLCBWKC1IVy8yLTAuMDA4LDAuNDksMC4wMSldKTtcbiAgYWRkKGdyb3VwLCAndHJpcG9kX2J1ZWdlbCcsIG5ldyBUSFJFRS5UdWJlR2VvbWV0cnkoYXJtLCA0OCwgMC4wMDU1LCAxMiksIE0uc3RhaGwpO1xuICBjb25zdCBrb3BmID0gbmV3IFRIUkVFLkdyb3VwKCk7IGtvcGYubmFtZSA9ICd0cmlwb2Rfa29wZic7IGtvcGYucG9zaXRpb24uc2V0KDAsIDAuNDksIDAuMDEpOyBrb3BmLnJvdGF0aW9uLnNldCgwLjEyLCAwLjE1LCAwKTsgZ3JvdXAuYWRkKGtvcGYpO1xuICBhZGQoa29wZiwgJ3RyaXBvZF9ob2x6a29lcnBlcicsIG5ldyBUSFJFRS5Cb3hHZW9tZXRyeShIVywgSEgsIEhEKSwgTS5ob2x6KTtcbiAgYWRkKGtvcGYsICd0cmlwb2RfZ2VsZW5rJywgbmV3IFRIUkVFLkN5bGluZGVyR2VvbWV0cnkoMC4wMTMsIDAuMDEzLCAwLjAxLCAyOCksIE0uc3RhaGwsIFstSFcvMi0wLjAwNSwgMCwgMF0pLnJvdGF0aW9uLnogPSBNYXRoLlBJLzI7XG4gIGFkZChrb3BmLCAndHJpcG9kX2JsZW5kZScsIG5ldyBUSFJFRS5Ub3J1c0dlb21ldHJ5KDAuMDM2LCAwLjAwNSwgMTIsIDQ4KSwgTS5ibGVuZGUsIFswLjAxLCAwLCBIRC8yKzAuMDAxXSk7XG4gIGFkZChrb3BmLCAndHJpcG9kX3JlZmxla3RvcicsIG5ldyBUSFJFRS5DeWxpbmRlckdlb21ldHJ5KDAuMDM2LCAwLjAzLCAwLjAxMiwgNDgsIDEsIHRydWUpLCBNLmJsZW5kZSwgWzAuMDEsIDAsIEhELzItMC4wMDVdKS5yb3RhdGlvbi54ID0gTWF0aC5QSS8yO1xuICBjb25zdCBsaW5zZSA9IGFkZChrb3BmLCAndHJpcG9kX2xlZF9saW5zZScsIG5ldyBUSFJFRS5DaXJjbGVHZW9tZXRyeSgwLjAzNCwgNDgpLCBNLmxlZCwgWzAuMDEsIDAsIEhELzItMC4wMDhdKTtcbiAgY29uc3Qga2FiZWwgPSBuZXcgVEhSRUUuQ2F0bXVsbFJvbUN1cnZlMyhbVigtMC4wMDUsMC4zNSwtMC4wMTIpLCBWKC0wLjAzLDAuMjgsLTAuMDQpLCBWKC0wLjA3LDAuMTYsLTAuMDgpLCBWKC0wLjExLDAuMDUsLTAuMTIpLCBWKC0wLjE0LDAuMDA0LC0wLjE2KSwgVigtMC4yOCwwLjAwNCwtMC4yNCksIFYoLTAuNDUsMC4wMDQsLTAuMildKTtcbiAgYWRkKGdyb3VwLCAndHJpcG9kX2thYmVsJywgbmV3IFRIUkVFLlR1YmVHZW9tZXRyeShrYWJlbCwgNjQsIDAuMDAyMiwgOCksIE0ua2FiZWwpO1xuICBncm91cC50cmF2ZXJzZShvID0+IHsgaWYgKG8uaXNNZXNoKXsgby5jYXN0U2hhZG93ID0gdHJ1ZTsgby5yZWNlaXZlU2hhZG93ID0gdHJ1ZTsgfSB9KTtcbiAgbGluc2UuY2FzdFNoYWRvdyA9IGZhbHNlO1xuICAvLyBMaWNodHF1ZWxsZW4gYW0gS29wZiAoSW50ZW5zaXTDpHQgMCA9IGF1cylcbiAgY29uc3Qgc3BvdCA9IG5ldyBUSFJFRS5TcG90TGlnaHQoMHhmMmY1ZmYsIDAsIDAsIDAuNTUsIDAuNSwgMik7XG4gIHNwb3QucG9zaXRpb24uc2V0KDAuMDEsIDAsIEhELzIgKyAwLjAwNSk7IHNwb3QudGFyZ2V0LnBvc2l0aW9uLnNldCgwLjAxLCAwLCBIRC8yICsgMSk7XG4gIHNwb3QuY2FzdFNoYWRvdyA9IHRydWU7IHNwb3Quc2hhZG93Lm1hcFNpemUuc2V0KDEwMjQsIDEwMjQpOyBzcG90LnNoYWRvdy5iaWFzID0gLTAuMDAwNTsgc3BvdC5zaGFkb3cubm9ybWFsQmlhcyA9IDAuMDI7XG4gIHNwb3Quc2hhZG93LmNhbWVyYS5uZWFyID0gMC4wMzsgc3BvdC5zaGFkb3cuY2FtZXJhLmZhciA9IDg7XG4gIGNvbnN0IGdsb3cgPSBuZXcgVEhSRUUuUG9pbnRMaWdodCgweGYyZjVmZiwgMCwgMywgMik7IGdsb3cucG9zaXRpb24uc2V0KDAuMDEsIDAsIEhELzIgKyAwLjA1KTtcbiAga29wZi5hZGQoc3BvdCwgc3BvdC50YXJnZXQsIGdsb3cpO1xuICByZXR1cm4geyBncm91cCwga29wZiwgTSwgc3BvdCwgZ2xvdyB9O1xufVxuXG5jb25zdCBzdGFnZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3RocmVlLWQtc3RhZ2UnKTtcbmNvbnN0IHsgVEhSRUUgfSA9IGF3YWl0IHN0YWdlLnJlYWR5O1xuY29uc3Qgc3RhdHVzRWwgPSB7IHNldCB0ZXh0Q29udGVudCh2KXt9IH07XG5mb3IgKGNvbnN0IHNlbCBvZiBbJy50b29sYmFyJywnLm5vdGUnXSkgeyBjb25zdCBlbCA9IHN0YWdlLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcihzZWwpOyBpZiAoZWwpIGVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7IH1cblxuLy8gLS0tLS0tLS0tLSBNYcOfZSBpbiBNZXRlcm4gKExpREFSLVNjYW4gMTAvMjAyNiwgYmVyZWluaWd0KSAtLS0tLS0tLS0tXG4vLyB4ID0gT3N0LCB6ID0gU8O8ZDsgVXJzcHJ1bmcgPSBJbm5lbmthbnRlIFdlc3R3YW5kIFNjaGxhZnppbW1lciAvIElubmVua2FudGUgTm9yZHdhbmRcbmNvbnN0IEggPSAyLjUsIFRFID0gMC4yLCBUSSA9IDAuMTsgICAgIC8vIFdhbmRow7ZoZSwgQXXDn2VuLS9Jbm5lbndhbmRcbmNvbnN0IERPT1JfVyA9IDAuOSwgRE9PUl9IID0gMi4xLCBXSU5fQiA9IDAuOSwgV0lOX1QgPSAyLjI7XG5cbi8vIC0tLS0tLS0tLS0gTWF0ZXJpYWxpZW4gLS0tLS0tLS0tLVxuY29uc3QgTSA9IHtcbiAgZmxvb3I6ICBuZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoeyBuYW1lOid3b29kX2Zsb29yJywgY29sb3I6MHg4YTYyNDIsIHJvdWdobmVzczowLjYgfSksXG4gIHdhbGw6ICAgbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgbmFtZTond2hpdGVfc3R1Y2NvJywgY29sb3I6MHhmMmVmZTksIHJvdWdobmVzczowLjk1IH0pLFxuICBicmljazogIG5ldyBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCh7IG5hbWU6J2JyaWNrX3dhbGxfMDQnLCBjb2xvcjoweDlhNWE0NCwgcm91Z2huZXNzOjAuOSB9KSxcbiAgY2FwOiAgICBuZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoeyBuYW1lOidyb3VnaF9wbGFzdGVyX2JyaWNrXzA0JywgY29sb3I6MHhiOGE4OTgsIHJvdWdobmVzczowLjk1IH0pLFxuICBwbGludGg6IG5ldyBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCh7IG5hbWU6J3BsaW50aCcsIGNvbG9yOjB4MmYyZDJhLCByb3VnaG5lc3M6MC43IH0pLFxuICB3b29kOiAgIG5ldyBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCh7IG5hbWU6J2Rvb3Jfd2hpdGVfbGFjcXVlcicsIGNvbG9yOjB4ZjdmNWYwLCByb3VnaG5lc3M6MC4zNSB9KSxcbiAgbWV0YWw6ICBuZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoeyBuYW1lOidicnVzaGVkX3N0ZWVsJywgY29sb3I6MHhiOWJjYzAsIHJvdWdobmVzczowLjMsIG1ldGFsbmVzczowLjM1IH0pLFxuICBnbGFzczogIG5ldyBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCh7IG5hbWU6J2dsYXNzJywgY29sb3I6MHhiZmQ4ZTQsIHJvdWdobmVzczowLjA1LCB0cmFuc3BhcmVudDp0cnVlLCBvcGFjaXR5OjAuMzUgfSksXG4gIGJhbGNvbnk6bmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgbmFtZTonYmFsY29ueV9jb25jcmV0ZScsIGNvbG9yOjB4YTlhNTlkLCByb3VnaG5lc3M6MC45IH0pLFxufTtcblxuLy8gV2VsdC1VVnMgKEJveC1Qcm9qZWt0aW9uKSwgZGFtaXQgVGV4dHVyZW4gbmljaHQgZ2VzdHJlY2t0IHdlcmRlblxuZnVuY3Rpb24gd29ybGRVVihnZW8sIHNjYWxlKXtcbiAgY29uc3QgcCA9IGdlby5hdHRyaWJ1dGVzLnBvc2l0aW9uLCBuID0gZ2VvLmF0dHJpYnV0ZXMubm9ybWFsLCB1diA9IGdlby5hdHRyaWJ1dGVzLnV2O1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHAuY291bnQ7IGkrKyl7XG4gICAgY29uc3QgYXggPSBNYXRoLmFicyhuLmdldFgoaSkpLCBheSA9IE1hdGguYWJzKG4uZ2V0WShpKSksIGF6ID0gTWF0aC5hYnMobi5nZXRaKGkpKTtcbiAgICBsZXQgdSwgdjtcbiAgICBpZiAoYXkgPj0gYXggJiYgYXkgPj0gYXopeyB1ID0gcC5nZXRYKGkpOyB2ID0gcC5nZXRaKGkpOyB9XG4gICAgZWxzZSBpZiAoYXggPj0gYXopeyB1ID0gcC5nZXRaKGkpOyB2ID0gcC5nZXRZKGkpOyB9XG4gICAgZWxzZSB7IHUgPSBwLmdldFgoaSk7IHYgPSBwLmdldFkoaSk7IH1cbiAgICB1di5zZXRYWShpLCB1L3NjYWxlLCB2L3NjYWxlKTtcbiAgfVxuICB1di5uZWVkc1VwZGF0ZSA9IHRydWU7XG4gIHJldHVybiBnZW87XG59XG4vLyBCb3ggaW4gV2VsdGtvb3JkaW5hdGVuIChtaW4vbWF4KVxuZnVuY3Rpb24gYm94KG5hbWUsIG1hdCwgeDAseTAsejAsIHgxLHkxLHoxLCB1dlNjYWxlKXtcbiAgY29uc3QgZyA9IG5ldyBUSFJFRS5Cb3hHZW9tZXRyeSh4MS14MCwgeTEteTAsIHoxLXowKTtcbiAgZy50cmFuc2xhdGUoKHgwK3gxKS8yLCAoeTAreTEpLzIsICh6MCt6MSkvMik7XG4gIGlmICh1dlNjYWxlKSB3b3JsZFVWKGcsIHV2U2NhbGUpO1xuICBjb25zdCBtID0gbmV3IFRIUkVFLk1lc2goZywgbWF0KTsgbS5uYW1lID0gbmFtZTsgcmV0dXJuIG07XG59XG5cbmNvbnN0IGhvbWUgPSBuZXcgVEhSRUUuR3JvdXAoKTsgaG9tZS5uYW1lID0gJ3dvaG51bmcnO1xuY29uc3Qgd2FsbHMgPSBuZXcgVEhSRUUuR3JvdXAoKTsgd2FsbHMubmFtZSA9ICd3YWVuZGUnO1xuY29uc3QgZG9vcnMgPSBuZXcgVEhSRUUuR3JvdXAoKTsgZG9vcnMubmFtZSA9ICd0dWVyZW4nO1xuY29uc3Qgd2luZG93cyA9IG5ldyBUSFJFRS5Hcm91cCgpOyB3aW5kb3dzLm5hbWUgPSAnZmVuc3Rlcic7XG5ob21lLmFkZCh3YWxscywgZG9vcnMsIHdpbmRvd3MpO1xuXG4vLyAtLS0tLS0tLS0tIFTDvHIgKHByb3plZHVyYWwsIEthc3NldHRlbnTDvHIpIC0tLS0tLS0tLS1cbmZ1bmN0aW9uIG1ha2VEb29yKG5hbWUsIHQsIG9wZW5EZWcsIGdsYXNzRG9vcj1mYWxzZSwgdz1ET09SX1cpe1xuICBjb25zdCBnID0gbmV3IFRIUkVFLkdyb3VwKCk7IGcubmFtZSA9IG5hbWU7XG4gIGNvbnN0IGQgPSB0ICsgMC4wMztcbiAgZy5hZGQoYm94KG5hbWUrJ196YXJnZV9sJywgTS53b29kLCAtdy8yLCAwLCAtZC8yLCAtdy8yKzAuMDQsIERPT1JfSCwgZC8yKSk7XG4gIGcuYWRkKGJveChuYW1lKydfemFyZ2VfcicsIE0ud29vZCwgIHcvMi0wLjA0LCAwLCAtZC8yLCB3LzIsIERPT1JfSCwgZC8yKSk7XG4gIGcuYWRkKGJveChuYW1lKydfemFyZ2Vfb2JlbicsIE0ud29vZCwgLXcvMiwgRE9PUl9ILTAuMDQsIC1kLzIsIHcvMiwgRE9PUl9ILCBkLzIpKTtcbiAgY29uc3QgbHcgPSB3IC0gMC4wOCwgbGggPSBET09SX0ggLSAwLjA1LCBsdCA9IDAuMDQ7XG4gIGNvbnN0IHBpdm90ID0gbmV3IFRIUkVFLkdyb3VwKCk7IHBpdm90Lm5hbWUgPSBuYW1lKydfYmxhdHQnO1xuICBwaXZvdC5wb3NpdGlvbi5zZXQoLXcvMiArIDAuMDQsIDAuMDA1LCAwKTtcbiAgcGl2b3Qucm90YXRpb24ueSA9IFRIUkVFLk1hdGhVdGlscy5kZWdUb1JhZChvcGVuRGVnKTtcbiAgcGl2b3QuYWRkKGJveChuYW1lKydfdHVlcmJsYXR0JywgTS53b29kLCAwLCAwLCAtbHQvMiwgbHcsIGxoLCBsdC8yKSk7XG4gIGZvciAoY29uc3QgcyBvZiBbMSwtMV0pe1xuICAgIGNvbnN0IHowID0gcyowLjAxNCwgejEgPSBzKjAuMDI2LCB6ej1bTWF0aC5taW4oejAsejEpLE1hdGgubWF4KHowLHoxKV07XG4gICAgaWYgKGdsYXNzRG9vcil7XG4gICAgICBwaXZvdC5hZGQoYm94KG5hbWUrJ19nbGFzJywgTS5nbGFzcywgMC4xLCAwLjM1LCAtMC4wMDYsIGx3LTAuMSwgbGgtMC4xMiwgMC4wMDYpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGl2b3QuYWRkKGJveChuYW1lKydfa2Fzc2V0dGVfbycrcywgTS53b29kLCAwLjExLCAxLjA1LCB6elswXSwgbHctMC4xMSwgbGgtMC4xNCwgenpbMV0pKTtcbiAgICAgIHBpdm90LmFkZChib3gobmFtZSsnX2thc3NldHRlX3UnK3MsIE0ud29vZCwgMC4xMSwgMC4xNCwgenpbMF0sIGx3LTAuMTEsIDAuOSwgenpbMV0pKTtcbiAgICB9XG4gICAgY29uc3Qgcm9zZSA9IG5ldyBUSFJFRS5NZXNoKG5ldyBUSFJFRS5DeWxpbmRlckdlb21ldHJ5KDAuMDI2LDAuMDI2LDAuMDEyLDMyKSwgTS5tZXRhbCk7XG4gICAgcm9zZS5uYW1lID0gbmFtZSsnX3Jvc2V0dGUnK3M7IHJvc2Uucm90YXRpb24ueCA9IE1hdGguUEkvMjsgcm9zZS5wb3NpdGlvbi5zZXQobHctMC4wNywgMS4wNSwgcyoobHQvMiswLjAwNikpOyBwaXZvdC5hZGQocm9zZSk7XG4gICAgY29uc3QgbmVjayA9IG5ldyBUSFJFRS5NZXNoKG5ldyBUSFJFRS5DeWxpbmRlckdlb21ldHJ5KDAuMDA5LDAuMDA5LDAuMDUsMjApLCBNLm1ldGFsKTtcbiAgICBuZWNrLm5hbWUgPSBuYW1lKydfaGFscycrczsgbmVjay5yb3RhdGlvbi54ID0gTWF0aC5QSS8yOyBuZWNrLnBvc2l0aW9uLnNldChsdy0wLjA3LCAxLjA1LCBzKihsdC8yKzAuMDMpKTsgcGl2b3QuYWRkKG5lY2spO1xuICAgIGNvbnN0IGxldmVyID0gbmV3IFRIUkVFLk1lc2gobmV3IFRIUkVFLkNhcHN1bGVHZW9tZXRyeSgwLjAwOSwgMC4xMiwgNiwgMTYpLCBNLm1ldGFsKTtcbiAgICBsZXZlci5uYW1lID0gbmFtZSsnX2RydWVja2VyJytzOyBsZXZlci5yb3RhdGlvbi56ID0gTWF0aC5QSS8yOyBsZXZlci5wb3NpdGlvbi5zZXQobHctMC4xMywgMS4wNSwgcyoobHQvMiswLjA1NSkpOyBwaXZvdC5hZGQobGV2ZXIpO1xuICB9XG4gIGZvciAoY29uc3QgeSBvZiBbMC4yNSwgbGgtMC4yNV0pe1xuICAgIGNvbnN0IGggPSBuZXcgVEhSRUUuTWVzaChuZXcgVEhSRUUuQ3lsaW5kZXJHZW9tZXRyeSgwLjAwOCwwLjAwOCwwLjEsMTYpLCBNLm1ldGFsKTtcbiAgICBoLm5hbWUgPSBuYW1lKydfYmFuZCc7IGgucG9zaXRpb24uc2V0KC0wLjAwNCwgeSwgbHQvMik7IHBpdm90LmFkZChoKTtcbiAgfVxuICBnLmFkZChwaXZvdCk7XG4gIHJldHVybiBnO1xufVxuXG4vLyAtLS0tLS0tLS0tIEZlbnN0ZXIgLS0tLS0tLS0tLVxuZnVuY3Rpb24gbWFrZVdpbmRvdyhuYW1lLCB3LCB0LCBib3R0b20sIHRvcCl7XG4gIGNvbnN0IGcgPSBuZXcgVEhSRUUuR3JvdXAoKTsgZy5uYW1lID0gbmFtZTtcbiAgY29uc3QgZiA9IDAuMDUsIGQgPSAwLjA3O1xuICBnLmFkZChib3gobmFtZSsnX3JhaG1lbl9sJywgTS53b29kLCAtdy8yLCBib3R0b20sIC1kLzIsIC13LzIrZiwgdG9wLCBkLzIpKTtcbiAgZy5hZGQoYm94KG5hbWUrJ19yYWhtZW5fcicsIE0ud29vZCwgdy8yLWYsIGJvdHRvbSwgLWQvMiwgdy8yLCB0b3AsIGQvMikpO1xuICBnLmFkZChib3gobmFtZSsnX3JhaG1lbl9vJywgTS53b29kLCAtdy8yK2YsIHRvcC1mLCAtZC8yLCB3LzItZiwgdG9wLCBkLzIpKTtcbiAgZy5hZGQoYm94KG5hbWUrJ19yYWhtZW5fdScsIE0ud29vZCwgLXcvMitmLCBib3R0b20sIC1kLzIsIHcvMi1mLCBib3R0b20rZiwgZC8yKSk7XG4gIGlmICh3ID4gMS4xKSBnLmFkZChib3gobmFtZSsnX3Bmb3N0ZW4nLCBNLndvb2QsIC0wLjAyNSwgYm90dG9tK2YsIC1kLzIrMC4wMDUsIDAuMDI1LCB0b3AtZiwgZC8yLTAuMDA1KSk7XG4gIGcuYWRkKGJveChuYW1lKydfZ2xhcycsIE0uZ2xhc3MsIC13LzIrZiwgYm90dG9tK2YsIC0wLjAwNSwgdy8yLWYsIHRvcC1mLCAwLjAwNSkpO1xuICBpZiAoYm90dG9tID4gMCkgZy5hZGQoYm94KG5hbWUrJ19iYW5rJywgTS53b29kLCAtdy8yLTAuMDUsIGJvdHRvbS0wLjAyNywgLXQvMi0wLjA0LCB3LzIrMC4wNSwgYm90dG9tKzAuMDEyLCB0LzIrMC4wNCkpO1xuICByZXR1cm4gZztcbn1cblxuLy8gLS0tLS0tLS0tLSBXYW5kIG1pdCDDlmZmbnVuZ2VuIChhY2hzcGFyYWxsZWwsIE1ldGVyKSAtLS0tLS0tLS0tXG4vLyBhLi5iOiBBdXNkZWhudW5nIGVudGxhbmcgZGVyIFdhbmQsIGZpeGVkOiBNaXR0ZWxsaW5pZTsgb3BzOiB7YywgdywgdHlwZTonZG9vcid8J3dpbmRvdyd8J2dsYXNzZG9vcicsIG9wZW4sIGZsaXAsIG5hbWV9XG4vLyBvdXRzaWRlOiBCb3gtRmFjZS1JbmRleCBkZXIgQXXDn2Vuc2VpdGUgKDA6K3ggMToteCA0Oit6IDU6LXopIOKGkiBLbGlua2VyIGF1w59lbiwgUHV0eiBpbm5lbjsgZW5kczogU3Rpcm5zZWl0ZW4gYXXDn2VuIHNpY2h0YmFyXG5mdW5jdGlvbiB3YWxsKG5hbWUsIGEsIGIsIGZpeGVkLCBob3Jpem9udGFsLCB0LCBoLCBvcHM9W10sIG91dHNpZGU9LTEsIGVuZHM9W2ZhbHNlLGZhbHNlXSl7XG4gIGNvbnN0IEYgPSBmaXhlZDtcbiAgY29uc3Qgc2VnID0gKG4sIHMwLCBzMSwgeTAsIHkxLCBlZj1bXSkgPT4ge1xuICAgIGlmIChzMSAtIHMwIDwgMC4wMDEpIHJldHVybjtcbiAgICBjb25zdCBtYXQgPSBBcnJheSg2KS5maWxsKE0ud2FsbCk7XG4gICAgaWYgKG91dHNpZGUgPj0gMCl7IG1hdFtvdXRzaWRlXSA9IE0uYnJpY2s7IGVmLmZvckVhY2goZSA9PiBtYXRbZV0gPSBNLmJyaWNrKTsgfVxuICAgIGlmICh5MSA+PSBoIC0gMC4wMDAxKSBtYXRbMl0gPSBNLmNhcDtcbiAgICB3YWxscy5hZGQoaG9yaXpvbnRhbCA/IGJveChuLCBtYXQsIHMwLCB5MCwgRi10LzIsIHMxLCB5MSwgRit0LzIsIDEuNSlcbiAgICAgICAgICAgICAgICAgICAgICAgICA6IGJveChuLCBtYXQsIEYtdC8yLCB5MCwgczAsIEYrdC8yLCB5MSwgczEsIDEuNSkpO1xuICB9O1xuICBjb25zdCBlbmRBID0gZW5kc1swXSA/IFtob3Jpem9udGFsID8gMSA6IDVdIDogW10sIGVuZEIgPSBlbmRzWzFdID8gW2hvcml6b250YWwgPyAwIDogNF0gOiBbXTtcbiAgY29uc3QgbGlzdCA9IFsuLi5vcHNdLnNvcnQoKHAscSk9PnAuYy1xLmMpO1xuICBsZXQgY3VyID0gYTtcbiAgbGlzdC5mb3JFYWNoKChvLCBpKSA9PiB7XG4gICAgY29uc3QgczAgPSBvLmMgLSBvLncvMiwgczEgPSBvLmMgKyBvLncvMjtcbiAgICBzZWcoYCR7bmFtZX1fJHtpfWAsIGN1ciwgczAsIDAsIGgsIGkgPT09IDAgPyBlbmRBIDogW10pO1xuICAgIHNlZyhgJHtuYW1lfV9zdHVyel8ke2l9YCwgczAsIHMxLCBvLnR5cGUgPT09ICdkb29yJyA/IERPT1JfSCA6IFdJTl9ULCBoKTtcbiAgICBpZiAoby50eXBlID09PSAnd2luZG93Jykgc2VnKGAke25hbWV9X2JydWVzdHVuZ18ke2l9YCwgczAsIHMxLCAwLCBXSU5fQik7XG4gICAgbGV0IGVsO1xuICAgIGlmIChvLnR5cGUgPT09ICdkb29yJykgeyBlbCA9IG1ha2VEb29yKG8ubmFtZSwgdCwgby5vcGVuID8/IDAsIGZhbHNlLCBvLncpOyBkb29ycy5hZGQoZWwpOyB9XG4gICAgZWxzZSBpZiAoby50eXBlID09PSAnZ2xhc3Nkb29yJykgeyBlbCA9IG1ha2VXaW5kb3coby5uYW1lLCBvLncsIHQsIDAsIFdJTl9UKTsgd2luZG93cy5hZGQoZWwpOyB9XG4gICAgZWxzZSB7IGVsID0gbWFrZVdpbmRvdyhvLm5hbWUsIG8udywgdCwgV0lOX0IsIFdJTl9UKTsgd2luZG93cy5hZGQoZWwpOyB9XG4gICAgaWYgKGhvcml6b250YWwpIGVsLnBvc2l0aW9uLnNldChvLmMsIDAsIEYpO1xuICAgIGVsc2UgeyBlbC5wb3NpdGlvbi5zZXQoRiwgMCwgby5jKTsgZWwucm90YXRpb24ueSA9IE1hdGguUEkvMjsgfVxuICAgIGlmIChvLmZsaXApIGVsLnJvdGF0aW9uLnkgKz0gTWF0aC5QSTtcbiAgICBjdXIgPSBzMTtcbiAgfSk7XG4gIHNlZyhgJHtuYW1lfV8ke2xpc3QubGVuZ3RofWAsIGN1ciwgYiwgMCwgaCwgbGlzdC5sZW5ndGggPT09IDAgPyBbLi4uZW5kQSwgLi4uZW5kQl0gOiBlbmRCKTtcbn1cblxuLy8gR3J1bmRyaXNzIG5hY2ggTGlEQVItU2NhbjogUmF1bW1hw59lLCBXYW5kbGFnZW4sIMOWZmZudW5nc21pdHRlbi4gTmljaHQgw7xiZXJub21tZW46IOKAnk90aGVyIDTigJwtU3BhbHQsIFNjYW4tTcO2YmVsLFxuLy8gc2NocsOkZ2VyIFdhbmRyZXN0IGltIEZsdXIsIDEwLWNtLVZlcnNhdHogZGVyIE9zdGZhc3NhZGUgKGJlZ3JhZGlndCkuIFTDvHItL0ZlbnN0ZXJicmVpdGVuICsgTWF1ZXJ2b3JzcHJ1bmcgPSBIYW5kbWHDn2UuXG5jb25zdCBISSA9IEggLSAwLjAwMzsgLy8gSW5uZW53w6RuZGUgbWluaW1hbCBuaWVkcmlnZXIg4oaSIGtlaW4gWi1GaWdodGluZyBhdWYgZGVuIE9iZXJrYW50ZW5cbmNvbnN0IFhfRkwgPSAxLjIxOyAgICAgICAgICAgICAgLy8gSW5uZW5rYW50ZSBXZXN0d2FuZCBCYWQvRmx1ciAoU2NobGFmemltbWVyIHNwcmluZ3QgMSwyMSBtIHdlaXRlciBuYWNoIFdlc3RlbilcbmNvbnN0IFhfU1cgPSAyLjY2OyAgICAgICAgICAgICAgLy8gV2FuZG1pdHRlIFNjaGxhZnppbW1lciB8IFdvaG56aW1tZXJcbmNvbnN0IFhfU0NIID0gMi4xMTsgICAgICAgICAgICAgLy8gV2VzdGthbnRlIFNjaGFjaHRcbmNvbnN0IFhfQksgPSAzLjI5OyAgICAgICAgICAgICAgLy8gV2FuZG1pdHRlIEJhZCB8IEvDvGNoZVxuY29uc3QgWF9GSyA9IDMuNTg7ICAgICAgICAgICAgICAvLyBXYW5kbWl0dGUgRmx1ciB8IEvDvGNoZVxuY29uc3QgWF9FSyA9IDYuMTcsIFhfRSA9IDYuMjc7ICAvLyBJbm5lbmthbnRlIE9zdHdhbmQgS8O8Y2hlIC8gV29obnppbW1lclxuY29uc3QgWl9TQ0gwID0gMi41NCwgWl9TQ0gxID0gMy4zMTsgLy8gU2NoYWNodCBOb3JkLS9Tw7xka2FudGVcbmNvbnN0IFpfQkYgPSAzLjEzOyAgICAgICAgICAgICAgLy8gV2FuZG1pdHRlIEJhZCB8IEZsdXJcbmNvbnN0IFpfU1AgPSA0LjQwOyAgICAgICAgICAgICAgLy8gV2FuZG1pdHRlIEvDvGNoZS9GbHVyIHwgV29obi0vU2NobGFmemltbWVyXG5jb25zdCBaX1MgPSA4LjQ5OyAgICAgICAgICAgICAgIC8vIElubmVua2FudGUgU8O8ZHdhbmRcbmNvbnN0IFpTVCA9IFpfU1AgKyBUSS8yIC0gVEU7ICAgLy8gQXXDn2Vua2FudGUgUsO8Y2tzcHJ1bmcgKFRyZXBwZW5oYXVzKVxuLy8gUmF1bS1Jbm5lbmthbnRlbiBbeDAsIHowLCB4MSwgejFdXG5jb25zdCBSTV9TWiAgPSBbMCwgWl9TUCArIFRJLzIsIFhfU1cgLSBUSS8yLCBaX1NdOyAgICAgICAgICAgIC8vIFNjaGxhZnppbW1lciAyLDYxIMOXIDQsMDRcbmNvbnN0IFJNX1daICA9IFtYX1NXICsgVEkvMiwgWl9TUCArIFRJLzIsIFhfRSwgWl9TXTsgICAgICAgICAgLy8gV29obnppbW1lciAzLDU2IMOXIDQsMDRcbmNvbnN0IFJNX0tVICA9IFtYX0JLICsgVEkvMiwgMCwgWF9FSywgWl9TUCAtIFRJLzJdOyAgICAgICAgICAgLy8gS8O8Y2hlIDIsODMgw5cgNCwzNVxuY29uc3QgUk1fQkFEID0gW1hfRkwsIDAsIFhfQksgLSBUSS8yLCBaX0JGIC0gVEkvMl07ICAgICAgICAgICAvLyBCYWQgMiwwMyDDlyAzLDA4XG5jb25zdCBSTV9GTCAgPSBbWF9GTCwgWl9CRiArIFRJLzIsIFhfRksgLSBUSS8yLCBaX1NQIC0gVEkvMl07IC8vIEZsdXIgMiwzMiDDlyAxLDE3XG5jb25zdCBCQURfRE9PUiA9IHsgYzogMS43MCwgdzogMC43NSB9LCBTWl9ET09SID0geyBjOiAxLjc0LCB3OiAwLjgzIH0sIFdaX0RPT1IgPSB7IGM6IDQuODUsIHc6IDAuODMgfTtcbmNvbnN0IEtVX1dJTiA9IHsgYzogUk1fS1VbMF0gKyAwLjQ4ICsgMC4zMjUsIHc6IDAuNjUgfSwgS1VfRE9PUiA9IHsgYzogUk1fS1VbMF0gKyAwLjQ4ICsgMC42NSArIDAuMTIgKyAwLjQyNSwgdzogMC44NSB9O1xuXG4vLyBBdcOfZW53w6RuZGVcbndhbGwoJ2F1c3Nlbl9ub3JkJywgWF9GTCAtIFRFLCBYX0UgKyBURSwgLVRFLzIsIHRydWUsIFRFLCBILCBbXG4gIHsgYzogMi4yNSwgdzogMC44LCB0eXBlOid3aW5kb3cnLCBuYW1lOidmZW5zdGVyX2JhZCcgfSxcbiAgLy8gS8O8Y2hlOiBGZW5zdGVyICsgQmFsa29udMO8ciBhbHMgRWluaGVpdFxuICB7IC4uLktVX1dJTiwgdHlwZTond2luZG93JywgbmFtZTonZmVuc3Rlcl9rdWVjaGUnIH0sXG4gIHsgLi4uS1VfRE9PUiwgdHlwZTonZ2xhc3Nkb29yJywgbmFtZTonYmFsa29udHVlcicgfSxcbl0sIDUsIFt0cnVlLCB0cnVlXSk7XG53YWxsKCdhdXNzZW5fc3VlZCcsIC1URSwgWF9FICsgVEUsIFpfUyArIFRFLzIsIHRydWUsIFRFLCBILCBbXG4gIHsgYzogMC45NCwgdzogMC43LCB0eXBlOid3aW5kb3cnLCBuYW1lOidmZW5zdGVyX3NjaGxhZnppbW1lcicgfSxcbiAgeyBjOiAzLjM3LCB3OiAwLjcsIHR5cGU6J3dpbmRvdycsIG5hbWU6J2ZlbnN0ZXJfd29obnppbW1lcl8xJyB9LFxuICB7IGM6IDUuNDIsIHc6IDAuNywgdHlwZTond2luZG93JywgbmFtZTonZmVuc3Rlcl93b2huemltbWVyXzInIH0sXG5dLCA0LCBbdHJ1ZSwgdHJ1ZV0pO1xud2FsbCgnYXVzc2VuX3dlc3Rfc2NobGFmemltbWVyJywgWl9TUCArIFRJLzIsIFpfUywgLVRFLzIsIGZhbHNlLCBURSwgSCwgW10sIDEpO1xud2FsbCgnYXVzc2VuX25vcmRfc2NobGFmemltbWVyJywgLVRFLCBYX0ZMLCBaU1QgKyBURS8yLCB0cnVlLCBURSwgSCwgW10sIDUsIFt0cnVlLCBmYWxzZV0pO1xud2FsbCgnYXVzc2VuX3dlc3QnLCAwLCBaU1QsIFhfRkwgLSBURS8yLCBmYWxzZSwgVEUsIEgsIFtcbiAgeyBjOiAoWl9CRiArIFpfU1ApLzIsIHc6IERPT1JfVywgdHlwZTonZG9vcicsIG9wZW46IC0zNSwgbmFtZTond29obnVuZ3N0dWVyJyB9LFxuXSwgMSk7XG4vLyBPc3RmYXNzYWRlIGF1w59lbiBnZXJhZGU7IEvDvGNoZW53YW5kIGlubmVuIDEwIGNtIGRpY2tlciAoU2NhbilcbndhbGwoJ2F1c3Nlbl9vc3Rfa3VlY2hlJywgMCwgWl9TUCwgKFhfRUsgKyBYX0UgKyBURSkvMiwgZmFsc2UsIFhfRSArIFRFIC0gWF9FSywgSCwgW10sIDApO1xud2FsbCgnYXVzc2VuX29zdCcsIFpfU1AsIFpfUywgWF9FICsgVEUvMiwgZmFsc2UsIFRFLCBILCBbXSwgMCk7XG4vLyBJbm5lbnfDpG5kZVxud2FsbCgnaW5uZW5fYmFkX2t1ZWNoZScsIDAsIFpfU0NIMCwgWF9CSywgZmFsc2UsIFRJLCBISSk7XG53YWxsKCdpbm5lbl9iYWRfZmx1cicsIFhfRkwsIFhfU0NILCBaX0JGLCB0cnVlLCBUSSwgSEksIFtcbiAgeyAuLi5CQURfRE9PUiwgdHlwZTonZG9vcicsIG9wZW46IDgwLCBuYW1lOid0dWVyX2JhZCcgfSxcbl0pO1xud2FsbCgnaW5uZW5fZmx1cl9rdWVjaGUnLCBaX1NDSDEsIFpfU1AgLSBUSS8yLCBYX0ZLLCBmYWxzZSwgVEksIEhJLCBbXG4gIHsgYzogMy43OCwgdzogMC44NiwgdHlwZTonZG9vcicsIG9wZW46IC03MCwgbmFtZTondHVlcl9rdWVjaGUnIH0sXG5dKTtcbndhbGwoJ2lubmVuX21pdHRlJywgWF9GTCwgWF9FLCBaX1NQLCB0cnVlLCBUSSwgSEksIFtcbiAgeyAuLi5TWl9ET09SLCB0eXBlOidkb29yJywgb3BlbjogNTUsIGZsaXA6dHJ1ZSwgbmFtZTondHVlcl9zY2hsYWZ6aW1tZXInIH0sXG4gIHsgLi4uV1pfRE9PUiwgdHlwZTonZG9vcicsIG9wZW46IDY1LCBmbGlwOnRydWUsIG5hbWU6J3R1ZXJfd29obnppbW1lcicgfSxcbl0pO1xud2FsbCgnaW5uZW5fc2NobGFmZW5fd29obmVuJywgWl9TUCArIFRJLzIsIFpfUywgWF9TVywgZmFsc2UsIFRJLCBISSk7XG4vLyBTY2hhY2h0IHp3aXNjaGVuIEJhZCwgRmx1ciB1bmQgS8O8Y2hlIChTY2FuOiBIb2hscmF1bSA1NiDDlyAxNDUgY20gb2huZSBXYW5kIHp1ciBLw7xjaGUg4oaSIGFscyBnZXNjaGxvc3NlbiBhbmdlbm9tbWVuKVxueyBjb25zdCBtID0gQXJyYXkoNikuZmlsbChNLndhbGwpOyBtWzJdID0gTS5jYXA7IHdhbGxzLmFkZChib3goJ3NjaGFjaHQnLCBtLCBYX1NDSCwgMCwgWl9TQ0gwLCBYX0ZLICsgVEkvMiwgSEksIFpfU0NIMSwgMS41KSk7IH1cblxuLy8gLS0tLS0tLS0tLSBCb2RlbiwgU29ja2VsLCBCYWxrb24gLS0tLS0tLS0tLVxuY29uc3QgT1VUTElORSA9IFtbWF9GTCAtIFRFLzIsIC1URS8yXSwgW1hfRSArIFRFLzIsIC1URS8yXSwgW1hfRSArIFRFLzIsIFpfUyArIFRFLzJdLCBbLVRFLzIsIFpfUyArIFRFLzJdLCBbLVRFLzIsIFpTVCArIFRFLzJdLCBbWF9GTCAtIFRFLzIsIFpTVCArIFRFLzJdXTtcbmNvbnN0IGZsb29yR2VvID0gbmV3IFRIUkVFLlNoYXBlR2VvbWV0cnkobmV3IFRIUkVFLlNoYXBlKE9VVExJTkUubWFwKChbeCwgel0pID0+IG5ldyBUSFJFRS5WZWN0b3IyKHgsIC16KSkpKTtcbmZsb29yR2VvLnJvdGF0ZVgoLU1hdGguUEkvMik7IGZsb29yR2VvLnRyYW5zbGF0ZSgwLCAwLjAwMiwgMCk7XG53b3JsZFVWKGZsb29yR2VvLCAxLjApO1xuY29uc3QgZmxvb3IgPSBuZXcgVEhSRUUuTWVzaChmbG9vckdlbywgTS5mbG9vcik7IGZsb29yLm5hbWUgPSAnYm9kZW5fd29vZF9mbG9vcic7XG5ob21lLmFkZChmbG9vcik7XG5ob21lLmFkZChib3goJ3NvY2tlbF9ub3JkJywgTS5wbGludGgsIFhfRkwgLSBURSAtIDAuMDUsIC0wLjEyLCAtVEUgLSAwLjA1LCBYX0UgKyBURSArIDAuMDUsIDAsIFpTVCAtIDAuMDUpKTtcbmhvbWUuYWRkKGJveCgnc29ja2VsX3N1ZWQnLCBNLnBsaW50aCwgLVRFIC0gMC4wNSwgLTAuMTIsIFpTVCAtIDAuMDUsIFhfRSArIFRFICsgMC4wNSwgMCwgWl9TICsgVEUgKyAwLjA1KSk7XG4vLyBCYWxrb24gw7xiZXIgZGllIGdhbnplIEvDvGNoZW5icmVpdGUsIDIsMjYgbSB0aWVmIChTY2FuKTsgQnLDvHN0dW5nZW4gc3RhdHQgZGVyIGdlc2Nhbm50ZW4gV8OkbmRlXG5jb25zdCBQSCA9IDEuMCwgUFQgPSAwLjA4O1xuY29uc3QgQlgwID0gUk1fS1VbMF0gLSBQVCwgQlgxID0gUk1fS1VbMl0gKyBQVCwgQloxID0gLVRFLCBCWjAgPSBCWjEgLSAyLjI2IC0gUFQ7XG5ob21lLmFkZChib3goJ2JhbGtvbl9wbGF0dGUnLCBNLmJhbGNvbnksIEJYMCwgLTAuMTIsIEJaMCwgQlgxLCAwLjAyLCBCWjEpKTtcbmhvbWUuYWRkKGJveCgnYmFsa29uX2JydWVzdHVuZ193JywgTS53YWxsLCBCWDAsIDAuMDIsIEJaMCwgQlgwK1BULCBQSCwgQloxLCAxLjUpKTtcbmhvbWUuYWRkKGJveCgnYmFsa29uX2JydWVzdHVuZ19vJywgTS53YWxsLCBCWDEtUFQsIDAuMDIsIEJaMCwgQlgxLCBQSCwgQloxLCAxLjUpKTtcbmhvbWUuYWRkKGJveCgnYmFsa29uX2JydWVzdHVuZ19uJywgTS53YWxsLCBCWDArUFQsIDAuMDIsIEJaMCwgQlgxLVBULCBQSC0wLjAwMiwgQlowK1BULCAxLjUpKTtcblxuLy8gLS0tLS0tLS0tLSBXb2huemltbWVyIChSYXVtIFPDvGQtT3N0KSAtLS0tLS0tLS0tXG5jb25zdCB3b2huID0gbmV3IFRIUkVFLkdyb3VwKCk7IHdvaG4ubmFtZSA9ICd3b2huemltbWVyJztcbmNvbnN0IElOX08gPSBYX0UsIElOX1MgPSBaX1MsIFdaX0NYID0gKFJNX1daWzBdICsgUk1fV1pbMl0pLzIsIFNPRkFfWiA9IFpfUyAtIDEuNzQ1OyAgIC8vIElubmVua2FudGVuIE9zdC0vU8O8ZHdhbmRcbi8vIFNvZmEgYW4gZGVyIE9zdHdhbmQsIFLDvGNrZW4genVyIFdhbmRcbmNvbnN0IHNvZmEgPSBidWlsZFNvZmEoVEhSRUUpO1xuc29mYS5ncm91cC5wb3NpdGlvbi5zZXQoSU5fTyAtIHNvZmEuRC8yIC0gMC4wMywgMC4wMDIsIFNPRkFfWik7XG5zb2ZhLmdyb3VwLnJvdGF0aW9uLnkgPSAtTWF0aC5QSS8yO1xud29obi5hZGQoc29mYS5ncm91cCk7XG4vLyAzIFJlZ2FsZSBuZWJlbmVpbmFuZGVyIHVudGVyIGRlbSBTw7xkZmVuc3RlciwgRnJvbnQgenVtIFJhdW1cbmNvbnN0IFJNID0gcmVnYWxNYXRlcmlhbHMoVEhSRUUpO1xuZm9yIChjb25zdCBbaSwgZHhdIG9mIFtbMSwtMC42MDNdLFsyLDBdLFszLDAuNjAzXV0pe1xuICBjb25zdCByID0gYnVpbGRSZWdhbChUSFJFRSwgUk0pOyByLm5hbWUgPSAncmVnYWxfJytpO1xuICByLnBvc2l0aW9uLnNldChXWl9DWCArIGR4LCAwLjAwMiwgSU5fUyAtIDAuMTM1IC0gMC4wMik7XG4gIHIucm90YXRpb24ueSA9IE1hdGguUEk7XG4gIHdvaG4uYWRkKHIpO1xufVxuLy8gQm94ZW4gb2JlbiBhdWYgZGVuIMOkdcOfZXJlbiBSZWdhbGVuLCBsZWljaHQgbmFjaCBpbm5lbiBnZWRyZWh0XG57XG4gIGNvbnN0IGJ4ID0gYnVpbGRCb3hlbihUSFJFRSksIHRvcCA9IG5ldyBUSFJFRS5Cb3gzKCkuc2V0RnJvbU9iamVjdCh3b2huLmdldE9iamVjdEJ5TmFtZSgncmVnYWxfMScpKS5tYXgueTtcbiAgY29uc3QgVFVSTiA9IFRIUkVFLk1hdGhVdGlscy5kZWdUb1JhZCgxNSksIFggPSAwLjYwMyArIDAuMzAgLSAwLjEwNSwgWiA9IElOX1MgLSAwLjEzNSAtIDAuMDI7XG4gIC8vIEFrdGl2Ym94IGxpbmtzICjigJN4KSwgQmVkaWVuZmVsZCB6ZWlndCBuYWNoIGF1w59lblxuICBieC5yZWNodHMucG9zaXRpb24uc2V0KFdaX0NYIC0gWCwgdG9wLCBaKTsgYngucmVjaHRzLnJvdGF0aW9uLnkgPSBNYXRoLlBJIC0gVFVSTjtcbiAgYngubGlua3MucG9zaXRpb24uc2V0KFdaX0NYICsgWCwgdG9wLCBaKTsgIGJ4LmxpbmtzLnJvdGF0aW9uLnkgPSBNYXRoLlBJICsgVFVSTjtcbiAgd29obi5hZGQoYngubGlua3MsIGJ4LnJlY2h0cyk7XG59XG4vLyBCb2dlbmxhbXBlIGluIGRlciBGZW5zdGVyZWNrZSwgU2NoaXJtIMO8YmVyIGRlbSBTb2ZhIOKAkyB6dXIgUmF1bW1pdHRlIHZlcnNldHp0XG5jb25zdCBsYW1wZSA9IGJ1aWxkTGFtcGUoVEhSRUUpO1xuY29uc3QgTEIgPSBuZXcgVEhSRUUuVmVjdG9yMihJTl9PIC0gMC4yMiwgSU5fUyAtIDAuMjUpO1xuY29uc3QgTFQgPSBuZXcgVEhSRUUuVmVjdG9yMihJTl9PIC0gMC45NSwgU09GQV9aICsgMC4yNSk7XG5sYW1wZS5ncm91cC5wb3NpdGlvbi5zZXQoTEIueCwgMC4wMDIsIExCLnkpO1xubGFtcGUuZ3JvdXAucm90YXRpb24ueSA9IE1hdGguYXRhbjIoLShMVC55IC0gTEIueSksIExULnggLSBMQi54KTtcbndvaG4uYWRkKGxhbXBlLmdyb3VwKTtcbi8vIERvbnV0LUxhbXBlICjDmCAzMCBjbSwgSCAxMSBjbSkgaW0gbGlua2VuIFJlZ2FsLCBtaXR0bGVyZXMgRmFjaCwgbWl0dGlnXG5jb25zdCBETSA9IHtcbiAga29lcnBlcjogbmV3IFRIUkVFLk1lc2hQaHlzaWNhbE1hdGVyaWFsKHsgbmFtZTonZG9udXRfb3BhbF9vcmFuZ2UnLCBjb2xvcjoweGZmYTA0YSwgcm91Z2huZXNzOjAuNiwgY2xlYXJjb2F0OjAuMiwgY2xlYXJjb2F0Um91Z2huZXNzOjAuNSwgZW1pc3NpdmU6MHhmZjhhMmEsIGVtaXNzaXZlSW50ZW5zaXR5OjAgfSksXG4gIHNvY2tlbDogIG5ldyBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCh7IG5hbWU6J2RvbnV0X3NvY2tlbCcsIGNvbG9yOjB4ZWU2YTNlLCByb3VnaG5lc3M6MC41LCBlbWlzc2l2ZToweGQwNGEyMCwgZW1pc3NpdmVJbnRlbnNpdHk6MCB9KSxcbiAga25vcGY6ICAgbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgbmFtZTonZG9udXRfa25vcGYnLCBjb2xvcjoweDlhNmE1OCwgcm91Z2huZXNzOjAuNDUgfSksXG59O1xuY29uc3QgZG9udXQgPSBuZXcgVEhSRUUuR3JvdXAoKTsgZG9udXQubmFtZSA9ICdkb251dGxhbXBlJztcbntcbiAgY29uc3QgVjIgPSAoeCx5KSA9PiBuZXcgVEhSRUUuVmVjdG9yMih4LHkpLCBkbSA9IChuLGcsbSx5PTApID0+IHsgY29uc3QgbyA9IG5ldyBUSFJFRS5NZXNoKGcsbSk7IG8ubmFtZSA9IG47IG8ucG9zaXRpb24ueSA9IHk7IGRvbnV0LmFkZChvKTsgfTtcbiAgY29uc3QgU0JfUiA9IDAuMTIsIFNCX0ggPSAwLjAxOCwgc3AgPSBbVjIoMCwwKSwgVjIoU0JfUi0wLjAwNiwwKV07XG4gIGZvciAobGV0IGkgPSAwOyBpIDw9IDEyOyBpKyspeyBjb25zdCBhID0gLU1hdGguUEkvMiArIGkvMTIqTWF0aC5QSTsgc3AucHVzaChWMihTQl9SLTAuMDA2K01hdGguY29zKGEpKjAuMDA2LCAwLjAwNitNYXRoLnNpbihhKSowLjAwNisoaT42PyhTQl9ILTAuMDEyKSooaS02KS82OjApKSk7IH1cbiAgc3AucHVzaChWMigwLCBTQl9IKSk7XG4gIGRtKCdkb251dF9zb2NrZWwnLCBuZXcgVEhSRUUuTGF0aGVHZW9tZXRyeShzcCwgOTYpLCBETS5zb2NrZWwpO1xuICBjb25zdCBSID0gMC4wODUsIEEgPSAwLjA2NSwgQiA9IDAuMDQ3NSwgQ1kgPSAwLjA2MjUsIHNnID0gdiA9PiBNYXRoLnNpZ24odikqTWF0aC5wb3coTWF0aC5hYnModiksIDAuOCksIGtwID0gW1YyKDAsMC4wMTUpXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPD0gNjA7IGkrKyl7IGNvbnN0IHQgPSAtTWF0aC5QSS8yICsgaS82MCoxLjM1Kk1hdGguUEk7IGtwLnB1c2goVjIoUitBKnNnKE1hdGguY29zKHQpKSwgQ1krQipzZyhNYXRoLnNpbih0KSkpKTsgfVxuICBrcC5wdXNoKFYyKDAuMDE4LDAuMDc4KSwgVjIoMC4wMDgsMC4wNzU1KSwgVjIoMCwwLjA3NSkpO1xuICBkbSgnZG9udXRfa29lcnBlcicsIG5ldyBUSFJFRS5MYXRoZUdlb21ldHJ5KGtwLCAxMjgpLCBETS5rb2VycGVyKTtcbiAgZG0oJ2RvbnV0X2tub3BmJywgbmV3IFRIUkVFLkN5bGluZGVyR2VvbWV0cnkoMC4wMiwgMC4wMjIsIDAuMDA0LCA0MCksIERNLmtub3BmLCAwLjA3Nyk7XG59XG5kb251dC5wb3NpdGlvbi5zZXQoV1pfQ1ggLSAwLjYwMywgMC4wMDIgKyAwLjQyLCBJTl9TIC0gMC4xMzUgLSAwLjAyKTtcbndvaG4uYWRkKGRvbnV0KTtcbi8vIEZlcm5zZWhlciAoNDNcIikgYXVmIHp3ZWkgU29mYS1LYXJ0b25zIGFuIGRlciBXZXN0d2FuZCwgZ2VnZW7DvGJlciBkZW0gU29mYVxue1xuICBjb25zdCB0diA9IG5ldyBUSFJFRS5Hcm91cCgpOyB0di5uYW1lID0gJ2Zlcm5zZWhlcic7XG4gIGNvbnN0IEsgPSBuZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoeyBuYW1lOidrYXJ0b24nLCBjb2xvcjoweGE5ODI1YSwgcm91Z2huZXNzOjAuOSB9KTtcbiAgY29uc3QgS1QgPSBuZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoeyBuYW1lOidrYXJ0b25fZHJ1Y2snLCBjb2xvcjoweDNhMmQyMiwgcm91Z2huZXNzOjAuOSB9KTtcbiAgY29uc3QgVFZNID0gbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgbmFtZTondHZfZ2VoYWV1c2UnLCBjb2xvcjoweDE0MTQxNiwgcm91Z2huZXNzOjAuNDUsIG1ldGFsbmVzczowLjIgfSk7XG4gIGNvbnN0IFNDUiA9IG5ldyBUSFJFRS5NZXNoUGh5c2ljYWxNYXRlcmlhbCh7IG5hbWU6J3R2X2JpbGRzY2hpcm0nLCBjb2xvcjoweDA1MDYwNywgcm91Z2huZXNzOjAuMDgsIGNsZWFyY29hdDoxLCBjbGVhcmNvYXRSb3VnaG5lc3M6MC4wNSB9KTtcbiAgY29uc3QgRlQgPSBuZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoeyBuYW1lOid0dl9mdXNzJywgY29sb3I6MHg5YTllYTMsIHJvdWdobmVzczowLjM1LCBtZXRhbG5lc3M6MC43IH0pO1xuICBjb25zdCB4MCA9IFJNX1daWzBdICsgMC4wMiwgemMgPSBTT0ZBX1osIEtXID0gMS4xNSwgS0QgPSAwLjUsIEtIID0gMC4zODtcbiAgdHYuYWRkKGJveCgna2FydG9uX3VudGVuJywgSywgeDAsIDAuMDAyLCB6YyAtIEtXLzIsIHgwICsgS0QsIEtILCB6YyArIEtXLzIpKTtcbiAgdHYuYWRkKGJveCgna2FydG9uX29iZW4nLCBLLCB4MCArIDAuMDEsIEtILCB6YyAtIEtXLzIgKyAwLjAxNSwgeDAgKyBLRCArIDAuMDA1LCAyKktILCB6YyArIEtXLzIgKyAwLjAxKSk7XG4gIGZvciAoY29uc3QgeSBvZiBbMC4zLCAwLjMgKyBLSF0pIHR2LmFkZChib3goJ2thcnRvbl9hdWZkcnVjaycsIEtULCB4MCArIEtEICsgMC4wMDQsIHkgLSAwLjAyLCB6YyAtIDAuMjUsIHgwICsgS0QgKyAwLjAwNywgeSwgemMgKyAwLjI1KSk7XG4gIGNvbnN0IHRvcCA9IDIqS0gsIHhiID0geDAgKyAwLjI0LCB0dyA9IDAuOTcsIHRoID0gMC41NywgZmggPSAwLjA3O1xuICB0di5hZGQoYm94KCd0dl9yYWhtZW4nLCBUVk0sIHhiLCB0b3AgKyBmaCwgemMgLSB0dy8yLCB4YiArIDAuMDQ1LCB0b3AgKyBmaCArIHRoLCB6YyArIHR3LzIpKTtcbiAgdHYuYWRkKGJveCgndHZfYmlsZHNjaGlybScsIFNDUiwgeGIgKyAwLjA0NSwgdG9wICsgZmggKyAwLjAxMiwgemMgLSB0dy8yICsgMC4wMTIsIHhiICsgMC4wNDcsIHRvcCArIGZoICsgdGggLSAwLjAxMiwgemMgKyB0dy8yIC0gMC4wMTIpKTtcbiAgdHYuYWRkKGJveCgndHZfcnVlY2tzZWl0ZScsIFRWTSwgeGIgLSAwLjA0LCB0b3AgKyBmaCArIDAuMDgsIHpjIC0gMC4zLCB4YiwgdG9wICsgZmggKyAwLjQ1LCB6YyArIDAuMykpO1xuICBmb3IgKGNvbnN0IHMgb2YgWy0xLCAxXSl7XG4gICAgY29uc3QgZiA9IGJveCgndHZfZnVzcycsIEZULCAtMC4wOSwgMCwgLTAuMDEyLCAwLjA5LCAwLjAxMiwgMC4wMTIpOyBmLnBvc2l0aW9uLnNldCh4YiArIDAuMDIsIHRvcCwgemMgKyBzKjAuNDEpOyBmLnJvdGF0aW9uLnkgPSBzKjAuNTsgdHYuYWRkKGYpO1xuICAgIHR2LmFkZChib3goJ3R2X2Z1c3Nfc3RlZycsIEZULCB4YiArIDAuMDEsIHRvcCwgemMgKyBzKjAuNDEgLSAwLjAxLCB4YiArIDAuMDMsIHRvcCArIGZoLCB6YyArIHMqMC40MSArIDAuMDEpKTtcbiAgfVxuICB0di5hZGQoYm94KCdyZWNlaXZlcicsIFRWTSwgeGIgKyAwLjA2LCB0b3AsIHpjIC0gMC4yOCwgeGIgKyAwLjIsIHRvcCArIDAuMDMsIHpjIC0gMC4wNikpO1xuICB0di50cmF2ZXJzZShvID0+IHsgaWYgKG8uaXNNZXNoKXsgby5jYXN0U2hhZG93ID0gdHJ1ZTsgby5yZWNlaXZlU2hhZG93ID0gdHJ1ZTsgfSB9KTtcbiAgd29obi5hZGQodHYpO1xufVxud29obi50cmF2ZXJzZShvID0+IHsgaWYgKG8uaXNNZXNoKXsgby5jYXN0U2hhZG93ID0gdHJ1ZTsgby5yZWNlaXZlU2hhZG93ID0gdHJ1ZTsgfSB9KTtcbmhvbWUuYWRkKHdvaG4pO1xuLy8gLS0tLS0tLS0tLSBTY2hsYWZ6aW1tZXI6IFRyaXBvZC1MYW1wZSBhdWYgZGVtIEJvZGVuLCBTw7xkd2VzdC1FY2tlLCBTcG90IHp1ciBSYXVtbWl0dGUgLS0tLS0tLS0tLVxuY29uc3QgdHJpcCA9IGJ1aWxkVHJpcG9kKFRIUkVFKTtcbntcbiAgY29uc3QgSU5fVyA9IFJNX1NaWzBdLCBweCA9IElOX1cgKyAwLjM1LCBweiA9IElOX1MgLSAwLjM1O1xuICBjb25zdCBjeCA9IChSTV9TWlswXSArIFJNX1NaWzJdKS8yLCBjeiA9IChSTV9TWlsxXSArIFJNX1NaWzNdKS8yO1xuICB0cmlwLmdyb3VwLnBvc2l0aW9uLnNldChweCwgMC4wMDIsIHB6KTtcbiAgdHJpcC5ncm91cC5yb3RhdGlvbi55ID0gTWF0aC5hdGFuMihjeCAtIHB4LCBjeiAtIHB6KTtcbiAgaG9tZS5hZGQodHJpcC5ncm91cCk7XG59XG5cblxuLy8gLS0tLS0tLS0tLSBTY2hsYWZ6aW1tZXI6IEJldHQgKDE0MCDDlyAyMDAsIEtvcGZ0ZWlsIE9zdHdhbmQsIHJlY2h0cyBhbiBkZXIgU8O8ZHdhbmQpICsgU2NobWlua3Rpc2NoIC0tLS0tLS0tLS1cbntcbiAgY29uc3Qgc3ogPSBuZXcgVEhSRUUuR3JvdXAoKTsgc3oubmFtZSA9ICdzY2hsYWZ6aW1tZXJfbW9lYmVsJztcbiAgY29uc3QgYWRkID0gbSA9PiB7IHN6LmFkZChtKTsgcmV0dXJuIG07IH07XG4gIGNvbnN0IExFID0gbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgbmFtZTonYmV0dF9rdW5zdGxlZGVyJywgY29sb3I6MHhlZWU4ZGMsIHJvdWdobmVzczowLjU1IH0pO1xuICBjb25zdCBTSCA9IG5ldyBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCh7IG5hbWU6J3NwYW5uYmV0dHR1Y2gnLCBjb2xvcjoweDY3Njk2ZSwgcm91Z2huZXNzOjAuOTUgfSk7XG4gIGNvbnN0IERFID0gbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgbmFtZTona3VzY2hlbGRlY2tlJywgY29sb3I6MHg1ODU4NWIsIHJvdWdobmVzczoxIH0pO1xuICBjb25zdCBLSSA9IG5ldyBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCh7IG5hbWU6J2tpc3NlbicsIGNvbG9yOjB4ZjRmM2VmLCByb3VnaG5lc3M6MC45IH0pO1xuICBjb25zdCBMSyA9IG5ldyBUSFJFRS5NZXNoUGh5c2ljYWxNYXRlcmlhbCh7IG5hbWU6J2xhY2tfd2Vpc3NfaG9jaGdsYW56JywgY29sb3I6MHhmNmY2ZjQsIHJvdWdobmVzczowLjE1LCBjbGVhcmNvYXQ6MC44LCBjbGVhcmNvYXRSb3VnaG5lc3M6MC4xIH0pO1xuICBjb25zdCBTUCA9IG5ldyBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCh7IG5hbWU6J3NwaWVnZWxfc2NobWlua3Rpc2NoJywgY29sb3I6MHhkZmU1ZTgsIHJvdWdobmVzczowLjAzLCBtZXRhbG5lc3M6MSB9KTtcbiAgY29uc3QgQlUgPSBuZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoeyBuYW1lOidzcGllZ2VsX2Jpcm5lJywgY29sb3I6MHhmZmZmZmYsIHJvdWdobmVzczowLjMsIGVtaXNzaXZlOjB4ZmZmMWQ4LCBlbWlzc2l2ZUludGVuc2l0eTowLjE1IH0pO1xuICBjb25zdCBFID0gUk1fU1pbMl0sIFMgPSBSTV9TWlszXTtcbiAgLy8gQmV0dFxuICBjb25zdCBIQiA9IDAuMSwgYngwID0gRSAtIEhCIC0gMi4wLCBiejAgPSBTIC0gMS40NiwgYnoxID0gUyAtIDAuMDE7XG4gIGFkZChib3goJ2JldHRfc29ja2VsJywgTS5wbGludGgsIGJ4MCArIDAuMDYsIDAsIGJ6MCArIDAuMDYsIEUgLSBIQiAtIDAuMDYsIDAuMDYsIGJ6MSAtIDAuMDYpKTtcbiAgYWRkKGJveCgnYmV0dF9yYWhtZW4nLCBMRSwgYngwLCAwLjA2LCBiejAsIEUgLSBIQiwgMC4zNiwgYnoxKSk7XG4gIGFkZChib3goJ2JldHRfbWF0cmF0emUnLCBTSCwgYngwICsgMC4wMiwgMC4zNiwgYnowICsgMC4wMywgRSAtIEhCIC0gMC4wMSwgMC41NiwgYnoxIC0gMC4wMykpO1xuICBhZGQoYm94KCdiZXR0X2tvcGZ0ZWlsJywgTEUsIEUgLSBIQiwgMC4wNiwgYnowLCBFIC0gMC4wMDIsIDEuMTIsIGJ6MSkpO1xuICBhZGQoYm94KCdiZXR0X2tvcGZ0ZWlsX2FibGFnZScsIExFLCBFIC0gSEIgLSAwLjA1LCAxLjA0LCBiejAsIEUgLSAwLjAwMiwgMS4xMiwgYnoxKSk7XG4gIGZvciAoY29uc3QgeSBvZiBbMC43MiwgMC44NiwgMS4wXSkgZm9yIChsZXQgaSA9IDA7IGkgPCAxMTsgaSsrKXtcbiAgICBjb25zdCBiID0gbmV3IFRIUkVFLk1lc2gobmV3IFRIUkVFLlNwaGVyZUdlb21ldHJ5KDAuMDA5LCAxMCwgOCksIExFKTsgYi5uYW1lID0gJ2JldHRfa25vcGYnO1xuICAgIGIucG9zaXRpb24uc2V0KEUgLSBIQiAtIDAuMDAyLCB5LCBiejAgKyAwLjEgKyBpKihiejEgLSBiejAgLSAwLjIpLzEwICsgKHkgPT09IDAuODYgPyAwLjA2IDogMCkpOyBpZiAoYi5wb3NpdGlvbi56IDwgYnoxIC0gMC4wNSkgYWRkKGIpO1xuICB9XG4gIGNvbnN0IHBpbCA9IGFkZChuZXcgVEhSRUUuTWVzaChuZXcgVEhSRUUuU3BoZXJlR2VvbWV0cnkoMSwgMzIsIDE2KSwgS0kpKTsgcGlsLm5hbWUgPSAna29wZmtpc3Nlbic7XG4gIHBpbC5zY2FsZS5zZXQoMC4yLCAwLjA3LCAwLjM0KTsgcGlsLnBvc2l0aW9uLnNldChFIC0gSEIgLSAwLjI0LCAwLjYsIGJ6MCArIDAuNSk7XG4gIGFkZChib3goJ2RlY2tlX29iZW4nLCBERSwgYngwICsgMC4wNSwgMC41NiwgYnowIC0gMC4wMiwgRSAtIEhCIC0gMC41LCAwLjYsIGJ6MSAtIDAuMDIpKTtcbiAgYWRkKGJveCgnZGVja2Vfc2VpdGUnLCBERSwgYngwICsgMC4wNSwgMC4zLCBiejAgLSAwLjAzLCBFIC0gSEIgLSAwLjUsIDAuNiwgYnowIC0gMC4wMSkpO1xuICBhZGQoYm94KCdkZWNrZV9mdXNzJywgREUsIGJ4MCArIDAuMDMsIDAuMzIsIGJ6MCAtIDAuMDIsIGJ4MCArIDAuMDUsIDAuNiwgYnoxIC0gMC4wMikpO1xuICAvLyBTY2htaW5rdGlzY2ggYW4gZGVyIE9zdHdhbmQgendpc2NoZW4gSGVpemvDtnJwZXIgdW5kIEJldHQsIFNjaHVibGFkZW4gbGlua3MgKE5vcmRlbilcbiAgY29uc3QgRCA9IDAuNDUsIHgxID0gRSwgeDAgPSBFIC0gRCwgejAgPSBSTV9TWlsxXSArIDEuMCwgejEgPSB6MCArIDEuMSwgSCA9IDAuNzYsIFBXID0gMC40LCBUID0gMC4wMTg7XG4gIGFkZChib3goJ3NjaG1pbmt0aXNjaF9wbGF0dGUnLCBMSywgeDAsIEggLSAwLjAyNSwgejAsIHgxLCBILCB6MSkpO1xuICBhZGQoYm94KCdzY2htaW5rdGlzY2hfa29ycHVzJywgTEssIHgwLCAwLjA0LCB6MCwgeDEsIEggLSAwLjAyNSwgejAgKyBQVykpO1xuICBhZGQoYm94KCdzY2htaW5rdGlzY2hfc29ja2VsJywgTEssIHgwICsgMC4wMiwgMCwgejAgKyAwLjAyLCB4MSwgMC4wNCwgejAgKyBQVyAtIDAuMDIpKTtcbiAgYWRkKGJveCgnc2NobWlua3Rpc2NoX3NlaXRlJywgTEssIHgwLCAwLCB6MSAtIFQsIHgxLCBIIC0gMC4wMjUsIHoxKSk7XG4gIGFkZChib3goJ3NjaG1pbmt0aXNjaF96YXJnZScsIExLLCB4MCwgSCAtIDAuMTUsIHowICsgUFcsIHgxLCBIIC0gMC4wMjUsIHoxIC0gVCkpO1xuICBhZGQoYm94KCdzY2htaW5rdGlzY2hfcnVlY2t3YW5kJywgTEssIHgxIC0gMC4wMTUsIDAuMDQsIHowICsgUFcsIHgxLCBIIC0gMC4xNSwgejEgLSBUKSk7XG4gIGNvbnN0IGZyb250cyA9IFtbMC4wNSwgMC4yMTVdLCBbMC4yMiwgMC4zODVdLCBbMC4zOSwgMC41NTVdLCBbMC41NiwgSCAtIDAuMDNdXTtcbiAgZnJvbnRzLmZvckVhY2goKFthLCBiXSwgaSkgPT4gYWRkKGJveCgnc2NodWJsYWRlXycgKyAoaSsxKSwgTEssIHgwIC0gMC4wMTIsIGEsIHowICsgMC4wMDQsIHgwLCBiLCB6MCArIFBXIC0gMC4wMDQpKSk7XG4gIGFkZChib3goJ3NjaHVibGFkZV9taXR0ZScsIExLLCB4MCAtIDAuMDEyLCBIIC0gMC4xNDUsIHowICsgUFcgKyAwLjAwNCwgeDAsIEggLSAwLjAzLCB6MSAtIFQgLSAwLjAwNCkpO1xuICAvLyBTcGllZ2VsIG1pdCBHbMO8aGJpcm5lbiwgYXVmIGRlciBQbGF0dGUgYW4gZGllIFdhbmQgZ2VsZWhudFxuICBjb25zdCBtejAgPSB6MCArIDAuMTcsIG16MSA9IHowICsgMC45NywgbXkwID0gSCwgbXkxID0gSCArIDAuNjI7XG4gIGNvbnN0IG1pciA9IG5ldyBUSFJFRS5Hcm91cCgpOyBtaXIubmFtZSA9ICdzY2htaW5rc3BpZWdlbCc7XG4gIG1pci5hZGQoYm94KCdzY2htaW5rc3BpZWdlbF9yYWhtZW4nLCBMSywgLTAuMDM1LCAwLCBtejAsIDAsIG15MSAtIG15MCwgbXoxKSk7XG4gIG1pci5hZGQoYm94KCdzY2htaW5rc3BpZWdlbF9nbGFzJywgU1AsIC0wLjAzNywgMC4wNiwgbXowICsgMC4wNiwgLTAuMDM1LCBteTEgLSBteTAgLSAwLjA2LCBtejEgLSAwLjA2KSk7XG4gIGNvbnN0IGJ1bGIgPSAoeSwgeikgPT4geyBjb25zdCBiID0gbmV3IFRIUkVFLk1lc2gobmV3IFRIUkVFLlNwaGVyZUdlb21ldHJ5KDAuMDIxLCAxNiwgMTIpLCBCVSk7IGIubmFtZSA9ICdzY2htaW5rc3BpZWdlbF9iaXJuZSc7IGIucG9zaXRpb24uc2V0KC0wLjA0NSwgeSwgeik7IG1pci5hZGQoYik7IH07XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgODsgaSsrKSBidWxiKG15MSAtIG15MCAtIDAuMDMsIG16MCArIDAuMDQgKyBpKihtejEgLSBtejAgLSAwLjA4KS83KTtcbiAgZm9yIChsZXQgaSA9IDE7IGkgPCA1OyBpKyspeyBjb25zdCB5ID0gbXkxIC0gbXkwIC0gMC4wMyAtIGkqMC4xMzsgYnVsYih5LCBtejAgKyAwLjAzNSk7IGJ1bGIoeSwgbXoxIC0gMC4wMzUpOyB9XG4gIG1pci5wb3NpdGlvbi5zZXQoeDEgLSAwLjEsIG15MCwgMCk7IG1pci5yb3RhdGlvbi56ID0gLTAuMDg7IHN6LmFkZChtaXIpO1xuICBzei50cmF2ZXJzZShvID0+IHsgaWYgKG8uaXNNZXNoKXsgby5jYXN0U2hhZG93ID0gdHJ1ZTsgby5yZWNlaXZlU2hhZG93ID0gdHJ1ZTsgfSB9KTtcbiAgaG9tZS5hZGQoc3opO1xufVxuLy8gLS0tLS0tLS0tLSBNYXVlcnZvcnNwcnVuZyBXb2huemltbWVyICg0MSw1IMOXIDQwIGNtLCBFY2tlIFTDvHItL0F1w59lbndhbmQpIC0tLS0tLS0tLS1cbntcbiAgY29uc3QgbWF0ID0gQXJyYXkoNikuZmlsbChNLndhbGwpOyBtYXRbMl0gPSBNLmNhcDtcbiAgd2FsbHMuYWRkKGJveCgnd29obnppbW1lcl92b3JzcHJ1bmcnLCBtYXQsIElOX08gLSAwLjQxNSwgMCwgUk1fV1pbMV0sIElOX08gKyAwLjAwMSwgSEksIFJNX1daWzFdICsgMC40MCwgMS41KSk7XG59XG4vLyAtLS0tLS0tLS0tIEvDvGNoZTogRmxpZXNlbnNwaWVnZWwgYW4gZGVyIFdhbmQgenVtIEJhZCwgYWIgRmVuc3RlcnVudGVya2FudGUgNjAgY20gaG9jaCAtLS0tLS0tLS0tXG5jb25zdCB0aWxlTWF0ID0gbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgbmFtZTonaW50ZXJpb3JfdGlsZXMnLCBjb2xvcjoweGYzZjJlZSwgcm91Z2huZXNzOjAuMiB9KTtcbntcbiAgY29uc3QgeDAgPSBSTV9LVVswXSwgejAgPSAwLCB6MSA9IFpfU0NIMDtcbiAgY29uc3QgdCA9IGJveCgna3VlY2hlX2ZsaWVzZW4nLCB0aWxlTWF0LCB4MCwgV0lOX0IsIHowLCB4MCArIDAuMDA4LCBXSU5fQiArIDAuNiwgejEsIDEuMCk7XG4gIC8vIHVtIGRpZSBFY2tlIGF1ZiBkaWUgRmVuc3RlcndhbmQsIGJpcyBhbiBkaWUgRmVuc3RlcmxhaWJ1bmdcbiAgY29uc3Qgd2luVyA9IEtVX1dJTi5jIC0gS1VfV0lOLncvMjtcbiAgY29uc3QgdDIgPSBib3goJ2t1ZWNoZV9mbGllc2VuX2ZlbnN0ZXJ3YW5kJywgdGlsZU1hdCwgeDAgKyAwLjAwOCwgV0lOX0IsIHowLCB3aW5XLCBXSU5fQiArIDAuNiwgejAgKyAwLjAwOCwgMS4wKTtcbiAgdC5yZWNlaXZlU2hhZG93ID0gdDIucmVjZWl2ZVNoYWRvdyA9IHRydWU7IGhvbWUuYWRkKHQsIHQyKTtcbn1cbi8vIC0tLS0tLS0tLS0gSGVpemvDtnJwZXIgLS0tLS0tLS0tLVxuY29uc3QgcmFkTWF0ID0gbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgbmFtZTonaGVpemtvZXJwZXJfd2Vpc3MnLCBjb2xvcjoweGY0ZjNlZiwgcm91Z2huZXNzOjAuNCwgbWV0YWxuZXNzOjAuMSB9KTtcbmZ1bmN0aW9uIG1ha2VSYWRpYXRvcihuYW1lLCBsZW4pe1xuICBjb25zdCBnID0gbmV3IFRIUkVFLkdyb3VwKCk7IGcubmFtZSA9IG5hbWU7XG4gIGNvbnN0IHkwID0gMC4xNSwgeTEgPSAwLjc1LCBuID0gTWF0aC5tYXgoMywgTWF0aC5yb3VuZChsZW4vMC4wNSkpLCBzdCA9IGxlbi9uO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKyl7IGNvbnN0IHggPSAtbGVuLzIgKyBzdCooaSswLjUpOyBnLmFkZChib3gobmFtZSsnX2dsaWVkJytpLCByYWRNYXQsIHgtc3QqMC4zOCwgeTAsIC0wLjAzNSwgeCtzdCowLjM4LCB5MSwgMC4wMzUpKTsgfVxuICBnLmFkZChib3gobmFtZSsnX3NhbW1sZXJfbycsIHJhZE1hdCwgLWxlbi8yLCB5MS0wLjA1LCAtMC4wMiwgbGVuLzIsIHkxLTAuMDEsIDAuMDIpKTtcbiAgZy5hZGQoYm94KG5hbWUrJ19zYW1tbGVyX3UnLCByYWRNYXQsIC1sZW4vMiwgeTArMC4wMSwgLTAuMDIsIGxlbi8yLCB5MCswLjA1LCAwLjAyKSk7XG4gIGNvbnN0IHYgPSBuZXcgVEhSRUUuTWVzaChuZXcgVEhSRUUuQ3lsaW5kZXJHZW9tZXRyeSgwLjAxOCwgMC4wMTgsIDAuMDgsIDIwKSwgcmFkTWF0KTsgdi5uYW1lID0gbmFtZSsnX3ZlbnRpbCc7IHYucG9zaXRpb24uc2V0KGxlbi8yKzAuMDMsIHkxLTAuMDQsIDApOyBnLmFkZCh2KTtcbiAgY29uc3QgcCA9IG5ldyBUSFJFRS5NZXNoKG5ldyBUSFJFRS5DeWxpbmRlckdlb21ldHJ5KDAuMDEsIDAuMDEsIHkwLCAxMiksIE0ubWV0YWwpOyBwLm5hbWUgPSBuYW1lKydfcm9ocic7IHAucG9zaXRpb24uc2V0KC1sZW4vMiswLjAyLCB5MC8yLCAwKTsgZy5hZGQocCk7XG4gIGcudHJhdmVyc2UobyA9PiB7IGlmIChvLmlzTWVzaCl7IG8uY2FzdFNoYWRvdyA9IHRydWU7IG8ucmVjZWl2ZVNoYWRvdyA9IHRydWU7IH0gfSk7XG4gIHJldHVybiBnO1xufVxue1xuICAvLyBTY2hsYWZ6aW1tZXI6IGFuIGRlciBNaXR0ZWx3YW5kLCA0MeKAkzg2IGNtIHZvbiBkZXIgVMO8cndhbmRcbiAgY29uc3QgaDEgPSBtYWtlUmFkaWF0b3IoJ2hlaXprb2VycGVyX3NjaGxhZnppbW1lcicsIDAuNDUpO1xuICBoMS5wb3NpdGlvbi5zZXQoUk1fU1pbMl0gLSAwLjA3NSwgMCwgUk1fU1pbMV0gKyAwLjQxICsgMC4yMjUpOyBoMS5yb3RhdGlvbi55ID0gTWF0aC5QSS8yO1xuICAvLyBXb2huemltbWVyOiBhbiBkZXIgVMO8cndhbmQgZGlyZWt0IG5lYmVuIGRlciBUw7xyLCBSaWNodHVuZyBNaXR0ZWx3YW5kXG4gIGNvbnN0IGgyID0gbWFrZVJhZGlhdG9yKCdoZWl6a29lcnBlcl93b2huemltbWVyJywgMC40OCk7XG4gIGgyLnBvc2l0aW9uLnNldChXWl9ET09SLmMgLSBXWl9ET09SLncvMiAtIDAuMDIgLSAwLjI0LCAwLCBSTV9XWlsxXSArIDAuMDc1KTtcbiAgaG9tZS5hZGQoaDEsIGgyKTtcbn1cblxuLy8gLS0tLS0tLS0tLSBCYWQgKG5hY2ggRm90byk6IFdhbm5lIHJlY2h0cywgV0MgKyBXYXNjaHRpc2NoIGxpbmtzLCBGbGllc2VuIC0tLS0tLS0tLS1cbntcbiAgY29uc3QgYmFkID0gbmV3IFRIUkVFLkdyb3VwKCk7IGJhZC5uYW1lID0gJ2JhZCc7XG4gIGNvbnN0IFtXLCBOLCBFLCBTWl0gPSBSTV9CQUQsIFRUID0gMC4wMDgsIFNDWCA9IFhfU0NILCBTQ1ogPSBaX1NDSDA7XG4gIGNvbnN0IGFkZCA9IG0gPT4geyBiYWQuYWRkKG0pOyByZXR1cm4gbTsgfTtcbiAgY29uc3QgYnggPSAobiwgbWF0LCAuLi5hKSA9PiBhZGQoYm94KG4sIG1hdCwgLi4uYSkpO1xuICBmdW5jdGlvbiBjeWwobiwgbWF0LCByLCBoLCB4LCB5LCB6LCBheGlzLCByMil7XG4gICAgY29uc3QgbSA9IG5ldyBUSFJFRS5NZXNoKG5ldyBUSFJFRS5DeWxpbmRlckdlb21ldHJ5KHIsIHIyID8/IHIsIGgsIDI4KSwgbWF0KTsgbS5uYW1lID0gbjsgbS5wb3NpdGlvbi5zZXQoeCwgeSwgeik7XG4gICAgaWYgKGF4aXMgPT09ICd4JykgbS5yb3RhdGlvbi56ID0gTWF0aC5QSS8yOyBpZiAoYXhpcyA9PT0gJ3onKSBtLnJvdGF0aW9uLnggPSBNYXRoLlBJLzI7IHJldHVybiBhZGQobSk7XG4gIH1cbiAgZnVuY3Rpb24gdGlsZVRleChweCwgbiwgYmFzZSwgZ3JvdXQsIHZlaW5zLCBzZWVkKXtcbiAgICBjb25zdCBjID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7IGMud2lkdGggPSBjLmhlaWdodCA9IHB4Km47IGNvbnN0IGcgPSBjLmdldENvbnRleHQoJzJkJyk7XG4gICAgZy5maWxsU3R5bGUgPSBiYXNlOyBnLmZpbGxSZWN0KDAsIDAsIGMud2lkdGgsIGMuaGVpZ2h0KTtcbiAgICBjb25zdCBybmQgPSAoKSA9PiAoc2VlZCA9IChzZWVkKjE2ODA3KSAlIDIxNDc0ODM2NDcpIC8gMjE0NzQ4MzY0NztcbiAgICBnLmxpbmVXaWR0aCA9IDEuNDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZlaW5zOyBpKyspe1xuICAgICAgZy5zdHJva2VTdHlsZSA9ICdyZ2JhKDEyNSwxMjcsMTMyLCcgKyAoMC4wNSArIHJuZCgpKjAuMDcpICsgJyknOyBnLmJlZ2luUGF0aCgpO1xuICAgICAgbGV0IHggPSBybmQoKSpjLndpZHRoLCB5ID0gcm5kKCkqYy5oZWlnaHQ7IGcubW92ZVRvKHgsIHkpO1xuICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCA0OyBrKyspeyBjb25zdCBjeCA9IHggKyAocm5kKCktLjUpKnB4LCBjeSA9IHkgKyAocm5kKCktLjUpKnB4OyB4ICs9IChybmQoKS0uNSkqcHgqMS4zOyB5ICs9IChybmQoKS0uNSkqcHgqMS4zOyBnLnF1YWRyYXRpY0N1cnZlVG8oY3gsIGN5LCB4LCB5KTsgfVxuICAgICAgZy5zdHJva2UoKTtcbiAgICB9XG4gICAgZy5maWxsU3R5bGUgPSBncm91dDsgY29uc3QgZ3cgPSBNYXRoLm1heCgzLCBweC8zMik7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspeyBnLmZpbGxSZWN0KGkqcHgsIDAsIGd3LCBjLmhlaWdodCk7IGcuZmlsbFJlY3QoMCwgaSpweCwgYy53aWR0aCwgZ3cpOyB9XG4gICAgY29uc3QgdCA9IG5ldyBUSFJFRS5DYW52YXNUZXh0dXJlKGMpOyB0LndyYXBTID0gdC53cmFwVCA9IFRIUkVFLlJlcGVhdFdyYXBwaW5nOyB0LmNvbG9yU3BhY2UgPSBUSFJFRS5TUkdCQ29sb3JTcGFjZTsgdC5hbmlzb3Ryb3B5ID0gODsgcmV0dXJuIHQ7XG4gIH1cbiAgY29uc3QgQk0gPSB7XG4gICAgd2FuZDogICBuZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoeyBuYW1lOidiYWRfd2FuZGZsaWVzZW4nLCBtYXA6IHRpbGVUZXgoMTI4LCA0LCAnI2YzZjNmMScsICcjYzZjNmMyJywgNDYsIDExKSwgcm91Z2huZXNzOjAuMTYgfSksXG4gICAgYm9kZW46ICBuZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoeyBuYW1lOidiYWRfYm9kZW5mbGllc2VuJywgbWFwOiB0aWxlVGV4KDEyOCwgNCwgJyNlZmVlZWInLCAnI2E2YTVhMCcsIDM0LCAyOSksIHJvdWdobmVzczowLjMyIH0pLFxuICAgIGVtYWlsOiAgbmV3IFRIUkVFLk1lc2hQaHlzaWNhbE1hdGVyaWFsKHsgbmFtZTonc2FuaXRhZXJfZW1haWwnLCBjb2xvcjoweGZiZmJmYSwgcm91Z2huZXNzOjAuMSwgY2xlYXJjb2F0OjEsIGNsZWFyY29hdFJvdWdobmVzczowLjA2IH0pLFxuICAgIGNocm9tOiAgbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgbmFtZTonY2hyb20nLCBjb2xvcjoweGU2ZThlYSwgcm91Z2huZXNzOjAuMDgsIG1ldGFsbmVzczoxIH0pLFxuICAgIHNwaWVnZWw6bmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgbmFtZTonc3BpZWdlbCcsIGNvbG9yOjB4ZTJlOGVjLCByb3VnaG5lc3M6MC4wMiwgbWV0YWxuZXNzOjEgfSksXG4gICAgZ2xhczogICBuZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoeyBuYW1lOidnbGFzYWJsYWdlJywgY29sb3I6MHhjZmU2ZTAsIHJvdWdobmVzczowLjA1LCB0cmFuc3BhcmVudDp0cnVlLCBvcGFjaXR5OjAuNDUgfSksXG4gICAgZGVrb3I6ICBuZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoeyBuYW1lOidkZWtvcmZsaWVzZScsIGNvbG9yOjB4OWZiMGMyLCByb3VnaG5lc3M6MC4yIH0pLFxuICAgIHBsYXN0OiAgbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgbmFtZTond2Nfc2l0eicsIGNvbG9yOjB4ZjdmN2Y1LCByb3VnaG5lc3M6MC4zIH0pLFxuICB9O1xuICBjb25zdCBlbWFpbEluID0gQk0uZW1haWwuY2xvbmUoKTsgZW1haWxJbi5uYW1lID0gJ3Nhbml0YWVyX2VtYWlsX2lubmVuJzsgZW1haWxJbi5zaWRlID0gVEhSRUUuQmFja1NpZGU7XG4gIGNvbnN0IGVtYWlsRFMgPSBCTS5lbWFpbC5jbG9uZSgpOyBlbWFpbERTLm5hbWUgPSAnc2FuaXRhZXJfZW1haWxfZHMnOyBlbWFpbERTLnNpZGUgPSBUSFJFRS5Eb3VibGVTaWRlO1xuICAvLyBNaWxjaGdsYXMgaW0gQmFkZmVuc3RlclxuICBjb25zdCBmZyA9IHdpbmRvd3MuZ2V0T2JqZWN0QnlOYW1lKCdmZW5zdGVyX2JhZF9nbGFzJyk7XG4gIGlmIChmZykgZmcubWF0ZXJpYWwgPSBuZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoeyBuYW1lOidtaWxjaGdsYXMnLCBjb2xvcjoweGYyZjVmNSwgcm91Z2huZXNzOjAuNywgdHJhbnNwYXJlbnQ6dHJ1ZSwgb3BhY2l0eTowLjg1IH0pO1xuXG4gIC8vIEJvZGVuICsgV2FuZGZsaWVzZW4gKGhhbGJob2NoIDEsMjUgbSwgdW0gZGllIFdhbm5lIDIsMDUgbSlcbiAgY29uc3QgSFQgPSAxLjI1LCBGVCA9IDIuMDU7XG4gIGNvbnN0IFRXID0gMC43OCwgVEwgPSAxLjc1LCBMRURHRSA9IDAuMiwgVFgwID0gRSAtIFRXLCBUWjEgPSBOICsgTEVER0UgKyBUTDtcbiAgY29uc3Qgd3hjID0gMi4yNSwgd2wgPSB3eGMgLSAwLjQsIHdyID0gd3hjICsgMC40LCBkeGMgPSBCQURfRE9PUi5jLCBEVyA9IEJBRF9ET09SLnc7XG4gIC8vIFZvcndhbmQgYW4gZGVyIEZlbnN0ZXJ3YW5kOiB2b24gZGVyIFdlc3R3YW5kIGJpcyBhbnMgRmVuc3RlciwgMTUgY20gdm9yZ2V6b2dlblxuICBjb25zdCBWRCA9IDAuMTU7XG4gIHsgY29uc3Qgdm0gPSBBcnJheSg2KS5maWxsKE0ud2FsbCk7IHZtWzJdID0gTS5jYXA7IHdhbGxzLmFkZChib3goJ2JhZF92b3J3YW5kJywgdm0sIFcsIDAsIE4sIHdsLCBISSwgTiArIFZELCAxLjUpKTsgfVxuICBieCgnYmFkX2JvZGVuJywgQk0uYm9kZW4sIFcsIDAsIE4sIEUsIDAuMDA4LCBTWiwgMC44KTtcbiAgYngoJ2JhZF9mbGllc2VuX3dlc3QnLCBCTS53YW5kLCBXLCAwLCBOICsgVkQgKyBUVCwgVyArIFRULCBIVCwgU1osIDAuNik7XG4gIGJ4KCdiYWRfZmxpZXNlbl92b3J3YW5kJywgQk0ud2FuZCwgVywgMCwgTiArIFZELCB3bCwgSFQsIE4gKyBWRCArIFRULCAwLjYpO1xuICBieCgnYmFkX2ZsaWVzZW5fdm9yd2FuZF9zZWl0ZScsIEJNLndhbmQsIHdsIC0gMC4wMDEsIDAsIE4sIHdsICsgVFQsIEhULCBOICsgVkQgKyBUVCwgMC42KTtcbiAgYngoJ2JhZF9mbGllc2VuX25vcmRfMicsIEJNLndhbmQsIHdsLCAwLCBOLCB3ciwgV0lOX0IgLSAwLjAzLCBOICsgVFQsIDAuNik7XG4gIGJ4KCdiYWRfZmxpZXNlbl9ub3JkXzMnLCBCTS53YW5kLCB3ciwgMCwgTiwgRSAtIFRULCBGVCwgTiArIFRULCAwLjYpO1xuICBieCgnYmFkX2ZsaWVzZW5fb3N0XzEnLCBCTS53YW5kLCBFIC0gVFQsIDAsIE4sIEUsIEZULCBUWjEsIDAuNik7XG4gIGJ4KCdiYWRfZmxpZXNlbl9vc3RfMicsIEJNLndhbmQsIEUgLSBUVCwgMCwgVFoxLCBFLCBIVCwgU0NaLCAwLjYpO1xuICBieCgnYmFkX2ZsaWVzZW5fc2NoYWNodF9uJywgQk0ud2FuZCwgU0NYIC0gVFQsIDAsIFNDWiAtIFRULCBFIC0gVFQsIEhULCBTQ1osIDAuNik7XG4gIGJ4KCdiYWRfZmxpZXNlbl9zY2hhY2h0X3cnLCBCTS53YW5kLCBTQ1ggLSBUVCwgMCwgU0NaLCBTQ1gsIEhULCBTWiwgMC42KTtcbiAgYngoJ2JhZF9mbGllc2VuX3N1ZWRfMScsIEJNLndhbmQsIFcgKyBUVCwgMCwgU1ogLSBUVCwgZHhjIC0gRFcvMiwgSFQsIFNaLCAwLjYpO1xuICBieCgnYmFkX2ZsaWVzZW5fc3VlZF8yJywgQk0ud2FuZCwgZHhjICsgRFcvMiwgMCwgU1ogLSBUVCwgU0NYIC0gVFQsIEhULCBTWiwgMC42KTtcbiAgZm9yIChjb25zdCBbeSwgel0gb2YgW1sxLjE1LCBOICsgMC43NV0sIFsxLjcyLCBOICsgMC41NV1dKXtcbiAgICBjb25zdCBkID0gYngoJ2JhZF9kZWtvcmZsaWVzZScsIEJNLmRla29yLCAtMC4wMDEsIC0wLjA0LCAtMC4wNCwgMC4wMDEsIDAuMDQsIDAuMDQpO1xuICAgIGQucm90YXRpb24ueCA9IE1hdGguUEkvNDsgZC5wb3NpdGlvbi5zZXQoRSAtIFRUIC0gMC4wMDEsIHksIHopO1xuICB9XG5cbiAgLy8gQmFkZXdhbm5lLCBlaW5nZWZsaWVzdCwgbWl0IEFibGFnZSBhbSBLb3BmZW5kZVxuICBieCgnd2FubmVfYWJsYWdlJywgQk0ud2FuZCwgVFgwLCAwLjAwOCwgTiArIFRULCBFIC0gVFQsIDAuNiwgTiArIExFREdFLCAwLjYpO1xuICBieCgnd2FubmVfc2NodWVyemUnLCBCTS53YW5kLCBUWDAsIDAuMDA4LCBOICsgTEVER0UsIFRYMCArIDAuMDMsIDAuNTY1LCBUWjEsIDAuNik7XG4gIGJ4KCd3YW5uZV9zY2h1ZXJ6ZV9lbmRlJywgQk0ud2FuZCwgVFgwLCAwLjAwOCwgVFoxIC0gMC4wMywgRSAtIFRULCAwLjU2NSwgVFoxLCAwLjYpO1xuICBmdW5jdGlvbiBycihwLCB3LCBkLCByKXsgY29uc3QgeCA9IC13LzIsIHkgPSAtZC8yO1xuICAgIHAubW92ZVRvKHggKyByLCB5KTsgcC5saW5lVG8oeCArIHcgLSByLCB5KTsgcC5xdWFkcmF0aWNDdXJ2ZVRvKHggKyB3LCB5LCB4ICsgdywgeSArIHIpOyBwLmxpbmVUbyh4ICsgdywgeSArIGQgLSByKTtcbiAgICBwLnF1YWRyYXRpY0N1cnZlVG8oeCArIHcsIHkgKyBkLCB4ICsgdyAtIHIsIHkgKyBkKTsgcC5saW5lVG8oeCArIHIsIHkgKyBkKTsgcC5xdWFkcmF0aWNDdXJ2ZVRvKHgsIHkgKyBkLCB4LCB5ICsgZCAtIHIpO1xuICAgIHAubGluZVRvKHgsIHkgKyByKTsgcC5xdWFkcmF0aWNDdXJ2ZVRvKHgsIHksIHggKyByLCB5KTsgcmV0dXJuIHA7IH1cbiAgY29uc3QgdGN4ID0gRSAtIFRULzIgLSBUVy8yICsgVFQvMiwgdGN6ID0gTiArIExFREdFICsgVEwvMiwgSVcgPSBUVyAtIDAuMTQsIElMID0gVEwgLSAwLjE4LCBJUiA9IDAuMjI7XG4gIGNvbnN0IHJpbVMgPSBycihuZXcgVEhSRUUuU2hhcGUoKSwgVFcgLSBUVCwgVEwsIDAuMDIpOyByaW1TLmhvbGVzLnB1c2gocnIobmV3IFRIUkVFLlBhdGgoKSwgSVcsIElMLCBJUikpO1xuICBjb25zdCByaW1HID0gbmV3IFRIUkVFLkV4dHJ1ZGVHZW9tZXRyeShyaW1TLCB7IGRlcHRoOjAuMDM1LCBiZXZlbEVuYWJsZWQ6ZmFsc2UsIGN1cnZlU2VnbWVudHM6MTYgfSk7XG4gIHJpbUcucm90YXRlWCgtTWF0aC5QSS8yKTsgcmltRy50cmFuc2xhdGUodGN4LCAwLjU2NSwgdGN6KTtcbiAgYWRkKG5ldyBUSFJFRS5NZXNoKHJpbUcsIEJNLmVtYWlsKSkubmFtZSA9ICd3YW5uZV9yYW5kJztcbiAgY29uc3QgYmFzRyA9IG5ldyBUSFJFRS5FeHRydWRlR2VvbWV0cnkocnIobmV3IFRIUkVFLlNoYXBlKCksIElXLCBJTCwgSVIpLCB7IGRlcHRoOjAuNDEsIGJldmVsRW5hYmxlZDpmYWxzZSwgY3VydmVTZWdtZW50czoxNiB9KTtcbiAgYmFzRy5yb3RhdGVYKC1NYXRoLlBJLzIpOyBiYXNHLnRyYW5zbGF0ZSh0Y3gsIDAuMTYsIHRjeik7XG4gIGFkZChuZXcgVEhSRUUuTWVzaChiYXNHLCBlbWFpbEluKSkubmFtZSA9ICd3YW5uZV9pbm5lbic7XG4gIGNvbnN0IG16MCA9IFRaMSAtIDAuMzU7XG4gIGN5bCgnd2FubmVfYWJsYXVmJywgQk0uY2hyb20sIDAuMDI0LCAwLjAwNCwgdGN4LCAwLjE2MywgbXowIC0gMC4wNSk7XG4gIC8vIFdhbm5lbmFybWF0dXIgYW4gZGVyIE9zdHdhbmRcbiAgY3lsKCdhcm1hdHVyX2tvZXJwZXInLCBCTS5jaHJvbSwgMC4wMjQsIDAuMiwgRSAtIDAuMDc1LCAwLjgsIG16MCwgJ3onKTtcbiAgZm9yIChjb25zdCBzIG9mIFstMSwgMV0pe1xuICAgIGN5bCgnYXJtYXR1cl9hbnNjaGx1c3MnLCBCTS5jaHJvbSwgMC4wMSwgMC4wNzUsIEUgLSAwLjA0LCAwLjgsIG16MCArIHMqMC4wOCwgJ3gnKTtcbiAgICBjeWwoJ2FybWF0dXJfcm9zZXR0ZScsIEJNLmNocm9tLCAwLjAzLCAwLjAwOCwgRSAtIFRUIC0gMC4wMDQsIDAuOCwgbXowICsgcyowLjA4LCAneCcpO1xuICB9XG4gIGN5bCgnYXJtYXR1cl9hdXNsYXVmJywgQk0uY2hyb20sIDAuMDEyLCAwLjExLCBFIC0gMC4xMzUsIDAuNzc1LCBtejAsICd4Jyk7XG4gIGJ4KCdhcm1hdHVyX2hlYmVsJywgQk0uY2hyb20sIEUgLSAwLjA4NSwgMC44MiwgbXowIC0gMC4wMTIsIEUgLSAwLjAzLCAwLjgzNSwgbXowICsgMC4wMTIpO1xuICAvLyBEdXNjaHN0YW5nZSArIEhhbmRicmF1c2UgKyBTY2hsYXVjaFxuICBjb25zdCByeiA9IFRaMSAtIDAuODUsIHJ4ID0gRSAtIDAuMDQ1O1xuICBjeWwoJ2R1c2Noc3RhbmdlJywgQk0uY2hyb20sIDAuMDEyLCAwLjk1LCByeCwgMS42LCByeik7XG4gIGZvciAoY29uc3QgeSBvZiBbMS4xMywgMi4wN10peyBjeWwoJ2R1c2Noc3RhbmdlX2hhbHRlcicsIEJNLmNocm9tLCAwLjAxLCAwLjA0NSwgRSAtIDAuMDIyLCB5LCByeiwgJ3gnKTsgY3lsKCdkdXNjaHN0YW5nZV9yb3NldHRlJywgQk0uY2hyb20sIDAuMDIyLCAwLjAxLCBFIC0gVFQgLSAwLjAwNSwgeSwgcnosICd4Jyk7IH1cbiAgYngoJ2R1c2Noc3RhbmdlX3NjaGllYmVyJywgQk0uY2hyb20sIHJ4IC0gMC4wMzUsIDEuNjgsIHJ6IC0gMC4wMjIsIHJ4ICsgMC4wMiwgMS43NiwgcnogKyAwLjAyMik7XG4gIGNvbnN0IGJyYXVzZSA9IG5ldyBUSFJFRS5Hcm91cCgpOyBicmF1c2UubmFtZSA9ICdoYW5kYnJhdXNlJzsgYnJhdXNlLnBvc2l0aW9uLnNldChyeCAtIDAuMDYsIDEuNzIsIHJ6KTsgYnJhdXNlLnJvdGF0aW9uLnogPSAwLjU7XG4gIHsgY29uc3QgaCA9IG5ldyBUSFJFRS5NZXNoKG5ldyBUSFJFRS5DeWxpbmRlckdlb21ldHJ5KDAuMDEzLCAwLjAxMSwgMC4yLCAyMCksIEJNLmNocm9tKTsgaC5uYW1lID0gJ2hhbmRicmF1c2VfZ3JpZmYnOyBicmF1c2UuYWRkKGgpO1xuICAgIGNvbnN0IGsgPSBuZXcgVEhSRUUuTWVzaChuZXcgVEhSRUUuQ3lsaW5kZXJHZW9tZXRyeSgwLjA0NSwgMC4wMywgMC4wMjUsIDMyKSwgQk0uY2hyb20pOyBrLm5hbWUgPSAnaGFuZGJyYXVzZV9rb3BmJzsgay5wb3NpdGlvbi55ID0gMC4xMTsgay5yb3RhdGlvbi56ID0gTWF0aC5QSS8yIC0gMC4zOyBicmF1c2UuYWRkKGspOyB9XG4gIGFkZChicmF1c2UpO1xuICBjb25zdCBoYjAgPSBuZXcgVEhSRUUuVmVjdG9yMyhyeCAtIDAuMDYgKyAwLjEqTWF0aC5zaW4oMC41KSwgMS43MiAtIDAuMSpNYXRoLmNvcygwLjUpLCByeik7XG4gIGNvbnN0IGhvc2UgPSBuZXcgVEhSRUUuQ2F0bXVsbFJvbUN1cnZlMyhbaGIwLCBuZXcgVEhSRUUuVmVjdG9yMyhFIC0gMC4wOSwgMS4yLCByeiArIDAuMDgpLCBuZXcgVEhSRUUuVmVjdG9yMyhFIC0gMC4yLCAwLjcsIChyeiArIG16MCkvMiArIDAuMDUpLCBuZXcgVEhSRUUuVmVjdG9yMyhFIC0gMC4xMiwgMC42NiwgbXowIC0gMC4wMiksIG5ldyBUSFJFRS5WZWN0b3IzKEUgLSAwLjA4NSwgMC43NywgbXowIC0gMC4wMyldKTtcbiAgYWRkKG5ldyBUSFJFRS5NZXNoKG5ldyBUSFJFRS5UdWJlR2VvbWV0cnkoaG9zZSwgODAsIDAuMDA3LCA4KSwgQk0uY2hyb20pKS5uYW1lID0gJ2JyYXVzZXNjaGxhdWNoJztcbiAgLy8gSGFsdGVncmlmZlxuICBjb25zdCBneiA9IFRaMSAtIDAuNjtcbiAgY3lsKCdoYWx0ZWdyaWZmJywgQk0uY2hyb20sIDAuMDEzLCAwLjM2LCBFIC0gMC4wNjUsIDEuMTIsIGd6KTtcbiAgZm9yIChjb25zdCB5IG9mIFswLjk2LCAxLjI4XSkgY3lsKCdoYWx0ZWdyaWZmX3N0dWV0emUnLCBCTS5jaHJvbSwgMC4wMTIsIDAuMDYsIEUgLSAwLjAzNSwgeSwgZ3osICd4Jyk7XG4gIC8vIFZvcmhhbmdzdGFuZ2Ugb2JlblxuICBjeWwoJ3ZvcmhhbmdzdGFuZ2UnLCBCTS5jaHJvbSwgMC4wMSwgVEwgLSAwLjIsIEUgLSAwLjA5LCAyLjE1LCBOICsgTEVER0UgKyBUTC8yIC0gMC4xLCAneicpO1xuICBjeWwoJ3ZvcmhhbmdzdGFuZ2VfaGFsdGVyJywgQk0uY2hyb20sIDAuMDA5LCAwLjA5LCBFIC0gMC4wNDUsIDIuMTUsIE4gKyBMRURHRSArIDAuMDUsICd4Jyk7XG5cbiAgLy8gV0MgYW4gZGVyIFdlc3R3YW5kIChCbGljayB6dXIgV2FubmUpLCBBdWZwdXR6LVNww7xsa2FzdGVuXG4gIGNvbnN0IHdjID0gbmV3IFRIUkVFLkdyb3VwKCk7IHdjLm5hbWUgPSAnd2MnOyB3Yy5wb3NpdGlvbi5zZXQoVyArIFRULCAwLCBOICsgVkQgKyAwLjQ1KTsgd2Mucm90YXRpb24ueSA9IE1hdGguUEkvMjtcbiAgeyBjb25zdCB3YSA9IG0gPT4geyB3Yy5hZGQobSk7IHJldHVybiBtOyB9O1xuICAgIHdhKGJveCgnd2Nfc29ja2VsX2hpbnRlbicsIEJNLmVtYWlsLCAtMC4xMywgMC4wMDgsIDAsIDAuMTMsIDAuMzgsIDAuMjIpKTtcbiAgICBjb25zdCBwID0gbmV3IFRIUkVFLk1lc2gobmV3IFRIUkVFLkN5bGluZGVyR2VvbWV0cnkoMC4xNSwgMC4xMTUsIDAuMzIsIDQwKSwgQk0uZW1haWwpOyBwLm5hbWUgPSAnd2NfZnVzcyc7IHAuc2NhbGUueiA9IDEuMzsgcC5wb3NpdGlvbi5zZXQoMCwgMC4xNjgsIDAuMzcpOyB3YShwKTtcbiAgICBjb25zdCBiID0gbmV3IFRIUkVFLk1lc2gobmV3IFRIUkVFLkN5bGluZGVyR2VvbWV0cnkoMC4xODUsIDAuMTUsIDAuMDgsIDQ4KSwgQk0uZW1haWwpOyBiLm5hbWUgPSAnd2NfYmVja2VuJzsgYi5zY2FsZS56ID0gMS4zOyBiLnBvc2l0aW9uLnNldCgwLCAwLjM2NSwgMC40MSk7IHdhKGIpO1xuICAgIGNvbnN0IHMgPSBuZXcgVEhSRUUuTWVzaChuZXcgVEhSRUUuQ3lsaW5kZXJHZW9tZXRyeSgwLjE4NSwgMC4xODUsIDAuMDIsIDQ4KSwgQk0ucGxhc3QpOyBzLm5hbWUgPSAnd2Nfc2l0eic7IHMuc2NhbGUueiA9IDEuMzsgcy5wb3NpdGlvbi5zZXQoMCwgMC40MTUsIDAuNDEpOyB3YShzKTtcbiAgICBjb25zdCBkID0gbmV3IFRIUkVFLk1lc2gobmV3IFRIUkVFLkN5bGluZGVyR2VvbWV0cnkoMC4xNzgsIDAuMTc4LCAwLjAyMiwgNDgpLCBCTS5wbGFzdCk7IGQubmFtZSA9ICd3Y19kZWNrZWwnOyBkLnNjYWxlLnogPSAxLjI4OyBkLnBvc2l0aW9uLnNldCgwLCAwLjQzNiwgMC40MSk7IHdhKGQpO1xuICAgIHdhKGJveCgnd2Nfc2NoYXJuaWVyJywgQk0ucGxhc3QsIC0wLjEsIDAuNDA1LCAwLjE1LCAwLjEsIDAuNDQsIDAuMikpO1xuICAgIHdhKGJveCgnd2Nfc3B1ZWxrYXN0ZW4nLCBCTS5lbWFpbCwgLTAuMiwgMC44LCAwLCAwLjIsIDEuMiwgMC4xNSkpO1xuICAgIGNvbnN0IHQgPSBuZXcgVEhSRUUuTWVzaChuZXcgVEhSRUUuQ3lsaW5kZXJHZW9tZXRyeSgwLjAyLCAwLjAyLCAwLjAyLCAyOCksIEJNLmVtYWlsKTsgdC5uYW1lID0gJ3djX3NwdWVsdGFzdGUnOyB0LnBvc2l0aW9uLnNldCgtMC4xMiwgMS4yMSwgMC4wOSk7IHdhKHQpO1xuICAgIGNvbnN0IHIgPSBuZXcgVEhSRUUuTWVzaChuZXcgVEhSRUUuQ3lsaW5kZXJHZW9tZXRyeSgwLjAyNSwgMC4wMjUsIDAuNCwgMjgpLCBCTS5lbWFpbCk7IHIubmFtZSA9ICd3Y19zcHVlbHJvaHInOyByLnBvc2l0aW9uLnNldCgwLCAwLjYsIDAuMDgpOyB3YShyKTsgfVxuICBhZGQod2MpO1xuICAvLyBXYXNzZXJ6w6RobGVyICsgVmVudGlsIGFuIGRlciBWb3J3YW5kLCBQYXBpZXJoYWx0ZXIgdW50ZXIgZGVtIEZlbnN0ZXJcbiAgY3lsKCdiYWRfd2Fzc2VyemFlaGxlcicsIEJNLmNocm9tLCAwLjA1NSwgMC4wMywgd2wgLSAwLjEzLCAwLjk4LCBOICsgVkQgKyBUVCArIDAuMDE1LCAneicpO1xuICBjeWwoJ2JhZF93YXNzZXJ6YWVobGVyX2dsYXMnLCBCTS5wbGFzdCwgMC4wMzUsIDAuMDM0LCB3bCAtIDAuMTMsIDAuOTgsIE4gKyBWRCArIFRUICsgMC4wMTcsICd6Jyk7XG4gIGN5bCgnYmFkX3ZlbnRpbCcsIEJNLmNocm9tLCAwLjAyOCwgMC4wNSwgd2wgLSAwLjEzLCAxLjIsIE4gKyBWRCArIFRUICsgMC4wMjUsICd6Jyk7XG4gIGJ4KCdwYXBpZXJoYWx0ZXInLCBCTS5jaHJvbSwgd3hjIC0gMC4wMiwgMC42MiwgTiArIFRULCB3eGMgKyAwLjEyLCAwLjcsIE4gKyAwLjA4KTtcblxuICAvLyBXYXNjaHRpc2NoIGFuIGRlciBXZXN0d2FuZCwgU3BpZWdlbCArIEdsYXNhYmxhZ2VuIGRhcsO8YmVyXG4gIGNvbnN0IGJ6ID0gTiArIDEuMzUsIEJSID0gMC4zLCBTWCA9IDAuODcsIFJZID0gMC44NSwgYmN4ID0gVyArIDAuMjtcbiAgeyBjb25zdCBvID0gbmV3IFRIUkVFLk1lc2gobmV3IFRIUkVFLkN5bGluZGVyR2VvbWV0cnkoQlIsIDAuMiwgMC4xNywgNDgsIDEsIHRydWUpLCBlbWFpbERTKTsgby5uYW1lID0gJ3dhc2NoYmVja2VuX2F1c3Nlbic7IG8uc2NhbGUueCA9IFNYOyBvLnBvc2l0aW9uLnNldChiY3gsIFJZIC0gMC4wODUsIGJ6KTsgYWRkKG8pO1xuICAgIGNvbnN0IGYgPSBuZXcgVEhSRUUuTWVzaChuZXcgVEhSRUUuQ2lyY2xlR2VvbWV0cnkoMC4yLCA0OCksIEJNLmVtYWlsKTsgZi5uYW1lID0gJ3dhc2NoYmVja2VuX3VudGVuJzsgZi5yb3RhdGlvbi54ID0gTWF0aC5QSS8yOyBmLnNjYWxlLnggPSBTWDsgZi5wb3NpdGlvbi5zZXQoYmN4LCBSWSAtIDAuMTcsIGJ6KTsgYWRkKGYpO1xuICAgIGNvbnN0IHIgPSBuZXcgVEhSRUUuTWVzaChuZXcgVEhSRUUuUmluZ0dlb21ldHJ5KDAuMjM1LCBCUiwgNDgpLCBCTS5lbWFpbCk7IHIubmFtZSA9ICd3YXNjaGJlY2tlbl9yYW5kJzsgci5yb3RhdGlvbi54ID0gLU1hdGguUEkvMjsgci5zY2FsZS54ID0gU1g7IHIucG9zaXRpb24uc2V0KGJjeCwgUlksIGJ6KTsgYWRkKHIpO1xuICAgIGNvbnN0IGkgPSBuZXcgVEhSRUUuTWVzaChuZXcgVEhSRUUuU3BoZXJlR2VvbWV0cnkoMC4yMzUsIDQ4LCAxNiwgMCwgTWF0aC5QSSoyLCBNYXRoLlBJLzIsIE1hdGguUEkvMiksIGVtYWlsRFMpOyBpLm5hbWUgPSAnd2FzY2hiZWNrZW5faW5uZW4nOyBpLnNjYWxlLnNldChTWCwgMC41NSwgMSk7IGkucG9zaXRpb24uc2V0KGJjeCwgUlksIGJ6KTsgYWRkKGkpOyB9XG4gIGN5bCgnd2FzY2h0aXNjaF9hcm1hdHVyJywgQk0uY2hyb20sIDAuMDIyLCAwLjEyLCBXICsgMC4wNzUsIFJZICsgMC4wNiwgYnopO1xuICB7IGNvbnN0IHMgPSBjeWwoJ3dhc2NodGlzY2hfYXVzbGF1ZicsIEJNLmNocm9tLCAwLjAxMSwgMC4xMywgVyArIDAuMTMsIFJZICsgMC4xLCBieiwgJ3gnKTsgcy5yb3RhdGlvbi56ID0gTWF0aC5QSS8yICsgMC4yNTsgfVxuICBieCgnd2FzY2h0aXNjaF9oZWJlbCcsIEJNLmNocm9tLCBXICsgMC4wNCwgUlkgKyAwLjEyLCBieiAtIDAuMDEyLCBXICsgMC4xLCBSWSArIDAuMTM1LCBieiArIDAuMDEyKTtcbiAgY3lsKCdzaXBob24nLCBCTS5jaHJvbSwgMC4wMiwgMC4yLCBiY3gsIDAuNTgsIGJ6KTtcbiAgY3lsKCdzaXBob25fcm9ocicsIEJNLmNocm9tLCAwLjAxOCwgMC4yLCBXICsgMC4xLCAwLjQ4LCBieiwgJ3gnKTtcbiAgY3lsKCdzaXBob25fcm9zZXR0ZScsIEJNLmNocm9tLCAwLjAzNSwgMC4wMSwgVyArIFRUICsgMC4wMDUsIDAuNDgsIGJ6LCAneCcpO1xuICBieCgnc3BpZWdlbCcsIEJNLnNwaWVnZWwsIFcgKyBUVCwgMS4zNCwgYnogLSAwLjMsIFcgKyBUVCArIDAuMDA2LCAyLjAsIGJ6ICsgMC4zKTtcbiAgZm9yIChjb25zdCB5IG9mIFsxLjMsIDEuMDVdKXtcbiAgICBieCgnZ2xhc2FibGFnZScsIEJNLmdsYXMsIFcgKyBUVCwgeSwgYnogLSAwLjMsIFcgKyAwLjE0LCB5ICsgMC4wMDgsIGJ6ICsgMC4zKTtcbiAgICBmb3IgKGNvbnN0IHMgb2YgWy0xLCAxXSkgYngoJ2dsYXNhYmxhZ2VfaGFsdGVyJywgQk0uY2hyb20sIFcgKyBUVCwgeSAtIDAuMDEyLCBieiArIHMqMC4zIC0gMC4wMTIsIFcgKyAwLjA2LCB5ICsgMC4wMTYsIGJ6ICsgcyowLjMgKyAwLjAxMik7XG4gIH1cblxuICBiYWQudHJhdmVyc2UobyA9PiB7IGlmIChvLmlzTWVzaCl7IG8uY2FzdFNoYWRvdyA9IHRydWU7IG8ucmVjZWl2ZVNoYWRvdyA9IHRydWU7IH0gfSk7XG4gIGJhZC5nZXRPYmplY3RCeU5hbWUoJ2JhZF9ib2RlbicpLmNhc3RTaGFkb3cgPSBmYWxzZTtcbiAgaG9tZS5hZGQoYmFkKTtcbn1cblxuXG5zdGFnZS5zZXRPYmplY3QoaG9tZSk7XG5cbi8vIC0tLS0tLS0tLS0gU2NoYXR0ZW46IGVuZ2VyIEZydXN0dW0sIDQwOTZlciBNYXAsIGhhcnRlciBQQ0Yg4oaSIHNjaGFyZiAmIG9obmUgRmxhY2tlcm4gLS0tLS0tLS0tLVxuY29uc3QgcmVuZGVyZXIgPSBzdGFnZS5fcmVuZGVyZXIsIHNjZW5lID0gc3RhZ2UuX3NjZW5lLCBrZXkgPSBzdGFnZS5fa2V5O1xucmVuZGVyZXIuc2hhZG93TWFwLnR5cGUgPSBUSFJFRS5QQ0ZTaGFkb3dNYXA7XG5jb25zdCBoYiA9IG5ldyBUSFJFRS5Cb3gzKCkuc2V0RnJvbU9iamVjdChob21lKSwgaGMgPSBoYi5nZXRDZW50ZXIobmV3IFRIUkVFLlZlY3RvcjMoKSksIGhzID0gaGIuZ2V0U2l6ZShuZXcgVEhSRUUuVmVjdG9yMygpKTtcbmNvbnN0IHN1bkRpciA9IG5ldyBUSFJFRS5WZWN0b3IzKDQsIDcsIDUpLm5vcm1hbGl6ZSgpO1xua2V5LnBvc2l0aW9uLmNvcHkoaGMpLmFkZFNjYWxlZFZlY3RvcihzdW5EaXIsIDMwKTtcbmtleS50YXJnZXQucG9zaXRpb24uY29weShoYyk7IHNjZW5lLmFkZChrZXkudGFyZ2V0KTtcbmNvbnN0IGhhbGYgPSBNYXRoLm1heChocy54LCBocy56KSAqIDAuNjI7XG5PYmplY3QuYXNzaWduKGtleS5zaGFkb3cuY2FtZXJhLCB7IGxlZnQ6LWhhbGYsIHJpZ2h0OmhhbGYsIHRvcDpoYWxmLCBib3R0b206LWhhbGYsIG5lYXI6MSwgZmFyOjYwIH0pO1xua2V5LnNoYWRvdy5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xua2V5LnNoYWRvdy5tYXBTaXplLnNldCgyMDQ4LCAyMDQ4KTtcbmtleS5zaGFkb3cuYmlhcyA9IC0wLjAwMDQ7IGtleS5zaGFkb3cubm9ybWFsQmlhcyA9IDAuMDE1O1xuaWYgKGtleS5zaGFkb3cubWFwKXsga2V5LnNoYWRvdy5tYXAuZGlzcG9zZSgpOyBrZXkuc2hhZG93Lm1hcCA9IG51bGw7IH1cbnJlbmRlcmVyLnRvbmVNYXBwaW5nID0gVEhSRUUuQUNFU0ZpbG1pY1RvbmVNYXBwaW5nO1xuaWYgKHN0YWdlLl9ncm91bmQpIHN0YWdlLl9ncm91bmQudmlzaWJsZSA9IGZhbHNlO1xuY29uc3QgaGVtaSA9IHNjZW5lLmNoaWxkcmVuLmZpbmQobyA9PiBvLmlzSGVtaXNwaGVyZUxpZ2h0KSwgaGVtaUJhc2UgPSBoZW1pID8gaGVtaS5pbnRlbnNpdHkgOiAwO1xuY29uc3QgZmlsbEwgPSBzY2VuZS5jaGlsZHJlbi5maW5kKG8gPT4gby5pc0RpcmVjdGlvbmFsTGlnaHQgJiYgbyAhPT0ga2V5KSwgZmlsbEJhc2UgPSBmaWxsTCA/IGZpbGxMLmludGVuc2l0eSA6IDA7XG5jb25zdCBFTlYgPSAwLjk7XG5sZXQgZW52SyA9IDEsIGhlbWlLID0gMSwgZmlsbEsgPSAxLCBleHBLID0gMTtcbi8vIElubmVucmF1bTogSGltbWVscy0vRsO8bGxsaWNodCBkcmluZ3QgbmljaHQgZHVyY2ggZGllIERlY2tlIOKGkiBudXIgbm9jaCBTb25uZSArIFVtZ2VidW5nIGR1cmNoIGRpZSBGZW5zdGVyXG5mdW5jdGlvbiBhcHBseUludGVyaW9yKG8pe1xuICBpZiAoaGVtaSkgaGVtaS5pbnRlbnNpdHkgPSBoZW1pQmFzZSAqIGhlbWlLICogKDEgLSAwLjg1Km8pO1xuICBpZiAoZmlsbEwpIGZpbGxMLmludGVuc2l0eSA9IGZpbGxCYXNlICogZmlsbEsgKiAoMSAtIG8pO1xuICBzY2VuZS5lbnZpcm9ubWVudEludGVuc2l0eSA9IEVOViAqIGVudksgKiAoMSAtIDAuNypvKTtcbiAgcmVuZGVyZXIudG9uZU1hcHBpbmdFeHBvc3VyZSA9ICgxICsgMC40NSpvKSAqIGV4cEs7XG59XG5cbi8vIC0tLS0tLS0tLS0gRGVja2UgKGJsZW5kZXQgZWluLCBzb2JhbGQgbWFuIGluIGVpbmVtIFJhdW0gc3RlaHQpIC0tLS0tLS0tLS1cbmNvbnN0IGNlaWxNYXQgPSBuZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoeyBuYW1lOidkZWNrZScsIGNvbG9yOjB4ZjRmMmVlLCByb3VnaG5lc3M6MC45NSwgdHJhbnNwYXJlbnQ6dHJ1ZSwgb3BhY2l0eTowLCBkZXB0aFdyaXRlOmZhbHNlIH0pO1xuY29uc3QgY2VpbGluZyA9IG5ldyBUSFJFRS5Hcm91cCgpOyBjZWlsaW5nLm5hbWUgPSAnZGVja2UnO1xuY2VpbGluZy5hZGQoYm94KCdkZWNrZV9ub3JkJywgY2VpbE1hdCwgWF9GTCAtIFRFLCBILCAtVEUsIFhfRSArIFRFLCBIKzAuMDQsIFpTVCksIGJveCgnZGVja2Vfc3VlZCcsIGNlaWxNYXQsIC1URSwgSCwgWlNULCBYX0UgKyBURSwgSCswLjA0LCBaX1MgKyBURSkpO1xuY2VpbGluZy50cmF2ZXJzZShvID0+IHsgaWYgKG8uaXNNZXNoKXsgby5yZWNlaXZlU2hhZG93ID0gdHJ1ZTsgby5jYXN0U2hhZG93ID0gdHJ1ZTsgfSB9KTsgY2VpbGluZy52aXNpYmxlID0gZmFsc2U7XG5ob21lLmFkZChjZWlsaW5nKTtcbmZ1bmN0aW9uIHNldENlaWwobyl7XG4gIGNlaWxNYXQub3BhY2l0eSA9IG87XG4gIGlmIChjZWlsaW5nLnZpc2libGUgIT09IChvID4gMC4wMDEpKXsgY2VpbGluZy52aXNpYmxlID0gbyA+IDAuMDAxOyBwdERpcnR5ID0gdHJ1ZTsgfVxuICBjb25zdCBzb2xpZCA9IG8gPj0gMC45OTk7XG4gIGlmIChjZWlsTWF0LnRyYW5zcGFyZW50ID09PSBzb2xpZCl7IGNlaWxNYXQudHJhbnNwYXJlbnQgPSAhc29saWQ7IGNlaWxNYXQuZGVwdGhXcml0ZSA9IHNvbGlkOyBjZWlsTWF0Lm5lZWRzVXBkYXRlID0gdHJ1ZTsgfVxuICBpZiAoIXB0T24pIGFwcGx5SW50ZXJpb3Iobyk7XG59XG5cbi8vIC0tLS0tLS0tLS0gQm9nZW5sYW1wZTogTGljaHQgYW4vYXVzIC0tLS0tLS0tLS1cbmhvbWUudXBkYXRlTWF0cml4V29ybGQodHJ1ZSk7XG5jb25zdCBidWxiID0gbGFtcGUuZ3JvdXAuZ2V0T2JqZWN0QnlOYW1lKCdsZXVjaHRtaXR0ZWwnKTtcbmNvbnN0IGJwID0gYnVsYi5nZXRXb3JsZFBvc2l0aW9uKG5ldyBUSFJFRS5WZWN0b3IzKCkpO1xuY29uc3QgbGFtcFNwb3QgPSBuZXcgVEhSRUUuU3BvdExpZ2h0KDB4ZmZkNmEwLCAwLCAwLCAxLjAsIDAuNiwgMik7XG5sYW1wU3BvdC5wb3NpdGlvbi5jb3B5KGJwKS5hZGQobmV3IFRIUkVFLlZlY3RvcjMoMCwgLTAuMDM1LCAwKSk7XG5sYW1wU3BvdC50YXJnZXQucG9zaXRpb24uc2V0KGJwLngsIDAsIGJwLnopO1xubGFtcFNwb3QuY2FzdFNoYWRvdyA9IHRydWU7XG5sYW1wU3BvdC5zaGFkb3cubWFwU2l6ZS5zZXQoMTAyNCwgMTAyNCk7XG5sYW1wU3BvdC5zaGFkb3cuYmlhcyA9IC0wLjAwMDU7IGxhbXBTcG90LnNoYWRvdy5ub3JtYWxCaWFzID0gMC4wMjtcbmxhbXBTcG90LnNoYWRvdy5jYW1lcmEubmVhciA9IDAuMDU7IGxhbXBTcG90LnNoYWRvdy5jYW1lcmEuZmFyID0gODtcbmNvbnN0IGxhbXBGaWxsID0gbmV3IFRIUkVFLlBvaW50TGlnaHQoMHhmZmQ2YTAsIDAsIDcsIDIpO1xubGFtcEZpbGwucG9zaXRpb24uY29weShicCk7XG5zY2VuZS5hZGQobGFtcFNwb3QsIGxhbXBTcG90LnRhcmdldCwgbGFtcEZpbGwpO1xuY29uc3Qgc2NoaXJtID0gbGFtcGUuZ3JvdXAuZ2V0T2JqZWN0QnlOYW1lKCdzY2hpcm0nKS5tYXRlcmlhbDtcbnNjaGlybS5lbWlzc2l2ZSA9IG5ldyBUSFJFRS5Db2xvcigweGZmZTJiOCk7XG5jb25zdCBsYW1wQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xhbXAnKTtcbmxldCBsYW1wT24gPSBmYWxzZSwgbGFtcEx2bCA9IDAsIGxhbXBBbmltID0gMDtcbmxldCByYXN0ZXJFbnYgPSBudWxsLCBwdEVudiA9IG51bGw7XG5sZXQgdHJhY2VyID0gbnVsbCwgcHRPbiA9IGZhbHNlLCBwdERpcnR5ID0gdHJ1ZSwgaW5Sb29tID0gZmFsc2UsIHN0aWxsU2luY2UgPSAwO1xuY29uc3QgTEFNUF9LRVkgPSAnd29obnVuZy1ib2dlbmxhbXBlLWZhcmJlJztcbmxldCBsYW1wSyA9IDE7XG5jb25zdCBsYW1wU3cgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGFtcFN3Jyk7XG5mdW5jdGlvbiBzZXRMYW1wQ29sb3IoaGV4KXtcbiAgY29uc3QgYyA9IG5ldyBUSFJFRS5Db2xvcihoZXgpLCBzID0gYy5jbG9uZSgpLmxlcnAobmV3IFRIUkVFLkNvbG9yKDB4ZmZmZmZmKSwgMC4zKTtcbiAgbGFtcFNwb3QuY29sb3IuY29weShjKTsgbGFtcEZpbGwuY29sb3IuY29weShjKTtcbiAgaWYgKGJ1bGIubWF0ZXJpYWwuZW1pc3NpdmUpIGJ1bGIubWF0ZXJpYWwuZW1pc3NpdmUuY29weShjKTtcbiAgc2NoaXJtLmVtaXNzaXZlLmNvcHkocyk7XG4gIHRyeSB7IGxvY2FsU3RvcmFnZS5zZXRJdGVtKExBTVBfS0VZLCBoZXgpOyB9IGNhdGNoKGUpe31cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2xhbXAgaScpLnN0eWxlLmNzc1RleHQgPSBsYW1wT24gPyBgYmFja2dyb3VuZDoke2hleH07Ym94LXNoYWRvdzowIDAgMTBweCAzcHggJHtoZXh9OTlgIDogJyc7XG4gIGlmIChwdE9uKXsgdHJhY2VyLnVwZGF0ZUxpZ2h0cygpOyB0cmFjZXIudXBkYXRlTWF0ZXJpYWxzKCk7IH1cbn1cbi8vIC0tLS0tLS0tLS0gTGljaHQtUGlja2VyOiBIZWxsIChMaWNodHRvbiArIEhlbGxpZ2tlaXQpIG9kZXIgRmFyYmUgKEZhcmJrcmVpcykgLS0tLS0tLS0tLVxuY29uc3QgS19DT0xEID0gODAwMCwgS19XQVJNID0gMjAwMDtcbmZ1bmN0aW9uIGtlbHZpbkhleChrKXtcbiAgY29uc3QgdCA9IGsvMTAwOyBsZXQgciwgZywgYjtcbiAgaWYgKHQgPD0gNjYpeyByID0gMjU1OyBnID0gOTkuNDcwODAyNTg2MSpNYXRoLmxvZyh0KSAtIDE2MS4xMTk1NjgxNjYxOyBiID0gdCA8PSAxOSA/IDAgOiAxMzguNTE3NzMxMjIzMSpNYXRoLmxvZyh0LTEwKSAtIDMwNS4wNDQ3OTI3MzA3OyB9XG4gIGVsc2UgeyByID0gMzI5LjY5ODcyNzQ0NipNYXRoLnBvdyh0LTYwLCAtMC4xMzMyMDQ3NTkyKTsgZyA9IDI4OC4xMjIxNjk1MjgzKk1hdGgucG93KHQtNjAsIC0wLjA3NTUxNDg0OTIpOyBiID0gMjU1OyB9XG4gIGNvbnN0IGMgPSB2ID0+IE1hdGgucm91bmQoTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCB2KSkpLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpO1xuICByZXR1cm4gJyMnICsgYyhyKSArIGMoZykgKyBjKGIpO1xufVxuY29uc3Qgd2FybUsgPSB3ID0+IE1hdGgucm91bmQoS19DT0xEIC0gdy8xMDAqKEtfQ09MRCAtIEtfV0FSTSkpO1xuZnVuY3Rpb24gaHN2UkdCKGgsIHMsIHYpeyBjb25zdCBmID0gbiA9PiB7IGNvbnN0IGsgPSAobiArIGgvNjApICUgNjsgcmV0dXJuIHYgLSB2KnMqTWF0aC5tYXgoMCwgTWF0aC5taW4oaywgNC1rLCAxKSk7IH07IHJldHVybiBbZig1KSwgZigzKSwgZigxKV07IH1cbmNvbnN0IHJnYkhleCA9IGEgPT4gJyMnICsgYS5tYXAoeCA9PiBNYXRoLnJvdW5kKHgqMjU1KS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKSkuam9pbignJyk7XG5mdW5jdGlvbiBtYWtlUGlja2VyKHN3LCBrZXksIGRlZiwgZGltSW4sIG9uQ2hhbmdlKXtcbiAgbGV0IHN0ID0geyBtb2RlOiAnd2hpdGUnLCB3YXJtOiA3MCwgaDogMzAsIHM6IDAuNiwgLi4uZGVmIH07XG4gIHRyeSB7IE9iamVjdC5hc3NpZ24oc3QsIEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KSB8fCAnbnVsbCcpIHx8IHt9KTsgfSBjYXRjaChlKXt9XG4gIGNvbnN0IHBvcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOyBwb3AuY2xhc3NOYW1lID0gJ2xwaWNrJztcbiAgcG9wLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwibHAtc2VnXCI+PGJ1dHRvbiBkYXRhLW09XCJ3aGl0ZVwiPkhlbGw8XHUwMDJGYnV0dG9uPjxidXR0b24gZGF0YS1tPVwiY29sb3JcIj5GYXJiZTxcdTAwMkZidXR0b24+PFx1MDAyRmRpdj4nXG4gICAgKyAnPGRpdiBjbGFzcz1cImxwLXJvdyBscC13XCI+PGRpdj48c3Bhbj5MaWNodHRvbjxcdTAwMkZzcGFuPjxvdXRwdXQgY2xhc3M9XCJscC1rdlwiPjxcdTAwMkZvdXRwdXQ+PFx1MDAyRmRpdj48aW5wdXQgY2xhc3M9XCJscC10ZW1wXCIgdHlwZT1cInJhbmdlXCIgbWluPVwiMFwiIG1heD1cIjEwMFwiIHN0ZXA9XCIxXCI+PHNtYWxsPjxzcGFuPlN0ZXJpbDxcdTAwMkZzcGFuPjxzcGFuPldhcm08XHUwMDJGc3Bhbj48XHUwMDJGc21hbGw+PFx1MDAyRmRpdj4nXG4gICAgKyAnPGRpdiBjbGFzcz1cImxwLWNcIj48ZGl2IGNsYXNzPVwibHAtd2hlZWxcIj48Y2FudmFzIHdpZHRoPVwiMzYwXCIgaGVpZ2h0PVwiMzYwXCI+PFx1MDAyRmNhbnZhcz48aT48XHUwMDJGaT48XHUwMDJGZGl2PjxcdTAwMkZkaXY+J1xuICAgICsgJzxkaXYgY2xhc3M9XCJscC1yb3dcIj48ZGl2PjxzcGFuPkhlbGxpZ2tlaXQ8XHUwMDJGc3Bhbj48b3V0cHV0IGNsYXNzPVwibHAtYnZcIj48XHUwMDJGb3V0cHV0PjxcdTAwMkZkaXY+PGlucHV0IGNsYXNzPVwibHAtZGltXCIgdHlwZT1cInJhbmdlXCIgbWluPVwiMTBcIiBtYXg9XCIyMDBcIiBzdGVwPVwiNVwiPjxcdTAwMkZkaXY+PGJ1dHRvbiBjbGFzcz1cImxwLWRvbmVcIj5GZXJ0aWc8XHUwMDJGYnV0dG9uPic7XG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQocG9wKTtcbiAgY29uc3QgJCA9IHMgPT4gcG9wLnF1ZXJ5U2VsZWN0b3IocyksIHRlbXAgPSAkKCcubHAtdGVtcCcpLCBicmkgPSAkKCcubHAtZGltJyksIGJ2ID0gJCgnLmxwLWJ2JyksIGRvdCA9ICQoJy5scC13aGVlbCBpJyksIHdoZWVsID0gJCgnLmxwLXdoZWVsJyk7XG4gIHRlbXAuc3R5bGUuYmFja2dyb3VuZCA9IGBsaW5lYXItZ3JhZGllbnQoOTBkZWcsJHtrZWx2aW5IZXgoS19DT0xEKX0sJHtrZWx2aW5IZXgoNDUwMCl9LCR7a2VsdmluSGV4KDMwMDApfSwke2tlbHZpbkhleChLX1dBUk0pfSlgO1xuICBjb25zdCBjdiA9ICQoJ2NhbnZhcycpLCBjdHggPSBjdi5nZXRDb250ZXh0KCcyZCcpLCBpbWcgPSBjdHguY3JlYXRlSW1hZ2VEYXRhKDM2MCwgMzYwKSwgUiA9IDE4MDtcbiAgZm9yIChsZXQgeSA9IDA7IHkgPCAzNjA7IHkrKykgZm9yIChsZXQgeCA9IDA7IHggPCAzNjA7IHgrKyl7XG4gICAgY29uc3QgZHggPSB4ICsgLjUgLSBSLCBkeSA9IHkgKyAuNSAtIFIsIGQgPSBNYXRoLmh5cG90KGR4LCBkeSkgLyBSLCBpID0gKHkqMzYwICsgeCkqNDtcbiAgICBjb25zdCByZ2IgPSBoc3ZSR0IoKE1hdGguYXRhbjIoZHksIGR4KSoxODAvTWF0aC5QSSArIDM2MCkgJSAzNjAsIDEsIDEpO1xuICAgIGltZy5kYXRhW2ldID0gcmdiWzBdKjI1NTsgaW1nLmRhdGFbaSsxXSA9IHJnYlsxXSoyNTU7IGltZy5kYXRhW2krMl0gPSByZ2JbMl0qMjU1O1xuICAgIGltZy5kYXRhW2krM10gPSAyNTUgKiBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCAoMSAtIGQpICogUiwgKGQgLSAwLjcyKSAqIFIpKTtcbiAgfVxuICBjdHgucHV0SW1hZ2VEYXRhKGltZywgMCwgMCk7XG4gIGNvbnN0IGhleCA9ICgpID0+IHN0Lm1vZGUgPT09ICd3aGl0ZScgPyBrZWx2aW5IZXgod2FybUsoc3Qud2FybSkpIDogcmdiSGV4KGhzdlJHQihzdC5oLCAxLCAxKSk7XG4gIGZ1bmN0aW9uIHVwZGF0ZShmaXJlID0gdHJ1ZSl7XG4gICAgcG9wLnF1ZXJ5U2VsZWN0b3JBbGwoJy5scC1zZWcgYnV0dG9uJykuZm9yRWFjaChiID0+IGIuY2xhc3NMaXN0LnRvZ2dsZSgnb24nLCBiLmRhdGFzZXQubSA9PT0gc3QubW9kZSkpO1xuICAgICQoJy5scC13Jykuc3R5bGUuZGlzcGxheSA9IHN0Lm1vZGUgPT09ICd3aGl0ZScgPyAnJyA6ICdub25lJztcbiAgICAkKCcubHAtYycpLnN0eWxlLmRpc3BsYXkgPSBzdC5tb2RlID09PSAnY29sb3InID8gJycgOiAnbm9uZSc7XG4gICAgdGVtcC52YWx1ZSA9IHN0Lndhcm07ICQoJy5scC1rdicpLnRleHRDb250ZW50ID0gd2FybUsoc3Qud2FybSkgKyAnIEsnO1xuICAgIGNvbnN0IGEgPSBzdC5oKk1hdGguUEkvMTgwO1xuICAgIGRvdC5zdHlsZS5sZWZ0ID0gKDkwICsgTWF0aC5jb3MoYSkqNzcpICsgJ3B4JzsgZG90LnN0eWxlLnRvcCA9ICg5MCArIE1hdGguc2luKGEpKjc3KSArICdweCc7XG4gICAgY29uc3QgaCA9IGhleCgpOyBkb3Quc3R5bGUuYmFja2dyb3VuZCA9IGg7IHN3LnN0eWxlLmJhY2tncm91bmQgPSBoO1xuICAgIHRyeSB7IGxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgSlNPTi5zdHJpbmdpZnkoc3QpKTsgfSBjYXRjaChlKXt9XG4gICAgaWYgKGZpcmUpIG9uQ2hhbmdlKGgpO1xuICB9XG4gIHBvcC5xdWVyeVNlbGVjdG9yQWxsKCcubHAtc2VnIGJ1dHRvbicpLmZvckVhY2goYiA9PiBiLm9uY2xpY2sgPSAoKSA9PiB7IHN0Lm1vZGUgPSBiLmRhdGFzZXQubTsgdXBkYXRlKCk7IH0pO1xuICB0ZW1wLm9uaW5wdXQgPSAoKSA9PiB7IHN0Lndhcm0gPSArdGVtcC52YWx1ZTsgdXBkYXRlKCk7IH07XG4gIGNvbnN0IHBpY2sgPSBlID0+IHsgY29uc3QgciA9IHdoZWVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBkeCA9IGUuY2xpZW50WCAtIHIubGVmdCAtIDkwLCBkeSA9IGUuY2xpZW50WSAtIHIudG9wIC0gOTA7XG4gICAgc3QuaCA9IChNYXRoLmF0YW4yKGR5LCBkeCkqMTgwL01hdGguUEkgKyAzNjApICUgMzYwOyB1cGRhdGUoKTsgfTtcbiAgd2hlZWwub25wb2ludGVyZG93biA9IGUgPT4geyBjb25zdCByID0gd2hlZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGQgPSBNYXRoLmh5cG90KGUuY2xpZW50WCAtIHIubGVmdCAtIDkwLCBlLmNsaWVudFkgLSByLnRvcCAtIDkwKTtcbiAgICBpZiAoZCA8IDU4IHx8IGQgPiA5NCkgcmV0dXJuOyB3aGVlbC5zZXRQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7IHBpY2soZSk7IH07XG4gIHdoZWVsLm9ucG9pbnRlcm1vdmUgPSBlID0+IHsgaWYgKHdoZWVsLmhhc1BvaW50ZXJDYXB0dXJlKGUucG9pbnRlcklkKSkgcGljayhlKTsgfTtcbiAgY29uc3Qgc3luY0JyaSA9ICgpID0+IHsgYnJpLnZhbHVlID0gZGltSW4udmFsdWU7IGJ2LnRleHRDb250ZW50ID0gZGltSW4udmFsdWUgKyAnJSc7IH07XG4gIGJyaS5vbmlucHV0ID0gKCkgPT4geyBkaW1Jbi52YWx1ZSA9IGJyaS52YWx1ZTsgZGltSW4ub25pbnB1dCgpOyBzeW5jQnJpKCk7IH07XG4gIGRpbUluLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0Jywgc3luY0JyaSk7XG4gIGNvbnN0IHBsYWNlID0gKCkgPT4geyBwb3Auc3R5bGUubGVmdCA9ICcxOHB4JzsgcG9wLnN0eWxlLnRvcCA9ICc1MCUnOyBwb3Auc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZVkoLTUwJSknOyB9O1xuICBzdy5vbmNsaWNrID0gZSA9PiB7IGUucHJldmVudERlZmF1bHQoKTsgZS5zdG9wUHJvcGFnYXRpb24oKTsgY29uc3QgbyA9ICFwb3AuY2xhc3NMaXN0LmNvbnRhaW5zKCdvcGVuJyk7XG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmxwaWNrLm9wZW4nKS5mb3JFYWNoKHAgPT4gcC5jbGFzc0xpc3QucmVtb3ZlKCdvcGVuJykpO1xuICAgIGlmIChvKXsgc3luY0JyaSgpOyBwbGFjZSgpOyBwb3AuY2xhc3NMaXN0LmFkZCgnb3BlbicpOyB9XG4gICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QudG9nZ2xlKCdscGZvY3VzJywgbyk7XG4gICAgZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2xwaWNrJywgeyBkZXRhaWw6IHsga2V5LCBvcGVuOiBvIH0gfSkpOyB9O1xuICAkKCcubHAtZG9uZScpLm9uY2xpY2sgPSAoKSA9PiB7IHBvcC5jbGFzc0xpc3QucmVtb3ZlKCdvcGVuJyk7IGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnbHBmb2N1cycpOyBkaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnbHBpY2snLCB7IGRldGFpbDogeyBrZXksIG9wZW46IGZhbHNlIH0gfSkpOyB9O1xuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIGUgPT4geyBpZiAocG9wLmNsYXNzTGlzdC5jb250YWlucygnb3BlbicpICYmICFwb3AuY29udGFpbnMoZS50YXJnZXQpICYmICFzdy5jb250YWlucyhlLnRhcmdldCkpeyBwb3AuY2xhc3NMaXN0LnJlbW92ZSgnb3BlbicpOyBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ2xwZm9jdXMnKTsgZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2xwaWNrJywgeyBkZXRhaWw6IHsga2V5LCBvcGVuOiBmYWxzZSB9IH0pKTsgfSB9KTtcbiAgYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgKCkgPT4gcG9wLmNsYXNzTGlzdC5jb250YWlucygnb3BlbicpICYmIHBsYWNlKCkpO1xuICB1cGRhdGUoKTtcbiAgcmV0dXJuIHBvcDtcbn1cblxubGV0IGxhbXBDb2wgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShMQU1QX0tFWSkgfHwgJyNmZmQ2YTAnO1xubGFtcFN3LmlubmVySFRNTCA9ICcnO1xuY29uc3QgY29sSW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTsgY29sSW4uY2xhc3NOYW1lID0gJ2xwLXN3JzsgY29sSW4udGl0bGUgPSAnTGljaHQgZWluc3RlbGxlbic7XG5sYW1wU3cuYXBwZW5kQ2hpbGQoY29sSW4pO1xuY29uc3QgZGltSW4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbGFtcERpbSBpbnB1dCcpLCBkaW1PdXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbGFtcERpbSBvdXRwdXQnKTtcbmRpbUluLm9uaW5wdXQgPSAoKSA9PiB7IGxhbXBLID0gZGltSW4udmFsdWUgLyAxMDA7IGRpbU91dC50ZXh0Q29udGVudCA9IGRpbUluLnZhbHVlICsgJyUnOyBhcHBseUxhbXAobGFtcEx2bCk7IGlmIChwdE9uKXsgdHJhY2VyLnVwZGF0ZUxpZ2h0cygpOyB0cmFjZXIudXBkYXRlTWF0ZXJpYWxzKCk7IH0gfTtcbmZ1bmN0aW9uIGFwcGx5TGFtcCh2KXtcbiAgdiAqPSBsYW1wSztcbiAgbGFtcFNwb3QuaW50ZW5zaXR5ID0gOSAqIHY7XG4gIGxhbXBGaWxsLmludGVuc2l0eSA9IDIuMiAqIHY7XG4gIGJ1bGIubWF0ZXJpYWwuZW1pc3NpdmVJbnRlbnNpdHkgPSAwLjIgKyA1ICogdjtcbiAgc2NoaXJtLmVtaXNzaXZlSW50ZW5zaXR5ID0gMC41NSAqIHY7XG59XG5hcHBseUxhbXAoMCk7XG5tYWtlUGlja2VyKGNvbEluLCBMQU1QX0tFWSArICctY2ZnJywgeyBtb2RlOiAnd2hpdGUnLCB3YXJtOiA3NSB9LCBkaW1JbiwgaCA9PiB7IGxhbXBDb2wgPSBoOyBzZXRMYW1wQ29sb3IoaCk7IH0pO1xuc2V0TGFtcENvbG9yKGxhbXBDb2wpO1xuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xhbXBUJykub25jbGljayA9ICgpID0+IHtcbiAgbGFtcE9uID0gIWxhbXBPbjtcbiAgbGFtcEJ0bi5jbGFzc0xpc3QudG9nZ2xlKCdvbicsIGxhbXBPbik7XG4gIGxhbXBCdG4ucXVlcnlTZWxlY3Rvcignc3BhbicpLnRleHRDb250ZW50ID0gbGFtcE9uID8gJ0JvZ2VubGFtcGUgYXVzJyA6ICdCb2dlbmxhbXBlIGFuJztcbiAgc2V0TGFtcENvbG9yKGxhbXBDb2wpO1xuICBjb25zdCBpZCA9ICsrbGFtcEFuaW0sIGZyb20gPSBsYW1wTHZsLCB0byA9IGxhbXBPbiA/IDEgOiAwLCB0MCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAoZnVuY3Rpb24gc3RlcChub3cpe1xuICAgIGlmIChpZCAhPT0gbGFtcEFuaW0pIHJldHVybjtcbiAgICBjb25zdCB0ID0gTWF0aC5taW4oMSwgKG5vdyAtIHQwKSAvIDQ1MCk7XG4gICAgbGFtcEx2bCA9IGZyb20gKyAodG8gLSBmcm9tKSAqICgxIC0gTWF0aC5wb3coMSAtIHQsIDMpKTtcbiAgICBhcHBseUxhbXAobGFtcEx2bCk7XG4gICAgaWYgKHB0T24peyB0cmFjZXIudXBkYXRlTGlnaHRzKCk7IHRyYWNlci51cGRhdGVNYXRlcmlhbHMoKTsgfVxuICAgIGlmICh0IDwgMSkgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHN0ZXApO1xuICB9KSh0MCk7XG59O1xuXG4vLyAtLS0tLS0tLS0tIERvbnV0LUxhbXBlOiBudXIgYW4vYXVzIC0tLS0tLS0tLS1cbmNvbnN0IGRvbnV0TGlnaHQgPSBuZXcgVEhSRUUuUG9pbnRMaWdodCgweGZmYTA1MCwgMCwgNC41LCAyKTtcbmRvbnV0TGlnaHQucG9zaXRpb24uY29weShkb251dC5nZXRXb3JsZFBvc2l0aW9uKG5ldyBUSFJFRS5WZWN0b3IzKCkpKS5hZGQobmV3IFRIUkVFLlZlY3RvcjMoMCwgMC4xMywgMCkpO1xuc2NlbmUuYWRkKGRvbnV0TGlnaHQpO1xuY29uc3QgZG9udXRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGFtcEQnKTtcbmRvbnV0QnRuLm9uY2xpY2sgPSAoKSA9PiB7XG4gIGNvbnN0IG9uID0gZG9udXRCdG4uZ2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnKSAhPT0gJ3RydWUnO1xuICBkb251dEJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcsIG9uKTsgZG9udXRCdG4uY2xhc3NMaXN0LnRvZ2dsZSgnb24nLCBvbik7XG4gIGRvbnV0QnRuLnF1ZXJ5U2VsZWN0b3IoJ3NwYW4nKS50ZXh0Q29udGVudCA9IG9uID8gJ0RvbnV0LUxhbXBlIGF1cycgOiAnRG9udXQtTGFtcGUgYW4nO1xuICBETS5rb2VycGVyLmVtaXNzaXZlSW50ZW5zaXR5ID0gb24gPyAyLjIgOiAwO1xuICBETS5zb2NrZWwuZW1pc3NpdmVJbnRlbnNpdHkgPSBvbiA/IDAuNiA6IDA7XG4gIGRvbnV0TGlnaHQuaW50ZW5zaXR5ID0gb24gPyAyLjYgOiAwO1xuICBpZiAocHRPbil7IHRyYWNlci51cGRhdGVMaWdodHMoKTsgdHJhY2VyLnVwZGF0ZU1hdGVyaWFscygpOyB9XG59O1xuXG4vLyAtLS0tLS0tLS0tIEZlcm5zZWhlcjogYW4vYXVzIHBlciBGZXJuYmVkaWVudW5nIC0tLS0tLS0tLS1cbntcbiAgY29uc3Qgc2NyID0gaG9tZS5nZXRPYmplY3RCeU5hbWUoJ2Zlcm5zZWhlcicpLmdldE9iamVjdEJ5TmFtZSgndHZfYmlsZHNjaGlybScpO1xuICBjb25zdCBjdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpOyBjdi53aWR0aCA9IDEwMjQ7IGN2LmhlaWdodCA9IDYwMDtcbiAgY29uc3QgYyA9IGN2LmdldENvbnRleHQoJzJkJyk7XG4gIGxldCBnID0gYy5jcmVhdGVMaW5lYXJHcmFkaWVudCgwLCAwLCAxMDI0LCA2MDApO1xuICBnLmFkZENvbG9yU3RvcCgwLCAnIzBiMWUzYScpOyBnLmFkZENvbG9yU3RvcCgwLjU1LCAnIzFkNGY3YScpOyBnLmFkZENvbG9yU3RvcCgxLCAnI2UwOGE0YScpO1xuICBjLmZpbGxTdHlsZSA9IGc7IGMuZmlsbFJlY3QoMCwgMCwgMTAyNCwgNjAwKTtcbiAgZyA9IGMuY3JlYXRlUmFkaWFsR3JhZGllbnQoNzYwLCAzODAsIDEwLCA3NjAsIDM4MCwgMzIwKTtcbiAgZy5hZGRDb2xvclN0b3AoMCwgJ3JnYmEoMjU1LDIxMCwxNTAsLjkpJyk7IGcuYWRkQ29sb3JTdG9wKDEsICdyZ2JhKDI1NSwyMTAsMTUwLDApJyk7XG4gIGMuZmlsbFN0eWxlID0gZzsgYy5maWxsUmVjdCgwLCAwLCAxMDI0LCA2MDApO1xuICBjLmZpbGxTdHlsZSA9ICcjMDgxMzIyJzsgYy5iZWdpblBhdGgoKTsgYy5tb3ZlVG8oMCwgNjAwKTsgYy5saW5lVG8oMCwgNDMwKTsgYy5saW5lVG8oMjIwLCAzNjApOyBjLmxpbmVUbyg0MjAsIDQ1MCk7IGMubGluZVRvKDY0MCwgMzgwKTsgYy5saW5lVG8oMTAyNCwgNDcwKTsgYy5saW5lVG8oMTAyNCwgNjAwKTsgYy5maWxsKCk7XG4gIGMuZmlsbFN0eWxlID0gJ3JnYmEoMjU1LDI1NSwyNTUsLjkyKSc7IGMuZm9udCA9ICc1MDAgNjRweCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmJzsgYy5maWxsVGV4dCgnMjA6MTUnLCA3MCwgMTIwKTtcbiAgYy5mb250ID0gJzQwMCAyOHB4IEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWYnOyBjLmZpbGxTdHlsZSA9ICdyZ2JhKDI1NSwyNTUsMjU1LC43KSc7IGMuZmlsbFRleHQoJ0d1dGVuIEFiZW5kJywgNzIsIDE2NSk7XG4gIGNvbnN0IHRleCA9IG5ldyBUSFJFRS5DYW52YXNUZXh0dXJlKGN2KTsgdGV4LmNvbG9yU3BhY2UgPSBUSFJFRS5TUkdCQ29sb3JTcGFjZTtcbiAgY29uc3QgTSA9IHNjci5tYXRlcmlhbDtcbiAgY29uc3QgdHZMaWdodCA9IG5ldyBUSFJFRS5Qb2ludExpZ2h0KDB4OWFiOGZmLCAwLCAzLjIsIDIpO1xuICBjb25zdCBzYiA9IG5ldyBUSFJFRS5Cb3gzKCkuc2V0RnJvbU9iamVjdChzY3IpLCBzYyA9IHNiLmdldENlbnRlcihuZXcgVEhSRUUuVmVjdG9yMygpKSwgc3MgPSBzYi5nZXRTaXplKG5ldyBUSFJFRS5WZWN0b3IzKCkpO1xuICB0dkxpZ2h0LnBvc2l0aW9uLmNvcHkoc2MpLmFkZChuZXcgVEhSRUUuVmVjdG9yMygwLjM1LCAtMC40NSwgMC42KSk7XG4gIHNjZW5lLmFkZCh0dkxpZ2h0KTtcbiAgY29uc3QgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3R2QicpO1xuICBsZXQgbHZsID0gMCwgYW5pbSA9IDA7XG4gIGNvbnN0IGFwcGx5ID0gKCkgPT4geyBNLmVtaXNzaXZlSW50ZW5zaXR5ID0gMS42ICogbHZsOyB0dkxpZ2h0LmludGVuc2l0eSA9IDEuNCAqIGx2bDsgaWYgKHB0T24peyB0cmFjZXIudXBkYXRlTGlnaHRzKCk7IHRyYWNlci51cGRhdGVNYXRlcmlhbHMoKTsgfSB9O1xuICBjb25zdCBiYXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndHZCYXInKSwgdWkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndHZVSScpO1xuICBsZXQgc2F2ZWQgPSBudWxsLCB0dkFuaW0gPSAwO1xuICBjb25zdCB0d2VlbiA9IChwb3MsIHRndCwgbXMsIGRvbmUpID0+IHtcbiAgICBjb25zdCBpZCA9ICsrdHZBbmltLCBwMCA9IGNhbS5wb3NpdGlvbi5jbG9uZSgpLCBxMCA9IGN0bC50YXJnZXQuY2xvbmUoKSwgdDAgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICBjb25zdCBlYXNlID0gdCA9PiB0IDwgMC41ID8gNCp0KnQqdCA6IDEgLSBNYXRoLnBvdygtMip0KzIsIDMpLzI7XG4gICAgKGZ1bmN0aW9uIHN0ZXAobm93KXtcbiAgICAgIGlmIChpZCAhPT0gdHZBbmltKSByZXR1cm47XG4gICAgICBjb25zdCB0ID0gTWF0aC5taW4oMSwgKG5vdyAtIHQwKSAvIG1zKSwgZSA9IGVhc2UodCk7XG4gICAgICBjYW0ucG9zaXRpb24ubGVycFZlY3RvcnMocDAsIHBvcywgZSk7IGN0bC50YXJnZXQubGVycFZlY3RvcnMocTAsIHRndCwgZSk7IGNhbS5sb29rQXQoY3RsLnRhcmdldCk7XG4gICAgICBpZiAodCA8IDEpIHJlcXVlc3RBbmltYXRpb25GcmFtZShzdGVwKTsgZWxzZSBkb25lICYmIGRvbmUoKTtcbiAgICB9KSh0MCk7XG4gIH07XG4gIGNvbnN0IGVudGVyID0gKCkgPT4ge1xuICAgIGlmIChzYXZlZCkgcmV0dXJuO1xuICAgIHNhdmVkID0geyBwb3M6IGNhbS5wb3NpdGlvbi5jbG9uZSgpLCB0Z3Q6IGN0bC50YXJnZXQuY2xvbmUoKSwgZW46IGN0bC5lbmFibGVkIH07XG4gICAgY3RsLmVuYWJsZWQgPSBmYWxzZTtcbiAgICBjb25zdCB0aCA9IE1hdGgudGFuKFRIUkVFLk1hdGhVdGlscy5kZWdUb1JhZChjYW0uZm92KSAvIDIpO1xuICAgIGNvbnN0IGQgPSBNYXRoLm1heChzcy55IC8gMiAvIHRoLCBzcy56IC8gMiAvICh0aCAqIGNhbS5hc3BlY3QpKSAqIDEuMTg7XG4gICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCd0dmZvY3VzJyk7XG4gICAgdHdlZW4obmV3IFRIUkVFLlZlY3RvcjMoc2MueCArIGQsIHNjLnkgLSAwLjA0NSwgc2MueiksIG5ldyBUSFJFRS5WZWN0b3IzKHNjLngsIHNjLnkgLSAwLjA0NSwgc2MueiksIDE2MDAsICgpID0+IHsgYmFyLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTsgdWkuY2xhc3NMaXN0LmFkZCgnc2hvdycpOyB9KTtcbiAgfTtcbiAgY29uc3QgbGVhdmUgPSAoKSA9PiB7XG4gICAgaWYgKCFzYXZlZCkgcmV0dXJuO1xuICAgIGNvbnN0IHMgPSBzYXZlZDsgc2F2ZWQgPSBudWxsO1xuICAgIGJhci5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7IHVpLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTsgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCd0dmZvY3VzJyk7XG4gICAgdHdlZW4ocy5wb3MsIHMudGd0LCAxMjAwLCAoKSA9PiB7IGN0bC5lbmFibGVkID0gcy5lbjsgfSk7XG4gIH07XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0dkJhY2snKS5vbmNsaWNrID0gbGVhdmU7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0dk9mZicpLm9uY2xpY2sgPSAoKSA9PiB7IGxlYXZlKCk7IHBvd2VyKGZhbHNlKTsgfTtcbiAgYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGUgPT4geyBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSBsZWF2ZSgpOyB9KTtcbiAgYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgKCkgPT4geyBpZiAoc2F2ZWQgJiYgYmFyLmNsYXNzTGlzdC5jb250YWlucygnc2hvdycpKXsgY29uc3QgdGggPSBNYXRoLnRhbihUSFJFRS5NYXRoVXRpbHMuZGVnVG9SYWQoY2FtLmZvdikgLyAyKTsgY29uc3QgZCA9IE1hdGgubWF4KHNzLnkgLyAyIC8gdGgsIHNzLnogLyAyIC8gKHRoICogY2FtLmFzcGVjdCkpICogMS4xODsgY2FtLnBvc2l0aW9uLnNldChzYy54ICsgZCwgc2MueSAtIDAuMDQ1LCBzYy56KTsgfSB9KTtcbiAgY29uc3QgcG93ZXIgPSBvbiA9PiB7XG4gICAgYnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJywgb24pOyBidG4uY2xhc3NMaXN0LnRvZ2dsZSgnb24nLCBvbik7XG4gICAgYnRuLnF1ZXJ5U2VsZWN0b3IoJ3NwYW4nKS50ZXh0Q29udGVudCA9IG9uID8gJ0Zlcm5iZWRpZW51bmcnIDogJ0Zlcm5zZWhlciBhbic7XG4gICAgaWYgKCFvbikgdWkuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgIGlmIChvbiAmJiAhTS5lbWlzc2l2ZU1hcCl7IE0uZW1pc3NpdmUgPSBuZXcgVEhSRUUuQ29sb3IoMHhmZmZmZmYpOyBNLmVtaXNzaXZlTWFwID0gdGV4OyBNLm5lZWRzVXBkYXRlID0gdHJ1ZTsgfVxuICAgIGNvbnN0IGlkID0gKythbmltLCBmcm9tID0gbHZsLCB0byA9IG9uID8gMSA6IDAsIHQwID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgKGZ1bmN0aW9uIHN0ZXAobm93KXtcbiAgICAgIGlmIChpZCAhPT0gYW5pbSkgcmV0dXJuO1xuICAgICAgY29uc3QgdCA9IE1hdGgubWluKDEsIChub3cgLSB0MCkgLyAob24gPyA2MDAgOiAyNTApKTtcbiAgICAgIGx2bCA9IGZyb20gKyAodG8gLSBmcm9tKSAqICgxIC0gTWF0aC5wb3coMSAtIHQsIDMpKTsgYXBwbHkoKTtcbiAgICAgIGlmICh0IDwgMSkgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHN0ZXApO1xuICAgIH0pKHQwKTtcbiAgfTtcbiAgYnRuLm9uY2xpY2sgPSAoKSA9PiB7IGlmIChidG4uZ2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnKSAhPT0gJ3RydWUnKSBwb3dlcih0cnVlKTsgZW50ZXIoKTsgfTtcbiAgY29uc3QgYXBwcyA9IFtbJ1lvdVR1YmUnLCcjZTU0ODRkJ10sWydOZXRmbGl4JywnI2Q2MzAzYSddLFsnUHJpbWUgVmlkZW8nLCcjMmZhOGUwJ10sWydEaXNuZXkrJywnIzNiNmZlMCddLFsnU3BvdGlmeScsJyMyZmJmNjInXSxbJ0FSRCBNZWRpYXRoZWsnLCcjM2Q3YmUwJ10sWydaREYnLCcjZjA4YTI0J10sWydUd2l0Y2gnLCcjOGI1Y2Y2J11dO1xuICBjb25zdCBuYXYgPSB1aS5xdWVyeVNlbGVjdG9yKCcudHYtbmF2JyksIGhlcm8gPSB1aS5xdWVyeVNlbGVjdG9yKCcudHYtaGVybycpLCB2b2wgPSB1aS5xdWVyeVNlbGVjdG9yKCcudHYtdm9sIGlucHV0JyksIHZvbE8gPSB1aS5xdWVyeVNlbGVjdG9yKCcudHYtdm9sIG91dHB1dCcpO1xuICBsZXQgc2VsID0gKyhsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnd29obnVuZy50di5hcHAnKSB8fCAwKTtcbiAgYXBwcy5mb3JFYWNoKChbbl0sIGkpID0+IHsgY29uc3QgYiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOyBiLnRleHRDb250ZW50ID0gbjsgYi5vbmNsaWNrID0gKCkgPT4gcGljayhpKTsgbmF2LmFwcGVuZENoaWxkKGIpOyB9KTtcbiAgZnVuY3Rpb24gcGljayhpKXtcbiAgICBzZWwgPSAoaSArIGFwcHMubGVuZ3RoKSAlIGFwcHMubGVuZ3RoOyB0cnkgeyBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnd29obnVuZy50di5hcHAnLCBzZWwpOyB9IGNhdGNoKGUpe31cbiAgICBjb25zdCBbbiwgY29sXSA9IGFwcHNbc2VsXTtcbiAgICBuYXYucXVlcnlTZWxlY3RvckFsbCgnYnV0dG9uJykuZm9yRWFjaCgoYiwgaikgPT4gYi5jbGFzc0xpc3QudG9nZ2xlKCdvbicsIGogPT09IHNlbCkpO1xuICAgIGNvbnN0IGIgPSBuYXYuY2hpbGRyZW5bc2VsXTsgbmF2LnNjcm9sbFRvKHsgbGVmdDogYi5vZmZzZXRMZWZ0IC0gbmF2LmNsaWVudFdpZHRoLzIgKyBiLm9mZnNldFdpZHRoLzIsIGJlaGF2aW9yOiAnc21vb3RoJyB9KTtcbiAgICBoZXJvLnN0eWxlLnNldFByb3BlcnR5KCctLWEnLCBjb2wpOyBoZXJvLnF1ZXJ5U2VsZWN0b3IoJ2gyJykudGV4dENvbnRlbnQgPSBuO1xuICAgIGRyYXcoKTsgc3luY1AoKTtcbiAgfVxuICBsZXQgb3NkID0gMCwgb3NkVCA9IDAsIHBsYXlpbmcgPSBmYWxzZSwgbXV0ZWQgPSBmYWxzZSwgcHJlTXV0ZSA9IDM1O1xuICBmdW5jdGlvbiBkcmF3KCl7XG4gICAgY29uc3QgW24sIGNvbF0gPSBhcHBzW3NlbF0sIFcgPSAxMDI0LCBIID0gNjAwO1xuICAgIGMuZmlsbFN0eWxlID0gJyMwYjBjMGUnOyBjLmZpbGxSZWN0KDAsIDAsIFcsIEgpO1xuICAgIGxldCBnID0gYy5jcmVhdGVSYWRpYWxHcmFkaWVudChXKjAuODUsIEgqMC4yLCAxMCwgVyowLjg1LCBIKjAuMiwgVyowLjc1KTtcbiAgICBnLmFkZENvbG9yU3RvcCgwLCBjb2wgKyAnY2MnKTsgZy5hZGRDb2xvclN0b3AoMSwgY29sICsgJzAwJyk7IGMuZmlsbFN0eWxlID0gZzsgYy5maWxsUmVjdCgwLCAwLCBXLCBIKTtcbiAgICBjLmZvbnQgPSAnNTAwIDI0cHggSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZic7IGMudGV4dEJhc2VsaW5lID0gJ21pZGRsZSc7XG4gICAgbGV0IHggPSA0ODsgY29uc3QgeSA9IDU4LCBwaCA9IDQ2O1xuICAgIGFwcHMuZm9yRWFjaCgoW2FdLCBpKSA9PiB7IGNvbnN0IHcgPSBjLm1lYXN1cmVUZXh0KGEpLndpZHRoICsgNDA7IGlmICh4ICsgdyA+IFcgLSAyMCkgcmV0dXJuO1xuICAgICAgYy5maWxsU3R5bGUgPSBpID09PSBzZWwgPyAnI2YyZjFlYycgOiAncmdiYSgyNTUsMjU1LDI1NSwuMTIpJzsgYy5iZWdpblBhdGgoKTsgYy5yb3VuZFJlY3QoeCwgeSAtIHBoLzIsIHcsIHBoLCBwaC8yKTsgYy5maWxsKCk7XG4gICAgICBjLmZpbGxTdHlsZSA9IGkgPT09IHNlbCA/ICcjMTExMjE0JyA6ICcjZjJmMWVjJzsgYy5maWxsVGV4dChhLCB4ICsgMjAsIHkpOyB4ICs9IHcgKyAxMDsgfSk7XG4gICAgYy50ZXh0QmFzZWxpbmUgPSAnYWxwaGFiZXRpYyc7XG4gICAgaWYgKCFwbGF5aW5nKXsgYy5maWxsU3R5bGUgPSAncmdiYSgyNDIsMjQxLDIzNiwuNyknOyBjLmZvbnQgPSAnNTAwIDIycHggSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZic7IGMuZmlsbFRleHQoJ1pVTEVUWlQgR0XDlkZGTkVUJywgNTYsIDQyMCk7XG4gICAgYy5maWxsU3R5bGUgPSAnI2YyZjFlYyc7IGMuZm9udCA9ICc3MDAgMTA0cHggSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZic7IGMuZmlsbFRleHQobiwgNTAsIDUyMCwgVyAtIDEwMCk7IH1cbiAgICBpZiAocGxheWluZyl7IGMuZmlsbFN0eWxlID0gJ3JnYmEoMCwwLDAsLjQ1KSc7IGMuZmlsbFJlY3QoMCwgMCwgVywgSCk7XG4gICAgICBjLmZpbGxTdHlsZSA9ICcjZjJmMWVjJzsgYy5mb250ID0gJzcwMCA2NHB4IEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWYnOyBjLmZpbGxUZXh0KG4sIDUwLCA0NzAsIFcgLSAxMDApO1xuICAgICAgYy5mb250ID0gJzUwMCAyMnB4IEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWYnOyBjLmZpbGxTdHlsZSA9ICdyZ2JhKDI0MiwyNDEsMjM2LC43NSknOyBjLmZpbGxUZXh0KCdMw6R1ZnQnLCA1MiwgNTEyKTtcbiAgICAgIGMuZmlsbFN0eWxlID0gJ3JnYmEoMjU1LDI1NSwyNTUsLjIpJzsgYy5iZWdpblBhdGgoKTsgYy5yb3VuZFJlY3QoNTIsIDU0NSwgVyAtIDEwNCwgNiwgMyk7IGMuZmlsbCgpO1xuICAgICAgYy5maWxsU3R5bGUgPSBjb2w7IGMuYmVnaW5QYXRoKCk7IGMucm91bmRSZWN0KDUyLCA1NDUsIChXIC0gMTA0KSAqIDAuMzQsIDYsIDMpOyBjLmZpbGwoKTsgfVxuICAgIGlmIChvc2QpeyBjLmZpbGxTdHlsZSA9ICdyZ2JhKDI1NSwyNTUsMjU1LC4xNCknOyBjLmJlZ2luUGF0aCgpOyBjLnJvdW5kUmVjdChXIC0gNzgsIDE1MCwgMzQsIDMwMCwgMTcpOyBjLmZpbGwoKTtcbiAgICAgIGNvbnN0IHYgPSArdm9sLnZhbHVlIC8gMTAwOyBjLmZpbGxTdHlsZSA9ICcjZjJmMWVjJzsgYy5iZWdpblBhdGgoKTsgYy5yb3VuZFJlY3QoVyAtIDcyLCAxNTYgKyAyODggKiAoMSAtIHYpLCAyMiwgTWF0aC5tYXgoMjIsIDI4OCAqIHYpLCAxMSk7IGMuZmlsbCgpO1xuICAgICAgYy5mb250ID0gJzUwMCAyMnB4IEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWYnOyBjLnRleHRBbGlnbiA9ICdjZW50ZXInOyBjLmZpbGxUZXh0KHZvbC52YWx1ZSwgVyAtIDYxLCA0ODUpOyBjLnRleHRBbGlnbiA9ICdsZWZ0JzsgfVxuICAgIHRleC5uZWVkc1VwZGF0ZSA9IHRydWU7IHRyeSB7IGFjdCgpOyBpZiAocHRPbikgdHJhY2VyLnVwZGF0ZU1hdGVyaWFscygpOyB9IGNhdGNoKGUpe31cbiAgfVxuICBjb25zdCBwQXBwcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0dnBBcHBzJyksIHBWb2wgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudHZwLXZvbCBpbnB1dCcpLCBwVm9sTyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50dnAtdm9sIG91dHB1dCcpO1xuICBhcHBzLmZvckVhY2goKFthLCBjb2xdLCBpKSA9PiB7IGNvbnN0IGIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTsgYi5pbm5lckhUTUwgPSAnPGkgc3R5bGU9XCJiYWNrZ3JvdW5kOicgKyBjb2wgKyAnXCI+PFx1MDAyRmk+JyArIGE7IGIub25jbGljayA9ICgpID0+IHBpY2soaSk7IHBBcHBzLmFwcGVuZENoaWxkKGIpOyB9KTtcbiAgZnVuY3Rpb24gc3luY1AoKXsgcEFwcHMucXVlcnlTZWxlY3RvckFsbCgnYnV0dG9uJykuZm9yRWFjaCgoYiwgaikgPT4gYi5jbGFzc0xpc3QudG9nZ2xlKCdvbicsIGogPT09IHNlbCkpOyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndHZwU3RhdCcpLnRleHRDb250ZW50ID0gYXBwc1tzZWxdWzBdOyBwVm9sLnZhbHVlID0gdm9sLnZhbHVlOyBwVm9sTy50ZXh0Q29udGVudCA9IHZvbC52YWx1ZTsgY29uc3QgbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0dnBNdXRlJyk7IGlmIChtKSBtLmNsYXNzTGlzdC50b2dnbGUoJ29uJywgK3ZvbC52YWx1ZSA9PT0gMCk7IH1cbiAgY29uc3Qgc2hvd09zZCA9ICgpID0+IHsgb3NkID0gMTsgY2xlYXJUaW1lb3V0KG9zZFQpOyBvc2RUID0gc2V0VGltZW91dCgoKSA9PiB7IG9zZCA9IDA7IGRyYXcoKTsgfSwgMTYwMCk7IGRyYXcoKTsgc3luY1AoKTsgfTtcbiAgcFZvbC5vbmlucHV0ID0gKCkgPT4geyB2b2wudmFsdWUgPSBwVm9sLnZhbHVlOyBzZXRWb2woKTsgfTtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnR2cC12b2wgYnV0dG9uJykuZm9yRWFjaChiID0+IGIub25jbGljayA9ICgpID0+IHsgdm9sLnZhbHVlID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMTAwLCArdm9sLnZhbHVlICsgK2IuZGF0YXNldC5kKSk7IHNldFZvbCgpOyB9KTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3R2cEJhY2snKS5vbmNsaWNrID0gKCkgPT4gbGVhdmUoKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3R2cE9mZicpLm9uY2xpY2sgPSAoKSA9PiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndHZPZmYnKS5jbGljaygpO1xuICBjb25zdCBudWRnZSA9IGQgPT4geyB2b2wudmFsdWUgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxMDAsICt2b2wudmFsdWUgKyBkKSk7IG11dGVkID0gZmFsc2U7IHNldFZvbCgpOyB9O1xuICBjb25zdCBva0IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndHZwT2snKSwgbXV0ZUIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndHZwTXV0ZScpO1xuICBjb25zdCBzZXRQbGF5ID0gcCA9PiB7IHBsYXlpbmcgPSBwOyBva0IuY2xhc3NMaXN0LnRvZ2dsZSgncGxheScsIHApOyBva0IudGV4dENvbnRlbnQgPSBwID8gJ0lJJyA6ICdPSyc7IGRyYXcoKTsgfTtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnR2cC1kcGFkIGJ1dHRvbicpLmZvckVhY2goYiA9PiBiLm9uY2xpY2sgPSAoKSA9PiB7IGNvbnN0IGsgPSBiLmRhdGFzZXQuaztcbiAgICBpZiAobmF2aWdhdG9yLnZpYnJhdGUpIG5hdmlnYXRvci52aWJyYXRlKDgpO1xuICAgIGlmIChrID09PSAnbGVmdCcpIHsgcGljayhzZWwgLSAxKTsgc2V0UGxheShmYWxzZSk7IH0gZWxzZSBpZiAoayA9PT0gJ3JpZ2h0JykgeyBwaWNrKHNlbCArIDEpOyBzZXRQbGF5KGZhbHNlKTsgfVxuICAgIGVsc2UgaWYgKGsgPT09ICd1cCcpIG51ZGdlKDUpOyBlbHNlIGlmIChrID09PSAnZG93bicpIG51ZGdlKC01KTsgZWxzZSBzZXRQbGF5KCFwbGF5aW5nKTsgfSk7XG4gIG11dGVCLm9uY2xpY2sgPSAoKSA9PiB7IGlmICghbXV0ZWQpeyBwcmVNdXRlID0gK3ZvbC52YWx1ZSB8fCAzNTsgdm9sLnZhbHVlID0gMDsgbXV0ZWQgPSB0cnVlOyB9IGVsc2UgeyB2b2wudmFsdWUgPSBwcmVNdXRlOyBtdXRlZCA9IGZhbHNlOyB9IHNldFZvbCgpOyBtdXRlZCA9ICt2b2wudmFsdWUgPT09IDAgJiYgbXV0ZWQ7IG11dGVCLmNsYXNzTGlzdC50b2dnbGUoJ29uJywgbXV0ZWQpOyB9O1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndHZwSG9tZScpLm9uY2xpY2sgPSAoKSA9PiBzZXRQbGF5KGZhbHNlKTtcbiAgcGljayhzZWwpO1xuICB2b2wudmFsdWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnd29obnVuZy50di52b2wnKSA/PyAzNTtcbiAgY29uc3Qgc2V0Vm9sID0gKCkgPT4geyB2b2xPLnRleHRDb250ZW50ID0gdm9sLnZhbHVlOyB2b2wuc3R5bGUuc2V0UHJvcGVydHkoJy0tdicsIHZvbC52YWx1ZSArICclJyk7IHRyeSB7IGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd3b2hudW5nLnR2LnZvbCcsIHZvbC52YWx1ZSk7IH0gY2F0Y2goZSl7fSBpZiAodHlwZW9mIHNob3dPc2QgPT09ICdmdW5jdGlvbicpIHNob3dPc2QoKTsgfTtcbiAgdm9sLm9uaW5wdXQgPSBzZXRWb2w7IHNldFZvbCgpO1xuICB1aS5xdWVyeVNlbGVjdG9yQWxsKCcudHYtdmInKS5mb3JFYWNoKGIgPT4gYi5vbmNsaWNrID0gKCkgPT4geyB2b2wudmFsdWUgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxMDAsICt2b2wudmFsdWUgKyArYi5kYXRhc2V0LmQpKTsgc2V0Vm9sKCk7IH0pO1xuICBbJ3BvaW50ZXJkb3duJywnd2hlZWwnLCdrZXlkb3duJ10uZm9yRWFjaCh0ID0+IHVpLmFkZEV2ZW50TGlzdGVuZXIodCwgZSA9PiBlLnN0b3BQcm9wYWdhdGlvbigpKSk7XG4gIGFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBlID0+IHsgaWYgKCF1aS5jbGFzc0xpc3QuY29udGFpbnMoJ3Nob3cnKSkgcmV0dXJuO1xuICAgIGlmIChlLmtleSA9PT0gJ0Fycm93UmlnaHQnKSBwaWNrKHNlbCArIDEpOyBlbHNlIGlmIChlLmtleSA9PT0gJ0Fycm93TGVmdCcpIHBpY2soc2VsIC0gMSk7XG4gICAgZWxzZSBpZiAoZS5rZXkgPT09ICdBcnJvd1VwJyl7IHZvbC52YWx1ZSA9IE1hdGgubWluKDEwMCwgK3ZvbC52YWx1ZSArIDUpOyBzZXRWb2woKTsgfSBlbHNlIGlmIChlLmtleSA9PT0gJ0Fycm93RG93bicpeyB2b2wudmFsdWUgPSBNYXRoLm1heCgwLCArdm9sLnZhbHVlIC0gNSk7IHNldFZvbCgpOyB9IH0pO1xufVxuXG4vLyAtLS0tLS0tLS0tIFRyaXBvZC1MYW1wZTogYW4vYXVzLCBGYXJiZSwgU3TDpHJrZSwgS2VnZWwgLS0tLS0tLS0tLVxuY29uc3QgdHJpcEJveCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYW1wMicpLCB0cmlwRG90ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3RyaXBUIGknKTtcbmNvbnN0IFRSSVBfS0VZID0gJ3dvaG51bmctdHJpcG9kLWZhcmJlJztcbmNvbnN0IHRyaXBDb2xJbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0cmlwQ29sJyksIHRyaXBEaW1JbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0cmlwRGltJyksIHRyaXBDb25lSW4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndHJpcENvbmUnKTtcbmxldCB0cmlwT24gPSBmYWxzZSwgdHJpcEx2bCA9IDAsIHRyaXBBbmltID0gMCwgdHJpcEsgPSAxO1xubGV0IHRyaXBDb2wgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShUUklQX0tFWSkgfHwgJyNmMmY1ZmYnO1xuY29uc3QgdHJpcFN5bmMgPSAoKSA9PiB7IGlmIChwdE9uKXsgdHJhY2VyLnVwZGF0ZUxpZ2h0cygpOyB0cmFjZXIudXBkYXRlTWF0ZXJpYWxzKCk7IH0gfTtcbmZ1bmN0aW9uIGFwcGx5VHJpcCgpe1xuICBjb25zdCB2ID0gdHJpcEx2bCAqIHRyaXBLLCBjID0gbmV3IFRIUkVFLkNvbG9yKHRyaXBDb2wpO1xuICB0cmlwLnNwb3QuY29sb3IuY29weShjKTsgdHJpcC5nbG93LmNvbG9yLmNvcHkoYyk7IHRyaXAuTS5sZWQuZW1pc3NpdmUuY29weShjKTtcbiAgdHJpcC5NLmxlZC5jb2xvci5zZXQodHJpcEx2bCA+IDAuMDEgPyAweGZmZmZmZiA6IDB4ZDhkYWRkKTtcbiAgdHJpcC5zcG90LmludGVuc2l0eSA9IDEyICogdjsgdHJpcC5nbG93LmludGVuc2l0eSA9IDAuMzUgKiB2O1xuICB0cmlwLk0ubGVkLmVtaXNzaXZlSW50ZW5zaXR5ID0gNCAqIHY7XG4gIHRyaXBEb3Quc3R5bGUuY3NzVGV4dCA9IHRyaXBPbiA/IGBiYWNrZ3JvdW5kOiR7dHJpcENvbH07Ym94LXNoYWRvdzowIDAgMTBweCAzcHggJHt0cmlwQ29sfTk5YCA6ICcnO1xufVxudHJpcERpbUluLm9uaW5wdXQgPSAoKSA9PiB7IHRyaXBLID0gdHJpcERpbUluLnZhbHVlLzEwMDsgdHJpcERpbUluLm5leHRFbGVtZW50U2libGluZy50ZXh0Q29udGVudCA9IHRyaXBEaW1Jbi52YWx1ZSArICclJzsgYXBwbHlUcmlwKCk7IHRyaXBTeW5jKCk7IH07XG5tYWtlUGlja2VyKHRyaXBDb2xJbiwgVFJJUF9LRVkgKyAnLWNmZycsIHsgbW9kZTogJ3doaXRlJywgd2FybTogNSB9LCB0cmlwRGltSW4sIGggPT4geyB0cmlwQ29sID0gaDsgdHJ5IHsgbG9jYWxTdG9yYWdlLnNldEl0ZW0oVFJJUF9LRVksIGgpOyB9IGNhdGNoKGUpe30gYXBwbHlUcmlwKCk7IHRyaXBTeW5jKCk7IH0pO1xudHJpcENvbmVJbi5vbmlucHV0ID0gKCkgPT4geyB0cmlwLnNwb3QuYW5nbGUgPSBUSFJFRS5NYXRoVXRpbHMuZGVnVG9SYWQodHJpcENvbmVJbi52YWx1ZSk7IHRyaXBDb25lSW4ubmV4dEVsZW1lbnRTaWJsaW5nLnRleHRDb250ZW50ID0gdHJpcENvbmVJbi52YWx1ZSArICfCsCc7IHRyaXBTeW5jKCk7IH07XG50cmlwQ29uZUluLm9uaW5wdXQoKTtcbmFwcGx5VHJpcCgpO1xuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RyaXBUJykub25jbGljayA9ICgpID0+IHtcbiAgdHJpcE9uID0gIXRyaXBPbjtcbiAgdHJpcEJveC5jbGFzc0xpc3QudG9nZ2xlKCdvbicsIHRyaXBPbik7XG4gIHRyaXBCb3gucXVlcnlTZWxlY3RvcignI3RyaXBUIHNwYW4nKS50ZXh0Q29udGVudCA9IHRyaXBPbiA/ICdUcmlwb2QtTGFtcGUgYXVzJyA6ICdUcmlwb2QtTGFtcGUgYW4nO1xuICBjb25zdCBpZCA9ICsrdHJpcEFuaW0sIGZyb20gPSB0cmlwTHZsLCB0byA9IHRyaXBPbiA/IDEgOiAwLCB0MCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAoZnVuY3Rpb24gc3RlcChub3cpe1xuICAgIGlmIChpZCAhPT0gdHJpcEFuaW0pIHJldHVybjtcbiAgICBjb25zdCB0ID0gTWF0aC5taW4oMSwgKG5vdyAtIHQwKSAvIDQ1MCk7XG4gICAgdHJpcEx2bCA9IGZyb20gKyAodG8gLSBmcm9tKSAqICgxIC0gTWF0aC5wb3coMSAtIHQsIDMpKTtcbiAgICBhcHBseVRyaXAoKTsgdHJpcFN5bmMoKTtcbiAgICBpZiAodCA8IDEpIHJlcXVlc3RBbmltYXRpb25GcmFtZShzdGVwKTtcbiAgfSkodDApO1xufTtcblxuLy8gLS0tLS0tLS0tLSBQYXRodHJhY2luZyAodGhyZWUtZ3B1LXBhdGh0cmFjZXIpOiBlY2h0ZSBMaWNodGLDvG5kZWwgbWl0IE1laHJmYWNoLVJlZmxleGlvbiwgc29iYWxkIGRpZSBLYW1lcmEgc3RpbGxzdGVodCAtLS0tLS0tLS0tXG5cbmNvbnN0IHB0TGFiZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHQnKTtcbmxldCByZW5kZXJPbiA9IGZhbHNlO1xuLy8gU3BhcnNhbWVyIFN0YW5kYXJkLVJlbmRlcmVyOiBOOEFPIChTY3JlZW4tU3BhY2UgQW1iaWVudCBPY2NsdXNpb24pICsgUmVuZGVybiBudXIgYmVpIEFrdGl2aXTDpHRcbmxldCBjb21wb3NlciA9IG51bGwsIGFvUGFzcyA9IG51bGwsIGxhc3RBY3QgPSBwZXJmb3JtYW5jZS5ub3coKSwgbGFzdElucHV0ID0gbGFzdEFjdDtcbmNvbnN0IGFjdCA9ICgpID0+IHsgbGFzdEFjdCA9IGxhc3RJbnB1dCA9IHBlcmZvcm1hbmNlLm5vdygpOyB9O1xuZm9yIChjb25zdCBldiBvZiBbJ3BvaW50ZXJkb3duJywncG9pbnRlcm1vdmUnLCd3aGVlbCcsJ2tleWRvd24nLCdpbnB1dCcsJ2NsaWNrJywncmVzaXplJywndG91Y2hzdGFydCddKSB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihldiwgYWN0LCB0cnVlKTtcblByb21pc2UuYWxsKFtpbXBvcnQoJ3RocmVlL2V4YW1wbGVzL2pzbS9wb3N0cHJvY2Vzc2luZy9FZmZlY3RDb21wb3Nlci5qcycpLCBpbXBvcnQoJ3RocmVlL2V4YW1wbGVzL2pzbS9wb3N0cHJvY2Vzc2luZy9SZW5kZXJQYXNzLmpzJyksIGltcG9ydCgndGhyZWUvZXhhbXBsZXMvanNtL3Bvc3Rwcm9jZXNzaW5nL091dHB1dFBhc3MuanMnKSwgaW1wb3J0KCduOGFvJyldKS50aGVuKChbe0VmZmVjdENvbXBvc2VyfSx7UmVuZGVyUGFzc30se091dHB1dFBhc3N9LHtOOEFPUGFzc31dKSA9PiB7XG4gIGNvbnN0IHMgPSByZW5kZXJlci5nZXRTaXplKG5ldyBUSFJFRS5WZWN0b3IyKCkpO1xuICBjb21wb3NlciA9IG5ldyBFZmZlY3RDb21wb3NlcihyZW5kZXJlcik7XG4gIGFvUGFzcyA9IG5ldyBOOEFPUGFzcyhzY2VuZSwgY2FtLCBzLngsIHMueSk7XG4gIE9iamVjdC5hc3NpZ24oYW9QYXNzLmNvbmZpZ3VyYXRpb24sIHsgYW9SYWRpdXM6IDAuNiwgZGlzdGFuY2VGYWxsb2ZmOiAwLjUsIGludGVuc2l0eTogMi4yLCBhb1NhbXBsZXM6IDEyLCBkZW5vaXNlU2FtcGxlczogNiwgZGVub2lzZVJhZGl1czogMTAsIGhhbGZSZXM6IHRydWUsIGdhbW1hQ29ycmVjdGlvbjogZmFsc2UgfSk7XG4gIGFvUGFzcy5zZXRRdWFsaXR5TW9kZSAmJiBhb1Bhc3Muc2V0UXVhbGl0eU1vZGUoJ0xvdycpO1xuICBjb21wb3Nlci5hZGRQYXNzKGFvUGFzcyk7IGNvbXBvc2VyLmFkZFBhc3MobmV3IE91dHB1dFBhc3MoKSk7XG4gIGFjdCgpO1xufSkuY2F0Y2goZSA9PiBjb25zb2xlLndhcm4oJ044QU8gbmljaHQgdmVyZsO8Z2JhciDigJMgZWluZmFjaGVyIFJhc3RlcicsIGUpKTtcbmNvbnN0IF9jcyA9IG5ldyBUSFJFRS5WZWN0b3IyKCk7XG5jb25zdCBydEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdydCcpO1xucnRCdG4ub25jbGljayA9ICgpID0+IHtcbiAgcmVuZGVyT24gPSAhcmVuZGVyT247XG4gIHJ0QnRuLmNsYXNzTGlzdC50b2dnbGUoJ29uJywgcmVuZGVyT24pOyBydEJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcsIHJlbmRlck9uKTtcbiAgcnRCdG4ucXVlcnlTZWxlY3Rvcignc3BhbicpLnRleHRDb250ZW50ID0gcmVuZGVyT24gPyAnUmVuZGVyIGFuJyA6ICdSZW5kZXIgYXVzJztcbiAgaWYgKCFyZW5kZXJPbiAmJiBwdE9uKSBzdG9wUFQoKTtcbiAgc3RpbGxTaW5jZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xufTtcbm5ldyBQcm9taXNlKCgpID0+IHt9KS50aGVuKCh7IFdlYkdMUGF0aFRyYWNlciB9KSA9PiB7XG4gIHRyYWNlciA9IG5ldyBXZWJHTFBhdGhUcmFjZXIocmVuZGVyZXIpO1xuICB0cmFjZXIuYm91bmNlcyA9IDQ7XG4gIHRyYWNlci5yZW5kZXJTY2FsZSA9IDAuNTtcbiAgdHJhY2VyLmR5bmFtaWNMb3dSZXMgPSBmYWxzZTtcbiAgdHJhY2VyLmZpbHRlckdsb3NzeUZhY3RvciA9IDAuNTtcbiAgdHJhY2VyLnRpbGVzLnNldCg0LCA0KTtcbiAgdHJhY2VyLm1pblNhbXBsZXMgPSAyO1xuICB0cmFjZXIuZmFkZUR1cmF0aW9uID0gMzUwO1xuICB0cmFjZXIucmVuZGVyRGVsYXkgPSAwO1xufSkuY2F0Y2goZSA9PiBjb25zb2xlLndhcm4oJ1BhdGh0cmFjZXIgbmljaHQgdmVyZsO8Z2JhciDigJMgUmFzdGVyLUZhbGxiYWNrJywgZSkpO1xuZnVuY3Rpb24gc3RhcnRQVCgpe1xuICBzY2VuZS5lbnZpcm9ubWVudCA9IHB0RW52OyBzY2VuZS5iYWNrZ3JvdW5kID0gcHRFbnY7XG4gIHNjZW5lLmVudmlyb25tZW50SW50ZW5zaXR5ID0gRU5WO1xuICByZW5kZXJlci50b25lTWFwcGluZ0V4cG9zdXJlID0gMi40O1xuICBpZiAocHREaXJ0eSl7IHRyYWNlci5zZXRTY2VuZShzY2VuZSwgY2FtKTsgcHREaXJ0eSA9IGZhbHNlOyB9XG4gIGVsc2UgeyB0cmFjZXIudXBkYXRlQ2FtZXJhKCk7IHRyYWNlci51cGRhdGVNYXRlcmlhbHMoKTsgdHJhY2VyLnVwZGF0ZUxpZ2h0cygpOyB0cmFjZXIudXBkYXRlRW52aXJvbm1lbnQoKTsgfVxuICB0cmFjZXIucmVzZXQoKTtcbiAgcHRPbiA9IHRydWU7IHB0TGFiZWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xufVxuZnVuY3Rpb24gc3RvcFBUKCl7IHB0T24gPSBmYWxzZTsgc2NlbmUuZW52aXJvbm1lbnQgPSByYXN0ZXJFbnY7IHNjZW5lLmJhY2tncm91bmQgPSBjdWJlUlQudGV4dHVyZTsgYXBwbHlJbnRlcmlvcihjZWlsTWF0Lm9wYWNpdHkpOyBwdExhYmVsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTsgfVxuY29uc3QgTUFYX1NBTVBMRVMgPSAyNTY7IGxldCBwdEZyYW1lID0gMDtcbmxldCBsYXN0VXNlciA9IC0xZTk7XG5jb25zdCBpbnRlcnJ1cHQgPSAoKSA9PiB7IHN0aWxsU2luY2UgPSBsYXN0VXNlciA9IHBlcmZvcm1hbmNlLm5vdygpOyBpZiAocHRPbikgc3RvcFBUKCk7IH07XG5mb3IgKGNvbnN0IGV2IG9mIFsncG9pbnRlcmRvd24nLCd3aGVlbCcsJ2tleWRvd24nXSkgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoZXYsIGludGVycnVwdCwgdHJ1ZSk7XG5yZW5kZXJlci5kb21FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgaW50ZXJydXB0LCB0cnVlKTtcbmNvbnN0IGxhc3RNID0gbmV3IFRIUkVFLk1hdHJpeDQoKTsgbGV0IGxhc3RBc3BlY3QgPSAwO1xuZnVuY3Rpb24gY2FtTW92ZWQoKXtcbiAgY29uc3QgYSA9IGNhbS5tYXRyaXhXb3JsZC5lbGVtZW50cywgYiA9IGxhc3RNLmVsZW1lbnRzOyBsZXQgZCA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgMTY7IGkrKykgZCArPSBNYXRoLmFicyhhW2ldIC0gYltpXSk7XG4gIGNvbnN0IG0gPSBkID4gMWUtNSB8fCBjYW0uYXNwZWN0ICE9PSBsYXN0QXNwZWN0O1xuICBsYXN0TS5jb3B5KGNhbS5tYXRyaXhXb3JsZCk7IGxhc3RBc3BlY3QgPSBjYW0uYXNwZWN0O1xuICByZXR1cm4gbTtcbn1cbmNvbnN0IGxvb3AgPSAoKSA9PiB7XG4gIGN0bC5hdXRvUm90YXRlID0gIWluUm9vbSAmJiAhbGFtcEZvY3VzICYmIGN0bC5lbmFibGVkICYmIHBlcmZvcm1hbmNlLm5vdygpIC0gbGFzdFVzZXIgPiA2MDAwO1xuICBjdGwuYXV0b1JvdGF0ZVNwZWVkID0gMC40O1xuICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC50b2dnbGUoJ2lkbGUnLCBwZXJmb3JtYW5jZS5ub3coKSAtIGxhc3RJbnB1dCA+IDgwMDApO1xuICBjdGwudXBkYXRlKCk7IGNhbS51cGRhdGVNYXRyaXhXb3JsZCgpO1xuICBjb25zdCBub3cgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgaWYgKGNhbU1vdmVkKCkpeyBzdGlsbFNpbmNlID0gbm93OyBsYXN0QWN0ID0gbm93OyBpZiAocHRPbikgc3RvcFBUKCk7IH1cbiAgaWYgKHRyYWNlciAmJiByZW5kZXJPbiAmJiAhcHRPbiAmJiBub3cgLSBzdGlsbFNpbmNlID4gMzUwICYmIChjZWlsTWF0Lm9wYWNpdHkgPj0gMC45OTkgfHwgY2VpbE1hdC5vcGFjaXR5IDw9IDAuMDAxKSl7XG4gICAgdHJ5IHsgc3RhcnRQVCgpOyB9IGNhdGNoKGUpeyBjb25zb2xlLndhcm4oJ1BhdGh0cmFjZXItRmVobGVyOiAnICsgKGUgJiYgZS5tZXNzYWdlKSwgZSk7IHRyYWNlciA9IG51bGw7IHB0T24gPSBmYWxzZTsgc2NlbmUuZW52aXJvbm1lbnQgPSByYXN0ZXJFbnY7IHNjZW5lLmJhY2tncm91bmQgPSBjdWJlUlQudGV4dHVyZTsgcHRMYWJlbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7IH1cbiAgfVxuICBpZiAocHRPbiAmJiB0cmFjZXIuc2FtcGxlcyA+PSBNQVhfU0FNUExFUyl7IHB0TGFiZWwudGV4dENvbnRlbnQgPSAnUmF5dHJhY2luZyDCtyBmZXJ0aWcnOyByZXR1cm47IH1cbiAgaWYgKHB0T24peyBwdEZyYW1lIF49IDE7IGlmIChwdEZyYW1lKSB0cmFjZXIucmVuZGVyU2FtcGxlKCk7IHB0TGFiZWwudGV4dENvbnRlbnQgPSAnUmF5dHJhY2luZyDCtyAnICsgTWF0aC5mbG9vcih0cmFjZXIuc2FtcGxlcykgKyAnIFNhbXBsZXMnOyB9XG4gIGVsc2UgaWYgKG5vdyAtIGxhc3RBY3QgPCAxNTAwKSB7XG4gICAgaWYgKGNvbXBvc2VyKXsgcmVuZGVyZXIuZ2V0U2l6ZShfY3MpOyBpZiAoY29tcG9zZXIuX3cgIT09IF9jcy54IHx8IGNvbXBvc2VyLl9oICE9PSBfY3MueSl7IGNvbXBvc2VyLnNldFNpemUoX2NzLngsIF9jcy55KTsgY29tcG9zZXIuX3cgPSBfY3MueDsgY29tcG9zZXIuX2ggPSBfY3MueTsgfSBjb21wb3Nlci5yZW5kZXIoKTsgfVxuICAgIGVsc2UgcmVuZGVyZXIucmVuZGVyKHNjZW5lLCBjYW0pO1xuICB9XG59O1xuc3RhZ2UuX2xvb3AgPSBsb29wO1xucmVuZGVyZXIuc2V0QW5pbWF0aW9uTG9vcChsb29wKTtcbi8vIEJlaW0gR3LDtsOfZW53ZWNoc2VsIChNZW7DvC1BbmltYXRpb24pIHNvZm9ydCBuZXUgemVpY2huZW4g4oaSIGtlaW4gaGVsbGVyIEJsaXR6XG5uZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4geyBjb25zdCBuID0gcGVyZm9ybWFuY2Uubm93KCk7IGxhc3RBY3QgPSBuOyBzdGlsbFNpbmNlID0gbjsgaWYgKHB0T24pIHN0b3BQVCgpOyBsb29wKCk7IH0pLm9ic2VydmUoc3RhZ2UpO1xuXG4vLyAtLS0tLS0tLS0tIFJhdW0tTmF2aWdhdGlvbiAtLS0tLS0tLS0tXG5jb25zdCBjYW0gPSBzdGFnZS5fY2FtZXJhLCBjdGwgPSBzdGFnZS5fY29udHJvbHM7XG5sZXQgbGFtcEZvY3VzID0gZmFsc2U7XG5jYW0ucG9zaXRpb24uc3ViKGN0bC50YXJnZXQpLm11bHRpcGx5U2NhbGFyKDAuNikuYWRkKGN0bC50YXJnZXQpO1xuY29uc3Qgb3ZlcnZpZXcgPSB7IHBvczogY2FtLnBvc2l0aW9uLmNsb25lKCksIHRndDogY3RsLnRhcmdldC5jbG9uZSgpIH07XG5jb25zdCBFWUUgPSAxLjY7XG4vLyBTdGFuZHB1bmt0IGluIGRlciBSYXVtbWl0dGUsIEJsaWNrIGluIFJpY2h0dW5nIChkeCxkeik7IFRhcmdldCBtaW5pbWFsIHZvciBkZXIgS2FtZXJhIOKGkiBVbXNlaGVuIHN0YXR0IFVta3JlaXNlblxuY29uc3Qgc3BvdCA9ICh4LCB6LCBkeCwgZHosIHkgPSBFWUUpID0+IHtcbiAgY29uc3QgZCA9IG5ldyBUSFJFRS5WZWN0b3IzKGR4LCAtMC4xMiwgZHopLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKDAuMDUpO1xuICBjb25zdCBwb3MgPSBuZXcgVEhSRUUuVmVjdG9yMyh4LCB5LCB6KTtcbiAgcmV0dXJuIHsgcG9zLCB0Z3Q6IHBvcy5jbG9uZSgpLmFkZChkKSwgZnA6IHRydWUgfTtcbn07XG4vLyBWb2dlbHBlcnNwZWt0aXZlOiBzZW5rcmVjaHQgw7xiZXIgZGVtIFJhdW0sIGxlaWNodCBnZW5laWd0LCBEZWNrZSBhdXNnZWJsZW5kZXQg4oCTIGdhbnplciBSYXVtIGltIEJpbGRcbmNvbnN0IGJpcmQgPSAoeDAsejAseDEsejEpID0+IHtcbiAgY29uc3QgY3ggPSAoeDAreDEpLzIsIGN6ID0gKHowK3oxKS8yLCB3ID0gTWF0aC5hYnMoeDEteDApLCBkID0gTWF0aC5hYnMoejEtejApO1xuICBjb25zdCBmb3YgPSAoY2FtLmZvdiB8fCA1MCkgKiBNYXRoLlBJLzE4MCwgYXNwID0gTWF0aC5tYXgoMC4zNSwgKHN0YWdlLmNsaWVudFdpZHRofHwxKS8oc3RhZ2UuY2xpZW50SGVpZ2h0fHwxKSk7XG4gIGNvbnN0IG5lZWQgPSBNYXRoLm1heChkLCB3L2FzcCkgKiAwLjUgKiAxLjI1OyAgICAgICAgICAgIC8vIGhhbGJlIEF1c2RlaG51bmcgKyBSYW5kXG4gIGNvbnN0IGhndCA9IG5lZWQgLyBNYXRoLnRhbihmb3YvMikgKyAxLjA7XG4gIHJldHVybiB7IHBvczogbmV3IFRIUkVFLlZlY3RvcjMoY3gsIGhndCwgY3ogKyBoZ3QqMC4yMiksIHRndDogbmV3IFRIUkVFLlZlY3RvcjMoY3gsIDAuMywgY3opLCBmcDogZmFsc2UgfTtcbn07XG5jb25zdCByb29tID0gKFt4MCx6MCx4MSx6MV0sIGR4LCBkeikgPT4gKHsgZnA6IHNwb3QoKHgwK3gxKS8yLCAoejArejEpLzIsIGR4LCBkeiksIGJpcmQ6IGJpcmQoeDAsIHowLCB4MSwgejEpIH0pO1xuY29uc3QgUk9PTVMgPSBbXG4gIFsnw5xiZXJzaWNodCcsIG92ZXJ2aWV3XSxcbiAgWydXb2huemltbWVyJywgcm9vbShSTV9XWiwgMSwgMC40KV0sXG4gIFsnS8O8Y2hlJywgcm9vbShSTV9LVSwgMSwgLTAuMyldLFxuICBbJ1NjaGxhZnppbW1lcicsIHJvb20oUk1fU1osIC0wLjMsIDEpXSxcbiAgWydCYWQnLCByb29tKFJNX0JBRCwgMCwgLTEpXSxcbiAgWydGbHVyJywgcm9vbShSTV9GTCwgLTEsIDApXSxcbiAgWydCYWxrb24nLCByb29tKFtCWDAsIEJaMCwgQlgxLCBCWjFdLCAwLCAtMSldLFxuXTtcbmxldCBhbmltID0gMDtcbmZ1bmN0aW9uIGZseVRvKHZpZXcpe1xuICBjb25zdCBpZCA9ICsrYW5pbTtcbiAgY29uc3QgcDAgPSBjYW0ucG9zaXRpb24uY2xvbmUoKSwgdDAgPSBjdGwudGFyZ2V0LmNsb25lKCk7XG4gIGNvbnN0IGMwID0gY2VpbE1hdC5vcGFjaXR5LCBjMSA9IHZpZXcuZnAgPyAxIDogMDtcbiAgaW5Sb29tID0gISF2aWV3LmZwO1xuICBjb25zdCBjbGFtcDAxID0geCA9PiBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCB4KSk7XG4gIGNvbnN0IGRpc3QgPSBwMC5kaXN0YW5jZVRvKHZpZXcucG9zKTtcbiAgY29uc3QgZHVyID0gTWF0aC5taW4oMjIwMCwgMTEwMCArIGRpc3QqOTApO1xuICBjb25zdCBsaWZ0ID0gTWF0aC5taW4oMywgZGlzdCowLjI1KTtcbiAgY29uc3Qgc3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgY3RsLmVuYWJsZWQgPSBmYWxzZTtcbiAgY3RsLmVuYWJsZVpvb20gPSBjdGwuZW5hYmxlUGFuID0gIXZpZXcuZnA7XG4gIGN0bC5yb3RhdGVTcGVlZCA9IHZpZXcuZnAgPyAtMC4zNSA6IDE7XG4gIGN0bC5taW5EaXN0YW5jZSA9IDA7XG4gIGNvbnN0IGVhc2UgPSB0ID0+IHQgPCAwLjUgPyA0KnQqdCp0IDogMSAtIE1hdGgucG93KC0yKnQrMiwgMykvMjtcbiAgKGZ1bmN0aW9uIHN0ZXAobm93KXtcbiAgICBpZiAoaWQgIT09IGFuaW0pIHJldHVybjtcbiAgICBjb25zdCB0ID0gTWF0aC5taW4oMSwgKG5vdyAtIHN0YXJ0KS9kdXIpLCBlID0gZWFzZSh0KTtcbiAgICBjYW0ucG9zaXRpb24ubGVycFZlY3RvcnMocDAsIHZpZXcucG9zLCBlKTtcbiAgICBjYW0ucG9zaXRpb24ueSArPSBNYXRoLnNpbihNYXRoLlBJKmUpICogbGlmdDtcbiAgICBjdGwudGFyZ2V0LmxlcnBWZWN0b3JzKHQwLCB2aWV3LnRndCwgZSk7XG4gICAgY2FtLmxvb2tBdChjdGwudGFyZ2V0KTtcbiAgICAvLyBFaW5ibGVuZGVuIGVyc3QgYW0gRW5kZSBkZXIgQW5mbHVncyAoS2FtZXJhIHNjaG9uIHVudGVyIERlY2tlbmjDtmhlKSwgQXVzYmxlbmRlbiBzb2ZvcnRcbiAgICBjb25zdCBrID0gYzEgPiBjMCA/IGNsYW1wMDEoKGUgLSAwLjYpIC8gMC40KSA6IGNsYW1wMDEoZSAvIDAuMyk7XG4gICAgc2V0Q2VpbChjMCArIChjMSAtIGMwKSAqIGspO1xuICAgIGlmICh0IDwgMSkgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHN0ZXApOyBlbHNlIGN0bC5lbmFibGVkID0gdHJ1ZTtcbiAgfSkoc3RhcnQpO1xufVxuY29uc3QgYmFyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jvb21zJyk7XG5jb25zdCBwb3ZCYXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncG92Jyk7XG5sZXQgY3VyVmlldyA9IG92ZXJ2aWV3LCBwb3ZNb2RlID0gJ2JpcmQnO1xuY29uc3Qgc2hvdyA9ICgpID0+IGZseVRvKGN1clZpZXcuYmlyZCA/IGN1clZpZXdbcG92TW9kZV0gOiBjdXJWaWV3KTtcblJPT01TLmZvckVhY2goKFtsYWJlbCwgdmlld10sIGkpID0+IHtcbiAgY29uc3QgYiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICBiLnRleHRDb250ZW50ID0gbGFiZWw7XG4gIGlmIChpID09PSAwKSBiLmNsYXNzTGlzdC5hZGQoJ29uJyk7XG4gIGIub25jbGljayA9ICgpID0+IHtcbiAgICBiYXIucXVlcnlTZWxlY3RvckFsbCgnYnV0dG9uJykuZm9yRWFjaCh4ID0+IHguY2xhc3NMaXN0LnRvZ2dsZSgnb24nLCB4ID09PSBiKSk7XG4gICAgbGFtcEJ0bi5jbGFzc0xpc3QudG9nZ2xlKCdzaG93JywgbGFiZWwgPT09ICdXb2huemltbWVyJyk7XG4gICAgdHJpcEJveC5jbGFzc0xpc3QudG9nZ2xlKCdzaG93JywgbGFiZWwgPT09ICdTY2hsYWZ6aW1tZXInKTtcbiAgICBwb3ZCYXIuY2xhc3NMaXN0LnRvZ2dsZSgnc2hvdycsICEhdmlldy5iaXJkKTtcbiAgICBjdXJWaWV3ID0gdmlldzsgcG92TW9kZSA9ICdiaXJkJztcbiAgICBwb3ZCYXIucXVlcnlTZWxlY3RvckFsbCgnYnV0dG9uJykuZm9yRWFjaCh4ID0+IHguY2xhc3NMaXN0LnRvZ2dsZSgnb24nLCB4LmRhdGFzZXQubSA9PT0gcG92TW9kZSkpO1xuICAgIHNob3coKTtcbiAgfTtcbiAgYmFyLmFwcGVuZENoaWxkKGIpO1xufSk7XG4vLyBMYW1wZSBrb25maWd1cmllcmVuIOKGkiBLYW1lcmEgZmxpZWd0IGFuIGRpZSBMYW1wZSwgRHJlaGVuIHN0b3BwdDsgYmVpbSBTY2hsaWXDn2VuIHp1csO8Y2tcbmNvbnN0IExBTVBfRk9DVVMgPSB7IFtMQU1QX0tFWSArICctY2ZnJ106IFticC5jbG9uZSgpLCAxXSwgW1RSSVBfS0VZICsgJy1jZmcnXTogW3RyaXAuc3BvdC5nZXRXb3JsZFBvc2l0aW9uKG5ldyBUSFJFRS5WZWN0b3IzKCkpLCAzXSB9O1xuYWRkRXZlbnRMaXN0ZW5lcignbHBpY2snLCBlID0+IHtcbiAgY29uc3QgZiA9IExBTVBfRk9DVVNbZS5kZXRhaWwua2V5XTsgaWYgKCFmKSByZXR1cm47XG4gIGlmIChlLmRldGFpbC5vcGVuKXtcbiAgICBsYW1wRm9jdXMgPSB0cnVlO1xuICAgIGNvbnN0IHAgPSBmWzBdLCBjID0gUk9PTVNbZlsxXV1bMV0uZnAucG9zLCBkaXIgPSBuZXcgVEhSRUUuVmVjdG9yMyhjLnggLSBwLngsIDAsIGMueiAtIHAueik7XG4gICAgY29uc3QgZGlzdCA9IE1hdGgubWluKDEuOCwgZGlyLmxlbmd0aCgpICogMC44NSk7IGRpci5ub3JtYWxpemUoKTtcbiAgICAvLyBIYW5keTogTGFtcGUgbWl0dGlnIGltIG9iZXJlbiBCaWxkdGVpbCwgTWVuw7wtU2hlZXQgdW50ZW5cbiAgICBjb25zdCBwb3MgPSBwLmNsb25lKCkuYWRkU2NhbGVkVmVjdG9yKGRpciwgZGlzdCAqIDEuNCkuYWRkKG5ldyBUSFJFRS5WZWN0b3IzKDAsIC0wLjMsIDApKTtcbiAgICBmbHlUbyh7IHBvcywgdGd0OiBwLmNsb25lKCkuYWRkKG5ldyBUSFJFRS5WZWN0b3IzKDAsIC0wLjM1LCAwKSksIGZwOiBmYWxzZSB9KTtcbiAgfSBlbHNlIHsgbGFtcEZvY3VzID0gZmFsc2U7IHNob3coKTsgfVxufSk7XG5wb3ZCYXIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBlID0+IHtcbiAgY29uc3QgYiA9IGUudGFyZ2V0LmNsb3Nlc3QoJ2J1dHRvbicpOyBpZiAoIWIgfHwgYi5kYXRhc2V0Lm0gPT09IHBvdk1vZGUpIHJldHVybjtcbiAgcG92TW9kZSA9IGIuZGF0YXNldC5tO1xuICBwb3ZCYXIucXVlcnlTZWxlY3RvckFsbCgnYnV0dG9uJykuZm9yRWFjaCh4ID0+IHguY2xhc3NMaXN0LnRvZ2dsZSgnb24nLCB4ID09PSBiKSk7XG4gIHNob3coKTtcbn0pO1xuXG4vLyAtLS0tLS0tLS0tIFBvbHkgSGF2ZW4gVGV4dHVyZW4gLS0tLS0tLS0tLVxuYXN5bmMgZnVuY3Rpb24gcG9seUhhdmVuKGFzc2V0TmFtZSwgcmVzKXtcbiAgY29uc3QgYWxsID0gYXdhaXQgKGF3YWl0IGZldGNoKCdodHRwczovL2FwaS5wb2x5aGF2ZW4uY29tL2Fzc2V0cz90PXRleHR1cmVzJykpLmpzb24oKTtcbiAgY29uc3Qgd2FudCA9IGFzc2V0TmFtZS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBpZCA9IChhbGxbd2FudF0gPyB3YW50IDogbnVsbCkgfHwgT2JqZWN0LmtleXMoYWxsKS5maW5kKGsgPT4gKGFsbFtrXS5uYW1lfHwnJykudG9Mb3dlckNhc2UoKSA9PT0gd2FudClcbiAgICAgICAgICB8fCBPYmplY3Qua2V5cyhhbGwpLmZpbmQoayA9PiAoYWxsW2tdLm5hbWV8fCcnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHdhbnQpKVxuICAgICAgICAgIHx8IHdhbnQucmVwbGFjZSgvXFxzKy9nLCdfJyk7XG4gIGNvbnN0IGZpbGVzID0gYXdhaXQgKGF3YWl0IGZldGNoKGBodHRwczovL2FwaS5wb2x5aGF2ZW4uY29tL2ZpbGVzLyR7aWR9YCkpLmpzb24oKTtcbiAgY29uc3QgcGljayA9IGtleSA9PiBmaWxlc1trZXldPy5bJzFrJ10/LmpwZz8udXJsIHx8IGZpbGVzW2tleV0/LlsnMWsnXT8ucG5nPy51cmw7XG4gIGNvbnN0IGRpbSA9IGFsbFtpZF0/LmRpbWVuc2lvbnM7IC8vIG1tIFt3LGhdXG4gIHJldHVybiB7IGlkLCBkaW0sIGRpZmY6IHBpY2soJ0RpZmZ1c2UnKSwgbm9yOiBwaWNrKCdub3JfZ2wnKSwgcm91Z2g6IHBpY2soJ1JvdWdoJykgfTtcbn1cbmNvbnN0IGxvYWRlciA9IG5ldyBUSFJFRS5UZXh0dXJlTG9hZGVyKCk7XG5sb2FkZXIuc2V0Q3Jvc3NPcmlnaW4oJ2Fub255bW91cycpO1xuY29uc3QgbG9hZFRleCA9ICh1cmwsIHNyZ2IpID0+IG5ldyBQcm9taXNlKChyZXMsIHJlaikgPT4gbG9hZGVyLmxvYWQodXJsLCB0ID0+IHtcbiAgdC53cmFwUyA9IHQud3JhcFQgPSBUSFJFRS5SZXBlYXRXcmFwcGluZztcbiAgaWYgKHNyZ2IpIHQuY29sb3JTcGFjZSA9IFRIUkVFLlNSR0JDb2xvclNwYWNlO1xuICB0LmFuaXNvdHJvcHkgPSA4OyByZXModCk7XG59LCB1bmRlZmluZWQsIHJlaikpO1xuYXN5bmMgZnVuY3Rpb24gYXBwbHkobWF0LCBhc3NldE5hbWUsIHV2U2NhbGUsIHJlcyl7XG4gIGNvbnN0IGYgPSBhd2FpdCBwb2x5SGF2ZW4oYXNzZXROYW1lLCByZXMpO1xuICBjb25zdCBbbWFwLCBub3JtYWxNYXAsIHJvdWdobmVzc01hcF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgbG9hZFRleChmLmRpZmYsIHRydWUpLCBmLm5vciA/IGxvYWRUZXgoZi5ub3IpIDogbnVsbCwgZi5yb3VnaCA/IGxvYWRUZXgoZi5yb3VnaCkgOiBudWxsXG4gIF0pO1xuICBpZiAodXZTY2FsZSl7IC8vIGVjaHRlIEdyw7bDn2U6IFVWcyBzaW5kIGluIDEvdXZTY2FsZSBtLCBUZXh0dXIgZGVja3QgZGltIG1tIGFiXG4gICAgY29uc3QgdyA9IChmLmRpbT8uWzBdIHx8IDIwMDApIC8gMTAwMCwgaGggPSAoZi5kaW0/LlsxXSB8fCBmLmRpbT8uWzBdIHx8IDIwMDApIC8gMTAwMDtcbiAgICBmb3IgKGNvbnN0IHQgb2YgW21hcCwgbm9ybWFsTWFwLCByb3VnaG5lc3NNYXBdKSBpZiAodCkgdC5yZXBlYXQuc2V0KHV2U2NhbGUgLyB3LCB1dlNjYWxlIC8gaGgpO1xuICB9XG4gIG1hdC5tYXAgPSBtYXA7IG1hdC5jb2xvci5zZXQoMHhmZmZmZmYpO1xuICBpZiAobm9ybWFsTWFwKSBtYXQubm9ybWFsTWFwID0gbm9ybWFsTWFwO1xuICBpZiAocm91Z2huZXNzTWFwKSB7IG1hdC5yb3VnaG5lc3NNYXAgPSByb3VnaG5lc3NNYXA7IG1hdC5yb3VnaG5lc3MgPSAxOyB9XG4gIG1hdC5uZWVkc1VwZGF0ZSA9IHRydWU7XG4gIHB0RGlydHkgPSB0cnVlOyBpZiAocHRPbikgc3RvcFBUKCk7XG4gIHJldHVybiBmLmlkO1xufVxuLy8gLS0tLS0tLS0tLSBUYWdlc3plaXQ6IHByb3plZHVyYWxlciBIaW1tZWwgKHRocmVlLmpzIFNreSwgUHJlZXRoYW0tTW9kZWxsKSAtLS0tLS0tLS0tXG5jb25zdCB7IFNreSB9ID0gYXdhaXQgaW1wb3J0KCd0aHJlZS9hZGRvbnMvb2JqZWN0cy9Ta3kuanMnKTtcbmNvbnN0IHNreSA9IG5ldyBTa3koKTsgc2t5LnNjYWxlLnNldFNjYWxhcigxMDAwKTtcbmNvbnN0IHNreVNjZW5lID0gbmV3IFRIUkVFLlNjZW5lKCk7IHNreVNjZW5lLmFkZChza3kpO1xuY29uc3QgU1UgPSBza3kubWF0ZXJpYWwudW5pZm9ybXM7XG5TVS5taWVDb2VmZmljaWVudC52YWx1ZSA9IDAuMDA1OyBTVS5taWVEaXJlY3Rpb25hbEcudmFsdWUgPSAwLjg7XG4vLyBOYWNodC0vRMOkbW1lcnVuZ3MtTWluaW11bTogZHVua2xlcyBCbGF1LCB6dW0gSG9yaXpvbnQgaGVsbGVyXG5za3kubWF0ZXJpYWwudW5pZm9ybXMubmlnaHRGbG9vciA9IHsgdmFsdWU6IG5ldyBUSFJFRS5Db2xvcigwLDAsMCkgfTtcbnNreS5tYXRlcmlhbC5mcmFnbWVudFNoYWRlciA9ICd1bmlmb3JtIHZlYzMgbmlnaHRGbG9vcjtcXG4nICsgc2t5Lm1hdGVyaWFsLmZyYWdtZW50U2hhZGVyLnJlcGxhY2UoJyNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD4nLFxuICAnZmxvYXQgaHpGID0gMS4wIC0gY2xhbXAobm9ybWFsaXplKHZXb3JsZFBvc2l0aW9uIC0gY2FtZXJhUG9zaXRpb24pLnksIDAuMCwgMS4wKTtcXG4gZ2xfRnJhZ0NvbG9yLnJnYiA9IG1heChnbF9GcmFnQ29sb3IucmdiLCBuaWdodEZsb29yICogKDAuNTUgKyAwLjkqaHpGKmh6RikpO1xcbiNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD4nKTtcbnNreS5tYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XG5jb25zdCBjdWJlUlQgPSBuZXcgVEhSRUUuV2ViR0xDdWJlUmVuZGVyVGFyZ2V0KDUxMiwgeyB0eXBlOiBUSFJFRS5IYWxmRmxvYXRUeXBlIH0pO1xuY29uc3QgY3ViZUNhbSA9IG5ldyBUSFJFRS5DdWJlQ2FtZXJhKDEsIDUwMDAsIGN1YmVSVCk7IHNreVNjZW5lLmFkZChjdWJlQ2FtKTtcbmNvbnN0IHBtcmVtID0gbmV3IFRIUkVFLlBNUkVNR2VuZXJhdG9yKHJlbmRlcmVyKTtcbmxldCBlbnZSVCA9IG51bGw7XG5jb25zdCBrZXlCYXNlID0ga2V5LmludGVuc2l0eSwgaGVtaUNvbDAgPSBoZW1pID8gaGVtaS5jb2xvci5jbG9uZSgpIDogbnVsbCwgaGVtaUduZDAgPSBoZW1pID8gaGVtaS5ncm91bmRDb2xvci5jbG9uZSgpIDogbnVsbDtcbmNvbnN0IFNTID0gVEhSRUUuTWF0aFV0aWxzLnNtb290aHN0ZXAsIGNvbCA9IChyLGcsYikgPT4gbmV3IFRIUkVFLkNvbG9yKHIsZyxiKTtcbmZ1bmN0aW9uIG1ha2VQVEVudihkLCBkYXksIGdvbGRlbil7XG4gIGNvbnN0IHcgPSAyNTYsIGggPSAxMjgsIGFyciA9IG5ldyBGbG9hdDMyQXJyYXkodypoKjQpO1xuICBjb25zdCB6ZW4gPSBjb2woLjAzLC4wNDUsLjEpLmxlcnAoY29sKC4xNiwuMzIsLjc1KSwgZGF5KTtcbiAgY29uc3QgaG9yID0gY29sKC4wNSwuMDcsLjEzKS5sZXJwKGNvbCguNzUsLjgyLC45MikubGVycChjb2woMSwuNTUsLjMpLCBnb2xkZW4qLjgpLCBkYXkpO1xuICBjb25zdCBnbmQgPSBob3IuY2xvbmUoKS5tdWx0aXBseVNjYWxhciguMjUpO1xuICBjb25zdCBzdW5DID0gY29sKDEsLjk1LC44NSkubGVycChjb2woMSwuNSwuMiksIGdvbGRlbikubXVsdGlwbHlTY2FsYXIoNDAqZGF5KTtcbiAgZm9yIChsZXQgaiA9IDA7IGogPCBoOyBqKyspe1xuICAgIGNvbnN0IGVsID0gKChqKy41KS9oIC0gLjUpKk1hdGguUEksIHN5ID0gTWF0aC5zaW4oZWwpLCBjeSA9IE1hdGguY29zKGVsKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHc7IGkrKyl7XG4gICAgICBjb25zdCBheiA9ICgoaSsuNSkvdyAtIC41KSoyKk1hdGguUEksIHggPSBNYXRoLmNvcyhheikqY3ksIHogPSBNYXRoLnNpbihheikqY3k7XG4gICAgICBsZXQgciwgZywgYmI7XG4gICAgICBpZiAoc3kgPj0gMCl7IGNvbnN0IHQgPSBNYXRoLnNxcnQoc3kpOyByID0gaG9yLnIrKHplbi5yLWhvci5yKSp0OyBnID0gaG9yLmcrKHplbi5nLWhvci5nKSp0OyBiYiA9IGhvci5iKyh6ZW4uYi1ob3IuYikqdDsgfVxuICAgICAgZWxzZSB7IGNvbnN0IHQgPSBNYXRoLm1pbigxLCAtc3kqNCk7IHIgPSBob3IucisoZ25kLnItaG9yLnIpKnQ7IGcgPSBob3IuZysoZ25kLmctaG9yLmcpKnQ7IGJiID0gaG9yLmIrKGduZC5iLWhvci5iKSp0OyB9XG4gICAgICBjb25zdCBkb3QgPSB4KmQueCArIHN5KmQueSArIHoqZC56O1xuICAgICAgaWYgKGRvdCA+IDApeyBjb25zdCBnbCA9IE1hdGgucG93KGRvdCwgNDgpKmRheSooMStnb2xkZW4pOyByICs9IGdsOyBnICs9IGdsKiguODUtLjMqZ29sZGVuKTsgYmIgKz0gZ2wqKC43LS40NSpnb2xkZW4pOyB9XG4gICAgICBpZiAoZG90ID4gLjk5OSAmJiBzeSA+IC0wLjAyKXsgciA9IHN1bkMucjsgZyA9IHN1bkMuZzsgYmIgPSBzdW5DLmI7IH1cbiAgICAgIGNvbnN0IGsgPSAoaip3ICsgaSkqNDsgYXJyW2tdID0gcjsgYXJyW2srMV0gPSBnOyBhcnJbaysyXSA9IGJiOyBhcnJbayszXSA9IDE7XG4gICAgfVxuICB9XG4gIGNvbnN0IGR0ID0gbmV3IFRIUkVFLkRhdGFUZXh0dXJlKGFyciwgdywgaCwgVEhSRUUuUkdCQUZvcm1hdCwgVEhSRUUuRmxvYXRUeXBlKTtcbiAgZHQubWFwcGluZyA9IFRIUkVFLkVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nO1xuICBkdC5taW5GaWx0ZXIgPSBkdC5tYWdGaWx0ZXIgPSBUSFJFRS5MaW5lYXJGaWx0ZXI7IGR0LmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlOyBkdC5uZWVkc1VwZGF0ZSA9IHRydWU7XG4gIHJldHVybiBkdDtcbn1cbmNvbnN0IHN1blYgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xuZnVuY3Rpb24gc2V0VGltZShocil7XG4gIC8vIFNvbm5lbmJhaG4gKHZlcmVpbmZhY2h0KTogNyBVaHIgT3N0ICgreCkg4oaSIDEzIFVociBTw7xkICgreikg4oaSIDE5IFVociBXZXN0LCBtYXguIDUwwrAgSMO2aGVcbiAgY29uc3QgcGhpID0gTWF0aC5QSSooaHIgLSA3KS8xMiwgZSA9IFRIUkVFLk1hdGhVdGlscy5kZWdUb1JhZCg1MCkqTWF0aC5zaW4ocGhpKTtcbiAgc3VuVi5zZXQoTWF0aC5jb3MocGhpKSpNYXRoLmNvcyhlKSwgTWF0aC5zaW4oZSksIE1hdGguc2luKHBoaSkqTWF0aC5jb3MoZSkpLm5vcm1hbGl6ZSgpO1xuICBjb25zdCBzID0gc3VuVi55LCBkYXkgPSBTUyhzLCAtMC4xNCwgMC4xOCksIGdvbGRlbiA9IDEgLSBTUyhzLCAwLCAwLjQpLCBkdXNrID0gU1MocywgLTAuMjIsIC0wLjAyKSAqICgxIC0gU1MocywgMC4wMiwgMC4yKSk7XG4gIFNVLnN1blBvc2l0aW9uLnZhbHVlLmNvcHkoc3VuVik7XG4gIFNVLnJheWxlaWdoLnZhbHVlID0gMi41ICsgMS4yKmdvbGRlbjtcbiAgU1UudHVyYmlkaXR5LnZhbHVlID0gMyArIDUqZ29sZGVuO1xuICAvLyBOYWNodGJsYXUsIHp1ciBibGF1ZW4gU3R1bmRlIGV0d2FzIGhlbGxlci92aW9sZXR0ZXJcbiAgU1UubmlnaHRGbG9vci52YWx1ZS5zZXRSR0IoMC4wMTAgKyAwLjAzKmR1c2ssIDAuMDE2ICsgMC4wMypkdXNrLCAwLjA0NSArIDAuMDYqZHVzayk7XG4gIGN1YmVDYW0udXBkYXRlKHJlbmRlcmVyLCBza3lTY2VuZSk7XG4gIGVudlJUID0gcG1yZW0uZnJvbUN1YmVtYXAoY3ViZVJULnRleHR1cmUsIGVudlJUKTtcbiAgcmFzdGVyRW52ID0gZW52UlQudGV4dHVyZTtcbiAgaWYgKHMgPiAtMC4wMyl7XG4gICAga2V5LnBvc2l0aW9uLmNvcHkoaGMpLmFkZFNjYWxlZFZlY3RvcihzdW5WLCAzMCk7XG4gICAga2V5LmNvbG9yLnNldCgweGZmOWE1MikubGVycChuZXcgVEhSRUUuQ29sb3IoMHhmZmYzZTIpLCBTUyhzLCAwLCAwLjUpKTtcbiAgICBrZXkuaW50ZW5zaXR5ID0ga2V5QmFzZSAqIDEuMyAqIE1hdGgubWF4KGRheSwgMC4xNSk7XG4gIH0gZWxzZSB7IC8vIE1vbmRsaWNodCwgZ2VnZW7DvGJlciBkZXIgU29ubmVcbiAgICBjb25zdCBtID0gbmV3IFRIUkVFLlZlY3RvcjMoLXN1blYueCwgTWF0aC5hYnMoc3VuVi55KSowLjggKyAwLjIsIC1zdW5WLnopLm5vcm1hbGl6ZSgpO1xuICAgIGtleS5wb3NpdGlvbi5jb3B5KGhjKS5hZGRTY2FsZWRWZWN0b3IobSwgMzApO1xuICAgIGtleS5jb2xvci5zZXQoMHg5ZmI0ZmYpOyBrZXkuaW50ZW5zaXR5ID0ga2V5QmFzZSAqIDAuMjU7XG4gIH1cbiAgZW52SyA9IDAuMiArIDAuMSpkYXkgKyAwLjE1KmR1c2s7IGhlbWlLID0gMC4zICsgMC40KmRheTsgZmlsbEsgPSAwLjEgKyAwLjUqZGF5OyBleHBLID0gMSAtIDAuNDUqZGF5O1xuICBpZiAoaGVtaSl7IGhlbWkuY29sb3IuY29weShoZW1pQ29sMCkubGVycChuZXcgVEhSRUUuQ29sb3IoMHgzNDQyNmUpLCAxIC0gZGF5KTsgaGVtaS5ncm91bmRDb2xvci5jb3B5KGhlbWlHbmQwKS5tdWx0aXBseVNjYWxhcigwLjMgKyAwLjcqZGF5KTsgfVxuICBwdEVudiA9IG1ha2VQVEVudihzdW5WLCBkYXksIGdvbGRlbik7XG4gIHNjZW5lLmJhY2tncm91bmQgPSBjdWJlUlQudGV4dHVyZTtcbiAgc2NlbmUuYmFja2dyb3VuZEludGVuc2l0eSA9IDAuMiArIDEuMSooMSAtIGRheSk7XG4gIGlmIChwdE9uKSBzdG9wUFQoKTsgZWxzZSB7IHNjZW5lLmVudmlyb25tZW50ID0gcmFzdGVyRW52OyBhcHBseUludGVyaW9yKGNlaWxNYXQub3BhY2l0eSk7IH1cbiAgYWN0KCk7XG59XG4vLyBIaW1tZWwgJiBMaWNodCBmb2xnZW4gZGVyIGVjaHRlbiBVaHJ6ZWl0XG5jb25zdCBub3dIID0gKCkgPT4geyBjb25zdCBuID0gbmV3IERhdGUoKTsgcmV0dXJuIG4uZ2V0SG91cnMoKSArIG4uZ2V0TWludXRlcygpLzYwOyB9O1xuc2V0VGltZShub3dIKCkpO1xuc2V0SW50ZXJ2YWwoKCkgPT4gc2V0VGltZShub3dIKCkpLCA2MDAwMCk7XG5sZXQgdGV4TXNnID0gJ1RleHR1cmVuIHdlcmRlbiBnZWxhZGVu4oCmJztcbmNvbnN0IHVwZCA9ICgpID0+IHN0YXR1c0VsLnRleHRDb250ZW50ID0gdGV4TXNnO1xudXBkKCk7XG5zb2ZhLk0uZmFicmljLmNvbG9yLnNldCgnIzNhM2EzYycpO1xuYXBwbHkoc29mYS5NLmZhYnJpYywgJ1BvbHkgV29vbCBIZXJyaW5nYm9uZScpLnRoZW4oKCkgPT4gc29mYS5NLmZhYnJpYy5jb2xvci5zZXQoJyMzYTNhM2MnKSkuY2F0Y2goZSA9PiBjb25zb2xlLndhcm4oZSkpO1xuUHJvbWlzZS5hbGwoW2FwcGx5KE0uZmxvb3IsICd3b29kX2Zsb29yJywgMS4wKSwgYXBwbHkoTS53YWxsLCAnV2hpdGUgU3R1Y2NvJyksIGFwcGx5KE0uYnJpY2ssICdCcmljayBXYWxsIDA0JywgMS41KSwgYXBwbHkoTS5jYXAsICdSb3VnaCBQbGFzdGVyIEJyaWNrIDA0JywgMS41KSwgYXBwbHkodGlsZU1hdCwgJ2ludGVyaW9yX3RpbGVzJywgMS4wLCAnMmsnKS50aGVuKGlkID0+IHtcbiAgICAvLyBudXIgUmVsaWVmL0dsYW56IGJlaGFsdGVuLCBGYXJiZSB3ZWnDnzsgUmFzdGVyIGFjaHNwYXJhbGxlbCBkcmVoZW4sIEZsaWVzZW4gaGFsYiBzbyBncm/Dn1xuICAgIHRpbGVNYXQubWFwID0gbnVsbDsgdGlsZU1hdC5jb2xvci5zZXQoMHhmM2YyZWUpO1xuICAgIC8vIFRleHR1cjogUmF1dGVucmFzdGVyLCAzIEZsaWVzZW4gamUgS2FjaGVsIOKGkiA0NcKwIGdlZHJlaHQgYWNoc3BhcmFsbGVsOyAxNS1jbS1GbGllc2VuLCBGdWdlbiBhdWYgMCw5MCAvIDEsNTAgbVxuICAgIGNvbnN0IFRJTEUgPSAwLjE1LCByZXAgPSAxIC8gKDMgKiBNYXRoLlNRUlQyICogVElMRSk7XG4gICAgZm9yIChjb25zdCB0IG9mIFt0aWxlTWF0Lm5vcm1hbE1hcCwgdGlsZU1hdC5yb3VnaG5lc3NNYXBdKSBpZiAodCl7IHQuY2VudGVyLnNldCgwLCAwKTsgdC5vZmZzZXQuc2V0KDAsIDApOyB0LnJvdGF0aW9uID0gTWF0aC5QSS80OyB0LnJlcGVhdC5zZXQocmVwLCByZXApOyB9XG4gICAgdGlsZU1hdC5uZWVkc1VwZGF0ZSA9IHRydWU7IHJldHVybiBpZDtcbiAgfSldKVxuICAudGhlbihpZHMgPT4geyB0ZXhNc2cgPSAnVGV4dHVyZW46ICcgKyBpZHMuam9pbignLCAnKTsgdXBkKCk7IH0pXG4gIC5jYXRjaChlID0+IHsgY29uc29sZS53YXJuKGUpOyB0ZXhNc2cgPSAnVGV4dHVyZW4gbmljaHQgZXJyZWljaGJhciDigJMgRmFyYi1GYWxsYmFjayc7IHVwZCgpOyB9KTtcblxuLy8gLS0tLS0tLS0tLSBGZXJuYmVkaWVudW5nIC0tLS0tLS0tLS1cbntcbiAgY29uc3QgJCA9IHMgPT4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzKTtcbiAgY29uc3Qga2V5cyA9IFtdO1xuICBbMSwyLDMsNCw1LDYsMF0uZm9yRWFjaChpID0+IHtcbiAgICBjb25zdCBiID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgYi5jbGFzc05hbWUgPSAnci1rZXknICsgKGkgPT09IDAgPyAnIHdpZGUnIDogJycpOyBiLnRleHRDb250ZW50ID0gUk9PTVNbaV1bMF07XG4gICAgYi5vbmNsaWNrID0gKCkgPT4geyBiYXIuY2hpbGRyZW5baV0uY2xpY2soKTsgc3luYygpOyB9O1xuICAgIGtleXMucHVzaChbaSwgYl0pOyAkKCcjclJvb21zJykuYXBwZW5kQ2hpbGQoYik7XG4gIH0pO1xuICBjb25zdCBMQU1QUyA9IHtcbiAgICBib2dlbjogeyBvbjogKCkgPT4gbGFtcE9uLCB0OiAoKSA9PiAkKCcjbGFtcFQnKS5jbGljaygpLCBjb2w6ICgpID0+IGxhbXBDb2wsIHN3OiBjb2xJbiB9LFxuICAgIGRvbnV0OiB7IG9uOiAoKSA9PiBkb251dEJ0bi5nZXRBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcpID09PSAndHJ1ZScsIHQ6ICgpID0+IGRvbnV0QnRuLmNsaWNrKCksIGNvbDogKCkgPT4gJyNmZjlhM2MnIH0sXG4gICAgdHJpcDogIHsgb246ICgpID0+IHRyaXBPbiwgdDogKCkgPT4gJCgnI3RyaXBUJykuY2xpY2soKSwgY29sOiAoKSA9PiB0cmlwQ29sLCBzdzogdHJpcENvbEluIH0sXG4gIH07XG4gIGxldCBtc2cgPSAnJztcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnItbGFtcCcpLmZvckVhY2gocm93ID0+IHtcbiAgICBjb25zdCBMID0gTEFNUFNbcm93LmRhdGFzZXQubF07XG4gICAgcm93LnF1ZXJ5U2VsZWN0b3IoJy5yLXRvZycpLm9uY2xpY2sgPSAoKSA9PiB7IG1zZyA9ICcnOyBMLnQoKTsgc3luYygpOyB9O1xuICAgIGNvbnN0IGMgPSByb3cucXVlcnlTZWxlY3RvcignLnItY29sJyk7IGlmIChjKSBjLm9uY2xpY2sgPSBlID0+IHsgZS5zdG9wUHJvcGFnYXRpb24oKTsgTC5zdy5jbGljaygpOyB9O1xuICB9KTtcbiAgY29uc3Qgc2V0QWxsID0gb24gPT4geyBPYmplY3QudmFsdWVzKExBTVBTKS5mb3JFYWNoKEwgPT4geyBpZiAoTC5vbigpICE9PSBvbikgTC50KCk7IH0pOyB9O1xuICBjb25zdCBjbG9zZVBpY2sgPSAoKSA9PiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcubHBpY2sub3BlbicpLmZvckVhY2gocCA9PiBwLnF1ZXJ5U2VsZWN0b3IoJy5scC1kb25lJykuY2xpY2soKSk7XG4gICQoJyNyQWxsT24nKS5vbmNsaWNrID0gKCkgPT4geyBtc2cgPSAnJzsgc2V0QWxsKHRydWUpOyBzeW5jKCk7IH07XG4gICQoJyNyQWxsT2ZmJykub25jbGljayA9ICgpID0+IHsgbXNnID0gJyc7IGNsb3NlUGljaygpOyBzZXRBbGwoZmFsc2UpOyBzeW5jKCk7IH07XG4gICQoJyNyUG93ZXInKS5vbmNsaWNrID0gKCkgPT4geyBjbG9zZVBpY2soKTsgc2V0QWxsKGZhbHNlKTsgYmFyLmNoaWxkcmVuWzBdLmNsaWNrKCk7IG1zZyA9ICdUc2Now7xzcyDigJMgYWxsZXMgYXVzJzsgc3luYygpOyB9O1xuICBmdW5jdGlvbiBzeW5jKCl7XG4gICAgY29uc3QgY3VyID0gWy4uLmJhci5jaGlsZHJlbl0uZmluZEluZGV4KGIgPT4gYi5jbGFzc0xpc3QuY29udGFpbnMoJ29uJykpO1xuICAgIGtleXMuZm9yRWFjaCgoW2ksIGJdKSA9PiBiLmNsYXNzTGlzdC50b2dnbGUoJ29uJywgaSA9PT0gY3VyKSk7XG4gICAgbGV0IG4gPSAwLCBzaG93biA9IDA7XG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnItbGFtcCcpLmZvckVhY2gocm93ID0+IHtcbiAgICAgIGNvbnN0IEwgPSBMQU1QU1tyb3cuZGF0YXNldC5sXSwgb24gPSBMLm9uKCksIGMgPSBMLmNvbCgpOyBpZiAob24pIG4rKztcbiAgICAgIHJvdy5jbGFzc0xpc3QudG9nZ2xlKCdvbicsIG9uKTtcbiAgICAgIGNvbnN0IHZpcyA9ICtyb3cuZGF0YXNldC5yb29tID09PSBjdXI7IHJvdy5zdHlsZS5kaXNwbGF5ID0gdmlzID8gJycgOiAnbm9uZSc7IGlmICh2aXMpIHNob3duKys7XG4gICAgICByb3cucXVlcnlTZWxlY3RvcignaScpLnN0eWxlLmNzc1RleHQgPSBvbiA/ICdiYWNrZ3JvdW5kOicgKyBjICsgJztib3gtc2hhZG93OjAgMCAxMHB4IDNweCAnICsgYyArICc5OScgOiAnJztcbiAgICAgIGNvbnN0IGNiID0gcm93LnF1ZXJ5U2VsZWN0b3IoJy5yLWNvbCcpOyBpZiAoY2IpIGNiLnN0eWxlLnNldFByb3BlcnR5KCctLWMnLCBjKTtcbiAgICB9KTtcbiAgICAkKCcjckxpZ2h0c0xibCcpLnN0eWxlLmRpc3BsYXkgPSAkKCcjckxpZ2h0cycpLnN0eWxlLmRpc3BsYXkgPSBzaG93biA/ICcnIDogJ25vbmUnO1xuICAgIGNvbnN0IHR2ID0gY3VyID09PSAxOyAkKCcjclR2TGJsJykuc3R5bGUuZGlzcGxheSA9ICQoJyNyVHYnKS5zdHlsZS5kaXNwbGF5ID0gdHYgPyAnJyA6ICdub25lJztcbiAgICAkKCcjclR2JykuY2xhc3NMaXN0LnRvZ2dsZSgnb24nLCAkKCcjdHZCJykuZ2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnKSA9PT0gJ3RydWUnKTtcbiAgICBpZiAobikgbXNnID0gJyc7XG4gICAgJCgnI3JTdGF0JykudGV4dENvbnRlbnQgPSBtc2cgfHwgKG4gPyBuICsgKG4gPT09IDEgPyAnIExpY2h0IGFuJyA6ICcgTGljaHRlciBhbicpIDogJ0FsbGUgTGljaHRlciBhdXMnKTtcbiAgfVxuICBjb25zdCB0dkIgPSAkKCcjdHZCJyksIHR2T24gPSAoKSA9PiB0dkIuZ2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnKSA9PT0gJ3RydWUnO1xuICAkKCcjclR2UG93Jykub25jbGljayA9ICgpID0+IHsgaWYgKHR2T24oKSkgJCgnI3R2T2ZmJykuY2xpY2soKTsgZWxzZSB0dkIuY2xpY2soKTsgc2V0VGltZW91dChzeW5jLCAwKTsgfTtcbiAgJCgnI3JUdk9wZW4nKS5vbmNsaWNrID0gKCkgPT4geyB0dkIuY2xpY2soKTsgc2V0VGltZW91dChzeW5jLCAwKTsgfTtcbiAgYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgKCkgPT4gc2V0VGltZW91dChzeW5jLCAwKSk7XG4gIGFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0Jywgc3luYyk7XG4gIGFkZEV2ZW50TGlzdGVuZXIoJ2xwaWNrJywgKCkgPT4gc2V0VGltZW91dChzeW5jLCAwKSk7XG4gIHN5bmMoKTtcbn1cbjxcdTAwMkZzY3JpcHQ+XG5cblxuPFx1MDAyRmJvZHk+PFx1MDAyRmh0bWw+IgogIDwvc2NyaXB0Pgo8L2JvZHk+CjwvaHRtbD4=";
|
|
var q = new URLSearchParams(location.search).get('v');
|
|
var mobile = q ? q === 'handy' : (matchMedia('(pointer:coarse)').matches && Math.min(screen.width, screen.height) < 820) || innerWidth < 700;
|
|
var bin = atob(mobile ? P : D), u = new Uint8Array(bin.length); for (var i = 0; i < bin.length; i++) u[i] = bin.charCodeAt(i);
|
|
var f = document.createElement('iframe'); f.allow = 'autoplay; fullscreen; xr-spatial-tracking'; f.setAttribute('allowfullscreen', '');
|
|
f.srcdoc = new TextDecoder().decode(u); document.body.appendChild(f);
|
|
f.onload = function(){ try { f.contentWindow.focus(); } catch(e){} };
|
|
})();
|
|
</script>
|
|
</body></html> |