Ly8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCgojaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0lKYXZhU2NyaXB0LmgiCiNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSlNfRGVmaW5lLmgiCiNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSlNfT2JqZWN0LmgiCiNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSlNfVmFsdWUuaCIKI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9QdWJsaWNNZXRob2RzLmgiCiNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSlNfRXZlbnRIYW5kbGVyLmgiCiNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvcmVzb3VyY2UuaCIKI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KU19Db250ZXh0LmgiCiNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSlNfVmFsdWUuaCIKI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC91dGlsLmgiCiNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvRmllbGQuaCIKI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9jb2xvci5oIgojaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX1J1bnRpbWUuaCIKCnN0YXRpYyB2ODo6SXNvbGF0ZSogR2V0SXNvbGF0ZShJRlhKU19Db250ZXh0KiBjYykgewogIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwoKICBDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0SlNSdW50aW1lKCk7CiAgQVNTRVJUKHBSdW50aW1lICE9IE5VTEwpOwoKICByZXR1cm4gcFJ1bnRpbWUtPkdldElzb2xhdGUoKTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ0pTX1B1YmxpY01ldGhvZHMKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCiNkZWZpbmUgRE9VQkxFX0NPUlJFQ1QgMC4wMDAwMDAwMDAwMDAwMDEKCkJFR0lOX0pTX1NUQVRJQ19HTE9CQUxfRlVOKENKU19QdWJsaWNNZXRob2RzKQpKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRk51bWJlcl9Gb3JtYXQpCkpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGTnVtYmVyX0tleXN0cm9rZSkKSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZQZXJjZW50X0Zvcm1hdCkKSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZQZXJjZW50X0tleXN0cm9rZSkKSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZEYXRlX0Zvcm1hdEV4KQpKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRkRhdGVfS2V5c3Ryb2tlRXgpCkpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGRGF0ZV9Gb3JtYXQpCkpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGRGF0ZV9LZXlzdHJva2UpCkpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGVGltZV9Gb3JtYXRFeCkKSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZUaW1lX0tleXN0cm9rZUV4KQpKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlRpbWVfRm9ybWF0KQpKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlRpbWVfS2V5c3Ryb2tlKQpKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlNwZWNpYWxfRm9ybWF0KQpKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlNwZWNpYWxfS2V5c3Ryb2tlKQpKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlNwZWNpYWxfS2V5c3Ryb2tlRXgpCkpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGU2ltcGxlKQpKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRk1ha2VOdW1iZXIpCkpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGU2ltcGxlX0NhbGN1bGF0ZSkKSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZSYW5nZV9WYWxpZGF0ZSkKSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZNZXJnZUNoYW5nZSkKSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZQYXJzZURhdGVFeCkKSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZFeHRyYWN0TnVtcykKRU5EX0pTX1NUQVRJQ19HTE9CQUxfRlVOKCkKCklNUExFTUVOVF9KU19TVEFUSUNfR0xPQkFMX0ZVTihDSlNfUHVibGljTWV0aG9kcykKCnN0YXRpYyBjb25zdCBGWF9XQ0hBUiogbW9udGhzW10gPSB7TCJKYW4iLCBMIkZlYiIsIEwiTWFyIiwgTCJBcHIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiTWF5IiwgTCJKdW4iLCBMIkp1bCIsIEwiQXVnIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIlNlcCIsIEwiT2N0IiwgTCJOb3YiLCBMIkRlYyJ9OwoKc3RhdGljIGNvbnN0IEZYX1dDSEFSKiBmdWxsbW9udGhzW10gPSB7TCJKYW51YXJ5IiwgTCJGZWJydWFyeSIsIEwiTWFyY2giLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIkFwcmlsIiwgICBMIk1heSIsICAgICAgTCJKdW5lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJKdWx5IiwgICAgTCJBdWd1c3QiLCAgIEwiU2VwdGVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJPY3RvYmVyIiwgTCJOb3ZlbWJlciIsIEwiRGVjZW1iZXIifTsKCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OklzTnVtYmVyKGNvbnN0IEZYX1dDSEFSKiBzdHJpbmcpIHsKICBDRlhfV2lkZVN0cmluZyBzVHJpbSA9IFN0clRyaW0oc3RyaW5nKTsKICBjb25zdCBGWF9XQ0hBUiogcFRyaW0gPSBzVHJpbS5jX3N0cigpOwogIGNvbnN0IEZYX1dDSEFSKiBwID0gcFRyaW07CgogIEZYX0JPT0wgYkRvdCA9IEZBTFNFOwogIEZYX0JPT0wgYktYSlMgPSBGQUxTRTsKCiAgd2NoYXJfdCBjOwogIHdoaWxlICgoYyA9ICpwKSkgewogICAgaWYgKGMgPT0gJy4nIHx8IGMgPT0gJywnKSB7CiAgICAgIGlmIChiRG90KQogICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgYkRvdCA9IFRSVUU7CiAgICB9IGVsc2UgaWYgKGMgPT0gJy0nIHx8IGMgPT0gJysnKSB7CiAgICAgIGlmIChwICE9IHBUcmltKQogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0gZWxzZSBpZiAoYyA9PSAnZScgfHwgYyA9PSAnRScpIHsKICAgICAgaWYgKGJLWEpTKQogICAgICAgIHJldHVybiBGQUxTRTsKCiAgICAgIHArKzsKICAgICAgYyA9ICpwOwogICAgICBpZiAoYyA9PSAnKycgfHwgYyA9PSAnLScpIHsKICAgICAgICBiS1hKUyA9IFRSVUU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICB9CiAgICB9IGVsc2UgaWYgKCFJc0RpZ2l0KGMpKSB7CiAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KICAgIHArKzsKICB9CgogIHJldHVybiBUUlVFOwp9CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpJc0RpZ2l0KHdjaGFyX3QgY2gpIHsKICByZXR1cm4gKGNoID49IEwnMCcgJiYgY2ggPD0gTCc5Jyk7Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OklzRGlnaXQoY2hhciBjaCkgewogIHJldHVybiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5Jyk7Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OklzQWxwaGFiZXRpYyh3Y2hhcl90IGNoKSB7CiAgcmV0dXJuICgoY2ggPj0gTCdhJyAmJiBjaCA8PSBMJ3onKSB8fCAoY2ggPj0gTCdBJyAmJiBjaCA8PSBMJ1onKSk7Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OklzQWxwaGFOdW1lcmljKHdjaGFyX3QgY2gpIHsKICByZXR1cm4gKElzRGlnaXQoY2gpIHx8IElzQWxwaGFiZXRpYyhjaCkpOwp9CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjptYXNrU2F0aXNmaWVkKHdjaGFyX3QgY19DaGFuZ2UsIHdjaGFyX3QgY19NYXNrKSB7CiAgc3dpdGNoIChjX01hc2spIHsKICAgIGNhc2UgTCc5JzoKICAgICAgcmV0dXJuIElzRGlnaXQoY19DaGFuZ2UpOwogICAgY2FzZSBMJ0EnOgogICAgICByZXR1cm4gSXNBbHBoYWJldGljKGNfQ2hhbmdlKTsKICAgIGNhc2UgTCdPJzoKICAgICAgcmV0dXJuIElzQWxwaGFOdW1lcmljKGNfQ2hhbmdlKTsKICAgIGNhc2UgTCdYJzoKICAgICAgcmV0dXJuIFRSVUU7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gKGNfQ2hhbmdlID09IGNfTWFzayk7CiAgfQp9CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjppc1Jlc2VydmVkTWFza0NoYXIod2NoYXJfdCBjaCkgewogIHJldHVybiBjaCA9PSBMJzknIHx8IGNoID09IEwnQScgfHwgY2ggPT0gTCdPJyB8fCBjaCA9PSBMJ1gnOwp9Cgpkb3VibGUgQ0pTX1B1YmxpY01ldGhvZHM6OkFGX1NpbXBsZShjb25zdCBGWF9XQ0hBUiogc0Z1Y3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkVmFsdWUxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZFZhbHVlMikgewogIGlmIChGWFNZU193Y3NpY21wKHNGdWN0aW9uLCBMIkFWRyIpID09IDAgfHwKICAgICAgRlhTWVNfd2NzaWNtcChzRnVjdGlvbiwgTCJTVU0iKSA9PSAwKSB7CiAgICByZXR1cm4gZFZhbHVlMSArIGRWYWx1ZTI7CiAgfQogIGlmIChGWFNZU193Y3NpY21wKHNGdWN0aW9uLCBMIlBSRCIpID09IDApIHsKICAgIHJldHVybiBkVmFsdWUxICogZFZhbHVlMjsKICB9CiAgaWYgKEZYU1lTX3djc2ljbXAoc0Z1Y3Rpb24sIEwiTUlOIikgPT0gMCkgewogICAgcmV0dXJuIEZYX01JTihkVmFsdWUxLCBkVmFsdWUyKTsKICB9CiAgaWYgKEZYU1lTX3djc2ljbXAoc0Z1Y3Rpb24sIEwiTUFYIikgPT0gMCkgewogICAgcmV0dXJuIEZYX01BWChkVmFsdWUxLCBkVmFsdWUyKTsKICB9CiAgcmV0dXJuIGRWYWx1ZTE7Cn0KCkNGWF9XaWRlU3RyaW5nIENKU19QdWJsaWNNZXRob2RzOjpTdHJMVHJpbShjb25zdCBGWF9XQ0hBUiogcFN0cikgewogIHdoaWxlICgqcFN0ciAmJiAqcFN0ciA9PSBMJyAnKQogICAgcFN0cisrOwoKICByZXR1cm4gcFN0cjsKfQoKQ0ZYX1dpZGVTdHJpbmcgQ0pTX1B1YmxpY01ldGhvZHM6OlN0clJUcmltKGNvbnN0IEZYX1dDSEFSKiBwU3RyKSB7CiAgY29uc3QgRlhfV0NIQVIqIHAgPSBwU3RyOwogIHdoaWxlICgqcCkKICAgIHArKzsKICB3aGlsZSAocCA+IHBTdHIgJiYgKihwIC0gMSkgPT0gTCcgJykKICAgIHAtLTsKCiAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKHBTdHIsIHAgLSBwU3RyKTsKfQoKQ0ZYX1dpZGVTdHJpbmcgQ0pTX1B1YmxpY01ldGhvZHM6OlN0clRyaW0oY29uc3QgRlhfV0NIQVIqIHBTdHIpIHsKICByZXR1cm4gU3RyUlRyaW0oU3RyTFRyaW0ocFN0cikuY19zdHIoKSk7Cn0KCkNGWF9CeXRlU3RyaW5nIENKU19QdWJsaWNNZXRob2RzOjpTdHJMVHJpbShjb25zdCBGWF9DSEFSKiBwU3RyKSB7CiAgd2hpbGUgKCpwU3RyICYmICpwU3RyID09ICcgJykKICAgIHBTdHIrKzsKCiAgcmV0dXJuIHBTdHI7Cn0KCkNGWF9CeXRlU3RyaW5nIENKU19QdWJsaWNNZXRob2RzOjpTdHJSVHJpbShjb25zdCBGWF9DSEFSKiBwU3RyKSB7CiAgY29uc3QgRlhfQ0hBUiogcCA9IHBTdHI7CiAgd2hpbGUgKCpwKQogICAgcCsrOwogIHdoaWxlIChwID4gcFN0ciAmJiAqKHAgLSAxKSA9PSBMJyAnKQogICAgcC0tOwoKICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcocFN0ciwgcCAtIHBTdHIpOwp9CgpDRlhfQnl0ZVN0cmluZyBDSlNfUHVibGljTWV0aG9kczo6U3RyVHJpbShjb25zdCBGWF9DSEFSKiBwU3RyKSB7CiAgcmV0dXJuIFN0clJUcmltKFN0ckxUcmltKHBTdHIpKTsKfQoKZG91YmxlIENKU19QdWJsaWNNZXRob2RzOjpQYXJzZU51bWJlcihjb25zdCBGWF9XQ0hBUiogc3dTb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkFsbERpZ2l0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiRG90LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJTaWduLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJLWEpTKSB7CiAgYkRvdCA9IEZBTFNFOwogIGJTaWduID0gRkFMU0U7CiAgYktYSlMgPSBGQUxTRTsKCiAgRlhfQk9PTCBiRGlnaXRFeGlzdCA9IEZBTFNFOwoKICBjb25zdCBGWF9XQ0hBUiogcCA9IHN3U291cmNlOwogIHdjaGFyX3QgYzsKCiAgY29uc3QgRlhfV0NIQVIqIHBTdGFydCA9IE5VTEw7CiAgY29uc3QgRlhfV0NIQVIqIHBFbmQgPSBOVUxMOwoKICB3aGlsZSAoKGMgPSAqcCkpIHsKICAgIGlmICghcFN0YXJ0ICYmIGMgIT0gTCcgJykgewogICAgICBwU3RhcnQgPSBwOwogICAgfQoKICAgIHBFbmQgPSBwOwogICAgcCsrOwogIH0KCiAgaWYgKCFwU3RhcnQpIHsKICAgIGJBbGxEaWdpdHMgPSBGQUxTRTsKICAgIHJldHVybiAwOwogIH0KCiAgd2hpbGUgKHBFbmQgIT0gcFN0YXJ0KSB7CiAgICBpZiAoKnBFbmQgPT0gTCcgJykKICAgICAgcEVuZC0tOwogICAgZWxzZQogICAgICBicmVhazsKICB9CgogIGRvdWJsZSBkUmV0ID0gMDsKICBwID0gcFN0YXJ0OwogIGJBbGxEaWdpdHMgPSBUUlVFOwogIENGWF9XaWRlU3RyaW5nIHN3RGlnaXRzOwoKICB3aGlsZSAocCA8PSBwRW5kKSB7CiAgICBjID0gKnA7CgogICAgaWYgKElzRGlnaXQoYykpIHsKICAgICAgc3dEaWdpdHMgKz0gYzsKICAgICAgYkRpZ2l0RXhpc3QgPSBUUlVFOwogICAgfSBlbHNlIHsKICAgICAgc3dpdGNoIChjKSB7CiAgICAgICAgY2FzZSBMJyAnOgogICAgICAgICAgYkFsbERpZ2l0cyA9IEZBTFNFOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBMJy4nOgogICAgICAgIGNhc2UgTCcsJzoKICAgICAgICAgIGlmICghYkRvdCkgewogICAgICAgICAgICBpZiAoYkRpZ2l0RXhpc3QpIHsKICAgICAgICAgICAgICBzd0RpZ2l0cyArPSBMJy4nOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHN3RGlnaXRzICs9IEwnMCc7CiAgICAgICAgICAgICAgc3dEaWdpdHMgKz0gTCcuJzsKICAgICAgICAgICAgICBiRGlnaXRFeGlzdCA9IFRSVUU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGJEb3QgPSBUUlVFOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICBjYXNlICdlJzoKICAgICAgICBjYXNlICdFJzoKICAgICAgICAgIGlmICghYktYSlMpIHsKICAgICAgICAgICAgcCsrOwogICAgICAgICAgICBjID0gKnA7CiAgICAgICAgICAgIGlmIChjID09ICcrJyB8fCBjID09ICctJykgewogICAgICAgICAgICAgIGJLWEpTID0gVFJVRTsKICAgICAgICAgICAgICBzd0RpZ2l0cyArPSAnZSc7CiAgICAgICAgICAgICAgc3dEaWdpdHMgKz0gYzsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICBjYXNlIEwnLSc6CiAgICAgICAgICBpZiAoIWJEaWdpdEV4aXN0ICYmICFiU2lnbikgewogICAgICAgICAgICBzd0RpZ2l0cyArPSBjOwogICAgICAgICAgICBiU2lnbiA9IFRSVUU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICBiQWxsRGlnaXRzID0gRkFMU0U7CgogICAgICAgICAgaWYgKHAgIT0gcFN0YXJ0ICYmICFiRG90ICYmIGJEaWdpdEV4aXN0KSB7CiAgICAgICAgICAgIHN3RGlnaXRzICs9IEwnLic7CiAgICAgICAgICAgIGJEb3QgPSBUUlVFOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYkRvdCA9IEZBTFNFOwogICAgICAgICAgICBiRGlnaXRFeGlzdCA9IEZBTFNFOwogICAgICAgICAgICBzd0RpZ2l0cyA9IEwiIjsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CgogICAgcCsrOwogIH0KCiAgaWYgKHN3RGlnaXRzLkdldExlbmd0aCgpID4gMCAmJiBzd0RpZ2l0cy5HZXRMZW5ndGgoKSA8IDE3KSB7CiAgICBDRlhfQnl0ZVN0cmluZyBzRGlnaXRzID0gc3dEaWdpdHMuVVRGOEVuY29kZSgpOwoKICAgIGlmIChiS1hKUykgewogICAgICBkUmV0ID0gYXRvZihzRGlnaXRzKTsKICAgIH0gZWxzZSB7CiAgICAgIGlmIChiRG90KSB7CiAgICAgICAgY2hhciogcFN0b3BTdHJpbmc7CiAgICAgICAgZFJldCA9IDo6c3RydG9kKHNEaWdpdHMsICZwU3RvcFN0cmluZyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZFJldCA9IGF0b2woc0RpZ2l0cyk7CiAgICAgIH0KICAgIH0KICB9CgogIHJldHVybiBkUmV0Owp9Cgpkb3VibGUgQ0pTX1B1YmxpY01ldGhvZHM6OlBhcnNlU3RyaW5nVG9OdW1iZXIoY29uc3QgRlhfV0NIQVIqIHN3U291cmNlKSB7CiAgRlhfQk9PTCBiQWxsRGlnaXRzID0gRkFMU0U7CiAgRlhfQk9PTCBiRG90ID0gRkFMU0U7CiAgRlhfQk9PTCBiU2lnbiA9IEZBTFNFOwogIEZYX0JPT0wgYktYSlMgPSBGQUxTRTsKCiAgcmV0dXJuIFBhcnNlTnVtYmVyKHN3U291cmNlLCBiQWxsRGlnaXRzLCBiRG90LCBiU2lnbiwgYktYSlMpOwp9CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpDb252ZXJ0U3RyaW5nVG9OdW1iZXIoY29uc3QgRlhfV0NIQVIqIHN3U291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlJiBkUmV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkRvdCkgewogIEZYX0JPT0wgYkFsbERpZ2l0cyA9IEZBTFNFOwogIEZYX0JPT0wgYlNpZ24gPSBGQUxTRTsKICBGWF9CT09MIGJLWEpTID0gRkFMU0U7CgogIGRSZXQgPSBQYXJzZU51bWJlcihzd1NvdXJjZSwgYkFsbERpZ2l0cywgYkRvdCwgYlNpZ24sIGJLWEpTKTsKCiAgcmV0dXJuIGJBbGxEaWdpdHM7Cn0KCkNKU19BcnJheSBDSlNfUHVibGljTWV0aG9kczo6QUZfTWFrZUFycmF5RnJvbUxpc3Qodjg6Oklzb2xhdGUqIGlzb2xhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlIHZhbCkgewogIENKU19BcnJheSBTdHJBcnJheShpc29sYXRlKTsKICBpZiAodmFsLklzQXJyYXlPYmplY3QoKSkgewogICAgdmFsLkNvbnZlcnRUb0FycmF5KFN0ckFycmF5KTsKICAgIHJldHVybiBTdHJBcnJheTsKICB9CiAgQ0ZYX1dpZGVTdHJpbmcgd3NTdHIgPSB2YWwuVG9DRlhXaWRlU3RyaW5nKCk7CiAgQ0ZYX0J5dGVTdHJpbmcgdCA9IENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZSh3c1N0cik7CiAgY29uc3QgY2hhciogcCA9IChjb25zdCBjaGFyKil0OwoKICBpbnQgY2ggPSAnLCc7CiAgaW50IG5JbmRleCA9IDA7CgogIHdoaWxlICgqcCkgewogICAgY29uc3QgY2hhciogcFRlbXAgPSBzdHJjaHIocCwgY2gpOwogICAgaWYgKHBUZW1wID09IE5VTEwpIHsKICAgICAgU3RyQXJyYXkuU2V0RWxlbWVudChuSW5kZXgsIENKU19WYWx1ZShpc29sYXRlLCBTdHJUcmltKHApLmNfc3RyKCkpKTsKICAgICAgYnJlYWs7CiAgICB9IGVsc2UgewogICAgICBjaGFyKiBwU3ViID0gbmV3IGNoYXJbcFRlbXAgLSBwICsgMV07CiAgICAgIHN0cm5jcHkocFN1YiwgcCwgcFRlbXAgLSBwKTsKICAgICAgKihwU3ViICsgKHBUZW1wIC0gcCkpID0gJ1wwJzsKCiAgICAgIFN0ckFycmF5LlNldEVsZW1lbnQobkluZGV4LCBDSlNfVmFsdWUoaXNvbGF0ZSwgU3RyVHJpbShwU3ViKS5jX3N0cigpKSk7CiAgICAgIGRlbGV0ZVtdIHBTdWI7CgogICAgICBuSW5kZXgrKzsKICAgICAgcCA9ICsrcFRlbXA7CiAgICB9CiAgfQogIHJldHVybiBTdHJBcnJheTsKfQoKaW50IENKU19QdWJsaWNNZXRob2RzOjpQYXJzZVN0cmluZ0ludGVnZXIoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cmluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5TdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBuU2tpcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5NYXhTdGVwKSB7CiAgaW50IG5SZXQgPSAwOwogIG5Ta2lwID0gMDsKICBmb3IgKGludCBpID0gblN0YXJ0LCBzeiA9IHN0cmluZy5HZXRMZW5ndGgoKTsgaSA8IHN6OyBpKyspIHsKICAgIGlmIChpIC0gblN0YXJ0ID4gMTApCiAgICAgIGJyZWFrOwoKICAgIEZYX1dDSEFSIGMgPSBzdHJpbmcuR2V0QXQoaSk7CiAgICBpZiAoSXNEaWdpdCgod2NoYXJfdCljKSkgewogICAgICBuUmV0ID0gblJldCAqIDEwICsgKGMgLSAnMCcpOwogICAgICBuU2tpcCA9IGkgLSBuU3RhcnQgKyAxOwogICAgICBpZiAoblNraXAgPj0gbk1heFN0ZXApCiAgICAgICAgYnJlYWs7CiAgICB9IGVsc2UKICAgICAgYnJlYWs7CiAgfQoKICByZXR1cm4gblJldDsKfQoKQ0ZYX1dpZGVTdHJpbmcgQ0pTX1B1YmxpY01ldGhvZHM6OlBhcnNlU3RyaW5nU3RyaW5nKAogICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cmluZywKICAgIGludCBuU3RhcnQsCiAgICBpbnQmIG5Ta2lwKSB7CiAgQ0ZYX1dpZGVTdHJpbmcgc3dSZXQ7CiAgblNraXAgPSAwOwogIGZvciAoaW50IGkgPSBuU3RhcnQsIHN6ID0gc3RyaW5nLkdldExlbmd0aCgpOyBpIDwgc3o7IGkrKykgewogICAgRlhfV0NIQVIgYyA9IHN0cmluZy5HZXRBdChpKTsKICAgIGlmICgoYyA+PSBMJ2EnICYmIGMgPD0gTCd6JykgfHwgKGMgPj0gTCdBJyAmJiBjIDw9IEwnWicpKSB7CiAgICAgIHN3UmV0ICs9IGM7CiAgICAgIG5Ta2lwID0gaSAtIG5TdGFydCArIDE7CiAgICB9IGVsc2UKICAgICAgYnJlYWs7CiAgfQoKICByZXR1cm4gc3dSZXQ7Cn0KCmRvdWJsZSBDSlNfUHVibGljTWV0aG9kczo6UGFyc2VOb3JtYWxEYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYldyb25nRm9ybWF0KSB7CiAgZG91YmxlIGR0ID0gSlNfR2V0RGF0ZVRpbWUoKTsKCiAgaW50IG5ZZWFyID0gSlNfR2V0WWVhckZyb21UaW1lKGR0KTsKICBpbnQgbk1vbnRoID0gSlNfR2V0TW9udGhGcm9tVGltZShkdCkgKyAxOwogIGludCBuRGF5ID0gSlNfR2V0RGF5RnJvbVRpbWUoZHQpOwogIGludCBuSG91ciA9IEpTX0dldEhvdXJGcm9tVGltZShkdCk7CiAgaW50IG5NaW4gPSBKU19HZXRNaW5Gcm9tVGltZShkdCk7CiAgaW50IG5TZWMgPSBKU19HZXRTZWNGcm9tVGltZShkdCk7CgogIGludCBudW1iZXJbM107CgogIGludCBuU2tpcCA9IDA7CiAgaW50IG5MZW4gPSB2YWx1ZS5HZXRMZW5ndGgoKTsKICBpbnQgbkluZGV4ID0gMDsKICBpbnQgaSA9IDA7CiAgd2hpbGUgKGkgPCBuTGVuKSB7CiAgICBpZiAobkluZGV4ID4gMikKICAgICAgYnJlYWs7CgogICAgRlhfV0NIQVIgYyA9IHZhbHVlLkdldEF0KGkpOwogICAgaWYgKElzRGlnaXQoKHdjaGFyX3QpYykpIHsKICAgICAgbnVtYmVyW25JbmRleCsrXSA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaSwgblNraXAsIDQpOwogICAgICBpICs9IG5Ta2lwOwogICAgfSBlbHNlIHsKICAgICAgaSsrOwogICAgfQogIH0KCiAgaWYgKG5JbmRleCA9PSAyKSB7CiAgICAvLyBjYXNlMjogbW9udGgvZGF5CiAgICAvLyBjYXNlMzogZGF5L21vbnRoCiAgICBpZiAoKG51bWJlclswXSA+PSAxICYmIG51bWJlclswXSA8PSAxMikgJiYKICAgICAgICAobnVtYmVyWzFdID49IDEgJiYgbnVtYmVyWzFdIDw9IDMxKSkgewogICAgICBuTW9udGggPSBudW1iZXJbMF07CiAgICAgIG5EYXkgPSBudW1iZXJbMV07CiAgICB9IGVsc2UgaWYgKChudW1iZXJbMF0gPj0gMSAmJiBudW1iZXJbMF0gPD0gMzEpICYmCiAgICAgICAgICAgICAgIChudW1iZXJbMV0gPj0gMSAmJiBudW1iZXJbMV0gPD0gMTIpKSB7CiAgICAgIG5EYXkgPSBudW1iZXJbMF07CiAgICAgIG5Nb250aCA9IG51bWJlclsxXTsKICAgIH0KCiAgICBiV3JvbmdGb3JtYXQgPSBGQUxTRTsKICB9IGVsc2UgaWYgKG5JbmRleCA9PSAzKSB7CiAgICAvLyBjYXNlMTogeWVhci9tb250aC9kYXkKICAgIC8vIGNhc2UyOiBtb250aC9kYXkveWVhcgogICAgLy8gY2FzZTM6IGRheS9tb250aC95ZWFyCgogICAgaWYgKG51bWJlclswXSA+IDEyICYmIChudW1iZXJbMV0gPj0gMSAmJiBudW1iZXJbMV0gPD0gMTIpICYmCiAgICAgICAgKG51bWJlclsyXSA+PSAxICYmIG51bWJlclsyXSA8PSAzMSkpIHsKICAgICAgblllYXIgPSBudW1iZXJbMF07CiAgICAgIG5Nb250aCA9IG51bWJlclsxXTsKICAgICAgbkRheSA9IG51bWJlclsyXTsKICAgIH0gZWxzZSBpZiAoKG51bWJlclswXSA+PSAxICYmIG51bWJlclswXSA8PSAxMikgJiYKICAgICAgICAgICAgICAgKG51bWJlclsxXSA+PSAxICYmIG51bWJlclsxXSA8PSAzMSkgJiYgbnVtYmVyWzJdID4gMzEpIHsKICAgICAgbk1vbnRoID0gbnVtYmVyWzBdOwogICAgICBuRGF5ID0gbnVtYmVyWzFdOwogICAgICBuWWVhciA9IG51bWJlclsyXTsKICAgIH0gZWxzZSBpZiAoKG51bWJlclswXSA+PSAxICYmIG51bWJlclswXSA8PSAzMSkgJiYKICAgICAgICAgICAgICAgKG51bWJlclsxXSA+PSAxICYmIG51bWJlclsxXSA8PSAxMikgJiYgbnVtYmVyWzJdID4gMzEpIHsKICAgICAgbkRheSA9IG51bWJlclswXTsKICAgICAgbk1vbnRoID0gbnVtYmVyWzFdOwogICAgICBuWWVhciA9IG51bWJlclsyXTsKICAgIH0KCiAgICBiV3JvbmdGb3JtYXQgPSBGQUxTRTsKICB9IGVsc2UgewogICAgYldyb25nRm9ybWF0ID0gVFJVRTsKICAgIHJldHVybiBkdDsKICB9CgogIENGWF9XaWRlU3RyaW5nIHN3VGVtcDsKICBzd1RlbXAuRm9ybWF0KEwiJWQvJWQvJWQgJWQ6JWQ6JWQiLCBuTW9udGgsIG5EYXksIG5ZZWFyLCBuSG91ciwgbk1pbiwgblNlYyk7CiAgcmV0dXJuIEpTX0RhdGVQYXJzZShzd1RlbXAuY19zdHIoKSk7Cn0KCmRvdWJsZSBDSlNfUHVibGljTWV0aG9kczo6TWFrZVJlZ3VsYXJEYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYldyb25nRm9ybWF0KSB7CiAgZG91YmxlIGR0ID0gSlNfR2V0RGF0ZVRpbWUoKTsKCiAgaWYgKGZvcm1hdC5Jc0VtcHR5KCkgfHwgdmFsdWUuSXNFbXB0eSgpKQogICAgcmV0dXJuIGR0OwoKICBpbnQgblllYXIgPSBKU19HZXRZZWFyRnJvbVRpbWUoZHQpOwogIGludCBuTW9udGggPSBKU19HZXRNb250aEZyb21UaW1lKGR0KSArIDE7CiAgaW50IG5EYXkgPSBKU19HZXREYXlGcm9tVGltZShkdCk7CiAgaW50IG5Ib3VyID0gSlNfR2V0SG91ckZyb21UaW1lKGR0KTsKICBpbnQgbk1pbiA9IEpTX0dldE1pbkZyb21UaW1lKGR0KTsKICBpbnQgblNlYyA9IEpTX0dldFNlY0Zyb21UaW1lKGR0KTsKCiAgaW50IG5ZZWFyU3ViID0gOTk7ICAvLyBuWWVhciAtIDIwMDA7CgogIEZYX0JPT0wgYlBtID0gRkFMU0U7CiAgRlhfQk9PTCBiRXhpdCA9IEZBTFNFOwogIGJXcm9uZ0Zvcm1hdCA9IEZBTFNFOwoKICBpbnQgaSA9IDA7CiAgaW50IGogPSAwOwoKICB3aGlsZSAoaSA8IGZvcm1hdC5HZXRMZW5ndGgoKSkgewogICAgaWYgKGJFeGl0KQogICAgICBicmVhazsKCiAgICBGWF9XQ0hBUiBjID0gZm9ybWF0LkdldEF0KGkpOwogICAgc3dpdGNoIChjKSB7CiAgICAgIGNhc2UgJzonOgogICAgICBjYXNlICcuJzoKICAgICAgY2FzZSAnLSc6CiAgICAgIGNhc2UgJ1xcJzoKICAgICAgY2FzZSAnLyc6CiAgICAgICAgaSsrOwogICAgICAgIGorKzsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgJ3knOgogICAgICBjYXNlICdtJzoKICAgICAgY2FzZSAnZCc6CiAgICAgIGNhc2UgJ0gnOgogICAgICBjYXNlICdoJzoKICAgICAgY2FzZSAnTSc6CiAgICAgIGNhc2UgJ3MnOgogICAgICBjYXNlICd0JzogewogICAgICAgIGludCBvbGRqID0gajsKICAgICAgICBpbnQgblNraXAgPSAwOwogICAgICAgIGludCByZW1haW5pbmcgPSBmb3JtYXQuR2V0TGVuZ3RoKCkgLSBpIC0gMTsKCiAgICAgICAgaWYgKHJlbWFpbmluZyA9PSAwIHx8IGZvcm1hdC5HZXRBdChpICsgMSkgIT0gYykgewogICAgICAgICAgc3dpdGNoIChjKSB7CiAgICAgICAgICAgIGNhc2UgJ3knOgogICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgICBqKys7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ20nOgogICAgICAgICAgICAgIG5Nb250aCA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOwogICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgICBqICs9IG5Ta2lwOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdkJzoKICAgICAgICAgICAgICBuRGF5ID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7CiAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgIGogKz0gblNraXA7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ0gnOgogICAgICAgICAgICAgIG5Ib3VyID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7CiAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgIGogKz0gblNraXA7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2gnOgogICAgICAgICAgICAgIG5Ib3VyID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7CiAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgIGogKz0gblNraXA7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ00nOgogICAgICAgICAgICAgIG5NaW4gPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAgaiArPSBuU2tpcDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAncyc6CiAgICAgICAgICAgICAgblNlYyA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOwogICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgICBqICs9IG5Ta2lwOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICd0JzoKICAgICAgICAgICAgICBiUG0gPSAoaiA8IHZhbHVlLkdldExlbmd0aCgpICYmIHZhbHVlLkdldEF0KGopID09ICdwJyk7CiAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgIGorKzsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHJlbWFpbmluZyA9PSAxIHx8IGZvcm1hdC5HZXRBdChpICsgMikgIT0gYykgewogICAgICAgICAgc3dpdGNoIChjKSB7CiAgICAgICAgICAgIGNhc2UgJ3knOgogICAgICAgICAgICAgIG5ZZWFyID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgNCk7CiAgICAgICAgICAgICAgaSArPSAyOwogICAgICAgICAgICAgIGogKz0gblNraXA7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ20nOgogICAgICAgICAgICAgIG5Nb250aCA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOwogICAgICAgICAgICAgIGkgKz0gMjsKICAgICAgICAgICAgICBqICs9IG5Ta2lwOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdkJzoKICAgICAgICAgICAgICBuRGF5ID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7CiAgICAgICAgICAgICAgaSArPSAyOwogICAgICAgICAgICAgIGogKz0gblNraXA7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ0gnOgogICAgICAgICAgICAgIG5Ib3VyID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7CiAgICAgICAgICAgICAgaSArPSAyOwogICAgICAgICAgICAgIGogKz0gblNraXA7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2gnOgogICAgICAgICAgICAgIG5Ib3VyID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7CiAgICAgICAgICAgICAgaSArPSAyOwogICAgICAgICAgICAgIGogKz0gblNraXA7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ00nOgogICAgICAgICAgICAgIG5NaW4gPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKICAgICAgICAgICAgICBpICs9IDI7CiAgICAgICAgICAgICAgaiArPSBuU2tpcDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAncyc6CiAgICAgICAgICAgICAgblNlYyA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOwogICAgICAgICAgICAgIGkgKz0gMjsKICAgICAgICAgICAgICBqICs9IG5Ta2lwOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICd0JzoKICAgICAgICAgICAgICBiUG0gPSAoaiArIDEgPCB2YWx1ZS5HZXRMZW5ndGgoKSAmJiB2YWx1ZS5HZXRBdChqKSA9PSAncCcgJiYKICAgICAgICAgICAgICAgICAgICAgdmFsdWUuR2V0QXQoaiArIDEpID09ICdtJyk7CiAgICAgICAgICAgICAgaSArPSAyOwogICAgICAgICAgICAgIGogKz0gMjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHJlbWFpbmluZyA9PSAyIHx8IGZvcm1hdC5HZXRBdChpICsgMykgIT0gYykgewogICAgICAgICAgc3dpdGNoIChjKSB7CiAgICAgICAgICAgIGNhc2UgJ20nOiB7CiAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc01vbnRoID0gUGFyc2VTdHJpbmdTdHJpbmcodmFsdWUsIGosIG5Ta2lwKTsKICAgICAgICAgICAgICBGWF9CT09MIGJGaW5kID0gRkFMU0U7CiAgICAgICAgICAgICAgZm9yIChpbnQgbSA9IDA7IG0gPCAxMjsgbSsrKSB7CiAgICAgICAgICAgICAgICBpZiAoc01vbnRoLkNvbXBhcmVOb0Nhc2UobW9udGhzW21dKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgIG5Nb250aCA9IG0gKyAxOwogICAgICAgICAgICAgICAgICBpICs9IDM7CiAgICAgICAgICAgICAgICAgIGogKz0gblNraXA7CiAgICAgICAgICAgICAgICAgIGJGaW5kID0gVFJVRTsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICBpZiAoIWJGaW5kKSB7CiAgICAgICAgICAgICAgICBuTW9udGggPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAzKTsKICAgICAgICAgICAgICAgIGkgKz0gMzsKICAgICAgICAgICAgICAgIGogKz0gblNraXA7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGJyZWFrOwogICAgICAgICAgICBjYXNlICd5JzoKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICBpICs9IDM7CiAgICAgICAgICAgICAgaiArPSAzOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAocmVtYWluaW5nID09IDMgfHwgZm9ybWF0LkdldEF0KGkgKyA0KSAhPSBjKSB7CiAgICAgICAgICBzd2l0Y2ggKGMpIHsKICAgICAgICAgICAgY2FzZSAneSc6CiAgICAgICAgICAgICAgblllYXIgPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCA0KTsKICAgICAgICAgICAgICBqICs9IG5Ta2lwOwogICAgICAgICAgICAgIGkgKz0gNDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnbSc6IHsKICAgICAgICAgICAgICBGWF9CT09MIGJGaW5kID0gRkFMU0U7CgogICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHNNb250aCA9IFBhcnNlU3RyaW5nU3RyaW5nKHZhbHVlLCBqLCBuU2tpcCk7CiAgICAgICAgICAgICAgc01vbnRoLk1ha2VMb3dlcigpOwoKICAgICAgICAgICAgICBmb3IgKGludCBtID0gMDsgbSA8IDEyOyBtKyspIHsKICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHNGdWxsTW9udGhzID0gZnVsbG1vbnRoc1ttXTsKICAgICAgICAgICAgICAgIHNGdWxsTW9udGhzLk1ha2VMb3dlcigpOwoKICAgICAgICAgICAgICAgIGlmIChzRnVsbE1vbnRocy5GaW5kKHNNb250aC5jX3N0cigpLCAwKSAhPSAtMSkgewogICAgICAgICAgICAgICAgICBuTW9udGggPSBtICsgMTsKICAgICAgICAgICAgICAgICAgaSArPSA0OwogICAgICAgICAgICAgICAgICBqICs9IG5Ta2lwOwogICAgICAgICAgICAgICAgICBiRmluZCA9IFRSVUU7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgaWYgKCFiRmluZCkgewogICAgICAgICAgICAgICAgbk1vbnRoID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgNCk7CiAgICAgICAgICAgICAgICBpICs9IDQ7CiAgICAgICAgICAgICAgICBqICs9IG5Ta2lwOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICBpICs9IDQ7CiAgICAgICAgICAgICAgaiArPSA0OwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoaiA+PSB2YWx1ZS5HZXRMZW5ndGgoKSB8fCBmb3JtYXQuR2V0QXQoaSkgIT0gdmFsdWUuR2V0QXQoaikpIHsKICAgICAgICAgICAgYldyb25nRm9ybWF0ID0gVFJVRTsKICAgICAgICAgICAgYkV4aXQgPSBUUlVFOwogICAgICAgICAgfQogICAgICAgICAgaSsrOwogICAgICAgICAgaisrOwogICAgICAgIH0KCiAgICAgICAgaWYgKG9sZGogPT0gaikgewogICAgICAgICAgYldyb25nRm9ybWF0ID0gVFJVRTsKICAgICAgICAgIGJFeGl0ID0gVFJVRTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIGlmICh2YWx1ZS5HZXRMZW5ndGgoKSA8PSBqKSB7CiAgICAgICAgICBiRXhpdCA9IFRSVUU7CiAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQuR2V0QXQoaSkgIT0gdmFsdWUuR2V0QXQoaikpIHsKICAgICAgICAgIGJXcm9uZ0Zvcm1hdCA9IFRSVUU7CiAgICAgICAgICBiRXhpdCA9IFRSVUU7CiAgICAgICAgfQoKICAgICAgICBpKys7CiAgICAgICAgaisrOwogICAgICAgIGJyZWFrOwogICAgfQogIH0KCiAgaWYgKGJQbSkKICAgIG5Ib3VyICs9IDEyOwoKICBpZiAoblllYXIgPj0gMCAmJiBuWWVhciA8PSBuWWVhclN1YikKICAgIG5ZZWFyICs9IDIwMDA7CgogIGlmIChuTW9udGggPCAxIHx8IG5Nb250aCA+IDEyKQogICAgYldyb25nRm9ybWF0ID0gVFJVRTsKCiAgaWYgKG5EYXkgPCAxIHx8IG5EYXkgPiAzMSkKICAgIGJXcm9uZ0Zvcm1hdCA9IFRSVUU7CgogIGlmIChuSG91ciA8IDAgfHwgbkhvdXIgPiAyNCkKICAgIGJXcm9uZ0Zvcm1hdCA9IFRSVUU7CgogIGlmIChuTWluIDwgMCB8fCBuTWluID4gNjApCiAgICBiV3JvbmdGb3JtYXQgPSBUUlVFOwoKICBpZiAoblNlYyA8IDAgfHwgblNlYyA+IDYwKQogICAgYldyb25nRm9ybWF0ID0gVFJVRTsKCiAgZG91YmxlIGRSZXQgPSAwOwoKICBpZiAoYldyb25nRm9ybWF0KSB7CiAgICBkUmV0ID0gUGFyc2VOb3JtYWxEYXRlKHZhbHVlLCBiV3JvbmdGb3JtYXQpOwogIH0gZWxzZSB7CiAgICBkUmV0ID0gSlNfTWFrZURhdGUoSlNfTWFrZURheShuWWVhciwgbk1vbnRoIC0gMSwgbkRheSksCiAgICAgICAgICAgICAgICAgICAgICAgSlNfTWFrZVRpbWUobkhvdXIsIG5NaW4sIG5TZWMsIDApKTsKCiAgICBpZiAoSlNfUG9ydElzTmFuKGRSZXQpKSB7CiAgICAgIGRSZXQgPSBKU19EYXRlUGFyc2UodmFsdWUuY19zdHIoKSk7CiAgICB9CiAgfQoKICBpZiAoSlNfUG9ydElzTmFuKGRSZXQpKSB7CiAgICBkUmV0ID0gUGFyc2VOb3JtYWxEYXRlKHZhbHVlLCBiV3JvbmdGb3JtYXQpOwogIH0KCiAgcmV0dXJuIGRSZXQ7Cn0KCkNGWF9XaWRlU3RyaW5nIENKU19QdWJsaWNNZXRob2RzOjpNYWtlRm9ybWF0RGF0ZShkb3VibGUgZERhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgZm9ybWF0KSB7CiAgQ0ZYX1dpZGVTdHJpbmcgc1JldCA9IEwiIiwgc1BhcnQgPSBMIiI7CgogIGludCBuWWVhciA9IEpTX0dldFllYXJGcm9tVGltZShkRGF0ZSk7CiAgaW50IG5Nb250aCA9IEpTX0dldE1vbnRoRnJvbVRpbWUoZERhdGUpICsgMTsKICBpbnQgbkRheSA9IEpTX0dldERheUZyb21UaW1lKGREYXRlKTsKICBpbnQgbkhvdXIgPSBKU19HZXRIb3VyRnJvbVRpbWUoZERhdGUpOwogIGludCBuTWluID0gSlNfR2V0TWluRnJvbVRpbWUoZERhdGUpOwogIGludCBuU2VjID0gSlNfR2V0U2VjRnJvbVRpbWUoZERhdGUpOwoKICBpbnQgaSA9IDA7CiAgd2hpbGUgKGkgPCBmb3JtYXQuR2V0TGVuZ3RoKCkpIHsKICAgIEZYX1dDSEFSIGMgPSBmb3JtYXQuR2V0QXQoaSk7CiAgICBpbnQgcmVtYWluaW5nID0gZm9ybWF0LkdldExlbmd0aCgpIC0gaSAtIDE7CiAgICBzUGFydCA9IEwiIjsKICAgIHN3aXRjaCAoYykgewogICAgICBjYXNlICd5JzoKICAgICAgY2FzZSAnbSc6CiAgICAgIGNhc2UgJ2QnOgogICAgICBjYXNlICdIJzoKICAgICAgY2FzZSAnaCc6CiAgICAgIGNhc2UgJ00nOgogICAgICBjYXNlICdzJzoKICAgICAgY2FzZSAndCc6CiAgICAgICAgaWYgKHJlbWFpbmluZyA9PSAwIHx8IGZvcm1hdC5HZXRBdChpICsgMSkgIT0gYykgewogICAgICAgICAgc3dpdGNoIChjKSB7CiAgICAgICAgICAgIGNhc2UgJ3knOgogICAgICAgICAgICAgIHNQYXJ0ICs9IGM7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ20nOgogICAgICAgICAgICAgIHNQYXJ0LkZvcm1hdChMIiVkIiwgbk1vbnRoKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnZCc6CiAgICAgICAgICAgICAgc1BhcnQuRm9ybWF0KEwiJWQiLCBuRGF5KTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnSCc6CiAgICAgICAgICAgICAgc1BhcnQuRm9ybWF0KEwiJWQiLCBuSG91cik7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2gnOgogICAgICAgICAgICAgIHNQYXJ0LkZvcm1hdChMIiVkIiwgbkhvdXIgPiAxMiA/IG5Ib3VyIC0gMTIgOiBuSG91cik7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ00nOgogICAgICAgICAgICAgIHNQYXJ0LkZvcm1hdChMIiVkIiwgbk1pbik7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3MnOgogICAgICAgICAgICAgIHNQYXJ0LkZvcm1hdChMIiVkIiwgblNlYyk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3QnOgogICAgICAgICAgICAgIHNQYXJ0ICs9IG5Ib3VyID4gMTIgPyAncCcgOiAnYSc7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBpKys7CiAgICAgICAgfSBlbHNlIGlmIChyZW1haW5pbmcgPT0gMSB8fCBmb3JtYXQuR2V0QXQoaSArIDIpICE9IGMpIHsKICAgICAgICAgIHN3aXRjaCAoYykgewogICAgICAgICAgICBjYXNlICd5JzoKICAgICAgICAgICAgICBzUGFydC5Gb3JtYXQoTCIlMDJkIiwgblllYXIgLSAoblllYXIgLyAxMDApICogMTAwKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnbSc6CiAgICAgICAgICAgICAgc1BhcnQuRm9ybWF0KEwiJTAyZCIsIG5Nb250aCk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2QnOgogICAgICAgICAgICAgIHNQYXJ0LkZvcm1hdChMIiUwMmQiLCBuRGF5KTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnSCc6CiAgICAgICAgICAgICAgc1BhcnQuRm9ybWF0KEwiJTAyZCIsIG5Ib3VyKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnaCc6CiAgICAgICAgICAgICAgc1BhcnQuRm9ybWF0KEwiJTAyZCIsIG5Ib3VyID4gMTIgPyBuSG91ciAtIDEyIDogbkhvdXIpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdNJzoKICAgICAgICAgICAgICBzUGFydC5Gb3JtYXQoTCIlMDJkIiwgbk1pbik7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3MnOgogICAgICAgICAgICAgIHNQYXJ0LkZvcm1hdChMIiUwMmQiLCBuU2VjKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAndCc6CiAgICAgICAgICAgICAgc1BhcnQgPSBuSG91ciA+IDEyID8gTCJwbSIgOiBMImFtIjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGkgKz0gMjsKICAgICAgICB9IGVsc2UgaWYgKHJlbWFpbmluZyA9PSAyIHx8IGZvcm1hdC5HZXRBdChpICsgMykgIT0gYykgewogICAgICAgICAgc3dpdGNoIChjKSB7CiAgICAgICAgICAgIGNhc2UgJ20nOgogICAgICAgICAgICAgIGkgKz0gMzsKICAgICAgICAgICAgICBpZiAobk1vbnRoID4gMCAmJiBuTW9udGggPD0gMTIpCiAgICAgICAgICAgICAgICBzUGFydCArPSBtb250aHNbbk1vbnRoIC0gMV07CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgaSArPSAzOwogICAgICAgICAgICAgIHNQYXJ0ICs9IGM7CiAgICAgICAgICAgICAgc1BhcnQgKz0gYzsKICAgICAgICAgICAgICBzUGFydCArPSBjOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAocmVtYWluaW5nID09IDMgfHwgZm9ybWF0LkdldEF0KGkgKyA0KSAhPSBjKSB7CiAgICAgICAgICBzd2l0Y2ggKGMpIHsKICAgICAgICAgICAgY2FzZSAneSc6CiAgICAgICAgICAgICAgc1BhcnQuRm9ybWF0KEwiJTA0ZCIsIG5ZZWFyKTsKICAgICAgICAgICAgICBpICs9IDQ7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ20nOgogICAgICAgICAgICAgIGkgKz0gNDsKICAgICAgICAgICAgICBpZiAobk1vbnRoID4gMCAmJiBuTW9udGggPD0gMTIpCiAgICAgICAgICAgICAgICBzUGFydCArPSBmdWxsbW9udGhzW25Nb250aCAtIDFdOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIGkgKz0gNDsKICAgICAgICAgICAgICBzUGFydCArPSBjOwogICAgICAgICAgICAgIHNQYXJ0ICs9IGM7CiAgICAgICAgICAgICAgc1BhcnQgKz0gYzsKICAgICAgICAgICAgICBzUGFydCArPSBjOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpKys7CiAgICAgICAgICBzUGFydCArPSBjOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICBpKys7CiAgICAgICAgc1BhcnQgKz0gYzsKICAgICAgICBicmVhazsKICAgIH0KCiAgICBzUmV0ICs9IHNQYXJ0OwogIH0KCiAgcmV0dXJuIHNSZXQ7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovLyBmdW5jdGlvbiBBRk51bWJlcl9Gb3JtYXQobkRlYywgc2VwU3R5bGUsIG5lZ1N0eWxlLCBjdXJyU3R5bGUsIHN0ckN1cnJlbmN5LAovLyBiQ3VycmVuY3lQcmVwZW5kKQpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRk51bWJlcl9Gb3JtYXQoSUZYSlNfQ29udGV4dCogY2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewojaWYgX0ZYX09TXyAhPSBfRlhfQU5EUk9JRF8KICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7CiAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CiAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOwogIEFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CgogIGlmIChwYXJhbXMuc2l6ZSgpICE9IDYpIHsKICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CiAgICByZXR1cm4gRkFMU0U7CiAgfQogIGlmICghcEV2ZW50LT5tX3BWYWx1ZSkKICAgIHJldHVybiBGQUxTRTsKICBDRlhfV2lkZVN0cmluZyYgVmFsdWUgPSBwRXZlbnQtPlZhbHVlKCk7CiAgQ0ZYX0J5dGVTdHJpbmcgc3RyVmFsdWUgPSBTdHJUcmltKENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShWYWx1ZSkpOwoKICBpZiAoc3RyVmFsdWUuSXNFbXB0eSgpKQogICAgcmV0dXJuIFRSVUU7CgogIGludCBpRGVjID0gcGFyYW1zWzBdLlRvSW50KCk7CiAgaW50IGlTZXBTdHlsZSA9IHBhcmFtc1sxXS5Ub0ludCgpOwogIGludCBpTmVnU3R5bGUgPSBwYXJhbXNbMl0uVG9JbnQoKTsKICAvLyBwYXJhbXNbM10gaXMgaUN1cnJTdHlsZSwgaXQncyBub3QgdXNlZC4KICBzdGQ6OndzdHJpbmcgd3N0ckN1cnJlbmN5KHBhcmFtc1s0XS5Ub0NGWFdpZGVTdHJpbmcoKS5jX3N0cigpKTsKICBGWF9CT09MIGJDdXJyZW5jeVByZXBlbmQgPSBwYXJhbXNbNV0uVG9Cb29sKCk7CgogIGlmIChpRGVjIDwgMCkKICAgIGlEZWMgPSAtaURlYzsKCiAgaWYgKGlTZXBTdHlsZSA8IDAgfHwgaVNlcFN0eWxlID4gMykKICAgIGlTZXBTdHlsZSA9IDA7CgogIGlmIChpTmVnU3R5bGUgPCAwIHx8IGlOZWdTdHlsZSA+IDMpCiAgICBpTmVnU3R5bGUgPSAwOwoKICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAvLyBmb3IgcHJvY2Vzc2luZyBkZWNpbWFsIHBsYWNlcwogIHN0clZhbHVlLlJlcGxhY2UoIiwiLCAiLiIpOwogIGRvdWJsZSBkVmFsdWUgPSBhdG9mKHN0clZhbHVlKTsKICBpZiAoaURlYyA+IDApCiAgICBkVmFsdWUgKz0gRE9VQkxFX0NPUlJFQ1Q7CgogIGludCBpRGVjMjsKICBpbnQgaU5lZ2F0aXZlID0gMDsKCiAgc3RyVmFsdWUgPSBmY3Z0KGRWYWx1ZSwgaURlYywgJmlEZWMyLCAmaU5lZ2F0aXZlKTsKICBpZiAoc3RyVmFsdWUuSXNFbXB0eSgpKSB7CiAgICBkVmFsdWUgPSAwOwogICAgc3RyVmFsdWUgPSBmY3Z0KGRWYWx1ZSwgaURlYywgJmlEZWMyLCAmaU5lZ2F0aXZlKTsKICAgIGlmIChzdHJWYWx1ZS5Jc0VtcHR5KCkpIHsKICAgICAgc3RyVmFsdWUgPSAiMCI7CiAgICAgIGlEZWMyID0gMTsKICAgIH0KICB9CgogIGlmIChpRGVjMiA8IDApIHsKICAgIGZvciAoaW50IGlOdW0gPSAwOyBpTnVtIDwgYWJzKGlEZWMyKTsgaU51bSsrKSB7CiAgICAgIHN0clZhbHVlID0gIjAiICsgc3RyVmFsdWU7CiAgICB9CiAgICBpRGVjMiA9IDA7CiAgfQogIGludCBpTWF4ID0gc3RyVmFsdWUuR2V0TGVuZ3RoKCk7CiAgaWYgKGlEZWMyID4gaU1heCkgewogICAgZm9yIChpbnQgaU51bSA9IDA7IGlOdW0gPD0gaURlYzIgLSBpTWF4OyBpTnVtKyspIHsKICAgICAgc3RyVmFsdWUgKz0gIjAiOwogICAgfQogICAgaU1heCA9IGlEZWMyICsgMTsKICB9CiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogIC8vIGZvciBwcm9jZXNzaW5nIHNlcGVyYXRvciBzdHlsZQogIGlmIChpRGVjMiA8IGlNYXgpIHsKICAgIGlmIChpU2VwU3R5bGUgPT0gMCB8fCBpU2VwU3R5bGUgPT0gMSkgewogICAgICBzdHJWYWx1ZS5JbnNlcnQoaURlYzIsICcuJyk7CiAgICAgIGlNYXgrKzsKICAgIH0gZWxzZSBpZiAoaVNlcFN0eWxlID09IDIgfHwgaVNlcFN0eWxlID09IDMpIHsKICAgICAgc3RyVmFsdWUuSW5zZXJ0KGlEZWMyLCAnLCcpOwogICAgICBpTWF4Kys7CiAgICB9CgogICAgaWYgKGlEZWMyID09IDApCiAgICAgIHN0clZhbHVlLkluc2VydChpRGVjMiwgJzAnKTsKICB9CiAgaWYgKGlTZXBTdHlsZSA9PSAwIHx8IGlTZXBTdHlsZSA9PSAyKSB7CiAgICBjaGFyIGNTZXBlcmF0b3I7CiAgICBpZiAoaVNlcFN0eWxlID09IDApCiAgICAgIGNTZXBlcmF0b3IgPSAnLCc7CiAgICBlbHNlCiAgICAgIGNTZXBlcmF0b3IgPSAnLic7CgogICAgaW50IGlEZWNQb3NpdGl2ZTsKICAgIGlEZWNQb3NpdGl2ZSA9IGlEZWMyOwoKICAgIGZvciAoaURlY1Bvc2l0aXZlID0gaURlYzIgLSAzOyBpRGVjUG9zaXRpdmUgPiAwOyBpRGVjUG9zaXRpdmUgLT0gMykgewogICAgICBzdHJWYWx1ZS5JbnNlcnQoaURlY1Bvc2l0aXZlLCBjU2VwZXJhdG9yKTsKICAgICAgaU1heCsrOwogICAgfQogIH0KCiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogIC8vIGZvciBwcm9jZXNzaW5nIGN1cnJlbmN5IHN0cmluZwoKICBWYWx1ZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoc3RyVmFsdWUpOwogIHN0ZDo6d3N0cmluZyBzdHJWYWx1ZTIgPSBWYWx1ZS5jX3N0cigpOwoKICBpZiAoYkN1cnJlbmN5UHJlcGVuZCkKICAgIHN0clZhbHVlMiA9IHdzdHJDdXJyZW5jeSArIHN0clZhbHVlMjsKICBlbHNlCiAgICBzdHJWYWx1ZTIgPSBzdHJWYWx1ZTIgKyB3c3RyQ3VycmVuY3k7CgogIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAvLyBmb3IgcHJvY2Vzc2luZyBuZWdhdGl2ZSBzdHlsZQogIGlmIChpTmVnYXRpdmUpIHsKICAgIGlmIChpTmVnU3R5bGUgPT0gMCkgewogICAgICBzdHJWYWx1ZTIuaW5zZXJ0KDAsIEwiLSIpOwogICAgfQogICAgaWYgKGlOZWdTdHlsZSA9PSAyIHx8IGlOZWdTdHlsZSA9PSAzKSB7CiAgICAgIHN0clZhbHVlMi5pbnNlcnQoMCwgTCIoIik7CiAgICAgIHN0clZhbHVlMi5pbnNlcnQoc3RyVmFsdWUyLmxlbmd0aCgpLCBMIikiKTsKICAgIH0KICAgIGlmIChpTmVnU3R5bGUgPT0gMSB8fCBpTmVnU3R5bGUgPT0gMykgewogICAgICBpZiAoRmllbGQqIGZUYXJnZXQgPSBwRXZlbnQtPlRhcmdldF9GaWVsZCgpKSB7CiAgICAgICAgQ0pTX0FycmF5IGFyQ29sb3IoaXNvbGF0ZSk7CiAgICAgICAgQ0pTX1ZhbHVlIHZDb2xFbG0oaXNvbGF0ZSk7CiAgICAgICAgdkNvbEVsbSA9IEwiUkdCIjsKICAgICAgICBhckNvbG9yLlNldEVsZW1lbnQoMCwgdkNvbEVsbSk7CiAgICAgICAgdkNvbEVsbSA9IDE7CiAgICAgICAgYXJDb2xvci5TZXRFbGVtZW50KDEsIHZDb2xFbG0pOwogICAgICAgIHZDb2xFbG0gPSAwOwogICAgICAgIGFyQ29sb3IuU2V0RWxlbWVudCgyLCB2Q29sRWxtKTsKCiAgICAgICAgYXJDb2xvci5TZXRFbGVtZW50KDMsIHZDb2xFbG0pOwoKICAgICAgICBDSlNfUHJvcFZhbHVlIHZQcm9wKGlzb2xhdGUpOwogICAgICAgIHZQcm9wLlN0YXJ0R2V0dGluZygpOwogICAgICAgIHZQcm9wIDw8IGFyQ29sb3I7CiAgICAgICAgdlByb3AuU3RhcnRTZXR0aW5nKCk7CiAgICAgICAgZlRhcmdldC0+dGV4dENvbG9yKGNjLCB2UHJvcCwgc0Vycm9yKTsgIC8vIHJlZAogICAgICB9CiAgICB9CiAgfSBlbHNlIHsKICAgIGlmIChpTmVnU3R5bGUgPT0gMSB8fCBpTmVnU3R5bGUgPT0gMykgewogICAgICBpZiAoRmllbGQqIGZUYXJnZXQgPSBwRXZlbnQtPlRhcmdldF9GaWVsZCgpKSB7CiAgICAgICAgQ0pTX0FycmF5IGFyQ29sb3IoaXNvbGF0ZSk7CiAgICAgICAgQ0pTX1ZhbHVlIHZDb2xFbG0oaXNvbGF0ZSk7CiAgICAgICAgdkNvbEVsbSA9IEwiUkdCIjsKICAgICAgICBhckNvbG9yLlNldEVsZW1lbnQoMCwgdkNvbEVsbSk7CiAgICAgICAgdkNvbEVsbSA9IDA7CiAgICAgICAgYXJDb2xvci5TZXRFbGVtZW50KDEsIHZDb2xFbG0pOwogICAgICAgIGFyQ29sb3IuU2V0RWxlbWVudCgyLCB2Q29sRWxtKTsKICAgICAgICBhckNvbG9yLlNldEVsZW1lbnQoMywgdkNvbEVsbSk7CgogICAgICAgIENKU19Qcm9wVmFsdWUgdlByb3AoaXNvbGF0ZSk7CiAgICAgICAgdlByb3AuU3RhcnRHZXR0aW5nKCk7CiAgICAgICAgZlRhcmdldC0+dGV4dENvbG9yKGNjLCB2UHJvcCwgc0Vycm9yKTsKCiAgICAgICAgQ0pTX0FycmF5IGFQcm9wKGlzb2xhdGUpOwogICAgICAgIHZQcm9wLkNvbnZlcnRUb0FycmF5KGFQcm9wKTsKCiAgICAgICAgQ1BXTF9Db2xvciBjclByb3A7CiAgICAgICAgQ1BXTF9Db2xvciBjckNvbG9yOwogICAgICAgIGNvbG9yOjpDb252ZXJ0QXJyYXlUb1BXTENvbG9yKGFQcm9wLCBjclByb3ApOwogICAgICAgIGNvbG9yOjpDb252ZXJ0QXJyYXlUb1BXTENvbG9yKGFyQ29sb3IsIGNyQ29sb3IpOwoKICAgICAgICBpZiAoY3JDb2xvciAhPSBjclByb3ApIHsKICAgICAgICAgIENKU19Qcm9wVmFsdWUgdlByb3AyKGlzb2xhdGUpOwogICAgICAgICAgdlByb3AyLlN0YXJ0R2V0dGluZygpOwogICAgICAgICAgdlByb3AyIDw8IGFyQ29sb3I7CiAgICAgICAgICB2UHJvcDIuU3RhcnRTZXR0aW5nKCk7CiAgICAgICAgICBmVGFyZ2V0LT50ZXh0Q29sb3IoY2MsIHZQcm9wMiwgc0Vycm9yKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CiAgVmFsdWUgPSBzdHJWYWx1ZTIuY19zdHIoKTsKI2VuZGlmCiAgcmV0dXJuIFRSVUU7Cn0KCi8vIGZ1bmN0aW9uIEFGTnVtYmVyX0tleXN0cm9rZShuRGVjLCBzZXBTdHlsZSwgbmVnU3R5bGUsIGN1cnJTdHlsZSwgc3RyQ3VycmVuY3ksCi8vIGJDdXJyZW5jeVByZXBlbmQpCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGTnVtYmVyX0tleXN0cm9rZShJRlhKU19Db250ZXh0KiBjYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CiAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CiAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOwogIEFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CgogIGlmIChwYXJhbXMuc2l6ZSgpIDwgMikKICAgIHJldHVybiBGQUxTRTsKICBpbnQgaVNlcFN0eWxlID0gcGFyYW1zWzFdLlRvSW50KCk7CgogIGlmIChpU2VwU3R5bGUgPCAwIHx8IGlTZXBTdHlsZSA+IDMpCiAgICBpU2VwU3R5bGUgPSAwOwogIGlmICghcEV2ZW50LT5tX3BWYWx1ZSkKICAgIHJldHVybiBGQUxTRTsKICBDRlhfV2lkZVN0cmluZyYgdmFsID0gcEV2ZW50LT5WYWx1ZSgpOwogIENGWF9XaWRlU3RyaW5nJiB3X3N0ckNoYW5nZSA9IHBFdmVudC0+Q2hhbmdlKCk7CiAgQ0ZYX1dpZGVTdHJpbmcgd19zdHJWYWx1ZSA9IHZhbDsKCiAgaWYgKHBFdmVudC0+V2lsbENvbW1pdCgpKSB7CiAgICBDRlhfV2lkZVN0cmluZyB3c3RyQ2hhbmdlID0gd19zdHJDaGFuZ2U7CiAgICBDRlhfV2lkZVN0cmluZyB3c3RyVmFsdWUgPSBTdHJMVHJpbSh3X3N0clZhbHVlLmNfc3RyKCkpOwogICAgaWYgKHdzdHJWYWx1ZS5Jc0VtcHR5KCkpCiAgICAgIHJldHVybiBUUlVFOwoKICAgIENGWF9XaWRlU3RyaW5nIHN3VGVtcCA9IHdzdHJWYWx1ZTsKICAgIHN3VGVtcC5SZXBsYWNlKEwiLCIsIEwiLiIpOwogICAgaWYgKCFJc051bWJlcihzd1RlbXAuY19zdHIoKSkpIHsKICAgICAgcEV2ZW50LT5SYygpID0gRkFMU0U7CiAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTQUZOVU1CRVJfS0VZU1RST0tFKTsKICAgICAgQWxlcnQocENvbnRleHQsIHNFcnJvci5jX3N0cigpKTsKICAgICAgcmV0dXJuIFRSVUU7CiAgICB9CiAgICByZXR1cm4gVFJVRTsgIC8vIGl0IGhhcHBlbnMgYWZ0ZXIgdGhlIGxhc3Qga2V5c3Ryb2tlIGFuZCBiZWZvcmUgdmFsaWRhdGluZywKICB9CgogIHN0ZDo6d3N0cmluZyB3X3N0clZhbHVlMiA9IHdfc3RyVmFsdWUuY19zdHIoKTsKICBzdGQ6OndzdHJpbmcgd19zdHJDaGFuZ2UyID0gd19zdHJDaGFuZ2UuY19zdHIoKTsKICBzdGQ6OndzdHJpbmcgd19zdHJTZWxlY3RlZDsKICBpZiAoLTEgIT0gcEV2ZW50LT5TZWxTdGFydCgpKQogICAgd19zdHJTZWxlY3RlZCA9IHdfc3RyVmFsdWUyLnN1YnN0cihwRXZlbnQtPlNlbFN0YXJ0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwRXZlbnQtPlNlbEVuZCgpIC0gcEV2ZW50LT5TZWxTdGFydCgpKSk7CiAgYm9vbCBiSGFzU2lnbiA9ICh3X3N0clZhbHVlMi5maW5kKCctJykgIT0gc3RkOjp3c3RyaW5nOjpucG9zKSAmJgogICAgICAgICAgICAgICAgICAod19zdHJTZWxlY3RlZC5maW5kKCctJykgPT0gc3RkOjp3c3RyaW5nOjpucG9zKTsKICBpZiAoYkhhc1NpZ24pIHsKICAgIC8vIGNhbid0IGluc2VydCAiY2hhbmdlIiBpbiBmcm9udCB0byBzaWduIHBvc3Rpb24uCiAgICBpZiAocEV2ZW50LT5TZWxTdGFydCgpID09IDApIHsKICAgICAgRlhfQk9PTCYgYlJjID0gcEV2ZW50LT5SYygpOwogICAgICBiUmMgPSBGQUxTRTsKICAgICAgcmV0dXJuIFRSVUU7CiAgICB9CiAgfQoKICBjaGFyIGNTZXAgPSBMJy4nOwoKICBzd2l0Y2ggKGlTZXBTdHlsZSkgewogICAgY2FzZSAwOgogICAgY2FzZSAxOgogICAgICBjU2VwID0gTCcuJzsKICAgICAgYnJlYWs7CiAgICBjYXNlIDI6CiAgICBjYXNlIDM6CiAgICAgIGNTZXAgPSBMJywnOwogICAgICBicmVhazsKICB9CgogIGJvb2wgYkhhc1NlcCA9ICh3X3N0clZhbHVlMi5maW5kKGNTZXApICE9IHN0ZDo6d3N0cmluZzo6bnBvcyk7CiAgZm9yIChzdGQ6OndzdHJpbmc6Oml0ZXJhdG9yIGl0ID0gd19zdHJDaGFuZ2UyLmJlZ2luKCk7CiAgICAgICBpdCAhPSB3X3N0ckNoYW5nZTIuZW5kKCk7IGl0KyspIHsKICAgIGlmICgqaXQgPT0gY1NlcCkgewogICAgICBpZiAoYkhhc1NlcCkgewogICAgICAgIEZYX0JPT0wmIGJSYyA9IHBFdmVudC0+UmMoKTsKICAgICAgICBiUmMgPSBGQUxTRTsKICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgfQogICAgICBiSGFzU2VwID0gVFJVRTsKICAgICAgY29udGludWU7CiAgICB9CiAgICBpZiAoKml0ID09IEwnLScpIHsKICAgICAgaWYgKGJIYXNTaWduKSB7CiAgICAgICAgRlhfQk9PTCYgYlJjID0gcEV2ZW50LT5SYygpOwogICAgICAgIGJSYyA9IEZBTFNFOwogICAgICAgIHJldHVybiBUUlVFOwogICAgICB9CiAgICAgIGlmIChpdCAhPSB3X3N0ckNoYW5nZTIuYmVnaW4oKSkgIC8vIHNpZ24ncyBwb3NpdGlvbiBpcyBub3QgY29ycmVjdAogICAgICB7CiAgICAgICAgRlhfQk9PTCYgYlJjID0gcEV2ZW50LT5SYygpOwogICAgICAgIGJSYyA9IEZBTFNFOwogICAgICAgIHJldHVybiBUUlVFOwogICAgICB9CiAgICAgIGlmIChwRXZlbnQtPlNlbFN0YXJ0KCkgIT0gMCkgewogICAgICAgIEZYX0JPT0wmIGJSYyA9IHBFdmVudC0+UmMoKTsKICAgICAgICBiUmMgPSBGQUxTRTsKICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgfQogICAgICBiSGFzU2lnbiA9IFRSVUU7CiAgICAgIGNvbnRpbnVlOwogICAgfQoKICAgIGlmICghSXNEaWdpdCgqaXQpKSB7CiAgICAgIEZYX0JPT0wmIGJSYyA9IHBFdmVudC0+UmMoKTsKICAgICAgYlJjID0gRkFMU0U7CiAgICAgIHJldHVybiBUUlVFOwogICAgfQogIH0KCiAgc3RkOjp3c3RyaW5nIHdfcHJlZml4ID0gd19zdHJWYWx1ZTIuc3Vic3RyKDAsIHBFdmVudC0+U2VsU3RhcnQoKSk7CiAgc3RkOjp3c3RyaW5nIHdfcG9zdGZpeDsKICBpZiAocEV2ZW50LT5TZWxFbmQoKSA8IChpbnQpd19zdHJWYWx1ZTIubGVuZ3RoKCkpCiAgICB3X3Bvc3RmaXggPSB3X3N0clZhbHVlMi5zdWJzdHIocEV2ZW50LT5TZWxFbmQoKSk7CiAgd19zdHJWYWx1ZTIgPSB3X3ByZWZpeCArIHdfc3RyQ2hhbmdlMiArIHdfcG9zdGZpeDsKICB3X3N0clZhbHVlID0gd19zdHJWYWx1ZTIuY19zdHIoKTsKICB2YWwgPSB3X3N0clZhbHVlOwogIHJldHVybiBUUlVFOwp9CgovLyBmdW5jdGlvbiBBRlBlcmNlbnRfRm9ybWF0KG5EZWMsIHNlcFN0eWxlKQpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlBlcmNlbnRfRm9ybWF0KElGWEpTX0NvbnRleHQqIGNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKI2lmIF9GWF9PU18gIT0gX0ZYX0FORFJPSURfCiAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CiAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOwogIEFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CgogIGlmIChwYXJhbXMuc2l6ZSgpICE9IDIpIHsKICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CiAgICByZXR1cm4gRkFMU0U7CiAgfQogIGlmICghcEV2ZW50LT5tX3BWYWx1ZSkKICAgIHJldHVybiBGQUxTRTsKCiAgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlID0gcEV2ZW50LT5WYWx1ZSgpOwogIENGWF9CeXRlU3RyaW5nIHN0clZhbHVlID0gU3RyVHJpbShDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUoVmFsdWUpKTsKICBpZiAoc3RyVmFsdWUuSXNFbXB0eSgpKQogICAgcmV0dXJuIFRSVUU7CgogIGludCBpRGVjID0gcGFyYW1zWzBdLlRvSW50KCk7CiAgaWYgKGlEZWMgPCAwKQogICAgaURlYyA9IC1pRGVjOwoKICBpbnQgaVNlcFN0eWxlID0gcGFyYW1zWzFdLlRvSW50KCk7CiAgaWYgKGlTZXBTdHlsZSA8IDAgfHwgaVNlcFN0eWxlID4gMykKICAgIGlTZXBTdHlsZSA9IDA7CgogIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogIC8vIGZvciBwcm9jZXNzaW5nIGRlY2ltYWwgcGxhY2VzCiAgZG91YmxlIGRWYWx1ZSA9IGF0b2Yoc3RyVmFsdWUpOwogIGRWYWx1ZSAqPSAxMDA7CiAgaWYgKGlEZWMgPiAwKQogICAgZFZhbHVlICs9IERPVUJMRV9DT1JSRUNUOyAgLy/Qo9X9CgogIGludCBpRGVjMjsKICBpbnQgaU5lZ2F0aXZlID0gMDsKICBzdHJWYWx1ZSA9IGZjdnQoZFZhbHVlLCBpRGVjLCAmaURlYzIsICZpTmVnYXRpdmUpOwogIGlmIChzdHJWYWx1ZS5Jc0VtcHR5KCkpIHsKICAgIGRWYWx1ZSA9IDA7CiAgICBzdHJWYWx1ZSA9IGZjdnQoZFZhbHVlLCBpRGVjLCAmaURlYzIsICZpTmVnYXRpdmUpOwogIH0KCiAgaWYgKGlEZWMyIDwgMCkgewogICAgZm9yIChpbnQgaU51bSA9IDA7IGlOdW0gPCBhYnMoaURlYzIpOyBpTnVtKyspIHsKICAgICAgc3RyVmFsdWUgPSAiMCIgKyBzdHJWYWx1ZTsKICAgIH0KICAgIGlEZWMyID0gMDsKICB9CiAgaW50IGlNYXggPSBzdHJWYWx1ZS5HZXRMZW5ndGgoKTsKICBpZiAoaURlYzIgPiBpTWF4KSB7CiAgICBmb3IgKGludCBpTnVtID0gMDsgaU51bSA8PSBpRGVjMiAtIGlNYXg7IGlOdW0rKykgewogICAgICBzdHJWYWx1ZSArPSAiMCI7CiAgICB9CiAgICBpTWF4ID0gaURlYzIgKyAxOwogIH0KICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgLy8gZm9yIHByb2Nlc3Npbmcgc2VwZXJhdG9yIHN0eWxlCiAgaWYgKGlEZWMyIDwgaU1heCkgewogICAgaWYgKGlTZXBTdHlsZSA9PSAwIHx8IGlTZXBTdHlsZSA9PSAxKSB7CiAgICAgIHN0clZhbHVlLkluc2VydChpRGVjMiwgJy4nKTsKICAgICAgaU1heCsrOwogICAgfSBlbHNlIGlmIChpU2VwU3R5bGUgPT0gMiB8fCBpU2VwU3R5bGUgPT0gMykgewogICAgICBzdHJWYWx1ZS5JbnNlcnQoaURlYzIsICcsJyk7CiAgICAgIGlNYXgrKzsKICAgIH0KCiAgICBpZiAoaURlYzIgPT0gMCkKICAgICAgc3RyVmFsdWUuSW5zZXJ0KGlEZWMyLCAnMCcpOwogIH0KICBpZiAoaVNlcFN0eWxlID09IDAgfHwgaVNlcFN0eWxlID09IDIpIHsKICAgIGNoYXIgY1NlcGVyYXRvcjsKICAgIGlmIChpU2VwU3R5bGUgPT0gMCkKICAgICAgY1NlcGVyYXRvciA9ICcsJzsKICAgIGVsc2UKICAgICAgY1NlcGVyYXRvciA9ICcuJzsKCiAgICBpbnQgaURlY1Bvc2l0aXZlOwogICAgaURlY1Bvc2l0aXZlID0gaURlYzI7CgogICAgZm9yIChpRGVjUG9zaXRpdmUgPSBpRGVjMiAtIDM7IGlEZWNQb3NpdGl2ZSA+IDA7IGlEZWNQb3NpdGl2ZSAtPSAzKSB7CiAgICAgIHN0clZhbHVlLkluc2VydChpRGVjUG9zaXRpdmUsIGNTZXBlcmF0b3IpOwogICAgICBpTWF4Kys7CiAgICB9CiAgfQogIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgLy8gbmVnYXRpdmUgbWFyawogIGlmIChpTmVnYXRpdmUpCiAgICBzdHJWYWx1ZSA9ICItIiArIHN0clZhbHVlOwogIHN0clZhbHVlICs9ICIlIjsKICBWYWx1ZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoc3RyVmFsdWUpOwojZW5kaWYKICByZXR1cm4gVFJVRTsKfQovLyBBRlBlcmNlbnRfS2V5c3Ryb2tlKG5EZWMsIHNlcFN0eWxlKQpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlBlcmNlbnRfS2V5c3Ryb2tlKElGWEpTX0NvbnRleHQqIGNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKICByZXR1cm4gQUZOdW1iZXJfS2V5c3Ryb2tlKGNjLCBwYXJhbXMsIHZSZXQsIHNFcnJvcik7Cn0KCi8vIGZ1bmN0aW9uIEFGRGF0ZV9Gb3JtYXRFeChjRm9ybWF0KQpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRkRhdGVfRm9ybWF0RXgoSUZYSlNfQ29udGV4dCogY2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewogIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwogIENKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKICBBU1NFUlQocEV2ZW50ICE9IE5VTEwpOwoKICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKSB7CiAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwogICAgcmV0dXJuIEZBTFNFOwogIH0KICBpZiAoIXBFdmVudC0+bV9wVmFsdWUpCiAgICByZXR1cm4gRkFMU0U7CgogIENGWF9XaWRlU3RyaW5nJiB2YWwgPSBwRXZlbnQtPlZhbHVlKCk7CiAgQ0ZYX1dpZGVTdHJpbmcgc3RyVmFsdWUgPSB2YWw7CiAgaWYgKHN0clZhbHVlLklzRW1wdHkoKSkKICAgIHJldHVybiBUUlVFOwoKICBDRlhfV2lkZVN0cmluZyBzRm9ybWF0ID0gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpOwogIEZYX0JPT0wgYldyb25nRm9ybWF0ID0gRkFMU0U7CiAgZG91YmxlIGREYXRlID0gMC4wZjsKCiAgaWYgKHN0clZhbHVlLkZpbmQoTCJHTVQiKSAhPSAtMSkgewogICAgLy8gZm9yIEdNVCBmb3JtYXQgdGltZQogICAgLy8gc3VjaCBhcyAiVHVlIEF1ZyAxMSAxNDoyNDoxNiBHTVQrMDgwMDIwMDkiCiAgICBkRGF0ZSA9IE1ha2VJbnRlckRhdGUoc3RyVmFsdWUpOwogIH0gZWxzZSB7CiAgICBkRGF0ZSA9IE1ha2VSZWd1bGFyRGF0ZShzdHJWYWx1ZSwgc0Zvcm1hdCwgYldyb25nRm9ybWF0KTsKICB9CgogIGlmIChKU19Qb3J0SXNOYW4oZERhdGUpKSB7CiAgICBDRlhfV2lkZVN0cmluZyBzd01zZzsKICAgIHN3TXNnLkZvcm1hdChKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUlNFREFURSkuY19zdHIoKSwKICAgICAgICAgICAgICAgICBzRm9ybWF0LmNfc3RyKCkpOwogICAgQWxlcnQocENvbnRleHQsIHN3TXNnLmNfc3RyKCkpOwogICAgcmV0dXJuIEZBTFNFOwogIH0KCiAgdmFsID0gTWFrZUZvcm1hdERhdGUoZERhdGUsIHNGb3JtYXQpOwogIHJldHVybiBUUlVFOwp9Cgpkb3VibGUgQ0pTX1B1YmxpY01ldGhvZHM6Ok1ha2VJbnRlckRhdGUoQ0ZYX1dpZGVTdHJpbmcgc3RyVmFsdWUpIHsKICBpbnQgbkhvdXI7CiAgaW50IG5NaW47CiAgaW50IG5TZWM7CiAgaW50IG5ZZWFyOwogIGludCBuTW9udGg7CiAgaW50IG5EYXk7CgogIENGWF9XaWRlU3RyaW5nQXJyYXkgd3NBcnJheTsKICBDRlhfV2lkZVN0cmluZyBzTW9udGggPSBMIiI7CiAgQ0ZYX1dpZGVTdHJpbmcgc1RlbXAgPSBMIiI7CiAgaW50IG5TaXplID0gc3RyVmFsdWUuR2V0TGVuZ3RoKCk7CgogIGZvciAoaW50IGkgPSAwOyBpIDwgblNpemU7IGkrKykgewogICAgRlhfV0NIQVIgYyA9IHN0clZhbHVlLkdldEF0KGkpOwogICAgaWYgKGMgPT0gTCcgJyB8fCBjID09IEwnOicpIHsKICAgICAgd3NBcnJheS5BZGQoc1RlbXApOwogICAgICBzVGVtcCA9IEwiIjsKICAgICAgY29udGludWU7CiAgICB9CgogICAgc1RlbXAgKz0gYzsKICB9CgogIHdzQXJyYXkuQWRkKHNUZW1wKTsKICBpZiAod3NBcnJheS5HZXRTaXplKCkgIT0gOCkKICAgIHJldHVybiAwOwoKICBzVGVtcCA9IHdzQXJyYXlbMV07CiAgaWYgKHNUZW1wLkNvbXBhcmUoTCJKYW4iKSA9PSAwKQogICAgbk1vbnRoID0gMTsKICBpZiAoc1RlbXAuQ29tcGFyZShMIkZlYiIpID09IDApCiAgICBuTW9udGggPSAyOwogIGlmIChzVGVtcC5Db21wYXJlKEwiTWFyIikgPT0gMCkKICAgIG5Nb250aCA9IDM7CiAgaWYgKHNUZW1wLkNvbXBhcmUoTCJBcHIiKSA9PSAwKQogICAgbk1vbnRoID0gNDsKICBpZiAoc1RlbXAuQ29tcGFyZShMIk1heSIpID09IDApCiAgICBuTW9udGggPSA1OwogIGlmIChzVGVtcC5Db21wYXJlKEwiSnVuIikgPT0gMCkKICAgIG5Nb250aCA9IDY7CiAgaWYgKHNUZW1wLkNvbXBhcmUoTCJKdWwiKSA9PSAwKQogICAgbk1vbnRoID0gNzsKICBpZiAoc1RlbXAuQ29tcGFyZShMIkF1ZyIpID09IDApCiAgICBuTW9udGggPSA4OwogIGlmIChzVGVtcC5Db21wYXJlKEwiU2VwIikgPT0gMCkKICAgIG5Nb250aCA9IDk7CiAgaWYgKHNUZW1wLkNvbXBhcmUoTCJPY3QiKSA9PSAwKQogICAgbk1vbnRoID0gMTA7CiAgaWYgKHNUZW1wLkNvbXBhcmUoTCJOb3YiKSA9PSAwKQogICAgbk1vbnRoID0gMTE7CiAgaWYgKHNUZW1wLkNvbXBhcmUoTCJEZWMiKSA9PSAwKQogICAgbk1vbnRoID0gMTI7CgogIG5EYXkgPSAoaW50KVBhcnNlU3RyaW5nVG9OdW1iZXIod3NBcnJheVsyXS5jX3N0cigpKTsKICBuSG91ciA9IChpbnQpUGFyc2VTdHJpbmdUb051bWJlcih3c0FycmF5WzNdLmNfc3RyKCkpOwogIG5NaW4gPSAoaW50KVBhcnNlU3RyaW5nVG9OdW1iZXIod3NBcnJheVs0XS5jX3N0cigpKTsKICBuU2VjID0gKGludClQYXJzZVN0cmluZ1RvTnVtYmVyKHdzQXJyYXlbNV0uY19zdHIoKSk7CiAgblllYXIgPSAoaW50KVBhcnNlU3RyaW5nVG9OdW1iZXIod3NBcnJheVs3XS5jX3N0cigpKTsKCiAgZG91YmxlIGRSZXQgPSBKU19NYWtlRGF0ZShKU19NYWtlRGF5KG5ZZWFyLCBuTW9udGggLSAxLCBuRGF5KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTX01ha2VUaW1lKG5Ib3VyLCBuTWluLCBuU2VjLCAwKSk7CgogIGlmIChKU19Qb3J0SXNOYW4oZFJldCkpIHsKICAgIGRSZXQgPSBKU19EYXRlUGFyc2Uoc3RyVmFsdWUuY19zdHIoKSk7CiAgfQoKICByZXR1cm4gZFJldDsKfQoKLy8gQUZEYXRlX0tleXN0cm9rZUV4KGNGb3JtYXQpCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGRGF0ZV9LZXlzdHJva2VFeChJRlhKU19Db250ZXh0KiBjYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CiAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CiAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOwogIEFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CgogIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpIHsKICAgIHNFcnJvciA9IEwiQUZEYXRlX0tleXN0cm9rZUV4J3MgcGFyYW1ldGVycycgc2l6ZSByIG5vdCBjb3JyZWN0IjsKICAgIHJldHVybiBGQUxTRTsKICB9CgogIGlmIChwRXZlbnQtPldpbGxDb21taXQoKSkgewogICAgaWYgKCFwRXZlbnQtPm1fcFZhbHVlKQogICAgICByZXR1cm4gRkFMU0U7CiAgICBDRlhfV2lkZVN0cmluZyBzdHJWYWx1ZSA9IHBFdmVudC0+VmFsdWUoKTsKICAgIGlmIChzdHJWYWx1ZS5Jc0VtcHR5KCkpCiAgICAgIHJldHVybiBUUlVFOwoKICAgIENGWF9XaWRlU3RyaW5nIHNGb3JtYXQgPSBwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKCk7CiAgICBGWF9CT09MIGJXcm9uZ0Zvcm1hdCA9IEZBTFNFOwogICAgZG91YmxlIGRSZXQgPSBNYWtlUmVndWxhckRhdGUoc3RyVmFsdWUsIHNGb3JtYXQsIGJXcm9uZ0Zvcm1hdCk7CiAgICBpZiAoYldyb25nRm9ybWF0IHx8IEpTX1BvcnRJc05hbihkUmV0KSkgewogICAgICBDRlhfV2lkZVN0cmluZyBzd01zZzsKICAgICAgc3dNc2cuRm9ybWF0KEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSU0VEQVRFKS5jX3N0cigpLAogICAgICAgICAgICAgICAgICAgc0Zvcm1hdC5jX3N0cigpKTsKICAgICAgQWxlcnQocENvbnRleHQsIHN3TXNnLmNfc3RyKCkpOwogICAgICBwRXZlbnQtPlJjKCkgPSBGQUxTRTsKICAgICAgcmV0dXJuIFRSVUU7CiAgICB9CiAgfQogIHJldHVybiBUUlVFOwp9CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRkRhdGVfRm9ybWF0KElGWEpTX0NvbnRleHQqIGNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7CgogIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpIHsKICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAgICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CgogICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKICAgIHJldHVybiBGQUxTRTsKICB9CgogIGludCBpSW5kZXggPSBwYXJhbXNbMF0uVG9JbnQoKTsKICBjb25zdCBGWF9XQ0hBUiogY0Zvcm1hdHNbXSA9IHtMIm0vZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJtL2QveXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwibW0vZGQveXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwibW0veXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiZC1tbW0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiZC1tbW0teXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiZGQtbW1tLXl5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMInl5LW1tLWRkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIm1tbS15eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJtbW1tLXl5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIm1tbSBkLCB5eXl5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIm1tbW0gZCwgeXl5eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJtL2QveXkgaDpNTSB0dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJtL2QveXkgSEg6TU0ifTsKCiAgaWYgKGlJbmRleCA8IDAgfHwgKHN0YXRpY19jYXN0PHNpemVfdD4oaUluZGV4KSA+PSBGWF9BcnJheVNpemUoY0Zvcm1hdHMpKSkKICAgIGlJbmRleCA9IDA7CgogIENKU19QYXJhbWV0ZXJzIG5ld1BhcmFtczsKICBDSlNfVmFsdWUgdmFsKGlzb2xhdGUsIGNGb3JtYXRzW2lJbmRleF0pOwogIG5ld1BhcmFtcy5wdXNoX2JhY2sodmFsKTsKICByZXR1cm4gQUZEYXRlX0Zvcm1hdEV4KGNjLCBuZXdQYXJhbXMsIHZSZXQsIHNFcnJvcik7Cn0KCi8vIEFGRGF0ZV9LZXlzdHJva2VFeChjRm9ybWF0KQpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRkRhdGVfS2V5c3Ryb2tlKElGWEpTX0NvbnRleHQqIGNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7CgogIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpIHsKICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAgICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CgogICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKICAgIHJldHVybiBGQUxTRTsKICB9CgogIGludCBpSW5kZXggPSBwYXJhbXNbMF0uVG9JbnQoKTsKICBjb25zdCBGWF9XQ0hBUiogY0Zvcm1hdHNbXSA9IHtMIm0vZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJtL2QveXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwibW0vZGQveXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwibW0veXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiZC1tbW0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiZC1tbW0teXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiZGQtbW1tLXl5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMInl5LW1tLWRkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIm1tbS15eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJtbW1tLXl5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIm1tbSBkLCB5eXl5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIm1tbW0gZCwgeXl5eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJtL2QveXkgaDpNTSB0dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJtL2QveXkgSEg6TU0ifTsKCiAgaWYgKGlJbmRleCA8IDAgfHwgKHN0YXRpY19jYXN0PHNpemVfdD4oaUluZGV4KSA+PSBGWF9BcnJheVNpemUoY0Zvcm1hdHMpKSkKICAgIGlJbmRleCA9IDA7CgogIENKU19QYXJhbWV0ZXJzIG5ld1BhcmFtczsKICBDSlNfVmFsdWUgdmFsKGlzb2xhdGUsIGNGb3JtYXRzW2lJbmRleF0pOwogIG5ld1BhcmFtcy5wdXNoX2JhY2sodmFsKTsKICByZXR1cm4gQUZEYXRlX0tleXN0cm9rZUV4KGNjLCBuZXdQYXJhbXMsIHZSZXQsIHNFcnJvcik7Cn0KCi8vIGZ1bmN0aW9uIEFGVGltZV9Gb3JtYXQocHRmKQpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlRpbWVfRm9ybWF0KElGWEpTX0NvbnRleHQqIGNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7CgogIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpIHsKICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAgICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CiAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwogICAgcmV0dXJuIEZBTFNFOwogIH0KCiAgaW50IGlJbmRleCA9IHBhcmFtc1swXS5Ub0ludCgpOwogIGNvbnN0IEZYX1dDSEFSKiBjRm9ybWF0c1tdID0ge0wiSEg6TU0iLCBMImg6TU0gdHQiLCBMIkhIOk1NOnNzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMImg6TU06c3MgdHQifTsKCiAgaWYgKGlJbmRleCA8IDAgfHwgKHN0YXRpY19jYXN0PHNpemVfdD4oaUluZGV4KSA+PSBGWF9BcnJheVNpemUoY0Zvcm1hdHMpKSkKICAgIGlJbmRleCA9IDA7CgogIENKU19QYXJhbWV0ZXJzIG5ld1BhcmFtczsKICBDSlNfVmFsdWUgdmFsKGlzb2xhdGUsIGNGb3JtYXRzW2lJbmRleF0pOwogIG5ld1BhcmFtcy5wdXNoX2JhY2sodmFsKTsKICByZXR1cm4gQUZEYXRlX0Zvcm1hdEV4KGNjLCBuZXdQYXJhbXMsIHZSZXQsIHNFcnJvcik7Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGVGltZV9LZXlzdHJva2UoSUZYSlNfQ29udGV4dCogY2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewogIHY4OjpJc29sYXRlKiBpc29sYXRlID0gOjpHZXRJc29sYXRlKGNjKTsKICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKSB7CiAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwogICAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwogICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKICAgIHJldHVybiBGQUxTRTsKICB9CgogIGludCBpSW5kZXggPSBwYXJhbXNbMF0uVG9JbnQoKTsKICBjb25zdCBGWF9XQ0hBUiogY0Zvcm1hdHNbXSA9IHtMIkhIOk1NIiwgTCJoOk1NIHR0IiwgTCJISDpNTTpzcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJoOk1NOnNzIHR0In07CgogIGlmIChpSW5kZXggPCAwIHx8IChzdGF0aWNfY2FzdDxzaXplX3Q+KGlJbmRleCkgPj0gRlhfQXJyYXlTaXplKGNGb3JtYXRzKSkpCiAgICBpSW5kZXggPSAwOwoKICBDSlNfUGFyYW1ldGVycyBuZXdQYXJhbXM7CiAgQ0pTX1ZhbHVlIHZhbChpc29sYXRlLCBjRm9ybWF0c1tpSW5kZXhdKTsKICBuZXdQYXJhbXMucHVzaF9iYWNrKHZhbCk7CiAgcmV0dXJuIEFGRGF0ZV9LZXlzdHJva2VFeChjYywgbmV3UGFyYW1zLCB2UmV0LCBzRXJyb3IpOwp9CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlRpbWVfRm9ybWF0RXgoSUZYSlNfQ29udGV4dCogY2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewogIHJldHVybiBBRkRhdGVfRm9ybWF0RXgoY2MsIHBhcmFtcywgdlJldCwgc0Vycm9yKTsKfQoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZUaW1lX0tleXN0cm9rZUV4KElGWEpTX0NvbnRleHQqIGNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKICByZXR1cm4gQUZEYXRlX0tleXN0cm9rZUV4KGNjLCBwYXJhbXMsIHZSZXQsIHNFcnJvcik7Cn0KCi8vIGZ1bmN0aW9uIEFGU3BlY2lhbF9Gb3JtYXQocHNmKQpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlNwZWNpYWxfRm9ybWF0KElGWEpTX0NvbnRleHQqIGNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwogIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKCiAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkgewogICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKICAgIHJldHVybiBGQUxTRTsKICB9CgogIHN0ZDo6c3RyaW5nIGNGb3JtYXQ7CiAgaW50IGlJbmRleCA9IHBhcmFtc1swXS5Ub0ludCgpOwoKICBDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7CiAgQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKCiAgaWYgKCFwRXZlbnQtPm1fcFZhbHVlKQogICAgcmV0dXJuIEZBTFNFOwogIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSA9IHBFdmVudC0+VmFsdWUoKTsKICBzdGQ6OnN0cmluZyBzdHJTcmMgPSBDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUoVmFsdWUpLmNfc3RyKCk7CgogIHN3aXRjaCAoaUluZGV4KSB7CiAgICBjYXNlIDA6CiAgICAgIGNGb3JtYXQgPSAiOTk5OTkiOwogICAgICBicmVhazsKICAgIGNhc2UgMToKICAgICAgY0Zvcm1hdCA9ICI5OTk5OS05OTk5IjsKICAgICAgYnJlYWs7CiAgICBjYXNlIDI6IHsKICAgICAgc3RkOjpzdHJpbmcgTnVtYmVyU3RyOwogICAgICB1dGlsOjpwcmludHgoIjk5OTk5OTk5OTkiLCBzdHJTcmMsIE51bWJlclN0cik7CiAgICAgIGlmIChOdW1iZXJTdHIubGVuZ3RoKCkgPj0gMTApCiAgICAgICAgY0Zvcm1hdCA9ICIoOTk5KSA5OTktOTk5OSI7CiAgICAgIGVsc2UKICAgICAgICBjRm9ybWF0ID0gIjk5OS05OTk5IjsKICAgICAgYnJlYWs7CiAgICB9CiAgICBjYXNlIDM6CiAgICAgIGNGb3JtYXQgPSAiOTk5LTk5LTk5OTkiOwogICAgICBicmVhazsKICB9CgogIHN0ZDo6c3RyaW5nIHN0ckRlczsKICB1dGlsOjpwcmludHgoY0Zvcm1hdCwgc3RyU3JjLCBzdHJEZXMpOwogIFZhbHVlID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChzdHJEZXMuY19zdHIoKSk7CiAgcmV0dXJuIFRSVUU7Cn0KCi8vIGZ1bmN0aW9uIEFGU3BlY2lhbF9LZXlzdHJva2VFeChtYXNrKQpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlNwZWNpYWxfS2V5c3Ryb2tlRXgoSUZYSlNfQ29udGV4dCogY2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewogIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwogIENKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKCiAgQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKCiAgaWYgKHBhcmFtcy5zaXplKCkgPCAxKSB7CiAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwogICAgcmV0dXJuIEZBTFNFOwogIH0KCiAgaWYgKCFwRXZlbnQtPm1fcFZhbHVlKQogICAgcmV0dXJuIEZBTFNFOwogIENGWF9XaWRlU3RyaW5nJiB2YWxFdmVudCA9IHBFdmVudC0+VmFsdWUoKTsKCiAgQ0ZYX1dpZGVTdHJpbmcgd3N0ck1hc2sgPSBwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKCk7CiAgaWYgKHdzdHJNYXNrLklzRW1wdHkoKSkKICAgIHJldHVybiBUUlVFOwoKICBjb25zdCBzaXplX3Qgd3N0ck1hc2tMZW4gPSB3c3RyTWFzay5HZXRMZW5ndGgoKTsKICBjb25zdCBzdGQ6OndzdHJpbmcgd3N0clZhbHVlID0gdmFsRXZlbnQuY19zdHIoKTsKCiAgaWYgKHBFdmVudC0+V2lsbENvbW1pdCgpKSB7CiAgICBpZiAod3N0clZhbHVlLmVtcHR5KCkpCiAgICAgIHJldHVybiBUUlVFOwogICAgc2l6ZV90IGlJbmRleE1hc2sgPSAwOwogICAgZm9yIChjb25zdCBhdXRvJiB3X1ZhbHVlIDogd3N0clZhbHVlKSB7CiAgICAgIGlmICghbWFza1NhdGlzZmllZCh3X1ZhbHVlLCB3c3RyTWFza1tpSW5kZXhNYXNrXSkpCiAgICAgICAgYnJlYWs7CiAgICAgIGlJbmRleE1hc2srKzsKICAgIH0KCiAgICBpZiAoaUluZGV4TWFzayAhPSB3c3RyTWFza0xlbiB8fAogICAgICAgIChpSW5kZXhNYXNrICE9IHdzdHJWYWx1ZS5zaXplKCkgJiYgd3N0ck1hc2tMZW4gIT0gMCkpIHsKICAgICAgQWxlcnQoCiAgICAgICAgICBwQ29udGV4dCwKICAgICAgICAgIEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTQUZOVU1CRVJfS0VZU1RST0tFKS5jX3N0cigpKTsKICAgICAgcEV2ZW50LT5SYygpID0gRkFMU0U7CiAgICB9CiAgICByZXR1cm4gVFJVRTsKICB9CgogIENGWF9XaWRlU3RyaW5nJiB3aWRlQ2hhbmdlID0gcEV2ZW50LT5DaGFuZ2UoKTsKICBzdGQ6OndzdHJpbmcgd0NoYW5nZSA9IHdpZGVDaGFuZ2UuY19zdHIoKTsKICBpZiAod0NoYW5nZS5lbXB0eSgpKQogICAgcmV0dXJuIFRSVUU7CgogIGludCBpSW5kZXhNYXNrID0gcEV2ZW50LT5TZWxTdGFydCgpOwoKICBzaXplX3QgY29tYmluZWRfbGVuID0gd3N0clZhbHVlLmxlbmd0aCgpICsgd0NoYW5nZS5sZW5ndGgoKSAtCiAgICAgICAgICAgICAgICAgICAgICAgIChwRXZlbnQtPlNlbEVuZCgpIC0gcEV2ZW50LT5TZWxTdGFydCgpKTsKICBpZiAoY29tYmluZWRfbGVuID4gd3N0ck1hc2tMZW4pIHsKICAgIEFsZXJ0KHBDb250ZXh0LAogICAgICAgICAgSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTV9UT09MT05HKS5jX3N0cigpKTsKICAgIHBFdmVudC0+UmMoKSA9IEZBTFNFOwogICAgcmV0dXJuIFRSVUU7CiAgfQoKICBpZiAoaUluZGV4TWFzayA+PSB3c3RyTWFza0xlbiAmJiAoIXdDaGFuZ2UuZW1wdHkoKSkpIHsKICAgIEFsZXJ0KHBDb250ZXh0LAogICAgICAgICAgSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTV9UT09MT05HKS5jX3N0cigpKTsKICAgIHBFdmVudC0+UmMoKSA9IEZBTFNFOwogICAgcmV0dXJuIFRSVUU7CiAgfQoKICBmb3IgKHN0ZDo6d3N0cmluZzo6aXRlcmF0b3IgaXQgPSB3Q2hhbmdlLmJlZ2luKCk7IGl0ICE9IHdDaGFuZ2UuZW5kKCk7IGl0KyspIHsKICAgIGlmIChpSW5kZXhNYXNrID49IHdzdHJNYXNrTGVuKSB7CiAgICAgIEFsZXJ0KHBDb250ZXh0LAogICAgICAgICAgICBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNX1RPT0xPTkcpLmNfc3RyKCkpOwogICAgICBwRXZlbnQtPlJjKCkgPSBGQUxTRTsKICAgICAgcmV0dXJuIFRSVUU7CiAgICB9CiAgICB3Y2hhcl90IHdfTWFzayA9IHdzdHJNYXNrW2lJbmRleE1hc2tdOwogICAgaWYgKCFpc1Jlc2VydmVkTWFza0NoYXIod19NYXNrKSkgewogICAgICAqaXQgPSB3X01hc2s7CiAgICB9CiAgICB3Y2hhcl90IHdfQ2hhbmdlID0gKml0OwogICAgaWYgKCFtYXNrU2F0aXNmaWVkKHdfQ2hhbmdlLCB3X01hc2spKSB7CiAgICAgIHBFdmVudC0+UmMoKSA9IEZBTFNFOwogICAgICByZXR1cm4gVFJVRTsKICAgIH0KICAgIGlJbmRleE1hc2srKzsKICB9CgogIHdpZGVDaGFuZ2UgPSB3Q2hhbmdlLmNfc3RyKCk7CiAgcmV0dXJuIFRSVUU7Cn0KCi8vIGZ1bmN0aW9uIEFGU3BlY2lhbF9LZXlzdHJva2UocHNmKQpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlNwZWNpYWxfS2V5c3Ryb2tlKElGWEpTX0NvbnRleHQqIGNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7CgogIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwogIENKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKICBBU1NFUlQocEV2ZW50ICE9IE5VTEwpOwoKICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKSB7CiAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwogICAgcmV0dXJuIEZBTFNFOwogIH0KCiAgc3RkOjpzdHJpbmcgY0Zvcm1hdDsKICBpbnQgaUluZGV4ID0gcGFyYW1zWzBdLlRvSW50KCk7CgogIGlmICghcEV2ZW50LT5tX3BWYWx1ZSkKICAgIHJldHVybiBGQUxTRTsKICAvLyBDSlNfVmFsdWUgdmFsID0gcEV2ZW50LT5WYWx1ZSgpOwogIENGWF9XaWRlU3RyaW5nJiB2YWwgPSBwRXZlbnQtPlZhbHVlKCk7CiAgc3RkOjpzdHJpbmcgc3RyU3JjID0gQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHZhbCkuY19zdHIoKTsKICBzdGQ6OndzdHJpbmcgd3N0ckNoYW5nZSA9IHBFdmVudC0+Q2hhbmdlKCkuY19zdHIoKTsKCiAgc3dpdGNoIChpSW5kZXgpIHsKICAgIGNhc2UgMDoKICAgICAgY0Zvcm1hdCA9ICI5OTk5OSI7CiAgICAgIGJyZWFrOwogICAgY2FzZSAxOgogICAgICAvLyBjRm9ybWF0ID0gIjk5OTk5LTk5OTkiOwogICAgICBjRm9ybWF0ID0gIjk5OTk5OTk5OSI7CiAgICAgIGJyZWFrOwogICAgY2FzZSAyOiB7CiAgICAgIHN0ZDo6c3RyaW5nIE51bWJlclN0cjsKICAgICAgdXRpbDo6cHJpbnR4KCI5OTk5OTk5OTk5Iiwgc3RyU3JjLCBOdW1iZXJTdHIpOwogICAgICBpZiAoc3RyU3JjLmxlbmd0aCgpICsgd3N0ckNoYW5nZS5sZW5ndGgoKSA+IDcpCiAgICAgICAgLy8gY0Zvcm1hdCA9ICIoOTk5KSA5OTktOTk5OSI7CiAgICAgICAgY0Zvcm1hdCA9ICI5OTk5OTk5OTk5IjsKICAgICAgZWxzZQogICAgICAgIC8vIGNGb3JtYXQgPSAiOTk5LTk5OTkiOwogICAgICAgIGNGb3JtYXQgPSAiOTk5OTk5OSI7CiAgICAgIGJyZWFrOwogICAgfQogICAgY2FzZSAzOgogICAgICAvLyBjRm9ybWF0ID0gIjk5OS05OS05OTk5IjsKICAgICAgY0Zvcm1hdCA9ICI5OTk5OTk5OTkiOwogICAgICBicmVhazsKICB9CgogIENKU19QYXJhbWV0ZXJzIHBhcmFtczI7CiAgQ0pTX1ZhbHVlIHZNYXNrKGlzb2xhdGUsIGNGb3JtYXQuY19zdHIoKSk7CiAgcGFyYW1zMi5wdXNoX2JhY2sodk1hc2spOwoKICByZXR1cm4gQUZTcGVjaWFsX0tleXN0cm9rZUV4KGNjLCBwYXJhbXMyLCB2UmV0LCBzRXJyb3IpOwp9CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRk1lcmdlQ2hhbmdlKElGWEpTX0NvbnRleHQqIGNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwogIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKICBDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnRIYW5kbGVyID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOwogIEFTU0VSVChwRXZlbnRIYW5kbGVyICE9IE5VTEwpOwoKICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKSB7CiAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwogICAgcmV0dXJuIEZBTFNFOwogIH0KCiAgQ0ZYX1dpZGVTdHJpbmcgc3dWYWx1ZTsKICBpZiAocEV2ZW50SGFuZGxlci0+bV9wVmFsdWUgIT0gTlVMTCkKICAgIHN3VmFsdWUgPSBwRXZlbnRIYW5kbGVyLT5WYWx1ZSgpOwoKICBpZiAocEV2ZW50SGFuZGxlci0+V2lsbENvbW1pdCgpKSB7CiAgICB2UmV0ID0gc3dWYWx1ZS5jX3N0cigpOwogICAgcmV0dXJuIFRSVUU7CiAgfQoKICBDRlhfV2lkZVN0cmluZyBwcmVmaXgsIHBvc3RmaXg7CgogIGlmIChwRXZlbnRIYW5kbGVyLT5TZWxTdGFydCgpID49IDApCiAgICBwcmVmaXggPSBzd1ZhbHVlLk1pZCgwLCBwRXZlbnRIYW5kbGVyLT5TZWxTdGFydCgpKTsKICBlbHNlCiAgICBwcmVmaXggPSBMIiI7CgogIGlmIChwRXZlbnRIYW5kbGVyLT5TZWxFbmQoKSA+PSAwICYmCiAgICAgIHBFdmVudEhhbmRsZXItPlNlbEVuZCgpIDw9IHN3VmFsdWUuR2V0TGVuZ3RoKCkpCiAgICBwb3N0Zml4ID0gc3dWYWx1ZS5NaWQocEV2ZW50SGFuZGxlci0+U2VsRW5kKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3dWYWx1ZS5HZXRMZW5ndGgoKSAtIHBFdmVudEhhbmRsZXItPlNlbEVuZCgpKTsKICBlbHNlCiAgICBwb3N0Zml4ID0gTCIiOwoKICB2UmV0ID0gKHByZWZpeCArIHBFdmVudEhhbmRsZXItPkNoYW5nZSgpICsgcG9zdGZpeCkuY19zdHIoKTsKCiAgcmV0dXJuIFRSVUU7Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGUGFyc2VEYXRlRXgoSUZYSlNfQ29udGV4dCogY2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewogIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwoKICBpZiAocGFyYW1zLnNpemUoKSAhPSAyKSB7CiAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwogICAgcmV0dXJuIEZBTFNFOwogIH0KCiAgQ0ZYX1dpZGVTdHJpbmcgc1ZhbHVlID0gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpOwogIENGWF9XaWRlU3RyaW5nIHNGb3JtYXQgPSBwYXJhbXNbMV0uVG9DRlhXaWRlU3RyaW5nKCk7CgogIEZYX0JPT0wgYldyb25nRm9ybWF0ID0gRkFMU0U7CiAgZG91YmxlIGREYXRlID0gTWFrZVJlZ3VsYXJEYXRlKHNWYWx1ZSwgc0Zvcm1hdCwgYldyb25nRm9ybWF0KTsKCiAgaWYgKEpTX1BvcnRJc05hbihkRGF0ZSkpIHsKICAgIENGWF9XaWRlU3RyaW5nIHN3TXNnOwogICAgc3dNc2cuRm9ybWF0KEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSU0VEQVRFKS5jX3N0cigpLAogICAgICAgICAgICAgICAgIHNGb3JtYXQuY19zdHIoKSk7CiAgICBBbGVydCgoQ0pTX0NvbnRleHQqKWNjLCBzd01zZy5jX3N0cigpKTsKICAgIHJldHVybiBGQUxTRTsKICB9CgogIHZSZXQgPSBkRGF0ZTsKICByZXR1cm4gVFJVRTsKfQoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZTaW1wbGUoSUZYSlNfQ29udGV4dCogY2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewogIGlmIChwYXJhbXMuc2l6ZSgpICE9IDMpIHsKICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAgICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CgogICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKICAgIHJldHVybiBGQUxTRTsKICB9CgogIHZSZXQgPSAoZG91YmxlKUFGX1NpbXBsZShwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKCkuY19zdHIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zWzFdLlRvRG91YmxlKCksIHBhcmFtc1syXS5Ub0RvdWJsZSgpKTsKICByZXR1cm4gVFJVRTsKfQoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZNYWtlTnVtYmVyKElGWEpTX0NvbnRleHQqIGNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKSB7CiAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwogICAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwoKICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CiAgICByZXR1cm4gRkFMU0U7CiAgfQogIHZSZXQgPSBQYXJzZVN0cmluZ1RvTnVtYmVyKHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKS5jX3N0cigpKTsKICByZXR1cm4gVFJVRTsKfQoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZTaW1wbGVfQ2FsY3VsYXRlKElGWEpTX0NvbnRleHQqIGNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7CgogIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwoKICBpZiAocGFyYW1zLnNpemUoKSAhPSAyKSB7CiAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwogICAgcmV0dXJuIEZBTFNFOwogIH0KCiAgQ0pTX1ZhbHVlIHBhcmFtczEgPSBwYXJhbXNbMV07CgogIGlmICghcGFyYW1zMS5Jc0FycmF5T2JqZWN0KCkgJiYgcGFyYW1zMS5HZXRUeXBlKCkgIT0gQ0pTX1ZhbHVlOjpWVF9zdHJpbmcpIHsKICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CiAgICByZXR1cm4gRkFMU0U7CiAgfQoKICBDUERGU0RLX0RvY3VtZW50KiBwUmVhZGVyRG9jID0gcENvbnRleHQtPkdldFJlYWRlckRvY3VtZW50KCk7CiAgQVNTRVJUKHBSZWFkZXJEb2MgIT0gTlVMTCk7CgogIENQREZTREtfSW50ZXJGb3JtKiBwUmVhZGVySW50ZXJGb3JtID0gcFJlYWRlckRvYy0+R2V0SW50ZXJGb3JtKCk7CiAgQVNTRVJUKHBSZWFkZXJJbnRlckZvcm0gIT0gTlVMTCk7CgogIENQREZfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gcFJlYWRlckludGVyRm9ybS0+R2V0SW50ZXJGb3JtKCk7CiAgQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7CgogIGRvdWJsZSBkVmFsdWU7CiAgQ0ZYX1dpZGVTdHJpbmcgc0Z1bmN0aW9uID0gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpOwogIGlmICh3Y3NjbXAoc0Z1bmN0aW9uLmNfc3RyKCksIEwiUFJEIikgPT0gMCkKICAgIGRWYWx1ZSA9IDEuMDsKICBlbHNlCiAgICBkVmFsdWUgPSAwLjA7CgogIENKU19BcnJheSBGaWVsZE5hbWVBcnJheSA9IEFGX01ha2VBcnJheUZyb21MaXN0KGlzb2xhdGUsIHBhcmFtczEpOwoKICBpbnQgbkZpZWxkc0NvdW50ID0gMDsKCiAgZm9yIChpbnQgaSA9IDAsIGlzeiA9IEZpZWxkTmFtZUFycmF5LkdldExlbmd0aCgpOyBpIDwgaXN6OyBpKyspIHsKICAgIENKU19WYWx1ZSBqc1ZhbHVlKGlzb2xhdGUpOwogICAgRmllbGROYW1lQXJyYXkuR2V0RWxlbWVudChpLCBqc1ZhbHVlKTsKICAgIENGWF9XaWRlU3RyaW5nIHdzRmllbGROYW1lID0ganNWYWx1ZS5Ub0NGWFdpZGVTdHJpbmcoKTsKCiAgICBmb3IgKGludCBqID0gMCwganN6ID0gcEludGVyRm9ybS0+Q291bnRGaWVsZHMod3NGaWVsZE5hbWUpOyBqIDwganN6OyBqKyspIHsKICAgICAgaWYgKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gcEludGVyRm9ybS0+R2V0RmllbGQoaiwgd3NGaWVsZE5hbWUpKSB7CiAgICAgICAgZG91YmxlIGRUZW1wID0gMC4wOwoKICAgICAgICBzd2l0Y2ggKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpKSB7CiAgICAgICAgICBjYXNlIEZJRUxEVFlQRV9URVhURklFTEQ6CiAgICAgICAgICBjYXNlIEZJRUxEVFlQRV9DT01CT0JPWDogewogICAgICAgICAgICBkVGVtcCA9IFBhcnNlU3RyaW5nVG9OdW1iZXIocEZvcm1GaWVsZC0+R2V0VmFsdWUoKS5jX3N0cigpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIEZJRUxEVFlQRV9QVVNIQlVUVE9OOiB7CiAgICAgICAgICAgIGRUZW1wID0gMC4wOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGNhc2UgRklFTERUWVBFX0NIRUNLQk9YOgogICAgICAgICAgY2FzZSBGSUVMRFRZUEVfUkFESU9CVVRUT046IHsKICAgICAgICAgICAgZFRlbXAgPSAwLjA7CiAgICAgICAgICAgIGZvciAoaW50IGMgPSAwLCBjc3ogPSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCk7IGMgPCBjc3o7IGMrKykgewogICAgICAgICAgICAgIGlmIChDUERGX0Zvcm1Db250cm9sKiBwRm9ybUN0cmwgPSBwRm9ybUZpZWxkLT5HZXRDb250cm9sKGMpKSB7CiAgICAgICAgICAgICAgICBpZiAocEZvcm1DdHJsLT5Jc0NoZWNrZWQoKSkgewogICAgICAgICAgICAgICAgICBkVGVtcCArPQogICAgICAgICAgICAgICAgICAgICAgUGFyc2VTdHJpbmdUb051bWJlcihwRm9ybUN0cmwtPkdldEV4cG9ydFZhbHVlKCkuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGNhc2UgRklFTERUWVBFX0xJU1RCT1g6IHsKICAgICAgICAgICAgZFRlbXAgPSAwLjA7CiAgICAgICAgICAgIGlmIChwRm9ybUZpZWxkLT5Db3VudFNlbGVjdGVkSXRlbXMoKSA+IDEpCiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgIGRUZW1wID0gUGFyc2VTdHJpbmdUb051bWJlcihwRm9ybUZpZWxkLT5HZXRWYWx1ZSgpLmNfc3RyKCkpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIGlmIChpID09IDAgJiYgaiA9PSAwICYmICh3Y3NjbXAoc0Z1bmN0aW9uLmNfc3RyKCksIEwiTUlOIikgPT0gMCB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Y3NjbXAoc0Z1bmN0aW9uLmNfc3RyKCksIEwiTUFYIikgPT0gMCkpCiAgICAgICAgICBkVmFsdWUgPSBkVGVtcDsKCiAgICAgICAgZFZhbHVlID0gQUZfU2ltcGxlKHNGdW5jdGlvbi5jX3N0cigpLCBkVmFsdWUsIGRUZW1wKTsKCiAgICAgICAgbkZpZWxkc0NvdW50Kys7CiAgICAgIH0KICAgIH0KICB9CgogIGlmICh3Y3NjbXAoc0Z1bmN0aW9uLmNfc3RyKCksIEwiQVZHIikgPT0gMCAmJiBuRmllbGRzQ291bnQgPiAwKQogICAgZFZhbHVlIC89IG5GaWVsZHNDb3VudDsKCiAgZFZhbHVlID0gKGRvdWJsZSlmbG9vcihkVmFsdWUgKiBGWFNZU19wb3coKGRvdWJsZSkxMCwgKGRvdWJsZSk2KSArIDAuNDkpIC8KICAgICAgICAgICBGWFNZU19wb3coKGRvdWJsZSkxMCwgKGRvdWJsZSk2KTsKICBDSlNfVmFsdWUganNWYWx1ZShpc29sYXRlLCBkVmFsdWUpOwogIGlmIChwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCktPm1fcFZhbHVlKQogICAgcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpLT5WYWx1ZSgpID0ganNWYWx1ZS5Ub0NGWFdpZGVTdHJpbmcoKTsKCiAgcmV0dXJuIFRSVUU7Cn0KCi8qIFRoaXMgZnVuY3Rpb24gdmFsaWRhdGVzIHRoZSBjdXJyZW50IGV2ZW50IHRvIGVuc3VyZSB0aGF0IGl0cyB2YWx1ZSBpcwoqKiB3aXRoaW4gdGhlIHNwZWNpZmllZCByYW5nZS4gKi8KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGUmFuZ2VfVmFsaWRhdGUoSUZYSlNfQ29udGV4dCogY2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewogIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwogIENKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKICBBU1NFUlQocEV2ZW50ICE9IE5VTEwpOwoKICBpZiAocGFyYW1zLnNpemUoKSAhPSA0KSB7CiAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwogICAgcmV0dXJuIEZBTFNFOwogIH0KCiAgaWYgKCFwRXZlbnQtPm1fcFZhbHVlKQogICAgcmV0dXJuIEZBTFNFOwogIGlmIChwRXZlbnQtPlZhbHVlKCkuSXNFbXB0eSgpKQogICAgcmV0dXJuIFRSVUU7CiAgZG91YmxlIGRFZW50VmFsdWUgPSBhdG9mKENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShwRXZlbnQtPlZhbHVlKCkpKTsKICBGWF9CT09MIGJHcmVhdGVyVGhhbiA9IHBhcmFtc1swXS5Ub0Jvb2woKTsKICBkb3VibGUgZEdyZWF0ZXJUaGFuID0gcGFyYW1zWzFdLlRvRG91YmxlKCk7CiAgRlhfQk9PTCBiTGVzc1RoYW4gPSBwYXJhbXNbMl0uVG9Cb29sKCk7CiAgZG91YmxlIGRMZXNzVGhhbiA9IHBhcmFtc1szXS5Ub0RvdWJsZSgpOwogIENGWF9XaWRlU3RyaW5nIHN3TXNnOwoKICBpZiAoYkdyZWF0ZXJUaGFuICYmIGJMZXNzVGhhbikgewogICAgaWYgKGRFZW50VmFsdWUgPCBkR3JlYXRlclRoYW4gfHwgZEVlbnRWYWx1ZSA+IGRMZXNzVGhhbikKICAgICAgc3dNc2cuRm9ybWF0KEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUkFOR0UxKS5jX3N0cigpLAogICAgICAgICAgICAgICAgICAgcGFyYW1zWzFdLlRvQ0ZYV2lkZVN0cmluZygpLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICBwYXJhbXNbM10uVG9DRlhXaWRlU3RyaW5nKCkuY19zdHIoKSk7CiAgfSBlbHNlIGlmIChiR3JlYXRlclRoYW4pIHsKICAgIGlmIChkRWVudFZhbHVlIDwgZEdyZWF0ZXJUaGFuKQogICAgICBzd01zZy5Gb3JtYXQoSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNSQU5HRTIpLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICBwYXJhbXNbMV0uVG9DRlhXaWRlU3RyaW5nKCkuY19zdHIoKSk7CiAgfSBlbHNlIGlmIChiTGVzc1RoYW4pIHsKICAgIGlmIChkRWVudFZhbHVlID4gZExlc3NUaGFuKQogICAgICBzd01zZy5Gb3JtYXQoSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNSQU5HRTMpLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICBwYXJhbXNbM10uVG9DRlhXaWRlU3RyaW5nKCkuY19zdHIoKSk7CiAgfQoKICBpZiAoIXN3TXNnLklzRW1wdHkoKSkgewogICAgQWxlcnQocENvbnRleHQsIHN3TXNnLmNfc3RyKCkpOwogICAgcEV2ZW50LT5SYygpID0gRkFMU0U7CiAgfQogIHJldHVybiBUUlVFOwp9CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRkV4dHJhY3ROdW1zKElGWEpTX0NvbnRleHQqIGNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7CiAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CgogIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpIHsKICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CiAgICByZXR1cm4gRkFMU0U7CiAgfQoKICBDSlNfQXJyYXkgbnVtcyhpc29sYXRlKTsKCiAgQ0ZYX1dpZGVTdHJpbmcgc3RyID0gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpOwogIENGWF9XaWRlU3RyaW5nIHNQYXJ0OwoKICBpZiAoc3RyLkdldEF0KDApID09IEwnLicgfHwgc3RyLkdldEF0KDApID09IEwnLCcpCiAgICBzdHIgPSBMIjAiICsgc3RyOwoKICBpbnQgbkluZGV4ID0gMDsKICBmb3IgKGludCBpID0gMCwgc3ogPSBzdHIuR2V0TGVuZ3RoKCk7IGkgPCBzejsgaSsrKSB7CiAgICBGWF9XQ0hBUiB3YyA9IHN0ci5HZXRBdChpKTsKICAgIGlmIChJc0RpZ2l0KCh3Y2hhcl90KXdjKSkgewogICAgICBzUGFydCArPSB3YzsKICAgIH0gZWxzZSB7CiAgICAgIGlmIChzUGFydC5HZXRMZW5ndGgoKSA+IDApIHsKICAgICAgICBudW1zLlNldEVsZW1lbnQobkluZGV4LCBDSlNfVmFsdWUoaXNvbGF0ZSwgc1BhcnQuY19zdHIoKSkpOwogICAgICAgIHNQYXJ0ID0gTCIiOwogICAgICAgIG5JbmRleCsrOwogICAgICB9CiAgICB9CiAgfQoKICBpZiAoc1BhcnQuR2V0TGVuZ3RoKCkgPiAwKSB7CiAgICBudW1zLlNldEVsZW1lbnQobkluZGV4LCBDSlNfVmFsdWUoaXNvbGF0ZSwgc1BhcnQuY19zdHIoKSkpOwogIH0KCiAgaWYgKG51bXMuR2V0TGVuZ3RoKCkgPiAwKQogICAgdlJldCA9IG51bXM7CiAgZWxzZQogICAgdlJldC5TZXROdWxsKCk7CgogIHJldHVybiBUUlVFOwp9Cg==