LyogY2FjaGUgLmMgLSBhIExSVSBjYWNoZQogKgogKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CiAqCiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgogKgogKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAogKiB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCiAqIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCiAqCiAqIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAogKiBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CiAqIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKICoKICogMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKICogICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKICogICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCiAqICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCiAqIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCiAqICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KICogMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KICovCgojaW5jbHVkZSAic3FsaXRlY29tcGF0LmgiCiNpbmNsdWRlICJjYWNoZS5oIgojaW5jbHVkZSA8bGltaXRzLmg+CgovKiBvbmx5IHVzZWQgaW50ZXJuYWxseSAqLwpweXNxbGl0ZV9Ob2RlKiBweXNxbGl0ZV9uZXdfbm9kZShQeU9iamVjdCoga2V5LCBQeU9iamVjdCogZGF0YSkKewogICAgcHlzcWxpdGVfTm9kZSogbm9kZTsKCiAgICBub2RlID0gKHB5c3FsaXRlX05vZGUqKSAocHlzcWxpdGVfTm9kZVR5cGUudHBfYWxsb2MoJnB5c3FsaXRlX05vZGVUeXBlLCAwKSk7CiAgICBpZiAoIW5vZGUpIHsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICBQeV9JTkNSRUYoa2V5KTsKICAgIG5vZGUtPmtleSA9IGtleTsKCiAgICBQeV9JTkNSRUYoZGF0YSk7CiAgICBub2RlLT5kYXRhID0gZGF0YTsKCiAgICBub2RlLT5wcmV2ID0gTlVMTDsKICAgIG5vZGUtPm5leHQgPSBOVUxMOwoKICAgIHJldHVybiBub2RlOwp9Cgp2b2lkIHB5c3FsaXRlX25vZGVfZGVhbGxvYyhweXNxbGl0ZV9Ob2RlKiBzZWxmKQp7CiAgICBQeV9ERUNSRUYoc2VsZi0+a2V5KTsKICAgIFB5X0RFQ1JFRihzZWxmLT5kYXRhKTsKCiAgICBQeV9UWVBFKHNlbGYpLT50cF9mcmVlKChQeU9iamVjdCopc2VsZik7Cn0KCmludCBweXNxbGl0ZV9jYWNoZV9pbml0KHB5c3FsaXRlX0NhY2hlKiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykKewogICAgUHlPYmplY3QqIGZhY3Rvcnk7CiAgICBpbnQgc2l6ZSA9IDEwOwoKICAgIHNlbGYtPmZhY3RvcnkgPSBOVUxMOwoKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xpIiwgJmZhY3RvcnksICZzaXplKSkgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICAvKiBtaW5pbXVtIGNhY2hlIHNpemUgaXMgNSBlbnRyaWVzICovCiAgICBpZiAoc2l6ZSA8IDUpIHsKICAgICAgICBzaXplID0gNTsKICAgIH0KICAgIHNlbGYtPnNpemUgPSBzaXplOwogICAgc2VsZi0+Zmlyc3QgPSBOVUxMOwogICAgc2VsZi0+bGFzdCA9IE5VTEw7CgogICAgc2VsZi0+bWFwcGluZyA9IFB5RGljdF9OZXcoKTsKICAgIGlmICghc2VsZi0+bWFwcGluZykgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICBQeV9JTkNSRUYoZmFjdG9yeSk7CiAgICBzZWxmLT5mYWN0b3J5ID0gZmFjdG9yeTsKCiAgICBzZWxmLT5kZWNyZWZfZmFjdG9yeSA9IDE7CgogICAgcmV0dXJuIDA7Cn0KCnZvaWQgcHlzcWxpdGVfY2FjaGVfZGVhbGxvYyhweXNxbGl0ZV9DYWNoZSogc2VsZikKewogICAgcHlzcWxpdGVfTm9kZSogbm9kZTsKICAgIHB5c3FsaXRlX05vZGUqIGRlbGV0ZV9ub2RlOwoKICAgIGlmICghc2VsZi0+ZmFjdG9yeSkgewogICAgICAgIC8qIGNvbnN0cnVjdG9yIGZhaWxlZCwganVzdCBnZXQgb3V0IG9mIGhlcmUgKi8KICAgICAgICByZXR1cm47CiAgICB9CgogICAgLyogaXRlcmF0ZSBvdmVyIGFsbCBub2RlcyBhbmQgZGVhbGxvY2F0ZSB0aGVtICovCiAgICBub2RlID0gc2VsZi0+Zmlyc3Q7CiAgICB3aGlsZSAobm9kZSkgewogICAgICAgIGRlbGV0ZV9ub2RlID0gbm9kZTsKICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKICAgICAgICBQeV9ERUNSRUYoZGVsZXRlX25vZGUpOwogICAgfQoKICAgIGlmIChzZWxmLT5kZWNyZWZfZmFjdG9yeSkgewogICAgICAgIFB5X0RFQ1JFRihzZWxmLT5mYWN0b3J5KTsKICAgIH0KICAgIFB5X0RFQ1JFRihzZWxmLT5tYXBwaW5nKTsKCiAgICBQeV9UWVBFKHNlbGYpLT50cF9mcmVlKChQeU9iamVjdCopc2VsZik7Cn0KClB5T2JqZWN0KiBweXNxbGl0ZV9jYWNoZV9nZXQocHlzcWxpdGVfQ2FjaGUqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQp7CiAgICBQeU9iamVjdCoga2V5ID0gYXJnczsKICAgIHB5c3FsaXRlX05vZGUqIG5vZGU7CiAgICBweXNxbGl0ZV9Ob2RlKiBwdHI7CiAgICBQeU9iamVjdCogZGF0YTsKCiAgICBub2RlID0gKHB5c3FsaXRlX05vZGUqKVB5RGljdF9HZXRJdGVtKHNlbGYtPm1hcHBpbmcsIGtleSk7CiAgICBpZiAobm9kZSkgewogICAgICAgIC8qIGFuIGVudHJ5IGZvciB0aGlzIGtleSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgY2FjaGUgKi8KCiAgICAgICAgLyogaW5jcmVhc2UgdXNhZ2UgY291bnRlciBvZiB0aGUgbm9kZSBmb3VuZCAqLwogICAgICAgIGlmIChub2RlLT5jb3VudCA8IExPTkdfTUFYKSB7CiAgICAgICAgICAgIG5vZGUtPmNvdW50Kys7CiAgICAgICAgfQoKICAgICAgICAvKiBpZiBuZWNlc3NhcnksIHJlb3JkZXIgZW50cmllcyBpbiB0aGUgY2FjaGUgYnkgc3dhcHBpbmcgcG9zaXRpb25zICovCiAgICAgICAgaWYgKG5vZGUtPnByZXYgJiYgbm9kZS0+Y291bnQgPiBub2RlLT5wcmV2LT5jb3VudCkgewogICAgICAgICAgICBwdHIgPSBub2RlLT5wcmV2OwoKICAgICAgICAgICAgd2hpbGUgKHB0ci0+cHJldiAmJiBub2RlLT5jb3VudCA+IHB0ci0+cHJldi0+Y291bnQpIHsKICAgICAgICAgICAgICAgIHB0ciA9IHB0ci0+cHJldjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKG5vZGUtPm5leHQpIHsKICAgICAgICAgICAgICAgIG5vZGUtPm5leHQtPnByZXYgPSBub2RlLT5wcmV2OwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc2VsZi0+bGFzdCA9IG5vZGUtPnByZXY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG5vZGUtPnByZXYpIHsKICAgICAgICAgICAgICAgIG5vZGUtPnByZXYtPm5leHQgPSBub2RlLT5uZXh0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChwdHItPnByZXYpIHsKICAgICAgICAgICAgICAgIHB0ci0+cHJldi0+bmV4dCA9IG5vZGU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzZWxmLT5maXJzdCA9IG5vZGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG5vZGUtPm5leHQgPSBwdHI7CiAgICAgICAgICAgIG5vZGUtPnByZXYgPSBwdHItPnByZXY7CiAgICAgICAgICAgIGlmICghbm9kZS0+cHJldikgewogICAgICAgICAgICAgICAgc2VsZi0+Zmlyc3QgPSBub2RlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHB0ci0+cHJldiA9IG5vZGU7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICAvKiBUaGVyZSBpcyBubyBlbnRyeSBmb3IgdGhpcyBrZXkgaW4gdGhlIGNhY2hlLCB5ZXQuIFdlJ2xsIGluc2VydCBhIG5ldwogICAgICAgICAqIGVudHJ5IGluIHRoZSBjYWNoZSwgYW5kIG1ha2Ugc3BhY2UgaWYgbmVjZXNzYXJ5IGJ5IHRocm93aW5nIHRoZQogICAgICAgICAqIGxlYXN0IHVzZWQgaXRlbSBvdXQgb2YgdGhlIGNhY2hlLiAqLwoKICAgICAgICBpZiAoUHlEaWN0X1NpemUoc2VsZi0+bWFwcGluZykgPT0gc2VsZi0+c2l6ZSkgewogICAgICAgICAgICBpZiAoc2VsZi0+bGFzdCkgewogICAgICAgICAgICAgICAgbm9kZSA9IHNlbGYtPmxhc3Q7CgogICAgICAgICAgICAgICAgaWYgKFB5RGljdF9EZWxJdGVtKHNlbGYtPm1hcHBpbmcsIHNlbGYtPmxhc3QtPmtleSkgIT0gMCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChub2RlLT5wcmV2KSB7CiAgICAgICAgICAgICAgICAgICAgbm9kZS0+cHJldi0+bmV4dCA9IE5VTEw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzZWxmLT5sYXN0ID0gbm9kZS0+cHJldjsKICAgICAgICAgICAgICAgIG5vZGUtPnByZXYgPSBOVUxMOwoKICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihub2RlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZGF0YSA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihzZWxmLT5mYWN0b3J5LCAiTyIsIGtleSk7CgogICAgICAgIGlmICghZGF0YSkgewogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICB9CgogICAgICAgIG5vZGUgPSBweXNxbGl0ZV9uZXdfbm9kZShrZXksIGRhdGEpOwogICAgICAgIGlmICghbm9kZSkgewogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICB9CiAgICAgICAgbm9kZS0+cHJldiA9IHNlbGYtPmxhc3Q7CgogICAgICAgIFB5X0RFQ1JFRihkYXRhKTsKCiAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtKHNlbGYtPm1hcHBpbmcsIGtleSwgKFB5T2JqZWN0Kilub2RlKSAhPSAwKSB7CiAgICAgICAgICAgIFB5X0RFQ1JFRihub2RlKTsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgfQoKICAgICAgICBpZiAoc2VsZi0+bGFzdCkgewogICAgICAgICAgICBzZWxmLT5sYXN0LT5uZXh0ID0gbm9kZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzZWxmLT5maXJzdCA9IG5vZGU7CiAgICAgICAgfQogICAgICAgIHNlbGYtPmxhc3QgPSBub2RlOwogICAgfQoKICAgIFB5X0lOQ1JFRihub2RlLT5kYXRhKTsKICAgIHJldHVybiBub2RlLT5kYXRhOwp9CgpQeU9iamVjdCogcHlzcWxpdGVfY2FjaGVfZGlzcGxheShweXNxbGl0ZV9DYWNoZSogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCnsKICAgIHB5c3FsaXRlX05vZGUqIHB0cjsKICAgIFB5T2JqZWN0KiBwcmV2a2V5OwogICAgUHlPYmplY3QqIG5leHRrZXk7CiAgICBQeU9iamVjdCogZm10X2FyZ3M7CiAgICBQeU9iamVjdCogdGVtcGxhdGU7CiAgICBQeU9iamVjdCogZGlzcGxheV9zdHI7CgogICAgcHRyID0gc2VsZi0+Zmlyc3Q7CgogICAgd2hpbGUgKHB0cikgewogICAgICAgIGlmIChwdHItPnByZXYpIHsKICAgICAgICAgICAgcHJldmtleSA9IHB0ci0+cHJldi0+a2V5OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHByZXZrZXkgPSBQeV9Ob25lOwogICAgICAgIH0KICAgICAgICBQeV9JTkNSRUYocHJldmtleSk7CgogICAgICAgIGlmIChwdHItPm5leHQpIHsKICAgICAgICAgICAgbmV4dGtleSA9IHB0ci0+bmV4dC0+a2V5OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG5leHRrZXkgPSBQeV9Ob25lOwogICAgICAgIH0KICAgICAgICBQeV9JTkNSRUYobmV4dGtleSk7CgogICAgICAgIGZtdF9hcmdzID0gUHlfQnVpbGRWYWx1ZSgiT09PIiwgcHJldmtleSwgcHRyLT5rZXksIG5leHRrZXkpOwogICAgICAgIGlmICghZm10X2FyZ3MpIHsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgfQogICAgICAgIHRlbXBsYXRlID0gUHlTdHJpbmdfRnJvbVN0cmluZygiJXMgPC0gJXMgLT4lc1xuIik7CiAgICAgICAgaWYgKCF0ZW1wbGF0ZSkgewogICAgICAgICAgICBQeV9ERUNSRUYoZm10X2FyZ3MpOwogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICB9CiAgICAgICAgZGlzcGxheV9zdHIgPSBQeVN0cmluZ19Gb3JtYXQodGVtcGxhdGUsIGZtdF9hcmdzKTsKICAgICAgICBQeV9ERUNSRUYodGVtcGxhdGUpOwogICAgICAgIFB5X0RFQ1JFRihmbXRfYXJncyk7CiAgICAgICAgaWYgKCFkaXNwbGF5X3N0cikgewogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICB9CiAgICAgICAgUHlPYmplY3RfUHJpbnQoZGlzcGxheV9zdHIsIHN0ZG91dCwgUHlfUFJJTlRfUkFXKTsKICAgICAgICBQeV9ERUNSRUYoZGlzcGxheV9zdHIpOwoKICAgICAgICBQeV9ERUNSRUYocHJldmtleSk7CiAgICAgICAgUHlfREVDUkVGKG5leHRrZXkpOwoKICAgICAgICBwdHIgPSBwdHItPm5leHQ7CiAgICB9CgogICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgcmV0dXJuIFB5X05vbmU7Cn0KCnN0YXRpYyBQeU1ldGhvZERlZiBjYWNoZV9tZXRob2RzW10gPSB7CiAgICB7ImdldCIsIChQeUNGdW5jdGlvbilweXNxbGl0ZV9jYWNoZV9nZXQsIE1FVEhfTywKICAgICAgICBQeURvY19TVFIoIkdldHMgYW4gZW50cnkgZnJvbSB0aGUgY2FjaGUgb3IgY2FsbHMgdGhlIGZhY3RvcnkgZnVuY3Rpb24gdG8gcHJvZHVjZSBvbmUuIil9LAogICAgeyJkaXNwbGF5IiwgKFB5Q0Z1bmN0aW9uKXB5c3FsaXRlX2NhY2hlX2Rpc3BsYXksIE1FVEhfTk9BUkdTLAogICAgICAgIFB5RG9jX1NUUigiRm9yIGRlYnVnZ2luZyBvbmx5LiIpfSwKICAgIHtOVUxMLCBOVUxMfQp9OwoKUHlUeXBlT2JqZWN0IHB5c3FsaXRlX05vZGVUeXBlID0gewogICAgICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQogICAgICAgIE1PRFVMRV9OQU1FICJOb2RlIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KICAgICAgICBzaXplb2YocHlzcWxpdGVfTm9kZSksICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLwogICAgICAgIChkZXN0cnVjdG9yKXB5c3FsaXRlX25vZGVfZGVhbGxvYywgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KICAgICAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAvKiB0cF9mbGFncyAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KICAgICAgICAoaW5pdHByb2MpMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCn07CgpQeVR5cGVPYmplY3QgcHlzcWxpdGVfQ2FjaGVUeXBlID0gewogICAgICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQogICAgICAgIE1PRFVMRV9OQU1FICIuQ2FjaGUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KICAgICAgICBzaXplb2YocHlzcWxpdGVfQ2FjaGUpLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLwogICAgICAgIChkZXN0cnVjdG9yKXB5c3FsaXRlX2NhY2hlX2RlYWxsb2MsICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KICAgICAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAvKiB0cF9mbGFncyAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCiAgICAgICAgY2FjaGVfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KICAgICAgICAoaW5pdHByb2MpcHlzcWxpdGVfY2FjaGVfaW5pdCwgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCn07CgpleHRlcm4gaW50IHB5c3FsaXRlX2NhY2hlX3NldHVwX3R5cGVzKHZvaWQpCnsKICAgIGludCByYzsKCiAgICBweXNxbGl0ZV9Ob2RlVHlwZS50cF9uZXcgPSBQeVR5cGVfR2VuZXJpY05ldzsKICAgIHB5c3FsaXRlX0NhY2hlVHlwZS50cF9uZXcgPSBQeVR5cGVfR2VuZXJpY05ldzsKCiAgICByYyA9IFB5VHlwZV9SZWFkeSgmcHlzcWxpdGVfTm9kZVR5cGUpOwogICAgaWYgKHJjIDwgMCkgewogICAgICAgIHJldHVybiByYzsKICAgIH0KCiAgICByYyA9IFB5VHlwZV9SZWFkeSgmcHlzcWxpdGVfQ2FjaGVUeXBlKTsKICAgIHJldHVybiByYzsKfQo=