Lyogcm93LmMgLSBhbiBlbmhhbmNlZCB0dXBsZSBmb3IgZGF0YWJhc2Ugcm93cwogKgogKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMCBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CiAqCiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgogKgogKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAogKiB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCiAqIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCiAqCiAqIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAogKiBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CiAqIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKICoKICogMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKICogICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKICogICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCiAqICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCiAqIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCiAqICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KICogMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KICovCgojaW5jbHVkZSAicm93LmgiCiNpbmNsdWRlICJjdXJzb3IuaCIKI2luY2x1ZGUgInNxbGl0ZWNvbXBhdC5oIgoKdm9pZCBweXNxbGl0ZV9yb3dfZGVhbGxvYyhweXNxbGl0ZV9Sb3cqIHNlbGYpCnsKICAgIFB5X1hERUNSRUYoc2VsZi0+ZGF0YSk7CiAgICBQeV9YREVDUkVGKHNlbGYtPmRlc2NyaXB0aW9uKTsKCiAgICBQeV9UWVBFKHNlbGYpLT50cF9mcmVlKChQeU9iamVjdCopc2VsZik7Cn0KCnN0YXRpYyBQeU9iamVjdCAqCnB5c3FsaXRlX3Jvd19uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKewogICAgcHlzcWxpdGVfUm93ICpzZWxmOwogICAgUHlPYmplY3QqIGRhdGE7CiAgICBweXNxbGl0ZV9DdXJzb3IqIGN1cnNvcjsKCiAgICBhc3NlcnQodHlwZSAhPSBOVUxMICYmIHR5cGUtPnRwX2FsbG9jICE9IE5VTEwpOwoKICAgIGlmICghX1B5QXJnX05vS2V5d29yZHMoIlJvdygpIiwga3dhcmdzKSkKICAgICAgICByZXR1cm4gTlVMTDsKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT08iLCAmY3Vyc29yLCAmZGF0YSkpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgaWYgKCFQeU9iamVjdF9UeXBlQ2hlY2soKFB5T2JqZWN0KiljdXJzb3IsICZweXNxbGl0ZV9DdXJzb3JUeXBlKSkgewogICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJpbnN0YW5jZSBvZiBjdXJzb3IgcmVxdWlyZWQgZm9yIGZpcnN0IGFyZ3VtZW50Iik7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgaWYgKCFQeVR1cGxlX0NoZWNrKGRhdGEpKSB7CiAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgInR1cGxlIHJlcXVpcmVkIGZvciBzZWNvbmQgYXJndW1lbnQiKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICBzZWxmID0gKHB5c3FsaXRlX1JvdyAqKSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKICAgIGlmIChzZWxmID09IE5VTEwpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgUHlfSU5DUkVGKGRhdGEpOwogICAgc2VsZi0+ZGF0YSA9IGRhdGE7CgogICAgUHlfSU5DUkVGKGN1cnNvci0+ZGVzY3JpcHRpb24pOwogICAgc2VsZi0+ZGVzY3JpcHRpb24gPSBjdXJzb3ItPmRlc2NyaXB0aW9uOwoKICAgIHJldHVybiAoUHlPYmplY3QgKikgc2VsZjsKfQoKUHlPYmplY3QqIHB5c3FsaXRlX3Jvd19pdGVtKHB5c3FsaXRlX1Jvdyogc2VsZiwgUHlfc3NpemVfdCBpZHgpCnsKICAgUHlPYmplY3QqIGl0ZW0gPSBQeVR1cGxlX0dldEl0ZW0oc2VsZi0+ZGF0YSwgaWR4KTsKICAgUHlfWElOQ1JFRihpdGVtKTsKICAgcmV0dXJuIGl0ZW07Cn0KClB5T2JqZWN0KiBweXNxbGl0ZV9yb3dfc3Vic2NyaXB0KHB5c3FsaXRlX1Jvdyogc2VsZiwgUHlPYmplY3QqIGlkeCkKewogICAgUHlfc3NpemVfdCBfaWR4OwogICAgY2hhcioga2V5OwogICAgaW50IG5pdGVtcywgaTsKICAgIGNoYXIqIGNvbXBhcmVfa2V5OwoKICAgIGNoYXIqIHAxOwogICAgY2hhciogcDI7CgogICAgUHlPYmplY3QqIGl0ZW07CgogICAgaWYgKFB5SW50X0NoZWNrKGlkeCkpIHsKICAgICAgICBfaWR4ID0gUHlJbnRfQXNMb25nKGlkeCk7CiAgICAgICAgaWYgKF9pZHggPCAwKQogICAgICAgICAgIF9pZHggKz0gUHlUdXBsZV9HRVRfU0laRShzZWxmLT5kYXRhKTsKICAgICAgICBpdGVtID0gUHlUdXBsZV9HZXRJdGVtKHNlbGYtPmRhdGEsIF9pZHgpOwogICAgICAgIFB5X1hJTkNSRUYoaXRlbSk7CiAgICAgICAgcmV0dXJuIGl0ZW07CiAgICB9IGVsc2UgaWYgKFB5TG9uZ19DaGVjayhpZHgpKSB7CiAgICAgICAgX2lkeCA9IFB5TnVtYmVyX0FzU3NpemVfdChpZHgsIFB5RXhjX0luZGV4RXJyb3IpOwogICAgICAgIGlmIChfaWR4ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIGlmIChfaWR4IDwgMCkKICAgICAgICAgICBfaWR4ICs9IFB5VHVwbGVfR0VUX1NJWkUoc2VsZi0+ZGF0YSk7CiAgICAgICAgaXRlbSA9IFB5VHVwbGVfR2V0SXRlbShzZWxmLT5kYXRhLCBfaWR4KTsKICAgICAgICBQeV9YSU5DUkVGKGl0ZW0pOwogICAgICAgIHJldHVybiBpdGVtOwogICAgfSBlbHNlIGlmIChQeVN0cmluZ19DaGVjayhpZHgpKSB7CiAgICAgICAga2V5ID0gUHlTdHJpbmdfQXNTdHJpbmcoaWR4KTsKCiAgICAgICAgbml0ZW1zID0gUHlUdXBsZV9TaXplKHNlbGYtPmRlc2NyaXB0aW9uKTsKCiAgICAgICAgZm9yIChpID0gMDsgaSA8IG5pdGVtczsgaSsrKSB7CiAgICAgICAgICAgIGNvbXBhcmVfa2V5ID0gUHlTdHJpbmdfQXNTdHJpbmcoUHlUdXBsZV9HRVRfSVRFTShQeVR1cGxlX0dFVF9JVEVNKHNlbGYtPmRlc2NyaXB0aW9uLCBpKSwgMCkpOwogICAgICAgICAgICBpZiAoIWNvbXBhcmVfa2V5KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcDEgPSBrZXk7CiAgICAgICAgICAgIHAyID0gY29tcGFyZV9rZXk7CgogICAgICAgICAgICB3aGlsZSAoMSkgewogICAgICAgICAgICAgICAgaWYgKCgqcDEgPT0gKGNoYXIpMCkgfHwgKCpwMiA9PSAoY2hhcikwKSkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICgoKnAxIHwgMHgyMCkgIT0gKCpwMiB8IDB4MjApKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcDErKzsKICAgICAgICAgICAgICAgIHAyKys7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgoKnAxID09IChjaGFyKTApICYmICgqcDIgPT0gKGNoYXIpMCkpIHsKICAgICAgICAgICAgICAgIC8qIGZvdW5kIGl0ZW0gKi8KICAgICAgICAgICAgICAgIGl0ZW0gPSBQeVR1cGxlX0dldEl0ZW0oc2VsZi0+ZGF0YSwgaSk7CiAgICAgICAgICAgICAgICBQeV9JTkNSRUYoaXRlbSk7CiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTsKICAgICAgICAgICAgfQoKICAgICAgICB9CgogICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAiTm8gaXRlbSB3aXRoIHRoYXQga2V5Iik7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9IGVsc2UgaWYgKFB5U2xpY2VfQ2hlY2soaWR4KSkgewogICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAic2xpY2VzIG5vdCBpbXBsZW1lbnRlZCwgeWV0Iik7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9IGVsc2UgewogICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAiSW5kZXggbXVzdCBiZSBpbnQgb3Igc3RyaW5nIik7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9Cn0KClB5X3NzaXplX3QgcHlzcWxpdGVfcm93X2xlbmd0aChweXNxbGl0ZV9Sb3cqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKQp7CiAgICByZXR1cm4gUHlUdXBsZV9HRVRfU0laRShzZWxmLT5kYXRhKTsKfQoKUHlPYmplY3QqIHB5c3FsaXRlX3Jvd19rZXlzKHB5c3FsaXRlX1Jvdyogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpCnsKICAgIFB5T2JqZWN0KiBsaXN0OwogICAgaW50IG5pdGVtcywgaTsKCiAgICBsaXN0ID0gUHlMaXN0X05ldygwKTsKICAgIGlmICghbGlzdCkgewogICAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgbml0ZW1zID0gUHlUdXBsZV9TaXplKHNlbGYtPmRlc2NyaXB0aW9uKTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgbml0ZW1zOyBpKyspIHsKICAgICAgICBpZiAoUHlMaXN0X0FwcGVuZChsaXN0LCBQeVR1cGxlX0dFVF9JVEVNKFB5VHVwbGVfR0VUX0lURU0oc2VsZi0+ZGVzY3JpcHRpb24sIGkpLCAwKSkgIT0gMCkgewogICAgICAgICAgICBQeV9ERUNSRUYobGlzdCk7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gbGlzdDsKfQoKc3RhdGljIGludCBweXNxbGl0ZV9yb3dfcHJpbnQocHlzcWxpdGVfUm93KiBzZWxmLCBGSUxFICpmcCwgaW50IGZsYWdzKQp7CiAgICByZXR1cm4gKCZQeVR1cGxlX1R5cGUpLT50cF9wcmludChzZWxmLT5kYXRhLCBmcCwgZmxhZ3MpOwp9CgpzdGF0aWMgUHlPYmplY3QqIHB5c3FsaXRlX2l0ZXIocHlzcWxpdGVfUm93KiBzZWxmKQp7CiAgICByZXR1cm4gUHlPYmplY3RfR2V0SXRlcihzZWxmLT5kYXRhKTsKfQoKc3RhdGljIGxvbmcgcHlzcWxpdGVfcm93X2hhc2gocHlzcWxpdGVfUm93ICpzZWxmKQp7CiAgICByZXR1cm4gUHlPYmplY3RfSGFzaChzZWxmLT5kZXNjcmlwdGlvbikgXiBQeU9iamVjdF9IYXNoKHNlbGYtPmRhdGEpOwp9CgpzdGF0aWMgUHlPYmplY3QqIHB5c3FsaXRlX3Jvd19yaWNoY29tcGFyZShweXNxbGl0ZV9Sb3cgKnNlbGYsIFB5T2JqZWN0ICpfb3RoZXIsIGludCBvcGlkKQp7CiAgICBpZiAob3BpZCAhPSBQeV9FUSAmJiBvcGlkICE9IFB5X05FKSB7CiAgICAgICAgUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKICAgICAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CiAgICB9CiAgICBpZiAoUHlUeXBlX0lzU3VidHlwZShQeV9UWVBFKF9vdGhlciksICZweXNxbGl0ZV9Sb3dUeXBlKSkgewogICAgICAgIHB5c3FsaXRlX1JvdyAqb3RoZXIgPSAocHlzcWxpdGVfUm93ICopX290aGVyOwogICAgICAgIFB5T2JqZWN0ICpyZXMgPSBQeU9iamVjdF9SaWNoQ29tcGFyZShzZWxmLT5kZXNjcmlwdGlvbiwgb3RoZXItPmRlc2NyaXB0aW9uLCBvcGlkKTsKICAgICAgICBpZiAoKG9waWQgPT0gUHlfRVEgJiYgcmVzID09IFB5X1RydWUpCiAgICAgICAgICAgIHx8IChvcGlkID09IFB5X05FICYmIHJlcyA9PSBQeV9GYWxzZSkpIHsKICAgICAgICAgICAgUHlfREVDUkVGKHJlcyk7CiAgICAgICAgICAgIHJldHVybiBQeU9iamVjdF9SaWNoQ29tcGFyZShzZWxmLT5kYXRhLCBvdGhlci0+ZGF0YSwgb3BpZCk7CiAgICAgICAgfQogICAgfQogICAgUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKICAgIHJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKfQoKUHlNYXBwaW5nTWV0aG9kcyBweXNxbGl0ZV9yb3dfYXNfbWFwcGluZyA9IHsKICAgIC8qIG1wX2xlbmd0aCAgICAgICAgKi8gKGxlbmZ1bmMpcHlzcWxpdGVfcm93X2xlbmd0aCwKICAgIC8qIG1wX3N1YnNjcmlwdCAgICAgKi8gKGJpbmFyeWZ1bmMpcHlzcWxpdGVfcm93X3N1YnNjcmlwdCwKICAgIC8qIG1wX2Fzc19zdWJzY3JpcHQgKi8gKG9iam9iamFyZ3Byb2MpMCwKfTsKCnN0YXRpYyBQeVNlcXVlbmNlTWV0aG9kcyBweXNxbGl0ZV9yb3dfYXNfc2VxdWVuY2UgPSB7CiAgIC8qIHNxX2xlbmd0aCAqLyAgICAgICAgIChsZW5mdW5jKXB5c3FsaXRlX3Jvd19sZW5ndGgsCiAgIC8qIHNxX2NvbmNhdCAqLyAgICAgICAgIDAsCiAgIC8qIHNxX3JlcGVhdCAqLyAgICAgICAgIDAsCiAgIC8qIHNxX2l0ZW0gKi8gICAgICAgICAgIChzc2l6ZWFyZ2Z1bmMpcHlzcWxpdGVfcm93X2l0ZW0sCn07CgoKc3RhdGljIFB5TWV0aG9kRGVmIHB5c3FsaXRlX3Jvd19tZXRob2RzW10gPSB7CiAgICB7ImtleXMiLCAoUHlDRnVuY3Rpb24pcHlzcWxpdGVfcm93X2tleXMsIE1FVEhfTk9BUkdTLAogICAgICAgIFB5RG9jX1NUUigiUmV0dXJucyB0aGUga2V5cyBvZiB0aGUgcm93LiIpfSwKICAgIHtOVUxMLCBOVUxMfQp9OwoKClB5VHlwZU9iamVjdCBweXNxbGl0ZV9Sb3dUeXBlID0gewogICAgICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQogICAgICAgIE1PRFVMRV9OQU1FICIuUm93IiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KICAgICAgICBzaXplb2YocHlzcWxpdGVfUm93KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLwogICAgICAgIChkZXN0cnVjdG9yKXB5c3FsaXRlX3Jvd19kZWFsbG9jLCAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KICAgICAgICAocHJpbnRmdW5jKXB5c3FsaXRlX3Jvd19wcmludCwgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KICAgICAgICAoaGFzaGZ1bmMpcHlzcWxpdGVfcm93X2hhc2gsICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KICAgICAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAvKiB0cF9mbGFncyAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLwogICAgICAgICh0cmF2ZXJzZXByb2MpMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KICAgICAgICAocmljaGNtcGZ1bmMpcHlzcWxpdGVfcm93X3JpY2hjb21wYXJlLCAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCiAgICAgICAgKGdldGl0ZXJmdW5jKXB5c3FsaXRlX2l0ZXIsICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCiAgICAgICAgcHlzcWxpdGVfcm93X21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCn07CgpleHRlcm4gaW50IHB5c3FsaXRlX3Jvd19zZXR1cF90eXBlcyh2b2lkKQp7CiAgICBweXNxbGl0ZV9Sb3dUeXBlLnRwX25ldyA9IHB5c3FsaXRlX3Jvd19uZXc7CiAgICBweXNxbGl0ZV9Sb3dUeXBlLnRwX2FzX21hcHBpbmcgPSAmcHlzcWxpdGVfcm93X2FzX21hcHBpbmc7CiAgICBweXNxbGl0ZV9Sb3dUeXBlLnRwX2FzX3NlcXVlbmNlID0gJnB5c3FsaXRlX3Jvd19hc19zZXF1ZW5jZTsKICAgIHJldHVybiBQeVR5cGVfUmVhZHkoJnB5c3FsaXRlX1Jvd1R5cGUpOwp9Cg==