Ly8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCgojaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0phdmFTY3JpcHQuaCIKI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9JSmF2YVNjcmlwdC5oIgojaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0RlZmluZS5oIgojaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX09iamVjdC5oIgojaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX1ZhbHVlLmgiCiNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvUHVibGljTWV0aG9kcy5oIgojaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0V2ZW50SGFuZGxlci5oIgojaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L3Jlc291cmNlLmgiCiNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSlNfQ29udGV4dC5oIgojaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX1ZhbHVlLmgiCiNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvdXRpbC5oIgojaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0ZpZWxkLmgiCiNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvY29sb3IuaCIKI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KU19SdW50aW1lLmgiCgpzdGF0aWMgdjg6Oklzb2xhdGUqIEdldElzb2xhdGUoSUZYSlNfQ29udGV4dCogY2MpCnsKICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwogICAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwoKICAgIENKU19SdW50aW1lKiBwUnVudGltZSA9IHBDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsKICAgIEFTU0VSVChwUnVudGltZSAhPSBOVUxMKTsKCiAgICByZXR1cm4gcFJ1bnRpbWUtPkdldElzb2xhdGUoKTsKfQoKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENKU19QdWJsaWNNZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgojZGVmaW5lIERPVUJMRV9DT1JSRUNUICAwLjAwMDAwMDAwMDAwMDAwMQoKQkVHSU5fSlNfU1RBVElDX0dMT0JBTF9GVU4oQ0pTX1B1YmxpY01ldGhvZHMpCiAgICBKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRk51bWJlcl9Gb3JtYXQpCiAgICBKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRk51bWJlcl9LZXlzdHJva2UpCiAgICBKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlBlcmNlbnRfRm9ybWF0KQogICAgSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZQZXJjZW50X0tleXN0cm9rZSkKICAgIEpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGRGF0ZV9Gb3JtYXRFeCkKICAgIEpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGRGF0ZV9LZXlzdHJva2VFeCkKICAgIEpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGRGF0ZV9Gb3JtYXQpCiAgICBKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRkRhdGVfS2V5c3Ryb2tlKQogICAgSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZUaW1lX0Zvcm1hdEV4KQogICAgSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZUaW1lX0tleXN0cm9rZUV4KQogICAgSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZUaW1lX0Zvcm1hdCkKICAgIEpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGVGltZV9LZXlzdHJva2UpCiAgICBKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlNwZWNpYWxfRm9ybWF0KQogICAgSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZTcGVjaWFsX0tleXN0cm9rZSkKICAgIEpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGU3BlY2lhbF9LZXlzdHJva2VFeCkKICAgIEpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGU2ltcGxlKQogICAgSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZNYWtlTnVtYmVyKQogICAgSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZTaW1wbGVfQ2FsY3VsYXRlKQogICAgSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZSYW5nZV9WYWxpZGF0ZSkKICAgIEpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGTWVyZ2VDaGFuZ2UpCiAgICBKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlBhcnNlRGF0ZUV4KQogICAgSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZFeHRyYWN0TnVtcykKRU5EX0pTX1NUQVRJQ19HTE9CQUxfRlVOKCkKCklNUExFTUVOVF9KU19TVEFUSUNfR0xPQkFMX0ZVTihDSlNfUHVibGljTWV0aG9kcykKCnN0YXRpYyBjb25zdCBGWF9XQ0hBUiogbW9udGhzW10gPQp7CiAgICBMIkphbiIsIEwiRmViIiwgTCJNYXIiLCBMIkFwciIsIEwiTWF5IiwgTCJKdW4iLCBMIkp1bCIsIEwiQXVnIiwgTCJTZXAiLCBMIk9jdCIsIEwiTm92IiwgTCJEZWMiCn07CgpzdGF0aWMgY29uc3QgRlhfV0NIQVIqIGNvbnN0IGZ1bGxtb250aHNbXSA9CnsKICAgIEwiSmFudWFyeSIsIEwiRmVicnVhcnkiLCBMIk1hcmNoIiwgTCJBcHJpbCIsIEwiTWF5IiwgTCJKdW5lIiwgTCJKdWx5IiwgTCJBdWd1c3QiLCBMIlNlcHRlbWJlciIsIEwiT2N0b2JlciIsIEwiTm92ZW1iZXIiLCBMIkRlY2VtYmVyIgp9OwoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6SXNOdW1iZXIoY29uc3QgRlhfV0NIQVIqIHN0cmluZykKewogICAgQ0ZYX1dpZGVTdHJpbmcgc1RyaW0gPSBTdHJUcmltKHN0cmluZyk7CiAgICBjb25zdCBGWF9XQ0hBUiogcFRyaW0gPSBzVHJpbS5jX3N0cigpOwogICAgY29uc3QgRlhfV0NIQVIqIHAgPSBwVHJpbTsKCgogICAgRlhfQk9PTCBiRG90ID0gRkFMU0U7CiAgICBGWF9CT09MIGJLWEpTID0gRkFMU0U7CgogICAgd2NoYXJfdCBjOwogICAgd2hpbGUgKChjID0gKnApKQogICAgewogICAgICAgIGlmIChjID09ICcuJyB8fCBjID09ICcsJykKICAgICAgICB7CiAgICAgICAgICAgIGlmIChiRG90KSByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgIGJEb3QgPSBUUlVFOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChjID09ICctJyB8fCBjID09ICcrJykKICAgICAgICB7CiAgICAgICAgICAgIGlmIChwICE9IHBUcmltKQogICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChjID09ICdlJyB8fCBjID09ICdFJykKICAgICAgICB7CiAgICAgICAgICAgIGlmIChiS1hKUykKICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKCiAgICAgICAgICAgIHArKzsKICAgICAgICAgICAgYyA9ICpwOwogICAgICAgICAgICBpZiAoYyA9PSAnKycgfHwgYyA9PSAnLScpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJLWEpTID0gVFJVRTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIGlmICghSXNEaWdpdChjKSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICB9CiAgICAgICAgcCsrOwogICAgfQoKICAgIHJldHVybiBUUlVFOwp9CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpJc0RpZ2l0KHdjaGFyX3QgY2gpCnsKICAgIHJldHVybiAoY2ggPj0gTCcwJyAmJiBjaCA8PSBMJzknKTsKfQoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6SXNEaWdpdChjaGFyIGNoKQp7CiAgICByZXR1cm4gKGNoID49ICcwJyAmJiBjaCA8PSAnOScpOwp9CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpJc0FscGhhYmV0aWMod2NoYXJfdCBjaCkKewogICAgcmV0dXJuICgoY2ggPj0gTCdhJyAmJiBjaCA8PSBMJ3onKSB8fCAoY2ggPj0gTCdBJyAmJiBjaCA8PSBMJ1onKSk7Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OklzQWxwaGFOdW1lcmljKHdjaGFyX3QgY2gpCnsKICAgIHJldHVybiAoSXNEaWdpdChjaCkgfHwgSXNBbHBoYWJldGljKGNoKSk7Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6Om1hc2tTYXRpc2ZpZWQod2NoYXJfdCBjX0NoYW5nZSx3Y2hhcl90IGNfTWFzaykKewogICAgc3dpdGNoIChjX01hc2spCiAgICB7CiAgICBjYXNlIEwnOSc6CiAgICAgICAgcmV0dXJuIElzRGlnaXQoY19DaGFuZ2UpOwogICAgY2FzZSBMJ0EnOgogICAgICAgIHJldHVybiBJc0FscGhhYmV0aWMoY19DaGFuZ2UpOwogICAgY2FzZSBMJ08nOgogICAgICAgIHJldHVybiBJc0FscGhhTnVtZXJpYyhjX0NoYW5nZSk7CiAgICBjYXNlIEwnWCc6CiAgICAgICAgcmV0dXJuIFRSVUU7CiAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiAoY19DaGFuZ2UgPT0gY19NYXNrKTsKICAgIH0KfQoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6aXNSZXNlcnZlZE1hc2tDaGFyKHdjaGFyX3QgY2gpCnsKICAgIHJldHVybiBjaCA9PSBMJzknIHx8IGNoID09IEwnQScgfHwgY2ggPT0gTCdPJyB8fCBjaCA9PSBMJ1gnOwp9Cgpkb3VibGUgQ0pTX1B1YmxpY01ldGhvZHM6OkFGX1NpbXBsZShjb25zdCBGWF9XQ0hBUiogc0Z1Y3Rpb24sIGRvdWJsZSBkVmFsdWUxLCBkb3VibGUgZFZhbHVlMikKewogICAgaWYgKEZYU1lTX3djc2ljbXAoc0Z1Y3Rpb24sTCJBVkciKSA9PSAwIHx8IEZYU1lTX3djc2ljbXAoc0Z1Y3Rpb24sTCJTVU0iKSA9PSAwKQogICAgewogICAgICAgIHJldHVybiBkVmFsdWUxICsgZFZhbHVlMjsKICAgIH0KICAgIGlmIChGWFNZU193Y3NpY21wKHNGdWN0aW9uLCBMIlBSRCIpID09IDApCiAgICB7CiAgICAgICAgcmV0dXJuIGRWYWx1ZTEgKiBkVmFsdWUyOwogICAgfQogICAgaWYgKEZYU1lTX3djc2ljbXAoc0Z1Y3Rpb24sTCJNSU4iKSA9PSAwKQogICAgewogICAgICAgIHJldHVybiBGWF9NSU4oZFZhbHVlMSwgZFZhbHVlMik7CiAgICB9CiAgICBpZiAoRlhTWVNfd2NzaWNtcChzRnVjdGlvbixMIk1BWCIpID09IDApCiAgICB7CiAgICAgICAgcmV0dXJuIEZYX01BWChkVmFsdWUxLCBkVmFsdWUyKTsKICAgIH0KICAgIHJldHVybiBkVmFsdWUxOwp9CgpDRlhfV2lkZVN0cmluZyBDSlNfUHVibGljTWV0aG9kczo6U3RyTFRyaW0oY29uc3QgRlhfV0NIQVIqIHBTdHIpCnsKICAgIHdoaWxlICgqcFN0ciAmJiAqcFN0ciA9PSBMJyAnKSBwU3RyKys7CgogICAgcmV0dXJuIHBTdHI7Cn0KCkNGWF9XaWRlU3RyaW5nIENKU19QdWJsaWNNZXRob2RzOjpTdHJSVHJpbShjb25zdCBGWF9XQ0hBUiogcFN0cikKewogICAgY29uc3QgRlhfV0NIQVIqIHAgPSBwU3RyOwogICAgd2hpbGUgKCpwKSBwKys7CiAgICB3aGlsZSAocCA+IHBTdHIgJiYgKihwIC0gMSkgPT0gTCcgJykgcC0tOwoKICAgIHJldHVybiBDRlhfV2lkZVN0cmluZyhwU3RyLCBwIC0gcFN0cik7Cn0KCkNGWF9XaWRlU3RyaW5nIENKU19QdWJsaWNNZXRob2RzOjpTdHJUcmltKGNvbnN0IEZYX1dDSEFSKiBwU3RyKQp7CiAgICByZXR1cm4gU3RyUlRyaW0oU3RyTFRyaW0ocFN0cikuY19zdHIoKSk7Cn0KCkNGWF9CeXRlU3RyaW5nIENKU19QdWJsaWNNZXRob2RzOjpTdHJMVHJpbShjb25zdCBGWF9DSEFSKiBwU3RyKQp7CiAgICB3aGlsZSAoKnBTdHIgJiYgKnBTdHIgPT0gJyAnKSBwU3RyKys7CgogICAgICAgIHJldHVybiBwU3RyOwp9CgpDRlhfQnl0ZVN0cmluZyBDSlNfUHVibGljTWV0aG9kczo6U3RyUlRyaW0oY29uc3QgRlhfQ0hBUiogcFN0cikKewogICAgY29uc3QgRlhfQ0hBUiogcCA9IHBTdHI7CiAgICB3aGlsZSAoKnApIHArKzsKICAgIHdoaWxlIChwID4gcFN0ciAmJiAqKHAgLSAxKSA9PSBMJyAnKSBwLS07CgogICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKHBTdHIscC1wU3RyKTsKfQoKQ0ZYX0J5dGVTdHJpbmcgQ0pTX1B1YmxpY01ldGhvZHM6OlN0clRyaW0oY29uc3QgRlhfQ0hBUiogcFN0cikKewogICAgcmV0dXJuIFN0clJUcmltKFN0ckxUcmltKHBTdHIpKTsKfQoKZG91YmxlIENKU19QdWJsaWNNZXRob2RzOjpQYXJzZU51bWJlcihjb25zdCBGWF9XQ0hBUiogc3dTb3VyY2UsIEZYX0JPT0wmIGJBbGxEaWdpdHMsIEZYX0JPT0wmIGJEb3QsIEZYX0JPT0wmIGJTaWduLCBGWF9CT09MJiBiS1hKUykKewogICAgYkRvdCA9IEZBTFNFOwogICAgYlNpZ24gPSBGQUxTRTsKICAgIGJLWEpTID0gRkFMU0U7CgogICAgRlhfQk9PTCBiRGlnaXRFeGlzdCA9IEZBTFNFOwoKICAgIGNvbnN0IEZYX1dDSEFSKiBwID0gc3dTb3VyY2U7CiAgICB3Y2hhcl90IGM7CgogICAgY29uc3QgRlhfV0NIQVIqIHBTdGFydCA9IE5VTEw7CiAgICBjb25zdCBGWF9XQ0hBUiogcEVuZCA9IE5VTEw7CgogICAgd2hpbGUgKChjID0gKnApKQogICAgewogICAgICAgIGlmICghcFN0YXJ0ICYmIGMgIT0gTCcgJykKICAgICAgICB7CiAgICAgICAgICAgIHBTdGFydCA9IHA7CiAgICAgICAgfQoKICAgICAgICBwRW5kID0gcDsKICAgICAgICBwKys7CiAgICB9CgogICAgaWYgKCFwU3RhcnQpCiAgICB7CiAgICAgICAgYkFsbERpZ2l0cyA9IEZBTFNFOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIHdoaWxlIChwRW5kICE9IHBTdGFydCkKICAgIHsKICAgICAgICBpZiAoKnBFbmQgPT0gTCcgJykKICAgICAgICAgICAgcEVuZCAtLTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGJyZWFrOwogICAgfQoKICAgIGRvdWJsZSBkUmV0ID0gMDsKICAgIHAgPSBwU3RhcnQ7CiAgICBiQWxsRGlnaXRzID0gVFJVRTsKICAgIENGWF9XaWRlU3RyaW5nIHN3RGlnaXRzOwoKICAgIHdoaWxlIChwIDw9IHBFbmQpCiAgICB7CiAgICAgICAgYyA9ICpwOwoKICAgICAgICBpZiAoSXNEaWdpdChjKSkKICAgICAgICB7CiAgICAgICAgICAgIHN3RGlnaXRzICs9IGM7CiAgICAgICAgICAgIGJEaWdpdEV4aXN0ID0gVFJVRTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgc3dpdGNoIChjKQogICAgICAgICAgICB7CiAgICAgICAgICAgIGNhc2UgTCcgJzoKICAgICAgICAgICAgICAgIGJBbGxEaWdpdHMgPSBGQUxTRTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIEwnLic6CiAgICAgICAgICAgIGNhc2UgTCcsJzoKICAgICAgICAgICAgICAgIGlmICghYkRvdCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoYkRpZ2l0RXhpc3QpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzd0RpZ2l0cyArPSBMJy4nOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzd0RpZ2l0cyArPSBMJzAnOwogICAgICAgICAgICAgICAgICAgICAgICBzd0RpZ2l0cyArPSBMJy4nOwogICAgICAgICAgICAgICAgICAgICAgICBiRGlnaXRFeGlzdCA9IFRSVUU7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBiRG90ID0gVFJVRTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSAnZSc6CiAgICAgICAgICAgIGNhc2UgJ0UnOgogICAgICAgICAgICAgICAgaWYgKCFiS1hKUykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBwKys7CiAgICAgICAgICAgICAgICAgICAgYyA9ICpwOwogICAgICAgICAgICAgICAgICAgIGlmIChjID09ICcrJyB8fCBjID09ICctJykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJLWEpTID0gVFJVRTsKICAgICAgICAgICAgICAgICAgICAgICAgc3dEaWdpdHMgKz0gJ2UnOwogICAgICAgICAgICAgICAgICAgICAgICBzd0RpZ2l0cyArPSBjOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSBMJy0nOgogICAgICAgICAgICAgICAgaWYgKCFiRGlnaXRFeGlzdCAmJiAhYlNpZ24pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc3dEaWdpdHMgKz0gYzsKICAgICAgICAgICAgICAgICAgICBiU2lnbiA9IFRSVUU7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBiQWxsRGlnaXRzID0gRkFMU0U7CgogICAgICAgICAgICAgICAgaWYgKHAgIT0gcFN0YXJ0ICYmICFiRG90ICYmIGJEaWdpdEV4aXN0KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHN3RGlnaXRzICs9IEwnLic7CiAgICAgICAgICAgICAgICAgICAgYkRvdCA9IFRSVUU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYkRvdCA9IEZBTFNFOwogICAgICAgICAgICAgICAgICAgIGJEaWdpdEV4aXN0ID0gRkFMU0U7CiAgICAgICAgICAgICAgICAgICAgc3dEaWdpdHMgPSBMIiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcCsrOwogICAgfQoKICAgIGlmIChzd0RpZ2l0cy5HZXRMZW5ndGgoKSA+IDAgJiYgc3dEaWdpdHMuR2V0TGVuZ3RoKCkgPCAxNykKICAgIHsKICAgICAgICBDRlhfQnl0ZVN0cmluZyBzRGlnaXRzID0gc3dEaWdpdHMuVVRGOEVuY29kZSgpOwoKICAgICAgICBpZiAoYktYSlMpCiAgICAgICAgewogICAgICAgICAgICBkUmV0ID0gYXRvZihzRGlnaXRzKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGJEb3QpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNoYXIqIHBTdG9wU3RyaW5nOwogICAgICAgICAgICAgICAgZFJldCA9IDo6c3RydG9kKHNEaWdpdHMsICZwU3RvcFN0cmluZyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBkUmV0ID0gYXRvbChzRGlnaXRzKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICB9CgogICAgcmV0dXJuIGRSZXQ7Cn0KCmRvdWJsZSBDSlNfUHVibGljTWV0aG9kczo6UGFyc2VTdHJpbmdUb051bWJlcihjb25zdCBGWF9XQ0hBUiogc3dTb3VyY2UpCnsKICAgIEZYX0JPT0wgYkFsbERpZ2l0cyA9IEZBTFNFOwogICAgRlhfQk9PTCBiRG90ID0gRkFMU0U7CiAgICBGWF9CT09MIGJTaWduID0gRkFMU0U7CiAgICBGWF9CT09MIGJLWEpTID0gRkFMU0U7CgogICAgcmV0dXJuIFBhcnNlTnVtYmVyKHN3U291cmNlLCBiQWxsRGlnaXRzLCBiRG90LCBiU2lnbiwgYktYSlMpOwp9CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpDb252ZXJ0U3RyaW5nVG9OdW1iZXIoY29uc3QgRlhfV0NIQVIqIHN3U291cmNlLCBkb3VibGUgJiBkUmV0LCBGWF9CT09MICYgYkRvdCkKewogICAgRlhfQk9PTCBiQWxsRGlnaXRzID0gRkFMU0U7CiAgICBGWF9CT09MIGJTaWduID0gRkFMU0U7CiAgICBGWF9CT09MIGJLWEpTID0gRkFMU0U7CgogICAgZFJldCA9IFBhcnNlTnVtYmVyKHN3U291cmNlLCBiQWxsRGlnaXRzLCBiRG90LCBiU2lnbiwgYktYSlMpOwoKICAgIHJldHVybiBiQWxsRGlnaXRzOwp9CgpDSlNfQXJyYXkgQ0pTX1B1YmxpY01ldGhvZHM6OkFGX01ha2VBcnJheUZyb21MaXN0KHY4OjpJc29sYXRlKiBpc29sYXRlLCBDSlNfVmFsdWUgdmFsKQp7CiAgICBDSlNfQXJyYXkgU3RyQXJyYXkoaXNvbGF0ZSk7CiAgICBpZih2YWwuSXNBcnJheU9iamVjdCgpKQogICAgewogICAgICAgIHZhbC5Db252ZXJ0VG9BcnJheShTdHJBcnJheSk7CiAgICAgICAgcmV0dXJuIFN0ckFycmF5OwogICAgfQogICAgQ0ZYX1dpZGVTdHJpbmcgd3NTdHIgPSB2YWwuVG9DRlhXaWRlU3RyaW5nKCk7CiAgICBDRlhfQnl0ZVN0cmluZyB0ID0gQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHdzU3RyKTsKICAgIGNvbnN0IGNoYXIgKiBwID0gKGNvbnN0IGNoYXIgKil0OwoKCiAgICBpbnQgY2ggPSAnLCcgOwogICAgaW50IG5JbmRleCA9IDA7CgogICAgd2hpbGUgKCpwKQogICAgewogICAgICAgIGNvbnN0IGNoYXIgKiBwVGVtcCA9IHN0cmNocihwLCBjaCk7CiAgICAgICAgaWYgKHBUZW1wID09IE5VTEwpCiAgICAgICAgewogICAgICAgICAgICBTdHJBcnJheS5TZXRFbGVtZW50KG5JbmRleCwgQ0pTX1ZhbHVlKGlzb2xhdGUsIFN0clRyaW0ocCkuY19zdHIoKSkpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgY2hhciAqIHBTdWIgPSBuZXcgY2hhcltwVGVtcCAtIHAgKyAxXTsKICAgICAgICAgICAgc3RybmNweShwU3ViLCBwLCBwVGVtcCAtIHApOwogICAgICAgICAgICAqKHBTdWIgKyAocFRlbXAgLSBwKSkgPSAnXDAnOwoKICAgICAgICAgICAgU3RyQXJyYXkuU2V0RWxlbWVudChuSW5kZXgsIENKU19WYWx1ZShpc29sYXRlLCBTdHJUcmltKHBTdWIpLmNfc3RyKCkpKTsKICAgICAgICAgICAgZGVsZXRlIFtdcFN1YjsKCiAgICAgICAgICAgIG5JbmRleCArKzsKICAgICAgICAgICAgcCA9ICsrcFRlbXA7CiAgICAgICAgfQoKICAgIH0KICAgIHJldHVybiBTdHJBcnJheTsKfQoKaW50IENKU19QdWJsaWNNZXRob2RzOjpQYXJzZVN0cmluZ0ludGVnZXIoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cmluZyxpbnQgblN0YXJ0LGludCYgblNraXAsIGludCBuTWF4U3RlcCkKewogICAgaW50IG5SZXQgPSAwOwogICAgblNraXAgPSAwOwogICAgZm9yIChpbnQgaT1uU3RhcnQsIHN6PXN0cmluZy5HZXRMZW5ndGgoKTsgaSA8IHN6OyBpKyspCiAgICB7CiAgICAgICAgaWYgKGktblN0YXJ0ID4gMTApCiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBGWF9XQ0hBUiBjID0gc3RyaW5nLkdldEF0KGkpOwogICAgICAgIGlmIChJc0RpZ2l0KCh3Y2hhcl90KWMpKQogICAgICAgIHsKICAgICAgICAgICAgblJldCA9IG5SZXQgKiAxMCArIChjIC0gJzAnKTsKICAgICAgICAgICAgblNraXAgPSBpIC0gblN0YXJ0ICsgMTsKICAgICAgICAgICAgaWYgKG5Ta2lwID49IG5NYXhTdGVwKQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICAgICAgYnJlYWs7CiAgICB9CgogICAgcmV0dXJuIG5SZXQ7Cn0KCkNGWF9XaWRlU3RyaW5nIENKU19QdWJsaWNNZXRob2RzOjpQYXJzZVN0cmluZ1N0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyaW5nLCBpbnQgblN0YXJ0LCBpbnQmIG5Ta2lwKQp7CiAgICBDRlhfV2lkZVN0cmluZyBzd1JldDsKICAgIG5Ta2lwID0gMDsKICAgIGZvciAoaW50IGk9blN0YXJ0LCBzej1zdHJpbmcuR2V0TGVuZ3RoKCk7IGkgPCBzejsgaSsrKQogICAgewogICAgICAgIEZYX1dDSEFSIGMgPSBzdHJpbmcuR2V0QXQoaSk7CiAgICAgICAgaWYgKChjID49IEwnYScgJiYgYyA8PSBMJ3onKSB8fCAoYyA+PSBMJ0EnICYmIGMgPD0gTCdaJykpCiAgICAgICAgewogICAgICAgICAgICBzd1JldCArPSBjOwogICAgICAgICAgICBuU2tpcCA9IGkgLSBuU3RhcnQgKyAxOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgICAgIGJyZWFrOwogICAgfQoKICAgIHJldHVybiBzd1JldDsKfQoKZG91YmxlIENKU19QdWJsaWNNZXRob2RzOjpQYXJzZU5vcm1hbERhdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJiB2YWx1ZSwgRlhfQk9PTCYgYldyb25nRm9ybWF0KQp7CiAgICBkb3VibGUgZHQgPSBKU19HZXREYXRlVGltZSgpOwoKICAgIGludCBuWWVhciA9IEpTX0dldFllYXJGcm9tVGltZShkdCk7CiAgICBpbnQgbk1vbnRoID0gSlNfR2V0TW9udGhGcm9tVGltZShkdCkgKyAxOwogICAgaW50IG5EYXkgPSBKU19HZXREYXlGcm9tVGltZShkdCk7CiAgICBpbnQgbkhvdXIgPSBKU19HZXRIb3VyRnJvbVRpbWUoZHQpOwogICAgaW50IG5NaW4gPSBKU19HZXRNaW5Gcm9tVGltZShkdCk7CiAgICBpbnQgblNlYyA9IEpTX0dldFNlY0Zyb21UaW1lKGR0KTsKCiAgICBpbnQgbnVtYmVyWzNdOwoKICAgIGludCBuU2tpcCA9IDA7CiAgICBpbnQgbkxlbiA9IHZhbHVlLkdldExlbmd0aCgpOwogICAgaW50IG5JbmRleCA9IDA7CiAgICBpbnQgaSA9IDA7CiAgICB3aGlsZSAoaSA8IG5MZW4pCiAgICB7CiAgICAgICAgaWYgKG5JbmRleCA+IDIpIGJyZWFrOwoKICAgICAgICBGWF9XQ0hBUiBjID0gdmFsdWUuR2V0QXQoaSk7CiAgICAgICAgaWYgKElzRGlnaXQoKHdjaGFyX3QpYykpCiAgICAgICAgewogICAgICAgICAgICBudW1iZXJbbkluZGV4KytdID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBpLCBuU2tpcCwgNCk7CiAgICAgICAgICAgIGkgKz0gblNraXA7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGkgKys7CiAgICAgICAgfQogICAgfQoKICAgIGlmIChuSW5kZXggPT0gMikKICAgIHsKICAgICAgICAvLyBjYXNlMjogbW9udGgvZGF5CiAgICAgICAgLy8gY2FzZTM6IGRheS9tb250aAogICAgICAgIGlmICgobnVtYmVyWzBdID49IDEgJiYgbnVtYmVyWzBdIDw9IDEyKSAmJiAobnVtYmVyWzFdID49IDEgJiYgbnVtYmVyWzFdIDw9IDMxKSkKICAgICAgICB7CiAgICAgICAgICAgIG5Nb250aCA9IG51bWJlclswXTsKICAgICAgICAgICAgbkRheSA9IG51bWJlclsxXTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoKG51bWJlclswXSA+PSAxICYmIG51bWJlclswXSA8PSAzMSkgJiYgKG51bWJlclsxXSA+PSAxICYmIG51bWJlclsxXSA8PSAxMikpCiAgICAgICAgewogICAgICAgICAgICBuRGF5ID0gbnVtYmVyWzBdOwogICAgICAgICAgICBuTW9udGggPSBudW1iZXJbMV07CiAgICAgICAgfQoKICAgICAgICBiV3JvbmdGb3JtYXQgPSBGQUxTRTsKICAgIH0KICAgIGVsc2UgaWYgKG5JbmRleCA9PSAzKQogICAgewogICAgICAgIC8vIGNhc2UxOiB5ZWFyL21vbnRoL2RheQogICAgICAgIC8vIGNhc2UyOiBtb250aC9kYXkveWVhcgogICAgICAgIC8vIGNhc2UzOiBkYXkvbW9udGgveWVhcgoKICAgICAgICBpZiAobnVtYmVyWzBdID4gMTIgJiYgKG51bWJlclsxXSA+PSAxICYmIG51bWJlclsxXSA8PSAxMikgJiYgKG51bWJlclsyXSA+PSAxICYmIG51bWJlclsyXSA8PSAzMSkpCiAgICAgICAgewogICAgICAgICAgICBuWWVhciA9IG51bWJlclswXTsKICAgICAgICAgICAgbk1vbnRoID0gbnVtYmVyWzFdOwogICAgICAgICAgICBuRGF5ID0gbnVtYmVyWzJdOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICgobnVtYmVyWzBdID49IDEgJiYgbnVtYmVyWzBdIDw9IDEyKSAmJiAobnVtYmVyWzFdID49IDEgJiYgbnVtYmVyWzFdIDw9IDMxKSAmJiBudW1iZXJbMl0gPiAzMSkKICAgICAgICB7CiAgICAgICAgICAgIG5Nb250aCA9IG51bWJlclswXTsKICAgICAgICAgICAgbkRheSA9IG51bWJlclsxXTsKICAgICAgICAgICAgblllYXIgPSBudW1iZXJbMl07CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKChudW1iZXJbMF0gPj0gMSAmJiBudW1iZXJbMF0gPD0gMzEpICYmIChudW1iZXJbMV0gPj0gMSAmJiBudW1iZXJbMV0gPD0gMTIpICYmIG51bWJlclsyXSA+IDMxKQogICAgICAgIHsKICAgICAgICAgICAgbkRheSA9IG51bWJlclswXTsKICAgICAgICAgICAgbk1vbnRoID0gbnVtYmVyWzFdOwogICAgICAgICAgICBuWWVhciA9IG51bWJlclsyXTsKICAgICAgICB9CgogICAgICAgIGJXcm9uZ0Zvcm1hdCA9IEZBTFNFOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGJXcm9uZ0Zvcm1hdCA9IFRSVUU7CiAgICAgICAgcmV0dXJuIGR0OwogICAgfQoKICAgIENGWF9XaWRlU3RyaW5nIHN3VGVtcDsKICAgIHN3VGVtcC5Gb3JtYXQoTCIlZC8lZC8lZCAlZDolZDolZCIsbk1vbnRoLG5EYXksblllYXIsbkhvdXIsbk1pbixuU2VjKTsKICAgIHJldHVybiBKU19EYXRlUGFyc2Uoc3dUZW1wLmNfc3RyKCkpOwp9Cgpkb3VibGUgQ0pTX1B1YmxpY01ldGhvZHM6Ok1ha2VSZWd1bGFyRGF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmIHZhbHVlLCBjb25zdCBDRlhfV2lkZVN0cmluZyAmIGZvcm1hdCwgRlhfQk9PTCYgYldyb25nRm9ybWF0KQp7CiAgICBkb3VibGUgZHQgPSBKU19HZXREYXRlVGltZSgpOwoKICAgIGlmIChmb3JtYXQuSXNFbXB0eSgpIHx8IHZhbHVlLklzRW1wdHkoKSkKICAgICAgICByZXR1cm4gZHQ7CgogICAgaW50IG5ZZWFyID0gSlNfR2V0WWVhckZyb21UaW1lKGR0KTsKICAgIGludCBuTW9udGggPSBKU19HZXRNb250aEZyb21UaW1lKGR0KSArIDE7CiAgICBpbnQgbkRheSA9IEpTX0dldERheUZyb21UaW1lKGR0KTsKICAgIGludCBuSG91ciA9IEpTX0dldEhvdXJGcm9tVGltZShkdCk7CiAgICBpbnQgbk1pbiA9IEpTX0dldE1pbkZyb21UaW1lKGR0KTsKICAgIGludCBuU2VjID0gSlNfR2V0U2VjRnJvbVRpbWUoZHQpOwoKICAgIGludCBuWWVhclN1YiA9IDk5OyAvL25ZZWFyIC0gMjAwMDsKCiAgICBGWF9CT09MIGJQbSA9IEZBTFNFOwogICAgRlhfQk9PTCBiRXhpdCA9IEZBTFNFOwogICAgYldyb25nRm9ybWF0ID0gRkFMU0U7CgogICAgaW50IGk9MDsKICAgIGludCBqPTA7CgogICAgd2hpbGUgKGkgPCBmb3JtYXQuR2V0TGVuZ3RoKCkpCiAgICB7CiAgICAgICAgaWYgKGJFeGl0KSBicmVhazsKCiAgICAgICAgRlhfV0NIQVIgYyA9IGZvcm1hdC5HZXRBdChpKTsKICAgICAgICBzd2l0Y2ggKGMpCiAgICAgICAgewogICAgICAgICAgICBjYXNlICc6JzoKICAgICAgICAgICAgY2FzZSAnLic6CiAgICAgICAgICAgIGNhc2UgJy0nOgogICAgICAgICAgICBjYXNlICdcXCc6CiAgICAgICAgICAgIGNhc2UgJy8nOgogICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgaisrOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlICd5JzoKICAgICAgICAgICAgY2FzZSAnbSc6CiAgICAgICAgICAgIGNhc2UgJ2QnOgogICAgICAgICAgICBjYXNlICdIJzoKICAgICAgICAgICAgY2FzZSAnaCc6CiAgICAgICAgICAgIGNhc2UgJ00nOgogICAgICAgICAgICBjYXNlICdzJzoKICAgICAgICAgICAgY2FzZSAndCc6CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaW50IG9sZGogPSBqOwogICAgICAgICAgICAgICAgICAgIGludCBuU2tpcCA9IDA7CiAgICAgICAgICAgICAgICAgICAgaW50IHJlbWFpbmluZyA9IGZvcm1hdC5HZXRMZW5ndGgoKSAtIGkgLSAxOwoKICAgICAgICAgICAgICAgICAgICBpZiAocmVtYWluaW5nID09IDAgfHwgZm9ybWF0LkdldEF0KGkrMSkgIT0gYykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAneSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGorKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ20nOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5Nb250aCA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqICs9IG5Ta2lwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkRheSA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqICs9IG5Ta2lwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnSCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkhvdXIgPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiArPSBuU2tpcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2gnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5Ib3VyID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogKz0gblNraXA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdNJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuTWluID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogKz0gblNraXA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdzJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuU2VjID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogKz0gblNraXA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd0JzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUG0gPSAoaiA8IHZhbHVlLkdldExlbmd0aCgpICYmIHZhbHVlLkdldEF0KGopID09ICdwJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGorKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZW1haW5pbmcgPT0gMSB8fCBmb3JtYXQuR2V0QXQoaSsyKSAhPSBjKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd5JzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuWWVhciA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqICs9IG5Ta2lwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbk1vbnRoID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSArPSAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogKz0gblNraXA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdkJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuRGF5ID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSArPSAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogKz0gblNraXA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdIJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuSG91ciA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqICs9IG5Ta2lwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnaCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkhvdXIgPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICs9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiArPSBuU2tpcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ00nOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5NaW4gPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICs9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiArPSBuU2tpcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3MnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5TZWMgPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICs9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiArPSBuU2tpcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3QnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQbSA9IChqICsgMSA8IHZhbHVlLkdldExlbmd0aCgpICYmIHZhbHVlLkdldEF0KGopID09ICdwJyAmJiB2YWx1ZS5HZXRBdChqKzEpID09ICdtJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSArPSAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogKz0gMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZW1haW5pbmcgPT0gMiB8fCBmb3JtYXQuR2V0QXQoaSszKSAhPSBjKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdtJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHNNb250aCA9IFBhcnNlU3RyaW5nU3RyaW5nKHZhbHVlLCBqLCBuU2tpcCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZpbmQgPSBGQUxTRTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgbSA9IDA7IG0gPCAxMjsgbSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc01vbnRoLkNvbXBhcmVOb0Nhc2UobW9udGhzW21dKSA9PSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5Nb250aCA9IG0gKyAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrPTM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgais9blNraXA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkZpbmQgPSBUUlVFOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWJGaW5kKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuTW9udGggPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrPTM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqICs9IG5Ta2lwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAneSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrPTM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgais9MzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZW1haW5pbmcgPT0gMyB8fCBmb3JtYXQuR2V0QXQoaSs0KSAhPSBjKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjKQogICAgICAgICAgICAgICAgICAgICAgICB7CgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3knOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ZZWFyID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgNCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiArPSBuU2tpcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICs9IDQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdtJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZpbmQgPSBGQUxTRTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHNNb250aCA9IFBhcnNlU3RyaW5nU3RyaW5nKHZhbHVlLCBqLCBuU2tpcCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNNb250aC5NYWtlTG93ZXIoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IG0gPSAwOyBtIDwgMTI7IG0rKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc0Z1bGxNb250aHMgPSBmdWxsbW9udGhzW21dOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0Z1bGxNb250aHMuTWFrZUxvd2VyKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNGdWxsTW9udGhzLkZpbmQoc01vbnRoLmNfc3RyKCksIDApICE9IC0xKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5Nb250aCA9IG0gKyAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gNDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqICs9IG5Ta2lwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJGaW5kID0gVFJVRTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFiRmluZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbk1vbnRoID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgNCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKz00OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiArPSBuU2tpcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSArPSA0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogKz0gNDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaiA+PSB2YWx1ZS5HZXRMZW5ndGgoKSB8fCBmb3JtYXQuR2V0QXQoaSkgIT0gdmFsdWUuR2V0QXQoaikpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJXcm9uZ0Zvcm1hdCA9IFRSVUU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRXhpdCA9IFRSVUU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgICAgICBqKys7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAob2xkaiA9PSBqKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgYldyb25nRm9ybWF0ID0gVFJVRTsKICAgICAgICAgICAgICAgICAgICAgICAgYkV4aXQgPSBUUlVFOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5HZXRMZW5ndGgoKSA8PSBqKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGJFeGl0ID0gVFJVRTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZvcm1hdC5HZXRBdChpKSAhPSB2YWx1ZS5HZXRBdChqKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBiV3JvbmdGb3JtYXQgPSBUUlVFOwogICAgICAgICAgICAgICAgICAgIGJFeGl0ID0gVFJVRTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAgICBqKys7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CgogICAgaWYgKGJQbSkgbkhvdXIgKz0gMTI7CgogICAgaWYgKG5ZZWFyID49IDAgJiYgblllYXIgPD0gblllYXJTdWIpCiAgICAgICAgblllYXIgKz0gMjAwMDsKCiAgICBpZiAobk1vbnRoIDwgMSB8fCBuTW9udGggPiAxMikKICAgICAgICBiV3JvbmdGb3JtYXQgPSBUUlVFOwoKICAgIGlmIChuRGF5IDwgMSB8fCBuRGF5ID4gMzEpCiAgICAgICAgYldyb25nRm9ybWF0ID0gVFJVRTsKCiAgICBpZiAobkhvdXIgPCAwIHx8IG5Ib3VyID4gMjQpCiAgICAgICAgYldyb25nRm9ybWF0ID0gVFJVRTsKCiAgICBpZiAobk1pbiA8IDAgfHwgbk1pbiA+IDYwKQogICAgICAgIGJXcm9uZ0Zvcm1hdCA9IFRSVUU7CgogICAgaWYgKG5TZWMgPCAwIHx8IG5TZWMgPiA2MCkKICAgICAgICBiV3JvbmdGb3JtYXQgPSBUUlVFOwoKICAgIGRvdWJsZSBkUmV0ID0gMDsKCiAgICBpZiAoYldyb25nRm9ybWF0KQogICAgewogICAgICAgIGRSZXQgPSBQYXJzZU5vcm1hbERhdGUodmFsdWUsIGJXcm9uZ0Zvcm1hdCk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgZFJldCA9IEpTX01ha2VEYXRlKEpTX01ha2VEYXkoblllYXIsbk1vbnRoIC0gMSxuRGF5KSxKU19NYWtlVGltZShuSG91ciwgbk1pbiwgblNlYywgMCkpOwoKICAgICAgICBpZiAoSlNfUG9ydElzTmFuKGRSZXQpKQogICAgICAgIHsKICAgICAgICAgICAgZFJldCA9IEpTX0RhdGVQYXJzZSh2YWx1ZS5jX3N0cigpKTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKEpTX1BvcnRJc05hbihkUmV0KSkKICAgIHsKICAgICAgICBkUmV0ID0gUGFyc2VOb3JtYWxEYXRlKHZhbHVlLCBiV3JvbmdGb3JtYXQpOwogICAgfQoKICAgIHJldHVybiBkUmV0OwoKfQoKQ0ZYX1dpZGVTdHJpbmcgQ0pTX1B1YmxpY01ldGhvZHM6Ok1ha2VGb3JtYXREYXRlKGRvdWJsZSBkRGF0ZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJiBmb3JtYXQpCnsKICAgIENGWF9XaWRlU3RyaW5nIHNSZXQgPSBMIiIsc1BhcnQgPSBMIiI7CgogICAgaW50IG5ZZWFyID0gSlNfR2V0WWVhckZyb21UaW1lKGREYXRlKTsKICAgIGludCBuTW9udGggPSBKU19HZXRNb250aEZyb21UaW1lKGREYXRlKSArIDE7CiAgICBpbnQgbkRheSA9IEpTX0dldERheUZyb21UaW1lKGREYXRlKTsKICAgIGludCBuSG91ciA9IEpTX0dldEhvdXJGcm9tVGltZShkRGF0ZSk7CiAgICBpbnQgbk1pbiA9IEpTX0dldE1pbkZyb21UaW1lKGREYXRlKTsKICAgIGludCBuU2VjID0gSlNfR2V0U2VjRnJvbVRpbWUoZERhdGUpOwoKICAgIGludCBpID0gMDsKICAgIHdoaWxlIChpIDwgZm9ybWF0LkdldExlbmd0aCgpKQogICAgewogICAgICAgICAgICBGWF9XQ0hBUiBjID0gZm9ybWF0LkdldEF0KGkpOwogICAgICAgICAgICAgICAgaW50IHJlbWFpbmluZyA9IGZvcm1hdC5HZXRMZW5ndGgoKSAtIGkgLSAxOwogICAgICAgIHNQYXJ0ID0gTCIiOwogICAgICAgIHN3aXRjaCAoYykKICAgICAgICB7CiAgICAgICAgICAgIGNhc2UgJ3knOgogICAgICAgICAgICBjYXNlICdtJzoKICAgICAgICAgICAgY2FzZSAnZCc6CiAgICAgICAgICAgIGNhc2UgJ0gnOgogICAgICAgICAgICBjYXNlICdoJzoKICAgICAgICAgICAgY2FzZSAnTSc6CiAgICAgICAgICAgIGNhc2UgJ3MnOgogICAgICAgICAgICBjYXNlICd0JzoKICAgICAgICAgICAgICAgIGlmIChyZW1haW5pbmcgPT0gMCB8fCBmb3JtYXQuR2V0QXQoaSsxKSAhPSBjKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3knOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc1BhcnQgKz0gYzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdtJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNQYXJ0LkZvcm1hdChMIiVkIixuTW9udGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2QnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc1BhcnQuRm9ybWF0KEwiJWQiLG5EYXkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0gnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc1BhcnQuRm9ybWF0KEwiJWQiLG5Ib3VyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdoJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNQYXJ0LkZvcm1hdChMIiVkIixuSG91cj4xMj9uSG91ciAtIDEyOm5Ib3VyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdNJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNQYXJ0LkZvcm1hdChMIiVkIixuTWluKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdzJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNQYXJ0LkZvcm1hdChMIiVkIixuU2VjKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd0JzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNQYXJ0ICs9IG5Ib3VyPjEyPydwJzonYSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAocmVtYWluaW5nID09IDEgfHwgZm9ybWF0LkdldEF0KGkrMikgIT0gYykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd5JzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNQYXJ0LkZvcm1hdChMIiUwMmQiLG5ZZWFyIC0gKG5ZZWFyIC8gMTAwKSAqIDEwMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzUGFydC5Gb3JtYXQoTCIlMDJkIixuTW9udGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2QnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc1BhcnQuRm9ybWF0KEwiJTAyZCIsbkRheSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnSCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzUGFydC5Gb3JtYXQoTCIlMDJkIixuSG91cik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnaCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzUGFydC5Gb3JtYXQoTCIlMDJkIixuSG91cj4xMj9uSG91ciAtIDEyOm5Ib3VyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdNJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNQYXJ0LkZvcm1hdChMIiUwMmQiLG5NaW4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3MnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc1BhcnQuRm9ybWF0KEwiJTAyZCIsblNlYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAndCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzUGFydCA9IG5Ib3VyPjEyPyBMInBtIjogTCJhbSI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaSs9MjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlbWFpbmluZyA9PSAyIHx8IGZvcm1hdC5HZXRBdChpKzMpICE9IGMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKz0zOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5Nb250aCA+IDAmJm5Nb250aCA8PSAxMikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzUGFydCArPSBtb250aHNbbk1vbnRoIC0gMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrPTM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzUGFydCArPSBjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc1BhcnQgKz0gYzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNQYXJ0ICs9IGM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChyZW1haW5pbmcgPT0gMyB8fCBmb3JtYXQuR2V0QXQoaSs0KSAhPSBjKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3knOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc1BhcnQuRm9ybWF0KEwiJTA0ZCIsblllYXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaSArPSA0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ20nOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaSs9NDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuTW9udGggPiAwJiZuTW9udGggPD0gMTIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1BhcnQgKz0gZnVsbG1vbnRoc1tuTW9udGggLSAxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaSArPSA0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc1BhcnQgKz0gYzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNQYXJ0ICs9IGM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzUGFydCArPSBjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc1BhcnQgKz0gYzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAgICAgICAgc1BhcnQgKz0gYzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgc1BhcnQgKz0gYzsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgc1JldCArPSBzUGFydDsKICAgIH0KCiAgICByZXR1cm4gc1JldDsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi8vZnVuY3Rpb24gQUZOdW1iZXJfRm9ybWF0KG5EZWMsIHNlcFN0eWxlLCBuZWdTdHlsZSwgY3VyclN0eWxlLCBzdHJDdXJyZW5jeSwgYkN1cnJlbmN5UHJlcGVuZCkKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZOdW1iZXJfRm9ybWF0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCnsKI2lmIF9GWF9PU18gIT0gX0ZYX0FORFJPSURfCgl2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7CglDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsKCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKCUNKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKCUFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CgoJaWYgKHBhcmFtcy5zaXplKCkgIT0gNikKCXsKCQlzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwoJCXJldHVybiBGQUxTRTsKCX0KCWlmKCFwRXZlbnQtPm1fcFZhbHVlKQoJCXJldHVybiBGQUxTRTsKCUNGWF9XaWRlU3RyaW5nJiBWYWx1ZSA9IHBFdmVudC0+VmFsdWUoKTsKCUNGWF9CeXRlU3RyaW5nIHN0clZhbHVlID0gU3RyVHJpbShDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUoVmFsdWUpKTsKCglpZiAoc3RyVmFsdWUuSXNFbXB0eSgpKSByZXR1cm4gVFJVRTsKCglpbnQgaURlYyA9IHBhcmFtc1swXS5Ub0ludCgpOwoJaW50IGlTZXBTdHlsZSA9IHBhcmFtc1sxXS5Ub0ludCgpOwoJaW50IGlOZWdTdHlsZSA9IHBhcmFtc1syXS5Ub0ludCgpOwoJLy8gcGFyYW1zWzNdIGlzIGlDdXJyU3R5bGUsIGl0J3Mgbm90IHVzZWQuCglzdGQ6OndzdHJpbmcgd3N0ckN1cnJlbmN5KHBhcmFtc1s0XS5Ub0NGWFdpZGVTdHJpbmcoKS5jX3N0cigpKTsKCUZYX0JPT0wgYkN1cnJlbmN5UHJlcGVuZCA9IHBhcmFtc1s1XS5Ub0Jvb2woKTsKCglpZiAoaURlYyA8IDApIGlEZWMgPSAtaURlYzsKCglpZiAoaVNlcFN0eWxlIDwgMCB8fCBpU2VwU3R5bGUgPiAzKQoJCWlTZXBTdHlsZSA9IDA7CgoJaWYgKGlOZWdTdHlsZSA8IDAgfHwgaU5lZ1N0eWxlID4gMykKCQlpTmVnU3R5bGUgPSAwOwoKCgkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCS8vZm9yIHByb2Nlc3NpbmcgZGVjaW1hbCBwbGFjZXMKCXN0clZhbHVlLlJlcGxhY2UoIiwiLCAiLiIpOwoJZG91YmxlIGRWYWx1ZSA9IGF0b2Yoc3RyVmFsdWUpOwoJaWYgKGlEZWMgPiAwKQoJCWRWYWx1ZSArPSBET1VCTEVfQ09SUkVDVDsvLwoKCWludCBpRGVjMjsKCUZYX0JPT0wgYk5hZ2F0aXZlID0gRkFMU0U7CgoJc3RyVmFsdWUgPSBmY3Z0KGRWYWx1ZSxpRGVjLCZpRGVjMiwmYk5hZ2F0aXZlKTsKCWlmIChzdHJWYWx1ZS5Jc0VtcHR5KCkpCgl7CgkJZFZhbHVlID0gMDsKCQlzdHJWYWx1ZSA9IGZjdnQoZFZhbHVlLGlEZWMsJmlEZWMyLCZiTmFnYXRpdmUpOwoJCWlmIChzdHJWYWx1ZS5Jc0VtcHR5KCkpCgkJewoJCQlzdHJWYWx1ZSA9ICIwIjsKCQkJaURlYzIgPSAxOwoJCX0KCgl9CgoJaWYgKGlEZWMyIDwgMCkKCXsKCQlmb3IgKGludCBpTnVtID0gMDtpTnVtIDwgYWJzKGlEZWMyKTtpTnVtKyspCgkJewoJCQlzdHJWYWx1ZSA9ICIwIiArIHN0clZhbHVlOwoJCX0KCQlpRGVjMiA9IDA7CgoJfQoJaW50IGlNYXggPSBzdHJWYWx1ZS5HZXRMZW5ndGgoKTsKCWlmIChpRGVjMiA+IGlNYXgpCgl7CgkJZm9yIChpbnQgaU51bSA9IDA7aU51bSA8PSBpRGVjMiAtIGlNYXggO2lOdW0rKykKCQl7CgkJCXN0clZhbHVlICs9ICIwIjsKCQl9CgkJaU1heCA9IGlEZWMyKzE7Cgl9CgkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAvL2ZvciBwcm9jZXNzaW5nIHNlcGVyYXRvciBzdHlsZQoJaWYgKGlEZWMyIDwgaU1heCkKCXsKCQlpZiAoaVNlcFN0eWxlID09IDAgfHwgaVNlcFN0eWxlID09IDEpCgkJewoJCQlzdHJWYWx1ZS5JbnNlcnQoaURlYzIsICcuJyk7CgkJCWlNYXgrKzsKCQl9CgkJZWxzZSBpZiAoaVNlcFN0eWxlID09IDIgfHwgaVNlcFN0eWxlID09IDMpCgkJewoJCQlzdHJWYWx1ZS5JbnNlcnQoaURlYzIsICcsJyk7CgkJCWlNYXgrKzsKCQl9CgoJCWlmIChpRGVjMiA9PSAwKQoJCQlzdHJWYWx1ZS5JbnNlcnQoaURlYzIsICcwJyk7Cgl9CglpZiAoaVNlcFN0eWxlID09IDAgfHwgaVNlcFN0eWxlID09IDIpCgl7CgkJY2hhciBjU2VwZXJhdG9yOwoJCWlmIChpU2VwU3R5bGUgPT0gMCkKCQkJY1NlcGVyYXRvciA9ICcsJzsKCQllbHNlCgkJCWNTZXBlcmF0b3IgPSAnLic7CgoJCWludCBpRGVjUG9zaXRpdmUsaURlY05hZ2F0aXZlOwoJCWlEZWNQb3NpdGl2ZSA9IGlEZWMyOwoJCWlEZWNOYWdhdGl2ZSA9IGlEZWMyOwoKCQlmb3IgKGlEZWNQb3NpdGl2ZSA9IGlEZWMyIC0zOyBpRGVjUG9zaXRpdmUgPiAwO2lEZWNQb3NpdGl2ZSAtPSAzKQoJCXsKCQkJc3RyVmFsdWUuSW5zZXJ0KGlEZWNQb3NpdGl2ZSwgY1NlcGVyYXRvcik7CgkJCWlNYXgrKzsKCQl9Cgl9CgoJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy9mb3IgcHJvY2Vzc2luZyBjdXJyZW5jeSBzdHJpbmcKCglWYWx1ZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoc3RyVmFsdWUpOwoJc3RkOjp3c3RyaW5nIHN0clZhbHVlMiA9IFZhbHVlLmNfc3RyKCk7CgoJaWYgKGJDdXJyZW5jeVByZXBlbmQpCgkJc3RyVmFsdWUyID0gd3N0ckN1cnJlbmN5ICsgc3RyVmFsdWUyOwoJZWxzZQoJCXN0clZhbHVlMiA9IHN0clZhbHVlMiArIHdzdHJDdXJyZW5jeTsKCgoKCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCS8vZm9yIHByb2Nlc3NpbmcgbmVnYXRpdmUgc3R5bGUKCWlmIChiTmFnYXRpdmUpCgl7CgkJaWYgKGlOZWdTdHlsZSA9PSAwKQoJCXsKCQkJc3RyVmFsdWUyLmluc2VydCgwLEwiLSIpOwoJCX0KCQlpZiAoaU5lZ1N0eWxlID09IDIgfHwgaU5lZ1N0eWxlID09IDMpCgkJewoJCQlzdHJWYWx1ZTIuaW5zZXJ0KDAsTCIoIik7CgkJCXN0clZhbHVlMi5pbnNlcnQoc3RyVmFsdWUyLmxlbmd0aCgpLEwiKSIpOwoJCX0KCQlpZiAoaU5lZ1N0eWxlID09IDEgfHwgaU5lZ1N0eWxlID09IDMpCgkJewoJCQlpZiAoRmllbGQgKiBmVGFyZ2V0ID0gcEV2ZW50LT5UYXJnZXRfRmllbGQoKSkKCQkJewoJCQkJQ0pTX0FycmF5IGFyQ29sb3IoaXNvbGF0ZSk7CgkJCQlDSlNfVmFsdWUgdkNvbEVsbShpc29sYXRlKTsKCQkJCXZDb2xFbG0gPSBMIlJHQiI7CgkJCQlhckNvbG9yLlNldEVsZW1lbnQoMCx2Q29sRWxtKTsKCQkJCXZDb2xFbG0gPSAxOwoJCQkJYXJDb2xvci5TZXRFbGVtZW50KDEsdkNvbEVsbSk7CgkJCQl2Q29sRWxtID0gMDsKCQkJCWFyQ29sb3IuU2V0RWxlbWVudCgyLHZDb2xFbG0pOwoKCQkJCWFyQ29sb3IuU2V0RWxlbWVudCgzLHZDb2xFbG0pOwoKCQkJCUNKU19Qcm9wVmFsdWUgdlByb3AoaXNvbGF0ZSk7CgkJCQl2UHJvcC5TdGFydEdldHRpbmcoKTsKCQkJCXZQcm9wPDxhckNvbG9yOwoJCQkJdlByb3AuU3RhcnRTZXR0aW5nKCk7CgkJCQlmVGFyZ2V0LT50ZXh0Q29sb3IoY2MsdlByb3Asc0Vycm9yKTsvLyByZWQKCQkJfQoJCX0KCX0KCWVsc2UKCXsKCQlpZiAoaU5lZ1N0eWxlID09IDEgfHwgaU5lZ1N0eWxlID09IDMpCgkJewoJCQlpZiAoRmllbGQgKmZUYXJnZXQgPSBwRXZlbnQtPlRhcmdldF9GaWVsZCgpKQoJCQl7CgkJCQlDSlNfQXJyYXkgYXJDb2xvcihpc29sYXRlKTsKCQkJCUNKU19WYWx1ZSB2Q29sRWxtKGlzb2xhdGUpOwoJCQkJdkNvbEVsbSA9IEwiUkdCIjsKCQkJCWFyQ29sb3IuU2V0RWxlbWVudCgwLHZDb2xFbG0pOwoJCQkJdkNvbEVsbSA9IDA7CgkJCQlhckNvbG9yLlNldEVsZW1lbnQoMSx2Q29sRWxtKTsKCQkJCWFyQ29sb3IuU2V0RWxlbWVudCgyLHZDb2xFbG0pOwoJCQkJYXJDb2xvci5TZXRFbGVtZW50KDMsdkNvbEVsbSk7CgoJCQkJQ0pTX1Byb3BWYWx1ZSB2UHJvcChpc29sYXRlKTsKCQkJCXZQcm9wLlN0YXJ0R2V0dGluZygpOwoJCQkJZlRhcmdldC0+dGV4dENvbG9yKGNjLHZQcm9wLHNFcnJvcik7CgoJCQkJQ0pTX0FycmF5IGFQcm9wKGlzb2xhdGUpOwoJCQkJdlByb3AuQ29udmVydFRvQXJyYXkoYVByb3ApOwoKCQkJCUNQV0xfQ29sb3IgY3JQcm9wOwoJCQkJQ1BXTF9Db2xvciBjckNvbG9yOwoJCQkJY29sb3I6OkNvbnZlcnRBcnJheVRvUFdMQ29sb3IoYVByb3AsIGNyUHJvcCk7CgkJCQljb2xvcjo6Q29udmVydEFycmF5VG9QV0xDb2xvcihhckNvbG9yLCBjckNvbG9yKTsKCgkJCQlpZiAoY3JDb2xvciAhPSBjclByb3ApCgkJCQl7CgkJCQkJQ0pTX1Byb3BWYWx1ZSB2UHJvcDIoaXNvbGF0ZSk7CgkJCQkJdlByb3AyLlN0YXJ0R2V0dGluZygpOwoJCQkJCXZQcm9wMjw8YXJDb2xvcjsKCQkJCQl2UHJvcDIuU3RhcnRTZXR0aW5nKCk7CiAgICAgCQkJCWZUYXJnZXQtPnRleHRDb2xvcihjYyx2UHJvcDIsc0Vycm9yKTsKCQkJCX0KCQkJfQoJCX0KCX0KCVZhbHVlID0gc3RyVmFsdWUyLmNfc3RyKCk7CiNlbmRpZgogICAgcmV0dXJuIFRSVUU7Cn0KCi8vZnVuY3Rpb24gQUZOdW1iZXJfS2V5c3Ryb2tlKG5EZWMsIHNlcFN0eWxlLCBuZWdTdHlsZSwgY3VyclN0eWxlLCBzdHJDdXJyZW5jeSwgYkN1cnJlbmN5UHJlcGVuZCkKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZOdW1iZXJfS2V5c3Ryb2tlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCnsKICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwogICAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwogICAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOwogICAgQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKCiAgICBpZihwYXJhbXMuc2l6ZSgpIDwgMikKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICBpbnQgaVNlcFN0eWxlID0gcGFyYW1zWzFdLlRvSW50KCk7CgogICAgaWYgKGlTZXBTdHlsZSA8IDAgfHwgaVNlcFN0eWxlID4gMykKICAgICAgICBpU2VwU3R5bGUgPSAwOwogICAgaWYoIXBFdmVudC0+bV9wVmFsdWUpCiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgQ0ZYX1dpZGVTdHJpbmcgJiB2YWwgPSBwRXZlbnQtPlZhbHVlKCk7CiAgICBDRlhfV2lkZVN0cmluZyAmIHdfc3RyQ2hhbmdlID0gcEV2ZW50LT5DaGFuZ2UoKTsKICAgIENGWF9XaWRlU3RyaW5nIHdfc3RyVmFsdWUgPSB2YWw7CgogICAgaWYgKHBFdmVudC0+V2lsbENvbW1pdCgpKQogICAgewogICAgICAgIENGWF9XaWRlU3RyaW5nIHdzdHJDaGFuZ2UgPSB3X3N0ckNoYW5nZTsKICAgICAgICBDRlhfV2lkZVN0cmluZyB3c3RyVmFsdWUgPSBTdHJMVHJpbSh3X3N0clZhbHVlLmNfc3RyKCkpOwogICAgICAgIGlmICh3c3RyVmFsdWUuSXNFbXB0eSgpKQogICAgICAgICAgICByZXR1cm4gVFJVRTsKCiAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3dUZW1wID0gd3N0clZhbHVlOwogICAgICAgIHN3VGVtcC5SZXBsYWNlKEwiLCIsIEwiLiIpOwogICAgICAgIGlmICghSXNOdW1iZXIoc3dUZW1wLmNfc3RyKCkpKQogICAgICAgIHsKICAgICAgICAgICAgcEV2ZW50LT5SYygpID0gRkFMU0U7CiAgICAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTQUZOVU1CRVJfS0VZU1RST0tFKTsKICAgICAgICAgICAgQWxlcnQocENvbnRleHQsIHNFcnJvci5jX3N0cigpKTsKICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBUUlVFOyAvLyBpdCBoYXBwZW5zIGFmdGVyIHRoZSBsYXN0IGtleXN0cm9rZSBhbmQgYmVmb3JlIHZhbGlkYXRpbmcsCiAgICB9CgogICAgc3RkOjp3c3RyaW5nIHdfc3RyVmFsdWUyID0gd19zdHJWYWx1ZS5jX3N0cigpOwogICAgc3RkOjp3c3RyaW5nIHdfc3RyQ2hhbmdlMiA9IHdfc3RyQ2hhbmdlLmNfc3RyKCk7CiAgICBzdGQ6OndzdHJpbmcgd19zdHJTZWxlY3RlZDsKICAgIGlmKC0xICE9IHBFdmVudC0+U2VsU3RhcnQoKSkKICAgICAgICB3X3N0clNlbGVjdGVkID0gd19zdHJWYWx1ZTIuc3Vic3RyKHBFdmVudC0+U2VsU3RhcnQoKSwocEV2ZW50LT5TZWxFbmQoKSAtIHBFdmVudC0+U2VsU3RhcnQoKSkpOwogICAgRlhfQk9PTCBiSGFzU2lnbiA9ICh3X3N0clZhbHVlMi5maW5kKCctJykgIT0gLTEpICYmICh3X3N0clNlbGVjdGVkLmZpbmQoJy0nKSA9PSAtMSk7CiAgICBpZiAoYkhhc1NpZ24pCiAgICB7CiAgICAgICAgLy9jYW4ndCBpbnNlcnQgImNoYW5nZSIgaW4gZnJvbnQgdG8gc2lnbiBwb3N0aW9uLgogICAgICAgIGlmIChwRXZlbnQtPlNlbFN0YXJ0KCkgPT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIEZYX0JPT0wgJmJSYyA9IHBFdmVudC0+UmMoKTsKICAgICAgICAgICAgYlJjID0gRkFMU0U7CiAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgIH0KICAgIH0KCiAgICBjaGFyIGNTZXAgPSBMJy4nOwoKICAgIHN3aXRjaCAoaVNlcFN0eWxlKQogICAgewogICAgY2FzZSAwOgogICAgY2FzZSAxOgogICAgICAgIGNTZXAgPSBMJy4nOwogICAgICAgIGJyZWFrOwogICAgY2FzZSAyOgogICAgY2FzZSAzOgogICAgICAgIGNTZXAgPSBMJywnOwogICAgICAgIGJyZWFrOwogICAgfQoKICAgIEZYX0JPT0wgYkhhc1NlcCA9ICh3X3N0clZhbHVlMi5maW5kKGNTZXApICE9IC0xKTsKICAgIGZvciAoc3RkOjp3c3RyaW5nOjppdGVyYXRvciBpdCA9IHdfc3RyQ2hhbmdlMi5iZWdpbigpOyBpdCAhPSB3X3N0ckNoYW5nZTIuZW5kKCk7IGl0KyspCiAgICB7CiAgICAgICAgaWYgKCppdCA9PSBjU2VwKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGJIYXNTZXApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEZYX0JPT0wgJmJSYyA9IHBFdmVudC0+UmMoKTsKICAgICAgICAgICAgICAgIGJSYyA9IEZBTFNFOwogICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYkhhc1NlcCA9IFRSVUU7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAoKml0ID09IEwnLScpCiAgICAgICAgewogICAgICAgICAgICBpZiAoYkhhc1NpZ24pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEZYX0JPT0wgJmJSYyA9IHBFdmVudC0+UmMoKTsKICAgICAgICAgICAgICAgIGJSYyA9IEZBTFNFOwogICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGl0ICE9IHdfc3RyQ2hhbmdlMi5iZWdpbigpKSAvL3NpZ24ncyBwb3NpdGlvbiBpcyBub3QgY29ycmVjdAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBGWF9CT09MICZiUmMgPSBwRXZlbnQtPlJjKCk7CiAgICAgICAgICAgICAgICBiUmMgPSBGQUxTRTsKICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChwRXZlbnQtPlNlbFN0YXJ0KCkgIT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRlhfQk9PTCAmYlJjID0gcEV2ZW50LT5SYygpOwogICAgICAgICAgICAgICAgYlJjID0gRkFMU0U7CiAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgICAgfQogICAgICAgICAgICBiSGFzU2lnbiA9IFRSVUU7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFJc0RpZ2l0KCppdCkpCiAgICAgICAgewogICAgICAgICAgICBGWF9CT09MICZiUmMgPSBwRXZlbnQtPlJjKCk7CiAgICAgICAgICAgIGJSYyA9IEZBTFNFOwogICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICB9CiAgICB9CgoKICAgIHN0ZDo6d3N0cmluZyB3X3ByZWZpeCA9IHdfc3RyVmFsdWUyLnN1YnN0cigwLHBFdmVudC0+U2VsU3RhcnQoKSk7CiAgICBzdGQ6OndzdHJpbmcgd19wb3N0Zml4OwogICAgaWYgKHBFdmVudC0+U2VsRW5kKCk8KGludCl3X3N0clZhbHVlMi5sZW5ndGgoKSkKICAgICAgICB3X3Bvc3RmaXggID0gd19zdHJWYWx1ZTIuc3Vic3RyKHBFdmVudC0+U2VsRW5kKCkpOwogICAgd19zdHJWYWx1ZTIgPSB3X3ByZWZpeCArIHdfc3RyQ2hhbmdlMiArIHdfcG9zdGZpeDsKICAgIHdfc3RyVmFsdWUgPSB3X3N0clZhbHVlMi5jX3N0cigpOwogICAgdmFsID0gd19zdHJWYWx1ZTsKICAgIHJldHVybiBUUlVFOwoKfQoKLy9mdW5jdGlvbiBBRlBlcmNlbnRfRm9ybWF0KG5EZWMsIHNlcFN0eWxlKQpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlBlcmNlbnRfRm9ybWF0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCnsKI2lmIF9GWF9PU18gIT0gX0ZYX0FORFJPSURfCiAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsKICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKICAgIENKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKICAgIEFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CgogICAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMikKCXsKCQlzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwoJCXJldHVybiBGQUxTRTsKCX0KCWlmKCFwRXZlbnQtPm1fcFZhbHVlKQoJCXJldHVybiBGQUxTRTsKCglDRlhfV2lkZVN0cmluZyYgVmFsdWUgPSBwRXZlbnQtPlZhbHVlKCk7CglDRlhfQnl0ZVN0cmluZyBzdHJWYWx1ZSA9IFN0clRyaW0oQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKFZhbHVlKSk7CglpZiAoc3RyVmFsdWUuSXNFbXB0eSgpKQoJCXJldHVybiBUUlVFOwoKCWludCBpRGVjID0gcGFyYW1zWzBdLlRvSW50KCk7CglpZiAoaURlYyA8IDApCgkJaURlYyA9IC1pRGVjOwoKCWludCBpU2VwU3R5bGUgPSBwYXJhbXNbMV0uVG9JbnQoKTsKCWlmIChpU2VwU3R5bGUgPCAwIHx8IGlTZXBTdHlsZSA+IDMpCgkJaVNlcFN0eWxlID0gMDsKCgkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCS8vZm9yIHByb2Nlc3NpbmcgZGVjaW1hbCBwbGFjZXMKCWRvdWJsZSBkVmFsdWUgPSBhdG9mKHN0clZhbHVlKTsKCWRWYWx1ZSAqPSAxMDA7CglpZiAoaURlYyA+IDApCgkJZFZhbHVlICs9IERPVUJMRV9DT1JSRUNUOy8v0KPV/QoKCWludCBpRGVjMjsKCUZYX0JPT0wgYk5hZ2F0aXZlID0gRkFMU0U7CglzdHJWYWx1ZSA9IGZjdnQoZFZhbHVlLGlEZWMsJmlEZWMyLCZiTmFnYXRpdmUpOwogICAgaWYgKHN0clZhbHVlLklzRW1wdHkoKSkKCXsKCQlkVmFsdWUgPSAwOwoJCXN0clZhbHVlID0gZmN2dChkVmFsdWUsaURlYywmaURlYzIsJmJOYWdhdGl2ZSk7Cgl9CgoJaWYgKGlEZWMyIDwgMCkKCXsKCQlmb3IgKGludCBpTnVtID0gMDsgaU51bSA8IGFicyhpRGVjMik7IGlOdW0rKykKCQl7CgkJCXN0clZhbHVlID0gIjAiICsgc3RyVmFsdWU7CgkJfQoJCWlEZWMyID0gMDsKCgl9CglpbnQgaU1heCA9IHN0clZhbHVlLkdldExlbmd0aCgpOwoJaWYgKGlEZWMyID4gaU1heCkKCXsKCQlmb3IgKGludCBpTnVtID0gMDsgaU51bSA8PSBpRGVjMiAtIGlNYXg7IGlOdW0rKykKCQl7CgkJCXN0clZhbHVlICs9ICIwIjsKCQl9CgkJaU1heCA9IGlEZWMyKzE7Cgl9CgkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAvL2ZvciBwcm9jZXNzaW5nIHNlcGVyYXRvciBzdHlsZQoJaWYgKGlEZWMyIDwgaU1heCkKCXsKCQlpZiAoaVNlcFN0eWxlID09IDAgfHwgaVNlcFN0eWxlID09IDEpCgkJewoJCQlzdHJWYWx1ZS5JbnNlcnQoaURlYzIsICcuJyk7CgkJCWlNYXgrKzsKCQl9CgkJZWxzZSBpZiAoaVNlcFN0eWxlID09IDIgfHwgaVNlcFN0eWxlID09IDMpCgkJewoJCQlzdHJWYWx1ZS5JbnNlcnQoaURlYzIsICcsJyk7CgkJCWlNYXgrKzsKCQl9CgoJCWlmIChpRGVjMiA9PSAwKQoJCQlzdHJWYWx1ZS5JbnNlcnQoaURlYzIsICcwJyk7Cgl9CglpZiAoaVNlcFN0eWxlID09IDAgfHwgaVNlcFN0eWxlID09IDIpCgl7CgkJY2hhciBjU2VwZXJhdG9yOwoJCWlmIChpU2VwU3R5bGUgPT0gMCkKCQkJY1NlcGVyYXRvciA9ICcsJzsKCQllbHNlCgkJCWNTZXBlcmF0b3IgPSAnLic7CgoJCWludCBpRGVjUG9zaXRpdmUsaURlY05hZ2F0aXZlOwoJCWlEZWNQb3NpdGl2ZSA9IGlEZWMyOwoJCWlEZWNOYWdhdGl2ZSA9IGlEZWMyOwoKCQlmb3IgKGlEZWNQb3NpdGl2ZSA9IGlEZWMyIC0zOyBpRGVjUG9zaXRpdmUgPiAwOyBpRGVjUG9zaXRpdmUgLT0gMykKCQl7CgkJCXN0clZhbHVlLkluc2VydChpRGVjUG9zaXRpdmUsY1NlcGVyYXRvcik7CgkJCWlNYXgrKzsKCQl9Cgl9CgkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoJLy9uYWdhdGl2ZSBtYXJrCglpZihiTmFnYXRpdmUpCgkJc3RyVmFsdWUgPSAiLSIgKyBzdHJWYWx1ZTsKCXN0clZhbHVlICs9ICIlIjsKCVZhbHVlID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChzdHJWYWx1ZSk7CiNlbmRpZgogICAgcmV0dXJuIFRSVUU7Cn0KLy9BRlBlcmNlbnRfS2V5c3Ryb2tlKG5EZWMsIHNlcFN0eWxlKQpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlBlcmNlbnRfS2V5c3Ryb2tlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCnsKICAgIHJldHVybiBBRk51bWJlcl9LZXlzdHJva2UoY2MscGFyYW1zLHZSZXQsc0Vycm9yKTsKfQoKLy9mdW5jdGlvbiBBRkRhdGVfRm9ybWF0RXgoY0Zvcm1hdCkKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZEYXRlX0Zvcm1hdEV4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCnsKICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwogICAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwogICAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOwogICAgQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKCiAgICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKQogICAgewogICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQogICAgaWYoIXBFdmVudC0+bV9wVmFsdWUpCiAgICAgICAgcmV0dXJuIEZBTFNFOwoKICAgIENGWF9XaWRlU3RyaW5nJiB2YWwgPSBwRXZlbnQtPlZhbHVlKCk7CiAgICBDRlhfV2lkZVN0cmluZyBzdHJWYWx1ZSA9IHZhbDsKICAgIGlmIChzdHJWYWx1ZS5Jc0VtcHR5KCkpCiAgICAgICAgcmV0dXJuIFRSVUU7CgogICAgQ0ZYX1dpZGVTdHJpbmcgc0Zvcm1hdCA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKTsKICAgIEZYX0JPT0wgYldyb25nRm9ybWF0ID0gRkFMU0U7CiAgICBkb3VibGUgZERhdGUgPSAwLjBmOwoKICAgIGlmKHN0clZhbHVlLkZpbmQoTCJHTVQiKSAhPSAtMSkKICAgIHsKICAgICAgICAvL2ZvciBHTVQgZm9ybWF0IHRpbWUKICAgICAgICAvL3N1Y2ggYXMgIlR1ZSBBdWcgMTEgMTQ6MjQ6MTYgR01UKzA4MDAyMDA5IgogICAgICAgIGREYXRlID0gTWFrZUludGVyRGF0ZShzdHJWYWx1ZSk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgZERhdGUgPSBNYWtlUmVndWxhckRhdGUoc3RyVmFsdWUsc0Zvcm1hdCxiV3JvbmdGb3JtYXQpOwogICAgfQoKICAgIGlmIChKU19Qb3J0SXNOYW4oZERhdGUpKQogICAgewogICAgICAgIENGWF9XaWRlU3RyaW5nIHN3TXNnOwogICAgICAgIHN3TXNnLkZvcm1hdChKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUlNFREFURSkuY19zdHIoKSwgc0Zvcm1hdC5jX3N0cigpKTsKICAgICAgICBBbGVydChwQ29udGV4dCwgc3dNc2cuY19zdHIoKSk7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICAgIHZhbCA9ICBNYWtlRm9ybWF0RGF0ZShkRGF0ZSxzRm9ybWF0KTsKICAgIHJldHVybiBUUlVFOwp9Cgpkb3VibGUgQ0pTX1B1YmxpY01ldGhvZHM6Ok1ha2VJbnRlckRhdGUoQ0ZYX1dpZGVTdHJpbmcgc3RyVmFsdWUpCnsKICAgIGludCBuSG91cjsKICAgIGludCBuTWluOwogICAgaW50IG5TZWM7CiAgICBpbnQgblllYXI7CiAgICBpbnQgbk1vbnRoOwogICAgaW50IG5EYXk7CgogICAgQ0ZYX1dpZGVTdHJpbmdBcnJheSB3c0FycmF5OwogICAgQ0ZYX1dpZGVTdHJpbmcgc01vbnRoID0gTCIiOwogICAgQ0ZYX1dpZGVTdHJpbmcgc1RlbXAgPSBMIiI7CiAgICBpbnQgblNpemUgPSBzdHJWYWx1ZS5HZXRMZW5ndGgoKTsKCiAgICBmb3IoaW50IGkgPSAwOyBpIDwgblNpemU7IGkrKykKICAgIHsKICAgICAgICBGWF9XQ0hBUiBjID0gc3RyVmFsdWUuR2V0QXQoaSk7CiAgICAgICAgaWYoYyA9PSBMJyAnIHx8IGMgPT0gTCc6JykKICAgICAgICB7CiAgICAgICAgICAgIHdzQXJyYXkuQWRkKHNUZW1wKTsKICAgICAgICAgICAgc1RlbXAgPSBMIiI7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgc1RlbXAgKz0gYzsKICAgIH0KCiAgICB3c0FycmF5LkFkZChzVGVtcCk7CiAgICBpZih3c0FycmF5LkdldFNpemUoKSAhPSA4KXJldHVybiAwOwoKICAgIHNUZW1wID0gd3NBcnJheVsxXTsKICAgIGlmKHNUZW1wLkNvbXBhcmUoTCJKYW4iKSA9PSAwKSBuTW9udGggPSAxOwogICAgaWYoc1RlbXAuQ29tcGFyZShMIkZlYiIpID09IDApIG5Nb250aCA9IDI7CiAgICBpZihzVGVtcC5Db21wYXJlKEwiTWFyIikgPT0gMCkgbk1vbnRoID0gMzsKICAgIGlmKHNUZW1wLkNvbXBhcmUoTCJBcHIiKSA9PSAwKSBuTW9udGggPSA0OwogICAgaWYoc1RlbXAuQ29tcGFyZShMIk1heSIpID09IDApIG5Nb250aCA9IDU7CiAgICBpZihzVGVtcC5Db21wYXJlKEwiSnVuIikgPT0gMCkgbk1vbnRoID0gNjsKICAgIGlmKHNUZW1wLkNvbXBhcmUoTCJKdWwiKSA9PSAwKSBuTW9udGggPSA3OwogICAgaWYoc1RlbXAuQ29tcGFyZShMIkF1ZyIpID09IDApIG5Nb250aCA9IDg7CiAgICBpZihzVGVtcC5Db21wYXJlKEwiU2VwIikgPT0gMCkgbk1vbnRoID0gOTsKICAgIGlmKHNUZW1wLkNvbXBhcmUoTCJPY3QiKSA9PSAwKSBuTW9udGggPSAxMDsKICAgIGlmKHNUZW1wLkNvbXBhcmUoTCJOb3YiKSA9PSAwKSBuTW9udGggPSAxMTsKICAgIGlmKHNUZW1wLkNvbXBhcmUoTCJEZWMiKSA9PSAwKSBuTW9udGggPSAxMjsKCiAgICBuRGF5ID0gKGludClQYXJzZVN0cmluZ1RvTnVtYmVyKHdzQXJyYXlbMl0uY19zdHIoKSk7CiAgICBuSG91ciA9IChpbnQpUGFyc2VTdHJpbmdUb051bWJlcih3c0FycmF5WzNdLmNfc3RyKCkpOwogICAgbk1pbiA9IChpbnQpUGFyc2VTdHJpbmdUb051bWJlcih3c0FycmF5WzRdLmNfc3RyKCkpOwogICAgblNlYyA9IChpbnQpUGFyc2VTdHJpbmdUb051bWJlcih3c0FycmF5WzVdLmNfc3RyKCkpOwogICAgblllYXIgPSAoaW50KVBhcnNlU3RyaW5nVG9OdW1iZXIod3NBcnJheVs3XS5jX3N0cigpKTsKCiAgICBkb3VibGUgZFJldCA9IEpTX01ha2VEYXRlKEpTX01ha2VEYXkoblllYXIsbk1vbnRoIC0gMSxuRGF5KSxKU19NYWtlVGltZShuSG91ciwgbk1pbiwgblNlYywgMCkpOwoKICAgIGlmIChKU19Qb3J0SXNOYW4oZFJldCkpCiAgICB7CiAgICAgICAgZFJldCA9IEpTX0RhdGVQYXJzZShzdHJWYWx1ZS5jX3N0cigpKTsKICAgIH0KCiAgICByZXR1cm4gZFJldDsKfQoKLy9BRkRhdGVfS2V5c3Ryb2tlRXgoY0Zvcm1hdCkKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZEYXRlX0tleXN0cm9rZUV4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCnsKICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwogICAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwogICAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOwogICAgQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKCiAgICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKQogICAgewogICAgICAgIHNFcnJvciA9IEwiQUZEYXRlX0tleXN0cm9rZUV4J3MgcGFyYW1ldGVycycgc2l6ZSByIG5vdCBjb3JyZWN0IjsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogICAgaWYgKHBFdmVudC0+V2lsbENvbW1pdCgpKQogICAgewogICAgICAgIGlmKCFwRXZlbnQtPm1fcFZhbHVlKQogICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3RyVmFsdWUgPSBwRXZlbnQtPlZhbHVlKCk7CiAgICAgICAgaWYgKHN0clZhbHVlLklzRW1wdHkoKSkKICAgICAgICAgICAgcmV0dXJuIFRSVUU7CgogICAgICAgIENGWF9XaWRlU3RyaW5nIHNGb3JtYXQgPSBwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKCk7CiAgICAgICAgRlhfQk9PTCBiV3JvbmdGb3JtYXQgPSBGQUxTRTsKICAgICAgICBkb3VibGUgZFJldCA9IE1ha2VSZWd1bGFyRGF0ZShzdHJWYWx1ZSxzRm9ybWF0LGJXcm9uZ0Zvcm1hdCk7CiAgICAgICAgaWYgKGJXcm9uZ0Zvcm1hdCB8fCBKU19Qb3J0SXNOYW4oZFJldCkpCiAgICAgICAgewogICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBzd01zZzsKICAgICAgICAgICAgc3dNc2cuRm9ybWF0KEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSU0VEQVRFKS5jX3N0cigpLCBzRm9ybWF0LmNfc3RyKCkpOwogICAgICAgICAgICBBbGVydChwQ29udGV4dCwgc3dNc2cuY19zdHIoKSk7CiAgICAgICAgICAgIHBFdmVudC0+UmMoKSA9IEZBTFNFOwogICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gVFJVRTsKfQoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZEYXRlX0Zvcm1hdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQp7CiAgICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7CgogICAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKICAgIHsKICAgICAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwogICAgICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKCiAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogICAgaW50IGlJbmRleCA9IHBhcmFtc1swXS5Ub0ludCgpOwogICAgY29uc3QgRlhfV0NIQVIqIGNGb3JtYXRzW10gPSAge0wibS9kIiwgTCJtL2QveXkiLCBMIm1tL2RkL3l5IiwgTCJtbS95eSIsIEwiZC1tbW0iLCBMImQtbW1tLXl5IiwgTCJkZC1tbW0teXkiLAogICAgICAgIEwieXktbW0tZGQiLCBMIm1tbS15eSIsIEwibW1tbS15eSIsIEwibW1tIGQsIHl5eXkiLCBMIm1tbW0gZCwgeXl5eSIsCiAgICAgICAgTCJtL2QveXkgaDpNTSB0dCIsIEwibS9kL3l5IEhIOk1NIiB9OwoKICAgIEFTU0VSVChpSW5kZXggPCBGWF9BcnJheVNpemUoY0Zvcm1hdHMpKTsKCiAgICBpZiAoaUluZGV4IDwgMCkKICAgICAgICBpSW5kZXggPSAwOwogICAgaWYgKGlJbmRleCA+PSBGWF9BcnJheVNpemUoY0Zvcm1hdHMpKQogICAgICAgIGlJbmRleCA9IDA7CiAgICBDSlNfUGFyYW1ldGVycyBuZXdQYXJhbXM7CiAgICBDSlNfVmFsdWUgdmFsKGlzb2xhdGUsY0Zvcm1hdHNbaUluZGV4XSk7CiAgICBuZXdQYXJhbXMucHVzaF9iYWNrKHZhbCk7CiAgICByZXR1cm4gQUZEYXRlX0Zvcm1hdEV4KGNjLG5ld1BhcmFtcyx2UmV0LHNFcnJvcik7Cn0KCi8vQUZEYXRlX0tleXN0cm9rZUV4KGNGb3JtYXQpCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGRGF0ZV9LZXlzdHJva2UoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKewogICAgdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSA6OkdldElzb2xhdGUoY2MpOwoKICAgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCiAgICB7CiAgICAgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKICAgICAgICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CgogICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICAgIGludCBpSW5kZXggPSBwYXJhbXNbMF0uVG9JbnQoKTsKICAgIGNvbnN0IEZYX1dDSEFSKiBjRm9ybWF0c1tdID0gIHtMIm0vZCIsIEwibS9kL3l5IiwgTCJtbS9kZC95eSIsIEwibW0veXkiLCBMImQtbW1tIiwgTCJkLW1tbS15eSIsIEwiZGQtbW1tLXl5IiwKICAgICAgICBMInl5LW1tLWRkIiwgTCJtbW0teXkiLCBMIm1tbW0teXkiLCBMIm1tbSBkLCB5eXl5IiwgTCJtbW1tIGQsIHl5eXkiLAogICAgICAgIEwibS9kL3l5IGg6TU0gdHQiLCBMIm0vZC95eSBISDpNTSIgfTsKCiAgICBBU1NFUlQoaUluZGV4PEZYX0FycmF5U2l6ZShjRm9ybWF0cykpOwoKICAgIGlmIChpSW5kZXggPCAwKQogICAgICAgIGlJbmRleCA9IDA7CiAgICBpZiAoaUluZGV4ID49IEZYX0FycmF5U2l6ZShjRm9ybWF0cykpCiAgICAgICAgaUluZGV4ID0gMDsKICAgIENKU19QYXJhbWV0ZXJzIG5ld1BhcmFtczsKICAgIENKU19WYWx1ZSB2YWwoaXNvbGF0ZSxjRm9ybWF0c1tpSW5kZXhdKTsKICAgIG5ld1BhcmFtcy5wdXNoX2JhY2sodmFsKTsKICAgIHJldHVybiBBRkRhdGVfS2V5c3Ryb2tlRXgoY2MsbmV3UGFyYW1zLHZSZXQsc0Vycm9yKTsKfQoKLy9mdW5jdGlvbiBBRlRpbWVfRm9ybWF0KHB0ZikKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZUaW1lX0Zvcm1hdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQp7CiAgICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7CgogICAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKICAgIHsKICAgICAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwogICAgICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKICAgICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KCiAgICBpbnQgaUluZGV4ID0gcGFyYW1zWzBdLlRvSW50KCk7CiAgICBjb25zdCBGWF9XQ0hBUiogY0Zvcm1hdHNbXSA9IHtMIkhIOk1NIiwgTCJoOk1NIHR0IiwgTCJISDpNTTpzcyIsIEwiaDpNTTpzcyB0dCJ9OwoKICAgIEFTU0VSVChpSW5kZXg8RlhfQXJyYXlTaXplKGNGb3JtYXRzKSk7CgogICAgaWYgKGlJbmRleCA8IDApCiAgICAgICAgaUluZGV4ID0gMDsKICAgIGlmIChpSW5kZXggPj0gRlhfQXJyYXlTaXplKGNGb3JtYXRzKSkKICAgICAgICBpSW5kZXggPSAwOwogICAgQ0pTX1BhcmFtZXRlcnMgbmV3UGFyYW1zOwogICAgQ0pTX1ZhbHVlIHZhbChpc29sYXRlLGNGb3JtYXRzW2lJbmRleF0pOwogICAgbmV3UGFyYW1zLnB1c2hfYmFjayh2YWwpOwogICAgcmV0dXJuIEFGRGF0ZV9Gb3JtYXRFeChjYyxuZXdQYXJhbXMsdlJldCxzRXJyb3IpOwp9CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlRpbWVfS2V5c3Ryb2tlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCnsKICAgIHY4OjpJc29sYXRlKiBpc29sYXRlID0gOjpHZXRJc29sYXRlKGNjKTsKICAgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCiAgICB7CiAgICAgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKICAgICAgICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CiAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogICAgaW50IGlJbmRleCA9IHBhcmFtc1swXS5Ub0ludCgpOwogICAgY29uc3QgRlhfV0NIQVIqIGNGb3JtYXRzW10gPSB7TCJISDpNTSIsIEwiaDpNTSB0dCIsIEwiSEg6TU06c3MiLCBMImg6TU06c3MgdHQifTsKCiAgICBBU1NFUlQoaUluZGV4PEZYX0FycmF5U2l6ZShjRm9ybWF0cykpOwoKICAgIGlmIChpSW5kZXggPCAwKQogICAgICAgIGlJbmRleCA9IDA7CiAgICBpZiAoaUluZGV4ID49IEZYX0FycmF5U2l6ZShjRm9ybWF0cykpCiAgICAgICAgaUluZGV4ID0gMDsKICAgIENKU19QYXJhbWV0ZXJzIG5ld1BhcmFtczsKICAgIENKU19WYWx1ZSB2YWwoaXNvbGF0ZSxjRm9ybWF0c1tpSW5kZXhdKTsKICAgIG5ld1BhcmFtcy5wdXNoX2JhY2sodmFsKTsKICAgIHJldHVybiBBRkRhdGVfS2V5c3Ryb2tlRXgoY2MsbmV3UGFyYW1zLHZSZXQsc0Vycm9yKTsKfQoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZUaW1lX0Zvcm1hdEV4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCnsKICAgIHJldHVybiBBRkRhdGVfRm9ybWF0RXgoY2MscGFyYW1zLHZSZXQsc0Vycm9yKTsKfQoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZUaW1lX0tleXN0cm9rZUV4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCnsKICAgIHJldHVybiBBRkRhdGVfS2V5c3Ryb2tlRXgoY2MscGFyYW1zLHZSZXQsc0Vycm9yKTsKfQoKLy9mdW5jdGlvbiBBRlNwZWNpYWxfRm9ybWF0KHBzZikKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZTcGVjaWFsX0Zvcm1hdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQp7CiAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsKICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKCiAgICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKQogICAgewogICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICAgIHN0ZDo6c3RyaW5nIGNGb3JtYXQ7CiAgICBpbnQgaUluZGV4ID0gcGFyYW1zWzBdLlRvSW50KCk7CgogICAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOwogICAgQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKCiAgICBpZighcEV2ZW50LT5tX3BWYWx1ZSkKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICBDRlhfV2lkZVN0cmluZyYgVmFsdWUgPSBwRXZlbnQtPlZhbHVlKCk7CiAgICBzdGQ6OnN0cmluZyBzdHJTcmMgPSBDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUoVmFsdWUpLmNfc3RyKCk7CgogICAgc3dpdGNoIChpSW5kZXgpCiAgICB7CiAgICBjYXNlIDA6CiAgICAgICAgY0Zvcm1hdCA9ICI5OTk5OSI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIDE6CiAgICAgICAgY0Zvcm1hdCA9ICI5OTk5OS05OTk5IjsKICAgICAgICBicmVhazsKICAgIGNhc2UgMjoKICAgICAgICB7CiAgICAgICAgICAgIHN0ZDo6c3RyaW5nIE51bWJlclN0cjsKICAgICAgICAgICAgdXRpbDo6cHJpbnR4KCI5OTk5OTk5OTk5Iiwgc3RyU3JjLE51bWJlclN0cik7CiAgICAgICAgICAgIGlmIChOdW1iZXJTdHIubGVuZ3RoKCkgPj0gMTAgKQogICAgICAgICAgICAgICAgY0Zvcm1hdCA9ICIoOTk5KSA5OTktOTk5OSI7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGNGb3JtYXQgPSAiOTk5LTk5OTkiOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICBjYXNlIDM6CiAgICAgICAgY0Zvcm1hdCA9ICI5OTktOTktOTk5OSI7CiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgc3RkOjpzdHJpbmcgc3RyRGVzOwogICAgdXRpbDo6cHJpbnR4KGNGb3JtYXQsc3RyU3JjLHN0ckRlcyk7CiAgICBWYWx1ZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoc3RyRGVzLmNfc3RyKCkpOwogICAgcmV0dXJuIFRSVUU7Cn0KCgovL2Z1bmN0aW9uIEFGU3BlY2lhbF9LZXlzdHJva2VFeChtYXNrKQpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlNwZWNpYWxfS2V5c3Ryb2tlRXgoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKewogICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7CiAgICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CiAgICBDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7CgogICAgQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKCiAgICBpZiAocGFyYW1zLnNpemUoKSA8IDEpCiAgICB7CiAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogICAgaWYoIXBFdmVudC0+bV9wVmFsdWUpCiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgQ0ZYX1dpZGVTdHJpbmcmIHZhbEV2ZW50ID0gcEV2ZW50LT5WYWx1ZSgpOwoKICAgIENGWF9XaWRlU3RyaW5nIHdzdHJNYXNrID0gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpOwogICAgaWYgKHdzdHJNYXNrLklzRW1wdHkoKSkKICAgICAgICByZXR1cm4gVFJVRTsKCiAgICBzdGQ6OndzdHJpbmcgd3N0clZhbHVlID0gdmFsRXZlbnQuY19zdHIoKTsKCiAgICBpZiAocEV2ZW50LT5XaWxsQ29tbWl0KCkpCiAgICB7CiAgICAgICAgaWYgKHdzdHJWYWx1ZS5lbXB0eSgpKQogICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICBpbnQgaUluZGV4TWFzayA9IDA7CiAgICAgICAgZm9yIChzdGQ6OndzdHJpbmc6Oml0ZXJhdG9yIGl0ID0gd3N0clZhbHVlLmJlZ2luKCk7IGl0ICE9IHdzdHJWYWx1ZS5lbmQoKTsgaXQrKykKICAgICAgICB7CiAgICAgICAgICAgIHdjaGFyX3Qgd19WYWx1ZSA9ICppdDsKICAgICAgICAgICAgaWYgKCFtYXNrU2F0aXNmaWVkKHdfVmFsdWUsd3N0ck1hc2tbaUluZGV4TWFza10pKQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGlJbmRleE1hc2srKzsKICAgICAgICB9CgogICAgICAgIGlmIChpSW5kZXhNYXNrICE9IHdzdHJNYXNrLkdldExlbmd0aCgpIHx8IChpSW5kZXhNYXNrICE9IHdzdHJWYWx1ZS5zaXplKCkgJiYgd3N0ck1hc2suR2V0TGVuZ3RoKCkgIT0gMCkpCiAgICAgICAgewogICAgICAgICAgICBBbGVydChwQ29udGV4dCwgSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNBRk5VTUJFUl9LRVlTVFJPS0UpLmNfc3RyKCkpOwogICAgICAgICAgICBwRXZlbnQtPlJjKCkgPSBGQUxTRTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFRSVUU7CiAgICB9CgogICAgQ0ZYX1dpZGVTdHJpbmcgJndpZGVDaGFuZ2UgPSBwRXZlbnQtPkNoYW5nZSgpOwogICAgc3RkOjp3c3RyaW5nIHdDaGFuZ2UgPSB3aWRlQ2hhbmdlLmNfc3RyKCk7CiAgICBpZiAod0NoYW5nZS5lbXB0eSgpKQogICAgICAgIHJldHVybiBUUlVFOwoKICAgIGludCBpSW5kZXhNYXNrID0gcEV2ZW50LT5TZWxTdGFydCgpOwoKICAgIGlmICh3c3RyVmFsdWUubGVuZ3RoKCkgLSAocEV2ZW50LT5TZWxFbmQoKS1wRXZlbnQtPlNlbFN0YXJ0KCkpICsgd0NoYW5nZS5sZW5ndGgoKSA+IChGWF9EV09SRCl3c3RyTWFzay5HZXRMZW5ndGgoKSkKICAgIHsKICAgICAgICBBbGVydChwQ29udGV4dCwgSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTV9UT09MT05HKS5jX3N0cigpKTsKICAgICAgICBwRXZlbnQtPlJjKCkgPSBGQUxTRTsKICAgICAgICByZXR1cm4gVFJVRTsKICAgIH0KCiAgICBpZiAoaUluZGV4TWFzayA+PSB3c3RyTWFzay5HZXRMZW5ndGgoKSAmJiAoIXdDaGFuZ2UuZW1wdHkoKSkpCiAgICB7CiAgICAgICAgQWxlcnQocENvbnRleHQsIEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1fVE9PTE9ORykuY19zdHIoKSk7CiAgICAgICAgcEV2ZW50LT5SYygpID0gRkFMU0U7CiAgICAgICAgcmV0dXJuIFRSVUU7CiAgICB9CgogICAgZm9yIChzdGQ6OndzdHJpbmc6Oml0ZXJhdG9yIGl0ID0gd0NoYW5nZS5iZWdpbigpOyBpdCAhPSB3Q2hhbmdlLmVuZCgpOyBpdCsrKQogICAgewogICAgICAgIGlmIChpSW5kZXhNYXNrID49IHdzdHJNYXNrLkdldExlbmd0aCgpKQogICAgICAgIHsKICAgICAgICAgICAgQWxlcnQocENvbnRleHQsIEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1fVE9PTE9ORykuY19zdHIoKSk7CiAgICAgICAgICAgIHBFdmVudC0+UmMoKSA9IEZBTFNFOwogICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICB9CiAgICAgICAgd2NoYXJfdCB3X01hc2sgPSB3c3RyTWFza1tpSW5kZXhNYXNrXTsKICAgICAgICBpZiAoIWlzUmVzZXJ2ZWRNYXNrQ2hhcih3X01hc2spKQogICAgICAgIHsKICAgICAgICAgICAgKml0ID0gd19NYXNrOwogICAgICAgIH0KICAgICAgICB3Y2hhcl90IHdfQ2hhbmdlID0gKml0OwogICAgICAgIGlmICghbWFza1NhdGlzZmllZCh3X0NoYW5nZSx3X01hc2spKQogICAgICAgIHsKICAgICAgICAgICAgcEV2ZW50LT5SYygpID0gRkFMU0U7CiAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgIH0KICAgICAgICBpSW5kZXhNYXNrKys7CiAgICB9CgogICAgd2lkZUNoYW5nZSA9IHdDaGFuZ2UuY19zdHIoKTsKICAgIHJldHVybiBUUlVFOwp9CgoKLy9mdW5jdGlvbiBBRlNwZWNpYWxfS2V5c3Ryb2tlKHBzZikKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZTcGVjaWFsX0tleXN0cm9rZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQp7CiAgICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7CgogICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7CiAgICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CiAgICBDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7CiAgICBBU1NFUlQocEV2ZW50ICE9IE5VTEwpOwoKICAgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCiAgICB7CiAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogICAgc3RkOjpzdHJpbmcgY0Zvcm1hdDsKICAgIGludCBpSW5kZXggPSBwYXJhbXNbMF0uVG9JbnQoKTsKCiAgICBpZighcEV2ZW50LT5tX3BWYWx1ZSkKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAvL0NKU19WYWx1ZSB2YWwgPSBwRXZlbnQtPlZhbHVlKCk7CiAgICBDRlhfV2lkZVN0cmluZyYgdmFsID0gcEV2ZW50LT5WYWx1ZSgpOwogICAgc3RkOjpzdHJpbmcgc3RyU3JjID0gQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHZhbCkuY19zdHIoKTsKICAgIHN0ZDo6d3N0cmluZyB3c3RyQ2hhbmdlID0gcEV2ZW50LT5DaGFuZ2UoKS5jX3N0cigpOwoKICAgIHN3aXRjaCAoaUluZGV4KQogICAgewogICAgY2FzZSAwOgogICAgICAgIGNGb3JtYXQgPSAiOTk5OTkiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSAxOgogICAgICAgIC8vY0Zvcm1hdCA9ICI5OTk5OS05OTk5IjsKICAgICAgICBjRm9ybWF0ID0gIjk5OTk5OTk5OSI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIDI6CiAgICAgICAgewogICAgICAgICAgICBzdGQ6OnN0cmluZyBOdW1iZXJTdHI7CiAgICAgICAgICAgIHV0aWw6OnByaW50eCgiOTk5OTk5OTk5OSIsIHN0clNyYyxOdW1iZXJTdHIpOwogICAgICAgICAgICBpZiAoc3RyU3JjLmxlbmd0aCgpICsgd3N0ckNoYW5nZS5sZW5ndGgoKSA+IDcgKQogICAgICAgICAgICAgICAgLy9jRm9ybWF0ID0gIig5OTkpIDk5OS05OTk5IjsKICAgICAgICAgICAgICAgIGNGb3JtYXQgPSAiOTk5OTk5OTk5OSI7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIC8vY0Zvcm1hdCA9ICI5OTktOTk5OSI7CiAgICAgICAgICAgICAgICBjRm9ybWF0ID0gIjk5OTk5OTkiOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICBjYXNlIDM6CiAgICAgICAgLy9jRm9ybWF0ID0gIjk5OS05OS05OTk5IjsKICAgICAgICBjRm9ybWF0ID0gIjk5OTk5OTk5OSI7CiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgQ0pTX1BhcmFtZXRlcnMgcGFyYW1zMjsKICAgIENKU19WYWx1ZSB2TWFzayhpc29sYXRlLCBjRm9ybWF0LmNfc3RyKCkpOwogICAgcGFyYW1zMi5wdXNoX2JhY2sodk1hc2spOwoKICAgIHJldHVybiBBRlNwZWNpYWxfS2V5c3Ryb2tlRXgoY2MscGFyYW1zMix2UmV0LHNFcnJvcik7Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGTWVyZ2VDaGFuZ2UoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKewogICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7CiAgICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CiAgICBDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnRIYW5kbGVyID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOwogICAgQVNTRVJUKHBFdmVudEhhbmRsZXIgIT0gTlVMTCk7CgogICAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKICAgIHsKICAgICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KCiAgICBDRlhfV2lkZVN0cmluZyBzd1ZhbHVlOwogICAgaWYgKHBFdmVudEhhbmRsZXItPm1fcFZhbHVlICE9IE5VTEwpCiAgICAgICAgc3dWYWx1ZSA9IHBFdmVudEhhbmRsZXItPlZhbHVlKCk7CgogICAgaWYgKHBFdmVudEhhbmRsZXItPldpbGxDb21taXQoKSkKICAgIHsKICAgICAgICB2UmV0ID0gc3dWYWx1ZS5jX3N0cigpOwogICAgICAgIHJldHVybiBUUlVFOwogICAgfQoKICAgIENGWF9XaWRlU3RyaW5nIHByZWZpeCxwb3N0Zml4OwoKICAgIGlmIChwRXZlbnRIYW5kbGVyLT5TZWxTdGFydCgpID49IDApCiAgICAgICAgcHJlZml4ID0gc3dWYWx1ZS5NaWQoMCxwRXZlbnRIYW5kbGVyLT5TZWxTdGFydCgpKTsKICAgIGVsc2UKICAgICAgICBwcmVmaXggPSBMIiI7CgoKICAgIGlmIChwRXZlbnRIYW5kbGVyLT5TZWxFbmQoKSA+PSAwICYmIHBFdmVudEhhbmRsZXItPlNlbEVuZCgpIDw9IHN3VmFsdWUuR2V0TGVuZ3RoKCkpCiAgICAgICAgcG9zdGZpeCA9IHN3VmFsdWUuTWlkKHBFdmVudEhhbmRsZXItPlNlbEVuZCgpLCBzd1ZhbHVlLkdldExlbmd0aCgpIC0gcEV2ZW50SGFuZGxlci0+U2VsRW5kKCkpOwogICAgZWxzZSBwb3N0Zml4ID0gTCIiOwoKICAgIHZSZXQgPSAocHJlZml4ICsgcEV2ZW50SGFuZGxlci0+Q2hhbmdlKCkgKyBwb3N0Zml4KS5jX3N0cigpOwoKICAgIHJldHVybiBUUlVFOwp9CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlBhcnNlRGF0ZUV4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCnsKICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwogICAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwoKICAgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDIpCiAgICB7CiAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogICAgQ0ZYX1dpZGVTdHJpbmcgc1ZhbHVlID0gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpOwogICAgQ0ZYX1dpZGVTdHJpbmcgc0Zvcm1hdCA9IHBhcmFtc1sxXS5Ub0NGWFdpZGVTdHJpbmcoKTsKCiAgICBGWF9CT09MIGJXcm9uZ0Zvcm1hdCA9IEZBTFNFOwogICAgZG91YmxlIGREYXRlID0gTWFrZVJlZ3VsYXJEYXRlKHNWYWx1ZSxzRm9ybWF0LGJXcm9uZ0Zvcm1hdCk7CgogICAgaWYgKEpTX1BvcnRJc05hbihkRGF0ZSkpCiAgICB7CiAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3dNc2c7CiAgICAgICAgc3dNc2cuRm9ybWF0KEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSU0VEQVRFKS5jX3N0cigpLCBzRm9ybWF0LmNfc3RyKCkpOwogICAgICAgIEFsZXJ0KChDSlNfQ29udGV4dCAqKWNjLCBzd01zZy5jX3N0cigpKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogICAgdlJldCA9IGREYXRlOwogICAgcmV0dXJuIFRSVUU7Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGU2ltcGxlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCnsKICAgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDMpCiAgICB7CiAgICAgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7CiAgICAgICAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwoKICAgICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KCiAgICB2UmV0ID0gKGRvdWJsZSlBRl9TaW1wbGUocGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpLmNfc3RyKCksIHBhcmFtc1sxXS5Ub0RvdWJsZSgpLCBwYXJhbXNbMl0uVG9Eb3VibGUoKSk7CiAgICByZXR1cm4gVFJVRTsKfQoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZNYWtlTnVtYmVyKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCnsKICAgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCiAgICB7CiAgICAgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7CiAgICAgICAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwoKICAgICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KICAgIHZSZXQgPSBQYXJzZVN0cmluZ1RvTnVtYmVyKHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKS5jX3N0cigpKTsKICAgIHJldHVybiBUUlVFOwp9CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlNpbXBsZV9DYWxjdWxhdGUoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKewogICAgdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSA6OkdldElzb2xhdGUoY2MpOwoKICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwogICAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwoKICAgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDIpCiAgICB7CiAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogICAgQ0pTX1ZhbHVlIHBhcmFtczEgPSBwYXJhbXNbMV07CgogICAgaWYgKCFwYXJhbXMxLklzQXJyYXlPYmplY3QoKSAmJiBwYXJhbXMxLkdldFR5cGUoKSAhPSBWVF9zdHJpbmcpCiAgICB7CiAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogICAgQ1BERlNES19Eb2N1bWVudCogcFJlYWRlckRvYyA9IHBDb250ZXh0LT5HZXRSZWFkZXJEb2N1bWVudCgpOwogICAgQVNTRVJUKHBSZWFkZXJEb2MgIT0gTlVMTCk7CgogICAgQ1BERlNES19JbnRlckZvcm0qIHBSZWFkZXJJbnRlckZvcm0gPSBwUmVhZGVyRG9jLT5HZXRJbnRlckZvcm0oKTsKICAgIEFTU0VSVChwUmVhZGVySW50ZXJGb3JtICE9IE5VTEwpOwoKICAgIENQREZfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gcFJlYWRlckludGVyRm9ybS0+R2V0SW50ZXJGb3JtKCk7CiAgICBBU1NFUlQocEludGVyRm9ybSAhPSBOVUxMKTsKCiAgICBkb3VibGUgZFZhbHVlOwogICAgQ0ZYX1dpZGVTdHJpbmcgc0Z1bmN0aW9uID0gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpOwogICAgaWYgKHdjc2NtcChzRnVuY3Rpb24uY19zdHIoKSwgTCJQUkQiKSA9PSAwKQogICAgICAgIGRWYWx1ZSA9IDEuMDsKICAgIGVsc2UKICAgICAgICBkVmFsdWUgPSAwLjA7CgogICAgQ0pTX0FycmF5IEZpZWxkTmFtZUFycmF5ID0gQUZfTWFrZUFycmF5RnJvbUxpc3QoaXNvbGF0ZSxwYXJhbXMxKTsKCiAgICBpbnQgbkZpZWxkc0NvdW50ID0gMDsKCiAgICBmb3IgKGludCBpPTAsaXN6PUZpZWxkTmFtZUFycmF5LkdldExlbmd0aCgpOyBpPGlzejsgaSsrKQogICAgewogICAgICAgIENKU19WYWx1ZSBqc1ZhbHVlKGlzb2xhdGUpOwogICAgICAgIEZpZWxkTmFtZUFycmF5LkdldEVsZW1lbnQoaSxqc1ZhbHVlKTsKICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0ZpZWxkTmFtZSA9IGpzVmFsdWUuVG9DRlhXaWRlU3RyaW5nKCk7CgogICAgICAgIGZvciAoaW50IGo9MCxqc3o9cEludGVyRm9ybS0+Q291bnRGaWVsZHMod3NGaWVsZE5hbWUpOyBqPGpzejsgaisrKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gcEludGVyRm9ybS0+R2V0RmllbGQoaiwgd3NGaWVsZE5hbWUpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBkb3VibGUgZFRlbXAgPSAwLjA7CgogICAgICAgICAgICAgICAgc3dpdGNoIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhc2UgRklFTERUWVBFX1RFWFRGSUVMRDoKICAgICAgICAgICAgICAgIGNhc2UgRklFTERUWVBFX0NPTUJPQk9YOgogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZFRlbXAgPSBQYXJzZVN0cmluZ1RvTnVtYmVyKHBGb3JtRmllbGQtPkdldFZhbHVlKCkuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhc2UgRklFTERUWVBFX1BVU0hCVVRUT046CiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBkVGVtcCA9IDAuMDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2FzZSBGSUVMRFRZUEVfQ0hFQ0tCT1g6CiAgICAgICAgICAgICAgICBjYXNlIEZJRUxEVFlQRV9SQURJT0JVVFRPTjoKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRUZW1wID0gMC4wOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBjPTAsY3N6PXBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKTsgYzxjc3o7IGMrKykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ3RybCA9IHBGb3JtRmllbGQtPkdldENvbnRyb2woYykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBGb3JtQ3RybC0+SXNDaGVja2VkKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkVGVtcCArPSBQYXJzZVN0cmluZ1RvTnVtYmVyKHBGb3JtQ3RybC0+R2V0RXhwb3J0VmFsdWUoKS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2FzZSBGSUVMRFRZUEVfTElTVEJPWDoKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRUZW1wID0gMC4wOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocEZvcm1GaWVsZC0+Q291bnRTZWxlY3RlZEl0ZW1zKCkgPiAxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZFRlbXAgPSBQYXJzZVN0cmluZ1RvTnVtYmVyKHBGb3JtRmllbGQtPkdldFZhbHVlKCkuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGkgPT0gMCAmJiBqID09IDAgJiYgKHdjc2NtcChzRnVuY3Rpb24uY19zdHIoKSwgTCJNSU4iKSA9PSAwIHx8IHdjc2NtcChzRnVuY3Rpb24uY19zdHIoKSwgTCJNQVgiKSA9PSAwKSkKICAgICAgICAgICAgICAgICAgICBkVmFsdWUgPSBkVGVtcDsKCiAgICAgICAgICAgICAgICBkVmFsdWUgPSBBRl9TaW1wbGUoc0Z1bmN0aW9uLmNfc3RyKCksIGRWYWx1ZSwgZFRlbXApOwoKICAgICAgICAgICAgICAgIG5GaWVsZHNDb3VudCsrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGlmICh3Y3NjbXAoc0Z1bmN0aW9uLmNfc3RyKCksIEwiQVZHIikgPT0gMCAmJiBuRmllbGRzQ291bnQgPiAwKQogICAgICAgIGRWYWx1ZSAvPSBuRmllbGRzQ291bnQ7CgogICAgZFZhbHVlID0gKGRvdWJsZSlmbG9vcihkVmFsdWUgKiBGWFNZU19wb3coKGRvdWJsZSkxMCwoZG91YmxlKTYpICsgMC40OSkgLyBGWFNZU19wb3coKGRvdWJsZSkxMCwoZG91YmxlKTYpOwogICAgQ0pTX1ZhbHVlIGpzVmFsdWUoaXNvbGF0ZSxkVmFsdWUpOwogICAgaWYoKENKU19FdmVudEhhbmRsZXIqKXBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKS0+bV9wVmFsdWUpCiAgICAgICAgKChDSlNfRXZlbnRIYW5kbGVyKilwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCkpLT5WYWx1ZSgpID0ganNWYWx1ZS5Ub0NGWFdpZGVTdHJpbmcoKTsKCiAgICByZXR1cm4gVFJVRTsKfQoKLyogVGhpcyBmdW5jdGlvbiB2YWxpZGF0ZXMgdGhlIGN1cnJlbnQgZXZlbnQgdG8gZW5zdXJlIHRoYXQgaXRzIHZhbHVlIGlzCioqIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHJhbmdlLiAqLwoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZSYW5nZV9WYWxpZGF0ZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQp7CiAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsKICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKICAgIENKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKICAgIEFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CgogICAgaWYgKHBhcmFtcy5zaXplKCkgIT0gNCkKICAgIHsKICAgICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KCiAgICBpZighcEV2ZW50LT5tX3BWYWx1ZSkKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICBpZiAocEV2ZW50LT5WYWx1ZSgpLklzRW1wdHkoKSApCiAgICAgICAgcmV0dXJuIFRSVUU7CiAgICBkb3VibGUgZEVlbnRWYWx1ZSA9IGF0b2YoQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHBFdmVudC0+VmFsdWUoKSkpOwogICAgRlhfQk9PTCBiR3JlYXRlclRoYW4gPSBwYXJhbXNbMF0uVG9Cb29sKCk7CiAgICBkb3VibGUgZEdyZWF0ZXJUaGFuID0gcGFyYW1zWzFdLlRvRG91YmxlKCk7CiAgICBGWF9CT09MIGJMZXNzVGhhbiA9IHBhcmFtc1syXS5Ub0Jvb2woKTsKICAgIGRvdWJsZSBkTGVzc1RoYW4gPSBwYXJhbXNbM10uVG9Eb3VibGUoKTsKICAgIENGWF9XaWRlU3RyaW5nIHN3TXNnOwoKICAgIGlmIChiR3JlYXRlclRoYW4gJiYgYkxlc3NUaGFuKQogICAgewogICAgICAgIGlmIChkRWVudFZhbHVlIDwgZEdyZWF0ZXJUaGFuIHx8IGRFZW50VmFsdWUgPiBkTGVzc1RoYW4pCiAgICAgICAgICAgIHN3TXNnLkZvcm1hdChKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1JBTkdFMSkuY19zdHIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtc1sxXS5Ub0NGWFdpZGVTdHJpbmcoKS5jX3N0cigpLAogICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zWzNdLlRvQ0ZYV2lkZVN0cmluZygpLmNfc3RyKCkpOwogICAgfQogICAgZWxzZSBpZiAoYkdyZWF0ZXJUaGFuKQogICAgewogICAgICAgIGlmIChkRWVudFZhbHVlIDwgZEdyZWF0ZXJUaGFuKQogICAgICAgICAgICBzd01zZy5Gb3JtYXQoSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNSQU5HRTIpLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXNbMV0uVG9DRlhXaWRlU3RyaW5nKCkuY19zdHIoKSk7CiAgICB9CiAgICBlbHNlIGlmIChiTGVzc1RoYW4pCiAgICB7CiAgICAgICAgaWYgKGRFZW50VmFsdWUgPiBkTGVzc1RoYW4pCiAgICAgICAgICAgIHN3TXNnLkZvcm1hdChKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1JBTkdFMykuY19zdHIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtc1szXS5Ub0NGWFdpZGVTdHJpbmcoKS5jX3N0cigpKTsKICAgIH0KCiAgICBpZiAoIXN3TXNnLklzRW1wdHkoKSkKICAgIHsKICAgICAgICBBbGVydChwQ29udGV4dCwgc3dNc2cuY19zdHIoKSk7CiAgICAgICAgcEV2ZW50LT5SYygpID0gRkFMU0U7CiAgICB9CiAgICByZXR1cm4gVFJVRTsKfQoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZFeHRyYWN0TnVtcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQp7CiAgICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7CiAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwogICAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwoKICAgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCiAgICB7CiAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogICAgQ0pTX0FycmF5IG51bXMoaXNvbGF0ZSk7CgogICAgQ0ZYX1dpZGVTdHJpbmcgc3RyID0gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpOwogICAgQ0ZYX1dpZGVTdHJpbmcgc1BhcnQ7CgogICAgaWYgKHN0ci5HZXRBdCgwKSA9PSBMJy4nIHx8IHN0ci5HZXRBdCgwKSA9PSBMJywnKQogICAgICAgIHN0ciA9IEwiMCIgKyBzdHI7CgogICAgaW50IG5JbmRleCA9IDA7CiAgICBmb3IgKGludCBpPTAsIHN6PXN0ci5HZXRMZW5ndGgoKTsgaTxzejsgaSsrKQogICAgewogICAgICAgIEZYX1dDSEFSIHdjID0gc3RyLkdldEF0KGkpOwogICAgICAgIGlmIChJc0RpZ2l0KCh3Y2hhcl90KXdjKSkKICAgICAgICB7CiAgICAgICAgICAgIHNQYXJ0ICs9IHdjOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBpZiAoc1BhcnQuR2V0TGVuZ3RoKCkgPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBudW1zLlNldEVsZW1lbnQobkluZGV4LENKU19WYWx1ZShpc29sYXRlLHNQYXJ0LmNfc3RyKCkpKTsKICAgICAgICAgICAgICAgIHNQYXJ0ID0gTCIiOwogICAgICAgICAgICAgICAgbkluZGV4ICsrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGlmIChzUGFydC5HZXRMZW5ndGgoKSA+IDApCiAgICB7CiAgICAgICAgbnVtcy5TZXRFbGVtZW50KG5JbmRleCxDSlNfVmFsdWUoaXNvbGF0ZSxzUGFydC5jX3N0cigpKSk7CiAgICB9CgogICAgaWYgKG51bXMuR2V0TGVuZ3RoKCkgPiAwKQogICAgICAgIHZSZXQgPSBudW1zOwogICAgZWxzZQogICAgICAgIHZSZXQuU2V0TnVsbCgpOwoKICAgIHJldHVybiBUUlVFOwp9Cg==