Lyogcm93LmMgLSBhbiBlbmhhbmNlZCB0dXBsZSBmb3IgZGF0YWJhc2Ugcm93cwogKgogKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMCBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CiAqCiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgogKgogKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAogKiB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCiAqIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCiAqCiAqIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAogKiBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CiAqIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKICoKICogMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKICogICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKICogICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCiAqICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCiAqIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCiAqICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KICogMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KICovCgojaW5jbHVkZSAicm93LmgiCiNpbmNsdWRlICJjdXJzb3IuaCIKI2luY2x1ZGUgInNxbGl0ZWNvbXBhdC5oIgoKdm9pZCBweXNxbGl0ZV9yb3dfZGVhbGxvYyhweXNxbGl0ZV9Sb3cqIHNlbGYpCnsKICAgIFB5X1hERUNSRUYoc2VsZi0+ZGF0YSk7CiAgICBQeV9YREVDUkVGKHNlbGYtPmRlc2NyaXB0aW9uKTsKCiAgICBQeV9UWVBFKHNlbGYpLT50cF9mcmVlKChQeU9iamVjdCopc2VsZik7Cn0KCmludCBweXNxbGl0ZV9yb3dfaW5pdChweXNxbGl0ZV9Sb3cqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKQp7CiAgICBQeU9iamVjdCogZGF0YTsKICAgIHB5c3FsaXRlX0N1cnNvciogY3Vyc29yOwoKICAgIHNlbGYtPmRhdGEgPSAwOwogICAgc2VsZi0+ZGVzY3JpcHRpb24gPSAwOwoKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT08iLCAmY3Vyc29yLCAmZGF0YSkpIHsKICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgaWYgKCFQeU9iamVjdF9Jc0luc3RhbmNlKChQeU9iamVjdCopY3Vyc29yLCAoUHlPYmplY3QqKSZweXNxbGl0ZV9DdXJzb3JUeXBlKSkgewogICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJpbnN0YW5jZSBvZiBjdXJzb3IgcmVxdWlyZWQgZm9yIGZpcnN0IGFyZ3VtZW50Iik7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIGlmICghUHlUdXBsZV9DaGVjayhkYXRhKSkgewogICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJ0dXBsZSByZXF1aXJlZCBmb3Igc2Vjb25kIGFyZ3VtZW50Iik7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIFB5X0lOQ1JFRihkYXRhKTsKICAgIHNlbGYtPmRhdGEgPSBkYXRhOwoKICAgIFB5X0lOQ1JFRihjdXJzb3ItPmRlc2NyaXB0aW9uKTsKICAgIHNlbGYtPmRlc2NyaXB0aW9uID0gY3Vyc29yLT5kZXNjcmlwdGlvbjsKCiAgICByZXR1cm4gMDsKfQoKUHlPYmplY3QqIHB5c3FsaXRlX3Jvd19zdWJzY3JpcHQocHlzcWxpdGVfUm93KiBzZWxmLCBQeU9iamVjdCogaWR4KQp7CiAgICBsb25nIF9pZHg7CiAgICBjaGFyKiBrZXk7CiAgICBpbnQgbml0ZW1zLCBpOwogICAgY2hhciogY29tcGFyZV9rZXk7CgogICAgY2hhciogcDE7CiAgICBjaGFyKiBwMjsKCiAgICBQeU9iamVjdCogaXRlbTsKCiAgICBpZiAoUHlJbnRfQ2hlY2soaWR4KSkgewogICAgICAgIF9pZHggPSBQeUludF9Bc0xvbmcoaWR4KTsKICAgICAgICBpdGVtID0gUHlUdXBsZV9HZXRJdGVtKHNlbGYtPmRhdGEsIF9pZHgpOwogICAgICAgIFB5X1hJTkNSRUYoaXRlbSk7CiAgICAgICAgcmV0dXJuIGl0ZW07CiAgICB9IGVsc2UgaWYgKFB5TG9uZ19DaGVjayhpZHgpKSB7CiAgICAgICAgX2lkeCA9IFB5TG9uZ19Bc0xvbmcoaWR4KTsKICAgICAgICBpdGVtID0gUHlUdXBsZV9HZXRJdGVtKHNlbGYtPmRhdGEsIF9pZHgpOwogICAgICAgIFB5X1hJTkNSRUYoaXRlbSk7CiAgICAgICAgcmV0dXJuIGl0ZW07CiAgICB9IGVsc2UgaWYgKFB5U3RyaW5nX0NoZWNrKGlkeCkpIHsKICAgICAgICBrZXkgPSBQeVN0cmluZ19Bc1N0cmluZyhpZHgpOwoKICAgICAgICBuaXRlbXMgPSBQeVR1cGxlX1NpemUoc2VsZi0+ZGVzY3JpcHRpb24pOwoKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbml0ZW1zOyBpKyspIHsKICAgICAgICAgICAgY29tcGFyZV9rZXkgPSBQeVN0cmluZ19Bc1N0cmluZyhQeVR1cGxlX0dFVF9JVEVNKFB5VHVwbGVfR0VUX0lURU0oc2VsZi0+ZGVzY3JpcHRpb24sIGkpLCAwKSk7CiAgICAgICAgICAgIGlmICghY29tcGFyZV9rZXkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICB9CgogICAgICAgICAgICBwMSA9IGtleTsKICAgICAgICAgICAgcDIgPSBjb21wYXJlX2tleTsKCiAgICAgICAgICAgIHdoaWxlICgxKSB7CiAgICAgICAgICAgICAgICBpZiAoKCpwMSA9PSAoY2hhcikwKSB8fCAoKnAyID09IChjaGFyKTApKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCgqcDEgfCAweDIwKSAhPSAoKnAyIHwgMHgyMCkpIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBwMSsrOwogICAgICAgICAgICAgICAgcDIrKzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCgqcDEgPT0gKGNoYXIpMCkgJiYgKCpwMiA9PSAoY2hhcikwKSkgewogICAgICAgICAgICAgICAgLyogZm91bmQgaXRlbSAqLwogICAgICAgICAgICAgICAgaXRlbSA9IFB5VHVwbGVfR2V0SXRlbShzZWxmLT5kYXRhLCBpKTsKICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihpdGVtKTsKICAgICAgICAgICAgICAgIHJldHVybiBpdGVtOwogICAgICAgICAgICB9CgogICAgICAgIH0KCiAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJObyBpdGVtIHdpdGggdGhhdCBrZXkiKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0gZWxzZSBpZiAoUHlTbGljZV9DaGVjayhpZHgpKSB7CiAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJzbGljZXMgbm90IGltcGxlbWVudGVkLCB5ZXQiKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0gZWxzZSB7CiAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJJbmRleCBtdXN0IGJlIGludCBvciBzdHJpbmciKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KfQoKUHlfc3NpemVfdCBweXNxbGl0ZV9yb3dfbGVuZ3RoKHB5c3FsaXRlX1Jvdyogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpCnsKICAgIHJldHVybiBQeVR1cGxlX0dFVF9TSVpFKHNlbGYtPmRhdGEpOwp9CgpQeU9iamVjdCogcHlzcWxpdGVfcm93X2tleXMocHlzcWxpdGVfUm93KiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykKewogICAgUHlPYmplY3QqIGxpc3Q7CiAgICBpbnQgbml0ZW1zLCBpOwoKICAgIGxpc3QgPSBQeUxpc3RfTmV3KDApOwogICAgaWYgKCFsaXN0KSB7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICBuaXRlbXMgPSBQeVR1cGxlX1NpemUoc2VsZi0+ZGVzY3JpcHRpb24pOwoKICAgIGZvciAoaSA9IDA7IGkgPCBuaXRlbXM7IGkrKykgewogICAgICAgIGlmIChQeUxpc3RfQXBwZW5kKGxpc3QsIFB5VHVwbGVfR0VUX0lURU0oUHlUdXBsZV9HRVRfSVRFTShzZWxmLT5kZXNjcmlwdGlvbiwgaSksIDApKSAhPSAwKSB7CiAgICAgICAgICAgIFB5X0RFQ1JFRihsaXN0KTsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBsaXN0Owp9CgpzdGF0aWMgaW50IHB5c3FsaXRlX3Jvd19wcmludChweXNxbGl0ZV9Sb3cqIHNlbGYsIEZJTEUgKmZwLCBpbnQgZmxhZ3MpCnsKICAgIHJldHVybiAoJlB5VHVwbGVfVHlwZSktPnRwX3ByaW50KHNlbGYtPmRhdGEsIGZwLCBmbGFncyk7Cn0KCnN0YXRpYyBQeU9iamVjdCogcHlzcWxpdGVfaXRlcihweXNxbGl0ZV9Sb3cqIHNlbGYpCnsKICAgIHJldHVybiBQeU9iamVjdF9HZXRJdGVyKHNlbGYtPmRhdGEpOwp9CgpzdGF0aWMgbG9uZyBweXNxbGl0ZV9yb3dfaGFzaChweXNxbGl0ZV9Sb3cgKnNlbGYpCnsKICAgIHJldHVybiBQeU9iamVjdF9IYXNoKHNlbGYtPmRlc2NyaXB0aW9uKSBeIFB5T2JqZWN0X0hhc2goc2VsZi0+ZGF0YSk7Cn0KCnN0YXRpYyBQeU9iamVjdCogcHlzcWxpdGVfcm93X3JpY2hjb21wYXJlKHB5c3FsaXRlX1JvdyAqc2VsZiwgUHlPYmplY3QgKl9vdGhlciwgaW50IG9waWQpCnsKICAgIGlmIChvcGlkICE9IFB5X0VRICYmIG9waWQgIT0gUHlfTkUpIHsKICAgICAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOwogICAgICAgIHJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKICAgIH0KICAgIGlmIChQeVR5cGVfSXNTdWJ0eXBlKFB5X1RZUEUoX290aGVyKSwgJnB5c3FsaXRlX1Jvd1R5cGUpKSB7CiAgICAgICAgcHlzcWxpdGVfUm93ICpvdGhlciA9IChweXNxbGl0ZV9Sb3cgKilfb3RoZXI7CiAgICAgICAgUHlPYmplY3QgKnJlcyA9IFB5T2JqZWN0X1JpY2hDb21wYXJlKHNlbGYtPmRlc2NyaXB0aW9uLCBvdGhlci0+ZGVzY3JpcHRpb24sIG9waWQpOwogICAgICAgIGlmICgob3BpZCA9PSBQeV9FUSAmJiByZXMgPT0gUHlfVHJ1ZSkKICAgICAgICAgICAgfHwgKG9waWQgPT0gUHlfTkUgJiYgcmVzID09IFB5X0ZhbHNlKSkgewogICAgICAgICAgICBQeV9ERUNSRUYocmVzKTsKICAgICAgICAgICAgcmV0dXJuIFB5T2JqZWN0X1JpY2hDb21wYXJlKHNlbGYtPmRhdGEsIG90aGVyLT5kYXRhLCBvcGlkKTsKICAgICAgICB9CiAgICB9CiAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOwogICAgcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOwp9CgpQeU1hcHBpbmdNZXRob2RzIHB5c3FsaXRlX3Jvd19hc19tYXBwaW5nID0gewogICAgLyogbXBfbGVuZ3RoICAgICAgICAqLyAobGVuZnVuYylweXNxbGl0ZV9yb3dfbGVuZ3RoLAogICAgLyogbXBfc3Vic2NyaXB0ICAgICAqLyAoYmluYXJ5ZnVuYylweXNxbGl0ZV9yb3dfc3Vic2NyaXB0LAogICAgLyogbXBfYXNzX3N1YnNjcmlwdCAqLyAob2Jqb2JqYXJncHJvYykwLAp9OwoKc3RhdGljIFB5TWV0aG9kRGVmIHB5c3FsaXRlX3Jvd19tZXRob2RzW10gPSB7CiAgICB7ImtleXMiLCAoUHlDRnVuY3Rpb24pcHlzcWxpdGVfcm93X2tleXMsIE1FVEhfTk9BUkdTLAogICAgICAgIFB5RG9jX1NUUigiUmV0dXJucyB0aGUga2V5cyBvZiB0aGUgcm93LiIpfSwKICAgIHtOVUxMLCBOVUxMfQp9OwoKClB5VHlwZU9iamVjdCBweXNxbGl0ZV9Sb3dUeXBlID0gewogICAgICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQogICAgICAgIE1PRFVMRV9OQU1FICIuUm93IiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KICAgICAgICBzaXplb2YocHlzcWxpdGVfUm93KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLwogICAgICAgIChkZXN0cnVjdG9yKXB5c3FsaXRlX3Jvd19kZWFsbG9jLCAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KICAgICAgICAocHJpbnRmdW5jKXB5c3FsaXRlX3Jvd19wcmludCwgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KICAgICAgICAoaGFzaGZ1bmMpcHlzcWxpdGVfcm93X2hhc2gsICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KICAgICAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAvKiB0cF9mbGFncyAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLwogICAgICAgICh0cmF2ZXJzZXByb2MpMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KICAgICAgICAocmljaGNtcGZ1bmMpcHlzcWxpdGVfcm93X3JpY2hjb21wYXJlLCAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCiAgICAgICAgKGdldGl0ZXJmdW5jKXB5c3FsaXRlX2l0ZXIsICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCiAgICAgICAgcHlzcWxpdGVfcm93X21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KICAgICAgICAoaW5pdHByb2MpcHlzcWxpdGVfcm93X2luaXQsICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCn07CgpleHRlcm4gaW50IHB5c3FsaXRlX3Jvd19zZXR1cF90eXBlcyh2b2lkKQp7CiAgICBweXNxbGl0ZV9Sb3dUeXBlLnRwX25ldyA9IFB5VHlwZV9HZW5lcmljTmV3OwogICAgcHlzcWxpdGVfUm93VHlwZS50cF9hc19tYXBwaW5nID0gJnB5c3FsaXRlX3Jvd19hc19tYXBwaW5nOwogICAgcmV0dXJuIFB5VHlwZV9SZWFkeSgmcHlzcWxpdGVfUm93VHlwZSk7Cn0K