Ly8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCgojaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0phdmFTY3JpcHQuaCIKI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9JSmF2YVNjcmlwdC5oIgojaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0RlZmluZS5oIgojaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX09iamVjdC5oIgojaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX1ZhbHVlLmgiCiNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvUHVibGljTWV0aG9kcy5oIgojaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0V2ZW50SGFuZGxlci5oIgojaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L3Jlc291cmNlLmgiCiNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSlNfQ29udGV4dC5oIgojaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX1ZhbHVlLmgiCiNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvdXRpbC5oIgojaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0ZpZWxkLmgiCiNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvY29sb3IuaCIKI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KU19SdW50aW1lLmgiCgpzdGF0aWMgdjg6Oklzb2xhdGUqIEdldElzb2xhdGUoSUZYSlNfQ29udGV4dCogY2MpCnsKCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwoJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwoKCUNKU19SdW50aW1lKiBwUnVudGltZSA9IHBDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsKCUFTU0VSVChwUnVudGltZSAhPSBOVUxMKTsKCglyZXR1cm4gcFJ1bnRpbWUtPkdldElzb2xhdGUoKTsKfQoKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENKU19QdWJsaWNNZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgojZGVmaW5lIERPVUJMRV9DT1JSRUNUCTAuMDAwMDAwMDAwMDAwMDAxCgpCRUdJTl9KU19TVEFUSUNfR0xPQkFMX0ZVTihDSlNfUHVibGljTWV0aG9kcykKCUpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGTnVtYmVyX0Zvcm1hdCkKCUpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGTnVtYmVyX0tleXN0cm9rZSkKCUpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGUGVyY2VudF9Gb3JtYXQpCglKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlBlcmNlbnRfS2V5c3Ryb2tlKQoJSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZEYXRlX0Zvcm1hdEV4KQoJSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZEYXRlX0tleXN0cm9rZUV4KQoJSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZEYXRlX0Zvcm1hdCkKCUpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGRGF0ZV9LZXlzdHJva2UpCglKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlRpbWVfRm9ybWF0RXgpCglKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlRpbWVfS2V5c3Ryb2tlRXgpCglKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlRpbWVfRm9ybWF0KQoJSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZUaW1lX0tleXN0cm9rZSkKCUpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGU3BlY2lhbF9Gb3JtYXQpCglKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlNwZWNpYWxfS2V5c3Ryb2tlKQoJSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZTcGVjaWFsX0tleXN0cm9rZUV4KQoJSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZTaW1wbGUpCglKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRk1ha2VOdW1iZXIpCglKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlNpbXBsZV9DYWxjdWxhdGUpCglKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlJhbmdlX1ZhbGlkYXRlKQoJSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZNZXJnZUNoYW5nZSkKCUpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGUGFyc2VEYXRlRXgpCglKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRkV4dHJhY3ROdW1zKQpFTkRfSlNfU1RBVElDX0dMT0JBTF9GVU4oKQoKSU1QTEVNRU5UX0pTX1NUQVRJQ19HTE9CQUxfRlVOKENKU19QdWJsaWNNZXRob2RzKQoKc3RhdGljIGNvbnN0IEZYX1dDSEFSKiBtb250aHNbXSA9CnsKCUwiSmFuIiwgTCJGZWIiLCBMIk1hciIsIEwiQXByIiwgTCJNYXkiLCBMIkp1biIsIEwiSnVsIiwgTCJBdWciLCBMIlNlcCIsIEwiT2N0IiwgTCJOb3YiLCBMIkRlYyIKfTsKCnN0YXRpYyBjb25zdCBGWF9XQ0hBUiogZnVsbG1vbnRoc1tdID0KewoJTCJKYW51YXJ5IiwgTCJGZWJydWFyeSIsIEwiTWFyY2giLCBMIkFwcmlsIiwgTCJNYXkiLCBMIkp1bmUiLCBMIkp1bHkiLCBMIkF1Z3VzdCIsIEwiU2VwdGVtYmVyIiwgTCJPY3RvYmVyIiwgTCJOb3ZlbWJlciIsIEwiRGVjZW1iZXIiCn07CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpJc051bWJlcihjb25zdCBGWF9XQ0hBUiogc3RyaW5nKQp7CglDRlhfV2lkZVN0cmluZyBzVHJpbSA9IFN0clRyaW0oc3RyaW5nKTsKCWNvbnN0IEZYX1dDSEFSKiBwVHJpbSA9IHNUcmltLmNfc3RyKCk7Cgljb25zdCBGWF9XQ0hBUiogcCA9IHBUcmltOwoKCglGWF9CT09MIGJEb3QgPSBGQUxTRTsKCUZYX0JPT0wgYktYSlMgPSBGQUxTRTsKCgl3Y2hhcl90IGM7Cgl3aGlsZSAoKGMgPSAqcCkpCgl7CgkJaWYgKGMgPT0gJy4nIHx8IGMgPT0gJywnKQoJCXsKCQkJaWYgKGJEb3QpIHJldHVybiBGQUxTRTsKCQkJYkRvdCA9IFRSVUU7CgkJfQoJCWVsc2UgaWYgKGMgPT0gJy0nIHx8IGMgPT0gJysnKQoJCXsKCQkJaWYgKHAgIT0gcFRyaW0pCgkJCQlyZXR1cm4gRkFMU0U7CgkJfQoJCWVsc2UgaWYgKGMgPT0gJ2UnIHx8IGMgPT0gJ0UnKQoJCXsKCQkJaWYgKGJLWEpTKSByZXR1cm4gRkFMU0U7CgoJCQlwKys7CgkJCWMgPSAqcDsKCQkJaWYgKGMgPT0gJysnIHx8IGMgPT0gJy0nKQoJCQl7CgkJCQliS1hKUyA9IFRSVUU7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlyZXR1cm4gRkFMU0U7CgkJCX0KCQl9CgkJZWxzZSBpZiAoIUlzRGlnaXQoYykpCgkJewoJCQlyZXR1cm4gRkFMU0U7CgkJfQoJCXArKzsKCX0KCglyZXR1cm4gVFJVRTsKfQoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6SXNEaWdpdCh3Y2hhcl90IGNoKQp7CglyZXR1cm4gKGNoID49IEwnMCcgJiYgY2ggPD0gTCc5Jyk7Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OklzRGlnaXQoY2hhciBjaCkKewoJcmV0dXJuIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKTsKfQoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6SXNBbHBoYWJldGljKHdjaGFyX3QgY2gpCnsKCXJldHVybiAoKGNoID49IEwnYScgJiYgY2ggPD0gTCd6JykgfHwgKGNoID49IEwnQScgJiYgY2ggPD0gTCdaJykpOwp9CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpJc0FscGhhTnVtZXJpYyh3Y2hhcl90IGNoKQp7CglyZXR1cm4gKElzRGlnaXQoY2gpIHx8IElzQWxwaGFiZXRpYyhjaCkpOwp9CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjptYXNrU2F0aXNmaWVkKHdjaGFyX3QgY19DaGFuZ2Usd2NoYXJfdCBjX01hc2spCnsKCXN3aXRjaCAoY19NYXNrKQoJewoJY2FzZSBMJzknOgogICAgICAgIHJldHVybiBJc0RpZ2l0KGNfQ2hhbmdlKTsKICAgIGNhc2UgTCdBJzoKICAgICAgICByZXR1cm4gSXNBbHBoYWJldGljKGNfQ2hhbmdlKTsKICAgIGNhc2UgTCdPJzoKICAgICAgICByZXR1cm4gSXNBbHBoYU51bWVyaWMoY19DaGFuZ2UpOwogICAgY2FzZSBMJ1gnOgogICAgICAgIHJldHVybiBUUlVFOwoJZGVmYXVsdDoKICAgICAgICByZXR1cm4gKGNfQ2hhbmdlID09IGNfTWFzayk7Cgl9Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OmlzUmVzZXJ2ZWRNYXNrQ2hhcih3Y2hhcl90IGNoKQp7CglyZXR1cm4gY2ggPT0gTCc5JyB8fCBjaCA9PSBMJ0EnIHx8IGNoID09IEwnTycgfHwgY2ggPT0gTCdYJzsKfQoKZG91YmxlIENKU19QdWJsaWNNZXRob2RzOjpBRl9TaW1wbGUoY29uc3QgRlhfV0NIQVIqIHNGdWN0aW9uLCBkb3VibGUgZFZhbHVlMSwgZG91YmxlIGRWYWx1ZTIpCnsKCWlmIChGWFNZU193Y3NpY21wKHNGdWN0aW9uLEwiQVZHIikgPT0gMCB8fCBGWFNZU193Y3NpY21wKHNGdWN0aW9uLEwiU1VNIikgPT0gMCkKCXsKCQlyZXR1cm4gZFZhbHVlMSArIGRWYWx1ZTI7Cgl9CgllbHNlIGlmIChGWFNZU193Y3NpY21wKHNGdWN0aW9uLCBMIlBSRCIpID09IDApCgl7CgkJcmV0dXJuIGRWYWx1ZTEgKiBkVmFsdWUyOwoJfQoJZWxzZSBpZiAoRlhTWVNfd2NzaWNtcChzRnVjdGlvbixMIk1JTiIpID09IDApCgl7CgkJcmV0dXJuIEZYX01JTihkVmFsdWUxLCBkVmFsdWUyKTsKCX0KCWVsc2UgaWYgKEZYU1lTX3djc2ljbXAoc0Z1Y3Rpb24sTCJNQVgiKSA9PSAwKQoJewoJCXJldHVybiBGWF9NQVgoZFZhbHVlMSwgZFZhbHVlMik7Cgl9CgoJcmV0dXJuIGRWYWx1ZTE7Cn0KCkNGWF9XaWRlU3RyaW5nIENKU19QdWJsaWNNZXRob2RzOjpTdHJMVHJpbShjb25zdCBGWF9XQ0hBUiogcFN0cikKewoJd2hpbGUgKCpwU3RyICYmICpwU3RyID09IEwnICcpIHBTdHIrKzsKCglyZXR1cm4gcFN0cjsKfQoKQ0ZYX1dpZGVTdHJpbmcgQ0pTX1B1YmxpY01ldGhvZHM6OlN0clJUcmltKGNvbnN0IEZYX1dDSEFSKiBwU3RyKQp7Cgljb25zdCBGWF9XQ0hBUiogcCA9IHBTdHI7Cgl3aGlsZSAoKnApIHArKzsKCXdoaWxlIChwID4gcFN0ciAmJiAqKHAgLSAxKSA9PSBMJyAnKSBwLS07CgoJcmV0dXJuIENGWF9XaWRlU3RyaW5nKHBTdHIsIHAgLSBwU3RyKTsKfQoKQ0ZYX1dpZGVTdHJpbmcgQ0pTX1B1YmxpY01ldGhvZHM6OlN0clRyaW0oY29uc3QgRlhfV0NIQVIqIHBTdHIpCnsKCXJldHVybiBTdHJSVHJpbShTdHJMVHJpbShwU3RyKS5jX3N0cigpKTsKfQoKQ0ZYX0J5dGVTdHJpbmcgQ0pTX1B1YmxpY01ldGhvZHM6OlN0ckxUcmltKGNvbnN0IEZYX0NIQVIqIHBTdHIpCnsKCXdoaWxlICgqcFN0ciAmJiAqcFN0ciA9PSAnICcpIHBTdHIrKzsKCiAgICAgICAgcmV0dXJuIHBTdHI7Cn0KCkNGWF9CeXRlU3RyaW5nIENKU19QdWJsaWNNZXRob2RzOjpTdHJSVHJpbShjb25zdCBGWF9DSEFSKiBwU3RyKQp7Cgljb25zdCBGWF9DSEFSKiBwID0gcFN0cjsKCXdoaWxlICgqcCkgcCsrOwoJd2hpbGUgKHAgPiBwU3RyICYmICoocCAtIDEpID09IEwnICcpIHAtLTsKCglyZXR1cm4gQ0ZYX0J5dGVTdHJpbmcocFN0cixwLXBTdHIpOwp9CgpDRlhfQnl0ZVN0cmluZyBDSlNfUHVibGljTWV0aG9kczo6U3RyVHJpbShjb25zdCBGWF9DSEFSKiBwU3RyKQp7CglyZXR1cm4gU3RyUlRyaW0oU3RyTFRyaW0ocFN0cikpOwp9Cgpkb3VibGUgQ0pTX1B1YmxpY01ldGhvZHM6OlBhcnNlTnVtYmVyKGNvbnN0IEZYX1dDSEFSKiBzd1NvdXJjZSwgRlhfQk9PTCYgYkFsbERpZ2l0cywgRlhfQk9PTCYgYkRvdCwgRlhfQk9PTCYgYlNpZ24sIEZYX0JPT0wmIGJLWEpTKQp7CgliRG90ID0gRkFMU0U7CgliU2lnbiA9IEZBTFNFOwoJYktYSlMgPSBGQUxTRTsKCglGWF9CT09MIGJEaWdpdEV4aXN0ID0gRkFMU0U7CgoJY29uc3QgRlhfV0NIQVIqIHAgPSBzd1NvdXJjZTsKCXdjaGFyX3QgYzsKCgljb25zdCBGWF9XQ0hBUiogcFN0YXJ0ID0gTlVMTDsKCWNvbnN0IEZYX1dDSEFSKiBwRW5kID0gTlVMTDsKCgl3aGlsZSAoKGMgPSAqcCkpCgl7CgkJaWYgKCFwU3RhcnQgJiYgYyAhPSBMJyAnKQoJCXsKCQkJcFN0YXJ0ID0gcDsKCQl9CgoJCXBFbmQgPSBwOwoJCXArKzsKCX0KCglpZiAoIXBTdGFydCkKCXsKCQliQWxsRGlnaXRzID0gRkFMU0U7CgkJcmV0dXJuIDA7Cgl9CgoJd2hpbGUgKHBFbmQgIT0gcFN0YXJ0KQoJewoJCWlmICgqcEVuZCA9PSBMJyAnKQoJCQlwRW5kIC0tOwoJCWVsc2UKCQkJYnJlYWs7Cgl9CgoJZG91YmxlIGRSZXQgPSAwOwoJcCA9IHBTdGFydDsKCWJBbGxEaWdpdHMgPSBUUlVFOwoJQ0ZYX1dpZGVTdHJpbmcgc3dEaWdpdHM7CgoJd2hpbGUgKHAgPD0gcEVuZCkKCXsKCQljID0gKnA7CgoJCWlmIChJc0RpZ2l0KGMpKQoJCXsKCQkJc3dEaWdpdHMgKz0gYzsKCQkJYkRpZ2l0RXhpc3QgPSBUUlVFOwoJCX0KCQllbHNlCgkJewoJCQlzd2l0Y2ggKGMpCgkJCXsKCQkJY2FzZSBMJyAnOgoJCQkJYkFsbERpZ2l0cyA9IEZBTFNFOwoJCQkJYnJlYWs7CgkJCWNhc2UgTCcuJzoKCQkJY2FzZSBMJywnOgoJCQkJaWYgKCFiRG90KQoJCQkJewoJCQkJCWlmIChiRGlnaXRFeGlzdCkKCQkJCQl7CgkJCQkJCXN3RGlnaXRzICs9IEwnLic7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCXN3RGlnaXRzICs9IEwnMCc7CgkJCQkJCXN3RGlnaXRzICs9IEwnLic7CgkJCQkJCWJEaWdpdEV4aXN0ID0gVFJVRTsKCQkJCQl9CgoJCQkJCWJEb3QgPSBUUlVFOwoJCQkJCWJyZWFrOwoJCQkJfQoJCQljYXNlICdlJzoKCQkJY2FzZSAnRSc6CgkJCQlpZiAoIWJLWEpTKQoJCQkJewoJCQkJCXArKzsKCQkJCQljID0gKnA7CgkJCQkJaWYgKGMgPT0gJysnIHx8IGMgPT0gJy0nKQoJCQkJCXsKCQkJCQkJYktYSlMgPSBUUlVFOwoJCQkJCQlzd0RpZ2l0cyArPSAnZSc7CgkJCQkJCXN3RGlnaXRzICs9IGM7CgkJCQkJfQoJCQkJCWJyZWFrOwoJCQkJfQoJCQljYXNlIEwnLSc6CgkJCQlpZiAoIWJEaWdpdEV4aXN0ICYmICFiU2lnbikKCQkJCXsKCQkJCQlzd0RpZ2l0cyArPSBjOwoJCQkJCWJTaWduID0gVFJVRTsKCQkJCQlicmVhazsKCQkJCX0KCQkJZGVmYXVsdDoKCQkJCWJBbGxEaWdpdHMgPSBGQUxTRTsKCgkJCQlpZiAocCAhPSBwU3RhcnQgJiYgIWJEb3QgJiYgYkRpZ2l0RXhpc3QpCgkJCQl7CgkJCQkJc3dEaWdpdHMgKz0gTCcuJzsKCQkJCQliRG90ID0gVFJVRTsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQliRG90ID0gRkFMU0U7CgkJCQkJYkRpZ2l0RXhpc3QgPSBGQUxTRTsKCQkJCQlzd0RpZ2l0cyA9IEwiIjsKCQkJCX0KCQkJCWJyZWFrOwoJCQl9CgkJfQoKCQlwKys7Cgl9CgoJaWYgKHN3RGlnaXRzLkdldExlbmd0aCgpID4gMCAmJiBzd0RpZ2l0cy5HZXRMZW5ndGgoKSA8IDE3KQoJewoJCUNGWF9CeXRlU3RyaW5nIHNEaWdpdHMgPSBzd0RpZ2l0cy5VVEY4RW5jb2RlKCk7CgoJCWlmIChiS1hKUykKCQl7CgkJCWRSZXQgPSBhdG9mKHNEaWdpdHMpOwoJCX0KCQllbHNlCgkJewoJCQlpZiAoYkRvdCkKCQkJewoJCQkJY2hhciogcFN0b3BTdHJpbmc7CgkJCQlkUmV0ID0gOjpzdHJ0b2Qoc0RpZ2l0cywgJnBTdG9wU3RyaW5nKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCWRSZXQgPSBhdG9sKHNEaWdpdHMpOwoJCQl9CgkJfQoKCX0KCglyZXR1cm4gZFJldDsKfQoKZG91YmxlIENKU19QdWJsaWNNZXRob2RzOjpQYXJzZVN0cmluZ1RvTnVtYmVyKGNvbnN0IEZYX1dDSEFSKiBzd1NvdXJjZSkKewoJRlhfQk9PTCBiQWxsRGlnaXRzID0gRkFMU0U7CglGWF9CT09MIGJEb3QgPSBGQUxTRTsKCUZYX0JPT0wgYlNpZ24gPSBGQUxTRTsKCUZYX0JPT0wgYktYSlMgPSBGQUxTRTsKCglyZXR1cm4gUGFyc2VOdW1iZXIoc3dTb3VyY2UsIGJBbGxEaWdpdHMsIGJEb3QsIGJTaWduLCBiS1hKUyk7Cn0KCkZYX0JPT0wJQ0pTX1B1YmxpY01ldGhvZHM6OkNvbnZlcnRTdHJpbmdUb051bWJlcihjb25zdCBGWF9XQ0hBUiogc3dTb3VyY2UsIGRvdWJsZSAmIGRSZXQsIEZYX0JPT0wgJiBiRG90KQp7CglGWF9CT09MIGJBbGxEaWdpdHMgPSBGQUxTRTsKCUZYX0JPT0wgYlNpZ24gPSBGQUxTRTsKCUZYX0JPT0wgYktYSlMgPSBGQUxTRTsKCglkUmV0ID0gUGFyc2VOdW1iZXIoc3dTb3VyY2UsIGJBbGxEaWdpdHMsIGJEb3QsIGJTaWduLCBiS1hKUyk7CgoJcmV0dXJuIGJBbGxEaWdpdHM7Cn0KCkNKU19BcnJheSBDSlNfUHVibGljTWV0aG9kczo6QUZfTWFrZUFycmF5RnJvbUxpc3Qodjg6Oklzb2xhdGUqIGlzb2xhdGUsIENKU19WYWx1ZSB2YWwpCnsKCUNKU19BcnJheSBTdHJBcnJheShpc29sYXRlKTsKCWlmKHZhbC5Jc0FycmF5T2JqZWN0KCkpCgl7CgkJdmFsLkNvbnZlcnRUb0FycmF5KFN0ckFycmF5KTsKCQlyZXR1cm4gU3RyQXJyYXk7Cgl9CglDRlhfV2lkZVN0cmluZyB3c1N0ciA9IHZhbC5Ub0NGWFdpZGVTdHJpbmcoKTsKCUNGWF9CeXRlU3RyaW5nIHQgPSBDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUod3NTdHIpOwoJY29uc3QgY2hhciAqIHAgPSAoY29uc3QgY2hhciAqKXQ7CgoKCWludCBjaCA9ICcsJyA7CglpbnQgbkluZGV4ID0gMDsKCgl3aGlsZSAoKnApCgl7CgkJY29uc3QgY2hhciAqIHBUZW1wID0gc3RyY2hyKHAsIGNoKTsKCQlpZiAocFRlbXAgPT0gTlVMTCkKCQl7CgkJCVN0ckFycmF5LlNldEVsZW1lbnQobkluZGV4LCBDSlNfVmFsdWUoaXNvbGF0ZSwgU3RyVHJpbShwKS5jX3N0cigpKSk7CgkJCWJyZWFrOwoJCX0KCQllbHNlCgkJewoJCQljaGFyICogcFN1YiA9IG5ldyBjaGFyW3BUZW1wIC0gcCArIDFdOwoJCQlzdHJuY3B5KHBTdWIsIHAsIHBUZW1wIC0gcCk7CgkJCSoocFN1YiArIChwVGVtcCAtIHApKSA9ICdcMCc7CgoJCQlTdHJBcnJheS5TZXRFbGVtZW50KG5JbmRleCwgQ0pTX1ZhbHVlKGlzb2xhdGUsIFN0clRyaW0ocFN1YikuY19zdHIoKSkpOwoJCQlkZWxldGUgW11wU3ViOwoKCQkJbkluZGV4ICsrOwoJCQlwID0gKytwVGVtcDsKCQl9CgoJfQoJcmV0dXJuIFN0ckFycmF5Owp9CgppbnQgQ0pTX1B1YmxpY01ldGhvZHM6OlBhcnNlU3RyaW5nSW50ZWdlcihjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyaW5nLGludCBuU3RhcnQsaW50JiBuU2tpcCwgaW50IG5NYXhTdGVwKQp7CglpbnQgblJldCA9IDA7CgluU2tpcCA9IDA7Cglmb3IgKGludCBpPW5TdGFydCwgc3o9c3RyaW5nLkdldExlbmd0aCgpOyBpIDwgc3o7IGkrKykKCXsKCQlpZiAoaS1uU3RhcnQgPiAxMCkKCQkJYnJlYWs7CgoJCUZYX1dDSEFSIGMgPSBzdHJpbmcuR2V0QXQoaSk7CgkJaWYgKElzRGlnaXQoKHdjaGFyX3QpYykpCgkJewoJCQluUmV0ID0gblJldCAqIDEwICsgKGMgLSAnMCcpOwoJCQluU2tpcCA9IGkgLSBuU3RhcnQgKyAxOwoJCQlpZiAoblNraXAgPj0gbk1heFN0ZXApCgkJCQlicmVhazsKCQl9CgkJZWxzZQoJCQlicmVhazsKCX0KCglyZXR1cm4gblJldDsKfQoKQ0ZYX1dpZGVTdHJpbmcgQ0pTX1B1YmxpY01ldGhvZHM6OlBhcnNlU3RyaW5nU3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJpbmcsIGludCBuU3RhcnQsIGludCYgblNraXApCnsKCUNGWF9XaWRlU3RyaW5nIHN3UmV0OwoJblNraXAgPSAwOwoJZm9yIChpbnQgaT1uU3RhcnQsIHN6PXN0cmluZy5HZXRMZW5ndGgoKTsgaSA8IHN6OyBpKyspCgl7CgkJRlhfV0NIQVIgYyA9IHN0cmluZy5HZXRBdChpKTsKCQlpZiAoKGMgPj0gTCdhJyAmJiBjIDw9IEwneicpIHx8IChjID49IEwnQScgJiYgYyA8PSBMJ1onKSkKCQl7CgkJCXN3UmV0ICs9IGM7CgkJCW5Ta2lwID0gaSAtIG5TdGFydCArIDE7CgkJfQoJCWVsc2UKCQkJYnJlYWs7Cgl9CgoJcmV0dXJuIHN3UmV0Owp9Cgpkb3VibGUgQ0pTX1B1YmxpY01ldGhvZHM6OlBhcnNlTm9ybWFsRGF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmIHZhbHVlLCBGWF9CT09MJiBiV3JvbmdGb3JtYXQpCnsKCWRvdWJsZSBkdCA9IEpTX0dldERhdGVUaW1lKCk7CgoJaW50IG5ZZWFyID0gSlNfR2V0WWVhckZyb21UaW1lKGR0KTsKCWludCBuTW9udGggPSBKU19HZXRNb250aEZyb21UaW1lKGR0KSArIDE7CglpbnQgbkRheSA9IEpTX0dldERheUZyb21UaW1lKGR0KTsKCWludCBuSG91ciA9IEpTX0dldEhvdXJGcm9tVGltZShkdCk7CglpbnQgbk1pbiA9IEpTX0dldE1pbkZyb21UaW1lKGR0KTsKCWludCBuU2VjID0gSlNfR2V0U2VjRnJvbVRpbWUoZHQpOwoKCWludCBudW1iZXJbM107CgoJaW50IG5Ta2lwID0gMDsKCWludCBuTGVuID0gdmFsdWUuR2V0TGVuZ3RoKCk7CglpbnQgbkluZGV4ID0gMDsKCWludCBpID0gMDsKCXdoaWxlIChpIDwgbkxlbikKCXsKCQlpZiAobkluZGV4ID4gMikgYnJlYWs7CgoJCUZYX1dDSEFSIGMgPSB2YWx1ZS5HZXRBdChpKTsKCQlpZiAoSXNEaWdpdCgod2NoYXJfdCljKSkKCQl7CgkJCW51bWJlcltuSW5kZXgrK10gPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGksIG5Ta2lwLCA0KTsKCQkJaSArPSBuU2tpcDsKCQl9CgkJZWxzZQoJCXsKCQkJaSArKzsKCQl9Cgl9CgoJaWYgKG5JbmRleCA9PSAyKQoJewoJCS8vIGNhc2UyOiBtb250aC9kYXkKCQkvLyBjYXNlMzogZGF5L21vbnRoCgkJaWYgKChudW1iZXJbMF0gPj0gMSAmJiBudW1iZXJbMF0gPD0gMTIpICYmIChudW1iZXJbMV0gPj0gMSAmJiBudW1iZXJbMV0gPD0gMzEpKQoJCXsKCQkJbk1vbnRoID0gbnVtYmVyWzBdOwoJCQluRGF5ID0gbnVtYmVyWzFdOwoJCX0KCQllbHNlIGlmICgobnVtYmVyWzBdID49IDEgJiYgbnVtYmVyWzBdIDw9IDMxKSAmJiAobnVtYmVyWzFdID49IDEgJiYgbnVtYmVyWzFdIDw9IDEyKSkKCQl7CgkJCW5EYXkgPSBudW1iZXJbMF07CgkJCW5Nb250aCA9IG51bWJlclsxXTsKCQl9CgoJCWJXcm9uZ0Zvcm1hdCA9IEZBTFNFOwoJfQoJZWxzZSBpZiAobkluZGV4ID09IDMpCgl7CgkJLy8gY2FzZTE6IHllYXIvbW9udGgvZGF5CgkJLy8gY2FzZTI6IG1vbnRoL2RheS95ZWFyCgkJLy8gY2FzZTM6IGRheS9tb250aC95ZWFyCgoJCWlmIChudW1iZXJbMF0gPiAxMiAmJiAobnVtYmVyWzFdID49IDEgJiYgbnVtYmVyWzFdIDw9IDEyKSAmJiAobnVtYmVyWzJdID49IDEgJiYgbnVtYmVyWzJdIDw9IDMxKSkKCQl7CgkJCW5ZZWFyID0gbnVtYmVyWzBdOwoJCQluTW9udGggPSBudW1iZXJbMV07CgkJCW5EYXkgPSBudW1iZXJbMl07CgkJfQoJCWVsc2UgaWYgKChudW1iZXJbMF0gPj0gMSAmJiBudW1iZXJbMF0gPD0gMTIpICYmIChudW1iZXJbMV0gPj0gMSAmJiBudW1iZXJbMV0gPD0gMzEpICYmIG51bWJlclsyXSA+IDMxKQoJCXsKCQkJbk1vbnRoID0gbnVtYmVyWzBdOwoJCQluRGF5ID0gbnVtYmVyWzFdOwoJCQluWWVhciA9IG51bWJlclsyXTsKCQl9CgkJZWxzZSBpZiAoKG51bWJlclswXSA+PSAxICYmIG51bWJlclswXSA8PSAzMSkgJiYgKG51bWJlclsxXSA+PSAxICYmIG51bWJlclsxXSA8PSAxMikgJiYgbnVtYmVyWzJdID4gMzEpCgkJewoJCQluRGF5ID0gbnVtYmVyWzBdOwoJCQluTW9udGggPSBudW1iZXJbMV07CgkJCW5ZZWFyID0gbnVtYmVyWzJdOwoJCX0KCgkJYldyb25nRm9ybWF0ID0gRkFMU0U7Cgl9CgllbHNlCgl7CgkJYldyb25nRm9ybWF0ID0gVFJVRTsKCQlyZXR1cm4gZHQ7Cgl9CgoJQ0ZYX1dpZGVTdHJpbmcgc3dUZW1wOwoJc3dUZW1wLkZvcm1hdChMIiVkLyVkLyVkICVkOiVkOiVkIixuTW9udGgsbkRheSxuWWVhcixuSG91cixuTWluLG5TZWMpOwoJcmV0dXJuIEpTX0RhdGVQYXJzZShzd1RlbXAuY19zdHIoKSk7Cn0KCmRvdWJsZSBDSlNfUHVibGljTWV0aG9kczo6TWFrZVJlZ3VsYXJEYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nICYgdmFsdWUsIGNvbnN0IENGWF9XaWRlU3RyaW5nICYgZm9ybWF0LCBGWF9CT09MJiBiV3JvbmdGb3JtYXQpCnsKCWRvdWJsZSBkdCA9IEpTX0dldERhdGVUaW1lKCk7CgoJaWYgKGZvcm1hdC5Jc0VtcHR5KCkgfHwgdmFsdWUuSXNFbXB0eSgpKQoJCXJldHVybiBkdDsKCglpbnQgblllYXIgPSBKU19HZXRZZWFyRnJvbVRpbWUoZHQpOwoJaW50IG5Nb250aCA9IEpTX0dldE1vbnRoRnJvbVRpbWUoZHQpICsgMTsKCWludCBuRGF5ID0gSlNfR2V0RGF5RnJvbVRpbWUoZHQpOwoJaW50IG5Ib3VyID0gSlNfR2V0SG91ckZyb21UaW1lKGR0KTsKCWludCBuTWluID0gSlNfR2V0TWluRnJvbVRpbWUoZHQpOwoJaW50IG5TZWMgPSBKU19HZXRTZWNGcm9tVGltZShkdCk7CgoJaW50IG5ZZWFyU3ViID0gOTk7IC8vblllYXIgLSAyMDAwOwoKCUZYX0JPT0wgYlBtID0gRkFMU0U7CglGWF9CT09MIGJFeGl0ID0gRkFMU0U7CgliV3JvbmdGb3JtYXQgPSBGQUxTRTsKCglpbnQgaT0wOwoJaW50IGo9MDsKCgl3aGlsZSAoaSA8IGZvcm1hdC5HZXRMZW5ndGgoKSkKCXsKCQlpZiAoYkV4aXQpIGJyZWFrOwoKCQlGWF9XQ0hBUiBjID0gZm9ybWF0LkdldEF0KGkpOwoJCXN3aXRjaCAoYykKCQl7CgkJCWNhc2UgJzonOgoJCQljYXNlICcuJzoKCQkJY2FzZSAnLSc6CgkJCWNhc2UgJ1xcJzoKCQkJY2FzZSAnLyc6CgkJCQlpKys7CgkJCQlqKys7CgkJCQlicmVhazsKCgkJCWNhc2UgJ3knOgoJCQljYXNlICdtJzoKCQkJY2FzZSAnZCc6CgkJCWNhc2UgJ0gnOgoJCQljYXNlICdoJzoKCQkJY2FzZSAnTSc6CgkJCWNhc2UgJ3MnOgoJCQljYXNlICd0JzoKCQkJCXsKCQkJCQlpbnQgb2xkaiA9IGo7CgkJCQkJaW50IG5Ta2lwID0gMDsKCQkJCQlpbnQgcmVtYWluaW5nID0gZm9ybWF0LkdldExlbmd0aCgpIC0gaSAtIDE7CgoJCQkJCWlmIChyZW1haW5pbmcgPT0gMCB8fCBmb3JtYXQuR2V0QXQoaSsxKSAhPSBjKQoJCQkJCXsKCQkJCQkJc3dpdGNoIChjKQoJCQkJCQl7CgkJCQkJCQljYXNlICd5JzoKCQkJCQkJCQlpKys7CgkJCQkJCQkJaisrOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJY2FzZSAnbSc6CgkJCQkJCQkJbk1vbnRoID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7CgkJCQkJCQkJaSsrOwoJCQkJCQkJCWogKz0gblNraXA7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICdkJzoKCQkJCQkJCQluRGF5ID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7CgkJCQkJCQkJaSsrOwoJCQkJCQkJCWogKz0gblNraXA7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICdIJzoKCQkJCQkJCQluSG91ciA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOwoJCQkJCQkJCWkrKzsKCQkJCQkJCQlqICs9IG5Ta2lwOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJY2FzZSAnaCc6CgkJCQkJCQkJbkhvdXIgPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKCQkJCQkJCQlpKys7CgkJCQkJCQkJaiArPSBuU2tpcDsKCQkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgJ00nOgoJCQkJCQkJCW5NaW4gPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKCQkJCQkJCQlpKys7CgkJCQkJCQkJaiArPSBuU2tpcDsKCQkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgJ3MnOgoJCQkJCQkJCW5TZWMgPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKCQkJCQkJCQlpKys7CgkJCQkJCQkJaiArPSBuU2tpcDsKCQkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgJ3QnOgoJCQkJCQkJCWJQbSA9IChqIDwgdmFsdWUuR2V0TGVuZ3RoKCkgJiYgdmFsdWUuR2V0QXQoaikgPT0gJ3AnKTsKCQkJCQkJCQlpKys7CgkJCQkJCQkJaisrOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJfQoJCQkJCWVsc2UgaWYgKHJlbWFpbmluZyA9PSAxIHx8IGZvcm1hdC5HZXRBdChpKzIpICE9IGMpCgkJCQkJewoJCQkJCQlzd2l0Y2ggKGMpCgkJCQkJCXsKCQkJCQkJCWNhc2UgJ3knOgoJCQkJCQkJCW5ZZWFyID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgNCk7CgkJCQkJCQkJaSArPSAyOwoJCQkJCQkJCWogKz0gblNraXA7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICdtJzoKCQkJCQkJCQluTW9udGggPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKCQkJCQkJCQlpICs9IDI7CgkJCQkJCQkJaiArPSBuU2tpcDsKCQkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgJ2QnOgoJCQkJCQkJCW5EYXkgPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKCQkJCQkJCQlpICs9IDI7CgkJCQkJCQkJaiArPSBuU2tpcDsKCQkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgJ0gnOgoJCQkJCQkJCW5Ib3VyID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7CgkJCQkJCQkJaSArPSAyOwoJCQkJCQkJCWogKz0gblNraXA7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICdoJzoKCQkJCQkJCQluSG91ciA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOwoJCQkJCQkJCWkgKz0gMjsKCQkJCQkJCQlqICs9IG5Ta2lwOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJY2FzZSAnTSc6CgkJCQkJCQkJbk1pbiA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOwoJCQkJCQkJCWkgKz0gMjsKCQkJCQkJCQlqICs9IG5Ta2lwOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJY2FzZSAncyc6CgkJCQkJCQkJblNlYyA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOwoJCQkJCQkJCWkgKz0gMjsKCQkJCQkJCQlqICs9IG5Ta2lwOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJY2FzZSAndCc6CgkJCQkJCQkJYlBtID0gKGogKyAxIDwgdmFsdWUuR2V0TGVuZ3RoKCkgJiYgdmFsdWUuR2V0QXQoaikgPT0gJ3AnICYmIHZhbHVlLkdldEF0KGorMSkgPT0gJ20nKTsKCQkJCQkJCQlpICs9IDI7CgkJCQkJCQkJaiArPSAyOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJfQoJCQkJCWVsc2UgaWYgKHJlbWFpbmluZyA9PSAyIHx8IGZvcm1hdC5HZXRBdChpKzMpICE9IGMpCgkJCQkJewoJCQkJCQlzd2l0Y2ggKGMpCgkJCQkJCXsKCQkJCQkJCWNhc2UgJ20nOgoJCQkJCQkJCXsKCQkJCQkJCQkJQ0ZYX1dpZGVTdHJpbmcgc01vbnRoID0gUGFyc2VTdHJpbmdTdHJpbmcodmFsdWUsIGosIG5Ta2lwKTsKCQkJCQkJCQkJRlhfQk9PTCBiRmluZCA9IEZBTFNFOwoJCQkJCQkJCQlmb3IgKGludCBtID0gMDsgbSA8IDEyOyBtKyspCgkJCQkJCQkJCXsKCQkJCQkJCQkJCWlmIChzTW9udGguQ29tcGFyZU5vQ2FzZShtb250aHNbbV0pID09IDApCgkJCQkJCQkJCQl7CgkJCQkJCQkJCQkJbk1vbnRoID0gbSArIDE7CgkJCQkJCQkJCQkJaSs9MzsKCQkJCQkJCQkJCQlqKz1uU2tpcDsKCQkJCQkJCQkJCQliRmluZCA9IFRSVUU7CgkJCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCQl9CgkJCQkJCQkJCX0KCgkJCQkJCQkJCWlmICghYkZpbmQpCgkJCQkJCQkJCXsKCQkJCQkJCQkJCW5Nb250aCA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDMpOwoJCQkJCQkJCQkJaSs9MzsKCQkJCQkJCQkJCWogKz0gblNraXA7CgkJCQkJCQkJCX0KCQkJCQkJCQl9CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICd5JzoKCQkJCQkJCQlicmVhazsKCQkJCQkJCWRlZmF1bHQ6CgkJCQkJCQkJaSs9MzsKCQkJCQkJCQlqKz0zOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJfQoJCQkJCWVsc2UgaWYgKHJlbWFpbmluZyA9PSAzIHx8IGZvcm1hdC5HZXRBdChpKzQpICE9IGMpCgkJCQkJewoJCQkJCQlzd2l0Y2ggKGMpCgkJCQkJCXsKCgoJCQkJCQkJY2FzZSAneSc6CgkJCQkJCQkJblllYXIgPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCA0KTsKCQkJCQkJCQlqICs9IG5Ta2lwOwoJCQkJCQkJCWkgKz0gNDsKCQkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgJ20nOgoJCQkJCQkJCXsKCQkJCQkJCQkJRlhfQk9PTCBiRmluZCA9IEZBTFNFOwoKCQkJCQkJCQkJQ0ZYX1dpZGVTdHJpbmcgc01vbnRoID0gUGFyc2VTdHJpbmdTdHJpbmcodmFsdWUsIGosIG5Ta2lwKTsKCQkJCQkJCQkJc01vbnRoLk1ha2VMb3dlcigpOwoKCQkJCQkJCQkJZm9yIChpbnQgbSA9IDA7IG0gPCAxMjsgbSsrKQoJCQkJCQkJCQl7CgkJCQkJCQkJCQlDRlhfV2lkZVN0cmluZyBzRnVsbE1vbnRocyA9IGZ1bGxtb250aHNbbV07CgkJCQkJCQkJCQlzRnVsbE1vbnRocy5NYWtlTG93ZXIoKTsKCgkJCQkJCQkJCQlpZiAoc0Z1bGxNb250aHMuRmluZChzTW9udGguY19zdHIoKSwgMCkgIT0gLTEpCgkJCQkJCQkJCQl7CgkJCQkJCQkJCQkJbk1vbnRoID0gbSArIDE7CgkJCQkJCQkJCQkJaSArPSA0OwoJCQkJCQkJCQkJCWogKz0gblNraXA7CgkJCQkJCQkJCQkJYkZpbmQgPSBUUlVFOwoJCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQl9CgoJCQkJCQkJCQlpZiAoIWJGaW5kKQoJCQkJCQkJCQl7CgkJCQkJCQkJCQluTW9udGggPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCA0KTsKCQkJCQkJCQkJCWkrPTQ7CgkJCQkJCQkJCQlqICs9IG5Ta2lwOwoJCQkJCQkJCQl9CgkJCQkJCQkJfQoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJZGVmYXVsdDoKCQkJCQkJCQlpICs9IDQ7CgkJCQkJCQkJaiArPSA0OwoJCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCWlmIChqID49IHZhbHVlLkdldExlbmd0aCgpIHx8IGZvcm1hdC5HZXRBdChpKSAhPSB2YWx1ZS5HZXRBdChqKSkKCQkJCQkJewoJCQkJCQkJYldyb25nRm9ybWF0ID0gVFJVRTsKCQkJCQkJCWJFeGl0ID0gVFJVRTsKCQkJCQkJfQoJCQkJCQlpKys7CgkJCQkJCWorKzsKCQkJCQl9CgoJCQkJCWlmIChvbGRqID09IGopCgkJCQkJewoJCQkJCQliV3JvbmdGb3JtYXQgPSBUUlVFOwoJCQkJCQliRXhpdCA9IFRSVUU7CgkJCQkJfQoJCQkJfQoKCQkJCWJyZWFrOwoJCQlkZWZhdWx0OgoJCQkJaWYgKHZhbHVlLkdldExlbmd0aCgpIDw9IGopCgkJCQl7CgkJCQkJYkV4aXQgPSBUUlVFOwoJCQkJfQoJCQkJZWxzZSBpZiAoZm9ybWF0LkdldEF0KGkpICE9IHZhbHVlLkdldEF0KGopKQoJCQkJewoJCQkJCWJXcm9uZ0Zvcm1hdCA9IFRSVUU7CgkJCQkJYkV4aXQgPSBUUlVFOwoJCQkJfQoKCQkJCWkrKzsKCQkJCWorKzsKCQkJCWJyZWFrOwoJCX0KCX0KCglpZiAoYlBtKSBuSG91ciArPSAxMjsKCglpZiAoblllYXIgPj0gMCAmJiBuWWVhciA8PSBuWWVhclN1YikKCQluWWVhciArPSAyMDAwOwoKCWlmIChuTW9udGggPCAxIHx8IG5Nb250aCA+IDEyKQoJCWJXcm9uZ0Zvcm1hdCA9IFRSVUU7CgoJaWYgKG5EYXkgPCAxIHx8IG5EYXkgPiAzMSkKCQliV3JvbmdGb3JtYXQgPSBUUlVFOwoKCWlmIChuSG91ciA8IDAgfHwgbkhvdXIgPiAyNCkKCQliV3JvbmdGb3JtYXQgPSBUUlVFOwoKCWlmIChuTWluIDwgMCB8fCBuTWluID4gNjApCgkJYldyb25nRm9ybWF0ID0gVFJVRTsKCglpZiAoblNlYyA8IDAgfHwgblNlYyA+IDYwKQoJCWJXcm9uZ0Zvcm1hdCA9IFRSVUU7CgoJZG91YmxlIGRSZXQgPSAwOwoKCWlmIChiV3JvbmdGb3JtYXQpCgl7CgkJZFJldCA9IFBhcnNlTm9ybWFsRGF0ZSh2YWx1ZSwgYldyb25nRm9ybWF0KTsKCX0KCWVsc2UKCXsKCQlkUmV0ID0gSlNfTWFrZURhdGUoSlNfTWFrZURheShuWWVhcixuTW9udGggLSAxLG5EYXkpLEpTX01ha2VUaW1lKG5Ib3VyLCBuTWluLCBuU2VjLCAwKSk7CgoJCWlmIChKU19Qb3J0SXNOYW4oZFJldCkpCgkJewoJCQlkUmV0ID0gSlNfRGF0ZVBhcnNlKHZhbHVlLmNfc3RyKCkpOwoJCX0KCX0KCglpZiAoSlNfUG9ydElzTmFuKGRSZXQpKQoJewoJCWRSZXQgPSBQYXJzZU5vcm1hbERhdGUodmFsdWUsIGJXcm9uZ0Zvcm1hdCk7Cgl9CgoJcmV0dXJuIGRSZXQ7Cgp9CgpDRlhfV2lkZVN0cmluZyBDSlNfUHVibGljTWV0aG9kczo6TWFrZUZvcm1hdERhdGUoZG91YmxlIGREYXRlLCBjb25zdCBDRlhfV2lkZVN0cmluZyAmIGZvcm1hdCkKewoJQ0ZYX1dpZGVTdHJpbmcgc1JldCA9IEwiIixzUGFydCA9IEwiIjsKCglpbnQgblllYXIgPSBKU19HZXRZZWFyRnJvbVRpbWUoZERhdGUpOwoJaW50IG5Nb250aCA9IEpTX0dldE1vbnRoRnJvbVRpbWUoZERhdGUpICsgMTsKCWludCBuRGF5ID0gSlNfR2V0RGF5RnJvbVRpbWUoZERhdGUpOwoJaW50IG5Ib3VyID0gSlNfR2V0SG91ckZyb21UaW1lKGREYXRlKTsKCWludCBuTWluID0gSlNfR2V0TWluRnJvbVRpbWUoZERhdGUpOwoJaW50IG5TZWMgPSBKU19HZXRTZWNGcm9tVGltZShkRGF0ZSk7CgoJaW50IGkgPSAwOwoJd2hpbGUgKGkgPCBmb3JtYXQuR2V0TGVuZ3RoKCkpCgl7CgkgICAgICAgIEZYX1dDSEFSIGMgPSBmb3JtYXQuR2V0QXQoaSk7CiAgICAgICAgICAgICAgICBpbnQgcmVtYWluaW5nID0gZm9ybWF0LkdldExlbmd0aCgpIC0gaSAtIDE7CgkJc1BhcnQgPSBMIiI7CgkJc3dpdGNoIChjKQoJCXsKCQkJY2FzZSAneSc6CgkJCWNhc2UgJ20nOgoJCQljYXNlICdkJzoKCQkJY2FzZSAnSCc6CgkJCWNhc2UgJ2gnOgoJCQljYXNlICdNJzoKCQkJY2FzZSAncyc6CgkJCWNhc2UgJ3QnOgoJCQkJaWYgKHJlbWFpbmluZyA9PSAwIHx8IGZvcm1hdC5HZXRBdChpKzEpICE9IGMpCgkJCQl7CgkJCQkJc3dpdGNoIChjKQoJCQkJCXsKCQkJCQkJY2FzZSAneSc6CgkJCQkJCQlzUGFydCArPSBjOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJ20nOgoJCQkJCQkJc1BhcnQuRm9ybWF0KEwiJWQiLG5Nb250aCk7CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAnZCc6CgkJCQkJCQlzUGFydC5Gb3JtYXQoTCIlZCIsbkRheSk7CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAnSCc6CgkJCQkJCQlzUGFydC5Gb3JtYXQoTCIlZCIsbkhvdXIpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJ2gnOgoJCQkJCQkJc1BhcnQuRm9ybWF0KEwiJWQiLG5Ib3VyPjEyP25Ib3VyIC0gMTI6bkhvdXIpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJ00nOgoJCQkJCQkJc1BhcnQuRm9ybWF0KEwiJWQiLG5NaW4pOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJ3MnOgoJCQkJCQkJc1BhcnQuRm9ybWF0KEwiJWQiLG5TZWMpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJ3QnOgoJCQkJCQkJc1BhcnQgKz0gbkhvdXI+MTI/J3AnOidhJzsKCQkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCQlpKys7CgkJCQl9CgkJCQllbHNlIGlmIChyZW1haW5pbmcgPT0gMSB8fCBmb3JtYXQuR2V0QXQoaSsyKSAhPSBjKQoJCQkJewoJCQkJCXN3aXRjaCAoYykKCQkJCQl7CgkJCQkJCWNhc2UgJ3knOgoJCQkJCQkJc1BhcnQuRm9ybWF0KEwiJTAyZCIsblllYXIgLSAoblllYXIgLyAxMDApICogMTAwKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICdtJzoKCQkJCQkJCXNQYXJ0LkZvcm1hdChMIiUwMmQiLG5Nb250aCk7CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAnZCc6CgkJCQkJCQlzUGFydC5Gb3JtYXQoTCIlMDJkIixuRGF5KTsKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICdIJzoKCQkJCQkJCXNQYXJ0LkZvcm1hdChMIiUwMmQiLG5Ib3VyKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICdoJzoKCQkJCQkJCXNQYXJ0LkZvcm1hdChMIiUwMmQiLG5Ib3VyPjEyP25Ib3VyIC0gMTI6bkhvdXIpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJ00nOgoJCQkJCQkJc1BhcnQuRm9ybWF0KEwiJTAyZCIsbk1pbik7CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAncyc6CgkJCQkJCQlzUGFydC5Gb3JtYXQoTCIlMDJkIixuU2VjKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICd0JzoKCQkJCQkJCXNQYXJ0ID0gbkhvdXI+MTI/IEwicG0iOiBMImFtIjsKCQkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCQlpKz0yOwoJCQkJfQoJCQkJZWxzZSBpZiAocmVtYWluaW5nID09IDIgfHwgZm9ybWF0LkdldEF0KGkrMykgIT0gYykKCQkJCXsKCQkJCQlzd2l0Y2ggKGMpCgkJCQkJewoJCQkJCQljYXNlICdtJzoKCQkJCQkJCWkrPTM7CgkJCQkJCQlpZiAobk1vbnRoID4gMCYmbk1vbnRoIDw9IDEyKQoJCQkJCQkJCXNQYXJ0ICs9IG1vbnRoc1tuTW9udGggLSAxXTsKCQkJCQkJCWJyZWFrOwoJCQkJCQlkZWZhdWx0OgoJCQkJCQkJaSs9MzsKCQkJCQkJCXNQYXJ0ICs9IGM7CgkJCQkJCQlzUGFydCArPSBjOwoJCQkJCQkJc1BhcnQgKz0gYzsKCQkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCQkJCWVsc2UgaWYgKHJlbWFpbmluZyA9PSAzIHx8IGZvcm1hdC5HZXRBdChpKzQpICE9IGMpCgkJCQl7CgkJCQkJc3dpdGNoIChjKQoJCQkJCXsKCQkJCQkJY2FzZSAneSc6CgkJCQkJCQlzUGFydC5Gb3JtYXQoTCIlMDRkIixuWWVhcik7CgkJCQkJCQlpICs9IDQ7CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAnbSc6CgkJCQkJCQlpKz00OwoJCQkJCQkJaWYgKG5Nb250aCA+IDAmJm5Nb250aCA8PSAxMikKCQkJCQkJCQlzUGFydCArPSBmdWxsbW9udGhzW25Nb250aCAtIDFdOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWRlZmF1bHQ6CgkJCQkJCQlpICs9IDQ7CgkJCQkJCQlzUGFydCArPSBjOwoJCQkJCQkJc1BhcnQgKz0gYzsKCQkJCQkJCXNQYXJ0ICs9IGM7CgkJCQkJCQlzUGFydCArPSBjOwoJCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCWkrKzsKCQkJCQlzUGFydCArPSBjOwoJCQkJfQoJCQkJYnJlYWs7CgkJCWRlZmF1bHQ6CgkJCQlpKys7CgkJCQlzUGFydCArPSBjOwoJCQkJYnJlYWs7CgkJfQoKCQlzUmV0ICs9IHNQYXJ0OwoJfQoKCXJldHVybiBzUmV0Owp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLy9mdW5jdGlvbiBBRk51bWJlcl9Gb3JtYXQobkRlYywgc2VwU3R5bGUsIG5lZ1N0eWxlLCBjdXJyU3R5bGUsIHN0ckN1cnJlbmN5LCBiQ3VycmVuY3lQcmVwZW5kKQpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRk51bWJlcl9Gb3JtYXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKewojaWYgX0ZYX09TXyAhPSBfRlhfQU5EUk9JRF8KCXY4OjpJc29sYXRlKiBpc29sYXRlID0gOjpHZXRJc29sYXRlKGNjKTsKCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwoJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwoJQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOwoJQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKCglpZiAocGFyYW1zLnNpemUoKSAhPSA2KQoJewoJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CgkJcmV0dXJuIEZBTFNFOwoJfQoJaWYoIXBFdmVudC0+bV9wVmFsdWUpCgkJcmV0dXJuIEZBTFNFOwoJQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlID0gcEV2ZW50LT5WYWx1ZSgpOwoJQ0ZYX0J5dGVTdHJpbmcgc3RyVmFsdWUgPSBTdHJUcmltKENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShWYWx1ZSkpOwoKCWlmIChzdHJWYWx1ZS5Jc0VtcHR5KCkpIHJldHVybiBUUlVFOwoKCWludCBpRGVjID0gcGFyYW1zWzBdLlRvSW50KCk7CglpbnQgaVNlcFN0eWxlID0gcGFyYW1zWzFdLlRvSW50KCk7CglpbnQgaU5lZ1N0eWxlID0gcGFyYW1zWzJdLlRvSW50KCk7CgkvLyBwYXJhbXNbM10gaXMgaUN1cnJTdHlsZSwgaXQncyBub3QgdXNlZC4KCXN0ZDo6d3N0cmluZyB3c3RyQ3VycmVuY3kocGFyYW1zWzRdLlRvQ0ZYV2lkZVN0cmluZygpLmNfc3RyKCkpOwoJRlhfQk9PTCBiQ3VycmVuY3lQcmVwZW5kID0gcGFyYW1zWzVdLlRvQm9vbCgpOwoKCWlmIChpRGVjIDwgMCkgaURlYyA9IC1pRGVjOwoKCWlmIChpU2VwU3R5bGUgPCAwIHx8IGlTZXBTdHlsZSA+IDMpCgkJaVNlcFN0eWxlID0gMDsKCglpZiAoaU5lZ1N0eWxlIDwgMCB8fCBpTmVnU3R5bGUgPiAzKQoJCWlOZWdTdHlsZSA9IDA7CgoKCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoJLy9mb3IgcHJvY2Vzc2luZyBkZWNpbWFsIHBsYWNlcwoJc3RyVmFsdWUuUmVwbGFjZSgiLCIsICIuIik7Cglkb3VibGUgZFZhbHVlID0gYXRvZihzdHJWYWx1ZSk7CglpZiAoaURlYyA+IDApCgkJZFZhbHVlICs9IERPVUJMRV9DT1JSRUNUOwoKCWludCBpRGVjMjsKCUZYX0JPT0wgYk5lZ2F0aXZlID0gRkFMU0U7CgoJc3RyVmFsdWUgPSBmY3Z0KGRWYWx1ZSxpRGVjLCZpRGVjMiwmYk5lZ2F0aXZlKTsKCWlmIChzdHJWYWx1ZS5Jc0VtcHR5KCkpCgl7CgkJZFZhbHVlID0gMDsKCQlzdHJWYWx1ZSA9IGZjdnQoZFZhbHVlLGlEZWMsJmlEZWMyLCZiTmVnYXRpdmUpOwoJCWlmIChzdHJWYWx1ZS5Jc0VtcHR5KCkpCgkJewoJCQlzdHJWYWx1ZSA9ICIwIjsKCQkJaURlYzIgPSAxOwoJCX0KCgl9CgoJaWYgKGlEZWMyIDwgMCkKCXsKCQlmb3IgKGludCBpTnVtID0gMDtpTnVtIDwgYWJzKGlEZWMyKTtpTnVtKyspCgkJewoJCQlzdHJWYWx1ZSA9ICIwIiArIHN0clZhbHVlOwoJCX0KCQlpRGVjMiA9IDA7CgoJfQoJaW50IGlNYXggPSBzdHJWYWx1ZS5HZXRMZW5ndGgoKTsKCWlmIChpRGVjMiA+IGlNYXgpCgl7CgkJZm9yIChpbnQgaU51bSA9IDA7aU51bSA8PSBpRGVjMiAtIGlNYXggO2lOdW0rKykKCQl7CgkJCXN0clZhbHVlICs9ICIwIjsKCQl9CgkJaU1heCA9IGlEZWMyKzE7Cgl9CgkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAvL2ZvciBwcm9jZXNzaW5nIHNlcGVyYXRvciBzdHlsZQoJaWYgKGlEZWMyIDwgaU1heCkKCXsKCQlpZiAoaVNlcFN0eWxlID09IDAgfHwgaVNlcFN0eWxlID09IDEpCgkJewoJCQlzdHJWYWx1ZS5JbnNlcnQoaURlYzIsICcuJyk7CgkJCWlNYXgrKzsKCQl9CgkJZWxzZSBpZiAoaVNlcFN0eWxlID09IDIgfHwgaVNlcFN0eWxlID09IDMpCgkJewoJCQlzdHJWYWx1ZS5JbnNlcnQoaURlYzIsICcsJyk7CgkJCWlNYXgrKzsKCQl9CgoJCWlmIChpRGVjMiA9PSAwKQoJCQlzdHJWYWx1ZS5JbnNlcnQoaURlYzIsICcwJyk7Cgl9CglpZiAoaVNlcFN0eWxlID09IDAgfHwgaVNlcFN0eWxlID09IDIpCgl7CgkJY2hhciBjU2VwZXJhdG9yOwoJCWlmIChpU2VwU3R5bGUgPT0gMCkKCQkJY1NlcGVyYXRvciA9ICcsJzsKCQllbHNlCgkJCWNTZXBlcmF0b3IgPSAnLic7CgoJCWludCBpRGVjUG9zaXRpdmU7CgkJaURlY1Bvc2l0aXZlID0gaURlYzI7CgoJCWZvciAoaURlY1Bvc2l0aXZlID0gaURlYzIgLTM7IGlEZWNQb3NpdGl2ZSA+IDA7aURlY1Bvc2l0aXZlIC09IDMpCgkJewoJCQlzdHJWYWx1ZS5JbnNlcnQoaURlY1Bvc2l0aXZlLCBjU2VwZXJhdG9yKTsKCQkJaU1heCsrOwoJCX0KCX0KCgkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAvL2ZvciBwcm9jZXNzaW5nIGN1cnJlbmN5IHN0cmluZwoKCVZhbHVlID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChzdHJWYWx1ZSk7CglzdGQ6OndzdHJpbmcgc3RyVmFsdWUyID0gVmFsdWUuY19zdHIoKTsKCglpZiAoYkN1cnJlbmN5UHJlcGVuZCkKCQlzdHJWYWx1ZTIgPSB3c3RyQ3VycmVuY3kgKyBzdHJWYWx1ZTI7CgllbHNlCgkJc3RyVmFsdWUyID0gc3RyVmFsdWUyICsgd3N0ckN1cnJlbmN5OwoKCgoJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoJLy9mb3IgcHJvY2Vzc2luZyBuZWdhdGl2ZSBzdHlsZQoJaWYgKGJOZWdhdGl2ZSkKCXsKCQlpZiAoaU5lZ1N0eWxlID09IDApCgkJewoJCQlzdHJWYWx1ZTIuaW5zZXJ0KDAsTCItIik7CgkJfQoJCWlmIChpTmVnU3R5bGUgPT0gMiB8fCBpTmVnU3R5bGUgPT0gMykKCQl7CgkJCXN0clZhbHVlMi5pbnNlcnQoMCxMIigiKTsKCQkJc3RyVmFsdWUyLmluc2VydChzdHJWYWx1ZTIubGVuZ3RoKCksTCIpIik7CgkJfQoJCWlmIChpTmVnU3R5bGUgPT0gMSB8fCBpTmVnU3R5bGUgPT0gMykKCQl7CgkJCWlmIChGaWVsZCAqIGZUYXJnZXQgPSBwRXZlbnQtPlRhcmdldF9GaWVsZCgpKQoJCQl7CgkJCQlDSlNfQXJyYXkgYXJDb2xvcihpc29sYXRlKTsKCQkJCUNKU19WYWx1ZSB2Q29sRWxtKGlzb2xhdGUpOwoJCQkJdkNvbEVsbSA9IEwiUkdCIjsKCQkJCWFyQ29sb3IuU2V0RWxlbWVudCgwLHZDb2xFbG0pOwoJCQkJdkNvbEVsbSA9IDE7CgkJCQlhckNvbG9yLlNldEVsZW1lbnQoMSx2Q29sRWxtKTsKCQkJCXZDb2xFbG0gPSAwOwoJCQkJYXJDb2xvci5TZXRFbGVtZW50KDIsdkNvbEVsbSk7CgoJCQkJYXJDb2xvci5TZXRFbGVtZW50KDMsdkNvbEVsbSk7CgoJCQkJQ0pTX1Byb3BWYWx1ZSB2UHJvcChpc29sYXRlKTsKCQkJCXZQcm9wLlN0YXJ0R2V0dGluZygpOwoJCQkJdlByb3A8PGFyQ29sb3I7CgkJCQl2UHJvcC5TdGFydFNldHRpbmcoKTsKCQkJCWZUYXJnZXQtPnRleHRDb2xvcihjYyx2UHJvcCxzRXJyb3IpOy8vIHJlZAoJCQl9CgkJfQoJfQoJZWxzZQoJewoJCWlmIChpTmVnU3R5bGUgPT0gMSB8fCBpTmVnU3R5bGUgPT0gMykKCQl7CgkJCWlmIChGaWVsZCAqZlRhcmdldCA9IHBFdmVudC0+VGFyZ2V0X0ZpZWxkKCkpCgkJCXsKCQkJCUNKU19BcnJheSBhckNvbG9yKGlzb2xhdGUpOwoJCQkJQ0pTX1ZhbHVlIHZDb2xFbG0oaXNvbGF0ZSk7CgkJCQl2Q29sRWxtID0gTCJSR0IiOwoJCQkJYXJDb2xvci5TZXRFbGVtZW50KDAsdkNvbEVsbSk7CgkJCQl2Q29sRWxtID0gMDsKCQkJCWFyQ29sb3IuU2V0RWxlbWVudCgxLHZDb2xFbG0pOwoJCQkJYXJDb2xvci5TZXRFbGVtZW50KDIsdkNvbEVsbSk7CgkJCQlhckNvbG9yLlNldEVsZW1lbnQoMyx2Q29sRWxtKTsKCgkJCQlDSlNfUHJvcFZhbHVlIHZQcm9wKGlzb2xhdGUpOwoJCQkJdlByb3AuU3RhcnRHZXR0aW5nKCk7CgkJCQlmVGFyZ2V0LT50ZXh0Q29sb3IoY2MsdlByb3Asc0Vycm9yKTsKCgkJCQlDSlNfQXJyYXkgYVByb3AoaXNvbGF0ZSk7CgkJCQl2UHJvcC5Db252ZXJ0VG9BcnJheShhUHJvcCk7CgoJCQkJQ1BXTF9Db2xvciBjclByb3A7CgkJCQlDUFdMX0NvbG9yIGNyQ29sb3I7CgkJCQljb2xvcjo6Q29udmVydEFycmF5VG9QV0xDb2xvcihhUHJvcCwgY3JQcm9wKTsKCQkJCWNvbG9yOjpDb252ZXJ0QXJyYXlUb1BXTENvbG9yKGFyQ29sb3IsIGNyQ29sb3IpOwoKCQkJCWlmIChjckNvbG9yICE9IGNyUHJvcCkKCQkJCXsKCQkJCQlDSlNfUHJvcFZhbHVlIHZQcm9wMihpc29sYXRlKTsKCQkJCQl2UHJvcDIuU3RhcnRHZXR0aW5nKCk7CgkJCQkJdlByb3AyPDxhckNvbG9yOwoJCQkJCXZQcm9wMi5TdGFydFNldHRpbmcoKTsKICAgICAJCQkJZlRhcmdldC0+dGV4dENvbG9yKGNjLHZQcm9wMixzRXJyb3IpOwoJCQkJfQoJCQl9CgkJfQoJfQoJVmFsdWUgPSBzdHJWYWx1ZTIuY19zdHIoKTsKI2VuZGlmCglyZXR1cm4gVFJVRTsKfQoKLy9mdW5jdGlvbiBBRk51bWJlcl9LZXlzdHJva2UobkRlYywgc2VwU3R5bGUsIG5lZ1N0eWxlLCBjdXJyU3R5bGUsIHN0ckN1cnJlbmN5LCBiQ3VycmVuY3lQcmVwZW5kKQpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRk51bWJlcl9LZXlzdHJva2UoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKewoJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7CglBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CglDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7CglBU1NFUlQocEV2ZW50ICE9IE5VTEwpOwoKCWlmKHBhcmFtcy5zaXplKCkgPCAyKQoJCXJldHVybiBGQUxTRTsKCWludCBpU2VwU3R5bGUgPSBwYXJhbXNbMV0uVG9JbnQoKTsKCglpZiAoaVNlcFN0eWxlIDwgMCB8fCBpU2VwU3R5bGUgPiAzKQoJCWlTZXBTdHlsZSA9IDA7CglpZighcEV2ZW50LT5tX3BWYWx1ZSkKCQlyZXR1cm4gRkFMU0U7CglDRlhfV2lkZVN0cmluZyAmIHZhbCA9IHBFdmVudC0+VmFsdWUoKTsKCUNGWF9XaWRlU3RyaW5nICYgd19zdHJDaGFuZ2UgPSBwRXZlbnQtPkNoYW5nZSgpOwogICAgQ0ZYX1dpZGVTdHJpbmcgd19zdHJWYWx1ZSA9IHZhbDsKCglpZiAocEV2ZW50LT5XaWxsQ29tbWl0KCkpCgl7CgkJQ0ZYX1dpZGVTdHJpbmcgd3N0ckNoYW5nZSA9IHdfc3RyQ2hhbmdlOwoJCUNGWF9XaWRlU3RyaW5nIHdzdHJWYWx1ZSA9IFN0ckxUcmltKHdfc3RyVmFsdWUuY19zdHIoKSk7CgkJaWYgKHdzdHJWYWx1ZS5Jc0VtcHR5KCkpCgkJCXJldHVybiBUUlVFOwoKCQlDRlhfV2lkZVN0cmluZyBzd1RlbXAgPSB3c3RyVmFsdWU7CgkJc3dUZW1wLlJlcGxhY2UoTCIsIiwgTCIuIik7CgkJaWYgKCFJc051bWJlcihzd1RlbXAuY19zdHIoKSkpCgkJewoJCQlwRXZlbnQtPlJjKCkgPSBGQUxTRTsKCQkJc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNBRk5VTUJFUl9LRVlTVFJPS0UpOwoJCQlBbGVydChwQ29udGV4dCwgc0Vycm9yLmNfc3RyKCkpOwoJCQlyZXR1cm4gVFJVRTsKCQl9CgkJcmV0dXJuIFRSVUU7IC8vIGl0IGhhcHBlbnMgYWZ0ZXIgdGhlIGxhc3Qga2V5c3Ryb2tlIGFuZCBiZWZvcmUgdmFsaWRhdGluZywKCX0KCglzdGQ6OndzdHJpbmcgd19zdHJWYWx1ZTIgPSB3X3N0clZhbHVlLmNfc3RyKCk7CglzdGQ6OndzdHJpbmcgd19zdHJDaGFuZ2UyID0gd19zdHJDaGFuZ2UuY19zdHIoKTsKCXN0ZDo6d3N0cmluZyB3X3N0clNlbGVjdGVkOwoJaWYoLTEgIT0gcEV2ZW50LT5TZWxTdGFydCgpKQoJCXdfc3RyU2VsZWN0ZWQgPSB3X3N0clZhbHVlMi5zdWJzdHIocEV2ZW50LT5TZWxTdGFydCgpLChwRXZlbnQtPlNlbEVuZCgpIC0gcEV2ZW50LT5TZWxTdGFydCgpKSk7CglGWF9CT09MIGJIYXNTaWduID0gKHdfc3RyVmFsdWUyLmZpbmQoJy0nKSAhPSAtMSkgJiYgKHdfc3RyU2VsZWN0ZWQuZmluZCgnLScpID09IC0xKTsKCWlmIChiSGFzU2lnbikKCXsKCQkvL2Nhbid0IGluc2VydCAiY2hhbmdlIiBpbiBmcm9udCB0byBzaWduIHBvc3Rpb24uCgkJaWYgKHBFdmVudC0+U2VsU3RhcnQoKSA9PSAwKQoJCXsKICAgICAgICAgICAgRlhfQk9PTCAmYlJjID0gcEV2ZW50LT5SYygpOwoJCQliUmMgPSBGQUxTRTsKCQkJcmV0dXJuIFRSVUU7CgkJfQoJfQoKCWNoYXIgY1NlcCA9IEwnLic7CgoJc3dpdGNoIChpU2VwU3R5bGUpCgl7CgljYXNlIDA6CgljYXNlIDE6CgkJY1NlcCA9IEwnLic7CgkJYnJlYWs7CgljYXNlIDI6CgljYXNlIDM6CgkJY1NlcCA9IEwnLCc7CgkJYnJlYWs7Cgl9CgoJRlhfQk9PTCBiSGFzU2VwID0gKHdfc3RyVmFsdWUyLmZpbmQoY1NlcCkgIT0gLTEpOwoJZm9yIChzdGQ6OndzdHJpbmc6Oml0ZXJhdG9yIGl0ID0gd19zdHJDaGFuZ2UyLmJlZ2luKCk7IGl0ICE9IHdfc3RyQ2hhbmdlMi5lbmQoKTsgaXQrKykKCXsKCQlpZiAoKml0ID09IGNTZXApCgkJewoJCQlpZiAoYkhhc1NlcCkKCQkJewoJCQkJRlhfQk9PTCAmYlJjID0gcEV2ZW50LT5SYygpOwoJCQkJYlJjID0gRkFMU0U7CgkJCQlyZXR1cm4gVFJVRTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCWJIYXNTZXAgPSBUUlVFOwoJCQkJY29udGludWU7CgkJCX0KCQl9CgkJaWYgKCppdCA9PSBMJy0nKQoJCXsKCQkJaWYgKGJIYXNTaWduKQoJCQl7CgkJCQlGWF9CT09MICZiUmMgPSBwRXZlbnQtPlJjKCk7CgkJCQliUmMgPSBGQUxTRTsKCQkJCXJldHVybiBUUlVFOwoJCQl9CgkJCWVsc2UgaWYgKGl0ICE9IHdfc3RyQ2hhbmdlMi5iZWdpbigpKSAvL3NpZ24ncyBwb3NpdGlvbiBpcyBub3QgY29ycmVjdAoJCQl7CgkJCQlGWF9CT09MICZiUmMgPSBwRXZlbnQtPlJjKCk7CgkJCQliUmMgPSBGQUxTRTsKCQkJCXJldHVybiBUUlVFOwoJCQl9CgkJCWVsc2UgaWYgKHBFdmVudC0+U2VsU3RhcnQoKSAhPSAwKQoJCQl7CgkJCQlGWF9CT09MICZiUmMgPSBwRXZlbnQtPlJjKCk7CgkJCQliUmMgPSBGQUxTRTsKCQkJCXJldHVybiBUUlVFOwoJCQl9CgkJCWJIYXNTaWduID0gVFJVRTsKCQkJY29udGludWU7CgkJfQoKCQlpZiAoIUlzRGlnaXQoKml0KSkKCQl7CgkJCUZYX0JPT0wgJmJSYyA9IHBFdmVudC0+UmMoKTsKCQkJYlJjID0gRkFMU0U7CgkJCXJldHVybiBUUlVFOwoJCX0KCX0KCgoJc3RkOjp3c3RyaW5nIHdfcHJlZml4ID0gd19zdHJWYWx1ZTIuc3Vic3RyKDAscEV2ZW50LT5TZWxTdGFydCgpKTsKCXN0ZDo6d3N0cmluZyB3X3Bvc3RmaXg7CglpZiAocEV2ZW50LT5TZWxFbmQoKTwoaW50KXdfc3RyVmFsdWUyLmxlbmd0aCgpKQoJCXdfcG9zdGZpeCAgPSB3X3N0clZhbHVlMi5zdWJzdHIocEV2ZW50LT5TZWxFbmQoKSk7Cgl3X3N0clZhbHVlMiA9IHdfcHJlZml4ICsgd19zdHJDaGFuZ2UyICsgd19wb3N0Zml4OwoJd19zdHJWYWx1ZSA9IHdfc3RyVmFsdWUyLmNfc3RyKCk7Cgl2YWwgPSB3X3N0clZhbHVlOwoJcmV0dXJuIFRSVUU7Cgp9CgovL2Z1bmN0aW9uIEFGUGVyY2VudF9Gb3JtYXQobkRlYywgc2VwU3R5bGUpCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGUGVyY2VudF9Gb3JtYXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKewojaWYgX0ZYX09TXyAhPSBfRlhfQU5EUk9JRF8KCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwoJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwoJQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOwoJQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKCiAgICBpZiAocGFyYW1zLnNpemUoKSAhPSAyKQoJewoJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CgkJcmV0dXJuIEZBTFNFOwoJfQoJaWYoIXBFdmVudC0+bV9wVmFsdWUpCgkJcmV0dXJuIEZBTFNFOwoKCUNGWF9XaWRlU3RyaW5nJiBWYWx1ZSA9IHBFdmVudC0+VmFsdWUoKTsKCUNGWF9CeXRlU3RyaW5nIHN0clZhbHVlID0gU3RyVHJpbShDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUoVmFsdWUpKTsKCWlmIChzdHJWYWx1ZS5Jc0VtcHR5KCkpCgkJcmV0dXJuIFRSVUU7CgoJaW50IGlEZWMgPSBwYXJhbXNbMF0uVG9JbnQoKTsKCWlmIChpRGVjIDwgMCkKCQlpRGVjID0gLWlEZWM7CgoJaW50IGlTZXBTdHlsZSA9IHBhcmFtc1sxXS5Ub0ludCgpOwoJaWYgKGlTZXBTdHlsZSA8IDAgfHwgaVNlcFN0eWxlID4gMykKCQlpU2VwU3R5bGUgPSAwOwoKCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoJLy9mb3IgcHJvY2Vzc2luZyBkZWNpbWFsIHBsYWNlcwoJZG91YmxlIGRWYWx1ZSA9IGF0b2Yoc3RyVmFsdWUpOwoJZFZhbHVlICo9IDEwMDsKCWlmIChpRGVjID4gMCkKCQlkVmFsdWUgKz0gRE9VQkxFX0NPUlJFQ1Q7Ly/Qo9X9CgoJaW50IGlEZWMyOwoJRlhfQk9PTCBiTmVnYXRpdmUgPSBGQUxTRTsKCXN0clZhbHVlID0gZmN2dChkVmFsdWUsaURlYywmaURlYzIsJmJOZWdhdGl2ZSk7CiAgICBpZiAoc3RyVmFsdWUuSXNFbXB0eSgpKQoJewoJCWRWYWx1ZSA9IDA7CgkJc3RyVmFsdWUgPSBmY3Z0KGRWYWx1ZSxpRGVjLCZpRGVjMiwmYk5lZ2F0aXZlKTsKCX0KCglpZiAoaURlYzIgPCAwKQoJewoJCWZvciAoaW50IGlOdW0gPSAwOyBpTnVtIDwgYWJzKGlEZWMyKTsgaU51bSsrKQoJCXsKCQkJc3RyVmFsdWUgPSAiMCIgKyBzdHJWYWx1ZTsKCQl9CgkJaURlYzIgPSAwOwoKCX0KCWludCBpTWF4ID0gc3RyVmFsdWUuR2V0TGVuZ3RoKCk7CglpZiAoaURlYzIgPiBpTWF4KQoJewoJCWZvciAoaW50IGlOdW0gPSAwOyBpTnVtIDw9IGlEZWMyIC0gaU1heDsgaU51bSsrKQoJCXsKCQkJc3RyVmFsdWUgKz0gIjAiOwoJCX0KCQlpTWF4ID0gaURlYzIrMTsKCX0KCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vZm9yIHByb2Nlc3Npbmcgc2VwZXJhdG9yIHN0eWxlCglpZiAoaURlYzIgPCBpTWF4KQoJewoJCWlmIChpU2VwU3R5bGUgPT0gMCB8fCBpU2VwU3R5bGUgPT0gMSkKCQl7CgkJCXN0clZhbHVlLkluc2VydChpRGVjMiwgJy4nKTsKCQkJaU1heCsrOwoJCX0KCQllbHNlIGlmIChpU2VwU3R5bGUgPT0gMiB8fCBpU2VwU3R5bGUgPT0gMykKCQl7CgkJCXN0clZhbHVlLkluc2VydChpRGVjMiwgJywnKTsKCQkJaU1heCsrOwoJCX0KCgkJaWYgKGlEZWMyID09IDApCgkJCXN0clZhbHVlLkluc2VydChpRGVjMiwgJzAnKTsKCX0KCWlmIChpU2VwU3R5bGUgPT0gMCB8fCBpU2VwU3R5bGUgPT0gMikKCXsKCQljaGFyIGNTZXBlcmF0b3I7CgkJaWYgKGlTZXBTdHlsZSA9PSAwKQoJCQljU2VwZXJhdG9yID0gJywnOwoJCWVsc2UKCQkJY1NlcGVyYXRvciA9ICcuJzsKCgkJaW50IGlEZWNQb3NpdGl2ZTsKCQlpRGVjUG9zaXRpdmUgPSBpRGVjMjsKCgkJZm9yIChpRGVjUG9zaXRpdmUgPSBpRGVjMiAtMzsgaURlY1Bvc2l0aXZlID4gMDsgaURlY1Bvc2l0aXZlIC09IDMpCgkJewoJCQlzdHJWYWx1ZS5JbnNlcnQoaURlY1Bvc2l0aXZlLGNTZXBlcmF0b3IpOwoJCQlpTWF4Kys7CgkJfQoJfQoJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCS8vbmVnYXRpdmUgbWFyawoJaWYoYk5lZ2F0aXZlKQoJCXN0clZhbHVlID0gIi0iICsgc3RyVmFsdWU7CglzdHJWYWx1ZSArPSAiJSI7CglWYWx1ZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoc3RyVmFsdWUpOwojZW5kaWYKCXJldHVybiBUUlVFOwp9Ci8vQUZQZXJjZW50X0tleXN0cm9rZShuRGVjLCBzZXBTdHlsZSkKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZQZXJjZW50X0tleXN0cm9rZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQp7CglyZXR1cm4gQUZOdW1iZXJfS2V5c3Ryb2tlKGNjLHBhcmFtcyx2UmV0LHNFcnJvcik7Cn0KCi8vZnVuY3Rpb24gQUZEYXRlX0Zvcm1hdEV4KGNGb3JtYXQpCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGRGF0ZV9Gb3JtYXRFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQp7CglDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsKCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKCUNKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKCUFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CgoJaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKCXsKCQlzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwoJCXJldHVybiBGQUxTRTsKCX0KCWlmKCFwRXZlbnQtPm1fcFZhbHVlKQoJCXJldHVybiBGQUxTRTsKCglDRlhfV2lkZVN0cmluZyYgdmFsID0gcEV2ZW50LT5WYWx1ZSgpOwoJQ0ZYX1dpZGVTdHJpbmcgc3RyVmFsdWUgPSB2YWw7CglpZiAoc3RyVmFsdWUuSXNFbXB0eSgpKQoJCXJldHVybiBUUlVFOwoKCUNGWF9XaWRlU3RyaW5nIHNGb3JtYXQgPSBwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKCk7CglGWF9CT09MIGJXcm9uZ0Zvcm1hdCA9IEZBTFNFOwoJZG91YmxlIGREYXRlID0gMC4wZjsKCglpZihzdHJWYWx1ZS5GaW5kKEwiR01UIikgIT0gLTEpCgl7CgkJLy9mb3IgR01UIGZvcm1hdCB0aW1lCgkJLy9zdWNoIGFzICJUdWUgQXVnIDExIDE0OjI0OjE2IEdNVCswODAwMjAwOSIKCQlkRGF0ZSA9IE1ha2VJbnRlckRhdGUoc3RyVmFsdWUpOwoJfQoJZWxzZQoJewoJCWREYXRlID0gTWFrZVJlZ3VsYXJEYXRlKHN0clZhbHVlLHNGb3JtYXQsYldyb25nRm9ybWF0KTsKCX0KCglpZiAoSlNfUG9ydElzTmFuKGREYXRlKSkKCXsKCQlDRlhfV2lkZVN0cmluZyBzd01zZzsKCQlzd01zZy5Gb3JtYXQoSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJTRURBVEUpLmNfc3RyKCksIHNGb3JtYXQuY19zdHIoKSk7CgkJQWxlcnQocENvbnRleHQsIHN3TXNnLmNfc3RyKCkpOwoJCXJldHVybiBGQUxTRTsKCX0KCgl2YWwgPSAgTWFrZUZvcm1hdERhdGUoZERhdGUsc0Zvcm1hdCk7CglyZXR1cm4gVFJVRTsKfQoKZG91YmxlIENKU19QdWJsaWNNZXRob2RzOjpNYWtlSW50ZXJEYXRlKENGWF9XaWRlU3RyaW5nIHN0clZhbHVlKQp7CglpbnQgbkhvdXI7CglpbnQgbk1pbjsKCWludCBuU2VjOwoJaW50IG5ZZWFyOwoJaW50IG5Nb250aDsKCWludCBuRGF5OwoKCUNGWF9XaWRlU3RyaW5nQXJyYXkgd3NBcnJheTsKCUNGWF9XaWRlU3RyaW5nIHNNb250aCA9IEwiIjsKCUNGWF9XaWRlU3RyaW5nIHNUZW1wID0gTCIiOwoJaW50IG5TaXplID0gc3RyVmFsdWUuR2V0TGVuZ3RoKCk7CgoJZm9yKGludCBpID0gMDsgaSA8IG5TaXplOyBpKyspCgl7CgkJRlhfV0NIQVIgYyA9IHN0clZhbHVlLkdldEF0KGkpOwoJCWlmKGMgPT0gTCcgJyB8fCBjID09IEwnOicpCgkJewoJCQl3c0FycmF5LkFkZChzVGVtcCk7CgkJCXNUZW1wID0gTCIiOwoJCQljb250aW51ZTsKCQl9CgoJCXNUZW1wICs9IGM7Cgl9CgoJd3NBcnJheS5BZGQoc1RlbXApOwoJaWYod3NBcnJheS5HZXRTaXplKCkgIT0gOClyZXR1cm4gMDsKCglzVGVtcCA9IHdzQXJyYXlbMV07CglpZihzVGVtcC5Db21wYXJlKEwiSmFuIikgPT0gMCkgbk1vbnRoID0gMTsKCWlmKHNUZW1wLkNvbXBhcmUoTCJGZWIiKSA9PSAwKSBuTW9udGggPSAyOwoJaWYoc1RlbXAuQ29tcGFyZShMIk1hciIpID09IDApIG5Nb250aCA9IDM7CglpZihzVGVtcC5Db21wYXJlKEwiQXByIikgPT0gMCkgbk1vbnRoID0gNDsKCWlmKHNUZW1wLkNvbXBhcmUoTCJNYXkiKSA9PSAwKSBuTW9udGggPSA1OwoJaWYoc1RlbXAuQ29tcGFyZShMIkp1biIpID09IDApIG5Nb250aCA9IDY7CglpZihzVGVtcC5Db21wYXJlKEwiSnVsIikgPT0gMCkgbk1vbnRoID0gNzsKCWlmKHNUZW1wLkNvbXBhcmUoTCJBdWciKSA9PSAwKSBuTW9udGggPSA4OwoJaWYoc1RlbXAuQ29tcGFyZShMIlNlcCIpID09IDApIG5Nb250aCA9IDk7CglpZihzVGVtcC5Db21wYXJlKEwiT2N0IikgPT0gMCkgbk1vbnRoID0gMTA7CglpZihzVGVtcC5Db21wYXJlKEwiTm92IikgPT0gMCkgbk1vbnRoID0gMTE7CglpZihzVGVtcC5Db21wYXJlKEwiRGVjIikgPT0gMCkgbk1vbnRoID0gMTI7CgoJbkRheSA9IChpbnQpUGFyc2VTdHJpbmdUb051bWJlcih3c0FycmF5WzJdLmNfc3RyKCkpOwoJbkhvdXIgPSAoaW50KVBhcnNlU3RyaW5nVG9OdW1iZXIod3NBcnJheVszXS5jX3N0cigpKTsKCW5NaW4gPSAoaW50KVBhcnNlU3RyaW5nVG9OdW1iZXIod3NBcnJheVs0XS5jX3N0cigpKTsKCW5TZWMgPSAoaW50KVBhcnNlU3RyaW5nVG9OdW1iZXIod3NBcnJheVs1XS5jX3N0cigpKTsKCW5ZZWFyID0gKGludClQYXJzZVN0cmluZ1RvTnVtYmVyKHdzQXJyYXlbN10uY19zdHIoKSk7CgoJZG91YmxlIGRSZXQgPSBKU19NYWtlRGF0ZShKU19NYWtlRGF5KG5ZZWFyLG5Nb250aCAtIDEsbkRheSksSlNfTWFrZVRpbWUobkhvdXIsIG5NaW4sIG5TZWMsIDApKTsKCglpZiAoSlNfUG9ydElzTmFuKGRSZXQpKQoJewoJCWRSZXQgPSBKU19EYXRlUGFyc2Uoc3RyVmFsdWUuY19zdHIoKSk7Cgl9CgoJcmV0dXJuIGRSZXQ7Cn0KCi8vQUZEYXRlX0tleXN0cm9rZUV4KGNGb3JtYXQpCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGRGF0ZV9LZXlzdHJva2VFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQp7CglDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsKCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKCUNKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKCUFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CgoJaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKCXsKCQlzRXJyb3IgPSBMIkFGRGF0ZV9LZXlzdHJva2VFeCdzIHBhcmFtZXRlcnMnIHNpemUgciBub3QgY29ycmVjdCI7CgkJcmV0dXJuIEZBTFNFOwoJfQoKCWlmIChwRXZlbnQtPldpbGxDb21taXQoKSkKCXsKCQlpZighcEV2ZW50LT5tX3BWYWx1ZSkKCQkJcmV0dXJuIEZBTFNFOwoJCUNGWF9XaWRlU3RyaW5nIHN0clZhbHVlID0gcEV2ZW50LT5WYWx1ZSgpOwoJCWlmIChzdHJWYWx1ZS5Jc0VtcHR5KCkpCgkJCXJldHVybiBUUlVFOwoKCQlDRlhfV2lkZVN0cmluZyBzRm9ybWF0ID0gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpOwoJCUZYX0JPT0wgYldyb25nRm9ybWF0ID0gRkFMU0U7CgkJZG91YmxlIGRSZXQgPSBNYWtlUmVndWxhckRhdGUoc3RyVmFsdWUsc0Zvcm1hdCxiV3JvbmdGb3JtYXQpOwoJCWlmIChiV3JvbmdGb3JtYXQgfHwgSlNfUG9ydElzTmFuKGRSZXQpKQoJCXsKCQkJQ0ZYX1dpZGVTdHJpbmcgc3dNc2c7CgkJCXN3TXNnLkZvcm1hdChKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUlNFREFURSkuY19zdHIoKSwgc0Zvcm1hdC5jX3N0cigpKTsKCQkJQWxlcnQocENvbnRleHQsIHN3TXNnLmNfc3RyKCkpOwoJCQlwRXZlbnQtPlJjKCkgPSBGQUxTRTsKCQkJcmV0dXJuIFRSVUU7CgkJfQoJfQoJcmV0dXJuIFRSVUU7Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGRGF0ZV9Gb3JtYXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKewoJdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSA6OkdldElzb2xhdGUoY2MpOwoKCWlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCgl7CgkJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKCQlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CgoJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CgkJcmV0dXJuIEZBTFNFOwoJfQoKCWludCBpSW5kZXggPSBwYXJhbXNbMF0uVG9JbnQoKTsKCWNvbnN0IEZYX1dDSEFSKiBjRm9ybWF0c1tdID0gIHtMIm0vZCIsIEwibS9kL3l5IiwgTCJtbS9kZC95eSIsIEwibW0veXkiLCBMImQtbW1tIiwgTCJkLW1tbS15eSIsIEwiZGQtbW1tLXl5IiwKCQlMInl5LW1tLWRkIiwgTCJtbW0teXkiLCBMIm1tbW0teXkiLCBMIm1tbSBkLCB5eXl5IiwgTCJtbW1tIGQsIHl5eXkiLAoJCUwibS9kL3l5IGg6TU0gdHQiLCBMIm0vZC95eSBISDpNTSIgfTsKCglBU1NFUlQoaUluZGV4IDwgRlhfQXJyYXlTaXplKGNGb3JtYXRzKSk7CgoJaWYgKGlJbmRleCA8IDApCgkJaUluZGV4ID0gMDsKCWlmIChpSW5kZXggPj0gRlhfQXJyYXlTaXplKGNGb3JtYXRzKSkKCQlpSW5kZXggPSAwOwoJQ0pTX1BhcmFtZXRlcnMgbmV3UGFyYW1zOwoJQ0pTX1ZhbHVlIHZhbChpc29sYXRlLGNGb3JtYXRzW2lJbmRleF0pOwoJbmV3UGFyYW1zLnB1c2hfYmFjayh2YWwpOwoJcmV0dXJuIEFGRGF0ZV9Gb3JtYXRFeChjYyxuZXdQYXJhbXMsdlJldCxzRXJyb3IpOwp9CgovL0FGRGF0ZV9LZXlzdHJva2VFeChjRm9ybWF0KQpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRkRhdGVfS2V5c3Ryb2tlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCnsKCXY4OjpJc29sYXRlKiBpc29sYXRlID0gOjpHZXRJc29sYXRlKGNjKTsKCglpZiAocGFyYW1zLnNpemUoKSAhPSAxKQoJewoJCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CgkJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwoKCQlzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwoJCXJldHVybiBGQUxTRTsKCX0KCglpbnQgaUluZGV4ID0gcGFyYW1zWzBdLlRvSW50KCk7Cgljb25zdCBGWF9XQ0hBUiogY0Zvcm1hdHNbXSA9ICB7TCJtL2QiLCBMIm0vZC95eSIsIEwibW0vZGQveXkiLCBMIm1tL3l5IiwgTCJkLW1tbSIsIEwiZC1tbW0teXkiLCBMImRkLW1tbS15eSIsCgkJTCJ5eS1tbS1kZCIsIEwibW1tLXl5IiwgTCJtbW1tLXl5IiwgTCJtbW0gZCwgeXl5eSIsIEwibW1tbSBkLCB5eXl5IiwKCQlMIm0vZC95eSBoOk1NIHR0IiwgTCJtL2QveXkgSEg6TU0iIH07CgoJQVNTRVJUKGlJbmRleDxGWF9BcnJheVNpemUoY0Zvcm1hdHMpKTsKCglpZiAoaUluZGV4IDwgMCkKCQlpSW5kZXggPSAwOwoJaWYgKGlJbmRleCA+PSBGWF9BcnJheVNpemUoY0Zvcm1hdHMpKQoJCWlJbmRleCA9IDA7CglDSlNfUGFyYW1ldGVycyBuZXdQYXJhbXM7CglDSlNfVmFsdWUgdmFsKGlzb2xhdGUsY0Zvcm1hdHNbaUluZGV4XSk7CgluZXdQYXJhbXMucHVzaF9iYWNrKHZhbCk7CglyZXR1cm4gQUZEYXRlX0tleXN0cm9rZUV4KGNjLG5ld1BhcmFtcyx2UmV0LHNFcnJvcik7Cn0KCi8vZnVuY3Rpb24gQUZUaW1lX0Zvcm1hdChwdGYpCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGVGltZV9Gb3JtYXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKewoJdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSA6OkdldElzb2xhdGUoY2MpOwoKCWlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCgl7CgkJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKCQlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CgkJc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKCQlyZXR1cm4gRkFMU0U7Cgl9CgoJaW50IGlJbmRleCA9IHBhcmFtc1swXS5Ub0ludCgpOwoJY29uc3QgRlhfV0NIQVIqIGNGb3JtYXRzW10gPSB7TCJISDpNTSIsIEwiaDpNTSB0dCIsIEwiSEg6TU06c3MiLCBMImg6TU06c3MgdHQifTsKCglBU1NFUlQoaUluZGV4PEZYX0FycmF5U2l6ZShjRm9ybWF0cykpOwoKCWlmIChpSW5kZXggPCAwKQoJCWlJbmRleCA9IDA7CglpZiAoaUluZGV4ID49IEZYX0FycmF5U2l6ZShjRm9ybWF0cykpCgkJaUluZGV4ID0gMDsKCUNKU19QYXJhbWV0ZXJzIG5ld1BhcmFtczsKCUNKU19WYWx1ZSB2YWwoaXNvbGF0ZSxjRm9ybWF0c1tpSW5kZXhdKTsKCW5ld1BhcmFtcy5wdXNoX2JhY2sodmFsKTsKCXJldHVybiBBRkRhdGVfRm9ybWF0RXgoY2MsbmV3UGFyYW1zLHZSZXQsc0Vycm9yKTsKfQoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZUaW1lX0tleXN0cm9rZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQp7Cgl2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7CglpZiAocGFyYW1zLnNpemUoKSAhPSAxKQoJewoJCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CgkJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwoJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CgkJcmV0dXJuIEZBTFNFOwoJfQoKCWludCBpSW5kZXggPSBwYXJhbXNbMF0uVG9JbnQoKTsKCWNvbnN0IEZYX1dDSEFSKiBjRm9ybWF0c1tdID0ge0wiSEg6TU0iLCBMImg6TU0gdHQiLCBMIkhIOk1NOnNzIiwgTCJoOk1NOnNzIHR0In07CgoJQVNTRVJUKGlJbmRleDxGWF9BcnJheVNpemUoY0Zvcm1hdHMpKTsKCglpZiAoaUluZGV4IDwgMCkKCQlpSW5kZXggPSAwOwoJaWYgKGlJbmRleCA+PSBGWF9BcnJheVNpemUoY0Zvcm1hdHMpKQoJCWlJbmRleCA9IDA7CglDSlNfUGFyYW1ldGVycyBuZXdQYXJhbXM7CglDSlNfVmFsdWUgdmFsKGlzb2xhdGUsY0Zvcm1hdHNbaUluZGV4XSk7CgluZXdQYXJhbXMucHVzaF9iYWNrKHZhbCk7CglyZXR1cm4gQUZEYXRlX0tleXN0cm9rZUV4KGNjLG5ld1BhcmFtcyx2UmV0LHNFcnJvcik7Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGVGltZV9Gb3JtYXRFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQp7CglyZXR1cm4gQUZEYXRlX0Zvcm1hdEV4KGNjLHBhcmFtcyx2UmV0LHNFcnJvcik7Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGVGltZV9LZXlzdHJva2VFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQp7CglyZXR1cm4gQUZEYXRlX0tleXN0cm9rZUV4KGNjLHBhcmFtcyx2UmV0LHNFcnJvcik7Cn0KCi8vZnVuY3Rpb24gQUZTcGVjaWFsX0Zvcm1hdChwc2YpCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGU3BlY2lhbF9Gb3JtYXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKewoJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7CglBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CgoJaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKCXsKCQlzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwoJCXJldHVybiBGQUxTRTsKCX0KCglzdGQ6OnN0cmluZyBjRm9ybWF0OwoJaW50IGlJbmRleCA9IHBhcmFtc1swXS5Ub0ludCgpOwoKCUNKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKCUFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CgoJaWYoIXBFdmVudC0+bV9wVmFsdWUpCgkJcmV0dXJuIEZBTFNFOwoJQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlID0gcEV2ZW50LT5WYWx1ZSgpOwoJc3RkOjpzdHJpbmcgc3RyU3JjID0gQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKFZhbHVlKS5jX3N0cigpOwoKCXN3aXRjaCAoaUluZGV4KQoJewoJY2FzZSAwOgoJCWNGb3JtYXQgPSAiOTk5OTkiOwoJCWJyZWFrOwoJY2FzZSAxOgoJCWNGb3JtYXQgPSAiOTk5OTktOTk5OSI7CgkJYnJlYWs7CgljYXNlIDI6CgkJewoJCQlzdGQ6OnN0cmluZyBOdW1iZXJTdHI7CgkJCXV0aWw6OnByaW50eCgiOTk5OTk5OTk5OSIsIHN0clNyYyxOdW1iZXJTdHIpOwoJCQlpZiAoTnVtYmVyU3RyLmxlbmd0aCgpID49IDEwICkKCQkJCWNGb3JtYXQgPSAiKDk5OSkgOTk5LTk5OTkiOwoJCQllbHNlCgkJCQljRm9ybWF0ID0gIjk5OS05OTk5IjsKCQkJYnJlYWs7CgkJfQoJY2FzZSAzOgoJCWNGb3JtYXQgPSAiOTk5LTk5LTk5OTkiOwoJCWJyZWFrOwoJfQoKCXN0ZDo6c3RyaW5nIHN0ckRlczsKCXV0aWw6OnByaW50eChjRm9ybWF0LHN0clNyYyxzdHJEZXMpOwoJVmFsdWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKHN0ckRlcy5jX3N0cigpKTsKCXJldHVybiBUUlVFOwp9CgoKLy9mdW5jdGlvbiBBRlNwZWNpYWxfS2V5c3Ryb2tlRXgobWFzaykKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZTcGVjaWFsX0tleXN0cm9rZUV4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCnsKCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwoJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwoJQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOwoKCUFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CgoJaWYgKHBhcmFtcy5zaXplKCkgPCAxKQoJewoJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CgkJcmV0dXJuIEZBTFNFOwoJfQoKCWlmKCFwRXZlbnQtPm1fcFZhbHVlKQoJCXJldHVybiBGQUxTRTsKCUNGWF9XaWRlU3RyaW5nJiB2YWxFdmVudCA9IHBFdmVudC0+VmFsdWUoKTsKCglDRlhfV2lkZVN0cmluZyB3c3RyTWFzayA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKTsKCWlmICh3c3RyTWFzay5Jc0VtcHR5KCkpCgkJcmV0dXJuIFRSVUU7CgoJc3RkOjp3c3RyaW5nIHdzdHJWYWx1ZSA9IHZhbEV2ZW50LmNfc3RyKCk7CgoJaWYgKHBFdmVudC0+V2lsbENvbW1pdCgpKQoJewoJCWlmICh3c3RyVmFsdWUuZW1wdHkoKSkKCQkJcmV0dXJuIFRSVUU7CgkJaW50IGlJbmRleE1hc2sgPSAwOwoJCWZvciAoc3RkOjp3c3RyaW5nOjppdGVyYXRvciBpdCA9IHdzdHJWYWx1ZS5iZWdpbigpOyBpdCAhPSB3c3RyVmFsdWUuZW5kKCk7IGl0KyspCgkJewoJCQl3Y2hhcl90IHdfVmFsdWUgPSAqaXQ7CgkJCWlmICghbWFza1NhdGlzZmllZCh3X1ZhbHVlLHdzdHJNYXNrW2lJbmRleE1hc2tdKSkKCQkJCWJyZWFrOwoJCQlpSW5kZXhNYXNrKys7CgkJfQoKCQlpZiAoaUluZGV4TWFzayAhPSB3c3RyTWFzay5HZXRMZW5ndGgoKSB8fCAoaUluZGV4TWFzayAhPSB3c3RyVmFsdWUuc2l6ZSgpICYmIHdzdHJNYXNrLkdldExlbmd0aCgpICE9IDApKQoJCXsKCQkJQWxlcnQocENvbnRleHQsIEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTQUZOVU1CRVJfS0VZU1RST0tFKS5jX3N0cigpKTsKCQkJcEV2ZW50LT5SYygpID0gRkFMU0U7CgkJfQoJCXJldHVybiBUUlVFOwoJfQoKCUNGWF9XaWRlU3RyaW5nICZ3aWRlQ2hhbmdlID0gcEV2ZW50LT5DaGFuZ2UoKTsKCXN0ZDo6d3N0cmluZyB3Q2hhbmdlID0gd2lkZUNoYW5nZS5jX3N0cigpOwoJaWYgKHdDaGFuZ2UuZW1wdHkoKSkKCQlyZXR1cm4gVFJVRTsKCglpbnQgaUluZGV4TWFzayA9IHBFdmVudC0+U2VsU3RhcnQoKTsKCglpZiAod3N0clZhbHVlLmxlbmd0aCgpIC0gKHBFdmVudC0+U2VsRW5kKCktcEV2ZW50LT5TZWxTdGFydCgpKSArIHdDaGFuZ2UubGVuZ3RoKCkgPiAoRlhfRFdPUkQpd3N0ck1hc2suR2V0TGVuZ3RoKCkpCgl7CgkJQWxlcnQocENvbnRleHQsIEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1fVE9PTE9ORykuY19zdHIoKSk7CgkJcEV2ZW50LT5SYygpID0gRkFMU0U7CgkJcmV0dXJuIFRSVUU7Cgl9CgoJaWYgKGlJbmRleE1hc2sgPj0gd3N0ck1hc2suR2V0TGVuZ3RoKCkgJiYgKCF3Q2hhbmdlLmVtcHR5KCkpKQoJewoJCUFsZXJ0KHBDb250ZXh0LCBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNX1RPT0xPTkcpLmNfc3RyKCkpOwoJCXBFdmVudC0+UmMoKSA9IEZBTFNFOwoJCXJldHVybiBUUlVFOwoJfQoKCWZvciAoc3RkOjp3c3RyaW5nOjppdGVyYXRvciBpdCA9IHdDaGFuZ2UuYmVnaW4oKTsgaXQgIT0gd0NoYW5nZS5lbmQoKTsgaXQrKykKCXsKCQlpZiAoaUluZGV4TWFzayA+PSB3c3RyTWFzay5HZXRMZW5ndGgoKSkKCQl7CgkJCUFsZXJ0KHBDb250ZXh0LCBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNX1RPT0xPTkcpLmNfc3RyKCkpOwoJCQlwRXZlbnQtPlJjKCkgPSBGQUxTRTsKCQkJcmV0dXJuIFRSVUU7CgkJfQoJCXdjaGFyX3Qgd19NYXNrID0gd3N0ck1hc2tbaUluZGV4TWFza107CgkJaWYgKCFpc1Jlc2VydmVkTWFza0NoYXIod19NYXNrKSkKCQl7CgkJCSppdCA9IHdfTWFzazsKCQl9CgkJd2NoYXJfdCB3X0NoYW5nZSA9ICppdDsKCQlpZiAoIW1hc2tTYXRpc2ZpZWQod19DaGFuZ2Usd19NYXNrKSkKCQl7CgkJCXBFdmVudC0+UmMoKSA9IEZBTFNFOwoJCQlyZXR1cm4gVFJVRTsKCQl9CgkJaUluZGV4TWFzaysrOwoJfQoKCXdpZGVDaGFuZ2UgPSB3Q2hhbmdlLmNfc3RyKCk7CglyZXR1cm4gVFJVRTsKfQoKCi8vZnVuY3Rpb24gQUZTcGVjaWFsX0tleXN0cm9rZShwc2YpCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGU3BlY2lhbF9LZXlzdHJva2UoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKewoJdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSA6OkdldElzb2xhdGUoY2MpOwoKCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwoJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwoJQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOwoJQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKCglpZiAocGFyYW1zLnNpemUoKSAhPSAxKQoJewoJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CgkJcmV0dXJuIEZBTFNFOwoJfQoKCXN0ZDo6c3RyaW5nIGNGb3JtYXQ7CglpbnQgaUluZGV4ID0gcGFyYW1zWzBdLlRvSW50KCk7CgoJaWYoIXBFdmVudC0+bV9wVmFsdWUpCgkJcmV0dXJuIEZBTFNFOwoJLy9DSlNfVmFsdWUgdmFsID0gcEV2ZW50LT5WYWx1ZSgpOwoJQ0ZYX1dpZGVTdHJpbmcmIHZhbCA9IHBFdmVudC0+VmFsdWUoKTsKCXN0ZDo6c3RyaW5nIHN0clNyYyA9IENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZSh2YWwpLmNfc3RyKCk7CglzdGQ6OndzdHJpbmcgd3N0ckNoYW5nZSA9IHBFdmVudC0+Q2hhbmdlKCkuY19zdHIoKTsKCglzd2l0Y2ggKGlJbmRleCkKCXsKCWNhc2UgMDoKCQljRm9ybWF0ID0gIjk5OTk5IjsKCQlicmVhazsKCWNhc2UgMToKCQkvL2NGb3JtYXQgPSAiOTk5OTktOTk5OSI7CgkJY0Zvcm1hdCA9ICI5OTk5OTk5OTkiOwoJCWJyZWFrOwoJY2FzZSAyOgoJCXsKCQkJc3RkOjpzdHJpbmcgTnVtYmVyU3RyOwoJCQl1dGlsOjpwcmludHgoIjk5OTk5OTk5OTkiLCBzdHJTcmMsTnVtYmVyU3RyKTsKCQkJaWYgKHN0clNyYy5sZW5ndGgoKSArIHdzdHJDaGFuZ2UubGVuZ3RoKCkgPiA3ICkKCQkJCS8vY0Zvcm1hdCA9ICIoOTk5KSA5OTktOTk5OSI7CgkJCQljRm9ybWF0ID0gIjk5OTk5OTk5OTkiOwoJCQllbHNlCgkJCQkvL2NGb3JtYXQgPSAiOTk5LTk5OTkiOwoJCQkJY0Zvcm1hdCA9ICI5OTk5OTk5IjsKCQkJYnJlYWs7CgkJfQoJY2FzZSAzOgoJCS8vY0Zvcm1hdCA9ICI5OTktOTktOTk5OSI7CgkJY0Zvcm1hdCA9ICI5OTk5OTk5OTkiOwoJCWJyZWFrOwoJfQoKCUNKU19QYXJhbWV0ZXJzIHBhcmFtczI7CglDSlNfVmFsdWUgdk1hc2soaXNvbGF0ZSwgY0Zvcm1hdC5jX3N0cigpKTsKCXBhcmFtczIucHVzaF9iYWNrKHZNYXNrKTsKCiAgICByZXR1cm4gQUZTcGVjaWFsX0tleXN0cm9rZUV4KGNjLHBhcmFtczIsdlJldCxzRXJyb3IpOwp9CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRk1lcmdlQ2hhbmdlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCnsKCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwoJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwoJQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50SGFuZGxlciA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKCUFTU0VSVChwRXZlbnRIYW5kbGVyICE9IE5VTEwpOwoKCWlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCgl7CgkJc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKCQlyZXR1cm4gRkFMU0U7Cgl9CgoJQ0ZYX1dpZGVTdHJpbmcgc3dWYWx1ZTsKCWlmIChwRXZlbnRIYW5kbGVyLT5tX3BWYWx1ZSAhPSBOVUxMKQoJCXN3VmFsdWUgPSBwRXZlbnRIYW5kbGVyLT5WYWx1ZSgpOwoKCWlmIChwRXZlbnRIYW5kbGVyLT5XaWxsQ29tbWl0KCkpCgl7CgkJdlJldCA9IHN3VmFsdWUuY19zdHIoKTsKCQlyZXR1cm4gVFJVRTsKCX0KCglDRlhfV2lkZVN0cmluZyBwcmVmaXgscG9zdGZpeDsKCglpZiAocEV2ZW50SGFuZGxlci0+U2VsU3RhcnQoKSA+PSAwKQoJCXByZWZpeCA9IHN3VmFsdWUuTWlkKDAscEV2ZW50SGFuZGxlci0+U2VsU3RhcnQoKSk7CgllbHNlCgkJcHJlZml4ID0gTCIiOwoKCglpZiAocEV2ZW50SGFuZGxlci0+U2VsRW5kKCkgPj0gMCAmJiBwRXZlbnRIYW5kbGVyLT5TZWxFbmQoKSA8PSBzd1ZhbHVlLkdldExlbmd0aCgpKQoJCXBvc3RmaXggPSBzd1ZhbHVlLk1pZChwRXZlbnRIYW5kbGVyLT5TZWxFbmQoKSwgc3dWYWx1ZS5HZXRMZW5ndGgoKSAtIHBFdmVudEhhbmRsZXItPlNlbEVuZCgpKTsKCWVsc2UgcG9zdGZpeCA9IEwiIjsKCgl2UmV0ID0gKHByZWZpeCArIHBFdmVudEhhbmRsZXItPkNoYW5nZSgpICsgcG9zdGZpeCkuY19zdHIoKTsKCglyZXR1cm4gVFJVRTsKfQoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZQYXJzZURhdGVFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQp7CglDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsKCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKCglpZiAocGFyYW1zLnNpemUoKSAhPSAyKQoJewoJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CgkJcmV0dXJuIEZBTFNFOwoJfQoKCUNGWF9XaWRlU3RyaW5nIHNWYWx1ZSA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKTsKCUNGWF9XaWRlU3RyaW5nIHNGb3JtYXQgPSBwYXJhbXNbMV0uVG9DRlhXaWRlU3RyaW5nKCk7CgoJRlhfQk9PTCBiV3JvbmdGb3JtYXQgPSBGQUxTRTsKCWRvdWJsZSBkRGF0ZSA9IE1ha2VSZWd1bGFyRGF0ZShzVmFsdWUsc0Zvcm1hdCxiV3JvbmdGb3JtYXQpOwoKCWlmIChKU19Qb3J0SXNOYW4oZERhdGUpKQoJewoJCUNGWF9XaWRlU3RyaW5nIHN3TXNnOwoJCXN3TXNnLkZvcm1hdChKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUlNFREFURSkuY19zdHIoKSwgc0Zvcm1hdC5jX3N0cigpKTsKCQlBbGVydCgoQ0pTX0NvbnRleHQgKiljYywgc3dNc2cuY19zdHIoKSk7CgkJcmV0dXJuIEZBTFNFOwoJfQoKCXZSZXQgPSBkRGF0ZTsKCXJldHVybiBUUlVFOwp9CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlNpbXBsZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQp7CglpZiAocGFyYW1zLnNpemUoKSAhPSAzKQoJewoJCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwoJCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKCgkJc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKCQlyZXR1cm4gRkFMU0U7Cgl9CgoJdlJldCA9IChkb3VibGUpQUZfU2ltcGxlKHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKS5jX3N0cigpLCBwYXJhbXNbMV0uVG9Eb3VibGUoKSwgcGFyYW1zWzJdLlRvRG91YmxlKCkpOwoJcmV0dXJuIFRSVUU7Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGTWFrZU51bWJlcihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQp7CglpZiAocGFyYW1zLnNpemUoKSAhPSAxKQoJewoJCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwoJCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKCgkJc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKCQlyZXR1cm4gRkFMU0U7Cgl9Cgl2UmV0ID0gUGFyc2VTdHJpbmdUb051bWJlcihwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKCkuY19zdHIoKSk7CglyZXR1cm4gVFJVRTsKfQoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZTaW1wbGVfQ2FsY3VsYXRlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCnsKCXY4OjpJc29sYXRlKiBpc29sYXRlID0gOjpHZXRJc29sYXRlKGNjKTsKCglDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsKCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKCglpZiAocGFyYW1zLnNpemUoKSAhPSAyKQoJewoJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CgkJcmV0dXJuIEZBTFNFOwoJfQoKCUNKU19WYWx1ZSBwYXJhbXMxID0gcGFyYW1zWzFdOwoKCWlmICghcGFyYW1zMS5Jc0FycmF5T2JqZWN0KCkgJiYgcGFyYW1zMS5HZXRUeXBlKCkgIT0gVlRfc3RyaW5nKQoJewoJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CgkJcmV0dXJuIEZBTFNFOwoJfQoKCUNQREZTREtfRG9jdW1lbnQqIHBSZWFkZXJEb2MgPSBwQ29udGV4dC0+R2V0UmVhZGVyRG9jdW1lbnQoKTsKICAgIEFTU0VSVChwUmVhZGVyRG9jICE9IE5VTEwpOwoKCUNQREZTREtfSW50ZXJGb3JtKiBwUmVhZGVySW50ZXJGb3JtID0gcFJlYWRlckRvYy0+R2V0SW50ZXJGb3JtKCk7CglBU1NFUlQocFJlYWRlckludGVyRm9ybSAhPSBOVUxMKTsKCglDUERGX0ludGVyRm9ybSogcEludGVyRm9ybSA9IHBSZWFkZXJJbnRlckZvcm0tPkdldEludGVyRm9ybSgpOwoJQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7CgoJZG91YmxlIGRWYWx1ZTsKCUNGWF9XaWRlU3RyaW5nIHNGdW5jdGlvbiA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKTsKCWlmICh3Y3NjbXAoc0Z1bmN0aW9uLmNfc3RyKCksIEwiUFJEIikgPT0gMCkKICAgIAlkVmFsdWUgPSAxLjA7CgllbHNlCgkJZFZhbHVlID0gMC4wOwoKCUNKU19BcnJheSBGaWVsZE5hbWVBcnJheSA9IEFGX01ha2VBcnJheUZyb21MaXN0KGlzb2xhdGUscGFyYW1zMSk7CgoJaW50IG5GaWVsZHNDb3VudCA9IDA7CgoJZm9yIChpbnQgaT0wLGlzej1GaWVsZE5hbWVBcnJheS5HZXRMZW5ndGgoKTsgaTxpc3o7IGkrKykKCXsKCQlDSlNfVmFsdWUganNWYWx1ZShpc29sYXRlKTsKCQlGaWVsZE5hbWVBcnJheS5HZXRFbGVtZW50KGksanNWYWx1ZSk7CgkJQ0ZYX1dpZGVTdHJpbmcgd3NGaWVsZE5hbWUgPSBqc1ZhbHVlLlRvQ0ZYV2lkZVN0cmluZygpOwoKICAgICAgICBmb3IgKGludCBqPTAsanN6PXBJbnRlckZvcm0tPkNvdW50RmllbGRzKHdzRmllbGROYW1lKTsgajxqc3o7IGorKykKCQl7CgkJCWlmIChDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IHBJbnRlckZvcm0tPkdldEZpZWxkKGosIHdzRmllbGROYW1lKSkKCQkJewoJCQkJZG91YmxlIGRUZW1wID0gMC4wOwoKCQkJCXN3aXRjaCAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkpCgkJCQl7CgkJCQljYXNlIEZJRUxEVFlQRV9URVhURklFTEQ6CgkJCQljYXNlIEZJRUxEVFlQRV9DT01CT0JPWDoKCQkJCQl7CgkJCQkJCWRUZW1wID0gUGFyc2VTdHJpbmdUb051bWJlcihwRm9ybUZpZWxkLT5HZXRWYWx1ZSgpLmNfc3RyKCkpOwoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQljYXNlIEZJRUxEVFlQRV9QVVNIQlVUVE9OOgoJCQkJCXsKCQkJCQkJZFRlbXAgPSAwLjA7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCWNhc2UgRklFTERUWVBFX0NIRUNLQk9YOgoJCQkJY2FzZSBGSUVMRFRZUEVfUkFESU9CVVRUT046CgkJCQkJewoJCQkJCQlkVGVtcCA9IDAuMDsKCQkJCQkJZm9yIChpbnQgYz0wLGNzej1wRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCk7IGM8Y3N6OyBjKyspCgkJCQkJCXsKCQkJCQkJCWlmIChDUERGX0Zvcm1Db250cm9sKiBwRm9ybUN0cmwgPSBwRm9ybUZpZWxkLT5HZXRDb250cm9sKGMpKQoJCQkJCQkJewoJCQkJCQkJCWlmIChwRm9ybUN0cmwtPklzQ2hlY2tlZCgpKQoJCQkJCQkJCXsKCQkJCQkJCQkJZFRlbXAgKz0gUGFyc2VTdHJpbmdUb051bWJlcihwRm9ybUN0cmwtPkdldEV4cG9ydFZhbHVlKCkuY19zdHIoKSk7CgkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCX0KCQkJCQkJCQllbHNlCgkJCQkJCQkJCWNvbnRpbnVlOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCWNhc2UgRklFTERUWVBFX0xJU1RCT1g6CgkJCQkJewoJCQkJCQlkVGVtcCA9IDAuMDsKCQkJCQkJaWYgKHBGb3JtRmllbGQtPkNvdW50U2VsZWN0ZWRJdGVtcygpID4gMSkKCQkJCQkJCWJyZWFrOwoJCQkJCQllbHNlCgkJCQkJCXsKCQkJCQkJCWRUZW1wID0gUGFyc2VTdHJpbmdUb051bWJlcihwRm9ybUZpZWxkLT5HZXRWYWx1ZSgpLmNfc3RyKCkpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQl9CgkJCQlkZWZhdWx0OgoJCQkJCWJyZWFrOwoJCQkJfQoKCQkJCWlmIChpID09IDAgJiYgaiA9PSAwICYmICh3Y3NjbXAoc0Z1bmN0aW9uLmNfc3RyKCksIEwiTUlOIikgPT0gMCB8fCB3Y3NjbXAoc0Z1bmN0aW9uLmNfc3RyKCksIEwiTUFYIikgPT0gMCkpCgkJCQkJZFZhbHVlID0gZFRlbXA7CgoJCQkJZFZhbHVlID0gQUZfU2ltcGxlKHNGdW5jdGlvbi5jX3N0cigpLCBkVmFsdWUsIGRUZW1wKTsKCgkJCQluRmllbGRzQ291bnQrKzsKCQkJfQoJCX0KCX0KCglpZiAod2NzY21wKHNGdW5jdGlvbi5jX3N0cigpLCBMIkFWRyIpID09IDAgJiYgbkZpZWxkc0NvdW50ID4gMCkKCQlkVmFsdWUgLz0gbkZpZWxkc0NvdW50OwoKCWRWYWx1ZSA9IChkb3VibGUpZmxvb3IoZFZhbHVlICogRlhTWVNfcG93KChkb3VibGUpMTAsKGRvdWJsZSk2KSArIDAuNDkpIC8gRlhTWVNfcG93KChkb3VibGUpMTAsKGRvdWJsZSk2KTsKCUNKU19WYWx1ZSBqc1ZhbHVlKGlzb2xhdGUsZFZhbHVlKTsKCWlmKHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKS0+bV9wVmFsdWUpCgkJcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpLT5WYWx1ZSgpID0ganNWYWx1ZS5Ub0NGWFdpZGVTdHJpbmcoKTsKCglyZXR1cm4gVFJVRTsKfQoKLyogVGhpcyBmdW5jdGlvbiB2YWxpZGF0ZXMgdGhlIGN1cnJlbnQgZXZlbnQgdG8gZW5zdXJlIHRoYXQgaXRzIHZhbHVlIGlzCioqIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHJhbmdlLiAqLwoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZSYW5nZV9WYWxpZGF0ZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQp7CglDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsKCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKCUNKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKCUFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CgoJaWYgKHBhcmFtcy5zaXplKCkgIT0gNCkKCXsKCQlzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwoJCXJldHVybiBGQUxTRTsKCX0KCglpZighcEV2ZW50LT5tX3BWYWx1ZSkKCQlyZXR1cm4gRkFMU0U7CglpZiAocEV2ZW50LT5WYWx1ZSgpLklzRW1wdHkoKSApCgkJcmV0dXJuIFRSVUU7Cglkb3VibGUgZEVlbnRWYWx1ZSA9IGF0b2YoQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHBFdmVudC0+VmFsdWUoKSkpOwoJRlhfQk9PTCBiR3JlYXRlclRoYW4gPSBwYXJhbXNbMF0uVG9Cb29sKCk7Cglkb3VibGUgZEdyZWF0ZXJUaGFuID0gcGFyYW1zWzFdLlRvRG91YmxlKCk7CglGWF9CT09MIGJMZXNzVGhhbiA9IHBhcmFtc1syXS5Ub0Jvb2woKTsKCWRvdWJsZSBkTGVzc1RoYW4gPSBwYXJhbXNbM10uVG9Eb3VibGUoKTsKCUNGWF9XaWRlU3RyaW5nIHN3TXNnOwoKCWlmIChiR3JlYXRlclRoYW4gJiYgYkxlc3NUaGFuKQoJewoJCWlmIChkRWVudFZhbHVlIDwgZEdyZWF0ZXJUaGFuIHx8IGRFZW50VmFsdWUgPiBkTGVzc1RoYW4pCgkJCXN3TXNnLkZvcm1hdChKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1JBTkdFMSkuY19zdHIoKSwKCQkJCQkJIHBhcmFtc1sxXS5Ub0NGWFdpZGVTdHJpbmcoKS5jX3N0cigpLAoJCQkJCQkgcGFyYW1zWzNdLlRvQ0ZYV2lkZVN0cmluZygpLmNfc3RyKCkpOwoJfQoJZWxzZSBpZiAoYkdyZWF0ZXJUaGFuKQoJewoJCWlmIChkRWVudFZhbHVlIDwgZEdyZWF0ZXJUaGFuKQoJCQlzd01zZy5Gb3JtYXQoSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNSQU5HRTIpLmNfc3RyKCksCgkJCQkJCSBwYXJhbXNbMV0uVG9DRlhXaWRlU3RyaW5nKCkuY19zdHIoKSk7Cgl9CgllbHNlIGlmIChiTGVzc1RoYW4pCgl7CgkJaWYgKGRFZW50VmFsdWUgPiBkTGVzc1RoYW4pCgkJCXN3TXNnLkZvcm1hdChKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1JBTkdFMykuY19zdHIoKSwKCQkJCQkJIHBhcmFtc1szXS5Ub0NGWFdpZGVTdHJpbmcoKS5jX3N0cigpKTsKCX0KCglpZiAoIXN3TXNnLklzRW1wdHkoKSkKCXsKCQlBbGVydChwQ29udGV4dCwgc3dNc2cuY19zdHIoKSk7CgkJcEV2ZW50LT5SYygpID0gRkFMU0U7Cgl9CglyZXR1cm4gVFJVRTsKfQoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZFeHRyYWN0TnVtcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQp7Cgl2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7CglDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwoJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwoKCWlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCgl7CgkJc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKCQlyZXR1cm4gRkFMU0U7Cgl9CgoJQ0pTX0FycmF5IG51bXMoaXNvbGF0ZSk7CgoJQ0ZYX1dpZGVTdHJpbmcgc3RyID0gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpOwoJQ0ZYX1dpZGVTdHJpbmcgc1BhcnQ7CgoJaWYgKHN0ci5HZXRBdCgwKSA9PSBMJy4nIHx8IHN0ci5HZXRBdCgwKSA9PSBMJywnKQoJCXN0ciA9IEwiMCIgKyBzdHI7CgoJaW50IG5JbmRleCA9IDA7Cglmb3IgKGludCBpPTAsIHN6PXN0ci5HZXRMZW5ndGgoKTsgaTxzejsgaSsrKQoJewoJCUZYX1dDSEFSIHdjID0gc3RyLkdldEF0KGkpOwoJCWlmIChJc0RpZ2l0KCh3Y2hhcl90KXdjKSkKCQl7CgkJCXNQYXJ0ICs9IHdjOwoJCX0KCQllbHNlCgkJewoJCQlpZiAoc1BhcnQuR2V0TGVuZ3RoKCkgPiAwKQoJCQl7CgkJCQludW1zLlNldEVsZW1lbnQobkluZGV4LENKU19WYWx1ZShpc29sYXRlLHNQYXJ0LmNfc3RyKCkpKTsKCQkJCXNQYXJ0ID0gTCIiOwoJCQkJbkluZGV4ICsrOwoJCQl9CgkJfQoJfQoKCWlmIChzUGFydC5HZXRMZW5ndGgoKSA+IDApCgl7CgkJbnVtcy5TZXRFbGVtZW50KG5JbmRleCxDSlNfVmFsdWUoaXNvbGF0ZSxzUGFydC5jX3N0cigpKSk7Cgl9CgoJaWYgKG51bXMuR2V0TGVuZ3RoKCkgPiAwKQoJCXZSZXQgPSBudW1zOwoJZWxzZQoJCXZSZXQuU2V0TnVsbCgpOwoKCXJldHVybiBUUlVFOwp9Cg==