LyoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIENvcHlyaWdodCAoQykgMTk5Ni0xOTk5LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCAgICAqCiogb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqLwoKLyoKKiBGaWxlIGNvbGVpdHIuY3BwCioKKiAKKgoqIENyZWF0ZWQgYnk6IEhlbGVuYSBTaGloCioKKiBNb2RpZmljYXRpb24gSGlzdG9yeToKKgoqICBEYXRlICAgICAgTmFtZSAgICAgICAgRGVzY3JpcHRpb24KKgoqICA2LzIzLzk3ICAgaGVsZW5hICAgICAgQWRkaW5nIGNvbW1lbnRzIHRvIG1ha2UgY29kZSBtb3JlIHJlYWRhYmxlLgoqIDA4LzAzLzk4ICAgZXJtICAgICAgICAgU3luY2hlZCB3aXRoIDEuMiB2ZXJzaW9uIG9mIENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvci5qYXZhCiogMTIvMTAvOTkgICBhbGl1ICAgICAgICBQb3J0ZWQgVGhhaSBjb2xsYXRpb24gc3VwcG9ydCBmcm9tIEphdmEuCiogMDEvMjUvMDEgICBzd3F1ZWsgICAgICBNb2RpZmllZCB0byBhIEMrKyB3cmFwcGVyIGNhbGxpbmcgQyBBUElzICh1Y29saXRlci5oKQoqIDAyLzE5LzAxICAgc3dxdWVrICAgICAgUmVtb3ZlZCBDb2xsYXRpb25FbGVtZW50c0l0ZXJhdG9yKCkgc2luY2UgaXQgaXMgCiogICAgICAgICAgICAgICAgICAgICAgICBwcml2YXRlIGNvbnN0cnVjdG9yIGFuZCBubyBjYWxscyBhcmUgbWFkZSB0byBpdAoqLwoKI2luY2x1ZGUgInVuaWNvZGUvY29sZWl0ci5oIgojaW5jbHVkZSAidWNvbF9pbXAuaCIKI2luY2x1ZGUgImNtZW1vcnkuaCIKCgovKiBDb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKiBzeW53ZWUgOiBwdWJsaWMgY2FuJ3QgcmVtb3ZlICovCmludDMyX3QgY29uc3QgQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yOjpOVUxMT1JERVIgPSAweGZmZmZmZmZmOwoKLyogQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yIHB1YmxpYyBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yIC0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yOjpDb2xsYXRpb25FbGVtZW50SXRlcmF0b3IoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yJiBvdGhlcikgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBpc0RhdGFPd25lZF8oVFJVRSkKewogIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOwogIG1fZGF0YV8gPSB1Y29sX29wZW5FbGVtZW50cyhvdGhlci5tX2RhdGFfLT5pdGVyYXRvcmRhdGFfLmNvbGwsIE5VTEwsIDAsICZzdGF0dXMpOwogICp0aGlzID0gb3RoZXI7Cn0KCkNvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcjo6fkNvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcigpCnsKICBpZiAoaXNEYXRhT3duZWRfKSB7CiAgICB1Y29sX2Nsb3NlRWxlbWVudHMobV9kYXRhXyk7CiAgfQp9CgovKiBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3IgcHVibGljIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgpVVGV4dE9mZnNldCBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3I6OmdldE9mZnNldCgpIGNvbnN0CnsKICByZXR1cm4gdWNvbF9nZXRPZmZzZXQobV9kYXRhXyk7Cn0KCi8qKgoqIEdldCB0aGUgb3JkZXJpbmcgcHJpb3JpdHkgb2YgdGhlIG5leHQgY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcuCiogQHJldHVybiB0aGUgbmV4dCBjaGFyYWN0ZXIncyBvcmRlcmluZy4gUmV0dXJucyBOVUxMT1JERVIgaWYgYW4gZXJyb3IgaGFzIAoqICAgICAgICAgb2NjdXJlZCBvciBpZiB0aGUgZW5kIG9mIHN0cmluZyBoYXMgYmVlbiByZWFjaGVkCiovCmludDMyX3QgQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yOjpuZXh0KFVFcnJvckNvZGUmIHN0YXR1cykKewogIHJldHVybiB1Y29sX25leHQobV9kYXRhXywgJnN0YXR1cyk7Cn0KClVCb29sIENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcjo6b3BlcmF0b3IhPSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvciYgb3RoZXIpIGNvbnN0CnsKICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7Cn0KClVCb29sIENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcjo6b3BlcmF0b3I9PSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yJiB0aGF0KSBjb25zdAp7CiAgaWYgKHRoaXMgPT0gJnRoYXQpCiAgICByZXR1cm4gVFJVRTsKICAKICBpZiAobV9kYXRhXyA9PSB0aGF0Lm1fZGF0YV8pCiAgICByZXR1cm4gVFJVRTsKICAKICByZXR1cm4gKHRoaXMtPm1fZGF0YV8tPm5vcm1hbGl6YXRpb25fID09IHRoYXQubV9kYXRhXy0+bm9ybWFsaXphdGlvbl8gJiYKICAgIHRoaXMtPm1fZGF0YV8tPmxlbmd0aF8gPT0gdGhhdC5tX2RhdGFfLT5sZW5ndGhfICYmCiAgICB0aGlzLT5tX2RhdGFfLT5yZXNldF8gID09IHRoYXQubV9kYXRhXy0+cmVzZXRfICYmCiAgICB1cHJ2X21lbWNtcCh0aGlzLT5tX2RhdGFfLT5pdGVyYXRvcmRhdGFfLnN0cmluZywgCiAgICAgICAgICAgICAgICB0aGF0Lm1fZGF0YV8tPml0ZXJhdG9yZGF0YV8uc3RyaW5nLAogICAgICAgICAgICAgICAgdGhpcy0+bV9kYXRhXy0+bGVuZ3RoXykgPT0gMCAmJgogICAgdGhpcy0+Z2V0T2Zmc2V0KCkgPT0gdGhhdC5nZXRPZmZzZXQoKSAmJiAgCiAgICB0aGlzLT5tX2RhdGFfLT5pdGVyYXRvcmRhdGFfLmlzVGhhaSA9PSB0aGF0Lm1fZGF0YV8tPml0ZXJhdG9yZGF0YV8uaXNUaGFpICYmCiAgICB0aGlzLT5tX2RhdGFfLT5pdGVyYXRvcmRhdGFfLmNvbGwgPT0gdGhhdC5tX2RhdGFfLT5pdGVyYXRvcmRhdGFfLmNvbGwpOwp9CgovKioKKiBHZXQgdGhlIG9yZGVyaW5nIHByaW9yaXR5IG9mIHRoZSBwcmV2aW91cyBjb2xsYXRpb24gZWxlbWVudCBpbiB0aGUgc3RyaW5nLgoqIEBwYXJhbSBzdGF0dXMgdGhlIGVycm9yIGNvZGUgc3RhdHVzLgoqIEByZXR1cm4gdGhlIHByZXZpb3VzIGVsZW1lbnQncyBvcmRlcmluZy4gUmV0dXJucyBOVUxMT1JERVIgaWYgYW4gZXJyb3IgaGFzIAoqICAgICAgICAgb2NjdXJlZCBvciBpZiB0aGUgc3RhcnQgb2Ygc3RyaW5nIGhhcyBiZWVuIHJlYWNoZWQuCiovCmludDMyX3QgQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yOjpwcmV2aW91cyhVRXJyb3JDb2RlJiBzdGF0dXMpCnsKICByZXR1cm4gdWNvbF9wcmV2aW91cyhtX2RhdGFfLCAmc3RhdHVzKTsKfQoKLyoqCiogUmVzZXRzIHRoZSBjdXJzb3IgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyaW5nLgoqLwp2b2lkIENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcjo6cmVzZXQoKQp7CiAgdWNvbF9yZXNldChtX2RhdGFfKTsKfQoKdm9pZCBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3I6OnNldE9mZnNldChVVGV4dE9mZnNldCBuZXdPZmZzZXQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVFcnJvckNvZGUmIHN0YXR1cykKewogIHVjb2xfc2V0T2Zmc2V0KG1fZGF0YV8sIG5ld09mZnNldCwgJnN0YXR1cyk7Cn0KCi8qKgoqIFNldHMgdGhlIHNvdXJjZSB0byB0aGUgbmV3IHNvdXJjZSBzdHJpbmcuCiovCnZvaWQgQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yOjpzZXRUZXh0KGNvbnN0IFVuaWNvZGVTdHJpbmcmIHNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSYgc3RhdHVzKQp7CiAgaWYgKFVfRkFJTFVSRShzdGF0dXMpKQogICAgcmV0dXJuOwogIGludDMyX3QgbGVuZ3RoID0gc291cmNlLmxlbmd0aCgpOwogIFVDaGFyICpzdHJpbmcgPSBuZXcgVUNoYXJbbGVuZ3RoXTsKICBzb3VyY2UuZXh0cmFjdCgwLCBsZW5ndGgsIHN0cmluZyk7CgkKICBtX2RhdGFfLT5sZW5ndGhfID0gbGVuZ3RoOwoKICBpZiAobV9kYXRhXy0+aXRlcmF0b3JkYXRhXy5pc1dyaXRhYmxlICYmIAogICAgICBtX2RhdGFfLT5pdGVyYXRvcmRhdGFfLnN0cmluZyAhPSBOVUxMKQogICAgdXBydl9mcmVlKG1fZGF0YV8tPml0ZXJhdG9yZGF0YV8uc3RyaW5nKTsKICBpbml0X2NvbGxJdGVyYXRlKG1fZGF0YV8tPml0ZXJhdG9yZGF0YV8uY29sbCwgc3RyaW5nLCBsZW5ndGgsICZtX2RhdGFfLT5pdGVyYXRvcmRhdGFfLCBUUlVFKTsKfQoKLy8gU2V0cyB0aGUgc291cmNlIHRvIHRoZSBuZXcgY2hhcmFjdGVyIGl0ZXJhdG9yLgp2b2lkIENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcjo6c2V0VGV4dChDaGFyYWN0ZXJJdGVyYXRvciYgc291cmNlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSYgc3RhdHVzKQp7CiAgaWYgKFVfRkFJTFVSRShzdGF0dXMpKSAKICAgIHJldHVybjsKICAgIAogIGludDMyX3QgbGVuZ3RoID0gc291cmNlLmdldExlbmd0aCgpOwogIFVDaGFyICpidWZmZXIgPSBuZXcgVUNoYXJbbGVuZ3RoXTsKICAvKiAKICBVc2luZyB0aGlzIGNvbnN0cnVjdG9yIHdpbGwgcHJldmVudCBidWZmZXIgZnJvbSBiZWluZyByZW1vdmVkIHdoZW4KICBzdHJpbmcgZ2V0cyByZW1vdmVkCiAgKi8KICBVbmljb2RlU3RyaW5nIHN0cmluZzsKICBzb3VyY2UuZ2V0VGV4dChzdHJpbmcpOwogIHN0cmluZy5leHRyYWN0KDAsIGxlbmd0aCwgYnVmZmVyKTsKICBtX2RhdGFfLT5sZW5ndGhfID0gbGVuZ3RoOwoKICBpZiAobV9kYXRhXy0+aXRlcmF0b3JkYXRhXy5pc1dyaXRhYmxlICYmIAogICAgICBtX2RhdGFfLT5pdGVyYXRvcmRhdGFfLnN0cmluZyAhPSBOVUxMKQogICAgdXBydl9mcmVlKG1fZGF0YV8tPml0ZXJhdG9yZGF0YV8uc3RyaW5nKTsKICBpbml0X2NvbGxJdGVyYXRlKG1fZGF0YV8tPml0ZXJhdG9yZGF0YV8uY29sbCwgYnVmZmVyLCBsZW5ndGgsICZtX2RhdGFfLT5pdGVyYXRvcmRhdGFfLCBUUlVFKTsKfQoKaW50MzJfdCBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3I6OnN0cmVuZ3RoT3JkZXIoaW50MzJfdCBvcmRlcikgY29uc3QKewogIFVDb2xsYXRpb25TdHJlbmd0aCBzID0gdWNvbF9nZXRTdHJlbmd0aChtX2RhdGFfLT5pdGVyYXRvcmRhdGFfLmNvbGwpOwogIC8vIE1hc2sgb2ZmIHRoZSB1bndhbnRlZCBkaWZmZXJlbmNlcy4KICBpZiAocyA9PSBVQ09MX1BSSU1BUlkpCiAgICBvcmRlciAmPSBSdWxlQmFzZWRDb2xsYXRvcjo6UFJJTUFSWURJRkZFUkVOQ0VPTkxZOwogIGVsc2UgCiAgICBpZiAocyA9PSBVQ09MX1NFQ09OREFSWSkKICAgICAgb3JkZXIgJj0gUnVsZUJhc2VkQ29sbGF0b3I6OlNFQ09OREFSWURJRkZFUkVOQ0VPTkxZOwogICAgCiAgcmV0dXJuIG9yZGVyOwp9CgovKiBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3IgcHJpdmF0ZSBjb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcnMgLS0tLS0tLS0tLS0tLS0tICovCgovKiAKVGhpcyBwcml2YXRlIG1ldGhvZCB3aWxsIG5ldmVyIGJlIGNhbGxlZCwgYnV0IGl0IG1ha2VzIHRoZSBsaW5rZXIgaGFwcHkKQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yOjpDb2xsYXRpb25FbGVtZW50SXRlcmF0b3IoKSA6IG1fZGF0YV8oMCkKewp9CiovCgpDb2xsYXRpb25FbGVtZW50SXRlcmF0b3I6OkNvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJ1bGVCYXNlZENvbGxhdG9yKiBvcmRlcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaXNEYXRhT3duZWRfKFRSVUUpCnsKICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKICBtX2RhdGFfID0gdWNvbF9vcGVuRWxlbWVudHMob3JkZXItPnVjb2xsYXRvciwgTlVMTCwgMCwgJnN0YXR1cyk7Cn0KCi8qKiAKKiBUaGlzIGlzIHRoZSAicmVhbCIgY29uc3RydWN0b3IgZm9yIHRoaXMgY2xhc3M7IGl0IGNvbnN0cnVjdHMgYW4gaXRlcmF0b3IKKiBvdmVyIHRoZSBzb3VyY2UgdGV4dCB1c2luZyB0aGUgc3BlY2lmaWVkIGNvbGxhdG9yCiovCkNvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcjo6Q29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVuaWNvZGVTdHJpbmcmIHNvdXJjZVRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUnVsZUJhc2VkQ29sbGF0b3IqIG9yZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVFcnJvckNvZGUmIHN0YXR1cykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGlzRGF0YU93bmVkXyhUUlVFKQp7CiAgaWYgKFVfRkFJTFVSRShzdGF0dXMpKQogICAgcmV0dXJuOwogCiAgaW50MzJfdCBsZW5ndGggPSBzb3VyY2VUZXh0Lmxlbmd0aCgpOwogIFVDaGFyICpzdHJpbmcgPSBuZXcgVUNoYXJbbGVuZ3RoXTsKICAvKiAKICBVc2luZyB0aGlzIGNvbnN0cnVjdG9yIHdpbGwgcHJldmVudCBidWZmZXIgZnJvbSBiZWluZyByZW1vdmVkIHdoZW4KICBzdHJpbmcgZ2V0cyByZW1vdmVkCiAgKi8KICBzb3VyY2VUZXh0LmV4dHJhY3QoMCwgbGVuZ3RoLCBzdHJpbmcpOwoKICBtX2RhdGFfID0gdWNvbF9vcGVuRWxlbWVudHMob3JkZXItPnVjb2xsYXRvciwgc3RyaW5nLCBsZW5ndGgsICZzdGF0dXMpOwogIG1fZGF0YV8tPml0ZXJhdG9yZGF0YV8uaXNXcml0YWJsZSA9IFRSVUU7Cn0KCi8qKiAKKiBUaGlzIGlzIHRoZSAicmVhbCIgY29uc3RydWN0b3IgZm9yIHRoaXMgY2xhc3M7IGl0IGNvbnN0cnVjdHMgYW4gaXRlcmF0b3Igb3ZlciAKKiB0aGUgc291cmNlIHRleHQgdXNpbmcgdGhlIHNwZWNpZmllZCBjb2xsYXRvcgoqLwpDb2xsYXRpb25FbGVtZW50SXRlcmF0b3I6OkNvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENoYXJhY3Rlckl0ZXJhdG9yJiBzb3VyY2VUZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUnVsZUJhc2VkQ29sbGF0b3IqIG9yZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSYgc3RhdHVzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBpc0RhdGFPd25lZF8oVFJVRSkKewogIGlmIChVX0ZBSUxVUkUoc3RhdHVzKSkKICAgIHJldHVybjsKICAgIAogIC8vICoqKiogc2hvdWxkIEkganVzdCBkcm9wIHRoaXMgdGVzdD8gKioqKgogIC8qCiAgaWYgKCBzb3VyY2VUZXh0LmVuZEluZGV4KCkgIT0gMCApCiAgewogICAgLy8gQSBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3IgaXMgcmVhbGx5IGEgdHdvLWxheWVyZWQgYmVhc3QuCiAgICAvLyBJbnRlcm5hbGx5IGl0IHVzZXMgYSBOb3JtYWxpemVyIHRvIG11bmdlIHRoZSBzb3VyY2UgdGV4dCBpbnRvIGEgZm9ybSAKICAgIC8vIHdoZXJlIGFsbCAiY29tcG9zZWQiIFVuaWNvZGUgY2hhcmFjdGVycyAoc3VjaCBhcyD8KSBhcmUgc3BsaXQgaW50byBhIAogICAgLy8gbm9ybWFsIGNoYXJhY3RlciBhbmQgYSBjb21iaW5pbmcgYWNjZW50IGNoYXJhY3Rlci4gIAogICAgLy8gQWZ0ZXJ3YXJkLCBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3IgZG9lcyBpdHMgb3duIHByb2Nlc3NpbmcgdG8gaGFuZGxlCiAgICAvLyBleHBhbmRpbmcgYW5kIGNvbnRyYWN0aW5nIGNvbGxhdGlvbiBzZXF1ZW5jZXMsIGlnbm9yYWJsZXMsIGFuZCBzbyBvbi4KICAgIAogICAgTm9ybWFsaXplcjo6RU1vZGUgZGVjb21wID0gb3JkZXItPmdldFN0cmVuZ3RoKCkgPT0gQ29sbGF0b3I6OklERU5USUNBTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBOb3JtYWxpemVyOjpOT19PUCA6IG9yZGVyLT5nZXREZWNvbXBvc2l0aW9uKCk7CiAgICAgIAogICAgdGV4dCA9IG5ldyBOb3JtYWxpemVyKHNvdXJjZVRleHQsIGRlY29tcCk7CiAgICBpZiAodGV4dCA9PSBOVUxMKQogICAgICBzdGF0dXMgPSBVX01FTU9SWV9BTExPQ0FUSU9OX0VSUk9SOyAgICAKICB9CiAgKi8KICBpbnQzMl90IGxlbmd0aCA9IHNvdXJjZVRleHQuZ2V0TGVuZ3RoKCk7CiAgVUNoYXIgKmJ1ZmZlciA9IG5ldyBVQ2hhcltsZW5ndGhdOwogIC8qIAogIFVzaW5nIHRoaXMgY29uc3RydWN0b3Igd2lsbCBwcmV2ZW50IGJ1ZmZlciBmcm9tIGJlaW5nIHJlbW92ZWQgd2hlbgogIHN0cmluZyBnZXRzIHJlbW92ZWQKICAqLwogIFVuaWNvZGVTdHJpbmcgc3RyaW5nKGJ1ZmZlciwgbGVuZ3RoLCBsZW5ndGgpOwogICgoQ2hhcmFjdGVySXRlcmF0b3IgJilzb3VyY2VUZXh0KS5nZXRUZXh0KHN0cmluZyk7CiAgc3RyaW5nLmV4dHJhY3QoMCwgbGVuZ3RoLCBidWZmZXIpOwogIAogIG1fZGF0YV8gPSB1Y29sX29wZW5FbGVtZW50cyhvcmRlci0+dWNvbGxhdG9yLCBidWZmZXIsIGxlbmd0aCwgJnN0YXR1cyk7CiAgbV9kYXRhXy0+aXRlcmF0b3JkYXRhXy5pc1dyaXRhYmxlID0gVFJVRTsKfQoKLyogQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yIHByaXZhdGUgbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKY29uc3QgQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yJiBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3I6Om9wZXJhdG9yPSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3ImIG90aGVyKQp7CiAgaWYgKHRoaXMgIT0gJm90aGVyKQogIHsKICAgIHRoaXMtPm1fZGF0YV8tPm5vcm1hbGl6YXRpb25fID0gb3RoZXIubV9kYXRhXy0+bm9ybWFsaXphdGlvbl87CiAgICB0aGlzLT5tX2RhdGFfLT5sZW5ndGhfICAgICAgICA9IG90aGVyLm1fZGF0YV8tPmxlbmd0aF87CiAgICB0aGlzLT5tX2RhdGFfLT5yZXNldF8gICAgICAgICA9IG90aGVyLm1fZGF0YV8tPnJlc2V0XzsKICAgIAoKICAgIHRoaXMtPm1fZGF0YV8tPml0ZXJhdG9yZGF0YV8uc3RyaW5nICAgPSBvdGhlci5tX2RhdGFfLT5pdGVyYXRvcmRhdGFfLnN0cmluZzsKICAgIHRoaXMtPm1fZGF0YV8tPml0ZXJhdG9yZGF0YV8uc3RhcnQgICAgPSBvdGhlci5tX2RhdGFfLT5pdGVyYXRvcmRhdGFfLnN0YXJ0OwogICAgdGhpcy0+bV9kYXRhXy0+aXRlcmF0b3JkYXRhXy5sZW4gICAgICA9IG90aGVyLm1fZGF0YV8tPml0ZXJhdG9yZGF0YV8ubGVuOwogICAgdGhpcy0+bV9kYXRhXy0+aXRlcmF0b3JkYXRhXy5wb3MgICAgICA9IG90aGVyLm1fZGF0YV8tPml0ZXJhdG9yZGF0YV8ucG9zOwogICAgdGhpcy0+bV9kYXRhXy0+aXRlcmF0b3JkYXRhXy50b1JldHVybiA9IG90aGVyLm1fZGF0YV8tPml0ZXJhdG9yZGF0YV8uQ0VzICsgCiAgICAgICAgICAob3RoZXIubV9kYXRhXy0+aXRlcmF0b3JkYXRhXy50b1JldHVybiAtIG90aGVyLm1fZGF0YV8tPml0ZXJhdG9yZGF0YV8uQ0VzKTsKICAgIHRoaXMtPm1fZGF0YV8tPml0ZXJhdG9yZGF0YV8uQ0Vwb3MgICAgPSBvdGhlci5tX2RhdGFfLT5pdGVyYXRvcmRhdGFfLkNFcyArIAogICAgICAgICAgKG90aGVyLm1fZGF0YV8tPml0ZXJhdG9yZGF0YV8uQ0Vwb3MgLSBvdGhlci5tX2RhdGFfLT5pdGVyYXRvcmRhdGFfLkNFcyk7CiAgICB1cHJ2X21lbWNweSh0aGlzLT5tX2RhdGFfLT5pdGVyYXRvcmRhdGFfLkNFcywgb3RoZXIubV9kYXRhXy0+aXRlcmF0b3JkYXRhXy5DRXMsIAogICAgICAgICAgICAgICAgVUNPTF9FWFBBTkRfQ0VfQlVGRkVSX1NJWkUgKiBzaXplb2YodWludDMyX3QpKTsKICAgIHRoaXMtPm1fZGF0YV8tPml0ZXJhdG9yZGF0YV8uaXNUaGFpICAgPSBvdGhlci5tX2RhdGFfLT5pdGVyYXRvcmRhdGFfLmlzVGhhaTsKICAgIHRoaXMtPm1fZGF0YV8tPml0ZXJhdG9yZGF0YV8uaXNXcml0YWJsZSA9IG90aGVyLm1fZGF0YV8tPml0ZXJhdG9yZGF0YV8uaXNXcml0YWJsZTsKCiAgICB1cHJ2X21lbWNweSh0aGlzLT5tX2RhdGFfLT5pdGVyYXRvcmRhdGFfLnN0YWNrV3JpdGFibGVCdWZmZXIsIAogICAgICAgICAgICAgICAgb3RoZXIubV9kYXRhXy0+aXRlcmF0b3JkYXRhXy5zdGFja1dyaXRhYmxlQnVmZmVyLCAKICAgICAgICAgICAgICAgIFVDT0xfV1JJVEFCTEVfQlVGRkVSX1NJWkUgKiBzaXplb2YoVUNoYXIpKTsKICAgIC8qIHdyaXRhYmxlYnVmZmVyIGlzIG5vdCB1c2VkIGF0IHRoZSBtb21lbnQsIG5vdCB1c2VkICovCiAgICB0aGlzLT5tX2RhdGFfLT5pdGVyYXRvcmRhdGFfLmNvbGwgPSBvdGhlci5tX2RhdGFfLT5pdGVyYXRvcmRhdGFfLmNvbGw7CiAgICB0aGlzLT5pc0RhdGFPd25lZF8gPSBGQUxTRTsKICB9CgogIHJldHVybiAqdGhpczsKfQoKCg==