Avatar
dev
ae5c6e0b74660d2194c8254b5c2c825676576be0297379fa20523114a6a85e87

hello. tags test with nostr-tool.

this is a backup of #nostrbot dev files created with bk.sh

echo "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" | base64 --decode > bk.7z && 7z x -ofiles bk.7z

shasum -a 256 bk.7z

6f2e1bf5a2eab2438e1015f405df576de5e04bcb0e550b807c5a4afb10c1466d

22.9 kB

this is a backup of #nostrbot dev files created with bk.sh echo "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" | base64 --decode > bk.7z && 7z x -ofiles bk.7z shasum -a 256 bk.7z 2b2930fb55b0e96fdc59fc5b46cbc831eb37d3ea0e6dbc959d3a57ed43b3c531 22.9 kB

this is a backup of #nostrbot dev files created with bk.sh

echo "N3q8ryccAAR5aG7FnVoAAAAAAAAkAAAAAAAAANAw+vfhVCRU710AFwvJZxoQAneqSzasFDIuicCCWnDPeUHH5XG8qXOWgh94YoCYYQFT8bT9KVFEtheoxvEBWPeZwl3GxdbH5OtI/fN6hFn5eZt8QI6y9hRkIZ2Q5RLv2Cvc97Qzclpr45sIWMzMwwtw/QvrTwNLdgWaxZQTCCyLjHihL6YFlw++JqtvAz9Il8JvIvVjjwO9VhRqJkJKZf3Vry+R6Mw8LeAntLgU5kj+5z1ufnirp/fsP1/5Keu15pcDnmRYvdQMz7qxWCfsDdaM1KIIFlzCjSuymAChtr6MAIRl96wxmJihcEebwtAW31Y6gdyYBhRsDkbip2P2FEepaWXPlnyYI7EFay10tDtPUxQEUZDQPecLDCzfDCOigAvGVfRTcOnTbcQqZEpFK3HDxwVQjBjnHFdebcX4Rp6W/kgikMO++WwNhCvWdvRTHTgNKx+JncWoNpKZbqCegmQo8hoTzDotgmwaDGD6gZa+mmZsSPJL4snYx2y5sCbcAGAYBHZ93E0vOEQfAv8NgH3WWO9waOIcW0QV1h8hshPbG4Y1N0qlrZ1tt+gFiEr7Q09TLlkNZpqiBfcnbbYkeV8b7AGzmLUAaEZmSNkK+7Pzf6RuIWURgonEg1pA4/3r2WtlVftYRr2eP4EnMTWu+8FtOUN7D2b01FHUBAO1oPUfFXi+4V9nH19Zc8INQT+YwJifToyzTXsuO0IsXjHjPn4+X/hYdTSmqsITEGLpKe7egvNxeEj5UKRrN2aNsiupUPHYDV+mKeU+a7hxW+QGdpSpKKdBBLKHjjx1PUUTppLzANLydx/gHgHluUPe9WxpCNHZuJ8EJ60P82/ozI0XAdh6njvrWDBybzOFDHrTFH/yiY+iYAEjlpTjyu1ESFYt9rebu4O2ve7Ng/3qqnecYIvCDSWT23n61jDYrze63AoGwykpD9Eb93ptkXURwjoc/OyptZawytdH7M++DV3t/B+gbCTn9Nr8gU8qyK8+IWOfKQPd2oNQBxn2iidI9ED2VTbUwtL/iu3XBXYECgcK0A7GUZLgKF+8r20/frAxi25cRYuAMMy2HblDiTHlG+HC+ifL+6cY0B7kUz4YbWG4ytlgL+epdSLcdyZzXeGJpIcmxOKNGdAym5br6UbSmw1gM93bGEtGNZ9IcTqQq9kIy9p+kpHCihLWvYJlQBBwW5xa0StT88iyQwg5AcftOdmX+Yry/t+cw2TCXGDuCh5wlkFVH0XzCSlxtqwa+xuoKGyQhCl3FDETPnW6AJ/JmsT+bSHEWfWZrjlrDduRjs0OgkaGC/uWQO1eaYwCEa1dH1QsRCU5I9rXYSY1lT9rqy907CpmKKx3nad7BIYdVvResWzXHXNw+gHip/QbIgRY8Ho9Vv1rCPldWpq+3NsDml7dmeGAiiKuVtATvarXj2ntYKDpzMFrDYB/IykSR4/XRnDlfRePWT3wEfjtU/yhvl/tiJCXV5NehEG7DwWLJVRi0NIk25PvgfiuYHWD+WjET3nxQn4mDm72w8L9OgcrMe5tPwU4g1cTuty6/h8KK5CKFcmKqw5b4KY4yZQ33DPu8o2DKvdWF15JajxUDaxvT30kMf8vNAz0PUSrrkAIsC2GxVH6lWmL9EZGBWaR5vpcKpLB6oo/QWcW0LKy4ahgtKmxdhl+08Pzug6TTULVgw9xEjRuzRdajKvZZgroTXcUxmrhXJdVsc5rGUnlNYj4XyC/s63PCzdfc1bvVnMa5lAS88asN/A073dPyt6RtKfJT9IuPHPpzg1VV9Ej3y6olEeDr2qC6Oiu51SNv8FAzYyHj7ok7Ype5H6r4MTy6vRsovtWK9p4D7qXN4PWOehrz1ODzUr7SCSYVUB86SOiS/CZ3InQeE/+MstJ6bQ74HuCN7mTTvQ0lN75zi0DqsEH6+UKtomm33vn0gQAvOFgz7bceLmWqP3AFkWOsCfxZZj79vHICxHo8WL+FifHbMCfKOzcf/7XRjqJdElw1iexXhXLUbgT+ixQzQeBPlhqTv6Eay5P1hQW6DgLQQ+YNDtBsMoyMzdQerMAvPnKTMcgKFNcQ+vRibGDZbpwuxR5vwxwksLwVBCfcpf2h1roskN1/8FDO3QjL8HMApK6/9Pq+1kTFPSD+kYsSRxDYqpTzmdQsPW8Rl8D4AbW6ePG03ZhHRvreFx3/3DlsffB61DwT7ZwejkTMaTTrBTTz62au4bvw/kyxRmN7ccnlnIi0uUbhsrhuxGDKmzRlAUQTvEJqBsiKF7nsAFa8s8i6TUTArLgc7sX17vt8p/4QYkLjluVM/tDXfJGyBx/+iWv3ocGxmIdPz2TO203+OhkYcfSBw+WzVLDls/TGVG9ZCxMt5rguUS/n9TKhJdOqODaXM/ZWSBbylDeWo7BGrQBnDS2CDRWqJDAQdSI9yKF8/yHqyynvX3Nl1zQkaRZo8spvHo02soenKp9veh9+Upxm4+CgyECH9KHPCNTyY93tWbLvU+nCKUHHyNuCSUPcAaumkGO+b/lZ1i+WwWHF39fmFYgTZL0N9w3z9QWWqeKaNcaBOsAh/g5VWq6eh9tu5+DU1RN7nzrHGN8WtQu6T+0dMy1EFb9iwA+Oy5IgdVEFKS6Y+MzlNBjk5V06eC4awZXQy7pkuU/vwq7t+vtlmT00NuhKSuIrmfgvinFxJDlJMeQ+nfulY7tIOLwyrZQtRglaLqTruILQXfMUry52pKjVazTNlYXmxSY1ujrFDlIXEDxJ2bE67mX2ufk9IYoJyMFU/NMarKHXxGRWL9u2Nx1V+rhg0xvtDrxTIbXzi+FzL7x/OKOrZbp4bEczVM3Q0PrhsePly2ug7A85knq+ulO1BKeqn/vkyT3njgg170O6YCOM0refUzIA9y4ksUAyzhVbwOC1p5hNsQQs5OgwkMyui+t5GM5nnP7a2o14mTJSWj5ZQJgWK6G5UW5s0pheDNKMyhsQ/++jvqWgBk6x395dJ3luA0kvxso1TbNKLO3WLjcFlgu23K5N4FA2sd3e5HTIA8o3QBiKumj3AsTAXxJzNelabv2Vqvk7c1ANZvhiJB1sgFBVQKRRlYjuSTPwpvQSe5azBOD0vSaOHU/WMFsTMeO0dM9/Bmcfjmp/4v8m9sWbH2sD4oadCFvqFRYBhipaTn3zye0m8R0KQiMht/C4ZCsuCWS5+eTQ9f40RMOX0mO+Sw6Fs1oy1QIE0PLdKUePi5XyXOQOPd0KMNFHtyri/+D+lDVRDV03B4u8hfhMHKt/RLS3V+BNwpxRZJZXFHc5L2qeh3nL6Ny6I84E/bPa0Q/vZ1tLcHYUimkfxmRy2k2MfUjFw1tEN1Gkuvfx7sBjSnPJWvUtc4s+IuDwmFMwY1/dzuIDiaRfrn4f+kupl4gvIzlD/SEOlz11sinzZiA4naMxpHzUep3ViaGfDr291NrcYUX0aDXsPEFBF+0vofxWqOPh7LPA4rUoRkdXP9NGDmff/0INqCCfM+KGgo3KPHGbsuhihSuegRfukJk5W/Xp02Ti0RB8LRfGzuWn4I1Cb9vXYkYfp8+C2d5D2H9xl0gFkxOC9tbxSqcAw20AVXEo4zNOdz9zFdSdMl5ujFz2OAgzGpQ2ADCq+nAl1GScsRLBQv7uP7Y2n5jxAW5vn9Y6hZiA7ECylkMAsfI9sFQt6bdWj0JEXr1yZ28GQY07qgEOFGmdG5m8K94X2bFNDfb9IjqX92ElKUr4Z9wOssVfysr5mgmPOhySSBziqwK4ONg+D66uPPr591LVd04tYnKLMy75A5kgKyUoaFdr0R5anqrWyaim17uP/OoECx1x0mu2P7R27jBWxL4l/dZ2Jg2kWDp+Rw48/7d7gqOUpELEEgy5uMrMc/s5UDzJwMnUgxGlTRRKCDOU4f6qgZkBQV9skhTqhQzYNYbR2wD/g55PwDcsfbDnwIqzUwIFvkYSFB0WZVIVtvzT5b6o15q5ol0c1c3Tcs5dyJMLFGzf5c9FSQlZgiS28pYbxnTatOprFDXUYYCQGdOaC0TfdN3y8Hcuur9oIF+DWlTWE6io4A5efYaTDb2nTHHOD6N540L8W9IxYtK4j07ILvAWvaPLPn6arErWm1Y9aGcGRLJ/vrT6iXZi5Wx4mu1+K1NQlUyIPB3sFcQHWnAhJdmeeJqt/Qiwtu1QyhL2MgfyfU3LDlKC6IPBYolMTXHRkvnx0uKxgxooTMWUBmbg4T0DF2Oj7DMWwvqh4fiXCaXoa0DZ8FhYFTQMxKmaD+iUofvw+nFyadvweMop4ZzeBYYoyaxMe03FELDOf8pWtLUY9NtELVB9ni8UZmm7NIeHDA2wmW3ENTR2niOFfNdkh4rNiHpjfFSKKnzxOdGh4K58ldDY26pbgmKpXrCn68oLRn8kuDWZnDqS35wiveyhbZYCnC7TRI+coj89hzeDVH/mfPWTn6ErjfqKUgSejQOtnBjrnyemkEACkv3m/W6VYOgXE3qglOmhMSuSFuNtV291uTlV2ORYzi3pCnzT6aQeaZ07iXJTxFsOMdJhU1iBFcmJlyvcAdhga079Q7wTKjecrLf0TYRNtUibztjVu2js8S8mjSlxishB+zVeMiAu0zWwYvHmAT1jBt/hWcIyrR0RHRQ500m+z5mSreqCE6wy3QBa43JetXYY0Lj75mwgB5hxcAn6LBqp62S5D6ID4zF1K0a3uWY77CLExnj7tXjwaPkRPx2UH7IwxfzT1Dn63shqP7dpSvDn2WiBWVvQRnqgLlq/yEnoS1rppH37qqu+OR4W73d8gwhec40x6GVcBWHNCA3312Dh3FITG2kwjN+MQVUAF7pdQmVmjh0jnetRXMHt6oYZnAnD52rxaDw07NBZrUU1tFr53wP+vMGhRB7Ig1e18CsfLFtfS12R/6v/j/J2dXqktfhkOKYGQxA/MdcG9e5n2pBoBsXCF/7C2RzHZ+KXFFSpFeaxdPJNINYmo9ZLTKJQLImKs2MKdib3aEqHmVzByf4Qof53AFmbXpydAkBdLRuLcqKu7D81HlKjwqr5k86F+lNJTlYz7e2IgWcIzleJrEYJCqFTjI0kNtnJ+AXpEQmIcJw4gmiwn5v8/QVzdGAE0O5NuGhAl+Y8UZhJpYZw5OL5endzq1ODqqRBVEtdUtgswEslHAQV6Sk8AThMjYNiV+Xj7xizpDhoz4LVlbC/1QypSis/p9Nbsdw9qNvwlYQ7IL7L8bLCanvAkG9ZMRu/QiZsAMYbZsbJWksaxRuvthLuohIh6f6rAHb9Y7042c+F4RAIl+Lbj3zxH2Amf20i0fqxb7MMWjQddTosyQLQihZP40nvBNcKE4KW9elqe0WC2oPjo+LUj32xwnUl6SpzvW8nebZPxGim7IM8DGcRvRoJKGn9H/0//6ZXetcRROLSYhh15Ecm5uagas2En+TEVUH5XnQumQ/3UM2W5jCZKUImc7F69fHU9Cq1wBbSGvHKlA2SpJtfoq/cCb2vK5fg0d+RwNtBazltMzm/7dGQpyi43q1afsC0IOx93YRmb3LOBxdAS2p3k4W2lew6OjlcQn4n+PoOcV6c6YS7/OOquy3jZFu19PgEMTcy+qwpgLGw28C2Rv2nvVo5YJE8W809n4PmIXOatga5dqm/A6elBHRtMhUe8JjgwZhi/f81+Yts4oeQR7LoPOMBEEBkgHuWWbXLpegQ0QtxPTSAptnPFljB+1NtUQBmkXzCrXEY4LGjGl5Pe18JvVnXViPhE8/0ymJPtupuOPAjPYu/oOQsOOBasd7pXTZ1QbrPkF3OBc872JPz8kUmG0akpJoTlf4QaghYPJzMwZ2P/YwXmtX+tX1/dQAgHLwNEXNGcFMA0lE4MBr01riDT529MpNc9N7RSrNxqQRKGuvE0/S2JwB6iNsPoR1pct+fPSJdOpNoD4WaymS+6fvWqBu8qlKUjfs2k1lRupaE9dqBgxSvgn7jAbl1xeIyPaKYTBoQJJIPUyAtZwouI7tC/4B2n7aIWhiJB7ZLKY52GogqRy/K2YJ6Qc8kFBmJEhsSNoEUSTYTwbHznjdNju/3pdrRttjFkhjsfGYcfcrQ09z6Ku6SgHMlrO5n03tpjiH72uNulx8CeBau5M2Z3gRNwrAJC++kQmwBTZCQBuv03oJkP13rUMWhDbL1RFiwhG3S5n8Q5sF+hGbShVnjGIpQ6G8KM31xhHoXilU6HEYKwaGrG9WkOHoww2VUUdmKyYndH/m7V7hNgmezZzd8N7IfOyFpDwtE6FyB8N4M6lfYLv33Rr7dClNRAMXoRQsHnacJaBW9Iiu6CuSylhdwGY+1otw+5chCEMwA96ZxUMqhS4l8wZjA98X2b6C1UURkiwogPRB9duCmUXXzK9KXs5LdYHLOAHKtUIJlXAEaELpdYJRlPcWYkyzI734FIRQ4+uBsLTUCwBcyTDamV0CDt1ev3p2WMIrhgm4NDcwjV8BFOkH4J1ZWu+Yyuss64Sryt/+iYiED2pwO8vw6gmqHD6utZEzJWcT8RW7qhi3Z2WSRxj1Dsu6HY08/a+LAk/UaOgK2rgRPSGJcrGJUEplX6A6X6C5WCj4IuTUaBSroD4x54aVYRMjv3HLNxxebYS1S9pEtWnyQyHbqxmdtSgUO0qhZeo+LSi9PGCybRnlx7KH3I91+8PFgpTcR6bXqwH7XAy2ccUJtPIj/qMxWpl2jJSrArAMsMw+21uj+shTzm+RB7adO/VMmPC990AG6foQvQ6CYAEGEH398TLKVzoAswLTnThXyyVjBacSSCxyePO2A/2Lu+Q3RtP9VCq3hg+JhpvcElIKlQNCmf6NFNAsubp1+xCkol5Yvisnr6dSQRCPpa5jj1z0ThIFOooMvvongmK1sq25KSw3Z8WLM/AN+7hMctOq8UQHxHhXyeCdAeGv/JTJDomD3UbY70iNr0sJpBk0bg59n7wj6hbYueHEZ9eFP2vKBtWZrB/vFJaKZ6PfDMKI47NC0nfRyUiBWO6v5qTtvvzd+UTnYLDTMM+4bsOA3toZBPEl6nrfFxkKba+TJls8t4d/j3Q7+Q9RKyxHNiWaiFNT8v6ThaWcqo7G2pc2lVV9wqcAm5tXmzqXoalNOInU8Z5U36pdW7wDb3Q4MvS3CSxo2ETcWn9E7BAoJvwD8DH0j9Y8oBQxvdkmmqQrzyGsRQlfTyOQlzGM7codRSr0orw03uUJnpSZ/QlFW7lckXvlUBn38VOuaUByHjYZFO37rtV2OeeQ2GYZICMQw4evGHDe5AwrWlLhWA7gJiW+pgOPkx024/+VkiNFClMPG/vnxGTws3MKibodgfr0TCOXWP1Fdd+zkVqW7S4ZHRzQfYksnfthD8x5Ft/vWbsbU4om+FcA/TeLkDaD0tp8ANZ+WX5GiSbn1hIBY2T9h4oi6V96TTE/dJrxKaAPYAL3wyzU3SZe6p1Ird4/Kwggh51HUXoBaDabLXkAGT0bL/GAvH5K8QLU3GViSlEam/2PdzkX1j3CiV4xwMk6LO9ySmjvu0xtk+ORqegXooN9FCkqFIi6QAXSB+vx7O+XH44L+gPtzpJNRmL1MXCE+ricMbTHB4lYnA+YSwcFIx5rFQWDmHp4fWelE+G9L3nkyUfIJVZj8sJzwKpvlzjbkNLEjEGthqODxu/FgSAPjD6zEBXC8QeG5ekatnzWrxJMp+29EmtalUlPUN0Fa5UWpVE4QgD6kgvPPYs2a+RsP6cImEhBB8OlI5HbK8nReyWqL4w3APrb/WrD00PYMjB/pRTsyUQg+7wqDR5SG+8hRrHEFJk+vMxATU5Fl/B4nRehkjfCE1Tu1ZsRmGmaMSlsKsXxP+Azo59V/JBESLqEszpyoexdnAWBeEmS+1w+yIM89nIOYT4j9kLM3H43nDuJrA0c1cMYATO3ON4bZ2tsAMzKxHuX/wT9NfbCcLoNKLrn+pKev1aC/CSaE2/YIvMq7Bvu3xlUOUN8kVJbQEuFSqb7+0dStcaWS9cVPh4MYb5jApTobZKCkS5VB9Co5kKnQuYKB8B+dCdmA45vBT3TUFzMyQIGQYF9VpZyb5f+7GaVZmDjA7bk121VYTwprtooGcWEEEqp67pW4KfbNPAqdjv0DLGNjUmW9EXxUImj8MyccLTz7QVTi2pA0SeWlHHIygvxpivltlRhxVsFGi6A6W+LXjU/4ifatCoTl/9mE0IDfs5CKaidckxNswH2TXwk8fu7kmdk/UCgwx/4GdejGO9bZnsvMK5drTs6A56BeJFH6rNqcxoaqKtcITvASKcRsDVqkS3WpyiU0gjKmYcY2N00+swZ1le5MHpcSxvBzxwnzecQBnxVa/ioIQ5Hj0zIKsWdqX3Rr0Emu2xZte/DNloXbQSf13vQBoX5Fudm3gvUdeN43AUtlNivQuI6bTv0f6TYE18Qq+w0TKx/wB0k8PTzIailc0vXSNa3fMqc2hEVoD4qOPUfk5hAzxVfkwXnqidiNxr8s0o/V+oc/04Flr8eHl4aqM2Gm/rtR2cXPgCJQWot1qFAN6wAH5lUvs6v9WhhwAvWlYh6Mq7CTii9K6CXS02t73hWCkozN6Os4ELXPibq0PX+stmXvLuIEcrIlNCULKx3WfGUFie3UMT+vxZ46D1lqcpwbKJlQEfq3AjH/5cX3DwfTT4ZQ9FAd+QWfoMzGe+a56rmNwms6oioxYWKsx/EAYoqrInoqpH0XL9kWpgOi0BE966SjIH0WK1SCAECtVkLpBfdBu+Og9zRNfZ2JQzoL2SESwdtwZUoklh1XaPExIjHk8VPchU+hHcgRGCjiiHDb+6I8UX2NbWwcHMh+Pb5xhyyCdyO/0HtkNEXKnQUpOTAx4n+f0I1EEhlI2B9rwaPTb+hVEAIzMgRG4sPnfsCNi6QnNNFgsCjjQlML/3xg0SDCWgKSAn9CbDr1j3PN2K/ZPnAVuhASOhj1Cun9WpjHynfBsa8o9OsUk99wGqmlhCVmrVPCm6wdUuY16bsfP3poXfXDChhcWTvun/JKDIzvkpb0uLFQXj2Fq2SPoo6aEktkZUel/Xl0Rg6qryjir1iAhnl+K5Q+uCIqH+zdf5UoKXq20qGEBa1njlJihUh9Ks3dFGyw1iNM20bUcxmog0Vd0WlUT29K+ok3yNl4DphcYR6GsmnTFixzIJ2Lr/ALa6AHR72n4LhlZNxXLTWxTR8g1Agj5fNQrPYaNYMO7ZFLOJzH5WYM+/v9veEeyM2IE6I7Ki+QxO+ked2L4aZA91ixMX6CRXIhiW8NrgH3lKFQPablNPZoGvBYeTonxsVw2Obn6uiwPEjIM6fZF2Y+LnAVS3hEestOz5luWCJz1D1nJmdQ5nt0Je+/6Zbc3xshPWJO5DmajM0JGrvv/EYdAD6qgXE76PrJWwghNGp7HDzqGKH2hag8qSJvr/ZsFHK98qjTLkf04u8YZaybSqwa7W+ddklftjtokhD11Hl5RYFUeuZ0/zdINruANuaKlnxJxdC57SlN3PVK9/tkJwsoX7qougWR3n52EZ+4HfJYwYOUs7dNfxju8zKiSuamVAyYYL73cCmoqrEi9S3CHOXlqfApb4wAfI6onu00k0VBQ65DZ9y5MX/4t1eNGhGilIsH4Pk0Xi4iEbcN/Ozug8jqTmcKmxrVIyodA++V68ewFKPm1vUfz6i7hJY34m6enkedlOUIqmAY6R/EQ1yG0FNFmnl80lkbSQ9LG9NXjWDBxJLAiBamnHfcPMJAXanRzZE9XFUJTWSl9xeqaIBcacW4O1mQnD6AIlHevsWlPDkpsgJ/NEPQ3HwvjRu25J0rdUto6onEK94SVSp4q9iB8Z9Yqw2sJVARxsUnCq02d+YSv1SrWwZ7LhL91K6Zsbz+L/vUH4n6V+FQXRuO0WETNepRKCHIGjtqTRbX/12Jgg8kT+akAoF+VkJoK7Fq8q/t5Kg78ICKFT0NqzGpVe0i0WhT0QKBzDzawv06WrJq6tOMmVQolnQD9WFyNGCVe2vY4jYBpONGkBjtDsP/VWvefbgQLLS6CJhaQd55HOdkiXKUAPA1J+5IAt2GBjRGhZPDP4WkoD1cF0bbw1Wl3AfSoQosJy5Z7ZKP+Q41aDnNTwk5QnmGWeTY23psoAGVI6M3RvXWALzx+kbUOYOwhSNgoskgNHljjxek3iG8cjxX059L9PyxS5GvnU38Oi7Tw1X8/31cxx5qY+uKqCFa0Ldp/LwYE56sd81iAl1JGVLYIJZtYTNybtbH+aRr2WSb9owdh7Q96Poa15hkGwcMzrNg7UDyRwIWfoUXW0CESFawaKMSM8mPod1TZ7mCMaXRu5EezyQNTpPhbLJzVg8i6c5QZ/rsFgo6woVr4oFftIgBAvAcdj+bx6oDeecDDxQa8plC/5Go+4yDkpNIsdNfOuP+ISvzXBB/UtWPWA4IvJhnhBqvHEC9crZHoIMRSTO0OMPGfXwdeWKUv74i+ViJzBxBoh/VH4opKYjDeBmeoKWKo8Q7Np0RZZOaI7qqhwlQ/W+LofKK74J71dtZ2l2q22dPxipDF0RD2WLViYElImleWIwJcaTuqONNIdI/8O+CcQew/7LDNOT5mU2uxSHVK9mWzLOMcKk36VhFI1veZJ4C7rbNDngniQCMZeDQylJzG55vrwWPf2ndEsRRrBVtIZKS0beG9RrlnrB+JmcsrsV11AdRVg9YaY6D4+pWb5AjS+kRgohLtKjIbNGHVDr8y1fdD2eTAWbKlp7/pJVdKLPXkeaOjTEvORxuXEL8Bb+Arr2Saf1UaZ1oGV/5BEwSLIvxNanpWHjMkspU7mI413wm4S6ISoESzXiafu6D1J3YD6PTrkloUCnwYbgWJ/rTm6ll+MKSdtI8xN4X+1kq38GDs4q9Fpzzjm1bjLRsSxWxxXGLz6WsmwlrIC+cq74omrU8aUmIB1zFHgXfIxnyvmhSZo7U6UIsvsURqGKcRd4sAl9MgmLGMMRFaxxK/oofP7ijpDsuGQX0jUN8lMIYq3GgLYvKUro2fa5asAwTF0sS7KSMHYheJUX43p+bCAoJA4Qa1b1SSALBlw9QrP8NDuApoNvF1Aq2QPeKqyLEIsqxoJzmmw2efflZrrh6ah05oVxgsnogDT2Sk/6lei+nMSPQhiOECvu9xZH064xjqfTU+lUA78gBBOt7gYmquoOkE9KCzpp/nL1+hKiPGEciskXsxW5B0UgB9bw6y8BddbSLnaF2ZP63gYUqMnPBtPimU32UbLSDtb8NwGUa1QdaVL0EYVo3doJbPoQJC2yAQcOP3c6sqTSA25K2VHeK5t3WUisITy1tSl8NoEAFfAKcGtlAbmwkyk7R/nVj5MVM0uQyI8H0xThClZufj5tBC5i/dmFd8X+joehVFlxaGdUWm9BdqbNcDr7QpNnNiF3tpMuNqwoUxv8vMSo1ZlLy4o6gwY52ahWj3D3CVHiqkImfwZKSiHDlQJ7gJ/D1uhR6GEXteMQIejdmnSgOkCvE4vR2SWEXoKqJnRpQI57s/yHIo1Rz2wWC/+vZpfaoUhZidlRtRFis/BdBgued0+uiJxp1DD+tB4HLebRPONyb4IFHw/fjir/0PPzA4v4ArJvCctFkySYdkzU9zagZRYHXtlKOB0/6yTZtvaqfw0O+jMA7IqGaEN5yuoyRNHp45emHLhG9wRFkTSh1Tx7I+iFXqOogH7QvOfhG9pHY3wCagT8POC6JwzTEg/NL1gIzB5Xol/4FOoMMMbdI+iOftq94qsalCJnz2imTgnFn+ANe13ij+FQ+6RAtvhxwevhYrgDgKVH5oHPhcvTOLWLDsMsoU4aNu7AMRNkOBRu/AaWQNYywECvW/H8JinFNNwghk5LYjKLZ1+vAmzUn2hneGSCsrQ6hOqmdnVl+T+nMzAD3AIyqpNWziQgeGX7kkr31zAtZuVJpqQtVoM6WEkDeEOh8aTeZRPPPY8qVJzPgz881LoZG8F9gNspPfAt6v0F1uugK7EkNlc80mjQcDr0AJ4qnArnW9tvmVbELHs4h/1F5eMKV/C90K7p/8PE0UZLfEBg0qmtM3985DSH9MPuJo1U64Gk/nqomKtYQYRLvP1eg363SIds1STenRvwn7oUhPfq1GgrifxU4xnmUddRygIpObpFulCr19AY0KrmFi4tLgW9SKu96mRKo3GCHK2C98DQIt1O50Slbb2l/i9EremR8isypish32EwyqJjr21a2zHHmFdCh/PGsL3vGIzvtuuAYaEZKCWcSHftWfEqnC+ijyaPQSsjvLDox0t1V1tHgW5iPBXVrA2SSD+w235S7tovPMLA7/IPKderWUSDJh10lq0/jt9Zg87RNs8nf73hvgSd7Y0hErx05w/cv/OSSavye4rkuuOdhpVdEwvFHOVy7oXXyF8SxC6FkmE8G/S1R3aS0z2pOfHeD6jcDY3iXVA0j3xPAj+b5MZq/jWwZEUdVqdIjwnT9tH+L7t+tsrb7ZpyCarOFGMuW1n8yNjskPs13SFHvEVI1F994MObCNxiCnhiCeR5/xZ7qmV9nxQY8/cHQng99u9DO7WS9HH0RWpft3eurcijRddFLYBpFneHoP4rKOSLeD5SPzqPQEp42BwGd9HTXQ/rzhqne6L/0XbsB+lWyJA5NuhePlQjpn0jCAjrlEngPIEBhIly9hEjfd4zoXrkAN9ceyts24j2ATrV6Ckt7QUyKB2QjpnmpDDwcfz+wvTFJv4Ku2QsKo4poUkClvOe+k8eRMF0FAgibGlUpkQEVGVKhaQ7GNOlDUxlhikqViCEvhvCLiWh0EnLZhqkP8w0qTjMxNtj8HTy+Zk6pUOJi8ES31ahZxL4yfG7NKHkGPrkFEkNHp+ccDzTuKLPMX0WuLMDJqW4wUOcU58F58fK1nfPAlv7iDzhdWYw2dL0LPTzrldCDlECDqJtZRdSj1IHW3MZ9aHLJPKHHz4A2AKE7ILgXOE5dzdIkctwjKQXuMWr8Z9QpkuZ2cMhVIxD1yFCyyh4ZL8cxxEAtFSixXigZD48mq1v0Fsa+Bk34vyiAq0qMsqXbYXZXW+HtnQ2HQv77ZSLRpnrmM2S5ZdW9glcqIBzg+DDXBF69omN5ZmsbCjDVu+/4A51BM9uD3hs6WW+a2bvoaZQJMyGJ6fPBUrK1lst7KWCgyDDVewqNUuiXNaA1ovzvhYVxWlmkzrmOhjCZsPKo2J5mM4ioHA182OyF2k+o6FoEhz0v+T4qx+5gdUY31ZGGWhOvNPVHa5uC1xrm5LcIbQxsO0nyx0AcU+vQFp7zPTUfAm6L6yWunCwkz67yWuvCpX4bx8sK3rI6TdXbIOWtema5HRLgca5rrUA+qCZ5pqm8NXeLCzfIvrwfvQf3qCE5TnjmXQ4QBVJn/l76f1McFSx1gc1ShN/ZiYt7U8otVw7LwhSdNOt40en9k7QbNIwTYRlt2Pqf+Ys0h8DfHz17LQOfRjs+CEmhTi/CnZ4e/d8OPUy0gCRYRN09E8oxiDqNMZJrL1mF4CWP/FANtbVnavYY7bpixW+JK+XfAYGW5IYukGRDsiiIF3Tl63PsWMHR3VYE+H3gd8JzjUAETbbWyJL4M8m1gWrHzdBj1X4EfRoUKM7HklVJCF6AjbtkPpBog4wccxm5g+CnVr8VvX7zi19TwoB9AtFSUIMskgDhj7GMqD7ELho5Sm+Z1nVx96CCILgLIrfX13zeOvMAC1C4sg3CKJ1DOI0v9fMmQUsJwxQ8iOq5sGz8rEzBw1KYCNrWKyWI+TJa5/g69hZ0e+zSYyfPPMaSzkbJjW7TRUXsMeIErV7dTTqyLps8nJ+XUyGFrhUJZcBnFdavEGR0PbDcue823YNkU1PRb6+YOPTcbJFe4QtpwjUxpLkf2snq+Mu0p0/f51aG0DkRehyS3D4kElHtQynC+dHDDL5JxVFzAh5z2fPEmjNwrYlAyi3yvW0u7JwBqlzO9hd7RDfMf1MVRaMi8bUtgK1mP+KrWNlBAbm24YNlJsCxlAsNQiAIgHFqOJKprYI0IU5DJ/tnyCQBaaKlhTIaQi62k1DmMItfpds4k68JGFTf2HsU3GP/5L/GgNOErmGzeR3cwkH6HzUQoe5lLzpX/ngdkCBS0qUpFEEmkoLQitrUiWHZW2AjRyGtJb/x83IASfGyv/5eEKgvohNzWF3k35BnFB5Ez/ovvm+PtjyIsAHnpQIOAtBzeQ5KXh880KxiQBzrEouBl63RnI2bXlUVSVWq9RyKqR0nv9+FsZbguoKLv13B1LTVxaRGmUjgwRFkbmfWPdHrIq/GufwZFP+BZ5DS9J/2XKmcdLjnwyQbyjGWhE6JR6KehNqAfR1N3n7EXFKyLmBwKrrxbHArlWgjBklBGQRqCKaagWM2NK8fp0eN5FYcVuAncHJFcQMMOby93EHxsEFTfJ5gNXymuDaHU4ktz8e5M+CrU/xPlg2vYzVHOH/ukskU+pT86Z1tuQpQXE3fzt+dQYqPu5g/OEDBAv6t70/H3qq0X8E8eyd7M4pU3O9fS8qPljrin3IcbWSE1pNImsapZutW1p1EcxjQsRcHcsmt9rThIQnK+qTow6NYOY2Gy2m0oe1yRVyWmMQ6AuZjdtgs6EMkWTLOA/o38BhueRKbdU7gJAYGLou7ASdR6ksUfai+svjA0bvq+X4NhMVy0mU4rlHj8S/K5YHwRsIYXWJXWfaQggEFnGwzRuQoFEpSFHk1RQC3w2GANxDllGB26D4Iu0JeWhtuA684+abySy6C2fyiWKskd2Zme/wkPvzcj2mYQaDLGUguo7mMxL/gIYzQd3LrEhPLYfCojVvkVsTePpNSXlvtpQScnD12MMqVXEuKsyG9LnsKX9QoznR2KGHA4rC004fUN8YAmoyqlsewB5pQDSNsw2aoO8XgnDqWAu3aTMmUFFo/LzGneJ7Z7wXAEg1QwstorVIpXbXOPIz/xWRNOaPEN0XDCfBcqo5cFEXRkcBY+1oPJnrKER9KKLQXdRU1W064s8mLred3R1UlRIK6hZ4NH2MUDA0Q0TT3p7u+dxHsJyI3hA2/sViUN/lJIp7siT9DllilOAH/+785uHb8efwR49+/lmKk0qU/HdUtUJdXlMKPNRblr1K7vhhAeJ0pHW6UzhlfvjTAl05wHkln1yGlRDUjvlAqwU4i1aN3Obxoib1w6KkqO1s+jh3Sul3MPUrkmDuo5a8eZaba9WVLAeDJbWIU0/vEyzCHt/phReFdw4qIYdnlHFBZk+UFToQcq0Hb4MekIiDO/H2MacA50K09XQ5VhEaeI94oB5LkmTHZqNpwWARbrByx+x/B89whqiGHsP5k5W4QR1Jeq7syyDxfKsfFHaVf6iEzhnUXNeaYZmVNuTRbzh4fdq5w6Ac5/YbmtXx90ySghEHAshTTpCrFGEA2RKQDPgAzb41fBWiienvvGnu7Z/v04o/ENt/yWjsU8SUr97ti+f2VoHMRlL3o7I5tFYdKeZXxpigG8h5nAHZzW3igGbWjnM9UqIrxs9QnsvI2sevJ14dLB3I2cvfHSvovdtPZwNlMsHYICJA/ybCEA7Qf3qfFCb+XxhSNNFvgtNAZwZXR2mK9cJrYIlUlxMakVQscvj8DqZv/7DsLQE+4NmKLwX/HsSTPKA0ybhBiUPOkPBR1xHTMwdIAkc2Lfc7c2y4Cx+24USQmiO7XjLWT7/5xBY5LcGqma1L1x8Xrm7UH8IhDqzSu4WSkiRtv8v8TPnRgbEYVZpMI3W6ZyVZKXIUDyK2F/85VfXu6fzy0jsr5sON/YnqnUBHOWmCagBk8GqdDWfoFC54mj96pMEQ8BK1v1fgCWlpfFZZQbNTyRyl04VrZZHfJY80yPa2pbQ9Q7cMqR2BYs3RCD3oAfAiU9OBNCrng4BHeX0RM0RApc4ZlO+kfDi+k7VcEal0naVk4JCbp52U0spftykn2V4J7wDS6HWlCcL2EN0fQSAk2UXLHWT8Rgzj0XiIGtNq+m4j417F5HHS5ViSwWtdeZxQNGTvTJU9/PnBLGA9M5wwqWs3jYWWvn4R5lioiMKVYsQshMDe1ZnIM/W6lkezY5ajfwCD2fazXYpJdRZUTVqTblxRefo7T6yBMYzBoCmKURi9isS3A0Y6Pr1l1AQ92fChMxzyWmtWLfD1CBax6tNlRzc26+J6nnNNtFFxbnPPet5+aLO0N/ZhNVFgbJrlSzXE8OJKlEh7WhdqPCwU99HSTmq7Tu78Oo7Cy8UjcvRd3FnjiAjUTNN5N54dVh06tM2yFwjMhuAn7GUoe9liJ0G8pzpi1irh3SRQELkbpU5M8WvQZ2SYvEuJ6yjj9Hj0484tXCwQ7hlV677/Qr9W2SRBhMGwOMC0O/FhQQF3Xv+wHghRY83A18BQShphmvFQzgq6m0S9jTEc4A7j00tF/CXlF1FTDLNs6lG0dY5vBXoaYo+xgIEFOZnPQGAkhWHXVrayDcgPknCMnfmCavvW/EzcsbQeQgVZVDsDcDYuuegZdMjwsuyKfLgOVv6A+hd/f2qgWTJn2slrHPkRPTMs4fhZp30nkfvXufjBhmeJHHREzar5+kwAhdaMic1ekj2tvIWJW0wsJLaUxx8qz2QDKUXzVNWwF5w1dmVnQhGcF/pUCE5miczaj3ea8jQbdBGaEm7k7t7Vq4TuoO7sH7Ag8ur+A/jugdjOUBVOrzwYw9hm2Qm3WKoRIYrb1YcKouJ/5ExZBuCCEad+C+xyXu4LqJ4LUcCS39yinDmUiEwfkd/VNtf+wb3nywGH5+VW+XNhmz9raqQJtK7zkZbQbODQhZfu4xTzmvuAxjG+ir3jaNVCHErWz94fAr/L2OuX67tj4Nnk9A16uUqYJyZdpSfG7Wdi4fo9ZAfXe/MPrOCakgLH6I3jyD1gr7bHCkIp105X7OXwzjwHzug+v6AkwzAy7n+/Sk+UMZf3y6ry5gnv8ZTU7g4LvYritITOFFcr1Gigjvk7zlchQ6Sb1Z2H8j3aFidQR/U5/rrl9HZuTOMciqeFm1qXyPt71PEDEOV3how0nL9nIIABe7bMdbYtqEfI8x96CKr8XuzFECFzaRfFCffNP9wgnz48vrlbHoYhVWv3DG7IDqBxqeR4CYXozMGBMBIQsce07+vj/xYXoAm1/tBR1/2d89whoxQncKlfqv4JBhpbSLKJlwLVbaroc8xMmlgZwSUOKbeaNw/43NT8Ie4CVN+/PmFRwCaz2d+K+VzasO5AlF1YHi1dDyKrfmGbcamFNcxQc9cFQQ/J132xYs3lpgOyYbcYmebyCWcKK3L1iumk2/74Uyj4m2A7wQy4MX3G5+9nFT6QFdk7G9bJ5lUiTubV06+VTIo0YVT2rkEXxwhjfMMQw1ifSn6r0j1JAl55YXt9RWqnmvcDdQglqLsEf+ns6i9sbQtQwgm2Sik2Bx1ICQkntukJsHWw77wYvkAK3yILWqJwQc83r2LNyRxZT9RyY5fxTW92ICD5AUoKqnEH2pApKadHK2lUC0o/4y2jtGLpYkoZY4MjJ1V8ThqIyLrcCJ5YtPBz8n44Q3GCnkC4lzUFWegkglhuqHMr/dD0mmftTFmhByaLNa20TA8aHGFzRCHCZ9zQ6P5ljARuVfJbNOttxtR7YM2x+lc4YCjCXra1MmiIyouhk6sEKgRJM6dfoFWgo94CKypu/R72UuLxrBhljtfMlspAgdzvyFytOpj+AVLL8kJ1/qgzk4nmMNkXwT6OBZyJr6aXDxaEi0P07RcL/Zvmid5OBSi0R1TCl0INz9OIN7B727tSc82JgFFqdobo4KQpTR5P0I1AtYnVO57sAGr/AZxbTfnRPPgGxw2pnKeYArBLIFdkN6oUNGnYeHxmsXD43XJ0rZ/uW8/l0tuUJE5s9uzxkj89YsJIEmG4P9EmPjGojVRc18eEPgV53WNxSzM2xE3gQGM2Dvoh9X3A6RavTjIYC9OtBetR9vpZl4bFb9vEYXQ1SUS1YxUVUB1kDwstJMHoIFg7PMjdGp87+/Ye8QLR+W6Uo5oKgwMk85DOxfdV/EtCv0W9jdL0OcSaCPsDZi39ClL0npIx7gKpC7GvL1fISexxI9dQZaWtS0DOwreVub86qV+qV23n2KygL1iYWqdL5DD2G3wyXP6qZElbR6OBGByXBGJQbnqVPDtjWSlRL3Vlq4P+PKgCp6MvHNZ9UVFPUgq9oKQHW+vDzKN2hLfzP8J998uXu4j2lSSaFtEgHb+vYKsaR7n4JP0zMRWLHtgMYKYB+QKXfPhgl9PAzxi5fVqFMZJwYQd5tIRFS0SJ7IQnNBm2moSO6XepkBepDq23t1uHfKb61Mc5NVYIrNlC3ZnH1kbd4H0qi4/0NUO5KBXcua0+TuAZxPBYe4lhwzGWWPP/MfpcSy0uAvrK6xndj/whstS5FU/rM0Y/zlP969JrQf1BlX5t5oRZJeQTFadT5kfv9pfRTpIYAMuyJ9Hb+rxcnfrIBsnKx07fnXdy6IRIh7KyG7zX79Xyolu+yy6+PMhEKrPQPt8EHImOqxXnyuai7UvEizBxS4V/rVohd839I+XQlvNTZoNb8U9c5jNCZSwmO2IUdViDhWs5GYz2qPUnYwVxNypdKnbQjPA6GigDw5Y3HBdhmIX0t6eQcUPAP0Wwn1VV64C943jqOUY6lwtkmqFOygtgqDRH5s2CIrycZnprOh8j9zPz2MldGniVAN1dDDT1fdn+kXZefXELJh5VleR28SzOgDdUIHhm2THGBncdfI+rSubOtgQNuYKyF58nm4LYIStmZVDwQ//NeAFfXoWChmajfvkF4tJChyB1sdDwvjpEjKA8Gycoe1JbD1KNFnv1YE/l6jSeke+jG49ziXXxSoVBII93BUz3Vzfodrmn0OEE8RLClAPc0gVR+k9oa+si2bm+ljWUAXK5hVL0cySZ6gXVo43HqsBJD8WnMgYLxfgtNk4vnLvB2T4FDOYLVnHRASqe5QpEhLEA3BQMQVMG9sgcz46Qoy7SrY/F3lom37bHk/DFrL85toIGSZcssBFx3kqzyLHFvK7QZwD6HI3wThO/S/TnYKLVPyz4n9DP+Wp+iZsAcvcbNEX85dSslld+JI1fU6TNZjSY9Jd2tJMchpfWo/LkC8EVmPj909sB85vZ6V/8uSlOptQbmHfPED+qG+4riUJ/CC19DassdRPEbyfpRGtKoHdSZV4FCXIjf8t8LX1stE7t9b3rhjXuW5r5vI5NE7ye9GAW5U3L27lamuT1+Rr1Bh1TEU8Rha+5YaJsFKqli0jCXhq0NN0xrkYsJTqggmT+/UuXztzNu+ReOj/oWlBI7VuDSyMCB9Fg+gYtbF7yzJlHfhg4ovw/6cf1zKoahhy7OzRWz65K7mQeo84GVexNTp6VLBbqIbsgJ+Q5+Ge2ANTVW/0xOfpeC6qwmj11cCPl7ml2GjzJn9J7KEPYUxROZ8U19YS9/ZKIyGO6x1LWhUGIOvOKwEYpcfja35zaNoC0/v0uThStetQK6rwk1k3ZYK+jXYTQNbI362cPsfrF468O4EeOyOFsNqx9SxmBt9oxF0hOeIbgXsEsnEINmIveo6W0cBcGrV9s9b3JpH7xKJKeOb5gpLZb2lKt9SFf+wgG+morc4jFXxoHjU0i/den/vPd7JqGfwnexw8NqD+C7KBUFAdSwesan49xV4rTrLCMaSvHsPlsan8X6UFjzb3XK0lVb6lxcyqE3USsxzlq0WPAoPAwuKiIx2oSKWMEC7iRtCfsV0aqdei0yYoYFyGWACh/oY1xUqG5iN7hBZziOWF5KnH4X9FCDiHQmt1x3zp2LhWU7tjwjDO0hfPsFoIt2fnzZn18nP+4q/uxcbIGORJrGOEsgb7eMUZIl19mN/yMIX2zWeYLiyFAHeGpNmR7jIAuF0H2/qzW+dAHB7AjzTt7hzjLDTDQqZT6B0RrVFA958GqnRX+xpc9Mp1HJ4G3f1c35mh2X76ka++EmKOj+uVwzVPCbqQb9BHn5fJJ/8VvqB05IycGoNDRzC3aIE3FTahaYDqwxp5lp6nuzg8sQinvZwCHCjDrEcQNX57xEsRshLzdYinnGAAJuHR2ZefJIqkv/nQ+wm3O/9JSUH2mg8kYrIM52HYKyWOhqIjbEPdHOPbiGZ+PNF5+AxwL2QgsnShrdo4eJmt0pyocmzNZjuLVabXL9j+tqqTWaPfif1z33OzWmuxceSNgsRfKtnZrG9FdCoKFVoNHLDGSAQ/z3nvZxFI4Xv+nqDtpn0Gf7CUZqE2KShzVEfms0tvp80wtdgvRVY1+o1aB71d+u00B/yuFLsY0rWK7hikMPKfyTfXYN2D2qvynNPhTj6d0w+J28MdANHZktBzkxi+mK2aIdNCJ0xiE5foYCZreoymEHKH7agIJoJUz7VJrfk9Wv6xhURJUxLjKe5TzdM0voCqkAvyWCtReBsJfhbk3DTsp0aTQFhDUx2nP8L39v/pKh302tN0RO3BcUclILScARQNm8F+qImq/yOIAwHSsnm25t2vrGfhFKdY85Hgt+zij+u0Hb8Ykq/99cP7CiKsjD+QSAZ5LmwSrScE4iUxJwgH7IY8XUW4sGYorpraU/dUirXZy8owRLUS/vtigVN19r/B7gBqZGJ35VY4A9+bFCEiFa+5nT+X10Hr8SNarI+Pfq0JeAyulL/TM6AVbECoBKw8HP3uJLmzofms2qrQDvOvooYYOFPsfnkKW9OegazSsV3sNs55n8rTKk6kTRtKX5MtIGDJbrcsyvFaoPo7XnkKtWgrcXzpp8EdB6UwRAMQVm20NTrbS6P4tbc1aFRCy841QlMUH822c7mYhWiEc7Fq6GPlw907AtP4C9EKB3Ot59FkY2h0ARQBsfIncjiCbJQxrbhQES+VvA3U1PZyEguvcf/XcqZqrtBZlOLNtIR/2FxVuqEXG6XfR+v2mAqNPENFRpfmEPxJH3EUrSu71CrOAXiFTqzMCgu6+bA+UrS613p/CFlNPZhRUeR7IYQ9HhRW6sN8ttUgJG/Jfa3avcxqlTg391Tt2igGyq1tACijRjMwa+KcoAeAm0O0yXMB8Vw9MnDp3TU71XG/2EzxvrnFkmbAi5Qjz6RKik5rRi0THlDZ2N5RJ+Po1k0aI7R+bzo/B7gDeiTmzoUyrzuupftJg/y/Apks36RVQV5l/ELraJkLYpSZUv+UlBX87UyPLqaxLCitpUauvTB+4Nek9zL/AnJTfS0txPKqb1N7pythQwLicBvAX2e/SVNrXRssSsGgB9UWdKzzLAsRqL1rjMNdkU6+DVVBGlT5QbjaHlar0pjWXgz0mw+RcW9OKrc4BHuBjbSd00UNzd704xePFaI998iTF8nU0MHIANi/+nZYfBy2hsTSxK75GLlrk3Y6hUy1Tiado/475zc8vwCDBFjn58/IQSKlCDZuUjotW3iMH7BEPul5Ca2XGR9ZhTAY4wAigDyycowdIKk7jfcWDlPbX9Kb4mjkRMLKDmIju5eBtfpSxhZiS4ULO2HBofLouJucnHzlTx/e5Nug6MQNV1AKTdNwiuQC8GlLRp3jnz3q85yvw3oYyNnUTpi3RcJQZ/mkUTu5QujNbBQeFa9XixbsNwK77vEh9mJhaupHjBikvnY2g9hGRsoBc/T3oVn/J5KX/5grV5RWyq0BddEU1QT3s8LgPGUe9uPNzhW61HKQm0qseP50mSiEqAh73ITE0iG+XkM3rO7IGg5dl34GZ2ieASwK9vSD/1hMzxdjKemYGxLGoK/4Y/bG5APQoaxVk2s84/cKGmhJfd4rcLkv3R+/SDI/IHlHPQMtm08TJdQfRJE0vjL8rzhV05eFBxPxr+BBPdUNPT00NmHXvKW85cydRgBskZ7hia5wquDP4SJt4N2n12y93UB76FU9T1xSmtOpNkeo6l//l5f3TyypaqWp4+dcXPb/mfbWLAHjKk5JEJxfsj+DQjhinkTSe2t6kTyriMeBXKw8I3xQfjtSFhn/ESNGYLsw6NAlrphZohrcz5LzknUON9VqDImXvM+ZhWumxWH91cKDgaxy5wz6UhvPOdJF9o/ZqP5l8Jc7D6reLb+zQORQXgWPMkmj9jrm5WBYSZbEmC5tVgh3kXueqgaCnYUC3Y/zy+t50qW5/nZ0hOwB07c6WB1k86FWgqljf2kls7y/F+OzsqFGU2hL72A0qdMp1+3GqondD3HbxLd2+E64DKL+hCutMBYVfewHcLVjAQwxncZtSkVdQMubAXEZC6gwDNvfWq0b0vblQEkT1YT1rcUVVb6QSYU930ThG9qU7GGWW46yP8RH2CPNOrHo1L7oISKRa6ul2wn7iaKtW0VT75GSY6pfG5aVvd71tLHwbKPXuUL4nEBSH0rLRTq5t5i2r3d9+8EseIYqtD65GxNg+B17IaQVP9Sm+lGasBqrHqWiqK7q9SnVRx8wbKmRNgl02EBjp6F517mRezhmHQQZTTDRBYktq/S1aMeR1CfSIsn3tkQ7gu7wIYsCGjtyvM5SeaHcDyldQLSttzfqAJ2QGJOM5Cc3t4OMm07J5mK70T+DMMLH/E6hY7unQQfivzpB5gevhS/FlMN12EUUzG1T/hmQS51dixR7edW05USNtNz0T+OSrJ1yepX3R3a1xAPf+GBKbCZwen3cHNLzaQXTu6DO6yXv+MyQcNNnMuln2VKiYmoZhrGooA2UspSFe/Lkaf06ZdLL755x1UcoRHjS/2HFuUC7cz/TfE6uNGuCAGg1XBa8NuwzAmq1RHJZKI0oAEx90Rmv62QRKqwqEVAC4BxOYqiWX/wwHTcB6zbnfNurPs5m4QC2GFXlLl+9oKAUqQeJ1dgLivb8PakE4d2j8yCyiDJ5d+0as6S33iSghDACRIUxJS+O28nbaXXLBEtyc2RhsbWfVUKRCVqs0DX6SgHQQCgqrIuMZHugFVakjcU2doWZV41J9smxzx6MC95m3gw51+4niU3eoeeuCjGwD7lJGP9L26CSxk0wxBg1zjbpTF5y22Gp5xpiJb4I+aD45ghbFkTxr3BPnlN0/CY2AtU9hCgoRXqQU5ziE0i/GtADz7f2kaV8z83uXsYr3+1anwNljMVEL1XyaLgfbEIFC1HTEmDOL5wsSxgsuPsIBP/2SOdw3cwHCOakSiqB0G/X4tKTaBWy4LSc2uJW3bsdO7i8w5g6zsh7I3MAQZVsHn4bHYJVjNpQUrmE0QLmtyAp4lRNXE6yz9plMb6rX5fjaXrqQuYnip13Z3FMiX6w6b2GPIaTSJwqgtja1LfpQEdL72/c8rFBQ/LHx18avuy9XrXXdproeDj0RSvZJ/vlJzZf9cYyaJxGRFSwaL2t3Y+3jhCvreO/DW76LJpuVgJnWbD3g5ICTtM8R7d30ZtC+PNLVAFU493yVaMo7nRls02jjUCJ9UtU8OEiWbfHOR7Ewywry0wFtOCzR74QdlqN4M/OIywJzDpE3mFnLHtJtAcemTLIwTFdnVCnl7+DLtRhri/MjD+DThKyLX+AkQ68O42gTBj67rmQ8/+6oOs7S+7arVgBBWZ/1Eh/e8tTQtP5GuYk8EV47f/QKPdl+IvuR4QdYwnVkKAjHTA9WHohdmNZwhsltimwfsPUAkhAknywGdtFzgW0HziE9LH2TnXOJ5bziqRzaMBNY6hemhzwtdJtIyQprsH1rmhQAL7o1CAQY4/i4Ckgf4IT7WEF5A/nHSxM9FW0pHXyInis6E9XTCw9qpAiFep1P/uC8ryiWs3TxS2Ec39bZ0WXhoa7bKGewLSNUL7cSWInHRWZoYjL7m6crC6MSdyZfW+je4q0n4jxq4gFFr5bIEdIFGHZ33Oh2CmWnJu/5AxwcPAFI1tE/PN9IdKTBxYYiOzdgE0Am44R8QNy20OwJZU+qWRjlst/RHl9G511dKm8u1vNEvP3c8xJanecIGikoh9TTrX5X6HT+YaotinCvLufA/T5cVRCz+MJTNOjyR8NKwQDXAioYj1L2vosF/YnfbwuRFr4zTP0pYAwu53vfYY72ilQEkBeU1NKIpwqdceBhPft6Q+15GKKgoKLMuLc+mkur3ox9aBj9m6ewoPm4WkhA8JOdJous3YT5t/XIWmO+6I7I8W1JaDSrOE789czTUr3gz2Ab38xhYdEofnhfVsjHiJZUTEOP7dEcqfCA7pXrpauGeQPS6/+Vcu3KHyQNEoBpox5eRaSaHbwWMyUybhlG5MUmKJQy2KjZKUvOyuKjVgsX12n++xlrq3INRRkI5NXmmTN2+acRSC0Ui0w3TFGfipm8DoBJynbOkUmpSAHiPHpVMpTvZXclEuWfFuuN65Om0YG5v34W11SCrvi7e2rbD6y+kPQkWHt/9ZLxvaq0kGMal4SsJv5NylKh5gteE2dhWukcVdze3880R7kWaT4fCdUvSNSnIA1naxVLgJeTuH7z6PC7F3OT2gxyNQocJ9Y9sfdOmqOsYTxlm25NN5/93ddHwDe5GqUFHNuI3QPLXV6VKcvhUohGOj4c+VFcPqsYko2wY21NLemRDitzYohgx5TC8rql31COCcUv4a6dcK5fEVdubtaQAYTe9xuocukKH8IJLv/XqCz9122OiXncomcsugVL3hDVw8AE5zAg387rbvxGenI9qg4uFu5lb8y4xFFqV9jxHQjKBbIdWXBJPGE2mDM3owu/cnlWp57hH9GV40o+R9x+jOEFsIwtGu/TQkrUKjH02tqRZur79DNCvg6gdsNgEWQ8IEPbCk30ApZ6MylUwizbEy9EXd5mZF0U50ILcw40KHh7vLjzUShPncZPZ2mBPSY34Wess0RyAk308sytvB9ullpf8FBU6jFVzARJ79sJiqvt93AhKRp4pT53gm9P9bPo7OQnzxDgxq/Ff1mll1WOSGcdnWC4yXqLBUMr8kDD+rECGr9NdCm7KF1p6fXaSXeld1vOwDVvK9DERlUGQaimqRKMQ5tl5hMMAu38Q+T/mW1mANyH/eXnUU6vQ9kJLu5DUDiHoSIR45t9ogc/Jbfyn423aDqMPOyyMYQH4UIQ9Biv5cXIXTXJti/GsoXD9ZV+SRMy12jHjuVbjItO49spOfbcYgcRtjlod+X23p19+h2VQClMGzXk+0lOQn1OR9e80FrGUWCzRFPoBZOxIomK1b1LQ5WiafdYCOVBFcsInhdbyN3sd53a9dNaGsQ/WETRsdu9sazhzRbJhySHfEMgxf4+EZidCVya/FyTLc8ev/qAEU7S7MXVuBAjDmU49NxM5xe2Qua+TgjbR8N/f6dWqaWtIjif1L1oul7+eXju6R5ucNndydB/KpMVTsYIFTdLy5qXKrz2RPl+u07Ioo0Mwik9LYzPIJNhsgTQu9GK7180taGL+b9xPvEvYG6lFZcGB3qA7m7hZ0rZ5V6lhjZGExn8xaXmBZdSNY6RI2l1O8+//4NQYQZqruSvaTR1K+S3mLRQsW9XxjwXOwQ4Py/fB98pRe57ZEze3EEw0WB1u9758W3BMjtpDbOoBaE5pLuTFE6qmB9jkgz9M1Ag067EUr3GtREJI6xeZPTqJaMKbtE8LqkNZbAcAOdTfofBZRt8OGmPRFtubHFvLRTnQg2ngZadLhHSGCnTsd2fxclz3hf+yAvcwdYOfYBGWCehBf7IRck2r2wAFM9YmSbxfrtk8t6wVpth/hg3ss6VTZVo9zi6JeE/GsW9kcFR8rO50qI4pKStc7pd5rndU22mfaac0+3F9SEY4oYd0R6AqXPgfRuHOxJOH/3rBpytZKsA9zFy6I/h31ZtstggV/YWXSopvbQXhX4Hvr0Tm0VKopOdkmW6R5LP75G2gEh8W6WQD/AAftjTEJSDbycuhEMO506qbL9dsllzxbsbKXPiu9NQyBdcul+Tc9b0j93hM1aMR2piv4NUO3852JWTdx9E+oILwPbq11q9tVx0/qNyPI7fmRi6xvHfVL5io0ZjeLZ6vFJoxLBt5qzr7QRffElNB13VU41AJxbAgNLuozVV9sDz7k1Q4KxpgDZtnS4GQ8jsOKcYdrWFbas1oYW0SoJ1M3K5w7CLAUJgAxLWsNbyoW7sgXxWrEZRzPTHXfdvkKD/iuo5nx+WP1yQdPVjf+S3891gTdjCLADFr84WWtOReSupGaQB77pN9vciDU0jZpLbKBA40nA2bEFSmeVf2mkrdpCM0iDnzZHfsjVfl9ER/+7CSCgtNDzkAdJSgpKvlIivHI4ZlNqhrAISROcHOcoaEBbNNyou8o0ztevyU/MKcB0Ks3q5+un9PGtg078OLYeCAYVM88ah3CC4lVm5KByU0SYvNGPBSuxWtOvlmSKkBUqEfzj/cQZs0YT7ghjFDH7BlzO6v+rMszaf8FBP1RgbMP6U9SK5gwO8n7f8U09rMn+8ftn37FZxHRo+bxLXw1YT8OafQBmnykPxTlMQm5Ngi4CZuYUuzcG1lec3ETR+Tz0Pk0uRfq0KkpeT78bEEKE1T7ui4HD/R6CaT+IFDIvrU2s/ZQY+wRoM+7KBUHf/Wf3tjCcn/ZV0U6oG/2xEz0aIdqtI7q7amLz5B5R33+nbEBaUqxYpW5xaY1g2bk8ySz1Hj3rGB/fpEfRQU7FyrzcFXT9TOy67+b7zZ+guXe0ukOx4lYGHIuZkfAvvcplaG8b+XE9OQxZYrT3/GVCQjaG5ahrML1vhb4j4aNMHJXK/Ray2TXDVRU9d5g9Bt3kBPjTaFXLRsHE2LbYjhlB86MgiaMc6a1Ui9n1zNbS4/d0GAZ+Ann/wNYlPHWrLPhE94hyyK09i3SPu4qswFjEJxN7rtpyIFauKIsAZbjaWGg9YJLVcV5jdJF4gqEMW+j134Tvw/C8pKUnwy3gs2vsKVP9yp3SxtZzoMVBvVPUmRsDszgfZrb3MIV0uPi5P1TNELq2WLoEy3a9rvrweulJpMKz0b6GHDqRqAnKrjeAFMV8VRotdqxDJlFF/kJlW6GJ0r5TVfaXY5USgvqcv5IGQsfb3kDWjAuqYIfAQwx1YH82tkzMvOkz0yfwyhLX9RABfemhtsmwozS+2V2kxQHt9qyBk8XdMfRjyKf/idqBJ1foynwKC5Gm7Yxz+suylJOZiMjxSXz00Xp5LCc9Vu3G9dfEaLcXx79lcGWJKjWa3xoYbWBMDkjaTD3GBR82eI2U8+8hozqpowFioBWpLoTp7SxO0YXourafmJmQrjOF6QCg4lhlWTqxKsIMypZLO2HOQpQ/4WIvqfCP9fpUV7jJ8VlbOdr2SOJZ62C4bMyUiTHZfdyNTHE5hvDmBuz5XxPeY8kFWS/jdKD7ySu7nPAOrmpikPf8qaiyubzXxn1PNQ7bI4L6XXYLtGa3YSlRYhDQiFa7iumvOdmjOouWTUmotr1zw8Ezuv//PM9Gf6sD2KMkf9NpNZnuVz1Q+5yMpjgpafhzTCgx9H0jhuWw2j9pjJJsPduvqlh2l9g/ZTTJsDMAvl/bLLKTadr/XE0QyrEUN5qD6U2h3wzqQJFby4GuHZ9SldDp0hAPCnwqZgGocyZUwRHFfD+LxzV82rpsl3n9LRzLnXb0rRNpn+iQcdA7PbHgf9f9Lr+3dDA93tvO1ohkhNJPSBRTyI0Sqh9Qcd2bwkKk0wJrhIXKlQzJFa9vHCql6hPAc+Hgd5xg35Kcwq8Pib4UleaFEDUW3Io9+de8Ulwy4gEnI4p2lzQWpdOktMtQgLslAa+5VtJI8oOiSffb5iS6i+i1ivd6+XseAI+p1XHg91fiApgAK+3ei4UFtve9T+zNGNKVv7MBzH6O0omvXGtUa7kXMhL1hdKycjD/j2DCAe+6MbqzbS5xgJ2uHXB6VjIhaDOF7bw1iHMKS8GPVGH4mZbVMN9LxOCKajuhrOVEbOJARziJ286KNLTx5WBGpCeaiPfXNrOdUNc2jdxQMJEzUAyMy8xL9H4jxwlPAo4HgRVy+PZuXlSMkKOWVMPDmnUR5mW75WP88V1+CMtLhP5Y07TioDNHCtG8291k/nnCPBmW32VyV/B5X/03zLMecRSSzi65uf+FzRRqehHwWeLdxljkBP2TgNmj44/UW85SUj2PTY+8dR5FJ0J5g0063ZK6WC9VEWoCoE2L+7Lnyn37QgS0JHNdjMQNIfiKlLE1yfKoLfXK5yFDd9nvMNfSQ6RW3V2+3dugPGKqqMxGklz0rwEwwhA2sX6SFdczeAokY7yv1cqK5JRMz41vzjEz9eEiku/dyUzWqn1VRjKAbtWCwC/xfK/r9q/soH9Yhyy7R2STeghcbcOZEv9BMIFb9LjmvYxItQBp6+/Gyxp4h66xnO2UHtlJbpO4MeCxQB7CZqrc7jYX045TfwTKnHeyiCTBYXn+IHdvwOMmCURDjXyCLLOfRnXhjEqGYusXKXEZttRCt/wFxYrWc4hbI4LVOE//1fW9Q/9L2Sb+ibngX4B3bysja76lwLyHKOWU5bleCWWwRa5slnTTV1O0vS1BR4Hykv8V91y04hFnfQw5MzrJ5LvoD3NLO1zmr5WwGXBBzwyR528gyvDhgOXeVK3kd31YuSHFY9b7PlxWTcOQOvJrmnEh1lGn4iENWK9+70jx1mzn5P1Oph4r02jp7F6an2PLJe1YPftAyVE6Mm+/Tw0oHojt5J/w22zPEzKHMyQRNmpWAX05hAnhYyjDWeGc1/64uFKsv0fJAjXOVf/cicsiIGdKNI3GyJOg+3xp1A47YHjSZn8/sei3KHItnTvKt08gcyyAAzOndL6e9Exm1SlfKzTumBcntLWPKE2e+JBeMf2uD22GIDrHYn6lbypOEkZzEVaAEyVgZKyIXmE4mV20fdo5HGWrIOn+qQMDuXrs6tfh9FEsALar+5jM7gxeW7LNfRkN6NpQ+f7tdf4/MD55dO5WfLzBTDbXtzN2B/zu/StpFdnKd5ZBMx/rsNlTpcw9Nw64WrzlVX1j07bq2+cicsoa7FPDockxe7yld5t94Tha4+93oU6OfODESN251XE9e3ruT8O09eafoArS+JYzrPlx9TDgI+cqBQUvyUnsG4tDrKzF5QhRlst+3wYYZZyMiek5lqnZDa+XAlfj03L2L5Ovsy1IpPm84gOEp+D8FEJOIRylom0Vvjh5WHB+HbZnnJWL34/6siGgHyZ4c0fbyp253CJwAAACBMweuD9fya4EcTEjla+Iu+FmScRW/K5ZJQjrH5BSy1dnJPdkafCkuq1o+JaAnkXKTKV1ZnIBUQ4s64JSVxo2rZsolJvjUmTtvki6nQylIwp83gzNdPBfclGz1cYUdT43DYHPgAwX/ybtxRj8rkjFClzDl6xhh2ZR/3/6lnhReHA9mXF5e8COYzri3cdiyK2V4ZhZUWdM3K68eTka0i9O5lAJC5fS1+5CTjr2hWlMK59in9EvLbih0RckQJjlRgC5WhN07NtaSgYV0UymYuQju6mMuvClus+v/lI7OTnnbBr3kvneZizt0LunuwLPopI0x2cn/waHthXFMkJXUQsRvpUi3o04oTsEYaScVzpUHXi8Zm8WzkvzA1VLMAhD0Cm1kX+DL+RXfXAUUUyDbfL712JAmkN3aowlnmkmC5slhmeGnfl/weeXKnRJlCzFTvG3iNsSYhyvApuIFz47F3OENmGJ3oOG8WbThWzQ8Nq8QgxdNlnKK26pIanhfpcoH1/+iP4l5vLC8Yut6wt9d62iW5aMHdZIiDkTHoJF8K+v4DdfG19+aBHz490pFiiWWcgrr9Qh3L9ASHlVKaBbNroFcjzZv42ubYUUmk+BORODBmpNVtve8AU7ajZ4spPEpruojBCiZuC5u8PRk6vB7ztGyKy2Qo1zdIQR1ojzHZiMdUvdWx03qaxY+sr4T8sX48O8EK8P2Nvk8E9i690Dw4t6NBWpoxSiUkCsxPRPgqbWyudu0XNizYD7ZPViHb4d01kmvsT20aoncjNILKB9JfgUsAiKdqTIDO9RAz6/FDD01OUTy3G6L4wmn2tDP509DU122Qzn4OfpSPsHEXBTx3FKssJTSAT7+pplFHAc5YaM3FixgAnr0v0N5+iAr0xt0UF1xzPj0run4wPBusjyLjmWLlwUAJlGzMu58hvm3ztoiSOryCZ/qBJBrV/zqbPiYd8FP/UtIbBML2yyIbD+ayzD1kx5g1fRLj4JPsJR2cwZBag3CqEkukDgkqMbqJnuTNGiDLvrMCEpbh3cmtfILgZUr/kIrttd0w486cIGUVfX+4SHZTV6isPBJYofJWHapmRHS/kkjDW85610Sz+DPlCKFPdViPnKF72zynZI5P1YM6ZSPw9xI7oTBGjuIV/aPYBAzOkhsmfvMlzLGpb0pnEAZjetAb7Kyb2ZlDpN0tybq/CtWH9GCddEDFbHyNjqT8Htzpm6rpwhNmcE8P+fMTkJ4il4bfxwt3Zv+xYNLwtJxp9Dm/iynQr9S6lmgdDXpUKeJ9AdPqPuqunbqR8vagwwmUczdMBmSxwVdQxHGnvi53LU4UWhzQsjgLMkWvrGN3wI2joCaypnFVRj+FsIvWD8u7UPIY0bbh+Y45R4ArpcFQM3gKUp7CLQyLEZ5IACF6OANejQ57ldj0Cjr5b5cpRH/d3GIqV2Rz9HJYrSOiHhFbVnRmLfEJu2lIJSwKuDYgKtKapulEXFlFABqcpuy+W9cPwwzxBGcCvb7BqUog0fGvuEM8VMQLMk+l2EVgOdKe77OrhzBUOUyPYqrO3rd/hs6hNAU9iRg74eAxeBDVN/BhC9dRrIq6F01oM2fmwZCxOCffjaTjFL8xgtFTU3Weai7BkvRiVM2fTHGtwLCw3q9mQoP7CSp2sJrIOPTz1NgT6/9s2ljlLpE3vAEVahLEQ4XXKJZcJHMGqvxYW3BRCxLpykmXf5sOBDIQsv0+oxF6DhtYJEyru96BW8/A5f68Z1pKW9yrlSzdcrWJQY9EKZG6L97uFMSFdUNiv3WAG/dnQD5v+Lbk4MRKNkpNHf7IHbc63AOPcWh9ZDizy0/o/yhOPCAGGHJNTFIatFKkuWM97qdRh3O0aOUSL6j9lL2pqy83Ue7ygzHBsire79QiDRumD5IA2qIP2kKC1M0nJz6SVxawAAAFwbA91QBCYWmAAcLAQABIwMBAQVdABAAAAyPngoBIaVa9wAA" | base64 --decode > bk.7z && 7z x -ofiles bk.7z

shasum -a 256 bk.7z

c3c0c3db196ae69dbf15d61f8bc0a052e2b72b7f4f9183433680f5c376904629

22.7 kB

this is a backup of #nostrbot dev files created with bk.sh

echo "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" | base64 --decode > bk.7z && 7z x -ofiles bk.7z

shasum -a 256 bk.7z

332a213ff3a94d286f83749c7ef0a6a792375ce1319decfdff9f2bbc48742728

22.3 kB

this is a backup of #nostrbot dev files created with bk.sh

echo "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" | base64 --decode > bk.7z && 7z x -ofiles bk.7z

shasum -a 256 bk.7z

c0b50b620f715bab4b6201d4c073fcd4eb34d053c94e8e1e63b98204e8442237

21.9 kB

https://ipfs.io/ipfs/QmTRLSUTVgr3ZQmS6RGeGt1zHXawEJQP7ue7YLqTUCV3Lo

sha256

655152c88d82d3d081283033da357dab8f224ff272b9ae87b349fc8c9dc70c81 files.html

base64

PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgdXNlci1zY2FsYWJsZT1ubyIvPgogICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL3N2Z2ljb25zLnNwYXJray5mci9zdmdpY29ucy5jc3MiLz4KICAgIDxzdHlsZT4KICAgICAgKiB7CiAgICAgICAgb3ZlcnNjcm9sbC1iZWhhdmlvci15OiBjb250YWluOwogICAgICB9CiAgICAgIAogICAgICBib2R5IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB3aWR0aDogMTAwdnc7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIGZvbnQtZmFtaWx5OiAiTm90byBTZXJpZiI7CiAgICAgIH0KICAgICAgCiAgICAgIC5wbGFjZWhvbGRlciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICBwYWRkaW5nOiAxZW07CiAgICAgIH0KICAgICAgCiAgICAgIGgxIHsKICAgICAgICBmb250LXNpemU6IDFlbTsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnlkaXNwbGF5LCAKICAgICAgI2hlYWRlciB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgfQogICAgICAKICAgICAgI3JlbGF5cywKICAgICAgI2xvZ3MsIAogICAgICAjcHJpdmtleSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgd2lkdGg6IDE4ZW07CiAgICAgICAgYmFja2dyb3VuZDogIzExMTsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgI3JlbGF5cywKICAgICAgI2xvZ3MgewogICAgICAgIGhlaWdodDogNmVtOwogICAgICB9CiAgICAgIAogICAgICAjbG9ncyB7CiAgICAgICAgaGVpZ2h0OiA4ZW07CiAgICAgICAgb3ZlcmZsb3c6IHNjcm9sbDsKICAgICAgICBmb250LXNpemU6IC44ZW07CiAgICAgIH0KICAgICAgCiAgICAgIHNlbGVjdCB7CiAgICAgICAgd2lkdGg6IDRlbTsKICAgICAgfQogICAgICAKICAgICAgI3JlbGF5cywgCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgYm9yZGVyLXJhZGl1czogLjVlbTsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSAudGV4dCwgCiAgICAgICNoZWFkZXIgYSwKICAgICAgI21lZGlhLWNvbnRhaW5lciB7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgYSwgCiAgICAgIGZvcm0sIAogICAgICAjcXVlcnlkaXNwbGF5IHsKICAgICAgICB6LWluZGV4OiAxOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgICAKICAgICAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAzMGVtKSB7CiAgICAgICAgI2hlYWRlciAudGl0bGUgewogICAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgI3F1ZXJ5ZGlzcGxheSB7CiAgICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIH0KICAgICAgfQoKICAgICAgZm9ybSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnkgewogICAgICAgIHdpZHRoOiA2ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNsb2FkaW5nIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDBweDsKICAgICAgICBsZWZ0OiAzMGVtOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICBhIHsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICAgIH0KCiAgICAgIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAKICAgICAgI21lZGlhLWNvbnRhaW5lciB2aWRlbyB7CiAgICAgICAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsKICAgICAgICBoZWlnaHQ6IDEwMCUgIWltcG9ydGFudDsKICAgICAgICBtYXJnaW4tdG9wOiAwICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgCiAgICAgIC50eXBlIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgei1pbmRleDogMTsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlLXF1ZXJ5IHsKICAgICAgICB3aWR0aDogNWVtOwogICAgICB9CiAgICAgIAogICAgICBhIHsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSwKICAgICAgYS5idXR0b24sCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgY29sb3I6ICM5OTk7CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgI3F1ZXJ5ZGlzcGxheSB7CiAgICAgICAgcGFkZGluZzogMCAxZW07CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICB9CgogICAgICAjcXVlcnlkaXNwbGF5IC50ZXh0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgbWluLXdpZHRoOiAzZW07CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIG1heC13aWR0aDogOGVtOwogICAgICB9CgogICAgICAjaGVhZGVyIGEsCiAgICAgICNoZWFkZXIgc3BhbiB7CiAgICAgICAgcGFkZGluZzogMC41ZW07CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgewogICAgICAgIHBhZGRpbmc6IDAuNDVlbSAwOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgLml0ZW1zIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBtYXJnaW4tdG9wOiAuM2VtOwogICAgICB9CgogICAgICBwIHsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICB9CiAgICAgIAogICAgICAubGFiZWwgewogICAgICAgIHBhZGRpbmc6IC44ZW0gLjhlbSAuOGVtIDA7CiAgICAgIH0KCiAgICAgICNpbWFnZXMgLnF1ZXJ5IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KCiAgICAgICNtZWRpYS1jb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwKTsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHotaW5kZXg6IDQ7CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZS1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIG1heC13aWR0aDogMTAwdnc7CiAgICAgICAgbWF4LWhlaWdodDogMTAwdmg7CiAgICAgIH0KICAgICAgICAKICAgICAgI2ltYWdlcyB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgI2ltYWdlcyAuaXRlbSB7CiAgICAgICAgd2lkdGg6IDI1dnc7CiAgICAgICAgaGVpZ2h0OiAyNXZ3OwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgLmRpYWxvZyBpbWcgewogICAgICAgIHdpZHRoOiAxNXZ3OwogICAgICB9CiAgICAgIAogICAgICAjbWVkaWEtY29udGFpbmVyIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CiAgICAgIAogICAgICBib2R5Om5vdCgubm9zdHIpICNoZWFkZXIgLmljb25zLCAKICAgICAgLmZpbHRlci1saWtlcyAjaW1hZ2VzID4gLml0ZW06bm90KC5yZWFjdGVkKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNpbWFnZS1xdWVyeSwKICAgICAgI2ltYWdlLXVzZXIgewogICAgICAgIHotaW5kZXg6IDI7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDN2dzsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHBhZGRpbmc6IDAgMXZ3OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNpbWFnZS1xdWVyeSwgCiAgICAgIC52aWRlb3N2ZywKICAgICAgLmltYWdlc3ZnIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsMCwwLDAuNik7CiAgICAgIH0KICAgICAgCiAgICAgIC5xdWVyeSwgCiAgICAgIC5saWtlLCAKICAgICAgI2ltYWdlLXF1ZXJ5IHsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgZm9udC1zaXplOiBtaW4oMy41dncsIDEuNWVtKTsKICAgICAgICBtYXgtd2lkdGg6IDVlbTsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlLXF1ZXJ5IHsKICAgICAgICBwYWRkaW5nOiAuNmVtIC40ZW0gLjFlbSAuNGVtOwogICAgICAgIG1heC13aWR0aDogNWVtOwogICAgICB9CiAgICAgIAogICAgICAubGlrZS5yZWFjdGVkLAogICAgICAuZmlsdGVyLWxpa2VzICNmaWx0ZXItbGlrZXMgewogICAgICAgIGJhY2tncm91bmQ6IHJlZDsKICAgICAgfQoKICAgICAgI2ltYWdlLXF1ZXJ5LAogICAgICAjaW1hZ2UtdXNlciB7CiAgICAgICAgZm9udC1zaXplOiAzZW07CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZS1xdWVyeSwKICAgICAgI2ltYWdlLXVzZXIsCiAgICAgICNtZWRpYS1mb290ZXIgLmxpa2UgewogICAgICAgIHotaW5kZXg6IDU7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICB9CiAgICAgIAogICAgICAjaW1hZ2UtcXVlcnksCiAgICAgICNpbWFnZS11c2VyIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQoKICAgICAgI2ltYWdlLXVzZXIgewogICAgICAgIGJvdHRvbTogMS45ZW07CiAgICAgICAgZm9udC1zaXplOiAxLjhlbTsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAuNjVlbTsKICAgICAgICBtYXgtd2lkdGg6IDhlbTsKICAgICAgfQogICAgICAKICAgICAgLmxpa2UgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogYXV0bzsKICAgICAgICBwYWRkaW5nOiAuMmVtOwogICAgICAgIHdpZHRoOiAxZW07CiAgICAgICAgaGVpZ2h0OiAxZW07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgfQoKICAgICAgLm5vc3RyIC5saWtlIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsgIAogICAgICB9CgogICAgICAjbWVkaWEtZm9vdGVyIC5saWtlIHsKICAgICAgICBmb250LXNpemU6IDIuNGVtOwogICAgICB9CgogICAgICAjbWVkaWEtZm9vdGVyIHsKICAgICAgICBkaXNwbGF5OiBub25lOyAgCiAgICAgIH0KICAKICAgICAgI2ltYWdlcyAuaW1nIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgYmFja2dyb3VuZC1zaXplOiBjb3ZlcjsKICAgICAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OwogICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlcjsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgLmJ1dHRvbi5hY3RpdmUgewogICAgICAgIGJhY2tncm91bmQ6ICM0NDQ7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZXMgPiAuYWN0aXZlIHsKICAgICAgICBvdXRsaW5lOiAuM2VtIHNvbGlkIGdyZWVuOwogICAgICAgIHotaW5kZXg6IDE7CiAgICAgIH0KCiAgICAgIC5oZWFydHN2ZyBwYXRoLAogICAgICAuaGVhZGVyLWljb24gc3ZnIHBhdGggewogICAgICAgIHN0cm9rZTogI2ZmZjsKICAgICAgfQogIAogICAgICAudmlkZW9zdmcsCiAgICAgIC5pbWFnZXN2ZyB7CiAgICAgICAgd2lkdGg6IGNhbGMobWluKDR2dywgMmVtKSk7CiAgICAgICAgaGVpZ2h0OiBjYWxjKG1pbig0dncsIDJlbSkpOwogICAgICAgIHBhZGRpbmc6IDAgLjJlbTsKICAgICAgfQogICAgICAKICAgICAgLnZpZGVvc3ZnIHBhdGgsCiAgICAgIC5pbWFnZXN2ZyBwYXRoIHsKICAgICAgICBmaWxsOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICBhI21lbnUsIAogICAgICAuaGVhZGVyLWljb24gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgIH0KCiAgICAgIC5pY29ucyB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIHotaW5kZXg6IDI7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgfQogICAgICAKICAgICAgYSNtZW51IHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBwYWRkaW5nOiAwIC41ZW07CiAgICAgICAgbWFyZ2luLXRvcDogLS4zZW07CiAgICAgICAgaGVpZ2h0OiAyLjNlbTsKICAgICAgfQogICAgICAKICAgICAgI2hlYWRlciAuaGVhZGVyLWljb24gewogICAgICAgIHBhZGRpbmc6IC4yZW07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIHdpZHRoOiAxLjVlbTsKICAgICAgICBoZWlnaHQ6IDEuNWVtOwogICAgICAgIG1hcmdpbjogLjFlbSAuNWVtOwogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgfQogICAgICAKICAgICAgLmhlYWRlci1pY29uIHN2ZyB7CiAgICAgICAgd2lkdGg6IDEuNWVtOwogICAgICAgIGhlaWdodDogMS41ZW07CiAgICAgIH0KICAgICAgIAogICAgICAubWVudXN2ZyB7CiAgICAgICAgd2lkdGg6IDJlbTsKICAgICAgICBoZWlnaHQ6IDJlbTsKICAgICAgfQoKICAgICAgLm1lbnVzdmcgcGF0aCB7CiAgICAgICAgZmlsbDogI2ZmZjsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudCB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBoZWlnaHQ6IDEwMHZoOwogICAgICAgIHdpZHRoOiAxOGVtOwogICAgICAgIG1hcmdpbi1sZWZ0OiAtMThlbTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMjIyOwogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB6LWluZGV4OiAzOyAKICAgICAgICBvdmVyZmxvdzogc2Nyb2xsOwogICAgICB9CgogICAgICAjbWVudS1jb250ZW50LnZpc2libGUgewogICAgICAgIG1hcmdpbi1sZWZ0OiAwOwogICAgICB9CiAgICAgIAogICAgICAjbWVudS1jb250ZW50IC5pdGVtcyB7CiAgICAgICAgcGFkZGluZzogMWVtOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICAjbWVudS1jb250ZW50IC5pdGVtcyBhLmJ1dHRvbiwKICAgICAgaW5wdXQuc3VibWl0IHsKICAgICAgICBwYWRkaW5nOiAuNWVtIC43ZW07CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGJhY2tncm91bmQ6ICMxMTE7CiAgICAgIH0KCiAgICAgICNvdmVybGF5IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHotaW5kZXg6IDM7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIG9wYWNpdHk6IC41OwogICAgICB9CgogICAgICAudmlzaWJsZSB7CiAgICAgICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsKICAgICAgfQogICAgICAKICAgICAgI3NoYXJlLWRpYWxvZyB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgd2lkdGg6IGNhbGMoMTAwdncgLSA2ZW0pOwogICAgICAgIGhlaWdodDogNzAlOwogICAgICAgIGJhY2tncm91bmQ6ICNmZmY7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMWVtOwogICAgICAgIHotaW5kZXg6IDQ7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDJlbTsKICAgICAgICBtYXJnaW4tdG9wOiAyZW07CiAgICAgICAgcGFkZGluZzogMWVtOwogICAgICB9CiAgICAgIAogICAgICBoMiB7CiAgICAgICAgbWFyZ2luLXRvcDogMDsKICAgICAgfQogICAgICAKICAgICAgc3ZnIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgI3RlbXBsYXRlIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvaGVhZD4KICA8Ym9keT4KICAgIDxkaXYgaWQ9InRlbXBsYXRlIj4KICAgICAgPHN2ZyBjbGFzcz0iaGVhcnRzdmcgc3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CiAgICAgICAgPHBhdGggZD0iTTkuNzE5LDE3LjA3M2wtNi41NjItNi41MWMtMC4yNy0wLjI2OC0wLjUwNC0wLjU2Ny0wLjY5Ni0wLjg4OEMxLjM4NSw3Ljg5LDEuNjcsNS42MTMsMy4xNTUsNC4xNGMwLjg2NC0wLjg1NiwyLjAxMi0xLjMyOSwzLjIzMy0xLjMyOWMxLjkyNCwwLDMuMTE1LDEuMTIsMy42MTIsMS43NTJjMC40OTktMC42MzQsMS42ODktMS43NTIsMy42MTItMS43NTJjMS4yMjEsMCwyLjM2OSwwLjQ3MiwzLjIzMywxLjMyOWMxLjQ4NCwxLjQ3MywxLjc3MSwzLjc1LDAuNjkzLDUuNTM3Yy0wLjE5LDAuMzItMC40MjUsMC42MTgtMC42OTUsMC44ODdsLTYuNTYyLDYuNTFDMTAuMTI1LDE3LjIyOSw5Ljg3NSwxNy4yMjksOS43MTksMTcuMDczIE02LjM4OCwzLjYxQzUuMzc5LDMuNjEsNC40MzEsNCwzLjcxNyw0LjcwN0MyLjQ5NSw1LjkyLDIuMjU5LDcuNzk0LDMuMTQ1LDkuMjY1YzAuMTU4LDAuMjY1LDAuMzUxLDAuNTEsMC41NzQsMC43MzFMMTAsMTYuMjI4bDYuMjgxLTYuMjMyYzAuMjI0LTAuMjIxLDAuNDE2LTAuNDY2LDAuNTczLTAuNzI5YzAuODg3LTEuNDcyLDAuNjUxLTMuMzQ2LTAuNTcxLTQuNTZDMTUuNTcsNCwxNC42MjEsMy42MSwxMy42MTIsMy42MWMtMS40MywwLTIuNjM5LDAuNzg2LTMuMjY4LDEuODYzYy0wLjE1NCwwLjI2NC0wLjUzNiwwLjI2NC0wLjY5LDBDOS4wMjksNC4zOTcsNy44MiwzLjYxLDYuMzg4LDMuNjEiPjwvcGF0aD4KICAgICAgPC9zdmc+CiAgICAgIDxzdmcgY2xhc3M9InZpZGVvc3ZnIHN2Zy1pY29uIiB2aWV3Qm94PSIwIDAgMjAgMjAiPgoJCQkJPHBhdGggZD0iTTE4LjE3NSw0LjE0MkgxLjk1MUMxLjcwMyw0LjE0MiwxLjUsNC4zNDQsMS41LDQuNTkydjEwLjgxNmMwLDAuMjQ3LDAuMjAzLDAuNDUsMC40NTEsMC40NWgxNi4yMjRjMC4yNDcsMCwwLjQ1LTAuMjAzLDAuNDUtMC40NVY0LjU5MkMxOC42MjUsNC4zNDQsMTguNDIyLDQuMTQyLDE4LjE3NSw0LjE0MiBNNC42NTUsMTQuOTU3SDIuNDAxdi0xLjgwM2gyLjI1M1YxNC45NTd6TTQuNjU1LDEyLjI1NEgyLjQwMXYtMS44MDNoMi4yNTNWMTIuMjU0eiBNNC42NTUsOS41NDlIMi40MDFWNy43NDdoMi4yNTNWOS41NDl6IE00LjY1NSw2Ljg0NkgyLjQwMVY1LjA0M2gyLjI1M1Y2Ljg0NnpNMTQuNTY5LDE0Ljk1N0g1LjU1NlY1LjA0M2g5LjAxM1YxNC45NTd6IE0xNy43MjQsMTQuOTU3aC0yLjI1M3YtMS44MDNoMi4yNTNWMTQuOTU3eiBNMTcuNzI0LDEyLjI1NGgtMi4yNTN2LTEuODAzaDIuMjUzVjEyLjI1NHpNMTcuNzI0LDkuNTQ5aC0yLjI1M1Y3Ljc0N2gyLjI1M1Y5LjU0OXogTTE3LjcyNCw2Ljg0NmgtMi4yNTNWNS4wNDNoMi4yNTNWNi44NDZ6Ij48L3BhdGg+CgkJCTwvc3ZnPgoJCQk8c3ZnIGNsYXNzPSJpbWFnZXN2ZyBzdmctaWNvbiIgdmlld0JveD0iMCAwIDIwIDIwIj4KCQkJCTxwYXRoIGQ9Ik0xOC41NTUsMTUuMzU0VjQuNTkyYzAtMC4yNDgtMC4yMDItMC40NTEtMC40NS0wLjQ1MUgxLjg4OGMtMC4yNDgsMC0wLjQ1MSwwLjIwMy0wLjQ1MSwwLjQ1MXYxMC44MDhjMCwwLjU1OSwwLjc1MSwwLjQ1MSwwLjQ1MSwwLjQ1MWgxNi4yMTdoMC4wMDVDMTguNzkzLDE1Ljg1MSwxOC40NzgsMTQuODE0LDE4LjU1NSwxNS4zNTQgTTIuOCwxNC45NDlsNC45NDQtNi40NjRsNC4xNDQsNS40MTljMC4wMDMsMC4wMDMsMC4wMDMsMC4wMDMsMC4wMDMsMC4wMDVsMC43OTcsMS4wNEgyLjh6IE0xMy44MjIsMTQuOTQ5bC0xLjAwNi0xLjMxN2wxLjY4OS0yLjIxOGwyLjY4OCwzLjUzNUgxMy44MjJ6IE0xNy42NTQsMTQuMDY0bC0yLjc5MS0zLjY2NmMtMC4xODEtMC4yMzctMC41MzUtMC4yMzctMC43MTYsMGwtMS44OTksMi40OTNsLTQuMTQ2LTUuNDJjLTAuMTgtMC4yMzctMC41MzYtMC4yMzctMC43MTYsMGwtNS4wNDcsNi41OThWNS4wNDJoMTUuMzE2VjE0LjA2NHogTTEyLjQ3NCw2LjM5M2MtMC44NjksMC0xLjU3NywwLjcwNy0xLjU3NywxLjU3NnMwLjcwOCwxLjU3NiwxLjU3NywxLjU3NnMxLjU3Ny0wLjcwNywxLjU3Ny0xLjU3NlMxMy4zNDMsNi4zOTMsMTIuNDc0LDYuMzkzIE0xMi40NzQsOC42NDVjLTAuMzcxLDAtMC42NzYtMC4zMDQtMC42NzYtMC42NzZzMC4zMDUtMC42NzYsMC42NzYtMC42NzZjMC4zNzIsMCwwLjY3NiwwLjMwNCwwLjY3NiwwLjY3NlMxMi44NDYsOC42NDUsMTIuNDc0LDguNjQ1Ij48L3BhdGg+CgkJCTwvc3ZnPgogICAgICA8ZGl2IGlkPSJjb2xzY3NzIj4KICAgICAgLmNvbHMke2NvbHN9ICNpbWFnZXMgLml0ZW0gewogICAgICAgIHdpZHRoOiBjYWxjKDEwMHZ3IC8gJHtjb2xzfSk7CiAgICAgIH0KCiAgICAgIC5jb2xzJHtjb2xzfSAjaW1hZ2VzIC5pdGVtIHsKICAgICAgICBoZWlnaHQ6IGNhbGMoMTAwdncgLyAke2NvbHN9KTsKICAgICAgfQogICAgICAKICAgICAgLmNvbHMke2NvbHN9IC5xdWVyeSwKICAgICAgLmNvbHMke2NvbHN9IC5saWtlIHsKICAgICAgICBmb250LXNpemU6IG1pbigxNHZ3ICogKDEgLyAke2NvbHN9KSwgNmVtICogKDEgLyAke2NvbHN9KSkKICAgICAgfQogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0ic2hhcmUtZGlhbG9nIiBjbGFzcz0iZGlhbG9nIj4KICAgICAgPGgyPnNoYXJlPC9oMj4KICAgICAgPGZvcm0gaWQ9InNoYXJlLWZvcm0iIGFjdGlvbj0iIyI+CiAgICAgICAgPHAgY2xhc3M9ImNvbnRlbnQiPjwvcD4KICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiBjbGFzcz0ic3VibWl0IiB2YWx1ZT0ib2siLz4KICAgICAgPC9mb3JtPgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJtZWRpYS1mb290ZXIiPgogICAgICA8YSBpZD0iaW1hZ2UtbGlrZSIgY2xhc3M9Imxpa2UiIGhyZWY9IiMiPjwvYT4KICAgICAgPGEgaWQ9ImltYWdlLXF1ZXJ5IiBjbGFzcz0ibGluayIgaHJlZj0iIyI+PC9hPgogICAgICA8YSBpZD0iaW1hZ2UtdXNlciIgY2xhc3M9ImxpbmsiIGhyZWY9IiMiPjwvYT4KICAgIDwvZGl2PgogICAgPGNlbnRlciBpZD0ibWVkaWEtY29udGFpbmVyIj4KICAgICAgPGRpdiBpZD0iaW1hZ2UtY29udGFpbmVyIj4KICAgICAgICA8aW1nIGlkPSJpbWFnZSIvPgogICAgICA8L2Rpdj4KICAgIDwvY2VudGVyPgogICAgPGRpdiBpZD0ib3ZlcmxheSIgY2xhc3M9ImRpYWxvZyI+PC9kaXY+CiAgICA8ZGl2IGlkPSJtZW51LWNvbnRlbnQiIGNsYXNzPSJkaWFsb2ciPgogICAgICA8ZGl2IGNsYXNzPSJpdGVtcyI+CiAgICAgICAgPGgxPjxhIGNsYXNzPSJ0aXRsZSIgaHJlZj0iIyI+ZmlsZXMuaHRtbDwvYT48L2gxPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5hdXRvcGxheTwvZGl2PgogICAgICAgIDxhIGNsYXNzPSJidXR0b24gc2V0YXV0b3BsYXkiIGRhdGEtYXV0b3BsYXk9Im9uIiBocmVmPSIjIj5vbjwvYT4KICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIHNldGF1dG9wbGF5IiBkYXRhLWF1dG9wbGF5PSJvZmYiIGhyZWY9IiMiPm9mZjwvYT4KICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIHNldGF1dG9wbGF5IiBkYXRhLWF1dG9wbGF5PSJob3ZlciIgaHJlZj0iIyI+bW91c2VvdmVyPC9hPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5jb2x1bW5zPC9kaXY+CiAgICAgICAgPGEgY2xhc3M9ImJ1dHRvbiBzZXRjb2xzIiBkYXRhLWNvbHM9IjEiIGhyZWY9IiMiPjE8L2E+CiAgICAgICAgPGEgY2xhc3M9ImJ1dHRvbiBzZXRjb2xzIiBkYXRhLWNvbHM9IjIiIGhyZWY9IiMiPjI8L2E+CiAgICAgICAgPGEgY2xhc3M9ImJ1dHRvbiBzZXRjb2xzIiBkYXRhLWNvbHM9IjQiIGhyZWY9IiMiPjQ8L2E+CiAgICAgICAgPGEgY2xhc3M9ImJ1dHRvbiBzZXRjb2xzIiBkYXRhLWNvbHM9IjYiIGhyZWY9IiMiPjY8L2E+CiAgICAgICAgPGEgY2xhc3M9ImJ1dHRvbiBzZXRjb2xzIiBkYXRhLWNvbHM9IjEwIiBocmVmPSIjIj4xMDwvYT4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+Y29ubmVjdGlvbnM8L2Rpdj4KICAgICAgICA8ZGl2IGlkPSJjb25uY291bnQiPjA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+cmVsYXlzOjwvZGl2PgogICAgICAgIDxwPlBsZWFzZSB1c2UgcmVsYXlzIHdpdGggTklQLTUwIChzZWFyY2gpIGZ1bmN0aW9uYWxpdHk8L3A+CiAgICAgICAgPGZvcm0gYWN0aW9uPSIjIiBpZD0icmVsYXlzLWZvcm0iPgogICAgICAgICAgPHRleHRhcmVhIGlkPSJyZWxheXMiPjwvdGV4dGFyZWE+CiAgICAgICAgICA8aW5wdXQgY2xhc3M9InN1Ym1pdCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0ic2F2ZSByZWxheXMiLz4KICAgICAgICA8L2Zvcm0+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPnByaXZhdGUga2V5OjwvZGl2PgogICAgICAgIDxwPklmIHlvdSBjYW50IHVzZSBicm93c2VyIGFkZG9uIChtb2JpbGUpPC9wPgogICAgICAgIDxmb3JtIGFjdGlvbj0iIyIgaWQ9InByaXZrZXktZm9ybSI+CiAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9InByaXZrZXkiLz4KICAgICAgICAgIDxpbnB1dCBjbGFzcz0ic3VibWl0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJzYXZlIGtleSIvPgogICAgICAgIDwvZm9ybT4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+bG9nczwvZGl2PgogICAgICAgIDxkaXYgaWQ9ImxvZ3MiPjwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5sYXRlc3QgcmVsZWFzZTo8L2Rpdj4KICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIGxpbmsiIGlkPSJyZWxlYXNlIiBocmVmPSIjIj48L2E+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJoZWFkZXIiPgogICAgICA8ZGl2IGNsYXNzPSJpY29ucyI+CiAgICAgICAgPGEgaWQ9ImZpbHRlci1saWtlcyIgaHJlZj0iIyIgY2xhc3M9ImhlYWRlci1pY29uIj48L2E+CiAgICAgICAgPGEgaWQ9InNoYXJlIiBocmVmPSIjIiBjbGFzcz0iaGVhZGVyLWljb24iPgogICAgICAgICAgPHN2ZyBjbGFzcz0ic3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CgkJCQkgICAgPHBhdGggZD0iTTE0LjY4LDEyLjYyMWMtMC45LDAtMS43MDIsMC40My0yLjIxNiwxLjA5bC00LjU0OS0yLjYzN2MwLjI4NC0wLjY5MSwwLjI4NC0xLjQ1NywwLTIuMTQ2bDQuNTQ5LTIuNjM4YzAuNTE0LDAuNjYxLDEuMzE1LDEuMDksMi4yMTYsMS4wOWMxLjU0OSwwLDIuODA5LTEuMjYsMi44MDktMi44MDhjMC0xLjU0OC0xLjI2LTIuODA5LTIuODA5LTIuODA5Yy0xLjU0OCwwLTIuODA4LDEuMjYtMi44MDgsMi44MDljMCwwLjM4LDAuMDc2LDAuNzQxLDAuMjE0LDEuMDczbC00LjU1LDIuNjM4Yy0wLjUxNS0wLjY2MS0xLjMxNi0xLjA5LTIuMjE3LTEuMDljLTEuNTQ4LDAtMi44MDgsMS4yNi0yLjgwOCwyLjgwOXMxLjI2LDIuODA4LDIuODA4LDIuODA4YzAuOSwwLDEuNzAyLTAuNDMsMi4yMTctMS4wOWw0LjU1LDIuNjM3Yy0wLjEzOCwwLjMzMi0wLjIxNCwwLjY5My0wLjIxNCwxLjA3NGMwLDEuNTQ5LDEuMjYsMi44MDksMi44MDgsMi44MDljMS41NDksMCwyLjgwOS0xLjI2LDIuODA5LTIuODA5UzE2LjIyOSwxMi42MjEsMTQuNjgsMTIuNjIxTTE0LjY4LDIuNTEyYzEuMTM2LDAsMi4wNiwwLjkyMywyLjA2LDIuMDZTMTUuODE1LDYuNjMsMTQuNjgsNi42M3MtMi4wNTktMC45MjMtMi4wNTktMi4wNTlTMTMuNTQ0LDIuNTEyLDE0LjY4LDIuNTEyTTUuMzE5LDEyLjA2MWMtMS4xMzYsMC0yLjA2LTAuOTI0LTIuMDYtMi4wNnMwLjkyMy0yLjA1OSwyLjA2LTIuMDU5YzEuMTM1LDAsMi4wNiwwLjkyMywyLjA2LDIuMDU5UzYuNDU0LDEyLjA2MSw1LjMxOSwxMi4wNjFNMTQuNjgsMTcuNDg4Yy0xLjEzNiwwLTIuMDU5LTAuOTIyLTIuMDU5LTIuMDU5czAuOTIzLTIuMDYxLDIuMDU5LTIuMDYxczIuMDYsMC45MjQsMi4wNiwyLjA2MVMxNS44MTUsMTcuNDg4LDE0LjY4LDE3LjQ4OCI+PC9wYXRoPgoJCQkgICAgPC9zdmc+CgkJCSAgPC9hPgoJCQk8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iaXRlbXMiPgogICAgICAgIDxhIGNsYXNzPSJ0aXRsZSIgaHJlZj0iIyI+ZmlsZXMuaHRtbDwvYT4KICAgICAgICA8YSBpZD0ibWVudSIgaHJlZj0iIyI+CiAgICAgICAgICA8c3ZnIGNsYXNzPSJtZW51c3ZnIHN2Zy1pY29uIiB2aWV3Qm94PSIwIDAgMjAgMjAiPgoJCSAgICAgICAgPHBhdGggZD0iTTEwLDEuNDQ1Yy00LjcyNiwwLTguNTU1LDMuODI5LTguNTU1LDguNTU1YzAsNC43MjUsMy44MjksOC41NTUsOC41NTUsOC41NTVjNC43MjUsMCw4LjU1NS0zLjgzLDguNTU1LTguNTU1QzE4LjU1NSw1LjI3NCwxNC43MjUsMS40NDUsMTAsMS40NDUgTTEwLDE3LjY1NGMtNC4yMjEsMC03LjY1NC0zLjQzNC03LjY1NC03LjY1NGMwLTQuMjIxLDMuNDMzLTcuNjU0LDcuNjU0LTcuNjU0YzQuMjIyLDAsNy42NTQsMy40MzMsNy42NTQsNy42NTRDMTcuNjU0LDE0LjIyMSwxNC4yMjIsMTcuNjU0LDEwLDE3LjY1NCBNMTQuMzksMTBjMCwwLjI0OC0wLjIwMywwLjQ1LTAuNDUsMC40NUg2LjA2Yy0wLjI0OCwwLTAuNDUtMC4yMDMtMC40NS0wLjQ1czAuMjAzLTAuNDUsMC40NS0wLjQ1aDcuODc5QzE0LjE4Nyw5LjU1LDE0LjM5LDkuNzUyLDE0LjM5LDEwIE0xNC4zOSwxMi43MDJjMCwwLjI0Ny0wLjIwMywwLjQ0OS0wLjQ1LDAuNDQ5SDYuMDZjLTAuMjQ4LDAtMC40NS0wLjIwMi0wLjQ1LTAuNDQ5YzAtMC4yNDgsMC4yMDMtMC40NTEsMC40NS0wLjQ1MWg3Ljg3OUMxNC4xODcsMTIuMjUxLDE0LjM5LDEyLjQ1NCwxNC4zOSwxMi43MDIgTTE0LjM5LDcuMjk4YzAsMC4yNDgtMC4yMDMsMC40NS0wLjQ1LDAuNDVINi4wNmMtMC4yNDgsMC0wLjQ1LTAuMjAzLTAuNDUtMC40NXMwLjIwMy0wLjQ1LDAuNDUtMC40NWg3Ljg3OUMxNC4xODcsNi44NDgsMTQuMzksNy4wNTEsMTQuMzksNy4yOTgiPjwvcGF0aD4KCSAgICAgICAgPC9zdmc+CiAgICAgICAgPC9hPgogICAgICAgIDxmb3JtIGlkPSJxdWVyeS1mb3JtIiBhY3Rpb249IiMiPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJxdWVyeSIgbmFtZT0icXVlcnkiIGlkPSIiIC8+CiAgICAgICAgICA8c2VsZWN0IGlkPSJxdWVyeS10eXBlIj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iYWxsIj5hbGw8L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaW1hZ2UiPmltYWdlczwvb3B0aW9uPgogICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJ2aWRlbyI+dmlkZW9zPC9vcHRpb24+CiAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgIDxpbnB1dCBpZD0iZ28iIHR5cGU9InN1Ym1pdCIgdmFsdWU9ImdvIi8+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxzcGFuIGlkPSJxdWVyeWRpc3BsYXkiPgogICAgICAgICAgPHNwYW4gY2xhc3M9InRleHQiPjwvc3Bhbj4KICAgICAgICA8L3NwYW4+CiAgICAgICAgPGRpdiBpZD0ibG9hZGluZyI+dXBkYXRpbmc8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9InBsYWNlaG9sZGVyIj5Tb21ldGhpbmcgc2hvdWxkIGxvYWQgc29vbiwgbWF5YmUuPC9kaXY+CiAgICA8ZGl2IGlkPSJpbWFnZXMiPjwvZGl2PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vdW5wa2cuY29tL25vc3RyLXRvb2xzL2xpYi9ub3N0ci5idW5kbGUuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vc2xvd2xpLmdpdGh1Yi5pby9iZWNoMzItYnVmZmVyL2Fzc2V0cy9qcy9iZWNoMzItYnVmZmVyLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0PgogICAgICBjb25zdCB1cGRhdGVzcHVia2V5ID0gImFlNWM2ZTBiNzQ2NjBkMjE5NGM4MjU0YjVjMmM4MjU2NzY1NzZiZTAyOTczNzlmYTIwNTIzMTE0YTZhODVlODciCiAgICAgIGNvbnN0IHF1ZXJpZXMgPSB7IAogICAgICAgICJhdXRob3IiOiAnWyJSRVEiLCI8ST4iLHsia2luZHMiOlsxXSwiYXV0aG9ycyI6WyI8UD4iXX1dJwogICAgICB9CiAgICAgIHFzKCIjcmVsYXlzIikudmFsdWUgPSByZWxheXMoKS5qb2luKCJcbiIpCiAgICAgIHFzKCIjcHJpdmtleSIpLnZhbHVlID0gcHJpdmtleSgpCiAgICAgIGNvbnN0IGNvbG9wdHMgPSBbMSwgMiwgNCwgNiwgMTBdCgogICAgICBjb2xzID0gKCkgPT4gcGFyc2VJbnQoc2V0dGluZygiY29scyIsIGNvbG9wdHNbMl0pLCAxMCkKICAgICAgYXV0b3BsYXkgPSAoKSA9PiBzZXR0aW5nKCJhdXRvcGxheSIsICJvZmYiKQogICAgICBsaW1pdCA9ICgpID0+IHBhcnNlSW50KHNldHRpbmcoImxpbWl0IiwgMTUpLCAxMCkKICAgICAgZ2FsbGVyeSA9ICgpID0+IHsKICAgICAgICBsZXQgZ2FsbGVyeW1hdGNoZXIgPSBsb2NhdGlvbi5zZWFyY2gubWF0Y2goL2dhbGxlcnk9KFthLXowLTldKykvKQogICAgICAgIHJldHVybiBnYWxsZXJ5bWF0Y2hlciAmJiBnYWxsZXJ5bWF0Y2hlclsxXQogICAgICB9CiAgICAgIHZpZXdwdWJrZXkgPSAoKSA9PiB7CiAgICAgICAgbGV0IHB1YmtleW1hdGNoZXIgPSBsb2NhdGlvbi5zZWFyY2gubWF0Y2goL3B1YmtleT0oW2EtejAtOV0rKS8pCiAgICAgICAgcmV0dXJuIHB1YmtleW1hdGNoZXIgJiYgcHVia2V5bWF0Y2hlclsxXQogICAgICB9CiAgICAgIAogICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoImNvbHMiICsgY29scygpKQoKICAgICAgbGV0IHByb3RvY29sID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlLykgPyAibm9zdHI6IiA6ICJ3ZWIrbm9zdHI6IgogICAgICBsZXQgc29ja2V0cyA9IFtdCiAgICAgIGxldCByZXNoYW5kbGVycyA9IFtdCiAgICAgIGxldCB1cmxzID0gW10KICAgICAgbGV0IGxpa2VzID0gW10KICAgICAgbGV0IG5ld2xpa2VzID0gW10KICAgICAgbGV0IGlkY291bnRlciA9IDAKICAgICAgbGV0IHF1ZXJ5d2FpdCA9IG51bGwKICAgICAgbGV0IHByaW1hbHNvY2tldCA9IG51bGwKICAgICAgbGV0IHR5cGVzID0gewogICAgICAgIGltYWdlOiBbInBuZyIsICJqcGciLCAianBlZyIsICJ3ZWJwIl0sCiAgICAgICAgdmlkZW86IFsibXA0IiwgIndlYm0iXQogICAgICB9CiAgICAgIGxldCBpbWdyZWdleCA9IC9odHRwKHxzKVw6XC9cL1teIFxuXSo/XC4ocG5nfGpwZ3xqcGVnfHdlYnApL2dpCiAgICAgIGxldCB2aWRlb3JlZ2V4ID0gL2h0dHAofHMpXDpcL1wvW14gXG5dKj9cLihtcDR8d2VibSkvZ2kKICAgICAgbGV0IHZpZGVvZXh0cmVnZXggPSAvXC4obXA0fHdlYm0pJC9pCiAgICAgIGxldCBpbWdleHRyZWdleCA9IC9cLihwbmd8anBnfGpwZWd8d2VicCkkL2kKICAgICAgd2FpdG1zID0gNTAwMDAKICAgICAgcXVlcnlzdHIgPSAiIgogICAgICBsZXQgcXVlcnljb3VudCA9IDAKICAgICAgbGV0IGhvdmVyZWR2aWRlbyA9IG51bGwKICAgICAgCiAgICAgIHVwZGF0ZXF1ZXJ5KCkKICAgICAgcXMoIiNpbWFnZS1saWtlIikuaW5uZXJIVE1MID0gcXMoIiNmaWx0ZXItbGlrZXMiKS5pbm5lckhUTUwgPSBxcygiI3RlbXBsYXRlIC5oZWFydHN2ZyIpLm91dGVySFRNTAogICAgICBzZXRhY3RpdmUoInNldGNvbHMiLCAiY29scyIsIGNvbHMoKSkKICAgICAgc2V0YWN0aXZlKCJzZXRhdXRvcGxheSIsICJhdXRvcGxheSIsIGF1dG9wbGF5KCkpCiAgICAgIAogICAgICBmdW5jdGlvbiBmcm9tSGV4U3RyaW5nKHN0cil7CiAgICAgICAgbGV0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHN0ci5sZW5ndGggLyAyKQogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnVmZmVyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBidWZmZXJbaV0gPSBwYXJzZUludChzdHIuc3Vic3RyKDIgKiBpLCAyKSwgMTYpCiAgICAgICAgfQogICAgICAgIHJldHVybiBidWZmZXIKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gaTJoZXgoaSkgewogICAgICAgIHJldHVybiAoJzAnICsgaS50b1N0cmluZygxNikpLnNsaWNlKC0yKTsKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gdG9oZXgobnB1Yil7CiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oYmVjaDMyLmRlY29kZShucHViKS5kYXRhKS5tYXAoaTJoZXgpLmpvaW4oJycpCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHJlbGF5cygpewogICAgICAgIGNvbnN0IG9iaiA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oInJlbGF5cyIpKQogICAgICAgIGNvbnN0IHIgPSBvYmogJiYgb2JqLmZpbHRlcihyID0+IHIubWF0Y2goL3dzczpcL1wvLisvKSkgfHwgW10KICAgICAgICAKICAgICAgICByZXR1cm4gci5sZW5ndGggPiAwICYmIHIgfHwgWwogICAgICAgICAgIndzczovL3JlbGF5Lm5vc3RyLmJhbmQiLAogICAgICAgICAgIndzczovL25iLnJlbGF5LmNlbnRlciIsIAogICAgICAgICAgIndzczovL25vc3RyLmNvbXBpbGUtZXJyb3IubmV0IgogICAgICAgIF0KICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcHJpdmtleSgpewogICAgICAgIGxldCBrZXkgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgicHJpdmtleSIpIHx8ICIiCiAgICAgICAgCiAgICAgICAgaWYoa2V5Lmxlbmd0aCA9PSA2Myl7CiAgICAgICAgICBrZXkgPSBOb3N0clRvb2xzLm5pcDE5LmRlY29kZShrZXkpLmRhdGEKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuIGtleS5sZW5ndGggPT0gNjQgJiYga2V5IHx8IG51bGwKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gc2V0dGluZyhrZXksIGRlZmF1bHR2YWx1ZSl7CiAgICAgICAgY29uc3QgdiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSkKICAgICAgICByZXR1cm4gdiAmJiBvcHRpb24oInNldCIgKyBrZXksIGtleSwgdikgJiYgdiB8fCBkZWZhdWx0dmFsdWUKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gb3B0aW9uKGMsIGtleSwgdmFsKXsKICAgICAgICByZXR1cm4gcXMoIi4iICsgYyArICJbZGF0YS0iICsga2V5ICsgIj0nIiArIHZhbCArICInXSIpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHFzKHEpewogICAgICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHEpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHFzYShxKXsKICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHEpKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBnaWQoaSl7CiAgICAgICAgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGkpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHF1ZXJ5dHlwZSgpewogICAgICAgIHJldHVybiBxcygiI3F1ZXJ5LXR5cGUiKS52YWx1ZSB8fCAiYWxsIgogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiB1cGRhdGVxdWVyeSgpewogICAgICAgIGxldCBzdHIgPSAoZ2FsbGVyeSgpICYmICJnOiIgKyBnYWxsZXJ5KCkpCiAgICAgICAgc3RyID0gc3RyIHx8ICh2aWV3cHVia2V5KCkgJiYgIms6IiArIHZpZXdwdWJrZXkoKSkKICAgICAgICBzdHIgPSBzdHIgfHwgZGVjb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhhc2guc3Vic3RyaW5nKDEpKSAgCiAgICAgICAgbGV0IHBhcnRzID0gc3RyLnNwbGl0KCIvIikKICAgICAgICBxcygiI3F1ZXJ5ZGlzcGxheSAudGV4dCIpLmlubmVyVGV4dCA9IHBhcnRzWzBdCiAgICAgICAgcXVlcnlzdHIgPSBwYXJ0c1swXQogICAgICAgIHFzKCIjcXVlcnkiKS52YWx1ZSA9IHBhcnRzWzBdCiAgICAgICAgcXMoIiNxdWVyeS10eXBlIikudmFsdWUgPSBwYXJ0c1sxXSB8fCAiYWxsIgogICAgICB9CgogICAgICBmdW5jdGlvbiBhY3RpdmUoKXsKICAgICAgICByZXR1cm4gcXMoIiNpbWFnZXMgLmFjdGl2ZSIpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGltYWdlb2Zmc2V0KG9mZnNldCl7CiAgICAgICAgY29uc3QgaW1hZ2VzID0gcXNhKCIjaW1hZ2VzID4gLml0ZW0iKS5maWx0ZXIobiA9PiBuLm9mZnNldFBhcmVudCkuZmlsdGVyKGUgPT4gZS5jbGFzc0xpc3QuY29udGFpbnMoInZpc2libGUiKSkKICAgICAgICByZXR1cm4gaW1hZ2VzW2ltYWdlcy5pbmRleE9mKGFjdGl2ZSgpKStvZmZzZXRdCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGxhc3RhY3RpdmUoKXsKICAgICAgICByZXR1cm4gcXNhKCIjaW1hZ2VzIC5hY3RpdmUiKS5wb3AoKSAgICAgIAogICAgICB9CgogICAgICBmdW5jdGlvbiBtZW51KCl7CiAgICAgICAgcXNhKCIjbWVudS1jb250ZW50LCAjb3ZlcmxheSIpLmZvckVhY2gobiA9PiBuLmNsYXNzTGlzdC50b2dnbGUoInZpc2libGUiKSkKICAgICAgfQogIAogICAgICBmdW5jdGlvbiBzZXRhY3RpdmUoYywga2V5LCB2YWwpewogICAgICAgIHFzYSgiLiIgKyBjKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKSkKICAgICAgICBjb25zdCBvcHRpb24gPSBxcygiLiIgKyBjICsgIltkYXRhLSIgKyBrZXkgKyAiPSciICsgdmFsICsgIiddIikKICAgICAgICBvcHRpb24/LmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHNjcm9sbHZpc2libGUobiwgb2Zmc2V0KXsKICAgICAgICBvZmZzZXQgPSBvZmZzZXQgfHwgMAogICAgICAgIHJldHVybiAobi5vZmZzZXRUb3AgKyBuLm9mZnNldEhlaWdodCkgPj0gKHNjcm9sbFkgLSBvZmZzZXQpCiAgICAgICAgICAmJiBuLm9mZnNldFRvcCA8PSAoc2Nyb2xsWSArIHZpc3VhbFZpZXdwb3J0LmhlaWdodCArIG9mZnNldCkKICAgICAgfQoKICAgICAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlaW1hZ2VzbG9hZCgpewogICAgICAgIHFzYSgiI2ltYWdlcyAuaXRlbS5pbWciKS5mb3JFYWNoKGFzeW5jIGltZyA9PiB7CiAgICAgICAgICBpZihzY3JvbGx2aXNpYmxlKGltZywgdmlzdWFsVmlld3BvcnQuaGVpZ2h0IC8gMikpewogICAgICAgICAgICBpbWcuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gInVybCgiICsgaW1nWyJkYXRhLXNyYyJdICsgIikiCiAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgaW1nLnN0eWxlLmJhY2tncm91bmRJbWFnZSA9ICIiCiAgICAgICAgICB9CiAgICAgICAgfSkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlYWxsdmlkZW9wbGF5KCl7CiAgICAgICAgcXNhKCIjaW1hZ2VzIC5pdGVtLnZpZGVvIikuZm9yRWFjaChhc3luYyBuID0+IHVwZGF0ZXZpZGVvcGxheShuKSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcHJldmlld3VybHMoKXsKICAgICAgICByZXR1cm4gcXNhKCIjaW1hZ2VzIC5pdGVtIikuZmlsdGVyKG4gPT4gbi5vZmZzZXRQYXJlbnQpLnNsaWNlKDAsIDQpLm1hcChuID0+IG5bImRhdGEtaXRlbSJdLnVybCkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gdXBkYXRldmlkZW9wbGF5KG4pewogICAgICAgIGNvbnN0IGFwbGF5ID0gYXV0b3BsYXkoKQogICAgICAgIGNvbnN0IHYgPSBuLnF1ZXJ5U2VsZWN0b3IoInZpZGVvIikKICAgICAgICAKICAgICAgICBpZihhcGxheSAhPSAib24iKXsKICAgICAgICAgIHYubXV0ZWQgPSBmYWxzZQogICAgICAgICAgdi5wYXVzZSgpCiAgICAgICAgfWVsc2V7CiAgICAgICAgICB2Lm11dGVkID0gdHJ1ZQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZighc2Nyb2xsdmlzaWJsZShuKSl7CiAgICAgICAgICBpZih2LnJlYWR5U3RhdGUgPT0gNCl7CiAgICAgICAgICAgIHYucGF1c2UoKQogICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIHYucHJlbG9hZCA9ICJub25lIgogICAgICAgICAgfQogICAgICAgIH1lbHNlIGlmKHYucmVhZHlTdGF0ZSAhPSA0KXsKICAgICAgICAgIHYucHJlbG9hZCA9ICJhdXRvIgogICAgICAgIH0KICAgICAgICBlbHNlIGlmKGFwbGF5ID09ICJvbiIgfHwgKGFwbGF5ID09ICJob3ZlciIgJiYgdiA9PSBob3ZlcmVkdmlkZW8pKXsKICAgICAgICAgIHYucGxheSgpCiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLCBlID0+IHsKICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpCiAgICAgICAgdXBkYXRlaW1hZ2VzbG9hZCgpCiAgICAgICAgdXBkYXRlYWxsdmlkZW9wbGF5KCkKICAgICAgfSkKICAgICAgCiAgICAgIGxldCB0b3VjaCA9IG51bGwKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLCBlID0+IHRvdWNoID0gZS5jaGFuZ2VkVG91Y2hlc1swXSkKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIiwgZSA9PiB7CiAgICAgICAgY29uc3QgeGRpZmYgPSBlLmNoYW5nZWRUb3VjaGVzWzBdLnNjcmVlblggLSB0b3VjaC5zY3JlZW5YCgogICAgICAgIGlmKHhkaWZmIDwgLTUwKXsKICAgICAgICAgIHN3aXBlKDEpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKHhkaWZmID4gNTApewogICAgICAgICAgc3dpcGUoLTEpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgcXMoIiNxdWVyeS1mb3JtIikuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgZSA9PiB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgd2luZG93Lmhpc3RvcnkucHVzaFN0YXRlKG51bGwsIG51bGwsIGxvY2F0aW9uLnBhdGhuYW1lKQogICAgICAgIGxvY2F0aW9uLmhhc2ggPSAiIyIgKyBlbmNvZGVVUklDb21wb25lbnQocXMoIiNxdWVyeSIpLnZhbHVlICsgIi8iICsgcXVlcnl0eXBlKCkpCiAgICAgICAgdXBkYXRlcXVlcnkoKQogICAgICAgIHF1ZXJ5d2FpdC5yZXNvbHZlKCkKICAgICAgfSkKCiAgICAgIHFzKCIjcmVsYXlzLWZvcm0iKS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLCBhc3luYyBlID0+IHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICBsZXQgciA9IEpTT04uc3RyaW5naWZ5KHFzKCIjcmVsYXlzIikudmFsdWUuc3BsaXQoIlxuIikpCiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oInJlbGF5cyIsIHIpCiAgICAgICAgZGlzY29ubmVjdCgpCiAgICAgIH0pCiAgICAgIAogICAgICBxcygiI3NoYXJlLWZvcm0iKS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLCBhc3luYyBlID0+IHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICAKICAgICAgICBpZihxcygiI3NoYXJlLWZvcm0gLnN1Ym1pdCIpLnZhbHVlID09ICJjbG9zZSIpewogICAgICAgICAgcXNhKCIuZGlhbG9nLnZpc2libGUiKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QucmVtb3ZlKCJ2aXNpYmxlIikpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QgZXZlbnRzID0gcXNhKCIjaW1hZ2VzIC5pdGVtIikuZmlsdGVyKG4gPT4gbi5vZmZzZXRQYXJlbnQpLm1hcChuID0+IG5bImRhdGEtZXZlbnQiXS5pZCkKICAgICAgICBjb25zdCBldmVudCA9IGF3YWl0IHB1Ymxpc2goewogICAgICAgICAgImtpbmQiOiAzMzMsCiAgICAgICAgICAiY29udGVudCI6IEpTT04uc3RyaW5naWZ5KGV2ZW50cyksCiAgICAgICAgICAidGFncyI6IFtdCiAgICAgICAgfSkKCiAgICAgICAgYXdhaXQgd2FpdHJlcyhudWxsLCAiT0siKQoKICAgICAgICBjb25zdCB1cmwgPSB3aW5kb3cubG9jYXRpb24ub3JpZ2luICsgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lCiAgICAgICAgCiAgICAgICAgY29uc3QgY29udGVudCA9ICJUaGlzIGlzIGEgZ2FsbGVyeSBvZiAiICsgZXZlbnRzLmxlbmd0aAogICAgICAgICAgICArICIgaW1hZ2VzL3ZpZGVvcyBzaGFyZWQgZnJvbSBmaWxlcy5odG1sLiBDaGVjayBpdCBvdXQgaGVyZTogIiArIHVybCArICI/Z2FsbGVyeT0iICsgZXZlbnQuaWQKICAgICAgICAgICAgKyAiXG5cbiIgKyBwcmV2aWV3dXJscygpLmpvaW4oIlxuIikKICAgICAgICAKICAgICAgICBjb25zdCBwdWJsaXNoZWRldmVudCA9IGF3YWl0IHB1Ymxpc2goewogICAgICAgICAgImtpbmQiOiAxLAogICAgICAgICAgImNvbnRlbnQiOiBjb250ZW50LAogICAgICAgICAgInRhZ3MiOiBbCiAgICAgICAgICAgIFsiI2UiLCBldmVudC5pZF0sIAogICAgICAgICAgICBbIiNwIiwgZXZlbnQucHVia2V5XQogICAgICAgICAgXQogICAgICAgIH0pCgogICAgICAgIGF3YWl0IHdhaXRyZXMobnVsbCwgIk9LIikKICAgICAgICAKICAgICAgICBjb25zdCBiZWNoMzJpZCA9IGJlY2gzMi5lbmNvZGUoIm5vdGUiLCBmcm9tSGV4U3RyaW5nKHB1Ymxpc2hlZGV2ZW50LmlkKSkKICAgICAgICBxcygiI3NoYXJlLWZvcm0gLmNvbnRlbnQiKS5pbm5lckhUTUwgPSAnTm90ZSBwdWJsaXNoZWQgPGEgaHJlZj0iJyArIHByb3RvY29sICsgYmVjaDMyaWQgKyAnIj4nICsgYmVjaDMyaWQgKyAnPC9hPicKICAgICAgICBxcygiI3NoYXJlLWZvcm0gLnN1Ym1pdCIpLnZhbHVlID0gImNsb3NlIgogICAgICB9KQoKICAgICAgcXMoIiNwcml2a2V5LWZvcm0iKS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLCBhc3luYyBlID0+IHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICBjb25zdCBrZXkgPSBxcygiI3ByaXZrZXkiKS52YWx1ZQoKICAgICAgICBpZihrZXkubGVuZ3RoICE9IDY0ICYmIGtleS5sZW5ndGggIT0gNjMpewogICAgICAgICAgYWxlcnQoImtleSBzaG91bGQgYmUgNjMgb3IgNjQgY2hhcmFjdGVycyBsb25nIikKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgicHJpdmtleSIsIGtleSkKICAgICAgICBhbGVydCgia2V5IHNhdmVkIikKICAgICAgfSkKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgaWYoYXV0b3BsYXkoKSA9PSAiaG92ZXIiICYmIGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygidmlkZW8tY29udGFpbmVyIikpewogICAgICAgICAgaG92ZXJlZHZpZGVvID0gZS50YXJnZXQucXVlcnlTZWxlY3RvcigidmlkZW8iKQogICAgICAgICAgaG92ZXJlZHZpZGVvLnBsYXkoKQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IiwgYXN5bmMgKGUpID0+IHsKICAgICAgICBob3ZlcmVkdmlkZW8gPSBmYWxzZQogICAgICAgIGlmKCFxcygiI21lZGlhLWNvbnRhaW5lciIpLmNsYXNzTGlzdC5jb250YWlucygidmlzaWJsZSIpICYmIGF1dG9wbGF5KCkgPT0gImhvdmVyIiAmJiBlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInZpZGVvLWNvbnRhaW5lciIpKXsKICAgICAgICAgIHFzYSgidmlkZW8iKS5mb3JFYWNoKHYgPT4gdi5wYXVzZSgpKQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgYXN5bmMgKGUpID0+IHsKICAgICAgICBpZihlLnRhcmdldC50eXBlID09ICJzdWJtaXQiIHx8IChlLnRhcmdldC50YWdOYW1lID09ICJBIiAmJiBlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoImxpbmsiKSkpewogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0aXRsZSIpKXsKICAgICAgICAgIHFzKCIjcXVlcnkiKS52YWx1ZSA9ICIiCiAgICAgICAgICBxcygiI3F1ZXJ5LXR5cGUiKS52YWx1ZSA9ICJhbGwiCiAgICAgICAgICBxcygiI2dvIikuY2xpY2soKQogICAgICAgIH0KCiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCgogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJmaWx0ZXItbGlrZXMiKXsKICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnRvZ2dsZSgiZmlsdGVyLWxpa2VzIikKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLnRhcmdldC5pZCA9PSAic2hhcmUiKXsKICAgICAgICAgIGNvbnN0IGV2ZW50cyA9IHFzYSgiI2ltYWdlcyAuaXRlbSIpLmZpbHRlcihuID0+IG4ub2Zmc2V0UGFyZW50KS5tYXAobiA9PiBuWyJkYXRhLWV2ZW50Il0uaWQpCiAgICAgICAgICAvL2NvbnN0IHRleHQgPSB7dHlwZTogIiIsIGV2ZW50czogfQogICAgICAgICAgcXMoIiNzaGFyZS1kaWFsb2cgLmNvbnRlbnQiKS5pbm5lckhUTUwgPSAiPHA+U2hhcmUgbGluayB0byB0aGlzIGdhbGxlcnkgb2YgIiArIGV2ZW50cy5sZW5ndGggKyAiIGltYWdlcy92aWRlb3MgdG8geW91ciBub3N0ciBwcm9maWxlPzwvcD4iCiAgICAgICAgICBxcygiI3NoYXJlLWRpYWxvZyAuY29udGVudCIpLmlubmVySFRNTCArPSBwcmV2aWV3dXJscygpLm1hcCh1cmwgPT4gJzxpbWcgc3JjPSInK3VybCsnIi8+Jykuam9pbigiICIpCiAgICAgICAgICBxcygiI3NoYXJlLWZvcm0gLnN1Ym1pdCIpLnZhbHVlID0gInB1Ymxpc2giCiAgICAgICAgICBxc2EoIiNzaGFyZS1kaWFsb2csICNvdmVybGF5IikuZm9yRWFjaChuID0+IG4uY2xhc3NMaXN0LnRvZ2dsZSgidmlzaWJsZSIpKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNob3ciKSl7CiAgICAgICAgICBhY3RpdmUoKT8uY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIGNvbnN0IGlkID0gZS50YXJnZXQuaWQgfHwgZS50YXJnZXRbImRhdGEtaXRlbS1pZCJdCiAgICAgICAgICBnaWQoaWQpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBzaG93KGlkKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUudGFyZ2V0LnRhZ05hbWUgIT0gIkEiICYmIChxcygiI2ltYWdlLWNvbnRhaW5lciIpID09IGUudGFyZ2V0IHx8IHFzKCIjaW1hZ2UiKSA9PSBlLnRhcmdldCB8fCBxcygiI21lZGlhLWNvbnRhaW5lciB2aWRlbyIpID09IGUudGFyZ2V0KSl7CiAgICAgICAgICBoaWRlbWVkaWEoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLnRhcmdldC5pZCA9PSAibWVudSIpewogICAgICAgICAgbWVudSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJvdmVybGF5Iil7CiAgICAgICAgICBxc2EoIi5kaWFsb2cudmlzaWJsZSIpLmZvckVhY2gobiA9PiBuLmNsYXNzTGlzdC5yZW1vdmUoInZpc2libGUiKSkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNldGNvbHMiKSl7CiAgICAgICAgICBmb3IobGV0IGMgb2YgY29sb3B0cyl7CiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgiY29scyIgKyBjKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoImNvbHMiICsgZS50YXJnZXQuZGF0YXNldC5jb2xzKQogICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oImNvbHMiLCBlLnRhcmdldC5kYXRhc2V0LmNvbHMpCiAgICAgICAgICBzZXRhY3RpdmUoInNldGNvbHMiLCAiY29scyIsIGNvbHMoKSkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNldGF1dG9wbGF5IikpewogICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oImF1dG9wbGF5IiwgZS50YXJnZXQuZGF0YXNldC5hdXRvcGxheSkKICAgICAgICAgIHNldGFjdGl2ZSgic2V0YXV0b3BsYXkiLCAiYXV0b3BsYXkiLCBhdXRvcGxheSgpKQogICAgICAgICAgdXBkYXRlYWxsdmlkZW9wbGF5KCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoImxpa2UiKSAmJiBsaWtlKGUudGFyZ2V0KQogICAgICB9KQogICAgICAKICAgICAgZnVuY3Rpb24gaGFza2V5KCl7CiAgICAgICAgcmV0dXJuIHdpbmRvdy5ub3N0ciB8fCBwcml2a2V5KCkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcHVia2V5KCl7CiAgICAgICAgcmV0dXJuIHdpbmRvdy5ub3N0ciAmJiBhd2FpdCB3aW5kb3cubm9zdHIuZ2V0UHVibGljS2V5KCkgfHwgTm9zdHJUb29scy5nZXRQdWJsaWNLZXkocHJpdmtleSgpKQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBzaWduKGV2ZW50KXsKICAgICAgICBpZih3aW5kb3cubm9zdHIpewogICAgICAgICAgcmV0dXJuIGF3YWl0IG5vc3RyLnNpZ25FdmVudChldmVudCkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZXZlbnQuc2lnID0gTm9zdHJUb29scy5nZXRTaWduYXR1cmUoZXZlbnQsIHByaXZrZXkoKSkKICAgICAgICByZXR1cm4gZXZlbnQKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gbGlrZShsaW5rKXsKICAgICAgICBjb25zdCBldmVudCA9IGxpbmsucGFyZW50RWxlbWVudFsiZGF0YS1ldmVudCJdCiAgICAgICAgCiAgICAgICAgYXdhaXQgcHVibGlzaCh7CiAgICAgICAgICAia2luZCI6IDcsCiAgICAgICAgICAiY29udGVudCI6ICIrIiwKICAgICAgICAgICJ0YWdzIjogWwogICAgICAgICAgICBbImUiLCBldmVudC5pZF0sCiAgICAgICAgICAgIFsicCIsIGV2ZW50LnB1YmtleV0KICAgICAgICAgIF0KICAgICAgICB9KQoKICAgICAgICBsaW5rLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQoKICAgICAgICBjb25zdCBpbWFnZWlkID0gbGlua1siZGF0YS1pdGVtLWlkIl0gfHwgbGluay5kYXRhc2V0LmltYWdlSWQKICAgICAgICAKICAgICAgICBpZihpbWFnZWlkKXsKICAgICAgICAgIGdpZChpbWFnZWlkKS5xdWVyeVNlbGVjdG9yKCIubGlrZSIpLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQogICAgICAgIH0KICAgICAgfQoKICAgICAgYXN5bmMgZnVuY3Rpb24gcHJlcGFyZV9ldmVudChldmVudCl7CiAgICAgICAgZXZlbnQucHVia2V5ID0gYXdhaXQgcHVia2V5KCkKICAgICAgICBldmVudC5jcmVhdGVkX2F0ID0gcGFyc2VJbnQoRGF0ZS5ub3coKSAvIDEwMDAsIDEwKQogICAgICAgIGV2ZW50LmlkID0gTm9zdHJUb29scy5nZXRFdmVudEhhc2goZXZlbnQpCiAgICAgICAgcmV0dXJuIGV2ZW50CiAgICAgIH0KICAgICAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBwdWJsaXNoKGV2ZW50KXsKICAgICAgICBldmVudCA9IGF3YWl0IHByZXBhcmVfZXZlbnQoZXZlbnQpCiAgICAgICAgbGV0IHNpZ25lZGV2ZW50ID0gYXdhaXQgc2lnbihldmVudCkKICAgICAgICBsZXQganNvbiA9IEpTT04uc3RyaW5naWZ5KFsiRVZFTlQiLCBzaWduZWRldmVudF0pCiAgICAgICAgc29ja2V0cy5mb3JFYWNoKHMgPT4gcy5zZW5kKGpzb24pKQogICAgICAgIAogICAgICAgIHJldHVybiBldmVudAogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBzd2lwZShvZmZzZXQpewogICAgICAgIGlmKGltYWdlb2Zmc2V0KG9mZnNldCkpewogICAgICAgICAgaW1hZ2VvZmZzZXQob2Zmc2V0KS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgdGhpc1tvZmZzZXQgPT0gLTEgJiYgImxhc3RhY3RpdmUiIHx8ICJhY3RpdmUiXSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgICB1cGRhdGVzaG93KCkKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZXNob3coKXsKICAgICAgICBpZihxcygiI21lZGlhLWNvbnRhaW5lciIpLmNsYXNzTGlzdC5jb250YWlucygidmlzaWJsZSIpKXsKICAgICAgICAgIGhpZGV2aWRlbygpCiAgICAgICAgICBzaG93KGFjdGl2ZSgpLmlkKQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIGUgPT4gewogICAgICAgIGlmKFsiVGFiIiwgIkFycm93TGVmdCIsICJBcnJvd1JpZ2h0IiwgIkFycm93VXAiLCAiQXJyb3dEb3duIl0uaW5jbHVkZXMoZS5rZXkpKXsKICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkVzY2FwZSIpewogICAgICAgICAgbWVudSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZS5rZXkgPT0gIkVudGVyIiAmJiBlLnRhcmdldC50YWdOYW1lID09ICJCT0RZIil7CiAgICAgICAgICBpZihxcygiI21lZGlhLWNvbnRhaW5lciIpLmNsYXNzTGlzdC5jb250YW5zKCJ2aXNpYmxlIikpewogICAgICAgICAgICBoaWRlbWVkaWEoKQogICAgICAgICAgICByZXR1cm4KICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgc2hvdyhhY3RpdmUoKS5pZCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93VXAiICYmIGltYWdlb2Zmc2V0KC1jb2xzKCkpKXsKICAgICAgICAgIGltYWdlb2Zmc2V0KC1jb2xzKCkpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBsYXN0YWN0aXZlKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIHVwZGF0ZXNob3coKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93RG93biIgJiYgaW1hZ2VvZmZzZXQoY29scygpKSl7CiAgICAgICAgICBpbWFnZW9mZnNldChjb2xzKCkpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBhY3RpdmUoKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgICAgdXBkYXRlc2hvdygpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dMZWZ0Iil7CiAgICAgICAgICBzd2lwZSgtMSkKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd1JpZ2h0Iil7CiAgICAgICAgICBzd2lwZSgxKQogICAgICAgIH0KICAgICAgfSkKCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGhhbmRsZXF1ZXJ5cmVzKHJlcywgc29ja2V0LCBxLCB0eXBlLCBzdGltZSl7CiAgICAgICAgc2F2ZShzb2NrZXQsIHJlcywgcSwgdHlwZSwgZmFsc2UsIGZhbHNlLCB0cnVlKQogICAgICAgIGxvZygicXVlcnkgcmVzIiwgcmVzLmxlbmd0aCwgc29ja2V0LnVybCkKICAgICAgICBxdWVyeWNvdW50LS0KICAgICAgICBpZihxdWVyeWNvdW50ID09IDApewogICAgICAgICAgcXMoIiNsb2FkaW5nIikuY2xhc3NMaXN0LnJlbW92ZSgidmlzaWJsZSIpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGxldCB3YWl0ID0gd2FpdG1zIC0gKERhdGUubm93KCkgLSBzdGltZSkKICAgICAgICBxdWVyeXdhaXQgPSBzbGVlcCh3YWl0KQogICAgICAgIGF3YWl0IHF1ZXJ5d2FpdC5wcm9taXNlCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHByaW1hbGdsb2JhbChzb2NrZXQpewogICAgICAgIGxvZygiZ2xvYmFsIiwgc29ja2V0LnVybCkKICAgICAgICBxdWVyeWNvdW50KysKICAgICAgICBxcygiI2xvYWRpbmciKS5jbGFzc0xpc3QuYWRkKCJ2aXNpYmxlIikKICAgICAgICBsZXQgc3RpbWUgPSBEYXRlLm5vdygpCiAgICAgICAgbGV0IHFpZCA9ICJnbG9iYWxfIiArICgrK2lkY291bnRlcikKICAgICAgICBsZXQgcWlkbGlrZXMgPSAibGlrZXNfIiArICgrK2lkY291bnRlcikKCiAgICAgICAgaWYobmV3bGlrZXMubGVuZ3RoID4gMCl7CiAgICAgICAgICBwcmltYWxzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeShbCiAgICAgICAgICAgICJSRVEiLCAKICAgICAgICAgICAgcWlkbGlrZXMsIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgImNhY2hlIjogWwogICAgICAgICAgICAgICAgImV2ZW50cyIsIHsKICAgICAgICAgICAgICAgICAgImV2ZW50X2lkcyI6IG5ld2xpa2VzCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgXQogICAgICAgICAgICB9CiAgICAgICAgICBdKSkKCiAgICAgICAgICBjb25zdCBsaWtlX2V2ZW50cyA9IChhd2FpdCB3YWl0cmVzKHFpZGxpa2VzKSlbMF0KICAgICAgICAgIG5ld2xpa2VzLnNwbGljZSgwKQogICAgICAgICAgCiAgICAgICAgICBhd2FpdCBzYXZlKHNvY2tldCwgbGlrZV9ldmVudHMsICIiLCAiYWxsIiwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KFsKICAgICAgICAgICJSRVEiLCAKICAgICAgICAgIHFpZCwgCiAgICAgICAgICB7CiAgICAgICAgICAgICJjYWNoZSI6IFsKICAgICAgICAgICAgICAiZXhwbG9yZSIsIAogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJ0aW1lZnJhbWUiOiAibGF0ZXN0IiwKICAgICAgICAgICAgICAgICJzY29wZSI6ICJnbG9iYWwiLAogICAgICAgICAgICAgICAgImxpbWl0IjogNTAKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdKSkKICAgICAgICAKICAgICAgICBjb25zdCByZXMgPSAoYXdhaXQgd2FpdHJlcyhxaWQpKVswXQogICAgICAgIGF3YWl0IGhhbmRsZXF1ZXJ5cmVzKHJlcy5maWx0ZXIoZSA9PiBlLmtpbmQgPT0gMSksIHNvY2tldCwgIiIsICJhbGwiLCBzdGltZSkKICAgICAgICBwcmltYWxnbG9iYWwoc29ja2V0KQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeShzb2NrZXQsIHByaW1hbCl7CiAgICAgICAgbG9nKCJxdWVyeSIsIHNvY2tldC51cmwpCiAgICAgICAgcXVlcnljb3VudCsrCiAgICAgICAgcXMoIiNsb2FkaW5nIikuY2xhc3NMaXN0LmFkZCgidmlzaWJsZSIpCiAgICAgICAgCiAgICAgICAgbGV0IHN0aW1lID0gRGF0ZS5ub3coKQogICAgICAgIGxldCBxID0gcXVlcnlzdHIudHJpbSgpCiAgICAgICAgbGV0IHR5cGUgPSBxdWVyeXR5cGUoKQogICAgICAgIGxldCBpID0gKytpZGNvdW50ZXIKICAgICAgICBsZXQgcWlkID0gInF1ZXJ5XyIgKyBpCiAgICAgICAgY29uc3QgbGlrZXNyZXMgPSBhd2FpdCBxdWVyeWxpa2VzKHNvY2tldCkKICAgICAgICAKICAgICAgICBsaWtlc3Jlcy5mb3JFYWNoKGV2ZW50aWQgPT4gewogICAgICAgICAgaWYoIWxpa2VzLmluY2x1ZGVzKGV2ZW50aWQpKXsKICAgICAgICAgICAgbGlrZXMucHVzaChldmVudGlkKQogICAgICAgICAgICBuZXdsaWtlcy5wdXNoKGV2ZW50aWQpCiAgICAgICAgICB9CiAgICAgICAgfSkKICAgICAgICAKICAgICAgICBsZXQgZ2FsbGVyeW1hdGNoID0gcXVlcnlzdHIubWF0Y2goL2c6KFthLXowLTldKykvKQogICAgICAgIGxldCBwdWJrZXltYXRjaCA9IHF1ZXJ5c3RyLm1hdGNoKC9rOihbYS16MC05XSspLykKICAgICAgICBsZXQgcmVzID0gbnVsbAogICAgICAgIAogICAgICAgIGlmKGdhbGxlcnltYXRjaCl7CiAgICAgICAgICBjb25zdCBnYWxsZXJ5cmVzID0gYXdhaXQgcXVlcnlldmVudHMoc29ja2V0LCBbMzMzXSwgW2dhbGxlcnltYXRjaFsxXV0sIG51bGwpCiAgICAgICAgICBjb25zdCBldmVudGlkcyA9IEpTT04ucGFyc2UoZ2FsbGVyeXJlc1swXS5jb250ZW50KQogICAgICAgICAgcmVzID0gYXdhaXQgcXVlcnlldmVudHMoc29ja2V0LCBbMV0sIGV2ZW50aWRzLCBudWxsKQogICAgICAgIH0KICAgICAgICBlbHNlIGlmKHB1YmtleW1hdGNoKXsKICAgICAgICAgIGNvbnN0IGtleSA9IHB1YmtleW1hdGNoWzFdLmluZGV4T2YoIm5wdWIiKSA9PSAwICYmIHRvaGV4KHB1YmtleW1hdGNoWzFdKSB8fCBwdWJrZXltYXRjaFsxXQogICAgICAgICAgcmVzID0gYXdhaXQgcXVlcnlldmVudHMoc29ja2V0LCBbMV0sIG51bGwsIFtrZXldKQogICAgICAgIH0KICAgICAgICBlbHNlewogICAgICAgICAgbGV0IGZpbHRlcnMgPSBbXQoKICAgICAgICAgIGZpbHRlcnMucHVzaCguLi4odHlwZXNbdHlwZV0gfHwgW10pLm1hcCgodCkgPT4gewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgIGtpbmRzOiBbMV0sIAogICAgICAgICAgICAgIHNlYXJjaDogIi4iICsgdCwKICAgICAgICAgICAgICBsaW1pdDogMjAKICAgICAgICAgICAgfQogICAgICAgICAgfSkpCiAgICAgICAgICAKICAgICAgICAgIGlmKHEubGVuZ3RoID4gMCl7CiAgICAgICAgICAgIGZpbHRlcnMucHVzaCh7a2luZHM6IFsxXSwgc2VhcmNoOiBxfSkKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgaWYoZmlsdGVycy5sZW5ndGggPT0gMCl7CiAgICAgICAgICAgIGZpbHRlcnMucHVzaCh7a2luZHM6IFsxXX0pCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIGNvbnN0IHNlYXJjaG9iaiA9IFsiUkVRIiwgcWlkLCAuLi5maWx0ZXJzXQogICAgICAgICAgY29uc3Qgc2VhcmNoanNvbiA9IEpTT04uc3RyaW5naWZ5KHNlYXJjaG9iaikKICAgICAgICAgIHNvY2tldC5zZW5kKHNlYXJjaGpzb24pCiAgICAgICAgICAKICAgICAgICAgIHJlcyA9IChhd2FpdCB3YWl0cmVzKHFpZCkpWzBdCiAgICAgICAgICAKICAgICAgICAgIHJlcyA9IHJlcy5maWx0ZXIobyA9PiB7CiAgICAgICAgICAgIGlmKHEubGVuZ3RoID4gMCl7CiAgICAgICAgICAgICAgZm9yKGxldCB3b3JkIG9mIHEuc3BsaXQoIiAiKSl7CiAgICAgICAgICAgICAgICBpZihvLmNvbnRlbnQudG9Mb3dlckNhc2UoKS5pbmRleE9mKHdvcmQudG9Mb3dlckNhc2UoKSkgPT0gLTEpewogICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2UKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlCiAgICAgICAgICB9KQogICAgICAgIH0KICAgICAgICAKICAgICAgICBhd2FpdCBoYW5kbGVxdWVyeXJlcyhyZXMsIHNvY2tldCwgcSwgdHlwZSwgc3RpbWUpCiAgICAgICAgcXVlcnkoc29ja2V0KQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeWxpa2VzKHNvY2tldCl7CiAgICAgICAgaWYoIWhhc2tleSgpKXsKICAgICAgICAgIHJldHVybiBbXQogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBteXB1YmtleSA9IGF3YWl0IHB1YmtleSgpCiAgICAgICAgY29uc3QgZXZlbnRzID0gYXdhaXQgcXVlcnlldmVudHMoc29ja2V0LCBbN10sIG51bGwsIFtteXB1YmtleV0pCiAgICAgICAgcmV0dXJuIGV2ZW50cy5tYXAoZSA9PiBlLnRhZ3MuZmluZCh0ID0+IHRbMF0gPT0gImUiKVsxXSkKICAgICAgfQoKICAgICAgYXN5bmMgZnVuY3Rpb24gcXVlcnlldmVudHMoc29ja2V0LCBraW5kcywgZXZlbnRpZHMsIGF1dGhvcnMpewogICAgICAgIGNvbnN0IHF1ZXJ5aWQgPSAiZXZlbnRzXyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgY29uc3QgZmlsdGVycyA9IHt9CiAgICAgICAgCiAgICAgICAgZmlsdGVycy5raW5kcyA9IGtpbmRzCiAgICAgICAgCiAgICAgICAgaWYoZXZlbnRpZHMpewogICAgICAgICAgZmlsdGVyc1siaWRzIl0gPSBldmVudGlkcwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihhdXRob3JzKXsKICAgICAgICAgIGZpbHRlcnNbImF1dGhvcnMiXSA9IGF1dGhvcnMKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KFsKICAgICAgICAgICJSRVEiLCAKICAgICAgICAgIHF1ZXJ5aWQsIAogICAgICAgICAgZmlsdGVycwogICAgICAgIF0pCiAgICAgICAgCiAgICAgICAgc29ja2V0LnNlbmQoanNvbikKICAgICAgICAKICAgICAgICByZXR1cm4gKGF3YWl0IHdhaXRyZXMocXVlcnlpZCkpWzBdIHx8IFtdCiAgICAgIH0KCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHNhdmUoc29ja2V0LCBldmVudHMsIHEsIHF0eXBlLCByZWFjdGVkLCBhcHBlbmQsIHF1ZXJ5bWV0YSl7CiAgICAgICAgbGV0IGV2ZW50cHVia2V5cyA9IFtdCiAgICAgICAgbGV0IHJlc3VsdHMgPSBbXQogICAgICAgIGNvbnN0IGV2ZW50aWRzID0gZXZlbnRzLm1hcChlID0+IGUuaWQpCiAgICAgICAgbGV0IG5ld3VybHMgPSBbXQogICAgICAgIAogICAgICAgIGZvcihsZXQgZXZlbnQgb2YgZXZlbnRzKXsKICAgICAgICAgIGxldCB1cmxzbWF0Y2ggPSBbXQogICAgICAgICAgCiAgICAgICAgICBpZihxdHlwZSAhPSAidmlkZW8iKXsKICAgICAgICAgICAgdXJsc21hdGNoLnB1c2goLi4uKGV2ZW50LmNvbnRlbnQubWF0Y2goaW1ncmVnZXgpIHx8IFtdKSkKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgaWYocXR5cGUgIT0gImltYWdlIil7CiAgICAgICAgICAgIHVybHNtYXRjaC5wdXNoKC4uLihldmVudC5jb250ZW50Lm1hdGNoKHZpZGVvcmVnZXgpIHx8IFtdKSkKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgdXJsc21hdGNoID0gdXJsc21hdGNoLmZpbHRlcih1cmwgPT4gIXVybHMuaW5jbHVkZXModXJsKSkKCiAgICAgICAgICBpZih1cmxzbWF0Y2gubGVuZ3RoID4gMCl7CiAgICAgICAgICAgIG5ld3VybHMucHVzaCh7CiAgICAgICAgICAgICAgZXZlbnQ6IGV2ZW50LAogICAgICAgICAgICAgIHVybHM6IHVybHNtYXRjaAogICAgICAgICAgICB9KQogICAgICAgICAgICAKICAgICAgICAgICAgdXJscy5wdXNoKC4uLnVybHNtYXRjaCkKICAgICAgICAgICAgZXZlbnRwdWJrZXlzLmluY2x1ZGVzKGV2ZW50LnB1YmtleSkgfHwgZXZlbnRwdWJrZXlzLnB1c2goZXZlbnQucHVia2V5KQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICBsb2coInF1ZXJ5IG1ldGEiLCBzb2NrZXQudXJsKQogICAgICAgIGxldCBtZXRhZXZlbnRzID0gKHF1ZXJ5bWV0YSAmJiBhd2FpdCBxdWVyeWV2ZW50cyhzb2NrZXQsIFswXSwgbnVsbCwgZXZlbnRwdWJrZXlzKSB8fCBbXSkKICAgICAgICAKICAgICAgICBmb3IobGV0IGVudHJ5IG9mIG5ld3VybHMpewogICAgICAgICAgZm9yKGxldCB1cmwgb2YgZW50cnkudXJscyl7CiAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7CiAgICAgICAgICAgICAgcmVhY3RlZDogcmVhY3RlZCB8fCBsaWtlcy5pbmNsdWRlcyhlbnRyeS5ldmVudC5pZCksIAogICAgICAgICAgICAgIHVybDogdXJsLCAKICAgICAgICAgICAgICBldmVudDogZW50cnkuZXZlbnQsIAogICAgICAgICAgICAgIGJlY2gzMmlkOiBiZWNoMzIuZW5jb2RlKCJub3RlIiwgZnJvbUhleFN0cmluZyhlbnRyeS5ldmVudC5pZCkpLAogICAgICAgICAgICAgIG1ldGE6IG1ldGFldmVudHMuZmluZChvID0+IG8ucHVia2V5ID09IGVudHJ5LmV2ZW50LnB1YmtleSkKICAgICAgICAgICAgfSkKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbG9nKCJzYXZlIHJlcyIsIHJlc3VsdHMubGVuZ3RoLCBzb2NrZXQudXJsKQogICAgICAgIHVwZGF0ZWNvbnRlbnQocmVzdWx0cywgcSwgYXBwZW5kKQogICAgICB9CiAgICAgIAogICAgICBsZXQgbG9hZGVkID0gMAogICAgICAKICAgICAgZnVuY3Rpb24gdXBkYXRlY29udGVudChyZXN1bHRzLCBxLCBhcHBlbmQpewogICAgICAgIHJlc3VsdHMucmV2ZXJzZSgpLmZvckVhY2goaXRlbSA9PiB7CiAgICAgICAgICBjb25zdCB0eXBlID0gaXRlbS51cmwubWF0Y2godmlkZW9leHRyZWdleCkgJiYgInZpZGVvIiB8fCAiaW1hZ2UiCiAgICAgICAgICBjb25zdCB0ZXh0ID0gKHEgfHwgInZpZXcgbm90ZSIpLnN1YnN0cmluZygtMzApCiAgICAgICAgICBjb25zdCBpZCA9ICJpdGVtXyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgICBjb25zdCBjb250ZW50ZWxlbWVudHMgPSAnPGRpdiBjbGFzcz0idHlwZSI+JyArIHFzKCIjdGVtcGxhdGUgLiIgKyB0eXBlICsgInN2ZyIpLm91dGVySFRNTCArICc8L2Rpdj48YSBjbGFzcz0ibGlrZScgKyAoaXRlbS5yZWFjdGVkID8gJyByZWFjdGVkJyA6ICcnKSArICciIGRhdGEtaXRlbS1pZD0iJyArIGlkICsgCiAgICAgICAgICAgICciIGhyZWY9IiMiPicgKyBxcygiI3RlbXBsYXRlIC5oZWFydHN2ZyIpLm91dGVySFRNTCArICc8L2E+PGEgY2xhc3M9InF1ZXJ5IGxpbmsiIGhyZWY9IicgKyBwcm90b2NvbCArIAogICAgICAgICAgICBpdGVtLmJlY2gzMmlkICsgJyI+JyArIHRleHQgKyAnPC9hPicKICAgICAgICAgIGxldCByb290ID0gbnVsbAogICAgICAgICAgbGV0IHYgPSBudWxsCiAgICAgICAgICAKICAgICAgICAgIGlmKGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpKXsKICAgICAgICAgICAgcm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpCiAgICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgidmlkZW8tY29udGFpbmVyIikKICAgICAgICAgICAgcm9vdC5pbm5lckhUTUwgPSBjb250ZW50ZWxlbWVudHMKICAgICAgICAgICAgCiAgICAgICAgICAgIHYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpCiAgICAgICAgICAgIHYuY2xhc3NMaXN0LmFkZCgic2hvdyIpCiAgICAgICAgICAgIHZbImRhdGEtaXRlbS1pZCJdID0gaWQKICAgICAgICAgICAgdi5wcmVsb2FkID0gIm5vbmUiCiAgICAgICAgICAgIHYubG9vcCA9IHRydWUKICAgICAgICAgICAgdi5wbGF5c2lubGluZSA9ICIiCiAgICAgICAgICAgIAogICAgICAgICAgICB2Lm9uY2FucGxheSA9IGFzeW5jIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIGNvbnN0IGFzcGVjdCA9IHRoaXMudmlkZW9XaWR0aCAvIHRoaXMudmlkZW9IZWlnaHQKICAgICAgICAgICAgICBpZihhc3BlY3QgPiAxKXsKICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUud2lkdGggPSAoYXNwZWN0ICogMTAwKSArICIlIgogICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgdGhpcy5zdHlsZS5oZWlnaHQgPSAoMSAvIGFzcGVjdCAqIDEwMCkgKyAiJSIKICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUubWFyZ2luVG9wID0gLSgoMSAvIGFzcGVjdCAqIDEwMCAtIDEwMCkgLyAyKSArICIlIgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAKICAgICAgICAgICAgICB1cGRhdGV2aWRlb3BsYXkodGhpcy5wYXJlbnRFbGVtZW50KQogICAgICAgICAgICB9CgogICAgICAgICAgICBjb25zdCBleHQgPSBpdGVtLnVybC5tYXRjaCh2aWRlb2V4dHJlZ2V4KVsxXQogICAgICAgICAgICB2LmlubmVySFRNTCA9ICc8c291cmNlIHNyYz0iJyArIGl0ZW0udXJsICsgJyIgdHlwZT0idmlkZW8vJyArIGV4dCArICciPjwvc291cmNlPicKICAgICAgICAgICAgCiAgICAgICAgICAgIHJvb3QuYXBwZW5kKHYpCiAgICAgICAgICB9ZWxzZSBpZihpdGVtLnVybC5tYXRjaChpbWdleHRyZWdleCkpewogICAgICAgICAgICByb290ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpCiAgICAgICAgICAgIHJvb3QuaHJlZiA9ICIjIgogICAgICAgICAgICByb290LmlubmVySFRNTCA9IGNvbnRlbnRlbGVtZW50cwogICAgICAgICAgICAgIAogICAgICAgICAgICBpZih0eXBlID09ICJpbWFnZSIpewogICAgICAgICAgICAgIC8vbGV0IGltZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpCiAgICAgICAgICAgICAgLy9pbWcuYWx0ID0gaXRlbS51cmwKICAgICAgICAgICAgICByb290WyJkYXRhLXNyYyJdID0gaXRlbS51cmwKICAgICAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoImltZyIpCiAgICAgICAgICAgICAgLy9pbWcuY2xhc3NMaXN0LmFkZCgiZGF0YSIpCiAgICAgICAgICAgICAgLy9yb290LmFwcGVuZChpbWcpCiAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgIHJvb3QuaW5uZXJIVE1MICs9ICc8c3BhbiBjbGFzcz0iZmlsZSI+JyArIGl0ZW0udXJsICsgJzwvc3Bhbj4nCiAgICAgICAgICAgIH0KICAgICAgICAgIH1lbHNlewogICAgICAgICAgICByZXR1cm4KICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgcm9vdC5pZCA9IGlkCiAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoJ3Zpc2libGUnKQogICAgICAgICAgcm9vdFsiZGF0YS1pdGVtIl0gPSBpdGVtCiAgICAgICAgICByb290WyJkYXRhLWV2ZW50Il0gPSBpdGVtLmV2ZW50CiAgICAgICAgICByb290WyJkYXRhLXF1ZXJ5Il0gPSBxCiAgICAgICAgICByb290WyJkYXRhLXRleHQiXSA9IHRleHQKICAgICAgICAgIAogICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKHR5cGUpCiAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoIml0ZW0iKQogICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJzaG93IikKICAgICAgICAgIAogICAgICAgICAgaWYoaXRlbS5yZWFjdGVkKXsKICAgICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgcXMoIiNpbWFnZXMiKVthcHBlbmQgJiYgImFwcGVuZCIgfHwgInByZXBlbmQiXShyb290KQogICAgICAgICAgCiAgICAgICAgICBpZih2KXsKICAgICAgICAgICAgdXBkYXRldmlkZW9wbGF5KHJvb3QpCiAgICAgICAgICB9CiAgICAgICAgfSkKCiAgICAgICAgdXBkYXRlaW1hZ2VzbG9hZCgpCiAgICAgICAgCiAgICAgICAgaWYoYWN0aXZlKCkgPT0gbnVsbCl7CiAgICAgICAgICBxcygiI2ltYWdlcyAuaXRlbSIpPy5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgIH0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gaGlkZW1lZGlhKCl7CiAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICJzY3JvbGwiCiAgICAgICAgcXNhKCIjbWVkaWEtY29udGFpbmVyLCAjaW1hZ2UsICNtZWRpYS1mb290ZXIiKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QucmVtb3ZlKCJ2aXNpYmxlIikpCiAgICAgICAgZ2lkKCJpbWFnZS1saWtlIikuY2xhc3NMaXN0LnJlbW92ZSgicmVhY3RlZCIpCiAgICAgICAgaGlkZXZpZGVvKCkKICAgICAgfQoKICAgICAgZnVuY3Rpb24gaGlkZXZpZGVvKCl7CiAgICAgICAgY29uc3QgdiA9IHFzKCIjbWVkaWEtY29udGFpbmVyIHZpZGVvIikKICAgICAgICAKICAgICAgICBpZih2KXsKICAgICAgICAgIHYubXV0ZWQgPSB0cnVlCiAgICAgICAgICB2LmNsYXNzTGlzdC5hZGQoInNob3ciKQogICAgICAgICAgZ2lkKHZbImRhdGEtaXRlbS1pZCJdKS5hcHBlbmRDaGlsZCh2KQogICAgICAgICAgdXBkYXRldmlkZW9wbGF5KHYucGFyZW50RWxlbWVudCkKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHdhaXRyZXMoa2V5LCB0eXBlKXsKICAgICAgICBsZXQgcmVzaGFuZGxlciA9IGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7CiAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlIHx8ICJFT1NFIgogICAgICAgICAgdGhpcy5ldmVudHMgPSBbXQogICAgICAgICAgdGhpcy5oYW5kbGUgPSBmdW5jdGlvbihyZXMpewogICAgICAgICAgICBsZXQgbyA9IEpTT04ucGFyc2UocmVzLmRhdGEpCiAgICAgICAgICAgIGlmKGtleSA9PSBudWxsIHx8IG9bMV0gPT0ga2V5KXsKICAgICAgICAgICAgICBpZihvWzBdID09IHRoaXMudHlwZSl7CiAgICAgICAgICAgICAgICByZXNvbHZlKFt0aGlzLmV2ZW50cywgb10pCiAgICAgICAgICAgICAgICByZXNoYW5kbGVycy5zcGxpY2UocmVzaGFuZGxlcnMuaW5kZXhPZih0aGlzKSwgMSkKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgdGhpcy5ldmVudHMucHVzaChvWzJdKQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgICAgICBsZXQgaGFuZGxlciA9IG5ldyByZXNoYW5kbGVyKHJlc29sdmUsIHJlamVjdCkKICAgICAgICAgIHJlc2hhbmRsZXJzLnB1c2goaGFuZGxlcikKICAgICAgICB9KQogICAgICB9CiAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gY2hlY2t1cGRhdGUoc29ja2V0KXsKICAgICAgICBjb25zdCB1cGRhdGVzcmVzID0gYXdhaXQgcXVlcnlldmVudHMoc29ja2V0LCBbMV0sIG51bGwsIFt1cGRhdGVzcHVia2V5XSkKICAgICAgICBjb25zdCB1cGRhdGVub3RlID0gdXBkYXRlc3Jlcy5maW5kKG4gPT4gbi5jb250ZW50Lm1hdGNoKC9eaHR0cHNcOlwvXC8vKSkKICAgICAgICAKICAgICAgICBpZighdXBkYXRlbm90ZSl7CiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QgYWdlID0gTWF0aC5yb3VuZCgoRGF0ZS5ub3coKSAvIDEwMDAgLSB1cGRhdGVub3RlLmNyZWF0ZWRfYXQpIC8gMzYwMCAvIDI0KQogICAgICAgIGNvbnN0IG5vdGVpZCA9IGJlY2gzMi5lbmNvZGUoIm5vdGUiLCBmcm9tSGV4U3RyaW5nKHVwZGF0ZW5vdGUuaWQpKQogICAgICAgIHFzKCIjcmVsZWFzZSIpLmhyZWYgPSBwcm90b2NvbCArIG5vdGVpZAogICAgICAgIHFzKCIjcmVsZWFzZSIpLmlubmVyVGV4dCA9IChhZ2UgPT0gMCAmJiAidG9kYXkiIHx8IGFnZSArICIgZGF5KHMpIGFnbyIpCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHNsZWVwKG1zKXsKICAgICAgICByZXR1cm4gbmV3IGZ1bmN0aW9uKCl7CiAgICAgICAgICBsZXQgdGltZW91dCA9IG51bGwKICAgICAgICAgIGxldCByID0gbnVsbAogICAgICAgICAgCiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICBwcm9taXNlOiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpewogICAgICAgICAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHJlc29sdmUoKSwgbXMpCiAgICAgICAgICAgICAgciA9IHJlc29sdmUKICAgICAgICAgICAgfSksCiAgICAgICAgICAgIHJlc29sdmU6IGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpCiAgICAgICAgICAgICAgcigpCiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHNob3coaWQpewogICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAiaGlkZGVuIgogICAgICAgIGNvbnN0IGl0ZW0gPSBnaWQoaWQpWyJkYXRhLWl0ZW0iXQogICAgICAgIGNvbnN0IG1lZGlhID0gZ2lkKCJtZWRpYS1jb250YWluZXIiKQogICAgICAgIGNvbnN0IGltYWdlID0gZ2lkKCJpbWFnZSIpCgogICAgICAgIGlmKGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpKXsKICAgICAgICAgIGltYWdlLmNsYXNzTGlzdC5yZW1vdmUoInZpc2libGUiKQogICAgICAgICAgY29uc3QgdiA9IGdpZChpZCkucXVlcnlTZWxlY3RvcigidmlkZW8iKQogICAgICAgICAgcXMoIiNtZWRpYS1jb250YWluZXIiKS5hcHBlbmRDaGlsZCh2KQogICAgICAgICAgdi5tdXRlZCA9IGZhbHNlCiAgICAgICAgICB2LmNsYXNzTGlzdC5yZW1vdmUoInNob3ciKQogICAgICAgICAgdi5wbGF5KCkKICAgICAgICB9ZWxzZXsKICAgICAgICAgIGltYWdlLnNyYyA9IGl0ZW0udXJsCiAgICAgICAgICBpbWFnZS5jbGFzc0xpc3QuYWRkKCJ2aXNpYmxlIikKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoaXRlbS5tZXRhKXsKICAgICAgICAgIGNvbnN0IG1ldGFjb250ZW50ID0gSlNPTi5wYXJzZShpdGVtLm1ldGEuY29udGVudCkKICAgICAgICAgIGNvbnN0IG5hbWUgPSBtZXRhY29udGVudC5kaXNwbGF5X25hbWUgfHwgbWV0YWNvbnRlbnQubmFtZQogICAgICAgICAgcXMoIiNpbWFnZS11c2VyIikuY2xhc3NMaXN0LmFkZCgidmlzaWJsZSIpCiAgICAgICAgICBxcygiI2ltYWdlLXVzZXIiKS5ocmVmID0gIj9wdWJrZXk9IiArIGl0ZW0ubWV0YS5wdWJrZXkvL3Byb3RvY29sICsgYmVjaDMyLmVuY29kZSgibnB1YiIsIGZyb21IZXhTdHJpbmcoaXRlbS5tZXRhLnB1YmtleSkpCiAgICAgICAgICBxcygiI2ltYWdlLXVzZXIiKS5pbm5lclRleHQgPSBuYW1lCiAgICAgICAgfWVsc2V7CiAgICAgICAgICBxcygiI2ltYWdlLXVzZXIiKS5jbGFzc0xpc3QucmVtb3ZlKCJ2aXNpYmxlIikKICAgICAgICB9CgogICAgICAgIGdpZCgiaW1hZ2UtbGlrZSIpWyJkYXRhLWl0ZW0taWQiXSA9IGlkCiAgICAgICAgZ2lkKCJtZWRpYS1mb290ZXIiKVsiZGF0YS1ldmVudCJdID0gaXRlbS5ldmVudAoKICAgICAgICBpZihpdGVtLnJlYWN0ZWQpewogICAgICAgICAgZ2lkKCJpbWFnZS1saWtlIikuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IGEgPSBxcygiI2ltYWdlLXF1ZXJ5IikKICAgICAgICBhLmhyZWYgPSBwcm90b2NvbCArIGl0ZW0uYmVjaDMyaWQKICAgICAgICBhLmlubmVyVGV4dCA9IGdpZChpZClbImRhdGEtdGV4dCJdCiAgICAgICAgCiAgICAgICAgZ2lkKCJtZWRpYS1jb250YWluZXIiKS5jbGFzc0xpc3QuYWRkKCJ2aXNpYmxlIikKICAgICAgICBnaWQoIm1lZGlhLWZvb3RlciIpLmNsYXNzTGlzdC5hZGQoInZpc2libGUiKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBjb25uY291bnQoKXsKICAgICAgICByZXR1cm4gc29ja2V0cy5maWx0ZXIociA9PiByLnJlYWR5U3RhdGUgPT0gMSkubGVuZ3RoCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGRpc2Nvbm5lY3QoKXsKICAgICAgICBmb3IobGV0IHNvY2tldCBvZiBzb2NrZXRzKXsKICAgICAgICAgIHNvY2tldC5jbG9zZSgpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHNvY2tldHMuc3BsaWNlKDApCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGxvZyhtc2cpewogICAgICAgIGxldCBzY3JvbGwgPSBxcygiI2xvZ3MiKS5zY3JvbGxUb3AgPT0gcXMoIiNsb2dzIikuc2Nyb2xsVG9wTWF4CiAgICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikKICAgICAgICBkaXYuaW5uZXJUZXh0ID0gQXJyYXkuZnJvbShhcmd1bWVudHMpLmpvaW4oIiAiKQogICAgICAgIHFzKCIjbG9ncyIpLmFwcGVuZChkaXYpCiAgICAgICAgCiAgICAgICAgc2Nyb2xsICYmIHFzKCIjbG9ncyIpLnNjcm9sbFRvKDAsIHFzKCIjbG9ncyIpLnNjcm9sbFRvcE1heCkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gY29ubmVjdCh1cmwpewogICAgICAgIGxvZygiY29ubmVjdGluZyIsIHVybCkKICAgICAgICBsZXQgc29ja2V0ID0gbmV3IFdlYlNvY2tldCh1cmwpCiAgICAgICAgCiAgICAgICAgc29ja2V0Lm9ubWVzc2FnZSA9IG1lc3NhZ2UgPT4gcmVzaGFuZGxlcnMuZm9yRWFjaChyaCA9PiByaC5oYW5kbGUobWVzc2FnZSkpCiAgICAgICAgCiAgICAgICAgc29ja2V0Lm9uY2xvc2UgPSBhc3luYyBmdW5jdGlvbigpewogICAgICAgICAgc29ja2V0cy5zcGxpY2Uoc29ja2V0cy5pbmRleE9mKHNvY2tldCksIDEpCiAgICAgICAgICBxcygiI2Nvbm5jb3VudCIpLmlubmVyVGV4dCA9IGNvbm5jb3VudCgpICsgKHByaW1hbHNvY2tldCAmJiAxKQogICAgICAgICAgbG9nKCJkaXNjb25uZWN0ZWQiLCB0aGlzLnVybCwgY29ubmNvdW50KCkpCiAgICAgICAgICBhd2FpdCBzbGVlcCgxMDAwKS5wcm9taXNlCiAgICAgICAgICBjb25uZWN0KHRoaXMudXJsKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBzb2NrZXQub25vcGVuID0gZnVuY3Rpb24oKXsKICAgICAgICAgIHFzKCIjY29ubmNvdW50IikuaW5uZXJUZXh0ID0gY29ubmNvdW50KCkgKyAocHJpbWFsc29ja2V0ICYmIDEpCiAgICAgICAgICBsb2coImNvbm5lY3RlZCIsIHRoaXMudXJsLCBjb25uY291bnQoKSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuIHNvY2tldAogICAgICB9CiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgYXN5bmMgKCkgPT4gewogICAgICAgIHByaW1hbHNvY2tldCA9IGNvbm5lY3QoIndzczovL2NhY2hlMy5wcmltYWwubmV0L2NhY2hlMTciKQogICAgICAgIHByaW1hbHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCJvcGVuIiwgZnVuY3Rpb24oKXsKICAgICAgICAgIHByaW1hbGdsb2JhbCh0aGlzKQogICAgICAgIH0pCiAgICAgICAgCiAgICAgICAgcHJpbWFsc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoImNsb3NlIiwgZnVuY3Rpb24oKXsKICAgICAgICAgIHByaW1hbHNvY2tldCA9IG51bGwKICAgICAgICB9KQogICAgICAgIAogICAgICAgIGZvcihsZXQgdXJsIG9mIHJlbGF5cygpKXsKICAgICAgICAgIGNvbnN0IHNvY2tldCA9IGNvbm5lY3QodXJsKQogICAgICAgICAgc29ja2V0cy5wdXNoKHNvY2tldCkKICAgICAgICAgIAogICAgICAgICAgc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoIm9wZW4iLCBmdW5jdGlvbigpewogICAgICAgICAgICBjaGVja3VwZGF0ZSh0aGlzKQogICAgICAgICAgICBxdWVyeSh0aGlzKQogICAgICAgICAgfSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgYXdhaXQgc2xlZXAoMTAwKS5wcm9taXNlCiAgICAgICAgCiAgICAgICAgaWYoaGFza2V5KCkpewogICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJub3N0ciIpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgZm9yKGxldCBjIG9mIGNvbG9wdHMpewogICAgICAgIGRvY3VtZW50LndyaXRlKCc8c3R5bGU+JyArIGNvbHNjc3MuaW5uZXJUZXh0LnJlcGxhY2UoL1wkXHtjb2xzXH0vZywgYykgKyAnPC9zdHlsZT4nKQogICAgICB9CiAgICA8L3NjcmlwdD4KICA8L2JvZHk+CjwvaHRtbD4K

https://ipfs.io/ipfs/QmbjVqNZcUBDUvVCKfUz4xQMPiW1oGwywmEDBSoRFiMafb

sha256

a19240258381e45dd578ddb6cb9a6e1fc05969b3764da295700b2564b7e52ba8 files.html

base64

PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgdXNlci1zY2FsYWJsZT1ubyIvPgogICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL3N2Z2ljb25zLnNwYXJray5mci9zdmdpY29ucy5jc3MiLz4KICAgIDxzdHlsZT4KICAgICAgKiB7CiAgICAgICAgb3ZlcnNjcm9sbC1iZWhhdmlvci15OiBjb250YWluOwogICAgICB9CiAgICAgIAogICAgICBib2R5IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB3aWR0aDogMTAwdnc7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIGZvbnQtZmFtaWx5OiAiTm90byBTZXJpZiI7CiAgICAgIH0KICAgICAgCiAgICAgIC5wbGFjZWhvbGRlciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICBwYWRkaW5nOiAxZW07CiAgICAgIH0KICAgICAgCiAgICAgIGgxIHsKICAgICAgICBmb250LXNpemU6IDFlbTsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnlkaXNwbGF5LCAKICAgICAgI2hlYWRlciB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgfQogICAgICAKICAgICAgI3JlbGF5cywKICAgICAgI2xvZ3MsIAogICAgICAjcHJpdmtleSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgd2lkdGg6IDE4ZW07CiAgICAgICAgYmFja2dyb3VuZDogIzExMTsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgI3JlbGF5cywKICAgICAgI2xvZ3MgewogICAgICAgIGhlaWdodDogNmVtOwogICAgICB9CiAgICAgIAogICAgICAjbG9ncyB7CiAgICAgICAgaGVpZ2h0OiA4ZW07CiAgICAgICAgb3ZlcmZsb3c6IHNjcm9sbDsKICAgICAgICBmb250LXNpemU6IC44ZW07CiAgICAgIH0KICAgICAgCiAgICAgIHNlbGVjdCB7CiAgICAgICAgd2lkdGg6IDRlbTsKICAgICAgfQogICAgICAKICAgICAgI3JlbGF5cywgCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgYm9yZGVyLXJhZGl1czogLjVlbTsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSAudGV4dCwgCiAgICAgICNoZWFkZXIgYSwKICAgICAgI21lZGlhLWNvbnRhaW5lciB7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgYSwgCiAgICAgIGZvcm0sIAogICAgICAjcXVlcnlkaXNwbGF5IHsKICAgICAgICB6LWluZGV4OiAxOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgICAKICAgICAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAzMGVtKSB7CiAgICAgICAgI2hlYWRlciAudGl0bGUgewogICAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgI3F1ZXJ5ZGlzcGxheSB7CiAgICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIH0KICAgICAgfQoKICAgICAgZm9ybSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnkgewogICAgICAgIHdpZHRoOiA2ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNsb2FkaW5nIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDBweDsKICAgICAgICBsZWZ0OiAzMGVtOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICBhIHsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICAgIH0KCiAgICAgIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAKICAgICAgI21lZGlhLWNvbnRhaW5lciB2aWRlbyB7CiAgICAgICAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsKICAgICAgICBoZWlnaHQ6IDEwMCUgIWltcG9ydGFudDsKICAgICAgICBtYXJnaW4tdG9wOiAwICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgCiAgICAgIC50eXBlIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgei1pbmRleDogMTsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlLXF1ZXJ5IHsKICAgICAgICB3aWR0aDogNWVtOwogICAgICB9CiAgICAgIAogICAgICBhIHsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSwKICAgICAgYS5idXR0b24sCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgY29sb3I6ICM5OTk7CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgI3F1ZXJ5ZGlzcGxheSB7CiAgICAgICAgcGFkZGluZzogMCAxZW07CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICB9CgogICAgICAjcXVlcnlkaXNwbGF5IC50ZXh0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgbWluLXdpZHRoOiAzZW07CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIG1heC13aWR0aDogOGVtOwogICAgICB9CgogICAgICAjaGVhZGVyIGEsCiAgICAgICNoZWFkZXIgc3BhbiB7CiAgICAgICAgcGFkZGluZzogMC41ZW07CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgewogICAgICAgIHBhZGRpbmc6IDAuNDVlbSAwOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgLml0ZW1zIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBtYXJnaW4tdG9wOiAuM2VtOwogICAgICB9CgogICAgICBwIHsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICB9CiAgICAgIAogICAgICAubGFiZWwgewogICAgICAgIHBhZGRpbmc6IC44ZW0gLjhlbSAuOGVtIDA7CiAgICAgIH0KCiAgICAgICNpbWFnZXMgLnF1ZXJ5IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KCiAgICAgICNtZWRpYS1jb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwKTsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHotaW5kZXg6IDQ7CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZS1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIG1heC13aWR0aDogMTAwdnc7CiAgICAgICAgbWF4LWhlaWdodDogMTAwdmg7CiAgICAgIH0KICAgICAgICAKICAgICAgI2ltYWdlcyB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgI2ltYWdlcyAuaXRlbSB7CiAgICAgICAgd2lkdGg6IDI1dnc7CiAgICAgICAgaGVpZ2h0OiAyNXZ3OwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgLmRpYWxvZyBpbWcgewogICAgICAgIHdpZHRoOiAxNXZ3OwogICAgICB9CiAgICAgIAogICAgICAjbWVkaWEtY29udGFpbmVyIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CiAgICAgIAogICAgICBib2R5Om5vdCgubm9zdHIpICNoZWFkZXIgLmljb25zLCAKICAgICAgLmZpbHRlci1saWtlcyAjaW1hZ2VzID4gLml0ZW06bm90KC5yZWFjdGVkKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNpbWFnZS1xdWVyeSwKICAgICAgI2ltYWdlLXVzZXIgewogICAgICAgIHotaW5kZXg6IDI7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDN2dzsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHBhZGRpbmc6IDAgMXZ3OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNpbWFnZS1xdWVyeSwgCiAgICAgIC52aWRlb3N2ZywKICAgICAgLmltYWdlc3ZnIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsMCwwLDAuNik7CiAgICAgIH0KICAgICAgCiAgICAgIC5xdWVyeSwgCiAgICAgIC5saWtlLCAKICAgICAgI2ltYWdlLXF1ZXJ5IHsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgZm9udC1zaXplOiBtaW4oMy41dncsIDEuNWVtKTsKICAgICAgICBtYXgtd2lkdGg6IDVlbTsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlLXF1ZXJ5IHsKICAgICAgICBwYWRkaW5nOiAuNmVtIC40ZW0gLjFlbSAuNGVtOwogICAgICAgIG1heC13aWR0aDogNWVtOwogICAgICB9CiAgICAgIAogICAgICAubGlrZS5yZWFjdGVkLAogICAgICAuZmlsdGVyLWxpa2VzICNmaWx0ZXItbGlrZXMgewogICAgICAgIGJhY2tncm91bmQ6IHJlZDsKICAgICAgfQoKICAgICAgI2ltYWdlLXF1ZXJ5LAogICAgICAjaW1hZ2UtdXNlciB7CiAgICAgICAgZm9udC1zaXplOiAzZW07CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZS1xdWVyeSwKICAgICAgI2ltYWdlLXVzZXIsCiAgICAgICNtZWRpYS1mb290ZXIgLmxpa2UgewogICAgICAgIHotaW5kZXg6IDU7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICB9CiAgICAgIAogICAgICAjaW1hZ2UtcXVlcnksCiAgICAgICNpbWFnZS11c2VyIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQoKICAgICAgI2ltYWdlLXVzZXIgewogICAgICAgIGJvdHRvbTogMS45ZW07CiAgICAgICAgZm9udC1zaXplOiAxLjhlbTsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAuNjVlbTsKICAgICAgICBtYXgtd2lkdGg6IDhlbTsKICAgICAgfQogICAgICAKICAgICAgLmxpa2UgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogYXV0bzsKICAgICAgICBwYWRkaW5nOiAuMmVtOwogICAgICAgIHdpZHRoOiAxZW07CiAgICAgICAgaGVpZ2h0OiAxZW07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgfQoKICAgICAgLm5vc3RyIC5saWtlIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsgIAogICAgICB9CgogICAgICAjbWVkaWEtZm9vdGVyIC5saWtlIHsKICAgICAgICBmb250LXNpemU6IDIuNGVtOwogICAgICB9CgogICAgICAjbWVkaWEtZm9vdGVyIHsKICAgICAgICBkaXNwbGF5OiBub25lOyAgCiAgICAgIH0KICAKICAgICAgI2ltYWdlcyAuaW1nIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgYmFja2dyb3VuZC1zaXplOiBjb3ZlcjsKICAgICAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OwogICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlcjsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgLmJ1dHRvbi5hY3RpdmUgewogICAgICAgIGJhY2tncm91bmQ6ICM0NDQ7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZXMgPiAuYWN0aXZlIHsKICAgICAgICBvdXRsaW5lOiAuM2VtIHNvbGlkIGdyZWVuOwogICAgICAgIHotaW5kZXg6IDE7CiAgICAgIH0KCiAgICAgIC5oZWFydHN2ZyBwYXRoLAogICAgICAuaGVhZGVyLWljb24gc3ZnIHBhdGggewogICAgICAgIHN0cm9rZTogI2ZmZjsKICAgICAgfQogIAogICAgICAudmlkZW9zdmcsCiAgICAgIC5pbWFnZXN2ZyB7CiAgICAgICAgd2lkdGg6IGNhbGMobWluKDR2dywgMmVtKSk7CiAgICAgICAgaGVpZ2h0OiBjYWxjKG1pbig0dncsIDJlbSkpOwogICAgICAgIHBhZGRpbmc6IDAgLjJlbTsKICAgICAgfQogICAgICAKICAgICAgLnZpZGVvc3ZnIHBhdGgsCiAgICAgIC5pbWFnZXN2ZyBwYXRoIHsKICAgICAgICBmaWxsOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICBhI21lbnUsIAogICAgICAuaGVhZGVyLWljb24gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgIH0KCiAgICAgIC5pY29ucyB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIHotaW5kZXg6IDI7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgfQogICAgICAKICAgICAgYSNtZW51IHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBwYWRkaW5nOiAwIC41ZW07CiAgICAgICAgbWFyZ2luLXRvcDogLS4zZW07CiAgICAgICAgaGVpZ2h0OiAyLjNlbTsKICAgICAgfQogICAgICAKICAgICAgI2hlYWRlciAuaGVhZGVyLWljb24gewogICAgICAgIHBhZGRpbmc6IC4yZW07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIHdpZHRoOiAxLjVlbTsKICAgICAgICBoZWlnaHQ6IDEuNWVtOwogICAgICAgIG1hcmdpbjogLjFlbSAuNWVtOwogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgfQogICAgICAKICAgICAgLmhlYWRlci1pY29uIHN2ZyB7CiAgICAgICAgd2lkdGg6IDEuNWVtOwogICAgICAgIGhlaWdodDogMS41ZW07CiAgICAgIH0KICAgICAgIAogICAgICAubWVudXN2ZyB7CiAgICAgICAgd2lkdGg6IDJlbTsKICAgICAgICBoZWlnaHQ6IDJlbTsKICAgICAgfQoKICAgICAgLm1lbnVzdmcgcGF0aCB7CiAgICAgICAgZmlsbDogI2ZmZjsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudCB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBoZWlnaHQ6IDEwMHZoOwogICAgICAgIHdpZHRoOiAxOGVtOwogICAgICAgIG1hcmdpbi1sZWZ0OiAtMThlbTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMjIyOwogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB6LWluZGV4OiAzOyAKICAgICAgICBvdmVyZmxvdzogc2Nyb2xsOwogICAgICB9CgogICAgICAjbWVudS1jb250ZW50LnZpc2libGUgewogICAgICAgIG1hcmdpbi1sZWZ0OiAwOwogICAgICB9CiAgICAgIAogICAgICAjbWVudS1jb250ZW50IC5pdGVtcyB7CiAgICAgICAgcGFkZGluZzogMWVtOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICAjbWVudS1jb250ZW50IC5pdGVtcyBhLmJ1dHRvbiwKICAgICAgaW5wdXQuc3VibWl0IHsKICAgICAgICBwYWRkaW5nOiAuNWVtIC43ZW07CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGJhY2tncm91bmQ6ICMxMTE7CiAgICAgIH0KCiAgICAgICNvdmVybGF5IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHotaW5kZXg6IDM7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIG9wYWNpdHk6IC41OwogICAgICB9CgogICAgICAudmlzaWJsZSB7CiAgICAgICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsKICAgICAgfQogICAgICAKICAgICAgI3NoYXJlLWRpYWxvZyB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgd2lkdGg6IGNhbGMoMTAwdncgLSA2ZW0pOwogICAgICAgIGhlaWdodDogNzAlOwogICAgICAgIGJhY2tncm91bmQ6ICNmZmY7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMWVtOwogICAgICAgIHotaW5kZXg6IDQ7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDJlbTsKICAgICAgICBtYXJnaW4tdG9wOiAyZW07CiAgICAgICAgcGFkZGluZzogMWVtOwogICAgICB9CiAgICAgIAogICAgICBoMiB7CiAgICAgICAgbWFyZ2luLXRvcDogMDsKICAgICAgfQogICAgICAKICAgICAgc3ZnIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgI3RlbXBsYXRlIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvaGVhZD4KICA8Ym9keT4KICAgIDxkaXYgaWQ9InRlbXBsYXRlIj4KICAgICAgPHN2ZyBjbGFzcz0iaGVhcnRzdmcgc3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CiAgICAgICAgPHBhdGggZD0iTTkuNzE5LDE3LjA3M2wtNi41NjItNi41MWMtMC4yNy0wLjI2OC0wLjUwNC0wLjU2Ny0wLjY5Ni0wLjg4OEMxLjM4NSw3Ljg5LDEuNjcsNS42MTMsMy4xNTUsNC4xNGMwLjg2NC0wLjg1NiwyLjAxMi0xLjMyOSwzLjIzMy0xLjMyOWMxLjkyNCwwLDMuMTE1LDEuMTIsMy42MTIsMS43NTJjMC40OTktMC42MzQsMS42ODktMS43NTIsMy42MTItMS43NTJjMS4yMjEsMCwyLjM2OSwwLjQ3MiwzLjIzMywxLjMyOWMxLjQ4NCwxLjQ3MywxLjc3MSwzLjc1LDAuNjkzLDUuNTM3Yy0wLjE5LDAuMzItMC40MjUsMC42MTgtMC42OTUsMC44ODdsLTYuNTYyLDYuNTFDMTAuMTI1LDE3LjIyOSw5Ljg3NSwxNy4yMjksOS43MTksMTcuMDczIE02LjM4OCwzLjYxQzUuMzc5LDMuNjEsNC40MzEsNCwzLjcxNyw0LjcwN0MyLjQ5NSw1LjkyLDIuMjU5LDcuNzk0LDMuMTQ1LDkuMjY1YzAuMTU4LDAuMjY1LDAuMzUxLDAuNTEsMC41NzQsMC43MzFMMTAsMTYuMjI4bDYuMjgxLTYuMjMyYzAuMjI0LTAuMjIxLDAuNDE2LTAuNDY2LDAuNTczLTAuNzI5YzAuODg3LTEuNDcyLDAuNjUxLTMuMzQ2LTAuNTcxLTQuNTZDMTUuNTcsNCwxNC42MjEsMy42MSwxMy42MTIsMy42MWMtMS40MywwLTIuNjM5LDAuNzg2LTMuMjY4LDEuODYzYy0wLjE1NCwwLjI2NC0wLjUzNiwwLjI2NC0wLjY5LDBDOS4wMjksNC4zOTcsNy44MiwzLjYxLDYuMzg4LDMuNjEiPjwvcGF0aD4KICAgICAgPC9zdmc+CiAgICAgIDxzdmcgY2xhc3M9InZpZGVvc3ZnIHN2Zy1pY29uIiB2aWV3Qm94PSIwIDAgMjAgMjAiPgoJCQkJPHBhdGggZD0iTTE4LjE3NSw0LjE0MkgxLjk1MUMxLjcwMyw0LjE0MiwxLjUsNC4zNDQsMS41LDQuNTkydjEwLjgxNmMwLDAuMjQ3LDAuMjAzLDAuNDUsMC40NTEsMC40NWgxNi4yMjRjMC4yNDcsMCwwLjQ1LTAuMjAzLDAuNDUtMC40NVY0LjU5MkMxOC42MjUsNC4zNDQsMTguNDIyLDQuMTQyLDE4LjE3NSw0LjE0MiBNNC42NTUsMTQuOTU3SDIuNDAxdi0xLjgwM2gyLjI1M1YxNC45NTd6TTQuNjU1LDEyLjI1NEgyLjQwMXYtMS44MDNoMi4yNTNWMTIuMjU0eiBNNC42NTUsOS41NDlIMi40MDFWNy43NDdoMi4yNTNWOS41NDl6IE00LjY1NSw2Ljg0NkgyLjQwMVY1LjA0M2gyLjI1M1Y2Ljg0NnpNMTQuNTY5LDE0Ljk1N0g1LjU1NlY1LjA0M2g5LjAxM1YxNC45NTd6IE0xNy43MjQsMTQuOTU3aC0yLjI1M3YtMS44MDNoMi4yNTNWMTQuOTU3eiBNMTcuNzI0LDEyLjI1NGgtMi4yNTN2LTEuODAzaDIuMjUzVjEyLjI1NHpNMTcuNzI0LDkuNTQ5aC0yLjI1M1Y3Ljc0N2gyLjI1M1Y5LjU0OXogTTE3LjcyNCw2Ljg0NmgtMi4yNTNWNS4wNDNoMi4yNTNWNi44NDZ6Ij48L3BhdGg+CgkJCTwvc3ZnPgoJCQk8c3ZnIGNsYXNzPSJpbWFnZXN2ZyBzdmctaWNvbiIgdmlld0JveD0iMCAwIDIwIDIwIj4KCQkJCTxwYXRoIGQ9Ik0xOC41NTUsMTUuMzU0VjQuNTkyYzAtMC4yNDgtMC4yMDItMC40NTEtMC40NS0wLjQ1MUgxLjg4OGMtMC4yNDgsMC0wLjQ1MSwwLjIwMy0wLjQ1MSwwLjQ1MXYxMC44MDhjMCwwLjU1OSwwLjc1MSwwLjQ1MSwwLjQ1MSwwLjQ1MWgxNi4yMTdoMC4wMDVDMTguNzkzLDE1Ljg1MSwxOC40NzgsMTQuODE0LDE4LjU1NSwxNS4zNTQgTTIuOCwxNC45NDlsNC45NDQtNi40NjRsNC4xNDQsNS40MTljMC4wMDMsMC4wMDMsMC4wMDMsMC4wMDMsMC4wMDMsMC4wMDVsMC43OTcsMS4wNEgyLjh6IE0xMy44MjIsMTQuOTQ5bC0xLjAwNi0xLjMxN2wxLjY4OS0yLjIxOGwyLjY4OCwzLjUzNUgxMy44MjJ6IE0xNy42NTQsMTQuMDY0bC0yLjc5MS0zLjY2NmMtMC4xODEtMC4yMzctMC41MzUtMC4yMzctMC43MTYsMGwtMS44OTksMi40OTNsLTQuMTQ2LTUuNDJjLTAuMTgtMC4yMzctMC41MzYtMC4yMzctMC43MTYsMGwtNS4wNDcsNi41OThWNS4wNDJoMTUuMzE2VjE0LjA2NHogTTEyLjQ3NCw2LjM5M2MtMC44NjksMC0xLjU3NywwLjcwNy0xLjU3NywxLjU3NnMwLjcwOCwxLjU3NiwxLjU3NywxLjU3NnMxLjU3Ny0wLjcwNywxLjU3Ny0xLjU3NlMxMy4zNDMsNi4zOTMsMTIuNDc0LDYuMzkzIE0xMi40NzQsOC42NDVjLTAuMzcxLDAtMC42NzYtMC4zMDQtMC42NzYtMC42NzZzMC4zMDUtMC42NzYsMC42NzYtMC42NzZjMC4zNzIsMCwwLjY3NiwwLjMwNCwwLjY3NiwwLjY3NlMxMi44NDYsOC42NDUsMTIuNDc0LDguNjQ1Ij48L3BhdGg+CgkJCTwvc3ZnPgogICAgICA8ZGl2IGlkPSJjb2xzY3NzIj4KICAgICAgLmNvbHMke2NvbHN9ICNpbWFnZXMgLml0ZW0gewogICAgICAgIHdpZHRoOiBjYWxjKDEwMHZ3IC8gJHtjb2xzfSk7CiAgICAgIH0KCiAgICAgIC5jb2xzJHtjb2xzfSAjaW1hZ2VzIC5pdGVtIHsKICAgICAgICBoZWlnaHQ6IGNhbGMoMTAwdncgLyAke2NvbHN9KTsKICAgICAgfQogICAgICAKICAgICAgLmNvbHMke2NvbHN9IC5xdWVyeSwKICAgICAgLmNvbHMke2NvbHN9IC5saWtlIHsKICAgICAgICBmb250LXNpemU6IG1pbigxNHZ3ICogKDEgLyAke2NvbHN9KSwgNmVtICogKDEgLyAke2NvbHN9KSkKICAgICAgfQogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0ic2hhcmUtZGlhbG9nIiBjbGFzcz0iZGlhbG9nIj4KICAgICAgPGgyPnNoYXJlPC9oMj4KICAgICAgPGZvcm0gaWQ9InNoYXJlLWZvcm0iIGFjdGlvbj0iIyI+CiAgICAgICAgPHAgY2xhc3M9ImNvbnRlbnQiPjwvcD4KICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiBjbGFzcz0ic3VibWl0IiB2YWx1ZT0ib2siLz4KICAgICAgPC9mb3JtPgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJtZWRpYS1mb290ZXIiPgogICAgICA8YSBpZD0iaW1hZ2UtbGlrZSIgY2xhc3M9Imxpa2UiIGhyZWY9IiMiPjwvYT4KICAgICAgPGEgaWQ9ImltYWdlLXF1ZXJ5IiBjbGFzcz0ibGluayIgaHJlZj0iIyI+PC9hPgogICAgICA8YSBpZD0iaW1hZ2UtdXNlciIgY2xhc3M9ImxpbmsiIGhyZWY9IiMiPjwvYT4KICAgIDwvZGl2PgogICAgPGNlbnRlciBpZD0ibWVkaWEtY29udGFpbmVyIj4KICAgICAgPGRpdiBpZD0iaW1hZ2UtY29udGFpbmVyIj4KICAgICAgICA8aW1nIGlkPSJpbWFnZSIvPgogICAgICA8L2Rpdj4KICAgIDwvY2VudGVyPgogICAgPGRpdiBpZD0ib3ZlcmxheSIgY2xhc3M9ImRpYWxvZyI+PC9kaXY+CiAgICA8ZGl2IGlkPSJtZW51LWNvbnRlbnQiIGNsYXNzPSJkaWFsb2ciPgogICAgICA8ZGl2IGNsYXNzPSJpdGVtcyI+CiAgICAgICAgPGgxPjxhIGNsYXNzPSJ0aXRsZSIgaHJlZj0iIyI+ZmlsZXMuaHRtbDwvYT48L2gxPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5hdXRvcGxheTwvZGl2PgogICAgICAgIDxhIGNsYXNzPSJidXR0b24gc2V0YXV0b3BsYXkiIGRhdGEtYXV0b3BsYXk9Im9uIiBocmVmPSIjIj5vbjwvYT4KICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIHNldGF1dG9wbGF5IiBkYXRhLWF1dG9wbGF5PSJvZmYiIGhyZWY9IiMiPm9mZjwvYT4KICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIHNldGF1dG9wbGF5IiBkYXRhLWF1dG9wbGF5PSJob3ZlciIgaHJlZj0iIyI+bW91c2VvdmVyPC9hPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5jb2x1bW5zPC9kaXY+CiAgICAgICAgPGEgY2xhc3M9ImJ1dHRvbiBzZXRjb2xzIiBkYXRhLWNvbHM9IjEiIGhyZWY9IiMiPjE8L2E+CiAgICAgICAgPGEgY2xhc3M9ImJ1dHRvbiBzZXRjb2xzIiBkYXRhLWNvbHM9IjIiIGhyZWY9IiMiPjI8L2E+CiAgICAgICAgPGEgY2xhc3M9ImJ1dHRvbiBzZXRjb2xzIiBkYXRhLWNvbHM9IjQiIGhyZWY9IiMiPjQ8L2E+CiAgICAgICAgPGEgY2xhc3M9ImJ1dHRvbiBzZXRjb2xzIiBkYXRhLWNvbHM9IjYiIGhyZWY9IiMiPjY8L2E+CiAgICAgICAgPGEgY2xhc3M9ImJ1dHRvbiBzZXRjb2xzIiBkYXRhLWNvbHM9IjEwIiBocmVmPSIjIj4xMDwvYT4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+Y29ubmVjdGlvbnM8L2Rpdj4KICAgICAgICA8ZGl2IGlkPSJjb25uY291bnQiPjA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+cmVsYXlzOjwvZGl2PgogICAgICAgIDxwPlBsZWFzZSB1c2UgcmVsYXlzIHdpdGggTklQLTUwIChzZWFyY2gpIGZ1bmN0aW9uYWxpdHk8L3A+CiAgICAgICAgPGZvcm0gYWN0aW9uPSIjIiBpZD0icmVsYXlzLWZvcm0iPgogICAgICAgICAgPHRleHRhcmVhIGlkPSJyZWxheXMiPjwvdGV4dGFyZWE+CiAgICAgICAgICA8aW5wdXQgY2xhc3M9InN1Ym1pdCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0ic2F2ZSByZWxheXMiLz4KICAgICAgICA8L2Zvcm0+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPnByaXZhdGUga2V5OjwvZGl2PgogICAgICAgIDxwPklmIHlvdSBjYW50IHVzZSBicm93c2VyIGFkZG9uIChtb2JpbGUpPC9wPgogICAgICAgIDxmb3JtIGFjdGlvbj0iIyIgaWQ9InByaXZrZXktZm9ybSI+CiAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9InByaXZrZXkiLz4KICAgICAgICAgIDxpbnB1dCBjbGFzcz0ic3VibWl0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJzYXZlIGtleSIvPgogICAgICAgIDwvZm9ybT4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+bG9nczwvZGl2PgogICAgICAgIDxkaXYgaWQ9ImxvZ3MiPjwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5sYXRlc3QgcmVsZWFzZTo8L2Rpdj4KICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIGxpbmsiIGlkPSJyZWxlYXNlIiBocmVmPSIjIj48L2E+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJoZWFkZXIiPgogICAgICA8ZGl2IGNsYXNzPSJpY29ucyI+CiAgICAgICAgPGEgaWQ9ImZpbHRlci1saWtlcyIgaHJlZj0iIyIgY2xhc3M9ImhlYWRlci1pY29uIj48L2E+CiAgICAgICAgPGEgaWQ9InNoYXJlIiBocmVmPSIjIiBjbGFzcz0iaGVhZGVyLWljb24iPgogICAgICAgICAgPHN2ZyBjbGFzcz0ic3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CgkJCQkgICAgPHBhdGggZD0iTTE0LjY4LDEyLjYyMWMtMC45LDAtMS43MDIsMC40My0yLjIxNiwxLjA5bC00LjU0OS0yLjYzN2MwLjI4NC0wLjY5MSwwLjI4NC0xLjQ1NywwLTIuMTQ2bDQuNTQ5LTIuNjM4YzAuNTE0LDAuNjYxLDEuMzE1LDEuMDksMi4yMTYsMS4wOWMxLjU0OSwwLDIuODA5LTEuMjYsMi44MDktMi44MDhjMC0xLjU0OC0xLjI2LTIuODA5LTIuODA5LTIuODA5Yy0xLjU0OCwwLTIuODA4LDEuMjYtMi44MDgsMi44MDljMCwwLjM4LDAuMDc2LDAuNzQxLDAuMjE0LDEuMDczbC00LjU1LDIuNjM4Yy0wLjUxNS0wLjY2MS0xLjMxNi0xLjA5LTIuMjE3LTEuMDljLTEuNTQ4LDAtMi44MDgsMS4yNi0yLjgwOCwyLjgwOXMxLjI2LDIuODA4LDIuODA4LDIuODA4YzAuOSwwLDEuNzAyLTAuNDMsMi4yMTctMS4wOWw0LjU1LDIuNjM3Yy0wLjEzOCwwLjMzMi0wLjIxNCwwLjY5My0wLjIxNCwxLjA3NGMwLDEuNTQ5LDEuMjYsMi44MDksMi44MDgsMi44MDljMS41NDksMCwyLjgwOS0xLjI2LDIuODA5LTIuODA5UzE2LjIyOSwxMi42MjEsMTQuNjgsMTIuNjIxTTE0LjY4LDIuNTEyYzEuMTM2LDAsMi4wNiwwLjkyMywyLjA2LDIuMDZTMTUuODE1LDYuNjMsMTQuNjgsNi42M3MtMi4wNTktMC45MjMtMi4wNTktMi4wNTlTMTMuNTQ0LDIuNTEyLDE0LjY4LDIuNTEyTTUuMzE5LDEyLjA2MWMtMS4xMzYsMC0yLjA2LTAuOTI0LTIuMDYtMi4wNnMwLjkyMy0yLjA1OSwyLjA2LTIuMDU5YzEuMTM1LDAsMi4wNiwwLjkyMywyLjA2LDIuMDU5UzYuNDU0LDEyLjA2MSw1LjMxOSwxMi4wNjFNMTQuNjgsMTcuNDg4Yy0xLjEzNiwwLTIuMDU5LTAuOTIyLTIuMDU5LTIuMDU5czAuOTIzLTIuMDYxLDIuMDU5LTIuMDYxczIuMDYsMC45MjQsMi4wNiwyLjA2MVMxNS44MTUsMTcuNDg4LDE0LjY4LDE3LjQ4OCI+PC9wYXRoPgoJCQkgICAgPC9zdmc+CgkJCSAgPC9hPgoJCQk8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iaXRlbXMiPgogICAgICAgIDxhIGNsYXNzPSJ0aXRsZSIgaHJlZj0iIyI+ZmlsZXMuaHRtbDwvYT4KICAgICAgICA8YSBpZD0ibWVudSIgaHJlZj0iIyI+CiAgICAgICAgICA8c3ZnIGNsYXNzPSJtZW51c3ZnIHN2Zy1pY29uIiB2aWV3Qm94PSIwIDAgMjAgMjAiPgoJCSAgICAgICAgPHBhdGggZD0iTTEwLDEuNDQ1Yy00LjcyNiwwLTguNTU1LDMuODI5LTguNTU1LDguNTU1YzAsNC43MjUsMy44MjksOC41NTUsOC41NTUsOC41NTVjNC43MjUsMCw4LjU1NS0zLjgzLDguNTU1LTguNTU1QzE4LjU1NSw1LjI3NCwxNC43MjUsMS40NDUsMTAsMS40NDUgTTEwLDE3LjY1NGMtNC4yMjEsMC03LjY1NC0zLjQzNC03LjY1NC03LjY1NGMwLTQuMjIxLDMuNDMzLTcuNjU0LDcuNjU0LTcuNjU0YzQuMjIyLDAsNy42NTQsMy40MzMsNy42NTQsNy42NTRDMTcuNjU0LDE0LjIyMSwxNC4yMjIsMTcuNjU0LDEwLDE3LjY1NCBNMTQuMzksMTBjMCwwLjI0OC0wLjIwMywwLjQ1LTAuNDUsMC40NUg2LjA2Yy0wLjI0OCwwLTAuNDUtMC4yMDMtMC40NS0wLjQ1czAuMjAzLTAuNDUsMC40NS0wLjQ1aDcuODc5QzE0LjE4Nyw5LjU1LDE0LjM5LDkuNzUyLDE0LjM5LDEwIE0xNC4zOSwxMi43MDJjMCwwLjI0Ny0wLjIwMywwLjQ0OS0wLjQ1LDAuNDQ5SDYuMDZjLTAuMjQ4LDAtMC40NS0wLjIwMi0wLjQ1LTAuNDQ5YzAtMC4yNDgsMC4yMDMtMC40NTEsMC40NS0wLjQ1MWg3Ljg3OUMxNC4xODcsMTIuMjUxLDE0LjM5LDEyLjQ1NCwxNC4zOSwxMi43MDIgTTE0LjM5LDcuMjk4YzAsMC4yNDgtMC4yMDMsMC40NS0wLjQ1LDAuNDVINi4wNmMtMC4yNDgsMC0wLjQ1LTAuMjAzLTAuNDUtMC40NXMwLjIwMy0wLjQ1LDAuNDUtMC40NWg3Ljg3OUMxNC4xODcsNi44NDgsMTQuMzksNy4wNTEsMTQuMzksNy4yOTgiPjwvcGF0aD4KCSAgICAgICAgPC9zdmc+CiAgICAgICAgPC9hPgogICAgICAgIDxmb3JtIGlkPSJxdWVyeS1mb3JtIiBhY3Rpb249IiMiPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJxdWVyeSIgbmFtZT0icXVlcnkiIGlkPSIiIC8+CiAgICAgICAgICA8c2VsZWN0IGlkPSJxdWVyeS10eXBlIj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iYWxsIj5hbGw8L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaW1hZ2UiPmltYWdlczwvb3B0aW9uPgogICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJ2aWRlbyI+dmlkZW9zPC9vcHRpb24+CiAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgIDxpbnB1dCBpZD0iZ28iIHR5cGU9InN1Ym1pdCIgdmFsdWU9ImdvIi8+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxzcGFuIGlkPSJxdWVyeWRpc3BsYXkiPgogICAgICAgICAgPHNwYW4gY2xhc3M9InRleHQiPjwvc3Bhbj4KICAgICAgICA8L3NwYW4+CiAgICAgICAgPGRpdiBpZD0ibG9hZGluZyI+dXBkYXRpbmc8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9InBsYWNlaG9sZGVyIj5Tb21ldGhpbmcgc2hvdWxkIGxvYWQgc29vbiwgbWF5YmUuPC9kaXY+CiAgICA8ZGl2IGlkPSJpbWFnZXMiPjwvZGl2PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vdW5wa2cuY29tL25vc3RyLXRvb2xzL2xpYi9ub3N0ci5idW5kbGUuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vc2xvd2xpLmdpdGh1Yi5pby9iZWNoMzItYnVmZmVyL2Fzc2V0cy9qcy9iZWNoMzItYnVmZmVyLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0PgogICAgICBjb25zdCB1cGRhdGVzcHVia2V5ID0gImFlNWM2ZTBiNzQ2NjBkMjE5NGM4MjU0YjVjMmM4MjU2NzY1NzZiZTAyOTczNzlmYTIwNTIzMTE0YTZhODVlODciCiAgICAgIGNvbnN0IHF1ZXJpZXMgPSB7IAogICAgICAgICJhdXRob3IiOiAnWyJSRVEiLCI8ST4iLHsia2luZHMiOlsxXSwiYXV0aG9ycyI6WyI8UD4iXX1dJwogICAgICB9CiAgICAgIHFzKCIjcmVsYXlzIikudmFsdWUgPSByZWxheXMoKS5qb2luKCJcbiIpCiAgICAgIHFzKCIjcHJpdmtleSIpLnZhbHVlID0gcHJpdmtleSgpCiAgICAgIGNvbnN0IGNvbG9wdHMgPSBbMSwgMiwgNCwgNiwgMTBdCgogICAgICBjb2xzID0gKCkgPT4gcGFyc2VJbnQoc2V0dGluZygiY29scyIsIGNvbG9wdHNbMl0pLCAxMCkKICAgICAgYXV0b3BsYXkgPSAoKSA9PiBzZXR0aW5nKCJhdXRvcGxheSIsICJvZmYiKQogICAgICBsaW1pdCA9ICgpID0+IHBhcnNlSW50KHNldHRpbmcoImxpbWl0IiwgMTUpLCAxMCkKICAgICAgZ2FsbGVyeSA9ICgpID0+IHsKICAgICAgICBsZXQgZ2FsbGVyeW1hdGNoZXIgPSBsb2NhdGlvbi5zZWFyY2gubWF0Y2goL2dhbGxlcnk9KFthLXowLTldKykvKQogICAgICAgIHJldHVybiBnYWxsZXJ5bWF0Y2hlciAmJiBnYWxsZXJ5bWF0Y2hlclsxXQogICAgICB9CiAgICAgIHZpZXdwdWJrZXkgPSAoKSA9PiB7CiAgICAgICAgbGV0IHB1YmtleW1hdGNoZXIgPSBsb2NhdGlvbi5zZWFyY2gubWF0Y2goL3B1YmtleT0oW2EtejAtOV0rKS8pCiAgICAgICAgcmV0dXJuIHB1YmtleW1hdGNoZXIgJiYgcHVia2V5bWF0Y2hlclsxXQogICAgICB9CiAgICAgIAogICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoImNvbHMiICsgY29scygpKQoKICAgICAgbGV0IHByb3RvY29sID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlLykgPyAibm9zdHI6IiA6ICJ3ZWIrbm9zdHI6IgogICAgICBsZXQgc29ja2V0cyA9IFtdCiAgICAgIGxldCByZXNoYW5kbGVycyA9IFtdCiAgICAgIGxldCB1cmxzID0gW10KICAgICAgbGV0IGxpa2VzID0gW10KICAgICAgbGV0IG5ld2xpa2VzID0gW10KICAgICAgbGV0IGlkY291bnRlciA9IDAKICAgICAgbGV0IHF1ZXJ5d2FpdCA9IG51bGwKICAgICAgbGV0IHByaW1hbHNvY2tldCA9IG51bGwKICAgICAgbGV0IHR5cGVzID0gewogICAgICAgIGltYWdlOiBbInBuZyIsICJqcGciLCAianBlZyIsICJ3ZWJwIl0sCiAgICAgICAgdmlkZW86IFsibXA0IiwgIndlYm0iXQogICAgICB9CiAgICAgIGxldCBpbWdyZWdleCA9IC9odHRwKHxzKVw6XC9cL1teIFxuXSo/XC4ocG5nfGpwZ3xqcGVnfHdlYnApL2dpCiAgICAgIGxldCB2aWRlb3JlZ2V4ID0gL2h0dHAofHMpXDpcL1wvW14gXG5dKj9cLihtcDR8d2VibSkvZ2kKICAgICAgbGV0IHZpZGVvZXh0cmVnZXggPSAvXC4obXA0fHdlYm0pJC9pCiAgICAgIGxldCBpbWdleHRyZWdleCA9IC9cLihwbmd8anBnfGpwZWd8d2VicCkkL2kKICAgICAgd2FpdG1zID0gNTAwMDAKICAgICAgcXVlcnlzdHIgPSAiIgogICAgICBsZXQgcXVlcnljb3VudCA9IDAKICAgICAgbGV0IGhvdmVyZWR2aWRlbyA9IG51bGwKICAgICAgCiAgICAgIHVwZGF0ZXF1ZXJ5KCkKICAgICAgcXMoIiNpbWFnZS1saWtlIikuaW5uZXJIVE1MID0gcXMoIiNmaWx0ZXItbGlrZXMiKS5pbm5lckhUTUwgPSBxcygiI3RlbXBsYXRlIC5oZWFydHN2ZyIpLm91dGVySFRNTAogICAgICBzZXRhY3RpdmUoInNldGNvbHMiLCAiY29scyIsIGNvbHMoKSkKICAgICAgc2V0YWN0aXZlKCJzZXRhdXRvcGxheSIsICJhdXRvcGxheSIsIGF1dG9wbGF5KCkpCiAgICAgIAogICAgICBmdW5jdGlvbiBmcm9tSGV4U3RyaW5nKHN0cil7CiAgICAgICAgbGV0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHN0ci5sZW5ndGggLyAyKQogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnVmZmVyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBidWZmZXJbaV0gPSBwYXJzZUludChzdHIuc3Vic3RyKDIgKiBpLCAyKSwgMTYpCiAgICAgICAgfQogICAgICAgIHJldHVybiBidWZmZXIKICAgICAgfQogIAogICAgICBmdW5jdGlvbiByZWxheXMoKXsKICAgICAgICBjb25zdCBvYmogPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJyZWxheXMiKSkKICAgICAgICBjb25zdCByID0gb2JqICYmIG9iai5maWx0ZXIociA9PiByLm1hdGNoKC93c3M6XC9cLy4rLykpIHx8IFtdCiAgICAgICAgCiAgICAgICAgcmV0dXJuIHIubGVuZ3RoID4gMCAmJiByIHx8IFsKICAgICAgICAgICJ3c3M6Ly9yZWxheS5ub3N0ci5iYW5kIiwKICAgICAgICAgICJ3c3M6Ly9uYi5yZWxheS5jZW50ZXIiLCAKICAgICAgICAgICJ3c3M6Ly9ub3N0ci5jb21waWxlLWVycm9yLm5ldCIKICAgICAgICBdCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHByaXZrZXkoKXsKICAgICAgICBsZXQga2V5ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oInByaXZrZXkiKSB8fCAiIgogICAgICAgIAogICAgICAgIGlmKGtleS5sZW5ndGggPT0gNjMpewogICAgICAgICAga2V5ID0gTm9zdHJUb29scy5uaXAxOS5kZWNvZGUoa2V5KS5kYXRhCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybiBrZXkubGVuZ3RoID09IDY0ICYmIGtleSB8fCBudWxsCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHNldHRpbmcoa2V5LCBkZWZhdWx0dmFsdWUpewogICAgICAgIGNvbnN0IHYgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpCiAgICAgICAgcmV0dXJuIHYgJiYgb3B0aW9uKCJzZXQiICsga2V5LCBrZXksIHYpICYmIHYgfHwgZGVmYXVsdHZhbHVlCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIG9wdGlvbihjLCBrZXksIHZhbCl7CiAgICAgICAgcmV0dXJuIHFzKCIuIiArIGMgKyAiW2RhdGEtIiArIGtleSArICI9JyIgKyB2YWwgKyAiJ10iKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxcyhxKXsKICAgICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihxKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxc2EocSl7CiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChxKSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gZ2lkKGkpewogICAgICAgIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxdWVyeXR5cGUoKXsKICAgICAgICByZXR1cm4gcXMoIiNxdWVyeS10eXBlIikudmFsdWUgfHwgImFsbCIKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gdXBkYXRlcXVlcnkoKXsKICAgICAgICBsZXQgc3RyID0gKGdhbGxlcnkoKSAmJiAiZzoiICsgZ2FsbGVyeSgpKQogICAgICAgIHN0ciA9IHN0ciB8fCAodmlld3B1YmtleSgpICYmICJrOiIgKyB2aWV3cHVia2V5KCkpCiAgICAgICAgc3RyID0gc3RyIHx8IGRlY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5oYXNoLnN1YnN0cmluZygxKSkgIAogICAgICAgIGxldCBwYXJ0cyA9IHN0ci5zcGxpdCgiLyIpCiAgICAgICAgcXMoIiNxdWVyeWRpc3BsYXkgLnRleHQiKS5pbm5lclRleHQgPSBwYXJ0c1swXQogICAgICAgIHF1ZXJ5c3RyID0gcGFydHNbMF0KICAgICAgICBxcygiI3F1ZXJ5IikudmFsdWUgPSBwYXJ0c1swXQogICAgICAgIHFzKCIjcXVlcnktdHlwZSIpLnZhbHVlID0gcGFydHNbMV0gfHwgImFsbCIKICAgICAgfQoKICAgICAgZnVuY3Rpb24gYWN0aXZlKCl7CiAgICAgICAgcmV0dXJuIHFzKCIjaW1hZ2VzIC5hY3RpdmUiKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBpbWFnZW9mZnNldChvZmZzZXQpewogICAgICAgIGNvbnN0IGltYWdlcyA9IHFzYSgiI2ltYWdlcyA+IC5pdGVtIikuZmlsdGVyKG4gPT4gbi5vZmZzZXRQYXJlbnQpLmZpbHRlcihlID0+IGUuY2xhc3NMaXN0LmNvbnRhaW5zKCJ2aXNpYmxlIikpCiAgICAgICAgcmV0dXJuIGltYWdlc1tpbWFnZXMuaW5kZXhPZihhY3RpdmUoKSkrb2Zmc2V0XQogICAgICB9CgogICAgICBmdW5jdGlvbiBsYXN0YWN0aXZlKCl7CiAgICAgICAgcmV0dXJuIHFzYSgiI2ltYWdlcyAuYWN0aXZlIikucG9wKCkgICAgICAKICAgICAgfQoKICAgICAgZnVuY3Rpb24gbWVudSgpewogICAgICAgIHFzYSgiI21lbnUtY29udGVudCwgI292ZXJsYXkiKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QudG9nZ2xlKCJ2aXNpYmxlIikpCiAgICAgIH0KICAKICAgICAgZnVuY3Rpb24gc2V0YWN0aXZlKGMsIGtleSwgdmFsKXsKICAgICAgICBxc2EoIi4iICsgYykuZm9yRWFjaChuID0+IG4uY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikpCiAgICAgICAgY29uc3Qgb3B0aW9uID0gcXMoIi4iICsgYyArICJbZGF0YS0iICsga2V5ICsgIj0nIiArIHZhbCArICInXSIpCiAgICAgICAgb3B0aW9uPy5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBzY3JvbGx2aXNpYmxlKG4sIG9mZnNldCl7CiAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0IHx8IDAKICAgICAgICByZXR1cm4gKG4ub2Zmc2V0VG9wICsgbi5vZmZzZXRIZWlnaHQpID49IChzY3JvbGxZIC0gb2Zmc2V0KQogICAgICAgICAgJiYgbi5vZmZzZXRUb3AgPD0gKHNjcm9sbFkgKyB2aXN1YWxWaWV3cG9ydC5oZWlnaHQgKyBvZmZzZXQpCiAgICAgIH0KCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZWltYWdlc2xvYWQoKXsKICAgICAgICBxc2EoIiNpbWFnZXMgLml0ZW0uaW1nIikuZm9yRWFjaChhc3luYyBpbWcgPT4gewogICAgICAgICAgaWYoc2Nyb2xsdmlzaWJsZShpbWcsIHZpc3VhbFZpZXdwb3J0LmhlaWdodCAvIDIpKXsKICAgICAgICAgICAgaW1nLnN0eWxlLmJhY2tncm91bmRJbWFnZSA9ICJ1cmwoIiArIGltZ1siZGF0YS1zcmMiXSArICIpIgogICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIGltZy5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSAiIgogICAgICAgICAgfQogICAgICAgIH0pCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZWFsbHZpZGVvcGxheSgpewogICAgICAgIHFzYSgiI2ltYWdlcyAuaXRlbS52aWRlbyIpLmZvckVhY2goYXN5bmMgbiA9PiB1cGRhdGV2aWRlb3BsYXkobikpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHByZXZpZXd1cmxzKCl7CiAgICAgICAgcmV0dXJuIHFzYSgiI2ltYWdlcyAuaXRlbSIpLmZpbHRlcihuID0+IG4ub2Zmc2V0UGFyZW50KS5zbGljZSgwLCA0KS5tYXAobiA9PiBuWyJkYXRhLWl0ZW0iXS51cmwpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZXZpZGVvcGxheShuKXsKICAgICAgICBjb25zdCBhcGxheSA9IGF1dG9wbGF5KCkKICAgICAgICBjb25zdCB2ID0gbi5xdWVyeVNlbGVjdG9yKCJ2aWRlbyIpCiAgICAgICAgCiAgICAgICAgaWYoYXBsYXkgIT0gIm9uIil7CiAgICAgICAgICB2Lm11dGVkID0gZmFsc2UKICAgICAgICAgIHYucGF1c2UoKQogICAgICAgIH1lbHNlewogICAgICAgICAgdi5tdXRlZCA9IHRydWUKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoIXNjcm9sbHZpc2libGUobikpewogICAgICAgICAgaWYodi5yZWFkeVN0YXRlID09IDQpewogICAgICAgICAgICB2LnBhdXNlKCkKICAgICAgICAgIH1lbHNlewogICAgICAgICAgICB2LnByZWxvYWQgPSAibm9uZSIKICAgICAgICAgIH0KICAgICAgICB9ZWxzZSBpZih2LnJlYWR5U3RhdGUgIT0gNCl7CiAgICAgICAgICB2LnByZWxvYWQgPSAiYXV0byIKICAgICAgICB9CiAgICAgICAgZWxzZSBpZihhcGxheSA9PSAib24iIHx8IChhcGxheSA9PSAiaG92ZXIiICYmIHYgPT0gaG92ZXJlZHZpZGVvKSl7CiAgICAgICAgICB2LnBsYXkoKQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIiwgZSA9PiB7CiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKQogICAgICAgIHVwZGF0ZWltYWdlc2xvYWQoKQogICAgICAgIHVwZGF0ZWFsbHZpZGVvcGxheSgpCiAgICAgIH0pCiAgICAgIAogICAgICBsZXQgdG91Y2ggPSBudWxsCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IiwgZSA9PiB0b3VjaCA9IGUuY2hhbmdlZFRvdWNoZXNbMF0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsIGUgPT4gewogICAgICAgIGNvbnN0IHhkaWZmID0gZS5jaGFuZ2VkVG91Y2hlc1swXS5zY3JlZW5YIC0gdG91Y2guc2NyZWVuWAoKICAgICAgICBpZih4ZGlmZiA8IC01MCl7CiAgICAgICAgICBzd2lwZSgxKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZih4ZGlmZiA+IDUwKXsKICAgICAgICAgIHN3aXBlKC0xKQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIHFzKCIjcXVlcnktZm9ybSIpLmFkZEV2ZW50TGlzdGVuZXIoInN1Ym1pdCIsIGUgPT4gewogICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgIHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZShudWxsLCBudWxsLCBsb2NhdGlvbi5wYXRobmFtZSkKICAgICAgICBsb2NhdGlvbi5oYXNoID0gIiMiICsgZW5jb2RlVVJJQ29tcG9uZW50KHFzKCIjcXVlcnkiKS52YWx1ZSArICIvIiArIHF1ZXJ5dHlwZSgpKQogICAgICAgIHVwZGF0ZXF1ZXJ5KCkKICAgICAgICBxdWVyeXdhaXQucmVzb2x2ZSgpCiAgICAgIH0pCgogICAgICBxcygiI3JlbGF5cy1mb3JtIikuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgYXN5bmMgZSA9PiB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgbGV0IHIgPSBKU09OLnN0cmluZ2lmeShxcygiI3JlbGF5cyIpLnZhbHVlLnNwbGl0KCJcbiIpKQogICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJyZWxheXMiLCByKQogICAgICAgIGRpc2Nvbm5lY3QoKQogICAgICB9KQogICAgICAKICAgICAgcXMoIiNzaGFyZS1mb3JtIikuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgYXN5bmMgZSA9PiB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgCiAgICAgICAgaWYocXMoIiNzaGFyZS1mb3JtIC5zdWJtaXQiKS52YWx1ZSA9PSAiY2xvc2UiKXsKICAgICAgICAgIHFzYSgiLmRpYWxvZy52aXNpYmxlIikuZm9yRWFjaChuID0+IG4uY2xhc3NMaXN0LnJlbW92ZSgidmlzaWJsZSIpKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IGV2ZW50cyA9IHFzYSgiI2ltYWdlcyAuaXRlbSIpLmZpbHRlcihuID0+IG4ub2Zmc2V0UGFyZW50KS5tYXAobiA9PiBuWyJkYXRhLWV2ZW50Il0uaWQpCiAgICAgICAgY29uc3QgZXZlbnQgPSBhd2FpdCBwdWJsaXNoKHsKICAgICAgICAgICJraW5kIjogMzMzLAogICAgICAgICAgImNvbnRlbnQiOiBKU09OLnN0cmluZ2lmeShldmVudHMpLAogICAgICAgICAgInRhZ3MiOiBbXQogICAgICAgIH0pCgogICAgICAgIGF3YWl0IHdhaXRyZXMobnVsbCwgIk9LIikKCiAgICAgICAgY29uc3QgdXJsID0gd2luZG93LmxvY2F0aW9uLm9yaWdpbiArIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZQogICAgICAgIAogICAgICAgIGNvbnN0IGNvbnRlbnQgPSAiVGhpcyBpcyBhIGdhbGxlcnkgb2YgIiArIGV2ZW50cy5sZW5ndGgKICAgICAgICAgICAgKyAiIGltYWdlcy92aWRlb3Mgc2hhcmVkIGZyb20gZmlsZXMuaHRtbC4gQ2hlY2sgaXQgb3V0IGhlcmU6ICIgKyB1cmwgKyAiP2dhbGxlcnk9IiArIGV2ZW50LmlkCiAgICAgICAgICAgICsgIlxuXG4iICsgcHJldmlld3VybHMoKS5qb2luKCJcbiIpCiAgICAgICAgCiAgICAgICAgY29uc3QgcHVibGlzaGVkZXZlbnQgPSBhd2FpdCBwdWJsaXNoKHsKICAgICAgICAgICJraW5kIjogMSwKICAgICAgICAgICJjb250ZW50IjogY29udGVudCwKICAgICAgICAgICJ0YWdzIjogWwogICAgICAgICAgICBbIiNlIiwgZXZlbnQuaWRdLCAKICAgICAgICAgICAgWyIjcCIsIGV2ZW50LnB1YmtleV0KICAgICAgICAgIF0KICAgICAgICB9KQoKICAgICAgICBhd2FpdCB3YWl0cmVzKG51bGwsICJPSyIpCiAgICAgICAgCiAgICAgICAgY29uc3QgYmVjaDMyaWQgPSBiZWNoMzIuZW5jb2RlKCJub3RlIiwgZnJvbUhleFN0cmluZyhwdWJsaXNoZWRldmVudC5pZCkpCiAgICAgICAgcXMoIiNzaGFyZS1mb3JtIC5jb250ZW50IikuaW5uZXJIVE1MID0gJ05vdGUgcHVibGlzaGVkIDxhIGhyZWY9IicgKyBwcm90b2NvbCArIGJlY2gzMmlkICsgJyI+JyArIGJlY2gzMmlkICsgJzwvYT4nCiAgICAgICAgcXMoIiNzaGFyZS1mb3JtIC5zdWJtaXQiKS52YWx1ZSA9ICJjbG9zZSIKICAgICAgfSkKCiAgICAgIHFzKCIjcHJpdmtleS1mb3JtIikuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgYXN5bmMgZSA9PiB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgY29uc3Qga2V5ID0gcXMoIiNwcml2a2V5IikudmFsdWUKCiAgICAgICAgaWYoa2V5Lmxlbmd0aCAhPSA2NCAmJiBrZXkubGVuZ3RoICE9IDYzKXsKICAgICAgICAgIGFsZXJ0KCJrZXkgc2hvdWxkIGJlIDYzIG9yIDY0IGNoYXJhY3RlcnMgbG9uZyIpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oInByaXZrZXkiLCBrZXkpCiAgICAgICAgYWxlcnQoImtleSBzYXZlZCIpCiAgICAgIH0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLCBhc3luYyAoZSkgPT4gewogICAgICAgIGlmKGF1dG9wbGF5KCkgPT0gImhvdmVyIiAmJiBlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInZpZGVvLWNvbnRhaW5lciIpKXsKICAgICAgICAgIGhvdmVyZWR2aWRlbyA9IGUudGFyZ2V0LnF1ZXJ5U2VsZWN0b3IoInZpZGVvIikKICAgICAgICAgIGhvdmVyZWR2aWRlby5wbGF5KCkKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgaG92ZXJlZHZpZGVvID0gZmFsc2UKICAgICAgICBpZighcXMoIiNtZWRpYS1jb250YWluZXIiKS5jbGFzc0xpc3QuY29udGFpbnMoInZpc2libGUiKSAmJiBhdXRvcGxheSgpID09ICJob3ZlciIgJiYgZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ2aWRlby1jb250YWluZXIiKSl7CiAgICAgICAgICBxc2EoInZpZGVvIikuZm9yRWFjaCh2ID0+IHYucGF1c2UoKSkKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgaWYoZS50YXJnZXQudHlwZSA9PSAic3VibWl0IiB8fCAoZS50YXJnZXQudGFnTmFtZSA9PSAiQSIgJiYgZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJsaW5rIikpKXsKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgIAogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygidGl0bGUiKSl7CiAgICAgICAgICBxcygiI3F1ZXJ5IikudmFsdWUgPSAiIgogICAgICAgICAgcXMoIiNxdWVyeS10eXBlIikudmFsdWUgPSAiYWxsIgogICAgICAgICAgcXMoIiNnbyIpLmNsaWNrKCkKICAgICAgICB9CgogICAgICAgIGUucHJldmVudERlZmF1bHQoKQoKICAgICAgICBpZihlLnRhcmdldC5pZCA9PSAiZmlsdGVyLWxpa2VzIil7CiAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC50b2dnbGUoImZpbHRlci1saWtlcyIpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gInNoYXJlIil7CiAgICAgICAgICBjb25zdCBldmVudHMgPSBxc2EoIiNpbWFnZXMgLml0ZW0iKS5maWx0ZXIobiA9PiBuLm9mZnNldFBhcmVudCkubWFwKG4gPT4gblsiZGF0YS1ldmVudCJdLmlkKQogICAgICAgICAgLy9jb25zdCB0ZXh0ID0ge3R5cGU6ICIiLCBldmVudHM6IH0KICAgICAgICAgIHFzKCIjc2hhcmUtZGlhbG9nIC5jb250ZW50IikuaW5uZXJIVE1MID0gIjxwPlNoYXJlIGxpbmsgdG8gdGhpcyBnYWxsZXJ5IG9mICIgKyBldmVudHMubGVuZ3RoICsgIiBpbWFnZXMvdmlkZW9zIHRvIHlvdXIgbm9zdHIgcHJvZmlsZT88L3A+IgogICAgICAgICAgcXMoIiNzaGFyZS1kaWFsb2cgLmNvbnRlbnQiKS5pbm5lckhUTUwgKz0gcHJldmlld3VybHMoKS5tYXAodXJsID0+ICc8aW1nIHNyYz0iJyt1cmwrJyIvPicpLmpvaW4oIiAiKQogICAgICAgICAgcXMoIiNzaGFyZS1mb3JtIC5zdWJtaXQiKS52YWx1ZSA9ICJwdWJsaXNoIgogICAgICAgICAgcXNhKCIjc2hhcmUtZGlhbG9nLCAjb3ZlcmxheSIpLmZvckVhY2gobiA9PiBuLmNsYXNzTGlzdC50b2dnbGUoInZpc2libGUiKSkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzaG93IikpewogICAgICAgICAgYWN0aXZlKCk/LmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgICBjb25zdCBpZCA9IGUudGFyZ2V0LmlkIHx8IGUudGFyZ2V0WyJkYXRhLWl0ZW0taWQiXQogICAgICAgICAgZ2lkKGlkKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgc2hvdyhpZCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLnRhcmdldC50YWdOYW1lICE9ICJBIiAmJiAocXMoIiNpbWFnZS1jb250YWluZXIiKSA9PSBlLnRhcmdldCB8fCBxcygiI2ltYWdlIikgPT0gZS50YXJnZXQgfHwgcXMoIiNtZWRpYS1jb250YWluZXIgdmlkZW8iKSA9PSBlLnRhcmdldCkpewogICAgICAgICAgaGlkZW1lZGlhKCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gIm1lbnUiKXsKICAgICAgICAgIG1lbnUoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLnRhcmdldC5pZCA9PSAib3ZlcmxheSIpewogICAgICAgICAgcXNhKCIuZGlhbG9nLnZpc2libGUiKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QucmVtb3ZlKCJ2aXNpYmxlIikpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzZXRjb2xzIikpewogICAgICAgICAgZm9yKGxldCBjIG9mIGNvbG9wdHMpewogICAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoImNvbHMiICsgYykKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJjb2xzIiArIGUudGFyZ2V0LmRhdGFzZXQuY29scykKICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJjb2xzIiwgZS50YXJnZXQuZGF0YXNldC5jb2xzKQogICAgICAgICAgc2V0YWN0aXZlKCJzZXRjb2xzIiwgImNvbHMiLCBjb2xzKCkpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzZXRhdXRvcGxheSIpKXsKICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJhdXRvcGxheSIsIGUudGFyZ2V0LmRhdGFzZXQuYXV0b3BsYXkpCiAgICAgICAgICBzZXRhY3RpdmUoInNldGF1dG9wbGF5IiwgImF1dG9wbGF5IiwgYXV0b3BsYXkoKSkKICAgICAgICAgIHVwZGF0ZWFsbHZpZGVvcGxheSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJsaWtlIikgJiYgbGlrZShlLnRhcmdldCkKICAgICAgfSkKICAgICAgCiAgICAgIGZ1bmN0aW9uIGhhc2tleSgpewogICAgICAgIHJldHVybiB3aW5kb3cubm9zdHIgfHwgcHJpdmtleSgpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHB1YmtleSgpewogICAgICAgIHJldHVybiB3aW5kb3cubm9zdHIgJiYgYXdhaXQgd2luZG93Lm5vc3RyLmdldFB1YmxpY0tleSgpIHx8IE5vc3RyVG9vbHMuZ2V0UHVibGljS2V5KHByaXZrZXkoKSkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gc2lnbihldmVudCl7CiAgICAgICAgaWYod2luZG93Lm5vc3RyKXsKICAgICAgICAgIHJldHVybiBhd2FpdCBub3N0ci5zaWduRXZlbnQoZXZlbnQpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGV2ZW50LnNpZyA9IE5vc3RyVG9vbHMuZ2V0U2lnbmF0dXJlKGV2ZW50LCBwcml2a2V5KCkpCiAgICAgICAgcmV0dXJuIGV2ZW50CiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGxpa2UobGluayl7CiAgICAgICAgY29uc3QgZXZlbnQgPSBsaW5rLnBhcmVudEVsZW1lbnRbImRhdGEtZXZlbnQiXQogICAgICAgIAogICAgICAgIGF3YWl0IHB1Ymxpc2goewogICAgICAgICAgImtpbmQiOiA3LAogICAgICAgICAgImNvbnRlbnQiOiAiKyIsCiAgICAgICAgICAidGFncyI6IFsKICAgICAgICAgICAgWyJlIiwgZXZlbnQuaWRdLAogICAgICAgICAgICBbInAiLCBldmVudC5wdWJrZXldCiAgICAgICAgICBdCiAgICAgICAgfSkKCiAgICAgICAgbGluay5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKCiAgICAgICAgY29uc3QgaW1hZ2VpZCA9IGxpbmtbImRhdGEtaXRlbS1pZCJdIHx8IGxpbmsuZGF0YXNldC5pbWFnZUlkCiAgICAgICAgCiAgICAgICAgaWYoaW1hZ2VpZCl7CiAgICAgICAgICBnaWQoaW1hZ2VpZCkucXVlcnlTZWxlY3RvcigiLmxpa2UiKS5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHByZXBhcmVfZXZlbnQoZXZlbnQpewogICAgICAgIGV2ZW50LnB1YmtleSA9IGF3YWl0IHB1YmtleSgpCiAgICAgICAgZXZlbnQuY3JlYXRlZF9hdCA9IHBhcnNlSW50KERhdGUubm93KCkgLyAxMDAwLCAxMCkKICAgICAgICBldmVudC5pZCA9IE5vc3RyVG9vbHMuZ2V0RXZlbnRIYXNoKGV2ZW50KQogICAgICAgIHJldHVybiBldmVudAogICAgICB9CiAgICAgICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcHVibGlzaChldmVudCl7CiAgICAgICAgZXZlbnQgPSBhd2FpdCBwcmVwYXJlX2V2ZW50KGV2ZW50KQogICAgICAgIGxldCBzaWduZWRldmVudCA9IGF3YWl0IHNpZ24oZXZlbnQpCiAgICAgICAgbGV0IGpzb24gPSBKU09OLnN0cmluZ2lmeShbIkVWRU5UIiwgc2lnbmVkZXZlbnRdKQogICAgICAgIHNvY2tldHMuZm9yRWFjaChzID0+IHMuc2VuZChqc29uKSkKICAgICAgICAKICAgICAgICByZXR1cm4gZXZlbnQKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gc3dpcGUob2Zmc2V0KXsKICAgICAgICBpZihpbWFnZW9mZnNldChvZmZzZXQpKXsKICAgICAgICAgIGltYWdlb2Zmc2V0KG9mZnNldCkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIHRoaXNbb2Zmc2V0ID09IC0xICYmICJsYXN0YWN0aXZlIiB8fCAiYWN0aXZlIl0oKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgICAgdXBkYXRlc2hvdygpCiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiB1cGRhdGVzaG93KCl7CiAgICAgICAgaWYocXMoIiNtZWRpYS1jb250YWluZXIiKS5jbGFzc0xpc3QuY29udGFpbnMoInZpc2libGUiKSl7CiAgICAgICAgICBoaWRldmlkZW8oKQogICAgICAgICAgc2hvdyhhY3RpdmUoKS5pZCkKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCBlID0+IHsKICAgICAgICBpZihbIlRhYiIsICJBcnJvd0xlZnQiLCAiQXJyb3dSaWdodCIsICJBcnJvd1VwIiwgIkFycm93RG93biJdLmluY2x1ZGVzKGUua2V5KSl7CiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJFc2NhcGUiKXsKICAgICAgICAgIG1lbnUoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUua2V5ID09ICJFbnRlciIgJiYgZS50YXJnZXQudGFnTmFtZSA9PSAiQk9EWSIpewogICAgICAgICAgaWYocXMoIiNtZWRpYS1jb250YWluZXIiKS5jbGFzc0xpc3QuY29udGFucygidmlzaWJsZSIpKXsKICAgICAgICAgICAgaGlkZW1lZGlhKCkKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHNob3coYWN0aXZlKCkuaWQpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd1VwIiAmJiBpbWFnZW9mZnNldCgtY29scygpKSl7CiAgICAgICAgICBpbWFnZW9mZnNldCgtY29scygpKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgbGFzdGFjdGl2ZSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgICB1cGRhdGVzaG93KCkKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd0Rvd24iICYmIGltYWdlb2Zmc2V0KGNvbHMoKSkpewogICAgICAgICAgaW1hZ2VvZmZzZXQoY29scygpKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgYWN0aXZlKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIHVwZGF0ZXNob3coKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93TGVmdCIpewogICAgICAgICAgc3dpcGUoLTEpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dSaWdodCIpewogICAgICAgICAgc3dpcGUoMSkKICAgICAgICB9CiAgICAgIH0pCgogICAgICBhc3luYyBmdW5jdGlvbiBoYW5kbGVxdWVyeXJlcyhyZXMsIHNvY2tldCwgcSwgdHlwZSwgc3RpbWUpewogICAgICAgIHNhdmUoc29ja2V0LCByZXMsIHEsIHR5cGUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSkKICAgICAgICBsb2coInF1ZXJ5IHJlcyIsIHJlcy5sZW5ndGgsIHNvY2tldC51cmwpCiAgICAgICAgcXVlcnljb3VudC0tCiAgICAgICAgaWYocXVlcnljb3VudCA9PSAwKXsKICAgICAgICAgIHFzKCIjbG9hZGluZyIpLmNsYXNzTGlzdC5yZW1vdmUoInZpc2libGUiKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBsZXQgd2FpdCA9IHdhaXRtcyAtIChEYXRlLm5vdygpIC0gc3RpbWUpCiAgICAgICAgcXVlcnl3YWl0ID0gc2xlZXAod2FpdCkKICAgICAgICBhd2FpdCBxdWVyeXdhaXQucHJvbWlzZQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBwcmltYWxnbG9iYWwoc29ja2V0KXsKICAgICAgICBsb2coImdsb2JhbCIsIHNvY2tldC51cmwpCiAgICAgICAgcXVlcnljb3VudCsrCiAgICAgICAgcXMoIiNsb2FkaW5nIikuY2xhc3NMaXN0LmFkZCgidmlzaWJsZSIpCiAgICAgICAgbGV0IHN0aW1lID0gRGF0ZS5ub3coKQogICAgICAgIGxldCBxaWQgPSAiZ2xvYmFsXyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgbGV0IHFpZGxpa2VzID0gImxpa2VzXyIgKyAoKytpZGNvdW50ZXIpCgogICAgICAgIGlmKG5ld2xpa2VzLmxlbmd0aCA+IDApewogICAgICAgICAgcHJpbWFsc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoWwogICAgICAgICAgICAiUkVRIiwgCiAgICAgICAgICAgIHFpZGxpa2VzLCAKICAgICAgICAgICAgewogICAgICAgICAgICAgICJjYWNoZSI6IFsKICAgICAgICAgICAgICAgICJldmVudHMiLCB7CiAgICAgICAgICAgICAgICAgICJldmVudF9pZHMiOiBuZXdsaWtlcwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIF0KICAgICAgICAgICAgfQogICAgICAgICAgXSkpCgogICAgICAgICAgY29uc3QgbGlrZV9ldmVudHMgPSAoYXdhaXQgd2FpdHJlcyhxaWRsaWtlcykpWzBdCiAgICAgICAgICBuZXdsaWtlcy5zcGxpY2UoMCkKICAgICAgICAgIAogICAgICAgICAgYXdhaXQgc2F2ZShzb2NrZXQsIGxpa2VfZXZlbnRzLCAiIiwgImFsbCIsIHRydWUsIHRydWUsIGZhbHNlKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeShbCiAgICAgICAgICAiUkVRIiwgCiAgICAgICAgICBxaWQsIAogICAgICAgICAgewogICAgICAgICAgICAiY2FjaGUiOiBbCiAgICAgICAgICAgICAgImV4cGxvcmUiLCAKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAidGltZWZyYW1lIjogImxhdGVzdCIsCiAgICAgICAgICAgICAgICAic2NvcGUiOiAiZ2xvYmFsIiwKICAgICAgICAgICAgICAgICJsaW1pdCI6IDUwCiAgICAgICAgICAgICAgfQogICAgICAgICAgICBdCiAgICAgICAgICB9CiAgICAgICAgXSkpCiAgICAgICAgCiAgICAgICAgY29uc3QgcmVzID0gKGF3YWl0IHdhaXRyZXMocWlkKSlbMF0KICAgICAgICBhd2FpdCBoYW5kbGVxdWVyeXJlcyhyZXMuZmlsdGVyKGUgPT4gZS5raW5kID09IDEpLCBzb2NrZXQsICIiLCAiYWxsIiwgc3RpbWUpCiAgICAgICAgcHJpbWFsZ2xvYmFsKHNvY2tldCkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcXVlcnkoc29ja2V0LCBwcmltYWwpewogICAgICAgIGxvZygicXVlcnkiLCBzb2NrZXQudXJsKQogICAgICAgIHF1ZXJ5Y291bnQrKwogICAgICAgIHFzKCIjbG9hZGluZyIpLmNsYXNzTGlzdC5hZGQoInZpc2libGUiKQogICAgICAgIAogICAgICAgIGxldCBzdGltZSA9IERhdGUubm93KCkKICAgICAgICBsZXQgcSA9IHF1ZXJ5c3RyLnRyaW0oKQogICAgICAgIGxldCB0eXBlID0gcXVlcnl0eXBlKCkKICAgICAgICBsZXQgaSA9ICsraWRjb3VudGVyCiAgICAgICAgbGV0IHFpZCA9ICJxdWVyeV8iICsgaQogICAgICAgIGNvbnN0IGxpa2VzcmVzID0gYXdhaXQgcXVlcnlsaWtlcyhzb2NrZXQpCiAgICAgICAgCiAgICAgICAgbGlrZXNyZXMuZm9yRWFjaChldmVudGlkID0+IHsKICAgICAgICAgIGlmKCFsaWtlcy5pbmNsdWRlcyhldmVudGlkKSl7CiAgICAgICAgICAgIGxpa2VzLnB1c2goZXZlbnRpZCkKICAgICAgICAgICAgbmV3bGlrZXMucHVzaChldmVudGlkKQogICAgICAgICAgfQogICAgICAgIH0pCiAgICAgICAgCiAgICAgICAgbGV0IGdhbGxlcnltYXRjaCA9IHF1ZXJ5c3RyLm1hdGNoKC9nOihbYS16MC05XSspLykKICAgICAgICBsZXQgcHVia2V5bWF0Y2ggPSBxdWVyeXN0ci5tYXRjaCgvazooW2EtejAtOV0rKS8pCiAgICAgICAgbGV0IHJlcyA9IG51bGwKICAgICAgICAKICAgICAgICBpZihnYWxsZXJ5bWF0Y2gpewogICAgICAgICAgY29uc3QgZ2FsbGVyeXJlcyA9IGF3YWl0IHF1ZXJ5ZXZlbnRzKHNvY2tldCwgWzMzM10sIFtnYWxsZXJ5bWF0Y2hbMV1dLCBudWxsKQogICAgICAgICAgY29uc3QgZXZlbnRpZHMgPSBKU09OLnBhcnNlKGdhbGxlcnlyZXNbMF0uY29udGVudCkKICAgICAgICAgIHJlcyA9IGF3YWl0IHF1ZXJ5ZXZlbnRzKHNvY2tldCwgWzFdLCBldmVudGlkcywgbnVsbCkKICAgICAgICB9CiAgICAgICAgZWxzZSBpZihwdWJrZXltYXRjaCl7CiAgICAgICAgICByZXMgPSBhd2FpdCBxdWVyeWV2ZW50cyhzb2NrZXQsIFsxXSwgbnVsbCwgW3B1YmtleW1hdGNoWzFdXSkKICAgICAgICB9CiAgICAgICAgZWxzZXsKICAgICAgICAgIGxldCBmaWx0ZXJzID0gW10KCiAgICAgICAgICBmaWx0ZXJzLnB1c2goLi4uKHR5cGVzW3R5cGVdIHx8IFtdKS5tYXAoKHQpID0+IHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICBraW5kczogWzFdLCAKICAgICAgICAgICAgICBzZWFyY2g6ICIuIiArIHQsCiAgICAgICAgICAgICAgbGltaXQ6IDIwCiAgICAgICAgICAgIH0KICAgICAgICAgIH0pKQogICAgICAgICAgCiAgICAgICAgICBpZihxLmxlbmd0aCA+IDApewogICAgICAgICAgICBmaWx0ZXJzLnB1c2goe2tpbmRzOiBbMV0sIHNlYXJjaDogcX0pCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIGlmKGZpbHRlcnMubGVuZ3RoID09IDApewogICAgICAgICAgICBmaWx0ZXJzLnB1c2goe2tpbmRzOiBbMV19KQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBjb25zdCBzZWFyY2hvYmogPSBbIlJFUSIsIHFpZCwgLi4uZmlsdGVyc10KICAgICAgICAgIGNvbnN0IHNlYXJjaGpzb24gPSBKU09OLnN0cmluZ2lmeShzZWFyY2hvYmopCiAgICAgICAgICBzb2NrZXQuc2VuZChzZWFyY2hqc29uKQogICAgICAgICAgCiAgICAgICAgICByZXMgPSAoYXdhaXQgd2FpdHJlcyhxaWQpKVswXQogICAgICAgICAgCiAgICAgICAgICByZXMgPSByZXMuZmlsdGVyKG8gPT4gewogICAgICAgICAgICBpZihxLmxlbmd0aCA+IDApewogICAgICAgICAgICAgIGZvcihsZXQgd29yZCBvZiBxLnNwbGl0KCIgIikpewogICAgICAgICAgICAgICAgaWYoby5jb250ZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZih3b3JkLnRvTG93ZXJDYXNlKCkpID09IC0xKXsKICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZQogICAgICAgICAgfSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgYXdhaXQgaGFuZGxlcXVlcnlyZXMocmVzLCBzb2NrZXQsIHEsIHR5cGUsIHN0aW1lKQogICAgICAgIHF1ZXJ5KHNvY2tldCkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcXVlcnlsaWtlcyhzb2NrZXQpewogICAgICAgIGlmKCFoYXNrZXkoKSl7CiAgICAgICAgICByZXR1cm4gW10KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QgbXlwdWJrZXkgPSBhd2FpdCBwdWJrZXkoKQogICAgICAgIGNvbnN0IGV2ZW50cyA9IGF3YWl0IHF1ZXJ5ZXZlbnRzKHNvY2tldCwgWzddLCBudWxsLCBbbXlwdWJrZXldKQogICAgICAgIHJldHVybiBldmVudHMubWFwKGUgPT4gZS50YWdzLmZpbmQodCA9PiB0WzBdID09ICJlIilbMV0pCiAgICAgIH0KCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5ZXZlbnRzKHNvY2tldCwga2luZHMsIGV2ZW50aWRzLCBhdXRob3JzKXsKICAgICAgICBjb25zdCBxdWVyeWlkID0gImV2ZW50c18iICsgKCsraWRjb3VudGVyKQogICAgICAgIGNvbnN0IGZpbHRlcnMgPSB7fQogICAgICAgIAogICAgICAgIGZpbHRlcnMua2luZHMgPSBraW5kcwogICAgICAgIAogICAgICAgIGlmKGV2ZW50aWRzKXsKICAgICAgICAgIGZpbHRlcnNbImlkcyJdID0gZXZlbnRpZHMKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoYXV0aG9ycyl7CiAgICAgICAgICBmaWx0ZXJzWyJhdXRob3JzIl0gPSBhdXRob3JzCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeShbCiAgICAgICAgICAiUkVRIiwgCiAgICAgICAgICBxdWVyeWlkLCAKICAgICAgICAgIGZpbHRlcnMKICAgICAgICBdKQogICAgICAgIAogICAgICAgIHNvY2tldC5zZW5kKGpzb24pCiAgICAgICAgCiAgICAgICAgcmV0dXJuIChhd2FpdCB3YWl0cmVzKHF1ZXJ5aWQpKVswXSB8fCBbXQogICAgICB9CgogICAgICBhc3luYyBmdW5jdGlvbiBzYXZlKHNvY2tldCwgZXZlbnRzLCBxLCBxdHlwZSwgcmVhY3RlZCwgYXBwZW5kLCBxdWVyeW1ldGEpewogICAgICAgIGxldCBldmVudHB1YmtleXMgPSBbXQogICAgICAgIGxldCByZXN1bHRzID0gW10KICAgICAgICBjb25zdCBldmVudGlkcyA9IGV2ZW50cy5tYXAoZSA9PiBlLmlkKQogICAgICAgIGxldCBuZXd1cmxzID0gW10KICAgICAgICAKICAgICAgICBmb3IobGV0IGV2ZW50IG9mIGV2ZW50cyl7CiAgICAgICAgICBsZXQgdXJsc21hdGNoID0gW10KICAgICAgICAgIAogICAgICAgICAgaWYocXR5cGUgIT0gInZpZGVvIil7CiAgICAgICAgICAgIHVybHNtYXRjaC5wdXNoKC4uLihldmVudC5jb250ZW50Lm1hdGNoKGltZ3JlZ2V4KSB8fCBbXSkpCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIGlmKHF0eXBlICE9ICJpbWFnZSIpewogICAgICAgICAgICB1cmxzbWF0Y2gucHVzaCguLi4oZXZlbnQuY29udGVudC5tYXRjaCh2aWRlb3JlZ2V4KSB8fCBbXSkpCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHVybHNtYXRjaCA9IHVybHNtYXRjaC5maWx0ZXIodXJsID0+ICF1cmxzLmluY2x1ZGVzKHVybCkpCgogICAgICAgICAgaWYodXJsc21hdGNoLmxlbmd0aCA+IDApewogICAgICAgICAgICBuZXd1cmxzLnB1c2goewogICAgICAgICAgICAgIGV2ZW50OiBldmVudCwKICAgICAgICAgICAgICB1cmxzOiB1cmxzbWF0Y2gKICAgICAgICAgICAgfSkKICAgICAgICAgICAgCiAgICAgICAgICAgIHVybHMucHVzaCguLi51cmxzbWF0Y2gpCiAgICAgICAgICAgIGV2ZW50cHVia2V5cy5pbmNsdWRlcyhldmVudC5wdWJrZXkpIHx8IGV2ZW50cHVia2V5cy5wdXNoKGV2ZW50LnB1YmtleSkKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbG9nKCJxdWVyeSBtZXRhIiwgc29ja2V0LnVybCkKICAgICAgICBsZXQgbWV0YWV2ZW50cyA9IChxdWVyeW1ldGEgJiYgYXdhaXQgcXVlcnlldmVudHMoc29ja2V0LCBbMF0sIG51bGwsIGV2ZW50cHVia2V5cykgfHwgW10pCiAgICAgICAgCiAgICAgICAgZm9yKGxldCBlbnRyeSBvZiBuZXd1cmxzKXsKICAgICAgICAgIGZvcihsZXQgdXJsIG9mIGVudHJ5LnVybHMpewogICAgICAgICAgICByZXN1bHRzLnB1c2goewogICAgICAgICAgICAgIHJlYWN0ZWQ6IHJlYWN0ZWQgfHwgbGlrZXMuaW5jbHVkZXMoZW50cnkuZXZlbnQuaWQpLCAKICAgICAgICAgICAgICB1cmw6IHVybCwgCiAgICAgICAgICAgICAgZXZlbnQ6IGVudHJ5LmV2ZW50LCAKICAgICAgICAgICAgICBiZWNoMzJpZDogYmVjaDMyLmVuY29kZSgibm90ZSIsIGZyb21IZXhTdHJpbmcoZW50cnkuZXZlbnQuaWQpKSwKICAgICAgICAgICAgICBtZXRhOiBtZXRhZXZlbnRzLmZpbmQobyA9PiBvLnB1YmtleSA9PSBlbnRyeS5ldmVudC5wdWJrZXkpCiAgICAgICAgICAgIH0pCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGxvZygic2F2ZSByZXMiLCByZXN1bHRzLmxlbmd0aCwgc29ja2V0LnVybCkKICAgICAgICB1cGRhdGVjb250ZW50KHJlc3VsdHMsIHEsIGFwcGVuZCkKICAgICAgfQogICAgICAKICAgICAgbGV0IGxvYWRlZCA9IDAKICAgICAgCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZWNvbnRlbnQocmVzdWx0cywgcSwgYXBwZW5kKXsKICAgICAgICByZXN1bHRzLnJldmVyc2UoKS5mb3JFYWNoKGl0ZW0gPT4gewogICAgICAgICAgY29uc3QgdHlwZSA9IGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpICYmICJ2aWRlbyIgfHwgImltYWdlIgogICAgICAgICAgY29uc3QgdGV4dCA9IChxIHx8ICJ2aWV3IG5vdGUiKS5zdWJzdHJpbmcoLTMwKQogICAgICAgICAgY29uc3QgaWQgPSAiaXRlbV8iICsgKCsraWRjb3VudGVyKQogICAgICAgICAgY29uc3QgY29udGVudGVsZW1lbnRzID0gJzxkaXYgY2xhc3M9InR5cGUiPicgKyBxcygiI3RlbXBsYXRlIC4iICsgdHlwZSArICJzdmciKS5vdXRlckhUTUwgKyAnPC9kaXY+PGEgY2xhc3M9Imxpa2UnICsgKGl0ZW0ucmVhY3RlZCA/ICcgcmVhY3RlZCcgOiAnJykgKyAnIiBkYXRhLWl0ZW0taWQ9IicgKyBpZCArIAogICAgICAgICAgICAnIiBocmVmPSIjIj4nICsgcXMoIiN0ZW1wbGF0ZSAuaGVhcnRzdmciKS5vdXRlckhUTUwgKyAnPC9hPjxhIGNsYXNzPSJxdWVyeSBsaW5rIiBocmVmPSInICsgcHJvdG9jb2wgKyAKICAgICAgICAgICAgaXRlbS5iZWNoMzJpZCArICciPicgKyB0ZXh0ICsgJzwvYT4nCiAgICAgICAgICBsZXQgcm9vdCA9IG51bGwKICAgICAgICAgIGxldCB2ID0gbnVsbAogICAgICAgICAgCiAgICAgICAgICBpZihpdGVtLnVybC5tYXRjaCh2aWRlb2V4dHJlZ2V4KSl7CiAgICAgICAgICAgIHJvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKQogICAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoInZpZGVvLWNvbnRhaW5lciIpCiAgICAgICAgICAgIHJvb3QuaW5uZXJIVE1MID0gY29udGVudGVsZW1lbnRzCiAgICAgICAgICAgIAogICAgICAgICAgICB2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKQogICAgICAgICAgICB2LmNsYXNzTGlzdC5hZGQoInNob3ciKQogICAgICAgICAgICB2WyJkYXRhLWl0ZW0taWQiXSA9IGlkCiAgICAgICAgICAgIHYucHJlbG9hZCA9ICJub25lIgogICAgICAgICAgICB2Lmxvb3AgPSB0cnVlCiAgICAgICAgICAgIHYucGxheXNpbmxpbmUgPSAiIgogICAgICAgICAgICAKICAgICAgICAgICAgdi5vbmNhbnBsYXkgPSBhc3luYyBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICBjb25zdCBhc3BlY3QgPSB0aGlzLnZpZGVvV2lkdGggLyB0aGlzLnZpZGVvSGVpZ2h0CiAgICAgICAgICAgICAgaWYoYXNwZWN0ID4gMSl7CiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlLndpZHRoID0gKGFzcGVjdCAqIDEwMCkgKyAiJSIKICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUuaGVpZ2h0ID0gKDEgLyBhc3BlY3QgKiAxMDApICsgIiUiCiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlLm1hcmdpblRvcCA9IC0oKDEgLyBhc3BlY3QgKiAxMDAgLSAxMDApIC8gMikgKyAiJSIKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgdXBkYXRldmlkZW9wbGF5KHRoaXMucGFyZW50RWxlbWVudCkKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29uc3QgZXh0ID0gaXRlbS51cmwubWF0Y2godmlkZW9leHRyZWdleClbMV0KICAgICAgICAgICAgdi5pbm5lckhUTUwgPSAnPHNvdXJjZSBzcmM9IicgKyBpdGVtLnVybCArICciIHR5cGU9InZpZGVvLycgKyBleHQgKyAnIj48L3NvdXJjZT4nCiAgICAgICAgICAgIAogICAgICAgICAgICByb290LmFwcGVuZCh2KQogICAgICAgICAgfWVsc2UgaWYoaXRlbS51cmwubWF0Y2goaW1nZXh0cmVnZXgpKXsKICAgICAgICAgICAgcm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKQogICAgICAgICAgICByb290LmhyZWYgPSAiIyIKICAgICAgICAgICAgcm9vdC5pbm5lckhUTUwgPSBjb250ZW50ZWxlbWVudHMKICAgICAgICAgICAgICAKICAgICAgICAgICAgaWYodHlwZSA9PSAiaW1hZ2UiKXsKICAgICAgICAgICAgICAvL2xldCBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKQogICAgICAgICAgICAgIC8vaW1nLmFsdCA9IGl0ZW0udXJsCiAgICAgICAgICAgICAgcm9vdFsiZGF0YS1zcmMiXSA9IGl0ZW0udXJsCiAgICAgICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJpbWciKQogICAgICAgICAgICAgIC8vaW1nLmNsYXNzTGlzdC5hZGQoImRhdGEiKQogICAgICAgICAgICAgIC8vcm9vdC5hcHBlbmQoaW1nKQogICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICByb290LmlubmVySFRNTCArPSAnPHNwYW4gY2xhc3M9ImZpbGUiPicgKyBpdGVtLnVybCArICc8L3NwYW4+JwogICAgICAgICAgICB9CiAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHJvb3QuaWQgPSBpZAogICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCd2aXNpYmxlJykKICAgICAgICAgIHJvb3RbImRhdGEtaXRlbSJdID0gaXRlbQogICAgICAgICAgcm9vdFsiZGF0YS1ldmVudCJdID0gaXRlbS5ldmVudAogICAgICAgICAgcm9vdFsiZGF0YS1xdWVyeSJdID0gcQogICAgICAgICAgcm9vdFsiZGF0YS10ZXh0Il0gPSB0ZXh0CiAgICAgICAgICAKICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCh0eXBlKQogICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJpdGVtIikKICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgic2hvdyIpCiAgICAgICAgICAKICAgICAgICAgIGlmKGl0ZW0ucmVhY3RlZCl7CiAgICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHFzKCIjaW1hZ2VzIilbYXBwZW5kICYmICJhcHBlbmQiIHx8ICJwcmVwZW5kIl0ocm9vdCkKICAgICAgICAgIAogICAgICAgICAgaWYodil7CiAgICAgICAgICAgIHVwZGF0ZXZpZGVvcGxheShyb290KQogICAgICAgICAgfQogICAgICAgIH0pCgogICAgICAgIHVwZGF0ZWltYWdlc2xvYWQoKQogICAgICAgIAogICAgICAgIGlmKGFjdGl2ZSgpID09IG51bGwpewogICAgICAgICAgcXMoIiNpbWFnZXMgLml0ZW0iKT8uY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGhpZGVtZWRpYSgpewogICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAic2Nyb2xsIgogICAgICAgIHFzYSgiI21lZGlhLWNvbnRhaW5lciwgI2ltYWdlLCAjbWVkaWEtZm9vdGVyIikuZm9yRWFjaChuID0+IG4uY2xhc3NMaXN0LnJlbW92ZSgidmlzaWJsZSIpKQogICAgICAgIGdpZCgiaW1hZ2UtbGlrZSIpLmNsYXNzTGlzdC5yZW1vdmUoInJlYWN0ZWQiKQogICAgICAgIGhpZGV2aWRlbygpCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGhpZGV2aWRlbygpewogICAgICAgIGNvbnN0IHYgPSBxcygiI21lZGlhLWNvbnRhaW5lciB2aWRlbyIpCiAgICAgICAgCiAgICAgICAgaWYodil7CiAgICAgICAgICB2Lm11dGVkID0gdHJ1ZQogICAgICAgICAgdi5jbGFzc0xpc3QuYWRkKCJzaG93IikKICAgICAgICAgIGdpZCh2WyJkYXRhLWl0ZW0taWQiXSkuYXBwZW5kQ2hpbGQodikKICAgICAgICAgIHVwZGF0ZXZpZGVvcGxheSh2LnBhcmVudEVsZW1lbnQpCiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiB3YWl0cmVzKGtleSwgdHlwZSl7CiAgICAgICAgbGV0IHJlc2hhbmRsZXIgPSBmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpewogICAgICAgICAgdGhpcy50eXBlID0gdHlwZSB8fCAiRU9TRSIKICAgICAgICAgIHRoaXMuZXZlbnRzID0gW10KICAgICAgICAgIHRoaXMuaGFuZGxlID0gZnVuY3Rpb24ocmVzKXsKICAgICAgICAgICAgbGV0IG8gPSBKU09OLnBhcnNlKHJlcy5kYXRhKQogICAgICAgICAgICBpZihrZXkgPT0gbnVsbCB8fCBvWzFdID09IGtleSl7CiAgICAgICAgICAgICAgaWYob1swXSA9PSB0aGlzLnR5cGUpewogICAgICAgICAgICAgICAgcmVzb2x2ZShbdGhpcy5ldmVudHMsIG9dKQogICAgICAgICAgICAgICAgcmVzaGFuZGxlcnMuc3BsaWNlKHJlc2hhbmRsZXJzLmluZGV4T2YodGhpcyksIDEpCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIHRoaXMuZXZlbnRzLnB1c2gob1syXSkKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gewogICAgICAgICAgbGV0IGhhbmRsZXIgPSBuZXcgcmVzaGFuZGxlcihyZXNvbHZlLCByZWplY3QpCiAgICAgICAgICByZXNoYW5kbGVycy5wdXNoKGhhbmRsZXIpCiAgICAgICAgfSkKICAgICAgfQogICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGNoZWNrdXBkYXRlKHNvY2tldCl7CiAgICAgICAgY29uc3QgdXBkYXRlc3JlcyA9IGF3YWl0IHF1ZXJ5ZXZlbnRzKHNvY2tldCwgWzFdLCBudWxsLCBbdXBkYXRlc3B1YmtleV0pCiAgICAgICAgY29uc3QgdXBkYXRlbm90ZSA9IHVwZGF0ZXNyZXMuZmluZChuID0+IG4uY29udGVudC5tYXRjaCgvXmh0dHBzXDpcL1wvLykpCiAgICAgICAgCiAgICAgICAgaWYoIXVwZGF0ZW5vdGUpewogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IGFnZSA9IE1hdGgucm91bmQoKERhdGUubm93KCkgLyAxMDAwIC0gdXBkYXRlbm90ZS5jcmVhdGVkX2F0KSAvIDM2MDAgLyAyNCkKICAgICAgICBjb25zdCBub3RlaWQgPSBiZWNoMzIuZW5jb2RlKCJub3RlIiwgZnJvbUhleFN0cmluZyh1cGRhdGVub3RlLmlkKSkKICAgICAgICBxcygiI3JlbGVhc2UiKS5ocmVmID0gcHJvdG9jb2wgKyBub3RlaWQKICAgICAgICBxcygiI3JlbGVhc2UiKS5pbm5lclRleHQgPSAoYWdlID09IDAgJiYgInRvZGF5IiB8fCBhZ2UgKyAiIGRheShzKSBhZ28iKQogICAgICB9CgogICAgICBmdW5jdGlvbiBzbGVlcChtcyl7CiAgICAgICAgcmV0dXJuIG5ldyBmdW5jdGlvbigpewogICAgICAgICAgbGV0IHRpbWVvdXQgPSBudWxsCiAgICAgICAgICBsZXQgciA9IG51bGwKICAgICAgICAgIAogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcHJvbWlzZTogbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KXsKICAgICAgICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCksIG1zKQogICAgICAgICAgICAgIHIgPSByZXNvbHZlCiAgICAgICAgICAgIH0pLAogICAgICAgICAgICByZXNvbHZlOiBmdW5jdGlvbigpewogICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KQogICAgICAgICAgICAgIHIoKQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBzaG93KGlkKXsKICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiIKICAgICAgICBjb25zdCBpdGVtID0gZ2lkKGlkKVsiZGF0YS1pdGVtIl0KICAgICAgICBjb25zdCBtZWRpYSA9IGdpZCgibWVkaWEtY29udGFpbmVyIikKICAgICAgICBjb25zdCBpbWFnZSA9IGdpZCgiaW1hZ2UiKQoKICAgICAgICBpZihpdGVtLnVybC5tYXRjaCh2aWRlb2V4dHJlZ2V4KSl7CiAgICAgICAgICBpbWFnZS5jbGFzc0xpc3QucmVtb3ZlKCJ2aXNpYmxlIikKICAgICAgICAgIGNvbnN0IHYgPSBnaWQoaWQpLnF1ZXJ5U2VsZWN0b3IoInZpZGVvIikKICAgICAgICAgIHFzKCIjbWVkaWEtY29udGFpbmVyIikuYXBwZW5kQ2hpbGQodikKICAgICAgICAgIHYubXV0ZWQgPSBmYWxzZQogICAgICAgICAgdi5jbGFzc0xpc3QucmVtb3ZlKCJzaG93IikKICAgICAgICAgIHYucGxheSgpCiAgICAgICAgfWVsc2V7CiAgICAgICAgICBpbWFnZS5zcmMgPSBpdGVtLnVybAogICAgICAgICAgaW1hZ2UuY2xhc3NMaXN0LmFkZCgidmlzaWJsZSIpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGl0ZW0ubWV0YSl7CiAgICAgICAgICBjb25zdCBtZXRhY29udGVudCA9IEpTT04ucGFyc2UoaXRlbS5tZXRhLmNvbnRlbnQpCiAgICAgICAgICBjb25zdCBuYW1lID0gbWV0YWNvbnRlbnQuZGlzcGxheV9uYW1lIHx8IG1ldGFjb250ZW50Lm5hbWUKICAgICAgICAgIHFzKCIjaW1hZ2UtdXNlciIpLmNsYXNzTGlzdC5hZGQoInZpc2libGUiKQogICAgICAgICAgcXMoIiNpbWFnZS11c2VyIikuaHJlZiA9ICI/cHVia2V5PSIgKyBpdGVtLm1ldGEucHVia2V5Ly9wcm90b2NvbCArIGJlY2gzMi5lbmNvZGUoIm5wdWIiLCBmcm9tSGV4U3RyaW5nKGl0ZW0ubWV0YS5wdWJrZXkpKQogICAgICAgICAgcXMoIiNpbWFnZS11c2VyIikuaW5uZXJUZXh0ID0gbmFtZQogICAgICAgIH1lbHNlewogICAgICAgICAgcXMoIiNpbWFnZS11c2VyIikuY2xhc3NMaXN0LnJlbW92ZSgidmlzaWJsZSIpCiAgICAgICAgfQoKICAgICAgICBnaWQoImltYWdlLWxpa2UiKVsiZGF0YS1pdGVtLWlkIl0gPSBpZAogICAgICAgIGdpZCgibWVkaWEtZm9vdGVyIilbImRhdGEtZXZlbnQiXSA9IGl0ZW0uZXZlbnQKCiAgICAgICAgaWYoaXRlbS5yZWFjdGVkKXsKICAgICAgICAgIGdpZCgiaW1hZ2UtbGlrZSIpLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBhID0gcXMoIiNpbWFnZS1xdWVyeSIpCiAgICAgICAgYS5ocmVmID0gcHJvdG9jb2wgKyBpdGVtLmJlY2gzMmlkCiAgICAgICAgYS5pbm5lclRleHQgPSBnaWQoaWQpWyJkYXRhLXRleHQiXQogICAgICAgIAogICAgICAgIGdpZCgibWVkaWEtY29udGFpbmVyIikuY2xhc3NMaXN0LmFkZCgidmlzaWJsZSIpCiAgICAgICAgZ2lkKCJtZWRpYS1mb290ZXIiKS5jbGFzc0xpc3QuYWRkKCJ2aXNpYmxlIikKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gY29ubmNvdW50KCl7CiAgICAgICAgcmV0dXJuIHNvY2tldHMuZmlsdGVyKHIgPT4gci5yZWFkeVN0YXRlID09IDEpLmxlbmd0aAogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBkaXNjb25uZWN0KCl7CiAgICAgICAgZm9yKGxldCBzb2NrZXQgb2Ygc29ja2V0cyl7CiAgICAgICAgICBzb2NrZXQuY2xvc2UoKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBzb2NrZXRzLnNwbGljZSgwKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBsb2cobXNnKXsKICAgICAgICBsZXQgc2Nyb2xsID0gcXMoIiNsb2dzIikuc2Nyb2xsVG9wID09IHFzKCIjbG9ncyIpLnNjcm9sbFRvcE1heAogICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpCiAgICAgICAgZGl2LmlubmVyVGV4dCA9IEFycmF5LmZyb20oYXJndW1lbnRzKS5qb2luKCIgIikKICAgICAgICBxcygiI2xvZ3MiKS5hcHBlbmQoZGl2KQogICAgICAgIAogICAgICAgIHNjcm9sbCAmJiBxcygiI2xvZ3MiKS5zY3JvbGxUbygwLCBxcygiI2xvZ3MiKS5zY3JvbGxUb3BNYXgpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGNvbm5lY3QodXJsKXsKICAgICAgICBsb2coImNvbm5lY3RpbmciLCB1cmwpCiAgICAgICAgbGV0IHNvY2tldCA9IG5ldyBXZWJTb2NrZXQodXJsKQogICAgICAgIAogICAgICAgIHNvY2tldC5vbm1lc3NhZ2UgPSBtZXNzYWdlID0+IHJlc2hhbmRsZXJzLmZvckVhY2gocmggPT4gcmguaGFuZGxlKG1lc3NhZ2UpKQogICAgICAgIAogICAgICAgIHNvY2tldC5vbmNsb3NlID0gYXN5bmMgZnVuY3Rpb24oKXsKICAgICAgICAgIHNvY2tldHMuc3BsaWNlKHNvY2tldHMuaW5kZXhPZihzb2NrZXQpLCAxKQogICAgICAgICAgcXMoIiNjb25uY291bnQiKS5pbm5lclRleHQgPSBjb25uY291bnQoKSArIChwcmltYWxzb2NrZXQgJiYgMSkKICAgICAgICAgIGxvZygiZGlzY29ubmVjdGVkIiwgdGhpcy51cmwsIGNvbm5jb3VudCgpKQogICAgICAgICAgYXdhaXQgc2xlZXAoMTAwMCkucHJvbWlzZQogICAgICAgICAgY29ubmVjdCh0aGlzLnVybCkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgc29ja2V0Lm9ub3BlbiA9IGZ1bmN0aW9uKCl7CiAgICAgICAgICBxcygiI2Nvbm5jb3VudCIpLmlubmVyVGV4dCA9IGNvbm5jb3VudCgpICsgKHByaW1hbHNvY2tldCAmJiAxKQogICAgICAgICAgbG9nKCJjb25uZWN0ZWQiLCB0aGlzLnVybCwgY29ubmNvdW50KCkpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybiBzb2NrZXQKICAgICAgfQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsIGFzeW5jICgpID0+IHsKICAgICAgICBwcmltYWxzb2NrZXQgPSBjb25uZWN0KCJ3c3M6Ly9jYWNoZTMucHJpbWFsLm5ldC9jYWNoZTE3IikKICAgICAgICBwcmltYWxzb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcigib3BlbiIsIGZ1bmN0aW9uKCl7CiAgICAgICAgICBwcmltYWxnbG9iYWwodGhpcykKICAgICAgICB9KQogICAgICAgIAogICAgICAgIHByaW1hbHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsIGZ1bmN0aW9uKCl7CiAgICAgICAgICBwcmltYWxzb2NrZXQgPSBudWxsCiAgICAgICAgfSkKICAgICAgICAKICAgICAgICBmb3IobGV0IHVybCBvZiByZWxheXMoKSl7CiAgICAgICAgICBjb25zdCBzb2NrZXQgPSBjb25uZWN0KHVybCkKICAgICAgICAgIHNvY2tldHMucHVzaChzb2NrZXQpCiAgICAgICAgICAKICAgICAgICAgIHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCJvcGVuIiwgZnVuY3Rpb24oKXsKICAgICAgICAgICAgY2hlY2t1cGRhdGUodGhpcykKICAgICAgICAgICAgcXVlcnkodGhpcykKICAgICAgICAgIH0pCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGF3YWl0IHNsZWVwKDEwMCkucHJvbWlzZQogICAgICAgIAogICAgICAgIGlmKGhhc2tleSgpKXsKICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgibm9zdHIiKQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGZvcihsZXQgYyBvZiBjb2xvcHRzKXsKICAgICAgICBkb2N1bWVudC53cml0ZSgnPHN0eWxlPicgKyBjb2xzY3NzLmlubmVyVGV4dC5yZXBsYWNlKC9cJFx7Y29sc1x9L2csIGMpICsgJzwvc3R5bGU+JykKICAgICAgfQogICAgPC9zY3JpcHQ+CiAgPC9ib2R5Pgo8L2h0bWw+Cg==

https://ipfs.io/ipfs/QmYSdEszqhtgaq6yq7GEQLXijRyTEtSvpEECydZrFnCCMU

sha256

9cb64e4d1ab635243b02c8f369186f60c0b2cb01067bb7d7d02924fff2450a3a files.html

base64

PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgdXNlci1zY2FsYWJsZT1ubyIvPgogICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL3N2Z2ljb25zLnNwYXJray5mci9zdmdpY29ucy5jc3MiLz4KICAgIDxzdHlsZT4KICAgICAgKiB7CiAgICAgICAgb3ZlcnNjcm9sbC1iZWhhdmlvci15OiBjb250YWluOwogICAgICB9CiAgICAgIAogICAgICBib2R5IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB3aWR0aDogMTAwdnc7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIGZvbnQtZmFtaWx5OiAiTm90byBTZXJpZiI7CiAgICAgIH0KICAgICAgCiAgICAgIC5wbGFjZWhvbGRlciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICBwYWRkaW5nOiAxZW07CiAgICAgIH0KICAgICAgCiAgICAgIGgxIHsKICAgICAgICBmb250LXNpemU6IDFlbTsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnlkaXNwbGF5LCAKICAgICAgI2hlYWRlciB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgfQogICAgICAKICAgICAgI3JlbGF5cywKICAgICAgI2xvZ3MsIAogICAgICAjcHJpdmtleSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgd2lkdGg6IDE4ZW07CiAgICAgICAgYmFja2dyb3VuZDogIzExMTsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgI3JlbGF5cywKICAgICAgI2xvZ3MgewogICAgICAgIGhlaWdodDogNmVtOwogICAgICB9CiAgICAgIAogICAgICAjbG9ncyB7CiAgICAgICAgaGVpZ2h0OiA4ZW07CiAgICAgICAgb3ZlcmZsb3c6IHNjcm9sbDsKICAgICAgICBmb250LXNpemU6IC44ZW07CiAgICAgIH0KICAgICAgCiAgICAgIHNlbGVjdCB7CiAgICAgICAgd2lkdGg6IDRlbTsKICAgICAgfQogICAgICAKICAgICAgI3JlbGF5cywgCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgYm9yZGVyLXJhZGl1czogLjVlbTsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSAudGV4dCwgCiAgICAgICNoZWFkZXIgYSwKICAgICAgI21lZGlhLWNvbnRhaW5lciB7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgYSwgCiAgICAgIGZvcm0sIAogICAgICAjcXVlcnlkaXNwbGF5IHsKICAgICAgICB6LWluZGV4OiAxOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgICAKICAgICAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAzMGVtKSB7CiAgICAgICAgI2hlYWRlciAudGl0bGUgewogICAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgI3F1ZXJ5ZGlzcGxheSB7CiAgICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIH0KICAgICAgfQoKICAgICAgZm9ybSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnkgewogICAgICAgIHdpZHRoOiA2ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNsb2FkaW5nIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDBweDsKICAgICAgICBsZWZ0OiAyN2VtOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICBhIHsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICAgIH0KCiAgICAgIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAKICAgICAgI21lZGlhLWNvbnRhaW5lciB2aWRlbyB7CiAgICAgICAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsKICAgICAgICBoZWlnaHQ6IDEwMCUgIWltcG9ydGFudDsKICAgICAgICBtYXJnaW4tdG9wOiAwICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgCiAgICAgIC50eXBlIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgei1pbmRleDogMTsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlLXF1ZXJ5IHsKICAgICAgICB3aWR0aDogNWVtOwogICAgICB9CiAgICAgIAogICAgICBhIHsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSwKICAgICAgYS5idXR0b24sCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgY29sb3I6ICM5OTk7CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgI3F1ZXJ5ZGlzcGxheSB7CiAgICAgICAgcGFkZGluZzogMCAxZW07CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICB9CgogICAgICAjcXVlcnlkaXNwbGF5IC50ZXh0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgbWluLXdpZHRoOiAzZW07CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIG1heC13aWR0aDogOGVtOwogICAgICB9CgogICAgICAjaGVhZGVyIGEsCiAgICAgICNoZWFkZXIgc3BhbiB7CiAgICAgICAgcGFkZGluZzogMC41ZW07CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgewogICAgICAgIHBhZGRpbmc6IDAuNDVlbSAwOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgLml0ZW1zIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBtYXJnaW4tdG9wOiAuM2VtOwogICAgICB9CgogICAgICBwIHsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICB9CiAgICAgIAogICAgICAubGFiZWwgewogICAgICAgIHBhZGRpbmc6IC44ZW0gLjhlbSAuOGVtIDA7CiAgICAgIH0KCiAgICAgICNpbWFnZXMgLnF1ZXJ5IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KCiAgICAgICNtZWRpYS1jb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwKTsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHotaW5kZXg6IDQ7CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZS1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIG1heC13aWR0aDogMTAwdnc7CiAgICAgICAgbWF4LWhlaWdodDogMTAwdmg7CiAgICAgIH0KICAgICAgICAKICAgICAgI2ltYWdlcyB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgI2ltYWdlcyAuaXRlbSB7CiAgICAgICAgd2lkdGg6IDI1dnc7CiAgICAgICAgaGVpZ2h0OiAyNXZ3OwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgLmRpYWxvZyBpbWcgewogICAgICAgIHdpZHRoOiAxNXZ3OwogICAgICB9CiAgICAgIAogICAgICAjbWVkaWEtY29udGFpbmVyIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CiAgICAgIAogICAgICBib2R5Om5vdCgubm9zdHIpICNoZWFkZXIgLmljb25zLCAKICAgICAgLmZpbHRlci1saWtlcyAjaW1hZ2VzID4gLml0ZW06bm90KC5yZWFjdGVkKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNpbWFnZS1xdWVyeSwKICAgICAgI2ltYWdlLXVzZXIgewogICAgICAgIHotaW5kZXg6IDI7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDN2dzsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHBhZGRpbmc6IDAgMXZ3OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNpbWFnZS1xdWVyeSwgCiAgICAgIC52aWRlb3N2ZywKICAgICAgLmltYWdlc3ZnIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsMCwwLDAuNik7CiAgICAgIH0KICAgICAgCiAgICAgIC5xdWVyeSwgCiAgICAgIC5saWtlLCAKICAgICAgI2ltYWdlLXF1ZXJ5IHsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgZm9udC1zaXplOiBtaW4oMy41dncsIDEuNWVtKTsKICAgICAgICBtYXgtd2lkdGg6IDVlbTsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlLXF1ZXJ5IHsKICAgICAgICBwYWRkaW5nOiAuNmVtIC40ZW0gLjFlbSAuNGVtOwogICAgICAgIG1heC13aWR0aDogNWVtOwogICAgICB9CiAgICAgIAogICAgICAubGlrZS5yZWFjdGVkLAogICAgICAuZmlsdGVyLWxpa2VzICNmaWx0ZXItbGlrZXMgewogICAgICAgIGJhY2tncm91bmQ6IHJlZDsKICAgICAgfQoKICAgICAgI2ltYWdlLXF1ZXJ5LAogICAgICAjaW1hZ2UtdXNlciB7CiAgICAgICAgZm9udC1zaXplOiAzZW07CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZS1xdWVyeSwKICAgICAgI2ltYWdlLXVzZXIsCiAgICAgICNtZWRpYS1mb290ZXIgLmxpa2UgewogICAgICAgIHotaW5kZXg6IDU7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICB9CiAgICAgIAogICAgICAjaW1hZ2UtcXVlcnksCiAgICAgICNpbWFnZS11c2VyIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQoKICAgICAgI2ltYWdlLXVzZXIgewogICAgICAgIGJvdHRvbTogMS45ZW07CiAgICAgICAgZm9udC1zaXplOiAxLjhlbTsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAuNjVlbTsKICAgICAgICBtYXgtd2lkdGg6IDhlbTsKICAgICAgfQogICAgICAKICAgICAgLmxpa2UgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogYXV0bzsKICAgICAgICBwYWRkaW5nOiAuMmVtOwogICAgICAgIHdpZHRoOiAxZW07CiAgICAgICAgaGVpZ2h0OiAxZW07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgfQoKICAgICAgLm5vc3RyIC5saWtlIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsgIAogICAgICB9CgogICAgICAjbWVkaWEtZm9vdGVyIC5saWtlIHsKICAgICAgICBmb250LXNpemU6IDIuNGVtOwogICAgICB9CgogICAgICAjbWVkaWEtZm9vdGVyIHsKICAgICAgICBkaXNwbGF5OiBub25lOyAgCiAgICAgIH0KICAKICAgICAgI2ltYWdlcyAuaW1nIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgYmFja2dyb3VuZC1zaXplOiBjb3ZlcjsKICAgICAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OwogICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlcjsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgLmJ1dHRvbi5hY3RpdmUgewogICAgICAgIGJhY2tncm91bmQ6ICM0NDQ7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZXMgPiAuYWN0aXZlIHsKICAgICAgICBvdXRsaW5lOiAuM2VtIHNvbGlkIGdyZWVuOwogICAgICAgIHotaW5kZXg6IDE7CiAgICAgIH0KCiAgICAgIC5oZWFydHN2ZyBwYXRoLAogICAgICAuaGVhZGVyLWljb24gc3ZnIHBhdGggewogICAgICAgIHN0cm9rZTogI2ZmZjsKICAgICAgfQogIAogICAgICAudmlkZW9zdmcsCiAgICAgIC5pbWFnZXN2ZyB7CiAgICAgICAgd2lkdGg6IGNhbGMobWluKDR2dywgMmVtKSk7CiAgICAgICAgaGVpZ2h0OiBjYWxjKG1pbig0dncsIDJlbSkpOwogICAgICAgIHBhZGRpbmc6IDAgLjJlbTsKICAgICAgfQogICAgICAKICAgICAgLnZpZGVvc3ZnIHBhdGgsCiAgICAgIC5pbWFnZXN2ZyBwYXRoIHsKICAgICAgICBmaWxsOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICBhI21lbnUsIAogICAgICAuaGVhZGVyLWljb24gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgIH0KCiAgICAgIC5pY29ucyB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIHotaW5kZXg6IDI7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgfQogICAgICAKICAgICAgYSNtZW51IHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBwYWRkaW5nOiAwIC41ZW07CiAgICAgICAgbWFyZ2luLXRvcDogLS4zZW07CiAgICAgICAgaGVpZ2h0OiAyLjNlbTsKICAgICAgfQogICAgICAKICAgICAgI2hlYWRlciAuaGVhZGVyLWljb24gewogICAgICAgIHBhZGRpbmc6IC4yZW07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIHdpZHRoOiAxLjVlbTsKICAgICAgICBoZWlnaHQ6IDEuNWVtOwogICAgICAgIG1hcmdpbjogLjFlbSAuNWVtOwogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgfQogICAgICAKICAgICAgLmhlYWRlci1pY29uIHN2ZyB7CiAgICAgICAgd2lkdGg6IDEuNWVtOwogICAgICAgIGhlaWdodDogMS41ZW07CiAgICAgIH0KICAgICAgIAogICAgICAubWVudXN2ZyB7CiAgICAgICAgd2lkdGg6IDJlbTsKICAgICAgICBoZWlnaHQ6IDJlbTsKICAgICAgfQoKICAgICAgLm1lbnVzdmcgcGF0aCB7CiAgICAgICAgZmlsbDogI2ZmZjsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudCB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBoZWlnaHQ6IDEwMHZoOwogICAgICAgIHdpZHRoOiAxOGVtOwogICAgICAgIG1hcmdpbi1sZWZ0OiAtMThlbTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMjIyOwogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB6LWluZGV4OiAzOyAKICAgICAgICBvdmVyZmxvdzogc2Nyb2xsOwogICAgICB9CgogICAgICAjbWVudS1jb250ZW50LnZpc2libGUgewogICAgICAgIG1hcmdpbi1sZWZ0OiAwOwogICAgICB9CiAgICAgIAogICAgICAjbWVudS1jb250ZW50IC5pdGVtcyB7CiAgICAgICAgcGFkZGluZzogMWVtOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICAjbWVudS1jb250ZW50IC5pdGVtcyBhLmJ1dHRvbiwKICAgICAgaW5wdXQuc3VibWl0IHsKICAgICAgICBwYWRkaW5nOiAuNWVtIC43ZW07CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGJhY2tncm91bmQ6ICMxMTE7CiAgICAgIH0KCiAgICAgICNvdmVybGF5IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHotaW5kZXg6IDM7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIG9wYWNpdHk6IC41OwogICAgICB9CgogICAgICAudmlzaWJsZSB7CiAgICAgICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsKICAgICAgfQogICAgICAKICAgICAgI3NoYXJlLWRpYWxvZyB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgd2lkdGg6IGNhbGMoMTAwdncgLSA2ZW0pOwogICAgICAgIGhlaWdodDogNzAlOwogICAgICAgIGJhY2tncm91bmQ6ICNmZmY7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMWVtOwogICAgICAgIHotaW5kZXg6IDQ7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDJlbTsKICAgICAgICBtYXJnaW4tdG9wOiAyZW07CiAgICAgICAgcGFkZGluZzogMWVtOwogICAgICB9CiAgICAgIAogICAgICBoMiB7CiAgICAgICAgbWFyZ2luLXRvcDogMDsKICAgICAgfQogICAgICAKICAgICAgc3ZnIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgI3RlbXBsYXRlIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvaGVhZD4KICA8Ym9keT4KICAgIDxkaXYgaWQ9InRlbXBsYXRlIj4KICAgICAgPHN2ZyBjbGFzcz0iaGVhcnRzdmcgc3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CiAgICAgICAgPHBhdGggZD0iTTkuNzE5LDE3LjA3M2wtNi41NjItNi41MWMtMC4yNy0wLjI2OC0wLjUwNC0wLjU2Ny0wLjY5Ni0wLjg4OEMxLjM4NSw3Ljg5LDEuNjcsNS42MTMsMy4xNTUsNC4xNGMwLjg2NC0wLjg1NiwyLjAxMi0xLjMyOSwzLjIzMy0xLjMyOWMxLjkyNCwwLDMuMTE1LDEuMTIsMy42MTIsMS43NTJjMC40OTktMC42MzQsMS42ODktMS43NTIsMy42MTItMS43NTJjMS4yMjEsMCwyLjM2OSwwLjQ3MiwzLjIzMywxLjMyOWMxLjQ4NCwxLjQ3MywxLjc3MSwzLjc1LDAuNjkzLDUuNTM3Yy0wLjE5LDAuMzItMC40MjUsMC42MTgtMC42OTUsMC44ODdsLTYuNTYyLDYuNTFDMTAuMTI1LDE3LjIyOSw5Ljg3NSwxNy4yMjksOS43MTksMTcuMDczIE02LjM4OCwzLjYxQzUuMzc5LDMuNjEsNC40MzEsNCwzLjcxNyw0LjcwN0MyLjQ5NSw1LjkyLDIuMjU5LDcuNzk0LDMuMTQ1LDkuMjY1YzAuMTU4LDAuMjY1LDAuMzUxLDAuNTEsMC41NzQsMC43MzFMMTAsMTYuMjI4bDYuMjgxLTYuMjMyYzAuMjI0LTAuMjIxLDAuNDE2LTAuNDY2LDAuNTczLTAuNzI5YzAuODg3LTEuNDcyLDAuNjUxLTMuMzQ2LTAuNTcxLTQuNTZDMTUuNTcsNCwxNC42MjEsMy42MSwxMy42MTIsMy42MWMtMS40MywwLTIuNjM5LDAuNzg2LTMuMjY4LDEuODYzYy0wLjE1NCwwLjI2NC0wLjUzNiwwLjI2NC0wLjY5LDBDOS4wMjksNC4zOTcsNy44MiwzLjYxLDYuMzg4LDMuNjEiPjwvcGF0aD4KICAgICAgPC9zdmc+CiAgICAgIDxzdmcgY2xhc3M9InZpZGVvc3ZnIHN2Zy1pY29uIiB2aWV3Qm94PSIwIDAgMjAgMjAiPgoJCQkJPHBhdGggZD0iTTE4LjE3NSw0LjE0MkgxLjk1MUMxLjcwMyw0LjE0MiwxLjUsNC4zNDQsMS41LDQuNTkydjEwLjgxNmMwLDAuMjQ3LDAuMjAzLDAuNDUsMC40NTEsMC40NWgxNi4yMjRjMC4yNDcsMCwwLjQ1LTAuMjAzLDAuNDUtMC40NVY0LjU5MkMxOC42MjUsNC4zNDQsMTguNDIyLDQuMTQyLDE4LjE3NSw0LjE0MiBNNC42NTUsMTQuOTU3SDIuNDAxdi0xLjgwM2gyLjI1M1YxNC45NTd6TTQuNjU1LDEyLjI1NEgyLjQwMXYtMS44MDNoMi4yNTNWMTIuMjU0eiBNNC42NTUsOS41NDlIMi40MDFWNy43NDdoMi4yNTNWOS41NDl6IE00LjY1NSw2Ljg0NkgyLjQwMVY1LjA0M2gyLjI1M1Y2Ljg0NnpNMTQuNTY5LDE0Ljk1N0g1LjU1NlY1LjA0M2g5LjAxM1YxNC45NTd6IE0xNy43MjQsMTQuOTU3aC0yLjI1M3YtMS44MDNoMi4yNTNWMTQuOTU3eiBNMTcuNzI0LDEyLjI1NGgtMi4yNTN2LTEuODAzaDIuMjUzVjEyLjI1NHpNMTcuNzI0LDkuNTQ5aC0yLjI1M1Y3Ljc0N2gyLjI1M1Y5LjU0OXogTTE3LjcyNCw2Ljg0NmgtMi4yNTNWNS4wNDNoMi4yNTNWNi44NDZ6Ij48L3BhdGg+CgkJCTwvc3ZnPgoJCQk8c3ZnIGNsYXNzPSJpbWFnZXN2ZyBzdmctaWNvbiIgdmlld0JveD0iMCAwIDIwIDIwIj4KCQkJCTxwYXRoIGQ9Ik0xOC41NTUsMTUuMzU0VjQuNTkyYzAtMC4yNDgtMC4yMDItMC40NTEtMC40NS0wLjQ1MUgxLjg4OGMtMC4yNDgsMC0wLjQ1MSwwLjIwMy0wLjQ1MSwwLjQ1MXYxMC44MDhjMCwwLjU1OSwwLjc1MSwwLjQ1MSwwLjQ1MSwwLjQ1MWgxNi4yMTdoMC4wMDVDMTguNzkzLDE1Ljg1MSwxOC40NzgsMTQuODE0LDE4LjU1NSwxNS4zNTQgTTIuOCwxNC45NDlsNC45NDQtNi40NjRsNC4xNDQsNS40MTljMC4wMDMsMC4wMDMsMC4wMDMsMC4wMDMsMC4wMDMsMC4wMDVsMC43OTcsMS4wNEgyLjh6IE0xMy44MjIsMTQuOTQ5bC0xLjAwNi0xLjMxN2wxLjY4OS0yLjIxOGwyLjY4OCwzLjUzNUgxMy44MjJ6IE0xNy42NTQsMTQuMDY0bC0yLjc5MS0zLjY2NmMtMC4xODEtMC4yMzctMC41MzUtMC4yMzctMC43MTYsMGwtMS44OTksMi40OTNsLTQuMTQ2LTUuNDJjLTAuMTgtMC4yMzctMC41MzYtMC4yMzctMC43MTYsMGwtNS4wNDcsNi41OThWNS4wNDJoMTUuMzE2VjE0LjA2NHogTTEyLjQ3NCw2LjM5M2MtMC44NjksMC0xLjU3NywwLjcwNy0xLjU3NywxLjU3NnMwLjcwOCwxLjU3NiwxLjU3NywxLjU3NnMxLjU3Ny0wLjcwNywxLjU3Ny0xLjU3NlMxMy4zNDMsNi4zOTMsMTIuNDc0LDYuMzkzIE0xMi40NzQsOC42NDVjLTAuMzcxLDAtMC42NzYtMC4zMDQtMC42NzYtMC42NzZzMC4zMDUtMC42NzYsMC42NzYtMC42NzZjMC4zNzIsMCwwLjY3NiwwLjMwNCwwLjY3NiwwLjY3NlMxMi44NDYsOC42NDUsMTIuNDc0LDguNjQ1Ij48L3BhdGg+CgkJCTwvc3ZnPgogICAgICA8ZGl2IGlkPSJjb2xzY3NzIj4KICAgICAgLmNvbHMke2NvbHN9ICNpbWFnZXMgLml0ZW0gewogICAgICAgIHdpZHRoOiBjYWxjKDEwMHZ3IC8gJHtjb2xzfSk7CiAgICAgIH0KCiAgICAgIC5jb2xzJHtjb2xzfSAjaW1hZ2VzIC5pdGVtIHsKICAgICAgICBoZWlnaHQ6IGNhbGMoMTAwdncgLyAke2NvbHN9KTsKICAgICAgfQogICAgICAKICAgICAgLmNvbHMke2NvbHN9IC5xdWVyeSwKICAgICAgLmNvbHMke2NvbHN9IC5saWtlIHsKICAgICAgICBmb250LXNpemU6IG1pbigxNHZ3ICogKDEgLyAke2NvbHN9KSwgNmVtICogKDEgLyAke2NvbHN9KSkKICAgICAgfQogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0ic2hhcmUtZGlhbG9nIiBjbGFzcz0iZGlhbG9nIj4KICAgICAgPGgyPnNoYXJlPC9oMj4KICAgICAgPGZvcm0gaWQ9InNoYXJlLWZvcm0iIGFjdGlvbj0iIyI+CiAgICAgICAgPHAgY2xhc3M9ImNvbnRlbnQiPjwvcD4KICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiBjbGFzcz0ic3VibWl0IiB2YWx1ZT0ib2siLz4KICAgICAgPC9mb3JtPgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJtZWRpYS1mb290ZXIiPgogICAgICA8YSBpZD0iaW1hZ2UtbGlrZSIgY2xhc3M9Imxpa2UiIGhyZWY9IiMiPjwvYT4KICAgICAgPGEgaWQ9ImltYWdlLXF1ZXJ5IiBjbGFzcz0ibGluayIgaHJlZj0iIyI+PC9hPgogICAgICA8YSBpZD0iaW1hZ2UtdXNlciIgY2xhc3M9ImxpbmsiIGhyZWY9IiMiPjwvYT4KICAgIDwvZGl2PgogICAgPGNlbnRlciBpZD0ibWVkaWEtY29udGFpbmVyIj4KICAgICAgPGRpdiBpZD0iaW1hZ2UtY29udGFpbmVyIj4KICAgICAgICA8aW1nIGlkPSJpbWFnZSIvPgogICAgICA8L2Rpdj4KICAgIDwvY2VudGVyPgogICAgPGRpdiBpZD0ib3ZlcmxheSIgY2xhc3M9ImRpYWxvZyI+PC9kaXY+CiAgICA8ZGl2IGlkPSJtZW51LWNvbnRlbnQiIGNsYXNzPSJkaWFsb2ciPgogICAgICA8ZGl2IGNsYXNzPSJpdGVtcyI+CiAgICAgICAgPGgxPjxhIGNsYXNzPSJ0aXRsZSIgaHJlZj0iIyI+ZmlsZXMuaHRtbDwvYT48L2gxPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5hdXRvcGxheTwvZGl2PgogICAgICAgIDxhIGNsYXNzPSJidXR0b24gc2V0YXV0b3BsYXkiIGRhdGEtYXV0b3BsYXk9Im9uIiBocmVmPSIjIj5vbjwvYT4KICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIHNldGF1dG9wbGF5IiBkYXRhLWF1dG9wbGF5PSJvZmYiIGhyZWY9IiMiPm9mZjwvYT4KICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIHNldGF1dG9wbGF5IiBkYXRhLWF1dG9wbGF5PSJob3ZlciIgaHJlZj0iIyI+bW91c2VvdmVyPC9hPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5jb2x1bW5zPC9kaXY+CiAgICAgICAgPGEgY2xhc3M9ImJ1dHRvbiBzZXRjb2xzIiBkYXRhLWNvbHM9IjEiIGhyZWY9IiMiPjE8L2E+CiAgICAgICAgPGEgY2xhc3M9ImJ1dHRvbiBzZXRjb2xzIiBkYXRhLWNvbHM9IjIiIGhyZWY9IiMiPjI8L2E+CiAgICAgICAgPGEgY2xhc3M9ImJ1dHRvbiBzZXRjb2xzIiBkYXRhLWNvbHM9IjQiIGhyZWY9IiMiPjQ8L2E+CiAgICAgICAgPGEgY2xhc3M9ImJ1dHRvbiBzZXRjb2xzIiBkYXRhLWNvbHM9IjYiIGhyZWY9IiMiPjY8L2E+CiAgICAgICAgPGEgY2xhc3M9ImJ1dHRvbiBzZXRjb2xzIiBkYXRhLWNvbHM9IjEwIiBocmVmPSIjIj4xMDwvYT4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+Y29ubmVjdGlvbnM8L2Rpdj4KICAgICAgICA8ZGl2IGlkPSJjb25uY291bnQiPjA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+cmVsYXlzOjwvZGl2PgogICAgICAgIDxwPlBsZWFzZSB1c2UgcmVsYXlzIHdpdGggTklQLTUwIChzZWFyY2gpIGZ1bmN0aW9uYWxpdHk8L3A+CiAgICAgICAgPGZvcm0gYWN0aW9uPSIjIiBpZD0icmVsYXlzLWZvcm0iPgogICAgICAgICAgPHRleHRhcmVhIGlkPSJyZWxheXMiPjwvdGV4dGFyZWE+CiAgICAgICAgICA8aW5wdXQgY2xhc3M9InN1Ym1pdCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0ic2F2ZSByZWxheXMiLz4KICAgICAgICA8L2Zvcm0+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPnByaXZhdGUga2V5OjwvZGl2PgogICAgICAgIDxwPklmIHlvdSBjYW50IHVzZSBicm93c2VyIGFkZG9uIChtb2JpbGUpPC9wPgogICAgICAgIDxmb3JtIGFjdGlvbj0iIyIgaWQ9InByaXZrZXktZm9ybSI+CiAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9InByaXZrZXkiLz4KICAgICAgICAgIDxpbnB1dCBjbGFzcz0ic3VibWl0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJzYXZlIGtleSIvPgogICAgICAgIDwvZm9ybT4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+bG9nczwvZGl2PgogICAgICAgIDxkaXYgaWQ9ImxvZ3MiPjwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5sYXRlc3QgcmVsZWFzZTo8L2Rpdj4KICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIGxpbmsiIGlkPSJyZWxlYXNlIiBocmVmPSIjIj48L2E+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJoZWFkZXIiPgogICAgICA8ZGl2IGNsYXNzPSJpY29ucyI+CiAgICAgICAgPGEgaWQ9ImZpbHRlci1saWtlcyIgaHJlZj0iIyIgY2xhc3M9ImhlYWRlci1pY29uIj48L2E+CiAgICAgICAgPGEgaWQ9InNoYXJlIiBocmVmPSIjIiBjbGFzcz0iaGVhZGVyLWljb24iPgogICAgICAgICAgPHN2ZyBjbGFzcz0ic3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CgkJCQkgICAgPHBhdGggZD0iTTE0LjY4LDEyLjYyMWMtMC45LDAtMS43MDIsMC40My0yLjIxNiwxLjA5bC00LjU0OS0yLjYzN2MwLjI4NC0wLjY5MSwwLjI4NC0xLjQ1NywwLTIuMTQ2bDQuNTQ5LTIuNjM4YzAuNTE0LDAuNjYxLDEuMzE1LDEuMDksMi4yMTYsMS4wOWMxLjU0OSwwLDIuODA5LTEuMjYsMi44MDktMi44MDhjMC0xLjU0OC0xLjI2LTIuODA5LTIuODA5LTIuODA5Yy0xLjU0OCwwLTIuODA4LDEuMjYtMi44MDgsMi44MDljMCwwLjM4LDAuMDc2LDAuNzQxLDAuMjE0LDEuMDczbC00LjU1LDIuNjM4Yy0wLjUxNS0wLjY2MS0xLjMxNi0xLjA5LTIuMjE3LTEuMDljLTEuNTQ4LDAtMi44MDgsMS4yNi0yLjgwOCwyLjgwOXMxLjI2LDIuODA4LDIuODA4LDIuODA4YzAuOSwwLDEuNzAyLTAuNDMsMi4yMTctMS4wOWw0LjU1LDIuNjM3Yy0wLjEzOCwwLjMzMi0wLjIxNCwwLjY5My0wLjIxNCwxLjA3NGMwLDEuNTQ5LDEuMjYsMi44MDksMi44MDgsMi44MDljMS41NDksMCwyLjgwOS0xLjI2LDIuODA5LTIuODA5UzE2LjIyOSwxMi42MjEsMTQuNjgsMTIuNjIxTTE0LjY4LDIuNTEyYzEuMTM2LDAsMi4wNiwwLjkyMywyLjA2LDIuMDZTMTUuODE1LDYuNjMsMTQuNjgsNi42M3MtMi4wNTktMC45MjMtMi4wNTktMi4wNTlTMTMuNTQ0LDIuNTEyLDE0LjY4LDIuNTEyTTUuMzE5LDEyLjA2MWMtMS4xMzYsMC0yLjA2LTAuOTI0LTIuMDYtMi4wNnMwLjkyMy0yLjA1OSwyLjA2LTIuMDU5YzEuMTM1LDAsMi4wNiwwLjkyMywyLjA2LDIuMDU5UzYuNDU0LDEyLjA2MSw1LjMxOSwxMi4wNjFNMTQuNjgsMTcuNDg4Yy0xLjEzNiwwLTIuMDU5LTAuOTIyLTIuMDU5LTIuMDU5czAuOTIzLTIuMDYxLDIuMDU5LTIuMDYxczIuMDYsMC45MjQsMi4wNiwyLjA2MVMxNS44MTUsMTcuNDg4LDE0LjY4LDE3LjQ4OCI+PC9wYXRoPgoJCQkgICAgPC9zdmc+CgkJCSAgPC9hPgoJCQk8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iaXRlbXMiPgogICAgICAgIDxhIGNsYXNzPSJ0aXRsZSIgaHJlZj0iIyI+ZmlsZXMuaHRtbDwvYT4KICAgICAgICA8YSBpZD0ibWVudSIgaHJlZj0iIyI+CiAgICAgICAgICA8c3ZnIGNsYXNzPSJtZW51c3ZnIHN2Zy1pY29uIiB2aWV3Qm94PSIwIDAgMjAgMjAiPgoJCSAgICAgICAgPHBhdGggZD0iTTEwLDEuNDQ1Yy00LjcyNiwwLTguNTU1LDMuODI5LTguNTU1LDguNTU1YzAsNC43MjUsMy44MjksOC41NTUsOC41NTUsOC41NTVjNC43MjUsMCw4LjU1NS0zLjgzLDguNTU1LTguNTU1QzE4LjU1NSw1LjI3NCwxNC43MjUsMS40NDUsMTAsMS40NDUgTTEwLDE3LjY1NGMtNC4yMjEsMC03LjY1NC0zLjQzNC03LjY1NC03LjY1NGMwLTQuMjIxLDMuNDMzLTcuNjU0LDcuNjU0LTcuNjU0YzQuMjIyLDAsNy42NTQsMy40MzMsNy42NTQsNy42NTRDMTcuNjU0LDE0LjIyMSwxNC4yMjIsMTcuNjU0LDEwLDE3LjY1NCBNMTQuMzksMTBjMCwwLjI0OC0wLjIwMywwLjQ1LTAuNDUsMC40NUg2LjA2Yy0wLjI0OCwwLTAuNDUtMC4yMDMtMC40NS0wLjQ1czAuMjAzLTAuNDUsMC40NS0wLjQ1aDcuODc5QzE0LjE4Nyw5LjU1LDE0LjM5LDkuNzUyLDE0LjM5LDEwIE0xNC4zOSwxMi43MDJjMCwwLjI0Ny0wLjIwMywwLjQ0OS0wLjQ1LDAuNDQ5SDYuMDZjLTAuMjQ4LDAtMC40NS0wLjIwMi0wLjQ1LTAuNDQ5YzAtMC4yNDgsMC4yMDMtMC40NTEsMC40NS0wLjQ1MWg3Ljg3OUMxNC4xODcsMTIuMjUxLDE0LjM5LDEyLjQ1NCwxNC4zOSwxMi43MDIgTTE0LjM5LDcuMjk4YzAsMC4yNDgtMC4yMDMsMC40NS0wLjQ1LDAuNDVINi4wNmMtMC4yNDgsMC0wLjQ1LTAuMjAzLTAuNDUtMC40NXMwLjIwMy0wLjQ1LDAuNDUtMC40NWg3Ljg3OUMxNC4xODcsNi44NDgsMTQuMzksNy4wNTEsMTQuMzksNy4yOTgiPjwvcGF0aD4KCSAgICAgICAgPC9zdmc+CiAgICAgICAgPC9hPgogICAgICAgIDxmb3JtIGlkPSJxdWVyeS1mb3JtIiBhY3Rpb249IiMiPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJxdWVyeSIgbmFtZT0icXVlcnkiIGlkPSIiIC8+CiAgICAgICAgICA8c2VsZWN0IGlkPSJxdWVyeS10eXBlIj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iYWxsIj5hbGw8L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaW1hZ2UiPmltYWdlczwvb3B0aW9uPgogICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJ2aWRlbyI+dmlkZW9zPC9vcHRpb24+CiAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgIDxpbnB1dCBpZD0iZ28iIHR5cGU9InN1Ym1pdCIgdmFsdWU9ImdvIi8+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxzcGFuIGlkPSJxdWVyeWRpc3BsYXkiPgogICAgICAgICAgPHNwYW4gY2xhc3M9InRleHQiPjwvc3Bhbj4KICAgICAgICA8L3NwYW4+CiAgICAgICAgPGRpdiBpZD0ibG9hZGluZyI+dXBkYXRpbmc8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9InBsYWNlaG9sZGVyIj5Tb21ldGhpbmcgc2hvdWxkIGxvYWQgc29vbiwgbWF5YmUuPC9kaXY+CiAgICA8ZGl2IGlkPSJpbWFnZXMiPjwvZGl2PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vdW5wa2cuY29tL25vc3RyLXRvb2xzL2xpYi9ub3N0ci5idW5kbGUuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vc2xvd2xpLmdpdGh1Yi5pby9iZWNoMzItYnVmZmVyL2Fzc2V0cy9qcy9iZWNoMzItYnVmZmVyLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0PgogICAgICBjb25zdCB1cGRhdGVzcHVia2V5ID0gImFlNWM2ZTBiNzQ2NjBkMjE5NGM4MjU0YjVjMmM4MjU2NzY1NzZiZTAyOTczNzlmYTIwNTIzMTE0YTZhODVlODciCiAgICAgIGNvbnN0IHF1ZXJpZXMgPSB7IAogICAgICAgICJhdXRob3IiOiAnWyJSRVEiLCI8ST4iLHsia2luZHMiOlsxXSwiYXV0aG9ycyI6WyI8UD4iXX1dJwogICAgICB9CiAgICAgIHFzKCIjcmVsYXlzIikudmFsdWUgPSByZWxheXMoKS5qb2luKCJcbiIpCiAgICAgIHFzKCIjcHJpdmtleSIpLnZhbHVlID0gcHJpdmtleSgpCiAgICAgIGNvbnN0IGNvbG9wdHMgPSBbMSwgMiwgNCwgNiwgMTBdCgogICAgICBjb2xzID0gKCkgPT4gcGFyc2VJbnQoc2V0dGluZygiY29scyIsIGNvbG9wdHNbMl0pLCAxMCkKICAgICAgYXV0b3BsYXkgPSAoKSA9PiBzZXR0aW5nKCJhdXRvcGxheSIsICJvZmYiKQogICAgICBsaW1pdCA9ICgpID0+IHBhcnNlSW50KHNldHRpbmcoImxpbWl0IiwgMTUpLCAxMCkKICAgICAgZ2FsbGVyeSA9ICgpID0+IHsKICAgICAgICBsZXQgZ2FsbGVyeW1hdGNoZXIgPSBsb2NhdGlvbi5zZWFyY2gubWF0Y2goL2dhbGxlcnk9KFthLXowLTldKykvKQogICAgICAgIHJldHVybiBnYWxsZXJ5bWF0Y2hlciAmJiBnYWxsZXJ5bWF0Y2hlclsxXQogICAgICB9CiAgICAgIHZpZXdwdWJrZXkgPSAoKSA9PiB7CiAgICAgICAgbGV0IHB1YmtleW1hdGNoZXIgPSBsb2NhdGlvbi5zZWFyY2gubWF0Y2goL3B1YmtleT0oW2EtejAtOV0rKS8pCiAgICAgICAgcmV0dXJuIHB1YmtleW1hdGNoZXIgJiYgcHVia2V5bWF0Y2hlclsxXQogICAgICB9CiAgICAgIAogICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoImNvbHMiICsgY29scygpKQoKICAgICAgbGV0IHByb3RvY29sID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlLykgPyAibm9zdHI6IiA6ICJ3ZWIrbm9zdHI6IgogICAgICBsZXQgc29ja2V0cyA9IFtdCiAgICAgIGxldCByZXNoYW5kbGVycyA9IFtdCiAgICAgIGxldCB1cmxzID0gW10KICAgICAgbGV0IGxpa2VzID0gW10KICAgICAgbGV0IG5ld2xpa2VzID0gW10KICAgICAgbGV0IGlkY291bnRlciA9IDAKICAgICAgbGV0IHF1ZXJ5d2FpdCA9IG51bGwKICAgICAgbGV0IHByaW1hbHNvY2tldCA9IG51bGwKICAgICAgbGV0IHR5cGVzID0gewogICAgICAgIGltYWdlOiBbInBuZyIsICJqcGciLCAianBlZyIsICJ3ZWJwIl0sCiAgICAgICAgdmlkZW86IFsibXA0IiwgIndlYm0iXQogICAgICB9CiAgICAgIGxldCBpbWdyZWdleCA9IC9odHRwKHxzKVw6XC9cL1teIFxuXSo/XC4ocG5nfGpwZ3xqcGVnfHdlYnApL2dpCiAgICAgIGxldCB2aWRlb3JlZ2V4ID0gL2h0dHAofHMpXDpcL1wvW14gXG5dKj9cLihtcDR8d2VibSkvZ2kKICAgICAgbGV0IHZpZGVvZXh0cmVnZXggPSAvXC4obXA0fHdlYm0pJC9pCiAgICAgIGxldCBpbWdleHRyZWdleCA9IC9cLihwbmd8anBnfGpwZWd8d2VicCkkL2kKICAgICAgd2FpdG1zID0gNTAwMDAKICAgICAgcXVlcnlzdHIgPSAiIgogICAgICBsZXQgcXVlcnljb3VudCA9IDAKICAgICAgbGV0IGhvdmVyZWR2aWRlbyA9IG51bGwKICAgICAgCiAgICAgIHVwZGF0ZXF1ZXJ5KCkKICAgICAgcXMoIiNpbWFnZS1saWtlIikuaW5uZXJIVE1MID0gcXMoIiNmaWx0ZXItbGlrZXMiKS5pbm5lckhUTUwgPSBxcygiI3RlbXBsYXRlIC5oZWFydHN2ZyIpLm91dGVySFRNTAogICAgICBzZXRhY3RpdmUoInNldGNvbHMiLCAiY29scyIsIGNvbHMoKSkKICAgICAgc2V0YWN0aXZlKCJzZXRhdXRvcGxheSIsICJhdXRvcGxheSIsIGF1dG9wbGF5KCkpCiAgICAgIAogICAgICBmdW5jdGlvbiBmcm9tSGV4U3RyaW5nKHN0cil7CiAgICAgICAgbGV0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHN0ci5sZW5ndGggLyAyKQogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnVmZmVyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBidWZmZXJbaV0gPSBwYXJzZUludChzdHIuc3Vic3RyKDIgKiBpLCAyKSwgMTYpCiAgICAgICAgfQogICAgICAgIHJldHVybiBidWZmZXIKICAgICAgfQogIAogICAgICBmdW5jdGlvbiByZWxheXMoKXsKICAgICAgICBjb25zdCBvYmogPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJyZWxheXMiKSkKICAgICAgICBjb25zdCByID0gb2JqICYmIG9iai5maWx0ZXIociA9PiByLm1hdGNoKC93c3M6XC9cLy4rLykpIHx8IFtdCiAgICAgICAgCiAgICAgICAgcmV0dXJuIHIubGVuZ3RoID4gMCAmJiByIHx8IFsKICAgICAgICAgICJ3c3M6Ly9yZWxheS5ub3N0ci5iYW5kIiwKICAgICAgICAgICJ3c3M6Ly9uYi5yZWxheS5jZW50ZXIiLCAKICAgICAgICAgICJ3c3M6Ly9ub3N0ci5jb21waWxlLWVycm9yLm5ldCIKICAgICAgICBdCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHByaXZrZXkoKXsKICAgICAgICBsZXQga2V5ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oInByaXZrZXkiKSB8fCAiIgogICAgICAgIAogICAgICAgIGlmKGtleS5sZW5ndGggPT0gNjMpewogICAgICAgICAga2V5ID0gTm9zdHJUb29scy5uaXAxOS5kZWNvZGUoa2V5KS5kYXRhCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybiBrZXkubGVuZ3RoID09IDY0ICYmIGtleSB8fCBudWxsCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHNldHRpbmcoa2V5LCBkZWZhdWx0dmFsdWUpewogICAgICAgIGNvbnN0IHYgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpCiAgICAgICAgcmV0dXJuIHYgJiYgb3B0aW9uKCJzZXQiICsga2V5LCBrZXksIHYpICYmIHYgfHwgZGVmYXVsdHZhbHVlCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIG9wdGlvbihjLCBrZXksIHZhbCl7CiAgICAgICAgcmV0dXJuIHFzKCIuIiArIGMgKyAiW2RhdGEtIiArIGtleSArICI9JyIgKyB2YWwgKyAiJ10iKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxcyhxKXsKICAgICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihxKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxc2EocSl7CiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChxKSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gZ2lkKGkpewogICAgICAgIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxdWVyeXR5cGUoKXsKICAgICAgICByZXR1cm4gcXMoIiNxdWVyeS10eXBlIikudmFsdWUgfHwgImFsbCIKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gdXBkYXRlcXVlcnkoKXsKICAgICAgICBsZXQgc3RyID0gKGdhbGxlcnkoKSAmJiAiZzoiICsgZ2FsbGVyeSgpKQogICAgICAgIHN0ciA9IHN0ciB8fCAodmlld3B1YmtleSgpICYmICJrOiIgKyB2aWV3cHVia2V5KCkpCiAgICAgICAgc3RyID0gc3RyIHx8IGRlY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5oYXNoLnN1YnN0cmluZygxKSkgIAogICAgICAgIGxldCBwYXJ0cyA9IHN0ci5zcGxpdCgiLyIpCiAgICAgICAgcXMoIiNxdWVyeWRpc3BsYXkgLnRleHQiKS5pbm5lclRleHQgPSBwYXJ0c1swXQogICAgICAgIHF1ZXJ5c3RyID0gcGFydHNbMF0KICAgICAgICBxcygiI3F1ZXJ5IikudmFsdWUgPSBwYXJ0c1swXQogICAgICAgIHFzKCIjcXVlcnktdHlwZSIpLnZhbHVlID0gcGFydHNbMV0gfHwgImFsbCIKICAgICAgfQoKICAgICAgZnVuY3Rpb24gYWN0aXZlKCl7CiAgICAgICAgcmV0dXJuIHFzKCIjaW1hZ2VzIC5hY3RpdmUiKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBpbWFnZW9mZnNldChvZmZzZXQpewogICAgICAgIGNvbnN0IGltYWdlcyA9IHFzYSgiI2ltYWdlcyA+IC5pdGVtIikuZmlsdGVyKG4gPT4gbi5vZmZzZXRQYXJlbnQpLmZpbHRlcihlID0+IGUuY2xhc3NMaXN0LmNvbnRhaW5zKCJ2aXNpYmxlIikpCiAgICAgICAgcmV0dXJuIGltYWdlc1tpbWFnZXMuaW5kZXhPZihhY3RpdmUoKSkrb2Zmc2V0XQogICAgICB9CgogICAgICBmdW5jdGlvbiBsYXN0YWN0aXZlKCl7CiAgICAgICAgcmV0dXJuIHFzYSgiI2ltYWdlcyAuYWN0aXZlIikucG9wKCkgICAgICAKICAgICAgfQoKICAgICAgZnVuY3Rpb24gbWVudSgpewogICAgICAgIHFzYSgiI21lbnUtY29udGVudCwgI292ZXJsYXkiKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QudG9nZ2xlKCJ2aXNpYmxlIikpCiAgICAgIH0KICAKICAgICAgZnVuY3Rpb24gc2V0YWN0aXZlKGMsIGtleSwgdmFsKXsKICAgICAgICBxc2EoIi4iICsgYykuZm9yRWFjaChuID0+IG4uY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikpCiAgICAgICAgY29uc3Qgb3B0aW9uID0gcXMoIi4iICsgYyArICJbZGF0YS0iICsga2V5ICsgIj0nIiArIHZhbCArICInXSIpCiAgICAgICAgb3B0aW9uPy5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBzY3JvbGx2aXNpYmxlKG4sIG9mZnNldCl7CiAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0IHx8IDAKICAgICAgICByZXR1cm4gKG4ub2Zmc2V0VG9wICsgbi5vZmZzZXRIZWlnaHQpID49IChzY3JvbGxZIC0gb2Zmc2V0KQogICAgICAgICAgJiYgbi5vZmZzZXRUb3AgPD0gKHNjcm9sbFkgKyB2aXN1YWxWaWV3cG9ydC5oZWlnaHQgKyBvZmZzZXQpCiAgICAgIH0KCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZWltYWdlc2xvYWQoKXsKICAgICAgICBxc2EoIiNpbWFnZXMgLml0ZW0uaW1nIikuZm9yRWFjaChhc3luYyBpbWcgPT4gewogICAgICAgICAgaWYoc2Nyb2xsdmlzaWJsZShpbWcsIHZpc3VhbFZpZXdwb3J0LmhlaWdodCAvIDIpKXsKICAgICAgICAgICAgaW1nLnN0eWxlLmJhY2tncm91bmRJbWFnZSA9ICJ1cmwoIiArIGltZ1siZGF0YS1zcmMiXSArICIpIgogICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIGltZy5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSAiIgogICAgICAgICAgfQogICAgICAgIH0pCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZWFsbHZpZGVvcGxheSgpewogICAgICAgIHFzYSgiI2ltYWdlcyAuaXRlbS52aWRlbyIpLmZvckVhY2goYXN5bmMgbiA9PiB1cGRhdGV2aWRlb3BsYXkobikpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHByZXZpZXd1cmxzKCl7CiAgICAgICAgcmV0dXJuIHFzYSgiI2ltYWdlcyAuaXRlbSIpLmZpbHRlcihuID0+IG4ub2Zmc2V0UGFyZW50KS5zbGljZSgwLCA0KS5tYXAobiA9PiBuWyJkYXRhLWl0ZW0iXS51cmwpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZXZpZGVvcGxheShuKXsKICAgICAgICBjb25zdCBhcGxheSA9IGF1dG9wbGF5KCkKICAgICAgICBjb25zdCB2ID0gbi5xdWVyeVNlbGVjdG9yKCJ2aWRlbyIpCiAgICAgICAgCiAgICAgICAgaWYoYXBsYXkgIT0gIm9uIil7CiAgICAgICAgICB2Lm11dGVkID0gZmFsc2UKICAgICAgICAgIHYucGF1c2UoKQogICAgICAgIH1lbHNlewogICAgICAgICAgdi5tdXRlZCA9IHRydWUKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoIXNjcm9sbHZpc2libGUobikpewogICAgICAgICAgaWYodi5yZWFkeVN0YXRlID09IDQpewogICAgICAgICAgICB2LnBhdXNlKCkKICAgICAgICAgIH1lbHNlewogICAgICAgICAgICB2LnByZWxvYWQgPSAibm9uZSIKICAgICAgICAgIH0KICAgICAgICB9ZWxzZSBpZih2LnJlYWR5U3RhdGUgIT0gNCl7CiAgICAgICAgICB2LnByZWxvYWQgPSAiYXV0byIKICAgICAgICB9CiAgICAgICAgZWxzZSBpZihhcGxheSA9PSAib24iIHx8IChhcGxheSA9PSAiaG92ZXIiICYmIHYgPT0gaG92ZXJlZHZpZGVvKSl7CiAgICAgICAgICB2LnBsYXkoKQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIiwgZSA9PiB7CiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKQogICAgICAgIHVwZGF0ZWltYWdlc2xvYWQoKQogICAgICAgIHVwZGF0ZWFsbHZpZGVvcGxheSgpCiAgICAgIH0pCiAgICAgIAogICAgICBsZXQgdG91Y2ggPSBudWxsCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IiwgZSA9PiB0b3VjaCA9IGUuY2hhbmdlZFRvdWNoZXNbMF0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsIGUgPT4gewogICAgICAgIGNvbnN0IHhkaWZmID0gZS5jaGFuZ2VkVG91Y2hlc1swXS5zY3JlZW5YIC0gdG91Y2guc2NyZWVuWAoKICAgICAgICBpZih4ZGlmZiA8IC01MCl7CiAgICAgICAgICBzd2lwZSgxKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZih4ZGlmZiA+IDUwKXsKICAgICAgICAgIHN3aXBlKC0xKQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIHFzKCIjcXVlcnktZm9ybSIpLmFkZEV2ZW50TGlzdGVuZXIoInN1Ym1pdCIsIGUgPT4gewogICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgIHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZShudWxsLCBudWxsLCBsb2NhdGlvbi5wYXRobmFtZSkKICAgICAgICBsb2NhdGlvbi5oYXNoID0gIiMiICsgZW5jb2RlVVJJQ29tcG9uZW50KHFzKCIjcXVlcnkiKS52YWx1ZSArICIvIiArIHF1ZXJ5dHlwZSgpKQogICAgICAgIHVwZGF0ZXF1ZXJ5KCkKICAgICAgICBxdWVyeXdhaXQucmVzb2x2ZSgpCiAgICAgIH0pCgogICAgICBxcygiI3JlbGF5cy1mb3JtIikuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgYXN5bmMgZSA9PiB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgbGV0IHIgPSBKU09OLnN0cmluZ2lmeShxcygiI3JlbGF5cyIpLnZhbHVlLnNwbGl0KCJcbiIpKQogICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJyZWxheXMiLCByKQogICAgICAgIGRpc2Nvbm5lY3QoKQogICAgICB9KQogICAgICAKICAgICAgcXMoIiNzaGFyZS1mb3JtIikuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgYXN5bmMgZSA9PiB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgCiAgICAgICAgaWYocXMoIiNzaGFyZS1mb3JtIC5zdWJtaXQiKS52YWx1ZSA9PSAiY2xvc2UiKXsKICAgICAgICAgIHFzYSgiLmRpYWxvZy52aXNpYmxlIikuZm9yRWFjaChuID0+IG4uY2xhc3NMaXN0LnJlbW92ZSgidmlzaWJsZSIpKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IGV2ZW50cyA9IHFzYSgiI2ltYWdlcyAuaXRlbSIpLmZpbHRlcihuID0+IG4ub2Zmc2V0UGFyZW50KS5tYXAobiA9PiBuWyJkYXRhLWV2ZW50Il0uaWQpCiAgICAgICAgY29uc3QgZXZlbnQgPSBhd2FpdCBwdWJsaXNoKHsKICAgICAgICAgICJraW5kIjogMzMzLAogICAgICAgICAgImNvbnRlbnQiOiBKU09OLnN0cmluZ2lmeShldmVudHMpLAogICAgICAgICAgInRhZ3MiOiBbXQogICAgICAgIH0pCgogICAgICAgIGF3YWl0IHdhaXRyZXMobnVsbCwgIk9LIikKCiAgICAgICAgY29uc3QgdXJsID0gd2luZG93LmxvY2F0aW9uLm9yaWdpbiArIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZQogICAgICAgIAogICAgICAgIGNvbnN0IGNvbnRlbnQgPSAiVGhpcyBpcyBhIGdhbGxlcnkgb2YgIiArIGV2ZW50cy5sZW5ndGgKICAgICAgICAgICAgKyAiIGltYWdlcy92aWRlb3Mgc2hhcmVkIGZyb20gZmlsZXMuaHRtbC4gQ2hlY2sgaXQgb3V0IGhlcmU6ICIgKyB1cmwgKyAiP2dhbGxlcnk9IiArIGV2ZW50LmlkCiAgICAgICAgICAgICsgIlxuXG4iICsgcHJldmlld3VybHMoKS5qb2luKCJcbiIpCiAgICAgICAgCiAgICAgICAgY29uc3QgcHVibGlzaGVkZXZlbnQgPSBhd2FpdCBwdWJsaXNoKHsKICAgICAgICAgICJraW5kIjogMSwKICAgICAgICAgICJjb250ZW50IjogY29udGVudCwKICAgICAgICAgICJ0YWdzIjogWwogICAgICAgICAgICBbIiNlIiwgZXZlbnQuaWRdLCAKICAgICAgICAgICAgWyIjcCIsIGV2ZW50LnB1YmtleV0KICAgICAgICAgIF0KICAgICAgICB9KQoKICAgICAgICBhd2FpdCB3YWl0cmVzKG51bGwsICJPSyIpCiAgICAgICAgCiAgICAgICAgY29uc3QgYmVjaDMyaWQgPSBiZWNoMzIuZW5jb2RlKCJub3RlIiwgZnJvbUhleFN0cmluZyhwdWJsaXNoZWRldmVudC5pZCkpCiAgICAgICAgcXMoIiNzaGFyZS1mb3JtIC5jb250ZW50IikuaW5uZXJIVE1MID0gJ05vdGUgcHVibGlzaGVkIDxhIGhyZWY9IicgKyBwcm90b2NvbCArIGJlY2gzMmlkICsgJyI+JyArIGJlY2gzMmlkICsgJzwvYT4nCiAgICAgICAgcXMoIiNzaGFyZS1mb3JtIC5zdWJtaXQiKS52YWx1ZSA9ICJjbG9zZSIKICAgICAgfSkKCiAgICAgIHFzKCIjcHJpdmtleS1mb3JtIikuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgYXN5bmMgZSA9PiB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgY29uc3Qga2V5ID0gcXMoIiNwcml2a2V5IikudmFsdWUKCiAgICAgICAgaWYoa2V5Lmxlbmd0aCAhPSA2NCAmJiBrZXkubGVuZ3RoICE9IDYzKXsKICAgICAgICAgIGFsZXJ0KCJrZXkgc2hvdWxkIGJlIDYzIG9yIDY0IGNoYXJhY3RlcnMgbG9uZyIpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oInByaXZrZXkiLCBrZXkpCiAgICAgICAgYWxlcnQoImtleSBzYXZlZCIpCiAgICAgIH0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLCBhc3luYyAoZSkgPT4gewogICAgICAgIGlmKGF1dG9wbGF5KCkgPT0gImhvdmVyIiAmJiBlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInZpZGVvLWNvbnRhaW5lciIpKXsKICAgICAgICAgIGhvdmVyZWR2aWRlbyA9IGUudGFyZ2V0LnF1ZXJ5U2VsZWN0b3IoInZpZGVvIikKICAgICAgICAgIGhvdmVyZWR2aWRlby5wbGF5KCkKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgaG92ZXJlZHZpZGVvID0gZmFsc2UKICAgICAgICBpZighcXMoIiNtZWRpYS1jb250YWluZXIiKS5jbGFzc0xpc3QuY29udGFpbnMoInZpc2libGUiKSAmJiBhdXRvcGxheSgpID09ICJob3ZlciIgJiYgZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ2aWRlby1jb250YWluZXIiKSl7CiAgICAgICAgICBxc2EoInZpZGVvIikuZm9yRWFjaCh2ID0+IHYucGF1c2UoKSkKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgaWYoZS50YXJnZXQudHlwZSA9PSAic3VibWl0IiB8fCAoZS50YXJnZXQudGFnTmFtZSA9PSAiQSIgJiYgZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJsaW5rIikpKXsKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgIAogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygidGl0bGUiKSl7CiAgICAgICAgICBxcygiI3F1ZXJ5IikudmFsdWUgPSAiIgogICAgICAgICAgcXMoIiNxdWVyeS10eXBlIikudmFsdWUgPSAiYWxsIgogICAgICAgICAgcXMoIiNnbyIpLmNsaWNrKCkKICAgICAgICB9CgogICAgICAgIGUucHJldmVudERlZmF1bHQoKQoKICAgICAgICBpZihlLnRhcmdldC5pZCA9PSAiZmlsdGVyLWxpa2VzIil7CiAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC50b2dnbGUoImZpbHRlci1saWtlcyIpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gInNoYXJlIil7CiAgICAgICAgICBjb25zdCBldmVudHMgPSBxc2EoIiNpbWFnZXMgLml0ZW0iKS5maWx0ZXIobiA9PiBuLm9mZnNldFBhcmVudCkubWFwKG4gPT4gblsiZGF0YS1ldmVudCJdLmlkKQogICAgICAgICAgLy9jb25zdCB0ZXh0ID0ge3R5cGU6ICIiLCBldmVudHM6IH0KICAgICAgICAgIHFzKCIjc2hhcmUtZGlhbG9nIC5jb250ZW50IikuaW5uZXJIVE1MID0gIjxwPlNoYXJlIGxpbmsgdG8gdGhpcyBnYWxsZXJ5IG9mICIgKyBldmVudHMubGVuZ3RoICsgIiBpbWFnZXMvdmlkZW9zIHRvIHlvdXIgbm9zdHIgcHJvZmlsZT88L3A+IgogICAgICAgICAgcXMoIiNzaGFyZS1kaWFsb2cgLmNvbnRlbnQiKS5pbm5lckhUTUwgKz0gcHJldmlld3VybHMoKS5tYXAodXJsID0+ICc8aW1nIHNyYz0iJyt1cmwrJyIvPicpLmpvaW4oIiAiKQogICAgICAgICAgcXMoIiNzaGFyZS1mb3JtIC5zdWJtaXQiKS52YWx1ZSA9ICJwdWJsaXNoIgogICAgICAgICAgcXNhKCIjc2hhcmUtZGlhbG9nLCAjb3ZlcmxheSIpLmZvckVhY2gobiA9PiBuLmNsYXNzTGlzdC50b2dnbGUoInZpc2libGUiKSkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzaG93IikpewogICAgICAgICAgYWN0aXZlKCk/LmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgICBjb25zdCBpZCA9IGUudGFyZ2V0LmlkIHx8IGUudGFyZ2V0WyJkYXRhLWl0ZW0taWQiXQogICAgICAgICAgZ2lkKGlkKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgc2hvdyhpZCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLnRhcmdldC50YWdOYW1lICE9ICJBIiAmJiAocXMoIiNpbWFnZS1jb250YWluZXIiKSA9PSBlLnRhcmdldCB8fCBxcygiI2ltYWdlIikgPT0gZS50YXJnZXQgfHwgcXMoIiNtZWRpYS1jb250YWluZXIgdmlkZW8iKSA9PSBlLnRhcmdldCkpewogICAgICAgICAgaGlkZW1lZGlhKCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gIm1lbnUiKXsKICAgICAgICAgIG1lbnUoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLnRhcmdldC5pZCA9PSAib3ZlcmxheSIpewogICAgICAgICAgcXNhKCIuZGlhbG9nLnZpc2libGUiKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QucmVtb3ZlKCJ2aXNpYmxlIikpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzZXRjb2xzIikpewogICAgICAgICAgZm9yKGxldCBjIG9mIGNvbG9wdHMpewogICAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoImNvbHMiICsgYykKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJjb2xzIiArIGUudGFyZ2V0LmRhdGFzZXQuY29scykKICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJjb2xzIiwgZS50YXJnZXQuZGF0YXNldC5jb2xzKQogICAgICAgICAgc2V0YWN0aXZlKCJzZXRjb2xzIiwgImNvbHMiLCBjb2xzKCkpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzZXRhdXRvcGxheSIpKXsKICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJhdXRvcGxheSIsIGUudGFyZ2V0LmRhdGFzZXQuYXV0b3BsYXkpCiAgICAgICAgICBzZXRhY3RpdmUoInNldGF1dG9wbGF5IiwgImF1dG9wbGF5IiwgYXV0b3BsYXkoKSkKICAgICAgICAgIHVwZGF0ZWFsbHZpZGVvcGxheSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJsaWtlIikgJiYgbGlrZShlLnRhcmdldCkKICAgICAgfSkKICAgICAgCiAgICAgIGZ1bmN0aW9uIGhhc2tleSgpewogICAgICAgIHJldHVybiB3aW5kb3cubm9zdHIgfHwgcHJpdmtleSgpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHB1YmtleSgpewogICAgICAgIHJldHVybiB3aW5kb3cubm9zdHIgJiYgYXdhaXQgd2luZG93Lm5vc3RyLmdldFB1YmxpY0tleSgpIHx8IE5vc3RyVG9vbHMuZ2V0UHVibGljS2V5KHByaXZrZXkoKSkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gc2lnbihldmVudCl7CiAgICAgICAgaWYod2luZG93Lm5vc3RyKXsKICAgICAgICAgIHJldHVybiBhd2FpdCBub3N0ci5zaWduRXZlbnQoZXZlbnQpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGV2ZW50LnNpZyA9IE5vc3RyVG9vbHMuZ2V0U2lnbmF0dXJlKGV2ZW50LCBwcml2a2V5KCkpCiAgICAgICAgcmV0dXJuIGV2ZW50CiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGxpa2UobGluayl7CiAgICAgICAgY29uc3QgZXZlbnQgPSBsaW5rLnBhcmVudEVsZW1lbnRbImRhdGEtZXZlbnQiXQogICAgICAgIAogICAgICAgIGF3YWl0IHB1Ymxpc2goewogICAgICAgICAgImtpbmQiOiA3LAogICAgICAgICAgImNvbnRlbnQiOiAiKyIsCiAgICAgICAgICAidGFncyI6IFsKICAgICAgICAgICAgWyJlIiwgZXZlbnQuaWRdLAogICAgICAgICAgICBbInAiLCBldmVudC5wdWJrZXldCiAgICAgICAgICBdCiAgICAgICAgfSkKCiAgICAgICAgbGluay5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKCiAgICAgICAgY29uc3QgaW1hZ2VpZCA9IGxpbmtbImRhdGEtaXRlbS1pZCJdIHx8IGxpbmsuZGF0YXNldC5pbWFnZUlkCiAgICAgICAgCiAgICAgICAgaWYoaW1hZ2VpZCl7CiAgICAgICAgICBnaWQoaW1hZ2VpZCkucXVlcnlTZWxlY3RvcigiLmxpa2UiKS5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHByZXBhcmVfZXZlbnQoZXZlbnQpewogICAgICAgIGV2ZW50LnB1YmtleSA9IGF3YWl0IHB1YmtleSgpCiAgICAgICAgZXZlbnQuY3JlYXRlZF9hdCA9IHBhcnNlSW50KERhdGUubm93KCkgLyAxMDAwLCAxMCkKICAgICAgICBldmVudC5pZCA9IE5vc3RyVG9vbHMuZ2V0RXZlbnRIYXNoKGV2ZW50KQogICAgICAgIHJldHVybiBldmVudAogICAgICB9CiAgICAgICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcHVibGlzaChldmVudCl7CiAgICAgICAgZXZlbnQgPSBhd2FpdCBwcmVwYXJlX2V2ZW50KGV2ZW50KQogICAgICAgIGxldCBzaWduZWRldmVudCA9IGF3YWl0IHNpZ24oZXZlbnQpCiAgICAgICAgbGV0IGpzb24gPSBKU09OLnN0cmluZ2lmeShbIkVWRU5UIiwgc2lnbmVkZXZlbnRdKQogICAgICAgIHNvY2tldHMuZm9yRWFjaChzID0+IHMuc2VuZChqc29uKSkKICAgICAgICAKICAgICAgICByZXR1cm4gZXZlbnQKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gc3dpcGUob2Zmc2V0KXsKICAgICAgICBpZihpbWFnZW9mZnNldChvZmZzZXQpKXsKICAgICAgICAgIGltYWdlb2Zmc2V0KG9mZnNldCkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIHRoaXNbb2Zmc2V0ID09IC0xICYmICJsYXN0YWN0aXZlIiB8fCAiYWN0aXZlIl0oKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgICAgdXBkYXRlc2hvdygpCiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiB1cGRhdGVzaG93KCl7CiAgICAgICAgaWYocXMoIiNtZWRpYS1jb250YWluZXIiKS5jbGFzc0xpc3QuY29udGFpbnMoInZpc2libGUiKSl7CiAgICAgICAgICBoaWRldmlkZW8oKQogICAgICAgICAgc2hvdyhhY3RpdmUoKS5pZCkKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCBlID0+IHsKICAgICAgICBpZihbIlRhYiIsICJBcnJvd0xlZnQiLCAiQXJyb3dSaWdodCIsICJBcnJvd1VwIiwgIkFycm93RG93biJdLmluY2x1ZGVzKGUua2V5KSl7CiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJFc2NhcGUiKXsKICAgICAgICAgIG1lbnUoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUua2V5ID09ICJFbnRlciIgJiYgZS50YXJnZXQudGFnTmFtZSA9PSAiQk9EWSIpewogICAgICAgICAgaWYocXMoIiNtZWRpYS1jb250YWluZXIiKS5jbGFzc0xpc3QuY29udGFucygidmlzaWJsZSIpKXsKICAgICAgICAgICAgaGlkZW1lZGlhKCkKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHNob3coYWN0aXZlKCkuaWQpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd1VwIiAmJiBpbWFnZW9mZnNldCgtY29scygpKSl7CiAgICAgICAgICBpbWFnZW9mZnNldCgtY29scygpKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgbGFzdGFjdGl2ZSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgICB1cGRhdGVzaG93KCkKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd0Rvd24iICYmIGltYWdlb2Zmc2V0KGNvbHMoKSkpewogICAgICAgICAgaW1hZ2VvZmZzZXQoY29scygpKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgYWN0aXZlKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIHVwZGF0ZXNob3coKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93TGVmdCIpewogICAgICAgICAgc3dpcGUoLTEpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dSaWdodCIpewogICAgICAgICAgc3dpcGUoMSkKICAgICAgICB9CiAgICAgIH0pCgogICAgICBhc3luYyBmdW5jdGlvbiBoYW5kbGVxdWVyeXJlcyhyZXMsIHNvY2tldCwgcSwgdHlwZSwgc3RpbWUpewogICAgICAgIHNhdmUoc29ja2V0LCByZXMsIHEsIHR5cGUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSkKICAgICAgICBsb2coInF1ZXJ5IHJlcyIsIHJlcy5sZW5ndGgsIHNvY2tldC51cmwpCiAgICAgICAgcXVlcnljb3VudC0tCiAgICAgICAgaWYocXVlcnljb3VudCA9PSAwKXsKICAgICAgICAgIHFzKCIjbG9hZGluZyIpLmNsYXNzTGlzdC5yZW1vdmUoInZpc2libGUiKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBsZXQgd2FpdCA9IHdhaXRtcyAtIChEYXRlLm5vdygpIC0gc3RpbWUpCiAgICAgICAgcXVlcnl3YWl0ID0gc2xlZXAod2FpdCkKICAgICAgICBhd2FpdCBxdWVyeXdhaXQucHJvbWlzZQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBwcmltYWxnbG9iYWwoc29ja2V0KXsKICAgICAgICBsb2coImdsb2JhbCIsIHNvY2tldC51cmwpCiAgICAgICAgcXVlcnljb3VudCsrCiAgICAgICAgcXMoIiNsb2FkaW5nIikuY2xhc3NMaXN0LmFkZCgidmlzaWJsZSIpCiAgICAgICAgbGV0IHN0aW1lID0gRGF0ZS5ub3coKQogICAgICAgIGxldCBxaWQgPSAiZ2xvYmFsXyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgbGV0IHFpZGxpa2VzID0gImxpa2VzXyIgKyAoKytpZGNvdW50ZXIpCgogICAgICAgIGlmKG5ld2xpa2VzLmxlbmd0aCA+IDApewogICAgICAgICAgcHJpbWFsc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoWwogICAgICAgICAgICAiUkVRIiwgCiAgICAgICAgICAgIHFpZGxpa2VzLCAKICAgICAgICAgICAgewogICAgICAgICAgICAgICJjYWNoZSI6IFsKICAgICAgICAgICAgICAgICJldmVudHMiLCB7CiAgICAgICAgICAgICAgICAgICJldmVudF9pZHMiOiBuZXdsaWtlcwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIF0KICAgICAgICAgICAgfQogICAgICAgICAgXSkpCgogICAgICAgICAgY29uc3QgbGlrZV9ldmVudHMgPSAoYXdhaXQgd2FpdHJlcyhxaWRsaWtlcykpWzBdCiAgICAgICAgICBuZXdsaWtlcy5zcGxpY2UoMCkKICAgICAgICAgIAogICAgICAgICAgYXdhaXQgc2F2ZShzb2NrZXQsIGxpa2VfZXZlbnRzLCAiIiwgImFsbCIsIHRydWUsIHRydWUsIGZhbHNlKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeShbCiAgICAgICAgICAiUkVRIiwgCiAgICAgICAgICBxaWQsIAogICAgICAgICAgewogICAgICAgICAgICAiY2FjaGUiOiBbCiAgICAgICAgICAgICAgImV4cGxvcmUiLCAKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAidGltZWZyYW1lIjogImxhdGVzdCIsCiAgICAgICAgICAgICAgICAic2NvcGUiOiAiZ2xvYmFsIiwKICAgICAgICAgICAgICAgICJsaW1pdCI6IDUwCiAgICAgICAgICAgICAgfQogICAgICAgICAgICBdCiAgICAgICAgICB9CiAgICAgICAgXSkpCiAgICAgICAgCiAgICAgICAgY29uc3QgcmVzID0gKGF3YWl0IHdhaXRyZXMocWlkKSlbMF0KICAgICAgICBhd2FpdCBoYW5kbGVxdWVyeXJlcyhyZXMuZmlsdGVyKGUgPT4gZS5raW5kID09IDEpLCBzb2NrZXQsICIiLCAiYWxsIiwgc3RpbWUpCiAgICAgICAgcHJpbWFsZ2xvYmFsKHNvY2tldCkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcXVlcnkoc29ja2V0LCBwcmltYWwpewogICAgICAgIGxvZygicXVlcnkiLCBzb2NrZXQudXJsKQogICAgICAgIHF1ZXJ5Y291bnQrKwogICAgICAgIHFzKCIjbG9hZGluZyIpLmNsYXNzTGlzdC5hZGQoInZpc2libGUiKQogICAgICAgIAogICAgICAgIGxldCBzdGltZSA9IERhdGUubm93KCkKICAgICAgICBsZXQgcSA9IHF1ZXJ5c3RyLnRyaW0oKQogICAgICAgIGxldCB0eXBlID0gcXVlcnl0eXBlKCkKICAgICAgICBsZXQgaSA9ICsraWRjb3VudGVyCiAgICAgICAgbGV0IHFpZCA9ICJxdWVyeV8iICsgaQogICAgICAgIGNvbnN0IGxpa2VzcmVzID0gYXdhaXQgcXVlcnlsaWtlcyhzb2NrZXQpCiAgICAgICAgCiAgICAgICAgbGlrZXNyZXMuZm9yRWFjaChldmVudGlkID0+IHsKICAgICAgICAgIGlmKCFsaWtlcy5pbmNsdWRlcyhldmVudGlkKSl7CiAgICAgICAgICAgIGxpa2VzLnB1c2goZXZlbnRpZCkKICAgICAgICAgICAgbmV3bGlrZXMucHVzaChldmVudGlkKQogICAgICAgICAgfQogICAgICAgIH0pCiAgICAgICAgCiAgICAgICAgbGV0IGdhbGxlcnltYXRjaCA9IHF1ZXJ5c3RyLm1hdGNoKC9nOihbYS16MC05XSspLykKICAgICAgICBsZXQgcHVia2V5bWF0Y2ggPSBxdWVyeXN0ci5tYXRjaCgvazooW2EtejAtOV0rKS8pCiAgICAgICAgbGV0IHJlcyA9IG51bGwKICAgICAgICAKICAgICAgICBpZihnYWxsZXJ5bWF0Y2gpewogICAgICAgICAgY29uc3QgZ2FsbGVyeXJlcyA9IGF3YWl0IHF1ZXJ5ZXZlbnRzKHNvY2tldCwgWzMzM10sIFtnYWxsZXJ5bWF0Y2hbMV1dLCBudWxsKQogICAgICAgICAgY29uc3QgZXZlbnRpZHMgPSBKU09OLnBhcnNlKGdhbGxlcnlyZXNbMF0uY29udGVudCkKICAgICAgICAgIHJlcyA9IGF3YWl0IHF1ZXJ5ZXZlbnRzKHNvY2tldCwgWzFdLCBldmVudGlkcywgbnVsbCkKICAgICAgICB9CiAgICAgICAgZWxzZSBpZihwdWJrZXltYXRjaCl7CiAgICAgICAgICByZXMgPSBhd2FpdCBxdWVyeWV2ZW50cyhzb2NrZXQsIFsxXSwgbnVsbCwgW3B1YmtleW1hdGNoWzFdXSkKICAgICAgICB9CiAgICAgICAgZWxzZXsKICAgICAgICAgIGxldCBmaWx0ZXJzID0gW10KCiAgICAgICAgICBmaWx0ZXJzLnB1c2goLi4uKHR5cGVzW3R5cGVdIHx8IFtdKS5tYXAoKHQpID0+IHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICBraW5kczogWzFdLCAKICAgICAgICAgICAgICBzZWFyY2g6ICIuIiArIHQsCiAgICAgICAgICAgICAgbGltaXQ6IDIwCiAgICAgICAgICAgIH0KICAgICAgICAgIH0pKQogICAgICAgICAgCiAgICAgICAgICBpZihxLmxlbmd0aCA+IDApewogICAgICAgICAgICBmaWx0ZXJzLnB1c2goe2tpbmRzOiBbMV0sIHNlYXJjaDogcX0pCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIGlmKGZpbHRlcnMubGVuZ3RoID09IDApewogICAgICAgICAgICBmaWx0ZXJzLnB1c2goe2tpbmRzOiBbMV19KQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBjb25zdCBzZWFyY2hvYmogPSBbIlJFUSIsIHFpZCwgLi4uZmlsdGVyc10KICAgICAgICAgIGNvbnN0IHNlYXJjaGpzb24gPSBKU09OLnN0cmluZ2lmeShzZWFyY2hvYmopCiAgICAgICAgICBzb2NrZXQuc2VuZChzZWFyY2hqc29uKQogICAgICAgICAgCiAgICAgICAgICByZXMgPSAoYXdhaXQgd2FpdHJlcyhxaWQpKVswXQogICAgICAgICAgCiAgICAgICAgICByZXMgPSByZXMuZmlsdGVyKG8gPT4gewogICAgICAgICAgICBpZihxLmxlbmd0aCA+IDApewogICAgICAgICAgICAgIGZvcihsZXQgd29yZCBvZiBxLnNwbGl0KCIgIikpewogICAgICAgICAgICAgICAgaWYoby5jb250ZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZih3b3JkLnRvTG93ZXJDYXNlKCkpID09IC0xKXsKICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZQogICAgICAgICAgfSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgYXdhaXQgaGFuZGxlcXVlcnlyZXMocmVzLCBzb2NrZXQsIHEsIHR5cGUsIHN0aW1lKQogICAgICAgIHF1ZXJ5KHNvY2tldCkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcXVlcnlsaWtlcyhzb2NrZXQpewogICAgICAgIGlmKCFoYXNrZXkoKSl7CiAgICAgICAgICByZXR1cm4gW10KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QgbXlwdWJrZXkgPSBhd2FpdCBwdWJrZXkoKQogICAgICAgIGNvbnN0IGV2ZW50cyA9IGF3YWl0IHF1ZXJ5ZXZlbnRzKHNvY2tldCwgWzddLCBudWxsLCBbbXlwdWJrZXldKQogICAgICAgIHJldHVybiBldmVudHMubWFwKGUgPT4gZS50YWdzLmZpbmQodCA9PiB0WzBdID09ICJlIilbMV0pCiAgICAgIH0KCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5ZXZlbnRzKHNvY2tldCwga2luZHMsIGV2ZW50aWRzLCBhdXRob3JzKXsKICAgICAgICBjb25zdCBxdWVyeWlkID0gImV2ZW50c18iICsgKCsraWRjb3VudGVyKQogICAgICAgIGNvbnN0IGZpbHRlcnMgPSB7fQogICAgICAgIAogICAgICAgIGZpbHRlcnMua2luZHMgPSBraW5kcwogICAgICAgIAogICAgICAgIGlmKGV2ZW50aWRzKXsKICAgICAgICAgIGZpbHRlcnNbImlkcyJdID0gZXZlbnRpZHMKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoYXV0aG9ycyl7CiAgICAgICAgICBmaWx0ZXJzWyJhdXRob3JzIl0gPSBhdXRob3JzCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeShbCiAgICAgICAgICAiUkVRIiwgCiAgICAgICAgICBxdWVyeWlkLCAKICAgICAgICAgIGZpbHRlcnMKICAgICAgICBdKQogICAgICAgIAogICAgICAgIHNvY2tldC5zZW5kKGpzb24pCiAgICAgICAgCiAgICAgICAgcmV0dXJuIChhd2FpdCB3YWl0cmVzKHF1ZXJ5aWQpKVswXSB8fCBbXQogICAgICB9CgogICAgICBhc3luYyBmdW5jdGlvbiBzYXZlKHNvY2tldCwgZXZlbnRzLCBxLCBxdHlwZSwgcmVhY3RlZCwgYXBwZW5kLCBxdWVyeW1ldGEpewogICAgICAgIGxldCBldmVudHB1YmtleXMgPSBbXQogICAgICAgIGxldCByZXN1bHRzID0gW10KICAgICAgICBjb25zdCBldmVudGlkcyA9IGV2ZW50cy5tYXAoZSA9PiBlLmlkKQogICAgICAgIGxldCBuZXd1cmxzID0gW10KICAgICAgICAKICAgICAgICBmb3IobGV0IGV2ZW50IG9mIGV2ZW50cyl7CiAgICAgICAgICBsZXQgdXJsc21hdGNoID0gW10KICAgICAgICAgIAogICAgICAgICAgaWYocXR5cGUgIT0gInZpZGVvIil7CiAgICAgICAgICAgIHVybHNtYXRjaC5wdXNoKC4uLihldmVudC5jb250ZW50Lm1hdGNoKGltZ3JlZ2V4KSB8fCBbXSkpCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIGlmKHF0eXBlICE9ICJpbWFnZSIpewogICAgICAgICAgICB1cmxzbWF0Y2gucHVzaCguLi4oZXZlbnQuY29udGVudC5tYXRjaCh2aWRlb3JlZ2V4KSB8fCBbXSkpCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHVybHNtYXRjaCA9IHVybHNtYXRjaC5maWx0ZXIodXJsID0+ICF1cmxzLmluY2x1ZGVzKHVybCkpCgogICAgICAgICAgaWYodXJsc21hdGNoLmxlbmd0aCA+IDApewogICAgICAgICAgICBuZXd1cmxzLnB1c2goewogICAgICAgICAgICAgIGV2ZW50OiBldmVudCwKICAgICAgICAgICAgICB1cmxzOiB1cmxzbWF0Y2gKICAgICAgICAgICAgfSkKICAgICAgICAgICAgCiAgICAgICAgICAgIHVybHMucHVzaCguLi51cmxzbWF0Y2gpCiAgICAgICAgICAgIGV2ZW50cHVia2V5cy5pbmNsdWRlcyhldmVudC5wdWJrZXkpIHx8IGV2ZW50cHVia2V5cy5wdXNoKGV2ZW50LnB1YmtleSkKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbG9nKCJxdWVyeSBtZXRhIiwgc29ja2V0LnVybCkKICAgICAgICBsZXQgbWV0YWV2ZW50cyA9IChxdWVyeW1ldGEgJiYgYXdhaXQgcXVlcnlldmVudHMoc29ja2V0LCBbMF0sIG51bGwsIGV2ZW50cHVia2V5cykgfHwgW10pCiAgICAgICAgCiAgICAgICAgZm9yKGxldCBlbnRyeSBvZiBuZXd1cmxzKXsKICAgICAgICAgIGZvcihsZXQgdXJsIG9mIGVudHJ5LnVybHMpewogICAgICAgICAgICByZXN1bHRzLnB1c2goewogICAgICAgICAgICAgIHJlYWN0ZWQ6IHJlYWN0ZWQgfHwgbGlrZXMuaW5jbHVkZXMoZW50cnkuZXZlbnQuaWQpLCAKICAgICAgICAgICAgICB1cmw6IHVybCwgCiAgICAgICAgICAgICAgZXZlbnQ6IGVudHJ5LmV2ZW50LCAKICAgICAgICAgICAgICBiZWNoMzJpZDogYmVjaDMyLmVuY29kZSgibm90ZSIsIGZyb21IZXhTdHJpbmcoZW50cnkuZXZlbnQuaWQpKSwKICAgICAgICAgICAgICBtZXRhOiBtZXRhZXZlbnRzLmZpbmQobyA9PiBvLnB1YmtleSA9PSBlbnRyeS5ldmVudC5wdWJrZXkpCiAgICAgICAgICAgIH0pCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGxvZygic2F2ZSByZXMiLCByZXN1bHRzLmxlbmd0aCwgc29ja2V0LnVybCkKICAgICAgICB1cGRhdGVjb250ZW50KHJlc3VsdHMsIHEsIGFwcGVuZCkKICAgICAgfQogICAgICAKICAgICAgbGV0IGxvYWRlZCA9IDAKICAgICAgCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZWNvbnRlbnQocmVzdWx0cywgcSwgYXBwZW5kKXsKICAgICAgICByZXN1bHRzLnJldmVyc2UoKS5mb3JFYWNoKGl0ZW0gPT4gewogICAgICAgICAgY29uc3QgdHlwZSA9IGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpICYmICJ2aWRlbyIgfHwgImltYWdlIgogICAgICAgICAgY29uc3QgdGV4dCA9IChxIHx8ICJ2aWV3IG5vdGUiKS5zdWJzdHJpbmcoLTMwKQogICAgICAgICAgY29uc3QgaWQgPSAiaXRlbV8iICsgKCsraWRjb3VudGVyKQogICAgICAgICAgY29uc3QgY29udGVudGVsZW1lbnRzID0gJzxkaXYgY2xhc3M9InR5cGUiPicgKyBxcygiI3RlbXBsYXRlIC4iICsgdHlwZSArICJzdmciKS5vdXRlckhUTUwgKyAnPC9kaXY+PGEgY2xhc3M9Imxpa2UnICsgKGl0ZW0ucmVhY3RlZCA/ICcgcmVhY3RlZCcgOiAnJykgKyAnIiBkYXRhLWl0ZW0taWQ9IicgKyBpZCArIAogICAgICAgICAgICAnIiBocmVmPSIjIj4nICsgcXMoIiN0ZW1wbGF0ZSAuaGVhcnRzdmciKS5vdXRlckhUTUwgKyAnPC9hPjxhIGNsYXNzPSJxdWVyeSBsaW5rIiBocmVmPSInICsgcHJvdG9jb2wgKyAKICAgICAgICAgICAgaXRlbS5iZWNoMzJpZCArICciPicgKyB0ZXh0ICsgJzwvYT4nCiAgICAgICAgICBsZXQgcm9vdCA9IG51bGwKICAgICAgICAgIGxldCB2ID0gbnVsbAogICAgICAgICAgCiAgICAgICAgICBpZihpdGVtLnVybC5tYXRjaCh2aWRlb2V4dHJlZ2V4KSl7CiAgICAgICAgICAgIHJvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKQogICAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoInZpZGVvLWNvbnRhaW5lciIpCiAgICAgICAgICAgIHJvb3QuaW5uZXJIVE1MID0gY29udGVudGVsZW1lbnRzCiAgICAgICAgICAgIAogICAgICAgICAgICB2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKQogICAgICAgICAgICB2LmNsYXNzTGlzdC5hZGQoInNob3ciKQogICAgICAgICAgICB2WyJkYXRhLWl0ZW0taWQiXSA9IGlkCiAgICAgICAgICAgIHYucHJlbG9hZCA9ICJub25lIgogICAgICAgICAgICB2Lmxvb3AgPSB0cnVlCiAgICAgICAgICAgIHYucGxheXNpbmxpbmUgPSAiIgogICAgICAgICAgICAKICAgICAgICAgICAgdi5vbmNhbnBsYXkgPSBhc3luYyBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICBjb25zdCBhc3BlY3QgPSB0aGlzLnZpZGVvV2lkdGggLyB0aGlzLnZpZGVvSGVpZ2h0CiAgICAgICAgICAgICAgaWYoYXNwZWN0ID4gMSl7CiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlLndpZHRoID0gKGFzcGVjdCAqIDEwMCkgKyAiJSIKICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUuaGVpZ2h0ID0gKDEgLyBhc3BlY3QgKiAxMDApICsgIiUiCiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlLm1hcmdpblRvcCA9IC0oKDEgLyBhc3BlY3QgKiAxMDAgLSAxMDApIC8gMikgKyAiJSIKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgdXBkYXRldmlkZW9wbGF5KHRoaXMucGFyZW50RWxlbWVudCkKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29uc3QgZXh0ID0gaXRlbS51cmwubWF0Y2godmlkZW9leHRyZWdleClbMV0KICAgICAgICAgICAgdi5pbm5lckhUTUwgPSAnPHNvdXJjZSBzcmM9IicgKyBpdGVtLnVybCArICciIHR5cGU9InZpZGVvLycgKyBleHQgKyAnIj48L3NvdXJjZT4nCiAgICAgICAgICAgIAogICAgICAgICAgICByb290LmFwcGVuZCh2KQogICAgICAgICAgfWVsc2UgaWYoaXRlbS51cmwubWF0Y2goaW1nZXh0cmVnZXgpKXsKICAgICAgICAgICAgcm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKQogICAgICAgICAgICByb290LmhyZWYgPSAiIyIKICAgICAgICAgICAgcm9vdC5pbm5lckhUTUwgPSBjb250ZW50ZWxlbWVudHMKICAgICAgICAgICAgICAKICAgICAgICAgICAgaWYodHlwZSA9PSAiaW1hZ2UiKXsKICAgICAgICAgICAgICAvL2xldCBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKQogICAgICAgICAgICAgIC8vaW1nLmFsdCA9IGl0ZW0udXJsCiAgICAgICAgICAgICAgcm9vdFsiZGF0YS1zcmMiXSA9IGl0ZW0udXJsCiAgICAgICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJpbWciKQogICAgICAgICAgICAgIC8vaW1nLmNsYXNzTGlzdC5hZGQoImRhdGEiKQogICAgICAgICAgICAgIC8vcm9vdC5hcHBlbmQoaW1nKQogICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICByb290LmlubmVySFRNTCArPSAnPHNwYW4gY2xhc3M9ImZpbGUiPicgKyBpdGVtLnVybCArICc8L3NwYW4+JwogICAgICAgICAgICB9CiAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHJvb3QuaWQgPSBpZAogICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCd2aXNpYmxlJykKICAgICAgICAgIHJvb3RbImRhdGEtaXRlbSJdID0gaXRlbQogICAgICAgICAgcm9vdFsiZGF0YS1ldmVudCJdID0gaXRlbS5ldmVudAogICAgICAgICAgcm9vdFsiZGF0YS1xdWVyeSJdID0gcQogICAgICAgICAgcm9vdFsiZGF0YS10ZXh0Il0gPSB0ZXh0CiAgICAgICAgICAKICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCh0eXBlKQogICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJpdGVtIikKICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgic2hvdyIpCiAgICAgICAgICAKICAgICAgICAgIGlmKGl0ZW0ucmVhY3RlZCl7CiAgICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHFzKCIjaW1hZ2VzIilbYXBwZW5kICYmICJhcHBlbmQiIHx8ICJwcmVwZW5kIl0ocm9vdCkKICAgICAgICAgIAogICAgICAgICAgaWYodil7CiAgICAgICAgICAgIHVwZGF0ZXZpZGVvcGxheShyb290KQogICAgICAgICAgfQogICAgICAgIH0pCgogICAgICAgIHVwZGF0ZWltYWdlc2xvYWQoKQogICAgICAgIAogICAgICAgIGlmKGFjdGl2ZSgpID09IG51bGwpewogICAgICAgICAgcXMoIiNpbWFnZXMgLml0ZW0iKT8uY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGhpZGVtZWRpYSgpewogICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAic2Nyb2xsIgogICAgICAgIHFzYSgiI21lZGlhLWNvbnRhaW5lciwgI2ltYWdlLCAjbWVkaWEtZm9vdGVyIikuZm9yRWFjaChuID0+IG4uY2xhc3NMaXN0LnJlbW92ZSgidmlzaWJsZSIpKQogICAgICAgIGdpZCgiaW1hZ2UtbGlrZSIpLmNsYXNzTGlzdC5yZW1vdmUoInJlYWN0ZWQiKQogICAgICAgIGhpZGV2aWRlbygpCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGhpZGV2aWRlbygpewogICAgICAgIGNvbnN0IHYgPSBxcygiI21lZGlhLWNvbnRhaW5lciB2aWRlbyIpCiAgICAgICAgCiAgICAgICAgaWYodil7CiAgICAgICAgICB2Lm11dGVkID0gdHJ1ZQogICAgICAgICAgdi5jbGFzc0xpc3QuYWRkKCJzaG93IikKICAgICAgICAgIGdpZCh2WyJkYXRhLWl0ZW0taWQiXSkuYXBwZW5kQ2hpbGQodikKICAgICAgICAgIHVwZGF0ZXZpZGVvcGxheSh2LnBhcmVudEVsZW1lbnQpCiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiB3YWl0cmVzKGtleSwgdHlwZSl7CiAgICAgICAgbGV0IHJlc2hhbmRsZXIgPSBmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpewogICAgICAgICAgdGhpcy50eXBlID0gdHlwZSB8fCAiRU9TRSIKICAgICAgICAgIHRoaXMuZXZlbnRzID0gW10KICAgICAgICAgIHRoaXMuaGFuZGxlID0gZnVuY3Rpb24ocmVzKXsKICAgICAgICAgICAgbGV0IG8gPSBKU09OLnBhcnNlKHJlcy5kYXRhKQogICAgICAgICAgICBpZihrZXkgPT0gbnVsbCB8fCBvWzFdID09IGtleSl7CiAgICAgICAgICAgICAgaWYob1swXSA9PSB0aGlzLnR5cGUpewogICAgICAgICAgICAgICAgcmVzb2x2ZShbdGhpcy5ldmVudHMsIG9dKQogICAgICAgICAgICAgICAgcmVzaGFuZGxlcnMuc3BsaWNlKHJlc2hhbmRsZXJzLmluZGV4T2YodGhpcyksIDEpCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIHRoaXMuZXZlbnRzLnB1c2gob1syXSkKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gewogICAgICAgICAgbGV0IGhhbmRsZXIgPSBuZXcgcmVzaGFuZGxlcihyZXNvbHZlLCByZWplY3QpCiAgICAgICAgICByZXNoYW5kbGVycy5wdXNoKGhhbmRsZXIpCiAgICAgICAgfSkKICAgICAgfQogICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGNoZWNrdXBkYXRlKHNvY2tldCl7CiAgICAgICAgY29uc3QgdXBkYXRlc3JlcyA9IGF3YWl0IHF1ZXJ5ZXZlbnRzKHNvY2tldCwgWzFdLCBudWxsLCBbdXBkYXRlc3B1YmtleV0pCiAgICAgICAgY29uc3QgdXBkYXRlbm90ZSA9IHVwZGF0ZXNyZXMuZmluZChuID0+IG4uY29udGVudC5tYXRjaCgvXmh0dHBzXDpcL1wvLykpCiAgICAgICAgCiAgICAgICAgaWYoIXVwZGF0ZW5vdGUpewogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IGFnZSA9IE1hdGgucm91bmQoKERhdGUubm93KCkgLyAxMDAwIC0gdXBkYXRlbm90ZS5jcmVhdGVkX2F0KSAvIDM2MDAgLyAyNCkKICAgICAgICBjb25zdCBub3RlaWQgPSBiZWNoMzIuZW5jb2RlKCJub3RlIiwgZnJvbUhleFN0cmluZyh1cGRhdGVub3RlLmlkKSkKICAgICAgICBxcygiI3JlbGVhc2UiKS5ocmVmID0gcHJvdG9jb2wgKyBub3RlaWQKICAgICAgICBxcygiI3JlbGVhc2UiKS5pbm5lclRleHQgPSAoYWdlID09IDAgJiYgInRvZGF5IiB8fCBhZ2UgKyAiIGRheShzKSBhZ28iKQogICAgICB9CgogICAgICBmdW5jdGlvbiBzbGVlcChtcyl7CiAgICAgICAgcmV0dXJuIG5ldyBmdW5jdGlvbigpewogICAgICAgICAgbGV0IHRpbWVvdXQgPSBudWxsCiAgICAgICAgICBsZXQgciA9IG51bGwKICAgICAgICAgIAogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcHJvbWlzZTogbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KXsKICAgICAgICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCksIG1zKQogICAgICAgICAgICAgIHIgPSByZXNvbHZlCiAgICAgICAgICAgIH0pLAogICAgICAgICAgICByZXNvbHZlOiBmdW5jdGlvbigpewogICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KQogICAgICAgICAgICAgIHIoKQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBzaG93KGlkKXsKICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiIKICAgICAgICBjb25zdCBpdGVtID0gZ2lkKGlkKVsiZGF0YS1pdGVtIl0KICAgICAgICBjb25zdCBtZWRpYSA9IGdpZCgibWVkaWEtY29udGFpbmVyIikKICAgICAgICBjb25zdCBpbWFnZSA9IGdpZCgiaW1hZ2UiKQoKICAgICAgICBpZihpdGVtLnVybC5tYXRjaCh2aWRlb2V4dHJlZ2V4KSl7CiAgICAgICAgICBpbWFnZS5jbGFzc0xpc3QucmVtb3ZlKCJ2aXNpYmxlIikKICAgICAgICAgIGNvbnN0IHYgPSBnaWQoaWQpLnF1ZXJ5U2VsZWN0b3IoInZpZGVvIikKICAgICAgICAgIHFzKCIjbWVkaWEtY29udGFpbmVyIikuYXBwZW5kQ2hpbGQodikKICAgICAgICAgIHYubXV0ZWQgPSBmYWxzZQogICAgICAgICAgdi5jbGFzc0xpc3QucmVtb3ZlKCJzaG93IikKICAgICAgICAgIHYucGxheSgpCiAgICAgICAgfWVsc2V7CiAgICAgICAgICBpbWFnZS5zcmMgPSBpdGVtLnVybAogICAgICAgICAgaW1hZ2UuY2xhc3NMaXN0LmFkZCgidmlzaWJsZSIpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGl0ZW0ubWV0YSl7CiAgICAgICAgICBjb25zdCBtZXRhY29udGVudCA9IEpTT04ucGFyc2UoaXRlbS5tZXRhLmNvbnRlbnQpCiAgICAgICAgICBjb25zdCBuYW1lID0gbWV0YWNvbnRlbnQuZGlzcGxheV9uYW1lIHx8IG1ldGFjb250ZW50Lm5hbWUKICAgICAgICAgIHFzKCIjaW1hZ2UtdXNlciIpLmNsYXNzTGlzdC5hZGQoInZpc2libGUiKQogICAgICAgICAgcXMoIiNpbWFnZS11c2VyIikuaHJlZiA9ICI/cHVia2V5PSIgKyBpdGVtLm1ldGEucHVia2V5Ly9wcm90b2NvbCArIGJlY2gzMi5lbmNvZGUoIm5wdWIiLCBmcm9tSGV4U3RyaW5nKGl0ZW0ubWV0YS5wdWJrZXkpKQogICAgICAgICAgcXMoIiNpbWFnZS11c2VyIikuaW5uZXJUZXh0ID0gbmFtZQogICAgICAgIH1lbHNlewogICAgICAgICAgcXMoIiNpbWFnZS11c2VyIikuY2xhc3NMaXN0LnJlbW92ZSgidmlzaWJsZSIpCiAgICAgICAgfQoKICAgICAgICBnaWQoImltYWdlLWxpa2UiKVsiZGF0YS1pdGVtLWlkIl0gPSBpZAogICAgICAgIGdpZCgibWVkaWEtZm9vdGVyIilbImRhdGEtZXZlbnQiXSA9IGl0ZW0uZXZlbnQKCiAgICAgICAgaWYoaXRlbS5yZWFjdGVkKXsKICAgICAgICAgIGdpZCgiaW1hZ2UtbGlrZSIpLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBhID0gcXMoIiNpbWFnZS1xdWVyeSIpCiAgICAgICAgYS5ocmVmID0gcHJvdG9jb2wgKyBpdGVtLmJlY2gzMmlkCiAgICAgICAgYS5pbm5lclRleHQgPSBnaWQoaWQpWyJkYXRhLXRleHQiXQogICAgICAgIAogICAgICAgIGdpZCgibWVkaWEtY29udGFpbmVyIikuY2xhc3NMaXN0LmFkZCgidmlzaWJsZSIpCiAgICAgICAgZ2lkKCJtZWRpYS1mb290ZXIiKS5jbGFzc0xpc3QuYWRkKCJ2aXNpYmxlIikKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gY29ubmNvdW50KCl7CiAgICAgICAgcmV0dXJuIHNvY2tldHMuZmlsdGVyKHIgPT4gci5yZWFkeVN0YXRlID09IDEpLmxlbmd0aAogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBkaXNjb25uZWN0KCl7CiAgICAgICAgZm9yKGxldCBzb2NrZXQgb2Ygc29ja2V0cyl7CiAgICAgICAgICBzb2NrZXQuY2xvc2UoKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBzb2NrZXRzLnNwbGljZSgwKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBsb2cobXNnKXsKICAgICAgICBsZXQgc2Nyb2xsID0gcXMoIiNsb2dzIikuc2Nyb2xsVG9wID09IHFzKCIjbG9ncyIpLnNjcm9sbFRvcE1heAogICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpCiAgICAgICAgZGl2LmlubmVyVGV4dCA9IEFycmF5LmZyb20oYXJndW1lbnRzKS5qb2luKCIgIikKICAgICAgICBxcygiI2xvZ3MiKS5hcHBlbmQoZGl2KQogICAgICAgIAogICAgICAgIHNjcm9sbCAmJiBxcygiI2xvZ3MiKS5zY3JvbGxUbygwLCBxcygiI2xvZ3MiKS5zY3JvbGxUb3BNYXgpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGNvbm5lY3QodXJsKXsKICAgICAgICBsb2coImNvbm5lY3RpbmciLCB1cmwpCiAgICAgICAgbGV0IHNvY2tldCA9IG5ldyBXZWJTb2NrZXQodXJsKQogICAgICAgIAogICAgICAgIHNvY2tldC5vbm1lc3NhZ2UgPSBtZXNzYWdlID0+IHJlc2hhbmRsZXJzLmZvckVhY2gocmggPT4gcmguaGFuZGxlKG1lc3NhZ2UpKQogICAgICAgIAogICAgICAgIHNvY2tldC5vbmNsb3NlID0gYXN5bmMgZnVuY3Rpb24oKXsKICAgICAgICAgIHNvY2tldHMuc3BsaWNlKHNvY2tldHMuaW5kZXhPZihzb2NrZXQpLCAxKQogICAgICAgICAgcXMoIiNjb25uY291bnQiKS5pbm5lclRleHQgPSBjb25uY291bnQoKSArIChwcmltYWxzb2NrZXQgJiYgMSkKICAgICAgICAgIGxvZygiZGlzY29ubmVjdGVkIiwgdGhpcy51cmwsIGNvbm5jb3VudCgpKQogICAgICAgICAgYXdhaXQgc2xlZXAoMTAwMCkucHJvbWlzZQogICAgICAgICAgY29ubmVjdCh0aGlzLnVybCkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgc29ja2V0Lm9ub3BlbiA9IGZ1bmN0aW9uKCl7CiAgICAgICAgICBxcygiI2Nvbm5jb3VudCIpLmlubmVyVGV4dCA9IGNvbm5jb3VudCgpICsgKHByaW1hbHNvY2tldCAmJiAxKQogICAgICAgICAgbG9nKCJjb25uZWN0ZWQiLCB0aGlzLnVybCwgY29ubmNvdW50KCkpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybiBzb2NrZXQKICAgICAgfQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsIGFzeW5jICgpID0+IHsKICAgICAgICBwcmltYWxzb2NrZXQgPSBjb25uZWN0KCJ3c3M6Ly9jYWNoZTMucHJpbWFsLm5ldC9jYWNoZTE3IikKICAgICAgICBwcmltYWxzb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcigib3BlbiIsIGZ1bmN0aW9uKCl7CiAgICAgICAgICBwcmltYWxnbG9iYWwodGhpcykKICAgICAgICB9KQogICAgICAgIAogICAgICAgIHByaW1hbHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsIGZ1bmN0aW9uKCl7CiAgICAgICAgICBwcmltYWxzb2NrZXQgPSBudWxsCiAgICAgICAgfSkKICAgICAgICAKICAgICAgICBmb3IobGV0IHVybCBvZiByZWxheXMoKSl7CiAgICAgICAgICBjb25zdCBzb2NrZXQgPSBjb25uZWN0KHVybCkKICAgICAgICAgIHNvY2tldHMucHVzaChzb2NrZXQpCiAgICAgICAgICAKICAgICAgICAgIHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCJvcGVuIiwgZnVuY3Rpb24oKXsKICAgICAgICAgICAgY2hlY2t1cGRhdGUodGhpcykKICAgICAgICAgICAgcXVlcnkodGhpcykKICAgICAgICAgIH0pCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGF3YWl0IHNsZWVwKDEwMCkucHJvbWlzZQogICAgICAgIAogICAgICAgIGlmKGhhc2tleSgpKXsKICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgibm9zdHIiKQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGZvcihsZXQgYyBvZiBjb2xvcHRzKXsKICAgICAgICBkb2N1bWVudC53cml0ZSgnPHN0eWxlPicgKyBjb2xzY3NzLmlubmVyVGV4dC5yZXBsYWNlKC9cJFx7Y29sc1x9L2csIGMpICsgJzwvc3R5bGU+JykKICAgICAgfQogICAgPC9zY3JpcHQ+CiAgPC9ib2R5Pgo8L2h0bWw+Cg==

https://ipfs.io/ipfs/QmTLRwBUQCwq1cWPGmq6rYo9i6GEKa7ZKkzGRFyxGfchc3

sha256

b90e80d446b34b82d5561ffeeaa761c5e6bd8fed2954b387791e8b436fd66469 files.html

base64

PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgdXNlci1zY2FsYWJsZT1ubyIvPgogICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL3N2Z2ljb25zLnNwYXJray5mci9zdmdpY29ucy5jc3MiLz4KICAgIDxzdHlsZT4KICAgICAgKiB7CiAgICAgICAgb3ZlcnNjcm9sbC1iZWhhdmlvci15OiBjb250YWluOwogICAgICB9CiAgICAgIAogICAgICBib2R5IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB3aWR0aDogMTAwdnc7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIGZvbnQtZmFtaWx5OiAiTm90byBTZXJpZiI7CiAgICAgIH0KICAgICAgCiAgICAgIC5wbGFjZWhvbGRlciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICBwYWRkaW5nOiAxZW07CiAgICAgIH0KICAgICAgCiAgICAgIGgxIHsKICAgICAgICBmb250LXNpemU6IDFlbTsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnlkaXNwbGF5LCAKICAgICAgI2hlYWRlciB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgfQogICAgICAKICAgICAgI3JlbGF5cywKICAgICAgI2xvZ3MsIAogICAgICAjcHJpdmtleSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgd2lkdGg6IDE4ZW07CiAgICAgICAgYmFja2dyb3VuZDogIzExMTsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgI3JlbGF5cywKICAgICAgI2xvZ3MgewogICAgICAgIGhlaWdodDogNmVtOwogICAgICB9CiAgICAgIAogICAgICAjbG9ncyB7CiAgICAgICAgaGVpZ2h0OiA4ZW07CiAgICAgICAgb3ZlcmZsb3c6IHNjcm9sbDsKICAgICAgICBmb250LXNpemU6IC44ZW07CiAgICAgIH0KICAgICAgCiAgICAgIHNlbGVjdCB7CiAgICAgICAgd2lkdGg6IDRlbTsKICAgICAgfQogICAgICAKICAgICAgI3JlbGF5cywgCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgYm9yZGVyLXJhZGl1czogLjVlbTsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSAudGV4dCwgCiAgICAgICNoZWFkZXIgYSwKICAgICAgI21lZGlhLWNvbnRhaW5lciB7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgYSwgCiAgICAgIGZvcm0sIAogICAgICAjcXVlcnlkaXNwbGF5IHsKICAgICAgICB6LWluZGV4OiAxOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgICAKICAgICAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAzMGVtKSB7CiAgICAgICAgI2hlYWRlciAudGl0bGUgewogICAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgI3F1ZXJ5ZGlzcGxheSB7CiAgICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIH0KICAgICAgfQoKICAgICAgZm9ybSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnkgewogICAgICAgIHdpZHRoOiA2ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNsb2FkaW5nIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDBweDsKICAgICAgICBsZWZ0OiAyN2VtOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICBhIHsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICAgIH0KCiAgICAgIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAKICAgICAgI21lZGlhLWNvbnRhaW5lciB2aWRlbyB7CiAgICAgICAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsKICAgICAgICBoZWlnaHQ6IDEwMCUgIWltcG9ydGFudDsKICAgICAgICBtYXJnaW4tdG9wOiAwICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgCiAgICAgIC50eXBlIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgei1pbmRleDogMTsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlLXF1ZXJ5IHsKICAgICAgICB3aWR0aDogNWVtOwogICAgICB9CiAgICAgIAogICAgICBhIHsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSwKICAgICAgYS5idXR0b24sCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgY29sb3I6ICM5OTk7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXkgewogICAgICAgIHBhZGRpbmc6IDAgMWVtOwogICAgICB9CgogICAgICAjcXVlcnlkaXNwbGF5IC50ZXh0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgbWluLXdpZHRoOiAzZW07CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgI2hlYWRlciBhLAogICAgICAjaGVhZGVyIHNwYW4gewogICAgICAgIHBhZGRpbmc6IDAuNWVtOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CgogICAgICAjaGVhZGVyIHsKICAgICAgICBwYWRkaW5nOiAwLjQ1ZW0gMDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CgogICAgICAjaGVhZGVyIC5pdGVtcyB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgLml0ZW1zIHsKICAgICAgICBtYXJnaW4tdG9wOiAuM2VtOwogICAgICB9CgogICAgICBwIHsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICB9CiAgICAgIAogICAgICAubGFiZWwgewogICAgICAgIHBhZGRpbmc6IC44ZW0gLjhlbSAuOGVtIDA7CiAgICAgIH0KCiAgICAgICNpbWFnZXMgLnF1ZXJ5IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KCiAgICAgICNtZWRpYS1jb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwKTsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHotaW5kZXg6IDQ7CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZS1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIG1heC13aWR0aDogMTAwdnc7CiAgICAgICAgbWF4LWhlaWdodDogMTAwdmg7CiAgICAgIH0KICAgICAgICAKICAgICAgI2ltYWdlcyB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgI2ltYWdlcyAuaXRlbSB7CiAgICAgICAgd2lkdGg6IDI1dnc7CiAgICAgICAgaGVpZ2h0OiAyNXZ3OwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgLmRpYWxvZyBpbWcgewogICAgICAgIHdpZHRoOiAxNXZ3OwogICAgICB9CiAgICAgIAogICAgICAjbWVkaWEtY29udGFpbmVyIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CiAgICAgIAogICAgICBib2R5Om5vdCgubm9zdHIpICNoZWFkZXIgLmljb25zLCAKICAgICAgLmZpbHRlci1saWtlcyAjaW1hZ2VzID4gLml0ZW06bm90KC5yZWFjdGVkKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNpbWFnZS1xdWVyeSwKICAgICAgI2ltYWdlLXVzZXIgewogICAgICAgIHotaW5kZXg6IDI7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDN2dzsKICAgICAgfQogICAgICAKICAgICAgLnF1ZXJ5LCAKICAgICAgLmxpa2UgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBwYWRkaW5nOiAwIDF2dzsKICAgICAgfQogICAgICAKICAgICAgLnF1ZXJ5LCAKICAgICAgLmxpa2UsIAogICAgICAjaW1hZ2UtcXVlcnksIAogICAgICAudmlkZW9zdmcsCiAgICAgIC5pbWFnZXN2ZyB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjYpOwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNpbWFnZS1xdWVyeSB7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGZvbnQtc2l6ZTogbWluKDMuNXZ3LCAxLjVlbSk7CiAgICAgICAgbWF4LXdpZHRoOiA1ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZS1xdWVyeSB7CiAgICAgICAgcGFkZGluZzogLjZlbSAuNGVtIC4xZW0gLjRlbTsKICAgICAgICBtYXgtd2lkdGg6IDVlbTsKICAgICAgfQogICAgICAKICAgICAgLmxpa2UucmVhY3RlZCwKICAgICAgLmZpbHRlci1saWtlcyAjZmlsdGVyLWxpa2VzIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZWQ7CiAgICAgIH0KCiAgICAgICNpbWFnZS1xdWVyeSwKICAgICAgI2ltYWdlLXVzZXIgewogICAgICAgIGZvbnQtc2l6ZTogM2VtOwogICAgICB9CiAgICAgIAogICAgICAjaW1hZ2UtcXVlcnksCiAgICAgICNpbWFnZS11c2VyLAogICAgICAjbWVkaWEtZm9vdGVyIC5saWtlIHsKICAgICAgICB6LWluZGV4OiA1OwogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlLXF1ZXJ5LAogICAgICAjaW1hZ2UtdXNlciB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgICNpbWFnZS11c2VyIHsKICAgICAgICBib3R0b206IDEuOWVtOwogICAgICAgIGZvbnQtc2l6ZTogMS44ZW07CiAgICAgICAgcGFkZGluZy1yaWdodDogLjY1ZW07CiAgICAgICAgbWF4LXdpZHRoOiA4ZW07CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgIH0KICAgICAgCiAgICAgIC5saWtlIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IGF1dG87CiAgICAgICAgcGFkZGluZzogLjJlbTsKICAgICAgICB3aWR0aDogMWVtOwogICAgICAgIGhlaWdodDogMWVtOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5ub3N0ciAubGlrZSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7ICAKICAgICAgfQoKICAgICAgI21lZGlhLWZvb3RlciAubGlrZSB7CiAgICAgICAgZm9udC1zaXplOiAyLjRlbTsKICAgICAgfQoKICAgICAgI21lZGlhLWZvb3RlciB7CiAgICAgICAgZGlzcGxheTogbm9uZTsgIAogICAgICB9CiAgCiAgICAgICNpbWFnZXMgLmltZyB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIGJhY2tncm91bmQtc2l6ZTogY292ZXI7CiAgICAgICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIC5idXR0b24uYWN0aXZlIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjNDQ0OwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICAjaW1hZ2VzID4gLmFjdGl2ZSB7CiAgICAgICAgb3V0bGluZTogLjNlbSBzb2xpZCBncmVlbjsKICAgICAgICB6LWluZGV4OiAxOwogICAgICB9CgogICAgICAuaGVhcnRzdmcgcGF0aCwKICAgICAgLmhlYWRlci1pY29uIHN2ZyBwYXRoIHsKICAgICAgICBzdHJva2U6ICNmZmY7CiAgICAgIH0KICAKICAgICAgLnZpZGVvc3ZnLAogICAgICAuaW1hZ2VzdmcgewogICAgICAgIHdpZHRoOiBjYWxjKG1pbig0dncsIDJlbSkpOwogICAgICAgIGhlaWdodDogY2FsYyhtaW4oNHZ3LCAyZW0pKTsKICAgICAgICBwYWRkaW5nOiAwIC4yZW07CiAgICAgIH0KICAgICAgCiAgICAgIC52aWRlb3N2ZyBwYXRoLAogICAgICAuaW1hZ2VzdmcgcGF0aCB7CiAgICAgICAgZmlsbDogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgYSNtZW51LCAKICAgICAgLmhlYWRlci1pY29uIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBtYXJnaW4tdG9wOiAtLjNlbTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICB9CgogICAgICAuaWNvbnMgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICByaWdodDogMDsKICAgICAgICB6LWluZGV4OiAyOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgIH0KICAgICAgCiAgICAgIGEjbWVudSB7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgcGFkZGluZzogMCAuNWVtOwogICAgICAgIGhlaWdodDogMi4xZW07CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgLmhlYWRlci1pY29uIHsKICAgICAgICBwYWRkaW5nOiAuMmVtOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICB3aWR0aDogMS41ZW07CiAgICAgICAgaGVpZ2h0OiAxLjVlbTsKICAgICAgICBtYXJnaW46IC4xZW0gLjVlbTsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgIH0KICAgICAgCiAgICAgIC5oZWFkZXItaWNvbiBzdmcgewogICAgICAgIHdpZHRoOiAxLjVlbTsKICAgICAgICBoZWlnaHQ6IDEuNWVtOwogICAgICB9CiAgICAgICAKICAgICAgLm1lbnVzdmcgewogICAgICAgIHdpZHRoOiAyZW07CiAgICAgICAgaGVpZ2h0OiAyZW07CiAgICAgIH0KCiAgICAgIC5tZW51c3ZnIHBhdGggewogICAgICAgIGZpbGw6ICNmZmY7CiAgICAgIH0KCiAgICAgICNtZW51LWNvbnRlbnQgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgICB3aWR0aDogMThlbTsKICAgICAgICBtYXJnaW4tbGVmdDogLTE4ZW07CiAgICAgICAgYmFja2dyb3VuZDogIzIyMjsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgei1pbmRleDogMzsgCiAgICAgICAgb3ZlcmZsb3c6IHNjcm9sbDsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudC52aXNpYmxlIHsKICAgICAgICBtYXJnaW4tbGVmdDogMDsKICAgICAgfQogICAgICAKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgewogICAgICAgIHBhZGRpbmc6IDFlbTsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgYS5idXR0b24sCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgcGFkZGluZzogLjVlbSAuN2VtOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgICB9CgogICAgICAjb3ZlcmxheSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICB6LWluZGV4OiAzOwogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICBvcGFjaXR5OiAuNTsKICAgICAgfQoKICAgICAgLnZpc2libGUgewogICAgICAgIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgCiAgICAgICNzaGFyZS1kaWFsb2cgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHdpZHRoOiBjYWxjKDEwMHZ3IC0gNmVtKTsKICAgICAgICBoZWlnaHQ6IDcwJTsKICAgICAgICBiYWNrZ3JvdW5kOiAjZmZmOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDFlbTsKICAgICAgICB6LWluZGV4OiA0OwogICAgICAgIG1hcmdpbi1sZWZ0OiAyZW07CiAgICAgICAgbWFyZ2luLXRvcDogMmVtOwogICAgICAgIHBhZGRpbmc6IDFlbTsKICAgICAgfQogICAgICAKICAgICAgaDIgewogICAgICAgIG1hcmdpbi10b3A6IDA7CiAgICAgIH0KICAgICAgCiAgICAgIHN2ZyB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgICN0ZW1wbGF0ZSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8ZGl2IGlkPSJ0ZW1wbGF0ZSI+CiAgICAgIDxzdmcgY2xhc3M9ImhlYXJ0c3ZnIHN2Zy1pY29uIiB2aWV3Qm94PSIwIDAgMjAgMjAiPgogICAgICAgIDxwYXRoIGQ9Ik05LjcxOSwxNy4wNzNsLTYuNTYyLTYuNTFjLTAuMjctMC4yNjgtMC41MDQtMC41NjctMC42OTYtMC44ODhDMS4zODUsNy44OSwxLjY3LDUuNjEzLDMuMTU1LDQuMTRjMC44NjQtMC44NTYsMi4wMTItMS4zMjksMy4yMzMtMS4zMjljMS45MjQsMCwzLjExNSwxLjEyLDMuNjEyLDEuNzUyYzAuNDk5LTAuNjM0LDEuNjg5LTEuNzUyLDMuNjEyLTEuNzUyYzEuMjIxLDAsMi4zNjksMC40NzIsMy4yMzMsMS4zMjljMS40ODQsMS40NzMsMS43NzEsMy43NSwwLjY5Myw1LjUzN2MtMC4xOSwwLjMyLTAuNDI1LDAuNjE4LTAuNjk1LDAuODg3bC02LjU2Miw2LjUxQzEwLjEyNSwxNy4yMjksOS44NzUsMTcuMjI5LDkuNzE5LDE3LjA3MyBNNi4zODgsMy42MUM1LjM3OSwzLjYxLDQuNDMxLDQsMy43MTcsNC43MDdDMi40OTUsNS45MiwyLjI1OSw3Ljc5NCwzLjE0NSw5LjI2NWMwLjE1OCwwLjI2NSwwLjM1MSwwLjUxLDAuNTc0LDAuNzMxTDEwLDE2LjIyOGw2LjI4MS02LjIzMmMwLjIyNC0wLjIyMSwwLjQxNi0wLjQ2NiwwLjU3My0wLjcyOWMwLjg4Ny0xLjQ3MiwwLjY1MS0zLjM0Ni0wLjU3MS00LjU2QzE1LjU3LDQsMTQuNjIxLDMuNjEsMTMuNjEyLDMuNjFjLTEuNDMsMC0yLjYzOSwwLjc4Ni0zLjI2OCwxLjg2M2MtMC4xNTQsMC4yNjQtMC41MzYsMC4yNjQtMC42OSwwQzkuMDI5LDQuMzk3LDcuODIsMy42MSw2LjM4OCwzLjYxIj48L3BhdGg+CiAgICAgIDwvc3ZnPgogICAgICA8c3ZnIGNsYXNzPSJ2aWRlb3N2ZyBzdmctaWNvbiIgdmlld0JveD0iMCAwIDIwIDIwIj4KCQkJCTxwYXRoIGQ9Ik0xOC4xNzUsNC4xNDJIMS45NTFDMS43MDMsNC4xNDIsMS41LDQuMzQ0LDEuNSw0LjU5MnYxMC44MTZjMCwwLjI0NywwLjIwMywwLjQ1LDAuNDUxLDAuNDVoMTYuMjI0YzAuMjQ3LDAsMC40NS0wLjIwMywwLjQ1LTAuNDVWNC41OTJDMTguNjI1LDQuMzQ0LDE4LjQyMiw0LjE0MiwxOC4xNzUsNC4xNDIgTTQuNjU1LDE0Ljk1N0gyLjQwMXYtMS44MDNoMi4yNTNWMTQuOTU3ek00LjY1NSwxMi4yNTRIMi40MDF2LTEuODAzaDIuMjUzVjEyLjI1NHogTTQuNjU1LDkuNTQ5SDIuNDAxVjcuNzQ3aDIuMjUzVjkuNTQ5eiBNNC42NTUsNi44NDZIMi40MDFWNS4wNDNoMi4yNTNWNi44NDZ6TTE0LjU2OSwxNC45NTdINS41NTZWNS4wNDNoOS4wMTNWMTQuOTU3eiBNMTcuNzI0LDE0Ljk1N2gtMi4yNTN2LTEuODAzaDIuMjUzVjE0Ljk1N3ogTTE3LjcyNCwxMi4yNTRoLTIuMjUzdi0xLjgwM2gyLjI1M1YxMi4yNTR6TTE3LjcyNCw5LjU0OWgtMi4yNTNWNy43NDdoMi4yNTNWOS41NDl6IE0xNy43MjQsNi44NDZoLTIuMjUzVjUuMDQzaDIuMjUzVjYuODQ2eiI+PC9wYXRoPgoJCQk8L3N2Zz4KCQkJPHN2ZyBjbGFzcz0iaW1hZ2Vzdmcgc3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CgkJCQk8cGF0aCBkPSJNMTguNTU1LDE1LjM1NFY0LjU5MmMwLTAuMjQ4LTAuMjAyLTAuNDUxLTAuNDUtMC40NTFIMS44ODhjLTAuMjQ4LDAtMC40NTEsMC4yMDMtMC40NTEsMC40NTF2MTAuODA4YzAsMC41NTksMC43NTEsMC40NTEsMC40NTEsMC40NTFoMTYuMjE3aDAuMDA1QzE4Ljc5MywxNS44NTEsMTguNDc4LDE0LjgxNCwxOC41NTUsMTUuMzU0IE0yLjgsMTQuOTQ5bDQuOTQ0LTYuNDY0bDQuMTQ0LDUuNDE5YzAuMDAzLDAuMDAzLDAuMDAzLDAuMDAzLDAuMDAzLDAuMDA1bDAuNzk3LDEuMDRIMi44eiBNMTMuODIyLDE0Ljk0OWwtMS4wMDYtMS4zMTdsMS42ODktMi4yMThsMi42ODgsMy41MzVIMTMuODIyeiBNMTcuNjU0LDE0LjA2NGwtMi43OTEtMy42NjZjLTAuMTgxLTAuMjM3LTAuNTM1LTAuMjM3LTAuNzE2LDBsLTEuODk5LDIuNDkzbC00LjE0Ni01LjQyYy0wLjE4LTAuMjM3LTAuNTM2LTAuMjM3LTAuNzE2LDBsLTUuMDQ3LDYuNTk4VjUuMDQyaDE1LjMxNlYxNC4wNjR6IE0xMi40NzQsNi4zOTNjLTAuODY5LDAtMS41NzcsMC43MDctMS41NzcsMS41NzZzMC43MDgsMS41NzYsMS41NzcsMS41NzZzMS41NzctMC43MDcsMS41NzctMS41NzZTMTMuMzQzLDYuMzkzLDEyLjQ3NCw2LjM5MyBNMTIuNDc0LDguNjQ1Yy0wLjM3MSwwLTAuNjc2LTAuMzA0LTAuNjc2LTAuNjc2czAuMzA1LTAuNjc2LDAuNjc2LTAuNjc2YzAuMzcyLDAsMC42NzYsMC4zMDQsMC42NzYsMC42NzZTMTIuODQ2LDguNjQ1LDEyLjQ3NCw4LjY0NSI+PC9wYXRoPgoJCQk8L3N2Zz4KICAgICAgPGRpdiBpZD0iY29sc2NzcyI+CiAgICAgIC5jb2xzJHtjb2xzfSAjaW1hZ2VzIC5pdGVtIHsKICAgICAgICB3aWR0aDogY2FsYygxMDB2dyAvICR7Y29sc30pOwogICAgICB9CgogICAgICAuY29scyR7Y29sc30gI2ltYWdlcyAuaXRlbSB7CiAgICAgICAgaGVpZ2h0OiBjYWxjKDEwMHZ3IC8gJHtjb2xzfSk7CiAgICAgIH0KICAgICAgCiAgICAgIC5jb2xzJHtjb2xzfSAucXVlcnksCiAgICAgIC5jb2xzJHtjb2xzfSAubGlrZSB7CiAgICAgICAgZm9udC1zaXplOiBtaW4oMTR2dyAqICgxIC8gJHtjb2xzfSksIDZlbSAqICgxIC8gJHtjb2xzfSkpCiAgICAgIH0KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9InNoYXJlLWRpYWxvZyIgY2xhc3M9ImRpYWxvZyI+CiAgICAgIDxoMj5zaGFyZTwvaDI+CiAgICAgIDxmb3JtIGlkPSJzaGFyZS1mb3JtIiBhY3Rpb249IiMiPgogICAgICAgIDxwIGNsYXNzPSJjb250ZW50Ij48L3A+CiAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgY2xhc3M9InN1Ym1pdCIgdmFsdWU9Im9rIi8+CiAgICAgIDwvZm9ybT4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0ibWVkaWEtZm9vdGVyIj4KICAgICAgPGEgaWQ9ImltYWdlLWxpa2UiIGNsYXNzPSJsaWtlIiBocmVmPSIjIj48L2E+CiAgICAgIDxhIGlkPSJpbWFnZS1xdWVyeSIgaHJlZj0iIyI+PC9hPgogICAgICA8YSBpZD0iaW1hZ2UtdXNlciIgaHJlZj0iIyI+PC9hPgogICAgPC9kaXY+CiAgICA8Y2VudGVyIGlkPSJtZWRpYS1jb250YWluZXIiPgogICAgICA8ZGl2IGlkPSJpbWFnZS1jb250YWluZXIiPgogICAgICAgIDxpbWcgaWQ9ImltYWdlIi8+CiAgICAgIDwvZGl2PgogICAgPC9jZW50ZXI+CiAgICA8ZGl2IGlkPSJvdmVybGF5IiBjbGFzcz0iZGlhbG9nIj48L2Rpdj4KICAgIDxkaXYgaWQ9Im1lbnUtY29udGVudCIgY2xhc3M9ImRpYWxvZyI+CiAgICAgIDxkaXYgY2xhc3M9Iml0ZW1zIj4KICAgICAgICA8aDE+PGEgY2xhc3M9InRpdGxlIiBocmVmPSIjIj5maWxlcy5odG1sPC9hPjwvaDE+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmF1dG9wbGF5PC9kaXY+CiAgICAgICAgPGEgY2xhc3M9ImJ1dHRvbiBzZXRhdXRvcGxheSIgZGF0YS1hdXRvcGxheT0ib24iIGhyZWY9IiMiPm9uPC9hPgogICAgICAgIDxhIGNsYXNzPSJidXR0b24gc2V0YXV0b3BsYXkiIGRhdGEtYXV0b3BsYXk9Im9mZiIgaHJlZj0iIyI+b2ZmPC9hPgogICAgICAgIDxhIGNsYXNzPSJidXR0b24gc2V0YXV0b3BsYXkiIGRhdGEtYXV0b3BsYXk9ImhvdmVyIiBocmVmPSIjIj5tb3VzZW92ZXI8L2E+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmNvbHVtbnM8L2Rpdj4KICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIHNldGNvbHMiIGRhdGEtY29scz0iMSIgaHJlZj0iIyI+MTwvYT4KICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIHNldGNvbHMiIGRhdGEtY29scz0iMiIgaHJlZj0iIyI+MjwvYT4KICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIHNldGNvbHMiIGRhdGEtY29scz0iNCIgaHJlZj0iIyI+NDwvYT4KICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIHNldGNvbHMiIGRhdGEtY29scz0iNiIgaHJlZj0iIyI+NjwvYT4KICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIHNldGNvbHMiIGRhdGEtY29scz0iMTAiIGhyZWY9IiMiPjEwPC9hPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5jb25uZWN0aW9uczwvZGl2PgogICAgICAgIDxkaXYgaWQ9ImNvbm5jb3VudCI+MDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5yZWxheXM6PC9kaXY+CiAgICAgICAgPHA+UGxlYXNlIHVzZSByZWxheXMgd2l0aCBOSVAtNTAgKHNlYXJjaCkgZnVuY3Rpb25hbGl0eTwvcD4KICAgICAgICA8Zm9ybSBhY3Rpb249IiMiIGlkPSJyZWxheXMtZm9ybSI+CiAgICAgICAgICA8dGV4dGFyZWEgaWQ9InJlbGF5cyI+PC90ZXh0YXJlYT4KICAgICAgICAgIDxpbnB1dCBjbGFzcz0ic3VibWl0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJzYXZlIHJlbGF5cyIvPgogICAgICAgIDwvZm9ybT4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+cHJpdmF0ZSBrZXk6PC9kaXY+CiAgICAgICAgPHA+SWYgeW91IGNhbnQgdXNlIGJyb3dzZXIgYWRkb24gKG1vYmlsZSk8L3A+CiAgICAgICAgPGZvcm0gYWN0aW9uPSIjIiBpZD0icHJpdmtleS1mb3JtIj4KICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0icHJpdmtleSIvPgogICAgICAgICAgPGlucHV0IGNsYXNzPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9InNhdmUga2V5Ii8+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5sb2dzPC9kaXY+CiAgICAgICAgPGRpdiBpZD0ibG9ncyI+PC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmxhdGVzdCByZWxlYXNlOjwvZGl2PgogICAgICAgIDxhIGNsYXNzPSJidXR0b24iIGlkPSJyZWxlYXNlIiBocmVmPSIjIj48L2E+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJoZWFkZXIiPgogICAgICA8ZGl2IGNsYXNzPSJpY29ucyI+CiAgICAgICAgPGEgaWQ9ImZpbHRlci1saWtlcyIgaHJlZj0iIyIgY2xhc3M9ImhlYWRlci1pY29uIj48L2E+CiAgICAgICAgPGEgaWQ9InNoYXJlIiBocmVmPSIjIiBjbGFzcz0iaGVhZGVyLWljb24iPgogICAgICAgICAgPHN2ZyBjbGFzcz0ic3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CgkJCQkgICAgPHBhdGggZD0iTTE0LjY4LDEyLjYyMWMtMC45LDAtMS43MDIsMC40My0yLjIxNiwxLjA5bC00LjU0OS0yLjYzN2MwLjI4NC0wLjY5MSwwLjI4NC0xLjQ1NywwLTIuMTQ2bDQuNTQ5LTIuNjM4YzAuNTE0LDAuNjYxLDEuMzE1LDEuMDksMi4yMTYsMS4wOWMxLjU0OSwwLDIuODA5LTEuMjYsMi44MDktMi44MDhjMC0xLjU0OC0xLjI2LTIuODA5LTIuODA5LTIuODA5Yy0xLjU0OCwwLTIuODA4LDEuMjYtMi44MDgsMi44MDljMCwwLjM4LDAuMDc2LDAuNzQxLDAuMjE0LDEuMDczbC00LjU1LDIuNjM4Yy0wLjUxNS0wLjY2MS0xLjMxNi0xLjA5LTIuMjE3LTEuMDljLTEuNTQ4LDAtMi44MDgsMS4yNi0yLjgwOCwyLjgwOXMxLjI2LDIuODA4LDIuODA4LDIuODA4YzAuOSwwLDEuNzAyLTAuNDMsMi4yMTctMS4wOWw0LjU1LDIuNjM3Yy0wLjEzOCwwLjMzMi0wLjIxNCwwLjY5My0wLjIxNCwxLjA3NGMwLDEuNTQ5LDEuMjYsMi44MDksMi44MDgsMi44MDljMS41NDksMCwyLjgwOS0xLjI2LDIuODA5LTIuODA5UzE2LjIyOSwxMi42MjEsMTQuNjgsMTIuNjIxTTE0LjY4LDIuNTEyYzEuMTM2LDAsMi4wNiwwLjkyMywyLjA2LDIuMDZTMTUuODE1LDYuNjMsMTQuNjgsNi42M3MtMi4wNTktMC45MjMtMi4wNTktMi4wNTlTMTMuNTQ0LDIuNTEyLDE0LjY4LDIuNTEyTTUuMzE5LDEyLjA2MWMtMS4xMzYsMC0yLjA2LTAuOTI0LTIuMDYtMi4wNnMwLjkyMy0yLjA1OSwyLjA2LTIuMDU5YzEuMTM1LDAsMi4wNiwwLjkyMywyLjA2LDIuMDU5UzYuNDU0LDEyLjA2MSw1LjMxOSwxMi4wNjFNMTQuNjgsMTcuNDg4Yy0xLjEzNiwwLTIuMDU5LTAuOTIyLTIuMDU5LTIuMDU5czAuOTIzLTIuMDYxLDIuMDU5LTIuMDYxczIuMDYsMC45MjQsMi4wNiwyLjA2MVMxNS44MTUsMTcuNDg4LDE0LjY4LDE3LjQ4OCI+PC9wYXRoPgoJCQkgICAgPC9zdmc+CgkJCSAgPC9hPgoJCQk8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iaXRlbXMiPgogICAgICAgIDxhIGNsYXNzPSJ0aXRsZSIgaHJlZj0iIyI+ZmlsZXMuaHRtbDwvYT4KICAgICAgICA8YSBpZD0ibWVudSIgaHJlZj0iIyI+CiAgICAgICAgICA8c3ZnIGNsYXNzPSJtZW51c3ZnIHN2Zy1pY29uIiB2aWV3Qm94PSIwIDAgMjAgMjAiPgoJCSAgICAgICAgPHBhdGggZD0iTTEwLDEuNDQ1Yy00LjcyNiwwLTguNTU1LDMuODI5LTguNTU1LDguNTU1YzAsNC43MjUsMy44MjksOC41NTUsOC41NTUsOC41NTVjNC43MjUsMCw4LjU1NS0zLjgzLDguNTU1LTguNTU1QzE4LjU1NSw1LjI3NCwxNC43MjUsMS40NDUsMTAsMS40NDUgTTEwLDE3LjY1NGMtNC4yMjEsMC03LjY1NC0zLjQzNC03LjY1NC03LjY1NGMwLTQuMjIxLDMuNDMzLTcuNjU0LDcuNjU0LTcuNjU0YzQuMjIyLDAsNy42NTQsMy40MzMsNy42NTQsNy42NTRDMTcuNjU0LDE0LjIyMSwxNC4yMjIsMTcuNjU0LDEwLDE3LjY1NCBNMTQuMzksMTBjMCwwLjI0OC0wLjIwMywwLjQ1LTAuNDUsMC40NUg2LjA2Yy0wLjI0OCwwLTAuNDUtMC4yMDMtMC40NS0wLjQ1czAuMjAzLTAuNDUsMC40NS0wLjQ1aDcuODc5QzE0LjE4Nyw5LjU1LDE0LjM5LDkuNzUyLDE0LjM5LDEwIE0xNC4zOSwxMi43MDJjMCwwLjI0Ny0wLjIwMywwLjQ0OS0wLjQ1LDAuNDQ5SDYuMDZjLTAuMjQ4LDAtMC40NS0wLjIwMi0wLjQ1LTAuNDQ5YzAtMC4yNDgsMC4yMDMtMC40NTEsMC40NS0wLjQ1MWg3Ljg3OUMxNC4xODcsMTIuMjUxLDE0LjM5LDEyLjQ1NCwxNC4zOSwxMi43MDIgTTE0LjM5LDcuMjk4YzAsMC4yNDgtMC4yMDMsMC40NS0wLjQ1LDAuNDVINi4wNmMtMC4yNDgsMC0wLjQ1LTAuMjAzLTAuNDUtMC40NXMwLjIwMy0wLjQ1LDAuNDUtMC40NWg3Ljg3OUMxNC4xODcsNi44NDgsMTQuMzksNy4wNTEsMTQuMzksNy4yOTgiPjwvcGF0aD4KCSAgICAgICAgPC9zdmc+CiAgICAgICAgPC9hPgogICAgICAgIDxmb3JtIGlkPSJxdWVyeS1mb3JtIiBhY3Rpb249IiMiPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJxdWVyeSIgbmFtZT0icXVlcnkiIGlkPSIiIC8+CiAgICAgICAgICA8c2VsZWN0IGlkPSJxdWVyeS10eXBlIj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iYWxsIj5hbGw8L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaW1hZ2UiPmltYWdlczwvb3B0aW9uPgogICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJ2aWRlbyI+dmlkZW9zPC9vcHRpb24+CiAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgIDxpbnB1dCBpZD0iZ28iIHR5cGU9InN1Ym1pdCIgdmFsdWU9ImdvIi8+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxzcGFuIGlkPSJxdWVyeWRpc3BsYXkiPgogICAgICAgICAgPHNwYW4gY2xhc3M9InRleHQiPjwvc3Bhbj4KICAgICAgICA8L3NwYW4+CiAgICAgICAgPGRpdiBpZD0ibG9hZGluZyI+dXBkYXRpbmc8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9InBsYWNlaG9sZGVyIj5Tb21ldGhpbmcgc2hvdWxkIGxvYWQgc29vbiwgbWF5YmUuPC9kaXY+CiAgICA8ZGl2IGlkPSJpbWFnZXMiPjwvZGl2PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vdW5wa2cuY29tL25vc3RyLXRvb2xzL2xpYi9ub3N0ci5idW5kbGUuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vc2xvd2xpLmdpdGh1Yi5pby9iZWNoMzItYnVmZmVyL2Fzc2V0cy9qcy9iZWNoMzItYnVmZmVyLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0PgogICAgICBjb25zdCB1cGRhdGVzcHVia2V5ID0gImFlNWM2ZTBiNzQ2NjBkMjE5NGM4MjU0YjVjMmM4MjU2NzY1NzZiZTAyOTczNzlmYTIwNTIzMTE0YTZhODVlODciCiAgICAgIGNvbnN0IHF1ZXJpZXMgPSB7IAogICAgICAgICJhdXRob3IiOiAnWyJSRVEiLCI8ST4iLHsia2luZHMiOlsxXSwiYXV0aG9ycyI6WyI8UD4iXX1dJwogICAgICB9CiAgICAgIHFzKCIjcmVsYXlzIikudmFsdWUgPSByZWxheXMoKS5qb2luKCJcbiIpCiAgICAgIHFzKCIjcHJpdmtleSIpLnZhbHVlID0gcHJpdmtleSgpCiAgICAgIGNvbnN0IGNvbG9wdHMgPSBbMSwgMiwgNCwgNiwgMTBdCgogICAgICBjb2xzID0gKCkgPT4gcGFyc2VJbnQoc2V0dGluZygiY29scyIsIGNvbG9wdHNbMl0pLCAxMCkKICAgICAgYXV0b3BsYXkgPSAoKSA9PiBzZXR0aW5nKCJhdXRvcGxheSIsICJvZmYiKQogICAgICBsaW1pdCA9ICgpID0+IHBhcnNlSW50KHNldHRpbmcoImxpbWl0IiwgMTUpLCAxMCkKICAgICAgZ2FsbGVyeSA9ICgpID0+IHsKICAgICAgICBsZXQgZ2FsbGVyeW1hdGNoZXIgPSBsb2NhdGlvbi5zZWFyY2gubWF0Y2goL2dhbGxlcnk9KFthLXowLTldKykvKQogICAgICAgIHJldHVybiBnYWxsZXJ5bWF0Y2hlciAmJiBnYWxsZXJ5bWF0Y2hlclsxXQogICAgICB9CiAgICAgIAogICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoImNvbHMiICsgY29scygpKQoKICAgICAgbGV0IHByb3RvY29sID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlLykgPyAibm9zdHI6IiA6ICJ3ZWIrbm9zdHI6IgogICAgICBsZXQgc29ja2V0cyA9IFtdCiAgICAgIGxldCByZXNoYW5kbGVycyA9IFtdCiAgICAgIGxldCB1cmxzID0gW10KICAgICAgbGV0IGxpa2VzID0gW10KICAgICAgbGV0IG5ld2xpa2VzID0gW10KICAgICAgbGV0IGlkY291bnRlciA9IDAKICAgICAgbGV0IHF1ZXJ5d2FpdCA9IG51bGwKICAgICAgbGV0IHByaW1hbHNvY2tldCA9IG51bGwKICAgICAgbGV0IHR5cGVzID0gewogICAgICAgIGltYWdlOiBbInBuZyIsICJqcGciLCAianBlZyIsICJ3ZWJwIl0sCiAgICAgICAgdmlkZW86IFsibXA0IiwgIndlYm0iXQogICAgICB9CiAgICAgIGxldCBpbWdyZWdleCA9IC9odHRwKHxzKVw6XC9cL1teIFxuXSo/XC4ocG5nfGpwZ3xqcGVnfHdlYnApL2dpCiAgICAgIGxldCB2aWRlb3JlZ2V4ID0gL2h0dHAofHMpXDpcL1wvW14gXG5dKj9cLihtcDR8d2VibSkvZ2kKICAgICAgbGV0IHZpZGVvZXh0cmVnZXggPSAvXC4obXA0fHdlYm0pJC9pCiAgICAgIGxldCBpbWdleHRyZWdleCA9IC9cLihwbmd8anBnfGpwZWd8d2VicCkkL2kKICAgICAgd2FpdG1zID0gNTAwMDAKICAgICAgcXVlcnlzdHIgPSAiIgogICAgICBsZXQgcXVlcnljb3VudCA9IDAKICAgICAgbGV0IGhvdmVyZWR2aWRlbyA9IG51bGwKICAgICAgCiAgICAgIHVwZGF0ZXF1ZXJ5KCkKICAgICAgcXMoIiNpbWFnZS1saWtlIikuaW5uZXJIVE1MID0gcXMoIiNmaWx0ZXItbGlrZXMiKS5pbm5lckhUTUwgPSBxcygiI3RlbXBsYXRlIC5oZWFydHN2ZyIpLm91dGVySFRNTAogICAgICBzZXRhY3RpdmUoInNldGNvbHMiLCAiY29scyIsIGNvbHMoKSkKICAgICAgc2V0YWN0aXZlKCJzZXRhdXRvcGxheSIsICJhdXRvcGxheSIsIGF1dG9wbGF5KCkpCiAgICAgIAogICAgICBmdW5jdGlvbiBmcm9tSGV4U3RyaW5nKHN0cil7CiAgICAgICAgbGV0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHN0ci5sZW5ndGggLyAyKQogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnVmZmVyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBidWZmZXJbaV0gPSBwYXJzZUludChzdHIuc3Vic3RyKDIgKiBpLCAyKSwgMTYpCiAgICAgICAgfQogICAgICAgIHJldHVybiBidWZmZXIKICAgICAgfQogIAogICAgICBmdW5jdGlvbiByZWxheXMoKXsKICAgICAgICBjb25zdCBvYmogPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJyZWxheXMiKSkKICAgICAgICBjb25zdCByID0gb2JqICYmIG9iai5maWx0ZXIociA9PiByLm1hdGNoKC93c3M6XC9cLy4rLykpIHx8IFtdCiAgICAgICAgCiAgICAgICAgcmV0dXJuIHIubGVuZ3RoID4gMCAmJiByIHx8IFsKICAgICAgICAgICJ3c3M6Ly9yZWxheS5ub3N0ci5iYW5kIiwKICAgICAgICAgICJ3c3M6Ly9uYi5yZWxheS5jZW50ZXIiLCAKICAgICAgICAgICJ3c3M6Ly9ub3N0ci5jb21waWxlLWVycm9yLm5ldCIKICAgICAgICBdCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHByaXZrZXkoKXsKICAgICAgICBsZXQga2V5ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oInByaXZrZXkiKSB8fCAiIgogICAgICAgIAogICAgICAgIGlmKGtleS5sZW5ndGggPT0gNjMpewogICAgICAgICAga2V5ID0gTm9zdHJUb29scy5uaXAxOS5kZWNvZGUoa2V5KS5kYXRhCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybiBrZXkubGVuZ3RoID09IDY0ICYmIGtleSB8fCBudWxsCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHNldHRpbmcoa2V5LCBkZWZhdWx0dmFsdWUpewogICAgICAgIGNvbnN0IHYgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpCiAgICAgICAgcmV0dXJuIHYgJiYgb3B0aW9uKCJzZXQiICsga2V5LCBrZXksIHYpICYmIHYgfHwgZGVmYXVsdHZhbHVlCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIG9wdGlvbihjLCBrZXksIHZhbCl7CiAgICAgICAgcmV0dXJuIHFzKCIuIiArIGMgKyAiW2RhdGEtIiArIGtleSArICI9JyIgKyB2YWwgKyAiJ10iKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxcyhxKXsKICAgICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihxKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxc2EocSl7CiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChxKSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gZ2lkKGkpewogICAgICAgIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxdWVyeXR5cGUoKXsKICAgICAgICByZXR1cm4gcXMoIiNxdWVyeS10eXBlIikudmFsdWUgfHwgImFsbCIKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gdXBkYXRlcXVlcnkoKXsKICAgICAgICBsZXQgcGFydHMgPSAoZ2FsbGVyeSgpICYmICgiZzoiICsgZ2FsbGVyeSgpKSB8fCBkZWNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaGFzaC5zdWJzdHJpbmcoMSkpKS5zcGxpdCgiLyIpCiAgICAgICAgcXMoIiNxdWVyeWRpc3BsYXkgLnRleHQiKS5pbm5lclRleHQgPSBwYXJ0c1swXS5zdWJzdHJpbmcoMCwgMjApCiAgICAgICAgcXVlcnlzdHIgPSBwYXJ0c1swXQogICAgICAgIHFzKCIjcXVlcnkiKS52YWx1ZSA9IHBhcnRzWzBdCiAgICAgICAgcXMoIiNxdWVyeS10eXBlIikudmFsdWUgPSBwYXJ0c1sxXSB8fCAiYWxsIgogICAgICB9CgogICAgICBmdW5jdGlvbiBhY3RpdmUoKXsKICAgICAgICByZXR1cm4gcXMoIiNpbWFnZXMgLmFjdGl2ZSIpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGltYWdlb2Zmc2V0KG9mZnNldCl7CiAgICAgICAgY29uc3QgaW1hZ2VzID0gcXNhKCIjaW1hZ2VzID4gLml0ZW0iKS5maWx0ZXIobiA9PiBuLm9mZnNldFBhcmVudCkuZmlsdGVyKGUgPT4gZS5jbGFzc0xpc3QuY29udGFpbnMoInZpc2libGUiKSkKICAgICAgICByZXR1cm4gaW1hZ2VzW2ltYWdlcy5pbmRleE9mKGFjdGl2ZSgpKStvZmZzZXRdCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGxhc3RhY3RpdmUoKXsKICAgICAgICByZXR1cm4gcXNhKCIjaW1hZ2VzIC5hY3RpdmUiKS5wb3AoKSAgICAgIAogICAgICB9CgogICAgICBmdW5jdGlvbiBtZW51KCl7CiAgICAgICAgcXNhKCIjbWVudS1jb250ZW50LCAjb3ZlcmxheSIpLmZvckVhY2gobiA9PiBuLmNsYXNzTGlzdC50b2dnbGUoInZpc2libGUiKSkKICAgICAgfQogIAogICAgICBmdW5jdGlvbiBzZXRhY3RpdmUoYywga2V5LCB2YWwpewogICAgICAgIHFzYSgiLiIgKyBjKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKSkKICAgICAgICBjb25zdCBvcHRpb24gPSBxcygiLiIgKyBjICsgIltkYXRhLSIgKyBrZXkgKyAiPSciICsgdmFsICsgIiddIikKICAgICAgICBvcHRpb24/LmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHNjcm9sbHZpc2libGUobiwgb2Zmc2V0KXsKICAgICAgICBvZmZzZXQgPSBvZmZzZXQgfHwgMAogICAgICAgIHJldHVybiAobi5vZmZzZXRUb3AgKyBuLm9mZnNldEhlaWdodCkgPj0gKHNjcm9sbFkgLSBvZmZzZXQpCiAgICAgICAgICAmJiBuLm9mZnNldFRvcCA8PSAoc2Nyb2xsWSArIHZpc3VhbFZpZXdwb3J0LmhlaWdodCArIG9mZnNldCkKICAgICAgfQoKICAgICAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlaW1hZ2VzbG9hZCgpewogICAgICAgIHFzYSgiI2ltYWdlcyAuaXRlbS5pbWciKS5mb3JFYWNoKGFzeW5jIGltZyA9PiB7CiAgICAgICAgICBpZihzY3JvbGx2aXNpYmxlKGltZywgdmlzdWFsVmlld3BvcnQuaGVpZ2h0IC8gMikpewogICAgICAgICAgICBpbWcuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gInVybCgiICsgaW1nWyJkYXRhLXNyYyJdICsgIikiCiAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgaW1nLnN0eWxlLmJhY2tncm91bmRJbWFnZSA9ICIiCiAgICAgICAgICB9CiAgICAgICAgfSkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlYWxsdmlkZW9wbGF5KCl7CiAgICAgICAgcXNhKCIjaW1hZ2VzIC5pdGVtLnZpZGVvIikuZm9yRWFjaChhc3luYyBuID0+IHVwZGF0ZXZpZGVvcGxheShuKSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcHJldmlld3VybHMoKXsKICAgICAgICByZXR1cm4gcXNhKCIjaW1hZ2VzIC5pdGVtIikuZmlsdGVyKG4gPT4gbi5vZmZzZXRQYXJlbnQpLnNsaWNlKDAsIDQpLm1hcChuID0+IG5bImRhdGEtaXRlbSJdLnVybCkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gdXBkYXRldmlkZW9wbGF5KG4pewogICAgICAgIGNvbnN0IGFwbGF5ID0gYXV0b3BsYXkoKQogICAgICAgIGNvbnN0IHYgPSBuLnF1ZXJ5U2VsZWN0b3IoInZpZGVvIikKICAgICAgICAKICAgICAgICBpZihhcGxheSAhPSAib24iKXsKICAgICAgICAgIHYubXV0ZWQgPSBmYWxzZQogICAgICAgICAgdi5wYXVzZSgpCiAgICAgICAgfWVsc2V7CiAgICAgICAgICB2Lm11dGVkID0gdHJ1ZQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZighc2Nyb2xsdmlzaWJsZShuKSl7CiAgICAgICAgICBpZih2LnJlYWR5U3RhdGUgPT0gNCl7CiAgICAgICAgICAgIHYucGF1c2UoKQogICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIHYucHJlbG9hZCA9ICJub25lIgogICAgICAgICAgfQogICAgICAgIH1lbHNlIGlmKHYucmVhZHlTdGF0ZSAhPSA0KXsKICAgICAgICAgIHYucHJlbG9hZCA9ICJhdXRvIgogICAgICAgIH0KICAgICAgICBlbHNlIGlmKGFwbGF5ID09ICJvbiIgfHwgKGFwbGF5ID09ICJob3ZlciIgJiYgdiA9PSBob3ZlcmVkdmlkZW8pKXsKICAgICAgICAgIHYucGxheSgpCiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLCBlID0+IHsKICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpCiAgICAgICAgdXBkYXRlaW1hZ2VzbG9hZCgpCiAgICAgICAgdXBkYXRlYWxsdmlkZW9wbGF5KCkKICAgICAgfSkKICAgICAgCiAgICAgIGxldCB0b3VjaCA9IG51bGwKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLCBlID0+IHRvdWNoID0gZS5jaGFuZ2VkVG91Y2hlc1swXSkKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIiwgZSA9PiB7CiAgICAgICAgY29uc3QgeGRpZmYgPSBlLmNoYW5nZWRUb3VjaGVzWzBdLnNjcmVlblggLSB0b3VjaC5zY3JlZW5YCgogICAgICAgIGlmKHhkaWZmIDwgLTUwKXsKICAgICAgICAgIHN3aXBlKDEpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKHhkaWZmID4gNTApewogICAgICAgICAgc3dpcGUoLTEpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgcXMoIiNxdWVyeS1mb3JtIikuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgZSA9PiB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgd2luZG93Lmhpc3RvcnkucHVzaFN0YXRlKG51bGwsIG51bGwsIGxvY2F0aW9uLnBhdGhuYW1lKQogICAgICAgIGxvY2F0aW9uLmhhc2ggPSAiIyIgKyBlbmNvZGVVUklDb21wb25lbnQocXMoIiNxdWVyeSIpLnZhbHVlICsgIi8iICsgcXVlcnl0eXBlKCkpCiAgICAgICAgdXBkYXRlcXVlcnkoKQogICAgICAgIHF1ZXJ5d2FpdC5yZXNvbHZlKCkKICAgICAgfSkKCiAgICAgIHFzKCIjcmVsYXlzLWZvcm0iKS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLCBhc3luYyBlID0+IHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICBsZXQgciA9IEpTT04uc3RyaW5naWZ5KHFzKCIjcmVsYXlzIikudmFsdWUuc3BsaXQoIlxuIikpCiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oInJlbGF5cyIsIHIpCiAgICAgICAgZGlzY29ubmVjdCgpCiAgICAgIH0pCiAgICAgIAogICAgICBxcygiI3NoYXJlLWZvcm0iKS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLCBhc3luYyBlID0+IHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICAKICAgICAgICBpZihxcygiI3NoYXJlLWZvcm0gLnN1Ym1pdCIpLnZhbHVlID09ICJjbG9zZSIpewogICAgICAgICAgcXNhKCIuZGlhbG9nLnZpc2libGUiKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QucmVtb3ZlKCJ2aXNpYmxlIikpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QgZXZlbnRzID0gcXNhKCIjaW1hZ2VzIC5pdGVtIikuZmlsdGVyKG4gPT4gbi5vZmZzZXRQYXJlbnQpLm1hcChuID0+IG5bImRhdGEtZXZlbnQiXS5pZCkKICAgICAgICBjb25zdCBldmVudCA9IGF3YWl0IHB1Ymxpc2goewogICAgICAgICAgImtpbmQiOiAzMzMsCiAgICAgICAgICAiY29udGVudCI6IEpTT04uc3RyaW5naWZ5KGV2ZW50cyksCiAgICAgICAgICAidGFncyI6IFtdCiAgICAgICAgfSkKCiAgICAgICAgYXdhaXQgd2FpdHJlcyhudWxsLCAiT0siKQoKICAgICAgICBjb25zdCB1cmwgPSB3aW5kb3cubG9jYXRpb24ub3JpZ2luICsgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lCiAgICAgICAgCiAgICAgICAgY29uc3QgY29udGVudCA9ICJUaGlzIGlzIGEgZ2FsbGVyeSBvZiAiICsgZXZlbnRzLmxlbmd0aAogICAgICAgICAgICArICIgaW1hZ2VzL3ZpZGVvcyBzaGFyZWQgZnJvbSBmaWxlcy5odG1sLiBDaGVjayBpdCBvdXQgaGVyZTogIiArIHVybCArICI/Z2FsbGVyeT0iICsgZXZlbnQuaWQKICAgICAgICAgICAgKyAiXG5cbiIgKyBwcmV2aWV3dXJscygpLmpvaW4oIlxuIikKICAgICAgICAKICAgICAgICBjb25zdCBwdWJsaXNoZWRldmVudCA9IGF3YWl0IHB1Ymxpc2goewogICAgICAgICAgImtpbmQiOiAxLAogICAgICAgICAgImNvbnRlbnQiOiBjb250ZW50LAogICAgICAgICAgInRhZ3MiOiBbCiAgICAgICAgICAgIFsiI2UiLCBldmVudC5pZF0sIAogICAgICAgICAgICBbIiNwIiwgZXZlbnQucHVia2V5XQogICAgICAgICAgXQogICAgICAgIH0pCgogICAgICAgIGF3YWl0IHdhaXRyZXMobnVsbCwgIk9LIikKICAgICAgICAKICAgICAgICBjb25zdCBiZWNoMzJpZCA9IGJlY2gzMi5lbmNvZGUoIm5vdGUiLCBmcm9tSGV4U3RyaW5nKHB1Ymxpc2hlZGV2ZW50LmlkKSkKICAgICAgICBxcygiI3NoYXJlLWZvcm0gLmNvbnRlbnQiKS5pbm5lckhUTUwgPSAnTm90ZSBwdWJsaXNoZWQgPGEgaHJlZj0iJyArIHByb3RvY29sICsgYmVjaDMyaWQgKyAnIj4nICsgYmVjaDMyaWQgKyAnPC9hPicKICAgICAgICBxcygiI3NoYXJlLWZvcm0gLnN1Ym1pdCIpLnZhbHVlID0gImNsb3NlIgogICAgICB9KQoKICAgICAgcXMoIiNwcml2a2V5LWZvcm0iKS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLCBhc3luYyBlID0+IHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICBjb25zdCBrZXkgPSBxcygiI3ByaXZrZXkiKS52YWx1ZQoKICAgICAgICBpZihrZXkubGVuZ3RoICE9IDY0ICYmIGtleS5sZW5ndGggIT0gNjMpewogICAgICAgICAgYWxlcnQoImtleSBzaG91bGQgYmUgNjMgb3IgNjQgY2hhcmFjdGVycyBsb25nIikKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgicHJpdmtleSIsIGtleSkKICAgICAgICBhbGVydCgia2V5IHNhdmVkIikKICAgICAgfSkKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgaWYoYXV0b3BsYXkoKSA9PSAiaG92ZXIiICYmIGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygidmlkZW8tY29udGFpbmVyIikpewogICAgICAgICAgaG92ZXJlZHZpZGVvID0gZS50YXJnZXQucXVlcnlTZWxlY3RvcigidmlkZW8iKQogICAgICAgICAgaG92ZXJlZHZpZGVvLnBsYXkoKQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IiwgYXN5bmMgKGUpID0+IHsKICAgICAgICBob3ZlcmVkdmlkZW8gPSBmYWxzZQogICAgICAgIGlmKCFxcygiI21lZGlhLWNvbnRhaW5lciIpLmNsYXNzTGlzdC5jb250YWlucygidmlzaWJsZSIpICYmIGF1dG9wbGF5KCkgPT0gImhvdmVyIiAmJiBlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInZpZGVvLWNvbnRhaW5lciIpKXsKICAgICAgICAgIHFzYSgidmlkZW8iKS5mb3JFYWNoKHYgPT4gdi5wYXVzZSgpKQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgYXN5bmMgKGUpID0+IHsKICAgICAgICBpZihlLnRhcmdldC50eXBlID09ICJzdWJtaXQiIHx8IChlLnRhcmdldC50YWdOYW1lID09ICJBIiAmJiBlLnRhcmdldC5ocmVmLm1hdGNoKC9eKHx3ZWJcKylub3N0clw6LykpKXsKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgIAogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygidGl0bGUiKSl7CiAgICAgICAgICBxcygiI3F1ZXJ5IikudmFsdWUgPSAiIgogICAgICAgICAgcXMoIiNxdWVyeS10eXBlIikudmFsdWUgPSAiYWxsIgogICAgICAgICAgcXMoIiNnbyIpLmNsaWNrKCkKICAgICAgICB9CgogICAgICAgIGUucHJldmVudERlZmF1bHQoKQoKICAgICAgICBpZihlLnRhcmdldC5pZCA9PSAiZmlsdGVyLWxpa2VzIil7CiAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC50b2dnbGUoImZpbHRlci1saWtlcyIpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gInNoYXJlIil7CiAgICAgICAgICBjb25zdCBldmVudHMgPSBxc2EoIiNpbWFnZXMgLml0ZW0iKS5maWx0ZXIobiA9PiBuLm9mZnNldFBhcmVudCkubWFwKG4gPT4gblsiZGF0YS1ldmVudCJdLmlkKQogICAgICAgICAgLy9jb25zdCB0ZXh0ID0ge3R5cGU6ICIiLCBldmVudHM6IH0KICAgICAgICAgIHFzKCIjc2hhcmUtZGlhbG9nIC5jb250ZW50IikuaW5uZXJIVE1MID0gIjxwPlNoYXJlIGxpbmsgdG8gdGhpcyBnYWxsZXJ5IG9mICIgKyBldmVudHMubGVuZ3RoICsgIiBpbWFnZXMvdmlkZW9zIHRvIHlvdXIgbm9zdHIgcHJvZmlsZT88L3A+IgogICAgICAgICAgcXMoIiNzaGFyZS1kaWFsb2cgLmNvbnRlbnQiKS5pbm5lckhUTUwgKz0gcHJldmlld3VybHMoKS5tYXAodXJsID0+ICc8aW1nIHNyYz0iJyt1cmwrJyIvPicpLmpvaW4oIiAiKQogICAgICAgICAgcXMoIiNzaGFyZS1mb3JtIC5zdWJtaXQiKS52YWx1ZSA9ICJwdWJsaXNoIgogICAgICAgICAgcXNhKCIjc2hhcmUtZGlhbG9nLCAjb3ZlcmxheSIpLmZvckVhY2gobiA9PiBuLmNsYXNzTGlzdC50b2dnbGUoInZpc2libGUiKSkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzaG93IikpewogICAgICAgICAgYWN0aXZlKCk/LmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgICBjb25zdCBpZCA9IGUudGFyZ2V0LmlkIHx8IGUudGFyZ2V0WyJkYXRhLWl0ZW0taWQiXQogICAgICAgICAgZ2lkKGlkKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgc2hvdyhpZCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLnRhcmdldC50YWdOYW1lICE9ICJBIiAmJiAocXMoIiNpbWFnZS1jb250YWluZXIiKSA9PSBlLnRhcmdldCB8fCBxcygiI2ltYWdlIikgPT0gZS50YXJnZXQgfHwgcXMoIiNtZWRpYS1jb250YWluZXIgdmlkZW8iKSA9PSBlLnRhcmdldCkpewogICAgICAgICAgaGlkZW1lZGlhKCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gIm1lbnUiKXsKICAgICAgICAgIG1lbnUoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLnRhcmdldC5pZCA9PSAib3ZlcmxheSIpewogICAgICAgICAgcXNhKCIuZGlhbG9nLnZpc2libGUiKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QucmVtb3ZlKCJ2aXNpYmxlIikpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzZXRjb2xzIikpewogICAgICAgICAgZm9yKGxldCBjIG9mIGNvbG9wdHMpewogICAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoImNvbHMiICsgYykKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJjb2xzIiArIGUudGFyZ2V0LmRhdGFzZXQuY29scykKICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJjb2xzIiwgZS50YXJnZXQuZGF0YXNldC5jb2xzKQogICAgICAgICAgc2V0YWN0aXZlKCJzZXRjb2xzIiwgImNvbHMiLCBjb2xzKCkpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzZXRhdXRvcGxheSIpKXsKICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJhdXRvcGxheSIsIGUudGFyZ2V0LmRhdGFzZXQuYXV0b3BsYXkpCiAgICAgICAgICBzZXRhY3RpdmUoInNldGF1dG9wbGF5IiwgImF1dG9wbGF5IiwgYXV0b3BsYXkoKSkKICAgICAgICAgIHVwZGF0ZWFsbHZpZGVvcGxheSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJsaWtlIikgJiYgbGlrZShlLnRhcmdldCkKICAgICAgfSkKICAgICAgCiAgICAgIGZ1bmN0aW9uIGhhc2tleSgpewogICAgICAgIHJldHVybiB3aW5kb3cubm9zdHIgfHwgcHJpdmtleSgpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHB1YmtleSgpewogICAgICAgIHJldHVybiB3aW5kb3cubm9zdHIgJiYgYXdhaXQgd2luZG93Lm5vc3RyLmdldFB1YmxpY0tleSgpIHx8IE5vc3RyVG9vbHMuZ2V0UHVibGljS2V5KHByaXZrZXkoKSkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gc2lnbihldmVudCl7CiAgICAgICAgaWYod2luZG93Lm5vc3RyKXsKICAgICAgICAgIHJldHVybiBhd2FpdCBub3N0ci5zaWduRXZlbnQoZXZlbnQpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGV2ZW50LnNpZyA9IE5vc3RyVG9vbHMuZ2V0U2lnbmF0dXJlKGV2ZW50LCBwcml2a2V5KCkpCiAgICAgICAgcmV0dXJuIGV2ZW50CiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGxpa2UobGluayl7CiAgICAgICAgY29uc3QgZXZlbnQgPSBsaW5rLnBhcmVudEVsZW1lbnRbImRhdGEtZXZlbnQiXQogICAgICAgIAogICAgICAgIGF3YWl0IHB1Ymxpc2goewogICAgICAgICAgImtpbmQiOiA3LAogICAgICAgICAgImNvbnRlbnQiOiAiKyIsCiAgICAgICAgICAidGFncyI6IFsKICAgICAgICAgICAgWyJlIiwgZXZlbnQuaWRdLAogICAgICAgICAgICBbInAiLCBldmVudC5wdWJrZXldCiAgICAgICAgICBdCiAgICAgICAgfSkKCiAgICAgICAgbGluay5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKCiAgICAgICAgY29uc3QgaW1hZ2VpZCA9IGxpbmtbImRhdGEtaXRlbS1pZCJdIHx8IGxpbmsuZGF0YXNldC5pbWFnZUlkCiAgICAgICAgCiAgICAgICAgaWYoaW1hZ2VpZCl7CiAgICAgICAgICBnaWQoaW1hZ2VpZCkucXVlcnlTZWxlY3RvcigiLmxpa2UiKS5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHByZXBhcmVfZXZlbnQoZXZlbnQpewogICAgICAgIGV2ZW50LnB1YmtleSA9IGF3YWl0IHB1YmtleSgpCiAgICAgICAgZXZlbnQuY3JlYXRlZF9hdCA9IHBhcnNlSW50KERhdGUubm93KCkgLyAxMDAwLCAxMCkKICAgICAgICBldmVudC5pZCA9IE5vc3RyVG9vbHMuZ2V0RXZlbnRIYXNoKGV2ZW50KQogICAgICAgIHJldHVybiBldmVudAogICAgICB9CiAgICAgICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcHVibGlzaChldmVudCl7CiAgICAgICAgZXZlbnQgPSBhd2FpdCBwcmVwYXJlX2V2ZW50KGV2ZW50KQogICAgICAgIGxldCBzaWduZWRldmVudCA9IGF3YWl0IHNpZ24oZXZlbnQpCiAgICAgICAgbGV0IGpzb24gPSBKU09OLnN0cmluZ2lmeShbIkVWRU5UIiwgc2lnbmVkZXZlbnRdKQogICAgICAgIHNvY2tldHMuZm9yRWFjaChzID0+IHMuc2VuZChqc29uKSkKICAgICAgICAKICAgICAgICByZXR1cm4gZXZlbnQKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gc3dpcGUob2Zmc2V0KXsKICAgICAgICBpZihpbWFnZW9mZnNldChvZmZzZXQpKXsKICAgICAgICAgIGltYWdlb2Zmc2V0KG9mZnNldCkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIHRoaXNbb2Zmc2V0ID09IC0xICYmICJsYXN0YWN0aXZlIiB8fCAiYWN0aXZlIl0oKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgICAgdXBkYXRlc2hvdygpCiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiB1cGRhdGVzaG93KCl7CiAgICAgICAgaWYocXMoIiNtZWRpYS1jb250YWluZXIiKS5jbGFzc0xpc3QuY29udGFpbnMoInZpc2libGUiKSl7CiAgICAgICAgICBoaWRldmlkZW8oKQogICAgICAgICAgc2hvdyhhY3RpdmUoKS5pZCkKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCBlID0+IHsKICAgICAgICBpZihbIlRhYiIsICJBcnJvd0xlZnQiLCAiQXJyb3dSaWdodCIsICJBcnJvd1VwIiwgIkFycm93RG93biJdLmluY2x1ZGVzKGUua2V5KSl7CiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJFc2NhcGUiKXsKICAgICAgICAgIG1lbnUoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUua2V5ID09ICJFbnRlciIgJiYgZS50YXJnZXQudGFnTmFtZSA9PSAiQk9EWSIpewogICAgICAgICAgaWYocXMoIiNtZWRpYS1jb250YWluZXIiKS5jbGFzc0xpc3QuY29udGFucygidmlzaWJsZSIpKXsKICAgICAgICAgICAgaGlkZW1lZGlhKCkKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHNob3coYWN0aXZlKCkuaWQpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd1VwIiAmJiBpbWFnZW9mZnNldCgtY29scygpKSl7CiAgICAgICAgICBpbWFnZW9mZnNldCgtY29scygpKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgbGFzdGFjdGl2ZSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgICB1cGRhdGVzaG93KCkKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd0Rvd24iICYmIGltYWdlb2Zmc2V0KGNvbHMoKSkpewogICAgICAgICAgaW1hZ2VvZmZzZXQoY29scygpKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgYWN0aXZlKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIHVwZGF0ZXNob3coKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93TGVmdCIpewogICAgICAgICAgc3dpcGUoLTEpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dSaWdodCIpewogICAgICAgICAgc3dpcGUoMSkKICAgICAgICB9CiAgICAgIH0pCgogICAgICBhc3luYyBmdW5jdGlvbiBoYW5kbGVxdWVyeXJlcyhyZXMsIHNvY2tldCwgcSwgdHlwZSwgc3RpbWUpewogICAgICAgIHNhdmUoc29ja2V0LCByZXMsIHEsIHR5cGUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSkKICAgICAgICBsb2coInF1ZXJ5IHJlcyIsIHJlcy5sZW5ndGgsIHNvY2tldC51cmwpCiAgICAgICAgcXVlcnljb3VudC0tCiAgICAgICAgaWYocXVlcnljb3VudCA9PSAwKXsKICAgICAgICAgIHFzKCIjbG9hZGluZyIpLmNsYXNzTGlzdC5yZW1vdmUoInZpc2libGUiKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBsZXQgd2FpdCA9IHdhaXRtcyAtIChEYXRlLm5vdygpIC0gc3RpbWUpCiAgICAgICAgcXVlcnl3YWl0ID0gc2xlZXAod2FpdCkKICAgICAgICBhd2FpdCBxdWVyeXdhaXQucHJvbWlzZQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBwcmltYWxnbG9iYWwoc29ja2V0KXsKICAgICAgICBsb2coImdsb2JhbCIsIHNvY2tldC51cmwpCiAgICAgICAgcXVlcnljb3VudCsrCiAgICAgICAgcXMoIiNsb2FkaW5nIikuY2xhc3NMaXN0LmFkZCgidmlzaWJsZSIpCiAgICAgICAgbGV0IHN0aW1lID0gRGF0ZS5ub3coKQogICAgICAgIGxldCBxaWQgPSAiZ2xvYmFsXyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgbGV0IHFpZGxpa2VzID0gImxpa2VzXyIgKyAoKytpZGNvdW50ZXIpCgogICAgICAgIGlmKG5ld2xpa2VzLmxlbmd0aCA+IDApewogICAgICAgICAgcHJpbWFsc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoWwogICAgICAgICAgICAiUkVRIiwgCiAgICAgICAgICAgIHFpZGxpa2VzLCAKICAgICAgICAgICAgewogICAgICAgICAgICAgICJjYWNoZSI6IFsKICAgICAgICAgICAgICAgICJldmVudHMiLCB7CiAgICAgICAgICAgICAgICAgICJldmVudF9pZHMiOiBuZXdsaWtlcwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIF0KICAgICAgICAgICAgfQogICAgICAgICAgXSkpCgogICAgICAgICAgY29uc3QgbGlrZV9ldmVudHMgPSAoYXdhaXQgd2FpdHJlcyhxaWRsaWtlcykpWzBdCiAgICAgICAgICBuZXdsaWtlcy5zcGxpY2UoMCkKICAgICAgICAgIAogICAgICAgICAgYXdhaXQgc2F2ZShzb2NrZXQsIGxpa2VfZXZlbnRzLCAiIiwgImFsbCIsIHRydWUsIHRydWUsIGZhbHNlKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeShbCiAgICAgICAgICAiUkVRIiwgCiAgICAgICAgICBxaWQsIAogICAgICAgICAgewogICAgICAgICAgICAiY2FjaGUiOiBbCiAgICAgICAgICAgICAgImV4cGxvcmUiLCAKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAidGltZWZyYW1lIjogImxhdGVzdCIsCiAgICAgICAgICAgICAgICAic2NvcGUiOiAiZ2xvYmFsIiwKICAgICAgICAgICAgICAgICJsaW1pdCI6IDUwCiAgICAgICAgICAgICAgfQogICAgICAgICAgICBdCiAgICAgICAgICB9CiAgICAgICAgXSkpCiAgICAgICAgCiAgICAgICAgY29uc3QgcmVzID0gKGF3YWl0IHdhaXRyZXMocWlkKSlbMF0KICAgICAgICBhd2FpdCBoYW5kbGVxdWVyeXJlcyhyZXMuZmlsdGVyKGUgPT4gZS5raW5kID09IDEpLCBzb2NrZXQsICIiLCAiYWxsIiwgc3RpbWUpCiAgICAgICAgcHJpbWFsZ2xvYmFsKHNvY2tldCkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcXVlcnkoc29ja2V0LCBwcmltYWwpewogICAgICAgIGxvZygicXVlcnkiLCBzb2NrZXQudXJsKQogICAgICAgIHF1ZXJ5Y291bnQrKwogICAgICAgIHFzKCIjbG9hZGluZyIpLmNsYXNzTGlzdC5hZGQoInZpc2libGUiKQogICAgICAgIAogICAgICAgIGxldCBzdGltZSA9IERhdGUubm93KCkKICAgICAgICBsZXQgcSA9IHF1ZXJ5c3RyLnRyaW0oKQogICAgICAgIGxldCB0eXBlID0gcXVlcnl0eXBlKCkKICAgICAgICBsZXQgaSA9ICsraWRjb3VudGVyCiAgICAgICAgbGV0IHFpZCA9ICJxdWVyeV8iICsgaQogICAgICAgIGNvbnN0IGxpa2VzcmVzID0gYXdhaXQgcXVlcnlsaWtlcyhzb2NrZXQpCiAgICAgICAgCiAgICAgICAgbGlrZXNyZXMuZm9yRWFjaChldmVudGlkID0+IHsKICAgICAgICAgIGlmKCFsaWtlcy5pbmNsdWRlcyhldmVudGlkKSl7CiAgICAgICAgICAgIGxpa2VzLnB1c2goZXZlbnRpZCkKICAgICAgICAgICAgbmV3bGlrZXMucHVzaChldmVudGlkKQogICAgICAgICAgfQogICAgICAgIH0pCiAgICAgICAgCiAgICAgICAgbGV0IGdhbGxlcnltYXRjaCA9IHF1ZXJ5c3RyLm1hdGNoKC9nOihbYS16MC05XSspLykKICAgICAgICBsZXQgcmVzID0gbnVsbAogICAgICAgIAogICAgICAgIGlmKGdhbGxlcnltYXRjaCl7CiAgICAgICAgICBjb25zdCBnYWxsZXJ5cmVzID0gYXdhaXQgcXVlcnlldmVudHMoc29ja2V0LCBbMzMzXSwgW2dhbGxlcnltYXRjaFsxXV0sIG51bGwpCiAgICAgICAgICBjb25zdCBldmVudGlkcyA9IEpTT04ucGFyc2UoZ2FsbGVyeXJlc1swXS5jb250ZW50KQogICAgICAgICAgcmVzID0gYXdhaXQgcXVlcnlldmVudHMoc29ja2V0LCBbMV0sIGV2ZW50aWRzLCBudWxsKQogICAgICAgIH1lbHNlewogICAgICAgICAgbGV0IGZpbHRlcnMgPSBbXQoKICAgICAgICAgIGZpbHRlcnMucHVzaCguLi4odHlwZXNbdHlwZV0gfHwgW10pLm1hcCgodCkgPT4gewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgIGtpbmRzOiBbMV0sIAogICAgICAgICAgICAgIHNlYXJjaDogIi4iICsgdCwKICAgICAgICAgICAgICBsaW1pdDogMjAKICAgICAgICAgICAgfQogICAgICAgICAgfSkpCiAgICAgICAgICAKICAgICAgICAgIGlmKHEubGVuZ3RoID4gMCl7CiAgICAgICAgICAgIGZpbHRlcnMucHVzaCh7a2luZHM6IFsxXSwgc2VhcmNoOiBxfSkKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgaWYoZmlsdGVycy5sZW5ndGggPT0gMCl7CiAgICAgICAgICAgIGZpbHRlcnMucHVzaCh7a2luZHM6IFsxXX0pCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIGNvbnN0IHNlYXJjaG9iaiA9IFsiUkVRIiwgcWlkLCAuLi5maWx0ZXJzXQogICAgICAgICAgY29uc3Qgc2VhcmNoanNvbiA9IEpTT04uc3RyaW5naWZ5KHNlYXJjaG9iaikKICAgICAgICAgIHNvY2tldC5zZW5kKHNlYXJjaGpzb24pCiAgICAgICAgICAKICAgICAgICAgIHJlcyA9IChhd2FpdCB3YWl0cmVzKHFpZCkpWzBdCiAgICAgICAgICAKICAgICAgICAgIHJlcyA9IHJlcy5maWx0ZXIobyA9PiB7CiAgICAgICAgICAgIGlmKHEubGVuZ3RoID4gMCl7CiAgICAgICAgICAgICAgZm9yKGxldCB3b3JkIG9mIHEuc3BsaXQoIiAiKSl7CiAgICAgICAgICAgICAgICBpZihvLmNvbnRlbnQudG9Mb3dlckNhc2UoKS5pbmRleE9mKHdvcmQudG9Mb3dlckNhc2UoKSkgPT0gLTEpewogICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2UKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlCiAgICAgICAgICB9KQogICAgICAgIH0KICAgICAgICAKICAgICAgICBhd2FpdCBoYW5kbGVxdWVyeXJlcyhyZXMsIHNvY2tldCwgcSwgdHlwZSwgc3RpbWUpCiAgICAgICAgcXVlcnkoc29ja2V0KQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeWxpa2VzKHNvY2tldCl7CiAgICAgICAgaWYoIWhhc2tleSgpKXsKICAgICAgICAgIHJldHVybiBbXQogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBteXB1YmtleSA9IGF3YWl0IHB1YmtleSgpCiAgICAgICAgY29uc3QgZXZlbnRzID0gYXdhaXQgcXVlcnlldmVudHMoc29ja2V0LCBbN10sIG51bGwsIFtteXB1YmtleV0pCiAgICAgICAgcmV0dXJuIGV2ZW50cy5tYXAoZSA9PiBlLnRhZ3MuZmluZCh0ID0+IHRbMF0gPT0gImUiKVsxXSkKICAgICAgfQoKICAgICAgYXN5bmMgZnVuY3Rpb24gcXVlcnlldmVudHMoc29ja2V0LCBraW5kcywgZXZlbnRpZHMsIGF1dGhvcnMpewogICAgICAgIGNvbnN0IHF1ZXJ5aWQgPSAiZXZlbnRzXyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgY29uc3QgZmlsdGVycyA9IHt9CiAgICAgICAgCiAgICAgICAgZmlsdGVycy5raW5kcyA9IGtpbmRzCiAgICAgICAgCiAgICAgICAgaWYoZXZlbnRpZHMpewogICAgICAgICAgZmlsdGVyc1siaWRzIl0gPSBldmVudGlkcwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihhdXRob3JzKXsKICAgICAgICAgIGZpbHRlcnNbImF1dGhvcnMiXSA9IGF1dGhvcnMKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KFsKICAgICAgICAgICJSRVEiLCAKICAgICAgICAgIHF1ZXJ5aWQsIAogICAgICAgICAgZmlsdGVycwogICAgICAgIF0pCiAgICAgICAgCiAgICAgICAgc29ja2V0LnNlbmQoanNvbikKICAgICAgICAKICAgICAgICByZXR1cm4gKGF3YWl0IHdhaXRyZXMocXVlcnlpZCkpWzBdIHx8IFtdCiAgICAgIH0KCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHNhdmUoc29ja2V0LCBldmVudHMsIHEsIHF0eXBlLCByZWFjdGVkLCBhcHBlbmQsIHF1ZXJ5bWV0YSl7CiAgICAgICAgbGV0IGV2ZW50cHVia2V5cyA9IFtdCiAgICAgICAgbGV0IHJlc3VsdHMgPSBbXQogICAgICAgIGNvbnN0IGV2ZW50aWRzID0gZXZlbnRzLm1hcChlID0+IGUuaWQpCiAgICAgICAgbGV0IG5ld3VybHMgPSBbXQogICAgICAgIAogICAgICAgIGZvcihsZXQgZXZlbnQgb2YgZXZlbnRzKXsKICAgICAgICAgIGxldCB1cmxzbWF0Y2ggPSBbXQogICAgICAgICAgCiAgICAgICAgICBpZihxdHlwZSAhPSAidmlkZW8iKXsKICAgICAgICAgICAgdXJsc21hdGNoLnB1c2goLi4uKGV2ZW50LmNvbnRlbnQubWF0Y2goaW1ncmVnZXgpIHx8IFtdKSkKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgaWYocXR5cGUgIT0gImltYWdlIil7CiAgICAgICAgICAgIHVybHNtYXRjaC5wdXNoKC4uLihldmVudC5jb250ZW50Lm1hdGNoKHZpZGVvcmVnZXgpIHx8IFtdKSkKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgdXJsc21hdGNoID0gdXJsc21hdGNoLmZpbHRlcih1cmwgPT4gIXVybHMuaW5jbHVkZXModXJsKSkKCiAgICAgICAgICBpZih1cmxzbWF0Y2gubGVuZ3RoID4gMCl7CiAgICAgICAgICAgIG5ld3VybHMucHVzaCh7CiAgICAgICAgICAgICAgZXZlbnQ6IGV2ZW50LAogICAgICAgICAgICAgIHVybHM6IHVybHNtYXRjaAogICAgICAgICAgICB9KQogICAgICAgICAgICAKICAgICAgICAgICAgdXJscy5wdXNoKC4uLnVybHNtYXRjaCkKICAgICAgICAgICAgZXZlbnRwdWJrZXlzLmluY2x1ZGVzKGV2ZW50LnB1YmtleSkgfHwgZXZlbnRwdWJrZXlzLnB1c2goZXZlbnQucHVia2V5KQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICBsb2coInF1ZXJ5IG1ldGEiLCBzb2NrZXQudXJsKQogICAgICAgIGxldCBtZXRhZXZlbnRzID0gKHF1ZXJ5bWV0YSAmJiBhd2FpdCBxdWVyeWV2ZW50cyhzb2NrZXQsIFswXSwgbnVsbCwgZXZlbnRwdWJrZXlzKSB8fCBbXSkKICAgICAgICAKICAgICAgICBmb3IobGV0IGVudHJ5IG9mIG5ld3VybHMpewogICAgICAgICAgZm9yKGxldCB1cmwgb2YgZW50cnkudXJscyl7CiAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7CiAgICAgICAgICAgICAgcmVhY3RlZDogcmVhY3RlZCB8fCBsaWtlcy5pbmNsdWRlcyhlbnRyeS5ldmVudC5pZCksIAogICAgICAgICAgICAgIHVybDogdXJsLCAKICAgICAgICAgICAgICBldmVudDogZW50cnkuZXZlbnQsIAogICAgICAgICAgICAgIGJlY2gzMmlkOiBiZWNoMzIuZW5jb2RlKCJub3RlIiwgZnJvbUhleFN0cmluZyhlbnRyeS5ldmVudC5pZCkpLAogICAgICAgICAgICAgIG1ldGE6IG1ldGFldmVudHMuZmluZChvID0+IG8ucHVia2V5ID09IGVudHJ5LmV2ZW50LnB1YmtleSkKICAgICAgICAgICAgfSkKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbG9nKCJzYXZlIHJlcyIsIHJlc3VsdHMubGVuZ3RoLCBzb2NrZXQudXJsKQogICAgICAgIHVwZGF0ZWNvbnRlbnQocmVzdWx0cywgcSwgYXBwZW5kKQogICAgICB9CiAgICAgIAogICAgICBsZXQgbG9hZGVkID0gMAogICAgICAKICAgICAgZnVuY3Rpb24gdXBkYXRlY29udGVudChyZXN1bHRzLCBxLCBhcHBlbmQpewogICAgICAgIHJlc3VsdHMucmV2ZXJzZSgpLmZvckVhY2goaXRlbSA9PiB7CiAgICAgICAgICBjb25zdCB0eXBlID0gaXRlbS51cmwubWF0Y2godmlkZW9leHRyZWdleCkgJiYgInZpZGVvIiB8fCAiaW1hZ2UiCiAgICAgICAgICBjb25zdCB0ZXh0ID0gKHEgfHwgInZpZXcgbm90ZSIpLnN1YnN0cmluZygtMzApCiAgICAgICAgICBjb25zdCBpZCA9ICJpdGVtXyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgICBjb25zdCBjb250ZW50ZWxlbWVudHMgPSAnPGRpdiBjbGFzcz0idHlwZSI+JyArIHFzKCIjdGVtcGxhdGUgLiIgKyB0eXBlICsgInN2ZyIpLm91dGVySFRNTCArICc8L2Rpdj48YSBjbGFzcz0ibGlrZScgKyAoaXRlbS5yZWFjdGVkID8gJyByZWFjdGVkJyA6ICcnKSArICciIGRhdGEtaXRlbS1pZD0iJyArIGlkICsgCiAgICAgICAgICAgICciIGhyZWY9IiMiPicgKyBxcygiI3RlbXBsYXRlIC5oZWFydHN2ZyIpLm91dGVySFRNTCArICc8L2E+PGEgY2xhc3M9InF1ZXJ5IiBocmVmPSInICsgcHJvdG9jb2wgKyAKICAgICAgICAgICAgaXRlbS5iZWNoMzJpZCArICciPicgKyB0ZXh0ICsgJzwvYT4nCiAgICAgICAgICBsZXQgcm9vdCA9IG51bGwKICAgICAgICAgIGxldCB2ID0gbnVsbAogICAgICAgICAgCiAgICAgICAgICBpZihpdGVtLnVybC5tYXRjaCh2aWRlb2V4dHJlZ2V4KSl7CiAgICAgICAgICAgIHJvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKQogICAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoInZpZGVvLWNvbnRhaW5lciIpCiAgICAgICAgICAgIHJvb3QuaW5uZXJIVE1MID0gY29udGVudGVsZW1lbnRzCiAgICAgICAgICAgIAogICAgICAgICAgICB2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKQogICAgICAgICAgICB2LmNsYXNzTGlzdC5hZGQoInNob3ciKQogICAgICAgICAgICB2WyJkYXRhLWl0ZW0taWQiXSA9IGlkCiAgICAgICAgICAgIHYucHJlbG9hZCA9ICJub25lIgogICAgICAgICAgICB2Lmxvb3AgPSB0cnVlCiAgICAgICAgICAgIHYucGxheXNpbmxpbmUgPSAiIgogICAgICAgICAgICAKICAgICAgICAgICAgdi5vbmNhbnBsYXkgPSBhc3luYyBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICBjb25zdCBhc3BlY3QgPSB0aGlzLnZpZGVvV2lkdGggLyB0aGlzLnZpZGVvSGVpZ2h0CiAgICAgICAgICAgICAgaWYoYXNwZWN0ID4gMSl7CiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlLndpZHRoID0gKGFzcGVjdCAqIDEwMCkgKyAiJSIKICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUuaGVpZ2h0ID0gKDEgLyBhc3BlY3QgKiAxMDApICsgIiUiCiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlLm1hcmdpblRvcCA9IC0oKDEgLyBhc3BlY3QgKiAxMDAgLSAxMDApIC8gMikgKyAiJSIKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgdXBkYXRldmlkZW9wbGF5KHRoaXMucGFyZW50RWxlbWVudCkKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29uc3QgZXh0ID0gaXRlbS51cmwubWF0Y2godmlkZW9leHRyZWdleClbMV0KICAgICAgICAgICAgdi5pbm5lckhUTUwgPSAnPHNvdXJjZSBzcmM9IicgKyBpdGVtLnVybCArICciIHR5cGU9InZpZGVvLycgKyBleHQgKyAnIj48L3NvdXJjZT4nCiAgICAgICAgICAgIAogICAgICAgICAgICByb290LmFwcGVuZCh2KQogICAgICAgICAgfWVsc2UgaWYoaXRlbS51cmwubWF0Y2goaW1nZXh0cmVnZXgpKXsKICAgICAgICAgICAgcm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKQogICAgICAgICAgICByb290LmhyZWYgPSAiIyIKICAgICAgICAgICAgcm9vdC5pbm5lckhUTUwgPSBjb250ZW50ZWxlbWVudHMKICAgICAgICAgICAgICAKICAgICAgICAgICAgaWYodHlwZSA9PSAiaW1hZ2UiKXsKICAgICAgICAgICAgICAvL2xldCBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKQogICAgICAgICAgICAgIC8vaW1nLmFsdCA9IGl0ZW0udXJsCiAgICAgICAgICAgICAgcm9vdFsiZGF0YS1zcmMiXSA9IGl0ZW0udXJsCiAgICAgICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJpbWciKQogICAgICAgICAgICAgIC8vaW1nLmNsYXNzTGlzdC5hZGQoImRhdGEiKQogICAgICAgICAgICAgIC8vcm9vdC5hcHBlbmQoaW1nKQogICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICByb290LmlubmVySFRNTCArPSAnPHNwYW4gY2xhc3M9ImZpbGUiPicgKyBpdGVtLnVybCArICc8L3NwYW4+JwogICAgICAgICAgICB9CiAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHJvb3QuaWQgPSBpZAogICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCd2aXNpYmxlJykKICAgICAgICAgIHJvb3RbImRhdGEtaXRlbSJdID0gaXRlbQogICAgICAgICAgcm9vdFsiZGF0YS1ldmVudCJdID0gaXRlbS5ldmVudAogICAgICAgICAgcm9vdFsiZGF0YS1xdWVyeSJdID0gcQogICAgICAgICAgcm9vdFsiZGF0YS10ZXh0Il0gPSB0ZXh0CiAgICAgICAgICAKICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCh0eXBlKQogICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJpdGVtIikKICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgic2hvdyIpCiAgICAgICAgICAKICAgICAgICAgIGlmKGl0ZW0ucmVhY3RlZCl7CiAgICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHFzKCIjaW1hZ2VzIilbYXBwZW5kICYmICJhcHBlbmQiIHx8ICJwcmVwZW5kIl0ocm9vdCkKICAgICAgICAgIAogICAgICAgICAgaWYodil7CiAgICAgICAgICAgIHVwZGF0ZXZpZGVvcGxheShyb290KQogICAgICAgICAgfQogICAgICAgIH0pCgogICAgICAgIHVwZGF0ZWltYWdlc2xvYWQoKQogICAgICAgIAogICAgICAgIGlmKGFjdGl2ZSgpID09IG51bGwpewogICAgICAgICAgcXMoIiNpbWFnZXMgLml0ZW0iKT8uY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGhpZGVtZWRpYSgpewogICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAic2Nyb2xsIgogICAgICAgIHFzYSgiI21lZGlhLWNvbnRhaW5lciwgI2ltYWdlLCAjbWVkaWEtZm9vdGVyIikuZm9yRWFjaChuID0+IG4uY2xhc3NMaXN0LnJlbW92ZSgidmlzaWJsZSIpKQogICAgICAgIGdpZCgiaW1hZ2UtbGlrZSIpLmNsYXNzTGlzdC5yZW1vdmUoInJlYWN0ZWQiKQogICAgICAgIGhpZGV2aWRlbygpCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGhpZGV2aWRlbygpewogICAgICAgIGNvbnN0IHYgPSBxcygiI21lZGlhLWNvbnRhaW5lciB2aWRlbyIpCiAgICAgICAgCiAgICAgICAgaWYodil7CiAgICAgICAgICB2Lm11dGVkID0gdHJ1ZQogICAgICAgICAgdi5jbGFzc0xpc3QuYWRkKCJzaG93IikKICAgICAgICAgIGdpZCh2WyJkYXRhLWl0ZW0taWQiXSkuYXBwZW5kQ2hpbGQodikKICAgICAgICAgIHVwZGF0ZXZpZGVvcGxheSh2LnBhcmVudEVsZW1lbnQpCiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiB3YWl0cmVzKGtleSwgdHlwZSl7CiAgICAgICAgbGV0IHJlc2hhbmRsZXIgPSBmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpewogICAgICAgICAgdGhpcy50eXBlID0gdHlwZSB8fCAiRU9TRSIKICAgICAgICAgIHRoaXMuZXZlbnRzID0gW10KICAgICAgICAgIHRoaXMuaGFuZGxlID0gZnVuY3Rpb24ocmVzKXsKICAgICAgICAgICAgbGV0IG8gPSBKU09OLnBhcnNlKHJlcy5kYXRhKQogICAgICAgICAgICBpZihrZXkgPT0gbnVsbCB8fCBvWzFdID09IGtleSl7CiAgICAgICAgICAgICAgaWYob1swXSA9PSB0aGlzLnR5cGUpewogICAgICAgICAgICAgICAgcmVzb2x2ZShbdGhpcy5ldmVudHMsIG9dKQogICAgICAgICAgICAgICAgcmVzaGFuZGxlcnMuc3BsaWNlKHJlc2hhbmRsZXJzLmluZGV4T2YodGhpcyksIDEpCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIHRoaXMuZXZlbnRzLnB1c2gob1syXSkKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gewogICAgICAgICAgbGV0IGhhbmRsZXIgPSBuZXcgcmVzaGFuZGxlcihyZXNvbHZlLCByZWplY3QpCiAgICAgICAgICByZXNoYW5kbGVycy5wdXNoKGhhbmRsZXIpCiAgICAgICAgfSkKICAgICAgfQogICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGNoZWNrdXBkYXRlKHNvY2tldCl7CiAgICAgICAgY29uc3QgdXBkYXRlc3JlcyA9IGF3YWl0IHF1ZXJ5ZXZlbnRzKHNvY2tldCwgWzFdLCBudWxsLCBbdXBkYXRlc3B1YmtleV0pCiAgICAgICAgY29uc3QgdXBkYXRlbm90ZSA9IHVwZGF0ZXNyZXMuZmluZChuID0+IG4uY29udGVudC5tYXRjaCgvXmh0dHBzXDpcL1wvLykpCiAgICAgICAgCiAgICAgICAgaWYoIXVwZGF0ZW5vdGUpewogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IGFnZSA9IE1hdGgucm91bmQoKERhdGUubm93KCkgLyAxMDAwIC0gdXBkYXRlbm90ZS5jcmVhdGVkX2F0KSAvIDM2MDAgLyAyNCkKICAgICAgICBjb25zdCBub3RlaWQgPSBiZWNoMzIuZW5jb2RlKCJub3RlIiwgZnJvbUhleFN0cmluZyh1cGRhdGVub3RlLmlkKSkKICAgICAgICBxcygiI3JlbGVhc2UiKS5ocmVmID0gcHJvdG9jb2wgKyBub3RlaWQKICAgICAgICBxcygiI3JlbGVhc2UiKS5pbm5lclRleHQgPSAoYWdlID09IDAgJiYgInRvZGF5IiB8fCBhZ2UgKyAiIGRheShzKSBhZ28iKQogICAgICB9CgogICAgICBmdW5jdGlvbiBzbGVlcChtcyl7CiAgICAgICAgcmV0dXJuIG5ldyBmdW5jdGlvbigpewogICAgICAgICAgbGV0IHRpbWVvdXQgPSBudWxsCiAgICAgICAgICBsZXQgciA9IG51bGwKICAgICAgICAgIAogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcHJvbWlzZTogbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KXsKICAgICAgICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCksIG1zKQogICAgICAgICAgICAgIHIgPSByZXNvbHZlCiAgICAgICAgICAgIH0pLAogICAgICAgICAgICByZXNvbHZlOiBmdW5jdGlvbigpewogICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KQogICAgICAgICAgICAgIHIoKQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBzaG93KGlkKXsKICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiIKICAgICAgICBjb25zdCBpdGVtID0gZ2lkKGlkKVsiZGF0YS1pdGVtIl0KICAgICAgICBjb25zdCBtZWRpYSA9IGdpZCgibWVkaWEtY29udGFpbmVyIikKICAgICAgICBjb25zdCBpbWFnZSA9IGdpZCgiaW1hZ2UiKQoKICAgICAgICBpZihpdGVtLnVybC5tYXRjaCh2aWRlb2V4dHJlZ2V4KSl7CiAgICAgICAgICBpbWFnZS5jbGFzc0xpc3QucmVtb3ZlKCJ2aXNpYmxlIikKICAgICAgICAgIGNvbnN0IHYgPSBnaWQoaWQpLnF1ZXJ5U2VsZWN0b3IoInZpZGVvIikKICAgICAgICAgIHFzKCIjbWVkaWEtY29udGFpbmVyIikuYXBwZW5kQ2hpbGQodikKICAgICAgICAgIHYubXV0ZWQgPSBmYWxzZQogICAgICAgICAgdi5jbGFzc0xpc3QucmVtb3ZlKCJzaG93IikKICAgICAgICAgIHYucGxheSgpCiAgICAgICAgfWVsc2V7CiAgICAgICAgICBpbWFnZS5zcmMgPSBpdGVtLnVybAogICAgICAgICAgaW1hZ2UuY2xhc3NMaXN0LmFkZCgidmlzaWJsZSIpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGl0ZW0ubWV0YSl7CiAgICAgICAgICBjb25zdCBtZXRhY29udGVudCA9IEpTT04ucGFyc2UoaXRlbS5tZXRhLmNvbnRlbnQpCiAgICAgICAgICBjb25zdCBuYW1lID0gbWV0YWNvbnRlbnQuZGlzcGxheV9uYW1lIHx8IG1ldGFjb250ZW50Lm5hbWUKICAgICAgICAgIHFzKCIjaW1hZ2UtdXNlciIpLmNsYXNzTGlzdC5hZGQoInZpc2libGUiKQogICAgICAgICAgcXMoIiNpbWFnZS11c2VyIikuaHJlZiA9IHByb3RvY29sICsgYmVjaDMyLmVuY29kZSgibnB1YiIsIGZyb21IZXhTdHJpbmcoaXRlbS5tZXRhLnB1YmtleSkpCiAgICAgICAgICBxcygiI2ltYWdlLXVzZXIiKS5pbm5lclRleHQgPSBuYW1lCiAgICAgICAgfWVsc2V7CiAgICAgICAgICBxcygiI2ltYWdlLXVzZXIiKS5jbGFzc0xpc3QucmVtb3ZlKCJ2aXNpYmxlIikKICAgICAgICB9CgogICAgICAgIGdpZCgiaW1hZ2UtbGlrZSIpWyJkYXRhLWl0ZW0taWQiXSA9IGlkCiAgICAgICAgZ2lkKCJtZWRpYS1mb290ZXIiKVsiZGF0YS1ldmVudCJdID0gaXRlbS5ldmVudAoKICAgICAgICBpZihpdGVtLnJlYWN0ZWQpewogICAgICAgICAgZ2lkKCJpbWFnZS1saWtlIikuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IGEgPSBxcygiI2ltYWdlLXF1ZXJ5IikKICAgICAgICBhLmhyZWYgPSBwcm90b2NvbCArIGl0ZW0uYmVjaDMyaWQKICAgICAgICBhLmlubmVyVGV4dCA9IGdpZChpZClbImRhdGEtdGV4dCJdCiAgICAgICAgCiAgICAgICAgZ2lkKCJtZWRpYS1jb250YWluZXIiKS5jbGFzc0xpc3QuYWRkKCJ2aXNpYmxlIikKICAgICAgICBnaWQoIm1lZGlhLWZvb3RlciIpLmNsYXNzTGlzdC5hZGQoInZpc2libGUiKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBjb25uY291bnQoKXsKICAgICAgICByZXR1cm4gc29ja2V0cy5maWx0ZXIociA9PiByLnJlYWR5U3RhdGUgPT0gMSkubGVuZ3RoCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGRpc2Nvbm5lY3QoKXsKICAgICAgICBmb3IobGV0IHNvY2tldCBvZiBzb2NrZXRzKXsKICAgICAgICAgIHNvY2tldC5jbG9zZSgpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHNvY2tldHMuc3BsaWNlKDApCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGxvZyhtc2cpewogICAgICAgIGxldCBzY3JvbGwgPSBxcygiI2xvZ3MiKS5zY3JvbGxUb3AgPT0gcXMoIiNsb2dzIikuc2Nyb2xsVG9wTWF4CiAgICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikKICAgICAgICBkaXYuaW5uZXJUZXh0ID0gQXJyYXkuZnJvbShhcmd1bWVudHMpLmpvaW4oIiAiKQogICAgICAgIHFzKCIjbG9ncyIpLmFwcGVuZChkaXYpCiAgICAgICAgCiAgICAgICAgc2Nyb2xsICYmIHFzKCIjbG9ncyIpLnNjcm9sbFRvKDAsIHFzKCIjbG9ncyIpLnNjcm9sbFRvcE1heCkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gY29ubmVjdCh1cmwpewogICAgICAgIGxvZygiY29ubmVjdGluZyIsIHVybCkKICAgICAgICBsZXQgc29ja2V0ID0gbmV3IFdlYlNvY2tldCh1cmwpCiAgICAgICAgCiAgICAgICAgc29ja2V0Lm9ubWVzc2FnZSA9IG1lc3NhZ2UgPT4gcmVzaGFuZGxlcnMuZm9yRWFjaChyaCA9PiByaC5oYW5kbGUobWVzc2FnZSkpCiAgICAgICAgCiAgICAgICAgc29ja2V0Lm9uY2xvc2UgPSBhc3luYyBmdW5jdGlvbigpewogICAgICAgICAgc29ja2V0cy5zcGxpY2Uoc29ja2V0cy5pbmRleE9mKHNvY2tldCksIDEpCiAgICAgICAgICBxcygiI2Nvbm5jb3VudCIpLmlubmVyVGV4dCA9IGNvbm5jb3VudCgpICsgKHByaW1hbHNvY2tldCAmJiAxKQogICAgICAgICAgbG9nKCJkaXNjb25uZWN0ZWQiLCB0aGlzLnVybCwgY29ubmNvdW50KCkpCiAgICAgICAgICBhd2FpdCBzbGVlcCgxMDAwKS5wcm9taXNlCiAgICAgICAgICBjb25uZWN0KHRoaXMudXJsKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBzb2NrZXQub25vcGVuID0gZnVuY3Rpb24oKXsKICAgICAgICAgIHFzKCIjY29ubmNvdW50IikuaW5uZXJUZXh0ID0gY29ubmNvdW50KCkgKyAocHJpbWFsc29ja2V0ICYmIDEpCiAgICAgICAgICBsb2coImNvbm5lY3RlZCIsIHRoaXMudXJsLCBjb25uY291bnQoKSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuIHNvY2tldAogICAgICB9CiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgYXN5bmMgKCkgPT4gewogICAgICAgIHByaW1hbHNvY2tldCA9IGNvbm5lY3QoIndzczovL2NhY2hlMy5wcmltYWwubmV0L2NhY2hlMTciKQogICAgICAgIHByaW1hbHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCJvcGVuIiwgZnVuY3Rpb24oKXsKICAgICAgICAgIHByaW1hbGdsb2JhbCh0aGlzKQogICAgICAgIH0pCiAgICAgICAgCiAgICAgICAgcHJpbWFsc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoImNsb3NlIiwgZnVuY3Rpb24oKXsKICAgICAgICAgIHByaW1hbHNvY2tldCA9IG51bGwKICAgICAgICB9KQogICAgICAgIAogICAgICAgIGZvcihsZXQgdXJsIG9mIHJlbGF5cygpKXsKICAgICAgICAgIGNvbnN0IHNvY2tldCA9IGNvbm5lY3QodXJsKQogICAgICAgICAgc29ja2V0cy5wdXNoKHNvY2tldCkKICAgICAgICAgIAogICAgICAgICAgc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoIm9wZW4iLCBmdW5jdGlvbigpewogICAgICAgICAgICBjaGVja3VwZGF0ZSh0aGlzKQogICAgICAgICAgICBxdWVyeSh0aGlzKQogICAgICAgICAgfSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgYXdhaXQgc2xlZXAoMTAwKS5wcm9taXNlCiAgICAgICAgCiAgICAgICAgaWYoaGFza2V5KCkpewogICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJub3N0ciIpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgZm9yKGxldCBjIG9mIGNvbG9wdHMpewogICAgICAgIGRvY3VtZW50LndyaXRlKCc8c3R5bGU+JyArIGNvbHNjc3MuaW5uZXJUZXh0LnJlcGxhY2UoL1wkXHtjb2xzXH0vZywgYykgKyAnPC9zdHlsZT4nKQogICAgICB9CiAgICA8L3NjcmlwdD4KICA8L2JvZHk+CjwvaHRtbD4K

https://ipfs.io/ipfs/QmNWpmanktaFm3XRsRrcnDM1EByudBSXqeVPr8wpccYUn8

sha256

c69946b06323f65a54be45858dc6991cb8b05d62f6c2a9de41248127397ec527 files.html

base64

PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgdXNlci1zY2FsYWJsZT1ubyIvPgogICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL3N2Z2ljb25zLnNwYXJray5mci9zdmdpY29ucy5jc3MiLz4KICAgIDxzdHlsZT4KICAgICAgKiB7CiAgICAgICAgb3ZlcnNjcm9sbC1iZWhhdmlvci15OiBjb250YWluOwogICAgICB9CiAgICAgIAogICAgICBib2R5IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB3aWR0aDogMTAwdnc7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIGZvbnQtZmFtaWx5OiAiTm90byBTZXJpZiI7CiAgICAgIH0KICAgICAgCiAgICAgIC5wbGFjZWhvbGRlciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICBwYWRkaW5nOiAxZW07CiAgICAgIH0KICAgICAgCiAgICAgIGgxIHsKICAgICAgICBmb250LXNpemU6IDFlbTsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnlkaXNwbGF5LCAKICAgICAgI2hlYWRlciB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgfQogICAgICAKICAgICAgI3JlbGF5cywKICAgICAgI2xvZ3MsIAogICAgICAjcHJpdmtleSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgd2lkdGg6IDE4ZW07CiAgICAgICAgYmFja2dyb3VuZDogIzExMTsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgI3JlbGF5cywKICAgICAgI2xvZ3MgewogICAgICAgIGhlaWdodDogNmVtOwogICAgICB9CiAgICAgIAogICAgICAjbG9ncyB7CiAgICAgICAgaGVpZ2h0OiA4ZW07CiAgICAgICAgb3ZlcmZsb3c6IHNjcm9sbDsKICAgICAgICBmb250LXNpemU6IC44ZW07CiAgICAgIH0KICAgICAgCiAgICAgIHNlbGVjdCB7CiAgICAgICAgd2lkdGg6IDRlbTsKICAgICAgfQogICAgICAKICAgICAgI3JlbGF5cywgCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgYm9yZGVyLXJhZGl1czogLjVlbTsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSAudGV4dCwgCiAgICAgICNoZWFkZXIgYSwKICAgICAgI21lZGlhLWNvbnRhaW5lciB7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgYSwgCiAgICAgIGZvcm0sIAogICAgICAjcXVlcnlkaXNwbGF5IHsKICAgICAgICB6LWluZGV4OiAxOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgICAKICAgICAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAzMGVtKSB7CiAgICAgICAgI2hlYWRlciAudGl0bGUgewogICAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgI3F1ZXJ5ZGlzcGxheSB7CiAgICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIH0KICAgICAgfQoKICAgICAgZm9ybSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnkgewogICAgICAgIHdpZHRoOiA2ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNsb2FkaW5nIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDBweDsKICAgICAgICBsZWZ0OiAyN2VtOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICBhIHsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICAgIH0KCiAgICAgIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAKICAgICAgI21lZGlhLWNvbnRhaW5lciB2aWRlbyB7CiAgICAgICAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsKICAgICAgICBoZWlnaHQ6IDEwMCUgIWltcG9ydGFudDsKICAgICAgICBtYXJnaW4tdG9wOiAwICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgCiAgICAgIC50eXBlIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgei1pbmRleDogMTsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlLXF1ZXJ5IHsKICAgICAgICB3aWR0aDogNWVtOwogICAgICB9CiAgICAgIAogICAgICBhIHsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSwKICAgICAgYS5idXR0b24sCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgY29sb3I6ICM5OTk7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXkgewogICAgICAgIHBhZGRpbmc6IDAgMWVtOwogICAgICB9CgogICAgICAjcXVlcnlkaXNwbGF5IC50ZXh0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgbWluLXdpZHRoOiAzZW07CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgI2hlYWRlciBhLAogICAgICAjaGVhZGVyIHNwYW4gewogICAgICAgIHBhZGRpbmc6IDAuNWVtOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CgogICAgICAjaGVhZGVyIHsKICAgICAgICBwYWRkaW5nOiAwLjQ1ZW0gMDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CgogICAgICAjaGVhZGVyIC5pdGVtcyB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgLml0ZW1zIHsKICAgICAgICBtYXJnaW4tdG9wOiAuM2VtOwogICAgICB9CgogICAgICBwIHsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICB9CiAgICAgIAogICAgICAubGFiZWwgewogICAgICAgIHBhZGRpbmc6IC44ZW0gLjhlbSAuOGVtIDA7CiAgICAgIH0KCiAgICAgICNpbWFnZXMgLnF1ZXJ5IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KCiAgICAgICNtZWRpYS1jb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwKTsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHotaW5kZXg6IDQ7CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZS1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIG1heC13aWR0aDogMTAwdnc7CiAgICAgICAgbWF4LWhlaWdodDogMTAwdmg7CiAgICAgIH0KICAgICAgICAKICAgICAgI2ltYWdlcyB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgI2ltYWdlcyAuaXRlbSB7CiAgICAgICAgd2lkdGg6IDI1dnc7CiAgICAgICAgaGVpZ2h0OiAyNXZ3OwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgLmRpYWxvZyBpbWcgewogICAgICAgIHdpZHRoOiAxNXZ3OwogICAgICB9CiAgICAgIAogICAgICAjbWVkaWEtY29udGFpbmVyIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CiAgICAgIAogICAgICBib2R5Om5vdCgubm9zdHIpICNoZWFkZXIgLmljb25zLCAKICAgICAgLmZpbHRlci1saWtlcyAjaW1hZ2VzID4gLml0ZW06bm90KC5yZWFjdGVkKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNpbWFnZS1xdWVyeSwKICAgICAgI2ltYWdlLXVzZXIgewogICAgICAgIHotaW5kZXg6IDI7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDN2dzsKICAgICAgfQogICAgICAKICAgICAgLnF1ZXJ5LCAKICAgICAgLmxpa2UgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBwYWRkaW5nOiAwIDF2dzsKICAgICAgfQogICAgICAKICAgICAgLnF1ZXJ5LCAKICAgICAgLmxpa2UsIAogICAgICAjaW1hZ2UtcXVlcnksIAogICAgICAudmlkZW9zdmcsCiAgICAgIC5pbWFnZXN2ZyB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjYpOwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNpbWFnZS1xdWVyeSB7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGZvbnQtc2l6ZTogbWluKDMuNXZ3LCAxLjVlbSk7CiAgICAgICAgbWF4LXdpZHRoOiA1ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZS1xdWVyeSB7CiAgICAgICAgcGFkZGluZzogLjZlbSAuNGVtIC4xZW0gLjRlbTsKICAgICAgICBtYXgtd2lkdGg6IDVlbTsKICAgICAgfQogICAgICAKICAgICAgLmxpa2UucmVhY3RlZCwKICAgICAgLmZpbHRlci1saWtlcyAjZmlsdGVyLWxpa2VzIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZWQ7CiAgICAgIH0KCiAgICAgICNpbWFnZS1xdWVyeSwKICAgICAgI2ltYWdlLXVzZXIgewogICAgICAgIGZvbnQtc2l6ZTogM2VtOwogICAgICB9CiAgICAgIAogICAgICAjaW1hZ2UtcXVlcnksCiAgICAgICNpbWFnZS11c2VyLAogICAgICAjbWVkaWEtZm9vdGVyIC5saWtlIHsKICAgICAgICB6LWluZGV4OiA1OwogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlLXF1ZXJ5LAogICAgICAjaW1hZ2UtdXNlciB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgICNpbWFnZS11c2VyIHsKICAgICAgICBib3R0b206IDEuOWVtOwogICAgICAgIGZvbnQtc2l6ZTogMS44ZW07CiAgICAgICAgcGFkZGluZy1yaWdodDogLjY1ZW07CiAgICAgICAgbWF4LXdpZHRoOiA4ZW07CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgIH0KICAgICAgCiAgICAgIC5saWtlIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IGF1dG87CiAgICAgICAgcGFkZGluZzogLjJlbTsKICAgICAgICB3aWR0aDogMWVtOwogICAgICAgIGhlaWdodDogMWVtOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5ub3N0ciAubGlrZSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7ICAKICAgICAgfQoKICAgICAgI21lZGlhLWZvb3RlciAubGlrZSB7CiAgICAgICAgZm9udC1zaXplOiAyLjRlbTsKICAgICAgfQoKICAgICAgI21lZGlhLWZvb3RlciB7CiAgICAgICAgZGlzcGxheTogbm9uZTsgIAogICAgICB9CiAgCiAgICAgICNpbWFnZXMgLmltZyB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIGJhY2tncm91bmQtc2l6ZTogY292ZXI7CiAgICAgICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIC5idXR0b24uYWN0aXZlIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjNDQ0OwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICAjaW1hZ2VzID4gLmFjdGl2ZSB7CiAgICAgICAgb3V0bGluZTogLjNlbSBzb2xpZCBncmVlbjsKICAgICAgICB6LWluZGV4OiAxOwogICAgICB9CgogICAgICAuaGVhcnRzdmcgcGF0aCwKICAgICAgLmhlYWRlci1pY29uIHN2ZyBwYXRoIHsKICAgICAgICBzdHJva2U6ICNmZmY7CiAgICAgIH0KICAKICAgICAgLnZpZGVvc3ZnLAogICAgICAuaW1hZ2VzdmcgewogICAgICAgIHdpZHRoOiBjYWxjKG1pbig0dncsIDJlbSkpOwogICAgICAgIGhlaWdodDogY2FsYyhtaW4oNHZ3LCAyZW0pKTsKICAgICAgICBwYWRkaW5nOiAwIC4yZW07CiAgICAgIH0KICAgICAgCiAgICAgIC52aWRlb3N2ZyBwYXRoLAogICAgICAuaW1hZ2VzdmcgcGF0aCB7CiAgICAgICAgZmlsbDogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgYSNtZW51LCAKICAgICAgLmhlYWRlci1pY29uIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBtYXJnaW4tdG9wOiAtLjNlbTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICB9CgogICAgICAuaWNvbnMgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICByaWdodDogMDsKICAgICAgICB6LWluZGV4OiAyOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgIH0KICAgICAgCiAgICAgIGEjbWVudSB7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgcGFkZGluZzogMCAuNWVtOwogICAgICAgIGhlaWdodDogMi4xZW07CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgLmhlYWRlci1pY29uIHsKICAgICAgICBwYWRkaW5nOiAuMmVtOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICB3aWR0aDogMS41ZW07CiAgICAgICAgaGVpZ2h0OiAxLjVlbTsKICAgICAgICBtYXJnaW46IC4xZW0gLjVlbTsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgIH0KICAgICAgCiAgICAgIC5oZWFkZXItaWNvbiBzdmcgewogICAgICAgIHdpZHRoOiAxLjVlbTsKICAgICAgICBoZWlnaHQ6IDEuNWVtOwogICAgICB9CiAgICAgICAKICAgICAgLm1lbnVzdmcgewogICAgICAgIHdpZHRoOiAyZW07CiAgICAgICAgaGVpZ2h0OiAyZW07CiAgICAgIH0KCiAgICAgIC5tZW51c3ZnIHBhdGggewogICAgICAgIGZpbGw6ICNmZmY7CiAgICAgIH0KCiAgICAgICNtZW51LWNvbnRlbnQgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgICB3aWR0aDogMThlbTsKICAgICAgICBtYXJnaW4tbGVmdDogLTE4ZW07CiAgICAgICAgYmFja2dyb3VuZDogIzIyMjsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgei1pbmRleDogMzsgCiAgICAgICAgb3ZlcmZsb3c6IHNjcm9sbDsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudC52aXNpYmxlIHsKICAgICAgICBtYXJnaW4tbGVmdDogMDsKICAgICAgfQogICAgICAKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgewogICAgICAgIHBhZGRpbmc6IDFlbTsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgYS5idXR0b24sCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgcGFkZGluZzogLjVlbSAuN2VtOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgICB9CgogICAgICAjb3ZlcmxheSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICB6LWluZGV4OiAzOwogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICBvcGFjaXR5OiAuNTsKICAgICAgfQoKICAgICAgLnZpc2libGUgewogICAgICAgIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgCiAgICAgICNzaGFyZS1kaWFsb2cgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHdpZHRoOiBjYWxjKDEwMHZ3IC0gNmVtKTsKICAgICAgICBoZWlnaHQ6IDcwJTsKICAgICAgICBiYWNrZ3JvdW5kOiAjZmZmOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDFlbTsKICAgICAgICB6LWluZGV4OiA0OwogICAgICAgIG1hcmdpbi1sZWZ0OiAyZW07CiAgICAgICAgbWFyZ2luLXRvcDogMmVtOwogICAgICAgIHBhZGRpbmc6IDFlbTsKICAgICAgfQogICAgICAKICAgICAgaDIgewogICAgICAgIG1hcmdpbi10b3A6IDA7CiAgICAgIH0KICAgICAgCiAgICAgIHN2ZyB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgICN0ZW1wbGF0ZSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8ZGl2IGlkPSJ0ZW1wbGF0ZSI+CiAgICAgIDxzdmcgY2xhc3M9ImhlYXJ0c3ZnIHN2Zy1pY29uIiB2aWV3Qm94PSIwIDAgMjAgMjAiPgogICAgICAgIDxwYXRoIGQ9Ik05LjcxOSwxNy4wNzNsLTYuNTYyLTYuNTFjLTAuMjctMC4yNjgtMC41MDQtMC41NjctMC42OTYtMC44ODhDMS4zODUsNy44OSwxLjY3LDUuNjEzLDMuMTU1LDQuMTRjMC44NjQtMC44NTYsMi4wMTItMS4zMjksMy4yMzMtMS4zMjljMS45MjQsMCwzLjExNSwxLjEyLDMuNjEyLDEuNzUyYzAuNDk5LTAuNjM0LDEuNjg5LTEuNzUyLDMuNjEyLTEuNzUyYzEuMjIxLDAsMi4zNjksMC40NzIsMy4yMzMsMS4zMjljMS40ODQsMS40NzMsMS43NzEsMy43NSwwLjY5Myw1LjUzN2MtMC4xOSwwLjMyLTAuNDI1LDAuNjE4LTAuNjk1LDAuODg3bC02LjU2Miw2LjUxQzEwLjEyNSwxNy4yMjksOS44NzUsMTcuMjI5LDkuNzE5LDE3LjA3MyBNNi4zODgsMy42MUM1LjM3OSwzLjYxLDQuNDMxLDQsMy43MTcsNC43MDdDMi40OTUsNS45MiwyLjI1OSw3Ljc5NCwzLjE0NSw5LjI2NWMwLjE1OCwwLjI2NSwwLjM1MSwwLjUxLDAuNTc0LDAuNzMxTDEwLDE2LjIyOGw2LjI4MS02LjIzMmMwLjIyNC0wLjIyMSwwLjQxNi0wLjQ2NiwwLjU3My0wLjcyOWMwLjg4Ny0xLjQ3MiwwLjY1MS0zLjM0Ni0wLjU3MS00LjU2QzE1LjU3LDQsMTQuNjIxLDMuNjEsMTMuNjEyLDMuNjFjLTEuNDMsMC0yLjYzOSwwLjc4Ni0zLjI2OCwxLjg2M2MtMC4xNTQsMC4yNjQtMC41MzYsMC4yNjQtMC42OSwwQzkuMDI5LDQuMzk3LDcuODIsMy42MSw2LjM4OCwzLjYxIj48L3BhdGg+CiAgICAgIDwvc3ZnPgogICAgICA8c3ZnIGNsYXNzPSJ2aWRlb3N2ZyBzdmctaWNvbiIgdmlld0JveD0iMCAwIDIwIDIwIj4KCQkJCTxwYXRoIGQ9Ik0xOC4xNzUsNC4xNDJIMS45NTFDMS43MDMsNC4xNDIsMS41LDQuMzQ0LDEuNSw0LjU5MnYxMC44MTZjMCwwLjI0NywwLjIwMywwLjQ1LDAuNDUxLDAuNDVoMTYuMjI0YzAuMjQ3LDAsMC40NS0wLjIwMywwLjQ1LTAuNDVWNC41OTJDMTguNjI1LDQuMzQ0LDE4LjQyMiw0LjE0MiwxOC4xNzUsNC4xNDIgTTQuNjU1LDE0Ljk1N0gyLjQwMXYtMS44MDNoMi4yNTNWMTQuOTU3ek00LjY1NSwxMi4yNTRIMi40MDF2LTEuODAzaDIuMjUzVjEyLjI1NHogTTQuNjU1LDkuNTQ5SDIuNDAxVjcuNzQ3aDIuMjUzVjkuNTQ5eiBNNC42NTUsNi44NDZIMi40MDFWNS4wNDNoMi4yNTNWNi44NDZ6TTE0LjU2OSwxNC45NTdINS41NTZWNS4wNDNoOS4wMTNWMTQuOTU3eiBNMTcuNzI0LDE0Ljk1N2gtMi4yNTN2LTEuODAzaDIuMjUzVjE0Ljk1N3ogTTE3LjcyNCwxMi4yNTRoLTIuMjUzdi0xLjgwM2gyLjI1M1YxMi4yNTR6TTE3LjcyNCw5LjU0OWgtMi4yNTNWNy43NDdoMi4yNTNWOS41NDl6IE0xNy43MjQsNi44NDZoLTIuMjUzVjUuMDQzaDIuMjUzVjYuODQ2eiI+PC9wYXRoPgoJCQk8L3N2Zz4KCQkJPHN2ZyBjbGFzcz0iaW1hZ2Vzdmcgc3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CgkJCQk8cGF0aCBkPSJNMTguNTU1LDE1LjM1NFY0LjU5MmMwLTAuMjQ4LTAuMjAyLTAuNDUxLTAuNDUtMC40NTFIMS44ODhjLTAuMjQ4LDAtMC40NTEsMC4yMDMtMC40NTEsMC40NTF2MTAuODA4YzAsMC41NTksMC43NTEsMC40NTEsMC40NTEsMC40NTFoMTYuMjE3aDAuMDA1QzE4Ljc5MywxNS44NTEsMTguNDc4LDE0LjgxNCwxOC41NTUsMTUuMzU0IE0yLjgsMTQuOTQ5bDQuOTQ0LTYuNDY0bDQuMTQ0LDUuNDE5YzAuMDAzLDAuMDAzLDAuMDAzLDAuMDAzLDAuMDAzLDAuMDA1bDAuNzk3LDEuMDRIMi44eiBNMTMuODIyLDE0Ljk0OWwtMS4wMDYtMS4zMTdsMS42ODktMi4yMThsMi42ODgsMy41MzVIMTMuODIyeiBNMTcuNjU0LDE0LjA2NGwtMi43OTEtMy42NjZjLTAuMTgxLTAuMjM3LTAuNTM1LTAuMjM3LTAuNzE2LDBsLTEuODk5LDIuNDkzbC00LjE0Ni01LjQyYy0wLjE4LTAuMjM3LTAuNTM2LTAuMjM3LTAuNzE2LDBsLTUuMDQ3LDYuNTk4VjUuMDQyaDE1LjMxNlYxNC4wNjR6IE0xMi40NzQsNi4zOTNjLTAuODY5LDAtMS41NzcsMC43MDctMS41NzcsMS41NzZzMC43MDgsMS41NzYsMS41NzcsMS41NzZzMS41NzctMC43MDcsMS41NzctMS41NzZTMTMuMzQzLDYuMzkzLDEyLjQ3NCw2LjM5MyBNMTIuNDc0LDguNjQ1Yy0wLjM3MSwwLTAuNjc2LTAuMzA0LTAuNjc2LTAuNjc2czAuMzA1LTAuNjc2LDAuNjc2LTAuNjc2YzAuMzcyLDAsMC42NzYsMC4zMDQsMC42NzYsMC42NzZTMTIuODQ2LDguNjQ1LDEyLjQ3NCw4LjY0NSI+PC9wYXRoPgoJCQk8L3N2Zz4KICAgICAgPGRpdiBpZD0iY29sc2NzcyI+CiAgICAgIC5jb2xzJHtjb2xzfSAjaW1hZ2VzIC5pdGVtIHsKICAgICAgICB3aWR0aDogY2FsYygxMDB2dyAvICR7Y29sc30pOwogICAgICB9CgogICAgICAuY29scyR7Y29sc30gI2ltYWdlcyAuaXRlbSB7CiAgICAgICAgaGVpZ2h0OiBjYWxjKDEwMHZ3IC8gJHtjb2xzfSk7CiAgICAgIH0KICAgICAgCiAgICAgIC5jb2xzJHtjb2xzfSAucXVlcnksCiAgICAgIC5jb2xzJHtjb2xzfSAubGlrZSB7CiAgICAgICAgZm9udC1zaXplOiBtaW4oMTR2dyAqICgxIC8gJHtjb2xzfSksIDZlbSAqICgxIC8gJHtjb2xzfSkpCiAgICAgIH0KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9InNoYXJlLWRpYWxvZyIgY2xhc3M9ImRpYWxvZyI+CiAgICAgIDxoMj5zaGFyZTwvaDI+CiAgICAgIDxmb3JtIGlkPSJzaGFyZS1mb3JtIiBhY3Rpb249IiMiPgogICAgICAgIDxwIGNsYXNzPSJjb250ZW50Ij48L3A+CiAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgY2xhc3M9InN1Ym1pdCIgdmFsdWU9Im9rIi8+CiAgICAgIDwvZm9ybT4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0ibWVkaWEtZm9vdGVyIj4KICAgICAgPGEgaWQ9ImltYWdlLWxpa2UiIGNsYXNzPSJsaWtlIiBocmVmPSIjIj48L2E+CiAgICAgIDxhIGlkPSJpbWFnZS1xdWVyeSIgaHJlZj0iIyI+PC9hPgogICAgICA8YSBpZD0iaW1hZ2UtdXNlciIgaHJlZj0iIyI+PC9hPgogICAgPC9kaXY+CiAgICA8Y2VudGVyIGlkPSJtZWRpYS1jb250YWluZXIiPgogICAgICA8ZGl2IGlkPSJpbWFnZS1jb250YWluZXIiPgogICAgICAgIDxpbWcgaWQ9ImltYWdlIi8+CiAgICAgIDwvZGl2PgogICAgPC9jZW50ZXI+CiAgICA8ZGl2IGlkPSJvdmVybGF5IiBjbGFzcz0iZGlhbG9nIj48L2Rpdj4KICAgIDxkaXYgaWQ9Im1lbnUtY29udGVudCIgY2xhc3M9ImRpYWxvZyI+CiAgICAgIDxkaXYgY2xhc3M9Iml0ZW1zIj4KICAgICAgICA8aDE+PGEgY2xhc3M9InRpdGxlIiBocmVmPSIjIj5maWxlcy5odG1sPC9hPjwvaDE+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmF1dG9wbGF5PC9kaXY+CiAgICAgICAgPGEgY2xhc3M9ImJ1dHRvbiBzZXRhdXRvcGxheSIgZGF0YS1hdXRvcGxheT0ib24iIGhyZWY9IiMiPm9uPC9hPgogICAgICAgIDxhIGNsYXNzPSJidXR0b24gc2V0YXV0b3BsYXkiIGRhdGEtYXV0b3BsYXk9Im9mZiIgaHJlZj0iIyI+b2ZmPC9hPgogICAgICAgIDxhIGNsYXNzPSJidXR0b24gc2V0YXV0b3BsYXkiIGRhdGEtYXV0b3BsYXk9ImhvdmVyIiBocmVmPSIjIj5tb3VzZW92ZXI8L2E+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmNvbHVtbnM8L2Rpdj4KICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIHNldGNvbHMiIGRhdGEtY29scz0iMSIgaHJlZj0iIyI+MTwvYT4KICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIHNldGNvbHMiIGRhdGEtY29scz0iMiIgaHJlZj0iIyI+MjwvYT4KICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIHNldGNvbHMiIGRhdGEtY29scz0iNCIgaHJlZj0iIyI+NDwvYT4KICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIHNldGNvbHMiIGRhdGEtY29scz0iNiIgaHJlZj0iIyI+NjwvYT4KICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIHNldGNvbHMiIGRhdGEtY29scz0iMTAiIGhyZWY9IiMiPjEwPC9hPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5jb25uZWN0aW9uczwvZGl2PgogICAgICAgIDxkaXYgaWQ9ImNvbm5jb3VudCI+MDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5yZWxheXM6PC9kaXY+CiAgICAgICAgPHA+UGxlYXNlIHVzZSByZWxheXMgd2l0aCBOSVAtNTAgKHNlYXJjaCkgZnVuY3Rpb25hbGl0eTwvcD4KICAgICAgICA8Zm9ybSBhY3Rpb249IiMiIGlkPSJyZWxheXMtZm9ybSI+CiAgICAgICAgICA8dGV4dGFyZWEgaWQ9InJlbGF5cyI+PC90ZXh0YXJlYT4KICAgICAgICAgIDxpbnB1dCBjbGFzcz0ic3VibWl0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJzYXZlIHJlbGF5cyIvPgogICAgICAgIDwvZm9ybT4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+cHJpdmF0ZSBrZXk6PC9kaXY+CiAgICAgICAgPHA+SWYgeW91IGNhbnQgdXNlIGJyb3dzZXIgYWRkb24gKG1vYmlsZSk8L3A+CiAgICAgICAgPGZvcm0gYWN0aW9uPSIjIiBpZD0icHJpdmtleS1mb3JtIj4KICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0icHJpdmtleSIvPgogICAgICAgICAgPGlucHV0IGNsYXNzPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9InNhdmUga2V5Ii8+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5sb2dzPC9kaXY+CiAgICAgICAgPGRpdiBpZD0ibG9ncyI+PC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmxhdGVzdCByZWxlYXNlOjwvZGl2PgogICAgICAgIDxhIGNsYXNzPSJidXR0b24iIGlkPSJyZWxlYXNlIiBocmVmPSIjIj48L2E+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJoZWFkZXIiPgogICAgICA8ZGl2IGNsYXNzPSJpY29ucyI+CiAgICAgICAgPGEgaWQ9ImZpbHRlci1saWtlcyIgaHJlZj0iIyIgY2xhc3M9ImhlYWRlci1pY29uIj48L2E+CiAgICAgICAgPGEgaWQ9InNoYXJlIiBocmVmPSIjIiBjbGFzcz0iaGVhZGVyLWljb24iPgogICAgICAgICAgPHN2ZyBjbGFzcz0ic3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CgkJCQkgICAgPHBhdGggZD0iTTE0LjY4LDEyLjYyMWMtMC45LDAtMS43MDIsMC40My0yLjIxNiwxLjA5bC00LjU0OS0yLjYzN2MwLjI4NC0wLjY5MSwwLjI4NC0xLjQ1NywwLTIuMTQ2bDQuNTQ5LTIuNjM4YzAuNTE0LDAuNjYxLDEuMzE1LDEuMDksMi4yMTYsMS4wOWMxLjU0OSwwLDIuODA5LTEuMjYsMi44MDktMi44MDhjMC0xLjU0OC0xLjI2LTIuODA5LTIuODA5LTIuODA5Yy0xLjU0OCwwLTIuODA4LDEuMjYtMi44MDgsMi44MDljMCwwLjM4LDAuMDc2LDAuNzQxLDAuMjE0LDEuMDczbC00LjU1LDIuNjM4Yy0wLjUxNS0wLjY2MS0xLjMxNi0xLjA5LTIuMjE3LTEuMDljLTEuNTQ4LDAtMi44MDgsMS4yNi0yLjgwOCwyLjgwOXMxLjI2LDIuODA4LDIuODA4LDIuODA4YzAuOSwwLDEuNzAyLTAuNDMsMi4yMTctMS4wOWw0LjU1LDIuNjM3Yy0wLjEzOCwwLjMzMi0wLjIxNCwwLjY5My0wLjIxNCwxLjA3NGMwLDEuNTQ5LDEuMjYsMi44MDksMi44MDgsMi44MDljMS41NDksMCwyLjgwOS0xLjI2LDIuODA5LTIuODA5UzE2LjIyOSwxMi42MjEsMTQuNjgsMTIuNjIxTTE0LjY4LDIuNTEyYzEuMTM2LDAsMi4wNiwwLjkyMywyLjA2LDIuMDZTMTUuODE1LDYuNjMsMTQuNjgsNi42M3MtMi4wNTktMC45MjMtMi4wNTktMi4wNTlTMTMuNTQ0LDIuNTEyLDE0LjY4LDIuNTEyTTUuMzE5LDEyLjA2MWMtMS4xMzYsMC0yLjA2LTAuOTI0LTIuMDYtMi4wNnMwLjkyMy0yLjA1OSwyLjA2LTIuMDU5YzEuMTM1LDAsMi4wNiwwLjkyMywyLjA2LDIuMDU5UzYuNDU0LDEyLjA2MSw1LjMxOSwxMi4wNjFNMTQuNjgsMTcuNDg4Yy0xLjEzNiwwLTIuMDU5LTAuOTIyLTIuMDU5LTIuMDU5czAuOTIzLTIuMDYxLDIuMDU5LTIuMDYxczIuMDYsMC45MjQsMi4wNiwyLjA2MVMxNS44MTUsMTcuNDg4LDE0LjY4LDE3LjQ4OCI+PC9wYXRoPgoJCQkgICAgPC9zdmc+CgkJCSAgPC9hPgoJCQk8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iaXRlbXMiPgogICAgICAgIDxhIGNsYXNzPSJ0aXRsZSIgaHJlZj0iIyI+ZmlsZXMuaHRtbDwvYT4KICAgICAgICA8YSBpZD0ibWVudSIgaHJlZj0iIyI+CiAgICAgICAgICA8c3ZnIGNsYXNzPSJtZW51c3ZnIHN2Zy1pY29uIiB2aWV3Qm94PSIwIDAgMjAgMjAiPgoJCSAgICAgICAgPHBhdGggZD0iTTEwLDEuNDQ1Yy00LjcyNiwwLTguNTU1LDMuODI5LTguNTU1LDguNTU1YzAsNC43MjUsMy44MjksOC41NTUsOC41NTUsOC41NTVjNC43MjUsMCw4LjU1NS0zLjgzLDguNTU1LTguNTU1QzE4LjU1NSw1LjI3NCwxNC43MjUsMS40NDUsMTAsMS40NDUgTTEwLDE3LjY1NGMtNC4yMjEsMC03LjY1NC0zLjQzNC03LjY1NC03LjY1NGMwLTQuMjIxLDMuNDMzLTcuNjU0LDcuNjU0LTcuNjU0YzQuMjIyLDAsNy42NTQsMy40MzMsNy42NTQsNy42NTRDMTcuNjU0LDE0LjIyMSwxNC4yMjIsMTcuNjU0LDEwLDE3LjY1NCBNMTQuMzksMTBjMCwwLjI0OC0wLjIwMywwLjQ1LTAuNDUsMC40NUg2LjA2Yy0wLjI0OCwwLTAuNDUtMC4yMDMtMC40NS0wLjQ1czAuMjAzLTAuNDUsMC40NS0wLjQ1aDcuODc5QzE0LjE4Nyw5LjU1LDE0LjM5LDkuNzUyLDE0LjM5LDEwIE0xNC4zOSwxMi43MDJjMCwwLjI0Ny0wLjIwMywwLjQ0OS0wLjQ1LDAuNDQ5SDYuMDZjLTAuMjQ4LDAtMC40NS0wLjIwMi0wLjQ1LTAuNDQ5YzAtMC4yNDgsMC4yMDMtMC40NTEsMC40NS0wLjQ1MWg3Ljg3OUMxNC4xODcsMTIuMjUxLDE0LjM5LDEyLjQ1NCwxNC4zOSwxMi43MDIgTTE0LjM5LDcuMjk4YzAsMC4yNDgtMC4yMDMsMC40NS0wLjQ1LDAuNDVINi4wNmMtMC4yNDgsMC0wLjQ1LTAuMjAzLTAuNDUtMC40NXMwLjIwMy0wLjQ1LDAuNDUtMC40NWg3Ljg3OUMxNC4xODcsNi44NDgsMTQuMzksNy4wNTEsMTQuMzksNy4yOTgiPjwvcGF0aD4KCSAgICAgICAgPC9zdmc+CiAgICAgICAgPC9hPgogICAgICAgIDxmb3JtIGlkPSJxdWVyeS1mb3JtIiBhY3Rpb249IiMiPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJxdWVyeSIgbmFtZT0icXVlcnkiIGlkPSIiIC8+CiAgICAgICAgICA8c2VsZWN0IGlkPSJxdWVyeS10eXBlIj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iYWxsIj5hbGw8L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaW1hZ2UiPmltYWdlczwvb3B0aW9uPgogICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJ2aWRlbyI+dmlkZW9zPC9vcHRpb24+CiAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgIDxpbnB1dCBpZD0iZ28iIHR5cGU9InN1Ym1pdCIgdmFsdWU9ImdvIi8+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxzcGFuIGlkPSJxdWVyeWRpc3BsYXkiPgogICAgICAgICAgPHNwYW4gY2xhc3M9InRleHQiPjwvc3Bhbj4KICAgICAgICA8L3NwYW4+CiAgICAgICAgPGRpdiBpZD0ibG9hZGluZyI+dXBkYXRpbmc8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9InBsYWNlaG9sZGVyIj5Tb21ldGhpbmcgc2hvdWxkIGxvYWQgc29vbiwgbWF5YmUuPC9kaXY+CiAgICA8ZGl2IGlkPSJpbWFnZXMiPjwvZGl2PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vdW5wa2cuY29tL25vc3RyLXRvb2xzL2xpYi9ub3N0ci5idW5kbGUuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vc2xvd2xpLmdpdGh1Yi5pby9iZWNoMzItYnVmZmVyL2Fzc2V0cy9qcy9iZWNoMzItYnVmZmVyLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0PgogICAgICBjb25zdCB1cGRhdGVzcHVia2V5ID0gImFlNWM2ZTBiNzQ2NjBkMjE5NGM4MjU0YjVjMmM4MjU2NzY1NzZiZTAyOTczNzlmYTIwNTIzMTE0YTZhODVlODciCiAgICAgIGNvbnN0IHF1ZXJpZXMgPSB7IAogICAgICAgICJhdXRob3IiOiAnWyJSRVEiLCI8ST4iLHsia2luZHMiOlsxXSwiYXV0aG9ycyI6WyI8UD4iXX1dJwogICAgICB9CiAgICAgIHFzKCIjcmVsYXlzIikudmFsdWUgPSByZWxheXMoKS5qb2luKCJcbiIpCiAgICAgIHFzKCIjcHJpdmtleSIpLnZhbHVlID0gcHJpdmtleSgpCiAgICAgIGNvbnN0IGNvbG9wdHMgPSBbMSwgMiwgNCwgNiwgMTBdCgogICAgICBjb2xzID0gKCkgPT4gcGFyc2VJbnQoc2V0dGluZygiY29scyIsIGNvbG9wdHNbMl0pLCAxMCkKICAgICAgYXV0b3BsYXkgPSAoKSA9PiBzZXR0aW5nKCJhdXRvcGxheSIsICJvZmYiKQogICAgICBsaW1pdCA9ICgpID0+IHBhcnNlSW50KHNldHRpbmcoImxpbWl0IiwgMTUpLCAxMCkKICAgICAgZ2FsbGVyeSA9ICgpID0+IHsKICAgICAgICBsZXQgZ2FsbGVyeW1hdGNoZXIgPSBsb2NhdGlvbi5zZWFyY2gubWF0Y2goL2dhbGxlcnk9KFthLXowLTldKykvKQogICAgICAgIHJldHVybiBnYWxsZXJ5bWF0Y2hlciAmJiBnYWxsZXJ5bWF0Y2hlclsxXQogICAgICB9CiAgICAgIAogICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoImNvbHMiICsgY29scygpKQoKICAgICAgbGV0IHByb3RvY29sID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlLykgPyAibm9zdHI6IiA6ICJ3ZWIrbm9zdHI6IgogICAgICBsZXQgc29ja2V0cyA9IFtdCiAgICAgIGxldCByZXNoYW5kbGVycyA9IFtdCiAgICAgIGxldCB1cmxzID0gW10KICAgICAgbGV0IGxpa2VzID0gW10KICAgICAgbGV0IG5ld2xpa2VzID0gW10KICAgICAgbGV0IGlkY291bnRlciA9IDAKICAgICAgbGV0IHF1ZXJ5d2FpdCA9IG51bGwKICAgICAgbGV0IHByaW1hbHNvY2tldCA9IG51bGwKICAgICAgbGV0IHR5cGVzID0gewogICAgICAgIGltYWdlOiBbInBuZyIsICJqcGciLCAianBlZyIsICJ3ZWJwIl0sCiAgICAgICAgdmlkZW86IFsibXA0IiwgIndlYm0iXQogICAgICB9CiAgICAgIGxldCBpbWdyZWdleCA9IC9odHRwKHxzKVw6XC9cL1teIFxuXSo/XC4ocG5nfGpwZ3xqcGVnfHdlYnApL2dpCiAgICAgIGxldCB2aWRlb3JlZ2V4ID0gL2h0dHAofHMpXDpcL1wvW14gXG5dKj9cLihtcDR8d2VibSkvZ2kKICAgICAgbGV0IHZpZGVvZXh0cmVnZXggPSAvXC4obXA0fHdlYm0pJC9pCiAgICAgIGxldCBpbWdleHRyZWdleCA9IC9cLihwbmd8anBnfGpwZWd8d2VicCkkL2kKICAgICAgd2FpdG1zID0gNTAwMDAKICAgICAgcXVlcnlzdHIgPSAiIgogICAgICBsZXQgcXVlcnljb3VudCA9IDAKICAgICAgbGV0IGhvdmVyZWR2aWRlbyA9IG51bGwKICAgICAgCiAgICAgIHVwZGF0ZXF1ZXJ5KCkKICAgICAgcXMoIiNpbWFnZS1saWtlIikuaW5uZXJIVE1MID0gcXMoIiNmaWx0ZXItbGlrZXMiKS5pbm5lckhUTUwgPSBxcygiI3RlbXBsYXRlIC5oZWFydHN2ZyIpLm91dGVySFRNTAogICAgICBzZXRhY3RpdmUoInNldGNvbHMiLCAiY29scyIsIGNvbHMoKSkKICAgICAgc2V0YWN0aXZlKCJzZXRhdXRvcGxheSIsICJhdXRvcGxheSIsIGF1dG9wbGF5KCkpCiAgICAgIAogICAgICBmdW5jdGlvbiBmcm9tSGV4U3RyaW5nKHN0cil7CiAgICAgICAgbGV0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHN0ci5sZW5ndGggLyAyKQogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnVmZmVyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBidWZmZXJbaV0gPSBwYXJzZUludChzdHIuc3Vic3RyKDIgKiBpLCAyKSwgMTYpCiAgICAgICAgfQogICAgICAgIHJldHVybiBidWZmZXIKICAgICAgfQogIAogICAgICBmdW5jdGlvbiByZWxheXMoKXsKICAgICAgICBjb25zdCBvYmogPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJyZWxheXMiKSkKICAgICAgICBjb25zdCByID0gb2JqICYmIG9iai5maWx0ZXIociA9PiByLm1hdGNoKC93c3M6XC9cLy4rLykpIHx8IFtdCiAgICAgICAgCiAgICAgICAgcmV0dXJuIHIubGVuZ3RoID4gMCAmJiByIHx8IFsKICAgICAgICAgICJ3c3M6Ly9yZWxheS5ub3N0ci5iYW5kIiwKICAgICAgICAgICJ3c3M6Ly9uYi5yZWxheS5jZW50ZXIiLCAKICAgICAgICAgICJ3c3M6Ly9ub3N0ci5jb21waWxlLWVycm9yLm5ldCIKICAgICAgICBdCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHByaXZrZXkoKXsKICAgICAgICBsZXQga2V5ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oInByaXZrZXkiKSB8fCAiIgogICAgICAgIAogICAgICAgIGlmKGtleS5sZW5ndGggPT0gNjMpewogICAgICAgICAga2V5ID0gTm9zdHJUb29scy5uaXAxOS5kZWNvZGUoa2V5KS5kYXRhCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybiBrZXkubGVuZ3RoID09IDY0ICYmIGtleSB8fCBudWxsCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHNldHRpbmcoa2V5LCBkZWZhdWx0dmFsdWUpewogICAgICAgIGNvbnN0IHYgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpCiAgICAgICAgcmV0dXJuIHYgJiYgb3B0aW9uKCJzZXQiICsga2V5LCBrZXksIHYpICYmIHYgfHwgZGVmYXVsdHZhbHVlCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIG9wdGlvbihjLCBrZXksIHZhbCl7CiAgICAgICAgcmV0dXJuIHFzKCIuIiArIGMgKyAiW2RhdGEtIiArIGtleSArICI9JyIgKyB2YWwgKyAiJ10iKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxcyhxKXsKICAgICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihxKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxc2EocSl7CiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChxKSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gZ2lkKGkpewogICAgICAgIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxdWVyeXR5cGUoKXsKICAgICAgICByZXR1cm4gcXMoIiNxdWVyeS10eXBlIikudmFsdWUgfHwgImFsbCIKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gdXBkYXRlcXVlcnkoKXsKICAgICAgICBsZXQgcGFydHMgPSAoZ2FsbGVyeSgpICYmICgiZzoiICsgZ2FsbGVyeSgpKSB8fCBkZWNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaGFzaC5zdWJzdHJpbmcoMSkpKS5zcGxpdCgiLyIpCiAgICAgICAgcXMoIiNxdWVyeWRpc3BsYXkgLnRleHQiKS5pbm5lclRleHQgPSBwYXJ0c1swXS5zdWJzdHJpbmcoMCwgMjApCiAgICAgICAgcXVlcnlzdHIgPSBwYXJ0c1swXQogICAgICAgIHFzKCIjcXVlcnkiKS52YWx1ZSA9IHBhcnRzWzBdCiAgICAgICAgcXMoIiNxdWVyeS10eXBlIikudmFsdWUgPSBwYXJ0c1sxXSB8fCAiYWxsIgogICAgICB9CgogICAgICBmdW5jdGlvbiBhY3RpdmUoKXsKICAgICAgICByZXR1cm4gcXMoIiNpbWFnZXMgLmFjdGl2ZSIpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGltYWdlb2Zmc2V0KG9mZnNldCl7CiAgICAgICAgY29uc3QgaW1hZ2VzID0gcXNhKCIjaW1hZ2VzID4gLml0ZW0iKS5maWx0ZXIoZSA9PiBlLmNsYXNzTGlzdC5jb250YWlucygidmlzaWJsZSIpKQogICAgICAgIHJldHVybiBpbWFnZXNbaW1hZ2VzLmluZGV4T2YoYWN0aXZlKCkpK29mZnNldF0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gbGFzdGFjdGl2ZSgpewogICAgICAgIHJldHVybiBxc2EoIiNpbWFnZXMgLmFjdGl2ZSIpLnBvcCgpICAgICAgCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIG1lbnUoKXsKICAgICAgICBxc2EoIiNtZW51LWNvbnRlbnQsICNvdmVybGF5IikuZm9yRWFjaChuID0+IG4uY2xhc3NMaXN0LnRvZ2dsZSgidmlzaWJsZSIpKQogICAgICB9CiAgCiAgICAgIGZ1bmN0aW9uIHNldGFjdGl2ZShjLCBrZXksIHZhbCl7CiAgICAgICAgcXNhKCIuIiArIGMpLmZvckVhY2gobiA9PiBuLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpKQogICAgICAgIGNvbnN0IG9wdGlvbiA9IHFzKCIuIiArIGMgKyAiW2RhdGEtIiArIGtleSArICI9JyIgKyB2YWwgKyAiJ10iKQogICAgICAgIG9wdGlvbj8uY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gc2Nyb2xsdmlzaWJsZShuLCBvZmZzZXQpewogICAgICAgIG9mZnNldCA9IG9mZnNldCB8fCAwCiAgICAgICAgcmV0dXJuIChuLm9mZnNldFRvcCArIG4ub2Zmc2V0SGVpZ2h0KSA+PSAoc2Nyb2xsWSAtIG9mZnNldCkKICAgICAgICAgICYmIG4ub2Zmc2V0VG9wIDw9IChzY3JvbGxZICsgdmlzdWFsVmlld3BvcnQuaGVpZ2h0ICsgb2Zmc2V0KQogICAgICB9CgogICAgICBhc3luYyBmdW5jdGlvbiB1cGRhdGVpbWFnZXNsb2FkKCl7CiAgICAgICAgcXNhKCIjaW1hZ2VzIC5pdGVtLmltZyIpLmZvckVhY2goYXN5bmMgaW1nID0+IHsKICAgICAgICAgIGlmKHNjcm9sbHZpc2libGUoaW1nLCB2aXN1YWxWaWV3cG9ydC5oZWlnaHQgLyAyKSl7CiAgICAgICAgICAgIGltZy5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSAidXJsKCIgKyBpbWdbImRhdGEtc3JjIl0gKyAiKSIKICAgICAgICAgIH1lbHNlewogICAgICAgICAgICBpbWcuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gIiIKICAgICAgICAgIH0KICAgICAgICB9KQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiB1cGRhdGVhbGx2aWRlb3BsYXkoKXsKICAgICAgICBxc2EoIiNpbWFnZXMgLml0ZW0udmlkZW8iKS5mb3JFYWNoKGFzeW5jIG4gPT4gdXBkYXRldmlkZW9wbGF5KG4pKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBwcmV2aWV3dXJscygpewogICAgICAgIHJldHVybiBxc2EoIiNpbWFnZXMgLml0ZW0iKS5maWx0ZXIobiA9PiBuLm9mZnNldFBhcmVudCkuc2xpY2UoMCwgNCkubWFwKG4gPT4gblsiZGF0YS1pdGVtIl0udXJsKQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiB1cGRhdGV2aWRlb3BsYXkobil7CiAgICAgICAgY29uc3QgYXBsYXkgPSBhdXRvcGxheSgpCiAgICAgICAgY29uc3QgdiA9IG4ucXVlcnlTZWxlY3RvcigidmlkZW8iKQogICAgICAgIAogICAgICAgIGlmKGFwbGF5ICE9ICJvbiIpewogICAgICAgICAgdi5tdXRlZCA9IGZhbHNlCiAgICAgICAgICB2LnBhdXNlKCkKICAgICAgICB9ZWxzZXsKICAgICAgICAgIHYubXV0ZWQgPSB0cnVlCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKCFzY3JvbGx2aXNpYmxlKG4pKXsKICAgICAgICAgIGlmKHYucmVhZHlTdGF0ZSA9PSA0KXsKICAgICAgICAgICAgdi5wYXVzZSgpCiAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgdi5wcmVsb2FkID0gIm5vbmUiCiAgICAgICAgICB9CiAgICAgICAgfWVsc2UgaWYodi5yZWFkeVN0YXRlICE9IDQpewogICAgICAgICAgdi5wcmVsb2FkID0gImF1dG8iCiAgICAgICAgfQogICAgICAgIGVsc2UgaWYoYXBsYXkgPT0gIm9uIiB8fCAoYXBsYXkgPT0gImhvdmVyIiAmJiB2ID09IGhvdmVyZWR2aWRlbykpewogICAgICAgICAgdi5wbGF5KCkKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsIGUgPT4gewogICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCkKICAgICAgICB1cGRhdGVpbWFnZXNsb2FkKCkKICAgICAgICB1cGRhdGVhbGx2aWRlb3BsYXkoKQogICAgICB9KQogICAgICAKICAgICAgbGV0IHRvdWNoID0gbnVsbAogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsIGUgPT4gdG91Y2ggPSBlLmNoYW5nZWRUb3VjaGVzWzBdKQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLCBlID0+IHsKICAgICAgICBjb25zdCB4ZGlmZiA9IGUuY2hhbmdlZFRvdWNoZXNbMF0uc2NyZWVuWCAtIHRvdWNoLnNjcmVlblgKCiAgICAgICAgaWYoeGRpZmYgPCAtNTApewogICAgICAgICAgc3dpcGUoMSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoeGRpZmYgPiA1MCl7CiAgICAgICAgICBzd2lwZSgtMSkKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBxcygiI3F1ZXJ5LWZvcm0iKS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLCBlID0+IHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUobnVsbCwgbnVsbCwgbG9jYXRpb24ucGF0aG5hbWUpCiAgICAgICAgbG9jYXRpb24uaGFzaCA9ICIjIiArIGVuY29kZVVSSUNvbXBvbmVudChxcygiI3F1ZXJ5IikudmFsdWUgKyAiLyIgKyBxdWVyeXR5cGUoKSkKICAgICAgICB1cGRhdGVxdWVyeSgpCiAgICAgICAgcXVlcnl3YWl0LnJlc29sdmUoKQogICAgICB9KQoKICAgICAgcXMoIiNyZWxheXMtZm9ybSIpLmFkZEV2ZW50TGlzdGVuZXIoInN1Ym1pdCIsIGFzeW5jIGUgPT4gewogICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgIGxldCByID0gSlNPTi5zdHJpbmdpZnkocXMoIiNyZWxheXMiKS52YWx1ZS5zcGxpdCgiXG4iKSkKICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgicmVsYXlzIiwgcikKICAgICAgICBkaXNjb25uZWN0KCkKICAgICAgfSkKICAgICAgCiAgICAgIHFzKCIjc2hhcmUtZm9ybSIpLmFkZEV2ZW50TGlzdGVuZXIoInN1Ym1pdCIsIGFzeW5jIGUgPT4gewogICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgIAogICAgICAgIGlmKHFzKCIjc2hhcmUtZm9ybSAuc3VibWl0IikudmFsdWUgPT0gImNsb3NlIil7CiAgICAgICAgICBxc2EoIi5kaWFsb2cudmlzaWJsZSIpLmZvckVhY2gobiA9PiBuLmNsYXNzTGlzdC5yZW1vdmUoInZpc2libGUiKSkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBldmVudHMgPSBxc2EoIiNpbWFnZXMgLml0ZW0iKS5maWx0ZXIobiA9PiBuLm9mZnNldFBhcmVudCkubWFwKG4gPT4gblsiZGF0YS1ldmVudCJdLmlkKQogICAgICAgIGNvbnN0IGV2ZW50ID0gYXdhaXQgcHVibGlzaCh7CiAgICAgICAgICAia2luZCI6IDMzMywKICAgICAgICAgICJjb250ZW50IjogSlNPTi5zdHJpbmdpZnkoZXZlbnRzKSwKICAgICAgICAgICJ0YWdzIjogW10KICAgICAgICB9KQoKICAgICAgICBhd2FpdCB3YWl0cmVzKG51bGwsICJPSyIpCgogICAgICAgIGNvbnN0IHVybCA9IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4gKyB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUKICAgICAgICAKICAgICAgICBjb25zdCBjb250ZW50ID0gIlRoaXMgaXMgYSBnYWxsZXJ5IG9mICIgKyBldmVudHMubGVuZ3RoCiAgICAgICAgICAgICsgIiBpbWFnZXMvdmlkZW9zIHNoYXJlZCBmcm9tIGZpbGVzLmh0bWwuIENoZWNrIGl0IG91dCBoZXJlOiAiICsgdXJsICsgIj9nYWxsZXJ5PSIgKyBldmVudC5pZAogICAgICAgICAgICArICJcblxuIiArIHByZXZpZXd1cmxzKCkuam9pbigiXG4iKQogICAgICAgIAogICAgICAgIGNvbnN0IHB1Ymxpc2hlZGV2ZW50ID0gYXdhaXQgcHVibGlzaCh7CiAgICAgICAgICAia2luZCI6IDEsCiAgICAgICAgICAiY29udGVudCI6IGNvbnRlbnQsCiAgICAgICAgICAidGFncyI6IFsKICAgICAgICAgICAgWyIjZSIsIGV2ZW50LmlkXSwgCiAgICAgICAgICAgIFsiI3AiLCBldmVudC5wdWJrZXldCiAgICAgICAgICBdCiAgICAgICAgfSkKCiAgICAgICAgYXdhaXQgd2FpdHJlcyhudWxsLCAiT0siKQogICAgICAgIAogICAgICAgIGNvbnN0IGJlY2gzMmlkID0gYmVjaDMyLmVuY29kZSgibm90ZSIsIGZyb21IZXhTdHJpbmcocHVibGlzaGVkZXZlbnQuaWQpKQogICAgICAgIHFzKCIjc2hhcmUtZm9ybSAuY29udGVudCIpLmlubmVySFRNTCA9ICdOb3RlIHB1Ymxpc2hlZCA8YSBocmVmPSInICsgcHJvdG9jb2wgKyBiZWNoMzJpZCArICciPicgKyBiZWNoMzJpZCArICc8L2E+JwogICAgICAgIHFzKCIjc2hhcmUtZm9ybSAuc3VibWl0IikudmFsdWUgPSAiY2xvc2UiCiAgICAgIH0pCgogICAgICBxcygiI3ByaXZrZXktZm9ybSIpLmFkZEV2ZW50TGlzdGVuZXIoInN1Ym1pdCIsIGFzeW5jIGUgPT4gewogICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgIGNvbnN0IGtleSA9IHFzKCIjcHJpdmtleSIpLnZhbHVlCgogICAgICAgIGlmKGtleS5sZW5ndGggIT0gNjQgJiYga2V5Lmxlbmd0aCAhPSA2Myl7CiAgICAgICAgICBhbGVydCgia2V5IHNob3VsZCBiZSA2MyBvciA2NCBjaGFyYWN0ZXJzIGxvbmciKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJwcml2a2V5Iiwga2V5KQogICAgICAgIGFsZXJ0KCJrZXkgc2F2ZWQiKQogICAgICB9KQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwgYXN5bmMgKGUpID0+IHsKICAgICAgICBpZihhdXRvcGxheSgpID09ICJob3ZlciIgJiYgZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ2aWRlby1jb250YWluZXIiKSl7CiAgICAgICAgICBob3ZlcmVkdmlkZW8gPSBlLnRhcmdldC5xdWVyeVNlbGVjdG9yKCJ2aWRlbyIpCiAgICAgICAgICBob3ZlcmVkdmlkZW8ucGxheSgpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLCBhc3luYyAoZSkgPT4gewogICAgICAgIGhvdmVyZWR2aWRlbyA9IGZhbHNlCiAgICAgICAgaWYoIXFzKCIjbWVkaWEtY29udGFpbmVyIikuY2xhc3NMaXN0LmNvbnRhaW5zKCJ2aXNpYmxlIikgJiYgYXV0b3BsYXkoKSA9PSAiaG92ZXIiICYmIGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygidmlkZW8tY29udGFpbmVyIikpewogICAgICAgICAgcXNhKCJ2aWRlbyIpLmZvckVhY2godiA9PiB2LnBhdXNlKCkpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBhc3luYyAoZSkgPT4gewogICAgICAgIGlmKGUudGFyZ2V0LnR5cGUgPT0gInN1Ym1pdCIgfHwgKGUudGFyZ2V0LnRhZ05hbWUgPT0gIkEiICYmIGUudGFyZ2V0LmhyZWYubWF0Y2goL14ofHdlYlwrKW5vc3RyXDovKSkpewogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0aXRsZSIpKXsKICAgICAgICAgIHFzKCIjcXVlcnkiKS52YWx1ZSA9ICIiCiAgICAgICAgICBxcygiI3F1ZXJ5LXR5cGUiKS52YWx1ZSA9ICJhbGwiCiAgICAgICAgICBxcygiI2dvIikuY2xpY2soKQogICAgICAgIH0KCiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCgogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJmaWx0ZXItbGlrZXMiKXsKICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnRvZ2dsZSgiZmlsdGVyLWxpa2VzIikKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLnRhcmdldC5pZCA9PSAic2hhcmUiKXsKICAgICAgICAgIGNvbnN0IGV2ZW50cyA9IHFzYSgiI2ltYWdlcyAuaXRlbSIpLmZpbHRlcihuID0+IG4ub2Zmc2V0UGFyZW50KS5tYXAobiA9PiBuWyJkYXRhLWV2ZW50Il0uaWQpCiAgICAgICAgICAvL2NvbnN0IHRleHQgPSB7dHlwZTogIiIsIGV2ZW50czogfQogICAgICAgICAgcXMoIiNzaGFyZS1kaWFsb2cgLmNvbnRlbnQiKS5pbm5lckhUTUwgPSAiPHA+U2hhcmUgbGluayB0byB0aGlzIGdhbGxlcnkgb2YgIiArIGV2ZW50cy5sZW5ndGggKyAiIGltYWdlcy92aWRlb3MgdG8geW91ciBub3N0ciBwcm9maWxlPzwvcD4iCiAgICAgICAgICBxcygiI3NoYXJlLWRpYWxvZyAuY29udGVudCIpLmlubmVySFRNTCArPSBwcmV2aWV3dXJscygpLm1hcCh1cmwgPT4gJzxpbWcgc3JjPSInK3VybCsnIi8+Jykuam9pbigiICIpCiAgICAgICAgICBxcygiI3NoYXJlLWZvcm0gLnN1Ym1pdCIpLnZhbHVlID0gInB1Ymxpc2giCiAgICAgICAgICBxc2EoIiNzaGFyZS1kaWFsb2csICNvdmVybGF5IikuZm9yRWFjaChuID0+IG4uY2xhc3NMaXN0LnRvZ2dsZSgidmlzaWJsZSIpKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNob3ciKSl7CiAgICAgICAgICBhY3RpdmUoKT8uY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIGNvbnN0IGlkID0gZS50YXJnZXQuaWQgfHwgZS50YXJnZXRbImRhdGEtaXRlbS1pZCJdCiAgICAgICAgICBnaWQoaWQpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBzaG93KGlkKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUudGFyZ2V0LnRhZ05hbWUgIT0gIkEiICYmIChxcygiI2ltYWdlLWNvbnRhaW5lciIpID09IGUudGFyZ2V0IHx8IHFzKCIjaW1hZ2UiKSA9PSBlLnRhcmdldCB8fCBxcygiI21lZGlhLWNvbnRhaW5lciB2aWRlbyIpID09IGUudGFyZ2V0KSl7CiAgICAgICAgICBoaWRlbWVkaWEoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLnRhcmdldC5pZCA9PSAibWVudSIpewogICAgICAgICAgbWVudSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJvdmVybGF5Iil7CiAgICAgICAgICBxc2EoIi5kaWFsb2cudmlzaWJsZSIpLmZvckVhY2gobiA9PiBuLmNsYXNzTGlzdC5yZW1vdmUoInZpc2libGUiKSkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNldGNvbHMiKSl7CiAgICAgICAgICBmb3IobGV0IGMgb2YgY29sb3B0cyl7CiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgiY29scyIgKyBjKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoImNvbHMiICsgZS50YXJnZXQuZGF0YXNldC5jb2xzKQogICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oImNvbHMiLCBlLnRhcmdldC5kYXRhc2V0LmNvbHMpCiAgICAgICAgICBzZXRhY3RpdmUoInNldGNvbHMiLCAiY29scyIsIGNvbHMoKSkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNldGF1dG9wbGF5IikpewogICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oImF1dG9wbGF5IiwgZS50YXJnZXQuZGF0YXNldC5hdXRvcGxheSkKICAgICAgICAgIHNldGFjdGl2ZSgic2V0YXV0b3BsYXkiLCAiYXV0b3BsYXkiLCBhdXRvcGxheSgpKQogICAgICAgICAgdXBkYXRlYWxsdmlkZW9wbGF5KCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoImxpa2UiKSAmJiBsaWtlKGUudGFyZ2V0KQogICAgICB9KQogICAgICAKICAgICAgZnVuY3Rpb24gaGFza2V5KCl7CiAgICAgICAgcmV0dXJuIHdpbmRvdy5ub3N0ciB8fCBwcml2a2V5KCkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcHVia2V5KCl7CiAgICAgICAgcmV0dXJuIHdpbmRvdy5ub3N0ciAmJiBhd2FpdCB3aW5kb3cubm9zdHIuZ2V0UHVibGljS2V5KCkgfHwgTm9zdHJUb29scy5nZXRQdWJsaWNLZXkocHJpdmtleSgpKQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBzaWduKGV2ZW50KXsKICAgICAgICBpZih3aW5kb3cubm9zdHIpewogICAgICAgICAgcmV0dXJuIGF3YWl0IG5vc3RyLnNpZ25FdmVudChldmVudCkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZXZlbnQuc2lnID0gTm9zdHJUb29scy5nZXRTaWduYXR1cmUoZXZlbnQsIHByaXZrZXkoKSkKICAgICAgICByZXR1cm4gZXZlbnQKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gbGlrZShsaW5rKXsKICAgICAgICBjb25zdCBldmVudCA9IGxpbmsucGFyZW50RWxlbWVudFsiZGF0YS1ldmVudCJdCiAgICAgICAgCiAgICAgICAgYXdhaXQgcHVibGlzaCh7CiAgICAgICAgICAia2luZCI6IDcsCiAgICAgICAgICAiY29udGVudCI6ICIrIiwKICAgICAgICAgICJ0YWdzIjogWwogICAgICAgICAgICBbImUiLCBldmVudC5pZF0sCiAgICAgICAgICAgIFsicCIsIGV2ZW50LnB1YmtleV0KICAgICAgICAgIF0KICAgICAgICB9KQoKICAgICAgICBsaW5rLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQoKICAgICAgICBjb25zdCBpbWFnZWlkID0gbGlua1siZGF0YS1pdGVtLWlkIl0gfHwgbGluay5kYXRhc2V0LmltYWdlSWQKICAgICAgICAKICAgICAgICBpZihpbWFnZWlkKXsKICAgICAgICAgIGdpZChpbWFnZWlkKS5xdWVyeVNlbGVjdG9yKCIubGlrZSIpLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQogICAgICAgIH0KICAgICAgfQoKICAgICAgYXN5bmMgZnVuY3Rpb24gcHJlcGFyZV9ldmVudChldmVudCl7CiAgICAgICAgZXZlbnQucHVia2V5ID0gYXdhaXQgcHVia2V5KCkKICAgICAgICBldmVudC5jcmVhdGVkX2F0ID0gcGFyc2VJbnQoRGF0ZS5ub3coKSAvIDEwMDAsIDEwKQogICAgICAgIGV2ZW50LmlkID0gTm9zdHJUb29scy5nZXRFdmVudEhhc2goZXZlbnQpCiAgICAgICAgcmV0dXJuIGV2ZW50CiAgICAgIH0KICAgICAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBwdWJsaXNoKGV2ZW50KXsKICAgICAgICBldmVudCA9IGF3YWl0IHByZXBhcmVfZXZlbnQoZXZlbnQpCiAgICAgICAgbGV0IHNpZ25lZGV2ZW50ID0gYXdhaXQgc2lnbihldmVudCkKICAgICAgICBsZXQganNvbiA9IEpTT04uc3RyaW5naWZ5KFsiRVZFTlQiLCBzaWduZWRldmVudF0pCiAgICAgICAgc29ja2V0cy5mb3JFYWNoKHMgPT4gcy5zZW5kKGpzb24pKQogICAgICAgIAogICAgICAgIHJldHVybiBldmVudAogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBzd2lwZShvZmZzZXQpewogICAgICAgIGlmKGltYWdlb2Zmc2V0KG9mZnNldCkpewogICAgICAgICAgaW1hZ2VvZmZzZXQob2Zmc2V0KS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgdGhpc1tvZmZzZXQgPT0gLTEgJiYgImxhc3RhY3RpdmUiIHx8ICJhY3RpdmUiXSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgICB1cGRhdGVzaG93KCkKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZXNob3coKXsKICAgICAgICBpZihxcygiI21lZGlhLWNvbnRhaW5lciIpLmNsYXNzTGlzdC5jb250YWlucygidmlzaWJsZSIpKXsKICAgICAgICAgIGhpZGV2aWRlbygpCiAgICAgICAgICBzaG93KGFjdGl2ZSgpLmlkKQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIGUgPT4gewogICAgICAgIGlmKFsiVGFiIiwgIkFycm93TGVmdCIsICJBcnJvd1JpZ2h0IiwgIkFycm93VXAiLCAiQXJyb3dEb3duIl0uaW5jbHVkZXMoZS5rZXkpKXsKICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkVzY2FwZSIpewogICAgICAgICAgbWVudSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZS5rZXkgPT0gIkVudGVyIiAmJiBlLnRhcmdldC50YWdOYW1lID09ICJCT0RZIil7CiAgICAgICAgICBpZihxcygiI21lZGlhLWNvbnRhaW5lciIpLmNsYXNzTGlzdC5jb250YW5zKCJ2aXNpYmxlIikpewogICAgICAgICAgICBoaWRlbWVkaWEoKQogICAgICAgICAgICByZXR1cm4KICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgc2hvdyhhY3RpdmUoKS5pZCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93VXAiICYmIGltYWdlb2Zmc2V0KC1jb2xzKCkpKXsKICAgICAgICAgIGltYWdlb2Zmc2V0KC1jb2xzKCkpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBsYXN0YWN0aXZlKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIHVwZGF0ZXNob3coKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93RG93biIgJiYgaW1hZ2VvZmZzZXQoY29scygpKSl7CiAgICAgICAgICBpbWFnZW9mZnNldChjb2xzKCkpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBhY3RpdmUoKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgICAgdXBkYXRlc2hvdygpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dMZWZ0Iil7CiAgICAgICAgICBzd2lwZSgtMSkKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd1JpZ2h0Iil7CiAgICAgICAgICBzd2lwZSgxKQogICAgICAgIH0KICAgICAgfSkKCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGhhbmRsZXF1ZXJ5cmVzKHJlcywgc29ja2V0LCBxLCB0eXBlLCBzdGltZSl7CiAgICAgICAgc2F2ZShzb2NrZXQsIHJlcywgcSwgdHlwZSwgZmFsc2UsIGZhbHNlLCB0cnVlKQogICAgICAgIGxvZygicXVlcnkgcmVzIiwgcmVzLmxlbmd0aCwgc29ja2V0LnVybCkKICAgICAgICBxdWVyeWNvdW50LS0KICAgICAgICBpZihxdWVyeWNvdW50ID09IDApewogICAgICAgICAgcXMoIiNsb2FkaW5nIikuY2xhc3NMaXN0LnJlbW92ZSgidmlzaWJsZSIpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGxldCB3YWl0ID0gd2FpdG1zIC0gKERhdGUubm93KCkgLSBzdGltZSkKICAgICAgICBxdWVyeXdhaXQgPSBzbGVlcCh3YWl0KQogICAgICAgIGF3YWl0IHF1ZXJ5d2FpdC5wcm9taXNlCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHByaW1hbGdsb2JhbChzb2NrZXQpewogICAgICAgIGxvZygiZ2xvYmFsIiwgc29ja2V0LnVybCkKICAgICAgICBxdWVyeWNvdW50KysKICAgICAgICBxcygiI2xvYWRpbmciKS5jbGFzc0xpc3QuYWRkKCJ2aXNpYmxlIikKICAgICAgICBsZXQgc3RpbWUgPSBEYXRlLm5vdygpCiAgICAgICAgbGV0IHFpZCA9ICJnbG9iYWxfIiArICgrK2lkY291bnRlcikKICAgICAgICBsZXQgcWlkbGlrZXMgPSAibGlrZXNfIiArICgrK2lkY291bnRlcikKCiAgICAgICAgaWYobmV3bGlrZXMubGVuZ3RoID4gMCl7CiAgICAgICAgICBwcmltYWxzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeShbCiAgICAgICAgICAgICJSRVEiLCAKICAgICAgICAgICAgcWlkbGlrZXMsIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgImNhY2hlIjogWwogICAgICAgICAgICAgICAgImV2ZW50cyIsIHsKICAgICAgICAgICAgICAgICAgImV2ZW50X2lkcyI6IG5ld2xpa2VzCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgXQogICAgICAgICAgICB9CiAgICAgICAgICBdKSkKCiAgICAgICAgICBjb25zdCBsaWtlX2V2ZW50cyA9IChhd2FpdCB3YWl0cmVzKHFpZGxpa2VzKSlbMF0KICAgICAgICAgIG5ld2xpa2VzLnNwbGljZSgwKQogICAgICAgICAgCiAgICAgICAgICBhd2FpdCBzYXZlKHNvY2tldCwgbGlrZV9ldmVudHMsICIiLCAiYWxsIiwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KFsKICAgICAgICAgICJSRVEiLCAKICAgICAgICAgIHFpZCwgCiAgICAgICAgICB7CiAgICAgICAgICAgICJjYWNoZSI6IFsKICAgICAgICAgICAgICAiZXhwbG9yZSIsIAogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJ0aW1lZnJhbWUiOiAibGF0ZXN0IiwKICAgICAgICAgICAgICAgICJzY29wZSI6ICJnbG9iYWwiLAogICAgICAgICAgICAgICAgImxpbWl0IjogNTAKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdKSkKICAgICAgICAKICAgICAgICBjb25zdCByZXMgPSAoYXdhaXQgd2FpdHJlcyhxaWQpKVswXQogICAgICAgIGF3YWl0IGhhbmRsZXF1ZXJ5cmVzKHJlcy5maWx0ZXIoZSA9PiBlLmtpbmQgPT0gMSksIHNvY2tldCwgIiIsICJhbGwiLCBzdGltZSkKICAgICAgICBwcmltYWxnbG9iYWwoc29ja2V0KQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeShzb2NrZXQsIHByaW1hbCl7CiAgICAgICAgbG9nKCJxdWVyeSIsIHNvY2tldC51cmwpCiAgICAgICAgcXVlcnljb3VudCsrCiAgICAgICAgcXMoIiNsb2FkaW5nIikuY2xhc3NMaXN0LmFkZCgidmlzaWJsZSIpCiAgICAgICAgCiAgICAgICAgbGV0IHN0aW1lID0gRGF0ZS5ub3coKQogICAgICAgIGxldCBxID0gcXVlcnlzdHIudHJpbSgpCiAgICAgICAgbGV0IHR5cGUgPSBxdWVyeXR5cGUoKQogICAgICAgIGxldCBpID0gKytpZGNvdW50ZXIKICAgICAgICBsZXQgcWlkID0gInF1ZXJ5XyIgKyBpCiAgICAgICAgY29uc3QgbGlrZXNyZXMgPSBhd2FpdCBxdWVyeWxpa2VzKHNvY2tldCkKICAgICAgICAKICAgICAgICBsaWtlc3Jlcy5mb3JFYWNoKGV2ZW50aWQgPT4gewogICAgICAgICAgaWYoIWxpa2VzLmluY2x1ZGVzKGV2ZW50aWQpKXsKICAgICAgICAgICAgbGlrZXMucHVzaChldmVudGlkKQogICAgICAgICAgICBuZXdsaWtlcy5wdXNoKGV2ZW50aWQpCiAgICAgICAgICB9CiAgICAgICAgfSkKICAgICAgICAKICAgICAgICBsZXQgZ2FsbGVyeW1hdGNoID0gcXVlcnlzdHIubWF0Y2goL2c6KFthLXowLTldKykvKQogICAgICAgIGxldCByZXMgPSBudWxsCiAgICAgICAgCiAgICAgICAgaWYoZ2FsbGVyeW1hdGNoKXsKICAgICAgICAgIGNvbnN0IGdhbGxlcnlyZXMgPSBhd2FpdCBxdWVyeWV2ZW50cyhzb2NrZXQsIFszMzNdLCBbZ2FsbGVyeW1hdGNoWzFdXSwgbnVsbCkKICAgICAgICAgIGNvbnN0IGV2ZW50aWRzID0gSlNPTi5wYXJzZShnYWxsZXJ5cmVzWzBdLmNvbnRlbnQpCiAgICAgICAgICByZXMgPSBhd2FpdCBxdWVyeWV2ZW50cyhzb2NrZXQsIFsxXSwgZXZlbnRpZHMsIG51bGwpCiAgICAgICAgfWVsc2V7CiAgICAgICAgICBsZXQgZmlsdGVycyA9IFtdCgogICAgICAgICAgZmlsdGVycy5wdXNoKC4uLih0eXBlc1t0eXBlXSB8fCBbXSkubWFwKCh0KSA9PiB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAga2luZHM6IFsxXSwgCiAgICAgICAgICAgICAgc2VhcmNoOiAiLiIgKyB0LAogICAgICAgICAgICAgIGxpbWl0OiAyMAogICAgICAgICAgICB9CiAgICAgICAgICB9KSkKICAgICAgICAgIAogICAgICAgICAgaWYocS5sZW5ndGggPiAwKXsKICAgICAgICAgICAgZmlsdGVycy5wdXNoKHtraW5kczogWzFdLCBzZWFyY2g6IHF9KQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBpZihmaWx0ZXJzLmxlbmd0aCA9PSAwKXsKICAgICAgICAgICAgZmlsdGVycy5wdXNoKHtraW5kczogWzFdfSkKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgY29uc3Qgc2VhcmNob2JqID0gWyJSRVEiLCBxaWQsIC4uLmZpbHRlcnNdCiAgICAgICAgICBjb25zdCBzZWFyY2hqc29uID0gSlNPTi5zdHJpbmdpZnkoc2VhcmNob2JqKQogICAgICAgICAgc29ja2V0LnNlbmQoc2VhcmNoanNvbikKICAgICAgICAgIAogICAgICAgICAgcmVzID0gKGF3YWl0IHdhaXRyZXMocWlkKSlbMF0KICAgICAgICAgIAogICAgICAgICAgcmVzID0gcmVzLmZpbHRlcihvID0+IHsKICAgICAgICAgICAgaWYocS5sZW5ndGggPiAwKXsKICAgICAgICAgICAgICBmb3IobGV0IHdvcmQgb2YgcS5zcGxpdCgiICIpKXsKICAgICAgICAgICAgICAgIGlmKG8uY29udGVudC50b0xvd2VyQ2FzZSgpLmluZGV4T2Yod29yZC50b0xvd2VyQ2FzZSgpKSA9PSAtMSl7CiAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWUKICAgICAgICAgIH0pCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGF3YWl0IGhhbmRsZXF1ZXJ5cmVzKHJlcywgc29ja2V0LCBxLCB0eXBlLCBzdGltZSkKICAgICAgICBxdWVyeShzb2NrZXQpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5bGlrZXMoc29ja2V0KXsKICAgICAgICBpZighaGFza2V5KCkpewogICAgICAgICAgcmV0dXJuIFtdCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IG15cHVia2V5ID0gYXdhaXQgcHVia2V5KCkKICAgICAgICBjb25zdCBldmVudHMgPSBhd2FpdCBxdWVyeWV2ZW50cyhzb2NrZXQsIFs3XSwgbnVsbCwgW215cHVia2V5XSkKICAgICAgICByZXR1cm4gZXZlbnRzLm1hcChlID0+IGUudGFncy5maW5kKHQgPT4gdFswXSA9PSAiZSIpWzFdKQogICAgICB9CgogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeWV2ZW50cyhzb2NrZXQsIGtpbmRzLCBldmVudGlkcywgYXV0aG9ycyl7CiAgICAgICAgY29uc3QgcXVlcnlpZCA9ICJldmVudHNfIiArICgrK2lkY291bnRlcikKICAgICAgICBjb25zdCBmaWx0ZXJzID0ge30KICAgICAgICAKICAgICAgICBmaWx0ZXJzLmtpbmRzID0ga2luZHMKICAgICAgICAKICAgICAgICBpZihldmVudGlkcyl7CiAgICAgICAgICBmaWx0ZXJzWyJpZHMiXSA9IGV2ZW50aWRzCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGF1dGhvcnMpewogICAgICAgICAgZmlsdGVyc1siYXV0aG9ycyJdID0gYXV0aG9ycwogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkoWwogICAgICAgICAgIlJFUSIsIAogICAgICAgICAgcXVlcnlpZCwgCiAgICAgICAgICBmaWx0ZXJzCiAgICAgICAgXSkKICAgICAgICAKICAgICAgICBzb2NrZXQuc2VuZChqc29uKQogICAgICAgIAogICAgICAgIHJldHVybiAoYXdhaXQgd2FpdHJlcyhxdWVyeWlkKSlbMF0gfHwgW10KICAgICAgfQoKICAgICAgYXN5bmMgZnVuY3Rpb24gc2F2ZShzb2NrZXQsIGV2ZW50cywgcSwgcXR5cGUsIHJlYWN0ZWQsIGFwcGVuZCwgcXVlcnltZXRhKXsKICAgICAgICBsZXQgZXZlbnRwdWJrZXlzID0gW10KICAgICAgICBsZXQgcmVzdWx0cyA9IFtdCiAgICAgICAgY29uc3QgZXZlbnRpZHMgPSBldmVudHMubWFwKGUgPT4gZS5pZCkKICAgICAgICBsZXQgbmV3dXJscyA9IFtdCiAgICAgICAgCiAgICAgICAgZm9yKGxldCBldmVudCBvZiBldmVudHMpewogICAgICAgICAgbGV0IHVybHNtYXRjaCA9IFtdCiAgICAgICAgICAKICAgICAgICAgIGlmKHF0eXBlICE9ICJ2aWRlbyIpewogICAgICAgICAgICB1cmxzbWF0Y2gucHVzaCguLi4oZXZlbnQuY29udGVudC5tYXRjaChpbWdyZWdleCkgfHwgW10pKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBpZihxdHlwZSAhPSAiaW1hZ2UiKXsKICAgICAgICAgICAgdXJsc21hdGNoLnB1c2goLi4uKGV2ZW50LmNvbnRlbnQubWF0Y2godmlkZW9yZWdleCkgfHwgW10pKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICB1cmxzbWF0Y2ggPSB1cmxzbWF0Y2guZmlsdGVyKHVybCA9PiAhdXJscy5pbmNsdWRlcyh1cmwpKQoKICAgICAgICAgIGlmKHVybHNtYXRjaC5sZW5ndGggPiAwKXsKICAgICAgICAgICAgbmV3dXJscy5wdXNoKHsKICAgICAgICAgICAgICBldmVudDogZXZlbnQsCiAgICAgICAgICAgICAgdXJsczogdXJsc21hdGNoCiAgICAgICAgICAgIH0pCiAgICAgICAgICAgIAogICAgICAgICAgICB1cmxzLnB1c2goLi4udXJsc21hdGNoKQogICAgICAgICAgICBldmVudHB1YmtleXMuaW5jbHVkZXMoZXZlbnQucHVia2V5KSB8fCBldmVudHB1YmtleXMucHVzaChldmVudC5wdWJrZXkpCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGxvZygicXVlcnkgbWV0YSIsIHNvY2tldC51cmwpCiAgICAgICAgbGV0IG1ldGFldmVudHMgPSAocXVlcnltZXRhICYmIGF3YWl0IHF1ZXJ5ZXZlbnRzKHNvY2tldCwgWzBdLCBudWxsLCBldmVudHB1YmtleXMpIHx8IFtdKQogICAgICAgIAogICAgICAgIGZvcihsZXQgZW50cnkgb2YgbmV3dXJscyl7CiAgICAgICAgICBmb3IobGV0IHVybCBvZiBlbnRyeS51cmxzKXsKICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHsKICAgICAgICAgICAgICByZWFjdGVkOiByZWFjdGVkIHx8IGxpa2VzLmluY2x1ZGVzKGVudHJ5LmV2ZW50LmlkKSwgCiAgICAgICAgICAgICAgdXJsOiB1cmwsIAogICAgICAgICAgICAgIGV2ZW50OiBlbnRyeS5ldmVudCwgCiAgICAgICAgICAgICAgYmVjaDMyaWQ6IGJlY2gzMi5lbmNvZGUoIm5vdGUiLCBmcm9tSGV4U3RyaW5nKGVudHJ5LmV2ZW50LmlkKSksCiAgICAgICAgICAgICAgbWV0YTogbWV0YWV2ZW50cy5maW5kKG8gPT4gby5wdWJrZXkgPT0gZW50cnkuZXZlbnQucHVia2V5KQogICAgICAgICAgICB9KQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICBsb2coInNhdmUgcmVzIiwgcmVzdWx0cy5sZW5ndGgsIHNvY2tldC51cmwpCiAgICAgICAgdXBkYXRlY29udGVudChyZXN1bHRzLCBxLCBhcHBlbmQpCiAgICAgIH0KICAgICAgCiAgICAgIGxldCBsb2FkZWQgPSAwCiAgICAgIAogICAgICBmdW5jdGlvbiB1cGRhdGVjb250ZW50KHJlc3VsdHMsIHEsIGFwcGVuZCl7CiAgICAgICAgcmVzdWx0cy5yZXZlcnNlKCkuZm9yRWFjaChpdGVtID0+IHsKICAgICAgICAgIGNvbnN0IHR5cGUgPSBpdGVtLnVybC5tYXRjaCh2aWRlb2V4dHJlZ2V4KSAmJiAidmlkZW8iIHx8ICJpbWFnZSIKICAgICAgICAgIGNvbnN0IHRleHQgPSAocSB8fCAidmlldyBub3RlIikuc3Vic3RyaW5nKC0zMCkKICAgICAgICAgIGNvbnN0IGlkID0gIml0ZW1fIiArICgrK2lkY291bnRlcikKICAgICAgICAgIGNvbnN0IGNvbnRlbnRlbGVtZW50cyA9ICc8ZGl2IGNsYXNzPSJ0eXBlIj4nICsgcXMoIiN0ZW1wbGF0ZSAuIiArIHR5cGUgKyAic3ZnIikub3V0ZXJIVE1MICsgJzwvZGl2PjxhIGNsYXNzPSJsaWtlJyArIChpdGVtLnJlYWN0ZWQgPyAnIHJlYWN0ZWQnIDogJycpICsgJyIgZGF0YS1pdGVtLWlkPSInICsgaWQgKyAKICAgICAgICAgICAgJyIgaHJlZj0iIyI+JyArIHFzKCIjdGVtcGxhdGUgLmhlYXJ0c3ZnIikub3V0ZXJIVE1MICsgJzwvYT48YSBjbGFzcz0icXVlcnkiIGhyZWY9IicgKyBwcm90b2NvbCArIAogICAgICAgICAgICBpdGVtLmJlY2gzMmlkICsgJyI+JyArIHRleHQgKyAnPC9hPicKICAgICAgICAgIGxldCByb290ID0gbnVsbAogICAgICAgICAgbGV0IHYgPSBudWxsCiAgICAgICAgICAKICAgICAgICAgIGlmKGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpKXsKICAgICAgICAgICAgcm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpCiAgICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgidmlkZW8tY29udGFpbmVyIikKICAgICAgICAgICAgcm9vdC5pbm5lckhUTUwgPSBjb250ZW50ZWxlbWVudHMKICAgICAgICAgICAgCiAgICAgICAgICAgIHYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpCiAgICAgICAgICAgIHYuY2xhc3NMaXN0LmFkZCgic2hvdyIpCiAgICAgICAgICAgIHZbImRhdGEtaXRlbS1pZCJdID0gaWQKICAgICAgICAgICAgdi5wcmVsb2FkID0gIm5vbmUiCiAgICAgICAgICAgIHYubG9vcCA9IHRydWUKICAgICAgICAgICAgdi5wbGF5c2lubGluZSA9ICIiCiAgICAgICAgICAgIAogICAgICAgICAgICB2Lm9uY2FucGxheSA9IGFzeW5jIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIGNvbnN0IGFzcGVjdCA9IHRoaXMudmlkZW9XaWR0aCAvIHRoaXMudmlkZW9IZWlnaHQKICAgICAgICAgICAgICBpZihhc3BlY3QgPiAxKXsKICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUud2lkdGggPSAoYXNwZWN0ICogMTAwKSArICIlIgogICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgdGhpcy5zdHlsZS5oZWlnaHQgPSAoMSAvIGFzcGVjdCAqIDEwMCkgKyAiJSIKICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUubWFyZ2luVG9wID0gLSgoMSAvIGFzcGVjdCAqIDEwMCAtIDEwMCkgLyAyKSArICIlIgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAKICAgICAgICAgICAgICB1cGRhdGV2aWRlb3BsYXkodGhpcy5wYXJlbnRFbGVtZW50KQogICAgICAgICAgICB9CgogICAgICAgICAgICBjb25zdCBleHQgPSBpdGVtLnVybC5tYXRjaCh2aWRlb2V4dHJlZ2V4KVsxXQogICAgICAgICAgICB2LmlubmVySFRNTCA9ICc8c291cmNlIHNyYz0iJyArIGl0ZW0udXJsICsgJyIgdHlwZT0idmlkZW8vJyArIGV4dCArICciPjwvc291cmNlPicKICAgICAgICAgICAgCiAgICAgICAgICAgIHJvb3QuYXBwZW5kKHYpCiAgICAgICAgICB9ZWxzZSBpZihpdGVtLnVybC5tYXRjaChpbWdleHRyZWdleCkpewogICAgICAgICAgICByb290ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpCiAgICAgICAgICAgIHJvb3QuaHJlZiA9ICIjIgogICAgICAgICAgICByb290LmlubmVySFRNTCA9IGNvbnRlbnRlbGVtZW50cwogICAgICAgICAgICAgIAogICAgICAgICAgICBpZih0eXBlID09ICJpbWFnZSIpewogICAgICAgICAgICAgIC8vbGV0IGltZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpCiAgICAgICAgICAgICAgLy9pbWcuYWx0ID0gaXRlbS51cmwKICAgICAgICAgICAgICByb290WyJkYXRhLXNyYyJdID0gaXRlbS51cmwKICAgICAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoImltZyIpCiAgICAgICAgICAgICAgLy9pbWcuY2xhc3NMaXN0LmFkZCgiZGF0YSIpCiAgICAgICAgICAgICAgLy9yb290LmFwcGVuZChpbWcpCiAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgIHJvb3QuaW5uZXJIVE1MICs9ICc8c3BhbiBjbGFzcz0iZmlsZSI+JyArIGl0ZW0udXJsICsgJzwvc3Bhbj4nCiAgICAgICAgICAgIH0KICAgICAgICAgIH1lbHNlewogICAgICAgICAgICByZXR1cm4KICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgcm9vdC5pZCA9IGlkCiAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoJ3Zpc2libGUnKQogICAgICAgICAgcm9vdFsiZGF0YS1pdGVtIl0gPSBpdGVtCiAgICAgICAgICByb290WyJkYXRhLWV2ZW50Il0gPSBpdGVtLmV2ZW50CiAgICAgICAgICByb290WyJkYXRhLXF1ZXJ5Il0gPSBxCiAgICAgICAgICByb290WyJkYXRhLXRleHQiXSA9IHRleHQKICAgICAgICAgIAogICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKHR5cGUpCiAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoIml0ZW0iKQogICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJzaG93IikKICAgICAgICAgIAogICAgICAgICAgaWYoaXRlbS5yZWFjdGVkKXsKICAgICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgcXMoIiNpbWFnZXMiKVthcHBlbmQgJiYgImFwcGVuZCIgfHwgInByZXBlbmQiXShyb290KQogICAgICAgICAgCiAgICAgICAgICBpZih2KXsKICAgICAgICAgICAgdXBkYXRldmlkZW9wbGF5KHJvb3QpCiAgICAgICAgICB9CiAgICAgICAgfSkKCiAgICAgICAgdXBkYXRlaW1hZ2VzbG9hZCgpCiAgICAgICAgCiAgICAgICAgaWYoYWN0aXZlKCkgPT0gbnVsbCl7CiAgICAgICAgICBxcygiI2ltYWdlcyAuaXRlbSIpPy5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgIH0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gaGlkZW1lZGlhKCl7CiAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICJzY3JvbGwiCiAgICAgICAgcXNhKCIjbWVkaWEtY29udGFpbmVyLCAjaW1hZ2UsICNtZWRpYS1mb290ZXIiKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QucmVtb3ZlKCJ2aXNpYmxlIikpCiAgICAgICAgZ2lkKCJpbWFnZS1saWtlIikuY2xhc3NMaXN0LnJlbW92ZSgicmVhY3RlZCIpCiAgICAgICAgaGlkZXZpZGVvKCkKICAgICAgfQoKICAgICAgZnVuY3Rpb24gaGlkZXZpZGVvKCl7CiAgICAgICAgY29uc3QgdiA9IHFzKCIjbWVkaWEtY29udGFpbmVyIHZpZGVvIikKICAgICAgICAKICAgICAgICBpZih2KXsKICAgICAgICAgIHYubXV0ZWQgPSB0cnVlCiAgICAgICAgICB2LmNsYXNzTGlzdC5hZGQoInNob3ciKQogICAgICAgICAgZ2lkKHZbImRhdGEtaXRlbS1pZCJdKS5hcHBlbmRDaGlsZCh2KQogICAgICAgICAgdXBkYXRldmlkZW9wbGF5KHYucGFyZW50RWxlbWVudCkKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHdhaXRyZXMoa2V5LCB0eXBlKXsKICAgICAgICBsZXQgcmVzaGFuZGxlciA9IGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7CiAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlIHx8ICJFT1NFIgogICAgICAgICAgdGhpcy5ldmVudHMgPSBbXQogICAgICAgICAgdGhpcy5oYW5kbGUgPSBmdW5jdGlvbihyZXMpewogICAgICAgICAgICBsZXQgbyA9IEpTT04ucGFyc2UocmVzLmRhdGEpCiAgICAgICAgICAgIGlmKGtleSA9PSBudWxsIHx8IG9bMV0gPT0ga2V5KXsKICAgICAgICAgICAgICBpZihvWzBdID09IHRoaXMudHlwZSl7CiAgICAgICAgICAgICAgICByZXNvbHZlKFt0aGlzLmV2ZW50cywgb10pCiAgICAgICAgICAgICAgICByZXNoYW5kbGVycy5zcGxpY2UocmVzaGFuZGxlcnMuaW5kZXhPZih0aGlzKSwgMSkKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgdGhpcy5ldmVudHMucHVzaChvWzJdKQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgICAgICBsZXQgaGFuZGxlciA9IG5ldyByZXNoYW5kbGVyKHJlc29sdmUsIHJlamVjdCkKICAgICAgICAgIHJlc2hhbmRsZXJzLnB1c2goaGFuZGxlcikKICAgICAgICB9KQogICAgICB9CiAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gY2hlY2t1cGRhdGUoc29ja2V0KXsKICAgICAgICBjb25zdCB1cGRhdGVzcmVzID0gYXdhaXQgcXVlcnlldmVudHMoc29ja2V0LCBbMV0sIG51bGwsIFt1cGRhdGVzcHVia2V5XSkKICAgICAgICBjb25zdCB1cGRhdGVub3RlID0gdXBkYXRlc3Jlcy5maW5kKG4gPT4gbi5jb250ZW50Lm1hdGNoKC9eaHR0cHNcOlwvXC8vKSkKICAgICAgICAKICAgICAgICBpZighdXBkYXRlbm90ZSl7CiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QgYWdlID0gTWF0aC5yb3VuZCgoRGF0ZS5ub3coKSAvIDEwMDAgLSB1cGRhdGVub3RlLmNyZWF0ZWRfYXQpIC8gMzYwMCAvIDI0KQogICAgICAgIGNvbnN0IG5vdGVpZCA9IGJlY2gzMi5lbmNvZGUoIm5vdGUiLCBmcm9tSGV4U3RyaW5nKHVwZGF0ZW5vdGUuaWQpKQogICAgICAgIHFzKCIjcmVsZWFzZSIpLmhyZWYgPSBwcm90b2NvbCArIG5vdGVpZAogICAgICAgIHFzKCIjcmVsZWFzZSIpLmlubmVyVGV4dCA9IChhZ2UgPT0gMCAmJiAidG9kYXkiIHx8IGFnZSArICIgZGF5KHMpIGFnbyIpCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHNsZWVwKG1zKXsKICAgICAgICByZXR1cm4gbmV3IGZ1bmN0aW9uKCl7CiAgICAgICAgICBsZXQgdGltZW91dCA9IG51bGwKICAgICAgICAgIGxldCByID0gbnVsbAogICAgICAgICAgCiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICBwcm9taXNlOiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpewogICAgICAgICAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHJlc29sdmUoKSwgbXMpCiAgICAgICAgICAgICAgciA9IHJlc29sdmUKICAgICAgICAgICAgfSksCiAgICAgICAgICAgIHJlc29sdmU6IGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpCiAgICAgICAgICAgICAgcigpCiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHNob3coaWQpewogICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAiaGlkZGVuIgogICAgICAgIGNvbnN0IGl0ZW0gPSBnaWQoaWQpWyJkYXRhLWl0ZW0iXQogICAgICAgIGNvbnN0IG1lZGlhID0gZ2lkKCJtZWRpYS1jb250YWluZXIiKQogICAgICAgIGNvbnN0IGltYWdlID0gZ2lkKCJpbWFnZSIpCgogICAgICAgIGlmKGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpKXsKICAgICAgICAgIGltYWdlLmNsYXNzTGlzdC5yZW1vdmUoInZpc2libGUiKQogICAgICAgICAgY29uc3QgdiA9IGdpZChpZCkucXVlcnlTZWxlY3RvcigidmlkZW8iKQogICAgICAgICAgcXMoIiNtZWRpYS1jb250YWluZXIiKS5hcHBlbmRDaGlsZCh2KQogICAgICAgICAgdi5tdXRlZCA9IGZhbHNlCiAgICAgICAgICB2LmNsYXNzTGlzdC5yZW1vdmUoInNob3ciKQogICAgICAgICAgdi5wbGF5KCkKICAgICAgICB9ZWxzZXsKICAgICAgICAgIGltYWdlLnNyYyA9IGl0ZW0udXJsCiAgICAgICAgICBpbWFnZS5jbGFzc0xpc3QuYWRkKCJ2aXNpYmxlIikKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoaXRlbS5tZXRhKXsKICAgICAgICAgIGNvbnN0IG1ldGFjb250ZW50ID0gSlNPTi5wYXJzZShpdGVtLm1ldGEuY29udGVudCkKICAgICAgICAgIGNvbnN0IG5hbWUgPSBtZXRhY29udGVudC5kaXNwbGF5X25hbWUgfHwgbWV0YWNvbnRlbnQubmFtZQogICAgICAgICAgcXMoIiNpbWFnZS11c2VyIikuY2xhc3NMaXN0LmFkZCgidmlzaWJsZSIpCiAgICAgICAgICBxcygiI2ltYWdlLXVzZXIiKS5ocmVmID0gcHJvdG9jb2wgKyBiZWNoMzIuZW5jb2RlKCJucHViIiwgZnJvbUhleFN0cmluZyhpdGVtLm1ldGEucHVia2V5KSkKICAgICAgICAgIHFzKCIjaW1hZ2UtdXNlciIpLmlubmVyVGV4dCA9IG5hbWUKICAgICAgICB9ZWxzZXsKICAgICAgICAgIHFzKCIjaW1hZ2UtdXNlciIpLmNsYXNzTGlzdC5yZW1vdmUoInZpc2libGUiKQogICAgICAgIH0KCiAgICAgICAgZ2lkKCJpbWFnZS1saWtlIilbImRhdGEtaXRlbS1pZCJdID0gaWQKICAgICAgICBnaWQoIm1lZGlhLWZvb3RlciIpWyJkYXRhLWV2ZW50Il0gPSBpdGVtLmV2ZW50CgogICAgICAgIGlmKGl0ZW0ucmVhY3RlZCl7CiAgICAgICAgICBnaWQoImltYWdlLWxpa2UiKS5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QgYSA9IHFzKCIjaW1hZ2UtcXVlcnkiKQogICAgICAgIGEuaHJlZiA9IHByb3RvY29sICsgaXRlbS5iZWNoMzJpZAogICAgICAgIGEuaW5uZXJUZXh0ID0gZ2lkKGlkKVsiZGF0YS10ZXh0Il0KICAgICAgICAKICAgICAgICBnaWQoIm1lZGlhLWNvbnRhaW5lciIpLmNsYXNzTGlzdC5hZGQoInZpc2libGUiKQogICAgICAgIGdpZCgibWVkaWEtZm9vdGVyIikuY2xhc3NMaXN0LmFkZCgidmlzaWJsZSIpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGNvbm5jb3VudCgpewogICAgICAgIHJldHVybiBzb2NrZXRzLmZpbHRlcihyID0+IHIucmVhZHlTdGF0ZSA9PSAxKS5sZW5ndGgKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gZGlzY29ubmVjdCgpewogICAgICAgIGZvcihsZXQgc29ja2V0IG9mIHNvY2tldHMpewogICAgICAgICAgc29ja2V0LmNsb3NlKCkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgc29ja2V0cy5zcGxpY2UoMCkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gbG9nKG1zZyl7CiAgICAgICAgbGV0IHNjcm9sbCA9IHFzKCIjbG9ncyIpLnNjcm9sbFRvcCA9PSBxcygiI2xvZ3MiKS5zY3JvbGxUb3BNYXgKICAgICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKQogICAgICAgIGRpdi5pbm5lclRleHQgPSBBcnJheS5mcm9tKGFyZ3VtZW50cykuam9pbigiICIpCiAgICAgICAgcXMoIiNsb2dzIikuYXBwZW5kKGRpdikKICAgICAgICAKICAgICAgICBzY3JvbGwgJiYgcXMoIiNsb2dzIikuc2Nyb2xsVG8oMCwgcXMoIiNsb2dzIikuc2Nyb2xsVG9wTWF4KQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBjb25uZWN0KHVybCl7CiAgICAgICAgbG9nKCJjb25uZWN0aW5nIiwgdXJsKQogICAgICAgIGxldCBzb2NrZXQgPSBuZXcgV2ViU29ja2V0KHVybCkKICAgICAgICAKICAgICAgICBzb2NrZXQub25tZXNzYWdlID0gbWVzc2FnZSA9PiByZXNoYW5kbGVycy5mb3JFYWNoKHJoID0+IHJoLmhhbmRsZShtZXNzYWdlKSkKICAgICAgICAKICAgICAgICBzb2NrZXQub25jbG9zZSA9IGFzeW5jIGZ1bmN0aW9uKCl7CiAgICAgICAgICBzb2NrZXRzLnNwbGljZShzb2NrZXRzLmluZGV4T2Yoc29ja2V0KSwgMSkKICAgICAgICAgIHFzKCIjY29ubmNvdW50IikuaW5uZXJUZXh0ID0gY29ubmNvdW50KCkgKyAocHJpbWFsc29ja2V0ICYmIDEpCiAgICAgICAgICBsb2coImRpc2Nvbm5lY3RlZCIsIHRoaXMudXJsLCBjb25uY291bnQoKSkKICAgICAgICAgIGF3YWl0IHNsZWVwKDEwMDApLnByb21pc2UKICAgICAgICAgIGNvbm5lY3QodGhpcy51cmwpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHNvY2tldC5vbm9wZW4gPSBmdW5jdGlvbigpewogICAgICAgICAgcXMoIiNjb25uY291bnQiKS5pbm5lclRleHQgPSBjb25uY291bnQoKSArIChwcmltYWxzb2NrZXQgJiYgMSkKICAgICAgICAgIGxvZygiY29ubmVjdGVkIiwgdGhpcy51cmwsIGNvbm5jb3VudCgpKQogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4gc29ja2V0CiAgICAgIH0KICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLCBhc3luYyAoKSA9PiB7CiAgICAgICAgcHJpbWFsc29ja2V0ID0gY29ubmVjdCgid3NzOi8vY2FjaGUzLnByaW1hbC5uZXQvY2FjaGUxNyIpCiAgICAgICAgcHJpbWFsc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoIm9wZW4iLCBmdW5jdGlvbigpewogICAgICAgICAgcHJpbWFsZ2xvYmFsKHRoaXMpCiAgICAgICAgfSkKICAgICAgICAKICAgICAgICBwcmltYWxzb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcigiY2xvc2UiLCBmdW5jdGlvbigpewogICAgICAgICAgcHJpbWFsc29ja2V0ID0gbnVsbAogICAgICAgIH0pCiAgICAgICAgCiAgICAgICAgZm9yKGxldCB1cmwgb2YgcmVsYXlzKCkpewogICAgICAgICAgY29uc3Qgc29ja2V0ID0gY29ubmVjdCh1cmwpCiAgICAgICAgICBzb2NrZXRzLnB1c2goc29ja2V0KQogICAgICAgICAgCiAgICAgICAgICBzb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcigib3BlbiIsIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgIGNoZWNrdXBkYXRlKHRoaXMpCiAgICAgICAgICAgIHF1ZXJ5KHRoaXMpCiAgICAgICAgICB9KQogICAgICAgIH0KICAgICAgICAKICAgICAgICBhd2FpdCBzbGVlcCgxMDApLnByb21pc2UKICAgICAgICAKICAgICAgICBpZihoYXNrZXkoKSl7CiAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoIm5vc3RyIikKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBmb3IobGV0IGMgb2YgY29sb3B0cyl7CiAgICAgICAgZG9jdW1lbnQud3JpdGUoJzxzdHlsZT4nICsgY29sc2Nzcy5pbm5lclRleHQucmVwbGFjZSgvXCRce2NvbHNcfS9nLCBjKSArICc8L3N0eWxlPicpCiAgICAgIH0KICAgIDwvc2NyaXB0PgogIDwvYm9keT4KPC9odG1sPgo=

https://ipfs.io/ipfs/Qmc4TZJKrYv7YrtD7DVdoCjR9EKHx4HEmoTvWPwP5GDycw

sha256

aae3440dec85e862e6e236e5b62dbe1a054daab698d463064bc181f5d3853ce2 files.html

base64

PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgdXNlci1zY2FsYWJsZT1ubyIvPgogICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL3N2Z2ljb25zLnNwYXJray5mci9zdmdpY29ucy5jc3MiLz4KICAgIDxzdHlsZT4KICAgICAgKiB7CiAgICAgICAgb3ZlcnNjcm9sbC1iZWhhdmlvci15OiBjb250YWluOwogICAgICB9CiAgICAgIAogICAgICBib2R5IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB3aWR0aDogMTAwdnc7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIGZvbnQtZmFtaWx5OiAiTm90byBTZXJpZiI7CiAgICAgIH0KICAgICAgCiAgICAgIC5wbGFjZWhvbGRlciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICBwYWRkaW5nOiAxZW07CiAgICAgIH0KICAgICAgCiAgICAgIGgxIHsKICAgICAgICBmb250LXNpemU6IDFlbTsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnlkaXNwbGF5LCAKICAgICAgI2hlYWRlciB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgfQogICAgICAKICAgICAgI3JlbGF5cywKICAgICAgI2xvZ3MsIAogICAgICAjcHJpdmtleSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgd2lkdGg6IDE4ZW07CiAgICAgICAgYmFja2dyb3VuZDogIzExMTsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgI3JlbGF5cywKICAgICAgI2xvZ3MgewogICAgICAgIGhlaWdodDogNmVtOwogICAgICB9CiAgICAgIAogICAgICAjbG9ncyB7CiAgICAgICAgaGVpZ2h0OiA4ZW07CiAgICAgICAgb3ZlcmZsb3c6IHNjcm9sbDsKICAgICAgICBmb250LXNpemU6IC44ZW07CiAgICAgIH0KICAgICAgCiAgICAgIHNlbGVjdCB7CiAgICAgICAgd2lkdGg6IDRlbTsKICAgICAgfQogICAgICAKICAgICAgI3JlbGF5cywgCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgYm9yZGVyLXJhZGl1czogLjVlbTsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSAudGV4dCwgCiAgICAgICNoZWFkZXIgYSwKICAgICAgI21lZGlhLWNvbnRhaW5lciB7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgYSwgCiAgICAgIGZvcm0sIAogICAgICAjcXVlcnlkaXNwbGF5IHsKICAgICAgICB6LWluZGV4OiAxOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgICAKICAgICAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAzMGVtKSB7CiAgICAgICAgI2hlYWRlciAudGl0bGUgewogICAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgI3F1ZXJ5ZGlzcGxheSB7CiAgICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIH0KICAgICAgfQoKICAgICAgZm9ybSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnkgewogICAgICAgIHdpZHRoOiA2ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNsb2FkaW5nIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDBweDsKICAgICAgICBsZWZ0OiAyN2VtOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICBhIHsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICAgIH0KCiAgICAgIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAKICAgICAgI21lZGlhLWNvbnRhaW5lciB2aWRlbyB7CiAgICAgICAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsKICAgICAgICBoZWlnaHQ6IDEwMCUgIWltcG9ydGFudDsKICAgICAgICBtYXJnaW4tdG9wOiAwICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgCiAgICAgIC50eXBlIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgei1pbmRleDogMTsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlLXF1ZXJ5IHsKICAgICAgICB3aWR0aDogNWVtOwogICAgICB9CiAgICAgIAogICAgICBhIHsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSwKICAgICAgYS5idXR0b24sCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgY29sb3I6ICM5OTk7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXkgewogICAgICAgIHBhZGRpbmc6IDAgMWVtOwogICAgICB9CgogICAgICAjcXVlcnlkaXNwbGF5IC50ZXh0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgbWluLXdpZHRoOiAzZW07CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgI2hlYWRlciBhLAogICAgICAjaGVhZGVyIHNwYW4gewogICAgICAgIHBhZGRpbmc6IDAuNWVtOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CgogICAgICAjaGVhZGVyIHsKICAgICAgICBwYWRkaW5nOiAwLjQ1ZW0gMDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CgogICAgICAjaGVhZGVyIC5pdGVtcyB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgLml0ZW1zIHsKICAgICAgICBtYXJnaW4tdG9wOiAuM2VtOwogICAgICB9CgogICAgICBwIHsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICB9CiAgICAgIAogICAgICAubGFiZWwgewogICAgICAgIHBhZGRpbmc6IC44ZW0gLjhlbSAuOGVtIDA7CiAgICAgIH0KCiAgICAgICNpbWFnZXMgLnF1ZXJ5IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KCiAgICAgICNtZWRpYS1jb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwKTsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHotaW5kZXg6IDQ7CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZS1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlIHsKICAgICAgICBtYXgtd2lkdGg6IDEwMHZ3OwogICAgICAgIG1heC1oZWlnaHQ6IDEwMHZoOwogICAgICB9CiAgICAgICAgCiAgICAgICNpbWFnZXMgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgICNpbWFnZXMgLml0ZW0gewogICAgICAgIHdpZHRoOiAyNXZ3OwogICAgICAgIGhlaWdodDogMjV2dzsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOwogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5kaWFsb2cgaW1nIHsKICAgICAgICB3aWR0aDogMTV2dzsKICAgICAgfQogICAgICAKICAgICAgI21lZGlhLWNvbnRhaW5lciB2aWRlbyB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgfQogICAgICAKICAgICAgYm9keTpub3QoLm5vc3RyKSAjaGVhZGVyIC5pY29ucywgCiAgICAgIC5maWx0ZXItbGlrZXMgI2ltYWdlcyA+IC5pdGVtOm5vdCgucmVhY3RlZCkgewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQogICAgICAKICAgICAgLnF1ZXJ5LCAKICAgICAgLmxpa2UsIAogICAgICAjaW1hZ2UtcXVlcnksCiAgICAgICNpbWFnZS11c2VyIHsKICAgICAgICB6LWluZGV4OiAyOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3JkZXItcmFkaXVzOiAzdnc7CiAgICAgIH0KICAgICAgCiAgICAgIC5xdWVyeSwgCiAgICAgIC5saWtlIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcGFkZGluZzogMCAxdnc7CiAgICAgIH0KICAgICAgCiAgICAgIC5xdWVyeSwgCiAgICAgIC5saWtlLCAKICAgICAgI2ltYWdlLXF1ZXJ5LCAKICAgICAgLnZpZGVvc3ZnLAogICAgICAuaW1hZ2VzdmcgewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwwLDAsMC42KTsKICAgICAgfQogICAgICAKICAgICAgLnF1ZXJ5LCAKICAgICAgLmxpa2UsIAogICAgICAjaW1hZ2UtcXVlcnkgewogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBmb250LXNpemU6IG1pbigzLjV2dywgMS41ZW0pOwogICAgICAgIG1heC13aWR0aDogNWVtOwogICAgICB9CiAgICAgIAogICAgICAjaW1hZ2UtcXVlcnkgewogICAgICAgIHBhZGRpbmc6IC42ZW0gLjRlbSAuMWVtIC40ZW07CiAgICAgICAgbWF4LXdpZHRoOiA1ZW07CiAgICAgIH0KICAgICAgCiAgICAgIC5saWtlLnJlYWN0ZWQsCiAgICAgIC5maWx0ZXItbGlrZXMgI2ZpbHRlci1saWtlcyB7CiAgICAgICAgYmFja2dyb3VuZDogcmVkOwogICAgICB9CgogICAgICAjaW1hZ2UtcXVlcnksCiAgICAgICNpbWFnZS11c2VyIHsKICAgICAgICBmb250LXNpemU6IDNlbTsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlLXF1ZXJ5LAogICAgICAjaW1hZ2UtdXNlciwKICAgICAgI21lZGlhLWZvb3RlciAubGlrZSB7CiAgICAgICAgei1pbmRleDogNTsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZS1xdWVyeSwKICAgICAgI2ltYWdlLXVzZXIgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICAjaW1hZ2UtdXNlciB7CiAgICAgICAgYm90dG9tOiAxLjllbTsKICAgICAgICBmb250LXNpemU6IDEuOGVtOwogICAgICAgIHBhZGRpbmctcmlnaHQ6IC42NWVtOwogICAgICAgIG1heC13aWR0aDogOGVtOwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICB9CiAgICAgIAogICAgICAubGlrZSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiBhdXRvOwogICAgICAgIHBhZGRpbmc6IC4yZW07CiAgICAgICAgd2lkdGg6IDFlbTsKICAgICAgICBoZWlnaHQ6IDFlbTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICB9CgogICAgICAubm9zdHIgLmxpa2UgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOyAgCiAgICAgIH0KCiAgICAgICNtZWRpYS1mb290ZXIgLmxpa2UgewogICAgICAgIGZvbnQtc2l6ZTogMi40ZW07CiAgICAgIH0KCiAgICAgICNtZWRpYS1mb290ZXIgewogICAgICAgIGRpc3BsYXk6IG5vbmU7ICAKICAgICAgfQogIAogICAgICAjaW1hZ2VzIC5pbWcgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBiYWNrZ3JvdW5kLXNpemU6IGNvdmVyOwogICAgICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7CiAgICAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyOwogICAgICB9CgogICAgICAjbWVudS1jb250ZW50IC5pdGVtcyAuYnV0dG9uLmFjdGl2ZSB7CiAgICAgICAgYmFja2dyb3VuZDogIzQ0NDsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlcyA+IC5hY3RpdmUgewogICAgICAgIG91dGxpbmU6IC4zZW0gc29saWQgZ3JlZW47CiAgICAgICAgei1pbmRleDogMTsKICAgICAgfQoKICAgICAgLmhlYXJ0c3ZnIHBhdGgsCiAgICAgIC5oZWFkZXItaWNvbiBzdmcgcGF0aCB7CiAgICAgICAgc3Ryb2tlOiAjZmZmOwogICAgICB9CiAgCiAgICAgIC52aWRlb3N2ZywKICAgICAgLmltYWdlc3ZnIHsKICAgICAgICB3aWR0aDogY2FsYyhtaW4oNHZ3LCAyZW0pKTsKICAgICAgICBoZWlnaHQ6IGNhbGMobWluKDR2dywgMmVtKSk7CiAgICAgICAgcGFkZGluZzogMCAuMmVtOwogICAgICB9CiAgICAgIAogICAgICAudmlkZW9zdmcgcGF0aCwKICAgICAgLmltYWdlc3ZnIHBhdGggewogICAgICAgIGZpbGw6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgIGEjbWVudSwgCiAgICAgIC5oZWFkZXItaWNvbiB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWFyZ2luLXRvcDogLS4zZW07CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgfQoKICAgICAgLmljb25zIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgei1pbmRleDogMjsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICB9CiAgICAgIAogICAgICBhI21lbnUgewogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIHBhZGRpbmc6IDAgLjVlbTsKICAgICAgICBoZWlnaHQ6IDIuMWVtOwogICAgICB9CiAgICAgIAogICAgICAjaGVhZGVyIC5oZWFkZXItaWNvbiB7CiAgICAgICAgcGFkZGluZzogLjJlbTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgd2lkdGg6IDEuNWVtOwogICAgICAgIGhlaWdodDogMS41ZW07CiAgICAgICAgbWFyZ2luOiAuMWVtIC41ZW07CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICB9CiAgICAgIAogICAgICAuaGVhZGVyLWljb24gc3ZnIHsKICAgICAgICB3aWR0aDogMS41ZW07CiAgICAgICAgaGVpZ2h0OiAxLjVlbTsKICAgICAgfQogICAgICAgCiAgICAgIC5tZW51c3ZnIHsKICAgICAgICB3aWR0aDogMmVtOwogICAgICAgIGhlaWdodDogMmVtOwogICAgICB9CgogICAgICAubWVudXN2ZyBwYXRoIHsKICAgICAgICBmaWxsOiAjZmZmOwogICAgICB9CgogICAgICAjbWVudS1jb250ZW50IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIGhlaWdodDogMTAwdmg7CiAgICAgICAgd2lkdGg6IDE4ZW07CiAgICAgICAgbWFyZ2luLWxlZnQ6IC0xOGVtOwogICAgICAgIGJhY2tncm91bmQ6ICMyMjI7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHotaW5kZXg6IDM7IAogICAgICAgIG92ZXJmbG93OiBzY3JvbGw7CiAgICAgIH0KCiAgICAgICNtZW51LWNvbnRlbnQudmlzaWJsZSB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDA7CiAgICAgIH0KICAgICAgCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIHsKICAgICAgICBwYWRkaW5nOiAxZW07CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIGEuYnV0dG9uLAogICAgICBpbnB1dC5zdWJtaXQgewogICAgICAgIHBhZGRpbmc6IC41ZW0gLjdlbTsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgYmFja2dyb3VuZDogIzExMTsKICAgICAgfQoKICAgICAgI292ZXJsYXkgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgei1pbmRleDogMzsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgb3BhY2l0eTogLjU7CiAgICAgIH0KCiAgICAgIC52aXNpYmxlIHsKICAgICAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OwogICAgICB9CiAgICAgIAogICAgICAjc2hhcmUtZGlhbG9nIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB3aWR0aDogY2FsYygxMDB2dyAtIDZlbSk7CiAgICAgICAgaGVpZ2h0OiA3MCU7CiAgICAgICAgYmFja2dyb3VuZDogI2ZmZjsKICAgICAgICBib3JkZXItcmFkaXVzOiAxZW07CiAgICAgICAgei1pbmRleDogNDsKICAgICAgICBtYXJnaW4tbGVmdDogMmVtOwogICAgICAgIG1hcmdpbi10b3A6IDJlbTsKICAgICAgICBwYWRkaW5nOiAxZW07CiAgICAgIH0KICAgICAgCiAgICAgIGgyIHsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICB9CiAgICAgIAogICAgICBzdmcgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAjdGVtcGxhdGUgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGRpdiBpZD0idGVtcGxhdGUiPgogICAgICA8c3ZnIGNsYXNzPSJoZWFydHN2ZyBzdmctaWNvbiIgdmlld0JveD0iMCAwIDIwIDIwIj4KICAgICAgICA8cGF0aCBkPSJNOS43MTksMTcuMDczbC02LjU2Mi02LjUxYy0wLjI3LTAuMjY4LTAuNTA0LTAuNTY3LTAuNjk2LTAuODg4QzEuMzg1LDcuODksMS42Nyw1LjYxMywzLjE1NSw0LjE0YzAuODY0LTAuODU2LDIuMDEyLTEuMzI5LDMuMjMzLTEuMzI5YzEuOTI0LDAsMy4xMTUsMS4xMiwzLjYxMiwxLjc1MmMwLjQ5OS0wLjYzNCwxLjY4OS0xLjc1MiwzLjYxMi0xLjc1MmMxLjIyMSwwLDIuMzY5LDAuNDcyLDMuMjMzLDEuMzI5YzEuNDg0LDEuNDczLDEuNzcxLDMuNzUsMC42OTMsNS41MzdjLTAuMTksMC4zMi0wLjQyNSwwLjYxOC0wLjY5NSwwLjg4N2wtNi41NjIsNi41MUMxMC4xMjUsMTcuMjI5LDkuODc1LDE3LjIyOSw5LjcxOSwxNy4wNzMgTTYuMzg4LDMuNjFDNS4zNzksMy42MSw0LjQzMSw0LDMuNzE3LDQuNzA3QzIuNDk1LDUuOTIsMi4yNTksNy43OTQsMy4xNDUsOS4yNjVjMC4xNTgsMC4yNjUsMC4zNTEsMC41MSwwLjU3NCwwLjczMUwxMCwxNi4yMjhsNi4yODEtNi4yMzJjMC4yMjQtMC4yMjEsMC40MTYtMC40NjYsMC41NzMtMC43MjljMC44ODctMS40NzIsMC42NTEtMy4zNDYtMC41NzEtNC41NkMxNS41Nyw0LDE0LjYyMSwzLjYxLDEzLjYxMiwzLjYxYy0xLjQzLDAtMi42MzksMC43ODYtMy4yNjgsMS44NjNjLTAuMTU0LDAuMjY0LTAuNTM2LDAuMjY0LTAuNjksMEM5LjAyOSw0LjM5Nyw3LjgyLDMuNjEsNi4zODgsMy42MSI+PC9wYXRoPgogICAgICA8L3N2Zz4KICAgICAgPHN2ZyBjbGFzcz0idmlkZW9zdmcgc3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CgkJCQk8cGF0aCBkPSJNMTguMTc1LDQuMTQySDEuOTUxQzEuNzAzLDQuMTQyLDEuNSw0LjM0NCwxLjUsNC41OTJ2MTAuODE2YzAsMC4yNDcsMC4yMDMsMC40NSwwLjQ1MSwwLjQ1aDE2LjIyNGMwLjI0NywwLDAuNDUtMC4yMDMsMC40NS0wLjQ1VjQuNTkyQzE4LjYyNSw0LjM0NCwxOC40MjIsNC4xNDIsMTguMTc1LDQuMTQyIE00LjY1NSwxNC45NTdIMi40MDF2LTEuODAzaDIuMjUzVjE0Ljk1N3pNNC42NTUsMTIuMjU0SDIuNDAxdi0xLjgwM2gyLjI1M1YxMi4yNTR6IE00LjY1NSw5LjU0OUgyLjQwMVY3Ljc0N2gyLjI1M1Y5LjU0OXogTTQuNjU1LDYuODQ2SDIuNDAxVjUuMDQzaDIuMjUzVjYuODQ2ek0xNC41NjksMTQuOTU3SDUuNTU2VjUuMDQzaDkuMDEzVjE0Ljk1N3ogTTE3LjcyNCwxNC45NTdoLTIuMjUzdi0xLjgwM2gyLjI1M1YxNC45NTd6IE0xNy43MjQsMTIuMjU0aC0yLjI1M3YtMS44MDNoMi4yNTNWMTIuMjU0ek0xNy43MjQsOS41NDloLTIuMjUzVjcuNzQ3aDIuMjUzVjkuNTQ5eiBNMTcuNzI0LDYuODQ2aC0yLjI1M1Y1LjA0M2gyLjI1M1Y2Ljg0NnoiPjwvcGF0aD4KCQkJPC9zdmc+CgkJCTxzdmcgY2xhc3M9ImltYWdlc3ZnIHN2Zy1pY29uIiB2aWV3Qm94PSIwIDAgMjAgMjAiPgoJCQkJPHBhdGggZD0iTTE4LjU1NSwxNS4zNTRWNC41OTJjMC0wLjI0OC0wLjIwMi0wLjQ1MS0wLjQ1LTAuNDUxSDEuODg4Yy0wLjI0OCwwLTAuNDUxLDAuMjAzLTAuNDUxLDAuNDUxdjEwLjgwOGMwLDAuNTU5LDAuNzUxLDAuNDUxLDAuNDUxLDAuNDUxaDE2LjIxN2gwLjAwNUMxOC43OTMsMTUuODUxLDE4LjQ3OCwxNC44MTQsMTguNTU1LDE1LjM1NCBNMi44LDE0Ljk0OWw0Ljk0NC02LjQ2NGw0LjE0NCw1LjQxOWMwLjAwMywwLjAwMywwLjAwMywwLjAwMywwLjAwMywwLjAwNWwwLjc5NywxLjA0SDIuOHogTTEzLjgyMiwxNC45NDlsLTEuMDA2LTEuMzE3bDEuNjg5LTIuMjE4bDIuNjg4LDMuNTM1SDEzLjgyMnogTTE3LjY1NCwxNC4wNjRsLTIuNzkxLTMuNjY2Yy0wLjE4MS0wLjIzNy0wLjUzNS0wLjIzNy0wLjcxNiwwbC0xLjg5OSwyLjQ5M2wtNC4xNDYtNS40MmMtMC4xOC0wLjIzNy0wLjUzNi0wLjIzNy0wLjcxNiwwbC01LjA0Nyw2LjU5OFY1LjA0MmgxNS4zMTZWMTQuMDY0eiBNMTIuNDc0LDYuMzkzYy0wLjg2OSwwLTEuNTc3LDAuNzA3LTEuNTc3LDEuNTc2czAuNzA4LDEuNTc2LDEuNTc3LDEuNTc2czEuNTc3LTAuNzA3LDEuNTc3LTEuNTc2UzEzLjM0Myw2LjM5MywxMi40NzQsNi4zOTMgTTEyLjQ3NCw4LjY0NWMtMC4zNzEsMC0wLjY3Ni0wLjMwNC0wLjY3Ni0wLjY3NnMwLjMwNS0wLjY3NiwwLjY3Ni0wLjY3NmMwLjM3MiwwLDAuNjc2LDAuMzA0LDAuNjc2LDAuNjc2UzEyLjg0Niw4LjY0NSwxMi40NzQsOC42NDUiPjwvcGF0aD4KCQkJPC9zdmc+CiAgICAgIDxkaXYgaWQ9ImNvbHNjc3MiPgogICAgICAuY29scyR7Y29sc30gI2ltYWdlcyAuaXRlbSB7CiAgICAgICAgd2lkdGg6IGNhbGMoMTAwdncgLyAke2NvbHN9KTsKICAgICAgfQoKICAgICAgLmNvbHMke2NvbHN9ICNpbWFnZXMgLml0ZW0gewogICAgICAgIGhlaWdodDogY2FsYygxMDB2dyAvICR7Y29sc30pOwogICAgICB9CiAgICAgIAogICAgICAuY29scyR7Y29sc30gLnF1ZXJ5LAogICAgICAuY29scyR7Y29sc30gLmxpa2UgewogICAgICAgIGZvbnQtc2l6ZTogbWluKDE0dncgKiAoMSAvICR7Y29sc30pLCA2ZW0gKiAoMSAvICR7Y29sc30pKQogICAgICB9CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJzaGFyZS1kaWFsb2ciIGNsYXNzPSJkaWFsb2ciPgogICAgICA8aDI+c2hhcmU8L2gyPgogICAgICA8Zm9ybSBpZD0ic2hhcmUtZm9ybSIgYWN0aW9uPSIjIj4KICAgICAgICA8cCBjbGFzcz0iY29udGVudCI+PC9wPgogICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIGNsYXNzPSJzdWJtaXQiIHZhbHVlPSJvayIvPgogICAgICA8L2Zvcm0+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9Im1lZGlhLWZvb3RlciI+CiAgICAgIDxhIGlkPSJpbWFnZS1saWtlIiBjbGFzcz0ibGlrZSIgaHJlZj0iIyI+PC9hPgogICAgICA8YSBpZD0iaW1hZ2UtcXVlcnkiIGhyZWY9IiMiPjwvYT4KICAgICAgPGEgaWQ9ImltYWdlLXVzZXIiIGhyZWY9IiMiPjwvYT4KICAgIDwvZGl2PgogICAgPGNlbnRlciBpZD0ibWVkaWEtY29udGFpbmVyIj4KICAgICAgPGRpdiBpZD0iaW1hZ2UtY29udGFpbmVyIj4KICAgICAgICA8aW1nIGlkPSJpbWFnZSIvPgogICAgICA8L2Rpdj4KICAgIDwvY2VudGVyPgogICAgPGRpdiBpZD0ib3ZlcmxheSIgY2xhc3M9ImRpYWxvZyI+PC9kaXY+CiAgICA8ZGl2IGlkPSJtZW51LWNvbnRlbnQiIGNsYXNzPSJkaWFsb2ciPgogICAgICA8ZGl2IGNsYXNzPSJpdGVtcyI+CiAgICAgICAgPGgxPjxhIGNsYXNzPSJ0aXRsZSIgaHJlZj0iIyI+ZmlsZXMuaHRtbDwvYT48L2gxPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5hdXRvcGxheTwvZGl2PgogICAgICAgIDxhIGNsYXNzPSJidXR0b24gc2V0YXV0b3BsYXkiIGRhdGEtYXV0b3BsYXk9Im9uIiBocmVmPSIjIj5vbjwvYT4KICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIHNldGF1dG9wbGF5IiBkYXRhLWF1dG9wbGF5PSJvZmYiIGhyZWY9IiMiPm9mZjwvYT4KICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIHNldGF1dG9wbGF5IiBkYXRhLWF1dG9wbGF5PSJob3ZlciIgaHJlZj0iIyI+bW91c2VvdmVyPC9hPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5jb2x1bW5zPC9kaXY+CiAgICAgICAgPGEgY2xhc3M9ImJ1dHRvbiBzZXRjb2xzIiBkYXRhLWNvbHM9IjEiIGhyZWY9IiMiPjE8L2E+CiAgICAgICAgPGEgY2xhc3M9ImJ1dHRvbiBzZXRjb2xzIiBkYXRhLWNvbHM9IjIiIGhyZWY9IiMiPjI8L2E+CiAgICAgICAgPGEgY2xhc3M9ImJ1dHRvbiBzZXRjb2xzIiBkYXRhLWNvbHM9IjQiIGhyZWY9IiMiPjQ8L2E+CiAgICAgICAgPGEgY2xhc3M9ImJ1dHRvbiBzZXRjb2xzIiBkYXRhLWNvbHM9IjYiIGhyZWY9IiMiPjY8L2E+CiAgICAgICAgPGEgY2xhc3M9ImJ1dHRvbiBzZXRjb2xzIiBkYXRhLWNvbHM9IjEwIiBocmVmPSIjIj4xMDwvYT4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+Y29ubmVjdGlvbnM8L2Rpdj4KICAgICAgICA8ZGl2IGlkPSJjb25uY291bnQiPjA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+cmVsYXlzOjwvZGl2PgogICAgICAgIDxwPlBsZWFzZSB1c2UgcmVsYXlzIHdpdGggTklQLTUwIChzZWFyY2gpIGZ1bmN0aW9uYWxpdHk8L3A+CiAgICAgICAgPGZvcm0gYWN0aW9uPSIjIiBpZD0icmVsYXlzLWZvcm0iPgogICAgICAgICAgPHRleHRhcmVhIGlkPSJyZWxheXMiPjwvdGV4dGFyZWE+CiAgICAgICAgICA8aW5wdXQgY2xhc3M9InN1Ym1pdCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0ic2F2ZSByZWxheXMiLz4KICAgICAgICA8L2Zvcm0+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPnByaXZhdGUga2V5OjwvZGl2PgogICAgICAgIDxwPklmIHlvdSBjYW50IHVzZSBicm93c2VyIGFkZG9uIChtb2JpbGUpPC9wPgogICAgICAgIDxmb3JtIGFjdGlvbj0iIyIgaWQ9InByaXZrZXktZm9ybSI+CiAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9InByaXZrZXkiLz4KICAgICAgICAgIDxpbnB1dCBjbGFzcz0ic3VibWl0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJzYXZlIGtleSIvPgogICAgICAgIDwvZm9ybT4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+bG9nczwvZGl2PgogICAgICAgIDxkaXYgaWQ9ImxvZ3MiPjwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5sYXRlc3QgcmVsZWFzZTo8L2Rpdj4KICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIiBpZD0icmVsZWFzZSIgaHJlZj0iIyI+PC9hPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0iaGVhZGVyIj4KICAgICAgPGRpdiBjbGFzcz0iaWNvbnMiPgogICAgICAgIDxhIGlkPSJmaWx0ZXItbGlrZXMiIGhyZWY9IiMiIGNsYXNzPSJoZWFkZXItaWNvbiI+PC9hPgogICAgICAgIDxhIGlkPSJzaGFyZSIgaHJlZj0iIyIgY2xhc3M9ImhlYWRlci1pY29uIj4KICAgICAgICAgIDxzdmcgY2xhc3M9InN2Zy1pY29uIiB2aWV3Qm94PSIwIDAgMjAgMjAiPgoJCQkJICAgIDxwYXRoIGQ9Ik0xNC42OCwxMi42MjFjLTAuOSwwLTEuNzAyLDAuNDMtMi4yMTYsMS4wOWwtNC41NDktMi42MzdjMC4yODQtMC42OTEsMC4yODQtMS40NTcsMC0yLjE0Nmw0LjU0OS0yLjYzOGMwLjUxNCwwLjY2MSwxLjMxNSwxLjA5LDIuMjE2LDEuMDljMS41NDksMCwyLjgwOS0xLjI2LDIuODA5LTIuODA4YzAtMS41NDgtMS4yNi0yLjgwOS0yLjgwOS0yLjgwOWMtMS41NDgsMC0yLjgwOCwxLjI2LTIuODA4LDIuODA5YzAsMC4zOCwwLjA3NiwwLjc0MSwwLjIxNCwxLjA3M2wtNC41NSwyLjYzOGMtMC41MTUtMC42NjEtMS4zMTYtMS4wOS0yLjIxNy0xLjA5Yy0xLjU0OCwwLTIuODA4LDEuMjYtMi44MDgsMi44MDlzMS4yNiwyLjgwOCwyLjgwOCwyLjgwOGMwLjksMCwxLjcwMi0wLjQzLDIuMjE3LTEuMDlsNC41NSwyLjYzN2MtMC4xMzgsMC4zMzItMC4yMTQsMC42OTMtMC4yMTQsMS4wNzRjMCwxLjU0OSwxLjI2LDIuODA5LDIuODA4LDIuODA5YzEuNTQ5LDAsMi44MDktMS4yNiwyLjgwOS0yLjgwOVMxNi4yMjksMTIuNjIxLDE0LjY4LDEyLjYyMU0xNC42OCwyLjUxMmMxLjEzNiwwLDIuMDYsMC45MjMsMi4wNiwyLjA2UzE1LjgxNSw2LjYzLDE0LjY4LDYuNjNzLTIuMDU5LTAuOTIzLTIuMDU5LTIuMDU5UzEzLjU0NCwyLjUxMiwxNC42OCwyLjUxMk01LjMxOSwxMi4wNjFjLTEuMTM2LDAtMi4wNi0wLjkyNC0yLjA2LTIuMDZzMC45MjMtMi4wNTksMi4wNi0yLjA1OWMxLjEzNSwwLDIuMDYsMC45MjMsMi4wNiwyLjA1OVM2LjQ1NCwxMi4wNjEsNS4zMTksMTIuMDYxTTE0LjY4LDE3LjQ4OGMtMS4xMzYsMC0yLjA1OS0wLjkyMi0yLjA1OS0yLjA1OXMwLjkyMy0yLjA2MSwyLjA1OS0yLjA2MXMyLjA2LDAuOTI0LDIuMDYsMi4wNjFTMTUuODE1LDE3LjQ4OCwxNC42OCwxNy40ODgiPjwvcGF0aD4KCQkJICAgIDwvc3ZnPgoJCQkgIDwvYT4KCQkJPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9Iml0ZW1zIj4KICAgICAgICA8YSBjbGFzcz0idGl0bGUiIGhyZWY9IiMiPmZpbGVzLmh0bWw8L2E+CiAgICAgICAgPGEgaWQ9Im1lbnUiIGhyZWY9IiMiPgogICAgICAgICAgPHN2ZyBjbGFzcz0ibWVudXN2ZyBzdmctaWNvbiIgdmlld0JveD0iMCAwIDIwIDIwIj4KCQkgICAgICAgIDxwYXRoIGQ9Ik0xMCwxLjQ0NWMtNC43MjYsMC04LjU1NSwzLjgyOS04LjU1NSw4LjU1NWMwLDQuNzI1LDMuODI5LDguNTU1LDguNTU1LDguNTU1YzQuNzI1LDAsOC41NTUtMy44Myw4LjU1NS04LjU1NUMxOC41NTUsNS4yNzQsMTQuNzI1LDEuNDQ1LDEwLDEuNDQ1IE0xMCwxNy42NTRjLTQuMjIxLDAtNy42NTQtMy40MzQtNy42NTQtNy42NTRjMC00LjIyMSwzLjQzMy03LjY1NCw3LjY1NC03LjY1NGM0LjIyMiwwLDcuNjU0LDMuNDMzLDcuNjU0LDcuNjU0QzE3LjY1NCwxNC4yMjEsMTQuMjIyLDE3LjY1NCwxMCwxNy42NTQgTTE0LjM5LDEwYzAsMC4yNDgtMC4yMDMsMC40NS0wLjQ1LDAuNDVINi4wNmMtMC4yNDgsMC0wLjQ1LTAuMjAzLTAuNDUtMC40NXMwLjIwMy0wLjQ1LDAuNDUtMC40NWg3Ljg3OUMxNC4xODcsOS41NSwxNC4zOSw5Ljc1MiwxNC4zOSwxMCBNMTQuMzksMTIuNzAyYzAsMC4yNDctMC4yMDMsMC40NDktMC40NSwwLjQ0OUg2LjA2Yy0wLjI0OCwwLTAuNDUtMC4yMDItMC40NS0wLjQ0OWMwLTAuMjQ4LDAuMjAzLTAuNDUxLDAuNDUtMC40NTFoNy44NzlDMTQuMTg3LDEyLjI1MSwxNC4zOSwxMi40NTQsMTQuMzksMTIuNzAyIE0xNC4zOSw3LjI5OGMwLDAuMjQ4LTAuMjAzLDAuNDUtMC40NSwwLjQ1SDYuMDZjLTAuMjQ4LDAtMC40NS0wLjIwMy0wLjQ1LTAuNDVzMC4yMDMtMC40NSwwLjQ1LTAuNDVoNy44NzlDMTQuMTg3LDYuODQ4LDE0LjM5LDcuMDUxLDE0LjM5LDcuMjk4Ij48L3BhdGg+CgkgICAgICAgIDwvc3ZnPgogICAgICAgIDwvYT4KICAgICAgICA8Zm9ybSBpZD0icXVlcnktZm9ybSIgYWN0aW9uPSIjIj4KICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0icXVlcnkiIG5hbWU9InF1ZXJ5IiBpZD0iIiAvPgogICAgICAgICAgPHNlbGVjdCBpZD0icXVlcnktdHlwZSI+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9ImFsbCI+YWxsPC9vcHRpb24+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9ImltYWdlIj5pbWFnZXM8L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0idmlkZW8iPnZpZGVvczwvb3B0aW9uPgogICAgICAgICAgPC9zZWxlY3Q+CiAgICAgICAgICA8aW5wdXQgaWQ9ImdvIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJnbyIvPgogICAgICAgIDwvZm9ybT4KICAgICAgICA8c3BhbiBpZD0icXVlcnlkaXNwbGF5Ij4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0ZXh0Ij48L3NwYW4+CiAgICAgICAgPC9zcGFuPgogICAgICAgIDxkaXYgaWQ9ImxvYWRpbmciPnVwZGF0aW5nPC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJwbGFjZWhvbGRlciI+U29tZXRoaW5nIHNob3VsZCBsb2FkIHNvb24sIG1heWJlLjwvZGl2PgogICAgPGRpdiBpZD0iaW1hZ2VzIj48L2Rpdj4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL3VucGtnLmNvbS9ub3N0ci10b29scy9saWIvbm9zdHIuYnVuZGxlLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL3Nsb3dsaS5naXRodWIuaW8vYmVjaDMyLWJ1ZmZlci9hc3NldHMvanMvYmVjaDMyLWJ1ZmZlci5taW4uanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdD4KICAgICAgY29uc3QgdXBkYXRlc3B1YmtleSA9ICJhZTVjNmUwYjc0NjYwZDIxOTRjODI1NGI1YzJjODI1Njc2NTc2YmUwMjk3Mzc5ZmEyMDUyMzExNGE2YTg1ZTg3IgogICAgICBjb25zdCBxdWVyaWVzID0geyAKICAgICAgICAiYXV0aG9yIjogJ1siUkVRIiwiPEk+Iix7ImtpbmRzIjpbMV0sImF1dGhvcnMiOlsiPFA+Il19XScKICAgICAgfQogICAgICBxcygiI3JlbGF5cyIpLnZhbHVlID0gcmVsYXlzKCkuam9pbigiXG4iKQogICAgICBxcygiI3ByaXZrZXkiKS52YWx1ZSA9IHByaXZrZXkoKQogICAgICBjb25zdCBjb2xvcHRzID0gWzEsIDIsIDQsIDYsIDEwXQoKICAgICAgY29scyA9ICgpID0+IHBhcnNlSW50KHNldHRpbmcoImNvbHMiLCBjb2xvcHRzWzJdKSwgMTApCiAgICAgIGF1dG9wbGF5ID0gKCkgPT4gc2V0dGluZygiYXV0b3BsYXkiLCAib2ZmIikKICAgICAgbGltaXQgPSAoKSA9PiBwYXJzZUludChzZXR0aW5nKCJsaW1pdCIsIDE1KSwgMTApCiAgICAgIGdhbGxlcnkgPSAoKSA9PiB7CiAgICAgICAgbGV0IGdhbGxlcnltYXRjaGVyID0gbG9jYXRpb24uc2VhcmNoLm1hdGNoKC9nYWxsZXJ5PShbYS16MC05XSspLykKICAgICAgICByZXR1cm4gZ2FsbGVyeW1hdGNoZXIgJiYgZ2FsbGVyeW1hdGNoZXJbMV0KICAgICAgfQogICAgICAKICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJjb2xzIiArIGNvbHMoKSkKCiAgICAgIGxldCBwcm90b2NvbCA9IG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS8pID8gIm5vc3RyOiIgOiAid2ViK25vc3RyOiIKICAgICAgbGV0IHNvY2tldHMgPSBbXQogICAgICBsZXQgcmVzaGFuZGxlcnMgPSBbXQogICAgICBsZXQgdXJscyA9IFtdCiAgICAgIGxldCBsaWtlcyA9IFtdCiAgICAgIGxldCBuZXdsaWtlcyA9IFtdCiAgICAgIGxldCBpZGNvdW50ZXIgPSAwCiAgICAgIGxldCBxdWVyeXdhaXQgPSBudWxsCiAgICAgIGxldCBwcmltYWxzb2NrZXQgPSBudWxsCiAgICAgIGxldCB0eXBlcyA9IHsKICAgICAgICBpbWFnZTogWyJwbmciLCAianBnIiwgImpwZWciLCAid2VicCJdLAogICAgICAgIHZpZGVvOiBbIm1wNCIsICJ3ZWJtIl0KICAgICAgfQogICAgICBsZXQgaW1ncmVnZXggPSAvaHR0cCh8cylcOlwvXC9bXiBcbl0qP1wuKHBuZ3xqcGd8anBlZ3x3ZWJwKS9naQogICAgICBsZXQgdmlkZW9yZWdleCA9IC9odHRwKHxzKVw6XC9cL1teIFxuXSo/XC4obXA0fHdlYm0pL2dpCiAgICAgIGxldCB2aWRlb2V4dHJlZ2V4ID0gL1wuKG1wNHx3ZWJtKSQvaQogICAgICBsZXQgaW1nZXh0cmVnZXggPSAvXC4ocG5nfGpwZ3xqcGVnfHdlYnApJC9pCiAgICAgIHdhaXRtcyA9IDUwMDAwCiAgICAgIHF1ZXJ5c3RyID0gIiIKICAgICAgbGV0IHF1ZXJ5Y291bnQgPSAwCiAgICAgIGxldCBob3ZlcmVkdmlkZW8gPSBudWxsCiAgICAgIAogICAgICB1cGRhdGVxdWVyeSgpCiAgICAgIHFzKCIjaW1hZ2UtbGlrZSIpLmlubmVySFRNTCA9IHFzKCIjZmlsdGVyLWxpa2VzIikuaW5uZXJIVE1MID0gcXMoIiN0ZW1wbGF0ZSAuaGVhcnRzdmciKS5vdXRlckhUTUwKICAgICAgc2V0YWN0aXZlKCJzZXRjb2xzIiwgImNvbHMiLCBjb2xzKCkpCiAgICAgIHNldGFjdGl2ZSgic2V0YXV0b3BsYXkiLCAiYXV0b3BsYXkiLCBhdXRvcGxheSgpKQogICAgICAKICAgICAgZnVuY3Rpb24gZnJvbUhleFN0cmluZyhzdHIpewogICAgICAgIGxldCBidWZmZXIgPSBuZXcgVWludDhBcnJheShzdHIubGVuZ3RoIC8gMikKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmZlci5sZW5ndGg7IGkrKykgewogICAgICAgICAgYnVmZmVyW2ldID0gcGFyc2VJbnQoc3RyLnN1YnN0cigyICogaSwgMiksIDE2KQogICAgICAgIH0KICAgICAgICByZXR1cm4gYnVmZmVyCiAgICAgIH0KICAKICAgICAgZnVuY3Rpb24gcmVsYXlzKCl7CiAgICAgICAgY29uc3Qgb2JqID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgicmVsYXlzIikpCiAgICAgICAgY29uc3QgciA9IG9iaiAmJiBvYmouZmlsdGVyKHIgPT4gci5tYXRjaCgvd3NzOlwvXC8uKy8pKSB8fCBbXQogICAgICAgIAogICAgICAgIHJldHVybiByLmxlbmd0aCA+IDAgJiYgciB8fCBbCiAgICAgICAgICAid3NzOi8vcmVsYXkubm9zdHIuYmFuZCIsCiAgICAgICAgICAid3NzOi8vbmIucmVsYXkuY2VudGVyIiwgCiAgICAgICAgICAid3NzOi8vbm9zdHIuY29tcGlsZS1lcnJvci5uZXQiCiAgICAgICAgXQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBwcml2a2V5KCl7CiAgICAgICAgbGV0IGtleSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJwcml2a2V5IikgfHwgIiIKICAgICAgICAKICAgICAgICBpZihrZXkubGVuZ3RoID09IDYzKXsKICAgICAgICAgIGtleSA9IE5vc3RyVG9vbHMubmlwMTkuZGVjb2RlKGtleSkuZGF0YQogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4ga2V5Lmxlbmd0aCA9PSA2NCAmJiBrZXkgfHwgbnVsbAogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBzZXR0aW5nKGtleSwgZGVmYXVsdHZhbHVlKXsKICAgICAgICBjb25zdCB2ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KQogICAgICAgIHJldHVybiB2ICYmIG9wdGlvbigic2V0IiArIGtleSwga2V5LCB2KSAmJiB2IHx8IGRlZmF1bHR2YWx1ZQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBvcHRpb24oYywga2V5LCB2YWwpewogICAgICAgIHJldHVybiBxcygiLiIgKyBjICsgIltkYXRhLSIgKyBrZXkgKyAiPSciICsgdmFsICsgIiddIikKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcXMocSl7CiAgICAgICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IocSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcXNhKHEpewogICAgICAgIHJldHVybiBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocSkpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGdpZChpKXsKICAgICAgICByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcXVlcnl0eXBlKCl7CiAgICAgICAgcmV0dXJuIHFzKCIjcXVlcnktdHlwZSIpLnZhbHVlIHx8ICJhbGwiCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZXF1ZXJ5KCl7CiAgICAgICAgbGV0IHBhcnRzID0gKGdhbGxlcnkoKSAmJiAoImc6IiArIGdhbGxlcnkoKSkgfHwgZGVjb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhhc2guc3Vic3RyaW5nKDEpKSkuc3BsaXQoIi8iKQogICAgICAgIHFzKCIjcXVlcnlkaXNwbGF5IC50ZXh0IikuaW5uZXJUZXh0ID0gcGFydHNbMF0uc3Vic3RyaW5nKDAsIDIwKQogICAgICAgIHF1ZXJ5c3RyID0gcGFydHNbMF0KICAgICAgICBxcygiI3F1ZXJ5IikudmFsdWUgPSBwYXJ0c1swXQogICAgICAgIHFzKCIjcXVlcnktdHlwZSIpLnZhbHVlID0gcGFydHNbMV0gfHwgImFsbCIKICAgICAgfQoKICAgICAgZnVuY3Rpb24gYWN0aXZlKCl7CiAgICAgICAgcmV0dXJuIHFzKCIjaW1hZ2VzIC5hY3RpdmUiKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBpbWFnZW9mZnNldChvZmZzZXQpewogICAgICAgIGNvbnN0IGltYWdlcyA9IHFzYSgiI2ltYWdlcyA+IC5pdGVtIikuZmlsdGVyKGUgPT4gZS5jbGFzc0xpc3QuY29udGFpbnMoInZpc2libGUiKSkKICAgICAgICByZXR1cm4gaW1hZ2VzW2ltYWdlcy5pbmRleE9mKGFjdGl2ZSgpKStvZmZzZXRdCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGxhc3RhY3RpdmUoKXsKICAgICAgICByZXR1cm4gcXNhKCIjaW1hZ2VzIC5hY3RpdmUiKS5wb3AoKSAgICAgIAogICAgICB9CgogICAgICBmdW5jdGlvbiBtZW51KCl7CiAgICAgICAgcXNhKCIjbWVudS1jb250ZW50LCAjb3ZlcmxheSIpLmZvckVhY2gobiA9PiBuLmNsYXNzTGlzdC50b2dnbGUoInZpc2libGUiKSkKICAgICAgfQogIAogICAgICBmdW5jdGlvbiBzZXRhY3RpdmUoYywga2V5LCB2YWwpewogICAgICAgIHFzYSgiLiIgKyBjKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKSkKICAgICAgICBjb25zdCBvcHRpb24gPSBxcygiLiIgKyBjICsgIltkYXRhLSIgKyBrZXkgKyAiPSciICsgdmFsICsgIiddIikKICAgICAgICBvcHRpb24/LmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHNjcm9sbHZpc2libGUobiwgb2Zmc2V0KXsKICAgICAgICBvZmZzZXQgPSBvZmZzZXQgfHwgMAogICAgICAgIHJldHVybiAobi5vZmZzZXRUb3AgKyBuLm9mZnNldEhlaWdodCkgPj0gKHNjcm9sbFkgLSBvZmZzZXQpCiAgICAgICAgICAmJiBuLm9mZnNldFRvcCA8PSAoc2Nyb2xsWSArIHZpc3VhbFZpZXdwb3J0LmhlaWdodCArIG9mZnNldCkKICAgICAgfQoKICAgICAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlaW1hZ2VzbG9hZCgpewogICAgICAgIHFzYSgiI2ltYWdlcyAuaXRlbS5pbWciKS5mb3JFYWNoKGFzeW5jIGltZyA9PiB7CiAgICAgICAgICBpZihzY3JvbGx2aXNpYmxlKGltZywgdmlzdWFsVmlld3BvcnQuaGVpZ2h0IC8gMikpewogICAgICAgICAgICBpbWcuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gInVybCgiICsgaW1nWyJkYXRhLXNyYyJdICsgIikiCiAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgaW1nLnN0eWxlLmJhY2tncm91bmRJbWFnZSA9ICIiCiAgICAgICAgICB9CiAgICAgICAgfSkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlYWxsdmlkZW9wbGF5KCl7CiAgICAgICAgcXNhKCIjaW1hZ2VzIC5pdGVtLnZpZGVvIikuZm9yRWFjaChhc3luYyBuID0+IHVwZGF0ZXZpZGVvcGxheShuKSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcHJldmlld3VybHMoKXsKICAgICAgICByZXR1cm4gcXNhKCIjaW1hZ2VzIC5pdGVtIikuZmlsdGVyKG4gPT4gbi5vZmZzZXRQYXJlbnQpLnNsaWNlKDAsIDQpLm1hcChuID0+IG5bImRhdGEtaXRlbSJdLnVybCkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gdXBkYXRldmlkZW9wbGF5KG4pewogICAgICAgIGNvbnN0IGFwbGF5ID0gYXV0b3BsYXkoKQogICAgICAgIGNvbnN0IHYgPSBuLnF1ZXJ5U2VsZWN0b3IoInZpZGVvIikKICAgICAgICAKICAgICAgICBpZihhcGxheSAhPSAib24iKXsKICAgICAgICAgIHYubXV0ZWQgPSBmYWxzZQogICAgICAgICAgdi5wYXVzZSgpCiAgICAgICAgfWVsc2V7CiAgICAgICAgICB2Lm11dGVkID0gdHJ1ZQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZighc2Nyb2xsdmlzaWJsZShuKSl7CiAgICAgICAgICBpZih2LnJlYWR5U3RhdGUgPT0gNCl7CiAgICAgICAgICAgIHYucGF1c2UoKQogICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIHYucHJlbG9hZCA9ICJub25lIgogICAgICAgICAgfQogICAgICAgIH1lbHNlIGlmKHYucmVhZHlTdGF0ZSAhPSA0KXsKICAgICAgICAgIHYucHJlbG9hZCA9ICJhdXRvIgogICAgICAgIH0KICAgICAgICBlbHNlIGlmKGFwbGF5ID09ICJvbiIgfHwgKGFwbGF5ID09ICJob3ZlciIgJiYgdiA9PSBob3ZlcmVkdmlkZW8pKXsKICAgICAgICAgIHYucGxheSgpCiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLCBlID0+IHsKICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpCiAgICAgICAgdXBkYXRlaW1hZ2VzbG9hZCgpCiAgICAgICAgdXBkYXRlYWxsdmlkZW9wbGF5KCkKICAgICAgfSkKICAgICAgCiAgICAgIGxldCB0b3VjaCA9IG51bGwKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLCBlID0+IHRvdWNoID0gZS5jaGFuZ2VkVG91Y2hlc1swXSkKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIiwgZSA9PiB7CiAgICAgICAgY29uc3QgeGRpZmYgPSBlLmNoYW5nZWRUb3VjaGVzWzBdLnNjcmVlblggLSB0b3VjaC5zY3JlZW5YCgogICAgICAgIGlmKHhkaWZmIDwgLTUwKXsKICAgICAgICAgIHN3aXBlKDEpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKHhkaWZmID4gNTApewogICAgICAgICAgc3dpcGUoLTEpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgcXMoIiNxdWVyeS1mb3JtIikuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgZSA9PiB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgd2luZG93Lmhpc3RvcnkucHVzaFN0YXRlKG51bGwsIG51bGwsIGxvY2F0aW9uLnBhdGhuYW1lKQogICAgICAgIGxvY2F0aW9uLmhhc2ggPSAiIyIgKyBlbmNvZGVVUklDb21wb25lbnQocXMoIiNxdWVyeSIpLnZhbHVlICsgIi8iICsgcXVlcnl0eXBlKCkpCiAgICAgICAgdXBkYXRlcXVlcnkoKQogICAgICAgIHF1ZXJ5d2FpdC5yZXNvbHZlKCkKICAgICAgfSkKCiAgICAgIHFzKCIjcmVsYXlzLWZvcm0iKS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLCBhc3luYyBlID0+IHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICBsZXQgciA9IEpTT04uc3RyaW5naWZ5KHFzKCIjcmVsYXlzIikudmFsdWUuc3BsaXQoIlxuIikpCiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oInJlbGF5cyIsIHIpCiAgICAgICAgZGlzY29ubmVjdCgpCiAgICAgIH0pCiAgICAgIAogICAgICBxcygiI3NoYXJlLWZvcm0iKS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLCBhc3luYyBlID0+IHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICAKICAgICAgICBpZihxcygiI3NoYXJlLWZvcm0gLnN1Ym1pdCIpLnZhbHVlID09ICJjbG9zZSIpewogICAgICAgICAgcXNhKCIuZGlhbG9nLnZpc2libGUiKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QucmVtb3ZlKCJ2aXNpYmxlIikpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QgZXZlbnRzID0gcXNhKCIjaW1hZ2VzIC5pdGVtIikuZmlsdGVyKG4gPT4gbi5vZmZzZXRQYXJlbnQpLm1hcChuID0+IG5bImRhdGEtZXZlbnQiXS5pZCkKICAgICAgICBjb25zdCBldmVudCA9IGF3YWl0IHB1Ymxpc2goewogICAgICAgICAgImtpbmQiOiAzMzMsCiAgICAgICAgICAiY29udGVudCI6IEpTT04uc3RyaW5naWZ5KGV2ZW50cyksCiAgICAgICAgICAidGFncyI6IFtdCiAgICAgICAgfSkKCiAgICAgICAgYXdhaXQgd2FpdHJlcyhudWxsLCAiT0siKQoKICAgICAgICBjb25zdCB1cmwgPSB3aW5kb3cubG9jYXRpb24ub3JpZ2luICsgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lCiAgICAgICAgCiAgICAgICAgY29uc3QgY29udGVudCA9ICJUaGlzIGlzIGEgZ2FsbGVyeSBvZiAiICsgZXZlbnRzLmxlbmd0aAogICAgICAgICAgICArICIgaW1hZ2VzL3ZpZGVvcyBzaGFyZWQgZnJvbSBmaWxlcy5odG1sLiBDaGVjayBpdCBvdXQgaGVyZTogIiArIHVybCArICI/Z2FsbGVyeT0iICsgZXZlbnQuaWQKICAgICAgICAgICAgKyAiXG5cbiIgKyBwcmV2aWV3dXJscygpLmpvaW4oIlxuIikKICAgICAgICAKICAgICAgICBjb25zdCBwdWJsaXNoZWRldmVudCA9IGF3YWl0IHB1Ymxpc2goewogICAgICAgICAgImtpbmQiOiAxLAogICAgICAgICAgImNvbnRlbnQiOiBjb250ZW50LAogICAgICAgICAgInRhZ3MiOiBbCiAgICAgICAgICAgIFsiI2UiLCBldmVudC5pZF0sIAogICAgICAgICAgICBbIiNwIiwgZXZlbnQucHVia2V5XQogICAgICAgICAgXQogICAgICAgIH0pCgogICAgICAgIGF3YWl0IHdhaXRyZXMobnVsbCwgIk9LIikKICAgICAgICAKICAgICAgICBjb25zdCBiZWNoMzJpZCA9IGJlY2gzMi5lbmNvZGUoIm5vdGUiLCBmcm9tSGV4U3RyaW5nKHB1Ymxpc2hlZGV2ZW50LmlkKSkKICAgICAgICBxcygiI3NoYXJlLWZvcm0gLmNvbnRlbnQiKS5pbm5lckhUTUwgPSAnTm90ZSBwdWJsaXNoZWQgPGEgaHJlZj0iJyArIHByb3RvY29sICsgYmVjaDMyaWQgKyAnIj4nICsgYmVjaDMyaWQgKyAnPC9hPicKICAgICAgICBxcygiI3NoYXJlLWZvcm0gLnN1Ym1pdCIpLnZhbHVlID0gImNsb3NlIgogICAgICB9KQoKICAgICAgcXMoIiNwcml2a2V5LWZvcm0iKS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLCBhc3luYyBlID0+IHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICBjb25zdCBrZXkgPSBxcygiI3ByaXZrZXkiKS52YWx1ZQoKICAgICAgICBpZihrZXkubGVuZ3RoICE9IDY0ICYmIGtleS5sZW5ndGggIT0gNjMpewogICAgICAgICAgYWxlcnQoImtleSBzaG91bGQgYmUgNjMgb3IgNjQgY2hhcmFjdGVycyBsb25nIikKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgicHJpdmtleSIsIGtleSkKICAgICAgICBhbGVydCgia2V5IHNhdmVkIikKICAgICAgfSkKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgaWYoYXV0b3BsYXkoKSA9PSAiaG92ZXIiICYmIGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygidmlkZW8tY29udGFpbmVyIikpewogICAgICAgICAgaG92ZXJlZHZpZGVvID0gZS50YXJnZXQucXVlcnlTZWxlY3RvcigidmlkZW8iKQogICAgICAgICAgaG92ZXJlZHZpZGVvLnBsYXkoKQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IiwgYXN5bmMgKGUpID0+IHsKICAgICAgICBob3ZlcmVkdmlkZW8gPSBmYWxzZQogICAgICAgIGlmKCFxcygiI21lZGlhLWNvbnRhaW5lciIpLmNsYXNzTGlzdC5jb250YWlucygidmlzaWJsZSIpICYmIGF1dG9wbGF5KCkgPT0gImhvdmVyIiAmJiBlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInZpZGVvLWNvbnRhaW5lciIpKXsKICAgICAgICAgIHFzYSgidmlkZW8iKS5mb3JFYWNoKHYgPT4gdi5wYXVzZSgpKQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgYXN5bmMgKGUpID0+IHsKICAgICAgICBpZihlLnRhcmdldC50eXBlID09ICJzdWJtaXQiIHx8IChlLnRhcmdldC50YWdOYW1lID09ICJBIiAmJiBlLnRhcmdldC5ocmVmLm1hdGNoKC9eKHx3ZWJcKylub3N0clw6LykpKXsKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgIAogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygidGl0bGUiKSl7CiAgICAgICAgICBxcygiI3F1ZXJ5IikudmFsdWUgPSAiIgogICAgICAgICAgcXMoIiNxdWVyeS10eXBlIikudmFsdWUgPSAiYWxsIgogICAgICAgICAgcXMoIiNnbyIpLmNsaWNrKCkKICAgICAgICB9CgogICAgICAgIGUucHJldmVudERlZmF1bHQoKQoKICAgICAgICBpZihlLnRhcmdldC5pZCA9PSAiZmlsdGVyLWxpa2VzIil7CiAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC50b2dnbGUoImZpbHRlci1saWtlcyIpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gInNoYXJlIil7CiAgICAgICAgICBjb25zdCBldmVudHMgPSBxc2EoIiNpbWFnZXMgLml0ZW0iKS5maWx0ZXIobiA9PiBuLm9mZnNldFBhcmVudCkubWFwKG4gPT4gblsiZGF0YS1ldmVudCJdLmlkKQogICAgICAgICAgLy9jb25zdCB0ZXh0ID0ge3R5cGU6ICIiLCBldmVudHM6IH0KICAgICAgICAgIHFzKCIjc2hhcmUtZGlhbG9nIC5jb250ZW50IikuaW5uZXJIVE1MID0gIjxwPlNoYXJlIGxpbmsgdG8gdGhpcyBnYWxsZXJ5IG9mICIgKyBldmVudHMubGVuZ3RoICsgIiBpbWFnZXMvdmlkZW9zIHRvIHlvdXIgbm9zdHIgcHJvZmlsZT88L3A+IgogICAgICAgICAgcXMoIiNzaGFyZS1kaWFsb2cgLmNvbnRlbnQiKS5pbm5lckhUTUwgKz0gcHJldmlld3VybHMoKS5tYXAodXJsID0+ICc8aW1nIHNyYz0iJyt1cmwrJyIvPicpLmpvaW4oIiAiKQogICAgICAgICAgcXMoIiNzaGFyZS1mb3JtIC5zdWJtaXQiKS52YWx1ZSA9ICJwdWJsaXNoIgogICAgICAgICAgcXNhKCIjc2hhcmUtZGlhbG9nLCAjb3ZlcmxheSIpLmZvckVhY2gobiA9PiBuLmNsYXNzTGlzdC50b2dnbGUoInZpc2libGUiKSkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzaG93IikpewogICAgICAgICAgYWN0aXZlKCk/LmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgICBjb25zdCBpZCA9IGUudGFyZ2V0LmlkIHx8IGUudGFyZ2V0WyJkYXRhLWl0ZW0taWQiXQogICAgICAgICAgZ2lkKGlkKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgc2hvdyhpZCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLnRhcmdldC50YWdOYW1lICE9ICJBIiAmJiAocXMoIiNpbWFnZS1jb250YWluZXIiKSA9PSBlLnRhcmdldCB8fCBxcygiI2ltYWdlIikgPT0gZS50YXJnZXQgfHwgcXMoIiNtZWRpYS1jb250YWluZXIgdmlkZW8iKSA9PSBlLnRhcmdldCkpewogICAgICAgICAgaGlkZW1lZGlhKCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gIm1lbnUiKXsKICAgICAgICAgIG1lbnUoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLnRhcmdldC5pZCA9PSAib3ZlcmxheSIpewogICAgICAgICAgcXNhKCIuZGlhbG9nLnZpc2libGUiKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QucmVtb3ZlKCJ2aXNpYmxlIikpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzZXRjb2xzIikpewogICAgICAgICAgZm9yKGxldCBjIG9mIGNvbG9wdHMpewogICAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoImNvbHMiICsgYykKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJjb2xzIiArIGUudGFyZ2V0LmRhdGFzZXQuY29scykKICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJjb2xzIiwgZS50YXJnZXQuZGF0YXNldC5jb2xzKQogICAgICAgICAgc2V0YWN0aXZlKCJzZXRjb2xzIiwgImNvbHMiLCBjb2xzKCkpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzZXRhdXRvcGxheSIpKXsKICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJhdXRvcGxheSIsIGUudGFyZ2V0LmRhdGFzZXQuYXV0b3BsYXkpCiAgICAgICAgICBzZXRhY3RpdmUoInNldGF1dG9wbGF5IiwgImF1dG9wbGF5IiwgYXV0b3BsYXkoKSkKICAgICAgICAgIHVwZGF0ZWFsbHZpZGVvcGxheSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJsaWtlIikgJiYgbGlrZShlLnRhcmdldCkKICAgICAgfSkKICAgICAgCiAgICAgIGZ1bmN0aW9uIGhhc2tleSgpewogICAgICAgIHJldHVybiB3aW5kb3cubm9zdHIgfHwgcHJpdmtleSgpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHB1YmtleSgpewogICAgICAgIHJldHVybiB3aW5kb3cubm9zdHIgJiYgYXdhaXQgd2luZG93Lm5vc3RyLmdldFB1YmxpY0tleSgpIHx8IE5vc3RyVG9vbHMuZ2V0UHVibGljS2V5KHByaXZrZXkoKSkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gc2lnbihldmVudCl7CiAgICAgICAgaWYod2luZG93Lm5vc3RyKXsKICAgICAgICAgIHJldHVybiBhd2FpdCBub3N0ci5zaWduRXZlbnQoZXZlbnQpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGV2ZW50LnNpZyA9IE5vc3RyVG9vbHMuZ2V0U2lnbmF0dXJlKGV2ZW50LCBwcml2a2V5KCkpCiAgICAgICAgcmV0dXJuIGV2ZW50CiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGxpa2UobGluayl7CiAgICAgICAgY29uc3QgZXZlbnQgPSBsaW5rLnBhcmVudEVsZW1lbnRbImRhdGEtZXZlbnQiXQogICAgICAgIAogICAgICAgIGF3YWl0IHB1Ymxpc2goewogICAgICAgICAgImtpbmQiOiA3LAogICAgICAgICAgImNvbnRlbnQiOiAiKyIsCiAgICAgICAgICAidGFncyI6IFsKICAgICAgICAgICAgWyJlIiwgZXZlbnQuaWRdLAogICAgICAgICAgICBbInAiLCBldmVudC5wdWJrZXldCiAgICAgICAgICBdCiAgICAgICAgfSkKCiAgICAgICAgbGluay5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKCiAgICAgICAgY29uc3QgaW1hZ2VpZCA9IGxpbmtbImRhdGEtaXRlbS1pZCJdIHx8IGxpbmsuZGF0YXNldC5pbWFnZUlkCiAgICAgICAgCiAgICAgICAgaWYoaW1hZ2VpZCl7CiAgICAgICAgICBnaWQoaW1hZ2VpZCkucXVlcnlTZWxlY3RvcigiLmxpa2UiKS5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHByZXBhcmVfZXZlbnQoZXZlbnQpewogICAgICAgIGV2ZW50LnB1YmtleSA9IGF3YWl0IHB1YmtleSgpCiAgICAgICAgZXZlbnQuY3JlYXRlZF9hdCA9IHBhcnNlSW50KERhdGUubm93KCkgLyAxMDAwLCAxMCkKICAgICAgICBldmVudC5pZCA9IE5vc3RyVG9vbHMuZ2V0RXZlbnRIYXNoKGV2ZW50KQogICAgICAgIHJldHVybiBldmVudAogICAgICB9CiAgICAgICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcHVibGlzaChldmVudCl7CiAgICAgICAgZXZlbnQgPSBhd2FpdCBwcmVwYXJlX2V2ZW50KGV2ZW50KQogICAgICAgIGxldCBzaWduZWRldmVudCA9IGF3YWl0IHNpZ24oZXZlbnQpCiAgICAgICAgbGV0IGpzb24gPSBKU09OLnN0cmluZ2lmeShbIkVWRU5UIiwgc2lnbmVkZXZlbnRdKQogICAgICAgIHNvY2tldHMuZm9yRWFjaChzID0+IHMuc2VuZChqc29uKSkKICAgICAgICAKICAgICAgICByZXR1cm4gZXZlbnQKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gc3dpcGUob2Zmc2V0KXsKICAgICAgICBpZihpbWFnZW9mZnNldChvZmZzZXQpKXsKICAgICAgICAgIGltYWdlb2Zmc2V0KG9mZnNldCkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIHRoaXNbb2Zmc2V0ID09IC0xICYmICJsYXN0YWN0aXZlIiB8fCAiYWN0aXZlIl0oKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgICAgdXBkYXRlc2hvdygpCiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiB1cGRhdGVzaG93KCl7CiAgICAgICAgaWYocXMoIiNtZWRpYS1jb250YWluZXIiKS5jbGFzc0xpc3QuY29udGFpbnMoInZpc2libGUiKSl7CiAgICAgICAgICBoaWRldmlkZW8oKQogICAgICAgICAgc2hvdyhhY3RpdmUoKS5pZCkKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCBlID0+IHsKICAgICAgICBpZihbIlRhYiIsICJBcnJvd0xlZnQiLCAiQXJyb3dSaWdodCIsICJBcnJvd1VwIiwgIkFycm93RG93biJdLmluY2x1ZGVzKGUua2V5KSl7CiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJFc2NhcGUiKXsKICAgICAgICAgIG1lbnUoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUua2V5ID09ICJFbnRlciIgJiYgZS50YXJnZXQudGFnTmFtZSA9PSAiQk9EWSIpewogICAgICAgICAgaWYocXMoIiNtZWRpYS1jb250YWluZXIiKS5jbGFzc0xpc3QuY29udGFucygidmlzaWJsZSIpKXsKICAgICAgICAgICAgaGlkZW1lZGlhKCkKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHNob3coYWN0aXZlKCkuaWQpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd1VwIiAmJiBpbWFnZW9mZnNldCgtY29scygpKSl7CiAgICAgICAgICBpbWFnZW9mZnNldCgtY29scygpKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgbGFzdGFjdGl2ZSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgICB1cGRhdGVzaG93KCkKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd0Rvd24iICYmIGltYWdlb2Zmc2V0KGNvbHMoKSkpewogICAgICAgICAgaW1hZ2VvZmZzZXQoY29scygpKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgYWN0aXZlKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIHVwZGF0ZXNob3coKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93TGVmdCIpewogICAgICAgICAgc3dpcGUoLTEpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dSaWdodCIpewogICAgICAgICAgc3dpcGUoMSkKICAgICAgICB9CiAgICAgIH0pCgogICAgICBhc3luYyBmdW5jdGlvbiBoYW5kbGVxdWVyeXJlcyhyZXMsIHNvY2tldCwgcSwgdHlwZSwgc3RpbWUpewogICAgICAgIHNhdmUoc29ja2V0LCByZXMsIHEsIHR5cGUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSkKICAgICAgICBsb2coInF1ZXJ5IHJlcyIsIHJlcy5sZW5ndGgsIHNvY2tldC51cmwpCiAgICAgICAgcXVlcnljb3VudC0tCiAgICAgICAgaWYocXVlcnljb3VudCA9PSAwKXsKICAgICAgICAgIHFzKCIjbG9hZGluZyIpLmNsYXNzTGlzdC5yZW1vdmUoInZpc2libGUiKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBsZXQgd2FpdCA9IHdhaXRtcyAtIChEYXRlLm5vdygpIC0gc3RpbWUpCiAgICAgICAgcXVlcnl3YWl0ID0gc2xlZXAod2FpdCkKICAgICAgICBhd2FpdCBxdWVyeXdhaXQucHJvbWlzZQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBwcmltYWxnbG9iYWwoc29ja2V0KXsKICAgICAgICBsb2coImdsb2JhbCIsIHNvY2tldC51cmwpCiAgICAgICAgcXVlcnljb3VudCsrCiAgICAgICAgcXMoIiNsb2FkaW5nIikuY2xhc3NMaXN0LmFkZCgidmlzaWJsZSIpCiAgICAgICAgbGV0IHN0aW1lID0gRGF0ZS5ub3coKQogICAgICAgIGxldCBxaWQgPSAiZ2xvYmFsXyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgbGV0IHFpZGxpa2VzID0gImxpa2VzXyIgKyAoKytpZGNvdW50ZXIpCgogICAgICAgIGlmKG5ld2xpa2VzLmxlbmd0aCA+IDApewogICAgICAgICAgcHJpbWFsc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoWwogICAgICAgICAgICAiUkVRIiwgCiAgICAgICAgICAgIHFpZGxpa2VzLCAKICAgICAgICAgICAgewogICAgICAgICAgICAgICJjYWNoZSI6IFsKICAgICAgICAgICAgICAgICJldmVudHMiLCB7CiAgICAgICAgICAgICAgICAgICJldmVudF9pZHMiOiBuZXdsaWtlcwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIF0KICAgICAgICAgICAgfQogICAgICAgICAgXSkpCgogICAgICAgICAgY29uc3QgbGlrZV9ldmVudHMgPSAoYXdhaXQgd2FpdHJlcyhxaWRsaWtlcykpWzBdCiAgICAgICAgICBuZXdsaWtlcy5zcGxpY2UoMCkKICAgICAgICAgIAogICAgICAgICAgYXdhaXQgc2F2ZShzb2NrZXQsIGxpa2VfZXZlbnRzLCAiIiwgImFsbCIsIHRydWUsIHRydWUsIGZhbHNlKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeShbCiAgICAgICAgICAiUkVRIiwgCiAgICAgICAgICBxaWQsIAogICAgICAgICAgewogICAgICAgICAgICAiY2FjaGUiOiBbCiAgICAgICAgICAgICAgImV4cGxvcmUiLCAKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAidGltZWZyYW1lIjogImxhdGVzdCIsCiAgICAgICAgICAgICAgICAic2NvcGUiOiAiZ2xvYmFsIiwKICAgICAgICAgICAgICAgICJsaW1pdCI6IDUwCiAgICAgICAgICAgICAgfQogICAgICAgICAgICBdCiAgICAgICAgICB9CiAgICAgICAgXSkpCiAgICAgICAgCiAgICAgICAgY29uc3QgcmVzID0gKGF3YWl0IHdhaXRyZXMocWlkKSlbMF0KICAgICAgICBhd2FpdCBoYW5kbGVxdWVyeXJlcyhyZXMuZmlsdGVyKGUgPT4gZS5raW5kID09IDEpLCBzb2NrZXQsICIiLCAiYWxsIiwgc3RpbWUpCiAgICAgICAgcHJpbWFsZ2xvYmFsKHNvY2tldCkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcXVlcnkoc29ja2V0LCBwcmltYWwpewogICAgICAgIGxvZygicXVlcnkiLCBzb2NrZXQudXJsKQogICAgICAgIHF1ZXJ5Y291bnQrKwogICAgICAgIHFzKCIjbG9hZGluZyIpLmNsYXNzTGlzdC5hZGQoInZpc2libGUiKQogICAgICAgIAogICAgICAgIGxldCBzdGltZSA9IERhdGUubm93KCkKICAgICAgICBsZXQgcSA9IHF1ZXJ5c3RyLnRyaW0oKQogICAgICAgIGxldCB0eXBlID0gcXVlcnl0eXBlKCkKICAgICAgICBsZXQgaSA9ICsraWRjb3VudGVyCiAgICAgICAgbGV0IHFpZCA9ICJxdWVyeV8iICsgaQogICAgICAgIGNvbnN0IGxpa2VzcmVzID0gYXdhaXQgcXVlcnlsaWtlcyhzb2NrZXQpCiAgICAgICAgCiAgICAgICAgbGlrZXNyZXMuZm9yRWFjaChldmVudGlkID0+IHsKICAgICAgICAgIGlmKCFsaWtlcy5pbmNsdWRlcyhldmVudGlkKSl7CiAgICAgICAgICAgIGxpa2VzLnB1c2goZXZlbnRpZCkKICAgICAgICAgICAgbmV3bGlrZXMucHVzaChldmVudGlkKQogICAgICAgICAgfQogICAgICAgIH0pCiAgICAgICAgCiAgICAgICAgbGV0IGdhbGxlcnltYXRjaCA9IHF1ZXJ5c3RyLm1hdGNoKC9nOihbYS16MC05XSspLykKICAgICAgICBsZXQgcmVzID0gbnVsbAogICAgICAgIAogICAgICAgIGlmKGdhbGxlcnltYXRjaCl7CiAgICAgICAgICBjb25zdCBnYWxsZXJ5cmVzID0gYXdhaXQgcXVlcnlldmVudHMoc29ja2V0LCBbMzMzXSwgW2dhbGxlcnltYXRjaFsxXV0sIG51bGwpCiAgICAgICAgICBjb25zdCBldmVudGlkcyA9IEpTT04ucGFyc2UoZ2FsbGVyeXJlc1swXS5jb250ZW50KQogICAgICAgICAgcmVzID0gYXdhaXQgcXVlcnlldmVudHMoc29ja2V0LCBbMV0sIGV2ZW50aWRzLCBudWxsKQogICAgICAgIH1lbHNlewogICAgICAgICAgbGV0IGZpbHRlcnMgPSBbXQoKICAgICAgICAgIGZpbHRlcnMucHVzaCguLi4odHlwZXNbdHlwZV0gfHwgW10pLm1hcCgodCkgPT4gewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgIGtpbmRzOiBbMV0sIAogICAgICAgICAgICAgIHNlYXJjaDogIi4iICsgdCwKICAgICAgICAgICAgICBsaW1pdDogMjAKICAgICAgICAgICAgfQogICAgICAgICAgfSkpCiAgICAgICAgICAKICAgICAgICAgIGlmKHEubGVuZ3RoID4gMCl7CiAgICAgICAgICAgIGZpbHRlcnMucHVzaCh7a2luZHM6IFsxXSwgc2VhcmNoOiBxfSkKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgaWYoZmlsdGVycy5sZW5ndGggPT0gMCl7CiAgICAgICAgICAgIGZpbHRlcnMucHVzaCh7a2luZHM6IFsxXX0pCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIGNvbnN0IHNlYXJjaG9iaiA9IFsiUkVRIiwgcWlkLCAuLi5maWx0ZXJzXQogICAgICAgICAgY29uc3Qgc2VhcmNoanNvbiA9IEpTT04uc3RyaW5naWZ5KHNlYXJjaG9iaikKICAgICAgICAgIHNvY2tldC5zZW5kKHNlYXJjaGpzb24pCiAgICAgICAgICAKICAgICAgICAgIHJlcyA9IChhd2FpdCB3YWl0cmVzKHFpZCkpWzBdCiAgICAgICAgICAKICAgICAgICAgIHJlcyA9IHJlcy5maWx0ZXIobyA9PiB7CiAgICAgICAgICAgIGlmKHEubGVuZ3RoID4gMCl7CiAgICAgICAgICAgICAgZm9yKGxldCB3b3JkIG9mIHEuc3BsaXQoIiAiKSl7CiAgICAgICAgICAgICAgICBpZihvLmNvbnRlbnQudG9Mb3dlckNhc2UoKS5pbmRleE9mKHdvcmQudG9Mb3dlckNhc2UoKSkgPT0gLTEpewogICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2UKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlCiAgICAgICAgICB9KQogICAgICAgIH0KICAgICAgICAKICAgICAgICBhd2FpdCBoYW5kbGVxdWVyeXJlcyhyZXMsIHNvY2tldCwgcSwgdHlwZSwgc3RpbWUpCiAgICAgICAgcXVlcnkoc29ja2V0KQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeWxpa2VzKHNvY2tldCl7CiAgICAgICAgaWYoIWhhc2tleSgpKXsKICAgICAgICAgIHJldHVybiBbXQogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBteXB1YmtleSA9IGF3YWl0IHB1YmtleSgpCiAgICAgICAgY29uc3QgZXZlbnRzID0gYXdhaXQgcXVlcnlldmVudHMoc29ja2V0LCBbN10sIG51bGwsIFtteXB1YmtleV0pCiAgICAgICAgcmV0dXJuIGV2ZW50cy5tYXAoZSA9PiBlLnRhZ3MuZmluZCh0ID0+IHRbMF0gPT0gImUiKVsxXSkKICAgICAgfQoKICAgICAgYXN5bmMgZnVuY3Rpb24gcXVlcnlldmVudHMoc29ja2V0LCBraW5kcywgZXZlbnRpZHMsIGF1dGhvcnMpewogICAgICAgIGNvbnN0IHF1ZXJ5aWQgPSAiZXZlbnRzXyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgY29uc3QgZmlsdGVycyA9IHt9CiAgICAgICAgCiAgICAgICAgZmlsdGVycy5raW5kcyA9IGtpbmRzCiAgICAgICAgCiAgICAgICAgaWYoZXZlbnRpZHMpewogICAgICAgICAgZmlsdGVyc1siaWRzIl0gPSBldmVudGlkcwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihhdXRob3JzKXsKICAgICAgICAgIGZpbHRlcnNbImF1dGhvcnMiXSA9IGF1dGhvcnMKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KFsKICAgICAgICAgICJSRVEiLCAKICAgICAgICAgIHF1ZXJ5aWQsIAogICAgICAgICAgZmlsdGVycwogICAgICAgIF0pCiAgICAgICAgCiAgICAgICAgc29ja2V0LnNlbmQoanNvbikKICAgICAgICAKICAgICAgICByZXR1cm4gKGF3YWl0IHdhaXRyZXMocXVlcnlpZCkpWzBdIHx8IFtdCiAgICAgIH0KCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHNhdmUoc29ja2V0LCBldmVudHMsIHEsIHF0eXBlLCByZWFjdGVkLCBhcHBlbmQsIHF1ZXJ5bWV0YSl7CiAgICAgICAgbGV0IGV2ZW50cHVia2V5cyA9IFtdCiAgICAgICAgbGV0IHJlc3VsdHMgPSBbXQogICAgICAgIGNvbnN0IGV2ZW50aWRzID0gZXZlbnRzLm1hcChlID0+IGUuaWQpCiAgICAgICAgbGV0IG5ld3VybHMgPSBbXQogICAgICAgIAogICAgICAgIGZvcihsZXQgZXZlbnQgb2YgZXZlbnRzKXsKICAgICAgICAgIGxldCB1cmxzbWF0Y2ggPSBbXQogICAgICAgICAgCiAgICAgICAgICBpZihxdHlwZSAhPSAidmlkZW8iKXsKICAgICAgICAgICAgdXJsc21hdGNoLnB1c2goLi4uKGV2ZW50LmNvbnRlbnQubWF0Y2goaW1ncmVnZXgpIHx8IFtdKSkKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgaWYocXR5cGUgIT0gImltYWdlIil7CiAgICAgICAgICAgIHVybHNtYXRjaC5wdXNoKC4uLihldmVudC5jb250ZW50Lm1hdGNoKHZpZGVvcmVnZXgpIHx8IFtdKSkKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgdXJsc21hdGNoID0gdXJsc21hdGNoLmZpbHRlcih1cmwgPT4gIXVybHMuaW5jbHVkZXModXJsKSkKCiAgICAgICAgICBpZih1cmxzbWF0Y2gubGVuZ3RoID4gMCl7CiAgICAgICAgICAgIG5ld3VybHMucHVzaCh7CiAgICAgICAgICAgICAgZXZlbnQ6IGV2ZW50LAogICAgICAgICAgICAgIHVybHM6IHVybHNtYXRjaAogICAgICAgICAgICB9KQogICAgICAgICAgICAKICAgICAgICAgICAgdXJscy5wdXNoKC4uLnVybHNtYXRjaCkKICAgICAgICAgICAgZXZlbnRwdWJrZXlzLmluY2x1ZGVzKGV2ZW50LnB1YmtleSkgfHwgZXZlbnRwdWJrZXlzLnB1c2goZXZlbnQucHVia2V5KQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICBsb2coInF1ZXJ5IG1ldGEiLCBzb2NrZXQudXJsKQogICAgICAgIGxldCBtZXRhZXZlbnRzID0gKHF1ZXJ5bWV0YSAmJiBhd2FpdCBxdWVyeWV2ZW50cyhzb2NrZXQsIFswXSwgbnVsbCwgZXZlbnRwdWJrZXlzKSB8fCBbXSkKICAgICAgICAKICAgICAgICBmb3IobGV0IGVudHJ5IG9mIG5ld3VybHMpewogICAgICAgICAgZm9yKGxldCB1cmwgb2YgZW50cnkudXJscyl7CiAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7CiAgICAgICAgICAgICAgcmVhY3RlZDogcmVhY3RlZCB8fCBsaWtlcy5pbmNsdWRlcyhlbnRyeS5ldmVudC5pZCksIAogICAgICAgICAgICAgIHVybDogdXJsLCAKICAgICAgICAgICAgICBldmVudDogZW50cnkuZXZlbnQsIAogICAgICAgICAgICAgIGJlY2gzMmlkOiBiZWNoMzIuZW5jb2RlKCJub3RlIiwgZnJvbUhleFN0cmluZyhlbnRyeS5ldmVudC5pZCkpLAogICAgICAgICAgICAgIG1ldGE6IG1ldGFldmVudHMuZmluZChvID0+IG8ucHVia2V5ID09IGVudHJ5LmV2ZW50LnB1YmtleSkKICAgICAgICAgICAgfSkKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbG9nKCJzYXZlIHJlcyIsIHJlc3VsdHMubGVuZ3RoLCBzb2NrZXQudXJsKQogICAgICAgIHVwZGF0ZWNvbnRlbnQocmVzdWx0cywgcSwgYXBwZW5kKQogICAgICB9CiAgICAgIAogICAgICBsZXQgbG9hZGVkID0gMAogICAgICAKICAgICAgZnVuY3Rpb24gdXBkYXRlY29udGVudChyZXN1bHRzLCBxLCBhcHBlbmQpewogICAgICAgIHJlc3VsdHMucmV2ZXJzZSgpLmZvckVhY2goaXRlbSA9PiB7CiAgICAgICAgICBjb25zdCB0eXBlID0gaXRlbS51cmwubWF0Y2godmlkZW9leHRyZWdleCkgJiYgInZpZGVvIiB8fCAiaW1hZ2UiCiAgICAgICAgICBjb25zdCB0ZXh0ID0gKHEgfHwgInZpZXcgbm90ZSIpLnN1YnN0cmluZygtMzApCiAgICAgICAgICBjb25zdCBpZCA9ICJpdGVtXyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgICBjb25zdCBjb250ZW50ZWxlbWVudHMgPSAnPGRpdiBjbGFzcz0idHlwZSI+JyArIHFzKCIjdGVtcGxhdGUgLiIgKyB0eXBlICsgInN2ZyIpLm91dGVySFRNTCArICc8L2Rpdj48YSBjbGFzcz0ibGlrZScgKyAoaXRlbS5yZWFjdGVkID8gJyByZWFjdGVkJyA6ICcnKSArICciIGRhdGEtaXRlbS1pZD0iJyArIGlkICsgCiAgICAgICAgICAgICciIGhyZWY9IiMiPicgKyBxcygiI3RlbXBsYXRlIC5oZWFydHN2ZyIpLm91dGVySFRNTCArICc8L2E+PGEgY2xhc3M9InF1ZXJ5IiBocmVmPSInICsgcHJvdG9jb2wgKyAKICAgICAgICAgICAgaXRlbS5iZWNoMzJpZCArICciPicgKyB0ZXh0ICsgJzwvYT4nCiAgICAgICAgICBsZXQgcm9vdCA9IG51bGwKICAgICAgICAgIGxldCB2ID0gbnVsbAogICAgICAgICAgCiAgICAgICAgICBpZihpdGVtLnVybC5tYXRjaCh2aWRlb2V4dHJlZ2V4KSl7CiAgICAgICAgICAgIHJvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKQogICAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoInZpZGVvLWNvbnRhaW5lciIpCiAgICAgICAgICAgIHJvb3QuaW5uZXJIVE1MID0gY29udGVudGVsZW1lbnRzCiAgICAgICAgICAgIAogICAgICAgICAgICB2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKQogICAgICAgICAgICB2LmNsYXNzTGlzdC5hZGQoInNob3ciKQogICAgICAgICAgICB2WyJkYXRhLWl0ZW0taWQiXSA9IGlkCiAgICAgICAgICAgIHYucHJlbG9hZCA9ICJub25lIgogICAgICAgICAgICB2Lmxvb3AgPSB0cnVlCiAgICAgICAgICAgIHYucGxheXNpbmxpbmUgPSAiIgogICAgICAgICAgICAKICAgICAgICAgICAgdi5vbmNhbnBsYXkgPSBhc3luYyBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICBjb25zdCBhc3BlY3QgPSB0aGlzLnZpZGVvV2lkdGggLyB0aGlzLnZpZGVvSGVpZ2h0CiAgICAgICAgICAgICAgaWYoYXNwZWN0ID4gMSl7CiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlLndpZHRoID0gKGFzcGVjdCAqIDEwMCkgKyAiJSIKICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUuaGVpZ2h0ID0gKDEgLyBhc3BlY3QgKiAxMDApICsgIiUiCiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlLm1hcmdpblRvcCA9IC0oKDEgLyBhc3BlY3QgKiAxMDAgLSAxMDApIC8gMikgKyAiJSIKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgdXBkYXRldmlkZW9wbGF5KHRoaXMucGFyZW50RWxlbWVudCkKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29uc3QgZXh0ID0gaXRlbS51cmwubWF0Y2godmlkZW9leHRyZWdleClbMV0KICAgICAgICAgICAgdi5pbm5lckhUTUwgPSAnPHNvdXJjZSBzcmM9IicgKyBpdGVtLnVybCArICciIHR5cGU9InZpZGVvLycgKyBleHQgKyAnIj48L3NvdXJjZT4nCiAgICAgICAgICAgIAogICAgICAgICAgICByb290LmFwcGVuZCh2KQogICAgICAgICAgfWVsc2UgaWYoaXRlbS51cmwubWF0Y2goaW1nZXh0cmVnZXgpKXsKICAgICAgICAgICAgcm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKQogICAgICAgICAgICByb290LmhyZWYgPSAiIyIKICAgICAgICAgICAgcm9vdC5pbm5lckhUTUwgPSBjb250ZW50ZWxlbWVudHMKICAgICAgICAgICAgICAKICAgICAgICAgICAgaWYodHlwZSA9PSAiaW1hZ2UiKXsKICAgICAgICAgICAgICAvL2xldCBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKQogICAgICAgICAgICAgIC8vaW1nLmFsdCA9IGl0ZW0udXJsCiAgICAgICAgICAgICAgcm9vdFsiZGF0YS1zcmMiXSA9IGl0ZW0udXJsCiAgICAgICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJpbWciKQogICAgICAgICAgICAgIC8vaW1nLmNsYXNzTGlzdC5hZGQoImRhdGEiKQogICAgICAgICAgICAgIC8vcm9vdC5hcHBlbmQoaW1nKQogICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICByb290LmlubmVySFRNTCArPSAnPHNwYW4gY2xhc3M9ImZpbGUiPicgKyBpdGVtLnVybCArICc8L3NwYW4+JwogICAgICAgICAgICB9CiAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHJvb3QuaWQgPSBpZAogICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCd2aXNpYmxlJykKICAgICAgICAgIHJvb3RbImRhdGEtaXRlbSJdID0gaXRlbQogICAgICAgICAgcm9vdFsiZGF0YS1ldmVudCJdID0gaXRlbS5ldmVudAogICAgICAgICAgcm9vdFsiZGF0YS1xdWVyeSJdID0gcQogICAgICAgICAgcm9vdFsiZGF0YS10ZXh0Il0gPSB0ZXh0CiAgICAgICAgICAKICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCh0eXBlKQogICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJpdGVtIikKICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgic2hvdyIpCiAgICAgICAgICAKICAgICAgICAgIGlmKGl0ZW0ucmVhY3RlZCl7CiAgICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHFzKCIjaW1hZ2VzIilbYXBwZW5kICYmICJhcHBlbmQiIHx8ICJwcmVwZW5kIl0ocm9vdCkKICAgICAgICAgIAogICAgICAgICAgaWYodil7CiAgICAgICAgICAgIHVwZGF0ZXZpZGVvcGxheShyb290KQogICAgICAgICAgfQogICAgICAgIH0pCgogICAgICAgIHVwZGF0ZWltYWdlc2xvYWQoKQogICAgICAgIAogICAgICAgIGlmKGFjdGl2ZSgpID09IG51bGwpewogICAgICAgICAgcXMoIiNpbWFnZXMgLml0ZW0iKT8uY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGhpZGVtZWRpYSgpewogICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAic2Nyb2xsIgogICAgICAgIHFzYSgiI21lZGlhLWNvbnRhaW5lciwgI2ltYWdlLCAjbWVkaWEtZm9vdGVyIikuZm9yRWFjaChuID0+IG4uY2xhc3NMaXN0LnJlbW92ZSgidmlzaWJsZSIpKQogICAgICAgIGdpZCgiaW1hZ2UtbGlrZSIpLmNsYXNzTGlzdC5yZW1vdmUoInJlYWN0ZWQiKQogICAgICAgIGhpZGV2aWRlbygpCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGhpZGV2aWRlbygpewogICAgICAgIGNvbnN0IHYgPSBxcygiI21lZGlhLWNvbnRhaW5lciB2aWRlbyIpCiAgICAgICAgCiAgICAgICAgaWYodil7CiAgICAgICAgICB2Lm11dGVkID0gdHJ1ZQogICAgICAgICAgdi5jbGFzc0xpc3QuYWRkKCJzaG93IikKICAgICAgICAgIGdpZCh2WyJkYXRhLWl0ZW0taWQiXSkuYXBwZW5kQ2hpbGQodikKICAgICAgICAgIHVwZGF0ZXZpZGVvcGxheSh2LnBhcmVudEVsZW1lbnQpCiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiB3YWl0cmVzKGtleSwgdHlwZSl7CiAgICAgICAgbGV0IHJlc2hhbmRsZXIgPSBmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpewogICAgICAgICAgdGhpcy50eXBlID0gdHlwZSB8fCAiRU9TRSIKICAgICAgICAgIHRoaXMuZXZlbnRzID0gW10KICAgICAgICAgIHRoaXMuaGFuZGxlID0gZnVuY3Rpb24ocmVzKXsKICAgICAgICAgICAgbGV0IG8gPSBKU09OLnBhcnNlKHJlcy5kYXRhKQogICAgICAgICAgICBpZihrZXkgPT0gbnVsbCB8fCBvWzFdID09IGtleSl7CiAgICAgICAgICAgICAgaWYob1swXSA9PSB0aGlzLnR5cGUpewogICAgICAgICAgICAgICAgcmVzb2x2ZShbdGhpcy5ldmVudHMsIG9dKQogICAgICAgICAgICAgICAgcmVzaGFuZGxlcnMuc3BsaWNlKHJlc2hhbmRsZXJzLmluZGV4T2YodGhpcyksIDEpCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIHRoaXMuZXZlbnRzLnB1c2gob1syXSkKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gewogICAgICAgICAgbGV0IGhhbmRsZXIgPSBuZXcgcmVzaGFuZGxlcihyZXNvbHZlLCByZWplY3QpCiAgICAgICAgICByZXNoYW5kbGVycy5wdXNoKGhhbmRsZXIpCiAgICAgICAgfSkKICAgICAgfQogICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGNoZWNrdXBkYXRlKHNvY2tldCl7CiAgICAgICAgY29uc3QgdXBkYXRlc3JlcyA9IGF3YWl0IHF1ZXJ5ZXZlbnRzKHNvY2tldCwgWzFdLCBudWxsLCBbdXBkYXRlc3B1YmtleV0pCiAgICAgICAgY29uc3QgdXBkYXRlbm90ZSA9IHVwZGF0ZXNyZXMuZmluZChuID0+IG4uY29udGVudC5tYXRjaCgvXmh0dHBzXDpcL1wvLykpCiAgICAgICAgCiAgICAgICAgaWYoIXVwZGF0ZW5vdGUpewogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IGFnZSA9IE1hdGgucm91bmQoKERhdGUubm93KCkgLyAxMDAwIC0gdXBkYXRlbm90ZS5jcmVhdGVkX2F0KSAvIDM2MDAgLyAyNCkKICAgICAgICBjb25zdCBub3RlaWQgPSBiZWNoMzIuZW5jb2RlKCJub3RlIiwgZnJvbUhleFN0cmluZyh1cGRhdGVub3RlLmlkKSkKICAgICAgICBxcygiI3JlbGVhc2UiKS5ocmVmID0gcHJvdG9jb2wgKyBub3RlaWQKICAgICAgICBxcygiI3JlbGVhc2UiKS5pbm5lclRleHQgPSAoYWdlID09IDAgJiYgInRvZGF5IiB8fCBhZ2UgKyAiIGRheShzKSBhZ28iKQogICAgICB9CgogICAgICBmdW5jdGlvbiBzbGVlcChtcyl7CiAgICAgICAgcmV0dXJuIG5ldyBmdW5jdGlvbigpewogICAgICAgICAgbGV0IHRpbWVvdXQgPSBudWxsCiAgICAgICAgICBsZXQgciA9IG51bGwKICAgICAgICAgIAogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcHJvbWlzZTogbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KXsKICAgICAgICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCksIG1zKQogICAgICAgICAgICAgIHIgPSByZXNvbHZlCiAgICAgICAgICAgIH0pLAogICAgICAgICAgICByZXNvbHZlOiBmdW5jdGlvbigpewogICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KQogICAgICAgICAgICAgIHIoKQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBzaG93KGlkKXsKICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiIKICAgICAgICBjb25zdCBpdGVtID0gZ2lkKGlkKVsiZGF0YS1pdGVtIl0KICAgICAgICBjb25zdCBtZWRpYSA9IGdpZCgibWVkaWEtY29udGFpbmVyIikKICAgICAgICBjb25zdCBpbWFnZSA9IGdpZCgiaW1hZ2UiKQoKICAgICAgICBpZihpdGVtLnVybC5tYXRjaCh2aWRlb2V4dHJlZ2V4KSl7CiAgICAgICAgICBpbWFnZS5jbGFzc0xpc3QucmVtb3ZlKCJ2aXNpYmxlIikKICAgICAgICAgIGNvbnN0IHYgPSBnaWQoaWQpLnF1ZXJ5U2VsZWN0b3IoInZpZGVvIikKICAgICAgICAgIHFzKCIjbWVkaWEtY29udGFpbmVyIikuYXBwZW5kQ2hpbGQodikKICAgICAgICAgIHYubXV0ZWQgPSBmYWxzZQogICAgICAgICAgdi5jbGFzc0xpc3QucmVtb3ZlKCJzaG93IikKICAgICAgICAgIHYucGxheSgpCiAgICAgICAgfWVsc2V7CiAgICAgICAgICBpbWFnZS5zcmMgPSBpdGVtLnVybAogICAgICAgICAgaW1hZ2UuY2xhc3NMaXN0LmFkZCgidmlzaWJsZSIpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGl0ZW0ubWV0YSl7CiAgICAgICAgICBjb25zdCBtZXRhY29udGVudCA9IEpTT04ucGFyc2UoaXRlbS5tZXRhLmNvbnRlbnQpCiAgICAgICAgICBjb25zdCBuYW1lID0gbWV0YWNvbnRlbnQuZGlzcGxheV9uYW1lIHx8IG1ldGFjb250ZW50Lm5hbWUKICAgICAgICAgIHFzKCIjaW1hZ2UtdXNlciIpLmNsYXNzTGlzdC5hZGQoInZpc2libGUiKQogICAgICAgICAgcXMoIiNpbWFnZS11c2VyIikuaHJlZiA9IHByb3RvY29sICsgYmVjaDMyLmVuY29kZSgibnB1YiIsIGZyb21IZXhTdHJpbmcoaXRlbS5tZXRhLnB1YmtleSkpCiAgICAgICAgICBxcygiI2ltYWdlLXVzZXIiKS5pbm5lclRleHQgPSBuYW1lCiAgICAgICAgfWVsc2V7CiAgICAgICAgICBxcygiI2ltYWdlLXVzZXIiKS5jbGFzc0xpc3QucmVtb3ZlKCJ2aXNpYmxlIikKICAgICAgICB9CgogICAgICAgIGdpZCgiaW1hZ2UtbGlrZSIpWyJkYXRhLWl0ZW0taWQiXSA9IGlkCiAgICAgICAgZ2lkKCJtZWRpYS1mb290ZXIiKVsiZGF0YS1ldmVudCJdID0gaXRlbS5ldmVudAoKICAgICAgICBpZihpdGVtLnJlYWN0ZWQpewogICAgICAgICAgZ2lkKCJpbWFnZS1saWtlIikuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IGEgPSBxcygiI2ltYWdlLXF1ZXJ5IikKICAgICAgICBhLmhyZWYgPSBwcm90b2NvbCArIGl0ZW0uYmVjaDMyaWQKICAgICAgICBhLmlubmVyVGV4dCA9IGdpZChpZClbImRhdGEtdGV4dCJdCiAgICAgICAgCiAgICAgICAgZ2lkKCJtZWRpYS1jb250YWluZXIiKS5jbGFzc0xpc3QuYWRkKCJ2aXNpYmxlIikKICAgICAgICBnaWQoIm1lZGlhLWZvb3RlciIpLmNsYXNzTGlzdC5hZGQoInZpc2libGUiKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBjb25uY291bnQoKXsKICAgICAgICByZXR1cm4gc29ja2V0cy5maWx0ZXIociA9PiByLnJlYWR5U3RhdGUgPT0gMSkubGVuZ3RoCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGRpc2Nvbm5lY3QoKXsKICAgICAgICBmb3IobGV0IHNvY2tldCBvZiBzb2NrZXRzKXsKICAgICAgICAgIHNvY2tldC5jbG9zZSgpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHNvY2tldHMuc3BsaWNlKDApCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGxvZyhtc2cpewogICAgICAgIGxldCBzY3JvbGwgPSBxcygiI2xvZ3MiKS5zY3JvbGxUb3AgPT0gcXMoIiNsb2dzIikuc2Nyb2xsVG9wTWF4CiAgICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikKICAgICAgICBkaXYuaW5uZXJUZXh0ID0gQXJyYXkuZnJvbShhcmd1bWVudHMpLmpvaW4oIiAiKQogICAgICAgIHFzKCIjbG9ncyIpLmFwcGVuZChkaXYpCiAgICAgICAgCiAgICAgICAgc2Nyb2xsICYmIHFzKCIjbG9ncyIpLnNjcm9sbFRvKDAsIHFzKCIjbG9ncyIpLnNjcm9sbFRvcE1heCkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gY29ubmVjdCh1cmwpewogICAgICAgIGxvZygiY29ubmVjdGluZyIsIHVybCkKICAgICAgICBsZXQgc29ja2V0ID0gbmV3IFdlYlNvY2tldCh1cmwpCiAgICAgICAgCiAgICAgICAgc29ja2V0Lm9ubWVzc2FnZSA9IG1lc3NhZ2UgPT4gcmVzaGFuZGxlcnMuZm9yRWFjaChyaCA9PiByaC5oYW5kbGUobWVzc2FnZSkpCiAgICAgICAgCiAgICAgICAgc29ja2V0Lm9uY2xvc2UgPSBhc3luYyBmdW5jdGlvbigpewogICAgICAgICAgc29ja2V0cy5zcGxpY2Uoc29ja2V0cy5pbmRleE9mKHNvY2tldCksIDEpCiAgICAgICAgICBxcygiI2Nvbm5jb3VudCIpLmlubmVyVGV4dCA9IGNvbm5jb3VudCgpICsgKHByaW1hbHNvY2tldCAmJiAxKQogICAgICAgICAgbG9nKCJkaXNjb25uZWN0ZWQiLCB0aGlzLnVybCwgY29ubmNvdW50KCkpCiAgICAgICAgICBhd2FpdCBzbGVlcCgxMDAwKS5wcm9taXNlCiAgICAgICAgICBjb25uZWN0KHRoaXMudXJsKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBzb2NrZXQub25vcGVuID0gZnVuY3Rpb24oKXsKICAgICAgICAgIHFzKCIjY29ubmNvdW50IikuaW5uZXJUZXh0ID0gY29ubmNvdW50KCkgKyAocHJpbWFsc29ja2V0ICYmIDEpCiAgICAgICAgICBsb2coImNvbm5lY3RlZCIsIHRoaXMudXJsLCBjb25uY291bnQoKSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuIHNvY2tldAogICAgICB9CiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgYXN5bmMgKCkgPT4gewogICAgICAgIHByaW1hbHNvY2tldCA9IGNvbm5lY3QoIndzczovL2NhY2hlMy5wcmltYWwubmV0L2NhY2hlMTciKQogICAgICAgIHByaW1hbHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCJvcGVuIiwgZnVuY3Rpb24oKXsKICAgICAgICAgIHByaW1hbGdsb2JhbCh0aGlzKQogICAgICAgIH0pCiAgICAgICAgCiAgICAgICAgcHJpbWFsc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoImNsb3NlIiwgZnVuY3Rpb24oKXsKICAgICAgICAgIHByaW1hbHNvY2tldCA9IG51bGwKICAgICAgICB9KQogICAgICAgIAogICAgICAgIGZvcihsZXQgdXJsIG9mIHJlbGF5cygpKXsKICAgICAgICAgIGNvbnN0IHNvY2tldCA9IGNvbm5lY3QodXJsKQogICAgICAgICAgc29ja2V0cy5wdXNoKHNvY2tldCkKICAgICAgICAgIAogICAgICAgICAgc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoIm9wZW4iLCBmdW5jdGlvbigpewogICAgICAgICAgICBjaGVja3VwZGF0ZSh0aGlzKQogICAgICAgICAgICBxdWVyeSh0aGlzKQogICAgICAgICAgfSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgYXdhaXQgc2xlZXAoMTAwKS5wcm9taXNlCiAgICAgICAgCiAgICAgICAgaWYoaGFza2V5KCkpewogICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJub3N0ciIpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgZm9yKGxldCBjIG9mIGNvbG9wdHMpewogICAgICAgIGRvY3VtZW50LndyaXRlKCc8c3R5bGU+JyArIGNvbHNjc3MuaW5uZXJUZXh0LnJlcGxhY2UoL1wkXHtjb2xzXH0vZywgYykgKyAnPC9zdHlsZT4nKQogICAgICB9CiAgICA8L3NjcmlwdD4KICA8L2JvZHk+CjwvaHRtbD4K

https://ipfs.io/ipfs/QmZfE6Y7oJMvEBybSeysquRAMfUfMUFR6SBcc3j7Vdf929

sha256

a53010db0e6fb5c87abd67c926ffc42cad50ae46dbe8bd8ab4cabd9b05ec92b1 files.html

base64

PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgdXNlci1zY2FsYWJsZT1ubyIvPgogICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL3N2Z2ljb25zLnNwYXJray5mci9zdmdpY29ucy5jc3MiLz4KICAgIDxzdHlsZT4KICAgICAgKiB7CiAgICAgICAgb3ZlcnNjcm9sbC1iZWhhdmlvci15OiBjb250YWluOwogICAgICB9CiAgICAgIAogICAgICBib2R5IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB3aWR0aDogMTAwdnc7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIGZvbnQtZmFtaWx5OiAiTm90byBTZXJpZiI7CiAgICAgIH0KICAgICAgCiAgICAgIGgxIHsKICAgICAgICBmb250LXNpemU6IDFlbTsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnlkaXNwbGF5LCAKICAgICAgI2hlYWRlciB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgfQogICAgICAKICAgICAgI3JlbGF5cywKICAgICAgI2xvZ3MsIAogICAgICAjcHJpdmtleSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgd2lkdGg6IDE4ZW07CiAgICAgICAgYmFja2dyb3VuZDogIzExMTsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgI3JlbGF5cywKICAgICAgI2xvZ3MgewogICAgICAgIGhlaWdodDogNmVtOwogICAgICB9CiAgICAgIAogICAgICAjbG9ncyB7CiAgICAgICAgaGVpZ2h0OiA4ZW07CiAgICAgICAgb3ZlcmZsb3c6IHNjcm9sbDsKICAgICAgICBmb250LXNpemU6IC44ZW07CiAgICAgIH0KICAgICAgCiAgICAgIHNlbGVjdCB7CiAgICAgICAgd2lkdGg6IDRlbTsKICAgICAgfQogICAgICAKICAgICAgI3JlbGF5cywgCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgYm9yZGVyLXJhZGl1czogLjVlbTsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSAudGV4dCwgCiAgICAgICNoZWFkZXIgYSwKICAgICAgI21lZGlhLWNvbnRhaW5lciB7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgYSwgCiAgICAgIGZvcm0sIAogICAgICAjcXVlcnlkaXNwbGF5IHsKICAgICAgICB6LWluZGV4OiAxOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgICAKICAgICAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAzMGVtKSB7CiAgICAgICAgI2hlYWRlciAudGl0bGUgewogICAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgI3F1ZXJ5ZGlzcGxheSB7CiAgICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIH0KICAgICAgfQoKICAgICAgZm9ybSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnkgewogICAgICAgIHdpZHRoOiA2ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNsb2FkaW5nIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDBweDsKICAgICAgICBsZWZ0OiAyN2VtOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICBhIHsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICAgIH0KCiAgICAgIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAKICAgICAgI21lZGlhLWNvbnRhaW5lciB2aWRlbyB7CiAgICAgICAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsKICAgICAgICBoZWlnaHQ6IDEwMCUgIWltcG9ydGFudDsKICAgICAgICBtYXJnaW4tdG9wOiAwICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgCiAgICAgIC50eXBlIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgei1pbmRleDogMTsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlLXF1ZXJ5IHsKICAgICAgICB3aWR0aDogNWVtOwogICAgICB9CiAgICAgIAogICAgICBhIHsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSwKICAgICAgYS5idXR0b24sCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgY29sb3I6ICM5OTk7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXkgewogICAgICAgIHBhZGRpbmc6IDAgMWVtOwogICAgICB9CgogICAgICAjcXVlcnlkaXNwbGF5IC50ZXh0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgbWluLXdpZHRoOiAzZW07CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgI2hlYWRlciBhLAogICAgICAjaGVhZGVyIHNwYW4gewogICAgICAgIHBhZGRpbmc6IDAuNWVtOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CgogICAgICAjaGVhZGVyIHsKICAgICAgICBwYWRkaW5nOiAwLjQ1ZW0gMDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CgogICAgICAjaGVhZGVyIC5pdGVtcyB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgLml0ZW1zIHsKICAgICAgICBtYXJnaW4tdG9wOiAuM2VtOwogICAgICB9CgogICAgICBwIHsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICB9CiAgICAgIAogICAgICAubGFiZWwgewogICAgICAgIHBhZGRpbmc6IC44ZW0gLjhlbSAuOGVtIDA7CiAgICAgIH0KCiAgICAgICNpbWFnZXMgLnF1ZXJ5IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KCiAgICAgICNtZWRpYS1jb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwKTsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHotaW5kZXg6IDQ7CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZS1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlIHsKICAgICAgICBtYXgtd2lkdGg6IDEwMHZ3OwogICAgICAgIG1heC1oZWlnaHQ6IDEwMHZoOwogICAgICB9CiAgICAgICAgCiAgICAgICNpbWFnZXMgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZXMgLml0ZW0gewogICAgICAgIHdpZHRoOiAyNXZ3OwogICAgICB9CgogICAgICAjaW1hZ2VzIC5pdGVtIHsKICAgICAgICBoZWlnaHQ6IDI1dnc7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgI21lZGlhLWNvbnRhaW5lciB2aWRlbyB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgfQogICAgICAKICAgICAgYm9keTpub3QoLm5vc3RyKSAjaGVhZGVyIC5pY29ucywgCiAgICAgIC5maWx0ZXItbGlrZXMgI2ltYWdlcyA+IC5pdGVtOm5vdCgucmVhY3RlZCkgewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQogICAgICAKICAgICAgLnF1ZXJ5LCAKICAgICAgLmxpa2UsIAogICAgICAjaW1hZ2UtcXVlcnksCiAgICAgICNpbWFnZS11c2VyIHsKICAgICAgICB6LWluZGV4OiAyOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3JkZXItcmFkaXVzOiAzdnc7CiAgICAgIH0KICAgICAgCiAgICAgIC5xdWVyeSwgCiAgICAgIC5saWtlIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcGFkZGluZzogMCAxdnc7CiAgICAgIH0KICAgICAgCiAgICAgIC5xdWVyeSwgCiAgICAgIC5saWtlLCAKICAgICAgI2ltYWdlLXF1ZXJ5LCAKICAgICAgLnZpZGVvc3ZnLAogICAgICAuaW1hZ2VzdmcgewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwwLDAsMC42KTsKICAgICAgfQogICAgICAKICAgICAgLnF1ZXJ5LCAKICAgICAgLmxpa2UsIAogICAgICAjaW1hZ2UtcXVlcnkgewogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBmb250LXNpemU6IG1pbigzLjV2dywgMS41ZW0pOwogICAgICAgIG1heC13aWR0aDogNWVtOwogICAgICB9CiAgICAgIAogICAgICAjaW1hZ2UtcXVlcnkgewogICAgICAgIHBhZGRpbmc6IC42ZW0gLjRlbSAuMWVtIC40ZW07CiAgICAgICAgbWF4LXdpZHRoOiA1ZW07CiAgICAgIH0KICAgICAgCiAgICAgIC5saWtlLnJlYWN0ZWQsCiAgICAgIC5maWx0ZXItbGlrZXMgI2ZpbHRlci1saWtlcyB7CiAgICAgICAgYmFja2dyb3VuZDogcmVkOwogICAgICB9CgogICAgICAjaW1hZ2UtcXVlcnksCiAgICAgICNpbWFnZS11c2VyIHsKICAgICAgICBmb250LXNpemU6IDNlbTsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlLXF1ZXJ5LAogICAgICAjaW1hZ2UtdXNlciwKICAgICAgI21lZGlhLWZvb3RlciAubGlrZSB7CiAgICAgICAgei1pbmRleDogNTsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZS1xdWVyeSwKICAgICAgI2ltYWdlLXVzZXIgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICAjaW1hZ2UtdXNlciB7CiAgICAgICAgYm90dG9tOiAxLjllbTsKICAgICAgICBmb250LXNpemU6IDEuOGVtOwogICAgICAgIHBhZGRpbmctcmlnaHQ6IC42NWVtOwogICAgICAgIG1heC13aWR0aDogOGVtOwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICB9CiAgICAgIAogICAgICAubGlrZSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiBhdXRvOwogICAgICAgIHBhZGRpbmc6IC4yZW07CiAgICAgICAgd2lkdGg6IDFlbTsKICAgICAgICBoZWlnaHQ6IDFlbTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICB9CgogICAgICAubm9zdHIgLmxpa2UgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOyAgCiAgICAgIH0KCiAgICAgICNtZWRpYS1mb290ZXIgLmxpa2UgewogICAgICAgIGZvbnQtc2l6ZTogMi40ZW07CiAgICAgIH0KCiAgICAgICNtZWRpYS1mb290ZXIgewogICAgICAgIGRpc3BsYXk6IG5vbmU7ICAKICAgICAgfQogIAogICAgICAjaW1hZ2VzIC5pbWcgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBiYWNrZ3JvdW5kLXNpemU6IGNvdmVyOwogICAgICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7CiAgICAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyOwogICAgICB9CgogICAgICAjbWVudS1jb250ZW50IC5pdGVtcyAuYWN0aXZlIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjNDQ0OwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICAjaW1hZ2VzID4gLmFjdGl2ZSB7CiAgICAgICAgb3V0bGluZTogLjNlbSBzb2xpZCBncmVlbjsKICAgICAgICB6LWluZGV4OiAxOwogICAgICB9CgogICAgICAuaGVhcnRzdmcgcGF0aCwKICAgICAgLmhlYWRlci1pY29uIHN2ZyBwYXRoIHsKICAgICAgICBzdHJva2U6ICNmZmY7CiAgICAgIH0KICAKICAgICAgLnZpZGVvc3ZnLAogICAgICAuaW1hZ2VzdmcgewogICAgICAgIHdpZHRoOiBjYWxjKG1pbig0dncsIDJlbSkpOwogICAgICAgIGhlaWdodDogY2FsYyhtaW4oNHZ3LCAyZW0pKTsKICAgICAgICBwYWRkaW5nOiAwIC4yZW07CiAgICAgIH0KICAgICAgCiAgICAgIC52aWRlb3N2ZyBwYXRoLAogICAgICAuaW1hZ2VzdmcgcGF0aCB7CiAgICAgICAgZmlsbDogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgYSNtZW51LCAKICAgICAgLmhlYWRlci1pY29uIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBtYXJnaW4tdG9wOiAtLjNlbTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICB9CgogICAgICAuaWNvbnMgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICByaWdodDogMDsKICAgICAgICB6LWluZGV4OiAyOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgIH0KICAgICAgCiAgICAgIGEjbWVudSB7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgcGFkZGluZzogMCAuNWVtOwogICAgICAgIGhlaWdodDogMi4xZW07CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgLmhlYWRlci1pY29uIHsKICAgICAgICBwYWRkaW5nOiAuMmVtOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICB3aWR0aDogMS41ZW07CiAgICAgICAgaGVpZ2h0OiAxLjVlbTsKICAgICAgICBtYXJnaW46IC4xZW0gLjVlbTsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgIH0KICAgICAgCiAgICAgIC5oZWFkZXItaWNvbiBzdmcgewogICAgICAgIHdpZHRoOiAxLjVlbTsKICAgICAgICBoZWlnaHQ6IDEuNWVtOwogICAgICB9CiAgICAgICAKICAgICAgLm1lbnVzdmcgewogICAgICAgIHdpZHRoOiAyZW07CiAgICAgICAgaGVpZ2h0OiAyZW07CiAgICAgIH0KCiAgICAgIC5tZW51c3ZnIHBhdGggewogICAgICAgIGZpbGw6ICNmZmY7CiAgICAgIH0KCiAgICAgICNtZW51LWNvbnRlbnQgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgICB3aWR0aDogMThlbTsKICAgICAgICBtYXJnaW4tbGVmdDogLTE4ZW07CiAgICAgICAgYmFja2dyb3VuZDogIzIyMjsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgei1pbmRleDogMzsgCiAgICAgICAgb3ZlcmZsb3c6IHNjcm9sbDsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudC52aXNpYmxlIHsKICAgICAgICBtYXJnaW4tbGVmdDogMDsKICAgICAgfQogICAgICAKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgewogICAgICAgIHBhZGRpbmc6IDFlbTsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgYS5idXR0b24sCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgcGFkZGluZzogLjVlbSAuN2VtOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgICB9CgogICAgICAjb3ZlcmxheSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICB6LWluZGV4OiAzOwogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICBvcGFjaXR5OiAuNTsKICAgICAgfQoKICAgICAgLnZpc2libGUgewogICAgICAgIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgCiAgICAgICNzaGFyZS1kaWFsb2cgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHdpZHRoOiBjYWxjKDEwMHZ3IC0gNmVtKTsKICAgICAgICBoZWlnaHQ6IDUwJTsKICAgICAgICBiYWNrZ3JvdW5kOiAjZmZmOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDFlbTsKICAgICAgICB6LWluZGV4OiA0OwogICAgICAgIG1hcmdpbi1sZWZ0OiAyZW07CiAgICAgICAgbWFyZ2luLXRvcDogMmVtOwogICAgICAgIHBhZGRpbmc6IDFlbTsKICAgICAgfQogICAgICAKICAgICAgaDIgewogICAgICAgIG1hcmdpbi10b3A6IDA7CiAgICAgIH0KICAgICAgCiAgICAgIHN2ZyB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgICN0ZW1wbGF0ZSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8ZGl2IGlkPSJ0ZW1wbGF0ZSI+CiAgICAgIDxzdmcgY2xhc3M9ImhlYXJ0c3ZnIHN2Zy1pY29uIiB2aWV3Qm94PSIwIDAgMjAgMjAiPgogICAgICAgIDxwYXRoIGQ9Ik05LjcxOSwxNy4wNzNsLTYuNTYyLTYuNTFjLTAuMjctMC4yNjgtMC41MDQtMC41NjctMC42OTYtMC44ODhDMS4zODUsNy44OSwxLjY3LDUuNjEzLDMuMTU1LDQuMTRjMC44NjQtMC44NTYsMi4wMTItMS4zMjksMy4yMzMtMS4zMjljMS45MjQsMCwzLjExNSwxLjEyLDMuNjEyLDEuNzUyYzAuNDk5LTAuNjM0LDEuNjg5LTEuNzUyLDMuNjEyLTEuNzUyYzEuMjIxLDAsMi4zNjksMC40NzIsMy4yMzMsMS4zMjljMS40ODQsMS40NzMsMS43NzEsMy43NSwwLjY5Myw1LjUzN2MtMC4xOSwwLjMyLTAuNDI1LDAuNjE4LTAuNjk1LDAuODg3bC02LjU2Miw2LjUxQzEwLjEyNSwxNy4yMjksOS44NzUsMTcuMjI5LDkuNzE5LDE3LjA3MyBNNi4zODgsMy42MUM1LjM3OSwzLjYxLDQuNDMxLDQsMy43MTcsNC43MDdDMi40OTUsNS45MiwyLjI1OSw3Ljc5NCwzLjE0NSw5LjI2NWMwLjE1OCwwLjI2NSwwLjM1MSwwLjUxLDAuNTc0LDAuNzMxTDEwLDE2LjIyOGw2LjI4MS02LjIzMmMwLjIyNC0wLjIyMSwwLjQxNi0wLjQ2NiwwLjU3My0wLjcyOWMwLjg4Ny0xLjQ3MiwwLjY1MS0zLjM0Ni0wLjU3MS00LjU2QzE1LjU3LDQsMTQuNjIxLDMuNjEsMTMuNjEyLDMuNjFjLTEuNDMsMC0yLjYzOSwwLjc4Ni0zLjI2OCwxLjg2M2MtMC4xNTQsMC4yNjQtMC41MzYsMC4yNjQtMC42OSwwQzkuMDI5LDQuMzk3LDcuODIsMy42MSw2LjM4OCwzLjYxIj48L3BhdGg+CiAgICAgIDwvc3ZnPgogICAgICA8c3ZnIGNsYXNzPSJ2aWRlb3N2ZyBzdmctaWNvbiIgdmlld0JveD0iMCAwIDIwIDIwIj4KCQkJCTxwYXRoIGQ9Ik0xOC4xNzUsNC4xNDJIMS45NTFDMS43MDMsNC4xNDIsMS41LDQuMzQ0LDEuNSw0LjU5MnYxMC44MTZjMCwwLjI0NywwLjIwMywwLjQ1LDAuNDUxLDAuNDVoMTYuMjI0YzAuMjQ3LDAsMC40NS0wLjIwMywwLjQ1LTAuNDVWNC41OTJDMTguNjI1LDQuMzQ0LDE4LjQyMiw0LjE0MiwxOC4xNzUsNC4xNDIgTTQuNjU1LDE0Ljk1N0gyLjQwMXYtMS44MDNoMi4yNTNWMTQuOTU3ek00LjY1NSwxMi4yNTRIMi40MDF2LTEuODAzaDIuMjUzVjEyLjI1NHogTTQuNjU1LDkuNTQ5SDIuNDAxVjcuNzQ3aDIuMjUzVjkuNTQ5eiBNNC42NTUsNi44NDZIMi40MDFWNS4wNDNoMi4yNTNWNi44NDZ6TTE0LjU2OSwxNC45NTdINS41NTZWNS4wNDNoOS4wMTNWMTQuOTU3eiBNMTcuNzI0LDE0Ljk1N2gtMi4yNTN2LTEuODAzaDIuMjUzVjE0Ljk1N3ogTTE3LjcyNCwxMi4yNTRoLTIuMjUzdi0xLjgwM2gyLjI1M1YxMi4yNTR6TTE3LjcyNCw5LjU0OWgtMi4yNTNWNy43NDdoMi4yNTNWOS41NDl6IE0xNy43MjQsNi44NDZoLTIuMjUzVjUuMDQzaDIuMjUzVjYuODQ2eiI+PC9wYXRoPgoJCQk8L3N2Zz4KCQkJPHN2ZyBjbGFzcz0iaW1hZ2Vzdmcgc3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CgkJCQk8cGF0aCBkPSJNMTguNTU1LDE1LjM1NFY0LjU5MmMwLTAuMjQ4LTAuMjAyLTAuNDUxLTAuNDUtMC40NTFIMS44ODhjLTAuMjQ4LDAtMC40NTEsMC4yMDMtMC40NTEsMC40NTF2MTAuODA4YzAsMC41NTksMC43NTEsMC40NTEsMC40NTEsMC40NTFoMTYuMjE3aDAuMDA1QzE4Ljc5MywxNS44NTEsMTguNDc4LDE0LjgxNCwxOC41NTUsMTUuMzU0IE0yLjgsMTQuOTQ5bDQuOTQ0LTYuNDY0bDQuMTQ0LDUuNDE5YzAuMDAzLDAuMDAzLDAuMDAzLDAuMDAzLDAuMDAzLDAuMDA1bDAuNzk3LDEuMDRIMi44eiBNMTMuODIyLDE0Ljk0OWwtMS4wMDYtMS4zMTdsMS42ODktMi4yMThsMi42ODgsMy41MzVIMTMuODIyeiBNMTcuNjU0LDE0LjA2NGwtMi43OTEtMy42NjZjLTAuMTgxLTAuMjM3LTAuNTM1LTAuMjM3LTAuNzE2LDBsLTEuODk5LDIuNDkzbC00LjE0Ni01LjQyYy0wLjE4LTAuMjM3LTAuNTM2LTAuMjM3LTAuNzE2LDBsLTUuMDQ3LDYuNTk4VjUuMDQyaDE1LjMxNlYxNC4wNjR6IE0xMi40NzQsNi4zOTNjLTAuODY5LDAtMS41NzcsMC43MDctMS41NzcsMS41NzZzMC43MDgsMS41NzYsMS41NzcsMS41NzZzMS41NzctMC43MDcsMS41NzctMS41NzZTMTMuMzQzLDYuMzkzLDEyLjQ3NCw2LjM5MyBNMTIuNDc0LDguNjQ1Yy0wLjM3MSwwLTAuNjc2LTAuMzA0LTAuNjc2LTAuNjc2czAuMzA1LTAuNjc2LDAuNjc2LTAuNjc2YzAuMzcyLDAsMC42NzYsMC4zMDQsMC42NzYsMC42NzZTMTIuODQ2LDguNjQ1LDEyLjQ3NCw4LjY0NSI+PC9wYXRoPgoJCQk8L3N2Zz4KICAgICAgPGRpdiBpZD0iY29sc2NzcyI+CiAgICAgIC5jb2xzJHtjb2xzfSAjaW1hZ2VzIC5pdGVtIHsKICAgICAgICB3aWR0aDogY2FsYygxMDB2dyAvICR7Y29sc30pOwogICAgICB9CgogICAgICAuY29scyR7Y29sc30gI2ltYWdlcyAuaXRlbSB7CiAgICAgICAgaGVpZ2h0OiBjYWxjKDEwMHZ3IC8gJHtjb2xzfSk7CiAgICAgIH0KICAgICAgCiAgICAgIC5jb2xzJHtjb2xzfSAucXVlcnksCiAgICAgIC5jb2xzJHtjb2xzfSAubGlrZSB7CiAgICAgICAgZm9udC1zaXplOiBtaW4oMTR2dyAqICgxIC8gJHtjb2xzfSksIDZlbSAqICgxIC8gJHtjb2xzfSkpCiAgICAgIH0KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9InNoYXJlLWRpYWxvZyIgY2xhc3M9ImRpYWxvZyI+CiAgICAgIDxoMj5zaGFyZTwvaDI+CiAgICAgIDxmb3JtIGlkPSJzaGFyZS1mb3JtIiBhY3Rpb249IiMiPgogICAgICAgIDxwIGNsYXNzPSJjb250ZW50Ij48L3A+CiAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgY2xhc3M9InN1Ym1pdCIgdmFsdWU9Im9rIi8+CiAgICAgIDwvZm9ybT4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0ibWVkaWEtZm9vdGVyIj4KICAgICAgPGEgaWQ9ImltYWdlLWxpa2UiIGNsYXNzPSJsaWtlIiBocmVmPSIjIj48L2E+CiAgICAgIDxhIGlkPSJpbWFnZS1xdWVyeSIgaHJlZj0iIyI+PC9hPgogICAgICA8YSBpZD0iaW1hZ2UtdXNlciIgaHJlZj0iIyI+PC9hPgogICAgPC9kaXY+CiAgICA8Y2VudGVyIGlkPSJtZWRpYS1jb250YWluZXIiPgogICAgICA8ZGl2IGlkPSJpbWFnZS1jb250YWluZXIiPgogICAgICAgIDxpbWcgaWQ9ImltYWdlIi8+CiAgICAgIDwvZGl2PgogICAgPC9jZW50ZXI+CiAgICA8ZGl2IGlkPSJvdmVybGF5IiBjbGFzcz0iZGlhbG9nIj48L2Rpdj4KICAgIDxkaXYgaWQ9Im1lbnUtY29udGVudCIgY2xhc3M9ImRpYWxvZyI+CiAgICAgIDxkaXYgY2xhc3M9Iml0ZW1zIj4KICAgICAgICA8aDE+PGEgY2xhc3M9InRpdGxlIiBocmVmPSIjIj5maWxlcy5odG1sPC9hPjwvaDE+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmF1dG9wbGF5PC9kaXY+CiAgICAgICAgPGEgY2xhc3M9ImJ1dHRvbiBzZXRhdXRvcGxheSIgZGF0YS1hdXRvcGxheT0ib24iIGhyZWY9IiMiPm9uPC9hPgogICAgICAgIDxhIGNsYXNzPSJidXR0b24gc2V0YXV0b3BsYXkiIGRhdGEtYXV0b3BsYXk9Im9mZiIgaHJlZj0iIyI+b2ZmPC9hPgogICAgICAgIDxhIGNsYXNzPSJidXR0b24gc2V0YXV0b3BsYXkiIGRhdGEtYXV0b3BsYXk9ImhvdmVyIiBocmVmPSIjIj5tb3VzZW92ZXI8L2E+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmNvbHVtbnM8L2Rpdj4KICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIHNldGNvbHMiIGRhdGEtY29scz0iMSIgaHJlZj0iIyI+MTwvYT4KICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIHNldGNvbHMiIGRhdGEtY29scz0iMiIgaHJlZj0iIyI+MjwvYT4KICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIHNldGNvbHMiIGRhdGEtY29scz0iNCIgaHJlZj0iIyI+NDwvYT4KICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIHNldGNvbHMiIGRhdGEtY29scz0iNiIgaHJlZj0iIyI+NjwvYT4KICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIHNldGNvbHMiIGRhdGEtY29scz0iMTAiIGhyZWY9IiMiPjEwPC9hPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5jb25uZWN0aW9uczwvZGl2PgogICAgICAgIDxkaXYgaWQ9ImNvbm5jb3VudCI+MDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5yZWxheXM6PC9kaXY+CiAgICAgICAgPHA+UGxlYXNlIHVzZSByZWxheXMgd2l0aCBOSVAtNTAgKHNlYXJjaCkgZnVuY3Rpb25hbGl0eTwvcD4KICAgICAgICA8Zm9ybSBhY3Rpb249IiMiIGlkPSJyZWxheXMtZm9ybSI+CiAgICAgICAgICA8dGV4dGFyZWEgaWQ9InJlbGF5cyI+PC90ZXh0YXJlYT4KICAgICAgICAgIDxpbnB1dCBjbGFzcz0ic3VibWl0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJzYXZlIHJlbGF5cyIvPgogICAgICAgIDwvZm9ybT4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+cHJpdmF0ZSBrZXk6PC9kaXY+CiAgICAgICAgPHA+SWYgeW91IGNhbnQgdXNlIGJyb3dzZXIgYWRkb24gKG1vYmlsZSk8L3A+CiAgICAgICAgPGZvcm0gYWN0aW9uPSIjIiBpZD0icHJpdmtleS1mb3JtIj4KICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0icHJpdmtleSIvPgogICAgICAgICAgPGlucHV0IGNsYXNzPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9InNhdmUga2V5Ii8+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5sb2dzPC9kaXY+CiAgICAgICAgPGRpdiBpZD0ibG9ncyI+PC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmxhdGVzdCByZWxlYXNlOjwvZGl2PgogICAgICAgIDxhIGNsYXNzPSJidXR0b24iIGlkPSJyZWxlYXNlIiBocmVmPSIjIj48L2E+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJoZWFkZXIiPgogICAgICA8ZGl2IGNsYXNzPSJpY29ucyI+CiAgICAgICAgPGEgaWQ9ImZpbHRlci1saWtlcyIgaHJlZj0iIyIgY2xhc3M9ImhlYWRlci1pY29uIj48L2E+CiAgICAgICAgPGEgaWQ9InNoYXJlIiBocmVmPSIjIiBjbGFzcz0iaGVhZGVyLWljb24iPgogICAgICAgICAgPHN2ZyBjbGFzcz0ic3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CgkJCQkgICAgPHBhdGggZD0iTTE0LjY4LDEyLjYyMWMtMC45LDAtMS43MDIsMC40My0yLjIxNiwxLjA5bC00LjU0OS0yLjYzN2MwLjI4NC0wLjY5MSwwLjI4NC0xLjQ1NywwLTIuMTQ2bDQuNTQ5LTIuNjM4YzAuNTE0LDAuNjYxLDEuMzE1LDEuMDksMi4yMTYsMS4wOWMxLjU0OSwwLDIuODA5LTEuMjYsMi44MDktMi44MDhjMC0xLjU0OC0xLjI2LTIuODA5LTIuODA5LTIuODA5Yy0xLjU0OCwwLTIuODA4LDEuMjYtMi44MDgsMi44MDljMCwwLjM4LDAuMDc2LDAuNzQxLDAuMjE0LDEuMDczbC00LjU1LDIuNjM4Yy0wLjUxNS0wLjY2MS0xLjMxNi0xLjA5LTIuMjE3LTEuMDljLTEuNTQ4LDAtMi44MDgsMS4yNi0yLjgwOCwyLjgwOXMxLjI2LDIuODA4LDIuODA4LDIuODA4YzAuOSwwLDEuNzAyLTAuNDMsMi4yMTctMS4wOWw0LjU1LDIuNjM3Yy0wLjEzOCwwLjMzMi0wLjIxNCwwLjY5My0wLjIxNCwxLjA3NGMwLDEuNTQ5LDEuMjYsMi44MDksMi44MDgsMi44MDljMS41NDksMCwyLjgwOS0xLjI2LDIuODA5LTIuODA5UzE2LjIyOSwxMi42MjEsMTQuNjgsMTIuNjIxTTE0LjY4LDIuNTEyYzEuMTM2LDAsMi4wNiwwLjkyMywyLjA2LDIuMDZTMTUuODE1LDYuNjMsMTQuNjgsNi42M3MtMi4wNTktMC45MjMtMi4wNTktMi4wNTlTMTMuNTQ0LDIuNTEyLDE0LjY4LDIuNTEyTTUuMzE5LDEyLjA2MWMtMS4xMzYsMC0yLjA2LTAuOTI0LTIuMDYtMi4wNnMwLjkyMy0yLjA1OSwyLjA2LTIuMDU5YzEuMTM1LDAsMi4wNiwwLjkyMywyLjA2LDIuMDU5UzYuNDU0LDEyLjA2MSw1LjMxOSwxMi4wNjFNMTQuNjgsMTcuNDg4Yy0xLjEzNiwwLTIuMDU5LTAuOTIyLTIuMDU5LTIuMDU5czAuOTIzLTIuMDYxLDIuMDU5LTIuMDYxczIuMDYsMC45MjQsMi4wNiwyLjA2MVMxNS44MTUsMTcuNDg4LDE0LjY4LDE3LjQ4OCI+PC9wYXRoPgoJCQkgICAgPC9zdmc+CgkJCSAgPC9hPgoJCQk8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iaXRlbXMiPgogICAgICAgIDxhIGNsYXNzPSJ0aXRsZSIgaHJlZj0iIyI+ZmlsZXMuaHRtbDwvYT4KICAgICAgICA8YSBpZD0ibWVudSIgaHJlZj0iIyI+CiAgICAgICAgICA8c3ZnIGNsYXNzPSJtZW51c3ZnIHN2Zy1pY29uIiB2aWV3Qm94PSIwIDAgMjAgMjAiPgoJCSAgICAgICAgPHBhdGggZD0iTTEwLDEuNDQ1Yy00LjcyNiwwLTguNTU1LDMuODI5LTguNTU1LDguNTU1YzAsNC43MjUsMy44MjksOC41NTUsOC41NTUsOC41NTVjNC43MjUsMCw4LjU1NS0zLjgzLDguNTU1LTguNTU1QzE4LjU1NSw1LjI3NCwxNC43MjUsMS40NDUsMTAsMS40NDUgTTEwLDE3LjY1NGMtNC4yMjEsMC03LjY1NC0zLjQzNC03LjY1NC03LjY1NGMwLTQuMjIxLDMuNDMzLTcuNjU0LDcuNjU0LTcuNjU0YzQuMjIyLDAsNy42NTQsMy40MzMsNy42NTQsNy42NTRDMTcuNjU0LDE0LjIyMSwxNC4yMjIsMTcuNjU0LDEwLDE3LjY1NCBNMTQuMzksMTBjMCwwLjI0OC0wLjIwMywwLjQ1LTAuNDUsMC40NUg2LjA2Yy0wLjI0OCwwLTAuNDUtMC4yMDMtMC40NS0wLjQ1czAuMjAzLTAuNDUsMC40NS0wLjQ1aDcuODc5QzE0LjE4Nyw5LjU1LDE0LjM5LDkuNzUyLDE0LjM5LDEwIE0xNC4zOSwxMi43MDJjMCwwLjI0Ny0wLjIwMywwLjQ0OS0wLjQ1LDAuNDQ5SDYuMDZjLTAuMjQ4LDAtMC40NS0wLjIwMi0wLjQ1LTAuNDQ5YzAtMC4yNDgsMC4yMDMtMC40NTEsMC40NS0wLjQ1MWg3Ljg3OUMxNC4xODcsMTIuMjUxLDE0LjM5LDEyLjQ1NCwxNC4zOSwxMi43MDIgTTE0LjM5LDcuMjk4YzAsMC4yNDgtMC4yMDMsMC40NS0wLjQ1LDAuNDVINi4wNmMtMC4yNDgsMC0wLjQ1LTAuMjAzLTAuNDUtMC40NXMwLjIwMy0wLjQ1LDAuNDUtMC40NWg3Ljg3OUMxNC4xODcsNi44NDgsMTQuMzksNy4wNTEsMTQuMzksNy4yOTgiPjwvcGF0aD4KCSAgICAgICAgPC9zdmc+CiAgICAgICAgPC9hPgogICAgICAgIDxmb3JtIGlkPSJxdWVyeS1mb3JtIiBhY3Rpb249IiMiPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJxdWVyeSIgbmFtZT0icXVlcnkiIGlkPSIiIC8+CiAgICAgICAgICA8c2VsZWN0IGlkPSJxdWVyeS10eXBlIj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iYWxsIj5hbGw8L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaW1hZ2UiPmltYWdlczwvb3B0aW9uPgogICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJ2aWRlbyI+dmlkZW9zPC9vcHRpb24+CiAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgIDxpbnB1dCBpZD0iZ28iIHR5cGU9InN1Ym1pdCIgdmFsdWU9ImdvIi8+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxzcGFuIGlkPSJxdWVyeWRpc3BsYXkiPgogICAgICAgICAgPHNwYW4gY2xhc3M9InRleHQiPjwvc3Bhbj4KICAgICAgICA8L3NwYW4+CiAgICAgICAgPGRpdiBpZD0ibG9hZGluZyI+dXBkYXRpbmc8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9ImltYWdlcyI+PC9kaXY+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly91bnBrZy5jb20vbm9zdHItdG9vbHMvbGliL25vc3RyLmJ1bmRsZS5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9zbG93bGkuZ2l0aHViLmlvL2JlY2gzMi1idWZmZXIvYXNzZXRzL2pzL2JlY2gzMi1idWZmZXIubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQ+CiAgICAgIGNvbnN0IHVwZGF0ZXNwdWJrZXkgPSAiYWU1YzZlMGI3NDY2MGQyMTk0YzgyNTRiNWMyYzgyNTY3NjU3NmJlMDI5NzM3OWZhMjA1MjMxMTRhNmE4NWU4NyIKICAgICAgY29uc3QgcXVlcmllcyA9IHsgCiAgICAgICAgImF1dGhvciI6ICdbIlJFUSIsIjxJPiIseyJraW5kcyI6WzFdLCJhdXRob3JzIjpbIjxQPiJdfV0nCiAgICAgIH0KICAgICAgcXMoIiNyZWxheXMiKS52YWx1ZSA9IHJlbGF5cygpLmpvaW4oIlxuIikKICAgICAgcXMoIiNwcml2a2V5IikudmFsdWUgPSBwcml2a2V5KCkKICAgICAgY29uc3QgY29sb3B0cyA9IFsxLCAyLCA0LCA2LCAxMF0KCiAgICAgIGNvbHMgPSAoKSA9PiBwYXJzZUludChzZXR0aW5nKCJjb2xzIiwgY29sb3B0c1syXSksIDEwKQogICAgICBhdXRvcGxheSA9ICgpID0+IHNldHRpbmcoImF1dG9wbGF5IiwgIm9mZiIpCiAgICAgIGxpbWl0ID0gKCkgPT4gcGFyc2VJbnQoc2V0dGluZygibGltaXQiLCAxNSksIDEwKQogICAgICBnYWxsZXJ5ID0gKCkgPT4gewogICAgICAgIGxldCBnYWxsZXJ5bWF0Y2hlciA9IGxvY2F0aW9uLnNlYXJjaC5tYXRjaCgvZ2FsbGVyeT0oW2EtejAtOV0rKS8pCiAgICAgICAgcmV0dXJuIGdhbGxlcnltYXRjaGVyICYmIGdhbGxlcnltYXRjaGVyWzFdCiAgICAgIH0KICAgICAgCiAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgiY29scyIgKyBjb2xzKCkpCgogICAgICBsZXQgcHJvdG9jb2wgPSBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvKSA/ICJub3N0cjoiIDogIndlYitub3N0cjoiCiAgICAgIGxldCBzb2NrZXRzID0gW10KICAgICAgbGV0IHJlc2hhbmRsZXJzID0gW10KICAgICAgbGV0IHVybHMgPSBbXQogICAgICBsZXQgbGlrZXMgPSBbXQogICAgICBsZXQgbmV3bGlrZXMgPSBbXQogICAgICBsZXQgaWRjb3VudGVyID0gMAogICAgICBsZXQgcXVlcnl3YWl0ID0gbnVsbAogICAgICBsZXQgcHJpbWFsc29ja2V0ID0gbnVsbAogICAgICBsZXQgdHlwZXMgPSB7CiAgICAgICAgaW1hZ2U6IFsicG5nIiwgImpwZyIsICJqcGVnIiwgIndlYnAiXSwKICAgICAgICB2aWRlbzogWyJtcDQiLCAid2VibSJdCiAgICAgIH0KICAgICAgbGV0IGltZ3JlZ2V4ID0gL2h0dHAofHMpXDpcL1wvW14gXG5dKj9cLihwbmd8anBnfGpwZWd8d2VicCkvZ2kKICAgICAgbGV0IHZpZGVvcmVnZXggPSAvaHR0cCh8cylcOlwvXC9bXiBcbl0qP1wuKG1wNHx3ZWJtKS9naQogICAgICBsZXQgdmlkZW9leHRyZWdleCA9IC9cLihtcDR8d2VibSkkL2kKICAgICAgbGV0IGltZ2V4dHJlZ2V4ID0gL1wuKHBuZ3xqcGd8anBlZ3x3ZWJwKSQvaQogICAgICB3YWl0bXMgPSA1MDAwMAogICAgICBxdWVyeXN0ciA9ICIiCiAgICAgIGxldCBxdWVyeWNvdW50ID0gMAogICAgICBsZXQgaG92ZXJlZHZpZGVvID0gbnVsbAogICAgICAKICAgICAgdXBkYXRlcXVlcnkoKQogICAgICBxcygiI2ltYWdlLWxpa2UiKS5pbm5lckhUTUwgPSBxcygiI2ZpbHRlci1saWtlcyIpLmlubmVySFRNTCA9IHFzKCIjdGVtcGxhdGUgLmhlYXJ0c3ZnIikub3V0ZXJIVE1MCiAgICAgIHNldGFjdGl2ZSgic2V0Y29scyIsICJjb2xzIiwgY29scygpKQogICAgICBzZXRhY3RpdmUoInNldGF1dG9wbGF5IiwgImF1dG9wbGF5IiwgYXV0b3BsYXkoKSkKICAgICAgCiAgICAgIGZ1bmN0aW9uIGZyb21IZXhTdHJpbmcoc3RyKXsKICAgICAgICBsZXQgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoc3RyLmxlbmd0aCAvIDIpCiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBidWZmZXIubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGJ1ZmZlcltpXSA9IHBhcnNlSW50KHN0ci5zdWJzdHIoMiAqIGksIDIpLCAxNikKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGJ1ZmZlcgogICAgICB9CiAgCiAgICAgIGZ1bmN0aW9uIHJlbGF5cygpewogICAgICAgIGNvbnN0IG9iaiA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oInJlbGF5cyIpKQogICAgICAgIGNvbnN0IHIgPSBvYmogJiYgb2JqLmZpbHRlcihyID0+IHIubWF0Y2goL3dzczpcL1wvLisvKSkgfHwgW10KICAgICAgICAKICAgICAgICByZXR1cm4gci5sZW5ndGggPiAwICYmIHIgfHwgWwogICAgICAgICAgIndzczovL3JlbGF5Lm5vc3RyLmJhbmQiLAogICAgICAgICAgIndzczovL25iLnJlbGF5LmNlbnRlciIsIAogICAgICAgICAgIndzczovL25vc3RyLmNvbXBpbGUtZXJyb3IubmV0IgogICAgICAgIF0KICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcHJpdmtleSgpewogICAgICAgIGxldCBrZXkgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgicHJpdmtleSIpIHx8ICIiCiAgICAgICAgCiAgICAgICAgaWYoa2V5Lmxlbmd0aCA9PSA2Myl7CiAgICAgICAgICBrZXkgPSBOb3N0clRvb2xzLm5pcDE5LmRlY29kZShrZXkpLmRhdGEKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuIGtleS5sZW5ndGggPT0gNjQgJiYga2V5IHx8IG51bGwKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gc2V0dGluZyhrZXksIGRlZmF1bHR2YWx1ZSl7CiAgICAgICAgY29uc3QgdiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSkKICAgICAgICByZXR1cm4gdiAmJiBvcHRpb24oInNldCIgKyBrZXksIGtleSwgdikgJiYgdiB8fCBkZWZhdWx0dmFsdWUKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gb3B0aW9uKGMsIGtleSwgdmFsKXsKICAgICAgICByZXR1cm4gcXMoIi4iICsgYyArICJbZGF0YS0iICsga2V5ICsgIj0nIiArIHZhbCArICInXSIpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHFzKHEpewogICAgICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHEpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHFzYShxKXsKICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHEpKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBnaWQoaSl7CiAgICAgICAgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGkpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHF1ZXJ5dHlwZSgpewogICAgICAgIHJldHVybiBxcygiI3F1ZXJ5LXR5cGUiKS52YWx1ZSB8fCAiYWxsIgogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiB1cGRhdGVxdWVyeSgpewogICAgICAgIGxldCBwYXJ0cyA9IChnYWxsZXJ5KCkgJiYgKCJnOiIgKyBnYWxsZXJ5KCkpIHx8IGRlY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5oYXNoLnN1YnN0cmluZygxKSkpLnNwbGl0KCIvIikKICAgICAgICBxcygiI3F1ZXJ5ZGlzcGxheSAudGV4dCIpLmlubmVyVGV4dCA9IHBhcnRzWzBdLnN1YnN0cmluZygwLCAyMCkKICAgICAgICBxdWVyeXN0ciA9IHBhcnRzWzBdCiAgICAgICAgcXMoIiNxdWVyeSIpLnZhbHVlID0gcGFydHNbMF0KICAgICAgICBxcygiI3F1ZXJ5LXR5cGUiKS52YWx1ZSA9IHBhcnRzWzFdIHx8ICJhbGwiCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGFjdGl2ZSgpewogICAgICAgIHJldHVybiBxcygiI2ltYWdlcyAuYWN0aXZlIikKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gaW1hZ2VvZmZzZXQob2Zmc2V0KXsKICAgICAgICBjb25zdCBpbWFnZXMgPSBxc2EoIiNpbWFnZXMgPiAuaXRlbSIpLmZpbHRlcihlID0+IGUuY2xhc3NMaXN0LmNvbnRhaW5zKCJ2aXNpYmxlIikpCiAgICAgICAgcmV0dXJuIGltYWdlc1tpbWFnZXMuaW5kZXhPZihhY3RpdmUoKSkrb2Zmc2V0XQogICAgICB9CgogICAgICBmdW5jdGlvbiBsYXN0YWN0aXZlKCl7CiAgICAgICAgcmV0dXJuIHFzYSgiI2ltYWdlcyAuYWN0aXZlIikucG9wKCkgICAgICAKICAgICAgfQoKICAgICAgZnVuY3Rpb24gbWVudSgpewogICAgICAgIHFzYSgiI21lbnUtY29udGVudCwgI292ZXJsYXkiKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QudG9nZ2xlKCJ2aXNpYmxlIikpCiAgICAgIH0KICAKICAgICAgZnVuY3Rpb24gc2V0YWN0aXZlKGMsIGtleSwgdmFsKXsKICAgICAgICBxc2EoIi4iICsgYykuZm9yRWFjaChuID0+IG4uY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikpCiAgICAgICAgY29uc3Qgb3B0aW9uID0gcXMoIi4iICsgYyArICJbZGF0YS0iICsga2V5ICsgIj0nIiArIHZhbCArICInXSIpCiAgICAgICAgb3B0aW9uPy5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBzY3JvbGx2aXNpYmxlKG4sIG9mZnNldCl7CiAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0IHx8IDAKICAgICAgICByZXR1cm4gKG4ub2Zmc2V0VG9wICsgbi5vZmZzZXRIZWlnaHQpID49IChzY3JvbGxZIC0gb2Zmc2V0KQogICAgICAgICAgJiYgbi5vZmZzZXRUb3AgPD0gKHNjcm9sbFkgKyB2aXN1YWxWaWV3cG9ydC5oZWlnaHQgKyBvZmZzZXQpCiAgICAgIH0KCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZWltYWdlc2xvYWQoKXsKICAgICAgICBxc2EoIiNpbWFnZXMgLml0ZW0uaW1nIikuZm9yRWFjaChhc3luYyBpbWcgPT4gewogICAgICAgICAgaWYoc2Nyb2xsdmlzaWJsZShpbWcsIHZpc3VhbFZpZXdwb3J0LmhlaWdodCAvIDIpKXsKICAgICAgICAgICAgaW1nLnN0eWxlLmJhY2tncm91bmRJbWFnZSA9ICJ1cmwoIiArIGltZ1siZGF0YS1zcmMiXSArICIpIgogICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIGltZy5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSAiIgogICAgICAgICAgfQogICAgICAgIH0pCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZWFsbHZpZGVvcGxheSgpewogICAgICAgIHFzYSgiI2ltYWdlcyAuaXRlbS52aWRlbyIpLmZvckVhY2goYXN5bmMgbiA9PiB1cGRhdGV2aWRlb3BsYXkobikpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZXZpZGVvcGxheShuKXsKICAgICAgICBjb25zdCBhcGxheSA9IGF1dG9wbGF5KCkKICAgICAgICBjb25zdCB2ID0gbi5xdWVyeVNlbGVjdG9yKCJ2aWRlbyIpCiAgICAgICAgCiAgICAgICAgaWYoYXBsYXkgIT0gIm9uIil7CiAgICAgICAgICB2Lm11dGVkID0gZmFsc2UKICAgICAgICAgIHYucGF1c2UoKQogICAgICAgIH1lbHNlewogICAgICAgICAgdi5tdXRlZCA9IHRydWUKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoIXNjcm9sbHZpc2libGUobikpewogICAgICAgICAgaWYodi5yZWFkeVN0YXRlID09IDQpewogICAgICAgICAgICB2LnBhdXNlKCkKICAgICAgICAgIH1lbHNlewogICAgICAgICAgICB2LnByZWxvYWQgPSAibm9uZSIKICAgICAgICAgIH0KICAgICAgICB9ZWxzZSBpZih2LnJlYWR5U3RhdGUgIT0gNCl7CiAgICAgICAgICB2LnByZWxvYWQgPSAiYXV0byIKICAgICAgICB9CiAgICAgICAgZWxzZSBpZihhcGxheSA9PSAib24iIHx8IChhcGxheSA9PSAiaG92ZXIiICYmIHYgPT0gaG92ZXJlZHZpZGVvKSl7CiAgICAgICAgICB2LnBsYXkoKQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIiwgZSA9PiB7CiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKQogICAgICAgIHVwZGF0ZWltYWdlc2xvYWQoKQogICAgICAgIHVwZGF0ZWFsbHZpZGVvcGxheSgpCiAgICAgIH0pCiAgICAgIAogICAgICBsZXQgdG91Y2ggPSBudWxsCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IiwgZSA9PiB0b3VjaCA9IGUuY2hhbmdlZFRvdWNoZXNbMF0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsIGUgPT4gewogICAgICAgIGNvbnN0IHhkaWZmID0gZS5jaGFuZ2VkVG91Y2hlc1swXS5zY3JlZW5YIC0gdG91Y2guc2NyZWVuWAoKICAgICAgICBpZih4ZGlmZiA8IC01MCl7CiAgICAgICAgICBzd2lwZSgxKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZih4ZGlmZiA+IDUwKXsKICAgICAgICAgIHN3aXBlKC0xKQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIHFzKCIjcXVlcnktZm9ybSIpLmFkZEV2ZW50TGlzdGVuZXIoInN1Ym1pdCIsIGUgPT4gewogICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgIHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZShudWxsLCBudWxsLCBsb2NhdGlvbi5wYXRobmFtZSkKICAgICAgICBsb2NhdGlvbi5oYXNoID0gIiMiICsgZW5jb2RlVVJJQ29tcG9uZW50KHFzKCIjcXVlcnkiKS52YWx1ZSArICIvIiArIHF1ZXJ5dHlwZSgpKQogICAgICAgIHVwZGF0ZXF1ZXJ5KCkKICAgICAgICBxdWVyeXdhaXQucmVzb2x2ZSgpCiAgICAgIH0pCgogICAgICBxcygiI3JlbGF5cy1mb3JtIikuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgYXN5bmMgZSA9PiB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgbGV0IHIgPSBKU09OLnN0cmluZ2lmeShxcygiI3JlbGF5cyIpLnZhbHVlLnNwbGl0KCJcbiIpKQogICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJyZWxheXMiLCByKQogICAgICAgIGRpc2Nvbm5lY3QoKQogICAgICB9KQogICAgICAKICAgICAgcXMoIiNzaGFyZS1mb3JtIikuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgYXN5bmMgZSA9PiB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgCiAgICAgICAgaWYocXMoIiNzaGFyZS1mb3JtIC5zdWJtaXQiKS52YWx1ZSA9PSAiY2xvc2UiKXsKICAgICAgICAgIHFzYSgiLmRpYWxvZy52aXNpYmxlIikuZm9yRWFjaChuID0+IG4uY2xhc3NMaXN0LnJlbW92ZSgidmlzaWJsZSIpKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IGV2ZW50cyA9IHFzYSgiI2ltYWdlcyAuaXRlbSIpLmZpbHRlcihuID0+IG4ub2Zmc2V0UGFyZW50KS5tYXAobiA9PiBuWyJkYXRhLWV2ZW50Il0uaWQpCiAgICAgICAgY29uc3QgZXZlbnQgPSBhd2FpdCBwdWJsaXNoKHsKICAgICAgICAgICJraW5kIjogMzMzLAogICAgICAgICAgImNvbnRlbnQiOiBKU09OLnN0cmluZ2lmeShldmVudHMpLAogICAgICAgICAgInRhZ3MiOiBbXQogICAgICAgIH0pCgogICAgICAgIGF3YWl0IHdhaXRyZXMobnVsbCwgIk9LIikKCiAgICAgICAgY29uc3QgdXJsID0gd2luZG93LmxvY2F0aW9uLm9yaWdpbiArIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZQogICAgICAgIAogICAgICAgIGNvbnN0IHB1Ymxpc2hlZGV2ZW50ID0gYXdhaXQgcHVibGlzaCh7CiAgICAgICAgICAia2luZCI6IDEsCiAgICAgICAgICAiY29udGVudCI6ICJUaGlzIGlzIGEgZ2FsbGVyeSBvZiAiICsgZXZlbnRzLmxlbmd0aAogICAgICAgICAgICArICIgaW1hZ2VzL3ZpZGVvcyBzaGFyZWQgZnJvbSBmaWxlcy5odG1sLiBDaGVjayBpdCBvdXQgaGVyZTogIiArIHVybCArICI/Z2FsbGVyeT0iICsgZXZlbnQuaWQsCiAgICAgICAgICAidGFncyI6IFsKICAgICAgICAgICAgWyIjZSIsIGV2ZW50LmlkXSwgCiAgICAgICAgICAgIFsiI3AiLCBldmVudC5wdWJrZXldCiAgICAgICAgICBdCiAgICAgICAgfSkKCiAgICAgICAgYXdhaXQgd2FpdHJlcyhudWxsLCAiT0siKQogICAgICAgIAogICAgICAgIGNvbnN0IGJlY2gzMmlkID0gYmVjaDMyLmVuY29kZSgibm90ZSIsIGZyb21IZXhTdHJpbmcocHVibGlzaGVkZXZlbnQuaWQpKQogICAgICAgIHFzKCIjc2hhcmUtZm9ybSAuY29udGVudCIpLmlubmVySFRNTCA9ICdOb3RlIHB1Ymxpc2hlZCA8YSBocmVmPSInICsgcHJvdG9jb2wgKyBiZWNoMzJpZCArICciPicgKyBiZWNoMzJpZCArICc8L2E+JwogICAgICAgIHFzKCIjc2hhcmUtZm9ybSAuc3VibWl0IikudmFsdWUgPSAiY2xvc2UiCiAgICAgIH0pCgogICAgICBxcygiI3ByaXZrZXktZm9ybSIpLmFkZEV2ZW50TGlzdGVuZXIoInN1Ym1pdCIsIGFzeW5jIGUgPT4gewogICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgIGNvbnN0IGtleSA9IHFzKCIjcHJpdmtleSIpLnZhbHVlCgogICAgICAgIGlmKGtleS5sZW5ndGggIT0gNjQgJiYga2V5Lmxlbmd0aCAhPSA2Myl7CiAgICAgICAgICBhbGVydCgia2V5IHNob3VsZCBiZSA2MyBvciA2NCBjaGFyYWN0ZXJzIGxvbmciKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJwcml2a2V5Iiwga2V5KQogICAgICAgIGFsZXJ0KCJrZXkgc2F2ZWQiKQogICAgICB9KQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwgYXN5bmMgKGUpID0+IHsKICAgICAgICBpZihhdXRvcGxheSgpID09ICJob3ZlciIgJiYgZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ2aWRlby1jb250YWluZXIiKSl7CiAgICAgICAgICBob3ZlcmVkdmlkZW8gPSBlLnRhcmdldC5xdWVyeVNlbGVjdG9yKCJ2aWRlbyIpCiAgICAgICAgICBob3ZlcmVkdmlkZW8ucGxheSgpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLCBhc3luYyAoZSkgPT4gewogICAgICAgIGhvdmVyZWR2aWRlbyA9IGZhbHNlCiAgICAgICAgaWYoIXFzKCIjbWVkaWEtY29udGFpbmVyIikuY2xhc3NMaXN0LmNvbnRhaW5zKCJ2aXNpYmxlIikgJiYgYXV0b3BsYXkoKSA9PSAiaG92ZXIiICYmIGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygidmlkZW8tY29udGFpbmVyIikpewogICAgICAgICAgcXNhKCJ2aWRlbyIpLmZvckVhY2godiA9PiB2LnBhdXNlKCkpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBhc3luYyAoZSkgPT4gewogICAgICAgIGlmKGUudGFyZ2V0LnR5cGUgPT0gInN1Ym1pdCIgfHwgKGUudGFyZ2V0LnRhZ05hbWUgPT0gIkEiICYmIGUudGFyZ2V0LmhyZWYubWF0Y2goL14ofHdlYlwrKW5vc3RyXDovKSkpewogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0aXRsZSIpKXsKICAgICAgICAgIHFzKCIjcXVlcnkiKS52YWx1ZSA9ICIiCiAgICAgICAgICBxcygiI3F1ZXJ5LXR5cGUiKS52YWx1ZSA9ICJhbGwiCiAgICAgICAgICBxcygiI2dvIikuY2xpY2soKQogICAgICAgIH0KCiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCgogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJmaWx0ZXItbGlrZXMiKXsKICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnRvZ2dsZSgiZmlsdGVyLWxpa2VzIikKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLnRhcmdldC5pZCA9PSAic2hhcmUiKXsKICAgICAgICAgIGNvbnN0IGV2ZW50cyA9IHFzYSgiI2ltYWdlcyAuaXRlbSIpLmZpbHRlcihuID0+IG4ub2Zmc2V0UGFyZW50KS5tYXAobiA9PiBuWyJkYXRhLWV2ZW50Il0uaWQpCiAgICAgICAgICAvL2NvbnN0IHRleHQgPSB7dHlwZTogIiIsIGV2ZW50czogfQogICAgICAgICAgcXMoIiNzaGFyZS1kaWFsb2cgLmNvbnRlbnQiKS5pbm5lckhUTUwgPSAiPHA+U2hhcmUgbGluayB0byB0aGlzIGdhbGxlcnkgb2YgIiArIGV2ZW50cy5sZW5ndGggKyAiIGltYWdlcy92aWRlb3MgdG8geW91ciBub3N0ciBwcm9maWxlPzwvcD4iCiAgICAgICAgICBxcygiI3NoYXJlLWZvcm0gLnN1Ym1pdCIpLnZhbHVlID0gInB1Ymxpc2giCiAgICAgICAgICBxc2EoIiNzaGFyZS1kaWFsb2csICNvdmVybGF5IikuZm9yRWFjaChuID0+IG4uY2xhc3NMaXN0LnRvZ2dsZSgidmlzaWJsZSIpKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNob3ciKSl7CiAgICAgICAgICBhY3RpdmUoKT8uY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIGNvbnN0IGlkID0gZS50YXJnZXQuaWQgfHwgZS50YXJnZXRbImRhdGEtaXRlbS1pZCJdCiAgICAgICAgICBnaWQoaWQpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBzaG93KGlkKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUudGFyZ2V0LnRhZ05hbWUgIT0gIkEiICYmIChxcygiI2ltYWdlLWNvbnRhaW5lciIpID09IGUudGFyZ2V0IHx8IHFzKCIjaW1hZ2UiKSA9PSBlLnRhcmdldCB8fCBxcygiI21lZGlhLWNvbnRhaW5lciB2aWRlbyIpID09IGUudGFyZ2V0KSl7CiAgICAgICAgICBoaWRlbWVkaWEoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLnRhcmdldC5pZCA9PSAibWVudSIpewogICAgICAgICAgbWVudSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJvdmVybGF5Iil7CiAgICAgICAgICBxc2EoIi5kaWFsb2cudmlzaWJsZSIpLmZvckVhY2gobiA9PiBuLmNsYXNzTGlzdC5yZW1vdmUoInZpc2libGUiKSkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNldGNvbHMiKSl7CiAgICAgICAgICBmb3IobGV0IGMgb2YgY29sb3B0cyl7CiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgiY29scyIgKyBjKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoImNvbHMiICsgZS50YXJnZXQuZGF0YXNldC5jb2xzKQogICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oImNvbHMiLCBlLnRhcmdldC5kYXRhc2V0LmNvbHMpCiAgICAgICAgICBzZXRhY3RpdmUoInNldGNvbHMiLCAiY29scyIsIGNvbHMoKSkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNldGF1dG9wbGF5IikpewogICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oImF1dG9wbGF5IiwgZS50YXJnZXQuZGF0YXNldC5hdXRvcGxheSkKICAgICAgICAgIHNldGFjdGl2ZSgic2V0YXV0b3BsYXkiLCAiYXV0b3BsYXkiLCBhdXRvcGxheSgpKQogICAgICAgICAgdXBkYXRlYWxsdmlkZW9wbGF5KCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoImxpa2UiKSAmJiBsaWtlKGUudGFyZ2V0KQogICAgICB9KQogICAgICAKICAgICAgZnVuY3Rpb24gaGFza2V5KCl7CiAgICAgICAgcmV0dXJuIHdpbmRvdy5ub3N0ciB8fCBwcml2a2V5KCkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcHVia2V5KCl7CiAgICAgICAgcmV0dXJuIHdpbmRvdy5ub3N0ciAmJiBhd2FpdCB3aW5kb3cubm9zdHIuZ2V0UHVibGljS2V5KCkgfHwgTm9zdHJUb29scy5nZXRQdWJsaWNLZXkocHJpdmtleSgpKQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBzaWduKGV2ZW50KXsKICAgICAgICBpZih3aW5kb3cubm9zdHIpewogICAgICAgICAgcmV0dXJuIGF3YWl0IG5vc3RyLnNpZ25FdmVudChldmVudCkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZXZlbnQuc2lnID0gTm9zdHJUb29scy5nZXRTaWduYXR1cmUoZXZlbnQsIHByaXZrZXkoKSkKICAgICAgICByZXR1cm4gZXZlbnQKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gbGlrZShsaW5rKXsKICAgICAgICBjb25zdCBldmVudCA9IGxpbmsucGFyZW50RWxlbWVudFsiZGF0YS1ldmVudCJdCiAgICAgICAgCiAgICAgICAgYXdhaXQgcHVibGlzaCh7CiAgICAgICAgICAia2luZCI6IDcsCiAgICAgICAgICAiY29udGVudCI6ICIrIiwKICAgICAgICAgICJ0YWdzIjogWwogICAgICAgICAgICBbImUiLCBldmVudC5pZF0sCiAgICAgICAgICAgIFsicCIsIGV2ZW50LnB1YmtleV0KICAgICAgICAgIF0KICAgICAgICB9KQoKICAgICAgICBsaW5rLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQoKICAgICAgICBjb25zdCBpbWFnZWlkID0gbGlua1siZGF0YS1pdGVtLWlkIl0gfHwgbGluay5kYXRhc2V0LmltYWdlSWQKICAgICAgICAKICAgICAgICBpZihpbWFnZWlkKXsKICAgICAgICAgIGdpZChpbWFnZWlkKS5xdWVyeVNlbGVjdG9yKCIubGlrZSIpLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQogICAgICAgIH0KICAgICAgfQoKICAgICAgYXN5bmMgZnVuY3Rpb24gcHJlcGFyZV9ldmVudChldmVudCl7CiAgICAgICAgZXZlbnQucHVia2V5ID0gYXdhaXQgcHVia2V5KCkKICAgICAgICBldmVudC5jcmVhdGVkX2F0ID0gcGFyc2VJbnQoRGF0ZS5ub3coKSAvIDEwMDAsIDEwKQogICAgICAgIGV2ZW50LmlkID0gTm9zdHJUb29scy5nZXRFdmVudEhhc2goZXZlbnQpCiAgICAgICAgcmV0dXJuIGV2ZW50CiAgICAgIH0KICAgICAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBwdWJsaXNoKGV2ZW50KXsKICAgICAgICBldmVudCA9IGF3YWl0IHByZXBhcmVfZXZlbnQoZXZlbnQpCiAgICAgICAgbGV0IHNpZ25lZGV2ZW50ID0gYXdhaXQgc2lnbihldmVudCkKICAgICAgICBsZXQganNvbiA9IEpTT04uc3RyaW5naWZ5KFsiRVZFTlQiLCBzaWduZWRldmVudF0pCiAgICAgICAgc29ja2V0cy5mb3JFYWNoKHMgPT4gcy5zZW5kKGpzb24pKQogICAgICAgIAogICAgICAgIHJldHVybiBldmVudAogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBzd2lwZShvZmZzZXQpewogICAgICAgIGlmKGltYWdlb2Zmc2V0KG9mZnNldCkpewogICAgICAgICAgaW1hZ2VvZmZzZXQob2Zmc2V0KS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgdGhpc1tvZmZzZXQgPT0gLTEgJiYgImxhc3RhY3RpdmUiIHx8ICJhY3RpdmUiXSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgICB1cGRhdGVzaG93KCkKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZXNob3coKXsKICAgICAgICBpZihxcygiI21lZGlhLWNvbnRhaW5lciIpLmNsYXNzTGlzdC5jb250YWlucygidmlzaWJsZSIpKXsKICAgICAgICAgIGhpZGV2aWRlbygpCiAgICAgICAgICBzaG93KGFjdGl2ZSgpLmlkKQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIGUgPT4gewogICAgICAgIGlmKFsiVGFiIiwgIkFycm93TGVmdCIsICJBcnJvd1JpZ2h0IiwgIkFycm93VXAiLCAiQXJyb3dEb3duIl0uaW5jbHVkZXMoZS5rZXkpKXsKICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkVzY2FwZSIpewogICAgICAgICAgbWVudSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZS5rZXkgPT0gIkVudGVyIiAmJiBlLnRhcmdldC50YWdOYW1lID09ICJCT0RZIil7CiAgICAgICAgICBpZihxcygiI21lZGlhLWNvbnRhaW5lciIpLmNsYXNzTGlzdC5jb250YW5zKCJ2aXNpYmxlIikpewogICAgICAgICAgICBoaWRlbWVkaWEoKQogICAgICAgICAgICByZXR1cm4KICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgc2hvdyhhY3RpdmUoKS5pZCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93VXAiICYmIGltYWdlb2Zmc2V0KC1jb2xzKCkpKXsKICAgICAgICAgIGltYWdlb2Zmc2V0KC1jb2xzKCkpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBsYXN0YWN0aXZlKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIHVwZGF0ZXNob3coKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93RG93biIgJiYgaW1hZ2VvZmZzZXQoY29scygpKSl7CiAgICAgICAgICBpbWFnZW9mZnNldChjb2xzKCkpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBhY3RpdmUoKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgICAgdXBkYXRlc2hvdygpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dMZWZ0Iil7CiAgICAgICAgICBzd2lwZSgtMSkKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd1JpZ2h0Iil7CiAgICAgICAgICBzd2lwZSgxKQogICAgICAgIH0KICAgICAgfSkKCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGhhbmRsZXF1ZXJ5cmVzKHJlcywgc29ja2V0LCBxLCB0eXBlLCBzdGltZSl7CiAgICAgICAgc2F2ZShzb2NrZXQsIHJlcywgcSwgdHlwZSwgZmFsc2UsIGZhbHNlLCB0cnVlKQogICAgICAgIGxvZygicXVlcnkgcmVzIiwgcmVzLmxlbmd0aCwgc29ja2V0LnVybCkKICAgICAgICBxdWVyeWNvdW50LS0KICAgICAgICBpZihxdWVyeWNvdW50ID09IDApewogICAgICAgICAgcXMoIiNsb2FkaW5nIikuY2xhc3NMaXN0LnJlbW92ZSgidmlzaWJsZSIpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGxldCB3YWl0ID0gd2FpdG1zIC0gKERhdGUubm93KCkgLSBzdGltZSkKICAgICAgICBxdWVyeXdhaXQgPSBzbGVlcCh3YWl0KQogICAgICAgIGF3YWl0IHF1ZXJ5d2FpdC5wcm9taXNlCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHByaW1hbGdsb2JhbChzb2NrZXQpewogICAgICAgIGxvZygiZ2xvYmFsIiwgc29ja2V0LnVybCkKICAgICAgICBxdWVyeWNvdW50KysKICAgICAgICBxcygiI2xvYWRpbmciKS5jbGFzc0xpc3QuYWRkKCJ2aXNpYmxlIikKICAgICAgICBsZXQgc3RpbWUgPSBEYXRlLm5vdygpCiAgICAgICAgbGV0IHFpZCA9ICJnbG9iYWxfIiArICgrK2lkY291bnRlcikKICAgICAgICBsZXQgcWlkbGlrZXMgPSAibGlrZXNfIiArICgrK2lkY291bnRlcikKCiAgICAgICAgaWYobmV3bGlrZXMubGVuZ3RoID4gMCl7CiAgICAgICAgICBwcmltYWxzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeShbCiAgICAgICAgICAgICJSRVEiLCAKICAgICAgICAgICAgcWlkbGlrZXMsIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgImNhY2hlIjogWwogICAgICAgICAgICAgICAgImV2ZW50cyIsIHsKICAgICAgICAgICAgICAgICAgImV2ZW50X2lkcyI6IG5ld2xpa2VzCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgXQogICAgICAgICAgICB9CiAgICAgICAgICBdKSkKCiAgICAgICAgICBjb25zdCBsaWtlX2V2ZW50cyA9IChhd2FpdCB3YWl0cmVzKHFpZGxpa2VzKSlbMF0KICAgICAgICAgIG5ld2xpa2VzLnNwbGljZSgwKQogICAgICAgICAgCiAgICAgICAgICBhd2FpdCBzYXZlKHNvY2tldCwgbGlrZV9ldmVudHMsICIiLCAiYWxsIiwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KFsKICAgICAgICAgICJSRVEiLCAKICAgICAgICAgIHFpZCwgCiAgICAgICAgICB7CiAgICAgICAgICAgICJjYWNoZSI6IFsKICAgICAgICAgICAgICAiZXhwbG9yZSIsIAogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJ0aW1lZnJhbWUiOiAibGF0ZXN0IiwKICAgICAgICAgICAgICAgICJzY29wZSI6ICJnbG9iYWwiLAogICAgICAgICAgICAgICAgImxpbWl0IjogNTAKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdKSkKICAgICAgICAKICAgICAgICBjb25zdCByZXMgPSAoYXdhaXQgd2FpdHJlcyhxaWQpKVswXQogICAgICAgIGF3YWl0IGhhbmRsZXF1ZXJ5cmVzKHJlcy5maWx0ZXIoZSA9PiBlLmtpbmQgPT0gMSksIHNvY2tldCwgIiIsICJhbGwiLCBzdGltZSkKICAgICAgICBwcmltYWxnbG9iYWwoc29ja2V0KQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeShzb2NrZXQsIHByaW1hbCl7CiAgICAgICAgbG9nKCJxdWVyeSIsIHNvY2tldC51cmwpCiAgICAgICAgcXVlcnljb3VudCsrCiAgICAgICAgcXMoIiNsb2FkaW5nIikuY2xhc3NMaXN0LmFkZCgidmlzaWJsZSIpCiAgICAgICAgCiAgICAgICAgbGV0IHN0aW1lID0gRGF0ZS5ub3coKQogICAgICAgIGxldCBxID0gcXVlcnlzdHIudHJpbSgpCiAgICAgICAgbGV0IHR5cGUgPSBxdWVyeXR5cGUoKQogICAgICAgIGxldCBpID0gKytpZGNvdW50ZXIKICAgICAgICBsZXQgcWlkID0gInF1ZXJ5XyIgKyBpCiAgICAgICAgY29uc3QgbGlrZXNyZXMgPSBhd2FpdCBxdWVyeWxpa2VzKHNvY2tldCkKICAgICAgICAKICAgICAgICBsaWtlc3Jlcy5mb3JFYWNoKGV2ZW50aWQgPT4gewogICAgICAgICAgaWYoIWxpa2VzLmluY2x1ZGVzKGV2ZW50aWQpKXsKICAgICAgICAgICAgbGlrZXMucHVzaChldmVudGlkKQogICAgICAgICAgICBuZXdsaWtlcy5wdXNoKGV2ZW50aWQpCiAgICAgICAgICB9CiAgICAgICAgfSkKICAgICAgICAKICAgICAgICBsZXQgZ2FsbGVyeW1hdGNoID0gcXVlcnlzdHIubWF0Y2goL2c6KFthLXowLTldKykvKQogICAgICAgIGxldCByZXMgPSBudWxsCiAgICAgICAgCiAgICAgICAgaWYoZ2FsbGVyeW1hdGNoKXsKICAgICAgICAgIGNvbnN0IGdhbGxlcnlyZXMgPSBhd2FpdCBxdWVyeWV2ZW50cyhzb2NrZXQsIFszMzNdLCBbZ2FsbGVyeW1hdGNoWzFdXSwgbnVsbCkKICAgICAgICAgIGNvbnN0IGV2ZW50aWRzID0gSlNPTi5wYXJzZShnYWxsZXJ5cmVzWzBdLmNvbnRlbnQpCiAgICAgICAgICByZXMgPSBhd2FpdCBxdWVyeWV2ZW50cyhzb2NrZXQsIFsxXSwgZXZlbnRpZHMsIG51bGwpCiAgICAgICAgfWVsc2V7CiAgICAgICAgICBsZXQgZmlsdGVycyA9IFtdCgogICAgICAgICAgZmlsdGVycy5wdXNoKC4uLih0eXBlc1t0eXBlXSB8fCBbXSkubWFwKCh0KSA9PiB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAga2luZHM6IFsxXSwgCiAgICAgICAgICAgICAgc2VhcmNoOiAiLiIgKyB0LAogICAgICAgICAgICAgIGxpbWl0OiAyMAogICAgICAgICAgICB9CiAgICAgICAgICB9KSkKICAgICAgICAgIAogICAgICAgICAgaWYocS5sZW5ndGggPiAwKXsKICAgICAgICAgICAgZmlsdGVycy5wdXNoKHtraW5kczogWzFdLCBzZWFyY2g6IHF9KQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBpZihmaWx0ZXJzLmxlbmd0aCA9PSAwKXsKICAgICAgICAgICAgZmlsdGVycy5wdXNoKHtraW5kczogWzFdfSkKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgY29uc3Qgc2VhcmNob2JqID0gWyJSRVEiLCBxaWQsIC4uLmZpbHRlcnNdCiAgICAgICAgICBjb25zdCBzZWFyY2hqc29uID0gSlNPTi5zdHJpbmdpZnkoc2VhcmNob2JqKQogICAgICAgICAgc29ja2V0LnNlbmQoc2VhcmNoanNvbikKICAgICAgICAgIAogICAgICAgICAgcmVzID0gKGF3YWl0IHdhaXRyZXMocWlkKSlbMF0KICAgICAgICAgIAogICAgICAgICAgcmVzID0gcmVzLmZpbHRlcihvID0+IHsKICAgICAgICAgICAgaWYocS5sZW5ndGggPiAwKXsKICAgICAgICAgICAgICBmb3IobGV0IHdvcmQgb2YgcS5zcGxpdCgiICIpKXsKICAgICAgICAgICAgICAgIGlmKG8uY29udGVudC50b0xvd2VyQ2FzZSgpLmluZGV4T2Yod29yZC50b0xvd2VyQ2FzZSgpKSA9PSAtMSl7CiAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWUKICAgICAgICAgIH0pCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGF3YWl0IGhhbmRsZXF1ZXJ5cmVzKHJlcywgc29ja2V0LCBxLCB0eXBlLCBzdGltZSkKICAgICAgICBxdWVyeShzb2NrZXQpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5bGlrZXMoc29ja2V0KXsKICAgICAgICBpZighaGFza2V5KCkpewogICAgICAgICAgcmV0dXJuIFtdCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IG15cHVia2V5ID0gYXdhaXQgcHVia2V5KCkKICAgICAgICBjb25zdCBldmVudHMgPSBhd2FpdCBxdWVyeWV2ZW50cyhzb2NrZXQsIFs3XSwgbnVsbCwgW215cHVia2V5XSkKICAgICAgICByZXR1cm4gZXZlbnRzLm1hcChlID0+IGUudGFncy5maW5kKHQgPT4gdFswXSA9PSAiZSIpWzFdKQogICAgICB9CgogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeWV2ZW50cyhzb2NrZXQsIGtpbmRzLCBldmVudGlkcywgYXV0aG9ycyl7CiAgICAgICAgY29uc3QgcXVlcnlpZCA9ICJldmVudHNfIiArICgrK2lkY291bnRlcikKICAgICAgICBjb25zdCBmaWx0ZXJzID0ge30KICAgICAgICAKICAgICAgICBmaWx0ZXJzLmtpbmRzID0ga2luZHMKICAgICAgICAKICAgICAgICBpZihldmVudGlkcyl7CiAgICAgICAgICBmaWx0ZXJzWyJpZHMiXSA9IGV2ZW50aWRzCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGF1dGhvcnMpewogICAgICAgICAgZmlsdGVyc1siYXV0aG9ycyJdID0gYXV0aG9ycwogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkoWwogICAgICAgICAgIlJFUSIsIAogICAgICAgICAgcXVlcnlpZCwgCiAgICAgICAgICBmaWx0ZXJzCiAgICAgICAgXSkKICAgICAgICAKICAgICAgICBzb2NrZXQuc2VuZChqc29uKQogICAgICAgIAogICAgICAgIHJldHVybiAoYXdhaXQgd2FpdHJlcyhxdWVyeWlkKSlbMF0gfHwgW10KICAgICAgfQoKICAgICAgYXN5bmMgZnVuY3Rpb24gc2F2ZShzb2NrZXQsIGV2ZW50cywgcSwgcXR5cGUsIHJlYWN0ZWQsIGFwcGVuZCwgcXVlcnltZXRhKXsKICAgICAgICBsZXQgZXZlbnRwdWJrZXlzID0gW10KICAgICAgICBsZXQgcmVzdWx0cyA9IFtdCiAgICAgICAgY29uc3QgZXZlbnRpZHMgPSBldmVudHMubWFwKGUgPT4gZS5pZCkKICAgICAgICBsZXQgbmV3dXJscyA9IFtdCiAgICAgICAgCiAgICAgICAgZm9yKGxldCBldmVudCBvZiBldmVudHMpewogICAgICAgICAgbGV0IHVybHNtYXRjaCA9IFtdCiAgICAgICAgICAKICAgICAgICAgIGlmKHF0eXBlICE9ICJ2aWRlbyIpewogICAgICAgICAgICB1cmxzbWF0Y2gucHVzaCguLi4oZXZlbnQuY29udGVudC5tYXRjaChpbWdyZWdleCkgfHwgW10pKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBpZihxdHlwZSAhPSAiaW1hZ2UiKXsKICAgICAgICAgICAgdXJsc21hdGNoLnB1c2goLi4uKGV2ZW50LmNvbnRlbnQubWF0Y2godmlkZW9yZWdleCkgfHwgW10pKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICB1cmxzbWF0Y2ggPSB1cmxzbWF0Y2guZmlsdGVyKHVybCA9PiAhdXJscy5pbmNsdWRlcyh1cmwpKQoKICAgICAgICAgIGlmKHVybHNtYXRjaC5sZW5ndGggPiAwKXsKICAgICAgICAgICAgbmV3dXJscy5wdXNoKHsKICAgICAgICAgICAgICBldmVudDogZXZlbnQsCiAgICAgICAgICAgICAgdXJsczogdXJsc21hdGNoCiAgICAgICAgICAgIH0pCiAgICAgICAgICAgIAogICAgICAgICAgICB1cmxzLnB1c2goLi4udXJsc21hdGNoKQogICAgICAgICAgICBldmVudHB1YmtleXMuaW5jbHVkZXMoZXZlbnQucHVia2V5KSB8fCBldmVudHB1YmtleXMucHVzaChldmVudC5wdWJrZXkpCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGxvZygicXVlcnkgbWV0YSIsIHNvY2tldC51cmwpCiAgICAgICAgbGV0IG1ldGFldmVudHMgPSAocXVlcnltZXRhICYmIGF3YWl0IHF1ZXJ5ZXZlbnRzKHNvY2tldCwgWzBdLCBudWxsLCBldmVudHB1YmtleXMpIHx8IFtdKQogICAgICAgIAogICAgICAgIGZvcihsZXQgZW50cnkgb2YgbmV3dXJscyl7CiAgICAgICAgICBmb3IobGV0IHVybCBvZiBlbnRyeS51cmxzKXsKICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHsKICAgICAgICAgICAgICByZWFjdGVkOiByZWFjdGVkIHx8IGxpa2VzLmluY2x1ZGVzKGVudHJ5LmV2ZW50LmlkKSwgCiAgICAgICAgICAgICAgdXJsOiB1cmwsIAogICAgICAgICAgICAgIGV2ZW50OiBlbnRyeS5ldmVudCwgCiAgICAgICAgICAgICAgYmVjaDMyaWQ6IGJlY2gzMi5lbmNvZGUoIm5vdGUiLCBmcm9tSGV4U3RyaW5nKGVudHJ5LmV2ZW50LmlkKSksCiAgICAgICAgICAgICAgbWV0YTogbWV0YWV2ZW50cy5maW5kKG8gPT4gby5wdWJrZXkgPT0gZW50cnkuZXZlbnQucHVia2V5KQogICAgICAgICAgICB9KQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICBsb2coInNhdmUgcmVzIiwgcmVzdWx0cy5sZW5ndGgsIHNvY2tldC51cmwpCiAgICAgICAgdXBkYXRlY29udGVudChyZXN1bHRzLCBxLCBhcHBlbmQpCiAgICAgIH0KICAgICAgCiAgICAgIGxldCBsb2FkZWQgPSAwCiAgICAgIAogICAgICBmdW5jdGlvbiB1cGRhdGVjb250ZW50KHJlc3VsdHMsIHEsIGFwcGVuZCl7CiAgICAgICAgcmVzdWx0cy5yZXZlcnNlKCkuZm9yRWFjaChpdGVtID0+IHsKICAgICAgICAgIGNvbnN0IHR5cGUgPSBpdGVtLnVybC5tYXRjaCh2aWRlb2V4dHJlZ2V4KSAmJiAidmlkZW8iIHx8ICJpbWFnZSIKICAgICAgICAgIGNvbnN0IHRleHQgPSAocSB8fCAidmlldyBub3RlIikuc3Vic3RyaW5nKC0zMCkKICAgICAgICAgIGNvbnN0IGlkID0gIml0ZW1fIiArICgrK2lkY291bnRlcikKICAgICAgICAgIGNvbnN0IGNvbnRlbnRlbGVtZW50cyA9ICc8ZGl2IGNsYXNzPSJ0eXBlIj4nICsgcXMoIiN0ZW1wbGF0ZSAuIiArIHR5cGUgKyAic3ZnIikub3V0ZXJIVE1MICsgJzwvZGl2PjxhIGNsYXNzPSJsaWtlJyArIChpdGVtLnJlYWN0ZWQgPyAnIHJlYWN0ZWQnIDogJycpICsgJyIgZGF0YS1pdGVtLWlkPSInICsgaWQgKyAKICAgICAgICAgICAgJyIgaHJlZj0iIyI+JyArIHFzKCIjdGVtcGxhdGUgLmhlYXJ0c3ZnIikub3V0ZXJIVE1MICsgJzwvYT48YSBjbGFzcz0icXVlcnkiIGhyZWY9IicgKyBwcm90b2NvbCArIAogICAgICAgICAgICBpdGVtLmJlY2gzMmlkICsgJyI+JyArIHRleHQgKyAnPC9hPicKICAgICAgICAgIGxldCByb290ID0gbnVsbAogICAgICAgICAgbGV0IHYgPSBudWxsCiAgICAgICAgICAKICAgICAgICAgIGlmKGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpKXsKICAgICAgICAgICAgcm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpCiAgICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgidmlkZW8tY29udGFpbmVyIikKICAgICAgICAgICAgcm9vdC5pbm5lckhUTUwgPSBjb250ZW50ZWxlbWVudHMKICAgICAgICAgICAgCiAgICAgICAgICAgIHYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpCiAgICAgICAgICAgIHYuY2xhc3NMaXN0LmFkZCgic2hvdyIpCiAgICAgICAgICAgIHZbImRhdGEtaXRlbS1pZCJdID0gaWQKICAgICAgICAgICAgdi5wcmVsb2FkID0gIm5vbmUiCiAgICAgICAgICAgIHYubG9vcCA9IHRydWUKICAgICAgICAgICAgdi5wbGF5c2lubGluZSA9ICIiCiAgICAgICAgICAgIAogICAgICAgICAgICB2Lm9uY2FucGxheSA9IGFzeW5jIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIGNvbnN0IGFzcGVjdCA9IHRoaXMudmlkZW9XaWR0aCAvIHRoaXMudmlkZW9IZWlnaHQKICAgICAgICAgICAgICBpZihhc3BlY3QgPiAxKXsKICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUud2lkdGggPSAoYXNwZWN0ICogMTAwKSArICIlIgogICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgdGhpcy5zdHlsZS5oZWlnaHQgPSAoMSAvIGFzcGVjdCAqIDEwMCkgKyAiJSIKICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUubWFyZ2luVG9wID0gLSgoMSAvIGFzcGVjdCAqIDEwMCAtIDEwMCkgLyAyKSArICIlIgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAKICAgICAgICAgICAgICB1cGRhdGV2aWRlb3BsYXkodGhpcy5wYXJlbnRFbGVtZW50KQogICAgICAgICAgICB9CgogICAgICAgICAgICBjb25zdCBleHQgPSBpdGVtLnVybC5tYXRjaCh2aWRlb2V4dHJlZ2V4KVsxXQogICAgICAgICAgICB2LmlubmVySFRNTCA9ICc8c291cmNlIHNyYz0iJyArIGl0ZW0udXJsICsgJyIgdHlwZT0idmlkZW8vJyArIGV4dCArICciPjwvc291cmNlPicKICAgICAgICAgICAgCiAgICAgICAgICAgIHJvb3QuYXBwZW5kKHYpCiAgICAgICAgICB9ZWxzZSBpZihpdGVtLnVybC5tYXRjaChpbWdleHRyZWdleCkpewogICAgICAgICAgICByb290ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpCiAgICAgICAgICAgIHJvb3QuaHJlZiA9ICIjIgogICAgICAgICAgICByb290LmlubmVySFRNTCA9IGNvbnRlbnRlbGVtZW50cwogICAgICAgICAgICAgIAogICAgICAgICAgICBpZih0eXBlID09ICJpbWFnZSIpewogICAgICAgICAgICAgIC8vbGV0IGltZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpCiAgICAgICAgICAgICAgLy9pbWcuYWx0ID0gaXRlbS51cmwKICAgICAgICAgICAgICByb290WyJkYXRhLXNyYyJdID0gaXRlbS51cmwKICAgICAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoImltZyIpCiAgICAgICAgICAgICAgLy9pbWcuY2xhc3NMaXN0LmFkZCgiZGF0YSIpCiAgICAgICAgICAgICAgLy9yb290LmFwcGVuZChpbWcpCiAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgIHJvb3QuaW5uZXJIVE1MICs9ICc8c3BhbiBjbGFzcz0iZmlsZSI+JyArIGl0ZW0udXJsICsgJzwvc3Bhbj4nCiAgICAgICAgICAgIH0KICAgICAgICAgIH1lbHNlewogICAgICAgICAgICByZXR1cm4KICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgcm9vdC5pZCA9IGlkCiAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoJ3Zpc2libGUnKQogICAgICAgICAgcm9vdFsiZGF0YS1pdGVtIl0gPSBpdGVtCiAgICAgICAgICByb290WyJkYXRhLWV2ZW50Il0gPSBpdGVtLmV2ZW50CiAgICAgICAgICByb290WyJkYXRhLXF1ZXJ5Il0gPSBxCiAgICAgICAgICByb290WyJkYXRhLXRleHQiXSA9IHRleHQKICAgICAgICAgIAogICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKHR5cGUpCiAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoIml0ZW0iKQogICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJzaG93IikKICAgICAgICAgIAogICAgICAgICAgaWYoaXRlbS5yZWFjdGVkKXsKICAgICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgcXMoIiNpbWFnZXMiKVthcHBlbmQgJiYgImFwcGVuZCIgfHwgInByZXBlbmQiXShyb290KQogICAgICAgICAgCiAgICAgICAgICBpZih2KXsKICAgICAgICAgICAgdXBkYXRldmlkZW9wbGF5KHJvb3QpCiAgICAgICAgICB9CiAgICAgICAgfSkKCiAgICAgICAgdXBkYXRlaW1hZ2VzbG9hZCgpCiAgICAgICAgCiAgICAgICAgaWYoYWN0aXZlKCkgPT0gbnVsbCl7CiAgICAgICAgICBxcygiI2ltYWdlcyAuaXRlbSIpPy5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgIH0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gaGlkZW1lZGlhKCl7CiAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICJzY3JvbGwiCiAgICAgICAgcXNhKCIjbWVkaWEtY29udGFpbmVyLCAjaW1hZ2UsICNtZWRpYS1mb290ZXIiKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QucmVtb3ZlKCJ2aXNpYmxlIikpCiAgICAgICAgZ2lkKCJpbWFnZS1saWtlIikuY2xhc3NMaXN0LnJlbW92ZSgicmVhY3RlZCIpCiAgICAgICAgaGlkZXZpZGVvKCkKICAgICAgfQoKICAgICAgZnVuY3Rpb24gaGlkZXZpZGVvKCl7CiAgICAgICAgY29uc3QgdiA9IHFzKCIjbWVkaWEtY29udGFpbmVyIHZpZGVvIikKICAgICAgICAKICAgICAgICBpZih2KXsKICAgICAgICAgIHYubXV0ZWQgPSB0cnVlCiAgICAgICAgICB2LmNsYXNzTGlzdC5hZGQoInNob3ciKQogICAgICAgICAgZ2lkKHZbImRhdGEtaXRlbS1pZCJdKS5hcHBlbmRDaGlsZCh2KQogICAgICAgICAgdXBkYXRldmlkZW9wbGF5KHYucGFyZW50RWxlbWVudCkKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHdhaXRyZXMoa2V5LCB0eXBlKXsKICAgICAgICBsZXQgcmVzaGFuZGxlciA9IGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7CiAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlIHx8ICJFT1NFIgogICAgICAgICAgdGhpcy5ldmVudHMgPSBbXQogICAgICAgICAgdGhpcy5oYW5kbGUgPSBmdW5jdGlvbihyZXMpewogICAgICAgICAgICBsZXQgbyA9IEpTT04ucGFyc2UocmVzLmRhdGEpCiAgICAgICAgICAgIGlmKGtleSA9PSBudWxsIHx8IG9bMV0gPT0ga2V5KXsKICAgICAgICAgICAgICBpZihvWzBdID09IHRoaXMudHlwZSl7CiAgICAgICAgICAgICAgICByZXNvbHZlKFt0aGlzLmV2ZW50cywgb10pCiAgICAgICAgICAgICAgICByZXNoYW5kbGVycy5zcGxpY2UocmVzaGFuZGxlcnMuaW5kZXhPZih0aGlzKSwgMSkKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgdGhpcy5ldmVudHMucHVzaChvWzJdKQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgICAgICBsZXQgaGFuZGxlciA9IG5ldyByZXNoYW5kbGVyKHJlc29sdmUsIHJlamVjdCkKICAgICAgICAgIHJlc2hhbmRsZXJzLnB1c2goaGFuZGxlcikKICAgICAgICB9KQogICAgICB9CiAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gY2hlY2t1cGRhdGUoc29ja2V0KXsKICAgICAgICBjb25zdCB1cGRhdGVzcmVzID0gYXdhaXQgcXVlcnlldmVudHMoc29ja2V0LCBbMV0sIG51bGwsIFt1cGRhdGVzcHVia2V5XSkKICAgICAgICBjb25zdCB1cGRhdGVub3RlID0gdXBkYXRlc3Jlcy5maW5kKG4gPT4gbi5jb250ZW50Lm1hdGNoKC9eaHR0cHNcOlwvXC8vKSkKICAgICAgICAKICAgICAgICBpZighdXBkYXRlbm90ZSl7CiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QgYWdlID0gTWF0aC5yb3VuZCgoRGF0ZS5ub3coKSAvIDEwMDAgLSB1cGRhdGVub3RlLmNyZWF0ZWRfYXQpIC8gMzYwMCAvIDI0KQogICAgICAgIGNvbnN0IG5vdGVpZCA9IGJlY2gzMi5lbmNvZGUoIm5vdGUiLCBmcm9tSGV4U3RyaW5nKHVwZGF0ZW5vdGUuaWQpKQogICAgICAgIHFzKCIjcmVsZWFzZSIpLmhyZWYgPSBwcm90b2NvbCArIG5vdGVpZAogICAgICAgIHFzKCIjcmVsZWFzZSIpLmlubmVyVGV4dCA9IChhZ2UgPT0gMCAmJiAidG9kYXkiIHx8IGFnZSArICIgZGF5KHMpIGFnbyIpCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHNsZWVwKG1zKXsKICAgICAgICByZXR1cm4gbmV3IGZ1bmN0aW9uKCl7CiAgICAgICAgICBsZXQgdGltZW91dCA9IG51bGwKICAgICAgICAgIGxldCByID0gbnVsbAogICAgICAgICAgCiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICBwcm9taXNlOiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpewogICAgICAgICAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHJlc29sdmUoKSwgbXMpCiAgICAgICAgICAgICAgciA9IHJlc29sdmUKICAgICAgICAgICAgfSksCiAgICAgICAgICAgIHJlc29sdmU6IGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpCiAgICAgICAgICAgICAgcigpCiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHNob3coaWQpewogICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAiaGlkZGVuIgogICAgICAgIGNvbnN0IGl0ZW0gPSBnaWQoaWQpWyJkYXRhLWl0ZW0iXQogICAgICAgIGNvbnN0IG1lZGlhID0gZ2lkKCJtZWRpYS1jb250YWluZXIiKQogICAgICAgIGNvbnN0IGltYWdlID0gZ2lkKCJpbWFnZSIpCgogICAgICAgIGlmKGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpKXsKICAgICAgICAgIGltYWdlLmNsYXNzTGlzdC5yZW1vdmUoInZpc2libGUiKQogICAgICAgICAgY29uc3QgdiA9IGdpZChpZCkucXVlcnlTZWxlY3RvcigidmlkZW8iKQogICAgICAgICAgcXMoIiNtZWRpYS1jb250YWluZXIiKS5hcHBlbmRDaGlsZCh2KQogICAgICAgICAgdi5tdXRlZCA9IGZhbHNlCiAgICAgICAgICB2LmNsYXNzTGlzdC5yZW1vdmUoInNob3ciKQogICAgICAgICAgdi5wbGF5KCkKICAgICAgICB9ZWxzZXsKICAgICAgICAgIGltYWdlLnNyYyA9IGl0ZW0udXJsCiAgICAgICAgICBpbWFnZS5jbGFzc0xpc3QuYWRkKCJ2aXNpYmxlIikKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoaXRlbS5tZXRhKXsKICAgICAgICAgIGNvbnN0IG1ldGFjb250ZW50ID0gSlNPTi5wYXJzZShpdGVtLm1ldGEuY29udGVudCkKICAgICAgICAgIGNvbnN0IG5hbWUgPSBtZXRhY29udGVudC5kaXNwbGF5X25hbWUgfHwgbWV0YWNvbnRlbnQubmFtZQogICAgICAgICAgcXMoIiNpbWFnZS11c2VyIikuY2xhc3NMaXN0LmFkZCgidmlzaWJsZSIpCiAgICAgICAgICBxcygiI2ltYWdlLXVzZXIiKS5ocmVmID0gcHJvdG9jb2wgKyBiZWNoMzIuZW5jb2RlKCJucHViIiwgZnJvbUhleFN0cmluZyhpdGVtLm1ldGEucHVia2V5KSkKICAgICAgICAgIHFzKCIjaW1hZ2UtdXNlciIpLmlubmVyVGV4dCA9IG5hbWUKICAgICAgICB9ZWxzZXsKICAgICAgICAgIHFzKCIjaW1hZ2UtdXNlciIpLmNsYXNzTGlzdC5yZW1vdmUoInZpc2libGUiKQogICAgICAgIH0KCiAgICAgICAgZ2lkKCJpbWFnZS1saWtlIilbImRhdGEtaXRlbS1pZCJdID0gaWQKICAgICAgICBnaWQoIm1lZGlhLWZvb3RlciIpWyJkYXRhLWV2ZW50Il0gPSBpdGVtLmV2ZW50CgogICAgICAgIGlmKGl0ZW0ucmVhY3RlZCl7CiAgICAgICAgICBnaWQoImltYWdlLWxpa2UiKS5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QgYSA9IHFzKCIjaW1hZ2UtcXVlcnkiKQogICAgICAgIGEuaHJlZiA9IHByb3RvY29sICsgaXRlbS5iZWNoMzJpZAogICAgICAgIGEuaW5uZXJUZXh0ID0gZ2lkKGlkKVsiZGF0YS10ZXh0Il0KICAgICAgICAKICAgICAgICBnaWQoIm1lZGlhLWNvbnRhaW5lciIpLmNsYXNzTGlzdC5hZGQoInZpc2libGUiKQogICAgICAgIGdpZCgibWVkaWEtZm9vdGVyIikuY2xhc3NMaXN0LmFkZCgidmlzaWJsZSIpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGNvbm5jb3VudCgpewogICAgICAgIHJldHVybiBzb2NrZXRzLmZpbHRlcihyID0+IHIucmVhZHlTdGF0ZSA9PSAxKS5sZW5ndGgKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gZGlzY29ubmVjdCgpewogICAgICAgIGZvcihsZXQgc29ja2V0IG9mIHNvY2tldHMpewogICAgICAgICAgc29ja2V0LmNsb3NlKCkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgc29ja2V0cy5zcGxpY2UoMCkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gbG9nKG1zZyl7CiAgICAgICAgbGV0IHNjcm9sbCA9IHFzKCIjbG9ncyIpLnNjcm9sbFRvcCA9PSBxcygiI2xvZ3MiKS5zY3JvbGxUb3BNYXgKICAgICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKQogICAgICAgIGRpdi5pbm5lclRleHQgPSBBcnJheS5mcm9tKGFyZ3VtZW50cykuam9pbigiICIpCiAgICAgICAgcXMoIiNsb2dzIikuYXBwZW5kKGRpdikKICAgICAgICAKICAgICAgICBzY3JvbGwgJiYgcXMoIiNsb2dzIikuc2Nyb2xsVG8oMCwgcXMoIiNsb2dzIikuc2Nyb2xsVG9wTWF4KQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBjb25uZWN0KHVybCl7CiAgICAgICAgbG9nKCJjb25uZWN0aW5nIiwgdXJsKQogICAgICAgIGxldCBzb2NrZXQgPSBuZXcgV2ViU29ja2V0KHVybCkKICAgICAgICAKICAgICAgICBzb2NrZXQub25tZXNzYWdlID0gbWVzc2FnZSA9PiByZXNoYW5kbGVycy5mb3JFYWNoKHJoID0+IHJoLmhhbmRsZShtZXNzYWdlKSkKICAgICAgICAKICAgICAgICBzb2NrZXQub25jbG9zZSA9IGFzeW5jIGZ1bmN0aW9uKCl7CiAgICAgICAgICBzb2NrZXRzLnNwbGljZShzb2NrZXRzLmluZGV4T2Yoc29ja2V0KSwgMSkKICAgICAgICAgIHFzKCIjY29ubmNvdW50IikuaW5uZXJUZXh0ID0gY29ubmNvdW50KCkgKyAocHJpbWFsc29ja2V0ICYmIDEpCiAgICAgICAgICBsb2coImRpc2Nvbm5lY3RlZCIsIHRoaXMudXJsLCBjb25uY291bnQoKSkKICAgICAgICAgIGF3YWl0IHNsZWVwKDEwMDApLnByb21pc2UKICAgICAgICAgIGNvbm5lY3QodGhpcy51cmwpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHNvY2tldC5vbm9wZW4gPSBmdW5jdGlvbigpewogICAgICAgICAgcXMoIiNjb25uY291bnQiKS5pbm5lclRleHQgPSBjb25uY291bnQoKSArIChwcmltYWxzb2NrZXQgJiYgMSkKICAgICAgICAgIGxvZygiY29ubmVjdGVkIiwgdGhpcy51cmwsIGNvbm5jb3VudCgpKQogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4gc29ja2V0CiAgICAgIH0KICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLCBhc3luYyAoKSA9PiB7CiAgICAgICAgcHJpbWFsc29ja2V0ID0gY29ubmVjdCgid3NzOi8vY2FjaGUzLnByaW1hbC5uZXQvY2FjaGUxNyIpCiAgICAgICAgcHJpbWFsc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoIm9wZW4iLCBmdW5jdGlvbigpewogICAgICAgICAgcHJpbWFsZ2xvYmFsKHRoaXMpCiAgICAgICAgfSkKICAgICAgICAKICAgICAgICBwcmltYWxzb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcigiY2xvc2UiLCBmdW5jdGlvbigpewogICAgICAgICAgcHJpbWFsc29ja2V0ID0gbnVsbAogICAgICAgIH0pCiAgICAgICAgCiAgICAgICAgZm9yKGxldCB1cmwgb2YgcmVsYXlzKCkpewogICAgICAgICAgY29uc3Qgc29ja2V0ID0gY29ubmVjdCh1cmwpCiAgICAgICAgICBzb2NrZXRzLnB1c2goc29ja2V0KQogICAgICAgICAgCiAgICAgICAgICBzb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcigib3BlbiIsIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgIGNoZWNrdXBkYXRlKHRoaXMpCiAgICAgICAgICAgIHF1ZXJ5KHRoaXMpCiAgICAgICAgICB9KQogICAgICAgIH0KICAgICAgICAKICAgICAgICBhd2FpdCBzbGVlcCgxMDApLnByb21pc2UKICAgICAgICAKICAgICAgICBpZihoYXNrZXkoKSl7CiAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoIm5vc3RyIikKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBmb3IobGV0IGMgb2YgY29sb3B0cyl7CiAgICAgICAgZG9jdW1lbnQud3JpdGUoJzxzdHlsZT4nICsgY29sc2Nzcy5pbm5lclRleHQucmVwbGFjZSgvXCRce2NvbHNcfS9nLCBjKSArICc8L3N0eWxlPicpCiAgICAgIH0KICAgIDwvc2NyaXB0PgogIDwvYm9keT4KPC9odG1sPgo=

https://ipfs.io/ipfs/Qmb2bf8Vrmdd47yiHuThAAKFtWTwLTfQGtEUVG8aEtrRAb

sha256

1ff34ca658d731ad966ec8ab064a856101b98de8b9d79d7d2a3e9a3fdccc3af9 files.html

base64

PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgdXNlci1zY2FsYWJsZT1ubyIvPgogICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL3N2Z2ljb25zLnNwYXJray5mci9zdmdpY29ucy5jc3MiLz4KICAgIDxzdHlsZT4KICAgICAgKiB7CiAgICAgICAgb3ZlcnNjcm9sbC1iZWhhdmlvci15OiBjb250YWluOwogICAgICB9CiAgICAgIAogICAgICBib2R5IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB3aWR0aDogMTAwdnc7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIGZvbnQtZmFtaWx5OiAiTm90byBTZXJpZiI7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXksIAogICAgICAjaGVhZGVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLAogICAgICAjbG9ncywgCiAgICAgICNwcml2a2V5IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMThlbTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLAogICAgICAjbG9ncyB7CiAgICAgICAgaGVpZ2h0OiA2ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNsb2dzIHsKICAgICAgICBoZWlnaHQ6IDhlbTsKICAgICAgICBvdmVyZmxvdzogc2Nyb2xsOwogICAgICAgIGZvbnQtc2l6ZTogLjhlbTsKICAgICAgfQogICAgICAKICAgICAgc2VsZWN0IHsKICAgICAgICB3aWR0aDogNGVtOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLCAKICAgICAgaW5wdXQuc3VibWl0IHsKICAgICAgICBib3JkZXItcmFkaXVzOiAuNWVtOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnlkaXNwbGF5IC50ZXh0LCAKICAgICAgI2hlYWRlciBhLAogICAgICAjbWVkaWEtY29udGFpbmVyIHsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQoKICAgICAgI2hlYWRlciBhLCAKICAgICAgZm9ybSwgCiAgICAgICNxdWVyeWRpc3BsYXkgewogICAgICAgIHotaW5kZXg6IDE7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CiAgICAgIAogICAgICBAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDMwZW0pIHsKICAgICAgICAjcXVlcnlkaXNwbGF5IHsKICAgICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgfQogICAgICB9CgogICAgICBmb3JtIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeSB7CiAgICAgICAgd2lkdGg6IDZlbTsKICAgICAgfQogICAgICAKICAgICAgI2xvYWRpbmcgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMHB4OwogICAgICAgIGxlZnQ6IDI3ZW07CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgIGEgewogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgfQoKICAgICAgdmlkZW8gewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogIAogICAgICAjbWVkaWEtY29udGFpbmVyIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgIGhlaWdodDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgIG1hcmdpbi10b3A6IDAgIWltcG9ydGFudDsKICAgICAgfQogICAgICAKICAgICAgLnR5cGUgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICB6LWluZGV4OiAxOwogICAgICB9CiAgICAgIAogICAgICAjaW1hZ2UtcXVlcnkgewogICAgICAgIHdpZHRoOiA1ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXksCiAgICAgIGEsCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgY29sb3I6ICM5OTk7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXkgewogICAgICAgIHBhZGRpbmc6IDAgMWVtOwogICAgICB9CgogICAgICAjcXVlcnlkaXNwbGF5IC50ZXh0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgbWluLXdpZHRoOiAzZW07CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgI2hlYWRlciBhLAogICAgICAjaGVhZGVyIHNwYW4gewogICAgICAgIHBhZGRpbmc6IDAuNWVtOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CgogICAgICAjaGVhZGVyIHsKICAgICAgICBwYWRkaW5nOiAwLjQ1ZW0gMDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CgogICAgICAjaGVhZGVyIC5pdGVtcyB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgLml0ZW1zIHsKICAgICAgICBtYXJnaW4tdG9wOiAuM2VtOwogICAgICB9CgogICAgICBwIHsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICB9CiAgICAgIAogICAgICAubGFiZWwgewogICAgICAgIHBhZGRpbmc6IC44ZW0gLjhlbSAuOGVtIDA7CiAgICAgIH0KCiAgICAgICNpbWFnZXMgLnF1ZXJ5IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KCiAgICAgICNtZWRpYS1jb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwKTsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHotaW5kZXg6IDQ7CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZS1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlIHsKICAgICAgICBtYXgtd2lkdGg6IDEwMHZ3OwogICAgICAgIG1heC1oZWlnaHQ6IDEwMHZoOwogICAgICB9CiAgICAgICAgCiAgICAgICNpbWFnZXMgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZXMgLml0ZW0gewogICAgICAgIHdpZHRoOiAyNXZ3OwogICAgICB9CgogICAgICAjaW1hZ2VzIC5pdGVtIHsKICAgICAgICBoZWlnaHQ6IDI1dnc7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgI21lZGlhLWNvbnRhaW5lciB2aWRlbyB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgfQogICAgICAKICAgICAgYm9keTpub3QoLm5vc3RyKSAjZmlsdGVyLWxpa2VzLCAKICAgICAgLmZpbHRlci1saWtlcyAjaW1hZ2VzID4gLml0ZW06bm90KC5yZWFjdGVkKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNpbWFnZS1xdWVyeSwKICAgICAgI2ltYWdlLXVzZXIgewogICAgICAgIHotaW5kZXg6IDI7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDN2dzsKICAgICAgfQogICAgICAKICAgICAgLnF1ZXJ5LCAKICAgICAgLmxpa2UgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBwYWRkaW5nOiAwIDF2dzsKICAgICAgfQogICAgICAKICAgICAgLnF1ZXJ5LCAKICAgICAgLmxpa2UsIAogICAgICAjaW1hZ2UtcXVlcnksIAogICAgICAudmlkZW9zdmcsCiAgICAgIC5pbWFnZXN2ZyB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjYpOwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNpbWFnZS1xdWVyeSB7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGZvbnQtc2l6ZTogbWluKDMuNXZ3LCAxLjVlbSk7CiAgICAgICAgbWF4LXdpZHRoOiA1ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZS1xdWVyeSB7CiAgICAgICAgcGFkZGluZzogLjZlbSAuNGVtIC4xZW0gLjRlbTsKICAgICAgICBtYXgtd2lkdGg6IDVlbTsKICAgICAgfQogICAgICAKICAgICAgLmxpa2UucmVhY3RlZCwKICAgICAgLmZpbHRlci1saWtlcyAjZmlsdGVyLWxpa2VzIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZWQ7CiAgICAgIH0KCiAgICAgICNpbWFnZS1xdWVyeSwKICAgICAgI2ltYWdlLXVzZXIgewogICAgICAgIGZvbnQtc2l6ZTogM2VtOwogICAgICB9CiAgICAgIAogICAgICAjaW1hZ2UtcXVlcnksCiAgICAgICNpbWFnZS11c2VyLAogICAgICAjbWVkaWEtZm9vdGVyIC5saWtlIHsKICAgICAgICB6LWluZGV4OiA1OwogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlLXF1ZXJ5LAogICAgICAjaW1hZ2UtdXNlciB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgICNpbWFnZS11c2VyIHsKICAgICAgICBib3R0b206IDEuOWVtOwogICAgICAgIGZvbnQtc2l6ZTogMS44ZW07CiAgICAgICAgcGFkZGluZy1yaWdodDogLjY1ZW07CiAgICAgICAgbWF4LXdpZHRoOiA4ZW07CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgIH0KICAgICAgCiAgICAgIC5saWtlIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IGF1dG87CiAgICAgICAgcGFkZGluZzogLjJlbTsKICAgICAgICB3aWR0aDogMWVtOwogICAgICAgIGhlaWdodDogMWVtOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5ub3N0ciAubGlrZSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7ICAKICAgICAgfQoKICAgICAgI21lZGlhLWZvb3RlciAubGlrZSB7CiAgICAgICAgZm9udC1zaXplOiAyLjRlbTsKICAgICAgfQoKICAgICAgI21lZGlhLWZvb3RlciB7CiAgICAgICAgZGlzcGxheTogbm9uZTsgIAogICAgICB9CiAgCiAgICAgICNpbWFnZXMgLmltZyB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIGJhY2tncm91bmQtc2l6ZTogY292ZXI7CiAgICAgICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIC5hY3RpdmUgewogICAgICAgIGJhY2tncm91bmQ6ICM0NDQ7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZXMgPiAuYWN0aXZlIHsKICAgICAgICBvdXRsaW5lOiAuM2VtIHNvbGlkIGdyZWVuOwogICAgICAgIHotaW5kZXg6IDE7CiAgICAgIH0KCiAgICAgIC5oZWFydHN2ZyBwYXRoLAogICAgICAuaGVhZGVyLWljb24gc3ZnIHBhdGggewogICAgICAgIHN0cm9rZTogI2ZmZjsKICAgICAgfQogIAogICAgICAudmlkZW9zdmcsCiAgICAgIC5pbWFnZXN2ZyB7CiAgICAgICAgd2lkdGg6IGNhbGMobWluKDR2dywgMmVtKSk7CiAgICAgICAgaGVpZ2h0OiBjYWxjKG1pbig0dncsIDJlbSkpOwogICAgICAgIHBhZGRpbmc6IDAgLjJlbTsKICAgICAgfQogICAgICAKICAgICAgLnZpZGVvc3ZnIHBhdGgsCiAgICAgIC5pbWFnZXN2ZyBwYXRoIHsKICAgICAgICBmaWxsOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICBhI21lbnUsIAogICAgICAuaGVhZGVyLWljb24gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG1hcmdpbi10b3A6IC0uM2VtOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgIH0KCiAgICAgIC5pY29ucyB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIHotaW5kZXg6IDI7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgfQogICAgICAKICAgICAgYSNtZW51IHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBwYWRkaW5nOiAwIC4zZW0gMCAuNWVtOwogICAgICAgIGhlaWdodDogMi4xZW07CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgLmhlYWRlci1pY29uIHsKICAgICAgICBwYWRkaW5nOiAuMmVtOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICB3aWR0aDogMS41ZW07CiAgICAgICAgaGVpZ2h0OiAxLjVlbTsKICAgICAgICBtYXJnaW46IC4xZW0gLjVlbTsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgIH0KICAgICAgCiAgICAgIC5oZWFkZXItaWNvbiBzdmcgewogICAgICAgIHdpZHRoOiAxLjVlbTsKICAgICAgICBoZWlnaHQ6IDEuNWVtOwogICAgICB9CiAgICAgICAKICAgICAgLm1lbnVzdmcgewogICAgICAgIHdpZHRoOiAyZW07CiAgICAgICAgaGVpZ2h0OiAyZW07CiAgICAgIH0KCiAgICAgIC5tZW51c3ZnIHBhdGggewogICAgICAgIGZpbGw6ICNmZmY7CiAgICAgIH0KCiAgICAgICNtZW51LWNvbnRlbnQgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgICB3aWR0aDogMThlbTsKICAgICAgICBtYXJnaW4tbGVmdDogLTE4ZW07CiAgICAgICAgYmFja2dyb3VuZDogIzIyMjsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgei1pbmRleDogMzsgCiAgICAgICAgb3ZlcmZsb3c6IHNjcm9sbDsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudC52aXNpYmxlIHsKICAgICAgICBtYXJnaW4tbGVmdDogMDsKICAgICAgfQogICAgICAKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgewogICAgICAgIHBhZGRpbmc6IDAgMWVtIDFlbSAxZW07CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIGEsCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgcGFkZGluZzogLjVlbSAuN2VtOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgICB9CgogICAgICAjb3ZlcmxheSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICB6LWluZGV4OiAzOwogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICBvcGFjaXR5OiAuNTsKICAgICAgfQoKICAgICAgLnZpc2libGUgewogICAgICAgIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgCiAgICAgICNzaGFyZS1kaWFsb2cgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHdpZHRoOiBjYWxjKDEwMHZ3IC0gNmVtKTsKICAgICAgICBoZWlnaHQ6IDUwJTsKICAgICAgICBiYWNrZ3JvdW5kOiAjZmZmOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDFlbTsKICAgICAgICB6LWluZGV4OiA0OwogICAgICAgIG1hcmdpbi1sZWZ0OiAyZW07CiAgICAgICAgbWFyZ2luLXRvcDogMmVtOwogICAgICAgIHBhZGRpbmc6IDFlbTsKICAgICAgfQogICAgICAKICAgICAgaDIgewogICAgICAgIG1hcmdpbi10b3A6IDA7CiAgICAgIH0KICAgICAgCiAgICAgIHN2ZyB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgICN0ZW1wbGF0ZSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8ZGl2IGlkPSJ0ZW1wbGF0ZSI+CiAgICAgIDxzdmcgY2xhc3M9ImhlYXJ0c3ZnIHN2Zy1pY29uIiB2aWV3Qm94PSIwIDAgMjAgMjAiPgogICAgICAgIDxwYXRoIGQ9Ik05LjcxOSwxNy4wNzNsLTYuNTYyLTYuNTFjLTAuMjctMC4yNjgtMC41MDQtMC41NjctMC42OTYtMC44ODhDMS4zODUsNy44OSwxLjY3LDUuNjEzLDMuMTU1LDQuMTRjMC44NjQtMC44NTYsMi4wMTItMS4zMjksMy4yMzMtMS4zMjljMS45MjQsMCwzLjExNSwxLjEyLDMuNjEyLDEuNzUyYzAuNDk5LTAuNjM0LDEuNjg5LTEuNzUyLDMuNjEyLTEuNzUyYzEuMjIxLDAsMi4zNjksMC40NzIsMy4yMzMsMS4zMjljMS40ODQsMS40NzMsMS43NzEsMy43NSwwLjY5Myw1LjUzN2MtMC4xOSwwLjMyLTAuNDI1LDAuNjE4LTAuNjk1LDAuODg3bC02LjU2Miw2LjUxQzEwLjEyNSwxNy4yMjksOS44NzUsMTcuMjI5LDkuNzE5LDE3LjA3MyBNNi4zODgsMy42MUM1LjM3OSwzLjYxLDQuNDMxLDQsMy43MTcsNC43MDdDMi40OTUsNS45MiwyLjI1OSw3Ljc5NCwzLjE0NSw5LjI2NWMwLjE1OCwwLjI2NSwwLjM1MSwwLjUxLDAuNTc0LDAuNzMxTDEwLDE2LjIyOGw2LjI4MS02LjIzMmMwLjIyNC0wLjIyMSwwLjQxNi0wLjQ2NiwwLjU3My0wLjcyOWMwLjg4Ny0xLjQ3MiwwLjY1MS0zLjM0Ni0wLjU3MS00LjU2QzE1LjU3LDQsMTQuNjIxLDMuNjEsMTMuNjEyLDMuNjFjLTEuNDMsMC0yLjYzOSwwLjc4Ni0zLjI2OCwxLjg2M2MtMC4xNTQsMC4yNjQtMC41MzYsMC4yNjQtMC42OSwwQzkuMDI5LDQuMzk3LDcuODIsMy42MSw2LjM4OCwzLjYxIj48L3BhdGg+CiAgICAgIDwvc3ZnPgogICAgICA8c3ZnIGNsYXNzPSJ2aWRlb3N2ZyBzdmctaWNvbiIgdmlld0JveD0iMCAwIDIwIDIwIj4KCQkJCTxwYXRoIGQ9Ik0xOC4xNzUsNC4xNDJIMS45NTFDMS43MDMsNC4xNDIsMS41LDQuMzQ0LDEuNSw0LjU5MnYxMC44MTZjMCwwLjI0NywwLjIwMywwLjQ1LDAuNDUxLDAuNDVoMTYuMjI0YzAuMjQ3LDAsMC40NS0wLjIwMywwLjQ1LTAuNDVWNC41OTJDMTguNjI1LDQuMzQ0LDE4LjQyMiw0LjE0MiwxOC4xNzUsNC4xNDIgTTQuNjU1LDE0Ljk1N0gyLjQwMXYtMS44MDNoMi4yNTNWMTQuOTU3ek00LjY1NSwxMi4yNTRIMi40MDF2LTEuODAzaDIuMjUzVjEyLjI1NHogTTQuNjU1LDkuNTQ5SDIuNDAxVjcuNzQ3aDIuMjUzVjkuNTQ5eiBNNC42NTUsNi44NDZIMi40MDFWNS4wNDNoMi4yNTNWNi44NDZ6TTE0LjU2OSwxNC45NTdINS41NTZWNS4wNDNoOS4wMTNWMTQuOTU3eiBNMTcuNzI0LDE0Ljk1N2gtMi4yNTN2LTEuODAzaDIuMjUzVjE0Ljk1N3ogTTE3LjcyNCwxMi4yNTRoLTIuMjUzdi0xLjgwM2gyLjI1M1YxMi4yNTR6TTE3LjcyNCw5LjU0OWgtMi4yNTNWNy43NDdoMi4yNTNWOS41NDl6IE0xNy43MjQsNi44NDZoLTIuMjUzVjUuMDQzaDIuMjUzVjYuODQ2eiI+PC9wYXRoPgoJCQk8L3N2Zz4KCQkJPHN2ZyBjbGFzcz0iaW1hZ2Vzdmcgc3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CgkJCQk8cGF0aCBkPSJNMTguNTU1LDE1LjM1NFY0LjU5MmMwLTAuMjQ4LTAuMjAyLTAuNDUxLTAuNDUtMC40NTFIMS44ODhjLTAuMjQ4LDAtMC40NTEsMC4yMDMtMC40NTEsMC40NTF2MTAuODA4YzAsMC41NTksMC43NTEsMC40NTEsMC40NTEsMC40NTFoMTYuMjE3aDAuMDA1QzE4Ljc5MywxNS44NTEsMTguNDc4LDE0LjgxNCwxOC41NTUsMTUuMzU0IE0yLjgsMTQuOTQ5bDQuOTQ0LTYuNDY0bDQuMTQ0LDUuNDE5YzAuMDAzLDAuMDAzLDAuMDAzLDAuMDAzLDAuMDAzLDAuMDA1bDAuNzk3LDEuMDRIMi44eiBNMTMuODIyLDE0Ljk0OWwtMS4wMDYtMS4zMTdsMS42ODktMi4yMThsMi42ODgsMy41MzVIMTMuODIyeiBNMTcuNjU0LDE0LjA2NGwtMi43OTEtMy42NjZjLTAuMTgxLTAuMjM3LTAuNTM1LTAuMjM3LTAuNzE2LDBsLTEuODk5LDIuNDkzbC00LjE0Ni01LjQyYy0wLjE4LTAuMjM3LTAuNTM2LTAuMjM3LTAuNzE2LDBsLTUuMDQ3LDYuNTk4VjUuMDQyaDE1LjMxNlYxNC4wNjR6IE0xMi40NzQsNi4zOTNjLTAuODY5LDAtMS41NzcsMC43MDctMS41NzcsMS41NzZzMC43MDgsMS41NzYsMS41NzcsMS41NzZzMS41NzctMC43MDcsMS41NzctMS41NzZTMTMuMzQzLDYuMzkzLDEyLjQ3NCw2LjM5MyBNMTIuNDc0LDguNjQ1Yy0wLjM3MSwwLTAuNjc2LTAuMzA0LTAuNjc2LTAuNjc2czAuMzA1LTAuNjc2LDAuNjc2LTAuNjc2YzAuMzcyLDAsMC42NzYsMC4zMDQsMC42NzYsMC42NzZTMTIuODQ2LDguNjQ1LDEyLjQ3NCw4LjY0NSI+PC9wYXRoPgoJCQk8L3N2Zz4KICAgICAgPGRpdiBpZD0iY29sc2NzcyI+CiAgICAgIC5jb2xzJHtjb2xzfSAjaW1hZ2VzIC5pdGVtIHsKICAgICAgICB3aWR0aDogY2FsYygxMDB2dyAvICR7Y29sc30pOwogICAgICB9CgogICAgICAuY29scyR7Y29sc30gI2ltYWdlcyAuaXRlbSB7CiAgICAgICAgaGVpZ2h0OiBjYWxjKDEwMHZ3IC8gJHtjb2xzfSk7CiAgICAgIH0KICAgICAgCiAgICAgIC5jb2xzJHtjb2xzfSAucXVlcnksCiAgICAgIC5jb2xzJHtjb2xzfSAubGlrZSB7CiAgICAgICAgZm9udC1zaXplOiBtaW4oMTR2dyAqICgxIC8gJHtjb2xzfSksIDZlbSAqICgxIC8gJHtjb2xzfSkpCiAgICAgIH0KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9InNoYXJlLWRpYWxvZyIgY2xhc3M9ImRpYWxvZyI+CiAgICAgIDxoMj5zaGFyZTwvaDI+CiAgICAgIDxmb3JtIGlkPSJzaGFyZS1mb3JtIiBhY3Rpb249IiMiPgogICAgICAgIDxwIGNsYXNzPSJjb250ZW50Ij48L3A+CiAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgY2xhc3M9InN1Ym1pdCIgdmFsdWU9Im9rIi8+CiAgICAgIDwvZm9ybT4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0ibWVkaWEtZm9vdGVyIj4KICAgICAgPGEgaWQ9ImltYWdlLWxpa2UiIGNsYXNzPSJsaWtlIiBocmVmPSIjIj48L2E+CiAgICAgIDxhIGlkPSJpbWFnZS1xdWVyeSIgaHJlZj0iIyI+PC9hPgogICAgICA8YSBpZD0iaW1hZ2UtdXNlciIgaHJlZj0iIyI+PC9hPgogICAgPC9kaXY+CiAgICA8Y2VudGVyIGlkPSJtZWRpYS1jb250YWluZXIiPgogICAgICA8ZGl2IGlkPSJpbWFnZS1jb250YWluZXIiPgogICAgICAgIDxpbWcgaWQ9ImltYWdlIi8+CiAgICAgIDwvZGl2PgogICAgPC9jZW50ZXI+CiAgICA8ZGl2IGlkPSJvdmVybGF5IiBjbGFzcz0iZGlhbG9nIj48L2Rpdj4KICAgIDxkaXYgaWQ9Im1lbnUtY29udGVudCIgY2xhc3M9ImRpYWxvZyI+CiAgICAgIDxkaXYgY2xhc3M9Iml0ZW1zIj4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+YXV0b3BsYXk8L2Rpdj4KICAgICAgICA8YSBjbGFzcz0ic2V0YXV0b3BsYXkiIGRhdGEtYXV0b3BsYXk9Im9uIiBocmVmPSIjIj5vbjwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0YXV0b3BsYXkiIGRhdGEtYXV0b3BsYXk9Im9mZiIgaHJlZj0iIyI+b2ZmPC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRhdXRvcGxheSIgZGF0YS1hdXRvcGxheT0iaG92ZXIiIGhyZWY9IiMiPm1vdXNlb3ZlcjwvYT4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+Y29sdW1uczwvZGl2PgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjEiIGhyZWY9IiMiPjE8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iMiIgaHJlZj0iIyI+MjwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSI0IiBocmVmPSIjIj40PC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjYiIGhyZWY9IiMiPjY8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iMTAiIGhyZWY9IiMiPjEwPC9hPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5jb25uZWN0aW9uczwvZGl2PgogICAgICAgIDxkaXYgaWQ9ImNvbm5jb3VudCI+MDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5yZWxheXM6PC9kaXY+CiAgICAgICAgPHA+UGxlYXNlIHVzZSByZWxheXMgd2l0aCBOSVAtNTAgKHNlYXJjaCkgZnVuY3Rpb25hbGl0eTwvcD4KICAgICAgICA8Zm9ybSBhY3Rpb249IiMiIGlkPSJyZWxheXMtZm9ybSI+CiAgICAgICAgICA8dGV4dGFyZWEgaWQ9InJlbGF5cyI+PC90ZXh0YXJlYT4KICAgICAgICAgIDxpbnB1dCBjbGFzcz0ic3VibWl0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJzYXZlIHJlbGF5cyIvPgogICAgICAgIDwvZm9ybT4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+cHJpdmF0ZSBrZXk6PC9kaXY+CiAgICAgICAgPHA+SWYgeW91IGNhbnQgdXNlIGJyb3dzZXIgYWRkb24gKG1vYmlsZSk8L3A+CiAgICAgICAgPGZvcm0gYWN0aW9uPSIjIiBpZD0icHJpdmtleS1mb3JtIj4KICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0icHJpdmtleSIvPgogICAgICAgICAgPGlucHV0IGNsYXNzPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9InNhdmUga2V5Ii8+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5sb2dzPC9kaXY+CiAgICAgICAgPGRpdiBpZD0ibG9ncyI+PC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmxhdGVzdCByZWxlYXNlOjwvZGl2PgogICAgICAgIDxhIGlkPSJyZWxlYXNlIiBocmVmPSIjIj48L2E+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJoZWFkZXIiPgogICAgICA8ZGl2IGNsYXNzPSJpY29ucyI+CiAgICAgICAgPGEgaWQ9ImZpbHRlci1saWtlcyIgaHJlZj0iIyIgY2xhc3M9ImhlYWRlci1pY29uIj48L2E+CiAgICAgICAgPGEgaWQ9InNoYXJlIiBocmVmPSIjIiBjbGFzcz0iaGVhZGVyLWljb24iPgogICAgICAgICAgPHN2ZyBjbGFzcz0ic3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CgkJCQkgICAgPHBhdGggZD0iTTE0LjY4LDEyLjYyMWMtMC45LDAtMS43MDIsMC40My0yLjIxNiwxLjA5bC00LjU0OS0yLjYzN2MwLjI4NC0wLjY5MSwwLjI4NC0xLjQ1NywwLTIuMTQ2bDQuNTQ5LTIuNjM4YzAuNTE0LDAuNjYxLDEuMzE1LDEuMDksMi4yMTYsMS4wOWMxLjU0OSwwLDIuODA5LTEuMjYsMi44MDktMi44MDhjMC0xLjU0OC0xLjI2LTIuODA5LTIuODA5LTIuODA5Yy0xLjU0OCwwLTIuODA4LDEuMjYtMi44MDgsMi44MDljMCwwLjM4LDAuMDc2LDAuNzQxLDAuMjE0LDEuMDczbC00LjU1LDIuNjM4Yy0wLjUxNS0wLjY2MS0xLjMxNi0xLjA5LTIuMjE3LTEuMDljLTEuNTQ4LDAtMi44MDgsMS4yNi0yLjgwOCwyLjgwOXMxLjI2LDIuODA4LDIuODA4LDIuODA4YzAuOSwwLDEuNzAyLTAuNDMsMi4yMTctMS4wOWw0LjU1LDIuNjM3Yy0wLjEzOCwwLjMzMi0wLjIxNCwwLjY5My0wLjIxNCwxLjA3NGMwLDEuNTQ5LDEuMjYsMi44MDksMi44MDgsMi44MDljMS41NDksMCwyLjgwOS0xLjI2LDIuODA5LTIuODA5UzE2LjIyOSwxMi42MjEsMTQuNjgsMTIuNjIxTTE0LjY4LDIuNTEyYzEuMTM2LDAsMi4wNiwwLjkyMywyLjA2LDIuMDZTMTUuODE1LDYuNjMsMTQuNjgsNi42M3MtMi4wNTktMC45MjMtMi4wNTktMi4wNTlTMTMuNTQ0LDIuNTEyLDE0LjY4LDIuNTEyTTUuMzE5LDEyLjA2MWMtMS4xMzYsMC0yLjA2LTAuOTI0LTIuMDYtMi4wNnMwLjkyMy0yLjA1OSwyLjA2LTIuMDU5YzEuMTM1LDAsMi4wNiwwLjkyMywyLjA2LDIuMDU5UzYuNDU0LDEyLjA2MSw1LjMxOSwxMi4wNjFNMTQuNjgsMTcuNDg4Yy0xLjEzNiwwLTIuMDU5LTAuOTIyLTIuMDU5LTIuMDU5czAuOTIzLTIuMDYxLDIuMDU5LTIuMDYxczIuMDYsMC45MjQsMi4wNiwyLjA2MVMxNS44MTUsMTcuNDg4LDE0LjY4LDE3LjQ4OCI+PC9wYXRoPgoJCQkgICAgPC9zdmc+CgkJCSAgPC9hPgoJCQk8L2Rpdj4KCQkJCiAgICAgIDxkaXYgY2xhc3M9Iml0ZW1zIj4KICAgICAgICA8YSBpZD0ibWVudSIgaHJlZj0iIyI+CiAgICAgICAgICA8c3ZnIGNsYXNzPSJtZW51c3ZnIHN2Zy1pY29uIiB2aWV3Qm94PSIwIDAgMjAgMjAiPgoJCSAgICAgICAgPHBhdGggZD0iTTEwLDEuNDQ1Yy00LjcyNiwwLTguNTU1LDMuODI5LTguNTU1LDguNTU1YzAsNC43MjUsMy44MjksOC41NTUsOC41NTUsOC41NTVjNC43MjUsMCw4LjU1NS0zLjgzLDguNTU1LTguNTU1QzE4LjU1NSw1LjI3NCwxNC43MjUsMS40NDUsMTAsMS40NDUgTTEwLDE3LjY1NGMtNC4yMjEsMC03LjY1NC0zLjQzNC03LjY1NC03LjY1NGMwLTQuMjIxLDMuNDMzLTcuNjU0LDcuNjU0LTcuNjU0YzQuMjIyLDAsNy42NTQsMy40MzMsNy42NTQsNy42NTRDMTcuNjU0LDE0LjIyMSwxNC4yMjIsMTcuNjU0LDEwLDE3LjY1NCBNMTQuMzksMTBjMCwwLjI0OC0wLjIwMywwLjQ1LTAuNDUsMC40NUg2LjA2Yy0wLjI0OCwwLTAuNDUtMC4yMDMtMC40NS0wLjQ1czAuMjAzLTAuNDUsMC40NS0wLjQ1aDcuODc5QzE0LjE4Nyw5LjU1LDE0LjM5LDkuNzUyLDE0LjM5LDEwIE0xNC4zOSwxMi43MDJjMCwwLjI0Ny0wLjIwMywwLjQ0OS0wLjQ1LDAuNDQ5SDYuMDZjLTAuMjQ4LDAtMC40NS0wLjIwMi0wLjQ1LTAuNDQ5YzAtMC4yNDgsMC4yMDMtMC40NTEsMC40NS0wLjQ1MWg3Ljg3OUMxNC4xODcsMTIuMjUxLDE0LjM5LDEyLjQ1NCwxNC4zOSwxMi43MDIgTTE0LjM5LDcuMjk4YzAsMC4yNDgtMC4yMDMsMC40NS0wLjQ1LDAuNDVINi4wNmMtMC4yNDgsMC0wLjQ1LTAuMjAzLTAuNDUtMC40NXMwLjIwMy0wLjQ1LDAuNDUtMC40NWg3Ljg3OUMxNC4xODcsNi44NDgsMTQuMzksNy4wNTEsMTQuMzksNy4yOTgiPjwvcGF0aD4KCSAgICAgICAgPC9zdmc+CiAgICAgICAgPC9hPgogICAgICAgIDxhIGlkPSJ0aXRsZSIgaHJlZj0iIyI+ZmlsZXMuaHRtbDwvYT4KICAgICAgICA8Zm9ybSBpZD0icXVlcnktZm9ybSIgYWN0aW9uPSIjIj4KICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0icXVlcnkiIG5hbWU9InF1ZXJ5IiBpZD0iIiAvPgogICAgICAgICAgPHNlbGVjdCBpZD0icXVlcnktdHlwZSI+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9ImFsbCI+YWxsPC9vcHRpb24+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9ImltYWdlIj5pbWFnZXM8L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0idmlkZW8iPnZpZGVvczwvb3B0aW9uPgogICAgICAgICAgPC9zZWxlY3Q+CiAgICAgICAgICA8aW5wdXQgaWQ9ImdvIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJnbyIvPgogICAgICAgIDwvZm9ybT4KICAgICAgICA8c3BhbiBpZD0icXVlcnlkaXNwbGF5Ij4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0ZXh0Ij48L3NwYW4+CiAgICAgICAgPC9zcGFuPgogICAgICAgIDxkaXYgaWQ9ImxvYWRpbmciPnVwZGF0aW5nPC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJpbWFnZXMiPjwvZGl2PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vdW5wa2cuY29tL25vc3RyLXRvb2xzL2xpYi9ub3N0ci5idW5kbGUuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vc2xvd2xpLmdpdGh1Yi5pby9iZWNoMzItYnVmZmVyL2Fzc2V0cy9qcy9iZWNoMzItYnVmZmVyLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0PgogICAgICBjb25zdCB1cGRhdGVzcHVia2V5ID0gImFlNWM2ZTBiNzQ2NjBkMjE5NGM4MjU0YjVjMmM4MjU2NzY1NzZiZTAyOTczNzlmYTIwNTIzMTE0YTZhODVlODciCiAgICAgIGNvbnN0IHF1ZXJpZXMgPSB7CiAgICAgICAgImdsb2JhbCI6ICdbIlJFUSIsIjxJPiIseyJjYWNoZSI6WyJleHBsb3JlIix7InRpbWVmcmFtZSI6ImxhdGVzdCIsInNjb3BlIjoiZ2xvYmFsIiwibGltaXQiOjxMPn1dfV0nLCAKICAgICAgICAiYXV0aG9yIjogJ1siUkVRIiwiPEk+Iix7ImtpbmRzIjpbMV0sImF1dGhvcnMiOlsiPFA+Il19XScsCiAgICAgICAgInJlYWN0aW9ucyI6ICdbIlJFUSIsIjxJPiIsIHsia2luZHMiOls3XSwiI2UiOiA8RT59XScKICAgICAgfQogICAgICBxcygiI3JlbGF5cyIpLnZhbHVlID0gcmVsYXlzKCkuam9pbigiXG4iKQogICAgICBxcygiI3ByaXZrZXkiKS52YWx1ZSA9IHByaXZrZXkoKQogICAgICBjb25zdCBjb2xvcHRzID0gWzEsIDIsIDQsIDYsIDEwXQoKICAgICAgY29scyA9ICgpID0+IHBhcnNlSW50KHNldHRpbmcoImNvbHMiLCBjb2xvcHRzWzFdKSwgMTApCiAgICAgIGF1dG9wbGF5ID0gKCkgPT4gc2V0dGluZygiYXV0b3BsYXkiLCAib2ZmIikKICAgICAgbGltaXQgPSAoKSA9PiBwYXJzZUludChzZXR0aW5nKCJsaW1pdCIsIDE1KSwgMTApCiAgICAgIGdhbGxlcnkgPSAoKSA9PiB7CiAgICAgICAgbGV0IGdhbGxlcnltYXRjaGVyID0gbG9jYXRpb24uc2VhcmNoLm1hdGNoKC9nYWxsZXJ5PShbYS16MC05XSspLykKICAgICAgICByZXR1cm4gZ2FsbGVyeW1hdGNoZXIgJiYgZ2FsbGVyeW1hdGNoZXJbMV0KICAgICAgfQogICAgICAKICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJjb2xzIiArIGNvbHMoKSkKCiAgICAgIGxldCBwcm90b2NvbCA9IG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS8pID8gIm5vc3RyOiIgOiAid2ViK25vc3RyOiIKICAgICAgbGV0IHNvY2tldHMgPSBbXQogICAgICBsZXQgcmVzaGFuZGxlcnMgPSBbXQogICAgICBsZXQgdXJscyA9IFtdCiAgICAgIGxldCBsaWtlcyA9IFtdCiAgICAgIGxldCBuZXdsaWtlcyA9IFtdCiAgICAgIGxldCBpZGNvdW50ZXIgPSAwCiAgICAgIGxldCBxdWVyeXdhaXQgPSBudWxsCiAgICAgIGxldCBwcmltYWxzb2NrZXQgPSBudWxsCiAgICAgIGxldCB0eXBlcyA9IHsKICAgICAgICBpbWFnZTogWyJwbmciLCAianBnIiwgImpwZWciLCAid2VicCJdLAogICAgICAgIHZpZGVvOiBbIm1wNCIsICJ3ZWJtIl0KICAgICAgfQogICAgICBsZXQgaW1ncmVnZXggPSAvaHR0cCh8cylcOlwvXC9bXiBcbl0qP1wuKHBuZ3xqcGd8anBlZ3x3ZWJwKS9naQogICAgICBsZXQgdmlkZW9yZWdleCA9IC9odHRwKHxzKVw6XC9cL1teIFxuXSo/XC4obXA0fHdlYm0pL2dpCiAgICAgIGxldCB2aWRlb2V4dHJlZ2V4ID0gL1wuKG1wNHx3ZWJtKSQvaQogICAgICBsZXQgaW1nZXh0cmVnZXggPSAvXC4ocG5nfGpwZ3xqcGVnfHdlYnApJC9pCiAgICAgIHdhaXRtcyA9IDUwMDAwCiAgICAgIHF1ZXJ5c3RyID0gIiIKICAgICAgbGV0IHF1ZXJ5Y291bnQgPSAwCiAgICAgIGxldCBob3ZlcmVkdmlkZW8gPSBudWxsCiAgICAgIAogICAgICB1cGRhdGVxdWVyeSgpCiAgICAgIHFzKCIjaW1hZ2UtbGlrZSIpLmlubmVySFRNTCA9IHFzKCIjZmlsdGVyLWxpa2VzIikuaW5uZXJIVE1MID0gcXMoIiN0ZW1wbGF0ZSAuaGVhcnRzdmciKS5vdXRlckhUTUwKICAgICAgc2V0YWN0aXZlKCJzZXRjb2xzIiwgImNvbHMiLCBjb2xzKCkpCiAgICAgIHNldGFjdGl2ZSgic2V0YXV0b3BsYXkiLCAiYXV0b3BsYXkiLCBhdXRvcGxheSgpKQogICAgICAKICAgICAgZnVuY3Rpb24gZnJvbUhleFN0cmluZyhzdHIpewogICAgICAgIGxldCBidWZmZXIgPSBuZXcgVWludDhBcnJheShzdHIubGVuZ3RoIC8gMikKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmZlci5sZW5ndGg7IGkrKykgewogICAgICAgICAgYnVmZmVyW2ldID0gcGFyc2VJbnQoc3RyLnN1YnN0cigyICogaSwgMiksIDE2KQogICAgICAgIH0KICAgICAgICByZXR1cm4gYnVmZmVyCiAgICAgIH0KICAKICAgICAgZnVuY3Rpb24gcmVsYXlzKCl7CiAgICAgICAgY29uc3Qgb2JqID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgicmVsYXlzIikpCiAgICAgICAgY29uc3QgciA9IG9iaiAmJiBvYmouZmlsdGVyKHIgPT4gci5tYXRjaCgvd3NzOlwvXC8uKy8pKSB8fCBbXQogICAgICAgIAogICAgICAgIHJldHVybiByLmxlbmd0aCA+IDAgJiYgciB8fCBbCiAgICAgICAgICAid3NzOi8vcmVsYXkubm9zdHIuYmFuZCIsCiAgICAgICAgICAid3NzOi8vbmIucmVsYXkuY2VudGVyIiwgCiAgICAgICAgICAid3NzOi8vbm9zdHIuY29tcGlsZS1lcnJvci5uZXQiCiAgICAgICAgXQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBwcml2a2V5KCl7CiAgICAgICAgbGV0IGtleSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJwcml2a2V5IikgfHwgIiIKICAgICAgICAKICAgICAgICBpZihrZXkubGVuZ3RoID09IDYzKXsKICAgICAgICAgIGtleSA9IE5vc3RyVG9vbHMubmlwMTkuZGVjb2RlKGtleSkuZGF0YQogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4ga2V5Lmxlbmd0aCA9PSA2NCAmJiBrZXkgfHwgbnVsbAogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBzZXR0aW5nKGtleSwgZGVmYXVsdHZhbHVlKXsKICAgICAgICBjb25zdCB2ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KQogICAgICAgIHJldHVybiB2ICYmIG9wdGlvbigic2V0IiArIGtleSwga2V5LCB2KSAmJiB2IHx8IGRlZmF1bHR2YWx1ZQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBvcHRpb24oYywga2V5LCB2YWwpewogICAgICAgIHJldHVybiBxcygiLiIgKyBjICsgIltkYXRhLSIgKyBrZXkgKyAiPSciICsgdmFsICsgIiddIikKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcXMocSl7CiAgICAgICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IocSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcXNhKHEpewogICAgICAgIHJldHVybiBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocSkpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGdpZChpKXsKICAgICAgICByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcXVlcnl0eXBlKCl7CiAgICAgICAgcmV0dXJuIHFzKCIjcXVlcnktdHlwZSIpLnZhbHVlIHx8ICJhbGwiCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZXF1ZXJ5KCl7CiAgICAgICAgbGV0IHBhcnRzID0gKGdhbGxlcnkoKSAmJiAoImc6IiArIGdhbGxlcnkoKSkgfHwgZGVjb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhhc2guc3Vic3RyaW5nKDEpKSkuc3BsaXQoIi8iKQogICAgICAgIHFzKCIjcXVlcnlkaXNwbGF5IC50ZXh0IikuaW5uZXJUZXh0ID0gcGFydHNbMF0uc3Vic3RyaW5nKDAsIDIwKQogICAgICAgIHF1ZXJ5c3RyID0gcGFydHNbMF0KICAgICAgICBxcygiI3F1ZXJ5IikudmFsdWUgPSBwYXJ0c1swXQogICAgICAgIHFzKCIjcXVlcnktdHlwZSIpLnZhbHVlID0gcGFydHNbMV0gfHwgImFsbCIKICAgICAgfQoKICAgICAgZnVuY3Rpb24gYWN0aXZlKCl7CiAgICAgICAgcmV0dXJuIHFzKCIjaW1hZ2VzIC5hY3RpdmUiKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBpbWFnZW9mZnNldChvZmZzZXQpewogICAgICAgIGNvbnN0IGltYWdlcyA9IHFzYSgiI2ltYWdlcyA+IC5pdGVtIikuZmlsdGVyKGUgPT4gZS5jbGFzc0xpc3QuY29udGFpbnMoInZpc2libGUiKSkKICAgICAgICByZXR1cm4gaW1hZ2VzW2ltYWdlcy5pbmRleE9mKGFjdGl2ZSgpKStvZmZzZXRdCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGxhc3RhY3RpdmUoKXsKICAgICAgICByZXR1cm4gcXNhKCIjaW1hZ2VzIC5hY3RpdmUiKS5wb3AoKSAgICAgIAogICAgICB9CgogICAgICBmdW5jdGlvbiBtZW51KCl7CiAgICAgICAgcXNhKCIjbWVudS1jb250ZW50LCAjb3ZlcmxheSIpLmZvckVhY2gobiA9PiBuLmNsYXNzTGlzdC50b2dnbGUoInZpc2libGUiKSkKICAgICAgfQogIAogICAgICBmdW5jdGlvbiBzZXRhY3RpdmUoYywga2V5LCB2YWwpewogICAgICAgIHFzYSgiLiIgKyBjKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKSkKICAgICAgICBjb25zdCBvcHRpb24gPSBxcygiLiIgKyBjICsgIltkYXRhLSIgKyBrZXkgKyAiPSciICsgdmFsICsgIiddIikKICAgICAgICBvcHRpb24/LmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHNjcm9sbHZpc2libGUobiwgb2Zmc2V0KXsKICAgICAgICBvZmZzZXQgPSBvZmZzZXQgfHwgMAogICAgICAgIHJldHVybiAobi5vZmZzZXRUb3AgKyBuLm9mZnNldEhlaWdodCkgPj0gKHNjcm9sbFkgLSBvZmZzZXQpCiAgICAgICAgICAmJiBuLm9mZnNldFRvcCA8PSAoc2Nyb2xsWSArIHZpc3VhbFZpZXdwb3J0LmhlaWdodCArIG9mZnNldCkKICAgICAgfQoKICAgICAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlaW1hZ2VzbG9hZCgpewogICAgICAgIHFzYSgiI2ltYWdlcyAuaXRlbS5pbWciKS5mb3JFYWNoKGFzeW5jIGltZyA9PiB7CiAgICAgICAgICBpZihzY3JvbGx2aXNpYmxlKGltZywgdmlzdWFsVmlld3BvcnQuaGVpZ2h0IC8gMikpewogICAgICAgICAgICBpbWcuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gInVybCgiICsgaW1nWyJkYXRhLXNyYyJdICsgIikiCiAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgaW1nLnN0eWxlLmJhY2tncm91bmRJbWFnZSA9ICIiCiAgICAgICAgICB9CiAgICAgICAgfSkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlYWxsdmlkZW9wbGF5KCl7CiAgICAgICAgcXNhKCIjaW1hZ2VzIC5pdGVtLnZpZGVvIikuZm9yRWFjaChhc3luYyBuID0+IHVwZGF0ZXZpZGVvcGxheShuKSkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gdXBkYXRldmlkZW9wbGF5KG4pewogICAgICAgIGNvbnN0IGFwbGF5ID0gYXV0b3BsYXkoKQogICAgICAgIGNvbnN0IHYgPSBuLnF1ZXJ5U2VsZWN0b3IoInZpZGVvIikKICAgICAgICAKICAgICAgICBpZihhcGxheSAhPSAib24iKXsKICAgICAgICAgIHYubXV0ZWQgPSBmYWxzZQogICAgICAgICAgdi5wYXVzZSgpCiAgICAgICAgfWVsc2V7CiAgICAgICAgICB2Lm11dGVkID0gdHJ1ZQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZighc2Nyb2xsdmlzaWJsZShuKSl7CiAgICAgICAgICBpZih2LnJlYWR5U3RhdGUgPT0gNCl7CiAgICAgICAgICAgIHYucGF1c2UoKQogICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIHYucHJlbG9hZCA9ICJub25lIgogICAgICAgICAgfQogICAgICAgIH1lbHNlIGlmKHYucmVhZHlTdGF0ZSAhPSA0KXsKICAgICAgICAgIHYucHJlbG9hZCA9ICJhdXRvIgogICAgICAgIH0KICAgICAgICBlbHNlIGlmKGFwbGF5ID09ICJvbiIgfHwgKGFwbGF5ID09ICJob3ZlciIgJiYgdiA9PSBob3ZlcmVkdmlkZW8pKXsKICAgICAgICAgIHYucGxheSgpCiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLCBlID0+IHsKICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpCiAgICAgICAgdXBkYXRlaW1hZ2VzbG9hZCgpCiAgICAgICAgdXBkYXRlYWxsdmlkZW9wbGF5KCkKICAgICAgfSkKICAgICAgCiAgICAgIGxldCB0b3VjaCA9IG51bGwKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLCBlID0+IHRvdWNoID0gZS5jaGFuZ2VkVG91Y2hlc1swXSkKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIiwgZSA9PiB7CiAgICAgICAgY29uc3QgeGRpZmYgPSBlLmNoYW5nZWRUb3VjaGVzWzBdLnNjcmVlblggLSB0b3VjaC5zY3JlZW5YCgogICAgICAgIGlmKHhkaWZmIDwgLTUwKXsKICAgICAgICAgIHN3aXBlKDEpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKHhkaWZmID4gNTApewogICAgICAgICAgc3dpcGUoLTEpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgcXMoIiNxdWVyeS1mb3JtIikuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgZSA9PiB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgd2luZG93Lmhpc3RvcnkucHVzaFN0YXRlKG51bGwsIG51bGwsIGxvY2F0aW9uLnBhdGhuYW1lKQogICAgICAgIGxvY2F0aW9uLmhhc2ggPSAiIyIgKyBlbmNvZGVVUklDb21wb25lbnQocXMoIiNxdWVyeSIpLnZhbHVlICsgIi8iICsgcXVlcnl0eXBlKCkpCiAgICAgICAgdXBkYXRlcXVlcnkoKQogICAgICAgIHF1ZXJ5d2FpdC5yZXNvbHZlKCkKICAgICAgfSkKCiAgICAgIHFzKCIjcmVsYXlzLWZvcm0iKS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLCBhc3luYyBlID0+IHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICBsZXQgciA9IEpTT04uc3RyaW5naWZ5KHFzKCIjcmVsYXlzIikudmFsdWUuc3BsaXQoIlxuIikpCiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oInJlbGF5cyIsIHIpCiAgICAgICAgZGlzY29ubmVjdCgpCiAgICAgIH0pCiAgICAgIAogICAgICBxcygiI3NoYXJlLWZvcm0iKS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLCBhc3luYyBlID0+IHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICAKICAgICAgICBpZihxcygiI3NoYXJlLWZvcm0gLnN1Ym1pdCIpLnZhbHVlID09ICJjbG9zZSIpewogICAgICAgICAgcXNhKCIuZGlhbG9nLnZpc2libGUiKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QucmVtb3ZlKCJ2aXNpYmxlIikpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QgZXZlbnRzID0gcXNhKCIjaW1hZ2VzIC5pdGVtIikuZmlsdGVyKG4gPT4gbi5vZmZzZXRQYXJlbnQpLm1hcChuID0+IG5bImRhdGEtZXZlbnQiXS5pZCkKICAgICAgICBjb25zdCBldmVudCA9IGF3YWl0IHB1Ymxpc2goewogICAgICAgICAgImtpbmQiOiAzMzMsCiAgICAgICAgICAiY29udGVudCI6IEpTT04uc3RyaW5naWZ5KGV2ZW50cyksCiAgICAgICAgICAidGFncyI6IFtdCiAgICAgICAgfSkKCiAgICAgICAgYXdhaXQgd2FpdHJlcyhudWxsLCAiT0siKQoKICAgICAgICBjb25zdCB1cmwgPSB3aW5kb3cubG9jYXRpb24ub3JpZ2luICsgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lCiAgICAgICAgCiAgICAgICAgY29uc3QgcHVibGlzaGVkZXZlbnQgPSBhd2FpdCBwdWJsaXNoKHsKICAgICAgICAgICJraW5kIjogMSwKICAgICAgICAgICJjb250ZW50IjogIlRoaXMgaXMgYSBnYWxsZXJ5IG9mICIgKyBldmVudHMubGVuZ3RoCiAgICAgICAgICAgICsgIiBpbWFnZXMvdmlkZW9zIHNoYXJlZCBmcm9tIGZpbGVzLmh0bWwuIENoZWNrIGl0IG91dCBoZXJlOiAiICsgdXJsICsgIj9nYWxsZXJ5PSIgKyBldmVudC5pZCwKICAgICAgICAgICJ0YWdzIjogWwogICAgICAgICAgICBbIiNlIiwgZXZlbnQuaWRdLCAKICAgICAgICAgICAgWyIjcCIsIGV2ZW50LnB1YmtleV0KICAgICAgICAgIF0KICAgICAgICB9KQoKICAgICAgICBhd2FpdCB3YWl0cmVzKG51bGwsICJPSyIpCiAgICAgICAgCiAgICAgICAgY29uc3QgYmVjaDMyaWQgPSBiZWNoMzIuZW5jb2RlKCJub3RlIiwgZnJvbUhleFN0cmluZyhwdWJsaXNoZWRldmVudC5pZCkpCiAgICAgICAgcXMoIiNzaGFyZS1mb3JtIC5jb250ZW50IikuaW5uZXJIVE1MID0gJ05vdGUgcHVibGlzaGVkIDxhIGhyZWY9IicgKyBwcm90b2NvbCArIGJlY2gzMmlkICsgJyI+JyArIGJlY2gzMmlkICsgJzwvYT4nCiAgICAgICAgcXMoIiNzaGFyZS1mb3JtIC5zdWJtaXQiKS52YWx1ZSA9ICJjbG9zZSIKICAgICAgfSkKCiAgICAgIHFzKCIjcHJpdmtleS1mb3JtIikuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgYXN5bmMgZSA9PiB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgY29uc3Qga2V5ID0gcXMoIiNwcml2a2V5IikudmFsdWUKCiAgICAgICAgaWYoa2V5Lmxlbmd0aCAhPSA2NCAmJiBrZXkubGVuZ3RoICE9IDYzKXsKICAgICAgICAgIGFsZXJ0KCJrZXkgc2hvdWxkIGJlIDYzIG9yIDY0IGNoYXJhY3RlcnMgbG9uZyIpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oInByaXZrZXkiLCBrZXkpCiAgICAgICAgYWxlcnQoImtleSBzYXZlZCIpCiAgICAgIH0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLCBhc3luYyAoZSkgPT4gewogICAgICAgIGlmKGF1dG9wbGF5KCkgPT0gImhvdmVyIiAmJiBlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInZpZGVvLWNvbnRhaW5lciIpKXsKICAgICAgICAgIGhvdmVyZWR2aWRlbyA9IGUudGFyZ2V0LnF1ZXJ5U2VsZWN0b3IoInZpZGVvIikKICAgICAgICAgIGhvdmVyZWR2aWRlby5wbGF5KCkKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgaG92ZXJlZHZpZGVvID0gZmFsc2UKICAgICAgICBpZighcXMoIiNtZWRpYS1jb250YWluZXIiKS5jbGFzc0xpc3QuY29udGFpbnMoInZpc2libGUiKSAmJiBhdXRvcGxheSgpID09ICJob3ZlciIgJiYgZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ2aWRlby1jb250YWluZXIiKSl7CiAgICAgICAgICBxc2EoInZpZGVvIikuZm9yRWFjaCh2ID0+IHYucGF1c2UoKSkKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgaWYoZS50YXJnZXQudHlwZSA9PSAic3VibWl0IiB8fCAoZS50YXJnZXQudGFnTmFtZSA9PSAiQSIgJiYgZS50YXJnZXQuaHJlZi5tYXRjaCgvXih8d2ViXCspbm9zdHJcOi8pKSl7CiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAKICAgICAgICBpZihlLnRhcmdldC5pZCA9PSAidGl0bGUiKXsKICAgICAgICAgIHFzKCIjcXVlcnkiKS52YWx1ZSA9ICIiCiAgICAgICAgICBxcygiI3F1ZXJ5LXR5cGUiKS52YWx1ZSA9ICJhbGwiCiAgICAgICAgICBxcygiI2dvIikuY2xpY2soKQogICAgICAgIH0KCiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCgogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJmaWx0ZXItbGlrZXMiKXsKICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnRvZ2dsZSgiZmlsdGVyLWxpa2VzIikKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLnRhcmdldC5pZCA9PSAic2hhcmUiKXsKICAgICAgICAgIGNvbnN0IGV2ZW50cyA9IHFzYSgiI2ltYWdlcyAuaXRlbSIpLmZpbHRlcihuID0+IG4ub2Zmc2V0UGFyZW50KS5tYXAobiA9PiBuWyJkYXRhLWV2ZW50Il0uaWQpCiAgICAgICAgICAvL2NvbnN0IHRleHQgPSB7dHlwZTogIiIsIGV2ZW50czogfQogICAgICAgICAgcXMoIiNzaGFyZS1kaWFsb2cgLmNvbnRlbnQiKS5pbm5lckhUTUwgPSAiPHA+U2hhcmUgbGluayB0byB0aGlzIGdhbGxlcnkgb2YgIiArIGV2ZW50cy5sZW5ndGggKyAiIGltYWdlcy92aWRlb3MgdG8geW91ciBub3N0ciBwcm9maWxlPzwvcD4iCiAgICAgICAgICBxcygiI3NoYXJlLWZvcm0gLnN1Ym1pdCIpLnZhbHVlID0gInB1Ymxpc2giCiAgICAgICAgICBxc2EoIiNzaGFyZS1kaWFsb2csICNvdmVybGF5IikuZm9yRWFjaChuID0+IG4uY2xhc3NMaXN0LnRvZ2dsZSgidmlzaWJsZSIpKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNob3ciKSl7CiAgICAgICAgICBhY3RpdmUoKT8uY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIGNvbnN0IGlkID0gZS50YXJnZXQuaWQgfHwgZS50YXJnZXRbImRhdGEtaXRlbS1pZCJdCiAgICAgICAgICBnaWQoaWQpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBzaG93KGlkKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUudGFyZ2V0LnRhZ05hbWUgIT0gIkEiICYmIChxcygiI2ltYWdlLWNvbnRhaW5lciIpID09IGUudGFyZ2V0IHx8IHFzKCIjaW1hZ2UiKSA9PSBlLnRhcmdldCB8fCBxcygiI21lZGlhLWNvbnRhaW5lciB2aWRlbyIpID09IGUudGFyZ2V0KSl7CiAgICAgICAgICBoaWRlbWVkaWEoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLnRhcmdldC5pZCA9PSAibWVudSIpewogICAgICAgICAgbWVudSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJvdmVybGF5Iil7CiAgICAgICAgICBxc2EoIi5kaWFsb2cudmlzaWJsZSIpLmZvckVhY2gobiA9PiBuLmNsYXNzTGlzdC5yZW1vdmUoInZpc2libGUiKSkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNldGNvbHMiKSl7CiAgICAgICAgICBmb3IobGV0IGMgb2YgY29sb3B0cyl7CiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgiY29scyIgKyBjKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoImNvbHMiICsgZS50YXJnZXQuZGF0YXNldC5jb2xzKQogICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oImNvbHMiLCBlLnRhcmdldC5kYXRhc2V0LmNvbHMpCiAgICAgICAgICBzZXRhY3RpdmUoInNldGNvbHMiLCAiY29scyIsIGNvbHMoKSkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNldGF1dG9wbGF5IikpewogICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oImF1dG9wbGF5IiwgZS50YXJnZXQuZGF0YXNldC5hdXRvcGxheSkKICAgICAgICAgIHNldGFjdGl2ZSgic2V0YXV0b3BsYXkiLCAiYXV0b3BsYXkiLCBhdXRvcGxheSgpKQogICAgICAgICAgdXBkYXRlYWxsdmlkZW9wbGF5KCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoImxpa2UiKSAmJiBsaWtlKGUudGFyZ2V0KQogICAgICB9KQogICAgICAKICAgICAgZnVuY3Rpb24gaGFza2V5KCl7CiAgICAgICAgcmV0dXJuIHdpbmRvdy5ub3N0ciB8fCBwcml2a2V5KCkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcHVia2V5KCl7CiAgICAgICAgcmV0dXJuIHdpbmRvdy5ub3N0ciAmJiBhd2FpdCB3aW5kb3cubm9zdHIuZ2V0UHVibGljS2V5KCkgfHwgTm9zdHJUb29scy5nZXRQdWJsaWNLZXkocHJpdmtleSgpKQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBzaWduKGV2ZW50KXsKICAgICAgICBpZih3aW5kb3cubm9zdHIpewogICAgICAgICAgcmV0dXJuIGF3YWl0IG5vc3RyLnNpZ25FdmVudChldmVudCkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZXZlbnQuc2lnID0gTm9zdHJUb29scy5nZXRTaWduYXR1cmUoZXZlbnQsIHByaXZrZXkoKSkKICAgICAgICByZXR1cm4gZXZlbnQKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gbGlrZShsaW5rKXsKICAgICAgICBjb25zdCBldmVudCA9IGxpbmsucGFyZW50RWxlbWVudFsiZGF0YS1ldmVudCJdCiAgICAgICAgCiAgICAgICAgYXdhaXQgcHVibGlzaCh7CiAgICAgICAgICAia2luZCI6IDcsCiAgICAgICAgICAiY29udGVudCI6ICIrIiwKICAgICAgICAgICJ0YWdzIjogWwogICAgICAgICAgICBbImUiLCBldmVudC5pZF0sCiAgICAgICAgICAgIFsicCIsIGV2ZW50LnB1YmtleV0KICAgICAgICAgIF0KICAgICAgICB9KQoKICAgICAgICBsaW5rLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQoKICAgICAgICBjb25zdCBpbWFnZWlkID0gbGlua1siZGF0YS1pdGVtLWlkIl0gfHwgbGluay5kYXRhc2V0LmltYWdlSWQKICAgICAgICAKICAgICAgICBpZihpbWFnZWlkKXsKICAgICAgICAgIGdpZChpbWFnZWlkKS5xdWVyeVNlbGVjdG9yKCIubGlrZSIpLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQogICAgICAgIH0KICAgICAgfQoKICAgICAgYXN5bmMgZnVuY3Rpb24gcHJlcGFyZV9ldmVudChldmVudCl7CiAgICAgICAgZXZlbnQucHVia2V5ID0gYXdhaXQgcHVia2V5KCkKICAgICAgICBldmVudC5jcmVhdGVkX2F0ID0gcGFyc2VJbnQoRGF0ZS5ub3coKSAvIDEwMDAsIDEwKQogICAgICAgIGV2ZW50LmlkID0gTm9zdHJUb29scy5nZXRFdmVudEhhc2goZXZlbnQpCiAgICAgICAgcmV0dXJuIGV2ZW50CiAgICAgIH0KICAgICAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBwdWJsaXNoKGV2ZW50KXsKICAgICAgICBldmVudCA9IGF3YWl0IHByZXBhcmVfZXZlbnQoZXZlbnQpCiAgICAgICAgbGV0IHNpZ25lZGV2ZW50ID0gYXdhaXQgc2lnbihldmVudCkKICAgICAgICBsZXQganNvbiA9IEpTT04uc3RyaW5naWZ5KFsiRVZFTlQiLCBzaWduZWRldmVudF0pCiAgICAgICAgc29ja2V0cy5mb3JFYWNoKHMgPT4gcy5zZW5kKGpzb24pKQogICAgICAgIAogICAgICAgIHJldHVybiBldmVudAogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBzd2lwZShvZmZzZXQpewogICAgICAgIGlmKGltYWdlb2Zmc2V0KG9mZnNldCkpewogICAgICAgICAgaW1hZ2VvZmZzZXQob2Zmc2V0KS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgdGhpc1tvZmZzZXQgPT0gLTEgJiYgImxhc3RhY3RpdmUiIHx8ICJhY3RpdmUiXSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgICB1cGRhdGVzaG93KCkKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZXNob3coKXsKICAgICAgICBpZihxcygiI21lZGlhLWNvbnRhaW5lciIpLmNsYXNzTGlzdC5jb250YWlucygidmlzaWJsZSIpKXsKICAgICAgICAgIGhpZGV2aWRlbygpCiAgICAgICAgICBzaG93KGFjdGl2ZSgpLmlkKQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIGUgPT4gewogICAgICAgIGlmKFsiVGFiIiwgIkFycm93TGVmdCIsICJBcnJvd1JpZ2h0IiwgIkFycm93VXAiLCAiQXJyb3dEb3duIl0uaW5jbHVkZXMoZS5rZXkpKXsKICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkVzY2FwZSIpewogICAgICAgICAgbWVudSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZS5rZXkgPT0gIkVudGVyIiAmJiBlLnRhcmdldC50YWdOYW1lID09ICJCT0RZIil7CiAgICAgICAgICBpZihxcygiI21lZGlhLWNvbnRhaW5lciIpLmNsYXNzTGlzdC5jb250YW5zKCJ2aXNpYmxlIikpewogICAgICAgICAgICBoaWRlbWVkaWEoKQogICAgICAgICAgICByZXR1cm4KICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgc2hvdyhhY3RpdmUoKS5pZCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93VXAiICYmIGltYWdlb2Zmc2V0KC1jb2xzKCkpKXsKICAgICAgICAgIGltYWdlb2Zmc2V0KC1jb2xzKCkpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBsYXN0YWN0aXZlKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIHVwZGF0ZXNob3coKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93RG93biIgJiYgaW1hZ2VvZmZzZXQoY29scygpKSl7CiAgICAgICAgICBpbWFnZW9mZnNldChjb2xzKCkpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBhY3RpdmUoKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgICAgdXBkYXRlc2hvdygpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dMZWZ0Iil7CiAgICAgICAgICBzd2lwZSgtMSkKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd1JpZ2h0Iil7CiAgICAgICAgICBzd2lwZSgxKQogICAgICAgIH0KICAgICAgfSkKCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGhhbmRsZXF1ZXJ5cmVzKHJlcywgc29ja2V0LCBxLCB0eXBlLCBzdGltZSl7CiAgICAgICAgc2F2ZShzb2NrZXQsIHJlcywgcSwgdHlwZSwgZmFsc2UsIGZhbHNlLCB0cnVlKQogICAgICAgIGxvZygicXVlcnkgcmVzIiwgcmVzLmxlbmd0aCwgc29ja2V0LnVybCkKICAgICAgICBxdWVyeWNvdW50LS0KICAgICAgICBpZihxdWVyeWNvdW50ID09IDApewogICAgICAgICAgcXMoIiNsb2FkaW5nIikuY2xhc3NMaXN0LnJlbW92ZSgidmlzaWJsZSIpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGxldCB3YWl0ID0gd2FpdG1zIC0gKERhdGUubm93KCkgLSBzdGltZSkKICAgICAgICBxdWVyeXdhaXQgPSBzbGVlcCh3YWl0KQogICAgICAgIGF3YWl0IHF1ZXJ5d2FpdC5wcm9taXNlCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHByaW1hbGdsb2JhbChzb2NrZXQpewogICAgICAgIGxvZygiZ2xvYmFsIiwgc29ja2V0LnVybCkKICAgICAgICBxdWVyeWNvdW50KysKICAgICAgICBxcygiI2xvYWRpbmciKS5jbGFzc0xpc3QuYWRkKCJ2aXNpYmxlIikKICAgICAgICBsZXQgc3RpbWUgPSBEYXRlLm5vdygpCiAgICAgICAgbGV0IHFpZCA9ICJnbG9iYWxfIiArICgrK2lkY291bnRlcikKICAgICAgICBsZXQgcWlkbGlrZXMgPSAibGlrZXNfIiArICgrK2lkY291bnRlcikKCiAgICAgICAgaWYobmV3bGlrZXMubGVuZ3RoID4gMCl7CiAgICAgICAgICBwcmltYWxzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeShbCiAgICAgICAgICAgICJSRVEiLCAKICAgICAgICAgICAgcWlkbGlrZXMsIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgImNhY2hlIjogWwogICAgICAgICAgICAgICAgImV2ZW50cyIsIHsKICAgICAgICAgICAgICAgICAgImV2ZW50X2lkcyI6IG5ld2xpa2VzCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgXQogICAgICAgICAgICB9CiAgICAgICAgICBdKSkKCiAgICAgICAgICBjb25zdCBsaWtlX2V2ZW50cyA9IChhd2FpdCB3YWl0cmVzKHFpZGxpa2VzKSlbMF0KICAgICAgICAgIG5ld2xpa2VzLnNwbGljZSgwKQogICAgICAgICAgCiAgICAgICAgICBhd2FpdCBzYXZlKHNvY2tldCwgbGlrZV9ldmVudHMsICIiLCAiYWxsIiwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KFsKICAgICAgICAgICJSRVEiLCAKICAgICAgICAgIHFpZCwgCiAgICAgICAgICB7CiAgICAgICAgICAgICJjYWNoZSI6IFsKICAgICAgICAgICAgICAiZXhwbG9yZSIsIAogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJ0aW1lZnJhbWUiOiAibGF0ZXN0IiwKICAgICAgICAgICAgICAgICJzY29wZSI6ICJnbG9iYWwiLAogICAgICAgICAgICAgICAgImxpbWl0IjogNTAKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdKSkKICAgICAgICAKICAgICAgICBjb25zdCByZXMgPSAoYXdhaXQgd2FpdHJlcyhxaWQpKVswXQogICAgICAgIGF3YWl0IGhhbmRsZXF1ZXJ5cmVzKHJlcy5maWx0ZXIoZSA9PiBlLmtpbmQgPT0gMSksIHNvY2tldCwgIiIsICJhbGwiLCBzdGltZSkKICAgICAgICBwcmltYWxnbG9iYWwoc29ja2V0KQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeShzb2NrZXQsIHByaW1hbCl7CiAgICAgICAgbG9nKCJxdWVyeSIsIHNvY2tldC51cmwpCiAgICAgICAgcXVlcnljb3VudCsrCiAgICAgICAgcXMoIiNsb2FkaW5nIikuY2xhc3NMaXN0LmFkZCgidmlzaWJsZSIpCiAgICAgICAgCiAgICAgICAgbGV0IHN0aW1lID0gRGF0ZS5ub3coKQogICAgICAgIGxldCBxID0gcXVlcnlzdHIudHJpbSgpCiAgICAgICAgbGV0IHR5cGUgPSBxdWVyeXR5cGUoKQogICAgICAgIGxldCBpID0gKytpZGNvdW50ZXIKICAgICAgICBsZXQgcWlkID0gInF1ZXJ5XyIgKyBpCiAgICAgICAgY29uc3QgbGlrZXNyZXMgPSBhd2FpdCBxdWVyeWxpa2VzKHNvY2tldCkKICAgICAgICAKICAgICAgICBsaWtlc3Jlcy5mb3JFYWNoKGV2ZW50aWQgPT4gewogICAgICAgICAgaWYoIWxpa2VzLmluY2x1ZGVzKGV2ZW50aWQpKXsKICAgICAgICAgICAgbGlrZXMucHVzaChldmVudGlkKQogICAgICAgICAgICBuZXdsaWtlcy5wdXNoKGV2ZW50aWQpCiAgICAgICAgICB9CiAgICAgICAgfSkKICAgICAgICAKICAgICAgICBsZXQgZ2FsbGVyeW1hdGNoID0gcXVlcnlzdHIubWF0Y2goL2c6KFthLXowLTldKykvKQogICAgICAgIGxldCByZXMgPSBudWxsCiAgICAgICAgCiAgICAgICAgaWYoZ2FsbGVyeW1hdGNoKXsKICAgICAgICAgIGNvbnN0IGdhbGxlcnlyZXMgPSBhd2FpdCBxdWVyeWV2ZW50cyhzb2NrZXQsIFszMzNdLCBbZ2FsbGVyeW1hdGNoWzFdXSwgbnVsbCkKICAgICAgICAgIGNvbnN0IGV2ZW50aWRzID0gSlNPTi5wYXJzZShnYWxsZXJ5cmVzWzBdLmNvbnRlbnQpCiAgICAgICAgICByZXMgPSBhd2FpdCBxdWVyeWV2ZW50cyhzb2NrZXQsIFsxXSwgZXZlbnRpZHMsIG51bGwpCiAgICAgICAgfWVsc2V7CiAgICAgICAgICBsZXQgZmlsdGVycyA9IFtdCgogICAgICAgICAgZmlsdGVycy5wdXNoKC4uLih0eXBlc1t0eXBlXSB8fCBbXSkubWFwKCh0KSA9PiB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAga2luZHM6IFsxXSwgCiAgICAgICAgICAgICAgc2VhcmNoOiAiLiIgKyB0LAogICAgICAgICAgICAgIGxpbWl0OiAyMAogICAgICAgICAgICB9CiAgICAgICAgICB9KSkKICAgICAgICAgIAogICAgICAgICAgaWYocS5sZW5ndGggPiAwKXsKICAgICAgICAgICAgZmlsdGVycy5wdXNoKHtraW5kczogWzFdLCBzZWFyY2g6IHF9KQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBpZihmaWx0ZXJzLmxlbmd0aCA9PSAwKXsKICAgICAgICAgICAgZmlsdGVycy5wdXNoKHtraW5kczogWzFdfSkKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgY29uc3Qgc2VhcmNob2JqID0gWyJSRVEiLCBxaWQsIC4uLmZpbHRlcnNdCiAgICAgICAgICBjb25zdCBzZWFyY2hqc29uID0gSlNPTi5zdHJpbmdpZnkoc2VhcmNob2JqKQogICAgICAgICAgc29ja2V0LnNlbmQoc2VhcmNoanNvbikKICAgICAgICAgIAogICAgICAgICAgcmVzID0gKGF3YWl0IHdhaXRyZXMocWlkKSlbMF0KICAgICAgICAgIAogICAgICAgICAgcmVzID0gcmVzLmZpbHRlcihvID0+IHsKICAgICAgICAgICAgaWYocS5sZW5ndGggPiAwKXsKICAgICAgICAgICAgICBmb3IobGV0IHdvcmQgb2YgcS5zcGxpdCgiICIpKXsKICAgICAgICAgICAgICAgIGlmKG8uY29udGVudC50b0xvd2VyQ2FzZSgpLmluZGV4T2Yod29yZC50b0xvd2VyQ2FzZSgpKSA9PSAtMSl7CiAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWUKICAgICAgICAgIH0pCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGF3YWl0IGhhbmRsZXF1ZXJ5cmVzKHJlcywgc29ja2V0LCBxLCB0eXBlLCBzdGltZSkKICAgICAgICBxdWVyeShzb2NrZXQpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5bGlrZXMoc29ja2V0KXsKICAgICAgICBpZighaGFza2V5KCkpewogICAgICAgICAgcmV0dXJuIFtdCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IG15cHVia2V5ID0gYXdhaXQgcHVia2V5KCkKICAgICAgICBjb25zdCBldmVudHMgPSBhd2FpdCBxdWVyeWV2ZW50cyhzb2NrZXQsIFs3XSwgbnVsbCwgW215cHVia2V5XSkKICAgICAgICByZXR1cm4gZXZlbnRzLm1hcChlID0+IGUudGFncy5maW5kKHQgPT4gdFswXSA9PSAiZSIpWzFdKQogICAgICB9CgogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeWV2ZW50cyhzb2NrZXQsIGtpbmRzLCBldmVudGlkcywgYXV0aG9ycyl7CiAgICAgICAgY29uc3QgcXVlcnlpZCA9ICJldmVudHNfIiArICgrK2lkY291bnRlcikKICAgICAgICBjb25zdCBmaWx0ZXJzID0ge30KICAgICAgICAKICAgICAgICBmaWx0ZXJzLmtpbmRzID0ga2luZHMKICAgICAgICAKICAgICAgICBpZihldmVudGlkcyl7CiAgICAgICAgICBmaWx0ZXJzWyJpZHMiXSA9IGV2ZW50aWRzCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGF1dGhvcnMpewogICAgICAgICAgZmlsdGVyc1siYXV0aG9ycyJdID0gYXV0aG9ycwogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkoWwogICAgICAgICAgIlJFUSIsIAogICAgICAgICAgcXVlcnlpZCwgCiAgICAgICAgICBmaWx0ZXJzCiAgICAgICAgXSkKICAgICAgICAKICAgICAgICBzb2NrZXQuc2VuZChqc29uKQogICAgICAgIAogICAgICAgIHJldHVybiAoYXdhaXQgd2FpdHJlcyhxdWVyeWlkKSlbMF0gfHwgW10KICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcXVlcnlwdWJrZXkoc29ja2V0LCBwdWJrKXsKICAgICAgICBjb25zdCBxdWVyeWlkID0gInF1ZXJ5XyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgc29ja2V0LnNlbmQocXVlcmllcy5hdXRob3IucmVwbGFjZSgiPEk+IiwgcXVlcnlpZCkucmVwbGFjZSgiPFA+IiwgcHViaykpCgogICAgICAgIHJldHVybiAoYXdhaXQgd2FpdHJlcyhxdWVyeWlkKSlbMF0KICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gc2F2ZShzb2NrZXQsIGV2ZW50cywgcSwgcXR5cGUsIHJlYWN0ZWQsIGFwcGVuZCwgcXVlcnltZXRhKXsKICAgICAgICBsZXQgZXZlbnRwdWJrZXlzID0gW10KICAgICAgICBsZXQgcmVzdWx0cyA9IFtdCiAgICAgICAgY29uc3QgZXZlbnRpZHMgPSBldmVudHMubWFwKGUgPT4gZS5pZCkKICAgICAgICBsZXQgbmV3dXJscyA9IFtdCiAgICAgICAgCiAgICAgICAgZm9yKGxldCBldmVudCBvZiBldmVudHMpewogICAgICAgICAgbGV0IHVybHNtYXRjaCA9IFtdCiAgICAgICAgICAKICAgICAgICAgIGlmKHF0eXBlICE9ICJ2aWRlbyIpewogICAgICAgICAgICB1cmxzbWF0Y2gucHVzaCguLi4oZXZlbnQuY29udGVudC5tYXRjaChpbWdyZWdleCkgfHwgW10pKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBpZihxdHlwZSAhPSAiaW1hZ2UiKXsKICAgICAgICAgICAgdXJsc21hdGNoLnB1c2goLi4uKGV2ZW50LmNvbnRlbnQubWF0Y2godmlkZW9yZWdleCkgfHwgW10pKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICB1cmxzbWF0Y2ggPSB1cmxzbWF0Y2guZmlsdGVyKHVybCA9PiAhdXJscy5pbmNsdWRlcyh1cmwpKQoKICAgICAgICAgIGlmKHVybHNtYXRjaC5sZW5ndGggPiAwKXsKICAgICAgICAgICAgbmV3dXJscy5wdXNoKHsKICAgICAgICAgICAgICBldmVudDogZXZlbnQsCiAgICAgICAgICAgICAgdXJsczogdXJsc21hdGNoCiAgICAgICAgICAgIH0pCiAgICAgICAgICAgIAogICAgICAgICAgICB1cmxzLnB1c2goLi4udXJsc21hdGNoKQogICAgICAgICAgICBldmVudHB1YmtleXMuaW5jbHVkZXMoZXZlbnQucHVia2V5KSB8fCBldmVudHB1YmtleXMucHVzaChldmVudC5wdWJrZXkpCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGxvZygicXVlcnkgbWV0YSIsIHNvY2tldC51cmwpCiAgICAgICAgbGV0IG1ldGFldmVudHMgPSAocXVlcnltZXRhICYmIGF3YWl0IHF1ZXJ5ZXZlbnRzKHNvY2tldCwgWzBdLCBudWxsLCBldmVudHB1YmtleXMpIHx8IFtdKQogICAgICAgIAogICAgICAgIGZvcihsZXQgZW50cnkgb2YgbmV3dXJscyl7CiAgICAgICAgICBmb3IobGV0IHVybCBvZiBlbnRyeS51cmxzKXsKICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHsKICAgICAgICAgICAgICByZWFjdGVkOiByZWFjdGVkIHx8IGxpa2VzLmluY2x1ZGVzKGVudHJ5LmV2ZW50LmlkKSwgCiAgICAgICAgICAgICAgdXJsOiB1cmwsIAogICAgICAgICAgICAgIGV2ZW50OiBlbnRyeS5ldmVudCwgCiAgICAgICAgICAgICAgYmVjaDMyaWQ6IGJlY2gzMi5lbmNvZGUoIm5vdGUiLCBmcm9tSGV4U3RyaW5nKGVudHJ5LmV2ZW50LmlkKSksCiAgICAgICAgICAgICAgbWV0YTogbWV0YWV2ZW50cy5maW5kKG8gPT4gby5wdWJrZXkgPT0gZW50cnkuZXZlbnQucHVia2V5KQogICAgICAgICAgICB9KQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICBsb2coInNhdmUgcmVzIiwgcmVzdWx0cy5sZW5ndGgsIHNvY2tldC51cmwpCiAgICAgICAgdXBkYXRlY29udGVudChyZXN1bHRzLCBxLCBhcHBlbmQpCiAgICAgIH0KICAgICAgCiAgICAgIGxldCBsb2FkZWQgPSAwCiAgICAgIAogICAgICBmdW5jdGlvbiB1cGRhdGVjb250ZW50KHJlc3VsdHMsIHEsIGFwcGVuZCl7CiAgICAgICAgcmVzdWx0cy5yZXZlcnNlKCkuZm9yRWFjaChpdGVtID0+IHsKICAgICAgICAgIGNvbnN0IHR5cGUgPSBpdGVtLnVybC5tYXRjaCh2aWRlb2V4dHJlZ2V4KSAmJiAidmlkZW8iIHx8ICJpbWFnZSIKICAgICAgICAgIGNvbnN0IHRleHQgPSAocSB8fCAidmlldyBub3RlIikuc3Vic3RyaW5nKC0zMCkKICAgICAgICAgIGNvbnN0IGlkID0gIml0ZW1fIiArICgrK2lkY291bnRlcikKICAgICAgICAgIGNvbnN0IGNvbnRlbnRlbGVtZW50cyA9ICc8ZGl2IGNsYXNzPSJ0eXBlIj4nICsgcXMoIiN0ZW1wbGF0ZSAuIiArIHR5cGUgKyAic3ZnIikub3V0ZXJIVE1MICsgJzwvZGl2PjxhIGNsYXNzPSJsaWtlJyArIChpdGVtLnJlYWN0ZWQgPyAnIHJlYWN0ZWQnIDogJycpICsgJyIgZGF0YS1pdGVtLWlkPSInICsgaWQgKyAKICAgICAgICAgICAgJyIgaHJlZj0iIyI+JyArIHFzKCIjdGVtcGxhdGUgLmhlYXJ0c3ZnIikub3V0ZXJIVE1MICsgJzwvYT48YSBjbGFzcz0icXVlcnkiIGhyZWY9IicgKyBwcm90b2NvbCArIAogICAgICAgICAgICBpdGVtLmJlY2gzMmlkICsgJyI+JyArIHRleHQgKyAnPC9hPicKICAgICAgICAgIGxldCByb290ID0gbnVsbAogICAgICAgICAgbGV0IHYgPSBudWxsCiAgICAgICAgICAKICAgICAgICAgIGlmKGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpKXsKICAgICAgICAgICAgcm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpCiAgICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgidmlkZW8tY29udGFpbmVyIikKICAgICAgICAgICAgcm9vdC5pbm5lckhUTUwgPSBjb250ZW50ZWxlbWVudHMKICAgICAgICAgICAgCiAgICAgICAgICAgIHYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpCiAgICAgICAgICAgIHYuY2xhc3NMaXN0LmFkZCgic2hvdyIpCiAgICAgICAgICAgIHZbImRhdGEtaXRlbS1pZCJdID0gaWQKICAgICAgICAgICAgdi5wcmVsb2FkID0gIm5vbmUiCiAgICAgICAgICAgIHYubG9vcCA9IHRydWUKICAgICAgICAgICAgdi5wbGF5c2lubGluZSA9ICIiCiAgICAgICAgICAgIAogICAgICAgICAgICB2Lm9uY2FucGxheSA9IGFzeW5jIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIGNvbnN0IGFzcGVjdCA9IHRoaXMudmlkZW9XaWR0aCAvIHRoaXMudmlkZW9IZWlnaHQKICAgICAgICAgICAgICBpZihhc3BlY3QgPiAxKXsKICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUud2lkdGggPSAoYXNwZWN0ICogMTAwKSArICIlIgogICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgdGhpcy5zdHlsZS5oZWlnaHQgPSAoMSAvIGFzcGVjdCAqIDEwMCkgKyAiJSIKICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUubWFyZ2luVG9wID0gLSgoMSAvIGFzcGVjdCAqIDEwMCAtIDEwMCkgLyAyKSArICIlIgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAKICAgICAgICAgICAgICB1cGRhdGV2aWRlb3BsYXkodGhpcy5wYXJlbnRFbGVtZW50KQogICAgICAgICAgICB9CgogICAgICAgICAgICBjb25zdCBleHQgPSBpdGVtLnVybC5tYXRjaCh2aWRlb2V4dHJlZ2V4KVsxXQogICAgICAgICAgICB2LmlubmVySFRNTCA9ICc8c291cmNlIHNyYz0iJyArIGl0ZW0udXJsICsgJyIgdHlwZT0idmlkZW8vJyArIGV4dCArICciPjwvc291cmNlPicKICAgICAgICAgICAgCiAgICAgICAgICAgIHJvb3QuYXBwZW5kKHYpCiAgICAgICAgICB9ZWxzZSBpZihpdGVtLnVybC5tYXRjaChpbWdleHRyZWdleCkpewogICAgICAgICAgICByb290ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpCiAgICAgICAgICAgIHJvb3QuaHJlZiA9ICIjIgogICAgICAgICAgICByb290LmlubmVySFRNTCA9IGNvbnRlbnRlbGVtZW50cwogICAgICAgICAgICAgIAogICAgICAgICAgICBpZih0eXBlID09ICJpbWFnZSIpewogICAgICAgICAgICAgIC8vbGV0IGltZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpCiAgICAgICAgICAgICAgLy9pbWcuYWx0ID0gaXRlbS51cmwKICAgICAgICAgICAgICByb290WyJkYXRhLXNyYyJdID0gaXRlbS51cmwKICAgICAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoImltZyIpCiAgICAgICAgICAgICAgLy9pbWcuY2xhc3NMaXN0LmFkZCgiZGF0YSIpCiAgICAgICAgICAgICAgLy9yb290LmFwcGVuZChpbWcpCiAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgIHJvb3QuaW5uZXJIVE1MICs9ICc8c3BhbiBjbGFzcz0iZmlsZSI+JyArIGl0ZW0udXJsICsgJzwvc3Bhbj4nCiAgICAgICAgICAgIH0KICAgICAgICAgIH1lbHNlewogICAgICAgICAgICByZXR1cm4KICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgcm9vdC5pZCA9IGlkCiAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoJ3Zpc2libGUnKQogICAgICAgICAgcm9vdFsiZGF0YS1pdGVtIl0gPSBpdGVtCiAgICAgICAgICByb290WyJkYXRhLWV2ZW50Il0gPSBpdGVtLmV2ZW50CiAgICAgICAgICByb290WyJkYXRhLXF1ZXJ5Il0gPSBxCiAgICAgICAgICByb290WyJkYXRhLXRleHQiXSA9IHRleHQKICAgICAgICAgIAogICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKHR5cGUpCiAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoIml0ZW0iKQogICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJzaG93IikKICAgICAgICAgIAogICAgICAgICAgaWYoaXRlbS5yZWFjdGVkKXsKICAgICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgcXMoIiNpbWFnZXMiKVthcHBlbmQgJiYgImFwcGVuZCIgfHwgInByZXBlbmQiXShyb290KQogICAgICAgICAgCiAgICAgICAgICBpZih2KXsKICAgICAgICAgICAgdXBkYXRldmlkZW9wbGF5KHJvb3QpCiAgICAgICAgICB9CiAgICAgICAgfSkKCiAgICAgICAgdXBkYXRlaW1hZ2VzbG9hZCgpCiAgICAgICAgCiAgICAgICAgaWYoYWN0aXZlKCkgPT0gbnVsbCl7CiAgICAgICAgICBxcygiI2ltYWdlcyAuaXRlbSIpPy5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgIH0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gaGlkZW1lZGlhKCl7CiAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICJzY3JvbGwiCiAgICAgICAgcXNhKCIjbWVkaWEtY29udGFpbmVyLCAjaW1hZ2UsICNtZWRpYS1mb290ZXIiKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QucmVtb3ZlKCJ2aXNpYmxlIikpCiAgICAgICAgZ2lkKCJpbWFnZS1saWtlIikuY2xhc3NMaXN0LnJlbW92ZSgicmVhY3RlZCIpCiAgICAgICAgaGlkZXZpZGVvKCkKICAgICAgfQoKICAgICAgZnVuY3Rpb24gaGlkZXZpZGVvKCl7CiAgICAgICAgY29uc3QgdiA9IHFzKCIjbWVkaWEtY29udGFpbmVyIHZpZGVvIikKICAgICAgICAKICAgICAgICBpZih2KXsKICAgICAgICAgIHYubXV0ZWQgPSB0cnVlCiAgICAgICAgICB2LmNsYXNzTGlzdC5hZGQoInNob3ciKQogICAgICAgICAgZ2lkKHZbImRhdGEtaXRlbS1pZCJdKS5hcHBlbmRDaGlsZCh2KQogICAgICAgICAgdXBkYXRldmlkZW9wbGF5KHYucGFyZW50RWxlbWVudCkKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHdhaXRyZXMoa2V5LCB0eXBlKXsKICAgICAgICBsZXQgcmVzaGFuZGxlciA9IGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7CiAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlIHx8ICJFT1NFIgogICAgICAgICAgdGhpcy5ldmVudHMgPSBbXQogICAgICAgICAgdGhpcy5oYW5kbGUgPSBmdW5jdGlvbihyZXMpewogICAgICAgICAgICBsZXQgbyA9IEpTT04ucGFyc2UocmVzLmRhdGEpCiAgICAgICAgICAgIGlmKGtleSA9PSBudWxsIHx8IG9bMV0gPT0ga2V5KXsKICAgICAgICAgICAgICBpZihvWzBdID09IHRoaXMudHlwZSl7CiAgICAgICAgICAgICAgICByZXNvbHZlKFt0aGlzLmV2ZW50cywgb10pCiAgICAgICAgICAgICAgICByZXNoYW5kbGVycy5zcGxpY2UocmVzaGFuZGxlcnMuaW5kZXhPZih0aGlzKSwgMSkKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgdGhpcy5ldmVudHMucHVzaChvWzJdKQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgICAgICBsZXQgaGFuZGxlciA9IG5ldyByZXNoYW5kbGVyKHJlc29sdmUsIHJlamVjdCkKICAgICAgICAgIHJlc2hhbmRsZXJzLnB1c2goaGFuZGxlcikKICAgICAgICB9KQogICAgICB9CiAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gY2hlY2t1cGRhdGUoc29ja2V0KXsKICAgICAgICBjb25zdCB1cGRhdGVzcmVzID0gYXdhaXQgcXVlcnlwdWJrZXkoc29ja2V0LCB1cGRhdGVzcHVia2V5KQogICAgICAgIGNvbnN0IHVwZGF0ZW5vdGUgPSB1cGRhdGVzcmVzLmZpbmQobiA9PiBuLmNvbnRlbnQubWF0Y2goL15odHRwc1w6XC9cLy8pKQogICAgICAgIAogICAgICAgIGlmKCF1cGRhdGVub3RlKXsKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBhZ2UgPSBNYXRoLnJvdW5kKChEYXRlLm5vdygpIC8gMTAwMCAtIHVwZGF0ZW5vdGUuY3JlYXRlZF9hdCkgLyAzNjAwIC8gMjQpCiAgICAgICAgY29uc3Qgbm90ZWlkID0gYmVjaDMyLmVuY29kZSgibm90ZSIsIGZyb21IZXhTdHJpbmcodXBkYXRlbm90ZS5pZCkpCiAgICAgICAgcXMoIiNyZWxlYXNlIikuaHJlZiA9IHByb3RvY29sICsgbm90ZWlkCiAgICAgICAgcXMoIiNyZWxlYXNlIikuaW5uZXJUZXh0ID0gKGFnZSA9PSAwICYmICJ0b2RheSIgfHwgYWdlICsgIiBkYXkocykgYWdvIikKICAgICAgfQoKICAgICAgZnVuY3Rpb24gc2xlZXAobXMpewogICAgICAgIHJldHVybiBuZXcgZnVuY3Rpb24oKXsKICAgICAgICAgIGxldCB0aW1lb3V0ID0gbnVsbAogICAgICAgICAgbGV0IHIgPSBudWxsCiAgICAgICAgICAKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHByb21pc2U6IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7CiAgICAgICAgICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZSgpLCBtcykKICAgICAgICAgICAgICByID0gcmVzb2x2ZQogICAgICAgICAgICB9KSwKICAgICAgICAgICAgcmVzb2x2ZTogZnVuY3Rpb24oKXsKICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCkKICAgICAgICAgICAgICByKCkKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gc2hvdyhpZCl7CiAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICJoaWRkZW4iCiAgICAgICAgY29uc3QgaXRlbSA9IGdpZChpZClbImRhdGEtaXRlbSJdCiAgICAgICAgY29uc3QgbWVkaWEgPSBnaWQoIm1lZGlhLWNvbnRhaW5lciIpCiAgICAgICAgY29uc3QgaW1hZ2UgPSBnaWQoImltYWdlIikKCiAgICAgICAgaWYoaXRlbS51cmwubWF0Y2godmlkZW9leHRyZWdleCkpewogICAgICAgICAgaW1hZ2UuY2xhc3NMaXN0LnJlbW92ZSgidmlzaWJsZSIpCiAgICAgICAgICBjb25zdCB2ID0gZ2lkKGlkKS5xdWVyeVNlbGVjdG9yKCJ2aWRlbyIpCiAgICAgICAgICBxcygiI21lZGlhLWNvbnRhaW5lciIpLmFwcGVuZENoaWxkKHYpCiAgICAgICAgICB2Lm11dGVkID0gZmFsc2UKICAgICAgICAgIHYuY2xhc3NMaXN0LnJlbW92ZSgic2hvdyIpCiAgICAgICAgICB2LnBsYXkoKQogICAgICAgIH1lbHNlewogICAgICAgICAgaW1hZ2Uuc3JjID0gaXRlbS51cmwKICAgICAgICAgIGltYWdlLmNsYXNzTGlzdC5hZGQoInZpc2libGUiKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihpdGVtLm1ldGEpewogICAgICAgICAgY29uc3QgbWV0YWNvbnRlbnQgPSBKU09OLnBhcnNlKGl0ZW0ubWV0YS5jb250ZW50KQogICAgICAgICAgY29uc3QgbmFtZSA9IG1ldGFjb250ZW50LmRpc3BsYXlfbmFtZSB8fCBtZXRhY29udGVudC5uYW1lCiAgICAgICAgICBxcygiI2ltYWdlLXVzZXIiKS5jbGFzc0xpc3QuYWRkKCJ2aXNpYmxlIikKICAgICAgICAgIHFzKCIjaW1hZ2UtdXNlciIpLmhyZWYgPSBwcm90b2NvbCArIGJlY2gzMi5lbmNvZGUoIm5wdWIiLCBmcm9tSGV4U3RyaW5nKGl0ZW0ubWV0YS5wdWJrZXkpKQogICAgICAgICAgcXMoIiNpbWFnZS11c2VyIikuaW5uZXJUZXh0ID0gbmFtZQogICAgICAgIH1lbHNlewogICAgICAgICAgcXMoIiNpbWFnZS11c2VyIikuY2xhc3NMaXN0LnJlbW92ZSgidmlzaWJsZSIpCiAgICAgICAgfQoKICAgICAgICBnaWQoImltYWdlLWxpa2UiKVsiZGF0YS1pdGVtLWlkIl0gPSBpZAogICAgICAgIGdpZCgibWVkaWEtZm9vdGVyIilbImRhdGEtZXZlbnQiXSA9IGl0ZW0uZXZlbnQKCiAgICAgICAgaWYoaXRlbS5yZWFjdGVkKXsKICAgICAgICAgIGdpZCgiaW1hZ2UtbGlrZSIpLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBhID0gcXMoIiNpbWFnZS1xdWVyeSIpCiAgICAgICAgYS5ocmVmID0gcHJvdG9jb2wgKyBpdGVtLmJlY2gzMmlkCiAgICAgICAgYS5pbm5lclRleHQgPSBnaWQoaWQpWyJkYXRhLXRleHQiXQogICAgICAgIAogICAgICAgIGdpZCgibWVkaWEtY29udGFpbmVyIikuY2xhc3NMaXN0LmFkZCgidmlzaWJsZSIpCiAgICAgICAgZ2lkKCJtZWRpYS1mb290ZXIiKS5jbGFzc0xpc3QuYWRkKCJ2aXNpYmxlIikKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gY29ubmNvdW50KCl7CiAgICAgICAgcmV0dXJuIHNvY2tldHMuZmlsdGVyKHIgPT4gci5yZWFkeVN0YXRlID09IDEpLmxlbmd0aAogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBkaXNjb25uZWN0KCl7CiAgICAgICAgZm9yKGxldCBzb2NrZXQgb2Ygc29ja2V0cyl7CiAgICAgICAgICBzb2NrZXQuY2xvc2UoKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBzb2NrZXRzLnNwbGljZSgwKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBsb2cobXNnKXsKICAgICAgICBsZXQgc2Nyb2xsID0gcXMoIiNsb2dzIikuc2Nyb2xsVG9wID09IHFzKCIjbG9ncyIpLnNjcm9sbFRvcE1heAogICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpCiAgICAgICAgZGl2LmlubmVyVGV4dCA9IEFycmF5LmZyb20oYXJndW1lbnRzKS5qb2luKCIgIikKICAgICAgICBxcygiI2xvZ3MiKS5hcHBlbmQoZGl2KQogICAgICAgIAogICAgICAgIHNjcm9sbCAmJiBxcygiI2xvZ3MiKS5zY3JvbGxUbygwLCBxcygiI2xvZ3MiKS5zY3JvbGxUb3BNYXgpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGNvbm5lY3QodXJsKXsKICAgICAgICBsb2coImNvbm5lY3RpbmciLCB1cmwpCiAgICAgICAgbGV0IHNvY2tldCA9IG5ldyBXZWJTb2NrZXQodXJsKQogICAgICAgIAogICAgICAgIHNvY2tldC5vbm1lc3NhZ2UgPSBtZXNzYWdlID0+IHJlc2hhbmRsZXJzLmZvckVhY2gocmggPT4gcmguaGFuZGxlKG1lc3NhZ2UpKQogICAgICAgIAogICAgICAgIHNvY2tldC5vbmNsb3NlID0gYXN5bmMgZnVuY3Rpb24oKXsKICAgICAgICAgIHNvY2tldHMuc3BsaWNlKHNvY2tldHMuaW5kZXhPZihzb2NrZXQpLCAxKQogICAgICAgICAgcXMoIiNjb25uY291bnQiKS5pbm5lclRleHQgPSBjb25uY291bnQoKSArIChwcmltYWxzb2NrZXQgJiYgMSkKICAgICAgICAgIGxvZygiZGlzY29ubmVjdGVkIiwgdGhpcy51cmwsIGNvbm5jb3VudCgpKQogICAgICAgICAgYXdhaXQgc2xlZXAoMTAwMCkucHJvbWlzZQogICAgICAgICAgY29ubmVjdCh0aGlzLnVybCkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgc29ja2V0Lm9ub3BlbiA9IGZ1bmN0aW9uKCl7CiAgICAgICAgICBxcygiI2Nvbm5jb3VudCIpLmlubmVyVGV4dCA9IGNvbm5jb3VudCgpICsgKHByaW1hbHNvY2tldCAmJiAxKQogICAgICAgICAgbG9nKCJjb25uZWN0ZWQiLCB0aGlzLnVybCwgY29ubmNvdW50KCkpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybiBzb2NrZXQKICAgICAgfQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsIGFzeW5jICgpID0+IHsKICAgICAgICBwcmltYWxzb2NrZXQgPSBjb25uZWN0KCJ3c3M6Ly9jYWNoZTMucHJpbWFsLm5ldC9jYWNoZTE3IikKICAgICAgICBwcmltYWxzb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcigib3BlbiIsIGZ1bmN0aW9uKCl7CiAgICAgICAgICBwcmltYWxnbG9iYWwodGhpcykKICAgICAgICB9KQogICAgICAgIAogICAgICAgIHByaW1hbHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsIGZ1bmN0aW9uKCl7CiAgICAgICAgICBwcmltYWxzb2NrZXQgPSBudWxsCiAgICAgICAgfSkKICAgICAgICAKICAgICAgICBmb3IobGV0IHVybCBvZiByZWxheXMoKSl7CiAgICAgICAgICBjb25zdCBzb2NrZXQgPSBjb25uZWN0KHVybCkKICAgICAgICAgIHNvY2tldHMucHVzaChzb2NrZXQpCiAgICAgICAgICAKICAgICAgICAgIHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCJvcGVuIiwgZnVuY3Rpb24oKXsKICAgICAgICAgICAgY2hlY2t1cGRhdGUodGhpcykKICAgICAgICAgICAgcXVlcnkodGhpcykKICAgICAgICAgIH0pCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGF3YWl0IHNsZWVwKDEwMCkucHJvbWlzZQogICAgICAgIAogICAgICAgIGlmKGhhc2tleSgpKXsKICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgibm9zdHIiKQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGZvcihsZXQgYyBvZiBjb2xvcHRzKXsKICAgICAgICBkb2N1bWVudC53cml0ZSgnPHN0eWxlPicgKyBjb2xzY3NzLmlubmVyVGV4dC5yZXBsYWNlKC9cJFx7Y29sc1x9L2csIGMpICsgJzwvc3R5bGU+JykKICAgICAgfQogICAgPC9zY3JpcHQ+CiAgPC9ib2R5Pgo8L2h0bWw+Cg==

https://ipfs.io/ipfs/QmS26eZkADN5pLGowhxgc4grL7pkWtHRNwBrwiSsMCxrXn

sha256

c2809a2f10c0425807e03c56b8582da9efa10a47cdc5871d5a444703ff00a2ff files.html

base64

PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgdXNlci1zY2FsYWJsZT1ubyIvPgogICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL3N2Z2ljb25zLnNwYXJray5mci9zdmdpY29ucy5jc3MiLz4KICAgIDxzdHlsZT4KICAgICAgKiB7CiAgICAgICAgb3ZlcnNjcm9sbC1iZWhhdmlvci15OiBjb250YWluOwogICAgICB9CiAgICAgIAogICAgICBib2R5IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB3aWR0aDogMTAwdnc7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIGZvbnQtZmFtaWx5OiAiTm90byBTZXJpZiI7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXksIAogICAgICAjaGVhZGVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLAogICAgICAjbG9ncywgCiAgICAgICNwcml2a2V5IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMThlbTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLAogICAgICAjbG9ncyB7CiAgICAgICAgaGVpZ2h0OiA2ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNsb2dzIHsKICAgICAgICBoZWlnaHQ6IDhlbTsKICAgICAgICBvdmVyZmxvdzogc2Nyb2xsOwogICAgICAgIGZvbnQtc2l6ZTogLjhlbTsKICAgICAgfQogICAgICAKICAgICAgc2VsZWN0IHsKICAgICAgICB3aWR0aDogNGVtOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLCAKICAgICAgaW5wdXQuc3VibWl0IHsKICAgICAgICBib3JkZXItcmFkaXVzOiAuNWVtOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnlkaXNwbGF5IC50ZXh0LCAKICAgICAgI2hlYWRlciBhLAogICAgICAjbWVkaWEtY29udGFpbmVyIHsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQoKICAgICAgI2hlYWRlciBhLCAKICAgICAgZm9ybSwgCiAgICAgICNxdWVyeWRpc3BsYXkgewogICAgICAgIHotaW5kZXg6IDE7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CiAgICAgIAogICAgICBAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDMwZW0pIHsKICAgICAgICAjcXVlcnlkaXNwbGF5IHsKICAgICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgfQogICAgICB9CgogICAgICBmb3JtIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeSB7CiAgICAgICAgd2lkdGg6IDZlbTsKICAgICAgfQogICAgICAKICAgICAgI2xvYWRpbmcgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMHB4OwogICAgICAgIGxlZnQ6IDI3ZW07CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgIGEgewogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgfQoKICAgICAgdmlkZW8gewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogIAogICAgICAjbWVkaWEtY29udGFpbmVyIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgIGhlaWdodDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgIG1hcmdpbi10b3A6IDAgIWltcG9ydGFudDsKICAgICAgfQogICAgICAKICAgICAgLnR5cGUgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICB6LWluZGV4OiAxOwogICAgICB9CiAgICAgIAogICAgICAjaW1hZ2UtcXVlcnkgewogICAgICAgIHdpZHRoOiA1ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXksCiAgICAgIGEsCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgY29sb3I6ICM5OTk7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXkgewogICAgICAgIHBhZGRpbmc6IDAgMWVtOwogICAgICB9CgogICAgICAjcXVlcnlkaXNwbGF5IC50ZXh0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgbWluLXdpZHRoOiAzZW07CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgI2hlYWRlciBhLAogICAgICAjaGVhZGVyIHNwYW4gewogICAgICAgIHBhZGRpbmc6IDAuNWVtOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CgogICAgICAjaGVhZGVyIHsKICAgICAgICBwYWRkaW5nOiAwLjQ1ZW0gMDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CgogICAgICAjaGVhZGVyIC5pdGVtcyB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgLml0ZW1zIHsKICAgICAgICBtYXJnaW4tdG9wOiAuM2VtOwogICAgICB9CgogICAgICBwIHsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICB9CiAgICAgIAogICAgICAubGFiZWwgewogICAgICAgIHBhZGRpbmc6IC44ZW0gLjhlbSAuOGVtIDA7CiAgICAgIH0KCiAgICAgICNpbWFnZXMgLnF1ZXJ5IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KCiAgICAgICNtZWRpYS1jb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwKTsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHotaW5kZXg6IDQ7CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZS1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlIHsKICAgICAgICBtYXgtd2lkdGg6IDEwMHZ3OwogICAgICAgIG1heC1oZWlnaHQ6IDEwMHZoOwogICAgICB9CiAgICAgICAgCiAgICAgICNpbWFnZXMgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZXMgLml0ZW0gewogICAgICAgIHdpZHRoOiAyNXZ3OwogICAgICB9CgogICAgICAjaW1hZ2VzIC5pdGVtIHsKICAgICAgICBoZWlnaHQ6IDI1dnc7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgI21lZGlhLWNvbnRhaW5lciB2aWRlbyB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgfQogICAgICAKICAgICAgYm9keTpub3QoLm5vc3RyKSAjZmlsdGVyLWxpa2VzLCAKICAgICAgLmZpbHRlci1saWtlcyAjaW1hZ2VzID4gLml0ZW06bm90KC5yZWFjdGVkKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNpbWFnZS1xdWVyeSwKICAgICAgI2ltYWdlLXVzZXIgewogICAgICAgIHotaW5kZXg6IDI7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDN2dzsKICAgICAgfQogICAgICAKICAgICAgLnF1ZXJ5LCAKICAgICAgLmxpa2UgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBwYWRkaW5nOiAwIDF2dzsKICAgICAgfQogICAgICAKICAgICAgLnF1ZXJ5LCAKICAgICAgLmxpa2UsIAogICAgICAjaW1hZ2UtcXVlcnksIAogICAgICAudmlkZW9zdmcsCiAgICAgIC5pbWFnZXN2ZyB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjYpOwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNpbWFnZS1xdWVyeSB7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGZvbnQtc2l6ZTogbWluKDMuNXZ3LCAxLjVlbSk7CiAgICAgICAgbWF4LXdpZHRoOiA1ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZS1xdWVyeSB7CiAgICAgICAgcGFkZGluZzogLjZlbSAuNGVtIC4xZW0gLjRlbTsKICAgICAgICBtYXgtd2lkdGg6IDVlbTsKICAgICAgfQogICAgICAKICAgICAgLmxpa2UucmVhY3RlZCwKICAgICAgLmZpbHRlci1saWtlcyAjZmlsdGVyLWxpa2VzIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZWQ7CiAgICAgIH0KCiAgICAgICNpbWFnZS1xdWVyeSwKICAgICAgI2ltYWdlLXVzZXIgewogICAgICAgIGZvbnQtc2l6ZTogM2VtOwogICAgICB9CiAgICAgIAogICAgICAjaW1hZ2UtcXVlcnksCiAgICAgICNpbWFnZS11c2VyLAogICAgICAjbWVkaWEtZm9vdGVyIC5saWtlIHsKICAgICAgICB6LWluZGV4OiA1OwogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlLXF1ZXJ5LAogICAgICAjaW1hZ2UtdXNlciB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgICNpbWFnZS11c2VyIHsKICAgICAgICBib3R0b206IDEuOWVtOwogICAgICAgIGZvbnQtc2l6ZTogMS44ZW07CiAgICAgICAgcGFkZGluZy1yaWdodDogLjY1ZW07CiAgICAgICAgbWF4LXdpZHRoOiA4ZW07CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgIH0KICAgICAgCiAgICAgIC5saWtlIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IGF1dG87CiAgICAgICAgcGFkZGluZzogLjJlbTsKICAgICAgICB3aWR0aDogMWVtOwogICAgICAgIGhlaWdodDogMWVtOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5ub3N0ciAubGlrZSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7ICAKICAgICAgfQoKICAgICAgI21lZGlhLWZvb3RlciAubGlrZSB7CiAgICAgICAgZm9udC1zaXplOiAyLjRlbTsKICAgICAgfQoKICAgICAgI21lZGlhLWZvb3RlciB7CiAgICAgICAgZGlzcGxheTogbm9uZTsgIAogICAgICB9CiAgCiAgICAgICNpbWFnZXMgLmltZyB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIGJhY2tncm91bmQtc2l6ZTogY292ZXI7CiAgICAgICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIC5hY3RpdmUgewogICAgICAgIGJhY2tncm91bmQ6ICM0NDQ7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZXMgPiAuYWN0aXZlIHsKICAgICAgICBvdXRsaW5lOiAuM2VtIHNvbGlkIGdyZWVuOwogICAgICAgIHotaW5kZXg6IDE7CiAgICAgIH0KCiAgICAgIC5oZWFydHN2ZyBwYXRoLAogICAgICAuaGVhZGVyLWljb24gc3ZnIHBhdGggewogICAgICAgIHN0cm9rZTogI2ZmZjsKICAgICAgfQogIAogICAgICAudmlkZW9zdmcsCiAgICAgIC5pbWFnZXN2ZyB7CiAgICAgICAgd2lkdGg6IGNhbGMobWluKDR2dywgMmVtKSk7CiAgICAgICAgaGVpZ2h0OiBjYWxjKG1pbig0dncsIDJlbSkpOwogICAgICAgIHBhZGRpbmc6IDAgLjJlbTsKICAgICAgfQogICAgICAKICAgICAgLnZpZGVvc3ZnIHBhdGgsCiAgICAgIC5pbWFnZXN2ZyBwYXRoIHsKICAgICAgICBmaWxsOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICBhI21lbnUsIAogICAgICAuaGVhZGVyLWljb24gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG1hcmdpbi10b3A6IC0uM2VtOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgIH0KCiAgICAgIC5pY29ucyB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIHotaW5kZXg6IDI7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgfQogICAgICAKICAgICAgYSNtZW51IHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBwYWRkaW5nOiAwIC4zZW0gMCAuNWVtOwogICAgICAgIGhlaWdodDogMi4xZW07CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgLmhlYWRlci1pY29uIHsKICAgICAgICBwYWRkaW5nOiAuMmVtOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICB3aWR0aDogMS41ZW07CiAgICAgICAgaGVpZ2h0OiAxLjVlbTsKICAgICAgICBtYXJnaW46IC4xZW0gLjVlbTsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgIH0KICAgICAgCiAgICAgIC5oZWFkZXItaWNvbiBzdmcgewogICAgICAgIHdpZHRoOiAxLjVlbTsKICAgICAgICBoZWlnaHQ6IDEuNWVtOwogICAgICB9CiAgICAgICAKICAgICAgLm1lbnVzdmcgewogICAgICAgIHdpZHRoOiAyZW07CiAgICAgICAgaGVpZ2h0OiAyZW07CiAgICAgIH0KCiAgICAgIC5tZW51c3ZnIHBhdGggewogICAgICAgIGZpbGw6ICNmZmY7CiAgICAgIH0KCiAgICAgICNtZW51LWNvbnRlbnQgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgICB3aWR0aDogMThlbTsKICAgICAgICBtYXJnaW4tbGVmdDogLTE4ZW07CiAgICAgICAgYmFja2dyb3VuZDogIzIyMjsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgei1pbmRleDogMzsgCiAgICAgICAgb3ZlcmZsb3c6IHNjcm9sbDsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudC52aXNpYmxlIHsKICAgICAgICBtYXJnaW4tbGVmdDogMDsKICAgICAgfQogICAgICAKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgewogICAgICAgIHBhZGRpbmc6IDAgMWVtIDFlbSAxZW07CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIGEsCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgcGFkZGluZzogLjVlbSAuN2VtOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgICB9CgogICAgICAjb3ZlcmxheSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICB6LWluZGV4OiAzOwogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICBvcGFjaXR5OiAuNTsKICAgICAgfQoKICAgICAgLnZpc2libGUgewogICAgICAgIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgCiAgICAgICNzaGFyZS1kaWFsb2cgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHdpZHRoOiBjYWxjKDEwMHZ3IC0gNmVtKTsKICAgICAgICBoZWlnaHQ6IDUwJTsKICAgICAgICBiYWNrZ3JvdW5kOiAjZmZmOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDFlbTsKICAgICAgICB6LWluZGV4OiA0OwogICAgICAgIG1hcmdpbi1sZWZ0OiAyZW07CiAgICAgICAgbWFyZ2luLXRvcDogMmVtOwogICAgICAgIHBhZGRpbmc6IDFlbTsKICAgICAgfQogICAgICAKICAgICAgaDIgewogICAgICAgIG1hcmdpbi10b3A6IDA7CiAgICAgIH0KICAgICAgCiAgICAgIHN2ZyB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgICN0ZW1wbGF0ZSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8ZGl2IGlkPSJ0ZW1wbGF0ZSI+CiAgICAgIDxzdmcgY2xhc3M9ImhlYXJ0c3ZnIHN2Zy1pY29uIiB2aWV3Qm94PSIwIDAgMjAgMjAiPgogICAgICAgIDxwYXRoIGQ9Ik05LjcxOSwxNy4wNzNsLTYuNTYyLTYuNTFjLTAuMjctMC4yNjgtMC41MDQtMC41NjctMC42OTYtMC44ODhDMS4zODUsNy44OSwxLjY3LDUuNjEzLDMuMTU1LDQuMTRjMC44NjQtMC44NTYsMi4wMTItMS4zMjksMy4yMzMtMS4zMjljMS45MjQsMCwzLjExNSwxLjEyLDMuNjEyLDEuNzUyYzAuNDk5LTAuNjM0LDEuNjg5LTEuNzUyLDMuNjEyLTEuNzUyYzEuMjIxLDAsMi4zNjksMC40NzIsMy4yMzMsMS4zMjljMS40ODQsMS40NzMsMS43NzEsMy43NSwwLjY5Myw1LjUzN2MtMC4xOSwwLjMyLTAuNDI1LDAuNjE4LTAuNjk1LDAuODg3bC02LjU2Miw2LjUxQzEwLjEyNSwxNy4yMjksOS44NzUsMTcuMjI5LDkuNzE5LDE3LjA3MyBNNi4zODgsMy42MUM1LjM3OSwzLjYxLDQuNDMxLDQsMy43MTcsNC43MDdDMi40OTUsNS45MiwyLjI1OSw3Ljc5NCwzLjE0NSw5LjI2NWMwLjE1OCwwLjI2NSwwLjM1MSwwLjUxLDAuNTc0LDAuNzMxTDEwLDE2LjIyOGw2LjI4MS02LjIzMmMwLjIyNC0wLjIyMSwwLjQxNi0wLjQ2NiwwLjU3My0wLjcyOWMwLjg4Ny0xLjQ3MiwwLjY1MS0zLjM0Ni0wLjU3MS00LjU2QzE1LjU3LDQsMTQuNjIxLDMuNjEsMTMuNjEyLDMuNjFjLTEuNDMsMC0yLjYzOSwwLjc4Ni0zLjI2OCwxLjg2M2MtMC4xNTQsMC4yNjQtMC41MzYsMC4yNjQtMC42OSwwQzkuMDI5LDQuMzk3LDcuODIsMy42MSw2LjM4OCwzLjYxIj48L3BhdGg+CiAgICAgIDwvc3ZnPgogICAgICA8c3ZnIGNsYXNzPSJ2aWRlb3N2ZyBzdmctaWNvbiIgdmlld0JveD0iMCAwIDIwIDIwIj4KCQkJCTxwYXRoIGQ9Ik0xOC4xNzUsNC4xNDJIMS45NTFDMS43MDMsNC4xNDIsMS41LDQuMzQ0LDEuNSw0LjU5MnYxMC44MTZjMCwwLjI0NywwLjIwMywwLjQ1LDAuNDUxLDAuNDVoMTYuMjI0YzAuMjQ3LDAsMC40NS0wLjIwMywwLjQ1LTAuNDVWNC41OTJDMTguNjI1LDQuMzQ0LDE4LjQyMiw0LjE0MiwxOC4xNzUsNC4xNDIgTTQuNjU1LDE0Ljk1N0gyLjQwMXYtMS44MDNoMi4yNTNWMTQuOTU3ek00LjY1NSwxMi4yNTRIMi40MDF2LTEuODAzaDIuMjUzVjEyLjI1NHogTTQuNjU1LDkuNTQ5SDIuNDAxVjcuNzQ3aDIuMjUzVjkuNTQ5eiBNNC42NTUsNi44NDZIMi40MDFWNS4wNDNoMi4yNTNWNi44NDZ6TTE0LjU2OSwxNC45NTdINS41NTZWNS4wNDNoOS4wMTNWMTQuOTU3eiBNMTcuNzI0LDE0Ljk1N2gtMi4yNTN2LTEuODAzaDIuMjUzVjE0Ljk1N3ogTTE3LjcyNCwxMi4yNTRoLTIuMjUzdi0xLjgwM2gyLjI1M1YxMi4yNTR6TTE3LjcyNCw5LjU0OWgtMi4yNTNWNy43NDdoMi4yNTNWOS41NDl6IE0xNy43MjQsNi44NDZoLTIuMjUzVjUuMDQzaDIuMjUzVjYuODQ2eiI+PC9wYXRoPgoJCQk8L3N2Zz4KCQkJPHN2ZyBjbGFzcz0iaW1hZ2Vzdmcgc3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CgkJCQk8cGF0aCBkPSJNMTguNTU1LDE1LjM1NFY0LjU5MmMwLTAuMjQ4LTAuMjAyLTAuNDUxLTAuNDUtMC40NTFIMS44ODhjLTAuMjQ4LDAtMC40NTEsMC4yMDMtMC40NTEsMC40NTF2MTAuODA4YzAsMC41NTksMC43NTEsMC40NTEsMC40NTEsMC40NTFoMTYuMjE3aDAuMDA1QzE4Ljc5MywxNS44NTEsMTguNDc4LDE0LjgxNCwxOC41NTUsMTUuMzU0IE0yLjgsMTQuOTQ5bDQuOTQ0LTYuNDY0bDQuMTQ0LDUuNDE5YzAuMDAzLDAuMDAzLDAuMDAzLDAuMDAzLDAuMDAzLDAuMDA1bDAuNzk3LDEuMDRIMi44eiBNMTMuODIyLDE0Ljk0OWwtMS4wMDYtMS4zMTdsMS42ODktMi4yMThsMi42ODgsMy41MzVIMTMuODIyeiBNMTcuNjU0LDE0LjA2NGwtMi43OTEtMy42NjZjLTAuMTgxLTAuMjM3LTAuNTM1LTAuMjM3LTAuNzE2LDBsLTEuODk5LDIuNDkzbC00LjE0Ni01LjQyYy0wLjE4LTAuMjM3LTAuNTM2LTAuMjM3LTAuNzE2LDBsLTUuMDQ3LDYuNTk4VjUuMDQyaDE1LjMxNlYxNC4wNjR6IE0xMi40NzQsNi4zOTNjLTAuODY5LDAtMS41NzcsMC43MDctMS41NzcsMS41NzZzMC43MDgsMS41NzYsMS41NzcsMS41NzZzMS41NzctMC43MDcsMS41NzctMS41NzZTMTMuMzQzLDYuMzkzLDEyLjQ3NCw2LjM5MyBNMTIuNDc0LDguNjQ1Yy0wLjM3MSwwLTAuNjc2LTAuMzA0LTAuNjc2LTAuNjc2czAuMzA1LTAuNjc2LDAuNjc2LTAuNjc2YzAuMzcyLDAsMC42NzYsMC4zMDQsMC42NzYsMC42NzZTMTIuODQ2LDguNjQ1LDEyLjQ3NCw4LjY0NSI+PC9wYXRoPgoJCQk8L3N2Zz4KICAgICAgPGRpdiBpZD0iY29sc2NzcyI+CiAgICAgIC5jb2xzJHtjb2xzfSAjaW1hZ2VzIC5pdGVtIHsKICAgICAgICB3aWR0aDogY2FsYygxMDB2dyAvICR7Y29sc30pOwogICAgICB9CgogICAgICAuY29scyR7Y29sc30gI2ltYWdlcyAuaXRlbSB7CiAgICAgICAgaGVpZ2h0OiBjYWxjKDEwMHZ3IC8gJHtjb2xzfSk7CiAgICAgIH0KICAgICAgCiAgICAgIC5jb2xzJHtjb2xzfSAucXVlcnksCiAgICAgIC5jb2xzJHtjb2xzfSAubGlrZSB7CiAgICAgICAgZm9udC1zaXplOiBtaW4oMTR2dyAqICgxIC8gJHtjb2xzfSksIDZlbSAqICgxIC8gJHtjb2xzfSkpCiAgICAgIH0KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9InNoYXJlLWRpYWxvZyIgY2xhc3M9ImRpYWxvZyI+CiAgICAgIDxoMj5zaGFyZTwvaDI+CiAgICAgIDxmb3JtIGlkPSJzaGFyZS1mb3JtIiBhY3Rpb249IiMiPgogICAgICAgIDxwIGNsYXNzPSJjb250ZW50Ij48L3A+CiAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgY2xhc3M9InN1Ym1pdCIgdmFsdWU9Im9rIi8+CiAgICAgIDwvZm9ybT4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0ibWVkaWEtZm9vdGVyIj4KICAgICAgPGEgaWQ9ImltYWdlLWxpa2UiIGNsYXNzPSJsaWtlIiBocmVmPSIjIj48L2E+CiAgICAgIDxhIGlkPSJpbWFnZS1xdWVyeSIgaHJlZj0iIyI+PC9hPgogICAgICA8YSBpZD0iaW1hZ2UtdXNlciIgaHJlZj0iIyI+PC9hPgogICAgPC9kaXY+CiAgICA8Y2VudGVyIGlkPSJtZWRpYS1jb250YWluZXIiPgogICAgICA8ZGl2IGlkPSJpbWFnZS1jb250YWluZXIiPgogICAgICAgIDxpbWcgaWQ9ImltYWdlIi8+CiAgICAgIDwvZGl2PgogICAgPC9jZW50ZXI+CiAgICA8ZGl2IGlkPSJvdmVybGF5IiBjbGFzcz0iZGlhbG9nIj48L2Rpdj4KICAgIDxkaXYgaWQ9Im1lbnUtY29udGVudCIgY2xhc3M9ImRpYWxvZyI+CiAgICAgIDxkaXYgY2xhc3M9Iml0ZW1zIj4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+YXV0b3BsYXk8L2Rpdj4KICAgICAgICA8YSBjbGFzcz0ic2V0YXV0b3BsYXkiIGRhdGEtYXV0b3BsYXk9Im9uIiBocmVmPSIjIj5vbjwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0YXV0b3BsYXkiIGRhdGEtYXV0b3BsYXk9Im9mZiIgaHJlZj0iIyI+b2ZmPC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRhdXRvcGxheSIgZGF0YS1hdXRvcGxheT0iaG92ZXIiIGhyZWY9IiMiPm1vdXNlb3ZlcjwvYT4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+Y29sdW1uczwvZGl2PgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjEiIGhyZWY9IiMiPjE8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iMiIgaHJlZj0iIyI+MjwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSI0IiBocmVmPSIjIj40PC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjYiIGhyZWY9IiMiPjY8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iMTAiIGhyZWY9IiMiPjEwPC9hPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5jb25uZWN0aW9uczwvZGl2PgogICAgICAgIDxkaXYgaWQ9ImNvbm5jb3VudCI+MDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5yZWxheXM6PC9kaXY+CiAgICAgICAgPHA+UGxlYXNlIHVzZSByZWxheXMgd2l0aCBOSVAtNTAgKHNlYXJjaCkgZnVuY3Rpb25hbGl0eTwvcD4KICAgICAgICA8Zm9ybSBhY3Rpb249IiMiIGlkPSJyZWxheXMtZm9ybSI+CiAgICAgICAgICA8dGV4dGFyZWEgaWQ9InJlbGF5cyI+PC90ZXh0YXJlYT4KICAgICAgICAgIDxpbnB1dCBjbGFzcz0ic3VibWl0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJzYXZlIHJlbGF5cyIvPgogICAgICAgIDwvZm9ybT4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+cHJpdmF0ZSBrZXk6PC9kaXY+CiAgICAgICAgPHA+SWYgeW91IGNhbnQgdXNlIGJyb3dzZXIgYWRkb24gKG1vYmlsZSk8L3A+CiAgICAgICAgPGZvcm0gYWN0aW9uPSIjIiBpZD0icHJpdmtleS1mb3JtIj4KICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0icHJpdmtleSIvPgogICAgICAgICAgPGlucHV0IGNsYXNzPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9InNhdmUga2V5Ii8+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5sb2dzPC9kaXY+CiAgICAgICAgPGRpdiBpZD0ibG9ncyI+PC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmxhdGVzdCByZWxlYXNlOjwvZGl2PgogICAgICAgIDxhIGlkPSJyZWxlYXNlIiBocmVmPSIjIj48L2E+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJoZWFkZXIiPgogICAgICA8ZGl2IGNsYXNzPSJpY29ucyI+CiAgICAgICAgPGEgaWQ9ImZpbHRlci1saWtlcyIgaHJlZj0iIyIgY2xhc3M9ImhlYWRlci1pY29uIj48L2E+CiAgICAgICAgPGEgaWQ9InNoYXJlIiBocmVmPSIjIiBjbGFzcz0iaGVhZGVyLWljb24iPgogICAgICAgICAgPHN2ZyBjbGFzcz0ic3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CgkJCQkgICAgPHBhdGggZD0iTTE0LjY4LDEyLjYyMWMtMC45LDAtMS43MDIsMC40My0yLjIxNiwxLjA5bC00LjU0OS0yLjYzN2MwLjI4NC0wLjY5MSwwLjI4NC0xLjQ1NywwLTIuMTQ2bDQuNTQ5LTIuNjM4YzAuNTE0LDAuNjYxLDEuMzE1LDEuMDksMi4yMTYsMS4wOWMxLjU0OSwwLDIuODA5LTEuMjYsMi44MDktMi44MDhjMC0xLjU0OC0xLjI2LTIuODA5LTIuODA5LTIuODA5Yy0xLjU0OCwwLTIuODA4LDEuMjYtMi44MDgsMi44MDljMCwwLjM4LDAuMDc2LDAuNzQxLDAuMjE0LDEuMDczbC00LjU1LDIuNjM4Yy0wLjUxNS0wLjY2MS0xLjMxNi0xLjA5LTIuMjE3LTEuMDljLTEuNTQ4LDAtMi44MDgsMS4yNi0yLjgwOCwyLjgwOXMxLjI2LDIuODA4LDIuODA4LDIuODA4YzAuOSwwLDEuNzAyLTAuNDMsMi4yMTctMS4wOWw0LjU1LDIuNjM3Yy0wLjEzOCwwLjMzMi0wLjIxNCwwLjY5My0wLjIxNCwxLjA3NGMwLDEuNTQ5LDEuMjYsMi44MDksMi44MDgsMi44MDljMS41NDksMCwyLjgwOS0xLjI2LDIuODA5LTIuODA5UzE2LjIyOSwxMi42MjEsMTQuNjgsMTIuNjIxTTE0LjY4LDIuNTEyYzEuMTM2LDAsMi4wNiwwLjkyMywyLjA2LDIuMDZTMTUuODE1LDYuNjMsMTQuNjgsNi42M3MtMi4wNTktMC45MjMtMi4wNTktMi4wNTlTMTMuNTQ0LDIuNTEyLDE0LjY4LDIuNTEyTTUuMzE5LDEyLjA2MWMtMS4xMzYsMC0yLjA2LTAuOTI0LTIuMDYtMi4wNnMwLjkyMy0yLjA1OSwyLjA2LTIuMDU5YzEuMTM1LDAsMi4wNiwwLjkyMywyLjA2LDIuMDU5UzYuNDU0LDEyLjA2MSw1LjMxOSwxMi4wNjFNMTQuNjgsMTcuNDg4Yy0xLjEzNiwwLTIuMDU5LTAuOTIyLTIuMDU5LTIuMDU5czAuOTIzLTIuMDYxLDIuMDU5LTIuMDYxczIuMDYsMC45MjQsMi4wNiwyLjA2MVMxNS44MTUsMTcuNDg4LDE0LjY4LDE3LjQ4OCI+PC9wYXRoPgoJCQkgICAgPC9zdmc+CgkJCSAgPC9hPgoJCQk8L2Rpdj4KCQkJCiAgICAgIDxkaXYgY2xhc3M9Iml0ZW1zIj4KICAgICAgICA8YSBpZD0ibWVudSIgaHJlZj0iIyI+CiAgICAgICAgICA8c3ZnIGNsYXNzPSJtZW51c3ZnIHN2Zy1pY29uIiB2aWV3Qm94PSIwIDAgMjAgMjAiPgoJCSAgICAgICAgPHBhdGggZD0iTTEwLDEuNDQ1Yy00LjcyNiwwLTguNTU1LDMuODI5LTguNTU1LDguNTU1YzAsNC43MjUsMy44MjksOC41NTUsOC41NTUsOC41NTVjNC43MjUsMCw4LjU1NS0zLjgzLDguNTU1LTguNTU1QzE4LjU1NSw1LjI3NCwxNC43MjUsMS40NDUsMTAsMS40NDUgTTEwLDE3LjY1NGMtNC4yMjEsMC03LjY1NC0zLjQzNC03LjY1NC03LjY1NGMwLTQuMjIxLDMuNDMzLTcuNjU0LDcuNjU0LTcuNjU0YzQuMjIyLDAsNy42NTQsMy40MzMsNy42NTQsNy42NTRDMTcuNjU0LDE0LjIyMSwxNC4yMjIsMTcuNjU0LDEwLDE3LjY1NCBNMTQuMzksMTBjMCwwLjI0OC0wLjIwMywwLjQ1LTAuNDUsMC40NUg2LjA2Yy0wLjI0OCwwLTAuNDUtMC4yMDMtMC40NS0wLjQ1czAuMjAzLTAuNDUsMC40NS0wLjQ1aDcuODc5QzE0LjE4Nyw5LjU1LDE0LjM5LDkuNzUyLDE0LjM5LDEwIE0xNC4zOSwxMi43MDJjMCwwLjI0Ny0wLjIwMywwLjQ0OS0wLjQ1LDAuNDQ5SDYuMDZjLTAuMjQ4LDAtMC40NS0wLjIwMi0wLjQ1LTAuNDQ5YzAtMC4yNDgsMC4yMDMtMC40NTEsMC40NS0wLjQ1MWg3Ljg3OUMxNC4xODcsMTIuMjUxLDE0LjM5LDEyLjQ1NCwxNC4zOSwxMi43MDIgTTE0LjM5LDcuMjk4YzAsMC4yNDgtMC4yMDMsMC40NS0wLjQ1LDAuNDVINi4wNmMtMC4yNDgsMC0wLjQ1LTAuMjAzLTAuNDUtMC40NXMwLjIwMy0wLjQ1LDAuNDUtMC40NWg3Ljg3OUMxNC4xODcsNi44NDgsMTQuMzksNy4wNTEsMTQuMzksNy4yOTgiPjwvcGF0aD4KCSAgICAgICAgPC9zdmc+CiAgICAgICAgPC9hPgogICAgICAgIDxhIGlkPSJ0aXRsZSIgaHJlZj0iIyI+ZmlsZXMuaHRtbDwvYT4KICAgICAgICA8Zm9ybSBpZD0icXVlcnktZm9ybSIgYWN0aW9uPSIjIj4KICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0icXVlcnkiIG5hbWU9InF1ZXJ5IiBpZD0iIiAvPgogICAgICAgICAgPHNlbGVjdCBpZD0icXVlcnktdHlwZSI+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9ImFsbCI+YWxsPC9vcHRpb24+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9ImltYWdlIj5pbWFnZXM8L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0idmlkZW8iPnZpZGVvczwvb3B0aW9uPgogICAgICAgICAgPC9zZWxlY3Q+CiAgICAgICAgICA8aW5wdXQgaWQ9ImdvIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJnbyIvPgogICAgICAgIDwvZm9ybT4KICAgICAgICA8c3BhbiBpZD0icXVlcnlkaXNwbGF5Ij4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0ZXh0Ij48L3NwYW4+CiAgICAgICAgPC9zcGFuPgogICAgICAgIDxkaXYgaWQ9ImxvYWRpbmciPnVwZGF0aW5nPC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJpbWFnZXMiPjwvZGl2PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vdW5wa2cuY29tL25vc3RyLXRvb2xzL2xpYi9ub3N0ci5idW5kbGUuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vc2xvd2xpLmdpdGh1Yi5pby9iZWNoMzItYnVmZmVyL2Fzc2V0cy9qcy9iZWNoMzItYnVmZmVyLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0PgogICAgICBjb25zdCB1cGRhdGVzcHVia2V5ID0gImFlNWM2ZTBiNzQ2NjBkMjE5NGM4MjU0YjVjMmM4MjU2NzY1NzZiZTAyOTczNzlmYTIwNTIzMTE0YTZhODVlODciCiAgICAgIGNvbnN0IHF1ZXJpZXMgPSB7CiAgICAgICAgImdsb2JhbCI6ICdbIlJFUSIsIjxJPiIseyJjYWNoZSI6WyJleHBsb3JlIix7InRpbWVmcmFtZSI6ImxhdGVzdCIsInNjb3BlIjoiZ2xvYmFsIiwibGltaXQiOjxMPn1dfV0nLCAKICAgICAgICAiYXV0aG9yIjogJ1siUkVRIiwiPEk+Iix7ImtpbmRzIjpbMV0sImF1dGhvcnMiOlsiPFA+Il19XScsCiAgICAgICAgInJlYWN0aW9ucyI6ICdbIlJFUSIsIjxJPiIsIHsia2luZHMiOls3XSwiI2UiOiA8RT59XScKICAgICAgfQogICAgICBxcygiI3JlbGF5cyIpLnZhbHVlID0gcmVsYXlzKCkuam9pbigiXG4iKQogICAgICBxcygiI3ByaXZrZXkiKS52YWx1ZSA9IHByaXZrZXkoKQogICAgICBjb25zdCBjb2xvcHRzID0gWzEsIDIsIDQsIDYsIDEwXQoKICAgICAgY29scyA9ICgpID0+IHBhcnNlSW50KHNldHRpbmcoImNvbHMiLCBjb2xvcHRzWzFdKSwgMTApCiAgICAgIGF1dG9wbGF5ID0gKCkgPT4gc2V0dGluZygiYXV0b3BsYXkiLCAib2ZmIikKICAgICAgbGltaXQgPSAoKSA9PiBwYXJzZUludChzZXR0aW5nKCJsaW1pdCIsIDE1KSwgMTApCiAgICAgIGdhbGxlcnkgPSAoKSA9PiB7CiAgICAgICAgbGV0IGdhbGxlcnltYXRjaGVyID0gbG9jYXRpb24uc2VhcmNoLm1hdGNoKC9nYWxsZXJ5PShbYS16MC05XSspLykKICAgICAgICByZXR1cm4gZ2FsbGVyeW1hdGNoZXIgJiYgZ2FsbGVyeW1hdGNoZXJbMV0KICAgICAgfQogICAgICAKICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJjb2xzIiArIGNvbHMoKSkKCiAgICAgIGxldCBwcm90b2NvbCA9IG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS8pID8gIm5vc3RyOiIgOiAid2ViK25vc3RyOiIKICAgICAgbGV0IHNvY2tldHMgPSBbXQogICAgICBsZXQgcmVzaGFuZGxlcnMgPSBbXQogICAgICBsZXQgdXJscyA9IFtdCiAgICAgIGxldCBsaWtlcyA9IFtdCiAgICAgIGxldCBuZXdsaWtlcyA9IFtdCiAgICAgIGxldCBpZGNvdW50ZXIgPSAwCiAgICAgIGxldCBxdWVyeXdhaXQgPSBudWxsCiAgICAgIGxldCBwcmltYWxzb2NrZXQgPSBudWxsCiAgICAgIGxldCB0eXBlcyA9IHsKICAgICAgICBpbWFnZTogWyJwbmciLCAianBnIiwgImpwZWciLCAid2VicCJdLAogICAgICAgIHZpZGVvOiBbIm1wNCIsICJ3ZWJtIl0KICAgICAgfQogICAgICBsZXQgaW1ncmVnZXggPSAvaHR0cCh8cylcOlwvXC9bXiBcbl0qP1wuKHBuZ3xqcGd8anBlZ3x3ZWJwKS9naQogICAgICBsZXQgdmlkZW9yZWdleCA9IC9odHRwKHxzKVw6XC9cL1teIFxuXSo/XC4obXA0fHdlYm0pL2dpCiAgICAgIGxldCB2aWRlb2V4dHJlZ2V4ID0gL1wuKG1wNHx3ZWJtKSQvaQogICAgICBsZXQgaW1nZXh0cmVnZXggPSAvXC4ocG5nfGpwZ3xqcGVnfHdlYnApJC9pCiAgICAgIHdhaXRtcyA9IDUwMDAwCiAgICAgIHF1ZXJ5c3RyID0gIiIKICAgICAgbGV0IHF1ZXJ5Y291bnQgPSAwCiAgICAgIGxldCBob3ZlcmVkdmlkZW8gPSBudWxsCiAgICAgIAogICAgICB1cGRhdGVxdWVyeSgpCiAgICAgIHFzKCIjaW1hZ2UtbGlrZSIpLmlubmVySFRNTCA9IHFzKCIjZmlsdGVyLWxpa2VzIikuaW5uZXJIVE1MID0gcXMoIiN0ZW1wbGF0ZSAuaGVhcnRzdmciKS5vdXRlckhUTUwKICAgICAgc2V0YWN0aXZlKCJzZXRjb2xzIiwgImNvbHMiLCBjb2xzKCkpCiAgICAgIHNldGFjdGl2ZSgic2V0YXV0b3BsYXkiLCAiYXV0b3BsYXkiLCBhdXRvcGxheSgpKQogICAgICAKICAgICAgZnVuY3Rpb24gZnJvbUhleFN0cmluZyhzdHIpewogICAgICAgIGxldCBidWZmZXIgPSBuZXcgVWludDhBcnJheShzdHIubGVuZ3RoIC8gMikKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmZlci5sZW5ndGg7IGkrKykgewogICAgICAgICAgYnVmZmVyW2ldID0gcGFyc2VJbnQoc3RyLnN1YnN0cigyICogaSwgMiksIDE2KQogICAgICAgIH0KICAgICAgICByZXR1cm4gYnVmZmVyCiAgICAgIH0KICAKICAgICAgZnVuY3Rpb24gcmVsYXlzKCl7CiAgICAgICAgY29uc3Qgb2JqID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgicmVsYXlzIikpCiAgICAgICAgY29uc3QgciA9IG9iaiAmJiBvYmouZmlsdGVyKHIgPT4gci5tYXRjaCgvd3NzOlwvXC8uKy8pKSB8fCBbXQogICAgICAgIAogICAgICAgIHJldHVybiByLmxlbmd0aCA+IDAgJiYgciB8fCBbCiAgICAgICAgICAid3NzOi8vcmVsYXkubm9zdHIuYmFuZCIsCiAgICAgICAgICAid3NzOi8vbmIucmVsYXkuY2VudGVyIiwgCiAgICAgICAgICAid3NzOi8vbm9zdHIuY29tcGlsZS1lcnJvci5uZXQiCiAgICAgICAgXQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBwcml2a2V5KCl7CiAgICAgICAgbGV0IGtleSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJwcml2a2V5IikgfHwgIiIKICAgICAgICAKICAgICAgICBpZihrZXkubGVuZ3RoID09IDYzKXsKICAgICAgICAgIGtleSA9IE5vc3RyVG9vbHMubmlwMTkuZGVjb2RlKGtleSkuZGF0YQogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4ga2V5Lmxlbmd0aCA9PSA2NCAmJiBrZXkgfHwgbnVsbAogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBzZXR0aW5nKGtleSwgZGVmYXVsdHZhbHVlKXsKICAgICAgICBjb25zdCB2ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KQogICAgICAgIHJldHVybiB2ICYmIG9wdGlvbigic2V0IiArIGtleSwga2V5LCB2KSAmJiB2IHx8IGRlZmF1bHR2YWx1ZQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBvcHRpb24oYywga2V5LCB2YWwpewogICAgICAgIHJldHVybiBxcygiLiIgKyBjICsgIltkYXRhLSIgKyBrZXkgKyAiPSciICsgdmFsICsgIiddIikKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcXMocSl7CiAgICAgICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IocSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcXNhKHEpewogICAgICAgIHJldHVybiBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocSkpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGdpZChpKXsKICAgICAgICByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcXVlcnl0eXBlKCl7CiAgICAgICAgcmV0dXJuIHFzKCIjcXVlcnktdHlwZSIpLnZhbHVlIHx8ICJhbGwiCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZXF1ZXJ5KCl7CiAgICAgICAgbGV0IHBhcnRzID0gKGdhbGxlcnkoKSAmJiAoImc6IiArIGdhbGxlcnkoKSkgfHwgZGVjb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhhc2guc3Vic3RyaW5nKDEpKSkuc3BsaXQoIi8iKQogICAgICAgIHFzKCIjcXVlcnlkaXNwbGF5IC50ZXh0IikuaW5uZXJUZXh0ID0gcGFydHNbMF0uc3Vic3RyaW5nKDAsIDIwKQogICAgICAgIHF1ZXJ5c3RyID0gcGFydHNbMF0KICAgICAgICBxcygiI3F1ZXJ5IikudmFsdWUgPSBwYXJ0c1swXQogICAgICAgIHFzKCIjcXVlcnktdHlwZSIpLnZhbHVlID0gcGFydHNbMV0gfHwgImFsbCIKICAgICAgfQoKICAgICAgZnVuY3Rpb24gYWN0aXZlKCl7CiAgICAgICAgcmV0dXJuIHFzKCIjaW1hZ2VzIC5hY3RpdmUiKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBpbWFnZW9mZnNldChvZmZzZXQpewogICAgICAgIGNvbnN0IGltYWdlcyA9IHFzYSgiI2ltYWdlcyA+IC5pdGVtIikuZmlsdGVyKGUgPT4gZS5jbGFzc0xpc3QuY29udGFpbnMoInZpc2libGUiKSkKICAgICAgICByZXR1cm4gaW1hZ2VzW2ltYWdlcy5pbmRleE9mKGFjdGl2ZSgpKStvZmZzZXRdCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGxhc3RhY3RpdmUoKXsKICAgICAgICByZXR1cm4gcXNhKCIjaW1hZ2VzIC5hY3RpdmUiKS5wb3AoKSAgICAgIAogICAgICB9CgogICAgICBmdW5jdGlvbiBtZW51KCl7CiAgICAgICAgcXNhKCIjbWVudS1jb250ZW50LCAjb3ZlcmxheSIpLmZvckVhY2gobiA9PiBuLmNsYXNzTGlzdC50b2dnbGUoInZpc2libGUiKSkKICAgICAgfQogIAogICAgICBmdW5jdGlvbiBzZXRhY3RpdmUoYywga2V5LCB2YWwpewogICAgICAgIHFzYSgiLiIgKyBjKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKSkKICAgICAgICBjb25zdCBvcHRpb24gPSBxcygiLiIgKyBjICsgIltkYXRhLSIgKyBrZXkgKyAiPSciICsgdmFsICsgIiddIikKICAgICAgICBvcHRpb24/LmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHNjcm9sbHZpc2libGUobiwgb2Zmc2V0KXsKICAgICAgICBvZmZzZXQgPSBvZmZzZXQgfHwgMAogICAgICAgIHJldHVybiAobi5vZmZzZXRUb3AgKyBuLm9mZnNldEhlaWdodCkgPj0gKHNjcm9sbFkgLSBvZmZzZXQpCiAgICAgICAgICAmJiBuLm9mZnNldFRvcCA8PSAoc2Nyb2xsWSArIHZpc3VhbFZpZXdwb3J0LmhlaWdodCArIG9mZnNldCkKICAgICAgfQoKICAgICAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlaW1hZ2VzbG9hZCgpewogICAgICAgIHFzYSgiI2ltYWdlcyAuaXRlbS5pbWciKS5mb3JFYWNoKGFzeW5jIGltZyA9PiB7CiAgICAgICAgICBpZihzY3JvbGx2aXNpYmxlKGltZywgdmlzdWFsVmlld3BvcnQuaGVpZ2h0IC8gMikpewogICAgICAgICAgICBpbWcuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gInVybCgiICsgaW1nWyJkYXRhLXNyYyJdICsgIikiCiAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgaW1nLnN0eWxlLmJhY2tncm91bmRJbWFnZSA9ICIiCiAgICAgICAgICB9CiAgICAgICAgfSkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlYWxsdmlkZW9wbGF5KCl7CiAgICAgICAgcXNhKCIjaW1hZ2VzIC5pdGVtLnZpZGVvIikuZm9yRWFjaChhc3luYyBuID0+IHVwZGF0ZXZpZGVvcGxheShuKSkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gdXBkYXRldmlkZW9wbGF5KG4pewogICAgICAgIGNvbnN0IGFwbGF5ID0gYXV0b3BsYXkoKQogICAgICAgIGNvbnN0IHYgPSBuLnF1ZXJ5U2VsZWN0b3IoInZpZGVvIikKICAgICAgICAKICAgICAgICBpZihhcGxheSAhPSAib24iKXsKICAgICAgICAgIHYubXV0ZWQgPSBmYWxzZQogICAgICAgICAgdi5wYXVzZSgpCiAgICAgICAgfWVsc2V7CiAgICAgICAgICB2Lm11dGVkID0gdHJ1ZQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZighc2Nyb2xsdmlzaWJsZShuKSl7CiAgICAgICAgICBpZih2LnJlYWR5U3RhdGUgPT0gNCl7CiAgICAgICAgICAgIHYucGF1c2UoKQogICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIHYucHJlbG9hZCA9ICJub25lIgogICAgICAgICAgfQogICAgICAgIH1lbHNlIGlmKHYucmVhZHlTdGF0ZSAhPSA0KXsKICAgICAgICAgIHYucHJlbG9hZCA9ICJhdXRvIgogICAgICAgIH0KICAgICAgICBlbHNlIGlmKGFwbGF5ID09ICJvbiIgfHwgKGFwbGF5ID09ICJob3ZlciIgJiYgdiA9PSBob3ZlcmVkdmlkZW8pKXsKICAgICAgICAgIHYucGxheSgpCiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLCBlID0+IHsKICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpCiAgICAgICAgdXBkYXRlaW1hZ2VzbG9hZCgpCiAgICAgICAgdXBkYXRlYWxsdmlkZW9wbGF5KCkKICAgICAgfSkKICAgICAgCiAgICAgIGxldCB0b3VjaCA9IG51bGwKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLCBlID0+IHRvdWNoID0gZS5jaGFuZ2VkVG91Y2hlc1swXSkKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIiwgZSA9PiB7CiAgICAgICAgY29uc3QgeGRpZmYgPSBlLmNoYW5nZWRUb3VjaGVzWzBdLnNjcmVlblggLSB0b3VjaC5zY3JlZW5YCgogICAgICAgIGlmKHhkaWZmIDwgLTUwKXsKICAgICAgICAgIHN3aXBlKDEpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKHhkaWZmID4gNTApewogICAgICAgICAgc3dpcGUoLTEpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgcXMoIiNxdWVyeS1mb3JtIikuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgZSA9PiB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgd2luZG93Lmhpc3RvcnkucHVzaFN0YXRlKG51bGwsIG51bGwsIGxvY2F0aW9uLnBhdGhuYW1lKQogICAgICAgIGxvY2F0aW9uLmhhc2ggPSAiIyIgKyBlbmNvZGVVUklDb21wb25lbnQocXMoIiNxdWVyeSIpLnZhbHVlICsgIi8iICsgcXVlcnl0eXBlKCkpCiAgICAgICAgdXBkYXRlcXVlcnkoKQogICAgICAgIHF1ZXJ5d2FpdC5yZXNvbHZlKCkKICAgICAgfSkKCiAgICAgIHFzKCIjcmVsYXlzLWZvcm0iKS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLCBhc3luYyBlID0+IHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICBsZXQgciA9IEpTT04uc3RyaW5naWZ5KHFzKCIjcmVsYXlzIikudmFsdWUuc3BsaXQoIlxuIikpCiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oInJlbGF5cyIsIHIpCiAgICAgICAgZGlzY29ubmVjdCgpCiAgICAgIH0pCiAgICAgIAogICAgICBxcygiI3NoYXJlLWZvcm0iKS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLCBhc3luYyBlID0+IHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICAKICAgICAgICBpZihxcygiI3NoYXJlLWZvcm0gLnN1Ym1pdCIpLnZhbHVlID09ICJjbG9zZSIpewogICAgICAgICAgcXNhKCIuZGlhbG9nLnZpc2libGUiKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QucmVtb3ZlKCJ2aXNpYmxlIikpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QgZXZlbnRzID0gcXNhKCIjaW1hZ2VzIC5pdGVtIikuZmlsdGVyKG4gPT4gbi5vZmZzZXRQYXJlbnQpLm1hcChuID0+IG5bImRhdGEtZXZlbnQiXS5pZCkKICAgICAgICBjb25zdCBldmVudCA9IGF3YWl0IHB1Ymxpc2goewogICAgICAgICAgImtpbmQiOiAzMzMsCiAgICAgICAgICAiY29udGVudCI6IEpTT04uc3RyaW5naWZ5KGV2ZW50cyksCiAgICAgICAgICAidGFncyI6IFtdCiAgICAgICAgfSkKCiAgICAgICAgYXdhaXQgd2FpdHJlcyhudWxsLCAiT0siKQoKICAgICAgICBjb25zdCB1cmwgPSB3aW5kb3cubG9jYXRpb24ub3JpZ2luICsgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lCiAgICAgICAgCiAgICAgICAgY29uc3QgcHVibGlzaGVkZXZlbnQgPSBhd2FpdCBwdWJsaXNoKHsKICAgICAgICAgICJraW5kIjogMSwKICAgICAgICAgICJjb250ZW50IjogIlRoaXMgaXMgYSBnYWxsZXJ5IG9mICIgKyBldmVudHMubGVuZ3RoCiAgICAgICAgICAgICsgIiBpbWFnZXMvdmlkZW9zIHNoYXJlZCBmcm9tIGZpbGVzLmh0bWwuIENoZWNrIGl0IG91dCBoZXJlOiAiICsgdXJsICsgIj9nYWxsZXJ5PSIgKyBldmVudC5pZCwKICAgICAgICAgICJ0YWdzIjogWwogICAgICAgICAgICBbIiNlIiwgZXZlbnQuaWRdLCAKICAgICAgICAgICAgWyIjcCIsIGV2ZW50LnB1YmtleV0KICAgICAgICAgIF0KICAgICAgICB9KQoKICAgICAgICBhd2FpdCB3YWl0cmVzKG51bGwsICJPSyIpCiAgICAgICAgCiAgICAgICAgY29uc3QgYmVjaDMyaWQgPSBiZWNoMzIuZW5jb2RlKCJub3RlIiwgZnJvbUhleFN0cmluZyhwdWJsaXNoZWRldmVudC5pZCkpCiAgICAgICAgcXMoIiNzaGFyZS1mb3JtIC5jb250ZW50IikuaW5uZXJIVE1MID0gJ05vdGUgcHVibGlzaGVkIDxhIGhyZWY9IicgKyBwcm90b2NvbCArIGJlY2gzMmlkICsgJyI+JyArIGJlY2gzMmlkICsgJzwvYT4nCiAgICAgICAgcXMoIiNzaGFyZS1mb3JtIC5zdWJtaXQiKS52YWx1ZSA9ICJjbG9zZSIKICAgICAgfSkKCiAgICAgIHFzKCIjcHJpdmtleS1mb3JtIikuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgYXN5bmMgZSA9PiB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgY29uc3Qga2V5ID0gcXMoIiNwcml2a2V5IikudmFsdWUKCiAgICAgICAgaWYoa2V5Lmxlbmd0aCAhPSA2NCAmJiBrZXkubGVuZ3RoICE9IDYzKXsKICAgICAgICAgIGFsZXJ0KCJrZXkgc2hvdWxkIGJlIDYzIG9yIDY0IGNoYXJhY3RlcnMgbG9uZyIpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oInByaXZrZXkiLCBrZXkpCiAgICAgICAgYWxlcnQoImtleSBzYXZlZCIpCiAgICAgIH0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLCBhc3luYyAoZSkgPT4gewogICAgICAgIGlmKGF1dG9wbGF5KCkgPT0gImhvdmVyIiAmJiBlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInZpZGVvLWNvbnRhaW5lciIpKXsKICAgICAgICAgIGhvdmVyZWR2aWRlbyA9IGUudGFyZ2V0LnF1ZXJ5U2VsZWN0b3IoInZpZGVvIikKICAgICAgICAgIGhvdmVyZWR2aWRlby5wbGF5KCkKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgaG92ZXJlZHZpZGVvID0gZmFsc2UKICAgICAgICBpZighcXMoIiNtZWRpYS1jb250YWluZXIiKS5jbGFzc0xpc3QuY29udGFpbnMoInZpc2libGUiKSAmJiBhdXRvcGxheSgpID09ICJob3ZlciIgJiYgZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ2aWRlby1jb250YWluZXIiKSl7CiAgICAgICAgICBxc2EoInZpZGVvIikuZm9yRWFjaCh2ID0+IHYucGF1c2UoKSkKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgaWYoZS50YXJnZXQudHlwZSA9PSAic3VibWl0IiB8fCAoZS50YXJnZXQudGFnTmFtZSA9PSAiQSIgJiYgZS50YXJnZXQuaHJlZi5tYXRjaCgvXih8d2ViXCspbm9zdHJcOi8pKSl7CiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAKICAgICAgICBpZihlLnRhcmdldC5pZCA9PSAidGl0bGUiKXsKICAgICAgICAgIHFzKCIjcXVlcnkiKS52YWx1ZSA9ICIiCiAgICAgICAgICBxcygiI3F1ZXJ5LXR5cGUiKS52YWx1ZSA9ICJhbGwiCiAgICAgICAgICBxcygiI2dvIikuY2xpY2soKQogICAgICAgIH0KCiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCgogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJmaWx0ZXItbGlrZXMiKXsKICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnRvZ2dsZSgiZmlsdGVyLWxpa2VzIikKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLnRhcmdldC5pZCA9PSAic2hhcmUiKXsKICAgICAgICAgIGNvbnN0IGV2ZW50cyA9IHFzYSgiI2ltYWdlcyAuaXRlbSIpLmZpbHRlcihuID0+IG4ub2Zmc2V0UGFyZW50KS5tYXAobiA9PiBuWyJkYXRhLWV2ZW50Il0uaWQpCiAgICAgICAgICAvL2NvbnN0IHRleHQgPSB7dHlwZTogIiIsIGV2ZW50czogfQogICAgICAgICAgcXMoIiNzaGFyZS1kaWFsb2cgLmNvbnRlbnQiKS5pbm5lckhUTUwgPSAiPHA+U2hhcmUgbGluayB0byB0aGlzIGdhbGxlcnkgb2YgIiArIGV2ZW50cy5sZW5ndGggKyAiIGltYWdlcy92aWRlb3MgdG8geW91ciBub3N0ciBwcm9maWxlPzwvcD4iCiAgICAgICAgICBxcygiI3NoYXJlLWZvcm0gLnN1Ym1pdCIpLnZhbHVlID0gInB1Ymxpc2giCiAgICAgICAgICBxc2EoIiNzaGFyZS1kaWFsb2csICNvdmVybGF5IikuZm9yRWFjaChuID0+IG4uY2xhc3NMaXN0LnRvZ2dsZSgidmlzaWJsZSIpKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNob3ciKSl7CiAgICAgICAgICBhY3RpdmUoKT8uY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIGdpZChlLnRhcmdldC5pZCkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIHNob3coZS50YXJnZXQuaWQpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZS50YXJnZXQudGFnTmFtZSAhPSAiQSIgJiYgKHFzKCIjaW1hZ2UtY29udGFpbmVyIikgPT0gZS50YXJnZXQgfHwgcXMoIiNpbWFnZSIpID09IGUudGFyZ2V0IHx8IHFzKCIjbWVkaWEtY29udGFpbmVyIHZpZGVvIikgPT0gZS50YXJnZXQpKXsKICAgICAgICAgIGhpZGVtZWRpYSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJtZW51Iil7CiAgICAgICAgICBtZW51KCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gIm92ZXJsYXkiKXsKICAgICAgICAgIHFzYSgiLmRpYWxvZy52aXNpYmxlIikuZm9yRWFjaChuID0+IG4uY2xhc3NMaXN0LnJlbW92ZSgidmlzaWJsZSIpKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygic2V0Y29scyIpKXsKICAgICAgICAgIGZvcihsZXQgYyBvZiBjb2xvcHRzKXsKICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCJjb2xzIiArIGMpCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgiY29scyIgKyBlLnRhcmdldC5kYXRhc2V0LmNvbHMpCiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiY29scyIsIGUudGFyZ2V0LmRhdGFzZXQuY29scykKICAgICAgICAgIHNldGFjdGl2ZSgic2V0Y29scyIsICJjb2xzIiwgY29scygpKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogIAogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygic2V0YXV0b3BsYXkiKSl7CiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiYXV0b3BsYXkiLCBlLnRhcmdldC5kYXRhc2V0LmF1dG9wbGF5KQogICAgICAgICAgc2V0YWN0aXZlKCJzZXRhdXRvcGxheSIsICJhdXRvcGxheSIsIGF1dG9wbGF5KCkpCiAgICAgICAgICB1cGRhdGVhbGx2aWRlb3BsYXkoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygibGlrZSIpICYmIGxpa2UoZS50YXJnZXQpCiAgICAgIH0pCiAgICAgIAogICAgICBmdW5jdGlvbiBoYXNrZXkoKXsKICAgICAgICByZXR1cm4gd2luZG93Lm5vc3RyIHx8IHByaXZrZXkoKQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBwdWJrZXkoKXsKICAgICAgICByZXR1cm4gd2luZG93Lm5vc3RyICYmIGF3YWl0IHdpbmRvdy5ub3N0ci5nZXRQdWJsaWNLZXkoKSB8fCBOb3N0clRvb2xzLmdldFB1YmxpY0tleShwcml2a2V5KCkpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHNpZ24oZXZlbnQpewogICAgICAgIGlmKHdpbmRvdy5ub3N0cil7CiAgICAgICAgICByZXR1cm4gYXdhaXQgbm9zdHIuc2lnbkV2ZW50KGV2ZW50KQogICAgICAgIH0KICAgICAgICAKICAgICAgICBldmVudC5zaWcgPSBOb3N0clRvb2xzLmdldFNpZ25hdHVyZShldmVudCwgcHJpdmtleSgpKQogICAgICAgIHJldHVybiBldmVudAogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBsaWtlKGxpbmspewogICAgICAgIGNvbnN0IGV2ZW50ID0gbGluay5wYXJlbnRFbGVtZW50WyJkYXRhLWV2ZW50Il0KICAgICAgICAKICAgICAgICBhd2FpdCBwdWJsaXNoKHsKICAgICAgICAgICJraW5kIjogNywKICAgICAgICAgICJjb250ZW50IjogIisiLAogICAgICAgICAgInRhZ3MiOiBbCiAgICAgICAgICAgIFsiZSIsIGV2ZW50LmlkXSwKICAgICAgICAgICAgWyJwIiwgZXZlbnQucHVia2V5XQogICAgICAgICAgXQogICAgICAgIH0pCgogICAgICAgIGxpbmsuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCgogICAgICAgIGNvbnN0IGltYWdlaWQgPSBsaW5rWyJkYXRhLWl0ZW0taWQiXSB8fCBsaW5rLmRhdGFzZXQuaW1hZ2VJZAogICAgICAgIAogICAgICAgIGlmKGltYWdlaWQpewogICAgICAgICAgZ2lkKGltYWdlaWQpLnF1ZXJ5U2VsZWN0b3IoIi5saWtlIikuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCiAgICAgICAgfQogICAgICB9CgogICAgICBhc3luYyBmdW5jdGlvbiBwcmVwYXJlX2V2ZW50KGV2ZW50KXsKICAgICAgICBldmVudC5wdWJrZXkgPSBhd2FpdCBwdWJrZXkoKQogICAgICAgIGV2ZW50LmNyZWF0ZWRfYXQgPSBwYXJzZUludChEYXRlLm5vdygpIC8gMTAwMCwgMTApCiAgICAgICAgZXZlbnQuaWQgPSBOb3N0clRvb2xzLmdldEV2ZW50SGFzaChldmVudCkKICAgICAgICByZXR1cm4gZXZlbnQKICAgICAgfQogICAgICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHB1Ymxpc2goZXZlbnQpewogICAgICAgIGV2ZW50ID0gYXdhaXQgcHJlcGFyZV9ldmVudChldmVudCkKICAgICAgICBsZXQgc2lnbmVkZXZlbnQgPSBhd2FpdCBzaWduKGV2ZW50KQogICAgICAgIGxldCBqc29uID0gSlNPTi5zdHJpbmdpZnkoWyJFVkVOVCIsIHNpZ25lZGV2ZW50XSkKICAgICAgICBzb2NrZXRzLmZvckVhY2gocyA9PiBzLnNlbmQoanNvbikpCiAgICAgICAgCiAgICAgICAgcmV0dXJuIGV2ZW50CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHN3aXBlKG9mZnNldCl7CiAgICAgICAgaWYoaW1hZ2VvZmZzZXQob2Zmc2V0KSl7CiAgICAgICAgICBpbWFnZW9mZnNldChvZmZzZXQpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICB0aGlzW29mZnNldCA9PSAtMSAmJiAibGFzdGFjdGl2ZSIgfHwgImFjdGl2ZSJdKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIHVwZGF0ZXNob3coKQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gdXBkYXRlc2hvdygpewogICAgICAgIGlmKHFzKCIjbWVkaWEtY29udGFpbmVyIikuY2xhc3NMaXN0LmNvbnRhaW5zKCJ2aXNpYmxlIikpewogICAgICAgICAgaGlkZXZpZGVvKCkKICAgICAgICAgIHNob3coYWN0aXZlKCkuaWQpCiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgZSA9PiB7CiAgICAgICAgaWYoWyJUYWIiLCAiQXJyb3dMZWZ0IiwgIkFycm93UmlnaHQiLCAiQXJyb3dVcCIsICJBcnJvd0Rvd24iXS5pbmNsdWRlcyhlLmtleSkpewogICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiRXNjYXBlIil7CiAgICAgICAgICBtZW51KCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLmtleSA9PSAiRW50ZXIiICYmIGUudGFyZ2V0LnRhZ05hbWUgPT0gIkJPRFkiKXsKICAgICAgICAgIGlmKHFzKCIjbWVkaWEtY29udGFpbmVyIikuY2xhc3NMaXN0LmNvbnRhbnMoInZpc2libGUiKSl7CiAgICAgICAgICAgIGhpZGVtZWRpYSgpCiAgICAgICAgICAgIHJldHVybgogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBzaG93KGFjdGl2ZSgpLmlkKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dVcCIgJiYgaW1hZ2VvZmZzZXQoLWNvbHMoKSkpewogICAgICAgICAgaW1hZ2VvZmZzZXQoLWNvbHMoKSkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIGxhc3RhY3RpdmUoKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgICAgdXBkYXRlc2hvdygpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dEb3duIiAmJiBpbWFnZW9mZnNldChjb2xzKCkpKXsKICAgICAgICAgIGltYWdlb2Zmc2V0KGNvbHMoKSkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIGFjdGl2ZSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgICB1cGRhdGVzaG93KCkKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd0xlZnQiKXsKICAgICAgICAgIHN3aXBlKC0xKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93UmlnaHQiKXsKICAgICAgICAgIHN3aXBlKDEpCiAgICAgICAgfQogICAgICB9KQoKICAgICAgYXN5bmMgZnVuY3Rpb24gaGFuZGxlcXVlcnlyZXMocmVzLCBzb2NrZXQsIHEsIHR5cGUsIHN0aW1lKXsKICAgICAgICBzYXZlKHNvY2tldCwgcmVzLCBxLCB0eXBlLCBmYWxzZSwgZmFsc2UsIHRydWUpCiAgICAgICAgbG9nKCJxdWVyeSByZXMiLCByZXMubGVuZ3RoLCBzb2NrZXQudXJsKQogICAgICAgIHF1ZXJ5Y291bnQtLQogICAgICAgIGlmKHF1ZXJ5Y291bnQgPT0gMCl7CiAgICAgICAgICBxcygiI2xvYWRpbmciKS5jbGFzc0xpc3QucmVtb3ZlKCJ2aXNpYmxlIikKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbGV0IHdhaXQgPSB3YWl0bXMgLSAoRGF0ZS5ub3coKSAtIHN0aW1lKQogICAgICAgIHF1ZXJ5d2FpdCA9IHNsZWVwKHdhaXQpCiAgICAgICAgYXdhaXQgcXVlcnl3YWl0LnByb21pc2UKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcHJpbWFsZ2xvYmFsKHNvY2tldCl7CiAgICAgICAgbG9nKCJnbG9iYWwiLCBzb2NrZXQudXJsKQogICAgICAgIHF1ZXJ5Y291bnQrKwogICAgICAgIHFzKCIjbG9hZGluZyIpLmNsYXNzTGlzdC5hZGQoInZpc2libGUiKQogICAgICAgIGxldCBzdGltZSA9IERhdGUubm93KCkKICAgICAgICBsZXQgcWlkID0gImdsb2JhbF8iICsgKCsraWRjb3VudGVyKQogICAgICAgIGxldCBxaWRsaWtlcyA9ICJsaWtlc18iICsgKCsraWRjb3VudGVyKQoKICAgICAgICBpZihuZXdsaWtlcy5sZW5ndGggPiAwKXsKICAgICAgICAgIHByaW1hbHNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KFsKICAgICAgICAgICAgIlJFUSIsIAogICAgICAgICAgICBxaWRsaWtlcywgCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiY2FjaGUiOiBbCiAgICAgICAgICAgICAgICAiZXZlbnRzIiwgewogICAgICAgICAgICAgICAgICAiZXZlbnRfaWRzIjogbmV3bGlrZXMKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0KICAgICAgICAgIF0pKQoKICAgICAgICAgIGNvbnN0IGxpa2VfZXZlbnRzID0gKGF3YWl0IHdhaXRyZXMocWlkbGlrZXMpKVswXQogICAgICAgICAgbmV3bGlrZXMuc3BsaWNlKDApCiAgICAgICAgICAKICAgICAgICAgIGF3YWl0IHNhdmUoc29ja2V0LCBsaWtlX2V2ZW50cywgIiIsICJhbGwiLCB0cnVlLCB0cnVlLCBmYWxzZSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoWwogICAgICAgICAgIlJFUSIsIAogICAgICAgICAgcWlkLCAKICAgICAgICAgIHsKICAgICAgICAgICAgImNhY2hlIjogWwogICAgICAgICAgICAgICJleHBsb3JlIiwgCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInRpbWVmcmFtZSI6ICJsYXRlc3QiLAogICAgICAgICAgICAgICAgInNjb3BlIjogImdsb2JhbCIsCiAgICAgICAgICAgICAgICAibGltaXQiOiA1MAogICAgICAgICAgICAgIH0KICAgICAgICAgICAgXQogICAgICAgICAgfQogICAgICAgIF0pKQogICAgICAgIAogICAgICAgIGNvbnN0IHJlcyA9IChhd2FpdCB3YWl0cmVzKHFpZCkpWzBdCiAgICAgICAgYXdhaXQgaGFuZGxlcXVlcnlyZXMocmVzLmZpbHRlcihlID0+IGUua2luZCA9PSAxKSwgc29ja2V0LCAiIiwgImFsbCIsIHN0aW1lKQogICAgICAgIHByaW1hbGdsb2JhbChzb2NrZXQpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5KHNvY2tldCwgcHJpbWFsKXsKICAgICAgICBsb2coInF1ZXJ5Iiwgc29ja2V0LnVybCkKICAgICAgICBxdWVyeWNvdW50KysKICAgICAgICBxcygiI2xvYWRpbmciKS5jbGFzc0xpc3QuYWRkKCJ2aXNpYmxlIikKICAgICAgICAKICAgICAgICBsZXQgc3RpbWUgPSBEYXRlLm5vdygpCiAgICAgICAgbGV0IHEgPSBxdWVyeXN0ci50cmltKCkKICAgICAgICBsZXQgdHlwZSA9IHF1ZXJ5dHlwZSgpCiAgICAgICAgbGV0IGkgPSArK2lkY291bnRlcgogICAgICAgIGxldCBxaWQgPSAicXVlcnlfIiArIGkKICAgICAgICBjb25zdCBsaWtlc3JlcyA9IGF3YWl0IHF1ZXJ5bGlrZXMoc29ja2V0KQogICAgICAgIAogICAgICAgIGxpa2VzcmVzLmZvckVhY2goZXZlbnRpZCA9PiB7CiAgICAgICAgICBpZighbGlrZXMuaW5jbHVkZXMoZXZlbnRpZCkpewogICAgICAgICAgICBsaWtlcy5wdXNoKGV2ZW50aWQpCiAgICAgICAgICAgIG5ld2xpa2VzLnB1c2goZXZlbnRpZCkKICAgICAgICAgIH0KICAgICAgICB9KQogICAgICAgIAogICAgICAgIGxldCBnYWxsZXJ5bWF0Y2ggPSBxdWVyeXN0ci5tYXRjaCgvZzooW2EtejAtOV0rKS8pCiAgICAgICAgbGV0IHJlcyA9IG51bGwKICAgICAgICAKICAgICAgICBpZihnYWxsZXJ5bWF0Y2gpewogICAgICAgICAgY29uc3QgZ2FsbGVyeXJlcyA9IGF3YWl0IHF1ZXJ5ZXZlbnRzKHNvY2tldCwgWzMzM10sIFtnYWxsZXJ5bWF0Y2hbMV1dLCBudWxsKQogICAgICAgICAgY29uc3QgZXZlbnRpZHMgPSBKU09OLnBhcnNlKGdhbGxlcnlyZXNbMF0uY29udGVudCkKICAgICAgICAgIHJlcyA9IGF3YWl0IHF1ZXJ5ZXZlbnRzKHNvY2tldCwgWzFdLCBldmVudGlkcywgbnVsbCkKICAgICAgICB9ZWxzZXsKICAgICAgICAgIGxldCBmaWx0ZXJzID0gW10KCiAgICAgICAgICBmaWx0ZXJzLnB1c2goLi4uKHR5cGVzW3R5cGVdIHx8IFtdKS5tYXAoKHQpID0+IHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICBraW5kczogWzFdLCAKICAgICAgICAgICAgICBzZWFyY2g6ICIuIiArIHQsCiAgICAgICAgICAgICAgbGltaXQ6IDIwCiAgICAgICAgICAgIH0KICAgICAgICAgIH0pKQogICAgICAgICAgCiAgICAgICAgICBpZihxLmxlbmd0aCA+IDApewogICAgICAgICAgICBmaWx0ZXJzLnB1c2goe2tpbmRzOiBbMV0sIHNlYXJjaDogcX0pCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIGlmKGZpbHRlcnMubGVuZ3RoID09IDApewogICAgICAgICAgICBmaWx0ZXJzLnB1c2goe2tpbmRzOiBbMV19KQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBjb25zdCBzZWFyY2hvYmogPSBbIlJFUSIsIHFpZCwgLi4uZmlsdGVyc10KICAgICAgICAgIGNvbnN0IHNlYXJjaGpzb24gPSBKU09OLnN0cmluZ2lmeShzZWFyY2hvYmopCiAgICAgICAgICBzb2NrZXQuc2VuZChzZWFyY2hqc29uKQogICAgICAgICAgCiAgICAgICAgICByZXMgPSAoYXdhaXQgd2FpdHJlcyhxaWQpKVswXQogICAgICAgICAgCiAgICAgICAgICByZXMgPSByZXMuZmlsdGVyKG8gPT4gewogICAgICAgICAgICBpZihxLmxlbmd0aCA+IDApewogICAgICAgICAgICAgIGZvcihsZXQgd29yZCBvZiBxLnNwbGl0KCIgIikpewogICAgICAgICAgICAgICAgaWYoby5jb250ZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZih3b3JkLnRvTG93ZXJDYXNlKCkpID09IC0xKXsKICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZQogICAgICAgICAgfSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgYXdhaXQgaGFuZGxlcXVlcnlyZXMocmVzLCBzb2NrZXQsIHEsIHR5cGUsIHN0aW1lKQogICAgICAgIHF1ZXJ5KHNvY2tldCkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcXVlcnlsaWtlcyhzb2NrZXQpewogICAgICAgIGlmKCFoYXNrZXkoKSl7CiAgICAgICAgICByZXR1cm4gW10KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QgbXlwdWJrZXkgPSBhd2FpdCBwdWJrZXkoKQogICAgICAgIGNvbnN0IGV2ZW50cyA9IGF3YWl0IHF1ZXJ5ZXZlbnRzKHNvY2tldCwgWzddLCBudWxsLCBbbXlwdWJrZXldKQogICAgICAgIHJldHVybiBldmVudHMubWFwKGUgPT4gZS50YWdzLmZpbmQodCA9PiB0WzBdID09ICJlIilbMV0pCiAgICAgIH0KCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5ZXZlbnRzKHNvY2tldCwga2luZHMsIGV2ZW50aWRzLCBhdXRob3JzKXsKICAgICAgICBjb25zdCBxdWVyeWlkID0gImV2ZW50c18iICsgKCsraWRjb3VudGVyKQogICAgICAgIGNvbnN0IGZpbHRlcnMgPSB7fQogICAgICAgIAogICAgICAgIGZpbHRlcnMua2luZHMgPSBraW5kcwogICAgICAgIAogICAgICAgIGlmKGV2ZW50aWRzKXsKICAgICAgICAgIGZpbHRlcnNbImlkcyJdID0gZXZlbnRpZHMKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoYXV0aG9ycyl7CiAgICAgICAgICBmaWx0ZXJzWyJhdXRob3JzIl0gPSBhdXRob3JzCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeShbCiAgICAgICAgICAiUkVRIiwgCiAgICAgICAgICBxdWVyeWlkLCAKICAgICAgICAgIGZpbHRlcnMKICAgICAgICBdKQogICAgICAgIAogICAgICAgIHNvY2tldC5zZW5kKGpzb24pCiAgICAgICAgCiAgICAgICAgcmV0dXJuIChhd2FpdCB3YWl0cmVzKHF1ZXJ5aWQpKVswXSB8fCBbXQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeXB1YmtleShzb2NrZXQsIHB1YmspewogICAgICAgIGNvbnN0IHF1ZXJ5aWQgPSAicXVlcnlfIiArICgrK2lkY291bnRlcikKICAgICAgICBzb2NrZXQuc2VuZChxdWVyaWVzLmF1dGhvci5yZXBsYWNlKCI8ST4iLCBxdWVyeWlkKS5yZXBsYWNlKCI8UD4iLCBwdWJrKSkKCiAgICAgICAgcmV0dXJuIChhd2FpdCB3YWl0cmVzKHF1ZXJ5aWQpKVswXQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBzYXZlKHNvY2tldCwgZXZlbnRzLCBxLCBxdHlwZSwgcmVhY3RlZCwgYXBwZW5kLCBxdWVyeW1ldGEpewogICAgICAgIGxldCBldmVudHB1YmtleXMgPSBbXQogICAgICAgIGxldCByZXN1bHRzID0gW10KICAgICAgICBjb25zdCBldmVudGlkcyA9IGV2ZW50cy5tYXAoZSA9PiBlLmlkKQogICAgICAgIGxldCBuZXd1cmxzID0gW10KICAgICAgICAKICAgICAgICBmb3IobGV0IGV2ZW50IG9mIGV2ZW50cyl7CiAgICAgICAgICBsZXQgdXJsc21hdGNoID0gW10KICAgICAgICAgIAogICAgICAgICAgaWYocXR5cGUgIT0gInZpZGVvIil7CiAgICAgICAgICAgIHVybHNtYXRjaC5wdXNoKC4uLihldmVudC5jb250ZW50Lm1hdGNoKGltZ3JlZ2V4KSB8fCBbXSkpCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIGlmKHF0eXBlICE9ICJpbWFnZSIpewogICAgICAgICAgICB1cmxzbWF0Y2gucHVzaCguLi4oZXZlbnQuY29udGVudC5tYXRjaCh2aWRlb3JlZ2V4KSB8fCBbXSkpCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHVybHNtYXRjaCA9IHVybHNtYXRjaC5maWx0ZXIodXJsID0+ICF1cmxzLmluY2x1ZGVzKHVybCkpCgogICAgICAgICAgaWYodXJsc21hdGNoLmxlbmd0aCA+IDApewogICAgICAgICAgICBuZXd1cmxzLnB1c2goewogICAgICAgICAgICAgIGV2ZW50OiBldmVudCwKICAgICAgICAgICAgICB1cmxzOiB1cmxzbWF0Y2gKICAgICAgICAgICAgfSkKICAgICAgICAgICAgCiAgICAgICAgICAgIHVybHMucHVzaCguLi51cmxzbWF0Y2gpCiAgICAgICAgICAgIGV2ZW50cHVia2V5cy5pbmNsdWRlcyhldmVudC5wdWJrZXkpIHx8IGV2ZW50cHVia2V5cy5wdXNoKGV2ZW50LnB1YmtleSkKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbG9nKCJxdWVyeSBtZXRhIiwgc29ja2V0LnVybCkKICAgICAgICBsZXQgbWV0YWV2ZW50cyA9IChxdWVyeW1ldGEgJiYgYXdhaXQgcXVlcnlldmVudHMoc29ja2V0LCBbMF0sIG51bGwsIGV2ZW50cHVia2V5cykgfHwgW10pCiAgICAgICAgCiAgICAgICAgZm9yKGxldCBlbnRyeSBvZiBuZXd1cmxzKXsKICAgICAgICAgIGZvcihsZXQgdXJsIG9mIGVudHJ5LnVybHMpewogICAgICAgICAgICByZXN1bHRzLnB1c2goewogICAgICAgICAgICAgIHJlYWN0ZWQ6IHJlYWN0ZWQgfHwgbGlrZXMuaW5jbHVkZXMoZW50cnkuZXZlbnQuaWQpLCAKICAgICAgICAgICAgICB1cmw6IHVybCwgCiAgICAgICAgICAgICAgZXZlbnQ6IGVudHJ5LmV2ZW50LCAKICAgICAgICAgICAgICBiZWNoMzJpZDogYmVjaDMyLmVuY29kZSgibm90ZSIsIGZyb21IZXhTdHJpbmcoZW50cnkuZXZlbnQuaWQpKSwKICAgICAgICAgICAgICBtZXRhOiBtZXRhZXZlbnRzLmZpbmQobyA9PiBvLnB1YmtleSA9PSBlbnRyeS5ldmVudC5wdWJrZXkpCiAgICAgICAgICAgIH0pCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGxvZygic2F2ZSByZXMiLCByZXN1bHRzLmxlbmd0aCwgc29ja2V0LnVybCkKICAgICAgICB1cGRhdGVjb250ZW50KHJlc3VsdHMsIHEsIGFwcGVuZCkKICAgICAgfQogICAgICAKICAgICAgbGV0IGxvYWRlZCA9IDAKICAgICAgCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZWNvbnRlbnQocmVzdWx0cywgcSwgYXBwZW5kKXsKICAgICAgICByZXN1bHRzLnJldmVyc2UoKS5mb3JFYWNoKGl0ZW0gPT4gewogICAgICAgICAgY29uc3QgdHlwZSA9IGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpICYmICJ2aWRlbyIgfHwgImltYWdlIgogICAgICAgICAgY29uc3QgdGV4dCA9IChxIHx8ICJ2aWV3IG5vdGUiKS5zdWJzdHJpbmcoLTMwKQogICAgICAgICAgY29uc3QgaWQgPSAiaXRlbV8iICsgKCsraWRjb3VudGVyKQogICAgICAgICAgY29uc3QgY29udGVudGVsZW1lbnRzID0gJzxkaXYgY2xhc3M9InR5cGUiPicgKyBxcygiI3RlbXBsYXRlIC4iICsgdHlwZSArICJzdmciKS5vdXRlckhUTUwgKyAnPC9kaXY+PGEgY2xhc3M9Imxpa2UnICsgKGl0ZW0ucmVhY3RlZCA/ICcgcmVhY3RlZCcgOiAnJykgKyAnIiBkYXRhLWl0ZW0taWQ9IicgKyBpZCArIAogICAgICAgICAgICAnIiBocmVmPSIjIj4nICsgcXMoIiN0ZW1wbGF0ZSAuaGVhcnRzdmciKS5vdXRlckhUTUwgKyAnPC9hPjxhIGNsYXNzPSJxdWVyeSIgaHJlZj0iJyArIHByb3RvY29sICsgCiAgICAgICAgICAgIGl0ZW0uYmVjaDMyaWQgKyAnIj4nICsgdGV4dCArICc8L2E+JwogICAgICAgICAgbGV0IHJvb3QgPSBudWxsCiAgICAgICAgICBsZXQgdiA9IG51bGwKICAgICAgICAgIAogICAgICAgICAgaWYoaXRlbS51cmwubWF0Y2godmlkZW9leHRyZWdleCkpewogICAgICAgICAgICByb290ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikKICAgICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJ2aWRlby1jb250YWluZXIiKQogICAgICAgICAgICByb290LmlubmVySFRNTCA9IGNvbnRlbnRlbGVtZW50cwogICAgICAgICAgICAKICAgICAgICAgICAgdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIikKICAgICAgICAgICAgdlsiZGF0YS1pdGVtLWlkIl0gPSBpZAogICAgICAgICAgICB2LnByZWxvYWQgPSAibm9uZSIKICAgICAgICAgICAgdi5sb29wID0gdHJ1ZQogICAgICAgICAgICB2LnBsYXlzaW5saW5lID0gIiIKICAgICAgICAgICAgCiAgICAgICAgICAgIHYub25jYW5wbGF5ID0gYXN5bmMgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgY29uc3QgYXNwZWN0ID0gdGhpcy52aWRlb1dpZHRoIC8gdGhpcy52aWRlb0hlaWdodAogICAgICAgICAgICAgIGlmKGFzcGVjdCA+IDEpewogICAgICAgICAgICAgICAgdGhpcy5zdHlsZS53aWR0aCA9IChhc3BlY3QgKiAxMDApICsgIiUiCiAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlLmhlaWdodCA9ICgxIC8gYXNwZWN0ICogMTAwKSArICIlIgogICAgICAgICAgICAgICAgdGhpcy5zdHlsZS5tYXJnaW5Ub3AgPSAtKCgxIC8gYXNwZWN0ICogMTAwIC0gMTAwKSAvIDIpICsgIiUiCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIAogICAgICAgICAgICAgIHVwZGF0ZXZpZGVvcGxheSh0aGlzLnBhcmVudEVsZW1lbnQpCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNvbnN0IGV4dCA9IGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpWzFdCiAgICAgICAgICAgIHYuaW5uZXJIVE1MID0gJzxzb3VyY2Ugc3JjPSInICsgaXRlbS51cmwgKyAnIiB0eXBlPSJ2aWRlby8nICsgZXh0ICsgJyI+PC9zb3VyY2U+JwogICAgICAgICAgICAKICAgICAgICAgICAgcm9vdC5hcHBlbmQodikKICAgICAgICAgIH1lbHNlIGlmKGl0ZW0udXJsLm1hdGNoKGltZ2V4dHJlZ2V4KSl7CiAgICAgICAgICAgIHJvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIikKICAgICAgICAgICAgcm9vdC5ocmVmID0gIiMiCiAgICAgICAgICAgIHJvb3QuaW5uZXJIVE1MID0gY29udGVudGVsZW1lbnRzCiAgICAgICAgICAgICAgCiAgICAgICAgICAgIGlmKHR5cGUgPT0gImltYWdlIil7CiAgICAgICAgICAgICAgLy9sZXQgaW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIikKICAgICAgICAgICAgICAvL2ltZy5hbHQgPSBpdGVtLnVybAogICAgICAgICAgICAgIHJvb3RbImRhdGEtc3JjIl0gPSBpdGVtLnVybAogICAgICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgiaW1nIikKICAgICAgICAgICAgICAvL2ltZy5jbGFzc0xpc3QuYWRkKCJkYXRhIikKICAgICAgICAgICAgICAvL3Jvb3QuYXBwZW5kKGltZykKICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgcm9vdC5pbm5lckhUTUwgKz0gJzxzcGFuIGNsYXNzPSJmaWxlIj4nICsgaXRlbS51cmwgKyAnPC9zcGFuPicKICAgICAgICAgICAgfQogICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIHJldHVybgogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICByb290LmlkID0gaWQKICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgndmlzaWJsZScpCiAgICAgICAgICByb290WyJkYXRhLWl0ZW0iXSA9IGl0ZW0KICAgICAgICAgIHJvb3RbImRhdGEtZXZlbnQiXSA9IGl0ZW0uZXZlbnQKICAgICAgICAgIHJvb3RbImRhdGEtcXVlcnkiXSA9IHEKICAgICAgICAgIHJvb3RbImRhdGEtdGV4dCJdID0gdGV4dAogICAgICAgICAgCiAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQodHlwZSkKICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgiaXRlbSIpCiAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoInNob3ciKQogICAgICAgICAgCiAgICAgICAgICBpZihpdGVtLnJlYWN0ZWQpewogICAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBxcygiI2ltYWdlcyIpW2FwcGVuZCAmJiAiYXBwZW5kIiB8fCAicHJlcGVuZCJdKHJvb3QpCiAgICAgICAgICAKICAgICAgICAgIGlmKHYpewogICAgICAgICAgICB1cGRhdGV2aWRlb3BsYXkocm9vdCkKICAgICAgICAgIH0KICAgICAgICB9KQoKICAgICAgICB1cGRhdGVpbWFnZXNsb2FkKCkKICAgICAgICAKICAgICAgICBpZihhY3RpdmUoKSA9PSBudWxsKXsKICAgICAgICAgIHFzKCIjaW1hZ2VzIC5pdGVtIik/LmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgfQogICAgICB9CgogICAgICBmdW5jdGlvbiBoaWRlbWVkaWEoKXsKICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gInNjcm9sbCIKICAgICAgICBxc2EoIiNtZWRpYS1jb250YWluZXIsICNpbWFnZSwgI21lZGlhLWZvb3RlciIpLmZvckVhY2gobiA9PiBuLmNsYXNzTGlzdC5yZW1vdmUoInZpc2libGUiKSkKICAgICAgICBnaWQoImltYWdlLWxpa2UiKS5jbGFzc0xpc3QucmVtb3ZlKCJyZWFjdGVkIikKICAgICAgICBoaWRldmlkZW8oKQogICAgICB9CgogICAgICBmdW5jdGlvbiBoaWRldmlkZW8oKXsKICAgICAgICBjb25zdCB2ID0gcXMoIiNtZWRpYS1jb250YWluZXIgdmlkZW8iKQogICAgICAgIAogICAgICAgIGlmKHYpewogICAgICAgICAgdi5tdXRlZCA9IHRydWUKICAgICAgICAgIGdpZCh2WyJkYXRhLWl0ZW0taWQiXSkuYXBwZW5kQ2hpbGQodikKICAgICAgICAgIHVwZGF0ZXZpZGVvcGxheSh2LnBhcmVudEVsZW1lbnQpCiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiB3YWl0cmVzKGtleSwgdHlwZSl7CiAgICAgICAgbGV0IHJlc2hhbmRsZXIgPSBmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpewogICAgICAgICAgdGhpcy50eXBlID0gdHlwZSB8fCAiRU9TRSIKICAgICAgICAgIHRoaXMuZXZlbnRzID0gW10KICAgICAgICAgIHRoaXMuaGFuZGxlID0gZnVuY3Rpb24ocmVzKXsKICAgICAgICAgICAgbGV0IG8gPSBKU09OLnBhcnNlKHJlcy5kYXRhKQogICAgICAgICAgICBpZihrZXkgPT0gbnVsbCB8fCBvWzFdID09IGtleSl7CiAgICAgICAgICAgICAgaWYob1swXSA9PSB0aGlzLnR5cGUpewogICAgICAgICAgICAgICAgcmVzb2x2ZShbdGhpcy5ldmVudHMsIG9dKQogICAgICAgICAgICAgICAgcmVzaGFuZGxlcnMuc3BsaWNlKHJlc2hhbmRsZXJzLmluZGV4T2YodGhpcyksIDEpCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIHRoaXMuZXZlbnRzLnB1c2gob1syXSkKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gewogICAgICAgICAgbGV0IGhhbmRsZXIgPSBuZXcgcmVzaGFuZGxlcihyZXNvbHZlLCByZWplY3QpCiAgICAgICAgICByZXNoYW5kbGVycy5wdXNoKGhhbmRsZXIpCiAgICAgICAgfSkKICAgICAgfQogICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGNoZWNrdXBkYXRlKHNvY2tldCl7CiAgICAgICAgY29uc3QgdXBkYXRlc3JlcyA9IGF3YWl0IHF1ZXJ5cHVia2V5KHNvY2tldCwgdXBkYXRlc3B1YmtleSkKICAgICAgICBjb25zdCB1cGRhdGVub3RlID0gdXBkYXRlc3Jlcy5maW5kKG4gPT4gbi5jb250ZW50Lm1hdGNoKC9eaHR0cHNcOlwvXC8vKSkKICAgICAgICAKICAgICAgICBpZighdXBkYXRlbm90ZSl7CiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QgYWdlID0gTWF0aC5yb3VuZCgoRGF0ZS5ub3coKSAvIDEwMDAgLSB1cGRhdGVub3RlLmNyZWF0ZWRfYXQpIC8gMzYwMCAvIDI0KQogICAgICAgIGNvbnN0IG5vdGVpZCA9IGJlY2gzMi5lbmNvZGUoIm5vdGUiLCBmcm9tSGV4U3RyaW5nKHVwZGF0ZW5vdGUuaWQpKQogICAgICAgIHFzKCIjcmVsZWFzZSIpLmhyZWYgPSBwcm90b2NvbCArIG5vdGVpZAogICAgICAgIHFzKCIjcmVsZWFzZSIpLmlubmVyVGV4dCA9IChhZ2UgPT0gMCAmJiAidG9kYXkiIHx8IGFnZSArICIgZGF5KHMpIGFnbyIpCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHNsZWVwKG1zKXsKICAgICAgICByZXR1cm4gbmV3IGZ1bmN0aW9uKCl7CiAgICAgICAgICBsZXQgdGltZW91dCA9IG51bGwKICAgICAgICAgIGxldCByID0gbnVsbAogICAgICAgICAgCiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICBwcm9taXNlOiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpewogICAgICAgICAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHJlc29sdmUoKSwgbXMpCiAgICAgICAgICAgICAgciA9IHJlc29sdmUKICAgICAgICAgICAgfSksCiAgICAgICAgICAgIHJlc29sdmU6IGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpCiAgICAgICAgICAgICAgcigpCiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHNob3coaWQpewogICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAiaGlkZGVuIgogICAgICAgIGNvbnN0IGl0ZW0gPSBnaWQoaWQpWyJkYXRhLWl0ZW0iXQogICAgICAgIGNvbnN0IG1lZGlhID0gZ2lkKCJtZWRpYS1jb250YWluZXIiKQogICAgICAgIGNvbnN0IGltYWdlID0gZ2lkKCJpbWFnZSIpCgogICAgICAgIGlmKGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpKXsKICAgICAgICAgIGltYWdlLmNsYXNzTGlzdC5yZW1vdmUoInZpc2libGUiKQogICAgICAgICAgY29uc3QgdiA9IGdpZChpZCkucXVlcnlTZWxlY3RvcigidmlkZW8iKQogICAgICAgICAgcXMoIiNtZWRpYS1jb250YWluZXIiKS5hcHBlbmRDaGlsZCh2KQogICAgICAgICAgdi5tdXRlZCA9IGZhbHNlCiAgICAgICAgICB2LnBsYXkoKQogICAgICAgIH1lbHNlewogICAgICAgICAgaW1hZ2Uuc3JjID0gaXRlbS51cmwKICAgICAgICAgIGltYWdlLmNsYXNzTGlzdC5hZGQoInZpc2libGUiKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihpdGVtLm1ldGEpewogICAgICAgICAgY29uc3QgbWV0YWNvbnRlbnQgPSBKU09OLnBhcnNlKGl0ZW0ubWV0YS5jb250ZW50KQogICAgICAgICAgY29uc3QgbmFtZSA9IG1ldGFjb250ZW50LmRpc3BsYXlfbmFtZSB8fCBtZXRhY29udGVudC5uYW1lCiAgICAgICAgICBxcygiI2ltYWdlLXVzZXIiKS5jbGFzc0xpc3QuYWRkKCJ2aXNpYmxlIikKICAgICAgICAgIHFzKCIjaW1hZ2UtdXNlciIpLmhyZWYgPSBwcm90b2NvbCArIGJlY2gzMi5lbmNvZGUoIm5wdWIiLCBmcm9tSGV4U3RyaW5nKGl0ZW0ubWV0YS5wdWJrZXkpKQogICAgICAgICAgcXMoIiNpbWFnZS11c2VyIikuaW5uZXJUZXh0ID0gbmFtZQogICAgICAgIH1lbHNlewogICAgICAgICAgcXMoIiNpbWFnZS11c2VyIikuY2xhc3NMaXN0LnJlbW92ZSgidmlzaWJsZSIpCiAgICAgICAgfQoKICAgICAgICBnaWQoImltYWdlLWxpa2UiKVsiZGF0YS1pdGVtLWlkIl0gPSBpZAogICAgICAgIGdpZCgibWVkaWEtZm9vdGVyIilbImRhdGEtZXZlbnQiXSA9IGl0ZW0uZXZlbnQKCiAgICAgICAgaWYoaXRlbS5yZWFjdGVkKXsKICAgICAgICAgIGdpZCgiaW1hZ2UtbGlrZSIpLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBhID0gcXMoIiNpbWFnZS1xdWVyeSIpCiAgICAgICAgYS5ocmVmID0gcHJvdG9jb2wgKyBpdGVtLmJlY2gzMmlkCiAgICAgICAgYS5pbm5lclRleHQgPSBnaWQoaWQpWyJkYXRhLXRleHQiXQogICAgICAgIAogICAgICAgIGdpZCgibWVkaWEtY29udGFpbmVyIikuY2xhc3NMaXN0LmFkZCgidmlzaWJsZSIpCiAgICAgICAgZ2lkKCJtZWRpYS1mb290ZXIiKS5jbGFzc0xpc3QuYWRkKCJ2aXNpYmxlIikKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gY29ubmNvdW50KCl7CiAgICAgICAgcmV0dXJuIHNvY2tldHMuZmlsdGVyKHIgPT4gci5yZWFkeVN0YXRlID09IDEpLmxlbmd0aAogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBkaXNjb25uZWN0KCl7CiAgICAgICAgZm9yKGxldCBzb2NrZXQgb2Ygc29ja2V0cyl7CiAgICAgICAgICBzb2NrZXQuY2xvc2UoKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBzb2NrZXRzLnNwbGljZSgwKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBsb2cobXNnKXsKICAgICAgICBsZXQgc2Nyb2xsID0gcXMoIiNsb2dzIikuc2Nyb2xsVG9wID09IHFzKCIjbG9ncyIpLnNjcm9sbFRvcE1heAogICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpCiAgICAgICAgZGl2LmlubmVyVGV4dCA9IEFycmF5LmZyb20oYXJndW1lbnRzKS5qb2luKCIgIikKICAgICAgICBxcygiI2xvZ3MiKS5hcHBlbmQoZGl2KQogICAgICAgIAogICAgICAgIHNjcm9sbCAmJiBxcygiI2xvZ3MiKS5zY3JvbGxUbygwLCBxcygiI2xvZ3MiKS5zY3JvbGxUb3BNYXgpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGNvbm5lY3QodXJsKXsKICAgICAgICBsb2coImNvbm5lY3RpbmciLCB1cmwpCiAgICAgICAgbGV0IHNvY2tldCA9IG5ldyBXZWJTb2NrZXQodXJsKQogICAgICAgIAogICAgICAgIHNvY2tldC5vbm1lc3NhZ2UgPSBtZXNzYWdlID0+IHJlc2hhbmRsZXJzLmZvckVhY2gocmggPT4gcmguaGFuZGxlKG1lc3NhZ2UpKQogICAgICAgIAogICAgICAgIHNvY2tldC5vbmNsb3NlID0gYXN5bmMgZnVuY3Rpb24oKXsKICAgICAgICAgIHNvY2tldHMuc3BsaWNlKHNvY2tldHMuaW5kZXhPZihzb2NrZXQpLCAxKQogICAgICAgICAgcXMoIiNjb25uY291bnQiKS5pbm5lclRleHQgPSBjb25uY291bnQoKSArIChwcmltYWxzb2NrZXQgJiYgMSkKICAgICAgICAgIGxvZygiZGlzY29ubmVjdGVkIiwgdGhpcy51cmwsIGNvbm5jb3VudCgpKQogICAgICAgICAgYXdhaXQgc2xlZXAoMTAwMCkucHJvbWlzZQogICAgICAgICAgY29ubmVjdCh0aGlzLnVybCkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgc29ja2V0Lm9ub3BlbiA9IGZ1bmN0aW9uKCl7CiAgICAgICAgICBxcygiI2Nvbm5jb3VudCIpLmlubmVyVGV4dCA9IGNvbm5jb3VudCgpICsgKHByaW1hbHNvY2tldCAmJiAxKQogICAgICAgICAgbG9nKCJjb25uZWN0ZWQiLCB0aGlzLnVybCwgY29ubmNvdW50KCkpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybiBzb2NrZXQKICAgICAgfQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsIGFzeW5jICgpID0+IHsKICAgICAgICBwcmltYWxzb2NrZXQgPSBjb25uZWN0KCJ3c3M6Ly9jYWNoZTMucHJpbWFsLm5ldC9jYWNoZTE3IikKICAgICAgICBwcmltYWxzb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcigib3BlbiIsIGZ1bmN0aW9uKCl7CiAgICAgICAgICBwcmltYWxnbG9iYWwodGhpcykKICAgICAgICB9KQogICAgICAgIAogICAgICAgIHByaW1hbHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsIGZ1bmN0aW9uKCl7CiAgICAgICAgICBwcmltYWxzb2NrZXQgPSBudWxsCiAgICAgICAgfSkKICAgICAgICAKICAgICAgICBmb3IobGV0IHVybCBvZiByZWxheXMoKSl7CiAgICAgICAgICBjb25zdCBzb2NrZXQgPSBjb25uZWN0KHVybCkKICAgICAgICAgIHNvY2tldHMucHVzaChzb2NrZXQpCiAgICAgICAgICAKICAgICAgICAgIHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCJvcGVuIiwgZnVuY3Rpb24oKXsKICAgICAgICAgICAgY2hlY2t1cGRhdGUodGhpcykKICAgICAgICAgICAgcXVlcnkodGhpcykKICAgICAgICAgIH0pCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGF3YWl0IHNsZWVwKDEwMCkucHJvbWlzZQogICAgICAgIAogICAgICAgIGlmKGhhc2tleSgpKXsKICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgibm9zdHIiKQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGZvcihsZXQgYyBvZiBjb2xvcHRzKXsKICAgICAgICBkb2N1bWVudC53cml0ZSgnPHN0eWxlPicgKyBjb2xzY3NzLmlubmVyVGV4dC5yZXBsYWNlKC9cJFx7Y29sc1x9L2csIGMpICsgJzwvc3R5bGU+JykKICAgICAgfQogICAgPC9zY3JpcHQ+CiAgPC9ib2R5Pgo8L2h0bWw+Cg==

https://ipfs.io/ipfs/QmfKJoMgUSYAnVS436Xv9du9YkL3dgg47RUhj57TYNx7Cs

sha256

1d1d51dc66b208869d78fbae1ef7b68599488d45a7ad80d80ddf397b8c4e2b65 files.html

base64

PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgdXNlci1zY2FsYWJsZT1ubyIvPgogICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL3N2Z2ljb25zLnNwYXJray5mci9zdmdpY29ucy5jc3MiLz4KICAgIDxzdHlsZT4KICAgICAgKiB7CiAgICAgICAgb3ZlcnNjcm9sbC1iZWhhdmlvci15OiBjb250YWluOwogICAgICB9CiAgICAgIAogICAgICBib2R5IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB3aWR0aDogMTAwdnc7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIGZvbnQtZmFtaWx5OiAiTm90byBTZXJpZiI7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXksIAogICAgICAjaGVhZGVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLAogICAgICAjbG9ncywgCiAgICAgICNwcml2a2V5IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMThlbTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLAogICAgICAjbG9ncyB7CiAgICAgICAgaGVpZ2h0OiA2ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNsb2dzIHsKICAgICAgICBoZWlnaHQ6IDhlbTsKICAgICAgICBvdmVyZmxvdzogc2Nyb2xsOwogICAgICAgIGZvbnQtc2l6ZTogLjhlbTsKICAgICAgfQogICAgICAKICAgICAgc2VsZWN0IHsKICAgICAgICB3aWR0aDogNGVtOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLCAKICAgICAgaW5wdXQuc3VibWl0IHsKICAgICAgICBib3JkZXItcmFkaXVzOiAuNWVtOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnlkaXNwbGF5IC50ZXh0LCAKICAgICAgI2hlYWRlciBhLAogICAgICAjbWVkaWEtY29udGFpbmVyIHsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQoKICAgICAgI2hlYWRlciBhLCAKICAgICAgZm9ybSwgCiAgICAgICNxdWVyeWRpc3BsYXkgewogICAgICAgIHotaW5kZXg6IDE7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CiAgICAgIAogICAgICBAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDMwZW0pIHsKICAgICAgICAjcXVlcnlkaXNwbGF5IHsKICAgICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgfQogICAgICB9CgogICAgICBmb3JtIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeSB7CiAgICAgICAgd2lkdGg6IDZlbTsKICAgICAgfQogICAgICAKICAgICAgI2xvYWRpbmcgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMHB4OwogICAgICAgIGxlZnQ6IDI3ZW07CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgIGEgewogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgfQoKICAgICAgdmlkZW8gewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogIAogICAgICAjbWVkaWEtY29udGFpbmVyIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgIGhlaWdodDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgIG1hcmdpbi10b3A6IDAgIWltcG9ydGFudDsKICAgICAgfQogICAgICAKICAgICAgLnR5cGUgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICB6LWluZGV4OiAxOwogICAgICB9CiAgICAgIAogICAgICAjaW1hZ2UtcXVlcnkgewogICAgICAgIHdpZHRoOiA1ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXksCiAgICAgIGEsCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgY29sb3I6ICM5OTk7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXkgewogICAgICAgIHBhZGRpbmc6IDAgMWVtOwogICAgICB9CgogICAgICAjcXVlcnlkaXNwbGF5IC50ZXh0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgbWluLXdpZHRoOiAzZW07CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgI2hlYWRlciBhLAogICAgICAjaGVhZGVyIHNwYW4gewogICAgICAgIHBhZGRpbmc6IDAuNWVtOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CgogICAgICAjaGVhZGVyIHsKICAgICAgICBwYWRkaW5nOiAwLjQ1ZW0gMDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CgogICAgICAjaGVhZGVyIC5pdGVtcyB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgLml0ZW1zIHsKICAgICAgICBtYXJnaW4tdG9wOiAuM2VtOwogICAgICB9CgogICAgICBwIHsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICB9CiAgICAgIAogICAgICAubGFiZWwgewogICAgICAgIHBhZGRpbmc6IC44ZW0gLjhlbSAuOGVtIDA7CiAgICAgIH0KCiAgICAgICNpbWFnZXMgLnF1ZXJ5IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KCiAgICAgICNtZWRpYS1jb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwKTsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHotaW5kZXg6IDQ7CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZS1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlIHsKICAgICAgICBtYXgtd2lkdGg6IDEwMHZ3OwogICAgICAgIG1heC1oZWlnaHQ6IDEwMHZoOwogICAgICB9CiAgICAgICAgCiAgICAgICNpbWFnZXMgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZXMgLml0ZW0gewogICAgICAgIHdpZHRoOiAyNXZ3OwogICAgICB9CgogICAgICAjaW1hZ2VzIC5pdGVtIHsKICAgICAgICBoZWlnaHQ6IDI1dnc7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgI21lZGlhLWNvbnRhaW5lciB2aWRlbyB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgfQogICAgICAKICAgICAgYm9keTpub3QoLm5vc3RyKSAjZmlsdGVyLWxpa2VzLCAKICAgICAgLmZpbHRlci1saWtlcyAjaW1hZ2VzID4gLml0ZW06bm90KC5yZWFjdGVkKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNpbWFnZS1xdWVyeSwKICAgICAgI2ltYWdlLXVzZXIgewogICAgICAgIHotaW5kZXg6IDI7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDN2dzsKICAgICAgfQogICAgICAKICAgICAgLnF1ZXJ5LCAKICAgICAgLmxpa2UgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBwYWRkaW5nOiAwIDF2dzsKICAgICAgfQogICAgICAKICAgICAgLnF1ZXJ5LCAKICAgICAgLmxpa2UsIAogICAgICAjaW1hZ2UtcXVlcnksIAogICAgICAudmlkZW9zdmcsCiAgICAgIC5pbWFnZXN2ZyB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjYpOwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNpbWFnZS1xdWVyeSB7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGZvbnQtc2l6ZTogbWluKDMuNXZ3LCAxLjVlbSk7CiAgICAgICAgbWF4LXdpZHRoOiA1ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZS1xdWVyeSB7CiAgICAgICAgcGFkZGluZzogLjZlbSAuNGVtIC4xZW0gLjRlbTsKICAgICAgICBtYXgtd2lkdGg6IDVlbTsKICAgICAgfQogICAgICAKICAgICAgLmxpa2UucmVhY3RlZCwKICAgICAgLmZpbHRlci1saWtlcyAjZmlsdGVyLWxpa2VzIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZWQ7CiAgICAgIH0KCiAgICAgICNpbWFnZS1xdWVyeSwKICAgICAgI2ltYWdlLXVzZXIgewogICAgICAgIGZvbnQtc2l6ZTogM2VtOwogICAgICB9CiAgICAgIAogICAgICAjaW1hZ2UtcXVlcnksCiAgICAgICNpbWFnZS11c2VyLAogICAgICAjbWVkaWEtZm9vdGVyIC5saWtlIHsKICAgICAgICB6LWluZGV4OiA1OwogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlLXF1ZXJ5LAogICAgICAjaW1hZ2UtdXNlciB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgICNpbWFnZS11c2VyIHsKICAgICAgICBib3R0b206IDEuOWVtOwogICAgICAgIGZvbnQtc2l6ZTogMS44ZW07CiAgICAgICAgcGFkZGluZy1yaWdodDogLjY1ZW07CiAgICAgICAgbWF4LXdpZHRoOiA4ZW07CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgIH0KICAgICAgCiAgICAgIC5saWtlIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IGF1dG87CiAgICAgICAgcGFkZGluZzogLjJlbTsKICAgICAgICB3aWR0aDogMWVtOwogICAgICAgIGhlaWdodDogMWVtOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5ub3N0ciAubGlrZSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7ICAKICAgICAgfQoKICAgICAgI21lZGlhLWZvb3RlciAubGlrZSB7CiAgICAgICAgZm9udC1zaXplOiAyLjRlbTsKICAgICAgfQoKICAgICAgI21lZGlhLWZvb3RlciB7CiAgICAgICAgZGlzcGxheTogbm9uZTsgIAogICAgICB9CiAgCiAgICAgICNpbWFnZXMgLmltZyB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIGJhY2tncm91bmQtc2l6ZTogY292ZXI7CiAgICAgICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIC5hY3RpdmUgewogICAgICAgIGJhY2tncm91bmQ6ICM0NDQ7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZXMgPiAuYWN0aXZlIHsKICAgICAgICBvdXRsaW5lOiAuM2VtIHNvbGlkIGdyZWVuOwogICAgICAgIHotaW5kZXg6IDE7CiAgICAgIH0KCiAgICAgIC5oZWFydHN2ZyBwYXRoLAogICAgICAuaGVhZGVyLWljb24gc3ZnIHBhdGggewogICAgICAgIHN0cm9rZTogI2ZmZjsKICAgICAgfQogIAogICAgICAudmlkZW9zdmcsCiAgICAgIC5pbWFnZXN2ZyB7CiAgICAgICAgd2lkdGg6IGNhbGMobWluKDR2dywgMmVtKSk7CiAgICAgICAgaGVpZ2h0OiBjYWxjKG1pbig0dncsIDJlbSkpOwogICAgICAgIHBhZGRpbmc6IDAgLjJlbTsKICAgICAgfQogICAgICAKICAgICAgLnZpZGVvc3ZnIHBhdGgsCiAgICAgIC5pbWFnZXN2ZyBwYXRoIHsKICAgICAgICBmaWxsOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICBhI21lbnUsIAogICAgICAuaGVhZGVyLWljb24gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG1hcmdpbi10b3A6IC0uM2VtOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgIH0KCiAgICAgIC5pY29ucyB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIHotaW5kZXg6IDI7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgfQogICAgICAKICAgICAgYSNtZW51IHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBwYWRkaW5nOiAwIC4zZW0gMCAuNWVtOwogICAgICAgIGhlaWdodDogMi4xZW07CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgLmhlYWRlci1pY29uIHsKICAgICAgICBwYWRkaW5nOiAuMmVtOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICB3aWR0aDogMS41ZW07CiAgICAgICAgaGVpZ2h0OiAxLjVlbTsKICAgICAgICBtYXJnaW46IC4xZW0gLjVlbTsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgIH0KICAgICAgCiAgICAgIC5oZWFkZXItaWNvbiBzdmcgewogICAgICAgIHdpZHRoOiAxLjVlbTsKICAgICAgICBoZWlnaHQ6IDEuNWVtOwogICAgICB9CiAgICAgICAKICAgICAgLm1lbnVzdmcgewogICAgICAgIHdpZHRoOiAyZW07CiAgICAgICAgaGVpZ2h0OiAyZW07CiAgICAgIH0KCiAgICAgIC5tZW51c3ZnIHBhdGggewogICAgICAgIGZpbGw6ICNmZmY7CiAgICAgIH0KCiAgICAgICNtZW51LWNvbnRlbnQgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgICB3aWR0aDogMThlbTsKICAgICAgICBtYXJnaW4tbGVmdDogLTE4ZW07CiAgICAgICAgYmFja2dyb3VuZDogIzIyMjsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgei1pbmRleDogMzsgCiAgICAgICAgb3ZlcmZsb3c6IHNjcm9sbDsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudC52aXNpYmxlIHsKICAgICAgICBtYXJnaW4tbGVmdDogMDsKICAgICAgfQogICAgICAKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgewogICAgICAgIHBhZGRpbmc6IDAgMWVtIDFlbSAxZW07CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIGEsCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgcGFkZGluZzogLjVlbSAuN2VtOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgICB9CgogICAgICAjb3ZlcmxheSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICB6LWluZGV4OiAzOwogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICBvcGFjaXR5OiAuNTsKICAgICAgfQoKICAgICAgLnZpc2libGUgewogICAgICAgIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgCiAgICAgICNzaGFyZS1kaWFsb2cgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHdpZHRoOiBjYWxjKDEwMHZ3IC0gNGVtKTsKICAgICAgICBoZWlnaHQ6IDUwJTsKICAgICAgICBiYWNrZ3JvdW5kOiAjZmZmOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDFlbTsKICAgICAgICB6LWluZGV4OiA0OwogICAgICAgIG1hcmdpbi1sZWZ0OiAyZW07CiAgICAgICAgbWFyZ2luLXRvcDogMmVtOwogICAgICAgIHBhZGRpbmc6IDFlbTsKICAgICAgfQogICAgICAKICAgICAgaDIgewogICAgICAgIG1hcmdpbi10b3A6IDA7CiAgICAgIH0KICAgICAgCiAgICAgIHN2ZyB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgICN0ZW1wbGF0ZSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8ZGl2IGlkPSJ0ZW1wbGF0ZSI+CiAgICAgIDxzdmcgY2xhc3M9ImhlYXJ0c3ZnIHN2Zy1pY29uIiB2aWV3Qm94PSIwIDAgMjAgMjAiPgogICAgICAgIDxwYXRoIGQ9Ik05LjcxOSwxNy4wNzNsLTYuNTYyLTYuNTFjLTAuMjctMC4yNjgtMC41MDQtMC41NjctMC42OTYtMC44ODhDMS4zODUsNy44OSwxLjY3LDUuNjEzLDMuMTU1LDQuMTRjMC44NjQtMC44NTYsMi4wMTItMS4zMjksMy4yMzMtMS4zMjljMS45MjQsMCwzLjExNSwxLjEyLDMuNjEyLDEuNzUyYzAuNDk5LTAuNjM0LDEuNjg5LTEuNzUyLDMuNjEyLTEuNzUyYzEuMjIxLDAsMi4zNjksMC40NzIsMy4yMzMsMS4zMjljMS40ODQsMS40NzMsMS43NzEsMy43NSwwLjY5Myw1LjUzN2MtMC4xOSwwLjMyLTAuNDI1LDAuNjE4LTAuNjk1LDAuODg3bC02LjU2Miw2LjUxQzEwLjEyNSwxNy4yMjksOS44NzUsMTcuMjI5LDkuNzE5LDE3LjA3MyBNNi4zODgsMy42MUM1LjM3OSwzLjYxLDQuNDMxLDQsMy43MTcsNC43MDdDMi40OTUsNS45MiwyLjI1OSw3Ljc5NCwzLjE0NSw5LjI2NWMwLjE1OCwwLjI2NSwwLjM1MSwwLjUxLDAuNTc0LDAuNzMxTDEwLDE2LjIyOGw2LjI4MS02LjIzMmMwLjIyNC0wLjIyMSwwLjQxNi0wLjQ2NiwwLjU3My0wLjcyOWMwLjg4Ny0xLjQ3MiwwLjY1MS0zLjM0Ni0wLjU3MS00LjU2QzE1LjU3LDQsMTQuNjIxLDMuNjEsMTMuNjEyLDMuNjFjLTEuNDMsMC0yLjYzOSwwLjc4Ni0zLjI2OCwxLjg2M2MtMC4xNTQsMC4yNjQtMC41MzYsMC4yNjQtMC42OSwwQzkuMDI5LDQuMzk3LDcuODIsMy42MSw2LjM4OCwzLjYxIj48L3BhdGg+CiAgICAgIDwvc3ZnPgogICAgICA8c3ZnIGNsYXNzPSJ2aWRlb3N2ZyBzdmctaWNvbiIgdmlld0JveD0iMCAwIDIwIDIwIj4KCQkJCTxwYXRoIGQ9Ik0xOC4xNzUsNC4xNDJIMS45NTFDMS43MDMsNC4xNDIsMS41LDQuMzQ0LDEuNSw0LjU5MnYxMC44MTZjMCwwLjI0NywwLjIwMywwLjQ1LDAuNDUxLDAuNDVoMTYuMjI0YzAuMjQ3LDAsMC40NS0wLjIwMywwLjQ1LTAuNDVWNC41OTJDMTguNjI1LDQuMzQ0LDE4LjQyMiw0LjE0MiwxOC4xNzUsNC4xNDIgTTQuNjU1LDE0Ljk1N0gyLjQwMXYtMS44MDNoMi4yNTNWMTQuOTU3ek00LjY1NSwxMi4yNTRIMi40MDF2LTEuODAzaDIuMjUzVjEyLjI1NHogTTQuNjU1LDkuNTQ5SDIuNDAxVjcuNzQ3aDIuMjUzVjkuNTQ5eiBNNC42NTUsNi44NDZIMi40MDFWNS4wNDNoMi4yNTNWNi44NDZ6TTE0LjU2OSwxNC45NTdINS41NTZWNS4wNDNoOS4wMTNWMTQuOTU3eiBNMTcuNzI0LDE0Ljk1N2gtMi4yNTN2LTEuODAzaDIuMjUzVjE0Ljk1N3ogTTE3LjcyNCwxMi4yNTRoLTIuMjUzdi0xLjgwM2gyLjI1M1YxMi4yNTR6TTE3LjcyNCw5LjU0OWgtMi4yNTNWNy43NDdoMi4yNTNWOS41NDl6IE0xNy43MjQsNi44NDZoLTIuMjUzVjUuMDQzaDIuMjUzVjYuODQ2eiI+PC9wYXRoPgoJCQk8L3N2Zz4KCQkJPHN2ZyBjbGFzcz0iaW1hZ2Vzdmcgc3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CgkJCQk8cGF0aCBkPSJNMTguNTU1LDE1LjM1NFY0LjU5MmMwLTAuMjQ4LTAuMjAyLTAuNDUxLTAuNDUtMC40NTFIMS44ODhjLTAuMjQ4LDAtMC40NTEsMC4yMDMtMC40NTEsMC40NTF2MTAuODA4YzAsMC41NTksMC43NTEsMC40NTEsMC40NTEsMC40NTFoMTYuMjE3aDAuMDA1QzE4Ljc5MywxNS44NTEsMTguNDc4LDE0LjgxNCwxOC41NTUsMTUuMzU0IE0yLjgsMTQuOTQ5bDQuOTQ0LTYuNDY0bDQuMTQ0LDUuNDE5YzAuMDAzLDAuMDAzLDAuMDAzLDAuMDAzLDAuMDAzLDAuMDA1bDAuNzk3LDEuMDRIMi44eiBNMTMuODIyLDE0Ljk0OWwtMS4wMDYtMS4zMTdsMS42ODktMi4yMThsMi42ODgsMy41MzVIMTMuODIyeiBNMTcuNjU0LDE0LjA2NGwtMi43OTEtMy42NjZjLTAuMTgxLTAuMjM3LTAuNTM1LTAuMjM3LTAuNzE2LDBsLTEuODk5LDIuNDkzbC00LjE0Ni01LjQyYy0wLjE4LTAuMjM3LTAuNTM2LTAuMjM3LTAuNzE2LDBsLTUuMDQ3LDYuNTk4VjUuMDQyaDE1LjMxNlYxNC4wNjR6IE0xMi40NzQsNi4zOTNjLTAuODY5LDAtMS41NzcsMC43MDctMS41NzcsMS41NzZzMC43MDgsMS41NzYsMS41NzcsMS41NzZzMS41NzctMC43MDcsMS41NzctMS41NzZTMTMuMzQzLDYuMzkzLDEyLjQ3NCw2LjM5MyBNMTIuNDc0LDguNjQ1Yy0wLjM3MSwwLTAuNjc2LTAuMzA0LTAuNjc2LTAuNjc2czAuMzA1LTAuNjc2LDAuNjc2LTAuNjc2YzAuMzcyLDAsMC42NzYsMC4zMDQsMC42NzYsMC42NzZTMTIuODQ2LDguNjQ1LDEyLjQ3NCw4LjY0NSI+PC9wYXRoPgoJCQk8L3N2Zz4KICAgICAgPGRpdiBpZD0iY29sc2NzcyI+CiAgICAgIC5jb2xzJHtjb2xzfSAjaW1hZ2VzIC5pdGVtIHsKICAgICAgICB3aWR0aDogY2FsYygxMDB2dyAvICR7Y29sc30pOwogICAgICB9CgogICAgICAuY29scyR7Y29sc30gI2ltYWdlcyAuaXRlbSB7CiAgICAgICAgaGVpZ2h0OiBjYWxjKDEwMHZ3IC8gJHtjb2xzfSk7CiAgICAgIH0KICAgICAgCiAgICAgIC5jb2xzJHtjb2xzfSAucXVlcnksCiAgICAgIC5jb2xzJHtjb2xzfSAubGlrZSB7CiAgICAgICAgZm9udC1zaXplOiBtaW4oMTR2dyAqICgxIC8gJHtjb2xzfSksIDZlbSAqICgxIC8gJHtjb2xzfSkpCiAgICAgIH0KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9InNoYXJlLWRpYWxvZyIgY2xhc3M9ImRpYWxvZyI+CiAgICAgIDxoMj5zaGFyZTwvaDI+CiAgICAgIDxmb3JtIGlkPSJzaGFyZS1mb3JtIiBhY3Rpb249IiMiPgogICAgICAgIDxwIGNsYXNzPSJjb250ZW50Ij48L3A+CiAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgY2xhc3M9InN1Ym1pdCIgdmFsdWU9Im9rIi8+CiAgICAgIDwvZm9ybT4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0ibWVkaWEtZm9vdGVyIj4KICAgICAgPGEgaWQ9ImltYWdlLWxpa2UiIGNsYXNzPSJsaWtlIiBocmVmPSIjIj48L2E+CiAgICAgIDxhIGlkPSJpbWFnZS1xdWVyeSIgaHJlZj0iIyI+PC9hPgogICAgICA8YSBpZD0iaW1hZ2UtdXNlciIgaHJlZj0iIyI+PC9hPgogICAgPC9kaXY+CiAgICA8Y2VudGVyIGlkPSJtZWRpYS1jb250YWluZXIiPgogICAgICA8ZGl2IGlkPSJpbWFnZS1jb250YWluZXIiPgogICAgICAgIDxpbWcgaWQ9ImltYWdlIi8+CiAgICAgIDwvZGl2PgogICAgPC9jZW50ZXI+CiAgICA8ZGl2IGlkPSJvdmVybGF5IiBjbGFzcz0iZGlhbG9nIj48L2Rpdj4KICAgIDxkaXYgaWQ9Im1lbnUtY29udGVudCIgY2xhc3M9ImRpYWxvZyI+CiAgICAgIDxkaXYgY2xhc3M9Iml0ZW1zIj4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+YXV0b3BsYXk8L2Rpdj4KICAgICAgICA8YSBjbGFzcz0ic2V0YXV0b3BsYXkiIGRhdGEtYXV0b3BsYXk9Im9uIiBocmVmPSIjIj5vbjwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0YXV0b3BsYXkiIGRhdGEtYXV0b3BsYXk9Im9mZiIgaHJlZj0iIyI+b2ZmPC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRhdXRvcGxheSIgZGF0YS1hdXRvcGxheT0iaG92ZXIiIGhyZWY9IiMiPm1vdXNlb3ZlcjwvYT4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+Y29sdW1uczwvZGl2PgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjEiIGhyZWY9IiMiPjE8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iMiIgaHJlZj0iIyI+MjwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSI0IiBocmVmPSIjIj40PC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjYiIGhyZWY9IiMiPjY8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iMTAiIGhyZWY9IiMiPjEwPC9hPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5jb25uZWN0aW9uczwvZGl2PgogICAgICAgIDxkaXYgaWQ9ImNvbm5jb3VudCI+MDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5yZWxheXM6PC9kaXY+CiAgICAgICAgPHA+UGxlYXNlIHVzZSByZWxheXMgd2l0aCBOSVAtNTAgKHNlYXJjaCkgZnVuY3Rpb25hbGl0eTwvcD4KICAgICAgICA8Zm9ybSBhY3Rpb249IiMiIGlkPSJyZWxheXMtZm9ybSI+CiAgICAgICAgICA8dGV4dGFyZWEgaWQ9InJlbGF5cyI+PC90ZXh0YXJlYT4KICAgICAgICAgIDxpbnB1dCBjbGFzcz0ic3VibWl0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJzYXZlIHJlbGF5cyIvPgogICAgICAgIDwvZm9ybT4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+cHJpdmF0ZSBrZXk6PC9kaXY+CiAgICAgICAgPHA+SWYgeW91IGNhbnQgdXNlIGJyb3dzZXIgYWRkb24gKG1vYmlsZSk8L3A+CiAgICAgICAgPGZvcm0gYWN0aW9uPSIjIiBpZD0icHJpdmtleS1mb3JtIj4KICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0icHJpdmtleSIvPgogICAgICAgICAgPGlucHV0IGNsYXNzPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9InNhdmUga2V5Ii8+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5sb2dzPC9kaXY+CiAgICAgICAgPGRpdiBpZD0ibG9ncyI+PC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmxhdGVzdCByZWxlYXNlOjwvZGl2PgogICAgICAgIDxhIGlkPSJyZWxlYXNlIiBocmVmPSIjIj48L2E+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJoZWFkZXIiPgogICAgICA8ZGl2IGNsYXNzPSJpY29ucyI+CiAgICAgICAgPGEgaWQ9ImZpbHRlci1saWtlcyIgaHJlZj0iIyIgY2xhc3M9ImhlYWRlci1pY29uIj48L2E+CiAgICAgICAgPGEgaWQ9InNoYXJlIiBocmVmPSIjIiBjbGFzcz0iaGVhZGVyLWljb24iPgogICAgICAgICAgPHN2ZyBjbGFzcz0ic3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CgkJCQkgICAgPHBhdGggZD0iTTE0LjY4LDEyLjYyMWMtMC45LDAtMS43MDIsMC40My0yLjIxNiwxLjA5bC00LjU0OS0yLjYzN2MwLjI4NC0wLjY5MSwwLjI4NC0xLjQ1NywwLTIuMTQ2bDQuNTQ5LTIuNjM4YzAuNTE0LDAuNjYxLDEuMzE1LDEuMDksMi4yMTYsMS4wOWMxLjU0OSwwLDIuODA5LTEuMjYsMi44MDktMi44MDhjMC0xLjU0OC0xLjI2LTIuODA5LTIuODA5LTIuODA5Yy0xLjU0OCwwLTIuODA4LDEuMjYtMi44MDgsMi44MDljMCwwLjM4LDAuMDc2LDAuNzQxLDAuMjE0LDEuMDczbC00LjU1LDIuNjM4Yy0wLjUxNS0wLjY2MS0xLjMxNi0xLjA5LTIuMjE3LTEuMDljLTEuNTQ4LDAtMi44MDgsMS4yNi0yLjgwOCwyLjgwOXMxLjI2LDIuODA4LDIuODA4LDIuODA4YzAuOSwwLDEuNzAyLTAuNDMsMi4yMTctMS4wOWw0LjU1LDIuNjM3Yy0wLjEzOCwwLjMzMi0wLjIxNCwwLjY5My0wLjIxNCwxLjA3NGMwLDEuNTQ5LDEuMjYsMi44MDksMi44MDgsMi44MDljMS41NDksMCwyLjgwOS0xLjI2LDIuODA5LTIuODA5UzE2LjIyOSwxMi42MjEsMTQuNjgsMTIuNjIxTTE0LjY4LDIuNTEyYzEuMTM2LDAsMi4wNiwwLjkyMywyLjA2LDIuMDZTMTUuODE1LDYuNjMsMTQuNjgsNi42M3MtMi4wNTktMC45MjMtMi4wNTktMi4wNTlTMTMuNTQ0LDIuNTEyLDE0LjY4LDIuNTEyTTUuMzE5LDEyLjA2MWMtMS4xMzYsMC0yLjA2LTAuOTI0LTIuMDYtMi4wNnMwLjkyMy0yLjA1OSwyLjA2LTIuMDU5YzEuMTM1LDAsMi4wNiwwLjkyMywyLjA2LDIuMDU5UzYuNDU0LDEyLjA2MSw1LjMxOSwxMi4wNjFNMTQuNjgsMTcuNDg4Yy0xLjEzNiwwLTIuMDU5LTAuOTIyLTIuMDU5LTIuMDU5czAuOTIzLTIuMDYxLDIuMDU5LTIuMDYxczIuMDYsMC45MjQsMi4wNiwyLjA2MVMxNS44MTUsMTcuNDg4LDE0LjY4LDE3LjQ4OCI+PC9wYXRoPgoJCQkgICAgPC9zdmc+CgkJCSAgPC9hPgoJCQk8L2Rpdj4KCQkJCiAgICAgIDxkaXYgY2xhc3M9Iml0ZW1zIj4KICAgICAgICA8YSBpZD0ibWVudSIgaHJlZj0iIyI+CiAgICAgICAgICA8c3ZnIGNsYXNzPSJtZW51c3ZnIHN2Zy1pY29uIiB2aWV3Qm94PSIwIDAgMjAgMjAiPgoJCSAgICAgICAgPHBhdGggZD0iTTEwLDEuNDQ1Yy00LjcyNiwwLTguNTU1LDMuODI5LTguNTU1LDguNTU1YzAsNC43MjUsMy44MjksOC41NTUsOC41NTUsOC41NTVjNC43MjUsMCw4LjU1NS0zLjgzLDguNTU1LTguNTU1QzE4LjU1NSw1LjI3NCwxNC43MjUsMS40NDUsMTAsMS40NDUgTTEwLDE3LjY1NGMtNC4yMjEsMC03LjY1NC0zLjQzNC03LjY1NC03LjY1NGMwLTQuMjIxLDMuNDMzLTcuNjU0LDcuNjU0LTcuNjU0YzQuMjIyLDAsNy42NTQsMy40MzMsNy42NTQsNy42NTRDMTcuNjU0LDE0LjIyMSwxNC4yMjIsMTcuNjU0LDEwLDE3LjY1NCBNMTQuMzksMTBjMCwwLjI0OC0wLjIwMywwLjQ1LTAuNDUsMC40NUg2LjA2Yy0wLjI0OCwwLTAuNDUtMC4yMDMtMC40NS0wLjQ1czAuMjAzLTAuNDUsMC40NS0wLjQ1aDcuODc5QzE0LjE4Nyw5LjU1LDE0LjM5LDkuNzUyLDE0LjM5LDEwIE0xNC4zOSwxMi43MDJjMCwwLjI0Ny0wLjIwMywwLjQ0OS0wLjQ1LDAuNDQ5SDYuMDZjLTAuMjQ4LDAtMC40NS0wLjIwMi0wLjQ1LTAuNDQ5YzAtMC4yNDgsMC4yMDMtMC40NTEsMC40NS0wLjQ1MWg3Ljg3OUMxNC4xODcsMTIuMjUxLDE0LjM5LDEyLjQ1NCwxNC4zOSwxMi43MDIgTTE0LjM5LDcuMjk4YzAsMC4yNDgtMC4yMDMsMC40NS0wLjQ1LDAuNDVINi4wNmMtMC4yNDgsMC0wLjQ1LTAuMjAzLTAuNDUtMC40NXMwLjIwMy0wLjQ1LDAuNDUtMC40NWg3Ljg3OUMxNC4xODcsNi44NDgsMTQuMzksNy4wNTEsMTQuMzksNy4yOTgiPjwvcGF0aD4KCSAgICAgICAgPC9zdmc+CiAgICAgICAgPC9hPgogICAgICAgIDxhIGlkPSJ0aXRsZSIgaHJlZj0iIyI+ZmlsZXMuaHRtbDwvYT4KICAgICAgICA8Zm9ybSBpZD0icXVlcnktZm9ybSIgYWN0aW9uPSIjIj4KICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0icXVlcnkiIG5hbWU9InF1ZXJ5IiBpZD0iIiAvPgogICAgICAgICAgPHNlbGVjdCBpZD0icXVlcnktdHlwZSI+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9ImFsbCI+YWxsPC9vcHRpb24+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9ImltYWdlIj5pbWFnZXM8L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0idmlkZW8iPnZpZGVvczwvb3B0aW9uPgogICAgICAgICAgPC9zZWxlY3Q+CiAgICAgICAgICA8aW5wdXQgaWQ9ImdvIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJnbyIvPgogICAgICAgIDwvZm9ybT4KICAgICAgICA8c3BhbiBpZD0icXVlcnlkaXNwbGF5Ij4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0ZXh0Ij48L3NwYW4+CiAgICAgICAgPC9zcGFuPgogICAgICAgIDxkaXYgaWQ9ImxvYWRpbmciPnVwZGF0aW5nPC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJpbWFnZXMiPjwvZGl2PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vdW5wa2cuY29tL25vc3RyLXRvb2xzL2xpYi9ub3N0ci5idW5kbGUuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vc2xvd2xpLmdpdGh1Yi5pby9iZWNoMzItYnVmZmVyL2Fzc2V0cy9qcy9iZWNoMzItYnVmZmVyLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0PgogICAgICBjb25zdCB1cGRhdGVzcHVia2V5ID0gImFlNWM2ZTBiNzQ2NjBkMjE5NGM4MjU0YjVjMmM4MjU2NzY1NzZiZTAyOTczNzlmYTIwNTIzMTE0YTZhODVlODciCiAgICAgIGNvbnN0IHF1ZXJpZXMgPSB7CiAgICAgICAgImdsb2JhbCI6ICdbIlJFUSIsIjxJPiIseyJjYWNoZSI6WyJleHBsb3JlIix7InRpbWVmcmFtZSI6ImxhdGVzdCIsInNjb3BlIjoiZ2xvYmFsIiwibGltaXQiOjxMPn1dfV0nLCAKICAgICAgICAiYXV0aG9yIjogJ1siUkVRIiwiPEk+Iix7ImtpbmRzIjpbMV0sImF1dGhvcnMiOlsiPFA+Il19XScsCiAgICAgICAgInJlYWN0aW9ucyI6ICdbIlJFUSIsIjxJPiIsIHsia2luZHMiOls3XSwiI2UiOiA8RT59XScKICAgICAgfQogICAgICBxcygiI3JlbGF5cyIpLnZhbHVlID0gcmVsYXlzKCkuam9pbigiXG4iKQogICAgICBxcygiI3ByaXZrZXkiKS52YWx1ZSA9IHByaXZrZXkoKQogICAgICBjb25zdCBjb2xvcHRzID0gWzEsIDIsIDQsIDYsIDEwXQoKICAgICAgY29scyA9ICgpID0+IHBhcnNlSW50KHNldHRpbmcoImNvbHMiLCBjb2xvcHRzWzFdKSwgMTApCiAgICAgIGF1dG9wbGF5ID0gKCkgPT4gc2V0dGluZygiYXV0b3BsYXkiLCAib2ZmIikKICAgICAgbGltaXQgPSAoKSA9PiBwYXJzZUludChzZXR0aW5nKCJsaW1pdCIsIDE1KSwgMTApCiAgICAgIGdhbGxlcnkgPSAoKSA9PiB7CiAgICAgICAgbGV0IGdhbGxlcnltYXRjaGVyID0gbG9jYXRpb24uc2VhcmNoLm1hdGNoKC9nYWxsZXJ5PShbYS16MC05XSspLykKICAgICAgICByZXR1cm4gZ2FsbGVyeW1hdGNoZXIgJiYgZ2FsbGVyeW1hdGNoZXJbMV0KICAgICAgfQogICAgICAKICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJjb2xzIiArIGNvbHMoKSkKCiAgICAgIGxldCBwcm90b2NvbCA9IG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS8pID8gIm5vc3RyOiIgOiAid2ViK25vc3RyOiIKICAgICAgbGV0IHNvY2tldHMgPSBbXQogICAgICBsZXQgcmVzaGFuZGxlcnMgPSBbXQogICAgICBsZXQgdXJscyA9IFtdCiAgICAgIGxldCBsaWtlcyA9IFtdCiAgICAgIGxldCBuZXdsaWtlcyA9IFtdCiAgICAgIGxldCBpZGNvdW50ZXIgPSAwCiAgICAgIGxldCBxdWVyeXdhaXQgPSBudWxsCiAgICAgIGxldCBwcmltYWxzb2NrZXQgPSBudWxsCiAgICAgIGxldCB0eXBlcyA9IHsKICAgICAgICBpbWFnZTogWyJwbmciLCAianBnIiwgImpwZWciLCAid2VicCJdLAogICAgICAgIHZpZGVvOiBbIm1wNCIsICJ3ZWJtIl0KICAgICAgfQogICAgICBsZXQgaW1ncmVnZXggPSAvaHR0cCh8cylcOlwvXC9bXiBcbl0qP1wuKHBuZ3xqcGd8anBlZ3x3ZWJwKS9naQogICAgICBsZXQgdmlkZW9yZWdleCA9IC9odHRwKHxzKVw6XC9cL1teIFxuXSo/XC4obXA0fHdlYm0pL2dpCiAgICAgIGxldCB2aWRlb2V4dHJlZ2V4ID0gL1wuKG1wNHx3ZWJtKSQvaQogICAgICBsZXQgaW1nZXh0cmVnZXggPSAvXC4ocG5nfGpwZ3xqcGVnfHdlYnApJC9pCiAgICAgIHdhaXRtcyA9IDUwMDAwCiAgICAgIHF1ZXJ5c3RyID0gIiIKICAgICAgbGV0IHF1ZXJ5Y291bnQgPSAwCiAgICAgIGxldCBob3ZlcmVkdmlkZW8gPSBudWxsCiAgICAgIAogICAgICB1cGRhdGVxdWVyeSgpCiAgICAgIHFzKCIjaW1hZ2UtbGlrZSIpLmlubmVySFRNTCA9IHFzKCIjZmlsdGVyLWxpa2VzIikuaW5uZXJIVE1MID0gcXMoIiN0ZW1wbGF0ZSAuaGVhcnRzdmciKS5vdXRlckhUTUwKICAgICAgc2V0YWN0aXZlKCJzZXRjb2xzIiwgImNvbHMiLCBjb2xzKCkpCiAgICAgIHNldGFjdGl2ZSgic2V0YXV0b3BsYXkiLCAiYXV0b3BsYXkiLCBhdXRvcGxheSgpKQogICAgICAKICAgICAgZnVuY3Rpb24gZnJvbUhleFN0cmluZyhzdHIpewogICAgICAgIGxldCBidWZmZXIgPSBuZXcgVWludDhBcnJheShzdHIubGVuZ3RoIC8gMikKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmZlci5sZW5ndGg7IGkrKykgewogICAgICAgICAgYnVmZmVyW2ldID0gcGFyc2VJbnQoc3RyLnN1YnN0cigyICogaSwgMiksIDE2KQogICAgICAgIH0KICAgICAgICByZXR1cm4gYnVmZmVyCiAgICAgIH0KICAKICAgICAgZnVuY3Rpb24gcmVsYXlzKCl7CiAgICAgICAgY29uc3Qgb2JqID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgicmVsYXlzIikpCiAgICAgICAgY29uc3QgciA9IG9iaiAmJiBvYmouZmlsdGVyKHIgPT4gci5tYXRjaCgvd3NzOlwvXC8uKy8pKSB8fCBbXQogICAgICAgIAogICAgICAgIHJldHVybiByLmxlbmd0aCA+IDAgJiYgciB8fCBbCiAgICAgICAgICAid3NzOi8vcmVsYXkubm9zdHIuYmFuZCIsCiAgICAgICAgICAid3NzOi8vbmIucmVsYXkuY2VudGVyIiwgCiAgICAgICAgICAid3NzOi8vbm9zdHIuY29tcGlsZS1lcnJvci5uZXQiCiAgICAgICAgXQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBwcml2a2V5KCl7CiAgICAgICAgbGV0IGtleSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJwcml2a2V5IikgfHwgIiIKICAgICAgICAKICAgICAgICBpZihrZXkubGVuZ3RoID09IDYzKXsKICAgICAgICAgIGtleSA9IE5vc3RyVG9vbHMubmlwMTkuZGVjb2RlKGtleSkuZGF0YQogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4ga2V5Lmxlbmd0aCA9PSA2NCAmJiBrZXkgfHwgbnVsbAogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBzZXR0aW5nKGtleSwgZGVmYXVsdHZhbHVlKXsKICAgICAgICBjb25zdCB2ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KQogICAgICAgIHJldHVybiB2ICYmIG9wdGlvbigic2V0IiArIGtleSwga2V5LCB2KSAmJiB2IHx8IGRlZmF1bHR2YWx1ZQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBvcHRpb24oYywga2V5LCB2YWwpewogICAgICAgIHJldHVybiBxcygiLiIgKyBjICsgIltkYXRhLSIgKyBrZXkgKyAiPSciICsgdmFsICsgIiddIikKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcXMocSl7CiAgICAgICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IocSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcXNhKHEpewogICAgICAgIHJldHVybiBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocSkpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGdpZChpKXsKICAgICAgICByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcXVlcnl0eXBlKCl7CiAgICAgICAgcmV0dXJuIHFzKCIjcXVlcnktdHlwZSIpLnZhbHVlIHx8ICJhbGwiCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZXF1ZXJ5KCl7CiAgICAgICAgbGV0IHBhcnRzID0gKGdhbGxlcnkoKSAmJiAoImc6IiArIGdhbGxlcnkoKSkgfHwgZGVjb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhhc2guc3Vic3RyaW5nKDEpKSkuc3BsaXQoIi8iKQogICAgICAgIHFzKCIjcXVlcnlkaXNwbGF5IC50ZXh0IikuaW5uZXJUZXh0ID0gcGFydHNbMF0uc3Vic3RyaW5nKDAsIDIwKQogICAgICAgIHF1ZXJ5c3RyID0gcGFydHNbMF0KICAgICAgICBxcygiI3F1ZXJ5IikudmFsdWUgPSBwYXJ0c1swXQogICAgICAgIHFzKCIjcXVlcnktdHlwZSIpLnZhbHVlID0gcGFydHNbMV0gfHwgImFsbCIKICAgICAgfQoKICAgICAgZnVuY3Rpb24gYWN0aXZlKCl7CiAgICAgICAgcmV0dXJuIHFzKCIjaW1hZ2VzIC5hY3RpdmUiKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBpbWFnZW9mZnNldChvZmZzZXQpewogICAgICAgIGNvbnN0IGltYWdlcyA9IHFzYSgiI2ltYWdlcyA+IC5pdGVtIikuZmlsdGVyKGUgPT4gZS5jbGFzc0xpc3QuY29udGFpbnMoInZpc2libGUiKSkKICAgICAgICByZXR1cm4gaW1hZ2VzW2ltYWdlcy5pbmRleE9mKGFjdGl2ZSgpKStvZmZzZXRdCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGxhc3RhY3RpdmUoKXsKICAgICAgICByZXR1cm4gcXNhKCIjaW1hZ2VzIC5hY3RpdmUiKS5wb3AoKSAgICAgIAogICAgICB9CgogICAgICBmdW5jdGlvbiBtZW51KCl7CiAgICAgICAgcXNhKCIjbWVudS1jb250ZW50LCAjb3ZlcmxheSIpLmZvckVhY2gobiA9PiBuLmNsYXNzTGlzdC50b2dnbGUoInZpc2libGUiKSkKICAgICAgfQogIAogICAgICBmdW5jdGlvbiBzZXRhY3RpdmUoYywga2V5LCB2YWwpewogICAgICAgIHFzYSgiLiIgKyBjKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKSkKICAgICAgICBjb25zdCBvcHRpb24gPSBxcygiLiIgKyBjICsgIltkYXRhLSIgKyBrZXkgKyAiPSciICsgdmFsICsgIiddIikKICAgICAgICBvcHRpb24/LmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHNjcm9sbHZpc2libGUobiwgb2Zmc2V0KXsKICAgICAgICBvZmZzZXQgPSBvZmZzZXQgfHwgMAogICAgICAgIHJldHVybiAobi5vZmZzZXRUb3AgKyBuLm9mZnNldEhlaWdodCkgPj0gKHNjcm9sbFkgLSBvZmZzZXQpCiAgICAgICAgICAmJiBuLm9mZnNldFRvcCA8PSAoc2Nyb2xsWSArIHZpc3VhbFZpZXdwb3J0LmhlaWdodCArIG9mZnNldCkKICAgICAgfQoKICAgICAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlaW1hZ2VzbG9hZCgpewogICAgICAgIHFzYSgiI2ltYWdlcyAuaXRlbS5pbWciKS5mb3JFYWNoKGFzeW5jIGltZyA9PiB7CiAgICAgICAgICBpZihzY3JvbGx2aXNpYmxlKGltZywgdmlzdWFsVmlld3BvcnQuaGVpZ2h0IC8gMikpewogICAgICAgICAgICBpbWcuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gInVybCgiICsgaW1nWyJkYXRhLXNyYyJdICsgIikiCiAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgaW1nLnN0eWxlLmJhY2tncm91bmRJbWFnZSA9ICIiCiAgICAgICAgICB9CiAgICAgICAgfSkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlYWxsdmlkZW9wbGF5KCl7CiAgICAgICAgcXNhKCIjaW1hZ2VzIC5pdGVtLnZpZGVvIikuZm9yRWFjaChhc3luYyBuID0+IHVwZGF0ZXZpZGVvcGxheShuKSkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gdXBkYXRldmlkZW9wbGF5KG4pewogICAgICAgIGNvbnN0IGFwbGF5ID0gYXV0b3BsYXkoKQogICAgICAgIGNvbnN0IHYgPSBuLnF1ZXJ5U2VsZWN0b3IoInZpZGVvIikKICAgICAgICAKICAgICAgICBpZihhcGxheSAhPSAib24iKXsKICAgICAgICAgIHYubXV0ZWQgPSBmYWxzZQogICAgICAgICAgdi5wYXVzZSgpCiAgICAgICAgfWVsc2V7CiAgICAgICAgICB2Lm11dGVkID0gdHJ1ZQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZighc2Nyb2xsdmlzaWJsZShuKSl7CiAgICAgICAgICBpZih2LnJlYWR5U3RhdGUgPT0gNCl7CiAgICAgICAgICAgIHYucGF1c2UoKQogICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIHYucHJlbG9hZCA9ICJub25lIgogICAgICAgICAgfQogICAgICAgIH1lbHNlIGlmKHYucmVhZHlTdGF0ZSAhPSA0KXsKICAgICAgICAgIHYucHJlbG9hZCA9ICJhdXRvIgogICAgICAgIH0KICAgICAgICBlbHNlIGlmKGFwbGF5ID09ICJvbiIgfHwgKGFwbGF5ID09ICJob3ZlciIgJiYgdiA9PSBob3ZlcmVkdmlkZW8pKXsKICAgICAgICAgIHYucGxheSgpCiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLCBlID0+IHsKICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpCiAgICAgICAgdXBkYXRlaW1hZ2VzbG9hZCgpCiAgICAgICAgdXBkYXRlYWxsdmlkZW9wbGF5KCkKICAgICAgfSkKICAgICAgCiAgICAgIGxldCB0b3VjaCA9IG51bGwKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLCBlID0+IHRvdWNoID0gZS5jaGFuZ2VkVG91Y2hlc1swXSkKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIiwgZSA9PiB7CiAgICAgICAgY29uc3QgeGRpZmYgPSBlLmNoYW5nZWRUb3VjaGVzWzBdLnNjcmVlblggLSB0b3VjaC5zY3JlZW5YCgogICAgICAgIGlmKHhkaWZmIDwgLTUwKXsKICAgICAgICAgIHN3aXBlKDEpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKHhkaWZmID4gNTApewogICAgICAgICAgc3dpcGUoLTEpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgcXMoIiNxdWVyeS1mb3JtIikuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgZSA9PiB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgd2luZG93Lmhpc3RvcnkucHVzaFN0YXRlKG51bGwsIG51bGwsIGxvY2F0aW9uLnBhdGhuYW1lKQogICAgICAgIGxvY2F0aW9uLmhhc2ggPSAiIyIgKyBlbmNvZGVVUklDb21wb25lbnQocXMoIiNxdWVyeSIpLnZhbHVlICsgIi8iICsgcXVlcnl0eXBlKCkpCiAgICAgICAgdXBkYXRlcXVlcnkoKQogICAgICAgIHF1ZXJ5d2FpdC5yZXNvbHZlKCkKICAgICAgfSkKCiAgICAgIHFzKCIjcmVsYXlzLWZvcm0iKS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLCBhc3luYyBlID0+IHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICBsZXQgciA9IEpTT04uc3RyaW5naWZ5KHFzKCIjcmVsYXlzIikudmFsdWUuc3BsaXQoIlxuIikpCiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oInJlbGF5cyIsIHIpCiAgICAgICAgZGlzY29ubmVjdCgpCiAgICAgIH0pCiAgICAgIAogICAgICBxcygiI3NoYXJlLWZvcm0iKS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLCBhc3luYyBlID0+IHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICAKICAgICAgICBpZihxcygiI3NoYXJlLWZvcm0gLnN1Ym1pdCIpLnZhbHVlID09ICJjbG9zZSIpewogICAgICAgICAgcXNhKCIuZGlhbG9nLnZpc2libGUiKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QucmVtb3ZlKCJ2aXNpYmxlIikpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QgZXZlbnRzID0gcXNhKCIjaW1hZ2VzIC5pdGVtIikuZmlsdGVyKG4gPT4gbi5vZmZzZXRQYXJlbnQpLm1hcChuID0+IG5bImRhdGEtZXZlbnQiXS5pZCkKICAgICAgICBjb25zdCBldmVudCA9IGF3YWl0IHB1Ymxpc2goewogICAgICAgICAgImtpbmQiOiAzMzMsCiAgICAgICAgICAiY29udGVudCI6IEpTT04uc3RyaW5naWZ5KGV2ZW50cyksCiAgICAgICAgICAidGFncyI6IFtdCiAgICAgICAgfSkKCiAgICAgICAgYXdhaXQgd2FpdHJlcyhudWxsLCAiT0siKQoKICAgICAgICBjb25zdCB1cmwgPSB3aW5kb3cubG9jYXRpb24ub3JpZ2luICsgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lCiAgICAgICAgCiAgICAgICAgY29uc3QgcHVibGlzaGVkZXZlbnQgPSBhd2FpdCBwdWJsaXNoKHsKICAgICAgICAgICJraW5kIjogMSwKICAgICAgICAgICJjb250ZW50IjogIlRoaXMgaXMgYSBnYWxsZXJ5IG9mICIgKyBldmVudHMubGVuZ3RoCiAgICAgICAgICAgICsgIiBpbWFnZXMvdmlkZW9zIHNoYXJlZCBmcm9tIGZpbGVzLmh0bWwuIENoZWNrIGl0IG91dCBoZXJlOiAiICsgdXJsICsgIj9nYWxsZXJ5PSIgKyBldmVudC5pZCwKICAgICAgICAgICJ0YWdzIjogWwogICAgICAgICAgICBbIiNlIiwgZXZlbnQuaWRdLCAKICAgICAgICAgICAgWyIjcCIsIGV2ZW50LnB1YmtleV0KICAgICAgICAgIF0KICAgICAgICB9KQoKICAgICAgICBhd2FpdCB3YWl0cmVzKG51bGwsICJPSyIpCiAgICAgICAgCiAgICAgICAgY29uc3QgYmVjaDMyaWQgPSBiZWNoMzIuZW5jb2RlKCJub3RlIiwgZnJvbUhleFN0cmluZyhwdWJsaXNoZWRldmVudC5pZCkpCiAgICAgICAgcXMoIiNzaGFyZS1mb3JtIC5jb250ZW50IikuaW5uZXJIVE1MID0gJ05vdGUgcHVibGlzaGVkIDxhIGhyZWY9IicgKyBwcm90b2NvbCArIGJlY2gzMmlkICsgJyI+JyArIGJlY2gzMmlkICsgJzwvYT4nCiAgICAgICAgcXMoIiNzaGFyZS1mb3JtIC5zdWJtaXQiKS52YWx1ZSA9ICJjbG9zZSIKICAgICAgfSkKCiAgICAgIHFzKCIjcHJpdmtleS1mb3JtIikuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgYXN5bmMgZSA9PiB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgY29uc3Qga2V5ID0gcXMoIiNwcml2a2V5IikudmFsdWUKCiAgICAgICAgaWYoa2V5Lmxlbmd0aCAhPSA2NCAmJiBrZXkubGVuZ3RoICE9IDYzKXsKICAgICAgICAgIGFsZXJ0KCJrZXkgc2hvdWxkIGJlIDYzIG9yIDY0IGNoYXJhY3RlcnMgbG9uZyIpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oInByaXZrZXkiLCBrZXkpCiAgICAgICAgYWxlcnQoImtleSBzYXZlZCIpCiAgICAgIH0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLCBhc3luYyAoZSkgPT4gewogICAgICAgIGlmKGF1dG9wbGF5KCkgPT0gImhvdmVyIiAmJiBlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInZpZGVvLWNvbnRhaW5lciIpKXsKICAgICAgICAgIGhvdmVyZWR2aWRlbyA9IGUudGFyZ2V0LnF1ZXJ5U2VsZWN0b3IoInZpZGVvIikKICAgICAgICAgIGhvdmVyZWR2aWRlby5wbGF5KCkKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgaG92ZXJlZHZpZGVvID0gZmFsc2UKICAgICAgICBpZighcXMoIiNtZWRpYS1jb250YWluZXIiKS5jbGFzc0xpc3QuY29udGFpbnMoInZpc2libGUiKSAmJiBhdXRvcGxheSgpID09ICJob3ZlciIgJiYgZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ2aWRlby1jb250YWluZXIiKSl7CiAgICAgICAgICBxc2EoInZpZGVvIikuZm9yRWFjaCh2ID0+IHYucGF1c2UoKSkKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgaWYoZS50YXJnZXQudHlwZSA9PSAic3VibWl0IiB8fCAoZS50YXJnZXQudGFnTmFtZSA9PSAiQSIgJiYgZS50YXJnZXQuaHJlZi5tYXRjaCgvXih8d2ViXCspbm9zdHJcOi8pKSl7CiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAKICAgICAgICBpZihlLnRhcmdldC5pZCA9PSAidGl0bGUiKXsKICAgICAgICAgIHFzKCIjcXVlcnkiKS52YWx1ZSA9ICIiCiAgICAgICAgICBxcygiI3F1ZXJ5LXR5cGUiKS52YWx1ZSA9ICJhbGwiCiAgICAgICAgICBxcygiI2dvIikuY2xpY2soKQogICAgICAgIH0KCiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCgogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJmaWx0ZXItbGlrZXMiKXsKICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnRvZ2dsZSgiZmlsdGVyLWxpa2VzIikKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLnRhcmdldC5pZCA9PSAic2hhcmUiKXsKICAgICAgICAgIGNvbnN0IGV2ZW50cyA9IHFzYSgiI2ltYWdlcyAuaXRlbSIpLmZpbHRlcihuID0+IG4ub2Zmc2V0UGFyZW50KS5tYXAobiA9PiBuWyJkYXRhLWV2ZW50Il0uaWQpCiAgICAgICAgICAvL2NvbnN0IHRleHQgPSB7dHlwZTogIiIsIGV2ZW50czogfQogICAgICAgICAgcXMoIiNzaGFyZS1kaWFsb2cgLmNvbnRlbnQiKS5pbm5lckhUTUwgPSAiPHA+U2hhcmUgbGluayB0byB0aGlzIGdhbGxlcnkgb2YgIiArIGV2ZW50cy5sZW5ndGggKyAiIGltYWdlcy92aWRlb3MgdG8geW91ciBub3N0ciBwcm9maWxlPzwvcD4iCiAgICAgICAgICBxcygiI3NoYXJlLWZvcm0gLnN1Ym1pdCIpLnZhbHVlID0gInB1Ymxpc2giCiAgICAgICAgICBxc2EoIiNzaGFyZS1kaWFsb2csICNvdmVybGF5IikuZm9yRWFjaChuID0+IG4uY2xhc3NMaXN0LnRvZ2dsZSgidmlzaWJsZSIpKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNob3ciKSl7CiAgICAgICAgICBhY3RpdmUoKT8uY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIGdpZChlLnRhcmdldC5pZCkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIHNob3coZS50YXJnZXQuaWQpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZS50YXJnZXQudGFnTmFtZSAhPSAiQSIgJiYgKHFzKCIjaW1hZ2UtY29udGFpbmVyIikgPT0gZS50YXJnZXQgfHwgcXMoIiNpbWFnZSIpID09IGUudGFyZ2V0IHx8IHFzKCIjbWVkaWEtY29udGFpbmVyIHZpZGVvIikgPT0gZS50YXJnZXQpKXsKICAgICAgICAgIGhpZGVtZWRpYSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJtZW51Iil7CiAgICAgICAgICBtZW51KCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gIm92ZXJsYXkiKXsKICAgICAgICAgIHFzYSgiLmRpYWxvZy52aXNpYmxlIikuZm9yRWFjaChuID0+IG4uY2xhc3NMaXN0LnJlbW92ZSgidmlzaWJsZSIpKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygic2V0Y29scyIpKXsKICAgICAgICAgIGZvcihsZXQgYyBvZiBjb2xvcHRzKXsKICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCJjb2xzIiArIGMpCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgiY29scyIgKyBlLnRhcmdldC5kYXRhc2V0LmNvbHMpCiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiY29scyIsIGUudGFyZ2V0LmRhdGFzZXQuY29scykKICAgICAgICAgIHNldGFjdGl2ZSgic2V0Y29scyIsICJjb2xzIiwgY29scygpKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogIAogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygic2V0YXV0b3BsYXkiKSl7CiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiYXV0b3BsYXkiLCBlLnRhcmdldC5kYXRhc2V0LmF1dG9wbGF5KQogICAgICAgICAgc2V0YWN0aXZlKCJzZXRhdXRvcGxheSIsICJhdXRvcGxheSIsIGF1dG9wbGF5KCkpCiAgICAgICAgICB1cGRhdGVhbGx2aWRlb3BsYXkoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygibGlrZSIpICYmIGxpa2UoZS50YXJnZXQpCiAgICAgIH0pCiAgICAgIAogICAgICBmdW5jdGlvbiBoYXNrZXkoKXsKICAgICAgICByZXR1cm4gd2luZG93Lm5vc3RyIHx8IHByaXZrZXkoKQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBwdWJrZXkoKXsKICAgICAgICByZXR1cm4gd2luZG93Lm5vc3RyICYmIGF3YWl0IHdpbmRvdy5ub3N0ci5nZXRQdWJsaWNLZXkoKSB8fCBOb3N0clRvb2xzLmdldFB1YmxpY0tleShwcml2a2V5KCkpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHNpZ24oZXZlbnQpewogICAgICAgIGlmKHdpbmRvdy5ub3N0cil7CiAgICAgICAgICByZXR1cm4gYXdhaXQgbm9zdHIuc2lnbkV2ZW50KGV2ZW50KQogICAgICAgIH0KICAgICAgICAKICAgICAgICBldmVudC5zaWcgPSBOb3N0clRvb2xzLmdldFNpZ25hdHVyZShldmVudCwgcHJpdmtleSgpKQogICAgICAgIHJldHVybiBldmVudAogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBsaWtlKGxpbmspewogICAgICAgIGNvbnN0IGV2ZW50ID0gbGluay5wYXJlbnRFbGVtZW50WyJkYXRhLWV2ZW50Il0KICAgICAgICAKICAgICAgICBhd2FpdCBwdWJsaXNoKHsKICAgICAgICAgICJraW5kIjogNywKICAgICAgICAgICJjb250ZW50IjogIisiLAogICAgICAgICAgInRhZ3MiOiBbCiAgICAgICAgICAgIFsiZSIsIGV2ZW50LmlkXSwKICAgICAgICAgICAgWyJwIiwgZXZlbnQucHVia2V5XQogICAgICAgICAgXQogICAgICAgIH0pCgogICAgICAgIGxpbmsuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCgogICAgICAgIGNvbnN0IGltYWdlaWQgPSBsaW5rWyJkYXRhLWl0ZW0taWQiXSB8fCBsaW5rLmRhdGFzZXQuaW1hZ2VJZAogICAgICAgIAogICAgICAgIGlmKGltYWdlaWQpewogICAgICAgICAgZ2lkKGltYWdlaWQpLnF1ZXJ5U2VsZWN0b3IoIi5saWtlIikuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCiAgICAgICAgfQogICAgICB9CgogICAgICBhc3luYyBmdW5jdGlvbiBwcmVwYXJlX2V2ZW50KGV2ZW50KXsKICAgICAgICBldmVudC5wdWJrZXkgPSBhd2FpdCBwdWJrZXkoKQogICAgICAgIGV2ZW50LmNyZWF0ZWRfYXQgPSBwYXJzZUludChEYXRlLm5vdygpIC8gMTAwMCwgMTApCiAgICAgICAgZXZlbnQuaWQgPSBOb3N0clRvb2xzLmdldEV2ZW50SGFzaChldmVudCkKICAgICAgICByZXR1cm4gZXZlbnQKICAgICAgfQogICAgICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHB1Ymxpc2goZXZlbnQpewogICAgICAgIGV2ZW50ID0gYXdhaXQgcHJlcGFyZV9ldmVudChldmVudCkKICAgICAgICBsZXQgc2lnbmVkZXZlbnQgPSBhd2FpdCBzaWduKGV2ZW50KQogICAgICAgIGxldCBqc29uID0gSlNPTi5zdHJpbmdpZnkoWyJFVkVOVCIsIHNpZ25lZGV2ZW50XSkKICAgICAgICBzb2NrZXRzLmZvckVhY2gocyA9PiBzLnNlbmQoanNvbikpCiAgICAgICAgCiAgICAgICAgcmV0dXJuIGV2ZW50CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHN3aXBlKG9mZnNldCl7CiAgICAgICAgaWYoaW1hZ2VvZmZzZXQob2Zmc2V0KSl7CiAgICAgICAgICBpbWFnZW9mZnNldChvZmZzZXQpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICB0aGlzW29mZnNldCA9PSAtMSAmJiAibGFzdGFjdGl2ZSIgfHwgImFjdGl2ZSJdKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIHVwZGF0ZXNob3coKQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gdXBkYXRlc2hvdygpewogICAgICAgIGlmKHFzKCIjbWVkaWEtY29udGFpbmVyIikuY2xhc3NMaXN0LmNvbnRhaW5zKCJ2aXNpYmxlIikpewogICAgICAgICAgaGlkZXZpZGVvKCkKICAgICAgICAgIHNob3coYWN0aXZlKCkuaWQpCiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgZSA9PiB7CiAgICAgICAgaWYoWyJUYWIiLCAiQXJyb3dMZWZ0IiwgIkFycm93UmlnaHQiLCAiQXJyb3dVcCIsICJBcnJvd0Rvd24iXS5pbmNsdWRlcyhlLmtleSkpewogICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiRXNjYXBlIil7CiAgICAgICAgICBtZW51KCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLmtleSA9PSAiRW50ZXIiICYmIGUudGFyZ2V0LnRhZ05hbWUgPT0gIkJPRFkiKXsKICAgICAgICAgIGlmKHFzKCIjbWVkaWEtY29udGFpbmVyIikuY2xhc3NMaXN0LmNvbnRhbnMoInZpc2libGUiKSl7CiAgICAgICAgICAgIGhpZGVtZWRpYSgpCiAgICAgICAgICAgIHJldHVybgogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBzaG93KGFjdGl2ZSgpLmlkKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dVcCIgJiYgaW1hZ2VvZmZzZXQoLWNvbHMoKSkpewogICAgICAgICAgaW1hZ2VvZmZzZXQoLWNvbHMoKSkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIGxhc3RhY3RpdmUoKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgICAgdXBkYXRlc2hvdygpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dEb3duIiAmJiBpbWFnZW9mZnNldChjb2xzKCkpKXsKICAgICAgICAgIGltYWdlb2Zmc2V0KGNvbHMoKSkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIGFjdGl2ZSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgICB1cGRhdGVzaG93KCkKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd0xlZnQiKXsKICAgICAgICAgIHN3aXBlKC0xKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93UmlnaHQiKXsKICAgICAgICAgIHN3aXBlKDEpCiAgICAgICAgfQogICAgICB9KQoKICAgICAgYXN5bmMgZnVuY3Rpb24gaGFuZGxlcXVlcnlyZXMocmVzLCBzb2NrZXQsIHEsIHR5cGUsIHN0aW1lKXsKICAgICAgICBzYXZlKHNvY2tldCwgcmVzLCBxLCB0eXBlLCBmYWxzZSwgZmFsc2UsIHRydWUpCiAgICAgICAgbG9nKCJxdWVyeSByZXMiLCByZXMubGVuZ3RoLCBzb2NrZXQudXJsKQogICAgICAgIHF1ZXJ5Y291bnQtLQogICAgICAgIGlmKHF1ZXJ5Y291bnQgPT0gMCl7CiAgICAgICAgICBxcygiI2xvYWRpbmciKS5jbGFzc0xpc3QucmVtb3ZlKCJ2aXNpYmxlIikKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbGV0IHdhaXQgPSB3YWl0bXMgLSAoRGF0ZS5ub3coKSAtIHN0aW1lKQogICAgICAgIHF1ZXJ5d2FpdCA9IHNsZWVwKHdhaXQpCiAgICAgICAgYXdhaXQgcXVlcnl3YWl0LnByb21pc2UKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcHJpbWFsZ2xvYmFsKHNvY2tldCl7CiAgICAgICAgbG9nKCJnbG9iYWwiLCBzb2NrZXQudXJsKQogICAgICAgIHF1ZXJ5Y291bnQrKwogICAgICAgIHFzKCIjbG9hZGluZyIpLmNsYXNzTGlzdC5hZGQoInZpc2libGUiKQogICAgICAgIGxldCBzdGltZSA9IERhdGUubm93KCkKICAgICAgICBsZXQgcWlkID0gImdsb2JhbF8iICsgKCsraWRjb3VudGVyKQogICAgICAgIGxldCBxaWRsaWtlcyA9ICJsaWtlc18iICsgKCsraWRjb3VudGVyKQoKICAgICAgICBpZihuZXdsaWtlcy5sZW5ndGggPiAwKXsKICAgICAgICAgIHByaW1hbHNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KFsKICAgICAgICAgICAgIlJFUSIsIAogICAgICAgICAgICBxaWRsaWtlcywgCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiY2FjaGUiOiBbCiAgICAgICAgICAgICAgICAiZXZlbnRzIiwgewogICAgICAgICAgICAgICAgICAiZXZlbnRfaWRzIjogbmV3bGlrZXMKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0KICAgICAgICAgIF0pKQoKICAgICAgICAgIGNvbnN0IGxpa2VfZXZlbnRzID0gKGF3YWl0IHdhaXRyZXMocWlkbGlrZXMpKVswXQogICAgICAgICAgbmV3bGlrZXMuc3BsaWNlKDApCiAgICAgICAgICAKICAgICAgICAgIGF3YWl0IHNhdmUoc29ja2V0LCBsaWtlX2V2ZW50cywgIiIsICJhbGwiLCB0cnVlLCB0cnVlLCBmYWxzZSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoWwogICAgICAgICAgIlJFUSIsIAogICAgICAgICAgcWlkLCAKICAgICAgICAgIHsKICAgICAgICAgICAgImNhY2hlIjogWwogICAgICAgICAgICAgICJleHBsb3JlIiwgCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInRpbWVmcmFtZSI6ICJsYXRlc3QiLAogICAgICAgICAgICAgICAgInNjb3BlIjogImdsb2JhbCIsCiAgICAgICAgICAgICAgICAibGltaXQiOiA1MAogICAgICAgICAgICAgIH0KICAgICAgICAgICAgXQogICAgICAgICAgfQogICAgICAgIF0pKQogICAgICAgIAogICAgICAgIGNvbnN0IHJlcyA9IChhd2FpdCB3YWl0cmVzKHFpZCkpWzBdCiAgICAgICAgYXdhaXQgaGFuZGxlcXVlcnlyZXMocmVzLmZpbHRlcihlID0+IGUua2luZCA9PSAxKSwgc29ja2V0LCAiIiwgImFsbCIsIHN0aW1lKQogICAgICAgIHByaW1hbGdsb2JhbChzb2NrZXQpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5KHNvY2tldCwgcHJpbWFsKXsKICAgICAgICBsb2coInF1ZXJ5Iiwgc29ja2V0LnVybCkKICAgICAgICBxdWVyeWNvdW50KysKICAgICAgICBxcygiI2xvYWRpbmciKS5jbGFzc0xpc3QuYWRkKCJ2aXNpYmxlIikKICAgICAgICAKICAgICAgICBsZXQgc3RpbWUgPSBEYXRlLm5vdygpCiAgICAgICAgbGV0IHEgPSBxdWVyeXN0ci50cmltKCkKICAgICAgICBsZXQgdHlwZSA9IHF1ZXJ5dHlwZSgpCiAgICAgICAgbGV0IGkgPSArK2lkY291bnRlcgogICAgICAgIGxldCBxaWQgPSAicXVlcnlfIiArIGkKICAgICAgICBjb25zdCBsaWtlc3JlcyA9IGF3YWl0IHF1ZXJ5bGlrZXMoc29ja2V0KQogICAgICAgIAogICAgICAgIGxpa2VzcmVzLmZvckVhY2goZXZlbnRpZCA9PiB7CiAgICAgICAgICBpZighbGlrZXMuaW5jbHVkZXMoZXZlbnRpZCkpewogICAgICAgICAgICBsaWtlcy5wdXNoKGV2ZW50aWQpCiAgICAgICAgICAgIG5ld2xpa2VzLnB1c2goZXZlbnRpZCkKICAgICAgICAgIH0KICAgICAgICB9KQogICAgICAgIAogICAgICAgIGxldCBnYWxsZXJ5bWF0Y2ggPSBxdWVyeXN0ci5tYXRjaCgvZzooW2EtejAtOV0rKS8pCiAgICAgICAgbGV0IHJlcyA9IG51bGwKICAgICAgICAKICAgICAgICBpZihnYWxsZXJ5bWF0Y2gpewogICAgICAgICAgY29uc3QgZ2FsbGVyeXJlcyA9IGF3YWl0IHF1ZXJ5ZXZlbnRzKHNvY2tldCwgWzMzM10sIFtnYWxsZXJ5bWF0Y2hbMV1dLCBudWxsKQogICAgICAgICAgY29uc3QgZXZlbnRpZHMgPSBKU09OLnBhcnNlKGdhbGxlcnlyZXNbMF0uY29udGVudCkKICAgICAgICAgIHJlcyA9IGF3YWl0IHF1ZXJ5ZXZlbnRzKHNvY2tldCwgWzFdLCBldmVudGlkcywgbnVsbCkKICAgICAgICB9ZWxzZXsKICAgICAgICAgIGxldCBmaWx0ZXJzID0gW10KCiAgICAgICAgICBmaWx0ZXJzLnB1c2goLi4uKHR5cGVzW3R5cGVdIHx8IFtdKS5tYXAoKHQpID0+IHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICBraW5kczogWzFdLCAKICAgICAgICAgICAgICBzZWFyY2g6ICIuIiArIHQsCiAgICAgICAgICAgICAgbGltaXQ6IDIwCiAgICAgICAgICAgIH0KICAgICAgICAgIH0pKQogICAgICAgICAgCiAgICAgICAgICBpZihxLmxlbmd0aCA+IDApewogICAgICAgICAgICBmaWx0ZXJzLnB1c2goe2tpbmRzOiBbMV0sIHNlYXJjaDogcX0pCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIGlmKGZpbHRlcnMubGVuZ3RoID09IDApewogICAgICAgICAgICBmaWx0ZXJzLnB1c2goe2tpbmRzOiBbMV19KQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBjb25zdCBzZWFyY2hvYmogPSBbIlJFUSIsIHFpZCwgLi4uZmlsdGVyc10KICAgICAgICAgIGNvbnN0IHNlYXJjaGpzb24gPSBKU09OLnN0cmluZ2lmeShzZWFyY2hvYmopCiAgICAgICAgICBzb2NrZXQuc2VuZChzZWFyY2hqc29uKQogICAgICAgICAgCiAgICAgICAgICByZXMgPSAoYXdhaXQgd2FpdHJlcyhxaWQpKVswXQogICAgICAgICAgCiAgICAgICAgICByZXMgPSByZXMuZmlsdGVyKG8gPT4gewogICAgICAgICAgICBpZihxLmxlbmd0aCA+IDApewogICAgICAgICAgICAgIGZvcihsZXQgd29yZCBvZiBxLnNwbGl0KCIgIikpewogICAgICAgICAgICAgICAgaWYoby5jb250ZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZih3b3JkLnRvTG93ZXJDYXNlKCkpID09IC0xKXsKICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZQogICAgICAgICAgfSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgYXdhaXQgaGFuZGxlcXVlcnlyZXMocmVzLCBzb2NrZXQsIHEsIHR5cGUsIHN0aW1lKQogICAgICAgIHF1ZXJ5KHNvY2tldCkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcXVlcnlsaWtlcyhzb2NrZXQpewogICAgICAgIGlmKCFoYXNrZXkoKSl7CiAgICAgICAgICByZXR1cm4gW10KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QgbXlwdWJrZXkgPSBhd2FpdCBwdWJrZXkoKQogICAgICAgIGNvbnN0IGV2ZW50cyA9IGF3YWl0IHF1ZXJ5ZXZlbnRzKHNvY2tldCwgWzddLCBudWxsLCBbbXlwdWJrZXldKQogICAgICAgIHJldHVybiBldmVudHMubWFwKGUgPT4gZS50YWdzLmZpbmQodCA9PiB0WzBdID09ICJlIilbMV0pCiAgICAgIH0KCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5ZXZlbnRzKHNvY2tldCwga2luZHMsIGV2ZW50aWRzLCBhdXRob3JzKXsKICAgICAgICBjb25zdCBxdWVyeWlkID0gImV2ZW50c18iICsgKCsraWRjb3VudGVyKQogICAgICAgIGNvbnN0IGZpbHRlcnMgPSB7fQogICAgICAgIAogICAgICAgIGZpbHRlcnMua2luZHMgPSBraW5kcwogICAgICAgIAogICAgICAgIGlmKGV2ZW50aWRzKXsKICAgICAgICAgIGZpbHRlcnNbImlkcyJdID0gZXZlbnRpZHMKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoYXV0aG9ycyl7CiAgICAgICAgICBmaWx0ZXJzWyJhdXRob3JzIl0gPSBhdXRob3JzCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeShbCiAgICAgICAgICAiUkVRIiwgCiAgICAgICAgICBxdWVyeWlkLCAKICAgICAgICAgIGZpbHRlcnMKICAgICAgICBdKQogICAgICAgIAogICAgICAgIHNvY2tldC5zZW5kKGpzb24pCiAgICAgICAgCiAgICAgICAgcmV0dXJuIChhd2FpdCB3YWl0cmVzKHF1ZXJ5aWQpKVswXSB8fCBbXQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeXB1YmtleShzb2NrZXQsIHB1YmspewogICAgICAgIGNvbnN0IHF1ZXJ5aWQgPSAicXVlcnlfIiArICgrK2lkY291bnRlcikKICAgICAgICBzb2NrZXQuc2VuZChxdWVyaWVzLmF1dGhvci5yZXBsYWNlKCI8ST4iLCBxdWVyeWlkKS5yZXBsYWNlKCI8UD4iLCBwdWJrKSkKCiAgICAgICAgcmV0dXJuIChhd2FpdCB3YWl0cmVzKHF1ZXJ5aWQpKVswXQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBzYXZlKHNvY2tldCwgZXZlbnRzLCBxLCBxdHlwZSwgcmVhY3RlZCwgYXBwZW5kLCBxdWVyeW1ldGEpewogICAgICAgIGxldCBldmVudHB1YmtleXMgPSBbXQogICAgICAgIGxldCByZXN1bHRzID0gW10KICAgICAgICBjb25zdCBldmVudGlkcyA9IGV2ZW50cy5tYXAoZSA9PiBlLmlkKQogICAgICAgIGxldCBuZXd1cmxzID0gW10KICAgICAgICAKICAgICAgICBmb3IobGV0IGV2ZW50IG9mIGV2ZW50cyl7CiAgICAgICAgICBsZXQgdXJsc21hdGNoID0gW10KICAgICAgICAgIAogICAgICAgICAgaWYocXR5cGUgIT0gInZpZGVvIil7CiAgICAgICAgICAgIHVybHNtYXRjaC5wdXNoKC4uLihldmVudC5jb250ZW50Lm1hdGNoKGltZ3JlZ2V4KSB8fCBbXSkpCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIGlmKHF0eXBlICE9ICJpbWFnZSIpewogICAgICAgICAgICB1cmxzbWF0Y2gucHVzaCguLi4oZXZlbnQuY29udGVudC5tYXRjaCh2aWRlb3JlZ2V4KSB8fCBbXSkpCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHVybHNtYXRjaCA9IHVybHNtYXRjaC5maWx0ZXIodXJsID0+ICF1cmxzLmluY2x1ZGVzKHVybCkpCgogICAgICAgICAgaWYodXJsc21hdGNoLmxlbmd0aCA+IDApewogICAgICAgICAgICBuZXd1cmxzLnB1c2goewogICAgICAgICAgICAgIGV2ZW50OiBldmVudCwKICAgICAgICAgICAgICB1cmxzOiB1cmxzbWF0Y2gKICAgICAgICAgICAgfSkKICAgICAgICAgICAgCiAgICAgICAgICAgIHVybHMucHVzaCguLi51cmxzbWF0Y2gpCiAgICAgICAgICAgIGV2ZW50cHVia2V5cy5pbmNsdWRlcyhldmVudC5wdWJrZXkpIHx8IGV2ZW50cHVia2V5cy5wdXNoKGV2ZW50LnB1YmtleSkKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbG9nKCJxdWVyeSBtZXRhIiwgc29ja2V0LnVybCkKICAgICAgICBsZXQgbWV0YWV2ZW50cyA9IChxdWVyeW1ldGEgJiYgYXdhaXQgcXVlcnlldmVudHMoc29ja2V0LCBbMF0sIG51bGwsIGV2ZW50cHVia2V5cykgfHwgW10pCiAgICAgICAgCiAgICAgICAgZm9yKGxldCBlbnRyeSBvZiBuZXd1cmxzKXsKICAgICAgICAgIGZvcihsZXQgdXJsIG9mIGVudHJ5LnVybHMpewogICAgICAgICAgICByZXN1bHRzLnB1c2goewogICAgICAgICAgICAgIHJlYWN0ZWQ6IHJlYWN0ZWQgfHwgbGlrZXMuaW5jbHVkZXMoZW50cnkuZXZlbnQuaWQpLCAKICAgICAgICAgICAgICB1cmw6IHVybCwgCiAgICAgICAgICAgICAgZXZlbnQ6IGVudHJ5LmV2ZW50LCAKICAgICAgICAgICAgICBiZWNoMzJpZDogYmVjaDMyLmVuY29kZSgibm90ZSIsIGZyb21IZXhTdHJpbmcoZW50cnkuZXZlbnQuaWQpKSwKICAgICAgICAgICAgICBtZXRhOiBtZXRhZXZlbnRzLmZpbmQobyA9PiBvLnB1YmtleSA9PSBlbnRyeS5ldmVudC5wdWJrZXkpCiAgICAgICAgICAgIH0pCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGxvZygic2F2ZSByZXMiLCByZXN1bHRzLmxlbmd0aCwgc29ja2V0LnVybCkKICAgICAgICB1cGRhdGVjb250ZW50KHJlc3VsdHMsIHEsIGFwcGVuZCkKICAgICAgfQogICAgICAKICAgICAgbGV0IGxvYWRlZCA9IDAKICAgICAgCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZWNvbnRlbnQocmVzdWx0cywgcSwgYXBwZW5kKXsKICAgICAgICByZXN1bHRzLnJldmVyc2UoKS5mb3JFYWNoKGl0ZW0gPT4gewogICAgICAgICAgY29uc3QgdHlwZSA9IGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpICYmICJ2aWRlbyIgfHwgImltYWdlIgogICAgICAgICAgY29uc3QgdGV4dCA9IChxIHx8ICJ2aWV3IG5vdGUiKS5zdWJzdHJpbmcoLTMwKQogICAgICAgICAgY29uc3QgaWQgPSAiaXRlbV8iICsgKCsraWRjb3VudGVyKQogICAgICAgICAgY29uc3QgY29udGVudGVsZW1lbnRzID0gJzxkaXYgY2xhc3M9InR5cGUiPicgKyBxcygiI3RlbXBsYXRlIC4iICsgdHlwZSArICJzdmciKS5vdXRlckhUTUwgKyAnPC9kaXY+PGEgY2xhc3M9Imxpa2UnICsgKGl0ZW0ucmVhY3RlZCA/ICcgcmVhY3RlZCcgOiAnJykgKyAnIiBkYXRhLWl0ZW0taWQ9IicgKyBpZCArIAogICAgICAgICAgICAnIiBocmVmPSIjIj4nICsgcXMoIiN0ZW1wbGF0ZSAuaGVhcnRzdmciKS5vdXRlckhUTUwgKyAnPC9hPjxhIGNsYXNzPSJxdWVyeSIgaHJlZj0iJyArIHByb3RvY29sICsgCiAgICAgICAgICAgIGl0ZW0uYmVjaDMyaWQgKyAnIj4nICsgdGV4dCArICc8L2E+JwogICAgICAgICAgbGV0IHJvb3QgPSBudWxsCiAgICAgICAgICBsZXQgdiA9IG51bGwKICAgICAgICAgIAogICAgICAgICAgaWYoaXRlbS51cmwubWF0Y2godmlkZW9leHRyZWdleCkpewogICAgICAgICAgICByb290ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikKICAgICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJ2aWRlby1jb250YWluZXIiKQogICAgICAgICAgICByb290LmlubmVySFRNTCA9IGNvbnRlbnRlbGVtZW50cwogICAgICAgICAgICAKICAgICAgICAgICAgdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIikKICAgICAgICAgICAgdlsiZGF0YS1pdGVtLWlkIl0gPSBpZAogICAgICAgICAgICB2LnByZWxvYWQgPSAibm9uZSIKICAgICAgICAgICAgdi5sb29wID0gdHJ1ZQogICAgICAgICAgICB2LnBsYXlzaW5saW5lID0gIiIKICAgICAgICAgICAgCiAgICAgICAgICAgIHYub25jYW5wbGF5ID0gYXN5bmMgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgY29uc3QgYXNwZWN0ID0gdGhpcy52aWRlb1dpZHRoIC8gdGhpcy52aWRlb0hlaWdodAogICAgICAgICAgICAgIGlmKGFzcGVjdCA+IDEpewogICAgICAgICAgICAgICAgdGhpcy5zdHlsZS53aWR0aCA9IChhc3BlY3QgKiAxMDApICsgIiUiCiAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlLmhlaWdodCA9ICgxIC8gYXNwZWN0ICogMTAwKSArICIlIgogICAgICAgICAgICAgICAgdGhpcy5zdHlsZS5tYXJnaW5Ub3AgPSAtKCgxIC8gYXNwZWN0ICogMTAwIC0gMTAwKSAvIDIpICsgIiUiCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIAogICAgICAgICAgICAgIHVwZGF0ZXZpZGVvcGxheSh0aGlzLnBhcmVudEVsZW1lbnQpCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNvbnN0IGV4dCA9IGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpWzFdCiAgICAgICAgICAgIHYuaW5uZXJIVE1MID0gJzxzb3VyY2Ugc3JjPSInICsgaXRlbS51cmwgKyAnIiB0eXBlPSJ2aWRlby8nICsgZXh0ICsgJyI+PC9zb3VyY2U+JwogICAgICAgICAgICAKICAgICAgICAgICAgcm9vdC5hcHBlbmQodikKICAgICAgICAgIH1lbHNlIGlmKGl0ZW0udXJsLm1hdGNoKGltZ2V4dHJlZ2V4KSl7CiAgICAgICAgICAgIHJvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIikKICAgICAgICAgICAgcm9vdC5ocmVmID0gIiMiCiAgICAgICAgICAgIHJvb3QuaW5uZXJIVE1MID0gY29udGVudGVsZW1lbnRzCiAgICAgICAgICAgICAgCiAgICAgICAgICAgIGlmKHR5cGUgPT0gImltYWdlIil7CiAgICAgICAgICAgICAgLy9sZXQgaW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIikKICAgICAgICAgICAgICAvL2ltZy5hbHQgPSBpdGVtLnVybAogICAgICAgICAgICAgIHJvb3RbImRhdGEtc3JjIl0gPSBpdGVtLnVybAogICAgICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgiaW1nIikKICAgICAgICAgICAgICAvL2ltZy5jbGFzc0xpc3QuYWRkKCJkYXRhIikKICAgICAgICAgICAgICAvL3Jvb3QuYXBwZW5kKGltZykKICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgcm9vdC5pbm5lckhUTUwgKz0gJzxzcGFuIGNsYXNzPSJmaWxlIj4nICsgaXRlbS51cmwgKyAnPC9zcGFuPicKICAgICAgICAgICAgfQogICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIHJldHVybgogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICByb290LmlkID0gaWQKICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgndmlzaWJsZScpCiAgICAgICAgICByb290WyJkYXRhLWl0ZW0iXSA9IGl0ZW0KICAgICAgICAgIHJvb3RbImRhdGEtZXZlbnQiXSA9IGl0ZW0uZXZlbnQKICAgICAgICAgIHJvb3RbImRhdGEtcXVlcnkiXSA9IHEKICAgICAgICAgIHJvb3RbImRhdGEtdGV4dCJdID0gdGV4dAogICAgICAgICAgCiAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQodHlwZSkKICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgiaXRlbSIpCiAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoInNob3ciKQogICAgICAgICAgCiAgICAgICAgICBpZihpdGVtLnJlYWN0ZWQpewogICAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBxcygiI2ltYWdlcyIpW2FwcGVuZCAmJiAiYXBwZW5kIiB8fCAicHJlcGVuZCJdKHJvb3QpCiAgICAgICAgICAKICAgICAgICAgIGlmKHYpewogICAgICAgICAgICB1cGRhdGV2aWRlb3BsYXkocm9vdCkKICAgICAgICAgIH0KICAgICAgICB9KQoKICAgICAgICB1cGRhdGVpbWFnZXNsb2FkKCkKICAgICAgICAKICAgICAgICBpZihhY3RpdmUoKSA9PSBudWxsKXsKICAgICAgICAgIHFzKCIjaW1hZ2VzIC5pdGVtIik/LmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgfQogICAgICB9CgogICAgICBmdW5jdGlvbiBoaWRlbWVkaWEoKXsKICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gInNjcm9sbCIKICAgICAgICBxc2EoIiNtZWRpYS1jb250YWluZXIsICNpbWFnZSwgI21lZGlhLWZvb3RlciIpLmZvckVhY2gobiA9PiBuLmNsYXNzTGlzdC5yZW1vdmUoInZpc2libGUiKSkKICAgICAgICBnaWQoImltYWdlLWxpa2UiKS5jbGFzc0xpc3QucmVtb3ZlKCJyZWFjdGVkIikKICAgICAgICBoaWRldmlkZW8oKQogICAgICB9CgogICAgICBmdW5jdGlvbiBoaWRldmlkZW8oKXsKICAgICAgICBjb25zdCB2ID0gcXMoIiNtZWRpYS1jb250YWluZXIgdmlkZW8iKQogICAgICAgIAogICAgICAgIGlmKHYpewogICAgICAgICAgdi5tdXRlZCA9IHRydWUKICAgICAgICAgIGdpZCh2WyJkYXRhLWl0ZW0taWQiXSkuYXBwZW5kQ2hpbGQodikKICAgICAgICAgIHVwZGF0ZXZpZGVvcGxheSh2LnBhcmVudEVsZW1lbnQpCiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiB3YWl0cmVzKGtleSwgdHlwZSl7CiAgICAgICAgbGV0IHJlc2hhbmRsZXIgPSBmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpewogICAgICAgICAgdGhpcy50eXBlID0gdHlwZSB8fCAiRU9TRSIKICAgICAgICAgIHRoaXMuZXZlbnRzID0gW10KICAgICAgICAgIHRoaXMuaGFuZGxlID0gZnVuY3Rpb24ocmVzKXsKICAgICAgICAgICAgbGV0IG8gPSBKU09OLnBhcnNlKHJlcy5kYXRhKQogICAgICAgICAgICBpZihrZXkgPT0gbnVsbCB8fCBvWzFdID09IGtleSl7CiAgICAgICAgICAgICAgaWYob1swXSA9PSB0aGlzLnR5cGUpewogICAgICAgICAgICAgICAgcmVzb2x2ZShbdGhpcy5ldmVudHMsIG9dKQogICAgICAgICAgICAgICAgcmVzaGFuZGxlcnMuc3BsaWNlKHJlc2hhbmRsZXJzLmluZGV4T2YodGhpcyksIDEpCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIHRoaXMuZXZlbnRzLnB1c2gob1syXSkKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gewogICAgICAgICAgbGV0IGhhbmRsZXIgPSBuZXcgcmVzaGFuZGxlcihyZXNvbHZlLCByZWplY3QpCiAgICAgICAgICByZXNoYW5kbGVycy5wdXNoKGhhbmRsZXIpCiAgICAgICAgfSkKICAgICAgfQogICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGNoZWNrdXBkYXRlKHNvY2tldCl7CiAgICAgICAgY29uc3QgdXBkYXRlc3JlcyA9IGF3YWl0IHF1ZXJ5cHVia2V5KHNvY2tldCwgdXBkYXRlc3B1YmtleSkKICAgICAgICBjb25zdCB1cGRhdGVub3RlID0gdXBkYXRlc3Jlcy5maW5kKG4gPT4gbi5jb250ZW50Lm1hdGNoKC9eaHR0cHNcOlwvXC8vKSkKICAgICAgICAKICAgICAgICBpZighdXBkYXRlbm90ZSl7CiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QgYWdlID0gTWF0aC5yb3VuZCgoRGF0ZS5ub3coKSAvIDEwMDAgLSB1cGRhdGVub3RlLmNyZWF0ZWRfYXQpIC8gMzYwMCAvIDI0KQogICAgICAgIGNvbnN0IG5vdGVpZCA9IGJlY2gzMi5lbmNvZGUoIm5vdGUiLCBmcm9tSGV4U3RyaW5nKHVwZGF0ZW5vdGUuaWQpKQogICAgICAgIHFzKCIjcmVsZWFzZSIpLmhyZWYgPSBwcm90b2NvbCArIG5vdGVpZAogICAgICAgIHFzKCIjcmVsZWFzZSIpLmlubmVyVGV4dCA9IChhZ2UgPT0gMCAmJiAidG9kYXkiIHx8IGFnZSArICIgZGF5KHMpIGFnbyIpCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHNsZWVwKG1zKXsKICAgICAgICByZXR1cm4gbmV3IGZ1bmN0aW9uKCl7CiAgICAgICAgICBsZXQgdGltZW91dCA9IG51bGwKICAgICAgICAgIGxldCByID0gbnVsbAogICAgICAgICAgCiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICBwcm9taXNlOiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpewogICAgICAgICAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHJlc29sdmUoKSwgbXMpCiAgICAgICAgICAgICAgciA9IHJlc29sdmUKICAgICAgICAgICAgfSksCiAgICAgICAgICAgIHJlc29sdmU6IGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpCiAgICAgICAgICAgICAgcigpCiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHNob3coaWQpewogICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAiaGlkZGVuIgogICAgICAgIGNvbnN0IGl0ZW0gPSBnaWQoaWQpWyJkYXRhLWl0ZW0iXQogICAgICAgIGNvbnN0IG1lZGlhID0gZ2lkKCJtZWRpYS1jb250YWluZXIiKQogICAgICAgIGNvbnN0IGltYWdlID0gZ2lkKCJpbWFnZSIpCgogICAgICAgIGlmKGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpKXsKICAgICAgICAgIGltYWdlLmNsYXNzTGlzdC5yZW1vdmUoInZpc2libGUiKQogICAgICAgICAgY29uc3QgdiA9IGdpZChpZCkucXVlcnlTZWxlY3RvcigidmlkZW8iKQogICAgICAgICAgcXMoIiNtZWRpYS1jb250YWluZXIiKS5hcHBlbmRDaGlsZCh2KQogICAgICAgICAgdi5tdXRlZCA9IGZhbHNlCiAgICAgICAgICB2LnBsYXkoKQogICAgICAgIH1lbHNlewogICAgICAgICAgaW1hZ2Uuc3JjID0gaXRlbS51cmwKICAgICAgICAgIGltYWdlLmNsYXNzTGlzdC5hZGQoInZpc2libGUiKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihpdGVtLm1ldGEpewogICAgICAgICAgY29uc3QgbWV0YWNvbnRlbnQgPSBKU09OLnBhcnNlKGl0ZW0ubWV0YS5jb250ZW50KQogICAgICAgICAgY29uc3QgbmFtZSA9IG1ldGFjb250ZW50LmRpc3BsYXlfbmFtZSB8fCBtZXRhY29udGVudC5uYW1lCiAgICAgICAgICBxcygiI2ltYWdlLXVzZXIiKS5jbGFzc0xpc3QuYWRkKCJ2aXNpYmxlIikKICAgICAgICAgIHFzKCIjaW1hZ2UtdXNlciIpLmhyZWYgPSBwcm90b2NvbCArIGJlY2gzMi5lbmNvZGUoIm5wdWIiLCBmcm9tSGV4U3RyaW5nKGl0ZW0ubWV0YS5wdWJrZXkpKQogICAgICAgICAgcXMoIiNpbWFnZS11c2VyIikuaW5uZXJUZXh0ID0gbmFtZQogICAgICAgIH1lbHNlewogICAgICAgICAgcXMoIiNpbWFnZS11c2VyIikuY2xhc3NMaXN0LnJlbW92ZSgidmlzaWJsZSIpCiAgICAgICAgfQoKICAgICAgICBnaWQoImltYWdlLWxpa2UiKVsiZGF0YS1pdGVtLWlkIl0gPSBpZAogICAgICAgIGdpZCgibWVkaWEtZm9vdGVyIilbImRhdGEtZXZlbnQiXSA9IGl0ZW0uZXZlbnQKCiAgICAgICAgaWYoaXRlbS5yZWFjdGVkKXsKICAgICAgICAgIGdpZCgiaW1hZ2UtbGlrZSIpLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBhID0gcXMoIiNpbWFnZS1xdWVyeSIpCiAgICAgICAgYS5ocmVmID0gcHJvdG9jb2wgKyBpdGVtLmJlY2gzMmlkCiAgICAgICAgYS5pbm5lclRleHQgPSBnaWQoaWQpWyJkYXRhLXRleHQiXQogICAgICAgIAogICAgICAgIGdpZCgibWVkaWEtY29udGFpbmVyIikuY2xhc3NMaXN0LmFkZCgidmlzaWJsZSIpCiAgICAgICAgZ2lkKCJtZWRpYS1mb290ZXIiKS5jbGFzc0xpc3QuYWRkKCJ2aXNpYmxlIikKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gY29ubmNvdW50KCl7CiAgICAgICAgcmV0dXJuIHNvY2tldHMuZmlsdGVyKHIgPT4gci5yZWFkeVN0YXRlID09IDEpLmxlbmd0aAogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBkaXNjb25uZWN0KCl7CiAgICAgICAgZm9yKGxldCBzb2NrZXQgb2Ygc29ja2V0cyl7CiAgICAgICAgICBzb2NrZXQuY2xvc2UoKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBzb2NrZXRzLnNwbGljZSgwKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBsb2cobXNnKXsKICAgICAgICBsZXQgc2Nyb2xsID0gcXMoIiNsb2dzIikuc2Nyb2xsVG9wID09IHFzKCIjbG9ncyIpLnNjcm9sbFRvcE1heAogICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpCiAgICAgICAgZGl2LmlubmVyVGV4dCA9IEFycmF5LmZyb20oYXJndW1lbnRzKS5qb2luKCIgIikKICAgICAgICBxcygiI2xvZ3MiKS5hcHBlbmQoZGl2KQogICAgICAgIAogICAgICAgIHNjcm9sbCAmJiBxcygiI2xvZ3MiKS5zY3JvbGxUbygwLCBxcygiI2xvZ3MiKS5zY3JvbGxUb3BNYXgpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGNvbm5lY3QodXJsKXsKICAgICAgICBsb2coImNvbm5lY3RpbmciLCB1cmwpCiAgICAgICAgbGV0IHNvY2tldCA9IG5ldyBXZWJTb2NrZXQodXJsKQogICAgICAgIAogICAgICAgIHNvY2tldC5vbm1lc3NhZ2UgPSBtZXNzYWdlID0+IHJlc2hhbmRsZXJzLmZvckVhY2gocmggPT4gcmguaGFuZGxlKG1lc3NhZ2UpKQogICAgICAgIAogICAgICAgIHNvY2tldC5vbmNsb3NlID0gYXN5bmMgZnVuY3Rpb24oKXsKICAgICAgICAgIHNvY2tldHMuc3BsaWNlKHNvY2tldHMuaW5kZXhPZihzb2NrZXQpLCAxKQogICAgICAgICAgcXMoIiNjb25uY291bnQiKS5pbm5lclRleHQgPSBjb25uY291bnQoKSArIChwcmltYWxzb2NrZXQgJiYgMSkKICAgICAgICAgIGxvZygiZGlzY29ubmVjdGVkIiwgdGhpcy51cmwsIGNvbm5jb3VudCgpKQogICAgICAgICAgYXdhaXQgc2xlZXAoMTAwMCkucHJvbWlzZQogICAgICAgICAgY29ubmVjdCh0aGlzLnVybCkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgc29ja2V0Lm9ub3BlbiA9IGZ1bmN0aW9uKCl7CiAgICAgICAgICBxcygiI2Nvbm5jb3VudCIpLmlubmVyVGV4dCA9IGNvbm5jb3VudCgpICsgKHByaW1hbHNvY2tldCAmJiAxKQogICAgICAgICAgbG9nKCJjb25uZWN0ZWQiLCB0aGlzLnVybCwgY29ubmNvdW50KCkpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybiBzb2NrZXQKICAgICAgfQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsIGFzeW5jICgpID0+IHsKICAgICAgICBwcmltYWxzb2NrZXQgPSBjb25uZWN0KCJ3c3M6Ly9jYWNoZTMucHJpbWFsLm5ldC9jYWNoZTE3IikKICAgICAgICBwcmltYWxzb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcigib3BlbiIsIGZ1bmN0aW9uKCl7CiAgICAgICAgICBwcmltYWxnbG9iYWwodGhpcykKICAgICAgICB9KQogICAgICAgIAogICAgICAgIHByaW1hbHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsIGZ1bmN0aW9uKCl7CiAgICAgICAgICBwcmltYWxzb2NrZXQgPSBudWxsCiAgICAgICAgfSkKICAgICAgICAKICAgICAgICBmb3IobGV0IHVybCBvZiByZWxheXMoKSl7CiAgICAgICAgICBjb25zdCBzb2NrZXQgPSBjb25uZWN0KHVybCkKICAgICAgICAgIHNvY2tldHMucHVzaChzb2NrZXQpCiAgICAgICAgICAKICAgICAgICAgIHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCJvcGVuIiwgZnVuY3Rpb24oKXsKICAgICAgICAgICAgY2hlY2t1cGRhdGUodGhpcykKICAgICAgICAgICAgcXVlcnkodGhpcykKICAgICAgICAgIH0pCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGF3YWl0IHNsZWVwKDEwMCkucHJvbWlzZQogICAgICAgIAogICAgICAgIGlmKGhhc2tleSgpKXsKICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgibm9zdHIiKQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGZvcihsZXQgYyBvZiBjb2xvcHRzKXsKICAgICAgICBkb2N1bWVudC53cml0ZSgnPHN0eWxlPicgKyBjb2xzY3NzLmlubmVyVGV4dC5yZXBsYWNlKC9cJFx7Y29sc1x9L2csIGMpICsgJzwvc3R5bGU+JykKICAgICAgfQogICAgPC9zY3JpcHQ+CiAgPC9ib2R5Pgo8L2h0bWw+Cg==

https://ipfs.io/ipfs/QmUdZ1sToX6AyBqVm8jqShwC11QcJfY76SoajFiXDHajRA

sha256

8ab2abbc0b599f4ff599e78ec384f1662f1ea2eeebb1e4fd8d3aeaa07fa0d125 files.html

base64

PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgdXNlci1zY2FsYWJsZT1ubyIvPgogICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL3N2Z2ljb25zLnNwYXJray5mci9zdmdpY29ucy5jc3MiLz4KICAgIDxzdHlsZT4KICAgICAgKiB7CiAgICAgICAgb3ZlcnNjcm9sbC1iZWhhdmlvci15OiBjb250YWluOwogICAgICB9CiAgICAgIAogICAgICBib2R5IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB3aWR0aDogMTAwdnc7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIGZvbnQtZmFtaWx5OiAiTm90byBTZXJpZiI7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXksIAogICAgICAjaGVhZGVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLAogICAgICAjbG9ncywgCiAgICAgICNwcml2a2V5IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMThlbTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLAogICAgICAjbG9ncyB7CiAgICAgICAgaGVpZ2h0OiA2ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNsb2dzIHsKICAgICAgICBoZWlnaHQ6IDhlbTsKICAgICAgICBvdmVyZmxvdzogc2Nyb2xsOwogICAgICAgIGZvbnQtc2l6ZTogLjhlbTsKICAgICAgfQogICAgICAKICAgICAgc2VsZWN0IHsKICAgICAgICB3aWR0aDogNGVtOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLCAKICAgICAgaW5wdXQuc3VibWl0IHsKICAgICAgICBib3JkZXItcmFkaXVzOiAuNWVtOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnlkaXNwbGF5IC50ZXh0LCAKICAgICAgI2hlYWRlciBhLAogICAgICAjbWVkaWEtY29udGFpbmVyIHsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQoKICAgICAgI2hlYWRlciBhLCAKICAgICAgZm9ybSwgCiAgICAgICNxdWVyeWRpc3BsYXkgewogICAgICAgIHotaW5kZXg6IDE7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CiAgICAgIAogICAgICBAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDMwZW0pIHsKICAgICAgICAjcXVlcnlkaXNwbGF5IHsKICAgICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgfQogICAgICB9CgogICAgICBmb3JtIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeSB7CiAgICAgICAgd2lkdGg6IDZlbTsKICAgICAgfQogICAgICAKICAgICAgI2xvYWRpbmcgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMHB4OwogICAgICAgIGxlZnQ6IDI3ZW07CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgIGEgewogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgfQoKICAgICAgdmlkZW8gewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogIAogICAgICAjbWVkaWEtY29udGFpbmVyIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgIGhlaWdodDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgIG1hcmdpbi10b3A6IDAgIWltcG9ydGFudDsKICAgICAgfQogICAgICAKICAgICAgLnR5cGUgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICB6LWluZGV4OiAxOwogICAgICB9CiAgICAgIAogICAgICAjaW1hZ2UtcXVlcnkgewogICAgICAgIHdpZHRoOiA1ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXksCiAgICAgIGEsCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgY29sb3I6ICM5OTk7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXkgewogICAgICAgIHBhZGRpbmc6IDAgMWVtOwogICAgICB9CgogICAgICAjcXVlcnlkaXNwbGF5IC50ZXh0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgbWluLXdpZHRoOiAzZW07CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgI2hlYWRlciBhLAogICAgICAjaGVhZGVyIHNwYW4gewogICAgICAgIHBhZGRpbmc6IDAuNWVtOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CgogICAgICAjaGVhZGVyIHsKICAgICAgICBwYWRkaW5nOiAwLjQ1ZW0gMDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CgogICAgICAjaGVhZGVyIC5pdGVtcyB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgLml0ZW1zIHsKICAgICAgICBtYXJnaW4tdG9wOiAuM2VtOwogICAgICB9CgogICAgICBwIHsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICB9CiAgICAgIAogICAgICAubGFiZWwgewogICAgICAgIHBhZGRpbmc6IC44ZW0gLjhlbSAuOGVtIDA7CiAgICAgIH0KCiAgICAgICNpbWFnZXMgLnF1ZXJ5IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KCiAgICAgICNtZWRpYS1jb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwKTsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHotaW5kZXg6IDQ7CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZS1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlIHsKICAgICAgICBtYXgtd2lkdGg6IDEwMHZ3OwogICAgICAgIG1heC1oZWlnaHQ6IDEwMHZoOwogICAgICB9CiAgICAgICAgCiAgICAgICNpbWFnZXMgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZXMgLml0ZW0gewogICAgICAgIHdpZHRoOiAyNXZ3OwogICAgICB9CgogICAgICAjaW1hZ2VzIC5pdGVtIHsKICAgICAgICBoZWlnaHQ6IDI1dnc7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgI21lZGlhLWNvbnRhaW5lciB2aWRlbyB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgfQogICAgICAKICAgICAgYm9keTpub3QoLm5vc3RyKSAjZmlsdGVyLWxpa2VzLCAKICAgICAgLmZpbHRlci1saWtlcyAjaW1hZ2VzID4gLml0ZW06bm90KC5yZWFjdGVkKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNpbWFnZS1xdWVyeSwKICAgICAgI2ltYWdlLXVzZXIgewogICAgICAgIHotaW5kZXg6IDI7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDN2dzsKICAgICAgfQogICAgICAKICAgICAgLnF1ZXJ5LCAKICAgICAgLmxpa2UgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBwYWRkaW5nOiAwIDF2dzsKICAgICAgfQogICAgICAKICAgICAgLnF1ZXJ5LCAKICAgICAgLmxpa2UsIAogICAgICAjaW1hZ2UtcXVlcnksIAogICAgICAudmlkZW9zdmcsCiAgICAgIC5pbWFnZXN2ZyB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjYpOwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNpbWFnZS1xdWVyeSB7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGZvbnQtc2l6ZTogbWluKDMuNXZ3LCAxLjVlbSk7CiAgICAgICAgbWF4LXdpZHRoOiA1ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZS1xdWVyeSB7CiAgICAgICAgcGFkZGluZzogLjZlbSAuNGVtIC4xZW0gLjRlbTsKICAgICAgICBtYXgtd2lkdGg6IDVlbTsKICAgICAgfQogICAgICAKICAgICAgLmxpa2UucmVhY3RlZCwKICAgICAgLmZpbHRlci1saWtlcyAjZmlsdGVyLWxpa2VzIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZWQ7CiAgICAgIH0KCiAgICAgICNpbWFnZS1xdWVyeSwKICAgICAgI2ltYWdlLXVzZXIgewogICAgICAgIGZvbnQtc2l6ZTogM2VtOwogICAgICB9CiAgICAgIAogICAgICAjaW1hZ2UtcXVlcnksCiAgICAgICNpbWFnZS11c2VyLAogICAgICAjbWVkaWEtZm9vdGVyIC5saWtlIHsKICAgICAgICB6LWluZGV4OiA1OwogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlLXF1ZXJ5LAogICAgICAjaW1hZ2UtdXNlciB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgICNpbWFnZS11c2VyIHsKICAgICAgICBib3R0b206IDEuOWVtOwogICAgICAgIGZvbnQtc2l6ZTogMS44ZW07CiAgICAgICAgcGFkZGluZy1yaWdodDogLjY1ZW07CiAgICAgICAgbWF4LXdpZHRoOiA4ZW07CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgIH0KICAgICAgCiAgICAgIC5saWtlIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IGF1dG87CiAgICAgICAgcGFkZGluZzogLjJlbTsKICAgICAgICB3aWR0aDogMWVtOwogICAgICAgIGhlaWdodDogMWVtOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5ub3N0ciAubGlrZSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7ICAKICAgICAgfQoKICAgICAgI21lZGlhLWZvb3RlciAubGlrZSB7CiAgICAgICAgZm9udC1zaXplOiAyLjRlbTsKICAgICAgfQoKICAgICAgI21lZGlhLWZvb3RlciB7CiAgICAgICAgZGlzcGxheTogbm9uZTsgIAogICAgICB9CiAgCiAgICAgICNpbWFnZXMgLmltZyB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIGJhY2tncm91bmQtc2l6ZTogY292ZXI7CiAgICAgICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIC5hY3RpdmUgewogICAgICAgIGJhY2tncm91bmQ6ICM0NDQ7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZXMgPiAuYWN0aXZlIHsKICAgICAgICBvdXRsaW5lOiAuM2VtIHNvbGlkIGdyZWVuOwogICAgICAgIHotaW5kZXg6IDE7CiAgICAgIH0KCiAgICAgIC5oZWFydHN2ZyBwYXRoLAogICAgICAuaGVhZGVyLWljb24gc3ZnIHBhdGggewogICAgICAgIHN0cm9rZTogI2ZmZjsKICAgICAgfQogIAogICAgICAudmlkZW9zdmcsCiAgICAgIC5pbWFnZXN2ZyB7CiAgICAgICAgd2lkdGg6IGNhbGMobWluKDR2dywgMmVtKSk7CiAgICAgICAgaGVpZ2h0OiBjYWxjKG1pbig0dncsIDJlbSkpOwogICAgICAgIHBhZGRpbmc6IDAgLjJlbTsKICAgICAgfQogICAgICAKICAgICAgLnZpZGVvc3ZnIHBhdGgsCiAgICAgIC5pbWFnZXN2ZyBwYXRoIHsKICAgICAgICBmaWxsOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICBhI21lbnUsIAogICAgICAuaGVhZGVyLWljb24gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG1hcmdpbi10b3A6IC0uM2VtOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgIH0KCiAgICAgIC5pY29ucyB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIHotaW5kZXg6IDI7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgfQogICAgICAKICAgICAgYSNtZW51IHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBwYWRkaW5nOiAwIC4zZW0gMCAuNWVtOwogICAgICAgIGhlaWdodDogMi4xZW07CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgLmhlYWRlci1pY29uIHsKICAgICAgICBwYWRkaW5nOiAuMmVtOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICB3aWR0aDogMS41ZW07CiAgICAgICAgaGVpZ2h0OiAxLjVlbTsKICAgICAgICBtYXJnaW46IC4xZW0gLjVlbTsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgIH0KICAgICAgCiAgICAgIC5oZWFkZXItaWNvbiBzdmcgewogICAgICAgIHdpZHRoOiAxLjVlbTsKICAgICAgICBoZWlnaHQ6IDEuNWVtOwogICAgICB9CiAgICAgICAKICAgICAgLm1lbnVzdmcgewogICAgICAgIHdpZHRoOiAyZW07CiAgICAgICAgaGVpZ2h0OiAyZW07CiAgICAgIH0KCiAgICAgIC5tZW51c3ZnIHBhdGggewogICAgICAgIGZpbGw6ICNmZmY7CiAgICAgIH0KCiAgICAgICNtZW51LWNvbnRlbnQgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgICB3aWR0aDogMThlbTsKICAgICAgICBtYXJnaW4tbGVmdDogLTE4ZW07CiAgICAgICAgYmFja2dyb3VuZDogIzIyMjsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgei1pbmRleDogMzsgCiAgICAgICAgb3ZlcmZsb3c6IHNjcm9sbDsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudC52aXNpYmxlIHsKICAgICAgICBtYXJnaW4tbGVmdDogMDsKICAgICAgfQogICAgICAKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgewogICAgICAgIHBhZGRpbmc6IDAgMWVtIDFlbSAxZW07CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIGEsCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgcGFkZGluZzogLjVlbSAuN2VtOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgICB9CgogICAgICAjb3ZlcmxheSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICB6LWluZGV4OiAzOwogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICBvcGFjaXR5OiAuNTsKICAgICAgfQoKICAgICAgLnZpc2libGUgewogICAgICAgIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgCiAgICAgICNzaGFyZS1kaWFsb2cgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHdpZHRoOiBjYWxjKDEwMHZ3IC0gNGVtKTsKICAgICAgICBoZWlnaHQ6IDUwJTsKICAgICAgICBiYWNrZ3JvdW5kOiAjZmZmOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDFlbTsKICAgICAgICB6LWluZGV4OiA0OwogICAgICAgIG1hcmdpbi1sZWZ0OiAyZW07CiAgICAgICAgbWFyZ2luLXRvcDogMmVtOwogICAgICAgIHBhZGRpbmc6IDFlbTsKICAgICAgfQogICAgICAKICAgICAgaDIgewogICAgICAgIG1hcmdpbi10b3A6IDA7CiAgICAgIH0KICAgICAgCiAgICAgIHN2ZyB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgICN0ZW1wbGF0ZSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8ZGl2IGlkPSJ0ZW1wbGF0ZSI+CiAgICAgIDxzdmcgY2xhc3M9ImhlYXJ0c3ZnIHN2Zy1pY29uIiB2aWV3Qm94PSIwIDAgMjAgMjAiPgogICAgICAgIDxwYXRoIGQ9Ik05LjcxOSwxNy4wNzNsLTYuNTYyLTYuNTFjLTAuMjctMC4yNjgtMC41MDQtMC41NjctMC42OTYtMC44ODhDMS4zODUsNy44OSwxLjY3LDUuNjEzLDMuMTU1LDQuMTRjMC44NjQtMC44NTYsMi4wMTItMS4zMjksMy4yMzMtMS4zMjljMS45MjQsMCwzLjExNSwxLjEyLDMuNjEyLDEuNzUyYzAuNDk5LTAuNjM0LDEuNjg5LTEuNzUyLDMuNjEyLTEuNzUyYzEuMjIxLDAsMi4zNjksMC40NzIsMy4yMzMsMS4zMjljMS40ODQsMS40NzMsMS43NzEsMy43NSwwLjY5Myw1LjUzN2MtMC4xOSwwLjMyLTAuNDI1LDAuNjE4LTAuNjk1LDAuODg3bC02LjU2Miw2LjUxQzEwLjEyNSwxNy4yMjksOS44NzUsMTcuMjI5LDkuNzE5LDE3LjA3MyBNNi4zODgsMy42MUM1LjM3OSwzLjYxLDQuNDMxLDQsMy43MTcsNC43MDdDMi40OTUsNS45MiwyLjI1OSw3Ljc5NCwzLjE0NSw5LjI2NWMwLjE1OCwwLjI2NSwwLjM1MSwwLjUxLDAuNTc0LDAuNzMxTDEwLDE2LjIyOGw2LjI4MS02LjIzMmMwLjIyNC0wLjIyMSwwLjQxNi0wLjQ2NiwwLjU3My0wLjcyOWMwLjg4Ny0xLjQ3MiwwLjY1MS0zLjM0Ni0wLjU3MS00LjU2QzE1LjU3LDQsMTQuNjIxLDMuNjEsMTMuNjEyLDMuNjFjLTEuNDMsMC0yLjYzOSwwLjc4Ni0zLjI2OCwxLjg2M2MtMC4xNTQsMC4yNjQtMC41MzYsMC4yNjQtMC42OSwwQzkuMDI5LDQuMzk3LDcuODIsMy42MSw2LjM4OCwzLjYxIj48L3BhdGg+CiAgICAgIDwvc3ZnPgogICAgICA8c3ZnIGNsYXNzPSJ2aWRlb3N2ZyBzdmctaWNvbiIgdmlld0JveD0iMCAwIDIwIDIwIj4KCQkJCTxwYXRoIGQ9Ik0xOC4xNzUsNC4xNDJIMS45NTFDMS43MDMsNC4xNDIsMS41LDQuMzQ0LDEuNSw0LjU5MnYxMC44MTZjMCwwLjI0NywwLjIwMywwLjQ1LDAuNDUxLDAuNDVoMTYuMjI0YzAuMjQ3LDAsMC40NS0wLjIwMywwLjQ1LTAuNDVWNC41OTJDMTguNjI1LDQuMzQ0LDE4LjQyMiw0LjE0MiwxOC4xNzUsNC4xNDIgTTQuNjU1LDE0Ljk1N0gyLjQwMXYtMS44MDNoMi4yNTNWMTQuOTU3ek00LjY1NSwxMi4yNTRIMi40MDF2LTEuODAzaDIuMjUzVjEyLjI1NHogTTQuNjU1LDkuNTQ5SDIuNDAxVjcuNzQ3aDIuMjUzVjkuNTQ5eiBNNC42NTUsNi44NDZIMi40MDFWNS4wNDNoMi4yNTNWNi44NDZ6TTE0LjU2OSwxNC45NTdINS41NTZWNS4wNDNoOS4wMTNWMTQuOTU3eiBNMTcuNzI0LDE0Ljk1N2gtMi4yNTN2LTEuODAzaDIuMjUzVjE0Ljk1N3ogTTE3LjcyNCwxMi4yNTRoLTIuMjUzdi0xLjgwM2gyLjI1M1YxMi4yNTR6TTE3LjcyNCw5LjU0OWgtMi4yNTNWNy43NDdoMi4yNTNWOS41NDl6IE0xNy43MjQsNi44NDZoLTIuMjUzVjUuMDQzaDIuMjUzVjYuODQ2eiI+PC9wYXRoPgoJCQk8L3N2Zz4KCQkJPHN2ZyBjbGFzcz0iaW1hZ2Vzdmcgc3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CgkJCQk8cGF0aCBkPSJNMTguNTU1LDE1LjM1NFY0LjU5MmMwLTAuMjQ4LTAuMjAyLTAuNDUxLTAuNDUtMC40NTFIMS44ODhjLTAuMjQ4LDAtMC40NTEsMC4yMDMtMC40NTEsMC40NTF2MTAuODA4YzAsMC41NTksMC43NTEsMC40NTEsMC40NTEsMC40NTFoMTYuMjE3aDAuMDA1QzE4Ljc5MywxNS44NTEsMTguNDc4LDE0LjgxNCwxOC41NTUsMTUuMzU0IE0yLjgsMTQuOTQ5bDQuOTQ0LTYuNDY0bDQuMTQ0LDUuNDE5YzAuMDAzLDAuMDAzLDAuMDAzLDAuMDAzLDAuMDAzLDAuMDA1bDAuNzk3LDEuMDRIMi44eiBNMTMuODIyLDE0Ljk0OWwtMS4wMDYtMS4zMTdsMS42ODktMi4yMThsMi42ODgsMy41MzVIMTMuODIyeiBNMTcuNjU0LDE0LjA2NGwtMi43OTEtMy42NjZjLTAuMTgxLTAuMjM3LTAuNTM1LTAuMjM3LTAuNzE2LDBsLTEuODk5LDIuNDkzbC00LjE0Ni01LjQyYy0wLjE4LTAuMjM3LTAuNTM2LTAuMjM3LTAuNzE2LDBsLTUuMDQ3LDYuNTk4VjUuMDQyaDE1LjMxNlYxNC4wNjR6IE0xMi40NzQsNi4zOTNjLTAuODY5LDAtMS41NzcsMC43MDctMS41NzcsMS41NzZzMC43MDgsMS41NzYsMS41NzcsMS41NzZzMS41NzctMC43MDcsMS41NzctMS41NzZTMTMuMzQzLDYuMzkzLDEyLjQ3NCw2LjM5MyBNMTIuNDc0LDguNjQ1Yy0wLjM3MSwwLTAuNjc2LTAuMzA0LTAuNjc2LTAuNjc2czAuMzA1LTAuNjc2LDAuNjc2LTAuNjc2YzAuMzcyLDAsMC42NzYsMC4zMDQsMC42NzYsMC42NzZTMTIuODQ2LDguNjQ1LDEyLjQ3NCw4LjY0NSI+PC9wYXRoPgoJCQk8L3N2Zz4KICAgICAgPGRpdiBpZD0iY29sc2NzcyI+CiAgICAgIC5jb2xzJHtjb2xzfSAjaW1hZ2VzIC5pdGVtIHsKICAgICAgICB3aWR0aDogY2FsYygxMDB2dyAvICR7Y29sc30pOwogICAgICB9CgogICAgICAuY29scyR7Y29sc30gI2ltYWdlcyAuaXRlbSB7CiAgICAgICAgaGVpZ2h0OiBjYWxjKDEwMHZ3IC8gJHtjb2xzfSk7CiAgICAgIH0KICAgICAgCiAgICAgIC5jb2xzJHtjb2xzfSAucXVlcnksCiAgICAgIC5jb2xzJHtjb2xzfSAubGlrZSB7CiAgICAgICAgZm9udC1zaXplOiBtaW4oMTR2dyAqICgxIC8gJHtjb2xzfSksIDZlbSAqICgxIC8gJHtjb2xzfSkpCiAgICAgIH0KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9InNoYXJlLWRpYWxvZyIgY2xhc3M9ImRpYWxvZyI+CiAgICAgIDxoMj5zaGFyZTwvaDI+CiAgICAgIDxmb3JtIGlkPSJzaGFyZS1mb3JtIiBhY3Rpb249IiMiPgogICAgICAgIDxwIGNsYXNzPSJjb250ZW50Ij48L3A+CiAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgY2xhc3M9InN1Ym1pdCIgdmFsdWU9Im9rIi8+CiAgICAgIDwvZm9ybT4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0ibWVkaWEtZm9vdGVyIj4KICAgICAgPGEgaWQ9ImltYWdlLWxpa2UiIGNsYXNzPSJsaWtlIiBocmVmPSIjIj48L2E+CiAgICAgIDxhIGlkPSJpbWFnZS1xdWVyeSIgaHJlZj0iIyI+PC9hPgogICAgICA8YSBpZD0iaW1hZ2UtdXNlciIgaHJlZj0iIyI+PC9hPgogICAgPC9kaXY+CiAgICA8Y2VudGVyIGlkPSJtZWRpYS1jb250YWluZXIiPgogICAgICA8ZGl2IGlkPSJpbWFnZS1jb250YWluZXIiPgogICAgICAgIDxpbWcgaWQ9ImltYWdlIi8+CiAgICAgIDwvZGl2PgogICAgPC9jZW50ZXI+CiAgICA8ZGl2IGlkPSJvdmVybGF5IiBjbGFzcz0iZGlhbG9nIj48L2Rpdj4KICAgIDxkaXYgaWQ9Im1lbnUtY29udGVudCIgY2xhc3M9ImRpYWxvZyI+CiAgICAgIDxkaXYgY2xhc3M9Iml0ZW1zIj4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+YXV0b3BsYXk8L2Rpdj4KICAgICAgICA8YSBjbGFzcz0ic2V0YXV0b3BsYXkiIGRhdGEtYXV0b3BsYXk9Im9uIiBocmVmPSIjIj5vbjwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0YXV0b3BsYXkiIGRhdGEtYXV0b3BsYXk9Im9mZiIgaHJlZj0iIyI+b2ZmPC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRhdXRvcGxheSIgZGF0YS1hdXRvcGxheT0iaG92ZXIiIGhyZWY9IiMiPm1vdXNlb3ZlcjwvYT4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+Y29sdW1uczwvZGl2PgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjEiIGhyZWY9IiMiPjE8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iMiIgaHJlZj0iIyI+MjwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSI0IiBocmVmPSIjIj40PC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjYiIGhyZWY9IiMiPjY8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iMTAiIGhyZWY9IiMiPjEwPC9hPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5jb25uZWN0aW9uczwvZGl2PgogICAgICAgIDxkaXYgaWQ9ImNvbm5jb3VudCI+MDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5yZWxheXM6PC9kaXY+CiAgICAgICAgPHA+UGxlYXNlIHVzZSByZWxheXMgd2l0aCBOSVAtNTAgKHNlYXJjaCkgZnVuY3Rpb25hbGl0eTwvcD4KICAgICAgICA8Zm9ybSBhY3Rpb249IiMiIGlkPSJyZWxheXMtZm9ybSI+CiAgICAgICAgICA8dGV4dGFyZWEgaWQ9InJlbGF5cyI+PC90ZXh0YXJlYT4KICAgICAgICAgIDxpbnB1dCBjbGFzcz0ic3VibWl0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJzYXZlIHJlbGF5cyIvPgogICAgICAgIDwvZm9ybT4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+cHJpdmF0ZSBrZXk6PC9kaXY+CiAgICAgICAgPHA+SWYgeW91IGNhbnQgdXNlIGJyb3dzZXIgYWRkb24gKG1vYmlsZSk8L3A+CiAgICAgICAgPGZvcm0gYWN0aW9uPSIjIiBpZD0icHJpdmtleS1mb3JtIj4KICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0icHJpdmtleSIvPgogICAgICAgICAgPGlucHV0IGNsYXNzPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9InNhdmUga2V5Ii8+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5sb2dzPC9kaXY+CiAgICAgICAgPGRpdiBpZD0ibG9ncyI+PC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmxhdGVzdCByZWxlYXNlOjwvZGl2PgogICAgICAgIDxhIGlkPSJyZWxlYXNlIiBocmVmPSIjIj48L2E+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJoZWFkZXIiPgogICAgICA8ZGl2IGNsYXNzPSJpY29ucyI+CiAgICAgICAgPGEgaWQ9ImZpbHRlci1saWtlcyIgaHJlZj0iIyIgY2xhc3M9ImhlYWRlci1pY29uIj48L2E+CiAgICAgICAgPGEgaWQ9InNoYXJlIiBocmVmPSIjIiBjbGFzcz0iaGVhZGVyLWljb24iPgogICAgICAgICAgPHN2ZyBjbGFzcz0ic3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CgkJCQkgICAgPHBhdGggZD0iTTE0LjY4LDEyLjYyMWMtMC45LDAtMS43MDIsMC40My0yLjIxNiwxLjA5bC00LjU0OS0yLjYzN2MwLjI4NC0wLjY5MSwwLjI4NC0xLjQ1NywwLTIuMTQ2bDQuNTQ5LTIuNjM4YzAuNTE0LDAuNjYxLDEuMzE1LDEuMDksMi4yMTYsMS4wOWMxLjU0OSwwLDIuODA5LTEuMjYsMi44MDktMi44MDhjMC0xLjU0OC0xLjI2LTIuODA5LTIuODA5LTIuODA5Yy0xLjU0OCwwLTIuODA4LDEuMjYtMi44MDgsMi44MDljMCwwLjM4LDAuMDc2LDAuNzQxLDAuMjE0LDEuMDczbC00LjU1LDIuNjM4Yy0wLjUxNS0wLjY2MS0xLjMxNi0xLjA5LTIuMjE3LTEuMDljLTEuNTQ4LDAtMi44MDgsMS4yNi0yLjgwOCwyLjgwOXMxLjI2LDIuODA4LDIuODA4LDIuODA4YzAuOSwwLDEuNzAyLTAuNDMsMi4yMTctMS4wOWw0LjU1LDIuNjM3Yy0wLjEzOCwwLjMzMi0wLjIxNCwwLjY5My0wLjIxNCwxLjA3NGMwLDEuNTQ5LDEuMjYsMi44MDksMi44MDgsMi44MDljMS41NDksMCwyLjgwOS0xLjI2LDIuODA5LTIuODA5UzE2LjIyOSwxMi42MjEsMTQuNjgsMTIuNjIxTTE0LjY4LDIuNTEyYzEuMTM2LDAsMi4wNiwwLjkyMywyLjA2LDIuMDZTMTUuODE1LDYuNjMsMTQuNjgsNi42M3MtMi4wNTktMC45MjMtMi4wNTktMi4wNTlTMTMuNTQ0LDIuNTEyLDE0LjY4LDIuNTEyTTUuMzE5LDEyLjA2MWMtMS4xMzYsMC0yLjA2LTAuOTI0LTIuMDYtMi4wNnMwLjkyMy0yLjA1OSwyLjA2LTIuMDU5YzEuMTM1LDAsMi4wNiwwLjkyMywyLjA2LDIuMDU5UzYuNDU0LDEyLjA2MSw1LjMxOSwxMi4wNjFNMTQuNjgsMTcuNDg4Yy0xLjEzNiwwLTIuMDU5LTAuOTIyLTIuMDU5LTIuMDU5czAuOTIzLTIuMDYxLDIuMDU5LTIuMDYxczIuMDYsMC45MjQsMi4wNiwyLjA2MVMxNS44MTUsMTcuNDg4LDE0LjY4LDE3LjQ4OCI+PC9wYXRoPgoJCQkgICAgPC9zdmc+CgkJCSAgPC9hPgoJCQk8L2Rpdj4KCQkJCiAgICAgIDxkaXYgY2xhc3M9Iml0ZW1zIj4KICAgICAgICA8YSBpZD0ibWVudSIgaHJlZj0iIyI+CiAgICAgICAgICA8c3ZnIGNsYXNzPSJtZW51c3ZnIHN2Zy1pY29uIiB2aWV3Qm94PSIwIDAgMjAgMjAiPgoJCSAgICAgICAgPHBhdGggZD0iTTEwLDEuNDQ1Yy00LjcyNiwwLTguNTU1LDMuODI5LTguNTU1LDguNTU1YzAsNC43MjUsMy44MjksOC41NTUsOC41NTUsOC41NTVjNC43MjUsMCw4LjU1NS0zLjgzLDguNTU1LTguNTU1QzE4LjU1NSw1LjI3NCwxNC43MjUsMS40NDUsMTAsMS40NDUgTTEwLDE3LjY1NGMtNC4yMjEsMC03LjY1NC0zLjQzNC03LjY1NC03LjY1NGMwLTQuMjIxLDMuNDMzLTcuNjU0LDcuNjU0LTcuNjU0YzQuMjIyLDAsNy42NTQsMy40MzMsNy42NTQsNy42NTRDMTcuNjU0LDE0LjIyMSwxNC4yMjIsMTcuNjU0LDEwLDE3LjY1NCBNMTQuMzksMTBjMCwwLjI0OC0wLjIwMywwLjQ1LTAuNDUsMC40NUg2LjA2Yy0wLjI0OCwwLTAuNDUtMC4yMDMtMC40NS0wLjQ1czAuMjAzLTAuNDUsMC40NS0wLjQ1aDcuODc5QzE0LjE4Nyw5LjU1LDE0LjM5LDkuNzUyLDE0LjM5LDEwIE0xNC4zOSwxMi43MDJjMCwwLjI0Ny0wLjIwMywwLjQ0OS0wLjQ1LDAuNDQ5SDYuMDZjLTAuMjQ4LDAtMC40NS0wLjIwMi0wLjQ1LTAuNDQ5YzAtMC4yNDgsMC4yMDMtMC40NTEsMC40NS0wLjQ1MWg3Ljg3OUMxNC4xODcsMTIuMjUxLDE0LjM5LDEyLjQ1NCwxNC4zOSwxMi43MDIgTTE0LjM5LDcuMjk4YzAsMC4yNDgtMC4yMDMsMC40NS0wLjQ1LDAuNDVINi4wNmMtMC4yNDgsMC0wLjQ1LTAuMjAzLTAuNDUtMC40NXMwLjIwMy0wLjQ1LDAuNDUtMC40NWg3Ljg3OUMxNC4xODcsNi44NDgsMTQuMzksNy4wNTEsMTQuMzksNy4yOTgiPjwvcGF0aD4KCSAgICAgICAgPC9zdmc+CiAgICAgICAgPC9hPgogICAgICAgIDxhIGlkPSJ0aXRsZSIgaHJlZj0iIyI+ZmlsZXMuaHRtbDwvYT4KICAgICAgICA8Zm9ybSBpZD0icXVlcnktZm9ybSIgYWN0aW9uPSIjIj4KICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0icXVlcnkiIG5hbWU9InF1ZXJ5IiBpZD0iIiAvPgogICAgICAgICAgPHNlbGVjdCBpZD0icXVlcnktdHlwZSI+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9ImFsbCI+YWxsPC9vcHRpb24+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9ImltYWdlIj5pbWFnZXM8L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0idmlkZW8iPnZpZGVvczwvb3B0aW9uPgogICAgICAgICAgPC9zZWxlY3Q+CiAgICAgICAgICA8aW5wdXQgaWQ9ImdvIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJnbyIvPgogICAgICAgIDwvZm9ybT4KICAgICAgICA8c3BhbiBpZD0icXVlcnlkaXNwbGF5Ij4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0ZXh0Ij48L3NwYW4+CiAgICAgICAgPC9zcGFuPgogICAgICAgIDxkaXYgaWQ9ImxvYWRpbmciPnVwZGF0aW5nPC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJpbWFnZXMiPjwvZGl2PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vdW5wa2cuY29tL25vc3RyLXRvb2xzL2xpYi9ub3N0ci5idW5kbGUuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vc2xvd2xpLmdpdGh1Yi5pby9iZWNoMzItYnVmZmVyL2Fzc2V0cy9qcy9iZWNoMzItYnVmZmVyLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0PgogICAgICBjb25zdCB1cGRhdGVzcHVia2V5ID0gImFlNWM2ZTBiNzQ2NjBkMjE5NGM4MjU0YjVjMmM4MjU2NzY1NzZiZTAyOTczNzlmYTIwNTIzMTE0YTZhODVlODciCiAgICAgIGNvbnN0IHF1ZXJpZXMgPSB7CiAgICAgICAgImdsb2JhbCI6ICdbIlJFUSIsIjxJPiIseyJjYWNoZSI6WyJleHBsb3JlIix7InRpbWVmcmFtZSI6ImxhdGVzdCIsInNjb3BlIjoiZ2xvYmFsIiwibGltaXQiOjxMPn1dfV0nLCAKICAgICAgICAiYXV0aG9yIjogJ1siUkVRIiwiPEk+Iix7ImtpbmRzIjpbMV0sImF1dGhvcnMiOlsiPFA+Il19XScsCiAgICAgICAgInJlYWN0aW9ucyI6ICdbIlJFUSIsIjxJPiIsIHsia2luZHMiOls3XSwiI2UiOiA8RT59XScKICAgICAgfQogICAgICBxcygiI3JlbGF5cyIpLnZhbHVlID0gcmVsYXlzKCkuam9pbigiXG4iKQogICAgICBxcygiI3ByaXZrZXkiKS52YWx1ZSA9IHByaXZrZXkoKQogICAgICBjb25zdCBjb2xvcHRzID0gWzEsIDIsIDQsIDYsIDEwXQoKICAgICAgY29scyA9ICgpID0+IHBhcnNlSW50KHNldHRpbmcoImNvbHMiLCBjb2xvcHRzWzFdKSwgMTApCiAgICAgIGF1dG9wbGF5ID0gKCkgPT4gc2V0dGluZygiYXV0b3BsYXkiLCAib2ZmIikKICAgICAgbGltaXQgPSAoKSA9PiBwYXJzZUludChzZXR0aW5nKCJsaW1pdCIsIDE1KSwgMTApCiAgICAgIGdhbGxlcnkgPSAoKSA9PiB7CiAgICAgICAgbGV0IGdhbGxlcnltYXRjaGVyID0gbG9jYXRpb24uc2VhcmNoLm1hdGNoKC9nYWxsZXJ5PShbYS16MC05XSspLykKICAgICAgICByZXR1cm4gZ2FsbGVyeW1hdGNoZXIgJiYgZ2FsbGVyeW1hdGNoZXJbMV0KICAgICAgfQogICAgICAKICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJjb2xzIiArIGNvbHMoKSkKCiAgICAgIGxldCBwcm90b2NvbCA9IG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS8pID8gIm5vc3RyOiIgOiAid2ViK25vc3RyOiIKICAgICAgbGV0IHNvY2tldHMgPSBbXQogICAgICBsZXQgcmVzaGFuZGxlcnMgPSBbXQogICAgICBsZXQgdXJscyA9IFtdCiAgICAgIGxldCBsaWtlcyA9IFtdCiAgICAgIGxldCBuZXdsaWtlcyA9IFtdCiAgICAgIGxldCBpZGNvdW50ZXIgPSAwCiAgICAgIGxldCBxdWVyeXdhaXQgPSBudWxsCiAgICAgIGxldCBwcmltYWxzb2NrZXQgPSBudWxsCiAgICAgIGxldCB0eXBlcyA9IHsKICAgICAgICBpbWFnZTogWyJwbmciLCAianBnIiwgImpwZWciLCAid2VicCJdLAogICAgICAgIHZpZGVvOiBbIm1wNCIsICJ3ZWJtIl0KICAgICAgfQogICAgICBsZXQgaW1ncmVnZXggPSAvaHR0cCh8cylcOlwvXC9bXiBcbl0qP1wuKHBuZ3xqcGd8anBlZ3x3ZWJwKS9naQogICAgICBsZXQgdmlkZW9yZWdleCA9IC9odHRwKHxzKVw6XC9cL1teIFxuXSo/XC4obXA0fHdlYm0pL2dpCiAgICAgIGxldCB2aWRlb2V4dHJlZ2V4ID0gL1wuKG1wNHx3ZWJtKSQvaQogICAgICBsZXQgaW1nZXh0cmVnZXggPSAvXC4ocG5nfGpwZ3xqcGVnfHdlYnApJC9pCiAgICAgIHdhaXRtcyA9IDUwMDAwCiAgICAgIHF1ZXJ5c3RyID0gIiIKICAgICAgbGV0IHF1ZXJ5Y291bnQgPSAwCiAgICAgIGxldCBob3ZlcmVkdmlkZW8gPSBudWxsCiAgICAgIAogICAgICB1cGRhdGVxdWVyeSgpCiAgICAgIHFzKCIjaW1hZ2UtbGlrZSIpLmlubmVySFRNTCA9IHFzKCIjZmlsdGVyLWxpa2VzIikuaW5uZXJIVE1MID0gcXMoIiN0ZW1wbGF0ZSAuaGVhcnRzdmciKS5vdXRlckhUTUwKICAgICAgc2V0YWN0aXZlKCJzZXRjb2xzIiwgImNvbHMiLCBjb2xzKCkpCiAgICAgIHNldGFjdGl2ZSgic2V0YXV0b3BsYXkiLCAiYXV0b3BsYXkiLCBhdXRvcGxheSgpKQogICAgICAKICAgICAgZnVuY3Rpb24gZnJvbUhleFN0cmluZyhzdHIpewogICAgICAgIGxldCBidWZmZXIgPSBuZXcgVWludDhBcnJheShzdHIubGVuZ3RoIC8gMikKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmZlci5sZW5ndGg7IGkrKykgewogICAgICAgICAgYnVmZmVyW2ldID0gcGFyc2VJbnQoc3RyLnN1YnN0cigyICogaSwgMiksIDE2KQogICAgICAgIH0KICAgICAgICByZXR1cm4gYnVmZmVyCiAgICAgIH0KICAKICAgICAgZnVuY3Rpb24gcmVsYXlzKCl7CiAgICAgICAgY29uc3Qgb2JqID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgicmVsYXlzIikpCiAgICAgICAgY29uc3QgciA9IG9iaiAmJiBvYmouZmlsdGVyKHIgPT4gci5tYXRjaCgvd3NzOlwvXC8uKy8pKSB8fCBbXQogICAgICAgIAogICAgICAgIHJldHVybiByLmxlbmd0aCA+IDAgJiYgciB8fCBbCiAgICAgICAgICAid3NzOi8vcmVsYXkubm9zdHIuYmFuZCIsCiAgICAgICAgICAid3NzOi8vbmIucmVsYXkuY2VudGVyIiwgCiAgICAgICAgICAid3NzOi8vbm9zdHIuY29tcGlsZS1lcnJvci5uZXQiCiAgICAgICAgXQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBwcml2a2V5KCl7CiAgICAgICAgbGV0IGtleSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJwcml2a2V5IikgfHwgIiIKICAgICAgICAKICAgICAgICBpZihrZXkubGVuZ3RoID09IDYzKXsKICAgICAgICAgIGtleSA9IE5vc3RyVG9vbHMubmlwMTkuZGVjb2RlKGtleSkuZGF0YQogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4ga2V5Lmxlbmd0aCA9PSA2NCAmJiBrZXkgfHwgbnVsbAogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBzZXR0aW5nKGtleSwgZGVmYXVsdHZhbHVlKXsKICAgICAgICBjb25zdCB2ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KQogICAgICAgIHJldHVybiB2ICYmIG9wdGlvbigic2V0IiArIGtleSwga2V5LCB2KSAmJiB2IHx8IGRlZmF1bHR2YWx1ZQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBvcHRpb24oYywga2V5LCB2YWwpewogICAgICAgIHJldHVybiBxcygiLiIgKyBjICsgIltkYXRhLSIgKyBrZXkgKyAiPSciICsgdmFsICsgIiddIikKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcXMocSl7CiAgICAgICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IocSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcXNhKHEpewogICAgICAgIHJldHVybiBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocSkpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGdpZChpKXsKICAgICAgICByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcXVlcnl0eXBlKCl7CiAgICAgICAgcmV0dXJuIHFzKCIjcXVlcnktdHlwZSIpLnZhbHVlIHx8ICJhbGwiCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZXF1ZXJ5KCl7CiAgICAgICAgbGV0IHBhcnRzID0gKGdhbGxlcnkoKSAmJiAoImc6IiArIGdhbGxlcnkoKSkgfHwgZGVjb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhhc2guc3Vic3RyaW5nKDEpKSkuc3BsaXQoIi8iKQogICAgICAgIHFzKCIjcXVlcnlkaXNwbGF5IC50ZXh0IikuaW5uZXJUZXh0ID0gcGFydHNbMF0uc3Vic3RyaW5nKDAsIDIwKQogICAgICAgIHF1ZXJ5c3RyID0gcGFydHNbMF0KICAgICAgICBxcygiI3F1ZXJ5IikudmFsdWUgPSBwYXJ0c1swXQogICAgICAgIHFzKCIjcXVlcnktdHlwZSIpLnZhbHVlID0gcGFydHNbMV0gfHwgImFsbCIKICAgICAgfQoKICAgICAgZnVuY3Rpb24gYWN0aXZlKCl7CiAgICAgICAgcmV0dXJuIHFzKCIjaW1hZ2VzIC5hY3RpdmUiKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBpbWFnZW9mZnNldChvZmZzZXQpewogICAgICAgIGNvbnN0IGltYWdlcyA9IHFzYSgiI2ltYWdlcyA+IC5pdGVtIikuZmlsdGVyKGUgPT4gZS5jbGFzc0xpc3QuY29udGFpbnMoInZpc2libGUiKSkKICAgICAgICByZXR1cm4gaW1hZ2VzW2ltYWdlcy5pbmRleE9mKGFjdGl2ZSgpKStvZmZzZXRdCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGxhc3RhY3RpdmUoKXsKICAgICAgICByZXR1cm4gcXNhKCIjaW1hZ2VzIC5hY3RpdmUiKS5wb3AoKSAgICAgIAogICAgICB9CgogICAgICBmdW5jdGlvbiBtZW51KCl7CiAgICAgICAgcXNhKCIjbWVudS1jb250ZW50LCAjb3ZlcmxheSIpLmZvckVhY2gobiA9PiBuLmNsYXNzTGlzdC50b2dnbGUoInZpc2libGUiKSkKICAgICAgfQogIAogICAgICBmdW5jdGlvbiBzZXRhY3RpdmUoYywga2V5LCB2YWwpewogICAgICAgIHFzYSgiLiIgKyBjKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKSkKICAgICAgICBjb25zdCBvcHRpb24gPSBxcygiLiIgKyBjICsgIltkYXRhLSIgKyBrZXkgKyAiPSciICsgdmFsICsgIiddIikKICAgICAgICBvcHRpb24/LmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHNjcm9sbHZpc2libGUobiwgb2Zmc2V0KXsKICAgICAgICBvZmZzZXQgPSBvZmZzZXQgfHwgMAogICAgICAgIHJldHVybiAobi5vZmZzZXRUb3AgKyBuLm9mZnNldEhlaWdodCkgPj0gKHNjcm9sbFkgLSBvZmZzZXQpCiAgICAgICAgICAmJiBuLm9mZnNldFRvcCA8PSAoc2Nyb2xsWSArIHZpc3VhbFZpZXdwb3J0LmhlaWdodCArIG9mZnNldCkKICAgICAgfQoKICAgICAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlaW1hZ2VzbG9hZCgpewogICAgICAgIHFzYSgiI2ltYWdlcyAuaXRlbS5pbWciKS5mb3JFYWNoKGFzeW5jIGltZyA9PiB7CiAgICAgICAgICBpZihzY3JvbGx2aXNpYmxlKGltZywgdmlzdWFsVmlld3BvcnQuaGVpZ2h0IC8gMikpewogICAgICAgICAgICBpbWcuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gInVybCgiICsgaW1nWyJkYXRhLXNyYyJdICsgIikiCiAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgaW1nLnN0eWxlLmJhY2tncm91bmRJbWFnZSA9ICIiCiAgICAgICAgICB9CiAgICAgICAgfSkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlYWxsdmlkZW9wbGF5KCl7CiAgICAgICAgcXNhKCIjaW1hZ2VzIC5pdGVtLnZpZGVvIikuZm9yRWFjaChhc3luYyBuID0+IHVwZGF0ZXZpZGVvcGxheShuKSkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gdXBkYXRldmlkZW9wbGF5KG4pewogICAgICAgIGNvbnN0IGFwbGF5ID0gYXV0b3BsYXkoKQogICAgICAgIGNvbnN0IHYgPSBuLnF1ZXJ5U2VsZWN0b3IoInZpZGVvIikKICAgICAgICAKICAgICAgICBpZihhcGxheSAhPSAib24iKXsKICAgICAgICAgIHYubXV0ZWQgPSBmYWxzZQogICAgICAgICAgdi5wYXVzZSgpCiAgICAgICAgfWVsc2V7CiAgICAgICAgICB2Lm11dGVkID0gdHJ1ZQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZighc2Nyb2xsdmlzaWJsZShuKSl7CiAgICAgICAgICBpZih2LnJlYWR5U3RhdGUgPT0gNCl7CiAgICAgICAgICAgIHYucGF1c2UoKQogICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIHYucHJlbG9hZCA9ICJub25lIgogICAgICAgICAgfQogICAgICAgIH1lbHNlIGlmKHYucmVhZHlTdGF0ZSAhPSA0KXsKICAgICAgICAgIHYucHJlbG9hZCA9ICJhdXRvIgogICAgICAgIH0KICAgICAgICBlbHNlIGlmKGFwbGF5ID09ICJvbiIgfHwgKGFwbGF5ID09ICJob3ZlciIgJiYgdiA9PSBob3ZlcmVkdmlkZW8pKXsKICAgICAgICAgIHYucGxheSgpCiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLCBlID0+IHsKICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpCiAgICAgICAgdXBkYXRlaW1hZ2VzbG9hZCgpCiAgICAgICAgdXBkYXRlYWxsdmlkZW9wbGF5KCkKICAgICAgfSkKICAgICAgCiAgICAgIGxldCB0b3VjaCA9IG51bGwKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLCBlID0+IHRvdWNoID0gZS5jaGFuZ2VkVG91Y2hlc1swXSkKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIiwgZSA9PiB7CiAgICAgICAgY29uc3QgeGRpZmYgPSBlLmNoYW5nZWRUb3VjaGVzWzBdLnNjcmVlblggLSB0b3VjaC5zY3JlZW5YCgogICAgICAgIGlmKHhkaWZmIDwgLTUwKXsKICAgICAgICAgIHN3aXBlKDEpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKHhkaWZmID4gNTApewogICAgICAgICAgc3dpcGUoLTEpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgcXMoIiNxdWVyeS1mb3JtIikuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgZSA9PiB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgd2luZG93Lmhpc3RvcnkucHVzaFN0YXRlKG51bGwsIG51bGwsIGxvY2F0aW9uLnBhdGhuYW1lKQogICAgICAgIGxvY2F0aW9uLmhhc2ggPSAiIyIgKyBlbmNvZGVVUklDb21wb25lbnQocXMoIiNxdWVyeSIpLnZhbHVlICsgIi8iICsgcXVlcnl0eXBlKCkpCiAgICAgICAgdXBkYXRlcXVlcnkoKQogICAgICAgIHF1ZXJ5d2FpdC5yZXNvbHZlKCkKICAgICAgfSkKCiAgICAgIHFzKCIjcmVsYXlzLWZvcm0iKS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLCBhc3luYyBlID0+IHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICBsZXQgciA9IEpTT04uc3RyaW5naWZ5KHFzKCIjcmVsYXlzIikudmFsdWUuc3BsaXQoIlxuIikpCiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oInJlbGF5cyIsIHIpCiAgICAgICAgZGlzY29ubmVjdCgpCiAgICAgIH0pCiAgICAgIAogICAgICBxcygiI3NoYXJlLWZvcm0iKS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLCBhc3luYyBlID0+IHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICAKICAgICAgICBpZihxcygiI3NoYXJlLWZvcm0gLnN1Ym1pdCIpLnZhbHVlID09ICJjbG9zZSIpewogICAgICAgICAgcXNhKCIuZGlhbG9nLnZpc2libGUiKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QucmVtb3ZlKCJ2aXNpYmxlIikpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QgZXZlbnRzID0gcXNhKCIjaW1hZ2VzIC5pdGVtIikuZmlsdGVyKG4gPT4gbi5vZmZzZXRQYXJlbnQpLm1hcChuID0+IG5bImRhdGEtZXZlbnQiXS5pZCkKICAgICAgICBjb25zdCBldmVudCA9IGF3YWl0IHB1Ymxpc2goewogICAgICAgICAgImtpbmQiOiAzMzMsCiAgICAgICAgICAiY29udGVudCI6IEpTT04uc3RyaW5naWZ5KGV2ZW50cyksCiAgICAgICAgICAidGFncyI6IFtdCiAgICAgICAgfSkKCiAgICAgICAgYXdhaXQgd2FpdHJlcyhudWxsLCAiT0siKQoKICAgICAgICBjb25zdCB1cmwgPSB3aW5kb3cubG9jYXRpb24ub3JpZ2luICsgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lCiAgICAgICAgCiAgICAgICAgY29uc3QgcHVibGlzaGVkZXZlbnQgPSBhd2FpdCBwdWJsaXNoKHsKICAgICAgICAgICJraW5kIjogMSwKICAgICAgICAgICJjb250ZW50IjogIlRoaXMgaXMgYSBnYWxsZXJ5IG9mICIgKyBldmVudHMubGVuZ3RoCiAgICAgICAgICAgICsgIiBpbWFnZXMvdmlkZW9zIHNoYXJlZCBmcm9tIGZpbGVzLmh0bWwuIENoZWNrIGl0IG91dCBoZXJlOiAiICsgdXJsICsgIj9nYWxsZXJ5PSIgKyBldmVudC5pZCwKICAgICAgICAgICJ0YWdzIjogWwogICAgICAgICAgICBbIiNlIiwgZXZlbnQuaWRdLCAKICAgICAgICAgICAgWyIjcCIsIGV2ZW50LnB1YmtleV0KICAgICAgICAgIF0KICAgICAgICB9KQoKICAgICAgICBhd2FpdCB3YWl0cmVzKG51bGwsICJPSyIpCiAgICAgICAgCiAgICAgICAgY29uc3QgYmVjaDMyaWQgPSBiZWNoMzIuZW5jb2RlKCJub3RlIiwgZnJvbUhleFN0cmluZyhwdWJsaXNoZWRldmVudC5pZCkpCiAgICAgICAgcXMoIiNzaGFyZS1mb3JtIC5jb250ZW50IikuaW5uZXJIVE1MID0gJ05vdGUgcHVibGlzaGVkIDxhIGhyZWY9IicgKyBwcm90b2NvbCArIGJlY2gzMmlkICsgJyI+JyArIGJlY2gzMmlkICsgJzwvYT4nCiAgICAgICAgcXMoIiNzaGFyZS1mb3JtIC5zdWJtaXQiKS52YWx1ZSA9ICJjbG9zZSIKICAgICAgfSkKCiAgICAgIHFzKCIjcHJpdmtleS1mb3JtIikuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgYXN5bmMgZSA9PiB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgY29uc3Qga2V5ID0gcXMoIiNwcml2a2V5IikudmFsdWUKCiAgICAgICAgaWYoa2V5Lmxlbmd0aCAhPSA2NCAmJiBrZXkubGVuZ3RoICE9IDYzKXsKICAgICAgICAgIGFsZXJ0KCJrZXkgc2hvdWxkIGJlIDYzIG9yIDY0IGNoYXJhY3RlcnMgbG9uZyIpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oInByaXZrZXkiLCBrZXkpCiAgICAgICAgYWxlcnQoImtleSBzYXZlZCIpCiAgICAgIH0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLCBhc3luYyAoZSkgPT4gewogICAgICAgIGlmKGF1dG9wbGF5KCkgPT0gImhvdmVyIiAmJiBlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInZpZGVvLWNvbnRhaW5lciIpKXsKICAgICAgICAgIGhvdmVyZWR2aWRlbyA9IGUudGFyZ2V0LnF1ZXJ5U2VsZWN0b3IoInZpZGVvIikKICAgICAgICAgIGhvdmVyZWR2aWRlby5wbGF5KCkKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgaG92ZXJlZHZpZGVvID0gZmFsc2UKICAgICAgICBpZighcXMoIiNtZWRpYS1jb250YWluZXIiKS5jbGFzc0xpc3QuY29udGFpbnMoInZpc2libGUiKSAmJiBhdXRvcGxheSgpID09ICJob3ZlciIgJiYgZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ2aWRlby1jb250YWluZXIiKSl7CiAgICAgICAgICBxc2EoInZpZGVvIikuZm9yRWFjaCh2ID0+IHYucGF1c2UoKSkKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgaWYoZS50YXJnZXQudHlwZSA9PSAic3VibWl0IiB8fCAoZS50YXJnZXQudGFnTmFtZSA9PSAiQSIgJiYgZS50YXJnZXQuaHJlZi5tYXRjaCgvXih8d2ViXCspbm9zdHJcOi8pKSl7CiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAKICAgICAgICBpZihlLnRhcmdldC5pZCA9PSAidGl0bGUiKXsKICAgICAgICAgIHFzKCIjcXVlcnkiKS52YWx1ZSA9ICIiCiAgICAgICAgICBxcygiI3F1ZXJ5LXR5cGUiKS52YWx1ZSA9ICJhbGwiCiAgICAgICAgICBxcygiI2dvIikuY2xpY2soKQogICAgICAgIH0KCiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCgogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJmaWx0ZXItbGlrZXMiKXsKICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnRvZ2dsZSgiZmlsdGVyLWxpa2VzIikKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLnRhcmdldC5pZCA9PSAic2hhcmUiKXsKICAgICAgICAgIGNvbnN0IGV2ZW50cyA9IHFzYSgiI2ltYWdlcyAuaXRlbSIpLmZpbHRlcihuID0+IG4ub2Zmc2V0UGFyZW50KS5tYXAobiA9PiBuWyJkYXRhLWV2ZW50Il0uaWQpCiAgICAgICAgICAvL2NvbnN0IHRleHQgPSB7dHlwZTogIiIsIGV2ZW50czogfQogICAgICAgICAgcXMoIiNzaGFyZS1kaWFsb2cgLmNvbnRlbnQiKS5pbm5lckhUTUwgPSAiPHA+U2hhcmUgbGluayB0byB0aGlzIGdhbGxlcnkgb2YgIiArIGV2ZW50cy5sZW5ndGggKyAiIGltYWdlcy92aWRlb3MgdG8geW91ciBub3N0ciBwcm9maWxlPzwvcD4iCiAgICAgICAgICBxcygiI3NoYXJlLWZvcm0gLnN1Ym1pdCIpLnZhbHVlID0gInB1Ymxpc2giCiAgICAgICAgICBxc2EoIiNzaGFyZS1kaWFsb2csICNvdmVybGF5IikuZm9yRWFjaChuID0+IG4uY2xhc3NMaXN0LnRvZ2dsZSgidmlzaWJsZSIpKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNob3ciKSl7CiAgICAgICAgICBhY3RpdmUoKT8uY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIGdpZChlLnRhcmdldC5pZCkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIHNob3coZS50YXJnZXQuaWQpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZS50YXJnZXQudGFnTmFtZSAhPSAiQSIgJiYgKHFzKCIjaW1hZ2UtY29udGFpbmVyIikgPT0gZS50YXJnZXQgfHwgcXMoIiNpbWFnZSIpID09IGUudGFyZ2V0IHx8IHFzKCIjbWVkaWEtY29udGFpbmVyIHZpZGVvIikgPT0gZS50YXJnZXQpKXsKICAgICAgICAgIGhpZGVtZWRpYSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJtZW51Iil7CiAgICAgICAgICBtZW51KCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gIm92ZXJsYXkiKXsKICAgICAgICAgIHFzYSgiLmRpYWxvZy52aXNpYmxlIikuZm9yRWFjaChuID0+IG4uY2xhc3NMaXN0LnJlbW92ZSgidmlzaWJsZSIpKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygic2V0Y29scyIpKXsKICAgICAgICAgIGZvcihsZXQgYyBvZiBjb2xvcHRzKXsKICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCJjb2xzIiArIGMpCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgiY29scyIgKyBlLnRhcmdldC5kYXRhc2V0LmNvbHMpCiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiY29scyIsIGUudGFyZ2V0LmRhdGFzZXQuY29scykKICAgICAgICAgIHNldGFjdGl2ZSgic2V0Y29scyIsICJjb2xzIiwgY29scygpKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogIAogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygic2V0YXV0b3BsYXkiKSl7CiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiYXV0b3BsYXkiLCBlLnRhcmdldC5kYXRhc2V0LmF1dG9wbGF5KQogICAgICAgICAgc2V0YWN0aXZlKCJzZXRhdXRvcGxheSIsICJhdXRvcGxheSIsIGF1dG9wbGF5KCkpCiAgICAgICAgICB1cGRhdGVhbGx2aWRlb3BsYXkoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygibGlrZSIpICYmIGxpa2UoZS50YXJnZXQpCiAgICAgIH0pCiAgICAgIAogICAgICBmdW5jdGlvbiBoYXNrZXkoKXsKICAgICAgICByZXR1cm4gd2luZG93Lm5vc3RyIHx8IHByaXZrZXkoKQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBwdWJrZXkoKXsKICAgICAgICByZXR1cm4gd2luZG93Lm5vc3RyICYmIGF3YWl0IHdpbmRvdy5ub3N0ci5nZXRQdWJsaWNLZXkoKSB8fCBOb3N0clRvb2xzLmdldFB1YmxpY0tleShwcml2a2V5KCkpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHNpZ24oZXZlbnQpewogICAgICAgIGlmKHdpbmRvdy5ub3N0cil7CiAgICAgICAgICByZXR1cm4gYXdhaXQgbm9zdHIuc2lnbkV2ZW50KGV2ZW50KQogICAgICAgIH0KICAgICAgICAKICAgICAgICBldmVudC5zaWcgPSBOb3N0clRvb2xzLmdldFNpZ25hdHVyZShldmVudCwgcHJpdmtleSgpKQogICAgICAgIHJldHVybiBldmVudAogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBsaWtlKGxpbmspewogICAgICAgIGNvbnN0IGV2ZW50ID0gbGluay5wYXJlbnRFbGVtZW50WyJkYXRhLWV2ZW50Il0KICAgICAgICAKICAgICAgICBhd2FpdCBwdWJsaXNoKHsKICAgICAgICAgICJraW5kIjogNywKICAgICAgICAgICJjb250ZW50IjogIisiLAogICAgICAgICAgInRhZ3MiOiBbCiAgICAgICAgICAgIFsiZSIsIGV2ZW50LmlkXSwKICAgICAgICAgICAgWyJwIiwgZXZlbnQucHVia2V5XQogICAgICAgICAgXQogICAgICAgIH0pCgogICAgICAgIGxpbmsuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCgogICAgICAgIGNvbnN0IGltYWdlaWQgPSBsaW5rWyJkYXRhLWl0ZW0taWQiXSB8fCBsaW5rLmRhdGFzZXQuaW1hZ2VJZAogICAgICAgIAogICAgICAgIGlmKGltYWdlaWQpewogICAgICAgICAgZ2lkKGltYWdlaWQpLnF1ZXJ5U2VsZWN0b3IoIi5saWtlIikuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCiAgICAgICAgfQogICAgICB9CgogICAgICBhc3luYyBmdW5jdGlvbiBwcmVwYXJlX2V2ZW50KGV2ZW50KXsKICAgICAgICBldmVudC5wdWJrZXkgPSBhd2FpdCBwdWJrZXkoKQogICAgICAgIGV2ZW50LmNyZWF0ZWRfYXQgPSBwYXJzZUludChEYXRlLm5vdygpIC8gMTAwMCwgMTApCiAgICAgICAgY29uc29sZS5sb2coInNlcmlhbGl6ZSBldmVudCIsIEpTT04uc3RyaW5naWZ5KGV2ZW50KSkKICAgICAgICBldmVudC5pZCA9IE5vc3RyVG9vbHMuZ2V0RXZlbnRIYXNoKGV2ZW50KQogICAgICAgIGNvbnNvbGUubG9nKCJzZXJpYWxpemUgZXZlbnQgb2siKQogICAgICAgIHJldHVybiBldmVudAogICAgICB9CiAgICAgICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcHVibGlzaChldmVudCl7CiAgICAgICAgZXZlbnQgPSBhd2FpdCBwcmVwYXJlX2V2ZW50KGV2ZW50KQogICAgICAgIGNvbnNvbGUubG9nKCJzaWduIGV2ZW50IiwgZXZlbnQpCiAgICAgICAgbGV0IHNpZ25lZGV2ZW50ID0gYXdhaXQgc2lnbihldmVudCkKICAgICAgICAKICAgICAgICBjb25zb2xlLmxvZygicHVibGlzaCBldmVudCIsIHNpZ25lZGV2ZW50KQogICAgICAgIAogICAgICAgIGxldCBqc29uID0gSlNPTi5zdHJpbmdpZnkoWyJFVkVOVCIsIHNpZ25lZGV2ZW50XSkKICAgICAgICBzb2NrZXRzLmZvckVhY2gocyA9PiBzLnNlbmQoanNvbikpCiAgICAgICAgCiAgICAgICAgcmV0dXJuIGV2ZW50CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHN3aXBlKG9mZnNldCl7CiAgICAgICAgaWYoaW1hZ2VvZmZzZXQob2Zmc2V0KSl7CiAgICAgICAgICBpbWFnZW9mZnNldChvZmZzZXQpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICB0aGlzW29mZnNldCA9PSAtMSAmJiAibGFzdGFjdGl2ZSIgfHwgImFjdGl2ZSJdKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIHVwZGF0ZXNob3coKQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gdXBkYXRlc2hvdygpewogICAgICAgIGlmKHFzKCIjbWVkaWEtY29udGFpbmVyIikuY2xhc3NMaXN0LmNvbnRhaW5zKCJ2aXNpYmxlIikpewogICAgICAgICAgaGlkZXZpZGVvKCkKICAgICAgICAgIHNob3coYWN0aXZlKCkuaWQpCiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgZSA9PiB7CiAgICAgICAgaWYoWyJUYWIiLCAiQXJyb3dMZWZ0IiwgIkFycm93UmlnaHQiLCAiQXJyb3dVcCIsICJBcnJvd0Rvd24iXS5pbmNsdWRlcyhlLmtleSkpewogICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiRXNjYXBlIil7CiAgICAgICAgICBtZW51KCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLmtleSA9PSAiRW50ZXIiICYmIGUudGFyZ2V0LnRhZ05hbWUgPT0gIkJPRFkiKXsKICAgICAgICAgIGlmKHFzKCIjbWVkaWEtY29udGFpbmVyIikuY2xhc3NMaXN0LmNvbnRhbnMoInZpc2libGUiKSl7CiAgICAgICAgICAgIGhpZGVtZWRpYSgpCiAgICAgICAgICAgIHJldHVybgogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBzaG93KGFjdGl2ZSgpLmlkKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dVcCIgJiYgaW1hZ2VvZmZzZXQoLWNvbHMoKSkpewogICAgICAgICAgaW1hZ2VvZmZzZXQoLWNvbHMoKSkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIGxhc3RhY3RpdmUoKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgICAgdXBkYXRlc2hvdygpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dEb3duIiAmJiBpbWFnZW9mZnNldChjb2xzKCkpKXsKICAgICAgICAgIGltYWdlb2Zmc2V0KGNvbHMoKSkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIGFjdGl2ZSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgICB1cGRhdGVzaG93KCkKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd0xlZnQiKXsKICAgICAgICAgIHN3aXBlKC0xKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93UmlnaHQiKXsKICAgICAgICAgIHN3aXBlKDEpCiAgICAgICAgfQogICAgICB9KQoKICAgICAgYXN5bmMgZnVuY3Rpb24gaGFuZGxlcXVlcnlyZXMocmVzLCBzb2NrZXQsIHEsIHR5cGUsIHN0aW1lKXsKICAgICAgICBzYXZlKHNvY2tldCwgcmVzLCBxLCB0eXBlLCBmYWxzZSwgZmFsc2UsIHRydWUpCiAgICAgICAgbG9nKCJxdWVyeSByZXMiLCByZXMubGVuZ3RoLCBzb2NrZXQudXJsKQogICAgICAgIHF1ZXJ5Y291bnQtLQogICAgICAgIGlmKHF1ZXJ5Y291bnQgPT0gMCl7CiAgICAgICAgICBxcygiI2xvYWRpbmciKS5jbGFzc0xpc3QucmVtb3ZlKCJ2aXNpYmxlIikKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbGV0IHdhaXQgPSB3YWl0bXMgLSAoRGF0ZS5ub3coKSAtIHN0aW1lKQogICAgICAgIHF1ZXJ5d2FpdCA9IHNsZWVwKHdhaXQpCiAgICAgICAgYXdhaXQgcXVlcnl3YWl0LnByb21pc2UKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcHJpbWFsZ2xvYmFsKHNvY2tldCl7CiAgICAgICAgbG9nKCJnbG9iYWwiLCBzb2NrZXQudXJsKQogICAgICAgIHF1ZXJ5Y291bnQrKwogICAgICAgIHFzKCIjbG9hZGluZyIpLmNsYXNzTGlzdC5hZGQoInZpc2libGUiKQogICAgICAgIGxldCBzdGltZSA9IERhdGUubm93KCkKICAgICAgICBsZXQgcWlkID0gImdsb2JhbF8iICsgKCsraWRjb3VudGVyKQogICAgICAgIGxldCBxaWRsaWtlcyA9ICJsaWtlc18iICsgKCsraWRjb3VudGVyKQoKICAgICAgICBpZihuZXdsaWtlcy5sZW5ndGggPiAwKXsKICAgICAgICAgIHByaW1hbHNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KFsKICAgICAgICAgICAgIlJFUSIsIAogICAgICAgICAgICBxaWRsaWtlcywgCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiY2FjaGUiOiBbCiAgICAgICAgICAgICAgICAiZXZlbnRzIiwgewogICAgICAgICAgICAgICAgICAiZXZlbnRfaWRzIjogbmV3bGlrZXMKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0KICAgICAgICAgIF0pKQoKICAgICAgICAgIGNvbnN0IGxpa2VfZXZlbnRzID0gKGF3YWl0IHdhaXRyZXMocWlkbGlrZXMpKVswXQogICAgICAgICAgbmV3bGlrZXMuc3BsaWNlKDApCiAgICAgICAgICAKICAgICAgICAgIGF3YWl0IHNhdmUoc29ja2V0LCBsaWtlX2V2ZW50cywgIiIsICJhbGwiLCB0cnVlLCB0cnVlLCBmYWxzZSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoWwogICAgICAgICAgIlJFUSIsIAogICAgICAgICAgcWlkLCAKICAgICAgICAgIHsKICAgICAgICAgICAgImNhY2hlIjogWwogICAgICAgICAgICAgICJleHBsb3JlIiwgCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInRpbWVmcmFtZSI6ICJsYXRlc3QiLAogICAgICAgICAgICAgICAgInNjb3BlIjogImdsb2JhbCIsCiAgICAgICAgICAgICAgICAibGltaXQiOiA1MAogICAgICAgICAgICAgIH0KICAgICAgICAgICAgXQogICAgICAgICAgfQogICAgICAgIF0pKQogICAgICAgIAogICAgICAgIGNvbnN0IHJlcyA9IChhd2FpdCB3YWl0cmVzKHFpZCkpWzBdCiAgICAgICAgYXdhaXQgaGFuZGxlcXVlcnlyZXMocmVzLmZpbHRlcihlID0+IGUua2luZCA9PSAxKSwgc29ja2V0LCAiIiwgImFsbCIsIHN0aW1lKQogICAgICAgIHByaW1hbGdsb2JhbChzb2NrZXQpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5KHNvY2tldCwgcHJpbWFsKXsKICAgICAgICBsb2coInF1ZXJ5Iiwgc29ja2V0LnVybCkKICAgICAgICBxdWVyeWNvdW50KysKICAgICAgICBxcygiI2xvYWRpbmciKS5jbGFzc0xpc3QuYWRkKCJ2aXNpYmxlIikKICAgICAgICAKICAgICAgICBsZXQgc3RpbWUgPSBEYXRlLm5vdygpCiAgICAgICAgbGV0IHEgPSBxdWVyeXN0ci50cmltKCkKICAgICAgICBsZXQgdHlwZSA9IHF1ZXJ5dHlwZSgpCiAgICAgICAgbGV0IGkgPSArK2lkY291bnRlcgogICAgICAgIGxldCBxaWQgPSAicXVlcnlfIiArIGkKICAgICAgICBjb25zdCBsaWtlc3JlcyA9IGF3YWl0IHF1ZXJ5bGlrZXMoc29ja2V0KQogICAgICAgIAogICAgICAgIGxpa2VzcmVzLmZvckVhY2goZXZlbnRpZCA9PiB7CiAgICAgICAgICBpZighbGlrZXMuaW5jbHVkZXMoZXZlbnRpZCkpewogICAgICAgICAgICBsaWtlcy5wdXNoKGV2ZW50aWQpCiAgICAgICAgICAgIG5ld2xpa2VzLnB1c2goZXZlbnRpZCkKICAgICAgICAgIH0KICAgICAgICB9KQogICAgICAgIAogICAgICAgIGxldCBnYWxsZXJ5bWF0Y2ggPSBxdWVyeXN0ci5tYXRjaCgvZzooW2EtejAtOV0rKS8pCiAgICAgICAgbGV0IHJlcyA9IG51bGwKICAgICAgICAKICAgICAgICBpZihnYWxsZXJ5bWF0Y2gpewogICAgICAgICAgY29uc3QgZ2FsbGVyeXJlcyA9IGF3YWl0IHF1ZXJ5ZXZlbnRzKHNvY2tldCwgWzMzM10sIFtnYWxsZXJ5bWF0Y2hbMV1dLCBudWxsKQogICAgICAgICAgY29uc3QgZXZlbnRpZHMgPSBKU09OLnBhcnNlKGdhbGxlcnlyZXNbMF0uY29udGVudCkKICAgICAgICAgIHJlcyA9IGF3YWl0IHF1ZXJ5ZXZlbnRzKHNvY2tldCwgWzFdLCBldmVudGlkcywgbnVsbCkKICAgICAgICAgIGNvbnNvbGUubG9nKCJnYWxsZXJ5IGNvbnRlbnQgcmVzIiwgcmVzKQogICAgICAgIH1lbHNlewogICAgICAgICAgbGV0IGZpbHRlcnMgPSBbXQoKICAgICAgICAgIGZpbHRlcnMucHVzaCguLi4odHlwZXNbdHlwZV0gfHwgW10pLm1hcCgodCkgPT4gewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgIGtpbmRzOiBbMV0sIAogICAgICAgICAgICAgIHNlYXJjaDogIi4iICsgdCwKICAgICAgICAgICAgICBsaW1pdDogMjAKICAgICAgICAgICAgfQogICAgICAgICAgfSkpCiAgICAgICAgICAKICAgICAgICAgIGlmKHEubGVuZ3RoID4gMCl7CiAgICAgICAgICAgIGZpbHRlcnMucHVzaCh7a2luZHM6IFsxXSwgc2VhcmNoOiBxfSkKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgaWYoZmlsdGVycy5sZW5ndGggPT0gMCl7CiAgICAgICAgICAgIGZpbHRlcnMucHVzaCh7a2luZHM6IFsxXX0pCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIGNvbnN0IHNlYXJjaG9iaiA9IFsiUkVRIiwgcWlkLCAuLi5maWx0ZXJzXQogICAgICAgICAgY29uc3Qgc2VhcmNoanNvbiA9IEpTT04uc3RyaW5naWZ5KHNlYXJjaG9iaikKICAgICAgICAgIHNvY2tldC5zZW5kKHNlYXJjaGpzb24pCiAgICAgICAgICAKICAgICAgICAgIHJlcyA9IChhd2FpdCB3YWl0cmVzKHFpZCkpWzBdCiAgICAgICAgICAKICAgICAgICAgIHJlcyA9IHJlcy5maWx0ZXIobyA9PiB7CiAgICAgICAgICAgIGlmKHEubGVuZ3RoID4gMCl7CiAgICAgICAgICAgICAgZm9yKGxldCB3b3JkIG9mIHEuc3BsaXQoIiAiKSl7CiAgICAgICAgICAgICAgICBpZihvLmNvbnRlbnQudG9Mb3dlckNhc2UoKS5pbmRleE9mKHdvcmQudG9Mb3dlckNhc2UoKSkgPT0gLTEpewogICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2UKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlCiAgICAgICAgICB9KQogICAgICAgIH0KICAgICAgICAKICAgICAgICBhd2FpdCBoYW5kbGVxdWVyeXJlcyhyZXMsIHNvY2tldCwgcSwgdHlwZSwgc3RpbWUpCiAgICAgICAgcXVlcnkoc29ja2V0KQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeWxpa2VzKHNvY2tldCl7CiAgICAgICAgaWYoIWhhc2tleSgpKXsKICAgICAgICAgIHJldHVybiBbXQogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBteXB1YmtleSA9IGF3YWl0IHB1YmtleSgpCiAgICAgICAgY29uc3QgZXZlbnRzID0gYXdhaXQgcXVlcnlldmVudHMoc29ja2V0LCBbN10sIG51bGwsIFtteXB1YmtleV0pCiAgICAgICAgcmV0dXJuIGV2ZW50cy5tYXAoZSA9PiBlLnRhZ3MuZmluZCh0ID0+IHRbMF0gPT0gImUiKVsxXSkKICAgICAgfQoKICAgICAgYXN5bmMgZnVuY3Rpb24gcXVlcnlldmVudHMoc29ja2V0LCBraW5kcywgZXZlbnRpZHMsIGF1dGhvcnMpewogICAgICAgIGNvbnN0IHF1ZXJ5aWQgPSAiZXZlbnRzXyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgY29uc3QgZmlsdGVycyA9IHt9CiAgICAgICAgCiAgICAgICAgZmlsdGVycy5raW5kcyA9IGtpbmRzCiAgICAgICAgCiAgICAgICAgaWYoZXZlbnRpZHMpewogICAgICAgICAgZmlsdGVyc1siaWRzIl0gPSBldmVudGlkcwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihhdXRob3JzKXsKICAgICAgICAgIGZpbHRlcnNbImF1dGhvcnMiXSA9IGF1dGhvcnMKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KFsKICAgICAgICAgICJSRVEiLCAKICAgICAgICAgIHF1ZXJ5aWQsIAogICAgICAgICAgZmlsdGVycwogICAgICAgIF0pCiAgICAgIAogICAgICAgIGNvbnNvbGUubG9nKCJxZSBqc29uIiwganNvbikKICAgICAgICAKICAgICAgICBzb2NrZXQuc2VuZChqc29uKQogICAgICAgIAogICAgICAgIHJldHVybiAoYXdhaXQgd2FpdHJlcyhxdWVyeWlkKSlbMF0gfHwgW10KICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcXVlcnlwdWJrZXkoc29ja2V0LCBwdWJrKXsKICAgICAgICBjb25zdCBxdWVyeWlkID0gInF1ZXJ5XyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgc29ja2V0LnNlbmQocXVlcmllcy5hdXRob3IucmVwbGFjZSgiPEk+IiwgcXVlcnlpZCkucmVwbGFjZSgiPFA+IiwgcHViaykpCgogICAgICAgIHJldHVybiAoYXdhaXQgd2FpdHJlcyhxdWVyeWlkKSlbMF0KICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gc2F2ZShzb2NrZXQsIGV2ZW50cywgcSwgcXR5cGUsIHJlYWN0ZWQsIGFwcGVuZCwgcXVlcnltZXRhKXsKICAgICAgICBsZXQgZXZlbnRwdWJrZXlzID0gW10KICAgICAgICBsZXQgcmVzdWx0cyA9IFtdCiAgICAgICAgY29uc3QgZXZlbnRpZHMgPSBldmVudHMubWFwKGUgPT4gZS5pZCkKICAgICAgICBsZXQgbmV3dXJscyA9IFtdCiAgICAgICAgCiAgICAgICAgZm9yKGxldCBldmVudCBvZiBldmVudHMpewogICAgICAgICAgbGV0IHVybHNtYXRjaCA9IFtdCiAgICAgICAgICAKICAgICAgICAgIGlmKHF0eXBlICE9ICJ2aWRlbyIpewogICAgICAgICAgICB1cmxzbWF0Y2gucHVzaCguLi4oZXZlbnQuY29udGVudC5tYXRjaChpbWdyZWdleCkgfHwgW10pKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBpZihxdHlwZSAhPSAiaW1hZ2UiKXsKICAgICAgICAgICAgdXJsc21hdGNoLnB1c2goLi4uKGV2ZW50LmNvbnRlbnQubWF0Y2godmlkZW9yZWdleCkgfHwgW10pKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICB1cmxzbWF0Y2ggPSB1cmxzbWF0Y2guZmlsdGVyKHVybCA9PiAhdXJscy5pbmNsdWRlcyh1cmwpKQoKICAgICAgICAgIGlmKHVybHNtYXRjaC5sZW5ndGggPiAwKXsKICAgICAgICAgICAgbmV3dXJscy5wdXNoKHsKICAgICAgICAgICAgICBldmVudDogZXZlbnQsCiAgICAgICAgICAgICAgdXJsczogdXJsc21hdGNoCiAgICAgICAgICAgIH0pCiAgICAgICAgICAgIAogICAgICAgICAgICB1cmxzLnB1c2goLi4udXJsc21hdGNoKQogICAgICAgICAgICBldmVudHB1YmtleXMuaW5jbHVkZXMoZXZlbnQucHVia2V5KSB8fCBldmVudHB1YmtleXMucHVzaChldmVudC5wdWJrZXkpCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGxvZygicXVlcnkgbWV0YSIsIHNvY2tldC51cmwpCiAgICAgICAgbGV0IG1ldGFldmVudHMgPSAocXVlcnltZXRhICYmIGF3YWl0IHF1ZXJ5ZXZlbnRzKHNvY2tldCwgWzBdLCBudWxsLCBldmVudHB1YmtleXMpIHx8IFtdKQogICAgICAgIAogICAgICAgIGZvcihsZXQgZW50cnkgb2YgbmV3dXJscyl7CiAgICAgICAgICBmb3IobGV0IHVybCBvZiBlbnRyeS51cmxzKXsKICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHsKICAgICAgICAgICAgICByZWFjdGVkOiByZWFjdGVkIHx8IGxpa2VzLmluY2x1ZGVzKGVudHJ5LmV2ZW50LmlkKSwgCiAgICAgICAgICAgICAgdXJsOiB1cmwsIAogICAgICAgICAgICAgIGV2ZW50OiBlbnRyeS5ldmVudCwgCiAgICAgICAgICAgICAgYmVjaDMyaWQ6IGJlY2gzMi5lbmNvZGUoIm5vdGUiLCBmcm9tSGV4U3RyaW5nKGVudHJ5LmV2ZW50LmlkKSksCiAgICAgICAgICAgICAgbWV0YTogbWV0YWV2ZW50cy5maW5kKG8gPT4gby5wdWJrZXkgPT0gZW50cnkuZXZlbnQucHVia2V5KQogICAgICAgICAgICB9KQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICBsb2coInNhdmUgcmVzIiwgcmVzdWx0cy5sZW5ndGgsIHNvY2tldC51cmwpCiAgICAgICAgdXBkYXRlY29udGVudChyZXN1bHRzLCBxLCBhcHBlbmQpCiAgICAgIH0KICAgICAgCiAgICAgIGxldCBsb2FkZWQgPSAwCiAgICAgIAogICAgICBmdW5jdGlvbiB1cGRhdGVjb250ZW50KHJlc3VsdHMsIHEsIGFwcGVuZCl7CiAgICAgICAgcmVzdWx0cy5yZXZlcnNlKCkuZm9yRWFjaChpdGVtID0+IHsKICAgICAgICAgIGNvbnN0IHR5cGUgPSBpdGVtLnVybC5tYXRjaCh2aWRlb2V4dHJlZ2V4KSAmJiAidmlkZW8iIHx8ICJpbWFnZSIKICAgICAgICAgIGNvbnN0IHRleHQgPSAocSB8fCAidmlldyBub3RlIikuc3Vic3RyaW5nKC0zMCkKICAgICAgICAgIGNvbnN0IGlkID0gIml0ZW1fIiArICgrK2lkY291bnRlcikKICAgICAgICAgIGNvbnN0IGNvbnRlbnRlbGVtZW50cyA9ICc8ZGl2IGNsYXNzPSJ0eXBlIj4nICsgcXMoIiN0ZW1wbGF0ZSAuIiArIHR5cGUgKyAic3ZnIikub3V0ZXJIVE1MICsgJzwvZGl2PjxhIGNsYXNzPSJsaWtlJyArIChpdGVtLnJlYWN0ZWQgPyAnIHJlYWN0ZWQnIDogJycpICsgJyIgZGF0YS1pdGVtLWlkPSInICsgaWQgKyAKICAgICAgICAgICAgJyIgaHJlZj0iIyI+JyArIHFzKCIjdGVtcGxhdGUgLmhlYXJ0c3ZnIikub3V0ZXJIVE1MICsgJzwvYT48YSBjbGFzcz0icXVlcnkiIGhyZWY9IicgKyBwcm90b2NvbCArIAogICAgICAgICAgICBpdGVtLmJlY2gzMmlkICsgJyI+JyArIHRleHQgKyAnPC9hPicKICAgICAgICAgIGxldCByb290ID0gbnVsbAogICAgICAgICAgbGV0IHYgPSBudWxsCiAgICAgICAgICAKICAgICAgICAgIGlmKGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpKXsKICAgICAgICAgICAgcm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpCiAgICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgidmlkZW8tY29udGFpbmVyIikKICAgICAgICAgICAgcm9vdC5pbm5lckhUTUwgPSBjb250ZW50ZWxlbWVudHMKICAgICAgICAgICAgCiAgICAgICAgICAgIHYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpCiAgICAgICAgICAgIHZbImRhdGEtaXRlbS1pZCJdID0gaWQKICAgICAgICAgICAgdi5wcmVsb2FkID0gIm5vbmUiCiAgICAgICAgICAgIHYubG9vcCA9IHRydWUKICAgICAgICAgICAgdi5wbGF5c2lubGluZSA9ICIiCiAgICAgICAgICAgIAogICAgICAgICAgICB2Lm9uY2FucGxheSA9IGFzeW5jIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIGNvbnN0IGFzcGVjdCA9IHRoaXMudmlkZW9XaWR0aCAvIHRoaXMudmlkZW9IZWlnaHQKICAgICAgICAgICAgICBpZihhc3BlY3QgPiAxKXsKICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUud2lkdGggPSAoYXNwZWN0ICogMTAwKSArICIlIgogICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgdGhpcy5zdHlsZS5oZWlnaHQgPSAoMSAvIGFzcGVjdCAqIDEwMCkgKyAiJSIKICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUubWFyZ2luVG9wID0gLSgoMSAvIGFzcGVjdCAqIDEwMCAtIDEwMCkgLyAyKSArICIlIgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAKICAgICAgICAgICAgICB1cGRhdGV2aWRlb3BsYXkodGhpcy5wYXJlbnRFbGVtZW50KQogICAgICAgICAgICB9CgogICAgICAgICAgICBjb25zdCBleHQgPSBpdGVtLnVybC5tYXRjaCh2aWRlb2V4dHJlZ2V4KVsxXQogICAgICAgICAgICB2LmlubmVySFRNTCA9ICc8c291cmNlIHNyYz0iJyArIGl0ZW0udXJsICsgJyIgdHlwZT0idmlkZW8vJyArIGV4dCArICciPjwvc291cmNlPicKICAgICAgICAgICAgCiAgICAgICAgICAgIHJvb3QuYXBwZW5kKHYpCiAgICAgICAgICB9ZWxzZSBpZihpdGVtLnVybC5tYXRjaChpbWdleHRyZWdleCkpewogICAgICAgICAgICByb290ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpCiAgICAgICAgICAgIHJvb3QuaHJlZiA9ICIjIgogICAgICAgICAgICByb290LmlubmVySFRNTCA9IGNvbnRlbnRlbGVtZW50cwogICAgICAgICAgICAgIAogICAgICAgICAgICBpZih0eXBlID09ICJpbWFnZSIpewogICAgICAgICAgICAgIC8vbGV0IGltZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpCiAgICAgICAgICAgICAgLy9pbWcuYWx0ID0gaXRlbS51cmwKICAgICAgICAgICAgICByb290WyJkYXRhLXNyYyJdID0gaXRlbS51cmwKICAgICAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoImltZyIpCiAgICAgICAgICAgICAgLy9pbWcuY2xhc3NMaXN0LmFkZCgiZGF0YSIpCiAgICAgICAgICAgICAgLy9yb290LmFwcGVuZChpbWcpCiAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgIHJvb3QuaW5uZXJIVE1MICs9ICc8c3BhbiBjbGFzcz0iZmlsZSI+JyArIGl0ZW0udXJsICsgJzwvc3Bhbj4nCiAgICAgICAgICAgIH0KICAgICAgICAgIH1lbHNlewogICAgICAgICAgICByZXR1cm4KICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgcm9vdC5pZCA9IGlkCiAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoJ3Zpc2libGUnKQogICAgICAgICAgcm9vdFsiZGF0YS1pdGVtIl0gPSBpdGVtCiAgICAgICAgICByb290WyJkYXRhLWV2ZW50Il0gPSBpdGVtLmV2ZW50CiAgICAgICAgICByb290WyJkYXRhLXF1ZXJ5Il0gPSBxCiAgICAgICAgICByb290WyJkYXRhLXRleHQiXSA9IHRleHQKICAgICAgICAgIAogICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKHR5cGUpCiAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoIml0ZW0iKQogICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJzaG93IikKICAgICAgICAgIAogICAgICAgICAgaWYoaXRlbS5yZWFjdGVkKXsKICAgICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgcXMoIiNpbWFnZXMiKVthcHBlbmQgJiYgImFwcGVuZCIgfHwgInByZXBlbmQiXShyb290KQogICAgICAgICAgCiAgICAgICAgICBpZih2KXsKICAgICAgICAgICAgdXBkYXRldmlkZW9wbGF5KHJvb3QpCiAgICAgICAgICB9CiAgICAgICAgfSkKCiAgICAgICAgdXBkYXRlaW1hZ2VzbG9hZCgpCiAgICAgICAgCiAgICAgICAgaWYoYWN0aXZlKCkgPT0gbnVsbCl7CiAgICAgICAgICBxcygiI2ltYWdlcyAuaXRlbSIpPy5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgIH0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gaGlkZW1lZGlhKCl7CiAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICJzY3JvbGwiCiAgICAgICAgcXNhKCIjbWVkaWEtY29udGFpbmVyLCAjaW1hZ2UsICNtZWRpYS1mb290ZXIiKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QucmVtb3ZlKCJ2aXNpYmxlIikpCiAgICAgICAgZ2lkKCJpbWFnZS1saWtlIikuY2xhc3NMaXN0LnJlbW92ZSgicmVhY3RlZCIpCiAgICAgICAgaGlkZXZpZGVvKCkKICAgICAgfQoKICAgICAgZnVuY3Rpb24gaGlkZXZpZGVvKCl7CiAgICAgICAgY29uc3QgdiA9IHFzKCIjbWVkaWEtY29udGFpbmVyIHZpZGVvIikKICAgICAgICAKICAgICAgICBpZih2KXsKICAgICAgICAgIHYubXV0ZWQgPSB0cnVlCiAgICAgICAgICBnaWQodlsiZGF0YS1pdGVtLWlkIl0pLmFwcGVuZENoaWxkKHYpCiAgICAgICAgICB1cGRhdGV2aWRlb3BsYXkodi5wYXJlbnRFbGVtZW50KQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gd2FpdHJlcyhrZXksIHR5cGUpewogICAgICAgIGxldCByZXNoYW5kbGVyID0gZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KXsKICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGUgfHwgIkVPU0UiCiAgICAgICAgICB0aGlzLmV2ZW50cyA9IFtdCiAgICAgICAgICB0aGlzLmhhbmRsZSA9IGZ1bmN0aW9uKHJlcyl7CiAgICAgICAgICAgIGxldCBvID0gSlNPTi5wYXJzZShyZXMuZGF0YSkKICAgICAgICAgICAgaWYoa2V5ID09IG51bGwgfHwgb1sxXSA9PSBrZXkpewogICAgICAgICAgICAgIGlmKG9bMF0gPT0gdGhpcy50eXBlKXsKICAgICAgICAgICAgICAgIHJlc29sdmUoW3RoaXMuZXZlbnRzLCBvXSkKICAgICAgICAgICAgICAgIHJlc2hhbmRsZXJzLnNwbGljZShyZXNoYW5kbGVycy5pbmRleE9mKHRoaXMpLCAxKQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICB0aGlzLmV2ZW50cy5wdXNoKG9bMl0pCiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgICAgIGxldCBoYW5kbGVyID0gbmV3IHJlc2hhbmRsZXIocmVzb2x2ZSwgcmVqZWN0KQogICAgICAgICAgcmVzaGFuZGxlcnMucHVzaChoYW5kbGVyKQogICAgICAgIH0pCiAgICAgIH0KICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBjaGVja3VwZGF0ZShzb2NrZXQpewogICAgICAgIGNvbnN0IHVwZGF0ZXNyZXMgPSBhd2FpdCBxdWVyeXB1YmtleShzb2NrZXQsIHVwZGF0ZXNwdWJrZXkpCiAgICAgICAgY29uc3QgdXBkYXRlbm90ZSA9IHVwZGF0ZXNyZXMuZmluZChuID0+IG4uY29udGVudC5tYXRjaCgvXmh0dHBzXDpcL1wvLykpCiAgICAgICAgCiAgICAgICAgaWYoIXVwZGF0ZW5vdGUpewogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IGFnZSA9IE1hdGgucm91bmQoKERhdGUubm93KCkgLyAxMDAwIC0gdXBkYXRlbm90ZS5jcmVhdGVkX2F0KSAvIDM2MDAgLyAyNCkKICAgICAgICBjb25zdCBub3RlaWQgPSBiZWNoMzIuZW5jb2RlKCJub3RlIiwgZnJvbUhleFN0cmluZyh1cGRhdGVub3RlLmlkKSkKICAgICAgICBxcygiI3JlbGVhc2UiKS5ocmVmID0gcHJvdG9jb2wgKyBub3RlaWQKICAgICAgICBxcygiI3JlbGVhc2UiKS5pbm5lclRleHQgPSAoYWdlID09IDAgJiYgInRvZGF5IiB8fCBhZ2UgKyAiIGRheShzKSBhZ28iKQogICAgICB9CgogICAgICBmdW5jdGlvbiBzbGVlcChtcyl7CiAgICAgICAgcmV0dXJuIG5ldyBmdW5jdGlvbigpewogICAgICAgICAgbGV0IHRpbWVvdXQgPSBudWxsCiAgICAgICAgICBsZXQgciA9IG51bGwKICAgICAgICAgIAogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcHJvbWlzZTogbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KXsKICAgICAgICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCksIG1zKQogICAgICAgICAgICAgIHIgPSByZXNvbHZlCiAgICAgICAgICAgIH0pLAogICAgICAgICAgICByZXNvbHZlOiBmdW5jdGlvbigpewogICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KQogICAgICAgICAgICAgIHIoKQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBzaG93KGlkKXsKICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiIKICAgICAgICBjb25zdCBpdGVtID0gZ2lkKGlkKVsiZGF0YS1pdGVtIl0KICAgICAgICBjb25zdCBtZWRpYSA9IGdpZCgibWVkaWEtY29udGFpbmVyIikKICAgICAgICBjb25zdCBpbWFnZSA9IGdpZCgiaW1hZ2UiKQoKICAgICAgICBpZihpdGVtLnVybC5tYXRjaCh2aWRlb2V4dHJlZ2V4KSl7CiAgICAgICAgICBpbWFnZS5jbGFzc0xpc3QucmVtb3ZlKCJ2aXNpYmxlIikKICAgICAgICAgIGNvbnN0IHYgPSBnaWQoaWQpLnF1ZXJ5U2VsZWN0b3IoInZpZGVvIikKICAgICAgICAgIHFzKCIjbWVkaWEtY29udGFpbmVyIikuYXBwZW5kQ2hpbGQodikKICAgICAgICAgIHYubXV0ZWQgPSBmYWxzZQogICAgICAgICAgdi5wbGF5KCkKICAgICAgICB9ZWxzZXsKICAgICAgICAgIGltYWdlLnNyYyA9IGl0ZW0udXJsCiAgICAgICAgICBpbWFnZS5jbGFzc0xpc3QuYWRkKCJ2aXNpYmxlIikKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoaXRlbS5tZXRhKXsKICAgICAgICAgIGNvbnN0IG1ldGFjb250ZW50ID0gSlNPTi5wYXJzZShpdGVtLm1ldGEuY29udGVudCkKICAgICAgICAgIGNvbnN0IG5hbWUgPSBtZXRhY29udGVudC5kaXNwbGF5X25hbWUgfHwgbWV0YWNvbnRlbnQubmFtZQogICAgICAgICAgcXMoIiNpbWFnZS11c2VyIikuY2xhc3NMaXN0LmFkZCgidmlzaWJsZSIpCiAgICAgICAgICBxcygiI2ltYWdlLXVzZXIiKS5ocmVmID0gcHJvdG9jb2wgKyBiZWNoMzIuZW5jb2RlKCJucHViIiwgZnJvbUhleFN0cmluZyhpdGVtLm1ldGEucHVia2V5KSkKICAgICAgICAgIHFzKCIjaW1hZ2UtdXNlciIpLmlubmVyVGV4dCA9IG5hbWUKICAgICAgICB9ZWxzZXsKICAgICAgICAgIHFzKCIjaW1hZ2UtdXNlciIpLmNsYXNzTGlzdC5yZW1vdmUoInZpc2libGUiKQogICAgICAgIH0KCiAgICAgICAgZ2lkKCJpbWFnZS1saWtlIilbImRhdGEtaXRlbS1pZCJdID0gaWQKICAgICAgICBnaWQoIm1lZGlhLWZvb3RlciIpWyJkYXRhLWV2ZW50Il0gPSBpdGVtLmV2ZW50CgogICAgICAgIGlmKGl0ZW0ucmVhY3RlZCl7CiAgICAgICAgICBnaWQoImltYWdlLWxpa2UiKS5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QgYSA9IHFzKCIjaW1hZ2UtcXVlcnkiKQogICAgICAgIGEuaHJlZiA9IHByb3RvY29sICsgaXRlbS5iZWNoMzJpZAogICAgICAgIGEuaW5uZXJUZXh0ID0gZ2lkKGlkKVsiZGF0YS10ZXh0Il0KICAgICAgICAKICAgICAgICBnaWQoIm1lZGlhLWNvbnRhaW5lciIpLmNsYXNzTGlzdC5hZGQoInZpc2libGUiKQogICAgICAgIGdpZCgibWVkaWEtZm9vdGVyIikuY2xhc3NMaXN0LmFkZCgidmlzaWJsZSIpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGNvbm5jb3VudCgpewogICAgICAgIHJldHVybiBzb2NrZXRzLmZpbHRlcihyID0+IHIucmVhZHlTdGF0ZSA9PSAxKS5sZW5ndGgKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gZGlzY29ubmVjdCgpewogICAgICAgIGZvcihsZXQgc29ja2V0IG9mIHNvY2tldHMpewogICAgICAgICAgc29ja2V0LmNsb3NlKCkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgc29ja2V0cy5zcGxpY2UoMCkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gbG9nKG1zZyl7CiAgICAgICAgbGV0IHNjcm9sbCA9IHFzKCIjbG9ncyIpLnNjcm9sbFRvcCA9PSBxcygiI2xvZ3MiKS5zY3JvbGxUb3BNYXgKICAgICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKQogICAgICAgIGRpdi5pbm5lclRleHQgPSBBcnJheS5mcm9tKGFyZ3VtZW50cykuam9pbigiICIpCiAgICAgICAgcXMoIiNsb2dzIikuYXBwZW5kKGRpdikKICAgICAgICAKICAgICAgICBzY3JvbGwgJiYgcXMoIiNsb2dzIikuc2Nyb2xsVG8oMCwgcXMoIiNsb2dzIikuc2Nyb2xsVG9wTWF4KQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBjb25uZWN0KHVybCl7CiAgICAgICAgbG9nKCJjb25uZWN0aW5nIiwgdXJsKQogICAgICAgIGxldCBzb2NrZXQgPSBuZXcgV2ViU29ja2V0KHVybCkKICAgICAgICAKICAgICAgICBzb2NrZXQub25tZXNzYWdlID0gbWVzc2FnZSA9PiByZXNoYW5kbGVycy5mb3JFYWNoKHJoID0+IHJoLmhhbmRsZShtZXNzYWdlKSkKICAgICAgICAKICAgICAgICBzb2NrZXQub25jbG9zZSA9IGFzeW5jIGZ1bmN0aW9uKCl7CiAgICAgICAgICBzb2NrZXRzLnNwbGljZShzb2NrZXRzLmluZGV4T2Yoc29ja2V0KSwgMSkKICAgICAgICAgIHFzKCIjY29ubmNvdW50IikuaW5uZXJUZXh0ID0gY29ubmNvdW50KCkgKyAocHJpbWFsc29ja2V0ICYmIDEpCiAgICAgICAgICBsb2coImRpc2Nvbm5lY3RlZCIsIHRoaXMudXJsLCBjb25uY291bnQoKSkKICAgICAgICAgIGF3YWl0IHNsZWVwKDEwMDApLnByb21pc2UKICAgICAgICAgIGNvbm5lY3QodGhpcy51cmwpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHNvY2tldC5vbm9wZW4gPSBmdW5jdGlvbigpewogICAgICAgICAgcXMoIiNjb25uY291bnQiKS5pbm5lclRleHQgPSBjb25uY291bnQoKSArIChwcmltYWxzb2NrZXQgJiYgMSkKICAgICAgICAgIGxvZygiY29ubmVjdGVkIiwgdGhpcy51cmwsIGNvbm5jb3VudCgpKQogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4gc29ja2V0CiAgICAgIH0KICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLCBhc3luYyAoKSA9PiB7CiAgICAgICAgcHJpbWFsc29ja2V0ID0gY29ubmVjdCgid3NzOi8vY2FjaGUzLnByaW1hbC5uZXQvY2FjaGUxNyIpCiAgICAgICAgcHJpbWFsc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoIm9wZW4iLCBmdW5jdGlvbigpewogICAgICAgICAgcHJpbWFsZ2xvYmFsKHRoaXMpCiAgICAgICAgfSkKICAgICAgICAKICAgICAgICBwcmltYWxzb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcigiY2xvc2UiLCBmdW5jdGlvbigpewogICAgICAgICAgcHJpbWFsc29ja2V0ID0gbnVsbAogICAgICAgIH0pCiAgICAgICAgCiAgICAgICAgZm9yKGxldCB1cmwgb2YgcmVsYXlzKCkpewogICAgICAgICAgY29uc3Qgc29ja2V0ID0gY29ubmVjdCh1cmwpCiAgICAgICAgICBzb2NrZXRzLnB1c2goc29ja2V0KQogICAgICAgICAgCiAgICAgICAgICBzb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcigib3BlbiIsIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgIGNoZWNrdXBkYXRlKHRoaXMpCiAgICAgICAgICAgIHF1ZXJ5KHRoaXMpCiAgICAgICAgICB9KQogICAgICAgIH0KICAgICAgICAKICAgICAgICBhd2FpdCBzbGVlcCgxMDApLnByb21pc2UKICAgICAgICAKICAgICAgICBpZihoYXNrZXkoKSl7CiAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoIm5vc3RyIikKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBmb3IobGV0IGMgb2YgY29sb3B0cyl7CiAgICAgICAgZG9jdW1lbnQud3JpdGUoJzxzdHlsZT4nICsgY29sc2Nzcy5pbm5lclRleHQucmVwbGFjZSgvXCRce2NvbHNcfS9nLCBjKSArICc8L3N0eWxlPicpCiAgICAgIH0KICAgIDwvc2NyaXB0PgogIDwvYm9keT4KPC9odG1sPgo=

https://ipfs.io/ipfs/Qma6Mmmsm6s12DFxKmaMKt3cahFw9NTpU7uqB5PV4bcLZ8

sha256

178b4ea43f46dfb18c8bb3f114c9693d4107679e1f60d47b827df18ff9ba4468 files.html

base64

PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgdXNlci1zY2FsYWJsZT1ubyIvPgogICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL3N2Z2ljb25zLnNwYXJray5mci9zdmdpY29ucy5jc3MiLz4KICAgIDxzdHlsZT4KICAgICAgKiB7CiAgICAgICAgb3ZlcnNjcm9sbC1iZWhhdmlvci15OiBjb250YWluOwogICAgICB9CiAgICAgIAogICAgICBib2R5IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB3aWR0aDogMTAwdnc7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIGZvbnQtZmFtaWx5OiAiTm90byBTZXJpZiI7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXksIAogICAgICAjaGVhZGVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLAogICAgICAjbG9ncywgCiAgICAgICNwcml2a2V5IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMThlbTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLAogICAgICAjbG9ncyB7CiAgICAgICAgaGVpZ2h0OiA2ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNsb2dzIHsKICAgICAgICBoZWlnaHQ6IDhlbTsKICAgICAgICBvdmVyZmxvdzogc2Nyb2xsOwogICAgICAgIGZvbnQtc2l6ZTogLjhlbTsKICAgICAgfQogICAgICAKICAgICAgc2VsZWN0IHsKICAgICAgICB3aWR0aDogNGVtOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLCAKICAgICAgaW5wdXQuc3VibWl0IHsKICAgICAgICBib3JkZXItcmFkaXVzOiAuNWVtOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnlkaXNwbGF5IC50ZXh0LCAKICAgICAgI2hlYWRlciBhLAogICAgICAjbWVkaWEtY29udGFpbmVyIHsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQoKICAgICAgI2hlYWRlciBhLCAKICAgICAgZm9ybSwgCiAgICAgICNxdWVyeWRpc3BsYXkgewogICAgICAgIHotaW5kZXg6IDE7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CiAgICAgIAogICAgICBAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDMwZW0pIHsKICAgICAgICAjcXVlcnlkaXNwbGF5IHsKICAgICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgfQogICAgICB9CgogICAgICBmb3JtIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeSB7CiAgICAgICAgd2lkdGg6IDZlbTsKICAgICAgfQogICAgICAKICAgICAgI2xvYWRpbmcgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMHB4OwogICAgICAgIGxlZnQ6IDI3ZW07CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgIGEgewogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgfQoKICAgICAgdmlkZW8gewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogIAogICAgICAjbWVkaWEtY29udGFpbmVyIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgIGhlaWdodDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgIG1hcmdpbi10b3A6IDAgIWltcG9ydGFudDsKICAgICAgfQogICAgICAKICAgICAgLnR5cGUgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICB6LWluZGV4OiAxOwogICAgICB9CiAgICAgIAogICAgICAjaW1hZ2UtcXVlcnkgewogICAgICAgIHdpZHRoOiA1ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXksCiAgICAgIGEsCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgY29sb3I6ICM5OTk7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXkgewogICAgICAgIHBhZGRpbmc6IDAgMWVtOwogICAgICB9CgogICAgICAjcXVlcnlkaXNwbGF5IC50ZXh0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgbWluLXdpZHRoOiAzZW07CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgI2hlYWRlciBhLAogICAgICAjaGVhZGVyIHNwYW4gewogICAgICAgIHBhZGRpbmc6IDAuNWVtOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CgogICAgICAjaGVhZGVyIHsKICAgICAgICBwYWRkaW5nOiAwLjQ1ZW0gMDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CgogICAgICAjaGVhZGVyIC5pdGVtcyB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgLml0ZW1zIHsKICAgICAgICBtYXJnaW4tdG9wOiAuM2VtOwogICAgICB9CgogICAgICBwIHsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICB9CiAgICAgIAogICAgICAubGFiZWwgewogICAgICAgIHBhZGRpbmc6IC44ZW0gLjhlbSAuOGVtIDA7CiAgICAgIH0KCiAgICAgICNpbWFnZXMgLnF1ZXJ5IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KCiAgICAgICNtZWRpYS1jb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwKTsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHotaW5kZXg6IDQ7CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZS1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlIHsKICAgICAgICBtYXgtd2lkdGg6IDEwMHZ3OwogICAgICAgIG1heC1oZWlnaHQ6IDEwMHZoOwogICAgICB9CiAgICAgICAgCiAgICAgICNpbWFnZXMgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZXMgLml0ZW0gewogICAgICAgIHdpZHRoOiAyNXZ3OwogICAgICB9CgogICAgICAjaW1hZ2VzIC5pdGVtIHsKICAgICAgICBoZWlnaHQ6IDI1dnc7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgI21lZGlhLWNvbnRhaW5lciB2aWRlbyB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgfQogICAgICAKICAgICAgYm9keTpub3QoLm5vc3RyKSAjZmlsdGVyLWxpa2VzLCAKICAgICAgLmZpbHRlci1saWtlcyAjaW1hZ2VzID4gLml0ZW06bm90KC5yZWFjdGVkKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNpbWFnZS1xdWVyeSwKICAgICAgI2ltYWdlLXVzZXIgewogICAgICAgIHotaW5kZXg6IDI7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDN2dzsKICAgICAgfQogICAgICAKICAgICAgLnF1ZXJ5LCAKICAgICAgLmxpa2UgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBwYWRkaW5nOiAwIDF2dzsKICAgICAgfQogICAgICAKICAgICAgLnF1ZXJ5LCAKICAgICAgLmxpa2UsIAogICAgICAjaW1hZ2UtcXVlcnksIAogICAgICAudmlkZW9zdmcsCiAgICAgIC5pbWFnZXN2ZyB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjYpOwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNpbWFnZS1xdWVyeSB7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGZvbnQtc2l6ZTogbWluKDMuNXZ3LCAxLjVlbSk7CiAgICAgICAgbWF4LXdpZHRoOiA1ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZS1xdWVyeSB7CiAgICAgICAgcGFkZGluZzogLjZlbSAuNGVtIC4xZW0gLjRlbTsKICAgICAgICBtYXgtd2lkdGg6IDVlbTsKICAgICAgfQogICAgICAKICAgICAgLmxpa2UucmVhY3RlZCwKICAgICAgLmZpbHRlci1saWtlcyAjZmlsdGVyLWxpa2VzIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZWQ7CiAgICAgIH0KCiAgICAgICNpbWFnZS1xdWVyeSwKICAgICAgI2ltYWdlLXVzZXIgewogICAgICAgIGZvbnQtc2l6ZTogM2VtOwogICAgICB9CiAgICAgIAogICAgICAjaW1hZ2UtcXVlcnksCiAgICAgICNpbWFnZS11c2VyLAogICAgICAjbWVkaWEtZm9vdGVyIC5saWtlIHsKICAgICAgICB6LWluZGV4OiA1OwogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlLXF1ZXJ5LAogICAgICAjaW1hZ2UtdXNlciB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgICNpbWFnZS11c2VyIHsKICAgICAgICBib3R0b206IDEuOWVtOwogICAgICAgIGZvbnQtc2l6ZTogMS44ZW07CiAgICAgICAgcGFkZGluZy1yaWdodDogLjY1ZW07CiAgICAgICAgbWF4LXdpZHRoOiA4ZW07CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgIH0KICAgICAgCiAgICAgIC5saWtlIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IGF1dG87CiAgICAgICAgcGFkZGluZzogLjJlbTsKICAgICAgICB3aWR0aDogMWVtOwogICAgICAgIGhlaWdodDogMWVtOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5ub3N0ciAubGlrZSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7ICAKICAgICAgfQoKICAgICAgI21lZGlhLWZvb3RlciAubGlrZSB7CiAgICAgICAgZm9udC1zaXplOiAyLjRlbTsKICAgICAgfQoKICAgICAgI21lZGlhLWZvb3RlciB7CiAgICAgICAgZGlzcGxheTogbm9uZTsgIAogICAgICB9CiAgCiAgICAgICNpbWFnZXMgLmltZyB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIGJhY2tncm91bmQtc2l6ZTogY292ZXI7CiAgICAgICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIC5hY3RpdmUgewogICAgICAgIGJhY2tncm91bmQ6ICM0NDQ7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZXMgPiAuYWN0aXZlIHsKICAgICAgICBvdXRsaW5lOiAuM2VtIHNvbGlkIGdyZWVuOwogICAgICAgIHotaW5kZXg6IDE7CiAgICAgIH0KCiAgICAgIC5oZWFydHN2ZyBwYXRoLAogICAgICAuaGVhZGVyLWljb24gc3ZnIHBhdGggewogICAgICAgIHN0cm9rZTogI2ZmZjsKICAgICAgfQogIAogICAgICAudmlkZW9zdmcsCiAgICAgIC5pbWFnZXN2ZyB7CiAgICAgICAgd2lkdGg6IGNhbGMobWluKDR2dywgMmVtKSk7CiAgICAgICAgaGVpZ2h0OiBjYWxjKG1pbig0dncsIDJlbSkpOwogICAgICAgIHBhZGRpbmc6IDAgLjJlbTsKICAgICAgfQogICAgICAKICAgICAgLnZpZGVvc3ZnIHBhdGgsCiAgICAgIC5pbWFnZXN2ZyBwYXRoIHsKICAgICAgICBmaWxsOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICBhI21lbnUsIAogICAgICAuaGVhZGVyLWljb24gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG1hcmdpbi10b3A6IC0uM2VtOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgIH0KCiAgICAgIC5pY29ucyB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIHotaW5kZXg6IDI7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgfQogICAgICAKICAgICAgYSNtZW51IHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBwYWRkaW5nOiAwIC4zZW0gMCAuNWVtOwogICAgICAgIGhlaWdodDogMi4xZW07CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgLmhlYWRlci1pY29uIHsKICAgICAgICBwYWRkaW5nOiAuMmVtOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICB3aWR0aDogMS41ZW07CiAgICAgICAgaGVpZ2h0OiAxLjVlbTsKICAgICAgICBtYXJnaW46IC4xZW0gLjVlbTsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgIH0KICAgICAgCiAgICAgIC5oZWFkZXItaWNvbiBzdmcgewogICAgICAgIHdpZHRoOiAxLjVlbTsKICAgICAgICBoZWlnaHQ6IDEuNWVtOwogICAgICB9CiAgICAgICAKICAgICAgLm1lbnVzdmcgewogICAgICAgIHdpZHRoOiAyZW07CiAgICAgICAgaGVpZ2h0OiAyZW07CiAgICAgIH0KCiAgICAgIC5tZW51c3ZnIHBhdGggewogICAgICAgIGZpbGw6ICNmZmY7CiAgICAgIH0KCiAgICAgICNtZW51LWNvbnRlbnQgewogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIGhlaWdodDogMTAwdmg7CiAgICAgICAgd2lkdGg6IDE4ZW07CiAgICAgICAgbWFyZ2luLWxlZnQ6IC0xOGVtOwogICAgICAgIGJhY2tncm91bmQ6ICMyMjI7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHotaW5kZXg6IDM7IAogICAgICAgIG92ZXJmbG93OiBzY3JvbGw7CiAgICAgIH0KCiAgICAgICNtZW51LWNvbnRlbnQudmlzaWJsZSB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDA7CiAgICAgIH0KICAgICAgCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIHsKICAgICAgICBwYWRkaW5nOiAwIDFlbSAxZW0gMWVtOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICAjbWVudS1jb250ZW50IC5pdGVtcyBhLAogICAgICBpbnB1dC5zdWJtaXQgewogICAgICAgIHBhZGRpbmc6IC41ZW0gLjdlbTsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgYmFja2dyb3VuZDogIzExMTsKICAgICAgfQoKICAgICAgI292ZXJsYXkgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgei1pbmRleDogMzsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgb3BhY2l0eTogLjU7CiAgICAgIH0KCiAgICAgIC52aXNpYmxlIHsKICAgICAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OwogICAgICB9CiAgICAgIAogICAgICAjc2hhcmUtZGlhbG9nIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB3aWR0aDogY2FsYygxMDB2dyAtIDRlbSk7CiAgICAgICAgaGVpZ2h0OiA1MCU7CiAgICAgICAgYmFja2dyb3VuZDogI2ZmZjsKICAgICAgICBib3JkZXItcmFkaXVzOiAxZW07CiAgICAgICAgei1pbmRleDogNDsKICAgICAgICBtYXJnaW4tbGVmdDogMmVtOwogICAgICAgIG1hcmdpbi10b3A6IDJlbTsKICAgICAgICBwYWRkaW5nOiAxZW07CiAgICAgIH0KICAgICAgCiAgICAgIGgyIHsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICB9CiAgICAgIAogICAgICBzdmcgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAjdGVtcGxhdGUgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGRpdiBpZD0idGVtcGxhdGUiPgogICAgICA8c3ZnIGNsYXNzPSJoZWFydHN2ZyBzdmctaWNvbiIgdmlld0JveD0iMCAwIDIwIDIwIj4KICAgICAgICA8cGF0aCBkPSJNOS43MTksMTcuMDczbC02LjU2Mi02LjUxYy0wLjI3LTAuMjY4LTAuNTA0LTAuNTY3LTAuNjk2LTAuODg4QzEuMzg1LDcuODksMS42Nyw1LjYxMywzLjE1NSw0LjE0YzAuODY0LTAuODU2LDIuMDEyLTEuMzI5LDMuMjMzLTEuMzI5YzEuOTI0LDAsMy4xMTUsMS4xMiwzLjYxMiwxLjc1MmMwLjQ5OS0wLjYzNCwxLjY4OS0xLjc1MiwzLjYxMi0xLjc1MmMxLjIyMSwwLDIuMzY5LDAuNDcyLDMuMjMzLDEuMzI5YzEuNDg0LDEuNDczLDEuNzcxLDMuNzUsMC42OTMsNS41MzdjLTAuMTksMC4zMi0wLjQyNSwwLjYxOC0wLjY5NSwwLjg4N2wtNi41NjIsNi41MUMxMC4xMjUsMTcuMjI5LDkuODc1LDE3LjIyOSw5LjcxOSwxNy4wNzMgTTYuMzg4LDMuNjFDNS4zNzksMy42MSw0LjQzMSw0LDMuNzE3LDQuNzA3QzIuNDk1LDUuOTIsMi4yNTksNy43OTQsMy4xNDUsOS4yNjVjMC4xNTgsMC4yNjUsMC4zNTEsMC41MSwwLjU3NCwwLjczMUwxMCwxNi4yMjhsNi4yODEtNi4yMzJjMC4yMjQtMC4yMjEsMC40MTYtMC40NjYsMC41NzMtMC43MjljMC44ODctMS40NzIsMC42NTEtMy4zNDYtMC41NzEtNC41NkMxNS41Nyw0LDE0LjYyMSwzLjYxLDEzLjYxMiwzLjYxYy0xLjQzLDAtMi42MzksMC43ODYtMy4yNjgsMS44NjNjLTAuMTU0LDAuMjY0LTAuNTM2LDAuMjY0LTAuNjksMEM5LjAyOSw0LjM5Nyw3LjgyLDMuNjEsNi4zODgsMy42MSI+PC9wYXRoPgogICAgICA8L3N2Zz4KICAgICAgPHN2ZyBjbGFzcz0idmlkZW9zdmcgc3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CgkJCQk8cGF0aCBkPSJNMTguMTc1LDQuMTQySDEuOTUxQzEuNzAzLDQuMTQyLDEuNSw0LjM0NCwxLjUsNC41OTJ2MTAuODE2YzAsMC4yNDcsMC4yMDMsMC40NSwwLjQ1MSwwLjQ1aDE2LjIyNGMwLjI0NywwLDAuNDUtMC4yMDMsMC40NS0wLjQ1VjQuNTkyQzE4LjYyNSw0LjM0NCwxOC40MjIsNC4xNDIsMTguMTc1LDQuMTQyIE00LjY1NSwxNC45NTdIMi40MDF2LTEuODAzaDIuMjUzVjE0Ljk1N3pNNC42NTUsMTIuMjU0SDIuNDAxdi0xLjgwM2gyLjI1M1YxMi4yNTR6IE00LjY1NSw5LjU0OUgyLjQwMVY3Ljc0N2gyLjI1M1Y5LjU0OXogTTQuNjU1LDYuODQ2SDIuNDAxVjUuMDQzaDIuMjUzVjYuODQ2ek0xNC41NjksMTQuOTU3SDUuNTU2VjUuMDQzaDkuMDEzVjE0Ljk1N3ogTTE3LjcyNCwxNC45NTdoLTIuMjUzdi0xLjgwM2gyLjI1M1YxNC45NTd6IE0xNy43MjQsMTIuMjU0aC0yLjI1M3YtMS44MDNoMi4yNTNWMTIuMjU0ek0xNy43MjQsOS41NDloLTIuMjUzVjcuNzQ3aDIuMjUzVjkuNTQ5eiBNMTcuNzI0LDYuODQ2aC0yLjI1M1Y1LjA0M2gyLjI1M1Y2Ljg0NnoiPjwvcGF0aD4KCQkJPC9zdmc+CgkJCTxzdmcgY2xhc3M9ImltYWdlc3ZnIHN2Zy1pY29uIiB2aWV3Qm94PSIwIDAgMjAgMjAiPgoJCQkJPHBhdGggZD0iTTE4LjU1NSwxNS4zNTRWNC41OTJjMC0wLjI0OC0wLjIwMi0wLjQ1MS0wLjQ1LTAuNDUxSDEuODg4Yy0wLjI0OCwwLTAuNDUxLDAuMjAzLTAuNDUxLDAuNDUxdjEwLjgwOGMwLDAuNTU5LDAuNzUxLDAuNDUxLDAuNDUxLDAuNDUxaDE2LjIxN2gwLjAwNUMxOC43OTMsMTUuODUxLDE4LjQ3OCwxNC44MTQsMTguNTU1LDE1LjM1NCBNMi44LDE0Ljk0OWw0Ljk0NC02LjQ2NGw0LjE0NCw1LjQxOWMwLjAwMywwLjAwMywwLjAwMywwLjAwMywwLjAwMywwLjAwNWwwLjc5NywxLjA0SDIuOHogTTEzLjgyMiwxNC45NDlsLTEuMDA2LTEuMzE3bDEuNjg5LTIuMjE4bDIuNjg4LDMuNTM1SDEzLjgyMnogTTE3LjY1NCwxNC4wNjRsLTIuNzkxLTMuNjY2Yy0wLjE4MS0wLjIzNy0wLjUzNS0wLjIzNy0wLjcxNiwwbC0xLjg5OSwyLjQ5M2wtNC4xNDYtNS40MmMtMC4xOC0wLjIzNy0wLjUzNi0wLjIzNy0wLjcxNiwwbC01LjA0Nyw2LjU5OFY1LjA0MmgxNS4zMTZWMTQuMDY0eiBNMTIuNDc0LDYuMzkzYy0wLjg2OSwwLTEuNTc3LDAuNzA3LTEuNTc3LDEuNTc2czAuNzA4LDEuNTc2LDEuNTc3LDEuNTc2czEuNTc3LTAuNzA3LDEuNTc3LTEuNTc2UzEzLjM0Myw2LjM5MywxMi40NzQsNi4zOTMgTTEyLjQ3NCw4LjY0NWMtMC4zNzEsMC0wLjY3Ni0wLjMwNC0wLjY3Ni0wLjY3NnMwLjMwNS0wLjY3NiwwLjY3Ni0wLjY3NmMwLjM3MiwwLDAuNjc2LDAuMzA0LDAuNjc2LDAuNjc2UzEyLjg0Niw4LjY0NSwxMi40NzQsOC42NDUiPjwvcGF0aD4KCQkJPC9zdmc+CiAgICAgIDxkaXYgaWQ9ImNvbHNjc3MiPgogICAgICAuY29scyR7Y29sc30gI2ltYWdlcyAuaXRlbSB7CiAgICAgICAgd2lkdGg6IGNhbGMoMTAwdncgLyAke2NvbHN9KTsKICAgICAgfQoKICAgICAgLmNvbHMke2NvbHN9ICNpbWFnZXMgLml0ZW0gewogICAgICAgIGhlaWdodDogY2FsYygxMDB2dyAvICR7Y29sc30pOwogICAgICB9CiAgICAgIAogICAgICAuY29scyR7Y29sc30gLnF1ZXJ5LAogICAgICAuY29scyR7Y29sc30gLmxpa2UgewogICAgICAgIGZvbnQtc2l6ZTogbWluKDE0dncgKiAoMSAvICR7Y29sc30pLCA2ZW0gKiAoMSAvICR7Y29sc30pKQogICAgICB9CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJzaGFyZS1kaWFsb2ciIGNsYXNzPSJkaWFsb2ciPgogICAgICA8aDI+c2hhcmU8L2gyPgogICAgICA8Zm9ybSBpZD0ic2hhcmUtZm9ybSIgYWN0aW9uPSIjIj4KICAgICAgICA8cCBjbGFzcz0iY29udGVudCI+PC9wPgogICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIGNsYXNzPSJzdWJtaXQiIHZhbHVlPSJvayIvPgogICAgICA8L2Zvcm0+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9Im1lZGlhLWZvb3RlciI+CiAgICAgIDxhIGlkPSJpbWFnZS1saWtlIiBjbGFzcz0ibGlrZSIgaHJlZj0iIyI+PC9hPgogICAgICA8YSBpZD0iaW1hZ2UtcXVlcnkiIGhyZWY9IiMiPjwvYT4KICAgICAgPGEgaWQ9ImltYWdlLXVzZXIiIGhyZWY9IiMiPjwvYT4KICAgIDwvZGl2PgogICAgPGNlbnRlciBpZD0ibWVkaWEtY29udGFpbmVyIj4KICAgICAgPGRpdiBpZD0iaW1hZ2UtY29udGFpbmVyIj4KICAgICAgICA8aW1nIGlkPSJpbWFnZSIvPgogICAgICA8L2Rpdj4KICAgIDwvY2VudGVyPgogICAgPGRpdiBpZD0ib3ZlcmxheSIgY2xhc3M9ImRpYWxvZyI+PC9kaXY+CiAgICA8ZGl2IGlkPSJtZW51LWNvbnRlbnQiIGNsYXNzPSJ0ZXN0Ij4KICAgICAgPGRpdiBjbGFzcz0iaXRlbXMiPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5hdXRvcGxheTwvZGl2PgogICAgICAgIDxhIGNsYXNzPSJzZXRhdXRvcGxheSIgZGF0YS1hdXRvcGxheT0ib24iIGhyZWY9IiMiPm9uPC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRhdXRvcGxheSIgZGF0YS1hdXRvcGxheT0ib2ZmIiBocmVmPSIjIj5vZmY8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGF1dG9wbGF5IiBkYXRhLWF1dG9wbGF5PSJob3ZlciIgaHJlZj0iIyI+bW91c2VvdmVyPC9hPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5jb2x1bW5zPC9kaXY+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iMSIgaHJlZj0iIyI+MTwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSIyIiBocmVmPSIjIj4yPC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjQiIGhyZWY9IiMiPjQ8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iNiIgaHJlZj0iIyI+NjwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSIxMCIgaHJlZj0iIyI+MTA8L2E+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmNvbm5lY3Rpb25zPC9kaXY+CiAgICAgICAgPGRpdiBpZD0iY29ubmNvdW50Ij4wPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPnJlbGF5czo8L2Rpdj4KICAgICAgICA8cD5QbGVhc2UgdXNlIHJlbGF5cyB3aXRoIE5JUC01MCAoc2VhcmNoKSBmdW5jdGlvbmFsaXR5PC9wPgogICAgICAgIDxmb3JtIGFjdGlvbj0iIyIgaWQ9InJlbGF5cy1mb3JtIj4KICAgICAgICAgIDx0ZXh0YXJlYSBpZD0icmVsYXlzIj48L3RleHRhcmVhPgogICAgICAgICAgPGlucHV0IGNsYXNzPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9InNhdmUgcmVsYXlzIi8+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5wcml2YXRlIGtleTo8L2Rpdj4KICAgICAgICA8cD5JZiB5b3UgY2FudCB1c2UgYnJvd3NlciBhZGRvbiAobW9iaWxlKTwvcD4KICAgICAgICA8Zm9ybSBhY3Rpb249IiMiIGlkPSJwcml2a2V5LWZvcm0iPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJwcml2a2V5Ii8+CiAgICAgICAgICA8aW5wdXQgY2xhc3M9InN1Ym1pdCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0ic2F2ZSBrZXkiLz4KICAgICAgICA8L2Zvcm0+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmxvZ3M8L2Rpdj4KICAgICAgICA8ZGl2IGlkPSJsb2dzIj48L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+bGF0ZXN0IHJlbGVhc2U6PC9kaXY+CiAgICAgICAgPGEgaWQ9InJlbGVhc2UiIGhyZWY9IiMiPjwvYT4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9ImhlYWRlciI+CiAgICAgIDxkaXYgY2xhc3M9Imljb25zIj4KICAgICAgICA8YSBpZD0iZmlsdGVyLWxpa2VzIiBocmVmPSIjIiBjbGFzcz0iaGVhZGVyLWljb24iPjwvYT4KICAgICAgICA8YSBpZD0ic2hhcmUiIGhyZWY9IiMiIGNsYXNzPSJoZWFkZXItaWNvbiI+CiAgICAgICAgICA8c3ZnIGNsYXNzPSJzdmctaWNvbiIgdmlld0JveD0iMCAwIDIwIDIwIj4KCQkJCSAgICA8cGF0aCBkPSJNMTQuNjgsMTIuNjIxYy0wLjksMC0xLjcwMiwwLjQzLTIuMjE2LDEuMDlsLTQuNTQ5LTIuNjM3YzAuMjg0LTAuNjkxLDAuMjg0LTEuNDU3LDAtMi4xNDZsNC41NDktMi42MzhjMC41MTQsMC42NjEsMS4zMTUsMS4wOSwyLjIxNiwxLjA5YzEuNTQ5LDAsMi44MDktMS4yNiwyLjgwOS0yLjgwOGMwLTEuNTQ4LTEuMjYtMi44MDktMi44MDktMi44MDljLTEuNTQ4LDAtMi44MDgsMS4yNi0yLjgwOCwyLjgwOWMwLDAuMzgsMC4wNzYsMC43NDEsMC4yMTQsMS4wNzNsLTQuNTUsMi42MzhjLTAuNTE1LTAuNjYxLTEuMzE2LTEuMDktMi4yMTctMS4wOWMtMS41NDgsMC0yLjgwOCwxLjI2LTIuODA4LDIuODA5czEuMjYsMi44MDgsMi44MDgsMi44MDhjMC45LDAsMS43MDItMC40MywyLjIxNy0xLjA5bDQuNTUsMi42MzdjLTAuMTM4LDAuMzMyLTAuMjE0LDAuNjkzLTAuMjE0LDEuMDc0YzAsMS41NDksMS4yNiwyLjgwOSwyLjgwOCwyLjgwOWMxLjU0OSwwLDIuODA5LTEuMjYsMi44MDktMi44MDlTMTYuMjI5LDEyLjYyMSwxNC42OCwxMi42MjFNMTQuNjgsMi41MTJjMS4xMzYsMCwyLjA2LDAuOTIzLDIuMDYsMi4wNlMxNS44MTUsNi42MywxNC42OCw2LjYzcy0yLjA1OS0wLjkyMy0yLjA1OS0yLjA1OVMxMy41NDQsMi41MTIsMTQuNjgsMi41MTJNNS4zMTksMTIuMDYxYy0xLjEzNiwwLTIuMDYtMC45MjQtMi4wNi0yLjA2czAuOTIzLTIuMDU5LDIuMDYtMi4wNTljMS4xMzUsMCwyLjA2LDAuOTIzLDIuMDYsMi4wNTlTNi40NTQsMTIuMDYxLDUuMzE5LDEyLjA2MU0xNC42OCwxNy40ODhjLTEuMTM2LDAtMi4wNTktMC45MjItMi4wNTktMi4wNTlzMC45MjMtMi4wNjEsMi4wNTktMi4wNjFzMi4wNiwwLjkyNCwyLjA2LDIuMDYxUzE1LjgxNSwxNy40ODgsMTQuNjgsMTcuNDg4Ij48L3BhdGg+CgkJCSAgICA8L3N2Zz4KCQkJICA8L2E+CgkJCTwvZGl2PgoJCQkKICAgICAgPGRpdiBjbGFzcz0iaXRlbXMiPgogICAgICAgIDxhIGlkPSJtZW51IiBocmVmPSIjIj4KICAgICAgICAgIDxzdmcgY2xhc3M9Im1lbnVzdmcgc3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CgkJICAgICAgICA8cGF0aCBkPSJNMTAsMS40NDVjLTQuNzI2LDAtOC41NTUsMy44MjktOC41NTUsOC41NTVjMCw0LjcyNSwzLjgyOSw4LjU1NSw4LjU1NSw4LjU1NWM0LjcyNSwwLDguNTU1LTMuODMsOC41NTUtOC41NTVDMTguNTU1LDUuMjc0LDE0LjcyNSwxLjQ0NSwxMCwxLjQ0NSBNMTAsMTcuNjU0Yy00LjIyMSwwLTcuNjU0LTMuNDM0LTcuNjU0LTcuNjU0YzAtNC4yMjEsMy40MzMtNy42NTQsNy42NTQtNy42NTRjNC4yMjIsMCw3LjY1NCwzLjQzMyw3LjY1NCw3LjY1NEMxNy42NTQsMTQuMjIxLDE0LjIyMiwxNy42NTQsMTAsMTcuNjU0IE0xNC4zOSwxMGMwLDAuMjQ4LTAuMjAzLDAuNDUtMC40NSwwLjQ1SDYuMDZjLTAuMjQ4LDAtMC40NS0wLjIwMy0wLjQ1LTAuNDVzMC4yMDMtMC40NSwwLjQ1LTAuNDVoNy44NzlDMTQuMTg3LDkuNTUsMTQuMzksOS43NTIsMTQuMzksMTAgTTE0LjM5LDEyLjcwMmMwLDAuMjQ3LTAuMjAzLDAuNDQ5LTAuNDUsMC40NDlINi4wNmMtMC4yNDgsMC0wLjQ1LTAuMjAyLTAuNDUtMC40NDljMC0wLjI0OCwwLjIwMy0wLjQ1MSwwLjQ1LTAuNDUxaDcuODc5QzE0LjE4NywxMi4yNTEsMTQuMzksMTIuNDU0LDE0LjM5LDEyLjcwMiBNMTQuMzksNy4yOThjMCwwLjI0OC0wLjIwMywwLjQ1LTAuNDUsMC40NUg2LjA2Yy0wLjI0OCwwLTAuNDUtMC4yMDMtMC40NS0wLjQ1czAuMjAzLTAuNDUsMC40NS0wLjQ1aDcuODc5QzE0LjE4Nyw2Ljg0OCwxNC4zOSw3LjA1MSwxNC4zOSw3LjI5OCI+PC9wYXRoPgoJICAgICAgICA8L3N2Zz4KICAgICAgICA8L2E+CiAgICAgICAgPGEgaWQ9InRpdGxlIiBocmVmPSIjIj5maWxlcy5odG1sPC9hPgogICAgICAgIDxmb3JtIGlkPSJxdWVyeS1mb3JtIiBhY3Rpb249IiMiPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJxdWVyeSIgbmFtZT0icXVlcnkiIGlkPSIiIC8+CiAgICAgICAgICA8c2VsZWN0IGlkPSJxdWVyeS10eXBlIj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iYWxsIj5hbGw8L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaW1hZ2UiPmltYWdlczwvb3B0aW9uPgogICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJ2aWRlbyI+dmlkZW9zPC9vcHRpb24+CiAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgIDxpbnB1dCBpZD0iZ28iIHR5cGU9InN1Ym1pdCIgdmFsdWU9ImdvIi8+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxzcGFuIGlkPSJxdWVyeWRpc3BsYXkiPgogICAgICAgICAgPHNwYW4gY2xhc3M9InRleHQiPjwvc3Bhbj4KICAgICAgICA8L3NwYW4+CiAgICAgICAgPGRpdiBpZD0ibG9hZGluZyI+dXBkYXRpbmc8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9ImltYWdlcyI+PC9kaXY+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly91bnBrZy5jb20vbm9zdHItdG9vbHMvbGliL25vc3RyLmJ1bmRsZS5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9zbG93bGkuZ2l0aHViLmlvL2JlY2gzMi1idWZmZXIvYXNzZXRzL2pzL2JlY2gzMi1idWZmZXIubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQ+CiAgICAgIGNvbnN0IHVwZGF0ZXNwdWJrZXkgPSAiYWU1YzZlMGI3NDY2MGQyMTk0YzgyNTRiNWMyYzgyNTY3NjU3NmJlMDI5NzM3OWZhMjA1MjMxMTRhNmE4NWU4NyIKICAgICAgY29uc3QgcXVlcmllcyA9IHsKICAgICAgICAiZ2xvYmFsIjogJ1siUkVRIiwiPEk+Iix7ImNhY2hlIjpbImV4cGxvcmUiLHsidGltZWZyYW1lIjoibGF0ZXN0Iiwic2NvcGUiOiJnbG9iYWwiLCJsaW1pdCI6PEw+fV19XScsIAogICAgICAgICJhdXRob3IiOiAnWyJSRVEiLCI8ST4iLHsia2luZHMiOlsxXSwiYXV0aG9ycyI6WyI8UD4iXX1dJywKICAgICAgICAicmVhY3Rpb25zIjogJ1siUkVRIiwiPEk+IiwgeyJraW5kcyI6WzddLCIjZSI6IDxFPn1dJwogICAgICB9CiAgICAgIHFzKCIjcmVsYXlzIikudmFsdWUgPSByZWxheXMoKS5qb2luKCJcbiIpCiAgICAgIHFzKCIjcHJpdmtleSIpLnZhbHVlID0gcHJpdmtleSgpCiAgICAgIGNvbnN0IGNvbG9wdHMgPSBbMSwgMiwgNCwgNiwgMTBdCgogICAgICBjb2xzID0gKCkgPT4gcGFyc2VJbnQoc2V0dGluZygiY29scyIsIGNvbG9wdHNbMV0pLCAxMCkKICAgICAgYXV0b3BsYXkgPSAoKSA9PiBzZXR0aW5nKCJhdXRvcGxheSIsICJvZmYiKQogICAgICBsaW1pdCA9ICgpID0+IHBhcnNlSW50KHNldHRpbmcoImxpbWl0IiwgMTUpLCAxMCkKICAgICAgZ2FsbGVyeSA9ICgpID0+IHsKICAgICAgICBsZXQgZ2FsbGVyeW1hdGNoZXIgPSBsb2NhdGlvbi5zZWFyY2gubWF0Y2goL2dhbGxlcnk9KFthLXowLTldKykvKQogICAgICAgIHJldHVybiBnYWxsZXJ5bWF0Y2hlciAmJiBnYWxsZXJ5bWF0Y2hlclsxXQogICAgICB9CiAgICAgIAogICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoImNvbHMiICsgY29scygpKQoKICAgICAgbGV0IHByb3RvY29sID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlLykgPyAibm9zdHI6IiA6ICJ3ZWIrbm9zdHI6IgogICAgICBsZXQgc29ja2V0cyA9IFtdCiAgICAgIGxldCByZXNoYW5kbGVycyA9IFtdCiAgICAgIGxldCB1cmxzID0gW10KICAgICAgbGV0IGxpa2VzID0gW10KICAgICAgbGV0IG5ld2xpa2VzID0gW10KICAgICAgbGV0IGlkY291bnRlciA9IDAKICAgICAgbGV0IHF1ZXJ5d2FpdCA9IG51bGwKICAgICAgbGV0IHByaW1hbHNvY2tldCA9IG51bGwKICAgICAgbGV0IHR5cGVzID0gewogICAgICAgIGltYWdlOiBbInBuZyIsICJqcGciLCAianBlZyIsICJ3ZWJwIl0sCiAgICAgICAgdmlkZW86IFsibXA0IiwgIndlYm0iXQogICAgICB9CiAgICAgIGxldCBpbWdyZWdleCA9IC9odHRwKHxzKVw6XC9cL1teIFxuXSo/XC4ocG5nfGpwZ3xqcGVnfHdlYnApL2dpCiAgICAgIGxldCB2aWRlb3JlZ2V4ID0gL2h0dHAofHMpXDpcL1wvW14gXG5dKj9cLihtcDR8d2VibSkvZ2kKICAgICAgbGV0IHZpZGVvZXh0cmVnZXggPSAvXC4obXA0fHdlYm0pJC9pCiAgICAgIGxldCBpbWdleHRyZWdleCA9IC9cLihwbmd8anBnfGpwZWd8d2VicCkkL2kKICAgICAgd2FpdG1zID0gNTAwMDAKICAgICAgcXVlcnlzdHIgPSAiIgogICAgICBsZXQgcXVlcnljb3VudCA9IDAKICAgICAgbGV0IGhvdmVyZWR2aWRlbyA9IG51bGwKICAgICAgCiAgICAgIHVwZGF0ZXF1ZXJ5KCkKICAgICAgcXMoIiNpbWFnZS1saWtlIikuaW5uZXJIVE1MID0gcXMoIiNmaWx0ZXItbGlrZXMiKS5pbm5lckhUTUwgPSBxcygiI3RlbXBsYXRlIC5oZWFydHN2ZyIpLm91dGVySFRNTAogICAgICBzZXRhY3RpdmUoInNldGNvbHMiLCAiY29scyIsIGNvbHMoKSkKICAgICAgc2V0YWN0aXZlKCJzZXRhdXRvcGxheSIsICJhdXRvcGxheSIsIGF1dG9wbGF5KCkpCiAgICAgIAogICAgICBmdW5jdGlvbiBmcm9tSGV4U3RyaW5nKHN0cil7CiAgICAgICAgbGV0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHN0ci5sZW5ndGggLyAyKQogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnVmZmVyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBidWZmZXJbaV0gPSBwYXJzZUludChzdHIuc3Vic3RyKDIgKiBpLCAyKSwgMTYpCiAgICAgICAgfQogICAgICAgIHJldHVybiBidWZmZXIKICAgICAgfQogIAogICAgICBmdW5jdGlvbiByZWxheXMoKXsKICAgICAgICBjb25zdCBvYmogPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJyZWxheXMiKSkKICAgICAgICBjb25zdCByID0gb2JqICYmIG9iai5maWx0ZXIociA9PiByLm1hdGNoKC93c3M6XC9cLy4rLykpIHx8IFtdCiAgICAgICAgCiAgICAgICAgcmV0dXJuIHIubGVuZ3RoID4gMCAmJiByIHx8IFsKICAgICAgICAgICJ3c3M6Ly9yZWxheS5ub3N0ci5iYW5kIiwKICAgICAgICAgICJ3c3M6Ly9uYi5yZWxheS5jZW50ZXIiLCAKICAgICAgICAgICJ3c3M6Ly9ub3N0ci5jb21waWxlLWVycm9yLm5ldCIKICAgICAgICBdCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHByaXZrZXkoKXsKICAgICAgICBsZXQga2V5ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oInByaXZrZXkiKSB8fCAiIgogICAgICAgIAogICAgICAgIGlmKGtleS5sZW5ndGggPT0gNjMpewogICAgICAgICAga2V5ID0gTm9zdHJUb29scy5uaXAxOS5kZWNvZGUoa2V5KS5kYXRhCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybiBrZXkubGVuZ3RoID09IDY0ICYmIGtleSB8fCBudWxsCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHNldHRpbmcoa2V5LCBkZWZhdWx0dmFsdWUpewogICAgICAgIGNvbnN0IHYgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpCiAgICAgICAgcmV0dXJuIHYgJiYgb3B0aW9uKCJzZXQiICsga2V5LCBrZXksIHYpICYmIHYgfHwgZGVmYXVsdHZhbHVlCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIG9wdGlvbihjLCBrZXksIHZhbCl7CiAgICAgICAgcmV0dXJuIHFzKCIuIiArIGMgKyAiW2RhdGEtIiArIGtleSArICI9JyIgKyB2YWwgKyAiJ10iKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxcyhxKXsKICAgICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihxKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxc2EocSl7CiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChxKSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gZ2lkKGkpewogICAgICAgIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxdWVyeXR5cGUoKXsKICAgICAgICByZXR1cm4gcXMoIiNxdWVyeS10eXBlIikudmFsdWUgfHwgImFsbCIKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gdXBkYXRlcXVlcnkoKXsKICAgICAgICBsZXQgcGFydHMgPSAoZ2FsbGVyeSgpICYmICgiZzoiICsgZ2FsbGVyeSgpKSB8fCBkZWNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaGFzaC5zdWJzdHJpbmcoMSkpKS5zcGxpdCgiLyIpCiAgICAgICAgcXMoIiNxdWVyeWRpc3BsYXkgLnRleHQiKS5pbm5lclRleHQgPSBwYXJ0c1swXS5zdWJzdHJpbmcoMCwgMjApCiAgICAgICAgcXVlcnlzdHIgPSBwYXJ0c1swXQogICAgICAgIHFzKCIjcXVlcnkiKS52YWx1ZSA9IHBhcnRzWzBdCiAgICAgICAgcXMoIiNxdWVyeS10eXBlIikudmFsdWUgPSBwYXJ0c1sxXSB8fCAiYWxsIgogICAgICB9CgogICAgICBmdW5jdGlvbiBhY3RpdmUoKXsKICAgICAgICByZXR1cm4gcXMoIiNpbWFnZXMgLmFjdGl2ZSIpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGltYWdlb2Zmc2V0KG9mZnNldCl7CiAgICAgICAgY29uc3QgaW1hZ2VzID0gcXNhKCIjaW1hZ2VzID4gLml0ZW0iKS5maWx0ZXIoZSA9PiBlLmNsYXNzTGlzdC5jb250YWlucygidmlzaWJsZSIpKQogICAgICAgIHJldHVybiBpbWFnZXNbaW1hZ2VzLmluZGV4T2YoYWN0aXZlKCkpK29mZnNldF0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gbGFzdGFjdGl2ZSgpewogICAgICAgIHJldHVybiBxc2EoIiNpbWFnZXMgLmFjdGl2ZSIpLnBvcCgpICAgICAgCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIG1lbnUoKXsKICAgICAgICBxc2EoIiNtZW51LWNvbnRlbnQsICNvdmVybGF5IikuZm9yRWFjaChuID0+IG4uY2xhc3NMaXN0LnRvZ2dsZSgidmlzaWJsZSIpKQogICAgICB9CiAgCiAgICAgIGZ1bmN0aW9uIHNldGFjdGl2ZShjLCBrZXksIHZhbCl7CiAgICAgICAgcXNhKCIuIiArIGMpLmZvckVhY2gobiA9PiBuLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpKQogICAgICAgIGNvbnN0IG9wdGlvbiA9IHFzKCIuIiArIGMgKyAiW2RhdGEtIiArIGtleSArICI9JyIgKyB2YWwgKyAiJ10iKQogICAgICAgIG9wdGlvbj8uY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gc2Nyb2xsdmlzaWJsZShuLCBvZmZzZXQpewogICAgICAgIG9mZnNldCA9IG9mZnNldCB8fCAwCiAgICAgICAgcmV0dXJuIChuLm9mZnNldFRvcCArIG4ub2Zmc2V0SGVpZ2h0KSA+PSAoc2Nyb2xsWSAtIG9mZnNldCkKICAgICAgICAgICYmIG4ub2Zmc2V0VG9wIDw9IChzY3JvbGxZICsgdmlzdWFsVmlld3BvcnQuaGVpZ2h0ICsgb2Zmc2V0KQogICAgICB9CgogICAgICBhc3luYyBmdW5jdGlvbiB1cGRhdGVpbWFnZXNsb2FkKCl7CiAgICAgICAgcXNhKCIjaW1hZ2VzIC5pdGVtLmltZyIpLmZvckVhY2goYXN5bmMgaW1nID0+IHsKICAgICAgICAgIGlmKHNjcm9sbHZpc2libGUoaW1nLCB2aXN1YWxWaWV3cG9ydC5oZWlnaHQgLyAyKSl7CiAgICAgICAgICAgIGltZy5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSAidXJsKCIgKyBpbWdbImRhdGEtc3JjIl0gKyAiKSIKICAgICAgICAgIH1lbHNlewogICAgICAgICAgICBpbWcuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gIiIKICAgICAgICAgIH0KICAgICAgICB9KQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiB1cGRhdGVhbGx2aWRlb3BsYXkoKXsKICAgICAgICBxc2EoIiNpbWFnZXMgLml0ZW0udmlkZW8iKS5mb3JFYWNoKGFzeW5jIG4gPT4gdXBkYXRldmlkZW9wbGF5KG4pKQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiB1cGRhdGV2aWRlb3BsYXkobil7CiAgICAgICAgY29uc3QgYXBsYXkgPSBhdXRvcGxheSgpCiAgICAgICAgY29uc3QgdiA9IG4ucXVlcnlTZWxlY3RvcigidmlkZW8iKQogICAgICAgIAogICAgICAgIGlmKGFwbGF5ICE9ICJvbiIpewogICAgICAgICAgdi5tdXRlZCA9IGZhbHNlCiAgICAgICAgICB2LnBhdXNlKCkKICAgICAgICB9ZWxzZXsKICAgICAgICAgIHYubXV0ZWQgPSB0cnVlCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKCFzY3JvbGx2aXNpYmxlKG4pKXsKICAgICAgICAgIGlmKHYucmVhZHlTdGF0ZSA9PSA0KXsKICAgICAgICAgICAgdi5wYXVzZSgpCiAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgdi5wcmVsb2FkID0gIm5vbmUiCiAgICAgICAgICB9CiAgICAgICAgfWVsc2UgaWYodi5yZWFkeVN0YXRlICE9IDQpewogICAgICAgICAgdi5wcmVsb2FkID0gImF1dG8iCiAgICAgICAgfQogICAgICAgIGVsc2UgaWYoYXBsYXkgPT0gIm9uIiB8fCAoYXBsYXkgPT0gImhvdmVyIiAmJiB2ID09IGhvdmVyZWR2aWRlbykpewogICAgICAgICAgdi5wbGF5KCkKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsIGUgPT4gewogICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCkKICAgICAgICB1cGRhdGVpbWFnZXNsb2FkKCkKICAgICAgICB1cGRhdGVhbGx2aWRlb3BsYXkoKQogICAgICB9KQogICAgICAKICAgICAgbGV0IHRvdWNoID0gbnVsbAogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsIGUgPT4gdG91Y2ggPSBlLmNoYW5nZWRUb3VjaGVzWzBdKQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLCBlID0+IHsKICAgICAgICBjb25zdCB4ZGlmZiA9IGUuY2hhbmdlZFRvdWNoZXNbMF0uc2NyZWVuWCAtIHRvdWNoLnNjcmVlblgKCiAgICAgICAgaWYoeGRpZmYgPCAtNTApewogICAgICAgICAgc3dpcGUoMSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoeGRpZmYgPiA1MCl7CiAgICAgICAgICBzd2lwZSgtMSkKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBxcygiI3F1ZXJ5LWZvcm0iKS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLCBlID0+IHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUobnVsbCwgbnVsbCwgbG9jYXRpb24ucGF0aG5hbWUpCiAgICAgICAgbG9jYXRpb24uaGFzaCA9ICIjIiArIGVuY29kZVVSSUNvbXBvbmVudChxcygiI3F1ZXJ5IikudmFsdWUgKyAiLyIgKyBxdWVyeXR5cGUoKSkKICAgICAgICB1cGRhdGVxdWVyeSgpCiAgICAgICAgcXVlcnl3YWl0LnJlc29sdmUoKQogICAgICB9KQoKICAgICAgcXMoIiNyZWxheXMtZm9ybSIpLmFkZEV2ZW50TGlzdGVuZXIoInN1Ym1pdCIsIGFzeW5jIGUgPT4gewogICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgIGxldCByID0gSlNPTi5zdHJpbmdpZnkocXMoIiNyZWxheXMiKS52YWx1ZS5zcGxpdCgiXG4iKSkKICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgicmVsYXlzIiwgcikKICAgICAgICBkaXNjb25uZWN0KCkKICAgICAgfSkKICAgICAgCiAgICAgIHFzKCIjc2hhcmUtZm9ybSIpLmFkZEV2ZW50TGlzdGVuZXIoInN1Ym1pdCIsIGFzeW5jIGUgPT4gewogICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgIAogICAgICAgIGlmKHFzKCIjc2hhcmUtZm9ybSAuc3VibWl0IikudmFsdWUgPT0gImNsb3NlIil7CiAgICAgICAgICBxc2EoIi5kaWFsb2cudmlzaWJsZSIpLmZvckVhY2gobiA9PiBuLmNsYXNzTGlzdC5yZW1vdmUoInZpc2libGUiKSkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBldmVudHMgPSBxc2EoIiNpbWFnZXMgLml0ZW0iKS5maWx0ZXIobiA9PiBuLm9mZnNldFBhcmVudCkubWFwKG4gPT4gblsiZGF0YS1ldmVudCJdLmlkKQogICAgICAgIGNvbnN0IGV2ZW50ID0gYXdhaXQgcHVibGlzaCh7CiAgICAgICAgICAia2luZCI6IDMzMywKICAgICAgICAgICJjb250ZW50IjogSlNPTi5zdHJpbmdpZnkoZXZlbnRzKSwKICAgICAgICAgICJ0YWdzIjogW10KICAgICAgICB9KQoKICAgICAgICBhd2FpdCB3YWl0cmVzKG51bGwsICJPSyIpCgogICAgICAgIGNvbnN0IHVybCA9IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4gKyB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUKICAgICAgICAKICAgICAgICBjb25zdCBwdWJsaXNoZWRldmVudCA9IGF3YWl0IHB1Ymxpc2goewogICAgICAgICAgImtpbmQiOiAxLAogICAgICAgICAgImNvbnRlbnQiOiAiVGhpcyBpcyBhIGdhbGxlcnkgb2YgIiArIGV2ZW50cy5sZW5ndGgKICAgICAgICAgICAgKyAiIGltYWdlcy92aWRlb3Mgc2hhcmVkIGZyb20gZmlsZXMuaHRtbC4gQ2hlY2sgaXQgb3V0IGhlcmU6ICIgKyB1cmwgKyAiP2dhbGxlcnk9IiArIGV2ZW50LmlkLAogICAgICAgICAgInRhZ3MiOiBbCiAgICAgICAgICAgIFsiI2UiLCBldmVudC5pZF0sIAogICAgICAgICAgICBbIiNwIiwgZXZlbnQucHVia2V5XQogICAgICAgICAgXQogICAgICAgIH0pCgogICAgICAgIGF3YWl0IHdhaXRyZXMobnVsbCwgIk9LIikKICAgICAgICAKICAgICAgICBjb25zdCBiZWNoMzJpZCA9IGJlY2gzMi5lbmNvZGUoIm5vdGUiLCBmcm9tSGV4U3RyaW5nKHB1Ymxpc2hlZGV2ZW50LmlkKSkKICAgICAgICBxcygiI3NoYXJlLWZvcm0gLmNvbnRlbnQiKS5pbm5lckhUTUwgPSAnTm90ZSBwdWJsaXNoZWQgPGEgaHJlZj0iJyArIHByb3RvY29sICsgYmVjaDMyaWQgKyAnIj4nICsgYmVjaDMyaWQgKyAnPC9hPicKICAgICAgICBxcygiI3NoYXJlLWZvcm0gLnN1Ym1pdCIpLnZhbHVlID0gImNsb3NlIgogICAgICB9KQoKICAgICAgcXMoIiNwcml2a2V5LWZvcm0iKS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLCBhc3luYyBlID0+IHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICBjb25zdCBrZXkgPSBxcygiI3ByaXZrZXkiKS52YWx1ZQoKICAgICAgICBpZihrZXkubGVuZ3RoICE9IDY0ICYmIGtleS5sZW5ndGggIT0gNjMpewogICAgICAgICAgYWxlcnQoImtleSBzaG91bGQgYmUgNjMgb3IgNjQgY2hhcmFjdGVycyBsb25nIikKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgicHJpdmtleSIsIGtleSkKICAgICAgICBhbGVydCgia2V5IHNhdmVkIikKICAgICAgfSkKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgaWYoYXV0b3BsYXkoKSA9PSAiaG92ZXIiICYmIGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygidmlkZW8tY29udGFpbmVyIikpewogICAgICAgICAgaG92ZXJlZHZpZGVvID0gZS50YXJnZXQucXVlcnlTZWxlY3RvcigidmlkZW8iKQogICAgICAgICAgaG92ZXJlZHZpZGVvLnBsYXkoKQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IiwgYXN5bmMgKGUpID0+IHsKICAgICAgICBob3ZlcmVkdmlkZW8gPSBmYWxzZQogICAgICAgIGlmKCFxcygiI21lZGlhLWNvbnRhaW5lciIpLmNsYXNzTGlzdC5jb250YWlucygidmlzaWJsZSIpICYmIGF1dG9wbGF5KCkgPT0gImhvdmVyIiAmJiBlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInZpZGVvLWNvbnRhaW5lciIpKXsKICAgICAgICAgIHFzYSgidmlkZW8iKS5mb3JFYWNoKHYgPT4gdi5wYXVzZSgpKQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgYXN5bmMgKGUpID0+IHsKICAgICAgICBpZihlLnRhcmdldC50eXBlID09ICJzdWJtaXQiIHx8IChlLnRhcmdldC50YWdOYW1lID09ICJBIiAmJiBlLnRhcmdldC5ocmVmLm1hdGNoKC9eKHx3ZWJcKylub3N0clw6LykpKXsKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgIAogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJ0aXRsZSIpewogICAgICAgICAgcXMoIiNxdWVyeSIpLnZhbHVlID0gIiIKICAgICAgICAgIHFzKCIjcXVlcnktdHlwZSIpLnZhbHVlID0gImFsbCIKICAgICAgICAgIHFzKCIjZ28iKS5jbGljaygpCiAgICAgICAgfQoKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gImZpbHRlci1saWtlcyIpewogICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QudG9nZ2xlKCJmaWx0ZXItbGlrZXMiKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJzaGFyZSIpewogICAgICAgICAgY29uc3QgZXZlbnRzID0gcXNhKCIjaW1hZ2VzIC5pdGVtIikuZmlsdGVyKG4gPT4gbi5vZmZzZXRQYXJlbnQpLm1hcChuID0+IG5bImRhdGEtZXZlbnQiXS5pZCkKICAgICAgICAgIC8vY29uc3QgdGV4dCA9IHt0eXBlOiAiIiwgZXZlbnRzOiB9CiAgICAgICAgICBxcygiI3NoYXJlLWRpYWxvZyAuY29udGVudCIpLmlubmVySFRNTCA9ICI8cD5TaGFyZSBsaW5rIHRvIHRoaXMgZ2FsbGVyeSBvZiAiICsgZXZlbnRzLmxlbmd0aCArICIgaW1hZ2VzL3ZpZGVvcyB0byB5b3VyIG5vc3RyIHByb2ZpbGU/PC9wPiIKICAgICAgICAgIHFzKCIjc2hhcmUtZm9ybSAuc3VibWl0IikudmFsdWUgPSAicHVibGlzaCIKICAgICAgICAgIHFzYSgiI3NoYXJlLWRpYWxvZywgI292ZXJsYXkiKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QudG9nZ2xlKCJ2aXNpYmxlIikpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygic2hvdyIpKXsKICAgICAgICAgIGFjdGl2ZSgpPy5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgICAgZ2lkKGUudGFyZ2V0LmlkKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgc2hvdyhlLnRhcmdldC5pZCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLnRhcmdldC50YWdOYW1lICE9ICJBIiAmJiAocXMoIiNpbWFnZS1jb250YWluZXIiKSA9PSBlLnRhcmdldCB8fCBxcygiI2ltYWdlIikgPT0gZS50YXJnZXQgfHwgcXMoIiNtZWRpYS1jb250YWluZXIgdmlkZW8iKSA9PSBlLnRhcmdldCkpewogICAgICAgICAgaGlkZW1lZGlhKCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gIm1lbnUiKXsKICAgICAgICAgIG1lbnUoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLnRhcmdldC5pZCA9PSAib3ZlcmxheSIpewogICAgICAgICAgcXNhKCIuZGlhbG9nLnZpc2libGUiKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QucmVtb3ZlKCJ2aXNpYmxlIikpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzZXRjb2xzIikpewogICAgICAgICAgZm9yKGxldCBjIG9mIGNvbG9wdHMpewogICAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoImNvbHMiICsgYykKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJjb2xzIiArIGUudGFyZ2V0LmRhdGFzZXQuY29scykKICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJjb2xzIiwgZS50YXJnZXQuZGF0YXNldC5jb2xzKQogICAgICAgICAgc2V0YWN0aXZlKCJzZXRjb2xzIiwgImNvbHMiLCBjb2xzKCkpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzZXRhdXRvcGxheSIpKXsKICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJhdXRvcGxheSIsIGUudGFyZ2V0LmRhdGFzZXQuYXV0b3BsYXkpCiAgICAgICAgICBzZXRhY3RpdmUoInNldGF1dG9wbGF5IiwgImF1dG9wbGF5IiwgYXV0b3BsYXkoKSkKICAgICAgICAgIHVwZGF0ZWFsbHZpZGVvcGxheSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJsaWtlIikgJiYgbGlrZShlLnRhcmdldCkKICAgICAgfSkKICAgICAgCiAgICAgIGZ1bmN0aW9uIGhhc2tleSgpewogICAgICAgIHJldHVybiB3aW5kb3cubm9zdHIgfHwgcHJpdmtleSgpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHB1YmtleSgpewogICAgICAgIHJldHVybiB3aW5kb3cubm9zdHIgJiYgYXdhaXQgd2luZG93Lm5vc3RyLmdldFB1YmxpY0tleSgpIHx8IE5vc3RyVG9vbHMuZ2V0UHVibGljS2V5KHByaXZrZXkoKSkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gc2lnbihldmVudCl7CiAgICAgICAgaWYod2luZG93Lm5vc3RyKXsKICAgICAgICAgIHJldHVybiBhd2FpdCBub3N0ci5zaWduRXZlbnQoZXZlbnQpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGV2ZW50LnNpZyA9IE5vc3RyVG9vbHMuZ2V0U2lnbmF0dXJlKGV2ZW50LCBwcml2a2V5KCkpCiAgICAgICAgcmV0dXJuIGV2ZW50CiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGxpa2UobGluayl7CiAgICAgICAgY29uc3QgZXZlbnQgPSBsaW5rLnBhcmVudEVsZW1lbnRbImRhdGEtZXZlbnQiXQogICAgICAgIAogICAgICAgIGF3YWl0IHB1Ymxpc2goewogICAgICAgICAgImtpbmQiOiA3LAogICAgICAgICAgImNvbnRlbnQiOiAiKyIsCiAgICAgICAgICAidGFncyI6IFsKICAgICAgICAgICAgWyJlIiwgZXZlbnQuaWRdLAogICAgICAgICAgICBbInAiLCBldmVudC5wdWJrZXldCiAgICAgICAgICBdCiAgICAgICAgfSkKCiAgICAgICAgbGluay5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKCiAgICAgICAgY29uc3QgaW1hZ2VpZCA9IGxpbmtbImRhdGEtaXRlbS1pZCJdIHx8IGxpbmsuZGF0YXNldC5pbWFnZUlkCiAgICAgICAgCiAgICAgICAgaWYoaW1hZ2VpZCl7CiAgICAgICAgICBnaWQoaW1hZ2VpZCkucXVlcnlTZWxlY3RvcigiLmxpa2UiKS5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHByZXBhcmVfZXZlbnQoZXZlbnQpewogICAgICAgIGV2ZW50LnB1YmtleSA9IGF3YWl0IHB1YmtleSgpCiAgICAgICAgZXZlbnQuY3JlYXRlZF9hdCA9IHBhcnNlSW50KERhdGUubm93KCkgLyAxMDAwLCAxMCkKICAgICAgICBjb25zb2xlLmxvZygic2VyaWFsaXplIGV2ZW50IiwgSlNPTi5zdHJpbmdpZnkoZXZlbnQpKQogICAgICAgIGV2ZW50LmlkID0gTm9zdHJUb29scy5nZXRFdmVudEhhc2goZXZlbnQpCiAgICAgICAgY29uc29sZS5sb2coInNlcmlhbGl6ZSBldmVudCBvayIpCiAgICAgICAgcmV0dXJuIGV2ZW50CiAgICAgIH0KICAgICAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBwdWJsaXNoKGV2ZW50KXsKICAgICAgICBldmVudCA9IGF3YWl0IHByZXBhcmVfZXZlbnQoZXZlbnQpCiAgICAgICAgY29uc29sZS5sb2coInNpZ24gZXZlbnQiLCBldmVudCkKICAgICAgICBsZXQgc2lnbmVkZXZlbnQgPSBhd2FpdCBzaWduKGV2ZW50KQogICAgICAgIAogICAgICAgIGNvbnNvbGUubG9nKCJwdWJsaXNoIGV2ZW50Iiwgc2lnbmVkZXZlbnQpCiAgICAgICAgCiAgICAgICAgbGV0IGpzb24gPSBKU09OLnN0cmluZ2lmeShbIkVWRU5UIiwgc2lnbmVkZXZlbnRdKQogICAgICAgIHNvY2tldHMuZm9yRWFjaChzID0+IHMuc2VuZChqc29uKSkKICAgICAgICAKICAgICAgICByZXR1cm4gZXZlbnQKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gc3dpcGUob2Zmc2V0KXsKICAgICAgICBpZihpbWFnZW9mZnNldChvZmZzZXQpKXsKICAgICAgICAgIGltYWdlb2Zmc2V0KG9mZnNldCkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIHRoaXNbb2Zmc2V0ID09IC0xICYmICJsYXN0YWN0aXZlIiB8fCAiYWN0aXZlIl0oKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgICAgdXBkYXRlc2hvdygpCiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiB1cGRhdGVzaG93KCl7CiAgICAgICAgaWYocXMoIiNtZWRpYS1jb250YWluZXIiKS5jbGFzc0xpc3QuY29udGFpbnMoInZpc2libGUiKSl7CiAgICAgICAgICBoaWRldmlkZW8oKQogICAgICAgICAgc2hvdyhhY3RpdmUoKS5pZCkKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCBlID0+IHsKICAgICAgICBpZihbIlRhYiIsICJBcnJvd0xlZnQiLCAiQXJyb3dSaWdodCIsICJBcnJvd1VwIiwgIkFycm93RG93biJdLmluY2x1ZGVzKGUua2V5KSl7CiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJFc2NhcGUiKXsKICAgICAgICAgIG1lbnUoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUua2V5ID09ICJFbnRlciIgJiYgZS50YXJnZXQudGFnTmFtZSA9PSAiQk9EWSIpewogICAgICAgICAgaWYocXMoIiNtZWRpYS1jb250YWluZXIiKS5jbGFzc0xpc3QuY29udGFucygidmlzaWJsZSIpKXsKICAgICAgICAgICAgaGlkZW1lZGlhKCkKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHNob3coYWN0aXZlKCkuaWQpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd1VwIiAmJiBpbWFnZW9mZnNldCgtY29scygpKSl7CiAgICAgICAgICBpbWFnZW9mZnNldCgtY29scygpKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgbGFzdGFjdGl2ZSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgICB1cGRhdGVzaG93KCkKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd0Rvd24iICYmIGltYWdlb2Zmc2V0KGNvbHMoKSkpewogICAgICAgICAgaW1hZ2VvZmZzZXQoY29scygpKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgYWN0aXZlKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIHVwZGF0ZXNob3coKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93TGVmdCIpewogICAgICAgICAgc3dpcGUoLTEpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dSaWdodCIpewogICAgICAgICAgc3dpcGUoMSkKICAgICAgICB9CiAgICAgIH0pCgogICAgICBhc3luYyBmdW5jdGlvbiBoYW5kbGVxdWVyeXJlcyhyZXMsIHNvY2tldCwgcSwgdHlwZSwgc3RpbWUpewogICAgICAgIHNhdmUoc29ja2V0LCByZXMsIHEsIHR5cGUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSkKICAgICAgICBsb2coInF1ZXJ5IHJlcyIsIHJlcy5sZW5ndGgsIHNvY2tldC51cmwpCiAgICAgICAgcXVlcnljb3VudC0tCiAgICAgICAgaWYocXVlcnljb3VudCA9PSAwKXsKICAgICAgICAgIHFzKCIjbG9hZGluZyIpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSIKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbGV0IHdhaXQgPSB3YWl0bXMgLSAoRGF0ZS5ub3coKSAtIHN0aW1lKQogICAgICAgIHF1ZXJ5d2FpdCA9IHNsZWVwKHdhaXQpCiAgICAgICAgYXdhaXQgcXVlcnl3YWl0LnByb21pc2UKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcHJpbWFsZ2xvYmFsKHNvY2tldCl7CiAgICAgICAgbG9nKCJnbG9iYWwiLCBzb2NrZXQudXJsKQogICAgICAgIHF1ZXJ5Y291bnQrKwogICAgICAgIHFzKCIjbG9hZGluZyIpLmNsYXNzTGlzdC5hZGQoInZpc2libGUiKQogICAgICAgIGxldCBzdGltZSA9IERhdGUubm93KCkKICAgICAgICBsZXQgcWlkID0gImdsb2JhbF8iICsgKCsraWRjb3VudGVyKQogICAgICAgIGxldCBxaWRsaWtlcyA9ICJsaWtlc18iICsgKCsraWRjb3VudGVyKQoKICAgICAgICBpZihuZXdsaWtlcy5sZW5ndGggPiAwKXsKICAgICAgICAgIHByaW1hbHNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KFsKICAgICAgICAgICAgIlJFUSIsIAogICAgICAgICAgICBxaWRsaWtlcywgCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiY2FjaGUiOiBbCiAgICAgICAgICAgICAgICAiZXZlbnRzIiwgewogICAgICAgICAgICAgICAgICAiZXZlbnRfaWRzIjogbmV3bGlrZXMKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0KICAgICAgICAgIF0pKQoKICAgICAgICAgIGNvbnN0IGxpa2VfZXZlbnRzID0gKGF3YWl0IHdhaXRyZXMocWlkbGlrZXMpKVswXQogICAgICAgICAgbmV3bGlrZXMuc3BsaWNlKDApCiAgICAgICAgICAKICAgICAgICAgIGF3YWl0IHNhdmUoc29ja2V0LCBsaWtlX2V2ZW50cywgIiIsICJhbGwiLCB0cnVlLCB0cnVlLCBmYWxzZSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoWwogICAgICAgICAgIlJFUSIsIAogICAgICAgICAgcWlkLCAKICAgICAgICAgIHsKICAgICAgICAgICAgImNhY2hlIjogWwogICAgICAgICAgICAgICJleHBsb3JlIiwgCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInRpbWVmcmFtZSI6ICJsYXRlc3QiLAogICAgICAgICAgICAgICAgInNjb3BlIjogImdsb2JhbCIsCiAgICAgICAgICAgICAgICAibGltaXQiOiA1MAogICAgICAgICAgICAgIH0KICAgICAgICAgICAgXQogICAgICAgICAgfQogICAgICAgIF0pKQogICAgICAgIAogICAgICAgIGNvbnN0IHJlcyA9IChhd2FpdCB3YWl0cmVzKHFpZCkpWzBdCiAgICAgICAgYXdhaXQgaGFuZGxlcXVlcnlyZXMocmVzLmZpbHRlcihlID0+IGUua2luZCA9PSAxKSwgc29ja2V0LCAiIiwgImFsbCIsIHN0aW1lKQogICAgICAgIHByaW1hbGdsb2JhbChzb2NrZXQpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5KHNvY2tldCwgcHJpbWFsKXsKICAgICAgICBsb2coInF1ZXJ5Iiwgc29ja2V0LnVybCkKICAgICAgICBxdWVyeWNvdW50KysKICAgICAgICBxcygiI2xvYWRpbmciKS5jbGFzc0xpc3QuYWRkKCJ2aXNpYmxlIikKICAgICAgICAKICAgICAgICBsZXQgc3RpbWUgPSBEYXRlLm5vdygpCiAgICAgICAgbGV0IHEgPSBxdWVyeXN0ci50cmltKCkKICAgICAgICBsZXQgdHlwZSA9IHF1ZXJ5dHlwZSgpCiAgICAgICAgbGV0IGkgPSArK2lkY291bnRlcgogICAgICAgIGxldCBxaWQgPSAicXVlcnlfIiArIGkKICAgICAgICBjb25zdCBsaWtlc3JlcyA9IGF3YWl0IHF1ZXJ5bGlrZXMoc29ja2V0KQogICAgICAgIAogICAgICAgIGxpa2VzcmVzLmZvckVhY2goZXZlbnRpZCA9PiB7CiAgICAgICAgICBpZighbGlrZXMuaW5jbHVkZXMoZXZlbnRpZCkpewogICAgICAgICAgICBsaWtlcy5wdXNoKGV2ZW50aWQpCiAgICAgICAgICAgIG5ld2xpa2VzLnB1c2goZXZlbnRpZCkKICAgICAgICAgIH0KICAgICAgICB9KQogICAgICAgIAogICAgICAgIGxldCBnYWxsZXJ5bWF0Y2ggPSBxdWVyeXN0ci5tYXRjaCgvZzooW2EtejAtOV0rKS8pCiAgICAgICAgbGV0IHJlcyA9IG51bGwKICAgICAgICAKICAgICAgICBpZihnYWxsZXJ5bWF0Y2gpewogICAgICAgICAgY29uc3QgZ2FsbGVyeXJlcyA9IGF3YWl0IHF1ZXJ5ZXZlbnRzKHNvY2tldCwgWzMzM10sIFtnYWxsZXJ5bWF0Y2hbMV1dLCBudWxsKQogICAgICAgICAgY29uc3QgZXZlbnRpZHMgPSBKU09OLnBhcnNlKGdhbGxlcnlyZXNbMF0uY29udGVudCkKICAgICAgICAgIHJlcyA9IGF3YWl0IHF1ZXJ5ZXZlbnRzKHNvY2tldCwgWzFdLCBldmVudGlkcywgbnVsbCkKICAgICAgICAgIGNvbnNvbGUubG9nKCJnYWxsZXJ5IGNvbnRlbnQgcmVzIiwgcmVzKQogICAgICAgIH1lbHNlewogICAgICAgICAgbGV0IGZpbHRlcnMgPSBbXQoKICAgICAgICAgIGZpbHRlcnMucHVzaCguLi4odHlwZXNbdHlwZV0gfHwgW10pLm1hcCgodCkgPT4gewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgIGtpbmRzOiBbMV0sIAogICAgICAgICAgICAgIHNlYXJjaDogIi4iICsgdCwKICAgICAgICAgICAgICBsaW1pdDogMjAKICAgICAgICAgICAgfQogICAgICAgICAgfSkpCiAgICAgICAgICAKICAgICAgICAgIGlmKHEubGVuZ3RoID4gMCl7CiAgICAgICAgICAgIGZpbHRlcnMucHVzaCh7a2luZHM6IFsxXSwgc2VhcmNoOiBxfSkKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgaWYoZmlsdGVycy5sZW5ndGggPT0gMCl7CiAgICAgICAgICAgIGZpbHRlcnMucHVzaCh7a2luZHM6IFsxXX0pCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIGNvbnN0IHNlYXJjaG9iaiA9IFsiUkVRIiwgcWlkLCAuLi5maWx0ZXJzXQogICAgICAgICAgY29uc3Qgc2VhcmNoanNvbiA9IEpTT04uc3RyaW5naWZ5KHNlYXJjaG9iaikKICAgICAgICAgIHNvY2tldC5zZW5kKHNlYXJjaGpzb24pCiAgICAgICAgICAKICAgICAgICAgIHJlcyA9IChhd2FpdCB3YWl0cmVzKHFpZCkpWzBdCiAgICAgICAgICAKICAgICAgICAgIHJlcyA9IHJlcy5maWx0ZXIobyA9PiB7CiAgICAgICAgICAgIGlmKHEubGVuZ3RoID4gMCl7CiAgICAgICAgICAgICAgZm9yKGxldCB3b3JkIG9mIHEuc3BsaXQoIiAiKSl7CiAgICAgICAgICAgICAgICBpZihvLmNvbnRlbnQudG9Mb3dlckNhc2UoKS5pbmRleE9mKHdvcmQudG9Mb3dlckNhc2UoKSkgPT0gLTEpewogICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2UKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlCiAgICAgICAgICB9KQogICAgICAgIH0KICAgICAgICAKICAgICAgICBhd2FpdCBoYW5kbGVxdWVyeXJlcyhyZXMsIHNvY2tldCwgcSwgdHlwZSwgc3RpbWUpCiAgICAgICAgcXVlcnkoc29ja2V0KQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeWxpa2VzKHNvY2tldCl7CiAgICAgICAgaWYoIWhhc2tleSgpKXsKICAgICAgICAgIHJldHVybiBbXQogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBteXB1YmtleSA9IGF3YWl0IHB1YmtleSgpCiAgICAgICAgY29uc3QgZXZlbnRzID0gYXdhaXQgcXVlcnlldmVudHMoc29ja2V0LCBbN10sIG51bGwsIFtteXB1YmtleV0pCiAgICAgICAgcmV0dXJuIGV2ZW50cy5tYXAoZSA9PiBlLnRhZ3MuZmluZCh0ID0+IHRbMF0gPT0gImUiKVsxXSkKICAgICAgfQoKICAgICAgYXN5bmMgZnVuY3Rpb24gcXVlcnlldmVudHMoc29ja2V0LCBraW5kcywgZXZlbnRpZHMsIGF1dGhvcnMpewogICAgICAgIGNvbnN0IHF1ZXJ5aWQgPSAiZXZlbnRzXyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgY29uc3QgZmlsdGVycyA9IHt9CiAgICAgICAgCiAgICAgICAgZmlsdGVycy5raW5kcyA9IGtpbmRzCiAgICAgICAgCiAgICAgICAgaWYoZXZlbnRpZHMpewogICAgICAgICAgZmlsdGVyc1siaWRzIl0gPSBldmVudGlkcwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihhdXRob3JzKXsKICAgICAgICAgIGZpbHRlcnNbImF1dGhvcnMiXSA9IGF1dGhvcnMKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KFsKICAgICAgICAgICJSRVEiLCAKICAgICAgICAgIHF1ZXJ5aWQsIAogICAgICAgICAgZmlsdGVycwogICAgICAgIF0pCiAgICAgIAogICAgICAgIGNvbnNvbGUubG9nKCJxZSBqc29uIiwganNvbikKICAgICAgICAKICAgICAgICBzb2NrZXQuc2VuZChqc29uKQogICAgICAgIAogICAgICAgIHJldHVybiAoYXdhaXQgd2FpdHJlcyhxdWVyeWlkKSlbMF0gfHwgW10KICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcXVlcnlwdWJrZXkoc29ja2V0LCBwdWJrKXsKICAgICAgICBjb25zdCBxdWVyeWlkID0gInF1ZXJ5XyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgc29ja2V0LnNlbmQocXVlcmllcy5hdXRob3IucmVwbGFjZSgiPEk+IiwgcXVlcnlpZCkucmVwbGFjZSgiPFA+IiwgcHViaykpCgogICAgICAgIHJldHVybiAoYXdhaXQgd2FpdHJlcyhxdWVyeWlkKSlbMF0KICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gc2F2ZShzb2NrZXQsIGV2ZW50cywgcSwgcXR5cGUsIHJlYWN0ZWQsIGFwcGVuZCwgcXVlcnltZXRhKXsKICAgICAgICBsZXQgZXZlbnRwdWJrZXlzID0gW10KICAgICAgICBsZXQgcmVzdWx0cyA9IFtdCiAgICAgICAgY29uc3QgZXZlbnRpZHMgPSBldmVudHMubWFwKGUgPT4gZS5pZCkKICAgICAgICBsZXQgbmV3dXJscyA9IFtdCiAgICAgICAgCiAgICAgICAgZm9yKGxldCBldmVudCBvZiBldmVudHMpewogICAgICAgICAgbGV0IHVybHNtYXRjaCA9IFtdCiAgICAgICAgICAKICAgICAgICAgIGlmKHF0eXBlICE9ICJ2aWRlbyIpewogICAgICAgICAgICB1cmxzbWF0Y2gucHVzaCguLi4oZXZlbnQuY29udGVudC5tYXRjaChpbWdyZWdleCkgfHwgW10pKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBpZihxdHlwZSAhPSAiaW1hZ2UiKXsKICAgICAgICAgICAgdXJsc21hdGNoLnB1c2goLi4uKGV2ZW50LmNvbnRlbnQubWF0Y2godmlkZW9yZWdleCkgfHwgW10pKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICB1cmxzbWF0Y2ggPSB1cmxzbWF0Y2guZmlsdGVyKHVybCA9PiAhdXJscy5pbmNsdWRlcyh1cmwpKQoKICAgICAgICAgIGlmKHVybHNtYXRjaC5sZW5ndGggPiAwKXsKICAgICAgICAgICAgbmV3dXJscy5wdXNoKHsKICAgICAgICAgICAgICBldmVudDogZXZlbnQsCiAgICAgICAgICAgICAgdXJsczogdXJsc21hdGNoCiAgICAgICAgICAgIH0pCiAgICAgICAgICAgIAogICAgICAgICAgICB1cmxzLnB1c2goLi4udXJsc21hdGNoKQogICAgICAgICAgICBldmVudHB1YmtleXMuaW5jbHVkZXMoZXZlbnQucHVia2V5KSB8fCBldmVudHB1YmtleXMucHVzaChldmVudC5wdWJrZXkpCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGxvZygicXVlcnkgbWV0YSIsIHNvY2tldC51cmwpCiAgICAgICAgbGV0IG1ldGFldmVudHMgPSAocXVlcnltZXRhICYmIGF3YWl0IHF1ZXJ5ZXZlbnRzKHNvY2tldCwgWzBdLCBudWxsLCBldmVudHB1YmtleXMpIHx8IFtdKQogICAgICAgIAogICAgICAgIGZvcihsZXQgZW50cnkgb2YgbmV3dXJscyl7CiAgICAgICAgICBmb3IobGV0IHVybCBvZiBlbnRyeS51cmxzKXsKICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHsKICAgICAgICAgICAgICByZWFjdGVkOiByZWFjdGVkIHx8IGxpa2VzLmluY2x1ZGVzKGVudHJ5LmV2ZW50LmlkKSwgCiAgICAgICAgICAgICAgdXJsOiB1cmwsIAogICAgICAgICAgICAgIGV2ZW50OiBlbnRyeS5ldmVudCwgCiAgICAgICAgICAgICAgYmVjaDMyaWQ6IGJlY2gzMi5lbmNvZGUoIm5vdGUiLCBmcm9tSGV4U3RyaW5nKGVudHJ5LmV2ZW50LmlkKSksCiAgICAgICAgICAgICAgbWV0YTogbWV0YWV2ZW50cy5maW5kKG8gPT4gby5wdWJrZXkgPT0gZW50cnkuZXZlbnQucHVia2V5KQogICAgICAgICAgICB9KQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICBsb2coInNhdmUgcmVzIiwgcmVzdWx0cy5sZW5ndGgsIHNvY2tldC51cmwpCiAgICAgICAgdXBkYXRlY29udGVudChyZXN1bHRzLCBxLCBhcHBlbmQpCiAgICAgIH0KICAgICAgCiAgICAgIGxldCBsb2FkZWQgPSAwCiAgICAgIAogICAgICBmdW5jdGlvbiB1cGRhdGVjb250ZW50KHJlc3VsdHMsIHEsIGFwcGVuZCl7CiAgICAgICAgcmVzdWx0cy5yZXZlcnNlKCkuZm9yRWFjaChpdGVtID0+IHsKICAgICAgICAgIGNvbnN0IHR5cGUgPSBpdGVtLnVybC5tYXRjaCh2aWRlb2V4dHJlZ2V4KSAmJiAidmlkZW8iIHx8ICJpbWFnZSIKICAgICAgICAgIGNvbnN0IHRleHQgPSAocSB8fCAidmlldyBub3RlIikuc3Vic3RyaW5nKC0zMCkKICAgICAgICAgIGNvbnN0IGlkID0gIml0ZW1fIiArICgrK2lkY291bnRlcikKICAgICAgICAgIGNvbnN0IGNvbnRlbnRlbGVtZW50cyA9ICc8ZGl2IGNsYXNzPSJ0eXBlIj4nICsgcXMoIiN0ZW1wbGF0ZSAuIiArIHR5cGUgKyAic3ZnIikub3V0ZXJIVE1MICsgJzwvZGl2PjxhIGNsYXNzPSJsaWtlJyArIChpdGVtLnJlYWN0ZWQgPyAnIHJlYWN0ZWQnIDogJycpICsgJyIgZGF0YS1pdGVtLWlkPSInICsgaWQgKyAKICAgICAgICAgICAgJyIgaHJlZj0iIyI+JyArIHFzKCIjdGVtcGxhdGUgLmhlYXJ0c3ZnIikub3V0ZXJIVE1MICsgJzwvYT48YSBjbGFzcz0icXVlcnkiIGhyZWY9IicgKyBwcm90b2NvbCArIAogICAgICAgICAgICBpdGVtLmJlY2gzMmlkICsgJyI+JyArIHRleHQgKyAnPC9hPicKICAgICAgICAgIGxldCByb290ID0gbnVsbAogICAgICAgICAgbGV0IHYgPSBudWxsCiAgICAgICAgICAKICAgICAgICAgIGlmKGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpKXsKICAgICAgICAgICAgcm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpCiAgICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgidmlkZW8tY29udGFpbmVyIikKICAgICAgICAgICAgcm9vdC5pbm5lckhUTUwgPSBjb250ZW50ZWxlbWVudHMKICAgICAgICAgICAgCiAgICAgICAgICAgIHYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpCiAgICAgICAgICAgIHZbImRhdGEtaXRlbS1pZCJdID0gaWQKICAgICAgICAgICAgdi5wcmVsb2FkID0gIm5vbmUiCiAgICAgICAgICAgIHYubG9vcCA9IHRydWUKICAgICAgICAgICAgdi5wbGF5c2lubGluZSA9ICIiCiAgICAgICAgICAgIAogICAgICAgICAgICB2Lm9uY2FucGxheSA9IGFzeW5jIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIGNvbnN0IGFzcGVjdCA9IHRoaXMudmlkZW9XaWR0aCAvIHRoaXMudmlkZW9IZWlnaHQKICAgICAgICAgICAgICBpZihhc3BlY3QgPiAxKXsKICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUud2lkdGggPSAoYXNwZWN0ICogMTAwKSArICIlIgogICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgdGhpcy5zdHlsZS5oZWlnaHQgPSAoMSAvIGFzcGVjdCAqIDEwMCkgKyAiJSIKICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUubWFyZ2luVG9wID0gLSgoMSAvIGFzcGVjdCAqIDEwMCAtIDEwMCkgLyAyKSArICIlIgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAKICAgICAgICAgICAgICB1cGRhdGV2aWRlb3BsYXkodGhpcy5wYXJlbnRFbGVtZW50KQogICAgICAgICAgICB9CgogICAgICAgICAgICBjb25zdCBleHQgPSBpdGVtLnVybC5tYXRjaCh2aWRlb2V4dHJlZ2V4KVsxXQogICAgICAgICAgICB2LmlubmVySFRNTCA9ICc8c291cmNlIHNyYz0iJyArIGl0ZW0udXJsICsgJyIgdHlwZT0idmlkZW8vJyArIGV4dCArICciPjwvc291cmNlPicKICAgICAgICAgICAgCiAgICAgICAgICAgIHJvb3QuYXBwZW5kKHYpCiAgICAgICAgICB9ZWxzZSBpZihpdGVtLnVybC5tYXRjaChpbWdleHRyZWdleCkpewogICAgICAgICAgICByb290ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpCiAgICAgICAgICAgIHJvb3QuaHJlZiA9ICIjIgogICAgICAgICAgICByb290LmlubmVySFRNTCA9IGNvbnRlbnRlbGVtZW50cwogICAgICAgICAgICAgIAogICAgICAgICAgICBpZih0eXBlID09ICJpbWFnZSIpewogICAgICAgICAgICAgIC8vbGV0IGltZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpCiAgICAgICAgICAgICAgLy9pbWcuYWx0ID0gaXRlbS51cmwKICAgICAgICAgICAgICByb290WyJkYXRhLXNyYyJdID0gaXRlbS51cmwKICAgICAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoImltZyIpCiAgICAgICAgICAgICAgLy9pbWcuY2xhc3NMaXN0LmFkZCgiZGF0YSIpCiAgICAgICAgICAgICAgLy9yb290LmFwcGVuZChpbWcpCiAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgIHJvb3QuaW5uZXJIVE1MICs9ICc8c3BhbiBjbGFzcz0iZmlsZSI+JyArIGl0ZW0udXJsICsgJzwvc3Bhbj4nCiAgICAgICAgICAgIH0KICAgICAgICAgIH1lbHNlewogICAgICAgICAgICByZXR1cm4KICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgcm9vdC5pZCA9IGlkCiAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoJ3Zpc2libGUnKQogICAgICAgICAgcm9vdFsiZGF0YS1pdGVtIl0gPSBpdGVtCiAgICAgICAgICByb290WyJkYXRhLWV2ZW50Il0gPSBpdGVtLmV2ZW50CiAgICAgICAgICByb290WyJkYXRhLXF1ZXJ5Il0gPSBxCiAgICAgICAgICByb290WyJkYXRhLXRleHQiXSA9IHRleHQKICAgICAgICAgIAogICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKHR5cGUpCiAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoIml0ZW0iKQogICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJzaG93IikKICAgICAgICAgIAogICAgICAgICAgaWYoaXRlbS5yZWFjdGVkKXsKICAgICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgcXMoIiNpbWFnZXMiKVthcHBlbmQgJiYgImFwcGVuZCIgfHwgInByZXBlbmQiXShyb290KQogICAgICAgICAgCiAgICAgICAgICBpZih2KXsKICAgICAgICAgICAgdXBkYXRldmlkZW9wbGF5KHJvb3QpCiAgICAgICAgICB9CiAgICAgICAgfSkKCiAgICAgICAgdXBkYXRlaW1hZ2VzbG9hZCgpCiAgICAgICAgCiAgICAgICAgaWYoYWN0aXZlKCkgPT0gbnVsbCl7CiAgICAgICAgICBxcygiI2ltYWdlcyAuaXRlbSIpPy5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgIH0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gaGlkZW1lZGlhKCl7CiAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICJzY3JvbGwiCiAgICAgICAgcXNhKCIjbWVkaWEtY29udGFpbmVyLCAjaW1hZ2UsICNtZWRpYS1mb290ZXIiKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QucmVtb3ZlKCJ2aXNpYmxlIikpCiAgICAgICAgZ2lkKCJpbWFnZS1saWtlIikuY2xhc3NMaXN0LnJlbW92ZSgicmVhY3RlZCIpCiAgICAgICAgaGlkZXZpZGVvKCkKICAgICAgfQoKICAgICAgZnVuY3Rpb24gaGlkZXZpZGVvKCl7CiAgICAgICAgY29uc3QgdiA9IHFzKCIjbWVkaWEtY29udGFpbmVyIHZpZGVvIikKICAgICAgICAKICAgICAgICBpZih2KXsKICAgICAgICAgIHYubXV0ZWQgPSB0cnVlCiAgICAgICAgICBnaWQodlsiZGF0YS1pdGVtLWlkIl0pLmFwcGVuZENoaWxkKHYpCiAgICAgICAgICB1cGRhdGV2aWRlb3BsYXkodi5wYXJlbnRFbGVtZW50KQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gd2FpdHJlcyhrZXksIHR5cGUpewogICAgICAgIGxldCByZXNoYW5kbGVyID0gZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KXsKICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGUgfHwgIkVPU0UiCiAgICAgICAgICB0aGlzLmV2ZW50cyA9IFtdCiAgICAgICAgICB0aGlzLmhhbmRsZSA9IGZ1bmN0aW9uKHJlcyl7CiAgICAgICAgICAgIGxldCBvID0gSlNPTi5wYXJzZShyZXMuZGF0YSkKICAgICAgICAgICAgaWYoa2V5ID09IG51bGwgfHwgb1sxXSA9PSBrZXkpewogICAgICAgICAgICAgIGlmKG9bMF0gPT0gdGhpcy50eXBlKXsKICAgICAgICAgICAgICAgIHJlc29sdmUoW3RoaXMuZXZlbnRzLCBvXSkKICAgICAgICAgICAgICAgIHJlc2hhbmRsZXJzLnNwbGljZShyZXNoYW5kbGVycy5pbmRleE9mKHRoaXMpLCAxKQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICB0aGlzLmV2ZW50cy5wdXNoKG9bMl0pCiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgICAgIGxldCBoYW5kbGVyID0gbmV3IHJlc2hhbmRsZXIocmVzb2x2ZSwgcmVqZWN0KQogICAgICAgICAgcmVzaGFuZGxlcnMucHVzaChoYW5kbGVyKQogICAgICAgIH0pCiAgICAgIH0KICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBjaGVja3VwZGF0ZShzb2NrZXQpewogICAgICAgIGNvbnN0IHVwZGF0ZXNyZXMgPSBhd2FpdCBxdWVyeXB1YmtleShzb2NrZXQsIHVwZGF0ZXNwdWJrZXkpCiAgICAgICAgY29uc3QgdXBkYXRlbm90ZSA9IHVwZGF0ZXNyZXMuZmluZChuID0+IG4uY29udGVudC5tYXRjaCgvXmh0dHBzXDpcL1wvLykpCiAgICAgICAgCiAgICAgICAgaWYoIXVwZGF0ZW5vdGUpewogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IGFnZSA9IE1hdGgucm91bmQoKERhdGUubm93KCkgLyAxMDAwIC0gdXBkYXRlbm90ZS5jcmVhdGVkX2F0KSAvIDM2MDAgLyAyNCkKICAgICAgICBjb25zdCBub3RlaWQgPSBiZWNoMzIuZW5jb2RlKCJub3RlIiwgZnJvbUhleFN0cmluZyh1cGRhdGVub3RlLmlkKSkKICAgICAgICBxcygiI3JlbGVhc2UiKS5ocmVmID0gcHJvdG9jb2wgKyBub3RlaWQKICAgICAgICBxcygiI3JlbGVhc2UiKS5pbm5lclRleHQgPSAoYWdlID09IDAgJiYgInRvZGF5IiB8fCBhZ2UgKyAiIGRheShzKSBhZ28iKQogICAgICB9CgogICAgICBmdW5jdGlvbiBzbGVlcChtcyl7CiAgICAgICAgcmV0dXJuIG5ldyBmdW5jdGlvbigpewogICAgICAgICAgbGV0IHRpbWVvdXQgPSBudWxsCiAgICAgICAgICBsZXQgciA9IG51bGwKICAgICAgICAgIAogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcHJvbWlzZTogbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KXsKICAgICAgICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCksIG1zKQogICAgICAgICAgICAgIHIgPSByZXNvbHZlCiAgICAgICAgICAgIH0pLAogICAgICAgICAgICByZXNvbHZlOiBmdW5jdGlvbigpewogICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KQogICAgICAgICAgICAgIHIoKQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBzaG93KGlkKXsKICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiIKICAgICAgICBjb25zdCBpdGVtID0gZ2lkKGlkKVsiZGF0YS1pdGVtIl0KICAgICAgICBjb25zdCBtZWRpYSA9IGdpZCgibWVkaWEtY29udGFpbmVyIikKICAgICAgICBjb25zdCBpbWFnZSA9IGdpZCgiaW1hZ2UiKQoKICAgICAgICBpZihpdGVtLnVybC5tYXRjaCh2aWRlb2V4dHJlZ2V4KSl7CiAgICAgICAgICBpbWFnZS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiCiAgICAgICAgICBjb25zdCB2ID0gZ2lkKGlkKS5xdWVyeVNlbGVjdG9yKCJ2aWRlbyIpCiAgICAgICAgICBxcygiI21lZGlhLWNvbnRhaW5lciIpLmFwcGVuZENoaWxkKHYpCiAgICAgICAgICB2Lm11dGVkID0gZmFsc2UKICAgICAgICAgIHYucGxheSgpCiAgICAgICAgfWVsc2V7CiAgICAgICAgICBpbWFnZS5zcmMgPSBpdGVtLnVybAogICAgICAgICAgaW1hZ2UuY2xhc3NMaXN0LmFkZCgidmlzaWJsZSIpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGl0ZW0ubWV0YSl7CiAgICAgICAgICBjb25zdCBtZXRhY29udGVudCA9IEpTT04ucGFyc2UoaXRlbS5tZXRhLmNvbnRlbnQpCiAgICAgICAgICBjb25zdCBuYW1lID0gbWV0YWNvbnRlbnQuZGlzcGxheV9uYW1lIHx8IG1ldGFjb250ZW50Lm5hbWUKICAgICAgICAgIHFzKCIjaW1hZ2UtdXNlciIpLmNsYXNzTGlzdC5hZGQoInZpc2libGUiKQogICAgICAgICAgcXMoIiNpbWFnZS11c2VyIikuaHJlZiA9IHByb3RvY29sICsgYmVjaDMyLmVuY29kZSgibnB1YiIsIGZyb21IZXhTdHJpbmcoaXRlbS5tZXRhLnB1YmtleSkpCiAgICAgICAgICBxcygiI2ltYWdlLXVzZXIiKS5pbm5lclRleHQgPSBuYW1lCiAgICAgICAgfWVsc2V7CiAgICAgICAgICBxcygiI2ltYWdlLXVzZXIiKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiCiAgICAgICAgfQoKICAgICAgICBnaWQoImltYWdlLWxpa2UiKVsiZGF0YS1pdGVtLWlkIl0gPSBpZAogICAgICAgIGdpZCgibWVkaWEtZm9vdGVyIilbImRhdGEtZXZlbnQiXSA9IGl0ZW0uZXZlbnQKCiAgICAgICAgaWYoaXRlbS5yZWFjdGVkKXsKICAgICAgICAgIGdpZCgiaW1hZ2UtbGlrZSIpLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBhID0gcXMoIiNpbWFnZS1xdWVyeSIpCiAgICAgICAgYS5ocmVmID0gcHJvdG9jb2wgKyBpdGVtLmJlY2gzMmlkCiAgICAgICAgYS5pbm5lclRleHQgPSBnaWQoaWQpWyJkYXRhLXRleHQiXQogICAgICAgIAogICAgICAgIGdpZCgibWVkaWEtY29udGFpbmVyIikuY2xhc3NMaXN0LmFkZCgidmlzaWJsZSIpCiAgICAgICAgZ2lkKCJtZWRpYS1mb290ZXIiKS5jbGFzc0xpc3QuYWRkKCJ2aXNpYmxlIikKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gY29ubmNvdW50KCl7CiAgICAgICAgcmV0dXJuIHNvY2tldHMuZmlsdGVyKHIgPT4gci5yZWFkeVN0YXRlID09IDEpLmxlbmd0aAogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBkaXNjb25uZWN0KCl7CiAgICAgICAgZm9yKGxldCBzb2NrZXQgb2Ygc29ja2V0cyl7CiAgICAgICAgICBzb2NrZXQuY2xvc2UoKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBzb2NrZXRzLnNwbGljZSgwKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBsb2cobXNnKXsKICAgICAgICBsZXQgc2Nyb2xsID0gcXMoIiNsb2dzIikuc2Nyb2xsVG9wID09IHFzKCIjbG9ncyIpLnNjcm9sbFRvcE1heAogICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpCiAgICAgICAgZGl2LmlubmVyVGV4dCA9IEFycmF5LmZyb20oYXJndW1lbnRzKS5qb2luKCIgIikKICAgICAgICBxcygiI2xvZ3MiKS5hcHBlbmQoZGl2KQogICAgICAgIAogICAgICAgIHNjcm9sbCAmJiBxcygiI2xvZ3MiKS5zY3JvbGxUbygwLCBxcygiI2xvZ3MiKS5zY3JvbGxUb3BNYXgpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGNvbm5lY3QodXJsKXsKICAgICAgICBsb2coImNvbm5lY3RpbmciLCB1cmwpCiAgICAgICAgbGV0IHNvY2tldCA9IG5ldyBXZWJTb2NrZXQodXJsKQogICAgICAgIAogICAgICAgIHNvY2tldC5vbm1lc3NhZ2UgPSBtZXNzYWdlID0+IHJlc2hhbmRsZXJzLmZvckVhY2gocmggPT4gcmguaGFuZGxlKG1lc3NhZ2UpKQogICAgICAgIAogICAgICAgIHNvY2tldC5vbmNsb3NlID0gYXN5bmMgZnVuY3Rpb24oKXsKICAgICAgICAgIHNvY2tldHMuc3BsaWNlKHNvY2tldHMuaW5kZXhPZihzb2NrZXQpLCAxKQogICAgICAgICAgcXMoIiNjb25uY291bnQiKS5pbm5lclRleHQgPSBjb25uY291bnQoKSArIChwcmltYWxzb2NrZXQgJiYgMSkKICAgICAgICAgIGxvZygiZGlzY29ubmVjdGVkIiwgdGhpcy51cmwsIGNvbm5jb3VudCgpKQogICAgICAgICAgYXdhaXQgc2xlZXAoMTAwMCkucHJvbWlzZQogICAgICAgICAgY29ubmVjdCh0aGlzLnVybCkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgc29ja2V0Lm9ub3BlbiA9IGZ1bmN0aW9uKCl7CiAgICAgICAgICBxcygiI2Nvbm5jb3VudCIpLmlubmVyVGV4dCA9IGNvbm5jb3VudCgpICsgKHByaW1hbHNvY2tldCAmJiAxKQogICAgICAgICAgbG9nKCJjb25uZWN0ZWQiLCB0aGlzLnVybCwgY29ubmNvdW50KCkpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybiBzb2NrZXQKICAgICAgfQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsIGFzeW5jICgpID0+IHsKICAgICAgICBwcmltYWxzb2NrZXQgPSBjb25uZWN0KCJ3c3M6Ly9jYWNoZTMucHJpbWFsLm5ldC9jYWNoZTE3IikKICAgICAgICBwcmltYWxzb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcigib3BlbiIsIGZ1bmN0aW9uKCl7CiAgICAgICAgICBwcmltYWxnbG9iYWwodGhpcykKICAgICAgICB9KQogICAgICAgIAogICAgICAgIHByaW1hbHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsIGZ1bmN0aW9uKCl7CiAgICAgICAgICBwcmltYWxzb2NrZXQgPSBudWxsCiAgICAgICAgfSkKICAgICAgICAKICAgICAgICBmb3IobGV0IHVybCBvZiByZWxheXMoKSl7CiAgICAgICAgICBjb25zdCBzb2NrZXQgPSBjb25uZWN0KHVybCkKICAgICAgICAgIHNvY2tldHMucHVzaChzb2NrZXQpCiAgICAgICAgICAKICAgICAgICAgIHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCJvcGVuIiwgZnVuY3Rpb24oKXsKICAgICAgICAgICAgY2hlY2t1cGRhdGUodGhpcykKICAgICAgICAgICAgcXVlcnkodGhpcykKICAgICAgICAgIH0pCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGF3YWl0IHNsZWVwKDEwMCkucHJvbWlzZQogICAgICAgIAogICAgICAgIGlmKGhhc2tleSgpKXsKICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgibm9zdHIiKQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGZvcihsZXQgYyBvZiBjb2xvcHRzKXsKICAgICAgICBkb2N1bWVudC53cml0ZSgnPHN0eWxlPicgKyBjb2xzY3NzLmlubmVyVGV4dC5yZXBsYWNlKC9cJFx7Y29sc1x9L2csIGMpICsgJzwvc3R5bGU+JykKICAgICAgfQogICAgPC9zY3JpcHQ+CiAgPC9ib2R5Pgo8L2h0bWw+Cg==