// ==UserScript==
// @name 网页图片下载器
// @namespace http://tampermonkey.net/
// @version 1.0
// @description 下载网页中的图片
// @match https://mp.weixin.qq.com/s/*
// @grant none
// @run-at document-end
// ==/UserScript==
(async function() {
'use strict';
// jsPDF base64 源代码
const jsPdfBase64 = `LyoqIEBsaWNlbnNlCiAqCiAqIGpzUERGIC0gUERGIERvY3VtZW50IGNyZWF0aW9uIGZyb20gSmF2YVNjcmlwdAogKiBWZXJzaW9uIDIuNS4xIEJ1aWx0IG9uIDIwMjItMDEtMjhUMTU6Mzc6NTcuNzg5WgogKiAgICAgICAgICAgICAgICAgICAgICBDb21taXRJRCAwMDAwMDAwMAogKgogKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAyMSBKYW1lcyBIYWxsIDxqYW1lc0BwYXJhbGwuYXg+LCBodHRwczovL2dpdGh1Yi5jb20vTXJSaW8vanNQREYKICogICAgICAgICAgICAgICAyMDE1LTIwMjEgeVdvcmtzIEdtYkgsIGh0dHA6Ly93d3cueXdvcmtzLmNvbQogKiAgICAgICAgICAgICAgIDIwMTUtMjAyMSBMdWthcyBIb2xsw6RuZGVyIDxsdWthcy5ob2xsYWVuZGVyQHl3b3Jrcy5jb20+LCBodHRwczovL2dpdGh1Yi5jb20vSGFja2JyZXR0WFhYCiAqICAgICAgICAgICAgICAgMjAxNi0yMDE4IEFyYXMgQWJiYXNpIDxhcmFzLmFiYmFzaUBnbWFpbC5jb20+CiAqICAgICAgICAgICAgICAgMjAxMCBBYXJvbiBTcGlrZSwgaHR0cHM6Ly9naXRodWIuY29tL2Fjc3Bpa2UKICogICAgICAgICAgICAgICAyMDEyIFdpbGxvdyBTeXN0ZW1zIENvcnBvcmF0aW9uLCBodHRwczovL2dpdGh1Yi5jb20vd2lsbG93c3lzdGVtcwogKiAgICAgICAgICAgICAgIDIwMTIgUGFibG8gSGVzcywgaHR0cHM6Ly9naXRodWIuY29tL3BhYmxvaGVzcwogKiAgICAgICAgICAgICAgIDIwMTIgRmxvcmlhbiBKZW5ldHQsIGh0dHBzOi8vZ2l0aHViLmNvbS9mamVuZXR0CiAqICAgICAgICAgICAgICAgMjAxMyBXYXJyZW4gV2Vja2Vzc2VyLCBodHRwczovL2dpdGh1Yi5jb20vd2FycmVud2Vja2Vzc2VyCiAqICAgICAgICAgICAgICAgMjAxMyBZb3Vzc2VmIEJlZGRhZCwgaHR0cHM6Ly9naXRodWIuY29tL2xpZm9mCiAqICAgICAgICAgICAgICAgMjAxMyBMZWUgRHJpc2NvbGwsIGh0dHBzOi8vZ2l0aHViLmNvbS9sc2RyaXNjb2xsCiAqICAgICAgICAgICAgICAgMjAxMyBTdGVmYW4gU2xvbmV2c2tpeSwgaHR0cHM6Ly9naXRodWIuY29tL3N0ZWZzbG9uCiAqICAgICAgICAgICAgICAgMjAxMyBKZXJlbXkgTW9yZWwsIGh0dHBzOi8vZ2l0aHViLmNvbS9qbW9yZWwKICogICAgICAgICAgICAgICAyMDEzIENocmlzdG9waCBIYXJ0bWFubiwgaHR0cHM6Ly9naXRodWIuY29tL2NocmlzLXJvY2sKICogICAgICAgICAgICAgICAyMDE0IEp1YW4gUGFibG8gR2F2aXJpYSwgaHR0cHM6Ly9naXRodWIuY29tL2p1YW5wZ2F2aXJpYQogKiAgICAgICAgICAgICAgIDIwMTQgSmFtZXMgTWFrZXMsIGh0dHBzOi8vZ2l0aHViLmNvbS9kb2xsYXJ1dwogKiAgICAgICAgICAgICAgIDIwMTQgRGllZ28gQ2Fzb3JyYW4sIGh0dHBzOi8vZ2l0aHViLmNvbS9kaWVnb2NyCiAqICAgICAgICAgICAgICAgMjAxNCBTdGV2ZW4gU3B1bmdpbiwgaHR0cHM6Ly9naXRodWIuY29tL0ZsYW1lbmNvCiAqICAgICAgICAgICAgICAgMjAxNCBLZW5uZXRoIEdsYXNzZXksIGh0dHBzOi8vZ2l0aHViLmNvbS9HYXZ2ZXJzCiAqCiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwogKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwogKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCiAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwogKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogKgogKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQogKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KICoKICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCiAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgogKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAogKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFCiAqIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KICogT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCiAqIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgc2llZmtlbmosIGFod29sZiwgcmlja3lndSwgTWlkbml0aCwgc2FpbnRjbGFpciwgZWFwYXJhbmdvLAogKiAgICBraW0zZXIsIG1mbywgYWxub3J0aCwgRmxhbWVuY28KICovCgohZnVuY3Rpb24odCxlKXsib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHMmJiJ1bmRlZmluZWQiIT10eXBlb2YgbW9kdWxlP2UoZXhwb3J0cyk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoWyJleHBvcnRzIl0sZSk6ZSgodD10fHxzZWxmKS5qc3BkZj17fSl9KHRoaXMsKGZ1bmN0aW9uKHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBlKHQpe3JldHVybihlPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24odCl7cmV0dXJuIHQmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiB0fSkodCl9dmFyIHI9ZnVuY3Rpb24oKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWw/Z2xvYmFsOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOnRoaXN9KCk7ZnVuY3Rpb24gbigpe3IuY29uc29sZSYmImZ1bmN0aW9uIj09dHlwZW9mIHIuY29uc29sZS5sb2cmJnIuY29uc29sZS5sb2cuYXBwbHkoci5jb25zb2xlLGFyZ3VtZW50cyl9dmFyIGk9e2xvZzpuLHdhcm46ZnVuY3Rpb24odCl7ci5jb25zb2xlJiYoImZ1bmN0aW9uIj09dHlwZW9mIHIuY29uc29sZS53YXJuP3IuY29uc29sZS53YXJuLmFwcGx5KHIuY29uc29sZSxhcmd1bWVudHMpOm4uY2FsbChudWxsLGFyZ3VtZW50cykpfSxlcnJvcjpmdW5jdGlvbih0KXtyLmNvbnNvbGUmJigiZnVuY3Rpb24iPT10eXBlb2Ygci5jb25zb2xlLmVycm9yP3IuY29uc29sZS5lcnJvci5hcHBseShyLmNvbnNvbGUsYXJndW1lbnRzKTpuKHQpKX19O2Z1bmN0aW9uIGEodCxlLHIpe3ZhciBuPW5ldyBYTUxIdHRwUmVxdWVzdDtuLm9wZW4oIkdFVCIsdCksbi5yZXNwb25zZVR5cGU9ImJsb2IiLG4ub25sb2FkPWZ1bmN0aW9uKCl7bChuLnJlc3BvbnNlLGUscil9LG4ub25lcnJvcj1mdW5jdGlvbigpe2kuZXJyb3IoImNvdWxkIG5vdCBkb3dubG9hZCBmaWxlIil9LG4uc2VuZCgpfWZ1bmN0aW9uIG8odCl7dmFyIGU9bmV3IFhNTEh0dHBSZXF1ZXN0O2Uub3BlbigiSEVBRCIsdCwhMSk7dHJ5e2Uuc2VuZCgpfWNhdGNoKHQpe31yZXR1cm4gZS5zdGF0dXM+PTIwMCYmZS5zdGF0dXM8PTI5OX1mdW5jdGlvbiBzKHQpe3RyeXt0LmRpc3BhdGNoRXZlbnQobmV3IE1vdXNlRXZlbnQoImNsaWNrIikpfWNhdGNoKHIpe3ZhciBlPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJNb3VzZUV2ZW50cyIpO2UuaW5pdE1vdXNlRXZlbnQoImNsaWNrIiwhMCwhMCx3aW5kb3csMCwwLDAsODAsMjAsITEsITEsITEsITEsMCxudWxsKSx0LmRpc3BhdGNoRXZlbnQoZSl9fXZhciBjLHUsbD1yLnNhdmVBc3x8KCJvYmplY3QiIT09KCJ1bmRlZmluZWQiPT10eXBlb2Ygd2luZG93PyJ1bmRlZmluZWQiOmUod2luZG93KSl8fHdpbmRvdyE9PXI/ZnVuY3Rpb24oKXt9OiJ1bmRlZmluZWQiIT10eXBlb2YgSFRNTEFuY2hvckVsZW1lbnQmJiJkb3dubG9hZCJpbiBIVE1MQW5jaG9yRWxlbWVudC5wcm90b3R5cGU/ZnVuY3Rpb24odCxlLG4pe3ZhciBpPXIuVVJMfHxyLndlYmtpdFVSTCxjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTtlPWV8fHQubmFtZXx8ImRvd25sb2FkIixjLmRvd25sb2FkPWUsYy5yZWw9Im5vb3BlbmVyIiwic3RyaW5nIj09dHlwZW9mIHQ/KGMuaHJlZj10LGMub3JpZ2luIT09bG9jYXRpb24ub3JpZ2luP28oYy5ocmVmKT9hKHQsZSxuKTpzKGMsYy50YXJnZXQ9Il9ibGFuayIpOnMoYykpOihjLmhyZWY9aS5jcmVhdGVPYmplY3RVUkwodCksc2V0VGltZW91dCgoZnVuY3Rpb24oKXtpLnJldm9rZU9iamVjdFVSTChjLmhyZWYpfSksNGU0KSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe3MoYyl9KSwwKSl9OiJtc1NhdmVPck9wZW5CbG9iImluIG5hdmlnYXRvcj9mdW5jdGlvbih0LHIsbil7aWYocj1yfHx0Lm5hbWV8fCJkb3dubG9hZCIsInN0cmluZyI9PXR5cGVvZiB0KWlmKG8odCkpYSh0LHIsbik7ZWxzZXt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7Yy5ocmVmPXQsYy50YXJnZXQ9Il9ibGFuayIsc2V0VGltZW91dCgoZnVuY3Rpb24oKXtzKGMpfSkpfWVsc2UgbmF2aWdhdG9yLm1zU2F2ZU9yT3BlbkJsb2IoZnVuY3Rpb24odCxyKXtyZXR1cm4gdm9pZCAwPT09cj9yPXthdXRvQm9tOiExfToib2JqZWN0IiE9PWUocikmJihpLndhcm4oIkRlcHJlY2F0ZWQ6IEV4cGVjdGVkIHRoaXJkIGFyZ3VtZW50IHRvIGJlIGEgb2JqZWN0Iikscj17YXV0b0JvbTohcn0pLHIuYXV0b0JvbSYmL15ccyooPzp0ZXh0XC9cUyp8YXBwbGljYXRpb25cL3htbHxcUypcL1xTKlwreG1sKVxzKjsuKmNoYXJzZXRccyo9XHMqdXRmLTgvaS50ZXN0KHQudHlwZSk/bmV3IEJsb2IoW1N0cmluZy5mcm9tQ2hhckNvZGUoNjUyNzkpLHRdLHt0eXBlOnQudHlwZX0pOnR9KHQsbikscil9OmZ1bmN0aW9uKHQsbixpLG8pe2lmKChvPW98fG9wZW4oIiIsIl9ibGFuayIpKSYmKG8uZG9jdW1lbnQudGl0bGU9by5kb2N1bWVudC5ib2R5LmlubmVyVGV4dD0iZG93bmxvYWRpbmcuLi4iKSwic3RyaW5nIj09dHlwZW9mIHQpcmV0dXJuIGEodCxuLGkpO3ZhciBzPSJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iPT09dC50eXBlLGM9L2NvbnN0cnVjdG9yL2kudGVzdChyLkhUTUxFbGVtZW50KXx8ci5zYWZhcmksdT0vQ3JpT1NcL1tcZF0rLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO2lmKCh1fHxzJiZjKSYmIm9iamVjdCI9PT0oInVuZGVmaW5lZCI9PXR5cGVvZiBGaWxlUmVhZGVyPyJ1bmRlZmluZWQiOmUoRmlsZVJlYWRlcikpKXt2YXIgbD1uZXcgRmlsZVJlYWRlcjtsLm9ubG9hZGVuZD1mdW5jdGlvbigpe3ZhciB0PWwucmVzdWx0O3Q9dT90OnQucmVwbGFjZSgvXmRhdGE6W147XSo7LywiZGF0YTphdHRhY2htZW50L2ZpbGU7Iiksbz9vLmxvY2F0aW9uLmhyZWY9dDpsb2NhdGlvbj10LG89bnVsbH0sbC5yZWFkQXNEYXRhVVJMKHQpfWVsc2V7dmFyIGg9ci5VUkx8fHIud2Via2l0VVJMLGY9aC5jcmVhdGVPYmplY3RVUkwodCk7bz9vLmxvY2F0aW9uPWY6bG9jYXRpb24uaHJlZj1mLG89bnVsbCxzZXRUaW1lb3V0KChmdW5jdGlvbigpe2gucmV2b2tlT2JqZWN0VVJMKGYpfSksNGU0KX19KTsKLyoqCiAgICogQSBjbGFzcyB0byBwYXJzZSBjb2xvciB2YWx1ZXMKICAgKiBAYXV0aG9yIFN0b3lhbiBTdGVmYW5vdiA8c3N0b29AZ21haWwuY29tPgogICAqIHtAbGluayAgIGh0dHA6Ly93d3cucGhwaWVkLmNvbS9yZ2ItY29sb3ItcGFyc2VyLWluLWphdmFzY3JpcHQvfQogICAqIEBsaWNlbnNlIFVzZSBpdCBpZiB5b3UgbGlrZSBpdAogICAqL2Z1bmN0aW9uIGgodCl7dmFyIGU7dD10fHwiIix0aGlzLm9rPSExLCIjIj09dC5jaGFyQXQoMCkmJih0PXQuc3Vic3RyKDEsNikpO3Q9e2FsaWNlYmx1ZToiZjBmOGZmIixhbnRpcXVld2hpdGU6ImZhZWJkNyIsYXF1YToiMDBmZmZmIixhcXVhbWFyaW5lOiI3ZmZmZDQiLGF6dXJlOiJmMGZmZmYiLGJlaWdlOiJmNWY1ZGMiLGJpc3F1ZToiZmZlNGM0IixibGFjazoiMDAwMDAwIixibGFuY2hlZGFsbW9uZDoiZmZlYmNkIixibHVlOiIwMDAwZmYiLGJsdWV2aW9sZXQ6IjhhMmJlMiIsYnJvd246ImE1MmEyYSIsYnVybHl3b29kOiJkZWI4ODciLGNhZGV0Ymx1ZToiNWY5ZWEwIixjaGFydHJldXNlOiI3ZmZmMDAiLGNob2NvbGF0ZToiZDI2OTFlIixjb3JhbDoiZmY3ZjUwIixjb3JuZmxvd2VyYmx1ZToiNjQ5NWVkIixjb3Juc2lsazoiZmZmOGRjIixjcmltc29uOiJkYzE0M2MiLGN5YW46IjAwZmZmZiIsZGFya2JsdWU6IjAwMDA4YiIsZGFya2N5YW46IjAwOGI4YiIsZGFya2dvbGRlbnJvZDoiYjg4NjBiIixkYXJrZ3JheToiYTlhOWE5IixkYXJrZ3JlZW46IjAwNjQwMCIsZGFya2toYWtpOiJiZGI3NmIiLGRhcmttYWdlbnRhOiI4YjAwOGIiLGRhcmtvbGl2ZWdyZWVuOiI1NTZiMmYiLGRhcmtvcmFuZ2U6ImZmOGMwMCIsZGFya29yY2hpZDoiOTkzMmNjIixkYXJrcmVkOiI4YjAwMDAiLGRhcmtzYWxtb246ImU5OTY3YSIsZGFya3NlYWdyZWVuOiI4ZmJjOGYiLGRhcmtzbGF0ZWJsdWU6IjQ4M2Q4YiIsZGFya3NsYXRlZ3JheToiMmY0ZjRmIixkYXJrdHVycXVvaXNlOiIwMGNlZDEiLGRhcmt2aW9sZXQ6Ijk0MDBkMyIsZGVlcHBpbms6ImZmMTQ5MyIsZGVlcHNreWJsdWU6IjAwYmZmZiIsZGltZ3JheToiNjk2OTY5Iixkb2RnZXJibHVlOiIxZTkwZmYiLGZlbGRzcGFyOiJkMTkyNzUiLGZpcmVicmljazoiYjIyMjIyIixmbG9yYWx3aGl0ZToiZmZmYWYwIixmb3Jlc3RncmVlbjoiMjI4YjIyIixmdWNoc2lhOiJmZjAwZmYiLGdhaW5zYm9ybzoiZGNkY2RjIixnaG9zdHdoaXRlOiJmOGY4ZmYiLGdvbGQ6ImZmZDcwMCIsZ29sZGVucm9kOiJkYWE1MjAiLGdyYXk6IjgwODA4MCIsZ3JlZW46IjAwODAwMCIsZ3JlZW55ZWxsb3c6ImFkZmYyZiIsaG9uZXlkZXc6ImYwZmZmMCIsaG90cGluazoiZmY2OWI0IixpbmRpYW5yZWQ6ImNkNWM1YyIsaW5kaWdvOiI0YjAwODIiLGl2b3J5OiJmZmZmZjAiLGtoYWtpOiJmMGU2OGMiLGxhdmVuZGVyOiJlNmU2ZmEiLGxhdmVuZGVyYmx1c2g6ImZmZjBmNSIsbGF3bmdyZWVuOiI3Y2ZjMDAiLGxlbW9uY2hpZmZvbjoiZmZmYWNkIixsaWdodGJsdWU6ImFkZDhlNiIsbGlnaHRjb3JhbDoiZjA4MDgwIixsaWdodGN5YW46ImUwZmZmZiIsbGlnaHRnb2xkZW5yb2R5ZWxsb3c6ImZhZmFkMiIsbGlnaHRncmV5OiJkM2QzZDMiLGxpZ2h0Z3JlZW46IjkwZWU5MCIsbGlnaHRwaW5rOiJmZmI2YzEiLGxpZ2h0c2FsbW9uOiJmZmEwN2EiLGxpZ2h0c2VhZ3JlZW46IjIwYjJhYSIsbGlnaHRza3libHVlOiI4N2NlZmEiLGxpZ2h0c2xhdGVibHVlOiI4NDcwZmYiLGxpZ2h0c2xhdGVncmF5OiI3Nzg4OTkiLGxpZ2h0c3RlZWxibHVlOiJiMGM0ZGUiLGxpZ2h0eWVsbG93OiJmZmZmZTAiLGxpbWU6IjAwZmYwMCIsbGltZWdyZWVuOiIzMmNkMzIiLGxpbmVuOiJmYWYwZTYiLG1hZ2VudGE6ImZmMDBmZiIsbWFyb29uOiI4MDAwMDAiLG1lZGl1bWFxdWFtYXJpbmU6IjY2Y2RhYSIsbWVkaXVtYmx1ZToiMDAwMGNkIixtZWRpdW1vcmNoaWQ6ImJhNTVkMyIsbWVkaXVtcHVycGxlOiI5MzcwZDgiLG1lZGl1bXNlYWdyZWVuOiIzY2IzNzEiLG1lZGl1bXNsYXRlYmx1ZToiN2I2OGVlIixtZWRpdW1zcHJpbmdncmVlbjoiMDBmYTlhIixtZWRpdW10dXJxdW9pc2U6IjQ4ZDFjYyIsbWVkaXVtdmlvbGV0cmVkOiJjNzE1ODUiLG1pZG5pZ2h0Ymx1ZToiMTkxOTcwIixtaW50Y3JlYW06ImY1ZmZmYSIsbWlzdHlyb3NlOiJmZmU0ZTEiLG1vY2Nhc2luOiJmZmU0YjUiLG5hdmFqb3doaXRlOiJmZmRlYWQiLG5hdnk6IjAwMDA4MCIsb2xkbGFjZToiZmRmNWU2IixvbGl2ZToiODA4MDAwIixvbGl2ZWRyYWI6IjZiOGUyMyIsb3JhbmdlOiJmZmE1MDAiLG9yYW5nZXJlZDoiZmY0NTAwIixvcmNoaWQ6ImRhNzBkNiIscGFsZWdvbGRlbnJvZDoiZWVlOGFhIixwYWxlZ3JlZW46Ijk4ZmI5OCIscGFsZXR1cnF1b2lzZToiYWZlZWVlIixwYWxldmlvbGV0cmVkOiJkODcwOTMiLHBhcGF5YXdoaXA6ImZmZWZkNSIscGVhY2hwdWZmOiJmZmRhYjkiLHBlcnU6ImNkODUzZiIscGluazoiZmZjMGNiIixwbHVtOiJkZGEwZGQiLHBvd2RlcmJsdWU6ImIwZTBlNiIscHVycGxlOiI4MDAwODAiLHJlZDoiZmYwMDAwIixyb3N5YnJvd246ImJjOGY4ZiIscm95YWxibHVlOiI0MTY5ZTEiLHNhZGRsZWJyb3duOiI4YjQ1MTMiLHNhbG1vbjoiZmE4MDcyIixzYW5keWJyb3duOiJmNGE0NjAiLHNlYWdyZWVuOiIyZThiNTciLHNlYXNoZWxsOiJmZmY1ZWUiLHNpZW5uYToiYTA1MjJkIixzaWx2ZXI6ImMwYzBjMCIsc2t5Ymx1ZToiODdjZWViIixzbGF0ZWJsdWU6IjZhNWFjZCIsc2xhdGVncmF5OiI3MDgwOTAiLHNub3c6ImZmZmFmYSIsc3ByaW5nZ3JlZW46IjAwZmY3ZiIsc3RlZWxibHVlOiI0NjgyYjQiLHRhbjoiZDJiNDhjIix0ZWFsOiIwMDgwODAiLHRoaXN0bGU6ImQ4YmZkOCIsdG9tYXRvOiJmZjYzNDciLHR1cnF1b2lzZToiNDBlMGQwIix2aW9sZXQ6ImVlODJlZSIsdmlvbGV0cmVkOiJkMDIwOTAiLHdoZWF0OiJmNWRlYjMiLHdoaXRlOiJmZmZmZmYiLHdoaXRlc21va2U6ImY1ZjVmNSIseWVsbG93OiJmZmZmMDAiLHllbGxvd2dyZWVuOiI5YWNkMzIifVt0PSh0PXQucmVwbGFjZSgvIC9nLCIiKSkudG9Mb3dlckNhc2UoKV18fHQ7Zm9yKHZhciByPVt7cmU6L15yZ2JcKChcZHsxLDN9KSxccyooXGR7MSwzfSksXHMqKFxkezEsM30pXCkkLyxleGFtcGxlOlsicmdiKDEyMywgMjM0LCA0NSkiLCJyZ2IoMjU1LDIzNCwyNDUpIl0scHJvY2VzczpmdW5jdGlvbih0KXtyZXR1cm5bcGFyc2VJbnQodFsxXSkscGFyc2VJbnQodFsyXSkscGFyc2VJbnQodFszXSldfX0se3JlOi9eKFx3ezJ9KShcd3syfSkoXHd7Mn0pJC8sZXhhbXBsZTpbIiMwMGZmMDAiLCIzMzY2OTkiXSxwcm9jZXNzOmZ1bmN0aW9uKHQpe3JldHVybltwYXJzZUludCh0WzFdLDE2KSxwYXJzZUludCh0WzJdLDE2KSxwYXJzZUludCh0WzNdLDE2KV19fSx7cmU6L14oXHd7MX0pKFx3ezF9KShcd3sxfSkkLyxleGFtcGxlOlsiI2ZiMCIsImYwZiJdLHByb2Nlc3M6ZnVuY3Rpb24odCl7cmV0dXJuW3BhcnNlSW50KHRbMV0rdFsxXSwxNikscGFyc2VJbnQodFsyXSt0WzJdLDE2KSxwYXJzZUludCh0WzNdK3RbM10sMTYpXX19XSxuPTA7bjxyLmxlbmd0aDtuKyspe3ZhciBpPXJbbl0ucmUsYT1yW25dLnByb2Nlc3Msbz1pLmV4ZWModCk7byYmKGU9YShvKSx0aGlzLnI9ZVswXSx0aGlzLmc9ZVsxXSx0aGlzLmI9ZVsyXSx0aGlzLm9rPSEwKX10aGlzLnI9dGhpcy5yPDB8fGlzTmFOKHRoaXMucik/MDp0aGlzLnI+MjU1PzI1NTp0aGlzLnIsdGhpcy5nPXRoaXMuZzwwfHxpc05hTih0aGlzLmcpPzA6dGhpcy5nPjI1NT8yNTU6dGhpcy5nLHRoaXMuYj10aGlzLmI8MHx8aXNOYU4odGhpcy5iKT8wOnRoaXMuYj4yNTU/MjU1OnRoaXMuYix0aGlzLnRvUkdCPWZ1bmN0aW9uKCl7cmV0dXJuInJnYigiK3RoaXMucisiLCAiK3RoaXMuZysiLCAiK3RoaXMuYisiKSJ9LHRoaXMudG9IZXg9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnIudG9TdHJpbmcoMTYpLGU9dGhpcy5nLnRvU3RyaW5nKDE2KSxyPXRoaXMuYi50b1N0cmluZygxNik7cmV0dXJuIDE9PXQubGVuZ3RoJiYodD0iMCIrdCksMT09ZS5sZW5ndGgmJihlPSIwIitlKSwxPT1yLmxlbmd0aCYmKHI9IjAiK3IpLCIjIit0K2Urcn19Ci8qKgogICAqIEBsaWNlbnNlCiAgICogSm9zZXBoIE15ZXJzIGRvZXMgbm90IHNwZWNpZnkgYSBwYXJ0aWN1bGFyIGxpY2Vuc2UgZm9yIGhpcyB3b3JrLgogICAqCiAgICogQXV0aG9yOiBKb3NlcGggTXllcnMKICAgKiBBY2Nlc3NlZCBmcm9tOiBodHRwOi8vd3d3Lm15ZXJzZGFpbHkub3JnL2pvc2VwaC9qYXZhc2NyaXB0L21kNS5qcwogICAqCiAgICogTW9kaWZpZWQgYnk6IE93ZW4gTGVvbmcKICAgKi8KZnVuY3Rpb24gZih0LGUpe3ZhciByPXRbMF0sbj10WzFdLGk9dFsyXSxhPXRbM107cj1wKHIsbixpLGEsZVswXSw3LC02ODA4NzY5MzYpLGE9cChhLHIsbixpLGVbMV0sMTIsLTM4OTU2NDU4NiksaT1wKGksYSxyLG4sZVsyXSwxNyw2MDYxMDU4MTkpLG49cChuLGksYSxyLGVbM10sMjIsLTEwNDQ1MjUzMzApLHI9cChyLG4saSxhLGVbNF0sNywtMTc2NDE4ODk3KSxhPXAoYSxyLG4saSxlWzVdLDEyLDEyMDAwODA0MjYpLGk9cChpLGEscixuLGVbNl0sMTcsLTE0NzMyMzEzNDEpLG49cChuLGksYSxyLGVbN10sMjIsLTQ1NzA1OTgzKSxyPXAocixuLGksYSxlWzhdLDcsMTc3MDAzNTQxNiksYT1wKGEscixuLGksZVs5XSwxMiwtMTk1ODQxNDQxNyksaT1wKGksYSxyLG4sZVsxMF0sMTcsLTQyMDYzKSxuPXAobixpLGEscixlWzExXSwyMiwtMTk5MDQwNDE2Mikscj1wKHIsbixpLGEsZVsxMl0sNywxODA0NjAzNjgyKSxhPXAoYSxyLG4saSxlWzEzXSwxMiwtNDAzNDExMDEpLGk9cChpLGEscixuLGVbMTRdLDE3LC0xNTAyMDAyMjkwKSxyPWcocixuPXAobixpLGEscixlWzE1XSwyMiwxMjM2NTM1MzI5KSxpLGEsZVsxXSw1LC0xNjU3OTY1MTApLGE9ZyhhLHIsbixpLGVbNl0sOSwtMTA2OTUwMTYzMiksaT1nKGksYSxyLG4sZVsxMV0sMTQsNjQzNzE3NzEzKSxuPWcobixpLGEscixlWzBdLDIwLC0zNzM4OTczMDIpLHI9ZyhyLG4saSxhLGVbNV0sNSwtNzAxNTU4NjkxKSxhPWcoYSxyLG4saSxlWzEwXSw5LDM4MDE2MDgzKSxpPWcoaSxhLHIsbixlWzE1XSwxNCwtNjYwNDc4MzM1KSxuPWcobixpLGEscixlWzRdLDIwLC00MDU1Mzc4NDgpLHI9ZyhyLG4saSxhLGVbOV0sNSw1Njg0NDY0MzgpLGE9ZyhhLHIsbixpLGVbMTRdLDksLTEwMTk4MDM2OTApLGk9ZyhpLGEscixuLGVbM10sMTQsLTE4NzM2Mzk2MSksbj1nKG4saSxhLHIsZVs4XSwyMCwxMTYzNTMxNTAxKSxyPWcocixuLGksYSxlWzEzXSw1LC0xNDQ0NjgxNDY3KSxhPWcoYSxyLG4saSxlWzJdLDksLTUxNDAzNzg0KSxpPWcoaSxhLHIsbixlWzddLDE0LDE3MzUzMjg0NzMpLHI9bShyLG49ZyhuLGksYSxyLGVbMTJdLDIwLC0xOTI2NjA3NzM0KSxpLGEsZVs1XSw0LC0zNzg1NTgpLGE9bShhLHIsbixpLGVbOF0sMTEsLTIwMjI1NzQ0NjMpLGk9bShpLGEscixuLGVbMTFdLDE2LDE4MzkwMzA1NjIpLG49bShuLGksYSxyLGVbMTRdLDIzLC0zNTMwOTU1Nikscj1tKHIsbixpLGEsZVsxXSw0LC0xNTMwOTkyMDYwKSxhPW0oYSxyLG4saSxlWzRdLDExLDEyNzI4OTMzNTMpLGk9bShpLGEscixuLGVbN10sMTYsLTE1NTQ5NzYzMiksbj1tKG4saSxhLHIsZVsxMF0sMjMsLTEwOTQ3MzA2NDApLHI9bShyLG4saSxhLGVbMTNdLDQsNjgxMjc5MTc0KSxhPW0oYSxyLG4saSxlWzBdLDExLC0zNTg1MzcyMjIpLGk9bShpLGEscixuLGVbM10sMTYsLTcyMjUyMTk3OSksbj1tKG4saSxhLHIsZVs2XSwyMyw3NjAyOTE4OSkscj1tKHIsbixpLGEsZVs5XSw0LC02NDAzNjQ0ODcpLGE9bShhLHIsbixpLGVbMTJdLDExLC00MjE4MTU4MzUpLGk9bShpLGEscixuLGVbMTVdLDE2LDUzMDc0MjUyMCkscj12KHIsbj1tKG4saSxhLHIsZVsyXSwyMywtOTk1MzM4NjUxKSxpLGEsZVswXSw2LC0xOTg2MzA4NDQpLGE9dihhLHIsbixpLGVbN10sMTAsMTEyNjg5MTQxNSksaT12KGksYSxyLG4sZVsxNF0sMTUsLTE0MTYzNTQ5MDUpLG49dihuLGksYSxyLGVbNV0sMjEsLTU3NDM0MDU1KSxyPXYocixuLGksYSxlWzEyXSw2LDE3MDA0ODU1NzEpLGE9dihhLHIsbixpLGVbM10sMTAsLTE4OTQ5ODY2MDYpLGk9dihpLGEscixuLGVbMTBdLDE1LC0xMDUxNTIzKSxuPXYobixpLGEscixlWzFdLDIxLC0yMDU0OTIyNzk5KSxyPXYocixuLGksYSxlWzhdLDYsMTg3MzMxMzM1OSksYT12KGEscixuLGksZVsxNV0sMTAsLTMwNjExNzQ0KSxpPXYoaSxhLHIsbixlWzZdLDE1LC0xNTYwMTk4MzgwKSxuPXYobixpLGEscixlWzEzXSwyMSwxMzA5MTUxNjQ5KSxyPXYocixuLGksYSxlWzRdLDYsLTE0NTUyMzA3MCksYT12KGEscixuLGksZVsxMV0sMTAsLTExMjAyMTAzNzkpLGk9dihpLGEscixuLGVbMl0sMTUsNzE4Nzg3MjU5KSxuPXYobixpLGEscixlWzldLDIxLC0zNDM0ODU1NTEpLHRbMF09UyhyLHRbMF0pLHRbMV09UyhuLHRbMV0pLHRbMl09UyhpLHRbMl0pLHRbM109UyhhLHRbM10pfWZ1bmN0aW9uIGQodCxlLHIsbixpLGEpe3JldHVybiBlPVMoUyhlLHQpLFMobixhKSksUyhlPDxpfGU+Pj4zMi1pLHIpfWZ1bmN0aW9uIHAodCxlLHIsbixpLGEsbyl7cmV0dXJuIGQoZSZyfH5lJm4sdCxlLGksYSxvKX1mdW5jdGlvbiBnKHQsZSxyLG4saSxhLG8pe3JldHVybiBkKGUmbnxyJn5uLHQsZSxpLGEsbyl9ZnVuY3Rpb24gbSh0LGUscixuLGksYSxvKXtyZXR1cm4gZChlXnJebix0LGUsaSxhLG8pfWZ1bmN0aW9uIHYodCxlLHIsbixpLGEsbyl7cmV0dXJuIGQocl4oZXx+biksdCxlLGksYSxvKX1mdW5jdGlvbiBiKHQpe3ZhciBlLHI9dC5sZW5ndGgsbj1bMTczMjU4NDE5MywtMjcxNzMzODc5LC0xNzMyNTg0MTk0LDI3MTczMzg3OF07Zm9yKGU9NjQ7ZTw9dC5sZW5ndGg7ZSs9NjQpZihuLHkodC5zdWJzdHJpbmcoZS02NCxlKSkpO3Q9dC5zdWJzdHJpbmcoZS02NCk7dmFyIGk9WzAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDBdO2ZvcihlPTA7ZTx0Lmxlbmd0aDtlKyspaVtlPj4yXXw9dC5jaGFyQ29kZUF0KGUpPDwoZSU0PDwzKTtpZihpW2U+PjJdfD0xMjg8PChlJTQ8PDMpLGU+NTUpZm9yKGYobixpKSxlPTA7ZTwxNjtlKyspaVtlXT0wO3JldHVybiBpWzE0XT04KnIsZihuLGkpLG59ZnVuY3Rpb24geSh0KXt2YXIgZSxyPVtdO2ZvcihlPTA7ZTw2NDtlKz00KXJbZT4+Ml09dC5jaGFyQ29kZUF0KGUpKyh0LmNoYXJDb2RlQXQoZSsxKTw8OCkrKHQuY2hhckNvZGVBdChlKzIpPDwxNikrKHQuY2hhckNvZGVBdChlKzMpPDwyNCk7cmV0dXJuIHJ9Yz1yLmF0b2IuYmluZChyKSx1PXIuYnRvYS5iaW5kKHIpO3ZhciB3PSIwMTIzNDU2Nzg5YWJjZGVmIi5zcGxpdCgiIik7ZnVuY3Rpb24gTih0KXtmb3IodmFyIGU9IiIscj0wO3I8NDtyKyspZSs9d1t0Pj44KnIrNCYxNV0rd1t0Pj44KnImMTVdO3JldHVybiBlfWZ1bmN0aW9uIEwodCl7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoKDI1NSZ0KT4+MCwoNjUyODAmdCk+PjgsKDE2NzExNjgwJnQpPj4xNiwoNDI3ODE5MDA4MCZ0KT4+MjQpfWZ1bmN0aW9uIEEodCl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiB0Lm1hcChMKS5qb2luKCIiKX0oYih0KSl9dmFyIHg9IjVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyIiE9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTx0Lmxlbmd0aDtlKyspdFtlXT1OKHRbZV0pO3JldHVybiB0LmpvaW4oIiIpfShiKCJoZWxsbyIpKTtmdW5jdGlvbiBTKHQsZSl7aWYoeCl7dmFyIHI9KDY1NTM1JnQpKyg2NTUzNSZlKTtyZXR1cm4odD4+MTYpKyhlPj4xNikrKHI+PjE2KTw8MTZ8NjU1MzUmcn1yZXR1cm4gdCtlJjQyOTQ5NjcyOTV9Ci8qKgogICAqIEBsaWNlbnNlCiAgICogRlBERiBpcyByZWxlYXNlZCB1bmRlciBhIHBlcm1pc3NpdmUgbGljZW5zZTogdGhlcmUgaXMgbm8gdXNhZ2UgcmVzdHJpY3Rpb24uCiAgICogWW91IG1heSBlbWJlZCBpdCBmcmVlbHkgaW4geW91ciBhcHBsaWNhdGlvbiAoY29tbWVyY2lhbCBvciBub3QpLCB3aXRoIG9yCiAgICogd2l0aG91dCBtb2RpZmljYXRpb25zLgogICAqCiAgICogUmVmZXJlbmNlOiBodHRwOi8vd3d3LmZwZGYub3JnL2VuL3NjcmlwdC9zY3JpcHQzNy5waHAKICAgKi9mdW5jdGlvbiBfKHQsZSl7dmFyIHIsbixpLGE7aWYodCE9PXIpe2Zvcih2YXIgbz0oaT10LGE9MSsoMjU2L3QubGVuZ3RoPj4wKSxuZXcgQXJyYXkoYSsxKS5qb2luKGkpKSxzPVtdLGM9MDtjPDI1NjtjKyspc1tjXT1jO3ZhciB1PTA7Zm9yKGM9MDtjPDI1NjtjKyspe3ZhciBsPXNbY107dT0odStsK28uY2hhckNvZGVBdChjKSklMjU2LHNbY109c1t1XSxzW3VdPWx9cj10LG49c31lbHNlIHM9bjt2YXIgaD1lLmxlbmd0aCxmPTAsZD0wLHA9IiI7Zm9yKGM9MDtjPGg7YysrKWQ9KGQrKGw9c1tmPShmKzEpJTI1Nl0pKSUyNTYsc1tmXT1zW2RdLHNbZF09bCxvPXNbKHNbZl0rc1tkXSklMjU2XSxwKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGUuY2hhckNvZGVBdChjKV5vKTtyZXR1cm4gcH0KLyoqCiAgICogQGxpY2Vuc2UKICAgKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuCiAgICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlCiAgICogQXV0aG9yOiBPd2VuIExlb25nIChAb3dlbmwxMzEpCiAgICogRGF0ZTogMTUgT2N0IDIwMjAKICAgKiBSZWZlcmVuY2VzOgogICAqIGh0dHBzOi8vd3d3LmNzLmNtdS5lZHUvfmRzdC9BZG9iZS9HYWxsZXJ5L2Fub24yMWp1bDAxLXBkZi1lbmNyeXB0aW9uLnR4dAogICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9mb2xpb2pzL3BkZmtpdC9ibG9iL21hc3Rlci9saWIvc2VjdXJpdHkuanMKICAgKiBodHRwOi8vd3d3LmZwZGYub3JnL2VuL3NjcmlwdC9zY3JpcHQzNy5waHAKICAgKi92YXIgUD17cHJpbnQ6NCxtb2RpZnk6OCxjb3B5OjE2LCJhbm5vdC1mb3JtcyI6MzJ9O2Z1bmN0aW9uIGsodCxlLHIsbil7dGhpcy52PTEsdGhpcy5yPTI7dmFyIGk9MTkyO3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7aWYodm9pZCAwIT09UC5wZXJtKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBwZXJtaXNzaW9uOiAiK3QpO2krPVBbdF19KSksdGhpcy5wYWRkaW5nPSIowr9OXk51wopBZFwwTlbDv8O6AVxiLi5cMMK2w5BoPsKAL1xmwqnDvmRTaXoiO3ZhciBhPShlK3RoaXMucGFkZGluZykuc3Vic3RyKDAsMzIpLG89KHIrdGhpcy5wYWRkaW5nKS5zdWJzdHIoMCwzMik7dGhpcy5PPXRoaXMucHJvY2Vzc093bmVyUGFzc3dvcmQoYSxvKSx0aGlzLlA9LSgxKygyNTVeaSkpLHRoaXMuZW5jcnlwdGlvbktleT1BKGErdGhpcy5PK3RoaXMubHNiRmlyc3RXb3JkKHRoaXMuUCkrdGhpcy5oZXhUb0J5dGVzKG4pKS5zdWJzdHIoMCw1KSx0aGlzLlU9Xyh0aGlzLmVuY3J5cHRpb25LZXksdGhpcy5wYWRkaW5nKX1mdW5jdGlvbiBGKHQpe2lmKC9bXlx1MDAwMC1cdTAwZmZdLy50ZXN0KHQpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBQREYgTmFtZSBPYmplY3Q6ICIrdCsiLCBPbmx5IGFjY2VwdCBBU0NJSSBjaGFyYWN0ZXJzLiIpO2Zvcih2YXIgZT0iIixyPXQubGVuZ3RoLG49MDtuPHI7bisrKXt2YXIgaT10LmNoYXJDb2RlQXQobik7aWYoaTwzM3x8MzU9PT1pfHwzNz09PWl8fDQwPT09aXx8NDE9PT1pfHw0Nz09PWl8fDYwPT09aXx8NjI9PT1pfHw5MT09PWl8fDkzPT09aXx8MTIzPT09aXx8MTI1PT09aXx8aT4xMjYpZSs9IiMiKygiMCIraS50b1N0cmluZygxNikpLnNsaWNlKC0yKTtlbHNlIGUrPXRbbl19cmV0dXJuIGV9ZnVuY3Rpb24gSSh0KXtpZigib2JqZWN0IiE9PWUodCkpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIENvbnRleHQgcGFzc2VkIHRvIGluaXRpYWxpemUgUHViU3ViIChqc1BERi1tb2R1bGUpIik7dmFyIG49e307dGhpcy5zdWJzY3JpYmU9ZnVuY3Rpb24odCxlLHIpe2lmKHI9cnx8ITEsInN0cmluZyIhPXR5cGVvZiB0fHwiZnVuY3Rpb24iIT10eXBlb2YgZXx8ImJvb2xlYW4iIT10eXBlb2Ygcil0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgYXJndW1lbnRzIHBhc3NlZCB0byBQdWJTdWIuc3Vic2NyaWJlIChqc1BERi1tb2R1bGUpIik7bi5oYXNPd25Qcm9wZXJ0eSh0KXx8KG5bdF09e30pO3ZhciBpPU1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzUpO3JldHVybiBuW3RdW2ldPVtlLCEhcl0saX0sdGhpcy51bnN1YnNjcmliZT1mdW5jdGlvbih0KXtmb3IodmFyIGUgaW4gbilpZihuW2VdW3RdKXJldHVybiBkZWxldGUgbltlXVt0XSwwPT09T2JqZWN0LmtleXMobltlXSkubGVuZ3RoJiZkZWxldGUgbltlXSwhMDtyZXR1cm4hMX0sdGhpcy5wdWJsaXNoPWZ1bmN0aW9uKGUpe2lmKG4uaGFzT3duUHJvcGVydHkoZSkpe3ZhciBhPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSxvPVtdO2Zvcih2YXIgcyBpbiBuW2VdKXt2YXIgYz1uW2VdW3NdO3RyeXtjWzBdLmFwcGx5KHQsYSl9Y2F0Y2godCl7ci5jb25zb2xlJiZpLmVycm9yKCJqc1BERiBQdWJTdWIgRXJyb3IiLHQubWVzc2FnZSx0KX1jWzFdJiZvLnB1c2gocyl9by5sZW5ndGgmJm8uZm9yRWFjaCh0aGlzLnVuc3Vic2NyaWJlKX19LHRoaXMuZ2V0VG9waWNzPWZ1bmN0aW9uKCl7cmV0dXJuIG59fWZ1bmN0aW9uIEModCl7aWYoISh0aGlzIGluc3RhbmNlb2YgQykpcmV0dXJuIG5ldyBDKHQpO3ZhciBlPSJvcGFjaXR5LHN0cm9rZS1vcGFjaXR5Ii5zcGxpdCgiLCIpO2Zvcih2YXIgciBpbiB0KXQuaGFzT3duUHJvcGVydHkocikmJmUuaW5kZXhPZihyKT49MCYmKHRoaXNbcl09dFtyXSk7dGhpcy5pZD0iIix0aGlzLm9iamVjdE51bWJlcj0tMX1mdW5jdGlvbiBqKHQsZSl7dGhpcy5nU3RhdGU9dCx0aGlzLm1hdHJpeD1lLHRoaXMuaWQ9IiIsdGhpcy5vYmplY3ROdW1iZXI9LTF9ZnVuY3Rpb24gTyh0LGUscixuLGkpe2lmKCEodGhpcyBpbnN0YW5jZW9mIE8pKXJldHVybiBuZXcgTyh0LGUscixuLGkpO3RoaXMudHlwZT0iYXhpYWwiPT09dD8yOjMsdGhpcy5jb29yZHM9ZSx0aGlzLmNvbG9ycz1yLGouY2FsbCh0aGlzLG4saSl9ZnVuY3Rpb24gQih0LGUscixuLGkpe2lmKCEodGhpcyBpbnN0YW5jZW9mIEIpKXJldHVybiBuZXcgQih0LGUscixuLGkpO3RoaXMuYm91bmRpbmdCb3g9dCx0aGlzLnhTdGVwPWUsdGhpcy55U3RlcD1yLHRoaXMuc3RyZWFtPSIiLHRoaXMuY2xvbmVJbmRleD0wLGouY2FsbCh0aGlzLG4saSl9ZnVuY3Rpb24gTSh0KXt2YXIgbixhPSJzdHJpbmciPT10eXBlb2YgYXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXToicCIsbz1hcmd1bWVudHNbMV0scz1hcmd1bWVudHNbMl0sYz1hcmd1bWVudHNbM10sZj1bXSxkPTEscD0xNixnPSJTIixtPW51bGw7Im9iamVjdCI9PT1lKHQ9dHx8e30pJiYoYT10Lm9yaWVudGF0aW9uLG89dC51bml0fHxvLHM9dC5mb3JtYXR8fHMsYz10LmNvbXByZXNzfHx0LmNvbXByZXNzUGRmfHxjLG51bGwhPT0obT10LmVuY3J5cHRpb258fG51bGwpJiYobS51c2VyUGFzc3dvcmQ9bS51c2VyUGFzc3dvcmR8fCIiLG0ub3duZXJQYXNzd29yZD1tLm93bmVyUGFzc3dvcmR8fCIiLG0udXNlclBlcm1pc3Npb25zPW0udXNlclBlcm1pc3Npb25zfHxbXSksZD0ibnVtYmVyIj09dHlwZW9mIHQudXNlclVuaXQ/TWF0aC5hYnModC51c2VyVW5pdCk6MSx2b2lkIDAhPT10LnByZWNpc2lvbiYmKG49dC5wcmVjaXNpb24pLHZvaWQgMCE9PXQuZmxvYXRQcmVjaXNpb24mJihwPXQuZmxvYXRQcmVjaXNpb24pLGc9dC5kZWZhdWx0UGF0aE9wZXJhdGlvbnx8IlMiKSxmPXQuZmlsdGVyc3x8KCEwPT09Yz9bIkZsYXRlRW5jb2RlIl06Ziksbz1vfHwibW0iLGE9KCIiKyhhfHwiUCIpKS50b0xvd2VyQ2FzZSgpO3ZhciB2PXQucHV0T25seVVzZWRGb250c3x8ITEsYj17fSx5PXtpbnRlcm5hbDp7fSxfX3ByaXZhdGVfXzp7fX07eS5fX3ByaXZhdGVfXy5QdWJTdWI9STt2YXIgdz0iMS4zIixOPXkuX19wcml2YXRlX18uZ2V0UGRmVmVyc2lvbj1mdW5jdGlvbigpe3JldHVybiB3fTt5Ll9fcHJpdmF0ZV9fLnNldFBkZlZlcnNpb249ZnVuY3Rpb24odCl7dz10fTt2YXIgTD17YTA6WzIzODMuOTQsMzM3MC4zOV0sYTE6WzE2ODMuNzgsMjM4My45NF0sYTI6WzExOTAuNTUsMTY4My43OF0sYTM6Wzg0MS44OSwxMTkwLjU1XSxhNDpbNTk1LjI4LDg0MS44OV0sYTU6WzQxOS41Myw1OTUuMjhdLGE2OlsyOTcuNjQsNDE5LjUzXSxhNzpbMjA5Ljc2LDI5Ny42NF0sYTg6WzE0Ny40LDIwOS43Nl0sYTk6WzEwNC44OCwxNDcuNF0sYTEwOls3My43LDEwNC44OF0sYjA6WzI4MzQuNjUsNDAwOC4xOV0sYjE6WzIwMDQuMDksMjgzNC42NV0sYjI6WzE0MTcuMzIsMjAwNC4wOV0sYjM6WzEwMDAuNjMsMTQxNy4zMl0sYjQ6WzcwOC42NiwxMDAwLjYzXSxiNTpbNDk4LjksNzA4LjY2XSxiNjpbMzU0LjMzLDQ5OC45XSxiNzpbMjQ5LjQ1LDM1NC4zM10sYjg6WzE3NS43NSwyNDkuNDVdLGI5OlsxMjQuNzIsMTc1Ljc1XSxiMTA6Wzg3Ljg3LDEyNC43Ml0sYzA6WzI1OTkuMzcsMzY3Ni41NF0sYzE6WzE4MzYuODUsMjU5OS4zN10sYzI6WzEyOTguMjcsMTgzNi44NV0sYzM6WzkxOC40MywxMjk4LjI3XSxjNDpbNjQ5LjEzLDkxOC40M10sYzU6WzQ1OS4yMSw2NDkuMTNdLGM2OlszMjMuMTUsNDU5LjIxXSxjNzpbMjI5LjYxLDMyMy4xNV0sYzg6WzE2MS41NywyMjkuNjFdLGM5OlsxMTMuMzksMTYxLjU3XSxjMTA6Wzc5LjM3LDExMy4zOV0sZGw6WzMxMS44MSw2MjMuNjJdLGxldHRlcjpbNjEyLDc5Ml0sImdvdmVybm1lbnQtbGV0dGVyIjpbNTc2LDc1Nl0sbGVnYWw6WzYxMiwxMDA4XSwianVuaW9yLWxlZ2FsIjpbNTc2LDM2MF0sbGVkZ2VyOlsxMjI0LDc5Ml0sdGFibG9pZDpbNzkyLDEyMjRdLCJjcmVkaXQtY2FyZCI6WzE1MywyNDNdfTt5Ll9fcHJpdmF0ZV9fLmdldFBhZ2VGb3JtYXRzPWZ1bmN0aW9uKCl7cmV0dXJuIEx9O3ZhciBBPXkuX19wcml2YXRlX18uZ2V0UGFnZUZvcm1hdD1mdW5jdGlvbih0KXtyZXR1cm4gTFt0XX07cz1zfHwiYTQiO3ZhciB4PXtDT01QQVQ6ImNvbXBhdCIsQURWQU5DRUQ6ImFkdmFuY2VkIn0sUz14LkNPTVBBVDtmdW5jdGlvbiBfKCl7dGhpcy5zYXZlR3JhcGhpY3NTdGF0ZSgpLGh0KG5ldyBWdChfdCwwLDAsLV90LDAsUnIoKSpfdCkudG9TdHJpbmcoKSsiIGNtIiksdGhpcy5zZXRGb250U2l6ZSh0aGlzLmdldEZvbnRTaXplKCkvX3QpLGc9Im4iLFM9eC5BRFZBTkNFRH1mdW5jdGlvbiBQKCl7dGhpcy5yZXN0b3JlR3JhcGhpY3NTdGF0ZSgpLGc9IlMiLFM9eC5DT01QQVR9dmFyIGo9eS5fX3ByaXZhdGVfXy5jb21iaW5lRm9udFN0eWxlQW5kRm9udFdlaWdodD1mdW5jdGlvbih0LGUpe2lmKCJib2xkIj09dCYmIm5vcm1hbCI9PWV8fCJib2xkIj09dCYmNDAwPT1lfHwibm9ybWFsIj09dCYmIml0YWxpYyI9PWV8fCJib2xkIj09dCYmIml0YWxpYyI9PWUpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIENvbWJpbmF0aW9uIG9mIGZvbnR3ZWlnaHQgYW5kIGZvbnRzdHlsZSIpO3JldHVybiBlJiYodD00MDA9PWV8fCJub3JtYWwiPT09ZT8iaXRhbGljIj09PXQ/Iml0YWxpYyI6Im5vcm1hbCI6NzAwIT1lJiYiYm9sZCIhPT1lfHwibm9ybWFsIiE9PXQ/KDcwMD09ZT8iYm9sZCI6ZSkrIiIrdDoiYm9sZCIpLHR9O3kuYWR2YW5jZWRBUEk9ZnVuY3Rpb24odCl7dmFyIGU9Uz09PXguQ09NUEFUO3JldHVybiBlJiZfLmNhbGwodGhpcyksImZ1bmN0aW9uIiE9dHlwZW9mIHR8fCh0KHRoaXMpLGUmJlAuY2FsbCh0aGlzKSksdGhpc30seS5jb21wYXRBUEk9ZnVuY3Rpb24odCl7dmFyIGU9Uz09PXguQURWQU5DRUQ7cmV0dXJuIGUmJlAuY2FsbCh0aGlzKSwiZnVuY3Rpb24iIT10eXBlb2YgdHx8KHQodGhpcyksZSYmXy5jYWxsKHRoaXMpKSx0aGlzfSx5LmlzQWR2YW5jZWRBUEk9ZnVuY3Rpb24oKXtyZXR1cm4gUz09PXguQURWQU5DRUR9O3ZhciBFLHE9ZnVuY3Rpb24odCl7aWYoUyE9PXguQURWQU5DRUQpdGhyb3cgbmV3IEVycm9yKHQrIiBpcyBvbmx5IGF2YWlsYWJsZSBpbiAnYWR2YW5jZWQnIEFQSSBtb2RlLiBZb3UgbmVlZCB0byBjYWxsIGFkdmFuY2VkQVBJKCkgZmlyc3QuIil9LEQ9eS5yb3VuZFRvUHJlY2lzaW9uPXkuX19wcml2YXRlX18ucm91bmRUb1ByZWNpc2lvbj1mdW5jdGlvbih0LGUpe3ZhciByPW58fGU7aWYoaXNOYU4odCl8fGlzTmFOKHIpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBhcmd1bWVudCBwYXNzZWQgdG8ganNQREYucm91bmRUb1ByZWNpc2lvbiIpO3JldHVybiB0LnRvRml4ZWQocikucmVwbGFjZSgvMCskLywiIil9O0U9eS5ocGY9eS5fX3ByaXZhdGVfXy5ocGY9Im51bWJlciI9PXR5cGVvZiBwP2Z1bmN0aW9uKHQpe2lmKGlzTmFOKHQpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBhcmd1bWVudCBwYXNzZWQgdG8ganNQREYuaHBmIik7cmV0dXJuIEQodCxwKX06InNtYXJ0Ij09PXA/ZnVuY3Rpb24odCl7aWYoaXNOYU4odCkpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGFyZ3VtZW50IHBhc3NlZCB0byBqc1BERi5ocGYiKTtyZXR1cm4gRCh0LHQ+LTEmJnQ8MT8xNjo1KX06ZnVuY3Rpb24odCl7aWYoaXNOYU4odCkpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGFyZ3VtZW50IHBhc3NlZCB0byBqc1BERi5ocGYiKTtyZXR1cm4gRCh0LDE2KX07dmFyIFI9eS5mMj15Ll9fcHJpdmF0ZV9fLmYyPWZ1bmN0aW9uKHQpe2lmKGlzTmFOKHQpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBhcmd1bWVudCBwYXNzZWQgdG8ganNQREYuZjIiKTtyZXR1cm4gRCh0LDIpfSxUPXkuX19wcml2YXRlX18uZjM9ZnVuY3Rpb24odCl7aWYoaXNOYU4odCkpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGFyZ3VtZW50IHBhc3NlZCB0byBqc1BERi5mMyIpO3JldHVybiBEKHQsMyl9LFU9eS5zY2FsZT15Ll9fcHJpdmF0ZV9fLnNjYWxlPWZ1bmN0aW9uKHQpe2lmKGlzTmFOKHQpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBhcmd1bWVudCBwYXNzZWQgdG8ganNQREYuc2NhbGUiKTtyZXR1cm4gUz09PXguQ09NUEFUP3QqX3Q6Uz09PXguQURWQU5DRUQ/dDp2b2lkIDB9LHo9ZnVuY3Rpb24odCl7cmV0dXJuIFM9PT14LkNPTVBBVD9ScigpLXQ6Uz09PXguQURWQU5DRUQ/dDp2b2lkIDB9LEg9ZnVuY3Rpb24odCl7cmV0dXJuIFUoeih0KSl9O3kuX19wcml2YXRlX18uc2V0UHJlY2lzaW9uPXkuc2V0UHJlY2lzaW9uPWZ1bmN0aW9uKHQpeyJudW1iZXIiPT10eXBlb2YgcGFyc2VJbnQodCwxMCkmJihuPXBhcnNlSW50KHQsMTApKX07dmFyIFcsVj0iMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLEc9eS5fX3ByaXZhdGVfXy5nZXRGaWxlSWQ9ZnVuY3Rpb24oKXtyZXR1cm4gVn0sWT15Ll9fcHJpdmF0ZV9fLnNldEZpbGVJZD1mdW5jdGlvbih0KXtyZXR1cm4gVj12b2lkIDAhPT10JiYvXlthLWZBLUYwLTldezMyfSQvLnRlc3QodCk/dC50b1VwcGVyQ2FzZSgpOlYuc3BsaXQoIiIpLm1hcCgoZnVuY3Rpb24oKXtyZXR1cm4iQUJDREVGMDEyMzQ1Njc4OSIuY2hhckF0KE1hdGguZmxvb3IoMTYqTWF0aC5yYW5kb20oKSkpfSkpLmpvaW4oIiIpLG51bGwhPT1tJiYoWWU9bmV3IGsobS51c2VyUGVybWlzc2lvbnMsbS51c2VyUGFzc3dvcmQsbS5vd25lclBhc3N3b3JkLFYpKSxWfTt5LnNldEZpbGVJZD1mdW5jdGlvbih0KXtyZXR1cm4gWSh0KSx0aGlzfSx5LmdldEZpbGVJZD1mdW5jdGlvbigpe3JldHVybiBHKCl9O3ZhciBKPXkuX19wcml2YXRlX18uY29udmVydERhdGVUb1BERkRhdGU9ZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRUaW1lem9uZU9mZnNldCgpLHI9ZTwwPyIrIjoiLSIsbj1NYXRoLmZsb29yKE1hdGguYWJzKGUvNjApKSxpPU1hdGguYWJzKGUlNjApLGE9W3IsUShuKSwiJyIsUShpKSwiJyJdLmpvaW4oIiIpO3JldHVyblsiRDoiLHQuZ2V0RnVsbFllYXIoKSxRKHQuZ2V0TW9udGgoKSsxKSxRKHQuZ2V0RGF0ZSgpKSxRKHQuZ2V0SG91cnMoKSksUSh0LmdldE1pbnV0ZXMoKSksUSh0LmdldFNlY29uZHMoKSksYV0uam9pbigiIil9LFg9eS5fX3ByaXZhdGVfXy5jb252ZXJ0UERGRGF0ZVRvRGF0ZT1mdW5jdGlvbih0KXt2YXIgZT1wYXJzZUludCh0LnN1YnN0cigyLDQpLDEwKSxyPXBhcnNlSW50KHQuc3Vic3RyKDYsMiksMTApLTEsbj1wYXJzZUludCh0LnN1YnN0cig4LDIpLDEwKSxpPXBhcnNlSW50KHQuc3Vic3RyKDEwLDIpLDEwKSxhPXBhcnNlSW50KHQuc3Vic3RyKDEyLDIpLDEwKSxvPXBhcnNlSW50KHQuc3Vic3RyKDE0LDIpLDEwKTtyZXR1cm4gbmV3IERhdGUoZSxyLG4saSxhLG8sMCl9LEs9eS5fX3ByaXZhdGVfXy5zZXRDcmVhdGlvbkRhdGU9ZnVuY3Rpb24odCl7dmFyIGU7aWYodm9pZCAwPT09dCYmKHQ9bmV3IERhdGUpLHQgaW5zdGFuY2VvZiBEYXRlKWU9Sih0KTtlbHNle2lmKCEvXkQ6KDIwWzAtMl1bMC05XXwyMDNbMC03XXwxOVs3LTldWzAtOV0pKDBbMC05XXwxWzAtMl0pKFswLTJdWzAtOV18M1swLTFdKSgwWzAtOV18MVswLTldfDJbMC0zXSkoMFswLTldfFsxLTVdWzAtOV0pKDBbMC05XXxbMS01XVswLTldKShcKzBbMC05XXxcKzFbMC00XXwtMFswLTldfC0xWzAtMV0pJygwWzAtOV18WzEtNV1bMC05XSknPyQvLnRlc3QodCkpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGFyZ3VtZW50IHBhc3NlZCB0byBqc1BERi5zZXRDcmVhdGlvbkRhdGUiKTtlPXR9cmV0dXJuIFc9ZX0sWj15Ll9fcHJpdmF0ZV9fLmdldENyZWF0aW9uRGF0ZT1mdW5jdGlvbih0KXt2YXIgZT1XO3JldHVybiJqc0RhdGUiPT09dCYmKGU9WChXKSksZX07eS5zZXRDcmVhdGlvbkRhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIEsodCksdGhpc30seS5nZXRDcmVhdGlvbkRhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIFoodCl9O3ZhciAkLFE9eS5fX3ByaXZhdGVfXy5wYWRkMj1mdW5jdGlvbih0KXtyZXR1cm4oIjAiK3BhcnNlSW50KHQpKS5zbGljZSgtMil9LHR0PXkuX19wcml2YXRlX18ucGFkZDJIZXg9ZnVuY3Rpb24odCl7cmV0dXJuKCIwMCIrKHQ9dC50b1N0cmluZygpKSkuc3Vic3RyKHQubGVuZ3RoKX0sZXQ9MCxydD1bXSxudD1bXSxpdD0wLGF0PVtdLG90PVtdLHN0PSExLGN0PW50LHV0PWZ1bmN0aW9uKCl7ZXQ9MCxpdD0wLG50PVtdLHJ0PVtdLGF0PVtdLFF0PUt0KCksdGU9S3QoKX07eS5fX3ByaXZhdGVfXy5zZXRDdXN0b21PdXRwdXREZXN0aW5hdGlvbj1mdW5jdGlvbih0KXtzdD0hMCxjdD10fTt2YXIgbHQ9ZnVuY3Rpb24odCl7c3R8fChjdD10KX07eS5fX3ByaXZhdGVfXy5yZXNldEN1c3RvbU91dHB1dERlc3RpbmF0aW9uPWZ1bmN0aW9uKCl7c3Q9ITEsY3Q9bnR9O3ZhciBodD15Ll9fcHJpdmF0ZV9fLm91dD1mdW5jdGlvbih0KXtyZXR1cm4gdD10LnRvU3RyaW5nKCksaXQrPXQubGVuZ3RoKzEsY3QucHVzaCh0KSxjdH0sZnQ9eS5fX3ByaXZhdGVfXy53cml0ZT1mdW5jdGlvbih0KXtyZXR1cm4gaHQoMT09PWFyZ3VtZW50cy5sZW5ndGg/dC50b1N0cmluZygpOkFycmF5LnByb3RvdHlwZS5qb2luLmNhbGwoYXJndW1lbnRzLCIgIikpfSxkdD15Ll9fcHJpdmF0ZV9fLmdldEFycmF5QnVmZmVyPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10Lmxlbmd0aCxyPW5ldyBBcnJheUJ1ZmZlcihlKSxuPW5ldyBVaW50OEFycmF5KHIpO2UtLTspbltlXT10LmNoYXJDb2RlQXQoZSk7cmV0dXJuIHJ9LHB0PVtbIkhlbHZldGljYSIsImhlbHZldGljYSIsIm5vcm1hbCIsIldpbkFuc2lFbmNvZGluZyJdLFsiSGVsdmV0aWNhLUJvbGQiLCJoZWx2ZXRpY2EiLCJib2xkIiwiV2luQW5zaUVuY29kaW5nIl0sWyJIZWx2ZXRpY2EtT2JsaXF1ZSIsImhlbHZldGljYSIsIml0YWxpYyIsIldpbkFuc2lFbmNvZGluZyJdLFsiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIiwiaGVsdmV0aWNhIiwiYm9sZGl0YWxpYyIsIldpbkFuc2lFbmNvZGluZyJdLFsiQ291cmllciIsImNvdXJpZXIiLCJub3JtYWwiLCJXaW5BbnNpRW5jb2RpbmciXSxbIkNvdXJpZXItQm9sZCIsImNvdXJpZXIiLCJib2xkIiwiV2luQW5zaUVuY29kaW5nIl0sWyJDb3VyaWVyLU9ibGlxdWUiLCJjb3VyaWVyIiwiaXRhbGljIiwiV2luQW5zaUVuY29kaW5nIl0sWyJDb3VyaWVyLUJvbGRPYmxpcXVlIiwiY291cmllciIsImJvbGRpdGFsaWMiLCJXaW5BbnNpRW5jb2RpbmciXSxbIlRpbWVzLVJvbWFuIiwidGltZXMiLCJub3JtYWwiLCJXaW5BbnNpRW5jb2RpbmciXSxbIlRpbWVzLUJvbGQiLCJ0aW1lcyIsImJvbGQiLCJXaW5BbnNpRW5jb2RpbmciXSxbIlRpbWVzLUl0YWxpYyIsInRpbWVzIiwiaXRhbGljIiwiV2luQW5zaUVuY29kaW5nIl0sWyJUaW1lcy1Cb2xkSXRhbGljIiwidGltZXMiLCJib2xkaXRhbGljIiwiV2luQW5zaUVuY29kaW5nIl0sWyJaYXBmRGluZ2JhdHMiLCJ6YXBmZGluZ2JhdHMiLCJub3JtYWwiLG51bGxdLFsiU3ltYm9sIiwic3ltYm9sIiwibm9ybWFsIixudWxsXV07eS5fX3ByaXZhdGVfXy5nZXRTdGFuZGFyZEZvbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHB0fTt2YXIgZ3Q9dC5mb250U2l6ZXx8MTY7eS5fX3ByaXZhdGVfXy5zZXRGb250U2l6ZT15LnNldEZvbnRTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBndD1TPT09eC5BRFZBTkNFRD90L190OnQsdGhpc307dmFyIG10LHZ0PXkuX19wcml2YXRlX18uZ2V0Rm9udFNpemU9eS5nZXRGb250U2l6ZT1mdW5jdGlvbigpe3JldHVybiBTPT09eC5DT01QQVQ/Z3Q6Z3QqX3R9LGJ0PXQuUjJMfHwhMTt5Ll9fcHJpdmF0ZV9fLnNldFIyTD15LnNldFIyTD1mdW5jdGlvbih0KXtyZXR1cm4gYnQ9dCx0aGlzfSx5Ll9fcHJpdmF0ZV9fLmdldFIyTD15LmdldFIyTD1mdW5jdGlvbigpe3JldHVybiBidH07dmFyIHl0LHd0PXkuX19wcml2YXRlX18uc2V0Wm9vbU1vZGU9ZnVuY3Rpb24odCl7dmFyIGU9W3ZvaWQgMCxudWxsLCJmdWxsd2lkdGgiLCJmdWxsaGVpZ2h0IiwiZnVsbHBhZ2UiLCJvcmlnaW5hbCJdO2lmKC9eKD86XGQrXC5cZCp8XGQqXC5cZCt8XGQrKSUkLy50ZXN0KHQpKW10PXQ7ZWxzZSBpZihpc05hTih0KSl7aWYoLTE9PT1lLmluZGV4T2YodCkpdGhyb3cgbmV3IEVycm9yKCd6b29tIG11c3QgYmUgSW50ZWdlciAoZS5nLiAyKSwgYSBwZXJjZW50YWdlIFZhbHVlIChlLmcuIDMwMCUpIG9yIGZ1bGx3aWR0aCwgZnVsbGhlaWdodCwgZnVsbHBhZ2UsIG9yaWdpbmFsLiAiJyt0KyciIGlzIG5vdCByZWNvZ25pemVkLicpO210PXR9ZWxzZSBtdD1wYXJzZUludCh0LDEwKX07eS5fX3ByaXZhdGVfXy5nZXRab29tTW9kZT1mdW5jdGlvbigpe3JldHVybiBtdH07dmFyIE50LEx0PXkuX19wcml2YXRlX18uc2V0UGFnZU1vZGU9ZnVuY3Rpb24odCl7aWYoLTE9PVt2b2lkIDAsbnVsbCwiVXNlTm9uZSIsIlVzZU91dGxpbmVzIiwiVXNlVGh1bWJzIiwiRnVsbFNjcmVlbiJdLmluZGV4T2YodCkpdGhyb3cgbmV3IEVycm9yKCdQYWdlIG1vZGUgbXVzdCBiZSBvbmUgb2YgVXNlTm9uZSwgVXNlT3V0bGluZXMsIFVzZVRodW1icywgb3IgRnVsbFNjcmVlbi4gIicrdCsnIiBpcyBub3QgcmVjb2duaXplZC4nKTt5dD10fTt5Ll9fcHJpdmF0ZV9fLmdldFBhZ2VNb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIHl0fTt2YXIgQXQ9eS5fX3ByaXZhdGVfXy5zZXRMYXlvdXRNb2RlPWZ1bmN0aW9uKHQpe2lmKC0xPT1bdm9pZCAwLG51bGwsImNvbnRpbnVvdXMiLCJzaW5nbGUiLCJ0d29sZWZ0IiwidHdvcmlnaHQiLCJ0d28iXS5pbmRleE9mKHQpKXRocm93IG5ldyBFcnJvcignTGF5b3V0IG1vZGUgbXVzdCBiZSBvbmUgb2YgY29udGludW91cywgc2luZ2xlLCB0d29sZWZ0LCB0d29yaWdodC4gIicrdCsnIiBpcyBub3QgcmVjb2duaXplZC4nKTtOdD10fTt5Ll9fcHJpdmF0ZV9fLmdldExheW91dE1vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gTnR9LHkuX19wcml2YXRlX18uc2V0RGlzcGxheU1vZGU9eS5zZXREaXNwbGF5TW9kZT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHd0KHQpLEF0KGUpLEx0KHIpLHRoaXN9O3ZhciB4dD17dGl0bGU6IiIsc3ViamVjdDoiIixhdXRob3I6IiIsa2V5d29yZHM6IiIsY3JlYXRvcjoiIn07eS5fX3ByaXZhdGVfXy5nZXREb2N1bWVudFByb3BlcnR5PWZ1bmN0aW9uKHQpe2lmKC0xPT09T2JqZWN0LmtleXMoeHQpLmluZGV4T2YodCkpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGFyZ3VtZW50IHBhc3NlZCB0byBqc1BERi5nZXREb2N1bWVudFByb3BlcnR5Iik7cmV0dXJuIHh0W3RdfSx5Ll9fcHJpdmF0ZV9fLmdldERvY3VtZW50UHJvcGVydGllcz1mdW5jdGlvbigpe3JldHVybiB4dH0seS5fX3ByaXZhdGVfXy5zZXREb2N1bWVudFByb3BlcnRpZXM9eS5zZXRQcm9wZXJ0aWVzPXkuc2V0RG9jdW1lbnRQcm9wZXJ0aWVzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZSBpbiB4dCl4dC5oYXNPd25Qcm9wZXJ0eShlKSYmdFtlXSYmKHh0W2VdPXRbZV0pO3JldHVybiB0aGlzfSx5Ll9fcHJpdmF0ZV9fLnNldERvY3VtZW50UHJvcGVydHk9ZnVuY3Rpb24odCxlKXtpZigtMT09PU9iamVjdC5rZXlzKHh0KS5pbmRleE9mKHQpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBhcmd1bWVudHMgcGFzc2VkIHRvIGpzUERGLnNldERvY3VtZW50UHJvcGVydHkiKTtyZXR1cm4geHRbdF09ZX07dmFyIFN0LF90LFB0LGt0LEZ0LEl0PXt9LEN0PXt9LGp0PVtdLE90PXt9LEJ0PXt9LE10PXt9LEV0PXt9LHF0PW51bGwsRHQ9MCxSdD1bXSxUdD1uZXcgSSh5KSxVdD10LmhvdGZpeGVzfHxbXSx6dD17fSxIdD17fSxXdD1bXSxWdD1mdW5jdGlvbiB0KGUscixuLGksYSxvKXtpZighKHRoaXMgaW5zdGFuY2VvZiB0KSlyZXR1cm4gbmV3IHQoZSxyLG4saSxhLG8pO2lzTmFOKGUpJiYoZT0xKSxpc05hTihyKSYmKHI9MCksaXNOYU4obikmJihuPTApLGlzTmFOKGkpJiYoaT0xKSxpc05hTihhKSYmKGE9MCksaXNOYU4obykmJihvPTApLHRoaXMuX21hdHJpeD1bZSxyLG4saSxhLG9dfTtPYmplY3QuZGVmaW5lUHJvcGVydHkoVnQucHJvdG90eXBlLCJzeCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXRyaXhbMF19LHNldDpmdW5jdGlvbih0KXt0aGlzLl9tYXRyaXhbMF09dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoVnQucHJvdG90eXBlLCJzaHkiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWF0cml4WzFdfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fbWF0cml4WzFdPXR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KFZ0LnByb3RvdHlwZSwic2h4Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21hdHJpeFsyXX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX21hdHJpeFsyXT10fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShWdC5wcm90b3R5cGUsInN5Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21hdHJpeFszXX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX21hdHJpeFszXT10fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShWdC5wcm90b3R5cGUsInR4Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21hdHJpeFs0XX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX21hdHJpeFs0XT10fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShWdC5wcm90b3R5cGUsInR5Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21hdHJpeFs1XX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX21hdHJpeFs1XT10fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShWdC5wcm90b3R5cGUsImEiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWF0cml4WzBdfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fbWF0cml4WzBdPXR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KFZ0LnByb3RvdHlwZSwiYiIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXRyaXhbMV19LHNldDpmdW5jdGlvbih0KXt0aGlzLl9tYXRyaXhbMV09dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoVnQucHJvdG90eXBlLCJjIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21hdHJpeFsyXX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX21hdHJpeFsyXT10fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShWdC5wcm90b3R5cGUsImQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWF0cml4WzNdfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fbWF0cml4WzNdPXR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KFZ0LnByb3RvdHlwZSwiZSIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXRyaXhbNF19LHNldDpmdW5jdGlvbih0KXt0aGlzLl9tYXRyaXhbNF09dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoVnQucHJvdG90eXBlLCJmIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21hdHJpeFs1XX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX21hdHJpeFs1XT10fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShWdC5wcm90b3R5cGUsInJvdGF0aW9uIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguYXRhbjIodGhpcy5zaHgsdGhpcy5zeCl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KFZ0LnByb3RvdHlwZSwic2NhbGVYIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGVjb21wb3NlKCkuc2NhbGUuc3h9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KFZ0LnByb3RvdHlwZSwic2NhbGVZIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGVjb21wb3NlKCkuc2NhbGUuc3l9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KFZ0LnByb3RvdHlwZSwiaXNJZGVudGl0eSIse2dldDpmdW5jdGlvbigpe3JldHVybiAxPT09dGhpcy5zeCYmKDA9PT10aGlzLnNoeSYmKDA9PT10aGlzLnNoeCYmKDE9PT10aGlzLnN5JiYoMD09PXRoaXMudHgmJjA9PT10aGlzLnR5KSkpKX19KSxWdC5wcm90b3R5cGUuam9pbj1mdW5jdGlvbih0KXtyZXR1cm5bdGhpcy5zeCx0aGlzLnNoeSx0aGlzLnNoeCx0aGlzLnN5LHRoaXMudHgsdGhpcy50eV0ubWFwKEUpLmpvaW4odCl9LFZ0LnByb3RvdHlwZS5tdWx0aXBseT1mdW5jdGlvbih0KXt2YXIgZT10LnN4KnRoaXMuc3grdC5zaHkqdGhpcy5zaHgscj10LnN4KnRoaXMuc2h5K3Quc2h5KnRoaXMuc3ksbj10LnNoeCp0aGlzLnN4K3Quc3kqdGhpcy5zaHgsaT10LnNoeCp0aGlzLnNoeSt0LnN5KnRoaXMuc3ksYT10LnR4KnRoaXMuc3grdC50eSp0aGlzLnNoeCt0aGlzLnR4LG89dC50eCp0aGlzLnNoeSt0LnR5KnRoaXMuc3krdGhpcy50eTtyZXR1cm4gbmV3IFZ0KGUscixuLGksYSxvKX0sVnQucHJvdG90eXBlLmRlY29tcG9zZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuc3gsZT10aGlzLnNoeSxyPXRoaXMuc2h4LG49dGhpcy5zeSxpPXRoaXMudHgsYT10aGlzLnR5LG89TWF0aC5zcXJ0KHQqdCtlKmUpLHM9KHQvPW8pKnIrKGUvPW8pKm47ci09dCpzLG4tPWUqczt2YXIgYz1NYXRoLnNxcnQocipyK24qbik7cmV0dXJuIHMvPWMsdCoobi89Yyk8ZSooci89YykmJih0PS10LGU9LWUscz0tcyxvPS1vKSx7c2NhbGU6bmV3IFZ0KG8sMCwwLGMsMCwwKSx0cmFuc2xhdGU6bmV3IFZ0KDEsMCwwLDEsaSxhKSxyb3RhdGU6bmV3IFZ0KHQsZSwtZSx0LDAsMCksc2tldzpuZXcgVnQoMSwwLHMsMSwwLDApfX0sVnQucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmpvaW4oIiAiKX0sVnQucHJvdG90eXBlLmludmVyc2VkPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5zeCxlPXRoaXMuc2h5LHI9dGhpcy5zaHgsbj10aGlzLnN5LGk9dGhpcy50eCxhPXRoaXMudHksbz0xLyh0Km4tZSpyKSxzPW4qbyxjPS1lKm8sdT0tcipvLGw9dCpvO3JldHVybiBuZXcgVnQocyxjLHUsbCwtcyppLXUqYSwtYyppLWwqYSl9LFZ0LnByb3RvdHlwZS5hcHBseVRvUG9pbnQ9ZnVuY3Rpb24odCl7dmFyIGU9dC54KnRoaXMuc3grdC55KnRoaXMuc2h4K3RoaXMudHgscj10LngqdGhpcy5zaHkrdC55KnRoaXMuc3krdGhpcy50eTtyZXR1cm4gbmV3IENyKGUscil9LFZ0LnByb3RvdHlwZS5hcHBseVRvUmVjdGFuZ2xlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuYXBwbHlUb1BvaW50KHQpLHI9dGhpcy5hcHBseVRvUG9pbnQobmV3IENyKHQueCt0LncsdC55K3QuaCkpO3JldHVybiBuZXcganIoZS54LGUueSxyLngtZS54LHIueS1lLnkpfSxWdC5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnN4LGU9dGhpcy5zaHkscj10aGlzLnNoeCxuPXRoaXMuc3ksaT10aGlzLnR4LGE9dGhpcy50eTtyZXR1cm4gbmV3IFZ0KHQsZSxyLG4saSxhKX0seS5NYXRyaXg9VnQ7dmFyIEd0PXkubWF0cml4TXVsdD1mdW5jdGlvbih0LGUpe3JldHVybiBlLm11bHRpcGx5KHQpfSxZdD1uZXcgVnQoMSwwLDAsMSwwLDApO3kudW5pdE1hdHJpeD15LmlkZW50aXR5TWF0cml4PVl0O3ZhciBKdD1mdW5jdGlvbih0LGUpe2lmKCFCdFt0XSl7dmFyIHI9KGUgaW5zdGFuY2VvZiBPPyJTaCI6IlAiKSsoT2JqZWN0LmtleXMoT3QpLmxlbmd0aCsxKS50b1N0cmluZygxMCk7ZS5pZD1yLEJ0W3RdPXIsT3Rbcl09ZSxUdC5wdWJsaXNoKCJhZGRQYXR0ZXJuIixlKX19O3kuU2hhZGluZ1BhdHRlcm49Tyx5LlRpbGluZ1BhdHRlcm49Qix5LmFkZFNoYWRpbmdQYXR0ZXJuPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHEoImFkZFNoYWRpbmdQYXR0ZXJuKCkiKSxKdCh0LGUpLHRoaXN9LHkuYmVnaW5UaWxpbmdQYXR0ZXJuPWZ1bmN0aW9uKHQpe3EoImJlZ2luVGlsaW5nUGF0dGVybigpIiksQnIodC5ib3VuZGluZ0JveFswXSx0LmJvdW5kaW5nQm94WzFdLHQuYm91bmRpbmdCb3hbMl0tdC5ib3VuZGluZ0JveFswXSx0LmJvdW5kaW5nQm94WzNdLXQuYm91bmRpbmdCb3hbMV0sdC5tYXRyaXgpfSx5LmVuZFRpbGluZ1BhdHRlcm49ZnVuY3Rpb24odCxlKXtxKCJlbmRUaWxpbmdQYXR0ZXJuKCkiKSxlLnN0cmVhbT1vdFskXS5qb2luKCJcbiIpLEp0KHQsZSksVHQucHVibGlzaCgiZW5kVGlsaW5nUGF0dGVybiIsZSksV3QucG9wKCkucmVzdG9yZSgpfTt2YXIgWHQ9eS5fX3ByaXZhdGVfXy5uZXdPYmplY3Q9ZnVuY3Rpb24oKXt2YXIgdD1LdCgpO3JldHVybiBadCh0LCEwKSx0fSxLdD15Ll9fcHJpdmF0ZV9fLm5ld09iamVjdERlZmVycmVkPWZ1bmN0aW9uKCl7cmV0dXJuIGV0KysscnRbZXRdPWZ1bmN0aW9uKCl7cmV0dXJuIGl0fSxldH0sWnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZT0iYm9vbGVhbiI9PXR5cGVvZiBlJiZlLHJ0W3RdPWl0LGUmJmh0KHQrIiAwIG9iaiIpLHR9LCR0PXkuX19wcml2YXRlX18ubmV3QWRkaXRpb25hbE9iamVjdD1mdW5jdGlvbigpe3ZhciB0PXtvYmpJZDpLdCgpLGNvbnRlbnQ6IiJ9O3JldHVybiBhdC5wdXNoKHQpLHR9LFF0PUt0KCksdGU9S3QoKSxlZT15Ll9fcHJpdmF0ZV9fLmRlY29kZUNvbG9yU3RyaW5nPWZ1bmN0aW9uKHQpe3ZhciBlPXQuc3BsaXQoIiAiKTtpZigyIT09ZS5sZW5ndGh8fCJnIiE9PWVbMV0mJiJHIiE9PWVbMV0pe2lmKDU9PT1lLmxlbmd0aCYmKCJrIj09PWVbNF18fCJLIj09PWVbNF0pKXtlPVsoMS1lWzBdKSooMS1lWzNdKSwoMS1lWzFdKSooMS1lWzNdKSwoMS1lWzJdKSooMS1lWzNdKSwiciJdfX1lbHNle3ZhciByPXBhcnNlRmxvYXQoZVswXSk7ZT1bcixyLHIsInIiXX1mb3IodmFyIG49IiMiLGk9MDtpPDM7aSsrKW4rPSgiMCIrTWF0aC5mbG9vcigyNTUqcGFyc2VGbG9hdChlW2ldKSkudG9TdHJpbmcoMTYpKS5zbGljZSgtMik7cmV0dXJuIG59LHJlPXkuX19wcml2YXRlX18uZW5jb2RlQ29sb3JTdHJpbmc9ZnVuY3Rpb24odCl7dmFyIHI7InN0cmluZyI9PXR5cGVvZiB0JiYodD17Y2gxOnR9KTt2YXIgbj10LmNoMSxpPXQuY2gyLGE9dC5jaDMsbz10LmNoNCxzPSJkcmF3Ij09PXQucGRmQ29sb3JUeXBlP1siRyIsIlJHIiwiSyJdOlsiZyIsInJnIiwiayJdO2lmKCJzdHJpbmciPT10eXBlb2YgbiYmIiMiIT09bi5jaGFyQXQoMCkpe3ZhciBjPW5ldyBoKG4pO2lmKGMub2spbj1jLnRvSGV4KCk7ZWxzZSBpZighL15cZCpcLj9cZCokLy50ZXN0KG4pKXRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb2xvciAiJytuKyciIHBhc3NlZCB0byBqc1BERi5lbmNvZGVDb2xvclN0cmluZy4nKX1pZigic3RyaW5nIj09dHlwZW9mIG4mJi9eI1swLTlBLUZhLWZdezN9JC8udGVzdChuKSYmKG49IiMiK25bMV0rblsxXStuWzJdK25bMl0rblszXStuWzNdKSwic3RyaW5nIj09dHlwZW9mIG4mJi9eI1swLTlBLUZhLWZdezZ9JC8udGVzdChuKSl7dmFyIHU9cGFyc2VJbnQobi5zdWJzdHIoMSksMTYpO249dT4+MTYmMjU1LGk9dT4+OCYyNTUsYT0yNTUmdX1pZih2b2lkIDA9PT1pfHx2b2lkIDA9PT1vJiZuPT09aSYmaT09PWEpaWYoInN0cmluZyI9PXR5cGVvZiBuKXI9bisiICIrc1swXTtlbHNlIHN3aXRjaCh0LnByZWNpc2lvbil7Y2FzZSAyOnI9UihuLzI1NSkrIiAiK3NbMF07YnJlYWs7Y2FzZSAzOmRlZmF1bHQ6cj1UKG4vMjU1KSsiICIrc1swXX1lbHNlIGlmKHZvaWQgMD09PW98fCJvYmplY3QiPT09ZShvKSl7aWYobyYmIWlzTmFOKG8uYSkmJjA9PT1vLmEpcmV0dXJuIHI9WyIxLiIsIjEuIiwiMS4iLHNbMV1dLmpvaW4oIiAiKTtpZigic3RyaW5nIj09dHlwZW9mIG4pcj1bbixpLGEsc1sxXV0uam9pbigiICIpO2Vsc2Ugc3dpdGNoKHQucHJlY2lzaW9uKXtjYXNlIDI6cj1bUihuLzI1NSksUihpLzI1NSksUihhLzI1NSksc1sxXV0uam9pbigiICIpO2JyZWFrO2RlZmF1bHQ6Y2FzZSAzOnI9W1Qobi8yNTUpLFQoaS8yNTUpLFQoYS8yNTUpLHNbMV1dLmpvaW4oIiAiKX19ZWxzZSBpZigic3RyaW5nIj09dHlwZW9mIG4pcj1bbixpLGEsbyxzWzJdXS5qb2luKCIgIik7ZWxzZSBzd2l0Y2godC5wcmVjaXNpb24pe2Nhc2UgMjpyPVtSKG4pLFIoaSksUihhKSxSKG8pLHNbMl1dLmpvaW4oIiAiKTticmVhaztjYXNlIDM6ZGVmYXVsdDpyPVtUKG4pLFQoaSksVChhKSxUKG8pLHNbMl1dLmpvaW4oIiAiKX1yZXR1cm4gcn0sbmU9eS5fX3ByaXZhdGVfXy5nZXRGaWx0ZXJzPWZ1bmN0aW9uKCl7cmV0dXJuIGZ9LGllPXkuX19wcml2YXRlX18ucHV0U3RyZWFtPWZ1bmN0aW9uKHQpe3ZhciBlPSh0PXR8fHt9KS5kYXRhfHwiIixyPXQuZmlsdGVyc3x8bmUoKSxuPXQuYWxyZWFkeUFwcGxpZWRGaWx0ZXJzfHxbXSxpPXQuYWRkTGVuZ3RoMXx8ITEsYT1lLmxlbmd0aCxvPXQub2JqZWN0SWQscz1mdW5jdGlvbih0KXtyZXR1cm4gdH07aWYobnVsbCE9PW0mJnZvaWQgMD09PW8pdGhyb3cgbmV3IEVycm9yKCJPYmplY3RJZCBtdXN0IGJlIHBhc3NlZCB0byBwdXRTdHJlYW0gZm9yIGZpbGUgZW5jcnlwdGlvbiIpO251bGwhPT1tJiYocz1ZZS5lbmNyeXB0b3IobywwKSk7dmFyIGM9e307ITA9PT1yJiYocj1bIkZsYXRlRW5jb2RlIl0pO3ZhciB1PXQuYWRkaXRpb25hbEtleVZhbHVlc3x8W10sbD0oYz12b2lkIDAhPT1NLkFQSS5wcm9jZXNzRGF0YUJ5RmlsdGVycz9NLkFQSS5wcm9jZXNzRGF0YUJ5RmlsdGVycyhlLHIpOntkYXRhOmUscmV2ZXJzZUNoYWluOltdfSkucmV2ZXJzZUNoYWluKyhBcnJheS5pc0FycmF5KG4pP24uam9pbigiICIpOm4udG9TdHJpbmcoKSk7aWYoMCE9PWMuZGF0YS5sZW5ndGgmJih1LnB1c2goe2tleToiTGVuZ3RoIix2YWx1ZTpjLmRhdGEubGVuZ3RofSksITA9PT1pJiZ1LnB1c2goe2tleToiTGVuZ3RoMSIsdmFsdWU6YX0pKSwwIT1sLmxlbmd0aClpZihsLnNwbGl0KCIvIikubGVuZ3RoLTE9PTEpdS5wdXNoKHtrZXk6IkZpbHRlciIsdmFsdWU6bH0pO2Vsc2V7dS5wdXNoKHtrZXk6IkZpbHRlciIsdmFsdWU6IlsiK2wrIl0ifSk7Zm9yKHZhciBoPTA7aDx1Lmxlbmd0aDtoKz0xKWlmKCJEZWNvZGVQYXJtcyI9PT11W2hdLmtleSl7Zm9yKHZhciBmPVtdLGQ9MDtkPGMucmV2ZXJzZUNoYWluLnNwbGl0KCIvIikubGVuZ3RoLTE7ZCs9MSlmLnB1c2goIm51bGwiKTtmLnB1c2godVtoXS52YWx1ZSksdVtoXS52YWx1ZT0iWyIrZi5qb2luKCIgIikrIl0ifX1odCgiPDwiKTtmb3IodmFyIHA9MDtwPHUubGVuZ3RoO3ArKylodCgiLyIrdVtwXS5rZXkrIiAiK3VbcF0udmFsdWUpO2h0KCI+PiIpLDAhPT1jLmRhdGEubGVuZ3RoJiYoaHQoInN0cmVhbSIpLGh0KHMoYy5kYXRhKSksaHQoImVuZHN0cmVhbSIpKX0sYWU9eS5fX3ByaXZhdGVfXy5wdXRQYWdlPWZ1bmN0aW9uKHQpe3ZhciBlPXQubnVtYmVyLHI9dC5kYXRhLG49dC5vYmpJZCxpPXQuY29udGVudHNPYmpJZDtadChuLCEwKSxodCgiPDwvVHlwZSAvUGFnZSIpLGh0KCIvUGFyZW50ICIrdC5yb290RGljdGlvbmFyeU9iaklkKyIgMCBSIiksaHQoIi9SZXNvdXJjZXMgIit0LnJlc291cmNlRGljdGlvbmFyeU9iaklkKyIgMCBSIiksaHQoIi9NZWRpYUJveCBbIitwYXJzZUZsb2F0KEUodC5tZWRpYUJveC5ib3R0b21MZWZ0WCkpKyIgIitwYXJzZUZsb2F0KEUodC5tZWRpYUJveC5ib3R0b21MZWZ0WSkpKyIgIitFKHQubWVkaWFCb3gudG9wUmlnaHRYKSsiICIrRSh0Lm1lZGlhQm94LnRvcFJpZ2h0WSkrIl0iKSxudWxsIT09dC5jcm9wQm94JiZodCgiL0Nyb3BCb3ggWyIrRSh0LmNyb3BCb3guYm90dG9tTGVmdFgpKyIgIitFKHQuY3JvcEJveC5ib3R0b21MZWZ0WSkrIiAiK0UodC5jcm9wQm94LnRvcFJpZ2h0WCkrIiAiK0UodC5jcm9wQm94LnRvcFJpZ2h0WSkrIl0iKSxudWxsIT09dC5ibGVlZEJveCYmaHQoIi9CbGVlZEJveCBbIitFKHQuYmxlZWRCb3guYm90dG9tTGVmdFgpKyIgIitFKHQuYmxlZWRCb3guYm90dG9tTGVmdFkpKyIgIitFKHQuYmxlZWRCb3gudG9wUmlnaHRYKSsiICIrRSh0LmJsZWVkQm94LnRvcFJpZ2h0WSkrIl0iKSxudWxsIT09dC50cmltQm94JiZodCgiL1RyaW1Cb3ggWyIrRSh0LnRyaW1Cb3guYm90dG9tTGVmdFgpKyIgIitFKHQudHJpbUJveC5ib3R0b21MZWZ0WSkrIiAiK0UodC50cmltQm94LnRvcFJpZ2h0WCkrIiAiK0UodC50cmltQm94LnRvcFJpZ2h0WSkrIl0iKSxudWxsIT09dC5hcnRCb3gmJmh0KCIvQXJ0Qm94IFsiK0UodC5hcnRCb3guYm90dG9tTGVmdFgpKyIgIitFKHQuYXJ0Qm94LmJvdHRvbUxlZnRZKSsiICIrRSh0LmFydEJveC50b3BSaWdodFgpKyIgIitFKHQuYXJ0Qm94LnRvcFJpZ2h0WSkrIl0iKSwibnVtYmVyIj09dHlwZW9mIHQudXNlclVuaXQmJjEhPT10LnVzZXJVbml0JiZodCgiL1VzZXJVbml0ICIrdC51c2VyVW5pdCksVHQucHVibGlzaCgicHV0UGFnZSIse29iaklkOm4scGFnZUNvbnRleHQ6UnRbZV0scGFnZU51bWJlcjplLHBhZ2U6cn0pLGh0KCIvQ29udGVudHMgIitpKyIgMCBSIiksaHQoIj4+IiksaHQoImVuZG9iaiIpO3ZhciBhPXIuam9pbigiXG4iKTtyZXR1cm4gUz09PXguQURWQU5DRUQmJihhKz0iXG5RIiksWnQoaSwhMCksaWUoe2RhdGE6YSxmaWx0ZXJzOm5lKCksb2JqZWN0SWQ6aX0pLGh0KCJlbmRvYmoiKSxufSxvZT15Ll9fcHJpdmF0ZV9fLnB1dFBhZ2VzPWZ1bmN0aW9uKCl7dmFyIHQsZSxyPVtdO2Zvcih0PTE7dDw9RHQ7dCsrKVJ0W3RdLm9iaklkPUt0KCksUnRbdF0uY29udGVudHNPYmpJZD1LdCgpO2Zvcih0PTE7dDw9RHQ7dCsrKXIucHVzaChhZSh7bnVtYmVyOnQsZGF0YTpvdFt0XSxvYmpJZDpSdFt0XS5vYmpJZCxjb250ZW50c09iaklkOlJ0W3RdLmNvbnRlbnRzT2JqSWQsbWVkaWFCb3g6UnRbdF0ubWVkaWFCb3gsY3JvcEJveDpSdFt0XS5jcm9wQm94LGJsZWVkQm94OlJ0W3RdLmJsZWVkQm94LHRyaW1Cb3g6UnRbdF0udHJpbUJveCxhcnRCb3g6UnRbdF0uYXJ0Qm94LHVzZXJVbml0OlJ0W3RdLnVzZXJVbml0LHJvb3REaWN0aW9uYXJ5T2JqSWQ6UXQscmVzb3VyY2VEaWN0aW9uYXJ5T2JqSWQ6dGV9KSk7WnQoUXQsITApLGh0KCI8PC9UeXBlIC9QYWdlcyIpO3ZhciBuPSIvS2lkcyBbIjtmb3IoZT0wO2U8RHQ7ZSsrKW4rPXJbZV0rIiAwIFIgIjtodChuKyJdIiksaHQoIi9Db3VudCAiK0R0KSxodCgiPj4iKSxodCgiZW5kb2JqIiksVHQucHVibGlzaCgicG9zdFB1dFBhZ2VzIil9LHNlPWZ1bmN0aW9uKHQpe1R0LnB1Ymxpc2goInB1dEZvbnQiLHtmb250OnQsb3V0Omh0LG5ld09iamVjdDpYdCxwdXRTdHJlYW06aWV9KSwhMCE9PXQuaXNBbHJlYWR5UHV0dGVkJiYodC5vYmplY3ROdW1iZXI9WHQoKSxodCgiPDwiKSxodCgiL1R5cGUgL0ZvbnQiKSxodCgiL0Jhc2VGb250IC8iK0YodC5wb3N0U2NyaXB0TmFtZSkpLGh0KCIvU3VidHlwZSAvVHlwZTEiKSwic3RyaW5nIj09dHlwZW9mIHQuZW5jb2RpbmcmJmh0KCIvRW5jb2RpbmcgLyIrdC5lbmNvZGluZyksaHQoIi9GaXJzdENoYXIgMzIiKSxodCgiL0xhc3RDaGFyIDI1NSIpLGh0KCI+PiIpLGh0KCJlbmRvYmoiKSl9LGNlPWZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIEl0KUl0Lmhhc093blByb3BlcnR5KHQpJiYoITE9PT12fHwhMD09PXYmJmIuaGFzT3duUHJvcGVydHkodCkpJiZzZShJdFt0XSl9LHVlPWZ1bmN0aW9uKHQpe3Qub2JqZWN0TnVtYmVyPVh0KCk7dmFyIGU9W107ZS5wdXNoKHtrZXk6IlR5cGUiLHZhbHVlOiIvWE9iamVjdCJ9KSxlLnB1c2goe2tleToiU3VidHlwZSIsdmFsdWU6Ii9Gb3JtIn0pLGUucHVzaCh7a2V5OiJCQm94Iix2YWx1ZToiWyIrW0UodC54KSxFKHQueSksRSh0LngrdC53aWR0aCksRSh0LnkrdC5oZWlnaHQpXS5qb2luKCIgIikrIl0ifSksZS5wdXNoKHtrZXk6Ik1hdHJpeCIsdmFsdWU6IlsiK3QubWF0cml4LnRvU3RyaW5nKCkrIl0ifSk7dmFyIHI9dC5wYWdlc1sxXS5qb2luKCJcbiIpO2llKHtkYXRhOnIsYWRkaXRpb25hbEtleVZhbHVlczplLG9iamVjdElkOnQub2JqZWN0TnVtYmVyfSksaHQoImVuZG9iaiIpfSxsZT1mdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB6dCl6dC5oYXNPd25Qcm9wZXJ0eSh0KSYmdWUoenRbdF0pfSxoZT1mdW5jdGlvbih0LGUpe3ZhciByLG49W10saT0xLyhlLTEpO2ZvcihyPTA7cjwxO3IrPWkpbi5wdXNoKHIpO2lmKG4ucHVzaCgxKSwwIT10WzBdLm9mZnNldCl7dmFyIGE9e29mZnNldDowLGNvbG9yOnRbMF0uY29sb3J9O3QudW5zaGlmdChhKX1pZigxIT10W3QubGVuZ3RoLTFdLm9mZnNldCl7dmFyIG89e29mZnNldDoxLGNvbG9yOnRbdC5sZW5ndGgtMV0uY29sb3J9O3QucHVzaChvKX1mb3IodmFyIHM9IiIsYz0wLHU9MDt1PG4ubGVuZ3RoO3UrKyl7Zm9yKHI9blt1XTtyPnRbYysxXS5vZmZzZXQ7KWMrKzt2YXIgbD10W2NdLm9mZnNldCxoPShyLWwpLyh0W2MrMV0ub2Zmc2V0LWwpLGY9dFtjXS5jb2xvcixkPXRbYysxXS5jb2xvcjtzKz10dChNYXRoLnJvdW5kKCgxLWgpKmZbMF0raCpkWzBdKS50b1N0cmluZygxNikpK3R0KE1hdGgucm91bmQoKDEtaCkqZlsxXStoKmRbMV0pLnRvU3RyaW5nKDE2KSkrdHQoTWF0aC5yb3VuZCgoMS1oKSpmWzJdK2gqZFsyXSkudG9TdHJpbmcoMTYpKX1yZXR1cm4gcy50cmltKCl9LGZlPWZ1bmN0aW9uKHQsZSl7ZXx8KGU9MjEpO3ZhciByPVh0KCksbj1oZSh0LmNvbG9ycyxlKSxpPVtdO2kucHVzaCh7a2V5OiJGdW5jdGlvblR5cGUiLHZhbHVlOiIwIn0pLGkucHVzaCh7a2V5OiJEb21haW4iLHZhbHVlOiJbMC4wIDEuMF0ifSksaS5wdXNoKHtrZXk6IlNpemUiLHZhbHVlOiJbIitlKyJdIn0pLGkucHVzaCh7a2V5OiJCaXRzUGVyU2FtcGxlIix2YWx1ZToiOCJ9KSxpLnB1c2goe2tleToiUmFuZ2UiLHZhbHVlOiJbMC4wIDEuMCAwLjAgMS4wIDAuMCAxLjBdIn0pLGkucHVzaCh7a2V5OiJEZWNvZGUiLHZhbHVlOiJbMC4wIDEuMCAwLjAgMS4wIDAuMCAxLjBdIn0pLGllKHtkYXRhOm4sYWRkaXRpb25hbEtleVZhbHVlczppLGFscmVhZHlBcHBsaWVkRmlsdGVyczpbIi9BU0NJSUhleERlY29kZSJdLG9iamVjdElkOnJ9KSxodCgiZW5kb2JqIiksdC5vYmplY3ROdW1iZXI9WHQoKSxodCgiPDwgL1NoYWRpbmdUeXBlICIrdC50eXBlKSxodCgiL0NvbG9yU3BhY2UgL0RldmljZVJHQiIpO3ZhciBhPSIvQ29vcmRzIFsiK0UocGFyc2VGbG9hdCh0LmNvb3Jkc1swXSkpKyIgIitFKHBhcnNlRmxvYXQodC5jb29yZHNbMV0pKSsiICI7Mj09PXQudHlwZT9hKz1FKHBhcnNlRmxvYXQodC5jb29yZHNbMl0pKSsiICIrRShwYXJzZUZsb2F0KHQuY29vcmRzWzNdKSk6YSs9RShwYXJzZUZsb2F0KHQuY29vcmRzWzJdKSkrIiAiK0UocGFyc2VGbG9hdCh0LmNvb3Jkc1szXSkpKyIgIitFKHBhcnNlRmxvYXQodC5jb29yZHNbNF0pKSsiICIrRShwYXJzZUZsb2F0KHQuY29vcmRzWzVdKSksaHQoYSs9Il0iKSx0Lm1hdHJpeCYmaHQoIi9NYXRyaXggWyIrdC5tYXRyaXgudG9TdHJpbmcoKSsiXSIpLGh0KCIvRnVuY3Rpb24gIityKyIgMCBSIiksaHQoIi9FeHRlbmQgW3RydWUgdHJ1ZV0iKSxodCgiPj4iKSxodCgiZW5kb2JqIil9LGRlPWZ1bmN0aW9uKHQsZSl7dmFyIHI9S3QoKSxuPVh0KCk7ZS5wdXNoKHtyZXNvdXJjZXNPaWQ6cixvYmplY3RPaWQ6bn0pLHQub2JqZWN0TnVtYmVyPW47dmFyIGk9W107aS5wdXNoKHtrZXk6IlR5cGUiLHZhbHVlOiIvUGF0dGVybiJ9KSxpLnB1c2goe2tleToiUGF0dGVyblR5cGUiLHZhbHVlOiIxIn0pLGkucHVzaCh7a2V5OiJQYWludFR5cGUiLHZhbHVlOiIxIn0pLGkucHVzaCh7a2V5OiJUaWxpbmdUeXBlIix2YWx1ZToiMSJ9KSxpLnB1c2goe2tleToiQkJveCIsdmFsdWU6IlsiK3QuYm91bmRpbmdCb3gubWFwKEUpLmpvaW4oIiAiKSsiXSJ9KSxpLnB1c2goe2tleToiWFN0ZXAiLHZhbHVlOkUodC54U3RlcCl9KSxpLnB1c2goe2tleToiWVN0ZXAiLHZhbHVlOkUodC55U3RlcCl9KSxpLnB1c2goe2tleToiUmVzb3VyY2VzIix2YWx1ZTpyKyIgMCBSIn0pLHQubWF0cml4JiZpLnB1c2goe2tleToiTWF0cml4Iix2YWx1ZToiWyIrdC5tYXRyaXgudG9TdHJpbmcoKSsiXSJ9KSxpZSh7ZGF0YTp0LnN0cmVhbSxhZGRpdGlvbmFsS2V5VmFsdWVzOmksb2JqZWN0SWQ6dC5vYmplY3ROdW1iZXJ9KSxodCgiZW5kb2JqIil9LHBlPWZ1bmN0aW9uKHQpe3ZhciBlO2ZvcihlIGluIE90KU90Lmhhc093blByb3BlcnR5KGUpJiYoT3RbZV1pbnN0YW5jZW9mIE8/ZmUoT3RbZV0pOk90W2VdaW5zdGFuY2VvZiBCJiZkZShPdFtlXSx0KSl9LGdlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZSBpbiB0Lm9iamVjdE51bWJlcj1YdCgpLGh0KCI8PCIpLHQpc3dpdGNoKGUpe2Nhc2Uib3BhY2l0eSI6aHQoIi9jYSAiK1IodFtlXSkpO2JyZWFrO2Nhc2Uic3Ryb2tlLW9wYWNpdHkiOmh0KCIvQ0EgIitSKHRbZV0pKX1odCgiPj4iKSxodCgiZW5kb2JqIil9LG1lPWZ1bmN0aW9uKCl7dmFyIHQ7Zm9yKHQgaW4gTXQpTXQuaGFzT3duUHJvcGVydHkodCkmJmdlKE10W3RdKX0sdmU9ZnVuY3Rpb24oKXtmb3IodmFyIHQgaW4gaHQoIi9YT2JqZWN0IDw8IiksenQpenQuaGFzT3duUHJvcGVydHkodCkmJnp0W3RdLm9iamVjdE51bWJlcj49MCYmaHQoIi8iK3QrIiAiK3p0W3RdLm9iamVjdE51bWJlcisiIDAgUiIpO1R0LnB1Ymxpc2goInB1dFhvYmplY3REaWN0IiksaHQoIj4+Iil9LGJlPWZ1bmN0aW9uKCl7WWUub2lkPVh0KCksaHQoIjw8IiksaHQoIi9GaWx0ZXIgL1N0YW5kYXJkIiksaHQoIi9WICIrWWUudiksaHQoIi9SICIrWWUuciksaHQoIi9VIDwiK1llLnRvSGV4U3RyaW5nKFllLlUpKyI+IiksaHQoIi9PIDwiK1llLnRvSGV4U3RyaW5nKFllLk8pKyI+IiksaHQoIi9QICIrWWUuUCksaHQoIj4+IiksaHQoImVuZG9iaiIpfSx5ZT1mdW5jdGlvbigpe2Zvcih2YXIgdCBpbiBodCgiL0ZvbnQgPDwiKSxJdClJdC5oYXNPd25Qcm9wZXJ0eSh0KSYmKCExPT09dnx8ITA9PT12JiZiLmhhc093blByb3BlcnR5KHQpKSYmaHQoIi8iK3QrIiAiK0l0W3RdLm9iamVjdE51bWJlcisiIDAgUiIpO2h0KCI+PiIpfSx3ZT1mdW5jdGlvbigpe2lmKE9iamVjdC5rZXlzKE90KS5sZW5ndGg+MCl7Zm9yKHZhciB0IGluIGh0KCIvU2hhZGluZyA8PCIpLE90KU90Lmhhc093blByb3BlcnR5KHQpJiZPdFt0XWluc3RhbmNlb2YgTyYmT3RbdF0ub2JqZWN0TnVtYmVyPj0wJiZodCgiLyIrdCsiICIrT3RbdF0ub2JqZWN0TnVtYmVyKyIgMCBSIik7VHQucHVibGlzaCgicHV0U2hhZGluZ1BhdHRlcm5EaWN0IiksaHQoIj4+Iil9fSxOZT1mdW5jdGlvbih0KXtpZihPYmplY3Qua2V5cyhPdCkubGVuZ3RoPjApe2Zvcih2YXIgZSBpbiBodCgiL1BhdHRlcm4gPDwiKSxPdClPdC5oYXNPd25Qcm9wZXJ0eShlKSYmT3RbZV1pbnN0YW5jZW9mIHkuVGlsaW5nUGF0dGVybiYmT3RbZV0ub2JqZWN0TnVtYmVyPj0wJiZPdFtlXS5vYmplY3ROdW1iZXI8dCYmaHQoIi8iK2UrIiAiK090W2VdLm9iamVjdE51bWJlcisiIDAgUiIpO1R0LnB1Ymxpc2goInB1dFRpbGluZ1BhdHRlcm5EaWN0IiksaHQoIj4+Iil9fSxMZT1mdW5jdGlvbigpe2lmKE9iamVjdC5rZXlzKE10KS5sZW5ndGg+MCl7dmFyIHQ7Zm9yKHQgaW4gaHQoIi9FeHRHU3RhdGUgPDwiKSxNdClNdC5oYXNPd25Qcm9wZXJ0eSh0KSYmTXRbdF0ub2JqZWN0TnVtYmVyPj0wJiZodCgiLyIrdCsiICIrTXRbdF0ub2JqZWN0TnVtYmVyKyIgMCBSIik7VHQucHVibGlzaCgicHV0R1N0YXRlRGljdCIpLGh0KCI+PiIpfX0sQWU9ZnVuY3Rpb24odCl7WnQodC5yZXNvdXJjZXNPaWQsITApLGh0KCI8PCIpLGh0KCIvUHJvY1NldCBbL1BERiAvVGV4dCAvSW1hZ2VCIC9JbWFnZUMgL0ltYWdlSV0iKSx5ZSgpLHdlKCksTmUodC5vYmplY3RPaWQpLExlKCksdmUoKSxodCgiPj4iKSxodCgiZW5kb2JqIil9LHhlPWZ1bmN0aW9uKCl7dmFyIHQ9W107Y2UoKSxtZSgpLGxlKCkscGUodCksVHQucHVibGlzaCgicHV0UmVzb3VyY2VzIiksdC5mb3JFYWNoKEFlKSxBZSh7cmVzb3VyY2VzT2lkOnRlLG9iamVjdE9pZDpOdW1iZXIuTUFYX1NBRkVfSU5URUdFUn0pLFR0LnB1Ymxpc2goInBvc3RQdXRSZXNvdXJjZXMiKX0sU2U9ZnVuY3Rpb24oKXtUdC5wdWJsaXNoKCJwdXRBZGRpdGlvbmFsT2JqZWN0cyIpO2Zvcih2YXIgdD0wO3Q8YXQubGVuZ3RoO3QrKyl7dmFyIGU9YXRbdF07WnQoZS5vYmpJZCwhMCksaHQoZS5jb250ZW50KSxodCgiZW5kb2JqIil9VHQucHVibGlzaCgicG9zdFB1dEFkZGl0aW9uYWxPYmplY3RzIil9LF9lPWZ1bmN0aW9uKHQpe0N0W3QuZm9udE5hbWVdPUN0W3QuZm9udE5hbWVdfHx7fSxDdFt0LmZvbnROYW1lXVt0LmZvbnRTdHlsZV09dC5pZH0sUGU9ZnVuY3Rpb24odCxlLHIsbixpKXt2YXIgYT17aWQ6IkYiKyhPYmplY3Qua2V5cyhJdCkubGVuZ3RoKzEpLnRvU3RyaW5nKDEwKSxwb3N0U2NyaXB0TmFtZTp0LGZvbnROYW1lOmUsZm9udFN0eWxlOnIsZW5jb2Rpbmc6bixpc1N0YW5kYXJkRm9udDppfHwhMSxtZXRhZGF0YTp7fX07cmV0dXJuIFR0LnB1Ymxpc2goImFkZEZvbnQiLHtmb250OmEsaW5zdGFuY2U6dGhpc30pLEl0W2EuaWRdPWEsX2UoYSksYS5pZH0sa2U9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTAscj1wdC5sZW5ndGg7ZTxyO2UrKyl7dmFyIG49UGUuY2FsbCh0aGlzLHRbZV1bMF0sdFtlXVsxXSx0W2VdWzJdLHB0W2VdWzNdLCEwKTshMT09PXYmJihiW25dPSEwKTt2YXIgaT10W2VdWzBdLnNwbGl0KCItIik7X2Uoe2lkOm4sZm9udE5hbWU6aVswXSxmb250U3R5bGU6aVsxXXx8IiJ9KX1UdC5wdWJsaXNoKCJhZGRGb250cyIse2ZvbnRzOkl0LGRpY3Rpb25hcnk6Q3R9KX0sRmU9ZnVuY3Rpb24odCl7cmV0dXJuIHQuZm9vPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiB0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1jYXRjaCh0KXt2YXIgZT10LnN0YWNrfHwiIjt+ZS5pbmRleE9mKCIgYXQgIikmJihlPWUuc3BsaXQoIiBhdCAiKVsxXSk7dmFyIG49IkVycm9yIGluIGZ1bmN0aW9uICIrZS5zcGxpdCgiXG4iKVswXS5zcGxpdCgiPCIpWzBdKyI6ICIrdC5tZXNzYWdlO2lmKCFyLmNvbnNvbGUpdGhyb3cgbmV3IEVycm9yKG4pO3IuY29uc29sZS5lcnJvcihuLHQpLHIuYWxlcnQmJmFsZXJ0KG4pfX0sdC5mb28uYmFyPXQsdC5mb299LEllPWZ1bmN0aW9uKHQsZSl7dmFyIHIsbixpLGEsbyxzLGMsdSxsO2lmKGk9KGU9ZXx8e30pLnNvdXJjZUVuY29kaW5nfHwiVW5pY29kZSIsbz1lLm91dHB1dEVuY29kaW5nLChlLmF1dG9lbmNvZGV8fG8pJiZJdFtTdF0ubWV0YWRhdGEmJkl0W1N0XS5tZXRhZGF0YVtpXSYmSXRbU3RdLm1ldGFkYXRhW2ldLmVuY29kaW5nJiYoYT1JdFtTdF0ubWV0YWRhdGFbaV0uZW5jb2RpbmcsIW8mJkl0W1N0XS5lbmNvZGluZyYmKG89SXRbU3RdLmVuY29kaW5nKSwhbyYmYS5jb2RlUGFnZXMmJihvPWEuY29kZVBhZ2VzWzBdKSwic3RyaW5nIj09dHlwZW9mIG8mJihvPWFbb10pLG8pKXtmb3IoYz0hMSxzPVtdLHI9MCxuPXQubGVuZ3RoO3I8bjtyKyspKHU9b1t0LmNoYXJDb2RlQXQocildKT9zLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZSh1KSk6cy5wdXNoKHRbcl0pLHNbcl0uY2hhckNvZGVBdCgwKT4+OCYmKGM9ITApO3Q9cy5qb2luKCIiKX1mb3Iocj10Lmxlbmd0aDt2b2lkIDA9PT1jJiYwIT09cjspdC5jaGFyQ29kZUF0KHItMSk+PjgmJihjPSEwKSxyLS07aWYoIWMpcmV0dXJuIHQ7Zm9yKHM9ZS5ub0JPTT9bXTpbMjU0LDI1NV0scj0wLG49dC5sZW5ndGg7cjxuO3IrKyl7aWYoKGw9KHU9dC5jaGFyQ29kZUF0KHIpKT4+OCk+PjgpdGhyb3cgbmV3IEVycm9yKCJDaGFyYWN0ZXIgYXQgcG9zaXRpb24gIityKyIgb2Ygc3RyaW5nICciK3QrIicgZXhjZWVkcyAxNmJpdHMuIENhbm5vdCBiZSBlbmNvZGVkIGludG8gVUNTLTIgQkUiKTtzLnB1c2gobCkscy5wdXNoKHUtKGw8PDgpKX1yZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseSh2b2lkIDAscyl9LENlPXkuX19wcml2YXRlX18ucGRmRXNjYXBlPXkucGRmRXNjYXBlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIEllKHQsZSkucmVwbGFjZSgvXFwvZywiXFxcXCIpLnJlcGxhY2UoL1woL2csIlxcKCIpLnJlcGxhY2UoL1wpL2csIlxcKSIpfSxqZT15Ll9fcHJpdmF0ZV9fLmJlZ2luUGFnZT1mdW5jdGlvbih0KXtvdFsrK0R0XT1bXSxSdFtEdF09e29iaklkOjAsY29udGVudHNPYmpJZDowLHVzZXJVbml0Ok51bWJlcihkKSxhcnRCb3g6bnVsbCxibGVlZEJveDpudWxsLGNyb3BCb3g6bnVsbCx0cmltQm94Om51bGwsbWVkaWFCb3g6e2JvdHRvbUxlZnRYOjAsYm90dG9tTGVmdFk6MCx0b3BSaWdodFg6TnVtYmVyKHRbMF0pLHRvcFJpZ2h0WTpOdW1iZXIodFsxXSl9fSxNZShEdCksbHQob3RbJF0pfSxPZT1mdW5jdGlvbih0LGUpe3ZhciByLG4sbztzd2l0Y2goYT1lfHxhLCJzdHJpbmciPT10eXBlb2YgdCYmKHI9QSh0LnRvTG93ZXJDYXNlKCkpLEFycmF5LmlzQXJyYXkocikmJihuPXJbMF0sbz1yWzFdKSksQXJyYXkuaXNBcnJheSh0KSYmKG49dFswXSpfdCxvPXRbMV0qX3QpLGlzTmFOKG4pJiYobj1zWzBdLG89c1sxXSksKG4+MTQ0MDB8fG8+MTQ0MDApJiYoaS53YXJuKCJBIHBhZ2UgaW4gYSBQREYgY2FuIG5vdCBiZSB3aWRlciBvciB0YWxsZXIgdGhhbiAxNDQwMCB1c2VyVW5pdC4ganNQREYgbGltaXRzIHRoZSB3aWR0aC9oZWlnaHQgdG8gMTQ0MDAiKSxuPU1hdGgubWluKDE0NDAwLG4pLG89TWF0aC5taW4oMTQ0MDAsbykpLHM9W24sb10sYS5zdWJzdHIoMCwxKSl7Y2FzZSJsIjpvPm4mJihzPVtvLG5dKTticmVhaztjYXNlInAiOm4+byYmKHM9W28sbl0pfWplKHMpLHByKGZyKSxodChMciksMCE9PWtyJiZodChrcisiIEoiKSwwIT09RnImJmh0KEZyKyIgaiIpLFR0LnB1Ymxpc2goImFkZFBhZ2UiLHtwYWdlTnVtYmVyOkR0fSl9LEJlPWZ1bmN0aW9uKHQpe3Q+MCYmdDw9RHQmJihvdC5zcGxpY2UodCwxKSxSdC5zcGxpY2UodCwxKSxEdC0tLCQ+RHQmJigkPUR0KSx0aGlzLnNldFBhZ2UoJCkpfSxNZT1mdW5jdGlvbih0KXt0PjAmJnQ8PUR0JiYoJD10KX0sRWU9eS5fX3ByaXZhdGVfXy5nZXROdW1iZXJPZlBhZ2VzPXkuZ2V0TnVtYmVyT2ZQYWdlcz1mdW5jdGlvbigpe3JldHVybiBvdC5sZW5ndGgtMX0scWU9ZnVuY3Rpb24odCxlLHIpe3ZhciBuLGE9dm9pZCAwO3JldHVybiByPXJ8fHt9LHQ9dm9pZCAwIT09dD90Okl0W1N0XS5mb250TmFtZSxlPXZvaWQgMCE9PWU/ZTpJdFtTdF0uZm9udFN0eWxlLG49dC50b0xvd2VyQ2FzZSgpLHZvaWQgMCE9PUN0W25dJiZ2b2lkIDAhPT1DdFtuXVtlXT9hPUN0W25dW2VdOnZvaWQgMCE9PUN0W3RdJiZ2b2lkIDAhPT1DdFt0XVtlXT9hPUN0W3RdW2VdOiExPT09ci5kaXNhYmxlV2FybmluZyYmaS53YXJuKCJVbmFibGUgdG8gbG9vayB1cCBmb250IGxhYmVsIGZvciBmb250ICciK3QrIicsICciK2UrIicuIFJlZmVyIHRvIGdldEZvbnRMaXN0KCkgZm9yIGF2YWlsYWJsZSBmb250cy4iKSxhfHxyLm5vRmFsbGJhY2t8fG51bGw9PShhPUN0LnRpbWVzW2VdKSYmKGE9Q3QudGltZXMubm9ybWFsKSxhfSxEZT15Ll9fcHJpdmF0ZV9fLnB1dEluZm89ZnVuY3Rpb24oKXt2YXIgdD1YdCgpLGU9ZnVuY3Rpb24odCl7cmV0dXJuIHR9O2Zvcih2YXIgciBpbiBudWxsIT09bSYmKGU9WWUuZW5jcnlwdG9yKHQsMCkpLGh0KCI8PCIpLGh0KCIvUHJvZHVjZXIgKCIrQ2UoZSgianNQREYgIitNLnZlcnNpb24pKSsiKSIpLHh0KXh0Lmhhc093blByb3BlcnR5KHIpJiZ4dFtyXSYmaHQoIi8iK3Iuc3Vic3RyKDAsMSkudG9VcHBlckNhc2UoKStyLnN1YnN0cigxKSsiICgiK0NlKGUoeHRbcl0pKSsiKSIpO2h0KCIvQ3JlYXRpb25EYXRlICgiK0NlKGUoVykpKyIpIiksaHQoIj4+IiksaHQoImVuZG9iaiIpfSxSZT15Ll9fcHJpdmF0ZV9fLnB1dENhdGFsb2c9ZnVuY3Rpb24odCl7dmFyIGU9KHQ9dHx8e30pLnJvb3REaWN0aW9uYXJ5T2JqSWR8fFF0O3N3aXRjaChYdCgpLGh0KCI8PCIpLGh0KCIvVHlwZSAvQ2F0YWxvZyIpLGh0KCIvUGFnZXMgIitlKyIgMCBSIiksbXR8fChtdD0iZnVsbHdpZHRoIiksbXQpe2Nhc2UiZnVsbHdpZHRoIjpodCgiL09wZW5BY3Rpb24gWzMgMCBSIC9GaXRIIG51bGxdIik7YnJlYWs7Y2FzZSJmdWxsaGVpZ2h0IjpodCgiL09wZW5BY3Rpb24gWzMgMCBSIC9GaXRWIG51bGxdIik7YnJlYWs7Y2FzZSJmdWxscGFnZSI6aHQoIi9PcGVuQWN0aW9uIFszIDAgUiAvRml0XSIpO2JyZWFrO2Nhc2Uib3JpZ2luYWwiOmh0KCIvT3BlbkFjdGlvbiBbMyAwIFIgL1hZWiBudWxsIG51bGwgMV0iKTticmVhaztkZWZhdWx0OnZhciByPSIiK210OyIlIj09PXIuc3Vic3RyKHIubGVuZ3RoLTEpJiYobXQ9cGFyc2VJbnQobXQpLzEwMCksIm51bWJlciI9PXR5cGVvZiBtdCYmaHQoIi9PcGVuQWN0aW9uIFszIDAgUiAvWFlaIG51bGwgbnVsbCAiK1IobXQpKyJdIil9c3dpdGNoKE50fHwoTnQ9ImNvbnRpbnVvdXMiKSxOdCl7Y2FzZSJjb250aW51b3VzIjpodCgiL1BhZ2VMYXlvdXQgL09uZUNvbHVtbiIpO2JyZWFrO2Nhc2Uic2luZ2xlIjpodCgiL1BhZ2VMYXlvdXQgL1NpbmdsZVBhZ2UiKTticmVhaztjYXNlInR3byI6Y2FzZSJ0d29sZWZ0IjpodCgiL1BhZ2VMYXlvdXQgL1R3b0NvbHVtbkxlZnQiKTticmVhaztjYXNlInR3b3JpZ2h0IjpodCgiL1BhZ2VMYXlvdXQgL1R3b0NvbHVtblJpZ2h0Iil9eXQmJmh0KCIvUGFnZU1vZGUgLyIreXQpLFR0LnB1Ymxpc2goInB1dENhdGFsb2ciKSxodCgiPj4iKSxodCgiZW5kb2JqIil9LFRlPXkuX19wcml2YXRlX18ucHV0VHJhaWxlcj1mdW5jdGlvbigpe2h0KCJ0cmFpbGVyIiksaHQoIjw8IiksaHQoIi9TaXplICIrKGV0KzEpKSxodCgiL1Jvb3QgIitldCsiIDAgUiIpLGh0KCIvSW5mbyAiKyhldC0xKSsiIDAgUiIpLG51bGwhPT1tJiZodCgiL0VuY3J5cHQgIitZZS5vaWQrIiAwIFIiKSxodCgiL0lEIFsgPCIrVisiPiA8IitWKyI+IF0iKSxodCgiPj4iKX0sVWU9eS5fX3ByaXZhdGVfXy5wdXRIZWFkZXI9ZnVuY3Rpb24oKXtodCgiJVBERi0iK3cpLGh0KCIlwrrDn8Ksw6AiKX0semU9eS5fX3ByaXZhdGVfXy5wdXRYUmVmPWZ1bmN0aW9uKCl7dmFyIHQ9IjAwMDAwMDAwMDAiO2h0KCJ4cmVmIiksaHQoIjAgIisoZXQrMSkpLGh0KCIwMDAwMDAwMDAwIDY1NTM1IGYgIik7Zm9yKHZhciBlPTE7ZTw9ZXQ7ZSsrKXsiZnVuY3Rpb24iPT10eXBlb2YgcnRbZV0/aHQoKHQrcnRbZV0oKSkuc2xpY2UoLTEwKSsiIDAwMDAwIG4gIik6dm9pZCAwIT09cnRbZV0/aHQoKHQrcnRbZV0pLnNsaWNlKC0xMCkrIiAwMDAwMCBuICIpOmh0KCIwMDAwMDAwMDAwIDAwMDAwIG4gIil9fSxIZT15Ll9fcHJpdmF0ZV9fLmJ1aWxkRG9jdW1lbnQ9ZnVuY3Rpb24oKXt1dCgpLGx0KG50KSxUdC5wdWJsaXNoKCJidWlsZERvY3VtZW50IiksVWUoKSxvZSgpLFNlKCkseGUoKSxudWxsIT09bSYmYmUoKSxEZSgpLFJlKCk7dmFyIHQ9aXQ7cmV0dXJuIHplKCksVGUoKSxodCgic3RhcnR4cmVmIiksaHQoIiIrdCksaHQoIiUlRU9GIiksbHQob3RbJF0pLG50LmpvaW4oIlxuIil9LFdlPXkuX19wcml2YXRlX18uZ2V0QmxvYj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IEJsb2IoW2R0KHQpXSx7dHlwZToiYXBwbGljYXRpb24vcGRmIn0pfSxWZT15Lm91dHB1dD15Ll9fcHJpdmF0ZV9fLm91dHB1dD1GZSgoZnVuY3Rpb24odCxlKXtzd2l0Y2goInN0cmluZyI9PXR5cGVvZihlPWV8fHt9KT9lPXtmaWxlbmFtZTplfTplLmZpbGVuYW1lPWUuZmlsZW5hbWV8fCJnZW5lcmF0ZWQucGRmIix0KXtjYXNlIHZvaWQgMDpyZXR1cm4gSGUoKTtjYXNlInNhdmUiOnkuc2F2ZShlLmZpbGVuYW1lKTticmVhaztjYXNlImFycmF5YnVmZmVyIjpyZXR1cm4gZHQoSGUoKSk7Y2FzZSJibG9iIjpyZXR1cm4gV2UoSGUoKSk7Y2FzZSJibG9idXJpIjpjYXNlImJsb2J1cmwiOmlmKHZvaWQgMCE9PXIuVVJMJiYiZnVuY3Rpb24iPT10eXBlb2Ygci5VUkwuY3JlYXRlT2JqZWN0VVJMKXJldHVybiByLlVSTCYmci5VUkwuY3JlYXRlT2JqZWN0VVJMKFdlKEhlKCkpKXx8dm9pZCAwO2kud2FybigiYmxvYnVybCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHlvdXIgc3lzdGVtLCBiZWNhdXNlIFVSTC5jcmVhdGVPYmplY3RVUkwgaXMgbm90IHN1cHBvcnRlZCBieSB5b3VyIGJyb3dzZXIuIik7YnJlYWs7Y2FzZSJkYXRhdXJpc3RyaW5nIjpjYXNlImRhdGF1cmxzdHJpbmciOnZhciBuPSIiLGE9SGUoKTt0cnl7bj11KGEpfWNhdGNoKHQpe249dSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoYSkpKX1yZXR1cm4iZGF0YTphcHBsaWNhdGlvbi9wZGY7ZmlsZW5hbWU9IitlLmZpbGVuYW1lKyI7YmFzZTY0LCIrbjtjYXNlInBkZm9iamVjdG5ld3dpbmRvdyI6aWYoIltvYmplY3QgV2luZG93XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwocikpe3ZhciBvPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9wZGZvYmplY3QvMi4xLjEvcGRmb2JqZWN0Lm1pbi5qcyIscz0nIGludGVncml0eT0ic2hhNTEyLTR6ZS9hOS80anF1K3RYOWRmT3FKWVN2eVlkNU02cXVtLzNIcENMcisvSnFmMHdoYzM3VlVia3BOR0hSNy84cFNuQ0Z3NDdUMWZtSXB3QlY3VXlTaDNnPT0iIGNyb3Nzb3JpZ2luPSJhbm9ueW1vdXMiJztlLnBkZk9iamVjdFVybCYmKG89ZS5wZGZPYmplY3RVcmwscz0iIik7dmFyIGM9JzxodG1sPjxzdHlsZT5odG1sLCBib2R5IHsgcGFkZGluZzogMDsgbWFyZ2luOiAwOyB9IGlmcmFtZSB7IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7IGJvcmRlcjogMDt9ICA8L3N0eWxlPjxib2R5PjxzY3JpcHQgc3JjPSInK28rJyInK3MrJz48XC9zY3JpcHQ+PHNjcmlwdCA+UERGT2JqZWN0LmVtYmVkKCInK3RoaXMub3V0cHV0KCJkYXRhdXJsc3RyaW5nIikrJyIsICcrSlNPTi5zdHJpbmdpZnkoZSkrIik7PFwvc2NyaXB0PjwvYm9keT48L2h0bWw+IixsPXIub3BlbigpO3JldHVybiBudWxsIT09bCYmbC5kb2N1bWVudC53cml0ZShjKSxsfXRocm93IG5ldyBFcnJvcigiVGhlIG9wdGlvbiBwZGZvYmplY3RuZXd3aW5kb3cganVzdCB3b3JrcyBpbiBhIGJyb3dzZXItZW52aXJvbm1lbnQuIik7Y2FzZSJwZGZqc25ld3dpbmRvdyI6aWYoIltvYmplY3QgV2luZG93XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwocikpe3ZhciBoPSc8aHRtbD48c3R5bGU+aHRtbCwgYm9keSB7IHBhZGRpbmc6IDA7IG1hcmdpbjogMDsgfSBpZnJhbWUgeyB3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDAlOyBib3JkZXI6IDA7fSAgPC9zdHlsZT48Ym9keT48aWZyYW1lIGlkPSJwZGZWaWV3ZXIiIHNyYz0iJysoZS5wZGZKc1VybHx8ImV4YW1wbGVzL1BERi5qcy93ZWIvdmlld2VyLmh0bWwiKSsiP2ZpbGU9JmRvd25sb2FkTmFtZT0iK2UuZmlsZW5hbWUrJyIgd2lkdGg9IjUwMHB4IiBoZWlnaHQ9IjQwMHB4IiAvPjwvYm9keT48L2h0bWw+JyxmPXIub3BlbigpO2lmKG51bGwhPT1mKXtmLmRvY3VtZW50LndyaXRlKGgpO3ZhciBkPXRoaXM7Zi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQucXVlcnlTZWxlY3RvcigiI3BkZlZpZXdlciIpLm9ubG9hZD1mdW5jdGlvbigpe2YuZG9jdW1lbnQudGl0bGU9ZS5maWxlbmFtZSxmLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yKCIjcGRmVmlld2VyIikuY29udGVudFdpbmRvdy5QREZWaWV3ZXJBcHBsaWNhdGlvbi5vcGVuKGQub3V0cHV0KCJibG9idXJsIikpfX1yZXR1cm4gZn10aHJvdyBuZXcgRXJyb3IoIlRoZSBvcHRpb24gcGRmanNuZXd3aW5kb3cganVzdCB3b3JrcyBpbiBhIGJyb3dzZXItZW52aXJvbm1lbnQuIik7Y2FzZSJkYXRhdXJsbmV3d2luZG93IjppZigiW29iamVjdCBXaW5kb3ddIiE9PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChyKSl0aHJvdyBuZXcgRXJyb3IoIlRoZSBvcHRpb24gZGF0YXVybG5ld3dpbmRvdyBqdXN0IHdvcmtzIGluIGEgYnJvd3Nlci1lbnZpcm9ubWVudC4iKTt2YXIgcD0nPGh0bWw+PHN0eWxlPmh0bWwsIGJvZHkgeyBwYWRkaW5nOiAwOyBtYXJnaW46IDA7IH0gaWZyYW1lIHsgd2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTsgYm9yZGVyOiAwO30gIDwvc3R5bGU+PGJvZHk+PGlmcmFtZSBzcmM9IicrdGhpcy5vdXRwdXQoImRhdGF1cmlzdHJpbmciLGUpKyciPjwvaWZyYW1lPjwvYm9keT48L2h0bWw+JyxnPXIub3BlbigpO2lmKG51bGwhPT1nJiYoZy5kb2N1bWVudC53cml0ZShwKSxnLmRvY3VtZW50LnRpdGxlPWUuZmlsZW5hbWUpLGd8fCJ1bmRlZmluZWQiPT10eXBlb2Ygc2FmYXJpKXJldHVybiBnO2JyZWFrO2Nhc2UiZGF0YXVyaSI6Y2FzZSJkYXRhdXJsIjpyZXR1cm4gci5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMub3V0cHV0KCJkYXRhdXJpc3RyaW5nIixlKTtkZWZhdWx0OnJldHVybiBudWxsfX0pKSxHZT1mdW5jdGlvbih0KXtyZXR1cm4hMD09PUFycmF5LmlzQXJyYXkoVXQpJiZVdC5pbmRleE9mKHQpPi0xfTtzd2l0Y2gobyl7Y2FzZSJwdCI6X3Q9MTticmVhaztjYXNlIm1tIjpfdD03Mi8yNS40O2JyZWFrO2Nhc2UiY20iOl90PTcyLzIuNTQ7YnJlYWs7Y2FzZSJpbiI6X3Q9NzI7YnJlYWs7Y2FzZSJweCI6X3Q9MT09R2UoInB4X3NjYWxpbmciKT8uNzU6OTYvNzI7YnJlYWs7Y2FzZSJwYyI6Y2FzZSJlbSI6X3Q9MTI7YnJlYWs7Y2FzZSJleCI6X3Q9NjticmVhaztkZWZhdWx0OmlmKCJudW1iZXIiIT10eXBlb2Ygbyl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgdW5pdDogIitvKTtfdD1vfXZhciBZZT1udWxsO0soKSxZKCk7dmFyIEplPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT09bT9ZZS5lbmNyeXB0b3IodCwwKTpmdW5jdGlvbih0KXtyZXR1cm4gdH19LFhlPXkuX19wcml2YXRlX18uZ2V0UGFnZUluZm89eS5nZXRQYWdlSW5mbz1mdW5jdGlvbih0KXtpZihpc05hTih0KXx8dCUxIT0wKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBhcmd1bWVudCBwYXNzZWQgdG8ganNQREYuZ2V0UGFnZUluZm8iKTtyZXR1cm57b2JqSWQ6UnRbdF0ub2JqSWQscGFnZU51bWJlcjp0LHBhZ2VDb250ZXh0OlJ0W3RdfX0sS2U9eS5fX3ByaXZhdGVfXy5nZXRQYWdlSW5mb0J5T2JqSWQ9ZnVuY3Rpb24odCl7aWYoaXNOYU4odCl8fHQlMSE9MCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgYXJndW1lbnQgcGFzc2VkIHRvIGpzUERGLmdldFBhZ2VJbmZvQnlPYmpJZCIpO2Zvcih2YXIgZSBpbiBSdClpZihSdFtlXS5vYmpJZD09PXQpYnJlYWs7cmV0dXJuIFhlKGUpfSxaZT15Ll9fcHJpdmF0ZV9fLmdldEN1cnJlbnRQYWdlSW5mbz15LmdldEN1cnJlbnRQYWdlSW5mbz1mdW5jdGlvbigpe3JldHVybntvYmpJZDpSdFskXS5vYmpJZCxwYWdlTnVtYmVyOiQscGFnZUNvbnRleHQ6UnRbJF19fTt5LmFkZFBhZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gT2UuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXN9LHkuc2V0UGFnZT1mdW5jdGlvbigpe3JldHVybiBNZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksbHQuY2FsbCh0aGlzLG90WyRdKSx0aGlzfSx5Lmluc2VydFBhZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuYWRkUGFnZSgpLHRoaXMubW92ZVBhZ2UoJCx0KSx0aGlzfSx5Lm1vdmVQYWdlPWZ1bmN0aW9uKHQsZSl7dmFyIHIsbjtpZih0PmUpe3I9b3RbdF0sbj1SdFt0XTtmb3IodmFyIGk9dDtpPmU7aS0tKW90W2ldPW90W2ktMV0sUnRbaV09UnRbaS0xXTtvdFtlXT1yLFJ0W2VdPW4sdGhpcy5zZXRQYWdlKGUpfWVsc2UgaWYodDxlKXtyPW90W3RdLG49UnRbdF07Zm9yKHZhciBhPXQ7YTxlO2ErKylvdFthXT1vdFthKzFdLFJ0W2FdPVJ0W2ErMV07b3RbZV09cixSdFtlXT1uLHRoaXMuc2V0UGFnZShlKX1yZXR1cm4gdGhpc30seS5kZWxldGVQYWdlPWZ1bmN0aW9uKCl7cmV0dXJuIEJlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzfSx5Ll9fcHJpdmF0ZV9fLnRleHQ9eS50ZXh0PWZ1bmN0aW9uKHQscixuLGksYSl7dmFyIG8scyxjLHUsbCxoLGYsZCxwLGc9KGk9aXx8e30pLnNjb3BlfHx0aGlzO2lmKCJudW1iZXIiPT10eXBlb2YgdCYmIm51bWJlciI9PXR5cGVvZiByJiYoInN0cmluZyI9PXR5cGVvZiBufHxBcnJheS5pc0FycmF5KG4pKSl7dmFyIG09bjtuPXIscj10LHQ9bX1pZihhcmd1bWVudHNbM11pbnN0YW5jZW9mIFZ0PT0hMT8oYz1hcmd1bWVudHNbNF0sdT1hcmd1bWVudHNbNV0sIm9iamVjdCI9PT1lKGY9YXJndW1lbnRzWzNdKSYmbnVsbCE9PWZ8fCgic3RyaW5nIj09dHlwZW9mIGMmJih1PWMsYz1udWxsKSwic3RyaW5nIj09dHlwZW9mIGYmJih1PWYsZj1udWxsKSwibnVtYmVyIj09dHlwZW9mIGYmJihjPWYsZj1udWxsKSxpPXtmbGFnczpmLGFuZ2xlOmMsYWxpZ246dX0pKToocSgiVGhlIHRyYW5zZm9ybSBwYXJhbWV0ZXIgb2YgdGV4dCgpIHdpdGggYSBNYXRyaXggdmFsdWUiKSxwPWEpLGlzTmFOKHIpfHxpc05hTihuKXx8bnVsbD09dCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgYXJndW1lbnRzIHBhc3NlZCB0byBqc1BERi50ZXh0Iik7aWYoMD09PXQubGVuZ3RoKXJldHVybiBnO3ZhciB2PSIiLHk9ITEsdz0ibnVtYmVyIj09dHlwZW9mIGkubGluZUhlaWdodEZhY3Rvcj9pLmxpbmVIZWlnaHRGYWN0b3I6aHIsTj1nLmludGVybmFsLnNjYWxlRmFjdG9yO2Z1bmN0aW9uIEwodCl7cmV0dXJuIHQ9dC5zcGxpdCgiXHQiKS5qb2luKEFycmF5KGkuVGFiTGVufHw5KS5qb2luKCIgIikpLENlKHQsZil9ZnVuY3Rpb24gQSh0KXtmb3IodmFyIGUscj10LmNvbmNhdCgpLG49W10saT1yLmxlbmd0aDtpLS07KSJzdHJpbmciPT10eXBlb2YoZT1yLnNoaWZ0KCkpP24ucHVzaChlKTpBcnJheS5pc0FycmF5KHQpJiYoMT09PWUubGVuZ3RofHx2b2lkIDA9PT1lWzFdJiZ2b2lkIDA9PT1lWzJdKT9uLnB1c2goZVswXSk6bi5wdXNoKFtlWzBdLGVbMV0sZVsyXV0pO3JldHVybiBufWZ1bmN0aW9uIF8odCxlKXt2YXIgcjtpZigic3RyaW5nIj09dHlwZW9mIHQpcj1lKHQpWzBdO2Vsc2UgaWYoQXJyYXkuaXNBcnJheSh0KSl7Zm9yKHZhciBuLGksYT10LmNvbmNhdCgpLG89W10scz1hLmxlbmd0aDtzLS07KSJzdHJpbmciPT10eXBlb2Yobj1hLnNoaWZ0KCkpP28ucHVzaChlKG4pWzBdKTpBcnJheS5pc0FycmF5KG4pJiYic3RyaW5nIj09dHlwZW9mIG5bMF0mJihpPWUoblswXSxuWzFdLG5bMl0pLG8ucHVzaChbaVswXSxpWzFdLGlbMl1dKSk7cj1vfXJldHVybiByfXZhciBQPSExLGs9ITA7aWYoInN0cmluZyI9PXR5cGVvZiB0KVA9ITA7ZWxzZSBpZihBcnJheS5pc0FycmF5KHQpKXt2YXIgRj10LmNvbmNhdCgpO3M9W107Zm9yKHZhciBJLEM9Ri5sZW5ndGg7Qy0tOykoInN0cmluZyIhPXR5cGVvZihJPUYuc2hpZnQoKSl8fEFycmF5LmlzQXJyYXkoSSkmJiJzdHJpbmciIT10eXBlb2YgSVswXSkmJihrPSExKTtQPWt9aWYoITE9PT1QKXRocm93IG5ldyBFcnJvcignVHlwZSBvZiB0ZXh0IG11c3QgYmUgc3RyaW5nIG9yIEFycmF5LiAiJyt0KyciIGlzIG5vdCByZWNvZ25pemVkLicpOyJzdHJpbmciPT10eXBlb2YgdCYmKHQ9dC5tYXRjaCgvW1xyP1xuXS8pP3Quc3BsaXQoL1xyXG58XHJ8XG4vZyk6W3RdKTt2YXIgaj1ndC9nLmludGVybmFsLnNjYWxlRmFjdG9yLE89aioody0xKTtzd2l0Y2goaS5iYXNlbGluZSl7Y2FzZSJib3R0b20iOm4tPU87YnJlYWs7Y2FzZSJ0b3AiOm4rPWotTzticmVhaztjYXNlImhhbmdpbmciOm4rPWotMipPO2JyZWFrO2Nhc2UibWlkZGxlIjpuKz1qLzItT31pZigoaD1pLm1heFdpZHRofHwwKT4wJiYoInN0cmluZyI9PXR5cGVvZiB0P3Q9Zy5zcGxpdFRleHRUb1NpemUodCxoKToiW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpJiYodD10LnJlZHVjZSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5jb25jYXQoZy5zcGxpdFRleHRUb1NpemUoZSxoKSl9KSxbXSkpKSxvPXt0ZXh0OnQseDpyLHk6bixvcHRpb25zOmksbXV0ZXg6e3BkZkVzY2FwZTpDZSxhY3RpdmVGb250S2V5OlN0LGZvbnRzOkl0LGFjdGl2ZUZvbnRTaXplOmd0fX0sVHQucHVibGlzaCgicHJlUHJvY2Vzc1RleHQiLG8pLHQ9by50ZXh0LGM9KGk9by5vcHRpb25zKS5hbmdsZSxwIGluc3RhbmNlb2YgVnQ9PSExJiZjJiYibnVtYmVyIj09dHlwZW9mIGMpe2MqPU1hdGguUEkvMTgwLDA9PT1pLnJvdGF0aW9uRGlyZWN0aW9uJiYoYz0tYyksUz09PXguQURWQU5DRUQmJihjPS1jKTt2YXIgQj1NYXRoLmNvcyhjKSxNPU1hdGguc2luKGMpO3A9bmV3IFZ0KEIsTSwtTSxCLDAsMCl9ZWxzZSBjJiZjIGluc3RhbmNlb2YgVnQmJihwPWMpO1MhPT14LkFEVkFOQ0VEfHxwfHwocD1ZdCksdm9pZCAwIT09KGw9aS5jaGFyU3BhY2V8fF9yKSYmKHYrPUUoVShsKSkrIiBUY1xuIix0aGlzLnNldENoYXJTcGFjZSh0aGlzLmdldENoYXJTcGFjZSgpfHwwKSksdm9pZCAwIT09KGQ9aS5ob3Jpem9udGFsU2NhbGUpJiYodis9RSgxMDAqZCkrIiBUelxuIik7aS5sYW5nO3ZhciBEPS0xLFI9dm9pZCAwIT09aS5yZW5kZXJpbmdNb2RlP2kucmVuZGVyaW5nTW9kZTppLnN0cm9rZSxUPWcuaW50ZXJuYWwuZ2V0Q3VycmVudFBhZ2VJbmZvKCkucGFnZUNvbnRleHQ7c3dpdGNoKFIpe2Nhc2UgMDpjYXNlITE6Y2FzZSJmaWxsIjpEPTA7YnJlYWs7Y2FzZSAxOmNhc2UhMDpjYXNlInN0cm9rZSI6RD0xO2JyZWFrO2Nhc2UgMjpjYXNlImZpbGxUaGVuU3Ryb2tlIjpEPTI7YnJlYWs7Y2FzZSAzOmNhc2UiaW52aXNpYmxlIjpEPTM7YnJlYWs7Y2FzZSA0OmNhc2UiZmlsbEFuZEFkZEZvckNsaXBwaW5nIjpEPTQ7YnJlYWs7Y2FzZSA1OmNhc2Uic3Ryb2tlQW5kQWRkUGF0aEZvckNsaXBwaW5nIjpEPTU7YnJlYWs7Y2FzZSA2OmNhc2UiZmlsbFRoZW5TdHJva2VBbmRBZGRUb1BhdGhGb3JDbGlwcGluZyI6RD02O2JyZWFrO2Nhc2UgNzpjYXNlImFkZFRvUGF0aEZvckNsaXBwaW5nIjpEPTd9dmFyIHo9dm9pZCAwIT09VC51c2VkUmVuZGVyaW5nTW9kZT9ULnVzZWRSZW5kZXJpbmdNb2RlOi0xOy0xIT09RD92Kz1EKyIgVHJcbiI6LTEhPT16JiYodis9IjAgVHJcbiIpLC0xIT09RCYmKFQudXNlZFJlbmRlcmluZ01vZGU9RCksdT1pLmFsaWdufHwibGVmdCI7dmFyIEgsVz1ndCp3LFY9Zy5pbnRlcm5hbC5wYWdlU2l6ZS5nZXRXaWR0aCgpLEc9SXRbU3RdO2w9aS5jaGFyU3BhY2V8fF9yLGg9aS5tYXhXaWR0aHx8MCxmPU9iamVjdC5hc3NpZ24oe2F1dG9lbmNvZGU6ITAsbm9CT006ITB9LGkuZmxhZ3MpO3ZhciBZPVtdO2lmKCJbb2JqZWN0IEFycmF5XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkpe3ZhciBKO3M9QSh0KSwibGVmdCIhPT11JiYoSD1zLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIGcuZ2V0U3RyaW5nVW5pdFdpZHRoKHQse2ZvbnQ6RyxjaGFyU3BhY2U6bCxmb250U2l6ZTpndCxkb0tlcm5pbmc6ITF9KSpndC9OfSkpKTt2YXIgWCxLPTA7aWYoInJpZ2h0Ij09PXUpe3ItPUhbMF0sdD1bXSxDPXMubGVuZ3RoO2Zvcih2YXIgWj0wO1o8QztaKyspMD09PVo/KFg9YnIociksSj15cihuKSk6KFg9VShLLUhbWl0pLEo9LVcpLHQucHVzaChbc1taXSxYLEpdKSxLPUhbWl19ZWxzZSBpZigiY2VudGVyIj09PXUpe3ItPUhbMF0vMix0PVtdLEM9cy5sZW5ndGg7Zm9yKHZhciAkPTA7JDxDOyQrKykwPT09JD8oWD1icihyKSxKPXlyKG4pKTooWD1VKChLLUhbJF0pLzIpLEo9LVcpLHQucHVzaChbc1skXSxYLEpdKSxLPUhbJF19ZWxzZSBpZigibGVmdCI9PT11KXt0PVtdLEM9cy5sZW5ndGg7Zm9yKHZhciBRPTA7UTxDO1ErKyl0LnB1c2goc1tRXSl9ZWxzZXtpZigianVzdGlmeSIhPT11KXRocm93IG5ldyBFcnJvcignVW5yZWNvZ25pemVkIGFsaWdubWVudCBvcHRpb24sIHVzZSAibGVmdCIsICJjZW50ZXIiLCAicmlnaHQiIG9yICJqdXN0aWZ5Ii4nKTt0PVtdLEM9cy5sZW5ndGgsaD0wIT09aD9oOlY7Zm9yKHZhciB0dD0wO3R0PEM7dHQrKylKPTA9PT10dD95cihuKTotVyxYPTA9PT10dD9icihyKTowLHR0PEMtMT9ZLnB1c2goRShVKChoLUhbdHRdKS8oc1t0dF0uc3BsaXQoIiAiKS5sZW5ndGgtMSkpKSk6WS5wdXNoKDApLHQucHVzaChbc1t0dF0sWCxKXSl9fXZhciBldD0iYm9vbGVhbiI9PXR5cGVvZiBpLlIyTD9pLlIyTDpidDshMD09PWV0JiYodD1fKHQsKGZ1bmN0aW9uKHQsZSxyKXtyZXR1cm5bdC5zcGxpdCgiIikucmV2ZXJzZSgpLmpvaW4oIiIpLGUscl19KSkpLG89e3RleHQ6dCx4OnIseTpuLG9wdGlvbnM6aSxtdXRleDp7cGRmRXNjYXBlOkNlLGFjdGl2ZUZvbnRLZXk6U3QsZm9udHM6SXQsYWN0aXZlRm9udFNpemU6Z3R9fSxUdC5wdWJsaXNoKCJwb3N0UHJvY2Vzc1RleHQiLG8pLHQ9by50ZXh0LHk9by5tdXRleC5pc0hleHx8ITE7dmFyIHJ0PUl0W1N0XS5lbmNvZGluZzsiV2luQW5zaUVuY29kaW5nIiE9PXJ0JiYiU3RhbmRhcmRFbmNvZGluZyIhPT1ydHx8KHQ9Xyh0LChmdW5jdGlvbih0LGUscil7cmV0dXJuW0wodCksZSxyXX0pKSkscz1BKHQpLHQ9W107Zm9yKHZhciBudCxpdCxhdCxvdD0wLHN0PTEsY3Q9QXJyYXkuaXNBcnJheShzWzBdKT9zdDpvdCx1dD0iIixsdD1mdW5jdGlvbih0LGUscil7dmFyIG49IiI7cmV0dXJuIHIgaW5zdGFuY2VvZiBWdD8ocj0ibnVtYmVyIj09dHlwZW9mIGkuYW5nbGU/R3QocixuZXcgVnQoMSwwLDAsMSx0LGUpKTpHdChuZXcgVnQoMSwwLDAsMSx0LGUpLHIpLFM9PT14LkFEVkFOQ0VEJiYocj1HdChuZXcgVnQoMSwwLDAsLTEsMCwwKSxyKSksbj1yLmpvaW4oIiAiKSsiIFRtXG4iKTpuPUUodCkrIiAiK0UoZSkrIiBUZFxuIixufSxmdD0wO2Z0PHMubGVuZ3RoO2Z0Kyspe3N3aXRjaCh1dD0iIixjdCl7Y2FzZSBzdDphdD0oeT8iPCI6IigiKStzW2Z0XVswXSsoeT8iPiI6IikiKSxudD1wYXJzZUZsb2F0KHNbZnRdWzFdKSxpdD1wYXJzZUZsb2F0KHNbZnRdWzJdKTticmVhaztjYXNlIG90OmF0PSh5PyI8IjoiKCIpK3NbZnRdKyh5PyI+IjoiKSIpLG50PWJyKHIpLGl0PXlyKG4pfXZvaWQgMCE9PVkmJnZvaWQgMCE9PVlbZnRdJiYodXQ9WVtmdF0rIiBUd1xuIiksMD09PWZ0P3QucHVzaCh1dCtsdChudCxpdCxwKSthdCk6Y3Q9PT1vdD90LnB1c2godXQrYXQpOmN0PT09c3QmJnQucHVzaCh1dCtsdChudCxpdCxwKSthdCl9dD1jdD09PW90P3Quam9pbigiIFRqXG5UKiAiKTp0LmpvaW4oIiBUalxuIiksdCs9IiBUalxuIjt2YXIgZHQ9IkJUXG4vIjtyZXR1cm4gZHQrPVN0KyIgIitndCsiIFRmXG4iLGR0Kz1FKGd0KncpKyIgVExcbiIsZHQrPXhyKyJcbiIsZHQrPXYsZHQrPXQsaHQoZHQrPSJFVCIpLGJbU3RdPSEwLGd9O3ZhciAkZT15Ll9fcHJpdmF0ZV9fLmNsaXA9eS5jbGlwPWZ1bmN0aW9uKHQpe3JldHVybiBodCgiZXZlbm9kZCI9PT10PyJXKiI6IlciKSx0aGlzfTt5LmNsaXBFdmVuT2RkPWZ1bmN0aW9uKCl7cmV0dXJuICRlKCJldmVub2RkIil9LHkuX19wcml2YXRlX18uZGlzY2FyZFBhdGg9eS5kaXNjYXJkUGF0aD1mdW5jdGlvbigpe3JldHVybiBodCgibiIpLHRoaXN9O3ZhciBRZT15Ll9fcHJpdmF0ZV9fLmlzVmFsaWRTdHlsZT1mdW5jdGlvbih0KXt2YXIgZT0hMTtyZXR1cm4tMSE9PVt2b2lkIDAsbnVsbCwiUyIsIkQiLCJGIiwiREYiLCJGRCIsImYiLCJmKiIsIkIiLCJCKiIsIm4iXS5pbmRleE9mKHQpJiYoZT0hMCksZX07eS5fX3ByaXZhdGVfXy5zZXREZWZhdWx0UGF0aE9wZXJhdGlvbj15LnNldERlZmF1bHRQYXRoT3BlcmF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiBRZSh0KSYmKGc9dCksdGhpc307dmFyIHRyPXkuX19wcml2YXRlX18uZ2V0U3R5bGU9eS5nZXRTdHlsZT1mdW5jdGlvbih0KXt2YXIgZT1nO3N3aXRjaCh0KXtjYXNlIkQiOmNhc2UiUyI6ZT0iUyI7YnJlYWs7Y2FzZSJGIjplPSJmIjticmVhaztjYXNlIkZEIjpjYXNlIkRGIjplPSJCIjticmVhaztjYXNlImYiOmNhc2UiZioiOmNhc2UiQiI6Y2FzZSJCKiI6ZT10fXJldHVybiBlfSxlcj15LmNsb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIGh0KCJoIiksdGhpc307eS5zdHJva2U9ZnVuY3Rpb24oKXtyZXR1cm4gaHQoIlMiKSx0aGlzfSx5LmZpbGw9ZnVuY3Rpb24odCl7cmV0dXJuIHJyKCJmIix0KSx0aGlzfSx5LmZpbGxFdmVuT2RkPWZ1bmN0aW9uKHQpe3JldHVybiBycigiZioiLHQpLHRoaXN9LHkuZmlsbFN0cm9rZT1mdW5jdGlvbih0KXtyZXR1cm4gcnIoIkIiLHQpLHRoaXN9LHkuZmlsbFN0cm9rZUV2ZW5PZGQ9ZnVuY3Rpb24odCl7cmV0dXJuIHJyKCJCKiIsdCksdGhpc307dmFyIHJyPWZ1bmN0aW9uKHQscil7Im9iamVjdCI9PT1lKHIpP2FyKHIsdCk6aHQodCl9LG5yPWZ1bmN0aW9uKHQpe251bGw9PT10fHxTPT09eC5BRFZBTkNFRCYmdm9pZCAwPT09dHx8KHQ9dHIodCksaHQodCkpfTtmdW5jdGlvbiBpcih0LGUscixuLGkpe3ZhciBhPW5ldyBCKGV8fHRoaXMuYm91bmRpbmdCb3gscnx8dGhpcy54U3RlcCxufHx0aGlzLnlTdGVwLHRoaXMuZ1N0YXRlLGl8fHRoaXMubWF0cml4KTthLnN0cmVhbT10aGlzLnN0cmVhbTt2YXIgbz10KyIkJCIrdGhpcy5jbG9uZUluZGV4KysrIiQkIjtyZXR1cm4gSnQobyxhKSxhfXZhciBhcj1mdW5jdGlvbih0LGUpe3ZhciByPUJ0W3Qua2V5XSxuPU90W3JdO2lmKG4gaW5zdGFuY2VvZiBPKWh0KCJxIiksaHQob3IoZSkpLG4uZ1N0YXRlJiZ5LnNldEdTdGF0ZShuLmdTdGF0ZSksaHQodC5tYXRyaXgudG9TdHJpbmcoKSsiIGNtIiksaHQoIi8iK3IrIiBzaCIpLGh0KCJRIik7ZWxzZSBpZihuIGluc3RhbmNlb2YgQil7dmFyIGk9bmV3IFZ0KDEsMCwwLC0xLDAsUnIoKSk7dC5tYXRyaXgmJihpPWkubXVsdGlwbHkodC5tYXRyaXh8fFl0KSxyPWlyLmNhbGwobix0LmtleSx0LmJvdW5kaW5nQm94LHQueFN0ZXAsdC55U3RlcCxpKS5pZCksaHQoInEiKSxodCgiL1BhdHRlcm4gY3MiKSxodCgiLyIrcisiIHNjbiIpLG4uZ1N0YXRlJiZ5LnNldEdTdGF0ZShuLmdTdGF0ZSksaHQoZSksaHQoIlEiKX19LG9yPWZ1bmN0aW9uKHQpe3N3aXRjaCh0KXtjYXNlImYiOmNhc2UiRiI6cmV0dXJuIlcgbiI7Y2FzZSJmKiI6cmV0dXJuIlcqIG4iO2Nhc2UiQiI6cmV0dXJuIlcgUyI7Y2FzZSJCKiI6cmV0dXJuIlcqIFMiO2Nhc2UiUyI6cmV0dXJuIlcgUyI7Y2FzZSJuIjpyZXR1cm4iVyBuIn19LHNyPXkubW92ZVRvPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGh0KEUoVSh0KSkrIiAiK0UoSChlKSkrIiBtIiksdGhpc30sY3I9eS5saW5lVG89ZnVuY3Rpb24odCxlKXtyZXR1cm4gaHQoRShVKHQpKSsiICIrRShIKGUpKSsiIGwiKSx0aGlzfSx1cj15LmN1cnZlVG89ZnVuY3Rpb24odCxlLHIsbixpLGEpe3JldHVybiBodChbRShVKHQpKSxFKEgoZSkpLEUoVShyKSksRShIKG4pKSxFKFUoaSkpLEUoSChhKSksImMiXS5qb2luKCIgIikpLHRoaXN9O3kuX19wcml2YXRlX18ubGluZT15LmxpbmU9ZnVuY3Rpb24odCxlLHIsbixpKXtpZihpc05hTih0KXx8aXNOYU4oZSl8fGlzTmFOKHIpfHxpc05hTihuKXx8IVFlKGkpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBhcmd1bWVudHMgcGFzc2VkIHRvIGpzUERGLmxpbmUiKTtyZXR1cm4gUz09PXguQ09NUEFUP3RoaXMubGluZXMoW1tyLXQsbi1lXV0sdCxlLFsxLDFdLGl8fCJTIik6dGhpcy5saW5lcyhbW3ItdCxuLWVdXSx0LGUsWzEsMV0pLnN0cm9rZSgpfSx5Ll9fcHJpdmF0ZV9fLmxpbmVzPXkubGluZXM9ZnVuY3Rpb24odCxlLHIsbixpLGEpe3ZhciBvLHMsYyx1LGwsaCxmLGQscCxnLG0sdjtpZigibnVtYmVyIj09dHlwZW9mIHQmJih2PXIscj1lLGU9dCx0PXYpLG49bnx8WzEsMV0sYT1hfHwhMSxpc05hTihlKXx8aXNOYU4ocil8fCFBcnJheS5pc0FycmF5KHQpfHwhQXJyYXkuaXNBcnJheShuKXx8IVFlKGkpfHwiYm9vbGVhbiIhPXR5cGVvZiBhKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBhcmd1bWVudHMgcGFzc2VkIHRvIGpzUERGLmxpbmVzIik7Zm9yKHNyKGUsciksbz1uWzBdLHM9blsxXSx1PXQubGVuZ3RoLGc9ZSxtPXIsYz0wO2M8dTtjKyspMj09PShsPXRbY10pLmxlbmd0aD8oZz1sWzBdKm8rZyxtPWxbMV0qcyttLGNyKGcsbSkpOihoPWxbMF0qbytnLGY9bFsxXSpzK20sZD1sWzJdKm8rZyxwPWxbM10qcyttLGc9bFs0XSpvK2csbT1sWzVdKnMrbSx1cihoLGYsZCxwLGcsbSkpO3JldHVybiBhJiZlcigpLG5yKGkpLHRoaXN9LHkucGF0aD1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHQubGVuZ3RoO2UrKyl7dmFyIHI9dFtlXSxuPXIuYztzd2l0Y2goci5vcCl7Y2FzZSJtIjpzcihuWzBdLG5bMV0pO2JyZWFrO2Nhc2UibCI6Y3IoblswXSxuWzFdKTticmVhaztjYXNlImMiOnVyLmFwcGx5KHRoaXMsbik7YnJlYWs7Y2FzZSJoIjplcigpfX1yZXR1cm4gdGhpc30seS5fX3ByaXZhdGVfXy5yZWN0PXkucmVjdD1mdW5jdGlvbih0LGUscixuLGkpe2lmKGlzTmFOKHQpfHxpc05hTihlKXx8aXNOYU4ocil8fGlzTmFOKG4pfHwhUWUoaSkpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGFyZ3VtZW50cyBwYXNzZWQgdG8ganNQREYucmVjdCIpO3JldHVybiBTPT09eC5DT01QQVQmJihuPS1uKSxodChbRShVKHQpKSxFKEgoZSkpLEUoVShyKSksRShVKG4pKSwicmUiXS5qb2luKCIgIikpLG5yKGkpLHRoaXN9LHkuX19wcml2YXRlX18udHJpYW5nbGU9eS50cmlhbmdsZT1mdW5jdGlvbih0LGUscixuLGksYSxvKXtpZihpc05hTih0KXx8aXNOYU4oZSl8fGlzTmFOKHIpfHxpc05hTihuKXx8aXNOYU4oaSl8fGlzTmFOKGEpfHwhUWUobykpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGFyZ3VtZW50cyBwYXNzZWQgdG8ganNQREYudHJpYW5nbGUiKTtyZXR1cm4gdGhpcy5saW5lcyhbW3ItdCxuLWVdLFtpLXIsYS1uXSxbdC1pLGUtYV1dLHQsZSxbMSwxXSxvLCEwKSx0aGlzfSx5Ll9fcHJpdmF0ZV9fLnJvdW5kZWRSZWN0PXkucm91bmRlZFJlY3Q9ZnVuY3Rpb24odCxlLHIsbixpLGEsbyl7aWYoaXNOYU4odCl8fGlzTmFOKGUpfHxpc05hTihyKXx8aXNOYU4obil8fGlzTmFOKGkpfHxpc05hTihhKXx8IVFlKG8pKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBhcmd1bWVudHMgcGFzc2VkIHRvIGpzUERGLnJvdW5kZWRSZWN0Iik7dmFyIHM9NC8zKihNYXRoLlNRUlQyLTEpO3JldHVybiBpPU1hdGgubWluKGksLjUqciksYT1NYXRoLm1pbihhLC41Km4pLHRoaXMubGluZXMoW1tyLTIqaSwwXSxbaSpzLDAsaSxhLWEqcyxpLGFdLFswLG4tMiphXSxbMCxhKnMsLWkqcyxhLC1pLGFdLFsyKmktciwwXSxbLWkqcywwLC1pLC1hKnMsLWksLWFdLFswLDIqYS1uXSxbMCwtYSpzLGkqcywtYSxpLC1hXV0sdCtpLGUsWzEsMV0sbywhMCksdGhpc30seS5fX3ByaXZhdGVfXy5lbGxpcHNlPXkuZWxsaXBzZT1mdW5jdGlvbih0LGUscixuLGkpe2lmKGlzTmFOKHQpfHxpc05hTihlKXx8aXNOYU4ocil8fGlzTmFOKG4pfHwhUWUoaSkpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGFyZ3VtZW50cyBwYXNzZWQgdG8ganNQREYuZWxsaXBzZSIpO3ZhciBhPTQvMyooTWF0aC5TUVJUMi0xKSpyLG89NC8zKihNYXRoLlNRUlQyLTEpKm47cmV0dXJuIHNyKHQrcixlKSx1cih0K3IsZS1vLHQrYSxlLW4sdCxlLW4pLHVyKHQtYSxlLW4sdC1yLGUtbyx0LXIsZSksdXIodC1yLGUrbyx0LWEsZStuLHQsZStuKSx1cih0K2EsZStuLHQrcixlK28sdCtyLGUpLG5yKGkpLHRoaXN9LHkuX19wcml2YXRlX18uY2lyY2xlPXkuY2lyY2xlPWZ1bmN0aW9uKHQsZSxyLG4pe2lmKGlzTmFOKHQpfHxpc05hTihlKXx8aXNOYU4ocil8fCFRZShuKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgYXJndW1lbnRzIHBhc3NlZCB0byBqc1BERi5jaXJjbGUiKTtyZXR1cm4gdGhpcy5lbGxpcHNlKHQsZSxyLHIsbil9LHkuc2V0Rm9udD1mdW5jdGlvbih0LGUscil7cmV0dXJuIHImJihlPWooZSxyKSksU3Q9cWUodCxlLHtkaXNhYmxlV2FybmluZzohMX0pLHRoaXN9O3ZhciBscj15Ll9fcHJpdmF0ZV9fLmdldEZvbnQ9eS5nZXRGb250PWZ1bmN0aW9uKCl7cmV0dXJuIEl0W3FlLmFwcGx5KHksYXJndW1lbnRzKV19O3kuX19wcml2YXRlX18uZ2V0Rm9udExpc3Q9eS5nZXRGb250TGlzdD1mdW5jdGlvbigpe3ZhciB0LGUscj17fTtmb3IodCBpbiBDdClpZihDdC5oYXNPd25Qcm9wZXJ0eSh0KSlmb3IoZSBpbiByW3RdPVtdLEN0W3RdKUN0W3RdLmhhc093blByb3BlcnR5KGUpJiZyW3RdLnB1c2goZSk7cmV0dXJuIHJ9LHkuYWRkRm9udD1mdW5jdGlvbih0LGUscixuLGkpe3ZhciBhPVsiU3RhbmRhcmRFbmNvZGluZyIsIk1hY1JvbWFuRW5jb2RpbmciLCJJZGVudGl0eS1IIiwiV2luQW5zaUVuY29kaW5nIl07cmV0dXJuIGFyZ3VtZW50c1szXSYmLTEhPT1hLmluZGV4T2YoYXJndW1lbnRzWzNdKT9pPWFyZ3VtZW50c1szXTphcmd1bWVudHNbM10mJi0xPT1hLmluZGV4T2YoYXJndW1lbnRzWzNdKSYmKHI9aihyLG4pKSxpPWl8fCJJZGVudGl0eS1IIixQZS5jYWxsKHRoaXMsdCxlLHIsaSl9O3ZhciBocixmcj10LmxpbmVXaWR0aHx8LjIwMDAyNSxkcj15Ll9fcHJpdmF0ZV9fLmdldExpbmVXaWR0aD15LmdldExpbmVXaWR0aD1mdW5jdGlvbigpe3JldHVybiBmcn0scHI9eS5fX3ByaXZhdGVfXy5zZXRMaW5lV2lkdGg9eS5zZXRMaW5lV2lkdGg9ZnVuY3Rpb24odCl7cmV0dXJuIGZyPXQsaHQoRShVKHQpKSsiIHciKSx0aGlzfTt5Ll9fcHJpdmF0ZV9fLnNldExpbmVEYXNoPU0uQVBJLnNldExpbmVEYXNoPU0uQVBJLnNldExpbmVEYXNoUGF0dGVybj1mdW5jdGlvbih0LGUpe2lmKHQ9dHx8W10sZT1lfHwwLGlzTmFOKGUpfHwhQXJyYXkuaXNBcnJheSh0KSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgYXJndW1lbnRzIHBhc3NlZCB0byBqc1BERi5zZXRMaW5lRGFzaCIpO3JldHVybiB0PXQubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gRShVKHQpKX0pKS5qb2luKCIgIiksZT1FKFUoZSkpLGh0KCJbIit0KyJdICIrZSsiIGQiKSx0aGlzfTt2YXIgZ3I9eS5fX3ByaXZhdGVfXy5nZXRMaW5lSGVpZ2h0PXkuZ2V0TGluZUhlaWdodD1mdW5jdGlvbigpe3JldHVybiBndCpocn07eS5fX3ByaXZhdGVfXy5nZXRMaW5lSGVpZ2h0PXkuZ2V0TGluZUhlaWdodD1mdW5jdGlvbigpe3JldHVybiBndCpocn07dmFyIG1yPXkuX19wcml2YXRlX18uc2V0TGluZUhlaWdodEZhY3Rvcj15LnNldExpbmVIZWlnaHRGYWN0b3I9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZih0PXR8fDEuMTUpJiYoaHI9dCksdGhpc30sdnI9eS5fX3ByaXZhdGVfXy5nZXRMaW5lSGVpZ2h0RmFjdG9yPXkuZ2V0TGluZUhlaWdodEZhY3Rvcj1mdW5jdGlvbigpe3JldHVybiBocn07bXIodC5saW5lSGVpZ2h0KTt2YXIgYnI9eS5fX3ByaXZhdGVfXy5nZXRIb3Jpem9udGFsQ29vcmRpbmF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gVSh0KX0seXI9eS5fX3ByaXZhdGVfXy5nZXRWZXJ0aWNhbENvb3JkaW5hdGU9ZnVuY3Rpb24odCl7cmV0dXJuIFM9PT14LkFEVkFOQ0VEP3Q6UnRbJF0ubWVkaWFCb3gudG9wUmlnaHRZLVJ0WyRdLm1lZGlhQm94LmJvdHRvbUxlZnRZLVUodCl9LHdyPXkuX19wcml2YXRlX18uZ2V0SG9yaXpvbnRhbENvb3JkaW5hdGVTdHJpbmc9eS5nZXRIb3Jpem9udGFsQ29vcmRpbmF0ZVN0cmluZz1mdW5jdGlvbih0KXtyZXR1cm4gRShicih0KSl9LE5yPXkuX19wcml2YXRlX18uZ2V0VmVydGljYWxDb29yZGluYXRlU3RyaW5nPXkuZ2V0VmVydGljYWxDb29yZGluYXRlU3RyaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBFKHlyKHQpKX0sTHI9dC5zdHJva2VDb2xvcnx8IjAgRyI7eS5fX3ByaXZhdGVfXy5nZXRTdHJva2VDb2xvcj15LmdldERyYXdDb2xvcj1mdW5jdGlvbigpe3JldHVybiBlZShMcil9LHkuX19wcml2YXRlX18uc2V0U3Ryb2tlQ29sb3I9eS5zZXREcmF3Q29sb3I9ZnVuY3Rpb24odCxlLHIsbil7cmV0dXJuIExyPXJlKHtjaDE6dCxjaDI6ZSxjaDM6cixjaDQ6bixwZGZDb2xvclR5cGU6ImRyYXciLHByZWNpc2lvbjoyfSksaHQoTHIpLHRoaXN9O3ZhciBBcj10LmZpbGxDb2xvcnx8IjAgZyI7eS5fX3ByaXZhdGVfXy5nZXRGaWxsQ29sb3I9eS5nZXRGaWxsQ29sb3I9ZnVuY3Rpb24oKXtyZXR1cm4gZWUoQXIpfSx5Ll9fcHJpdmF0ZV9fLnNldEZpbGxDb2xvcj15LnNldEZpbGxDb2xvcj1mdW5jdGlvbih0LGUscixuKXtyZXR1cm4gQXI9cmUoe2NoMTp0LGNoMjplLGNoMzpyLGNoNDpuLHBkZkNvbG9yVHlwZToiZmlsbCIscHJlY2lzaW9uOjJ9KSxodChBciksdGhpc307dmFyIHhyPXQudGV4dENvbG9yfHwiMCBnIixTcj15Ll9fcHJpdmF0ZV9fLmdldFRleHRDb2xvcj15LmdldFRleHRDb2xvcj1mdW5jdGlvbigpe3JldHVybiBlZSh4cil9O3kuX19wcml2YXRlX18uc2V0VGV4dENvbG9yPXkuc2V0VGV4dENvbG9yPWZ1bmN0aW9uKHQsZSxyLG4pe3JldHVybiB4cj1yZSh7Y2gxOnQsY2gyOmUsY2gzOnIsY2g0Om4scGRmQ29sb3JUeXBlOiJ0ZXh0IixwcmVjaXNpb246M30pLHRoaXN9O3ZhciBfcj10LmNoYXJTcGFjZSxQcj15Ll9fcHJpdmF0ZV9fLmdldENoYXJTcGFjZT15LmdldENoYXJTcGFjZT1mdW5jdGlvbigpe3JldHVybiBwYXJzZUZsb2F0KF9yfHwwKX07eS5fX3ByaXZhdGVfXy5zZXRDaGFyU3BhY2U9eS5zZXRDaGFyU3BhY2U9ZnVuY3Rpb24odCl7aWYoaXNOYU4odCkpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGFyZ3VtZW50IHBhc3NlZCB0byBqc1BERi5zZXRDaGFyU3BhY2UiKTtyZXR1cm4gX3I9dCx0aGlzfTt2YXIga3I9MDt5LkNhcEpvaW5TdHlsZXM9ezA6MCxidXR0OjAsYnV0OjAsbWl0ZXI6MCwxOjEscm91bmQ6MSxyb3VuZGVkOjEsY2lyY2xlOjEsMjoyLHByb2plY3Rpbmc6Mixwcm9qZWN0OjIsc3F1YXJlOjIsYmV2ZWw6Mn0seS5fX3ByaXZhdGVfXy5zZXRMaW5lQ2FwPXkuc2V0TGluZUNhcD1mdW5jdGlvbih0KXt2YXIgZT15LkNhcEpvaW5TdHlsZXNbdF07aWYodm9pZCAwPT09ZSl0aHJvdyBuZXcgRXJyb3IoIkxpbmUgY2FwIHN0eWxlIG9mICciK3QrIicgaXMgbm90IHJlY29nbml6ZWQuIFNlZSBvciBleHRlbmQgLkNhcEpvaW5TdHlsZXMgcHJvcGVydHkgZm9yIHZhbGlkIHN0eWxlcyIpO3JldHVybiBrcj1lLGh0KGUrIiBKIiksdGhpc307dmFyIEZyPTA7eS5fX3ByaXZhdGVfXy5zZXRMaW5lSm9pbj15LnNldExpbmVKb2luPWZ1bmN0aW9uKHQpe3ZhciBlPXkuQ2FwSm9pblN0eWxlc1t0XTtpZih2b2lkIDA9PT1lKXRocm93IG5ldyBFcnJvcigiTGluZSBqb2luIHN0eWxlIG9mICciK3QrIicgaXMgbm90IHJlY29nbml6ZWQuIFNlZSBvciBleHRlbmQgLkNhcEpvaW5TdHlsZXMgcHJvcGVydHkgZm9yIHZhbGlkIHN0eWxlcyIpO3JldHVybiBGcj1lLGh0KGUrIiBqIiksdGhpc30seS5fX3ByaXZhdGVfXy5zZXRMaW5lTWl0ZXJMaW1pdD15Ll9fcHJpdmF0ZV9fLnNldE1pdGVyTGltaXQ9eS5zZXRMaW5lTWl0ZXJMaW1pdD15LnNldE1pdGVyTGltaXQ9ZnVuY3Rpb24odCl7aWYodD10fHwwLGlzTmFOKHQpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBhcmd1bWVudCBwYXNzZWQgdG8ganNQREYuc2V0TGluZU1pdGVyTGltaXQiKTtyZXR1cm4gaHQoRShVKHQpKSsiIE0iKSx0aGlzfSx5LkdTdGF0ZT1DLHkuc2V0R1N0YXRlPWZ1bmN0aW9uKHQpeyh0PSJzdHJpbmciPT10eXBlb2YgdD9NdFtFdFt0XV06SXIobnVsbCx0KSkuZXF1YWxzKHF0KXx8KGh0KCIvIit0LmlkKyIgZ3MiKSxxdD10KX07dmFyIElyPWZ1bmN0aW9uKHQsZSl7aWYoIXR8fCFFdFt0XSl7dmFyIHI9ITE7Zm9yKHZhciBuIGluIE10KWlmKE10Lmhhc093blByb3BlcnR5KG4pJiZNdFtuXS5lcXVhbHMoZSkpe3I9ITA7YnJlYWt9aWYocillPU10W25dO2Vsc2V7dmFyIGk9IkdTIisoT2JqZWN0LmtleXMoTXQpLmxlbmd0aCsxKS50b1N0cmluZygxMCk7TXRbaV09ZSxlLmlkPWl9cmV0dXJuIHQmJihFdFt0XT1lLmlkKSxUdC5wdWJsaXNoKCJhZGRHU3RhdGUiLGUpLGV9fTt5LmFkZEdTdGF0ZT1mdW5jdGlvbih0LGUpe3JldHVybiBJcih0LGUpLHRoaXN9LHkuc2F2ZUdyYXBoaWNzU3RhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gaHQoInEiKSxqdC5wdXNoKHtrZXk6U3Qsc2l6ZTpndCxjb2xvcjp4cn0pLHRoaXN9LHkucmVzdG9yZUdyYXBoaWNzU3RhdGU9ZnVuY3Rpb24oKXtodCgiUSIpO3ZhciB0PWp0LnBvcCgpO3JldHVybiBTdD10LmtleSxndD10LnNpemUseHI9dC5jb2xvcixxdD1udWxsLHRoaXN9LHkuc2V0Q3VycmVudFRyYW5zZm9ybWF0aW9uTWF0cml4PWZ1bmN0aW9uKHQpe3JldHVybiBodCh0LnRvU3RyaW5nKCkrIiBjbSIpLHRoaXN9LHkuY29tbWVudD1mdW5jdGlvbih0KXtyZXR1cm4gaHQoIiMiK3QpLHRoaXN9O3ZhciBDcj1mdW5jdGlvbih0LGUpe3ZhciByPXR8fDA7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIngiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiByfSxzZXQ6ZnVuY3Rpb24odCl7aXNOYU4odCl8fChyPXBhcnNlRmxvYXQodCkpfX0pO3ZhciBuPWV8fDA7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInkiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBufSxzZXQ6ZnVuY3Rpb24odCl7aXNOYU4odCl8fChuPXBhcnNlRmxvYXQodCkpfX0pO3ZhciBpPSJwdCI7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJ0eXBlIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaX0sc2V0OmZ1bmN0aW9uKHQpe2k9dC50b1N0cmluZygpfX0pLHRoaXN9LGpyPWZ1bmN0aW9uKHQsZSxyLG4pe0NyLmNhbGwodGhpcyx0LGUpLHRoaXMudHlwZT0icmVjdCI7dmFyIGk9cnx8MDtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywidyIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGl9LHNldDpmdW5jdGlvbih0KXtpc05hTih0KXx8KGk9cGFyc2VGbG9hdCh0KSl9fSk7dmFyIGE9bnx8MDtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImgiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBhfSxzZXQ6ZnVuY3Rpb24odCl7aXNOYU4odCl8fChhPXBhcnNlRmxvYXQodCkpfX0pLHRoaXN9LE9yPWZ1bmN0aW9uKCl7dGhpcy5wYWdlPUR0LHRoaXMuY3VycmVudFBhZ2U9JCx0aGlzLnBhZ2VzPW90LnNsaWNlKDApLHRoaXMucGFnZXNDb250ZXh0PVJ0LnNsaWNlKDApLHRoaXMueD1QdCx0aGlzLnk9a3QsdGhpcy5tYXRyaXg9RnQsdGhpcy53aWR0aD1xcigkKSx0aGlzLmhlaWdodD1ScigkKSx0aGlzLm91dHB1dERlc3RpbmF0aW9uPWN0LHRoaXMuaWQ9IiIsdGhpcy5vYmplY3ROdW1iZXI9LTF9O09yLnByb3RvdHlwZS5yZXN0b3JlPWZ1bmN0aW9uKCl7RHQ9dGhpcy5wYWdlLCQ9dGhpcy5jdXJyZW50UGFnZSxSdD10aGlzLnBhZ2VzQ29udGV4dCxvdD10aGlzLnBhZ2VzLFB0PXRoaXMueCxrdD10aGlzLnksRnQ9dGhpcy5tYXRyaXgsRHIoJCx0aGlzLndpZHRoKSxUcigkLHRoaXMuaGVpZ2h0KSxjdD10aGlzLm91dHB1dERlc3RpbmF0aW9ufTt2YXIgQnI9ZnVuY3Rpb24odCxlLHIsbixpKXtXdC5wdXNoKG5ldyBPciksRHQ9JD0wLG90PVtdLFB0PXQsa3Q9ZSxGdD1pLGplKFtyLG5dKX0sTXI9ZnVuY3Rpb24odCl7aWYoSHRbdF0pV3QucG9wKCkucmVzdG9yZSgpO2Vsc2V7dmFyIGU9bmV3IE9yLHI9IlhvIisoT2JqZWN0LmtleXMoenQpLmxlbmd0aCsxKS50b1N0cmluZygxMCk7ZS5pZD1yLEh0W3RdPXIsenRbcl09ZSxUdC5wdWJsaXNoKCJhZGRGb3JtT2JqZWN0IixlKSxXdC5wb3AoKS5yZXN0b3JlKCl9fTtmb3IodmFyIEVyIGluIHkuYmVnaW5Gb3JtT2JqZWN0PWZ1bmN0aW9uKHQsZSxyLG4saSl7cmV0dXJuIEJyKHQsZSxyLG4saSksdGhpc30seS5lbmRGb3JtT2JqZWN0PWZ1bmN0aW9uKHQpe3JldHVybiBNcih0KSx0aGlzfSx5LmRvRm9ybU9iamVjdD1mdW5jdGlvbih0LGUpe3ZhciByPXp0W0h0W3RdXTtyZXR1cm4gaHQoInEiKSxodChlLnRvU3RyaW5nKCkrIiBjbSIpLGh0KCIvIityLmlkKyIgRG8iKSxodCgiUSIpLHRoaXN9LHkuZ2V0Rm9ybU9iamVjdD1mdW5jdGlvbih0KXt2YXIgZT16dFtIdFt0XV07cmV0dXJue3g6ZS54LHk6ZS55LHdpZHRoOmUud2lkdGgsaGVpZ2h0OmUuaGVpZ2h0LG1hdHJpeDplLm1hdHJpeH19LHkuc2F2ZT1mdW5jdGlvbih0LGUpe3JldHVybiB0PXR8fCJnZW5lcmF0ZWQucGRmIiwoZT1lfHx7fSkucmV0dXJuUHJvbWlzZT1lLnJldHVyblByb21pc2V8fCExLCExPT09ZS5yZXR1cm5Qcm9taXNlPyhsKFdlKEhlKCkpLHQpLCJmdW5jdGlvbiI9PXR5cGVvZiBsLnVubG9hZCYmci5zZXRUaW1lb3V0JiZzZXRUaW1lb3V0KGwudW5sb2FkLDkxMSksdGhpcyk6bmV3IFByb21pc2UoKGZ1bmN0aW9uKGUsbil7dHJ5e3ZhciBpPWwoV2UoSGUoKSksdCk7ImZ1bmN0aW9uIj09dHlwZW9mIGwudW5sb2FkJiZyLnNldFRpbWVvdXQmJnNldFRpbWVvdXQobC51bmxvYWQsOTExKSxlKGkpfWNhdGNoKHQpe24odC5tZXNzYWdlKX19KSl9LE0uQVBJKU0uQVBJLmhhc093blByb3BlcnR5KEVyKSYmKCJldmVudHMiPT09RXImJk0uQVBJLmV2ZW50cy5sZW5ndGg/ZnVuY3Rpb24odCxlKXt2YXIgcixuLGk7Zm9yKGk9ZS5sZW5ndGgtMTstMSE9PWk7aS0tKXI9ZVtpXVswXSxuPWVbaV1bMV0sdC5zdWJzY3JpYmUuYXBwbHkodCxbcl0uY29uY2F0KCJmdW5jdGlvbiI9PXR5cGVvZiBuP1tuXTpuKSl9KFR0LE0uQVBJLmV2ZW50cyk6eVtFcl09TS5BUElbRXJdKTt2YXIgcXI9eS5nZXRQYWdlV2lkdGg9ZnVuY3Rpb24odCl7cmV0dXJuKFJ0W3Q9dHx8JF0ubWVkaWFCb3gudG9wUmlnaHRYLVJ0W3RdLm1lZGlhQm94LmJvdHRvbUxlZnRYKS9fdH0sRHI9eS5zZXRQYWdlV2lkdGg9ZnVuY3Rpb24odCxlKXtSdFt0XS5tZWRpYUJveC50b3BSaWdodFg9ZSpfdCtSdFt0XS5tZWRpYUJveC5ib3R0b21MZWZ0WH0sUnI9eS5nZXRQYWdlSGVpZ2h0PWZ1bmN0aW9uKHQpe3JldHVybihSdFt0PXR8fCRdLm1lZGlhQm94LnRvcFJpZ2h0WS1SdFt0XS5tZWRpYUJveC5ib3R0b21MZWZ0WSkvX3R9LFRyPXkuc2V0UGFnZUhlaWdodD1mdW5jdGlvbih0LGUpe1J0W3RdLm1lZGlhQm94LnRvcFJpZ2h0WT1lKl90K1J0W3RdLm1lZGlhQm94LmJvdHRvbUxlZnRZfTtyZXR1cm4geS5pbnRlcm5hbD17cGRmRXNjYXBlOkNlLGdldFN0eWxlOnRyLGdldEZvbnQ6bHIsZ2V0Rm9udFNpemU6dnQsZ2V0Q2hhclNwYWNlOlByLGdldFRleHRDb2xvcjpTcixnZXRMaW5lSGVpZ2h0OmdyLGdldExpbmVIZWlnaHRGYWN0b3I6dnIsZ2V0TGluZVdpZHRoOmRyLHdyaXRlOmZ0LGdldEhvcml6b250YWxDb29yZGluYXRlOmJyLGdldFZlcnRpY2FsQ29vcmRpbmF0ZTp5cixnZXRDb29yZGluYXRlU3RyaW5nOndyLGdldFZlcnRpY2FsQ29vcmRpbmF0ZVN0cmluZzpOcixjb2xsZWN0aW9uczp7fSxuZXdPYmplY3Q6WHQsbmV3QWRkaXRpb25hbE9iamVjdDokdCxuZXdPYmplY3REZWZlcnJlZDpLdCxuZXdPYmplY3REZWZlcnJlZEJlZ2luOlp0LGdldEZpbHRlcnM6bmUscHV0U3RyZWFtOmllLGV2ZW50czpUdCxzY2FsZUZhY3RvcjpfdCxwYWdlU2l6ZTp7Z2V0V2lkdGg6ZnVuY3Rpb24oKXtyZXR1cm4gcXIoJCl9LHNldFdpZHRoOmZ1bmN0aW9uKHQpe0RyKCQsdCl9LGdldEhlaWdodDpmdW5jdGlvbigpe3JldHVybiBScigkKX0sc2V0SGVpZ2h0OmZ1bmN0aW9uKHQpe1RyKCQsdCl9fSxlbmNyeXB0aW9uT3B0aW9uczptLGVuY3J5cHRpb246WWUsZ2V0RW5jcnlwdG9yOkplLG91dHB1dDpWZSxnZXROdW1iZXJPZlBhZ2VzOkVlLHBhZ2VzOm90LG91dDpodCxmMjpSLGYzOlQsZ2V0UGFnZUluZm86WGUsZ2V0UGFnZUluZm9CeU9iaklkOktlLGdldEN1cnJlbnRQYWdlSW5mbzpaZSxnZXRQREZWZXJzaW9uOk4sUG9pbnQ6Q3IsUmVjdGFuZ2xlOmpyLE1hdHJpeDpWdCxoYXNIb3RmaXg6R2V9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh5LmludGVybmFsLnBhZ2VTaXplLCJ3aWR0aCIse2dldDpmdW5jdGlvbigpe3JldHVybiBxcigkKX0sc2V0OmZ1bmN0aW9uKHQpe0RyKCQsdCl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHkuaW50ZXJuYWwucGFnZVNpemUsImhlaWdodCIse2dldDpmdW5jdGlvbigpe3JldHVybiBScigkKX0sc2V0OmZ1bmN0aW9uKHQpe1RyKCQsdCl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksa2UuY2FsbCh5LHB0KSxTdD0iRjEiLE9lKHMsYSksVHQucHVibGlzaCgiaW5pdGlhbGl6ZWQiKSx5fWsucHJvdG90eXBlLmxzYkZpcnN0V29yZD1mdW5jdGlvbih0KXtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSh0Pj4wJjI1NSx0Pj44JjI1NSx0Pj4xNiYyNTUsdD4+MjQmMjU1KX0say5wcm90b3R5cGUudG9IZXhTdHJpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIHQuc3BsaXQoIiIpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuKCIwIisoMjU1JnQuY2hhckNvZGVBdCgwKSkudG9TdHJpbmcoMTYpKS5zbGljZSgtMil9KSkuam9pbigiIil9LGsucHJvdG90eXBlLmhleFRvQnl0ZXM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLHI9MDtyPHQubGVuZ3RoO3IrPTIpZS5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQodC5zdWJzdHIociwyKSwxNikpKTtyZXR1cm4gZS5qb2luKCIiKX0say5wcm90b3R5cGUucHJvY2Vzc093bmVyUGFzc3dvcmQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gXyhBKGUpLnN1YnN0cigwLDUpLHQpfSxrLnByb3RvdHlwZS5lbmNyeXB0b3I9ZnVuY3Rpb24odCxlKXt2YXIgcj1BKHRoaXMuZW5jcnlwdGlvbktleStTdHJpbmcuZnJvbUNoYXJDb2RlKDI1NSZ0LHQ+PjgmMjU1LHQ+PjE2JjI1NSwyNTUmZSxlPj44JjI1NSkpLnN1YnN0cigwLDEwKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIF8ocix0KX19LEMucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbih0KXt2YXIgcixuPSJpZCxvYmplY3ROdW1iZXIsZXF1YWxzIjtpZighdHx8ZSh0KSE9PWUodGhpcykpcmV0dXJuITE7dmFyIGk9MDtmb3IociBpbiB0aGlzKWlmKCEobi5pbmRleE9mKHIpPj0wKSl7aWYodGhpcy5oYXNPd25Qcm9wZXJ0eShyKSYmIXQuaGFzT3duUHJvcGVydHkocikpcmV0dXJuITE7aWYodGhpc1tyXSE9PXRbcl0pcmV0dXJuITE7aSsrfWZvcihyIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShyKSYmbi5pbmRleE9mKHIpPDAmJmktLTtyZXR1cm4gMD09PWl9LE0uQVBJPXtldmVudHM6W119LE0udmVyc2lvbj0iMi41LjEiO3ZhciBFPU0uQVBJLHE9MSxEPWZ1bmN0aW9uKHQpe3JldHVybiB0LnJlcGxhY2UoL1xcL2csIlxcXFwiKS5yZXBsYWNlKC9cKC9nLCJcXCgiKS5yZXBsYWNlKC9cKS9nLCJcXCkiKX0sUj1mdW5jdGlvbih0KXtyZXR1cm4gdC5yZXBsYWNlKC9cXFxcL2csIlxcIikucmVwbGFjZSgvXFxcKC9nLCIoIikucmVwbGFjZSgvXFxcKS9nLCIpIil9LFQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQudG9GaXhlZCgyKX0sVT1mdW5jdGlvbih0KXtyZXR1cm4gdC50b0ZpeGVkKDUpfTtFLl9fYWNyb2Zvcm1fXz17fTt2YXIgej1mdW5jdGlvbih0LGUpe3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZS5wcm90b3R5cGUpLHQucHJvdG90eXBlLmNvbnN0cnVjdG9yPXR9LEg9ZnVuY3Rpb24odCl7cmV0dXJuIHQqcX0sVz1mdW5jdGlvbih0KXt2YXIgZT1uZXcgY3Qscj1MdC5pbnRlcm5hbC5nZXRIZWlnaHQodCl8fDAsbj1MdC5pbnRlcm5hbC5nZXRXaWR0aCh0KXx8MDtyZXR1cm4gZS5CQm94PVswLDAsTnVtYmVyKFQobikpLE51bWJlcihUKHIpKV0sZX0sVj1FLl9fYWNyb2Zvcm1fXy5zZXRCaXQ9ZnVuY3Rpb24odCxlKXtpZih0PXR8fDAsZT1lfHwwLGlzTmFOKHQpfHxpc05hTihlKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgYXJndW1lbnRzIHBhc3NlZCB0byBqc1BERi5BUEkuX19hY3JvZm9ybV9fLnNldEJpdCIpO3JldHVybiB0fD0xPDxlfSxHPUUuX19hY3JvZm9ybV9fLmNsZWFyQml0PWZ1bmN0aW9uKHQsZSl7aWYodD10fHwwLGU9ZXx8MCxpc05hTih0KXx8aXNOYU4oZSkpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGFyZ3VtZW50cyBwYXNzZWQgdG8ganNQREYuQVBJLl9fYWNyb2Zvcm1fXy5jbGVhckJpdCIpO3JldHVybiB0Jj1+KDE8PGUpfSxZPUUuX19hY3JvZm9ybV9fLmdldEJpdD1mdW5jdGlvbih0LGUpe2lmKGlzTmFOKHQpfHxpc05hTihlKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgYXJndW1lbnRzIHBhc3NlZCB0byBqc1BERi5BUEkuX19hY3JvZm9ybV9fLmdldEJpdCIpO3JldHVybiAwPT0odCYxPDxlKT8wOjF9LEo9RS5fX2Fjcm9mb3JtX18uZ2V0Qml0Rm9yUGRmPWZ1bmN0aW9uKHQsZSl7aWYoaXNOYU4odCl8fGlzTmFOKGUpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBhcmd1bWVudHMgcGFzc2VkIHRvIGpzUERGLkFQSS5fX2Fjcm9mb3JtX18uZ2V0Qml0Rm9yUGRmIik7cmV0dXJuIFkodCxlLTEpfSxYPUUuX19hY3JvZm9ybV9fLnNldEJpdEZvclBkZj1mdW5jdGlvbih0LGUpe2lmKGlzTmFOKHQpfHxpc05hTihlKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgYXJndW1lbnRzIHBhc3NlZCB0byBqc1BERi5BUEkuX19hY3JvZm9ybV9fLnNldEJpdEZvclBkZiIpO3JldHVybiBWKHQsZS0xKX0sSz1FLl9fYWNyb2Zvcm1fXy5jbGVhckJpdEZvclBkZj1mdW5jdGlvbih0LGUpe2lmKGlzTmFOKHQpfHxpc05hTihlKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgYXJndW1lbnRzIHBhc3NlZCB0byBqc1BERi5BUEkuX19hY3JvZm9ybV9fLmNsZWFyQml0Rm9yUGRmIik7cmV0dXJuIEcodCxlLTEpfSxaPUUuX19hY3JvZm9ybV9fLmNhbGN1bGF0ZUNvb3JkaW5hdGVzPWZ1bmN0aW9uKHQsZSl7dmFyIHI9ZS5pbnRlcm5hbC5nZXRIb3Jpem9udGFsQ29vcmRpbmF0ZSxuPWUuaW50ZXJuYWwuZ2V0VmVydGljYWxDb29yZGluYXRlLGk9dFswXSxhPXRbMV0sbz10WzJdLHM9dFszXSxjPXt9O3JldHVybiBjLmxvd2VyTGVmdF9YPXIoaSl8fDAsYy5sb3dlckxlZnRfWT1uKGErcyl8fDAsYy51cHBlclJpZ2h0X1g9cihpK28pfHwwLGMudXBwZXJSaWdodF9ZPW4oYSl8fDAsW051bWJlcihUKGMubG93ZXJMZWZ0X1gpKSxOdW1iZXIoVChjLmxvd2VyTGVmdF9ZKSksTnVtYmVyKFQoYy51cHBlclJpZ2h0X1gpKSxOdW1iZXIoVChjLnVwcGVyUmlnaHRfWSkpXX0sJD1mdW5jdGlvbih0KXtpZih0LmFwcGVhcmFuY2VTdHJlYW1Db250ZW50KXJldHVybiB0LmFwcGVhcmFuY2VTdHJlYW1Db250ZW50O2lmKHQuVnx8dC5EVil7dmFyIGU9W10scj10Ll9WfHx0LkRWLG49USh0LHIpLGk9dC5zY29wZS5pbnRlcm5hbC5nZXRGb250KHQuZm9udE5hbWUsdC5mb250U3R5bGUpLmlkO2UucHVzaCgiL1R4IEJNQyIpLGUucHVzaCgicSIpLGUucHVzaCgiQlQiKSxlLnB1c2godC5zY29wZS5fX3ByaXZhdGVfXy5lbmNvZGVDb2xvclN0cmluZyh0LmNvbG9yKSksZS5wdXNoKCIvIitpKyIgIitUKG4uZm9udFNpemUpKyIgVGYiKSxlLnB1c2goIjEgMCAwIDEgMCAwIFRtIiksZS5wdXNoKG4udGV4dCksZS5wdXNoKCJFVCIpLGUucHVzaCgiUSIpLGUucHVzaCgiRU1DIik7dmFyIGE9Vyh0KTtyZXR1cm4gYS5zY29wZT10LnNjb3BlLGEuc3RyZWFtPWUuam9pbigiXG4iKSxhfX0sUT1mdW5jdGlvbih0LGUpe3ZhciByPTA9PT10LmZvbnRTaXplP3QubWF4Rm9udFNpemU6dC5mb250U2l6ZSxuPXt0ZXh0OiIiLGZvbnRTaXplOiIifSxpPShlPSIpIj09KGU9IigiPT1lLnN1YnN0cigwLDEpP2Uuc3Vic3RyKDEpOmUpLnN1YnN0cihlLmxlbmd0aC0xKT9lLnN1YnN0cigwLGUubGVuZ3RoLTEpOmUpLnNwbGl0KCIgIik7aT10Lm11bHRpbGluZT9pLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuc3BsaXQoIlxuIil9KSk6aS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVyblt0XX0pKTt2YXIgYT1yLG89THQuaW50ZXJuYWwuZ2V0SGVpZ2h0KHQpfHwwO289bzwwPy1vOm87dmFyIHM9THQuaW50ZXJuYWwuZ2V0V2lkdGgodCl8fDA7cz1zPDA/LXM6czt2YXIgYz1mdW5jdGlvbihlLHIsbil7aWYoZSsxPGkubGVuZ3RoKXt2YXIgYT1yKyIgIitpW2UrMV1bMF07cmV0dXJuIHR0KGEsdCxuKS53aWR0aDw9cy00fXJldHVybiExfTthKys7dDpmb3IoO2E+MDspe2U9IiIsYS0tO3ZhciB1LGwsaD10dCgiMyIsdCxhKS5oZWlnaHQsZj10Lm11bHRpbGluZT9vLWE6KG8taCkvMixkPWYrPTIscD0wLGc9MCxtPTA7aWYoYTw9MCl7ZT0iKC4uLikgVGpcbiIsZSs9IiUgV2lkdGggb2YgVGV4dDogIit0dChlLHQsYT0xMikud2lkdGgrIiwgRmllbGRXaWR0aDoiK3MrIlxuIjticmVha31mb3IodmFyIHY9IiIsYj0wLHk9MDt5PGkubGVuZ3RoO3krKylpZihpLmhhc093blByb3BlcnR5KHkpKXt2YXIgdz0hMTtpZigxIT09aVt5XS5sZW5ndGgmJm0hPT1pW3ldLmxlbmd0aC0xKXtpZigoaCsyKSooYisyKSsyPm8pY29udGludWUgdDt2Kz1pW3ldW21dLHc9ITAsZz15LHktLX1lbHNle3Y9IiAiPT0odis9aVt5XVttXSsiICIpLnN1YnN0cih2Lmxlbmd0aC0xKT92LnN1YnN0cigwLHYubGVuZ3RoLTEpOnY7dmFyIE49cGFyc2VJbnQoeSksTD1jKE4sdixhKSxBPXk+PWkubGVuZ3RoLTE7aWYoTCYmIUEpe3YrPSIgIixtPTA7Y29udGludWV9aWYoTHx8QSl7aWYoQSlnPU47ZWxzZSBpZih0Lm11bHRpbGluZSYmKGgrMikqKGIrMikrMj5vKWNvbnRpbnVlIHR9ZWxzZXtpZighdC5tdWx0aWxpbmUpY29udGludWUgdDtpZigoaCsyKSooYisyKSsyPm8pY29udGludWUgdDtnPU59fWZvcih2YXIgeD0iIixTPXA7Uzw9ZztTKyspe3ZhciBfPWlbU107aWYodC5tdWx0aWxpbmUpe2lmKFM9PT1nKXt4Kz1fW21dKyIgIixtPShtKzEpJV8ubGVuZ3RoO2NvbnRpbnVlfWlmKFM9PT1wKXt4Kz1fW18ubGVuZ3RoLTFdKyIgIjtjb250aW51ZX19eCs9X1swXSsiICJ9c3dpdGNoKHg9IiAiPT14LnN1YnN0cih4Lmxlbmd0aC0xKT94LnN1YnN0cigwLHgubGVuZ3RoLTEpOngsbD10dCh4LHQsYSkud2lkdGgsdC50ZXh0QWxpZ24pe2Nhc2UicmlnaHQiOnU9cy1sLTI7YnJlYWs7Y2FzZSJjZW50ZXIiOnU9KHMtbCkvMjticmVhaztjYXNlImxlZnQiOmRlZmF1bHQ6dT0yfWUrPVQodSkrIiAiK1QoZCkrIiBUZFxuIixlKz0iKCIrRCh4KSsiKSBUalxuIixlKz0tVCh1KSsiIDAgVGRcbiIsZD0tKGErMiksbD0wLHA9dz9nOmcrMSxiKyssdj0iIn1lbHNlO2JyZWFrfXJldHVybiBuLnRleHQ9ZSxuLmZvbnRTaXplPWEsbn0sdHQ9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPWUuc2NvcGUuaW50ZXJuYWwuZ2V0Rm9udChlLmZvbnROYW1lLGUuZm9udFN0eWxlKSxpPWUuc2NvcGUuZ2V0U3RyaW5nVW5pdFdpZHRoKHQse2ZvbnQ6bixmb250U2l6ZTpwYXJzZUZsb2F0KHIpLGNoYXJTcGFjZTowfSkqcGFyc2VGbG9hdChyKTtyZXR1cm57aGVpZ2h0OmUuc2NvcGUuZ2V0U3RyaW5nVW5pdFdpZHRoKCIzIix7Zm9udDpuLGZvbnRTaXplOnBhcnNlRmxvYXQociksY2hhclNwYWNlOjB9KSpwYXJzZUZsb2F0KHIpKjEuNSx3aWR0aDppfX0sZXQ9e2ZpZWxkczpbXSx4Rm9ybXM6W10sYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdDpudWxsLHByaW50ZWRPdXQ6ITEsaW50ZXJuYWw6bnVsbCxpc0luaXRpYWxpemVkOiExfSxydD1mdW5jdGlvbih0LGUpe3ZhciByPXt0eXBlOiJyZWZlcmVuY2UiLG9iamVjdDp0fTt2b2lkIDA9PT1lLmludGVybmFsLmdldFBhZ2VJbmZvKHQucGFnZSkucGFnZUNvbnRleHQuYW5ub3RhdGlvbnMuZmluZCgoZnVuY3Rpb24odCl7cmV0dXJuIHQudHlwZT09PXIudHlwZSYmdC5vYmplY3Q9PT1yLm9iamVjdH0pKSYmZS5pbnRlcm5hbC5nZXRQYWdlSW5mbyh0LnBhZ2UpLnBhZ2VDb250ZXh0LmFubm90YXRpb25zLnB1c2gocil9LG50PWZ1bmN0aW9uKHQscil7Zm9yKHZhciBuIGluIHQpaWYodC5oYXNPd25Qcm9wZXJ0eShuKSl7dmFyIGk9bixhPXRbbl07ci5pbnRlcm5hbC5uZXdPYmplY3REZWZlcnJlZEJlZ2luKGEub2JqSWQsITApLCJvYmplY3QiPT09ZShhKSYmImZ1bmN0aW9uIj09dHlwZW9mIGEucHV0U3RyZWFtJiZhLnB1dFN0cmVhbSgpLGRlbGV0ZSB0W2ldfX0saXQ9ZnVuY3Rpb24odCxyKXtpZihyLnNjb3BlPXQsdm9pZCAwIT09dC5pbnRlcm5hbCYmKHZvaWQgMD09PXQuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW58fCExPT09dC5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5pc0luaXRpYWxpemVkKSl7aWYobHQuRmllbGROdW09MCx0LmludGVybmFsLmFjcm9mb3JtUGx1Z2luPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZXQpKSx0LmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3QpdGhyb3cgbmV3IEVycm9yKCJFeGNlcHRpb24gd2hpbGUgY3JlYXRpbmcgQWNyb2Zvcm1EaWN0aW9uYXJ5Iik7cT10LmludGVybmFsLnNjYWxlRmFjdG9yLHQuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdD1uZXcgdXQsdC5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290LnNjb3BlPXQsdC5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290Ll9ldmVudElEPXQuaW50ZXJuYWwuZXZlbnRzLnN1YnNjcmliZSgicG9zdFB1dFJlc291cmNlcyIsKGZ1bmN0aW9uKCl7IWZ1bmN0aW9uKHQpe3QuaW50ZXJuYWwuZXZlbnRzLnVuc3Vic2NyaWJlKHQuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdC5fZXZlbnRJRCksZGVsZXRlIHQuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdC5fZXZlbnRJRCx0LmludGVybmFsLmFjcm9mb3JtUGx1Z2luLnByaW50ZWRPdXQ9ITB9KHQpfSkpLHQuaW50ZXJuYWwuZXZlbnRzLnN1YnNjcmliZSgiYnVpbGREb2N1bWVudCIsKGZ1bmN0aW9uKCl7IWZ1bmN0aW9uKHQpe3QuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdC5vYmpJZD12b2lkIDA7dmFyIGU9dC5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290LkZpZWxkcztmb3IodmFyIHIgaW4gZSlpZihlLmhhc093blByb3BlcnR5KHIpKXt2YXIgbj1lW3JdO24ub2JqSWQ9dm9pZCAwLG4uaGFzQW5ub3RhdGlvbiYmcnQobix0KX19KHQpfSkpLHQuaW50ZXJuYWwuZXZlbnRzLnN1YnNjcmliZSgicHV0Q2F0YWxvZyIsKGZ1bmN0aW9uKCl7IWZ1bmN0aW9uKHQpe2lmKHZvaWQgMD09PXQuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdCl0aHJvdyBuZXcgRXJyb3IoInB1dENhdGFsb2dDYWxsYmFjazogUm9vdCBtaXNzaW5nLiIpO3QuaW50ZXJuYWwud3JpdGUoIi9BY3JvRm9ybSAiK3QuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdC5vYmpJZCsiIDAgUiIpfSh0KX0pKSx0LmludGVybmFsLmV2ZW50cy5zdWJzY3JpYmUoInBvc3RQdXRQYWdlcyIsKGZ1bmN0aW9uKHIpeyFmdW5jdGlvbih0LHIpe3ZhciBuPSF0O2Zvcih2YXIgaSBpbiB0fHwoci5pbnRlcm5hbC5uZXdPYmplY3REZWZlcnJlZEJlZ2luKHIuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdC5vYmpJZCwhMCksci5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290LnB1dFN0cmVhbSgpKSx0PXR8fHIuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdC5LaWRzKWlmKHQuaGFzT3duUHJvcGVydHkoaSkpe3ZhciBhPXRbaV0sbz1bXSxzPWEuUmVjdDtpZihhLlJlY3QmJihhLlJlY3Q9WihhLlJlY3QscikpLHIuaW50ZXJuYWwubmV3T2JqZWN0RGVmZXJyZWRCZWdpbihhLm9iaklkLCEwKSxhLkRBPUx0LmNyZWF0ZURlZmF1bHRBcHBlYXJhbmNlU3RyZWFtKGEpLCJvYmplY3QiPT09ZShhKSYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0S2V5VmFsdWVMaXN0Rm9yU3RyZWFtJiYobz1hLmdldEtleVZhbHVlTGlzdEZvclN0cmVhbSgpKSxhLlJlY3Q9cyxhLmhhc0FwcGVhcmFuY2VTdHJlYW0mJiFhLmFwcGVhcmFuY2VTdHJlYW1Db250ZW50KXt2YXIgYz0kKGEpO28ucHVzaCh7a2V5OiJBUCIsdmFsdWU6Ijw8L04gIitjKyI+PiJ9KSxyLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLnhGb3Jtcy5wdXNoKGMpfWlmKGEuYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQpe3ZhciB1PSIiO2Zvcih2YXIgbCBpbiBhLmFwcGVhcmFuY2VTdHJlYW1Db250ZW50KWlmKGEuYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQuaGFzT3duUHJvcGVydHkobCkpe3ZhciBoPWEuYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnRbbF07aWYodSs9Ii8iK2wrIiAiLHUrPSI8PCIsT2JqZWN0LmtleXMoaCkubGVuZ3RoPj0xfHxBcnJheS5pc0FycmF5KGgpKXtmb3IodmFyIGkgaW4gaClpZihoLmhhc093blByb3BlcnR5KGkpKXt2YXIgZj1oW2ldOyJmdW5jdGlvbiI9PXR5cGVvZiBmJiYoZj1mLmNhbGwocixhKSksdSs9Ii8iK2krIiAiK2YrIiAiLHIuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4ueEZvcm1zLmluZGV4T2YoZik+PTB8fHIuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4ueEZvcm1zLnB1c2goZil9fWVsc2UiZnVuY3Rpb24iPT10eXBlb2YoZj1oKSYmKGY9Zi5jYWxsKHIsYSkpLHUrPSIvIitpKyIgIitmLHIuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4ueEZvcm1zLmluZGV4T2YoZik+PTB8fHIuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4ueEZvcm1zLnB1c2goZik7dSs9Ij4+In1vLnB1c2goe2tleToiQVAiLHZhbHVlOiI8PFxuIit1KyI+PiJ9KX1yLmludGVybmFsLnB1dFN0cmVhbSh7YWRkaXRpb25hbEtleVZhbHVlczpvLG9iamVjdElkOmEub2JqSWR9KSxyLmludGVybmFsLm91dCgiZW5kb2JqIil9biYmbnQoci5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi54Rm9ybXMscil9KHIsdCl9KSksdC5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5pc0luaXRpYWxpemVkPSEwfX0sYXQ9RS5fX2Fjcm9mb3JtX18uYXJyYXlUb1BkZkFycmF5PWZ1bmN0aW9uKHQscixuKXt2YXIgaT1mdW5jdGlvbih0KXtyZXR1cm4gdH07aWYoQXJyYXkuaXNBcnJheSh0KSl7Zm9yKHZhciBhPSJbIixvPTA7bzx0Lmxlbmd0aDtvKyspc3dpdGNoKDAhPT1vJiYoYSs9IiAiKSxlKHRbb10pKXtjYXNlImJvb2xlYW4iOmNhc2UibnVtYmVyIjpjYXNlIm9iamVjdCI6YSs9dFtvXS50b1N0cmluZygpO2JyZWFrO2Nhc2Uic3RyaW5nIjoiLyIhPT10W29dLnN1YnN0cigwLDEpPyh2b2lkIDAhPT1yJiZuJiYoaT1uLmludGVybmFsLmdldEVuY3J5cHRvcihyKSksYSs9IigiK0QoaSh0W29dLnRvU3RyaW5nKCkpKSsiKSIpOmErPXRbb10udG9TdHJpbmcoKX1yZXR1cm4gYSs9Il0ifXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBhcmd1bWVudCBwYXNzZWQgdG8ganNQREYuX19hY3JvZm9ybV9fLmFycmF5VG9QZGZBcnJheSIpfTt2YXIgb3Q9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPWZ1bmN0aW9uKHQpe3JldHVybiB0fTtyZXR1cm4gdm9pZCAwIT09ZSYmciYmKG49ci5pbnRlcm5hbC5nZXRFbmNyeXB0b3IoZSkpLCh0PXR8fCIiKS50b1N0cmluZygpLHQ9IigiK0Qobih0KSkrIikifSxzdD1mdW5jdGlvbigpe3RoaXMuX29iaklkPXZvaWQgMCx0aGlzLl9zY29wZT12b2lkIDAsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIm9iaklkIix7Z2V0OmZ1bmN0aW9uKCl7aWYodm9pZCAwPT09dGhpcy5fb2JqSWQpe2lmKHZvaWQgMD09PXRoaXMuc2NvcGUpcmV0dXJuO3RoaXMuX29iaklkPXRoaXMuc2NvcGUuaW50ZXJuYWwubmV3T2JqZWN0RGVmZXJyZWQoKX1yZXR1cm4gdGhpcy5fb2JqSWR9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9vYmpJZD10fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJzY29wZSIse3ZhbHVlOnRoaXMuX3Njb3BlLHdyaXRhYmxlOiEwfSl9O3N0LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9iaklkKyIgMCBSIn0sc3QucHJvdG90eXBlLnB1dFN0cmVhbT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0S2V5VmFsdWVMaXN0Rm9yU3RyZWFtKCk7dGhpcy5zY29wZS5pbnRlcm5hbC5wdXRTdHJlYW0oe2RhdGE6dGhpcy5zdHJlYW0sYWRkaXRpb25hbEtleVZhbHVlczp0LG9iamVjdElkOnRoaXMub2JqSWR9KSx0aGlzLnNjb3BlLmludGVybmFsLm91dCgiZW5kb2JqIil9LHN0LnByb3RvdHlwZS5nZXRLZXlWYWx1ZUxpc3RGb3JTdHJlYW09ZnVuY3Rpb24oKXt2YXIgdD1bXSxlPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuImNvbnRlbnQiIT10JiYiYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQiIT10JiYic2NvcGUiIT10JiYib2JqSWQiIT10JiYiXyIhPXQuc3Vic3RyaW5nKDAsMSl9KSk7Zm9yKHZhciByIGluIGUpaWYoITE9PT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRoaXMsZVtyXSkuY29uZmlndXJhYmxlKXt2YXIgbj1lW3JdLGk9dGhpc1tuXTtpJiYoQXJyYXkuaXNBcnJheShpKT90LnB1c2goe2tleTpuLHZhbHVlOmF0KGksdGhpcy5vYmpJZCx0aGlzLnNjb3BlKX0pOmkgaW5zdGFuY2VvZiBzdD8oaS5zY29wZT10aGlzLnNjb3BlLHQucHVzaCh7a2V5Om4sdmFsdWU6aS5vYmpJZCsiIDAgUiJ9KSk6ImZ1bmN0aW9uIiE9dHlwZW9mIGkmJnQucHVzaCh7a2V5Om4sdmFsdWU6aX0pKX1yZXR1cm4gdH07dmFyIGN0PWZ1bmN0aW9uKCl7c3QuY2FsbCh0aGlzKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiVHlwZSIse3ZhbHVlOiIvWE9iamVjdCIsY29uZmlndXJhYmxlOiExLHdyaXRhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIlN1YnR5cGUiLHt2YWx1ZToiL0Zvcm0iLGNvbmZpZ3VyYWJsZTohMSx3cml0YWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJGb3JtVHlwZSIse3ZhbHVlOjEsY29uZmlndXJhYmxlOiExLHdyaXRhYmxlOiEwfSk7dmFyIHQsZT1bXTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiQkJveCIse2NvbmZpZ3VyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZX0sc2V0OmZ1bmN0aW9uKHQpe2U9dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiUmVzb3VyY2VzIix7dmFsdWU6IjIgMCBSIixjb25maWd1cmFibGU6ITEsd3JpdGFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywic3RyZWFtIix7ZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITAsc2V0OmZ1bmN0aW9uKGUpe3Q9ZS50cmltKCl9LGdldDpmdW5jdGlvbigpe3JldHVybiB0fHxudWxsfX0pfTt6KGN0LHN0KTt2YXIgdXQ9ZnVuY3Rpb24oKXtzdC5jYWxsKHRoaXMpO3ZhciB0LGU9W107T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIktpZHMiLHtlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZS5sZW5ndGg+MD9lOnZvaWQgMH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiRmllbGRzIix7ZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITEsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIkRBIix7ZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITEsZ2V0OmZ1bmN0aW9uKCl7aWYodCl7dmFyIGU9ZnVuY3Rpb24odCl7cmV0dXJuIHR9O3JldHVybiB0aGlzLnNjb3BlJiYoZT10aGlzLnNjb3BlLmludGVybmFsLmdldEVuY3J5cHRvcih0aGlzLm9iaklkKSksIigiK0QoZSh0KSkrIikifX0sc2V0OmZ1bmN0aW9uKGUpe3Q9ZX19KX07eih1dCxzdCk7dmFyIGx0PWZ1bmN0aW9uIHQoKXtzdC5jYWxsKHRoaXMpO3ZhciBlPTQ7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIkYiLHtlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZX0sc2V0OmZ1bmN0aW9uKHQpe2lmKGlzTmFOKHQpKXRocm93IG5ldyBFcnJvcignSW52YWxpZCB2YWx1ZSAiJyt0KyciIGZvciBhdHRyaWJ1dGUgRiBzdXBwbGllZC4nKTtlPXR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInNob3dXaGVuUHJpbnRlZCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBCb29sZWFuKEooZSwzKSl9LHNldDpmdW5jdGlvbih0KXshMD09PUJvb2xlYW4odCk/dGhpcy5GPVgoZSwzKTp0aGlzLkY9SyhlLDMpfX0pO3ZhciByPTA7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIkZmIix7ZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITEsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHJ9LHNldDpmdW5jdGlvbih0KXtpZihpc05hTih0KSl0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdmFsdWUgIicrdCsnIiBmb3IgYXR0cmlidXRlIEZmIHN1cHBsaWVkLicpO3I9dH19KTt2YXIgbj1bXTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiUmVjdCIse2VudW1lcmFibGU6ITEsY29uZmlndXJhYmxlOiExLGdldDpmdW5jdGlvbigpe2lmKDAhPT1uLmxlbmd0aClyZXR1cm4gbn0sc2V0OmZ1bmN0aW9uKHQpe249dm9pZCAwIT09dD90OltdfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJ4Iix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIW58fGlzTmFOKG5bMF0pPzA6blswXX0sc2V0OmZ1bmN0aW9uKHQpe25bMF09dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywieSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiFufHxpc05hTihuWzFdKT8wOm5bMV19LHNldDpmdW5jdGlvbih0KXtuWzFdPXR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIndpZHRoIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIW58fGlzTmFOKG5bMl0pPzA6blsyXX0sc2V0OmZ1bmN0aW9uKHQpe25bMl09dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaGVpZ2h0Iix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIW58fGlzTmFOKG5bM10pPzA6blszXX0sc2V0OmZ1bmN0aW9uKHQpe25bM109dH19KTt2YXIgaT0iIjtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiRlQiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaX0sc2V0OmZ1bmN0aW9uKHQpe3N3aXRjaCh0KXtjYXNlIi9CdG4iOmNhc2UiL1R4IjpjYXNlIi9DaCI6Y2FzZSIvU2lnIjppPXQ7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdmFsdWUgIicrdCsnIiBmb3IgYXR0cmlidXRlIEZUIHN1cHBsaWVkLicpfX19KTt2YXIgYT1udWxsO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJUIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITEsZ2V0OmZ1bmN0aW9uKCl7aWYoIWF8fGEubGVuZ3RoPDEpe2lmKHRoaXMgaW5zdGFuY2VvZiBidClyZXR1cm47YT0iRmllbGRPYmplY3QiK3QuRmllbGROdW0rK312YXIgZT1mdW5jdGlvbih0KXtyZXR1cm4gdH07cmV0dXJuIHRoaXMuc2NvcGUmJihlPXRoaXMuc2NvcGUuaW50ZXJuYWwuZ2V0RW5jcnlwdG9yKHRoaXMub2JqSWQpKSwiKCIrRChlKGEpKSsiKSJ9LHNldDpmdW5jdGlvbih0KXthPXQudG9TdHJpbmcoKX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiZmllbGROYW1lIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGF9LHNldDpmdW5jdGlvbih0KXthPXR9fSk7dmFyIG89ImhlbHZldGljYSI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImZvbnROYW1lIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG99LHNldDpmdW5jdGlvbih0KXtvPXR9fSk7dmFyIHM9Im5vcm1hbCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImZvbnRTdHlsZSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBzfSxzZXQ6ZnVuY3Rpb24odCl7cz10fX0pO3ZhciBjPTA7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImZvbnRTaXplIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGN9LHNldDpmdW5jdGlvbih0KXtjPXR9fSk7dmFyIHU9dm9pZCAwO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJtYXhGb250U2l6ZSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB2b2lkIDA9PT11PzUwL3E6dX0sc2V0OmZ1bmN0aW9uKHQpe3U9dH19KTt2YXIgbD0iYmxhY2siO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJjb2xvciIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBsfSxzZXQ6ZnVuY3Rpb24odCl7bD10fX0pO3ZhciBoPSIvRjEgMCBUZiAwIGciO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJEQSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiExLGdldDpmdW5jdGlvbigpe2lmKCEoIWh8fHRoaXMgaW5zdGFuY2VvZiBidHx8dGhpcyBpbnN0YW5jZW9mIHd0KSlyZXR1cm4gb3QoaCx0aGlzLm9iaklkLHRoaXMuc2NvcGUpfSxzZXQ6ZnVuY3Rpb24odCl7dD10LnRvU3RyaW5nKCksaD10fX0pO3ZhciBmPW51bGw7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIkRWIix7ZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITEsZ2V0OmZ1bmN0aW9uKCl7aWYoZilyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIGd0PT0hMT9vdChmLHRoaXMub2JqSWQsdGhpcy5zY29wZSk6Zn0sc2V0OmZ1bmN0aW9uKHQpe3Q9dC50b1N0cmluZygpLGY9dGhpcyBpbnN0YW5jZW9mIGd0PT0hMT8iKCI9PT10LnN1YnN0cigwLDEpP1IodC5zdWJzdHIoMSx0Lmxlbmd0aC0yKSk6Uih0KTp0fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJkZWZhdWx0VmFsdWUiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIGd0PT0hMD9SKGYuc3Vic3RyKDEsZi5sZW5ndGgtMSkpOmZ9LHNldDpmdW5jdGlvbih0KXt0PXQudG9TdHJpbmcoKSxmPXRoaXMgaW5zdGFuY2VvZiBndD09ITA/Ii8iK3Q6dH19KTt2YXIgZD1udWxsO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJfViIse2VudW1lcmFibGU6ITEsY29uZmlndXJhYmxlOiExLGdldDpmdW5jdGlvbigpe2lmKGQpcmV0dXJuIGR9LHNldDpmdW5jdGlvbih0KXt0aGlzLlY9dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiViIse2VudW1lcmFibGU6ITEsY29uZmlndXJhYmxlOiExLGdldDpmdW5jdGlvbigpe2lmKGQpcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBndD09ITE/b3QoZCx0aGlzLm9iaklkLHRoaXMuc2NvcGUpOmR9LHNldDpmdW5jdGlvbih0KXt0PXQudG9TdHJpbmcoKSxkPXRoaXMgaW5zdGFuY2VvZiBndD09ITE/IigiPT09dC5zdWJzdHIoMCwxKT9SKHQuc3Vic3RyKDEsdC5sZW5ndGgtMikpOlIodCk6dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywidmFsdWUiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIGd0PT0hMD9SKGQuc3Vic3RyKDEsZC5sZW5ndGgtMSkpOmR9LHNldDpmdW5jdGlvbih0KXt0PXQudG9TdHJpbmcoKSxkPXRoaXMgaW5zdGFuY2VvZiBndD09ITA/Ii8iK3Q6dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaGFzQW5ub3RhdGlvbiIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlJlY3R9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIlR5cGUiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYXNBbm5vdGF0aW9uPyIvQW5ub3QiOm51bGx9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIlN1YnR5cGUiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYXNBbm5vdGF0aW9uPyIvV2lkZ2V0IjpudWxsfX0pO3ZhciBwLGc9ITE7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImhhc0FwcGVhcmFuY2VTdHJlYW0iLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZ30sc2V0OmZ1bmN0aW9uKHQpe3Q9Qm9vbGVhbih0KSxnPXR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInBhZ2UiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtpZihwKXJldHVybiBwfSxzZXQ6ZnVuY3Rpb24odCl7cD10fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJyZWFkT25seSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBCb29sZWFuKEoodGhpcy5GZiwxKSl9LHNldDpmdW5jdGlvbih0KXshMD09PUJvb2xlYW4odCk/dGhpcy5GZj1YKHRoaXMuRmYsMSk6dGhpcy5GZj1LKHRoaXMuRmYsMSl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInJlcXVpcmVkIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEJvb2xlYW4oSih0aGlzLkZmLDIpKX0sc2V0OmZ1bmN0aW9uKHQpeyEwPT09Qm9vbGVhbih0KT90aGlzLkZmPVgodGhpcy5GZiwyKTp0aGlzLkZmPUsodGhpcy5GZiwyKX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywibm9FeHBvcnQiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gQm9vbGVhbihKKHRoaXMuRmYsMykpfSxzZXQ6ZnVuY3Rpb24odCl7ITA9PT1Cb29sZWFuKHQpP3RoaXMuRmY9WCh0aGlzLkZmLDMpOnRoaXMuRmY9Syh0aGlzLkZmLDMpfX0pO3ZhciBtPW51bGw7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIlEiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXtpZihudWxsIT09bSlyZXR1cm4gbX0sc2V0OmZ1bmN0aW9uKHQpe2lmKC0xPT09WzAsMSwyXS5pbmRleE9mKHQpKXRocm93IG5ldyBFcnJvcignSW52YWxpZCB2YWx1ZSAiJyt0KyciIGZvciBhdHRyaWJ1dGUgUSBzdXBwbGllZC4nKTttPXR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInRleHRBbGlnbiIse2dldDpmdW5jdGlvbigpe3ZhciB0O3N3aXRjaChtKXtjYXNlIDA6ZGVmYXVsdDp0PSJsZWZ0IjticmVhaztjYXNlIDE6dD0iY2VudGVyIjticmVhaztjYXNlIDI6dD0icmlnaHQifXJldHVybiB0fSxjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxzZXQ6ZnVuY3Rpb24odCl7c3dpdGNoKHQpe2Nhc2UicmlnaHQiOmNhc2UgMjptPTI7YnJlYWs7Y2FzZSJjZW50ZXIiOmNhc2UgMTptPTE7YnJlYWs7Y2FzZSJsZWZ0IjpjYXNlIDA6ZGVmYXVsdDptPTB9fX0pfTt6KGx0LHN0KTt2YXIgaHQ9ZnVuY3Rpb24oKXtsdC5jYWxsKHRoaXMpLHRoaXMuRlQ9Ii9DaCIsdGhpcy5WPSIoKSIsdGhpcy5mb250TmFtZT0iemFwZmRpbmdiYXRzIjt2YXIgdD0wO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJUSSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiExLGdldDpmdW5jdGlvbigpe3JldHVybiB0fSxzZXQ6ZnVuY3Rpb24oZSl7dD1lfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJ0b3BJbmRleCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0fSxzZXQ6ZnVuY3Rpb24oZSl7dD1lfX0pO3ZhciBlPVtdO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJPcHQiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYXQoZSx0aGlzLm9iaklkLHRoaXMuc2NvcGUpfSxzZXQ6ZnVuY3Rpb24odCl7dmFyIHIsbjtuPVtdLCJzdHJpbmciPT10eXBlb2Yocj10KSYmKG49ZnVuY3Rpb24odCxlLHIpe3J8fChyPTEpO2Zvcih2YXIgbixpPVtdO249ZS5leGVjKHQpOylpLnB1c2gobltyXSk7cmV0dXJuIGl9KHIsL1woKC4qPylcKS9nKSksZT1ufX0pLHRoaXMuZ2V0T3B0aW9ucz1mdW5jdGlvbigpe3JldHVybiBlfSx0aGlzLnNldE9wdGlvbnM9ZnVuY3Rpb24odCl7ZT10LHRoaXMuc29ydCYmZS5zb3J0KCl9LHRoaXMuYWRkT3B0aW9uPWZ1bmN0aW9uKHQpe3Q9KHQ9dHx8IiIpLnRvU3RyaW5nKCksZS5wdXNoKHQpLHRoaXMuc29ydCYmZS5zb3J0KCl9LHRoaXMucmVtb3ZlT3B0aW9uPWZ1bmN0aW9uKHQscil7Zm9yKHI9cnx8ITEsdD0odD10fHwiIikudG9TdHJpbmcoKTstMSE9PWUuaW5kZXhPZih0KSYmKGUuc3BsaWNlKGUuaW5kZXhPZih0KSwxKSwhMSE9PXIpOyk7fSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiY29tYm8iLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gQm9vbGVhbihKKHRoaXMuRmYsMTgpKX0sc2V0OmZ1bmN0aW9uKHQpeyEwPT09Qm9vbGVhbih0KT90aGlzLkZmPVgodGhpcy5GZiwxOCk6dGhpcy5GZj1LKHRoaXMuRmYsMTgpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJlZGl0Iix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEJvb2xlYW4oSih0aGlzLkZmLDE5KSl9LHNldDpmdW5jdGlvbih0KXshMD09PXRoaXMuY29tYm8mJighMD09PUJvb2xlYW4odCk/dGhpcy5GZj1YKHRoaXMuRmYsMTkpOnRoaXMuRmY9Syh0aGlzLkZmLDE5KSl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInNvcnQiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gQm9vbGVhbihKKHRoaXMuRmYsMjApKX0sc2V0OmZ1bmN0aW9uKHQpeyEwPT09Qm9vbGVhbih0KT8odGhpcy5GZj1YKHRoaXMuRmYsMjApLGUuc29ydCgpKTp0aGlzLkZmPUsodGhpcy5GZiwyMCl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIm11bHRpU2VsZWN0Iix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEJvb2xlYW4oSih0aGlzLkZmLDIyKSl9LHNldDpmdW5jdGlvbih0KXshMD09PUJvb2xlYW4odCk/dGhpcy5GZj1YKHRoaXMuRmYsMjIpOnRoaXMuRmY9Syh0aGlzLkZmLDIyKX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiZG9Ob3RTcGVsbENoZWNrIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEJvb2xlYW4oSih0aGlzLkZmLDIzKSl9LHNldDpmdW5jdGlvbih0KXshMD09PUJvb2xlYW4odCk/dGhpcy5GZj1YKHRoaXMuRmYsMjMpOnRoaXMuRmY9Syh0aGlzLkZmLDIzKX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiY29tbWl0T25TZWxDaGFuZ2UiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gQm9vbGVhbihKKHRoaXMuRmYsMjcpKX0sc2V0OmZ1bmN0aW9uKHQpeyEwPT09Qm9vbGVhbih0KT90aGlzLkZmPVgodGhpcy5GZiwyNyk6dGhpcy5GZj1LKHRoaXMuRmYsMjcpfX0pLHRoaXMuaGFzQXBwZWFyYW5jZVN0cmVhbT0hMX07eihodCxsdCk7dmFyIGZ0PWZ1bmN0aW9uKCl7aHQuY2FsbCh0aGlzKSx0aGlzLmZvbnROYW1lPSJoZWx2ZXRpY2EiLHRoaXMuY29tYm89ITF9O3ooZnQsaHQpO3ZhciBkdD1mdW5jdGlvbigpe2Z0LmNhbGwodGhpcyksdGhpcy5jb21ibz0hMH07eihkdCxmdCk7dmFyIHB0PWZ1bmN0aW9uKCl7ZHQuY2FsbCh0aGlzKSx0aGlzLmVkaXQ9ITB9O3oocHQsZHQpO3ZhciBndD1mdW5jdGlvbigpe2x0LmNhbGwodGhpcyksdGhpcy5GVD0iL0J0biIsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIm5vVG9nZ2xlVG9PZmYiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gQm9vbGVhbihKKHRoaXMuRmYsMTUpKX0sc2V0OmZ1bmN0aW9uKHQpeyEwPT09Qm9vbGVhbih0KT90aGlzLkZmPVgodGhpcy5GZiwxNSk6dGhpcy5GZj1LKHRoaXMuRmYsMTUpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJyYWRpbyIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBCb29sZWFuKEoodGhpcy5GZiwxNikpfSxzZXQ6ZnVuY3Rpb24odCl7ITA9PT1Cb29sZWFuKHQpP3RoaXMuRmY9WCh0aGlzLkZmLDE2KTp0aGlzLkZmPUsodGhpcy5GZiwxNil9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInB1c2hCdXR0b24iLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gQm9vbGVhbihKKHRoaXMuRmYsMTcpKX0sc2V0OmZ1bmN0aW9uKHQpeyEwPT09Qm9vbGVhbih0KT90aGlzLkZmPVgodGhpcy5GZiwxNyk6dGhpcy5GZj1LKHRoaXMuRmYsMTcpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJyYWRpb0lzVW5pc29uIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEJvb2xlYW4oSih0aGlzLkZmLDI2KSl9LHNldDpmdW5jdGlvbih0KXshMD09PUJvb2xlYW4odCk/dGhpcy5GZj1YKHRoaXMuRmYsMjYpOnRoaXMuRmY9Syh0aGlzLkZmLDI2KX19KTt2YXIgdCxyPXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJNSyIse2VudW1lcmFibGU6ITEsY29uZmlndXJhYmxlOiExLGdldDpmdW5jdGlvbigpe3ZhciB0PWZ1bmN0aW9uKHQpe3JldHVybiB0fTtpZih0aGlzLnNjb3BlJiYodD10aGlzLnNjb3BlLmludGVybmFsLmdldEVuY3J5cHRvcih0aGlzLm9iaklkKSksMCE9PU9iamVjdC5rZXlzKHIpLmxlbmd0aCl7dmFyIGUsbj1bXTtmb3IoZSBpbiBuLnB1c2goIjw8IiksciluLnB1c2goIi8iK2UrIiAoIitEKHQocltlXSkpKyIpIik7cmV0dXJuIG4ucHVzaCgiPj4iKSxuLmpvaW4oIlxuIil9fSxzZXQ6ZnVuY3Rpb24odCl7Im9iamVjdCI9PT1lKHQpJiYocj10KX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiY2FwdGlvbiIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiByLkNBfHwiIn0sc2V0OmZ1bmN0aW9uKHQpeyJzdHJpbmciPT10eXBlb2YgdCYmKHIuQ0E9dCl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIkFTIix7ZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITEsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHR9LHNldDpmdW5jdGlvbihlKXt0PWV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImFwcGVhcmFuY2VTdGF0ZSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0LnN1YnN0cigxLHQubGVuZ3RoLTEpfSxzZXQ6ZnVuY3Rpb24oZSl7dD0iLyIrZX19KX07eihndCxsdCk7dmFyIG10PWZ1bmN0aW9uKCl7Z3QuY2FsbCh0aGlzKSx0aGlzLnB1c2hCdXR0b249ITB9O3oobXQsZ3QpO3ZhciB2dD1mdW5jdGlvbigpe2d0LmNhbGwodGhpcyksdGhpcy5yYWRpbz0hMCx0aGlzLnB1c2hCdXR0b249ITE7dmFyIHQ9W107T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIktpZHMiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdH0sc2V0OmZ1bmN0aW9uKGUpe3Q9dm9pZCAwIT09ZT9lOltdfX0pfTt6KHZ0LGd0KTt2YXIgYnQ9ZnVuY3Rpb24oKXt2YXIgdCxyO2x0LmNhbGwodGhpcyksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIlBhcmVudCIse2VudW1lcmFibGU6ITEsY29uZmlndXJhYmxlOiExLGdldDpmdW5jdGlvbigpe3JldHVybiB0fSxzZXQ6ZnVuY3Rpb24oZSl7dD1lfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJvcHRpb25OYW1lIix7ZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHJ9LHNldDpmdW5jdGlvbih0KXtyPXR9fSk7dmFyIG4saT17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiTUsiLHtlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXt2YXIgdD1mdW5jdGlvbih0KXtyZXR1cm4gdH07dGhpcy5zY29wZSYmKHQ9dGhpcy5zY29wZS5pbnRlcm5hbC5nZXRFbmNyeXB0b3IodGhpcy5vYmpJZCkpO3ZhciBlLHI9W107Zm9yKGUgaW4gci5wdXNoKCI8PCIpLGkpci5wdXNoKCIvIitlKyIgKCIrRCh0KGlbZV0pKSsiKSIpO3JldHVybiByLnB1c2goIj4+Iiksci5qb2luKCJcbiIpfSxzZXQ6ZnVuY3Rpb24odCl7Im9iamVjdCI9PT1lKHQpJiYoaT10KX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiY2FwdGlvbiIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBpLkNBfHwiIn0sc2V0OmZ1bmN0aW9uKHQpeyJzdHJpbmciPT10eXBlb2YgdCYmKGkuQ0E9dCl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIkFTIix7ZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITEsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG59LHNldDpmdW5jdGlvbih0KXtuPXR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImFwcGVhcmFuY2VTdGF0ZSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBuLnN1YnN0cigxLG4ubGVuZ3RoLTEpfSxzZXQ6ZnVuY3Rpb24odCl7bj0iLyIrdH19KSx0aGlzLmNhcHRpb249ImwiLHRoaXMuYXBwZWFyYW5jZVN0YXRlPSJPZmYiLHRoaXMuX0FwcGVhcmFuY2VUeXBlPUx0LlJhZGlvQnV0dG9uLkNpcmNsZSx0aGlzLmFwcGVhcmFuY2VTdHJlYW1Db250ZW50PXRoaXMuX0FwcGVhcmFuY2VUeXBlLmNyZWF0ZUFwcGVhcmFuY2VTdHJlYW0odGhpcy5vcHRpb25OYW1lKX07eihidCxsdCksdnQucHJvdG90eXBlLnNldEFwcGVhcmFuY2U9ZnVuY3Rpb24odCl7aWYoISgiY3JlYXRlQXBwZWFyYW5jZVN0cmVhbSJpbiB0KXx8ISgiZ2V0Q0EiaW4gdCkpdGhyb3cgbmV3IEVycm9yKCJDb3VsZG4ndCBhc3NpZ24gQXBwZWFyYW5jZSB0byBSYWRpb0J1dHRvbi4gQXBwZWFyYW5jZSB3YXMgSW52YWxpZCEiKTtmb3IodmFyIGUgaW4gdGhpcy5LaWRzKWlmKHRoaXMuS2lkcy5oYXNPd25Qcm9wZXJ0eShlKSl7dmFyIHI9dGhpcy5LaWRzW2VdO3IuYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQ9dC5jcmVhdGVBcHBlYXJhbmNlU3RyZWFtKHIub3B0aW9uTmFtZSksci5jYXB0aW9uPXQuZ2V0Q0EoKX19LHZ0LnByb3RvdHlwZS5jcmVhdGVPcHRpb249ZnVuY3Rpb24odCl7dmFyIGU9bmV3IGJ0O3JldHVybiBlLlBhcmVudD10aGlzLGUub3B0aW9uTmFtZT10LHRoaXMuS2lkcy5wdXNoKGUpLEF0LmNhbGwodGhpcy5zY29wZSxlKSxlfTt2YXIgeXQ9ZnVuY3Rpb24oKXtndC5jYWxsKHRoaXMpLHRoaXMuZm9udE5hbWU9InphcGZkaW5nYmF0cyIsdGhpcy5jYXB0aW9uPSIzIix0aGlzLmFwcGVhcmFuY2VTdGF0ZT0iT24iLHRoaXMudmFsdWU9Ik9uIix0aGlzLnRleHRBbGlnbj0iY2VudGVyIix0aGlzLmFwcGVhcmFuY2VTdHJlYW1Db250ZW50PUx0LkNoZWNrQm94LmNyZWF0ZUFwcGVhcmFuY2VTdHJlYW0oKX07eih5dCxndCk7dmFyIHd0PWZ1bmN0aW9uKCl7bHQuY2FsbCh0aGlzKSx0aGlzLkZUPSIvVHgiLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJtdWx0aWxpbmUiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gQm9vbGVhbihKKHRoaXMuRmYsMTMpKX0sc2V0OmZ1bmN0aW9uKHQpeyEwPT09Qm9vbGVhbih0KT90aGlzLkZmPVgodGhpcy5GZiwxMyk6dGhpcy5GZj1LKHRoaXMuRmYsMTMpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJmaWxlU2VsZWN0Iix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEJvb2xlYW4oSih0aGlzLkZmLDIxKSl9LHNldDpmdW5jdGlvbih0KXshMD09PUJvb2xlYW4odCk/dGhpcy5GZj1YKHRoaXMuRmYsMjEpOnRoaXMuRmY9Syh0aGlzLkZmLDIxKX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiZG9Ob3RTcGVsbENoZWNrIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEJvb2xlYW4oSih0aGlzLkZmLDIzKSl9LHNldDpmdW5jdGlvbih0KXshMD09PUJvb2xlYW4odCk/dGhpcy5GZj1YKHRoaXMuRmYsMjMpOnRoaXMuRmY9Syh0aGlzLkZmLDIzKX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiZG9Ob3RTY3JvbGwiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gQm9vbGVhbihKKHRoaXMuRmYsMjQpKX0sc2V0OmZ1bmN0aW9uKHQpeyEwPT09Qm9vbGVhbih0KT90aGlzLkZmPVgodGhpcy5GZiwyNCk6dGhpcy5GZj1LKHRoaXMuRmYsMjQpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJjb21iIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEJvb2xlYW4oSih0aGlzLkZmLDI1KSl9LHNldDpmdW5jdGlvbih0KXshMD09PUJvb2xlYW4odCk/dGhpcy5GZj1YKHRoaXMuRmYsMjUpOnRoaXMuRmY9Syh0aGlzLkZmLDI1KX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywicmljaFRleHQiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gQm9vbGVhbihKKHRoaXMuRmYsMjYpKX0sc2V0OmZ1bmN0aW9uKHQpeyEwPT09Qm9vbGVhbih0KT90aGlzLkZmPVgodGhpcy5GZiwyNik6dGhpcy5GZj1LKHRoaXMuRmYsMjYpfX0pO3ZhciB0PW51bGw7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIk1heExlbiIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiExLGdldDpmdW5jdGlvbigpe3JldHVybiB0fSxzZXQ6ZnVuY3Rpb24oZSl7dD1lfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJtYXhMZW5ndGgiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdH0sc2V0OmZ1bmN0aW9uKGUpe051bWJlci5pc0ludGVnZXIoZSkmJih0PWUpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJoYXNBcHBlYXJhbmNlU3RyZWFtIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVnx8dGhpcy5EVn19KX07eih3dCxsdCk7dmFyIE50PWZ1bmN0aW9uKCl7d3QuY2FsbCh0aGlzKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywicGFzc3dvcmQiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gQm9vbGVhbihKKHRoaXMuRmYsMTQpKX0sc2V0OmZ1bmN0aW9uKHQpeyEwPT09Qm9vbGVhbih0KT90aGlzLkZmPVgodGhpcy5GZiwxNCk6dGhpcy5GZj1LKHRoaXMuRmYsMTQpfX0pLHRoaXMucGFzc3dvcmQ9ITB9O3ooTnQsd3QpO3ZhciBMdD17Q2hlY2tCb3g6e2NyZWF0ZUFwcGVhcmFuY2VTdHJlYW06ZnVuY3Rpb24oKXtyZXR1cm57Tjp7T246THQuQ2hlY2tCb3guWWVzTm9ybWFsfSxEOntPbjpMdC5DaGVja0JveC5ZZXNQdXNoRG93bixPZmY6THQuQ2hlY2tCb3guT2ZmUHVzaERvd259fX0sWWVzUHVzaERvd246ZnVuY3Rpb24odCl7dmFyIGU9Vyh0KTtlLnNjb3BlPXQuc2NvcGU7dmFyIHI9W10sbj10LnNjb3BlLmludGVybmFsLmdldEZvbnQodC5mb250TmFtZSx0LmZvbnRTdHlsZSkuaWQsaT10LnNjb3BlLl9fcHJpdmF0ZV9fLmVuY29kZUNvbG9yU3RyaW5nKHQuY29sb3IpLGE9USh0LHQuY2FwdGlvbik7cmV0dXJuIHIucHVzaCgiMC43NDkwMjMgZyIpLHIucHVzaCgiMCAwICIrVChMdC5pbnRlcm5hbC5nZXRXaWR0aCh0KSkrIiAiK1QoTHQuaW50ZXJuYWwuZ2V0SGVpZ2h0KHQpKSsiIHJlIiksci5wdXNoKCJmIiksci5wdXNoKCJCTUMiKSxyLnB1c2goInEiKSxyLnB1c2goIjAgMCAxIHJnIiksci5wdXNoKCIvIituKyIgIitUKGEuZm9udFNpemUpKyIgVGYgIitpKSxyLnB1c2goIkJUIiksci5wdXNoKGEudGV4dCksci5wdXNoKCJFVCIpLHIucHVzaCgiUSIpLHIucHVzaCgiRU1DIiksZS5zdHJlYW09ci5qb2luKCJcbiIpLGV9LFllc05vcm1hbDpmdW5jdGlvbih0KXt2YXIgZT1XKHQpO2Uuc2NvcGU9dC5zY29wZTt2YXIgcj10LnNjb3BlLmludGVybmFsLmdldEZvbnQodC5mb250TmFtZSx0LmZvbnRTdHlsZSkuaWQsbj10LnNjb3BlLl9fcHJpdmF0ZV9fLmVuY29kZUNvbG9yU3RyaW5nKHQuY29sb3IpLGk9W10sYT1MdC5pbnRlcm5hbC5nZXRIZWlnaHQodCksbz1MdC5pbnRlcm5hbC5nZXRXaWR0aCh0KSxzPVEodCx0LmNhcHRpb24pO3JldHVybiBpLnB1c2goIjEgZyIpLGkucHVzaCgiMCAwICIrVChvKSsiICIrVChhKSsiIHJlIiksaS5wdXNoKCJmIiksaS5wdXNoKCJxIiksaS5wdXNoKCIwIDAgMSByZyIpLGkucHVzaCgiMCAwICIrVChvLTEpKyIgIitUKGEtMSkrIiByZSIpLGkucHVzaCgiVyIpLGkucHVzaCgibiIpLGkucHVzaCgiMCBnIiksaS5wdXNoKCJCVCIpLGkucHVzaCgiLyIrcisiICIrVChzLmZvbnRTaXplKSsiIFRmICIrbiksaS5wdXNoKHMudGV4dCksaS5wdXNoKCJFVCIpLGkucHVzaCgiUSIpLGUuc3RyZWFtPWkuam9pbigiXG4iKSxlfSxPZmZQdXNoRG93bjpmdW5jdGlvbih0KXt2YXIgZT1XKHQpO2Uuc2NvcGU9dC5zY29wZTt2YXIgcj1bXTtyZXR1cm4gci5wdXNoKCIwLjc0OTAyMyBnIiksci5wdXNoKCIwIDAgIitUKEx0LmludGVybmFsLmdldFdpZHRoKHQpKSsiICIrVChMdC5pbnRlcm5hbC5nZXRIZWlnaHQodCkpKyIgcmUiKSxyLnB1c2goImYiKSxlLnN0cmVhbT1yLmpvaW4oIlxuIiksZX19LFJhZGlvQnV0dG9uOntDaXJjbGU6e2NyZWF0ZUFwcGVhcmFuY2VTdHJlYW06ZnVuY3Rpb24odCl7dmFyIGU9e0Q6e09mZjpMdC5SYWRpb0J1dHRvbi5DaXJjbGUuT2ZmUHVzaERvd259LE46e319O3JldHVybiBlLk5bdF09THQuUmFkaW9CdXR0b24uQ2lyY2xlLlllc05vcm1hbCxlLkRbdF09THQuUmFkaW9CdXR0b24uQ2lyY2xlLlllc1B1c2hEb3duLGV9LGdldENBOmZ1bmN0aW9uKCl7cmV0dXJuImwifSxZZXNOb3JtYWw6ZnVuY3Rpb24odCl7dmFyIGU9Vyh0KTtlLnNjb3BlPXQuc2NvcGU7dmFyIHI9W10sbj1MdC5pbnRlcm5hbC5nZXRXaWR0aCh0KTw9THQuaW50ZXJuYWwuZ2V0SGVpZ2h0KHQpP0x0LmludGVybmFsLmdldFdpZHRoKHQpLzQ6THQuaW50ZXJuYWwuZ2V0SGVpZ2h0KHQpLzQ7bj1OdW1iZXIoKC45Km4pLnRvRml4ZWQoNSkpO3ZhciBpPUx0LmludGVybmFsLkJlemllcl9DLGE9TnVtYmVyKChuKmkpLnRvRml4ZWQoNSkpO3JldHVybiByLnB1c2goInEiKSxyLnB1c2goIjEgMCAwIDEgIitVKEx0LmludGVybmFsLmdldFdpZHRoKHQpLzIpKyIgIitVKEx0LmludGVybmFsLmdldEhlaWdodCh0KS8yKSsiIGNtIiksci5wdXNoKG4rIiAwIG0iKSxyLnB1c2gobisiICIrYSsiICIrYSsiICIrbisiIDAgIituKyIgYyIpLHIucHVzaCgiLSIrYSsiICIrbisiIC0iK24rIiAiK2ErIiAtIituKyIgMCBjIiksci5wdXNoKCItIituKyIgLSIrYSsiIC0iK2ErIiAtIituKyIgMCAtIituKyIgYyIpLHIucHVzaChhKyIgLSIrbisiICIrbisiIC0iK2ErIiAiK24rIiAwIGMiKSxyLnB1c2goImYiKSxyLnB1c2goIlEiKSxlLnN0cmVhbT1yLmpvaW4oIlxuIiksZX0sWWVzUHVzaERvd246ZnVuY3Rpb24odCl7dmFyIGU9Vyh0KTtlLnNjb3BlPXQuc2NvcGU7dmFyIHI9W10sbj1MdC5pbnRlcm5hbC5nZXRXaWR0aCh0KTw9THQuaW50ZXJuYWwuZ2V0SGVpZ2h0KHQpP0x0LmludGVybmFsLmdldFdpZHRoKHQpLzQ6THQuaW50ZXJuYWwuZ2V0SGVpZ2h0KHQpLzQ7bj1OdW1iZXIoKC45Km4pLnRvRml4ZWQoNSkpO3ZhciBpPU51bWJlcigoMipuKS50b0ZpeGVkKDUpKSxhPU51bWJlcigoaSpMdC5pbnRlcm5hbC5CZXppZXJfQykudG9GaXhlZCg1KSksbz1OdW1iZXIoKG4qTHQuaW50ZXJuYWwuQmV6aWVyX0MpLnRvRml4ZWQoNSkpO3JldHVybiByLnB1c2goIjAuNzQ5MDIzIGciKSxyLnB1c2goInEiKSxyLnB1c2goIjEgMCAwIDEgIitVKEx0LmludGVybmFsLmdldFdpZHRoKHQpLzIpKyIgIitVKEx0LmludGVybmFsLmdldEhlaWdodCh0KS8yKSsiIGNtIiksci5wdXNoKGkrIiAwIG0iKSxyLnB1c2goaSsiICIrYSsiICIrYSsiICIraSsiIDAgIitpKyIgYyIpLHIucHVzaCgiLSIrYSsiICIraSsiIC0iK2krIiAiK2ErIiAtIitpKyIgMCBjIiksci5wdXNoKCItIitpKyIgLSIrYSsiIC0iK2ErIiAtIitpKyIgMCAtIitpKyIgYyIpLHIucHVzaChhKyIgLSIraSsiICIraSsiIC0iK2ErIiAiK2krIiAwIGMiKSxyLnB1c2goImYiKSxyLnB1c2goIlEiKSxyLnB1c2goIjAgZyIpLHIucHVzaCgicSIpLHIucHVzaCgiMSAwIDAgMSAiK1UoTHQuaW50ZXJuYWwuZ2V0V2lkdGgodCkvMikrIiAiK1UoTHQuaW50ZXJuYWwuZ2V0SGVpZ2h0KHQpLzIpKyIgY20iKSxyLnB1c2gobisiIDAgbSIpLHIucHVzaChuKyIgIitvKyIgIitvKyIgIituKyIgMCAiK24rIiBjIiksci5wdXNoKCItIitvKyIgIituKyIgLSIrbisiICIrbysiIC0iK24rIiAwIGMiKSxyLnB1c2goIi0iK24rIiAtIitvKyIgLSIrbysiIC0iK24rIiAwIC0iK24rIiBjIiksci5wdXNoKG8rIiAtIituKyIgIituKyIgLSIrbysiICIrbisiIDAgYyIpLHIucHVzaCgiZiIpLHIucHVzaCgiUSIpLGUuc3RyZWFtPXIuam9pbigiXG4iKSxlfSxPZmZQdXNoRG93bjpmdW5jdGlvbih0KXt2YXIgZT1XKHQpO2Uuc2NvcGU9dC5zY29wZTt2YXIgcj1bXSxuPUx0LmludGVybmFsLmdldFdpZHRoKHQpPD1MdC5pbnRlcm5hbC5nZXRIZWlnaHQodCk/THQuaW50ZXJuYWwuZ2V0V2lkdGgodCkvNDpMdC5pbnRlcm5hbC5nZXRIZWlnaHQodCkvNDtuPU51bWJlcigoLjkqbikudG9GaXhlZCg1KSk7dmFyIGk9TnVtYmVyKCgyKm4pLnRvRml4ZWQoNSkpLGE9TnVtYmVyKChpKkx0LmludGVybmFsLkJlemllcl9DKS50b0ZpeGVkKDUpKTtyZXR1cm4gci5wdXNoKCIwLjc0OTAyMyBnIiksci5wdXNoKCJxIiksci5wdXNoKCIxIDAgMCAxICIrVShMdC5pbnRlcm5hbC5nZXRXaWR0aCh0KS8yKSsiICIrVShMdC5pbnRlcm5hbC5nZXRIZWlnaHQodCkvMikrIiBjbSIpLHIucHVzaChpKyIgMCBtIiksci5wdXNoKGkrIiAiK2ErIiAiK2ErIiAiK2krIiAwICIraSsiIGMiKSxyLnB1c2goIi0iK2ErIiAiK2krIiAtIitpKyIgIithKyIgLSIraSsiIDAgYyIpLHIucHVzaCgiLSIraSsiIC0iK2ErIiAtIithKyIgLSIraSsiIDAgLSIraSsiIGMiKSxyLnB1c2goYSsiIC0iK2krIiAiK2krIiAtIithKyIgIitpKyIgMCBjIiksci5wdXNoKCJmIiksci5wdXNoKCJRIiksZS5zdHJlYW09ci5qb2luKCJcbiIpLGV9fSxDcm9zczp7Y3JlYXRlQXBwZWFyYW5jZVN0cmVhbTpmdW5jdGlvbih0KXt2YXIgZT17RDp7T2ZmOkx0LlJhZGlvQnV0dG9uLkNyb3NzLk9mZlB1c2hEb3dufSxOOnt9fTtyZXR1cm4gZS5OW3RdPUx0LlJhZGlvQnV0dG9uLkNyb3NzLlllc05vcm1hbCxlLkRbdF09THQuUmFkaW9CdXR0b24uQ3Jvc3MuWWVzUHVzaERvd24sZX0sZ2V0Q0E6ZnVuY3Rpb24oKXtyZXR1cm4iOCJ9LFllc05vcm1hbDpmdW5jdGlvbih0KXt2YXIgZT1XKHQpO2Uuc2NvcGU9dC5zY29wZTt2YXIgcj1bXSxuPUx0LmludGVybmFsLmNhbGN1bGF0ZUNyb3NzKHQpO3JldHVybiByLnB1c2goInEiKSxyLnB1c2goIjEgMSAiK1QoTHQuaW50ZXJuYWwuZ2V0V2lkdGgodCktMikrIiAiK1QoTHQuaW50ZXJuYWwuZ2V0SGVpZ2h0KHQpLTIpKyIgcmUiKSxyLnB1c2goIlciKSxyLnB1c2goIm4iKSxyLnB1c2goVChuLngxLngpKyIgIitUKG4ueDEueSkrIiBtIiksci5wdXNoKFQobi54Mi54KSsiICIrVChuLngyLnkpKyIgbCIpLHIucHVzaChUKG4ueDQueCkrIiAiK1Qobi54NC55KSsiIG0iKSxyLnB1c2goVChuLngzLngpKyIgIitUKG4ueDMueSkrIiBsIiksci5wdXNoKCJzIiksci5wdXNoKCJRIiksZS5zdHJlYW09ci5qb2luKCJcbiIpLGV9LFllc1B1c2hEb3duOmZ1bmN0aW9uKHQpe3ZhciBlPVcodCk7ZS5zY29wZT10LnNjb3BlO3ZhciByPUx0LmludGVybmFsLmNhbGN1bGF0ZUNyb3NzKHQpLG49W107cmV0dXJuIG4ucHVzaCgiMC43NDkwMjMgZyIpLG4ucHVzaCgiMCAwICIrVChMdC5pbnRlcm5hbC5nZXRXaWR0aCh0KSkrIiAiK1QoTHQuaW50ZXJuYWwuZ2V0SGVpZ2h0KHQpKSsiIHJlIiksbi5wdXNoKCJmIiksbi5wdXNoKCJxIiksbi5wdXNoKCIxIDEgIitUKEx0LmludGVybmFsLmdldFdpZHRoKHQpLTIpKyIgIitUKEx0LmludGVybmFsLmdldEhlaWdodCh0KS0yKSsiIHJlIiksbi5wdXNoKCJXIiksbi5wdXNoKCJuIiksbi5wdXNoKFQoci54MS54KSsiICIrVChyLngxLnkpKyIgbSIpLG4ucHVzaChUKHIueDIueCkrIiAiK1Qoci54Mi55KSsiIGwiKSxuLnB1c2goVChyLng0LngpKyIgIitUKHIueDQueSkrIiBtIiksbi5wdXNoKFQoci54My54KSsiICIrVChyLngzLnkpKyIgbCIpLG4ucHVzaCgicyIpLG4ucHVzaCgiUSIpLGUuc3RyZWFtPW4uam9pbigiXG4iKSxlfSxPZmZQdXNoRG93bjpmdW5jdGlvbih0KXt2YXIgZT1XKHQpO2Uuc2NvcGU9dC5zY29wZTt2YXIgcj1bXTtyZXR1cm4gci5wdXNoKCIwLjc0OTAyMyBnIiksci5wdXNoKCIwIDAgIitUKEx0LmludGVybmFsLmdldFdpZHRoKHQpKSsiICIrVChMdC5pbnRlcm5hbC5nZXRIZWlnaHQodCkpKyIgcmUiKSxyLnB1c2goImYiKSxlLnN0cmVhbT1yLmpvaW4oIlxuIiksZX19fSxjcmVhdGVEZWZhdWx0QXBwZWFyYW5jZVN0cmVhbTpmdW5jdGlvbih0KXt2YXIgZT10LnNjb3BlLmludGVybmFsLmdldEZvbnQodC5mb250TmFtZSx0LmZvbnRTdHlsZSkuaWQscj10LnNjb3BlLl9fcHJpdmF0ZV9fLmVuY29kZUNvbG9yU3RyaW5nKHQuY29sb3IpO3JldHVybiIvIitlKyIgIit0LmZvbnRTaXplKyIgVGYgIityfX07THQuaW50ZXJuYWw9e0Jlemllcl9DOi41NTE5MTUwMjQ0OTQsY2FsY3VsYXRlQ3Jvc3M6ZnVuY3Rpb24odCl7dmFyIGU9THQuaW50ZXJuYWwuZ2V0V2lkdGgodCkscj1MdC5pbnRlcm5hbC5nZXRIZWlnaHQodCksbj1NYXRoLm1pbihlLHIpO3JldHVybnt4MTp7eDooZS1uKS8yLHk6KHItbikvMitufSx4Mjp7eDooZS1uKS8yK24seTooci1uKS8yfSx4Mzp7eDooZS1uKS8yLHk6KHItbikvMn0seDQ6e3g6KGUtbikvMituLHk6KHItbikvMitufX19fSxMdC5pbnRlcm5hbC5nZXRXaWR0aD1mdW5jdGlvbih0KXt2YXIgcj0wO3JldHVybiJvYmplY3QiPT09ZSh0KSYmKHI9SCh0LlJlY3RbMl0pKSxyfSxMdC5pbnRlcm5hbC5nZXRIZWlnaHQ9ZnVuY3Rpb24odCl7dmFyIHI9MDtyZXR1cm4ib2JqZWN0Ij09PWUodCkmJihyPUgodC5SZWN0WzNdKSkscn07dmFyIEF0PUUuYWRkRmllbGQ9ZnVuY3Rpb24odCl7aWYoaXQodGhpcyx0KSwhKHQgaW5zdGFuY2VvZiBsdCkpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGFyZ3VtZW50IHBhc3NlZCB0byBqc1BERi5hZGRGaWVsZC4iKTt2YXIgZTtyZXR1cm4oZT10KS5zY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5wcmludGVkT3V0JiYoZS5zY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5wcmludGVkT3V0PSExLGUuc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdD1udWxsKSxlLnNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3QuRmllbGRzLnB1c2goZSksdC5wYWdlPXQuc2NvcGUuaW50ZXJuYWwuZ2V0Q3VycmVudFBhZ2VJbmZvKCkucGFnZU51bWJlcix0aGlzfTtFLkFjcm9Gb3JtQ2hvaWNlRmllbGQ9aHQsRS5BY3JvRm9ybUxpc3RCb3g9ZnQsRS5BY3JvRm9ybUNvbWJvQm94PWR0LEUuQWNyb0Zvcm1FZGl0Qm94PXB0LEUuQWNyb0Zvcm1CdXR0b249Z3QsRS5BY3JvRm9ybVB1c2hCdXR0b249bXQsRS5BY3JvRm9ybVJhZGlvQnV0dG9uPXZ0LEUuQWNyb0Zvcm1DaGVja0JveD15dCxFLkFjcm9Gb3JtVGV4dEZpZWxkPXd0LEUuQWNyb0Zvcm1QYXNzd29yZEZpZWxkPU50LEUuQWNyb0Zvcm1BcHBlYXJhbmNlPUx0LEUuQWNyb0Zvcm09e0Nob2ljZUZpZWxkOmh0LExpc3RCb3g6ZnQsQ29tYm9Cb3g6ZHQsRWRpdEJveDpwdCxCdXR0b246Z3QsUHVzaEJ1dHRvbjptdCxSYWRpb0J1dHRvbjp2dCxDaGVja0JveDp5dCxUZXh0RmllbGQ6d3QsUGFzc3dvcmRGaWVsZDpOdCxBcHBlYXJhbmNlOkx0fSxNLkFjcm9Gb3JtPXtDaG9pY2VGaWVsZDpodCxMaXN0Qm94OmZ0LENvbWJvQm94OmR0LEVkaXRCb3g6cHQsQnV0dG9uOmd0LFB1c2hCdXR0b246bXQsUmFkaW9CdXR0b246dnQsQ2hlY2tCb3g6eXQsVGV4dEZpZWxkOnd0LFBhc3N3b3JkRmllbGQ6TnQsQXBwZWFyYW5jZTpMdH07dmFyIHh0PU0uQWNyb0Zvcm07ZnVuY3Rpb24gU3QodCl7cmV0dXJuIHQucmVkdWNlKChmdW5jdGlvbih0LGUscil7cmV0dXJuIHRbZV09cix0fSkse30pfSFmdW5jdGlvbih0KXt0Ll9fYWRkaW1hZ2VfXz17fTt2YXIgcj0iVU5LTk9XTiIsbj17UE5HOltbMTM3LDgwLDc4LDcxXV0sVElGRjpbWzc3LDc3LDAsNDJdLFs3Myw3Myw0MiwwXV0sSlBFRzpbWzI1NSwyMTYsMjU1LDIyNCx2b2lkIDAsdm9pZCAwLDc0LDcwLDczLDcwLDBdLFsyNTUsMjE2LDI1NSwyMjUsdm9pZCAwLHZvaWQgMCw2OSwxMjAsMTA1LDEwMiwwLDBdLFsyNTUsMjE2LDI1NSwyMTldLFsyNTUsMjE2LDI1NSwyMzhdXSxKUEVHMjAwMDpbWzAsMCwwLDEyLDEwNiw4MCwzMiwzMl1dLEdJRjg3YTpbWzcxLDczLDcwLDU2LDU1LDk3XV0sR0lGODlhOltbNzEsNzMsNzAsNTYsNTcsOTddXSxXRUJQOltbODIsNzMsNzAsNzAsdm9pZCAwLHZvaWQgMCx2b2lkIDAsdm9pZCAwLDg3LDY5LDY2LDgwXV0sQk1QOltbNjYsNzddLFs2Niw2NV0sWzY3LDczXSxbNjcsODBdLFs3Myw2N10sWzgwLDg0XV19LGk9dC5fX2FkZGltYWdlX18uZ2V0SW1hZ2VGaWxlVHlwZUJ5SW1hZ2VEYXRhPWZ1bmN0aW9uKHQsZSl7dmFyIGksYSxvLHMsYyx1PXI7aWYoIlJHQkEiPT09KGU9ZXx8cil8fHZvaWQgMCE9PXQuZGF0YSYmdC5kYXRhIGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXkmJiJoZWlnaHQiaW4gdCYmIndpZHRoImluIHQpcmV0dXJuIlJHQkEiO2lmKHgodCkpZm9yKGMgaW4gbilmb3Iobz1uW2NdLGk9MDtpPG8ubGVuZ3RoO2krPTEpe2ZvcihzPSEwLGE9MDthPG9baV0ubGVuZ3RoO2ErPTEpaWYodm9pZCAwIT09b1tpXVthXSYmb1tpXVthXSE9PXRbYV0pe3M9ITE7YnJlYWt9aWYoITA9PT1zKXt1PWM7YnJlYWt9fWVsc2UgZm9yKGMgaW4gbilmb3Iobz1uW2NdLGk9MDtpPG8ubGVuZ3RoO2krPTEpe2ZvcihzPSEwLGE9MDthPG9baV0ubGVuZ3RoO2ErPTEpaWYodm9pZCAwIT09b1tpXVthXSYmb1tpXVthXSE9PXQuY2hhckNvZGVBdChhKSl7cz0hMTticmVha31pZighMD09PXMpe3U9YzticmVha319cmV0dXJuIHU9PT1yJiZlIT09ciYmKHU9ZSksdX0sYT1mdW5jdGlvbiB0KGUpe2Zvcih2YXIgcj10aGlzLmludGVybmFsLndyaXRlLG49dGhpcy5pbnRlcm5hbC5wdXRTdHJlYW0saT0oMCx0aGlzLmludGVybmFsLmdldEZpbHRlcnMpKCk7LTEhPT1pLmluZGV4T2YoIkZsYXRlRW5jb2RlIik7KWkuc3BsaWNlKGkuaW5kZXhPZigiRmxhdGVFbmNvZGUiKSwxKTtlLm9iamVjdElkPXRoaXMuaW50ZXJuYWwubmV3T2JqZWN0KCk7dmFyIGE9W107aWYoYS5wdXNoKHtrZXk6IlR5cGUiLHZhbHVlOiIvWE9iamVjdCJ9KSxhLnB1c2goe2tleToiU3VidHlwZSIsdmFsdWU6Ii9JbWFnZSJ9KSxhLnB1c2goe2tleToiV2lkdGgiLHZhbHVlOmUud2lkdGh9KSxhLnB1c2goe2tleToiSGVpZ2h0Iix2YWx1ZTplLmhlaWdodH0pLGUuY29sb3JTcGFjZT09PWIuSU5ERVhFRD9hLnB1c2goe2tleToiQ29sb3JTcGFjZSIsdmFsdWU6IlsvSW5kZXhlZCAvRGV2aWNlUkdCICIrKGUucGFsZXR0ZS5sZW5ndGgvMy0xKSsiICIrKCJzTWFzayJpbiBlJiZ2b2lkIDAhPT1lLnNNYXNrP2Uub2JqZWN0SWQrMjplLm9iamVjdElkKzEpKyIgMCBSXSJ9KTooYS5wdXNoKHtrZXk6IkNvbG9yU3BhY2UiLHZhbHVlOiIvIitlLmNvbG9yU3BhY2V9KSxlLmNvbG9yU3BhY2U9PT1iLkRFVklDRV9DTVlLJiZhLnB1c2goe2tleToiRGVjb2RlIix2YWx1ZToiWzEgMCAxIDAgMSAwIDEgMF0ifSkpLGEucHVzaCh7a2V5OiJCaXRzUGVyQ29tcG9uZW50Iix2YWx1ZTplLmJpdHNQZXJDb21wb25lbnR9KSwiZGVjb2RlUGFyYW1ldGVycyJpbiBlJiZ2b2lkIDAhPT1lLmRlY29kZVBhcmFtZXRlcnMmJmEucHVzaCh7a2V5OiJEZWNvZGVQYXJtcyIsdmFsdWU6Ijw8IitlLmRlY29kZVBhcmFtZXRlcnMrIj4+In0pLCJ0cmFuc3BhcmVuY3kiaW4gZSYmQXJyYXkuaXNBcnJheShlLnRyYW5zcGFyZW5jeSkpe2Zvcih2YXIgbz0iIixzPTAsYz1lLnRyYW5zcGFyZW5jeS5sZW5ndGg7czxjO3MrKylvKz1lLnRyYW5zcGFyZW5jeVtzXSsiICIrZS50cmFuc3BhcmVuY3lbc10rIiAiO2EucHVzaCh7a2V5OiJNYXNrIix2YWx1ZToiWyIrbysiXSJ9KX12b2lkIDAhPT1lLnNNYXNrJiZhLnB1c2goe2tleToiU01hc2siLHZhbHVlOmUub2JqZWN0SWQrMSsiIDAgUiJ9KTt2YXIgdT12b2lkIDAhPT1lLmZpbHRlcj9bIi8iK2UuZmlsdGVyXTp2b2lkIDA7aWYobih7ZGF0YTplLmRhdGEsYWRkaXRpb25hbEtleVZhbHVlczphLGFscmVhZHlBcHBsaWVkRmlsdGVyczp1LG9iamVjdElkOmUub2JqZWN0SWR9KSxyKCJlbmRvYmoiKSwic01hc2siaW4gZSYmdm9pZCAwIT09ZS5zTWFzayl7dmFyIGw9Ii9QcmVkaWN0b3IgIitlLnByZWRpY3RvcisiIC9Db2xvcnMgMSAvQml0c1BlckNvbXBvbmVudCAiK2UuYml0c1BlckNvbXBvbmVudCsiIC9Db2x1bW5zICIrZS53aWR0aCxoPXt3aWR0aDplLndpZHRoLGhlaWdodDplLmhlaWdodCxjb2xvclNwYWNlOiJEZXZpY2VHcmF5IixiaXRzUGVyQ29tcG9uZW50OmUuYml0c1BlckNvbXBvbmVudCxkZWNvZGVQYXJhbWV0ZXJzOmwsZGF0YTplLnNNYXNrfTsiZmlsdGVyImluIGUmJihoLmZpbHRlcj1lLmZpbHRlciksdC5jYWxsKHRoaXMsaCl9aWYoZS5jb2xvclNwYWNlPT09Yi5JTkRFWEVEKXt2YXIgZj10aGlzLmludGVybmFsLm5ld09iamVjdCgpO24oe2RhdGE6XyhuZXcgVWludDhBcnJheShlLnBhbGV0dGUpKSxvYmplY3RJZDpmfSkscigiZW5kb2JqIil9fSxvPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5pbnRlcm5hbC5jb2xsZWN0aW9ucy5hZGRJbWFnZV9pbWFnZXM7Zm9yKHZhciBlIGluIHQpYS5jYWxsKHRoaXMsdFtlXSl9LHM9ZnVuY3Rpb24oKXt2YXIgdCxlPXRoaXMuaW50ZXJuYWwuY29sbGVjdGlvbnMuYWRkSW1hZ2VfaW1hZ2VzLHI9dGhpcy5pbnRlcm5hbC53cml0ZTtmb3IodmFyIG4gaW4gZSlyKCIvSSIrKHQ9ZVtuXSkuaW5kZXgsdC5vYmplY3RJZCwiMCIsIlIiKX0sdT1mdW5jdGlvbigpe3RoaXMuaW50ZXJuYWwuY29sbGVjdGlvbnMuYWRkSW1hZ2VfaW1hZ2VzfHwodGhpcy5pbnRlcm5hbC5jb2xsZWN0aW9ucy5hZGRJbWFnZV9pbWFnZXM9e30sdGhpcy5pbnRlcm5hbC5ldmVudHMuc3Vic2NyaWJlKCJwdXRSZXNvdXJjZXMiLG8pLHRoaXMuaW50ZXJuYWwuZXZlbnRzLnN1YnNjcmliZSgicHV0WG9iamVjdERpY3QiLHMpKX0sbD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuaW50ZXJuYWwuY29sbGVjdGlvbnMuYWRkSW1hZ2VfaW1hZ2VzO3JldHVybiB1LmNhbGwodGhpcyksdH0saD1mdW5jdGlvbigpe3JldHVybiBPYmplY3Qua2V5cyh0aGlzLmludGVybmFsLmNvbGxlY3Rpb25zLmFkZEltYWdlX2ltYWdlcykubGVuZ3RofSxmPWZ1bmN0aW9uKGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0WyJwcm9jZXNzIitlLnRvVXBwZXJDYXNlKCldfSxkPWZ1bmN0aW9uKHQpe3JldHVybiJvYmplY3QiPT09ZSh0KSYmMT09PXQubm9kZVR5cGV9LHA9ZnVuY3Rpb24oZSxyKXtpZigiSU1HIj09PWUubm9kZU5hbWUmJmUuaGFzQXR0cmlidXRlKCJzcmMiKSl7dmFyIG49IiIrZS5nZXRBdHRyaWJ1dGUoInNyYyIpO2lmKDA9PT1uLmluZGV4T2YoImRhdGE6aW1hZ2UvIikpcmV0dXJuIGModW5lc2NhcGUobikuc3BsaXQoImJhc2U2NCwiKS5wb3AoKSk7dmFyIGk9dC5sb2FkRmlsZShuLCEwKTtpZih2b2lkIDAhPT1pKXJldHVybiBpfWlmKCJDQU5WQVMiPT09ZS5ub2RlTmFtZSl7aWYoMD09PWUud2lkdGh8fDA9PT1lLmhlaWdodCl0aHJvdyBuZXcgRXJyb3IoIkdpdmVuIGNhbnZhcyBtdXN0IGhhdmUgZGF0YS4gQ2FudmFzIHdpZHRoOiAiK2Uud2lkdGgrIiwgaGVpZ2h0OiAiK2UuaGVpZ2h0KTt2YXIgYTtzd2l0Y2gocil7Y2FzZSJQTkciOmE9ImltYWdlL3BuZyI7YnJlYWs7Y2FzZSJXRUJQIjphPSJpbWFnZS93ZWJwIjticmVhaztjYXNlIkpQRUciOmNhc2UiSlBHIjpkZWZhdWx0OmE9ImltYWdlL2pwZWcifXJldHVybiBjKGUudG9EYXRhVVJMKGEsMSkuc3BsaXQoImJhc2U2NCwiKS5wb3AoKSl9fSxnPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaW50ZXJuYWwuY29sbGVjdGlvbnMuYWRkSW1hZ2VfaW1hZ2VzO2lmKGUpZm9yKHZhciByIGluIGUpaWYodD09PWVbcl0uYWxpYXMpcmV0dXJuIGVbcl19LG09ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0fHxlfHwodD0tOTYsZT0tOTYpLHQ8MCYmKHQ9LTEqci53aWR0aCo3Mi90L3RoaXMuaW50ZXJuYWwuc2NhbGVGYWN0b3IpLGU8MCYmKGU9LTEqci5oZWlnaHQqNzIvZS90aGlzLmludGVybmFsLnNjYWxlRmFjdG9yKSwwPT09dCYmKHQ9ZSpyLndpZHRoL3IuaGVpZ2h0KSwwPT09ZSYmKGU9dCpyLmhlaWdodC9yLndpZHRoKSxbdCxlXX0sdj1mdW5jdGlvbih0LGUscixuLGksYSl7dmFyIG89bS5jYWxsKHRoaXMscixuLGkpLHM9dGhpcy5pbnRlcm5hbC5nZXRDb29yZGluYXRlU3RyaW5nLGM9dGhpcy5pbnRlcm5hbC5nZXRWZXJ0aWNhbENvb3JkaW5hdGVTdHJpbmcsdT1sLmNhbGwodGhpcyk7aWYocj1vWzBdLG49b1sxXSx1W2kuaW5kZXhdPWksYSl7YSo9TWF0aC5QSS8xODA7dmFyIGg9TWF0aC5jb3MoYSksZj1NYXRoLnNpbihhKSxkPWZ1bmN0aW9uKHQpe3JldHVybiB0LnRvRml4ZWQoNCl9LHA9W2QoaCksZChmKSxkKC0xKmYpLGQoaCksMCwwLCJjbSJdfXRoaXMuaW50ZXJuYWwud3JpdGUoInEiKSxhPyh0aGlzLmludGVybmFsLndyaXRlKFsxLCIwIiwiMCIsMSxzKHQpLGMoZStuKSwiY20iXS5qb2luKCIgIikpLHRoaXMuaW50ZXJuYWwud3JpdGUocC5qb2luKCIgIikpLHRoaXMuaW50ZXJuYWwud3JpdGUoW3MociksIjAiLCIwIixzKG4pLCIwIiwiMCIsImNtIl0uam9pbigiICIpKSk6dGhpcy5pbnRlcm5hbC53cml0ZShbcyhyKSwiMCIsIjAiLHMobikscyh0KSxjKGUrbiksImNtIl0uam9pbigiICIpKSx0aGlzLmlzQWR2YW5jZWRBUEkoKSYmdGhpcy5pbnRlcm5hbC53cml0ZShbMSwwLDAsLTEsMCwwLCJjbSJdLmpvaW4oIiAiKSksdGhpcy5pbnRlcm5hbC53cml0ZSgiL0kiK2kuaW5kZXgrIiBEbyIpLHRoaXMuaW50ZXJuYWwud3JpdGUoIlEiKX0sYj10LmNvbG9yX3NwYWNlcz17REVWSUNFX1JHQjoiRGV2aWNlUkdCIixERVZJQ0VfR1JBWToiRGV2aWNlR3JheSIsREVWSUNFX0NNWUs6IkRldmljZUNNWUsiLENBTF9HUkVZOiJDYWxHcmF5IixDQUxfUkdCOiJDYWxSR0IiLExBQjoiTGFiIixJQ0NfQkFTRUQ6IklDQ0Jhc2VkIixJTkRFWEVEOiJJbmRleGVkIixQQVRURVJOOiJQYXR0ZXJuIixTRVBBUkFUSU9OOiJTZXBhcmF0aW9uIixERVZJQ0VfTjoiRGV2aWNlTiJ9O3QuZGVjb2RlPXtEQ1RfREVDT0RFOiJEQ1REZWNvZGUiLEZMQVRFX0RFQ09ERToiRmxhdGVEZWNvZGUiLExaV19ERUNPREU6IkxaV0RlY29kZSIsSlBYX0RFQ09ERToiSlBYRGVjb2RlIixKQklHMl9ERUNPREU6IkpCSUcyRGVjb2RlIixBU0NJSTg1X0RFQ09ERToiQVNDSUk4NURlY29kZSIsQVNDSUlfSEVYX0RFQ09ERToiQVNDSUlIZXhEZWNvZGUiLFJVTl9MRU5HVEhfREVDT0RFOiJSdW5MZW5ndGhEZWNvZGUiLENDSVRUX0ZBWF9ERUNPREU6IkNDSVRURmF4RGVjb2RlIn07dmFyIHk9dC5pbWFnZV9jb21wcmVzc2lvbj17Tk9ORToiTk9ORSIsRkFTVDoiRkFTVCIsTUVESVVNOiJNRURJVU0iLFNMT1c6IlNMT1cifSx3PXQuX19hZGRpbWFnZV9fLnNIYXNoQ29kZT1mdW5jdGlvbih0KXt2YXIgZSxyLG49MDtpZigic3RyaW5nIj09dHlwZW9mIHQpZm9yKHI9dC5sZW5ndGgsZT0wO2U8cjtlKyspbj0objw8NSktbit0LmNoYXJDb2RlQXQoZSksbnw9MDtlbHNlIGlmKHgodCkpZm9yKHI9dC5ieXRlTGVuZ3RoLzIsZT0wO2U8cjtlKyspbj0objw8NSktbit0W2VdLG58PTA7cmV0dXJuIG59LE49dC5fX2FkZGltYWdlX18udmFsaWRhdGVTdHJpbmdBc0Jhc2U2ND1mdW5jdGlvbih0KXsodD10fHwiIikudG9TdHJpbmcoKS50cmltKCk7dmFyIGU9ITA7cmV0dXJuIDA9PT10Lmxlbmd0aCYmKGU9ITEpLHQubGVuZ3RoJTQhPTAmJihlPSExKSwhMT09PS9eW0EtWmEtejAtOSsvXSskLy50ZXN0KHQuc3Vic3RyKDAsdC5sZW5ndGgtMikpJiYoZT0hMSksITE9PT0vXltBLVphLXowLTkvXVtBLVphLXowLTkrL118W0EtWmEtejAtOSsvXT18PT0kLy50ZXN0KHQuc3Vic3RyKC0yKSkmJihlPSExKSxlfSxMPXQuX19hZGRpbWFnZV9fLmV4dHJhY3RJbWFnZUZyb21EYXRhVXJsPWZ1bmN0aW9uKHQpe3ZhciBlPSh0PXR8fCIiKS5zcGxpdCgiYmFzZTY0LCIpLHI9bnVsbDtpZigyPT09ZS5sZW5ndGgpe3ZhciBuPS9eZGF0YTooXHcqXC9cdyopOyooY2hhcnNldD0oPyFjaGFyc2V0PSlbXHc9LV0qKSo7KiQvLmV4ZWMoZVswXSk7QXJyYXkuaXNBcnJheShuKSYmKHI9e21pbWVUeXBlOm5bMV0sY2hhcnNldDpuWzJdLGRhdGE6ZVsxXX0pfXJldHVybiByfSxBPXQuX19hZGRpbWFnZV9fLnN1cHBvcnRzQXJyYXlCdWZmZXI9ZnVuY3Rpb24oKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiYidW5kZWZpbmVkIiE9dHlwZW9mIFVpbnQ4QXJyYXl9O3QuX19hZGRpbWFnZV9fLmlzQXJyYXlCdWZmZXI9ZnVuY3Rpb24odCl7cmV0dXJuIEEoKSYmdCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfTt2YXIgeD10Ll9fYWRkaW1hZ2VfXy5pc0FycmF5QnVmZmVyVmlldz1mdW5jdGlvbih0KXtyZXR1cm4gQSgpJiYidW5kZWZpbmVkIiE9dHlwZW9mIFVpbnQzMkFycmF5JiYodCBpbnN0YW5jZW9mIEludDhBcnJheXx8dCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXl8fCJ1bmRlZmluZWQiIT10eXBlb2YgVWludDhDbGFtcGVkQXJyYXkmJnQgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheXx8dCBpbnN0YW5jZW9mIEludDE2QXJyYXl8fHQgaW5zdGFuY2VvZiBVaW50MTZBcnJheXx8dCBpbnN0YW5jZW9mIEludDMyQXJyYXl8fHQgaW5zdGFuY2VvZiBVaW50MzJBcnJheXx8dCBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheXx8dCBpbnN0YW5jZW9mIEZsb2F0NjRBcnJheSl9LFM9dC5fX2FkZGltYWdlX18uYmluYXJ5U3RyaW5nVG9VaW50OEFycmF5PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10Lmxlbmd0aCxyPW5ldyBVaW50OEFycmF5KGUpLG49MDtuPGU7bisrKXJbbl09dC5jaGFyQ29kZUF0KG4pO3JldHVybiByfSxfPXQuX19hZGRpbWFnZV9fLmFycmF5QnVmZmVyVG9CaW5hcnlTdHJpbmc9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPSIiLHI9eCh0KT90Om5ldyBVaW50OEFycmF5KHQpLG49MDtuPHIubGVuZ3RoO24rPTgxOTIpZSs9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLHIuc3ViYXJyYXkobixuKzgxOTIpKTtyZXR1cm4gZX07dC5hZGRJbWFnZT1mdW5jdGlvbigpe3ZhciB0LG4saSxhLG8scyxjLGwsaDtpZigibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1sxXT8obj1yLGk9YXJndW1lbnRzWzFdLGE9YXJndW1lbnRzWzJdLG89YXJndW1lbnRzWzNdLHM9YXJndW1lbnRzWzRdLGM9YXJndW1lbnRzWzVdLGw9YXJndW1lbnRzWzZdLGg9YXJndW1lbnRzWzddKToobj1hcmd1bWVudHNbMV0saT1hcmd1bWVudHNbMl0sYT1hcmd1bWVudHNbM10sbz1hcmd1bWVudHNbNF0scz1hcmd1bWVudHNbNV0sYz1hcmd1bWVudHNbNl0sbD1hcmd1bWVudHNbN10saD1hcmd1bWVudHNbOF0pLCJvYmplY3QiPT09ZSh0PWFyZ3VtZW50c1swXSkmJiFkKHQpJiYiaW1hZ2VEYXRhImluIHQpe3ZhciBmPXQ7dD1mLmltYWdlRGF0YSxuPWYuZm9ybWF0fHxufHxyLGk9Zi54fHxpfHwwLGE9Zi55fHxhfHwwLG89Zi53fHxmLndpZHRofHxvLHM9Zi5ofHxmLmhlaWdodHx8cyxjPWYuYWxpYXN8fGMsbD1mLmNvbXByZXNzaW9ufHxsLGg9Zi5yb3RhdGlvbnx8Zi5hbmdsZXx8aH12YXIgcD10aGlzLmludGVybmFsLmdldEZpbHRlcnMoKTtpZih2b2lkIDA9PT1sJiYtMSE9PXAuaW5kZXhPZigiRmxhdGVFbmNvZGUiKSYmKGw9IlNMT1ciKSxpc05hTihpKXx8aXNOYU4oYSkpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNvb3JkaW5hdGVzIHBhc3NlZCB0byBqc1BERi5hZGRJbWFnZSIpO3UuY2FsbCh0aGlzKTt2YXIgZz1QLmNhbGwodGhpcyx0LG4sYyxsKTtyZXR1cm4gdi5jYWxsKHRoaXMsaSxhLG8scyxnLGgpLHRoaXN9O3ZhciBQPWZ1bmN0aW9uKGUsbixhLG8pe3ZhciBzLGMsdTtpZigic3RyaW5nIj09dHlwZW9mIGUmJmkoZSk9PT1yKXtlPXVuZXNjYXBlKGUpO3ZhciBsPWsoZSwhMSk7KCIiIT09bHx8dm9pZCAwIT09KGw9dC5sb2FkRmlsZShlLCEwKSkpJiYoZT1sKX1pZihkKGUpJiYoZT1wKGUsbikpLG49aShlLG4pLCFmKG4pKXRocm93IG5ldyBFcnJvcigiYWRkSW1hZ2UgZG9lcyBub3Qgc3VwcG9ydCBmaWxlcyBvZiB0eXBlICciK24rIicsIHBsZWFzZSBlbnN1cmUgdGhhdCBhIHBsdWdpbiBmb3IgJyIrbisiJyBzdXBwb3J0IGlzIGFkZGVkLiIpO2lmKChudWxsPT0odT1hKXx8MD09PXUubGVuZ3RoKSYmKGE9ZnVuY3Rpb24odCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0fHx4KHQpP3codCk6eCh0LmRhdGEpP3codC5kYXRhKTpudWxsfShlKSksKHM9Zy5jYWxsKHRoaXMsYSkpfHwoQSgpJiYoZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXl8fCJSR0JBIj09PW58fChjPWUsZT1TKGUpKSkscz10aGlzWyJwcm9jZXNzIituLnRvVXBwZXJDYXNlKCldKGUsaC5jYWxsKHRoaXMpLGEsZnVuY3Rpb24oZSl7cmV0dXJuIGUmJiJzdHJpbmciPT10eXBlb2YgZSYmKGU9ZS50b1VwcGVyQ2FzZSgpKSxlIGluIHQuaW1hZ2VfY29tcHJlc3Npb24/ZTp5Lk5PTkV9KG8pLGMpKSwhcyl0aHJvdyBuZXcgRXJyb3IoIkFuIHVua25vd24gZXJyb3Igb2NjdXJyZWQgd2hpbHN0IHByb2Nlc3NpbmcgdGhlIGltYWdlLiIpO3JldHVybiBzfSxrPXQuX19hZGRpbWFnZV9fLmNvbnZlcnRCYXNlNjRUb0JpbmFyeVN0cmluZz1mdW5jdGlvbih0LGUpe3ZhciByO2U9ImJvb2xlYW4iIT10eXBlb2YgZXx8ZTt2YXIgbixpPSIiO2lmKCJzdHJpbmciPT10eXBlb2YgdCl7bj1udWxsIT09KHI9TCh0KSk/ci5kYXRhOnQ7dHJ5e2k9YyhuKX1jYXRjaCh0KXtpZihlKXRocm93IE4obik/bmV3IEVycm9yKCJhdG9iLUVycm9yIGluIGpzUERGLmNvbnZlcnRCYXNlNjRUb0JpbmFyeVN0cmluZyAiK3QubWVzc2FnZSk6bmV3IEVycm9yKCJTdXBwbGllZCBEYXRhIGlzIG5vdCBhIHZhbGlkIGJhc2U2NC1TdHJpbmcganNQREYuY29udmVydEJhc2U2NFRvQmluYXJ5U3RyaW5nICIpfX1yZXR1cm4gaX07dC5nZXRJbWFnZVByb3BlcnRpZXM9ZnVuY3Rpb24oZSl7dmFyIG4sYSxvPSIiO2lmKGQoZSkmJihlPXAoZSkpLCJzdHJpbmciPT10eXBlb2YgZSYmaShlKT09PXImJigiIj09PShvPWsoZSwhMSkpJiYobz10LmxvYWRGaWxlKGUpfHwiIiksZT1vKSxhPWkoZSksIWYoYSkpdGhyb3cgbmV3IEVycm9yKCJhZGRJbWFnZSBkb2VzIG5vdCBzdXBwb3J0IGZpbGVzIG9mIHR5cGUgJyIrYSsiJywgcGxlYXNlIGVuc3VyZSB0aGF0IGEgcGx1Z2luIGZvciAnIithKyInIHN1cHBvcnQgaXMgYWRkZWQuIik7aWYoIUEoKXx8ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXl8fChlPVMoZSkpLCEobj10aGlzWyJwcm9jZXNzIithLnRvVXBwZXJDYXNlKCldKGUpKSl0aHJvdyBuZXcgRXJyb3IoIkFuIHVua25vd24gZXJyb3Igb2NjdXJyZWQgd2hpbHN0IHByb2Nlc3NpbmcgdGhlIGltYWdlIik7cmV0dXJuIG4uZmlsZVR5cGU9YSxufX0oTS5BUEkpLAovKioKICAgKiBAbGljZW5zZQogICAqIENvcHlyaWdodCAoYykgMjAxNCBTdGV2ZW4gU3B1bmdpbiAoVHdlbHZlVG9uZSBMTEMpICBzdGV2ZW5AdHdlbHZldG9uZS50dgogICAqCiAgICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLgogICAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZQogICAqLwpmdW5jdGlvbih0KXt2YXIgZT1mdW5jdGlvbih0KXtpZih2b2lkIDAhPT10JiYiIiE9dClyZXR1cm4hMH07TS5BUEkuZXZlbnRzLnB1c2goWyJhZGRQYWdlIixmdW5jdGlvbih0KXt0aGlzLmludGVybmFsLmdldFBhZ2VJbmZvKHQucGFnZU51bWJlcikucGFnZUNvbnRleHQuYW5ub3RhdGlvbnM9W119XSksdC5ldmVudHMucHVzaChbInB1dFBhZ2UiLGZ1bmN0aW9uKHQpe2Zvcih2YXIgcixuLGksYT10aGlzLmludGVybmFsLmdldENvb3JkaW5hdGVTdHJpbmcsbz10aGlzLmludGVybmFsLmdldFZlcnRpY2FsQ29vcmRpbmF0ZVN0cmluZyxzPXRoaXMuaW50ZXJuYWwuZ2V0UGFnZUluZm9CeU9iaklkKHQub2JqSWQpLGM9dC5wYWdlQ29udGV4dC5hbm5vdGF0aW9ucyx1PSExLGw9MDtsPGMubGVuZ3RoJiYhdTtsKyspc3dpdGNoKChyPWNbbF0pLnR5cGUpe2Nhc2UibGluayI6KGUoci5vcHRpb25zLnVybCl8fGUoci5vcHRpb25zLnBhZ2VOdW1iZXIpKSYmKHU9ITApO2JyZWFrO2Nhc2UicmVmZXJlbmNlIjpjYXNlInRleHQiOmNhc2UiZnJlZXRleHQiOnU9ITB9aWYoMCE9dSl7dGhpcy5pbnRlcm5hbC53cml0ZSgiL0Fubm90cyBbIik7Zm9yKHZhciBoPTA7aDxjLmxlbmd0aDtoKyspe3I9Y1toXTt2YXIgZj10aGlzLmludGVybmFsLnBkZkVzY2FwZSxkPXRoaXMuaW50ZXJuYWwuZ2V0RW5jcnlwdG9yKHQub2JqSWQpO3N3aXRjaChyLnR5cGUpe2Nhc2UicmVmZXJlbmNlIjp0aGlzLmludGVybmFsLndyaXRlKCIgIityLm9iamVjdC5vYmpJZCsiIDAgUiAiKTticmVhaztjYXNlInRleHQiOnZhciBwPXRoaXMuaW50ZXJuYWwubmV3QWRkaXRpb25hbE9iamVjdCgpLGc9dGhpcy5pbnRlcm5hbC5uZXdBZGRpdGlvbmFsT2JqZWN0KCksbT10aGlzLmludGVybmFsLmdldEVuY3J5cHRvcihwLm9iaklkKSx2PXIudGl0bGV8fCJOb3RlIjtpPSI8PC9UeXBlIC9Bbm5vdCAvU3VidHlwZSAvVGV4dCAiKyhuPSIvUmVjdCBbIithKHIuYm91bmRzLngpKyIgIitvKHIuYm91bmRzLnkrci5ib3VuZHMuaCkrIiAiK2Eoci5ib3VuZHMueCtyLmJvdW5kcy53KSsiICIrbyhyLmJvdW5kcy55KSsiXSAiKSsiL0NvbnRlbnRzICgiK2YobShyLmNvbnRlbnRzKSkrIikiLGkrPSIgL1BvcHVwICIrZy5vYmpJZCsiIDAgUiIsaSs9IiAvUCAiK3Mub2JqSWQrIiAwIFIiLGkrPSIgL1QgKCIrZihtKHYpKSsiKSA+PiIscC5jb250ZW50PWk7dmFyIGI9cC5vYmpJZCsiIDAgUiI7aT0iPDwvVHlwZSAvQW5ub3QgL1N1YnR5cGUgL1BvcHVwICIrKG49Ii9SZWN0IFsiK2Eoci5ib3VuZHMueCszMCkrIiAiK28oci5ib3VuZHMueStyLmJvdW5kcy5oKSsiICIrYShyLmJvdW5kcy54K3IuYm91bmRzLncrMzApKyIgIitvKHIuYm91bmRzLnkpKyJdICIpKyIgL1BhcmVudCAiK2Isci5vcGVuJiYoaSs9IiAvT3BlbiB0cnVlIiksaSs9IiA+PiIsZy5jb250ZW50PWksdGhpcy5pbnRlcm5hbC53cml0ZShwLm9iaklkLCIwIFIiLGcub2JqSWQsIjAgUiIpO2JyZWFrO2Nhc2UiZnJlZXRleHQiOm49Ii9SZWN0IFsiK2Eoci5ib3VuZHMueCkrIiAiK28oci5ib3VuZHMueSkrIiAiK2Eoci5ib3VuZHMueCtyLmJvdW5kcy53KSsiICIrbyhyLmJvdW5kcy55K3IuYm91bmRzLmgpKyJdICI7dmFyIHk9ci5jb2xvcnx8IiMwMDAwMDAiO2k9Ijw8L1R5cGUgL0Fubm90IC9TdWJ0eXBlIC9GcmVlVGV4dCAiK24rIi9Db250ZW50cyAoIitmKGQoci5jb250ZW50cykpKyIpIixpKz0iIC9EUyhmb250OiBIZWx2ZXRpY2Esc2Fucy1zZXJpZiAxMi4wcHQ7IHRleHQtYWxpZ246bGVmdDsgY29sb3I6IyIreSsiKSIsaSs9IiAvQm9yZGVyIFswIDAgMF0iLGkrPSIgPj4iLHRoaXMuaW50ZXJuYWwud3JpdGUoaSk7YnJlYWs7Y2FzZSJsaW5rIjppZihyLm9wdGlvbnMubmFtZSl7dmFyIHc9dGhpcy5hbm5vdGF0aW9ucy5fbmFtZU1hcFtyLm9wdGlvbnMubmFtZV07ci5vcHRpb25zLnBhZ2VOdW1iZXI9dy5wYWdlLHIub3B0aW9ucy50b3A9dy55fWVsc2Ugci5vcHRpb25zLnRvcHx8KHIub3B0aW9ucy50b3A9MCk7aWYobj0iL1JlY3QgWyIrci5maW5hbEJvdW5kcy54KyIgIityLmZpbmFsQm91bmRzLnkrIiAiK3IuZmluYWxCb3VuZHMudysiICIrci5maW5hbEJvdW5kcy5oKyJdICIsaT0iIixyLm9wdGlvbnMudXJsKWk9Ijw8L1R5cGUgL0Fubm90IC9TdWJ0eXBlIC9MaW5rICIrbisiL0JvcmRlciBbMCAwIDBdIC9BIDw8L1MgL1VSSSAvVVJJICgiK2YoZChyLm9wdGlvbnMudXJsKSkrIikgPj4iO2Vsc2UgaWYoci5vcHRpb25zLnBhZ2VOdW1iZXIpe3N3aXRjaChpPSI8PC9UeXBlIC9Bbm5vdCAvU3VidHlwZSAvTGluayAiK24rIi9Cb3JkZXIgWzAgMCAwXSAvRGVzdCBbIit0aGlzLmludGVybmFsLmdldFBhZ2VJbmZvKHIub3B0aW9ucy5wYWdlTnVtYmVyKS5vYmpJZCsiIDAgUiIsci5vcHRpb25zLm1hZ0ZhY3Rvcj1yLm9wdGlvbnMubWFnRmFjdG9yfHwiWFlaIixyLm9wdGlvbnMubWFnRmFjdG9yKXtjYXNlIkZpdCI6aSs9IiAvRml0XSI7YnJlYWs7Y2FzZSJGaXRIIjppKz0iIC9GaXRIICIrci5vcHRpb25zLnRvcCsiXSI7YnJlYWs7Y2FzZSJGaXRWIjpyLm9wdGlvbnMubGVmdD1yLm9wdGlvbnMubGVmdHx8MCxpKz0iIC9GaXRWICIrci5vcHRpb25zLmxlZnQrIl0iO2JyZWFrO2Nhc2UiWFlaIjpkZWZhdWx0OnZhciBOPW8oci5vcHRpb25zLnRvcCk7ci5vcHRpb25zLmxlZnQ9ci5vcHRpb25zLmxlZnR8fDAsdm9pZCAwPT09ci5vcHRpb25zLnpvb20mJihyLm9wdGlvbnMuem9vbT0wKSxpKz0iIC9YWVogIityLm9wdGlvbnMubGVmdCsiICIrTisiICIrci5vcHRpb25zLnpvb20rIl0ifX0iIiE9aSYmKGkrPSIgPj4iLHRoaXMuaW50ZXJuYWwud3JpdGUoaSkpfX10aGlzLmludGVybmFsLndyaXRlKCJdIil9fV0pLHQuY3JlYXRlQW5ub3RhdGlvbj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmludGVybmFsLmdldEN1cnJlbnRQYWdlSW5mbygpO3N3aXRjaCh0LnR5cGUpe2Nhc2UibGluayI6dGhpcy5saW5rKHQuYm91bmRzLngsdC5ib3VuZHMueSx0LmJvdW5kcy53LHQuYm91bmRzLmgsdCk7YnJlYWs7Y2FzZSJ0ZXh0IjpjYXNlImZyZWV0ZXh0IjplLnBhZ2VDb250ZXh0LmFubm90YXRpb25zLnB1c2godCl9fSx0Lmxpbms9ZnVuY3Rpb24odCxlLHIsbixpKXt2YXIgYT10aGlzLmludGVybmFsLmdldEN1cnJlbnRQYWdlSW5mbygpLG89dGhpcy5pbnRlcm5hbC5nZXRDb29yZGluYXRlU3RyaW5nLHM9dGhpcy5pbnRlcm5hbC5nZXRWZXJ0aWNhbENvb3JkaW5hdGVTdHJpbmc7YS5wYWdlQ29udGV4dC5hbm5vdGF0aW9ucy5wdXNoKHtmaW5hbEJvdW5kczp7eDpvKHQpLHk6cyhlKSx3Om8odCtyKSxoOnMoZStuKX0sb3B0aW9uczppLHR5cGU6ImxpbmsifSl9LHQudGV4dFdpdGhMaW5rPWZ1bmN0aW9uKHQsZSxyLG4pe3ZhciBpLGEsbz10aGlzLmdldFRleHRXaWR0aCh0KSxzPXRoaXMuaW50ZXJuYWwuZ2V0TGluZUhlaWdodCgpL3RoaXMuaW50ZXJuYWwuc2NhbGVGYWN0b3I7aWYodm9pZCAwIT09bi5tYXhXaWR0aCl7YT1uLm1heFdpZHRoO3ZhciBjPXRoaXMuc3BsaXRUZXh0VG9TaXplKHQsYSkubGVuZ3RoO2k9TWF0aC5jZWlsKHMqYyl9ZWxzZSBhPW8saT1zO3JldHVybiB0aGlzLnRleHQodCxlLHIsbikscis9LjIqcywiY2VudGVyIj09PW4uYWxpZ24mJihlLT1vLzIpLCJyaWdodCI9PT1uLmFsaWduJiYoZS09byksdGhpcy5saW5rKGUsci1zLGEsaSxuKSxvfSx0LmdldFRleHRXaWR0aD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmludGVybmFsLmdldEZvbnRTaXplKCk7cmV0dXJuIHRoaXMuZ2V0U3RyaW5nVW5pdFdpZHRoKHQpKmUvdGhpcy5pbnRlcm5hbC5zY2FsZUZhY3Rvcn19KE0uQVBJKSwKLyoqCiAgICogQGxpY2Vuc2UKICAgKiBDb3B5cmlnaHQgKGMpIDIwMTcgQXJhcyBBYmJhc2kKICAgKgogICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4KICAgKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UKICAgKi8KZnVuY3Rpb24odCl7dmFyIGU9ezE1Njk6WzY1MTUyXSwxNTcwOls2NTE1Myw2NTE1NF0sMTU3MTpbNjUxNTUsNjUxNTZdLDE1NzI6WzY1MTU3LDY1MTU4XSwxNTczOls2NTE1OSw2NTE2MF0sMTU3NDpbNjUxNjEsNjUxNjIsNjUxNjMsNjUxNjRdLDE1NzU6WzY1MTY1LDY1MTY2XSwxNTc2Ols2NTE2Nyw2NTE2OCw2NTE2OSw2NTE3MF0sMTU3NzpbNjUxNzEsNjUxNzJdLDE1Nzg6WzY1MTczLDY1MTc0LDY1MTc1LDY1MTc2XSwxNTc5Ols2NTE3Nyw2NTE3OCw2NTE3OSw2NTE4MF0sMTU4MDpbNjUxODEsNjUxODIsNjUxODMsNjUxODRdLDE1ODE6WzY1MTg1LDY1MTg2LDY1MTg3LDY1MTg4XSwxNTgyOls2NTE4OSw2NTE5MCw2NTE5MSw2NTE5Ml0sMTU4MzpbNjUxOTMsNjUxOTRdLDE1ODQ6WzY1MTk1LDY1MTk2XSwxNTg1Ols2NTE5Nyw2NTE5OF0sMTU4NjpbNjUxOTksNjUyMDBdLDE1ODc6WzY1MjAxLDY1MjAyLDY1MjAzLDY1MjA0XSwxNTg4Ols2NTIwNSw2NTIwNiw2NTIwNyw2NTIwOF0sMTU4OTpbNjUyMDksNjUyMTAsNjUyMTEsNjUyMTJdLDE1OTA6WzY1MjEzLDY1MjE0LDY1MjE1LDY1MjE2XSwxNTkxOls2NTIxNyw2NTIxOCw2NTIxOSw2NTIyMF0sMTU5MjpbNjUyMjEsNjUyMjIsNjUyMjMsNjUyMjRdLDE1OTM6WzY1MjI1LDY1MjI2LDY1MjI3LDY1MjI4XSwxNTk0Ols2NTIyOSw2NTIzMCw2NTIzMSw2NTIzMl0sMTYwMTpbNjUyMzMsNjUyMzQsNjUyMzUsNjUyMzZdLDE2MDI6WzY1MjM3LDY1MjM4LDY1MjM5LDY1MjQwXSwxNjAzOls2NTI0MSw2NTI0Miw2NTI0Myw2NTI0NF0sMTYwNDpbNjUyNDUsNjUyNDYsNjUyNDcsNjUyNDhdLDE2MDU6WzY1MjQ5LDY1MjUwLDY1MjUxLDY1MjUyXSwxNjA2Ols2NTI1Myw2NTI1NCw2NTI1NSw2NTI1Nl0sMTYwNzpbNjUyNTcsNjUyNTgsNjUyNTksNjUyNjBdLDE2MDg6WzY1MjYxLDY1MjYyXSwxNjA5Ols2NTI2Myw2NTI2NCw2NDQ4OCw2NDQ4OV0sMTYxMDpbNjUyNjUsNjUyNjYsNjUyNjcsNjUyNjhdLDE2NDk6WzY0MzM2LDY0MzM3XSwxNjU1Ols2NDQ3N10sMTY1NzpbNjQzNTgsNjQzNTksNjQzNjAsNjQzNjFdLDE2NTg6WzY0MzUwLDY0MzUxLDY0MzUyLDY0MzUzXSwxNjU5Ols2NDMzOCw2NDMzOSw2NDM0MCw2NDM0MV0sMTY2MjpbNjQzNDIsNjQzNDMsNjQzNDQsNjQzNDVdLDE2NjM6WzY0MzU0LDY0MzU1LDY0MzU2LDY0MzU3XSwxNjY0Ols2NDM0Niw2NDM0Nyw2NDM0OCw2NDM0OV0sMTY2NzpbNjQzNzQsNjQzNzUsNjQzNzYsNjQzNzddLDE2Njg6WzY0MzcwLDY0MzcxLDY0MzcyLDY0MzczXSwxNjcwOls2NDM3OCw2NDM3OSw2NDM4MCw2NDM4MV0sMTY3MTpbNjQzODIsNjQzODMsNjQzODQsNjQzODVdLDE2NzI6WzY0MzkyLDY0MzkzXSwxNjc2Ols2NDM4OCw2NDM4OV0sMTY3NzpbNjQzODYsNjQzODddLDE2Nzg6WzY0MzkwLDY0MzkxXSwxNjgxOls2NDM5Niw2NDM5N10sMTY4ODpbNjQzOTQsNjQzOTVdLDE3MDA6WzY0MzYyLDY0MzYzLDY0MzY0LDY0MzY1XSwxNzAyOls2NDM2Niw2NDM2Nyw2NDM2OCw2NDM2OV0sMTcwNTpbNjQzOTgsNjQzOTksNjQ0MDAsNjQ0MDFdLDE3MDk6WzY0NDY3LDY0NDY4LDY0NDY5LDY0NDcwXSwxNzExOls2NDQwMiw2NDQwMyw2NDQwNCw2NDQwNV0sMTcxMzpbNjQ0MTAsNjQ0MTEsNjQ0MTIsNjQ0MTNdLDE3MTU6WzY0NDA2LDY0NDA3LDY0NDA4LDY0NDA5XSwxNzIyOls2NDQxNCw2NDQxNV0sMTcyMzpbNjQ0MTYsNjQ0MTcsNjQ0MTgsNjQ0MTldLDE3MjY6WzY0NDI2LDY0NDI3LDY0NDI4LDY0NDI5XSwxNzI4Ols2NDQyMCw2NDQyMV0sMTcyOTpbNjQ0MjIsNjQ0MjMsNjQ0MjQsNjQ0MjVdLDE3MzM6WzY0NDgwLDY0NDgxXSwxNzM0Ols2NDQ3Myw2NDQ3NF0sMTczNTpbNjQ0NzEsNjQ0NzJdLDE3MzY6WzY0NDc1LDY0NDc2XSwxNzM3Ols2NDQ4Miw2NDQ4M10sMTczOTpbNjQ0NzgsNjQ0NzldLDE3NDA6WzY0NTA4LDY0NTA5LDY0NTEwLDY0NTExXSwxNzQ0Ols2NDQ4NCw2NDQ4NSw2NDQ4Niw2NDQ4N10sMTc0NjpbNjQ0MzAsNjQ0MzFdLDE3NDc6WzY0NDMyLDY0NDMzXX0scj17NjUyNDc6ezY1MTU0OjY1MjY5LDY1MTU2OjY1MjcxLDY1MTYwOjY1MjczLDY1MTY2OjY1Mjc1fSw2NTI0ODp7NjUxNTQ6NjUyNzAsNjUxNTY6NjUyNzIsNjUxNjA6NjUyNzQsNjUxNjY6NjUyNzZ9LDY1MTY1Ons2NTI0Nzp7NjUyNDg6ezY1MjU4OjY1MDEwfX19LDE2MTc6ezE2MTI6NjQ2MDYsMTYxMzo2NDYwNywxNjE0OjY0NjA4LDE2MTU6NjQ2MDksMTYxNjo2NDYxMH19LG49ezE2MTI6NjQ2MDYsMTYxMzo2NDYwNywxNjE0OjY0NjA4LDE2MTU6NjQ2MDksMTYxNjo2NDYxMH0saT1bMTU3MCwxNTcxLDE1NzMsMTU3NV07dC5fX2FyYWJpY1BhcnNlcl9fPXt9O3ZhciBhPXQuX19hcmFiaWNQYXJzZXJfXy5pc0luQXJhYmljU3Vic3RpdHV0aW9uQT1mdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwIT09ZVt0LmNoYXJDb2RlQXQoMCldfSxvPXQuX19hcmFiaWNQYXJzZXJfXy5pc0FyYWJpY0xldHRlcj1mdW5jdGlvbih0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQmJi9eW1x1MDYwMC1cdTA2RkZcdTA3NTAtXHUwNzdGXHUwOEEwLVx1MDhGRlx1RkI1MC1cdUZERkZcdUZFNzAtXHVGRUZGXSskLy50ZXN0KHQpfSxzPXQuX19hcmFiaWNQYXJzZXJfXy5pc0FyYWJpY0VuZExldHRlcj1mdW5jdGlvbih0KXtyZXR1cm4gbyh0KSYmYSh0KSYmZVt0LmNoYXJDb2RlQXQoMCldLmxlbmd0aDw9Mn0sYz10Ll9fYXJhYmljUGFyc2VyX18uaXNBcmFiaWNBbGZMZXR0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIG8odCkmJmkuaW5kZXhPZih0LmNoYXJDb2RlQXQoMCkpPj0wfTt0Ll9fYXJhYmljUGFyc2VyX18uYXJhYmljTGV0dGVySGFzSXNvbGF0ZWRGb3JtPWZ1bmN0aW9uKHQpe3JldHVybiBvKHQpJiZhKHQpJiZlW3QuY2hhckNvZGVBdCgwKV0ubGVuZ3RoPj0xfTt2YXIgdT10Ll9fYXJhYmljUGFyc2VyX18uYXJhYmljTGV0dGVySGFzRmluYWxGb3JtPWZ1bmN0aW9uKHQpe3JldHVybiBvKHQpJiZhKHQpJiZlW3QuY2hhckNvZGVBdCgwKV0ubGVuZ3RoPj0yfTt0Ll9fYXJhYmljUGFyc2VyX18uYXJhYmljTGV0dGVySGFzSW5pdGlhbEZvcm09ZnVuY3Rpb24odCl7cmV0dXJuIG8odCkmJmEodCkmJmVbdC5jaGFyQ29kZUF0KDApXS5sZW5ndGg+PTN9O3ZhciBsPXQuX19hcmFiaWNQYXJzZXJfXy5hcmFiaWNMZXR0ZXJIYXNNZWRpYWxGb3JtPWZ1bmN0aW9uKHQpe3JldHVybiBvKHQpJiZhKHQpJiY0PT1lW3QuY2hhckNvZGVBdCgwKV0ubGVuZ3RofSxoPXQuX19hcmFiaWNQYXJzZXJfXy5yZXNvbHZlTGlnYXR1cmVzPWZ1bmN0aW9uKHQpe3ZhciBlPTAsbj1yLGk9IiIsYT0wO2ZvcihlPTA7ZTx0Lmxlbmd0aDtlKz0xKXZvaWQgMCE9PW5bdC5jaGFyQ29kZUF0KGUpXT8oYSsrLCJudW1iZXIiPT10eXBlb2Yobj1uW3QuY2hhckNvZGVBdChlKV0pJiYoaSs9U3RyaW5nLmZyb21DaGFyQ29kZShuKSxuPXIsYT0wKSxlPT09dC5sZW5ndGgtMSYmKG49cixpKz10LmNoYXJBdChlLShhLTEpKSxlLT1hLTEsYT0wKSk6KG49cixpKz10LmNoYXJBdChlLWEpLGUtPWEsYT0wKTtyZXR1cm4gaX07dC5fX2FyYWJpY1BhcnNlcl9fLmlzQXJhYmljRGlhY3JpdGljPWZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDAhPT10JiZ2b2lkIDAhPT1uW3QuY2hhckNvZGVBdCgwKV19O3ZhciBmPXQuX19hcmFiaWNQYXJzZXJfXy5nZXRDb3JyZWN0Rm9ybT1mdW5jdGlvbih0LGUscil7cmV0dXJuIG8odCk/ITE9PT1hKHQpPy0xOiF1KHQpfHwhbyhlKSYmIW8ocil8fCFvKHIpJiZzKGUpfHxzKHQpJiYhbyhlKXx8cyh0KSYmYyhlKXx8cyh0KSYmcyhlKT8wOmwodCkmJm8oZSkmJiFzKGUpJiZvKHIpJiZ1KHIpPzM6cyh0KXx8IW8ocik/MToyOi0xfSxkPWZ1bmN0aW9uKHQpe3ZhciByPTAsbj0wLGk9MCxhPSIiLHM9IiIsYz0iIix1PSh0PXR8fCIiKS5zcGxpdCgiXFxzKyIpLGw9W107Zm9yKHI9MDtyPHUubGVuZ3RoO3IrPTEpe2ZvcihsLnB1c2goIiIpLG49MDtuPHVbcl0ubGVuZ3RoO24rPTEpYT11W3JdW25dLHM9dVtyXVtuLTFdLGM9dVtyXVtuKzFdLG8oYSk/KGk9ZihhLHMsYyksbFtyXSs9LTEhPT1pP1N0cmluZy5mcm9tQ2hhckNvZGUoZVthLmNoYXJDb2RlQXQoMCldW2ldKTphKTpsW3JdKz1hO2xbcl09aChsW3JdKX1yZXR1cm4gbC5qb2luKCIgIil9LHA9dC5fX2FyYWJpY1BhcnNlcl9fLnByb2Nlc3NBcmFiaWM9dC5wcm9jZXNzQXJhYmljPWZ1bmN0aW9uKCl7dmFyIHQsZT0ic3RyaW5nIj09dHlwZW9mIGFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06YXJndW1lbnRzWzBdLnRleHQscj1bXTtpZihBcnJheS5pc0FycmF5KGUpKXt2YXIgbj0wO2ZvcihyPVtdLG49MDtuPGUubGVuZ3RoO24rPTEpQXJyYXkuaXNBcnJheShlW25dKT9yLnB1c2goW2QoZVtuXVswXSksZVtuXVsxXSxlW25dWzJdXSk6ci5wdXNoKFtkKGVbbl0pXSk7dD1yfWVsc2UgdD1kKGUpO3JldHVybiJzdHJpbmciPT10eXBlb2YgYXJndW1lbnRzWzBdP3Q6KGFyZ3VtZW50c1swXS50ZXh0PXQsYXJndW1lbnRzWzBdKX07dC5ldmVudHMucHVzaChbInByZVByb2Nlc3NUZXh0IixwXSl9KE0uQVBJKSwKLyoqIEBsaWNlbnNlCiAgICoganNQREYgQXV0b3ByaW50IFBsdWdpbgogICAqCiAgICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLgogICAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZQogICAqLwpmdW5jdGlvbih0KXt0LmF1dG9QcmludD1mdW5jdGlvbih0KXt2YXIgZTtzd2l0Y2goKHQ9dHx8e30pLnZhcmlhbnQ9dC52YXJpYW50fHwibm9uLWNvbmZvcm0iLHQudmFyaWFudCl7Y2FzZSJqYXZhc2NyaXB0Ijp0aGlzLmFkZEpTKCJwcmludCh7fSk7Iik7YnJlYWs7Y2FzZSJub24tY29uZm9ybSI6ZGVmYXVsdDp0aGlzLmludGVybmFsLmV2ZW50cy5zdWJzY3JpYmUoInBvc3RQdXRSZXNvdXJjZXMiLChmdW5jdGlvbigpe2U9dGhpcy5pbnRlcm5hbC5uZXdPYmplY3QoKSx0aGlzLmludGVybmFsLm91dCgiPDwiKSx0aGlzLmludGVybmFsLm91dCgiL1MgL05hbWVkIiksdGhpcy5pbnRlcm5hbC5vdXQoIi9UeXBlIC9BY3Rpb24iKSx0aGlzLmludGVybmFsLm91dCgiL04gL1ByaW50IiksdGhpcy5pbnRlcm5hbC5vdXQoIj4+IiksdGhpcy5pbnRlcm5hbC5vdXQoImVuZG9iaiIpfSkpLHRoaXMuaW50ZXJuYWwuZXZlbnRzLnN1YnNjcmliZSgicHV0Q2F0YWxvZyIsKGZ1bmN0aW9uKCl7dGhpcy5pbnRlcm5hbC5vdXQoIi9PcGVuQWN0aW9uICIrZSsiIDAgUiIpfSkpfXJldHVybiB0aGlzfX0oTS5BUEkpLAovKioKICAgKiBAbGljZW5zZQogICAqIENvcHlyaWdodCAoYykgMjAxNCBTdGV2ZW4gU3B1bmdpbiAoVHdlbHZlVG9uZSBMTEMpICBzdGV2ZW5AdHdlbHZldG9uZS50dgogICAqCiAgICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLgogICAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZQogICAqLwpmdW5jdGlvbih0KXt2YXIgZT1mdW5jdGlvbigpe3ZhciB0PXZvaWQgMDtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywicGRmIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHR9LHNldDpmdW5jdGlvbihlKXt0PWV9fSk7dmFyIGU9MTUwO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJ3aWR0aCIse2dldDpmdW5jdGlvbigpe3JldHVybiBlfSxzZXQ6ZnVuY3Rpb24odCl7ZT1pc05hTih0KXx8ITE9PT1OdW1iZXIuaXNJbnRlZ2VyKHQpfHx0PDA/MTUwOnQsdGhpcy5nZXRDb250ZXh0KCIyZCIpLnBhZ2VXcmFwWEVuYWJsZWQmJih0aGlzLmdldENvbnRleHQoIjJkIikucGFnZVdyYXBYPWUrMSl9fSk7dmFyIHI9MzAwO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJoZWlnaHQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gcn0sc2V0OmZ1bmN0aW9uKHQpe3I9aXNOYU4odCl8fCExPT09TnVtYmVyLmlzSW50ZWdlcih0KXx8dDwwPzMwMDp0LHRoaXMuZ2V0Q29udGV4dCgiMmQiKS5wYWdlV3JhcFlFbmFibGVkJiYodGhpcy5nZXRDb250ZXh0KCIyZCIpLnBhZ2VXcmFwWT1yKzEpfX0pO3ZhciBuPVtdO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJjaGlsZE5vZGVzIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG59LHNldDpmdW5jdGlvbih0KXtuPXR9fSk7dmFyIGk9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInN0eWxlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGl9LHNldDpmdW5jdGlvbih0KXtpPXR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInBhcmVudE5vZGUiLHt9KX07ZS5wcm90b3R5cGUuZ2V0Q29udGV4dD1mdW5jdGlvbih0LGUpe3ZhciByO2lmKCIyZCIhPT0odD10fHwiMmQiKSlyZXR1cm4gbnVsbDtmb3IociBpbiBlKXRoaXMucGRmLmNvbnRleHQyZC5oYXNPd25Qcm9wZXJ0eShyKSYmKHRoaXMucGRmLmNvbnRleHQyZFtyXT1lW3JdKTtyZXR1cm4gdGhpcy5wZGYuY29udGV4dDJkLl9jYW52YXM9dGhpcyx0aGlzLnBkZi5jb250ZXh0MmR9LGUucHJvdG90eXBlLnRvRGF0YVVSTD1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigidG9EYXRhVVJMIGlzIG5vdCBpbXBsZW1lbnRlZC4iKX0sdC5ldmVudHMucHVzaChbImluaXRpYWxpemVkIixmdW5jdGlvbigpe3RoaXMuY2FudmFzPW5ldyBlLHRoaXMuY2FudmFzLnBkZj10aGlzfV0pfShNLkFQSSksZnVuY3Rpb24odCl7dmFyIHI9e2xlZnQ6MCx0b3A6MCxib3R0b206MCxyaWdodDowfSxuPSExLGk9ZnVuY3Rpb24oKXt2b2lkIDA9PT10aGlzLmludGVybmFsLl9fY2VsbF9fJiYodGhpcy5pbnRlcm5hbC5fX2NlbGxfXz17fSx0aGlzLmludGVybmFsLl9fY2VsbF9fLnBhZGRpbmc9Myx0aGlzLmludGVybmFsLl9fY2VsbF9fLmhlYWRlckZ1bmN0aW9uPXZvaWQgMCx0aGlzLmludGVybmFsLl9fY2VsbF9fLm1hcmdpbnM9T2JqZWN0LmFzc2lnbih7fSxyKSx0aGlzLmludGVybmFsLl9fY2VsbF9fLm1hcmdpbnMud2lkdGg9dGhpcy5nZXRQYWdlV2lkdGgoKSxhLmNhbGwodGhpcykpfSxhPWZ1bmN0aW9uKCl7dGhpcy5pbnRlcm5hbC5fX2NlbGxfXy5sYXN0Q2VsbD1uZXcgbyx0aGlzLmludGVybmFsLl9fY2VsbF9fLnBhZ2VzPTF9LG89ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHNbMF07T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIngiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0fSxzZXQ6ZnVuY3Rpb24oZSl7dD1lfX0pO3ZhciBlPWFyZ3VtZW50c1sxXTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywieSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGV9LHNldDpmdW5jdGlvbih0KXtlPXR9fSk7dmFyIHI9YXJndW1lbnRzWzJdO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJ3aWR0aCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHJ9LHNldDpmdW5jdGlvbih0KXtyPXR9fSk7dmFyIG49YXJndW1lbnRzWzNdO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJoZWlnaHQiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBufSxzZXQ6ZnVuY3Rpb24odCl7bj10fX0pO3ZhciBpPWFyZ3VtZW50c1s0XTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywidGV4dCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGl9LHNldDpmdW5jdGlvbih0KXtpPXR9fSk7dmFyIGE9YXJndW1lbnRzWzVdO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJsaW5lTnVtYmVyIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYX0sc2V0OmZ1bmN0aW9uKHQpe2E9dH19KTt2YXIgbz1hcmd1bWVudHNbNl07cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJhbGlnbiIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG99LHNldDpmdW5jdGlvbih0KXtvPXR9fSksdGhpc307by5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG8odGhpcy54LHRoaXMueSx0aGlzLndpZHRoLHRoaXMuaGVpZ2h0LHRoaXMudGV4dCx0aGlzLmxpbmVOdW1iZXIsdGhpcy5hbGlnbil9LG8ucHJvdG90eXBlLnRvQXJyYXk9ZnVuY3Rpb24oKXtyZXR1cm5bdGhpcy54LHRoaXMueSx0aGlzLndpZHRoLHRoaXMuaGVpZ2h0LHRoaXMudGV4dCx0aGlzLmxpbmVOdW1iZXIsdGhpcy5hbGlnbl19LHQuc2V0SGVhZGVyRnVuY3Rpb249ZnVuY3Rpb24odCl7cmV0dXJuIGkuY2FsbCh0aGlzKSx0aGlzLmludGVybmFsLl9fY2VsbF9fLmhlYWRlckZ1bmN0aW9uPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6dm9pZCAwLHRoaXN9LHQuZ2V0VGV4dERpbWVuc2lvbnM9ZnVuY3Rpb24odCxlKXtpLmNhbGwodGhpcyk7dmFyIHI9KGU9ZXx8e30pLmZvbnRTaXplfHx0aGlzLmdldEZvbnRTaXplKCksbj1lLmZvbnR8fHRoaXMuZ2V0Rm9udCgpLGE9ZS5zY2FsZUZhY3Rvcnx8dGhpcy5pbnRlcm5hbC5zY2FsZUZhY3RvcixvPTAscz0wLGM9MCx1PXRoaXM7aWYoIUFycmF5LmlzQXJyYXkodCkmJiJzdHJpbmciIT10eXBlb2YgdCl7aWYoIm51bWJlciIhPXR5cGVvZiB0KXRocm93IG5ldyBFcnJvcigiZ2V0VGV4dERpbWVuc2lvbnMgZXhwZWN0cyB0ZXh0LXBhcmFtZXRlciB0byBiZSBvZiB0eXBlIFN0cmluZyBvciB0eXBlIE51bWJlciBvciBhbiBBcnJheSBvZiBTdHJpbmdzLiIpO3Q9U3RyaW5nKHQpfXZhciBsPWUubWF4V2lkdGg7bD4wPyJzdHJpbmciPT10eXBlb2YgdD90PXRoaXMuc3BsaXRUZXh0VG9TaXplKHQsbCk6IltvYmplY3QgQXJyYXldIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KSYmKHQ9dC5yZWR1Y2UoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuY29uY2F0KHUuc3BsaXRUZXh0VG9TaXplKGUsbCkpfSksW10pKTp0PUFycmF5LmlzQXJyYXkodCk/dDpbdF07Zm9yKHZhciBoPTA7aDx0Lmxlbmd0aDtoKyspbzwoYz10aGlzLmdldFN0cmluZ1VuaXRXaWR0aCh0W2hdLHtmb250Om59KSpyKSYmKG89Yyk7cmV0dXJuIDAhPT1vJiYocz10Lmxlbmd0aCkse3c6by89YSxoOk1hdGgubWF4KChzKnIqdGhpcy5nZXRMaW5lSGVpZ2h0RmFjdG9yKCktcioodGhpcy5nZXRMaW5lSGVpZ2h0RmFjdG9yKCktMSkpL2EsMCl9fSx0LmNlbGxBZGRQYWdlPWZ1bmN0aW9uKCl7aS5jYWxsKHRoaXMpLHRoaXMuYWRkUGFnZSgpO3ZhciB0PXRoaXMuaW50ZXJuYWwuX19jZWxsX18ubWFyZ2luc3x8cjtyZXR1cm4gdGhpcy5pbnRlcm5hbC5fX2NlbGxfXy5sYXN0Q2VsbD1uZXcgbyh0LmxlZnQsdC50b3Asdm9pZCAwLHZvaWQgMCksdGhpcy5pbnRlcm5hbC5fX2NlbGxfXy5wYWdlcys9MSx0aGlzfTt2YXIgcz10LmNlbGw9ZnVuY3Rpb24oKXt2YXIgdDt0PWFyZ3VtZW50c1swXWluc3RhbmNlb2Ygbz9hcmd1bWVudHNbMF06bmV3IG8oYXJndW1lbnRzWzBdLGFyZ3VtZW50c1sxXSxhcmd1bWVudHNbMl0sYXJndW1lbnRzWzNdLGFyZ3VtZW50c1s0XSxhcmd1bWVudHNbNV0pLGkuY2FsbCh0aGlzKTt2YXIgZT10aGlzLmludGVybmFsLl9fY2VsbF9fLmxhc3RDZWxsLGE9dGhpcy5pbnRlcm5hbC5fX2NlbGxfXy5wYWRkaW5nLHM9dGhpcy5pbnRlcm5hbC5fX2NlbGxfXy5tYXJnaW5zfHxyLGM9dGhpcy5pbnRlcm5hbC5fX2NlbGxfXy50YWJsZUhlYWRlclJvdyx1PXRoaXMuaW50ZXJuYWwuX19jZWxsX18ucHJpbnRIZWFkZXJzO3JldHVybiB2b2lkIDAhPT1lLmxpbmVOdW1iZXImJihlLmxpbmVOdW1iZXI9PT10LmxpbmVOdW1iZXI/KHQueD0oZS54fHwwKSsoZS53aWR0aHx8MCksdC55PWUueXx8MCk6ZS55K2UuaGVpZ2h0K3QuaGVpZ2h0K3MuYm90dG9tPnRoaXMuZ2V0UGFnZUhlaWdodCgpPyh0aGlzLmNlbGxBZGRQYWdlKCksdC55PXMudG9wLHUmJmMmJih0aGlzLnByaW50SGVhZGVyUm93KHQubGluZU51bWJlciwhMCksdC55Kz1jWzBdLmhlaWdodCkpOnQueT1lLnkrZS5oZWlnaHR8fHQueSksdm9pZCAwIT09dC50ZXh0WzBdJiYodGhpcy5yZWN0KHQueCx0LnksdC53aWR0aCx0LmhlaWdodCwhMD09PW4/IkZEIjp2b2lkIDApLCJyaWdodCI9PT10LmFsaWduP3RoaXMudGV4dCh0LnRleHQsdC54K3Qud2lkdGgtYSx0LnkrYSx7YWxpZ246InJpZ2h0IixiYXNlbGluZToidG9wIn0pOiJjZW50ZXIiPT09dC5hbGlnbj90aGlzLnRleHQodC50ZXh0LHQueCt0LndpZHRoLzIsdC55K2Ese2FsaWduOiJjZW50ZXIiLGJhc2VsaW5lOiJ0b3AiLG1heFdpZHRoOnQud2lkdGgtYS1hfSk6dGhpcy50ZXh0KHQudGV4dCx0LngrYSx0LnkrYSx7YWxpZ246ImxlZnQiLGJhc2VsaW5lOiJ0b3AiLG1heFdpZHRoOnQud2lkdGgtYS1hfSkpLHRoaXMuaW50ZXJuYWwuX19jZWxsX18ubGFzdENlbGw9dCx0aGlzfTt0LnRhYmxlPWZ1bmN0aW9uKHQsbix1LGwsaCl7aWYoaS5jYWxsKHRoaXMpLCF1KXRocm93IG5ldyBFcnJvcigiTm8gZGF0YSBmb3IgUERGIHRhYmxlLiIpO3ZhciBmLGQscCxnLG09W10sdj1bXSxiPVtdLHk9e30sdz17fSxOPVtdLEw9W10sQT0oaD1ofHx7fSkuYXV0b1NpemV8fCExLHg9ITEhPT1oLnByaW50SGVhZGVycyxTPWguY3NzJiZ2b2lkIDAhPT1oLmNzc1siZm9udC1zaXplIl0/MTYqaC5jc3NbImZvbnQtc2l6ZSJdOmguZm9udFNpemV8fDEyLF89aC5tYXJnaW5zfHxPYmplY3QuYXNzaWduKHt3aWR0aDp0aGlzLmdldFBhZ2VXaWR0aCgpfSxyKSxQPSJudW1iZXIiPT10eXBlb2YgaC5wYWRkaW5nP2gucGFkZGluZzozLGs9aC5oZWFkZXJCYWNrZ3JvdW5kQ29sb3J8fCIjYzhjOGM4IixGPWguaGVhZGVyVGV4dENvbG9yfHwiIzAwMCI7aWYoYS5jYWxsKHRoaXMpLHRoaXMuaW50ZXJuYWwuX19jZWxsX18ucHJpbnRIZWFkZXJzPXgsdGhpcy5pbnRlcm5hbC5fX2NlbGxfXy5tYXJnaW5zPV8sdGhpcy5pbnRlcm5hbC5fX2NlbGxfXy50YWJsZV9mb250X3NpemU9Uyx0aGlzLmludGVybmFsLl9fY2VsbF9fLnBhZGRpbmc9UCx0aGlzLmludGVybmFsLl9fY2VsbF9fLmhlYWRlckJhY2tncm91bmRDb2xvcj1rLHRoaXMuaW50ZXJuYWwuX19jZWxsX18uaGVhZGVyVGV4dENvbG9yPUYsdGhpcy5zZXRGb250U2l6ZShTKSxudWxsPT1sKXY9bT1PYmplY3Qua2V5cyh1WzBdKSxiPW0ubWFwKChmdW5jdGlvbigpe3JldHVybiJsZWZ0In0pKTtlbHNlIGlmKEFycmF5LmlzQXJyYXkobCkmJiJvYmplY3QiPT09ZShsWzBdKSlmb3IobT1sLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQubmFtZX0pKSx2PWwubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC5wcm9tcHR8fHQubmFtZXx8IiJ9KSksYj1sLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuYWxpZ258fCJsZWZ0In0pKSxmPTA7ZjxsLmxlbmd0aDtmKz0xKXdbbFtmXS5uYW1lXT1sW2ZdLndpZHRoKigxOS4wNDk5NzYvMjUuNCk7ZWxzZSBBcnJheS5pc0FycmF5KGwpJiYic3RyaW5nIj09dHlwZW9mIGxbMF0mJih2PW09bCxiPW0ubWFwKChmdW5jdGlvbigpe3JldHVybiJsZWZ0In0pKSk7aWYoQXx8QXJyYXkuaXNBcnJheShsKSYmInN0cmluZyI9PXR5cGVvZiBsWzBdKWZvcihmPTA7ZjxtLmxlbmd0aDtmKz0xKXtmb3IoeVtnPW1bZl1dPXUubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdFtnXX0pKSx0aGlzLnNldEZvbnQodm9pZCAwLCJib2xkIiksTi5wdXNoKHRoaXMuZ2V0VGV4dERpbWVuc2lvbnModltmXSx7Zm9udFNpemU6dGhpcy5pbnRlcm5hbC5fX2NlbGxfXy50YWJsZV9mb250X3NpemUsc2NhbGVGYWN0b3I6dGhpcy5pbnRlcm5hbC5zY2FsZUZhY3Rvcn0pLncpLGQ9eVtnXSx0aGlzLnNldEZvbnQodm9pZCAwLCJub3JtYWwiKSxwPTA7cDxkLmxlbmd0aDtwKz0xKU4ucHVzaCh0aGlzLmdldFRleHREaW1lbnNpb25zKGRbcF0se2ZvbnRTaXplOnRoaXMuaW50ZXJuYWwuX19jZWxsX18udGFibGVfZm9udF9zaXplLHNjYWxlRmFjdG9yOnRoaXMuaW50ZXJuYWwuc2NhbGVGYWN0b3J9KS53KTt3W2ddPU1hdGgubWF4LmFwcGx5KG51bGwsTikrUCtQLE49W119aWYoeCl7dmFyIEk9e307Zm9yKGY9MDtmPG0ubGVuZ3RoO2YrPTEpSVttW2ZdXT17fSxJW21bZl1dLnRleHQ9dltmXSxJW21bZl1dLmFsaWduPWJbZl07dmFyIEM9Yy5jYWxsKHRoaXMsSSx3KTtMPW0ubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gbmV3IG8odCxuLHdbZV0sQyxJW2VdLnRleHQsdm9pZCAwLElbZV0uYWxpZ24pfSkpLHRoaXMuc2V0VGFibGVIZWFkZXJSb3coTCksdGhpcy5wcmludEhlYWRlclJvdygxLCExKX12YXIgaj1sLnJlZHVjZSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdFtlLm5hbWVdPWUuYWxpZ24sdH0pLHt9KTtmb3IoZj0wO2Y8dS5sZW5ndGg7Zis9MSl7InJvd1N0YXJ0ImluIGgmJmgucm93U3RhcnQgaW5zdGFuY2VvZiBGdW5jdGlvbiYmaC5yb3dTdGFydCh7cm93OmYsZGF0YTp1W2ZdfSx0aGlzKTt2YXIgTz1jLmNhbGwodGhpcyx1W2ZdLHcpO2ZvcihwPTA7cDxtLmxlbmd0aDtwKz0xKXt2YXIgQj11W2ZdW21bcF1dOyJjZWxsU3RhcnQiaW4gaCYmaC5jZWxsU3RhcnQgaW5zdGFuY2VvZiBGdW5jdGlvbiYmaC5jZWxsU3RhcnQoe3JvdzpmLGNvbDpwLGRhdGE6Qn0sdGhpcykscy5jYWxsKHRoaXMsbmV3IG8odCxuLHdbbVtwXV0sTyxCLGYrMixqW21bcF1dKSl9fXJldHVybiB0aGlzLmludGVybmFsLl9fY2VsbF9fLnRhYmxlX3g9dCx0aGlzLmludGVybmFsLl9fY2VsbF9fLnRhYmxlX3k9bix0aGlzfTt2YXIgYz1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuaW50ZXJuYWwuX19jZWxsX18ucGFkZGluZyxuPXRoaXMuaW50ZXJuYWwuX19jZWxsX18udGFibGVfZm9udF9zaXplLGk9dGhpcy5pbnRlcm5hbC5zY2FsZUZhY3RvcjtyZXR1cm4gT2JqZWN0LmtleXModCkubWFwKChmdW5jdGlvbihuKXt2YXIgaT10W25dO3JldHVybiB0aGlzLnNwbGl0VGV4dFRvU2l6ZShpLmhhc093blByb3BlcnR5KCJ0ZXh0Iik/aS50ZXh0OmksZVtuXS1yLXIpfSksdGhpcykubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5nZXRMaW5lSGVpZ2h0RmFjdG9yKCkqdC5sZW5ndGgqbi9pK3Ircn0pLHRoaXMpLnJlZHVjZSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gTWF0aC5tYXgodCxlKX0pLDApfTt0LnNldFRhYmxlSGVhZGVyUm93PWZ1bmN0aW9uKHQpe2kuY2FsbCh0aGlzKSx0aGlzLmludGVybmFsLl9fY2VsbF9fLnRhYmxlSGVhZGVyUm93PXR9LHQucHJpbnRIZWFkZXJSb3c9ZnVuY3Rpb24odCxlKXtpZihpLmNhbGwodGhpcyksIXRoaXMuaW50ZXJuYWwuX19jZWxsX18udGFibGVIZWFkZXJSb3cpdGhyb3cgbmV3IEVycm9yKCJQcm9wZXJ0eSB0YWJsZUhlYWRlclJvdyBkb2VzIG5vdCBleGlzdC4iKTt2YXIgcjtpZihuPSEwLCJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmludGVybmFsLl9fY2VsbF9fLmhlYWRlckZ1bmN0aW9uKXt2YXIgYT10aGlzLmludGVybmFsLl9fY2VsbF9fLmhlYWRlckZ1bmN0aW9uKHRoaXMsdGhpcy5pbnRlcm5hbC5fX2NlbGxfXy5wYWdlcyk7dGhpcy5pbnRlcm5hbC5fX2NlbGxfXy5sYXN0Q2VsbD1uZXcgbyhhWzBdLGFbMV0sYVsyXSxhWzNdLHZvaWQgMCwtMSl9dGhpcy5zZXRGb250KHZvaWQgMCwiYm9sZCIpO2Zvcih2YXIgYz1bXSx1PTA7dTx0aGlzLmludGVybmFsLl9fY2VsbF9fLnRhYmxlSGVhZGVyUm93Lmxlbmd0aDt1Kz0xKXtyPXRoaXMuaW50ZXJuYWwuX19jZWxsX18udGFibGVIZWFkZXJSb3dbdV0uY2xvbmUoKSxlJiYoci55PXRoaXMuaW50ZXJuYWwuX19jZWxsX18ubWFyZ2lucy50b3B8fDAsYy5wdXNoKHIpKSxyLmxpbmVOdW1iZXI9dDt2YXIgbD10aGlzLmdldFRleHRDb2xvcigpO3RoaXMuc2V0VGV4dENvbG9yKHRoaXMuaW50ZXJuYWwuX19jZWxsX18uaGVhZGVyVGV4dENvbG9yKSx0aGlzLnNldEZpbGxDb2xvcih0aGlzLmludGVybmFsLl9fY2VsbF9fLmhlYWRlckJhY2tncm91bmRDb2xvcikscy5jYWxsKHRoaXMsciksdGhpcy5zZXRUZXh0Q29sb3IobCl9Yy5sZW5ndGg+MCYmdGhpcy5zZXRUYWJsZUhlYWRlclJvdyhjKSx0aGlzLnNldEZvbnQodm9pZCAwLCJub3JtYWwiKSxuPSExfX0oTS5BUEkpO3ZhciBfdD17aXRhbGljOlsiaXRhbGljIiwib2JsaXF1ZSIsIm5vcm1hbCJdLG9ibGlxdWU6WyJvYmxpcXVlIiwiaXRhbGljIiwibm9ybWFsIl0sbm9ybWFsOlsibm9ybWFsIiwib2JsaXF1ZSIsIml0YWxpYyJdfSxQdD1bInVsdHJhLWNvbmRlbnNlZCIsImV4dHJhLWNvbmRlbnNlZCIsImNvbmRlbnNlZCIsInNlbWktY29uZGVuc2VkIiwibm9ybWFsIiwic2VtaS1leHBhbmRlZCIsImV4cGFuZGVkIiwiZXh0cmEtZXhwYW5kZWQiLCJ1bHRyYS1leHBhbmRlZCJdLGt0PVN0KFB0KSxGdD1bMTAwLDIwMCwzMDAsNDAwLDUwMCw2MDAsNzAwLDgwMCw5MDBdLEl0PVN0KEZ0KTtmdW5jdGlvbiBDdCh0KXt2YXIgZT10LmZhbWlseS5yZXBsYWNlKC8ifCcvZywiIikudG9Mb3dlckNhc2UoKSxyPWZ1bmN0aW9uKHQpe3JldHVybiBfdFt0PXR8fCJub3JtYWwiXT90OiJub3JtYWwifSh0LnN0eWxlKSxuPWZ1bmN0aW9uKHQpe2lmKCF0KXJldHVybiA0MDA7aWYoIm51bWJlciI9PXR5cGVvZiB0KXJldHVybiB0Pj0xMDAmJnQ8PTkwMCYmdCUxMDA9PTA/dDo0MDA7aWYoL15cZDAwJC8udGVzdCh0KSlyZXR1cm4gcGFyc2VJbnQodCk7c3dpdGNoKHQpe2Nhc2UiYm9sZCI6cmV0dXJuIDcwMDtjYXNlIm5vcm1hbCI6ZGVmYXVsdDpyZXR1cm4gNDAwfX0odC53ZWlnaHQpLGk9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBrdFt0PXR8fCJub3JtYWwiXT90OiJub3JtYWwifSh0LnN0cmV0Y2gpO3JldHVybntmYW1pbHk6ZSxzdHlsZTpyLHdlaWdodDpuLHN0cmV0Y2g6aSxzcmM6dC5zcmN8fFtdLHJlZjp0LnJlZnx8e25hbWU6ZSxzdHlsZTpbaSxyLG5dLmpvaW4oIiAiKX19fWZ1bmN0aW9uIGp0KHQsZSxyLG4pe3ZhciBpO2ZvcihpPXI7aT49MCYmaTxlLmxlbmd0aDtpKz1uKWlmKHRbZVtpXV0pcmV0dXJuIHRbZVtpXV07Zm9yKGk9cjtpPj0wJiZpPGUubGVuZ3RoO2ktPW4paWYodFtlW2ldXSlyZXR1cm4gdFtlW2ldXX12YXIgT3Q9eyJzYW5zLXNlcmlmIjoiaGVsdmV0aWNhIixmaXhlZDoiY291cmllciIsbW9ub3NwYWNlOiJjb3VyaWVyIix0ZXJtaW5hbDoiY291cmllciIsY3Vyc2l2ZToidGltZXMiLGZhbnRhc3k6InRpbWVzIixzZXJpZjoidGltZXMifSxCdD17Y2FwdGlvbjoidGltZXMiLGljb246InRpbWVzIixtZW51OiJ0aW1lcyIsIm1lc3NhZ2UtYm94IjoidGltZXMiLCJzbWFsbC1jYXB0aW9uIjoidGltZXMiLCJzdGF0dXMtYmFyIjoidGltZXMifTtmdW5jdGlvbiBNdCh0KXtyZXR1cm5bdC5zdHJldGNoLHQuc3R5bGUsdC53ZWlnaHQsdC5mYW1pbHldLmpvaW4oIiAiKX1mdW5jdGlvbiBFdCh0LGUscil7Zm9yKHZhciBuPShyPXJ8fHt9KS5kZWZhdWx0Rm9udEZhbWlseXx8InRpbWVzIixpPU9iamVjdC5hc3NpZ24oe30sT3Qsci5nZW5lcmljRm9udEZhbWlsaWVzfHx7fSksYT1udWxsLG89bnVsbCxzPTA7czxlLmxlbmd0aDsrK3MpaWYoaVsoYT1DdChlW3NdKSkuZmFtaWx5XSYmKGEuZmFtaWx5PWlbYS5mYW1pbHldKSx0Lmhhc093blByb3BlcnR5KGEuZmFtaWx5KSl7bz10W2EuZmFtaWx5XTticmVha31pZighKG89b3x8dFtuXSkpdGhyb3cgbmV3IEVycm9yKCJDb3VsZCBub3QgZmluZCBhIGZvbnQtZmFtaWx5IGZvciB0aGUgcnVsZSAnIitNdChhKSsiJyBhbmQgZGVmYXVsdCBmYW1pbHkgJyIrbisiJy4iKTtpZihvPWZ1bmN0aW9uKHQsZSl7aWYoZVt0XSlyZXR1cm4gZVt0XTt2YXIgcj1rdFt0XSxuPXI8PWt0Lm5vcm1hbD8tMToxLGk9anQoZSxQdCxyLG4pO2lmKCFpKXRocm93IG5ldyBFcnJvcigiQ291bGQgbm90IGZpbmQgYSBtYXRjaGluZyBmb250LXN0cmV0Y2ggdmFsdWUgZm9yICIrdCk7cmV0dXJuIGl9KGEuc3RyZXRjaCxvKSxvPWZ1bmN0aW9uKHQsZSl7aWYoZVt0XSlyZXR1cm4gZVt0XTtmb3IodmFyIHI9X3RbdF0sbj0wO248ci5sZW5ndGg7KytuKWlmKGVbcltuXV0pcmV0dXJuIGVbcltuXV07dGhyb3cgbmV3IEVycm9yKCJDb3VsZCBub3QgZmluZCBhIG1hdGNoaW5nIGZvbnQtc3R5bGUgZm9yICIrdCl9KGEuc3R5bGUsbyksIShvPWZ1bmN0aW9uKHQsZSl7aWYoZVt0XSlyZXR1cm4gZVt0XTtpZig0MDA9PT10JiZlWzUwMF0pcmV0dXJuIGVbNTAwXTtpZig1MDA9PT10JiZlWzQwMF0pcmV0dXJuIGVbNDAwXTt2YXIgcj1JdFt0XSxuPWp0KGUsRnQscix0PDQwMD8tMToxKTtpZighbil0aHJvdyBuZXcgRXJyb3IoIkNvdWxkIG5vdCBmaW5kIGEgbWF0Y2hpbmcgZm9udC13ZWlnaHQgZm9yIHZhbHVlICIrdCk7cmV0dXJuIG59KGEud2VpZ2h0LG8pKSl0aHJvdyBuZXcgRXJyb3IoIkZhaWxlZCB0byByZXNvbHZlIGEgZm9udCBmb3IgdGhlIHJ1bGUgJyIrTXQoYSkrIicuIik7cmV0dXJuIG99ZnVuY3Rpb24gcXQodCl7cmV0dXJuIHQudHJpbUxlZnQoKX1mdW5jdGlvbiBEdCh0LGUpe2Zvcih2YXIgcj0wO3I8dC5sZW5ndGg7KXtpZih0LmNoYXJBdChyKT09PWUpcmV0dXJuW3Quc3Vic3RyaW5nKDAsciksdC5zdWJzdHJpbmcocisxKV07cis9MX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBSdCh0KXt2YXIgZT10Lm1hdGNoKC9eKC1bYS16X118W2Etel9dKVthLXowLTlfLV0qL2kpO3JldHVybiBudWxsPT09ZT9udWxsOltlWzBdLHQuc3Vic3RyaW5nKGVbMF0ubGVuZ3RoKV19dmFyIFR0PVsidGltZXMiXTshZnVuY3Rpb24odCl7dmFyIHIsbixhLG8scyxjLHUsbCxmLGQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9dHx8e30sdGhpcy5pc1N0cm9rZVRyYW5zcGFyZW50PXQuaXNTdHJva2VUcmFuc3BhcmVudHx8ITEsdGhpcy5zdHJva2VPcGFjaXR5PXQuc3Ryb2tlT3BhY2l0eXx8MSx0aGlzLnN0cm9rZVN0eWxlPXQuc3Ryb2tlU3R5bGV8fCIjMDAwMDAwIix0aGlzLmZpbGxTdHlsZT10LmZpbGxTdHlsZXx8IiMwMDAwMDAiLHRoaXMuaXNGaWxsVHJhbnNwYXJlbnQ9dC5pc0ZpbGxUcmFuc3BhcmVudHx8ITEsdGhpcy5maWxsT3BhY2l0eT10LmZpbGxPcGFjaXR5fHwxLHRoaXMuZm9udD10LmZvbnR8fCIxMHB4IHNhbnMtc2VyaWYiLHRoaXMudGV4dEJhc2VsaW5lPXQudGV4dEJhc2VsaW5lfHwiYWxwaGFiZXRpYyIsdGhpcy50ZXh0QWxpZ249dC50ZXh0QWxpZ258fCJsZWZ0Iix0aGlzLmxpbmVXaWR0aD10LmxpbmVXaWR0aHx8MSx0aGlzLmxpbmVKb2luPXQubGluZUpvaW58fCJtaXRlciIsdGhpcy5saW5lQ2FwPXQubGluZUNhcHx8ImJ1dHQiLHRoaXMucGF0aD10LnBhdGh8fFtdLHRoaXMudHJhbnNmb3JtPXZvaWQgMCE9PXQudHJhbnNmb3JtP3QudHJhbnNmb3JtLmNsb25lKCk6bmV3IGwsdGhpcy5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb258fCJub3JtYWwiLHRoaXMuZ2xvYmFsQWxwaGE9dC5nbG9iYWxBbHBoYXx8MSx0aGlzLmNsaXBfcGF0aD10LmNsaXBfcGF0aHx8W10sdGhpcy5jdXJyZW50UG9pbnQ9dC5jdXJyZW50UG9pbnR8fG5ldyBjLHRoaXMubWl0ZXJMaW1pdD10Lm1pdGVyTGltaXR8fDEwLHRoaXMubGFzdFBvaW50PXQubGFzdFBvaW50fHxuZXcgYyx0aGlzLmxpbmVEYXNoT2Zmc2V0PXQubGluZURhc2hPZmZzZXR8fDAsdGhpcy5saW5lRGFzaD10LmxpbmVEYXNofHxbXSx0aGlzLm1hcmdpbj10Lm1hcmdpbnx8WzAsMCwwLDBdLHRoaXMucHJldlBhZ2VMYXN0RWxlbU9mZnNldD10LnByZXZQYWdlTGFzdEVsZW1PZmZzZXR8fDAsdGhpcy5pZ25vcmVDbGVhclJlY3Q9ImJvb2xlYW4iIT10eXBlb2YgdC5pZ25vcmVDbGVhclJlY3R8fHQuaWdub3JlQ2xlYXJSZWN0LHRoaXN9O3QuZXZlbnRzLnB1c2goWyJpbml0aWFsaXplZCIsZnVuY3Rpb24oKXt0aGlzLmNvbnRleHQyZD1uZXcgcCh0aGlzKSxyPXRoaXMuaW50ZXJuYWwuZjIsbj10aGlzLmludGVybmFsLmdldENvb3JkaW5hdGVTdHJpbmcsYT10aGlzLmludGVybmFsLmdldFZlcnRpY2FsQ29vcmRpbmF0ZVN0cmluZyxvPXRoaXMuaW50ZXJuYWwuZ2V0SG9yaXpvbnRhbENvb3JkaW5hdGUscz10aGlzLmludGVybmFsLmdldFZlcnRpY2FsQ29vcmRpbmF0ZSxjPXRoaXMuaW50ZXJuYWwuUG9pbnQsdT10aGlzLmludGVybmFsLlJlY3RhbmdsZSxsPXRoaXMuaW50ZXJuYWwuTWF0cml4LGY9bmV3IGR9XSk7dmFyIHA9ZnVuY3Rpb24odCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImNhbnZhcyIse2dldDpmdW5jdGlvbigpe3JldHVybntwYXJlbnROb2RlOiExLHN0eWxlOiExfX19KTt2YXIgZT10O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJwZGYiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZX19KTt2YXIgcj0hMTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywicGFnZVdyYXBYRW5hYmxlZCIse2dldDpmdW5jdGlvbigpe3JldHVybiByfSxzZXQ6ZnVuY3Rpb24odCl7cj1Cb29sZWFuKHQpfX0pO3ZhciBuPSExO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJwYWdlV3JhcFlFbmFibGVkIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG59LHNldDpmdW5jdGlvbih0KXtuPUJvb2xlYW4odCl9fSk7dmFyIGk9MDtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywicG9zWCIse2dldDpmdW5jdGlvbigpe3JldHVybiBpfSxzZXQ6ZnVuY3Rpb24odCl7aXNOYU4odCl8fChpPXQpfX0pO3ZhciBhPTA7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInBvc1kiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYX0sc2V0OmZ1bmN0aW9uKHQpe2lzTmFOKHQpfHwoYT10KX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywibWFyZ2luIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGYubWFyZ2lufSxzZXQ6ZnVuY3Rpb24odCl7dmFyIGU7Im51bWJlciI9PXR5cGVvZiB0P2U9W3QsdCx0LHRdOigoZT1uZXcgQXJyYXkoNCkpWzBdPXRbMF0sZVsxXT10Lmxlbmd0aD49Mj90WzFdOmVbMF0sZVsyXT10Lmxlbmd0aD49Mz90WzJdOmVbMF0sZVszXT10Lmxlbmd0aD49ND90WzNdOmVbMV0pLGYubWFyZ2luPWV9fSk7dmFyIG89ITE7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImF1dG9QYWdpbmciLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gb30sc2V0OmZ1bmN0aW9uKHQpe289dH19KTt2YXIgcz0wO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJsYXN0QnJlYWsiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gc30sc2V0OmZ1bmN0aW9uKHQpe3M9dH19KTt2YXIgYz1bXTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywicGFnZUJyZWFrcyIse2dldDpmdW5jdGlvbigpe3JldHVybiBjfSxzZXQ6ZnVuY3Rpb24odCl7Yz10fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJjdHgiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZn0sc2V0OmZ1bmN0aW9uKHQpe3QgaW5zdGFuY2VvZiBkJiYoZj10KX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywicGF0aCIse2dldDpmdW5jdGlvbigpe3JldHVybiBmLnBhdGh9LHNldDpmdW5jdGlvbih0KXtmLnBhdGg9dH19KTt2YXIgdT1bXTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiY3R4U3RhY2siLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdX0sc2V0OmZ1bmN0aW9uKHQpe3U9dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiZmlsbFN0eWxlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY3R4LmZpbGxTdHlsZX0sc2V0OmZ1bmN0aW9uKHQpe3ZhciBlO2U9Zyh0KSx0aGlzLmN0eC5maWxsU3R5bGU9ZS5zdHlsZSx0aGlzLmN0eC5pc0ZpbGxUcmFuc3BhcmVudD0wPT09ZS5hLHRoaXMuY3R4LmZpbGxPcGFjaXR5PWUuYSx0aGlzLnBkZi5zZXRGaWxsQ29sb3IoZS5yLGUuZyxlLmIse2E6ZS5hfSksdGhpcy5wZGYuc2V0VGV4dENvbG9yKGUucixlLmcsZS5iLHthOmUuYX0pfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJzdHJva2VTdHlsZSIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmN0eC5zdHJva2VTdHlsZX0sc2V0OmZ1bmN0aW9uKHQpe3ZhciBlPWcodCk7dGhpcy5jdHguc3Ryb2tlU3R5bGU9ZS5zdHlsZSx0aGlzLmN0eC5pc1N0cm9rZVRyYW5zcGFyZW50PTA9PT1lLmEsdGhpcy5jdHguc3Ryb2tlT3BhY2l0eT1lLmEsMD09PWUuYT90aGlzLnBkZi5zZXREcmF3Q29sb3IoMjU1LDI1NSwyNTUpOihlLmEsdGhpcy5wZGYuc2V0RHJhd0NvbG9yKGUucixlLmcsZS5iKSl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImxpbmVDYXAiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jdHgubGluZUNhcH0sc2V0OmZ1bmN0aW9uKHQpey0xIT09WyJidXR0Iiwicm91bmQiLCJzcXVhcmUiXS5pbmRleE9mKHQpJiYodGhpcy5jdHgubGluZUNhcD10LHRoaXMucGRmLnNldExpbmVDYXAodCkpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJsaW5lV2lkdGgiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jdHgubGluZVdpZHRofSxzZXQ6ZnVuY3Rpb24odCl7aXNOYU4odCl8fCh0aGlzLmN0eC5saW5lV2lkdGg9dCx0aGlzLnBkZi5zZXRMaW5lV2lkdGgodCkpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJsaW5lSm9pbiIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmN0eC5saW5lSm9pbn0sc2V0OmZ1bmN0aW9uKHQpey0xIT09WyJiZXZlbCIsInJvdW5kIiwibWl0ZXIiXS5pbmRleE9mKHQpJiYodGhpcy5jdHgubGluZUpvaW49dCx0aGlzLnBkZi5zZXRMaW5lSm9pbih0KSl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIm1pdGVyTGltaXQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jdHgubWl0ZXJMaW1pdH0sc2V0OmZ1bmN0aW9uKHQpe2lzTmFOKHQpfHwodGhpcy5jdHgubWl0ZXJMaW1pdD10LHRoaXMucGRmLnNldE1pdGVyTGltaXQodCkpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJ0ZXh0QmFzZWxpbmUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jdHgudGV4dEJhc2VsaW5lfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5jdHgudGV4dEJhc2VsaW5lPXR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInRleHRBbGlnbiIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmN0eC50ZXh0QWxpZ259LHNldDpmdW5jdGlvbih0KXstMSE9PVsicmlnaHQiLCJlbmQiLCJjZW50ZXIiLCJsZWZ0Iiwic3RhcnQiXS5pbmRleE9mKHQpJiYodGhpcy5jdHgudGV4dEFsaWduPXQpfX0pO3ZhciBsPW51bGw7ZnVuY3Rpb24gaCh0LGUpe2lmKG51bGw9PT1sKXt2YXIgcj1mdW5jdGlvbih0KXt2YXIgZT1bXTtyZXR1cm4gT2JqZWN0LmtleXModCkuZm9yRWFjaCgoZnVuY3Rpb24ocil7dFtyXS5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgbj1udWxsO3N3aXRjaCh0KXtjYXNlImJvbGQiOm49e2ZhbWlseTpyLHdlaWdodDoiYm9sZCJ9O2JyZWFrO2Nhc2UiaXRhbGljIjpuPXtmYW1pbHk6cixzdHlsZToiaXRhbGljIn07YnJlYWs7Y2FzZSJib2xkaXRhbGljIjpuPXtmYW1pbHk6cix3ZWlnaHQ6ImJvbGQiLHN0eWxlOiJpdGFsaWMifTticmVhaztjYXNlIiI6Y2FzZSJub3JtYWwiOm49e2ZhbWlseTpyfX1udWxsIT09biYmKG4ucmVmPXtuYW1lOnIsc3R5bGU6dH0sZS5wdXNoKG4pKX0pKX0pKSxlfSh0LmdldEZvbnRMaXN0KCkpO2w9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXt9LHI9MDtyPHQubGVuZ3RoOysrcil7dmFyIG49Q3QodFtyXSksaT1uLmZhbWlseSxhPW4uc3RyZXRjaCxvPW4uc3R5bGUscz1uLndlaWdodDtlW2ldPWVbaV18fHt9LGVbaV1bYV09ZVtpXVthXXx8e30sZVtpXVthXVtvXT1lW2ldW2FdW29dfHx7fSxlW2ldW2FdW29dW3NdPW59cmV0dXJuIGV9KHIuY29uY2F0KGUpKX1yZXR1cm4gbH12YXIgcD1udWxsO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJmb250RmFjZXMiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gcH0sc2V0OmZ1bmN0aW9uKHQpe2w9bnVsbCxwPXR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImZvbnQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jdHguZm9udH0sc2V0OmZ1bmN0aW9uKHQpe3ZhciBlO2lmKHRoaXMuY3R4LmZvbnQ9dCxudWxsIT09KGU9L15ccyooPz0oPzooPzpbLWEtel0rXHMqKXswLDJ9KGl0YWxpY3xvYmxpcXVlKSk/KSg/PSg/Oig/OlstYS16XStccyopezAsMn0oc21hbGwtY2FwcykpPykoPz0oPzooPzpbLWEtel0rXHMqKXswLDJ9KGJvbGQoPzplcik/fGxpZ2h0ZXJ8WzEtOV0wMCkpPykoPzooPzpub3JtYWx8XDF8XDJ8XDMpXHMqKXswLDN9KCg/Onh4Py0pPyg/OnNtYWxsfGxhcmdlKXxtZWRpdW18c21hbGxlcnxsYXJnZXJ8Wy5cZF0rKD86XCV8aW58W2NlbV1tfGV4fHBbY3R4XSkpKD86XHMqXC9ccyoobm9ybWFsfFsuXGRdKyg/OlwlfGlufFtjZW1dbXxleHxwW2N0eF0pKSk/XHMqKFstXyxcIlwnXHNhLXpdKz8pXHMqJC9pLmV4ZWModCkpKXt2YXIgcj1lWzFdLG49KGVbMl0sZVszXSksaT1lWzRdLGE9KGVbNV0sZVs2XSksbz0vXihbLlxkXSspKCg/OiV8aW58W2NlbV1tfGV4fHBbY3R4XSkpJC9pLmV4ZWMoaSlbMl07aT0icHgiPT09bz9NYXRoLmZsb29yKHBhcnNlRmxvYXQoaSkqdGhpcy5wZGYuaW50ZXJuYWwuc2NhbGVGYWN0b3IpOiJlbSI9PT1vP01hdGguZmxvb3IocGFyc2VGbG9hdChpKSp0aGlzLnBkZi5nZXRGb250U2l6ZSgpKTpNYXRoLmZsb29yKHBhcnNlRmxvYXQoaSkqdGhpcy5wZGYuaW50ZXJuYWwuc2NhbGVGYWN0b3IpLHRoaXMucGRmLnNldEZvbnRTaXplKGkpO3ZhciBzPWZ1bmN0aW9uKHQpe3ZhciBlLHIsbj1bXSxpPXQudHJpbSgpO2lmKCIiPT09aSlyZXR1cm4gVHQ7aWYoaSBpbiBCdClyZXR1cm5bQnRbaV1dO2Zvcig7IiIhPT1pOyl7c3dpdGNoKHI9bnVsbCxlPShpPXF0KGkpKS5jaGFyQXQoMCkpe2Nhc2UnIic6Y2FzZSInIjpyPUR0KGkuc3Vic3RyaW5nKDEpLGUpO2JyZWFrO2RlZmF1bHQ6cj1SdChpKX1pZihudWxsPT09cilyZXR1cm4gVHQ7aWYobi5wdXNoKHJbMF0pLCIiIT09KGk9cXQoclsxXSkpJiYiLCIhPT1pLmNoYXJBdCgwKSlyZXR1cm4gVHQ7aT1pLnJlcGxhY2UoL14sLywiIil9cmV0dXJuIG59KGEpO2lmKHRoaXMuZm9udEZhY2VzKXt2YXIgYz1FdChoKHRoaXMucGRmLHRoaXMuZm9udEZhY2VzKSxzLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJue2ZhbWlseTp0LHN0cmV0Y2g6Im5vcm1hbCIsd2VpZ2h0Om4sc3R5bGU6cn19KSkpO3RoaXMucGRmLnNldEZvbnQoYy5yZWYubmFtZSxjLnJlZi5zdHlsZSl9ZWxzZXt2YXIgdT0iIjsoImJvbGQiPT09bnx8cGFyc2VJbnQobiwxMCk+PTcwMHx8ImJvbGQiPT09cikmJih1PSJib2xkIiksIml0YWxpYyI9PT1yJiYodSs9Iml0YWxpYyIpLDA9PT11Lmxlbmd0aCYmKHU9Im5vcm1hbCIpO2Zvcih2YXIgbD0iIixmPXthcmlhbDoiSGVsdmV0aWNhIixBcmlhbDoiSGVsdmV0aWNhIix2ZXJkYW5hOiJIZWx2ZXRpY2EiLFZlcmRhbmE6IkhlbHZldGljYSIsaGVsdmV0aWNhOiJIZWx2ZXRpY2EiLEhlbHZldGljYToiSGVsdmV0aWNhIiwic2Fucy1zZXJpZiI6IkhlbHZldGljYSIsZml4ZWQ6IkNvdXJpZXIiLG1vbm9zcGFjZToiQ291cmllciIsdGVybWluYWw6IkNvdXJpZXIiLGN1cnNpdmU6IlRpbWVzIixmYW50YXN5OiJUaW1lcyIsc2VyaWY6IlRpbWVzIn0sZD0wO2Q8cy5sZW5ndGg7ZCsrKXtpZih2b2lkIDAhPT10aGlzLnBkZi5pbnRlcm5hbC5nZXRGb250KHNbZF0sdSx7bm9GYWxsYmFjazohMCxkaXNhYmxlV2FybmluZzohMH0pKXtsPXNbZF07YnJlYWt9aWYoImJvbGRpdGFsaWMiPT09dSYmdm9pZCAwIT09dGhpcy5wZGYuaW50ZXJuYWwuZ2V0Rm9udChzW2RdLCJib2xkIix7bm9GYWxsYmFjazohMCxkaXNhYmxlV2FybmluZzohMH0pKWw9c1tkXSx1PSJib2xkIjtlbHNlIGlmKHZvaWQgMCE9PXRoaXMucGRmLmludGVybmFsLmdldEZvbnQoc1tkXSwibm9ybWFsIix7bm9GYWxsYmFjazohMCxkaXNhYmxlV2FybmluZzohMH0pKXtsPXNbZF0sdT0ibm9ybWFsIjticmVha319aWYoIiI9PT1sKWZvcih2YXIgcD0wO3A8cy5sZW5ndGg7cCsrKWlmKGZbc1twXV0pe2w9ZltzW3BdXTticmVha31sPSIiPT09bD8iVGltZXMiOmwsdGhpcy5wZGYuc2V0Rm9udChsLHUpfX19fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb259LHNldDpmdW5jdGlvbih0KXt0aGlzLmN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiZ2xvYmFsQWxwaGEiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jdHguZ2xvYmFsQWxwaGF9LHNldDpmdW5jdGlvbih0KXt0aGlzLmN0eC5nbG9iYWxBbHBoYT10fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJsaW5lRGFzaE9mZnNldCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmN0eC5saW5lRGFzaE9mZnNldH0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuY3R4LmxpbmVEYXNoT2Zmc2V0PXQsVC5jYWxsKHRoaXMpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJsaW5lRGFzaCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmN0eC5saW5lRGFzaH0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuY3R4LmxpbmVEYXNoPXQsVC5jYWxsKHRoaXMpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZ25vcmVDbGVhclJlY3QiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jdHguaWdub3JlQ2xlYXJSZWN0fSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5jdHguaWdub3JlQ2xlYXJSZWN0PUJvb2xlYW4odCl9fSl9O3AucHJvdG90eXBlLnNldExpbmVEYXNoPWZ1bmN0aW9uKHQpe3RoaXMubGluZURhc2g9dH0scC5wcm90b3R5cGUuZ2V0TGluZURhc2g9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5saW5lRGFzaC5sZW5ndGglMj90aGlzLmxpbmVEYXNoLmNvbmNhdCh0aGlzLmxpbmVEYXNoKTp0aGlzLmxpbmVEYXNoLnNsaWNlKCl9LHAucHJvdG90eXBlLmZpbGw9ZnVuY3Rpb24oKXtBLmNhbGwodGhpcywiZmlsbCIsITEpfSxwLnByb3RvdHlwZS5zdHJva2U9ZnVuY3Rpb24oKXtBLmNhbGwodGhpcywic3Ryb2tlIiwhMSl9LHAucHJvdG90eXBlLmJlZ2luUGF0aD1mdW5jdGlvbigpe3RoaXMucGF0aD1be3R5cGU6ImJlZ2luIn1dfSxwLnByb3RvdHlwZS5tb3ZlVG89ZnVuY3Rpb24odCxlKXtpZihpc05hTih0KXx8aXNOYU4oZSkpdGhyb3cgaS5lcnJvcigianNQREYuY29udGV4dDJkLm1vdmVUbzogSW52YWxpZCBhcmd1bWVudHMiLGFyZ3VtZW50cyksbmV3IEVycm9yKCJJbnZhbGlkIGFyZ3VtZW50cyBwYXNzZWQgdG8ganNQREYuY29udGV4dDJkLm1vdmVUbyIpO3ZhciByPXRoaXMuY3R4LnRyYW5zZm9ybS5hcHBseVRvUG9pbnQobmV3IGModCxlKSk7dGhpcy5wYXRoLnB1c2goe3R5cGU6Im10Iix4OnIueCx5OnIueX0pLHRoaXMuY3R4Lmxhc3RQb2ludD1uZXcgYyh0LGUpfSxwLnByb3RvdHlwZS5jbG9zZVBhdGg9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgYygwLDApLHI9MDtmb3Iocj10aGlzLnBhdGgubGVuZ3RoLTE7LTEhPT1yO3ItLSlpZigiYmVnaW4iPT09dGhpcy5wYXRoW3JdLnR5cGUmJiJvYmplY3QiPT09ZSh0aGlzLnBhdGhbcisxXSkmJiJudW1iZXIiPT10eXBlb2YgdGhpcy5wYXRoW3IrMV0ueCl7dD1uZXcgYyh0aGlzLnBhdGhbcisxXS54LHRoaXMucGF0aFtyKzFdLnkpO2JyZWFrfXRoaXMucGF0aC5wdXNoKHt0eXBlOiJjbG9zZSJ9KSx0aGlzLmN0eC5sYXN0UG9pbnQ9bmV3IGModC54LHQueSl9LHAucHJvdG90eXBlLmxpbmVUbz1mdW5jdGlvbih0LGUpe2lmKGlzTmFOKHQpfHxpc05hTihlKSl0aHJvdyBpLmVycm9yKCJqc1BERi5jb250ZXh0MmQubGluZVRvOiBJbnZhbGlkIGFyZ3VtZW50cyIsYXJndW1lbnRzKSxuZXcgRXJyb3IoIkludmFsaWQgYXJndW1lbnRzIHBhc3NlZCB0byBqc1BERi5jb250ZXh0MmQubGluZVRvIik7dmFyIHI9dGhpcy5jdHgudHJhbnNmb3JtLmFwcGx5VG9Qb2ludChuZXcgYyh0LGUpKTt0aGlzLnBhdGgucHVzaCh7dHlwZToibHQiLHg6ci54LHk6ci55fSksdGhpcy5jdHgubGFzdFBvaW50PW5ldyBjKHIueCxyLnkpfSxwLnByb3RvdHlwZS5jbGlwPWZ1bmN0aW9uKCl7dGhpcy5jdHguY2xpcF9wYXRoPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5wYXRoKSksQS5jYWxsKHRoaXMsbnVsbCwhMCl9LHAucHJvdG90eXBlLnF1YWRyYXRpY0N1cnZlVG89ZnVuY3Rpb24odCxlLHIsbil7aWYoaXNOYU4ocil8fGlzTmFOKG4pfHxpc05hTih0KXx8aXNOYU4oZSkpdGhyb3cgaS5lcnJvcigianNQREYuY29udGV4dDJkLnF1YWRyYXRpY0N1cnZlVG86IEludmFsaWQgYXJndW1lbnRzIixhcmd1bWVudHMpLG5ldyBFcnJvcigiSW52YWxpZCBhcmd1bWVudHMgcGFzc2VkIHRvIGpzUERGLmNvbnRleHQyZC5xdWFkcmF0aWNDdXJ2ZVRvIik7dmFyIGE9dGhpcy5jdHgudHJhbnNmb3JtLmFwcGx5VG9Qb2ludChuZXcgYyhyLG4pKSxvPXRoaXMuY3R4LnRyYW5zZm9ybS5hcHBseVRvUG9pbnQobmV3IGModCxlKSk7dGhpcy5wYXRoLnB1c2goe3R5cGU6InFjdCIseDE6by54LHkxOm8ueSx4OmEueCx5OmEueX0pLHRoaXMuY3R4Lmxhc3RQb2ludD1uZXcgYyhhLngsYS55KX0scC5wcm90b3R5cGUuYmV6aWVyQ3VydmVUbz1mdW5jdGlvbih0LGUscixuLGEsbyl7aWYoaXNOYU4oYSl8fGlzTmFOKG8pfHxpc05hTih0KXx8aXNOYU4oZSl8fGlzTmFOKHIpfHxpc05hTihuKSl0aHJvdyBpLmVycm9yKCJqc1BERi5jb250ZXh0MmQuYmV6aWVyQ3VydmVUbzogSW52YWxpZCBhcmd1bWVudHMiLGFyZ3VtZW50cyksbmV3IEVycm9yKCJJbnZhbGlkIGFyZ3VtZW50cyBwYXNzZWQgdG8ganNQREYuY29udGV4dDJkLmJlemllckN1cnZlVG8iKTt2YXIgcz10aGlzLmN0eC50cmFuc2Zvcm0uYXBwbHlUb1BvaW50KG5ldyBjKGEsbykpLHU9dGhpcy5jdHgudHJhbnNmb3JtLmFwcGx5VG9Qb2ludChuZXcgYyh0LGUpKSxsPXRoaXMuY3R4LnRyYW5zZm9ybS5hcHBseVRvUG9pbnQobmV3IGMocixuKSk7dGhpcy5wYXRoLnB1c2goe3R5cGU6ImJjdCIseDE6dS54LHkxOnUueSx4MjpsLngseTI6bC55LHg6cy54LHk6cy55fSksdGhpcy5jdHgubGFzdFBvaW50PW5ldyBjKHMueCxzLnkpfSxwLnByb3RvdHlwZS5hcmM9ZnVuY3Rpb24odCxlLHIsbixhLG8pe2lmKGlzTmFOKHQpfHxpc05hTihlKXx8aXNOYU4ocil8fGlzTmFOKG4pfHxpc05hTihhKSl0aHJvdyBpLmVycm9yKCJqc1BERi5jb250ZXh0MmQuYXJjOiBJbnZhbGlkIGFyZ3VtZW50cyIsYXJndW1lbnRzKSxuZXcgRXJyb3IoIkludmFsaWQgYXJndW1lbnRzIHBhc3NlZCB0byBqc1BERi5jb250ZXh0MmQuYXJjIik7aWYobz1Cb29sZWFuKG8pLCF0aGlzLmN0eC50cmFuc2Zvcm0uaXNJZGVudGl0eSl7dmFyIHM9dGhpcy5jdHgudHJhbnNmb3JtLmFwcGx5VG9Qb2ludChuZXcgYyh0LGUpKTt0PXMueCxlPXMueTt2YXIgdT10aGlzLmN0eC50cmFuc2Zvcm0uYXBwbHlUb1BvaW50KG5ldyBjKDAscikpLGw9dGhpcy5jdHgudHJhbnNmb3JtLmFwcGx5VG9Qb2ludChuZXcgYygwLDApKTtyPU1hdGguc3FydChNYXRoLnBvdyh1LngtbC54LDIpK01hdGgucG93KHUueS1sLnksMikpfU1hdGguYWJzKGEtbik+PTIqTWF0aC5QSSYmKG49MCxhPTIqTWF0aC5QSSksdGhpcy5wYXRoLnB1c2goe3R5cGU6ImFyYyIseDp0LHk6ZSxyYWRpdXM6cixzdGFydEFuZ2xlOm4sZW5kQW5nbGU6YSxjb3VudGVyY2xvY2t3aXNlOm99KX0scC5wcm90b3R5cGUuYXJjVG89ZnVuY3Rpb24odCxlLHIsbixpKXt0aHJvdyBuZXcgRXJyb3IoImFyY1RvIG5vdCBpbXBsZW1lbnRlZC4iKX0scC5wcm90b3R5cGUucmVjdD1mdW5jdGlvbih0LGUscixuKXtpZihpc05hTih0KXx8aXNOYU4oZSl8fGlzTmFOKHIpfHxpc05hTihuKSl0aHJvdyBpLmVycm9yKCJqc1BERi5jb250ZXh0MmQucmVjdDogSW52YWxpZCBhcmd1bWVudHMiLGFyZ3VtZW50cyksbmV3IEVycm9yKCJJbnZhbGlkIGFyZ3VtZW50cyBwYXNzZWQgdG8ganNQREYuY29udGV4dDJkLnJlY3QiKTt0aGlzLm1vdmVUbyh0LGUpLHRoaXMubGluZVRvKHQrcixlKSx0aGlzLmxpbmVUbyh0K3IsZStuKSx0aGlzLmxpbmVUbyh0LGUrbiksdGhpcy5saW5lVG8odCxlKSx0aGlzLmxpbmVUbyh0K3IsZSksdGhpcy5saW5lVG8odCxlKX0scC5wcm90b3R5cGUuZmlsbFJlY3Q9ZnVuY3Rpb24odCxlLHIsbil7aWYoaXNOYU4odCl8fGlzTmFOKGUpfHxpc05hTihyKXx8aXNOYU4obikpdGhyb3cgaS5lcnJvcigianNQREYuY29udGV4dDJkLmZpbGxSZWN0OiBJbnZhbGlkIGFyZ3VtZW50cyIsYXJndW1lbnRzKSxuZXcgRXJyb3IoIkludmFsaWQgYXJndW1lbnRzIHBhc3NlZCB0byBqc1BERi5jb250ZXh0MmQuZmlsbFJlY3QiKTtpZighbS5jYWxsKHRoaXMpKXt2YXIgYT17fTsiYnV0dCIhPT10aGlzLmxpbmVDYXAmJihhLmxpbmVDYXA9dGhpcy5saW5lQ2FwLHRoaXMubGluZUNhcD0iYnV0dCIpLCJtaXRlciIhPT10aGlzLmxpbmVKb2luJiYoYS5saW5lSm9pbj10aGlzLmxpbmVKb2luLHRoaXMubGluZUpvaW49Im1pdGVyIiksdGhpcy5iZWdpblBhdGgoKSx0aGlzLnJlY3QodCxlLHIsbiksdGhpcy5maWxsKCksYS5oYXNPd25Qcm9wZXJ0eSgibGluZUNhcCIpJiYodGhpcy5saW5lQ2FwPWEubGluZUNhcCksYS5oYXNPd25Qcm9wZXJ0eSgibGluZUpvaW4iKSYmKHRoaXMubGluZUpvaW49YS5saW5lSm9pbil9fSxwLnByb3RvdHlwZS5zdHJva2VSZWN0PWZ1bmN0aW9uKHQsZSxyLG4pe2lmKGlzTmFOKHQpfHxpc05hTihlKXx8aXNOYU4ocil8fGlzTmFOKG4pKXRocm93IGkuZXJyb3IoImpzUERGLmNvbnRleHQyZC5zdHJva2VSZWN0OiBJbnZhbGlkIGFyZ3VtZW50cyIsYXJndW1lbnRzKSxuZXcgRXJyb3IoIkludmFsaWQgYXJndW1lbnRzIHBhc3NlZCB0byBqc1BERi5jb250ZXh0MmQuc3Ryb2tlUmVjdCIpO3YuY2FsbCh0aGlzKXx8KHRoaXMuYmVnaW5QYXRoKCksdGhpcy5yZWN0KHQsZSxyLG4pLHRoaXMuc3Ryb2tlKCkpfSxwLnByb3RvdHlwZS5jbGVhclJlY3Q9ZnVuY3Rpb24odCxlLHIsbil7aWYoaXNOYU4odCl8fGlzTmFOKGUpfHxpc05hTihyKXx8aXNOYU4obikpdGhyb3cgaS5lcnJvcigianNQREYuY29udGV4dDJkLmNsZWFyUmVjdDogSW52YWxpZCBhcmd1bWVudHMiLGFyZ3VtZW50cyksbmV3IEVycm9yKCJJbnZhbGlkIGFyZ3VtZW50cyBwYXNzZWQgdG8ganNQREYuY29udGV4dDJkLmNsZWFyUmVjdCIpO3RoaXMuaWdub3JlQ2xlYXJSZWN0fHwodGhpcy5maWxsU3R5bGU9IiNmZmZmZmYiLHRoaXMuZmlsbFJlY3QodCxlLHIsbikpfSxwLnByb3RvdHlwZS5zYXZlPWZ1bmN0aW9uKHQpe3Q9ImJvb2xlYW4iIT10eXBlb2YgdHx8dDtmb3IodmFyIGU9dGhpcy5wZGYuaW50ZXJuYWwuZ2V0Q3VycmVudFBhZ2VJbmZvKCkucGFnZU51bWJlcixyPTA7cjx0aGlzLnBkZi5pbnRlcm5hbC5nZXROdW1iZXJPZlBhZ2VzKCk7cisrKXRoaXMucGRmLnNldFBhZ2UocisxKSx0aGlzLnBkZi5pbnRlcm5hbC5vdXQoInEiKTtpZih0aGlzLnBkZi5zZXRQYWdlKGUpLHQpe3RoaXMuY3R4LmZvbnRTaXplPXRoaXMucGRmLmludGVybmFsLmdldEZvbnRTaXplKCk7dmFyIG49bmV3IGQodGhpcy5jdHgpO3RoaXMuY3R4U3RhY2sucHVzaCh0aGlzLmN0eCksdGhpcy5jdHg9bn19LHAucHJvdG90eXBlLnJlc3RvcmU9ZnVuY3Rpb24odCl7dD0iYm9vbGVhbiIhPXR5cGVvZiB0fHx0O2Zvcih2YXIgZT10aGlzLnBkZi5pbnRlcm5hbC5nZXRDdXJyZW50UGFnZUluZm8oKS5wYWdlTnVtYmVyLHI9MDtyPHRoaXMucGRmLmludGVybmFsLmdldE51bWJlck9mUGFnZXMoKTtyKyspdGhpcy5wZGYuc2V0UGFnZShyKzEpLHRoaXMucGRmLmludGVybmFsLm91dCgiUSIpO3RoaXMucGRmLnNldFBhZ2UoZSksdCYmMCE9PXRoaXMuY3R4U3RhY2subGVuZ3RoJiYodGhpcy5jdHg9dGhpcy5jdHhTdGFjay5wb3AoKSx0aGlzLmZpbGxTdHlsZT10aGlzLmN0eC5maWxsU3R5bGUsdGhpcy5zdHJva2VTdHlsZT10aGlzLmN0eC5zdHJva2VTdHlsZSx0aGlzLmZvbnQ9dGhpcy5jdHguZm9udCx0aGlzLmxpbmVDYXA9dGhpcy5jdHgubGluZUNhcCx0aGlzLmxpbmVXaWR0aD10aGlzLmN0eC5saW5lV2lkdGgsdGhpcy5saW5lSm9pbj10aGlzLmN0eC5saW5lSm9pbix0aGlzLmxpbmVEYXNoPXRoaXMuY3R4LmxpbmVEYXNoLHRoaXMubGluZURhc2hPZmZzZXQ9dGhpcy5jdHgubGluZURhc2hPZmZzZXQpfSxwLnByb3RvdHlwZS50b0RhdGFVUkw9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoInRvRGF0YVVybCBub3QgaW1wbGVtZW50ZWQuIil9O3ZhciBnPWZ1bmN0aW9uKHQpe3ZhciBlLHIsbixpO2lmKCEwPT09dC5pc0NhbnZhc0dyYWRpZW50JiYodD10LmdldENvbG9yKCkpLCF0KXJldHVybntyOjAsZzowLGI6MCxhOjAsc3R5bGU6dH07aWYoL3RyYW5zcGFyZW50fHJnYmFccypcKFxzKihcZCspXHMqLFxzKihcZCspXHMqLFxzKihcZCspXHMqLFxzKjArXHMqXCkvLnRlc3QodCkpZT0wLHI9MCxuPTAsaT0wO2Vsc2V7dmFyIGE9L3JnYlxzKlwoXHMqKFxkKylccyosXHMqKFxkKylccyosXHMqKFxkKylccypcKS8uZXhlYyh0KTtpZihudWxsIT09YSllPXBhcnNlSW50KGFbMV0pLHI9cGFyc2VJbnQoYVsyXSksbj1wYXJzZUludChhWzNdKSxpPTE7ZWxzZSBpZihudWxsIT09KGE9L3JnYmFccypcKFxzKihcZCspXHMqLFxzKihcZCspXHMqLFxzKihcZCspXHMqLFxzKihbXGQuXSspXHMqXCkvLmV4ZWModCkpKWU9cGFyc2VJbnQoYVsxXSkscj1wYXJzZUludChhWzJdKSxuPXBhcnNlSW50KGFbM10pLGk9cGFyc2VGbG9hdChhWzRdKTtlbHNle2lmKGk9MSwic3RyaW5nIj09dHlwZW9mIHQmJiIjIiE9PXQuY2hhckF0KDApKXt2YXIgbz1uZXcgaCh0KTt0PW8ub2s/by50b0hleCgpOiIjMDAwMDAwIn00PT09dC5sZW5ndGg/KGU9dC5zdWJzdHJpbmcoMSwyKSxlKz1lLHI9dC5zdWJzdHJpbmcoMiwzKSxyKz1yLG49dC5zdWJzdHJpbmcoMyw0KSxuKz1uKTooZT10LnN1YnN0cmluZygxLDMpLHI9dC5zdWJzdHJpbmcoMyw1KSxuPXQuc3Vic3RyaW5nKDUsNykpLGU9cGFyc2VJbnQoZSwxNikscj1wYXJzZUludChyLDE2KSxuPXBhcnNlSW50KG4sMTYpfX1yZXR1cm57cjplLGc6cixiOm4sYTppLHN0eWxlOnR9fSxtPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY3R4LmlzRmlsbFRyYW5zcGFyZW50fHwwPT10aGlzLmdsb2JhbEFscGhhfSx2PWZ1bmN0aW9uKCl7cmV0dXJuIEJvb2xlYW4odGhpcy5jdHguaXNTdHJva2VUcmFuc3BhcmVudHx8MD09dGhpcy5nbG9iYWxBbHBoYSl9O3AucHJvdG90eXBlLmZpbGxUZXh0PWZ1bmN0aW9uKHQsZSxyLG4pe2lmKGlzTmFOKGUpfHxpc05hTihyKXx8InN0cmluZyIhPXR5cGVvZiB0KXRocm93IGkuZXJyb3IoImpzUERGLmNvbnRleHQyZC5maWxsVGV4dDogSW52YWxpZCBhcmd1bWVudHMiLGFyZ3VtZW50cyksbmV3IEVycm9yKCJJbnZhbGlkIGFyZ3VtZW50cyBwYXNzZWQgdG8ganNQREYuY29udGV4dDJkLmZpbGxUZXh0Iik7aWYobj1pc05hTihuKT92b2lkIDA6biwhbS5jYWxsKHRoaXMpKXt2YXIgYT1xKHRoaXMuY3R4LnRyYW5zZm9ybS5yb3RhdGlvbiksbz10aGlzLmN0eC50cmFuc2Zvcm0uc2NhbGVYO0MuY2FsbCh0aGlzLHt0ZXh0OnQseDplLHk6cixzY2FsZTpvLGFuZ2xlOmEsYWxpZ246dGhpcy50ZXh0QWxpZ24sbWF4V2lkdGg6bn0pfX0scC5wcm90b3R5cGUuc3Ryb2tlVGV4dD1mdW5jdGlvbih0LGUscixuKXtpZihpc05hTihlKXx8aXNOYU4ocil8fCJzdHJpbmciIT10eXBlb2YgdCl0aHJvdyBpLmVycm9yKCJqc1BERi5jb250ZXh0MmQuc3Ryb2tlVGV4dDogSW52YWxpZCBhcmd1bWVudHMiLGFyZ3VtZW50cyksbmV3IEVycm9yKCJJbnZhbGlkIGFyZ3VtZW50cyBwYXNzZWQgdG8ganNQREYuY29udGV4dDJkLnN0cm9rZVRleHQiKTtpZighdi5jYWxsKHRoaXMpKXtuPWlzTmFOKG4pP3ZvaWQgMDpuO3ZhciBhPXEodGhpcy5jdHgudHJhbnNmb3JtLnJvdGF0aW9uKSxvPXRoaXMuY3R4LnRyYW5zZm9ybS5zY2FsZVg7Qy5jYWxsKHRoaXMse3RleHQ6dCx4OmUseTpyLHNjYWxlOm8scmVuZGVyaW5nTW9kZToic3Ryb2tlIixhbmdsZTphLGFsaWduOnRoaXMudGV4dEFsaWduLG1heFdpZHRoOm59KX19LHAucHJvdG90eXBlLm1lYXN1cmVUZXh0PWZ1bmN0aW9uKHQpe2lmKCJzdHJpbmciIT10eXBlb2YgdCl0aHJvdyBpLmVycm9yKCJqc1BERi5jb250ZXh0MmQubWVhc3VyZVRleHQ6IEludmFsaWQgYXJndW1lbnRzIixhcmd1bWVudHMpLG5ldyBFcnJvcigiSW52YWxpZCBhcmd1bWVudHMgcGFzc2VkIHRvIGpzUERGLmNvbnRleHQyZC5tZWFzdXJlVGV4dCIpO3ZhciBlPXRoaXMucGRmLHI9dGhpcy5wZGYuaW50ZXJuYWwuc2NhbGVGYWN0b3Isbj1lLmludGVybmFsLmdldEZvbnRTaXplKCksYT1lLmdldFN0cmluZ1VuaXRXaWR0aCh0KSpuL2UuaW50ZXJuYWwuc2NhbGVGYWN0b3Isbz1mdW5jdGlvbih0KXt2YXIgZT0odD10fHx7fSkud2lkdGh8fDA7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJ3aWR0aCIse2dldDpmdW5jdGlvbigpe3JldHVybiBlfX0pLHRoaXN9O3JldHVybiBuZXcgbyh7d2lkdGg6YSo9TWF0aC5yb3VuZCg5NipyLzcyKjFlNCkvMWU0fSl9LHAucHJvdG90eXBlLnNjYWxlPWZ1bmN0aW9uKHQsZSl7aWYoaXNOYU4odCl8fGlzTmFOKGUpKXRocm93IGkuZXJyb3IoImpzUERGLmNvbnRleHQyZC5zY2FsZTogSW52YWxpZCBhcmd1bWVudHMiLGFyZ3VtZW50cyksbmV3IEVycm9yKCJJbnZhbGlkIGFyZ3VtZW50cyBwYXNzZWQgdG8ganNQREYuY29udGV4dDJkLnNjYWxlIik7dmFyIHI9bmV3IGwodCwwLDAsZSwwLDApO3RoaXMuY3R4LnRyYW5zZm9ybT10aGlzLmN0eC50cmFuc2Zvcm0ubXVsdGlwbHkocil9LHAucHJvdG90eXBlLnJvdGF0ZT1mdW5jdGlvbih0KXtpZihpc05hTih0KSl0aHJvdyBpLmVycm9yKCJqc1BERi5jb250ZXh0MmQucm90YXRlOiBJbnZhbGlkIGFyZ3VtZW50cyIsYXJndW1lbnRzKSxuZXcgRXJyb3IoIkludmFsaWQgYXJndW1lbnRzIHBhc3NlZCB0byBqc1BERi5jb250ZXh0MmQucm90YXRlIik7dmFyIGU9bmV3IGwoTWF0aC5jb3ModCksTWF0aC5zaW4odCksLU1hdGguc2luKHQpLE1hdGguY29zKHQpLDAsMCk7dGhpcy5jdHgudHJhbnNmb3JtPXRoaXMuY3R4LnRyYW5zZm9ybS5tdWx0aXBseShlKX0scC5wcm90b3R5cGUudHJhbnNsYXRlPWZ1bmN0aW9uKHQsZSl7aWYoaXNOYU4odCl8fGlzTmFOKGUpKXRocm93IGkuZXJyb3IoImpzUERGLmNvbnRleHQyZC50cmFuc2xhdGU6IEludmFsaWQgYXJndW1lbnRzIixhcmd1bWVudHMpLG5ldyBFcnJvcigiSW52YWxpZCBhcmd1bWVudHMgcGFzc2VkIHRvIGpzUERGLmNvbnRleHQyZC50cmFuc2xhdGUiKTt2YXIgcj1uZXcgbCgxLDAsMCwxLHQsZSk7dGhpcy5jdHgudHJhbnNmb3JtPXRoaXMuY3R4LnRyYW5zZm9ybS5tdWx0aXBseShyKX0scC5wcm90b3R5cGUudHJhbnNmb3JtPWZ1bmN0aW9uKHQsZSxyLG4sYSxvKXtpZihpc05hTih0KXx8aXNOYU4oZSl8fGlzTmFOKHIpfHxpc05hTihuKXx8aXNOYU4oYSl8fGlzTmFOKG8pKXRocm93IGkuZXJyb3IoImpzUERGLmNvbnRleHQyZC50cmFuc2Zvcm06IEludmFsaWQgYXJndW1lbnRzIixhcmd1bWVudHMpLG5ldyBFcnJvcigiSW52YWxpZCBhcmd1bWVudHMgcGFzc2VkIHRvIGpzUERGLmNvbnRleHQyZC50cmFuc2Zvcm0iKTt2YXIgcz1uZXcgbCh0LGUscixuLGEsbyk7dGhpcy5jdHgudHJhbnNmb3JtPXRoaXMuY3R4LnRyYW5zZm9ybS5tdWx0aXBseShzKX0scC5wcm90b3R5cGUuc2V0VHJhbnNmb3JtPWZ1bmN0aW9uKHQsZSxyLG4saSxhKXt0PWlzTmFOKHQpPzE6dCxlPWlzTmFOKGUpPzA6ZSxyPWlzTmFOKHIpPzA6cixuPWlzTmFOKG4pPzE6bixpPWlzTmFOKGkpPzA6aSxhPWlzTmFOKGEpPzA6YSx0aGlzLmN0eC50cmFuc2Zvcm09bmV3IGwodCxlLHIsbixpLGEpfTt2YXIgYj1mdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcmdpblswXT4wfHx0aGlzLm1hcmdpblsxXT4wfHx0aGlzLm1hcmdpblsyXT4wfHx0aGlzLm1hcmdpblszXT4wfTtwLnByb3RvdHlwZS5kcmF3SW1hZ2U9ZnVuY3Rpb24odCxlLHIsbixpLGEsbyxzLGMpe3ZhciBoPXRoaXMucGRmLmdldEltYWdlUHJvcGVydGllcyh0KSxmPTEsZD0xLHA9MSxnPTE7dm9pZCAwIT09biYmdm9pZCAwIT09cyYmKHA9cy9uLGc9Yy9pLGY9aC53aWR0aC9uKnMvbixkPWguaGVpZ2h0L2kqYy9pKSx2b2lkIDA9PT1hJiYoYT1lLG89cixlPTAscj0wKSx2b2lkIDAhPT1uJiZ2b2lkIDA9PT1zJiYocz1uLGM9aSksdm9pZCAwPT09biYmdm9pZCAwPT09cyYmKHM9aC53aWR0aCxjPWguaGVpZ2h0KTtmb3IodmFyIG0sdj10aGlzLmN0eC50cmFuc2Zvcm0uZGVjb21wb3NlKCksdz1xKHYucm90YXRlLnNoeCksQT1uZXcgbCxTPShBPShBPShBPUEubXVsdGlwbHkodi50cmFuc2xhdGUpKS5tdWx0aXBseSh2LnNrZXcpKS5tdWx0aXBseSh2LnNjYWxlKSkuYXBwbHlUb1JlY3RhbmdsZShuZXcgdShhLWUqcCxvLXIqZyxuKmYsaSpkKSksXz15LmNhbGwodGhpcyxTKSxQPVtdLGs9MDtrPF8ubGVuZ3RoO2srPTEpLTE9PT1QLmluZGV4T2YoX1trXSkmJlAucHVzaChfW2tdKTtpZihMKFApLHRoaXMuYXV0b1BhZ2luZylmb3IodmFyIEY9UFswXSxJPVBbUC5sZW5ndGgtMV0sQz1GO0M8SSsxO0MrKyl7dGhpcy5wZGYuc2V0UGFnZShDKTt2YXIgaj10aGlzLnBkZi5pbnRlcm5hbC5wYWdlU2l6ZS53aWR0aC10aGlzLm1hcmdpblszXS10aGlzLm1hcmdpblsxXSxPPTE9PT1DP3RoaXMucG9zWSt0aGlzLm1hcmdpblswXTp0aGlzLm1hcmdpblswXSxCPXRoaXMucGRmLmludGVybmFsLnBhZ2VTaXplLmhlaWdodC10aGlzLnBvc1ktdGhpcy5tYXJnaW5bMF0tdGhpcy5tYXJnaW5bMl0sTT10aGlzLnBkZi5pbnRlcm5hbC5wYWdlU2l6ZS5oZWlnaHQtdGhpcy5tYXJnaW5bMF0tdGhpcy5tYXJnaW5bMl0sRT0xPT09Qz8wOkIrKEMtMikqTTtpZigwIT09dGhpcy5jdHguY2xpcF9wYXRoLmxlbmd0aCl7dmFyIEQ9dGhpcy5wYXRoO209SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmN0eC5jbGlwX3BhdGgpKSx0aGlzLnBhdGg9TihtLHRoaXMucG9zWCt0aGlzLm1hcmdpblszXSwtRStPK3RoaXMuY3R4LnByZXZQYWdlTGFzdEVsZW1PZmZzZXQpLHguY2FsbCh0aGlzLCJmaWxsIiwhMCksdGhpcy5wYXRoPUR9dmFyIFI9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShTKSk7Uj1OKFtSXSx0aGlzLnBvc1grdGhpcy5tYXJnaW5bM10sLUUrTyt0aGlzLmN0eC5wcmV2UGFnZUxhc3RFbGVtT2Zmc2V0KVswXTt2YXIgVD0oQz5GfHxDPEkpJiZiLmNhbGwodGhpcyk7VCYmKHRoaXMucGRmLnNhdmVHcmFwaGljc1N0YXRlKCksdGhpcy5wZGYucmVjdCh0aGlzLm1hcmdpblszXSx0aGlzLm1hcmdpblswXSxqLE0sbnVsbCkuY2xpcCgpLmRpc2NhcmRQYXRoKCkpLHRoaXMucGRmLmFkZEltYWdlKHQsIkpQRUciLFIueCxSLnksUi53LFIuaCxudWxsLG51bGwsdyksVCYmdGhpcy5wZGYucmVzdG9yZUdyYXBoaWNzU3RhdGUoKX1lbHNlIHRoaXMucGRmLmFkZEltYWdlKHQsIkpQRUciLFMueCxTLnksUy53LFMuaCxudWxsLG51bGwsdyl9O3ZhciB5PWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1bXTtlPWV8fHRoaXMucGRmLmludGVybmFsLnBhZ2VTaXplLndpZHRoLHI9cnx8dGhpcy5wZGYuaW50ZXJuYWwucGFnZVNpemUuaGVpZ2h0LXRoaXMubWFyZ2luWzBdLXRoaXMubWFyZ2luWzJdO3ZhciBpPXRoaXMucG9zWSt0aGlzLmN0eC5wcmV2UGFnZUxhc3RFbGVtT2Zmc2V0O3N3aXRjaCh0LnR5cGUpe2RlZmF1bHQ6Y2FzZSJtdCI6Y2FzZSJsdCI6bi5wdXNoKE1hdGguZmxvb3IoKHQueStpKS9yKSsxKTticmVhaztjYXNlImFyYyI6bi5wdXNoKE1hdGguZmxvb3IoKHQueStpLXQucmFkaXVzKS9yKSsxKSxuLnB1c2goTWF0aC5mbG9vcigodC55K2krdC5yYWRpdXMpL3IpKzEpO2JyZWFrO2Nhc2UicWN0Ijp2YXIgYT1EKHRoaXMuY3R4Lmxhc3RQb2ludC54LHRoaXMuY3R4Lmxhc3RQb2ludC55LHQueDEsdC55MSx0LngsdC55KTtuLnB1c2goTWF0aC5mbG9vcigoYS55K2kpL3IpKzEpLG4ucHVzaChNYXRoLmZsb29yKChhLnkrYS5oK2kpL3IpKzEpO2JyZWFrO2Nhc2UiYmN0Ijp2YXIgbz1SKHRoaXMuY3R4Lmxhc3RQb2ludC54LHRoaXMuY3R4Lmxhc3RQb2ludC55LHQueDEsdC55MSx0LngyLHQueTIsdC54LHQueSk7bi5wdXNoKE1hdGguZmxvb3IoKG8ueStpKS9yKSsxKSxuLnB1c2goTWF0aC5mbG9vcigoby55K28uaCtpKS9yKSsxKTticmVhaztjYXNlInJlY3QiOm4ucHVzaChNYXRoLmZsb29yKCh0LnkraSkvcikrMSksbi5wdXNoKE1hdGguZmxvb3IoKHQueSt0LmgraSkvcikrMSl9Zm9yKHZhciBzPTA7czxuLmxlbmd0aDtzKz0xKWZvcig7dGhpcy5wZGYuaW50ZXJuYWwuZ2V0TnVtYmVyT2ZQYWdlcygpPG5bc107KXcuY2FsbCh0aGlzKTtyZXR1cm4gbn0sdz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZmlsbFN0eWxlLGU9dGhpcy5zdHJva2VTdHlsZSxyPXRoaXMuZm9udCxuPXRoaXMubGluZUNhcCxpPXRoaXMubGluZVdpZHRoLGE9dGhpcy5saW5lSm9pbjt0aGlzLnBkZi5hZGRQYWdlKCksdGhpcy5maWxsU3R5bGU9dCx0aGlzLnN0cm9rZVN0eWxlPWUsdGhpcy5mb250PXIsdGhpcy5saW5lQ2FwPW4sdGhpcy5saW5lV2lkdGg9aSx0aGlzLmxpbmVKb2luPWF9LE49ZnVuY3Rpb24odCxlLHIpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXN3aXRjaCh0W25dLnR5cGUpe2Nhc2UiYmN0Ijp0W25dLngyKz1lLHRbbl0ueTIrPXI7Y2FzZSJxY3QiOnRbbl0ueDErPWUsdFtuXS55MSs9cjtjYXNlIm10IjpjYXNlImx0IjpjYXNlImFyYyI6ZGVmYXVsdDp0W25dLngrPWUsdFtuXS55Kz1yfXJldHVybiB0fSxMPWZ1bmN0aW9uKHQpe3JldHVybiB0LnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQtZX0pKX0sQT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcixuLGk9dGhpcy5maWxsU3R5bGUsYT10aGlzLnN0cm9rZVN0eWxlLG89dGhpcy5saW5lQ2FwLHM9dGhpcy5saW5lV2lkdGgsYz1NYXRoLmFicyhzKnRoaXMuY3R4LnRyYW5zZm9ybS5zY2FsZVgpLHU9dGhpcy5saW5lSm9pbixsPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5wYXRoKSksaD1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMucGF0aCkpLGY9W10sZD0wO2Q8aC5sZW5ndGg7ZCsrKWlmKHZvaWQgMCE9PWhbZF0ueClmb3IodmFyIHA9eS5jYWxsKHRoaXMsaFtkXSksZz0wO2c8cC5sZW5ndGg7Zys9MSktMT09PWYuaW5kZXhPZihwW2ddKSYmZi5wdXNoKHBbZ10pO2Zvcih2YXIgbT0wO208Zi5sZW5ndGg7bSsrKWZvcig7dGhpcy5wZGYuaW50ZXJuYWwuZ2V0TnVtYmVyT2ZQYWdlcygpPGZbbV07KXcuY2FsbCh0aGlzKTtpZihMKGYpLHRoaXMuYXV0b1BhZ2luZylmb3IodmFyIHY9ZlswXSxBPWZbZi5sZW5ndGgtMV0sUz12O1M8QSsxO1MrKyl7dGhpcy5wZGYuc2V0UGFnZShTKSx0aGlzLmZpbGxTdHlsZT1pLHRoaXMuc3Ryb2tlU3R5bGU9YSx0aGlzLmxpbmVDYXA9byx0aGlzLmxpbmVXaWR0aD1jLHRoaXMubGluZUpvaW49dTt2YXIgXz10aGlzLnBkZi5pbnRlcm5hbC5wYWdlU2l6ZS53aWR0aC10aGlzLm1hcmdpblszXS10aGlzLm1hcmdpblsxXSxQPTE9PT1TP3RoaXMucG9zWSt0aGlzLm1hcmdpblswXTp0aGlzLm1hcmdpblswXSxrPXRoaXMucGRmLmludGVybmFsLnBhZ2VTaXplLmhlaWdodC10aGlzLnBvc1ktdGhpcy5tYXJnaW5bMF0tdGhpcy5tYXJnaW5bMl0sRj10aGlzLnBkZi5pbnRlcm5hbC5wYWdlU2l6ZS5oZWlnaHQtdGhpcy5tYXJnaW5bMF0tdGhpcy5tYXJnaW5bMl0sST0xPT09Uz8wOmsrKFMtMikqRjtpZigwIT09dGhpcy5jdHguY2xpcF9wYXRoLmxlbmd0aCl7dmFyIEM9dGhpcy5wYXRoO3I9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmN0eC5jbGlwX3BhdGgpKSx0aGlzLnBhdGg9TihyLHRoaXMucG9zWCt0aGlzLm1hcmdpblszXSwtSStQK3RoaXMuY3R4LnByZXZQYWdlTGFzdEVsZW1PZmZzZXQpLHguY2FsbCh0aGlzLHQsITApLHRoaXMucGF0aD1DfWlmKG49SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsKSksdGhpcy5wYXRoPU4obix0aGlzLnBvc1grdGhpcy5tYXJnaW5bM10sLUkrUCt0aGlzLmN0eC5wcmV2UGFnZUxhc3RFbGVtT2Zmc2V0KSwhMT09PWV8fDA9PT1TKXt2YXIgaj0oUz52fHxTPEEpJiZiLmNhbGwodGhpcyk7aiYmKHRoaXMucGRmLnNhdmVHcmFwaGljc1N0YXRlKCksdGhpcy5wZGYucmVjdCh0aGlzLm1hcmdpblszXSx0aGlzLm1hcmdpblswXSxfLEYsbnVsbCkuY2xpcCgpLmRpc2NhcmRQYXRoKCkpLHguY2FsbCh0aGlzLHQsZSksaiYmdGhpcy5wZGYucmVzdG9yZUdyYXBoaWNzU3RhdGUoKX10aGlzLmxpbmVXaWR0aD1zfWVsc2UgdGhpcy5saW5lV2lkdGg9Yyx4LmNhbGwodGhpcyx0LGUpLHRoaXMubGluZVdpZHRoPXM7dGhpcy5wYXRoPWx9LHg9ZnVuY3Rpb24odCxlKXtpZigoInN0cm9rZSIhPT10fHxlfHwhdi5jYWxsKHRoaXMpKSYmKCJzdHJva2UiPT09dHx8ZXx8IW0uY2FsbCh0aGlzKSkpe2Zvcih2YXIgcixuLGk9W10sYT10aGlzLnBhdGgsbz0wO288YS5sZW5ndGg7bysrKXt2YXIgcz1hW29dO3N3aXRjaChzLnR5cGUpe2Nhc2UiYmVnaW4iOmkucHVzaCh7YmVnaW46ITB9KTticmVhaztjYXNlImNsb3NlIjppLnB1c2goe2Nsb3NlOiEwfSk7YnJlYWs7Y2FzZSJtdCI6aS5wdXNoKHtzdGFydDpzLGRlbHRhczpbXSxhYnM6W119KTticmVhaztjYXNlImx0Ijp2YXIgYz1pLmxlbmd0aDtpZihhW28tMV0mJiFpc05hTihhW28tMV0ueCkmJihyPVtzLngtYVtvLTFdLngscy55LWFbby0xXS55XSxjPjApKWZvcig7Yz49MDtjLS0paWYoITAhPT1pW2MtMV0uY2xvc2UmJiEwIT09aVtjLTFdLmJlZ2luKXtpW2MtMV0uZGVsdGFzLnB1c2gociksaVtjLTFdLmFicy5wdXNoKHMpO2JyZWFrfWJyZWFrO2Nhc2UiYmN0IjpyPVtzLngxLWFbby0xXS54LHMueTEtYVtvLTFdLnkscy54Mi1hW28tMV0ueCxzLnkyLWFbby0xXS55LHMueC1hW28tMV0ueCxzLnktYVtvLTFdLnldLGlbaS5sZW5ndGgtMV0uZGVsdGFzLnB1c2gocik7YnJlYWs7Y2FzZSJxY3QiOnZhciB1PWFbby0xXS54KzIvMyoocy54MS1hW28tMV0ueCksbD1hW28tMV0ueSsyLzMqKHMueTEtYVtvLTFdLnkpLGg9cy54KzIvMyoocy54MS1zLngpLGY9cy55KzIvMyoocy55MS1zLnkpLGQ9cy54LHA9cy55O3I9W3UtYVtvLTFdLngsbC1hW28tMV0ueSxoLWFbby0xXS54LGYtYVtvLTFdLnksZC1hW28tMV0ueCxwLWFbby0xXS55XSxpW2kubGVuZ3RoLTFdLmRlbHRhcy5wdXNoKHIpO2JyZWFrO2Nhc2UiYXJjIjppLnB1c2goe2RlbHRhczpbXSxhYnM6W10sYXJjOiEwfSksQXJyYXkuaXNBcnJheShpW2kubGVuZ3RoLTFdLmFicykmJmlbaS5sZW5ndGgtMV0uYWJzLnB1c2gocyl9fW49ZT9udWxsOiJzdHJva2UiPT09dD8ic3Ryb2tlIjoiZmlsbCI7Zm9yKHZhciBnPSExLGI9MDtiPGkubGVuZ3RoO2IrKylpZihpW2JdLmFyYylmb3IodmFyIHk9aVtiXS5hYnMsdz0wO3c8eS5sZW5ndGg7dysrKXt2YXIgTj15W3ddOyJhcmMiPT09Ti50eXBlP1AuY2FsbCh0aGlzLE4ueCxOLnksTi5yYWRpdXMsTi5zdGFydEFuZ2xlLE4uZW5kQW5nbGUsTi5jb3VudGVyY2xvY2t3aXNlLHZvaWQgMCxlLCFnKTpqLmNhbGwodGhpcyxOLngsTi55KSxnPSEwfWVsc2UgaWYoITA9PT1pW2JdLmNsb3NlKXRoaXMucGRmLmludGVybmFsLm91dCgiaCIpLGc9ITE7ZWxzZSBpZighMCE9PWlbYl0uYmVnaW4pe3ZhciBMPWlbYl0uc3RhcnQueCxBPWlbYl0uc3RhcnQueTtPLmNhbGwodGhpcyxpW2JdLmRlbHRhcyxMLEEpLGc9ITB9biYmay5jYWxsKHRoaXMsbiksZSYmRi5jYWxsKHRoaXMpfX0sUz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLnBkZi5pbnRlcm5hbC5nZXRGb250U2l6ZSgpL3RoaXMucGRmLmludGVybmFsLnNjYWxlRmFjdG9yLHI9ZSoodGhpcy5wZGYuaW50ZXJuYWwuZ2V0TGluZUhlaWdodEZhY3RvcigpLTEpO3N3aXRjaCh0aGlzLmN0eC50ZXh0QmFzZWxpbmUpe2Nhc2UiYm90dG9tIjpyZXR1cm4gdC1yO2Nhc2UidG9wIjpyZXR1cm4gdCtlLXI7Y2FzZSJoYW5naW5nIjpyZXR1cm4gdCtlLTIqcjtjYXNlIm1pZGRsZSI6cmV0dXJuIHQrZS8yLXI7Y2FzZSJpZGVvZ3JhcGhpYyI6cmV0dXJuIHQ7Y2FzZSJhbHBoYWJldGljIjpkZWZhdWx0OnJldHVybiB0fX0sXz1mdW5jdGlvbih0KXtyZXR1cm4gdCt0aGlzLnBkZi5pbnRlcm5hbC5nZXRGb250U2l6ZSgpL3RoaXMucGRmLmludGVybmFsLnNjYWxlRmFjdG9yKih0aGlzLnBkZi5pbnRlcm5hbC5nZXRMaW5lSGVpZ2h0RmFjdG9yKCktMSl9O3AucHJvdG90eXBlLmNyZWF0ZUxpbmVhckdyYWRpZW50PWZ1bmN0aW9uKCl7dmFyIHQ9ZnVuY3Rpb24oKXt9O3JldHVybiB0LmNvbG9yU3RvcHM9W10sdC5hZGRDb2xvclN0b3A9ZnVuY3Rpb24odCxlKXt0aGlzLmNvbG9yU3RvcHMucHVzaChbdCxlXSl9LHQuZ2V0Q29sb3I9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PXRoaXMuY29sb3JTdG9wcy5sZW5ndGg/IiMwMDAwMDAiOnRoaXMuY29sb3JTdG9wc1swXVsxXX0sdC5pc0NhbnZhc0dyYWRpZW50PSEwLHR9LHAucHJvdG90eXBlLmNyZWF0ZVBhdHRlcm49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jcmVhdGVMaW5lYXJHcmFkaWVudCgpfSxwLnByb3RvdHlwZS5jcmVhdGVSYWRpYWxHcmFkaWVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNyZWF0ZUxpbmVhckdyYWRpZW50KCl9O3ZhciBQPWZ1bmN0aW9uKHQsZSxyLG4saSxhLG8scyxjKXtmb3IodmFyIHU9TS5jYWxsKHRoaXMscixuLGksYSksbD0wO2w8dS5sZW5ndGg7bCsrKXt2YXIgaD11W2xdOzA9PT1sJiYoYz9JLmNhbGwodGhpcyxoLngxK3QsaC55MStlKTpqLmNhbGwodGhpcyxoLngxK3QsaC55MStlKSksQi5jYWxsKHRoaXMsdCxlLGgueDIsaC55MixoLngzLGgueTMsaC54NCxoLnk0KX1zP0YuY2FsbCh0aGlzKTprLmNhbGwodGhpcyxvKX0saz1mdW5jdGlvbih0KXtzd2l0Y2godCl7Y2FzZSJzdHJva2UiOnRoaXMucGRmLmludGVybmFsLm91dCgiUyIpO2JyZWFrO2Nhc2UiZmlsbCI6dGhpcy5wZGYuaW50ZXJuYWwub3V0KCJmIil9fSxGPWZ1bmN0aW9uKCl7dGhpcy5wZGYuY2xpcCgpLHRoaXMucGRmLmRpc2NhcmRQYXRoKCl9LEk9ZnVuY3Rpb24odCxlKXt0aGlzLnBkZi5pbnRlcm5hbC5vdXQobih0KSsiICIrYShlKSsiIG0iKX0sQz1mdW5jdGlvbih0KXt2YXIgZTtzd2l0Y2godC5hbGlnbil7Y2FzZSJyaWdodCI6Y2FzZSJlbmQiOmU9InJpZ2h0IjticmVhaztjYXNlImNlbnRlciI6ZT0iY2VudGVyIjticmVhaztjYXNlImxlZnQiOmNhc2Uic3RhcnQiOmRlZmF1bHQ6ZT0ibGVmdCJ9dmFyIHI9dGhpcy5wZGYuZ2V0VGV4dERpbWVuc2lvbnModC50ZXh0KSxuPVMuY2FsbCh0aGlzLHQueSksaT1fLmNhbGwodGhpcyxuKS1yLmgsYT10aGlzLmN0eC50cmFuc2Zvcm0uYXBwbHlUb1BvaW50KG5ldyBjKHQueCxuKSksbz10aGlzLmN0eC50cmFuc2Zvcm0uZGVjb21wb3NlKCkscz1uZXcgbDtzPShzPShzPXMubXVsdGlwbHkoby50cmFuc2xhdGUpKS5tdWx0aXBseShvLnNrZXcpKS5tdWx0aXBseShvLnNjYWxlKTtmb3IodmFyIGgsZixkLHA9dGhpcy5jdHgudHJhbnNmb3JtLmFwcGx5VG9SZWN0YW5nbGUobmV3IHUodC54LG4sci53LHIuaCkpLGc9cy5hcHBseVRvUmVjdGFuZ2xlKG5ldyB1KHQueCxpLHIudyxyLmgpKSxtPXkuY2FsbCh0aGlzLGcpLHY9W10sdz0wO3c8bS5sZW5ndGg7dys9MSktMT09PXYuaW5kZXhPZihtW3ddKSYmdi5wdXNoKG1bd10pO2lmKEwodiksdGhpcy5hdXRvUGFnaW5nKWZvcih2YXIgQT12WzBdLFA9dlt2Lmxlbmd0aC0xXSxrPUE7azxQKzE7aysrKXt0aGlzLnBkZi5zZXRQYWdlKGspO3ZhciBGPTE9PT1rP3RoaXMucG9zWSt0aGlzLm1hcmdpblswXTp0aGlzLm1hcmdpblswXSxJPXRoaXMucGRmLmludGVybmFsLnBhZ2VTaXplLmhlaWdodC10aGlzLnBvc1ktdGhpcy5tYXJnaW5bMF0tdGhpcy5tYXJnaW5bMl0sQz10aGlzLnBkZi5pbnRlcm5hbC5wYWdlU2l6ZS5oZWlnaHQtdGhpcy5tYXJnaW5bMl0saj1DLXRoaXMubWFyZ2luWzBdLE89dGhpcy5wZGYuaW50ZXJuYWwucGFnZVNpemUud2lkdGgtdGhpcy5tYXJnaW5bMV0sQj1PLXRoaXMubWFyZ2luWzNdLE09MT09PWs/MDpJKyhrLTIpKmo7aWYoMCE9PXRoaXMuY3R4LmNsaXBfcGF0aC5sZW5ndGgpe3ZhciBFPXRoaXMucGF0aDtoPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5jdHguY2xpcF9wYXRoKSksdGhpcy5wYXRoPU4oaCx0aGlzLnBvc1grdGhpcy5tYXJnaW5bM10sLTEqTStGKSx4LmNhbGwodGhpcywiZmlsbCIsITApLHRoaXMucGF0aD1FfXZhciBxPU4oW0pTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZykpXSx0aGlzLnBvc1grdGhpcy5tYXJnaW5bM10sLU0rRit0aGlzLmN0eC5wcmV2UGFnZUxhc3RFbGVtT2Zmc2V0KVswXTt0LnNjYWxlPj0uMDEmJihmPXRoaXMucGRmLmludGVybmFsLmdldEZvbnRTaXplKCksdGhpcy5wZGYuc2V0Rm9udFNpemUoZip0LnNjYWxlKSxkPXRoaXMubGluZVdpZHRoLHRoaXMubGluZVdpZHRoPWQqdC5zY2FsZSk7dmFyIEQ9InRleHQiIT09dGhpcy5hdXRvUGFnaW5nO2lmKER8fHEueStxLmg8PUMpe2lmKER8fHEueT49RiYmcS54PD1PKXt2YXIgUj1EP3QudGV4dDp0aGlzLnBkZi5zcGxpdFRleHRUb1NpemUodC50ZXh0LHQubWF4V2lkdGh8fE8tcS54KVswXSxUPU4oW0pTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocCkpXSx0aGlzLnBvc1grdGhpcy5tYXJnaW5bM10sLU0rRit0aGlzLmN0eC5wcmV2UGFnZUxhc3RFbGVtT2Zmc2V0KVswXSxVPUQmJihrPkF8fGs8UCkmJmIuY2FsbCh0aGlzKTtVJiYodGhpcy5wZGYuc2F2ZUdyYXBoaWNzU3RhdGUoKSx0aGlzLnBkZi5yZWN0KHRoaXMubWFyZ2luWzNdLHRoaXMubWFyZ2luWzBdLEIsaixudWxsKS5jbGlwKCkuZGlzY2FyZFBhdGgoKSksdGhpcy5wZGYudGV4dChSLFQueCxULnkse2FuZ2xlOnQuYW5nbGUsYWxpZ246ZSxyZW5kZXJpbmdNb2RlOnQucmVuZGVyaW5nTW9kZX0pLFUmJnRoaXMucGRmLnJlc3RvcmVHcmFwaGljc1N0YXRlKCl9fWVsc2UgcS55PEMmJih0aGlzLmN0eC5wcmV2UGFnZUxhc3RFbGVtT2Zmc2V0Kz1DLXEueSk7dC5zY2FsZT49LjAxJiYodGhpcy5wZGYuc2V0Rm9udFNpemUoZiksdGhpcy5saW5lV2lkdGg9ZCl9ZWxzZSB0LnNjYWxlPj0uMDEmJihmPXRoaXMucGRmLmludGVybmFsLmdldEZvbnRTaXplKCksdGhpcy5wZGYuc2V0Rm9udFNpemUoZip0LnNjYWxlKSxkPXRoaXMubGluZVdpZHRoLHRoaXMubGluZVdpZHRoPWQqdC5zY2FsZSksdGhpcy5wZGYudGV4dCh0LnRleHQsYS54K3RoaXMucG9zWCxhLnkrdGhpcy5wb3NZLHthbmdsZTp0LmFuZ2xlLGFsaWduOmUscmVuZGVyaW5nTW9kZTp0LnJlbmRlcmluZ01vZGUsbWF4V2lkdGg6dC5tYXhXaWR0aH0pLHQuc2NhbGU+PS4wMSYmKHRoaXMucGRmLnNldEZvbnRTaXplKGYpLHRoaXMubGluZVdpZHRoPWQpfSxqPWZ1bmN0aW9uKHQsZSxyLGkpe3I9cnx8MCxpPWl8fDAsdGhpcy5wZGYuaW50ZXJuYWwub3V0KG4odCtyKSsiICIrYShlK2kpKyIgbCIpfSxPPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdGhpcy5wZGYubGluZXModCxlLHIsbnVsbCxudWxsKX0sQj1mdW5jdGlvbih0LGUsbixpLGEsYyx1LGwpe3RoaXMucGRmLmludGVybmFsLm91dChbcihvKG4rdCkpLHIocyhpK2UpKSxyKG8oYSt0KSkscihzKGMrZSkpLHIobyh1K3QpKSxyKHMobCtlKSksImMiXS5qb2luKCIgIikpfSxNPWZ1bmN0aW9uKHQsZSxyLG4pe2Zvcih2YXIgaT0yKk1hdGguUEksYT1NYXRoLlBJLzI7ZT5yOyllLT1pO3ZhciBvPU1hdGguYWJzKHItZSk7bzxpJiZuJiYobz1pLW8pO2Zvcih2YXIgcz1bXSxjPW4/LTE6MSx1PWU7bz4xZS01Oyl7dmFyIGw9dStjKk1hdGgubWluKG8sYSk7cy5wdXNoKEUuY2FsbCh0aGlzLHQsdSxsKSksby09TWF0aC5hYnMobC11KSx1PWx9cmV0dXJuIHN9LEU9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPShyLWUpLzIsaT10Kk1hdGguY29zKG4pLGE9dCpNYXRoLnNpbihuKSxvPWkscz0tYSxjPW8qbytzKnMsdT1jK28qaStzKmEsbD00LzMqKE1hdGguc3FydCgyKmMqdSktdSkvKG8qYS1zKmkpLGg9by1sKnMsZj1zK2wqbyxkPWgscD0tZixnPW4rZSxtPU1hdGguY29zKGcpLHY9TWF0aC5zaW4oZyk7cmV0dXJue3gxOnQqTWF0aC5jb3MoZSkseTE6dCpNYXRoLnNpbihlKSx4MjpoKm0tZip2LHkyOmgqditmKm0seDM6ZCptLXAqdix5MzpkKnYrcCptLHg0OnQqTWF0aC5jb3MocikseTQ6dCpNYXRoLnNpbihyKX19LHE9ZnVuY3Rpb24odCl7cmV0dXJuIDE4MCp0L01hdGguUEl9LEQ9ZnVuY3Rpb24odCxlLHIsbixpLGEpe3ZhciBvPXQrLjUqKHItdCkscz1lKy41KihuLWUpLGM9aSsuNSooci1pKSxsPWErLjUqKG4tYSksaD1NYXRoLm1pbih0LGksbyxjKSxmPU1hdGgubWF4KHQsaSxvLGMpLGQ9TWF0aC5taW4oZSxhLHMsbCkscD1NYXRoLm1heChlLGEscyxsKTtyZXR1cm4gbmV3IHUoaCxkLGYtaCxwLWQpfSxSPWZ1bmN0aW9uKHQsZSxyLG4saSxhLG8scyl7dmFyIGMsbCxoLGYsZCxwLGcsbSx2LGIseSx3LE4sTCxBPXItdCx4PW4tZSxTPWktcixfPWEtbixQPW8taSxrPXMtYTtmb3IobD0wO2w8NDE7bCsrKXY9KGc9KGg9dCsoYz1sLzQwKSpBKStjKigoZD1yK2MqUyktaCkpK2MqKGQrYyooaStjKlAtZCktZyksYj0obT0oZj1lK2MqeCkrYyooKHA9bitjKl8pLWYpKStjKihwK2MqKGErYyprLXApLW0pLDA9PWw/KHk9dix3PWIsTj12LEw9Yik6KHk9TWF0aC5taW4oeSx2KSx3PU1hdGgubWluKHcsYiksTj1NYXRoLm1heChOLHYpLEw9TWF0aC5tYXgoTCxiKSk7cmV0dXJuIG5ldyB1KE1hdGgucm91bmQoeSksTWF0aC5yb3VuZCh3KSxNYXRoLnJvdW5kKE4teSksTWF0aC5yb3VuZChMLXcpKX0sVD1mdW5jdGlvbigpe2lmKHRoaXMucHJldkxpbmVEYXNofHx0aGlzLmN0eC5saW5lRGFzaC5sZW5ndGh8fHRoaXMuY3R4LmxpbmVEYXNoT2Zmc2V0KXt2YXIgdCxlLHI9KHQ9dGhpcy5jdHgubGluZURhc2gsZT10aGlzLmN0eC5saW5lRGFzaE9mZnNldCxKU09OLnN0cmluZ2lmeSh7bGluZURhc2g6dCxsaW5lRGFzaE9mZnNldDplfSkpO3RoaXMucHJldkxpbmVEYXNoIT09ciYmKHRoaXMucGRmLnNldExpbmVEYXNoKHRoaXMuY3R4LmxpbmVEYXNoLHRoaXMuY3R4LmxpbmVEYXNoT2Zmc2V0KSx0aGlzLnByZXZMaW5lRGFzaD1yKX19fShNLkFQSSk7dHJ5e3JlcXVpcmUoIndvcmtlcl90aHJlYWRzIikuV29ya2VyfWNhdGNoKHQpe312YXIgVXQ9VWludDhBcnJheSx6dD1VaW50MTZBcnJheSxIdD1VaW50MzJBcnJheSxXdD1uZXcgVXQoWzAsMCwwLDAsMCwwLDAsMCwxLDEsMSwxLDIsMiwyLDIsMywzLDMsMyw0LDQsNCw0LDUsNSw1LDUsMCwwLDAsMF0pLFZ0PW5ldyBVdChbMCwwLDAsMCwxLDEsMiwyLDMsMyw0LDQsNSw1LDYsNiw3LDcsOCw4LDksOSwxMCwxMCwxMSwxMSwxMiwxMiwxMywxMywwLDBdKSxHdD1uZXcgVXQoWzE2LDE3LDE4LDAsOCw3LDksNiwxMCw1LDExLDQsMTIsMywxMywyLDE0LDEsMTVdKSxZdD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj1uZXcgenQoMzEpLG49MDtuPDMxOysrbilyW25dPWUrPTE8PHRbbi0xXTt2YXIgaT1uZXcgSHQoclszMF0pO2ZvcihuPTE7bjwzMDsrK24pZm9yKHZhciBhPXJbbl07YTxyW24rMV07KythKWlbYV09YS1yW25dPDw1fG47cmV0dXJuW3IsaV19LEp0PVl0KFd0LDIpLFh0PUp0WzBdLEt0PUp0WzFdO1h0WzI4XT0yNTgsS3RbMjU4XT0yODtmb3IodmFyIFp0PVl0KFZ0LDApLCR0PVp0WzBdLFF0PVp0WzFdLHRlPW5ldyB6dCgzMjc2OCksZWU9MDtlZTwzMjc2ODsrK2VlKXt2YXIgcmU9KDQzNjkwJmVlKT4+PjF8KDIxODQ1JmVlKTw8MTtyZT0oNjE2ODAmKHJlPSg1MjQyOCZyZSk+Pj4yfCgxMzEwNyZyZSk8PDIpKT4+PjR8KDM4NTUmcmUpPDw0LHRlW2VlXT0oKDY1MjgwJnJlKT4+Pjh8KDI1NSZyZSk8PDgpPj4+MX12YXIgbmU9ZnVuY3Rpb24odCxlLHIpe2Zvcih2YXIgbj10Lmxlbmd0aCxpPTAsYT1uZXcgenQoZSk7aTxuOysraSkrK2FbdFtpXS0xXTt2YXIgbyxzPW5ldyB6dChlKTtmb3IoaT0wO2k8ZTsrK2kpc1tpXT1zW2ktMV0rYVtpLTFdPDwxO2lmKHIpe289bmV3IHp0KDE8PGUpO3ZhciBjPTE1LWU7Zm9yKGk9MDtpPG47KytpKWlmKHRbaV0pZm9yKHZhciB1PWk8PDR8dFtpXSxsPWUtdFtpXSxoPXNbdFtpXS0xXSsrPDxsLGY9aHwoMTw8bCktMTtoPD1mOysraClvW3RlW2hdPj4+Y109dX1lbHNlIGZvcihvPW5ldyB6dChuKSxpPTA7aTxuOysraSlvW2ldPXRlW3NbdFtpXS0xXSsrXT4+PjE1LXRbaV07cmV0dXJuIG99LGllPW5ldyBVdCgyODgpO2ZvcihlZT0wO2VlPDE0NDsrK2VlKWllW2VlXT04O2ZvcihlZT0xNDQ7ZWU8MjU2OysrZWUpaWVbZWVdPTk7Zm9yKGVlPTI1NjtlZTwyODA7KytlZSlpZVtlZV09Nztmb3IoZWU9MjgwO2VlPDI4ODsrK2VlKWllW2VlXT04O3ZhciBhZT1uZXcgVXQoMzIpO2ZvcihlZT0wO2VlPDMyOysrZWUpYWVbZWVdPTU7dmFyIG9lPW5lKGllLDksMCksc2U9bmUoaWUsOSwxKSxjZT1uZShhZSw1LDApLHVlPW5lKGFlLDUsMSksbGU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRbMF0scj0xO3I8dC5sZW5ndGg7KytyKXRbcl0+ZSYmKGU9dFtyXSk7cmV0dXJuIGV9LGhlPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1lLzg+PjA7cmV0dXJuKHRbbl18dFtuKzFdPDw4KT4+Pig3JmUpJnJ9LGZlPWZ1bmN0aW9uKHQsZSl7dmFyIHI9ZS84Pj4wO3JldHVybih0W3JdfHRbcisxXTw8OHx0W3IrMl08PDE2KT4+Pig3JmUpfSxkZT1mdW5jdGlvbih0KXtyZXR1cm4odC84Pj4wKSsoNyZ0JiYxKX0scGU9ZnVuY3Rpb24odCxlLHIpeyhudWxsPT1lfHxlPDApJiYoZT0wKSwobnVsbD09cnx8cj50Lmxlbmd0aCkmJihyPXQubGVuZ3RoKTt2YXIgbj1uZXcodCBpbnN0YW5jZW9mIHp0P3p0OnQgaW5zdGFuY2VvZiBIdD9IdDpVdCkoci1lKTtyZXR1cm4gbi5zZXQodC5zdWJhcnJheShlLHIpKSxufSxnZT1mdW5jdGlvbih0LGUscil7cjw8PTcmZTt2YXIgbj1lLzg+PjA7dFtuXXw9cix0W24rMV18PXI+Pj44fSxtZT1mdW5jdGlvbih0LGUscil7cjw8PTcmZTt2YXIgbj1lLzg+PjA7dFtuXXw9cix0W24rMV18PXI+Pj44LHRbbisyXXw9cj4+PjE2fSx2ZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj1bXSxuPTA7bjx0Lmxlbmd0aDsrK24pdFtuXSYmci5wdXNoKHtzOm4sZjp0W25dfSk7dmFyIGk9ci5sZW5ndGgsYT1yLnNsaWNlKCk7aWYoIWkpcmV0dXJuW25ldyBVdCgwKSwwXTtpZigxPT1pKXt2YXIgbz1uZXcgVXQoclswXS5zKzEpO3JldHVybiBvW3JbMF0uc109MSxbbywxXX1yLnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuZi1lLmZ9KSksci5wdXNoKHtzOi0xLGY6MjUwMDF9KTt2YXIgcz1yWzBdLGM9clsxXSx1PTAsbD0xLGg9Mjtmb3IoclswXT17czotMSxmOnMuZitjLmYsbDpzLHI6Y307bCE9aS0xOylzPXJbclt1XS5mPHJbaF0uZj91Kys6aCsrXSxjPXJbdSE9bCYmclt1XS5mPHJbaF0uZj91Kys6aCsrXSxyW2wrK109e3M6LTEsZjpzLmYrYy5mLGw6cyxyOmN9O3ZhciBmPWFbMF0ucztmb3Iobj0xO248aTsrK24pYVtuXS5zPmYmJihmPWFbbl0ucyk7dmFyIGQ9bmV3IHp0KGYrMSkscD1iZShyW2wtMV0sZCwwKTtpZihwPmUpe249MDt2YXIgZz0wLG09cC1lLHY9MTw8bTtmb3IoYS5zb3J0KChmdW5jdGlvbih0LGUpe3JldHVybiBkW2Uuc10tZFt0LnNdfHx0LmYtZS5mfSkpO248aTsrK24pe3ZhciBiPWFbbl0ucztpZighKGRbYl0+ZSkpYnJlYWs7Zys9di0oMTw8cC1kW2JdKSxkW2JdPWV9Zm9yKGc+Pj49bTtnPjA7KXt2YXIgeT1hW25dLnM7ZFt5XTxlP2ctPTE8PGUtZFt5XSsrLTE6KytufWZvcig7bj49MCYmZzstLW4pe3ZhciB3PWFbbl0ucztkW3ddPT1lJiYoLS1kW3ddLCsrZyl9cD1lfXJldHVybltuZXcgVXQoZCkscF19LGJlPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4tMT09dC5zP01hdGgubWF4KGJlKHQubCxlLHIrMSksYmUodC5yLGUscisxKSk6ZVt0LnNdPXJ9LHllPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10Lmxlbmd0aDtlJiYhdFstLWVdOyk7Zm9yKHZhciByPW5ldyB6dCgrK2UpLG49MCxpPXRbMF0sYT0xLG89ZnVuY3Rpb24odCl7cltuKytdPXR9LHM9MTtzPD1lOysrcylpZih0W3NdPT1pJiZzIT1lKSsrYTtlbHNle2lmKCFpJiZhPjIpe2Zvcig7YT4xMzg7YS09MTM4KW8oMzI3NTQpO2E+MiYmKG8oYT4xMD9hLTExPDw1fDI4NjkwOmEtMzw8NXwxMjMwNSksYT0wKX1lbHNlIGlmKGE+Myl7Zm9yKG8oaSksLS1hO2E+NjthLT02KW8oODMwNCk7YT4yJiYobyhhLTM8PDV8ODIwOCksYT0wKX1mb3IoO2EtLTspbyhpKTthPTEsaT10W3NdfXJldHVybltyLnN1YmFycmF5KDAsbiksZV19LHdlPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPTAsbj0wO248ZS5sZW5ndGg7KytuKXIrPXRbbl0qZVtuXTtyZXR1cm4gcn0sTmU9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIubGVuZ3RoLGk9ZGUoZSsyKTt0W2ldPTI1NSZuLHRbaSsxXT1uPj4+OCx0W2krMl09MjU1XnRbaV0sdFtpKzNdPTI1NV50W2krMV07Zm9yKHZhciBhPTA7YTxuOysrYSl0W2krYSs0XT1yW2FdO3JldHVybiA4KihpKzQrbil9LExlPWZ1bmN0aW9uKHQsZSxyLG4saSxhLG8scyxjLHUsbCl7Z2UoZSxsKyssciksKytpWzI1Nl07Zm9yKHZhciBoPXZlKGksMTUpLGY9aFswXSxkPWhbMV0scD12ZShhLDE1KSxnPXBbMF0sbT1wWzFdLHY9eWUoZiksYj12WzBdLHk9dlsxXSx3PXllKGcpLE49d1swXSxMPXdbMV0sQT1uZXcgenQoMTkpLHg9MDt4PGIubGVuZ3RoOysreClBWzMxJmJbeF1dKys7Zm9yKHg9MDt4PE4ubGVuZ3RoOysreClBWzMxJk5beF1dKys7Zm9yKHZhciBTPXZlKEEsNyksXz1TWzBdLFA9U1sxXSxrPTE5O2s+NCYmIV9bR3Rbay0xXV07LS1rKTt2YXIgRixJLEMsaixPPXUrNTw8MyxCPXdlKGksaWUpK3dlKGEsYWUpK28sTT13ZShpLGYpK3dlKGEsZykrbysxNCszKmsrd2UoQSxfKSsoMipBWzE2XSszKkFbMTddKzcqQVsxOF0pO2lmKE88PUImJk88PU0pcmV0dXJuIE5lKGUsbCx0LnN1YmFycmF5KGMsYyt1KSk7aWYoZ2UoZSxsLDErKE08QikpLGwrPTIsTTxCKXtGPW5lKGYsZCwwKSxJPWYsQz1uZShnLG0sMCksaj1nO3ZhciBFPW5lKF8sUCwwKTtnZShlLGwseS0yNTcpLGdlKGUsbCs1LEwtMSksZ2UoZSxsKzEwLGstNCksbCs9MTQ7Zm9yKHg9MDt4PGs7Kyt4KWdlKGUsbCszKngsX1tHdFt4XV0pO2wrPTMqaztmb3IodmFyIHE9W2IsTl0sRD0wO0Q8MjsrK0Qpe3ZhciBSPXFbRF07Zm9yKHg9MDt4PFIubGVuZ3RoOysreCl7dmFyIFQ9MzEmUlt4XTtnZShlLGwsRVtUXSksbCs9X1tUXSxUPjE1JiYoZ2UoZSxsLFJbeF0+Pj41JjEyNyksbCs9Ult4XT4+PjEyKX19fWVsc2UgRj1vZSxJPWllLEM9Y2Usaj1hZTtmb3IoeD0wO3g8czsrK3gpaWYoblt4XT4yNTUpe1Q9blt4XT4+PjE4JjMxO21lKGUsbCxGW1QrMjU3XSksbCs9SVtUKzI1N10sVD43JiYoZ2UoZSxsLG5beF0+Pj4yMyYzMSksbCs9V3RbVF0pO3ZhciBVPTMxJm5beF07bWUoZSxsLENbVV0pLGwrPWpbVV0sVT4zJiYobWUoZSxsLG5beF0+Pj41JjgxOTEpLGwrPVZ0W1VdKX1lbHNlIG1lKGUsbCxGW25beF1dKSxsKz1JW25beF1dO3JldHVybiBtZShlLGwsRlsyNTZdKSxsK0lbMjU2XX0sQWU9bmV3IEh0KFs2NTU0MCwxMzEwODAsMTMxMDg4LDEzMTEwNCwyNjIxNzYsMTA0ODcwNCwxMDQ4ODMyLDIxMTQ1NjAsMjExNzYzMl0pLHhlPW5ldyBVdCgwKSxTZT1mdW5jdGlvbih0LGUscixuLGkpe3JldHVybiBmdW5jdGlvbih0LGUscixuLGksYSl7dmFyIG89dC5sZW5ndGgscz1uZXcgVXQobitvKzUqKDErTWF0aC5mbG9vcihvLzdlMykpK2kpLGM9cy5zdWJhcnJheShuLHMubGVuZ3RoLWkpLHU9MDtpZighZXx8bzw4KWZvcih2YXIgbD0wO2w8PW87bCs9NjU1MzUpe3ZhciBoPWwrNjU1MzU7aDxvP3U9TmUoYyx1LHQuc3ViYXJyYXkobCxoKSk6KGNbbF09YSx1PU5lKGMsdSx0LnN1YmFycmF5KGwsbykpKX1lbHNle2Zvcih2YXIgZj1BZVtlLTFdLGQ9Zj4+PjEzLHA9ODE5MSZmLGc9KDE8PHIpLTEsbT1uZXcgenQoMzI3NjgpLHY9bmV3IHp0KGcrMSksYj1NYXRoLmNlaWwoci8zKSx5PTIqYix3PWZ1bmN0aW9uKGUpe3JldHVybih0W2VdXnRbZSsxXTw8Yl50W2UrMl08PHkpJmd9LE49bmV3IEh0KDI1ZTMpLEw9bmV3IHp0KDI4OCksQT1uZXcgenQoMzIpLHg9MCxTPTAsXz0obD0wLDApLFA9MCxrPTA7bDxvOysrbCl7dmFyIEY9dyhsKSxJPTMyNzY3JmwsQz12W0ZdO2lmKG1bSV09Qyx2W0ZdPUksUDw9bCl7dmFyIGo9by1sO2lmKCh4PjdlM3x8Xz4yNDU3NikmJmo+NDIzKXt1PUxlKHQsYywwLE4sTCxBLFMsXyxrLGwtayx1KSxfPXg9Uz0wLGs9bDtmb3IodmFyIE89MDtPPDI4NjsrK08pTFtPXT0wO2ZvcihPPTA7TzwzMDsrK08pQVtPXT0wfXZhciBCPTIsTT0wLEU9cCxxPUktQyYzMjc2NztpZihqPjImJkY9PXcobC1xKSlmb3IodmFyIEQ9TWF0aC5taW4oZCxqKS0xLFI9TWF0aC5taW4oMzI3NjcsbCksVD1NYXRoLm1pbigyNTgsaik7cTw9UiYmLS1FJiZJIT1DOyl7aWYodFtsK0JdPT10W2wrQi1xXSl7Zm9yKHZhciBVPTA7VTxUJiZ0W2wrVV09PXRbbCtVLXFdOysrVSk7aWYoVT5CKXtpZihCPVUsTT1xLFU+RClicmVhazt2YXIgej1NYXRoLm1pbihxLFUtMiksSD0wO2ZvcihPPTA7Tzx6OysrTyl7dmFyIFc9bC1xK08rMzI3NjgmMzI3NjcsVj1XLW1bV10rMzI3NjgmMzI3Njc7Vj5IJiYoSD1WLEM9Vyl9fX1xKz0oST1DKS0oQz1tW0ldKSszMjc2OCYzMjc2N31pZihNKXtOW18rK109MjY4NDM1NDU2fEt0W0JdPDwxOHxRdFtNXTt2YXIgRz0zMSZLdFtCXSxZPTMxJlF0W01dO1MrPVd0W0ddK1Z0W1ldLCsrTFsyNTcrR10sKytBW1ldLFA9bCtCLCsreH1lbHNlIE5bXysrXT10W2xdLCsrTFt0W2xdXX19dT1MZSh0LGMsYSxOLEwsQSxTLF8sayxsLWssdSksYXx8KHU9TmUoYyx1LHhlKSl9cmV0dXJuIHBlKHMsMCxuK2RlKHUpK2kpfSh0LG51bGw9PWUubGV2ZWw/NjplLmxldmVsLG51bGw9PWUubWVtP01hdGguY2VpbCgxLjUqTWF0aC5tYXgoOCxNYXRoLm1pbigxMyxNYXRoLmxvZyh0Lmxlbmd0aCkpKSk6MTIrZS5tZW0scixuLCFpKX07ZnVuY3Rpb24gX2UodCxlKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIHI9ZnVuY3Rpb24oKXt2YXIgdD0xLGU9MDtyZXR1cm57cDpmdW5jdGlvbihyKXtmb3IodmFyIG49dCxpPWUsYT1yLmxlbmd0aCxvPTA7byE9YTspe2Zvcih2YXIgcz1NYXRoLm1pbihvKzU1NTIsYSk7bzxzOysrbylpKz1uKz1yW29dO24lPTY1NTIxLGklPTY1NTIxfXQ9bixlPWl9LGQ6ZnVuY3Rpb24oKXtyZXR1cm4odD4+Pjg8PDE2fCgyNTUmZSk8PDh8ZT4+PjgpKzIqKCgyNTUmdCk8PDIzKX19fSgpO3IucCh0KTt2YXIgbj1TZSh0LGUsMiw0KTtyZXR1cm4gZnVuY3Rpb24odCxlKXt2YXIgcj1lLmxldmVsLG49MD09cj8wOnI8Nj8xOjk9PXI/MzoyO3RbMF09MTIwLHRbMV09bjw8Nnwobj8zMi0yKm46MSl9KG4sZSksZnVuY3Rpb24odCxlLHIpe2Zvcig7cjsrK2UpdFtlXT1yLHI+Pj49OH0obixuLmxlbmd0aC00LHIuZCgpKSxufWZ1bmN0aW9uIFBlKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10Lmxlbmd0aCxpPSFlfHxyLGE9IXJ8fHIuaTtyfHwocj17fSksZXx8KGU9bmV3IFV0KDMqbikpO3ZhciBvPWZ1bmN0aW9uKHQpe3ZhciByPWUubGVuZ3RoO2lmKHQ+cil7dmFyIG49bmV3IFV0KE1hdGgubWF4KDIqcix0KSk7bi5zZXQoZSksZT1ufX0scz1yLmZ8fDAsYz1yLnB8fDAsdT1yLmJ8fDAsbD1yLmwsaD1yLmQsZj1yLm0sZD1yLm4scD04Km47ZG97aWYoIWwpe3IuZj1zPWhlKHQsYywxKTt2YXIgZz1oZSh0LGMrMSwzKTtpZihjKz0zLCFnKXt2YXIgbT10WyhQPWRlKGMpKzQpLTRdfHRbUC0zXTw8OCx2PVArbTtpZih2Pm4pe2lmKGEpdGhyb3cidW5leHBlY3RlZCBFT0YiO2JyZWFrfWkmJm8odSttKSxlLnNldCh0LnN1YmFycmF5KFAsdiksdSksci5iPXUrPW0sci5wPWM9OCp2O2NvbnRpbnVlfWlmKDE9PWcpbD1zZSxoPXVlLGY9OSxkPTU7ZWxzZXtpZigyIT1nKXRocm93ImludmFsaWQgYmxvY2sgdHlwZSI7dmFyIGI9aGUodCxjLDMxKSsyNTcseT1oZSh0LGMrMTAsMTUpKzQsdz1iK2hlKHQsYys1LDMxKSsxO2MrPTE0O2Zvcih2YXIgTj1uZXcgVXQodyksTD1uZXcgVXQoMTkpLEE9MDtBPHk7KytBKUxbR3RbQV1dPWhlKHQsYyszKkEsNyk7Yys9Myp5O3ZhciB4PWxlKEwpLFM9KDE8PHgpLTE7aWYoIWEmJmMrdyooeCs3KT5wKWJyZWFrO3ZhciBfPW5lKEwseCwxKTtmb3IoQT0wO0E8dzspe3ZhciBQLGs9X1toZSh0LGMsUyldO2lmKGMrPTE1JmssKFA9az4+PjQpPDE2KU5bQSsrXT1QO2Vsc2V7dmFyIEY9MCxJPTA7Zm9yKDE2PT1QPyhJPTMraGUodCxjLDMpLGMrPTIsRj1OW0EtMV0pOjE3PT1QPyhJPTMraGUodCxjLDcpLGMrPTMpOjE4PT1QJiYoST0xMStoZSh0LGMsMTI3KSxjKz03KTtJLS07KU5bQSsrXT1GfX12YXIgQz1OLnN1YmFycmF5KDAsYiksaj1OLnN1YmFycmF5KGIpO2Y9bGUoQyksZD1sZShqKSxsPW5lKEMsZiwxKSxoPW5lKGosZCwxKX1pZihjPnApdGhyb3cidW5leHBlY3RlZCBFT0YifWkmJm8odSsxMzEwNzIpO2Zvcih2YXIgTz0oMTw8ZiktMSxCPSgxPDxkKS0xLE09ZitkKzE4O2F8fGMrTTxwOyl7dmFyIEU9KEY9bFtmZSh0LGMpJk9dKT4+PjQ7aWYoKGMrPTE1JkYpPnApdGhyb3cidW5leHBlY3RlZCBFT0YiO2lmKCFGKXRocm93ImludmFsaWQgbGVuZ3RoL2xpdGVyYWwiO2lmKEU8MjU2KWVbdSsrXT1FO2Vsc2V7aWYoMjU2PT1FKXtsPW51bGw7YnJlYWt9dmFyIHE9RS0yNTQ7aWYoRT4yNjQpe3ZhciBEPVd0W0E9RS0yNTddO3E9aGUodCxjLCgxPDxEKS0xKStYdFtBXSxjKz1EfXZhciBSPWhbZmUodCxjKSZCXSxUPVI+Pj40O2lmKCFSKXRocm93ImludmFsaWQgZGlzdGFuY2UiO2MrPTE1JlI7aj0kdFtUXTtpZihUPjMpe0Q9VnRbVF07ais9ZmUodCxjKSYoMTw8RCktMSxjKz1EfWlmKGM+cCl0aHJvdyJ1bmV4cGVjdGVkIEVPRiI7aSYmbyh1KzEzMTA3Mik7Zm9yKHZhciBVPXUrcTt1PFU7dSs9NCllW3VdPWVbdS1qXSxlW3UrMV09ZVt1KzEtal0sZVt1KzJdPWVbdSsyLWpdLGVbdSszXT1lW3UrMy1qXTt1PVV9fXIubD1sLHIucD1jLHIuYj11LGwmJihzPTEsci5tPWYsci5kPWgsci5uPWQpfXdoaWxlKCFzKTtyZXR1cm4gdT09ZS5sZW5ndGg/ZTpwZShlLDAsdSl9KChmdW5jdGlvbih0KXtpZig4IT0oMTUmdFswXSl8fHRbMF0+Pj40Pjd8fCh0WzBdPDw4fHRbMV0pJTMxKXRocm93ImludmFsaWQgemxpYiBkYXRhIjtpZigzMiZ0WzFdKXRocm93ImludmFsaWQgemxpYiBkYXRhOiBwcmVzZXQgZGljdGlvbmFyaWVzIG5vdCBzdXBwb3J0ZWQifSh0KSx0LnN1YmFycmF5KDIsLTQpKSxlKX0KLyoqCiAgICogQGxpY2Vuc2UKICAgKiBqc1BERiBmaWx0ZXJzIFBsdWdJbgogICAqIENvcHlyaWdodCAoYykgMjAxNCBBcmFzIEFiYmFzaQogICAqCiAgICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLgogICAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZQogICAqLyFmdW5jdGlvbih0KXt2YXIgZT1mdW5jdGlvbih0KXt2YXIgZSxyLG4saSxhLG8scyxjLHUsbDtmb3IoL1teXHgwMC1ceEZGXS8udGVzdCh0KSxyPVtdLG49MCxpPSh0Kz1lPSJcMFwwXDBcMCIuc2xpY2UodC5sZW5ndGglNHx8NCkpLmxlbmd0aDtpPm47bis9NCkwIT09KGE9KHQuY2hhckNvZGVBdChuKTw8MjQpKyh0LmNoYXJDb2RlQXQobisxKTw8MTYpKyh0LmNoYXJDb2RlQXQobisyKTw8OCkrdC5jaGFyQ29kZUF0KG4rMykpPyhvPShhPSgoYT0oKGE9KChhPShhLShsPWElODUpKS84NSktKHU9YSU4NSkpLzg1KS0oYz1hJTg1KSkvODUpLShzPWElODUpKS84NSklODUsci5wdXNoKG8rMzMscyszMyxjKzMzLHUrMzMsbCszMykpOnIucHVzaCgxMjIpO3JldHVybiBmdW5jdGlvbih0LGUpe2Zvcih2YXIgcj1lO3I+MDtyLS0pdC5wb3AoKX0ocixlLmxlbmd0aCksU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcscikrIn4+In0scj1mdW5jdGlvbih0KXt2YXIgZSxyLG4saSxhLG89U3RyaW5nLHM9Imxlbmd0aCIsYz0yNTUsdT0iY2hhckNvZGVBdCIsbD0ic2xpY2UiLGg9InJlcGxhY2UiO2Zvcih0W2xdKC0yKSx0PXRbbF0oMCwtMilbaF0oL1xzL2csIiIpW2hdKCJ6IiwiISEhISEiKSxuPVtdLGk9MCxhPSh0Kz1lPSJ1dXV1dSJbbF0odFtzXSU1fHw1KSlbc107YT5pO2krPTUpcj01MjIwMDYyNSoodFt1XShpKS0zMykrNjE0MTI1Kih0W3VdKGkrMSktMzMpKzcyMjUqKHRbdV0oaSsyKS0zMykrODUqKHRbdV0oaSszKS0zMykrKHRbdV0oaSs0KS0zMyksbi5wdXNoKGMmcj4+MjQsYyZyPj4xNixjJnI+PjgsYyZyKTtyZXR1cm4gZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9ZTtyPjA7ci0tKXQucG9wKCl9KG4sZVtzXSksby5mcm9tQ2hhckNvZGUuYXBwbHkobyxuKX0sbj1mdW5jdGlvbih0KXt2YXIgZT1uZXcgUmVnRXhwKC9eKFswLTlBLUZhLWZdezJ9KSskLyk7aWYoLTEhPT0odD10LnJlcGxhY2UoL1xzL2csIiIpKS5pbmRleE9mKCI+IikmJih0PXQuc3Vic3RyKDAsdC5pbmRleE9mKCI+IikpKSx0Lmxlbmd0aCUyJiYodCs9IjAiKSwhMT09PWUudGVzdCh0KSlyZXR1cm4iIjtmb3IodmFyIHI9IiIsbj0wO248dC5sZW5ndGg7bis9MilyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCIweCIrKHRbbl0rdFtuKzFdKSk7cmV0dXJuIHJ9LGk9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyBVaW50OEFycmF5KHQubGVuZ3RoKSxyPXQubGVuZ3RoO3ItLTspZVtyXT10LmNoYXJDb2RlQXQocik7cmV0dXJuIHQ9KGU9X2UoZSkpLnJlZHVjZSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdCtTdHJpbmcuZnJvbUNoYXJDb2RlKGUpfSksIiIpfTt0LnByb2Nlc3NEYXRhQnlGaWx0ZXJzPWZ1bmN0aW9uKHQsYSl7dmFyIG89MCxzPXR8fCIiLGM9W107Zm9yKCJzdHJpbmciPT10eXBlb2YoYT1hfHxbXSkmJihhPVthXSksbz0wO288YS5sZW5ndGg7bys9MSlzd2l0Y2goYVtvXSl7Y2FzZSJBU0NJSTg1RGVjb2RlIjpjYXNlIi9BU0NJSTg1RGVjb2RlIjpzPXIocyksYy5wdXNoKCIvQVNDSUk4NUVuY29kZSIpO2JyZWFrO2Nhc2UiQVNDSUk4NUVuY29kZSI6Y2FzZSIvQVNDSUk4NUVuY29kZSI6cz1lKHMpLGMucHVzaCgiL0FTQ0lJODVEZWNvZGUiKTticmVhaztjYXNlIkFTQ0lJSGV4RGVjb2RlIjpjYXNlIi9BU0NJSUhleERlY29kZSI6cz1uKHMpLGMucHVzaCgiL0FTQ0lJSGV4RW5jb2RlIik7YnJlYWs7Y2FzZSJBU0NJSUhleEVuY29kZSI6Y2FzZSIvQVNDSUlIZXhFbmNvZGUiOnM9cy5zcGxpdCgiIikubWFwKChmdW5jdGlvbih0KXtyZXR1cm4oIjAiK3QuY2hhckNvZGVBdCgpLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTIpfSkpLmpvaW4oIiIpKyI+IixjLnB1c2goIi9BU0NJSUhleERlY29kZSIpO2JyZWFrO2Nhc2UiRmxhdGVFbmNvZGUiOmNhc2UiL0ZsYXRlRW5jb2RlIjpzPWkocyksYy5wdXNoKCIvRmxhdGVEZWNvZGUiKTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcignVGhlIGZpbHRlcjogIicrYVtvXSsnIiBpcyBub3QgaW1wbGVtZW50ZWQnKX1yZXR1cm57ZGF0YTpzLHJldmVyc2VDaGFpbjpjLnJldmVyc2UoKS5qb2luKCIgIil9fX0oTS5BUEkpLAovKioKICAgKiBAbGljZW5zZQogICAqIGpzUERGIGZpbGVsb2FkaW5nIFBsdWdJbgogICAqIENvcHlyaWdodCAoYykgMjAxOCBBcmFzIEFiYmFzaSAoYXJhcy5hYmJhc2lAZ21haWwuY29tKQogICAqCiAgICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLgogICAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZQogICAqLwpmdW5jdGlvbih0KXt0LmxvYWRGaWxlPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gZnVuY3Rpb24odCxlLHIpe2U9ITEhPT1lLHI9ImZ1bmN0aW9uIj09dHlwZW9mIHI/cjpmdW5jdGlvbigpe307dmFyIG49dm9pZCAwO3RyeXtuPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1uZXcgWE1MSHR0cFJlcXVlc3QsaT0wLGE9ZnVuY3Rpb24odCl7dmFyIGU9dC5sZW5ndGgscj1bXSxuPVN0cmluZy5mcm9tQ2hhckNvZGU7Zm9yKGk9MDtpPGU7aSs9MSlyLnB1c2gobigyNTUmdC5jaGFyQ29kZUF0KGkpKSk7cmV0dXJuIHIuam9pbigiIil9O2lmKG4ub3BlbigiR0VUIix0LCFlKSxuLm92ZXJyaWRlTWltZVR5cGUoInRleHQvcGxhaW47IGNoYXJzZXQ9eC11c2VyLWRlZmluZWQiKSwhMT09PWUmJihuLm9ubG9hZD1mdW5jdGlvbigpezIwMD09PW4uc3RhdHVzP3IoYSh0aGlzLnJlc3BvbnNlVGV4dCkpOnIodm9pZCAwKX0pLG4uc2VuZChudWxsKSxlJiYyMDA9PT1uLnN0YXR1cylyZXR1cm4gYShuLnJlc3BvbnNlVGV4dCl9KHQsZSxyKX1jYXRjaCh0KXt9cmV0dXJuIG59KHQsZSxyKX0sdC5sb2FkSW1hZ2VGaWxlPXQubG9hZEZpbGV9KE0uQVBJKSxmdW5jdGlvbihuKXtmdW5jdGlvbiBpKCl7cmV0dXJuKHIuaHRtbDJjYW52YXM/UHJvbWlzZS5yZXNvbHZlKHIuaHRtbDJjYW52YXMpOiJvYmplY3QiPT09KHZvaWQgMD09PXQ/InVuZGVmaW5lZCI6ZSh0KSkmJiJ1bmRlZmluZWQiIT10eXBlb2YgbW9kdWxlP25ldyBQcm9taXNlKChmdW5jdGlvbih0LGUpe3RyeXt0KHJlcXVpcmUoImh0bWwyY2FudmFzIikpfWNhdGNoKHQpe2UodCl9fSkpOiJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/bmV3IFByb21pc2UoKGZ1bmN0aW9uKHQsZSl7dHJ5e3JlcXVpcmUoWyJodG1sMmNhbnZhcyJdLHQpfWNhdGNoKHQpe2UodCl9fSkpOlByb21pc2UucmVqZWN0KG5ldyBFcnJvcigiQ291bGQgbm90IGxvYWQgaHRtbDJjYW52YXMiKSkpLmNhdGNoKChmdW5jdGlvbih0KXtyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCJDb3VsZCBub3QgbG9hZCBodG1sMmNhbnZhczogIit0KSl9KSkudGhlbigoZnVuY3Rpb24odCl7cmV0dXJuIHQuZGVmYXVsdD90LmRlZmF1bHQ6dH0pKX1mdW5jdGlvbiBhKCl7cmV0dXJuKHIuRE9NUHVyaWZ5P1Byb21pc2UucmVzb2x2ZShyLkRPTVB1cmlmeSk6Im9iamVjdCI9PT0odm9pZCAwPT09dD8idW5kZWZpbmVkIjplKHQpKSYmInVuZGVmaW5lZCIhPXR5cGVvZiBtb2R1bGU/bmV3IFByb21pc2UoKGZ1bmN0aW9uKHQsZSl7dHJ5e3QocmVxdWlyZSgiZG9tcHVyaWZ5IikpfWNhdGNoKHQpe2UodCl9fSkpOiJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/bmV3IFByb21pc2UoKGZ1bmN0aW9uKHQsZSl7dHJ5e3JlcXVpcmUoWyJkb21wdXJpZnkiXSx0KX1jYXRjaCh0KXtlKHQpfX0pKTpQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoIkNvdWxkIG5vdCBsb2FkIGRvbXB1cmlmeSIpKSkuY2F0Y2goKGZ1bmN0aW9uKHQpe3JldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoIkNvdWxkIG5vdCBsb2FkIGRvbXB1cmlmeTogIit0KSl9KSkudGhlbigoZnVuY3Rpb24odCl7cmV0dXJuIHQuZGVmYXVsdD90LmRlZmF1bHQ6dH0pKX12YXIgbz1mdW5jdGlvbih0KXt2YXIgcj1lKHQpO3JldHVybiJ1bmRlZmluZWQiPT09cj8idW5kZWZpbmVkIjoic3RyaW5nIj09PXJ8fHQgaW5zdGFuY2VvZiBTdHJpbmc/InN0cmluZyI6Im51bWJlciI9PT1yfHx0IGluc3RhbmNlb2YgTnVtYmVyPyJudW1iZXIiOiJmdW5jdGlvbiI9PT1yfHx0IGluc3RhbmNlb2YgRnVuY3Rpb24/ImZ1bmN0aW9uIjp0JiZ0LmNvbnN0cnVjdG9yPT09QXJyYXk/ImFycmF5Ijp0JiYxPT09dC5ub2RlVHlwZT8iZWxlbWVudCI6Im9iamVjdCI9PT1yPyJvYmplY3QiOiJ1bmtub3duIn0scz1mdW5jdGlvbih0LGUpe3ZhciByPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodCk7Zm9yKHZhciBuIGluIGUuY2xhc3NOYW1lJiYoci5jbGFzc05hbWU9ZS5jbGFzc05hbWUpLGUuaW5uZXJIVE1MJiZlLmRvbXB1cmlmeSYmKHIuaW5uZXJIVE1MPWUuZG9tcHVyaWZ5LnNhbml0aXplKGUuaW5uZXJIVE1MKSksZS5zdHlsZSlyLnN0eWxlW25dPWUuc3R5bGVbbl07cmV0dXJuIHJ9LGM9ZnVuY3Rpb24gdChlKXt2YXIgcj1PYmplY3QuYXNzaWduKHQuY29udmVydChQcm9taXNlLnJlc29sdmUoKSksSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0LnRlbXBsYXRlKSkpLG49dC5jb252ZXJ0KFByb21pc2UucmVzb2x2ZSgpLHIpO3JldHVybiBuPShuPW4uc2V0UHJvZ3Jlc3MoMSx0LDEsW3RdKSkuc2V0KGUpfTsoYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShQcm9taXNlLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWMsYy5jb252ZXJ0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuX19wcm90b19fPWV8fGMucHJvdG90eXBlLHR9LGMudGVtcGxhdGU9e3Byb3A6e3NyYzpudWxsLGNvbnRhaW5lcjpudWxsLG92ZXJsYXk6bnVsbCxjYW52YXM6bnVsbCxpbWc6bnVsbCxwZGY6bnVsbCxwYWdlU2l6ZTpudWxsLGNhbGxiYWNrOmZ1bmN0aW9uKCl7fX0scHJvZ3Jlc3M6e3ZhbDowLHN0YXRlOm51bGwsbjowLHN0YWNrOltdfSxvcHQ6e2ZpbGVuYW1lOiJmaWxlLnBkZiIsbWFyZ2luOlswLDAsMCwwXSxlbmFibGVMaW5rczohMCx4OjAseTowLGh0bWwyY2FudmFzOnt9LGpzUERGOnt9LGJhY2tncm91bmRDb2xvcjoidHJhbnNwYXJlbnQifX0sYy5wcm90b3R5cGUuZnJvbT1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnRoZW4oKGZ1bmN0aW9uKCl7c3dpdGNoKGU9ZXx8ZnVuY3Rpb24odCl7c3dpdGNoKG8odCkpe2Nhc2Uic3RyaW5nIjpyZXR1cm4ic3RyaW5nIjtjYXNlImVsZW1lbnQiOnJldHVybiJjYW52YXMiPT09dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPyJjYW52YXMiOiJlbGVtZW50IjtkZWZhdWx0OnJldHVybiJ1bmtub3duIn19KHQpKXtjYXNlInN0cmluZyI6cmV0dXJuIHRoaXMudGhlbihhKS50aGVuKChmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5zZXQoe3NyYzpzKCJkaXYiLHtpbm5lckhUTUw6dCxkb21wdXJpZnk6ZX0pfSl9KSk7Y2FzZSJlbGVtZW50IjpyZXR1cm4gdGhpcy5zZXQoe3NyYzp0fSk7Y2FzZSJjYW52YXMiOnJldHVybiB0aGlzLnNldCh7Y2FudmFzOnR9KTtjYXNlImltZyI6cmV0dXJuIHRoaXMuc2V0KHtpbWc6dH0pO2RlZmF1bHQ6cmV0dXJuIHRoaXMuZXJyb3IoIlVua25vd24gc291cmNlIHR5cGUuIil9fSkpfSxjLnByb3RvdHlwZS50bz1mdW5jdGlvbih0KXtzd2l0Y2godCl7Y2FzZSJjb250YWluZXIiOnJldHVybiB0aGlzLnRvQ29udGFpbmVyKCk7Y2FzZSJjYW52YXMiOnJldHVybiB0aGlzLnRvQ2FudmFzKCk7Y2FzZSJpbWciOnJldHVybiB0aGlzLnRvSW1nKCk7Y2FzZSJwZGYiOnJldHVybiB0aGlzLnRvUGRmKCk7ZGVmYXVsdDpyZXR1cm4gdGhpcy5lcnJvcigiSW52YWxpZCB0YXJnZXQuIil9fSxjLnByb3RvdHlwZS50b0NvbnRhaW5lcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRoZW5MaXN0KFtmdW5jdGlvbigpe3JldHVybiB0aGlzLnByb3Auc3JjfHx0aGlzLmVycm9yKCJDYW5ub3QgZHVwbGljYXRlIC0gbm8gc291cmNlIEhUTUwuIil9LGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJvcC5wYWdlU2l6ZXx8dGhpcy5zZXRQYWdlU2l6ZSgpfV0pLnRoZW4oKGZ1bmN0aW9uKCl7dmFyIHQ9e3Bvc2l0aW9uOiJyZWxhdGl2ZSIsZGlzcGxheToiaW5saW5lLWJsb2NrIix3aWR0aDooIm51bWJlciIhPXR5cGVvZiB0aGlzLm9wdC53aWR0aHx8aXNOYU4odGhpcy5vcHQud2lkdGgpfHwibnVtYmVyIiE9dHlwZW9mIHRoaXMub3B0LndpbmRvd1dpZHRofHxpc05hTih0aGlzLm9wdC53aW5kb3dXaWR0aCk/TWF0aC5tYXgodGhpcy5wcm9wLnNyYy5jbGllbnRXaWR0aCx0aGlzLnByb3Auc3JjLnNjcm9sbFdpZHRoLHRoaXMucHJvcC5zcmMub2Zmc2V0V2lkdGgpOnRoaXMub3B0LndpbmRvd1dpZHRoKSsicHgiLGxlZnQ6MCxyaWdodDowLHRvcDowLG1hcmdpbjoiYXV0byIsYmFja2dyb3VuZENvbG9yOnRoaXMub3B0LmJhY2tncm91bmRDb2xvcn0sZT1mdW5jdGlvbiB0KGUscil7Zm9yKHZhciBuPTM9PT1lLm5vZGVUeXBlP2RvY3VtZW50LmNyZWF0ZVRleHROb2RlKGUubm9kZVZhbHVlKTplLmNsb25lTm9kZSghMSksaT1lLmZpcnN0Q2hpbGQ7aTtpPWkubmV4dFNpYmxpbmcpITAhPT1yJiYxPT09aS5ub2RlVHlwZSYmIlNDUklQVCI9PT1pLm5vZGVOYW1lfHxuLmFwcGVuZENoaWxkKHQoaSxyKSk7cmV0dXJuIDE9PT1lLm5vZGVUeXBlJiYoIkNBTlZBUyI9PT1lLm5vZGVOYW1lPyhuLndpZHRoPWUud2lkdGgsbi5oZWlnaHQ9ZS5oZWlnaHQsbi5nZXRDb250ZXh0KCIyZCIpLmRyYXdJbWFnZShlLDAsMCkpOiJURVhUQVJFQSIhPT1lLm5vZGVOYW1lJiYiU0VMRUNUIiE9PWUubm9kZU5hbWV8fChuLnZhbHVlPWUudmFsdWUpLG4uYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsKGZ1bmN0aW9uKCl7bi5zY3JvbGxUb3A9ZS5zY3JvbGxUb3Asbi5zY3JvbGxMZWZ0PWUuc2Nyb2xsTGVmdH0pLCEwKSksbn0odGhpcy5wcm9wLnNyYyx0aGlzLm9wdC5odG1sMmNhbnZhcy5qYXZhc2NyaXB0RW5hYmxlZCk7IkJPRFkiPT09ZS50YWdOYW1lJiYodC5oZWlnaHQ9TWF0aC5tYXgoZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQsZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHQsZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0LGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vZmZzZXRIZWlnaHQpKyJweCIpLHRoaXMucHJvcC5vdmVybGF5PXMoImRpdiIse2NsYXNzTmFtZToiaHRtbDJwZGZfX292ZXJsYXkiLHN0eWxlOntwb3NpdGlvbjoiZml4ZWQiLG92ZXJmbG93OiJoaWRkZW4iLHpJbmRleDoxZTMsbGVmdDoiLTEwMDAwMHB4IixyaWdodDowLGJvdHRvbTowLHRvcDowfX0pLHRoaXMucHJvcC5jb250YWluZXI9cygiZGl2Iix7Y2xhc3NOYW1lOiJodG1sMnBkZl9fY29udGFpbmVyIixzdHlsZTp0fSksdGhpcy5wcm9wLmNvbnRhaW5lci5hcHBlbmRDaGlsZChlKSx0aGlzLnByb3AuY29udGFpbmVyLmZpcnN0Q2hpbGQuYXBwZW5kQ2hpbGQocygiZGl2Iix7c3R5bGU6e2NsZWFyOiJib3RoIixib3JkZXI6IjAgbm9uZSB0cmFuc3BhcmVudCIsbWFyZ2luOjAscGFkZGluZzowLGhlaWdodDowfX0pKSx0aGlzLnByb3AuY29udGFpbmVyLnN0eWxlLmZsb2F0PSJub25lIix0aGlzLnByb3Aub3ZlcmxheS5hcHBlbmRDaGlsZCh0aGlzLnByb3AuY29udGFpbmVyKSxkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMucHJvcC5vdmVybGF5KSx0aGlzLnByb3AuY29udGFpbmVyLmZpcnN0Q2hpbGQuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIix0aGlzLnByb3AuY29udGFpbmVyLmhlaWdodD1NYXRoLm1heCh0aGlzLnByb3AuY29udGFpbmVyLmZpcnN0Q2hpbGQuY2xpZW50SGVpZ2h0LHRoaXMucHJvcC5jb250YWluZXIuZmlyc3RDaGlsZC5zY3JvbGxIZWlnaHQsdGhpcy5wcm9wLmNvbnRhaW5lci5maXJzdENoaWxkLm9mZnNldEhlaWdodCkrInB4In0pKX0sYy5wcm90b3R5cGUudG9DYW52YXM9ZnVuY3Rpb24oKXt2YXIgdD1bZnVuY3Rpb24oKXtyZXR1cm4gZG9jdW1lbnQuYm9keS5jb250YWlucyh0aGlzLnByb3AuY29udGFpbmVyKXx8dGhpcy50b0NvbnRhaW5lcigpfV07cmV0dXJuIHRoaXMudGhlbkxpc3QodCkudGhlbihpKS50aGVuKChmdW5jdGlvbih0KXt2YXIgZT1PYmplY3QuYXNzaWduKHt9LHRoaXMub3B0Lmh0bWwyY2FudmFzKTtyZXR1cm4gZGVsZXRlIGUub25yZW5kZXJlZCx0KHRoaXMucHJvcC5jb250YWluZXIsZSl9KSkudGhlbigoZnVuY3Rpb24odCl7KHRoaXMub3B0Lmh0bWwyY2FudmFzLm9ucmVuZGVyZWR8fGZ1bmN0aW9uKCl7fSkodCksdGhpcy5wcm9wLmNhbnZhcz10LGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGhpcy5wcm9wLm92ZXJsYXkpfSkpfSxjLnByb3RvdHlwZS50b0NvbnRleHQyZD1mdW5jdGlvbigpe3ZhciB0PVtmdW5jdGlvbigpe3JldHVybiBkb2N1bWVudC5ib2R5LmNvbnRhaW5zKHRoaXMucHJvcC5jb250YWluZXIpfHx0aGlzLnRvQ29udGFpbmVyKCl9XTtyZXR1cm4gdGhpcy50aGVuTGlzdCh0KS50aGVuKGkpLnRoZW4oKGZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMub3B0LmpzUERGLHI9dGhpcy5vcHQuZm9udEZhY2VzLG49Im51bWJlciIhPXR5cGVvZiB0aGlzLm9wdC53aWR0aHx8aXNOYU4odGhpcy5vcHQud2lkdGgpfHwibnVtYmVyIiE9dHlwZW9mIHRoaXMub3B0LndpbmRvd1dpZHRofHxpc05hTih0aGlzLm9wdC53aW5kb3dXaWR0aCk/MTp0aGlzLm9wdC53aWR0aC90aGlzLm9wdC53aW5kb3dXaWR0aCxpPU9iamVjdC5hc3NpZ24oe2FzeW5jOiEwLGFsbG93VGFpbnQ6ITAsc2NhbGU6bixzY3JvbGxYOnRoaXMub3B0LnNjcm9sbFh8fDAsc2Nyb2xsWTp0aGlzLm9wdC5zY3JvbGxZfHwwLGJhY2tncm91bmRDb2xvcjoiI2ZmZmZmZiIsaW1hZ2VUaW1lb3V0OjE1ZTMsbG9nZ2luZzohMCxwcm94eTpudWxsLHJlbW92ZUNvbnRhaW5lcjohMCxmb3JlaWduT2JqZWN0UmVuZGVyaW5nOiExLHVzZUNPUlM6ITF9LHRoaXMub3B0Lmh0bWwyY2FudmFzKTtpZihkZWxldGUgaS5vbnJlbmRlcmVkLGUuY29udGV4dDJkLmF1dG9QYWdpbmc9dm9pZCAwPT09dGhpcy5vcHQuYXV0b1BhZ2luZ3x8dGhpcy5vcHQuYXV0b1BhZ2luZyxlLmNvbnRleHQyZC5wb3NYPXRoaXMub3B0LngsZS5jb250ZXh0MmQucG9zWT10aGlzLm9wdC55LGUuY29udGV4dDJkLm1hcmdpbj10aGlzLm9wdC5tYXJnaW4sZS5jb250ZXh0MmQuZm9udEZhY2VzPXIscilmb3IodmFyIGE9MDthPHIubGVuZ3RoOysrYSl7dmFyIG89clthXSxzPW8uc3JjLmZpbmQoKGZ1bmN0aW9uKHQpe3JldHVybiJ0cnVldHlwZSI9PT10LmZvcm1hdH0pKTtzJiZlLmFkZEZvbnQocy51cmwsby5yZWYubmFtZSxvLnJlZi5zdHlsZSl9cmV0dXJuIGkud2luZG93SGVpZ2h0PWkud2luZG93SGVpZ2h0fHwwLGkud2luZG93SGVpZ2h0PTA9PWkud2luZG93SGVpZ2h0P01hdGgubWF4KHRoaXMucHJvcC5jb250YWluZXIuY2xpZW50SGVpZ2h0LHRoaXMucHJvcC5jb250YWluZXIuc2Nyb2xsSGVpZ2h0LHRoaXMucHJvcC5jb250YWluZXIub2Zmc2V0SGVpZ2h0KTppLndpbmRvd0hlaWdodCxlLmNvbnRleHQyZC5zYXZlKCEwKSx0KHRoaXMucHJvcC5jb250YWluZXIsaSl9KSkudGhlbigoZnVuY3Rpb24odCl7dGhpcy5vcHQuanNQREYuY29udGV4dDJkLnJlc3RvcmUoITApLCh0aGlzLm9wdC5odG1sMmNhbnZhcy5vbnJlbmRlcmVkfHxmdW5jdGlvbigpe30pKHQpLHRoaXMucHJvcC5jYW52YXM9dCxkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHRoaXMucHJvcC5vdmVybGF5KX0pKX0sYy5wcm90b3R5cGUudG9JbWc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50aGVuTGlzdChbZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcm9wLmNhbnZhc3x8dGhpcy50b0NhbnZhcygpfV0pLnRoZW4oKGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5wcm9wLmNhbnZhcy50b0RhdGFVUkwoImltYWdlLyIrdGhpcy5vcHQuaW1hZ2UudHlwZSx0aGlzLm9wdC5pbWFnZS5xdWFsaXR5KTt0aGlzLnByb3AuaW1nPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLHRoaXMucHJvcC5pbWcuc3JjPXR9KSl9LGMucHJvdG90eXBlLnRvUGRmPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGhlbkxpc3QoW2Z1bmN0aW9uKCl7cmV0dXJuIHRoaXMudG9Db250ZXh0MmQoKX1dKS50aGVuKChmdW5jdGlvbigpe3RoaXMucHJvcC5wZGY9dGhpcy5wcm9wLnBkZnx8dGhpcy5vcHQuanNQREZ9KSl9LGMucHJvdG90eXBlLm91dHB1dD1mdW5jdGlvbih0LGUscil7cmV0dXJuImltZyI9PT0ocj1yfHwicGRmIikudG9Mb3dlckNhc2UoKXx8ImltYWdlIj09PXIudG9Mb3dlckNhc2UoKT90aGlzLm91dHB1dEltZyh0LGUpOnRoaXMub3V0cHV0UGRmKHQsZSl9LGMucHJvdG90eXBlLm91dHB1dFBkZj1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnRoZW5MaXN0KFtmdW5jdGlvbigpe3JldHVybiB0aGlzLnByb3AucGRmfHx0aGlzLnRvUGRmKCl9XSkudGhlbigoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcm9wLnBkZi5vdXRwdXQodCxlKX0pKX0sYy5wcm90b3R5cGUub3V0cHV0SW1nPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnRoZW5MaXN0KFtmdW5jdGlvbigpe3JldHVybiB0aGlzLnByb3AuaW1nfHx0aGlzLnRvSW1nKCl9XSkudGhlbigoZnVuY3Rpb24oKXtzd2l0Y2godCl7Y2FzZSB2b2lkIDA6Y2FzZSJpbWciOnJldHVybiB0aGlzLnByb3AuaW1nO2Nhc2UiZGF0YXVyaXN0cmluZyI6Y2FzZSJkYXRhdXJsc3RyaW5nIjpyZXR1cm4gdGhpcy5wcm9wLmltZy5zcmM7Y2FzZSJkYXRhdXJpIjpjYXNlImRhdGF1cmwiOnJldHVybiBkb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMucHJvcC5pbWcuc3JjO2RlZmF1bHQ6dGhyb3cnSW1hZ2Ugb3V0cHV0IHR5cGUgIicrdCsnIiBpcyBub3Qgc3VwcG9ydGVkLid9fSkpfSxjLnByb3RvdHlwZS5zYXZlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnRoZW5MaXN0KFtmdW5jdGlvbigpe3JldHVybiB0aGlzLnByb3AucGRmfHx0aGlzLnRvUGRmKCl9XSkuc2V0KHQ/e2ZpbGVuYW1lOnR9Om51bGwpLnRoZW4oKGZ1bmN0aW9uKCl7dGhpcy5wcm9wLnBkZi5zYXZlKHRoaXMub3B0LmZpbGVuYW1lKX0pKX0sYy5wcm90b3R5cGUuZG9DYWxsYmFjaz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRoZW5MaXN0KFtmdW5jdGlvbigpe3JldHVybiB0aGlzLnByb3AucGRmfHx0aGlzLnRvUGRmKCl9XSkudGhlbigoZnVuY3Rpb24oKXt0aGlzLnByb3AuY2FsbGJhY2sodGhpcy5wcm9wLnBkZil9KSl9LGMucHJvdG90eXBlLnNldD1mdW5jdGlvbih0KXtpZigib2JqZWN0IiE9PW8odCkpcmV0dXJuIHRoaXM7dmFyIGU9T2JqZWN0LmtleXModHx8e30pLm1hcCgoZnVuY3Rpb24oZSl7aWYoZSBpbiBjLnRlbXBsYXRlLnByb3ApcmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5wcm9wW2VdPXRbZV19O3N3aXRjaChlKXtjYXNlIm1hcmdpbiI6cmV0dXJuIHRoaXMuc2V0TWFyZ2luLmJpbmQodGhpcyx0Lm1hcmdpbik7Y2FzZSJqc1BERiI6cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0LmpzUERGPXQuanNQREYsdGhpcy5zZXRQYWdlU2l6ZSgpfTtjYXNlInBhZ2VTaXplIjpyZXR1cm4gdGhpcy5zZXRQYWdlU2l6ZS5iaW5kKHRoaXMsdC5wYWdlU2l6ZSk7ZGVmYXVsdDpyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLm9wdFtlXT10W2VdfX19KSx0aGlzKTtyZXR1cm4gdGhpcy50aGVuKChmdW5jdGlvbigpe3JldHVybiB0aGlzLnRoZW5MaXN0KGUpfSkpfSxjLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy50aGVuKChmdW5jdGlvbigpe3ZhciByPXQgaW4gYy50ZW1wbGF0ZS5wcm9wP3RoaXMucHJvcFt0XTp0aGlzLm9wdFt0XTtyZXR1cm4gZT9lKHIpOnJ9KSl9LGMucHJvdG90eXBlLnNldE1hcmdpbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy50aGVuKChmdW5jdGlvbigpe3N3aXRjaChvKHQpKXtjYXNlIm51bWJlciI6dD1bdCx0LHQsdF07Y2FzZSJhcnJheSI6aWYoMj09PXQubGVuZ3RoJiYodD1bdFswXSx0WzFdLHRbMF0sdFsxXV0pLDQ9PT10Lmxlbmd0aClicmVhaztkZWZhdWx0OnJldHVybiB0aGlzLmVycm9yKCJJbnZhbGlkIG1hcmdpbiBhcnJheS4iKX10aGlzLm9wdC5tYXJnaW49dH0pKS50aGVuKHRoaXMuc2V0UGFnZVNpemUpfSxjLnByb3RvdHlwZS5zZXRQYWdlU2l6ZT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsZSl7cmV0dXJuIE1hdGguZmxvb3IodCplLzcyKjk2KX1yZXR1cm4gdGhpcy50aGVuKChmdW5jdGlvbigpeyh0PXR8fE0uZ2V0UGFnZVNpemUodGhpcy5vcHQuanNQREYpKS5oYXNPd25Qcm9wZXJ0eSgiaW5uZXIiKXx8KHQuaW5uZXI9e3dpZHRoOnQud2lkdGgtdGhpcy5vcHQubWFyZ2luWzFdLXRoaXMub3B0Lm1hcmdpblszXSxoZWlnaHQ6dC5oZWlnaHQtdGhpcy5vcHQubWFyZ2luWzBdLXRoaXMub3B0Lm1hcmdpblsyXX0sdC5pbm5lci5weD17d2lkdGg6ZSh0LmlubmVyLndpZHRoLHQuayksaGVpZ2h0OmUodC5pbm5lci5oZWlnaHQsdC5rKX0sdC5pbm5lci5yYXRpbz10LmlubmVyLmhlaWdodC90LmlubmVyLndpZHRoKSx0aGlzLnByb3AucGFnZVNpemU9dH0pKX0sYy5wcm90b3R5cGUuc2V0UHJvZ3Jlc3M9ZnVuY3Rpb24odCxlLHIsbil7cmV0dXJuIG51bGwhPXQmJih0aGlzLnByb2dyZXNzLnZhbD10KSxudWxsIT1lJiYodGhpcy5wcm9ncmVzcy5zdGF0ZT1lKSxudWxsIT1yJiYodGhpcy5wcm9ncmVzcy5uPXIpLG51bGwhPW4mJih0aGlzLnByb2dyZXNzLnN0YWNrPW4pLHRoaXMucHJvZ3Jlc3MucmF0aW89dGhpcy5wcm9ncmVzcy52YWwvdGhpcy5wcm9ncmVzcy5zdGF0ZSx0aGlzfSxjLnByb3RvdHlwZS51cGRhdGVQcm9ncmVzcz1mdW5jdGlvbih0LGUscixuKXtyZXR1cm4gdGhpcy5zZXRQcm9ncmVzcyh0P3RoaXMucHJvZ3Jlc3MudmFsK3Q6bnVsbCxlfHxudWxsLHI/dGhpcy5wcm9ncmVzcy5uK3I6bnVsbCxuP3RoaXMucHJvZ3Jlc3Muc3RhY2suY29uY2F0KG4pOm51bGwpfSxjLnByb3RvdHlwZS50aGVuPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcztyZXR1cm4gdGhpcy50aGVuQ29yZSh0LGUsKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIudXBkYXRlUHJvZ3Jlc3MobnVsbCxudWxsLDEsW3RdKSxQcm9taXNlLnByb3RvdHlwZS50aGVuLmNhbGwodGhpcywoZnVuY3Rpb24oZSl7cmV0dXJuIHIudXBkYXRlUHJvZ3Jlc3MobnVsbCx0KSxlfSkpLnRoZW4odCxlKS50aGVuKChmdW5jdGlvbih0KXtyZXR1cm4gci51cGRhdGVQcm9ncmVzcygxKSx0fSkpfSkpfSxjLnByb3RvdHlwZS50aGVuQ29yZT1mdW5jdGlvbih0LGUscil7cj1yfHxQcm9taXNlLnByb3RvdHlwZS50aGVuO3QmJih0PXQuYmluZCh0aGlzKSksZSYmKGU9ZS5iaW5kKHRoaXMpKTt2YXIgbj0tMSE9PVByb21pc2UudG9TdHJpbmcoKS5pbmRleE9mKCJbbmF0aXZlIGNvZGVdIikmJiJQcm9taXNlIj09PVByb21pc2UubmFtZT90aGlzOmMuY29udmVydChPYmplY3QuYXNzaWduKHt9LHRoaXMpLFByb21pc2UucHJvdG90eXBlKSxpPXIuY2FsbChuLHQsZSk7cmV0dXJuIGMuY29udmVydChpLHRoaXMuX19wcm90b19fKX0sYy5wcm90b3R5cGUudGhlbkV4dGVybmFsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFByb21pc2UucHJvdG90eXBlLnRoZW4uY2FsbCh0aGlzLHQsZSl9LGMucHJvdG90eXBlLnRoZW5MaXN0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7ZT1lLnRoZW5Db3JlKHQpfSkpLGV9LGMucHJvdG90eXBlLmNhdGNoPWZ1bmN0aW9uKHQpe3QmJih0PXQuYmluZCh0aGlzKSk7dmFyIGU9UHJvbWlzZS5wcm90b3R5cGUuY2F0Y2guY2FsbCh0aGlzLHQpO3JldHVybiBjLmNvbnZlcnQoZSx0aGlzKX0sYy5wcm90b3R5cGUuY2F0Y2hFeHRlcm5hbD1mdW5jdGlvbih0KXtyZXR1cm4gUHJvbWlzZS5wcm90b3R5cGUuY2F0Y2guY2FsbCh0aGlzLHQpfSxjLnByb3RvdHlwZS5lcnJvcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy50aGVuKChmdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcih0KX0pKX0sYy5wcm90b3R5cGUudXNpbmc9Yy5wcm90b3R5cGUuc2V0LGMucHJvdG90eXBlLnNhdmVBcz1jLnByb3RvdHlwZS5zYXZlLGMucHJvdG90eXBlLmV4cG9ydD1jLnByb3RvdHlwZS5vdXRwdXQsYy5wcm90b3R5cGUucnVuPWMucHJvdG90eXBlLnRoZW4sTS5nZXRQYWdlU2l6ZT1mdW5jdGlvbih0LHIsbil7aWYoIm9iamVjdCI9PT1lKHQpKXt2YXIgaT10O3Q9aS5vcmllbnRhdGlvbixyPWkudW5pdHx8cixuPWkuZm9ybWF0fHxufXI9cnx8Im1tIixuPW58fCJhNCIsdD0oIiIrKHR8fCJQIikpLnRvTG93ZXJDYXNlKCk7dmFyIGEsbz0oIiIrbikudG9Mb3dlckNhc2UoKSxzPXthMDpbMjM4My45NCwzMzcwLjM5XSxhMTpbMTY4My43OCwyMzgzLjk0XSxhMjpbMTE5MC41NSwxNjgzLjc4XSxhMzpbODQxLjg5LDExOTAuNTVdLGE0Ols1OTUuMjgsODQxLjg5XSxhNTpbNDE5LjUzLDU5NS4yOF0sYTY6WzI5Ny42NCw0MTkuNTNdLGE3OlsyMDkuNzYsMjk3LjY0XSxhODpbMTQ3LjQsMjA5Ljc2XSxhOTpbMTA0Ljg4LDE0Ny40XSxhMTA6WzczLjcsMTA0Ljg4XSxiMDpbMjgzNC42NSw0MDA4LjE5XSxiMTpbMjAwNC4wOSwyODM0LjY1XSxiMjpbMTQxNy4zMiwyMDA0LjA5XSxiMzpbMTAwMC42MywxNDE3LjMyXSxiNDpbNzA4LjY2LDEwMDAuNjNdLGI1Ols0OTguOSw3MDguNjZdLGI2OlszNTQuMzMsNDk4LjldLGI3OlsyNDkuNDUsMzU0LjMzXSxiODpbMTc1Ljc1LDI0OS40NV0sYjk6WzEyNC43MiwxNzUuNzVdLGIxMDpbODcuODcsMTI0LjcyXSxjMDpbMjU5OS4zNywzNjc2LjU0XSxjMTpbMTgzNi44NSwyNTk5LjM3XSxjMjpbMTI5OC4yNywxODM2Ljg1XSxjMzpbOTE4LjQzLDEyOTguMjddLGM0Ols2NDkuMTMsOTE4LjQzXSxjNTpbNDU5LjIxLDY0OS4xM10sYzY6WzMyMy4xNSw0NTkuMjFdLGM3OlsyMjkuNjEsMzIzLjE1XSxjODpbMTYxLjU3LDIyOS42MV0sYzk6WzExMy4zOSwxNjEuNTddLGMxMDpbNzkuMzcsMTEzLjM5XSxkbDpbMzExLjgxLDYyMy42Ml0sbGV0dGVyOls2MTIsNzkyXSwiZ292ZXJubWVudC1sZXR0ZXIiOls1NzYsNzU2XSxsZWdhbDpbNjEyLDEwMDhdLCJqdW5pb3ItbGVnYWwiOls1NzYsMzYwXSxsZWRnZXI6WzEyMjQsNzkyXSx0YWJsb2lkOls3OTIsMTIyNF0sImNyZWRpdC1jYXJkIjpbMTUzLDI0M119O3N3aXRjaChyKXtjYXNlInB0IjphPTE7YnJlYWs7Y2FzZSJtbSI6YT03Mi8yNS40O2JyZWFrO2Nhc2UiY20iOmE9NzIvMi41NDticmVhaztjYXNlImluIjphPTcyO2JyZWFrO2Nhc2UicHgiOmE9Ljc1O2JyZWFrO2Nhc2UicGMiOmNhc2UiZW0iOmE9MTI7YnJlYWs7Y2FzZSJleCI6YT02O2JyZWFrO2RlZmF1bHQ6dGhyb3ciSW52YWxpZCB1bml0OiAiK3J9dmFyIGMsdT0wLGw9MDtpZihzLmhhc093blByb3BlcnR5KG8pKXU9c1tvXVsxXS9hLGw9c1tvXVswXS9hO2Vsc2UgdHJ5e3U9blsxXSxsPW5bMF19Y2F0Y2godCl7dGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGZvcm1hdDogIituKX1pZigicCI9PT10fHwicG9ydHJhaXQiPT09dCl0PSJwIixsPnUmJihjPWwsbD11LHU9Yyk7ZWxzZXtpZigibCIhPT10JiYibGFuZHNjYXBlIiE9PXQpdGhyb3ciSW52YWxpZCBvcmllbnRhdGlvbjogIit0O3Q9ImwiLHU+bCYmKGM9bCxsPXUsdT1jKX1yZXR1cm57d2lkdGg6bCxoZWlnaHQ6dSx1bml0OnIsazphLG9yaWVudGF0aW9uOnR9fSxuLmh0bWw9ZnVuY3Rpb24odCxlKXsoZT1lfHx7fSkuY2FsbGJhY2s9ZS5jYWxsYmFja3x8ZnVuY3Rpb24oKXt9LGUuaHRtbDJjYW52YXM9ZS5odG1sMmNhbnZhc3x8e30sZS5odG1sMmNhbnZhcy5jYW52YXM9ZS5odG1sMmNhbnZhcy5jYW52YXN8fHRoaXMuY2FudmFzLGUuanNQREY9ZS5qc1BERnx8dGhpcyxlLmZvbnRGYWNlcz1lLmZvbnRGYWNlcz9lLmZvbnRGYWNlcy5tYXAoQ3QpOm51bGw7dmFyIHI9bmV3IGMoZSk7cmV0dXJuIGUud29ya2VyP3I6ci5mcm9tKHQpLmRvQ2FsbGJhY2soKX19KE0uQVBJKSwKLyoqCiAgICogQGxpY2Vuc2UKICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAqIENvcHlyaWdodCAoYykgMjAxMyBZb3Vzc2VmIEJlZGRhZCwgeW91c3NlZi5iZWRkYWRAZ21haWwuY29tCiAgICoKICAgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKICAgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKICAgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCiAgICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAogICAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwogICAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwogICAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICAgKgogICAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCiAgICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCiAgICoKICAgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKICAgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKICAgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAogICAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUKICAgKiBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCiAgICogT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCiAgICogV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCiAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgKi8KZnVuY3Rpb24odCl7dmFyIGUscixuO3QuYWRkSlM9ZnVuY3Rpb24odCl7cmV0dXJuIG49dCx0aGlzLmludGVybmFsLmV2ZW50cy5zdWJzY3JpYmUoInBvc3RQdXRSZXNvdXJjZXMiLChmdW5jdGlvbigpe2U9dGhpcy5pbnRlcm5hbC5uZXdPYmplY3QoKSx0aGlzLmludGVybmFsLm91dCgiPDwiKSx0aGlzLmludGVybmFsLm91dCgiL05hbWVzIFsoRW1iZWRkZWRKUykgIisoZSsxKSsiIDAgUl0iKSx0aGlzLmludGVybmFsLm91dCgiPj4iKSx0aGlzLmludGVybmFsLm91dCgiZW5kb2JqIikscj10aGlzLmludGVybmFsLm5ld09iamVjdCgpLHRoaXMuaW50ZXJuYWwub3V0KCI8PCIpLHRoaXMuaW50ZXJuYWwub3V0KCIvUyAvSmF2YVNjcmlwdCIpLHRoaXMuaW50ZXJuYWwub3V0KCIvSlMgKCIrbisiKSIpLHRoaXMuaW50ZXJuYWwub3V0KCI+PiIpLHRoaXMuaW50ZXJuYWwub3V0KCJlbmRvYmoiKX0pKSx0aGlzLmludGVybmFsLmV2ZW50cy5zdWJzY3JpYmUoInB1dENhdGFsb2ciLChmdW5jdGlvbigpe3ZvaWQgMCE9PWUmJnZvaWQgMCE9PXImJnRoaXMuaW50ZXJuYWwub3V0KCIvTmFtZXMgPDwvSmF2YVNjcmlwdCAiK2UrIiAwIFI+PiIpfSkpLHRoaXN9fShNLkFQSSksCi8qKgogICAqIEBsaWNlbnNlCiAgICogQ29weXJpZ2h0IChjKSAyMDE0IFN0ZXZlbiBTcHVuZ2luIChUd2VsdmVUb25lIExMQykgIHN0ZXZlbkB0d2VsdmV0b25lLnR2CiAgICoKICAgKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuCiAgICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlCiAgICovCmZ1bmN0aW9uKHQpe3ZhciBlO3QuZXZlbnRzLnB1c2goWyJwb3N0UHV0UmVzb3VyY2VzIixmdW5jdGlvbigpe3ZhciB0PXRoaXMscj0vXihcZCspIDAgb2JqJC87aWYodGhpcy5vdXRsaW5lLnJvb3QuY2hpbGRyZW4ubGVuZ3RoPjApZm9yKHZhciBuPXQub3V0bGluZS5yZW5kZXIoKS5zcGxpdCgvXHJcbi8pLGk9MDtpPG4ubGVuZ3RoO2krKyl7dmFyIGE9bltpXSxvPXIuZXhlYyhhKTtpZihudWxsIT1vKXt2YXIgcz1vWzFdO3QuaW50ZXJuYWwubmV3T2JqZWN0RGVmZXJyZWRCZWdpbihzLCExKX10LmludGVybmFsLndyaXRlKGEpfWlmKHRoaXMub3V0bGluZS5jcmVhdGVOYW1lZERlc3RpbmF0aW9ucyl7dmFyIGM9dGhpcy5pbnRlcm5hbC5wYWdlcy5sZW5ndGgsdT1bXTtmb3IoaT0wO2k8YztpKyspe3ZhciBsPXQuaW50ZXJuYWwubmV3T2JqZWN0KCk7dS5wdXNoKGwpO3ZhciBoPXQuaW50ZXJuYWwuZ2V0UGFnZUluZm8oaSsxKTt0LmludGVybmFsLndyaXRlKCI8PCAvRFsiK2gub2JqSWQrIiAwIFIgL1hZWiBudWxsIG51bGwgbnVsbF0+PiBlbmRvYmoiKX12YXIgZj10LmludGVybmFsLm5ld09iamVjdCgpO3QuaW50ZXJuYWwud3JpdGUoIjw8IC9OYW1lcyBbICIpO2ZvcihpPTA7aTx1Lmxlbmd0aDtpKyspdC5pbnRlcm5hbC53cml0ZSgiKHBhZ2VfIisoaSsxKSsiKSIrdVtpXSsiIDAgUiIpO3QuaW50ZXJuYWwud3JpdGUoIiBdID4+IiwiZW5kb2JqIiksZT10LmludGVybmFsLm5ld09iamVjdCgpLHQuaW50ZXJuYWwud3JpdGUoIjw8IC9EZXN0cyAiK2YrIiAwIFIiKSx0LmludGVybmFsLndyaXRlKCI+PiIsImVuZG9iaiIpfX1dKSx0LmV2ZW50cy5wdXNoKFsicHV0Q2F0YWxvZyIsZnVuY3Rpb24oKXt0aGlzLm91dGxpbmUucm9vdC5jaGlsZHJlbi5sZW5ndGg+MCYmKHRoaXMuaW50ZXJuYWwud3JpdGUoIi9PdXRsaW5lcyIsdGhpcy5vdXRsaW5lLm1ha2VSZWYodGhpcy5vdXRsaW5lLnJvb3QpKSx0aGlzLm91dGxpbmUuY3JlYXRlTmFtZWREZXN0aW5hdGlvbnMmJnRoaXMuaW50ZXJuYWwud3JpdGUoIi9OYW1lcyAiK2UrIiAwIFIiKSl9XSksdC5ldmVudHMucHVzaChbImluaXRpYWxpemVkIixmdW5jdGlvbigpe3ZhciB0PXRoaXM7dC5vdXRsaW5lPXtjcmVhdGVOYW1lZERlc3RpbmF0aW9uczohMSxyb290OntjaGlsZHJlbjpbXX19LHQub3V0bGluZS5hZGQ9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXt0aXRsZTplLG9wdGlvbnM6cixjaGlsZHJlbjpbXX07cmV0dXJuIG51bGw9PXQmJih0PXRoaXMucm9vdCksdC5jaGlsZHJlbi5wdXNoKG4pLG59LHQub3V0bGluZS5yZW5kZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jdHg9e30sdGhpcy5jdHgudmFsPSIiLHRoaXMuY3R4LnBkZj10LHRoaXMuZ2VuSWRzX3IodGhpcy5yb290KSx0aGlzLnJlbmRlclJvb3QodGhpcy5yb290KSx0aGlzLnJlbmRlckl0ZW1zKHRoaXMucm9vdCksdGhpcy5jdHgudmFsfSx0Lm91dGxpbmUuZ2VuSWRzX3I9ZnVuY3Rpb24oZSl7ZS5pZD10LmludGVybmFsLm5ld09iamVjdERlZmVycmVkKCk7Zm9yKHZhciByPTA7cjxlLmNoaWxkcmVuLmxlbmd0aDtyKyspdGhpcy5nZW5JZHNfcihlLmNoaWxkcmVuW3JdKX0sdC5vdXRsaW5lLnJlbmRlclJvb3Q9ZnVuY3Rpb24odCl7dGhpcy5vYmpTdGFydCh0KSx0aGlzLmxpbmUoIi9UeXBlIC9PdXRsaW5lcyIpLHQuY2hpbGRyZW4ubGVuZ3RoPjAmJih0aGlzLmxpbmUoIi9GaXJzdCAiK3RoaXMubWFrZVJlZih0LmNoaWxkcmVuWzBdKSksdGhpcy5saW5lKCIvTGFzdCAiK3RoaXMubWFrZVJlZih0LmNoaWxkcmVuW3QuY2hpbGRyZW4ubGVuZ3RoLTFdKSkpLHRoaXMubGluZSgiL0NvdW50ICIrdGhpcy5jb3VudF9yKHtjb3VudDowfSx0KSksdGhpcy5vYmpFbmQoKX0sdC5vdXRsaW5lLnJlbmRlckl0ZW1zPWZ1bmN0aW9uKGUpe2Zvcih2YXIgcj10aGlzLmN0eC5wZGYuaW50ZXJuYWwuZ2V0VmVydGljYWxDb29yZGluYXRlU3RyaW5nLG49MDtuPGUuY2hpbGRyZW4ubGVuZ3RoO24rKyl7dmFyIGk9ZS5jaGlsZHJlbltuXTt0aGlzLm9ialN0YXJ0KGkpLHRoaXMubGluZSgiL1RpdGxlICIrdGhpcy5tYWtlU3RyaW5nKGkudGl0bGUpKSx0aGlzLmxpbmUoIi9QYXJlbnQgIit0aGlzLm1ha2VSZWYoZSkpLG4+MCYmdGhpcy5saW5lKCIvUHJldiAiK3RoaXMubWFrZVJlZihlLmNoaWxkcmVuW24tMV0pKSxuPGUuY2hpbGRyZW4ubGVuZ3RoLTEmJnRoaXMubGluZSgiL05leHQgIit0aGlzLm1ha2VSZWYoZS5jaGlsZHJlbltuKzFdKSksaS5jaGlsZHJlbi5sZW5ndGg+MCYmKHRoaXMubGluZSgiL0ZpcnN0ICIrdGhpcy5tYWtlUmVmKGkuY2hpbGRyZW5bMF0pKSx0aGlzLmxpbmUoIi9MYXN0ICIrdGhpcy5tYWtlUmVmKGkuY2hpbGRyZW5baS5jaGlsZHJlbi5sZW5ndGgtMV0pKSk7dmFyIGE9dGhpcy5jb3VudD10aGlzLmNvdW50X3Ioe2NvdW50OjB9LGkpO2lmKGE+MCYmdGhpcy5saW5lKCIvQ291bnQgIithKSxpLm9wdGlvbnMmJmkub3B0aW9ucy5wYWdlTnVtYmVyKXt2YXIgbz10LmludGVybmFsLmdldFBhZ2VJbmZvKGkub3B0aW9ucy5wYWdlTnVtYmVyKTt0aGlzLmxpbmUoIi9EZXN0IFsiK28ub2JqSWQrIiAwIFIgL1hZWiAwICIrcigwKSsiIDBdIil9dGhpcy5vYmpFbmQoKX1mb3IodmFyIHM9MDtzPGUuY2hpbGRyZW4ubGVuZ3RoO3MrKyl0aGlzLnJlbmRlckl0ZW1zKGUuY2hpbGRyZW5bc10pfSx0Lm91dGxpbmUubGluZT1mdW5jdGlvbih0KXt0aGlzLmN0eC52YWwrPXQrIlxyXG4ifSx0Lm91dGxpbmUubWFrZVJlZj1mdW5jdGlvbih0KXtyZXR1cm4gdC5pZCsiIDAgUiJ9LHQub3V0bGluZS5tYWtlU3RyaW5nPWZ1bmN0aW9uKGUpe3JldHVybiIoIit0LmludGVybmFsLnBkZkVzY2FwZShlKSsiKSJ9LHQub3V0bGluZS5vYmpTdGFydD1mdW5jdGlvbih0KXt0aGlzLmN0eC52YWwrPSJcclxuIit0LmlkKyIgMCBvYmpcclxuPDxcclxuIn0sdC5vdXRsaW5lLm9iakVuZD1mdW5jdGlvbigpe3RoaXMuY3R4LnZhbCs9Ij4+IFxyXG5lbmRvYmpcclxuIn0sdC5vdXRsaW5lLmNvdW50X3I9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9MDtyPGUuY2hpbGRyZW4ubGVuZ3RoO3IrKyl0LmNvdW50KyssdGhpcy5jb3VudF9yKHQsZS5jaGlsZHJlbltyXSk7cmV0dXJuIHQuY291bnR9fV0pfShNLkFQSSksCi8qKgogICAqIEBsaWNlbnNlCiAgICoKICAgKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuCiAgICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlCiAgICovCmZ1bmN0aW9uKHQpe3ZhciBlPVsxOTIsMTkzLDE5NCwxOTUsMTk2LDE5NywxOTgsMTk5XTt0LnByb2Nlc3NKUEVHPWZ1bmN0aW9uKHQscixuLGksYSxvKXt2YXIgcyxjPXRoaXMuZGVjb2RlLkRDVF9ERUNPREUsdT1udWxsO2lmKCJzdHJpbmciPT10eXBlb2YgdHx8dGhpcy5fX2FkZGltYWdlX18uaXNBcnJheUJ1ZmZlcih0KXx8dGhpcy5fX2FkZGltYWdlX18uaXNBcnJheUJ1ZmZlclZpZXcodCkpe3N3aXRjaCh0PWF8fHQsdD10aGlzLl9fYWRkaW1hZ2VfXy5pc0FycmF5QnVmZmVyKHQpP25ldyBVaW50OEFycmF5KHQpOnQsKHM9ZnVuY3Rpb24odCl7Zm9yKHZhciByLG49MjU2KnQuY2hhckNvZGVBdCg0KSt0LmNoYXJDb2RlQXQoNSksaT10Lmxlbmd0aCxhPXt3aWR0aDowLGhlaWdodDowLG51bWNvbXBvbmVudHM6MX0sbz00O288aTtvKz0yKXtpZihvKz1uLC0xIT09ZS5pbmRleE9mKHQuY2hhckNvZGVBdChvKzEpKSl7cj0yNTYqdC5jaGFyQ29kZUF0KG8rNSkrdC5jaGFyQ29kZUF0KG8rNiksYT17d2lkdGg6MjU2KnQuY2hhckNvZGVBdChvKzcpK3QuY2hhckNvZGVBdChvKzgpLGhlaWdodDpyLG51bWNvbXBvbmVudHM6dC5jaGFyQ29kZUF0KG8rOSl9O2JyZWFrfW49MjU2KnQuY2hhckNvZGVBdChvKzIpK3QuY2hhckNvZGVBdChvKzMpfXJldHVybiBhfSh0PXRoaXMuX19hZGRpbWFnZV9fLmlzQXJyYXlCdWZmZXJWaWV3KHQpP3RoaXMuX19hZGRpbWFnZV9fLmFycmF5QnVmZmVyVG9CaW5hcnlTdHJpbmcodCk6dCkpLm51bWNvbXBvbmVudHMpe2Nhc2UgMTpvPXRoaXMuY29sb3Jfc3BhY2VzLkRFVklDRV9HUkFZO2JyZWFrO2Nhc2UgNDpvPXRoaXMuY29sb3Jfc3BhY2VzLkRFVklDRV9DTVlLO2JyZWFrO2Nhc2UgMzpvPXRoaXMuY29sb3Jfc3BhY2VzLkRFVklDRV9SR0J9dT17ZGF0YTp0LHdpZHRoOnMud2lkdGgsaGVpZ2h0OnMuaGVpZ2h0LGNvbG9yU3BhY2U6byxiaXRzUGVyQ29tcG9uZW50OjgsZmlsdGVyOmMsaW5kZXg6cixhbGlhczpufX1yZXR1cm4gdX19KE0uQVBJKTt2YXIga2UsRmUsSWUsQ2UsamUsT2U9ZnVuY3Rpb24oKXt2YXIgdCxlLG47ZnVuY3Rpb24gaSh0KXt2YXIgZSxyLG4saSxhLG8scyxjLHUsbCxoLGYsZCxwO2Zvcih0aGlzLmRhdGE9dCx0aGlzLnBvcz04LHRoaXMucGFsZXR0ZT1bXSx0aGlzLmltZ0RhdGE9W10sdGhpcy50cmFuc3BhcmVuY3k9e30sdGhpcy5hbmltYXRpb249bnVsbCx0aGlzLnRleHQ9e30sbz1udWxsOzspe3N3aXRjaChlPXRoaXMucmVhZFVJbnQzMigpLHU9ZnVuY3Rpb24oKXt2YXIgdCxlO2ZvcihlPVtdLHQ9MDt0PDQ7Kyt0KWUucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKHRoaXMuZGF0YVt0aGlzLnBvcysrXSkpO3JldHVybiBlfS5jYWxsKHRoaXMpLmpvaW4oIiIpKXtjYXNlIklIRFIiOnRoaXMud2lkdGg9dGhpcy5yZWFkVUludDMyKCksdGhpcy5oZWlnaHQ9dGhpcy5yZWFkVUludDMyKCksdGhpcy5iaXRzPXRoaXMuZGF0YVt0aGlzLnBvcysrXSx0aGlzLmNvbG9yVHlwZT10aGlzLmRhdGFbdGhpcy5wb3MrK10sdGhpcy5jb21wcmVzc2lvbk1ldGhvZD10aGlzLmRhdGFbdGhpcy5wb3MrK10sdGhpcy5maWx0ZXJNZXRob2Q9dGhpcy5kYXRhW3RoaXMucG9zKytdLHRoaXMuaW50ZXJsYWNlTWV0aG9kPXRoaXMuZGF0YVt0aGlzLnBvcysrXTticmVhaztjYXNlImFjVEwiOnRoaXMuYW5pbWF0aW9uPXtudW1GcmFtZXM6dGhpcy5yZWFkVUludDMyKCksbnVtUGxheXM6dGhpcy5yZWFkVUludDMyKCl8fDEvMCxmcmFtZXM6W119O2JyZWFrO2Nhc2UiUExURSI6dGhpcy5wYWxldHRlPXRoaXMucmVhZChlKTticmVhaztjYXNlImZjVEwiOm8mJnRoaXMuYW5pbWF0aW9uLmZyYW1lcy5wdXNoKG8pLHRoaXMucG9zKz00LG89e3dpZHRoOnRoaXMucmVhZFVJbnQzMigpLGhlaWdodDp0aGlzLnJlYWRVSW50MzIoKSx4T2Zmc2V0OnRoaXMucmVhZFVJbnQzMigpLHlPZmZzZXQ6dGhpcy5yZWFkVUludDMyKCl9LGE9dGhpcy5yZWFkVUludDE2KCksaT10aGlzLnJlYWRVSW50MTYoKXx8MTAwLG8uZGVsYXk9MWUzKmEvaSxvLmRpc3Bvc2VPcD10aGlzLmRhdGFbdGhpcy5wb3MrK10sby5ibGVuZE9wPXRoaXMuZGF0YVt0aGlzLnBvcysrXSxvLmRhdGE9W107YnJlYWs7Y2FzZSJJREFUIjpjYXNlImZkQVQiOmZvcigiZmRBVCI9PT11JiYodGhpcy5wb3MrPTQsZS09NCksdD0obnVsbCE9bz9vLmRhdGE6dm9pZCAwKXx8dGhpcy5pbWdEYXRhLGY9MDswPD1lP2Y8ZTpmPmU7MDw9ZT8rK2Y6LS1mKXQucHVzaCh0aGlzLmRhdGFbdGhpcy5wb3MrK10pO2JyZWFrO2Nhc2UidFJOUyI6c3dpdGNoKHRoaXMudHJhbnNwYXJlbmN5PXt9LHRoaXMuY29sb3JUeXBlKXtjYXNlIDM6aWYobj10aGlzLnBhbGV0dGUubGVuZ3RoLzMsdGhpcy50cmFuc3BhcmVuY3kuaW5kZXhlZD10aGlzLnJlYWQoZSksdGhpcy50cmFuc3BhcmVuY3kuaW5kZXhlZC5sZW5ndGg+bil0aHJvdyBuZXcgRXJyb3IoIk1vcmUgdHJhbnNwYXJlbnQgY29sb3JzIHRoYW4gcGFsZXR0ZSBzaXplIik7aWYoKGw9bi10aGlzLnRyYW5zcGFyZW5jeS5pbmRleGVkLmxlbmd0aCk+MClmb3IoZD0wOzA8PWw/ZDxsOmQ+bDswPD1sPysrZDotLWQpdGhpcy50cmFuc3BhcmVuY3kuaW5kZXhlZC5wdXNoKDI1NSk7YnJlYWs7Y2FzZSAwOnRoaXMudHJhbnNwYXJlbmN5LmdyYXlzY2FsZT10aGlzLnJlYWQoZSlbMF07YnJlYWs7Y2FzZSAyOnRoaXMudHJhbnNwYXJlbmN5LnJnYj10aGlzLnJlYWQoZSl9YnJlYWs7Y2FzZSJ0RVh0IjpzPShoPXRoaXMucmVhZChlKSkuaW5kZXhPZigwKSxjPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLGguc2xpY2UoMCxzKSksdGhpcy50ZXh0W2NdPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLGguc2xpY2UocysxKSk7YnJlYWs7Y2FzZSJJRU5EIjpyZXR1cm4gbyYmdGhpcy5hbmltYXRpb24uZnJhbWVzLnB1c2gobyksdGhpcy5jb2xvcnM9ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5jb2xvclR5cGUpe2Nhc2UgMDpjYXNlIDM6Y2FzZSA0OnJldHVybiAxO2Nhc2UgMjpjYXNlIDY6cmV0dXJuIDN9fS5jYWxsKHRoaXMpLHRoaXMuaGFzQWxwaGFDaGFubmVsPTQ9PT0ocD10aGlzLmNvbG9yVHlwZSl8fDY9PT1wLHI9dGhpcy5jb2xvcnMrKHRoaXMuaGFzQWxwaGFDaGFubmVsPzE6MCksdGhpcy5waXhlbEJpdGxlbmd0aD10aGlzLmJpdHMqcix0aGlzLmNvbG9yU3BhY2U9ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5jb2xvcnMpe2Nhc2UgMTpyZXR1cm4iRGV2aWNlR3JheSI7Y2FzZSAzOnJldHVybiJEZXZpY2VSR0IifX0uY2FsbCh0aGlzKSx2b2lkKHRoaXMuaW1nRGF0YT1uZXcgVWludDhBcnJheSh0aGlzLmltZ0RhdGEpKTtkZWZhdWx0OnRoaXMucG9zKz1lfWlmKHRoaXMucG9zKz00LHRoaXMucG9zPnRoaXMuZGF0YS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJJbmNvbXBsZXRlIG9yIGNvcnJ1cHQgUE5HIGZpbGUiKX19aS5wcm90b3R5cGUucmVhZD1mdW5jdGlvbih0KXt2YXIgZSxyO2ZvcihyPVtdLGU9MDswPD10P2U8dDplPnQ7MDw9dD8rK2U6LS1lKXIucHVzaCh0aGlzLmRhdGFbdGhpcy5wb3MrK10pO3JldHVybiByfSxpLnByb3RvdHlwZS5yZWFkVUludDMyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF0YVt0aGlzLnBvcysrXTw8MjR8dGhpcy5kYXRhW3RoaXMucG9zKytdPDwxNnx0aGlzLmRhdGFbdGhpcy5wb3MrK108PDh8dGhpcy5kYXRhW3RoaXMucG9zKytdfSxpLnByb3RvdHlwZS5yZWFkVUludDE2PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF0YVt0aGlzLnBvcysrXTw8OHx0aGlzLmRhdGFbdGhpcy5wb3MrK119LGkucHJvdG90eXBlLmRlY29kZVBpeGVscz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLnBpeGVsQml0bGVuZ3RoLzgscj1uZXcgVWludDhBcnJheSh0aGlzLndpZHRoKnRoaXMuaGVpZ2h0KmUpLG49MCxpPXRoaXM7aWYobnVsbD09dCYmKHQ9dGhpcy5pbWdEYXRhKSwwPT09dC5sZW5ndGgpcmV0dXJuIG5ldyBVaW50OEFycmF5KDApO2Z1bmN0aW9uIGEoYSxvLHMsYyl7dmFyIHUsbCxoLGYsZCxwLGcsbSx2LGIseSx3LE4sTCxBLHgsUyxfLFAsayxGLEk9TWF0aC5jZWlsKChpLndpZHRoLWEpL3MpLEM9TWF0aC5jZWlsKChpLmhlaWdodC1vKS9jKSxqPWkud2lkdGg9PUkmJmkuaGVpZ2h0PT1DO2ZvcihMPWUqSSx3PWo/cjpuZXcgVWludDhBcnJheShMKkMpLHA9dC5sZW5ndGgsTj0wLGw9MDtOPEMmJm48cDspe3N3aXRjaCh0W24rK10pe2Nhc2UgMDpmb3IoZj1TPTA7UzxMO2Y9Uys9MSl3W2wrK109dFtuKytdO2JyZWFrO2Nhc2UgMTpmb3IoZj1fPTA7XzxMO2Y9Xys9MSl1PXRbbisrXSxkPWY8ZT8wOndbbC1lXSx3W2wrK109KHUrZCklMjU2O2JyZWFrO2Nhc2UgMjpmb3IoZj1QPTA7UDxMO2Y9UCs9MSl1PXRbbisrXSxoPShmLWYlZSkvZSxBPU4mJndbKE4tMSkqTCtoKmUrZiVlXSx3W2wrK109KEErdSklMjU2O2JyZWFrO2Nhc2UgMzpmb3IoZj1rPTA7azxMO2Y9ays9MSl1PXRbbisrXSxoPShmLWYlZSkvZSxkPWY8ZT8wOndbbC1lXSxBPU4mJndbKE4tMSkqTCtoKmUrZiVlXSx3W2wrK109KHUrTWF0aC5mbG9vcigoZCtBKS8yKSklMjU2O2JyZWFrO2Nhc2UgNDpmb3IoZj1GPTA7RjxMO2Y9Ris9MSl1PXRbbisrXSxoPShmLWYlZSkvZSxkPWY8ZT8wOndbbC1lXSwwPT09Tj9BPXg9MDooQT13WyhOLTEpKkwraCplK2YlZV0seD1oJiZ3WyhOLTEpKkwrKGgtMSkqZStmJWVdKSxnPWQrQS14LG09TWF0aC5hYnMoZy1kKSxiPU1hdGguYWJzKGctQSkseT1NYXRoLmFicyhnLXgpLHY9bTw9YiYmbTw9eT9kOmI8PXk/QTp4LHdbbCsrXT0odSt2KSUyNTY7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgZmlsdGVyIGFsZ29yaXRobTogIit0W24tMV0pfWlmKCFqKXt2YXIgTz0oKG8rTipjKSppLndpZHRoK2EpKmUsQj1OKkw7Zm9yKGY9MDtmPEk7Zis9MSl7Zm9yKHZhciBNPTA7TTxlO00rPTEpcltPKytdPXdbQisrXTtPKz0ocy0xKSplfX1OKyt9fXJldHVybiB0PVBlKHQpLDE9PWkuaW50ZXJsYWNlTWV0aG9kPyhhKDAsMCw4LDgpLGEoNCwwLDgsOCksYSgwLDQsNCw4KSxhKDIsMCw0LDQpLGEoMCwyLDIsNCksYSgxLDAsMiwyKSxhKDAsMSwxLDIpKTphKDAsMCwxLDEpLHJ9LGkucHJvdG90eXBlLmRlY29kZVBhbGV0dGU9ZnVuY3Rpb24oKXt2YXIgdCxlLHIsbixpLGEsbyxzLGM7Zm9yKHI9dGhpcy5wYWxldHRlLGE9dGhpcy50cmFuc3BhcmVuY3kuaW5kZXhlZHx8W10saT1uZXcgVWludDhBcnJheSgoYS5sZW5ndGh8fDApK3IubGVuZ3RoKSxuPTAsdD0wLGU9bz0wLHM9ci5sZW5ndGg7bzxzO2U9bys9MylpW24rK109cltlXSxpW24rK109cltlKzFdLGlbbisrXT1yW2UrMl0saVtuKytdPW51bGwhPShjPWFbdCsrXSk/YzoyNTU7cmV0dXJuIGl9LGkucHJvdG90eXBlLmNvcHlUb0ltYWdlRGF0YT1mdW5jdGlvbih0LGUpe3ZhciByLG4saSxhLG8scyxjLHUsbCxoLGY7aWYobj10aGlzLmNvbG9ycyxsPW51bGwscj10aGlzLmhhc0FscGhhQ2hhbm5lbCx0aGlzLnBhbGV0dGUubGVuZ3RoJiYobD1udWxsIT0oZj10aGlzLl9kZWNvZGVkUGFsZXR0ZSk/Zjp0aGlzLl9kZWNvZGVkUGFsZXR0ZT10aGlzLmRlY29kZVBhbGV0dGUoKSxuPTQscj0hMCksdT0oaT10LmRhdGF8fHQpLmxlbmd0aCxvPWx8fGUsYT1zPTAsMT09PW4pZm9yKDthPHU7KWM9bD80KmVbYS80XTpzLGg9b1tjKytdLGlbYSsrXT1oLGlbYSsrXT1oLGlbYSsrXT1oLGlbYSsrXT1yP29bYysrXToyNTUscz1jO2Vsc2UgZm9yKDthPHU7KWM9bD80KmVbYS80XTpzLGlbYSsrXT1vW2MrK10saVthKytdPW9bYysrXSxpW2ErK109b1tjKytdLGlbYSsrXT1yP29bYysrXToyNTUscz1jfSxpLnByb3RvdHlwZS5kZWNvZGU9ZnVuY3Rpb24oKXt2YXIgdDtyZXR1cm4gdD1uZXcgVWludDhBcnJheSh0aGlzLndpZHRoKnRoaXMuaGVpZ2h0KjQpLHRoaXMuY29weVRvSW1hZ2VEYXRhKHQsdGhpcy5kZWNvZGVQaXhlbHMoKSksdH07dmFyIGE9ZnVuY3Rpb24oKXtpZigiW29iamVjdCBXaW5kb3ddIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChyKSl7dHJ5e2U9ci5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKSxuPWUuZ2V0Q29udGV4dCgiMmQiKX1jYXRjaCh0KXtyZXR1cm4hMX1yZXR1cm4hMH1yZXR1cm4hMX07cmV0dXJuIGEoKSx0PWZ1bmN0aW9uKHQpe3ZhciByO2lmKCEwPT09YSgpKXJldHVybiBuLndpZHRoPXQud2lkdGgsbi5oZWlnaHQ9dC5oZWlnaHQsbi5jbGVhclJlY3QoMCwwLHQud2lkdGgsdC5oZWlnaHQpLG4ucHV0SW1hZ2VEYXRhKHQsMCwwKSwocj1uZXcgSW1hZ2UpLnNyYz1lLnRvRGF0YVVSTCgpLHI7dGhyb3cgbmV3IEVycm9yKCJUaGlzIG1ldGhvZCByZXF1aXJlcyBhIEJyb3dzZXIgd2l0aCBDYW52YXMtY2FwYWJpbGl0eS4iKX0saS5wcm90b3R5cGUuZGVjb2RlRnJhbWVzPWZ1bmN0aW9uKGUpe3ZhciByLG4saSxhLG8scyxjLHU7aWYodGhpcy5hbmltYXRpb24pe2Zvcih1PVtdLG49bz0wLHM9KGM9dGhpcy5hbmltYXRpb24uZnJhbWVzKS5sZW5ndGg7bzxzO249KytvKXI9Y1tuXSxpPWUuY3JlYXRlSW1hZ2VEYXRhKHIud2lkdGgsci5oZWlnaHQpLGE9dGhpcy5kZWNvZGVQaXhlbHMobmV3IFVpbnQ4QXJyYXkoci5kYXRhKSksdGhpcy5jb3B5VG9JbWFnZURhdGEoaSxhKSxyLmltYWdlRGF0YT1pLHUucHVzaChyLmltYWdlPXQoaSkpO3JldHVybiB1fX0saS5wcm90b3R5cGUucmVuZGVyRnJhbWU9ZnVuY3Rpb24odCxlKXt2YXIgcixuLGk7cmV0dXJuIHI9KG49dGhpcy5hbmltYXRpb24uZnJhbWVzKVtlXSxpPW5bZS0xXSwwPT09ZSYmdC5jbGVhclJlY3QoMCwwLHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpLDE9PT0obnVsbCE9aT9pLmRpc3Bvc2VPcDp2b2lkIDApP3QuY2xlYXJSZWN0KGkueE9mZnNldCxpLnlPZmZzZXQsaS53aWR0aCxpLmhlaWdodCk6Mj09PShudWxsIT1pP2kuZGlzcG9zZU9wOnZvaWQgMCkmJnQucHV0SW1hZ2VEYXRhKGkuaW1hZ2VEYXRhLGkueE9mZnNldCxpLnlPZmZzZXQpLDA9PT1yLmJsZW5kT3AmJnQuY2xlYXJSZWN0KHIueE9mZnNldCxyLnlPZmZzZXQsci53aWR0aCxyLmhlaWdodCksdC5kcmF3SW1hZ2Uoci5pbWFnZSxyLnhPZmZzZXQsci55T2Zmc2V0KX0saS5wcm90b3R5cGUuYW5pbWF0ZT1mdW5jdGlvbih0KXt2YXIgZSxyLG4saSxhLG8scz10aGlzO3JldHVybiByPTAsbz10aGlzLmFuaW1hdGlvbixpPW8ubnVtRnJhbWVzLG49by5mcmFtZXMsYT1vLm51bVBsYXlzLChlPWZ1bmN0aW9uKCl7dmFyIG8sYztpZihvPXIrKyVpLGM9bltvXSxzLnJlbmRlckZyYW1lKHQsbyksaT4xJiZyL2k8YSlyZXR1cm4gcy5hbmltYXRpb24uX3RpbWVvdXQ9c2V0VGltZW91dChlLGMuZGVsYXkpfSkoKX0saS5wcm90b3R5cGUuc3RvcEFuaW1hdGlvbj1mdW5jdGlvbigpe3ZhciB0O3JldHVybiBjbGVhclRpbWVvdXQobnVsbCE9KHQ9dGhpcy5hbmltYXRpb24pP3QuX3RpbWVvdXQ6dm9pZCAwKX0saS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKHQpe3ZhciBlLHI7cmV0dXJuIHQuX3BuZyYmdC5fcG5nLnN0b3BBbmltYXRpb24oKSx0Ll9wbmc9dGhpcyx0LndpZHRoPXRoaXMud2lkdGgsdC5oZWlnaHQ9dGhpcy5oZWlnaHQsZT10LmdldENvbnRleHQoIjJkIiksdGhpcy5hbmltYXRpb24/KHRoaXMuZGVjb2RlRnJhbWVzKGUpLHRoaXMuYW5pbWF0ZShlKSk6KHI9ZS5jcmVhdGVJbWFnZURhdGEodGhpcy53aWR0aCx0aGlzLmhlaWdodCksdGhpcy5jb3B5VG9JbWFnZURhdGEocix0aGlzLmRlY29kZVBpeGVscygpKSxlLnB1dEltYWdlRGF0YShyLDAsMCkpfSxpfSgpOwovKioKICAgKiBAbGljZW5zZQogICAqCiAgICogQ29weXJpZ2h0IChjKSAyMDE0IEphbWVzIFJvYmIsIGh0dHBzOi8vZ2l0aHViLmNvbS9qYW1lc2Jyb2JiCiAgICoKICAgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKICAgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKICAgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCiAgICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAogICAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwogICAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwogICAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICAgKgogICAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCiAgICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCiAgICoKICAgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKICAgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKICAgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAogICAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUKICAgKiBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCiAgICogT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCiAgICogV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCiAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgKi8KLyoqCiAgICogQGxpY2Vuc2UKICAgKiAoYykgRGVhbiBNY05hbWVlIDxkZWFuQGdtYWlsLmNvbT4sIDIwMTMuCiAgICoKICAgKiBodHRwczovL2dpdGh1Yi5jb20vZGVhbm0vb21nZ2lmCiAgICoKICAgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CiAgICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvCiAgICogZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUKICAgKiByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKICAgKiBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwogICAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAgICoKICAgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgogICAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgogICAqCiAgICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKICAgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKICAgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKICAgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCiAgICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKICAgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCiAgICogSU4gVEhFIFNPRlRXQVJFLgogICAqCiAgICogb21nZ2lmIGlzIGEgSmF2YVNjcmlwdCBpbXBsZW1lbnRhdGlvbiBvZiBhIEdJRiA4OWEgZW5jb2RlciBhbmQgZGVjb2RlciwKICAgKiBpbmNsdWRpbmcgYW5pbWF0aW9uIGFuZCBjb21wcmVzc2lvbi4gIEl0IGRvZXMgbm90IHJlbHkgb24gYW55IHNwZWNpZmljCiAgICogdW5kZXJseWluZyBzeXN0ZW0sIHNvIHNob3VsZCBydW4gaW4gdGhlIGJyb3dzZXIsIE5vZGUsIG9yIFBsYXNrLgogICAqLwpmdW5jdGlvbiBCZSh0KXt2YXIgZT0wO2lmKDcxIT09dFtlKytdfHw3MyE9PXRbZSsrXXx8NzAhPT10W2UrK118fDU2IT09dFtlKytdfHw1NiE9KHRbZSsrXSsxJjI1Myl8fDk3IT09dFtlKytdKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBHSUYgODdhLzg5YSBoZWFkZXIuIik7dmFyIHI9dFtlKytdfHRbZSsrXTw8OCxuPXRbZSsrXXx0W2UrK108PDgsaT10W2UrK10sYT1pPj43LG89MTw8KDcmaSkrMTt0W2UrK107dFtlKytdO3ZhciBzPW51bGwsYz1udWxsO2EmJihzPWUsYz1vLGUrPTMqbyk7dmFyIHU9ITAsbD1bXSxoPTAsZj1udWxsLGQ9MCxwPW51bGw7Zm9yKHRoaXMud2lkdGg9cix0aGlzLmhlaWdodD1uO3UmJmU8dC5sZW5ndGg7KXN3aXRjaCh0W2UrK10pe2Nhc2UgMzM6c3dpdGNoKHRbZSsrXSl7Y2FzZSAyNTU6aWYoMTEhPT10W2VdfHw3OD09dFtlKzFdJiY2OT09dFtlKzJdJiY4ND09dFtlKzNdJiY4Mz09dFtlKzRdJiY2Nz09dFtlKzVdJiY2NT09dFtlKzZdJiY4MD09dFtlKzddJiY2OT09dFtlKzhdJiY1MD09dFtlKzldJiY0Nj09dFtlKzEwXSYmNDg9PXRbZSsxMV0mJjM9PXRbZSsxMl0mJjE9PXRbZSsxM10mJjA9PXRbZSsxNl0pZSs9MTQscD10W2UrK118dFtlKytdPDw4LGUrKztlbHNlIGZvcihlKz0xMjs7KXtpZighKChQPXRbZSsrXSk+PTApKXRocm93IEVycm9yKCJJbnZhbGlkIGJsb2NrIHNpemUiKTtpZigwPT09UClicmVhaztlKz1QfWJyZWFrO2Nhc2UgMjQ5OmlmKDQhPT10W2UrK118fDAhPT10W2UrNF0pdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGdyYXBoaWNzIGV4dGVuc2lvbiBibG9jay4iKTt2YXIgZz10W2UrK107aD10W2UrK118dFtlKytdPDw4LGY9dFtlKytdLDA9PSgxJmcpJiYoZj1udWxsKSxkPWc+PjImNyxlKys7YnJlYWs7Y2FzZSAyNTQ6Zm9yKDs7KXtpZighKChQPXRbZSsrXSk+PTApKXRocm93IEVycm9yKCJJbnZhbGlkIGJsb2NrIHNpemUiKTtpZigwPT09UClicmVhaztlKz1QfWJyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGdyYXBoaWMgY29udHJvbCBsYWJlbDogMHgiK3RbZS0xXS50b1N0cmluZygxNikpfWJyZWFrO2Nhc2UgNDQ6dmFyIG09dFtlKytdfHRbZSsrXTw8OCx2PXRbZSsrXXx0W2UrK108PDgsYj10W2UrK118dFtlKytdPDw4LHk9dFtlKytdfHRbZSsrXTw8OCx3PXRbZSsrXSxOPXc+PjYmMSxMPTE8PCg3JncpKzEsQT1zLHg9YyxTPSExO2lmKHc+Pjcpe1M9ITA7QT1lLHg9TCxlKz0zKkx9dmFyIF89ZTtmb3IoZSsrOzspe3ZhciBQO2lmKCEoKFA9dFtlKytdKT49MCkpdGhyb3cgRXJyb3IoIkludmFsaWQgYmxvY2sgc2l6ZSIpO2lmKDA9PT1QKWJyZWFrO2UrPVB9bC5wdXNoKHt4Om0seTp2LHdpZHRoOmIsaGVpZ2h0OnksaGFzX2xvY2FsX3BhbGV0dGU6UyxwYWxldHRlX29mZnNldDpBLHBhbGV0dGVfc2l6ZTp4LGRhdGFfb2Zmc2V0Ol8sZGF0YV9sZW5ndGg6ZS1fLHRyYW5zcGFyZW50X2luZGV4OmYsaW50ZXJsYWNlZDohIU4sZGVsYXk6aCxkaXNwb3NhbDpkfSk7YnJlYWs7Y2FzZSA1OTp1PSExO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGdpZiBibG9jazogMHgiK3RbZS0xXS50b1N0cmluZygxNikpfXRoaXMubnVtRnJhbWVzPWZ1bmN0aW9uKCl7cmV0dXJuIGwubGVuZ3RofSx0aGlzLmxvb3BDb3VudD1mdW5jdGlvbigpe3JldHVybiBwfSx0aGlzLmZyYW1lSW5mbz1mdW5jdGlvbih0KXtpZih0PDB8fHQ+PWwubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiRnJhbWUgaW5kZXggb3V0IG9mIHJhbmdlLiIpO3JldHVybiBsW3RdfSx0aGlzLmRlY29kZUFuZEJsaXRGcmFtZUJHUkE9ZnVuY3Rpb24oZSxuKXt2YXIgaT10aGlzLmZyYW1lSW5mbyhlKSxhPWkud2lkdGgqaS5oZWlnaHQsbz1uZXcgVWludDhBcnJheShhKTtNZSh0LGkuZGF0YV9vZmZzZXQsbyxhKTt2YXIgcz1pLnBhbGV0dGVfb2Zmc2V0LGM9aS50cmFuc3BhcmVudF9pbmRleDtudWxsPT09YyYmKGM9MjU2KTt2YXIgdT1pLndpZHRoLGw9ci11LGg9dSxmPTQqKGkueSpyK2kueCksZD00KigoaS55K2kuaGVpZ2h0KSpyK2kueCkscD1mLGc9NCpsOyEwPT09aS5pbnRlcmxhY2VkJiYoZys9NCpyKjcpO2Zvcih2YXIgbT04LHY9MCxiPW8ubGVuZ3RoO3Y8YjsrK3Ype3ZhciB5PW9bdl07aWYoMD09PWgmJihoPXUsKHArPWcpPj1kJiYoZz00KmwrNCpyKihtLTEpLHA9ZisodStsKSoobTw8MSksbT4+PTEpKSx5PT09YylwKz00O2Vsc2V7dmFyIHc9dFtzKzMqeV0sTj10W3MrMyp5KzFdLEw9dFtzKzMqeSsyXTtuW3ArK109TCxuW3ArK109TixuW3ArK109dyxuW3ArK109MjU1fS0taH19LHRoaXMuZGVjb2RlQW5kQmxpdEZyYW1lUkdCQT1mdW5jdGlvbihlLG4pe3ZhciBpPXRoaXMuZnJhbWVJbmZvKGUpLGE9aS53aWR0aCppLmhlaWdodCxvPW5ldyBVaW50OEFycmF5KGEpO01lKHQsaS5kYXRhX29mZnNldCxvLGEpO3ZhciBzPWkucGFsZXR0ZV9vZmZzZXQsYz1pLnRyYW5zcGFyZW50X2luZGV4O251bGw9PT1jJiYoYz0yNTYpO3ZhciB1PWkud2lkdGgsbD1yLXUsaD11LGY9NCooaS55KnIraS54KSxkPTQqKChpLnkraS5oZWlnaHQpKnIraS54KSxwPWYsZz00Kmw7ITA9PT1pLmludGVybGFjZWQmJihnKz00KnIqNyk7Zm9yKHZhciBtPTgsdj0wLGI9by5sZW5ndGg7djxiOysrdil7dmFyIHk9b1t2XTtpZigwPT09aCYmKGg9dSwocCs9Zyk+PWQmJihnPTQqbCs0KnIqKG0tMSkscD1mKyh1K2wpKihtPDwxKSxtPj49MSkpLHk9PT1jKXArPTQ7ZWxzZXt2YXIgdz10W3MrMyp5XSxOPXRbcyszKnkrMV0sTD10W3MrMyp5KzJdO25bcCsrXT13LG5bcCsrXT1OLG5bcCsrXT1MLG5bcCsrXT0yNTV9LS1ofX19ZnVuY3Rpb24gTWUodCxlLHIsbil7Zm9yKHZhciBhPXRbZSsrXSxvPTE8PGEscz1vKzEsYz1zKzEsdT1hKzEsbD0oMTw8dSktMSxoPTAsZj0wLGQ9MCxwPXRbZSsrXSxnPW5ldyBJbnQzMkFycmF5KDQwOTYpLG09bnVsbDs7KXtmb3IoO2g8MTYmJjAhPT1wOylmfD10W2UrK108PGgsaCs9OCwxPT09cD9wPXRbZSsrXTotLXA7aWYoaDx1KWJyZWFrO3ZhciB2PWYmbDtpZihmPj49dSxoLT11LHYhPT1vKXtpZih2PT09cylicmVhaztmb3IodmFyIGI9djxjP3Y6bSx5PTAsdz1iO3c+bzspdz1nW3ddPj44LCsreTt2YXIgTj13O2lmKGQreSsoYiE9PXY/MTowKT5uKXJldHVybiB2b2lkIGkubG9nKCJXYXJuaW5nLCBnaWYgc3RyZWFtIGxvbmdlciB0aGFuIGV4cGVjdGVkLiIpO3JbZCsrXT1OO3ZhciBMPWQrPXk7Zm9yKGIhPT12JiYocltkKytdPU4pLHc9Yjt5LS07KXc9Z1t3XSxyWy0tTF09MjU1Jncsdz4+PTg7bnVsbCE9PW0mJmM8NDA5NiYmKGdbYysrXT1tPDw4fE4sYz49bCsxJiZ1PDEyJiYoKyt1LGw9bDw8MXwxKSksbT12fWVsc2UgYz1zKzEsbD0oMTw8KHU9YSsxKSktMSxtPW51bGx9cmV0dXJuIGQhPT1uJiZpLmxvZygiV2FybmluZywgZ2lmIHN0cmVhbSBzaG9ydGVyIHRoYW4gZXhwZWN0ZWQuIikscn0KLyoqCiAgICogQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAwOCwgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQKICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IAogICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQogICAgbWV0OgoKICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCAKICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KICAgIAogICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIAogICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogICAgCiAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQgbm9yIHRoZSBuYW1lcyBvZiBpdHMgCiAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIAogICAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgoKICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTCiAgICBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCiAgICBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCiAgICBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIAogICAgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCiAgICBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCiAgICBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKICAgIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKICAgIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCiAgICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKICAgIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogICovZnVuY3Rpb24gRWUodCl7dmFyIGUscixuLGksYSxvPU1hdGguZmxvb3Iscz1uZXcgQXJyYXkoNjQpLGM9bmV3IEFycmF5KDY0KSx1PW5ldyBBcnJheSg2NCksbD1uZXcgQXJyYXkoNjQpLGg9bmV3IEFycmF5KDY1NTM1KSxmPW5ldyBBcnJheSg2NTUzNSksZD1uZXcgQXJyYXkoNjQpLHA9bmV3IEFycmF5KDY0KSxnPVtdLG09MCx2PTcsYj1uZXcgQXJyYXkoNjQpLHk9bmV3IEFycmF5KDY0KSx3PW5ldyBBcnJheSg2NCksTj1uZXcgQXJyYXkoMjU2KSxMPW5ldyBBcnJheSgyMDQ4KSxBPVswLDEsNSw2LDE0LDE1LDI3LDI4LDIsNCw3LDEzLDE2LDI2LDI5LDQyLDMsOCwxMiwxNywyNSwzMCw0MSw0Myw5LDExLDE4LDI0LDMxLDQwLDQ0LDUzLDEwLDE5LDIzLDMyLDM5LDQ1LDUyLDU0LDIwLDIyLDMzLDM4LDQ2LDUxLDU1LDYwLDIxLDM0LDM3LDQ3LDUwLDU2LDU5LDYxLDM1LDM2LDQ4LDQ5LDU3LDU4LDYyLDYzXSx4PVswLDAsMSw1LDEsMSwxLDEsMSwxLDAsMCwwLDAsMCwwLDBdLFM9WzAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTFdLF89WzAsMCwyLDEsMywzLDIsNCwzLDUsNSw0LDQsMCwwLDEsMTI1XSxQPVsxLDIsMywwLDQsMTcsNSwxOCwzMyw0OSw2NSw2LDE5LDgxLDk3LDcsMzQsMTEzLDIwLDUwLDEyOSwxNDUsMTYxLDgsMzUsNjYsMTc3LDE5MywyMSw4MiwyMDksMjQwLDM2LDUxLDk4LDExNCwxMzAsOSwxMCwyMiwyMywyNCwyNSwyNiwzNywzOCwzOSw0MCw0MSw0Miw1Miw1Myw1NCw1NSw1Niw1Nyw1OCw2Nyw2OCw2OSw3MCw3MSw3Miw3Myw3NCw4Myw4NCw4NSw4Niw4Nyw4OCw4OSw5MCw5OSwxMDAsMTAxLDEwMiwxMDMsMTA0LDEwNSwxMDYsMTE1LDExNiwxMTcsMTE4LDExOSwxMjAsMTIxLDEyMiwxMzEsMTMyLDEzMywxMzQsMTM1LDEzNiwxMzcsMTM4LDE0NiwxNDcsMTQ4LDE0OSwxNTAsMTUxLDE1MiwxNTMsMTU0LDE2MiwxNjMsMTY0LDE2NSwxNjYsMTY3LDE2OCwxNjksMTcwLDE3OCwxNzksMTgwLDE4MSwxODIsMTgzLDE4NCwxODUsMTg2LDE5NCwxOTUsMTk2LDE5NywxOTgsMTk5LDIwMCwyMDEsMjAyLDIxMCwyMTEsMjEyLDIxMywyMTQsMjE1LDIxNiwyMTcsMjE4LDIyNSwyMjYsMjI3LDIyOCwyMjksMjMwLDIzMSwyMzIsMjMzLDIzNCwyNDEsMjQyLDI0MywyNDQsMjQ1LDI0NiwyNDcsMjQ4LDI0OSwyNTBdLGs9WzAsMCwzLDEsMSwxLDEsMSwxLDEsMSwxLDAsMCwwLDAsMF0sRj1bMCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMV0sST1bMCwwLDIsMSwyLDQsNCwzLDQsNyw1LDQsNCwwLDEsMiwxMTldLEM9WzAsMSwyLDMsMTcsNCw1LDMzLDQ5LDYsMTgsNjUsODEsNyw5NywxMTMsMTksMzQsNTAsMTI5LDgsMjAsNjYsMTQ1LDE2MSwxNzcsMTkzLDksMzUsNTEsODIsMjQwLDIxLDk4LDExNCwyMDksMTAsMjIsMzYsNTIsMjI1LDM3LDI0MSwyMywyNCwyNSwyNiwzOCwzOSw0MCw0MSw0Miw1Myw1NCw1NSw1Niw1Nyw1OCw2Nyw2OCw2OSw3MCw3MSw3Miw3Myw3NCw4Myw4NCw4NSw4Niw4Nyw4OCw4OSw5MCw5OSwxMDAsMTAxLDEwMiwxMDMsMTA0LDEwNSwxMDYsMTE1LDExNiwxMTcsMTE4LDExOSwxMjAsMTIxLDEyMiwxMzAsMTMxLDEzMiwxMzMsMTM0LDEzNSwxMzYsMTM3LDEzOCwxNDYsMTQ3LDE0OCwxNDksMTUwLDE1MSwxNTIsMTUzLDE1NCwxNjIsMTYzLDE2NCwxNjUsMTY2LDE2NywxNjgsMTY5LDE3MCwxNzgsMTc5LDE4MCwxODEsMTgyLDE4MywxODQsMTg1LDE4NiwxOTQsMTk1LDE5NiwxOTcsMTk4LDE5OSwyMDAsMjAxLDIwMiwyMTAsMjExLDIxMiwyMTMsMjE0LDIxNSwyMTYsMjE3LDIxOCwyMjYsMjI3LDIyOCwyMjksMjMwLDIzMSwyMzIsMjMzLDIzNCwyNDIsMjQzLDI0NCwyNDUsMjQ2LDI0NywyNDgsMjQ5LDI1MF07ZnVuY3Rpb24gaih0LGUpe2Zvcih2YXIgcj0wLG49MCxpPW5ldyBBcnJheSxhPTE7YTw9MTY7YSsrKXtmb3IodmFyIG89MTtvPD10W2FdO28rKylpW2Vbbl1dPVtdLGlbZVtuXV1bMF09cixpW2Vbbl1dWzFdPWEsbisrLHIrKztyKj0yfXJldHVybiBpfWZ1bmN0aW9uIE8odCl7Zm9yKHZhciBlPXRbMF0scj10WzFdLTE7cj49MDspZSYxPDxyJiYobXw9MTw8diksci0tLC0tdjwwJiYoMjU1PT1tPyhCKDI1NSksQigwKSk6QihtKSx2PTcsbT0wKX1mdW5jdGlvbiBCKHQpe2cucHVzaCh0KX1mdW5jdGlvbiBNKHQpe0IodD4+OCYyNTUpLEIoMjU1JnQpfWZ1bmN0aW9uIEUodCxlLHIsbixpKXtmb3IodmFyIGEsbz1pWzBdLHM9aVsyNDBdLGM9ZnVuY3Rpb24odCxlKXt2YXIgcixuLGksYSxvLHMsYyx1LGwsaCxmPTA7Zm9yKGw9MDtsPDg7KytsKXtyPXRbZl0sbj10W2YrMV0saT10W2YrMl0sYT10W2YrM10sbz10W2YrNF0scz10W2YrNV0sYz10W2YrNl07dmFyIHA9cisodT10W2YrN10pLGc9ci11LG09bitjLHY9bi1jLGI9aStzLHk9aS1zLHc9YStvLE49YS1vLEw9cCt3LEE9cC13LHg9bStiLFM9bS1iO3RbZl09TCt4LHRbZis0XT1MLXg7dmFyIF89LjcwNzEwNjc4MSooUytBKTt0W2YrMl09QStfLHRbZis2XT1BLV87dmFyIFA9LjM4MjY4MzQzMyooKEw9Tit5KS0oUz12K2cpKSxrPS41NDExOTYxKkwrUCxGPTEuMzA2NTYyOTY1KlMrUCxJPS43MDcxMDY3ODEqKHg9eSt2KSxDPWcrSSxqPWctSTt0W2YrNV09aitrLHRbZiszXT1qLWssdFtmKzFdPUMrRix0W2YrN109Qy1GLGYrPTh9Zm9yKGY9MCxsPTA7bDw4OysrbCl7cj10W2ZdLG49dFtmKzhdLGk9dFtmKzE2XSxhPXRbZisyNF0sbz10W2YrMzJdLHM9dFtmKzQwXSxjPXRbZis0OF07dmFyIE89cisodT10W2YrNTZdKSxCPXItdSxNPW4rYyxFPW4tYyxxPWkrcyxEPWktcyxSPWErbyxUPWEtbyxVPU8rUix6PU8tUixIPU0rcSxXPU0tcTt0W2ZdPVUrSCx0W2YrMzJdPVUtSDt2YXIgVj0uNzA3MTA2NzgxKihXK3opO3RbZisxNl09eitWLHRbZis0OF09ei1WO3ZhciBHPS4zODI2ODM0MzMqKChVPVQrRCktKFc9RStCKSksWT0uNTQxMTk2MSpVK0csSj0xLjMwNjU2Mjk2NSpXK0csWD0uNzA3MTA2NzgxKihIPUQrRSksSz1CK1gsWj1CLVg7dFtmKzQwXT1aK1ksdFtmKzI0XT1aLVksdFtmKzhdPUsrSix0W2YrNTZdPUstSixmKyt9Zm9yKGw9MDtsPDY0OysrbCloPXRbbF0qZVtsXSxkW2xdPWg+MD9oKy41fDA6aC0uNXwwO3JldHVybiBkfSh0LGUpLHU9MDt1PDY0OysrdSlwW0FbdV1dPWNbdV07dmFyIGw9cFswXS1yO3I9cFswXSwwPT1sP08oblswXSk6KE8obltmW2E9MzI3NjcrbF1dKSxPKGhbYV0pKTtmb3IodmFyIGc9NjM7Zz4wJiYwPT1wW2ddOylnLS07aWYoMD09ZylyZXR1cm4gTyhvKSxyO2Zvcih2YXIgbSx2PTE7djw9Zzspe2Zvcih2YXIgYj12OzA9PXBbdl0mJnY8PWc7KSsrdjt2YXIgeT12LWI7aWYoeT49MTYpe209eT4+NDtmb3IodmFyIHc9MTt3PD1tOysrdylPKHMpO3kmPTE1fWE9MzI3NjcrcFt2XSxPKGlbKHk8PDQpK2ZbYV1dKSxPKGhbYV0pLHYrK31yZXR1cm4gNjMhPWcmJk8obykscn1mdW5jdGlvbiBxKHQpeyh0PU1hdGgubWluKE1hdGgubWF4KHQsMSksMTAwKSxhIT10KSYmKCFmdW5jdGlvbih0KXtmb3IodmFyIGU9WzE2LDExLDEwLDE2LDI0LDQwLDUxLDYxLDEyLDEyLDE0LDE5LDI2LDU4LDYwLDU1LDE0LDEzLDE2LDI0LDQwLDU3LDY5LDU2LDE0LDE3LDIyLDI5LDUxLDg3LDgwLDYyLDE4LDIyLDM3LDU2LDY4LDEwOSwxMDMsNzcsMjQsMzUsNTUsNjQsODEsMTA0LDExMyw5Miw0OSw2NCw3OCw4NywxMDMsMTIxLDEyMCwxMDEsNzIsOTIsOTUsOTgsMTEyLDEwMCwxMDMsOTldLHI9MDtyPDY0O3IrKyl7dmFyIG49bygoZVtyXSp0KzUwKS8xMDApO249TWF0aC5taW4oTWF0aC5tYXgobiwxKSwyNTUpLHNbQVtyXV09bn1mb3IodmFyIGk9WzE3LDE4LDI0LDQ3LDk5LDk5LDk5LDk5LDE4LDIxLDI2LDY2LDk5LDk5LDk5LDk5LDI0LDI2LDU2LDk5LDk5LDk5LDk5LDk5LDQ3LDY2LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5XSxhPTA7YTw2NDthKyspe3ZhciBoPW8oKGlbYV0qdCs1MCkvMTAwKTtoPU1hdGgubWluKE1hdGgubWF4KGgsMSksMjU1KSxjW0FbYV1dPWh9Zm9yKHZhciBmPVsxLDEuMzg3MDM5ODQ1LDEuMzA2NTYyOTY1LDEuMTc1ODc1NjAyLDEsLjc4NTY5NDk1OCwuNTQxMTk2MSwuMjc1ODk5Mzc5XSxkPTAscD0wO3A8ODtwKyspZm9yKHZhciBnPTA7Zzw4O2crKyl1W2RdPTEvKHNbQVtkXV0qZltwXSpmW2ddKjgpLGxbZF09MS8oY1tBW2RdXSpmW3BdKmZbZ10qOCksZCsrfSh0PDUwP01hdGguZmxvb3IoNWUzL3QpOk1hdGguZmxvb3IoMjAwLTIqdCkpLGE9dCl9dGhpcy5lbmNvZGU9ZnVuY3Rpb24odCxhKXthJiZxKGEpLGc9bmV3IEFycmF5LG09MCx2PTcsTSg2NTQ5NiksTSg2NTUwNCksTSgxNiksQig3NCksQig3MCksQig3MyksQig3MCksQigwKSxCKDEpLEIoMSksQigwKSxNKDEpLE0oMSksQigwKSxCKDApLGZ1bmN0aW9uKCl7TSg2NTQ5OSksTSgxMzIpLEIoMCk7Zm9yKHZhciB0PTA7dDw2NDt0KyspQihzW3RdKTtCKDEpO2Zvcih2YXIgZT0wO2U8NjQ7ZSsrKUIoY1tlXSl9KCksZnVuY3Rpb24odCxlKXtNKDY1NDcyKSxNKDE3KSxCKDgpLE0oZSksTSh0KSxCKDMpLEIoMSksQigxNyksQigwKSxCKDIpLEIoMTcpLEIoMSksQigzKSxCKDE3KSxCKDEpfSh0LndpZHRoLHQuaGVpZ2h0KSxmdW5jdGlvbigpe00oNjU0NzYpLE0oNDE4KSxCKDApO2Zvcih2YXIgdD0wO3Q8MTY7dCsrKUIoeFt0KzFdKTtmb3IodmFyIGU9MDtlPD0xMTtlKyspQihTW2VdKTtCKDE2KTtmb3IodmFyIHI9MDtyPDE2O3IrKylCKF9bcisxXSk7Zm9yKHZhciBuPTA7bjw9MTYxO24rKylCKFBbbl0pO0IoMSk7Zm9yKHZhciBpPTA7aTwxNjtpKyspQihrW2krMV0pO2Zvcih2YXIgYT0wO2E8PTExO2ErKylCKEZbYV0pO0IoMTcpO2Zvcih2YXIgbz0wO288MTY7bysrKUIoSVtvKzFdKTtmb3IodmFyIHM9MDtzPD0xNjE7cysrKUIoQ1tzXSl9KCksTSg2NTQ5OCksTSgxMiksQigzKSxCKDEpLEIoMCksQigyKSxCKDE3KSxCKDMpLEIoMTcpLEIoMCksQig2MyksQigwKTt2YXIgbz0wLGg9MCxmPTA7bT0wLHY9Nyx0aGlzLmVuY29kZS5kaXNwbGF5TmFtZT0iX2VuY29kZV8iO2Zvcih2YXIgZCxwLE4sQSxqLEQsUixULFUsej10LmRhdGEsSD10LndpZHRoLFc9dC5oZWlnaHQsVj00KkgsRz0wO0c8Vzspe2ZvcihkPTA7ZDxWOyl7Zm9yKGo9VipHK2QsUj0tMSxUPTAsVT0wO1U8NjQ7VSsrKUQ9aisoVD1VPj4zKSpWKyhSPTQqKDcmVSkpLEcrVD49VyYmKEQtPVYqKEcrMStULVcpKSxkK1I+PVYmJihELT1kK1ItVis0KSxwPXpbRCsrXSxOPXpbRCsrXSxBPXpbRCsrXSxiW1VdPShMW3BdK0xbTisyNTY+PjBdK0xbQSs1MTI+PjBdPj4xNiktMTI4LHlbVV09KExbcCs3Njg+PjBdK0xbTisxMDI0Pj4wXStMW0ErMTI4MD4+MF0+PjE2KS0xMjgsd1tVXT0oTFtwKzEyODA+PjBdK0xbTisxNTM2Pj4wXStMW0ErMTc5Mj4+MF0+PjE2KS0xMjg7bz1FKGIsdSxvLGUsbiksaD1FKHksbCxoLHIsaSksZj1FKHcsbCxmLHIsaSksZCs9MzJ9Rys9OH1pZih2Pj0wKXt2YXIgWT1bXTtZWzFdPXYrMSxZWzBdPSgxPDx2KzEpLTEsTyhZKX1yZXR1cm4gTSg2NTQ5NyksbmV3IFVpbnQ4QXJyYXkoZyl9LHQ9dHx8NTAsZnVuY3Rpb24oKXtmb3IodmFyIHQ9U3RyaW5nLmZyb21DaGFyQ29kZSxlPTA7ZTwyNTY7ZSsrKU5bZV09dChlKX0oKSxlPWooeCxTKSxyPWooayxGKSxuPWooXyxQKSxpPWooSSxDKSxmdW5jdGlvbigpe2Zvcih2YXIgdD0xLGU9MixyPTE7cjw9MTU7cisrKXtmb3IodmFyIG49dDtuPGU7bisrKWZbMzI3Njcrbl09cixoWzMyNzY3K25dPVtdLGhbMzI3Njcrbl1bMV09cixoWzMyNzY3K25dWzBdPW47Zm9yKHZhciBpPS0oZS0xKTtpPD0tdDtpKyspZlszMjc2NytpXT1yLGhbMzI3NjcraV09W10saFszMjc2NytpXVsxXT1yLGhbMzI3NjcraV1bMF09ZS0xK2k7dDw8PTEsZTw8PTF9fSgpLGZ1bmN0aW9uKCl7Zm9yKHZhciB0PTA7dDwyNTY7dCsrKUxbdF09MTk1OTUqdCxMW3QrMjU2Pj4wXT0zODQ3MCp0LExbdCs1MTI+PjBdPTc0NzEqdCszMjc2OCxMW3QrNzY4Pj4wXT0tMTEwNTkqdCxMW3QrMTAyND4+MF09LTIxNzA5KnQsTFt0KzEyODA+PjBdPTMyNzY4KnQrODQyMTM3NSxMW3QrMTUzNj4+MF09LTI3NDM5KnQsTFt0KzE3OTI+PjBdPS01MzI5KnR9KCkscSh0KX0KLyoqCiAgICogQGxpY2Vuc2UKICAgKiBDb3B5cmlnaHQgKGMpIDIwMTcgQXJhcyBBYmJhc2kKICAgKgogICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4KICAgKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UKICAgKi9mdW5jdGlvbiBxZSh0LGUpe2lmKHRoaXMucG9zPTAsdGhpcy5idWZmZXI9dCx0aGlzLmRhdGF2PW5ldyBEYXRhVmlldyh0LmJ1ZmZlciksdGhpcy5pc193aXRoX2FscGhhPSEhZSx0aGlzLmJvdHRvbV91cD0hMCx0aGlzLmZsYWc9U3RyaW5nLmZyb21DaGFyQ29kZSh0aGlzLmJ1ZmZlclswXSkrU3RyaW5nLmZyb21DaGFyQ29kZSh0aGlzLmJ1ZmZlclsxXSksdGhpcy5wb3MrPTIsLTE9PT1bIkJNIiwiQkEiLCJDSSIsIkNQIiwiSUMiLCJQVCJdLmluZGV4T2YodGhpcy5mbGFnKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgQk1QIEZpbGUiKTt0aGlzLnBhcnNlSGVhZGVyKCksdGhpcy5wYXJzZUJHUigpfWZ1bmN0aW9uIERlKHQpe2Z1bmN0aW9uIGUodCl7aWYoIXQpdGhyb3cgRXJyb3IoImFzc2VydCA6UCIpfWZ1bmN0aW9uIHIodCxlLHIpe2Zvcih2YXIgbj0wOzQ+bjtuKyspaWYodFtlK25dIT1yLmNoYXJDb2RlQXQobikpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gbih0LGUscixuLGkpe2Zvcih2YXIgYT0wO2E8aTthKyspdFtlK2FdPXJbbithXX1mdW5jdGlvbiBpKHQsZSxyLG4pe2Zvcih2YXIgaT0wO2k8bjtpKyspdFtlK2ldPXJ9ZnVuY3Rpb24gYSh0KXtyZXR1cm4gbmV3IEludDMyQXJyYXkodCl9ZnVuY3Rpb24gbyh0LGUpe2Zvcih2YXIgcj1bXSxuPTA7bjx0O24rKylyLnB1c2gobmV3IGUpO3JldHVybiByfWZ1bmN0aW9uIHModCxlKXt2YXIgcj1bXTtyZXR1cm4gZnVuY3Rpb24gdChyLG4saSl7Zm9yKHZhciBhPWlbbl0sbz0wO288YSYmKHIucHVzaChpLmxlbmd0aD5uKzE/W106bmV3IGUpLCEoaS5sZW5ndGg8bisxKSk7bysrKXQocltvXSxuKzEsaSl9KHIsMCx0KSxyfXZhciBjPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztmdW5jdGlvbiBjKHQsZSl7Zm9yKHZhciByPTE8PGUtMT4+PjA7dCZyOylyPj4+PTE7cmV0dXJuIHI/KHQmci0xKStyOnR9ZnVuY3Rpb24gdSh0LHIsbixpLGEpe2UoIShpJW4pKTtkb3t0W3IrKGktPW4pXT1hfXdoaWxlKDA8aSl9ZnVuY3Rpb24gbCh0LHIsbixpLG8pe2lmKGUoMjMyOD49byksNTEyPj1vKXZhciBzPWEoNTEyKTtlbHNlIGlmKG51bGw9PShzPWEobykpKXJldHVybiAwO3JldHVybiBmdW5jdGlvbih0LHIsbixpLG8scyl7dmFyIGwsZixkPXIscD0xPDxuLGc9YSgxNiksbT1hKDE2KTtmb3IoZSgwIT1vKSxlKG51bGwhPWkpLGUobnVsbCE9dCksZSgwPG4pLGY9MDtmPG87KytmKXtpZigxNTxpW2ZdKXJldHVybiAwOysrZ1tpW2ZdXX1pZihnWzBdPT1vKXJldHVybiAwO2ZvcihtWzFdPTAsbD0xOzE1Pmw7KytsKXtpZihnW2xdPjE8PGwpcmV0dXJuIDA7bVtsKzFdPW1bbF0rZ1tsXX1mb3IoZj0wO2Y8bzsrK2YpbD1pW2ZdLDA8aVtmXSYmKHNbbVtsXSsrXT1mKTtpZigxPT1tWzE1XSlyZXR1cm4oaT1uZXcgaCkuZz0wLGkudmFsdWU9c1swXSx1KHQsZCwxLHAsaSkscDt2YXIgdixiPS0xLHk9cC0xLHc9MCxOPTEsTD0xLEE9MTw8bjtmb3IoZj0wLGw9MSxvPTI7bDw9bjsrK2wsbzw8PTEpe2lmKE4rPUw8PD0xLDA+KEwtPWdbbF0pKXJldHVybiAwO2Zvcig7MDxnW2xdOy0tZ1tsXSkoaT1uZXcgaCkuZz1sLGkudmFsdWU9c1tmKytdLHUodCxkK3csbyxBLGkpLHc9Yyh3LGwpfWZvcihsPW4rMSxvPTI7MTU+PWw7KytsLG88PD0xKXtpZihOKz1MPDw9MSwwPihMLT1nW2xdKSlyZXR1cm4gMDtmb3IoOzA8Z1tsXTstLWdbbF0pe2lmKGk9bmV3IGgsKHcmeSkhPWIpe2ZvcihkKz1BLHY9MTw8KGI9bCktbjsxNT5iJiYhKDA+PSh2LT1nW2JdKSk7KSsrYix2PDw9MTtwKz1BPTE8PCh2PWItbiksdFtyKyhiPXcmeSldLmc9dituLHRbcitiXS52YWx1ZT1kLXItYn1pLmc9bC1uLGkudmFsdWU9c1tmKytdLHUodCxkKyh3Pj5uKSxvLEEsaSksdz1jKHcsbCl9fXJldHVybiBOIT0yKm1bMTVdLTE/MDpwfSh0LHIsbixpLG8scyl9ZnVuY3Rpb24gaCgpe3RoaXMudmFsdWU9dGhpcy5nPTB9ZnVuY3Rpb24gZigpe3RoaXMudmFsdWU9dGhpcy5nPTB9ZnVuY3Rpb24gZCgpe3RoaXMuRz1vKDUsaCksdGhpcy5IPWEoNSksdGhpcy5qYz10aGlzLlFiPXRoaXMucWI9dGhpcy5uZD0wLHRoaXMucGQ9byhEcixmKX1mdW5jdGlvbiBwKHQscixuLGkpe2UobnVsbCE9dCksZShudWxsIT1yKSxlKDIxNDc0ODM2NDg+aSksdC5DYT0yNTQsdC5JPTAsdC5iPS04LHQuS2E9MCx0Lm9hPXIsdC5wYT1uLHQuSmQ9cix0LlljPW4raSx0LlpjPTQ8PWk/bitpLTQrMTpuLF8odCl9ZnVuY3Rpb24gZyh0LGUpe2Zvcih2YXIgcj0wOzA8ZS0tOylyfD1rKHQsMTI4KTw8ZTtyZXR1cm4gcn1mdW5jdGlvbiBtKHQsZSl7dmFyIHI9Zyh0LGUpO3JldHVybiBQKHQpPy1yOnJ9ZnVuY3Rpb24gdih0LHIsbixpKXt2YXIgYSxvPTA7Zm9yKGUobnVsbCE9dCksZShudWxsIT1yKSxlKDQyOTQ5NjcyODg+aSksdC5TYj1pLHQuUmE9MCx0LnU9MCx0Lmg9MCw0PGkmJihpPTQpLGE9MDthPGk7KythKW8rPXJbbithXTw8OCphO3QuUmE9byx0LmJiPWksdC5vYT1yLHQucGE9bn1mdW5jdGlvbiBiKHQpe2Zvcig7ODw9dC51JiZ0LmJiPHQuU2I7KXQuUmE+Pj49OCx0LlJhKz10Lm9hW3QucGErdC5iYl08PFVyLTg+Pj4wLCsrdC5iYix0LnUtPTg7QSh0KSYmKHQuaD0xLHQudT0wKX1mdW5jdGlvbiB5KHQscil7aWYoZSgwPD1yKSwhdC5oJiZyPD1Ucil7dmFyIG49TCh0KSZScltyXTtyZXR1cm4gdC51Kz1yLGIodCksbn1yZXR1cm4gdC5oPTEsdC51PTB9ZnVuY3Rpb24gdygpe3RoaXMuYj10aGlzLkNhPXRoaXMuST0wLHRoaXMub2E9W10sdGhpcy5wYT0wLHRoaXMuSmQ9W10sdGhpcy5ZYz0wLHRoaXMuWmM9W10sdGhpcy5LYT0wfWZ1bmN0aW9uIE4oKXt0aGlzLlJhPTAsdGhpcy5vYT1bXSx0aGlzLmg9dGhpcy51PXRoaXMuYmI9dGhpcy5TYj10aGlzLnBhPTB9ZnVuY3Rpb24gTCh0KXtyZXR1cm4gdC5SYT4+Pih0LnUmVXItMSk+Pj4wfWZ1bmN0aW9uIEEodCl7cmV0dXJuIGUodC5iYjw9dC5TYiksdC5ofHx0LmJiPT10LlNiJiZ0LnU+VXJ9ZnVuY3Rpb24geCh0LGUpe3QudT1lLHQuaD1BKHQpfWZ1bmN0aW9uIFModCl7dC51Pj16ciYmKGUodC51Pj16ciksYih0KSl9ZnVuY3Rpb24gXyh0KXtlKG51bGwhPXQmJm51bGwhPXQub2EpLHQucGE8dC5aYz8odC5JPSh0Lm9hW3QucGErK118dC5JPDw4KT4+PjAsdC5iKz04KTooZShudWxsIT10JiZudWxsIT10Lm9hKSx0LnBhPHQuWWM/KHQuYis9OCx0Lkk9dC5vYVt0LnBhKytdfHQuSTw8OCk6dC5LYT90LmI9MDoodC5JPDw9OCx0LmIrPTgsdC5LYT0xKSl9ZnVuY3Rpb24gUCh0KXtyZXR1cm4gZyh0LDEpfWZ1bmN0aW9uIGsodCxlKXt2YXIgcj10LkNhOzA+dC5iJiZfKHQpO3ZhciBuPXQuYixpPXIqZT4+PjgsYT0odC5JPj4+bj5pKSswO2ZvcihhPyhyLT1pLHQuSS09aSsxPDxuPj4+MCk6cj1pKzEsbj1yLGk9MDsyNTY8PW47KWkrPTgsbj4+PTg7cmV0dXJuIG49N15pK0hyW25dLHQuYi09bix0LkNhPShyPDxuKS0xLGF9ZnVuY3Rpb24gRih0LGUscil7dFtlKzBdPXI+PjI0JjI1NSx0W2UrMV09cj4+MTYmMjU1LHRbZSsyXT1yPj44JjI1NSx0W2UrM109cj4+MCYyNTV9ZnVuY3Rpb24gSSh0LGUpe3JldHVybiB0W2UrMF08PDB8dFtlKzFdPDw4fWZ1bmN0aW9uIEModCxlKXtyZXR1cm4gSSh0LGUpfHRbZSsyXTw8MTZ9ZnVuY3Rpb24gaih0LGUpe3JldHVybiBJKHQsZSl8SSh0LGUrMik8PDE2fWZ1bmN0aW9uIE8odCxyKXt2YXIgbj0xPDxyO3JldHVybiBlKG51bGwhPXQpLGUoMDxyKSx0Llg9YShuKSxudWxsPT10Llg/MDoodC5NYj0zMi1yLHQuWGE9ciwxKX1mdW5jdGlvbiBCKHQscil7ZShudWxsIT10KSxlKG51bGwhPXIpLGUodC5YYT09ci5YYSksbihyLlgsMCx0LlgsMCwxPDxyLlhhKX1mdW5jdGlvbiBNKCl7dGhpcy5YPVtdLHRoaXMuWGE9dGhpcy5NYj0wfWZ1bmN0aW9uIEUodCxyLG4saSl7ZShudWxsIT1uKSxlKG51bGwhPWkpO3ZhciBhPW5bMF0sbz1pWzBdO3JldHVybiAwPT1hJiYoYT0odCpvK3IvMikvciksMD09byYmKG89KHIqYSt0LzIpL3QpLDA+PWF8fDA+PW8/MDooblswXT1hLGlbMF09bywxKX1mdW5jdGlvbiBxKHQsZSl7cmV0dXJuIHQrKDE8PGUpLTE+Pj5lfWZ1bmN0aW9uIEQodCxlKXtyZXR1cm4oKDQyNzgyNTUzNjAmdCkrKDQyNzgyNTUzNjAmZSk+Pj4wJjQyNzgyNTUzNjApKygoMTY3MTE5MzUmdCkrKDE2NzExOTM1JmUpPj4+MCYxNjcxMTkzNSk+Pj4wfWZ1bmN0aW9uIFIoZSxyKXt0W3JdPWZ1bmN0aW9uKHIsbixpLGEsbyxzLGMpe3ZhciB1O2Zvcih1PTA7dTxvOysrdSl7dmFyIGw9dFtlXShzW2MrdS0xXSxpLGErdSk7c1tjK3VdPUQocltuK3VdLGwpfX19ZnVuY3Rpb24gVCgpe3RoaXMudWQ9dGhpcy5oZD10aGlzLmpkPTB9ZnVuY3Rpb24gVSh0LGUpe3JldHVybigoNDI3ODEyNDI4NiYodF5lKSk+Pj4xKSsodCZlKT4+PjB9ZnVuY3Rpb24geih0KXtyZXR1cm4gMDw9dCYmMjU2PnQ/dDowPnQ/MDoyNTU8dD8yNTU6dm9pZCAwfWZ1bmN0aW9uIEgodCxlKXtyZXR1cm4geih0Kyh0LWUrLjU+PjEpKX1mdW5jdGlvbiBXKHQsZSxyKXtyZXR1cm4gTWF0aC5hYnMoZS1yKS1NYXRoLmFicyh0LXIpfWZ1bmN0aW9uIFYodCxlLHIsbixpLGEsbyl7Zm9yKG49YVtvLTFdLHI9MDtyPGk7KytyKWFbbytyXT1uPUQodFtlK3JdLG4pfWZ1bmN0aW9uIEcodCxlLHIsbixpKXt2YXIgYTtmb3IoYT0wO2E8cjsrK2Epe3ZhciBvPXRbZSthXSxzPW8+PjgmMjU1LGM9MTY3MTE5MzUmKGM9KGM9MTY3MTE5MzUmbykrKChzPDwxNikrcykpO25baSthXT0oNDI3ODI1NTM2MCZvKStjPj4+MH19ZnVuY3Rpb24gWSh0LGUpe2UuamQ9dD4+MCYyNTUsZS5oZD10Pj44JjI1NSxlLnVkPXQ+PjE2JjI1NX1mdW5jdGlvbiBKKHQsZSxyLG4saSxhKXt2YXIgbztmb3Iobz0wO288bjsrK28pe3ZhciBzPWVbcitvXSxjPXM+Pj44LHU9cyxsPTI1NSYobD0obD1zPj4+MTYpKygodC5qZDw8MjQ+PjI0KSooYzw8MjQ+PjI0KT4+PjUpKTt1PTI1NSYodT0odT11KygodC5oZDw8MjQ+PjI0KSooYzw8MjQ+PjI0KT4+PjUpKSsoKHQudWQ8PDI0Pj4yNCkqKGw8PDI0Pj4yNCk+Pj41KSk7aVthK29dPSg0Mjc4MjU1MzYwJnMpKyhsPDwxNikrdX19ZnVuY3Rpb24gWChlLHIsbixpLGEpe3Rbcl09ZnVuY3Rpb24odCxlLHIsbixvLHMsYyx1LGwpe2ZvcihuPWM7bjx1Oysrbilmb3IoYz0wO2M8bDsrK2Mpb1tzKytdPWEocltpKHRbZSsrXSldKX0sdFtlXT1mdW5jdGlvbihlLHIsbyxzLGMsdSxsKXt2YXIgaD04Pj5lLmIsZj1lLkVhLGQ9ZS5LWzBdLHA9ZS53O2lmKDg+aClmb3IoZT0oMTw8ZS5iKS0xLHA9KDE8PGgpLTE7cjxvOysrcil7dmFyIGcsbT0wO2ZvcihnPTA7ZzxmOysrZylnJmV8fChtPWkoc1tjKytdKSksdVtsKytdPWEoZFttJnBdKSxtPj49aH1lbHNlIHRbIlZQOExNYXBDb2xvciIrbl0ocyxjLGQscCx1LGwscixvLGYpfX1mdW5jdGlvbiBLKHQsZSxyLG4saSl7Zm9yKHI9ZStyO2U8cjspe3ZhciBhPXRbZSsrXTtuW2krK109YT4+MTYmMjU1LG5baSsrXT1hPj44JjI1NSxuW2krK109YT4+MCYyNTV9fWZ1bmN0aW9uIFoodCxlLHIsbixpKXtmb3Iocj1lK3I7ZTxyOyl7dmFyIGE9dFtlKytdO25baSsrXT1hPj4xNiYyNTUsbltpKytdPWE+PjgmMjU1LG5baSsrXT1hPj4wJjI1NSxuW2krK109YT4+MjQmMjU1fX1mdW5jdGlvbiAkKHQsZSxyLG4saSl7Zm9yKHI9ZStyO2U8cjspe3ZhciBhPShvPXRbZSsrXSk+PjE2JjI0MHxvPj4xMiYxNSxvPW8+PjAmMjQwfG8+PjI4JjE1O25baSsrXT1hLG5baSsrXT1vfX1mdW5jdGlvbiBRKHQsZSxyLG4saSl7Zm9yKHI9ZStyO2U8cjspe3ZhciBhPShvPXRbZSsrXSk+PjE2JjI0OHxvPj4xMyY3LG89bz4+NSYyMjR8bz4+MyYzMTtuW2krK109YSxuW2krK109b319ZnVuY3Rpb24gdHQodCxlLHIsbixpKXtmb3Iocj1lK3I7ZTxyOyl7dmFyIGE9dFtlKytdO25baSsrXT1hPj4wJjI1NSxuW2krK109YT4+OCYyNTUsbltpKytdPWE+PjE2JjI1NX19ZnVuY3Rpb24gZXQodCxlLHIsaSxhLG8pe2lmKDA9PW8pZm9yKHI9ZStyO2U8cjspRihpLCgobz10W2UrK10pWzBdPj4yNHxvWzFdPj44JjY1MjgwfG9bMl08PDgmMTY3MTE2ODB8b1szXTw8MjQpPj4+MCksYSs9MzI7ZWxzZSBuKGksYSx0LGUscil9ZnVuY3Rpb24gcnQoZSxyKXt0W3JdWzBdPXRbZSsiMCJdLHRbcl1bMV09dFtlKyIxIl0sdFtyXVsyXT10W2UrIjIiXSx0W3JdWzNdPXRbZSsiMyJdLHRbcl1bNF09dFtlKyI0Il0sdFtyXVs1XT10W2UrIjUiXSx0W3JdWzZdPXRbZSsiNiJdLHRbcl1bN109dFtlKyI3Il0sdFtyXVs4XT10W2UrIjgiXSx0W3JdWzldPXRbZSsiOSJdLHRbcl1bMTBdPXRbZSsiMTAiXSx0W3JdWzExXT10W2UrIjExIl0sdFtyXVsxMl09dFtlKyIxMiJdLHRbcl1bMTNdPXRbZSsiMTMiXSx0W3JdWzE0XT10W2UrIjAiXSx0W3JdWzE1XT10W2UrIjAiXX1mdW5jdGlvbiBudCh0KXtyZXR1cm4gdD09SG58fHQ9PVdufHx0PT1Wbnx8dD09R259ZnVuY3Rpb24gaXQoKXt0aGlzLmViPVtdLHRoaXMuc2l6ZT10aGlzLkE9dGhpcy5mYj0wfWZ1bmN0aW9uIGF0KCl7dGhpcy55PVtdLHRoaXMuZj1bXSx0aGlzLmVhPVtdLHRoaXMuRj1bXSx0aGlzLlRjPXRoaXMuRWQ9dGhpcy5DZD10aGlzLkZkPXRoaXMubGI9dGhpcy5EYj10aGlzLkFiPXRoaXMuZmE9dGhpcy5KPXRoaXMuVz10aGlzLk49dGhpcy5PPTB9ZnVuY3Rpb24gb3QoKXt0aGlzLlJkPXRoaXMuaGVpZ2h0PXRoaXMud2lkdGg9dGhpcy5TPTAsdGhpcy5mPXt9LHRoaXMuZi5SR0JBPW5ldyBpdCx0aGlzLmYua2I9bmV3IGF0LHRoaXMuc2Q9bnVsbH1mdW5jdGlvbiBzdCgpe3RoaXMud2lkdGg9WzBdLHRoaXMuaGVpZ2h0PVswXSx0aGlzLlBkPVswXSx0aGlzLlFkPVswXSx0aGlzLmZvcm1hdD1bMF19ZnVuY3Rpb24gY3QoKXt0aGlzLklkPXRoaXMuZmQ9dGhpcy5NZD10aGlzLmhiPXRoaXMuaWI9dGhpcy5kYT10aGlzLmJkPXRoaXMuY2Q9dGhpcy5qPXRoaXMudj10aGlzLkRhPXRoaXMuU2Q9dGhpcy5vYj0wfWZ1bmN0aW9uIHV0KHQpe3JldHVybiBhbGVydCgidG9kbzpXZWJQU2FtcGxlclByb2Nlc3NQbGFuZSIpLHQuVH1mdW5jdGlvbiBsdCh0LGUpe3ZhciByPXQuVCxpPWUuYmEuZi5SR0JBLGE9aS5lYixvPWkuZmIrdC5rYSppLkEscz12aVtlLmJhLlNdLGM9dC55LHU9dC5PLGw9dC5mLGg9dC5OLGY9dC5lYSxkPXQuVyxwPWUuY2MsZz1lLmRjLG09ZS5NYyx2PWUuTmMsYj10LmthLHk9dC5rYSt0LlQsdz10LlUsTj13KzE+PjE7Zm9yKDA9PWI/cyhjLHUsbnVsbCxudWxsLGwsaCxmLGQsbCxoLGYsZCxhLG8sbnVsbCxudWxsLHcpOihzKGUuZWMsZS5mYyxjLHUscCxnLG0sdixsLGgsZixkLGEsby1pLkEsYSxvLHcpLCsrcik7YisyPHk7Yis9MilwPWwsZz1oLG09Zix2PWQsaCs9dC5SYyxkKz10LlJjLG8rPTIqaS5BLHMoYywodSs9Mip0LmZhKS10LmZhLGMsdSxwLGcsbSx2LGwsaCxmLGQsYSxvLWkuQSxhLG8sdyk7cmV0dXJuIHUrPXQuZmEsdC5qK3k8dC5vPyhuKGUuZWMsZS5mYyxjLHUsdyksbihlLmNjLGUuZGMsbCxoLE4pLG4oZS5NYyxlLk5jLGYsZCxOKSxyLS0pOjEmeXx8cyhjLHUsbnVsbCxudWxsLGwsaCxmLGQsbCxoLGYsZCxhLG8raS5BLG51bGwsbnVsbCx3KSxyfWZ1bmN0aW9uIGh0KHQscixuKXt2YXIgaT10LkYsYT1bdC5KXTtpZihudWxsIT1pKXt2YXIgbz10LlUscz1yLmJhLlMsYz1zPT1Ubnx8cz09Vm47cj1yLmJhLmYuUkdCQTt2YXIgdT1bMF0sbD10LmthO3VbMF09dC5ULHQuS2ImJigwPT1sPy0tdVswXTooLS1sLGFbMF0tPXQud2lkdGgpLHQuait0LmthK3QuVD09dC5vJiYodVswXT10Lm8tdC5qLWwpKTt2YXIgaD1yLmViO2w9ci5mYitsKnIuQTt0PVNuKGksYVswXSx0LndpZHRoLG8sdSxoLGwrKGM/MDozKSxyLkEpLGUobj09dSksdCYmbnQocykmJkFuKGgsbCxjLG8sdSxyLkEpfXJldHVybiAwfWZ1bmN0aW9uIGZ0KHQpe3ZhciBlPXQubWEscj1lLmJhLlMsbj0xMT5yLGk9cj09cW58fHI9PVJufHxyPT1Ubnx8cj09VW58fDEyPT1yfHxudChyKTtpZihlLm1lbW9yeT1udWxsLGUuSWI9bnVsbCxlLkpiPW51bGwsZS5OZD1udWxsLCFNcihlLk9hLHQsaT8xMToxMikpcmV0dXJuIDA7aWYoaSYmbnQocikmJmJyKCksdC5kYSlhbGVydCgidG9kbzp1c2Vfc2NhbGluZyIpO2Vsc2V7aWYobil7aWYoZS5JYj11dCx0LktiKXtpZihyPXQuVSsxPj4xLGUubWVtb3J5PWEodC5VKzIqciksbnVsbD09ZS5tZW1vcnkpcmV0dXJuIDA7ZS5lYz1lLm1lbW9yeSxlLmZjPTAsZS5jYz1lLmVjLGUuZGM9ZS5mYyt0LlUsZS5NYz1lLmNjLGUuTmM9ZS5kYytyLGUuSWI9bHQsYnIoKX19ZWxzZSBhbGVydCgidG9kbzpFbWl0WVVWIik7aSYmKGUuSmI9aHQsbiYmbXIoKSl9aWYobiYmIUNpKXtmb3IodD0wOzI1Nj50OysrdClqaVt0XT04OTg1OCoodC0xMjgpK19pPj5TaSxNaVt0XT0tMjIwMTQqKHQtMTI4KStfaSxCaVt0XT0tNDU3NzMqKHQtMTI4KSxPaVt0XT0xMTM2MTgqKHQtMTI4KStfaT4+U2k7Zm9yKHQ9UGk7dDxraTsrK3QpZT03NjI4MyoodC0xNikrX2k+PlNpLEVpW3QtUGldPVZ0KGUsMjU1KSxxaVt0LVBpXT1WdChlKzg+PjQsMTUpO0NpPTF9cmV0dXJuIDF9ZnVuY3Rpb24gZHQodCl7dmFyIHI9dC5tYSxuPXQuVSxpPXQuVDtyZXR1cm4gZSghKDEmdC5rYSkpLDA+PW58fDA+PWk/MDoobj1yLkliKHQsciksbnVsbCE9ci5KYiYmci5KYih0LHIsbiksci5EYys9biwxKX1mdW5jdGlvbiBwdCh0KXt0Lm1hLm1lbW9yeT1udWxsfWZ1bmN0aW9uIGd0KHQsZSxyLG4pe3JldHVybiA0NyE9eSh0LDgpPzA6KGVbMF09eSh0LDE0KSsxLHJbMF09eSh0LDE0KSsxLG5bMF09eSh0LDEpLDAhPXkodCwzKT8wOiF0LmgpfWZ1bmN0aW9uIG10KHQsZSl7aWYoND50KXJldHVybiB0KzE7dmFyIHI9dC0yPj4xO3JldHVybigyKygxJnQpPDxyKSt5KGUscikrMX1mdW5jdGlvbiB2dCh0LGUpe3JldHVybiAxMjA8ZT9lLTEyMDoxPD0ocj0oKHI9JG5bZS0xXSk+PjQpKnQrKDgtKDE1JnIpKSk/cjoxO3ZhciByfWZ1bmN0aW9uIGJ0KHQsZSxyKXt2YXIgbj1MKHIpLGk9dFtlKz0yNTUmbl0uZy04O3JldHVybiAwPGkmJih4KHIsci51KzgpLG49TChyKSxlKz10W2VdLnZhbHVlLGUrPW4mKDE8PGkpLTEpLHgocixyLnUrdFtlXS5nKSx0W2VdLnZhbHVlfWZ1bmN0aW9uIHl0KHQscixuKXtyZXR1cm4gbi5nKz10Lmcsbi52YWx1ZSs9dC52YWx1ZTw8cj4+PjAsZSg4Pj1uLmcpLHQuZ31mdW5jdGlvbiB3dCh0LHIsbil7dmFyIGk9dC54YztyZXR1cm4gZSgocj0wPT1pPzA6dC52Y1t0Lm1kKihuPj5pKSsocj4+aSldKTx0LldiKSx0LllhW3JdfWZ1bmN0aW9uIE50KHQscixpLGEpe3ZhciBvPXQuYWIscz10LmMqcixjPXQuQztyPWMrcjt2YXIgdT1pLGw9YTtmb3IoYT10LlRhLGk9dC5VYTswPG8tLTspe3ZhciBoPXQuZ2Nbb10sZj1jLGQ9cixwPXUsZz1sLG09KGw9YSx1PWksaC5FYSk7c3dpdGNoKGUoZjxkKSxlKGQ8PWgubmMpLGguaGMpe2Nhc2UgMjpHcihwLGcsKGQtZikqbSxsLHUpO2JyZWFrO2Nhc2UgMDp2YXIgdj1mLGI9ZCx5PWwsdz11LE49KF89aCkuRWE7MD09diYmKFdyKHAsZyxudWxsLG51bGwsMSx5LHcpLFYocCxnKzEsMCwwLE4tMSx5LHcrMSksZys9Tix3Kz1OLCsrdik7Zm9yKHZhciBMPTE8PF8uYixBPUwtMSx4PXEoTixfLmIpLFM9Xy5LLF89Xy53Kyh2Pj5fLmIpKng7djxiOyl7dmFyIFA9UyxrPV8sRj0xO2ZvcihWcihwLGcseSx3LU4sMSx5LHcpO0Y8Tjspe3ZhciBJPShGJn5BKStMO0k+TiYmKEk9TiksKDAsWnJbUFtrKytdPj44JjE1XSkocCxnKyArRix5LHcrRi1OLEktRix5LHcrRiksRj1JfWcrPU4sdys9TiwrK3YmQXx8KF8rPXgpfWQhPWgubmMmJm4obCx1LW0sbCx1KyhkLWYtMSkqbSxtKTticmVhaztjYXNlIDE6Zm9yKG09cCxiPWcsTj0ocD1oLkVhKS0odz1wJn4oeT0oZz0xPDxoLmIpLTEpKSx2PXEocCxoLmIpLEw9aC5LLGg9aC53KyhmPj5oLmIpKnY7ZjxkOyl7Zm9yKEE9TCx4PWgsUz1uZXcgVCxfPWIrdyxQPWIrcDtiPF87KVkoQVt4KytdLFMpLCRyKFMsbSxiLGcsbCx1KSxiKz1nLHUrPWc7YjxQJiYoWShBW3grK10sUyksJHIoUyxtLGIsTixsLHUpLGIrPU4sdSs9TiksKytmJnl8fChoKz12KX1icmVhaztjYXNlIDM6aWYocD09bCYmZz09dSYmMDxoLmIpe2ZvcihiPWwscD1tPXUrKGQtZikqbS0odz0oZC1mKSpxKGguRWEsaC5iKSksZz1sLHk9dSx2PVtdLHc9KE49dyktMTswPD13Oy0tdyl2W3ddPWdbeSt3XTtmb3Iodz1OLTE7MDw9dzstLXcpYltwK3ddPXZbd107WXIoaCxmLGQsbCxtLGwsdSl9ZWxzZSBZcihoLGYsZCxwLGcsbCx1KX11PWEsbD1pfWwhPWkmJm4oYSxpLHUsbCxzKX1mdW5jdGlvbiBMdCh0LHIpe3ZhciBuPXQuVixpPXQuQmErdC5jKnQuQyxhPXItdC5DO2lmKGUocjw9dC5sLm8pLGUoMTY+PWEpLDA8YSl7dmFyIG89dC5sLHM9dC5UYSxjPXQuVWEsdT1vLndpZHRoO2lmKE50KHQsYSxuLGkpLGE9Yz1bY10sZSgobj10LkMpPChpPXIpKSxlKG8udjxvLnZhKSxpPm8ubyYmKGk9by5vKSxuPG8uail7dmFyIGw9by5qLW47bj1vLmo7YVswXSs9bCp1fWlmKG4+PWk/bj0wOihhWzBdKz00Km8udixvLmthPW4tby5qLG8uVT1vLnZhLW8udixvLlQ9aS1uLG49MSksbil7aWYoYz1jWzBdLDExPihuPXQuY2EpLlMpe3ZhciBoPW4uZi5SR0JBLGY9KGk9bi5TLGE9by5VLG89by5ULGw9aC5lYixoLkEpLGQ9bztmb3IoaD1oLmZiK3QuTWEqaC5BOzA8ZC0tOyl7dmFyIHA9cyxnPWMsbT1hLHY9bCxiPWg7c3dpdGNoKGkpe2Nhc2UgRW46UXIocCxnLG0sdixiKTticmVhaztjYXNlIHFuOnRuKHAsZyxtLHYsYik7YnJlYWs7Y2FzZSBIbjp0bihwLGcsbSx2LGIpLEFuKHYsYiwwLG0sMSwwKTticmVhaztjYXNlIERuOm5uKHAsZyxtLHYsYik7YnJlYWs7Y2FzZSBSbjpldChwLGcsbSx2LGIsMSk7YnJlYWs7Y2FzZSBXbjpldChwLGcsbSx2LGIsMSksQW4odixiLDAsbSwxLDApO2JyZWFrO2Nhc2UgVG46ZXQocCxnLG0sdixiLDApO2JyZWFrO2Nhc2UgVm46ZXQocCxnLG0sdixiLDApLEFuKHYsYiwxLG0sMSwwKTticmVhaztjYXNlIFVuOmVuKHAsZyxtLHYsYik7YnJlYWs7Y2FzZSBHbjplbihwLGcsbSx2LGIpLHhuKHYsYixtLDEsMCk7YnJlYWs7Y2FzZSB6bjpybihwLGcsbSx2LGIpO2JyZWFrO2RlZmF1bHQ6ZSgwKX1jKz11LGgrPWZ9dC5NYSs9b31lbHNlIGFsZXJ0KCJ0b2RvOkVtaXRSZXNjYWxlZFJvd3NZVVZBIik7ZSh0Lk1hPD1uLmhlaWdodCl9fXQuQz1yLGUodC5DPD10LmkpfWZ1bmN0aW9uIEF0KHQpe3ZhciBlO2lmKDA8dC51YSlyZXR1cm4gMDtmb3IoZT0wO2U8dC5XYjsrK2Upe3ZhciByPXQuWWFbZV0uRyxuPXQuWWFbZV0uSDtpZigwPHJbMV1bblsxXSswXS5nfHwwPHJbMl1bblsyXSswXS5nfHwwPHJbM11bblszXSswXS5nKXJldHVybiAwfXJldHVybiAxfWZ1bmN0aW9uIHh0KHQscixuLGksYSxvKXtpZigwIT10Llope3ZhciBzPXQucWQsYz10LnJkO2ZvcihlKG51bGwhPW1pW3QuWl0pO3I8bjsrK3IpbWlbdC5aXShzLGMsaSxhLGksYSxvKSxzPWksYz1hLGErPW87dC5xZD1zLHQucmQ9Y319ZnVuY3Rpb24gU3QodCxyKXt2YXIgbj10LmwubWEsaT0wPT1uLlp8fDE9PW4uWj90Lmwuajp0LkM7aT10LkM8aT9pOnQuQztpZihlKHI8PXQubC5vKSxyPmkpe3ZhciBhPXQubC53aWR0aCxvPW4uY2Escz1uLnRiK2EqaSxjPXQuVix1PXQuQmErdC5jKmksbD10LmdjO2UoMT09dC5hYiksZSgzPT1sWzBdLmhjKSxYcihsWzBdLGkscixjLHUsbyxzKSx4dChuLGkscixvLHMsYSl9dC5DPXQuTWE9cn1mdW5jdGlvbiBfdCh0LHIsbixpLGEsbyxzKXt2YXIgYz10LiQvaSx1PXQuJCVpLGw9dC5tLGg9dC5zLGY9bit0LiQsZD1mO2E9bitpKmE7dmFyIHA9bitpKm8sZz0yODAraC51YSxtPXQuUGI/YzoxNjc3NzIxNix2PTA8aC51YT9oLldhOm51bGwsYj1oLndjLHk9ZjxwP3d0KGgsdSxjKTpudWxsO2UodC5DPG8pLGUocDw9YSk7dmFyIHc9ITE7dDpmb3IoOzspe2Zvcig7d3x8ZjxwOyl7dmFyIE49MDtpZihjPj1tKXt2YXIgXz1mLW47ZSgobT10KS5QYiksbS53ZD1tLm0sbS54ZD1fLDA8bS5zLnVhJiZCKG0ucy5XYSxtLnMudmIpLG09Yyt0aX1pZih1JmJ8fCh5PXd0KGgsdSxjKSksZShudWxsIT15KSx5LlFiJiYocltmXT15LnFiLHc9ITApLCF3KWlmKFMobCkseS5qYyl7Tj1sLF89cjt2YXIgUD1mLGs9eS5wZFtMKE4pJkRyLTFdO2UoeS5qYyksMjU2PmsuZz8oeChOLE4udStrLmcpLF9bUF09ay52YWx1ZSxOPTApOih4KE4sTi51K2suZy0yNTYpLGUoMjU2PD1rLnZhbHVlKSxOPWsudmFsdWUpLDA9PU4mJih3PSEwKX1lbHNlIE49YnQoeS5HWzBdLHkuSFswXSxsKTtpZihsLmgpYnJlYWs7aWYod3x8MjU2Pk4pe2lmKCF3KWlmKHkubmQpcltmXT0oeS5xYnxOPDw4KT4+PjA7ZWxzZXtpZihTKGwpLHc9YnQoeS5HWzFdLHkuSFsxXSxsKSxTKGwpLF89YnQoeS5HWzJdLHkuSFsyXSxsKSxQPWJ0KHkuR1szXSx5LkhbM10sbCksbC5oKWJyZWFrO3JbZl09KFA8PDI0fHc8PDE2fE48PDh8Xyk+Pj4wfWlmKHc9ITEsKytmLCsrdT49aSYmKHU9MCwrK2MsbnVsbCE9cyYmYzw9byYmIShjJTE2KSYmcyh0LGMpLG51bGwhPXYpKWZvcig7ZDxmOylOPXJbZCsrXSx2LlhbKDUwNjgzMjgyOSpOJjQyOTQ5NjcyOTUpPj4+di5NYl09Tn1lbHNlIGlmKDI4MD5OKXtpZihOPW10KE4tMjU2LGwpLF89YnQoeS5HWzRdLHkuSFs0XSxsKSxTKGwpLF89dnQoaSxfPW10KF8sbCkpLGwuaClicmVhaztpZihmLW48X3x8YS1mPE4pYnJlYWsgdDtmb3IoUD0wO1A8TjsrK1ApcltmK1BdPXJbZitQLV9dO2ZvcihmKz1OLHUrPU47dT49aTspdS09aSwrK2MsbnVsbCE9cyYmYzw9byYmIShjJTE2KSYmcyh0LGMpO2lmKGUoZjw9YSksdSZiJiYoeT13dChoLHUsYykpLG51bGwhPXYpZm9yKDtkPGY7KU49cltkKytdLHYuWFsoNTA2ODMyODI5Kk4mNDI5NDk2NzI5NSk+Pj52Lk1iXT1OfWVsc2V7aWYoIShOPGcpKWJyZWFrIHQ7Zm9yKHc9Ti0yODAsZShudWxsIT12KTtkPGY7KU49cltkKytdLHYuWFsoNTA2ODMyODI5Kk4mNDI5NDk2NzI5NSk+Pj52Lk1iXT1OO049ZixlKCEodz4+PihfPXYpLlhhKSkscltOXT1fLlhbd10sdz0hMH13fHxlKGwuaD09QShsKSl9aWYodC5QYiYmbC5oJiZmPGEpZSh0Lm0uaCksdC5hPTUsdC5tPXQud2QsdC4kPXQueGQsMDx0LnMudWEmJkIodC5zLnZiLHQucy5XYSk7ZWxzZXtpZihsLmgpYnJlYWsgdDtudWxsIT1zJiZzKHQsYz5vP286YyksdC5hPTAsdC4kPWYtbn1yZXR1cm4gMX1yZXR1cm4gdC5hPTMsMH1mdW5jdGlvbiBQdCh0KXtlKG51bGwhPXQpLHQudmM9bnVsbCx0LnljPW51bGwsdC5ZYT1udWxsO3ZhciByPXQuV2E7bnVsbCE9ciYmKHIuWD1udWxsKSx0LnZiPW51bGwsZShudWxsIT10KX1mdW5jdGlvbiBrdCgpe3ZhciBlPW5ldyBvcjtyZXR1cm4gbnVsbD09ZT9udWxsOihlLmE9MCxlLnhiPWdpLHJ0KCJQcmVkaWN0b3IiLCJWUDhMUHJlZGljdG9ycyIpLHJ0KCJQcmVkaWN0b3IiLCJWUDhMUHJlZGljdG9yc19DIikscnQoIlByZWRpY3RvckFkZCIsIlZQOExQcmVkaWN0b3JzQWRkIikscnQoIlByZWRpY3RvckFkZCIsIlZQOExQcmVkaWN0b3JzQWRkX0MiKSxHcj1HLCRyPUosUXI9Syx0bj1aLGVuPSQscm49USxubj10dCx0LlZQOExNYXBDb2xvcjMyYj1Kcix0LlZQOExNYXBDb2xvcjhiPUtyLGUpfWZ1bmN0aW9uIEZ0KHQscixuLHMsYyl7dmFyIHU9MSxmPVt0XSxwPVtyXSxnPXMubSxtPXMucyx2PW51bGwsYj0wO3Q6Zm9yKDs7KXtpZihuKWZvcig7dSYmeShnLDEpOyl7dmFyIHc9ZixOPXAsQT1zLF89MSxQPUEubSxrPUEuZ2NbQS5hYl0sRj15KFAsMik7aWYoQS5PYyYxPDxGKXU9MDtlbHNle3N3aXRjaChBLk9jfD0xPDxGLGsuaGM9RixrLkVhPXdbMF0say5uYz1OWzBdLGsuSz1bbnVsbF0sKytBLmFiLGUoND49QS5hYiksRil7Y2FzZSAwOmNhc2UgMTprLmI9eShQLDMpKzIsXz1GdChxKGsuRWEsay5iKSxxKGsubmMsay5iKSwwLEEsay5LKSxrLks9ay5LWzBdO2JyZWFrO2Nhc2UgMzp2YXIgSSxDPXkoUCw4KSsxLGo9MTY8Qz8wOjQ8Qz8xOjI8Qz8yOjM7aWYod1swXT1xKGsuRWEsaiksay5iPWosST1fPUZ0KEMsMSwwLEEsay5LKSl7dmFyIEIsTT1DLEU9ayxSPTE8PCg4Pj5FLmIpLFQ9YShSKTtpZihudWxsPT1UKUk9MDtlbHNle3ZhciBVPUUuS1swXSx6PUUudztmb3IoVFswXT1FLktbMF1bMF0sQj0xO0I8MSpNOysrQilUW0JdPUQoVVt6K0JdLFRbQi0xXSk7Zm9yKDtCPDQqUjsrK0IpVFtCXT0wO0UuS1swXT1udWxsLEUuS1swXT1ULEk9MX19Xz1JO2JyZWFrO2Nhc2UgMjpicmVhaztkZWZhdWx0OmUoMCl9dT1ffX1pZihmPWZbMF0scD1wWzBdLHUmJnkoZywxKSYmISh1PTE8PShiPXkoZyw0KSkmJjExPj1iKSl7cy5hPTM7YnJlYWsgdH12YXIgSDtpZihIPXUpZTp7dmFyIFcsVixHLFk9cyxKPWYsWD1wLEs9YixaPW4sJD1ZLm0sUT1ZLnMsdHQ9W251bGxdLGV0PTEscnQ9MCxudD1RbltLXTtyOmZvcig7Oyl7aWYoWiYmeSgkLDEpKXt2YXIgaXQ9eSgkLDMpKzIsYXQ9cShKLGl0KSxvdD1xKFgsaXQpLHN0PWF0Km90O2lmKCFGdChhdCxvdCwwLFksdHQpKWJyZWFrIHI7Zm9yKHR0PXR0WzBdLFEueGM9aXQsVz0wO1c8c3Q7KytXKXt2YXIgY3Q9dHRbV10+PjgmNjU1MzU7dHRbV109Y3QsY3Q+PWV0JiYoZXQ9Y3QrMSl9fWlmKCQuaClicmVhayByO2ZvcihWPTA7NT5WOysrVil7dmFyIHV0PVhuW1ZdOyFWJiYwPEsmJih1dCs9MTw8SykscnQ8dXQmJihydD11dCl9dmFyIGx0PW8oZXQqbnQsaCksaHQ9ZXQsZnQ9byhodCxkKTtpZihudWxsPT1mdCl2YXIgZHQ9bnVsbDtlbHNlIGUoNjU1MzY+PWh0KSxkdD1mdDt2YXIgcHQ9YShydCk7aWYobnVsbD09ZHR8fG51bGw9PXB0fHxudWxsPT1sdCl7WS5hPTE7YnJlYWsgcn12YXIgZ3Q9bHQ7Zm9yKFc9Rz0wO1c8ZXQ7KytXKXt2YXIgbXQ9ZHRbV10sdnQ9bXQuRyxidD1tdC5ILHd0PTAsTnQ9MSxMdD0wO2ZvcihWPTA7NT5WOysrVil7dXQ9WG5bVl0sdnRbVl09Z3QsYnRbVl09RywhViYmMDxLJiYodXQrPTE8PEspO246e3ZhciBBdCx4dD11dCxTdD1ZLGt0PXB0LEl0PWd0LEN0PUcsanQ9MCxPdD1TdC5tLEJ0PXkoT3QsMSk7aWYoaShrdCwwLDAseHQpLEJ0KXt2YXIgTXQ9eShPdCwxKSsxLEV0PXkoT3QsMSkscXQ9eShPdCwwPT1FdD8xOjgpO2t0W3F0XT0xLDI9PU10JiYoa3RbcXQ9eShPdCw4KV09MSk7dmFyIER0PTF9ZWxzZXt2YXIgUnQ9YSgxOSksVHQ9eShPdCw0KSs0O2lmKDE5PFR0KXtTdC5hPTM7dmFyIFV0PTA7YnJlYWsgbn1mb3IoQXQ9MDtBdDxUdDsrK0F0KVJ0W1puW0F0XV09eShPdCwzKTt2YXIgenQ9dm9pZCAwLEh0PXZvaWQgMCxXdD1TdCxWdD1SdCxHdD14dCxZdD1rdCxKdD0wLFh0PVd0Lm0sS3Q9OCxadD1vKDEyOCxoKTtpOmZvcig7bChadCwwLDcsVnQsMTkpOyl7aWYoeShYdCwxKSl7dmFyICR0PTIrMip5KFh0LDMpO2lmKCh6dD0yK3koWHQsJHQpKT5HdClicmVhayBpfWVsc2UgenQ9R3Q7Zm9yKEh0PTA7SHQ8R3QmJnp0LS07KXtTKFh0KTt2YXIgUXQ9WnRbMCsoMTI3JkwoWHQpKV07eChYdCxYdC51K1F0LmcpO3ZhciB0ZT1RdC52YWx1ZTtpZigxNj50ZSlZdFtIdCsrXT10ZSwwIT10ZSYmKEt0PXRlKTtlbHNle3ZhciBlZT0xNj09dGUscmU9dGUtMTYsbmU9Sm5bcmVdLGllPXkoWHQsWW5bcmVdKStuZTtpZihIdCtpZT5HdClicmVhayBpO2Zvcih2YXIgYWU9ZWU/S3Q6MDswPGllLS07KVl0W0h0KytdPWFlfX1KdD0xO2JyZWFrIGl9SnR8fChXdC5hPTMpLER0PUp0fShEdD1EdCYmIU90LmgpJiYoanQ9bChJdCxDdCw4LGt0LHh0KSksRHQmJjAhPWp0P1V0PWp0OihTdC5hPTMsVXQ9MCl9aWYoMD09VXQpYnJlYWsgcjtpZihOdCYmMT09S25bVl0mJihOdD0wPT1ndFtHXS5nKSx3dCs9Z3RbR10uZyxHKz1VdCwzPj1WKXt2YXIgb2Usc2U9cHRbMF07Zm9yKG9lPTE7b2U8dXQ7KytvZSlwdFtvZV0+c2UmJihzZT1wdFtvZV0pO0x0Kz1zZX19aWYobXQubmQ9TnQsbXQuUWI9MCxOdCYmKG10LnFiPSh2dFszXVtidFszXSswXS52YWx1ZTw8MjR8dnRbMV1bYnRbMV0rMF0udmFsdWU8PDE2fHZ0WzJdW2J0WzJdKzBdLnZhbHVlKT4+PjAsMD09d3QmJjI1Nj52dFswXVtidFswXSswXS52YWx1ZSYmKG10LlFiPTEsbXQucWIrPXZ0WzBdW2J0WzBdKzBdLnZhbHVlPDw4KSksbXQuamM9IW10LlFiJiY2Pkx0LG10LmpjKXt2YXIgY2UsdWU9bXQ7Zm9yKGNlPTA7Y2U8RHI7KytjZSl7dmFyIGxlPWNlLGhlPXVlLnBkW2xlXSxmZT11ZS5HWzBdW3VlLkhbMF0rbGVdOzI1Njw9ZmUudmFsdWU/KGhlLmc9ZmUuZysyNTYsaGUudmFsdWU9ZmUudmFsdWUpOihoZS5nPTAsaGUudmFsdWU9MCxsZT4+PXl0KGZlLDgsaGUpLGxlPj49eXQodWUuR1sxXVt1ZS5IWzFdK2xlXSwxNixoZSksbGU+Pj15dCh1ZS5HWzJdW3VlLkhbMl0rbGVdLDAsaGUpLHl0KHVlLkdbM11bdWUuSFszXStsZV0sMjQsaGUpKX19fVEudmM9dHQsUS5XYj1ldCxRLllhPWR0LFEueWM9bHQsSD0xO2JyZWFrIGV9SD0wfWlmKCEodT1IKSl7cy5hPTM7YnJlYWsgdH1pZigwPGIpe2lmKG0udWE9MTw8YiwhTyhtLldhLGIpKXtzLmE9MSx1PTA7YnJlYWsgdH19ZWxzZSBtLnVhPTA7dmFyIGRlPXMscGU9ZixnZT1wLG1lPWRlLnMsdmU9bWUueGM7aWYoZGUuYz1wZSxkZS5pPWdlLG1lLm1kPXEocGUsdmUpLG1lLndjPTA9PXZlPy0xOigxPDx2ZSktMSxuKXtzLnhiPXBpO2JyZWFrIHR9aWYobnVsbD09KHY9YShmKnApKSl7cy5hPTEsdT0wO2JyZWFrIHR9dT0odT1fdChzLHYsMCxmLHAscCxudWxsKSkmJiFnLmg7YnJlYWsgdH1yZXR1cm4gdT8obnVsbCE9Yz9jWzBdPXY6KGUobnVsbD09diksZShuKSkscy4kPTAsbnx8UHQobSkpOlB0KG0pLHV9ZnVuY3Rpb24gSXQodCxyKXt2YXIgbj10LmMqdC5pLGk9bityKzE2KnI7cmV0dXJuIGUodC5jPD1yKSx0LlY9YShpKSxudWxsPT10LlY/KHQuVGE9bnVsbCx0LlVhPTAsdC5hPTEsMCk6KHQuVGE9dC5WLHQuVWE9dC5CYStuK3IsMSl9ZnVuY3Rpb24gQ3QodCxyKXt2YXIgbj10LkMsaT1yLW4sYT10LlYsbz10LkJhK3QuYypuO2ZvcihlKHI8PXQubC5vKTswPGk7KXt2YXIgcz0xNjxpPzE2OmksYz10LmwubWEsdT10Lmwud2lkdGgsbD11KnMsaD1jLmNhLGY9Yy50Yit1Km4sZD10LlRhLHA9dC5VYTtOdCh0LHMsYSxvKSxfbihkLHAsaCxmLGwpLHh0KGMsbixuK3MsaCxmLHUpLGktPXMsYSs9cyp0LmMsbis9c31lKG49PXIpLHQuQz10Lk1hPXJ9ZnVuY3Rpb24ganQoKXt0aGlzLnViPXRoaXMueWQ9dGhpcy50ZD10aGlzLlJiPTB9ZnVuY3Rpb24gT3QoKXt0aGlzLktkPXRoaXMuTGQ9dGhpcy5VZD10aGlzLlRkPXRoaXMuaT10aGlzLmM9MH1mdW5jdGlvbiBCdCgpe3RoaXMuRmI9dGhpcy5CYj10aGlzLkNiPTAsdGhpcy5aYj1hKDQpLHRoaXMuTGI9YSg0KX1mdW5jdGlvbiBNdCgpe3RoaXMuWWI9ZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gZnVuY3Rpb24gdChlLHIsbil7Zm9yKHZhciBpPW5bcl0sYT0wO2E8aSYmKGUucHVzaChuLmxlbmd0aD5yKzE/W106MCksIShuLmxlbmd0aDxyKzEpKTthKyspdChlW2FdLHIrMSxuKX0odCwwLFszLDExXSksdH0oKX1mdW5jdGlvbiBFdCgpe3RoaXMuamI9YSgzKSx0aGlzLldjPXMoWzQsOF0sTXQpLHRoaXMuWGM9cyhbNCwxN10sTXQpfWZ1bmN0aW9uIHF0KCl7dGhpcy5QYz10aGlzLndiPXRoaXMuVGI9dGhpcy56ZD0wLHRoaXMudmQ9bmV3IGEoNCksdGhpcy5vZD1uZXcgYSg0KX1mdW5jdGlvbiBEdCgpe3RoaXMubGQ9dGhpcy5MYT10aGlzLmRkPXRoaXMudGM9MH1mdW5jdGlvbiBSdCgpe3RoaXMuTmE9dGhpcy5sYT0wfWZ1bmN0aW9uIFR0KCl7dGhpcy5TYz1bMCwwXSx0aGlzLkViPVswLDBdLHRoaXMuUWM9WzAsMF0sdGhpcy5pYT10aGlzLmxjPTB9ZnVuY3Rpb24gVXQoKXt0aGlzLmFkPWEoMzg0KSx0aGlzLlphPTAsdGhpcy5PYj1hKDE2KSx0aGlzLiRiPXRoaXMuQWQ9dGhpcy5pYT10aGlzLkdjPXRoaXMuSGM9dGhpcy5EZD0wfWZ1bmN0aW9uIHp0KCl7dGhpcy51Yz10aGlzLk09dGhpcy5OYj0wLHRoaXMud2E9QXJyYXkobmV3IER0KSx0aGlzLlk9MCx0aGlzLnlhPUFycmF5KG5ldyBVdCksdGhpcy5hYT0wLHRoaXMubD1uZXcgR3R9ZnVuY3Rpb24gSHQoKXt0aGlzLnk9YSgxNiksdGhpcy5mPWEoOCksdGhpcy5lYT1hKDgpfWZ1bmN0aW9uIFd0KCl7dGhpcy5jYj10aGlzLmE9MCx0aGlzLnNjPSIiLHRoaXMubT1uZXcgdyx0aGlzLk9kPW5ldyBqdCx0aGlzLktjPW5ldyBPdCx0aGlzLmVkPW5ldyBxdCx0aGlzLlFhPW5ldyBCdCx0aGlzLkljPXRoaXMuJGM9dGhpcy5BYT0wLHRoaXMuRD1uZXcgenQsdGhpcy5YYj10aGlzLlZhPXRoaXMuSGI9dGhpcy56Yj10aGlzLnliPXRoaXMuVWI9dGhpcy56YT0wLHRoaXMuSmM9byg4LHcpLHRoaXMuaWE9MCx0aGlzLnBiPW8oNCxUdCksdGhpcy5QYT1uZXcgRXQsdGhpcy5CZD10aGlzLmtjPTAsdGhpcy5BYz1bXSx0aGlzLkJjPTAsdGhpcy56Yz1bMCwwLDAsMF0sdGhpcy5HZD1BcnJheShuZXcgSHQpLHRoaXMuSGQ9MCx0aGlzLnJiPUFycmF5KG5ldyBSdCksdGhpcy5zYj0wLHRoaXMud2E9QXJyYXkobmV3IER0KSx0aGlzLlk9MCx0aGlzLm9jPVtdLHRoaXMucGM9MCx0aGlzLnNhPVtdLHRoaXMudGE9MCx0aGlzLnFhPVtdLHRoaXMucmE9MCx0aGlzLkhhPVtdLHRoaXMuQj10aGlzLlI9dGhpcy5JYT0wLHRoaXMuRWM9W10sdGhpcy5NPXRoaXMuamE9dGhpcy5WYj10aGlzLkZjPTAsdGhpcy55YT1BcnJheShuZXcgVXQpLHRoaXMuTD10aGlzLmFhPTAsdGhpcy5nZD1zKFs0LDJdLER0KSx0aGlzLmdhPW51bGwsdGhpcy5GYT1bXSx0aGlzLkNjPXRoaXMucWM9dGhpcy5QPTAsdGhpcy5HYj1bXSx0aGlzLlVjPTAsdGhpcy5tYj1bXSx0aGlzLm5iPTAsdGhpcy5yYz1bXSx0aGlzLkdhPXRoaXMuVmM9MH1mdW5jdGlvbiBWdCh0LGUpe3JldHVybiAwPnQ/MDp0PmU/ZTp0fWZ1bmN0aW9uIEd0KCl7dGhpcy5UPXRoaXMuVT10aGlzLmthPXRoaXMuaGVpZ2h0PXRoaXMud2lkdGg9MCx0aGlzLnk9W10sdGhpcy5mPVtdLHRoaXMuZWE9W10sdGhpcy5SYz10aGlzLmZhPXRoaXMuVz10aGlzLk49dGhpcy5PPTAsdGhpcy5tYT0idm9pZCIsdGhpcy5wdXQ9IlZQOElvUHV0SG9vayIsdGhpcy5hYz0iVlA4SW9TZXR1cEhvb2siLHRoaXMuYmM9IlZQOElvVGVhcmRvd25Ib29rIix0aGlzLmhhPXRoaXMuS2I9MCx0aGlzLmRhdGE9W10sdGhpcy5oYj10aGlzLmliPXRoaXMuZGE9dGhpcy5vPXRoaXMuaj10aGlzLnZhPXRoaXMudj10aGlzLkRhPXRoaXMub2I9dGhpcy53PTAsdGhpcy5GPVtdLHRoaXMuSj0wfWZ1bmN0aW9uIFl0KCl7dmFyIHQ9bmV3IFd0O3JldHVybiBudWxsIT10JiYodC5hPTAsdC5zYz0iT0siLHQuY2I9MCx0LlhiPTAsbml8fChuaT1adCkpLHR9ZnVuY3Rpb24gSnQodCxlLHIpe3JldHVybiAwPT10LmEmJih0LmE9ZSx0LnNjPXIsdC5jYj0wKSwwfWZ1bmN0aW9uIFh0KHQsZSxyKXtyZXR1cm4gMzw9ciYmMTU3PT10W2UrMF0mJjE9PXRbZSsxXSYmNDI9PXRbZSsyXX1mdW5jdGlvbiBLdCh0LHIpe2lmKG51bGw9PXQpcmV0dXJuIDA7aWYodC5hPTAsdC5zYz0iT0siLG51bGw9PXIpcmV0dXJuIEp0KHQsMiwibnVsbCBWUDhJbyBwYXNzZWQgdG8gVlA4R2V0SGVhZGVycygpIik7dmFyIG49ci5kYXRhLGE9ci53LG89ci5oYTtpZig0Pm8pcmV0dXJuIEp0KHQsNywiVHJ1bmNhdGVkIGhlYWRlci4iKTt2YXIgcz1uW2ErMF18blthKzFdPDw4fG5bYSsyXTw8MTYsYz10Lk9kO2lmKGMuUmI9ISgxJnMpLGMudGQ9cz4+MSY3LGMueWQ9cz4+NCYxLGMudWI9cz4+NSwzPGMudGQpcmV0dXJuIEp0KHQsMywiSW5jb3JyZWN0IGtleWZyYW1lIHBhcmFtZXRlcnMuIik7aWYoIWMueWQpcmV0dXJuIEp0KHQsNCwiRnJhbWUgbm90IGRpc3BsYXlhYmxlLiIpO2ErPTMsby09Mzt2YXIgdT10LktjO2lmKGMuUmIpe2lmKDc+bylyZXR1cm4gSnQodCw3LCJjYW5ub3QgcGFyc2UgcGljdHVyZSBoZWFkZXIiKTtpZighWHQobixhLG8pKXJldHVybiBKdCh0LDMsIkJhZCBjb2RlIHdvcmQiKTt1LmM9MTYzODMmKG5bYSs0XTw8OHxuW2ErM10pLHUuVGQ9blthKzRdPj42LHUuaT0xNjM4MyYoblthKzZdPDw4fG5bYSs1XSksdS5VZD1uW2ErNl0+PjYsYSs9NyxvLT03LHQuemE9dS5jKzE1Pj40LHQuVWI9dS5pKzE1Pj40LHIud2lkdGg9dS5jLHIuaGVpZ2h0PXUuaSxyLkRhPTAsci5qPTAsci52PTAsci52YT1yLndpZHRoLHIubz1yLmhlaWdodCxyLmRhPTAsci5pYj1yLndpZHRoLHIuaGI9ci5oZWlnaHQsci5VPXIud2lkdGgsci5UPXIuaGVpZ2h0LGkoKHM9dC5QYSkuamIsMCwyNTUscy5qYi5sZW5ndGgpLGUobnVsbCE9KHM9dC5RYSkpLHMuQ2I9MCxzLkJiPTAscy5GYj0xLGkocy5aYiwwLDAscy5aYi5sZW5ndGgpLGkocy5MYiwwLDAscy5MYil9aWYoYy51Yj5vKXJldHVybiBKdCh0LDcsImJhZCBwYXJ0aXRpb24gbGVuZ3RoIik7cChzPXQubSxuLGEsYy51YiksYSs9Yy51YixvLT1jLnViLGMuUmImJih1LkxkPVAocyksdS5LZD1QKHMpKSx1PXQuUWE7dmFyIGwsaD10LlBhO2lmKGUobnVsbCE9cyksZShudWxsIT11KSx1LkNiPVAocyksdS5DYil7aWYodS5CYj1QKHMpLFAocykpe2Zvcih1LkZiPVAocyksbD0wOzQ+bDsrK2wpdS5aYltsXT1QKHMpP20ocyw3KTowO2ZvcihsPTA7ND5sOysrbCl1LkxiW2xdPVAocyk/bShzLDYpOjB9aWYodS5CYilmb3IobD0wOzM+bDsrK2wpaC5qYltsXT1QKHMpP2cocyw4KToyNTV9ZWxzZSB1LkJiPTA7aWYocy5LYSlyZXR1cm4gSnQodCwzLCJjYW5ub3QgcGFyc2Ugc2VnbWVudCBoZWFkZXIiKTtpZigodT10LmVkKS56ZD1QKHMpLHUuVGI9ZyhzLDYpLHUud2I9ZyhzLDMpLHUuUGM9UChzKSx1LlBjJiZQKHMpKXtmb3IoaD0wOzQ+aDsrK2gpUChzKSYmKHUudmRbaF09bShzLDYpKTtmb3IoaD0wOzQ+aDsrK2gpUChzKSYmKHUub2RbaF09bShzLDYpKX1pZih0Lkw9MD09dS5UYj8wOnUuemQ/MToyLHMuS2EpcmV0dXJuIEp0KHQsMywiY2Fubm90IHBhcnNlIGZpbHRlciBoZWFkZXIiKTt2YXIgZj1vO2lmKG89bD1hLGE9bCtmLHU9Zix0LlhiPSgxPDxnKHQubSwyKSktMSxmPDMqKGg9dC5YYikpbj03O2Vsc2V7Zm9yKGwrPTMqaCx1LT0zKmgsZj0wO2Y8aDsrK2Ype3ZhciBkPW5bbyswXXxuW28rMV08PDh8bltvKzJdPDwxNjtkPnUmJihkPXUpLHAodC5KY1srZl0sbixsLGQpLGwrPWQsdS09ZCxvKz0zfXAodC5KY1sraF0sbixsLHUpLG49bDxhPzA6NX1pZigwIT1uKXJldHVybiBKdCh0LG4sImNhbm5vdCBwYXJzZSBwYXJ0aXRpb25zIik7Zm9yKG49ZyhsPXQubSw3KSxvPVAobCk/bShsLDQpOjAsYT1QKGwpP20obCw0KTowLHU9UChsKT9tKGwsNCk6MCxoPVAobCk/bShsLDQpOjAsbD1QKGwpP20obCw0KTowLGY9dC5RYSxkPTA7ND5kOysrZCl7aWYoZi5DYil7dmFyIHY9Zi5aYltkXTtmLkZifHwodis9bil9ZWxzZXtpZigwPGQpe3QucGJbZF09dC5wYlswXTtjb250aW51ZX12PW59dmFyIGI9dC5wYltkXTtiLlNjWzBdPWVpW1Z0KHYrbywxMjcpXSxiLlNjWzFdPXJpW1Z0KHYrMCwxMjcpXSxiLkViWzBdPTIqZWlbVnQodithLDEyNyldLGIuRWJbMV09MTAxNTgxKnJpW1Z0KHYrdSwxMjcpXT4+MTYsOD5iLkViWzFdJiYoYi5FYlsxXT04KSxiLlFjWzBdPWVpW1Z0KHYraCwxMTcpXSxiLlFjWzFdPXJpW1Z0KHYrbCwxMjcpXSxiLmxjPXYrbH1pZighYy5SYilyZXR1cm4gSnQodCw0LCJOb3QgYSBrZXkgZnJhbWUuIik7Zm9yKFAocyksYz10LlBhLG49MDs0Pm47KytuKXtmb3Iobz0wOzg+bzsrK28pZm9yKGE9MDszPmE7KythKWZvcih1PTA7MTE+dTsrK3UpaD1rKHMsdWlbbl1bb11bYV1bdV0pP2cocyw4KTpzaVtuXVtvXVthXVt1XSxjLldjW25dW29dLlliW2FdW3VdPWg7Zm9yKG89MDsxNz5vOysrbyljLlhjW25dW29dPWMuV2Nbbl1bbGlbb11dfXJldHVybiB0LmtjPVAocyksdC5rYyYmKHQuQmQ9ZyhzLDgpKSx0LmNiPTF9ZnVuY3Rpb24gWnQodCxlLHIsbixpLGEsbyl7dmFyIHM9ZVtpXS5ZYltyXTtmb3Iocj0wOzE2Pmk7KytpKXtpZighayh0LHNbciswXSkpcmV0dXJuIGk7Zm9yKDshayh0LHNbcisxXSk7KWlmKHM9ZVsrK2ldLlliWzBdLHI9MCwxNj09aSlyZXR1cm4gMTY7dmFyIGM9ZVtpKzFdLlliO2lmKGsodCxzW3IrMl0pKXt2YXIgdT10LGw9MDtpZihrKHUsKGY9cylbKGg9cikrM10pKWlmKGsodSxmW2grNl0pKXtmb3Iocz0wLGg9MioobD1rKHUsZltoKzhdKSkrKGY9ayh1LGZbaCs5K2xdKSksbD0wLGY9aWlbaF07ZltzXTsrK3MpbCs9bCtrKHUsZltzXSk7bCs9MysoODw8aCl9ZWxzZSBrKHUsZltoKzddKT8obD03KzIqayh1LDE2NSksbCs9ayh1LDE0NSkpOmw9NStrKHUsMTU5KTtlbHNlIGw9ayh1LGZbaCs0XSk/MytrKHUsZltoKzVdKToyO3M9Y1syXX1lbHNlIGw9MSxzPWNbMV07Yz1vK2FpW2ldLDA+KHU9dCkuYiYmXyh1KTt2YXIgaCxmPXUuYixkPShoPXUuQ2E+PjEpLSh1Lkk+PmYpPj4zMTstLXUuYix1LkNhKz1kLHUuQ2F8PTEsdS5JLT0oaCsxJmQpPDxmLGFbY109KChsXmQpLWQpKm5bKDA8aSkrMF19cmV0dXJuIDE2fWZ1bmN0aW9uICR0KHQpe3ZhciBlPXQucmJbdC5zYi0xXTtlLmxhPTAsZS5OYT0wLGkodC56YywwLDAsdC56Yy5sZW5ndGgpLHQuamE9MH1mdW5jdGlvbiBRdCh0LHIpe2lmKG51bGw9PXQpcmV0dXJuIDA7aWYobnVsbD09cilyZXR1cm4gSnQodCwyLCJOVUxMIFZQOElvIHBhcmFtZXRlciBpbiBWUDhEZWNvZGUoKS4iKTtpZighdC5jYiYmIUt0KHQscikpcmV0dXJuIDA7aWYoZSh0LmNiKSxudWxsPT1yLmFjfHxyLmFjKHIpKXtyLm9iJiYodC5MPTApO3ZhciBzPVJpW3QuTF07aWYoMj09dC5MPyh0LnliPTAsdC56Yj0wKToodC55Yj1yLnYtcz4+NCx0LnpiPXIuai1zPj40LDA+dC55YiYmKHQueWI9MCksMD50LnpiJiYodC56Yj0wKSksdC5WYT1yLm8rMTUrcz4+NCx0LkhiPXIudmErMTUrcz4+NCx0LkhiPnQuemEmJih0LkhiPXQuemEpLHQuVmE+dC5VYiYmKHQuVmE9dC5VYiksMDx0Lkwpe3ZhciBjPXQuZWQ7Zm9yKHM9MDs0PnM7KytzKXt2YXIgdTtpZih0LlFhLkNiKXt2YXIgbD10LlFhLkxiW3NdO3QuUWEuRmJ8fChsKz1jLlRiKX1lbHNlIGw9Yy5UYjtmb3IodT0wOzE+PXU7Kyt1KXt2YXIgaD10LmdkW3NdW3VdLGY9bDtpZihjLlBjJiYoZis9Yy52ZFswXSx1JiYoZis9Yy5vZFswXSkpLDA8KGY9MD5mPzA6NjM8Zj82MzpmKSl7dmFyIGQ9ZjswPGMud2ImJigoZD00PGMud2I/ZD4+MjpkPj4xKT45LWMud2ImJihkPTktYy53YikpLDE+ZCYmKGQ9MSksaC5kZD1kLGgudGM9MipmK2QsaC5sZD00MDw9Zj8yOjE1PD1mPzE6MH1lbHNlIGgudGM9MDtoLkxhPXV9fX1zPTB9ZWxzZSBKdCh0LDYsIkZyYW1lIHNldHVwIGZhaWxlZCIpLHM9dC5hO2lmKHM9MD09cyl7aWYocyl7dC4kYz0wLDA8dC5BYXx8KHQuSWM9VWkpO3Q6e3M9dC5JYztjPTQqKGQ9dC56YSk7dmFyIHA9MzIqZCxnPWQrMSxtPTA8dC5MP2QqKDA8dC5BYT8yOjEpOjAsdj0oMj09dC5BYT8yOjEpKmQ7aWYoKGg9Yys4MzIrKHU9MyooMTYqcytSaVt0LkxdKS8yKnApKyhsPW51bGwhPXQuRmEmJjA8dC5GYS5sZW5ndGg/dC5LYy5jKnQuS2MuaTowKSkhPWgpcz0wO2Vsc2V7aWYoaD50LlZiKXtpZih0LlZiPTAsdC5FYz1hKGgpLHQuRmM9MCxudWxsPT10LkVjKXtzPUp0KHQsMSwibm8gbWVtb3J5IGR1cmluZyBmcmFtZSBpbml0aWFsaXphdGlvbi4iKTticmVhayB0fXQuVmI9aH1oPXQuRWMsZj10LkZjLHQuQWM9aCx0LkJjPWYsZis9Yyx0LkdkPW8ocCxIdCksdC5IZD0wLHQucmI9byhnKzEsUnQpLHQuc2I9MSx0LndhPW0/byhtLER0KTpudWxsLHQuWT0wLHQuRC5OYj0wLHQuRC53YT10LndhLHQuRC5ZPXQuWSwwPHQuQWEmJih0LkQuWSs9ZCksZSghMCksdC5vYz1oLHQucGM9ZixmKz04MzIsdC55YT1vKHYsVXQpLHQuYWE9MCx0LkQueWE9dC55YSx0LkQuYWE9dC5hYSwyPT10LkFhJiYodC5ELmFhKz1kKSx0LlI9MTYqZCx0LkI9OCpkLGQ9KHA9UmlbdC5MXSkqdC5SLHA9cC8yKnQuQix0LnNhPWgsdC50YT1mK2QsdC5xYT10LnNhLHQucmE9dC50YSsxNipzKnQuUitwLHQuSGE9dC5xYSx0LklhPXQucmErOCpzKnQuQitwLHQuJGM9MCxmKz11LHQubWI9bD9oOm51bGwsdC5uYj1sP2Y6bnVsbCxlKGYrbDw9dC5GYyt0LlZiKSwkdCh0KSxpKHQuQWMsdC5CYywwLGMpLHM9MX19aWYocyl7aWYoci5rYT0wLHIueT10LnNhLHIuTz10LnRhLHIuZj10LnFhLHIuTj10LnJhLHIuZWE9dC5IYSxyLlZkPXQuSWEsci5mYT10LlIsci5SYz10LkIsci5GPW51bGwsci5KPTAsIUNuKXtmb3Iocz0tMjU1OzI1NT49czsrK3MpUG5bMjU1K3NdPTA+cz8tczpzO2ZvcihzPS0xMDIwOzEwMjA+PXM7KytzKWtuWzEwMjArc109LTEyOD5zPy0xMjg6MTI3PHM/MTI3OnM7Zm9yKHM9LTExMjsxMTI+PXM7KytzKUZuWzExMitzXT0tMTY+cz8tMTY6MTU8cz8xNTpzO2ZvcihzPS0yNTU7NTEwPj1zOysrcylJblsyNTUrc109MD5zPzA6MjU1PHM/MjU1OnM7Q249MX1hbj11ZSxvbj1hZSxjbj1vZSx1bj1zZSxsbj1jZSxzbj1pZSxobj1KZSxmbj1YZSxkbj0kZSxwbj1RZSxnbj1LZSxtbj1aZSx2bj10cixibj1lcix5bj16ZSx3bj1IZSxObj1XZSxMbj1WZSxmaVswXT14ZSxmaVsxXT1oZSxmaVsyXT1MZSxmaVszXT1BZSxmaVs0XT1TZSxmaVs1XT1QZSxmaVs2XT1fZSxmaVs3XT1rZSxmaVs4XT1JZSxmaVs5XT1GZSxoaVswXT12ZSxoaVsxXT1kZSxoaVsyXT1wZSxoaVszXT1nZSxoaVs0XT1iZSxoaVs1XT15ZSxoaVs2XT13ZSxkaVswXT1CZSxkaVsxXT1mZSxkaVsyXT1DZSxkaVszXT1qZSxkaVs0XT1FZSxkaVs1XT1NZSxkaVs2XT1xZSxzPTF9ZWxzZSBzPTB9cyYmKHM9ZnVuY3Rpb24odCxyKXtmb3IodC5NPTA7dC5NPHQuVmE7Kyt0Lk0pe3ZhciBvLHM9dC5KY1t0Lk0mdC5YYl0sYz10Lm0sdT10O2ZvcihvPTA7bzx1LnphOysrbyl7dmFyIGw9YyxoPXUsZj1oLkFjLGQ9aC5CYys0Km8scD1oLnpjLGc9aC55YVtoLmFhK29dO2lmKGguUWEuQmI/Zy4kYj1rKGwsaC5QYS5qYlswXSk/MitrKGwsaC5QYS5qYlsyXSk6ayhsLGguUGEuamJbMV0pOmcuJGI9MCxoLmtjJiYoZy5BZD1rKGwsaC5CZCkpLGcuWmE9IWsobCwxNDUpKzAsZy5aYSl7dmFyIG09Zy5PYix2PTA7Zm9yKGg9MDs0Pmg7KytoKXt2YXIgYix5PXBbMCtoXTtmb3IoYj0wOzQ+YjsrK2Ipe3k9Y2lbZltkK2JdXVt5XTtmb3IodmFyIHc9b2lbayhsLHlbMF0pXTswPHc7KXc9b2lbMip3K2sobCx5W3ddKV07eT0tdyxmW2QrYl09eX1uKG0sdixmLGQsNCksdis9NCxwWzAraF09eX19ZWxzZSB5PWsobCwxNTYpP2sobCwxMjgpPzE6MzprKGwsMTYzKT8yOjAsZy5PYlswXT15LGkoZixkLHksNCksaShwLDAseSw0KTtnLkRkPWsobCwxNDIpP2sobCwxMTQpP2sobCwxODMpPzE6MzoyOjB9aWYodS5tLkthKXJldHVybiBKdCh0LDcsIlByZW1hdHVyZSBlbmQtb2YtcGFydGl0aW9uMCBlbmNvdW50ZXJlZC4iKTtmb3IoO3QuamE8dC56YTsrK3QuamEpe2lmKHU9cyxsPShjPXQpLnJiW2Muc2ItMV0sZj1jLnJiW2Muc2IrYy5qYV0sbz1jLnlhW2MuYWErYy5qYV0sZD1jLmtjP28uQWQ6MClsLmxhPWYubGE9MCxvLlphfHwobC5OYT1mLk5hPTApLG8uSGM9MCxvLkdjPTAsby5pYT0wO2Vsc2V7dmFyIE4sTDtsPWYsZj11LGQ9Yy5QYS5YYyxwPWMueWFbYy5hYStjLmphXSxnPWMucGJbcC4kYl07aWYoaD1wLmFkLG09MCx2PWMucmJbYy5zYi0xXSx5PWI9MCxpKGgsbSwwLDM4NCkscC5aYSl2YXIgQT0wLHg9ZFszXTtlbHNle3c9YSgxNik7dmFyIFM9bC5OYSt2Lk5hO2lmKFM9bmkoZixkWzFdLFMsZy5FYiwwLHcsMCksbC5OYT12Lk5hPSgwPFMpKzAsMTxTKWFuKHcsMCxoLG0pO2Vsc2V7dmFyIF89d1swXSszPj4zO2Zvcih3PTA7MjU2Pnc7dys9MTYpaFttK3ddPV99QT0xLHg9ZFswXX12YXIgUD0xNSZsLmxhLEY9MTUmdi5sYTtmb3Iodz0wOzQ+dzsrK3cpe3ZhciBJPTEmRjtmb3IoXz1MPTA7ND5fOysrXylQPVA+PjF8KEk9KFM9bmkoZix4LFM9SSsoMSZQKSxnLlNjLEEsaCxtKSk+QSk8PDcsTD1MPDwyfCgzPFM/MzoxPFM/MjowIT1oW20rMF0pLG0rPTE2O1A+Pj00LEY9Rj4+MXxJPDw3LGI9KGI8PDh8TCk+Pj4wfWZvcih4PVAsQT1GPj40LE49MDs0Pk47Tis9Mil7Zm9yKEw9MCxQPWwubGE+PjQrTixGPXYubGE+PjQrTix3PTA7Mj53Oysrdyl7Zm9yKEk9MSZGLF89MDsyPl87KytfKVM9SSsoMSZQKSxQPVA+PjF8KEk9MDwoUz1uaShmLGRbMl0sUyxnLlFjLDAsaCxtKSkpPDwzLEw9TDw8MnwoMzxTPzM6MTxTPzI6MCE9aFttKzBdKSxtKz0xNjtQPj49MixGPUY+PjF8STw8NX15fD1MPDw0Kk4seHw9UDw8NDw8TixBfD0oMjQwJkYpPDxOfWwubGE9eCx2LmxhPUEscC5IYz1iLHAuR2M9eSxwLmlhPTQzNjkwJnk/MDpnLmlhLGQ9IShifHkpfWlmKDA8Yy5MJiYoYy53YVtjLlkrYy5qYV09Yy5nZFtvLiRiXVtvLlphXSxjLndhW2MuWStjLmphXS5MYXw9IWQpLHUuS2EpcmV0dXJuIEp0KHQsNywiUHJlbWF0dXJlIGVuZC1vZi1maWxlIGVuY291bnRlcmVkLiIpfWlmKCR0KHQpLGM9cix1PTEsbz0ocz10KS5ELGw9MDxzLkwmJnMuTT49cy56YiYmcy5NPD1zLlZhLDA9PXMuQWEpdDp7aWYoby5NPXMuTSxvLnVjPWwsT3IocyxvKSx1PTEsbz0oTD1zLkQpLk5iLGw9KHk9Umlbcy5MXSkqcy5SLGY9eS8yKnMuQix3PTE2Km8qcy5SLF89OCpvKnMuQixkPXMuc2EscD1zLnRhLWwrdyxnPXMucWEsaD1zLnJhLWYrXyxtPXMuSGEsdj1zLklhLWYrXyxGPTA9PShQPUwuTSksYj1QPj1zLlZhLTEsMj09cy5BYSYmT3IocyxMKSxMLnVjKWZvcihJPShTPXMpLkQuTSxlKFMuRC51YyksTD1TLnliO0w8Uy5IYjsrK0wpe0E9TCx4PUk7dmFyIEM9KGo9KFU9UykuRCkuTmI7Tj1VLlI7dmFyIGo9ai53YVtqLlkrQV0sTz1VLnNhLEI9VS50YSsxNipDKk4rMTYqQSxNPWouZGQsRT1qLnRjO2lmKDAhPUUpaWYoZSgzPD1FKSwxPT1VLkwpMDxBJiZ3bihPLEIsTixFKzQpLGouTGEmJkxuKE8sQixOLEUpLDA8eCYmeW4oTyxCLE4sRSs0KSxqLkxhJiZObihPLEIsTixFKTtlbHNle3ZhciBxPVUuQixEPVUucWEsUj1VLnJhKzgqQypxKzgqQSxUPVUuSGEsVT1VLklhKzgqQypxKzgqQTtDPWoubGQ7MDxBJiYoZm4oTyxCLE4sRSs0LE0sQykscG4oRCxSLFQsVSxxLEUrNCxNLEMpKSxqLkxhJiYobW4oTyxCLE4sRSxNLEMpLGJuKEQsUixULFUscSxFLE0sQykpLDA8eCYmKGhuKE8sQixOLEUrNCxNLEMpLGRuKEQsUixULFUscSxFKzQsTSxDKSksai5MYSYmKGduKE8sQixOLEUsTSxDKSx2bihELFIsVCxVLHEsRSxNLEMpKX19aWYocy5pYSYmYWxlcnQoInRvZG86RGl0aGVyUm93IiksbnVsbCE9Yy5wdXQpe2lmKEw9MTYqUCxQPTE2KihQKzEpLEY/KGMueT1zLnNhLGMuTz1zLnRhK3csYy5mPXMucWEsYy5OPXMucmErXyxjLmVhPXMuSGEsYy5XPXMuSWErXyk6KEwtPXksYy55PWQsYy5PPXAsYy5mPWcsYy5OPWgsYy5lYT1tLGMuVz12KSxifHwoUC09eSksUD5jLm8mJihQPWMubyksYy5GPW51bGwsYy5KPW51bGwsbnVsbCE9cy5GYSYmMDxzLkZhLmxlbmd0aCYmTDxQJiYoYy5KPWhyKHMsYyxMLFAtTCksYy5GPXMubWIsbnVsbD09Yy5GJiYwPT1jLkYubGVuZ3RoKSl7dT1KdChzLDMsIkNvdWxkIG5vdCBkZWNvZGUgYWxwaGEgZGF0YS4iKTticmVhayB0fUw8Yy5qJiYoeT1jLmotTCxMPWMuaixlKCEoMSZ5KSksYy5PKz1zLlIqeSxjLk4rPXMuQiooeT4+MSksYy5XKz1zLkIqKHk+PjEpLG51bGwhPWMuRiYmKGMuSis9Yy53aWR0aCp5KSksTDxQJiYoYy5PKz1jLnYsYy5OKz1jLnY+PjEsYy5XKz1jLnY+PjEsbnVsbCE9Yy5GJiYoYy5KKz1jLnYpLGMua2E9TC1jLmosYy5VPWMudmEtYy52LGMuVD1QLUwsdT1jLnB1dChjKSl9bysxIT1zLkljfHxifHwobihzLnNhLHMudGEtbCxkLHArMTYqcy5SLGwpLG4ocy5xYSxzLnJhLWYsZyxoKzgqcy5CLGYpLG4ocy5IYSxzLklhLWYsbSx2Kzgqcy5CLGYpKX1pZighdSlyZXR1cm4gSnQodCw2LCJPdXRwdXQgYWJvcnRlZC4iKX1yZXR1cm4gMX0odCxyKSksbnVsbCE9ci5iYyYmci5iYyhyKSxzJj0xfXJldHVybiBzPyh0LmNiPTAscyk6MH1mdW5jdGlvbiB0ZSh0LGUscixuLGkpe2k9dFtlK3IrMzIqbl0rKGk+PjMpLHRbZStyKzMyKm5dPS0yNTYmaT8wPmk/MDoyNTU6aX1mdW5jdGlvbiBlZSh0LGUscixuLGksYSl7dGUodCxlLDAscixuK2kpLHRlKHQsZSwxLHIsbithKSx0ZSh0LGUsMixyLG4tYSksdGUodCxlLDMscixuLWkpfWZ1bmN0aW9uIHJlKHQpe3JldHVybigyMDA5MSp0Pj4xNikrdH1mdW5jdGlvbiBuZSh0LGUscixuKXt2YXIgaSxvPTAscz1hKDE2KTtmb3IoaT0wOzQ+aTsrK2kpe3ZhciBjPXRbZSswXSt0W2UrOF0sdT10W2UrMF0tdFtlKzhdLGw9KDM1NDY4KnRbZSs0XT4+MTYpLXJlKHRbZSsxMl0pLGg9cmUodFtlKzRdKSsoMzU0NjgqdFtlKzEyXT4+MTYpO3NbbyswXT1jK2gsc1tvKzFdPXUrbCxzW28rMl09dS1sLHNbbyszXT1jLWgsbys9NCxlKyt9Zm9yKGk9bz0wOzQ+aTsrK2kpYz0odD1zW28rMF0rNCkrc1tvKzhdLHU9dC1zW28rOF0sbD0oMzU0Njgqc1tvKzRdPj4xNiktcmUoc1tvKzEyXSksdGUocixuLDAsMCxjKyhoPXJlKHNbbys0XSkrKDM1NDY4KnNbbysxMl0+PjE2KSkpLHRlKHIsbiwxLDAsdStsKSx0ZShyLG4sMiwwLHUtbCksdGUocixuLDMsMCxjLWgpLG8rKyxuKz0zMn1mdW5jdGlvbiBpZSh0LGUscixuKXt2YXIgaT10W2UrMF0rNCxhPTM1NDY4KnRbZSs0XT4+MTYsbz1yZSh0W2UrNF0pLHM9MzU0NjgqdFtlKzFdPj4xNjtlZShyLG4sMCxpK28sdD1yZSh0W2UrMV0pLHMpLGVlKHIsbiwxLGkrYSx0LHMpLGVlKHIsbiwyLGktYSx0LHMpLGVlKHIsbiwzLGktbyx0LHMpfWZ1bmN0aW9uIGFlKHQsZSxyLG4saSl7bmUodCxlLHIsbiksaSYmbmUodCxlKzE2LHIsbis0KX1mdW5jdGlvbiBvZSh0LGUscixuKXtvbih0LGUrMCxyLG4sMSksb24odCxlKzMyLHIsbisxMjgsMSl9ZnVuY3Rpb24gc2UodCxlLHIsbil7dmFyIGk7Zm9yKHQ9dFtlKzBdKzQsaT0wOzQ+aTsrK2kpZm9yKGU9MDs0PmU7KytlKXRlKHIsbixlLGksdCl9ZnVuY3Rpb24gY2UodCxlLHIsbil7dFtlKzBdJiZ1bih0LGUrMCxyLG4pLHRbZSsxNl0mJnVuKHQsZSsxNixyLG4rNCksdFtlKzMyXSYmdW4odCxlKzMyLHIsbisxMjgpLHRbZSs0OF0mJnVuKHQsZSs0OCxyLG4rMTI4KzQpfWZ1bmN0aW9uIHVlKHQsZSxyLG4pe3ZhciBpLG89YSgxNik7Zm9yKGk9MDs0Pmk7KytpKXt2YXIgcz10W2UrMCtpXSt0W2UrMTIraV0sYz10W2UrNCtpXSt0W2UrOCtpXSx1PXRbZSs0K2ldLXRbZSs4K2ldLGw9dFtlKzAraV0tdFtlKzEyK2ldO29bMCtpXT1zK2Msb1s4K2ldPXMtYyxvWzQraV09bCt1LG9bMTIraV09bC11fWZvcihpPTA7ND5pOysraSlzPSh0PW9bMCs0KmldKzMpK29bMys0KmldLGM9b1sxKzQqaV0rb1syKzQqaV0sdT1vWzErNCppXS1vWzIrNCppXSxsPXQtb1szKzQqaV0scltuKzBdPXMrYz4+MyxyW24rMTZdPWwrdT4+MyxyW24rMzJdPXMtYz4+MyxyW24rNDhdPWwtdT4+MyxuKz02NH1mdW5jdGlvbiBsZSh0LGUscil7dmFyIG4saT1lLTMyLGE9Qm4sbz0yNTUtdFtpLTFdO2ZvcihuPTA7bjxyOysrbil7dmFyIHMsYz1hLHU9byt0W2UtMV07Zm9yKHM9MDtzPHI7KytzKXRbZStzXT1jW3UrdFtpK3NdXTtlKz0zMn19ZnVuY3Rpb24gaGUodCxlKXtsZSh0LGUsNCl9ZnVuY3Rpb24gZmUodCxlKXtsZSh0LGUsOCl9ZnVuY3Rpb24gZGUodCxlKXtsZSh0LGUsMTYpfWZ1bmN0aW9uIHBlKHQsZSl7dmFyIHI7Zm9yKHI9MDsxNj5yOysrciluKHQsZSszMipyLHQsZS0zMiwxNil9ZnVuY3Rpb24gZ2UodCxlKXt2YXIgcjtmb3Iocj0xNjswPHI7LS1yKWkodCxlLHRbZS0xXSwxNiksZSs9MzJ9ZnVuY3Rpb24gbWUodCxlLHIpe3ZhciBuO2ZvcihuPTA7MTY+bjsrK24paShlLHIrMzIqbix0LDE2KX1mdW5jdGlvbiB2ZSh0LGUpe3ZhciByLG49MTY7Zm9yKHI9MDsxNj5yOysrciluKz10W2UtMSszMipyXSt0W2Urci0zMl07bWUobj4+NSx0LGUpfWZ1bmN0aW9uIGJlKHQsZSl7dmFyIHIsbj04O2ZvcihyPTA7MTY+cjsrK3Ipbis9dFtlLTErMzIqcl07bWUobj4+NCx0LGUpfWZ1bmN0aW9uIHllKHQsZSl7dmFyIHIsbj04O2ZvcihyPTA7MTY+cjsrK3Ipbis9dFtlK3ItMzJdO21lKG4+PjQsdCxlKX1mdW5jdGlvbiB3ZSh0LGUpe21lKDEyOCx0LGUpfWZ1bmN0aW9uIE5lKHQsZSxyKXtyZXR1cm4gdCsyKmUrcisyPj4yfWZ1bmN0aW9uIExlKHQsZSl7dmFyIHIsaT1lLTMyO2k9bmV3IFVpbnQ4QXJyYXkoW05lKHRbaS0xXSx0W2krMF0sdFtpKzFdKSxOZSh0W2krMF0sdFtpKzFdLHRbaSsyXSksTmUodFtpKzFdLHRbaSsyXSx0W2krM10pLE5lKHRbaSsyXSx0W2krM10sdFtpKzRdKV0pO2ZvcihyPTA7ND5yOysrciluKHQsZSszMipyLGksMCxpLmxlbmd0aCl9ZnVuY3Rpb24gQWUodCxlKXt2YXIgcj10W2UtMV0sbj10W2UtMSszMl0saT10W2UtMSs2NF0sYT10W2UtMSs5Nl07Rih0LGUrMCwxNjg0MzAwOSpOZSh0W2UtMS0zMl0scixuKSksRih0LGUrMzIsMTY4NDMwMDkqTmUocixuLGkpKSxGKHQsZSs2NCwxNjg0MzAwOSpOZShuLGksYSkpLEYodCxlKzk2LDE2ODQzMDA5Kk5lKGksYSxhKSl9ZnVuY3Rpb24geGUodCxlKXt2YXIgcixuPTQ7Zm9yKHI9MDs0PnI7KytyKW4rPXRbZStyLTMyXSt0W2UtMSszMipyXTtmb3Iobj4+PTMscj0wOzQ+cjsrK3IpaSh0LGUrMzIqcixuLDQpfWZ1bmN0aW9uIFNlKHQsZSl7dmFyIHI9dFtlLTErMF0sbj10W2UtMSszMl0saT10W2UtMSs2NF0sYT10W2UtMS0zMl0sbz10W2UrMC0zMl0scz10W2UrMS0zMl0sYz10W2UrMi0zMl0sdT10W2UrMy0zMl07dFtlKzArOTZdPU5lKG4saSx0W2UtMSs5Nl0pLHRbZSsxKzk2XT10W2UrMCs2NF09TmUocixuLGkpLHRbZSsyKzk2XT10W2UrMSs2NF09dFtlKzArMzJdPU5lKGEscixuKSx0W2UrMys5Nl09dFtlKzIrNjRdPXRbZSsxKzMyXT10W2UrMCswXT1OZShvLGEsciksdFtlKzMrNjRdPXRbZSsyKzMyXT10W2UrMSswXT1OZShzLG8sYSksdFtlKzMrMzJdPXRbZSsyKzBdPU5lKGMscyxvKSx0W2UrMyswXT1OZSh1LGMscyl9ZnVuY3Rpb24gX2UodCxlKXt2YXIgcj10W2UrMS0zMl0sbj10W2UrMi0zMl0saT10W2UrMy0zMl0sYT10W2UrNC0zMl0sbz10W2UrNS0zMl0scz10W2UrNi0zMl0sYz10W2UrNy0zMl07dFtlKzArMF09TmUodFtlKzAtMzJdLHIsbiksdFtlKzErMF09dFtlKzArMzJdPU5lKHIsbixpKSx0W2UrMiswXT10W2UrMSszMl09dFtlKzArNjRdPU5lKG4saSxhKSx0W2UrMyswXT10W2UrMiszMl09dFtlKzErNjRdPXRbZSswKzk2XT1OZShpLGEsbyksdFtlKzMrMzJdPXRbZSsyKzY0XT10W2UrMSs5Nl09TmUoYSxvLHMpLHRbZSszKzY0XT10W2UrMis5Nl09TmUobyxzLGMpLHRbZSszKzk2XT1OZShzLGMsYyl9ZnVuY3Rpb24gUGUodCxlKXt2YXIgcj10W2UtMSswXSxuPXRbZS0xKzMyXSxpPXRbZS0xKzY0XSxhPXRbZS0xLTMyXSxvPXRbZSswLTMyXSxzPXRbZSsxLTMyXSxjPXRbZSsyLTMyXSx1PXRbZSszLTMyXTt0W2UrMCswXT10W2UrMSs2NF09YStvKzE+PjEsdFtlKzErMF09dFtlKzIrNjRdPW8rcysxPj4xLHRbZSsyKzBdPXRbZSszKzY0XT1zK2MrMT4+MSx0W2UrMyswXT1jK3UrMT4+MSx0W2UrMCs5Nl09TmUoaSxuLHIpLHRbZSswKzY0XT1OZShuLHIsYSksdFtlKzArMzJdPXRbZSsxKzk2XT1OZShyLGEsbyksdFtlKzErMzJdPXRbZSsyKzk2XT1OZShhLG8scyksdFtlKzIrMzJdPXRbZSszKzk2XT1OZShvLHMsYyksdFtlKzMrMzJdPU5lKHMsYyx1KX1mdW5jdGlvbiBrZSh0LGUpe3ZhciByPXRbZSswLTMyXSxuPXRbZSsxLTMyXSxpPXRbZSsyLTMyXSxhPXRbZSszLTMyXSxvPXRbZSs0LTMyXSxzPXRbZSs1LTMyXSxjPXRbZSs2LTMyXSx1PXRbZSs3LTMyXTt0W2UrMCswXT1yK24rMT4+MSx0W2UrMSswXT10W2UrMCs2NF09bitpKzE+PjEsdFtlKzIrMF09dFtlKzErNjRdPWkrYSsxPj4xLHRbZSszKzBdPXRbZSsyKzY0XT1hK28rMT4+MSx0W2UrMCszMl09TmUocixuLGkpLHRbZSsxKzMyXT10W2UrMCs5Nl09TmUobixpLGEpLHRbZSsyKzMyXT10W2UrMSs5Nl09TmUoaSxhLG8pLHRbZSszKzMyXT10W2UrMis5Nl09TmUoYSxvLHMpLHRbZSszKzY0XT1OZShvLHMsYyksdFtlKzMrOTZdPU5lKHMsYyx1KX1mdW5jdGlvbiBGZSh0LGUpe3ZhciByPXRbZS0xKzBdLG49dFtlLTErMzJdLGk9dFtlLTErNjRdLGE9dFtlLTErOTZdO3RbZSswKzBdPXIrbisxPj4xLHRbZSsyKzBdPXRbZSswKzMyXT1uK2krMT4+MSx0W2UrMiszMl09dFtlKzArNjRdPWkrYSsxPj4xLHRbZSsxKzBdPU5lKHIsbixpKSx0W2UrMyswXT10W2UrMSszMl09TmUobixpLGEpLHRbZSszKzMyXT10W2UrMSs2NF09TmUoaSxhLGEpLHRbZSszKzY0XT10W2UrMis2NF09dFtlKzArOTZdPXRbZSsxKzk2XT10W2UrMis5Nl09dFtlKzMrOTZdPWF9ZnVuY3Rpb24gSWUodCxlKXt2YXIgcj10W2UtMSswXSxuPXRbZS0xKzMyXSxpPXRbZS0xKzY0XSxhPXRbZS0xKzk2XSxvPXRbZS0xLTMyXSxzPXRbZSswLTMyXSxjPXRbZSsxLTMyXSx1PXRbZSsyLTMyXTt0W2UrMCswXT10W2UrMiszMl09citvKzE+PjEsdFtlKzArMzJdPXRbZSsyKzY0XT1uK3IrMT4+MSx0W2UrMCs2NF09dFtlKzIrOTZdPWkrbisxPj4xLHRbZSswKzk2XT1hK2krMT4+MSx0W2UrMyswXT1OZShzLGMsdSksdFtlKzIrMF09TmUobyxzLGMpLHRbZSsxKzBdPXRbZSszKzMyXT1OZShyLG8scyksdFtlKzErMzJdPXRbZSszKzY0XT1OZShuLHIsbyksdFtlKzErNjRdPXRbZSszKzk2XT1OZShpLG4sciksdFtlKzErOTZdPU5lKGEsaSxuKX1mdW5jdGlvbiBDZSh0LGUpe3ZhciByO2ZvcihyPTA7OD5yOysrciluKHQsZSszMipyLHQsZS0zMiw4KX1mdW5jdGlvbiBqZSh0LGUpe3ZhciByO2ZvcihyPTA7OD5yOysrcilpKHQsZSx0W2UtMV0sOCksZSs9MzJ9ZnVuY3Rpb24gT2UodCxlLHIpe3ZhciBuO2ZvcihuPTA7OD5uOysrbilpKGUsciszMipuLHQsOCl9ZnVuY3Rpb24gQmUodCxlKXt2YXIgcixuPTg7Zm9yKHI9MDs4PnI7KytyKW4rPXRbZStyLTMyXSt0W2UtMSszMipyXTtPZShuPj40LHQsZSl9ZnVuY3Rpb24gTWUodCxlKXt2YXIgcixuPTQ7Zm9yKHI9MDs4PnI7KytyKW4rPXRbZStyLTMyXTtPZShuPj4zLHQsZSl9ZnVuY3Rpb24gRWUodCxlKXt2YXIgcixuPTQ7Zm9yKHI9MDs4PnI7KytyKW4rPXRbZS0xKzMyKnJdO09lKG4+PjMsdCxlKX1mdW5jdGlvbiBxZSh0LGUpe09lKDEyOCx0LGUpfWZ1bmN0aW9uIERlKHQsZSxyKXt2YXIgbj10W2Utcl0saT10W2UrMF0sYT0zKihpLW4pK2puWzEwMjArdFtlLTIqcl0tdFtlK3JdXSxvPU9uWzExMisoYSs0Pj4zKV07dFtlLXJdPUJuWzI1NStuK09uWzExMisoYSszPj4zKV1dLHRbZSswXT1CblsyNTUraS1vXX1mdW5jdGlvbiBSZSh0LGUscixuKXt2YXIgaT10W2UrMF0sYT10W2Urcl07cmV0dXJuIE1uWzI1NSt0W2UtMipyXS10W2Utcl1dPm58fE1uWzI1NSthLWldPm59ZnVuY3Rpb24gVGUodCxlLHIsbil7cmV0dXJuIDQqTW5bMjU1K3RbZS1yXS10W2UrMF1dK01uWzI1NSt0W2UtMipyXS10W2Urcl1dPD1ufWZ1bmN0aW9uIFVlKHQsZSxyLG4saSl7dmFyIGE9dFtlLTMqcl0sbz10W2UtMipyXSxzPXRbZS1yXSxjPXRbZSswXSx1PXRbZStyXSxsPXRbZSsyKnJdLGg9dFtlKzMqcl07cmV0dXJuIDQqTW5bMjU1K3MtY10rTW5bMjU1K28tdV0+bj8wOk1uWzI1NSt0W2UtNCpyXS1hXTw9aSYmTW5bMjU1K2Etb108PWkmJk1uWzI1NStvLXNdPD1pJiZNblsyNTUraC1sXTw9aSYmTW5bMjU1K2wtdV08PWkmJk1uWzI1NSt1LWNdPD1pfWZ1bmN0aW9uIHplKHQsZSxyLG4pe3ZhciBpPTIqbisxO2ZvcihuPTA7MTY+bjsrK24pVGUodCxlK24scixpKSYmRGUodCxlK24scil9ZnVuY3Rpb24gSGUodCxlLHIsbil7dmFyIGk9MipuKzE7Zm9yKG49MDsxNj5uOysrbilUZSh0LGUrbipyLDEsaSkmJkRlKHQsZStuKnIsMSl9ZnVuY3Rpb24gV2UodCxlLHIsbil7dmFyIGk7Zm9yKGk9MzswPGk7LS1pKXplKHQsZSs9NCpyLHIsbil9ZnVuY3Rpb24gVmUodCxlLHIsbil7dmFyIGk7Zm9yKGk9MzswPGk7LS1pKUhlKHQsZSs9NCxyLG4pfWZ1bmN0aW9uIEdlKHQsZSxyLG4saSxhLG8scyl7Zm9yKGE9MiphKzE7MDxpLS07KXtpZihVZSh0LGUscixhLG8pKWlmKFJlKHQsZSxyLHMpKURlKHQsZSxyKTtlbHNle3ZhciBjPXQsdT1lLGw9cixoPWNbdS0yKmxdLGY9Y1t1LWxdLGQ9Y1t1KzBdLHA9Y1t1K2xdLGc9Y1t1KzIqbF0sbT0yNyooYj1qblsxMDIwKzMqKGQtZikram5bMTAyMCtoLXBdXSkrNjM+Pjcsdj0xOCpiKzYzPj43LGI9OSpiKzYzPj43O2NbdS0zKmxdPUJuWzI1NStjW3UtMypsXStiXSxjW3UtMipsXT1CblsyNTUraCt2XSxjW3UtbF09Qm5bMjU1K2YrbV0sY1t1KzBdPUJuWzI1NStkLW1dLGNbdStsXT1CblsyNTUrcC12XSxjW3UrMipsXT1CblsyNTUrZy1iXX1lKz1ufX1mdW5jdGlvbiBZZSh0LGUscixuLGksYSxvLHMpe2ZvcihhPTIqYSsxOzA8aS0tOyl7aWYoVWUodCxlLHIsYSxvKSlpZihSZSh0LGUscixzKSlEZSh0LGUscik7ZWxzZXt2YXIgYz10LHU9ZSxsPXIsaD1jW3UtbF0sZj1jW3UrMF0sZD1jW3UrbF0scD1PblsxMTIrKChnPTMqKGYtaCkpKzQ+PjMpXSxnPU9uWzExMisoZyszPj4zKV0sbT1wKzE+PjE7Y1t1LTIqbF09Qm5bMjU1K2NbdS0yKmxdK21dLGNbdS1sXT1CblsyNTUraCtnXSxjW3UrMF09Qm5bMjU1K2YtcF0sY1t1K2xdPUJuWzI1NStkLW1dfWUrPW59fWZ1bmN0aW9uIEplKHQsZSxyLG4saSxhKXtHZSh0LGUsciwxLDE2LG4saSxhKX1mdW5jdGlvbiBYZSh0LGUscixuLGksYSl7R2UodCxlLDEsciwxNixuLGksYSl9ZnVuY3Rpb24gS2UodCxlLHIsbixpLGEpe3ZhciBvO2ZvcihvPTM7MDxvOy0tbylZZSh0LGUrPTQqcixyLDEsMTYsbixpLGEpfWZ1bmN0aW9uIFplKHQsZSxyLG4saSxhKXt2YXIgbztmb3Iobz0zOzA8bzstLW8pWWUodCxlKz00LDEsciwxNixuLGksYSl9ZnVuY3Rpb24gJGUodCxlLHIsbixpLGEsbyxzKXtHZSh0LGUsaSwxLDgsYSxvLHMpLEdlKHIsbixpLDEsOCxhLG8scyl9ZnVuY3Rpb24gUWUodCxlLHIsbixpLGEsbyxzKXtHZSh0LGUsMSxpLDgsYSxvLHMpLEdlKHIsbiwxLGksOCxhLG8scyl9ZnVuY3Rpb24gdHIodCxlLHIsbixpLGEsbyxzKXtZZSh0LGUrNCppLGksMSw4LGEsbyxzKSxZZShyLG4rNCppLGksMSw4LGEsbyxzKX1mdW5jdGlvbiBlcih0LGUscixuLGksYSxvLHMpe1llKHQsZSs0LDEsaSw4LGEsbyxzKSxZZShyLG4rNCwxLGksOCxhLG8scyl9ZnVuY3Rpb24gcnIoKXt0aGlzLmJhPW5ldyBvdCx0aGlzLmVjPVtdLHRoaXMuY2M9W10sdGhpcy5NYz1bXSx0aGlzLkRjPXRoaXMuTmM9dGhpcy5kYz10aGlzLmZjPTAsdGhpcy5PYT1uZXcgY3QsdGhpcy5tZW1vcnk9MCx0aGlzLkliPSJPdXRwdXRGdW5jIix0aGlzLkpiPSJPdXRwdXRBbHBoYUZ1bmMiLHRoaXMuTmQ9Ik91dHB1dFJvd0Z1bmMifWZ1bmN0aW9uIG5yKCl7dGhpcy5kYXRhPVtdLHRoaXMub2Zmc2V0PXRoaXMua2Q9dGhpcy5oYT10aGlzLnc9MCx0aGlzLm5hPVtdLHRoaXMueGE9dGhpcy5nYj10aGlzLkphPXRoaXMuU2E9dGhpcy5QPTB9ZnVuY3Rpb24gaXIoKXt0aGlzLm5jPXRoaXMuRWE9dGhpcy5iPXRoaXMuaGM9MCx0aGlzLks9W10sdGhpcy53PTB9ZnVuY3Rpb24gYXIoKXt0aGlzLnVhPTAsdGhpcy5XYT1uZXcgTSx0aGlzLnZiPW5ldyBNLHRoaXMubWQ9dGhpcy54Yz10aGlzLndjPTAsdGhpcy52Yz1bXSx0aGlzLldiPTAsdGhpcy5ZYT1uZXcgZCx0aGlzLnljPW5ldyBofWZ1bmN0aW9uIG9yKCl7dGhpcy54Yj10aGlzLmE9MCx0aGlzLmw9bmV3IEd0LHRoaXMuY2E9bmV3IG90LHRoaXMuVj1bXSx0aGlzLkJhPTAsdGhpcy5UYT1bXSx0aGlzLlVhPTAsdGhpcy5tPW5ldyBOLHRoaXMuUGI9MCx0aGlzLndkPW5ldyBOLHRoaXMuTWE9dGhpcy4kPXRoaXMuQz10aGlzLmk9dGhpcy5jPXRoaXMueGQ9MCx0aGlzLnM9bmV3IGFyLHRoaXMuYWI9MCx0aGlzLmdjPW8oNCxpciksdGhpcy5PYz0wfWZ1bmN0aW9uIHNyKCl7dGhpcy5MYz10aGlzLlo9dGhpcy4kYT10aGlzLmk9dGhpcy5jPTAsdGhpcy5sPW5ldyBHdCx0aGlzLmljPTAsdGhpcy5jYT1bXSx0aGlzLnRiPTAsdGhpcy5xZD1udWxsLHRoaXMucmQ9MH1mdW5jdGlvbiBjcih0LGUscixuLGksYSxvKXtmb3IodD1udWxsPT10PzA6dFtlKzBdLGU9MDtlPG87KytlKWlbYStlXT10K3JbbitlXSYyNTUsdD1pW2ErZV19ZnVuY3Rpb24gdXIodCxlLHIsbixpLGEsbyl7dmFyIHM7aWYobnVsbD09dCljcihudWxsLG51bGwscixuLGksYSxvKTtlbHNlIGZvcihzPTA7czxvOysrcylpW2Erc109dFtlK3NdK3JbbitzXSYyNTV9ZnVuY3Rpb24gbHIodCxlLHIsbixpLGEsbyl7aWYobnVsbD09dCljcihudWxsLG51bGwscixuLGksYSxvKTtlbHNle3ZhciBzLGM9dFtlKzBdLHU9YyxsPWM7Zm9yKHM9MDtzPG87KytzKXU9bCsoYz10W2Urc10pLXUsbD1yW24rc10rKC0yNTYmdT8wPnU/MDoyNTU6dSkmMjU1LHU9YyxpW2Erc109bH19ZnVuY3Rpb24gaHIodCxyLGksbyl7dmFyIHM9ci53aWR0aCxjPXIubztpZihlKG51bGwhPXQmJm51bGwhPXIpLDA+aXx8MD49b3x8aStvPmMpcmV0dXJuIG51bGw7aWYoIXQuQ2Mpe2lmKG51bGw9PXQuZ2Epe3ZhciB1O2lmKHQuZ2E9bmV3IHNyLCh1PW51bGw9PXQuZ2EpfHwodT1yLndpZHRoKnIubyxlKDA9PXQuR2IubGVuZ3RoKSx0LkdiPWEodSksdC5VYz0wLG51bGw9PXQuR2I/dT0wOih0Lm1iPXQuR2IsdC5uYj10LlVjLHQucmM9bnVsbCx1PTEpLHU9IXUpLCF1KXt1PXQuZ2E7dmFyIGw9dC5GYSxoPXQuUCxmPXQucWMsZD10Lm1iLHA9dC5uYixnPWgrMSxtPWYtMSxiPXUubDtpZihlKG51bGwhPWwmJm51bGwhPWQmJm51bGwhPXIpLG1pWzBdPW51bGwsbWlbMV09Y3IsbWlbMl09dXIsbWlbM109bHIsdS5jYT1kLHUudGI9cCx1LmM9ci53aWR0aCx1Lmk9ci5oZWlnaHQsZSgwPHUuYyYmMDx1LmkpLDE+PWYpcj0wO2Vsc2UgaWYodS4kYT1sW2grMF0+PjAmMyx1Llo9bFtoKzBdPj4yJjMsdS5MYz1sW2grMF0+PjQmMyxoPWxbaCswXT4+NiYzLDA+dS4kYXx8MTx1LiRhfHw0PD11Llp8fDE8dS5MY3x8aClyPTA7ZWxzZSBpZihiLnB1dD1kdCxiLmFjPWZ0LGIuYmM9cHQsYi5tYT11LGIud2lkdGg9ci53aWR0aCxiLmhlaWdodD1yLmhlaWdodCxiLkRhPXIuRGEsYi52PXIudixiLnZhPXIudmEsYi5qPXIuaixiLm89ci5vLHUuJGEpdDp7ZSgxPT11LiRhKSxyPWt0KCk7ZTpmb3IoOzspe2lmKG51bGw9PXIpe3I9MDticmVhayB0fWlmKGUobnVsbCE9dSksdS5tYz1yLHIuYz11LmMsci5pPXUuaSxyLmw9dS5sLHIubC5tYT11LHIubC53aWR0aD11LmMsci5sLmhlaWdodD11Lmksci5hPTAsdihyLm0sbCxnLG0pLCFGdCh1LmMsdS5pLDEscixudWxsKSlicmVhayBlO2lmKDE9PXIuYWImJjM9PXIuZ2NbMF0uaGMmJkF0KHIucyk/KHUuaWM9MSxsPXIuYypyLmksci5UYT1udWxsLHIuVWE9MCxyLlY9YShsKSxyLkJhPTAsbnVsbD09ci5WPyhyLmE9MSxyPTApOnI9MSk6KHUuaWM9MCxyPUl0KHIsdS5jKSksIXIpYnJlYWsgZTtyPTE7YnJlYWsgdH11Lm1jPW51bGwscj0wfWVsc2Ugcj1tPj11LmMqdS5pO3U9IXJ9aWYodSlyZXR1cm4gbnVsbDsxIT10LmdhLkxjP3QuR2E9MDpvPWMtaX1lKG51bGwhPXQuZ2EpLGUoaStvPD1jKTt0OntpZihyPShsPXQuZ2EpLmMsYz1sLmwubywwPT1sLiRhKXtpZihnPXQucmMsbT10LlZjLGI9dC5GYSxoPXQuUCsxK2kqcixmPXQubWIsZD10Lm5iK2kqcixlKGg8PXQuUCt0LnFjKSwwIT1sLlopZm9yKGUobnVsbCE9bWlbbC5aXSksdT0wO3U8bzsrK3UpbWlbbC5aXShnLG0sYixoLGYsZCxyKSxnPWYsbT1kLGQrPXIsaCs9cjtlbHNlIGZvcih1PTA7dTxvOysrdSluKGYsZCxiLGgsciksZz1mLG09ZCxkKz1yLGgrPXI7dC5yYz1nLHQuVmM9bX1lbHNle2lmKGUobnVsbCE9bC5tYykscj1pK28sZShudWxsIT0odT1sLm1jKSksZShyPD11LmkpLHUuQz49cilyPTE7ZWxzZSBpZihsLmljfHxtcigpLGwuaWMpe2w9dS5WLGc9dS5CYSxtPXUuYzt2YXIgeT11Lmksdz0oYj0xLGg9dS4kL20sZj11LiQlbSxkPXUubSxwPXUucyx1LiQpLE49bSp5LEw9bSpyLHg9cC53YyxfPXc8TD93dChwLGYsaCk6bnVsbDtlKHc8PU4pLGUocjw9eSksZShBdChwKSk7ZTpmb3IoOzspe2Zvcig7IWQuaCYmdzxMOyl7aWYoZiZ4fHwoXz13dChwLGYsaCkpLGUobnVsbCE9XyksUyhkKSwyNTY+KHk9YnQoXy5HWzBdLF8uSFswXSxkKSkpbFtnK3ddPXksKyt3LCsrZj49bSYmKGY9MCwrK2g8PXImJiEoaCUxNikmJlN0KHUsaCkpO2Vsc2V7aWYoISgyODA+eSkpe2I9MDticmVhayBlfXk9bXQoeS0yNTYsZCk7dmFyIFAsaz1idChfLkdbNF0sXy5IWzRdLGQpO2lmKFMoZCksISh3Pj0oaz12dChtLGs9bXQoayxkKSkpJiZOLXc+PXkpKXtiPTA7YnJlYWsgZX1mb3IoUD0wO1A8eTsrK1ApbFtnK3crUF09bFtnK3crUC1rXTtmb3Iodys9eSxmKz15O2Y+PW07KWYtPW0sKytoPD1yJiYhKGglMTYpJiZTdCh1LGgpO3c8TCYmZiZ4JiYoXz13dChwLGYsaCkpfWUoZC5oPT1BKGQpKX1TdCh1LGg+cj9yOmgpO2JyZWFrIGV9IWJ8fGQuaCYmdzxOPyhiPTAsdS5hPWQuaD81OjMpOnUuJD13LHI9Yn1lbHNlIHI9X3QodSx1LlYsdS5CYSx1LmMsdS5pLHIsQ3QpO2lmKCFyKXtvPTA7YnJlYWsgdH19aStvPj1jJiYodC5DYz0xKSxvPTF9aWYoIW8pcmV0dXJuIG51bGw7aWYodC5DYyYmKG51bGwhPShvPXQuZ2EpJiYoby5tYz1udWxsKSx0LmdhPW51bGwsMDx0LkdhKSlyZXR1cm4gYWxlcnQoInRvZG86V2ViUERlcXVhbnRpemVMZXZlbHMiKSxudWxsfXJldHVybiB0Lm5iK2kqc31mdW5jdGlvbiBmcih0LGUscixuLGksYSl7Zm9yKDswPGktLTspe3ZhciBvLHM9dCxjPWUrKHI/MTowKSx1PXQsbD1lKyhyPzA6Myk7Zm9yKG89MDtvPG47KytvKXt2YXIgaD11W2wrNCpvXTsyNTUhPWgmJihoKj0zMjg5NyxzW2MrNCpvKzBdPXNbYys0Km8rMF0qaD4+MjMsc1tjKzQqbysxXT1zW2MrNCpvKzFdKmg+PjIzLHNbYys0Km8rMl09c1tjKzQqbysyXSpoPj4yMyl9ZSs9YX19ZnVuY3Rpb24gZHIodCxlLHIsbixpKXtmb3IoOzA8bi0tOyl7dmFyIGE7Zm9yKGE9MDthPHI7KythKXt2YXIgbz10W2UrMiphKzBdLHM9MTUmKHU9dFtlKzIqYSsxXSksYz00MzY5KnMsdT0oMjQwJnV8dT4+NCkqYz4+MTY7dFtlKzIqYSswXT0oMjQwJm98bz4+NCkqYz4+MTYmMjQwfCgxNSZvfG88PDQpKmM+PjE2Pj40JjE1LHRbZSsyKmErMV09MjQwJnV8c31lKz1pfX1mdW5jdGlvbiBwcih0LGUscixuLGksYSxvLHMpe3ZhciBjLHUsbD0yNTU7Zm9yKHU9MDt1PGk7Kyt1KXtmb3IoYz0wO2M8bjsrK2Mpe3ZhciBoPXRbZStjXTthW28rNCpjXT1oLGwmPWh9ZSs9cixvKz1zfXJldHVybiAyNTUhPWx9ZnVuY3Rpb24gZ3IodCxlLHIsbixpKXt2YXIgYTtmb3IoYT0wO2E8aTsrK2EpcltuK2FdPXRbZSthXT4+OH1mdW5jdGlvbiBtcigpe0FuPWZyLHhuPWRyLFNuPXByLF9uPWdyfWZ1bmN0aW9uIHZyKHIsbixpKXt0W3JdPWZ1bmN0aW9uKHQscixhLG8scyxjLHUsbCxoLGYsZCxwLGcsbSx2LGIseSl7dmFyIHcsTj15LTE+PjEsTD1zW2MrMF18dVtsKzBdPDwxNixBPWhbZiswXXxkW3ArMF08PDE2O2UobnVsbCE9dCk7dmFyIHg9MypMK0ErMTMxMDc0Pj4yO2ZvcihuKHRbciswXSwyNTUmeCx4Pj4xNixnLG0pLG51bGwhPWEmJih4PTMqQStMKzEzMTA3ND4+MixuKGFbbyswXSwyNTUmeCx4Pj4xNix2LGIpKSx3PTE7dzw9TjsrK3cpe3ZhciBTPXNbYyt3XXx1W2wrd108PDE2LF89aFtmK3ddfGRbcCt3XTw8MTYsUD1MK1MrQStfKzUyNDI5NixrPVArMiooUytBKT4+Mzt4PWsrTD4+MSxMPShQPVArMiooTCtfKT4+MykrUz4+MSxuKHRbcisyKnctMV0sMjU1JngseD4+MTYsZyxtKygyKnctMSkqaSksbih0W3IrMip3LTBdLDI1NSZMLEw+PjE2LGcsbSsoMip3LTApKmkpLG51bGwhPWEmJih4PVArQT4+MSxMPWsrXz4+MSxuKGFbbysyKnctMV0sMjU1JngseD4+MTYsdixiKygyKnctMSkqaSksbihhW28rMip3KzBdLDI1NSZMLEw+PjE2LHYsYisoMip3KzApKmkpKSxMPVMsQT1ffTEmeXx8KHg9MypMK0ErMTMxMDc0Pj4yLG4odFtyK3ktMV0sMjU1JngseD4+MTYsZyxtKyh5LTEpKmkpLG51bGwhPWEmJih4PTMqQStMKzEzMTA3ND4+MixuKGFbbyt5LTFdLDI1NSZ4LHg+PjE2LHYsYisoeS0xKSppKSkpfX1mdW5jdGlvbiBicigpe3ZpW0VuXT1iaSx2aVtxbl09d2ksdmlbRG5dPXlpLHZpW1JuXT1OaSx2aVtUbl09TGksdmlbVW5dPUFpLHZpW3puXT14aSx2aVtIbl09d2ksdmlbV25dPU5pLHZpW1ZuXT1MaSx2aVtHbl09QWl9ZnVuY3Rpb24geXIodCl7cmV0dXJuIHQmfklpPzA+dD8wOjI1NTp0Pj5GaX1mdW5jdGlvbiB3cih0LGUpe3JldHVybiB5cigoMTkwNzcqdD4+OCkrKDI2MTQ5KmU+PjgpLTE0MjM0KX1mdW5jdGlvbiBOcih0LGUscil7cmV0dXJuIHlyKCgxOTA3Nyp0Pj44KS0oNjQxOSplPj44KS0oMTMzMjAqcj4+OCkrODcwOCl9ZnVuY3Rpb24gTHIodCxlKXtyZXR1cm4geXIoKDE5MDc3KnQ+PjgpKygzMzA1MCplPj44KS0xNzY4NSl9ZnVuY3Rpb24gQXIodCxlLHIsbixpKXtuW2krMF09d3IodCxyKSxuW2krMV09TnIodCxlLHIpLG5baSsyXT1Mcih0LGUpfWZ1bmN0aW9uIHhyKHQsZSxyLG4saSl7bltpKzBdPUxyKHQsZSksbltpKzFdPU5yKHQsZSxyKSxuW2krMl09d3IodCxyKX1mdW5jdGlvbiBTcih0LGUscixuLGkpe3ZhciBhPU5yKHQsZSxyKTtlPWE8PDMmMjI0fExyKHQsZSk+PjMsbltpKzBdPTI0OCZ3cih0LHIpfGE+PjUsbltpKzFdPWV9ZnVuY3Rpb24gX3IodCxlLHIsbixpKXt2YXIgYT0yNDAmTHIodCxlKXwxNTtuW2krMF09MjQwJndyKHQscil8TnIodCxlLHIpPj40LG5baSsxXT1hfWZ1bmN0aW9uIFByKHQsZSxyLG4saSl7bltpKzBdPTI1NSxBcih0LGUscixuLGkrMSl9ZnVuY3Rpb24ga3IodCxlLHIsbixpKXt4cih0LGUscixuLGkpLG5baSszXT0yNTV9ZnVuY3Rpb24gRnIodCxlLHIsbixpKXtBcih0LGUscixuLGkpLG5baSszXT0yNTV9ZnVuY3Rpb24gVnQodCxlKXtyZXR1cm4gMD50PzA6dD5lP2U6dH1mdW5jdGlvbiBJcihlLHIsbil7dFtlXT1mdW5jdGlvbih0LGUsaSxhLG8scyxjLHUsbCl7Zm9yKHZhciBoPXUrKC0yJmwpKm47dSE9aDspcih0W2UrMF0saVthKzBdLG9bcyswXSxjLHUpLHIodFtlKzFdLGlbYSswXSxvW3MrMF0sYyx1K24pLGUrPTIsKythLCsrcyx1Kz0yKm47MSZsJiZyKHRbZSswXSxpW2ErMF0sb1tzKzBdLGMsdSl9fWZ1bmN0aW9uIENyKHQsZSxyKXtyZXR1cm4gMD09cj8wPT10PzA9PWU/Njo1OjA9PWU/NDowOnJ9ZnVuY3Rpb24ganIodCxlLHIsbixpKXtzd2l0Y2godD4+PjMwKXtjYXNlIDM6b24oZSxyLG4saSwwKTticmVhaztjYXNlIDI6c24oZSxyLG4saSk7YnJlYWs7Y2FzZSAxOnVuKGUscixuLGkpfX1mdW5jdGlvbiBPcih0LGUpe3ZhciByLGEsbz1lLk0scz1lLk5iLGM9dC5vYyx1PXQucGMrNDAsbD10Lm9jLGg9dC5wYys1ODQsZj10Lm9jLGQ9dC5wYys2MDA7Zm9yKHI9MDsxNj5yOysrciljW3UrMzIqci0xXT0xMjk7Zm9yKHI9MDs4PnI7KytyKWxbaCszMipyLTFdPTEyOSxmW2QrMzIqci0xXT0xMjk7Zm9yKDA8bz9jW3UtMS0zMl09bFtoLTEtMzJdPWZbZC0xLTMyXT0xMjk6KGkoYyx1LTMyLTEsMTI3LDIxKSxpKGwsaC0zMi0xLDEyNyw5KSxpKGYsZC0zMi0xLDEyNyw5KSksYT0wO2E8dC56YTsrK2Epe3ZhciBwPWUueWFbZS5hYSthXTtpZigwPGEpe2ZvcihyPS0xOzE2PnI7KytyKW4oYyx1KzMyKnItNCxjLHUrMzIqcisxMiw0KTtmb3Iocj0tMTs4PnI7KytyKW4obCxoKzMyKnItNCxsLGgrMzIqcis0LDQpLG4oZixkKzMyKnItNCxmLGQrMzIqcis0LDQpfXZhciBnPXQuR2QsbT10LkhkK2Esdj1wLmFkLGI9cC5IYztpZigwPG8mJihuKGMsdS0zMixnW21dLnksMCwxNiksbihsLGgtMzIsZ1ttXS5mLDAsOCksbihmLGQtMzIsZ1ttXS5lYSwwLDgpKSxwLlphKXt2YXIgeT1jLHc9dS0zMisxNjtmb3IoMDxvJiYoYT49dC56YS0xP2koeSx3LGdbbV0ueVsxNV0sNCk6bih5LHcsZ1ttKzFdLnksMCw0KSkscj0wOzQ+cjtyKyspeVt3KzEyOCtyXT15W3crMjU2K3JdPXlbdyszODQrcl09eVt3KzArcl07Zm9yKHI9MDsxNj5yOysrcixiPDw9Mil5PWMsdz11K0RpW3JdLGZpW3AuT2Jbcl1dKHksdyksanIoYix2LDE2KityLHksdyl9ZWxzZSBpZih5PUNyKGEsbyxwLk9iWzBdKSxoaVt5XShjLHUpLDAhPWIpZm9yKHI9MDsxNj5yOysrcixiPDw9MilqcihiLHYsMTYqK3IsYyx1K0RpW3JdKTtmb3Iocj1wLkdjLHk9Q3IoYSxvLHAuRGQpLGRpW3ldKGwsaCksZGlbeV0oZixkKSxiPXYseT1sLHc9aCwyNTUmKHA9cj4+MCkmJigxNzAmcD9jbihiLDI1Nix5LHcpOmxuKGIsMjU2LHksdykpLHA9ZixiPWQsMjU1JihyPj49OCkmJigxNzAmcj9jbih2LDMyMCxwLGIpOmxuKHYsMzIwLHAsYikpLG88dC5VYi0xJiYobihnW21dLnksMCxjLHUrNDgwLDE2KSxuKGdbbV0uZiwwLGwsaCsyMjQsOCksbihnW21dLmVhLDAsZixkKzIyNCw4KSkscj04KnMqdC5CLGc9dC5zYSxtPXQudGErMTYqYSsxNipzKnQuUix2PXQucWEscD10LnJhKzgqYStyLGI9dC5IYSx5PXQuSWErOCphK3Iscj0wOzE2PnI7KytyKW4oZyxtK3IqdC5SLGMsdSszMipyLDE2KTtmb3Iocj0wOzg+cjsrK3Ipbih2LHArcip0LkIsbCxoKzMyKnIsOCksbihiLHkrcip0LkIsZixkKzMyKnIsOCl9fWZ1bmN0aW9uIEJyKHQsbixpLGEsbyxzLGMsdSxsKXt2YXIgaD1bMF0sZj1bMF0sZD0wLHA9bnVsbCE9bD9sLmtkOjAsZz1udWxsIT1sP2w6bmV3IG5yO2lmKG51bGw9PXR8fDEyPmkpcmV0dXJuIDc7Zy5kYXRhPXQsZy53PW4sZy5oYT1pLG49W25dLGk9W2ldLGcuZ2I9W2cuZ2JdO3Q6e3ZhciBtPW4sYj1pLHk9Zy5nYjtpZihlKG51bGwhPXQpLGUobnVsbCE9YiksZShudWxsIT15KSx5WzBdPTAsMTI8PWJbMF0mJiFyKHQsbVswXSwiUklGRiIpKXtpZihyKHQsbVswXSs4LCJXRUJQIikpe3k9MzticmVhayB0fXZhciB3PWoodCxtWzBdKzQpO2lmKDEyPnd8fDQyOTQ5NjcyODY8dyl7eT0zO2JyZWFrIHR9aWYocCYmdz5iWzBdLTgpe3k9NzticmVhayB0fXlbMF09dyxtWzBdKz0xMixiWzBdLT0xMn15PTB9aWYoMCE9eSlyZXR1cm4geTtmb3Iodz0wPGcuZ2JbMF0saT1pWzBdOzspe3Q6e3ZhciBMPXQ7Yj1uLHk9aTt2YXIgQT1oLHg9ZixTPW09WzBdO2lmKChrPWQ9W2RdKVswXT0wLDg+eVswXSl5PTc7ZWxzZXtpZighcihMLGJbMF0sIlZQOFgiKSl7aWYoMTAhPWooTCxiWzBdKzQpKXt5PTM7YnJlYWsgdH1pZigxOD55WzBdKXt5PTc7YnJlYWsgdH12YXIgXz1qKEwsYlswXSs4KSxQPTErQyhMLGJbMF0rMTIpO2lmKDIxNDc0ODM2NDg8PVAqKEw9MStDKEwsYlswXSsxNSkpKXt5PTM7YnJlYWsgdH1udWxsIT1TJiYoU1swXT1fKSxudWxsIT1BJiYoQVswXT1QKSxudWxsIT14JiYoeFswXT1MKSxiWzBdKz0xOCx5WzBdLT0xOCxrWzBdPTF9eT0wfX1pZihkPWRbMF0sbT1tWzBdLDAhPXkpcmV0dXJuIHk7aWYoYj0hISgyJm0pLCF3JiZkKXJldHVybiAzO2lmKG51bGwhPXMmJihzWzBdPSEhKDE2Jm0pKSxudWxsIT1jJiYoY1swXT1iKSxudWxsIT11JiYodVswXT0wKSxjPWhbMF0sbT1mWzBdLGQmJmImJm51bGw9PWwpe3k9MDticmVha31pZig0Pmkpe3k9NzticmVha31pZih3JiZkfHwhdyYmIWQmJiFyKHQsblswXSwiQUxQSCIpKXtpPVtpXSxnLm5hPVtnLm5hXSxnLlA9W2cuUF0sZy5TYT1bZy5TYV07dDp7Xz10LHk9bix3PWk7dmFyIGs9Zy5nYjtBPWcubmEseD1nLlAsUz1nLlNhO1A9MjIsZShudWxsIT1fKSxlKG51bGwhPXcpLEw9eVswXTt2YXIgRj13WzBdO2ZvcihlKG51bGwhPUEpLGUobnVsbCE9UyksQVswXT1udWxsLHhbMF09bnVsbCxTWzBdPTA7Oyl7aWYoeVswXT1MLHdbMF09Riw4PkYpe3k9NzticmVhayB0fXZhciBJPWooXyxMKzQpO2lmKDQyOTQ5NjcyODY8SSl7eT0zO2JyZWFrIHR9dmFyIE89OCtJKzEmLTI7aWYoUCs9TywwPGsmJlA+ayl7eT0zO2JyZWFrIHR9aWYoIXIoXyxMLCJWUDggIil8fCFyKF8sTCwiVlA4TCIpKXt5PTA7YnJlYWsgdH1pZihGWzBdPE8pe3k9NzticmVhayB0fXIoXyxMLCJBTFBIIil8fChBWzBdPV8seFswXT1MKzgsU1swXT1JKSxMKz1PLEYtPU99fWlmKGk9aVswXSxnLm5hPWcubmFbMF0sZy5QPWcuUFswXSxnLlNhPWcuU2FbMF0sMCE9eSlicmVha31pPVtpXSxnLkphPVtnLkphXSxnLnhhPVtnLnhhXTt0OmlmKGs9dCx5PW4sdz1pLEE9Zy5nYlswXSx4PWcuSmEsUz1nLnhhLF89eVswXSxMPSFyKGssXywiVlA4ICIpLFA9IXIoayxfLCJWUDhMIiksZShudWxsIT1rKSxlKG51bGwhPXcpLGUobnVsbCE9eCksZShudWxsIT1TKSw4PndbMF0peT03O2Vsc2V7aWYoTHx8UCl7aWYoaz1qKGssXys0KSwxMjw9QSYmaz5BLTEyKXt5PTM7YnJlYWsgdH1pZihwJiZrPndbMF0tOCl7eT03O2JyZWFrIHR9eFswXT1rLHlbMF0rPTgsd1swXS09OCxTWzBdPVB9ZWxzZSBTWzBdPTU8PXdbMF0mJjQ3PT1rW18rMF0mJiEoa1tfKzRdPj41KSx4WzBdPXdbMF07eT0wfWlmKGk9aVswXSxnLkphPWcuSmFbMF0sZy54YT1nLnhhWzBdLG49blswXSwwIT15KWJyZWFrO2lmKDQyOTQ5NjcyODY8Zy5KYSlyZXR1cm4gMztpZihudWxsPT11fHxifHwodVswXT1nLnhhPzI6MSksYz1bY10sbT1bbV0sZy54YSl7aWYoNT5pKXt5PTc7YnJlYWt9dT1jLHA9bSxiPXMsbnVsbD09dHx8NT5pP3Q9MDo1PD1pJiY0Nz09dFtuKzBdJiYhKHRbbis0XT4+NSk/KHc9WzBdLGs9WzBdLEE9WzBdLHYoeD1uZXcgTix0LG4saSksZ3QoeCx3LGssQSk/KG51bGwhPXUmJih1WzBdPXdbMF0pLG51bGwhPXAmJihwWzBdPWtbMF0pLG51bGwhPWImJihiWzBdPUFbMF0pLHQ9MSk6dD0wKTp0PTB9ZWxzZXtpZigxMD5pKXt5PTc7YnJlYWt9dT1tLG51bGw9PXR8fDEwPml8fCFYdCh0LG4rMyxpLTMpP3Q9MDoocD10W24rMF18dFtuKzFdPDw4fHRbbisyXTw8MTYsYj0xNjM4MyYodFtuKzddPDw4fHRbbis2XSksdD0xNjM4MyYodFtuKzldPDw4fHRbbis4XSksMSZwfHwzPChwPj4xJjcpfHwhKHA+PjQmMSl8fHA+PjU+PWcuSmF8fCFifHwhdD90PTA6KGMmJihjWzBdPWIpLHUmJih1WzBdPXQpLHQ9MSkpfWlmKCF0KXJldHVybiAzO2lmKGM9Y1swXSxtPW1bMF0sZCYmKGhbMF0hPWN8fGZbMF0hPW0pKXJldHVybiAzO251bGwhPWwmJihsWzBdPWcsbC5vZmZzZXQ9bi1sLncsZSg0Mjk0OTY3Mjg2Pm4tbC53KSxlKGwub2Zmc2V0PT1sLmhhLWkpKTticmVha31yZXR1cm4gMD09eXx8Nz09eSYmZCYmbnVsbD09bD8obnVsbCE9cyYmKHNbMF18PW51bGwhPWcubmEmJjA8Zy5uYS5sZW5ndGgpLG51bGwhPWEmJihhWzBdPWMpLG51bGwhPW8mJihvWzBdPW0pLDApOnl9ZnVuY3Rpb24gTXIodCxlLHIpe3ZhciBuPWUud2lkdGgsaT1lLmhlaWdodCxhPTAsbz0wLHM9bixjPWk7aWYoZS5EYT1udWxsIT10JiYwPHQuRGEsZS5EYSYmKHM9dC5jZCxjPXQuYmQsYT10LnYsbz10LmosMTE+cnx8KGEmPS0yLG8mPS0yKSwwPmF8fDA+b3x8MD49c3x8MD49Y3x8YStzPm58fG8rYz5pKSlyZXR1cm4gMDtpZihlLnY9YSxlLmo9byxlLnZhPWErcyxlLm89bytjLGUuVT1zLGUuVD1jLGUuZGE9bnVsbCE9dCYmMDx0LmRhLGUuZGEpe2lmKCFFKHMsYyxyPVt0LmliXSxhPVt0LmhiXSkpcmV0dXJuIDA7ZS5pYj1yWzBdLGUuaGI9YVswXX1yZXR1cm4gZS5vYj1udWxsIT10JiZ0Lm9iLGUuS2I9bnVsbD09dHx8IXQuU2QsZS5kYSYmKGUub2I9ZS5pYjwzKm4vNCYmZS5oYjwzKmkvNCxlLktiPTApLDF9ZnVuY3Rpb24gRXIodCl7aWYobnVsbD09dClyZXR1cm4gMjtpZigxMT50LlMpe3ZhciBlPXQuZi5SR0JBO2UuZmIrPSh0LmhlaWdodC0xKSplLkEsZS5BPS1lLkF9ZWxzZSBlPXQuZi5rYix0PXQuaGVpZ2h0LGUuTys9KHQtMSkqZS5mYSxlLmZhPS1lLmZhLGUuTis9KHQtMT4+MSkqZS5BYixlLkFiPS1lLkFiLGUuVys9KHQtMT4+MSkqZS5EYixlLkRiPS1lLkRiLG51bGwhPWUuRiYmKGUuSis9KHQtMSkqZS5sYixlLmxiPS1lLmxiKTtyZXR1cm4gMH1mdW5jdGlvbiBxcih0LGUscixuKXtpZihudWxsPT1ufHwwPj10fHwwPj1lKXJldHVybiAyO2lmKG51bGwhPXIpe2lmKHIuRGEpe3ZhciBpPXIuY2Qsbz1yLmJkLHM9LTImci52LGM9LTImci5qO2lmKDA+c3x8MD5jfHwwPj1pfHwwPj1vfHxzK2k+dHx8YytvPmUpcmV0dXJuIDI7dD1pLGU9b31pZihyLmRhKXtpZighRSh0LGUsaT1bci5pYl0sbz1bci5oYl0pKXJldHVybiAyO3Q9aVswXSxlPW9bMF19fW4ud2lkdGg9dCxuLmhlaWdodD1lO3Q6e3ZhciB1PW4ud2lkdGgsbD1uLmhlaWdodDtpZih0PW4uUywwPj11fHwwPj1sfHwhKHQ+PUVuJiYxMz50KSl0PTI7ZWxzZXtpZigwPj1uLlJkJiZudWxsPT1uLnNkKXtzPW89aT1lPTA7dmFyIGg9KGM9dSp6aVt0XSkqbDtpZigxMT50fHwobz0obCsxKS8yKihlPSh1KzEpLzIpLDEyPT10JiYocz0oaT11KSpsKSksbnVsbD09KGw9YShoKzIqbytzKSkpe3Q9MTticmVhayB0fW4uc2Q9bCwxMT50PygodT1uLmYuUkdCQSkuZWI9bCx1LmZiPTAsdS5BPWMsdS5zaXplPWgpOigodT1uLmYua2IpLnk9bCx1Lk89MCx1LmZhPWMsdS5GZD1oLHUuZj1sLHUuTj0wK2gsdS5BYj1lLHUuQ2Q9byx1LmVhPWwsdS5XPTAraCtvLHUuRGI9ZSx1LkVkPW8sMTI9PXQmJih1LkY9bCx1Lko9MCtoKzIqbyksdS5UYz1zLHUubGI9aSl9aWYoZT0xLGk9bi5TLG89bi53aWR0aCxzPW4uaGVpZ2h0LGk+PUVuJiYxMz5pKWlmKDExPmkpdD1uLmYuUkdCQSxlJj0oYz1NYXRoLmFicyh0LkEpKSoocy0xKStvPD10LnNpemUsZSY9Yz49byp6aVtpXSxlJj1udWxsIT10LmViO2Vsc2V7dD1uLmYua2IsYz0obysxKS8yLGg9KHMrMSkvMix1PU1hdGguYWJzKHQuZmEpO2w9TWF0aC5hYnModC5BYik7dmFyIGY9TWF0aC5hYnModC5EYiksZD1NYXRoLmFicyh0LmxiKSxwPWQqKHMtMSkrbztlJj11KihzLTEpK288PXQuRmQsZSY9bCooaC0xKStjPD10LkNkLGU9KGUmPWYqKGgtMSkrYzw9dC5FZCkmdT49byZsPj1jJmY+PWMsZSY9bnVsbCE9dC55LGUmPW51bGwhPXQuZixlJj1udWxsIT10LmVhLDEyPT1pJiYoZSY9ZD49byxlJj1wPD10LlRjLGUmPW51bGwhPXQuRil9ZWxzZSBlPTA7dD1lPzA6Mn19cmV0dXJuIDAhPXR8fG51bGwhPXImJnIuZmQmJih0PUVyKG4pKSx0fXZhciBEcj02NCxScj1bMCwxLDMsNywxNSwzMSw2MywxMjcsMjU1LDUxMSwxMDIzLDIwNDcsNDA5NSw4MTkxLDE2MzgzLDMyNzY3LDY1NTM1LDEzMTA3MSwyNjIxNDMsNTI0Mjg3LDEwNDg1NzUsMjA5NzE1MSw0MTk0MzAzLDgzODg2MDcsMTY3NzcyMTVdLFRyPTI0LFVyPTMyLHpyPTgsSHI9WzAsMCwxLDEsMiwyLDIsMiwzLDMsMywzLDMsMywzLDMsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDddO1IoIlByZWRpY3RvcjAiLCJQcmVkaWN0b3JBZGQwIiksdC5QcmVkaWN0b3IwPWZ1bmN0aW9uKCl7cmV0dXJuIDQyNzgxOTAwODB9LHQuUHJlZGljdG9yMT1mdW5jdGlvbih0KXtyZXR1cm4gdH0sdC5QcmVkaWN0b3IyPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gZVtyKzBdfSx0LlByZWRpY3RvcjM9ZnVuY3Rpb24odCxlLHIpe3JldHVybiBlW3IrMV19LHQuUHJlZGljdG9yND1mdW5jdGlvbih0LGUscil7cmV0dXJuIGVbci0xXX0sdC5QcmVkaWN0b3I1PWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gVShVKHQsZVtyKzFdKSxlW3IrMF0pfSx0LlByZWRpY3RvcjY9ZnVuY3Rpb24odCxlLHIpe3JldHVybiBVKHQsZVtyLTFdKX0sdC5QcmVkaWN0b3I3PWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gVSh0LGVbciswXSl9LHQuUHJlZGljdG9yOD1mdW5jdGlvbih0LGUscil7cmV0dXJuIFUoZVtyLTFdLGVbciswXSl9LHQuUHJlZGljdG9yOT1mdW5jdGlvbih0LGUscil7cmV0dXJuIFUoZVtyKzBdLGVbcisxXSl9LHQuUHJlZGljdG9yMTA9ZnVuY3Rpb24odCxlLHIpe3JldHVybiBVKFUodCxlW3ItMV0pLFUoZVtyKzBdLGVbcisxXSkpfSx0LlByZWRpY3RvcjExPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1lW3IrMF07cmV0dXJuIDA+PVcobj4+MjQmMjU1LHQ+PjI0JjI1NSwoZT1lW3ItMV0pPj4yNCYyNTUpK1cobj4+MTYmMjU1LHQ+PjE2JjI1NSxlPj4xNiYyNTUpK1cobj4+OCYyNTUsdD4+OCYyNTUsZT4+OCYyNTUpK1coMjU1Jm4sMjU1JnQsMjU1JmUpP246dH0sdC5QcmVkaWN0b3IxMj1mdW5jdGlvbih0LGUscil7dmFyIG49ZVtyKzBdO3JldHVybih6KCh0Pj4yNCYyNTUpKyhuPj4yNCYyNTUpLSgoZT1lW3ItMV0pPj4yNCYyNTUpKTw8MjR8eigodD4+MTYmMjU1KSsobj4+MTYmMjU1KS0oZT4+MTYmMjU1KSk8PDE2fHooKHQ+PjgmMjU1KSsobj4+OCYyNTUpLShlPj44JjI1NSkpPDw4fHooKDI1NSZ0KSsoMjU1Jm4pLSgyNTUmZSkpKT4+PjB9LHQuUHJlZGljdG9yMTM9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPWVbci0xXTtyZXR1cm4oSCgodD1VKHQsZVtyKzBdKSk+PjI0JjI1NSxuPj4yNCYyNTUpPDwyNHxIKHQ+PjE2JjI1NSxuPj4xNiYyNTUpPDwxNnxIKHQ+PjgmMjU1LG4+PjgmMjU1KTw8OHxIKHQ+PjAmMjU1LG4+PjAmMjU1KSk+Pj4wfTt2YXIgV3I9dC5QcmVkaWN0b3JBZGQwO3QuUHJlZGljdG9yQWRkMT1WLFIoIlByZWRpY3RvcjIiLCJQcmVkaWN0b3JBZGQyIiksUigiUHJlZGljdG9yMyIsIlByZWRpY3RvckFkZDMiKSxSKCJQcmVkaWN0b3I0IiwiUHJlZGljdG9yQWRkNCIpLFIoIlByZWRpY3RvcjUiLCJQcmVkaWN0b3JBZGQ1IiksUigiUHJlZGljdG9yNiIsIlByZWRpY3RvckFkZDYiKSxSKCJQcmVkaWN0b3I3IiwiUHJlZGljdG9yQWRkNyIpLFIoIlByZWRpY3RvcjgiLCJQcmVkaWN0b3JBZGQ4IiksUigiUHJlZGljdG9yOSIsIlByZWRpY3RvckFkZDkiKSxSKCJQcmVkaWN0b3IxMCIsIlByZWRpY3RvckFkZDEwIiksUigiUHJlZGljdG9yMTEiLCJQcmVkaWN0b3JBZGQxMSIpLFIoIlByZWRpY3RvcjEyIiwiUHJlZGljdG9yQWRkMTIiKSxSKCJQcmVkaWN0b3IxMyIsIlByZWRpY3RvckFkZDEzIik7dmFyIFZyPXQuUHJlZGljdG9yQWRkMjtYKCJDb2xvckluZGV4SW52ZXJzZVRyYW5zZm9ybSIsIk1hcEFSR0IiLCIzMmIiLChmdW5jdGlvbih0KXtyZXR1cm4gdD4+OCYyNTV9KSwoZnVuY3Rpb24odCl7cmV0dXJuIHR9KSksWCgiVlA4TENvbG9ySW5kZXhJbnZlcnNlVHJhbnNmb3JtQWxwaGEiLCJNYXBBbHBoYSIsIjhiIiwoZnVuY3Rpb24odCl7cmV0dXJuIHR9KSwoZnVuY3Rpb24odCl7cmV0dXJuIHQ+PjgmMjU1fSkpO3ZhciBHcixZcj10LkNvbG9ySW5kZXhJbnZlcnNlVHJhbnNmb3JtLEpyPXQuTWFwQVJHQixYcj10LlZQOExDb2xvckluZGV4SW52ZXJzZVRyYW5zZm9ybUFscGhhLEtyPXQuTWFwQWxwaGEsWnI9dC5WUDhMUHJlZGljdG9yc0FkZD1bXTtaci5sZW5ndGg9MTYsKHQuVlA4TFByZWRpY3RvcnM9W10pLmxlbmd0aD0xNiwodC5WUDhMUHJlZGljdG9yc0FkZF9DPVtdKS5sZW5ndGg9MTYsKHQuVlA4TFByZWRpY3RvcnNfQz1bXSkubGVuZ3RoPTE2O3ZhciAkcixRcix0bixlbixybixubixhbixvbixzbixjbix1bixsbixobixmbixkbixwbixnbixtbix2bixibix5bix3bixObixMbixBbix4bixTbixfbixQbj1hKDUxMSksa249YSgyMDQxKSxGbj1hKDIyNSksSW49YSg3NjcpLENuPTAsam49a24sT249Rm4sQm49SW4sTW49UG4sRW49MCxxbj0xLERuPTIsUm49MyxUbj00LFVuPTUsem49NixIbj03LFduPTgsVm49OSxHbj0xMCxZbj1bMiwzLDddLEpuPVszLDMsMTFdLFhuPVsyODAsMjU2LDI1NiwyNTYsNDBdLEtuPVswLDEsMSwxLDBdLFpuPVsxNywxOCwwLDEsMiwzLDQsNSwxNiw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1XSwkbj1bMjQsNywyMywyNSw0MCw2LDM5LDQxLDIyLDI2LDM4LDQyLDU2LDUsNTUsNTcsMjEsMjcsNTQsNTgsMzcsNDMsNzIsNCw3MSw3MywyMCwyOCw1Myw1OSw3MCw3NCwzNiw0NCw4OCw2OSw3NSw1Miw2MCwzLDg3LDg5LDE5LDI5LDg2LDkwLDM1LDQ1LDY4LDc2LDg1LDkxLDUxLDYxLDEwNCwyLDEwMywxMDUsMTgsMzAsMTAyLDEwNiwzNCw0Niw4NCw5Miw2Nyw3NywxMDEsMTA3LDUwLDYyLDEyMCwxLDExOSwxMjEsODMsOTMsMTcsMzEsMTAwLDEwOCw2Niw3OCwxMTgsMTIyLDMzLDQ3LDExNywxMjMsNDksNjMsOTksMTA5LDgyLDk0LDAsMTE2LDEyNCw2NSw3OSwxNiwzMiw5OCwxMTAsNDgsMTE1LDEyNSw4MSw5NSw2NCwxMTQsMTI2LDk3LDExMSw4MCwxMTMsMTI3LDk2LDExMl0sUW49WzI5NTQsMjk1NiwyOTU4LDI5NjIsMjk3MCwyOTg2LDMwMTgsMzA4MiwzMjEyLDM0NjgsMzk4MCw1MDA0XSx0aT04LGVpPVs0LDUsNiw3LDgsOSwxMCwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxNywxOCwxOSwyMCwyMCwyMSwyMSwyMiwyMiwyMywyMywyNCwyNSwyNSwyNiwyNywyOCwyOSwzMCwzMSwzMiwzMywzNCwzNSwzNiwzNywzNywzOCwzOSw0MCw0MSw0Miw0Myw0NCw0NSw0Niw0Niw0Nyw0OCw0OSw1MCw1MSw1Miw1Myw1NCw1NSw1Niw1Nyw1OCw1OSw2MCw2MSw2Miw2Myw2NCw2NSw2Niw2Nyw2OCw2OSw3MCw3MSw3Miw3Myw3NCw3NSw3Niw3Niw3Nyw3OCw3OSw4MCw4MSw4Miw4Myw4NCw4NSw4Niw4Nyw4OCw4OSw5MSw5Myw5NSw5Niw5OCwxMDAsMTAxLDEwMiwxMDQsMTA2LDEwOCwxMTAsMTEyLDExNCwxMTYsMTE4LDEyMiwxMjQsMTI2LDEyOCwxMzAsMTMyLDEzNCwxMzYsMTM4LDE0MCwxNDMsMTQ1LDE0OCwxNTEsMTU0LDE1N10scmk9WzQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LDI2LDI3LDI4LDI5LDMwLDMxLDMyLDMzLDM0LDM1LDM2LDM3LDM4LDM5LDQwLDQxLDQyLDQzLDQ0LDQ1LDQ2LDQ3LDQ4LDQ5LDUwLDUxLDUyLDUzLDU0LDU1LDU2LDU3LDU4LDYwLDYyLDY0LDY2LDY4LDcwLDcyLDc0LDc2LDc4LDgwLDgyLDg0LDg2LDg4LDkwLDkyLDk0LDk2LDk4LDEwMCwxMDIsMTA0LDEwNiwxMDgsMTEwLDExMiwxMTQsMTE2LDExOSwxMjIsMTI1LDEyOCwxMzEsMTM0LDEzNywxNDAsMTQzLDE0NiwxNDksMTUyLDE1NSwxNTgsMTYxLDE2NCwxNjcsMTcwLDE3MywxNzcsMTgxLDE4NSwxODksMTkzLDE5NywyMDEsMjA1LDIwOSwyMTMsMjE3LDIyMSwyMjUsMjI5LDIzNCwyMzksMjQ1LDI0OSwyNTQsMjU5LDI2NCwyNjksMjc0LDI3OSwyODRdLG5pPW51bGwsaWk9W1sxNzMsMTQ4LDE0MCwwXSxbMTc2LDE1NSwxNDAsMTM1LDBdLFsxODAsMTU3LDE0MSwxMzQsMTMwLDBdLFsyNTQsMjU0LDI0MywyMzAsMTk2LDE3NywxNTMsMTQwLDEzMywxMzAsMTI5LDBdXSxhaT1bMCwxLDQsOCw1LDIsMyw2LDksMTIsMTMsMTAsNywxMSwxNCwxNV0sb2k9Wy0wLDEsLTEsMiwtMiwzLDQsNiwtMyw1LC00LC01LC02LDcsLTcsOCwtOCwtOV0sc2k9W1tbWzEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjhdLFsxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4XSxbMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOF1dLFtbMjUzLDEzNiwyNTQsMjU1LDIyOCwyMTksMTI4LDEyOCwxMjgsMTI4LDEyOF0sWzE4OSwxMjksMjQyLDI1NSwyMjcsMjEzLDI1NSwyMTksMTI4LDEyOCwxMjhdLFsxMDYsMTI2LDIyNywyNTIsMjE0LDIwOSwyNTUsMjU1LDEyOCwxMjgsMTI4XV0sW1sxLDk4LDI0OCwyNTUsMjM2LDIyNiwyNTUsMjU1LDEyOCwxMjgsMTI4XSxbMTgxLDEzMywyMzgsMjU0LDIyMSwyMzQsMjU1LDE1NCwxMjgsMTI4LDEyOF0sWzc4LDEzNCwyMDIsMjQ3LDE5OCwxODAsMjU1LDIxOSwxMjgsMTI4LDEyOF1dLFtbMSwxODUsMjQ5LDI1NSwyNDMsMjU1LDEyOCwxMjgsMTI4LDEyOCwxMjhdLFsxODQsMTUwLDI0NywyNTUsMjM2LDIyNCwxMjgsMTI4LDEyOCwxMjgsMTI4XSxbNzcsMTEwLDIxNiwyNTUsMjM2LDIzMCwxMjgsMTI4LDEyOCwxMjgsMTI4XV0sW1sxLDEwMSwyNTEsMjU1LDI0MSwyNTUsMTI4LDEyOCwxMjgsMTI4LDEyOF0sWzE3MCwxMzksMjQxLDI1MiwyMzYsMjA5LDI1NSwyNTUsMTI4LDEyOCwxMjhdLFszNywxMTYsMTk2LDI0MywyMjgsMjU1LDI1NSwyNTUsMTI4LDEyOCwxMjhdXSxbWzEsMjA0LDI1NCwyNTUsMjQ1LDI1NSwxMjgsMTI4LDEyOCwxMjgsMTI4XSxbMjA3LDE2MCwyNTAsMjU1LDIzOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOF0sWzEwMiwxMDMsMjMxLDI1NSwyMTEsMTcxLDEyOCwxMjgsMTI4LDEyOCwxMjhdXSxbWzEsMTUyLDI1MiwyNTUsMjQwLDI1NSwxMjgsMTI4LDEyOCwxMjgsMTI4XSxbMTc3LDEzNSwyNDMsMjU1LDIzNCwyMjUsMTI4LDEyOCwxMjgsMTI4LDEyOF0sWzgwLDEyOSwyMTEsMjU1LDE5NCwyMjQsMTI4LDEyOCwxMjgsMTI4LDEyOF1dLFtbMSwxLDI1NSwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4XSxbMjQ2LDEsMjU1LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjhdLFsyNTUsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4XV1dLFtbWzE5OCwzNSwyMzcsMjIzLDE5MywxODcsMTYyLDE2MCwxNDUsMTU1LDYyXSxbMTMxLDQ1LDE5OCwyMjEsMTcyLDE3NiwyMjAsMTU3LDI1MiwyMjEsMV0sWzY4LDQ3LDE0NiwyMDgsMTQ5LDE2NywyMjEsMTYyLDI1NSwyMjMsMTI4XV0sW1sxLDE0OSwyNDEsMjU1LDIyMSwyMjQsMjU1LDI1NSwxMjgsMTI4LDEyOF0sWzE4NCwxNDEsMjM0LDI1MywyMjIsMjIwLDI1NSwxOTksMTI4LDEyOCwxMjhdLFs4MSw5OSwxODEsMjQyLDE3NiwxOTAsMjQ5LDIwMiwyNTUsMjU1LDEyOF1dLFtbMSwxMjksMjMyLDI1MywyMTQsMTk3LDI0MiwxOTYsMjU1LDI1NSwxMjhdLFs5OSwxMjEsMjEwLDI1MCwyMDEsMTk4LDI1NSwyMDIsMTI4LDEyOCwxMjhdLFsyMyw5MSwxNjMsMjQyLDE3MCwxODcsMjQ3LDIxMCwyNTUsMjU1LDEyOF1dLFtbMSwyMDAsMjQ2LDI1NSwyMzQsMjU1LDEyOCwxMjgsMTI4LDEyOCwxMjhdLFsxMDksMTc4LDI0MSwyNTUsMjMxLDI0NSwyNTUsMjU1LDEyOCwxMjgsMTI4XSxbNDQsMTMwLDIwMSwyNTMsMjA1LDE5MiwyNTUsMjU1LDEyOCwxMjgsMTI4XV0sW1sxLDEzMiwyMzksMjUxLDIxOSwyMDksMjU1LDE2NSwxMjgsMTI4LDEyOF0sWzk0LDEzNiwyMjUsMjUxLDIxOCwxOTAsMjU1LDI1NSwxMjgsMTI4LDEyOF0sWzIyLDEwMCwxNzQsMjQ1LDE4NiwxNjEsMjU1LDE5OSwxMjgsMTI4LDEyOF1dLFtbMSwxODIsMjQ5LDI1NSwyMzIsMjM1LDEyOCwxMjgsMTI4LDEyOCwxMjhdLFsxMjQsMTQzLDI0MSwyNTUsMjI3LDIzNCwxMjgsMTI4LDEyOCwxMjgsMTI4XSxbMzUsNzcsMTgxLDI1MSwxOTMsMjExLDI1NSwyMDUsMTI4LDEyOCwxMjhdXSxbWzEsMTU3LDI0NywyNTUsMjM2LDIzMSwyNTUsMjU1LDEyOCwxMjgsMTI4XSxbMTIxLDE0MSwyMzUsMjU1LDIyNSwyMjcsMjU1LDI1NSwxMjgsMTI4LDEyOF0sWzQ1LDk5LDE4OCwyNTEsMTk1LDIxNywyNTUsMjI0LDEyOCwxMjgsMTI4XV0sW1sxLDEsMjUxLDI1NSwyMTMsMjU1LDEyOCwxMjgsMTI4LDEyOCwxMjhdLFsyMDMsMSwyNDgsMjU1LDI1NSwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOF0sWzEzNywxLDE3NywyNTUsMjI0LDI1NSwxMjgsMTI4LDEyOCwxMjgsMTI4XV1dLFtbWzI1Myw5LDI0OCwyNTEsMjA3LDIwOCwyNTUsMTkyLDEyOCwxMjgsMTI4XSxbMTc1LDEzLDIyNCwyNDMsMTkzLDE4NSwyNDksMTk4LDI1NSwyNTUsMTI4XSxbNzMsMTcsMTcxLDIyMSwxNjEsMTc5LDIzNiwxNjcsMjU1LDIzNCwxMjhdXSxbWzEsOTUsMjQ3LDI1MywyMTIsMTgzLDI1NSwyNTUsMTI4LDEyOCwxMjhdLFsyMzksOTAsMjQ0LDI1MCwyMTEsMjA5LDI1NSwyNTUsMTI4LDEyOCwxMjhdLFsxNTUsNzcsMTk1LDI0OCwxODgsMTk1LDI1NSwyNTUsMTI4LDEyOCwxMjhdXSxbWzEsMjQsMjM5LDI1MSwyMTgsMjE5LDI1NSwyMDUsMTI4LDEyOCwxMjhdLFsyMDEsNTEsMjE5LDI1NSwxOTYsMTg2LDEyOCwxMjgsMTI4LDEyOCwxMjhdLFs2OSw0NiwxOTAsMjM5LDIwMSwyMTgsMjU1LDIyOCwxMjgsMTI4LDEyOF1dLFtbMSwxOTEsMjUxLDI1NSwyNTUsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjhdLFsyMjMsMTY1LDI0OSwyNTUsMjEzLDI1NSwxMjgsMTI4LDEyOCwxMjgsMTI4XSxbMTQxLDEyNCwyNDgsMjU1LDI1NSwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOF1dLFtbMSwxNiwyNDgsMjU1LDI1NSwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOF0sWzE5MCwzNiwyMzAsMjU1LDIzNiwyNTUsMTI4LDEyOCwxMjgsMTI4LDEyOF0sWzE0OSwxLDI1NSwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4XV0sW1sxLDIyNiwyNTUsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOF0sWzI0NywxOTIsMjU1LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjhdLFsyNDAsMTI4LDI1NSwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4XV0sW1sxLDEzNCwyNTIsMjU1LDI1NSwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOF0sWzIxMyw2MiwyNTAsMjU1LDI1NSwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOF0sWzU1LDkzLDI1NSwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4XV0sW1sxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4XSxbMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOF0sWzEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjhdXV0sW1tbMjAyLDI0LDIxMywyMzUsMTg2LDE5MSwyMjAsMTYwLDI0MCwxNzUsMjU1XSxbMTI2LDM4LDE4MiwyMzIsMTY5LDE4NCwyMjgsMTc0LDI1NSwxODcsMTI4XSxbNjEsNDYsMTM4LDIxOSwxNTEsMTc4LDI0MCwxNzAsMjU1LDIxNiwxMjhdXSxbWzEsMTEyLDIzMCwyNTAsMTk5LDE5MSwyNDcsMTU5LDI1NSwyNTUsMTI4XSxbMTY2LDEwOSwyMjgsMjUyLDIxMSwyMTUsMjU1LDE3NCwxMjgsMTI4LDEyOF0sWzM5LDc3LDE2MiwyMzIsMTcyLDE4MCwyNDUsMTc4LDI1NSwyNTUsMTI4XV0sW1sxLDUyLDIyMCwyNDYsMTk4LDE5OSwyNDksMjIwLDI1NSwyNTUsMTI4XSxbMTI0LDc0LDE5MSwyNDMsMTgzLDE5MywyNTAsMjIxLDI1NSwyNTUsMTI4XSxbMjQsNzEsMTMwLDIxOSwxNTQsMTcwLDI0MywxODIsMjU1LDI1NSwxMjhdXSxbWzEsMTgyLDIyNSwyNDksMjE5LDI0MCwyNTUsMjI0LDEyOCwxMjgsMTI4XSxbMTQ5LDE1MCwyMjYsMjUyLDIxNiwyMDUsMjU1LDE3MSwxMjgsMTI4LDEyOF0sWzI4LDEwOCwxNzAsMjQyLDE4MywxOTQsMjU0LDIyMywyNTUsMjU1LDEyOF1dLFtbMSw4MSwyMzAsMjUyLDIwNCwyMDMsMjU1LDE5MiwxMjgsMTI4LDEyOF0sWzEyMywxMDIsMjA5LDI0NywxODgsMTk2LDI1NSwyMzMsMTI4LDEyOCwxMjhdLFsyMCw5NSwxNTMsMjQzLDE2NCwxNzMsMjU1LDIwMywxMjgsMTI4LDEyOF1dLFtbMSwyMjIsMjQ4LDI1NSwyMTYsMjEzLDEyOCwxMjgsMTI4LDEyOCwxMjhdLFsxNjgsMTc1LDI0NiwyNTIsMjM1LDIwNSwyNTUsMjU1LDEyOCwxMjgsMTI4XSxbNDcsMTE2LDIxNSwyNTUsMjExLDIxMiwyNTUsMjU1LDEyOCwxMjgsMTI4XV0sW1sxLDEyMSwyMzYsMjUzLDIxMiwyMTQsMjU1LDI1NSwxMjgsMTI4LDEyOF0sWzE0MSw4NCwyMTMsMjUyLDIwMSwyMDIsMjU1LDIxOSwxMjgsMTI4LDEyOF0sWzQyLDgwLDE2MCwyNDAsMTYyLDE4NSwyNTUsMjA1LDEyOCwxMjgsMTI4XV0sW1sxLDEsMjU1LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjhdLFsyNDQsMSwyNTUsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOF0sWzIzOCwxLDI1NSwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4XV1dXSxjaT1bW1syMzEsMTIwLDQ4LDg5LDExNSwxMTMsMTIwLDE1MiwxMTJdLFsxNTIsMTc5LDY0LDEyNiwxNzAsMTE4LDQ2LDcwLDk1XSxbMTc1LDY5LDE0Myw4MCw4NSw4Miw3MiwxNTUsMTAzXSxbNTYsNTgsMTAsMTcxLDIxOCwxODksMTcsMTMsMTUyXSxbMTE0LDI2LDE3LDE2Myw0NCwxOTUsMjEsMTAsMTczXSxbMTIxLDI0LDgwLDE5NSwyNiw2Miw0NCw2NCw4NV0sWzE0NCw3MSwxMCwzOCwxNzEsMjEzLDE0NCwzNCwyNl0sWzE3MCw0Niw1NSwxOSwxMzYsMTYwLDMzLDIwNiw3MV0sWzYzLDIwLDgsMTE0LDExNCwyMDgsMTIsOSwyMjZdLFs4MSw0MCwxMSw5NiwxODIsODQsMjksMTYsMzZdXSxbWzEzNCwxODMsODksMTM3LDk4LDEwMSwxMDYsMTY1LDE0OF0sWzcyLDE4NywxMDAsMTMwLDE1NywxMTEsMzIsNzUsODBdLFs2NiwxMDIsMTY3LDk5LDc0LDYyLDQwLDIzNCwxMjhdLFs0MSw1Myw5LDE3OCwyNDEsMTQxLDI2LDgsMTA3XSxbNzQsNDMsMjYsMTQ2LDczLDE2Niw0OSwyMywxNTddLFs2NSwzOCwxMDUsMTYwLDUxLDUyLDMxLDExNSwxMjhdLFsxMDQsNzksMTIsMjcsMjE3LDI1NSw4NywxNyw3XSxbODcsNjgsNzEsNDQsMTE0LDUxLDE1LDE4NiwyM10sWzQ3LDQxLDE0LDExMCwxODIsMTgzLDIxLDE3LDE5NF0sWzY2LDQ1LDI1LDEwMiwxOTcsMTg5LDIzLDE4LDIyXV0sW1s4OCw4OCwxNDcsMTUwLDQyLDQ2LDQ1LDE5NiwyMDVdLFs0Myw5NywxODMsMTE3LDg1LDM4LDM1LDE3OSw2MV0sWzM5LDUzLDIwMCw4NywyNiwyMSw0MywyMzIsMTcxXSxbNTYsMzQsNTEsMTA0LDExNCwxMDIsMjksOTMsNzddLFszOSwyOCw4NSwxNzEsNTgsMTY1LDkwLDk4LDY0XSxbMzQsMjIsMTE2LDIwNiwyMywzNCw0MywxNjYsNzNdLFsxMDcsNTQsMzIsMjYsNTEsMSw4MSw0MywzMV0sWzY4LDI1LDEwNiwyMiw2NCwxNzEsMzYsMjI1LDExNF0sWzM0LDE5LDIxLDEwMiwxMzIsMTg4LDE2LDc2LDEyNF0sWzYyLDE4LDc4LDk1LDg1LDU3LDUwLDQ4LDUxXV0sW1sxOTMsMTAxLDM1LDE1OSwyMTUsMTExLDg5LDQ2LDExMV0sWzYwLDE0OCwzMSwxNzIsMjE5LDIyOCwyMSwxOCwxMTFdLFsxMTIsMTEzLDc3LDg1LDE3OSwyNTUsMzgsMTIwLDExNF0sWzQwLDQyLDEsMTk2LDI0NSwyMDksMTAsMjUsMTA5XSxbODgsNDMsMjksMTQwLDE2NiwyMTMsMzcsNDMsMTU0XSxbNjEsNjMsMzAsMTU1LDY3LDQ1LDY4LDEsMjA5XSxbMTAwLDgwLDgsNDMsMTU0LDEsNTEsMjYsNzFdLFsxNDIsNzgsNzgsMTYsMjU1LDEyOCwzNCwxOTcsMTcxXSxbNDEsNDAsNSwxMDIsMjExLDE4Myw0LDEsMjIxXSxbNTEsNTAsMTcsMTY4LDIwOSwxOTIsMjMsMjUsODJdXSxbWzEzOCwzMSwzNiwxNzEsMjcsMTY2LDM4LDQ0LDIyOV0sWzY3LDg3LDU4LDE2OSw4MiwxMTUsMjYsNTksMTc5XSxbNjMsNTksOTAsMTgwLDU5LDE2Niw5Myw3MywxNTRdLFs0MCw0MCwyMSwxMTYsMTQzLDIwOSwzNCwzOSwxNzVdLFs0NywxNSwxNiwxODMsMzQsMjIzLDQ5LDQ1LDE4M10sWzQ2LDE3LDMzLDE4Myw2LDk4LDE1LDMyLDE4M10sWzU3LDQ2LDIyLDI0LDEyOCwxLDU0LDE3LDM3XSxbNjUsMzIsNzMsMTE1LDI4LDEyOCwyMywxMjgsMjA1XSxbNDAsMyw5LDExNSw1MSwxOTIsMTgsNiwyMjNdLFs4NywzNyw5LDExNSw1OSw3Nyw2NCwyMSw0N11dLFtbMTA0LDU1LDQ0LDIxOCw5LDU0LDUzLDEzMCwyMjZdLFs2NCw5MCw3MCwyMDUsNDAsNDEsMjMsMjYsNTddLFs1NCw1NywxMTIsMTg0LDUsNDEsMzgsMTY2LDIxM10sWzMwLDM0LDI2LDEzMywxNTIsMTE2LDEwLDMyLDEzNF0sWzM5LDE5LDUzLDIyMSwyNiwxMTQsMzIsNzMsMjU1XSxbMzEsOSw2NSwyMzQsMiwxNSwxLDExOCw3M10sWzc1LDMyLDEyLDUxLDE5MiwyNTUsMTYwLDQzLDUxXSxbODgsMzEsMzUsNjcsMTAyLDg1LDU1LDE4Niw4NV0sWzU2LDIxLDIzLDExMSw1OSwyMDUsNDUsMzcsMTkyXSxbNTUsMzgsNzAsMTI0LDczLDEwMiwxLDM0LDk4XV0sW1sxMjUsOTgsNDIsODgsMTA0LDg1LDExNywxNzUsODJdLFs5NSw4NCw1Myw4OSwxMjgsMTAwLDExMywxMDEsNDVdLFs3NSw3OSwxMjMsNDcsNTEsMTI4LDgxLDE3MSwxXSxbNTcsMTcsNSw3MSwxMDIsNTcsNTMsNDEsNDldLFszOCwzMywxMywxMjEsNTcsNzMsMjYsMSw4NV0sWzQxLDEwLDY3LDEzOCw3NywxMTAsOTAsNDcsMTE0XSxbMTE1LDIxLDIsMTAsMTAyLDI1NSwxNjYsMjMsNl0sWzEwMSwyOSwxNiwxMCw4NSwxMjgsMTAxLDE5NiwyNl0sWzU3LDE4LDEwLDEwMiwxMDIsMjEzLDM0LDIwLDQzXSxbMTE3LDIwLDE1LDM2LDE2MywxMjgsNjgsMSwyNl1dLFtbMTAyLDYxLDcxLDM3LDM0LDUzLDMxLDI0MywxOTJdLFs2OSw2MCw3MSwzOCw3MywxMTksMjgsMjIyLDM3XSxbNjgsNDUsMTI4LDM0LDEsNDcsMTEsMjQ1LDE3MV0sWzYyLDE3LDE5LDcwLDE0Niw4NSw1NSw2Miw3MF0sWzM3LDQzLDM3LDE1NCwxMDAsMTYzLDg1LDE2MCwxXSxbNjMsOSw5MiwxMzYsMjgsNjQsMzIsMjAxLDg1XSxbNzUsMTUsOSw5LDY0LDI1NSwxODQsMTE5LDE2XSxbODYsNiwyOCw1LDY0LDI1NSwyNSwyNDgsMV0sWzU2LDgsMTcsMTMyLDEzNywyNTUsNTUsMTE2LDEyOF0sWzU4LDE1LDIwLDgyLDEzNSw1NywyNiwxMjEsNDBdXSxbWzE2NCw1MCwzMSwxMzcsMTU0LDEzMywyNSwzNSwyMThdLFs1MSwxMDMsNDQsMTMxLDEzMSwxMjMsMzEsNiwxNThdLFs4Niw0MCw2NCwxMzUsMTQ4LDIyNCw0NSwxODMsMTI4XSxbMjIsMjYsMTcsMTMxLDI0MCwxNTQsMTQsMSwyMDldLFs0NSwxNiwyMSw5MSw2NCwyMjIsNywxLDE5N10sWzU2LDIxLDM5LDE1NSw2MCwxMzgsMjMsMTAyLDIxM10sWzgzLDEyLDEzLDU0LDE5MiwyNTUsNjgsNDcsMjhdLFs4NSwyNiw4NSw4NSwxMjgsMTI4LDMyLDE0NiwxNzFdLFsxOCwxMSw3LDYzLDE0NCwxNzEsNCw0LDI0Nl0sWzM1LDI3LDEwLDE0NiwxNzQsMTcxLDEyLDI2LDEyOF1dLFtbMTkwLDgwLDM1LDk5LDE4MCw4MCwxMjYsNTQsNDVdLFs4NSwxMjYsNDcsODcsMTc2LDUxLDQxLDIwLDMyXSxbMTAxLDc1LDEyOCwxMzksMTE4LDE0NiwxMTYsMTI4LDg1XSxbNTYsNDEsMTUsMTc2LDIzNiw4NSwzNyw5LDYyXSxbNzEsMzAsMTcsMTE5LDExOCwyNTUsMTcsMTgsMTM4XSxbMTAxLDM4LDYwLDEzOCw1NSw3MCw0MywyNiwxNDJdLFsxNDYsMzYsMTksMzAsMTcxLDI1NSw5NywyNywyMF0sWzEzOCw0NSw2MSw2MiwyMTksMSw4MSwxODgsNjRdLFszMiw0MSwyMCwxMTcsMTUxLDE0MiwyMCwyMSwxNjNdLFsxMTIsMTksMTIsNjEsMTk1LDEyOCw0OCw0LDI0XV1dLHVpPVtbW1syNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XSxbMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV0sWzI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdXSxbWzE3NiwyNDYsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdLFsyMjMsMjQxLDI1MiwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XSxbMjQ5LDI1MywyNTMsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV1dLFtbMjU1LDI0NCwyNTIsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV0sWzIzNCwyNTQsMjU0LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdLFsyNTMsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XV0sW1syNTUsMjQ2LDI1NCwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XSxbMjM5LDI1MywyNTQsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV0sWzI1NCwyNTUsMjU0LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdXSxbWzI1NSwyNDgsMjU0LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdLFsyNTEsMjU1LDI1NCwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XSxbMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV1dLFtbMjU1LDI1MywyNTQsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV0sWzI1MSwyNTQsMjU0LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdLFsyNTQsMjU1LDI1NCwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XV0sW1syNTUsMjU0LDI1MywyNTUsMjU0LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XSxbMjUwLDI1NSwyNTQsMjU1LDI1NCwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV0sWzI1NCwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdXSxbWzI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdLFsyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XSxbMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV1dXSxbW1syMTcsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XSxbMjI1LDI1MiwyNDEsMjUzLDI1NSwyNTUsMjU0LDI1NSwyNTUsMjU1LDI1NV0sWzIzNCwyNTAsMjQxLDI1MCwyNTMsMjU1LDI1MywyNTQsMjU1LDI1NSwyNTVdXSxbWzI1NSwyNTQsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdLFsyMjMsMjU0LDI1NCwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XSxbMjM4LDI1MywyNTQsMjU0LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV1dLFtbMjU1LDI0OCwyNTQsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV0sWzI0OSwyNTQsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdLFsyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XV0sW1syNTUsMjUzLDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XSxbMjQ3LDI1NCwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV0sWzI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdXSxbWzI1NSwyNTMsMjU0LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdLFsyNTIsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XSxbMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV1dLFtbMjU1LDI1NCwyNTQsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV0sWzI1MywyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdLFsyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XV0sW1syNTUsMjU0LDI1MywyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XSxbMjUwLDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV0sWzI1NCwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdXSxbWzI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdLFsyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XSxbMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV1dXSxbW1sxODYsMjUxLDI1MCwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XSxbMjM0LDI1MSwyNDQsMjU0LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV0sWzI1MSwyNTEsMjQzLDI1MywyNTQsMjU1LDI1NCwyNTUsMjU1LDI1NSwyNTVdXSxbWzI1NSwyNTMsMjU0LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdLFsyMzYsMjUzLDI1NCwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XSxbMjUxLDI1MywyNTMsMjU0LDI1NCwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV1dLFtbMjU1LDI1NCwyNTQsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV0sWzI1NCwyNTQsMjU0LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdLFsyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XV0sW1syNTUsMjU0LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XSxbMjU0LDI1NCwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV0sWzI1NCwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdXSxbWzI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdLFsyNTQsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XSxbMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV1dLFtbMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV0sWzI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdLFsyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XV0sW1syNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XSxbMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV0sWzI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdXSxbWzI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdLFsyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XSxbMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV1dXSxbW1syNDgsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XSxbMjUwLDI1NCwyNTIsMjU0LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV0sWzI0OCwyNTQsMjQ5LDI1MywyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdXSxbWzI1NSwyNTMsMjUzLDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdLFsyNDYsMjUzLDI1MywyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XSxbMjUyLDI1NCwyNTEsMjU0LDI1NCwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV1dLFtbMjU1LDI1NCwyNTIsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV0sWzI0OCwyNTQsMjUzLDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdLFsyNTMsMjU1LDI1NCwyNTQsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XV0sW1syNTUsMjUxLDI1NCwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XSxbMjQ1LDI1MSwyNTQsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV0sWzI1MywyNTMsMjU0LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdXSxbWzI1NSwyNTEsMjUzLDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdLFsyNTIsMjUzLDI1NCwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XSxbMjU1LDI1NCwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV1dLFtbMjU1LDI1MiwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV0sWzI0OSwyNTUsMjU0LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdLFsyNTUsMjU1LDI1NCwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XV0sW1syNTUsMjU1LDI1MywyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XSxbMjUwLDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV0sWzI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdXSxbWzI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdLFsyNTQsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XSxbMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV1dXV0sbGk9WzAsMSwyLDMsNiw0LDUsNiw2LDYsNiw2LDYsNiw2LDcsMF0saGk9W10sZmk9W10sZGk9W10scGk9MSxnaT0yLG1pPVtdLHZpPVtdO3ZyKCJVcHNhbXBsZVJnYkxpbmVQYWlyIixBciwzKSx2cigiVXBzYW1wbGVCZ3JMaW5lUGFpciIseHIsMyksdnIoIlVwc2FtcGxlUmdiYUxpbmVQYWlyIixGciw0KSx2cigiVXBzYW1wbGVCZ3JhTGluZVBhaXIiLGtyLDQpLHZyKCJVcHNhbXBsZUFyZ2JMaW5lUGFpciIsUHIsNCksdnIoIlVwc2FtcGxlUmdiYTQ0NDRMaW5lUGFpciIsX3IsMiksdnIoIlVwc2FtcGxlUmdiNTY1TGluZVBhaXIiLFNyLDIpO3ZhciBiaT10LlVwc2FtcGxlUmdiTGluZVBhaXIseWk9dC5VcHNhbXBsZUJnckxpbmVQYWlyLHdpPXQuVXBzYW1wbGVSZ2JhTGluZVBhaXIsTmk9dC5VcHNhbXBsZUJncmFMaW5lUGFpcixMaT10LlVwc2FtcGxlQXJnYkxpbmVQYWlyLEFpPXQuVXBzYW1wbGVSZ2JhNDQ0NExpbmVQYWlyLHhpPXQuVXBzYW1wbGVSZ2I1NjVMaW5lUGFpcixTaT0xNixfaT0xPDxTaS0xLFBpPS0yMjcsa2k9NDgyLEZpPTYsSWk9KDI1Njw8RmkpLTEsQ2k9MCxqaT1hKDI1NiksT2k9YSgyNTYpLEJpPWEoMjU2KSxNaT1hKDI1NiksRWk9YShraS1QaSkscWk9YShraS1QaSk7SXIoIll1dlRvUmdiUm93IixBciwzKSxJcigiWXV2VG9CZ3JSb3ciLHhyLDMpLElyKCJZdXZUb1JnYmFSb3ciLEZyLDQpLElyKCJZdXZUb0JncmFSb3ciLGtyLDQpLElyKCJZdXZUb0FyZ2JSb3ciLFByLDQpLElyKCJZdXZUb1JnYmE0NDQ0Um93IixfciwyKSxJcigiWXV2VG9SZ2I1NjVSb3ciLFNyLDIpO3ZhciBEaT1bMCw0LDgsMTIsMTI4LDEzMiwxMzYsMTQwLDI1NiwyNjAsMjY0LDI2OCwzODQsMzg4LDM5MiwzOTZdLFJpPVswLDIsOF0sVGk9WzgsNyw2LDQsNCwyLDIsMiwxLDEsMSwxXSxVaT0xO3RoaXMuV2ViUERlY29kZVJHQkE9ZnVuY3Rpb24odCxyLG4saSxhKXt2YXIgbz1xbixzPW5ldyBycixjPW5ldyBvdDtzLmJhPWMsYy5TPW8sYy53aWR0aD1bYy53aWR0aF0sYy5oZWlnaHQ9W2MuaGVpZ2h0XTt2YXIgdT1jLndpZHRoLGw9Yy5oZWlnaHQsaD1uZXcgc3Q7aWYobnVsbD09aHx8bnVsbD09dCl2YXIgZj0yO2Vsc2UgZShudWxsIT1oKSxmPUJyKHQscixuLGgud2lkdGgsaC5oZWlnaHQsaC5QZCxoLlFkLGguZm9ybWF0LG51bGwpO2lmKDAhPWY/dT0wOihudWxsIT11JiYodVswXT1oLndpZHRoWzBdKSxudWxsIT1sJiYobFswXT1oLmhlaWdodFswXSksdT0xKSx1KXtjLndpZHRoPWMud2lkdGhbMF0sYy5oZWlnaHQ9Yy5oZWlnaHRbMF0sbnVsbCE9aSYmKGlbMF09Yy53aWR0aCksbnVsbCE9YSYmKGFbMF09Yy5oZWlnaHQpO3Q6e2lmKGk9bmV3IEd0LChhPW5ldyBucikuZGF0YT10LGEudz1yLGEuaGE9bixhLmtkPTEscj1bMF0sZShudWxsIT1hKSwoMD09KHQ9QnIoYS5kYXRhLGEudyxhLmhhLG51bGwsbnVsbCxudWxsLHIsbnVsbCxhKSl8fDc9PXQpJiZyWzBdJiYodD00KSwwPT0ocj10KSl7aWYoZShudWxsIT1zKSxpLmRhdGE9YS5kYXRhLGkudz1hLncrYS5vZmZzZXQsaS5oYT1hLmhhLWEub2Zmc2V0LGkucHV0PWR0LGkuYWM9ZnQsaS5iYz1wdCxpLm1hPXMsYS54YSl7aWYobnVsbD09KHQ9a3QoKSkpe3M9MTticmVhayB0fWlmKGZ1bmN0aW9uKHQscil7dmFyIG49WzBdLGk9WzBdLGE9WzBdO2U6Zm9yKDs7KXtpZihudWxsPT10KXJldHVybiAwO2lmKG51bGw9PXIpcmV0dXJuIHQuYT0yLDA7aWYodC5sPXIsdC5hPTAsdih0Lm0sci5kYXRhLHIudyxyLmhhKSwhZ3QodC5tLG4saSxhKSl7dC5hPTM7YnJlYWsgZX1pZih0LnhiPWdpLHIud2lkdGg9blswXSxyLmhlaWdodD1pWzBdLCFGdChuWzBdLGlbMF0sMSx0LG51bGwpKWJyZWFrIGU7cmV0dXJuIDF9cmV0dXJuIGUoMCE9dC5hKSwwfSh0LGkpKXtpZihpPTA9PShyPXFyKGkud2lkdGgsaS5oZWlnaHQscy5PYSxzLmJhKSkpe2U6e2k9dDtyOmZvcig7Oyl7aWYobnVsbD09aSl7aT0wO2JyZWFrIGV9aWYoZShudWxsIT1pLnMueWMpLGUobnVsbCE9aS5zLllhKSxlKDA8aS5zLldiKSxlKG51bGwhPShuPWkubCkpLGUobnVsbCE9KGE9bi5tYSkpLDAhPWkueGIpe2lmKGkuY2E9YS5iYSxpLnRiPWEudGIsZShudWxsIT1pLmNhKSwhTXIoYS5PYSxuLFJuKSl7aS5hPTI7YnJlYWsgcn1pZighSXQoaSxuLndpZHRoKSlicmVhayByO2lmKG4uZGEpYnJlYWsgcjtpZigobi5kYXx8bnQoaS5jYS5TKSkmJm1yKCksMTE+aS5jYS5TfHwoYWxlcnQoInRvZG86V2ViUEluaXRDb252ZXJ0QVJHQlRvWVVWIiksbnVsbCE9aS5jYS5mLmtiLkYmJm1yKCkpLGkuUGImJjA8aS5zLnVhJiZudWxsPT1pLnMudmIuWCYmIU8oaS5zLnZiLGkucy5XYS5YYSkpe2kuYT0xO2JyZWFrIHJ9aS54Yj0wfWlmKCFfdChpLGkuVixpLkJhLGkuYyxpLmksbi5vLEx0KSlicmVhayByO2EuRGM9aS5NYSxpPTE7YnJlYWsgZX1lKDAhPWkuYSksaT0wfWk9IWl9aSYmKHI9dC5hKX1lbHNlIHI9dC5hfWVsc2V7aWYobnVsbD09KHQ9bmV3IFl0KSl7cz0xO2JyZWFrIHR9aWYodC5GYT1hLm5hLHQuUD1hLlAsdC5xYz1hLlNhLEt0KHQsaSkpe2lmKDA9PShyPXFyKGkud2lkdGgsaS5oZWlnaHQscy5PYSxzLmJhKSkpe2lmKHQuQWE9MCxuPXMuT2EsZShudWxsIT0oYT10KSksbnVsbCE9bil7aWYoMDwodT0wPih1PW4uTWQpPzA6MTAwPHU/MjU1OjI1NSp1LzEwMCkpe2ZvcihsPWg9MDs0Pmw7KytsKTEyPihmPWEucGJbbF0pLmxjJiYoZi5pYT11KlRpWzA+Zi5sYz8wOmYubGNdPj4zKSxofD1mLmlhO2gmJihhbGVydCgidG9kbzpWUDhJbml0UmFuZG9tIiksYS5pYT0xKX1hLkdhPW4uSWQsMTAwPGEuR2E/YS5HYT0xMDA6MD5hLkdhJiYoYS5HYT0wKX1RdCh0LGkpfHwocj10LmEpfX1lbHNlIHI9dC5hfTA9PXImJm51bGwhPXMuT2EmJnMuT2EuZmQmJihyPUVyKHMuYmEpKX1zPXJ9bz0wIT1zP251bGw6MTE+bz9jLmYuUkdCQS5lYjpjLmYua2IueX1lbHNlIG89bnVsbDtyZXR1cm4gb307dmFyIHppPVszLDQsMyw0LDQsMiwyLDQsNCw0LDIsMSwxXX07ZnVuY3Rpb24gdSh0LGUpe2Zvcih2YXIgcj0iIixuPTA7bjw0O24rKylyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHRbZSsrXSk7cmV0dXJuIHJ9ZnVuY3Rpb24gbCh0LGUpe3JldHVybih0W2UrMF08PDB8dFtlKzFdPDw4fHRbZSsyXTw8MTYpPj4+MH1mdW5jdGlvbiBoKHQsZSl7cmV0dXJuKHRbZSswXTw8MHx0W2UrMV08PDh8dFtlKzJdPDwxNnx0W2UrM108PDI0KT4+PjB9bmV3IGM7dmFyIGY9WzBdLGQ9WzBdLHA9W10sZz1uZXcgYyxtPXQsdj1mdW5jdGlvbih0LGUpe3ZhciByPXt9LG49MCxpPSExLGE9MCxvPTA7aWYoci5mcmFtZXM9W10sIQovKiogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAxNyBEb21pbmlrIEhvbWJlcmdlcgogICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KICAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KICAgIGh0dHBzOi8vd2VicGpzLmFwcHNwb3QuY29tCiAgICBXZWJQUmlmZlBhcnNlciBkb21pbmlraGxiZ0BnbWFpbC5jb20KICAgICovCmZ1bmN0aW9uKHQsZSxyLG4pe2Zvcih2YXIgaT0wO2k8bjtpKyspaWYodFtlK2ldIT1yLmNoYXJDb2RlQXQoaSkpcmV0dXJuITA7cmV0dXJuITF9KHQsZSwiUklGRiIsNCkpe3ZhciBzLGM7aCh0LGUrPTQpO2ZvcihlKz04O2U8dC5sZW5ndGg7KXt2YXIgZj11KHQsZSksZD1oKHQsZSs9NCk7ZSs9NDt2YXIgcD1kKygxJmQpO3N3aXRjaChmKXtjYXNlIlZQOCAiOmNhc2UiVlA4TCI6dm9pZCAwPT09ci5mcmFtZXNbbl0mJihyLmZyYW1lc1tuXT17fSk7KHY9ci5mcmFtZXNbbl0pLnNyY19vZmY9aT9vOmUtOCx2LnNyY19zaXplPWErZCs4LG4rKyxpJiYoaT0hMSxhPTAsbz0wKTticmVhaztjYXNlIlZQOFgiOih2PXIuaGVhZGVyPXt9KS5mZWF0dXJlX2ZsYWdzPXRbZV07dmFyIGc9ZSs0O3YuY2FudmFzX3dpZHRoPTErbCh0LGcpO2crPTM7di5jYW52YXNfaGVpZ2h0PTErbCh0LGcpO2crPTM7YnJlYWs7Y2FzZSJBTFBIIjppPSEwLGE9cCs4LG89ZS04O2JyZWFrO2Nhc2UiQU5JTSI6KHY9ci5oZWFkZXIpLmJnY29sb3I9aCh0LGUpO2c9ZSs0O3YubG9vcF9jb3VudD0ocz10KVsoYz1nKSswXTw8MHxzW2MrMV08PDg7Zys9MjticmVhaztjYXNlIkFOTUYiOnZhciBtLHY7KHY9ci5mcmFtZXNbbl09e30pLm9mZnNldF94PTIqbCh0LGUpLGUrPTMsdi5vZmZzZXRfeT0yKmwodCxlKSxlKz0zLHYud2lkdGg9MStsKHQsZSksZSs9Myx2LmhlaWdodD0xK2wodCxlKSxlKz0zLHYuZHVyYXRpb249bCh0LGUpLGUrPTMsbT10W2UrK10sdi5kaXNwb3NlPTEmbSx2LmJsZW5kPW0+PjEmMX0iQU5NRiIhPWYmJihlKz1wKX1yZXR1cm4gcn19KG0sMCk7di5yZXNwb25zZT1tLHYucmdiYW91dHB1dD0hMCx2LmRhdGF1cmw9ITE7dmFyIGI9di5oZWFkZXI/di5oZWFkZXI6bnVsbCx5PXYuZnJhbWVzP3YuZnJhbWVzOm51bGw7aWYoYil7Yi5sb29wX2NvdW50ZXI9Yi5sb29wX2NvdW50LGY9W2IuY2FudmFzX2hlaWdodF0sZD1bYi5jYW52YXNfd2lkdGhdO2Zvcih2YXIgdz0wO3c8eS5sZW5ndGgmJjAhPXlbd10uYmxlbmQ7dysrKTt9dmFyIE49eVswXSxMPWcuV2ViUERlY29kZVJHQkEobSxOLnNyY19vZmYsTi5zcmNfc2l6ZSxkLGYpO04ucmdiYT1MLE4uaW1nd2lkdGg9ZFswXSxOLmltZ2hlaWdodD1mWzBdO2Zvcih2YXIgQT0wO0E8ZFswXSpmWzBdKjQ7QSsrKXBbQV09TFtBXTtyZXR1cm4gdGhpcy53aWR0aD1kLHRoaXMuaGVpZ2h0PWYsdGhpcy5kYXRhPXAsdGhpc30hZnVuY3Rpb24odCl7dmFyIGU9ZnVuY3Rpb24oKXtyZXR1cm4hMH0scj1mdW5jdGlvbihlLHIsaSx1KXt2YXIgbD00LGg9bztzd2l0Y2godSl7Y2FzZSB0LmltYWdlX2NvbXByZXNzaW9uLkZBU1Q6bD0xLGg9YTticmVhaztjYXNlIHQuaW1hZ2VfY29tcHJlc3Npb24uTUVESVVNOmw9NixoPXM7YnJlYWs7Y2FzZSB0LmltYWdlX2NvbXByZXNzaW9uLlNMT1c6bD05LGg9Y312YXIgZj1fZShlPW4oZSxyLGksaCkse2xldmVsOmx9KTtyZXR1cm4gdC5fX2FkZGltYWdlX18uYXJyYXlCdWZmZXJUb0JpbmFyeVN0cmluZyhmKX0sbj1mdW5jdGlvbih0LGUscixuKXtmb3IodmFyIGksYSxvLHM9dC5sZW5ndGgvZSxjPW5ldyBVaW50OEFycmF5KHQubGVuZ3RoK3MpLHU9bCgpLGY9MDtmPHM7Zis9MSl7aWYobz1mKmUsaT10LnN1YmFycmF5KG8sbytlKSxuKWMuc2V0KG4oaSxyLGEpLG8rZik7ZWxzZXtmb3IodmFyIGQscD11Lmxlbmd0aCxnPVtdO2Q8cDtkKz0xKWdbZF09dVtkXShpLHIsYSk7dmFyIG09aChnLmNvbmNhdCgpKTtjLnNldChnW21dLG8rZil9YT1pfXJldHVybiBjfSxpPWZ1bmN0aW9uKHQpe3ZhciBlPUFycmF5LmFwcGx5KFtdLHQpO3JldHVybiBlLnVuc2hpZnQoMCksZX0sYT1mdW5jdGlvbih0LGUpe3ZhciByLG49W10saT10Lmxlbmd0aDtuWzBdPTE7Zm9yKHZhciBhPTA7YTxpO2ErPTEpcj10W2EtZV18fDAsblthKzFdPXRbYV0tcisyNTYmMjU1O3JldHVybiBufSxvPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbixpPVtdLGE9dC5sZW5ndGg7aVswXT0yO2Zvcih2YXIgbz0wO288YTtvKz0xKW49ciYmcltvXXx8MCxpW28rMV09dFtvXS1uKzI1NiYyNTU7cmV0dXJuIGl9LHM9ZnVuY3Rpb24odCxlLHIpe3ZhciBuLGksYT1bXSxvPXQubGVuZ3RoO2FbMF09Mztmb3IodmFyIHM9MDtzPG87cys9MSluPXRbcy1lXXx8MCxpPXImJnJbc118fDAsYVtzKzFdPXRbc10rMjU2LShuK2k+Pj4xKSYyNTU7cmV0dXJuIGF9LGM9ZnVuY3Rpb24odCxlLHIpe3ZhciBuLGksYSxvLHM9W10sYz10Lmxlbmd0aDtzWzBdPTQ7Zm9yKHZhciBsPTA7bDxjO2wrPTEpbj10W2wtZV18fDAsaT1yJiZyW2xdfHwwLGE9ciYmcltsLWVdfHwwLG89dShuLGksYSksc1tsKzFdPXRbbF0tbysyNTYmMjU1O3JldHVybiBzfSx1PWZ1bmN0aW9uKHQsZSxyKXtpZih0PT09ZSYmZT09PXIpcmV0dXJuIHQ7dmFyIG49TWF0aC5hYnMoZS1yKSxpPU1hdGguYWJzKHQtciksYT1NYXRoLmFicyh0K2Utci1yKTtyZXR1cm4gbjw9aSYmbjw9YT90Omk8PWE/ZTpyfSxsPWZ1bmN0aW9uKCl7cmV0dXJuW2ksYSxvLHMsY119LGg9ZnVuY3Rpb24odCl7dmFyIGU9dC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LnJlZHVjZSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdCtNYXRoLmFicyhlKX0pLDApfSkpO3JldHVybiBlLmluZGV4T2YoTWF0aC5taW4uYXBwbHkobnVsbCxlKSl9O3QucHJvY2Vzc1BORz1mdW5jdGlvbihuLGksYSxvKXt2YXIgcyxjLHUsbCxoLGYsZCxwLGcsbSx2LGIseSx3LE4sTD10aGlzLmRlY29kZS5GTEFURV9ERUNPREUsQT0iIjtpZih0aGlzLl9fYWRkaW1hZ2VfXy5pc0FycmF5QnVmZmVyKG4pJiYobj1uZXcgVWludDhBcnJheShuKSksdGhpcy5fX2FkZGltYWdlX18uaXNBcnJheUJ1ZmZlclZpZXcobikpe2lmKG49KHU9bmV3IE9lKG4pKS5pbWdEYXRhLGM9dS5iaXRzLHM9dS5jb2xvclNwYWNlLGg9dS5jb2xvcnMsLTEhPT1bNCw2XS5pbmRleE9mKHUuY29sb3JUeXBlKSl7aWYoOD09PXUuYml0cyl7Zz0ocD0zMj09dS5waXhlbEJpdGxlbmd0aD9uZXcgVWludDMyQXJyYXkodS5kZWNvZGVQaXhlbHMoKS5idWZmZXIpOjE2PT11LnBpeGVsQml0bGVuZ3RoP25ldyBVaW50MTZBcnJheSh1LmRlY29kZVBpeGVscygpLmJ1ZmZlcik6bmV3IFVpbnQ4QXJyYXkodS5kZWNvZGVQaXhlbHMoKS5idWZmZXIpKS5sZW5ndGgsdj1uZXcgVWludDhBcnJheShnKnUuY29sb3JzKSxtPW5ldyBVaW50OEFycmF5KGcpO3ZhciB4LFM9dS5waXhlbEJpdGxlbmd0aC11LmJpdHM7Zm9yKHc9MCxOPTA7dzxnO3crKyl7Zm9yKHk9cFt3XSx4PTA7eDxTOyl2W04rK109eT4+PngmMjU1LHgrPXUuYml0czttW3ddPXk+Pj54JjI1NX19aWYoMTY9PT11LmJpdHMpe2c9KHA9bmV3IFVpbnQzMkFycmF5KHUuZGVjb2RlUGl4ZWxzKCkuYnVmZmVyKSkubGVuZ3RoLHY9bmV3IFVpbnQ4QXJyYXkoZyooMzIvdS5waXhlbEJpdGxlbmd0aCkqdS5jb2xvcnMpLG09bmV3IFVpbnQ4QXJyYXkoZyooMzIvdS5waXhlbEJpdGxlbmd0aCkpLGI9dS5jb2xvcnM+MSx3PTAsTj0wO2Zvcih2YXIgXz0wO3c8ZzspeT1wW3crK10sdltOKytdPXk+Pj4wJjI1NSxiJiYodltOKytdPXk+Pj4xNiYyNTUseT1wW3crK10sdltOKytdPXk+Pj4wJjI1NSksbVtfKytdPXk+Pj4xNiYyNTU7Yz04fW8hPT10LmltYWdlX2NvbXByZXNzaW9uLk5PTkUmJmUoKT8obj1yKHYsdS53aWR0aCp1LmNvbG9ycyx1LmNvbG9ycyxvKSxkPXIobSx1LndpZHRoLDEsbykpOihuPXYsZD1tLEw9dm9pZCAwKX1pZigzPT09dS5jb2xvclR5cGUmJihzPXRoaXMuY29sb3Jfc3BhY2VzLklOREVYRUQsZj11LnBhbGV0dGUsdS50cmFuc3BhcmVuY3kuaW5kZXhlZCkpe3ZhciBQPXUudHJhbnNwYXJlbmN5LmluZGV4ZWQsaz0wO2Zvcih3PTAsZz1QLmxlbmd0aDt3PGc7Kyt3KWsrPVBbd107aWYoKGsvPTI1NSk9PT1nLTEmJi0xIT09UC5pbmRleE9mKDApKWw9W1AuaW5kZXhPZigwKV07ZWxzZSBpZihrIT09Zyl7Zm9yKHA9dS5kZWNvZGVQaXhlbHMoKSxtPW5ldyBVaW50OEFycmF5KHAubGVuZ3RoKSx3PTAsZz1wLmxlbmd0aDt3PGc7dysrKW1bd109UFtwW3ddXTtkPXIobSx1LndpZHRoLDEpfX12YXIgRj1mdW5jdGlvbihlKXt2YXIgcjtzd2l0Y2goZSl7Y2FzZSB0LmltYWdlX2NvbXByZXNzaW9uLkZBU1Q6cj0xMTticmVhaztjYXNlIHQuaW1hZ2VfY29tcHJlc3Npb24uTUVESVVNOnI9MTM7YnJlYWs7Y2FzZSB0LmltYWdlX2NvbXByZXNzaW9uLlNMT1c6cj0xNDticmVhaztkZWZhdWx0OnI9MTJ9cmV0dXJuIHJ9KG8pO3JldHVybiBMPT09dGhpcy5kZWNvZGUuRkxBVEVfREVDT0RFJiYoQT0iL1ByZWRpY3RvciAiK0YrIiAiKSxBKz0iL0NvbG9ycyAiK2grIiAvQml0c1BlckNvbXBvbmVudCAiK2MrIiAvQ29sdW1ucyAiK3Uud2lkdGgsKHRoaXMuX19hZGRpbWFnZV9fLmlzQXJyYXlCdWZmZXIobil8fHRoaXMuX19hZGRpbWFnZV9fLmlzQXJyYXlCdWZmZXJWaWV3KG4pKSYmKG49dGhpcy5fX2FkZGltYWdlX18uYXJyYXlCdWZmZXJUb0JpbmFyeVN0cmluZyhuKSksKGQmJnRoaXMuX19hZGRpbWFnZV9fLmlzQXJyYXlCdWZmZXIoZCl8fHRoaXMuX19hZGRpbWFnZV9fLmlzQXJyYXlCdWZmZXJWaWV3KGQpKSYmKGQ9dGhpcy5fX2FkZGltYWdlX18uYXJyYXlCdWZmZXJUb0JpbmFyeVN0cmluZyhkKSkse2FsaWFzOmEsZGF0YTpuLGluZGV4OmksZmlsdGVyOkwsZGVjb2RlUGFyYW1ldGVyczpBLHRyYW5zcGFyZW5jeTpsLHBhbGV0dGU6ZixzTWFzazpkLHByZWRpY3RvcjpGLHdpZHRoOnUud2lkdGgsaGVpZ2h0OnUuaGVpZ2h0LGJpdHNQZXJDb21wb25lbnQ6Yyxjb2xvclNwYWNlOnN9fX19KE0uQVBJKSxmdW5jdGlvbih0KXt0LnByb2Nlc3NHSUY4OUE9ZnVuY3Rpb24oZSxyLG4saSl7dmFyIGE9bmV3IEJlKGUpLG89YS53aWR0aCxzPWEuaGVpZ2h0LGM9W107YS5kZWNvZGVBbmRCbGl0RnJhbWVSR0JBKDAsYyk7dmFyIHU9e2RhdGE6Yyx3aWR0aDpvLGhlaWdodDpzfSxsPW5ldyBFZSgxMDApLmVuY29kZSh1LDEwMCk7cmV0dXJuIHQucHJvY2Vzc0pQRUcuY2FsbCh0aGlzLGwscixuLGkpfSx0LnByb2Nlc3NHSUY4N0E9dC5wcm9jZXNzR0lGODlBfShNLkFQSSkscWUucHJvdG90eXBlLnBhcnNlSGVhZGVyPWZ1bmN0aW9uKCl7aWYodGhpcy5maWxlU2l6ZT10aGlzLmRhdGF2LmdldFVpbnQzMih0aGlzLnBvcywhMCksdGhpcy5wb3MrPTQsdGhpcy5yZXNlcnZlZD10aGlzLmRhdGF2LmdldFVpbnQzMih0aGlzLnBvcywhMCksdGhpcy5wb3MrPTQsdGhpcy5vZmZzZXQ9dGhpcy5kYXRhdi5nZXRVaW50MzIodGhpcy5wb3MsITApLHRoaXMucG9zKz00LHRoaXMuaGVhZGVyU2l6ZT10aGlzLmRhdGF2LmdldFVpbnQzMih0aGlzLnBvcywhMCksdGhpcy5wb3MrPTQsdGhpcy53aWR0aD10aGlzLmRhdGF2LmdldFVpbnQzMih0aGlzLnBvcywhMCksdGhpcy5wb3MrPTQsdGhpcy5oZWlnaHQ9dGhpcy5kYXRhdi5nZXRJbnQzMih0aGlzLnBvcywhMCksdGhpcy5wb3MrPTQsdGhpcy5wbGFuZXM9dGhpcy5kYXRhdi5nZXRVaW50MTYodGhpcy5wb3MsITApLHRoaXMucG9zKz0yLHRoaXMuYml0UFA9dGhpcy5kYXRhdi5nZXRVaW50MTYodGhpcy5wb3MsITApLHRoaXMucG9zKz0yLHRoaXMuY29tcHJlc3M9dGhpcy5kYXRhdi5nZXRVaW50MzIodGhpcy5wb3MsITApLHRoaXMucG9zKz00LHRoaXMucmF3U2l6ZT10aGlzLmRhdGF2LmdldFVpbnQzMih0aGlzLnBvcywhMCksdGhpcy5wb3MrPTQsdGhpcy5ocj10aGlzLmRhdGF2LmdldFVpbnQzMih0aGlzLnBvcywhMCksdGhpcy5wb3MrPTQsdGhpcy52cj10aGlzLmRhdGF2LmdldFVpbnQzMih0aGlzLnBvcywhMCksdGhpcy5wb3MrPTQsdGhpcy5jb2xvcnM9dGhpcy5kYXRhdi5nZXRVaW50MzIodGhpcy5wb3MsITApLHRoaXMucG9zKz00LHRoaXMuaW1wb3J0YW50Q29sb3JzPXRoaXMuZGF0YXYuZ2V0VWludDMyKHRoaXMucG9zLCEwKSx0aGlzLnBvcys9NCwxNj09PXRoaXMuYml0UFAmJnRoaXMuaXNfd2l0aF9hbHBoYSYmKHRoaXMuYml0UFA9MTUpLHRoaXMuYml0UFA8MTUpe3ZhciB0PTA9PT10aGlzLmNvbG9ycz8xPDx0aGlzLmJpdFBQOnRoaXMuY29sb3JzO3RoaXMucGFsZXR0ZT1uZXcgQXJyYXkodCk7Zm9yKHZhciBlPTA7ZTx0O2UrKyl7dmFyIHI9dGhpcy5kYXRhdi5nZXRVaW50OCh0aGlzLnBvcysrLCEwKSxuPXRoaXMuZGF0YXYuZ2V0VWludDgodGhpcy5wb3MrKywhMCksaT10aGlzLmRhdGF2LmdldFVpbnQ4KHRoaXMucG9zKyssITApLGE9dGhpcy5kYXRhdi5nZXRVaW50OCh0aGlzLnBvcysrLCEwKTt0aGlzLnBhbGV0dGVbZV09e3JlZDppLGdyZWVuOm4sYmx1ZTpyLHF1YWQ6YX19fXRoaXMuaGVpZ2h0PDAmJih0aGlzLmhlaWdodCo9LTEsdGhpcy5ib3R0b21fdXA9ITEpfSxxZS5wcm90b3R5cGUucGFyc2VCR1I9ZnVuY3Rpb24oKXt0aGlzLnBvcz10aGlzLm9mZnNldDt0cnl7dmFyIHQ9ImJpdCIrdGhpcy5iaXRQUCxlPXRoaXMud2lkdGgqdGhpcy5oZWlnaHQqNDt0aGlzLmRhdGE9bmV3IFVpbnQ4QXJyYXkoZSksdGhpc1t0XSgpfWNhdGNoKHQpe2kubG9nKCJiaXQgZGVjb2RlIGVycm9yOiIrdCl9fSxxZS5wcm90b3R5cGUuYml0MT1mdW5jdGlvbigpe3ZhciB0LGU9TWF0aC5jZWlsKHRoaXMud2lkdGgvOCkscj1lJTQ7Zm9yKHQ9dGhpcy5oZWlnaHQtMTt0Pj0wO3QtLSl7Zm9yKHZhciBuPXRoaXMuYm90dG9tX3VwP3Q6dGhpcy5oZWlnaHQtMS10LGk9MDtpPGU7aSsrKWZvcih2YXIgYT10aGlzLmRhdGF2LmdldFVpbnQ4KHRoaXMucG9zKyssITApLG89bip0aGlzLndpZHRoKjQrOCppKjQscz0wO3M8OCYmOCppK3M8dGhpcy53aWR0aDtzKyspe3ZhciBjPXRoaXMucGFsZXR0ZVthPj43LXMmMV07dGhpcy5kYXRhW28rNCpzXT1jLmJsdWUsdGhpcy5kYXRhW28rNCpzKzFdPWMuZ3JlZW4sdGhpcy5kYXRhW28rNCpzKzJdPWMucmVkLHRoaXMuZGF0YVtvKzQqcyszXT0yNTV9MCE9PXImJih0aGlzLnBvcys9NC1yKX19LHFlLnByb3RvdHlwZS5iaXQ0PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PU1hdGguY2VpbCh0aGlzLndpZHRoLzIpLGU9dCU0LHI9dGhpcy5oZWlnaHQtMTtyPj0wO3ItLSl7Zm9yKHZhciBuPXRoaXMuYm90dG9tX3VwP3I6dGhpcy5oZWlnaHQtMS1yLGk9MDtpPHQ7aSsrKXt2YXIgYT10aGlzLmRhdGF2LmdldFVpbnQ4KHRoaXMucG9zKyssITApLG89bip0aGlzLndpZHRoKjQrMippKjQscz1hPj40LGM9MTUmYSx1PXRoaXMucGFsZXR0ZVtzXTtpZih0aGlzLmRhdGFbb109dS5ibHVlLHRoaXMuZGF0YVtvKzFdPXUuZ3JlZW4sdGhpcy5kYXRhW28rMl09dS5yZWQsdGhpcy5kYXRhW28rM109MjU1LDIqaSsxPj10aGlzLndpZHRoKWJyZWFrO3U9dGhpcy5wYWxldHRlW2NdLHRoaXMuZGF0YVtvKzRdPXUuYmx1ZSx0aGlzLmRhdGFbbys0KzFdPXUuZ3JlZW4sdGhpcy5kYXRhW28rNCsyXT11LnJlZCx0aGlzLmRhdGFbbys0KzNdPTI1NX0wIT09ZSYmKHRoaXMucG9zKz00LWUpfX0scWUucHJvdG90eXBlLmJpdDg9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy53aWR0aCU0LGU9dGhpcy5oZWlnaHQtMTtlPj0wO2UtLSl7Zm9yKHZhciByPXRoaXMuYm90dG9tX3VwP2U6dGhpcy5oZWlnaHQtMS1lLG49MDtuPHRoaXMud2lkdGg7bisrKXt2YXIgaT10aGlzLmRhdGF2LmdldFVpbnQ4KHRoaXMucG9zKyssITApLGE9cip0aGlzLndpZHRoKjQrNCpuO2lmKGk8dGhpcy5wYWxldHRlLmxlbmd0aCl7dmFyIG89dGhpcy5wYWxldHRlW2ldO3RoaXMuZGF0YVthXT1vLnJlZCx0aGlzLmRhdGFbYSsxXT1vLmdyZWVuLHRoaXMuZGF0YVthKzJdPW8uYmx1ZSx0aGlzLmRhdGFbYSszXT0yNTV9ZWxzZSB0aGlzLmRhdGFbYV09MjU1LHRoaXMuZGF0YVthKzFdPTI1NSx0aGlzLmRhdGFbYSsyXT0yNTUsdGhpcy5kYXRhW2ErM109MjU1fTAhPT10JiYodGhpcy5wb3MrPTQtdCl9fSxxZS5wcm90b3R5cGUuYml0MTU9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy53aWR0aCUzLGU9cGFyc2VJbnQoIjExMTExIiwyKSxyPXRoaXMuaGVpZ2h0LTE7cj49MDtyLS0pe2Zvcih2YXIgbj10aGlzLmJvdHRvbV91cD9yOnRoaXMuaGVpZ2h0LTEtcixpPTA7aTx0aGlzLndpZHRoO2krKyl7dmFyIGE9dGhpcy5kYXRhdi5nZXRVaW50MTYodGhpcy5wb3MsITApO3RoaXMucG9zKz0yO3ZhciBvPShhJmUpL2UqMjU1fDAscz0oYT4+NSZlKS9lKjI1NXwwLGM9KGE+PjEwJmUpL2UqMjU1fDAsdT1hPj4xNT8yNTU6MCxsPW4qdGhpcy53aWR0aCo0KzQqaTt0aGlzLmRhdGFbbF09Yyx0aGlzLmRhdGFbbCsxXT1zLHRoaXMuZGF0YVtsKzJdPW8sdGhpcy5kYXRhW2wrM109dX10aGlzLnBvcys9dH19LHFlLnByb3RvdHlwZS5iaXQxNj1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLndpZHRoJTMsZT1wYXJzZUludCgiMTExMTEiLDIpLHI9cGFyc2VJbnQoIjExMTExMSIsMiksbj10aGlzLmhlaWdodC0xO24+PTA7bi0tKXtmb3IodmFyIGk9dGhpcy5ib3R0b21fdXA/bjp0aGlzLmhlaWdodC0xLW4sYT0wO2E8dGhpcy53aWR0aDthKyspe3ZhciBvPXRoaXMuZGF0YXYuZ2V0VWludDE2KHRoaXMucG9zLCEwKTt0aGlzLnBvcys9Mjt2YXIgcz0obyZlKS9lKjI1NXwwLGM9KG8+PjUmcikvcioyNTV8MCx1PShvPj4xMSkvZSoyNTV8MCxsPWkqdGhpcy53aWR0aCo0KzQqYTt0aGlzLmRhdGFbbF09dSx0aGlzLmRhdGFbbCsxXT1jLHRoaXMuZGF0YVtsKzJdPXMsdGhpcy5kYXRhW2wrM109MjU1fXRoaXMucG9zKz10fX0scWUucHJvdG90eXBlLmJpdDI0PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuaGVpZ2h0LTE7dD49MDt0LS0pe2Zvcih2YXIgZT10aGlzLmJvdHRvbV91cD90OnRoaXMuaGVpZ2h0LTEtdCxyPTA7cjx0aGlzLndpZHRoO3IrKyl7dmFyIG49dGhpcy5kYXRhdi5nZXRVaW50OCh0aGlzLnBvcysrLCEwKSxpPXRoaXMuZGF0YXYuZ2V0VWludDgodGhpcy5wb3MrKywhMCksYT10aGlzLmRhdGF2LmdldFVpbnQ4KHRoaXMucG9zKyssITApLG89ZSp0aGlzLndpZHRoKjQrNCpyO3RoaXMuZGF0YVtvXT1hLHRoaXMuZGF0YVtvKzFdPWksdGhpcy5kYXRhW28rMl09bix0aGlzLmRhdGFbbyszXT0yNTV9dGhpcy5wb3MrPXRoaXMud2lkdGglNH19LHFlLnByb3RvdHlwZS5iaXQzMj1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLmhlaWdodC0xO3Q+PTA7dC0tKWZvcih2YXIgZT10aGlzLmJvdHRvbV91cD90OnRoaXMuaGVpZ2h0LTEtdCxyPTA7cjx0aGlzLndpZHRoO3IrKyl7dmFyIG49dGhpcy5kYXRhdi5nZXRVaW50OCh0aGlzLnBvcysrLCEwKSxpPXRoaXMuZGF0YXYuZ2V0VWludDgodGhpcy5wb3MrKywhMCksYT10aGlzLmRhdGF2LmdldFVpbnQ4KHRoaXMucG9zKyssITApLG89dGhpcy5kYXRhdi5nZXRVaW50OCh0aGlzLnBvcysrLCEwKSxzPWUqdGhpcy53aWR0aCo0KzQqcjt0aGlzLmRhdGFbc109YSx0aGlzLmRhdGFbcysxXT1pLHRoaXMuZGF0YVtzKzJdPW4sdGhpcy5kYXRhW3MrM109b319LHFlLnByb3RvdHlwZS5nZXREYXRhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF0YX0sCi8qKgogICAqIEBsaWNlbnNlCiAgICogQ29weXJpZ2h0IChjKSAyMDE4IEFyYXMgQWJiYXNpCiAgICoKICAgKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuCiAgICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlCiAgICovCmZ1bmN0aW9uKHQpe3QucHJvY2Vzc0JNUD1mdW5jdGlvbihlLHIsbixpKXt2YXIgYT1uZXcgcWUoZSwhMSksbz1hLndpZHRoLHM9YS5oZWlnaHQsYz17ZGF0YTphLmdldERhdGEoKSx3aWR0aDpvLGhlaWdodDpzfSx1PW5ldyBFZSgxMDApLmVuY29kZShjLDEwMCk7cmV0dXJuIHQucHJvY2Vzc0pQRUcuY2FsbCh0aGlzLHUscixuLGkpfX0oTS5BUEkpLERlLnByb3RvdHlwZS5nZXREYXRhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF0YX0sCi8qKgogICAqIEBsaWNlbnNlCiAgICogQ29weXJpZ2h0IChjKSAyMDE5IEFyYXMgQWJiYXNpCiAgICoKICAgKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuCiAgICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlCiAgICovCmZ1bmN0aW9uKHQpe3QucHJvY2Vzc1dFQlA9ZnVuY3Rpb24oZSxyLG4saSl7dmFyIGE9bmV3IERlKGUsITEpLG89YS53aWR0aCxzPWEuaGVpZ2h0LGM9e2RhdGE6YS5nZXREYXRhKCksd2lkdGg6byxoZWlnaHQ6c30sdT1uZXcgRWUoMTAwKS5lbmNvZGUoYywxMDApO3JldHVybiB0LnByb2Nlc3NKUEVHLmNhbGwodGhpcyx1LHIsbixpKX19KE0uQVBJKSwKLyoqCiAgICogQGxpY2Vuc2UKICAgKgogICAqIENvcHlyaWdodCAoYykgMjAyMSBBbnR0aSBQYWxvbGEsIGh0dHBzOi8vZ2l0aHViLmNvbS9QYW50dXJhCiAgICoKICAgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKICAgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKICAgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCiAgICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAogICAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwogICAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwogICAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICAgKgogICAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCiAgICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCiAgICoKICAgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKICAgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKICAgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAogICAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUKICAgKiBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCiAgICogT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCiAgICogV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCiAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgKi8KZnVuY3Rpb24odCl7dC5wcm9jZXNzUkdCQT1mdW5jdGlvbih0LGUscil7Zm9yKHZhciBuPXQuZGF0YSxpPW4ubGVuZ3RoLGE9bmV3IFVpbnQ4QXJyYXkoaS80KjMpLG89bmV3IFVpbnQ4QXJyYXkoaS80KSxzPTAsYz0wLHU9MDt1PGk7dSs9NCl7dmFyIGw9blt1XSxoPW5bdSsxXSxmPW5bdSsyXSxkPW5bdSszXTthW3MrK109bCxhW3MrK109aCxhW3MrK109ZixvW2MrK109ZH12YXIgcD10aGlzLl9fYWRkaW1hZ2VfXy5hcnJheUJ1ZmZlclRvQmluYXJ5U3RyaW5nKGEpO3JldHVybnthbHBoYTp0aGlzLl9fYWRkaW1hZ2VfXy5hcnJheUJ1ZmZlclRvQmluYXJ5U3RyaW5nKG8pLGRhdGE6cCxpbmRleDplLGFsaWFzOnIsY29sb3JTcGFjZToiRGV2aWNlUkdCIixiaXRzUGVyQ29tcG9uZW50Ojgsd2lkdGg6dC53aWR0aCxoZWlnaHQ6dC5oZWlnaHR9fX0oTS5BUEkpLAovKioKICAgKiBAbGljZW5zZQogICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4KICAgKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UKICAgKi8KZnVuY3Rpb24odCl7dC5zZXRMYW5ndWFnZT1mdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwPT09dGhpcy5pbnRlcm5hbC5sYW5ndWFnZVNldHRpbmdzJiYodGhpcy5pbnRlcm5hbC5sYW5ndWFnZVNldHRpbmdzPXt9LHRoaXMuaW50ZXJuYWwubGFuZ3VhZ2VTZXR0aW5ncy5pc1N1YnNjcmliZWQ9ITEpLHZvaWQgMCE9PXthZjoiQWZyaWthYW5zIixzcToiQWxiYW5pYW4iLGFyOiJBcmFiaWMgKFN0YW5kYXJkKSIsImFyLURaIjoiQXJhYmljIChBbGdlcmlhKSIsImFyLUJIIjoiQXJhYmljIChCYWhyYWluKSIsImFyLUVHIjoiQXJhYmljIChFZ3lwdCkiLCJhci1JUSI6IkFyYWJpYyAoSXJhcSkiLCJhci1KTyI6IkFyYWJpYyAoSm9yZGFuKSIsImFyLUtXIjoiQXJhYmljIChLdXdhaXQpIiwiYXItTEIiOiJBcmFiaWMgKExlYmFub24pIiwiYXItTFkiOiJBcmFiaWMgKExpYnlhKSIsImFyLU1BIjoiQXJhYmljIChNb3JvY2NvKSIsImFyLU9NIjoiQXJhYmljIChPbWFuKSIsImFyLVFBIjoiQXJhYmljIChRYXRhcikiLCJhci1TQSI6IkFyYWJpYyAoU2F1ZGkgQXJhYmlhKSIsImFyLVNZIjoiQXJhYmljIChTeXJpYSkiLCJhci1UTiI6IkFyYWJpYyAoVHVuaXNpYSkiLCJhci1BRSI6IkFyYWJpYyAoVS5BLkUuKSIsImFyLVlFIjoiQXJhYmljIChZZW1lbikiLGFuOiJBcmFnb25lc2UiLGh5OiJBcm1lbmlhbiIsYXM6IkFzc2FtZXNlIixhc3Q6IkFzdHVyaWFuIixhejoiQXplcmJhaWphbmkiLGV1OiJCYXNxdWUiLGJlOiJCZWxhcnVzaWFuIixibjoiQmVuZ2FsaSIsYnM6IkJvc25pYW4iLGJyOiJCcmV0b24iLGJnOiJCdWxnYXJpYW4iLG15OiJCdXJtZXNlIixjYToiQ2F0YWxhbiIsY2g6IkNoYW1vcnJvIixjZToiQ2hlY2hlbiIsemg6IkNoaW5lc2UiLCJ6aC1ISyI6IkNoaW5lc2UgKEhvbmcgS29uZykiLCJ6aC1DTiI6IkNoaW5lc2UgKFBSQykiLCJ6aC1TRyI6IkNoaW5lc2UgKFNpbmdhcG9yZSkiLCJ6aC1UVyI6IkNoaW5lc2UgKFRhaXdhbikiLGN2OiJDaHV2YXNoIixjbzoiQ29yc2ljYW4iLGNyOiJDcmVlIixocjoiQ3JvYXRpYW4iLGNzOiJDemVjaCIsZGE6IkRhbmlzaCIsbmw6IkR1dGNoIChTdGFuZGFyZCkiLCJubC1CRSI6IkR1dGNoIChCZWxnaWFuKSIsZW46IkVuZ2xpc2giLCJlbi1BVSI6IkVuZ2xpc2ggKEF1c3RyYWxpYSkiLCJlbi1CWiI6IkVuZ2xpc2ggKEJlbGl6ZSkiLCJlbi1DQSI6IkVuZ2xpc2ggKENhbmFkYSkiLCJlbi1JRSI6IkVuZ2xpc2ggKElyZWxhbmQpIiwiZW4tSk0iOiJFbmdsaXNoIChKYW1haWNhKSIsImVuLU5aIjoiRW5nbGlzaCAoTmV3IFplYWxhbmQpIiwiZW4tUEgiOiJFbmdsaXNoIChQaGlsaXBwaW5lcykiLCJlbi1aQSI6IkVuZ2xpc2ggKFNvdXRoIEFmcmljYSkiLCJlbi1UVCI6IkVuZ2xpc2ggKFRyaW5pZGFkICYgVG9iYWdvKSIsImVuLUdCIjoiRW5nbGlzaCAoVW5pdGVkIEtpbmdkb20pIiwiZW4tVVMiOiJFbmdsaXNoIChVbml0ZWQgU3RhdGVzKSIsImVuLVpXIjoiRW5nbGlzaCAoWmltYmFid2UpIixlbzoiRXNwZXJhbnRvIixldDoiRXN0b25pYW4iLGZvOiJGYWVyb2VzZSIsZmo6IkZpamlhbiIsZmk6IkZpbm5pc2giLGZyOiJGcmVuY2ggKFN0YW5kYXJkKSIsImZyLUJFIjoiRnJlbmNoIChCZWxnaXVtKSIsImZyLUNBIjoiRnJlbmNoIChDYW5hZGEpIiwiZnItRlIiOiJGcmVuY2ggKEZyYW5jZSkiLCJmci1MVSI6IkZyZW5jaCAoTHV4ZW1ib3VyZykiLCJmci1NQyI6IkZyZW5jaCAoTW9uYWNvKSIsImZyLUNIIjoiRnJlbmNoIChTd2l0emVybGFuZCkiLGZ5OiJGcmlzaWFuIixmdXI6IkZyaXVsaWFuIixnZDoiR2FlbGljIChTY290cykiLCJnZC1JRSI6IkdhZWxpYyAoSXJpc2gpIixnbDoiR2FsYWNpYW4iLGthOiJHZW9yZ2lhbiIsZGU6Ikdlcm1hbiAoU3RhbmRhcmQpIiwiZGUtQVQiOiJHZXJtYW4gKEF1c3RyaWEpIiwiZGUtREUiOiJHZXJtYW4gKEdlcm1hbnkpIiwiZGUtTEkiOiJHZXJtYW4gKExpZWNodGVuc3RlaW4pIiwiZGUtTFUiOiJHZXJtYW4gKEx1eGVtYm91cmcpIiwiZGUtQ0giOiJHZXJtYW4gKFN3aXR6ZXJsYW5kKSIsZWw6IkdyZWVrIixndToiR3VqdXJhdGkiLGh0OiJIYWl0aWFuIixoZToiSGVicmV3IixoaToiSGluZGkiLGh1OiJIdW5nYXJpYW4iLGlzOiJJY2VsYW5kaWMiLGlkOiJJbmRvbmVzaWFuIixpdToiSW51a3RpdHV0IixnYToiSXJpc2giLGl0OiJJdGFsaWFuIChTdGFuZGFyZCkiLCJpdC1DSCI6Ikl0YWxpYW4gKFN3aXR6ZXJsYW5kKSIsamE6IkphcGFuZXNlIixrbjoiS2FubmFkYSIsa3M6Ikthc2htaXJpIixrazoiS2F6YWtoIixrbToiS2htZXIiLGt5OiJLaXJnaGl6Iix0bGg6IktsaW5nb24iLGtvOiJLb3JlYW4iLCJrby1LUCI6IktvcmVhbiAoTm9ydGggS29yZWEpIiwia28tS1IiOiJLb3JlYW4gKFNvdXRoIEtvcmVhKSIsbGE6IkxhdGluIixsdjoiTGF0dmlhbiIsbHQ6IkxpdGh1YW5pYW4iLGxiOiJMdXhlbWJvdXJnaXNoIixtazoiTm9ydGggTWFjZWRvbmlhIixtczoiTWFsYXkiLG1sOiJNYWxheWFsYW0iLG10OiJNYWx0ZXNlIixtaToiTWFvcmkiLG1yOiJNYXJhdGhpIixtbzoiTW9sZGF2aWFuIixudjoiTmF2YWpvIixuZzoiTmRvbmdhIixuZToiTmVwYWxpIixubzoiTm9yd2VnaWFuIixuYjoiTm9yd2VnaWFuIChCb2ttYWwpIixubjoiTm9yd2VnaWFuIChOeW5vcnNrKSIsb2M6Ik9jY2l0YW4iLG9yOiJPcml5YSIsb206Ik9yb21vIixmYToiUGVyc2lhbiIsImZhLUlSIjoiUGVyc2lhbi9JcmFuIixwbDoiUG9saXNoIixwdDoiUG9ydHVndWVzZSIsInB0LUJSIjoiUG9ydHVndWVzZSAoQnJhemlsKSIscGE6IlB1bmphYmkiLCJwYS1JTiI6IlB1bmphYmkgKEluZGlhKSIsInBhLVBLIjoiUHVuamFiaSAoUGFraXN0YW4pIixxdToiUXVlY2h1YSIscm06IlJoYWV0by1Sb21hbmljIixybzoiUm9tYW5pYW4iLCJyby1NTyI6IlJvbWFuaWFuIChNb2xkYXZpYSkiLHJ1OiJSdXNzaWFuIiwicnUtTU8iOiJSdXNzaWFuIChNb2xkYXZpYSkiLHN6OiJTYW1pIChMYXBwaXNoKSIsc2c6IlNhbmdvIixzYToiU2Fuc2tyaXQiLHNjOiJTYXJkaW5pYW4iLHNkOiJTaW5kaGkiLHNpOiJTaW5naGFsZXNlIixzcjoiU2VyYmlhbiIsc2s6IlNsb3ZhayIsc2w6IlNsb3ZlbmlhbiIsc286IlNvbWFuaSIsc2I6IlNvcmJpYW4iLGVzOiJTcGFuaXNoIiwiZXMtQVIiOiJTcGFuaXNoIChBcmdlbnRpbmEpIiwiZXMtQk8iOiJTcGFuaXNoIChCb2xpdmlhKSIsImVzLUNMIjoiU3BhbmlzaCAoQ2hpbGUpIiwiZXMtQ08iOiJTcGFuaXNoIChDb2xvbWJpYSkiLCJlcy1DUiI6IlNwYW5pc2ggKENvc3RhIFJpY2EpIiwiZXMtRE8iOiJTcGFuaXNoIChEb21pbmljYW4gUmVwdWJsaWMpIiwiZXMtRUMiOiJTcGFuaXNoIChFY3VhZG9yKSIsImVzLVNWIjoiU3BhbmlzaCAoRWwgU2FsdmFkb3IpIiwiZXMtR1QiOiJTcGFuaXNoIChHdWF0ZW1hbGEpIiwiZXMtSE4iOiJTcGFuaXNoIChIb25kdXJhcykiLCJlcy1NWCI6IlNwYW5pc2ggKE1leGljbykiLCJlcy1OSSI6IlNwYW5pc2ggKE5pY2FyYWd1YSkiLCJlcy1QQSI6IlNwYW5pc2ggKFBhbmFtYSkiLCJlcy1QWSI6IlNwYW5pc2ggKFBhcmFndWF5KSIsImVzLVBFIjoiU3BhbmlzaCAoUGVydSkiLCJlcy1QUiI6IlNwYW5pc2ggKFB1ZXJ0byBSaWNvKSIsImVzLUVTIjoiU3BhbmlzaCAoU3BhaW4pIiwiZXMtVVkiOiJTcGFuaXNoIChVcnVndWF5KSIsImVzLVZFIjoiU3BhbmlzaCAoVmVuZXp1ZWxhKSIsc3g6IlN1dHUiLHN3OiJTd2FoaWxpIixzdjoiU3dlZGlzaCIsInN2LUZJIjoiU3dlZGlzaCAoRmlubGFuZCkiLCJzdi1TViI6IlN3ZWRpc2ggKFN3ZWRlbikiLHRhOiJUYW1pbCIsdHQ6IlRhdGFyIix0ZToiVGVsdWdhIix0aDoiVGhhaSIsdGlnOiJUaWdyZSIsdHM6IlRzb25nYSIsdG46IlRzd2FuYSIsdHI6IlR1cmtpc2giLHRrOiJUdXJrbWVuIix1azoiVWtyYWluaWFuIixoc2I6IlVwcGVyIFNvcmJpYW4iLHVyOiJVcmR1Iix2ZToiVmVuZGEiLHZpOiJWaWV0bmFtZXNlIix2bzoiVm9sYXB1ayIsd2E6IldhbGxvb24iLGN5OiJXZWxzaCIseGg6Ilhob3NhIixqaToiWWlkZGlzaCIsenU6Ilp1bHUifVt0XSYmKHRoaXMuaW50ZXJuYWwubGFuZ3VhZ2VTZXR0aW5ncy5sYW5ndWFnZUNvZGU9dCwhMT09PXRoaXMuaW50ZXJuYWwubGFuZ3VhZ2VTZXR0aW5ncy5pc1N1YnNjcmliZWQmJih0aGlzLmludGVybmFsLmV2ZW50cy5zdWJzY3JpYmUoInB1dENhdGFsb2ciLChmdW5jdGlvbigpe3RoaXMuaW50ZXJuYWwud3JpdGUoIi9MYW5nICgiK3RoaXMuaW50ZXJuYWwubGFuZ3VhZ2VTZXR0aW5ncy5sYW5ndWFnZUNvZGUrIikiKX0pKSx0aGlzLmludGVybmFsLmxhbmd1YWdlU2V0dGluZ3MuaXNTdWJzY3JpYmVkPSEwKSksdGhpc319KE0uQVBJKSxrZT1NLkFQSSxGZT1rZS5nZXRDaGFyV2lkdGhzQXJyYXk9ZnVuY3Rpb24odCxyKXt2YXIgbixpLGE9KHI9cnx8e30pLmZvbnR8fHRoaXMuaW50ZXJuYWwuZ2V0Rm9udCgpLG89ci5mb250U2l6ZXx8dGhpcy5pbnRlcm5hbC5nZXRGb250U2l6ZSgpLHM9ci5jaGFyU3BhY2V8fHRoaXMuaW50ZXJuYWwuZ2V0Q2hhclNwYWNlKCksYz1yLndpZHRocz9yLndpZHRoczphLm1ldGFkYXRhLlVuaWNvZGUud2lkdGhzLHU9Yy5mb2Y/Yy5mb2Y6MSxsPXIua2VybmluZz9yLmtlcm5pbmc6YS5tZXRhZGF0YS5Vbmljb2RlLmtlcm5pbmcsaD1sLmZvZj9sLmZvZjoxLGY9ITEhPT1yLmRvS2VybmluZyxkPTAscD10Lmxlbmd0aCxnPTAsbT1jWzBdfHx1LHY9W107Zm9yKG49MDtuPHA7bisrKWk9dC5jaGFyQ29kZUF0KG4pLCJmdW5jdGlvbiI9PXR5cGVvZiBhLm1ldGFkYXRhLndpZHRoT2ZTdHJpbmc/di5wdXNoKChhLm1ldGFkYXRhLndpZHRoT2ZHbHlwaChhLm1ldGFkYXRhLmNoYXJhY3RlclRvR2x5cGgoaSkpK3MqKDFlMy9vKXx8MCkvMWUzKTooZD1mJiYib2JqZWN0Ij09PWUobFtpXSkmJiFpc05hTihwYXJzZUludChsW2ldW2ddLDEwKSk/bFtpXVtnXS9oOjAsdi5wdXNoKChjW2ldfHxtKS91K2QpKSxnPWk7cmV0dXJuIHZ9LEllPWtlLmdldFN0cmluZ1VuaXRXaWR0aD1mdW5jdGlvbih0LGUpe3ZhciByPShlPWV8fHt9KS5mb250U2l6ZXx8dGhpcy5pbnRlcm5hbC5nZXRGb250U2l6ZSgpLG49ZS5mb250fHx0aGlzLmludGVybmFsLmdldEZvbnQoKSxpPWUuY2hhclNwYWNlfHx0aGlzLmludGVybmFsLmdldENoYXJTcGFjZSgpO3JldHVybiBrZS5wcm9jZXNzQXJhYmljJiYodD1rZS5wcm9jZXNzQXJhYmljKHQpKSwiZnVuY3Rpb24iPT10eXBlb2Ygbi5tZXRhZGF0YS53aWR0aE9mU3RyaW5nP24ubWV0YWRhdGEud2lkdGhPZlN0cmluZyh0LHIsaSkvcjpGZS5hcHBseSh0aGlzLGFyZ3VtZW50cykucmVkdWNlKChmdW5jdGlvbih0LGUpe3JldHVybiB0K2V9KSwwKX0sQ2U9ZnVuY3Rpb24odCxlLHIsbil7Zm9yKHZhciBpPVtdLGE9MCxvPXQubGVuZ3RoLHM9MDthIT09byYmcytlW2FdPHI7KXMrPWVbYV0sYSsrO2kucHVzaCh0LnNsaWNlKDAsYSkpO3ZhciBjPWE7Zm9yKHM9MDthIT09bzspcytlW2FdPm4mJihpLnB1c2godC5zbGljZShjLGEpKSxzPTAsYz1hKSxzKz1lW2FdLGErKztyZXR1cm4gYyE9PWEmJmkucHVzaCh0LnNsaWNlKGMsYSkpLGl9LGplPWZ1bmN0aW9uKHQsZSxyKXtyfHwocj17fSk7dmFyIG4saSxhLG8scyxjLHUsbD1bXSxoPVtsXSxmPXIudGV4dEluZGVudHx8MCxkPTAscD0wLGc9dC5zcGxpdCgiICIpLG09RmUuYXBwbHkodGhpcyxbIiAiLHJdKVswXTtpZihjPS0xPT09ci5saW5lSW5kZW50P2dbMF0ubGVuZ3RoKzI6ci5saW5lSW5kZW50fHwwKXt2YXIgdj1BcnJheShjKS5qb2luKCIgIiksYj1bXTtnLm1hcCgoZnVuY3Rpb24odCl7KHQ9dC5zcGxpdCgvXHMqXG4vKSkubGVuZ3RoPjE/Yj1iLmNvbmNhdCh0Lm1hcCgoZnVuY3Rpb24odCxlKXtyZXR1cm4oZSYmdC5sZW5ndGg/IlxuIjoiIikrdH0pKSk6Yi5wdXNoKHRbMF0pfSkpLGc9YixjPUllLmFwcGx5KHRoaXMsW3Yscl0pfWZvcihhPTAsbz1nLmxlbmd0aDthPG87YSsrKXt2YXIgeT0wO2lmKG49Z1thXSxjJiYiXG4iPT1uWzBdJiYobj1uLnN1YnN0cigxKSx5PTEpLGYrZCsocD0oaT1GZS5hcHBseSh0aGlzLFtuLHJdKSkucmVkdWNlKChmdW5jdGlvbih0LGUpe3JldHVybiB0K2V9KSwwKSk+ZXx8eSl7aWYocD5lKXtmb3Iocz1DZS5hcHBseSh0aGlzLFtuLGksZS0oZitkKSxlXSksbC5wdXNoKHMuc2hpZnQoKSksbD1bcy5wb3AoKV07cy5sZW5ndGg7KWgucHVzaChbcy5zaGlmdCgpXSk7cD1pLnNsaWNlKG4ubGVuZ3RoLShsWzBdP2xbMF0ubGVuZ3RoOjApKS5yZWR1Y2UoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQrZX0pLDApfWVsc2UgbD1bbl07aC5wdXNoKGwpLGY9cCtjLGQ9bX1lbHNlIGwucHVzaChuKSxmKz1kK3AsZD1tfXJldHVybiB1PWM/ZnVuY3Rpb24odCxlKXtyZXR1cm4oZT92OiIiKSt0LmpvaW4oIiAiKX06ZnVuY3Rpb24odCl7cmV0dXJuIHQuam9pbigiICIpfSxoLm1hcCh1KX0sa2Uuc3BsaXRUZXh0VG9TaXplPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbixpPShyPXJ8fHt9KS5mb250U2l6ZXx8dGhpcy5pbnRlcm5hbC5nZXRGb250U2l6ZSgpLGE9ZnVuY3Rpb24odCl7aWYodC53aWR0aHMmJnQua2VybmluZylyZXR1cm57d2lkdGhzOnQud2lkdGhzLGtlcm5pbmc6dC5rZXJuaW5nfTt2YXIgZT10aGlzLmludGVybmFsLmdldEZvbnQodC5mb250TmFtZSx0LmZvbnRTdHlsZSk7cmV0dXJuIGUubWV0YWRhdGEuVW5pY29kZT97d2lkdGhzOmUubWV0YWRhdGEuVW5pY29kZS53aWR0aHN8fHswOjF9LGtlcm5pbmc6ZS5tZXRhZGF0YS5Vbmljb2RlLmtlcm5pbmd8fHt9fTp7Zm9udDplLm1ldGFkYXRhLGZvbnRTaXplOnRoaXMuaW50ZXJuYWwuZ2V0Rm9udFNpemUoKSxjaGFyU3BhY2U6dGhpcy5pbnRlcm5hbC5nZXRDaGFyU3BhY2UoKX19LmNhbGwodGhpcyxyKTtuPUFycmF5LmlzQXJyYXkodCk/dDpTdHJpbmcodCkuc3BsaXQoL1xyP1xuLyk7dmFyIG89MSp0aGlzLmludGVybmFsLnNjYWxlRmFjdG9yKmUvaTthLnRleHRJbmRlbnQ9ci50ZXh0SW5kZW50PzEqci50ZXh0SW5kZW50KnRoaXMuaW50ZXJuYWwuc2NhbGVGYWN0b3IvaTowLGEubGluZUluZGVudD1yLmxpbmVJbmRlbnQ7dmFyIHMsYyx1PVtdO2ZvcihzPTAsYz1uLmxlbmd0aDtzPGM7cysrKXU9dS5jb25jYXQoamUuYXBwbHkodGhpcyxbbltzXSxvLGFdKSk7cmV0dXJuIHV9LGZ1bmN0aW9uKHQpe3QuX19mb250bWV0cmljc19fPXQuX19mb250bWV0cmljc19ffHx7fTtmb3IodmFyIHI9ImtsbW5vcHFyc3R1dnd4eXoiLG49e30saT17fSxhPTA7YTxyLmxlbmd0aDthKyspbltyW2FdXT0iMDEyMzQ1Njc4OWFiY2RlZiJbYV0saVsiMDEyMzQ1Njc4OWFiY2RlZiJbYV1dPXJbYV07dmFyIG89ZnVuY3Rpb24odCl7cmV0dXJuIjB4IitwYXJzZUludCh0LDEwKS50b1N0cmluZygxNil9LHM9dC5fX2ZvbnRtZXRyaWNzX18uY29tcHJlc3M9ZnVuY3Rpb24odCl7dmFyIHIsbixhLGMsdT1bInsiXTtmb3IodmFyIGwgaW4gdCl7aWYocj10W2xdLGlzTmFOKHBhcnNlSW50KGwsMTApKT9uPSInIitsKyInIjoobD1wYXJzZUludChsLDEwKSxuPShuPW8obCkuc2xpY2UoMikpLnNsaWNlKDAsLTEpK2lbbi5zbGljZSgtMSldKSwibnVtYmVyIj09dHlwZW9mIHIpcjwwPyhhPW8ocikuc2xpY2UoMyksYz0iLSIpOihhPW8ocikuc2xpY2UoMiksYz0iIiksYT1jK2Euc2xpY2UoMCwtMSkraVthLnNsaWNlKC0xKV07ZWxzZXtpZigib2JqZWN0IiE9PWUocikpdGhyb3cgbmV3IEVycm9yKCJEb24ndCBrbm93IHdoYXQgdG8gZG8gd2l0aCB2YWx1ZSB0eXBlICIrZShyKSsiLiIpO2E9cyhyKX11LnB1c2gobithKX1yZXR1cm4gdS5wdXNoKCJ9IiksdS5qb2luKCIiKX0sYz10Ll9fZm9udG1ldHJpY3NfXy51bmNvbXByZXNzPWZ1bmN0aW9uKHQpe2lmKCJzdHJpbmciIT10eXBlb2YgdCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgYXJndW1lbnQgcGFzc2VkIHRvIHVuY29tcHJlc3MuIik7Zm9yKHZhciBlLHIsaSxhLG89e30scz0xLGM9byx1PVtdLGw9IiIsaD0iIixmPXQubGVuZ3RoLTEsZD0xO2Q8ZjtkKz0xKSInIj09KGE9dFtkXSk/ZT8oaT1lLmpvaW4oIiIpLGU9dm9pZCAwKTplPVtdOmU/ZS5wdXNoKGEpOiJ7Ij09YT8odS5wdXNoKFtjLGldKSxjPXt9LGk9dm9pZCAwKToifSI9PWE/KChyPXUucG9wKCkpWzBdW3JbMV1dPWMsaT12b2lkIDAsYz1yWzBdKToiLSI9PWE/cz0tMTp2b2lkIDA9PT1pP24uaGFzT3duUHJvcGVydHkoYSk/KGwrPW5bYV0saT1wYXJzZUludChsLDE2KSpzLHM9MSxsPSIiKTpsKz1hOm4uaGFzT3duUHJvcGVydHkoYSk/KGgrPW5bYV0sY1tpXT1wYXJzZUludChoLDE2KSpzLHM9MSxpPXZvaWQgMCxoPSIiKTpoKz1hO3JldHVybiBvfSx1PXtjb2RlUGFnZXM6WyJXaW5BbnNpRW5jb2RpbmciXSxXaW5BbnNpRW5jb2Rpbmc6YygiezE5bThuMjAxbjlxMjAxbzlyMjAxczlsMjAxdDltMjAxdThtMjAxdzluMjAxeDlvMjAxeThvMjAyazhxMjAybDhyMjAybTlwMjAycThwMjBhdzhrMjAzazh0MjAzdDh2MjAzdTl2MmNxOHMyMTJtOXQxNW04dzE1bjl3MmR3OXMxNms4dTE2bDl1MTdzOXoxN3g4eTE3eTl5fSIpfSxsPXtVbmljb2RlOntDb3VyaWVyOnUsIkNvdXJpZXItQm9sZCI6dSwiQ291cmllci1Cb2xkT2JsaXF1ZSI6dSwiQ291cmllci1PYmxpcXVlIjp1LEhlbHZldGljYTp1LCJIZWx2ZXRpY2EtQm9sZCI6dSwiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIjp1LCJIZWx2ZXRpY2EtT2JsaXF1ZSI6dSwiVGltZXMtUm9tYW4iOnUsIlRpbWVzLUJvbGQiOnUsIlRpbWVzLUJvbGRJdGFsaWMiOnUsIlRpbWVzLUl0YWxpYyI6dX19LGg9e1VuaWNvZGU6eyJDb3VyaWVyLU9ibGlxdWUiOmMoInsnd2lkdGhzJ3trM3cnZm9mJzZvfSdrZXJuaW5nJ3snZm9mJy02b319IiksIlRpbWVzLUJvbGRJdGFsaWMiOmMoInsnd2lkdGhzJ3trM28ycTR5Y3gycjIwMW4zbTIwMW82bzIwMXMybDIwMXQybDIwMXUybDIwMXczbTIwMXgzbTIwMXkzbTJrMXQybDJyMjAybTJuMm4zbTJvM20ycDVuMjAycTZvMnIxdzJzMmwydDJsMnUzbTJ2M3QydzF0MngybDJ5MXQyejF3M2szbTNsM20zbTNtM24zbTNvM20zcDNtM3EzbTNyM20zczNtMjAzdDJsMjAzdTJsM3YybDN3M3QzeDN0M3kzdDN6M200azVuNGw0bTRtNG00bjRtNG80czRwNG00cTRtNHI0czRzNHk0dDJyNHUzbTR2NG00dzN4NHg1dDR5NHM0ejRzNWszeDVsNHM1bTRtNW4zcjVvM3g1cDRzNXE0bTVyNXQ1czRtNXQzeDV1M3g1djJsNXcxdzV4Mmw1eTN0NXozbTZrMmw2bDNtNm0zbTZuMnc2bzNtNnAydzZxMmw2cjNtNnMzcjZ0MXc2dTF3NnYzbTZ3MXc2eDR5NnkzcjZ6M203azNtN2wzbTdtMnI3bjJyN28xdzdwM3I3cTJ3N3I0bTdzM203dDJ3N3Uycjd2Mm43dzFxN3gybjd5M3QyMDJsM21jbDRtYWwycmFtM21hbjNtYW8zbWFwM21hcjNtYXMybGF0NHVhdTF1YXYzbWF3M3dheTR1YXoybGJrMnNibDN0J2ZvZic2b2JvMmxicDN0YnEzbWJyMXRiczJsYnUxeWJ2M21iejNtY2s0bTIwMmszbWNtNG1jbjRtY280bWNwNG1jcTV5Y3I0bWNzNG1jdDRtY3U0bWN2NG1jdzJyMm0zcmN5MnJjejJyZGw0c2RtNHNkbjRzZG80c2RwNHNkcTRzZHM0c2R0NHNkdTRzZHY0c2R3NHNkejNtZWszbWVsM21lbTNtZW4zbWVvM21lcDNtZXE0c2VyMndlczJ3ZXQyd2V1MndldjJ3ZXcxd2V4MXdleTF3ZXoxd2ZsM3JmbTNtZm4zbWZvM21mcDNtZnEzbWZyM3RmczNtZnQzcmZ1M3JmdjNyZnczcmZ6MncyMDNrNm8yMTJtNm8yZHcybDJjcTJsM3QzbTN1MmwxN3MzeDE5bTNtfSdrZXJuaW5nJ3tjbHs0cXU1a3Q1cXQ1cnMxN3NzNXRzfTIwMXN7MjAxc3N9MjAxdHtja3M0bHNjbXNjbnNjb3NjcHNjbHMyd3UyeXUyMDF0c30yMDF4ezJ3dTJ5dX0ya3syMDF0c30yd3s0cXg1a3g1b3U1cXg1cnMxN3N1NXR1fTJ4ezE3c3U1dHU1b3V9Mnl7NHF4NWt4NW91NXF4NXJzMTdzczV0c30nZm9mJy02b2ZuezE3c3c1dHc1b3U1cXc1cnN9N3R7Y2tzY2xzY21zY25zY29zY3BzNGxzfTN1ezE3c3U1dHU1b3M1cXN9M3Z7MTdzdTV0dTVvczVxc303cHsxN3N1NXR1fWNrezRxdTVrdDVxdDVyczE3c3M1dHN9NGx7NHF1NWt0NXF0NXJzMTdzczV0c31jbXs0cXU1a3Q1cXQ1cnMxN3NzNXRzfWNuezRxdTVrdDVxdDVyczE3c3M1dHN9Y297NHF1NWt0NXF0NXJzMTdzczV0c31jcHs0cXU1a3Q1cXQ1cnMxN3NzNXRzfTZsezRxdTVvdTVxdzVydDE3c3U1dHV9NXF7Y2t1Y2x1Y211Y251Y291Y3B1NGx1fTVye2NrdWNsdWNtdWNudWNvdWNwdTRsdX03cXtja3NjbHNjbXNjbnNjb3NjcHM0bHN9NnB7NHF1NW91NXF3NXJ0MTdzdzV0d31la3s0cXU1b3U1cXc1cnQxN3N1NXR1fWVsezRxdTVvdTVxdzVydDE3c3U1dHV9ZW17NHF1NW91NXF3NXJ0MTdzdTV0dX1lbns0cXU1b3U1cXc1cnQxN3N1NXR1fWVvezRxdTVvdTVxdzVydDE3c3U1dHV9ZXB7NHF1NW91NXF3NXJ0MTdzdTV0dX1lc3sxN3NzNXRzNXFzNHF1fWV0ezRxdTVvdTVxdzVydDE3c3c1dHd9ZXV7NHF1NW91NXF3NXJ0MTdzczV0c31ldnsxN3NzNXRzNXFzNHF1fTZ6ezE3c3c1dHc1b3U1cXc1cnN9Zm17MTdzdzV0dzVvdTVxdzVyc303bnsyMDF0c31mb3sxN3N3NXR3NW91NXF3NXJzfWZwezE3c3c1dHc1b3U1cXc1cnN9ZnF7MTdzdzV0dzVvdTVxdzVyc303cntja3NjbHNjbXNjbnNjb3NjcHM0bHN9ZnN7MTdzdzV0dzVvdTVxdzVyc31mdHsxN3N1NXR1fWZ1ezE3c3U1dHV9ZnZ7MTdzdTV0dX1md3sxN3N1NXR1fWZ6e2Nrc2Nsc2Ntc2Nuc2Nvc2NwczRsc319fSIpLCJIZWx2ZXRpY2EtQm9sZCI6Yygieyd3aWR0aHMne2szczJxNHNjeDF3MjAxbjNyMjAxbzZvMjAxczF3MjAxdDF3MjAxdTF3MjAxdzNtMjAxeDNtMjAxeTNtMmsxdzJsMmwyMDJtMm4ybjNyMm8zcjJwNXQyMDJxNm8ycjFzMnMybDJ0MmwydTJyMnYzdTJ3MXcyeDJsMnkxdzJ6MXczazNyM2wzcjNtM3IzbjNyM28zcjNwM3IzcTNyM3IzcjNzM3IyMDN0MmwyMDN1MmwzdjJsM3czdTN4M3UzeTN1M3ozeDRrNmw0bDRzNG00czRuNHM0bzRzNHA0bTRxM3g0cjR5NHM0czR0MXc0dTNyNHY0czR3M3g0eDVuNHk0czR6NHk1azRtNWw0eTVtNHM1bjRtNW8zeDVwNHM1cTRtNXI1eTVzNG01dDRtNXUzeDV2Mmw1dzF3NXgybDV5M3U1ejNyNmsybDZsM3I2bTN4Nm4zcjZvM3g2cDNyNnEybDZyM3g2czN4NnQxdzZ1MXc2djNyNncxdzZ4NXQ2eTN4NnozeDdrM3g3bDN4N20ycjduM3I3bzJsN3AzeDdxM3I3cjR5N3Mzcjd0M3I3dTNtN3Yycjd3MXc3eDJyN3kzdTIwMmwzcmNsNHNhbDJsYW0zcmFuM3JhbzNyYXAzcmFyM3JhczJsYXQ0dGF1MnBhdjNyYXczdWF5NHRhejJsYmsyc2JsM3UnZm9mJzZvYm8ybGJwM3hicTNyYnIxd2JzMmxidTJvYnYzcmJ6M3hjazRzMjAyazNyY200c2NuNHNjbzRzY3A0c2NxNm9jcjRzY3M0bWN0NG1jdTRtY3Y0bWN3MXcybTJ6Y3kxd2N6MXdkbDRzZG00eWRuNHlkbzR5ZHA0eWRxNHlkczR5ZHQ0c2R1NHNkdjRzZHc0c2R6M3hlazNyZWwzcmVtM3JlbjNyZW8zcmVwM3JlcTV0ZXIzcmVzM3JldDNyZXUzcmV2M3JldzF3ZXgxd2V5MXdlejF3ZmwzeGZtM3hmbjN4Zm8zeGZwM3hmcTN4ZnIzdWZzM3hmdDN4ZnUzeGZ2M3hmdzN4ZnozcjIwM2s2bzIxMm02bzJkdzJsMmNxMmwzdDNyM3UybDE3czRtMTltM3J9J2tlcm5pbmcne2NsezRxczVrdTVvdDVxczE3c3Y1dHZ9MjAxdHsyd3c0d3kyeXd9MjAxd3sya3N9MjAxeHsyd3c0d3kyeXd9Mmt7MjAxdHMyMDF4c30yd3s3cXM0cXU1a3c1b3M1cXc1cnMxN3N1NXR1N3RzZnpzfTJ4ezVvdzVxc30yeXs3cXM0cXU1a3c1b3M1cXc1cnMxN3N1NXR1N3RzZnpzfSdmb2YnLTZvN3B7MTdzdTV0dTVvdH1ja3s0cXM1a3U1b3Q1cXMxN3N2NXR2fTRsezRxczVrdTVvdDVxczE3c3Y1dHZ9Y217NHFzNWt1NW90NXFzMTdzdjV0dn1jbns0cXM1a3U1b3Q1cXMxN3N2NXR2fWNvezRxczVrdTVvdDVxczE3c3Y1dHZ9Y3B7NHFzNWt1NW90NXFzMTdzdjV0dn02bHsxN3N0NXR0NW9zfTE3c3sya3djbHZjbXZjbnZjb3ZjcHY0bHY0d3dja3Z9NW97Mmt1Y2x0Y210Y250Y290Y3B0NGx0NHd0Y2t0fTVxezJrc2Nsc2Ntc2Nuc2Nvc2NwczRsczR3dmNrc301cnsya3M0d3N9NXR7Mmt3Y2x2Y212Y252Y292Y3B2NGx2NHd3Y2t2fWVvezE3c3Q1dHQ1b3N9ZnV7MTdzdTV0dTVvdH02cHsxN3NzNXRzfWVrezE3c3Q1dHQ1b3N9ZWx7MTdzdDV0dDVvc31lbXsxN3N0NXR0NW9zfWVuezE3c3Q1dHQ1b3N9Nm97MjAxdHN9ZXB7MTdzdDV0dDVvc31lc3sxN3NzNXRzfWV0ezE3c3M1dHN9ZXV7MTdzczV0c31ldnsxN3NzNXRzfTZ6ezE3c3U1dHU1b3M1cXR9Zm17MTdzdTV0dTVvczVxdH1mbnsxN3N1NXR1NW9zNXF0fWZvezE3c3U1dHU1b3M1cXR9ZnB7MTdzdTV0dTVvczVxdH1mcXsxN3N1NXR1NW9zNXF0fWZzezE3c3U1dHU1b3M1cXR9ZnR7MTdzdTV0dTVvdH03bXs1b3N9ZnZ7MTdzdTV0dTVvdH1md3sxN3N1NXR1NW90fX19IiksQ291cmllcjpjKCJ7J3dpZHRocyd7azN3J2ZvZic2b30na2VybmluZyd7J2ZvZictNm99fSIpLCJDb3VyaWVyLUJvbGRPYmxpcXVlIjpjKCJ7J3dpZHRocyd7azN3J2ZvZic2b30na2VybmluZyd7J2ZvZictNm99fSIpLCJUaW1lcy1Cb2xkIjpjKCJ7J3dpZHRocyd7azNxMnE1bmN4MnIyMDFuM20yMDFvNm8yMDFzMmwyMDF0MmwyMDF1MmwyMDF3M20yMDF4M20yMDF5M20yazF0MmwybDIwMm0ybjJuM20ybzNtMnA2bzIwMnE2bzJyMXcyczJsMnQybDJ1M20ydjN0MncxdDJ4MmwyeTF0MnoxdzNrM20zbDNtM20zbTNuM20zbzNtM3AzbTNxM20zcjNtM3MzbTIwM3QybDIwM3UybDN2MmwzdzN0M3gzdDN5M3QzejNtNGs1eDRsNHM0bTRtNG40czRvNHM0cDRtNHEzeDRyNHk0czR5NHQycjR1M200djR5NHc0bTR4NXk0eTRzNHo0eTVrM3g1bDR5NW00czVuM3I1bzRtNXA0czVxNHM1cjZvNXM0czV0NHM1dTRtNXYybDV3MXc1eDJsNXkzdTV6M202azJsNmwzbTZtM3I2bjJ3Nm8zcjZwMnc2cTJsNnIzbTZzM3I2dDF3NnUybDZ2M3I2dzF3Nng1bjZ5M3I2ejNtN2szcjdsM3I3bTJ3N24ycjdvMmw3cDNyN3EzbTdyNHM3czNtN3QzbTd1Mnc3djJyN3cxcTd4MnI3eTNvMjAybDNtY2w0c2FsMmxhbTNtYW4zbWFvM21hcDNtYXIzbWFzMmxhdDR1YXUxeWF2M21hdzN0YXk0dWF6MmxiazJzYmwzdCdmb2YnNm9ibzJsYnAzcmJyMXRiczJsYnUybGJ2M21iejNtY2s0czIwMmszbWNtNHNjbjRzY280c2NwNHNjcTZvY3I0c2NzNG1jdDRtY3U0bWN2NG1jdzJyMm0zcmN5MnJjejJyZGw0c2RtNHlkbjR5ZG80eWRwNHlkcTR5ZHM0eWR0NHNkdTRzZHY0c2R3NHNkejNyZWszbWVsM21lbTNtZW4zbWVvM21lcDNtZXE0c2VyMndlczJ3ZXQyd2V1MndldjJ3ZXcxd2V4MXdleTF3ZXoxd2ZsM3JmbTNtZm4zbWZvM21mcDNtZnEzbWZyM3RmczNtZnQzcmZ1M3JmdjNyZnczcmZ6M20yMDNrNm8yMTJtNm8yZHcybDJjcTJsM3QzbTN1MmwxN3M0czE5bTNtfSdrZXJuaW5nJ3tjbHs0cXQ1a3M1b3Q1cXk1cncxN3N2NXR2fTIwMXR7Y2tzNGxzY21zY25zY29zY3BzY2xzNHd2fTJrezIwMXRzfTJ3ezRxdTVrdTdtdTVvczVxeDVydTE3c3U1dHV9Mnh7MTdzdTV0dTVvdTVxc30yeXs0cXY1a3Y3bXU1b3Q1cXo1cnUxN3N1NXR1fSdmb2YnLTZvN3R7Y2tzY2xzY21zY25zY29zY3BzNGxzfTN1ezE3c3U1dHU1b3M1cXV9M3Z7MTdzdTV0dTVvczVxdX1mdXsxN3N1NXR1NW91NXF1fTdwezE3c3U1dHU1b3U1cXV9Y2t7NHF0NWtzNW90NXF5NXJ3MTdzdjV0dn00bHs0cXQ1a3M1b3Q1cXk1cncxN3N2NXR2fWNtezRxdDVrczVvdDVxeTVydzE3c3Y1dHZ9Y257NHF0NWtzNW90NXF5NXJ3MTdzdjV0dn1jb3s0cXQ1a3M1b3Q1cXk1cncxN3N2NXR2fWNwezRxdDVrczVvdDVxeTVydzE3c3Y1dHZ9Nmx7MTdzdDV0dDVvdTVxdX0xN3N7Y2t1Y2x1Y211Y251Y291Y3B1NGx1NHd1fTVve2NrdWNsdWNtdWNudWNvdWNwdTRsdTR3dX01cXtja3pjbHpjbXpjbnpjb3pjcHo0bHo0d3V9NXJ7Y2t4Y2x4Y214Y254Y294Y3B4NGx4NHd1fTV0e2NrdWNsdWNtdWNudWNvdWNwdTRsdTR3dX03cXtja3VjbHVjbXVjbnVjb3VjcHU0bHV9NnB7MTdzdzV0dzVvdTVxdX1la3sxN3N0NXR0NXF1fWVsezE3c3Q1dHQ1b3U1cXV9ZW17MTdzdDV0dDVxdX1lbnsxN3N0NXR0NXF1fWVvezE3c3Q1dHQ1cXV9ZXB7MTdzdDV0dDVvdTVxdX1lc3sxN3NzNXRzNXF1fWV0ezE3c3c1dHc1b3U1cXV9ZXV7MTdzdzV0dzVvdTVxdX1ldnsxN3NzNXRzNXF1fTZ6ezE3c3c1dHc1b3U1cXU1cnN9Zm17MTdzdzV0dzVvdTVxdTVyc31mbnsxN3N3NXR3NW91NXF1NXJzfWZvezE3c3c1dHc1b3U1cXU1cnN9ZnB7MTdzdzV0dzVvdTVxdTVyc31mcXsxN3N3NXR3NW91NXF1NXJzfTdye2NrdGNsdGNtdGNudGNvdGNwdDRsdDVvc31mc3sxN3N3NXR3NW91NXF1NXJzfWZ0ezE3c3U1dHU1b3U1cXV9N217NW9zfWZ2ezE3c3U1dHU1b3U1cXV9Znd7MTdzdTV0dTVvdTVxdX1mentja3NjbHNjbXNjbnNjb3NjcHM0bHN9fX0iKSxTeW1ib2w6Yygieyd3aWR0aHMne2szdWF3NHIxOW0zbTJrMXQybDJsMjAybTJ5Mm4zbTJwNW4yMDJxNm8zazNtMnMybDJ0MmwydjNyMncxdDNtM20yeTF0Mnoxd2JrMnNibDNyJ2ZvZic2bzNuM20zbzNtM3AzbTNxM20zcjNtM3MzbTN0M20zdTF3M3YxdzN3M3IzeDNyM3kzcjN6MndicDN0M2wzbTV2Mmw1eDJsNXozbTJxNHlmcjNyN3Yzazd3MW83eDNrfSdrZXJuaW5nJ3snZm9mJy02b319IiksSGVsdmV0aWNhOmMoInsnd2lkdGhzJ3trM3AycTRtY3gxdzIwMW4zcjIwMW82bzIwMXMxcTIwMXQxcTIwMXUxcTIwMXcybDIwMXgybDIwMXkybDJrMXcybDF3MjAybTJuMm4zcjJvM3IycDV0MjAycTZvMnIxbjJzMmwydDJsMnUycjJ2M3UydzF3MngybDJ5MXcyejF3M2szcjNsM3IzbTNyM24zcjNvM3IzcDNyM3EzcjNyM3IzczNyMjAzdDJsMjAzdTJsM3YxdzN3M3UzeDN1M3kzdTN6M3I0azZwNGw0bTRtNG00bjRzNG80czRwNG00cTN4NHI0eTRzNHM0dDF3NHUzbTR2NG00dzNyNHg1bjR5NHM0ejR5NWs0bTVsNHk1bTRzNW40bTVvM3g1cDRzNXE0bTVyNXk1czRtNXQ0bTV1M3g1djF3NXcxdzV4MXc1eTJ6NXozcjZrMmw2bDNyNm0zcjZuM202bzNyNnAzcjZxMXc2cjNyNnMzcjZ0MXE2dTFxNnYzbTZ3MXE2eDVuNnkzcjZ6M3I3azNyN2wzcjdtMmw3bjNtN28xdzdwM3I3cTNtN3I0czdzM203dDNtN3UzbTd2Mmw3dzF1N3gybDd5M3UyMDJsM3JjbDRtYWwybGFtM3JhbjNyYW8zcmFwM3JhcjNyYXMybGF0NHRhdTJwYXYzcmF3M3VheTR0YXoybGJrMnNibDN1J2ZvZic2b2JvMmxicDNyYnIxd2JzMmxidTJvYnYzcmJ6M3hjazRtMjAyazNyY200bWNuNG1jbzRtY3A0bWNxNm9jcjRzY3M0bWN0NG1jdTRtY3Y0bWN3MXcybTJuY3kxd2N6MXdkbDRzZG00eWRuNHlkbzR5ZHA0eWRxNHlkczR5ZHQ0c2R1NHNkdjRzZHc0c2R6M3hlazNyZWwzcmVtM3JlbjNyZW8zcmVwM3JlcTV0ZXIzbWVzM3JldDNyZXUzcmV2M3JldzF3ZXgxd2V5MXdlejF3ZmwzcmZtM3JmbjNyZm8zcmZwM3JmcTNyZnIzdWZzM3hmdDNyZnUzcmZ2M3JmdzNyZnozbTIwM2s2bzIxMm02bzJkdzJsMmNxMmwzdDNyM3UxdzE3czRtMTltM3J9J2tlcm5pbmcnezVxezR3dn1jbHs0cXM1a3c1b3c1cXMxN3N2NXR2fTIwMXR7Mnd1NHcxazJ5dX0yMDF4ezJ3dTR3eTJ5dX0xN3N7Mmt0Y2x1Y211Y251NG90Y3B1NGx1NHd5Y291Y2t1fTJ3ezdxczRxejVrMW0xN3N5NW93NXF4NXJzZnN1NXR5N3R1Znp1fTJ4ezE3c3k1dHk1b3k1cXN9Mnl7N3FzNHF6NWsxbTE3c3k1b3c1cXg1cnNmc3U1dHk3dHVmenV9J2ZvZictNm83cHsxN3N2NXR2NW93fWNrezRxczVrdzVvdzVxczE3c3Y1dHZ9NGx7NHFzNWt3NW93NXFzMTdzdjV0dn1jbXs0cXM1a3c1b3c1cXMxN3N2NXR2fWNuezRxczVrdzVvdzVxczE3c3Y1dHZ9Y297NHFzNWt3NW93NXFzMTdzdjV0dn1jcHs0cXM1a3c1b3c1cXMxN3N2NXR2fTZsezE3c3k1dHk1b3d9ZG97MTdzdDV0dH00ensxN3N0NXR0fTdze2ZzdH1kbXsxN3N0NXR0fWRuezE3c3Q1dHR9NW97Y2t3Y2x3Y213Y253Y293Y3B3NGx3NHd2fWRwezE3c3Q1dHR9ZHF7MTdzdDV0dH03dHs1b3d9ZHN7MTdzdDV0dH01dHsya3RjbHVjbXVjbnU0b3RjcHU0bHU0d3ljb3Vja3V9ZnV7MTdzdjV0djVvd302cHsxN3N5NXR5NW93NXFzfWVrezE3c3k1dHk1b3d9ZWx7MTdzeTV0eTVvd31lbXsxN3N5NXR5NW93fWVuezV0eX1lb3sxN3N5NXR5NW93fWVwezE3c3k1dHk1b3d9ZXN7MTdzeTV0eTVxc31ldHsxN3N5NXR5NW93NXFzfWV1ezE3c3k1dHk1b3c1cXN9ZXZ7MTdzeTV0eTVvdzVxc302ensxN3N5NXR5NW93NXFzfWZtezE3c3k1dHk1b3c1cXN9Zm57MTdzeTV0eTVvdzVxc31mb3sxN3N5NXR5NW93NXFzfWZwezE3c3k1dHk1cXN9ZnF7MTdzeTV0eTVvdzVxc303cns1b3d9ZnN7MTdzeTV0eTVvdzVxc31mdHsxN3N2NXR2NW93fTdtezVvd31mdnsxN3N2NXR2NW93fWZ3ezE3c3Y1dHY1b3d9fX0iKSwiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIjpjKCJ7J3dpZHRocyd7azNzMnE0c2N4MXcyMDFuM3IyMDFvNm8yMDFzMXcyMDF0MXcyMDF1MXcyMDF3M20yMDF4M20yMDF5M20yazF3MmwybDIwMm0ybjJuM3IybzNyMnA1dDIwMnE2bzJyMXMyczJsMnQybDJ1MnIydjN1MncxdzJ4MmwyeTF3MnoxdzNrM3IzbDNyM20zcjNuM3IzbzNyM3AzcjNxM3IzcjNyM3MzcjIwM3QybDIwM3UybDN2MmwzdzN1M3gzdTN5M3UzejN4NGs2bDRsNHM0bTRzNG40czRvNHM0cDRtNHEzeDRyNHk0czRzNHQxdzR1M3I0djRzNHczeDR4NW40eTRzNHo0eTVrNG01bDR5NW00czVuNG01bzN4NXA0czVxNG01cjV5NXM0bTV0NG01dTN4NXYybDV3MXc1eDJsNXkzdTV6M3I2azJsNmwzcjZtM3g2bjNyNm8zeDZwM3I2cTJsNnIzeDZzM3g2dDF3NnUxdzZ2M3I2dzF3Nng1dDZ5M3g2ejN4N2szeDdsM3g3bTJyN24zcjdvMmw3cDN4N3EzcjdyNHk3czNyN3Qzcjd1M203djJyN3cxdzd4MnI3eTN1MjAybDNyY2w0c2FsMmxhbTNyYW4zcmFvM3JhcDNyYXIzcmFzMmxhdDR0YXUycGF2M3JhdzN1YXk0dGF6MmxiazJzYmwzdSdmb2YnNm9ibzJsYnAzeGJxM3JicjF3YnMybGJ1Mm9idjNyYnozeGNrNHMyMDJrM3JjbTRzY240c2NvNHNjcDRzY3E2b2NyNHNjczRtY3Q0bWN1NG1jdjRtY3cxdzJtMnpjeTF3Y3oxd2RsNHNkbTR5ZG40eWRvNHlkcDR5ZHE0eWRzNHlkdDRzZHU0c2R2NHNkdzRzZHozeGVrM3JlbDNyZW0zcmVuM3JlbzNyZXAzcmVxNXRlcjNyZXMzcmV0M3JldTNyZXYzcmV3MXdleDF3ZXkxd2V6MXdmbDN4Zm0zeGZuM3hmbzN4ZnAzeGZxM3hmcjN1ZnMzeGZ0M3hmdTN4ZnYzeGZ3M3hmejNyMjAzazZvMjEybTZvMmR3MmwyY3EybDN0M3IzdTJsMTdzNG0xOW0zcn0na2VybmluZyd7Y2x7NHFzNWt1NW90NXFzMTdzdjV0dn0yMDF0ezJ3dzR3eTJ5d30yMDF3ezJrc30yMDF4ezJ3dzR3eTJ5d30ya3syMDF0czIwMXhzfTJ3ezdxczRxdTVrdzVvczVxdzVyczE3c3U1dHU3dHNmenN9Mnh7NW93NXFzfTJ5ezdxczRxdTVrdzVvczVxdzVyczE3c3U1dHU3dHNmenN9J2ZvZictNm83cHsxN3N1NXR1NW90fWNrezRxczVrdTVvdDVxczE3c3Y1dHZ9NGx7NHFzNWt1NW90NXFzMTdzdjV0dn1jbXs0cXM1a3U1b3Q1cXMxN3N2NXR2fWNuezRxczVrdTVvdDVxczE3c3Y1dHZ9Y297NHFzNWt1NW90NXFzMTdzdjV0dn1jcHs0cXM1a3U1b3Q1cXMxN3N2NXR2fTZsezE3c3Q1dHQ1b3N9MTdzezJrd2NsdmNtdmNudmNvdmNwdjRsdjR3d2Nrdn01b3sya3VjbHRjbXRjbnRjb3RjcHQ0bHQ0d3Rja3R9NXF7MmtzY2xzY21zY25zY29zY3BzNGxzNHd2Y2tzfTVyezJrczR3c301dHsya3djbHZjbXZjbnZjb3ZjcHY0bHY0d3dja3Z9ZW97MTdzdDV0dDVvc31mdXsxN3N1NXR1NW90fTZwezE3c3M1dHN9ZWt7MTdzdDV0dDVvc31lbHsxN3N0NXR0NW9zfWVtezE3c3Q1dHQ1b3N9ZW57MTdzdDV0dDVvc302b3syMDF0c31lcHsxN3N0NXR0NW9zfWVzezE3c3M1dHN9ZXR7MTdzczV0c31ldXsxN3NzNXRzfWV2ezE3c3M1dHN9Nnp7MTdzdTV0dTVvczVxdH1mbXsxN3N1NXR1NW9zNXF0fWZuezE3c3U1dHU1b3M1cXR9Zm97MTdzdTV0dTVvczVxdH1mcHsxN3N1NXR1NW9zNXF0fWZxezE3c3U1dHU1b3M1cXR9ZnN7MTdzdTV0dTVvczVxdH1mdHsxN3N1NXR1NW90fTdtezVvc31mdnsxN3N1NXR1NW90fWZ3ezE3c3U1dHU1b3R9fX0iKSxaYXBmRGluZ2JhdHM6Yygieyd3aWR0aHMne2s0dTJrMXcnZm9mJzZvfSdrZXJuaW5nJ3snZm9mJy02b319IiksIkNvdXJpZXItQm9sZCI6Yygieyd3aWR0aHMne2szdydmb2YnNm99J2tlcm5pbmcneydmb2YnLTZvfX0iKSwiVGltZXMtSXRhbGljIjpjKCJ7J3dpZHRocyd7azNuMnE0eWN4MmwyMDFuM20yMDFvNXQyMDFzMmwyMDF0MmwyMDF1MmwyMDF3M3IyMDF4M3IyMDF5M3IyazF0MmwybDIwMm0ybjJuM20ybzNtMnA1bjIwMnE1dDJyMXAyczJsMnQybDJ1M20ydjRuMncxdDJ4MmwyeTF0MnoxdzNrM20zbDNtM20zbTNuM20zbzNtM3AzbTNxM20zcjNtM3MzbTIwM3QybDIwM3UybDN2MmwzdzRuM3g0bjN5NG4zejNtNGs1dzRsM3g0bTN4NG40bTRvNHM0cDN4NHEzeDRyNHM0czRzNHQybDR1Mnc0djRtNHczcjR4NW40eTRtNHo0czVrM3g1bDRzNW0zeDVuM201bzNyNXA0czVxM3g1cjVuNXMzeDV0M3I1dTNyNXYycjV3MXc1eDJyNXkydTV6M202azJsNmwzbTZtM202bjJ3Nm8zbTZwMnc2cTF3NnIzbTZzM202dDF3NnUxdzZ2Mnc2dzF3Nng0czZ5M202ejNtN2szbTdsM203bTJyN24ycjdvMXc3cDNtN3EydzdyNG03czJ3N3Qydzd1MnI3djJzN3cxdjd4MnM3eTNxMjAybDNtY2wzeGFsMnJhbTNtYW4zbWFvM21hcDNtYXIzbWFzMmxhdDR3YXUxdmF2M21hdzRuYXk0d2F6MmxiazJzYmw0bidmb2YnNm9ibzJsYnAzbWJxM29icjF0YnMybGJ1MXpidjNtYnozbWNrM3gyMDJrM21jbTN4Y24zeGNvM3hjcDN4Y3E1dGNyNG1jczN4Y3QzeGN1M3hjdjN4Y3cybDJtMnVjeTJsY3oybGRsNG1kbTRzZG40c2RvNHNkcDRzZHE0c2RzNHNkdDRzZHU0c2R2NHNkdzRzZHozbWVrM21lbDNtZW0zbWVuM21lbzNtZXAzbWVxNG1lcjJ3ZXMyd2V0MndldTJ3ZXYyd2V3MXdleDF3ZXkxd2V6MXdmbDNtZm0zbWZuM21mbzNtZnAzbWZxM21mcjRuZnMzbWZ0M21mdTNtZnYzbWZ3M21mejJ3MjAzazZvMjEybTZtMmR3MmwyY3EybDN0M20zdTJsMTdzM3IxOW0zbX0na2VybmluZyd7Y2x7NWt0NHF3fTIwMXN7MjAxc3d9MjAxdHsyMDF0dzJ3eTJ5eTZxLXR9MjAxeHsyd3kyeXl9Mmt7MjAxdHd9Mnd7N3FzNHF5N3JzNWt5N213NW9zNXF4NXJ1MTdzdTV0dX0yeHsxN3NzNXRzNW9zfTJ5ezdxczRxeTdyczVreTdtdzVvczVxeDVydTE3c3U1dHV9J2ZvZictNm82dHsxN3NzNXRzNXFzfTd0ezVvc30zdns1cXN9N3B7MTdzdTV0dTVxc31ja3s1a3Q0cXd9NGx7NWt0NHF3fWNtezVrdDRxd31jbns1a3Q0cXd9Y297NWt0NHF3fWNwezVrdDRxd302bHs0cXM1a3M1b3U1cXc1cnUxN3N1NXR1fTE3c3sya3N9NXF7Y2t2Y2x2Y212Y252Y292Y3B2NGx2fTVye2NrdWNsdWNtdWNudWNvdWNwdTRsdX01dHsya3N9NnB7NHFzNWtzNW91NXF3NXJ1MTdzdTV0dX1la3s0cXM1a3M1b3U1cXc1cnUxN3N1NXR1fWVsezRxczVrczVvdTVxdzVydTE3c3U1dHV9ZW17NHFzNWtzNW91NXF3NXJ1MTdzdTV0dX1lbns0cXM1a3M1b3U1cXc1cnUxN3N1NXR1fWVvezRxczVrczVvdTVxdzVydTE3c3U1dHV9ZXB7NHFzNWtzNW91NXF3NXJ1MTdzdTV0dX1lc3s1a3M1cXM0cXN9ZXR7NHFzNWtzNW91NXF3NXJ1MTdzdTV0dX1ldXs0cXM1a3M1cXc1cnUxN3N1NXR1fWV2ezVrczVxczRxc31leHsxN3NzNXRzNXFzfTZ6ezRxdjVrczVvdTVxdzVydTE3c3U1dHV9Zm17NHF2NWtzNW91NXF3NXJ1MTdzdTV0dX1mbns0cXY1a3M1b3U1cXc1cnUxN3N1NXR1fWZvezRxdjVrczVvdTVxdzVydTE3c3U1dHV9ZnB7NHF2NWtzNW91NXF3NXJ1MTdzdTV0dX1mcXs0cXY1a3M1b3U1cXc1cnUxN3N1NXR1fTdyezVvc31mc3s0cXY1a3M1b3U1cXc1cnUxN3N1NXR1fWZ0ezE3c3U1dHU1cXN9ZnV7MTdzdTV0dTVxc31mdnsxN3N1NXR1NXFzfWZ3ezE3c3U1dHU1cXN9fX0iKSwiVGltZXMtUm9tYW4iOmMoInsnd2lkdGhzJ3trM24ycTR5Y3gybDIwMW4zbTIwMW82bzIwMXMybDIwMXQybDIwMXUybDIwMXcydzIwMXgydzIwMXkydzJrMXQybDJsMjAybTJuMm4zbTJvM20ycDVuMjAycTZvMnIxbTJzMmwydDJsMnUzbTJ2M3MydzF0MngybDJ5MXQyejF3M2szbTNsM20zbTNtM24zbTNvM20zcDNtM3EzbTNyM20zczNtMjAzdDJsMjAzdTJsM3YxdzN3M3MzeDNzM3kzczN6Mnc0azV3NGw0czRtNG00bjRtNG80czRwM3g0cTNyNHI0czRzNHM0dDJsNHUycjR2NHM0dzN4NHg1dDR5NHM0ejRzNWszcjVsNHM1bTRtNW4zcjVvM3g1cDRzNXE0czVyNXk1czRzNXQ0czV1M3g1djJsNXcxdzV4Mmw1eTJ6NXozbTZrMmw2bDJ3Nm0zbTZuMnc2bzNtNnAydzZxMmw2cjNtNnMzbTZ0MXc2dTF3NnYzbTZ3MXc2eDR5NnkzbTZ6M203azNtN2wzbTdtMmw3bjJyN28xdzdwM203cTNtN3I0czdzM203dDNtN3Uydzd2M2s3dzFvN3gzazd5M3EyMDJsM21jbDRzYWwybGFtM21hbjNtYW8zbWFwM21hcjNtYXMybGF0NHdhdTF2YXYzbWF3M3NheTR3YXoybGJrMnNibDNzJ2ZvZic2b2JvMmxicDNtYnEyeGJyMXRiczJsYnUxemJ2M21iejJ3Y2s0czIwMmszbWNtNHNjbjRzY280c2NwNHNjcTV0Y3I0bWNzM3hjdDN4Y3UzeGN2M3hjdzJsMm0ydGN5MmxjejJsZGw0c2RtNHNkbjRzZG80c2RwNHNkcTRzZHM0c2R0NHNkdTRzZHY0c2R3NHNkejNtZWsyd2VsMndlbTJ3ZW4yd2VvMndlcDJ3ZXE0bWVyMndlczJ3ZXQyd2V1MndldjJ3ZXcxd2V4MXdleTF3ZXoxd2ZsM21mbTNtZm4zbWZvM21mcDNtZnEzbWZyM3NmczNtZnQzbWZ1M21mdjNtZnczbWZ6M20yMDNrNm8yMTJtNm0yZHcybDJjcTJsM3QzbTN1MXcxN3M0czE5bTNtfSdrZXJuaW5nJ3tjbHs0cXM1a3UxN3N3NW91NXF5NXJ3MjAxc3M1dHcyMDF3c30yMDFzezIwMXNzfTIwMXR7Y2t3NGx3Y213Y253Y293Y3B3Y2x3NHd1MjAxdHN9Mmt7MjAxdHN9Mnd7NHFzNWt3NW9zNXF4NXJ1MTdzeDV0eH0yeHsxN3N3NXR3NW91NXF1fTJ5ezRxczVrdzVvczVxeDVydTE3c3g1dHh9J2ZvZictNm83dHtja3VjbHVjbXVjbnVjb3VjcHU0bHU1b3M1cnN9M3V7MTdzdTV0dTVxc30zdnsxN3N1NXR1NXFzfTdwezE3c3c1dHc1cXN9Y2t7NHFzNWt1MTdzdzVvdTVxeTVydzIwMXNzNXR3MjAxd3N9NGx7NHFzNWt1MTdzdzVvdTVxeTVydzIwMXNzNXR3MjAxd3N9Y217NHFzNWt1MTdzdzVvdTVxeTVydzIwMXNzNXR3MjAxd3N9Y257NHFzNWt1MTdzdzVvdTVxeTVydzIwMXNzNXR3MjAxd3N9Y297NHFzNWt1MTdzdzVvdTVxeTVydzIwMXNzNXR3MjAxd3N9Y3B7NHFzNWt1MTdzdzVvdTVxeTVydzIwMXNzNXR3MjAxd3N9Nmx7MTdzdTV0dTVvczVxdzVyc30xN3N7Mmt0Y2x2Y212Y252Y292Y3B2NGx2NHd1Y2t2fTVve2Nrd2Nsd2Ntd2Nud2Nvd2NwdzRsdzR3dX01cXtja3ljbHljbXljbnljb3ljcHk0bHk0d3U1bXN9NXJ7Y2t0Y2x0Y210Y250Y290Y3B0NGx0NHdzfTV0ezJrdGNsdmNtdmNudmNvdmNwdjRsdjR3dWNrdn03cXtja3NjbHNjbXNjbnNjb3NjcHM0bHN9NnB7MTdzdTV0dTVxdzVyc31la3s1cXM1cnN9ZWx7MTdzdTV0dTVvczVxdzVyc31lbXsxN3N1NXR1NW9zNXFzNXJzfWVuezE3c3U1cXM1cnN9ZW97NXFzNXJzfWVwezE3c3U1dHU1b3M1cXc1cnN9ZXN7NXFzfWV0ezE3c3U1dHU1cXc1cnN9ZXV7MTdzdTV0dTVxczVyc31ldns1cXN9Nnp7MTdzdjV0djVvczVxeDVyc31mbXs1b3M1cXQ1cnN9Zm57MTdzdjV0djVvczVxeDVyc31mb3sxN3N2NXR2NW9zNXF4NXJzfWZwezVvczVxdDVyc31mcXs1b3M1cXQ1cnN9N3J7Y2t1Y2x1Y211Y251Y291Y3B1NGx1NW9zfWZzezE3c3Y1dHY1b3M1cXg1cnN9ZnR7MTdzczV0czVxc31mdXsxN3N3NXR3NXFzfWZ2ezE3c3c1dHc1cXN9Znd7MTdzczV0czVxc31mentja3VjbHVjbXVjbnVjb3VjcHU0bHU1b3M1cnN9fX0iKSwiSGVsdmV0aWNhLU9ibGlxdWUiOmMoInsnd2lkdGhzJ3trM3AycTRtY3gxdzIwMW4zcjIwMW82bzIwMXMxcTIwMXQxcTIwMXUxcTIwMXcybDIwMXgybDIwMXkybDJrMXcybDF3MjAybTJuMm4zcjJvM3IycDV0MjAycTZvMnIxbjJzMmwydDJsMnUycjJ2M3UydzF3MngybDJ5MXcyejF3M2szcjNsM3IzbTNyM24zcjNvM3IzcDNyM3EzcjNyM3IzczNyMjAzdDJsMjAzdTJsM3YxdzN3M3UzeDN1M3kzdTN6M3I0azZwNGw0bTRtNG00bjRzNG80czRwNG00cTN4NHI0eTRzNHM0dDF3NHUzbTR2NG00dzNyNHg1bjR5NHM0ejR5NWs0bTVsNHk1bTRzNW40bTVvM3g1cDRzNXE0bTVyNXk1czRtNXQ0bTV1M3g1djF3NXcxdzV4MXc1eTJ6NXozcjZrMmw2bDNyNm0zcjZuM202bzNyNnAzcjZxMXc2cjNyNnMzcjZ0MXE2dTFxNnYzbTZ3MXE2eDVuNnkzcjZ6M3I3azNyN2wzcjdtMmw3bjNtN28xdzdwM3I3cTNtN3I0czdzM203dDNtN3UzbTd2Mmw3dzF1N3gybDd5M3UyMDJsM3JjbDRtYWwybGFtM3JhbjNyYW8zcmFwM3JhcjNyYXMybGF0NHRhdTJwYXYzcmF3M3VheTR0YXoybGJrMnNibDN1J2ZvZic2b2JvMmxicDNyYnIxd2JzMmxidTJvYnYzcmJ6M3hjazRtMjAyazNyY200bWNuNG1jbzRtY3A0bWNxNm9jcjRzY3M0bWN0NG1jdTRtY3Y0bWN3MXcybTJuY3kxd2N6MXdkbDRzZG00eWRuNHlkbzR5ZHA0eWRxNHlkczR5ZHQ0c2R1NHNkdjRzZHc0c2R6M3hlazNyZWwzcmVtM3JlbjNyZW8zcmVwM3JlcTV0ZXIzbWVzM3JldDNyZXUzcmV2M3JldzF3ZXgxd2V5MXdlejF3ZmwzcmZtM3JmbjNyZm8zcmZwM3JmcTNyZnIzdWZzM3hmdDNyZnUzcmZ2M3JmdzNyZnozbTIwM2s2bzIxMm02bzJkdzJsMmNxMmwzdDNyM3UxdzE3czRtMTltM3J9J2tlcm5pbmcnezVxezR3dn1jbHs0cXM1a3c1b3c1cXMxN3N2NXR2fTIwMXR7Mnd1NHcxazJ5dX0yMDF4ezJ3dTR3eTJ5dX0xN3N7Mmt0Y2x1Y211Y251NG90Y3B1NGx1NHd5Y291Y2t1fTJ3ezdxczRxejVrMW0xN3N5NW93NXF4NXJzZnN1NXR5N3R1Znp1fTJ4ezE3c3k1dHk1b3k1cXN9Mnl7N3FzNHF6NWsxbTE3c3k1b3c1cXg1cnNmc3U1dHk3dHVmenV9J2ZvZictNm83cHsxN3N2NXR2NW93fWNrezRxczVrdzVvdzVxczE3c3Y1dHZ9NGx7NHFzNWt3NW93NXFzMTdzdjV0dn1jbXs0cXM1a3c1b3c1cXMxN3N2NXR2fWNuezRxczVrdzVvdzVxczE3c3Y1dHZ9Y297NHFzNWt3NW93NXFzMTdzdjV0dn1jcHs0cXM1a3c1b3c1cXMxN3N2NXR2fTZsezE3c3k1dHk1b3d9ZG97MTdzdDV0dH00ensxN3N0NXR0fTdze2ZzdH1kbXsxN3N0NXR0fWRuezE3c3Q1dHR9NW97Y2t3Y2x3Y213Y253Y293Y3B3NGx3NHd2fWRwezE3c3Q1dHR9ZHF7MTdzdDV0dH03dHs1b3d9ZHN7MTdzdDV0dH01dHsya3RjbHVjbXVjbnU0b3RjcHU0bHU0d3ljb3Vja3V9ZnV7MTdzdjV0djVvd302cHsxN3N5NXR5NW93NXFzfWVrezE3c3k1dHk1b3d9ZWx7MTdzeTV0eTVvd31lbXsxN3N5NXR5NW93fWVuezV0eX1lb3sxN3N5NXR5NW93fWVwezE3c3k1dHk1b3d9ZXN7MTdzeTV0eTVxc31ldHsxN3N5NXR5NW93NXFzfWV1ezE3c3k1dHk1b3c1cXN9ZXZ7MTdzeTV0eTVvdzVxc302ensxN3N5NXR5NW93NXFzfWZtezE3c3k1dHk1b3c1cXN9Zm57MTdzeTV0eTVvdzVxc31mb3sxN3N5NXR5NW93NXFzfWZwezE3c3k1dHk1cXN9ZnF7MTdzeTV0eTVvdzVxc303cns1b3d9ZnN7MTdzeTV0eTVvdzVxc31mdHsxN3N2NXR2NW93fTdtezVvd31mdnsxN3N2NXR2NW93fWZ3ezE3c3Y1dHY1b3d9fX0iKX19O3QuZXZlbnRzLnB1c2goWyJhZGRGb250IixmdW5jdGlvbih0KXt2YXIgZT10LmZvbnQscj1oLlVuaWNvZGVbZS5wb3N0U2NyaXB0TmFtZV07ciYmKGUubWV0YWRhdGEuVW5pY29kZT17fSxlLm1ldGFkYXRhLlVuaWNvZGUud2lkdGhzPXIud2lkdGhzLGUubWV0YWRhdGEuVW5pY29kZS5rZXJuaW5nPXIua2VybmluZyk7dmFyIG49bC5Vbmljb2RlW2UucG9zdFNjcmlwdE5hbWVdO24mJihlLm1ldGFkYXRhLlVuaWNvZGUuZW5jb2Rpbmc9bixlLmVuY29kaW5nPW4uY29kZVBhZ2VzWzBdKX1dKX0oTS5BUEkpLAovKioKICAgKiBAbGljZW5zZQogICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4KICAgKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UKICAgKi8KZnVuY3Rpb24odCl7dmFyIGU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQubGVuZ3RoLHI9bmV3IFVpbnQ4QXJyYXkoZSksbj0wO248ZTtuKyspcltuXT10LmNoYXJDb2RlQXQobik7cmV0dXJuIHJ9O3QuQVBJLmV2ZW50cy5wdXNoKFsiYWRkRm9udCIsZnVuY3Rpb24ocil7dmFyIG49dm9pZCAwLGk9ci5mb250LGE9ci5pbnN0YW5jZTtpZighaS5pc1N0YW5kYXJkRm9udCl7aWYodm9pZCAwPT09YSl0aHJvdyBuZXcgRXJyb3IoIkZvbnQgZG9lcyBub3QgZXhpc3QgaW4gdkZTLCBpbXBvcnQgZm9udHMgb3IgcmVtb3ZlIGRlY2xhcmF0aW9uIGRvYy5hZGRGb250KCciK2kucG9zdFNjcmlwdE5hbWUrIicpLiIpO2lmKCJzdHJpbmciIT10eXBlb2Yobj0hMT09PWEuZXhpc3RzRmlsZUluVkZTKGkucG9zdFNjcmlwdE5hbWUpP2EubG9hZEZpbGUoaS5wb3N0U2NyaXB0TmFtZSk6YS5nZXRGaWxlRnJvbVZGUyhpLnBvc3RTY3JpcHROYW1lKSkpdGhyb3cgbmV3IEVycm9yKCJGb250IGlzIG5vdCBzdG9yZWQgYXMgc3RyaW5nLWRhdGEgaW4gdkZTLCBpbXBvcnQgZm9udHMgb3IgcmVtb3ZlIGRlY2xhcmF0aW9uIGRvYy5hZGRGb250KCciK2kucG9zdFNjcmlwdE5hbWUrIicpLiIpOyFmdW5jdGlvbihyLG4pe249L15ceDAwXHgwMVx4MDBceDAwLy50ZXN0KG4pP2Uobik6ZShjKG4pKSxyLm1ldGFkYXRhPXQuQVBJLlRURkZvbnQub3BlbihuKSxyLm1ldGFkYXRhLlVuaWNvZGU9ci5tZXRhZGF0YS5Vbmljb2RlfHx7ZW5jb2Rpbmc6e30sa2VybmluZzp7fSx3aWR0aHM6W119LHIubWV0YWRhdGEuZ2x5SWRzVXNlZD1bMF19KGksbil9fV0pfShNKSxmdW5jdGlvbihuKXtmdW5jdGlvbiBhKCl7cmV0dXJuKHIuY2Fudmc/UHJvbWlzZS5yZXNvbHZlKHIuY2FudmcpOiJvYmplY3QiPT09KHZvaWQgMD09PXQ/InVuZGVmaW5lZCI6ZSh0KSkmJiJ1bmRlZmluZWQiIT10eXBlb2YgbW9kdWxlP25ldyBQcm9taXNlKChmdW5jdGlvbih0LGUpe3RyeXt0KHJlcXVpcmUoImNhbnZnIikpfWNhdGNoKHQpe2UodCl9fSkpOiJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/bmV3IFByb21pc2UoKGZ1bmN0aW9uKHQsZSl7dHJ5e3JlcXVpcmUoWyJjYW52ZyJdLHQpfWNhdGNoKHQpe2UodCl9fSkpOlByb21pc2UucmVqZWN0KG5ldyBFcnJvcigiQ291bGQgbm90IGxvYWQgY2FudmciKSkpLmNhdGNoKChmdW5jdGlvbih0KXtyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCJDb3VsZCBub3QgbG9hZCBjYW52ZzogIit0KSl9KSkudGhlbigoZnVuY3Rpb24odCl7cmV0dXJuIHQuZGVmYXVsdD90LmRlZmF1bHQ6dH0pKX1uLmFkZFN2Z0FzSW1hZ2U9ZnVuY3Rpb24odCxlLHIsbixvLHMsYyx1KXtpZihpc05hTihlKXx8aXNOYU4ocikpdGhyb3cgaS5lcnJvcigianNQREYuYWRkU3ZnQXNJbWFnZTogSW52YWxpZCBjb29yZGluYXRlcyIsYXJndW1lbnRzKSxuZXcgRXJyb3IoIkludmFsaWQgY29vcmRpbmF0ZXMgcGFzc2VkIHRvIGpzUERGLmFkZFN2Z0FzSW1hZ2UiKTtpZihpc05hTihuKXx8aXNOYU4obykpdGhyb3cgaS5lcnJvcigianNQREYuYWRkU3ZnQXNJbWFnZTogSW52YWxpZCBtZWFzdXJlbWVudHMiLGFyZ3VtZW50cyksbmV3IEVycm9yKCJJbnZhbGlkIG1lYXN1cmVtZW50cyAod2lkdGggYW5kL29yIGhlaWdodCkgcGFzc2VkIHRvIGpzUERGLmFkZFN2Z0FzSW1hZ2UiKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTtsLndpZHRoPW4sbC5oZWlnaHQ9bzt2YXIgaD1sLmdldENvbnRleHQoIjJkIik7aC5maWxsU3R5bGU9IiNmZmYiLGguZmlsbFJlY3QoMCwwLGwud2lkdGgsbC5oZWlnaHQpO3ZhciBmPXtpZ25vcmVNb3VzZTohMCxpZ25vcmVBbmltYXRpb246ITAsaWdub3JlRGltZW5zaW9uczohMH0sZD10aGlzO3JldHVybiBhKCkudGhlbigoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZnJvbVN0cmluZyhoLHQsZil9KSwoZnVuY3Rpb24oKXtyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCJDb3VsZCBub3QgbG9hZCBjYW52Zy4iKSl9KSkudGhlbigoZnVuY3Rpb24odCl7cmV0dXJuIHQucmVuZGVyKGYpfSkpLnRoZW4oKGZ1bmN0aW9uKCl7ZC5hZGRJbWFnZShsLnRvRGF0YVVSTCgiaW1hZ2UvanBlZyIsMSksZSxyLG4sbyxjLHUpfSkpfX0oTS5BUEkpLAovKioKICAgKiBAbGljZW5zZQogICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICogQ29weXJpZ2h0IChjKSAyMDEzIEVkdWFyZG8gTWVuZXplcyBkZSBNb3JhaXMsIGVkdWFyZG8ubW9yYWlzQHVzcC5icgogICAqCiAgICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCiAgICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCiAgICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwogICAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKICAgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KICAgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KICAgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAgICoKICAgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQogICAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgogICAqCiAgICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCiAgICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCiAgICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKICAgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFCiAgICogTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgogICAqIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgogICAqIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgogICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICovCmZ1bmN0aW9uKHQpe3QucHV0VG90YWxQYWdlcz1mdW5jdGlvbih0KXt2YXIgZSxyPTA7cGFyc2VJbnQodGhpcy5pbnRlcm5hbC5nZXRGb250KCkuaWQuc3Vic3RyKDEpLDEwKTwxNT8oZT1uZXcgUmVnRXhwKHQsImciKSxyPXRoaXMuaW50ZXJuYWwuZ2V0TnVtYmVyT2ZQYWdlcygpKTooZT1uZXcgUmVnRXhwKHRoaXMucGRmRXNjYXBlMTYodCx0aGlzLmludGVybmFsLmdldEZvbnQoKSksImciKSxyPXRoaXMucGRmRXNjYXBlMTYodGhpcy5pbnRlcm5hbC5nZXROdW1iZXJPZlBhZ2VzKCkrIiIsdGhpcy5pbnRlcm5hbC5nZXRGb250KCkpKTtmb3IodmFyIG49MTtuPD10aGlzLmludGVybmFsLmdldE51bWJlck9mUGFnZXMoKTtuKyspZm9yKHZhciBpPTA7aTx0aGlzLmludGVybmFsLnBhZ2VzW25dLmxlbmd0aDtpKyspdGhpcy5pbnRlcm5hbC5wYWdlc1tuXVtpXT10aGlzLmludGVybmFsLnBhZ2VzW25dW2ldLnJlcGxhY2UoZSxyKTtyZXR1cm4gdGhpc319KE0uQVBJKSxmdW5jdGlvbih0KXt0LnZpZXdlclByZWZlcmVuY2VzPWZ1bmN0aW9uKHQscil7dmFyIG47dD10fHx7fSxyPXJ8fCExO3ZhciBpLGEsbyxzPXtIaWRlVG9vbGJhcjp7ZGVmYXVsdFZhbHVlOiExLHZhbHVlOiExLHR5cGU6ImJvb2xlYW4iLGV4cGxpY2l0U2V0OiExLHZhbHVlU2V0OlshMCwhMV0scGRmVmVyc2lvbjoxLjN9LEhpZGVNZW51YmFyOntkZWZhdWx0VmFsdWU6ITEsdmFsdWU6ITEsdHlwZToiYm9vbGVhbiIsZXhwbGljaXRTZXQ6ITEsdmFsdWVTZXQ6WyEwLCExXSxwZGZWZXJzaW9uOjEuM30sSGlkZVdpbmRvd1VJOntkZWZhdWx0VmFsdWU6ITEsdmFsdWU6ITEsdHlwZToiYm9vbGVhbiIsZXhwbGljaXRTZXQ6ITEsdmFsdWVTZXQ6WyEwLCExXSxwZGZWZXJzaW9uOjEuM30sRml0V2luZG93OntkZWZhdWx0VmFsdWU6ITEsdmFsdWU6ITEsdHlwZToiYm9vbGVhbiIsZXhwbGljaXRTZXQ6ITEsdmFsdWVTZXQ6WyEwLCExXSxwZGZWZXJzaW9uOjEuM30sQ2VudGVyV2luZG93OntkZWZhdWx0VmFsdWU6ITEsdmFsdWU6ITEsdHlwZToiYm9vbGVhbiIsZXhwbGljaXRTZXQ6ITEsdmFsdWVTZXQ6WyEwLCExXSxwZGZWZXJzaW9uOjEuM30sRGlzcGxheURvY1RpdGxlOntkZWZhdWx0VmFsdWU6ITEsdmFsdWU6ITEsdHlwZToiYm9vbGVhbiIsZXhwbGljaXRTZXQ6ITEsdmFsdWVTZXQ6WyEwLCExXSxwZGZWZXJzaW9uOjEuNH0sTm9uRnVsbFNjcmVlblBhZ2VNb2RlOntkZWZhdWx0VmFsdWU6IlVzZU5vbmUiLHZhbHVlOiJVc2VOb25lIix0eXBlOiJuYW1lIixleHBsaWNpdFNldDohMSx2YWx1ZVNldDpbIlVzZU5vbmUiLCJVc2VPdXRsaW5lcyIsIlVzZVRodW1icyIsIlVzZU9DIl0scGRmVmVyc2lvbjoxLjN9LERpcmVjdGlvbjp7ZGVmYXVsdFZhbHVlOiJMMlIiLHZhbHVlOiJMMlIiLHR5cGU6Im5hbWUiLGV4cGxpY2l0U2V0OiExLHZhbHVlU2V0OlsiTDJSIiwiUjJMIl0scGRmVmVyc2lvbjoxLjN9LFZpZXdBcmVhOntkZWZhdWx0VmFsdWU6IkNyb3BCb3giLHZhbHVlOiJDcm9wQm94Iix0eXBlOiJuYW1lIixleHBsaWNpdFNldDohMSx2YWx1ZVNldDpbIk1lZGlhQm94IiwiQ3JvcEJveCIsIlRyaW1Cb3giLCJCbGVlZEJveCIsIkFydEJveCJdLHBkZlZlcnNpb246MS40fSxWaWV3Q2xpcDp7ZGVmYXVsdFZhbHVlOiJDcm9wQm94Iix2YWx1ZToiQ3JvcEJveCIsdHlwZToibmFtZSIsZXhwbGljaXRTZXQ6ITEsdmFsdWVTZXQ6WyJNZWRpYUJveCIsIkNyb3BCb3giLCJUcmltQm94IiwiQmxlZWRCb3giLCJBcnRCb3giXSxwZGZWZXJzaW9uOjEuNH0sUHJpbnRBcmVhOntkZWZhdWx0VmFsdWU6IkNyb3BCb3giLHZhbHVlOiJDcm9wQm94Iix0eXBlOiJuYW1lIixleHBsaWNpdFNldDohMSx2YWx1ZVNldDpbIk1lZGlhQm94IiwiQ3JvcEJveCIsIlRyaW1Cb3giLCJCbGVlZEJveCIsIkFydEJveCJdLHBkZlZlcnNpb246MS40fSxQcmludENsaXA6e2RlZmF1bHRWYWx1ZToiQ3JvcEJveCIsdmFsdWU6IkNyb3BCb3giLHR5cGU6Im5hbWUiLGV4cGxpY2l0U2V0OiExLHZhbHVlU2V0OlsiTWVkaWFCb3giLCJDcm9wQm94IiwiVHJpbUJveCIsIkJsZWVkQm94IiwiQXJ0Qm94Il0scGRmVmVyc2lvbjoxLjR9LFByaW50U2NhbGluZzp7ZGVmYXVsdFZhbHVlOiJBcHBEZWZhdWx0Iix2YWx1ZToiQXBwRGVmYXVsdCIsdHlwZToibmFtZSIsZXhwbGljaXRTZXQ6ITEsdmFsdWVTZXQ6WyJBcHBEZWZhdWx0IiwiTm9uZSJdLHBkZlZlcnNpb246MS42fSxEdXBsZXg6e2RlZmF1bHRWYWx1ZToiIix2YWx1ZToibm9uZSIsdHlwZToibmFtZSIsZXhwbGljaXRTZXQ6ITEsdmFsdWVTZXQ6WyJTaW1wbGV4IiwiRHVwbGV4RmxpcFNob3J0RWRnZSIsIkR1cGxleEZsaXBMb25nRWRnZSIsIm5vbmUiXSxwZGZWZXJzaW9uOjEuN30sUGlja1RyYXlCeVBERlNpemU6e2RlZmF1bHRWYWx1ZTohMSx2YWx1ZTohMSx0eXBlOiJib29sZWFuIixleHBsaWNpdFNldDohMSx2YWx1ZVNldDpbITAsITFdLHBkZlZlcnNpb246MS43fSxQcmludFBhZ2VSYW5nZTp7ZGVmYXVsdFZhbHVlOiIiLHZhbHVlOiIiLHR5cGU6ImFycmF5IixleHBsaWNpdFNldDohMSx2YWx1ZVNldDpudWxsLHBkZlZlcnNpb246MS43fSxOdW1Db3BpZXM6e2RlZmF1bHRWYWx1ZToxLHZhbHVlOjEsdHlwZToiaW50ZWdlciIsZXhwbGljaXRTZXQ6ITEsdmFsdWVTZXQ6bnVsbCxwZGZWZXJzaW9uOjEuN319LGM9T2JqZWN0LmtleXMocyksdT1bXSxsPTAsaD0wLGY9MDtmdW5jdGlvbiBkKHQsZSl7dmFyIHIsbj0hMTtmb3Iocj0wO3I8dC5sZW5ndGg7cis9MSl0W3JdPT09ZSYmKG49ITApO3JldHVybiBufWlmKHZvaWQgMD09PXRoaXMuaW50ZXJuYWwudmlld2VycHJlZmVyZW5jZXMmJih0aGlzLmludGVybmFsLnZpZXdlcnByZWZlcmVuY2VzPXt9LHRoaXMuaW50ZXJuYWwudmlld2VycHJlZmVyZW5jZXMuY29uZmlndXJhdGlvbj1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHMpKSx0aGlzLmludGVybmFsLnZpZXdlcnByZWZlcmVuY2VzLmlzU3Vic2NyaWJlZD0hMSksbj10aGlzLmludGVybmFsLnZpZXdlcnByZWZlcmVuY2VzLmNvbmZpZ3VyYXRpb24sInJlc2V0Ij09PXR8fCEwPT09cil7dmFyIHA9Yy5sZW5ndGg7Zm9yKGY9MDtmPHA7Zis9MSluW2NbZl1dLnZhbHVlPW5bY1tmXV0uZGVmYXVsdFZhbHVlLG5bY1tmXV0uZXhwbGljaXRTZXQ9ITF9aWYoIm9iamVjdCI9PT1lKHQpKWZvcihhIGluIHQpaWYobz10W2FdLGQoYyxhKSYmdm9pZCAwIT09byl7aWYoImJvb2xlYW4iPT09blthXS50eXBlJiYiYm9vbGVhbiI9PXR5cGVvZiBvKW5bYV0udmFsdWU9bztlbHNlIGlmKCJuYW1lIj09PW5bYV0udHlwZSYmZChuW2FdLnZhbHVlU2V0LG8pKW5bYV0udmFsdWU9bztlbHNlIGlmKCJpbnRlZ2VyIj09PW5bYV0udHlwZSYmTnVtYmVyLmlzSW50ZWdlcihvKSluW2FdLnZhbHVlPW87ZWxzZSBpZigiYXJyYXkiPT09blthXS50eXBlKXtmb3IobD0wO2w8by5sZW5ndGg7bCs9MSlpZihpPSEwLDE9PT1vW2xdLmxlbmd0aCYmIm51bWJlciI9PXR5cGVvZiBvW2xdWzBdKXUucHVzaChTdHJpbmcob1tsXS0xKSk7ZWxzZSBpZihvW2xdLmxlbmd0aD4xKXtmb3IoaD0wO2g8b1tsXS5sZW5ndGg7aCs9MSkibnVtYmVyIiE9dHlwZW9mIG9bbF1baF0mJihpPSExKTshMD09PWkmJnUucHVzaChbb1tsXVswXS0xLG9bbF1bMV0tMV0uam9pbigiICIpKX1uW2FdLnZhbHVlPSJbIit1LmpvaW4oIiAiKSsiXSJ9ZWxzZSBuW2FdLnZhbHVlPW5bYV0uZGVmYXVsdFZhbHVlO25bYV0uZXhwbGljaXRTZXQ9ITB9cmV0dXJuITE9PT10aGlzLmludGVybmFsLnZpZXdlcnByZWZlcmVuY2VzLmlzU3Vic2NyaWJlZCYmKHRoaXMuaW50ZXJuYWwuZXZlbnRzLnN1YnNjcmliZSgicHV0Q2F0YWxvZyIsKGZ1bmN0aW9uKCl7dmFyIHQsZT1bXTtmb3IodCBpbiBuKSEwPT09blt0XS5leHBsaWNpdFNldCYmKCJuYW1lIj09PW5bdF0udHlwZT9lLnB1c2goIi8iK3QrIiAvIituW3RdLnZhbHVlKTplLnB1c2goIi8iK3QrIiAiK25bdF0udmFsdWUpKTswIT09ZS5sZW5ndGgmJnRoaXMuaW50ZXJuYWwud3JpdGUoIi9WaWV3ZXJQcmVmZXJlbmNlc1xuPDxcbiIrZS5qb2luKCJcbiIpKyJcbj4+Iil9KSksdGhpcy5pbnRlcm5hbC52aWV3ZXJwcmVmZXJlbmNlcy5pc1N1YnNjcmliZWQ9ITApLHRoaXMuaW50ZXJuYWwudmlld2VycHJlZmVyZW5jZXMuY29uZmlndXJhdGlvbj1uLHRoaXN9fShNLkFQSSksCi8qKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAqIEBsaWNlbnNlCiAgICoganNQREYgWE1QIG1ldGFkYXRhIHBsdWdpbgogICAqIENvcHlyaWdodCAoYykgMjAxNiBKdXNzaSBVdHVuZW4sIHUtanVzc2lAc3VvbWkyNC5maQogICAqCiAgICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCiAgICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCiAgICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwogICAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKICAgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KICAgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KICAgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAgICoKICAgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQogICAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgogICAqCiAgICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCiAgICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCiAgICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKICAgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFCiAgICogTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgogICAqIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgogICAqIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgogICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICovCmZ1bmN0aW9uKHQpe3ZhciBlPWZ1bmN0aW9uKCl7dmFyIHQ9JzxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+PHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6anNwZGY9IicrdGhpcy5pbnRlcm5hbC5fX21ldGFkYXRhX18ubmFtZXNwYWNldXJpKyciPjxqc3BkZjptZXRhZGF0YT4nLGU9dW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KCc8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIj4nKSkscj11bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQodCkpLG49dW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuaW50ZXJuYWwuX19tZXRhZGF0YV9fLm1ldGFkYXRhKSksaT11bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoIjwvanNwZGY6bWV0YWRhdGE+PC9yZGY6RGVzY3JpcHRpb24+PC9yZGY6UkRGPiIpKSxhPXVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudCgiPC94OnhtcG1ldGE+IikpLG89ci5sZW5ndGgrbi5sZW5ndGgraS5sZW5ndGgrZS5sZW5ndGgrYS5sZW5ndGg7dGhpcy5pbnRlcm5hbC5fX21ldGFkYXRhX18ubWV0YWRhdGFfb2JqZWN0X251bWJlcj10aGlzLmludGVybmFsLm5ld09iamVjdCgpLHRoaXMuaW50ZXJuYWwud3JpdGUoIjw8IC9UeXBlIC9NZXRhZGF0YSAvU3VidHlwZSAvWE1MIC9MZW5ndGggIitvKyIgPj4iKSx0aGlzLmludGVybmFsLndyaXRlKCJzdHJlYW0iKSx0aGlzLmludGVybmFsLndyaXRlKGUrcituK2krYSksdGhpcy5pbnRlcm5hbC53cml0ZSgiZW5kc3RyZWFtIiksdGhpcy5pbnRlcm5hbC53cml0ZSgiZW5kb2JqIil9LHI9ZnVuY3Rpb24oKXt0aGlzLmludGVybmFsLl9fbWV0YWRhdGFfXy5tZXRhZGF0YV9vYmplY3RfbnVtYmVyJiZ0aGlzLmludGVybmFsLndyaXRlKCIvTWV0YWRhdGEgIit0aGlzLmludGVybmFsLl9fbWV0YWRhdGFfXy5tZXRhZGF0YV9vYmplY3RfbnVtYmVyKyIgMCBSIil9O3QuYWRkTWV0YWRhdGE9ZnVuY3Rpb24odCxuKXtyZXR1cm4gdm9pZCAwPT09dGhpcy5pbnRlcm5hbC5fX21ldGFkYXRhX18mJih0aGlzLmludGVybmFsLl9fbWV0YWRhdGFfXz17bWV0YWRhdGE6dCxuYW1lc3BhY2V1cmk6bnx8Imh0dHA6Ly9qc3BkZi5kZWZhdWx0Lm5hbWVzcGFjZXVyaS8ifSx0aGlzLmludGVybmFsLmV2ZW50cy5zdWJzY3JpYmUoInB1dENhdGFsb2ciLHIpLHRoaXMuaW50ZXJuYWwuZXZlbnRzLnN1YnNjcmliZSgicG9zdFB1dFJlc291cmNlcyIsZSkpLHRoaXN9fShNLkFQSSksZnVuY3Rpb24odCl7dmFyIGU9dC5BUEkscj1lLnBkZkVzY2FwZTE2PWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByLG49ZS5tZXRhZGF0YS5Vbmljb2RlLndpZHRocyxpPVsiIiwiMCIsIjAwIiwiMDAwIiwiMDAwMCJdLGE9WyIiXSxvPTAscz10Lmxlbmd0aDtvPHM7KytvKXtpZihyPWUubWV0YWRhdGEuY2hhcmFjdGVyVG9HbHlwaCh0LmNoYXJDb2RlQXQobykpLGUubWV0YWRhdGEuZ2x5SWRzVXNlZC5wdXNoKHIpLGUubWV0YWRhdGEudG9Vbmljb2RlW3JdPXQuY2hhckNvZGVBdChvKSwtMT09bi5pbmRleE9mKHIpJiYobi5wdXNoKHIpLG4ucHVzaChbcGFyc2VJbnQoZS5tZXRhZGF0YS53aWR0aE9mR2x5cGgociksMTApXSkpLCIwIj09cilyZXR1cm4gYS5qb2luKCIiKTtyPXIudG9TdHJpbmcoMTYpLGEucHVzaChpWzQtci5sZW5ndGhdLHIpfXJldHVybiBhLmpvaW4oIiIpfSxuPWZ1bmN0aW9uKHQpe3ZhciBlLHIsbixpLGEsbyxzO2ZvcihhPSIvQ0lESW5pdCAvUHJvY1NldCBmaW5kcmVzb3VyY2UgYmVnaW5cbjEyIGRpY3QgYmVnaW5cbmJlZ2luY21hcFxuL0NJRFN5c3RlbUluZm8gPDxcbiAgL1JlZ2lzdHJ5IChBZG9iZSlcbiAgL09yZGVyaW5nIChVQ1MpXG4gIC9TdXBwbGVtZW50IDBcbj4+IGRlZlxuL0NNYXBOYW1lIC9BZG9iZS1JZGVudGl0eS1VQ1MgZGVmXG4vQ01hcFR5cGUgMiBkZWZcbjEgYmVnaW5jb2Rlc3BhY2VyYW5nZVxuPDAwMDA+PGZmZmY+XG5lbmRjb2Rlc3BhY2VyYW5nZSIsbj1bXSxvPTAscz0ocj1PYmplY3Qua2V5cyh0KS5zb3J0KChmdW5jdGlvbih0LGUpe3JldHVybiB0LWV9KSkpLmxlbmd0aDtvPHM7bysrKWU9cltvXSxuLmxlbmd0aD49MTAwJiYoYSs9IlxuIituLmxlbmd0aCsiIGJlZ2luYmZjaGFyXG4iK24uam9pbigiXG4iKSsiXG5lbmRiZmNoYXIiLG49W10pLHZvaWQgMCE9PXRbZV0mJm51bGwhPT10W2VdJiYiZnVuY3Rpb24iPT10eXBlb2YgdFtlXS50b1N0cmluZyYmKGk9KCIwMDAwIit0W2VdLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTQpLGU9KCIwMDAwIisoK2UpLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTQpLG4ucHVzaCgiPCIrZSsiPjwiK2krIj4iKSk7cmV0dXJuIG4ubGVuZ3RoJiYoYSs9IlxuIituLmxlbmd0aCsiIGJlZ2luYmZjaGFyXG4iK24uam9pbigiXG4iKSsiXG5lbmRiZmNoYXJcbiIpLGErPSJlbmRjbWFwXG5DTWFwTmFtZSBjdXJyZW50ZGljdCAvQ01hcCBkZWZpbmVyZXNvdXJjZSBwb3BcbmVuZFxuZW5kIn07ZS5ldmVudHMucHVzaChbInB1dEZvbnQiLGZ1bmN0aW9uKGUpeyFmdW5jdGlvbihlKXt2YXIgcj1lLmZvbnQsaT1lLm91dCxhPWUubmV3T2JqZWN0LG89ZS5wdXRTdHJlYW07aWYoci5tZXRhZGF0YSBpbnN0YW5jZW9mIHQuQVBJLlRURkZvbnQmJiJJZGVudGl0eS1IIj09PXIuZW5jb2Rpbmcpe2Zvcih2YXIgcz1yLm1ldGFkYXRhLlVuaWNvZGUud2lkdGhzLGM9ci5tZXRhZGF0YS5zdWJzZXQuZW5jb2RlKHIubWV0YWRhdGEuZ2x5SWRzVXNlZCwxKSx1PSIiLGw9MDtsPGMubGVuZ3RoO2wrKyl1Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKGNbbF0pO3ZhciBoPWEoKTtvKHtkYXRhOnUsYWRkTGVuZ3RoMTohMCxvYmplY3RJZDpofSksaSgiZW5kb2JqIik7dmFyIGY9YSgpO28oe2RhdGE6bihyLm1ldGFkYXRhLnRvVW5pY29kZSksYWRkTGVuZ3RoMTohMCxvYmplY3RJZDpmfSksaSgiZW5kb2JqIik7dmFyIGQ9YSgpO2koIjw8IiksaSgiL1R5cGUgL0ZvbnREZXNjcmlwdG9yIiksaSgiL0ZvbnROYW1lIC8iK0Yoci5mb250TmFtZSkpLGkoIi9Gb250RmlsZTIgIitoKyIgMCBSIiksaSgiL0ZvbnRCQm94ICIrdC5BUEkuUERGT2JqZWN0LmNvbnZlcnQoci5tZXRhZGF0YS5iYm94KSksaSgiL0ZsYWdzICIrci5tZXRhZGF0YS5mbGFncyksaSgiL1N0ZW1WICIrci5tZXRhZGF0YS5zdGVtViksaSgiL0l0YWxpY0FuZ2xlICIrci5tZXRhZGF0YS5pdGFsaWNBbmdsZSksaSgiL0FzY2VudCAiK3IubWV0YWRhdGEuYXNjZW5kZXIpLGkoIi9EZXNjZW50ICIrci5tZXRhZGF0YS5kZWNlbmRlciksaSgiL0NhcEhlaWdodCAiK3IubWV0YWRhdGEuY2FwSGVpZ2h0KSxpKCI+PiIpLGkoImVuZG9iaiIpO3ZhciBwPWEoKTtpKCI8PCIpLGkoIi9UeXBlIC9Gb250IiksaSgiL0Jhc2VGb250IC8iK0Yoci5mb250TmFtZSkpLGkoIi9Gb250RGVzY3JpcHRvciAiK2QrIiAwIFIiKSxpKCIvVyAiK3QuQVBJLlBERk9iamVjdC5jb252ZXJ0KHMpKSxpKCIvQ0lEVG9HSURNYXAgL0lkZW50aXR5IiksaSgiL0RXIDEwMDAiKSxpKCIvU3VidHlwZSAvQ0lERm9udFR5cGUyIiksaSgiL0NJRFN5c3RlbUluZm8iKSxpKCI8PCIpLGkoIi9TdXBwbGVtZW50IDAiKSxpKCIvUmVnaXN0cnkgKEFkb2JlKSIpLGkoIi9PcmRlcmluZyAoIityLmVuY29kaW5nKyIpIiksaSgiPj4iKSxpKCI+PiIpLGkoImVuZG9iaiIpLHIub2JqZWN0TnVtYmVyPWEoKSxpKCI8PCIpLGkoIi9UeXBlIC9Gb250IiksaSgiL1N1YnR5cGUgL1R5cGUwIiksaSgiL1RvVW5pY29kZSAiK2YrIiAwIFIiKSxpKCIvQmFzZUZvbnQgLyIrRihyLmZvbnROYW1lKSksaSgiL0VuY29kaW5nIC8iK3IuZW5jb2RpbmcpLGkoIi9EZXNjZW5kYW50Rm9udHMgWyIrcCsiIDAgUl0iKSxpKCI+PiIpLGkoImVuZG9iaiIpLHIuaXNBbHJlYWR5UHV0dGVkPSEwfX0oZSl9XSk7ZS5ldmVudHMucHVzaChbInB1dEZvbnQiLGZ1bmN0aW9uKGUpeyFmdW5jdGlvbihlKXt2YXIgcj1lLmZvbnQsaT1lLm91dCxhPWUubmV3T2JqZWN0LG89ZS5wdXRTdHJlYW07aWYoci5tZXRhZGF0YSBpbnN0YW5jZW9mIHQuQVBJLlRURkZvbnQmJiJXaW5BbnNpRW5jb2RpbmciPT09ci5lbmNvZGluZyl7Zm9yKHZhciBzPXIubWV0YWRhdGEucmF3RGF0YSxjPSIiLHU9MDt1PHMubGVuZ3RoO3UrKyljKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHNbdV0pO3ZhciBsPWEoKTtvKHtkYXRhOmMsYWRkTGVuZ3RoMTohMCxvYmplY3RJZDpsfSksaSgiZW5kb2JqIik7dmFyIGg9YSgpO28oe2RhdGE6bihyLm1ldGFkYXRhLnRvVW5pY29kZSksYWRkTGVuZ3RoMTohMCxvYmplY3RJZDpofSksaSgiZW5kb2JqIik7dmFyIGY9YSgpO2koIjw8IiksaSgiL0Rlc2NlbnQgIityLm1ldGFkYXRhLmRlY2VuZGVyKSxpKCIvQ2FwSGVpZ2h0ICIrci5tZXRhZGF0YS5jYXBIZWlnaHQpLGkoIi9TdGVtViAiK3IubWV0YWRhdGEuc3RlbVYpLGkoIi9UeXBlIC9Gb250RGVzY3JpcHRvciIpLGkoIi9Gb250RmlsZTIgIitsKyIgMCBSIiksaSgiL0ZsYWdzIDk2IiksaSgiL0ZvbnRCQm94ICIrdC5BUEkuUERGT2JqZWN0LmNvbnZlcnQoci5tZXRhZGF0YS5iYm94KSksaSgiL0ZvbnROYW1lIC8iK0Yoci5mb250TmFtZSkpLGkoIi9JdGFsaWNBbmdsZSAiK3IubWV0YWRhdGEuaXRhbGljQW5nbGUpLGkoIi9Bc2NlbnQgIityLm1ldGFkYXRhLmFzY2VuZGVyKSxpKCI+PiIpLGkoImVuZG9iaiIpLHIub2JqZWN0TnVtYmVyPWEoKTtmb3IodmFyIGQ9MDtkPHIubWV0YWRhdGEuaG10eC53aWR0aHMubGVuZ3RoO2QrKylyLm1ldGFkYXRhLmhtdHgud2lkdGhzW2RdPXBhcnNlSW50KHIubWV0YWRhdGEuaG10eC53aWR0aHNbZF0qKDFlMy9yLm1ldGFkYXRhLmhlYWQudW5pdHNQZXJFbSkpO2koIjw8L1N1YnR5cGUvVHJ1ZVR5cGUvVHlwZS9Gb250L1RvVW5pY29kZSAiK2grIiAwIFIvQmFzZUZvbnQvIitGKHIuZm9udE5hbWUpKyIvRm9udERlc2NyaXB0b3IgIitmKyIgMCBSL0VuY29kaW5nLyIrci5lbmNvZGluZysiIC9GaXJzdENoYXIgMjkgL0xhc3RDaGFyIDI1NSAvV2lkdGhzICIrdC5BUEkuUERGT2JqZWN0LmNvbnZlcnQoci5tZXRhZGF0YS5obXR4LndpZHRocykrIj4+IiksaSgiZW5kb2JqIiksci5pc0FscmVhZHlQdXR0ZWQ9ITB9fShlKX1dKTt2YXIgaT1mdW5jdGlvbih0KXt2YXIgZSxuPXQudGV4dHx8IiIsaT10LngsYT10Lnksbz10Lm9wdGlvbnN8fHt9LHM9dC5tdXRleHx8e30sYz1zLnBkZkVzY2FwZSx1PXMuYWN0aXZlRm9udEtleSxsPXMuZm9udHMsaD11LGY9IiIsZD0wLHA9IiIsZz1sW2hdLmVuY29kaW5nO2lmKCJJZGVudGl0eS1IIiE9PWxbaF0uZW5jb2RpbmcpcmV0dXJue3RleHQ6bix4OmkseTphLG9wdGlvbnM6byxtdXRleDpzfTtmb3IocD1uLGg9dSxBcnJheS5pc0FycmF5KG4pJiYocD1uWzBdKSxkPTA7ZDxwLmxlbmd0aDtkKz0xKWxbaF0ubWV0YWRhdGEuaGFzT3duUHJvcGVydHkoImNtYXAiKSYmKGU9bFtoXS5tZXRhZGF0YS5jbWFwLnVuaWNvZGUuY29kZU1hcFtwW2RdLmNoYXJDb2RlQXQoMCldKSxlfHxwW2RdLmNoYXJDb2RlQXQoMCk8MjU2JiZsW2hdLm1ldGFkYXRhLmhhc093blByb3BlcnR5KCJVbmljb2RlIik/Zis9cFtkXTpmKz0iIjt2YXIgbT0iIjtyZXR1cm4gcGFyc2VJbnQoaC5zbGljZSgxKSk8MTR8fCJXaW5BbnNpRW5jb2RpbmciPT09Zz9tPWMoZixoKS5zcGxpdCgiIikubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KX0pKS5qb2luKCIiKToiSWRlbnRpdHktSCI9PT1nJiYobT1yKGYsbFtoXSkpLHMuaXNIZXg9ITAse3RleHQ6bSx4OmkseTphLG9wdGlvbnM6byxtdXRleDpzfX07ZS5ldmVudHMucHVzaChbInBvc3RQcm9jZXNzVGV4dCIsZnVuY3Rpb24odCl7dmFyIGU9dC50ZXh0fHwiIixyPVtdLG49e3RleHQ6ZSx4OnQueCx5OnQueSxvcHRpb25zOnQub3B0aW9ucyxtdXRleDp0Lm11dGV4fTtpZihBcnJheS5pc0FycmF5KGUpKXt2YXIgYT0wO2ZvcihhPTA7YTxlLmxlbmd0aDthKz0xKUFycmF5LmlzQXJyYXkoZVthXSkmJjM9PT1lW2FdLmxlbmd0aD9yLnB1c2goW2koT2JqZWN0LmFzc2lnbih7fSxuLHt0ZXh0OmVbYV1bMF19KSkudGV4dCxlW2FdWzFdLGVbYV1bMl1dKTpyLnB1c2goaShPYmplY3QuYXNzaWduKHt9LG4se3RleHQ6ZVthXX0pKS50ZXh0KTt0LnRleHQ9cn1lbHNlIHQudGV4dD1pKE9iamVjdC5hc3NpZ24oe30sbix7dGV4dDplfSkpLnRleHR9XSl9KE0pLAovKioKICAgKiBAbGljZW5zZQogICAqIGpzUERGIHZpcnR1YWwgRmlsZVN5c3RlbSBmdW5jdGlvbmFsaXR5CiAgICoKICAgKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuCiAgICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlCiAgICovCmZ1bmN0aW9uKHQpe3ZhciBlPWZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMD09PXRoaXMuaW50ZXJuYWwudkZTJiYodGhpcy5pbnRlcm5hbC52RlM9e30pLCEwfTt0LmV4aXN0c0ZpbGVJblZGUz1mdW5jdGlvbih0KXtyZXR1cm4gZS5jYWxsKHRoaXMpLHZvaWQgMCE9PXRoaXMuaW50ZXJuYWwudkZTW3RdfSx0LmFkZEZpbGVUb1ZGUz1mdW5jdGlvbih0LHIpe3JldHVybiBlLmNhbGwodGhpcyksdGhpcy5pbnRlcm5hbC52RlNbdF09cix0aGlzfSx0LmdldEZpbGVGcm9tVkZTPWZ1bmN0aW9uKHQpe3JldHVybiBlLmNhbGwodGhpcyksdm9pZCAwIT09dGhpcy5pbnRlcm5hbC52RlNbdF0/dGhpcy5pbnRlcm5hbC52RlNbdF06bnVsbH19KE0uQVBJKSwKLyoqCiAgICogQGxpY2Vuc2UKICAgKiBVbmljb2RlIEJpZGkgRW5naW5lIGJhc2VkIG9uIHRoZSB3b3JrIG9mIEFsZXggU2hlbnNpcyAoQGFzdGhlbnNpcykKICAgKiBNSVQgTGljZW5zZQogICAqLwpmdW5jdGlvbih0KXt0Ll9fYmlkaUVuZ2luZV9fPXQucHJvdG90eXBlLl9fYmlkaUVuZ2luZV9fPWZ1bmN0aW9uKHQpe3ZhciByLG4saSxhLG8scyxjLHU9ZSxsPVtbMCwzLDAsMSwwLDAsMF0sWzAsMywwLDEsMiwyLDBdLFswLDMsMCwxNywyLDAsMV0sWzAsMyw1LDUsNCwxLDBdLFswLDMsMjEsMjEsNCwwLDFdLFswLDMsNSw1LDQsMiwwXV0saD1bWzIsMCwxLDEsMCwxLDBdLFsyLDAsMSwxLDAsMiwwXSxbMiwwLDIsMSwzLDIsMF0sWzIsMCwyLDMzLDMsMSwxXV0sZj17TDowLFI6MSxFTjoyLEFOOjMsTjo0LEI6NSxTOjZ9LGQ9ezA6MCw1OjEsNjoyLDc6MywzMjo0LDI1MTo1LDI1NDo2LDI1NTo3fSxwPVsiKCIsIikiLCIoIiwiPCIsIj4iLCI8IiwiWyIsIl0iLCJbIiwieyIsIn0iLCJ7IiwiwqsiLCLCuyIsIsKrIiwi4oC5Iiwi4oC6Iiwi4oC5Iiwi4oGFIiwi4oGGIiwi4oGFIiwi4oG9Iiwi4oG+Iiwi4oG9Iiwi4oKNIiwi4oKOIiwi4oKNIiwi4omkIiwi4omlIiwi4omkIiwi4oypIiwi4oyqIiwi4oypIiwi77mZIiwi77maIiwi77mZIiwi77mbIiwi77mcIiwi77mbIiwi77mdIiwi77meIiwi77mdIiwi77mkIiwi77mlIiwi77mkIl0sZz1uZXcgUmVnRXhwKC9eKFsxLTR8OV18MVswLTldfDJbMC05XXwzWzAxNjhdfDRbMDQ1ODldfDVbMDEyXXw3Wzc4XXwxNTl8MTZbMC05XXwxN1swLTJdfDIxWzU2OV18MjJbMDM0ODldfDI1MCkkLyksbT0hMSx2PTA7dGhpcy5fX2JpZGlFbmdpbmVfXz17fTt2YXIgYj1mdW5jdGlvbih0KXt2YXIgZT10LmNoYXJDb2RlQXQoKSxyPWU+Pjgsbj1kW3JdO3JldHVybiB2b2lkIDAhPT1uP3VbMjU2Km4rKDI1NSZlKV06MjUyPT09cnx8MjUzPT09cj8iQUwiOmcudGVzdChyKT8iTCI6OD09PXI/IlIiOiJOIn0seT1mdW5jdGlvbih0KXtmb3IodmFyIGUscj0wO3I8dC5sZW5ndGg7cisrKXtpZigiTCI9PT0oZT1iKHQuY2hhckF0KHIpKSkpcmV0dXJuITE7aWYoIlIiPT09ZSlyZXR1cm4hMH1yZXR1cm4hMX0sdz1mdW5jdGlvbih0LGUsbyxzKXt2YXIgYyx1LGwsaCxmPWVbc107c3dpdGNoKGYpe2Nhc2UiTCI6Y2FzZSJSIjptPSExO2JyZWFrO2Nhc2UiTiI6Y2FzZSJBTiI6YnJlYWs7Y2FzZSJFTiI6bSYmKGY9IkFOIik7YnJlYWs7Y2FzZSJBTCI6bT0hMCxmPSJSIjticmVhaztjYXNlIldTIjpmPSJOIjticmVhaztjYXNlIkNTIjpzPDF8fHMrMT49ZS5sZW5ndGh8fCJFTiIhPT0oYz1vW3MtMV0pJiYiQU4iIT09Y3x8IkVOIiE9PSh1PWVbcysxXSkmJiJBTiIhPT11P2Y9Ik4iOm0mJih1PSJBTiIpLGY9dT09PWM/dToiTiI7YnJlYWs7Y2FzZSJFUyI6Zj0iRU4iPT09KGM9cz4wP29bcy0xXToiQiIpJiZzKzE8ZS5sZW5ndGgmJiJFTiI9PT1lW3MrMV0/IkVOIjoiTiI7YnJlYWs7Y2FzZSJFVCI6aWYocz4wJiYiRU4iPT09b1tzLTFdKXtmPSJFTiI7YnJlYWt9aWYobSl7Zj0iTiI7YnJlYWt9Zm9yKGw9cysxLGg9ZS5sZW5ndGg7bDxoJiYiRVQiPT09ZVtsXTspbCsrO2Y9bDxoJiYiRU4iPT09ZVtsXT8iRU4iOiJOIjticmVhaztjYXNlIk5TTSI6aWYoaSYmIWEpe2ZvcihoPWUubGVuZ3RoLGw9cysxO2w8aCYmIk5TTSI9PT1lW2xdOylsKys7aWYobDxoKXt2YXIgZD10W3NdLHA9ZD49MTQyNSYmZDw9MjMwM3x8NjQyODY9PT1kO2lmKGM9ZVtsXSxwJiYoIlIiPT09Y3x8IkFMIj09PWMpKXtmPSJSIjticmVha319fWY9czwxfHwiQiI9PT0oYz1lW3MtMV0pPyJOIjpvW3MtMV07YnJlYWs7Y2FzZSJCIjptPSExLHI9ITAsZj12O2JyZWFrO2Nhc2UiUyI6bj0hMCxmPSJOIjticmVhaztjYXNlIkxSRSI6Y2FzZSJSTEUiOmNhc2UiTFJPIjpjYXNlIlJMTyI6Y2FzZSJQREYiOm09ITE7YnJlYWs7Y2FzZSJCTiI6Zj0iTiJ9cmV0dXJuIGZ9LE49ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXQuc3BsaXQoIiIpO3JldHVybiByJiZMKG4scix7aGlMZXZlbDp2fSksbi5yZXZlcnNlKCksZSYmZS5yZXZlcnNlKCksbi5qb2luKCIiKX0sTD1mdW5jdGlvbih0LGUsaSl7dmFyIGEsbyxzLGMsdSxkPS0xLHA9dC5sZW5ndGgsZz0wLHk9W10sTj12P2g6bCxMPVtdO2ZvcihtPSExLHI9ITEsbj0hMSxvPTA7bzxwO28rKylMW29dPWIodFtvXSk7Zm9yKHM9MDtzPHA7cysrKXtpZih1PWcseVtzXT13KHQsTCx5LHMpLGE9MjQwJihnPU5bdV1bZlt5W3NdXV0pLGcmPTE1LGVbc109Yz1OW2ddWzVdLGE+MClpZigxNj09PWEpe2ZvcihvPWQ7bzxzO28rKyllW29dPTE7ZD0tMX1lbHNlIGQ9LTE7aWYoTltnXVs2XSktMT09PWQmJihkPXMpO2Vsc2UgaWYoZD4tMSl7Zm9yKG89ZDtvPHM7bysrKWVbb109YztkPS0xfSJCIj09PUxbc10mJihlW3NdPTApLGkuaGlMZXZlbHw9Y31uJiZmdW5jdGlvbih0LGUscil7Zm9yKHZhciBuPTA7bjxyO24rKylpZigiUyI9PT10W25dKXtlW25dPXY7Zm9yKHZhciBpPW4tMTtpPj0wJiYiV1MiPT09dFtpXTtpLS0pZVtpXT12fX0oTCxlLHApfSxBPWZ1bmN0aW9uKHQsZSxuLGksYSl7aWYoIShhLmhpTGV2ZWw8dCkpe2lmKDE9PT10JiYxPT09diYmIXIpcmV0dXJuIGUucmV2ZXJzZSgpLHZvaWQobiYmbi5yZXZlcnNlKCkpO2Zvcih2YXIgbyxzLGMsdSxsPWUubGVuZ3RoLGg9MDtoPGw7KXtpZihpW2hdPj10KXtmb3IoYz1oKzE7YzxsJiZpW2NdPj10OyljKys7Zm9yKHU9aCxzPWMtMTt1PHM7dSsrLHMtLSlvPWVbdV0sZVt1XT1lW3NdLGVbc109byxuJiYobz1uW3VdLG5bdV09bltzXSxuW3NdPW8pO2g9Y31oKyt9fX0seD1mdW5jdGlvbih0LGUscil7dmFyIG49dC5zcGxpdCgiIiksaT17aGlMZXZlbDp2fTtyZXR1cm4gcnx8KHI9W10pLEwobixyLGkpLGZ1bmN0aW9uKHQsZSxyKXtpZigwIT09ci5oaUxldmVsJiZjKWZvcih2YXIgbixpPTA7aTx0Lmxlbmd0aDtpKyspMT09PWVbaV0mJihuPXAuaW5kZXhPZih0W2ldKSk+PTAmJih0W2ldPXBbbisxXSl9KG4scixpKSxBKDIsbixlLHIsaSksQSgxLG4sZSxyLGkpLG4uam9pbigiIil9O3JldHVybiB0aGlzLl9fYmlkaUVuZ2luZV9fLmRvQmlkaVJlb3JkZXI9ZnVuY3Rpb24odCxlLHIpe2lmKGZ1bmN0aW9uKHQsZSl7aWYoZSlmb3IodmFyIHI9MDtyPHQubGVuZ3RoO3IrKyllW3JdPXI7dm9pZCAwPT09YSYmKGE9eSh0KSksdm9pZCAwPT09cyYmKHM9eSh0KSl9KHQsZSksaXx8IW98fHMpaWYoaSYmbyYmYV5zKXY9YT8xOjAsdD1OKHQsZSxyKTtlbHNlIGlmKCFpJiZvJiZzKXY9YT8xOjAsdD14KHQsZSxyKSx0PU4odCxlKTtlbHNlIGlmKCFpfHxhfHxvfHxzKXtpZihpJiYhbyYmYV5zKXQ9Tih0LGUpLGE/KHY9MCx0PXgodCxlLHIpKToodj0xLHQ9eCh0LGUsciksdD1OKHQsZSkpO2Vsc2UgaWYoaSYmYSYmIW8mJnMpdj0xLHQ9eCh0LGUsciksdD1OKHQsZSk7ZWxzZSBpZighaSYmIW8mJmFecyl7dmFyIG49YzthPyh2PTEsdD14KHQsZSxyKSx2PTAsYz0hMSx0PXgodCxlLHIpLGM9bik6KHY9MCx0PXgodCxlLHIpLHQ9Tih0LGUpLHY9MSxjPSExLHQ9eCh0LGUsciksYz1uLHQ9Tih0LGUpKX19ZWxzZSB2PTAsdD14KHQsZSxyKTtlbHNlIHY9YT8xOjAsdD14KHQsZSxyKTtyZXR1cm4gdH0sdGhpcy5fX2JpZGlFbmdpbmVfXy5zZXRPcHRpb25zPWZ1bmN0aW9uKHQpe3QmJihpPXQuaXNJbnB1dFZpc3VhbCxvPXQuaXNPdXRwdXRWaXN1YWwsYT10LmlzSW5wdXRSdGwscz10LmlzT3V0cHV0UnRsLGM9dC5pc1N5bW1ldHJpY1N3YXBwaW5nKX0sdGhpcy5fX2JpZGlFbmdpbmVfXy5zZXRPcHRpb25zKHQpLHRoaXMuX19iaWRpRW5naW5lX199O3ZhciBlPVsiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiUyIsIkIiLCJTIiwiV1MiLCJCIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkIiLCJCIiwiQiIsIlMiLCJXUyIsIk4iLCJOIiwiRVQiLCJFVCIsIkVUIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJFUyIsIkNTIiwiRVMiLCJDUyIsIkNTIiwiRU4iLCJFTiIsIkVOIiwiRU4iLCJFTiIsIkVOIiwiRU4iLCJFTiIsIkVOIiwiRU4iLCJDUyIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJOIiwiTiIsIk4iLCJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJDUyIsIk4iLCJFVCIsIkVUIiwiRVQiLCJFVCIsIk4iLCJOIiwiTiIsIk4iLCJMIiwiTiIsIk4iLCJCTiIsIk4iLCJOIiwiRVQiLCJFVCIsIkVOIiwiRU4iLCJOIiwiTCIsIk4iLCJOIiwiTiIsIkVOIiwiTCIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJOIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIk4iLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIk4iLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIk4iLCJOIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIk4iLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJOIiwiTCIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiRVQiLCJOIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiUiIsIk5TTSIsIlIiLCJOU00iLCJOU00iLCJSIiwiTlNNIiwiTlNNIiwiUiIsIk5TTSIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiUiIsIlIiLCJSIiwiUiIsIlIiLCJSIiwiUiIsIlIiLCJSIiwiUiIsIlIiLCJSIiwiUiIsIlIiLCJSIiwiUiIsIlIiLCJSIiwiUiIsIlIiLCJSIiwiUiIsIlIiLCJSIiwiUiIsIlIiLCJSIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJSIiwiUiIsIlIiLCJSIiwiUiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiQU4iLCJBTiIsIkFOIiwiQU4iLCJBTiIsIkFOIiwiTiIsIk4iLCJBTCIsIkVUIiwiRVQiLCJBTCIsIkNTIiwiQUwiLCJOIiwiTiIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIkFMIiwiQUwiLCJOIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiQU4iLCJBTiIsIkFOIiwiQU4iLCJBTiIsIkFOIiwiQU4iLCJBTiIsIkFOIiwiQU4iLCJFVCIsIkFOIiwiQU4iLCJBTCIsIkFMIiwiQUwiLCJOU00iLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiQU4iLCJOIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiQUwiLCJBTCIsIk5TTSIsIk5TTSIsIk4iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJBTCIsIkFMIiwiRU4iLCJFTiIsIkVOIiwiRU4iLCJFTiIsIkVOIiwiRU4iLCJFTiIsIkVOIiwiRU4iLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiTiIsIkFMIiwiQUwiLCJOU00iLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOIiwiTiIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJBTCIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiUiIsIlIiLCJSIiwiUiIsIlIiLCJSIiwiUiIsIlIiLCJSIiwiUiIsIlIiLCJSIiwiUiIsIlIiLCJSIiwiUiIsIlIiLCJSIiwiUiIsIlIiLCJSIiwiUiIsIlIiLCJSIiwiUiIsIlIiLCJSIiwiUiIsIlIiLCJSIiwiUiIsIlIiLCJSIiwiUiIsIlIiLCJSIiwiUiIsIlIiLCJSIiwiUiIsIlIiLCJSIiwiUiIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIlIiLCJSIiwiTiIsIk4iLCJOIiwiTiIsIlIiLCJOIiwiTiIsIk4iLCJOIiwiTiIsIldTIiwiV1MiLCJXUyIsIldTIiwiV1MiLCJXUyIsIldTIiwiV1MiLCJXUyIsIldTIiwiV1MiLCJCTiIsIkJOIiwiQk4iLCJMIiwiUiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIldTIiwiQiIsIkxSRSIsIlJMRSIsIlBERiIsIkxSTyIsIlJMTyIsIkNTIiwiRVQiLCJFVCIsIkVUIiwiRVQiLCJFVCIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIkNTIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJXUyIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJOIiwiTFJJIiwiUkxJIiwiRlNJIiwiUERJIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiRU4iLCJMIiwiTiIsIk4iLCJFTiIsIkVOIiwiRU4iLCJFTiIsIkVOIiwiRU4iLCJFUyIsIkVTIiwiTiIsIk4iLCJOIiwiTCIsIkVOIiwiRU4iLCJFTiIsIkVOIiwiRU4iLCJFTiIsIkVOIiwiRU4iLCJFTiIsIkVOIiwiRVMiLCJFUyIsIk4iLCJOIiwiTiIsIk4iLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTiIsIk4iLCJOIiwiRVQiLCJFVCIsIkVUIiwiRVQiLCJFVCIsIkVUIiwiRVQiLCJFVCIsIkVUIiwiRVQiLCJFVCIsIkVUIiwiRVQiLCJFVCIsIkVUIiwiRVQiLCJFVCIsIkVUIiwiRVQiLCJFVCIsIkVUIiwiRVQiLCJFVCIsIkVUIiwiRVQiLCJFVCIsIkVUIiwiRVQiLCJFVCIsIkVUIiwiRVQiLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJMIiwiTCIsIkwiLCJMIiwiTCIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiUiIsIk5TTSIsIlIiLCJSIiwiUiIsIlIiLCJSIiwiUiIsIlIiLCJSIiwiUiIsIlIiLCJFUyIsIlIiLCJSIiwiUiIsIlIiLCJSIiwiUiIsIlIiLCJSIiwiUiIsIlIiLCJSIiwiUiIsIlIiLCJOIiwiUiIsIlIiLCJSIiwiUiIsIlIiLCJOIiwiUiIsIk4iLCJSIiwiUiIsIk4iLCJSIiwiUiIsIk4iLCJSIiwiUiIsIlIiLCJSIiwiUiIsIlIiLCJSIiwiUiIsIlIiLCJSIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJDUyIsIk4iLCJDUyIsIk4iLCJOIiwiQ1MiLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJFVCIsIk4iLCJOIiwiRVMiLCJFUyIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiRVQiLCJFVCIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIk4iLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJOIiwiTiIsIkJOIiwiTiIsIk4iLCJOIiwiRVQiLCJFVCIsIkVUIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJFUyIsIkNTIiwiRVMiLCJDUyIsIkNTIiwiRU4iLCJFTiIsIkVOIiwiRU4iLCJFTiIsIkVOIiwiRU4iLCJFTiIsIkVOIiwiRU4iLCJDUyIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTiIsIk4iLCJOIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTiIsIk4iLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJOIiwiTiIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIk4iLCJOIiwiTCIsIkwiLCJMIiwiTiIsIk4iLCJOIiwiRVQiLCJFVCIsIk4iLCJOIiwiTiIsIkVUIiwiRVQiLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIiwiTiIsIk4iLCJOIl0scj1uZXcgdC5fX2JpZGlFbmdpbmVfXyh7aXNJbnB1dFZpc3VhbDohMH0pO3QuQVBJLmV2ZW50cy5wdXNoKFsicG9zdFByb2Nlc3NUZXh0IixmdW5jdGlvbih0KXt2YXIgZT10LnRleHQsbj0odC54LHQueSx0Lm9wdGlvbnN8fHt9KSxpPSh0Lm11dGV4LG4ubGFuZyxbXSk7aWYobi5pc0lucHV0VmlzdWFsPSJib29sZWFuIiE9dHlwZW9mIG4uaXNJbnB1dFZpc3VhbHx8bi5pc0lucHV0VmlzdWFsLHIuc2V0T3B0aW9ucyhuKSwiW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpKXt2YXIgYT0wO2ZvcihpPVtdLGE9MDthPGUubGVuZ3RoO2ErPTEpIltvYmplY3QgQXJyYXldIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlW2FdKT9pLnB1c2goW3IuZG9CaWRpUmVvcmRlcihlW2FdWzBdKSxlW2FdWzFdLGVbYV1bMl1dKTppLnB1c2goW3IuZG9CaWRpUmVvcmRlcihlW2FdKV0pO3QudGV4dD1pfWVsc2UgdC50ZXh0PXIuZG9CaWRpUmVvcmRlcihlKTtyLnNldE9wdGlvbnMoe2lzSW5wdXRWaXN1YWw6ITB9KX1dKX0oTSksTS5BUEkuVFRGRm9udD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dmFyIGU7aWYodGhpcy5yYXdEYXRhPXQsZT10aGlzLmNvbnRlbnRzPW5ldyBUZSh0KSx0aGlzLmNvbnRlbnRzLnBvcz00LCJ0dGNmIj09PWUucmVhZFN0cmluZyg0KSl0aHJvdyBuZXcgRXJyb3IoIlRUQ0Ygbm90IHN1cHBvcnRlZC4iKTtlLnBvcz0wLHRoaXMucGFyc2UoKSx0aGlzLnN1YnNldD1uZXcgYXIodGhpcyksdGhpcy5yZWdpc3RlclRURigpfXJldHVybiB0Lm9wZW49ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyB0KGUpfSx0LnByb3RvdHlwZS5wYXJzZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRpcmVjdG9yeT1uZXcgVWUodGhpcy5jb250ZW50cyksdGhpcy5oZWFkPW5ldyBXZSh0aGlzKSx0aGlzLm5hbWU9bmV3IFplKHRoaXMpLHRoaXMuY21hcD1uZXcgR2UodGhpcyksdGhpcy50b1VuaWNvZGU9e30sdGhpcy5oaGVhPW5ldyBZZSh0aGlzKSx0aGlzLm1heHA9bmV3ICRlKHRoaXMpLHRoaXMuaG10eD1uZXcgUWUodGhpcyksdGhpcy5wb3N0PW5ldyBYZSh0aGlzKSx0aGlzLm9zMj1uZXcgSmUodGhpcyksdGhpcy5sb2NhPW5ldyBpcih0aGlzKSx0aGlzLmdseWY9bmV3IGVyKHRoaXMpLHRoaXMuYXNjZW5kZXI9dGhpcy5vczIuZXhpc3RzJiZ0aGlzLm9zMi5hc2NlbmRlcnx8dGhpcy5oaGVhLmFzY2VuZGVyLHRoaXMuZGVjZW5kZXI9dGhpcy5vczIuZXhpc3RzJiZ0aGlzLm9zMi5kZWNlbmRlcnx8dGhpcy5oaGVhLmRlY2VuZGVyLHRoaXMubGluZUdhcD10aGlzLm9zMi5leGlzdHMmJnRoaXMub3MyLmxpbmVHYXB8fHRoaXMuaGhlYS5saW5lR2FwLHRoaXMuYmJveD1bdGhpcy5oZWFkLnhNaW4sdGhpcy5oZWFkLnlNaW4sdGhpcy5oZWFkLnhNYXgsdGhpcy5oZWFkLnlNYXhdfSx0LnByb3RvdHlwZS5yZWdpc3RlclRURj1mdW5jdGlvbigpe3ZhciB0LGUscixuLGk7aWYodGhpcy5zY2FsZUZhY3Rvcj0xZTMvdGhpcy5oZWFkLnVuaXRzUGVyRW0sdGhpcy5iYm94PWZ1bmN0aW9uKCl7dmFyIGUscixuLGk7Zm9yKGk9W10sZT0wLHI9KG49dGhpcy5iYm94KS5sZW5ndGg7ZTxyO2UrKyl0PW5bZV0saS5wdXNoKE1hdGgucm91bmQodCp0aGlzLnNjYWxlRmFjdG9yKSk7cmV0dXJuIGl9LmNhbGwodGhpcyksdGhpcy5zdGVtVj0wLHRoaXMucG9zdC5leGlzdHM/KHI9MjU1JihuPXRoaXMucG9zdC5pdGFsaWNfYW5nbGUpLDAhPSgzMjc2OCYoZT1uPj4xNikpJiYoZT0tKDErKDY1NTM1XmUpKSksdGhpcy5pdGFsaWNBbmdsZT0rKGUrIi4iK3IpKTp0aGlzLml0YWxpY0FuZ2xlPTAsdGhpcy5hc2NlbmRlcj1NYXRoLnJvdW5kKHRoaXMuYXNjZW5kZXIqdGhpcy5zY2FsZUZhY3RvciksdGhpcy5kZWNlbmRlcj1NYXRoLnJvdW5kKHRoaXMuZGVjZW5kZXIqdGhpcy5zY2FsZUZhY3RvciksdGhpcy5saW5lR2FwPU1hdGgucm91bmQodGhpcy5saW5lR2FwKnRoaXMuc2NhbGVGYWN0b3IpLHRoaXMuY2FwSGVpZ2h0PXRoaXMub3MyLmV4aXN0cyYmdGhpcy5vczIuY2FwSGVpZ2h0fHx0aGlzLmFzY2VuZGVyLHRoaXMueEhlaWdodD10aGlzLm9zMi5leGlzdHMmJnRoaXMub3MyLnhIZWlnaHR8fDAsdGhpcy5mYW1pbHlDbGFzcz0odGhpcy5vczIuZXhpc3RzJiZ0aGlzLm9zMi5mYW1pbHlDbGFzc3x8MCk+PjgsdGhpcy5pc1NlcmlmPTE9PT0oaT10aGlzLmZhbWlseUNsYXNzKXx8Mj09PWl8fDM9PT1pfHw0PT09aXx8NT09PWl8fDc9PT1pLHRoaXMuaXNTY3JpcHQ9MTA9PT10aGlzLmZhbWlseUNsYXNzLHRoaXMuZmxhZ3M9MCx0aGlzLnBvc3QuaXNGaXhlZFBpdGNoJiYodGhpcy5mbGFnc3w9MSksdGhpcy5pc1NlcmlmJiYodGhpcy5mbGFnc3w9MiksdGhpcy5pc1NjcmlwdCYmKHRoaXMuZmxhZ3N8PTgpLDAhPT10aGlzLml0YWxpY0FuZ2xlJiYodGhpcy5mbGFnc3w9NjQpLHRoaXMuZmxhZ3N8PTMyLCF0aGlzLmNtYXAudW5pY29kZSl0aHJvdyBuZXcgRXJyb3IoIk5vIHVuaWNvZGUgY21hcCBmb3IgZm9udCIpfSx0LnByb3RvdHlwZS5jaGFyYWN0ZXJUb0dseXBoPWZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybihudWxsIT0oZT10aGlzLmNtYXAudW5pY29kZSk/ZS5jb2RlTWFwW3RdOnZvaWQgMCl8fDB9LHQucHJvdG90eXBlLndpZHRoT2ZHbHlwaD1mdW5jdGlvbih0KXt2YXIgZTtyZXR1cm4gZT0xZTMvdGhpcy5oZWFkLnVuaXRzUGVyRW0sdGhpcy5obXR4LmZvckdseXBoKHQpLmFkdmFuY2UqZX0sdC5wcm90b3R5cGUud2lkdGhPZlN0cmluZz1mdW5jdGlvbih0LGUscil7dmFyIG4saSxhLG87Zm9yKGE9MCxpPTAsbz0odD0iIit0KS5sZW5ndGg7MDw9bz9pPG86aT5vO2k9MDw9bz8rK2k6LS1pKW49dC5jaGFyQ29kZUF0KGkpLGErPXRoaXMud2lkdGhPZkdseXBoKHRoaXMuY2hhcmFjdGVyVG9HbHlwaChuKSkrciooMWUzL2UpfHwwO3JldHVybiBhKihlLzFlMyl9LHQucHJvdG90eXBlLmxpbmVIZWlnaHQ9ZnVuY3Rpb24odCxlKXt2YXIgcjtyZXR1cm4gbnVsbD09ZSYmKGU9ITEpLHI9ZT90aGlzLmxpbmVHYXA6MCwodGhpcy5hc2NlbmRlcityLXRoaXMuZGVjZW5kZXIpLzFlMyp0fSx0fSgpO3ZhciBSZSxUZT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy5kYXRhPW51bGwhPXQ/dDpbXSx0aGlzLnBvcz0wLHRoaXMubGVuZ3RoPXRoaXMuZGF0YS5sZW5ndGh9cmV0dXJuIHQucHJvdG90eXBlLnJlYWRCeXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF0YVt0aGlzLnBvcysrXX0sdC5wcm90b3R5cGUud3JpdGVCeXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmRhdGFbdGhpcy5wb3MrK109dH0sdC5wcm90b3R5cGUucmVhZFVJbnQzMj1mdW5jdGlvbigpe3JldHVybiAxNjc3NzIxNip0aGlzLnJlYWRCeXRlKCkrKHRoaXMucmVhZEJ5dGUoKTw8MTYpKyh0aGlzLnJlYWRCeXRlKCk8PDgpK3RoaXMucmVhZEJ5dGUoKX0sdC5wcm90b3R5cGUud3JpdGVVSW50MzI9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMud3JpdGVCeXRlKHQ+Pj4yNCYyNTUpLHRoaXMud3JpdGVCeXRlKHQ+PjE2JjI1NSksdGhpcy53cml0ZUJ5dGUodD4+OCYyNTUpLHRoaXMud3JpdGVCeXRlKDI1NSZ0KX0sdC5wcm90b3R5cGUucmVhZEludDMyPWZ1bmN0aW9uKCl7dmFyIHQ7cmV0dXJuKHQ9dGhpcy5yZWFkVUludDMyKCkpPj0yMTQ3NDgzNjQ4P3QtNDI5NDk2NzI5Njp0fSx0LnByb3RvdHlwZS53cml0ZUludDMyPWZ1bmN0aW9uKHQpe3JldHVybiB0PDAmJih0Kz00Mjk0OTY3Mjk2KSx0aGlzLndyaXRlVUludDMyKHQpfSx0LnByb3RvdHlwZS5yZWFkVUludDE2PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhZEJ5dGUoKTw8OHx0aGlzLnJlYWRCeXRlKCl9LHQucHJvdG90eXBlLndyaXRlVUludDE2PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLndyaXRlQnl0ZSh0Pj44JjI1NSksdGhpcy53cml0ZUJ5dGUoMjU1JnQpfSx0LnByb3RvdHlwZS5yZWFkSW50MTY9ZnVuY3Rpb24oKXt2YXIgdDtyZXR1cm4odD10aGlzLnJlYWRVSW50MTYoKSk+PTMyNzY4P3QtNjU1MzY6dH0sdC5wcm90b3R5cGUud3JpdGVJbnQxNj1mdW5jdGlvbih0KXtyZXR1cm4gdDwwJiYodCs9NjU1MzYpLHRoaXMud3JpdGVVSW50MTYodCl9LHQucHJvdG90eXBlLnJlYWRTdHJpbmc9ZnVuY3Rpb24odCl7dmFyIGUscjtmb3Iocj1bXSxlPTA7MDw9dD9lPHQ6ZT50O2U9MDw9dD8rK2U6LS1lKXJbZV09U3RyaW5nLmZyb21DaGFyQ29kZSh0aGlzLnJlYWRCeXRlKCkpO3JldHVybiByLmpvaW4oIiIpfSx0LnByb3RvdHlwZS53cml0ZVN0cmluZz1mdW5jdGlvbih0KXt2YXIgZSxyLG47Zm9yKG49W10sZT0wLHI9dC5sZW5ndGg7MDw9cj9lPHI6ZT5yO2U9MDw9cj8rK2U6LS1lKW4ucHVzaCh0aGlzLndyaXRlQnl0ZSh0LmNoYXJDb2RlQXQoZSkpKTtyZXR1cm4gbn0sdC5wcm90b3R5cGUucmVhZFNob3J0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhZEludDE2KCl9LHQucHJvdG90eXBlLndyaXRlU2hvcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMud3JpdGVJbnQxNih0KX0sdC5wcm90b3R5cGUucmVhZExvbmdMb25nPWZ1bmN0aW9uKCl7dmFyIHQsZSxyLG4saSxhLG8scztyZXR1cm4gdD10aGlzLnJlYWRCeXRlKCksZT10aGlzLnJlYWRCeXRlKCkscj10aGlzLnJlYWRCeXRlKCksbj10aGlzLnJlYWRCeXRlKCksaT10aGlzLnJlYWRCeXRlKCksYT10aGlzLnJlYWRCeXRlKCksbz10aGlzLnJlYWRCeXRlKCkscz10aGlzLnJlYWRCeXRlKCksMTI4JnQ/LTEqKDcyMDU3NTk0MDM3OTI3OTQwKigyNTVedCkrMjgxNDc0OTc2NzEwNjU2KigyNTVeZSkrMTA5OTUxMTYyNzc3NiooMjU1XnIpKzQyOTQ5NjcyOTYqKDI1NV5uKSsxNjc3NzIxNiooMjU1XmkpKzY1NTM2KigyNTVeYSkrMjU2KigyNTVebykrKDI1NV5zKSsxKTo3MjA1NzU5NDAzNzkyNzk0MCp0KzI4MTQ3NDk3NjcxMDY1NiplKzEwOTk1MTE2Mjc3NzYqcis0Mjk0OTY3Mjk2Km4rMTY3NzcyMTYqaSs2NTUzNiphKzI1NipvK3N9LHQucHJvdG90eXBlLndyaXRlTG9uZ0xvbmc9ZnVuY3Rpb24odCl7dmFyIGUscjtyZXR1cm4gZT1NYXRoLmZsb29yKHQvNDI5NDk2NzI5Nikscj00Mjk0OTY3Mjk1JnQsdGhpcy53cml0ZUJ5dGUoZT4+MjQmMjU1KSx0aGlzLndyaXRlQnl0ZShlPj4xNiYyNTUpLHRoaXMud3JpdGVCeXRlKGU+PjgmMjU1KSx0aGlzLndyaXRlQnl0ZSgyNTUmZSksdGhpcy53cml0ZUJ5dGUocj4+MjQmMjU1KSx0aGlzLndyaXRlQnl0ZShyPj4xNiYyNTUpLHRoaXMud3JpdGVCeXRlKHI+PjgmMjU1KSx0aGlzLndyaXRlQnl0ZSgyNTUmcil9LHQucHJvdG90eXBlLnJlYWRJbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFkSW50MzIoKX0sdC5wcm90b3R5cGUud3JpdGVJbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMud3JpdGVJbnQzMih0KX0sdC5wcm90b3R5cGUucmVhZD1mdW5jdGlvbih0KXt2YXIgZSxyO2ZvcihlPVtdLHI9MDswPD10P3I8dDpyPnQ7cj0wPD10PysrcjotLXIpZS5wdXNoKHRoaXMucmVhZEJ5dGUoKSk7cmV0dXJuIGV9LHQucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHQpe3ZhciBlLHIsbixpO2ZvcihpPVtdLHI9MCxuPXQubGVuZ3RoO3I8bjtyKyspZT10W3JdLGkucHVzaCh0aGlzLndyaXRlQnl0ZShlKSk7cmV0dXJuIGl9LHR9KCksVWU9ZnVuY3Rpb24oKXt2YXIgdDtmdW5jdGlvbiBlKHQpe3ZhciBlLHIsbjtmb3IodGhpcy5zY2FsYXJUeXBlPXQucmVhZEludCgpLHRoaXMudGFibGVDb3VudD10LnJlYWRTaG9ydCgpLHRoaXMuc2VhcmNoUmFuZ2U9dC5yZWFkU2hvcnQoKSx0aGlzLmVudHJ5U2VsZWN0b3I9dC5yZWFkU2hvcnQoKSx0aGlzLnJhbmdlU2hpZnQ9dC5yZWFkU2hvcnQoKSx0aGlzLnRhYmxlcz17fSxyPTAsbj10aGlzLnRhYmxlQ291bnQ7MDw9bj9yPG46cj5uO3I9MDw9bj8rK3I6LS1yKWU9e3RhZzp0LnJlYWRTdHJpbmcoNCksY2hlY2tzdW06dC5yZWFkSW50KCksb2Zmc2V0OnQucmVhZEludCgpLGxlbmd0aDp0LnJlYWRJbnQoKX0sdGhpcy50YWJsZXNbZS50YWddPWV9cmV0dXJuIGUucHJvdG90eXBlLmVuY29kZT1mdW5jdGlvbihlKXt2YXIgcixuLGksYSxvLHMsYyx1LGwsaCxmLGQscDtmb3IocCBpbiBmPU9iamVjdC5rZXlzKGUpLmxlbmd0aCxzPU1hdGgubG9nKDIpLGw9MTYqTWF0aC5mbG9vcihNYXRoLmxvZyhmKS9zKSxhPU1hdGguZmxvb3IobC9zKSx1PTE2KmYtbCwobj1uZXcgVGUpLndyaXRlSW50KHRoaXMuc2NhbGFyVHlwZSksbi53cml0ZVNob3J0KGYpLG4ud3JpdGVTaG9ydChsKSxuLndyaXRlU2hvcnQoYSksbi53cml0ZVNob3J0KHUpLGk9MTYqZixjPW4ucG9zK2ksbz1udWxsLGQ9W10sZSlmb3IoaD1lW3BdLG4ud3JpdGVTdHJpbmcocCksbi53cml0ZUludCh0KGgpKSxuLndyaXRlSW50KGMpLG4ud3JpdGVJbnQoaC5sZW5ndGgpLGQ9ZC5jb25jYXQoaCksImhlYWQiPT09cCYmKG89YyksYys9aC5sZW5ndGg7YyU0OylkLnB1c2goMCksYysrO3JldHVybiBuLndyaXRlKGQpLHI9Mjk4MTE0NjU1NC10KG4uZGF0YSksbi5wb3M9bys4LG4ud3JpdGVVSW50MzIociksbi5kYXRhfSx0PWZ1bmN0aW9uKHQpe3ZhciBlLHIsbixpO2Zvcih0PXRyLmNhbGwodCk7dC5sZW5ndGglNDspdC5wdXNoKDApO2ZvcihuPW5ldyBUZSh0KSxyPTAsZT0wLGk9dC5sZW5ndGg7ZTxpO2U9ZSs9NClyKz1uLnJlYWRVSW50MzIoKTtyZXR1cm4gNDI5NDk2NzI5NSZyfSxlfSgpLHplPXt9Lmhhc093blByb3BlcnR5LEhlPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByIGluIGUpemUuY2FsbChlLHIpJiYodFtyXT1lW3JdKTtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fXJldHVybiBuLnByb3RvdHlwZT1lLnByb3RvdHlwZSx0LnByb3RvdHlwZT1uZXcgbix0Ll9fc3VwZXJfXz1lLnByb3RvdHlwZSx0fSxXZT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIGUuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gSGUoZSx0KSxlLnByb3RvdHlwZS50YWc9ImhlYWQiLGUucHJvdG90eXBlLnBhcnNlPWZ1bmN0aW9uKHQpe3JldHVybiB0LnBvcz10aGlzLm9mZnNldCx0aGlzLnZlcnNpb249dC5yZWFkSW50KCksdGhpcy5yZXZpc2lvbj10LnJlYWRJbnQoKSx0aGlzLmNoZWNrU3VtQWRqdXN0bWVudD10LnJlYWRJbnQoKSx0aGlzLm1hZ2ljTnVtYmVyPXQucmVhZEludCgpLHRoaXMuZmxhZ3M9dC5yZWFkU2hvcnQoKSx0aGlzLnVuaXRzUGVyRW09dC5yZWFkU2hvcnQoKSx0aGlzLmNyZWF0ZWQ9dC5yZWFkTG9uZ0xvbmcoKSx0aGlzLm1vZGlmaWVkPXQucmVhZExvbmdMb25nKCksdGhpcy54TWluPXQucmVhZFNob3J0KCksdGhpcy55TWluPXQucmVhZFNob3J0KCksdGhpcy54TWF4PXQucmVhZFNob3J0KCksdGhpcy55TWF4PXQucmVhZFNob3J0KCksdGhpcy5tYWNTdHlsZT10LnJlYWRTaG9ydCgpLHRoaXMubG93ZXN0UmVjUFBFTT10LnJlYWRTaG9ydCgpLHRoaXMuZm9udERpcmVjdGlvbkhpbnQ9dC5yZWFkU2hvcnQoKSx0aGlzLmluZGV4VG9Mb2NGb3JtYXQ9dC5yZWFkU2hvcnQoKSx0aGlzLmdseXBoRGF0YUZvcm1hdD10LnJlYWRTaG9ydCgpfSxlLnByb3RvdHlwZS5lbmNvZGU9ZnVuY3Rpb24odCl7dmFyIGU7cmV0dXJuKGU9bmV3IFRlKS53cml0ZUludCh0aGlzLnZlcnNpb24pLGUud3JpdGVJbnQodGhpcy5yZXZpc2lvbiksZS53cml0ZUludCh0aGlzLmNoZWNrU3VtQWRqdXN0bWVudCksZS53cml0ZUludCh0aGlzLm1hZ2ljTnVtYmVyKSxlLndyaXRlU2hvcnQodGhpcy5mbGFncyksZS53cml0ZVNob3J0KHRoaXMudW5pdHNQZXJFbSksZS53cml0ZUxvbmdMb25nKHRoaXMuY3JlYXRlZCksZS53cml0ZUxvbmdMb25nKHRoaXMubW9kaWZpZWQpLGUud3JpdGVTaG9ydCh0aGlzLnhNaW4pLGUud3JpdGVTaG9ydCh0aGlzLnlNaW4pLGUud3JpdGVTaG9ydCh0aGlzLnhNYXgpLGUud3JpdGVTaG9ydCh0aGlzLnlNYXgpLGUud3JpdGVTaG9ydCh0aGlzLm1hY1N0eWxlKSxlLndyaXRlU2hvcnQodGhpcy5sb3dlc3RSZWNQUEVNKSxlLndyaXRlU2hvcnQodGhpcy5mb250RGlyZWN0aW9uSGludCksZS53cml0ZVNob3J0KHQpLGUud3JpdGVTaG9ydCh0aGlzLmdseXBoRGF0YUZvcm1hdCksZS5kYXRhfSxlfShSZT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dmFyIGU7dGhpcy5maWxlPXQsZT10aGlzLmZpbGUuZGlyZWN0b3J5LnRhYmxlc1t0aGlzLnRhZ10sdGhpcy5leGlzdHM9ISFlLGUmJih0aGlzLm9mZnNldD1lLm9mZnNldCx0aGlzLmxlbmd0aD1lLmxlbmd0aCx0aGlzLnBhcnNlKHRoaXMuZmlsZS5jb250ZW50cykpfXJldHVybiB0LnByb3RvdHlwZS5wYXJzZT1mdW5jdGlvbigpe30sdC5wcm90b3R5cGUuZW5jb2RlPWZ1bmN0aW9uKCl7fSx0LnByb3RvdHlwZS5yYXc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5leGlzdHM/KHRoaXMuZmlsZS5jb250ZW50cy5wb3M9dGhpcy5vZmZzZXQsdGhpcy5maWxlLmNvbnRlbnRzLnJlYWQodGhpcy5sZW5ndGgpKTpudWxsfSx0fSgpKSxWZT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXt2YXIgcixuLGksYSxvLHMsYyx1LGwsaCxmLGQscCxnLG0sdixiO3N3aXRjaCh0aGlzLnBsYXRmb3JtSUQ9dC5yZWFkVUludDE2KCksdGhpcy5lbmNvZGluZ0lEPXQucmVhZFNob3J0KCksdGhpcy5vZmZzZXQ9ZSt0LnJlYWRJbnQoKSxsPXQucG9zLHQucG9zPXRoaXMub2Zmc2V0LHRoaXMuZm9ybWF0PXQucmVhZFVJbnQxNigpLHRoaXMubGVuZ3RoPXQucmVhZFVJbnQxNigpLHRoaXMubGFuZ3VhZ2U9dC5yZWFkVUludDE2KCksdGhpcy5pc1VuaWNvZGU9Mz09PXRoaXMucGxhdGZvcm1JRCYmMT09PXRoaXMuZW5jb2RpbmdJRCYmND09PXRoaXMuZm9ybWF0fHwwPT09dGhpcy5wbGF0Zm9ybUlEJiY0PT09dGhpcy5mb3JtYXQsdGhpcy5jb2RlTWFwPXt9LHRoaXMuZm9ybWF0KXtjYXNlIDA6Zm9yKHM9MDtzPDI1NjsrK3MpdGhpcy5jb2RlTWFwW3NdPXQucmVhZEJ5dGUoKTticmVhaztjYXNlIDQ6Zm9yKGY9dC5yZWFkVUludDE2KCksaD1mLzIsdC5wb3MrPTYsaT1mdW5jdGlvbigpe3ZhciBlLHI7Zm9yKHI9W10scz1lPTA7MDw9aD9lPGg6ZT5oO3M9MDw9aD8rK2U6LS1lKXIucHVzaCh0LnJlYWRVSW50MTYoKSk7cmV0dXJuIHJ9KCksdC5wb3MrPTIscD1mdW5jdGlvbigpe3ZhciBlLHI7Zm9yKHI9W10scz1lPTA7MDw9aD9lPGg6ZT5oO3M9MDw9aD8rK2U6LS1lKXIucHVzaCh0LnJlYWRVSW50MTYoKSk7cmV0dXJuIHJ9KCksYz1mdW5jdGlvbigpe3ZhciBlLHI7Zm9yKHI9W10scz1lPTA7MDw9aD9lPGg6ZT5oO3M9MDw9aD8rK2U6LS1lKXIucHVzaCh0LnJlYWRVSW50MTYoKSk7cmV0dXJuIHJ9KCksdT1mdW5jdGlvbigpe3ZhciBlLHI7Zm9yKHI9W10scz1lPTA7MDw9aD9lPGg6ZT5oO3M9MDw9aD8rK2U6LS1lKXIucHVzaCh0LnJlYWRVSW50MTYoKSk7cmV0dXJuIHJ9KCksbj0odGhpcy5sZW5ndGgtdC5wb3MrdGhpcy5vZmZzZXQpLzIsbz1mdW5jdGlvbigpe3ZhciBlLHI7Zm9yKHI9W10scz1lPTA7MDw9bj9lPG46ZT5uO3M9MDw9bj8rK2U6LS1lKXIucHVzaCh0LnJlYWRVSW50MTYoKSk7cmV0dXJuIHJ9KCkscz1tPTAsYj1pLmxlbmd0aDttPGI7cz0rK20pZm9yKGc9aVtzXSxyPXY9ZD1wW3NdO2Q8PWc/djw9Zzp2Pj1nO3I9ZDw9Zz8rK3Y6LS12KTA9PT11W3NdP2E9citjW3NdOjAhPT0oYT1vW3Vbc10vMisoci1kKS0oaC1zKV18fDApJiYoYSs9Y1tzXSksdGhpcy5jb2RlTWFwW3JdPTY1NTM1JmF9dC5wb3M9bH1yZXR1cm4gdC5lbmNvZGU9ZnVuY3Rpb24odCxlKXt2YXIgcixuLGksYSxvLHMsYyx1LGwsaCxmLGQscCxnLG0sdixiLHksdyxOLEwsQSx4LFMsXyxQLGssRixJLEMsaixPLEIsTSxFLHEsRCxSLFQsVSx6LEgsVyxWLEcsWTtzd2l0Y2goRj1uZXcgVGUsYT1PYmplY3Qua2V5cyh0KS5zb3J0KChmdW5jdGlvbih0LGUpe3JldHVybiB0LWV9KSksZSl7Y2FzZSJtYWNyb21hbiI6Zm9yKHA9MCxnPWZ1bmN0aW9uKCl7dmFyIHQ9W107Zm9yKGQ9MDtkPDI1NjsrK2QpdC5wdXNoKDApO3JldHVybiB0fSgpLHY9ezA6MH0saT17fSxJPTAsQj1hLmxlbmd0aDtJPEI7SSsrKW51bGw9PXZbVz10W249YVtJXV1dJiYodltXXT0rK3ApLGlbbl09e29sZDp0W25dLG5ldzp2W3Rbbl1dfSxnW25dPXZbdFtuXV07cmV0dXJuIEYud3JpdGVVSW50MTYoMSksRi53cml0ZVVJbnQxNigwKSxGLndyaXRlVUludDMyKDEyKSxGLndyaXRlVUludDE2KDApLEYud3JpdGVVSW50MTYoMjYyKSxGLndyaXRlVUludDE2KDApLEYud3JpdGUoZykse2NoYXJNYXA6aSxzdWJ0YWJsZTpGLmRhdGEsbWF4R2x5cGhJRDpwKzF9O2Nhc2UidW5pY29kZSI6Zm9yKFA9W10sbD1bXSxiPTAsdj17fSxyPXt9LG09Yz1udWxsLEM9MCxNPWEubGVuZ3RoO0M8TTtDKyspbnVsbD09dlt3PXRbbj1hW0NdXV0mJih2W3ddPSsrYikscltuXT17b2xkOncsbmV3OnZbd119LG89dlt3XS1uLG51bGwhPW0mJm89PT1jfHwobSYmbC5wdXNoKG0pLFAucHVzaChuKSxjPW8pLG09bjtmb3IobSYmbC5wdXNoKG0pLGwucHVzaCg2NTUzNSksUC5wdXNoKDY1NTM1KSxTPTIqKHg9UC5sZW5ndGgpLEE9MipNYXRoLnBvdyhNYXRoLmxvZyh4KS9NYXRoLkxOMiwyKSxoPU1hdGgubG9nKEEvMikvTWF0aC5MTjIsTD0yKngtQSxzPVtdLE49W10sZj1bXSxkPWo9MCxFPVAubGVuZ3RoO2o8RTtkPSsrail7aWYoXz1QW2RdLHU9bFtkXSw2NTUzNT09PV8pe3MucHVzaCgwKSxOLnB1c2goMCk7YnJlYWt9aWYoXy0oaz1yW19dLm5ldyk+PTMyNzY4KWZvcihzLnB1c2goMCksTi5wdXNoKDIqKGYubGVuZ3RoK3gtZCkpLG49Tz1fO188PXU/Tzw9dTpPPj11O249Xzw9dT8rK086LS1PKWYucHVzaChyW25dLm5ldyk7ZWxzZSBzLnB1c2goay1fKSxOLnB1c2goMCl9Zm9yKEYud3JpdGVVSW50MTYoMyksRi53cml0ZVVJbnQxNigxKSxGLndyaXRlVUludDMyKDEyKSxGLndyaXRlVUludDE2KDQpLEYud3JpdGVVSW50MTYoMTYrOCp4KzIqZi5sZW5ndGgpLEYud3JpdGVVSW50MTYoMCksRi53cml0ZVVJbnQxNihTKSxGLndyaXRlVUludDE2KEEpLEYud3JpdGVVSW50MTYoaCksRi53cml0ZVVJbnQxNihMKSx6PTAscT1sLmxlbmd0aDt6PHE7eisrKW49bFt6XSxGLndyaXRlVUludDE2KG4pO2ZvcihGLndyaXRlVUludDE2KDApLEg9MCxEPVAubGVuZ3RoO0g8RDtIKyspbj1QW0hdLEYud3JpdGVVSW50MTYobik7Zm9yKFY9MCxSPXMubGVuZ3RoO1Y8UjtWKyspbz1zW1ZdLEYud3JpdGVVSW50MTYobyk7Zm9yKEc9MCxUPU4ubGVuZ3RoO0c8VDtHKyspeT1OW0ddLEYud3JpdGVVSW50MTYoeSk7Zm9yKFk9MCxVPWYubGVuZ3RoO1k8VTtZKyspcD1mW1ldLEYud3JpdGVVSW50MTYocCk7cmV0dXJue2NoYXJNYXA6cixzdWJ0YWJsZTpGLmRhdGEsbWF4R2x5cGhJRDpiKzF9fX0sdH0oKSxHZT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIGUuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gSGUoZSx0KSxlLnByb3RvdHlwZS50YWc9ImNtYXAiLGUucHJvdG90eXBlLnBhcnNlPWZ1bmN0aW9uKHQpe3ZhciBlLHIsbjtmb3IodC5wb3M9dGhpcy5vZmZzZXQsdGhpcy52ZXJzaW9uPXQucmVhZFVJbnQxNigpLG49dC5yZWFkVUludDE2KCksdGhpcy50YWJsZXM9W10sdGhpcy51bmljb2RlPW51bGwscj0wOzA8PW4/cjxuOnI+bjtyPTA8PW4/KytyOi0tcillPW5ldyBWZSh0LHRoaXMub2Zmc2V0KSx0aGlzLnRhYmxlcy5wdXNoKGUpLGUuaXNVbmljb2RlJiZudWxsPT10aGlzLnVuaWNvZGUmJih0aGlzLnVuaWNvZGU9ZSk7cmV0dXJuITB9LGUuZW5jb2RlPWZ1bmN0aW9uKHQsZSl7dmFyIHIsbjtyZXR1cm4gbnVsbD09ZSYmKGU9Im1hY3JvbWFuIikscj1WZS5lbmNvZGUodCxlKSwobj1uZXcgVGUpLndyaXRlVUludDE2KDApLG4ud3JpdGVVSW50MTYoMSksci50YWJsZT1uLmRhdGEuY29uY2F0KHIuc3VidGFibGUpLHJ9LGV9KFJlKSxZZT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIGUuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gSGUoZSx0KSxlLnByb3RvdHlwZS50YWc9ImhoZWEiLGUucHJvdG90eXBlLnBhcnNlPWZ1bmN0aW9uKHQpe3JldHVybiB0LnBvcz10aGlzLm9mZnNldCx0aGlzLnZlcnNpb249dC5yZWFkSW50KCksdGhpcy5hc2NlbmRlcj10LnJlYWRTaG9ydCgpLHRoaXMuZGVjZW5kZXI9dC5yZWFkU2hvcnQoKSx0aGlzLmxpbmVHYXA9dC5yZWFkU2hvcnQoKSx0aGlzLmFkdmFuY2VXaWR0aE1heD10LnJlYWRTaG9ydCgpLHRoaXMubWluTGVmdFNpZGVCZWFyaW5nPXQucmVhZFNob3J0KCksdGhpcy5taW5SaWdodFNpZGVCZWFyaW5nPXQucmVhZFNob3J0KCksdGhpcy54TWF4RXh0ZW50PXQucmVhZFNob3J0KCksdGhpcy5jYXJldFNsb3BlUmlzZT10LnJlYWRTaG9ydCgpLHRoaXMuY2FyZXRTbG9wZVJ1bj10LnJlYWRTaG9ydCgpLHRoaXMuY2FyZXRPZmZzZXQ9dC5yZWFkU2hvcnQoKSx0LnBvcys9OCx0aGlzLm1ldHJpY0RhdGFGb3JtYXQ9dC5yZWFkU2hvcnQoKSx0aGlzLm51bWJlck9mTWV0cmljcz10LnJlYWRVSW50MTYoKX0sZX0oUmUpLEplPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gZS5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBIZShlLHQpLGUucHJvdG90eXBlLnRhZz0iT1MvMiIsZS5wcm90b3R5cGUucGFyc2U9ZnVuY3Rpb24odCl7aWYodC5wb3M9dGhpcy5vZmZzZXQsdGhpcy52ZXJzaW9uPXQucmVhZFVJbnQxNigpLHRoaXMuYXZlcmFnZUNoYXJXaWR0aD10LnJlYWRTaG9ydCgpLHRoaXMud2VpZ2h0Q2xhc3M9dC5yZWFkVUludDE2KCksdGhpcy53aWR0aENsYXNzPXQucmVhZFVJbnQxNigpLHRoaXMudHlwZT10LnJlYWRTaG9ydCgpLHRoaXMueVN1YnNjcmlwdFhTaXplPXQucmVhZFNob3J0KCksdGhpcy55U3Vic2NyaXB0WVNpemU9dC5yZWFkU2hvcnQoKSx0aGlzLnlTdWJzY3JpcHRYT2Zmc2V0PXQucmVhZFNob3J0KCksdGhpcy55U3Vic2NyaXB0WU9mZnNldD10LnJlYWRTaG9ydCgpLHRoaXMueVN1cGVyc2NyaXB0WFNpemU9dC5yZWFkU2hvcnQoKSx0aGlzLnlTdXBlcnNjcmlwdFlTaXplPXQucmVhZFNob3J0KCksdGhpcy55U3VwZXJzY3JpcHRYT2Zmc2V0PXQucmVhZFNob3J0KCksdGhpcy55U3VwZXJzY3JpcHRZT2Zmc2V0PXQucmVhZFNob3J0KCksdGhpcy55U3RyaWtlb3V0U2l6ZT10LnJlYWRTaG9ydCgpLHRoaXMueVN0cmlrZW91dFBvc2l0aW9uPXQucmVhZFNob3J0KCksdGhpcy5mYW1pbHlDbGFzcz10LnJlYWRTaG9ydCgpLHRoaXMucGFub3NlPWZ1bmN0aW9uKCl7dmFyIGUscjtmb3Iocj1bXSxlPTA7ZTwxMDsrK2Upci5wdXNoKHQucmVhZEJ5dGUoKSk7cmV0dXJuIHJ9KCksdGhpcy5jaGFyUmFuZ2U9ZnVuY3Rpb24oKXt2YXIgZSxyO2ZvcihyPVtdLGU9MDtlPDQ7KytlKXIucHVzaCh0LnJlYWRJbnQoKSk7cmV0dXJuIHJ9KCksdGhpcy52ZW5kb3JJRD10LnJlYWRTdHJpbmcoNCksdGhpcy5zZWxlY3Rpb249dC5yZWFkU2hvcnQoKSx0aGlzLmZpcnN0Q2hhckluZGV4PXQucmVhZFNob3J0KCksdGhpcy5sYXN0Q2hhckluZGV4PXQucmVhZFNob3J0KCksdGhpcy52ZXJzaW9uPjAmJih0aGlzLmFzY2VudD10LnJlYWRTaG9ydCgpLHRoaXMuZGVzY2VudD10LnJlYWRTaG9ydCgpLHRoaXMubGluZUdhcD10LnJlYWRTaG9ydCgpLHRoaXMud2luQXNjZW50PXQucmVhZFNob3J0KCksdGhpcy53aW5EZXNjZW50PXQucmVhZFNob3J0KCksdGhpcy5jb2RlUGFnZVJhbmdlPWZ1bmN0aW9uKCl7dmFyIGUscjtmb3Iocj1bXSxlPTA7ZTwyO2U9KytlKXIucHVzaCh0LnJlYWRJbnQoKSk7cmV0dXJuIHJ9KCksdGhpcy52ZXJzaW9uPjEpKXJldHVybiB0aGlzLnhIZWlnaHQ9dC5yZWFkU2hvcnQoKSx0aGlzLmNhcEhlaWdodD10LnJlYWRTaG9ydCgpLHRoaXMuZGVmYXVsdENoYXI9dC5yZWFkU2hvcnQoKSx0aGlzLmJyZWFrQ2hhcj10LnJlYWRTaG9ydCgpLHRoaXMubWF4Q29udGV4dD10LnJlYWRTaG9ydCgpfSxlfShSZSksWGU9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBlLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIEhlKGUsdCksZS5wcm90b3R5cGUudGFnPSJwb3N0IixlLnByb3RvdHlwZS5wYXJzZT1mdW5jdGlvbih0KXt2YXIgZSxyLG47c3dpdGNoKHQucG9zPXRoaXMub2Zmc2V0LHRoaXMuZm9ybWF0PXQucmVhZEludCgpLHRoaXMuaXRhbGljQW5nbGU9dC5yZWFkSW50KCksdGhpcy51bmRlcmxpbmVQb3NpdGlvbj10LnJlYWRTaG9ydCgpLHRoaXMudW5kZXJsaW5lVGhpY2tuZXNzPXQucmVhZFNob3J0KCksdGhpcy5pc0ZpeGVkUGl0Y2g9dC5yZWFkSW50KCksdGhpcy5taW5NZW1UeXBlNDI9dC5yZWFkSW50KCksdGhpcy5tYXhNZW1UeXBlNDI9dC5yZWFkSW50KCksdGhpcy5taW5NZW1UeXBlMT10LnJlYWRJbnQoKSx0aGlzLm1heE1lbVR5cGUxPXQucmVhZEludCgpLHRoaXMuZm9ybWF0KXtjYXNlIDY1NTM2OmJyZWFrO2Nhc2UgMTMxMDcyOnZhciBpO2ZvcihyPXQucmVhZFVJbnQxNigpLHRoaXMuZ2x5cGhOYW1lSW5kZXg9W10saT0wOzA8PXI/aTxyOmk+cjtpPTA8PXI/KytpOi0taSl0aGlzLmdseXBoTmFtZUluZGV4LnB1c2godC5yZWFkVUludDE2KCkpO2Zvcih0aGlzLm5hbWVzPVtdLG49W107dC5wb3M8dGhpcy5vZmZzZXQrdGhpcy5sZW5ndGg7KWU9dC5yZWFkQnl0ZSgpLG4ucHVzaCh0aGlzLm5hbWVzLnB1c2godC5yZWFkU3RyaW5nKGUpKSk7cmV0dXJuIG47Y2FzZSAxNTE1NTI6cmV0dXJuIHI9dC5yZWFkVUludDE2KCksdGhpcy5vZmZzZXRzPXQucmVhZChyKTtjYXNlIDE5NjYwODpicmVhaztjYXNlIDI2MjE0NDpyZXR1cm4gdGhpcy5tYXA9ZnVuY3Rpb24oKXt2YXIgZSxyLG47Zm9yKG49W10saT1lPTAscj10aGlzLmZpbGUubWF4cC5udW1HbHlwaHM7MDw9cj9lPHI6ZT5yO2k9MDw9cj8rK2U6LS1lKW4ucHVzaCh0LnJlYWRVSW50MzIoKSk7cmV0dXJuIG59LmNhbGwodGhpcyl9fSxlfShSZSksS2U9ZnVuY3Rpb24odCxlKXt0aGlzLnJhdz10LHRoaXMubGVuZ3RoPXQubGVuZ3RoLHRoaXMucGxhdGZvcm1JRD1lLnBsYXRmb3JtSUQsdGhpcy5lbmNvZGluZ0lEPWUuZW5jb2RpbmdJRCx0aGlzLmxhbmd1YWdlSUQ9ZS5sYW5ndWFnZUlEfSxaZT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIGUuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gSGUoZSx0KSxlLnByb3RvdHlwZS50YWc9Im5hbWUiLGUucHJvdG90eXBlLnBhcnNlPWZ1bmN0aW9uKHQpe3ZhciBlLHIsbixpLGEsbyxzLGMsdSxsLGg7Zm9yKHQucG9zPXRoaXMub2Zmc2V0LHQucmVhZFNob3J0KCksZT10LnJlYWRTaG9ydCgpLG89dC5yZWFkU2hvcnQoKSxyPVtdLGk9MDswPD1lP2k8ZTppPmU7aT0wPD1lPysraTotLWkpci5wdXNoKHtwbGF0Zm9ybUlEOnQucmVhZFNob3J0KCksZW5jb2RpbmdJRDp0LnJlYWRTaG9ydCgpLGxhbmd1YWdlSUQ6dC5yZWFkU2hvcnQoKSxuYW1lSUQ6dC5yZWFkU2hvcnQoKSxsZW5ndGg6dC5yZWFkU2hvcnQoKSxvZmZzZXQ6dGhpcy5vZmZzZXQrbyt0LnJlYWRTaG9ydCgpfSk7Zm9yKHM9e30saT11PTAsbD1yLmxlbmd0aDt1PGw7aT0rK3Upbj1yW2ldLHQucG9zPW4ub2Zmc2V0LGM9dC5yZWFkU3RyaW5nKG4ubGVuZ3RoKSxhPW5ldyBLZShjLG4pLG51bGw9PXNbaD1uLm5hbWVJRF0mJihzW2hdPVtdKSxzW24ubmFtZUlEXS5wdXNoKGEpO3RoaXMuc3RyaW5ncz1zLHRoaXMuY29weXJpZ2h0PXNbMF0sdGhpcy5mb250RmFtaWx5PXNbMV0sdGhpcy5mb250U3ViZmFtaWx5PXNbMl0sdGhpcy51bmlxdWVTdWJmYW1pbHk9c1szXSx0aGlzLmZvbnROYW1lPXNbNF0sdGhpcy52ZXJzaW9uPXNbNV07dHJ5e3RoaXMucG9zdHNjcmlwdE5hbWU9c1s2XVswXS5yYXcucmVwbGFjZSgvW1x4MDAtXHgxOVx4ODAtXHhmZl0vZywiIil9Y2F0Y2godCl7dGhpcy5wb3N0c2NyaXB0TmFtZT1zWzRdWzBdLnJhdy5yZXBsYWNlKC9bXHgwMC1ceDE5XHg4MC1ceGZmXS9nLCIiKX1yZXR1cm4gdGhpcy50cmFkZW1hcms9c1s3XSx0aGlzLm1hbnVmYWN0dXJlcj1zWzhdLHRoaXMuZGVzaWduZXI9c1s5XSx0aGlzLmRlc2NyaXB0aW9uPXNbMTBdLHRoaXMudmVuZG9yVXJsPXNbMTFdLHRoaXMuZGVzaWduZXJVcmw9c1sxMl0sdGhpcy5saWNlbnNlPXNbMTNdLHRoaXMubGljZW5zZVVybD1zWzE0XSx0aGlzLnByZWZlcnJlZEZhbWlseT1zWzE1XSx0aGlzLnByZWZlcnJlZFN1YmZhbWlseT1zWzE3XSx0aGlzLmNvbXBhdGlibGVGdWxsPXNbMThdLHRoaXMuc2FtcGxlVGV4dD1zWzE5XX0sZX0oUmUpLCRlPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gZS5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBIZShlLHQpLGUucHJvdG90eXBlLnRhZz0ibWF4cCIsZS5wcm90b3R5cGUucGFyc2U9ZnVuY3Rpb24odCl7cmV0dXJuIHQucG9zPXRoaXMub2Zmc2V0LHRoaXMudmVyc2lvbj10LnJlYWRJbnQoKSx0aGlzLm51bUdseXBocz10LnJlYWRVSW50MTYoKSx0aGlzLm1heFBvaW50cz10LnJlYWRVSW50MTYoKSx0aGlzLm1heENvbnRvdXJzPXQucmVhZFVJbnQxNigpLHRoaXMubWF4Q29tcG9zaXRlUG9pbnRzPXQucmVhZFVJbnQxNigpLHRoaXMubWF4Q29tcG9uZW50Q29udG91cnM9dC5yZWFkVUludDE2KCksdGhpcy5tYXhab25lcz10LnJlYWRVSW50MTYoKSx0aGlzLm1heFR3aWxpZ2h0UG9pbnRzPXQucmVhZFVJbnQxNigpLHRoaXMubWF4U3RvcmFnZT10LnJlYWRVSW50MTYoKSx0aGlzLm1heEZ1bmN0aW9uRGVmcz10LnJlYWRVSW50MTYoKSx0aGlzLm1heEluc3RydWN0aW9uRGVmcz10LnJlYWRVSW50MTYoKSx0aGlzLm1heFN0YWNrRWxlbWVudHM9dC5yZWFkVUludDE2KCksdGhpcy5tYXhTaXplT2ZJbnN0cnVjdGlvbnM9dC5yZWFkVUludDE2KCksdGhpcy5tYXhDb21wb25lbnRFbGVtZW50cz10LnJlYWRVSW50MTYoKSx0aGlzLm1heENvbXBvbmVudERlcHRoPXQucmVhZFVJbnQxNigpfSxlfShSZSksUWU9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBlLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIEhlKGUsdCksZS5wcm90b3R5cGUudGFnPSJobXR4IixlLnByb3RvdHlwZS5wYXJzZT1mdW5jdGlvbih0KXt2YXIgZSxyLG4saSxhLG8scztmb3IodC5wb3M9dGhpcy5vZmZzZXQsdGhpcy5tZXRyaWNzPVtdLGU9MCxvPXRoaXMuZmlsZS5oaGVhLm51bWJlck9mTWV0cmljczswPD1vP2U8bzplPm87ZT0wPD1vPysrZTotLWUpdGhpcy5tZXRyaWNzLnB1c2goe2FkdmFuY2U6dC5yZWFkVUludDE2KCksbHNiOnQucmVhZEludDE2KCl9KTtmb3Iobj10aGlzLmZpbGUubWF4cC5udW1HbHlwaHMtdGhpcy5maWxlLmhoZWEubnVtYmVyT2ZNZXRyaWNzLHRoaXMubGVmdFNpZGVCZWFyaW5ncz1mdW5jdGlvbigpe3ZhciByLGk7Zm9yKGk9W10sZT1yPTA7MDw9bj9yPG46cj5uO2U9MDw9bj8rK3I6LS1yKWkucHVzaCh0LnJlYWRJbnQxNigpKTtyZXR1cm4gaX0oKSx0aGlzLndpZHRocz1mdW5jdGlvbigpe3ZhciB0LGUscixuO2ZvcihuPVtdLHQ9MCxlPShyPXRoaXMubWV0cmljcykubGVuZ3RoO3Q8ZTt0KyspaT1yW3RdLG4ucHVzaChpLmFkdmFuY2UpO3JldHVybiBufS5jYWxsKHRoaXMpLHI9dGhpcy53aWR0aHNbdGhpcy53aWR0aHMubGVuZ3RoLTFdLHM9W10sZT1hPTA7MDw9bj9hPG46YT5uO2U9MDw9bj8rK2E6LS1hKXMucHVzaCh0aGlzLndpZHRocy5wdXNoKHIpKTtyZXR1cm4gc30sZS5wcm90b3R5cGUuZm9yR2x5cGg9ZnVuY3Rpb24odCl7cmV0dXJuIHQgaW4gdGhpcy5tZXRyaWNzP3RoaXMubWV0cmljc1t0XTp7YWR2YW5jZTp0aGlzLm1ldHJpY3NbdGhpcy5tZXRyaWNzLmxlbmd0aC0xXS5hZHZhbmNlLGxzYjp0aGlzLmxlZnRTaWRlQmVhcmluZ3NbdC10aGlzLm1ldHJpY3MubGVuZ3RoXX19LGV9KFJlKSx0cj1bXS5zbGljZSxlcj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIGUuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gSGUoZSx0KSxlLnByb3RvdHlwZS50YWc9ImdseWYiLGUucHJvdG90eXBlLnBhcnNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2FjaGU9e319LGUucHJvdG90eXBlLmdseXBoRm9yPWZ1bmN0aW9uKHQpe3ZhciBlLHIsbixpLGEsbyxzLGMsdSxsO3JldHVybiB0IGluIHRoaXMuY2FjaGU/dGhpcy5jYWNoZVt0XTooaT10aGlzLmZpbGUubG9jYSxlPXRoaXMuZmlsZS5jb250ZW50cyxyPWkuaW5kZXhPZih0KSwwPT09KG49aS5sZW5ndGhPZih0KSk/dGhpcy5jYWNoZVt0XT1udWxsOihlLnBvcz10aGlzLm9mZnNldCtyLGE9KG89bmV3IFRlKGUucmVhZChuKSkpLnJlYWRTaG9ydCgpLGM9by5yZWFkU2hvcnQoKSxsPW8ucmVhZFNob3J0KCkscz1vLnJlYWRTaG9ydCgpLHU9by5yZWFkU2hvcnQoKSx0aGlzLmNhY2hlW3RdPS0xPT09YT9uZXcgbnIobyxjLGwscyx1KTpuZXcgcnIobyxhLGMsbCxzLHUpLHRoaXMuY2FjaGVbdF0pKX0sZS5wcm90b3R5cGUuZW5jb2RlPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbixpLGEsbyxzO2ZvcihhPVtdLGk9W10sbz0wLHM9ZS5sZW5ndGg7bzxzO28rKyluPXRbZVtvXV0saS5wdXNoKGEubGVuZ3RoKSxuJiYoYT1hLmNvbmNhdChuLmVuY29kZShyKSkpO3JldHVybiBpLnB1c2goYS5sZW5ndGgpLHt0YWJsZTphLG9mZnNldHM6aX19LGV9KFJlKSxycj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlLHIsbixpLGEpe3RoaXMucmF3PXQsdGhpcy5udW1iZXJPZkNvbnRvdXJzPWUsdGhpcy54TWluPXIsdGhpcy55TWluPW4sdGhpcy54TWF4PWksdGhpcy55TWF4PWEsdGhpcy5jb21wb3VuZD0hMX1yZXR1cm4gdC5wcm90b3R5cGUuZW5jb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmF3LmRhdGF9LHR9KCksbnI9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSxyLG4saSl7dmFyIGEsbztmb3IodGhpcy5yYXc9dCx0aGlzLnhNaW49ZSx0aGlzLnlNaW49cix0aGlzLnhNYXg9bix0aGlzLnlNYXg9aSx0aGlzLmNvbXBvdW5kPSEwLHRoaXMuZ2x5cGhJRHM9W10sdGhpcy5nbHlwaE9mZnNldHM9W10sYT10aGlzLnJhdztvPWEucmVhZFNob3J0KCksdGhpcy5nbHlwaE9mZnNldHMucHVzaChhLnBvcyksdGhpcy5nbHlwaElEcy5wdXNoKGEucmVhZFVJbnQxNigpKSwzMiZvOylhLnBvcys9MSZvPzQ6MiwxMjgmbz9hLnBvcys9ODo2NCZvP2EucG9zKz00OjgmbyYmKGEucG9zKz0yKX1yZXR1cm4gMSw4LDMyLDY0LDEyOCx0LnByb3RvdHlwZS5lbmNvZGU9ZnVuY3Rpb24oKXt2YXIgdCxlLHI7Zm9yKGU9bmV3IFRlKHRyLmNhbGwodGhpcy5yYXcuZGF0YSkpLHQ9MCxyPXRoaXMuZ2x5cGhJRHMubGVuZ3RoO3Q8cjsrK3QpZS5wb3M9dGhpcy5nbHlwaE9mZnNldHNbdF07cmV0dXJuIGUuZGF0YX0sdH0oKSxpcj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIGUuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gSGUoZSx0KSxlLnByb3RvdHlwZS50YWc9ImxvY2EiLGUucHJvdG90eXBlLnBhcnNlPWZ1bmN0aW9uKHQpe3ZhciBlLHI7cmV0dXJuIHQucG9zPXRoaXMub2Zmc2V0LGU9dGhpcy5maWxlLmhlYWQuaW5kZXhUb0xvY0Zvcm1hdCx0aGlzLm9mZnNldHM9MD09PWU/ZnVuY3Rpb24oKXt2YXIgZSxuO2ZvcihuPVtdLHI9MCxlPXRoaXMubGVuZ3RoO3I8ZTtyKz0yKW4ucHVzaCgyKnQucmVhZFVJbnQxNigpKTtyZXR1cm4gbn0uY2FsbCh0aGlzKTpmdW5jdGlvbigpe3ZhciBlLG47Zm9yKG49W10scj0wLGU9dGhpcy5sZW5ndGg7cjxlO3IrPTQpbi5wdXNoKHQucmVhZFVJbnQzMigpKTtyZXR1cm4gbn0uY2FsbCh0aGlzKX0sZS5wcm90b3R5cGUuaW5kZXhPZj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5vZmZzZXRzW3RdfSxlLnByb3RvdHlwZS5sZW5ndGhPZj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5vZmZzZXRzW3QrMV0tdGhpcy5vZmZzZXRzW3RdfSxlLnByb3RvdHlwZS5lbmNvZGU9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9bmV3IFVpbnQzMkFycmF5KHRoaXMub2Zmc2V0cy5sZW5ndGgpLG49MCxpPTAsYT0wO2E8ci5sZW5ndGg7KythKWlmKHJbYV09bixpPGUubGVuZ3RoJiZlW2ldPT1hKXsrK2ksclthXT1uO3ZhciBvPXRoaXMub2Zmc2V0c1thXSxzPXRoaXMub2Zmc2V0c1thKzFdLW87cz4wJiYobis9cyl9Zm9yKHZhciBjPW5ldyBBcnJheSg0KnIubGVuZ3RoKSx1PTA7dTxyLmxlbmd0aDsrK3UpY1s0KnUrM109MjU1JnJbdV0sY1s0KnUrMl09KDY1MjgwJnJbdV0pPj44LGNbNCp1KzFdPSgxNjcxMTY4MCZyW3VdKT4+MTYsY1s0KnVdPSg0Mjc4MTkwMDgwJnJbdV0pPj4yNDtyZXR1cm4gY30sZX0oUmUpLGFyPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt0aGlzLmZvbnQ9dCx0aGlzLnN1YnNldD17fSx0aGlzLnVuaWNvZGVzPXt9LHRoaXMubmV4dD0zM31yZXR1cm4gdC5wcm90b3R5cGUuZ2VuZXJhdGVDbWFwPWZ1bmN0aW9uKCl7dmFyIHQsZSxyLG4saTtmb3IoZSBpbiBuPXRoaXMuZm9udC5jbWFwLnRhYmxlc1swXS5jb2RlTWFwLHQ9e30saT10aGlzLnN1YnNldClyPWlbZV0sdFtlXT1uW3JdO3JldHVybiB0fSx0LnByb3RvdHlwZS5nbHlwaHNGb3I9ZnVuY3Rpb24odCl7dmFyIGUscixuLGksYSxvLHM7Zm9yKG49e30sYT0wLG89dC5sZW5ndGg7YTxvO2ErKyluW2k9dFthXV09dGhpcy5mb250LmdseWYuZ2x5cGhGb3IoaSk7Zm9yKGkgaW4gZT1bXSxuKShudWxsIT0ocj1uW2ldKT9yLmNvbXBvdW5kOnZvaWQgMCkmJmUucHVzaC5hcHBseShlLHIuZ2x5cGhJRHMpO2lmKGUubGVuZ3RoPjApZm9yKGkgaW4gcz10aGlzLmdseXBoc0ZvcihlKSlyPXNbaV0sbltpXT1yO3JldHVybiBufSx0LnByb3RvdHlwZS5lbmNvZGU9ZnVuY3Rpb24odCxlKXt2YXIgcixuLGksYSxvLHMsYyx1LGwsaCxmLGQscCxnLG07Zm9yKG4gaW4gcj1HZS5lbmNvZGUodGhpcy5nZW5lcmF0ZUNtYXAoKSwidW5pY29kZSIpLGE9dGhpcy5nbHlwaHNGb3IodCksZj17MDowfSxtPXIuY2hhck1hcClmWyhzPW1bbl0pLm9sZF09cy5uZXc7Zm9yKGQgaW4gaD1yLm1heEdseXBoSUQsYSlkIGluIGZ8fChmW2RdPWgrKyk7cmV0dXJuIHU9ZnVuY3Rpb24odCl7dmFyIGUscjtmb3IoZSBpbiByPXt9LHQpclt0W2VdXT1lO3JldHVybiByfShmKSxsPU9iamVjdC5rZXlzKHUpLnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQtZX0pKSxwPWZ1bmN0aW9uKCl7dmFyIHQsZSxyO2ZvcihyPVtdLHQ9MCxlPWwubGVuZ3RoO3Q8ZTt0Kyspbz1sW3RdLHIucHVzaCh1W29dKTtyZXR1cm4gcn0oKSxpPXRoaXMuZm9udC5nbHlmLmVuY29kZShhLHAsZiksYz10aGlzLmZvbnQubG9jYS5lbmNvZGUoaS5vZmZzZXRzLHApLGc9e2NtYXA6dGhpcy5mb250LmNtYXAucmF3KCksZ2x5ZjppLnRhYmxlLGxvY2E6YyxobXR4OnRoaXMuZm9udC5obXR4LnJhdygpLGhoZWE6dGhpcy5mb250LmhoZWEucmF3KCksbWF4cDp0aGlzLmZvbnQubWF4cC5yYXcoKSxwb3N0OnRoaXMuZm9udC5wb3N0LnJhdygpLG5hbWU6dGhpcy5mb250Lm5hbWUucmF3KCksaGVhZDp0aGlzLmZvbnQuaGVhZC5lbmNvZGUoZSl9LHRoaXMuZm9udC5vczIuZXhpc3RzJiYoZ1siT1MvMiJdPXRoaXMuZm9udC5vczIucmF3KCkpLHRoaXMuZm9udC5kaXJlY3RvcnkuZW5jb2RlKGcpfSx0fSgpO00uQVBJLlBERk9iamVjdD1mdW5jdGlvbigpe3ZhciB0O2Z1bmN0aW9uIGUoKXt9cmV0dXJuIHQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4oQXJyYXkoZSsxKS5qb2luKCIwIikrdCkuc2xpY2UoLWUpfSxlLmNvbnZlcnQ9ZnVuY3Rpb24ocil7dmFyIG4saSxhLG87aWYoQXJyYXkuaXNBcnJheShyKSlyZXR1cm4iWyIrZnVuY3Rpb24oKXt2YXIgdCxpLGE7Zm9yKGE9W10sdD0wLGk9ci5sZW5ndGg7dDxpO3QrKyluPXJbdF0sYS5wdXNoKGUuY29udmVydChuKSk7cmV0dXJuIGF9KCkuam9pbigiICIpKyJdIjtpZigic3RyaW5nIj09dHlwZW9mIHIpcmV0dXJuIi8iK3I7aWYobnVsbCE9cj9yLmlzU3RyaW5nOnZvaWQgMClyZXR1cm4iKCIrcisiKSI7aWYociBpbnN0YW5jZW9mIERhdGUpcmV0dXJuIihEOiIrdChyLmdldFVUQ0Z1bGxZZWFyKCksNCkrdChyLmdldFVUQ01vbnRoKCksMikrdChyLmdldFVUQ0RhdGUoKSwyKSt0KHIuZ2V0VVRDSG91cnMoKSwyKSt0KHIuZ2V0VVRDTWludXRlcygpLDIpK3Qoci5nZXRVVENTZWNvbmRzKCksMikrIlopIjtpZigiW29iamVjdCBPYmplY3RdIj09PXt9LnRvU3RyaW5nLmNhbGwocikpe2ZvcihpIGluIGE9WyI8PCJdLHIpbz1yW2ldLGEucHVzaCgiLyIraSsiICIrZS5jb252ZXJ0KG8pKTtyZXR1cm4gYS5wdXNoKCI+PiIpLGEuam9pbigiXG4iKX1yZXR1cm4iIityfSxlfSgpLHQuQWNyb0Zvcm09eHQsdC5BY3JvRm9ybUFwcGVhcmFuY2U9THQsdC5BY3JvRm9ybUJ1dHRvbj1ndCx0LkFjcm9Gb3JtQ2hlY2tCb3g9eXQsdC5BY3JvRm9ybUNob2ljZUZpZWxkPWh0LHQuQWNyb0Zvcm1Db21ib0JveD1kdCx0LkFjcm9Gb3JtRWRpdEJveD1wdCx0LkFjcm9Gb3JtTGlzdEJveD1mdCx0LkFjcm9Gb3JtUGFzc3dvcmRGaWVsZD1OdCx0LkFjcm9Gb3JtUHVzaEJ1dHRvbj1tdCx0LkFjcm9Gb3JtUmFkaW9CdXR0b249dnQsdC5BY3JvRm9ybVRleHRGaWVsZD13dCx0LkdTdGF0ZT1DLHQuU2hhZGluZ1BhdHRlcm49Tyx0LlRpbGluZ1BhdHRlcm49Qix0LmRlZmF1bHQ9TSx0LmpzUERGPU0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pfSkpOwovLyMgc291cmNlTWFwcGluZ1VSTD1qc3BkZi51bWQubWluLmpzLm1hcA==`;
// 动态加载 jsPDF
if (typeof window.jspdf === 'undefined') {
await loadJsPdfAsync(jsPdfBase64);
}
// 创建按钮和样式
const btnDownloadImages = createButton('下载图片');
const btnDownloadPdf = createButton('下载为PDF');
const qrCodeImg = document.createElement('img');
qrCodeImg.src = 'https://example.com/your-qrcode.png'; // 替换为二维码图片的实际URL
qrCodeImg.style.width = '100px';
qrCodeImg.style.height = '100px';
const downloadBtnContainer = document.createElement('div');
// 按钮容器的样式设置
Object.assign(downloadBtnContainer.style, {
position: 'fixed',
right: '50px',
top: '50%',
transform: 'translateY(-50%)',
padding: '10px',
backgroundColor: '#f0f0f0',
color: '#000',
border: '1px solid #007bff',
borderRadius: '5px',
cursor: 'pointer',
fontSize: '16px',
zIndex: '1000',
display: 'none',
flexDirection: 'column',
alignItems: 'center'
});
const toggleBtn = document.createElement('div');
toggleBtn.innerText = '工具';
Object.assign(toggleBtn.style, {
position: 'fixed',
right: '20px',
top: '50%',
transform: 'translateY(-50%)',
padding: '10px',
backgroundColor: '#007bff',
color: '#fff',
border: '1px solid #fff',
borderRadius: '5px',
cursor: 'pointer',
fontSize: '16px',
zIndex: '1001' // 确保比 downloadBtnContainer 更高的 z-index
});
// 将按钮和二维码图片添加到容器
downloadBtnContainer.appendChild(btnDownloadImages);
downloadBtnContainer.appendChild(btnDownloadPdf);
downloadBtnContainer.appendChild(qrCodeImg);
// 将容器和切换按钮添加到页面
document.body.appendChild(toggleBtn);
document.body.appendChild(downloadBtnContainer);
// 添加切换功能
toggleBtn.addEventListener('click', () => {
downloadBtnContainer.style.display = (downloadBtnContainer.style.display === 'none' || !downloadBtnContainer.style.display) ? 'flex' : 'none';
});
// 创建基本样式对象
const baseStyle = {
position: 'fixed',
top: '0',
left: '50%',
transform: 'translateX(-50%)',
color: 'white',
padding: '10px',
zIndex: '1002', // 确保比 toggleBtn 更高的 z-index
display: 'none'
};
// 错误提示元素
const errorDiv = document.createElement('div');
Object.assign(errorDiv.style, baseStyle, { backgroundColor: 'red' });
document.body.appendChild(errorDiv);
// 信息提示元素
const infoDiv = document.createElement('div');
Object.assign(infoDiv.style, baseStyle, { backgroundColor: 'blue' });
document.body.appendChild(infoDiv);
// 显示错误提示
function showError(message) {
errorDiv.innerText = message;
errorDiv.style.display = 'block';
setTimeout(() => { errorDiv.style.display = 'none'; }, 5000);
}
// 显示信息提示
function showInfo(message) {
infoDiv.innerText = message;
infoDiv.style.display = 'block';
setTimeout(() => { infoDiv.style.display = 'none'; }, 5000);
}
// 创建按钮的函数
function createButton(text) {
const btn = document.createElement('button');
btn.innerText = text;
Object.assign(btn.style, {
padding: '10px 20px',
backgroundColor: '#007bff',
color: '#fff',
border: 'none',
borderRadius: '5px',
cursor: 'pointer',
fontSize: '16px',
display: 'block',
marginBottom: '10px'
});
return btn;
}
// 获取当前时间并格式化
function getFormattedTime() {
const now = new Date();
return `${now.getFullYear()}${String(now.getMonth() + 1).padStart(2, '0')}${String(now.getDate()).padStart(2, '0')}` +
`${String(now.getHours()).padStart(2, '0')}${String(now.getMinutes()).padStart(2, '0')}${String(now.getSeconds()).padStart(2, '0')}`;
}
// 获取活动名称
function getActivityName() {
const activityNameNode = document.getElementById('activity-name');
return activityNameNode ? activityNameNode.innerText.trim() : document.title.trim();
}
// 获取图片下载链接
function getDownloadLinks() {
const pageContent = document.getElementById('page-content');
if (!pageContent) {
showError('找不到 id 为 page-content 的元素');
return [];
}
const images = Array.from(pageContent.querySelectorAll('img'));
if (images.length === 0) {
showError('没有找到图片元素');
return [];
}
const downloadLinks = [];
images.forEach((img) => {
const src = img.getAttribute('data-src') || img.getAttribute('src');
if (src) {
const match = src.match(/\/sz_mmbiz_(\w+)\//);
if (match && match[1]) {
downloadLinks.push({ url: src, extension: match[1] });
} else {
showInfo(`无法从地址提取文件后缀: ${src}`);
}
} else {
showInfo('图片元素缺少有效的 src 或 data-src 属性');
}
});
return downloadLinks;
}
// 下载图片的函数
async function downloadImages() {
const formattedTime = getFormattedTime();
const activityName = getActivityName();
const downloadLinks = getDownloadLinks();
if (downloadLinks.length === 0) return;
for (let i = 0; i < downloadLinks.length; i++) {
setTimeout(async () => {
try {
const response = await fetch(downloadLinks[i].url);
if (!response.ok) throw new Error(`网络响应失败: ${response.statusText}`);
const blob = await response.blob();
const url = window.URL.createObjectURL(blob);
const a = document.createElement('a');
a.style.display = 'none';
a.href = url;
a.download = `${activityName}_${formattedTime}_${i + 1}.${downloadLinks[i].extension}`;
document.body.appendChild(a);
a.click();
window.URL.revokeObjectURL(url);
document.body.removeChild(a);
showInfo(`下载图片: ${activityName}_${formattedTime}_${i + 1}.${downloadLinks[i].extension}`);
} catch (error) {
showError(`下载图片时发生错误: ${error.message}`);
}
}, i * 1000);
}
showInfo('图片下载链接已生成并开始下载');
}
// 下载PDF的函数
async function downloadPdf() {
if (typeof window.jspdf === 'undefined') {
// 如果 window.jspdf 仍然未定义,动态加载一次脚本
await loadJsPdfAsync(jsPdfBase64);
}
await proceedWithPdfDownload();
}
async function loadJsPdfAsync(base64Code) {
return new Promise((resolve, reject) => {
const jsPdfCode = atob(base64Code);
const blob = new Blob([jsPdfCode], { type: 'application/javascript' });
const script = document.createElement('script');
script.src = URL.createObjectURL(blob);
script.onload = resolve;
script.onerror = reject;
document.head.appendChild(script);
});
}
async function proceedWithPdfDownload() {
const { jsPDF } = window.jspdf;
const formattedTime = getFormattedTime();
const activityName = getActivityName();
const downloadLinks = getDownloadLinks();
if (downloadLinks.length === 0) return;
const pdfDoc = new jsPDF();
let firstPage = true;
for (let i = 0; i < downloadLinks.length; i++) {
try {
const response = await fetch(downloadLinks[i].url);
if (!response.ok) throw new Error(`网络响应失败: ${response.statusText}`);
const blob = await response.blob();
const base64 = await blobToBase64(blob);
if (!firstPage) {
pdfDoc.addPage();
}
pdfDoc.addImage(base64, 'JPEG', 10, 10, 190, 0);
firstPage = false;
showInfo(`处理图片: ${activityName}_${formattedTime}_${i + 1}.${downloadLinks[i].extension}`);
} catch (error) {
showError(`下载图片时发生错误: ${error.message}`);
}
}
pdfDoc.save(`${activityName}_${formattedTime}.pdf`);
showInfo('图片下载PDF已生成并开始下载');
}
function blobToBase64(blob) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onloadend = () => resolve(reader.result.split(',')[1]);
reader.onerror = reject;
reader.readAsDataURL(blob);
});
}
// 按钮点击事件处理函数
btnDownloadImages.addEventListener('click', async () => {
btnDownloadImages.disabled = true; // 禁用按钮
await downloadImages();
btnDownloadImages.disabled = false; // 所有操作完成后重新启用按钮
});
btnDownloadPdf.addEventListener('click', async () => {
btnDownloadPdf.disabled = true; // 禁用按钮
await downloadPdf();
btnDownloadPdf.disabled = false; // 所有操作完成后重新启用按钮
});
})();