LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiAgICAgIFBlcmwtQ29tcGF0aWJsZSBSZWd1bGFyIEV4cHJlc3Npb25zICAgICAgICoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qClRoaXMgaXMgYSBsaWJyYXJ5IG9mIGZ1bmN0aW9ucyB0byBzdXBwb3J0IHJlZ3VsYXIgZXhwcmVzc2lvbnMgd2hvc2Ugc3ludGF4CmFuZCBzZW1hbnRpY3MgYXJlIGFzIGNsb3NlIGFzIHBvc3NpYmxlIHRvIHRob3NlIG9mIHRoZSBQZXJsIDUgbGFuZ3VhZ2UuIFNlZQp0aGUgZmlsZSBUZWNoLk5vdGVzIGZvciBzb21lIGluZm9ybWF0aW9uIG9uIHRoZSBpbnRlcm5hbHMuCgpXcml0dGVuIGJ5OiBQaGlsaXAgSGF6ZWwgPHBoMTBAY2FtLmFjLnVrPgoKICAgICAgICAgICBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNCBVbml2ZXJzaXR5IG9mIENhbWJyaWRnZQoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cm1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgoKICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgoKICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQogICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgoKICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYW1icmlkZ2Ugbm9yIHRoZSBuYW1lcyBvZiBpdHMKICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KICAgICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KClRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgpBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCklNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCkFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQpMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCkNPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GClNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwpJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgpDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQpBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQpQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKi8KCgovKiBEZWZpbmUgREVCVUcgdG8gZ2V0IGRlYnVnZ2luZyBvdXRwdXQgb24gc3Rkb3V0LiAqLwovKiAjZGVmaW5lIERFQlVHICovCgovKiBVc2UgYSBtYWNybyBmb3IgZGVidWdnaW5nIHByaW50aW5nLCAnY2F1c2UgdGhhdCBlbGltaW5hdGVzIHRoZSB1c2Ugb2YgI2lmZGVmCmlubGluZSwgYW5kIHRoZXJlIGFyZSAqc3RpbGwqIHN0dXBpZCBjb21waWxlcnMgYWJvdXQgdGhhdCBkb24ndCBsaWtlIGluZGVudGVkCnByZS1wcm9jZXNzb3Igc3RhdGVtZW50cy4gSSBzdXBwb3NlIGl0J3Mgb25seSBiZWVuIDEwIHllYXJzLi4uICovCgojaWZkZWYgREVCVUcKI2RlZmluZSBEUFJJTlRGKHApIHByaW50ZiBwCiNlbHNlCiNkZWZpbmUgRFBSSU5URihwKSAvKm5vdGhpbmcqLwojZW5kaWYKCi8qIEluY2x1ZGUgdGhlIGludGVybmFscyBoZWFkZXIsIHdoaWNoIGl0c2VsZiBpbmNsdWRlcyAiY29uZmlnLmgiLCB0aGUgU3RhbmRhcmQKQyBoZWFkZXJzLCBhbmQgdGhlIGV4dGVybmFsIHBjcmUgaGVhZGVyLiAqLwoKI2luY2x1ZGUgImludGVybmFsLmgiCgovKiBJZiBVbmljb2RlIFByb3BlcnR5IHN1cHBvcnQgaXMgd2FudGVkLCBpbmNsdWRlIGEgcHJpdmF0ZSBjb3B5IG9mIHRoZQpmdW5jdGlvbiB0aGF0IGRvZXMgaXQsIGFuZCB0aGUgdGFibGUgdGhhdCB0cmFuc2xhdGVzIG5hbWVzIHRvIG51bWJlcnMuICovCgojaWZkZWYgU1VQUE9SVF9VQ1AKI2luY2x1ZGUgInVjcC5jIgojaW5jbHVkZSAidWNwdHlwZXRhYmxlLmMiCiNlbmRpZgoKLyogTWF4aW11bSBudW1iZXIgb2YgaXRlbXMgb24gdGhlIG5lc3RlZCBicmFja2V0IHN0YWNrcyBhdCBjb21waWxlIHRpbWUuIFRoaXMKYXBwbGllcyB0byB0aGUgbmVzdGluZyBvZiBhbGwga2luZHMgb2YgcGFyZW50aGVzZXMuIEl0IGRvZXMgbm90IGxpbWl0CnVuLW5lc3RlZCwgbm9uLWNhcHR1cmluZyBwYXJlbnRoZXNlcy4gVGhpcyBudW1iZXIgY2FuIGJlIG1hZGUgYmlnZ2VyIGlmCm5lY2Vzc2FyeSAtIGl0IGlzIHVzZWQgdG8gZGltZW5zaW9uIG9uZSBpbnQgYW5kIG9uZSB1bnNpZ25lZCBjaGFyIHZlY3RvciBhdApjb21waWxlIHRpbWUuICovCgojZGVmaW5lIEJSQVNUQUNLX1NJWkUgMjAwCgoKLyogTWF4aW11bSBudW1iZXIgb2YgaW50cyBvZiBvZmZzZXQgdG8gc2F2ZSBvbiB0aGUgc3RhY2sgZm9yIHJlY3Vyc2l2ZSBjYWxscy4KSWYgdGhlIG9mZnNldCB2ZWN0b3IgaXMgYmlnZ2VyLCBtYWxsb2MgaXMgdXNlZC4gVGhpcyBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZiAzLApiZWNhdXNlIHRoZSBvZmZzZXQgdmVjdG9yIGlzIGFsd2F5cyBhIG11bHRpcGxlIG9mIDMgbG9uZy4gKi8KCiNkZWZpbmUgUkVDX1NUQUNLX1NBVkVfTUFYIDMwCgoKLyogVGhlIG1heGltdW0gcmVtYWluaW5nIGxlbmd0aCBvZiBzdWJqZWN0IHdlIGFyZSBwcmVwYXJlZCB0byBzZWFyY2ggZm9yIGEKcmVxX2J5dGUgbWF0Y2guICovCgojZGVmaW5lIFJFUV9CWVRFX01BWCAxMDAwCgoKLyogVGFibGUgb2Ygc2l6ZXMgZm9yIHRoZSBmaXhlZC1sZW5ndGggb3Bjb2Rlcy4gSXQncyBkZWZpbmVkIGluIGEgbWFjcm8gc28gdGhhdAp0aGUgZGVmaW5pdGlvbiBpcyBuZXh0IHRvIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBvcGNvZGVzIGluIGludGVybmFsLmguICovCgpzdGF0aWMgY29uc3QgdXNjaGFyIE9QX2xlbmd0aHNbXSA9IHsgT1BfTEVOR1RIUyB9OwoKLyogTWluIGFuZCBtYXggdmFsdWVzIGZvciB0aGUgY29tbW9uIHJlcGVhdHM7IGZvciB0aGUgbWF4aW1hLCAwID0+IGluZmluaXR5ICovCgpzdGF0aWMgY29uc3QgY2hhciByZXBfbWluW10gPSB7IDAsIDAsIDEsIDEsIDAsIDAgfTsKc3RhdGljIGNvbnN0IGNoYXIgcmVwX21heFtdID0geyAwLCAwLCAwLCAwLCAxLCAxIH07CgovKiBUYWJsZSBmb3IgaGFuZGxpbmcgZXNjYXBlZCBjaGFyYWN0ZXJzIGluIHRoZSByYW5nZSAnMCctJ3onLiBQb3NpdGl2ZSByZXR1cm5zCmFyZSBzaW1wbGUgZGF0YSB2YWx1ZXM7IG5lZ2F0aXZlIHZhbHVlcyBhcmUgZm9yIHNwZWNpYWwgdGhpbmdzIGxpa2UgXGQgYW5kIHNvCm9uLiBaZXJvIG1lYW5zIGZ1cnRoZXIgcHJvY2Vzc2luZyBpcyBuZWVkZWQgKGZvciB0aGluZ3MgbGlrZSBceCksIG9yIHRoZSBlc2NhcGUKaXMgaW52YWxpZC4gKi8KCiNpZiAhRUJDRElDICAgLyogVGhpcyBpcyB0aGUgIm5vcm1hbCIgdGFibGUgZm9yIEFTQ0lJIHN5c3RlbXMgKi8Kc3RhdGljIGNvbnN0IHNob3J0IGludCBlc2NhcGVzW10gPSB7CiAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgIC8qIDAgLSA3ICovCiAgICAgMCwgICAgICAwLCAgICAnOicsICAgICc7JywgICAgJzwnLCAgICAnPScsICAgICc+JywgICAgJz8nLCAgIC8qIDggLSA/ICovCiAgICdAJywgLUVTQ19BLCAtRVNDX0IsIC1FU0NfQywgLUVTQ19ELCAtRVNDX0UsICAgICAgMCwgLUVTQ19HLCAgIC8qIEAgLSBHICovCiAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgIC8qIEggLSBPICovCi1FU0NfUCwgLUVTQ19RLCAgICAgIDAsIC1FU0NfUywgICAgICAwLCAgICAgIDAsICAgICAgMCwgLUVTQ19XLCAgIC8qIFAgLSBXICovCi1FU0NfWCwgICAgICAwLCAtRVNDX1osICAgICdbJywgICAnXFwnLCAgICAnXScsICAgICdeJywgICAgJ18nLCAgIC8qIFggLSBfICovCiAgICdgJywgICAgICA3LCAtRVNDX2IsICAgICAgMCwgLUVTQ19kLCAgRVNDX2UsICBFU0NfZiwgICAgICAwLCAgIC8qIGAgLSBnICovCiAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICBFU0NfbiwgICAgICAwLCAgIC8qIGggLSBvICovCi1FU0NfcCwgICAgICAwLCAgRVNDX3IsIC1FU0NfcywgIEVTQ190ZWUsICAgIDAsICAgICAgMCwgLUVTQ193LCAgIC8qIHAgLSB3ICovCiAgICAgMCwgICAgICAwLCAtRVNDX3ogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHggLSB6ICovCn07CgojZWxzZSAgICAgICAgIC8qIFRoaXMgaXMgdGhlICJhYm5vcm1hbCIgdGFibGUgZm9yIEVCQ0RJQyBzeXN0ZW1zICovCnN0YXRpYyBjb25zdCBzaG9ydCBpbnQgZXNjYXBlc1tdID0gewovKiAgNDggKi8gICAgIDAsICAgICAwLCAgICAgIDAsICAgICAnLicsICAgICc8JywgICAnKCcsICAgICcrJywgICAgJ3wnLAovKiAgNTAgKi8gICAnJicsICAgICAwLCAgICAgIDAsICAgICAgIDAsICAgICAgMCwgICAgIDAsICAgICAgMCwgICAgICAwLAovKiAgNTggKi8gICAgIDAsICAgICAwLCAgICAnIScsICAgICAnJCcsICAgICcqJywgICAnKScsICAgICc7JywgICAgJ34nLAovKiAgNjAgKi8gICAnLScsICAgJy8nLCAgICAgIDAsICAgICAgIDAsICAgICAgMCwgICAgIDAsICAgICAgMCwgICAgICAwLAovKiAgNjggKi8gICAgIDAsICAgICAwLCAgICAnfCcsICAgICAnLCcsICAgICclJywgICAnXycsICAgICc+JywgICAgJz8nLAovKiAgNzAgKi8gICAgIDAsICAgICAwLCAgICAgIDAsICAgICAgIDAsICAgICAgMCwgICAgIDAsICAgICAgMCwgICAgICAwLAovKiAgNzggKi8gICAgIDAsICAgJ2AnLCAgICAnOicsICAgICAnIycsICAgICdAJywgICdcJycsICAgICc9JywgICAgJyInLAovKiAgODAgKi8gICAgIDAsICAgICA3LCAtRVNDX2IsICAgICAgIDAsIC1FU0NfZCwgRVNDX2UsICBFU0NfZiwgICAgICAwLAovKiAgODggKi8gICAgIDAsICAgICAwLCAgICAgIDAsICAgICAneycsICAgICAgMCwgICAgIDAsICAgICAgMCwgICAgICAwLAovKiAgOTAgKi8gICAgIDAsICAgICAwLCAgICAgIDAsICAgICAnbCcsICAgICAgMCwgRVNDX24sICAgICAgMCwgLUVTQ19wLAovKiAgOTggKi8gICAgIDAsIEVTQ19yLCAgICAgIDAsICAgICAnfScsICAgICAgMCwgICAgIDAsICAgICAgMCwgICAgICAwLAovKiAgQTAgKi8gICAgIDAsICAgJ34nLCAtRVNDX3MsIEVTQ190ZWUsICAgICAgMCwgICAgIDAsIC1FU0NfdywgICAgICAwLAovKiAgQTggKi8gICAgIDAsLUVTQ196LCAgICAgIDAsICAgICAgIDAsICAgICAgMCwgICAnWycsICAgICAgMCwgICAgICAwLAovKiAgQjAgKi8gICAgIDAsICAgICAwLCAgICAgIDAsICAgICAgIDAsICAgICAgMCwgICAgIDAsICAgICAgMCwgICAgICAwLAovKiAgQjggKi8gICAgIDAsICAgICAwLCAgICAgIDAsICAgICAgIDAsICAgICAgMCwgICAnXScsICAgICc9JywgICAgJy0nLAovKiAgQzAgKi8gICAneycsLUVTQ19BLCAtRVNDX0IsICAtRVNDX0MsIC1FU0NfRCwtRVNDX0UsICAgICAgMCwgLUVTQ19HLAovKiAgQzggKi8gICAgIDAsICAgICAwLCAgICAgIDAsICAgICAgIDAsICAgICAgMCwgICAgIDAsICAgICAgMCwgICAgICAwLAovKiAgRDAgKi8gICAnfScsICAgICAwLCAgICAgIDAsICAgICAgIDAsICAgICAgMCwgICAgIDAsICAgICAgMCwgLUVTQ19QLAovKiAgRDggKi8tRVNDX1EsICAgICAwLCAgICAgIDAsICAgICAgIDAsICAgICAgMCwgICAgIDAsICAgICAgMCwgICAgICAwLAovKiAgRTAgKi8gICdcXCcsICAgICAwLCAtRVNDX1MsICAgICAgIDAsICAgICAgMCwgICAgIDAsIC1FU0NfVywgLUVTQ19YLAovKiAgRTggKi8gICAgIDAsLUVTQ19aLCAgICAgIDAsICAgICAgIDAsICAgICAgMCwgICAgIDAsICAgICAgMCwgICAgICAwLAovKiAgRjAgKi8gICAgIDAsICAgICAwLCAgICAgIDAsICAgICAgIDAsICAgICAgMCwgICAgIDAsICAgICAgMCwgICAgICAwLAovKiAgRjggKi8gICAgIDAsICAgICAwLCAgICAgIDAsICAgICAgIDAsICAgICAgMCwgICAgIDAsICAgICAgMCwgICAgICAwCn07CiNlbmRpZgoKCi8qIFRhYmxlcyBvZiBuYW1lcyBvZiBQT1NJWCBjaGFyYWN0ZXIgY2xhc3NlcyBhbmQgdGhlaXIgbGVuZ3Rocy4gVGhlIGxpc3QgaXMKdGVybWluYXRlZCBieSBhIHplcm8gbGVuZ3RoIGVudHJ5LiBUaGUgZmlyc3QgdGhyZWUgbXVzdCBiZSBhbHBoYSwgdXBwZXIsIGxvd2VyLAphcyB0aGlzIGlzIGFzc3VtZWQgZm9yIGhhbmRsaW5nIGNhc2UgaW5kZXBlbmRlbmNlLiAqLwoKc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHBvc2l4X25hbWVzW10gPSB7CiAgImFscGhhIiwgImxvd2VyIiwgInVwcGVyIiwKICAiYWxudW0iLCAiYXNjaWkiLCAiYmxhbmsiLCAiY250cmwiLCAiZGlnaXQiLCAiZ3JhcGgiLAogICJwcmludCIsICJwdW5jdCIsICJzcGFjZSIsICJ3b3JkIiwgICJ4ZGlnaXQiIH07CgpzdGF0aWMgY29uc3QgdXNjaGFyIHBvc2l4X25hbWVfbGVuZ3Roc1tdID0gewogIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDQsIDYsIDAgfTsKCi8qIFRhYmxlIG9mIGNsYXNzIGJpdCBtYXBzIGZvciBlYWNoIFBPU0lYIGNsYXNzOyB1cCB0byB0aHJlZSBtYXkgYmUgY29tYmluZWQKdG8gZm9ybSB0aGUgY2xhc3MuIFRoZSB0YWJsZSBmb3IgWzpibGFuazpdIGlzIGR5bmFtaWNhbGx5IG1vZGlmaWVkIHRvIHJlbW92ZQp0aGUgdmVydGljYWwgc3BhY2UgY2hhcmFjdGVycy4gKi8KCnN0YXRpYyBjb25zdCBpbnQgcG9zaXhfY2xhc3NfbWFwc1tdID0gewogIGNiaXRfbG93ZXIsIGNiaXRfdXBwZXIsIC0xLCAgICAgICAgICAgICAvKiBhbHBoYSAqLwogIGNiaXRfbG93ZXIsIC0xLCAgICAgICAgIC0xLCAgICAgICAgICAgICAvKiBsb3dlciAqLwogIGNiaXRfdXBwZXIsIC0xLCAgICAgICAgIC0xLCAgICAgICAgICAgICAvKiB1cHBlciAqLwogIGNiaXRfZGlnaXQsIGNiaXRfbG93ZXIsIGNiaXRfdXBwZXIsICAgICAvKiBhbG51bSAqLwogIGNiaXRfcHJpbnQsIGNiaXRfY250cmwsIC0xLCAgICAgICAgICAgICAvKiBhc2NpaSAqLwogIGNiaXRfc3BhY2UsIC0xLCAgICAgICAgIC0xLCAgICAgICAgICAgICAvKiBibGFuayAtIGEgR05VIGV4dGVuc2lvbiAqLwogIGNiaXRfY250cmwsIC0xLCAgICAgICAgIC0xLCAgICAgICAgICAgICAvKiBjbnRybCAqLwogIGNiaXRfZGlnaXQsIC0xLCAgICAgICAgIC0xLCAgICAgICAgICAgICAvKiBkaWdpdCAqLwogIGNiaXRfZ3JhcGgsIC0xLCAgICAgICAgIC0xLCAgICAgICAgICAgICAvKiBncmFwaCAqLwogIGNiaXRfcHJpbnQsIC0xLCAgICAgICAgIC0xLCAgICAgICAgICAgICAvKiBwcmludCAqLwogIGNiaXRfcHVuY3QsIC0xLCAgICAgICAgIC0xLCAgICAgICAgICAgICAvKiBwdW5jdCAqLwogIGNiaXRfc3BhY2UsIC0xLCAgICAgICAgIC0xLCAgICAgICAgICAgICAvKiBzcGFjZSAqLwogIGNiaXRfd29yZCwgIC0xLCAgICAgICAgIC0xLCAgICAgICAgICAgICAvKiB3b3JkIC0gYSBQZXJsIGV4dGVuc2lvbiAqLwogIGNiaXRfeGRpZ2l0LC0xLCAgICAgICAgIC0xICAgICAgICAgICAgICAvKiB4ZGlnaXQgKi8KfTsKCi8qIFRhYmxlIHRvIGlkZW50aWZ5IGRpZ2l0cyBhbmQgaGV4IGRpZ2l0cy4gVGhpcyBpcyB1c2VkIHdoZW4gY29tcGlsaW5nCnBhdHRlcm5zLiBOb3RlIHRoYXQgdGhlIHRhYmxlcyBpbiBjaGFydGFibGVzIGFyZSBkZXBlbmRlbnQgb24gdGhlIGxvY2FsZSwgYW5kCm1heSBtYXJrIGFyYml0cmFyeSBjaGFyYWN0ZXJzIGFzIGRpZ2l0cyAtIGJ1dCB0aGUgUENSRSBjb21waWxpbmcgY29kZSBleHBlY3RzCnRvIGhhbmRsZSBvbmx5IDAtOSwgYS16LCBhbmQgQS1aIGFzIGRpZ2l0cyB3aGVuIGNvbXBpbGluZy4gVGhhdCBpcyB3aHkgd2UgaGF2ZQphIHByaXZhdGUgdGFibGUgaGVyZS4gSXQgY29zdHMgMjU2IGJ5dGVzLCBidXQgaXQgaXMgYSBsb3QgZmFzdGVyIHRoYW4gZG9pbmcKY2hhcmFjdGVyIHZhbHVlIHRlc3RzIChhdCBsZWFzdCBpbiBzb21lIHNpbXBsZSBjYXNlcyBJIHRpbWVkKSwgYW5kIGluIHNvbWUKYXBwbGljYXRpb25zIG9uZSB3YW50cyBQQ1JFIHRvIGNvbXBpbGUgZWZmaWNpZW50bHkgYXMgd2VsbCBhcyBtYXRjaAplZmZpY2llbnRseS4KCkZvciBjb252ZW5pZW5jZSwgd2UgdXNlIHRoZSBzYW1lIGJpdCBkZWZpbml0aW9ucyBhcyBpbiBjaGFydGFibGVzOgoKICAweDA0ICAgZGVjaW1hbCBkaWdpdAogIDB4MDggICBoZXhhZGVjaW1hbCBkaWdpdAoKVGhlbiB3ZSBjYW4gdXNlIGN0eXBlX2RpZ2l0IGFuZCBjdHlwZV94ZGlnaXQgaW4gdGhlIGNvZGUuICovCgojaWYgIUVCQ0RJQyAgICAvKiBUaGlzIGlzIHRoZSAibm9ybWFsIiBjYXNlLCBmb3IgQVNDSUkgc3lzdGVtcyAqLwpzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBkaWdpdGFiW10gPQogIHsKICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsIC8qICAgMC0gIDcgKi8KICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsIC8qICAgOC0gMTUgKi8KICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsIC8qICAxNi0gMjMgKi8KICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsIC8qICAyNC0gMzEgKi8KICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsIC8qICAgIC0gJyAgKi8KICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsIC8qICAoIC0gLyAgKi8KICAweDBjLDB4MGMsMHgwYywweDBjLDB4MGMsMHgwYywweDBjLDB4MGMsIC8qICAwIC0gNyAgKi8KICAweDBjLDB4MGMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsIC8qICA4IC0gPyAgKi8KICAweDAwLDB4MDgsMHgwOCwweDA4LDB4MDgsMHgwOCwweDA4LDB4MDAsIC8qICBAIC0gRyAgKi8KICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsIC8qICBIIC0gTyAgKi8KICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsIC8qICBQIC0gVyAgKi8KICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsIC8qICBYIC0gXyAgKi8KICAweDAwLDB4MDgsMHgwOCwweDA4LDB4MDgsMHgwOCwweDA4LDB4MDAsIC8qICBgIC0gZyAgKi8KICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsIC8qICBoIC0gbyAgKi8KICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsIC8qICBwIC0gdyAgKi8KICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsIC8qICB4IC0xMjcgKi8KICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsIC8qIDEyOC0xMzUgKi8KICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsIC8qIDEzNi0xNDMgKi8KICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsIC8qIDE0NC0xNTEgKi8KICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsIC8qIDE1Mi0xNTkgKi8KICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsIC8qIDE2MC0xNjcgKi8KICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsIC8qIDE2OC0xNzUgKi8KICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsIC8qIDE3Ni0xODMgKi8KICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsIC8qIDE4NC0xOTEgKi8KICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsIC8qIDE5Mi0xOTkgKi8KICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsIC8qIDIwMC0yMDcgKi8KICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsIC8qIDIwOC0yMTUgKi8KICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsIC8qIDIxNi0yMjMgKi8KICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsIC8qIDIyNC0yMzEgKi8KICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsIC8qIDIzMi0yMzkgKi8KICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsIC8qIDI0MC0yNDcgKi8KICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDB9Oy8qIDI0OC0yNTUgKi8KCiNlbHNlICAgICAgICAgIC8qIFRoaXMgaXMgdGhlICJhYm5vcm1hbCIgY2FzZSwgZm9yIEVCQ0RJQyBzeXN0ZW1zICovCnN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGRpZ2l0YWJbXSA9CiAgewogIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwgLyogICAwLSAgNyAgMCAqLwogIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwgLyogICA4LSAxNSAgICAqLwogIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwgLyogIDE2LSAyMyAxMCAqLwogIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwgLyogIDI0LSAzMSAgICAqLwogIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwgLyogIDMyLSAzOSAyMCAqLwogIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwgLyogIDQwLSA0NyAgICAqLwogIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwgLyogIDQ4LSA1NSAzMCAqLwogIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwgLyogIDU2LSA2MyAgICAqLwogIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwgLyogICAgLSA3MSA0MCAqLwogIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwgLyogIDcyLSB8ICAgICAqLwogIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwgLyogICYgLSA4NyA1MCAqLwogIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwgLyogIDg4LSCsICAgICAqLwogIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwgLyogIC0gLTEwMyA2MCAqLwogIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwgLyogMTA0LSA/ICAgICAqLwogIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwgLyogMTEyLTExOSA3MCAqLwogIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwgLyogMTIwLSAiICAgICAqLwogIDB4MDAsMHgwOCwweDA4LDB4MDgsMHgwOCwweDA4LDB4MDgsMHgwMCwgLyogMTI4LSBnICA4MCAqLwogIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwgLyogIGggLTE0MyAgICAqLwogIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwgLyogMTQ0LSBwICA5MCAqLwogIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwgLyogIHEgLTE1OSAgICAqLwogIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwgLyogMTYwLSB4ICBBMCAqLwogIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwgLyogIHkgLTE3NSAgICAqLwogIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwgLyogIF4gLTE4MyBCMCAqLwogIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwgLyogMTg0LTE5MSAgICAqLwogIDB4MDAsMHgwOCwweDA4LDB4MDgsMHgwOCwweDA4LDB4MDgsMHgwMCwgLyogIHsgLSBHICBDMCAqLwogIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwgLyogIEggLTIwNyAgICAqLwogIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwgLyogIH0gLSBQICBEMCAqLwogIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwgLyogIFEgLTIyMyAgICAqLwogIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwgLyogIFwgLSBYICBFMCAqLwogIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwgLyogIFkgLTIzOSAgICAqLwogIDB4MGMsMHgwYywweDBjLDB4MGMsMHgwYywweDBjLDB4MGMsMHgwYywgLyogIDAgLSA3ICBGMCAqLwogIDB4MGMsMHgwYywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMH07LyogIDggLTI1NSAgICAqLwoKc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgZWJjZGljX2NoYXJ0YWJbXSA9IHsgLyogY2hhcnRhYmxlIHBhcnRpYWwgZHVwICovCiAgMHg4MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLCAvKiAgIDAtICA3ICovCiAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDEsMHgwMCwweDAwLCAvKiAgIDgtIDE1ICovCiAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLCAvKiAgMTYtIDIzICovCiAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLCAvKiAgMjQtIDMxICovCiAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLCAvKiAgMzItIDM5ICovCiAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLCAvKiAgNDAtIDQ3ICovCiAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLCAvKiAgNDgtIDU1ICovCiAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLCAvKiAgNTYtIDYzICovCiAgMHgwMSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLCAvKiAgICAtIDcxICovCiAgMHgwMCwweDAwLDB4MDAsMHg4MCwweDAwLDB4ODAsMHg4MCwweDgwLCAvKiAgNzItIHwgICovCiAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLCAvKiAgJiAtIDg3ICovCiAgMHgwMCwweDAwLDB4MDAsMHg4MCwweDgwLDB4ODAsMHgwMCwweDAwLCAvKiAgODgtIKwgICovCiAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLCAvKiAgLSAtMTAzICovCiAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHgwMCwweDgwLCAvKiAxMDQtID8gICovCiAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLCAvKiAxMTItMTE5ICovCiAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLCAvKiAxMjAtICIgICovCiAgMHgwMCwweDFhLDB4MWEsMHgxYSwweDFhLDB4MWEsMHgxYSwweDEyLCAvKiAxMjgtIGcgICovCiAgMHgxMiwweDEyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLCAvKiAgaCAtMTQzICovCiAgMHgwMCwweDEyLDB4MTIsMHgxMiwweDEyLDB4MTIsMHgxMiwweDEyLCAvKiAxNDQtIHAgICovCiAgMHgxMiwweDEyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLCAvKiAgcSAtMTU5ICovCiAgMHgwMCwweDAwLDB4MTIsMHgxMiwweDEyLDB4MTIsMHgxMiwweDEyLCAvKiAxNjAtIHggICovCiAgMHgxMiwweDEyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLCAvKiAgeSAtMTc1ICovCiAgMHg4MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLCAvKiAgXiAtMTgzICovCiAgMHgwMCwweDAwLDB4ODAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLCAvKiAxODQtMTkxICovCiAgMHg4MCwweDFhLDB4MWEsMHgxYSwweDFhLDB4MWEsMHgxYSwweDEyLCAvKiAgeyAtIEcgICovCiAgMHgxMiwweDEyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLCAvKiAgSCAtMjA3ICovCiAgMHgwMCwweDEyLDB4MTIsMHgxMiwweDEyLDB4MTIsMHgxMiwweDEyLCAvKiAgfSAtIFAgICovCiAgMHgxMiwweDEyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLCAvKiAgUSAtMjIzICovCiAgMHgwMCwweDAwLDB4MTIsMHgxMiwweDEyLDB4MTIsMHgxMiwweDEyLCAvKiAgXCAtIFggICovCiAgMHgxMiwweDEyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLCAvKiAgWSAtMjM5ICovCiAgMHgxYywweDFjLDB4MWMsMHgxYywweDFjLDB4MWMsMHgxYywweDFjLCAvKiAgMCAtIDcgICovCiAgMHgxYywweDFjLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwfTsvKiAgOCAtMjU1ICovCiNlbmRpZgoKCi8qIERlZmluaXRpb24gdG8gYWxsb3cgbXV0dWFsIHJlY3Vyc2lvbiAqLwoKc3RhdGljIEJPT0wKICBjb21waWxlX3JlZ2V4KGludCwgaW50LCBpbnQgKiwgdXNjaGFyICoqLCBjb25zdCB1c2NoYXIgKiosIGNvbnN0IGNoYXIgKiosCiAgICBCT09MLCBpbnQsIGludCAqLCBpbnQgKiwgYnJhbmNoX2NoYWluICosIGNvbXBpbGVfZGF0YSAqKTsKCi8qIFN0cnVjdHVyZSBmb3IgYnVpbGRpbmcgYSBjaGFpbiBvZiBkYXRhIHRoYXQgYWN0dWFsbHkgbGl2ZXMgb24gdGhlCnN0YWNrLCBmb3IgaG9sZGluZyB0aGUgdmFsdWVzIG9mIHRoZSBzdWJqZWN0IHBvaW50ZXIgYXQgdGhlIHN0YXJ0IG9mIGVhY2gKc3VicGF0dGVybiwgc28gYXMgdG8gZGV0ZWN0IHdoZW4gYW4gZW1wdHkgc3RyaW5nIGhhcyBiZWVuIG1hdGNoZWQgYnkgYQpzdWJwYXR0ZXJuIC0gdG8gYnJlYWsgaW5maW5pdGUgbG9vcHMuIFdoZW4gTk9fUkVDVVJTRSBpcyBzZXQsIHRoZXNlIGJsb2NrcwphcmUgb24gdGhlIGhlYXAsIG5vdCBvbiB0aGUgc3RhY2suICovCgp0eXBlZGVmIHN0cnVjdCBlcHRyYmxvY2sgewogIHN0cnVjdCBlcHRyYmxvY2sgKmVwYl9wcmV2OwogIGNvbnN0IHVzY2hhciAqZXBiX3NhdmVkX2VwdHI7Cn0gZXB0cmJsb2NrOwoKLyogRmxhZyBiaXRzIGZvciB0aGUgbWF0Y2goKSBmdW5jdGlvbiAqLwoKI2RlZmluZSBtYXRjaF9jb25kYXNzZXJ0ICAgMHgwMSAgICAvKiBDYWxsZWQgdG8gY2hlY2sgYSBjb25kaXRpb24gYXNzZXJ0aW9uICovCiNkZWZpbmUgbWF0Y2hfaXNncm91cCAgICAgIDB4MDIgICAgLyogU2V0IGlmIHN0YXJ0IG9mIGJyYWNrZXRlZCBncm91cCAqLwoKLyogTm9uLWVycm9yIHJldHVybnMgZnJvbSB0aGUgbWF0Y2goKSBmdW5jdGlvbi4gRXJyb3IgcmV0dXJucyBhcmUgZXh0ZXJuYWxseQpkZWZpbmVkIFBDUkVfRVJST1JfeHh4IGNvZGVzLCB3aGljaCBhcmUgYWxsIG5lZ2F0aXZlLiAqLwoKI2RlZmluZSBNQVRDSF9NQVRDSCAgICAgICAgMQojZGVmaW5lIE1BVENIX05PTUFUQ0ggICAgICAwCgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogICAgICAgICAgICAgICBHbG9iYWwgdmFyaWFibGVzICAgICAgICAgICAgICAgICAqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKiBQQ1JFIGlzIHRocmVhZC1jbGVhbiBhbmQgZG9lc24ndCB1c2UgYW55IGdsb2JhbCB2YXJpYWJsZXMgaW4gdGhlIG5vcm1hbApzZW5zZS4gSG93ZXZlciwgaXQgY2FsbHMgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGZyZWUgZnVuY3Rpb25zIHZpYSB0aGUgZm91cgppbmRpcmVjdGlvbnMgYmVsb3csIGFuZCBpdCBjYW4gb3B0aW9uYWxseSBkbyBjYWxsb3V0cy4gVGhlc2UgdmFsdWVzIGNhbiBiZQpjaGFuZ2VkIGJ5IHRoZSBjYWxsZXIsIGJ1dCBhcmUgc2hhcmVkIGJldHdlZW4gYWxsIHRocmVhZHMuIEhvd2V2ZXIsIHdoZW4KY29tcGlsaW5nIGZvciBWaXJ0dWFsIFBhc2NhbCwgdGhpbmdzIGFyZSBkb25lIGRpZmZlcmVudGx5IChzZWUgcGNyZS5pbikuICovCgojaWZuZGVmIFZQQ09NUEFUCiNpZmRlZiBfX2NwbHVzcGx1cwpleHRlcm4gIkMiIHZvaWQgKigqcGNyZV9tYWxsb2MpKHNpemVfdCkgPSBtYWxsb2M7CmV4dGVybiAiQyIgdm9pZCAgKCpwY3JlX2ZyZWUpKHZvaWQgKikgPSBmcmVlOwpleHRlcm4gIkMiIHZvaWQgKigqcGNyZV9zdGFja19tYWxsb2MpKHNpemVfdCkgPSBtYWxsb2M7CmV4dGVybiAiQyIgdm9pZCAgKCpwY3JlX3N0YWNrX2ZyZWUpKHZvaWQgKikgPSBmcmVlOwpleHRlcm4gIkMiIGludCAgICgqcGNyZV9jYWxsb3V0KShwY3JlX2NhbGxvdXRfYmxvY2sgKikgPSBOVUxMOwojZWxzZQp2b2lkICooKnBjcmVfbWFsbG9jKShzaXplX3QpID0gbWFsbG9jOwp2b2lkICAoKnBjcmVfZnJlZSkodm9pZCAqKSA9IGZyZWU7CnZvaWQgKigqcGNyZV9zdGFja19tYWxsb2MpKHNpemVfdCkgPSBtYWxsb2M7CnZvaWQgICgqcGNyZV9zdGFja19mcmVlKSh2b2lkICopID0gZnJlZTsKaW50ICAgKCpwY3JlX2NhbGxvdXQpKHBjcmVfY2FsbG91dF9ibG9jayAqKSA9IE5VTEw7CiNlbmRpZgojZW5kaWYKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqICAgIE1hY3JvcyBhbmQgdGFibGVzIGZvciBjaGFyYWN0ZXIgaGFuZGxpbmcgICAgKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyogV2hlbiBVVEYtOCBlbmNvZGluZyBpcyBiZWluZyB1c2VkLCBhIGNoYXJhY3RlciBpcyBubyBsb25nZXIganVzdCBhIHNpbmdsZQpieXRlLiBUaGUgbWFjcm9zIGZvciBjaGFyYWN0ZXIgaGFuZGxpbmcgZ2VuZXJhdGUgc2ltcGxlIHNlcXVlbmNlcyB3aGVuIHVzZWQgaW4KYnl0ZS1tb2RlLCBhbmQgbW9yZSBjb21wbGljYXRlZCBvbmVzIGZvciBVVEYtOCBjaGFyYWN0ZXJzLiAqLwoKI2lmbmRlZiBTVVBQT1JUX1VURjgKI2RlZmluZSBHRVRDSEFSKGMsIGVwdHIpIGMgPSAqZXB0cjsKI2RlZmluZSBHRVRDSEFSSU5DKGMsIGVwdHIpIGMgPSAqZXB0cisrOwojZGVmaW5lIEdFVENIQVJJTkNURVNUKGMsIGVwdHIpIGMgPSAqZXB0cisrOwojZGVmaW5lIEdFVENIQVJMRU4oYywgZXB0ciwgbGVuKSBjID0gKmVwdHI7CiNkZWZpbmUgQkFDS0NIQVIoZXB0cikKCiNlbHNlICAgLyogU1VQUE9SVF9VVEY4ICovCgovKiBHZXQgdGhlIG5leHQgVVRGLTggY2hhcmFjdGVyLCBub3QgYWR2YW5jaW5nIHRoZSBwb2ludGVyLiBUaGlzIGlzIGNhbGxlZCB3aGVuCndlIGtub3cgd2UgYXJlIGluIFVURi04IG1vZGUuICovCgojZGVmaW5lIEdFVENIQVIoYywgZXB0cikgXAogIGMgPSAqZXB0cjsgXAogIGlmICgoYyAmIDB4YzApID09IDB4YzApIFwKICAgIHsgXAogICAgaW50IGdjaWk7IFwKICAgIGludCBnY2FhID0gdXRmOF90YWJsZTRbYyAmIDB4M2ZdOyAgLyogTnVtYmVyIG9mIGFkZGl0aW9uYWwgYnl0ZXMgKi8gXAogICAgaW50IGdjc3MgPSA2KmdjYWE7IFwKICAgIGMgPSAoYyAmIHV0ZjhfdGFibGUzW2djYWFdKSA8PCBnY3NzOyBcCiAgICBmb3IgKGdjaWkgPSAxOyBnY2lpIDw9IGdjYWE7IGdjaWkrKykgXAogICAgICB7IFwKICAgICAgZ2NzcyAtPSA2OyBcCiAgICAgIGMgfD0gKGVwdHJbZ2NpaV0gJiAweDNmKSA8PCBnY3NzOyBcCiAgICAgIH0gXAogICAgfQoKLyogR2V0IHRoZSBuZXh0IFVURi04IGNoYXJhY3RlciwgYWR2YW5jaW5nIHRoZSBwb2ludGVyLiBUaGlzIGlzIGNhbGxlZCB3aGVuIHdlCmtub3cgd2UgYXJlIGluIFVURi04IG1vZGUuICovCgojZGVmaW5lIEdFVENIQVJJTkMoYywgZXB0cikgXAogIGMgPSAqZXB0cisrOyBcCiAgaWYgKChjICYgMHhjMCkgPT0gMHhjMCkgXAogICAgeyBcCiAgICBpbnQgZ2NhYSA9IHV0ZjhfdGFibGU0W2MgJiAweDNmXTsgIC8qIE51bWJlciBvZiBhZGRpdGlvbmFsIGJ5dGVzICovIFwKICAgIGludCBnY3NzID0gNipnY2FhOyBcCiAgICBjID0gKGMgJiB1dGY4X3RhYmxlM1tnY2FhXSkgPDwgZ2NzczsgXAogICAgd2hpbGUgKGdjYWEtLSA+IDApIFwKICAgICAgeyBcCiAgICAgIGdjc3MgLT0gNjsgXAogICAgICBjIHw9ICgqZXB0cisrICYgMHgzZikgPDwgZ2NzczsgXAogICAgICB9IFwKICAgIH0KCi8qIEdldCB0aGUgbmV4dCBjaGFyYWN0ZXIsIHRlc3RpbmcgZm9yIFVURi04IG1vZGUsIGFuZCBhZHZhbmNpbmcgdGhlIHBvaW50ZXIgKi8KCiNkZWZpbmUgR0VUQ0hBUklOQ1RFU1QoYywgZXB0cikgXAogIGMgPSAqZXB0cisrOyBcCiAgaWYgKG1kLT51dGY4ICYmIChjICYgMHhjMCkgPT0gMHhjMCkgXAogICAgeyBcCiAgICBpbnQgZ2NhYSA9IHV0ZjhfdGFibGU0W2MgJiAweDNmXTsgIC8qIE51bWJlciBvZiBhZGRpdGlvbmFsIGJ5dGVzICovIFwKICAgIGludCBnY3NzID0gNipnY2FhOyBcCiAgICBjID0gKGMgJiB1dGY4X3RhYmxlM1tnY2FhXSkgPDwgZ2NzczsgXAogICAgd2hpbGUgKGdjYWEtLSA+IDApIFwKICAgICAgeyBcCiAgICAgIGdjc3MgLT0gNjsgXAogICAgICBjIHw9ICgqZXB0cisrICYgMHgzZikgPDwgZ2NzczsgXAogICAgICB9IFwKICAgIH0KCi8qIEdldCB0aGUgbmV4dCBVVEYtOCBjaGFyYWN0ZXIsIG5vdCBhZHZhbmNpbmcgdGhlIHBvaW50ZXIsIGluY3JlbWVudGluZyBsZW5ndGgKaWYgdGhlcmUgYXJlIGV4dHJhIGJ5dGVzLiBUaGlzIGlzIGNhbGxlZCB3aGVuIHdlIGtub3cgd2UgYXJlIGluIFVURi04IG1vZGUuICovCgojZGVmaW5lIEdFVENIQVJMRU4oYywgZXB0ciwgbGVuKSBcCiAgYyA9ICplcHRyOyBcCiAgaWYgKChjICYgMHhjMCkgPT0gMHhjMCkgXAogICAgeyBcCiAgICBpbnQgZ2NpaTsgXAogICAgaW50IGdjYWEgPSB1dGY4X3RhYmxlNFtjICYgMHgzZl07ICAvKiBOdW1iZXIgb2YgYWRkaXRpb25hbCBieXRlcyAqLyBcCiAgICBpbnQgZ2NzcyA9IDYqZ2NhYTsgXAogICAgYyA9IChjICYgdXRmOF90YWJsZTNbZ2NhYV0pIDw8IGdjc3M7IFwKICAgIGZvciAoZ2NpaSA9IDE7IGdjaWkgPD0gZ2NhYTsgZ2NpaSsrKSBcCiAgICAgIHsgXAogICAgICBnY3NzIC09IDY7IFwKICAgICAgYyB8PSAoZXB0cltnY2lpXSAmIDB4M2YpIDw8IGdjc3M7IFwKICAgICAgfSBcCiAgICBsZW4gKz0gZ2NhYTsgXAogICAgfQoKLyogSWYgdGhlIHBvaW50ZXIgaXMgbm90IGF0IHRoZSBzdGFydCBvZiBhIGNoYXJhY3RlciwgbW92ZSBpdCBiYWNrIHVudGlsCml0IGlzLiBDYWxsZWQgb25seSBpbiBVVEYtOCBtb2RlLiAqLwoKI2RlZmluZSBCQUNLQ0hBUihlcHRyKSB3aGlsZSgoKmVwdHIgJiAweGMwKSA9PSAweDgwKSBlcHRyLS07CgojZW5kaWYKCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiAgICAgICAgICAgICBEZWZhdWx0IGNoYXJhY3RlciB0YWJsZXMgICAgICAgICAgICoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qIEEgZGVmYXVsdCBzZXQgb2YgY2hhcmFjdGVyIHRhYmxlcyBpcyBpbmNsdWRlZCBpbiB0aGUgUENSRSBiaW5hcnkuIEl0cyBzb3VyY2UKaXMgYnVpbHQgYnkgdGhlIG1ha2V0YWJsZXMgYXV4aWxpYXJ5IHByb2dyYW0sIHdoaWNoIHVzZXMgdGhlIGRlZmF1bHQgQyBjdHlwZXMKZnVuY3Rpb25zLCBhbmQgcHV0IGluIHRoZSBmaWxlIGNoYXJ0YWJsZXMuYy4gVGhlc2UgdGFibGVzIGFyZSB1c2VkIGJ5IFBDUkUKd2hlbmV2ZXIgdGhlIGNhbGxlciBvZiBwY3JlX2NvbXBpbGUoKSBkb2VzIG5vdCBwcm92aWRlIGFuIGFsdGVybmF0ZSBzZXQgb2YKdGFibGVzLiAqLwoKI2luY2x1ZGUgImNoYXJ0YWJsZXMuYyIKCgoKI2lmZGVmIFNVUFBPUlRfVVRGOAovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqICAgICAgICAgICBUYWJsZXMgZm9yIFVURi04IHN1cHBvcnQgICAgICAgICAgICAgKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyogVGhlc2UgYXJlIHRoZSBicmVha3BvaW50cyBmb3IgZGlmZmVyZW50IG51bWJlcnMgb2YgYnl0ZXMgaW4gYSBVVEYtOApjaGFyYWN0ZXIuICovCgpzdGF0aWMgY29uc3QgaW50IHV0ZjhfdGFibGUxW10gPQogIHsgMHg3ZiwgMHg3ZmYsIDB4ZmZmZiwgMHgxZmZmZmYsIDB4M2ZmZmZmZiwgMHg3ZmZmZmZmZn07CgovKiBUaGVzZSBhcmUgdGhlIGluZGljYXRvciBiaXRzIGFuZCB0aGUgbWFzayBmb3IgdGhlIGRhdGEgYml0cyB0byBzZXQgaW4gdGhlCmZpcnN0IGJ5dGUgb2YgYSBjaGFyYWN0ZXIsIGluZGV4ZWQgYnkgdGhlIG51bWJlciBvZiBhZGRpdGlvbmFsIGJ5dGVzLiAqLwoKc3RhdGljIGNvbnN0IGludCB1dGY4X3RhYmxlMltdID0geyAwLCAgICAweGMwLCAweGUwLCAweGYwLCAweGY4LCAweGZjfTsKc3RhdGljIGNvbnN0IGludCB1dGY4X3RhYmxlM1tdID0geyAweGZmLCAweDFmLCAweDBmLCAweDA3LCAweDAzLCAweDAxfTsKCi8qIFRhYmxlIG9mIHRoZSBudW1iZXIgb2YgZXh0cmEgY2hhcmFjdGVycywgaW5kZXhlZCBieSB0aGUgZmlyc3QgY2hhcmFjdGVyCm1hc2tlZCB3aXRoIDB4M2YuIFRoZSBoaWdoZXN0IG51bWJlciBmb3IgYSB2YWxpZCBVVEYtOCBjaGFyYWN0ZXIgaXMgaW4gZmFjdAoweDNkLiAqLwoKc3RhdGljIGNvbnN0IHVzY2hhciB1dGY4X3RhYmxlNFtdID0gewogIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsCiAgMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwKICAyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLAogIDMsMywzLDMsMywzLDMsMyw0LDQsNCw0LDUsNSw1LDUgfTsKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqICAgICAgIENvbnZlcnQgY2hhcmFjdGVyIHZhbHVlIHRvIFVURi04ICAgICAgICAgKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyogVGhpcyBmdW5jdGlvbiB0YWtlcyBhbiBpbnRlZ2VyIHZhbHVlIGluIHRoZSByYW5nZSAwIC0gMHg3ZmZmZmZmZgphbmQgZW5jb2RlcyBpdCBhcyBhIFVURi04IGNoYXJhY3RlciBpbiAwIHRvIDYgYnl0ZXMuCgpBcmd1bWVudHM6CiAgY3ZhbHVlICAgICB0aGUgY2hhcmFjdGVyIHZhbHVlCiAgYnVmZmVyICAgICBwb2ludGVyIHRvIGJ1ZmZlciBmb3IgcmVzdWx0IC0gYXQgbGVhc3QgNiBieXRlcyBsb25nCgpSZXR1cm5zOiAgICAgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcGxhY2VkIGluIHRoZSBidWZmZXIKKi8KCnN0YXRpYyBpbnQKb3JkMnV0ZjgoaW50IGN2YWx1ZSwgdXNjaGFyICpidWZmZXIpCnsKcmVnaXN0ZXIgaW50IGksIGo7CmZvciAoaSA9IDA7IGkgPCBzaXplb2YodXRmOF90YWJsZTEpL3NpemVvZihpbnQpOyBpKyspCiAgaWYgKGN2YWx1ZSA8PSB1dGY4X3RhYmxlMVtpXSkgYnJlYWs7CmJ1ZmZlciArPSBpOwpmb3IgKGogPSBpOyBqID4gMDsgai0tKQogewogKmJ1ZmZlci0tID0gMHg4MCB8IChjdmFsdWUgJiAweDNmKTsKIGN2YWx1ZSA+Pj0gNjsKIH0KKmJ1ZmZlciA9IHV0ZjhfdGFibGUyW2ldIHwgY3ZhbHVlOwpyZXR1cm4gaSArIDE7Cn0KI2VuZGlmCgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogICAgICAgICBQcmludCBjb21waWxlZCByZWdleCAgICAgICAgICAgICAgICAgICAqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKiBUaGUgY29kZSBmb3IgZG9pbmcgdGhpcyBpcyBoZWxkIGluIGEgc2VwYXJhdGUgZmlsZSB0aGF0IGlzIGFsc28gaW5jbHVkZWQgaW4KcGNyZXRlc3QuYy4gSXQgZGVmaW5lcyBhIGZ1bmN0aW9uIGNhbGxlZCBwcmludF9pbnRlcm5hbHMoKS4gKi8KCiNpZmRlZiBERUJVRwojaW5jbHVkZSAicHJpbnRpbnQuYyIKI2VuZGlmCgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogICAgICAgICAgUmV0dXJuIHZlcnNpb24gc3RyaW5nICAgICAgICAgICAgICAgICAqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojZGVmaW5lIFNUUklORyhhKSAgIyBhCiNkZWZpbmUgWFNUUklORyhzKSBTVFJJTkcocykKCkVYUE9SVCBjb25zdCBjaGFyICoKcGNyZV92ZXJzaW9uKHZvaWQpCnsKcmV0dXJuIFhTVFJJTkcoUENSRV9NQUpPUikgIi4iIFhTVFJJTkcoUENSRV9NSU5PUikgIiAiIFhTVFJJTkcoUENSRV9EQVRFKTsKfQoKCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiAgICAgICAgIEZsaXAgYnl0ZXMgaW4gYW4gaW50ZWdlciAgICAgICAgICAgICAgICoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIG1hZ2ljIG51bWJlciBpbiBhIHJlZ2V4IGRvZXNuJ3QgbWF0Y2ggaW4Kb3JkZXIgdG8gZmxpcCBpdHMgYnl0ZXMgdG8gc2VlIGlmIHdlIGFyZSBkZWFsaW5nIHdpdGggYSBwYXR0ZXJuIHRoYXQgd2FzCmNvbXBpbGVkIG9uIGEgaG9zdCBvZiBkaWZmZXJlbnQgZW5kaWFubmVzcy4gSWYgc28sIHRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0bwpmbGlwIG90aGVyIGJ5dGUgdmFsdWVzLgoKQXJndW1lbnRzOgogIHZhbHVlICAgICAgICB0aGUgbnVtYmVyIHRvIGZsaXAKICBuICAgICAgICAgICAgdGhlIG51bWJlciBvZiBieXRlcyB0byBmbGlwIChhc3N1bWVkIHRvIGJlIDIgb3IgNCkKClJldHVybnM6ICAgICAgIHRoZSBmbGlwcGVkIHZhbHVlCiovCgpzdGF0aWMgcGNyZV91aW50MTYKYnl0ZWZsaXAyKHBjcmVfdWludDE2IHZhbHVlKQp7CnJldHVybiAoKHZhbHVlICYgMHgwMGZmKSA8PCA4KSB8CiAgICAgICAoKHZhbHVlICYgMHhmZjAwKSA+PiA4KTsKfQoKc3RhdGljIHBjcmVfdWludDMyCmJ5dGVmbGlwNChwY3JlX3VpbnQzMiB2YWx1ZSkKewpyZXR1cm4gKCh2YWx1ZSAmIDB4MDAwMDAwZmYpIDw8IDI0KSB8CiAgICAgICAoKHZhbHVlICYgMHgwMDAwZmYwMCkgPDwgIDgpIHwKICAgICAgICgodmFsdWUgJiAweDAwZmYwMDAwKSA+PiAgOCkgfAogICAgICAgKCh2YWx1ZSAmIDB4ZmYwMDAwMDApID4+IDI0KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiAgICAgICBUZXN0IGZvciBhIGJ5dGUtZmxpcHBlZCBjb21waWxlZCByZWdleCAgICoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gcGNlX2V4ZWMoKSBhbmQgYWxzbyBmcm9tIHBjcmVfZnVsbGluZm8oKS4gSXRzCmpvYiBpcyB0byB0ZXN0IHdoZXRoZXIgdGhlIHJlZ2V4IGlzIGJ5dGUtZmxpcHBlZCAtIHRoYXQgaXMsIGl0IHdhcyBjb21waWxlZCBvbgphIHN5c3RlbSBvZiBvcHBvc2l0ZSBlbmRpYW5uZXNzLiBUaGUgZnVuY3Rpb24gaXMgY2FsbGVkIG9ubHkgd2hlbiB0aGUgbmF0aXZlCk1BR0lDX05VTUJFUiB0ZXN0IGZhaWxzLiBJZiB0aGUgcmVnZXggaXMgaW5kZWVkIGZsaXBwZWQsIHdlIGZsaXAgYWxsIHRoZQpyZWxldmFudCB2YWx1ZXMgaW50byBhIGRpZmZlcmVudCBkYXRhIGJsb2NrLCBhbmQgcmV0dXJuIGl0LgoKQXJndW1lbnRzOgogIHJlICAgICAgICAgICAgICAgcG9pbnRzIHRvIHRoZSByZWdleAogIHN0dWR5ICAgICAgICAgICAgcG9pbnRzIHRvIHN0dWR5IGRhdGEsIG9yIE5VTEwKICBpbnRlcm5hbF9yZSAgICAgIHBvaW50cyB0byBhIG5ldyByZWdleCBibG9jawogIGludGVybmFsX3N0dWR5ICAgcG9pbnRzIHRvIGEgbmV3IHN0dWR5IGJsb2NrCgpSZXR1cm5zOiAgICAgICAgICAgdGhlIG5ldyBibG9jayBpZiBpcyBpcyBpbmRlZWQgYSBieXRlLWZsaXBwZWQgcmVnZXgKICAgICAgICAgICAgICAgICAgIE5VTEwgaWYgaXQgaXMgbm90CiovCgpzdGF0aWMgcmVhbF9wY3JlICoKdHJ5X2ZsaXBwZWQoY29uc3QgcmVhbF9wY3JlICpyZSwgcmVhbF9wY3JlICppbnRlcm5hbF9yZSwKICBjb25zdCBwY3JlX3N0dWR5X2RhdGEgKnN0dWR5LCBwY3JlX3N0dWR5X2RhdGEgKmludGVybmFsX3N0dWR5KQp7CmlmIChieXRlZmxpcDQocmUtPm1hZ2ljX251bWJlcikgIT0gTUFHSUNfTlVNQkVSKQogIHJldHVybiBOVUxMOwoKKmludGVybmFsX3JlID0gKnJlOyAgICAgICAgICAgLyogVG8gY29weSBvdGhlciBmaWVsZHMgKi8KaW50ZXJuYWxfcmUtPnNpemUgPSBieXRlZmxpcDQocmUtPnNpemUpOwppbnRlcm5hbF9yZS0+b3B0aW9ucyA9IGJ5dGVmbGlwNChyZS0+b3B0aW9ucyk7CmludGVybmFsX3JlLT50b3BfYnJhY2tldCA9IGJ5dGVmbGlwMihyZS0+dG9wX2JyYWNrZXQpOwppbnRlcm5hbF9yZS0+dG9wX2JhY2tyZWYgPSBieXRlZmxpcDIocmUtPnRvcF9iYWNrcmVmKTsKaW50ZXJuYWxfcmUtPmZpcnN0X2J5dGUgPSBieXRlZmxpcDIocmUtPmZpcnN0X2J5dGUpOwppbnRlcm5hbF9yZS0+cmVxX2J5dGUgPSBieXRlZmxpcDIocmUtPnJlcV9ieXRlKTsKaW50ZXJuYWxfcmUtPm5hbWVfdGFibGVfb2Zmc2V0ID0gYnl0ZWZsaXAyKHJlLT5uYW1lX3RhYmxlX29mZnNldCk7CmludGVybmFsX3JlLT5uYW1lX2VudHJ5X3NpemUgPSBieXRlZmxpcDIocmUtPm5hbWVfZW50cnlfc2l6ZSk7CmludGVybmFsX3JlLT5uYW1lX2NvdW50ID0gYnl0ZWZsaXAyKHJlLT5uYW1lX2NvdW50KTsKCmlmIChzdHVkeSAhPSBOVUxMKQogIHsKICAqaW50ZXJuYWxfc3R1ZHkgPSAqc3R1ZHk7ICAgLyogVG8gY29weSBvdGhlciBmaWVsZHMgKi8KICBpbnRlcm5hbF9zdHVkeS0+c2l6ZSA9IGJ5dGVmbGlwNChzdHVkeS0+c2l6ZSk7CiAgaW50ZXJuYWxfc3R1ZHktPm9wdGlvbnMgPSBieXRlZmxpcDQoc3R1ZHktPm9wdGlvbnMpOwogIH0KCnJldHVybiBpbnRlcm5hbF9yZTsKfQoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIChPYnNvbGV0ZSkgUmV0dXJuIGluZm8gYWJvdXQgY29tcGlsZWQgcGF0dGVybiAgKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyogVGhpcyBpcyB0aGUgb3JpZ2luYWwgImluZm8iIGZ1bmN0aW9uLiBJdCBwaWNrcyBwb3RlbnRpYWxseSB1c2VmdWwgZGF0YSBvdXQKb2YgdGhlIHByaXZhdGUgc3RydWN0dXJlLCBidXQgaXRzIGludGVyZmFjZSB3YXMgdG9vIHJpZ2lkLiBJdCByZW1haW5zIGZvcgpiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gVGhlIHB1YmxpYyBvcHRpb25zIGFyZSBwYXNzZWQgYmFjayBpbiBhbiBpbnQgLSB0aG91Z2gKdGhlIHJlLT5vcHRpb25zIGZpZWxkIGhhcyBiZWVuIGV4cGFuZGVkIHRvIGEgbG9uZyBpbnQsIGFsbCB0aGUgcHVibGljIG9wdGlvbnMKYXQgdGhlIGxvdyBlbmQgb2YgaXQsIGFuZCBzbyBldmVuIG9uIDE2LWJpdCBzeXN0ZW1zIHRoaXMgd2lsbCBzdGlsbCBiZSBPSy4KVGhlcmVmb3JlLCBJIGhhdmVuJ3QgY2hhbmdlZCB0aGUgQVBJIGZvciBwY3JlX2luZm8oKS4KCkFyZ3VtZW50czoKICBhcmd1bWVudF9yZSAgIHBvaW50cyB0byBjb21waWxlZCBjb2RlCiAgb3B0cHRyICAgICAgICB3aGVyZSB0byBwYXNzIGJhY2sgdGhlIG9wdGlvbnMKICBmaXJzdF9ieXRlICAgIHdoZXJlIHRvIHBhc3MgYmFjayB0aGUgZmlyc3QgY2hhcmFjdGVyLAogICAgICAgICAgICAgICAgb3IgLTEgaWYgbXVsdGlsaW5lIGFuZCBhbGwgYnJhbmNoZXMgc3RhcnQgXiwKICAgICAgICAgICAgICAgIG9yIC0yIG90aGVyd2lzZQoKUmV0dXJuczogICAgICAgIG51bWJlciBvZiBjYXB0dXJpbmcgc3VicGF0dGVybnMKICAgICAgICAgICAgICAgIG9yIG5lZ2F0aXZlIHZhbHVlcyBvbiBlcnJvcgoqLwoKRVhQT1JUIGludApwY3JlX2luZm8oY29uc3QgcGNyZSAqYXJndW1lbnRfcmUsIGludCAqb3B0cHRyLCBpbnQgKmZpcnN0X2J5dGUpCnsKcmVhbF9wY3JlIGludGVybmFsX3JlOwpjb25zdCByZWFsX3BjcmUgKnJlID0gKGNvbnN0IHJlYWxfcGNyZSAqKWFyZ3VtZW50X3JlOwppZiAocmUgPT0gTlVMTCkgcmV0dXJuIFBDUkVfRVJST1JfTlVMTDsKaWYgKHJlLT5tYWdpY19udW1iZXIgIT0gTUFHSUNfTlVNQkVSKQogIHsKICByZSA9IHRyeV9mbGlwcGVkKHJlLCAmaW50ZXJuYWxfcmUsIE5VTEwsIE5VTEwpOwogIGlmIChyZSA9PSBOVUxMKSByZXR1cm4gUENSRV9FUlJPUl9CQURNQUdJQzsKICB9CmlmIChvcHRwdHIgIT0gTlVMTCkgKm9wdHB0ciA9IChpbnQpKHJlLT5vcHRpb25zICYgUFVCTElDX09QVElPTlMpOwppZiAoZmlyc3RfYnl0ZSAhPSBOVUxMKQogICpmaXJzdF9ieXRlID0gKChyZS0+b3B0aW9ucyAmIFBDUkVfRklSU1RTRVQpICE9IDApPyByZS0+Zmlyc3RfYnl0ZSA6CiAgICAgKChyZS0+b3B0aW9ucyAmIFBDUkVfU1RBUlRMSU5FKSAhPSAwKT8gLTEgOiAtMjsKcmV0dXJuIHJlLT50b3BfYnJhY2tldDsKfQoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqICAgICAgICBSZXR1cm4gaW5mbyBhYm91dCBjb21waWxlZCBwYXR0ZXJuICAgICAgKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyogVGhpcyBpcyBhIG5ld2VyICJpbmZvIiBmdW5jdGlvbiB3aGljaCBoYXMgYW4gZXh0ZW5zaWJsZSBpbnRlcmZhY2Ugc28KdGhhdCBhZGRpdGlvbmFsIGl0ZW1zIGNhbiBiZSBhZGRlZCBjb21wYXRpYmx5LgoKQXJndW1lbnRzOgogIGFyZ3VtZW50X3JlICAgICAgcG9pbnRzIHRvIGNvbXBpbGVkIGNvZGUKICBleHRyYV9kYXRhICAgICAgIHBvaW50cyBleHRyYSBkYXRhLCBvciBOVUxMCiAgd2hhdCAgICAgICAgICAgICB3aGF0IGluZm9ybWF0aW9uIGlzIHJlcXVpcmVkCiAgd2hlcmUgICAgICAgICAgICB3aGVyZSB0byBwdXQgdGhlIGluZm9ybWF0aW9uCgpSZXR1cm5zOiAgICAgICAgICAgMCBpZiBkYXRhIHJldHVybmVkLCBuZWdhdGl2ZSBvbiBlcnJvcgoqLwoKRVhQT1JUIGludApwY3JlX2Z1bGxpbmZvKGNvbnN0IHBjcmUgKmFyZ3VtZW50X3JlLCBjb25zdCBwY3JlX2V4dHJhICpleHRyYV9kYXRhLCBpbnQgd2hhdCwKICB2b2lkICp3aGVyZSkKewpyZWFsX3BjcmUgaW50ZXJuYWxfcmU7CnBjcmVfc3R1ZHlfZGF0YSBpbnRlcm5hbF9zdHVkeTsKY29uc3QgcmVhbF9wY3JlICpyZSA9IChjb25zdCByZWFsX3BjcmUgKilhcmd1bWVudF9yZTsKY29uc3QgcGNyZV9zdHVkeV9kYXRhICpzdHVkeSA9IE5VTEw7CgppZiAocmUgPT0gTlVMTCB8fCB3aGVyZSA9PSBOVUxMKSByZXR1cm4gUENSRV9FUlJPUl9OVUxMOwoKaWYgKGV4dHJhX2RhdGEgIT0gTlVMTCAmJiAoZXh0cmFfZGF0YS0+ZmxhZ3MgJiBQQ1JFX0VYVFJBX1NUVURZX0RBVEEpICE9IDApCiAgc3R1ZHkgPSAoY29uc3QgcGNyZV9zdHVkeV9kYXRhICopZXh0cmFfZGF0YS0+c3R1ZHlfZGF0YTsKCmlmIChyZS0+bWFnaWNfbnVtYmVyICE9IE1BR0lDX05VTUJFUikKICB7CiAgcmUgPSB0cnlfZmxpcHBlZChyZSwgJmludGVybmFsX3JlLCBzdHVkeSwgJmludGVybmFsX3N0dWR5KTsKICBpZiAocmUgPT0gTlVMTCkgcmV0dXJuIFBDUkVfRVJST1JfQkFETUFHSUM7CiAgaWYgKHN0dWR5ICE9IE5VTEwpIHN0dWR5ID0gJmludGVybmFsX3N0dWR5OwogIH0KCnN3aXRjaCAod2hhdCkKICB7CiAgY2FzZSBQQ1JFX0lORk9fT1BUSU9OUzoKICAqKCh1bnNpZ25lZCBsb25nIGludCAqKXdoZXJlKSA9IHJlLT5vcHRpb25zICYgUFVCTElDX09QVElPTlM7CiAgYnJlYWs7CgogIGNhc2UgUENSRV9JTkZPX1NJWkU6CiAgKigoc2l6ZV90ICopd2hlcmUpID0gcmUtPnNpemU7CiAgYnJlYWs7CgogIGNhc2UgUENSRV9JTkZPX1NUVURZU0laRToKICAqKChzaXplX3QgKil3aGVyZSkgPSAoc3R1ZHkgPT0gTlVMTCk/IDAgOiBzdHVkeS0+c2l6ZTsKICBicmVhazsKCiAgY2FzZSBQQ1JFX0lORk9fQ0FQVFVSRUNPVU5UOgogICooKGludCAqKXdoZXJlKSA9IHJlLT50b3BfYnJhY2tldDsKICBicmVhazsKCiAgY2FzZSBQQ1JFX0lORk9fQkFDS1JFRk1BWDoKICAqKChpbnQgKil3aGVyZSkgPSByZS0+dG9wX2JhY2tyZWY7CiAgYnJlYWs7CgogIGNhc2UgUENSRV9JTkZPX0ZJUlNUQllURToKICAqKChpbnQgKil3aGVyZSkgPQogICAgKChyZS0+b3B0aW9ucyAmIFBDUkVfRklSU1RTRVQpICE9IDApPyByZS0+Zmlyc3RfYnl0ZSA6CiAgICAoKHJlLT5vcHRpb25zICYgUENSRV9TVEFSVExJTkUpICE9IDApPyAtMSA6IC0yOwogIGJyZWFrOwoKICAvKiBNYWtlIHN1cmUgd2UgcGFzcyBiYWNrIHRoZSBwb2ludGVyIHRvIHRoZSBiaXQgdmVjdG9yIGluIHRoZSBleHRlcm5hbAogIGJsb2NrLCBub3QgdGhlIGludGVybmFsIGNvcHkgKHdpdGggZmxpcHBlZCBpbnRlZ2VyIGZpZWxkcykuICovCgogIGNhc2UgUENSRV9JTkZPX0ZJUlNUVEFCTEU6CiAgKigoY29uc3QgdXNjaGFyICoqKXdoZXJlKSA9CiAgICAoc3R1ZHkgIT0gTlVMTCAmJiAoc3R1ZHktPm9wdGlvbnMgJiBQQ1JFX1NUVURZX01BUFBFRCkgIT0gMCk/CiAgICAgICgoY29uc3QgcGNyZV9zdHVkeV9kYXRhICopZXh0cmFfZGF0YS0+c3R1ZHlfZGF0YSktPnN0YXJ0X2JpdHMgOiBOVUxMOwogIGJyZWFrOwoKICBjYXNlIFBDUkVfSU5GT19MQVNUTElURVJBTDoKICAqKChpbnQgKil3aGVyZSkgPQogICAgKChyZS0+b3B0aW9ucyAmIFBDUkVfUkVRQ0hTRVQpICE9IDApPyByZS0+cmVxX2J5dGUgOiAtMTsKICBicmVhazsKCiAgY2FzZSBQQ1JFX0lORk9fTkFNRUVOVFJZU0laRToKICAqKChpbnQgKil3aGVyZSkgPSByZS0+bmFtZV9lbnRyeV9zaXplOwogIGJyZWFrOwoKICBjYXNlIFBDUkVfSU5GT19OQU1FQ09VTlQ6CiAgKigoaW50ICopd2hlcmUpID0gcmUtPm5hbWVfY291bnQ7CiAgYnJlYWs7CgogIGNhc2UgUENSRV9JTkZPX05BTUVUQUJMRToKICAqKChjb25zdCB1c2NoYXIgKiopd2hlcmUpID0gKGNvbnN0IHVzY2hhciAqKXJlICsgcmUtPm5hbWVfdGFibGVfb2Zmc2V0OwogIGJyZWFrOwoKICBjYXNlIFBDUkVfSU5GT19ERUZBVUxUX1RBQkxFUzoKICAqKChjb25zdCB1c2NoYXIgKiopd2hlcmUpID0gKGNvbnN0IHVzY2hhciAqKXBjcmVfZGVmYXVsdF90YWJsZXM7CiAgYnJlYWs7CgogIGRlZmF1bHQ6IHJldHVybiBQQ1JFX0VSUk9SX0JBRE9QVElPTjsKICB9CgpyZXR1cm4gMDsKfQoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIFJldHVybiBpbmZvIGFib3V0IHdoYXQgZmVhdHVyZXMgYXJlIGNvbmZpZ3VyZWQgKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyogVGhpcyBpcyBmdW5jdGlvbiB3aGljaCBoYXMgYW4gZXh0ZW5zaWJsZSBpbnRlcmZhY2Ugc28gdGhhdCBhZGRpdGlvbmFsIGl0ZW1zCmNhbiBiZSBhZGRlZCBjb21wYXRpYmx5LgoKQXJndW1lbnRzOgogIHdoYXQgICAgICAgICAgICAgd2hhdCBpbmZvcm1hdGlvbiBpcyByZXF1aXJlZAogIHdoZXJlICAgICAgICAgICAgd2hlcmUgdG8gcHV0IHRoZSBpbmZvcm1hdGlvbgoKUmV0dXJuczogICAgICAgICAgIDAgaWYgZGF0YSByZXR1cm5lZCwgbmVnYXRpdmUgb24gZXJyb3IKKi8KCkVYUE9SVCBpbnQKcGNyZV9jb25maWcoaW50IHdoYXQsIHZvaWQgKndoZXJlKQp7CnN3aXRjaCAod2hhdCkKICB7CiAgY2FzZSBQQ1JFX0NPTkZJR19VVEY4OgojaWZkZWYgU1VQUE9SVF9VVEY4CiAgKigoaW50ICopd2hlcmUpID0gMTsKI2Vsc2UKICAqKChpbnQgKil3aGVyZSkgPSAwOwojZW5kaWYKICBicmVhazsKCiAgY2FzZSBQQ1JFX0NPTkZJR19VTklDT0RFX1BST1BFUlRJRVM6CiNpZmRlZiBTVVBQT1JUX1VDUAogICooKGludCAqKXdoZXJlKSA9IDE7CiNlbHNlCiAgKigoaW50ICopd2hlcmUpID0gMDsKI2VuZGlmCiAgYnJlYWs7CgogIGNhc2UgUENSRV9DT05GSUdfTkVXTElORToKICAqKChpbnQgKil3aGVyZSkgPSBORVdMSU5FOwogIGJyZWFrOwoKICBjYXNlIFBDUkVfQ09ORklHX0xJTktfU0laRToKICAqKChpbnQgKil3aGVyZSkgPSBMSU5LX1NJWkU7CiAgYnJlYWs7CgogIGNhc2UgUENSRV9DT05GSUdfUE9TSVhfTUFMTE9DX1RIUkVTSE9MRDoKICAqKChpbnQgKil3aGVyZSkgPSBQT1NJWF9NQUxMT0NfVEhSRVNIT0xEOwogIGJyZWFrOwoKICBjYXNlIFBDUkVfQ09ORklHX01BVENIX0xJTUlUOgogICooKHVuc2lnbmVkIGludCAqKXdoZXJlKSA9IE1BVENIX0xJTUlUOwogIGJyZWFrOwoKICBjYXNlIFBDUkVfQ09ORklHX1NUQUNLUkVDVVJTRToKI2lmZGVmIE5PX1JFQ1VSU0UKICAqKChpbnQgKil3aGVyZSkgPSAwOwojZWxzZQogICooKGludCAqKXdoZXJlKSA9IDE7CiNlbmRpZgogIGJyZWFrOwoKICBkZWZhdWx0OiByZXR1cm4gUENSRV9FUlJPUl9CQURPUFRJT047CiAgfQoKcmV0dXJuIDA7Cn0KCgoKI2lmZGVmIERFQlVHCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogICAgICAgIERlYnVnZ2luZyBmdW5jdGlvbiB0byBwcmludCBjaGFycyAgICAgICAqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKiBQcmludCBhIHNlcXVlbmNlIG9mIGNoYXJzIGluIHByaW50YWJsZSBmb3JtYXQsIHN0b3BwaW5nIGF0IHRoZSBlbmQgb2YgdGhlCnN1YmplY3QgaWYgdGhlIHJlcXVlc3RlZC4KCkFyZ3VtZW50czoKICBwICAgICAgICAgICBwb2ludHMgdG8gY2hhcmFjdGVycwogIGxlbmd0aCAgICAgIG51bWJlciB0byBwcmludAogIGlzX3N1YmplY3QgIFRSVUUgaWYgcHJpbnRpbmcgZnJvbSB3aXRoaW4gbWQtPnN0YXJ0X3N1YmplY3QKICBtZCAgICAgICAgICBwb2ludGVyIHRvIG1hdGNoaW5nIGRhdGEgYmxvY2ssIGlmIGlzX3N1YmplY3QgaXMgVFJVRQoKUmV0dXJuczogICAgIG5vdGhpbmcKKi8KCnN0YXRpYyB2b2lkCnBjaGFycyhjb25zdCB1c2NoYXIgKnAsIGludCBsZW5ndGgsIEJPT0wgaXNfc3ViamVjdCwgbWF0Y2hfZGF0YSAqbWQpCnsKaW50IGM7CmlmIChpc19zdWJqZWN0ICYmIGxlbmd0aCA+IG1kLT5lbmRfc3ViamVjdCAtIHApIGxlbmd0aCA9IG1kLT5lbmRfc3ViamVjdCAtIHA7CndoaWxlIChsZW5ndGgtLSA+IDApCiAgaWYgKGlzcHJpbnQoYyA9ICoocCsrKSkpIHByaW50ZigiJWMiLCBjKTsgZWxzZSBwcmludGYoIlxceCUwMngiLCBjKTsKfQojZW5kaWYKCgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogICAgICAgICAgICBIYW5kbGUgZXNjYXBlcyAgICAgICAgICAgICAgICAgICAgICAqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgXCBoYXMgYmVlbiBlbmNvdW50ZXJlZC4gSXQgZWl0aGVyIHJldHVybnMgYQpwb3NpdGl2ZSB2YWx1ZSBmb3IgYSBzaW1wbGUgZXNjYXBlIHN1Y2ggYXMgXG4sIG9yIGEgbmVnYXRpdmUgdmFsdWUgd2hpY2gKZW5jb2RlcyBvbmUgb2YgdGhlIG1vcmUgY29tcGxpY2F0ZWQgdGhpbmdzIHN1Y2ggYXMgXGQuIFdoZW4gVVRGLTggaXMgZW5hYmxlZCwKYSBwb3NpdGl2ZSB2YWx1ZSBncmVhdGVyIHRoYW4gMjU1IG1heSBiZSByZXR1cm5lZC4gT24gZW50cnksIHB0ciBpcyBwb2ludGluZyBhdAp0aGUgXC4gT24gZXhpdCwgaXQgaXMgb24gdGhlIGZpbmFsIGNoYXJhY3RlciBvZiB0aGUgZXNjYXBlIHNlcXVlbmNlLgoKQXJndW1lbnRzOgogIHB0cnB0ciAgICAgcG9pbnRzIHRvIHRoZSBwYXR0ZXJuIHBvc2l0aW9uIHBvaW50ZXIKICBlcnJvcnB0ciAgIHBvaW50cyB0byB0aGUgcG9pbnRlciB0byB0aGUgZXJyb3IgbWVzc2FnZQogIGJyYWNvdW50ICAgbnVtYmVyIG9mIHByZXZpb3VzIGV4dHJhY3RpbmcgYnJhY2tldHMKICBvcHRpb25zICAgIHRoZSBvcHRpb25zIGJpdHMKICBpc2NsYXNzICAgIFRSVUUgaWYgaW5zaWRlIGEgY2hhcmFjdGVyIGNsYXNzCgpSZXR1cm5zOiAgICAgemVybyBvciBwb3NpdGl2ZSA9PiBhIGRhdGEgY2hhcmFjdGVyCiAgICAgICAgICAgICBuZWdhdGl2ZSA9PiBhIHNwZWNpYWwgZXNjYXBlIHNlcXVlbmNlCiAgICAgICAgICAgICBvbiBlcnJvciwgZXJyb3JwdHIgaXMgc2V0CiovCgpzdGF0aWMgaW50CmNoZWNrX2VzY2FwZShjb25zdCB1c2NoYXIgKipwdHJwdHIsIGNvbnN0IGNoYXIgKiplcnJvcnB0ciwgaW50IGJyYWNvdW50LAogIGludCBvcHRpb25zLCBCT09MIGlzY2xhc3MpCnsKY29uc3QgdXNjaGFyICpwdHIgPSAqcHRycHRyOwppbnQgYywgaTsKCi8qIElmIGJhY2tzbGFzaCBpcyBhdCB0aGUgZW5kIG9mIHRoZSBwYXR0ZXJuLCBpdCdzIGFuIGVycm9yLiAqLwoKYyA9ICooKytwdHIpOwppZiAoYyA9PSAwKSAqZXJyb3JwdHIgPSBFUlIxOwoKLyogTm9uLWFscGhhbWVyaWNzIGFyZSBsaXRlcmFscy4gRm9yIGRpZ2l0cyBvciBsZXR0ZXJzLCBkbyBhbiBpbml0aWFsIGxvb2t1cCBpbgphIHRhYmxlLiBBIG5vbi16ZXJvIHJlc3VsdCBpcyBzb21ldGhpbmcgdGhhdCBjYW4gYmUgcmV0dXJuZWQgaW1tZWRpYXRlbHkuCk90aGVyd2lzZSBmdXJ0aGVyIHByb2Nlc3NpbmcgbWF5IGJlIHJlcXVpcmVkLiAqLwoKI2lmICFFQkNESUMgICAgLyogQVNDSUkgY29kaW5nICovCmVsc2UgaWYgKGMgPCAnMCcgfHwgYyA+ICd6Jykge30gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOb3QgYWxwaGFtZXJpYyAqLwplbHNlIGlmICgoaSA9IGVzY2FwZXNbYyAtICcwJ10pICE9IDApIGMgPSBpOwoKI2Vsc2UgICAgICAgICAgLyogRUJDRElDIGNvZGluZyAqLwplbHNlIGlmIChjIDwgJ2EnIHx8IChlYmNkaWNfY2hhcnRhYltjXSAmIDB4MEUpID09IDApIHt9ICAgLyogTm90IGFscGhhbWVyaWMgKi8KZWxzZSBpZiAoKGkgPSBlc2NhcGVzW2MgLSAweDQ4XSkgIT0gMCkgIGMgPSBpOwojZW5kaWYKCi8qIEVzY2FwZXMgdGhhdCBuZWVkIGZ1cnRoZXIgcHJvY2Vzc2luZywgb3IgYXJlIGlsbGVnYWwuICovCgplbHNlCiAgewogIGNvbnN0IHVzY2hhciAqb2xkcHRyOwogIHN3aXRjaCAoYykKICAgIHsKICAgIC8qIEEgbnVtYmVyIG9mIFBlcmwgZXNjYXBlcyBhcmUgbm90IGhhbmRsZWQgYnkgUENSRS4gV2UgZ2l2ZSBhbiBleHBsaWNpdAogICAgZXJyb3IuICovCgogICAgY2FzZSAnbCc6CiAgICBjYXNlICdMJzoKICAgIGNhc2UgJ04nOgogICAgY2FzZSAndSc6CiAgICBjYXNlICdVJzoKICAgICplcnJvcnB0ciA9IEVSUjM3OwogICAgYnJlYWs7CgogICAgLyogVGhlIGhhbmRsaW5nIG9mIGVzY2FwZSBzZXF1ZW5jZXMgY29uc2lzdGluZyBvZiBhIHN0cmluZyBvZiBkaWdpdHMKICAgIHN0YXJ0aW5nIHdpdGggb25lIHRoYXQgaXMgbm90IHplcm8gaXMgbm90IHN0cmFpZ2h0Zm9yd2FyZC4gQnkgZXhwZXJpbWVudCwKICAgIHRoZSB3YXkgUGVybCB3b3JrcyBzZWVtcyB0byBiZSBhcyBmb2xsb3dzOgoKICAgIE91dHNpZGUgYSBjaGFyYWN0ZXIgY2xhc3MsIHRoZSBkaWdpdHMgYXJlIHJlYWQgYXMgYSBkZWNpbWFsIG51bWJlci4gSWYgdGhlCiAgICBudW1iZXIgaXMgbGVzcyB0aGFuIDEwLCBvciBpZiB0aGVyZSBhcmUgdGhhdCBtYW55IHByZXZpb3VzIGV4dHJhY3RpbmcKICAgIGxlZnQgYnJhY2tldHMsIHRoZW4gaXQgaXMgYSBiYWNrIHJlZmVyZW5jZS4gT3RoZXJ3aXNlLCB1cCB0byB0aHJlZSBvY3RhbAogICAgZGlnaXRzIGFyZSByZWFkIHRvIGZvcm0gYW4gZXNjYXBlZCBieXRlLiBUaHVzIFwxMjMgaXMgbGlrZWx5IHRvIGJlIG9jdGFsCiAgICAxMjMgKGNmIFwwMTIzLCB3aGljaCBpcyBvY3RhbCAwMTIgZm9sbG93ZWQgYnkgdGhlIGxpdGVyYWwgMykuIElmIHRoZSBvY3RhbAogICAgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIDM3NywgdGhlIGxlYXN0IHNpZ25pZmljYW50IDggYml0cyBhcmUgdGFrZW4uIEluc2lkZSBhCiAgICBjaGFyYWN0ZXIgY2xhc3MsIFwgZm9sbG93ZWQgYnkgYSBkaWdpdCBpcyBhbHdheXMgYW4gb2N0YWwgbnVtYmVyLiAqLwoKICAgIGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6IGNhc2UgJzQnOiBjYXNlICc1JzoKICAgIGNhc2UgJzYnOiBjYXNlICc3JzogY2FzZSAnOCc6IGNhc2UgJzknOgoKICAgIGlmICghaXNjbGFzcykKICAgICAgewogICAgICBvbGRwdHIgPSBwdHI7CiAgICAgIGMgLT0gJzAnOwogICAgICB3aGlsZSAoKGRpZ2l0YWJbcHRyWzFdXSAmIGN0eXBlX2RpZ2l0KSAhPSAwKQogICAgICAgIGMgPSBjICogMTAgKyAqKCsrcHRyKSAtICcwJzsKICAgICAgaWYgKGMgPCAxMCB8fCBjIDw9IGJyYWNvdW50KQogICAgICAgIHsKICAgICAgICBjID0gLShFU0NfUkVGICsgYyk7CiAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICBwdHIgPSBvbGRwdHI7ICAgICAgLyogUHV0IHRoZSBwb2ludGVyIGJhY2sgYW5kIGZhbGwgdGhyb3VnaCAqLwogICAgICB9CgogICAgLyogSGFuZGxlIGFuIG9jdGFsIG51bWJlciBmb2xsb3dpbmcgXC4gSWYgdGhlIGZpcnN0IGRpZ2l0IGlzIDggb3IgOSwgUGVybAogICAgZ2VuZXJhdGVzIGEgYmluYXJ5IHplcm8gYnl0ZSBhbmQgdHJlYXRzIHRoZSBkaWdpdCBhcyBhIGZvbGxvd2luZyBsaXRlcmFsLgogICAgVGh1cyB3ZSBoYXZlIHRvIHB1bGwgYmFjayB0aGUgcG9pbnRlciBieSBvbmUuICovCgogICAgaWYgKChjID0gKnB0cikgPj0gJzgnKQogICAgICB7CiAgICAgIHB0ci0tOwogICAgICBjID0gMDsKICAgICAgYnJlYWs7CiAgICAgIH0KCiAgICAvKiBcMCBhbHdheXMgc3RhcnRzIGFuIG9jdGFsIG51bWJlciwgYnV0IHdlIG1heSBkcm9wIHRocm91Z2ggdG8gaGVyZSB3aXRoIGEKICAgIGxhcmdlciBmaXJzdCBvY3RhbCBkaWdpdC4gKi8KCiAgICBjYXNlICcwJzoKICAgIGMgLT0gJzAnOwogICAgd2hpbGUoaSsrIDwgMiAmJiBwdHJbMV0gPj0gJzAnICYmIHB0clsxXSA8PSAnNycpCiAgICAgICAgYyA9IGMgKiA4ICsgKigrK3B0cikgLSAnMCc7CiAgICBjICY9IDI1NTsgICAgIC8qIFRha2UgbGVhc3Qgc2lnbmlmaWNhbnQgOCBiaXRzICovCiAgICBicmVhazsKCiAgICAvKiBceCBpcyBjb21wbGljYXRlZCB3aGVuIFVURi04IGlzIGVuYWJsZWQuIFx4e2RkZH0gaXMgYSBjaGFyYWN0ZXIgbnVtYmVyCiAgICB3aGljaCBjYW4gYmUgZ3JlYXRlciB0aGFuIDB4ZmYsIGJ1dCBvbmx5IGlmIHRoZSBkZGQgYXJlIGhleCBkaWdpdHMuICovCgogICAgY2FzZSAneCc6CiNpZmRlZiBTVVBQT1JUX1VURjgKICAgIGlmIChwdHJbMV0gPT0gJ3snICYmIChvcHRpb25zICYgUENSRV9VVEY4KSAhPSAwKQogICAgICB7CiAgICAgIGNvbnN0IHVzY2hhciAqcHQgPSBwdHIgKyAyOwogICAgICByZWdpc3RlciBpbnQgY291bnQgPSAwOwogICAgICBjID0gMDsKICAgICAgd2hpbGUgKChkaWdpdGFiWypwdF0gJiBjdHlwZV94ZGlnaXQpICE9IDApCiAgICAgICAgewogICAgICAgIGludCBjYyA9ICpwdCsrOwogICAgICAgIGNvdW50Kys7CiNpZiAhRUJDRElDICAgIC8qIEFTQ0lJIGNvZGluZyAqLwogICAgICAgIGlmIChjYyA+PSAnYScpIGNjIC09IDMyOyAgICAgICAgICAgICAgIC8qIENvbnZlcnQgdG8gdXBwZXIgY2FzZSAqLwogICAgICAgIGMgPSBjICogMTYgKyBjYyAtICgoY2MgPCAnQScpPyAnMCcgOiAoJ0EnIC0gMTApKTsKI2Vsc2UgICAgICAgICAgLyogRUJDRElDIGNvZGluZyAqLwogICAgICAgIGlmIChjYyA+PSAnYScgJiYgY2MgPD0gJ3onKSBjYyArPSA2NDsgIC8qIENvbnZlcnQgdG8gdXBwZXIgY2FzZSAqLwogICAgICAgIGMgPSBjICogMTYgKyBjYyAtICgoY2MgPj0gJzAnKT8gJzAnIDogKCdBJyAtIDEwKSk7CiNlbmRpZgogICAgICAgIH0KICAgICAgaWYgKCpwdCA9PSAnfScpCiAgICAgICAgewogICAgICAgIGlmIChjIDwgMCB8fCBjb3VudCA+IDgpICplcnJvcnB0ciA9IEVSUjM0OwogICAgICAgIHB0ciA9IHB0OwogICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgLyogSWYgdGhlIHNlcXVlbmNlIG9mIGhleCBkaWdpdHMgZG9lcyBub3QgZW5kIHdpdGggJ30nLCB0aGVuIHdlIGRvbid0CiAgICAgIHJlY29nbml6ZSB0aGlzIGNvbnN0cnVjdDsgZmFsbCB0aHJvdWdoIHRvIHRoZSBub3JtYWwgXHggaGFuZGxpbmcuICovCiAgICAgIH0KI2VuZGlmCgogICAgLyogUmVhZCBqdXN0IGEgc2luZ2xlIGhleCBjaGFyICovCgogICAgYyA9IDA7CiAgICB3aGlsZSAoaSsrIDwgMiAmJiAoZGlnaXRhYltwdHJbMV1dICYgY3R5cGVfeGRpZ2l0KSAhPSAwKQogICAgICB7CiAgICAgIGludCBjYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU29tZSBjb21waWxlcnMgZG9uJ3QgbGlrZSArKyAqLwogICAgICBjYyA9ICooKytwdHIpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluIGluaXRpYWxpemVycyAqLwojaWYgIUVCQ0RJQyAgICAvKiBBU0NJSSBjb2RpbmcgKi8KICAgICAgaWYgKGNjID49ICdhJykgY2MgLT0gMzI7ICAgICAgICAgICAgICAvKiBDb252ZXJ0IHRvIHVwcGVyIGNhc2UgKi8KICAgICAgYyA9IGMgKiAxNiArIGNjIC0gKChjYyA8ICdBJyk/ICcwJyA6ICgnQScgLSAxMCkpOwojZWxzZSAgICAgICAgICAvKiBFQkNESUMgY29kaW5nICovCiAgICAgIGlmIChjYyA8PSAneicpIGNjICs9IDY0OyAgICAgICAgICAgICAgLyogQ29udmVydCB0byB1cHBlciBjYXNlICovCiAgICAgIGMgPSBjICogMTYgKyBjYyAtICgoY2MgPj0gJzAnKT8gJzAnIDogKCdBJyAtIDEwKSk7CiNlbmRpZgogICAgICB9CiAgICBicmVhazsKCiAgICAvKiBPdGhlciBzcGVjaWFsIGVzY2FwZXMgbm90IHN0YXJ0aW5nIHdpdGggYSBkaWdpdCBhcmUgc3RyYWlnaHRmb3J3YXJkICovCgogICAgY2FzZSAnYyc6CiAgICBjID0gKigrK3B0cik7CiAgICBpZiAoYyA9PSAwKQogICAgICB7CiAgICAgICplcnJvcnB0ciA9IEVSUjI7CiAgICAgIHJldHVybiAwOwogICAgICB9CgogICAgLyogQSBsZXR0ZXIgaXMgdXBwZXItY2FzZWQ7IHRoZW4gdGhlIDB4NDAgYml0IGlzIGZsaXBwZWQuIFRoaXMgY29kaW5nCiAgICBpcyBBU0NJSS1zcGVjaWZpYywgYnV0IHRoZW4gdGhlIHdob2xlIGNvbmNlcHQgb2YgXGN4IGlzIEFTQ0lJLXNwZWNpZmljLgogICAgKEhvd2V2ZXIsIGFuIEVCQ0RJQyBlcXVpdmFsZW50IGhhcyBub3cgYmVlbiBhZGRlZC4pICovCgojaWYgIUVCQ0RJQyAgICAvKiBBU0NJSSBjb2RpbmcgKi8KICAgIGlmIChjID49ICdhJyAmJiBjIDw9ICd6JykgYyAtPSAzMjsKICAgIGMgXj0gMHg0MDsKI2Vsc2UgICAgICAgICAgLyogRUJDRElDIGNvZGluZyAqLwogICAgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSBjICs9IDY0OwogICAgYyBePSAweEMwOwojZW5kaWYKICAgIGJyZWFrOwoKICAgIC8qIFBDUkVfRVhUUkEgZW5hYmxlcyBleHRlbnNpb25zIHRvIFBlcmwgaW4gdGhlIG1hdHRlciBvZiBlc2NhcGVzLiBBbnkKICAgIG90aGVyIGFscGhhbWVyaWMgZm9sbG93aW5nIFwgaXMgYW4gZXJyb3IgaWYgUENSRV9FWFRSQSB3YXMgc2V0OyBvdGhlcndpc2UsCiAgICBmb3IgUGVybCBjb21wYXRpYmlsaXR5LCBpdCBpcyBhIGxpdGVyYWwuIFRoaXMgY29kZSBsb29rcyBhIGJpdCBvZGQsIGJ1dAogICAgdGhlcmUgdXNlZCB0byBiZSBzb21lIGNhc2VzIG90aGVyIHRoYW4gdGhlIGRlZmF1bHQsIGFuZCB0aGVyZSBtYXkgYmUgYWdhaW4KICAgIGluIGZ1dHVyZSwgc28gSSBoYXZlbid0ICJvcHRpbWl6ZWQiIGl0LiAqLwoKICAgIGRlZmF1bHQ6CiAgICBpZiAoKG9wdGlvbnMgJiBQQ1JFX0VYVFJBKSAhPSAwKSBzd2l0Y2goYykKICAgICAgewogICAgICBkZWZhdWx0OgogICAgICAqZXJyb3JwdHIgPSBFUlIzOwogICAgICBicmVhazsKICAgICAgfQogICAgYnJlYWs7CiAgICB9CiAgfQoKKnB0cnB0ciA9IHB0cjsKcmV0dXJuIGM7Cn0KCgoKI2lmZGVmIFNVUFBPUlRfVUNQCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogICAgICAgICAgICAgICBIYW5kbGUgXFAgYW5kIFxwICAgICAgICAgICAgICAgICAqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciBcUCBvciBccCBoYXMgYmVlbiBlbmNvdW50ZXJlZCwgcHJvdmlkZWQgdGhhdApQQ1JFIGlzIGNvbXBpbGVkIHdpdGggc3VwcG9ydCBmb3IgVW5pY29kZSBwcm9wZXJ0aWVzLiBPbiBlbnRyeSwgcHRycHRyIGlzCnBvaW50aW5nIGF0IHRoZSBQIG9yIHAuIE9uIGV4aXQsIGl0IGlzIHBvaW50aW5nIGF0IHRoZSBmaW5hbCBjaGFyYWN0ZXIgb2YgdGhlCmVzY2FwZSBzZXF1ZW5jZS4KCkFyZ3VtZW50OgogIHB0cnB0ciAgICAgcG9pbnRzIHRvIHRoZSBwYXR0ZXJuIHBvc2l0aW9uIHBvaW50ZXIKICBuZWdwdHIgICAgIHBvaW50cyB0byBhIGJvb2xlYW4gdGhhdCBpcyBzZXQgVFJVRSBmb3IgbmVnYXRpb24gZWxzZSBGQUxTRQogIGVycm9ycHRyICAgcG9pbnRzIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBlcnJvciBtZXNzYWdlCgpSZXR1cm5zOiAgICAgdmFsdWUgZnJvbSB1Y3BfdHlwZV90YWJsZSwgb3IgLTEgZm9yIGFuIGludmFsaWQgdHlwZQoqLwoKc3RhdGljIGludApnZXRfdWNwKGNvbnN0IHVzY2hhciAqKnB0cnB0ciwgQk9PTCAqbmVncHRyLCBjb25zdCBjaGFyICoqZXJyb3JwdHIpCnsKaW50IGMsIGksIGJvdCwgdG9wOwpjb25zdCB1c2NoYXIgKnB0ciA9ICpwdHJwdHI7CmNoYXIgbmFtZVs0XTsKCmMgPSAqKCsrcHRyKTsKaWYgKGMgPT0gMCkgZ290byBFUlJPUl9SRVRVUk47CgoqbmVncHRyID0gRkFMU0U7CgovKiBcUCBvciBccCBjYW4gYmUgZm9sbG93ZWQgYnkgYSBvbmUtIG9yIHR3by1jaGFyYWN0ZXIgbmFtZSBpbiB7fSwgb3B0aW9uYWxseQpwcmVjZWRlZCBieSBeIGZvciBuZWdhdGlvbi4gKi8KCmlmIChjID09ICd7JykKICB7CiAgaWYgKHB0clsxXSA9PSAnXicpCiAgICB7CiAgICAqbmVncHRyID0gVFJVRTsKICAgIHB0cisrOwogICAgfQogIGZvciAoaSA9IDA7IGkgPD0gMjsgaSsrKQogICAgewogICAgYyA9ICooKytwdHIpOwogICAgaWYgKGMgPT0gMCkgZ290byBFUlJPUl9SRVRVUk47CiAgICBpZiAoYyA9PSAnfScpIGJyZWFrOwogICAgbmFtZVtpXSA9IGM7CiAgICB9CiAgaWYgKGMgIT0nfScpICAgLyogVHJ5IHRvIGRpc3Rpbmd1aXNoIGVycm9yIGNhc2VzICovCiAgICB7CiAgICB3aGlsZSAoKigrK3B0cikgIT0gMCAmJiAqcHRyICE9ICd9Jyk7CiAgICBpZiAoKnB0ciA9PSAnfScpIGdvdG8gVU5LTk9XTl9SRVRVUk47IGVsc2UgZ290byBFUlJPUl9SRVRVUk47CiAgICB9CiAgbmFtZVtpXSA9IDA7CiAgfQoKLyogT3RoZXJ3aXNlIHRoZXJlIGlzIGp1c3Qgb25lIGZvbGxvd2luZyBjaGFyYWN0ZXIgKi8KCmVsc2UKICB7CiAgbmFtZVswXSA9IGM7CiAgbmFtZVsxXSA9IDA7CiAgfQoKKnB0cnB0ciA9IHB0cjsKCi8qIFNlYXJjaCBmb3IgYSByZWNvZ25pemVkIHByb3BlcnR5IG5hbWUgdXNpbmcgYmluYXJ5IGNob3AgKi8KCmJvdCA9IDA7CnRvcCA9IHNpemVvZih1dHQpL3NpemVvZih1Y3BfdHlwZV90YWJsZSk7Cgp3aGlsZSAoYm90IDwgdG9wKQogIHsKICBpID0gKGJvdCArIHRvcCkvMjsKICBjID0gc3RyY21wKG5hbWUsIHV0dFtpXS5uYW1lKTsKICBpZiAoYyA9PSAwKSByZXR1cm4gdXR0W2ldLnZhbHVlOwogIGlmIChjID4gMCkgYm90ID0gaSArIDE7IGVsc2UgdG9wID0gaTsKICB9CgpVTktOT1dOX1JFVFVSTjoKKmVycm9ycHRyID0gRVJSNDc7CipwdHJwdHIgPSBwdHI7CnJldHVybiAtMTsKCkVSUk9SX1JFVFVSTjoKKmVycm9ycHRyID0gRVJSNDY7CipwdHJwdHIgPSBwdHI7CnJldHVybiAtMTsKfQojZW5kaWYKCgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogICAgICAgICAgICBDaGVjayBmb3IgY291bnRlZCByZXBlYXQgICAgICAgICAgICAqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgJ3snIGlzIGVuY291bnRlcmVkIGluIGEgcGxhY2Ugd2hlcmUgaXQgbWlnaHQKc3RhcnQgYSBxdWFudGlmaWVyLiBJdCBsb29rcyBhaGVhZCB0byBzZWUgaWYgaXQgcmVhbGx5IGlzIGEgcXVhbnRpZmllciBvciBub3QuCkl0IGlzIG9ubHkgYSBxdWFudGlmaWVyIGlmIGl0IGlzIG9uZSBvZiB0aGUgZm9ybXMge2RkZH0ge2RkZCx9IG9yIHtkZGQsZGRkfQp3aGVyZSB0aGUgZGRkcyBhcmUgZGlnaXRzLgoKQXJndW1lbnRzOgogIHAgICAgICAgICBwb2ludGVyIHRvIHRoZSBmaXJzdCBjaGFyIGFmdGVyICd7JwoKUmV0dXJuczogICAgVFJVRSBvciBGQUxTRQoqLwoKc3RhdGljIEJPT0wKaXNfY291bnRlZF9yZXBlYXQoY29uc3QgdXNjaGFyICpwKQp7CmlmICgoZGlnaXRhYlsqcCsrXSAmIGN0eXBlX2RpZ2l0KSA9PSAwKSByZXR1cm4gRkFMU0U7CndoaWxlICgoZGlnaXRhYlsqcF0gJiBjdHlwZV9kaWdpdCkgIT0gMCkgcCsrOwppZiAoKnAgPT0gJ30nKSByZXR1cm4gVFJVRTsKCmlmICgqcCsrICE9ICcsJykgcmV0dXJuIEZBTFNFOwppZiAoKnAgPT0gJ30nKSByZXR1cm4gVFJVRTsKCmlmICgoZGlnaXRhYlsqcCsrXSAmIGN0eXBlX2RpZ2l0KSA9PSAwKSByZXR1cm4gRkFMU0U7CndoaWxlICgoZGlnaXRhYlsqcF0gJiBjdHlwZV9kaWdpdCkgIT0gMCkgcCsrOwoKcmV0dXJuICgqcCA9PSAnfScpOwp9CgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogICAgICAgICBSZWFkIHJlcGVhdCBjb3VudHMgICAgICAgICAgICAgICAgICAgICAqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKiBSZWFkIGFuIGl0ZW0gb2YgdGhlIGZvcm0ge24sbX0gYW5kIHJldHVybiB0aGUgdmFsdWVzLiBUaGlzIGlzIGNhbGxlZCBvbmx5CmFmdGVyIGlzX2NvdW50ZWRfcmVwZWF0KCkgaGFzIGNvbmZpcm1lZCB0aGF0IGEgcmVwZWF0LWNvdW50IHF1YW50aWZpZXIgZXhpc3RzLApzbyB0aGUgc3ludGF4IGlzIGd1YXJhbnRlZWQgdG8gYmUgY29ycmVjdCwgYnV0IHdlIG5lZWQgdG8gY2hlY2sgdGhlIHZhbHVlcy4KCkFyZ3VtZW50czoKICBwICAgICAgICAgIHBvaW50ZXIgdG8gZmlyc3QgY2hhciBhZnRlciAneycKICBtaW5wICAgICAgIHBvaW50ZXIgdG8gaW50IGZvciBtaW4KICBtYXhwICAgICAgIHBvaW50ZXIgdG8gaW50IGZvciBtYXgKICAgICAgICAgICAgIHJldHVybmVkIGFzIC0xIGlmIG5vIG1heAogIGVycm9ycHRyICAgcG9pbnRzIHRvIHBvaW50ZXIgdG8gZXJyb3IgbWVzc2FnZQoKUmV0dXJuczogICAgIHBvaW50ZXIgdG8gJ30nIG9uIHN1Y2Nlc3M7CiAgICAgICAgICAgICBjdXJyZW50IHB0ciBvbiBlcnJvciwgd2l0aCBlcnJvcnB0ciBzZXQKKi8KCnN0YXRpYyBjb25zdCB1c2NoYXIgKgpyZWFkX3JlcGVhdF9jb3VudHMoY29uc3QgdXNjaGFyICpwLCBpbnQgKm1pbnAsIGludCAqbWF4cCwgY29uc3QgY2hhciAqKmVycm9ycHRyKQp7CmludCBtaW4gPSAwOwppbnQgbWF4ID0gLTE7CgovKiBSZWFkIHRoZSBtaW5pbXVtIHZhbHVlIGFuZCBkbyBhIHBhcmFub2lkIGNoZWNrOiBhIG5lZ2F0aXZlIHZhbHVlIGluZGljYXRlcwphbiBpbnRlZ2VyIG92ZXJmbG93LiAqLwoKd2hpbGUgKChkaWdpdGFiWypwXSAmIGN0eXBlX2RpZ2l0KSAhPSAwKSBtaW4gPSBtaW4gKiAxMCArICpwKysgLSAnMCc7CmlmIChtaW4gPCAwIHx8IG1pbiA+IDY1NTM1KQogIHsKICAqZXJyb3JwdHIgPSBFUlI1OwogIHJldHVybiBwOwogIH0KCi8qIFJlYWQgdGhlIG1heGltdW0gdmFsdWUgaWYgdGhlcmUgaXMgb25lLCBhbmQgYWdhaW4gZG8gYSBwYXJhbm9pZCBvbiBpdHMgc2l6ZS4KQWxzbywgbWF4IG11c3Qgbm90IGJlIGxlc3MgdGhhbiBtaW4uICovCgppZiAoKnAgPT0gJ30nKSBtYXggPSBtaW47IGVsc2UKICB7CiAgaWYgKCooKytwKSAhPSAnfScpCiAgICB7CiAgICBtYXggPSAwOwogICAgd2hpbGUoKGRpZ2l0YWJbKnBdICYgY3R5cGVfZGlnaXQpICE9IDApIG1heCA9IG1heCAqIDEwICsgKnArKyAtICcwJzsKICAgIGlmIChtYXggPCAwIHx8IG1heCA+IDY1NTM1KQogICAgICB7CiAgICAgICplcnJvcnB0ciA9IEVSUjU7CiAgICAgIHJldHVybiBwOwogICAgICB9CiAgICBpZiAobWF4IDwgbWluKQogICAgICB7CiAgICAgICplcnJvcnB0ciA9IEVSUjQ7CiAgICAgIHJldHVybiBwOwogICAgICB9CiAgICB9CiAgfQoKLyogRmlsbCBpbiB0aGUgcmVxdWlyZWQgdmFyaWFibGVzLCBhbmQgcGFzcyBiYWNrIHRoZSBwb2ludGVyIHRvIHRoZSB0ZXJtaW5hdGluZwonfScuICovCgoqbWlucCA9IG1pbjsKKm1heHAgPSBtYXg7CnJldHVybiBwOwp9CgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogICAgICBGaW5kIGZpcnN0IHNpZ25pZmljYW50IG9wIGNvZGUgICAgICAgICAgICAqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKiBUaGlzIGlzIGNhbGxlZCBieSBzZXZlcmFsIGZ1bmN0aW9ucyB0aGF0IHNjYW4gYSBjb21waWxlZCBleHByZXNzaW9uIGxvb2tpbmcKZm9yIGEgZml4ZWQgZmlyc3QgY2hhcmFjdGVyLCBvciBhbiBhbmNob3Jpbmcgb3AgY29kZSBldGMuIEl0IHNraXBzIG92ZXIgdGhpbmdzCnRoYXQgZG8gbm90IGluZmx1ZW5jZSB0aGlzLiBGb3Igc29tZSBjYWxscywgYSBjaGFuZ2Ugb2Ygb3B0aW9uIGlzIGltcG9ydGFudC4KRm9yIHNvbWUgY2FsbHMsIGl0IG1ha2VzIHNlbnNlIHRvIHNraXAgbmVnYXRpdmUgZm9yd2FyZCBhbmQgYWxsIGJhY2t3YXJkCmFzc2VydGlvbnMsIGFuZCBhbHNvIHRoZSBcYiBhc3NlcnRpb247IGZvciBvdGhlcnMgaXQgZG9lcyBub3QuCgpBcmd1bWVudHM6CiAgY29kZSAgICAgICAgIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBncm91cAogIG9wdGlvbnMgICAgICBwb2ludGVyIHRvIGV4dGVybmFsIG9wdGlvbnMKICBvcHRiaXQgICAgICAgdGhlIG9wdGlvbiBiaXQgd2hvc2UgY2hhbmdpbmcgaXMgc2lnbmlmaWNhbnQsIG9yCiAgICAgICAgICAgICAgICAgemVybyBpZiBub25lIGFyZQogIHNraXBhc3NlcnQgICBUUlVFIGlmIGNlcnRhaW4gYXNzZXJ0aW9ucyBhcmUgdG8gYmUgc2tpcHBlZAoKUmV0dXJuczogICAgICAgcG9pbnRlciB0byB0aGUgZmlyc3Qgc2lnbmlmaWNhbnQgb3Bjb2RlCiovCgpzdGF0aWMgY29uc3QgdXNjaGFyKgpmaXJzdF9zaWduaWZpY2FudF9jb2RlKGNvbnN0IHVzY2hhciAqY29kZSwgaW50ICpvcHRpb25zLCBpbnQgb3B0Yml0LAogIEJPT0wgc2tpcGFzc2VydCkKewpmb3IgKDs7KQogIHsKICBzd2l0Y2ggKChpbnQpKmNvZGUpCiAgICB7CiAgICBjYXNlIE9QX09QVDoKICAgIGlmIChvcHRiaXQgPiAwICYmICgoaW50KWNvZGVbMV0gJiBvcHRiaXQpICE9ICgqb3B0aW9ucyAmIG9wdGJpdCkpCiAgICAgICpvcHRpb25zID0gKGludCljb2RlWzFdOwogICAgY29kZSArPSAyOwogICAgYnJlYWs7CgogICAgY2FzZSBPUF9BU1NFUlRfTk9UOgogICAgY2FzZSBPUF9BU1NFUlRCQUNLOgogICAgY2FzZSBPUF9BU1NFUlRCQUNLX05PVDoKICAgIGlmICghc2tpcGFzc2VydCkgcmV0dXJuIGNvZGU7CiAgICBkbyBjb2RlICs9IEdFVChjb2RlLCAxKTsgd2hpbGUgKCpjb2RlID09IE9QX0FMVCk7CiAgICBjb2RlICs9IE9QX2xlbmd0aHNbKmNvZGVdOwogICAgYnJlYWs7CgogICAgY2FzZSBPUF9XT1JEX0JPVU5EQVJZOgogICAgY2FzZSBPUF9OT1RfV09SRF9CT1VOREFSWToKICAgIGlmICghc2tpcGFzc2VydCkgcmV0dXJuIGNvZGU7CiAgICAvKiBGYWxsIHRocm91Z2ggKi8KCiAgICBjYXNlIE9QX0NBTExPVVQ6CiAgICBjYXNlIE9QX0NSRUY6CiAgICBjYXNlIE9QX0JSQU5VTUJFUjoKICAgIGNvZGUgKz0gT1BfbGVuZ3Roc1sqY29kZV07CiAgICBicmVhazsKCiAgICBkZWZhdWx0OgogICAgcmV0dXJuIGNvZGU7CiAgICB9CiAgfQovKiBDb250cm9sIG5ldmVyIHJlYWNoZXMgaGVyZSAqLwp9CgoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqICAgICAgICBGaW5kIHRoZSBmaXhlZCBsZW5ndGggb2YgYSBwYXR0ZXJuICAgICAgKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyogU2NhbiBhIHBhdHRlcm4gYW5kIGNvbXB1dGUgdGhlIGZpeGVkIGxlbmd0aCBvZiBzdWJqZWN0IHRoYXQgd2lsbCBtYXRjaCBpdCwKaWYgdGhlIGxlbmd0aCBpcyBmaXhlZC4gVGhpcyBpcyBuZWVkZWQgZm9yIGRlYWxpbmcgd2l0aCBiYWNrd2FyZCBhc3NlcnRpb25zLgpJbiBVVEY4IG1vZGUsIHRoZSByZXN1bHQgaXMgaW4gY2hhcmFjdGVycyByYXRoZXIgdGhhbiBieXRlcy4KCkFyZ3VtZW50czoKICBjb2RlICAgICBwb2ludHMgdG8gdGhlIHN0YXJ0IG9mIHRoZSBwYXR0ZXJuICh0aGUgYnJhY2tldCkKICBvcHRpb25zICB0aGUgY29tcGlsaW5nIG9wdGlvbnMKClJldHVybnM6ICAgdGhlIGZpeGVkIGxlbmd0aCwgb3IgLTEgaWYgdGhlcmUgaXMgbm8gZml4ZWQgbGVuZ3RoLAogICAgICAgICAgICAgb3IgLTIgaWYgXEMgd2FzIGVuY291bnRlcmVkCiovCgpzdGF0aWMgaW50CmZpbmRfZml4ZWRsZW5ndGgodXNjaGFyICpjb2RlLCBpbnQgb3B0aW9ucykKewppbnQgbGVuZ3RoID0gLTE7CgpyZWdpc3RlciBpbnQgYnJhbmNobGVuZ3RoID0gMDsKcmVnaXN0ZXIgdXNjaGFyICpjYyA9IGNvZGUgKyAxICsgTElOS19TSVpFOwoKLyogU2NhbiBhbG9uZyB0aGUgb3Bjb2RlcyBmb3IgdGhpcyBicmFuY2guIElmIHdlIGdldCB0byB0aGUgZW5kIG9mIHRoZQpicmFuY2gsIGNoZWNrIHRoZSBsZW5ndGggYWdhaW5zdCB0aGF0IG9mIHRoZSBvdGhlciBicmFuY2hlcy4gKi8KCmZvciAoOzspCiAgewogIGludCBkOwogIHJlZ2lzdGVyIGludCBvcCA9ICpjYzsKICBpZiAob3AgPj0gT1BfQlJBKSBvcCA9IE9QX0JSQTsKCiAgc3dpdGNoIChvcCkKICAgIHsKICAgIGNhc2UgT1BfQlJBOgogICAgY2FzZSBPUF9PTkNFOgogICAgY2FzZSBPUF9DT05EOgogICAgZCA9IGZpbmRfZml4ZWRsZW5ndGgoY2MsIG9wdGlvbnMpOwogICAgaWYgKGQgPCAwKSByZXR1cm4gZDsKICAgIGJyYW5jaGxlbmd0aCArPSBkOwogICAgZG8gY2MgKz0gR0VUKGNjLCAxKTsgd2hpbGUgKCpjYyA9PSBPUF9BTFQpOwogICAgY2MgKz0gMSArIExJTktfU0laRTsKICAgIGJyZWFrOwoKICAgIC8qIFJlYWNoZWQgZW5kIG9mIGEgYnJhbmNoOyBpZiBpdCdzIGEga2V0IGl0IGlzIHRoZSBlbmQgb2YgYSBuZXN0ZWQKICAgIGNhbGwuIElmIGl0J3MgQUxUIGl0IGlzIGFuIGFsdGVybmF0aW9uIGluIGEgbmVzdGVkIGNhbGwuIElmIGl0IGlzCiAgICBFTkQgaXQncyB0aGUgZW5kIG9mIHRoZSBvdXRlciBjYWxsLiBBbGwgY2FuIGJlIGhhbmRsZWQgYnkgdGhlIHNhbWUgY29kZS4gKi8KCiAgICBjYXNlIE9QX0FMVDoKICAgIGNhc2UgT1BfS0VUOgogICAgY2FzZSBPUF9LRVRSTUFYOgogICAgY2FzZSBPUF9LRVRSTUlOOgogICAgY2FzZSBPUF9FTkQ6CiAgICBpZiAobGVuZ3RoIDwgMCkgbGVuZ3RoID0gYnJhbmNobGVuZ3RoOwogICAgICBlbHNlIGlmIChsZW5ndGggIT0gYnJhbmNobGVuZ3RoKSByZXR1cm4gLTE7CiAgICBpZiAoKmNjICE9IE9QX0FMVCkgcmV0dXJuIGxlbmd0aDsKICAgIGNjICs9IDEgKyBMSU5LX1NJWkU7CiAgICBicmFuY2hsZW5ndGggPSAwOwogICAgYnJlYWs7CgogICAgLyogU2tpcCBvdmVyIGFzc2VydGl2ZSBzdWJwYXR0ZXJucyAqLwoKICAgIGNhc2UgT1BfQVNTRVJUOgogICAgY2FzZSBPUF9BU1NFUlRfTk9UOgogICAgY2FzZSBPUF9BU1NFUlRCQUNLOgogICAgY2FzZSBPUF9BU1NFUlRCQUNLX05PVDoKICAgIGRvIGNjICs9IEdFVChjYywgMSk7IHdoaWxlICgqY2MgPT0gT1BfQUxUKTsKICAgIC8qIEZhbGwgdGhyb3VnaCAqLwoKICAgIC8qIFNraXAgb3ZlciB0aGluZ3MgdGhhdCBkb24ndCBtYXRjaCBjaGFycyAqLwoKICAgIGNhc2UgT1BfUkVWRVJTRToKICAgIGNhc2UgT1BfQlJBTlVNQkVSOgogICAgY2FzZSBPUF9DUkVGOgogICAgY2FzZSBPUF9PUFQ6CiAgICBjYXNlIE9QX0NBTExPVVQ6CiAgICBjYXNlIE9QX1NPRDoKICAgIGNhc2UgT1BfU09NOgogICAgY2FzZSBPUF9FT0Q6CiAgICBjYXNlIE9QX0VPRE46CiAgICBjYXNlIE9QX0NJUkM6CiAgICBjYXNlIE9QX0RPTEw6CiAgICBjYXNlIE9QX05PVF9XT1JEX0JPVU5EQVJZOgogICAgY2FzZSBPUF9XT1JEX0JPVU5EQVJZOgogICAgY2MgKz0gT1BfbGVuZ3Roc1sqY2NdOwogICAgYnJlYWs7CgogICAgLyogSGFuZGxlIGxpdGVyYWwgY2hhcmFjdGVycyAqLwoKICAgIGNhc2UgT1BfQ0hBUjoKICAgIGNhc2UgT1BfQ0hBUk5DOgogICAgYnJhbmNobGVuZ3RoKys7CiAgICBjYyArPSAyOwojaWZkZWYgU1VQUE9SVF9VVEY4CiAgICBpZiAoKG9wdGlvbnMgJiBQQ1JFX1VURjgpICE9IDApCiAgICAgIHsKICAgICAgd2hpbGUgKCgqY2MgJiAweGMwKSA9PSAweDgwKSBjYysrOwogICAgICB9CiNlbmRpZgogICAgYnJlYWs7CgogICAgLyogSGFuZGxlIGV4YWN0IHJlcGV0aXRpb25zLiBUaGUgY291bnQgaXMgYWxyZWFkeSBpbiBjaGFyYWN0ZXJzLCBidXQgd2UKICAgIG5lZWQgdG8gc2tpcCBvdmVyIGEgbXVsdGlieXRlIGNoYXJhY3RlciBpbiBVVEY4IG1vZGUuICAqLwoKICAgIGNhc2UgT1BfRVhBQ1Q6CiAgICBicmFuY2hsZW5ndGggKz0gR0VUMihjYywxKTsKICAgIGNjICs9IDQ7CiNpZmRlZiBTVVBQT1JUX1VURjgKICAgIGlmICgob3B0aW9ucyAmIFBDUkVfVVRGOCkgIT0gMCkKICAgICAgewogICAgICB3aGlsZSgoKmNjICYgMHg4MCkgPT0gMHg4MCkgY2MrKzsKICAgICAgfQojZW5kaWYKICAgIGJyZWFrOwoKICAgIGNhc2UgT1BfVFlQRUVYQUNUOgogICAgYnJhbmNobGVuZ3RoICs9IEdFVDIoY2MsMSk7CiAgICBjYyArPSA0OwogICAgYnJlYWs7CgogICAgLyogSGFuZGxlIHNpbmdsZS1jaGFyIG1hdGNoZXJzICovCgogICAgY2FzZSBPUF9QUk9QOgogICAgY2FzZSBPUF9OT1RQUk9QOgogICAgY2MrKzsKICAgIC8qIEZhbGwgdGhyb3VnaCAqLwoKICAgIGNhc2UgT1BfTk9UX0RJR0lUOgogICAgY2FzZSBPUF9ESUdJVDoKICAgIGNhc2UgT1BfTk9UX1dISVRFU1BBQ0U6CiAgICBjYXNlIE9QX1dISVRFU1BBQ0U6CiAgICBjYXNlIE9QX05PVF9XT1JEQ0hBUjoKICAgIGNhc2UgT1BfV09SRENIQVI6CiAgICBjYXNlIE9QX0FOWToKICAgIGJyYW5jaGxlbmd0aCsrOwogICAgY2MrKzsKICAgIGJyZWFrOwoKICAgIC8qIFRoZSBzaW5nbGUtYnl0ZSBtYXRjaGVyIGlzbid0IGFsbG93ZWQgKi8KCiAgICBjYXNlIE9QX0FOWUJZVEU6CiAgICByZXR1cm4gLTI7CgogICAgLyogQ2hlY2sgYSBjbGFzcyBmb3IgdmFyaWFibGUgcXVhbnRpZmljYXRpb24gKi8KCiNpZmRlZiBTVVBQT1JUX1VURjgKICAgIGNhc2UgT1BfWENMQVNTOgogICAgY2MgKz0gR0VUKGNjLCAxKSAtIDMzOwogICAgLyogRmFsbCB0aHJvdWdoICovCiNlbmRpZgoKICAgIGNhc2UgT1BfQ0xBU1M6CiAgICBjYXNlIE9QX05DTEFTUzoKICAgIGNjICs9IDMzOwoKICAgIHN3aXRjaCAoKmNjKQogICAgICB7CiAgICAgIGNhc2UgT1BfQ1JTVEFSOgogICAgICBjYXNlIE9QX0NSTUlOU1RBUjoKICAgICAgY2FzZSBPUF9DUlFVRVJZOgogICAgICBjYXNlIE9QX0NSTUlOUVVFUlk6CiAgICAgIHJldHVybiAtMTsKCiAgICAgIGNhc2UgT1BfQ1JSQU5HRToKICAgICAgY2FzZSBPUF9DUk1JTlJBTkdFOgogICAgICBpZiAoR0VUMihjYywxKSAhPSBHRVQyKGNjLDMpKSByZXR1cm4gLTE7CiAgICAgIGJyYW5jaGxlbmd0aCArPSBHRVQyKGNjLDEpOwogICAgICBjYyArPSA1OwogICAgICBicmVhazsKCiAgICAgIGRlZmF1bHQ6CiAgICAgIGJyYW5jaGxlbmd0aCsrOwogICAgICB9CiAgICBicmVhazsKCiAgICAvKiBBbnl0aGluZyBlbHNlIGlzIHZhcmlhYmxlIGxlbmd0aCAqLwoKICAgIGRlZmF1bHQ6CiAgICByZXR1cm4gLTE7CiAgICB9CiAgfQovKiBDb250cm9sIG5ldmVyIGdldHMgaGVyZSAqLwp9CgoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqICAgIFNjYW4gY29tcGlsZWQgcmVnZXggZm9yIG51bWJlcmVkIGJyYWNrZXQgICAgKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyogVGhpcyBsaXR0bGUgZnVuY3Rpb24gc2NhbnMgdGhyb3VnaCBhIGNvbXBpbGVkIHBhdHRlcm4gdW50aWwgaXQgZmluZHMgYQpjYXB0dXJpbmcgYnJhY2tldCB3aXRoIHRoZSBnaXZlbiBudW1iZXIuCgpBcmd1bWVudHM6CiAgY29kZSAgICAgICAgcG9pbnRzIHRvIHN0YXJ0IG9mIGV4cHJlc3Npb24KICB1dGY4ICAgICAgICBUUlVFIGluIFVURi04IG1vZGUKICBudW1iZXIgICAgICB0aGUgcmVxdWlyZWQgYnJhY2tldCBudW1iZXIKClJldHVybnM6ICAgICAgcG9pbnRlciB0byB0aGUgb3Bjb2RlIGZvciB0aGUgYnJhY2tldCwgb3IgTlVMTCBpZiBub3QgZm91bmQKKi8KCnN0YXRpYyBjb25zdCB1c2NoYXIgKgpmaW5kX2JyYWNrZXQoY29uc3QgdXNjaGFyICpjb2RlLCBCT09MIHV0ZjgsIGludCBudW1iZXIpCnsKI2lmbmRlZiBTVVBQT1JUX1VURjgKdXRmOCA9IHV0Zjg7ICAgICAgICAgICAgICAgLyogU3RvcCBwZWRhbnRpYyBjb21waWxlcnMgY29tcGxhaW5pbmcgKi8KI2VuZGlmCgpmb3IgKDs7KQogIHsKICByZWdpc3RlciBpbnQgYyA9ICpjb2RlOwogIGlmIChjID09IE9QX0VORCkgcmV0dXJuIE5VTEw7CiAgZWxzZSBpZiAoYyA+IE9QX0JSQSkKICAgIHsKICAgIGludCBuID0gYyAtIE9QX0JSQTsKICAgIGlmIChuID4gRVhUUkFDVF9CQVNJQ19NQVgpIG4gPSBHRVQyKGNvZGUsIDIrTElOS19TSVpFKTsKICAgIGlmIChuID09IG51bWJlcikgcmV0dXJuICh1c2NoYXIgKiljb2RlOwogICAgY29kZSArPSBPUF9sZW5ndGhzW09QX0JSQV07CiAgICB9CiAgZWxzZQogICAgewogICAgY29kZSArPSBPUF9sZW5ndGhzW2NdOwoKI2lmZGVmIFNVUFBPUlRfVVRGOAoKICAgIC8qIEluIFVURi04IG1vZGUsIG9wY29kZXMgdGhhdCBhcmUgZm9sbG93ZWQgYnkgYSBjaGFyYWN0ZXIgbWF5IGJlIGZvbGxvd2VkCiAgICBieSBhIG11bHRpLWJ5dGUgY2hhcmFjdGVyLiBUaGUgbGVuZ3RoIGluIHRoZSB0YWJsZSBpcyBhIG1pbmltdW0sIHNvIHdlIGhhdmUKICAgIHRvIHNjYW4gYWxvbmcgdG8gc2tpcCB0aGUgZXh0cmEgYnl0ZXMuIEFsbCBvcGNvZGVzIGFyZSBsZXNzIHRoYW4gMTI4LCBzbyB3ZQogICAgY2FuIHVzZSByZWxhdGl2ZWx5IGVmZmljaWVudCBjb2RlLiAqLwoKICAgIGlmICh1dGY4KSBzd2l0Y2goYykKICAgICAgewogICAgICBjYXNlIE9QX0NIQVI6CiAgICAgIGNhc2UgT1BfQ0hBUk5DOgogICAgICBjYXNlIE9QX0VYQUNUOgogICAgICBjYXNlIE9QX1VQVE86CiAgICAgIGNhc2UgT1BfTUlOVVBUTzoKICAgICAgY2FzZSBPUF9TVEFSOgogICAgICBjYXNlIE9QX01JTlNUQVI6CiAgICAgIGNhc2UgT1BfUExVUzoKICAgICAgY2FzZSBPUF9NSU5QTFVTOgogICAgICBjYXNlIE9QX1FVRVJZOgogICAgICBjYXNlIE9QX01JTlFVRVJZOgogICAgICB3aGlsZSAoKCpjb2RlICYgMHhjMCkgPT0gMHg4MCkgY29kZSsrOwogICAgICBicmVhazsKCiAgICAgIC8qIFhDTEFTUyBpcyB1c2VkIGZvciBjbGFzc2VzIHRoYXQgY2Fubm90IGJlIHJlcHJlc2VudGVkIGp1c3QgYnkgYSBiaXQKICAgICAgbWFwLiBUaGlzIGluY2x1ZGVzIG5lZ2F0ZWQgc2luZ2xlIGhpZ2gtdmFsdWVkIGNoYXJhY3RlcnMuIFRoZSBsZW5ndGggaW4KICAgICAgdGhlIHRhYmxlIGlzIHplcm87IHRoZSBhY3R1YWwgbGVuZ3RoIGlzIHN0b3JlZCBpbiB0aGUgY29tcGlsZWQgY29kZS4gKi8KCiAgICAgIGNhc2UgT1BfWENMQVNTOgogICAgICBjb2RlICs9IEdFVChjb2RlLCAxKSArIDE7CiAgICAgIGJyZWFrOwogICAgICB9CiNlbmRpZgogICAgfQogIH0KfQoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqICAgU2NhbiBjb21waWxlZCByZWdleCBmb3IgcmVjdXJzaW9uIHJlZmVyZW5jZSAgKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyogVGhpcyBsaXR0bGUgZnVuY3Rpb24gc2NhbnMgdGhyb3VnaCBhIGNvbXBpbGVkIHBhdHRlcm4gdW50aWwgaXQgZmluZHMgYW4KaW5zdGFuY2Ugb2YgT1BfUkVDVVJTRS4KCkFyZ3VtZW50czoKICBjb2RlICAgICAgICBwb2ludHMgdG8gc3RhcnQgb2YgZXhwcmVzc2lvbgogIHV0ZjggICAgICAgIFRSVUUgaW4gVVRGLTggbW9kZQoKUmV0dXJuczogICAgICBwb2ludGVyIHRvIHRoZSBvcGNvZGUgZm9yIE9QX1JFQ1VSU0UsIG9yIE5VTEwgaWYgbm90IGZvdW5kCiovCgpzdGF0aWMgY29uc3QgdXNjaGFyICoKZmluZF9yZWN1cnNlKGNvbnN0IHVzY2hhciAqY29kZSwgQk9PTCB1dGY4KQp7CiNpZm5kZWYgU1VQUE9SVF9VVEY4CnV0ZjggPSB1dGY4OyAgICAgICAgICAgICAgIC8qIFN0b3AgcGVkYW50aWMgY29tcGlsZXJzIGNvbXBsYWluaW5nICovCiNlbmRpZgoKZm9yICg7OykKICB7CiAgcmVnaXN0ZXIgaW50IGMgPSAqY29kZTsKICBpZiAoYyA9PSBPUF9FTkQpIHJldHVybiBOVUxMOwogIGVsc2UgaWYgKGMgPT0gT1BfUkVDVVJTRSkgcmV0dXJuIGNvZGU7CiAgZWxzZSBpZiAoYyA+IE9QX0JSQSkKICAgIHsKICAgIGNvZGUgKz0gT1BfbGVuZ3Roc1tPUF9CUkFdOwogICAgfQogIGVsc2UKICAgIHsKICAgIGNvZGUgKz0gT1BfbGVuZ3Roc1tjXTsKCiNpZmRlZiBTVVBQT1JUX1VURjgKCiAgICAvKiBJbiBVVEYtOCBtb2RlLCBvcGNvZGVzIHRoYXQgYXJlIGZvbGxvd2VkIGJ5IGEgY2hhcmFjdGVyIG1heSBiZSBmb2xsb3dlZAogICAgYnkgYSBtdWx0aS1ieXRlIGNoYXJhY3Rlci4gVGhlIGxlbmd0aCBpbiB0aGUgdGFibGUgaXMgYSBtaW5pbXVtLCBzbyB3ZSBoYXZlCiAgICB0byBzY2FuIGFsb25nIHRvIHNraXAgdGhlIGV4dHJhIGJ5dGVzLiBBbGwgb3Bjb2RlcyBhcmUgbGVzcyB0aGFuIDEyOCwgc28gd2UKICAgIGNhbiB1c2UgcmVsYXRpdmVseSBlZmZpY2llbnQgY29kZS4gKi8KCiAgICBpZiAodXRmOCkgc3dpdGNoKGMpCiAgICAgIHsKICAgICAgY2FzZSBPUF9DSEFSOgogICAgICBjYXNlIE9QX0NIQVJOQzoKICAgICAgY2FzZSBPUF9FWEFDVDoKICAgICAgY2FzZSBPUF9VUFRPOgogICAgICBjYXNlIE9QX01JTlVQVE86CiAgICAgIGNhc2UgT1BfU1RBUjoKICAgICAgY2FzZSBPUF9NSU5TVEFSOgogICAgICBjYXNlIE9QX1BMVVM6CiAgICAgIGNhc2UgT1BfTUlOUExVUzoKICAgICAgY2FzZSBPUF9RVUVSWToKICAgICAgY2FzZSBPUF9NSU5RVUVSWToKICAgICAgd2hpbGUgKCgqY29kZSAmIDB4YzApID09IDB4ODApIGNvZGUrKzsKICAgICAgYnJlYWs7CgogICAgICAvKiBYQ0xBU1MgaXMgdXNlZCBmb3IgY2xhc3NlcyB0aGF0IGNhbm5vdCBiZSByZXByZXNlbnRlZCBqdXN0IGJ5IGEgYml0CiAgICAgIG1hcC4gVGhpcyBpbmNsdWRlcyBuZWdhdGVkIHNpbmdsZSBoaWdoLXZhbHVlZCBjaGFyYWN0ZXJzLiBUaGUgbGVuZ3RoIGluCiAgICAgIHRoZSB0YWJsZSBpcyB6ZXJvOyB0aGUgYWN0dWFsIGxlbmd0aCBpcyBzdG9yZWQgaW4gdGhlIGNvbXBpbGVkIGNvZGUuICovCgogICAgICBjYXNlIE9QX1hDTEFTUzoKICAgICAgY29kZSArPSBHRVQoY29kZSwgMSkgKyAxOwogICAgICBicmVhazsKICAgICAgfQojZW5kaWYKICAgIH0KICB9Cn0KCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiAgICBTY2FuIGNvbXBpbGVkIGJyYW5jaCBmb3Igbm9uLWVtcHRpbmVzcyAgICAgICoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qIFRoaXMgZnVuY3Rpb24gc2NhbnMgdGhyb3VnaCBhIGJyYW5jaCBvZiBhIGNvbXBpbGVkIHBhdHRlcm4gdG8gc2VlIHdoZXRoZXIgaXQKY2FuIG1hdGNoIHRoZSBlbXB0eSBzdHJpbmcgb3Igbm90LiBJdCBpcyBjYWxsZWQgb25seSBmcm9tIGNvdWxkX2JlX2VtcHR5KCkKYmVsb3cuIE5vdGUgdGhhdCBmaXJzdF9zaWduaWZpY2FudF9jb2RlKCkgc2tpcHMgb3ZlciBhc3NlcnRpb25zLiBJZiB3ZSBoaXQgYW4KdW5jbG9zZWQgYnJhY2tldCwgd2UgcmV0dXJuICJlbXB0eSIgLSB0aGlzIG1lYW5zIHdlJ3ZlIHN0cnVjayBhbiBpbm5lciBicmFja2V0Cndob3NlIGN1cnJlbnQgYnJhbmNoIHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4gc2Nhbm5lZC4KCkFyZ3VtZW50czoKICBjb2RlICAgICAgICBwb2ludHMgdG8gc3RhcnQgb2Ygc2VhcmNoCiAgZW5kY29kZSAgICAgcG9pbnRzIHRvIHdoZXJlIHRvIHN0b3AKICB1dGY4ICAgICAgICBUUlVFIGlmIGluIFVURjggbW9kZQoKUmV0dXJuczogICAgICBUUlVFIGlmIHdoYXQgaXMgbWF0Y2hlZCBjb3VsZCBiZSBlbXB0eQoqLwoKc3RhdGljIEJPT0wKY291bGRfYmVfZW1wdHlfYnJhbmNoKGNvbnN0IHVzY2hhciAqY29kZSwgY29uc3QgdXNjaGFyICplbmRjb2RlLCBCT09MIHV0ZjgpCnsKcmVnaXN0ZXIgaW50IGM7CmZvciAoY29kZSA9IGZpcnN0X3NpZ25pZmljYW50X2NvZGUoY29kZSArIDEgKyBMSU5LX1NJWkUsIE5VTEwsIDAsIFRSVUUpOwogICAgIGNvZGUgPCBlbmRjb2RlOwogICAgIGNvZGUgPSBmaXJzdF9zaWduaWZpY2FudF9jb2RlKGNvZGUgKyBPUF9sZW5ndGhzW2NdLCBOVUxMLCAwLCBUUlVFKSkKICB7CiAgY29uc3QgdXNjaGFyICpjY29kZTsKCiAgYyA9ICpjb2RlOwoKICBpZiAoYyA+PSBPUF9CUkEpCiAgICB7CiAgICBCT09MIGVtcHR5X2JyYW5jaDsKICAgIGlmIChHRVQoY29kZSwgMSkgPT0gMCkgcmV0dXJuIFRSVUU7ICAgIC8qIEhpdCB1bmNsb3NlZCBicmFja2V0ICovCgogICAgLyogU2NhbiBhIGNsb3NlZCBicmFja2V0ICovCgogICAgZW1wdHlfYnJhbmNoID0gRkFMU0U7CiAgICBkbwogICAgICB7CiAgICAgIGlmICghZW1wdHlfYnJhbmNoICYmIGNvdWxkX2JlX2VtcHR5X2JyYW5jaChjb2RlLCBlbmRjb2RlLCB1dGY4KSkKICAgICAgICBlbXB0eV9icmFuY2ggPSBUUlVFOwogICAgICBjb2RlICs9IEdFVChjb2RlLCAxKTsKICAgICAgfQogICAgd2hpbGUgKCpjb2RlID09IE9QX0FMVCk7CiAgICBpZiAoIWVtcHR5X2JyYW5jaCkgcmV0dXJuIEZBTFNFOyAgIC8qIEFsbCBicmFuY2hlcyBhcmUgbm9uLWVtcHR5ICovCiAgICBjb2RlICs9IDEgKyBMSU5LX1NJWkU7CiAgICBjID0gKmNvZGU7CiAgICB9CgogIGVsc2Ugc3dpdGNoIChjKQogICAgewogICAgLyogQ2hlY2sgZm9yIHF1YW50aWZpZXJzIGFmdGVyIGEgY2xhc3MgKi8KCiNpZmRlZiBTVVBQT1JUX1VURjgKICAgIGNhc2UgT1BfWENMQVNTOgogICAgY2NvZGUgPSBjb2RlICsgR0VUKGNvZGUsIDEpOwogICAgZ290byBDSEVDS19DTEFTU19SRVBFQVQ7CiNlbmRpZgoKICAgIGNhc2UgT1BfQ0xBU1M6CiAgICBjYXNlIE9QX05DTEFTUzoKICAgIGNjb2RlID0gY29kZSArIDMzOwoKI2lmZGVmIFNVUFBPUlRfVVRGOAogICAgQ0hFQ0tfQ0xBU1NfUkVQRUFUOgojZW5kaWYKCiAgICBzd2l0Y2ggKCpjY29kZSkKICAgICAgewogICAgICBjYXNlIE9QX0NSU1RBUjogICAgICAgICAgICAvKiBUaGVzZSBjb3VsZCBiZSBlbXB0eTsgY29udGludWUgKi8KICAgICAgY2FzZSBPUF9DUk1JTlNUQVI6CiAgICAgIGNhc2UgT1BfQ1JRVUVSWToKICAgICAgY2FzZSBPUF9DUk1JTlFVRVJZOgogICAgICBicmVhazsKCiAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgIC8qIE5vbi1yZXBlYXQgPT4gY2xhc3MgbXVzdCBtYXRjaCAqLwogICAgICBjYXNlIE9QX0NSUExVUzogICAgICAgICAgICAvKiBUaGVzZSByZXBlYXRzIGFyZW4ndCBlbXB0eSAqLwogICAgICBjYXNlIE9QX0NSTUlOUExVUzoKICAgICAgcmV0dXJuIEZBTFNFOwoKICAgICAgY2FzZSBPUF9DUlJBTkdFOgogICAgICBjYXNlIE9QX0NSTUlOUkFOR0U6CiAgICAgIGlmIChHRVQyKGNjb2RlLCAxKSA+IDApIHJldHVybiBGQUxTRTsgIC8qIE1pbmltdW0gPiAwICovCiAgICAgIGJyZWFrOwogICAgICB9CiAgICBicmVhazsKCiAgICAvKiBPcGNvZGVzIHRoYXQgbXVzdCBtYXRjaCBhIGNoYXJhY3RlciAqLwoKICAgIGNhc2UgT1BfUFJPUDoKICAgIGNhc2UgT1BfTk9UUFJPUDoKICAgIGNhc2UgT1BfRVhUVU5JOgogICAgY2FzZSBPUF9OT1RfRElHSVQ6CiAgICBjYXNlIE9QX0RJR0lUOgogICAgY2FzZSBPUF9OT1RfV0hJVEVTUEFDRToKICAgIGNhc2UgT1BfV0hJVEVTUEFDRToKICAgIGNhc2UgT1BfTk9UX1dPUkRDSEFSOgogICAgY2FzZSBPUF9XT1JEQ0hBUjoKICAgIGNhc2UgT1BfQU5ZOgogICAgY2FzZSBPUF9BTllCWVRFOgogICAgY2FzZSBPUF9DSEFSOgogICAgY2FzZSBPUF9DSEFSTkM6CiAgICBjYXNlIE9QX05PVDoKICAgIGNhc2UgT1BfUExVUzoKICAgIGNhc2UgT1BfTUlOUExVUzoKICAgIGNhc2UgT1BfRVhBQ1Q6CiAgICBjYXNlIE9QX05PVFBMVVM6CiAgICBjYXNlIE9QX05PVE1JTlBMVVM6CiAgICBjYXNlIE9QX05PVEVYQUNUOgogICAgY2FzZSBPUF9UWVBFUExVUzoKICAgIGNhc2UgT1BfVFlQRU1JTlBMVVM6CiAgICBjYXNlIE9QX1RZUEVFWEFDVDoKICAgIHJldHVybiBGQUxTRTsKCiAgICAvKiBFbmQgb2YgYnJhbmNoICovCgogICAgY2FzZSBPUF9LRVQ6CiAgICBjYXNlIE9QX0tFVFJNQVg6CiAgICBjYXNlIE9QX0tFVFJNSU46CiAgICBjYXNlIE9QX0FMVDoKICAgIHJldHVybiBUUlVFOwoKICAgIC8qIEluIFVURi04IG1vZGUsIFNUQVIsIE1JTlNUQVIsIFFVRVJZLCBNSU5RVUVSWSwgVVBUTywgYW5kIE1JTlVQVE8gIG1heSBiZQogICAgZm9sbG93ZWQgYnkgYSBtdWx0aWJ5dGUgY2hhcmFjdGVyICovCgojaWZkZWYgU1VQUE9SVF9VVEY4CiAgICBjYXNlIE9QX1NUQVI6CiAgICBjYXNlIE9QX01JTlNUQVI6CiAgICBjYXNlIE9QX1FVRVJZOgogICAgY2FzZSBPUF9NSU5RVUVSWToKICAgIGNhc2UgT1BfVVBUTzoKICAgIGNhc2UgT1BfTUlOVVBUTzoKICAgIGlmICh1dGY4KSB3aGlsZSAoKGNvZGVbMl0gJiAweGMwKSA9PSAweDgwKSBjb2RlKys7CiAgICBicmVhazsKI2VuZGlmCiAgICB9CiAgfQoKcmV0dXJuIFRSVUU7Cn0KCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiAgICBTY2FuIGNvbXBpbGVkIHJlZ2V4IGZvciBub24tZW1wdGluZXNzICAgICAgICoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGNoZWNrIGZvciBsZWZ0IHJlY3Vyc2l2ZSBjYWxscy4gV2Ugd2FudCB0byBjaGVjawp0aGUgY3VycmVudCBicmFuY2ggb2YgdGhlIGN1cnJlbnQgcGF0dGVybiB0byBzZWUgaWYgaXQgY291bGQgbWF0Y2ggdGhlIGVtcHR5CnN0cmluZy4gSWYgaXQgY291bGQsIHdlIG11c3QgbG9vayBvdXR3YXJkcyBmb3IgYnJhbmNoZXMgYXQgb3RoZXIgbGV2ZWxzLApzdG9wcGluZyB3aGVuIHdlIHBhc3MgYmV5b25kIHRoZSBicmFja2V0IHdoaWNoIGlzIHRoZSBzdWJqZWN0IG9mIHRoZSByZWN1cnNpb24uCgpBcmd1bWVudHM6CiAgY29kZSAgICAgICAgcG9pbnRzIHRvIHN0YXJ0IG9mIHRoZSByZWN1cnNpb24KICBlbmRjb2RlICAgICBwb2ludHMgdG8gd2hlcmUgdG8gc3RvcCAoY3VycmVudCBSRUNVUlNFIGl0ZW0pCiAgYmNwdHIgICAgICAgcG9pbnRzIHRvIHRoZSBjaGFpbiBvZiBjdXJyZW50ICh1bmNsb3NlZCkgYnJhbmNoIHN0YXJ0cwogIHV0ZjggICAgICAgIFRSVUUgaWYgaW4gVVRGLTggbW9kZQoKUmV0dXJuczogICAgICBUUlVFIGlmIHdoYXQgaXMgbWF0Y2hlZCBjb3VsZCBiZSBlbXB0eQoqLwoKc3RhdGljIEJPT0wKY291bGRfYmVfZW1wdHkoY29uc3QgdXNjaGFyICpjb2RlLCBjb25zdCB1c2NoYXIgKmVuZGNvZGUsIGJyYW5jaF9jaGFpbiAqYmNwdHIsCiAgQk9PTCB1dGY4KQp7CndoaWxlIChiY3B0ciAhPSBOVUxMICYmIGJjcHRyLT5jdXJyZW50ID49IGNvZGUpCiAgewogIGlmICghY291bGRfYmVfZW1wdHlfYnJhbmNoKGJjcHRyLT5jdXJyZW50LCBlbmRjb2RlLCB1dGY4KSkgcmV0dXJuIEZBTFNFOwogIGJjcHRyID0gYmNwdHItPm91dGVyOwogIH0KcmV0dXJuIFRSVUU7Cn0KCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiAgICAgICAgICAgQ2hlY2sgZm9yIFBPU0lYIGNsYXNzIHN5bnRheCAgICAgICAgICoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIHNlcXVlbmNlICJbOiIgb3IgIlsuIiBvciAiWz0iIGlzCmVuY291bnRlcmVkIGluIGEgY2hhcmFjdGVyIGNsYXNzLiBJdCBjaGVja3Mgd2hldGhlciB0aGlzIGlzIGZvbGxvd2VkIGJ5IGFuCm9wdGlvbmFsIF4gYW5kIHRoZW4gYSBzZXF1ZW5jZSBvZiBsZXR0ZXJzLCB0ZXJtaW5hdGVkIGJ5IGEgbWF0Y2hpbmcgIjpdIiBvcgoiLl0iIG9yICI9XSIuCgpBcmd1bWVudDoKICBwdHIgICAgICBwb2ludGVyIHRvIHRoZSBpbml0aWFsIFsKICBlbmRwdHIgICB3aGVyZSB0byByZXR1cm4gdGhlIGVuZCBwb2ludGVyCiAgY2QgICAgICAgcG9pbnRlciB0byBjb21waWxlIGRhdGEKClJldHVybnM6ICAgVFJVRSBvciBGQUxTRQoqLwoKc3RhdGljIEJPT0wKY2hlY2tfcG9zaXhfc3ludGF4KGNvbnN0IHVzY2hhciAqcHRyLCBjb25zdCB1c2NoYXIgKiplbmRwdHIsIGNvbXBpbGVfZGF0YSAqY2QpCnsKaW50IHRlcm1pbmF0b3I7ICAgICAgICAgIC8qIERvbid0IGNvbWJpbmUgdGhlc2UgbGluZXM7IHRoZSBTb2xhcmlzIGNjICovCnRlcm1pbmF0b3IgPSAqKCsrcHRyKTsgICAvKiBjb21waWxlciB3YXJucyBhYm91dCAibm9uLWNvbnN0YW50IiBpbml0aWFsaXplci4gKi8KaWYgKCooKytwdHIpID09ICdeJykgcHRyKys7CndoaWxlICgoY2QtPmN0eXBlc1sqcHRyXSAmIGN0eXBlX2xldHRlcikgIT0gMCkgcHRyKys7CmlmICgqcHRyID09IHRlcm1pbmF0b3IgJiYgcHRyWzFdID09ICddJykKICB7CiAgKmVuZHB0ciA9IHB0cjsKICByZXR1cm4gVFJVRTsKICB9CnJldHVybiBGQUxTRTsKfQoKCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiAgICAgICAgICBDaGVjayBQT1NJWCBjbGFzcyBuYW1lICAgICAgICAgICAgICAgICoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGNoZWNrIHRoZSBuYW1lIGdpdmVuIGluIGEgUE9TSVgtc3R5bGUgY2xhc3MgZW50cnkKc3VjaCBhcyBbOmFsbnVtOl0uCgpBcmd1bWVudHM6CiAgcHRyICAgICAgICBwb2ludHMgdG8gdGhlIGZpcnN0IGxldHRlcgogIGxlbiAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgbmFtZQoKUmV0dXJuczogICAgIGEgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBuYW1lLCBvciAtMSBpZiB1bmtub3duCiovCgpzdGF0aWMgaW50CmNoZWNrX3Bvc2l4X25hbWUoY29uc3QgdXNjaGFyICpwdHIsIGludCBsZW4pCnsKcmVnaXN0ZXIgaW50IHlpZWxkID0gMDsKd2hpbGUgKHBvc2l4X25hbWVfbGVuZ3Roc1t5aWVsZF0gIT0gMCkKICB7CiAgaWYgKGxlbiA9PSBwb3NpeF9uYW1lX2xlbmd0aHNbeWllbGRdICYmCiAgICBzdHJuY21wKChjb25zdCBjaGFyICopcHRyLCBwb3NpeF9uYW1lc1t5aWVsZF0sIGxlbikgPT0gMCkgcmV0dXJuIHlpZWxkOwogIHlpZWxkKys7CiAgfQpyZXR1cm4gLTE7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqICAgIEFkanVzdCBPUF9SRUNVUlNFIGl0ZW1zIGluIHJlcGVhdGVkIGdyb3VwICAgKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyogT1BfUkVDVVJTRSBpdGVtcyBjb250YWluIGFuIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgcmVnZXggdG8gdGhlIGdyb3VwCnRoYXQgaXMgcmVmZXJlbmNlZC4gVGhpcyBtZWFucyB0aGF0IGdyb3VwcyBjYW4gYmUgcmVwbGljYXRlZCBmb3IgZml4ZWQKcmVwZXRpdGlvbiBzaW1wbHkgYnkgY29weWluZyAoYmVjYXVzZSB0aGUgcmVjdXJzaW9uIGlzIGFsbG93ZWQgdG8gcmVmZXIgdG8KZWFybGllciBncm91cHMgdGhhdCBhcmUgb3V0c2lkZSB0aGUgY3VycmVudCBncm91cCkuIEhvd2V2ZXIsIHdoZW4gYSBncm91cCBpcwpvcHRpb25hbCAoaS5lLiB0aGUgbWluaW11bSBxdWFudGlmaWVyIGlzIHplcm8pLCBPUF9CUkFaRVJPIGlzIGluc2VydGVkIGJlZm9yZQppdCwgYWZ0ZXIgaXQgaGFzIGJlZW4gY29tcGlsZWQuIFRoaXMgbWVhbnMgdGhhdCBhbnkgT1BfUkVDVVJTRSBpdGVtcyB3aXRoaW4gaXQKdGhhdCByZWZlciB0byB0aGUgZ3JvdXAgaXRzZWxmIG9yIGFueSBjb250YWluZWQgZ3JvdXBzIGhhdmUgdG8gaGF2ZSB0aGVpcgpvZmZzZXRzIGFkanVzdGVkLiBUaGF0IGlzIHRoZSBqb2Igb2YgdGhpcyBmdW5jdGlvbi4gQmVmb3JlIGl0IGlzIGNhbGxlZCwgdGhlCnBhcnRpYWxseSBjb21waWxlZCByZWdleCBtdXN0IGJlIHRlbXBvcmFyaWx5IHRlcm1pbmF0ZWQgd2l0aCBPUF9FTkQuCgpBcmd1bWVudHM6CiAgZ3JvdXAgICAgICBwb2ludHMgdG8gdGhlIHN0YXJ0IG9mIHRoZSBncm91cAogIGFkanVzdCAgICAgdGhlIGFtb3VudCBieSB3aGljaCB0aGUgZ3JvdXAgaXMgdG8gYmUgbW92ZWQKICB1dGY4ICAgICAgIFRSVUUgaW4gVVRGLTggbW9kZQogIGNkICAgICAgICAgY29udGFpbnMgcG9pbnRlcnMgdG8gdGFibGVzIGV0Yy4KClJldHVybnM6ICAgICBub3RoaW5nCiovCgpzdGF0aWMgdm9pZAphZGp1c3RfcmVjdXJzZSh1c2NoYXIgKmdyb3VwLCBpbnQgYWRqdXN0LCBCT09MIHV0ZjgsIGNvbXBpbGVfZGF0YSAqY2QpCnsKdXNjaGFyICpwdHIgPSBncm91cDsKd2hpbGUgKChwdHIgPSAodXNjaGFyICopZmluZF9yZWN1cnNlKHB0ciwgdXRmOCkpICE9IE5VTEwpCiAgewogIGludCBvZmZzZXQgPSBHRVQocHRyLCAxKTsKICBpZiAoY2QtPnN0YXJ0X2NvZGUgKyBvZmZzZXQgPj0gZ3JvdXApIFBVVChwdHIsIDEsIG9mZnNldCArIGFkanVzdCk7CiAgcHRyICs9IDEgKyBMSU5LX1NJWkU7CiAgfQp9CgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogICAgICAgIEluc2VydCBhbiBhdXRvbWF0aWMgY2FsbG91dCBwb2ludCAgICAgICAqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBQQ1JFX0FVVE9fQ0FMTE9VVCBvcHRpb24gaXMgc2V0LCB0byBpbnNlcnQKY2FsbG91dCBwb2ludHMgYmVmb3JlIGVhY2ggcGF0dGVybiBpdGVtLgoKQXJndW1lbnRzOgogIGNvZGUgICAgICAgICAgIGN1cnJlbnQgY29kZSBwb2ludGVyCiAgcHRyICAgICAgICAgICAgY3VycmVudCBwYXR0ZXJuIHBvaW50ZXIKICBjZCAgICAgICAgICAgICBwb2ludGVycyB0byB0YWJsZXMgZXRjCgpSZXR1cm5zOiAgICAgICAgIG5ldyBjb2RlIHBvaW50ZXIKKi8KCnN0YXRpYyB1c2NoYXIgKgphdXRvX2NhbGxvdXQodXNjaGFyICpjb2RlLCBjb25zdCB1c2NoYXIgKnB0ciwgY29tcGlsZV9kYXRhICpjZCkKewoqY29kZSsrID0gT1BfQ0FMTE9VVDsKKmNvZGUrKyA9IDI1NTsKUFVUKGNvZGUsIDAsIHB0ciAtIGNkLT5zdGFydF9wYXR0ZXJuKTsgIC8qIFBhdHRlcm4gb2Zmc2V0ICovClBVVChjb2RlLCBMSU5LX1NJWkUsIDApOyAgICAgICAgICAgICAgICAvKiBEZWZhdWx0IGxlbmd0aCAqLwpyZXR1cm4gY29kZSArIDIqTElOS19TSVpFOwp9CgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogICAgICAgICBDb21wbGV0ZSBhIGNhbGxvdXQgaXRlbSAgICAgICAgICAgICAgICAqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKiBBIGNhbGxvdXQgaXRlbSBjb250YWlucyB0aGUgbGVuZ3RoIG9mIHRoZSBuZXh0IGl0ZW0gaW4gdGhlIHBhdHRlcm4sIHdoaWNoCndlIGNhbid0IGZpbGwgaW4gdGlsbCBhZnRlciB3ZSBoYXZlIHJlYWNoZWQgdGhlIHJlbGV2YW50IHBvaW50LiBUaGlzIGlzIHVzZWQKZm9yIGJvdGggYXV0b21hdGljIGFuZCBtYW51YWwgY2FsbG91dHMuCgpBcmd1bWVudHM6CiAgcHJldmlvdXNfY2FsbG91dCAgIHBvaW50cyB0byBwcmV2aW91cyBjYWxsb3V0IGl0ZW0KICBwdHIgICAgICAgICAgICAgICAgY3VycmVudCBwYXR0ZXJuIHBvaW50ZXIKICBjZCAgICAgICAgICAgICAgICAgcG9pbnRlcnMgdG8gdGFibGVzIGV0YwoKUmV0dXJuczogICAgICAgICAgICAgbm90aGluZwoqLwoKc3RhdGljIHZvaWQKY29tcGxldGVfY2FsbG91dCh1c2NoYXIgKnByZXZpb3VzX2NhbGxvdXQsIGNvbnN0IHVzY2hhciAqcHRyLCBjb21waWxlX2RhdGEgKmNkKQp7CmludCBsZW5ndGggPSBwdHIgLSBjZC0+c3RhcnRfcGF0dGVybiAtIEdFVChwcmV2aW91c19jYWxsb3V0LCAyKTsKUFVUKHByZXZpb3VzX2NhbGxvdXQsIDIgKyBMSU5LX1NJWkUsIGxlbmd0aCk7Cn0KCgoKI2lmZGVmIFNVUFBPUlRfVUNQCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogICAgICAgICAgIEdldCBvdGhlcmNhc2UgcmFuZ2UgICAgICAgICAgICAgICAgICAqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKiBUaGlzIGZ1bmN0aW9uIGlzIHBhc3NlZCB0aGUgc3RhcnQgYW5kIGVuZCBvZiBhIGNsYXNzIHJhbmdlLCBpbiBVVEYtOCBtb2RlCndpdGggVUNQIHN1cHBvcnQuIEl0IHNlYXJjaGVzIHVwIHRoZSBjaGFyYWN0ZXJzLCBsb29raW5nIGZvciBpbnRlcm5hbCByYW5nZXMgb2YKY2hhcmFjdGVycyBpbiB0aGUgIm90aGVyIiBjYXNlLiBFYWNoIGNhbGwgcmV0dXJucyB0aGUgbmV4dCBvbmUsIHVwZGF0aW5nIHRoZQpzdGFydCBhZGRyZXNzLgoKQXJndW1lbnRzOgogIGNwdHIgICAgICAgIHBvaW50cyB0byBzdGFydGluZyBjaGFyYWN0ZXIgdmFsdWU7IHVwZGF0ZWQKICBkICAgICAgICAgICBlbmQgdmFsdWUKICBvY3B0ciAgICAgICB3aGVyZSB0byBwdXQgc3RhcnQgb2Ygb3RoZXJjYXNlIHJhbmdlCiAgb2RwdHIgICAgICAgd2hlcmUgdG8gcHV0IGVuZCBvZiBvdGhlcmNhc2UgcmFuZ2UKCllpZWxkOiAgICAgICAgVFJVRSB3aGVuIHJhbmdlIHJldHVybmVkOyBGQUxTRSB3aGVuIG5vIG1vcmUKKi8KCnN0YXRpYyBCT09MCmdldF9vdGhlcmNhc2VfcmFuZ2UoaW50ICpjcHRyLCBpbnQgZCwgaW50ICpvY3B0ciwgaW50ICpvZHB0cikKewppbnQgYywgY2hhcnR5cGUsIG90aGVyY2FzZSwgbmV4dDsKCmZvciAoYyA9ICpjcHRyOyBjIDw9IGQ7IGMrKykKICB7CiAgaWYgKHVjcF9maW5kY2hhcihjLCAmY2hhcnR5cGUsICZvdGhlcmNhc2UpID09IHVjcF9MICYmIG90aGVyY2FzZSAhPSAwKSBicmVhazsKICB9CgppZiAoYyA+IGQpIHJldHVybiBGQUxTRTsKCipvY3B0ciA9IG90aGVyY2FzZTsKbmV4dCA9IG90aGVyY2FzZSArIDE7Cgpmb3IgKCsrYzsgYyA8PSBkOyBjKyspCiAgewogIGlmICh1Y3BfZmluZGNoYXIoYywgJmNoYXJ0eXBlLCAmb3RoZXJjYXNlKSAhPSB1Y3BfTCB8fCBvdGhlcmNhc2UgIT0gbmV4dCkKICAgIGJyZWFrOwogIG5leHQrKzsKICB9Cgoqb2RwdHIgPSBuZXh0IC0gMTsKKmNwdHIgPSBjOwoKcmV0dXJuIFRSVUU7Cn0KI2VuZGlmICAvKiBTVVBQT1JUX1VDUCAqLwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogICAgICAgICAgIENvbXBpbGUgb25lIGJyYW5jaCAgICAgICAgICAgICAgICAgICAqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKiBTY2FuIHRoZSBwYXR0ZXJuLCBjb21waWxpbmcgaXQgaW50byB0aGUgY29kZSB2ZWN0b3IuIElmIHRoZSBvcHRpb25zIGFyZQpjaGFuZ2VkIGR1cmluZyB0aGUgYnJhbmNoLCB0aGUgcG9pbnRlciBpcyB1c2VkIHRvIGNoYW5nZSB0aGUgZXh0ZXJuYWwgb3B0aW9ucwpiaXRzLgoKQXJndW1lbnRzOgogIG9wdGlvbnNwdHIgICAgIHBvaW50ZXIgdG8gdGhlIG9wdGlvbiBiaXRzCiAgYnJhY2tldHMgICAgICAgcG9pbnRzIHRvIG51bWJlciBvZiBleHRyYWN0aW5nIGJyYWNrZXRzIHVzZWQKICBjb2RlcHRyICAgICAgICBwb2ludHMgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgY29kZSBwb2ludAogIHB0cnB0ciAgICAgICAgIHBvaW50cyB0byB0aGUgY3VycmVudCBwYXR0ZXJuIHBvaW50ZXIKICBlcnJvcnB0ciAgICAgICBwb2ludHMgdG8gcG9pbnRlciB0byBlcnJvciBtZXNzYWdlCiAgZmlyc3RieXRlcHRyICAgc2V0IHRvIGluaXRpYWwgbGl0ZXJhbCBjaGFyYWN0ZXIsIG9yIDwgMCAoUkVRX1VOU0VULCBSRVFfTk9ORSkKICByZXFieXRlcHRyICAgICBzZXQgdG8gdGhlIGxhc3QgbGl0ZXJhbCBjaGFyYWN0ZXIgcmVxdWlyZWQsIGVsc2UgPCAwCiAgYmNwdHIgICAgICAgICAgcG9pbnRzIHRvIGN1cnJlbnQgYnJhbmNoIGNoYWluCiAgY2QgICAgICAgICAgICAgY29udGFpbnMgcG9pbnRlcnMgdG8gdGFibGVzIGV0Yy4KClJldHVybnM6ICAgICAgICAgVFJVRSBvbiBzdWNjZXNzCiAgICAgICAgICAgICAgICAgRkFMU0UsIHdpdGggKmVycm9ycHRyIHNldCBvbiBlcnJvcgoqLwoKc3RhdGljIEJPT0wKY29tcGlsZV9icmFuY2goaW50ICpvcHRpb25zcHRyLCBpbnQgKmJyYWNrZXRzLCB1c2NoYXIgKipjb2RlcHRyLAogIGNvbnN0IHVzY2hhciAqKnB0cnB0ciwgY29uc3QgY2hhciAqKmVycm9ycHRyLCBpbnQgKmZpcnN0Ynl0ZXB0ciwKICBpbnQgKnJlcWJ5dGVwdHIsIGJyYW5jaF9jaGFpbiAqYmNwdHIsIGNvbXBpbGVfZGF0YSAqY2QpCnsKaW50IHJlcGVhdF90eXBlLCBvcF90eXBlOwppbnQgcmVwZWF0X21pbiA9IDAsIHJlcGVhdF9tYXggPSAwOyAgICAgIC8qIFRvIHBsZWFzZSBwaWNreSBjb21waWxlcnMgKi8KaW50IGJyYXZhbHVlID0gMDsKaW50IGdyZWVkeV9kZWZhdWx0LCBncmVlZHlfbm9uX2RlZmF1bHQ7CmludCBmaXJzdGJ5dGUsIHJlcWJ5dGU7CmludCB6ZXJvcmVxYnl0ZSwgemVyb2ZpcnN0Ynl0ZTsKaW50IHJlcV9jYXNlb3B0LCByZXF2YXJ5LCB0ZW1wcmVxdmFyeTsKaW50IGNvbmRjb3VudCA9IDA7CmludCBvcHRpb25zID0gKm9wdGlvbnNwdHI7CmludCBhZnRlcl9tYW51YWxfY2FsbG91dCA9IDA7CnJlZ2lzdGVyIGludCBjOwpyZWdpc3RlciB1c2NoYXIgKmNvZGUgPSAqY29kZXB0cjsKdXNjaGFyICp0ZW1wY29kZTsKQk9PTCBpbmVzY3EgPSBGQUxTRTsKQk9PTCBncm91cHNldGZpcnN0Ynl0ZSA9IEZBTFNFOwpjb25zdCB1c2NoYXIgKnB0ciA9ICpwdHJwdHI7CmNvbnN0IHVzY2hhciAqdGVtcHB0cjsKdXNjaGFyICpwcmV2aW91cyA9IE5VTEw7CnVzY2hhciAqcHJldmlvdXNfY2FsbG91dCA9IE5VTEw7CnVzY2hhciBjbGFzc2JpdHNbMzJdOwoKI2lmZGVmIFNVUFBPUlRfVVRGOApCT09MIGNsYXNzX3V0Zjg7CkJPT0wgdXRmOCA9IChvcHRpb25zICYgUENSRV9VVEY4KSAhPSAwOwp1c2NoYXIgKmNsYXNzX3V0ZjhkYXRhOwp1c2NoYXIgdXRmOF9jaGFyWzZdOwojZWxzZQpCT09MIHV0ZjggPSBGQUxTRTsKI2VuZGlmCgovKiBTZXQgdXAgdGhlIGRlZmF1bHQgYW5kIG5vbi1kZWZhdWx0IHNldHRpbmdzIGZvciBncmVlZGluZXNzICovCgpncmVlZHlfZGVmYXVsdCA9ICgob3B0aW9ucyAmIFBDUkVfVU5HUkVFRFkpICE9IDApOwpncmVlZHlfbm9uX2RlZmF1bHQgPSBncmVlZHlfZGVmYXVsdCBeIDE7CgovKiBJbml0aWFsaXplIG5vIGZpcnN0IGJ5dGUsIG5vIHJlcXVpcmVkIGJ5dGUuIFJFUV9VTlNFVCBtZWFucyAibm8gY2hhcgptYXRjaGluZyBlbmNvdW50ZXJlZCB5ZXQiLiBJdCBnZXRzIGNoYW5nZWQgdG8gUkVRX05PTkUgaWYgd2UgaGl0IHNvbWV0aGluZyB0aGF0Cm1hdGNoZXMgYSBub24tZml4ZWQgY2hhciBmaXJzdCBjaGFyOyByZXFieXRlIGp1c3QgcmVtYWlucyB1bnNldCBpZiB3ZSBuZXZlcgpmaW5kIG9uZS4KCldoZW4gd2UgaGl0IGEgcmVwZWF0IHdob3NlIG1pbmltdW0gaXMgemVybywgd2UgbWF5IGhhdmUgdG8gYWRqdXN0IHRoZXNlIHZhbHVlcwp0byB0YWtlIHRoZSB6ZXJvIHJlcGVhdCBpbnRvIGFjY291bnQuIFRoaXMgaXMgaW1wbGVtZW50ZWQgYnkgc2V0dGluZyB0aGVtIHRvCnplcm9maXJzdGJ5dGUgYW5kIHplcm9yZXFieXRlIHdoZW4gc3VjaCBhIHJlcGVhdCBpcyBlbmNvdW50ZXJlZC4gVGhlIGluZGl2aWR1YWwKaXRlbSB0eXBlcyB0aGF0IGNhbiBiZSByZXBlYXRlZCBzZXQgdGhlc2UgYmFja29mZiB2YXJpYWJsZXMgYXBwcm9wcmlhdGVseS4gKi8KCmZpcnN0Ynl0ZSA9IHJlcWJ5dGUgPSB6ZXJvZmlyc3RieXRlID0gemVyb3JlcWJ5dGUgPSBSRVFfVU5TRVQ7CgovKiBUaGUgdmFyaWFibGUgcmVxX2Nhc2VvcHQgY29udGFpbnMgZWl0aGVyIHRoZSBSRVFfQ0FTRUxFU1MgdmFsdWUgb3IgemVybywKYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IHNldHRpbmcgb2YgdGhlIGNhc2VsZXNzIGZsYWcuIFJFUV9DQVNFTEVTUyBpcyBhIGJpdAp2YWx1ZSA+IDI1NS4gSXQgaXMgYWRkZWQgaW50byB0aGUgZmlyc3RieXRlIG9yIHJlcWJ5dGUgdmFyaWFibGVzIHRvIHJlY29yZCB0aGUKY2FzZSBzdGF0dXMgb2YgdGhlIHZhbHVlLiBUaGlzIGlzIHVzZWQgb25seSBmb3IgQVNDSUkgY2hhcmFjdGVycy4gKi8KCnJlcV9jYXNlb3B0ID0gKChvcHRpb25zICYgUENSRV9DQVNFTEVTUykgIT0gMCk/IFJFUV9DQVNFTEVTUyA6IDA7CgovKiBTd2l0Y2ggb24gbmV4dCBjaGFyYWN0ZXIgdW50aWwgdGhlIGVuZCBvZiB0aGUgYnJhbmNoICovCgpmb3IgKDs7IHB0cisrKQogIHsKICBCT09MIG5lZ2F0ZV9jbGFzczsKICBCT09MIHBvc3Nlc3NpdmVfcXVhbnRpZmllcjsKICBCT09MIGlzX3F1YW50aWZpZXI7CiAgaW50IGNsYXNzX2NoYXJjb3VudDsKICBpbnQgY2xhc3NfbGFzdGNoYXI7CiAgaW50IG5ld29wdGlvbnM7CiAgaW50IHJlY25vOwogIGludCBza2lwYnl0ZXM7CiAgaW50IHN1YnJlcWJ5dGU7CiAgaW50IHN1YmZpcnN0Ynl0ZTsKICBpbnQgbWNsZW5ndGg7CiAgdXNjaGFyIG1jYnVmZmVyWzhdOwoKICAvKiBOZXh0IGJ5dGUgaW4gdGhlIHBhdHRlcm4gKi8KCiAgYyA9ICpwdHI7CgogIC8qIElmIGluIFxRLi4uXEUsIGNoZWNrIGZvciB0aGUgZW5kOyBpZiBub3QsIHdlIGhhdmUgYSBsaXRlcmFsICovCgogIGlmIChpbmVzY3EgJiYgYyAhPSAwKQogICAgewogICAgaWYgKGMgPT0gJ1xcJyAmJiBwdHJbMV0gPT0gJ0UnKQogICAgICB7CiAgICAgIGluZXNjcSA9IEZBTFNFOwogICAgICBwdHIrKzsKICAgICAgY29udGludWU7CiAgICAgIH0KICAgIGVsc2UKICAgICAgewogICAgICBpZiAocHJldmlvdXNfY2FsbG91dCAhPSBOVUxMKQogICAgICAgIHsKICAgICAgICBjb21wbGV0ZV9jYWxsb3V0KHByZXZpb3VzX2NhbGxvdXQsIHB0ciwgY2QpOwogICAgICAgIHByZXZpb3VzX2NhbGxvdXQgPSBOVUxMOwogICAgICAgIH0KICAgICAgaWYgKChvcHRpb25zICYgUENSRV9BVVRPX0NBTExPVVQpICE9IDApCiAgICAgICAgewogICAgICAgIHByZXZpb3VzX2NhbGxvdXQgPSBjb2RlOwogICAgICAgIGNvZGUgPSBhdXRvX2NhbGxvdXQoY29kZSwgcHRyLCBjZCk7CiAgICAgICAgfQogICAgICBnb3RvIE5PUk1BTF9DSEFSOwogICAgICB9CiAgICB9CgogIC8qIEZpbGwgaW4gbGVuZ3RoIG9mIGEgcHJldmlvdXMgY2FsbG91dCwgZXhjZXB0IHdoZW4gdGhlIG5leHQgdGhpbmcgaXMKICBhIHF1YW50aWZpZXIuICovCgogIGlzX3F1YW50aWZpZXIgPSBjID09ICcqJyB8fCBjID09ICcrJyB8fCBjID09ICc/JyB8fAogICAgKGMgPT0gJ3snICYmIGlzX2NvdW50ZWRfcmVwZWF0KHB0cisxKSk7CgogIGlmICghaXNfcXVhbnRpZmllciAmJiBwcmV2aW91c19jYWxsb3V0ICE9IE5VTEwgJiYKICAgICAgIGFmdGVyX21hbnVhbF9jYWxsb3V0LS0gPD0gMCkKICAgIHsKICAgIGNvbXBsZXRlX2NhbGxvdXQocHJldmlvdXNfY2FsbG91dCwgcHRyLCBjZCk7CiAgICBwcmV2aW91c19jYWxsb3V0ID0gTlVMTDsKICAgIH0KCiAgLyogSW4gZXh0ZW5kZWQgbW9kZSwgc2tpcCB3aGl0ZSBzcGFjZSBhbmQgY29tbWVudHMgKi8KCiAgaWYgKChvcHRpb25zICYgUENSRV9FWFRFTkRFRCkgIT0gMCkKICAgIHsKICAgIGlmICgoY2QtPmN0eXBlc1tjXSAmIGN0eXBlX3NwYWNlKSAhPSAwKSBjb250aW51ZTsKICAgIGlmIChjID09ICcjJykKICAgICAgewogICAgICAvKiBUaGUgc3BhY2UgYmVmb3JlIHRoZSA7IGlzIHRvIGF2b2lkIGEgd2FybmluZyBvbiBhIHNpbGx5IGNvbXBpbGVyCiAgICAgIG9uIHRoZSBNYWNpbnRvc2guICovCiAgICAgIHdoaWxlICgoYyA9ICooKytwdHIpKSAhPSAwICYmIGMgIT0gTkVXTElORSkgOwogICAgICBpZiAoYyAhPSAwKSBjb250aW51ZTsgICAvKiBFbHNlIGZhbGwgdGhyb3VnaCB0byBoYW5kbGUgZW5kIG9mIHN0cmluZyAqLwogICAgICB9CiAgICB9CgogIC8qIE5vIGF1dG8gY2FsbG91dCBmb3IgcXVhbnRpZmllcnMuICovCgogIGlmICgob3B0aW9ucyAmIFBDUkVfQVVUT19DQUxMT1VUKSAhPSAwICYmICFpc19xdWFudGlmaWVyKQogICAgewogICAgcHJldmlvdXNfY2FsbG91dCA9IGNvZGU7CiAgICBjb2RlID0gYXV0b19jYWxsb3V0KGNvZGUsIHB0ciwgY2QpOwogICAgfQoKICBzd2l0Y2goYykKICAgIHsKICAgIC8qIFRoZSBicmFuY2ggdGVybWluYXRlcyBhdCBlbmQgb2Ygc3RyaW5nLCB8LCBvciApLiAqLwoKICAgIGNhc2UgMDoKICAgIGNhc2UgJ3wnOgogICAgY2FzZSAnKSc6CiAgICAqZmlyc3RieXRlcHRyID0gZmlyc3RieXRlOwogICAgKnJlcWJ5dGVwdHIgPSByZXFieXRlOwogICAgKmNvZGVwdHIgPSBjb2RlOwogICAgKnB0cnB0ciA9IHB0cjsKICAgIHJldHVybiBUUlVFOwoKICAgIC8qIEhhbmRsZSBzaW5nbGUtY2hhcmFjdGVyIG1ldGFjaGFyYWN0ZXJzLiBJbiBtdWx0aWxpbmUgbW9kZSwgXiBkaXNhYmxlcwogICAgdGhlIHNldHRpbmcgb2YgYW55IGZvbGxvd2luZyBjaGFyIGFzIGEgZmlyc3QgY2hhcmFjdGVyLiAqLwoKICAgIGNhc2UgJ14nOgogICAgaWYgKChvcHRpb25zICYgUENSRV9NVUxUSUxJTkUpICE9IDApCiAgICAgIHsKICAgICAgaWYgKGZpcnN0Ynl0ZSA9PSBSRVFfVU5TRVQpIGZpcnN0Ynl0ZSA9IFJFUV9OT05FOwogICAgICB9CiAgICBwcmV2aW91cyA9IE5VTEw7CiAgICAqY29kZSsrID0gT1BfQ0lSQzsKICAgIGJyZWFrOwoKICAgIGNhc2UgJyQnOgogICAgcHJldmlvdXMgPSBOVUxMOwogICAgKmNvZGUrKyA9IE9QX0RPTEw7CiAgICBicmVhazsKCiAgICAvKiBUaGVyZSBjYW4gbmV2ZXIgYmUgYSBmaXJzdCBjaGFyIGlmICcuJyBpcyBmaXJzdCwgd2hhdGV2ZXIgaGFwcGVucyBhYm91dAogICAgcmVwZWF0cy4gVGhlIHZhbHVlIG9mIHJlcWJ5dGUgZG9lc24ndCBjaGFuZ2UgZWl0aGVyLiAqLwoKICAgIGNhc2UgJy4nOgogICAgaWYgKGZpcnN0Ynl0ZSA9PSBSRVFfVU5TRVQpIGZpcnN0Ynl0ZSA9IFJFUV9OT05FOwogICAgemVyb2ZpcnN0Ynl0ZSA9IGZpcnN0Ynl0ZTsKICAgIHplcm9yZXFieXRlID0gcmVxYnl0ZTsKICAgIHByZXZpb3VzID0gY29kZTsKICAgICpjb2RlKysgPSBPUF9BTlk7CiAgICBicmVhazsKCiAgICAvKiBDaGFyYWN0ZXIgY2xhc3Nlcy4gSWYgdGhlIGluY2x1ZGVkIGNoYXJhY3RlcnMgYXJlIGFsbCA8IDI1NSBpbiB2YWx1ZSwgd2UKICAgIGJ1aWxkIGEgMzItYnl0ZSBiaXRtYXAgb2YgdGhlIHBlcm1pdHRlZCBjaGFyYWN0ZXJzLCBleGNlcHQgaW4gdGhlIHNwZWNpYWwKICAgIGNhc2Ugd2hlcmUgdGhlcmUgaXMgb25seSBvbmUgc3VjaCBjaGFyYWN0ZXIuIEZvciBuZWdhdGVkIGNsYXNzZXMsIHdlIGJ1aWxkCiAgICB0aGUgbWFwIGFzIHVzdWFsLCB0aGVuIGludmVydCBpdCBhdCB0aGUgZW5kLiBIb3dldmVyLCB3ZSB1c2UgYSBkaWZmZXJlbnQKICAgIG9wY29kZSBzbyB0aGF0IGRhdGEgY2hhcmFjdGVycyA+IDI1NSBjYW4gYmUgaGFuZGxlZCBjb3JyZWN0bHkuCgogICAgSWYgdGhlIGNsYXNzIGNvbnRhaW5zIGNoYXJhY3RlcnMgb3V0c2lkZSB0aGUgMC0yNTUgcmFuZ2UsIGEgZGlmZmVyZW50CiAgICBvcGNvZGUgaXMgY29tcGlsZWQuIEl0IG1heSBvcHRpb25hbGx5IGhhdmUgYSBiaXQgbWFwIGZvciBjaGFyYWN0ZXJzIDwgMjU2LAogICAgYnV0IHRob3NlIGFib3ZlIGFyZSBhcmUgZXhwbGljaXRseSBsaXN0ZWQgYWZ0ZXJ3YXJkcy4gQSBmbGFnIGJ5dGUgdGVsbHMKICAgIHdoZXRoZXIgdGhlIGJpdG1hcCBpcyBwcmVzZW50LCBhbmQgd2hldGhlciB0aGlzIGlzIGEgbmVnYXRlZCBjbGFzcyBvciBub3QuCiAgICAqLwoKICAgIGNhc2UgJ1snOgogICAgcHJldmlvdXMgPSBjb2RlOwoKICAgIC8qIFBDUkUgc3VwcG9ydHMgUE9TSVggY2xhc3Mgc3R1ZmYgaW5zaWRlIGEgY2xhc3MuIFBlcmwgZ2l2ZXMgYW4gZXJyb3IgaWYKICAgIHRoZXkgYXJlIGVuY291bnRlcmVkIGF0IHRoZSB0b3AgbGV2ZWwsIHNvIHdlJ2xsIGRvIHRoYXQgdG9vLiAqLwoKICAgIGlmICgocHRyWzFdID09ICc6JyB8fCBwdHJbMV0gPT0gJy4nIHx8IHB0clsxXSA9PSAnPScpICYmCiAgICAgICAgY2hlY2tfcG9zaXhfc3ludGF4KHB0ciwgJnRlbXBwdHIsIGNkKSkKICAgICAgewogICAgICAqZXJyb3JwdHIgPSAocHRyWzFdID09ICc6Jyk/IEVSUjEzIDogRVJSMzE7CiAgICAgIGdvdG8gRkFJTEVEOwogICAgICB9CgogICAgLyogSWYgdGhlIGZpcnN0IGNoYXJhY3RlciBpcyAnXicsIHNldCB0aGUgbmVnYXRpb24gZmxhZyBhbmQgc2tpcCBpdC4gKi8KCiAgICBpZiAoKGMgPSAqKCsrcHRyKSkgPT0gJ14nKQogICAgICB7CiAgICAgIG5lZ2F0ZV9jbGFzcyA9IFRSVUU7CiAgICAgIGMgPSAqKCsrcHRyKTsKICAgICAgfQogICAgZWxzZQogICAgICB7CiAgICAgIG5lZ2F0ZV9jbGFzcyA9IEZBTFNFOwogICAgICB9CgogICAgLyogS2VlcCBhIGNvdW50IG9mIGNoYXJzIHdpdGggdmFsdWVzIDwgMjU2IHNvIHRoYXQgd2UgY2FuIG9wdGltaXplIHRoZSBjYXNlCiAgICBvZiBqdXN0IGEgc2luZ2xlIGNoYXJhY3RlciAoYXMgbG9uZyBhcyBpdCdzIDwgMjU2KS4gRm9yIGhpZ2hlciB2YWx1ZWQgVVRGLTgKICAgIGNoYXJhY3RlcnMsIHdlIGRvbid0IHlldCBkbyBhbnkgb3B0aW1pemF0aW9uLiAqLwoKICAgIGNsYXNzX2NoYXJjb3VudCA9IDA7CiAgICBjbGFzc19sYXN0Y2hhciA9IC0xOwoKI2lmZGVmIFNVUFBPUlRfVVRGOAogICAgY2xhc3NfdXRmOCA9IEZBTFNFOyAgICAgICAgICAgICAgICAgICAgICAgLyogTm8gY2hhcnMgPj0gMjU2ICovCiAgICBjbGFzc191dGY4ZGF0YSA9IGNvZGUgKyBMSU5LX1NJWkUgKyAzNDsgICAvKiBGb3IgVVRGLTggaXRlbXMgKi8KI2VuZGlmCgogICAgLyogSW5pdGlhbGl6ZSB0aGUgMzItY2hhciBiaXQgbWFwIHRvIGFsbCB6ZXJvcy4gV2UgaGF2ZSB0byBidWlsZCB0aGUKICAgIG1hcCBpbiBhIHRlbXBvcmFyeSBiaXQgb2Ygc3RvcmUsIGluIGNhc2UgdGhlIGNsYXNzIGNvbnRhaW5zIG9ubHkgMQogICAgY2hhcmFjdGVyICg8IDI1NiksIGJlY2F1c2UgaW4gdGhhdCBjYXNlIHRoZSBjb21waWxlZCBjb2RlIGRvZXNuJ3QgdXNlIHRoZQogICAgYml0IG1hcC4gKi8KCiAgICBtZW1zZXQoY2xhc3NiaXRzLCAwLCAzMiAqIHNpemVvZih1c2NoYXIpKTsKCiAgICAvKiBQcm9jZXNzIGNoYXJhY3RlcnMgdW50aWwgXSBpcyByZWFjaGVkLiBCeSB3cml0aW5nIHRoaXMgYXMgYSAiZG8iIGl0CiAgICBtZWFucyB0aGF0IGFuIGluaXRpYWwgXSBpcyB0YWtlbiBhcyBhIGRhdGEgY2hhcmFjdGVyLiBUaGUgZmlyc3QgcGFzcwogICAgdGhyb3VnaCB0aGUgcmVnZXggY2hlY2tlZCB0aGUgb3ZlcmFsbCBzeW50YXgsIHNvIHdlIGRvbid0IG5lZWQgdG8gYmUgdmVyeQogICAgc3RyaWN0IGhlcmUuIEF0IHRoZSBzdGFydCBvZiB0aGUgbG9vcCwgYyBjb250YWlucyB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUKICAgIGNoYXJhY3Rlci4gKi8KCiAgICBkbwogICAgICB7CiNpZmRlZiBTVVBQT1JUX1VURjgKICAgICAgaWYgKHV0ZjggJiYgYyA+IDEyNykKICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQnJhY2VzIGFyZSByZXF1aXJlZCBiZWNhdXNlIHRoZSAqLwogICAgICAgIEdFVENIQVJMRU4oYywgcHRyLCBwdHIpOyAgICAvKiBtYWNybyBnZW5lcmF0ZXMgbXVsdGlwbGUgc3RhdGVtZW50cyAqLwogICAgICAgIH0KI2VuZGlmCgogICAgICAvKiBJbnNpZGUgXFEuLi5cRSBldmVyeXRoaW5nIGlzIGxpdGVyYWwgZXhjZXB0IFxFICovCgogICAgICBpZiAoaW5lc2NxKQogICAgICAgIHsKICAgICAgICBpZiAoYyA9PSAnXFwnICYmIHB0clsxXSA9PSAnRScpCiAgICAgICAgICB7CiAgICAgICAgICBpbmVzY3EgPSBGQUxTRTsKICAgICAgICAgIHB0cisrOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgZWxzZSBnb3RvIExPTkVfU0lOR0xFX0NIQVJBQ1RFUjsKICAgICAgICB9CgogICAgICAvKiBIYW5kbGUgUE9TSVggY2xhc3MgbmFtZXMuIFBlcmwgYWxsb3dzIGEgbmVnYXRpb24gZXh0ZW5zaW9uIG9mIHRoZQogICAgICBmb3JtIFs6Xm5hbWU6XS4gQSBzcXVhcmUgYnJhY2tldCB0aGF0IGRvZXNuJ3QgbWF0Y2ggdGhlIHN5bnRheCBpcwogICAgICB0cmVhdGVkIGFzIGEgbGl0ZXJhbC4gV2UgYWxzbyByZWNvZ25pemUgdGhlIFBPU0lYIGNvbnN0cnVjdGlvbnMKICAgICAgWy5jaC5dIGFuZCBbPWNoPV0gKCJjb2xsYXRpbmcgZWxlbWVudHMiKSBhbmQgZmF1bHQgdGhlbSwgYXMgUGVybAogICAgICA1LjYgYW5kIDUuOCBkby4gKi8KCiAgICAgIGlmIChjID09ICdbJyAmJgogICAgICAgICAgKHB0clsxXSA9PSAnOicgfHwgcHRyWzFdID09ICcuJyB8fCBwdHJbMV0gPT0gJz0nKSAmJgogICAgICAgICAgY2hlY2tfcG9zaXhfc3ludGF4KHB0ciwgJnRlbXBwdHIsIGNkKSkKICAgICAgICB7CiAgICAgICAgQk9PTCBsb2NhbF9uZWdhdGUgPSBGQUxTRTsKICAgICAgICBpbnQgcG9zaXhfY2xhc3MsIGk7CiAgICAgICAgcmVnaXN0ZXIgY29uc3QgdXNjaGFyICpjYml0cyA9IGNkLT5jYml0czsKCiAgICAgICAgaWYgKHB0clsxXSAhPSAnOicpCiAgICAgICAgICB7CiAgICAgICAgICAqZXJyb3JwdHIgPSBFUlIzMTsKICAgICAgICAgIGdvdG8gRkFJTEVEOwogICAgICAgICAgfQoKICAgICAgICBwdHIgKz0gMjsKICAgICAgICBpZiAoKnB0ciA9PSAnXicpCiAgICAgICAgICB7CiAgICAgICAgICBsb2NhbF9uZWdhdGUgPSBUUlVFOwogICAgICAgICAgcHRyKys7CiAgICAgICAgICB9CgogICAgICAgIHBvc2l4X2NsYXNzID0gY2hlY2tfcG9zaXhfbmFtZShwdHIsIHRlbXBwdHIgLSBwdHIpOwogICAgICAgIGlmIChwb3NpeF9jbGFzcyA8IDApCiAgICAgICAgICB7CiAgICAgICAgICAqZXJyb3JwdHIgPSBFUlIzMDsKICAgICAgICAgIGdvdG8gRkFJTEVEOwogICAgICAgICAgfQoKICAgICAgICAvKiBJZiBtYXRjaGluZyBpcyBjYXNlbGVzcywgdXBwZXIgYW5kIGxvd2VyIGFyZSBjb252ZXJ0ZWQgdG8KICAgICAgICBhbHBoYS4gVGhpcyByZWxpZXMgb24gdGhlIGZhY3QgdGhhdCB0aGUgY2xhc3MgdGFibGUgc3RhcnRzIHdpdGgKICAgICAgICBhbHBoYSwgbG93ZXIsIHVwcGVyIGFzIHRoZSBmaXJzdCAzIGVudHJpZXMuICovCgogICAgICAgIGlmICgob3B0aW9ucyAmIFBDUkVfQ0FTRUxFU1MpICE9IDAgJiYgcG9zaXhfY2xhc3MgPD0gMikKICAgICAgICAgIHBvc2l4X2NsYXNzID0gMDsKCiAgICAgICAgLyogT3IgaW50byB0aGUgbWFwIHdlIGFyZSBidWlsZGluZyB1cCB0byAzIG9mIHRoZSBzdGF0aWMgY2xhc3MKICAgICAgICB0YWJsZXMsIG9yIHRoZWlyIG5lZ2F0aW9ucy4gVGhlIFs6Ymxhbms6XSBjbGFzcyBzZXRzIHVwIHRoZSBzYW1lCiAgICAgICAgY2hhcnMgYXMgdGhlIFs6c3BhY2U6XSBjbGFzcyAoYWxsIHdoaXRlIHNwYWNlKS4gV2UgcmVtb3ZlIHRoZSB2ZXJ0aWNhbAogICAgICAgIHdoaXRlIHNwYWNlIGNoYXJzIGFmdGVyd2FyZHMuICovCgogICAgICAgIHBvc2l4X2NsYXNzICo9IDM7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKICAgICAgICAgIHsKICAgICAgICAgIEJPT0wgYmxhbmtjbGFzcyA9IHN0cm5jbXAoKGNoYXIgKilwdHIsICJibGFuayIsIDUpID09IDA7CiAgICAgICAgICBpbnQgdGFib2Zmc2V0ID0gcG9zaXhfY2xhc3NfbWFwc1twb3NpeF9jbGFzcyArIGldOwogICAgICAgICAgaWYgKHRhYm9mZnNldCA8IDApIGJyZWFrOwogICAgICAgICAgaWYgKGxvY2FsX25lZ2F0ZSkKICAgICAgICAgICAgewogICAgICAgICAgICBpZiAoaSA9PSAwKQogICAgICAgICAgICAgIGZvciAoYyA9IDA7IGMgPCAzMjsgYysrKSBjbGFzc2JpdHNbY10gfD0gfmNiaXRzW2MrdGFib2Zmc2V0XTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgIGZvciAoYyA9IDA7IGMgPCAzMjsgYysrKSBjbGFzc2JpdHNbY10gJj0gfmNiaXRzW2MrdGFib2Zmc2V0XTsKICAgICAgICAgICAgaWYgKGJsYW5rY2xhc3MpIGNsYXNzYml0c1sxXSB8PSAweDNjOwogICAgICAgICAgICB9CiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgZm9yIChjID0gMDsgYyA8IDMyOyBjKyspIGNsYXNzYml0c1tjXSB8PSBjYml0c1tjK3RhYm9mZnNldF07CiAgICAgICAgICAgIGlmIChibGFua2NsYXNzKSBjbGFzc2JpdHNbMV0gJj0gfjB4M2M7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgcHRyID0gdGVtcHB0ciArIDE7CiAgICAgICAgY2xhc3NfY2hhcmNvdW50ID0gMTA7ICAvKiBTZXQgPiAxOyBhc3N1bWVzIG1vcmUgdGhhbiAxIHBlciBjbGFzcyAqLwogICAgICAgIGNvbnRpbnVlOyAgICAvKiBFbmQgb2YgUE9TSVggc3ludGF4IGhhbmRsaW5nICovCiAgICAgICAgfQoKICAgICAgLyogQmFja3NsYXNoIG1heSBpbnRyb2R1Y2UgYSBzaW5nbGUgY2hhcmFjdGVyLCBvciBpdCBtYXkgaW50cm9kdWNlIG9uZQogICAgICBvZiB0aGUgc3BlY2lhbHMsIHdoaWNoIGp1c3Qgc2V0IGEgZmxhZy4gRXNjYXBlZCBpdGVtcyBhcmUgY2hlY2tlZCBmb3IKICAgICAgdmFsaWRpdHkgaW4gdGhlIHByZS1jb21waWxpbmcgcGFzcy4gVGhlIHNlcXVlbmNlIFxiIGlzIGEgc3BlY2lhbCBjYXNlLgogICAgICBJbnNpZGUgYSBjbGFzcyAoYW5kIG9ubHkgdGhlcmUpIGl0IGlzIHRyZWF0ZWQgYXMgYmFja3NwYWNlLiBFbHNld2hlcmUKICAgICAgaXQgbWFya3MgYSB3b3JkIGJvdW5kYXJ5LiBPdGhlciBlc2NhcGVzIGhhdmUgcHJlc2V0IG1hcHMgcmVhZHkgdG8KICAgICAgb3IgaW50byB0aGUgb25lIHdlIGFyZSBidWlsZGluZy4gV2UgYXNzdW1lIHRoZXkgaGF2ZSBtb3JlIHRoYW4gb25lCiAgICAgIGNoYXJhY3RlciBpbiB0aGVtLCBzbyBzZXQgY2xhc3NfY2hhcmNvdW50IGJpZ2dlciB0aGFuIG9uZS4gKi8KCiAgICAgIGlmIChjID09ICdcXCcpCiAgICAgICAgewogICAgICAgIGMgPSBjaGVja19lc2NhcGUoJnB0ciwgZXJyb3JwdHIsICpicmFja2V0cywgb3B0aW9ucywgVFJVRSk7CgogICAgICAgIGlmICgtYyA9PSBFU0NfYikgYyA9ICdcYic7ICAgICAgIC8qIFxiIGlzIGJhY2tzbGFzaCBpbiBhIGNsYXNzICovCiAgICAgICAgZWxzZSBpZiAoLWMgPT0gRVNDX1gpIGMgPSAnWCc7ICAgLyogXFggaXMgbGl0ZXJhbCBYIGluIGEgY2xhc3MgKi8KICAgICAgICBlbHNlIGlmICgtYyA9PSBFU0NfUSkgICAgICAgICAgICAvKiBIYW5kbGUgc3RhcnQgb2YgcXVvdGVkIHN0cmluZyAqLwogICAgICAgICAgewogICAgICAgICAgaWYgKHB0clsxXSA9PSAnXFwnICYmIHB0clsyXSA9PSAnRScpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgcHRyICs9IDI7IC8qIGF2b2lkIGVtcHR5IHN0cmluZyAqLwogICAgICAgICAgICB9CiAgICAgICAgICBlbHNlIGluZXNjcSA9IFRSVUU7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KCiAgICAgICAgaWYgKGMgPCAwKQogICAgICAgICAgewogICAgICAgICAgcmVnaXN0ZXIgY29uc3QgdXNjaGFyICpjYml0cyA9IGNkLT5jYml0czsKICAgICAgICAgIGNsYXNzX2NoYXJjb3VudCArPSAyOyAgICAgLyogR3JlYXRlciB0aGFuIDEgaXMgd2hhdCBtYXR0ZXJzICovCiAgICAgICAgICBzd2l0Y2ggKC1jKQogICAgICAgICAgICB7CiAgICAgICAgICAgIGNhc2UgRVNDX2Q6CiAgICAgICAgICAgIGZvciAoYyA9IDA7IGMgPCAzMjsgYysrKSBjbGFzc2JpdHNbY10gfD0gY2JpdHNbYytjYml0X2RpZ2l0XTsKICAgICAgICAgICAgY29udGludWU7CgogICAgICAgICAgICBjYXNlIEVTQ19EOgogICAgICAgICAgICBmb3IgKGMgPSAwOyBjIDwgMzI7IGMrKykgY2xhc3NiaXRzW2NdIHw9IH5jYml0c1tjK2NiaXRfZGlnaXRdOwogICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgICAgIGNhc2UgRVNDX3c6CiAgICAgICAgICAgIGZvciAoYyA9IDA7IGMgPCAzMjsgYysrKSBjbGFzc2JpdHNbY10gfD0gY2JpdHNbYytjYml0X3dvcmRdOwogICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgICAgIGNhc2UgRVNDX1c6CiAgICAgICAgICAgIGZvciAoYyA9IDA7IGMgPCAzMjsgYysrKSBjbGFzc2JpdHNbY10gfD0gfmNiaXRzW2MrY2JpdF93b3JkXTsKICAgICAgICAgICAgY29udGludWU7CgogICAgICAgICAgICBjYXNlIEVTQ19zOgogICAgICAgICAgICBmb3IgKGMgPSAwOyBjIDwgMzI7IGMrKykgY2xhc3NiaXRzW2NdIHw9IGNiaXRzW2MrY2JpdF9zcGFjZV07CiAgICAgICAgICAgIGNsYXNzYml0c1sxXSAmPSB+MHgwODsgICAvKiBQZXJsIDUuMDA0IG9ud2FyZHMgb21pdHMgVlQgZnJvbSBccyAqLwogICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgICAgIGNhc2UgRVNDX1M6CiAgICAgICAgICAgIGZvciAoYyA9IDA7IGMgPCAzMjsgYysrKSBjbGFzc2JpdHNbY10gfD0gfmNiaXRzW2MrY2JpdF9zcGFjZV07CiAgICAgICAgICAgIGNsYXNzYml0c1sxXSB8PSAweDA4OyAgICAvKiBQZXJsIDUuMDA0IG9ud2FyZHMgb21pdHMgVlQgZnJvbSBccyAqLwogICAgICAgICAgICBjb250aW51ZTsKCiNpZmRlZiBTVVBQT1JUX1VDUAogICAgICAgICAgICBjYXNlIEVTQ19wOgogICAgICAgICAgICBjYXNlIEVTQ19QOgogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICBCT09MIG5lZ2F0ZWQ7CiAgICAgICAgICAgICAgaW50IHByb3BlcnR5ID0gZ2V0X3VjcCgmcHRyLCAmbmVnYXRlZCwgZXJyb3JwdHIpOwogICAgICAgICAgICAgIGlmIChwcm9wZXJ0eSA8IDApIGdvdG8gRkFJTEVEOwogICAgICAgICAgICAgIGNsYXNzX3V0ZjggPSBUUlVFOwogICAgICAgICAgICAgICpjbGFzc191dGY4ZGF0YSsrID0gKCgtYyA9PSBFU0NfcCkgIT0gbmVnYXRlZCk/CiAgICAgICAgICAgICAgICBYQ0xfUFJPUCA6IFhDTF9OT1RQUk9QOwogICAgICAgICAgICAgICpjbGFzc191dGY4ZGF0YSsrID0gcHJvcGVydHk7CiAgICAgICAgICAgICAgY2xhc3NfY2hhcmNvdW50IC09IDI7ICAgLyogTm90IGEgPCAyNTYgY2hhcmFjdGVyICovCiAgICAgICAgICAgICAgfQogICAgICAgICAgICBjb250aW51ZTsKI2VuZGlmCgogICAgICAgICAgICAvKiBVbnJlY29nbml6ZWQgZXNjYXBlcyBhcmUgZmF1bHRlZCBpZiBQQ1JFIGlzIHJ1bm5pbmcgaW4gaXRzCiAgICAgICAgICAgIHN0cmljdCBtb2RlLiBCeSBkZWZhdWx0LCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIFBlcmwsIHRoZXkgYXJlCiAgICAgICAgICAgIHRyZWF0ZWQgYXMgbGl0ZXJhbHMuICovCgogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBpZiAoKG9wdGlvbnMgJiBQQ1JFX0VYVFJBKSAhPSAwKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAqZXJyb3JwdHIgPSBFUlI3OwogICAgICAgICAgICAgIGdvdG8gRkFJTEVEOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgYyA9ICpwdHI7ICAgICAgICAgICAgICAvKiBUaGUgZmluYWwgY2hhcmFjdGVyICovCiAgICAgICAgICAgIGNsYXNzX2NoYXJjb3VudCAtPSAyOyAgLyogVW5kbyB0aGUgZGVmYXVsdCBjb3VudCBmcm9tIGFib3ZlICovCiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgLyogRmFsbCB0aHJvdWdoIGlmIHdlIGhhdmUgYSBzaW5nbGUgY2hhcmFjdGVyIChjID49IDApLiBUaGlzIG1heSBiZQogICAgICAgID4gMjU2IGluIFVURi04IG1vZGUuICovCgogICAgICAgIH0gICAvKiBFbmQgb2YgYmFja3NsYXNoIGhhbmRsaW5nICovCgogICAgICAvKiBBIHNpbmdsZSBjaGFyYWN0ZXIgbWF5IGJlIGZvbGxvd2VkIGJ5ICctJyB0byBmb3JtIGEgcmFuZ2UuIEhvd2V2ZXIsCiAgICAgIFBlcmwgZG9lcyBub3QgcGVybWl0ICddJyB0byBiZSB0aGUgZW5kIG9mIHRoZSByYW5nZS4gQSAnLScgY2hhcmFjdGVyCiAgICAgIGhlcmUgaXMgdHJlYXRlZCBhcyBhIGxpdGVyYWwuICovCgogICAgICBpZiAocHRyWzFdID09ICctJyAmJiBwdHJbMl0gIT0gJ10nKQogICAgICAgIHsKICAgICAgICBpbnQgZDsKICAgICAgICBwdHIgKz0gMjsKCiNpZmRlZiBTVVBQT1JUX1VURjgKICAgICAgICBpZiAodXRmOCkKICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCcmFjZXMgYXJlIHJlcXVpcmVkIGJlY2F1c2UgdGhlICovCiAgICAgICAgICBHRVRDSEFSTEVOKGQsIHB0ciwgcHRyKTsgICAgLyogbWFjcm8gZ2VuZXJhdGVzIG11bHRpcGxlIHN0YXRlbWVudHMgKi8KICAgICAgICAgIH0KICAgICAgICBlbHNlCiNlbmRpZgogICAgICAgIGQgPSAqcHRyOyAgLyogTm90IFVURi04IG1vZGUgKi8KCiAgICAgICAgLyogVGhlIHNlY29uZCBwYXJ0IG9mIGEgcmFuZ2UgY2FuIGJlIGEgc2luZ2xlLWNoYXJhY3RlciBlc2NhcGUsIGJ1dAogICAgICAgIG5vdCBhbnkgb2YgdGhlIG90aGVyIGVzY2FwZXMuIFBlcmwgNS42IHRyZWF0cyBhIGh5cGhlbiBhcyBhIGxpdGVyYWwKICAgICAgICBpbiBzdWNoIGNpcmN1bXN0YW5jZXMuICovCgogICAgICAgIGlmIChkID09ICdcXCcpCiAgICAgICAgICB7CiAgICAgICAgICBjb25zdCB1c2NoYXIgKm9sZHB0ciA9IHB0cjsKICAgICAgICAgIGQgPSBjaGVja19lc2NhcGUoJnB0ciwgZXJyb3JwdHIsICpicmFja2V0cywgb3B0aW9ucywgVFJVRSk7CgogICAgICAgICAgLyogXGIgaXMgYmFja3NsYXNoOyBcWCBpcyBsaXRlcmFsIFg7IGFueSBvdGhlciBzcGVjaWFsIG1lYW5zIHRoZSAnLScKICAgICAgICAgIHdhcyBsaXRlcmFsICovCgogICAgICAgICAgaWYgKGQgPCAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgIGlmIChkID09IC1FU0NfYikgZCA9ICdcYic7CiAgICAgICAgICAgIGVsc2UgaWYgKGQgPT0gLUVTQ19YKSBkID0gJ1gnOyBlbHNlCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgIHB0ciA9IG9sZHB0ciAtIDI7CiAgICAgICAgICAgICAgZ290byBMT05FX1NJTkdMRV9DSEFSQUNURVI7ICAvKiBBIGZldyBsaW5lcyBiZWxvdyAqLwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAvKiBUaGUgY2hlY2sgdGhhdCB0aGUgdHdvIHZhbHVlcyBhcmUgaW4gdGhlIGNvcnJlY3Qgb3JkZXIgaGFwcGVucyBpbgogICAgICAgIHRoZSBwcmUtcGFzcy4gT3B0aW1pemUgb25lLWNoYXJhY3RlciByYW5nZXMgKi8KCiAgICAgICAgaWYgKGQgPT0gYykgZ290byBMT05FX1NJTkdMRV9DSEFSQUNURVI7ICAvKiBBIGZldyBsaW5lcyBiZWxvdyAqLwoKICAgICAgICAvKiBJbiBVVEYtOCBtb2RlLCBpZiB0aGUgdXBwZXIgbGltaXQgaXMgPiAyNTUsIG9yID4gMTI3IGZvciBjYXNlbGVzcwogICAgICAgIG1hdGNoaW5nLCB3ZSBoYXZlIHRvIHVzZSBhbiBYQ0xBU1Mgd2l0aCBleHRyYSBkYXRhIGl0ZW1zLiBDYXNlbGVzcwogICAgICAgIG1hdGNoaW5nIGZvciBjaGFyYWN0ZXJzID4gMTI3IGlzIGF2YWlsYWJsZSBvbmx5IGlmIFVDUCBzdXBwb3J0IGlzCiAgICAgICAgYXZhaWxhYmxlLiAqLwoKI2lmZGVmIFNVUFBPUlRfVVRGOAogICAgICAgIGlmICh1dGY4ICYmIChkID4gMjU1IHx8ICgob3B0aW9ucyAmIFBDUkVfQ0FTRUxFU1MpICE9IDAgJiYgZCA+IDEyNykpKQogICAgICAgICAgewogICAgICAgICAgY2xhc3NfdXRmOCA9IFRSVUU7CgogICAgICAgICAgLyogV2l0aCBVQ1Agc3VwcG9ydCwgd2UgY2FuIGZpbmQgdGhlIG90aGVyIGNhc2UgZXF1aXZhbGVudHMgb2YKICAgICAgICAgIHRoZSByZWxldmFudCBjaGFyYWN0ZXJzLiBUaGVyZSBtYXkgYmUgc2V2ZXJhbCByYW5nZXMuIE9wdGltaXplIGhvdwogICAgICAgICAgdGhleSBmaXQgd2l0aCB0aGUgYmFzaWMgcmFuZ2UuICovCgojaWZkZWYgU1VQUE9SVF9VQ1AKICAgICAgICAgIGlmICgob3B0aW9ucyAmIFBDUkVfQ0FTRUxFU1MpICE9IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgaW50IG9jYywgb2NkOwogICAgICAgICAgICBpbnQgY2MgPSBjOwogICAgICAgICAgICBpbnQgb3JpZ2QgPSBkOwogICAgICAgICAgICB3aGlsZSAoZ2V0X290aGVyY2FzZV9yYW5nZSgmY2MsIG9yaWdkLCAmb2NjLCAmb2NkKSkKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgaWYgKG9jYyA+PSBjICYmIG9jZCA8PSBkKSBjb250aW51ZTsgIC8qIFNraXAgZW1iZWRkZWQgcmFuZ2VzICovCgogICAgICAgICAgICAgIGlmIChvY2MgPCBjICAmJiBvY2QgPj0gYyAtIDEpICAgICAgICAvKiBFeHRlbmQgdGhlIGJhc2ljIHJhbmdlICovCiAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmIHRoZXJlIGlzIG92ZXJsYXAsICAgKi8KICAgICAgICAgICAgICAgIGMgPSBvY2M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm90aW5nIHRoYXQgaWYgb2NjIDwgYyAqLwogICAgICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSBjYW4ndCBoYXZlIG9jZCA+IGQgICovCiAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJlY2F1c2UgYSBzdWJyYW5nZSBpcyAgKi8KICAgICAgICAgICAgICBpZiAob2NkID4gZCAmJiBvY2MgPD0gZCArIDEpICAgICAgICAgLyogYWx3YXlzIHNob3J0ZXIgdGhhbiAgICAqLwogICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGUgYmFzaWMgcmFuZ2UuICAgICAgICovCiAgICAgICAgICAgICAgICBkID0gb2NkOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGlmIChvY2MgPT0gb2NkKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgKmNsYXNzX3V0ZjhkYXRhKysgPSBYQ0xfU0lOR0xFOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICpjbGFzc191dGY4ZGF0YSsrID0gWENMX1JBTkdFOwogICAgICAgICAgICAgICAgY2xhc3NfdXRmOGRhdGEgKz0gb3JkMnV0Zjgob2NjLCBjbGFzc191dGY4ZGF0YSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgY2xhc3NfdXRmOGRhdGEgKz0gb3JkMnV0Zjgob2NkLCBjbGFzc191dGY4ZGF0YSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiNlbmRpZiAgLyogU1VQUE9SVF9VQ1AgKi8KCiAgICAgICAgICAvKiBOb3cgcmVjb3JkIHRoZSBvcmlnaW5hbCByYW5nZSwgcG9zc2libHkgbW9kaWZpZWQgZm9yIFVDUCBjYXNlbGVzcwogICAgICAgICAgb3ZlcmxhcHBpbmcgcmFuZ2VzLiAqLwoKICAgICAgICAgICpjbGFzc191dGY4ZGF0YSsrID0gWENMX1JBTkdFOwogICAgICAgICAgY2xhc3NfdXRmOGRhdGEgKz0gb3JkMnV0ZjgoYywgY2xhc3NfdXRmOGRhdGEpOwogICAgICAgICAgY2xhc3NfdXRmOGRhdGEgKz0gb3JkMnV0ZjgoZCwgY2xhc3NfdXRmOGRhdGEpOwoKICAgICAgICAgIC8qIFdpdGggVUNQIHN1cHBvcnQsIHdlIGFyZSBkb25lLiBXaXRob3V0IFVDUCBzdXBwb3J0LCB0aGVyZSBpcyBubwogICAgICAgICAgY2FzZWxlc3MgbWF0Y2hpbmcgZm9yIFVURi04IGNoYXJhY3RlcnMgPiAxMjc7IHdlIGNhbiB1c2UgdGhlIGJpdCBtYXAKICAgICAgICAgIGZvciB0aGUgc21hbGxlciBvbmVzLiAqLwoKI2lmZGVmIFNVUFBPUlRfVUNQCiAgICAgICAgICBjb250aW51ZTsgICAgLyogV2l0aCBuZXh0IGNoYXJhY3RlciBpbiB0aGUgY2xhc3MgKi8KI2Vsc2UKICAgICAgICAgIGlmICgob3B0aW9ucyAmIFBDUkVfQ0FTRUxFU1MpID09IDAgfHwgYyA+IDEyNykgY29udGludWU7CgogICAgICAgICAgLyogQWRqdXN0IHVwcGVyIGxpbWl0IGFuZCBmYWxsIHRocm91Z2ggdG8gc2V0IHVwIHRoZSBtYXAgKi8KCiAgICAgICAgICBkID0gMTI3OwoKI2VuZGlmICAvKiBTVVBQT1JUX1VDUCAqLwogICAgICAgICAgfQojZW5kaWYgIC8qIFNVUFBPUlRfVVRGOCAqLwoKICAgICAgICAvKiBXZSB1c2UgdGhlIGJpdCBtYXAgZm9yIGFsbCBjYXNlcyB3aGVuIG5vdCBpbiBVVEYtOCBtb2RlOyBlbHNlCiAgICAgICAgcmFuZ2VzIHRoYXQgbGllIGVudGlyZWx5IHdpdGhpbiAwLTEyNyB3aGVuIHRoZXJlIGlzIFVDUCBzdXBwb3J0OyBlbHNlCiAgICAgICAgZm9yIHBhcnRpYWwgcmFuZ2VzIHdpdGhvdXQgVUNQIHN1cHBvcnQuICovCgogICAgICAgIGZvciAoOyBjIDw9IGQ7IGMrKykKICAgICAgICAgIHsKICAgICAgICAgIGNsYXNzYml0c1tjLzhdIHw9ICgxIDw8IChjJjcpKTsKICAgICAgICAgIGlmICgob3B0aW9ucyAmIFBDUkVfQ0FTRUxFU1MpICE9IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgaW50IHVjID0gY2QtPmZjY1tjXTsgICAgICAgICAgIC8qIGZsaXAgY2FzZSAqLwogICAgICAgICAgICBjbGFzc2JpdHNbdWMvOF0gfD0gKDEgPDwgKHVjJjcpKTsKICAgICAgICAgICAgfQogICAgICAgICAgY2xhc3NfY2hhcmNvdW50Kys7ICAgICAgICAgICAgICAgIC8qIGluIGNhc2UgYSBvbmUtY2hhciByYW5nZSAqLwogICAgICAgICAgY2xhc3NfbGFzdGNoYXIgPSBjOwogICAgICAgICAgfQoKICAgICAgICBjb250aW51ZTsgICAvKiBHbyBnZXQgdGhlIG5leHQgY2hhciBpbiB0aGUgY2xhc3MgKi8KICAgICAgICB9CgogICAgICAvKiBIYW5kbGUgYSBsb25lIHNpbmdsZSBjaGFyYWN0ZXIgLSB3ZSBjYW4gZ2V0IGhlcmUgZm9yIGEgbm9ybWFsCiAgICAgIG5vbi1lc2NhcGUgY2hhciwgb3IgYWZ0ZXIgXCB0aGF0IGludHJvZHVjZXMgYSBzaW5nbGUgY2hhcmFjdGVyIG9yIGZvciBhbgogICAgICBhcHBhcmVudCByYW5nZSB0aGF0IGlzbid0LiAqLwoKICAgICAgTE9ORV9TSU5HTEVfQ0hBUkFDVEVSOgoKICAgICAgLyogSGFuZGxlIGEgY2hhcmFjdGVyIHRoYXQgY2Fubm90IGdvIGluIHRoZSBiaXQgbWFwICovCgojaWZkZWYgU1VQUE9SVF9VVEY4CiAgICAgIGlmICh1dGY4ICYmIChjID4gMjU1IHx8ICgob3B0aW9ucyAmIFBDUkVfQ0FTRUxFU1MpICE9IDAgJiYgYyA+IDEyNykpKQogICAgICAgIHsKICAgICAgICBjbGFzc191dGY4ID0gVFJVRTsKICAgICAgICAqY2xhc3NfdXRmOGRhdGErKyA9IFhDTF9TSU5HTEU7CiAgICAgICAgY2xhc3NfdXRmOGRhdGEgKz0gb3JkMnV0ZjgoYywgY2xhc3NfdXRmOGRhdGEpOwoKI2lmZGVmIFNVUFBPUlRfVUNQCiAgICAgICAgaWYgKChvcHRpb25zICYgUENSRV9DQVNFTEVTUykgIT0gMCkKICAgICAgICAgIHsKICAgICAgICAgIGludCBjaGFydHlwZTsKICAgICAgICAgIGludCBvdGhlcmNhc2U7CiAgICAgICAgICBpZiAodWNwX2ZpbmRjaGFyKGMsICZjaGFydHlwZSwgJm90aGVyY2FzZSkgPj0gMCAmJiBvdGhlcmNhc2UgPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICpjbGFzc191dGY4ZGF0YSsrID0gWENMX1NJTkdMRTsKICAgICAgICAgICAgY2xhc3NfdXRmOGRhdGEgKz0gb3JkMnV0Zjgob3RoZXJjYXNlLCBjbGFzc191dGY4ZGF0YSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KI2VuZGlmICAvKiBTVVBQT1JUX1VDUCAqLwoKICAgICAgICB9CiAgICAgIGVsc2UKI2VuZGlmICAvKiBTVVBQT1JUX1VURjggKi8KCiAgICAgIC8qIEhhbmRsZSBhIHNpbmdsZS1ieXRlIGNoYXJhY3RlciAqLwogICAgICAgIHsKICAgICAgICBjbGFzc2JpdHNbYy84XSB8PSAoMSA8PCAoYyY3KSk7CiAgICAgICAgaWYgKChvcHRpb25zICYgUENSRV9DQVNFTEVTUykgIT0gMCkKICAgICAgICAgIHsKICAgICAgICAgIGMgPSBjZC0+ZmNjW2NdOyAgIC8qIGZsaXAgY2FzZSAqLwogICAgICAgICAgY2xhc3NiaXRzW2MvOF0gfD0gKDEgPDwgKGMmNykpOwogICAgICAgICAgfQogICAgICAgIGNsYXNzX2NoYXJjb3VudCsrOwogICAgICAgIGNsYXNzX2xhc3RjaGFyID0gYzsKICAgICAgICB9CiAgICAgIH0KCiAgICAvKiBMb29wIHVudGlsICddJyByZWFjaGVkOyB0aGUgY2hlY2sgZm9yIGVuZCBvZiBzdHJpbmcgaGFwcGVucyBpbnNpZGUgdGhlCiAgICBsb29wLiBUaGlzICJ3aGlsZSIgaXMgdGhlIGVuZCBvZiB0aGUgImRvIiBhYm92ZS4gKi8KCiAgICB3aGlsZSAoKGMgPSAqKCsrcHRyKSkgIT0gJ10nIHx8IGluZXNjcSk7CgogICAgLyogSWYgY2xhc3NfY2hhcmNvdW50IGlzIDEsIHdlIHNhdyBwcmVjaXNlbHkgb25lIGNoYXJhY3RlciB3aG9zZSB2YWx1ZSBpcwogICAgbGVzcyB0aGFuIDI1Ni4gSW4gbm9uLVVURi04IG1vZGUgd2UgY2FuIGFsd2F5cyBvcHRpbWl6ZS4gSW4gVVRGLTggbW9kZSwgd2UKICAgIGNhbiBvcHRpbWl6ZSB0aGUgbmVnYXRpdmUgY2FzZSBvbmx5IGlmIHRoZXJlIHdlcmUgbm8gY2hhcmFjdGVycyA+PSAxMjgKICAgIGJlY2F1c2UgT1BfTk9UIGFuZCB0aGUgcmVsYXRlZCBvcGNvZGVzIGxpa2UgT1BfTk9UU1RBUiBvcGVyYXRlIG9uCiAgICBzaW5nbGUtYnl0ZXMgb25seS4gVGhpcyBpcyBhbiBoaXN0b3JpY2FsIGhhbmdvdmVyLiBNYXliZSBvbmUgZGF5IHdlIGNhbgogICAgdGlkeSB0aGVzZSBvcGNvZGVzIHRvIGhhbmRsZSBtdWx0aS1ieXRlIGNoYXJhY3RlcnMuCgogICAgVGhlIG9wdGltaXphdGlvbiB0aHJvd3MgYXdheSB0aGUgYml0IG1hcC4gV2UgdHVybiB0aGUgaXRlbSBpbnRvIGEKICAgIDEtY2hhcmFjdGVyIE9QX0NIQVJbTkNdIGlmIGl0J3MgcG9zaXRpdmUsIG9yIE9QX05PVCBpZiBpdCdzIG5lZ2F0aXZlLiBOb3RlCiAgICB0aGF0IE9QX05PVCBkb2VzIG5vdCBzdXBwb3J0IG11bHRpYnl0ZSBjaGFyYWN0ZXJzLiBJbiB0aGUgcG9zaXRpdmUgY2FzZSwgaXQKICAgIGNhbiBjYXVzZSBmaXJzdGJ5dGUgdG8gYmUgc2V0LiBPdGhlcndpc2UsIHRoZXJlIGNhbiBiZSBubyBmaXJzdCBjaGFyIGlmCiAgICB0aGlzIGl0ZW0gaXMgZmlyc3QsIHdoYXRldmVyIHJlcGVhdCBjb3VudCBtYXkgZm9sbG93LiBJbiB0aGUgY2FzZSBvZgogICAgcmVxYnl0ZSwgc2F2ZSB0aGUgcHJldmlvdXMgdmFsdWUgZm9yIHJlaW5zdGF0aW5nLiAqLwoKI2lmZGVmIFNVUFBPUlRfVVRGOAogICAgaWYgKGNsYXNzX2NoYXJjb3VudCA9PSAxICYmCiAgICAgICAgICAoIXV0ZjggfHwKICAgICAgICAgICghY2xhc3NfdXRmOCAmJiAoIW5lZ2F0ZV9jbGFzcyB8fCBjbGFzc19sYXN0Y2hhciA8IDEyOCkpKSkKCiNlbHNlCiAgICBpZiAoY2xhc3NfY2hhcmNvdW50ID09IDEpCiNlbmRpZgogICAgICB7CiAgICAgIHplcm9yZXFieXRlID0gcmVxYnl0ZTsKCiAgICAgIC8qIFRoZSBPUF9OT1Qgb3Bjb2RlIHdvcmtzIG9uIG9uZS1ieXRlIGNoYXJhY3RlcnMgb25seS4gKi8KCiAgICAgIGlmIChuZWdhdGVfY2xhc3MpCiAgICAgICAgewogICAgICAgIGlmIChmaXJzdGJ5dGUgPT0gUkVRX1VOU0VUKSBmaXJzdGJ5dGUgPSBSRVFfTk9ORTsKICAgICAgICB6ZXJvZmlyc3RieXRlID0gZmlyc3RieXRlOwogICAgICAgICpjb2RlKysgPSBPUF9OT1Q7CiAgICAgICAgKmNvZGUrKyA9IGNsYXNzX2xhc3RjaGFyOwogICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgIC8qIEZvciBhIHNpbmdsZSwgcG9zaXRpdmUgY2hhcmFjdGVyLCBnZXQgdGhlIHZhbHVlIGludG8gbWNidWZmZXIsIGFuZAogICAgICB0aGVuIHdlIGNhbiBoYW5kbGUgdGhpcyB3aXRoIHRoZSBub3JtYWwgb25lLWNoYXJhY3RlciBjb2RlLiAqLwoKI2lmZGVmIFNVUFBPUlRfVVRGOAogICAgICBpZiAodXRmOCAmJiBjbGFzc19sYXN0Y2hhciA+IDEyNykKICAgICAgICBtY2xlbmd0aCA9IG9yZDJ1dGY4KGNsYXNzX2xhc3RjaGFyLCBtY2J1ZmZlcik7CiAgICAgIGVsc2UKI2VuZGlmCiAgICAgICAgewogICAgICAgIG1jYnVmZmVyWzBdID0gY2xhc3NfbGFzdGNoYXI7CiAgICAgICAgbWNsZW5ndGggPSAxOwogICAgICAgIH0KICAgICAgZ290byBPTkVfQ0hBUjsKICAgICAgfSAgICAgICAvKiBFbmQgb2YgMS1jaGFyIG9wdGltaXphdGlvbiAqLwoKICAgIC8qIFRoZSBnZW5lcmFsIGNhc2UgLSBub3QgdGhlIG9uZS1jaGFyIG9wdGltaXphdGlvbi4gSWYgdGhpcyBpcyB0aGUgZmlyc3QKICAgIHRoaW5nIGluIHRoZSBicmFuY2gsIHRoZXJlIGNhbiBiZSBubyBmaXJzdCBjaGFyIHNldHRpbmcsIHdoYXRldmVyIHRoZQogICAgcmVwZWF0IGNvdW50LiBBbnkgcmVxYnl0ZSBzZXR0aW5nIG11c3QgcmVtYWluIHVuY2hhbmdlZCBhZnRlciBhbnkga2luZCBvZgogICAgcmVwZWF0LiAqLwoKICAgIGlmIChmaXJzdGJ5dGUgPT0gUkVRX1VOU0VUKSBmaXJzdGJ5dGUgPSBSRVFfTk9ORTsKICAgIHplcm9maXJzdGJ5dGUgPSBmaXJzdGJ5dGU7CiAgICB6ZXJvcmVxYnl0ZSA9IHJlcWJ5dGU7CgogICAgLyogSWYgdGhlcmUgYXJlIGNoYXJhY3RlcnMgd2l0aCB2YWx1ZXMgPiAyNTUsIHdlIGhhdmUgdG8gY29tcGlsZSBhbgogICAgZXh0ZW5kZWQgY2xhc3MsIHdpdGggaXRzIG93biBvcGNvZGUuIElmIHRoZXJlIGFyZSBubyBjaGFyYWN0ZXJzIDwgMjU2LAogICAgd2UgY2FuIG9taXQgdGhlIGJpdG1hcC4gKi8KCiNpZmRlZiBTVVBQT1JUX1VURjgKICAgIGlmIChjbGFzc191dGY4KQogICAgICB7CiAgICAgICpjbGFzc191dGY4ZGF0YSsrID0gWENMX0VORDsgICAgLyogTWFya3MgdGhlIGVuZCBvZiBleHRyYSBkYXRhICovCiAgICAgICpjb2RlKysgPSBPUF9YQ0xBU1M7CiAgICAgIGNvZGUgKz0gTElOS19TSVpFOwogICAgICAqY29kZSA9IG5lZ2F0ZV9jbGFzcz8gWENMX05PVCA6IDA7CgogICAgICAvKiBJZiB0aGUgbWFwIGlzIHJlcXVpcmVkLCBpbnN0YWxsIGl0LCBhbmQgbW92ZSBvbiB0byB0aGUgZW5kIG9mCiAgICAgIHRoZSBleHRyYSBkYXRhICovCgogICAgICBpZiAoY2xhc3NfY2hhcmNvdW50ID4gMCkKICAgICAgICB7CiAgICAgICAgKmNvZGUrKyB8PSBYQ0xfTUFQOwogICAgICAgIG1lbWNweShjb2RlLCBjbGFzc2JpdHMsIDMyKTsKICAgICAgICBjb2RlID0gY2xhc3NfdXRmOGRhdGE7CiAgICAgICAgfQoKICAgICAgLyogSWYgdGhlIG1hcCBpcyBub3QgcmVxdWlyZWQsIHNsaWRlIGRvd24gdGhlIGV4dHJhIGRhdGEuICovCgogICAgICBlbHNlCiAgICAgICAgewogICAgICAgIGludCBsZW4gPSBjbGFzc191dGY4ZGF0YSAtIChjb2RlICsgMzMpOwogICAgICAgIG1lbW1vdmUoY29kZSArIDEsIGNvZGUgKyAzMywgbGVuKTsKICAgICAgICBjb2RlICs9IGxlbiArIDE7CiAgICAgICAgfQoKICAgICAgLyogTm93IGZpbGwgaW4gdGhlIGNvbXBsZXRlIGxlbmd0aCBvZiB0aGUgaXRlbSAqLwoKICAgICAgUFVUKHByZXZpb3VzLCAxLCBjb2RlIC0gcHJldmlvdXMpOwogICAgICBicmVhazsgICAvKiBFbmQgb2YgY2xhc3MgaGFuZGxpbmcgKi8KICAgICAgfQojZW5kaWYKCiAgICAvKiBJZiB0aGVyZSBhcmUgbm8gY2hhcmFjdGVycyA+IDI1NSwgbmVnYXRlIHRoZSAzMi1ieXRlIG1hcCBpZiBuZWNlc3NhcnksCiAgICBhbmQgY29weSBpdCBpbnRvIHRoZSBjb2RlIHZlY3Rvci4gSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGhpbmcgaW4gdGhlIGJyYW5jaCwKICAgIHRoZXJlIGNhbiBiZSBubyBmaXJzdCBjaGFyIHNldHRpbmcsIHdoYXRldmVyIHRoZSByZXBlYXQgY291bnQuIEFueSByZXFieXRlCiAgICBzZXR0aW5nIG11c3QgcmVtYWluIHVuY2hhbmdlZCBhZnRlciBhbnkga2luZCBvZiByZXBlYXQuICovCgogICAgaWYgKG5lZ2F0ZV9jbGFzcykKICAgICAgewogICAgICAqY29kZSsrID0gT1BfTkNMQVNTOwogICAgICBmb3IgKGMgPSAwOyBjIDwgMzI7IGMrKykgY29kZVtjXSA9IH5jbGFzc2JpdHNbY107CiAgICAgIH0KICAgIGVsc2UKICAgICAgewogICAgICAqY29kZSsrID0gT1BfQ0xBU1M7CiAgICAgIG1lbWNweShjb2RlLCBjbGFzc2JpdHMsIDMyKTsKICAgICAgfQogICAgY29kZSArPSAzMjsKICAgIGJyZWFrOwoKICAgIC8qIFZhcmlvdXMga2luZHMgb2YgcmVwZWF0OyAneycgaXMgbm90IG5lY2Vzc2FyaWx5IGEgcXVhbnRpZmllciwgYnV0IHRoaXMKICAgIGhhcyBiZWVuIHRlc3RlZCBhYm92ZS4gKi8KCiAgICBjYXNlICd7JzoKICAgIGlmICghaXNfcXVhbnRpZmllcikgZ290byBOT1JNQUxfQ0hBUjsKICAgIHB0ciA9IHJlYWRfcmVwZWF0X2NvdW50cyhwdHIrMSwgJnJlcGVhdF9taW4sICZyZXBlYXRfbWF4LCBlcnJvcnB0cik7CiAgICBpZiAoKmVycm9ycHRyICE9IE5VTEwpIGdvdG8gRkFJTEVEOwogICAgZ290byBSRVBFQVQ7CgogICAgY2FzZSAnKic6CiAgICByZXBlYXRfbWluID0gMDsKICAgIHJlcGVhdF9tYXggPSAtMTsKICAgIGdvdG8gUkVQRUFUOwoKICAgIGNhc2UgJysnOgogICAgcmVwZWF0X21pbiA9IDE7CiAgICByZXBlYXRfbWF4ID0gLTE7CiAgICBnb3RvIFJFUEVBVDsKCiAgICBjYXNlICc/JzoKICAgIHJlcGVhdF9taW4gPSAwOwogICAgcmVwZWF0X21heCA9IDE7CgogICAgUkVQRUFUOgogICAgaWYgKHByZXZpb3VzID09IE5VTEwpCiAgICAgIHsKICAgICAgKmVycm9ycHRyID0gRVJSOTsKICAgICAgZ290byBGQUlMRUQ7CiAgICAgIH0KCiAgICBpZiAocmVwZWF0X21pbiA9PSAwKQogICAgICB7CiAgICAgIGZpcnN0Ynl0ZSA9IHplcm9maXJzdGJ5dGU7ICAgIC8qIEFkanVzdCBmb3IgemVybyByZXBlYXQgKi8KICAgICAgcmVxYnl0ZSA9IHplcm9yZXFieXRlOyAgICAgICAgLyogRGl0dG8gKi8KICAgICAgfQoKICAgIC8qIFJlbWVtYmVyIHdoZXRoZXIgdGhpcyBpcyBhIHZhcmlhYmxlIGxlbmd0aCByZXBlYXQgKi8KCiAgICByZXF2YXJ5ID0gKHJlcGVhdF9taW4gPT0gcmVwZWF0X21heCk/IDAgOiBSRVFfVkFSWTsKCiAgICBvcF90eXBlID0gMDsgICAgICAgICAgICAgICAgICAgIC8qIERlZmF1bHQgc2luZ2xlLWNoYXIgb3AgY29kZXMgKi8KICAgIHBvc3Nlc3NpdmVfcXVhbnRpZmllciA9IEZBTFNFOyAgLyogRGVmYXVsdCBub3QgcG9zc2Vzc2l2ZSBxdWFudGlmaWVyICovCgogICAgLyogU2F2ZSBzdGFydCBvZiBwcmV2aW91cyBpdGVtLCBpbiBjYXNlIHdlIGhhdmUgdG8gbW92ZSBpdCB1cCB0byBtYWtlIHNwYWNlCiAgICBmb3IgYW4gaW5zZXJ0ZWQgT1BfT05DRSBmb3IgdGhlIGFkZGl0aW9uYWwgJysnIGV4dGVuc2lvbi4gKi8KCiAgICB0ZW1wY29kZSA9IHByZXZpb3VzOwoKICAgIC8qIElmIHRoZSBuZXh0IGNoYXJhY3RlciBpcyAnKycsIHdlIGhhdmUgYSBwb3NzZXNzaXZlIHF1YW50aWZpZXIuIFRoaXMKICAgIGltcGxpZXMgZ3JlZWRpbmVzcywgd2hhdGV2ZXIgdGhlIHNldHRpbmcgb2YgdGhlIFBDUkVfVU5HUkVFRFkgb3B0aW9uLgogICAgSWYgdGhlIG5leHQgY2hhcmFjdGVyIGlzICc/JyB0aGlzIGlzIGEgbWluaW1pemluZyByZXBlYXQsIGJ5IGRlZmF1bHQsCiAgICBidXQgaWYgUENSRV9VTkdSRUVEWSBpcyBzZXQsIGl0IHdvcmtzIHRoZSBvdGhlciB3YXkgcm91bmQuIFdlIGNoYW5nZSB0aGUKICAgIHJlcGVhdCB0eXBlIHRvIHRoZSBub24tZGVmYXVsdC4gKi8KCiAgICBpZiAocHRyWzFdID09ICcrJykKICAgICAgewogICAgICByZXBlYXRfdHlwZSA9IDA7ICAgICAgICAgICAgICAgICAgLyogRm9yY2UgZ3JlZWR5ICovCiAgICAgIHBvc3Nlc3NpdmVfcXVhbnRpZmllciA9IFRSVUU7CiAgICAgIHB0cisrOwogICAgICB9CiAgICBlbHNlIGlmIChwdHJbMV0gPT0gJz8nKQogICAgICB7CiAgICAgIHJlcGVhdF90eXBlID0gZ3JlZWR5X25vbl9kZWZhdWx0OwogICAgICBwdHIrKzsKICAgICAgfQogICAgZWxzZSByZXBlYXRfdHlwZSA9IGdyZWVkeV9kZWZhdWx0OwoKICAgIC8qIElmIHByZXZpb3VzIHdhcyBhIHJlY3Vyc2lvbiwgd2UgbmVlZCB0byB3cmFwIGl0IGluc2lkZSBicmFja2V0cyBzbyB0aGF0CiAgICBpdCBjYW4gYmUgcmVwbGljYXRlZCBpZiBuZWNlc3NhcnkuICovCgogICAgaWYgKCpwcmV2aW91cyA9PSBPUF9SRUNVUlNFKQogICAgICB7CiAgICAgIG1lbW1vdmUocHJldmlvdXMgKyAxICsgTElOS19TSVpFLCBwcmV2aW91cywgMSArIExJTktfU0laRSk7CiAgICAgIGNvZGUgKz0gMSArIExJTktfU0laRTsKICAgICAgKnByZXZpb3VzID0gT1BfQlJBOwogICAgICBQVVQocHJldmlvdXMsIDEsIGNvZGUgLSBwcmV2aW91cyk7CiAgICAgICpjb2RlID0gT1BfS0VUOwogICAgICBQVVQoY29kZSwgMSwgY29kZSAtIHByZXZpb3VzKTsKICAgICAgY29kZSArPSAxICsgTElOS19TSVpFOwogICAgICB9CgogICAgLyogSWYgcHJldmlvdXMgd2FzIGEgY2hhcmFjdGVyIG1hdGNoLCBhYm9saXNoIHRoZSBpdGVtIGFuZCBnZW5lcmF0ZSBhCiAgICByZXBlYXQgaXRlbSBpbnN0ZWFkLiBJZiBhIGNoYXIgaXRlbSBoYXMgYSBtaW51bXVtIG9mIG1vcmUgdGhhbiBvbmUsIGVuc3VyZQogICAgdGhhdCBpdCBpcyBzZXQgaW4gcmVxYnl0ZSAtIGl0IG1pZ2h0IG5vdCBiZSBpZiBhIHNlcXVlbmNlIHN1Y2ggYXMgeHszfSBpcwogICAgdGhlIGZpcnN0IHRoaW5nIGluIGEgYnJhbmNoIGJlY2F1c2UgdGhlIHggd2lsbCBoYXZlIGdvbmUgaW50byBmaXJzdGJ5dGUKICAgIGluc3RlYWQuICAqLwoKICAgIGlmICgqcHJldmlvdXMgPT0gT1BfQ0hBUiB8fCAqcHJldmlvdXMgPT0gT1BfQ0hBUk5DKQogICAgICB7CiAgICAgIC8qIERlYWwgd2l0aCBVVEYtOCBjaGFyYWN0ZXJzIHRoYXQgdGFrZSB1cCBtb3JlIHRoYW4gb25lIGJ5dGUuIEl0J3MKICAgICAgZWFzaWVyIHRvIHdyaXRlIHRoaXMgb3V0IHNlcGFyYXRlbHkgdGhhbiB0cnkgdG8gbWFjcmlmeSBpdC4gVXNlIGMgdG8KICAgICAgaG9sZCB0aGUgbGVuZ3RoIG9mIHRoZSBjaGFyYWN0ZXIgaW4gYnl0ZXMsIHBsdXMgMHg4MCB0byBmbGFnIHRoYXQgaXQncyBhCiAgICAgIGxlbmd0aCByYXRoZXIgdGhhbiBhIHNtYWxsIGNoYXJhY3Rlci4gKi8KCiNpZmRlZiBTVVBQT1JUX1VURjgKICAgICAgaWYgKHV0ZjggJiYgKGNvZGVbLTFdICYgMHg4MCkgIT0gMCkKICAgICAgICB7CiAgICAgICAgdXNjaGFyICpsYXN0Y2hhciA9IGNvZGUgLSAxOwogICAgICAgIHdoaWxlKCgqbGFzdGNoYXIgJiAweGMwKSA9PSAweDgwKSBsYXN0Y2hhci0tOwogICAgICAgIGMgPSBjb2RlIC0gbGFzdGNoYXI7ICAgICAgICAgICAgLyogTGVuZ3RoIG9mIFVURi04IGNoYXJhY3RlciAqLwogICAgICAgIG1lbWNweSh1dGY4X2NoYXIsIGxhc3RjaGFyLCBjKTsgLyogU2F2ZSB0aGUgY2hhciAqLwogICAgICAgIGMgfD0gMHg4MDsgICAgICAgICAgICAgICAgICAgICAgLyogRmxhZyBjIGFzIGEgbGVuZ3RoICovCiAgICAgICAgfQogICAgICBlbHNlCiNlbmRpZgoKICAgICAgLyogSGFuZGxlIHRoZSBjYXNlIG9mIGEgc2luZ2xlIGJ5dGUgLSBlaXRoZXIgd2l0aCBubyBVVEY4IHN1cHBvcnQsIG9yCiAgICAgIHdpdGggVVRGLTggZGlzYWJsZWQsIG9yIGZvciBhIFVURi04IGNoYXJhY3RlciA8IDEyOC4gKi8KCiAgICAgICAgewogICAgICAgIGMgPSBjb2RlWy0xXTsKICAgICAgICBpZiAocmVwZWF0X21pbiA+IDEpIHJlcWJ5dGUgPSBjIHwgcmVxX2Nhc2VvcHQgfCBjZC0+cmVxX3ZhcnlvcHQ7CiAgICAgICAgfQoKICAgICAgZ290byBPVVRQVVRfU0lOR0xFX1JFUEVBVDsgICAvKiBDb2RlIHNoYXJlZCB3aXRoIHNpbmdsZSBjaGFyYWN0ZXIgdHlwZXMgKi8KICAgICAgfQoKICAgIC8qIElmIHByZXZpb3VzIHdhcyBhIHNpbmdsZSBuZWdhdGVkIGNoYXJhY3RlciAoW15hXSBvciBzaW1pbGFyKSwgd2UgdXNlCiAgICBvbmUgb2YgdGhlIHNwZWNpYWwgb3Bjb2RlcywgcmVwbGFjaW5nIGl0LiBUaGUgY29kZSBpcyBzaGFyZWQgd2l0aCBzaW5nbGUtCiAgICBjaGFyYWN0ZXIgcmVwZWF0cyBieSBzZXR0aW5nIG9wdF90eXBlIHRvIGFkZCBhIHN1aXRhYmxlIG9mZnNldCBpbnRvCiAgICByZXBlYXRfdHlwZS4gT1BfTk9UIGlzIGN1cnJlbnRseSB1c2VkIG9ubHkgZm9yIHNpbmdsZS1ieXRlIGNoYXJzLiAqLwoKICAgIGVsc2UgaWYgKCpwcmV2aW91cyA9PSBPUF9OT1QpCiAgICAgIHsKICAgICAgb3BfdHlwZSA9IE9QX05PVFNUQVIgLSBPUF9TVEFSOyAgLyogVXNlICJub3QiIG9wY29kZXMgKi8KICAgICAgYyA9IHByZXZpb3VzWzFdOwogICAgICBnb3RvIE9VVFBVVF9TSU5HTEVfUkVQRUFUOwogICAgICB9CgogICAgLyogSWYgcHJldmlvdXMgd2FzIGEgY2hhcmFjdGVyIHR5cGUgbWF0Y2ggKFxkIG9yIHNpbWlsYXIpLCBhYm9saXNoIGl0IGFuZAogICAgY3JlYXRlIGEgc3VpdGFibGUgcmVwZWF0IGl0ZW0uIFRoZSBjb2RlIGlzIHNoYXJlZCB3aXRoIHNpbmdsZS1jaGFyYWN0ZXIKICAgIHJlcGVhdHMgYnkgc2V0dGluZyBvcF90eXBlIHRvIGFkZCBhIHN1aXRhYmxlIG9mZnNldCBpbnRvIHJlcGVhdF90eXBlLiBOb3RlCiAgICB0aGUgdGhlIFVuaWNvZGUgcHJvcGVydHkgdHlwZXMgd2lsbCBiZSBwcmVzZW50IG9ubHkgd2hlbiBTVVBQT1JUX1VDUCBpcwogICAgZGVmaW5lZCwgYnV0IHdlIGRvbid0IHdyYXAgdGhlIGxpdHRsZSBiaXRzIG9mIGNvZGUgaGVyZSBiZWNhdXNlIGl0IGp1c3QKICAgIG1ha2VzIGl0IGhvcnJpYmx5IG1lc3N5LiAqLwoKICAgIGVsc2UgaWYgKCpwcmV2aW91cyA8IE9QX0VPRE4pCiAgICAgIHsKICAgICAgdXNjaGFyICpvbGRjb2RlOwogICAgICBpbnQgcHJvcF90eXBlOwogICAgICBvcF90eXBlID0gT1BfVFlQRVNUQVIgLSBPUF9TVEFSOyAgLyogVXNlIHR5cGUgb3Bjb2RlcyAqLwogICAgICBjID0gKnByZXZpb3VzOwoKICAgICAgT1VUUFVUX1NJTkdMRV9SRVBFQVQ6CiAgICAgIHByb3BfdHlwZSA9ICgqcHJldmlvdXMgPT0gT1BfUFJPUCB8fCAqcHJldmlvdXMgPT0gT1BfTk9UUFJPUCk/CiAgICAgICAgcHJldmlvdXNbMV0gOiAtMTsKCiAgICAgIG9sZGNvZGUgPSBjb2RlOwogICAgICBjb2RlID0gcHJldmlvdXM7ICAgICAgICAgICAgICAgICAgLyogVXN1YWxseSBvdmVyd3JpdGUgcHJldmlvdXMgaXRlbSAqLwoKICAgICAgLyogSWYgdGhlIG1heGltdW0gaXMgemVybyB0aGVuIHRoZSBtaW5pbXVtIG11c3QgYWxzbyBiZSB6ZXJvOyBQZXJsIGFsbG93cwogICAgICB0aGlzIGNhc2UsIHNvIHdlIGRvIHRvbyAtIGJ5IHNpbXBseSBvbWl0dGluZyB0aGUgaXRlbSBhbHRvZ2V0aGVyLiAqLwoKICAgICAgaWYgKHJlcGVhdF9tYXggPT0gMCkgZ290byBFTkRfUkVQRUFUOwoKICAgICAgLyogQWxsIHJlYWwgcmVwZWF0cyBtYWtlIGl0IGltcG9zc2libGUgdG8gaGFuZGxlIHBhcnRpYWwgbWF0Y2hpbmcgKG1heWJlCiAgICAgIG9uZSBkYXkgd2Ugd2lsbCBiZSBhYmxlIHRvIHJlbW92ZSB0aGlzIHJlc3RyaWN0aW9uKS4gKi8KCiAgICAgIGlmIChyZXBlYXRfbWF4ICE9IDEpIGNkLT5ub3BhcnRpYWwgPSBUUlVFOwoKICAgICAgLyogQ29tYmluZSB0aGUgb3BfdHlwZSB3aXRoIHRoZSByZXBlYXRfdHlwZSAqLwoKICAgICAgcmVwZWF0X3R5cGUgKz0gb3BfdHlwZTsKCiAgICAgIC8qIEEgbWluaW11bSBvZiB6ZXJvIGlzIGhhbmRsZWQgZWl0aGVyIGFzIHRoZSBzcGVjaWFsIGNhc2UgKiBvciA/LCBvciBhcwogICAgICBhbiBVUFRPLCB3aXRoIHRoZSBtYXhpbXVtIGdpdmVuLiAqLwoKICAgICAgaWYgKHJlcGVhdF9taW4gPT0gMCkKICAgICAgICB7CiAgICAgICAgaWYgKHJlcGVhdF9tYXggPT0gLTEpICpjb2RlKysgPSBPUF9TVEFSICsgcmVwZWF0X3R5cGU7CiAgICAgICAgICBlbHNlIGlmIChyZXBlYXRfbWF4ID09IDEpICpjb2RlKysgPSBPUF9RVUVSWSArIHJlcGVhdF90eXBlOwogICAgICAgIGVsc2UKICAgICAgICAgIHsKICAgICAgICAgICpjb2RlKysgPSBPUF9VUFRPICsgcmVwZWF0X3R5cGU7CiAgICAgICAgICBQVVQySU5DKGNvZGUsIDAsIHJlcGVhdF9tYXgpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgIC8qIEEgcmVwZWF0IG1pbmltdW0gb2YgMSBpcyBvcHRpbWl6ZWQgaW50byBzb21lIHNwZWNpYWwgY2FzZXMuIElmIHRoZQogICAgICBtYXhpbXVtIGlzIHVubGltaXRlZCwgd2UgdXNlIE9QX1BMVVMuIE90aGVyd2lzZSwgdGhlIG9yaWdpbmFsIGl0ZW0gaXQKICAgICAgbGVmdCBpbiBwbGFjZSBhbmQsIGlmIHRoZSBtYXhpbXVtIGlzIGdyZWF0ZXIgdGhhbiAxLCB3ZSB1c2UgT1BfVVBUTyB3aXRoCiAgICAgIG9uZSBsZXNzIHRoYW4gdGhlIG1heGltdW0uICovCgogICAgICBlbHNlIGlmIChyZXBlYXRfbWluID09IDEpCiAgICAgICAgewogICAgICAgIGlmIChyZXBlYXRfbWF4ID09IC0xKQogICAgICAgICAgKmNvZGUrKyA9IE9QX1BMVVMgKyByZXBlYXRfdHlwZTsKICAgICAgICBlbHNlCiAgICAgICAgICB7CiAgICAgICAgICBjb2RlID0gb2xkY29kZTsgICAgICAgICAgICAgICAgIC8qIGxlYXZlIHByZXZpb3VzIGl0ZW0gaW4gcGxhY2UgKi8KICAgICAgICAgIGlmIChyZXBlYXRfbWF4ID09IDEpIGdvdG8gRU5EX1JFUEVBVDsKICAgICAgICAgICpjb2RlKysgPSBPUF9VUFRPICsgcmVwZWF0X3R5cGU7CiAgICAgICAgICBQVVQySU5DKGNvZGUsIDAsIHJlcGVhdF9tYXggLSAxKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAvKiBUaGUgY2FzZSB7bixufSBpcyBqdXN0IGFuIEVYQUNULCB3aGlsZSB0aGUgZ2VuZXJhbCBjYXNlIHtuLG19IGlzCiAgICAgIGhhbmRsZWQgYXMgYW4gRVhBQ1QgZm9sbG93ZWQgYnkgYW4gVVBUTy4gKi8KCiAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgKmNvZGUrKyA9IE9QX0VYQUNUICsgb3BfdHlwZTsgIC8qIE5CIEVYQUNUIGRvZXNuJ3QgaGF2ZSByZXBlYXRfdHlwZSAqLwogICAgICAgIFBVVDJJTkMoY29kZSwgMCwgcmVwZWF0X21pbik7CgogICAgICAgIC8qIElmIHRoZSBtYXhpbXVtIGlzIHVubGltaXRlZCwgaW5zZXJ0IGFuIE9QX1NUQVIuIEJlZm9yZSBkb2luZyBzbywKICAgICAgICB3ZSBoYXZlIHRvIGluc2VydCB0aGUgY2hhcmFjdGVyIGZvciB0aGUgcHJldmlvdXMgY29kZS4gRm9yIGEgcmVwZWF0ZWQKICAgICAgICBVbmljb2RlIHByb3BlcnR5IG1hdGNoLCB0aGVyZSBpcyBhbiBleHRyYSBieXRlIHRoYXQgZGVmaW5lcyB0aGUKICAgICAgICByZXF1aXJlZCBwcm9wZXJ0eS4gSW4gVVRGLTggbW9kZSwgbG9uZyBjaGFyYWN0ZXJzIGhhdmUgdGhlaXIgbGVuZ3RoIGluCiAgICAgICAgYywgd2l0aCB0aGUgMHg4MCBiaXQgYXMgYSBmbGFnLiAqLwoKICAgICAgICBpZiAocmVwZWF0X21heCA8IDApCiAgICAgICAgICB7CiNpZmRlZiBTVVBQT1JUX1VURjgKICAgICAgICAgIGlmICh1dGY4ICYmIGMgPj0gMTI4KQogICAgICAgICAgICB7CiAgICAgICAgICAgIG1lbWNweShjb2RlLCB1dGY4X2NoYXIsIGMgJiA3KTsKICAgICAgICAgICAgY29kZSArPSBjICYgNzsKICAgICAgICAgICAgfQogICAgICAgICAgZWxzZQojZW5kaWYKICAgICAgICAgICAgewogICAgICAgICAgICAqY29kZSsrID0gYzsKICAgICAgICAgICAgaWYgKHByb3BfdHlwZSA+PSAwKSAqY29kZSsrID0gcHJvcF90eXBlOwogICAgICAgICAgICB9CiAgICAgICAgICAqY29kZSsrID0gT1BfU1RBUiArIHJlcGVhdF90eXBlOwogICAgICAgICAgfQoKICAgICAgICAvKiBFbHNlIGluc2VydCBhbiBVUFRPIGlmIHRoZSBtYXggaXMgZ3JlYXRlciB0aGFuIHRoZSBtaW4sIGFnYWluCiAgICAgICAgcHJlY2VkZWQgYnkgdGhlIGNoYXJhY3RlciwgZm9yIHRoZSBwcmV2aW91c2x5IGluc2VydGVkIGNvZGUuICovCgogICAgICAgIGVsc2UgaWYgKHJlcGVhdF9tYXggIT0gcmVwZWF0X21pbikKICAgICAgICAgIHsKI2lmZGVmIFNVUFBPUlRfVVRGOAogICAgICAgICAgaWYgKHV0ZjggJiYgYyA+PSAxMjgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgbWVtY3B5KGNvZGUsIHV0ZjhfY2hhciwgYyAmIDcpOwogICAgICAgICAgICBjb2RlICs9IGMgJiA3OwogICAgICAgICAgICB9CiAgICAgICAgICBlbHNlCiNlbmRpZgogICAgICAgICAgKmNvZGUrKyA9IGM7CiAgICAgICAgICBpZiAocHJvcF90eXBlID49IDApICpjb2RlKysgPSBwcm9wX3R5cGU7CiAgICAgICAgICByZXBlYXRfbWF4IC09IHJlcGVhdF9taW47CiAgICAgICAgICAqY29kZSsrID0gT1BfVVBUTyArIHJlcGVhdF90eXBlOwogICAgICAgICAgUFVUMklOQyhjb2RlLCAwLCByZXBlYXRfbWF4KTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAvKiBUaGUgY2hhcmFjdGVyIG9yIGNoYXJhY3RlciB0eXBlIGl0c2VsZiBjb21lcyBsYXN0IGluIGFsbCBjYXNlcy4gKi8KCiNpZmRlZiBTVVBQT1JUX1VURjgKICAgICAgaWYgKHV0ZjggJiYgYyA+PSAxMjgpCiAgICAgICAgewogICAgICAgIG1lbWNweShjb2RlLCB1dGY4X2NoYXIsIGMgJiA3KTsKICAgICAgICBjb2RlICs9IGMgJiA3OwogICAgICAgIH0KICAgICAgZWxzZQojZW5kaWYKICAgICAgKmNvZGUrKyA9IGM7CgogICAgICAvKiBGb3IgYSByZXBlYXRlZCBVbmljb2RlIHByb3BlcnR5IG1hdGNoLCB0aGVyZSBpcyBhbiBleHRyYSBieXRlIHRoYXQKICAgICAgZGVmaW5lcyB0aGUgcmVxdWlyZWQgcHJvcGVydHkuICovCgojaWZkZWYgU1VQUE9SVF9VQ1AKICAgICAgaWYgKHByb3BfdHlwZSA+PSAwKSAqY29kZSsrID0gcHJvcF90eXBlOwojZW5kaWYKICAgICAgfQoKICAgIC8qIElmIHByZXZpb3VzIHdhcyBhIGNoYXJhY3RlciBjbGFzcyBvciBhIGJhY2sgcmVmZXJlbmNlLCB3ZSBwdXQgdGhlIHJlcGVhdAogICAgc3R1ZmYgYWZ0ZXIgaXQsIGJ1dCBqdXN0IHNraXAgdGhlIGl0ZW0gaWYgdGhlIHJlcGVhdCB3YXMgezAsMH0uICovCgogICAgZWxzZSBpZiAoKnByZXZpb3VzID09IE9QX0NMQVNTIHx8CiAgICAgICAgICAgICAqcHJldmlvdXMgPT0gT1BfTkNMQVNTIHx8CiNpZmRlZiBTVVBQT1JUX1VURjgKICAgICAgICAgICAgICpwcmV2aW91cyA9PSBPUF9YQ0xBU1MgfHwKI2VuZGlmCiAgICAgICAgICAgICAqcHJldmlvdXMgPT0gT1BfUkVGKQogICAgICB7CiAgICAgIGlmIChyZXBlYXRfbWF4ID09IDApCiAgICAgICAgewogICAgICAgIGNvZGUgPSBwcmV2aW91czsKICAgICAgICBnb3RvIEVORF9SRVBFQVQ7CiAgICAgICAgfQoKICAgICAgLyogQWxsIHJlYWwgcmVwZWF0cyBtYWtlIGl0IGltcG9zc2libGUgdG8gaGFuZGxlIHBhcnRpYWwgbWF0Y2hpbmcgKG1heWJlCiAgICAgIG9uZSBkYXkgd2Ugd2lsbCBiZSBhYmxlIHRvIHJlbW92ZSB0aGlzIHJlc3RyaWN0aW9uKS4gKi8KCiAgICAgIGlmIChyZXBlYXRfbWF4ICE9IDEpIGNkLT5ub3BhcnRpYWwgPSBUUlVFOwoKICAgICAgaWYgKHJlcGVhdF9taW4gPT0gMCAmJiByZXBlYXRfbWF4ID09IC0xKQogICAgICAgICpjb2RlKysgPSBPUF9DUlNUQVIgKyByZXBlYXRfdHlwZTsKICAgICAgZWxzZSBpZiAocmVwZWF0X21pbiA9PSAxICYmIHJlcGVhdF9tYXggPT0gLTEpCiAgICAgICAgKmNvZGUrKyA9IE9QX0NSUExVUyArIHJlcGVhdF90eXBlOwogICAgICBlbHNlIGlmIChyZXBlYXRfbWluID09IDAgJiYgcmVwZWF0X21heCA9PSAxKQogICAgICAgICpjb2RlKysgPSBPUF9DUlFVRVJZICsgcmVwZWF0X3R5cGU7CiAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgKmNvZGUrKyA9IE9QX0NSUkFOR0UgKyByZXBlYXRfdHlwZTsKICAgICAgICBQVVQySU5DKGNvZGUsIDAsIHJlcGVhdF9taW4pOwogICAgICAgIGlmIChyZXBlYXRfbWF4ID09IC0xKSByZXBlYXRfbWF4ID0gMDsgIC8qIDItYnl0ZSBlbmNvZGluZyBmb3IgbWF4ICovCiAgICAgICAgUFVUMklOQyhjb2RlLCAwLCByZXBlYXRfbWF4KTsKICAgICAgICB9CiAgICAgIH0KCiAgICAvKiBJZiBwcmV2aW91cyB3YXMgYSBicmFja2V0IGdyb3VwLCB3ZSBtYXkgaGF2ZSB0byByZXBsaWNhdGUgaXQgaW4gY2VydGFpbgogICAgY2FzZXMuICovCgogICAgZWxzZSBpZiAoKnByZXZpb3VzID49IE9QX0JSQSB8fCAqcHJldmlvdXMgPT0gT1BfT05DRSB8fAogICAgICAgICAgICAgKnByZXZpb3VzID09IE9QX0NPTkQpCiAgICAgIHsKICAgICAgcmVnaXN0ZXIgaW50IGk7CiAgICAgIGludCBrZXRvZmZzZXQgPSAwOwogICAgICBpbnQgbGVuID0gY29kZSAtIHByZXZpb3VzOwogICAgICB1c2NoYXIgKmJyYWxpbmsgPSBOVUxMOwoKICAgICAgLyogSWYgdGhlIG1heGltdW0gcmVwZWF0IGNvdW50IGlzIHVubGltaXRlZCwgZmluZCB0aGUgZW5kIG9mIHRoZSBicmFja2V0CiAgICAgIGJ5IHNjYW5uaW5nIHRocm91Z2ggZnJvbSB0aGUgc3RhcnQsIGFuZCBjb21wdXRlIHRoZSBvZmZzZXQgYmFjayB0byBpdAogICAgICBmcm9tIHRoZSBjdXJyZW50IGNvZGUgcG9pbnRlci4gVGhlcmUgbWF5IGJlIGFuIE9QX09QVCBzZXR0aW5nIGZvbGxvd2luZwogICAgICB0aGUgZmluYWwgS0VULCBzbyB3ZSBjYW4ndCBmaW5kIHRoZSBlbmQganVzdCBieSBnb2luZyBiYWNrIGZyb20gdGhlIGNvZGUKICAgICAgcG9pbnRlci4gKi8KCiAgICAgIGlmIChyZXBlYXRfbWF4ID09IC0xKQogICAgICAgIHsKICAgICAgICByZWdpc3RlciB1c2NoYXIgKmtldCA9IHByZXZpb3VzOwogICAgICAgIGRvIGtldCArPSBHRVQoa2V0LCAxKTsgd2hpbGUgKCprZXQgIT0gT1BfS0VUKTsKICAgICAgICBrZXRvZmZzZXQgPSBjb2RlIC0ga2V0OwogICAgICAgIH0KCiAgICAgIC8qIFRoZSBjYXNlIG9mIGEgemVybyBtaW5pbXVtIGlzIHNwZWNpYWwgYmVjYXVzZSBvZiB0aGUgbmVlZCB0byBzdGljawogICAgICBPUF9CUkFaRVJPIGluIGZyb250IG9mIGl0LCBhbmQgYmVjYXVzZSB0aGUgZ3JvdXAgYXBwZWFycyBvbmNlIGluIHRoZQogICAgICBkYXRhLCB3aGVyZWFzIGluIG90aGVyIGNhc2VzIGl0IGFwcGVhcnMgdGhlIG1pbmltdW0gbnVtYmVyIG9mIHRpbWVzLiBGb3IKICAgICAgdGhpcyByZWFzb24sIGl0IGlzIHNpbXBsZXN0IHRvIHRyZWF0IHRoaXMgY2FzZSBzZXBhcmF0ZWx5LCBhcyBvdGhlcndpc2UKICAgICAgdGhlIGNvZGUgZ2V0cyBmYXIgdG9vIG1lc3N5LiBUaGVyZSBhcmUgc2V2ZXJhbCBzcGVjaWFsIHN1YmNhc2VzIHdoZW4gdGhlCiAgICAgIG1pbmltdW0gaXMgemVyby4gKi8KCiAgICAgIGlmIChyZXBlYXRfbWluID09IDApCiAgICAgICAgewogICAgICAgIC8qIElmIHRoZSBtYXhpbXVtIGlzIGFsc28gemVybywgd2UganVzdCBvbWl0IHRoZSBncm91cCBmcm9tIHRoZSBvdXRwdXQKICAgICAgICBhbHRvZ2V0aGVyLiAqLwoKICAgICAgICBpZiAocmVwZWF0X21heCA9PSAwKQogICAgICAgICAgewogICAgICAgICAgY29kZSA9IHByZXZpb3VzOwogICAgICAgICAgZ290byBFTkRfUkVQRUFUOwogICAgICAgICAgfQoKICAgICAgICAvKiBJZiB0aGUgbWF4aW11bSBpcyAxIG9yIHVubGltaXRlZCwgd2UganVzdCBoYXZlIHRvIHN0aWNrIGluIHRoZQogICAgICAgIEJSQVpFUk8gYW5kIGRvIG5vIG1vcmUgYXQgdGhpcyBwb2ludC4gSG93ZXZlciwgd2UgZG8gbmVlZCB0byBhZGp1c3QKICAgICAgICBhbnkgT1BfUkVDVVJTRSBjYWxscyBpbnNpZGUgdGhlIGdyb3VwIHRoYXQgcmVmZXIgdG8gdGhlIGdyb3VwIGl0c2VsZiBvcgogICAgICAgIGFueSBpbnRlcm5hbCBncm91cCwgYmVjYXVzZSB0aGUgb2Zmc2V0IGlzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSB3aG9sZQogICAgICAgIHJlZ2V4LiBUZW1wb3JhcmlseSB0ZXJtaW5hdGUgdGhlIHBhdHRlcm4gd2hpbGUgZG9pbmcgdGhpcy4gKi8KCiAgICAgICAgaWYgKHJlcGVhdF9tYXggPD0gMSkKICAgICAgICAgIHsKICAgICAgICAgICpjb2RlID0gT1BfRU5EOwogICAgICAgICAgYWRqdXN0X3JlY3Vyc2UocHJldmlvdXMsIDEsIHV0ZjgsIGNkKTsKICAgICAgICAgIG1lbW1vdmUocHJldmlvdXMrMSwgcHJldmlvdXMsIGxlbik7CiAgICAgICAgICBjb2RlKys7CiAgICAgICAgICAqcHJldmlvdXMrKyA9IE9QX0JSQVpFUk8gKyByZXBlYXRfdHlwZTsKICAgICAgICAgIH0KCiAgICAgICAgLyogSWYgdGhlIG1heGltdW0gaXMgZ3JlYXRlciB0aGFuIDEgYW5kIGxpbWl0ZWQsIHdlIGhhdmUgdG8gcmVwbGljYXRlCiAgICAgICAgaW4gYSBuZXN0ZWQgZmFzaGlvbiwgc3RpY2tpbmcgT1BfQlJBWkVSTyBiZWZvcmUgZWFjaCBzZXQgb2YgYnJhY2tldHMuCiAgICAgICAgVGhlIGZpcnN0IG9uZSBoYXMgdG8gYmUgaGFuZGxlZCBjYXJlZnVsbHkgYmVjYXVzZSBpdCdzIHRoZSBvcmlnaW5hbAogICAgICAgIGNvcHksIHdoaWNoIGhhcyB0byBiZSBtb3ZlZCB1cC4gVGhlIHJlbWFpbmRlciBjYW4gYmUgaGFuZGxlZCBieSBjb2RlCiAgICAgICAgdGhhdCBpcyBjb21tb24gd2l0aCB0aGUgbm9uLXplcm8gbWluaW11bSBjYXNlIGJlbG93LiBXZSBoYXZlIHRvCiAgICAgICAgYWRqdXN0IHRoZSB2YWx1ZSBvciByZXBlYXRfbWF4LCBzaW5jZSBvbmUgbGVzcyBjb3B5IGlzIHJlcXVpcmVkLiBPbmNlCiAgICAgICAgYWdhaW4sIHdlIG1heSBoYXZlIHRvIGFkanVzdCBhbnkgT1BfUkVDVVJTRSBjYWxscyBpbnNpZGUgdGhlIGdyb3VwLiAqLwoKICAgICAgICBlbHNlCiAgICAgICAgICB7CiAgICAgICAgICBpbnQgb2Zmc2V0OwogICAgICAgICAgKmNvZGUgPSBPUF9FTkQ7CiAgICAgICAgICBhZGp1c3RfcmVjdXJzZShwcmV2aW91cywgMiArIExJTktfU0laRSwgdXRmOCwgY2QpOwogICAgICAgICAgbWVtbW92ZShwcmV2aW91cyArIDIgKyBMSU5LX1NJWkUsIHByZXZpb3VzLCBsZW4pOwogICAgICAgICAgY29kZSArPSAyICsgTElOS19TSVpFOwogICAgICAgICAgKnByZXZpb3VzKysgPSBPUF9CUkFaRVJPICsgcmVwZWF0X3R5cGU7CiAgICAgICAgICAqcHJldmlvdXMrKyA9IE9QX0JSQTsKCiAgICAgICAgICAvKiBXZSBjaGFpbiB0b2dldGhlciB0aGUgYnJhY2tldCBvZmZzZXQgZmllbGRzIHRoYXQgaGF2ZSB0byBiZQogICAgICAgICAgZmlsbGVkIGluIGxhdGVyIHdoZW4gdGhlIGVuZHMgb2YgdGhlIGJyYWNrZXRzIGFyZSByZWFjaGVkLiAqLwoKICAgICAgICAgIG9mZnNldCA9IChicmFsaW5rID09IE5VTEwpPyAwIDogcHJldmlvdXMgLSBicmFsaW5rOwogICAgICAgICAgYnJhbGluayA9IHByZXZpb3VzOwogICAgICAgICAgUFVUSU5DKHByZXZpb3VzLCAwLCBvZmZzZXQpOwogICAgICAgICAgfQoKICAgICAgICByZXBlYXRfbWF4LS07CiAgICAgICAgfQoKICAgICAgLyogSWYgdGhlIG1pbmltdW0gaXMgZ3JlYXRlciB0aGFuIHplcm8sIHJlcGxpY2F0ZSB0aGUgZ3JvdXAgYXMgbWFueQogICAgICB0aW1lcyBhcyBuZWNlc3NhcnksIGFuZCBhZGp1c3QgdGhlIG1heGltdW0gdG8gdGhlIG51bWJlciBvZiBzdWJzZXF1ZW50CiAgICAgIGNvcGllcyB0aGF0IHdlIG5lZWQuIElmIHdlIHNldCBhIGZpcnN0IGNoYXIgZnJvbSB0aGUgZ3JvdXAsIGFuZCBkaWRuJ3QKICAgICAgc2V0IGEgcmVxdWlyZWQgY2hhciwgY29weSB0aGUgbGF0dGVyIGZyb20gdGhlIGZvcm1lci4gKi8KCiAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgaWYgKHJlcGVhdF9taW4gPiAxKQogICAgICAgICAgewogICAgICAgICAgaWYgKGdyb3Vwc2V0Zmlyc3RieXRlICYmIHJlcWJ5dGUgPCAwKSByZXFieXRlID0gZmlyc3RieXRlOwogICAgICAgICAgZm9yIChpID0gMTsgaSA8IHJlcGVhdF9taW47IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICBtZW1jcHkoY29kZSwgcHJldmlvdXMsIGxlbik7CiAgICAgICAgICAgIGNvZGUgKz0gbGVuOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgaWYgKHJlcGVhdF9tYXggPiAwKSByZXBlYXRfbWF4IC09IHJlcGVhdF9taW47CiAgICAgICAgfQoKICAgICAgLyogVGhpcyBjb2RlIGlzIGNvbW1vbiB0byBib3RoIHRoZSB6ZXJvIGFuZCBub24temVybyBtaW5pbXVtIGNhc2VzLiBJZgogICAgICB0aGUgbWF4aW11bSBpcyBsaW1pdGVkLCBpdCByZXBsaWNhdGVzIHRoZSBncm91cCBpbiBhIG5lc3RlZCBmYXNoaW9uLAogICAgICByZW1lbWJlcmluZyB0aGUgYnJhY2tldCBzdGFydHMgb24gYSBzdGFjay4gSW4gdGhlIGNhc2Ugb2YgYSB6ZXJvIG1pbmltdW0sCiAgICAgIHRoZSBmaXJzdCBvbmUgd2FzIHNldCB1cCBhYm92ZS4gSW4gYWxsIGNhc2VzIHRoZSByZXBlYXRfbWF4IG5vdyBzcGVjaWZpZXMKICAgICAgdGhlIG51bWJlciBvZiBhZGRpdGlvbmFsIGNvcGllcyBuZWVkZWQuICovCgogICAgICBpZiAocmVwZWF0X21heCA+PSAwKQogICAgICAgIHsKICAgICAgICBmb3IgKGkgPSByZXBlYXRfbWF4IC0gMTsgaSA+PSAwOyBpLS0pCiAgICAgICAgICB7CiAgICAgICAgICAqY29kZSsrID0gT1BfQlJBWkVSTyArIHJlcGVhdF90eXBlOwoKICAgICAgICAgIC8qIEFsbCBidXQgdGhlIGZpbmFsIGNvcHkgc3RhcnQgYSBuZXcgbmVzdGluZywgbWFpbnRhaW5pbmcgdGhlCiAgICAgICAgICBjaGFpbiBvZiBicmFja2V0cyBvdXRzdGFuZGluZy4gKi8KCiAgICAgICAgICBpZiAoaSAhPSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgIGludCBvZmZzZXQ7CiAgICAgICAgICAgICpjb2RlKysgPSBPUF9CUkE7CiAgICAgICAgICAgIG9mZnNldCA9IChicmFsaW5rID09IE5VTEwpPyAwIDogY29kZSAtIGJyYWxpbms7CiAgICAgICAgICAgIGJyYWxpbmsgPSBjb2RlOwogICAgICAgICAgICBQVVRJTkMoY29kZSwgMCwgb2Zmc2V0KTsKICAgICAgICAgICAgfQoKICAgICAgICAgIG1lbWNweShjb2RlLCBwcmV2aW91cywgbGVuKTsKICAgICAgICAgIGNvZGUgKz0gbGVuOwogICAgICAgICAgfQoKICAgICAgICAvKiBOb3cgY2hhaW4gdGhyb3VnaCB0aGUgcGVuZGluZyBicmFja2V0cywgYW5kIGZpbGwgaW4gdGhlaXIgbGVuZ3RoCiAgICAgICAgZmllbGRzICh3aGljaCBhcmUgaG9sZGluZyB0aGUgY2hhaW4gbGlua3MgcHJvIHRlbSkuICovCgogICAgICAgIHdoaWxlIChicmFsaW5rICE9IE5VTEwpCiAgICAgICAgICB7CiAgICAgICAgICBpbnQgb2xkbGlua29mZnNldDsKICAgICAgICAgIGludCBvZmZzZXQgPSBjb2RlIC0gYnJhbGluayArIDE7CiAgICAgICAgICB1c2NoYXIgKmJyYSA9IGNvZGUgLSBvZmZzZXQ7CiAgICAgICAgICBvbGRsaW5rb2Zmc2V0ID0gR0VUKGJyYSwgMSk7CiAgICAgICAgICBicmFsaW5rID0gKG9sZGxpbmtvZmZzZXQgPT0gMCk/IE5VTEwgOiBicmFsaW5rIC0gb2xkbGlua29mZnNldDsKICAgICAgICAgICpjb2RlKysgPSBPUF9LRVQ7CiAgICAgICAgICBQVVRJTkMoY29kZSwgMCwgb2Zmc2V0KTsKICAgICAgICAgIFBVVChicmEsIDEsIG9mZnNldCk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgLyogSWYgdGhlIG1heGltdW0gaXMgdW5saW1pdGVkLCBzZXQgYSByZXBlYXRlciBpbiB0aGUgZmluYWwgY29weS4gV2UKICAgICAgY2FuJ3QganVzdCBvZmZzZXQgYmFja3dhcmRzIGZyb20gdGhlIGN1cnJlbnQgY29kZSBwb2ludCwgYmVjYXVzZSB3ZQogICAgICBkb24ndCBrbm93IGlmIHRoZXJlJ3MgYmVlbiBhbiBvcHRpb25zIHJlc2V0dGluZyBhZnRlciB0aGUga2V0LiBUaGUKICAgICAgY29ycmVjdCBvZmZzZXQgd2FzIGNvbXB1dGVkIGFib3ZlLiAqLwoKICAgICAgZWxzZSBjb2RlWy1rZXRvZmZzZXRdID0gT1BfS0VUUk1BWCArIHJlcGVhdF90eXBlOwogICAgICB9CgogICAgLyogRWxzZSB0aGVyZSdzIHNvbWUga2luZCBvZiBzaGFtYmxlcyAqLwoKICAgIGVsc2UKICAgICAgewogICAgICAqZXJyb3JwdHIgPSBFUlIxMTsKICAgICAgZ290byBGQUlMRUQ7CiAgICAgIH0KCiAgICAvKiBJZiB0aGUgY2hhcmFjdGVyIGZvbGxvd2luZyBhIHJlcGVhdCBpcyAnKycsIHdlIHdyYXAgdGhlIGVudGlyZSByZXBlYXRlZAogICAgaXRlbSBpbnNpZGUgT1BfT05DRSBicmFja2V0cy4gVGhpcyBpcyBqdXN0IHN5bnRhY3RpYyBzdWdhciwgdGFrZW4gZnJvbQogICAgU3VuJ3MgSmF2YSBwYWNrYWdlLiBUaGUgcmVwZWF0ZWQgaXRlbSBzdGFydHMgYXQgdGVtcGNvZGUsIG5vdCBhdCBwcmV2aW91cywKICAgIHdoaWNoIG1pZ2h0IGJlIHRoZSBmaXJzdCBwYXJ0IG9mIGEgc3RyaW5nIHdob3NlIChmb3JtZXIpIGxhc3QgY2hhciB3ZQogICAgcmVwZWF0ZWQuIEhvd2V2ZXIsIHdlIGRvbid0IHN1cHBvcnQgJysnIGFmdGVyIGEgZ3JlZWRpbmVzcyAnPycuICovCgogICAgaWYgKHBvc3Nlc3NpdmVfcXVhbnRpZmllcikKICAgICAgewogICAgICBpbnQgbGVuID0gY29kZSAtIHRlbXBjb2RlOwogICAgICBtZW1tb3ZlKHRlbXBjb2RlICsgMStMSU5LX1NJWkUsIHRlbXBjb2RlLCBsZW4pOwogICAgICBjb2RlICs9IDEgKyBMSU5LX1NJWkU7CiAgICAgIGxlbiArPSAxICsgTElOS19TSVpFOwogICAgICB0ZW1wY29kZVswXSA9IE9QX09OQ0U7CiAgICAgICpjb2RlKysgPSBPUF9LRVQ7CiAgICAgIFBVVElOQyhjb2RlLCAwLCBsZW4pOwogICAgICBQVVQodGVtcGNvZGUsIDEsIGxlbik7CiAgICAgIH0KCiAgICAvKiBJbiBhbGwgY2FzZSB3ZSBubyBsb25nZXIgaGF2ZSBhIHByZXZpb3VzIGl0ZW0uIFdlIGFsc28gc2V0IHRoZQogICAgImZvbGxvd3MgdmFyeWluZyBzdHJpbmciIGZsYWcgZm9yIHN1YnNlcXVlbnRseSBlbmNvdW50ZXJlZCByZXFieXRlcyBpZgogICAgaXQgaXNuJ3QgYWxyZWFkeSBzZXQgYW5kIHdlIGhhdmUganVzdCBwYXNzZWQgYSB2YXJ5aW5nIGxlbmd0aCBpdGVtLiAqLwoKICAgIEVORF9SRVBFQVQ6CiAgICBwcmV2aW91cyA9IE5VTEw7CiAgICBjZC0+cmVxX3ZhcnlvcHQgfD0gcmVxdmFyeTsKICAgIGJyZWFrOwoKCiAgICAvKiBTdGFydCBvZiBuZXN0ZWQgYnJhY2tldCBzdWItZXhwcmVzc2lvbiwgb3IgY29tbWVudCBvciBsb29rYWhlYWQgb3IKICAgIGxvb2tiZWhpbmQgb3Igb3B0aW9uIHNldHRpbmcgb3IgY29uZGl0aW9uLiBGaXJzdCBkZWFsIHdpdGggc3BlY2lhbCB0aGluZ3MKICAgIHRoYXQgY2FuIGNvbWUgYWZ0ZXIgYSBicmFja2V0OyBhbGwgYXJlIGludHJvZHVjZWQgYnkgPywgYW5kIHRoZSBhcHBlYXJhbmNlCiAgICBvZiBhbnkgb2YgdGhlbSBtZWFucyB0aGF0IHRoaXMgaXMgbm90IGEgcmVmZXJlbmNpbmcgZ3JvdXAuIFRoZXkgd2VyZQogICAgY2hlY2tlZCBmb3IgdmFsaWRpdHkgaW4gdGhlIGZpcnN0IHBhc3Mgb3ZlciB0aGUgc3RyaW5nLCBzbyB3ZSBkb24ndCBoYXZlIHRvCiAgICBjaGVjayBmb3Igc3ludGF4IGVycm9ycyBoZXJlLiAgKi8KCiAgICBjYXNlICcoJzoKICAgIG5ld29wdGlvbnMgPSBvcHRpb25zOwogICAgc2tpcGJ5dGVzID0gMDsKCiAgICBpZiAoKigrK3B0cikgPT0gJz8nKQogICAgICB7CiAgICAgIGludCBzZXQsIHVuc2V0OwogICAgICBpbnQgKm9wdHNldDsKCiAgICAgIHN3aXRjaCAoKigrK3B0cikpCiAgICAgICAgewogICAgICAgIGNhc2UgJyMnOiAgICAgICAgICAgICAgICAgLyogQ29tbWVudDsgc2tpcCB0byBrZXQgKi8KICAgICAgICBwdHIrKzsKICAgICAgICB3aGlsZSAoKnB0ciAhPSAnKScpIHB0cisrOwogICAgICAgIGNvbnRpbnVlOwoKICAgICAgICBjYXNlICc6JzogICAgICAgICAgICAgICAgIC8qIE5vbi1leHRyYWN0aW5nIGJyYWNrZXQgKi8KICAgICAgICBicmF2YWx1ZSA9IE9QX0JSQTsKICAgICAgICBwdHIrKzsKICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAnKCc6CiAgICAgICAgYnJhdmFsdWUgPSBPUF9DT05EOyAgICAgICAvKiBDb25kaXRpb25hbCBncm91cCAqLwoKICAgICAgICAvKiBDb25kaXRpb24gdG8gdGVzdCBmb3IgcmVjdXJzaW9uICovCgogICAgICAgIGlmIChwdHJbMV0gPT0gJ1InKQogICAgICAgICAgewogICAgICAgICAgY29kZVsxK0xJTktfU0laRV0gPSBPUF9DUkVGOwogICAgICAgICAgUFVUMihjb2RlLCAyK0xJTktfU0laRSwgQ1JFRl9SRUNVUlNFKTsKICAgICAgICAgIHNraXBieXRlcyA9IDM7CiAgICAgICAgICBwdHIgKz0gMzsKICAgICAgICAgIH0KCiAgICAgICAgLyogQ29uZGl0aW9uIHRvIHRlc3QgZm9yIGEgbnVtYmVyZWQgc3VicGF0dGVybiBtYXRjaC4gV2Uga25vdyB0aGF0CiAgICAgICAgaWYgYSBkaWdpdCBmb2xsb3dzICggdGhlbiB0aGVyZSB3aWxsIGp1c3QgYmUgZGlnaXRzIHVudGlsICkgYmVjYXVzZQogICAgICAgIHRoZSBzeW50YXggd2FzIGNoZWNrZWQgaW4gdGhlIGZpcnN0IHBhc3MuICovCgogICAgICAgIGVsc2UgaWYgKChkaWdpdGFiW3B0clsxXV0gJiYgY3R5cGVfZGlnaXQpICE9IDApCiAgICAgICAgICB7CiAgICAgICAgICBpbnQgY29uZHJlZjsgICAgICAgICAgICAgICAgIC8qIERvbid0IGFtYWxnYW1hdGU7IHNvbWUgY29tcGlsZXJzICovCiAgICAgICAgICBjb25kcmVmID0gKigrK3B0cikgLSAnMCc7ICAgIC8qIGdydW1ibGUgYXQgYXV0b2luY3JlbWVudCBpbiBkZWNsYXJhdGlvbiAqLwogICAgICAgICAgd2hpbGUgKCooKytwdHIpICE9ICcpJykgY29uZHJlZiA9IGNvbmRyZWYqMTAgKyAqcHRyIC0gJzAnOwogICAgICAgICAgaWYgKGNvbmRyZWYgPT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAqZXJyb3JwdHIgPSBFUlIzNTsKICAgICAgICAgICAgZ290byBGQUlMRUQ7CiAgICAgICAgICAgIH0KICAgICAgICAgIHB0cisrOwogICAgICAgICAgY29kZVsxK0xJTktfU0laRV0gPSBPUF9DUkVGOwogICAgICAgICAgUFVUMihjb2RlLCAyK0xJTktfU0laRSwgY29uZHJlZik7CiAgICAgICAgICBza2lwYnl0ZXMgPSAzOwogICAgICAgICAgfQogICAgICAgIC8qIEZvciBjb25kaXRpb25zIHRoYXQgYXJlIGFzc2VydGlvbnMsIHdlIGp1c3QgZmFsbCB0aHJvdWdoLCBoYXZpbmcKICAgICAgICBzZXQgYnJhdmFsdWUgYWJvdmUuICovCiAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgJz0nOiAgICAgICAgICAgICAgICAgLyogUG9zaXRpdmUgbG9va2FoZWFkICovCiAgICAgICAgYnJhdmFsdWUgPSBPUF9BU1NFUlQ7CiAgICAgICAgcHRyKys7CiAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgJyEnOiAgICAgICAgICAgICAgICAgLyogTmVnYXRpdmUgbG9va2FoZWFkICovCiAgICAgICAgYnJhdmFsdWUgPSBPUF9BU1NFUlRfTk9UOwogICAgICAgIHB0cisrOwogICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICc8JzogICAgICAgICAgICAgICAgIC8qIExvb2tiZWhpbmRzICovCiAgICAgICAgc3dpdGNoICgqKCsrcHRyKSkKICAgICAgICAgIHsKICAgICAgICAgIGNhc2UgJz0nOiAgICAgICAgICAgICAgIC8qIFBvc2l0aXZlIGxvb2tiZWhpbmQgKi8KICAgICAgICAgIGJyYXZhbHVlID0gT1BfQVNTRVJUQkFDSzsKICAgICAgICAgIHB0cisrOwogICAgICAgICAgYnJlYWs7CgogICAgICAgICAgY2FzZSAnISc6ICAgICAgICAgICAgICAgLyogTmVnYXRpdmUgbG9va2JlaGluZCAqLwogICAgICAgICAgYnJhdmFsdWUgPSBPUF9BU1NFUlRCQUNLX05PVDsKICAgICAgICAgIHB0cisrOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgJz4nOiAgICAgICAgICAgICAgICAgLyogT25lLXRpbWUgYnJhY2tldHMgKi8KICAgICAgICBicmF2YWx1ZSA9IE9QX09OQ0U7CiAgICAgICAgcHRyKys7CiAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgJ0MnOiAgICAgICAgICAgICAgICAgLyogQ2FsbG91dCAtIG1heSBiZSBmb2xsb3dlZCBieSBkaWdpdHM7ICovCiAgICAgICAgcHJldmlvdXNfY2FsbG91dCA9IGNvZGU7ICAvKiBTYXZlIGZvciBsYXRlciBjb21wbGV0aW9uICovCiAgICAgICAgYWZ0ZXJfbWFudWFsX2NhbGxvdXQgPSAxOyAvKiBTa2lwIG9uZSBpdGVtIGJlZm9yZSBjb21wbGV0aW5nICovCiAgICAgICAgKmNvZGUrKyA9IE9QX0NBTExPVVQ7ICAgICAvKiBBbHJlYWR5IGNoZWNrZWQgdGhhdCB0aGUgdGVybWluYXRpbmcgKi8KICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgIC8qIGNsb3NpbmcgcGFyZW50aGVzaXMgaXMgcHJlc2VudC4gKi8KICAgICAgICAgIGludCBuID0gMDsKICAgICAgICAgIHdoaWxlICgoZGlnaXRhYlsqKCsrcHRyKV0gJiBjdHlwZV9kaWdpdCkgIT0gMCkKICAgICAgICAgICAgbiA9IG4gKiAxMCArICpwdHIgLSAnMCc7CiAgICAgICAgICBpZiAobiA+IDI1NSkKICAgICAgICAgICAgewogICAgICAgICAgICAqZXJyb3JwdHIgPSBFUlIzODsKICAgICAgICAgICAgZ290byBGQUlMRUQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICpjb2RlKysgPSBuOwogICAgICAgICAgUFVUKGNvZGUsIDAsIHB0ciAtIGNkLT5zdGFydF9wYXR0ZXJuICsgMSk7ICAvKiBQYXR0ZXJuIG9mZnNldCAqLwogICAgICAgICAgUFVUKGNvZGUsIExJTktfU0laRSwgMCk7ICAgICAgICAgICAgICAgICAgICAvKiBEZWZhdWx0IGxlbmd0aCAqLwogICAgICAgICAgY29kZSArPSAyICogTElOS19TSVpFOwogICAgICAgICAgfQogICAgICAgIHByZXZpb3VzID0gTlVMTDsKICAgICAgICBjb250aW51ZTsKCiAgICAgICAgY2FzZSAnUCc6ICAgICAgICAgICAgICAgICAvKiBOYW1lZCBzdWJwYXR0ZXJuIGhhbmRsaW5nICovCiAgICAgICAgaWYgKCooKytwdHIpID09ICc8JykgICAgICAvKiBEZWZpbml0aW9uICovCiAgICAgICAgICB7CiAgICAgICAgICBpbnQgaSwgbmFtZWxlbjsKICAgICAgICAgIHVzY2hhciAqc2xvdCA9IGNkLT5uYW1lX3RhYmxlOwogICAgICAgICAgY29uc3QgdXNjaGFyICpuYW1lOyAgICAgLyogRG9uJ3QgYW1hbGdhbWF0ZTsgc29tZSBjb21waWxlcnMgKi8KICAgICAgICAgIG5hbWUgPSArK3B0cjsgICAgICAgICAgIC8qIGdydW1ibGUgYXQgYXV0b2luY3JlbWVudCBpbiBkZWNsYXJhdGlvbiAqLwoKICAgICAgICAgIHdoaWxlICgqcHRyKysgIT0gJz4nKTsKICAgICAgICAgIG5hbWVsZW4gPSBwdHIgLSBuYW1lIC0gMTsKCiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2QtPm5hbWVzX2ZvdW5kOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgaW50IGNyYyA9IG1lbWNtcChuYW1lLCBzbG90KzIsIG5hbWVsZW4pOwogICAgICAgICAgICBpZiAoY3JjID09IDApCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgIGlmIChzbG90WzIrbmFtZWxlbl0gPT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICplcnJvcnB0ciA9IEVSUjQzOwogICAgICAgICAgICAgICAgZ290byBGQUlMRUQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgY3JjID0gLTE7ICAgICAgICAgICAgIC8qIEN1cnJlbnQgbmFtZSBpcyBzdWJzdHJpbmcgKi8KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjcmMgPCAwKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICBtZW1tb3ZlKHNsb3QgKyBjZC0+bmFtZV9lbnRyeV9zaXplLCBzbG90LAogICAgICAgICAgICAgICAgKGNkLT5uYW1lc19mb3VuZCAtIGkpICogY2QtPm5hbWVfZW50cnlfc2l6ZSk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICBzbG90ICs9IGNkLT5uYW1lX2VudHJ5X3NpemU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICBQVVQyKHNsb3QsIDAsICpicmFja2V0cyArIDEpOwogICAgICAgICAgbWVtY3B5KHNsb3QgKyAyLCBuYW1lLCBuYW1lbGVuKTsKICAgICAgICAgIHNsb3RbMituYW1lbGVuXSA9IDA7CiAgICAgICAgICBjZC0+bmFtZXNfZm91bmQrKzsKICAgICAgICAgIGdvdG8gTlVNQkVSRURfR1JPVVA7CiAgICAgICAgICB9CgogICAgICAgIGlmICgqcHRyID09ICc9JyB8fCAqcHRyID09ICc+JykgIC8qIFJlZmVyZW5jZSBvciByZWN1cnNpb24gKi8KICAgICAgICAgIHsKICAgICAgICAgIGludCBpLCBuYW1lbGVuOwogICAgICAgICAgaW50IHR5cGUgPSAqcHRyKys7CiAgICAgICAgICBjb25zdCB1c2NoYXIgKm5hbWUgPSBwdHI7CiAgICAgICAgICB1c2NoYXIgKnNsb3QgPSBjZC0+bmFtZV90YWJsZTsKCiAgICAgICAgICB3aGlsZSAoKnB0ciAhPSAnKScpIHB0cisrOwogICAgICAgICAgbmFtZWxlbiA9IHB0ciAtIG5hbWU7CgogICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNkLT5uYW1lc19mb3VuZDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgIGlmIChzdHJuY21wKChjaGFyICopbmFtZSwgKGNoYXIgKilzbG90KzIsIG5hbWVsZW4pID09IDApIGJyZWFrOwogICAgICAgICAgICBzbG90ICs9IGNkLT5uYW1lX2VudHJ5X3NpemU7CiAgICAgICAgICAgIH0KICAgICAgICAgIGlmIChpID49IGNkLT5uYW1lc19mb3VuZCkKICAgICAgICAgICAgewogICAgICAgICAgICAqZXJyb3JwdHIgPSBFUlIxNTsKICAgICAgICAgICAgZ290byBGQUlMRUQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICByZWNubyA9IEdFVDIoc2xvdCwgMCk7CgogICAgICAgICAgaWYgKHR5cGUgPT0gJz4nKSBnb3RvIEhBTkRMRV9SRUNVUlNJT047ICAvKiBBIGZldyBsaW5lcyBiZWxvdyAqLwoKICAgICAgICAgIC8qIEJhY2sgcmVmZXJlbmNlICovCgogICAgICAgICAgcHJldmlvdXMgPSBjb2RlOwogICAgICAgICAgKmNvZGUrKyA9IE9QX1JFRjsKICAgICAgICAgIFBVVDJJTkMoY29kZSwgMCwgcmVjbm8pOwogICAgICAgICAgY2QtPmJhY2tyZWZfbWFwIHw9IChyZWNubyA8IDMyKT8gKDEgPDwgcmVjbm8pIDogMTsKICAgICAgICAgIGlmIChyZWNubyA+IGNkLT50b3BfYmFja3JlZikgY2QtPnRvcF9iYWNrcmVmID0gcmVjbm87CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KCiAgICAgICAgLyogU2hvdWxkIG5ldmVyIGhhcHBlbiAqLwogICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICdSJzogICAgICAgICAgICAgICAgIC8qIFBhdHRlcm4gcmVjdXJzaW9uICovCiAgICAgICAgcHRyKys7ICAgICAgICAgICAgICAgICAgICAvKiBTYW1lIGFzICg/MCkgICAgICAqLwogICAgICAgIC8qIEZhbGwgdGhyb3VnaCAqLwoKICAgICAgICAvKiBSZWN1cnNpb24gb3IgInN1YnJvdXRpbmUiIGNhbGwgKi8KCiAgICAgICAgY2FzZSAnMCc6IGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6IGNhc2UgJzQnOgogICAgICAgIGNhc2UgJzUnOiBjYXNlICc2JzogY2FzZSAnNyc6IGNhc2UgJzgnOiBjYXNlICc5JzoKICAgICAgICAgIHsKICAgICAgICAgIGNvbnN0IHVzY2hhciAqY2FsbGVkOwogICAgICAgICAgcmVjbm8gPSAwOwogICAgICAgICAgd2hpbGUoKGRpZ2l0YWJbKnB0cl0gJiBjdHlwZV9kaWdpdCkgIT0gMCkKICAgICAgICAgICAgcmVjbm8gPSByZWNubyAqIDEwICsgKnB0cisrIC0gJzAnOwoKICAgICAgICAgIC8qIENvbWUgaGVyZSBmcm9tIGNvZGUgYWJvdmUgdGhhdCBoYW5kbGVzIGEgbmFtZWQgcmVjdXJzaW9uICovCgogICAgICAgICAgSEFORExFX1JFQ1VSU0lPTjoKCiAgICAgICAgICBwcmV2aW91cyA9IGNvZGU7CgogICAgICAgICAgLyogRmluZCB0aGUgYnJhY2tldCB0aGF0IGlzIGJlaW5nIHJlZmVyZW5jZWQuIFRlbXBvcmFyaWx5IGVuZCB0aGUKICAgICAgICAgIHJlZ2V4IGluIGNhc2UgaXQgZG9lc24ndCBleGlzdC4gKi8KCiAgICAgICAgICAqY29kZSA9IE9QX0VORDsKICAgICAgICAgIGNhbGxlZCA9IChyZWNubyA9PSAwKT8KICAgICAgICAgICAgY2QtPnN0YXJ0X2NvZGUgOiBmaW5kX2JyYWNrZXQoY2QtPnN0YXJ0X2NvZGUsIHV0ZjgsIHJlY25vKTsKCiAgICAgICAgICBpZiAoY2FsbGVkID09IE5VTEwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgKmVycm9ycHRyID0gRVJSMTU7CiAgICAgICAgICAgIGdvdG8gRkFJTEVEOwogICAgICAgICAgICB9CgogICAgICAgICAgLyogSWYgdGhlIHN1YnBhdHRlcm4gaXMgc3RpbGwgb3BlbiwgdGhpcyBpcyBhIHJlY3Vyc2l2ZSBjYWxsLiBXZQogICAgICAgICAgY2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgYSBsZWZ0IHJlY3Vyc2lvbiB0aGF0IGNvdWxkIGxvb3AgZm9yIGV2ZXIsCiAgICAgICAgICBhbmQgZGlhZ25vc2UgdGhhdCBjYXNlLiAqLwoKICAgICAgICAgIGlmIChHRVQoY2FsbGVkLCAxKSA9PSAwICYmIGNvdWxkX2JlX2VtcHR5KGNhbGxlZCwgY29kZSwgYmNwdHIsIHV0ZjgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICplcnJvcnB0ciA9IEVSUjQwOwogICAgICAgICAgICBnb3RvIEZBSUxFRDsKICAgICAgICAgICAgfQoKICAgICAgICAgIC8qIEluc2VydCB0aGUgcmVjdXJzaW9uL3N1YnJvdXRpbmUgaXRlbSAqLwoKICAgICAgICAgICpjb2RlID0gT1BfUkVDVVJTRTsKICAgICAgICAgIFBVVChjb2RlLCAxLCBjYWxsZWQgLSBjZC0+c3RhcnRfY29kZSk7CiAgICAgICAgICBjb2RlICs9IDEgKyBMSU5LX1NJWkU7CiAgICAgICAgICB9CiAgICAgICAgY29udGludWU7CgogICAgICAgIC8qIENoYXJhY3RlciBhZnRlciAoPyBub3Qgc3BlY2lhbGx5IHJlY29nbml6ZWQgKi8KCiAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAvKiBPcHRpb24gc2V0dGluZyAqLwogICAgICAgIHNldCA9IHVuc2V0ID0gMDsKICAgICAgICBvcHRzZXQgPSAmc2V0OwoKICAgICAgICB3aGlsZSAoKnB0ciAhPSAnKScgJiYgKnB0ciAhPSAnOicpCiAgICAgICAgICB7CiAgICAgICAgICBzd2l0Y2ggKCpwdHIrKykKICAgICAgICAgICAgewogICAgICAgICAgICBjYXNlICctJzogb3B0c2V0ID0gJnVuc2V0OyBicmVhazsKCiAgICAgICAgICAgIGNhc2UgJ2knOiAqb3B0c2V0IHw9IFBDUkVfQ0FTRUxFU1M7IGJyZWFrOwogICAgICAgICAgICBjYXNlICdtJzogKm9wdHNldCB8PSBQQ1JFX01VTFRJTElORTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3MnOiAqb3B0c2V0IHw9IFBDUkVfRE9UQUxMOyBicmVhazsKICAgICAgICAgICAgY2FzZSAneCc6ICpvcHRzZXQgfD0gUENSRV9FWFRFTkRFRDsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ1UnOiAqb3B0c2V0IHw9IFBDUkVfVU5HUkVFRFk7IGJyZWFrOwogICAgICAgICAgICBjYXNlICdYJzogKm9wdHNldCB8PSBQQ1JFX0VYVFJBOyBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAvKiBTZXQgdXAgdGhlIGNoYW5nZWQgb3B0aW9uIGJpdHMsIGJ1dCBkb24ndCBjaGFuZ2UgYW55dGhpbmcgeWV0LiAqLwoKICAgICAgICBuZXdvcHRpb25zID0gKG9wdGlvbnMgfCBzZXQpICYgKH51bnNldCk7CgogICAgICAgIC8qIElmIHRoZSBvcHRpb25zIGVuZGVkIHdpdGggJyknIHRoaXMgaXMgbm90IHRoZSBzdGFydCBvZiBhIG5lc3RlZAogICAgICAgIGdyb3VwIHdpdGggb3B0aW9uIGNoYW5nZXMsIHNvIHRoZSBvcHRpb25zIGNoYW5nZSBhdCB0aGlzIGxldmVsLiBDb21waWxlCiAgICAgICAgY29kZSB0byBjaGFuZ2UgdGhlIGltcyBvcHRpb25zIGlmIHRoaXMgc2V0dGluZyBhY3R1YWxseSBjaGFuZ2VzIGFueSBvZgogICAgICAgIHRoZW0uIFdlIGFsc28gcGFzcyB0aGUgbmV3IHNldHRpbmcgYmFjayBzbyB0aGF0IGl0IGNhbiBiZSBwdXQgYXQgdGhlCiAgICAgICAgc3RhcnQgb2YgYW55IGZvbGxvd2luZyBicmFuY2hlcywgYW5kIHdoZW4gdGhpcyBncm91cCBlbmRzIChpZiB3ZSBhcmUgaW4KICAgICAgICBhIGdyb3VwKSwgYSByZXNldHRpbmcgaXRlbSBjYW4gYmUgY29tcGlsZWQuCgogICAgICAgIE5vdGUgdGhhdCBpZiB0aGlzIGl0ZW0gaXMgcmlnaHQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBwYXR0ZXJuLCB0aGUKICAgICAgICBvcHRpb25zIHdpbGwgaGF2ZSBiZWVuIGFic3RyYWN0ZWQgYW5kIG1hZGUgZ2xvYmFsLCBzbyB0aGVyZSB3aWxsIGJlIG5vCiAgICAgICAgY2hhbmdlIHRvIGNvbXBpbGUuICovCgogICAgICAgIGlmICgqcHRyID09ICcpJykKICAgICAgICAgIHsKICAgICAgICAgIGlmICgob3B0aW9ucyAmIFBDUkVfSU1TKSAhPSAobmV3b3B0aW9ucyAmIFBDUkVfSU1TKSkKICAgICAgICAgICAgewogICAgICAgICAgICAqY29kZSsrID0gT1BfT1BUOwogICAgICAgICAgICAqY29kZSsrID0gbmV3b3B0aW9ucyAmIFBDUkVfSU1TOwogICAgICAgICAgICB9CgogICAgICAgICAgLyogQ2hhbmdlIG9wdGlvbnMgYXQgdGhpcyBsZXZlbCwgYW5kIHBhc3MgdGhlbSBiYWNrIGZvciB1c2UKICAgICAgICAgIGluIHN1YnNlcXVlbnQgYnJhbmNoZXMuIFJlc2V0IHRoZSBncmVlZHkgZGVmYXVsdHMgYW5kIHRoZSBjYXNlCiAgICAgICAgICB2YWx1ZSBmb3IgZmlyc3RieXRlIGFuZCByZXFieXRlLiAqLwoKICAgICAgICAgICpvcHRpb25zcHRyID0gb3B0aW9ucyA9IG5ld29wdGlvbnM7CiAgICAgICAgICBncmVlZHlfZGVmYXVsdCA9ICgobmV3b3B0aW9ucyAmIFBDUkVfVU5HUkVFRFkpICE9IDApOwogICAgICAgICAgZ3JlZWR5X25vbl9kZWZhdWx0ID0gZ3JlZWR5X2RlZmF1bHQgXiAxOwogICAgICAgICAgcmVxX2Nhc2VvcHQgPSAoKG9wdGlvbnMgJiBQQ1JFX0NBU0VMRVNTKSAhPSAwKT8gUkVRX0NBU0VMRVNTIDogMDsKCiAgICAgICAgICBwcmV2aW91cyA9IE5VTEw7ICAgICAgIC8qIFRoaXMgaXRlbSBjYW4ndCBiZSByZXBlYXRlZCAqLwogICAgICAgICAgY29udGludWU7ICAgICAgICAgICAgICAvKiBJdCBpcyBjb21wbGV0ZSAqLwogICAgICAgICAgfQoKICAgICAgICAvKiBJZiB0aGUgb3B0aW9ucyBlbmRlZCB3aXRoICc6JyB3ZSBhcmUgaGVhZGluZyBpbnRvIGEgbmVzdGVkIGdyb3VwCiAgICAgICAgd2l0aCBwb3NzaWJsZSBjaGFuZ2Ugb2Ygb3B0aW9ucy4gU3VjaCBncm91cHMgYXJlIG5vbi1jYXB0dXJpbmcgYW5kIGFyZQogICAgICAgIG5vdCBhc3NlcnRpb25zIG9mIGFueSBraW5kLiBBbGwgd2UgbmVlZCB0byBkbyBpcyBza2lwIG92ZXIgdGhlICc6JzsKICAgICAgICB0aGUgbmV3b3B0aW9ucyB2YWx1ZSBpcyBoYW5kbGVkIGJlbG93LiAqLwoKICAgICAgICBicmF2YWx1ZSA9IE9QX0JSQTsKICAgICAgICBwdHIrKzsKICAgICAgICB9CiAgICAgIH0KCiAgICAvKiBJZiBQQ1JFX05PX0FVVE9fQ0FQVFVSRSBpcyBzZXQsIGFsbCB1bmFkb3JuZWQgYnJhY2tldHMgYmVjb21lCiAgICBub24tY2FwdHVyaW5nIGFuZCBiZWhhdmUgbGlrZSAoPzouLi4pIGJyYWNrZXRzICovCgogICAgZWxzZSBpZiAoKG9wdGlvbnMgJiBQQ1JFX05PX0FVVE9fQ0FQVFVSRSkgIT0gMCkKICAgICAgewogICAgICBicmF2YWx1ZSA9IE9QX0JSQTsKICAgICAgfQoKICAgIC8qIEVsc2Ugd2UgaGF2ZSBhIHJlZmVyZW5jaW5nIGdyb3VwOyBhZGp1c3QgdGhlIG9wY29kZS4gSWYgdGhlIGJyYWNrZXQKICAgIG51bWJlciBpcyBncmVhdGVyIHRoYW4gRVhUUkFDVF9CQVNJQ19NQVgsIHdlIHNldCB0aGUgb3Bjb2RlIG9uZSBoaWdoZXIsIGFuZAogICAgYXJyYW5nZSBmb3IgdGhlIHRydWUgbnVtYmVyIHRvIGZvbGxvdyBsYXRlciwgaW4gYW4gT1BfQlJBTlVNQkVSIGl0ZW0uICovCgogICAgZWxzZQogICAgICB7CiAgICAgIE5VTUJFUkVEX0dST1VQOgogICAgICBpZiAoKysoKmJyYWNrZXRzKSA+IEVYVFJBQ1RfQkFTSUNfTUFYKQogICAgICAgIHsKICAgICAgICBicmF2YWx1ZSA9IE9QX0JSQSArIEVYVFJBQ1RfQkFTSUNfTUFYICsgMTsKICAgICAgICBjb2RlWzErTElOS19TSVpFXSA9IE9QX0JSQU5VTUJFUjsKICAgICAgICBQVVQyKGNvZGUsIDIrTElOS19TSVpFLCAqYnJhY2tldHMpOwogICAgICAgIHNraXBieXRlcyA9IDM7CiAgICAgICAgfQogICAgICBlbHNlIGJyYXZhbHVlID0gT1BfQlJBICsgKmJyYWNrZXRzOwogICAgICB9CgogICAgLyogUHJvY2VzcyBuZXN0ZWQgYnJhY2tldGVkIHJlLiBBc3NlcnRpb25zIG1heSBub3QgYmUgcmVwZWF0ZWQsIGJ1dCBvdGhlcgogICAga2luZHMgY2FuIGJlLiBXZSBjb3B5IGNvZGUgaW50byBhIG5vbi1yZWdpc3RlciB2YXJpYWJsZSBpbiBvcmRlciB0byBiZSBhYmxlCiAgICB0byBwYXNzIGl0cyBhZGRyZXNzIGJlY2F1c2Ugc29tZSBjb21waWxlcnMgY29tcGxhaW4gb3RoZXJ3aXNlLiBQYXNzIGluIGEKICAgIG5ldyBzZXR0aW5nIGZvciB0aGUgaW1zIG9wdGlvbnMgaWYgdGhleSBoYXZlIGNoYW5nZWQuICovCgogICAgcHJldmlvdXMgPSAoYnJhdmFsdWUgPj0gT1BfT05DRSk/IGNvZGUgOiBOVUxMOwogICAgKmNvZGUgPSBicmF2YWx1ZTsKICAgIHRlbXBjb2RlID0gY29kZTsKICAgIHRlbXByZXF2YXJ5ID0gY2QtPnJlcV92YXJ5b3B0OyAgICAgLyogU2F2ZSB2YWx1ZSBiZWZvcmUgYnJhY2tldCAqLwoKICAgIGlmICghY29tcGlsZV9yZWdleCgKICAgICAgICAgbmV3b3B0aW9ucywgICAgICAgICAgICAgICAgICAgLyogVGhlIGNvbXBsZXRlIG5ldyBvcHRpb24gc3RhdGUgKi8KICAgICAgICAgb3B0aW9ucyAmIFBDUkVfSU1TLCAgICAgICAgICAgLyogVGhlIHByZXZpb3VzIGltcyBvcHRpb24gc3RhdGUgKi8KICAgICAgICAgYnJhY2tldHMsICAgICAgICAgICAgICAgICAgICAgLyogRXh0cmFjdGluZyBicmFja2V0IGNvdW50ICovCiAgICAgICAgICZ0ZW1wY29kZSwgICAgICAgICAgICAgICAgICAgIC8qIFdoZXJlIHRvIHB1dCBjb2RlICh1cGRhdGVkKSAqLwogICAgICAgICAmcHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbnB1dCBwb2ludGVyICh1cGRhdGVkKSAqLwogICAgICAgICBlcnJvcnB0ciwgICAgICAgICAgICAgICAgICAgICAvKiBXaGVyZSB0byBwdXQgYW4gZXJyb3IgbWVzc2FnZSAqLwogICAgICAgICAoYnJhdmFsdWUgPT0gT1BfQVNTRVJUQkFDSyB8fAogICAgICAgICAgYnJhdmFsdWUgPT0gT1BfQVNTRVJUQkFDS19OT1QpLCAvKiBUUlVFIGlmIGJhY2sgYXNzZXJ0ICovCiAgICAgICAgIHNraXBieXRlcywgICAgICAgICAgICAgICAgICAgIC8qIFNraXAgb3ZlciBPUF9DT05EL09QX0JSQU5VTUJFUiAqLwogICAgICAgICAmc3ViZmlyc3RieXRlLCAgICAgICAgICAgICAgICAvKiBGb3IgcG9zc2libGUgZmlyc3QgY2hhciAqLwogICAgICAgICAmc3VicmVxYnl0ZSwgICAgICAgICAgICAgICAgICAvKiBGb3IgcG9zc2libGUgbGFzdCBjaGFyICovCiAgICAgICAgIGJjcHRyLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIEN1cnJlbnQgYnJhbmNoIGNoYWluICovCiAgICAgICAgIGNkKSkgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRhYmxlcyBibG9jayAqLwogICAgICBnb3RvIEZBSUxFRDsKCiAgICAvKiBBdCB0aGUgZW5kIG9mIGNvbXBpbGluZywgY29kZSBpcyBzdGlsbCBwb2ludGluZyB0byB0aGUgc3RhcnQgb2YgdGhlCiAgICBncm91cCwgd2hpbGUgdGVtcGNvZGUgaGFzIGJlZW4gdXBkYXRlZCB0byBwb2ludCBwYXN0IHRoZSBlbmQgb2YgdGhlIGdyb3VwCiAgICBhbmQgYW55IG9wdGlvbiByZXNldHRpbmcgdGhhdCBtYXkgZm9sbG93IGl0LiBUaGUgcGF0dGVybiBwb2ludGVyIChwdHIpCiAgICBpcyBvbiB0aGUgYnJhY2tldC4gKi8KCiAgICAvKiBJZiB0aGlzIGlzIGEgY29uZGl0aW9uYWwgYnJhY2tldCwgY2hlY2sgdGhhdCB0aGVyZSBhcmUgbm8gbW9yZSB0aGFuCiAgICB0d28gYnJhbmNoZXMgaW4gdGhlIGdyb3VwLiAqLwoKICAgIGVsc2UgaWYgKGJyYXZhbHVlID09IE9QX0NPTkQpCiAgICAgIHsKICAgICAgdXNjaGFyICp0YyA9IGNvZGU7CiAgICAgIGNvbmRjb3VudCA9IDA7CgogICAgICBkbyB7CiAgICAgICAgIGNvbmRjb3VudCsrOwogICAgICAgICB0YyArPSBHRVQodGMsMSk7CiAgICAgICAgIH0KICAgICAgd2hpbGUgKCp0YyAhPSBPUF9LRVQpOwoKICAgICAgaWYgKGNvbmRjb3VudCA+IDIpCiAgICAgICAgewogICAgICAgICplcnJvcnB0ciA9IEVSUjI3OwogICAgICAgIGdvdG8gRkFJTEVEOwogICAgICAgIH0KCiAgICAgIC8qIElmIHRoZXJlIGlzIGp1c3Qgb25lIGJyYW5jaCwgd2UgbXVzdCBub3QgbWFrZSB1c2Ugb2YgaXRzIGZpcnN0Ynl0ZSBvcgogICAgICByZXFieXRlLCBiZWNhdXNlIHRoaXMgaXMgZXF1aXZhbGVudCB0byBhbiBlbXB0eSBzZWNvbmQgYnJhbmNoLiAqLwoKICAgICAgaWYgKGNvbmRjb3VudCA9PSAxKSBzdWJmaXJzdGJ5dGUgPSBzdWJyZXFieXRlID0gUkVRX05PTkU7CiAgICAgIH0KCiAgICAvKiBIYW5kbGUgdXBkYXRpbmcgb2YgdGhlIHJlcXVpcmVkIGFuZCBmaXJzdCBjaGFyYWN0ZXJzLiBVcGRhdGUgZm9yIG5vcm1hbAogICAgYnJhY2tldHMgb2YgYWxsIGtpbmRzLCBhbmQgY29uZGl0aW9ucyB3aXRoIHR3byBicmFuY2hlcyAoc2VlIGNvZGUgYWJvdmUpLgogICAgSWYgdGhlIGJyYWNrZXQgaXMgZm9sbG93ZWQgYnkgYSBxdWFudGlmaWVyIHdpdGggemVybyByZXBlYXQsIHdlIGhhdmUgdG8KICAgIGJhY2sgb2ZmLiBIZW5jZSB0aGUgZGVmaW5pdGlvbiBvZiB6ZXJvcmVxYnl0ZSBhbmQgemVyb2ZpcnN0Ynl0ZSBvdXRzaWRlIHRoZQogICAgbWFpbiBsb29wIHNvIHRoYXQgdGhleSBjYW4gYmUgYWNjZXNzZWQgZm9yIHRoZSBiYWNrIG9mZi4gKi8KCiAgICB6ZXJvcmVxYnl0ZSA9IHJlcWJ5dGU7CiAgICB6ZXJvZmlyc3RieXRlID0gZmlyc3RieXRlOwogICAgZ3JvdXBzZXRmaXJzdGJ5dGUgPSBGQUxTRTsKCiAgICBpZiAoYnJhdmFsdWUgPj0gT1BfQlJBIHx8IGJyYXZhbHVlID09IE9QX09OQ0UgfHwgYnJhdmFsdWUgPT0gT1BfQ09ORCkKICAgICAgewogICAgICAvKiBJZiB3ZSBoYXZlIG5vdCB5ZXQgc2V0IGEgZmlyc3RieXRlIGluIHRoaXMgYnJhbmNoLCB0YWtlIGl0IGZyb20gdGhlCiAgICAgIHN1YnBhdHRlcm4sIHJlbWVtYmVyaW5nIHRoYXQgaXQgd2FzIHNldCBoZXJlIHNvIHRoYXQgYSByZXBlYXQgb2YgbW9yZQogICAgICB0aGFuIG9uZSBjYW4gcmVwbGljYXRlIGl0IGFzIHJlcWJ5dGUgaWYgbmVjZXNzYXJ5LiBJZiB0aGUgc3VicGF0dGVybiBoYXMKICAgICAgbm8gZmlyc3RieXRlLCBzZXQgIm5vbmUiIGZvciB0aGUgd2hvbGUgYnJhbmNoLiBJbiBib3RoIGNhc2VzLCBhIHplcm8KICAgICAgcmVwZWF0IGZvcmNlcyBmaXJzdGJ5dGUgdG8gIm5vbmUiLiAqLwoKICAgICAgaWYgKGZpcnN0Ynl0ZSA9PSBSRVFfVU5TRVQpCiAgICAgICAgewogICAgICAgIGlmIChzdWJmaXJzdGJ5dGUgPj0gMCkKICAgICAgICAgIHsKICAgICAgICAgIGZpcnN0Ynl0ZSA9IHN1YmZpcnN0Ynl0ZTsKICAgICAgICAgIGdyb3Vwc2V0Zmlyc3RieXRlID0gVFJVRTsKICAgICAgICAgIH0KICAgICAgICBlbHNlIGZpcnN0Ynl0ZSA9IFJFUV9OT05FOwogICAgICAgIHplcm9maXJzdGJ5dGUgPSBSRVFfTk9ORTsKICAgICAgICB9CgogICAgICAvKiBJZiBmaXJzdGJ5dGUgd2FzIHByZXZpb3VzbHkgc2V0LCBjb252ZXJ0IHRoZSBzdWJwYXR0ZXJuJ3MgZmlyc3RieXRlCiAgICAgIGludG8gcmVxYnl0ZSBpZiB0aGVyZSB3YXNuJ3Qgb25lLCB1c2luZyB0aGUgdmFyeSBmbGFnIHRoYXQgd2FzIGluCiAgICAgIGV4aXN0ZW5jZSBiZWZvcmVoYW5kLiAqLwoKICAgICAgZWxzZSBpZiAoc3ViZmlyc3RieXRlID49IDAgJiYgc3VicmVxYnl0ZSA8IDApCiAgICAgICAgc3VicmVxYnl0ZSA9IHN1YmZpcnN0Ynl0ZSB8IHRlbXByZXF2YXJ5OwoKICAgICAgLyogSWYgdGhlIHN1YnBhdHRlcm4gc2V0IGEgcmVxdWlyZWQgYnl0ZSAob3Igc2V0IGEgZmlyc3QgYnl0ZSB0aGF0IGlzbid0CiAgICAgIHJlYWxseSB0aGUgZmlyc3QgYnl0ZSAtIHNlZSBhYm92ZSksIHNldCBpdC4gKi8KCiAgICAgIGlmIChzdWJyZXFieXRlID49IDApIHJlcWJ5dGUgPSBzdWJyZXFieXRlOwogICAgICB9CgogICAgLyogRm9yIGEgZm9yd2FyZCBhc3NlcnRpb24sIHdlIHRha2UgdGhlIHJlcWJ5dGUsIGlmIHNldC4gVGhpcyBjYW4gYmUKICAgIGhlbHBmdWwgaWYgdGhlIHBhdHRlcm4gdGhhdCBmb2xsb3dzIHRoZSBhc3NlcnRpb24gZG9lc24ndCBzZXQgYSBkaWZmZXJlbnQKICAgIGNoYXIuIEZvciBleGFtcGxlLCBpdCdzIHVzZWZ1bCBmb3IgLyg/PWFiY2RlKS4rLy4gV2UgY2FuJ3Qgc2V0IGZpcnN0Ynl0ZQogICAgZm9yIGFuIGFzc2VydGlvbiwgaG93ZXZlciBiZWNhdXNlIGl0IGxlYWRzIHRvIGluY29ycmVjdCBlZmZlY3QgZm9yIHBhdHRlcm5zCiAgICBzdWNoIGFzIC8oPz1hKWEuKy8gd2hlbiB0aGUgInJlYWwiICJhIiB3b3VsZCB0aGVuIGJlY29tZSBhIHJlcWJ5dGUgaW5zdGVhZAogICAgb2YgYSBmaXJzdGJ5dGUuIFRoaXMgaXMgb3ZlcmNvbWUgYnkgYSBzY2FuIGF0IHRoZSBlbmQgaWYgdGhlcmUncyBubwogICAgZmlyc3RieXRlLCBsb29raW5nIGZvciBhbiBhc3NlcnRlZCBmaXJzdCBjaGFyLiAqLwoKICAgIGVsc2UgaWYgKGJyYXZhbHVlID09IE9QX0FTU0VSVCAmJiBzdWJyZXFieXRlID49IDApIHJlcWJ5dGUgPSBzdWJyZXFieXRlOwoKICAgIC8qIE5vdyB1cGRhdGUgdGhlIG1haW4gY29kZSBwb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhlIGdyb3VwLiAqLwoKICAgIGNvZGUgPSB0ZW1wY29kZTsKCiAgICAvKiBFcnJvciBpZiBoaXQgZW5kIG9mIHBhdHRlcm4gKi8KCiAgICBpZiAoKnB0ciAhPSAnKScpCiAgICAgIHsKICAgICAgKmVycm9ycHRyID0gRVJSMTQ7CiAgICAgIGdvdG8gRkFJTEVEOwogICAgICB9CiAgICBicmVhazsKCiAgICAvKiBDaGVjayBcIGZvciBiZWluZyBhIHJlYWwgbWV0YWNoYXJhY3RlcjsgaWYgbm90LCBmYWxsIHRocm91Z2ggYW5kIGhhbmRsZQogICAgaXQgYXMgYSBkYXRhIGNoYXJhY3RlciBhdCB0aGUgc3RhcnQgb2YgYSBzdHJpbmcuIEVzY2FwZSBpdGVtcyBhcmUgY2hlY2tlZAogICAgZm9yIHZhbGlkaXR5IGluIHRoZSBwcmUtY29tcGlsaW5nIHBhc3MuICovCgogICAgY2FzZSAnXFwnOgogICAgdGVtcHB0ciA9IHB0cjsKICAgIGMgPSBjaGVja19lc2NhcGUoJnB0ciwgZXJyb3JwdHIsICpicmFja2V0cywgb3B0aW9ucywgRkFMU0UpOwoKICAgIC8qIEhhbmRsZSBtZXRhY2hhcmFjdGVycyBpbnRyb2R1Y2VkIGJ5IFwuIEZvciBvbmVzIGxpa2UgXGQsIHRoZSBFU0NfIHZhbHVlcwogICAgYXJlIGFycmFuZ2VkIHRvIGJlIHRoZSBuZWdhdGlvbiBvZiB0aGUgY29ycmVzcG9uZGluZyBPUF92YWx1ZXMuIEZvciB0aGUKICAgIGJhY2sgcmVmZXJlbmNlcywgdGhlIHZhbHVlcyBhcmUgRVNDX1JFRiBwbHVzIHRoZSByZWZlcmVuY2UgbnVtYmVyLiBPbmx5CiAgICBiYWNrIHJlZmVyZW5jZXMgYW5kIHRob3NlIHR5cGVzIHRoYXQgY29uc3VtZSBhIGNoYXJhY3RlciBtYXkgYmUgcmVwZWF0ZWQuCiAgICBXZSBjYW4gdGVzdCBmb3IgdmFsdWVzIGJldHdlZW4gRVNDX2IgYW5kIEVTQ19aIGZvciB0aGUgbGF0dGVyOyB0aGlzIG1heQogICAgaGF2ZSB0byBjaGFuZ2UgaWYgYW55IG5ldyBvbmVzIGFyZSBldmVyIGNyZWF0ZWQuICovCgogICAgaWYgKGMgPCAwKQogICAgICB7CiAgICAgIGlmICgtYyA9PSBFU0NfUSkgICAgICAgICAgICAvKiBIYW5kbGUgc3RhcnQgb2YgcXVvdGVkIHN0cmluZyAqLwogICAgICAgIHsKICAgICAgICBpZiAocHRyWzFdID09ICdcXCcgJiYgcHRyWzJdID09ICdFJykgcHRyICs9IDI7IC8qIGF2b2lkIGVtcHR5IHN0cmluZyAqLwogICAgICAgICAgZWxzZSBpbmVzY3EgPSBUUlVFOwogICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgIC8qIEZvciBtZXRhc2VxdWVuY2VzIHRoYXQgYWN0dWFsbHkgbWF0Y2ggYSBjaGFyYWN0ZXIsIHdlIGRpc2FibGUgdGhlCiAgICAgIHNldHRpbmcgb2YgYSBmaXJzdCBjaGFyYWN0ZXIgaWYgaXQgaGFzbid0IGFscmVhZHkgYmVlbiBzZXQuICovCgogICAgICBpZiAoZmlyc3RieXRlID09IFJFUV9VTlNFVCAmJiAtYyA+IEVTQ19iICYmIC1jIDwgRVNDX1opCiAgICAgICAgZmlyc3RieXRlID0gUkVRX05PTkU7CgogICAgICAvKiBTZXQgdmFsdWVzIHRvIHJlc2V0IHRvIGlmIHRoaXMgaXMgZm9sbG93ZWQgYnkgYSB6ZXJvIHJlcGVhdC4gKi8KCiAgICAgIHplcm9maXJzdGJ5dGUgPSBmaXJzdGJ5dGU7CiAgICAgIHplcm9yZXFieXRlID0gcmVxYnl0ZTsKCiAgICAgIC8qIEJhY2sgcmVmZXJlbmNlcyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgKi8KCiAgICAgIGlmICgtYyA+PSBFU0NfUkVGKQogICAgICAgIHsKICAgICAgICBpbnQgbnVtYmVyID0gLWMgLSBFU0NfUkVGOwogICAgICAgIHByZXZpb3VzID0gY29kZTsKICAgICAgICAqY29kZSsrID0gT1BfUkVGOwogICAgICAgIFBVVDJJTkMoY29kZSwgMCwgbnVtYmVyKTsKICAgICAgICB9CgogICAgICAvKiBTbyBhcmUgVW5pY29kZSBwcm9wZXJ0eSBtYXRjaGVzLCBpZiBzdXBwb3J0ZWQuIFdlIGtub3cgdGhhdCBnZXRfdWNwCiAgICAgIHdvbid0IGZhaWwgYmVjYXVzZSBpdCB3YXMgdGVzdGVkIGluIHRoZSBwcmUtcGFzcy4gKi8KCiNpZmRlZiBTVVBQT1JUX1VDUAogICAgICBlbHNlIGlmICgtYyA9PSBFU0NfUCB8fCAtYyA9PSBFU0NfcCkKICAgICAgICB7CiAgICAgICAgQk9PTCBuZWdhdGVkOwogICAgICAgIGludCB2YWx1ZSA9IGdldF91Y3AoJnB0ciwgJm5lZ2F0ZWQsIGVycm9ycHRyKTsKICAgICAgICBwcmV2aW91cyA9IGNvZGU7CiAgICAgICAgKmNvZGUrKyA9ICgoLWMgPT0gRVNDX3ApICE9IG5lZ2F0ZWQpPyBPUF9QUk9QIDogT1BfTk9UUFJPUDsKICAgICAgICAqY29kZSsrID0gdmFsdWU7CiAgICAgICAgfQojZW5kaWYKCiAgICAgIC8qIEZvciB0aGUgcmVzdCwgd2UgY2FuIG9idGFpbiB0aGUgT1AgdmFsdWUgYnkgbmVnYXRpbmcgdGhlIGVzY2FwZQogICAgICB2YWx1ZSAqLwoKICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICBwcmV2aW91cyA9ICgtYyA+IEVTQ19iICYmIC1jIDwgRVNDX1opPyBjb2RlIDogTlVMTDsKICAgICAgICAqY29kZSsrID0gLWM7CiAgICAgICAgfQogICAgICBjb250aW51ZTsKICAgICAgfQoKICAgIC8qIFdlIGhhdmUgYSBkYXRhIGNoYXJhY3RlciB3aG9zZSB2YWx1ZSBpcyBpbiBjLiBJbiBVVEYtOCBtb2RlIGl0IG1heSBoYXZlCiAgICBhIHZhbHVlID4gMTI3LiBXZSBzZXQgaXRzIHJlcHJlc2VudGF0aW9uIGluIHRoZSBsZW5ndGgvYnVmZmVyLCBhbmQgdGhlbgogICAgaGFuZGxlIGl0IGFzIGEgZGF0YSBjaGFyYWN0ZXIuICovCgojaWZkZWYgU1VQUE9SVF9VVEY4CiAgICBpZiAodXRmOCAmJiBjID4gMTI3KQogICAgICBtY2xlbmd0aCA9IG9yZDJ1dGY4KGMsIG1jYnVmZmVyKTsKICAgIGVsc2UKI2VuZGlmCgogICAgIHsKICAgICBtY2J1ZmZlclswXSA9IGM7CiAgICAgbWNsZW5ndGggPSAxOwogICAgIH0KCiAgICBnb3RvIE9ORV9DSEFSOwoKICAgIC8qIEhhbmRsZSBhIGxpdGVyYWwgY2hhcmFjdGVyLiBJdCBpcyBndWFyYW50ZWVkIG5vdCB0byBiZSB3aGl0ZXNwYWNlIG9yICMKICAgIHdoZW4gdGhlIGV4dGVuZGVkIGZsYWcgaXMgc2V0LiBJZiB3ZSBhcmUgaW4gVVRGLTggbW9kZSwgaXQgbWF5IGJlIGEKICAgIG11bHRpLWJ5dGUgbGl0ZXJhbCBjaGFyYWN0ZXIuICovCgogICAgZGVmYXVsdDoKICAgIE5PUk1BTF9DSEFSOgogICAgbWNsZW5ndGggPSAxOwogICAgbWNidWZmZXJbMF0gPSBjOwoKI2lmZGVmIFNVUFBPUlRfVVRGOAogICAgaWYgKHV0ZjggJiYgKGMgJiAweGMwKSA9PSAweGMwKQogICAgICB7CiAgICAgIHdoaWxlICgocHRyWzFdICYgMHhjMCkgPT0gMHg4MCkKICAgICAgICBtY2J1ZmZlclttY2xlbmd0aCsrXSA9ICooKytwdHIpOwogICAgICB9CiNlbmRpZgoKICAgIC8qIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSB0aGUgY2hhcmFjdGVyJ3MgYnl0ZXMgaW4gbWNidWZmZXIsIGFuZCB0aGUgbGVuZ3RoCiAgICBpbiBtY2xlbmd0aC4gV2hlbiBub3QgaW4gVVRGLTggbW9kZSwgdGhlIGxlbmd0aCBpcyBhbHdheXMgMS4gKi8KCiAgICBPTkVfQ0hBUjoKICAgIHByZXZpb3VzID0gY29kZTsKICAgICpjb2RlKysgPSAoKG9wdGlvbnMgJiBQQ1JFX0NBU0VMRVNTKSAhPSAwKT8gT1BfQ0hBUk5DIDogT1BfQ0hBUjsKICAgIGZvciAoYyA9IDA7IGMgPCBtY2xlbmd0aDsgYysrKSAqY29kZSsrID0gbWNidWZmZXJbY107CgogICAgLyogU2V0IHRoZSBmaXJzdCBhbmQgcmVxdWlyZWQgYnl0ZXMgYXBwcm9wcmlhdGVseS4gSWYgbm8gcHJldmlvdXMgZmlyc3QKICAgIGJ5dGUsIHNldCBpdCBmcm9tIHRoaXMgY2hhcmFjdGVyLCBidXQgcmV2ZXJ0IHRvIG5vbmUgb24gYSB6ZXJvIHJlcGVhdC4KICAgIE90aGVyd2lzZSwgbGVhdmUgdGhlIGZpcnN0Ynl0ZSB2YWx1ZSBhbG9uZSwgYW5kIGRvbid0IGNoYW5nZSBpdCBvbiBhIHplcm8KICAgIHJlcGVhdC4gKi8KCiAgICBpZiAoZmlyc3RieXRlID09IFJFUV9VTlNFVCkKICAgICAgewogICAgICB6ZXJvZmlyc3RieXRlID0gUkVRX05PTkU7CiAgICAgIHplcm9yZXFieXRlID0gcmVxYnl0ZTsKCiAgICAgIC8qIElmIHRoZSBjaGFyYWN0ZXIgaXMgbW9yZSB0aGFuIG9uZSBieXRlIGxvbmcsIHdlIGNhbiBzZXQgZmlyc3RieXRlCiAgICAgIG9ubHkgaWYgaXQgaXMgbm90IHRvIGJlIG1hdGNoZWQgY2FzZWxlc3NseS4gKi8KCiAgICAgIGlmIChtY2xlbmd0aCA9PSAxIHx8IHJlcV9jYXNlb3B0ID09IDApCiAgICAgICAgewogICAgICAgIGZpcnN0Ynl0ZSA9IG1jYnVmZmVyWzBdIHwgcmVxX2Nhc2VvcHQ7CiAgICAgICAgaWYgKG1jbGVuZ3RoICE9IDEpIHJlcWJ5dGUgPSBjb2RlWy0xXSB8IGNkLT5yZXFfdmFyeW9wdDsKICAgICAgICB9CiAgICAgIGVsc2UgZmlyc3RieXRlID0gcmVxYnl0ZSA9IFJFUV9OT05FOwogICAgICB9CgogICAgLyogZmlyc3RieXRlIHdhcyBwcmV2aW91c2x5IHNldDsgd2UgY2FuIHNldCByZXFieXRlIG9ubHkgdGhlIGxlbmd0aCBpcwogICAgMSBvciB0aGUgbWF0Y2hpbmcgaXMgY2FzZWZ1bC4gKi8KCiAgICBlbHNlCiAgICAgIHsKICAgICAgemVyb2ZpcnN0Ynl0ZSA9IGZpcnN0Ynl0ZTsKICAgICAgemVyb3JlcWJ5dGUgPSByZXFieXRlOwogICAgICBpZiAobWNsZW5ndGggPT0gMSB8fCByZXFfY2FzZW9wdCA9PSAwKQogICAgICAgIHJlcWJ5dGUgPSBjb2RlWy0xXSB8IHJlcV9jYXNlb3B0IHwgY2QtPnJlcV92YXJ5b3B0OwogICAgICB9CgogICAgYnJlYWs7ICAgICAgICAgICAgLyogRW5kIG9mIGxpdGVyYWwgY2hhcmFjdGVyIGhhbmRsaW5nICovCiAgICB9CiAgfSAgICAgICAgICAgICAgICAgICAvKiBlbmQgb2YgYmlnIGxvb3AgKi8KCi8qIENvbnRyb2wgbmV2ZXIgcmVhY2hlcyBoZXJlIGJ5IGZhbGxpbmcgdGhyb3VnaCwgb25seSBieSBhIGdvdG8gZm9yIGFsbCB0aGUKZXJyb3Igc3RhdGVzLiBQYXNzIGJhY2sgdGhlIHBvc2l0aW9uIGluIHRoZSBwYXR0ZXJuIHNvIHRoYXQgaXQgY2FuIGJlIGRpc3BsYXllZAp0byB0aGUgdXNlciBmb3IgZGlhZ25vc2luZyB0aGUgZXJyb3IuICovCgpGQUlMRUQ6CipwdHJwdHIgPSBwdHI7CnJldHVybiBGQUxTRTsKfQoKCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiAgICAgQ29tcGlsZSBzZXF1ZW5jZSBvZiBhbHRlcm5hdGl2ZXMgICAgICAgICAgICoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qIE9uIGVudHJ5LCBwdHIgaXMgcG9pbnRpbmcgcGFzdCB0aGUgYnJhY2tldCBjaGFyYWN0ZXIsIGJ1dCBvbiByZXR1cm4KaXQgcG9pbnRzIHRvIHRoZSBjbG9zaW5nIGJyYWNrZXQsIG9yIHZlcnRpY2FsIGJhciwgb3IgZW5kIG9mIHN0cmluZy4KVGhlIGNvZGUgdmFyaWFibGUgaXMgcG9pbnRpbmcgYXQgdGhlIGJ5dGUgaW50byB3aGljaCB0aGUgQlJBIG9wZXJhdG9yIGhhcyBiZWVuCnN0b3JlZC4gSWYgdGhlIGltcyBvcHRpb25zIGFyZSBjaGFuZ2VkIGF0IHRoZSBzdGFydCAoZm9yIGEgKD9pbXM6IGdyb3VwKSBvcgpkdXJpbmcgYW55IGJyYW5jaCwgd2UgbmVlZCB0byBpbnNlcnQgYW4gT1BfT1BUIGl0ZW0gYXQgdGhlIHN0YXJ0IG9mIGV2ZXJ5CmZvbGxvd2luZyBicmFuY2ggdG8gZW5zdXJlIHRoZXkgZ2V0IHNldCBjb3JyZWN0bHkgYXQgcnVuIHRpbWUsIGFuZCBhbHNvIHBhc3MKdGhlIG5ldyBvcHRpb25zIGludG8gZXZlcnkgc3Vic2VxdWVudCBicmFuY2ggY29tcGlsZS4KCkFyZ3VtZW50OgogIG9wdGlvbnMgICAgICAgIG9wdGlvbiBiaXRzLCBpbmNsdWRpbmcgYW55IGNoYW5nZXMgZm9yIHRoaXMgc3VicGF0dGVybgogIG9sZGltcyAgICAgICAgIHByZXZpb3VzIHNldHRpbmdzIG9mIGltcyBvcHRpb24gYml0cwogIGJyYWNrZXRzICAgICAgIC0+IGludCBjb250YWluaW5nIHRoZSBudW1iZXIgb2YgZXh0cmFjdGluZyBicmFja2V0cyB1c2VkCiAgY29kZXB0ciAgICAgICAgLT4gdGhlIGFkZHJlc3Mgb2YgdGhlIGN1cnJlbnQgY29kZSBwb2ludGVyCiAgcHRycHRyICAgICAgICAgLT4gdGhlIGFkZHJlc3Mgb2YgdGhlIGN1cnJlbnQgcGF0dGVybiBwb2ludGVyCiAgZXJyb3JwdHIgICAgICAgLT4gcG9pbnRlciB0byBlcnJvciBtZXNzYWdlCiAgbG9va2JlaGluZCAgICAgVFJVRSBpZiB0aGlzIGlzIGEgbG9va2JlaGluZCBhc3NlcnRpb24KICBza2lwYnl0ZXMgICAgICBza2lwIHRoaXMgbWFueSBieXRlcyBhdCBzdGFydCAoZm9yIE9QX0NPTkQsIE9QX0JSQU5VTUJFUikKICBmaXJzdGJ5dGVwdHIgICBwbGFjZSB0byBwdXQgdGhlIGZpcnN0IHJlcXVpcmVkIGNoYXJhY3Rlciwgb3IgYSBuZWdhdGl2ZSBudW1iZXIKICByZXFieXRlcHRyICAgICBwbGFjZSB0byBwdXQgdGhlIGxhc3QgcmVxdWlyZWQgY2hhcmFjdGVyLCBvciBhIG5lZ2F0aXZlIG51bWJlcgogIGJjcHRyICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNoYWluIG9mIGN1cnJlbnRseSBvcGVuIGJyYW5jaGVzCiAgY2QgICAgICAgICAgICAgcG9pbnRzIHRvIHRoZSBkYXRhIGJsb2NrIHdpdGggdGFibGVzIHBvaW50ZXJzIGV0Yy4KClJldHVybnM6ICAgICAgVFJVRSBvbiBzdWNjZXNzCiovCgpzdGF0aWMgQk9PTApjb21waWxlX3JlZ2V4KGludCBvcHRpb25zLCBpbnQgb2xkaW1zLCBpbnQgKmJyYWNrZXRzLCB1c2NoYXIgKipjb2RlcHRyLAogIGNvbnN0IHVzY2hhciAqKnB0cnB0ciwgY29uc3QgY2hhciAqKmVycm9ycHRyLCBCT09MIGxvb2tiZWhpbmQsIGludCBza2lwYnl0ZXMsCiAgaW50ICpmaXJzdGJ5dGVwdHIsIGludCAqcmVxYnl0ZXB0ciwgYnJhbmNoX2NoYWluICpiY3B0ciwgY29tcGlsZV9kYXRhICpjZCkKewpjb25zdCB1c2NoYXIgKnB0ciA9ICpwdHJwdHI7CnVzY2hhciAqY29kZSA9ICpjb2RlcHRyOwp1c2NoYXIgKmxhc3RfYnJhbmNoID0gY29kZTsKdXNjaGFyICpzdGFydF9icmFja2V0ID0gY29kZTsKdXNjaGFyICpyZXZlcnNlX2NvdW50ID0gTlVMTDsKaW50IGZpcnN0Ynl0ZSwgcmVxYnl0ZTsKaW50IGJyYW5jaGZpcnN0Ynl0ZSwgYnJhbmNocmVxYnl0ZTsKYnJhbmNoX2NoYWluIGJjOwoKYmMub3V0ZXIgPSBiY3B0cjsKYmMuY3VycmVudCA9IGNvZGU7CgpmaXJzdGJ5dGUgPSByZXFieXRlID0gUkVRX1VOU0VUOwoKLyogT2Zmc2V0IGlzIHNldCB6ZXJvIHRvIG1hcmsgdGhhdCB0aGlzIGJyYWNrZXQgaXMgc3RpbGwgb3BlbiAqLwoKUFVUKGNvZGUsIDEsIDApOwpjb2RlICs9IDEgKyBMSU5LX1NJWkUgKyBza2lwYnl0ZXM7CgovKiBMb29wIGZvciBlYWNoIGFsdGVybmF0aXZlIGJyYW5jaCAqLwoKZm9yICg7OykKICB7CiAgLyogSGFuZGxlIGEgY2hhbmdlIG9mIGltcyBvcHRpb25zIGF0IHRoZSBzdGFydCBvZiB0aGUgYnJhbmNoICovCgogIGlmICgob3B0aW9ucyAmIFBDUkVfSU1TKSAhPSBvbGRpbXMpCiAgICB7CiAgICAqY29kZSsrID0gT1BfT1BUOwogICAgKmNvZGUrKyA9IG9wdGlvbnMgJiBQQ1JFX0lNUzsKICAgIH0KCiAgLyogU2V0IHVwIGR1bW15IE9QX1JFVkVSU0UgaWYgbG9va2JlaGluZCBhc3NlcnRpb24gKi8KCiAgaWYgKGxvb2tiZWhpbmQpCiAgICB7CiAgICAqY29kZSsrID0gT1BfUkVWRVJTRTsKICAgIHJldmVyc2VfY291bnQgPSBjb2RlOwogICAgUFVUSU5DKGNvZGUsIDAsIDApOwogICAgfQoKICAvKiBOb3cgY29tcGlsZSB0aGUgYnJhbmNoICovCgogIGlmICghY29tcGlsZV9icmFuY2goJm9wdGlvbnMsIGJyYWNrZXRzLCAmY29kZSwgJnB0ciwgZXJyb3JwdHIsCiAgICAgICAgJmJyYW5jaGZpcnN0Ynl0ZSwgJmJyYW5jaHJlcWJ5dGUsICZiYywgY2QpKQogICAgewogICAgKnB0cnB0ciA9IHB0cjsKICAgIHJldHVybiBGQUxTRTsKICAgIH0KCiAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3QgYnJhbmNoLCB0aGUgZmlyc3RieXRlIGFuZCByZXFieXRlIHZhbHVlcyBmb3IgdGhlCiAgYnJhbmNoIGJlY29tZSB0aGUgdmFsdWVzIGZvciB0aGUgcmVnZXguICovCgogIGlmICgqbGFzdF9icmFuY2ggIT0gT1BfQUxUKQogICAgewogICAgZmlyc3RieXRlID0gYnJhbmNoZmlyc3RieXRlOwogICAgcmVxYnl0ZSA9IGJyYW5jaHJlcWJ5dGU7CiAgICB9CgogIC8qIElmIHRoaXMgaXMgbm90IHRoZSBmaXJzdCBicmFuY2gsIHRoZSBmaXJzdCBjaGFyIGFuZCByZXFieXRlIGhhdmUgdG8KICBtYXRjaCB0aGUgdmFsdWVzIGZyb20gYWxsIHRoZSBwcmV2aW91cyBicmFuY2hlcywgZXhjZXB0IHRoYXQgaWYgdGhlIHByZXZpb3VzCiAgdmFsdWUgZm9yIHJlcWJ5dGUgZGlkbid0IGhhdmUgUkVRX1ZBUlkgc2V0LCBpdCBjYW4gc3RpbGwgbWF0Y2gsIGFuZCB3ZSBzZXQKICBSRVFfVkFSWSBmb3IgdGhlIHJlZ2V4LiAqLwoKICBlbHNlCiAgICB7CiAgICAvKiBJZiB3ZSBwcmV2aW91c2x5IGhhZCBhIGZpcnN0Ynl0ZSwgYnV0IGl0IGRvZXNuJ3QgbWF0Y2ggdGhlIG5ldyBicmFuY2gsCiAgICB3ZSBoYXZlIHRvIGFiYW5kb24gdGhlIGZpcnN0Ynl0ZSBmb3IgdGhlIHJlZ2V4LCBidXQgaWYgdGhlcmUgd2FzIHByZXZpb3VzbHkKICAgIG5vIHJlcWJ5dGUsIGl0IHRha2VzIG9uIHRoZSB2YWx1ZSBvZiB0aGUgb2xkIGZpcnN0Ynl0ZS4gKi8KCiAgICBpZiAoZmlyc3RieXRlID49IDAgJiYgZmlyc3RieXRlICE9IGJyYW5jaGZpcnN0Ynl0ZSkKICAgICAgewogICAgICBpZiAocmVxYnl0ZSA8IDApIHJlcWJ5dGUgPSBmaXJzdGJ5dGU7CiAgICAgIGZpcnN0Ynl0ZSA9IFJFUV9OT05FOwogICAgICB9CgogICAgLyogSWYgd2UgKG5vdyBvciBmcm9tIGJlZm9yZSkgaGF2ZSBubyBmaXJzdGJ5dGUsIGEgZmlyc3RieXRlIGZyb20gdGhlCiAgICBicmFuY2ggYmVjb21lcyBhIHJlcWJ5dGUgaWYgdGhlcmUgaXNuJ3QgYSBicmFuY2ggcmVxYnl0ZS4gKi8KCiAgICBpZiAoZmlyc3RieXRlIDwgMCAmJiBicmFuY2hmaXJzdGJ5dGUgPj0gMCAmJiBicmFuY2hyZXFieXRlIDwgMCkKICAgICAgICBicmFuY2hyZXFieXRlID0gYnJhbmNoZmlyc3RieXRlOwoKICAgIC8qIE5vdyBlbnN1cmUgdGhhdCB0aGUgcmVxYnl0ZXMgbWF0Y2ggKi8KCiAgICBpZiAoKHJlcWJ5dGUgJiB+UkVRX1ZBUlkpICE9IChicmFuY2hyZXFieXRlICYgflJFUV9WQVJZKSkKICAgICAgcmVxYnl0ZSA9IFJFUV9OT05FOwogICAgZWxzZSByZXFieXRlIHw9IGJyYW5jaHJlcWJ5dGU7ICAgLyogVG8gIm9yIiBSRVFfVkFSWSAqLwogICAgfQoKICAvKiBJZiBsb29rYmVoaW5kLCBjaGVjayB0aGF0IHRoaXMgYnJhbmNoIG1hdGNoZXMgYSBmaXhlZC1sZW5ndGggc3RyaW5nLAogIGFuZCBwdXQgdGhlIGxlbmd0aCBpbnRvIHRoZSBPUF9SRVZFUlNFIGl0ZW0uIFRlbXBvcmFyaWx5IG1hcmsgdGhlIGVuZCBvZgogIHRoZSBicmFuY2ggd2l0aCBPUF9FTkQuICovCgogIGlmIChsb29rYmVoaW5kKQogICAgewogICAgaW50IGxlbmd0aDsKICAgICpjb2RlID0gT1BfRU5EOwogICAgbGVuZ3RoID0gZmluZF9maXhlZGxlbmd0aChsYXN0X2JyYW5jaCwgb3B0aW9ucyk7CiAgICBEUFJJTlRGKCgiZml4ZWQgbGVuZ3RoID0gJWRcbiIsIGxlbmd0aCkpOwogICAgaWYgKGxlbmd0aCA8IDApCiAgICAgIHsKICAgICAgKmVycm9ycHRyID0gKGxlbmd0aCA9PSAtMik/IEVSUjM2IDogRVJSMjU7CiAgICAgICpwdHJwdHIgPSBwdHI7CiAgICAgIHJldHVybiBGQUxTRTsKICAgICAgfQogICAgUFVUKHJldmVyc2VfY291bnQsIDAsIGxlbmd0aCk7CiAgICB9CgogIC8qIFJlYWNoZWQgZW5kIG9mIGV4cHJlc3Npb24sIGVpdGhlciAnKScgb3IgZW5kIG9mIHBhdHRlcm4uIEdvIGJhY2sgdGhyb3VnaAogIHRoZSBhbHRlcm5hdGl2ZSBicmFuY2hlcyBhbmQgcmV2ZXJzZSB0aGUgY2hhaW4gb2Ygb2Zmc2V0cywgd2l0aCB0aGUgZmllbGQgaW4KICB0aGUgQlJBIGl0ZW0gbm93IGJlY29taW5nIGFuIG9mZnNldCB0byB0aGUgZmlyc3QgYWx0ZXJuYXRpdmUuIElmIHRoZXJlIGFyZQogIG5vIGFsdGVybmF0aXZlcywgaXQgcG9pbnRzIHRvIHRoZSBlbmQgb2YgdGhlIGdyb3VwLiBUaGUgbGVuZ3RoIGluIHRoZQogIHRlcm1pbmF0aW5nIGtldCBpcyBhbHdheXMgdGhlIGxlbmd0aCBvZiB0aGUgd2hvbGUgYnJhY2tldGVkIGl0ZW0uIElmIGFueSBvZgogIHRoZSBpbXMgb3B0aW9ucyB3ZXJlIGNoYW5nZWQgaW5zaWRlIHRoZSBncm91cCwgY29tcGlsZSBhIHJlc2V0dGluZyBvcC1jb2RlCiAgZm9sbG93aW5nLCBleGNlcHQgYXQgdGhlIHZlcnkgZW5kIG9mIHRoZSBwYXR0ZXJuLiBSZXR1cm4gbGVhdmluZyB0aGUgcG9pbnRlcgogIGF0IHRoZSB0ZXJtaW5hdGluZyBjaGFyLiAqLwoKICBpZiAoKnB0ciAhPSAnfCcpCiAgICB7CiAgICBpbnQgbGVuZ3RoID0gY29kZSAtIGxhc3RfYnJhbmNoOwogICAgZG8KICAgICAgewogICAgICBpbnQgcHJldl9sZW5ndGggPSBHRVQobGFzdF9icmFuY2gsIDEpOwogICAgICBQVVQobGFzdF9icmFuY2gsIDEsIGxlbmd0aCk7CiAgICAgIGxlbmd0aCA9IHByZXZfbGVuZ3RoOwogICAgICBsYXN0X2JyYW5jaCAtPSBsZW5ndGg7CiAgICAgIH0KICAgIHdoaWxlIChsZW5ndGggPiAwKTsKCiAgICAvKiBGaWxsIGluIHRoZSBrZXQgKi8KCiAgICAqY29kZSA9IE9QX0tFVDsKICAgIFBVVChjb2RlLCAxLCBjb2RlIC0gc3RhcnRfYnJhY2tldCk7CiAgICBjb2RlICs9IDEgKyBMSU5LX1NJWkU7CgogICAgLyogUmVzZXR0aW5nIG9wdGlvbiBpZiBuZWVkZWQgKi8KCiAgICBpZiAoKG9wdGlvbnMgJiBQQ1JFX0lNUykgIT0gb2xkaW1zICYmICpwdHIgPT0gJyknKQogICAgICB7CiAgICAgICpjb2RlKysgPSBPUF9PUFQ7CiAgICAgICpjb2RlKysgPSBvbGRpbXM7CiAgICAgIH0KCiAgICAvKiBTZXQgdmFsdWVzIHRvIHBhc3MgYmFjayAqLwoKICAgICpjb2RlcHRyID0gY29kZTsKICAgICpwdHJwdHIgPSBwdHI7CiAgICAqZmlyc3RieXRlcHRyID0gZmlyc3RieXRlOwogICAgKnJlcWJ5dGVwdHIgPSByZXFieXRlOwogICAgcmV0dXJuIFRSVUU7CiAgICB9CgogIC8qIEFub3RoZXIgYnJhbmNoIGZvbGxvd3M7IGluc2VydCBhbiAib3IiIG5vZGUuIEl0cyBsZW5ndGggZmllbGQgcG9pbnRzIGJhY2sKICB0byB0aGUgcHJldmlvdXMgYnJhbmNoIHdoaWxlIHRoZSBicmFja2V0IHJlbWFpbnMgb3Blbi4gQXQgdGhlIGVuZCB0aGUgY2hhaW4KICBpcyByZXZlcnNlZC4gSXQncyBkb25lIGxpa2UgdGhpcyBzbyB0aGF0IHRoZSBzdGFydCBvZiB0aGUgYnJhY2tldCBoYXMgYQogIHplcm8gb2Zmc2V0IHVudGlsIGl0IGlzIGNsb3NlZCwgbWFraW5nIGl0IHBvc3NpYmxlIHRvIGRldGVjdCByZWN1cnNpb24uICovCgogICpjb2RlID0gT1BfQUxUOwogIFBVVChjb2RlLCAxLCBjb2RlIC0gbGFzdF9icmFuY2gpOwogIGJjLmN1cnJlbnQgPSBsYXN0X2JyYW5jaCA9IGNvZGU7CiAgY29kZSArPSAxICsgTElOS19TSVpFOwogIHB0cisrOwogIH0KLyogQ29udHJvbCBuZXZlciByZWFjaGVzIGhlcmUgKi8KfQoKCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiAgICAgICAgICBDaGVjayBmb3IgYW5jaG9yZWQgZXhwcmVzc2lvbiAgICAgICAgICoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qIFRyeSB0byBmaW5kIG91dCBpZiB0aGlzIGlzIGFuIGFuY2hvcmVkIHJlZ3VsYXIgZXhwcmVzc2lvbi4gQ29uc2lkZXIgZWFjaAphbHRlcm5hdGl2ZSBicmFuY2guIElmIHRoZXkgYWxsIHN0YXJ0IHdpdGggT1BfU09EIG9yIE9QX0NJUkMsIG9yIHdpdGggYSBicmFja2V0CmFsbCBvZiB3aG9zZSBhbHRlcm5hdGl2ZXMgc3RhcnQgd2l0aCBPUF9TT0Qgb3IgT1BfQ0lSQyAocmVjdXJzZSBhZCBsaWIpLCB0aGVuCml0J3MgYW5jaG9yZWQuIEhvd2V2ZXIsIGlmIHRoaXMgaXMgYSBtdWx0aWxpbmUgcGF0dGVybiwgdGhlbiBvbmx5IE9QX1NPRApjb3VudHMsIHNpbmNlIE9QX0NJUkMgY2FuIG1hdGNoIGluIHRoZSBtaWRkbGUuCgpXZSBjYW4gYWxzbyBjb25zaWRlciBhIHJlZ2V4IHRvIGJlIGFuY2hvcmVkIGlmIE9QX1NPTSBzdGFydHMgYWxsIGl0cyBicmFuY2hlcy4KVGhpcyBpcyB0aGUgY29kZSBmb3IgXEcsIHdoaWNoIG1lYW5zICJtYXRjaCBhdCBzdGFydCBvZiBtYXRjaCBwb3NpdGlvbiwgdGFraW5nCmludG8gYWNjb3VudCB0aGUgbWF0Y2ggb2Zmc2V0Ii4KCkEgYnJhbmNoIGlzIGFsc28gaW1wbGljaXRseSBhbmNob3JlZCBpZiBpdCBzdGFydHMgd2l0aCAuKiBhbmQgRE9UQUxMIGlzIHNldCwKYmVjYXVzZSB0aGF0IHdpbGwgdHJ5IHRoZSByZXN0IG9mIHRoZSBwYXR0ZXJuIGF0IGFsbCBwb3NzaWJsZSBtYXRjaGluZyBwb2ludHMsCnNvIHRoZXJlIGlzIG5vIHBvaW50IHRyeWluZyBhZ2Fpbi4uLi4gZXIgLi4uLgoKLi4uLiBleGNlcHQgd2hlbiB0aGUgLiogYXBwZWFycyBpbnNpZGUgY2FwdHVyaW5nIHBhcmVudGhlc2VzLCBhbmQgdGhlcmUgaXMgYQpzdWJzZXF1ZW50IGJhY2sgcmVmZXJlbmNlIHRvIHRob3NlIHBhcmVudGhlc2VzLiBXZSBoYXZlbid0IGVub3VnaCBpbmZvcm1hdGlvbgp0byBjYXRjaCB0aGF0IGNhc2UgcHJlY2lzZWx5LgoKQXQgZmlyc3QsIHRoZSBiZXN0IHdlIGNvdWxkIGRvIHdhcyB0byBkZXRlY3Qgd2hlbiAuKiB3YXMgaW4gY2FwdHVyaW5nIGJyYWNrZXRzCmFuZCB0aGUgaGlnaGVzdCBiYWNrIHJlZmVyZW5jZSB3YXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoYXQgbGV2ZWwuCkhvd2V2ZXIsIGJ5IGtlZXBpbmcgYSBiaXRtYXAgb2YgdGhlIGZpcnN0IDMxIGJhY2sgcmVmZXJlbmNlcywgd2UgY2FuIGNhdGNoIHNvbWUKb2YgdGhlIG1vcmUgY29tbW9uIGNhc2VzIG1vcmUgcHJlY2lzZWx5LgoKQXJndW1lbnRzOgogIGNvZGUgICAgICAgICAgIHBvaW50cyB0byBzdGFydCBvZiBleHByZXNzaW9uICh0aGUgYnJhY2tldCkKICBvcHRpb25zICAgICAgICBwb2ludHMgdG8gdGhlIG9wdGlvbnMgc2V0dGluZwogIGJyYWNrZXRfbWFwICAgIGEgYml0bWFwIG9mIHdoaWNoIGJyYWNrZXRzIHdlIGFyZSBpbnNpZGUgd2hpbGUgdGVzdGluZzsgdGhpcwogICAgICAgICAgICAgICAgICBoYW5kbGVzIHVwIHRvIHN1YnN0cmluZyAzMTsgYWZ0ZXIgdGhhdCB3ZSBqdXN0IGhhdmUgdG8gdGFrZQogICAgICAgICAgICAgICAgICB0aGUgbGVzcyBwcmVjaXNlIGFwcHJvYWNoCiAgYmFja3JlZl9tYXAgICAgdGhlIGJhY2sgcmVmZXJlbmNlIGJpdG1hcAoKUmV0dXJuczogICAgIFRSVUUgb3IgRkFMU0UKKi8KCnN0YXRpYyBCT09MCmlzX2FuY2hvcmVkKHJlZ2lzdGVyIGNvbnN0IHVzY2hhciAqY29kZSwgaW50ICpvcHRpb25zLCB1bnNpZ25lZCBpbnQgYnJhY2tldF9tYXAsCiAgdW5zaWduZWQgaW50IGJhY2tyZWZfbWFwKQp7CmRvIHsKICAgY29uc3QgdXNjaGFyICpzY29kZSA9CiAgICAgZmlyc3Rfc2lnbmlmaWNhbnRfY29kZShjb2RlICsgMStMSU5LX1NJWkUsIG9wdGlvbnMsIFBDUkVfTVVMVElMSU5FLCBGQUxTRSk7CiAgIHJlZ2lzdGVyIGludCBvcCA9ICpzY29kZTsKCiAgIC8qIENhcHR1cmluZyBicmFja2V0cyAqLwoKICAgaWYgKG9wID4gT1BfQlJBKQogICAgIHsKICAgICBpbnQgbmV3X21hcDsKICAgICBvcCAtPSBPUF9CUkE7CiAgICAgaWYgKG9wID4gRVhUUkFDVF9CQVNJQ19NQVgpIG9wID0gR0VUMihzY29kZSwgMitMSU5LX1NJWkUpOwogICAgIG5ld19tYXAgPSBicmFja2V0X21hcCB8ICgob3AgPCAzMik/ICgxIDw8IG9wKSA6IDEpOwogICAgIGlmICghaXNfYW5jaG9yZWQoc2NvZGUsIG9wdGlvbnMsIG5ld19tYXAsIGJhY2tyZWZfbWFwKSkgcmV0dXJuIEZBTFNFOwogICAgIH0KCiAgIC8qIE90aGVyIGJyYWNrZXRzICovCgogICBlbHNlIGlmIChvcCA9PSBPUF9CUkEgfHwgb3AgPT0gT1BfQVNTRVJUIHx8IG9wID09IE9QX09OQ0UgfHwgb3AgPT0gT1BfQ09ORCkKICAgICB7CiAgICAgaWYgKCFpc19hbmNob3JlZChzY29kZSwgb3B0aW9ucywgYnJhY2tldF9tYXAsIGJhY2tyZWZfbWFwKSkgcmV0dXJuIEZBTFNFOwogICAgIH0KCiAgIC8qIC4qIGlzIG5vdCBhbmNob3JlZCB1bmxlc3MgRE9UQUxMIGlzIHNldCBhbmQgaXQgaXNuJ3QgaW4gYnJhY2tldHMgdGhhdAogICBhcmUgb3IgbWF5IGJlIHJlZmVyZW5jZWQuICovCgogICBlbHNlIGlmICgob3AgPT0gT1BfVFlQRVNUQVIgfHwgb3AgPT0gT1BfVFlQRU1JTlNUQVIpICYmCiAgICAgICAgICAgICgqb3B0aW9ucyAmIFBDUkVfRE9UQUxMKSAhPSAwKQogICAgIHsKICAgICBpZiAoc2NvZGVbMV0gIT0gT1BfQU5ZIHx8IChicmFja2V0X21hcCAmIGJhY2tyZWZfbWFwKSAhPSAwKSByZXR1cm4gRkFMU0U7CiAgICAgfQoKICAgLyogQ2hlY2sgZm9yIGV4cGxpY2l0IGFuY2hvcmluZyAqLwoKICAgZWxzZSBpZiAob3AgIT0gT1BfU09EICYmIG9wICE9IE9QX1NPTSAmJgogICAgICAgICAgICgoKm9wdGlvbnMgJiBQQ1JFX01VTFRJTElORSkgIT0gMCB8fCBvcCAhPSBPUF9DSVJDKSkKICAgICByZXR1cm4gRkFMU0U7CiAgIGNvZGUgKz0gR0VUKGNvZGUsIDEpOwogICB9CndoaWxlICgqY29kZSA9PSBPUF9BTFQpOyAgIC8qIExvb3AgZm9yIGVhY2ggYWx0ZXJuYXRpdmUgKi8KcmV0dXJuIFRSVUU7Cn0KCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiAgICAgICAgIENoZWNrIGZvciBzdGFydGluZyB3aXRoIF4gb3IgLiogICAgICAgICoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qIFRoaXMgaXMgY2FsbGVkIHRvIGZpbmQgb3V0IGlmIGV2ZXJ5IGJyYW5jaCBzdGFydHMgd2l0aCBeIG9yIC4qIHNvIHRoYXQKImZpcnN0IGNoYXIiIHByb2Nlc3NpbmcgY2FuIGJlIGRvbmUgdG8gc3BlZWQgdGhpbmdzIHVwIGluIG11bHRpbGluZQptYXRjaGluZyBhbmQgZm9yIG5vbi1ET1RBTEwgcGF0dGVybnMgdGhhdCBzdGFydCB3aXRoIC4qICh3aGljaCBtdXN0IHN0YXJ0IGF0CnRoZSBiZWdpbm5pbmcgb3IgYWZ0ZXIgXG4pLiBBcyBpbiB0aGUgY2FzZSBvZiBpc19hbmNob3JlZCgpIChzZWUgYWJvdmUpLCB3ZQpoYXZlIHRvIHRha2UgYWNjb3VudCBvZiBiYWNrIHJlZmVyZW5jZXMgdG8gY2FwdHVyaW5nIGJyYWNrZXRzIHRoYXQgY29udGFpbiAuKgpiZWNhdXNlIGluIHRoYXQgY2FzZSB3ZSBjYW4ndCBtYWtlIHRoZSBhc3N1bXB0aW9uLgoKQXJndW1lbnRzOgogIGNvZGUgICAgICAgICAgIHBvaW50cyB0byBzdGFydCBvZiBleHByZXNzaW9uICh0aGUgYnJhY2tldCkKICBicmFja2V0X21hcCAgICBhIGJpdG1hcCBvZiB3aGljaCBicmFja2V0cyB3ZSBhcmUgaW5zaWRlIHdoaWxlIHRlc3Rpbmc7IHRoaXMKICAgICAgICAgICAgICAgICAgaGFuZGxlcyB1cCB0byBzdWJzdHJpbmcgMzE7IGFmdGVyIHRoYXQgd2UganVzdCBoYXZlIHRvIHRha2UKICAgICAgICAgICAgICAgICAgdGhlIGxlc3MgcHJlY2lzZSBhcHByb2FjaAogIGJhY2tyZWZfbWFwICAgIHRoZSBiYWNrIHJlZmVyZW5jZSBiaXRtYXAKClJldHVybnM6ICAgICAgICAgVFJVRSBvciBGQUxTRQoqLwoKc3RhdGljIEJPT0wKaXNfc3RhcnRsaW5lKGNvbnN0IHVzY2hhciAqY29kZSwgdW5zaWduZWQgaW50IGJyYWNrZXRfbWFwLAogIHVuc2lnbmVkIGludCBiYWNrcmVmX21hcCkKewpkbyB7CiAgIGNvbnN0IHVzY2hhciAqc2NvZGUgPSBmaXJzdF9zaWduaWZpY2FudF9jb2RlKGNvZGUgKyAxK0xJTktfU0laRSwgTlVMTCwgMCwKICAgICBGQUxTRSk7CiAgIHJlZ2lzdGVyIGludCBvcCA9ICpzY29kZTsKCiAgIC8qIENhcHR1cmluZyBicmFja2V0cyAqLwoKICAgaWYgKG9wID4gT1BfQlJBKQogICAgIHsKICAgICBpbnQgbmV3X21hcDsKICAgICBvcCAtPSBPUF9CUkE7CiAgICAgaWYgKG9wID4gRVhUUkFDVF9CQVNJQ19NQVgpIG9wID0gR0VUMihzY29kZSwgMitMSU5LX1NJWkUpOwogICAgIG5ld19tYXAgPSBicmFja2V0X21hcCB8ICgob3AgPCAzMik/ICgxIDw8IG9wKSA6IDEpOwogICAgIGlmICghaXNfc3RhcnRsaW5lKHNjb2RlLCBuZXdfbWFwLCBiYWNrcmVmX21hcCkpIHJldHVybiBGQUxTRTsKICAgICB9CgogICAvKiBPdGhlciBicmFja2V0cyAqLwoKICAgZWxzZSBpZiAob3AgPT0gT1BfQlJBIHx8IG9wID09IE9QX0FTU0VSVCB8fCBvcCA9PSBPUF9PTkNFIHx8IG9wID09IE9QX0NPTkQpCiAgICAgeyBpZiAoIWlzX3N0YXJ0bGluZShzY29kZSwgYnJhY2tldF9tYXAsIGJhY2tyZWZfbWFwKSkgcmV0dXJuIEZBTFNFOyB9CgogICAvKiAuKiBtZWFucyAic3RhcnQgYXQgc3RhcnQgb3IgYWZ0ZXIgXG4iIGlmIGl0IGlzbid0IGluIGJyYWNrZXRzIHRoYXQKICAgbWF5IGJlIHJlZmVyZW5jZWQuICovCgogICBlbHNlIGlmIChvcCA9PSBPUF9UWVBFU1RBUiB8fCBvcCA9PSBPUF9UWVBFTUlOU1RBUikKICAgICB7CiAgICAgaWYgKHNjb2RlWzFdICE9IE9QX0FOWSB8fCAoYnJhY2tldF9tYXAgJiBiYWNrcmVmX21hcCkgIT0gMCkgcmV0dXJuIEZBTFNFOwogICAgIH0KCiAgIC8qIENoZWNrIGZvciBleHBsaWNpdCBjaXJjdW1mbGV4ICovCgogICBlbHNlIGlmIChvcCAhPSBPUF9DSVJDKSByZXR1cm4gRkFMU0U7CgogICAvKiBNb3ZlIG9uIHRvIHRoZSBuZXh0IGFsdGVybmF0aXZlICovCgogICBjb2RlICs9IEdFVChjb2RlLCAxKTsKICAgfQp3aGlsZSAoKmNvZGUgPT0gT1BfQUxUKTsgIC8qIExvb3AgZm9yIGVhY2ggYWx0ZXJuYXRpdmUgKi8KcmV0dXJuIFRSVUU7Cn0KCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiAgICAgICBDaGVjayBmb3IgYXNzZXJ0ZWQgZml4ZWQgZmlyc3QgY2hhciAgICAgICoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qIER1cmluZyBjb21waWxhdGlvbiwgdGhlICJmaXJzdCBjaGFyIiBzZXR0aW5ncyBmcm9tIGZvcndhcmQgYXNzZXJ0aW9ucyBhcmUKZGlzY2FyZGVkLCBiZWNhdXNlIHRoZXkgY2FuIGNhdXNlIGNvbmZsaWN0cyB3aXRoIGFjdHVhbCBsaXRlcmFscyB0aGF0IGZvbGxvdy4KSG93ZXZlciwgaWYgd2UgZW5kIHVwIHdpdGhvdXQgYSBmaXJzdCBjaGFyIHNldHRpbmcgZm9yIGFuIHVuYW5jaG9yZWQgcGF0dGVybiwKaXQgaXMgd29ydGggc2Nhbm5pbmcgdGhlIHJlZ2V4IHRvIHNlZSBpZiB0aGVyZSBpcyBhbiBpbml0aWFsIGFzc2VydGVkIGZpcnN0CmNoYXIuIElmIGFsbCBicmFuY2hlcyBzdGFydCB3aXRoIHRoZSBzYW1lIGFzc2VydGVkIGNoYXIsIG9yIHdpdGggYSBicmFja2V0IGFsbApvZiB3aG9zZSBhbHRlcm5hdGl2ZXMgc3RhcnQgd2l0aCB0aGUgc2FtZSBhc3NlcnRlZCBjaGFyIChyZWN1cnNlIGFkIGxpYiksIHRoZW4Kd2UgcmV0dXJuIHRoYXQgY2hhciwgb3RoZXJ3aXNlIC0xLgoKQXJndW1lbnRzOgogIGNvZGUgICAgICAgcG9pbnRzIHRvIHN0YXJ0IG9mIGV4cHJlc3Npb24gKHRoZSBicmFja2V0KQogIG9wdGlvbnMgICAgcG9pbnRlciB0byB0aGUgb3B0aW9ucyAodXNlZCB0byBjaGVjayBjYXNpbmcgY2hhbmdlcykKICBpbmFzc2VydCAgIFRSVUUgaWYgaW4gYW4gYXNzZXJ0aW9uCgpSZXR1cm5zOiAgICAgLTEgb3IgdGhlIGZpeGVkIGZpcnN0IGNoYXIKKi8KCnN0YXRpYyBpbnQKZmluZF9maXJzdGFzc2VydGVkY2hhcihjb25zdCB1c2NoYXIgKmNvZGUsIGludCAqb3B0aW9ucywgQk9PTCBpbmFzc2VydCkKewpyZWdpc3RlciBpbnQgYyA9IC0xOwpkbyB7CiAgIGludCBkOwogICBjb25zdCB1c2NoYXIgKnNjb2RlID0KICAgICBmaXJzdF9zaWduaWZpY2FudF9jb2RlKGNvZGUgKyAxK0xJTktfU0laRSwgb3B0aW9ucywgUENSRV9DQVNFTEVTUywgVFJVRSk7CiAgIHJlZ2lzdGVyIGludCBvcCA9ICpzY29kZTsKCiAgIGlmIChvcCA+PSBPUF9CUkEpIG9wID0gT1BfQlJBOwoKICAgc3dpdGNoKG9wKQogICAgIHsKICAgICBkZWZhdWx0OgogICAgIHJldHVybiAtMTsKCiAgICAgY2FzZSBPUF9CUkE6CiAgICAgY2FzZSBPUF9BU1NFUlQ6CiAgICAgY2FzZSBPUF9PTkNFOgogICAgIGNhc2UgT1BfQ09ORDoKICAgICBpZiAoKGQgPSBmaW5kX2ZpcnN0YXNzZXJ0ZWRjaGFyKHNjb2RlLCBvcHRpb25zLCBvcCA9PSBPUF9BU1NFUlQpKSA8IDApCiAgICAgICByZXR1cm4gLTE7CiAgICAgaWYgKGMgPCAwKSBjID0gZDsgZWxzZSBpZiAoYyAhPSBkKSByZXR1cm4gLTE7CiAgICAgYnJlYWs7CgogICAgIGNhc2UgT1BfRVhBQ1Q6ICAgICAgIC8qIEZhbGwgdGhyb3VnaCAqLwogICAgIHNjb2RlICs9IDI7CgogICAgIGNhc2UgT1BfQ0hBUjoKICAgICBjYXNlIE9QX0NIQVJOQzoKICAgICBjYXNlIE9QX1BMVVM6CiAgICAgY2FzZSBPUF9NSU5QTFVTOgogICAgIGlmICghaW5hc3NlcnQpIHJldHVybiAtMTsKICAgICBpZiAoYyA8IDApCiAgICAgICB7CiAgICAgICBjID0gc2NvZGVbMV07CiAgICAgICBpZiAoKCpvcHRpb25zICYgUENSRV9DQVNFTEVTUykgIT0gMCkgYyB8PSBSRVFfQ0FTRUxFU1M7CiAgICAgICB9CiAgICAgZWxzZSBpZiAoYyAhPSBzY29kZVsxXSkgcmV0dXJuIC0xOwogICAgIGJyZWFrOwogICAgIH0KCiAgIGNvZGUgKz0gR0VUKGNvZGUsIDEpOwogICB9CndoaWxlICgqY29kZSA9PSBPUF9BTFQpOwpyZXR1cm4gYzsKfQoKCgoKI2lmZGVmIFNVUFBPUlRfVVRGOAovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqICAgICAgICAgVmFsaWRhdGUgYSBVVEYtOCBzdHJpbmcgICAgICAgICAgICAgICAgKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgKG9wdGlvbmFsbHkpIGF0IHRoZSBzdGFydCBvZiBjb21waWxlIG9yIG1hdGNoLCB0bwp2YWxpZGF0ZSB0aGF0IGEgc3VwcG9zZWQgVVRGLTggc3RyaW5nIGlzIGFjdHVhbGx5IHZhbGlkLiBUaGUgZWFybHkgY2hlY2sgbWVhbnMKdGhhdCBzdWJzZXF1ZW50IGNvZGUgY2FuIGFzc3VtZSBpdCBpcyBkZWFsaW5nIHdpdGggYSB2YWxpZCBzdHJpbmcuIFRoZSBjaGVjawpjYW4gYmUgdHVybmVkIG9mZiBmb3IgbWF4aW11bSBwZXJmb3JtYW5jZSwgYnV0IHRoZW4gY29uc2VxdWVuY2VzIG9mIHN1cHBseWluZwphbiBpbnZhbGlkIHN0cmluZyBhcmUgdGhlbiB1bmRlZmluZWQuCgpBcmd1bWVudHM6CiAgc3RyaW5nICAgICAgIHBvaW50cyB0byB0aGUgc3RyaW5nCiAgbGVuZ3RoICAgICAgIGxlbmd0aCBvZiBzdHJpbmcsIG9yIC0xIGlmIHRoZSBzdHJpbmcgaXMgemVyby10ZXJtaW5hdGVkCgpSZXR1cm5zOiAgICAgICA8IDAgICAgaWYgdGhlIHN0cmluZyBpcyBhIHZhbGlkIFVURi04IHN0cmluZwogICAgICAgICAgICAgICA+PSAwICAgb3RoZXJ3aXNlOyB0aGUgdmFsdWUgaXMgdGhlIG9mZnNldCBvZiB0aGUgYmFkIGJ5dGUKKi8KCnN0YXRpYyBpbnQKdmFsaWRfdXRmOChjb25zdCB1c2NoYXIgKnN0cmluZywgaW50IGxlbmd0aCkKewpyZWdpc3RlciBjb25zdCB1c2NoYXIgKnA7CgppZiAobGVuZ3RoIDwgMCkKICB7CiAgZm9yIChwID0gc3RyaW5nOyAqcCAhPSAwOyBwKyspOwogIGxlbmd0aCA9IHAgLSBzdHJpbmc7CiAgfQoKZm9yIChwID0gc3RyaW5nOyBsZW5ndGgtLSA+IDA7IHArKykKICB7CiAgcmVnaXN0ZXIgaW50IGFiOwogIHJlZ2lzdGVyIGludCBjID0gKnA7CiAgaWYgKGMgPCAxMjgpIGNvbnRpbnVlOwogIGlmICgoYyAmIDB4YzApICE9IDB4YzApIHJldHVybiBwIC0gc3RyaW5nOwogIGFiID0gdXRmOF90YWJsZTRbYyAmIDB4M2ZdOyAgLyogTnVtYmVyIG9mIGFkZGl0aW9uYWwgYnl0ZXMgKi8KICBpZiAobGVuZ3RoIDwgYWIpIHJldHVybiBwIC0gc3RyaW5nOwogIGxlbmd0aCAtPSBhYjsKCiAgLyogQ2hlY2sgdG9wIGJpdHMgaW4gdGhlIHNlY29uZCBieXRlICovCiAgaWYgKCgqKCsrcCkgJiAweGMwKSAhPSAweDgwKSByZXR1cm4gcCAtIHN0cmluZzsKCiAgLyogQ2hlY2sgZm9yIG92ZXJsb25nIHNlcXVlbmNlcyBmb3IgZWFjaCBkaWZmZXJlbnQgbGVuZ3RoICovCiAgc3dpdGNoIChhYikKICAgIHsKICAgIC8qIENoZWNrIGZvciB4eDAwIDAwMHggKi8KICAgIGNhc2UgMToKICAgIGlmICgoYyAmIDB4M2UpID09IDApIHJldHVybiBwIC0gc3RyaW5nOwogICAgY29udGludWU7ICAgLyogV2Uga25vdyB0aGVyZSBhcmVuJ3QgYW55IG1vcmUgYnl0ZXMgdG8gY2hlY2sgKi8KCiAgICAvKiBDaGVjayBmb3IgMTExMCAwMDAwLCB4eDB4IHh4eHggKi8KICAgIGNhc2UgMjoKICAgIGlmIChjID09IDB4ZTAgJiYgKCpwICYgMHgyMCkgPT0gMCkgcmV0dXJuIHAgLSBzdHJpbmc7CiAgICBicmVhazsKCiAgICAvKiBDaGVjayBmb3IgMTExMSAwMDAwLCB4eDAwIHh4eHggKi8KICAgIGNhc2UgMzoKICAgIGlmIChjID09IDB4ZjAgJiYgKCpwICYgMHgzMCkgPT0gMCkgcmV0dXJuIHAgLSBzdHJpbmc7CiAgICBicmVhazsKCiAgICAvKiBDaGVjayBmb3IgMTExMSAxMDAwLCB4eDAwIDB4eHggKi8KICAgIGNhc2UgNDoKICAgIGlmIChjID09IDB4ZjggJiYgKCpwICYgMHgzOCkgPT0gMCkgcmV0dXJuIHAgLSBzdHJpbmc7CiAgICBicmVhazsKCiAgICAvKiBDaGVjayBmb3IgbGVhZGluZyAweGZlIG9yIDB4ZmYsIGFuZCB0aGVuIGZvciAxMTExIDExMDAsIHh4MDAgMDB4eCAqLwogICAgY2FzZSA1OgogICAgaWYgKGMgPT0gMHhmZSB8fCBjID09IDB4ZmYgfHwKICAgICAgIChjID09IDB4ZmMgJiYgKCpwICYgMHgzYykgPT0gMCkpIHJldHVybiBwIC0gc3RyaW5nOwogICAgYnJlYWs7CiAgICB9CgogIC8qIENoZWNrIGZvciB2YWxpZCBieXRlcyBhZnRlciB0aGUgMm5kLCBpZiBhbnk7IGFsbCBtdXN0IHN0YXJ0IDEwICovCiAgd2hpbGUgKC0tYWIgPiAwKQogICAgewogICAgaWYgKCgqKCsrcCkgJiAweGMwKSAhPSAweDgwKSByZXR1cm4gcCAtIHN0cmluZzsKICAgIH0KICB9CgpyZXR1cm4gLTE7Cn0KI2VuZGlmCgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogICAgICAgIENvbXBpbGUgYSBSZWd1bGFyIEV4cHJlc3Npb24gICAgICAgICAgICAqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKiBUaGlzIGZ1bmN0aW9uIHRha2VzIGEgc3RyaW5nIGFuZCByZXR1cm5zIGEgcG9pbnRlciB0byBhIGJsb2NrIG9mIHN0b3JlCmhvbGRpbmcgYSBjb21waWxlZCB2ZXJzaW9uIG9mIHRoZSBleHByZXNzaW9uLgoKQXJndW1lbnRzOgogIHBhdHRlcm4gICAgICB0aGUgcmVndWxhciBleHByZXNzaW9uCiAgb3B0aW9ucyAgICAgIHZhcmlvdXMgb3B0aW9uIGJpdHMKICBlcnJvcnB0ciAgICAgcG9pbnRlciB0byBwb2ludGVyIHRvIGVycm9yIHRleHQKICBlcnJvcm9mZnNldCAgcHRyIG9mZnNldCBpbiBwYXR0ZXJuIHdoZXJlIGVycm9yIHdhcyBkZXRlY3RlZAogIHRhYmxlcyAgICAgICBwb2ludGVyIHRvIGNoYXJhY3RlciB0YWJsZXMgb3IgTlVMTAoKUmV0dXJuczogICAgICAgcG9pbnRlciB0byBjb21waWxlZCBkYXRhIGJsb2NrLCBvciBOVUxMIG9uIGVycm9yLAogICAgICAgICAgICAgICB3aXRoIGVycm9ycHRyIGFuZCBlcnJvcm9mZnNldCBzZXQKKi8KCkVYUE9SVCBwY3JlICoKcGNyZV9jb21waWxlKGNvbnN0IGNoYXIgKnBhdHRlcm4sIGludCBvcHRpb25zLCBjb25zdCBjaGFyICoqZXJyb3JwdHIsCiAgaW50ICplcnJvcm9mZnNldCwgY29uc3QgdW5zaWduZWQgY2hhciAqdGFibGVzKQp7CnJlYWxfcGNyZSAqcmU7CmludCBsZW5ndGggPSAxICsgTElOS19TSVpFOyAgICAgIC8qIEZvciBpbml0aWFsIEJSQSBwbHVzIGxlbmd0aCAqLwppbnQgYywgZmlyc3RieXRlLCByZXFieXRlOwppbnQgYnJhY291bnQgPSAwOwppbnQgYnJhbmNoX2V4dHJhID0gMDsKaW50IGJyYW5jaF9uZXdleHRyYTsKaW50IGl0ZW1fY291bnQgPSAtMTsKaW50IG5hbWVfY291bnQgPSAwOwppbnQgbWF4X25hbWVfc2l6ZSA9IDA7CmludCBsYXN0aXRlbWxlbmd0aCA9IDA7CiNpZmRlZiBTVVBQT1JUX1VURjgKQk9PTCB1dGY4OwpCT09MIGNsYXNzX3V0Zjg7CiNlbmRpZgpCT09MIGluZXNjcSA9IEZBTFNFOwp1bnNpZ25lZCBpbnQgYnJhc3RhY2twdHIgPSAwOwpzaXplX3Qgc2l6ZTsKdXNjaGFyICpjb2RlOwpjb25zdCB1c2NoYXIgKmNvZGVzdGFydDsKY29uc3QgdXNjaGFyICpwdHI7CmNvbXBpbGVfZGF0YSBjb21waWxlX2Jsb2NrOwppbnQgYnJhc3RhY2tbQlJBU1RBQ0tfU0laRV07CnVzY2hhciBicmFsZW5zdGFja1tCUkFTVEFDS19TSVpFXTsKCi8qIFdlIGNhbid0IHBhc3MgYmFjayBhbiBlcnJvciBtZXNzYWdlIGlmIGVycm9ycHRyIGlzIE5VTEw7IEkgZ3Vlc3MgdGhlIGJlc3Qgd2UKY2FuIGRvIGlzIGp1c3QgcmV0dXJuIE5VTEwuICovCgppZiAoZXJyb3JwdHIgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CiplcnJvcnB0ciA9IE5VTEw7CgovKiBIb3dldmVyLCB3ZSBjYW4gZ2l2ZSBhIG1lc3NhZ2UgZm9yIHRoaXMgZXJyb3IgKi8KCmlmIChlcnJvcm9mZnNldCA9PSBOVUxMKQogIHsKICAqZXJyb3JwdHIgPSBFUlIxNjsKICByZXR1cm4gTlVMTDsKICB9CiplcnJvcm9mZnNldCA9IDA7CgovKiBDYW4ndCBzdXBwb3J0IFVURjggdW5sZXNzIFBDUkUgaGFzIGJlZW4gY29tcGlsZWQgdG8gaW5jbHVkZSB0aGUgY29kZS4gKi8KCiNpZmRlZiBTVVBQT1JUX1VURjgKdXRmOCA9IChvcHRpb25zICYgUENSRV9VVEY4KSAhPSAwOwppZiAodXRmOCAmJiAob3B0aW9ucyAmIFBDUkVfTk9fVVRGOF9DSEVDSykgPT0gMCAmJgogICAgICgqZXJyb3JvZmZzZXQgPSB2YWxpZF91dGY4KCh1c2NoYXIgKilwYXR0ZXJuLCAtMSkpID49IDApCiAgewogICplcnJvcnB0ciA9IEVSUjQ0OwogIHJldHVybiBOVUxMOwogIH0KI2Vsc2UKaWYgKChvcHRpb25zICYgUENSRV9VVEY4KSAhPSAwKQogIHsKICAqZXJyb3JwdHIgPSBFUlIzMjsKICByZXR1cm4gTlVMTDsKICB9CiNlbmRpZgoKaWYgKChvcHRpb25zICYgflBVQkxJQ19PUFRJT05TKSAhPSAwKQogIHsKICAqZXJyb3JwdHIgPSBFUlIxNzsKICByZXR1cm4gTlVMTDsKICB9CgovKiBTZXQgdXAgcG9pbnRlcnMgdG8gdGhlIGluZGl2aWR1YWwgY2hhcmFjdGVyIHRhYmxlcyAqLwoKaWYgKHRhYmxlcyA9PSBOVUxMKSB0YWJsZXMgPSBwY3JlX2RlZmF1bHRfdGFibGVzOwpjb21waWxlX2Jsb2NrLmxjYyA9IHRhYmxlcyArIGxjY19vZmZzZXQ7CmNvbXBpbGVfYmxvY2suZmNjID0gdGFibGVzICsgZmNjX29mZnNldDsKY29tcGlsZV9ibG9jay5jYml0cyA9IHRhYmxlcyArIGNiaXRzX29mZnNldDsKY29tcGlsZV9ibG9jay5jdHlwZXMgPSB0YWJsZXMgKyBjdHlwZXNfb2Zmc2V0OwoKLyogTWF4aW11bSBiYWNrIHJlZmVyZW5jZSBhbmQgYmFja3JlZiBiaXRtYXAuIFRoaXMgaXMgdXBkYXRlZCBmb3IgbnVtZXJpYwpyZWZlcmVuY2VzIGR1cmluZyB0aGUgZmlyc3QgcGFzcywgYnV0IGZvciBuYW1lZCByZWZlcmVuY2VzIGR1cmluZyB0aGUgYWN0dWFsCmNvbXBpbGUgcGFzcy4gVGhlIGJpdG1hcCByZWNvcmRzIHVwIHRvIDMxIGJhY2sgcmVmZXJlbmNlcyB0byBoZWxwIGluIGRlY2lkaW5nCndoZXRoZXIgKC4qKSBjYW4gYmUgdHJlYXRlZCBhcyBhbmNob3JlZCBvciBub3QuICovCgpjb21waWxlX2Jsb2NrLnRvcF9iYWNrcmVmID0gMDsKY29tcGlsZV9ibG9jay5iYWNrcmVmX21hcCA9IDA7CgovKiBSZWZsZWN0IHBhdHRlcm4gZm9yIGRlYnVnZ2luZyBvdXRwdXQgKi8KCkRQUklOVEYoKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpKTsKRFBSSU5URigoIiVzXG4iLCBwYXR0ZXJuKSk7CgovKiBUaGUgZmlyc3QgdGhpbmcgdG8gZG8gaXMgdG8gbWFrZSBhIHBhc3Mgb3ZlciB0aGUgcGF0dGVybiB0byBjb21wdXRlIHRoZQphbW91bnQgb2Ygc3RvcmUgcmVxdWlyZWQgdG8gaG9sZCB0aGUgY29tcGlsZWQgY29kZS4gVGhpcyBkb2VzIG5vdCBoYXZlIHRvIGJlCnBlcmZlY3QgYXMgbG9uZyBhcyBlcnJvcnMgYXJlIG92ZXJlc3RpbWF0ZXMuIEF0IHRoZSBzYW1lIHRpbWUgd2UgY2FuIGRldGVjdCBhbnkKZmxhZyBzZXR0aW5ncyByaWdodCBhdCB0aGUgc3RhcnQsIGFuZCBleHRyYWN0IHRoZW0uIE1ha2UgYW4gYXR0ZW1wdCB0byBjb3JyZWN0CmZvciBhbnkgY291bnRlZCB3aGl0ZSBzcGFjZSBpZiBhbiAiZXh0ZW5kZWQiIGZsYWcgc2V0dGluZyBhcHBlYXJzIGxhdGUgaW4gdGhlCnBhdHRlcm4uIFdlIGNhbid0IGJlIHNvIGNsZXZlciBmb3IgIy1jb21tZW50cy4gKi8KCnB0ciA9IChjb25zdCB1c2NoYXIgKikocGF0dGVybiAtIDEpOwp3aGlsZSAoKGMgPSAqKCsrcHRyKSkgIT0gMCkKICB7CiAgaW50IG1pbiwgbWF4OwogIGludCBjbGFzc19vcHRjb3VudDsKICBpbnQgYnJhY2tldF9sZW5ndGg7CiAgaW50IGR1cGxlbmd0aDsKCiAgLyogSWYgd2UgYXJlIGluc2lkZSBhIFxRLi4uXEUgc2VxdWVuY2UsIGFsbCBjaGFycyBhcmUgbGl0ZXJhbCAqLwoKICBpZiAoaW5lc2NxKQogICAgewogICAgaWYgKChvcHRpb25zICYgUENSRV9BVVRPX0NBTExPVVQpICE9IDApIGxlbmd0aCArPSAyICsgMipMSU5LX1NJWkU7CiAgICBnb3RvIE5PUk1BTF9DSEFSOwogICAgfQoKICAvKiBPdGhlcndpc2UsIGZpcnN0IGNoZWNrIGZvciBpZ25vcmVkIHdoaXRlc3BhY2UgYW5kIGNvbW1lbnRzICovCgogIGlmICgob3B0aW9ucyAmIFBDUkVfRVhURU5ERUQpICE9IDApCiAgICB7CiAgICBpZiAoKGNvbXBpbGVfYmxvY2suY3R5cGVzW2NdICYgY3R5cGVfc3BhY2UpICE9IDApIGNvbnRpbnVlOwogICAgaWYgKGMgPT0gJyMnKQogICAgICB7CiAgICAgIC8qIFRoZSBzcGFjZSBiZWZvcmUgdGhlIDsgaXMgdG8gYXZvaWQgYSB3YXJuaW5nIG9uIGEgc2lsbHkgY29tcGlsZXIKICAgICAgb24gdGhlIE1hY2ludG9zaC4gKi8KICAgICAgd2hpbGUgKChjID0gKigrK3B0cikpICE9IDAgJiYgYyAhPSBORVdMSU5FKSA7CiAgICAgIGlmIChjID09IDApIGJyZWFrOwogICAgICBjb250aW51ZTsKICAgICAgfQogICAgfQoKICBpdGVtX2NvdW50Kys7ICAgIC8qIElzIHplcm8gZm9yIHRoZSBmaXJzdCBub24tY29tbWVudCBpdGVtICovCgogIC8qIEFsbG93IHNwYWNlIGZvciBhdXRvIGNhbGxvdXQgYmVmb3JlIGV2ZXJ5IGl0ZW0gZXhjZXB0IHF1YW50aWZpZXJzLiAqLwoKICBpZiAoKG9wdGlvbnMgJiBQQ1JFX0FVVE9fQ0FMTE9VVCkgIT0gMCAmJgogICAgICAgYyAhPSAnKicgJiYgYyAhPSAnKycgJiYgYyAhPSAnPycgJiYKICAgICAgIChjICE9ICd7JyB8fCAhaXNfY291bnRlZF9yZXBlYXQocHRyICsgMSkpKQogICAgbGVuZ3RoICs9IDIgKyAyKkxJTktfU0laRTsKCiAgc3dpdGNoKGMpCiAgICB7CiAgICAvKiBBIGJhY2tzbGFzaGVkIGl0ZW0gbWF5IGJlIGFuIGVzY2FwZWQgZGF0YSBjaGFyYWN0ZXIgb3IgaXQgbWF5IGJlIGEKICAgIGNoYXJhY3RlciB0eXBlLiAqLwoKICAgIGNhc2UgJ1xcJzoKICAgIGMgPSBjaGVja19lc2NhcGUoJnB0ciwgZXJyb3JwdHIsIGJyYWNvdW50LCBvcHRpb25zLCBGQUxTRSk7CiAgICBpZiAoKmVycm9ycHRyICE9IE5VTEwpIGdvdG8gUENSRV9FUlJPUl9SRVRVUk47CgogICAgbGFzdGl0ZW1sZW5ndGggPSAxOyAgICAgLyogRGVmYXVsdCBsZW5ndGggb2YgbGFzdCBpdGVtIGZvciByZXBlYXRzICovCgogICAgaWYgKGMgPj0gMCkgICAgICAgICAgICAgLyogRGF0YSBjaGFyYWN0ZXIgKi8KICAgICAgewogICAgICBsZW5ndGggKz0gMjsgICAgICAgICAgLyogRm9yIGEgb25lLWJ5dGUgY2hhcmFjdGVyICovCgojaWZkZWYgU1VQUE9SVF9VVEY4CiAgICAgIGlmICh1dGY4ICYmIGMgPiAxMjcpCiAgICAgICAgewogICAgICAgIGludCBpOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YodXRmOF90YWJsZTEpL3NpemVvZihpbnQpOyBpKyspCiAgICAgICAgICBpZiAoYyA8PSB1dGY4X3RhYmxlMVtpXSkgYnJlYWs7CiAgICAgICAgbGVuZ3RoICs9IGk7CiAgICAgICAgbGFzdGl0ZW1sZW5ndGggKz0gaTsKICAgICAgICB9CiNlbmRpZgoKICAgICAgY29udGludWU7CiAgICAgIH0KCiAgICAvKiBJZiBcUSwgZW50ZXIgImxpdGVyYWwiIG1vZGUgKi8KCiAgICBpZiAoLWMgPT0gRVNDX1EpCiAgICAgIHsKICAgICAgaW5lc2NxID0gVFJVRTsKICAgICAgY29udGludWU7CiAgICAgIH0KCiAgICAvKiBcWCBpcyBzdXBwb3J0ZWQgb25seSBpZiBVbmljb2RlIHByb3BlcnR5IHN1cHBvcnQgaXMgY29tcGlsZWQgKi8KCiNpZm5kZWYgU1VQUE9SVF9VQ1AKICAgIGlmICgtYyA9PSBFU0NfWCkKICAgICAgewogICAgICAqZXJyb3JwdHIgPSBFUlI0NTsKICAgICAgZ290byBQQ1JFX0VSUk9SX1JFVFVSTjsKICAgICAgfQojZW5kaWYKCiAgICAvKiBcUCBhbmQgXHAgYXJlIGZvciBVbmljb2RlIHByb3BlcnRpZXMsIGJ1dCBvbmx5IHdoZW4gdGhlIHN1cHBvcnQgaGFzCiAgICBiZWVuIGNvbXBpbGVkLiBFYWNoIGl0ZW0gbmVlZHMgMiBieXRlcy4gKi8KCiAgICBlbHNlIGlmICgtYyA9PSBFU0NfUCB8fCAtYyA9PSBFU0NfcCkKICAgICAgewojaWZkZWYgU1VQUE9SVF9VQ1AKICAgICAgQk9PTCBuZWdhdGVkOwogICAgICBsZW5ndGggKz0gMjsKICAgICAgbGFzdGl0ZW1sZW5ndGggPSAyOwogICAgICBpZiAoZ2V0X3VjcCgmcHRyLCAmbmVnYXRlZCwgZXJyb3JwdHIpIDwgMCkgZ290byBQQ1JFX0VSUk9SX1JFVFVSTjsKICAgICAgY29udGludWU7CiNlbHNlCiAgICAgICplcnJvcnB0ciA9IEVSUjQ1OwogICAgICBnb3RvIFBDUkVfRVJST1JfUkVUVVJOOwojZW5kaWYKICAgICAgfQoKICAgIC8qIE90aGVyIGVzY2FwZXMgbmVlZCBvbmUgYnl0ZSAqLwoKICAgIGxlbmd0aCsrOwoKICAgIC8qIEEgYmFjayByZWZlcmVuY2UgbmVlZHMgYW4gYWRkaXRpb25hbCAyIGJ5dGVzLCBwbHVzIGVpdGhlciBvbmUgb3IgNQogICAgYnl0ZXMgZm9yIGEgcmVwZWF0LiBXZSBhbHNvIG5lZWQgdG8ga2VlcCB0aGUgdmFsdWUgb2YgdGhlIGhpZ2hlc3QKICAgIGJhY2sgcmVmZXJlbmNlLiAqLwoKICAgIGlmIChjIDw9IC1FU0NfUkVGKQogICAgICB7CiAgICAgIGludCByZWZudW0gPSAtYyAtIEVTQ19SRUY7CiAgICAgIGNvbXBpbGVfYmxvY2suYmFja3JlZl9tYXAgfD0gKHJlZm51bSA8IDMyKT8gKDEgPDwgcmVmbnVtKSA6IDE7CiAgICAgIGlmIChyZWZudW0gPiBjb21waWxlX2Jsb2NrLnRvcF9iYWNrcmVmKQogICAgICAgIGNvbXBpbGVfYmxvY2sudG9wX2JhY2tyZWYgPSByZWZudW07CiAgICAgIGxlbmd0aCArPSAyOyAgIC8qIEZvciBzaW5nbGUgYmFjayByZWZlcmVuY2UgKi8KICAgICAgaWYgKHB0clsxXSA9PSAneycgJiYgaXNfY291bnRlZF9yZXBlYXQocHRyKzIpKQogICAgICAgIHsKICAgICAgICBwdHIgPSByZWFkX3JlcGVhdF9jb3VudHMocHRyKzIsICZtaW4sICZtYXgsIGVycm9ycHRyKTsKICAgICAgICBpZiAoKmVycm9ycHRyICE9IE5VTEwpIGdvdG8gUENSRV9FUlJPUl9SRVRVUk47CiAgICAgICAgaWYgKChtaW4gPT0gMCAmJiAobWF4ID09IDEgfHwgbWF4ID09IC0xKSkgfHwKICAgICAgICAgIChtaW4gPT0gMSAmJiBtYXggPT0gLTEpKQogICAgICAgICAgICBsZW5ndGgrKzsKICAgICAgICBlbHNlIGxlbmd0aCArPSA1OwogICAgICAgIGlmIChwdHJbMV0gPT0gJz8nKSBwdHIrKzsKICAgICAgICB9CiAgICAgIH0KICAgIGNvbnRpbnVlOwoKICAgIGNhc2UgJ14nOiAgICAgLyogU2luZ2xlLWJ5dGUgbWV0YWNoYXJhY3RlcnMgKi8KICAgIGNhc2UgJy4nOgogICAgY2FzZSAnJCc6CiAgICBsZW5ndGgrKzsKICAgIGxhc3RpdGVtbGVuZ3RoID0gMTsKICAgIGNvbnRpbnVlOwoKICAgIGNhc2UgJyonOiAgICAgICAgICAgIC8qIFRoZXNlIHJlcGVhdHMgd29uJ3QgYmUgYWZ0ZXIgYnJhY2tldHM7ICovCiAgICBjYXNlICcrJzogICAgICAgICAgICAvKiB0aG9zZSBhcmUgaGFuZGxlZCBzZXBhcmF0ZWx5ICovCiAgICBjYXNlICc/JzoKICAgIGxlbmd0aCsrOwogICAgZ290byBQT1NFU1NJVkU7ICAgICAgLyogQSBmZXcgbGluZXMgYmVsb3cgKi8KCiAgICAvKiBUaGlzIGNvdmVycyB0aGUgY2FzZXMgb2YgYnJhY2VkIHJlcGVhdHMgYWZ0ZXIgYSBzaW5nbGUgY2hhciwgbWV0YWNoYXIsCiAgICBjbGFzcywgb3IgYmFjayByZWZlcmVuY2UuICovCgogICAgY2FzZSAneyc6CiAgICBpZiAoIWlzX2NvdW50ZWRfcmVwZWF0KHB0cisxKSkgZ290byBOT1JNQUxfQ0hBUjsKICAgIHB0ciA9IHJlYWRfcmVwZWF0X2NvdW50cyhwdHIrMSwgJm1pbiwgJm1heCwgZXJyb3JwdHIpOwogICAgaWYgKCplcnJvcnB0ciAhPSBOVUxMKSBnb3RvIFBDUkVfRVJST1JfUkVUVVJOOwoKICAgIC8qIFRoZXNlIHNwZWNpYWwgY2FzZXMganVzdCBpbnNlcnQgb25lIGV4dHJhIG9wY29kZSAqLwoKICAgIGlmICgobWluID09IDAgJiYgKG1heCA9PSAxIHx8IG1heCA9PSAtMSkpIHx8CiAgICAgIChtaW4gPT0gMSAmJiBtYXggPT0gLTEpKQogICAgICAgIGxlbmd0aCsrOwoKICAgIC8qIFRoZXNlIGNhc2VzIG1pZ2h0IGluc2VydCBhZGRpdGlvbmFsIGNvcGllcyBvZiBhIHByZWNlZGluZyBjaGFyYWN0ZXIuICovCgogICAgZWxzZQogICAgICB7CiAgICAgIGlmIChtaW4gIT0gMSkKICAgICAgICB7CiAgICAgICAgbGVuZ3RoIC09IGxhc3RpdGVtbGVuZ3RoOyAgIC8qIFVuY291bnQgdGhlIG9yaWdpbmFsIGNoYXIgb3IgbWV0YWNoYXIgKi8KICAgICAgICBpZiAobWluID4gMCkgbGVuZ3RoICs9IDMgKyBsYXN0aXRlbWxlbmd0aDsKICAgICAgICB9CiAgICAgIGxlbmd0aCArPSBsYXN0aXRlbWxlbmd0aCArICgobWF4ID4gMCk/IDMgOiAxKTsKICAgICAgfQoKICAgIGlmIChwdHJbMV0gPT0gJz8nKSBwdHIrKzsgICAgICAvKiBOZWVkcyBubyBleHRyYSBsZW5ndGggKi8KCiAgICBQT1NFU1NJVkU6ICAgICAgICAgICAgICAgICAgICAgLyogVGVzdCBmb3IgcG9zc2Vzc2l2ZSBxdWFudGlmaWVyICovCiAgICBpZiAocHRyWzFdID09ICcrJykKICAgICAgewogICAgICBwdHIrKzsKICAgICAgbGVuZ3RoICs9IDIgKyAyKkxJTktfU0laRTsgICAvKiBBbGxvdyBmb3IgYXRvbWljIGJyYWNrZXRzICovCiAgICAgIH0KICAgIGNvbnRpbnVlOwoKICAgIC8qIEFuIGFsdGVybmF0aW9uIGNvbnRhaW5zIGFuIG9mZnNldCB0byB0aGUgbmV4dCBicmFuY2ggb3Iga2V0LiBJZiBhbnkgaW1zCiAgICBvcHRpb25zIGNoYW5nZWQgaW4gdGhlIHByZXZpb3VzIGJyYW5jaChlcyksIGFuZC9vciBpZiB3ZSBhcmUgaW4gYQogICAgbG9va2JlaGluZCBhc3NlcnRpb24sIGV4dHJhIHNwYWNlIHdpbGwgYmUgbmVlZGVkIGF0IHRoZSBzdGFydCBvZiB0aGUKICAgIGJyYW5jaC4gVGhpcyBpcyBoYW5kbGVkIGJ5IGJyYW5jaF9leHRyYS4gKi8KCiAgICBjYXNlICd8JzoKICAgIGxlbmd0aCArPSAxICsgTElOS19TSVpFICsgYnJhbmNoX2V4dHJhOwogICAgY29udGludWU7CgogICAgLyogQSBjaGFyYWN0ZXIgY2xhc3MgdXNlcyAzMyBjaGFyYWN0ZXJzIHByb3ZpZGVkIHRoYXQgYWxsIHRoZSBjaGFyYWN0ZXIKICAgIHZhbHVlcyBhcmUgbGVzcyB0aGFuIDI1Ni4gT3RoZXJ3aXNlLCBpdCB1c2VzIGEgYml0IG1hcCBmb3IgbG93IHZhbHVlZAogICAgY2hhcmFjdGVycywgYW5kIGluZGl2aWR1YWwgaXRlbXMgZm9yIG90aGVycy4gRG9uJ3Qgd29ycnkgYWJvdXQgY2hhcmFjdGVyCiAgICB0eXBlcyB0aGF0IGFyZW4ndCBhbGxvd2VkIGluIGNsYXNzZXMgLSB0aGV5J2xsIGdldCBwaWNrZWQgdXAgZHVyaW5nIHRoZQogICAgY29tcGlsZS4gQSBjaGFyYWN0ZXIgY2xhc3MgdGhhdCBjb250YWlucyBvbmx5IG9uZSBzaW5nbGUtYnl0ZSBjaGFyYWN0ZXIKICAgIHVzZXMgMiBvciAzIGJ5dGVzLCBkZXBlbmRpbmcgb24gd2hldGhlciBpdCBpcyBuZWdhdGVkIG9yIG5vdC4gTm90aWNlIHRoaXMKICAgIHdoZXJlIHdlIGNhbi4gKEluIFVURi04IG1vZGUgd2UgY2FuIGRvIHRoaXMgb25seSBmb3IgY2hhcnMgPCAxMjguKSAqLwoKICAgIGNhc2UgJ1snOgogICAgaWYgKCooKytwdHIpID09ICdeJykKICAgICAgewogICAgICBjbGFzc19vcHRjb3VudCA9IDEwOyAgLyogR3JlYXRlciB0aGFuIG9uZSAqLwogICAgICBwdHIrKzsKICAgICAgfQogICAgZWxzZSBjbGFzc19vcHRjb3VudCA9IDA7CgojaWZkZWYgU1VQUE9SVF9VVEY4CiAgICBjbGFzc191dGY4ID0gRkFMU0U7CiNlbmRpZgoKICAgIC8qIFdyaXR0ZW4gYXMgYSAiZG8iIHNvIHRoYXQgYW4gaW5pdGlhbCAnXScgaXMgdGFrZW4gYXMgZGF0YSAqLwoKICAgIGlmICgqcHRyICE9IDApIGRvCiAgICAgIHsKICAgICAgLyogSW5zaWRlIFxRLi4uXEUgZXZlcnl0aGluZyBpcyBsaXRlcmFsIGV4Y2VwdCBcRSAqLwoKICAgICAgaWYgKGluZXNjcSkKICAgICAgICB7CiAgICAgICAgaWYgKCpwdHIgIT0gJ1xcJyB8fCBwdHJbMV0gIT0gJ0UnKSBnb3RvIEdFVF9PTkVfQ0hBUkFDVEVSOwogICAgICAgIGluZXNjcSA9IEZBTFNFOwogICAgICAgIHB0ciArPSAxOwogICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgIC8qIE91dHNpZGUgXFEuLi5cRSwgY2hlY2sgZm9yIGVzY2FwZXMgKi8KCiAgICAgIGlmICgqcHRyID09ICdcXCcpCiAgICAgICAgewogICAgICAgIGMgPSBjaGVja19lc2NhcGUoJnB0ciwgZXJyb3JwdHIsIGJyYWNvdW50LCBvcHRpb25zLCBUUlVFKTsKICAgICAgICBpZiAoKmVycm9ycHRyICE9IE5VTEwpIGdvdG8gUENSRV9FUlJPUl9SRVRVUk47CgogICAgICAgIC8qIFxiIGlzIGJhY2tzcGFjZSBpbnNpZGUgYSBjbGFzczsgXFggaXMgbGl0ZXJhbCAqLwoKICAgICAgICBpZiAoLWMgPT0gRVNDX2IpIGMgPSAnXGInOwogICAgICAgIGVsc2UgaWYgKC1jID09IEVTQ19YKSBjID0gJ1gnOwoKICAgICAgICAvKiBcUSBlbnRlcnMgcXVvdGluZyBtb2RlICovCgogICAgICAgIGVsc2UgaWYgKC1jID09IEVTQ19RKQogICAgICAgICAgewogICAgICAgICAgaW5lc2NxID0gVFJVRTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQoKICAgICAgICAvKiBIYW5kbGUgZXNjYXBlcyB0aGF0IHR1cm4gaW50byBjaGFyYWN0ZXJzICovCgogICAgICAgIGlmIChjID49IDApIGdvdG8gTk9OX1NQRUNJQUxfQ0hBUkFDVEVSOwoKICAgICAgICAvKiBFc2NhcGVzIHRoYXQgYXJlIG1ldGEtdGhpbmdzLiBUaGUgbm9ybWFsIG9uZXMganVzdCBhZmZlY3QgdGhlCiAgICAgICAgYml0IG1hcCwgYnV0IFVuaWNvZGUgcHJvcGVydGllcyByZXF1aXJlIGFuIFhDTEFTUyBleHRlbmRlZCBpdGVtLiAqLwoKICAgICAgICBlbHNlCiAgICAgICAgICB7CiAgICAgICAgICBjbGFzc19vcHRjb3VudCA9IDEwOyAgICAgICAgIC8qIFxkLCBccyBldGM7IG1ha2Ugc3VyZSA+IDEgKi8KI2lmZGVmIFNVUFBPUlRfVVRGOAogICAgICAgICAgaWYgKC1jID09IEVTQ19wIHx8IC1jID09IEVTQ19QKQogICAgICAgICAgICB7CiAgICAgICAgICAgIGlmICghY2xhc3NfdXRmOCkKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgY2xhc3NfdXRmOCA9IFRSVUU7CiAgICAgICAgICAgICAgbGVuZ3RoICs9IExJTktfU0laRSArIDI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICBsZW5ndGggKz0gMjsKICAgICAgICAgICAgfQojZW5kaWYKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAvKiBDaGVjayB0aGUgc3ludGF4IGZvciBQT1NJWCBzdHVmZi4gVGhlIGJpdHMgd2UgYWN0dWFsbHkgaGFuZGxlIGFyZQogICAgICBjaGVja2VkIGR1cmluZyB0aGUgcmVhbCBjb21waWxlIHBoYXNlLiAqLwoKICAgICAgZWxzZSBpZiAoKnB0ciA9PSAnWycgJiYgY2hlY2tfcG9zaXhfc3ludGF4KHB0ciwgJnB0ciwgJmNvbXBpbGVfYmxvY2spKQogICAgICAgIHsKICAgICAgICBwdHIrKzsKICAgICAgICBjbGFzc19vcHRjb3VudCA9IDEwOyAgICAvKiBNYWtlIHN1cmUgPiAxICovCiAgICAgICAgfQoKICAgICAgLyogQW55dGhpbmcgZWxzZSBpbmNyZW1lbnRzIHRoZSBwb3NzaWJsZSBvcHRpbWl6YXRpb24gY291bnQuIFdlIGhhdmUgdG8KICAgICAgZGV0ZWN0IHJhbmdlcyBoZXJlIHNvIHRoYXQgd2UgY2FuIGNvbXB1dGUgdGhlIG51bWJlciBvZiBleHRyYSByYW5nZXMgZm9yCiAgICAgIGNhc2VsZXNzIHdpZGUgY2hhcmFjdGVycyB3aGVuIFVDUCBzdXBwb3J0IGlzIGF2YWlsYWJsZS4gSWYgdGhlcmUgYXJlIHdpZGUKICAgICAgY2hhcmFjdGVycywgd2UgYXJlIGdvaW5nIHRvIGhhdmUgdG8gdXNlIGFuIFhDTEFTUywgZXZlbiBmb3Igc2luZ2xlCiAgICAgIGNoYXJhY3RlcnMuICovCgogICAgICBlbHNlCiAgICAgICAgewogICAgICAgIGludCBkOwoKICAgICAgICBHRVRfT05FX0NIQVJBQ1RFUjoKCiNpZmRlZiBTVVBQT1JUX1VURjgKICAgICAgICBpZiAodXRmOCkKICAgICAgICAgIHsKICAgICAgICAgIGludCBleHRyYSA9IDA7CiAgICAgICAgICBHRVRDSEFSTEVOKGMsIHB0ciwgZXh0cmEpOwogICAgICAgICAgcHRyICs9IGV4dHJhOwogICAgICAgICAgfQogICAgICAgIGVsc2UgYyA9ICpwdHI7CiNlbHNlCiAgICAgICAgYyA9ICpwdHI7CiNlbmRpZgoKICAgICAgICAvKiBDb21lIGhlcmUgZnJvbSBoYW5kbGluZyBcIGFib3ZlIHdoZW4gaXQgZXNjYXBlcyB0byBhIGNoYXIgdmFsdWUgKi8KCiAgICAgICAgTk9OX1NQRUNJQUxfQ0hBUkFDVEVSOgogICAgICAgIGNsYXNzX29wdGNvdW50Kys7CgogICAgICAgIGQgPSAtMTsKICAgICAgICBpZiAocHRyWzFdID09ICctJykKICAgICAgICAgIHsKICAgICAgICAgIHVzY2hhciBjb25zdCAqaHlwdHIgPSBwdHIrKzsKICAgICAgICAgIGlmIChwdHJbMV0gPT0gJ1xcJykKICAgICAgICAgICAgewogICAgICAgICAgICBwdHIrKzsKICAgICAgICAgICAgZCA9IGNoZWNrX2VzY2FwZSgmcHRyLCBlcnJvcnB0ciwgYnJhY291bnQsIG9wdGlvbnMsIFRSVUUpOwogICAgICAgICAgICBpZiAoKmVycm9ycHRyICE9IE5VTEwpIGdvdG8gUENSRV9FUlJPUl9SRVRVUk47CiAgICAgICAgICAgIGlmICgtZCA9PSBFU0NfYikgZCA9ICdcYic7ICAgICAgICAvKiBiYWNrc3BhY2UgKi8KICAgICAgICAgICAgZWxzZSBpZiAoLWQgPT0gRVNDX1gpIGQgPSAnWCc7ICAgIC8qIGxpdGVyYWwgWCBpbiBhIGNsYXNzICovCiAgICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgaWYgKHB0clsxXSAhPSAwICYmIHB0clsxXSAhPSAnXScpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgcHRyKys7CiNpZmRlZiBTVVBQT1JUX1VURjgKICAgICAgICAgICAgaWYgKHV0ZjgpCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgIGludCBleHRyYSA9IDA7CiAgICAgICAgICAgICAgR0VUQ0hBUkxFTihkLCBwdHIsIGV4dHJhKTsKICAgICAgICAgICAgICBwdHIgKz0gZXh0cmE7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiNlbmRpZgogICAgICAgICAgICBkID0gKnB0cjsKICAgICAgICAgICAgfQogICAgICAgICAgaWYgKGQgPCAwKSBwdHIgPSBoeXB0cjsgICAgICAvKiBnbyBiYWNrIHRvIGh5cGhlbiBhcyBkYXRhICovCiAgICAgICAgICB9CgogICAgICAgIC8qIElmIGQgPj0gMCB3ZSBoYXZlIGEgcmFuZ2UuIEluIFVURi04IG1vZGUsIGlmIHRoZSBlbmQgaXMgPiAyNTUsIG9yID4KICAgICAgICAxMjcgZm9yIGNhc2VsZXNzIG1hdGNoaW5nLCB3ZSB3aWxsIG5lZWQgdG8gdXNlIGFuIFhDTEFTUy4gKi8KCiAgICAgICAgaWYgKGQgPj0gMCkKICAgICAgICAgIHsKICAgICAgICAgIGNsYXNzX29wdGNvdW50ID0gMTA7ICAgICAvKiBFbnN1cmUgPiAxICovCiAgICAgICAgICBpZiAoZCA8IGMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgKmVycm9ycHRyID0gRVJSODsKICAgICAgICAgICAgZ290byBQQ1JFX0VSUk9SX1JFVFVSTjsKICAgICAgICAgICAgfQoKI2lmZGVmIFNVUFBPUlRfVVRGOAogICAgICAgICAgaWYgKHV0ZjggJiYgKGQgPiAyNTUgfHwgKChvcHRpb25zICYgUENSRV9DQVNFTEVTUykgIT0gMCAmJiBkID4gMTI3KSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgdXNjaGFyIGJ1ZmZlcls2XTsKICAgICAgICAgICAgaWYgKCFjbGFzc191dGY4KSAgICAgICAgIC8qIEFsbG93IGZvciBYQ0xBU1Mgb3ZlcmhlYWQgKi8KICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgY2xhc3NfdXRmOCA9IFRSVUU7CiAgICAgICAgICAgICAgbGVuZ3RoICs9IExJTktfU0laRSArIDI7CiAgICAgICAgICAgICAgfQoKI2lmZGVmIFNVUFBPUlRfVUNQCiAgICAgICAgICAgIC8qIElmIHdlIGhhdmUgVUNQIHN1cHBvcnQsIGZpbmQgb3V0IGhvdyBtYW55IGV4dHJhIHJhbmdlcyBhcmUKICAgICAgICAgICAgbmVlZGVkIHRvIG1hcCB0aGUgb3RoZXIgY2FzZSBvZiBjaGFyYWN0ZXJzIHdpdGhpbiB0aGlzIHJhbmdlLiBXZQogICAgICAgICAgICBoYXZlIHRvIG1pbWljIHRoZSByYW5nZSBvcHRpbWl6YXRpb24gaGVyZSwgYmVjYXVzZSBleHRlbmRpbmcgdGhlCiAgICAgICAgICAgIHJhbmdlIHVwd2FyZHMgbWlnaHQgcHVzaCBkIG92ZXIgYSBib3VuZGFyeSB0aGF0IG1ha2VzIGlzIHVzZQogICAgICAgICAgICBhbm90aGVyIGJ5dGUgaW4gdGhlIFVURi04IHJlcHJlc2VudGF0aW9uLiAqLwoKICAgICAgICAgICAgaWYgKChvcHRpb25zICYgUENSRV9DQVNFTEVTUykgIT0gMCkKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgaW50IG9jYywgb2NkOwogICAgICAgICAgICAgIGludCBjYyA9IGM7CiAgICAgICAgICAgICAgaW50IG9yaWdkID0gZDsKICAgICAgICAgICAgICB3aGlsZSAoZ2V0X290aGVyY2FzZV9yYW5nZSgmY2MsIG9yaWdkLCAmb2NjLCAmb2NkKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChvY2MgPj0gYyAmJiBvY2QgPD0gZCkgY29udGludWU7ICAgLyogU2tpcCBlbWJlZGRlZCAqLwoKICAgICAgICAgICAgICAgIGlmIChvY2MgPCBjICAmJiBvY2QgPj0gYyAtIDEpICAvKiBFeHRlbmQgdGhlIGJhc2ljIHJhbmdlICovCiAgICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgdGhlcmUgaXMgb3ZlcmxhcCwgICAqLwogICAgICAgICAgICAgICAgICBjID0gb2NjOyAgICAgICAgICAgICAgICAgICAgIC8qIG5vdGluZyB0aGF0IGlmIG9jYyA8IGMgKi8KICAgICAgICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAgICAgICAgICAvKiB3ZSBjYW4ndCBoYXZlIG9jZCA+IGQgICovCiAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYmVjYXVzZSBhIHN1YnJhbmdlIGlzICAqLwogICAgICAgICAgICAgICAgaWYgKG9jZCA+IGQgJiYgb2NjIDw9IGQgKyAxKSAgIC8qIGFsd2F5cyBzaG9ydGVyIHRoYW4gICAgKi8KICAgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGUgYmFzaWMgcmFuZ2UuICAgICAgICovCiAgICAgICAgICAgICAgICAgIGQgPSBvY2Q7CiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyogQW4gZXh0cmEgaXRlbSBpcyBuZWVkZWQgKi8KCiAgICAgICAgICAgICAgICBsZW5ndGggKz0gMSArIG9yZDJ1dGY4KG9jYywgYnVmZmVyKSArCiAgICAgICAgICAgICAgICAgICgob2NjID09IG9jZCk/IDAgOiBvcmQydXRmOChvY2QsIGJ1ZmZlcikpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KI2VuZGlmICAvKiBTVVBQT1JUX1VDUCAqLwoKICAgICAgICAgICAgLyogVGhlIGxlbmd0aCBvZiB0aGUgKHBvc3NpYmx5IGV4dGVuZGVkKSByYW5nZSAqLwoKICAgICAgICAgICAgbGVuZ3RoICs9IDEgKyBvcmQydXRmOChjLCBidWZmZXIpICsgb3JkMnV0ZjgoZCwgYnVmZmVyKTsKICAgICAgICAgICAgfQojZW5kaWYgIC8qIFNVUFBPUlRfVVRGOCAqLwoKICAgICAgICAgIH0KCiAgICAgICAgLyogV2UgaGF2ZSBhIHNpbmdsZSBjaGFyYWN0ZXIuIFRoZXJlIGlzIG5vdGhpbmcgdG8gYmUgZG9uZSB1bmxlc3Mgd2UKICAgICAgICBhcmUgaW4gVVRGLTggbW9kZS4gSWYgdGhlIGNoYXIgaXMgPiAyNTUsIG9yIDEyNyB3aGVuIGNhc2VsZXNzLCB3ZSBtdXN0CiAgICAgICAgYWxsb3cgZm9yIGFuIFhDTF9TSU5HTEUgaXRlbSwgZG91YmxlZCBmb3IgY2FzZWxlc3NuZXNzIGlmIHRoZXJlIGlzIFVDUAogICAgICAgIHN1cHBvcnQuICovCgogICAgICAgIGVsc2UKICAgICAgICAgIHsKI2lmZGVmIFNVUFBPUlRfVVRGOAogICAgICAgICAgaWYgKHV0ZjggJiYgKGMgPiAyNTUgfHwgKChvcHRpb25zICYgUENSRV9DQVNFTEVTUykgIT0gMCAmJiBjID4gMTI3KSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgdXNjaGFyIGJ1ZmZlcls2XTsKICAgICAgICAgICAgY2xhc3Nfb3B0Y291bnQgPSAxMDsgICAgIC8qIEVuc3VyZSA+IDEgKi8KICAgICAgICAgICAgaWYgKCFjbGFzc191dGY4KSAgICAgICAgIC8qIEFsbG93IGZvciBYQ0xBU1Mgb3ZlcmhlYWQgKi8KICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgY2xhc3NfdXRmOCA9IFRSVUU7CiAgICAgICAgICAgICAgbGVuZ3RoICs9IExJTktfU0laRSArIDI7CiAgICAgICAgICAgICAgfQojaWZkZWYgU1VQUE9SVF9VQ1AKICAgICAgICAgICAgbGVuZ3RoICs9ICgoKG9wdGlvbnMgJiBQQ1JFX0NBU0VMRVNTKSAhPSAwKT8gMiA6IDEpICoKICAgICAgICAgICAgICAoMSArIG9yZDJ1dGY4KGMsIGJ1ZmZlcikpOwojZWxzZSAgIC8qIFNVUFBPUlRfVUNQICovCiAgICAgICAgICAgIGxlbmd0aCArPSAxICsgb3JkMnV0ZjgoYywgYnVmZmVyKTsKI2VuZGlmICAvKiBTVVBQT1JUX1VDUCAqLwogICAgICAgICAgICB9CiNlbmRpZiAgLyogU1VQUE9SVF9VVEY4ICovCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB3aGlsZSAoKigrK3B0cikgIT0gMCAmJiAoaW5lc2NxIHx8ICpwdHIgIT0gJ10nKSk7IC8qIENvbmNsdWRlcyAiZG8iIGFib3ZlICovCgogICAgaWYgKCpwdHIgPT0gMCkgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1pc3NpbmcgdGVybWluYXRpbmcgJ10nICovCiAgICAgIHsKICAgICAgKmVycm9ycHRyID0gRVJSNjsKICAgICAgZ290byBQQ1JFX0VSUk9SX1JFVFVSTjsKICAgICAgfQoKICAgIC8qIFdlIGNhbiBvcHRpbWl6ZSB3aGVuIHRoZXJlIHdhcyBvbmx5IG9uZSBvcHRpbWl6YWJsZSBjaGFyYWN0ZXIuIFJlcGVhdHMKICAgIGZvciBwb3NpdGl2ZSBhbmQgbmVnYXRlZCBzaW5nbGUgb25lLWJ5dGUgY2hhcnMgYXJlIGhhbmRsZWQgYnkgdGhlIGdlbmVyYWwKICAgIGNvZGUuIEhlcmUsIHdlIGhhbmRsZSByZXBlYXRzIGZvciB0aGUgY2xhc3Mgb3Bjb2Rlcy4gKi8KCiAgICBpZiAoY2xhc3Nfb3B0Y291bnQgPT0gMSkgbGVuZ3RoICs9IDM7IGVsc2UKICAgICAgewogICAgICBsZW5ndGggKz0gMzM7CgogICAgICAvKiBBIHJlcGVhdCBuZWVkcyBlaXRoZXIgMSBvciA1IGJ5dGVzLiBJZiBpdCBpcyBhIHBvc3Nlc3NpdmUgcXVhbnRpZmllciwKICAgICAgd2UgYWxzbyBuZWVkIGV4dHJhIGZvciB3cmFwcGluZyB0aGUgd2hvbGUgdGhpbmcgaW4gYSBzdWItcGF0dGVybi4gKi8KCiAgICAgIGlmICgqcHRyICE9IDAgJiYgcHRyWzFdID09ICd7JyAmJiBpc19jb3VudGVkX3JlcGVhdChwdHIrMikpCiAgICAgICAgewogICAgICAgIHB0ciA9IHJlYWRfcmVwZWF0X2NvdW50cyhwdHIrMiwgJm1pbiwgJm1heCwgZXJyb3JwdHIpOwogICAgICAgIGlmICgqZXJyb3JwdHIgIT0gTlVMTCkgZ290byBQQ1JFX0VSUk9SX1JFVFVSTjsKICAgICAgICBpZiAoKG1pbiA9PSAwICYmIChtYXggPT0gMSB8fCBtYXggPT0gLTEpKSB8fAogICAgICAgICAgKG1pbiA9PSAxICYmIG1heCA9PSAtMSkpCiAgICAgICAgICAgIGxlbmd0aCsrOwogICAgICAgIGVsc2UgbGVuZ3RoICs9IDU7CiAgICAgICAgaWYgKHB0clsxXSA9PSAnKycpCiAgICAgICAgICB7CiAgICAgICAgICBwdHIrKzsKICAgICAgICAgIGxlbmd0aCArPSAyICsgMipMSU5LX1NJWkU7CiAgICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAocHRyWzFdID09ICc/JykgcHRyKys7CiAgICAgICAgfQogICAgICB9CiAgICBjb250aW51ZTsKCiAgICAvKiBCcmFja2V0cyBtYXkgYmUgZ2VudWluZSBncm91cHMgb3Igc3BlY2lhbCB0aGluZ3MgKi8KCiAgICBjYXNlICcoJzoKICAgIGJyYW5jaF9uZXdleHRyYSA9IDA7CiAgICBicmFja2V0X2xlbmd0aCA9IDEgKyBMSU5LX1NJWkU7CgogICAgLyogSGFuZGxlIHNwZWNpYWwgZm9ybXMgb2YgYnJhY2tldCwgd2hpY2ggYWxsIHN0YXJ0ICg/ICovCgogICAgaWYgKHB0clsxXSA9PSAnPycpCiAgICAgIHsKICAgICAgaW50IHNldCwgdW5zZXQ7CiAgICAgIGludCAqb3B0c2V0OwoKICAgICAgc3dpdGNoIChjID0gcHRyWzJdKQogICAgICAgIHsKICAgICAgICAvKiBTa2lwIG92ZXIgY29tbWVudHMgZW50aXJlbHkgKi8KICAgICAgICBjYXNlICcjJzoKICAgICAgICBwdHIgKz0gMzsKICAgICAgICB3aGlsZSAoKnB0ciAhPSAwICYmICpwdHIgIT0gJyknKSBwdHIrKzsKICAgICAgICBpZiAoKnB0ciA9PSAwKQogICAgICAgICAgewogICAgICAgICAgKmVycm9ycHRyID0gRVJSMTg7CiAgICAgICAgICBnb3RvIFBDUkVfRVJST1JfUkVUVVJOOwogICAgICAgICAgfQogICAgICAgIGNvbnRpbnVlOwoKICAgICAgICAvKiBOb24tcmVmZXJlbmNpbmcgZ3JvdXBzIGFuZCBsb29rYWhlYWRzIGp1c3QgbW92ZSB0aGUgcG9pbnRlciBvbiwgYW5kCiAgICAgICAgdGhlbiBiZWhhdmUgbGlrZSBhIG5vbi1zcGVjaWFsIGJyYWNrZXQsIGV4Y2VwdCB0aGF0IHRoZXkgZG9uJ3QgaW5jcmVtZW50CiAgICAgICAgdGhlIGNvdW50IG9mIGV4dHJhY3RpbmcgYnJhY2tldHMuIERpdHRvIGZvciB0aGUgIm9uY2Ugb25seSIgYnJhY2tldCwKICAgICAgICB3aGljaCBpcyBpbiBQZXJsIGZyb20gdmVyc2lvbiA1LjAwNS4gKi8KCiAgICAgICAgY2FzZSAnOic6CiAgICAgICAgY2FzZSAnPSc6CiAgICAgICAgY2FzZSAnISc6CiAgICAgICAgY2FzZSAnPic6CiAgICAgICAgcHRyICs9IDI7CiAgICAgICAgYnJlYWs7CgogICAgICAgIC8qICg/Uikgc3BlY2lmaWVzIGEgcmVjdXJzaXZlIGNhbGwgdG8gdGhlIHJlZ2V4LCB3aGljaCBpcyBhbiBleHRlbnNpb24KICAgICAgICB0byBwcm92aWRlIHRoZSBmYWNpbGl0eSB3aGljaCBjYW4gYmUgb2J0YWluZWQgYnkgKD9we3BlcmwtY29kZX0pIGluCiAgICAgICAgUGVybCA1LjYuIEluIFBlcmwgNS44IHRoaXMgaGFzIGJlY29tZSAoPz97cGVybC1jb2RlfSkuCgogICAgICAgIEZyb20gUENSRSA0LjAwLCBpdGVtcyBzdWNoIGFzICg/Mykgc3BlY2lmeSBzdWJyb3V0aW5lLWxpa2UgImNhbGxzIiB0bwogICAgICAgIHRoZSBhcHByb3ByaWF0ZSBudW1iZXJlZCBicmFja2V0cy4gVGhpcyBpbmNsdWRlcyBib3RoIHJlY3Vyc2l2ZSBhbmQKICAgICAgICBub24tcmVjdXJzaXZlIGNhbGxzLiAoP1IpIGlzIG5vdyBzeW5vbnltb3VzIHdpdGggKD8wKS4gKi8KCiAgICAgICAgY2FzZSAnUic6CiAgICAgICAgcHRyKys7CgogICAgICAgIGNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzoKICAgICAgICBjYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOiBjYXNlICc4JzogY2FzZSAnOSc6CiAgICAgICAgcHRyICs9IDI7CiAgICAgICAgaWYgKGMgIT0gJ1InKQogICAgICAgICAgd2hpbGUgKChkaWdpdGFiWyooKytwdHIpXSAmIGN0eXBlX2RpZ2l0KSAhPSAwKTsKICAgICAgICBpZiAoKnB0ciAhPSAnKScpCiAgICAgICAgICB7CiAgICAgICAgICAqZXJyb3JwdHIgPSBFUlIyOTsKICAgICAgICAgIGdvdG8gUENSRV9FUlJPUl9SRVRVUk47CiAgICAgICAgICB9CiAgICAgICAgbGVuZ3RoICs9IDEgKyBMSU5LX1NJWkU7CgogICAgICAgIC8qIElmIHRoaXMgaXRlbSBpcyBxdWFudGlmaWVkLCBpdCB3aWxsIGdldCB3cmFwcGVkIGluc2lkZSBicmFja2V0cyBzbwogICAgICAgIGFzIHRvIHVzZSB0aGUgY29kZSBmb3IgcXVhbnRpZmllZCBicmFja2V0cy4gV2UganVtcCBkb3duIGFuZCB1c2UgdGhlCiAgICAgICAgY29kZSB0aGF0IGhhbmRsZXMgdGhpcyBmb3IgcmVhbCBicmFja2V0cy4gKi8KCiAgICAgICAgaWYgKHB0clsxXSA9PSAnKycgfHwgcHRyWzFdID09ICcqJyB8fCBwdHJbMV0gPT0gJz8nIHx8IHB0clsxXSA9PSAneycpCiAgICAgICAgICB7CiAgICAgICAgICBsZW5ndGggKz0gMiArIDIgKiBMSU5LX1NJWkU7ICAgICAgIC8qIHRvIG1ha2UgYnJhY2tldGVkICovCiAgICAgICAgICBkdXBsZW5ndGggPSA1ICsgMyAqIExJTktfU0laRTsKICAgICAgICAgIGdvdG8gSEFORExFX1FVQU5USUZJRURfQlJBQ0tFVFM7CiAgICAgICAgICB9CiAgICAgICAgY29udGludWU7CgogICAgICAgIC8qICg/QykgaXMgYW4gZXh0ZW5zaW9uIHdoaWNoIHByb3ZpZGVzICJjYWxsb3V0IiAtIHRvIHByb3ZpZGUgYSBiaXQgb2YKICAgICAgICB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgUGVybCAoP3suLi59KSBmZWF0dXJlLiBBbiBvcHRpb25hbCBudW1iZXIgbWF5CiAgICAgICAgZm9sbG93IChkZWZhdWx0IGlzIHplcm8pLiAqLwoKICAgICAgICBjYXNlICdDJzoKICAgICAgICBwdHIgKz0gMjsKICAgICAgICB3aGlsZSAoKGRpZ2l0YWJbKigrK3B0cildICYgY3R5cGVfZGlnaXQpICE9IDApOwogICAgICAgIGlmICgqcHRyICE9ICcpJykKICAgICAgICAgIHsKICAgICAgICAgICplcnJvcnB0ciA9IEVSUjM5OwogICAgICAgICAgZ290byBQQ1JFX0VSUk9SX1JFVFVSTjsKICAgICAgICAgIH0KICAgICAgICBsZW5ndGggKz0gMiArIDIqTElOS19TSVpFOwogICAgICAgIGNvbnRpbnVlOwoKICAgICAgICAvKiBOYW1lZCBzdWJwYXR0ZXJucyBhcmUgYW4gZXh0ZW5zaW9uIGNvcGllZCBmcm9tIFB5dGhvbiAqLwoKICAgICAgICBjYXNlICdQJzoKICAgICAgICBwdHIgKz0gMzsKICAgICAgICBpZiAoKnB0ciA9PSAnPCcpCiAgICAgICAgICB7CiAgICAgICAgICBjb25zdCB1c2NoYXIgKnA7ICAgIC8qIERvbid0IGFtYWxnYW1hdGU7IHNvbWUgY29tcGlsZXJzICovCiAgICAgICAgICBwID0gKytwdHI7ICAgICAgICAgIC8qIGdydW1ibGUgYXQgYXV0b2luY3JlbWVudCBpbiBkZWNsYXJhdGlvbiAqLwogICAgICAgICAgd2hpbGUgKChjb21waWxlX2Jsb2NrLmN0eXBlc1sqcHRyXSAmIGN0eXBlX3dvcmQpICE9IDApIHB0cisrOwogICAgICAgICAgaWYgKCpwdHIgIT0gJz4nKQogICAgICAgICAgICB7CiAgICAgICAgICAgICplcnJvcnB0ciA9IEVSUjQyOwogICAgICAgICAgICBnb3RvIFBDUkVfRVJST1JfUkVUVVJOOwogICAgICAgICAgICB9CiAgICAgICAgICBuYW1lX2NvdW50Kys7CiAgICAgICAgICBpZiAocHRyIC0gcCA+IG1heF9uYW1lX3NpemUpIG1heF9uYW1lX3NpemUgPSAocHRyIC0gcCk7CiAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KCiAgICAgICAgaWYgKCpwdHIgPT0gJz0nIHx8ICpwdHIgPT0gJz4nKQogICAgICAgICAgewogICAgICAgICAgd2hpbGUgKChjb21waWxlX2Jsb2NrLmN0eXBlc1sqKCsrcHRyKV0gJiBjdHlwZV93b3JkKSAhPSAwKTsKICAgICAgICAgIGlmICgqcHRyICE9ICcpJykKICAgICAgICAgICAgewogICAgICAgICAgICAqZXJyb3JwdHIgPSBFUlI0MjsKICAgICAgICAgICAgZ290byBQQ1JFX0VSUk9SX1JFVFVSTjsKICAgICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CgogICAgICAgIC8qIFVua25vd24gY2hhcmFjdGVyIGFmdGVyICg/UCAqLwoKICAgICAgICAqZXJyb3JwdHIgPSBFUlI0MTsKICAgICAgICBnb3RvIFBDUkVfRVJST1JfUkVUVVJOOwoKICAgICAgICAvKiBMb29rYmVoaW5kcyBhcmUgaW4gUGVybCBmcm9tIHZlcnNpb24gNS4wMDUgKi8KCiAgICAgICAgY2FzZSAnPCc6CiAgICAgICAgcHRyICs9IDM7CiAgICAgICAgaWYgKCpwdHIgPT0gJz0nIHx8ICpwdHIgPT0gJyEnKQogICAgICAgICAgewogICAgICAgICAgYnJhbmNoX25ld2V4dHJhID0gMSArIExJTktfU0laRTsKICAgICAgICAgIGxlbmd0aCArPSAxICsgTElOS19TSVpFOyAgICAgICAgIC8qIEZvciB0aGUgZmlyc3QgYnJhbmNoICovCiAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAqZXJyb3JwdHIgPSBFUlIyNDsKICAgICAgICBnb3RvIFBDUkVfRVJST1JfUkVUVVJOOwoKICAgICAgICAvKiBDb25kaXRpb25hbHMgYXJlIGluIFBlcmwgZnJvbSB2ZXJzaW9uIDUuMDA1LiBUaGUgYnJhY2tldCBtdXN0IGVpdGhlcgogICAgICAgIGJlIGZvbGxvd2VkIGJ5IGEgbnVtYmVyIChmb3IgYnJhY2tldCByZWZlcmVuY2UpIG9yIGJ5IGFuIGFzc2VydGlvbgogICAgICAgIGdyb3VwLCBvciAoYSBQQ1JFIGV4dGVuc2lvbikgYnkgJ1InIGZvciBhIHJlY3Vyc2lvbiB0ZXN0LiAqLwoKICAgICAgICBjYXNlICcoJzoKICAgICAgICBpZiAocHRyWzNdID09ICdSJyAmJiBwdHJbNF0gPT0gJyknKQogICAgICAgICAgewogICAgICAgICAgcHRyICs9IDQ7CiAgICAgICAgICBsZW5ndGggKz0gMzsKICAgICAgICAgIH0KICAgICAgICBlbHNlIGlmICgoZGlnaXRhYltwdHJbM11dICYgY3R5cGVfZGlnaXQpICE9IDApCiAgICAgICAgICB7CiAgICAgICAgICBwdHIgKz0gNDsKICAgICAgICAgIGxlbmd0aCArPSAzOwogICAgICAgICAgd2hpbGUgKChkaWdpdGFiWypwdHJdICYgY3R5cGVfZGlnaXQpICE9IDApIHB0cisrOwogICAgICAgICAgaWYgKCpwdHIgIT0gJyknKQogICAgICAgICAgICB7CiAgICAgICAgICAgICplcnJvcnB0ciA9IEVSUjI2OwogICAgICAgICAgICBnb3RvIFBDUkVfRVJST1JfUkVUVVJOOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgZWxzZSAgIC8qIEFuIGFzc2VydGlvbiBtdXN0IGZvbGxvdyAqLwogICAgICAgICAgewogICAgICAgICAgcHRyKys7ICAgLyogQ2FuIHRyZWF0IGxpa2UgJzonIGFzIGZhciBhcyBzcGFjaW5nIGlzIGNvbmNlcm5lZCAqLwogICAgICAgICAgaWYgKHB0clsyXSAhPSAnPycgfHwKICAgICAgICAgICAgIChwdHJbM10gIT0gJz0nICYmIHB0clszXSAhPSAnIScgJiYgcHRyWzNdICE9ICc8JykgKQogICAgICAgICAgICB7CiAgICAgICAgICAgIHB0ciArPSAyOyAgICAvKiBUbyBnZXQgcmlnaHQgb2Zmc2V0IGluIG1lc3NhZ2UgKi8KICAgICAgICAgICAgKmVycm9ycHRyID0gRVJSMjg7CiAgICAgICAgICAgIGdvdG8gUENSRV9FUlJPUl9SRVRVUk47CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICAgICAgLyogRWxzZSBsb29wIGNoZWNraW5nIHZhbGlkIG9wdGlvbnMgdW50aWwgKSBpcyBtZXQuIEFueXRoaW5nIGVsc2UgaXMgYW4KICAgICAgICBlcnJvci4gSWYgd2UgYXJlIHdpdGhvdXQgYW55IGJyYWNrZXRzLCBpLmUuIGF0IHRvcCBsZXZlbCwgdGhlIHNldHRpbmdzCiAgICAgICAgYWN0IGFzIGlmIHNwZWNpZmllZCBpbiB0aGUgb3B0aW9ucywgc28gbWFzc2FnZSB0aGUgb3B0aW9ucyBpbW1lZGlhdGVseS4KICAgICAgICBUaGlzIGlzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggUGVybCA1LjAwNC4gKi8KCiAgICAgICAgZGVmYXVsdDoKICAgICAgICBzZXQgPSB1bnNldCA9IDA7CiAgICAgICAgb3B0c2V0ID0gJnNldDsKICAgICAgICBwdHIgKz0gMjsKCiAgICAgICAgZm9yICg7OyBwdHIrKykKICAgICAgICAgIHsKICAgICAgICAgIGMgPSAqcHRyOwogICAgICAgICAgc3dpdGNoIChjKQogICAgICAgICAgICB7CiAgICAgICAgICAgIGNhc2UgJ2knOgogICAgICAgICAgICAqb3B0c2V0IHw9IFBDUkVfQ0FTRUxFU1M7CiAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICAgICAgY2FzZSAnbSc6CiAgICAgICAgICAgICpvcHRzZXQgfD0gUENSRV9NVUxUSUxJTkU7CiAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICAgICAgY2FzZSAncyc6CiAgICAgICAgICAgICpvcHRzZXQgfD0gUENSRV9ET1RBTEw7CiAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICAgICAgY2FzZSAneCc6CiAgICAgICAgICAgICpvcHRzZXQgfD0gUENSRV9FWFRFTkRFRDsKICAgICAgICAgICAgY29udGludWU7CgogICAgICAgICAgICBjYXNlICdYJzoKICAgICAgICAgICAgKm9wdHNldCB8PSBQQ1JFX0VYVFJBOwogICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgICAgIGNhc2UgJ1UnOgogICAgICAgICAgICAqb3B0c2V0IHw9IFBDUkVfVU5HUkVFRFk7CiAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICAgICAgY2FzZSAnLSc6CiAgICAgICAgICAgIG9wdHNldCA9ICZ1bnNldDsKICAgICAgICAgICAgY29udGludWU7CgogICAgICAgICAgICAvKiBBIHRlcm1pbmF0aW9uIGJ5ICcpJyBpbmRpY2F0ZXMgYW4gb3B0aW9ucy1zZXR0aW5nLW9ubHkgaXRlbTsgaWYKICAgICAgICAgICAgdGhpcyBpcyBhdCB0aGUgdmVyeSBzdGFydCBvZiB0aGUgcGF0dGVybiAoaW5kaWNhdGVkIGJ5IGl0ZW1fY291bnQKICAgICAgICAgICAgYmVpbmcgemVybyksIHdlIHVzZSBpdCB0byBzZXQgdGhlIGdsb2JhbCBvcHRpb25zLiBUaGlzIGlzIGhlbHBmdWwKICAgICAgICAgICAgd2hlbiBhbmFseXppbmcgdGhlIHBhdHRlcm4gZm9yIGZpcnN0IGNoYXJhY3RlcnMsIGV0Yy4gT3RoZXJ3aXNlCiAgICAgICAgICAgIG5vdGhpbmcgaXMgZG9uZSBoZXJlIGFuZCBpdCBpcyBoYW5kbGVkIGR1cmluZyB0aGUgY29tcGlsaW5nCiAgICAgICAgICAgIHByb2Nlc3MuCgogICAgICAgICAgICBbSGlzdG9yaWNhbCBub3RlOiBVcCB0byBQZXJsIDUuOCwgb3B0aW9ucyBzZXR0aW5ncyBhdCB0b3AgbGV2ZWwKICAgICAgICAgICAgd2VyZSBhbHdheXMgZ2xvYmFsIHNldHRpbmdzLCB3aGVyZXZlciB0aGV5IGFwcGVhcmVkIGluIHRoZSBwYXR0ZXJuLgogICAgICAgICAgICBUaGF0IGlzLCB0aGV5IHdlcmUgZXF1aXZhbGVudCB0byBhbiBleHRlcm5hbCBzZXR0aW5nLiBGcm9tIDUuOAogICAgICAgICAgICBvbndhcmRzLCB0aGV5IGFwcGx5IG9ubHkgdG8gd2hhdCBmb2xsb3dzICh3aGljaCBpcyB3aGF0IHlvdSBtaWdodAogICAgICAgICAgICBleHBlY3QpLl0gKi8KCiAgICAgICAgICAgIGNhc2UgJyknOgogICAgICAgICAgICBpZiAoaXRlbV9jb3VudCA9PSAwKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICBvcHRpb25zID0gKG9wdGlvbnMgfCBzZXQpICYgKH51bnNldCk7CiAgICAgICAgICAgICAgc2V0ID0gdW5zZXQgPSAwOyAgICAgLyogVG8gc2F2ZSBsZW5ndGggKi8KICAgICAgICAgICAgICBpdGVtX2NvdW50LS07ICAgICAgICAvKiBUbyBhbGxvdyBmb3Igc2V2ZXJhbCAqLwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qIEZhbGwgdGhyb3VnaCAqLwoKICAgICAgICAgICAgLyogQSB0ZXJtaW5hdGlvbiBieSAnOicgaW5kaWNhdGVzIHRoZSBzdGFydCBvZiBhIG5lc3RlZCBncm91cCB3aXRoCiAgICAgICAgICAgIHRoZSBnaXZlbiBvcHRpb25zIHNldC4gVGhpcyBpcyBhZ2FpbiBoYW5kbGVkIGF0IGNvbXBpbGUgdGltZSwgYnV0CiAgICAgICAgICAgIHdlIG11c3QgYWxsb3cgZm9yIGNvbXBpbGVkIHNwYWNlIGlmIGFueSBvZiB0aGUgaW1zIG9wdGlvbnMgYXJlCiAgICAgICAgICAgIHNldC4gV2UgYWxzbyBoYXZlIHRvIGFsbG93IGZvciByZXNldHRpbmcgc3BhY2UgYXQgdGhlIGVuZCBvZgogICAgICAgICAgICB0aGUgZ3JvdXAsIHdoaWNoIGlzIHdoeSA0IGlzIGFkZGVkIHRvIHRoZSBsZW5ndGggYW5kIG5vdCBqdXN0IDIuCiAgICAgICAgICAgIElmIHRoZXJlIGFyZSBzZXZlcmFsIGNoYW5nZXMgb2Ygb3B0aW9ucyB3aXRoaW4gdGhlIHNhbWUgZ3JvdXAsIHRoaXMKICAgICAgICAgICAgd2lsbCBsZWFkIHRvIGFuIG92ZXItZXN0aW1hdGUgb24gdGhlIGxlbmd0aCwgYnV0IHRoaXMgc2hvdWxkbid0CiAgICAgICAgICAgIG1hdHRlciB2ZXJ5IG11Y2guIFdlIGFsc28gaGF2ZSB0byBhbGxvdyBmb3IgcmVzZXR0aW5nIG9wdGlvbnMgYXQKICAgICAgICAgICAgdGhlIHN0YXJ0IG9mIGFueSBhbHRlcm5hdGlvbnMsIHdoaWNoIHdlIGRvIGJ5IHNldHRpbmcKICAgICAgICAgICAgYnJhbmNoX25ld2V4dHJhIHRvIDIuIEZpbmFsbHksIHdlIHJlY29yZCB3aGV0aGVyIHRoZSBjYXNlLWRlcGVuZGVudAogICAgICAgICAgICBmbGFnIGV2ZXIgY2hhbmdlcyB3aXRoaW4gdGhlIHJlZ2V4LiBUaGlzIGlzIHVzZWQgYnkgdGhlICJyZXF1aXJlZAogICAgICAgICAgICBjaGFyYWN0ZXIiIGNvZGUuICovCgogICAgICAgICAgICBjYXNlICc6JzoKICAgICAgICAgICAgaWYgKCgoc2V0fHVuc2V0KSAmIFBDUkVfSU1TKSAhPSAwKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICBsZW5ndGggKz0gNDsKICAgICAgICAgICAgICBicmFuY2hfbmV3ZXh0cmEgPSAyOwogICAgICAgICAgICAgIGlmICgoKHNldHx1bnNldCkgJiBQQ1JFX0NBU0VMRVNTKSAhPSAwKSBvcHRpb25zIHw9IFBDUkVfSUNIQU5HRUQ7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICBnb3RvIEVORF9PUFRJT05TOwoKICAgICAgICAgICAgLyogVW5yZWNvZ25pemVkIG9wdGlvbiBjaGFyYWN0ZXIgKi8KCiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICplcnJvcnB0ciA9IEVSUjEyOwogICAgICAgICAgICBnb3RvIFBDUkVfRVJST1JfUkVUVVJOOwogICAgICAgICAgICB9CiAgICAgICAgICB9CgogICAgICAgIC8qIElmIHdlIGhpdCBhIGNsb3NpbmcgYnJhY2tldCwgdGhhdCdzIGl0IC0gdGhpcyBpcyBhIGZyZWVzdGFuZGluZwogICAgICAgIG9wdGlvbi1zZXR0aW5nLiBXZSBuZWVkIHRvIGVuc3VyZSB0aGF0IGJyYW5jaF9leHRyYSBpcyB1cGRhdGVkIGlmCiAgICAgICAgbmVjZXNzYXJ5LiBUaGUgb25seSB2YWx1ZXMgYnJhbmNoX25ld2V4dHJhIGNhbiBoYXZlIGhlcmUgYXJlIDAgb3IgMi4KICAgICAgICBJZiB0aGUgdmFsdWUgaXMgMiwgdGhlbiBicmFuY2hfZXh0cmEgbXVzdCBlaXRoZXIgYmUgMiBvciA1LCBkZXBlbmRpbmcKICAgICAgICBvbiB3aGV0aGVyIHRoaXMgaXMgYSBsb29rYmVoaW5kIGdyb3VwIG9yIG5vdC4gKi8KCiAgICAgICAgRU5EX09QVElPTlM6CiAgICAgICAgaWYgKGMgPT0gJyknKQogICAgICAgICAgewogICAgICAgICAgaWYgKGJyYW5jaF9uZXdleHRyYSA9PSAyICYmCiAgICAgICAgICAgICAgKGJyYW5jaF9leHRyYSA9PSAwIHx8IGJyYW5jaF9leHRyYSA9PSAxK0xJTktfU0laRSkpCiAgICAgICAgICAgIGJyYW5jaF9leHRyYSArPSBicmFuY2hfbmV3ZXh0cmE7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KCiAgICAgICAgLyogSWYgb3B0aW9ucyB3ZXJlIHRlcm1pbmF0ZWQgYnkgJzonIGNvbnRyb2wgY29tZXMgaGVyZS4gRmFsbCB0aHJvdWdoCiAgICAgICAgdG8gaGFuZGxlIHRoZSBncm91cCBiZWxvdy4gKi8KICAgICAgICB9CiAgICAgIH0KCiAgICAvKiBFeHRyYWN0aW5nIGJyYWNrZXRzIG11c3QgYmUgY291bnRlZCBzbyB3ZSBjYW4gcHJvY2VzcyBlc2NhcGVzIGluIGEKICAgIFBlcmxpc2ggd2F5LiBJZiB0aGUgbnVtYmVyIGV4Y2VlZHMgRVhUUkFDVF9CQVNJQ19NQVggd2UgYXJlIGdvaW5nIHRvCiAgICBuZWVkIGFuIGFkZGl0aW9uYWwgMyBieXRlcyBvZiBzdG9yZSBwZXIgZXh0cmFjdGluZyBicmFja2V0LiBIb3dldmVyLCBpZgogICAgUENSRV9OT19BVVRPKUNBUFRVUkUgaXMgc2V0LCB1bmFkb3JuZWQgYnJhY2tldHMgYmVjb21lIG5vbi1jYXB0dXJpbmcsIHNvIHdlCiAgICBtdXN0IGxlYXZlIHRoZSBjb3VudCBhbG9uZSAoaXQgd2lsbCBhd2F5cyBiZSB6ZXJvKS4gKi8KCiAgICBlbHNlIGlmICgob3B0aW9ucyAmIFBDUkVfTk9fQVVUT19DQVBUVVJFKSA9PSAwKQogICAgICB7CiAgICAgIGJyYWNvdW50Kys7CiAgICAgIGlmIChicmFjb3VudCA+IEVYVFJBQ1RfQkFTSUNfTUFYKSBicmFja2V0X2xlbmd0aCArPSAzOwogICAgICB9CgogICAgLyogU2F2ZSBsZW5ndGggZm9yIGNvbXB1dGluZyB3aG9sZSBsZW5ndGggYXQgZW5kIGlmIHRoZXJlJ3MgYSByZXBlYXQgdGhhdAogICAgcmVxdWlyZXMgZHVwbGljYXRpb24gb2YgdGhlIGdyb3VwLiBBbHNvIHNhdmUgdGhlIGN1cnJlbnQgdmFsdWUgb2YKICAgIGJyYW5jaF9leHRyYSwgYW5kIHN0YXJ0IHRoZSBuZXcgZ3JvdXAgd2l0aCB0aGUgbmV3IHZhbHVlLiBJZiBub24temVybywgdGhpcwogICAgd2lsbCBlaXRoZXIgYmUgMiBmb3IgYSAoP2ltc3g6IGdyb3VwLCBvciAzIGZvciBhIGxvb2tiZWhpbmQgYXNzZXJ0aW9uLiAqLwoKICAgIGlmIChicmFzdGFja3B0ciA+PSBzaXplb2YoYnJhc3RhY2spL3NpemVvZihpbnQpKQogICAgICB7CiAgICAgICplcnJvcnB0ciA9IEVSUjE5OwogICAgICBnb3RvIFBDUkVfRVJST1JfUkVUVVJOOwogICAgICB9CgogICAgYnJhbGVuc3RhY2tbYnJhc3RhY2twdHJdID0gYnJhbmNoX2V4dHJhOwogICAgYnJhbmNoX2V4dHJhID0gYnJhbmNoX25ld2V4dHJhOwoKICAgIGJyYXN0YWNrW2JyYXN0YWNrcHRyKytdID0gbGVuZ3RoOwogICAgbGVuZ3RoICs9IGJyYWNrZXRfbGVuZ3RoOwogICAgY29udGludWU7CgogICAgLyogSGFuZGxlIGtldC4gTG9vayBmb3Igc3Vic2VxdWVudCBtYXgvbWluOyBmb3IgY2VydGFpbiBzZXRzIG9mIHZhbHVlcyB3ZQogICAgaGF2ZSB0byByZXBsaWNhdGUgdGhpcyBicmFja2V0IHVwIHRvIHRoYXQgbWFueSB0aW1lcy4gSWYgYnJhc3RhY2twdHIgaXMKICAgIDAgdGhpcyBpcyBhbiB1bm1hdGNoZWQgYnJhY2tldCB3aGljaCB3aWxsIGdlbmVyYXRlIGFuIGVycm9yLCBidXQgdGFrZSBjYXJlCiAgICBub3QgdG8gdHJ5IHRvIGFjY2VzcyBicmFzdGFja1stMV0gd2hlbiBjb21wdXRpbmcgdGhlIGxlbmd0aCBhbmQgcmVzdG9yaW5nCiAgICB0aGUgYnJhbmNoX2V4dHJhIHZhbHVlLiAqLwoKICAgIGNhc2UgJyknOgogICAgbGVuZ3RoICs9IDEgKyBMSU5LX1NJWkU7CiAgICBpZiAoYnJhc3RhY2twdHIgPiAwKQogICAgICB7CiAgICAgIGR1cGxlbmd0aCA9IGxlbmd0aCAtIGJyYXN0YWNrWy0tYnJhc3RhY2twdHJdOwogICAgICBicmFuY2hfZXh0cmEgPSBicmFsZW5zdGFja1ticmFzdGFja3B0cl07CiAgICAgIH0KICAgIGVsc2UgZHVwbGVuZ3RoID0gMDsKCiAgICAvKiBUaGUgZm9sbG93aW5nIGNvZGUgaXMgYWxzbyB1c2VkIHdoZW4gYSByZWN1cnNpb24gc3VjaCBhcyAoPzMpIGlzCiAgICBmb2xsb3dlZCBieSBhIHF1YW50aWZpZXIsIGJlY2F1c2UgaW4gdGhhdCBjYXNlLCBpdCBoYXMgdG8gYmUgd3JhcHBlZCBpbnNpZGUKICAgIGJyYWNrZXRzIHNvIHRoYXQgdGhlIHF1YW50aWZpZXIgd29ya3MuIFRoZSB2YWx1ZSBvZiBkdXBsZW5ndGggbXVzdCBiZQogICAgc2V0IGJlZm9yZSBhcnJpdmFsLiAqLwoKICAgIEhBTkRMRV9RVUFOVElGSUVEX0JSQUNLRVRTOgoKICAgIC8qIExlYXZlIHB0ciBhdCB0aGUgZmluYWwgY2hhcjsgZm9yIHJlYWRfcmVwZWF0X2NvdW50cyB0aGlzIGhhcHBlbnMKICAgIGF1dG9tYXRpY2FsbHk7IGZvciB0aGUgb3RoZXJzIHdlIG5lZWQgYW4gaW5jcmVtZW50LiAqLwoKICAgIGlmICgoYyA9IHB0clsxXSkgPT0gJ3snICYmIGlzX2NvdW50ZWRfcmVwZWF0KHB0cisyKSkKICAgICAgewogICAgICBwdHIgPSByZWFkX3JlcGVhdF9jb3VudHMocHRyKzIsICZtaW4sICZtYXgsIGVycm9ycHRyKTsKICAgICAgaWYgKCplcnJvcnB0ciAhPSBOVUxMKSBnb3RvIFBDUkVfRVJST1JfUkVUVVJOOwogICAgICB9CiAgICBlbHNlIGlmIChjID09ICcqJykgeyBtaW4gPSAwOyBtYXggPSAtMTsgcHRyKys7IH0KICAgIGVsc2UgaWYgKGMgPT0gJysnKSB7IG1pbiA9IDE7IG1heCA9IC0xOyBwdHIrKzsgfQogICAgZWxzZSBpZiAoYyA9PSAnPycpIHsgbWluID0gMDsgbWF4ID0gMTsgIHB0cisrOyB9CiAgICBlbHNlIHsgbWluID0gMTsgbWF4ID0gMTsgfQoKICAgIC8qIElmIHRoZSBtaW5pbXVtIGlzIHplcm8sIHdlIGhhdmUgdG8gYWxsb3cgZm9yIGFuIE9QX0JSQVpFUk8gYmVmb3JlIHRoZQogICAgZ3JvdXAsIGFuZCBpZiB0aGUgbWF4aW11bSBpcyBncmVhdGVyIHRoYW4gemVybywgd2UgaGF2ZSB0byByZXBsaWNhdGUKICAgIG1heHZhbC0xIHRpbWVzOyBlYWNoIHJlcGxpY2F0aW9uIGFjcXVpcmVzIGFuIE9QX0JSQVpFUk8gcGx1cyBhIG5lc3RpbmcKICAgIGJyYWNrZXQgc2V0LiAqLwoKICAgIGlmIChtaW4gPT0gMCkKICAgICAgewogICAgICBsZW5ndGgrKzsKICAgICAgaWYgKG1heCA+IDApIGxlbmd0aCArPSAobWF4IC0gMSkgKiAoZHVwbGVuZ3RoICsgMyArIDIqTElOS19TSVpFKTsKICAgICAgfQoKICAgIC8qIFdoZW4gdGhlIG1pbmltdW0gaXMgZ3JlYXRlciB0aGFuIHplcm8sIHdlIGhhdmUgdG8gcmVwbGljYXRlIHVwIHRvCiAgICBtaW52YWwtMSB0aW1lcywgd2l0aCBubyBhZGRpdGlvbnMgcmVxdWlyZWQgaW4gdGhlIGNvcGllcy4gVGhlbiwgaWYgdGhlcmUKICAgIGlzIGEgbGltaXRlZCBtYXhpbXVtIHdlIGhhdmUgdG8gcmVwbGljYXRlIHVwIHRvIG1heHZhbC0xIHRpbWVzIGFsbG93aW5nCiAgICBmb3IgYSBCUkFaRVJPIGl0ZW0gYmVmb3JlIGVhY2ggb3B0aW9uYWwgY29weSBhbmQgbmVzdGluZyBicmFja2V0cyBmb3IgYWxsCiAgICBidXQgb25lIG9mIHRoZSBvcHRpb25hbCBjb3BpZXMuICovCgogICAgZWxzZQogICAgICB7CiAgICAgIGxlbmd0aCArPSAobWluIC0gMSkgKiBkdXBsZW5ndGg7CiAgICAgIGlmIChtYXggPiBtaW4pICAgLyogTmVlZCB0aGlzIHRlc3QgYXMgbWF4PS0xIG1lYW5zIG5vIGxpbWl0ICovCiAgICAgICAgbGVuZ3RoICs9IChtYXggLSBtaW4pICogKGR1cGxlbmd0aCArIDMgKyAyKkxJTktfU0laRSkKICAgICAgICAgIC0gKDIgKyAyKkxJTktfU0laRSk7CiAgICAgIH0KCiAgICAvKiBBbGxvdyBzcGFjZSBmb3Igb25jZSBicmFja2V0cyBmb3IgInBvc3Nlc3NpdmUgcXVhbnRpZmllciIgKi8KCiAgICBpZiAocHRyWzFdID09ICcrJykKICAgICAgewogICAgICBwdHIrKzsKICAgICAgbGVuZ3RoICs9IDIgKyAyKkxJTktfU0laRTsKICAgICAgfQogICAgY29udGludWU7CgogICAgLyogTm9uLXNwZWNpYWwgY2hhcmFjdGVyLiBJdCB3b24ndCBiZSBzcGFjZSBvciAjIGluIGV4dGVuZGVkIG1vZGUsIHNvIGl0IGlzCiAgICBhbHdheXMgYSBnZW51aW5lIGNoYXJhY3Rlci4gSWYgd2UgYXJlIGluIGEgXFEuLi5cRSBzZXF1ZW5jZSwgY2hlY2sgZm9yIHRoZQogICAgZW5kOyBpZiBub3QsIHdlIGhhdmUgYSBsaXRlcmFsLiAqLwoKICAgIGRlZmF1bHQ6CiAgICBOT1JNQUxfQ0hBUjoKCiAgICBpZiAoaW5lc2NxICYmIGMgPT0gJ1xcJyAmJiBwdHJbMV0gPT0gJ0UnKQogICAgICB7CiAgICAgIGluZXNjcSA9IEZBTFNFOwogICAgICBwdHIrKzsKICAgICAgY29udGludWU7CiAgICAgIH0KCiAgICBsZW5ndGggKz0gMjsgICAgICAgICAgLyogRm9yIGEgb25lLWJ5dGUgY2hhcmFjdGVyICovCiAgICBsYXN0aXRlbWxlbmd0aCA9IDE7ICAgLyogRGVmYXVsdCBsZW5ndGggb2YgbGFzdCBpdGVtIGZvciByZXBlYXRzICovCgogICAgLyogSW4gVVRGLTggbW9kZSwgY2hlY2sgZm9yIGFkZGl0aW9uYWwgYnl0ZXMuICovCgojaWZkZWYgU1VQUE9SVF9VVEY4CiAgICBpZiAodXRmOCAmJiAoYyAmIDB4YzApID09IDB4YzApCiAgICAgIHsKICAgICAgd2hpbGUgKChwdHJbMV0gJiAweGMwKSA9PSAweDgwKSAgICAgICAgIC8qIENhbid0IGZsb3cgb3ZlciB0aGUgZW5kICovCiAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBiZWNhdXNlIHRoZSBlbmQgaXMgbWFya2VkICovCiAgICAgICAgbGFzdGl0ZW1sZW5ndGgrKzsgICAgICAgICAgICAgICAgICAgICAvKiBieSBhIHplcm8gYnl0ZS4gKi8KICAgICAgICBsZW5ndGgrKzsKICAgICAgICBwdHIrKzsKICAgICAgICB9CiAgICAgIH0KI2VuZGlmCgogICAgY29udGludWU7CiAgICB9CiAgfQoKbGVuZ3RoICs9IDIgKyBMSU5LX1NJWkU7ICAgIC8qIEZvciBmaW5hbCBLRVQgYW5kIEVORCAqLwoKaWYgKChvcHRpb25zICYgUENSRV9BVVRPX0NBTExPVVQpICE9IDApCiAgbGVuZ3RoICs9IDIgKyAyKkxJTktfU0laRTsgIC8qIEZvciBmaW5hbCBjYWxsb3V0ICovCgppZiAobGVuZ3RoID4gTUFYX1BBVFRFUk5fU0laRSkKICB7CiAgKmVycm9ycHRyID0gRVJSMjA7CiAgcmV0dXJuIE5VTEw7CiAgfQoKLyogQ29tcHV0ZSB0aGUgc2l6ZSBvZiBkYXRhIGJsb2NrIG5lZWRlZCBhbmQgZ2V0IGl0LCBlaXRoZXIgZnJvbSBtYWxsb2Mgb3IKZXh0ZXJuYWxseSBwcm92aWRlZCBmdW5jdGlvbi4gKi8KCnNpemUgPSBsZW5ndGggKyBzaXplb2YocmVhbF9wY3JlKSArIG5hbWVfY291bnQgKiAobWF4X25hbWVfc2l6ZSArIDMpOwpyZSA9IChyZWFsX3BjcmUgKikocGNyZV9tYWxsb2MpKHNpemUpOwoKaWYgKHJlID09IE5VTEwpCiAgewogICplcnJvcnB0ciA9IEVSUjIxOwogIHJldHVybiBOVUxMOwogIH0KCi8qIFB1dCBpbiB0aGUgbWFnaWMgbnVtYmVyLCBhbmQgc2F2ZSB0aGUgc2l6ZXMsIG9wdGlvbnMsIGFuZCBjaGFyYWN0ZXIgdGFibGUKcG9pbnRlci4gTlVMTCBpcyB1c2VkIGZvciB0aGUgZGVmYXVsdCBjaGFyYWN0ZXIgdGFibGVzLiBUaGUgbnVsbHBhZCBmaWVsZCBpcyBhdAp0aGUgZW5kOyBpdCdzIHRoZXJlIHRvIGhlbHAgaW4gdGhlIGNhc2Ugd2hlbiBhIHJlZ2V4IGNvbXBpbGVkIG9uIGEgc3lzdGVtIHdpdGgKNC1ieXRlIHBvaW50ZXJzIGlzIHJ1biBvbiBhbm90aGVyIHdpdGggOC1ieXRlIHBvaW50ZXJzLiAqLwoKcmUtPm1hZ2ljX251bWJlciA9IE1BR0lDX05VTUJFUjsKcmUtPnNpemUgPSBzaXplOwpyZS0+b3B0aW9ucyA9IG9wdGlvbnM7CnJlLT5kdW1teTEgPSByZS0+ZHVtbXkyID0gMDsKcmUtPm5hbWVfdGFibGVfb2Zmc2V0ID0gc2l6ZW9mKHJlYWxfcGNyZSk7CnJlLT5uYW1lX2VudHJ5X3NpemUgPSBtYXhfbmFtZV9zaXplICsgMzsKcmUtPm5hbWVfY291bnQgPSBuYW1lX2NvdW50OwpyZS0+dGFibGVzID0gKHRhYmxlcyA9PSBwY3JlX2RlZmF1bHRfdGFibGVzKT8gTlVMTCA6IHRhYmxlczsKcmUtPm51bGxwYWQgPSBOVUxMOwoKLyogVGhlIHN0YXJ0aW5nIHBvaW50cyBvZiB0aGUgbmFtZS9udW1iZXIgdHJhbnNsYXRpb24gdGFibGUgYW5kIG9mIHRoZSBjb2RlIGFyZQpwYXNzZWQgYXJvdW5kIGluIHRoZSBjb21waWxlIGRhdGEgYmxvY2suICovCgpjb21waWxlX2Jsb2NrLm5hbWVzX2ZvdW5kID0gMDsKY29tcGlsZV9ibG9jay5uYW1lX2VudHJ5X3NpemUgPSBtYXhfbmFtZV9zaXplICsgMzsKY29tcGlsZV9ibG9jay5uYW1lX3RhYmxlID0gKHVzY2hhciAqKXJlICsgcmUtPm5hbWVfdGFibGVfb2Zmc2V0Owpjb2Rlc3RhcnQgPSBjb21waWxlX2Jsb2NrLm5hbWVfdGFibGUgKyByZS0+bmFtZV9lbnRyeV9zaXplICogcmUtPm5hbWVfY291bnQ7CmNvbXBpbGVfYmxvY2suc3RhcnRfY29kZSA9IGNvZGVzdGFydDsKY29tcGlsZV9ibG9jay5zdGFydF9wYXR0ZXJuID0gKGNvbnN0IHVzY2hhciAqKXBhdHRlcm47CmNvbXBpbGVfYmxvY2sucmVxX3ZhcnlvcHQgPSAwOwpjb21waWxlX2Jsb2NrLm5vcGFydGlhbCA9IEZBTFNFOwoKLyogU2V0IHVwIGEgc3RhcnRpbmcsIG5vbi1leHRyYWN0aW5nIGJyYWNrZXQsIHRoZW4gY29tcGlsZSB0aGUgZXhwcmVzc2lvbi4gT24KZXJyb3IsICplcnJvcnB0ciB3aWxsIGJlIHNldCBub24tTlVMTCwgc28gd2UgZG9uJ3QgbmVlZCB0byBsb29rIGF0IHRoZSByZXN1bHQKb2YgdGhlIGZ1bmN0aW9uIGhlcmUuICovCgpwdHIgPSAoY29uc3QgdXNjaGFyICopcGF0dGVybjsKY29kZSA9ICh1c2NoYXIgKiljb2Rlc3RhcnQ7Cipjb2RlID0gT1BfQlJBOwpicmFjb3VudCA9IDA7Cih2b2lkKWNvbXBpbGVfcmVnZXgob3B0aW9ucywgb3B0aW9ucyAmIFBDUkVfSU1TLCAmYnJhY291bnQsICZjb2RlLCAmcHRyLAogIGVycm9ycHRyLCBGQUxTRSwgMCwgJmZpcnN0Ynl0ZSwgJnJlcWJ5dGUsIE5VTEwsICZjb21waWxlX2Jsb2NrKTsKcmUtPnRvcF9icmFja2V0ID0gYnJhY291bnQ7CnJlLT50b3BfYmFja3JlZiA9IGNvbXBpbGVfYmxvY2sudG9wX2JhY2tyZWY7CgppZiAoY29tcGlsZV9ibG9jay5ub3BhcnRpYWwpIHJlLT5vcHRpb25zIHw9IFBDUkVfTk9QQVJUSUFMOwoKLyogSWYgbm90IHJlYWNoZWQgZW5kIG9mIHBhdHRlcm4gb24gc3VjY2VzcywgdGhlcmUncyBhbiBleGNlc3MgYnJhY2tldC4gKi8KCmlmICgqZXJyb3JwdHIgPT0gTlVMTCAmJiAqcHRyICE9IDApICplcnJvcnB0ciA9IEVSUjIyOwoKLyogRmlsbCBpbiB0aGUgdGVybWluYXRpbmcgc3RhdGUgYW5kIGNoZWNrIGZvciBkaXNhc3Ryb3VzIG92ZXJmbG93LCBidXQKaWYgZGVidWdnaW5nLCBsZWF2ZSB0aGUgdGVzdCB0aWxsIGFmdGVyIHRoaW5ncyBhcmUgcHJpbnRlZCBvdXQuICovCgoqY29kZSsrID0gT1BfRU5EOwoKI2lmbmRlZiBERUJVRwppZiAoY29kZSAtIGNvZGVzdGFydCA+IGxlbmd0aCkgKmVycm9ycHRyID0gRVJSMjM7CiNlbmRpZgoKLyogR2l2ZSBhbiBlcnJvciBpZiB0aGVyZSdzIGJhY2sgcmVmZXJlbmNlIHRvIGEgbm9uLWV4aXN0ZW50IGNhcHR1cmluZwpzdWJwYXR0ZXJuLiAqLwoKaWYgKHJlLT50b3BfYmFja3JlZiA+IHJlLT50b3BfYnJhY2tldCkgKmVycm9ycHRyID0gRVJSMTU7CgovKiBGYWlsZWQgdG8gY29tcGlsZSwgb3IgZXJyb3Igd2hpbGUgcG9zdC1wcm9jZXNzaW5nICovCgppZiAoKmVycm9ycHRyICE9IE5VTEwpCiAgewogIChwY3JlX2ZyZWUpKHJlKTsKICBQQ1JFX0VSUk9SX1JFVFVSTjoKICAqZXJyb3JvZmZzZXQgPSBwdHIgLSAoY29uc3QgdXNjaGFyICopcGF0dGVybjsKICByZXR1cm4gTlVMTDsKICB9CgovKiBJZiB0aGUgYW5jaG9yZWQgb3B0aW9uIHdhcyBub3QgcGFzc2VkLCBzZXQgdGhlIGZsYWcgaWYgd2UgY2FuIGRldGVybWluZSB0aGF0CnRoZSBwYXR0ZXJuIGlzIGFuY2hvcmVkIGJ5IHZpcnR1ZSBvZiBeIGNoYXJhY3RlcnMgb3IgXEEgb3IgYW55dGhpbmcgZWxzZSAoc3VjaAphcyBzdGFydGluZyB3aXRoIC4qIHdoZW4gRE9UQUxMIGlzIHNldCkuCgpPdGhlcndpc2UsIGlmIHdlIGtub3cgd2hhdCB0aGUgZmlyc3QgY2hhcmFjdGVyIGhhcyB0byBiZSwgc2F2ZSBpdCwgYmVjYXVzZSB0aGF0CnNwZWVkcyB1cCB1bmFuY2hvcmVkIG1hdGNoZXMgbm8gZW5kLiBJZiBub3QsIHNlZSBpZiB3ZSBjYW4gc2V0IHRoZQpQQ1JFX1NUQVJUTElORSBmbGFnLiBUaGlzIGlzIGhlbHBmdWwgZm9yIG11bHRpbGluZSBtYXRjaGVzIHdoZW4gYWxsIGJyYW5jaGVzCnN0YXJ0IHdpdGggXi4gYW5kIGFsc28gd2hlbiBhbGwgYnJhbmNoZXMgc3RhcnQgd2l0aCAuKiBmb3Igbm9uLURPVEFMTCBtYXRjaGVzLgoqLwoKaWYgKChvcHRpb25zICYgUENSRV9BTkNIT1JFRCkgPT0gMCkKICB7CiAgaW50IHRlbXBfb3B0aW9ucyA9IG9wdGlvbnM7CiAgaWYgKGlzX2FuY2hvcmVkKGNvZGVzdGFydCwgJnRlbXBfb3B0aW9ucywgMCwgY29tcGlsZV9ibG9jay5iYWNrcmVmX21hcCkpCiAgICByZS0+b3B0aW9ucyB8PSBQQ1JFX0FOQ0hPUkVEOwogIGVsc2UKICAgIHsKICAgIGlmIChmaXJzdGJ5dGUgPCAwKQogICAgICBmaXJzdGJ5dGUgPSBmaW5kX2ZpcnN0YXNzZXJ0ZWRjaGFyKGNvZGVzdGFydCwgJnRlbXBfb3B0aW9ucywgRkFMU0UpOwogICAgaWYgKGZpcnN0Ynl0ZSA+PSAwKSAgIC8qIFJlbW92ZSBjYXNlbGVzcyBmbGFnIGZvciBub24tY2FzZWFibGUgY2hhcnMgKi8KICAgICAgewogICAgICBpbnQgY2ggPSBmaXJzdGJ5dGUgJiAyNTU7CiAgICAgIHJlLT5maXJzdF9ieXRlID0gKChmaXJzdGJ5dGUgJiBSRVFfQ0FTRUxFU1MpICE9IDAgJiYKICAgICAgICAgY29tcGlsZV9ibG9jay5mY2NbY2hdID09IGNoKT8gY2ggOiBmaXJzdGJ5dGU7CiAgICAgIHJlLT5vcHRpb25zIHw9IFBDUkVfRklSU1RTRVQ7CiAgICAgIH0KICAgIGVsc2UgaWYgKGlzX3N0YXJ0bGluZShjb2Rlc3RhcnQsIDAsIGNvbXBpbGVfYmxvY2suYmFja3JlZl9tYXApKQogICAgICByZS0+b3B0aW9ucyB8PSBQQ1JFX1NUQVJUTElORTsKICAgIH0KICB9CgovKiBGb3IgYW4gYW5jaG9yZWQgcGF0dGVybiwgd2UgdXNlIHRoZSAicmVxdWlyZWQgYnl0ZSIgb25seSBpZiBpdCBmb2xsb3dzIGEKdmFyaWFibGUgbGVuZ3RoIGl0ZW0gaW4gdGhlIHJlZ2V4LiBSZW1vdmUgdGhlIGNhc2VsZXNzIGZsYWcgZm9yIG5vbi1jYXNlYWJsZQpieXRlcy4gKi8KCmlmIChyZXFieXRlID49IDAgJiYKICAgICAoKHJlLT5vcHRpb25zICYgUENSRV9BTkNIT1JFRCkgPT0gMCB8fCAocmVxYnl0ZSAmIFJFUV9WQVJZKSAhPSAwKSkKICB7CiAgaW50IGNoID0gcmVxYnl0ZSAmIDI1NTsKICByZS0+cmVxX2J5dGUgPSAoKHJlcWJ5dGUgJiBSRVFfQ0FTRUxFU1MpICE9IDAgJiYKICAgIGNvbXBpbGVfYmxvY2suZmNjW2NoXSA9PSBjaCk/IChyZXFieXRlICYgflJFUV9DQVNFTEVTUykgOiByZXFieXRlOwogIHJlLT5vcHRpb25zIHw9IFBDUkVfUkVRQ0hTRVQ7CiAgfQoKLyogUHJpbnQgb3V0IHRoZSBjb21waWxlZCBkYXRhIGZvciBkZWJ1Z2dpbmcgKi8KCiNpZmRlZiBERUJVRwoKcHJpbnRmKCJMZW5ndGggPSAlZCB0b3BfYnJhY2tldCA9ICVkIHRvcF9iYWNrcmVmID0gJWRcbiIsCiAgbGVuZ3RoLCByZS0+dG9wX2JyYWNrZXQsIHJlLT50b3BfYmFja3JlZik7CgppZiAocmUtPm9wdGlvbnMgIT0gMCkKICB7CiAgcHJpbnRmKCIlcyVzJXMlcyVzJXMlcyVzJXMlc1xuIiwKICAgICgocmUtPm9wdGlvbnMgJiBQQ1JFX05PUEFSVElBTCkgIT0gMCk/ICJub3BhcnRpYWwgIiA6ICIiLAogICAgKChyZS0+b3B0aW9ucyAmIFBDUkVfQU5DSE9SRUQpICE9IDApPyAiYW5jaG9yZWQgIiA6ICIiLAogICAgKChyZS0+b3B0aW9ucyAmIFBDUkVfQ0FTRUxFU1MpICE9IDApPyAiY2FzZWxlc3MgIiA6ICIiLAogICAgKChyZS0+b3B0aW9ucyAmIFBDUkVfSUNIQU5HRUQpICE9IDApPyAiY2FzZSBzdGF0ZSBjaGFuZ2VkICIgOiAiIiwKICAgICgocmUtPm9wdGlvbnMgJiBQQ1JFX0VYVEVOREVEKSAhPSAwKT8gImV4dGVuZGVkICIgOiAiIiwKICAgICgocmUtPm9wdGlvbnMgJiBQQ1JFX01VTFRJTElORSkgIT0gMCk/ICJtdWx0aWxpbmUgIiA6ICIiLAogICAgKChyZS0+b3B0aW9ucyAmIFBDUkVfRE9UQUxMKSAhPSAwKT8gImRvdGFsbCAiIDogIiIsCiAgICAoKHJlLT5vcHRpb25zICYgUENSRV9ET0xMQVJfRU5ET05MWSkgIT0gMCk/ICJlbmRvbmx5ICIgOiAiIiwKICAgICgocmUtPm9wdGlvbnMgJiBQQ1JFX0VYVFJBKSAhPSAwKT8gImV4dHJhICIgOiAiIiwKICAgICgocmUtPm9wdGlvbnMgJiBQQ1JFX1VOR1JFRURZKSAhPSAwKT8gInVuZ3JlZWR5ICIgOiAiIik7CiAgfQoKaWYgKChyZS0+b3B0aW9ucyAmIFBDUkVfRklSU1RTRVQpICE9IDApCiAgewogIGludCBjaCA9IHJlLT5maXJzdF9ieXRlICYgMjU1OwogIGNvbnN0IGNoYXIgKmNhc2VsZXNzID0gKChyZS0+Zmlyc3RfYnl0ZSAmIFJFUV9DQVNFTEVTUykgPT0gMCk/ICIiIDogIiAoY2FzZWxlc3MpIjsKICBpZiAoaXNwcmludChjaCkpIHByaW50ZigiRmlyc3QgY2hhciA9ICVjJXNcbiIsIGNoLCBjYXNlbGVzcyk7CiAgICBlbHNlIHByaW50ZigiRmlyc3QgY2hhciA9IFxceCUwMnglc1xuIiwgY2gsIGNhc2VsZXNzKTsKICB9CgppZiAoKHJlLT5vcHRpb25zICYgUENSRV9SRVFDSFNFVCkgIT0gMCkKICB7CiAgaW50IGNoID0gcmUtPnJlcV9ieXRlICYgMjU1OwogIGNvbnN0IGNoYXIgKmNhc2VsZXNzID0gKChyZS0+cmVxX2J5dGUgJiBSRVFfQ0FTRUxFU1MpID09IDApPyAiIiA6ICIgKGNhc2VsZXNzKSI7CiAgaWYgKGlzcHJpbnQoY2gpKSBwcmludGYoIlJlcSBjaGFyID0gJWMlc1xuIiwgY2gsIGNhc2VsZXNzKTsKICAgIGVsc2UgcHJpbnRmKCJSZXEgY2hhciA9IFxceCUwMnglc1xuIiwgY2gsIGNhc2VsZXNzKTsKICB9CgpwcmludF9pbnRlcm5hbHMocmUsIHN0ZG91dCk7CgovKiBUaGlzIGNoZWNrIGlzIGRvbmUgaGVyZSBpbiB0aGUgZGVidWdnaW5nIGNhc2Ugc28gdGhhdCB0aGUgY29kZSB0aGF0CndhcyBjb21waWxlZCBjYW4gYmUgc2Vlbi4gKi8KCmlmIChjb2RlIC0gY29kZXN0YXJ0ID4gbGVuZ3RoKQogIHsKICAqZXJyb3JwdHIgPSBFUlIyMzsKICAocGNyZV9mcmVlKShyZSk7CiAgKmVycm9yb2Zmc2V0ID0gcHRyIC0gKHVzY2hhciAqKXBhdHRlcm47CiAgcmV0dXJuIE5VTEw7CiAgfQojZW5kaWYKCnJldHVybiAocGNyZSAqKXJlOwp9CgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogICAgICAgICAgTWF0Y2ggYSBiYWNrLXJlZmVyZW5jZSAgICAgICAgICAgICAgICAqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKiBJZiBhIGJhY2sgcmVmZXJlbmNlIGhhc24ndCBiZWVuIHNldCwgdGhlIGxlbmd0aCB0aGF0IGlzIHBhc3NlZCBpcyBncmVhdGVyCnRoYW4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGxlZnQgaW4gdGhlIHN0cmluZywgc28gdGhlIG1hdGNoIGZhaWxzLgoKQXJndW1lbnRzOgogIG9mZnNldCAgICAgIGluZGV4IGludG8gdGhlIG9mZnNldCB2ZWN0b3IKICBlcHRyICAgICAgICBwb2ludHMgaW50byB0aGUgc3ViamVjdAogIGxlbmd0aCAgICAgIGxlbmd0aCB0byBiZSBtYXRjaGVkCiAgbWQgICAgICAgICAgcG9pbnRzIHRvIG1hdGNoIGRhdGEgYmxvY2sKICBpbXMgICAgICAgICB0aGUgaW1zIGZsYWdzCgpSZXR1cm5zOiAgICAgIFRSVUUgaWYgbWF0Y2hlZAoqLwoKc3RhdGljIEJPT0wKbWF0Y2hfcmVmKGludCBvZmZzZXQsIHJlZ2lzdGVyIGNvbnN0IHVzY2hhciAqZXB0ciwgaW50IGxlbmd0aCwgbWF0Y2hfZGF0YSAqbWQsCiAgdW5zaWduZWQgbG9uZyBpbnQgaW1zKQp7CmNvbnN0IHVzY2hhciAqcCA9IG1kLT5zdGFydF9zdWJqZWN0ICsgbWQtPm9mZnNldF92ZWN0b3Jbb2Zmc2V0XTsKCiNpZmRlZiBERUJVRwppZiAoZXB0ciA+PSBtZC0+ZW5kX3N1YmplY3QpCiAgcHJpbnRmKCJtYXRjaGluZyBzdWJqZWN0IDxudWxsPiIpOwplbHNlCiAgewogIHByaW50ZigibWF0Y2hpbmcgc3ViamVjdCAiKTsKICBwY2hhcnMoZXB0ciwgbGVuZ3RoLCBUUlVFLCBtZCk7CiAgfQpwcmludGYoIiBhZ2FpbnN0IGJhY2tyZWYgIik7CnBjaGFycyhwLCBsZW5ndGgsIEZBTFNFLCBtZCk7CnByaW50ZigiXG4iKTsKI2VuZGlmCgovKiBBbHdheXMgZmFpbCBpZiBub3QgZW5vdWdoIGNoYXJhY3RlcnMgbGVmdCAqLwoKaWYgKGxlbmd0aCA+IG1kLT5lbmRfc3ViamVjdCAtIGVwdHIpIHJldHVybiBGQUxTRTsKCi8qIFNlcGFyYXRlIHRoZSBjYXNlbGVzc3MgY2FzZSBmb3Igc3BlZWQgKi8KCmlmICgoaW1zICYgUENSRV9DQVNFTEVTUykgIT0gMCkKICB7CiAgd2hpbGUgKGxlbmd0aC0tID4gMCkKICAgIGlmIChtZC0+bGNjWypwKytdICE9IG1kLT5sY2NbKmVwdHIrK10pIHJldHVybiBGQUxTRTsKICB9CmVsc2UKICB7IHdoaWxlIChsZW5ndGgtLSA+IDApIGlmICgqcCsrICE9ICplcHRyKyspIHJldHVybiBGQUxTRTsgfQoKcmV0dXJuIFRSVUU7Cn0KCgojaWZkZWYgU1VQUE9SVF9VVEY4Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogICAgICAgTWF0Y2ggY2hhcmFjdGVyIGFnYWluc3QgYW4gWENMQVNTICAgICAgICAqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHdpdGhpbiB0aGUgWENMQVNTIGNvZGUgYmVsb3csIHRvIG1hdGNoIGEKY2hhcmFjdGVyIGFnYWluc3QgYW4gZXh0ZW5kZWQgY2xhc3Mgd2hpY2ggbWlnaHQgbWF0Y2ggdmFsdWVzID4gMjU1LgoKQXJndW1lbnRzOgogIGMgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIKICBkYXRhICAgICAgICBwb2ludHMgdG8gdGhlIGZsYWcgYnl0ZSBvZiB0aGUgWENMQVNTIGRhdGEKClJldHVybnM6ICAgICAgVFJVRSBpZiBjaGFyYWN0ZXIgbWF0Y2hlcywgZWxzZSBGQUxTRQoqLwoKc3RhdGljIEJPT0wKbWF0Y2hfeGNsYXNzKGludCBjLCBjb25zdCB1c2NoYXIgKmRhdGEpCnsKaW50IHQ7CkJPT0wgbmVnYXRlZCA9ICgqZGF0YSAmIFhDTF9OT1QpICE9IDA7CgovKiBDaGFyYWN0ZXIgdmFsdWVzIDwgMjU2IGFyZSBtYXRjaGVkIGFnYWluc3QgYSBiaXRtYXAsIGlmIG9uZSBpcyBwcmVzZW50LiBJZgpub3QsIHdlIHN0aWxsIGNhcnJ5IG9uLCBiZWNhdXNlIHRoZXJlIG1heSBiZSByYW5nZXMgdGhhdCBzdGFydCBiZWxvdyAyNTYgaW4gdGhlCmFkZGl0aW9uYWwgZGF0YS4gKi8KCmlmIChjIDwgMjU2KQogIHsKICBpZiAoKCpkYXRhICYgWENMX01BUCkgIT0gMCAmJiAoZGF0YVsxICsgYy84XSAmICgxIDw8IChjJjcpKSkgIT0gMCkKICAgIHJldHVybiAhbmVnYXRlZDsgICAvKiBjaGFyIGZvdW5kICovCiAgfQoKLyogRmlyc3Qgc2tpcCB0aGUgYml0IG1hcCBpZiBwcmVzZW50LiBUaGVuIG1hdGNoIGFnYWluc3QgdGhlIGxpc3Qgb2YgVW5pY29kZQpwcm9wZXJ0aWVzIG9yIGxhcmdlIGNoYXJzIG9yIHJhbmdlcyB0aGF0IGVuZCB3aXRoIGEgbGFyZ2UgY2hhci4gV2Ugd29uJ3QgZXZlcgplbmNvdW50ZXIgWENMX1BST1Agb3IgWENMX05PVFBST1Agd2hlbiBVQ1Agc3VwcG9ydCBpcyBub3QgY29tcGlsZWQuICovCgppZiAoKCpkYXRhKysgJiBYQ0xfTUFQKSAhPSAwKSBkYXRhICs9IDMyOwoKd2hpbGUgKCh0ID0gKmRhdGErKykgIT0gWENMX0VORCkKICB7CiAgaW50IHgsIHk7CiAgaWYgKHQgPT0gWENMX1NJTkdMRSkKICAgIHsKICAgIEdFVENIQVJJTkMoeCwgZGF0YSk7CiAgICBpZiAoYyA9PSB4KSByZXR1cm4gIW5lZ2F0ZWQ7CiAgICB9CiAgZWxzZSBpZiAodCA9PSBYQ0xfUkFOR0UpCiAgICB7CiAgICBHRVRDSEFSSU5DKHgsIGRhdGEpOwogICAgR0VUQ0hBUklOQyh5LCBkYXRhKTsKICAgIGlmIChjID49IHggJiYgYyA8PSB5KSByZXR1cm4gIW5lZ2F0ZWQ7CiAgICB9CgojaWZkZWYgU1VQUE9SVF9VQ1AKICBlbHNlICAvKiBYQ0xfUFJPUCAmIFhDTF9OT1RQUk9QICovCiAgICB7CiAgICBpbnQgY2hhcnR5cGUsIG90aGVyY2FzZTsKICAgIGludCBycWR0eXBlID0gKmRhdGErKzsKICAgIGludCBjYXRlZ29yeSA9IHVjcF9maW5kY2hhcihjLCAmY2hhcnR5cGUsICZvdGhlcmNhc2UpOwogICAgaWYgKHJxZHR5cGUgPj0gMTI4KQogICAgICB7CiAgICAgIGlmICgocnFkdHlwZSAtIDEyOCA9PSBjYXRlZ29yeSkgPT0gKHQgPT0gWENMX1BST1ApKSByZXR1cm4gIW5lZ2F0ZWQ7CiAgICAgIH0KICAgIGVsc2UKICAgICAgewogICAgICBpZiAoKHJxZHR5cGUgPT0gY2hhcnR5cGUpID09ICh0ID09IFhDTF9QUk9QKSkgcmV0dXJuICFuZWdhdGVkOwogICAgICB9CiAgICB9CiNlbmRpZiAgLyogU1VQUE9SVF9VQ1AgKi8KICB9CgpyZXR1cm4gbmVnYXRlZDsgICAvKiBjaGFyIGRpZCBub3QgbWF0Y2ggKi8KfQojZW5kaWYKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgICAgICAgICAgICAgIFJFQ1VSU0lPTiBJTiBUSEUgbWF0Y2goKSBGVU5DVElPTgoKVGhlIG1hdGNoKCkgZnVuY3Rpb24gaXMgaGlnaGx5IHJlY3Vyc2l2ZS4gU29tZSByZWd1bGFyIGV4cHJlc3Npb25zIGNhbiBjYXVzZQppdCB0byByZWN1cnNlIHRob3VzYW5kcyBvZiB0aW1lcy4gSSB3YXMgd3JpdGluZyBmb3IgVW5peCwgc28gSSBqdXN0IGxldCBpdApjYWxsIGl0c2VsZiByZWN1cnNpdmVseS4gVGhpcyB1c2VzIHRoZSBzdGFjayBmb3Igc2F2aW5nIGV2ZXJ5dGhpbmcgdGhhdCBoYXMKdG8gYmUgc2F2ZWQgZm9yIGEgcmVjdXJzaXZlIGNhbGwuIE9uIFVuaXgsIHRoZSBzdGFjayBjYW4gYmUgbGFyZ2UsIGFuZCB0aGlzCndvcmtzIGZpbmUuCgpJdCB0dXJucyBvdXQgdGhhdCBvbiBub24tVW5peCBzeXN0ZW1zIHRoZXJlIGFyZSBwcm9ibGVtcyB3aXRoIHByb2dyYW1zIHRoYXQKdXNlIGEgbG90IG9mIHN0YWNrLiAoVGhpcyBkZXNwaXRlIHRoZSBmYWN0IHRoYXQgZXZlcnkgbGFzdCBjaGlwIGhhcyBvb2RsZXMKb2YgbWVtb3J5IHRoZXNlIGRheXMsIGFuZCB0ZWNobmlxdWVzIGZvciBleHRlbmRpbmcgdGhlIHN0YWNrIGhhdmUgYmVlbiBrbm93bgpmb3IgZGVjYWRlcy4pIFNvLi4uLgoKVGhlcmUgaXMgYSBmdWRnZSwgdHJpZ2dlcmVkIGJ5IGRlZmluaW5nIE5PX1JFQ1VSU0UsIHdoaWNoIGF2b2lkcyByZWN1cnNpdmUKY2FsbHMgYnkga2VlcGluZyBsb2NhbCB2YXJpYWJsZXMgdGhhdCBuZWVkIHRvIGJlIHByZXNlcnZlZCBpbiBibG9ja3Mgb2YgbWVtb3J5Cm9idGFpbmVkIGZyb20gbWFsbG9jIGluc3RlYWQgaW5zdGVhZCBvZiBvbiB0aGUgc3RhY2suIE1hY3JvcyBhcmUgdXNlZCB0bwphY2hpZXZlIHRoaXMgc28gdGhhdCB0aGUgYWN0dWFsIGNvZGUgZG9lc24ndCBsb29rIHZlcnkgZGlmZmVyZW50IHRvIHdoYXQgaXQKYWx3YXlzIHVzZWQgdG8uCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCi8qIFRoZXNlIHZlcnNpb25zIG9mIHRoZSBtYWNyb3MgdXNlIHRoZSBzdGFjaywgYXMgbm9ybWFsICovCgojaWZuZGVmIE5PX1JFQ1VSU0UKI2RlZmluZSBSRUdJU1RFUiByZWdpc3RlcgojZGVmaW5lIFJNQVRDSChyeCxyYSxyYixyYyxyZCxyZSxyZixyZykgcnggPSBtYXRjaChyYSxyYixyYyxyZCxyZSxyZixyZykKI2RlZmluZSBSUkVUVVJOKHJhKSByZXR1cm4gcmEKI2Vsc2UKCgovKiBUaGVzZSB2ZXJzaW9ucyBvZiB0aGUgbWFjcm9zIG1hbmFnZSBhIHByaXZhdGUgc3RhY2sgb24gdGhlIGhlYXAuIE5vdGUKdGhhdCB0aGUgcmQgYXJndW1lbnQgb2YgUk1BVENIIGlzbid0IGFjdHVhbGx5IHVzZWQuIEl0J3MgdGhlIG1kIGFyZ3VtZW50IG9mCm1hdGNoKCksIHdoaWNoIG5ldmVyIGNoYW5nZXMuICovCgojZGVmaW5lIFJFR0lTVEVSCgojZGVmaW5lIFJNQVRDSChyeCxyYSxyYixyYyxyZCxyZSxyZixyZylcCiAge1wKICBoZWFwZnJhbWUgKm5ld2ZyYW1lID0gKHBjcmVfc3RhY2tfbWFsbG9jKShzaXplb2YoaGVhcGZyYW1lKSk7XAogIGlmIChzZXRqbXAoZnJhbWUtPlh3aGVyZSkgPT0gMClcCiAgICB7XAogICAgbmV3ZnJhbWUtPlhlcHRyID0gcmE7XAogICAgbmV3ZnJhbWUtPlhlY29kZSA9IHJiO1wKICAgIG5ld2ZyYW1lLT5Yb2Zmc2V0X3RvcCA9IHJjO1wKICAgIG5ld2ZyYW1lLT5YaW1zID0gcmU7XAogICAgbmV3ZnJhbWUtPlhlcHRyYiA9IHJmO1wKICAgIG5ld2ZyYW1lLT5YZmxhZ3MgPSByZztcCiAgICBuZXdmcmFtZS0+WHByZXZmcmFtZSA9IGZyYW1lO1wKICAgIGZyYW1lID0gbmV3ZnJhbWU7XAogICAgRFBSSU5URigoInJlc3RhcnRpbmcgZnJvbSBsaW5lICVkXG4iLCBfX0xJTkVfXykpO1wKICAgIGdvdG8gSEVBUF9SRUNVUlNFO1wKICAgIH1cCiAgZWxzZVwKICAgIHtcCiAgICBEUFJJTlRGKCgibG9uZ2p1bXBlZCBiYWNrIHRvIGxpbmUgJWRcbiIsIF9fTElORV9fKSk7XAogICAgZnJhbWUgPSBtZC0+dGhpc2ZyYW1lO1wKICAgIHJ4ID0gZnJhbWUtPlhyZXN1bHQ7XAogICAgfVwKICB9CgojZGVmaW5lIFJSRVRVUk4ocmEpXAogIHtcCiAgaGVhcGZyYW1lICpuZXdmcmFtZSA9IGZyYW1lO1wKICBmcmFtZSA9IG5ld2ZyYW1lLT5YcHJldmZyYW1lO1wKICAocGNyZV9zdGFja19mcmVlKShuZXdmcmFtZSk7XAogIGlmIChmcmFtZSAhPSBOVUxMKVwKICAgIHtcCiAgICBmcmFtZS0+WHJlc3VsdCA9IHJhO1wKICAgIG1kLT50aGlzZnJhbWUgPSBmcmFtZTtcCiAgICBsb25nam1wKGZyYW1lLT5Yd2hlcmUsIDEpO1wKICAgIH1cCiAgcmV0dXJuIHJhO1wKICB9CgoKLyogU3RydWN0dXJlIGZvciByZW1lbWJlcmluZyB0aGUgbG9jYWwgdmFyaWFibGVzIGluIGEgcHJpdmF0ZSBmcmFtZSAqLwoKdHlwZWRlZiBzdHJ1Y3QgaGVhcGZyYW1lIHsKICBzdHJ1Y3QgaGVhcGZyYW1lICpYcHJldmZyYW1lOwoKICAvKiBGdW5jdGlvbiBhcmd1bWVudHMgdGhhdCBtYXkgY2hhbmdlICovCgogIGNvbnN0IHVzY2hhciAqWGVwdHI7CiAgY29uc3QgdXNjaGFyICpYZWNvZGU7CiAgaW50IFhvZmZzZXRfdG9wOwogIGxvbmcgaW50IFhpbXM7CiAgZXB0cmJsb2NrICpYZXB0cmI7CiAgaW50IFhmbGFnczsKCiAgLyogRnVuY3Rpb24gbG9jYWwgdmFyaWFibGVzICovCgogIGNvbnN0IHVzY2hhciAqWGNhbGxwYXQ7CiAgY29uc3QgdXNjaGFyICpYY2hhcnB0cjsKICBjb25zdCB1c2NoYXIgKlhkYXRhOwogIGNvbnN0IHVzY2hhciAqWG5leHQ7CiAgY29uc3QgdXNjaGFyICpYcHA7CiAgY29uc3QgdXNjaGFyICpYcHJldjsKICBjb25zdCB1c2NoYXIgKlhzYXZlZF9lcHRyOwoKICByZWN1cnNpb25faW5mbyBYbmV3X3JlY3Vyc2l2ZTsKCiAgQk9PTCBYY3VyX2lzX3dvcmQ7CiAgQk9PTCBYY29uZGl0aW9uOwogIEJPT0wgWG1pbmltaXplOwogIEJPT0wgWHByZXZfaXNfd29yZDsKCiAgdW5zaWduZWQgbG9uZyBpbnQgWG9yaWdpbmFsX2ltczsKCiNpZmRlZiBTVVBQT1JUX1VDUAogIGludCBYcHJvcF90eXBlOwogIGludCBYcHJvcF9mYWlsX3Jlc3VsdDsKICBpbnQgWHByb3BfY2F0ZWdvcnk7CiAgaW50IFhwcm9wX2NoYXJ0eXBlOwogIGludCBYcHJvcF9vdGhlcmNhc2U7CiAgaW50IFhwcm9wX3Rlc3RfYWdhaW5zdDsKICBpbnQgKlhwcm9wX3Rlc3RfdmFyaWFibGU7CiNlbmRpZgoKICBpbnQgWGN0eXBlOwogIGludCBYZmM7CiAgaW50IFhmaTsKICBpbnQgWGxlbmd0aDsKICBpbnQgWG1heDsKICBpbnQgWG1pbjsKICBpbnQgWG51bWJlcjsKICBpbnQgWG9mZnNldDsKICBpbnQgWG9wOwogIGludCBYc2F2ZV9jYXB0dXJlX2xhc3Q7CiAgaW50IFhzYXZlX29mZnNldDEsIFhzYXZlX29mZnNldDIsIFhzYXZlX29mZnNldDM7CiAgaW50IFhzdGFja3NhdmVbUkVDX1NUQUNLX1NBVkVfTUFYXTsKCiAgZXB0cmJsb2NrIFhuZXdwdHJiOwoKICAvKiBQbGFjZSB0byBwYXNzIGJhY2sgcmVzdWx0LCBhbmQgd2hlcmUgdG8ganVtcCBiYWNrIHRvICovCgogIGludCAgWHJlc3VsdDsKICBqbXBfYnVmIFh3aGVyZTsKCn0gaGVhcGZyYW1lOwoKI2VuZGlmCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogICAgICAgICBNYXRjaCBmcm9tIGN1cnJlbnQgcG9zaXRpb24gICAgICAgICAgICAqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKiBPbiBlbnRyeSBlY29kZSBwb2ludHMgdG8gdGhlIGZpcnN0IG9wY29kZSwgYW5kIGVwdHIgdG8gdGhlIGZpcnN0IGNoYXJhY3RlcgppbiB0aGUgc3ViamVjdCBzdHJpbmcsIHdoaWxlIGVwdHJiIGhvbGRzIHRoZSB2YWx1ZSBvZiBlcHRyIGF0IHRoZSBzdGFydCBvZiB0aGUKbGFzdCBicmFja2V0ZWQgZ3JvdXAgLSB1c2VkIGZvciBicmVha2luZyBpbmZpbml0ZSBsb29wcyBtYXRjaGluZyB6ZXJvLWxlbmd0aApzdHJpbmdzLiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCByZWN1cnNpdmVseSBpbiBtYW55IGNpcmN1bXN0YW5jZXMuIFdoZW5ldmVyIGl0CnJldHVybnMgYSBuZWdhdGl2ZSAoZXJyb3IpIHJlc3BvbnNlLCB0aGUgb3V0ZXIgaW5jYXJuYXRpb24gbXVzdCBhbHNvIHJldHVybiB0aGUKc2FtZSByZXNwb25zZS4KClBlcmZvcm1hbmNlIG5vdGU6IEl0IG1pZ2h0IGJlIHRlbXB0aW5nIHRvIGV4dHJhY3QgY29tbW9ubHkgdXNlZCBmaWVsZHMgZnJvbSB0aGUKbWQgc3RydWN0dXJlIChlLmcuIHV0ZjgsIGVuZF9zdWJqZWN0KSBpbnRvIGluZGl2aWR1YWwgdmFyaWFibGVzIHRvIGltcHJvdmUKcGVyZm9ybWFuY2UuIFRlc3RzIHVzaW5nIGdjYyBvbiBhIFNQQVJDIGRpc3Byb3ZlZCB0aGlzOyBpbiB0aGUgZmlyc3QgY2FzZSwgaXQKbWFkZSBwZXJmb3JtYW5jZSB3b3JzZS4KCkFyZ3VtZW50czoKICAgZXB0ciAgICAgICAgcG9pbnRlciBpbiBzdWJqZWN0CiAgIGVjb2RlICAgICAgIHBvc2l0aW9uIGluIGNvZGUKICAgb2Zmc2V0X3RvcCAgY3VycmVudCB0b3AgcG9pbnRlcgogICBtZCAgICAgICAgICBwb2ludGVyIHRvICJzdGF0aWMiIGluZm8gZm9yIHRoZSBtYXRjaAogICBpbXMgICAgICAgICBjdXJyZW50IC9pLCAvbSwgYW5kIC9zIG9wdGlvbnMKICAgZXB0cmIgICAgICAgcG9pbnRlciB0byBjaGFpbiBvZiBibG9ja3MgY29udGFpbmluZyBlcHRyIGF0IHN0YXJ0IG9mCiAgICAgICAgICAgICAgICAgYnJhY2tldHMgLSBmb3IgdGVzdGluZyBmb3IgZW1wdHkgbWF0Y2hlcwogICBmbGFncyAgICAgICBjYW4gY29udGFpbgogICAgICAgICAgICAgICAgIG1hdGNoX2NvbmRhc3NlcnQgLSB0aGlzIGlzIGFuIGFzc2VydGlvbiBjb25kaXRpb24KICAgICAgICAgICAgICAgICBtYXRjaF9pc2dyb3VwIC0gdGhpcyBpcyB0aGUgc3RhcnQgb2YgYSBicmFja2V0ZWQgZ3JvdXAKClJldHVybnM6ICAgICAgIE1BVENIX01BVENIIGlmIG1hdGNoZWQgICAgICAgICAgICApICB0aGVzZSB2YWx1ZXMgYXJlID49IDAKICAgICAgICAgICAgICAgTUFUQ0hfTk9NQVRDSCBpZiBmYWlsZWQgdG8gbWF0Y2ggICkKICAgICAgICAgICAgICAgYSBuZWdhdGl2ZSBQQ1JFX0VSUk9SX3h4eCB2YWx1ZSBpZiBhYm9ydGVkIGJ5IGFuIGVycm9yIGNvbmRpdGlvbgogICAgICAgICAgICAgICAgIChlLmcuIHN0b3BwZWQgYnkgcmVjdXJzaW9uIGxpbWl0KQoqLwoKc3RhdGljIGludAptYXRjaChSRUdJU1RFUiBjb25zdCB1c2NoYXIgKmVwdHIsIFJFR0lTVEVSIGNvbnN0IHVzY2hhciAqZWNvZGUsCiAgaW50IG9mZnNldF90b3AsIG1hdGNoX2RhdGEgKm1kLCB1bnNpZ25lZCBsb25nIGludCBpbXMsIGVwdHJibG9jayAqZXB0cmIsCiAgaW50IGZsYWdzKQp7Ci8qIFRoZXNlIHZhcmlhYmxlcyBkbyBub3QgbmVlZCB0byBiZSBwcmVzZXJ2ZWQgb3ZlciByZWN1cnNpb24gaW4gdGhpcyBmdW5jdGlvbiwKc28gdGhleSBjYW4gYmUgb3JkaW5hcnkgdmFyaWFibGVzIGluIGFsbCBjYXNlcy4gTWFyayB0aGVtIHdpdGggInJlZ2lzdGVyIgpiZWNhdXNlIHRoZXkgYXJlIHVzZWQgYSBsb3QgaW4gbG9vcHMuICovCgpyZWdpc3RlciBpbnQgcnJjOyAgICAvKiBSZXR1cm5zIGZyb20gcmVjdXJzaXZlIGNhbGxzICovCnJlZ2lzdGVyIGludCBpOyAgICAgIC8qIFVzZWQgZm9yIGxvb3BzIG5vdCBpbnZvbHZpbmcgY2FsbHMgdG8gUk1BVENIKCkgKi8KcmVnaXN0ZXIgaW50IGM7ICAgICAgLyogQ2hhcmFjdGVyIHZhbHVlcyBub3Qga2VwdCBvdmVyIFJNQVRDSCgpIGNhbGxzICovCgovKiBXaGVuIHJlY3Vyc2lvbiBpcyBub3QgYmVpbmcgdXNlZCwgYWxsICJsb2NhbCIgdmFyaWFibGVzIHRoYXQgaGF2ZSB0byBiZQpwcmVzZXJ2ZWQgb3ZlciBjYWxscyB0byBSTUFUQ0goKSBhcmUgcGFydCBvZiBhICJmcmFtZSIgd2hpY2ggaXMgb2J0YWluZWQgZnJvbQpoZWFwIHN0b3JhZ2UuIFNldCB1cCB0aGUgdG9wLWxldmVsIGZyYW1lIGhlcmU7IG90aGVycyBhcmUgb2J0YWluZWQgZnJvbSB0aGUKaGVhcCB3aGVuZXZlciBSTUFUQ0goKSBkb2VzIGEgInJlY3Vyc2lvbiIuIFNlZSB0aGUgbWFjcm8gZGVmaW5pdGlvbnMgYWJvdmUuICovCgojaWZkZWYgTk9fUkVDVVJTRQpoZWFwZnJhbWUgKmZyYW1lID0gKHBjcmVfc3RhY2tfbWFsbG9jKShzaXplb2YoaGVhcGZyYW1lKSk7CmZyYW1lLT5YcHJldmZyYW1lID0gTlVMTDsgICAgICAgICAgICAvKiBNYXJrcyB0aGUgdG9wIGxldmVsICovCgovKiBDb3B5IGluIHRoZSBvcmlnaW5hbCBhcmd1bWVudCB2YXJpYWJsZXMgKi8KCmZyYW1lLT5YZXB0ciA9IGVwdHI7CmZyYW1lLT5YZWNvZGUgPSBlY29kZTsKZnJhbWUtPlhvZmZzZXRfdG9wID0gb2Zmc2V0X3RvcDsKZnJhbWUtPlhpbXMgPSBpbXM7CmZyYW1lLT5YZXB0cmIgPSBlcHRyYjsKZnJhbWUtPlhmbGFncyA9IGZsYWdzOwoKLyogVGhpcyBpcyB3aGVyZSBjb250cm9sIGp1bXBzIGJhY2sgdG8gdG8gZWZmZWN0ICJyZWN1cnNpb24iICovCgpIRUFQX1JFQ1VSU0U6CgovKiBNYWNyb3MgbWFrZSB0aGUgYXJndW1lbnQgdmFyaWFibGVzIGNvbWUgZnJvbSB0aGUgY3VycmVudCBmcmFtZSAqLwoKI2RlZmluZSBlcHRyICAgICAgICAgICAgICAgZnJhbWUtPlhlcHRyCiNkZWZpbmUgZWNvZGUgICAgICAgICAgICAgIGZyYW1lLT5YZWNvZGUKI2RlZmluZSBvZmZzZXRfdG9wICAgICAgICAgZnJhbWUtPlhvZmZzZXRfdG9wCiNkZWZpbmUgaW1zICAgICAgICAgICAgICAgIGZyYW1lLT5YaW1zCiNkZWZpbmUgZXB0cmIgICAgICAgICAgICAgIGZyYW1lLT5YZXB0cmIKI2RlZmluZSBmbGFncyAgICAgICAgICAgICAgZnJhbWUtPlhmbGFncwoKLyogRGl0dG8gZm9yIHRoZSBsb2NhbCB2YXJpYWJsZXMgKi8KCiNpZmRlZiBTVVBQT1JUX1VURjgKI2RlZmluZSBjaGFycHRyICAgICAgICAgICAgZnJhbWUtPlhjaGFycHRyCiNlbmRpZgojZGVmaW5lIGNhbGxwYXQgICAgICAgICAgICBmcmFtZS0+WGNhbGxwYXQKI2RlZmluZSBkYXRhICAgICAgICAgICAgICAgZnJhbWUtPlhkYXRhCiNkZWZpbmUgbmV4dCAgICAgICAgICAgICAgIGZyYW1lLT5YbmV4dAojZGVmaW5lIHBwICAgICAgICAgICAgICAgICBmcmFtZS0+WHBwCiNkZWZpbmUgcHJldiAgICAgICAgICAgICAgIGZyYW1lLT5YcHJldgojZGVmaW5lIHNhdmVkX2VwdHIgICAgICAgICBmcmFtZS0+WHNhdmVkX2VwdHIKCiNkZWZpbmUgbmV3X3JlY3Vyc2l2ZSAgICAgIGZyYW1lLT5YbmV3X3JlY3Vyc2l2ZQoKI2RlZmluZSBjdXJfaXNfd29yZCAgICAgICAgZnJhbWUtPlhjdXJfaXNfd29yZAojZGVmaW5lIGNvbmRpdGlvbiAgICAgICAgICBmcmFtZS0+WGNvbmRpdGlvbgojZGVmaW5lIG1pbmltaXplICAgICAgICAgICBmcmFtZS0+WG1pbmltaXplCiNkZWZpbmUgcHJldl9pc193b3JkICAgICAgIGZyYW1lLT5YcHJldl9pc193b3JkCgojZGVmaW5lIG9yaWdpbmFsX2ltcyAgICAgICBmcmFtZS0+WG9yaWdpbmFsX2ltcwoKI2lmZGVmIFNVUFBPUlRfVUNQCiNkZWZpbmUgcHJvcF90eXBlICAgICAgICAgIGZyYW1lLT5YcHJvcF90eXBlCiNkZWZpbmUgcHJvcF9mYWlsX3Jlc3VsdCAgIGZyYW1lLT5YcHJvcF9mYWlsX3Jlc3VsdAojZGVmaW5lIHByb3BfY2F0ZWdvcnkgICAgICBmcmFtZS0+WHByb3BfY2F0ZWdvcnkKI2RlZmluZSBwcm9wX2NoYXJ0eXBlICAgICAgZnJhbWUtPlhwcm9wX2NoYXJ0eXBlCiNkZWZpbmUgcHJvcF9vdGhlcmNhc2UgICAgIGZyYW1lLT5YcHJvcF9vdGhlcmNhc2UKI2RlZmluZSBwcm9wX3Rlc3RfYWdhaW5zdCAgZnJhbWUtPlhwcm9wX3Rlc3RfYWdhaW5zdAojZGVmaW5lIHByb3BfdGVzdF92YXJpYWJsZSBmcmFtZS0+WHByb3BfdGVzdF92YXJpYWJsZQojZW5kaWYKCiNkZWZpbmUgY3R5cGUgICAgICAgICAgICAgIGZyYW1lLT5YY3R5cGUKI2RlZmluZSBmYyAgICAgICAgICAgICAgICAgZnJhbWUtPlhmYwojZGVmaW5lIGZpICAgICAgICAgICAgICAgICBmcmFtZS0+WGZpCiNkZWZpbmUgbGVuZ3RoICAgICAgICAgICAgIGZyYW1lLT5YbGVuZ3RoCiNkZWZpbmUgbWF4ICAgICAgICAgICAgICAgIGZyYW1lLT5YbWF4CiNkZWZpbmUgbWluICAgICAgICAgICAgICAgIGZyYW1lLT5YbWluCiNkZWZpbmUgbnVtYmVyICAgICAgICAgICAgIGZyYW1lLT5YbnVtYmVyCiNkZWZpbmUgb2Zmc2V0ICAgICAgICAgICAgIGZyYW1lLT5Yb2Zmc2V0CiNkZWZpbmUgb3AgICAgICAgICAgICAgICAgIGZyYW1lLT5Yb3AKI2RlZmluZSBzYXZlX2NhcHR1cmVfbGFzdCAgZnJhbWUtPlhzYXZlX2NhcHR1cmVfbGFzdAojZGVmaW5lIHNhdmVfb2Zmc2V0MSAgICAgICBmcmFtZS0+WHNhdmVfb2Zmc2V0MQojZGVmaW5lIHNhdmVfb2Zmc2V0MiAgICAgICBmcmFtZS0+WHNhdmVfb2Zmc2V0MgojZGVmaW5lIHNhdmVfb2Zmc2V0MyAgICAgICBmcmFtZS0+WHNhdmVfb2Zmc2V0MwojZGVmaW5lIHN0YWNrc2F2ZSAgICAgICAgICBmcmFtZS0+WHN0YWNrc2F2ZQoKI2RlZmluZSBuZXdwdHJiICAgICAgICAgICAgZnJhbWUtPlhuZXdwdHJiCgovKiBXaGVuIHJlY3Vyc2lvbiBpcyBiZWluZyB1c2VkLCBsb2NhbCB2YXJpYWJsZXMgYXJlIGFsbG9jYXRlZCBvbiB0aGUgc3RhY2sgYW5kCmdldCBwcmVzZXJ2ZWQgZHVyaW5nIHJlY3Vyc2lvbiBpbiB0aGUgbm9ybWFsIHdheS4gSW4gdGhpcyBlbnZpcm9ubWVudCwgZmkgYW5kCmksIGFuZCBmYyBhbmQgYywgY2FuIGJlIHRoZSBzYW1lIHZhcmlhYmxlcy4gKi8KCiNlbHNlCiNkZWZpbmUgZmkgaQojZGVmaW5lIGZjIGMKCgojaWZkZWYgU1VQUE9SVF9VVEY4ICAgICAgICAgICAgICAgIC8qIE1hbnkgb2YgdGhlc2UgdmFyaWFibGVzIGFyZSB1c2VkIG9ueSAqLwpjb25zdCB1c2NoYXIgKmNoYXJwdHI7ICAgICAgICAgICAgIC8qIHNtYWxsIGJsb2NrcyBvZiB0aGUgY29kZS4gTXkgbm9ybWFsICAqLwojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0eWxlIG9mIGNvZGluZyB3b3VsZCBoYXZlIGRlY2xhcmVkICAqLwpjb25zdCB1c2NoYXIgKmNhbGxwYXQ7ICAgICAgICAgICAgIC8qIHRoZW0gd2l0aGluIGVhY2ggb2YgdGhvc2UgYmxvY2tzLiAgICAqLwpjb25zdCB1c2NoYXIgKmRhdGE7ICAgICAgICAgICAgICAgIC8qIEhvd2V2ZXIsIGluIG9yZGVyIHRvIGFjY29tbW9kYXRlIHRoZSAqLwpjb25zdCB1c2NoYXIgKm5leHQ7ICAgICAgICAgICAgICAgIC8qIHZlcnNpb24gb2YgdGhpcyBjb2RlIHRoYXQgdXNlcyBhbiAgICAqLwpjb25zdCB1c2NoYXIgKnBwOyAgICAgICAgICAgICAgICAgIC8qIGV4dGVybmFsICJzdGFjayIgaW1wbGVtZW50ZWQgb24gdGhlICAqLwpjb25zdCB1c2NoYXIgKnByZXY7ICAgICAgICAgICAgICAgIC8qIGhlYXAsIGl0IGlzIGVhc2llciB0byBkZWNsYXJlIHRoZW0gICAqLwpjb25zdCB1c2NoYXIgKnNhdmVkX2VwdHI7ICAgICAgICAgIC8qIGFsbCBoZXJlLCBzbyB0aGUgZGVjbGFyYXRpb25zIGNhbiAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJlIGN1dCBvdXQgaW4gYSBibG9jay4gVGhlIG9ubHkgICAgICAqLwpyZWN1cnNpb25faW5mbyBuZXdfcmVjdXJzaXZlOyAgICAgIC8qIGRlY2xhcmF0aW9ucyB3aXRoaW4gYmxvY2tzIGJlbG93IGFyZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciB2YXJpYWJsZXMgdGhhdCBkbyBub3QgaGF2ZSB0byAgICAqLwpCT09MIGN1cl9pc193b3JkOyAgICAgICAgICAgICAgICAgIC8qIGJlIHByZXNlcnZlZCBvdmVyIGEgcmVjdXJzaXZlIGNhbGwgICAqLwpCT09MIGNvbmRpdGlvbjsgICAgICAgICAgICAgICAgICAgIC8qIHRvIFJNQVRDSCgpLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwpCT09MIG1pbmltaXplOwpCT09MIHByZXZfaXNfd29yZDsKCnVuc2lnbmVkIGxvbmcgaW50IG9yaWdpbmFsX2ltczsKCiNpZmRlZiBTVVBQT1JUX1VDUAppbnQgcHJvcF90eXBlOwppbnQgcHJvcF9mYWlsX3Jlc3VsdDsKaW50IHByb3BfY2F0ZWdvcnk7CmludCBwcm9wX2NoYXJ0eXBlOwppbnQgcHJvcF9vdGhlcmNhc2U7CmludCBwcm9wX3Rlc3RfYWdhaW5zdDsKaW50ICpwcm9wX3Rlc3RfdmFyaWFibGU7CiNlbmRpZgoKaW50IGN0eXBlOwppbnQgbGVuZ3RoOwppbnQgbWF4OwppbnQgbWluOwppbnQgbnVtYmVyOwppbnQgb2Zmc2V0OwppbnQgb3A7CmludCBzYXZlX2NhcHR1cmVfbGFzdDsKaW50IHNhdmVfb2Zmc2V0MSwgc2F2ZV9vZmZzZXQyLCBzYXZlX29mZnNldDM7CmludCBzdGFja3NhdmVbUkVDX1NUQUNLX1NBVkVfTUFYXTsKCmVwdHJibG9jayBuZXdwdHJiOwojZW5kaWYKCi8qIFRoZXNlIHN0YXRlbWVudHMgYXJlIGhlcmUgdG8gc3RvcCB0aGUgY29tcGlsZXIgY29tcGxhaW5pbmcgYWJvdXQgdW5pdGlhbGl6ZWQKdmFyaWFibGVzLiAqLwoKI2lmZGVmIFNVUFBPUlRfVUNQCnByb3BfZmFpbF9yZXN1bHQgPSAwOwpwcm9wX3Rlc3RfYWdhaW5zdCA9IDA7CnByb3BfdGVzdF92YXJpYWJsZSA9IE5VTEw7CiNlbmRpZgoKLyogT0ssIG5vdyB3ZSBjYW4gZ2V0IG9uIHdpdGggdGhlIHJlYWwgY29kZSBvZiB0aGUgZnVuY3Rpb24uIFJlY3Vyc2lvbiBpcwpzcGVjaWZpZWQgYnkgdGhlIG1hY3JvcyBSTUFUQ0ggYW5kIFJSRVRVUk4uIFdoZW4gTk9fUkVDVVJTRSBpcyAqbm90KiBkZWZpbmVkLAp0aGVzZSBqdXN0IHR1cm4gaW50byBhIHJlY3Vyc2l2ZSBjYWxsIHRvIG1hdGNoKCkgYW5kIGEgInJldHVybiIsIHJlc3BlY3RpdmVseS4KSG93ZXZlciwgUk1BVENIIGlzbid0IGxpa2UgYSBmdW5jdGlvbiBjYWxsIGJlY2F1c2UgaXQncyBxdWl0ZSBhIGNvbXBsaWNhdGVkCm1hY3JvLiBJdCBoYXMgdG8gYmUgdXNlZCBpbiBvbmUgcGFydGljdWxhciB3YXkuIFRoaXMgc2hvdWxkbid0LCBob3dldmVyLCBpbXBhY3QKcGVyZm9ybWFuY2Ugd2hlbiB0cnVlIHJlY3Vyc2lvbiBpcyBiZWluZyB1c2VkLiAqLwoKaWYgKG1kLT5tYXRjaF9jYWxsX2NvdW50KysgPj0gbWQtPm1hdGNoX2xpbWl0KSBSUkVUVVJOKFBDUkVfRVJST1JfTUFUQ0hMSU1JVCk7CgpvcmlnaW5hbF9pbXMgPSBpbXM7ICAgIC8qIFNhdmUgZm9yIHJlc2V0dGluZyBvbiAnKScgKi8KCi8qIEF0IHRoZSBzdGFydCBvZiBhIGJyYWNrZXRlZCBncm91cCwgYWRkIHRoZSBjdXJyZW50IHN1YmplY3QgcG9pbnRlciB0byB0aGUKc3RhY2sgb2Ygc3VjaCBwb2ludGVycywgdG8gYmUgcmUtaW5zdGF0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgZ3JvdXAgd2hlbiB3ZSBoaXQKdGhlIGNsb3Npbmcga2V0LiBXaGVuIG1hdGNoKCkgaXMgY2FsbGVkIGluIG90aGVyIGNpcmN1bXN0YW5jZXMsIHdlIGRvbid0IGFkZCB0bwp0aGlzIHN0YWNrLiAqLwoKaWYgKChmbGFncyAmIG1hdGNoX2lzZ3JvdXApICE9IDApCiAgewogIG5ld3B0cmIuZXBiX3ByZXYgPSBlcHRyYjsKICBuZXdwdHJiLmVwYl9zYXZlZF9lcHRyID0gZXB0cjsKICBlcHRyYiA9ICZuZXdwdHJiOwogIH0KCi8qIE5vdyBzdGFydCBwcm9jZXNzaW5nIHRoZSBvcGVyYXRpb25zLiAqLwoKZm9yICg7OykKICB7CiAgb3AgPSAqZWNvZGU7CiAgbWluaW1pemUgPSBGQUxTRTsKCiAgLyogRm9yIHBhcnRpYWwgbWF0Y2hpbmcsIHJlbWVtYmVyIGlmIHdlIGV2ZXIgaGl0IHRoZSBlbmQgb2YgdGhlIHN1YmplY3QgYWZ0ZXIKICBtYXRjaGluZyBhdCBsZWFzdCBvbmUgc3ViamVjdCBjaGFyYWN0ZXIuICovCgogIGlmIChtZC0+cGFydGlhbCAmJgogICAgICBlcHRyID49IG1kLT5lbmRfc3ViamVjdCAmJgogICAgICBlcHRyID4gbWQtPnN0YXJ0X21hdGNoKQogICAgbWQtPmhpdGVuZCA9IFRSVUU7CgogIC8qIE9wZW5pbmcgY2FwdHVyaW5nIGJyYWNrZXQuIElmIHRoZXJlIGlzIHNwYWNlIGluIHRoZSBvZmZzZXQgdmVjdG9yLCBzYXZlCiAgdGhlIGN1cnJlbnQgc3ViamVjdCBwb3NpdGlvbiBpbiB0aGUgd29ya2luZyBzbG90IGF0IHRoZSB0b3Agb2YgdGhlIHZlY3Rvci4gV2UKICBtdXN0bid0IGNoYW5nZSB0aGUgY3VycmVudCB2YWx1ZXMgb2YgdGhlIGRhdGEgc2xvdCwgYmVjYXVzZSB0aGV5IG1heSBiZSBzZXQKICBmcm9tIGEgcHJldmlvdXMgaXRlcmF0aW9uIG9mIHRoaXMgZ3JvdXAsIGFuZCBiZSByZWZlcnJlZCB0byBieSBhIHJlZmVyZW5jZQogIGluc2lkZSB0aGUgZ3JvdXAuCgogIElmIHRoZSBicmFja2V0IGZhaWxzIHRvIG1hdGNoLCB3ZSBuZWVkIHRvIHJlc3RvcmUgdGhpcyB2YWx1ZSBhbmQgYWxzbyB0aGUKICB2YWx1ZXMgb2YgdGhlIGZpbmFsIG9mZnNldHMsIGluIGNhc2UgdGhleSB3ZXJlIHNldCBieSBhIHByZXZpb3VzIGl0ZXJhdGlvbiBvZgogIHRoZSBzYW1lIGJyYWNrZXQuCgogIElmIHRoZXJlIGlzbid0IGVub3VnaCBzcGFjZSBpbiB0aGUgb2Zmc2V0IHZlY3RvciwgdHJlYXQgdGhpcyBhcyBpZiBpdCB3ZXJlIGEKICBub24tY2FwdHVyaW5nIGJyYWNrZXQuIERvbid0IHdvcnJ5IGFib3V0IHNldHRpbmcgdGhlIGZsYWcgZm9yIHRoZSBlcnJvciBjYXNlCiAgaGVyZTsgdGhhdCBpcyBoYW5kbGVkIGluIHRoZSBjb2RlIGZvciBLRVQuICovCgogIGlmIChvcCA+IE9QX0JSQSkKICAgIHsKICAgIG51bWJlciA9IG9wIC0gT1BfQlJBOwoKICAgIC8qIEZvciBleHRlbmRlZCBleHRyYWN0aW9uIGJyYWNrZXRzIChsYXJnZSBudW1iZXIpLCB3ZSBoYXZlIHRvIGZpc2ggb3V0IHRoZQogICAgbnVtYmVyIGZyb20gYSBkdW1teSBvcGNvZGUgYXQgdGhlIHN0YXJ0LiAqLwoKICAgIGlmIChudW1iZXIgPiBFWFRSQUNUX0JBU0lDX01BWCkKICAgICAgbnVtYmVyID0gR0VUMihlY29kZSwgMitMSU5LX1NJWkUpOwogICAgb2Zmc2V0ID0gbnVtYmVyIDw8IDE7CgojaWZkZWYgREVCVUcKICAgIHByaW50Zigic3RhcnQgYnJhY2tldCAlZCBzdWJqZWN0PSIsIG51bWJlcik7CiAgICBwY2hhcnMoZXB0ciwgMTYsIFRSVUUsIG1kKTsKICAgIHByaW50ZigiXG4iKTsKI2VuZGlmCgogICAgaWYgKG9mZnNldCA8IG1kLT5vZmZzZXRfbWF4KQogICAgICB7CiAgICAgIHNhdmVfb2Zmc2V0MSA9IG1kLT5vZmZzZXRfdmVjdG9yW29mZnNldF07CiAgICAgIHNhdmVfb2Zmc2V0MiA9IG1kLT5vZmZzZXRfdmVjdG9yW29mZnNldCsxXTsKICAgICAgc2F2ZV9vZmZzZXQzID0gbWQtPm9mZnNldF92ZWN0b3JbbWQtPm9mZnNldF9lbmQgLSBudW1iZXJdOwogICAgICBzYXZlX2NhcHR1cmVfbGFzdCA9IG1kLT5jYXB0dXJlX2xhc3Q7CgogICAgICBEUFJJTlRGKCgic2F2aW5nICVkICVkICVkXG4iLCBzYXZlX29mZnNldDEsIHNhdmVfb2Zmc2V0Miwgc2F2ZV9vZmZzZXQzKSk7CiAgICAgIG1kLT5vZmZzZXRfdmVjdG9yW21kLT5vZmZzZXRfZW5kIC0gbnVtYmVyXSA9IGVwdHIgLSBtZC0+c3RhcnRfc3ViamVjdDsKCiAgICAgIGRvCiAgICAgICAgewogICAgICAgIFJNQVRDSChycmMsIGVwdHIsIGVjb2RlICsgMSArIExJTktfU0laRSwgb2Zmc2V0X3RvcCwgbWQsIGltcywgZXB0cmIsCiAgICAgICAgICBtYXRjaF9pc2dyb3VwKTsKICAgICAgICBpZiAocnJjICE9IE1BVENIX05PTUFUQ0gpIFJSRVRVUk4ocnJjKTsKICAgICAgICBtZC0+Y2FwdHVyZV9sYXN0ID0gc2F2ZV9jYXB0dXJlX2xhc3Q7CiAgICAgICAgZWNvZGUgKz0gR0VUKGVjb2RlLCAxKTsKICAgICAgICB9CiAgICAgIHdoaWxlICgqZWNvZGUgPT0gT1BfQUxUKTsKCiAgICAgIERQUklOVEYoKCJicmFja2V0ICVkIGZhaWxlZFxuIiwgbnVtYmVyKSk7CgogICAgICBtZC0+b2Zmc2V0X3ZlY3RvcltvZmZzZXRdID0gc2F2ZV9vZmZzZXQxOwogICAgICBtZC0+b2Zmc2V0X3ZlY3RvcltvZmZzZXQrMV0gPSBzYXZlX29mZnNldDI7CiAgICAgIG1kLT5vZmZzZXRfdmVjdG9yW21kLT5vZmZzZXRfZW5kIC0gbnVtYmVyXSA9IHNhdmVfb2Zmc2V0MzsKCiAgICAgIFJSRVRVUk4oTUFUQ0hfTk9NQVRDSCk7CiAgICAgIH0KCiAgICAvKiBJbnN1ZmZpY2llbnQgcm9vbSBmb3Igc2F2aW5nIGNhcHR1cmVkIGNvbnRlbnRzICovCgogICAgZWxzZSBvcCA9IE9QX0JSQTsKICAgIH0KCiAgLyogT3RoZXIgdHlwZXMgb2Ygbm9kZSBjYW4gYmUgaGFuZGxlZCBieSBhIHN3aXRjaCAqLwoKICBzd2l0Y2gob3ApCiAgICB7CiAgICBjYXNlIE9QX0JSQTogICAgIC8qIE5vbi1jYXB0dXJpbmcgYnJhY2tldDogb3B0aW1pemVkICovCiAgICBEUFJJTlRGKCgic3RhcnQgYnJhY2tldCAwXG4iKSk7CiAgICBkbwogICAgICB7CiAgICAgIFJNQVRDSChycmMsIGVwdHIsIGVjb2RlICsgMSArIExJTktfU0laRSwgb2Zmc2V0X3RvcCwgbWQsIGltcywgZXB0cmIsCiAgICAgICAgbWF0Y2hfaXNncm91cCk7CiAgICAgIGlmIChycmMgIT0gTUFUQ0hfTk9NQVRDSCkgUlJFVFVSTihycmMpOwogICAgICBlY29kZSArPSBHRVQoZWNvZGUsIDEpOwogICAgICB9CiAgICB3aGlsZSAoKmVjb2RlID09IE9QX0FMVCk7CiAgICBEUFJJTlRGKCgiYnJhY2tldCAwIGZhaWxlZFxuIikpOwogICAgUlJFVFVSTihNQVRDSF9OT01BVENIKTsKCiAgICAvKiBDb25kaXRpb25hbCBncm91cDogY29tcGlsYXRpb24gY2hlY2tlZCB0aGF0IHRoZXJlIGFyZSBubyBtb3JlIHRoYW4KICAgIHR3byBicmFuY2hlcy4gSWYgdGhlIGNvbmRpdGlvbiBpcyBmYWxzZSwgc2tpcHBpbmcgdGhlIGZpcnN0IGJyYW5jaCB0YWtlcyB1cwogICAgcGFzdCB0aGUgZW5kIGlmIHRoZXJlIGlzIG9ubHkgb25lIGJyYW5jaCwgYnV0IHRoYXQncyBPSyBiZWNhdXNlIHRoYXQgaXMKICAgIGV4YWN0bHkgd2hhdCBnb2luZyB0byB0aGUga2V0IHdvdWxkIGRvLiAqLwoKICAgIGNhc2UgT1BfQ09ORDoKICAgIGlmIChlY29kZVtMSU5LX1NJWkUrMV0gPT0gT1BfQ1JFRikgLyogQ29uZGl0aW9uIGV4dHJhY3Qgb3IgcmVjdXJzZSB0ZXN0ICovCiAgICAgIHsKICAgICAgb2Zmc2V0ID0gR0VUMihlY29kZSwgTElOS19TSVpFKzIpIDw8IDE7ICAvKiBEb3VibGVkIHJlZiBudW1iZXIgKi8KICAgICAgY29uZGl0aW9uID0gKG9mZnNldCA9PSBDUkVGX1JFQ1VSU0UgKiAyKT8KICAgICAgICAobWQtPnJlY3Vyc2l2ZSAhPSBOVUxMKSA6CiAgICAgICAgKG9mZnNldCA8IG9mZnNldF90b3AgJiYgbWQtPm9mZnNldF92ZWN0b3Jbb2Zmc2V0XSA+PSAwKTsKICAgICAgUk1BVENIKHJyYywgZXB0ciwgZWNvZGUgKyAoY29uZGl0aW9uPwogICAgICAgIChMSU5LX1NJWkUgKyA0KSA6IChMSU5LX1NJWkUgKyAxICsgR0VUKGVjb2RlLCAxKSkpLAogICAgICAgIG9mZnNldF90b3AsIG1kLCBpbXMsIGVwdHJiLCBtYXRjaF9pc2dyb3VwKTsKICAgICAgUlJFVFVSTihycmMpOwogICAgICB9CgogICAgLyogVGhlIGNvbmRpdGlvbiBpcyBhbiBhc3NlcnRpb24uIENhbGwgbWF0Y2goKSB0byBldmFsdWF0ZSBpdCAtIHNldHRpbmcKICAgIHRoZSBmaW5hbCBhcmd1bWVudCBUUlVFIGNhdXNlcyBpdCB0byBzdG9wIGF0IHRoZSBlbmQgb2YgYW4gYXNzZXJ0aW9uLiAqLwoKICAgIGVsc2UKICAgICAgewogICAgICBSTUFUQ0gocnJjLCBlcHRyLCBlY29kZSArIDEgKyBMSU5LX1NJWkUsIG9mZnNldF90b3AsIG1kLCBpbXMsIE5VTEwsCiAgICAgICAgICBtYXRjaF9jb25kYXNzZXJ0IHwgbWF0Y2hfaXNncm91cCk7CiAgICAgIGlmIChycmMgPT0gTUFUQ0hfTUFUQ0gpCiAgICAgICAgewogICAgICAgIGVjb2RlICs9IDEgKyBMSU5LX1NJWkUgKyBHRVQoZWNvZGUsIExJTktfU0laRSsyKTsKICAgICAgICB3aGlsZSAoKmVjb2RlID09IE9QX0FMVCkgZWNvZGUgKz0gR0VUKGVjb2RlLCAxKTsKICAgICAgICB9CiAgICAgIGVsc2UgaWYgKHJyYyAhPSBNQVRDSF9OT01BVENIKQogICAgICAgIHsKICAgICAgICBSUkVUVVJOKHJyYyk7ICAgICAgICAgLyogTmVlZCBicmFjZXMgYmVjYXVzZSBvZiBmb2xsb3dpbmcgZWxzZSAqLwogICAgICAgIH0KICAgICAgZWxzZSBlY29kZSArPSBHRVQoZWNvZGUsIDEpOwogICAgICBSTUFUQ0gocnJjLCBlcHRyLCBlY29kZSArIDEgKyBMSU5LX1NJWkUsIG9mZnNldF90b3AsIG1kLCBpbXMsIGVwdHJiLAogICAgICAgIG1hdGNoX2lzZ3JvdXApOwogICAgICBSUkVUVVJOKHJyYyk7CiAgICAgIH0KICAgIC8qIENvbnRyb2wgbmV2ZXIgcmVhY2hlcyBoZXJlICovCgogICAgLyogU2tpcCBvdmVyIGNvbmRpdGlvbmFsIHJlZmVyZW5jZSBvciBsYXJnZSBleHRyYWN0aW9uIG51bWJlciBkYXRhIGlmCiAgICBlbmNvdW50ZXJlZC4gKi8KCiAgICBjYXNlIE9QX0NSRUY6CiAgICBjYXNlIE9QX0JSQU5VTUJFUjoKICAgIGVjb2RlICs9IDM7CiAgICBicmVhazsKCiAgICAvKiBFbmQgb2YgdGhlIHBhdHRlcm4uIElmIHdlIGFyZSBpbiBhIHJlY3Vyc2lvbiwgd2Ugc2hvdWxkIHJlc3RvcmUgdGhlCiAgICBvZmZzZXRzIGFwcHJvcHJpYXRlbHkgYW5kIGNvbnRpbnVlIGZyb20gYWZ0ZXIgdGhlIGNhbGwuICovCgogICAgY2FzZSBPUF9FTkQ6CiAgICBpZiAobWQtPnJlY3Vyc2l2ZSAhPSBOVUxMICYmIG1kLT5yZWN1cnNpdmUtPmdyb3VwX251bSA9PSAwKQogICAgICB7CiAgICAgIHJlY3Vyc2lvbl9pbmZvICpyZWMgPSBtZC0+cmVjdXJzaXZlOwogICAgICBEUFJJTlRGKCgiSGl0IHRoZSBlbmQgaW4gYSAoPzApIHJlY3Vyc2lvblxuIikpOwogICAgICBtZC0+cmVjdXJzaXZlID0gcmVjLT5wcmV2cmVjOwogICAgICBtZW1tb3ZlKG1kLT5vZmZzZXRfdmVjdG9yLCByZWMtPm9mZnNldF9zYXZlLAogICAgICAgIHJlYy0+c2F2ZWRfbWF4ICogc2l6ZW9mKGludCkpOwogICAgICBtZC0+c3RhcnRfbWF0Y2ggPSByZWMtPnNhdmVfc3RhcnQ7CiAgICAgIGltcyA9IG9yaWdpbmFsX2ltczsKICAgICAgZWNvZGUgPSByZWMtPmFmdGVyX2NhbGw7CiAgICAgIGJyZWFrOwogICAgICB9CgogICAgLyogT3RoZXJ3aXNlLCBpZiBQQ1JFX05PVEVNUFRZIGlzIHNldCwgZmFpbCBpZiB3ZSBoYXZlIG1hdGNoZWQgYW4gZW1wdHkKICAgIHN0cmluZyAtIGJhY2t0cmFja2luZyB3aWxsIHRoZW4gdHJ5IG90aGVyIGFsdGVybmF0aXZlcywgaWYgYW55LiAqLwoKICAgIGlmIChtZC0+bm90ZW1wdHkgJiYgZXB0ciA9PSBtZC0+c3RhcnRfbWF0Y2gpIFJSRVRVUk4oTUFUQ0hfTk9NQVRDSCk7CiAgICBtZC0+ZW5kX21hdGNoX3B0ciA9IGVwdHI7ICAgICAgICAgIC8qIFJlY29yZCB3aGVyZSB3ZSBlbmRlZCAqLwogICAgbWQtPmVuZF9vZmZzZXRfdG9wID0gb2Zmc2V0X3RvcDsgICAvKiBhbmQgaG93IG1hbnkgZXh0cmFjdHMgd2VyZSB0YWtlbiAqLwogICAgUlJFVFVSTihNQVRDSF9NQVRDSCk7CgogICAgLyogQ2hhbmdlIG9wdGlvbiBzZXR0aW5ncyAqLwoKICAgIGNhc2UgT1BfT1BUOgogICAgaW1zID0gZWNvZGVbMV07CiAgICBlY29kZSArPSAyOwogICAgRFBSSU5URigoImltcyBzZXQgdG8gJTAybHhcbiIsIGltcykpOwogICAgYnJlYWs7CgogICAgLyogQXNzZXJ0aW9uIGJyYWNrZXRzLiBDaGVjayB0aGUgYWx0ZXJuYXRpdmUgYnJhbmNoZXMgaW4gdHVybiAtIHRoZQogICAgbWF0Y2hpbmcgd29uJ3QgcGFzcyB0aGUgS0VUIGZvciBhbiBhc3NlcnRpb24uIElmIGFueSBvbmUgYnJhbmNoIG1hdGNoZXMsCiAgICB0aGUgYXNzZXJ0aW9uIGlzIHRydWUuIExvb2tiZWhpbmQgYXNzZXJ0aW9ucyBoYXZlIGFuIE9QX1JFVkVSU0UgaXRlbSBhdCB0aGUKICAgIHN0YXJ0IG9mIGVhY2ggYnJhbmNoIHRvIG1vdmUgdGhlIGN1cnJlbnQgcG9pbnQgYmFja3dhcmRzLCBzbyB0aGUgY29kZSBhdAogICAgdGhpcyBsZXZlbCBpcyBpZGVudGljYWwgdG8gdGhlIGxvb2thaGVhZCBjYXNlLiAqLwoKICAgIGNhc2UgT1BfQVNTRVJUOgogICAgY2FzZSBPUF9BU1NFUlRCQUNLOgogICAgZG8KICAgICAgewogICAgICBSTUFUQ0gocnJjLCBlcHRyLCBlY29kZSArIDEgKyBMSU5LX1NJWkUsIG9mZnNldF90b3AsIG1kLCBpbXMsIE5VTEwsCiAgICAgICAgbWF0Y2hfaXNncm91cCk7CiAgICAgIGlmIChycmMgPT0gTUFUQ0hfTUFUQ0gpIGJyZWFrOwogICAgICBpZiAocnJjICE9IE1BVENIX05PTUFUQ0gpIFJSRVRVUk4ocnJjKTsKICAgICAgZWNvZGUgKz0gR0VUKGVjb2RlLCAxKTsKICAgICAgfQogICAgd2hpbGUgKCplY29kZSA9PSBPUF9BTFQpOwogICAgaWYgKCplY29kZSA9PSBPUF9LRVQpIFJSRVRVUk4oTUFUQ0hfTk9NQVRDSCk7CgogICAgLyogSWYgY2hlY2tpbmcgYW4gYXNzZXJ0aW9uIGZvciBhIGNvbmRpdGlvbiwgcmV0dXJuIE1BVENIX01BVENILiAqLwoKICAgIGlmICgoZmxhZ3MgJiBtYXRjaF9jb25kYXNzZXJ0KSAhPSAwKSBSUkVUVVJOKE1BVENIX01BVENIKTsKCiAgICAvKiBDb250aW51ZSBmcm9tIGFmdGVyIHRoZSBhc3NlcnRpb24sIHVwZGF0aW5nIHRoZSBvZmZzZXRzIGhpZ2ggd2F0ZXIKICAgIG1hcmssIHNpbmNlIGV4dHJhY3RzIG1heSBoYXZlIGJlZW4gdGFrZW4gZHVyaW5nIHRoZSBhc3NlcnRpb24uICovCgogICAgZG8gZWNvZGUgKz0gR0VUKGVjb2RlLDEpOyB3aGlsZSAoKmVjb2RlID09IE9QX0FMVCk7CiAgICBlY29kZSArPSAxICsgTElOS19TSVpFOwogICAgb2Zmc2V0X3RvcCA9IG1kLT5lbmRfb2Zmc2V0X3RvcDsKICAgIGNvbnRpbnVlOwoKICAgIC8qIE5lZ2F0aXZlIGFzc2VydGlvbjogYWxsIGJyYW5jaGVzIG11c3QgZmFpbCB0byBtYXRjaCAqLwoKICAgIGNhc2UgT1BfQVNTRVJUX05PVDoKICAgIGNhc2UgT1BfQVNTRVJUQkFDS19OT1Q6CiAgICBkbwogICAgICB7CiAgICAgIFJNQVRDSChycmMsIGVwdHIsIGVjb2RlICsgMSArIExJTktfU0laRSwgb2Zmc2V0X3RvcCwgbWQsIGltcywgTlVMTCwKICAgICAgICBtYXRjaF9pc2dyb3VwKTsKICAgICAgaWYgKHJyYyA9PSBNQVRDSF9NQVRDSCkgUlJFVFVSTihNQVRDSF9OT01BVENIKTsKICAgICAgaWYgKHJyYyAhPSBNQVRDSF9OT01BVENIKSBSUkVUVVJOKHJyYyk7CiAgICAgIGVjb2RlICs9IEdFVChlY29kZSwxKTsKICAgICAgfQogICAgd2hpbGUgKCplY29kZSA9PSBPUF9BTFQpOwoKICAgIGlmICgoZmxhZ3MgJiBtYXRjaF9jb25kYXNzZXJ0KSAhPSAwKSBSUkVUVVJOKE1BVENIX01BVENIKTsKCiAgICBlY29kZSArPSAxICsgTElOS19TSVpFOwogICAgY29udGludWU7CgogICAgLyogTW92ZSB0aGUgc3ViamVjdCBwb2ludGVyIGJhY2suIFRoaXMgb2NjdXJzIG9ubHkgYXQgdGhlIHN0YXJ0IG9mCiAgICBlYWNoIGJyYW5jaCBvZiBhIGxvb2tiZWhpbmQgYXNzZXJ0aW9uLiBJZiB3ZSBhcmUgdG9vIGNsb3NlIHRvIHRoZSBzdGFydCB0bwogICAgbW92ZSBiYWNrLCB0aGlzIG1hdGNoIGZ1bmN0aW9uIGZhaWxzLiBXaGVuIHdvcmtpbmcgd2l0aCBVVEYtOCB3ZSBtb3ZlCiAgICBiYWNrIGEgbnVtYmVyIG9mIGNoYXJhY3RlcnMsIG5vdCBieXRlcy4gKi8KCiAgICBjYXNlIE9QX1JFVkVSU0U6CiNpZmRlZiBTVVBQT1JUX1VURjgKICAgIGlmIChtZC0+dXRmOCkKICAgICAgewogICAgICBjID0gR0VUKGVjb2RlLDEpOwogICAgICBmb3IgKGkgPSAwOyBpIDwgYzsgaSsrKQogICAgICAgIHsKICAgICAgICBlcHRyLS07CiAgICAgICAgaWYgKGVwdHIgPCBtZC0+c3RhcnRfc3ViamVjdCkgUlJFVFVSTihNQVRDSF9OT01BVENIKTsKICAgICAgICBCQUNLQ0hBUihlcHRyKQogICAgICAgIH0KICAgICAgfQogICAgZWxzZQojZW5kaWYKCiAgICAvKiBObyBVVEYtOCBzdXBwb3J0LCBvciBub3QgaW4gVVRGLTggbW9kZTogY291bnQgaXMgYnl0ZSBjb3VudCAqLwoKICAgICAgewogICAgICBlcHRyIC09IEdFVChlY29kZSwxKTsKICAgICAgaWYgKGVwdHIgPCBtZC0+c3RhcnRfc3ViamVjdCkgUlJFVFVSTihNQVRDSF9OT01BVENIKTsKICAgICAgfQoKICAgIC8qIFNraXAgdG8gbmV4dCBvcCBjb2RlICovCgogICAgZWNvZGUgKz0gMSArIExJTktfU0laRTsKICAgIGJyZWFrOwoKICAgIC8qIFRoZSBjYWxsb3V0IGl0ZW0gY2FsbHMgYW4gZXh0ZXJuYWwgZnVuY3Rpb24sIGlmIG9uZSBpcyBwcm92aWRlZCwgcGFzc2luZwogICAgZGV0YWlscyBvZiB0aGUgbWF0Y2ggc28gZmFyLiBUaGlzIGlzIG1haW5seSBmb3IgZGVidWdnaW5nLCB0aG91Z2ggdGhlCiAgICBmdW5jdGlvbiBpcyBhYmxlIHRvIGZvcmNlIGEgZmFpbHVyZS4gKi8KCiAgICBjYXNlIE9QX0NBTExPVVQ6CiAgICBpZiAocGNyZV9jYWxsb3V0ICE9IE5VTEwpCiAgICAgIHsKICAgICAgcGNyZV9jYWxsb3V0X2Jsb2NrIGNiOwogICAgICBjYi52ZXJzaW9uICAgICAgICAgID0gMTsgICAvKiBWZXJzaW9uIDEgb2YgdGhlIGNhbGxvdXQgYmxvY2sgKi8KICAgICAgY2IuY2FsbG91dF9udW1iZXIgICA9IGVjb2RlWzFdOwogICAgICBjYi5vZmZzZXRfdmVjdG9yICAgID0gbWQtPm9mZnNldF92ZWN0b3I7CiAgICAgIGNiLnN1YmplY3QgICAgICAgICAgPSAoY29uc3QgY2hhciAqKW1kLT5zdGFydF9zdWJqZWN0OwogICAgICBjYi5zdWJqZWN0X2xlbmd0aCAgID0gbWQtPmVuZF9zdWJqZWN0IC0gbWQtPnN0YXJ0X3N1YmplY3Q7CiAgICAgIGNiLnN0YXJ0X21hdGNoICAgICAgPSBtZC0+c3RhcnRfbWF0Y2ggLSBtZC0+c3RhcnRfc3ViamVjdDsKICAgICAgY2IuY3VycmVudF9wb3NpdGlvbiA9IGVwdHIgLSBtZC0+c3RhcnRfc3ViamVjdDsKICAgICAgY2IucGF0dGVybl9wb3NpdGlvbiA9IEdFVChlY29kZSwgMik7CiAgICAgIGNiLm5leHRfaXRlbV9sZW5ndGggPSBHRVQoZWNvZGUsIDIgKyBMSU5LX1NJWkUpOwogICAgICBjYi5jYXB0dXJlX3RvcCAgICAgID0gb2Zmc2V0X3RvcC8yOwogICAgICBjYi5jYXB0dXJlX2xhc3QgICAgID0gbWQtPmNhcHR1cmVfbGFzdDsKICAgICAgY2IuY2FsbG91dF9kYXRhICAgICA9IG1kLT5jYWxsb3V0X2RhdGE7CiAgICAgIGlmICgocnJjID0gKCpwY3JlX2NhbGxvdXQpKCZjYikpID4gMCkgUlJFVFVSTihNQVRDSF9OT01BVENIKTsKICAgICAgaWYgKHJyYyA8IDApIFJSRVRVUk4ocnJjKTsKICAgICAgfQogICAgZWNvZGUgKz0gMiArIDIqTElOS19TSVpFOwogICAgYnJlYWs7CgogICAgLyogUmVjdXJzaW9uIGVpdGhlciBtYXRjaGVzIHRoZSBjdXJyZW50IHJlZ2V4LCBvciBzb21lIHN1YmV4cHJlc3Npb24uIFRoZQogICAgb2Zmc2V0IGRhdGEgaXMgdGhlIG9mZnNldCB0byB0aGUgc3RhcnRpbmcgYnJhY2tldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUKICAgIHdob2xlIHBhdHRlcm4uIChUaGlzIGlzIHNvIHRoYXQgaXQgd29ya3MgZnJvbSBkdXBsaWNhdGVkIHN1YnBhdHRlcm5zLikKCiAgICBJZiB0aGVyZSBhcmUgYW55IGNhcHR1cmluZyBicmFja2V0cyBzdGFydGVkIGJ1dCBub3QgZmluaXNoZWQsIHdlIGhhdmUgdG8KICAgIHNhdmUgdGhlaXIgc3RhcnRpbmcgcG9pbnRzIGFuZCByZWluc3RhdGUgdGhlbSBhZnRlciB0aGUgcmVjdXJzaW9uLiBIb3dldmVyLAogICAgd2UgZG9uJ3Qga25vdyBob3cgbWFueSBzdWNoIHRoZXJlIGFyZSAob2Zmc2V0X3RvcCByZWNvcmRzIHRoZSBjb21wbGV0ZWQKICAgIHRvdGFsKSBzbyB3ZSBqdXN0IGhhdmUgdG8gc2F2ZSBhbGwgdGhlIHBvdGVudGlhbCBkYXRhLiBUaGVyZSBtYXkgYmUgdXAgdG8KICAgIDY1NTM1IHN1Y2ggdmFsdWVzLCB3aGljaCBpcyB0b28gbGFyZ2UgdG8gcHV0IG9uIHRoZSBzdGFjaywgYnV0IHVzaW5nIG1hbGxvYwogICAgZm9yIHNtYWxsIG51bWJlcnMgc2VlbXMgZXhwZW5zaXZlLiBBcyBhIGNvbXByb21pc2UsIHRoZSBzdGFjayBpcyB1c2VkIHdoZW4KICAgIHRoZXJlIGFyZSBubyBtb3JlIHRoYW4gUkVDX1NUQUNLX1NBVkVfTUFYIHZhbHVlcyB0byBzdG9yZTsgb3RoZXJ3aXNlIG1hbGxvYwogICAgaXMgdXNlZC4gQSBwcm9ibGVtIGlzIHdoYXQgdG8gZG8gaWYgdGhlIG1hbGxvYyBmYWlscyAuLi4gdGhlcmUgaXMgbm8gd2F5IG9mCiAgICByZXR1cm5pbmcgdG8gdGhlIHRvcCBsZXZlbCB3aXRoIGFuIGVycm9yLiBTYXZlIHRoZSB0b3AgUkVDX1NUQUNLX1NBVkVfTUFYCiAgICB2YWx1ZXMgb24gdGhlIHN0YWNrLCBhbmQgYWNjZXB0IHRoYXQgdGhlIHJlc3QgbWF5IGJlIHdyb25nLgoKICAgIFRoZXJlIGFyZSBhbHNvIG90aGVyIHZhbHVlcyB0aGF0IGhhdmUgdG8gYmUgc2F2ZWQuIFdlIHVzZSBhIGNoYWluZWQKICAgIHNlcXVlbmNlIG9mIGJsb2NrcyB0aGF0IGFjdHVhbGx5IGxpdmUgb24gdGhlIHN0YWNrLiBUaGFua3MgdG8gUm9iaW4gSG91c3RvbgogICAgZm9yIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoaXMgbG9naWMuICovCgogICAgY2FzZSBPUF9SRUNVUlNFOgogICAgICB7CiAgICAgIGNhbGxwYXQgPSBtZC0+c3RhcnRfY29kZSArIEdFVChlY29kZSwgMSk7CiAgICAgIG5ld19yZWN1cnNpdmUuZ3JvdXBfbnVtID0gKmNhbGxwYXQgLSBPUF9CUkE7CgogICAgICAvKiBGb3IgZXh0ZW5kZWQgZXh0cmFjdGlvbiBicmFja2V0cyAobGFyZ2UgbnVtYmVyKSwgd2UgaGF2ZSB0byBmaXNoIG91dAogICAgICB0aGUgbnVtYmVyIGZyb20gYSBkdW1teSBvcGNvZGUgYXQgdGhlIHN0YXJ0LiAqLwoKICAgICAgaWYgKG5ld19yZWN1cnNpdmUuZ3JvdXBfbnVtID4gRVhUUkFDVF9CQVNJQ19NQVgpCiAgICAgICAgbmV3X3JlY3Vyc2l2ZS5ncm91cF9udW0gPSBHRVQyKGNhbGxwYXQsIDIrTElOS19TSVpFKTsKCiAgICAgIC8qIEFkZCB0byAicmVjdXJzaW5nIHN0YWNrIiAqLwoKICAgICAgbmV3X3JlY3Vyc2l2ZS5wcmV2cmVjID0gbWQtPnJlY3Vyc2l2ZTsKICAgICAgbWQtPnJlY3Vyc2l2ZSA9ICZuZXdfcmVjdXJzaXZlOwoKICAgICAgLyogRmluZCB3aGVyZSB0byBjb250aW51ZSBmcm9tIGFmdGVyd2FyZHMgKi8KCiAgICAgIGVjb2RlICs9IDEgKyBMSU5LX1NJWkU7CiAgICAgIG5ld19yZWN1cnNpdmUuYWZ0ZXJfY2FsbCA9IGVjb2RlOwoKICAgICAgLyogTm93IHNhdmUgdGhlIG9mZnNldCBkYXRhLiAqLwoKICAgICAgbmV3X3JlY3Vyc2l2ZS5zYXZlZF9tYXggPSBtZC0+b2Zmc2V0X2VuZDsKICAgICAgaWYgKG5ld19yZWN1cnNpdmUuc2F2ZWRfbWF4IDw9IFJFQ19TVEFDS19TQVZFX01BWCkKICAgICAgICBuZXdfcmVjdXJzaXZlLm9mZnNldF9zYXZlID0gc3RhY2tzYXZlOwogICAgICBlbHNlCiAgICAgICAgewogICAgICAgIG5ld19yZWN1cnNpdmUub2Zmc2V0X3NhdmUgPQogICAgICAgICAgKGludCAqKShwY3JlX21hbGxvYykobmV3X3JlY3Vyc2l2ZS5zYXZlZF9tYXggKiBzaXplb2YoaW50KSk7CiAgICAgICAgaWYgKG5ld19yZWN1cnNpdmUub2Zmc2V0X3NhdmUgPT0gTlVMTCkgUlJFVFVSTihQQ1JFX0VSUk9SX05PTUVNT1JZKTsKICAgICAgICB9CgogICAgICBtZW1jcHkobmV3X3JlY3Vyc2l2ZS5vZmZzZXRfc2F2ZSwgbWQtPm9mZnNldF92ZWN0b3IsCiAgICAgICAgICAgIG5ld19yZWN1cnNpdmUuc2F2ZWRfbWF4ICogc2l6ZW9mKGludCkpOwogICAgICBuZXdfcmVjdXJzaXZlLnNhdmVfc3RhcnQgPSBtZC0+c3RhcnRfbWF0Y2g7CiAgICAgIG1kLT5zdGFydF9tYXRjaCA9IGVwdHI7CgogICAgICAvKiBPSywgbm93IHdlIGNhbiBkbyB0aGUgcmVjdXJzaW9uLiBGb3IgZWFjaCB0b3AtbGV2ZWwgYWx0ZXJuYXRpdmUgd2UKICAgICAgcmVzdG9yZSB0aGUgb2Zmc2V0IGFuZCByZWN1cnNpb24gZGF0YS4gKi8KCiAgICAgIERQUklOVEYoKCJSZWN1cnNpbmcgaW50byBncm91cCAlZFxuIiwgbmV3X3JlY3Vyc2l2ZS5ncm91cF9udW0pKTsKICAgICAgZG8KICAgICAgICB7CiAgICAgICAgUk1BVENIKHJyYywgZXB0ciwgY2FsbHBhdCArIDEgKyBMSU5LX1NJWkUsIG9mZnNldF90b3AsIG1kLCBpbXMsCiAgICAgICAgICAgIGVwdHJiLCBtYXRjaF9pc2dyb3VwKTsKICAgICAgICBpZiAocnJjID09IE1BVENIX01BVENIKQogICAgICAgICAgewogICAgICAgICAgbWQtPnJlY3Vyc2l2ZSA9IG5ld19yZWN1cnNpdmUucHJldnJlYzsKICAgICAgICAgIGlmIChuZXdfcmVjdXJzaXZlLm9mZnNldF9zYXZlICE9IHN0YWNrc2F2ZSkKICAgICAgICAgICAgKHBjcmVfZnJlZSkobmV3X3JlY3Vyc2l2ZS5vZmZzZXRfc2F2ZSk7CiAgICAgICAgICBSUkVUVVJOKE1BVENIX01BVENIKTsKICAgICAgICAgIH0KICAgICAgICBlbHNlIGlmIChycmMgIT0gTUFUQ0hfTk9NQVRDSCkgUlJFVFVSTihycmMpOwoKICAgICAgICBtZC0+cmVjdXJzaXZlID0gJm5ld19yZWN1cnNpdmU7CiAgICAgICAgbWVtY3B5KG1kLT5vZmZzZXRfdmVjdG9yLCBuZXdfcmVjdXJzaXZlLm9mZnNldF9zYXZlLAogICAgICAgICAgICBuZXdfcmVjdXJzaXZlLnNhdmVkX21heCAqIHNpemVvZihpbnQpKTsKICAgICAgICBjYWxscGF0ICs9IEdFVChjYWxscGF0LCAxKTsKICAgICAgICB9CiAgICAgIHdoaWxlICgqY2FsbHBhdCA9PSBPUF9BTFQpOwoKICAgICAgRFBSSU5URigoIlJlY3Vyc2lvbiBkaWRuJ3QgbWF0Y2hcbiIpKTsKICAgICAgbWQtPnJlY3Vyc2l2ZSA9IG5ld19yZWN1cnNpdmUucHJldnJlYzsKICAgICAgaWYgKG5ld19yZWN1cnNpdmUub2Zmc2V0X3NhdmUgIT0gc3RhY2tzYXZlKQogICAgICAgIChwY3JlX2ZyZWUpKG5ld19yZWN1cnNpdmUub2Zmc2V0X3NhdmUpOwogICAgICBSUkVUVVJOKE1BVENIX05PTUFUQ0gpOwogICAgICB9CiAgICAvKiBDb250cm9sIG5ldmVyIHJlYWNoZXMgaGVyZSAqLwoKICAgIC8qICJPbmNlIiBicmFja2V0cyBhcmUgbGlrZSBhc3NlcnRpb24gYnJhY2tldHMgZXhjZXB0IHRoYXQgYWZ0ZXIgYSBtYXRjaCwKICAgIHRoZSBwb2ludCBpbiB0aGUgc3ViamVjdCBzdHJpbmcgaXMgbm90IG1vdmVkIGJhY2suIFRodXMgdGhlcmUgY2FuIG5ldmVyIGJlCiAgICBhIG1vdmUgYmFjayBpbnRvIHRoZSBicmFja2V0cy4gRnJpZWRsIGNhbGxzIHRoZXNlICJhdG9taWMiIHN1YnBhdHRlcm5zLgogICAgQ2hlY2sgdGhlIGFsdGVybmF0aXZlIGJyYW5jaGVzIGluIHR1cm4gLSB0aGUgbWF0Y2hpbmcgd29uJ3QgcGFzcyB0aGUgS0VUCiAgICBmb3IgdGhpcyBraW5kIG9mIHN1YnBhdHRlcm4uIElmIGFueSBvbmUgYnJhbmNoIG1hdGNoZXMsIHdlIGNhcnJ5IG9uIGFzIGF0CiAgICB0aGUgZW5kIG9mIGEgbm9ybWFsIGJyYWNrZXQsIGxlYXZpbmcgdGhlIHN1YmplY3QgcG9pbnRlci4gKi8KCiAgICBjYXNlIE9QX09OQ0U6CiAgICAgIHsKICAgICAgcHJldiA9IGVjb2RlOwogICAgICBzYXZlZF9lcHRyID0gZXB0cjsKCiAgICAgIGRvCiAgICAgICAgewogICAgICAgIFJNQVRDSChycmMsIGVwdHIsIGVjb2RlICsgMSArIExJTktfU0laRSwgb2Zmc2V0X3RvcCwgbWQsIGltcywKICAgICAgICAgIGVwdHJiLCBtYXRjaF9pc2dyb3VwKTsKICAgICAgICBpZiAocnJjID09IE1BVENIX01BVENIKSBicmVhazsKICAgICAgICBpZiAocnJjICE9IE1BVENIX05PTUFUQ0gpIFJSRVRVUk4ocnJjKTsKICAgICAgICBlY29kZSArPSBHRVQoZWNvZGUsMSk7CiAgICAgICAgfQogICAgICB3aGlsZSAoKmVjb2RlID09IE9QX0FMVCk7CgogICAgICAvKiBJZiBoaXQgdGhlIGVuZCBvZiB0aGUgZ3JvdXAgKHdoaWNoIGNvdWxkIGJlIHJlcGVhdGVkKSwgZmFpbCAqLwoKICAgICAgaWYgKCplY29kZSAhPSBPUF9PTkNFICYmICplY29kZSAhPSBPUF9BTFQpIFJSRVRVUk4oTUFUQ0hfTk9NQVRDSCk7CgogICAgICAvKiBDb250aW51ZSBhcyBmcm9tIGFmdGVyIHRoZSBhc3NlcnRpb24sIHVwZGF0aW5nIHRoZSBvZmZzZXRzIGhpZ2ggd2F0ZXIKICAgICAgbWFyaywgc2luY2UgZXh0cmFjdHMgbWF5IGhhdmUgYmVlbiB0YWtlbi4gKi8KCiAgICAgIGRvIGVjb2RlICs9IEdFVChlY29kZSwxKTsgd2hpbGUgKCplY29kZSA9PSBPUF9BTFQpOwoKICAgICAgb2Zmc2V0X3RvcCA9IG1kLT5lbmRfb2Zmc2V0X3RvcDsKICAgICAgZXB0ciA9IG1kLT5lbmRfbWF0Y2hfcHRyOwoKICAgICAgLyogRm9yIGEgbm9uLXJlcGVhdGluZyBrZXQsIGp1c3QgY29udGludWUgYXQgdGhpcyBsZXZlbC4gVGhpcyBhbHNvCiAgICAgIGhhcHBlbnMgZm9yIGEgcmVwZWF0aW5nIGtldCBpZiBubyBjaGFyYWN0ZXJzIHdlcmUgbWF0Y2hlZCBpbiB0aGUgZ3JvdXAuCiAgICAgIFRoaXMgaXMgdGhlIGZvcmNpYmxlIGJyZWFraW5nIG9mIGluZmluaXRlIGxvb3BzIGFzIGltcGxlbWVudGVkIGluIFBlcmwKICAgICAgNS4wMDUuIElmIHRoZXJlIGlzIGFuIG9wdGlvbnMgcmVzZXQsIGl0IHdpbGwgZ2V0IG9iZXllZCBpbiB0aGUgbm9ybWFsCiAgICAgIGNvdXJzZSBvZiBldmVudHMuICovCgogICAgICBpZiAoKmVjb2RlID09IE9QX0tFVCB8fCBlcHRyID09IHNhdmVkX2VwdHIpCiAgICAgICAgewogICAgICAgIGVjb2RlICs9IDErTElOS19TSVpFOwogICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgIC8qIFRoZSByZXBlYXRpbmcga2V0cyB0cnkgdGhlIHJlc3Qgb2YgdGhlIHBhdHRlcm4gb3IgcmVzdGFydCBmcm9tIHRoZQogICAgICBwcmVjZWRpbmcgYnJhY2tldCwgaW4gdGhlIGFwcHJvcHJpYXRlIG9yZGVyLiBXZSBuZWVkIHRvIHJlc2V0IGFueSBvcHRpb25zCiAgICAgIHRoYXQgY2hhbmdlZCB3aXRoaW4gdGhlIGJyYWNrZXQgYmVmb3JlIHJlLXJ1bm5pbmcgaXQsIHNvIGNoZWNrIHRoZSBuZXh0CiAgICAgIG9wY29kZS4gKi8KCiAgICAgIGlmIChlY29kZVsxK0xJTktfU0laRV0gPT0gT1BfT1BUKQogICAgICAgIHsKICAgICAgICBpbXMgPSAoaW1zICYgflBDUkVfSU1TKSB8IGVjb2RlWzRdOwogICAgICAgIERQUklOVEYoKCJpbXMgc2V0IHRvICUwMmx4IGF0IGdyb3VwIHJlcGVhdFxuIiwgaW1zKSk7CiAgICAgICAgfQoKICAgICAgaWYgKCplY29kZSA9PSBPUF9LRVRSTUlOKQogICAgICAgIHsKICAgICAgICBSTUFUQ0gocnJjLCBlcHRyLCBlY29kZSArIDEgKyBMSU5LX1NJWkUsIG9mZnNldF90b3AsIG1kLCBpbXMsIGVwdHJiLCAwKTsKICAgICAgICBpZiAocnJjICE9IE1BVENIX05PTUFUQ0gpIFJSRVRVUk4ocnJjKTsKICAgICAgICBSTUFUQ0gocnJjLCBlcHRyLCBwcmV2LCBvZmZzZXRfdG9wLCBtZCwgaW1zLCBlcHRyYiwgbWF0Y2hfaXNncm91cCk7CiAgICAgICAgaWYgKHJyYyAhPSBNQVRDSF9OT01BVENIKSBSUkVUVVJOKHJyYyk7CiAgICAgICAgfQogICAgICBlbHNlICAvKiBPUF9LRVRSTUFYICovCiAgICAgICAgewogICAgICAgIFJNQVRDSChycmMsIGVwdHIsIHByZXYsIG9mZnNldF90b3AsIG1kLCBpbXMsIGVwdHJiLCBtYXRjaF9pc2dyb3VwKTsKICAgICAgICBpZiAocnJjICE9IE1BVENIX05PTUFUQ0gpIFJSRVRVUk4ocnJjKTsKICAgICAgICBSTUFUQ0gocnJjLCBlcHRyLCBlY29kZSArIDErTElOS19TSVpFLCBvZmZzZXRfdG9wLCBtZCwgaW1zLCBlcHRyYiwgMCk7CiAgICAgICAgaWYgKHJyYyAhPSBNQVRDSF9OT01BVENIKSBSUkVUVVJOKHJyYyk7CiAgICAgICAgfQogICAgICB9CiAgICBSUkVUVVJOKE1BVENIX05PTUFUQ0gpOwoKICAgIC8qIEFuIGFsdGVybmF0aW9uIGlzIHRoZSBlbmQgb2YgYSBicmFuY2g7IHNjYW4gYWxvbmcgdG8gZmluZCB0aGUgZW5kIG9mIHRoZQogICAgYnJhY2tldGVkIGdyb3VwIGFuZCBnbyB0byB0aGVyZS4gKi8KCiAgICBjYXNlIE9QX0FMVDoKICAgIGRvIGVjb2RlICs9IEdFVChlY29kZSwxKTsgd2hpbGUgKCplY29kZSA9PSBPUF9BTFQpOwogICAgYnJlYWs7CgogICAgLyogQlJBWkVSTyBhbmQgQlJBTUlOWkVSTyBvY2N1ciBqdXN0IGJlZm9yZSBhIGJyYWNrZXQgZ3JvdXAsIGluZGljYXRpbmcKICAgIHRoYXQgaXQgbWF5IG9jY3VyIHplcm8gdGltZXMuIEl0IG1heSByZXBlYXQgaW5maW5pdGVseSwgb3Igbm90IGF0IGFsbCAtCiAgICBpLmUuIGl0IGNvdWxkIGJlICgpKiBvciAoKT8gaW4gdGhlIHBhdHRlcm4uIEJyYWNrZXRzIHdpdGggZml4ZWQgdXBwZXIKICAgIHJlcGVhdCBsaW1pdHMgYXJlIGNvbXBpbGVkIGFzIGEgbnVtYmVyIG9mIGNvcGllcywgd2l0aCB0aGUgb3B0aW9uYWwgb25lcwogICAgcHJlY2VkZWQgYnkgQlJBWkVSTyBvciBCUkFNSU5aRVJPLiAqLwoKICAgIGNhc2UgT1BfQlJBWkVSTzoKICAgICAgewogICAgICBuZXh0ID0gZWNvZGUrMTsKICAgICAgUk1BVENIKHJyYywgZXB0ciwgbmV4dCwgb2Zmc2V0X3RvcCwgbWQsIGltcywgZXB0cmIsIG1hdGNoX2lzZ3JvdXApOwogICAgICBpZiAocnJjICE9IE1BVENIX05PTUFUQ0gpIFJSRVRVUk4ocnJjKTsKICAgICAgZG8gbmV4dCArPSBHRVQobmV4dCwxKTsgd2hpbGUgKCpuZXh0ID09IE9QX0FMVCk7CiAgICAgIGVjb2RlID0gbmV4dCArIDErTElOS19TSVpFOwogICAgICB9CiAgICBicmVhazsKCiAgICBjYXNlIE9QX0JSQU1JTlpFUk86CiAgICAgIHsKICAgICAgbmV4dCA9IGVjb2RlKzE7CiAgICAgIGRvIG5leHQgKz0gR0VUKG5leHQsMSk7IHdoaWxlICgqbmV4dCA9PSBPUF9BTFQpOwogICAgICBSTUFUQ0gocnJjLCBlcHRyLCBuZXh0ICsgMStMSU5LX1NJWkUsIG9mZnNldF90b3AsIG1kLCBpbXMsIGVwdHJiLAogICAgICAgIG1hdGNoX2lzZ3JvdXApOwogICAgICBpZiAocnJjICE9IE1BVENIX05PTUFUQ0gpIFJSRVRVUk4ocnJjKTsKICAgICAgZWNvZGUrKzsKICAgICAgfQogICAgYnJlYWs7CgogICAgLyogRW5kIG9mIGEgZ3JvdXAsIHJlcGVhdGVkIG9yIG5vbi1yZXBlYXRpbmcuIElmIHdlIGFyZSBhdCB0aGUgZW5kIG9mCiAgICBhbiBhc3NlcnRpb24gImdyb3VwIiwgc3RvcCBtYXRjaGluZyBhbmQgcmV0dXJuIE1BVENIX01BVENILCBidXQgcmVjb3JkIHRoZQogICAgY3VycmVudCBoaWdoIHdhdGVyIG1hcmsgZm9yIHVzZSBieSBwb3NpdGl2ZSBhc3NlcnRpb25zLiBEbyB0aGlzIGFsc28KICAgIGZvciB0aGUgIm9uY2UiIChub3QtYmFja3VwIHVwKSBncm91cHMuICovCgogICAgY2FzZSBPUF9LRVQ6CiAgICBjYXNlIE9QX0tFVFJNSU46CiAgICBjYXNlIE9QX0tFVFJNQVg6CiAgICAgIHsKICAgICAgcHJldiA9IGVjb2RlIC0gR0VUKGVjb2RlLCAxKTsKICAgICAgc2F2ZWRfZXB0ciA9IGVwdHJiLT5lcGJfc2F2ZWRfZXB0cjsKCiAgICAgIC8qIEJhY2sgdXAgdGhlIHN0YWNrIG9mIGJyYWNrZXQgc3RhcnQgcG9pbnRlcnMuICovCgogICAgICBlcHRyYiA9IGVwdHJiLT5lcGJfcHJldjsKCiAgICAgIGlmICgqcHJldiA9PSBPUF9BU1NFUlQgfHwgKnByZXYgPT0gT1BfQVNTRVJUX05PVCB8fAogICAgICAgICAgKnByZXYgPT0gT1BfQVNTRVJUQkFDSyB8fCAqcHJldiA9PSBPUF9BU1NFUlRCQUNLX05PVCB8fAogICAgICAgICAgKnByZXYgPT0gT1BfT05DRSkKICAgICAgICB7CiAgICAgICAgbWQtPmVuZF9tYXRjaF9wdHIgPSBlcHRyOyAgICAgIC8qIEZvciBPTkNFICovCiAgICAgICAgbWQtPmVuZF9vZmZzZXRfdG9wID0gb2Zmc2V0X3RvcDsKICAgICAgICBSUkVUVVJOKE1BVENIX01BVENIKTsKICAgICAgICB9CgogICAgICAvKiBJbiBhbGwgb3RoZXIgY2FzZXMgZXhjZXB0IGEgY29uZGl0aW9uYWwgZ3JvdXAgd2UgaGF2ZSB0byBjaGVjayB0aGUKICAgICAgZ3JvdXAgbnVtYmVyIGJhY2sgYXQgdGhlIHN0YXJ0IGFuZCBpZiBuZWNlc3NhcnkgY29tcGxldGUgaGFuZGxpbmcgYW4KICAgICAgZXh0cmFjdGlvbiBieSBzZXR0aW5nIHRoZSBvZmZzZXRzIGFuZCBidW1waW5nIHRoZSBoaWdoIHdhdGVyIG1hcmsuICovCgogICAgICBpZiAoKnByZXYgIT0gT1BfQ09ORCkKICAgICAgICB7CiAgICAgICAgbnVtYmVyID0gKnByZXYgLSBPUF9CUkE7CgogICAgICAgIC8qIEZvciBleHRlbmRlZCBleHRyYWN0aW9uIGJyYWNrZXRzIChsYXJnZSBudW1iZXIpLCB3ZSBoYXZlIHRvIGZpc2ggb3V0CiAgICAgICAgdGhlIG51bWJlciBmcm9tIGEgZHVtbXkgb3Bjb2RlIGF0IHRoZSBzdGFydC4gKi8KCiAgICAgICAgaWYgKG51bWJlciA+IEVYVFJBQ1RfQkFTSUNfTUFYKSBudW1iZXIgPSBHRVQyKHByZXYsIDIrTElOS19TSVpFKTsKICAgICAgICBvZmZzZXQgPSBudW1iZXIgPDwgMTsKCiNpZmRlZiBERUJVRwogICAgICAgIHByaW50ZigiZW5kIGJyYWNrZXQgJWQiLCBudW1iZXIpOwogICAgICAgIHByaW50ZigiXG4iKTsKI2VuZGlmCgogICAgICAgIC8qIFRlc3QgZm9yIGEgbnVtYmVyZWQgZ3JvdXAuIFRoaXMgaW5jbHVkZXMgZ3JvdXBzIGNhbGxlZCBhcyBhIHJlc3VsdAogICAgICAgIG9mIHJlY3Vyc2lvbi4gTm90ZSB0aGF0IHdob2xlLXBhdHRlcm4gcmVjdXJzaW9uIGlzIGNvZGVkIGFzIGEgcmVjdXJzZQogICAgICAgIGludG8gZ3JvdXAgMCwgc28gaXQgd29uJ3QgYmUgcGlja2VkIHVwIGhlcmUuIEluc3RlYWQsIHdlIGNhdGNoIGl0IHdoZW4KICAgICAgICB0aGUgT1BfRU5EIGlzIHJlYWNoZWQuICovCgogICAgICAgIGlmIChudW1iZXIgPiAwKQogICAgICAgICAgewogICAgICAgICAgbWQtPmNhcHR1cmVfbGFzdCA9IG51bWJlcjsKICAgICAgICAgIGlmIChvZmZzZXQgPj0gbWQtPm9mZnNldF9tYXgpIG1kLT5vZmZzZXRfb3ZlcmZsb3cgPSBUUlVFOyBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgbWQtPm9mZnNldF92ZWN0b3Jbb2Zmc2V0XSA9CiAgICAgICAgICAgICAgbWQtPm9mZnNldF92ZWN0b3JbbWQtPm9mZnNldF9lbmQgLSBudW1iZXJdOwogICAgICAgICAgICBtZC0+b2Zmc2V0X3ZlY3RvcltvZmZzZXQrMV0gPSBlcHRyIC0gbWQtPnN0YXJ0X3N1YmplY3Q7CiAgICAgICAgICAgIGlmIChvZmZzZXRfdG9wIDw9IG9mZnNldCkgb2Zmc2V0X3RvcCA9IG9mZnNldCArIDI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAvKiBIYW5kbGUgYSByZWN1cnNpdmVseSBjYWxsZWQgZ3JvdXAuIFJlc3RvcmUgdGhlIG9mZnNldHMKICAgICAgICAgIGFwcHJvcHJpYXRlbHkgYW5kIGNvbnRpbnVlIGZyb20gYWZ0ZXIgdGhlIGNhbGwuICovCgogICAgICAgICAgaWYgKG1kLT5yZWN1cnNpdmUgIT0gTlVMTCAmJiBtZC0+cmVjdXJzaXZlLT5ncm91cF9udW0gPT0gbnVtYmVyKQogICAgICAgICAgICB7CiAgICAgICAgICAgIHJlY3Vyc2lvbl9pbmZvICpyZWMgPSBtZC0+cmVjdXJzaXZlOwogICAgICAgICAgICBEUFJJTlRGKCgiUmVjdXJzaW9uICglZCkgc3VjY2VlZGVkIC0gY29udGludWluZ1xuIiwgbnVtYmVyKSk7CiAgICAgICAgICAgIG1kLT5yZWN1cnNpdmUgPSByZWMtPnByZXZyZWM7CiAgICAgICAgICAgIG1kLT5zdGFydF9tYXRjaCA9IHJlYy0+c2F2ZV9zdGFydDsKICAgICAgICAgICAgbWVtY3B5KG1kLT5vZmZzZXRfdmVjdG9yLCByZWMtPm9mZnNldF9zYXZlLAogICAgICAgICAgICAgIHJlYy0+c2F2ZWRfbWF4ICogc2l6ZW9mKGludCkpOwogICAgICAgICAgICBlY29kZSA9IHJlYy0+YWZ0ZXJfY2FsbDsKICAgICAgICAgICAgaW1zID0gb3JpZ2luYWxfaW1zOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgIC8qIFJlc2V0IHRoZSB2YWx1ZSBvZiB0aGUgaW1zIGZsYWdzLCBpbiBjYXNlIHRoZXkgZ290IGNoYW5nZWQgZHVyaW5nCiAgICAgIHRoZSBncm91cC4gKi8KCiAgICAgIGltcyA9IG9yaWdpbmFsX2ltczsKICAgICAgRFBSSU5URigoImltcyByZXNldCB0byAlMDJseFxuIiwgaW1zKSk7CgogICAgICAvKiBGb3IgYSBub24tcmVwZWF0aW5nIGtldCwganVzdCBjb250aW51ZSBhdCB0aGlzIGxldmVsLiBUaGlzIGFsc28KICAgICAgaGFwcGVucyBmb3IgYSByZXBlYXRpbmcga2V0IGlmIG5vIGNoYXJhY3RlcnMgd2VyZSBtYXRjaGVkIGluIHRoZSBncm91cC4KICAgICAgVGhpcyBpcyB0aGUgZm9yY2libGUgYnJlYWtpbmcgb2YgaW5maW5pdGUgbG9vcHMgYXMgaW1wbGVtZW50ZWQgaW4gUGVybAogICAgICA1LjAwNS4gSWYgdGhlcmUgaXMgYW4gb3B0aW9ucyByZXNldCwgaXQgd2lsbCBnZXQgb2JleWVkIGluIHRoZSBub3JtYWwKICAgICAgY291cnNlIG9mIGV2ZW50cy4gKi8KCiAgICAgIGlmICgqZWNvZGUgPT0gT1BfS0VUIHx8IGVwdHIgPT0gc2F2ZWRfZXB0cikKICAgICAgICB7CiAgICAgICAgZWNvZGUgKz0gMSArIExJTktfU0laRTsKICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAvKiBUaGUgcmVwZWF0aW5nIGtldHMgdHJ5IHRoZSByZXN0IG9mIHRoZSBwYXR0ZXJuIG9yIHJlc3RhcnQgZnJvbSB0aGUKICAgICAgcHJlY2VkaW5nIGJyYWNrZXQsIGluIHRoZSBhcHByb3ByaWF0ZSBvcmRlci4gKi8KCiAgICAgIGlmICgqZWNvZGUgPT0gT1BfS0VUUk1JTikKICAgICAgICB7CiAgICAgICAgUk1BVENIKHJyYywgZXB0ciwgZWNvZGUgKyAxK0xJTktfU0laRSwgb2Zmc2V0X3RvcCwgbWQsIGltcywgZXB0cmIsIDApOwogICAgICAgIGlmIChycmMgIT0gTUFUQ0hfTk9NQVRDSCkgUlJFVFVSTihycmMpOwogICAgICAgIFJNQVRDSChycmMsIGVwdHIsIHByZXYsIG9mZnNldF90b3AsIG1kLCBpbXMsIGVwdHJiLCBtYXRjaF9pc2dyb3VwKTsKICAgICAgICBpZiAocnJjICE9IE1BVENIX05PTUFUQ0gpIFJSRVRVUk4ocnJjKTsKICAgICAgICB9CiAgICAgIGVsc2UgIC8qIE9QX0tFVFJNQVggKi8KICAgICAgICB7CiAgICAgICAgUk1BVENIKHJyYywgZXB0ciwgcHJldiwgb2Zmc2V0X3RvcCwgbWQsIGltcywgZXB0cmIsIG1hdGNoX2lzZ3JvdXApOwogICAgICAgIGlmIChycmMgIT0gTUFUQ0hfTk9NQVRDSCkgUlJFVFVSTihycmMpOwogICAgICAgIFJNQVRDSChycmMsIGVwdHIsIGVjb2RlICsgMStMSU5LX1NJWkUsIG9mZnNldF90b3AsIG1kLCBpbXMsIGVwdHJiLCAwKTsKICAgICAgICBpZiAocnJjICE9IE1BVENIX05PTUFUQ0gpIFJSRVRVUk4ocnJjKTsKICAgICAgICB9CiAgICAgIH0KCiAgICBSUkVUVVJOKE1BVENIX05PTUFUQ0gpOwoKICAgIC8qIFN0YXJ0IG9mIHN1YmplY3QgdW5sZXNzIG5vdGJvbCwgb3IgYWZ0ZXIgaW50ZXJuYWwgbmV3bGluZSBpZiBtdWx0aWxpbmUgKi8KCiAgICBjYXNlIE9QX0NJUkM6CiAgICBpZiAobWQtPm5vdGJvbCAmJiBlcHRyID09IG1kLT5zdGFydF9zdWJqZWN0KSBSUkVUVVJOKE1BVENIX05PTUFUQ0gpOwogICAgaWYgKChpbXMgJiBQQ1JFX01VTFRJTElORSkgIT0gMCkKICAgICAgewogICAgICBpZiAoZXB0ciAhPSBtZC0+c3RhcnRfc3ViamVjdCAmJiBlcHRyWy0xXSAhPSBORVdMSU5FKQogICAgICAgIFJSRVRVUk4oTUFUQ0hfTk9NQVRDSCk7CiAgICAgIGVjb2RlKys7CiAgICAgIGJyZWFrOwogICAgICB9CiAgICAvKiAuLi4gZWxzZSBmYWxsIHRocm91Z2ggKi8KCiAgICAvKiBTdGFydCBvZiBzdWJqZWN0IGFzc2VydGlvbiAqLwoKICAgIGNhc2UgT1BfU09EOgogICAgaWYgKGVwdHIgIT0gbWQtPnN0YXJ0X3N1YmplY3QpIFJSRVRVUk4oTUFUQ0hfTk9NQVRDSCk7CiAgICBlY29kZSsrOwogICAgYnJlYWs7CgogICAgLyogU3RhcnQgb2YgbWF0Y2ggYXNzZXJ0aW9uICovCgogICAgY2FzZSBPUF9TT006CiAgICBpZiAoZXB0ciAhPSBtZC0+c3RhcnRfc3ViamVjdCArIG1kLT5zdGFydF9vZmZzZXQpIFJSRVRVUk4oTUFUQ0hfTk9NQVRDSCk7CiAgICBlY29kZSsrOwogICAgYnJlYWs7CgogICAgLyogQXNzZXJ0IGJlZm9yZSBpbnRlcm5hbCBuZXdsaW5lIGlmIG11bHRpbGluZSwgb3IgYmVmb3JlIGEgdGVybWluYXRpbmcKICAgIG5ld2xpbmUgdW5sZXNzIGVuZG9ubHkgaXMgc2V0LCBlbHNlIGVuZCBvZiBzdWJqZWN0IHVubGVzcyBub3Rlb2wgaXMgc2V0LiAqLwoKICAgIGNhc2UgT1BfRE9MTDoKICAgIGlmICgoaW1zICYgUENSRV9NVUxUSUxJTkUpICE9IDApCiAgICAgIHsKICAgICAgaWYgKGVwdHIgPCBtZC0+ZW5kX3N1YmplY3QpCiAgICAgICAgeyBpZiAoKmVwdHIgIT0gTkVXTElORSkgUlJFVFVSTihNQVRDSF9OT01BVENIKTsgfQogICAgICBlbHNlCiAgICAgICAgeyBpZiAobWQtPm5vdGVvbCkgUlJFVFVSTihNQVRDSF9OT01BVENIKTsgfQogICAgICBlY29kZSsrOwogICAgICBicmVhazsKICAgICAgfQogICAgZWxzZQogICAgICB7CiAgICAgIGlmIChtZC0+bm90ZW9sKSBSUkVUVVJOKE1BVENIX05PTUFUQ0gpOwogICAgICBpZiAoIW1kLT5lbmRvbmx5KQogICAgICAgIHsKICAgICAgICBpZiAoZXB0ciA8IG1kLT5lbmRfc3ViamVjdCAtIDEgfHwKICAgICAgICAgICAoZXB0ciA9PSBtZC0+ZW5kX3N1YmplY3QgLSAxICYmICplcHRyICE9IE5FV0xJTkUpKQogICAgICAgICAgUlJFVFVSTihNQVRDSF9OT01BVENIKTsKICAgICAgICBlY29kZSsrOwogICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgLyogLi4uIGVsc2UgZmFsbCB0aHJvdWdoICovCgogICAgLyogRW5kIG9mIHN1YmplY3QgYXNzZXJ0aW9uIChceikgKi8KCiAgICBjYXNlIE9QX0VPRDoKICAgIGlmIChlcHRyIDwgbWQtPmVuZF9zdWJqZWN0KSBSUkVUVVJOKE1BVENIX05PTUFUQ0gpOwogICAgZWNvZGUrKzsKICAgIGJyZWFrOwoKICAgIC8qIEVuZCBvZiBzdWJqZWN0IG9yIGVuZGluZyBcbiBhc3NlcnRpb24gKFxaKSAqLwoKICAgIGNhc2UgT1BfRU9ETjoKICAgIGlmIChlcHRyIDwgbWQtPmVuZF9zdWJqZWN0IC0gMSB8fAogICAgICAgKGVwdHIgPT0gbWQtPmVuZF9zdWJqZWN0IC0gMSAmJiAqZXB0ciAhPSBORVdMSU5FKSkgUlJFVFVSTihNQVRDSF9OT01BVENIKTsKICAgIGVjb2RlKys7CiAgICBicmVhazsKCiAgICAvKiBXb3JkIGJvdW5kYXJ5IGFzc2VydGlvbnMgKi8KCiAgICBjYXNlIE9QX05PVF9XT1JEX0JPVU5EQVJZOgogICAgY2FzZSBPUF9XT1JEX0JPVU5EQVJZOgogICAgICB7CgogICAgICAvKiBGaW5kIG91dCBpZiB0aGUgcHJldmlvdXMgYW5kIGN1cnJlbnQgY2hhcmFjdGVycyBhcmUgIndvcmQiIGNoYXJhY3RlcnMuCiAgICAgIEl0IHRha2VzIGEgYml0IG1vcmUgd29yayBpbiBVVEYtOCBtb2RlLiBDaGFyYWN0ZXJzID4gMjU1IGFyZSBhc3N1bWVkIHRvCiAgICAgIGJlICJub24td29yZCIgY2hhcmFjdGVycy4gKi8KCiNpZmRlZiBTVVBQT1JUX1VURjgKICAgICAgaWYgKG1kLT51dGY4KQogICAgICAgIHsKICAgICAgICBpZiAoZXB0ciA9PSBtZC0+c3RhcnRfc3ViamVjdCkgcHJldl9pc193b3JkID0gRkFMU0U7IGVsc2UKICAgICAgICAgIHsKICAgICAgICAgIGNvbnN0IHVzY2hhciAqbGFzdHB0ciA9IGVwdHIgLSAxOwogICAgICAgICAgd2hpbGUoKCpsYXN0cHRyICYgMHhjMCkgPT0gMHg4MCkgbGFzdHB0ci0tOwogICAgICAgICAgR0VUQ0hBUihjLCBsYXN0cHRyKTsKICAgICAgICAgIHByZXZfaXNfd29yZCA9IGMgPCAyNTYgJiYgKG1kLT5jdHlwZXNbY10gJiBjdHlwZV93b3JkKSAhPSAwOwogICAgICAgICAgfQogICAgICAgIGlmIChlcHRyID49IG1kLT5lbmRfc3ViamVjdCkgY3VyX2lzX3dvcmQgPSBGQUxTRTsgZWxzZQogICAgICAgICAgewogICAgICAgICAgR0VUQ0hBUihjLCBlcHRyKTsKICAgICAgICAgIGN1cl9pc193b3JkID0gYyA8IDI1NiAmJiAobWQtPmN0eXBlc1tjXSAmIGN0eXBlX3dvcmQpICE9IDA7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICBlbHNlCiNlbmRpZgoKICAgICAgLyogTW9yZSBzdHJlYW1saW5lZCB3aGVuIG5vdCBpbiBVVEYtOCBtb2RlICovCgogICAgICAgIHsKICAgICAgICBwcmV2X2lzX3dvcmQgPSAoZXB0ciAhPSBtZC0+c3RhcnRfc3ViamVjdCkgJiYKICAgICAgICAgICgobWQtPmN0eXBlc1tlcHRyWy0xXV0gJiBjdHlwZV93b3JkKSAhPSAwKTsKICAgICAgICBjdXJfaXNfd29yZCA9IChlcHRyIDwgbWQtPmVuZF9zdWJqZWN0KSAmJgogICAgICAgICAgKChtZC0+Y3R5cGVzWyplcHRyXSAmIGN0eXBlX3dvcmQpICE9IDApOwogICAgICAgIH0KCiAgICAgIC8qIE5vdyBzZWUgaWYgdGhlIHNpdHVhdGlvbiBpcyB3aGF0IHdlIHdhbnQgKi8KCiAgICAgIGlmICgoKmVjb2RlKysgPT0gT1BfV09SRF9CT1VOREFSWSk/CiAgICAgICAgICAgY3VyX2lzX3dvcmQgPT0gcHJldl9pc193b3JkIDogY3VyX2lzX3dvcmQgIT0gcHJldl9pc193b3JkKQogICAgICAgIFJSRVRVUk4oTUFUQ0hfTk9NQVRDSCk7CiAgICAgIH0KICAgIGJyZWFrOwoKICAgIC8qIE1hdGNoIGEgc2luZ2xlIGNoYXJhY3RlciB0eXBlOyBpbmxpbmUgZm9yIHNwZWVkICovCgogICAgY2FzZSBPUF9BTlk6CiAgICBpZiAoKGltcyAmIFBDUkVfRE9UQUxMKSA9PSAwICYmIGVwdHIgPCBtZC0+ZW5kX3N1YmplY3QgJiYgKmVwdHIgPT0gTkVXTElORSkKICAgICAgUlJFVFVSTihNQVRDSF9OT01BVENIKTsKICAgIGlmIChlcHRyKysgPj0gbWQtPmVuZF9zdWJqZWN0KSBSUkVUVVJOKE1BVENIX05PTUFUQ0gpOwojaWZkZWYgU1VQUE9SVF9VVEY4CiAgICBpZiAobWQtPnV0ZjgpCiAgICAgIHdoaWxlIChlcHRyIDwgbWQtPmVuZF9zdWJqZWN0ICYmICgqZXB0ciAmIDB4YzApID09IDB4ODApIGVwdHIrKzsKI2VuZGlmCiAgICBlY29kZSsrOwogICAgYnJlYWs7CgogICAgLyogTWF0Y2ggYSBzaW5nbGUgYnl0ZSwgZXZlbiBpbiBVVEYtOCBtb2RlLiBUaGlzIG9wY29kZSByZWFsbHkgZG9lcyBtYXRjaAogICAgYW55IGJ5dGUsIGV2ZW4gbmV3bGluZSwgaW5kZXBlbmRlbnQgb2YgdGhlIHNldHRpbmcgb2YgUENSRV9ET1RBTEwuICovCgogICAgY2FzZSBPUF9BTllCWVRFOgogICAgaWYgKGVwdHIrKyA+PSBtZC0+ZW5kX3N1YmplY3QpIFJSRVRVUk4oTUFUQ0hfTk9NQVRDSCk7CiAgICBlY29kZSsrOwogICAgYnJlYWs7CgogICAgY2FzZSBPUF9OT1RfRElHSVQ6CiAgICBpZiAoZXB0ciA+PSBtZC0+ZW5kX3N1YmplY3QpIFJSRVRVUk4oTUFUQ0hfTk9NQVRDSCk7CiAgICBHRVRDSEFSSU5DVEVTVChjLCBlcHRyKTsKICAgIGlmICgKI2lmZGVmIFNVUFBPUlRfVVRGOAogICAgICAgYyA8IDI1NiAmJgojZW5kaWYKICAgICAgIChtZC0+Y3R5cGVzW2NdICYgY3R5cGVfZGlnaXQpICE9IDAKICAgICAgICkKICAgICAgUlJFVFVSTihNQVRDSF9OT01BVENIKTsKICAgIGVjb2RlKys7CiAgICBicmVhazsKCiAgICBjYXNlIE9QX0RJR0lUOgogICAgaWYgKGVwdHIgPj0gbWQtPmVuZF9zdWJqZWN0KSBSUkVUVVJOKE1BVENIX05PTUFUQ0gpOwogICAgR0VUQ0hBUklOQ1RFU1QoYywgZXB0cik7CiAgICBpZiAoCiNpZmRlZiBTVVBQT1JUX1VURjgKICAgICAgIGMgPj0gMjU2IHx8CiNlbmRpZgogICAgICAgKG1kLT5jdHlwZXNbY10gJiBjdHlwZV9kaWdpdCkgPT0gMAogICAgICAgKQogICAgICBSUkVUVVJOKE1BVENIX05PTUFUQ0gpOwogICAgZWNvZGUrKzsKICAgIGJyZWFrOwoKICAgIGNhc2UgT1BfTk9UX1dISVRFU1BBQ0U6CiAgICBpZiAoZXB0ciA+PSBtZC0+ZW5kX3N1YmplY3QpIFJSRVRVUk4oTUFUQ0hfTk9NQVRDSCk7CiAgICBHRVRDSEFSSU5DVEVTVChjLCBlcHRyKTsKICAgIGlmICgKI2lmZGVmIFNVUFBPUlRfVVRGOAogICAgICAgYyA8IDI1NiAmJgojZW5kaWYKICAgICAgIChtZC0+Y3R5cGVzW2NdICYgY3R5cGVfc3BhY2UpICE9IDAKICAgICAgICkKICAgICAgUlJFVFVSTihNQVRDSF9OT01BVENIKTsKICAgIGVjb2RlKys7CiAgICBicmVhazsKCiAgICBjYXNlIE9QX1dISVRFU1BBQ0U6CiAgICBpZiAoZXB0ciA+PSBtZC0+ZW5kX3N1YmplY3QpIFJSRVRVUk4oTUFUQ0hfTk9NQVRDSCk7CiAgICBHRVRDSEFSSU5DVEVTVChjLCBlcHRyKTsKICAgIGlmICgKI2lmZGVmIFNVUFBPUlRfVVRGOAogICAgICAgYyA+PSAyNTYgfHwKI2VuZGlmCiAgICAgICAobWQtPmN0eXBlc1tjXSAmIGN0eXBlX3NwYWNlKSA9PSAwCiAgICAgICApCiAgICAgIFJSRVRVUk4oTUFUQ0hfTk9NQVRDSCk7CiAgICBlY29kZSsrOwogICAgYnJlYWs7CgogICAgY2FzZSBPUF9OT1RfV09SRENIQVI6CiAgICBpZiAoZXB0ciA+PSBtZC0+ZW5kX3N1YmplY3QpIFJSRVRVUk4oTUFUQ0hfTk9NQVRDSCk7CiAgICBHRVRDSEFSSU5DVEVTVChjLCBlcHRyKTsKICAgIGlmICgKI2lmZGVmIFNVUFBPUlRfVVRGOAogICAgICAgYyA8IDI1NiAmJgojZW5kaWYKICAgICAgIChtZC0+Y3R5cGVzW2NdICYgY3R5cGVfd29yZCkgIT0gMAogICAgICAgKQogICAgICBSUkVUVVJOKE1BVENIX05PTUFUQ0gpOwogICAgZWNvZGUrKzsKICAgIGJyZWFrOwoKICAgIGNhc2UgT1BfV09SRENIQVI6CiAgICBpZiAoZXB0ciA+PSBtZC0+ZW5kX3N1YmplY3QpIFJSRVRVUk4oTUFUQ0hfTk9NQVRDSCk7CiAgICBHRVRDSEFSSU5DVEVTVChjLCBlcHRyKTsKICAgIGlmICgKI2lmZGVmIFNVUFBPUlRfVVRGOAogICAgICAgYyA+PSAyNTYgfHwKI2VuZGlmCiAgICAgICAobWQtPmN0eXBlc1tjXSAmIGN0eXBlX3dvcmQpID09IDAKICAgICAgICkKICAgICAgUlJFVFVSTihNQVRDSF9OT01BVENIKTsKICAgIGVjb2RlKys7CiAgICBicmVhazsKCiNpZmRlZiBTVVBQT1JUX1VDUAogICAgLyogQ2hlY2sgdGhlIG5leHQgY2hhcmFjdGVyIGJ5IFVuaWNvZGUgcHJvcGVydHkuIFdlIHdpbGwgZ2V0IGhlcmUgb25seQogICAgaWYgdGhlIHN1cHBvcnQgaXMgaW4gdGhlIGJpbmFyeTsgb3RoZXJ3aXNlIGEgY29tcGlsZS10aW1lIGVycm9yIG9jY3Vycy4gKi8KCiAgICBjYXNlIE9QX1BST1A6CiAgICBjYXNlIE9QX05PVFBST1A6CiAgICBpZiAoZXB0ciA+PSBtZC0+ZW5kX3N1YmplY3QpIFJSRVRVUk4oTUFUQ0hfTk9NQVRDSCk7CiAgICBHRVRDSEFSSU5DVEVTVChjLCBlcHRyKTsKICAgICAgewogICAgICBpbnQgY2hhcnR5cGUsIHJxZHR5cGU7CiAgICAgIGludCBvdGhlcmNhc2U7CiAgICAgIGludCBjYXRlZ29yeSA9IHVjcF9maW5kY2hhcihjLCAmY2hhcnR5cGUsICZvdGhlcmNhc2UpOwoKICAgICAgcnFkdHlwZSA9ICooKytlY29kZSk7CiAgICAgIGVjb2RlKys7CgogICAgICBpZiAocnFkdHlwZSA+PSAxMjgpCiAgICAgICAgewogICAgICAgIGlmICgocnFkdHlwZSAtIDEyOCAhPSBjYXRlZ29yeSkgPT0gKG9wID09IE9QX1BST1ApKQogICAgICAgICAgUlJFVFVSTihNQVRDSF9OT01BVENIKTsKICAgICAgICB9CiAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgaWYgKChycWR0eXBlICE9IGNoYXJ0eXBlKSA9PSAob3AgPT0gT1BfUFJPUCkpCiAgICAgICAgICBSUkVUVVJOKE1BVENIX05PTUFUQ0gpOwogICAgICAgIH0KICAgICAgfQogICAgYnJlYWs7CgogICAgLyogTWF0Y2ggYW4gZXh0ZW5kZWQgVW5pY29kZSBzZXF1ZW5jZS4gV2Ugd2lsbCBnZXQgaGVyZSBvbmx5IGlmIHRoZSBzdXBwb3J0CiAgICBpcyBpbiB0aGUgYmluYXJ5OyBvdGhlcndpc2UgYSBjb21waWxlLXRpbWUgZXJyb3Igb2NjdXJzLiAqLwoKICAgIGNhc2UgT1BfRVhUVU5JOgogICAgaWYgKGVwdHIgPj0gbWQtPmVuZF9zdWJqZWN0KSBSUkVUVVJOKE1BVENIX05PTUFUQ0gpOwogICAgR0VUQ0hBUklOQ1RFU1QoYywgZXB0cik7CiAgICAgIHsKICAgICAgaW50IGNoYXJ0eXBlOwogICAgICBpbnQgb3RoZXJjYXNlOwogICAgICBpbnQgY2F0ZWdvcnkgPSB1Y3BfZmluZGNoYXIoYywgJmNoYXJ0eXBlLCAmb3RoZXJjYXNlKTsKICAgICAgaWYgKGNhdGVnb3J5ID09IHVjcF9NKSBSUkVUVVJOKE1BVENIX05PTUFUQ0gpOwogICAgICB3aGlsZSAoZXB0ciA8IG1kLT5lbmRfc3ViamVjdCkKICAgICAgICB7CiAgICAgICAgaW50IGxlbiA9IDE7CiAgICAgICAgaWYgKCFtZC0+dXRmOCkgYyA9ICplcHRyOyBlbHNlCiAgICAgICAgICB7CiAgICAgICAgICBHRVRDSEFSTEVOKGMsIGVwdHIsIGxlbik7CiAgICAgICAgICB9CiAgICAgICAgY2F0ZWdvcnkgPSB1Y3BfZmluZGNoYXIoYywgJmNoYXJ0eXBlLCAmb3RoZXJjYXNlKTsKICAgICAgICBpZiAoY2F0ZWdvcnkgIT0gdWNwX00pIGJyZWFrOwogICAgICAgIGVwdHIgKz0gbGVuOwogICAgICAgIH0KICAgICAgfQogICAgZWNvZGUrKzsKICAgIGJyZWFrOwojZW5kaWYKCgogICAgLyogTWF0Y2ggYSBiYWNrIHJlZmVyZW5jZSwgcG9zc2libHkgcmVwZWF0ZWRseS4gTG9vayBwYXN0IHRoZSBlbmQgb2YgdGhlCiAgICBpdGVtIHRvIHNlZSBpZiB0aGVyZSBpcyByZXBlYXQgaW5mb3JtYXRpb24gZm9sbG93aW5nLiBUaGUgY29kZSBpcyBzaW1pbGFyCiAgICB0byB0aGF0IGZvciBjaGFyYWN0ZXIgY2xhc3NlcywgYnV0IHJlcGVhdGVkIGZvciBlZmZpY2llbmN5LiBUaGVuIG9iZXkKICAgIHNpbWlsYXIgY29kZSB0byBjaGFyYWN0ZXIgdHlwZSByZXBlYXRzIC0gd3JpdHRlbiBvdXQgYWdhaW4gZm9yIHNwZWVkLgogICAgSG93ZXZlciwgaWYgdGhlIHJlZmVyZW5jZWQgc3RyaW5nIGlzIHRoZSBlbXB0eSBzdHJpbmcsIGFsd2F5cyB0cmVhdAogICAgaXQgYXMgbWF0Y2hlZCwgYW55IG51bWJlciBvZiB0aW1lcyAob3RoZXJ3aXNlIHRoZXJlIGNvdWxkIGJlIGluZmluaXRlCiAgICBsb29wcykuICovCgogICAgY2FzZSBPUF9SRUY6CiAgICAgIHsKICAgICAgb2Zmc2V0ID0gR0VUMihlY29kZSwgMSkgPDwgMTsgICAgICAgICAgICAgICAvKiBEb3VibGVkIHJlZiBudW1iZXIgKi8KICAgICAgZWNvZGUgKz0gMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBZHZhbmNlIHBhc3QgaXRlbSAqLwoKICAgICAgLyogSWYgdGhlIHJlZmVyZW5jZSBpcyB1bnNldCwgc2V0IHRoZSBsZW5ndGggdG8gYmUgbG9uZ2VyIHRoYW4gdGhlIGFtb3VudAogICAgICBvZiBzdWJqZWN0IGxlZnQ7IHRoaXMgZW5zdXJlcyB0aGF0IGV2ZXJ5IGF0dGVtcHQgYXQgYSBtYXRjaCBmYWlscy4gV2UKICAgICAgY2FuJ3QganVzdCBmYWlsIGhlcmUsIGJlY2F1c2Ugb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHF1YW50aWZpZXJzIHdpdGggemVybwogICAgICBtaW5pbWEuICovCgogICAgICBsZW5ndGggPSAob2Zmc2V0ID49IG9mZnNldF90b3AgfHwgbWQtPm9mZnNldF92ZWN0b3Jbb2Zmc2V0XSA8IDApPwogICAgICAgIG1kLT5lbmRfc3ViamVjdCAtIGVwdHIgKyAxIDoKICAgICAgICBtZC0+b2Zmc2V0X3ZlY3RvcltvZmZzZXQrMV0gLSBtZC0+b2Zmc2V0X3ZlY3RvcltvZmZzZXRdOwoKICAgICAgLyogU2V0IHVwIGZvciByZXBldGl0aW9uLCBvciBoYW5kbGUgdGhlIG5vbi1yZXBlYXRlZCBjYXNlICovCgogICAgICBzd2l0Y2ggKCplY29kZSkKICAgICAgICB7CiAgICAgICAgY2FzZSBPUF9DUlNUQVI6CiAgICAgICAgY2FzZSBPUF9DUk1JTlNUQVI6CiAgICAgICAgY2FzZSBPUF9DUlBMVVM6CiAgICAgICAgY2FzZSBPUF9DUk1JTlBMVVM6CiAgICAgICAgY2FzZSBPUF9DUlFVRVJZOgogICAgICAgIGNhc2UgT1BfQ1JNSU5RVUVSWToKICAgICAgICBjID0gKmVjb2RlKysgLSBPUF9DUlNUQVI7CiAgICAgICAgbWluaW1pemUgPSAoYyAmIDEpICE9IDA7CiAgICAgICAgbWluID0gcmVwX21pbltjXTsgICAgICAgICAgICAgICAgIC8qIFBpY2sgdXAgdmFsdWVzIGZyb20gdGFibGVzOyAqLwogICAgICAgIG1heCA9IHJlcF9tYXhbY107ICAgICAgICAgICAgICAgICAvKiB6ZXJvIGZvciBtYXggPT4gaW5maW5pdHkgKi8KICAgICAgICBpZiAobWF4ID09IDApIG1heCA9IElOVF9NQVg7CiAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgT1BfQ1JSQU5HRToKICAgICAgICBjYXNlIE9QX0NSTUlOUkFOR0U6CiAgICAgICAgbWluaW1pemUgPSAoKmVjb2RlID09IE9QX0NSTUlOUkFOR0UpOwogICAgICAgIG1pbiA9IEdFVDIoZWNvZGUsIDEpOwogICAgICAgIG1heCA9IEdFVDIoZWNvZGUsIDMpOwogICAgICAgIGlmIChtYXggPT0gMCkgbWF4ID0gSU5UX01BWDsKICAgICAgICBlY29kZSArPSA1OwogICAgICAgIGJyZWFrOwoKICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgIC8qIE5vIHJlcGVhdCBmb2xsb3dzICovCiAgICAgICAgaWYgKCFtYXRjaF9yZWYob2Zmc2V0LCBlcHRyLCBsZW5ndGgsIG1kLCBpbXMpKSBSUkVUVVJOKE1BVENIX05PTUFUQ0gpOwogICAgICAgIGVwdHIgKz0gbGVuZ3RoOwogICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgICAgLyogV2l0aCB0aGUgbWFpbiBsb29wICovCiAgICAgICAgfQoKICAgICAgLyogSWYgdGhlIGxlbmd0aCBvZiB0aGUgcmVmZXJlbmNlIGlzIHplcm8sIGp1c3QgY29udGludWUgd2l0aCB0aGUKICAgICAgbWFpbiBsb29wLiAqLwoKICAgICAgaWYgKGxlbmd0aCA9PSAwKSBjb250aW51ZTsKCiAgICAgIC8qIEZpcnN0LCBlbnN1cmUgdGhlIG1pbmltdW0gbnVtYmVyIG9mIG1hdGNoZXMgYXJlIHByZXNlbnQuIFdlIGdldCBiYWNrCiAgICAgIHRoZSBsZW5ndGggb2YgdGhlIHJlZmVyZW5jZSBzdHJpbmcgZXhwbGljaXRseSByYXRoZXIgdGhhbiBwYXNzaW5nIHRoZQogICAgICBhZGRyZXNzIG9mIGVwdHIsIHNvIHRoYXQgZXB0ciBjYW4gYmUgYSByZWdpc3RlciB2YXJpYWJsZS4gKi8KCiAgICAgIGZvciAoaSA9IDE7IGkgPD0gbWluOyBpKyspCiAgICAgICAgewogICAgICAgIGlmICghbWF0Y2hfcmVmKG9mZnNldCwgZXB0ciwgbGVuZ3RoLCBtZCwgaW1zKSkgUlJFVFVSTihNQVRDSF9OT01BVENIKTsKICAgICAgICBlcHRyICs9IGxlbmd0aDsKICAgICAgICB9CgogICAgICAvKiBJZiBtaW4gPSBtYXgsIGNvbnRpbnVlIGF0IHRoZSBzYW1lIGxldmVsIHdpdGhvdXQgcmVjdXJzaW9uLgogICAgICBUaGV5IGFyZSBub3QgYm90aCBhbGxvd2VkIHRvIGJlIHplcm8uICovCgogICAgICBpZiAobWluID09IG1heCkgY29udGludWU7CgogICAgICAvKiBJZiBtaW5pbWl6aW5nLCBrZWVwIHRyeWluZyBhbmQgYWR2YW5jaW5nIHRoZSBwb2ludGVyICovCgogICAgICBpZiAobWluaW1pemUpCiAgICAgICAgewogICAgICAgIGZvciAoZmkgPSBtaW47OyBmaSsrKQogICAgICAgICAgewogICAgICAgICAgUk1BVENIKHJyYywgZXB0ciwgZWNvZGUsIG9mZnNldF90b3AsIG1kLCBpbXMsIGVwdHJiLCAwKTsKICAgICAgICAgIGlmIChycmMgIT0gTUFUQ0hfTk9NQVRDSCkgUlJFVFVSTihycmMpOwogICAgICAgICAgaWYgKGZpID49IG1heCB8fCAhbWF0Y2hfcmVmKG9mZnNldCwgZXB0ciwgbGVuZ3RoLCBtZCwgaW1zKSkKICAgICAgICAgICAgUlJFVFVSTihNQVRDSF9OT01BVENIKTsKICAgICAgICAgIGVwdHIgKz0gbGVuZ3RoOwogICAgICAgICAgfQogICAgICAgIC8qIENvbnRyb2wgbmV2ZXIgZ2V0cyBoZXJlICovCiAgICAgICAgfQoKICAgICAgLyogSWYgbWF4aW1pemluZywgZmluZCB0aGUgbG9uZ2VzdCBzdHJpbmcgYW5kIHdvcmsgYmFja3dhcmRzICovCgogICAgICBlbHNlCiAgICAgICAgewogICAgICAgIHBwID0gZXB0cjsKICAgICAgICBmb3IgKGkgPSBtaW47IGkgPCBtYXg7IGkrKykKICAgICAgICAgIHsKICAgICAgICAgIGlmICghbWF0Y2hfcmVmKG9mZnNldCwgZXB0ciwgbGVuZ3RoLCBtZCwgaW1zKSkgYnJlYWs7CiAgICAgICAgICBlcHRyICs9IGxlbmd0aDsKICAgICAgICAgIH0KICAgICAgICB3aGlsZSAoZXB0ciA+PSBwcCkKICAgICAgICAgIHsKICAgICAgICAgIFJNQVRDSChycmMsIGVwdHIsIGVjb2RlLCBvZmZzZXRfdG9wLCBtZCwgaW1zLCBlcHRyYiwgMCk7CiAgICAgICAgICBpZiAocnJjICE9IE1BVENIX05PTUFUQ0gpIFJSRVRVUk4ocnJjKTsKICAgICAgICAgIGVwdHIgLT0gbGVuZ3RoOwogICAgICAgICAgfQogICAgICAgIFJSRVRVUk4oTUFUQ0hfTk9NQVRDSCk7CiAgICAgICAgfQogICAgICB9CiAgICAvKiBDb250cm9sIG5ldmVyIGdldHMgaGVyZSAqLwoKCgogICAgLyogTWF0Y2ggYSBiaXQtbWFwcGVkIGNoYXJhY3RlciBjbGFzcywgcG9zc2libHkgcmVwZWF0ZWRseS4gVGhpcyBvcCBjb2RlIGlzCiAgICB1c2VkIHdoZW4gYWxsIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSBjbGFzcyBoYXZlIHZhbHVlcyBpbiB0aGUgcmFuZ2UgMC0yNTUsCiAgICBhbmQgZWl0aGVyIHRoZSBtYXRjaGluZyBpcyBjYXNlZnVsLCBvciB0aGUgY2hhcmFjdGVycyBhcmUgaW4gdGhlIHJhbmdlCiAgICAwLTEyNyB3aGVuIFVURi04IHByb2Nlc3NpbmcgaXMgZW5hYmxlZC4gVGhlIG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuCiAgICBPUF9DTEFTUyBhbmQgT1BfTkNMQVNTIG9jY3VycyB3aGVuIGEgZGF0YSBjaGFyYWN0ZXIgb3V0c2lkZSB0aGUgcmFuZ2UgaXMKICAgIGVuY291bnRlcmVkLgoKICAgIEZpcnN0LCBsb29rIHBhc3QgdGhlIGVuZCBvZiB0aGUgaXRlbSB0byBzZWUgaWYgdGhlcmUgaXMgcmVwZWF0IGluZm9ybWF0aW9uCiAgICBmb2xsb3dpbmcuIFRoZW4gb2JleSBzaW1pbGFyIGNvZGUgdG8gY2hhcmFjdGVyIHR5cGUgcmVwZWF0cyAtIHdyaXR0ZW4gb3V0CiAgICBhZ2FpbiBmb3Igc3BlZWQuICovCgogICAgY2FzZSBPUF9OQ0xBU1M6CiAgICBjYXNlIE9QX0NMQVNTOgogICAgICB7CiAgICAgIGRhdGEgPSBlY29kZSArIDE7ICAgICAgICAgICAgICAgIC8qIFNhdmUgZm9yIG1hdGNoaW5nICovCiAgICAgIGVjb2RlICs9IDMzOyAgICAgICAgICAgICAgICAgICAgIC8qIEFkdmFuY2UgcGFzdCB0aGUgaXRlbSAqLwoKICAgICAgc3dpdGNoICgqZWNvZGUpCiAgICAgICAgewogICAgICAgIGNhc2UgT1BfQ1JTVEFSOgogICAgICAgIGNhc2UgT1BfQ1JNSU5TVEFSOgogICAgICAgIGNhc2UgT1BfQ1JQTFVTOgogICAgICAgIGNhc2UgT1BfQ1JNSU5QTFVTOgogICAgICAgIGNhc2UgT1BfQ1JRVUVSWToKICAgICAgICBjYXNlIE9QX0NSTUlOUVVFUlk6CiAgICAgICAgYyA9ICplY29kZSsrIC0gT1BfQ1JTVEFSOwogICAgICAgIG1pbmltaXplID0gKGMgJiAxKSAhPSAwOwogICAgICAgIG1pbiA9IHJlcF9taW5bY107ICAgICAgICAgICAgICAgICAvKiBQaWNrIHVwIHZhbHVlcyBmcm9tIHRhYmxlczsgKi8KICAgICAgICBtYXggPSByZXBfbWF4W2NdOyAgICAgICAgICAgICAgICAgLyogemVybyBmb3IgbWF4ID0+IGluZmluaXR5ICovCiAgICAgICAgaWYgKG1heCA9PSAwKSBtYXggPSBJTlRfTUFYOwogICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIE9QX0NSUkFOR0U6CiAgICAgICAgY2FzZSBPUF9DUk1JTlJBTkdFOgogICAgICAgIG1pbmltaXplID0gKCplY29kZSA9PSBPUF9DUk1JTlJBTkdFKTsKICAgICAgICBtaW4gPSBHRVQyKGVjb2RlLCAxKTsKICAgICAgICBtYXggPSBHRVQyKGVjb2RlLCAzKTsKICAgICAgICBpZiAobWF4ID09IDApIG1heCA9IElOVF9NQVg7CiAgICAgICAgZWNvZGUgKz0gNTsKICAgICAgICBicmVhazsKCiAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAvKiBObyByZXBlYXQgZm9sbG93cyAqLwogICAgICAgIG1pbiA9IG1heCA9IDE7CiAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgLyogRmlyc3QsIGVuc3VyZSB0aGUgbWluaW11bSBudW1iZXIgb2YgbWF0Y2hlcyBhcmUgcHJlc2VudC4gKi8KCiNpZmRlZiBTVVBQT1JUX1VURjgKICAgICAgLyogVVRGLTggbW9kZSAqLwogICAgICBpZiAobWQtPnV0ZjgpCiAgICAgICAgewogICAgICAgIGZvciAoaSA9IDE7IGkgPD0gbWluOyBpKyspCiAgICAgICAgICB7CiAgICAgICAgICBpZiAoZXB0ciA+PSBtZC0+ZW5kX3N1YmplY3QpIFJSRVRVUk4oTUFUQ0hfTk9NQVRDSCk7CiAgICAgICAgICBHRVRDSEFSSU5DKGMsIGVwdHIpOwogICAgICAgICAgaWYgKGMgPiAyNTUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgaWYgKG9wID09IE9QX0NMQVNTKSBSUkVUVVJOKE1BVENIX05PTUFUQ0gpOwogICAgICAgICAgICB9CiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgaWYgKChkYXRhW2MvOF0gJiAoMSA8PCAoYyY3KSkpID09IDApIFJSRVRVUk4oTUFUQ0hfTk9NQVRDSCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIGVsc2UKI2VuZGlmCiAgICAgIC8qIE5vdCBVVEYtOCBtb2RlICovCiAgICAgICAgewogICAgICAgIGZvciAoaSA9IDE7IGkgPD0gbWluOyBpKyspCiAgICAgICAgICB7CiAgICAgICAgICBpZiAoZXB0ciA+PSBtZC0+ZW5kX3N1YmplY3QpIFJSRVRVUk4oTUFUQ0hfTk9NQVRDSCk7CiAgICAgICAgICBjID0gKmVwdHIrKzsKICAgICAgICAgIGlmICgoZGF0YVtjLzhdICYgKDEgPDwgKGMmNykpKSA9PSAwKSBSUkVUVVJOKE1BVENIX05PTUFUQ0gpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgIC8qIElmIG1heCA9PSBtaW4gd2UgY2FuIGNvbnRpbnVlIHdpdGggdGhlIG1haW4gbG9vcCB3aXRob3V0IHRoZQogICAgICBuZWVkIHRvIHJlY3Vyc2UuICovCgogICAgICBpZiAobWluID09IG1heCkgY29udGludWU7CgogICAgICAvKiBJZiBtaW5pbWl6aW5nLCBrZWVwIHRlc3RpbmcgdGhlIHJlc3Qgb2YgdGhlIGV4cHJlc3Npb24gYW5kIGFkdmFuY2luZwogICAgICB0aGUgcG9pbnRlciB3aGlsZSBpdCBtYXRjaGVzIHRoZSBjbGFzcy4gKi8KCiAgICAgIGlmIChtaW5pbWl6ZSkKICAgICAgICB7CiNpZmRlZiBTVVBQT1JUX1VURjgKICAgICAgICAvKiBVVEYtOCBtb2RlICovCiAgICAgICAgaWYgKG1kLT51dGY4KQogICAgICAgICAgewogICAgICAgICAgZm9yIChmaSA9IG1pbjs7IGZpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgUk1BVENIKHJyYywgZXB0ciwgZWNvZGUsIG9mZnNldF90b3AsIG1kLCBpbXMsIGVwdHJiLCAwKTsKICAgICAgICAgICAgaWYgKHJyYyAhPSBNQVRDSF9OT01BVENIKSBSUkVUVVJOKHJyYyk7CiAgICAgICAgICAgIGlmIChmaSA+PSBtYXggfHwgZXB0ciA+PSBtZC0+ZW5kX3N1YmplY3QpIFJSRVRVUk4oTUFUQ0hfTk9NQVRDSCk7CiAgICAgICAgICAgIEdFVENIQVJJTkMoYywgZXB0cik7CiAgICAgICAgICAgIGlmIChjID4gMjU1KQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICBpZiAob3AgPT0gT1BfQ0xBU1MpIFJSRVRVUk4oTUFUQ0hfTk9NQVRDSCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgIGlmICgoZGF0YVtjLzhdICYgKDEgPDwgKGMmNykpKSA9PSAwKSBSUkVUVVJOKE1BVENIX05PTUFUQ0gpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIGVsc2UKI2VuZGlmCiAgICAgICAgLyogTm90IFVURi04IG1vZGUgKi8KICAgICAgICAgIHsKICAgICAgICAgIGZvciAoZmkgPSBtaW47OyBmaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgIFJNQVRDSChycmMsIGVwdHIsIGVjb2RlLCBvZmZzZXRfdG9wLCBtZCwgaW1zLCBlcHRyYiwgMCk7CiAgICAgICAgICAgIGlmIChycmMgIT0gTUFUQ0hfTk9NQVRDSCkgUlJFVFVSTihycmMpOwogICAgICAgICAgICBpZiAoZmkgPj0gbWF4IHx8IGVwdHIgPj0gbWQtPmVuZF9zdWJqZWN0KSBSUkVUVVJOKE1BVENIX05PTUFUQ0gpOwogICAgICAgICAgICBjID0gKmVwdHIrKzsKICAgICAgICAgICAgaWYgKChkYXRhW2MvOF0gJiAoMSA8PCAoYyY3KSkpID09IDApIFJSRVRVUk4oTUFUQ0hfTk9NQVRDSCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAvKiBDb250cm9sIG5ldmVyIGdldHMgaGVyZSAqLwogICAgICAgIH0KCiAgICAgIC8qIElmIG1heGltaXppbmcsIGZpbmQgdGhlIGxvbmdlc3QgcG9zc2libGUgcnVuLCB0aGVuIHdvcmsgYmFja3dhcmRzLiAqLwoKICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICBwcCA9IGVwdHI7CgojaWZkZWYgU1VQUE9SVF9VVEY4CiAgICAgICAgLyogVVRGLTggbW9kZSAqLwogICAgICAgIGlmIChtZC0+dXRmOCkKICAgICAgICAgIHsKICAgICAgICAgIGZvciAoaSA9IG1pbjsgaSA8IG1heDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgIGludCBsZW4gPSAxOwogICAgICAgICAgICBpZiAoZXB0ciA+PSBtZC0+ZW5kX3N1YmplY3QpIGJyZWFrOwogICAgICAgICAgICBHRVRDSEFSTEVOKGMsIGVwdHIsIGxlbik7CiAgICAgICAgICAgIGlmIChjID4gMjU1KQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICBpZiAob3AgPT0gT1BfQ0xBU1MpIGJyZWFrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICBpZiAoKGRhdGFbYy84XSAmICgxIDw8IChjJjcpKSkgPT0gMCkgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICBlcHRyICs9IGxlbjsKICAgICAgICAgICAgfQogICAgICAgICAgZm9yICg7OykKICAgICAgICAgICAgewogICAgICAgICAgICBSTUFUQ0gocnJjLCBlcHRyLCBlY29kZSwgb2Zmc2V0X3RvcCwgbWQsIGltcywgZXB0cmIsIDApOwogICAgICAgICAgICBpZiAocnJjICE9IE1BVENIX05PTUFUQ0gpIFJSRVRVUk4ocnJjKTsKICAgICAgICAgICAgaWYgKGVwdHItLSA9PSBwcCkgYnJlYWs7ICAgICAgICAvKiBTdG9wIGlmIHRyaWVkIGF0IG9yaWdpbmFsIHBvcyAqLwogICAgICAgICAgICBCQUNLQ0hBUihlcHRyKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIGVsc2UKI2VuZGlmCiAgICAgICAgICAvKiBOb3QgVVRGLTggbW9kZSAqLwogICAgICAgICAgewogICAgICAgICAgZm9yIChpID0gbWluOyBpIDwgbWF4OyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgaWYgKGVwdHIgPj0gbWQtPmVuZF9zdWJqZWN0KSBicmVhazsKICAgICAgICAgICAgYyA9ICplcHRyOwogICAgICAgICAgICBpZiAoKGRhdGFbYy84XSAmICgxIDw8IChjJjcpKSkgPT0gMCkgYnJlYWs7CiAgICAgICAgICAgIGVwdHIrKzsKICAgICAgICAgICAgfQogICAgICAgICAgd2hpbGUgKGVwdHIgPj0gcHApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgUk1BVENIKHJyYywgZXB0ciwgZWNvZGUsIG9mZnNldF90b3AsIG1kLCBpbXMsIGVwdHJiLCAwKTsKICAgICAgICAgICAgZXB0ci0tOwogICAgICAgICAgICBpZiAocnJjICE9IE1BVENIX05PTUFUQ0gpIFJSRVRVUk4ocnJjKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICBSUkVUVVJOKE1BVENIX05PTUFUQ0gpOwogICAgICAgIH0KICAgICAgfQogICAgLyogQ29udHJvbCBuZXZlciBnZXRzIGhlcmUgKi8KCgogICAgLyogTWF0Y2ggYW4gZXh0ZW5kZWQgY2hhcmFjdGVyIGNsYXNzLiBUaGlzIG9wY29kZSBpcyBlbmNvdW50ZXJlZCBvbmx5CiAgICBpbiBVVEYtOCBtb2RlLCBiZWNhdXNlIHRoYXQncyB0aGUgb25seSB0aW1lIGl0IGlzIGNvbXBpbGVkLiAqLwoKI2lmZGVmIFNVUFBPUlRfVVRGOAogICAgY2FzZSBPUF9YQ0xBU1M6CiAgICAgIHsKICAgICAgZGF0YSA9IGVjb2RlICsgMSArIExJTktfU0laRTsgICAgICAgICAgICAgICAgLyogU2F2ZSBmb3IgbWF0Y2hpbmcgKi8KICAgICAgZWNvZGUgKz0gR0VUKGVjb2RlLCAxKTsgICAgICAgICAgICAgICAgICAgICAgLyogQWR2YW5jZSBwYXN0IHRoZSBpdGVtICovCgogICAgICBzd2l0Y2ggKCplY29kZSkKICAgICAgICB7CiAgICAgICAgY2FzZSBPUF9DUlNUQVI6CiAgICAgICAgY2FzZSBPUF9DUk1JTlNUQVI6CiAgICAgICAgY2FzZSBPUF9DUlBMVVM6CiAgICAgICAgY2FzZSBPUF9DUk1JTlBMVVM6CiAgICAgICAgY2FzZSBPUF9DUlFVRVJZOgogICAgICAgIGNhc2UgT1BfQ1JNSU5RVUVSWToKICAgICAgICBjID0gKmVjb2RlKysgLSBPUF9DUlNUQVI7CiAgICAgICAgbWluaW1pemUgPSAoYyAmIDEpICE9IDA7CiAgICAgICAgbWluID0gcmVwX21pbltjXTsgICAgICAgICAgICAgICAgIC8qIFBpY2sgdXAgdmFsdWVzIGZyb20gdGFibGVzOyAqLwogICAgICAgIG1heCA9IHJlcF9tYXhbY107ICAgICAgICAgICAgICAgICAvKiB6ZXJvIGZvciBtYXggPT4gaW5maW5pdHkgKi8KICAgICAgICBpZiAobWF4ID09IDApIG1heCA9IElOVF9NQVg7CiAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgT1BfQ1JSQU5HRToKICAgICAgICBjYXNlIE9QX0NSTUlOUkFOR0U6CiAgICAgICAgbWluaW1pemUgPSAoKmVjb2RlID09IE9QX0NSTUlOUkFOR0UpOwogICAgICAgIG1pbiA9IEdFVDIoZWNvZGUsIDEpOwogICAgICAgIG1heCA9IEdFVDIoZWNvZGUsIDMpOwogICAgICAgIGlmIChtYXggPT0gMCkgbWF4ID0gSU5UX01BWDsKICAgICAgICBlY29kZSArPSA1OwogICAgICAgIGJyZWFrOwoKICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgIC8qIE5vIHJlcGVhdCBmb2xsb3dzICovCiAgICAgICAgbWluID0gbWF4ID0gMTsKICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAvKiBGaXJzdCwgZW5zdXJlIHRoZSBtaW5pbXVtIG51bWJlciBvZiBtYXRjaGVzIGFyZSBwcmVzZW50LiAqLwoKICAgICAgZm9yIChpID0gMTsgaSA8PSBtaW47IGkrKykKICAgICAgICB7CiAgICAgICAgaWYgKGVwdHIgPj0gbWQtPmVuZF9zdWJqZWN0KSBSUkVUVVJOKE1BVENIX05PTUFUQ0gpOwogICAgICAgIEdFVENIQVJJTkMoYywgZXB0cik7CiAgICAgICAgaWYgKCFtYXRjaF94Y2xhc3MoYywgZGF0YSkpIFJSRVRVUk4oTUFUQ0hfTk9NQVRDSCk7CiAgICAgICAgfQoKICAgICAgLyogSWYgbWF4ID09IG1pbiB3ZSBjYW4gY29udGludWUgd2l0aCB0aGUgbWFpbiBsb29wIHdpdGhvdXQgdGhlCiAgICAgIG5lZWQgdG8gcmVjdXJzZS4gKi8KCiAgICAgIGlmIChtaW4gPT0gbWF4KSBjb250aW51ZTsKCiAgICAgIC8qIElmIG1pbmltaXppbmcsIGtlZXAgdGVzdGluZyB0aGUgcmVzdCBvZiB0aGUgZXhwcmVzc2lvbiBhbmQgYWR2YW5jaW5nCiAgICAgIHRoZSBwb2ludGVyIHdoaWxlIGl0IG1hdGNoZXMgdGhlIGNsYXNzLiAqLwoKICAgICAgaWYgKG1pbmltaXplKQogICAgICAgIHsKICAgICAgICBmb3IgKGZpID0gbWluOzsgZmkrKykKICAgICAgICAgIHsKICAgICAgICAgIFJNQVRDSChycmMsIGVwdHIsIGVjb2RlLCBvZmZzZXRfdG9wLCBtZCwgaW1zLCBlcHRyYiwgMCk7CiAgICAgICAgICBpZiAocnJjICE9IE1BVENIX05PTUFUQ0gpIFJSRVRVUk4ocnJjKTsKICAgICAgICAgIGlmIChmaSA+PSBtYXggfHwgZXB0ciA+PSBtZC0+ZW5kX3N1YmplY3QpIFJSRVRVUk4oTUFUQ0hfTk9NQVRDSCk7CiAgICAgICAgICBHRVRDSEFSSU5DKGMsIGVwdHIpOwogICAgICAgICAgaWYgKCFtYXRjaF94Y2xhc3MoYywgZGF0YSkpIFJSRVRVUk4oTUFUQ0hfTk9NQVRDSCk7CiAgICAgICAgICB9CiAgICAgICAgLyogQ29udHJvbCBuZXZlciBnZXRzIGhlcmUgKi8KICAgICAgICB9CgogICAgICAvKiBJZiBtYXhpbWl6aW5nLCBmaW5kIHRoZSBsb25nZXN0IHBvc3NpYmxlIHJ1biwgdGhlbiB3b3JrIGJhY2t3YXJkcy4gKi8KCiAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgcHAgPSBlcHRyOwogICAgICAgIGZvciAoaSA9IG1pbjsgaSA8IG1heDsgaSsrKQogICAgICAgICAgewogICAgICAgICAgaW50IGxlbiA9IDE7CiAgICAgICAgICBpZiAoZXB0ciA+PSBtZC0+ZW5kX3N1YmplY3QpIGJyZWFrOwogICAgICAgICAgR0VUQ0hBUkxFTihjLCBlcHRyLCBsZW4pOwogICAgICAgICAgaWYgKCFtYXRjaF94Y2xhc3MoYywgZGF0YSkpIGJyZWFrOwogICAgICAgICAgZXB0ciArPSBsZW47CiAgICAgICAgICB9CiAgICAgICAgZm9yKDs7KQogICAgICAgICAgewogICAgICAgICAgUk1BVENIKHJyYywgZXB0ciwgZWNvZGUsIG9mZnNldF90b3AsIG1kLCBpbXMsIGVwdHJiLCAwKTsKICAgICAgICAgIGlmIChycmMgIT0gTUFUQ0hfTk9NQVRDSCkgUlJFVFVSTihycmMpOwogICAgICAgICAgaWYgKGVwdHItLSA9PSBwcCkgYnJlYWs7ICAgICAgICAvKiBTdG9wIGlmIHRyaWVkIGF0IG9yaWdpbmFsIHBvcyAqLwogICAgICAgICAgQkFDS0NIQVIoZXB0cikKICAgICAgICAgIH0KICAgICAgICBSUkVUVVJOKE1BVENIX05PTUFUQ0gpOwogICAgICAgIH0KCiAgICAgIC8qIENvbnRyb2wgbmV2ZXIgZ2V0cyBoZXJlICovCiAgICAgIH0KI2VuZGlmICAgIC8qIEVuZCBvZiBYQ0xBU1MgKi8KCiAgICAvKiBNYXRjaCBhIHNpbmdsZSBjaGFyYWN0ZXIsIGNhc2VmdWxseSAqLwoKICAgIGNhc2UgT1BfQ0hBUjoKI2lmZGVmIFNVUFBPUlRfVVRGOAogICAgaWYgKG1kLT51dGY4KQogICAgICB7CiAgICAgIGxlbmd0aCA9IDE7CiAgICAgIGVjb2RlKys7CiAgICAgIEdFVENIQVJMRU4oZmMsIGVjb2RlLCBsZW5ndGgpOwogICAgICBpZiAobGVuZ3RoID4gbWQtPmVuZF9zdWJqZWN0IC0gZXB0cikgUlJFVFVSTihNQVRDSF9OT01BVENIKTsKICAgICAgd2hpbGUgKGxlbmd0aC0tID4gMCkgaWYgKCplY29kZSsrICE9ICplcHRyKyspIFJSRVRVUk4oTUFUQ0hfTk9NQVRDSCk7CiAgICAgIH0KICAgIGVsc2UKI2VuZGlmCgogICAgLyogTm9uLVVURi04IG1vZGUgKi8KICAgICAgewogICAgICBpZiAobWQtPmVuZF9zdWJqZWN0IC0gZXB0ciA8IDEpIFJSRVRVUk4oTUFUQ0hfTk9NQVRDSCk7CiAgICAgIGlmIChlY29kZVsxXSAhPSAqZXB0cisrKSBSUkVUVVJOKE1BVENIX05PTUFUQ0gpOwogICAgICBlY29kZSArPSAyOwogICAgICB9CiAgICBicmVhazsKCiAgICAvKiBNYXRjaCBhIHNpbmdsZSBjaGFyYWN0ZXIsIGNhc2VsZXNzbHkgKi8KCiAgICBjYXNlIE9QX0NIQVJOQzoKI2lmZGVmIFNVUFBPUlRfVVRGOAogICAgaWYgKG1kLT51dGY4KQogICAgICB7CiAgICAgIGxlbmd0aCA9IDE7CiAgICAgIGVjb2RlKys7CiAgICAgIEdFVENIQVJMRU4oZmMsIGVjb2RlLCBsZW5ndGgpOwoKICAgICAgaWYgKGxlbmd0aCA+IG1kLT5lbmRfc3ViamVjdCAtIGVwdHIpIFJSRVRVUk4oTUFUQ0hfTk9NQVRDSCk7CgogICAgICAvKiBJZiB0aGUgcGF0dGVybiBjaGFyYWN0ZXIncyB2YWx1ZSBpcyA8IDEyOCwgd2UgaGF2ZSBvbmx5IG9uZSBieXRlLCBhbmQKICAgICAgY2FuIHVzZSB0aGUgZmFzdCBsb29rdXAgdGFibGUuICovCgogICAgICBpZiAoZmMgPCAxMjgpCiAgICAgICAgewogICAgICAgIGlmIChtZC0+bGNjWyplY29kZSsrXSAhPSBtZC0+bGNjWyplcHRyKytdKSBSUkVUVVJOKE1BVENIX05PTUFUQ0gpOwogICAgICAgIH0KCiAgICAgIC8qIE90aGVyd2lzZSB3ZSBtdXN0IHBpY2sgdXAgdGhlIHN1YmplY3QgY2hhcmFjdGVyICovCgogICAgICBlbHNlCiAgICAgICAgewogICAgICAgIGludCBkYzsKICAgICAgICBHRVRDSEFSSU5DKGRjLCBlcHRyKTsKICAgICAgICBlY29kZSArPSBsZW5ndGg7CgogICAgICAgIC8qIElmIHdlIGhhdmUgVW5pY29kZSBwcm9wZXJ0eSBzdXBwb3J0LCB3ZSBjYW4gdXNlIGl0IHRvIHRlc3QgdGhlIG90aGVyCiAgICAgICAgY2FzZSBvZiB0aGUgY2hhcmFjdGVyLCBpZiB0aGVyZSBpcyBvbmUuIFRoZSByZXN1bHQgb2YgdWNwX2ZpbmRjaGFyKCkgaXMKICAgICAgICA8IDAgaWYgdGhlIGNoYXIgaXNuJ3QgZm91bmQsIGFuZCBvdGhlcmNhc2UgaXMgcmV0dXJuZWQgYXMgemVybyBpZiB0aGVyZQogICAgICAgIGlzbid0IG9uZS4gKi8KCiAgICAgICAgaWYgKGZjICE9IGRjKQogICAgICAgICAgewojaWZkZWYgU1VQUE9SVF9VQ1AKICAgICAgICAgIGludCBjaGFydHlwZTsKICAgICAgICAgIGludCBvdGhlcmNhc2U7CiAgICAgICAgICBpZiAodWNwX2ZpbmRjaGFyKGZjLCAmY2hhcnR5cGUsICZvdGhlcmNhc2UpIDwgMCB8fCBkYyAhPSBvdGhlcmNhc2UpCiNlbmRpZgogICAgICAgICAgICBSUkVUVVJOKE1BVENIX05PTUFUQ0gpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgZWxzZQojZW5kaWYgICAvKiBTVVBQT1JUX1VURjggKi8KCiAgICAvKiBOb24tVVRGLTggbW9kZSAqLwogICAgICB7CiAgICAgIGlmIChtZC0+ZW5kX3N1YmplY3QgLSBlcHRyIDwgMSkgUlJFVFVSTihNQVRDSF9OT01BVENIKTsKICAgICAgaWYgKG1kLT5sY2NbZWNvZGVbMV1dICE9IG1kLT5sY2NbKmVwdHIrK10pIFJSRVRVUk4oTUFUQ0hfTk9NQVRDSCk7CiAgICAgIGVjb2RlICs9IDI7CiAgICAgIH0KICAgIGJyZWFrOwoKICAgIC8qIE1hdGNoIGEgc2luZ2xlIGNoYXJhY3RlciByZXBlYXRlZGx5OyBkaWZmZXJlbnQgb3Bjb2RlcyBzaGFyZSBjb2RlLiAqLwoKICAgIGNhc2UgT1BfRVhBQ1Q6CiAgICBtaW4gPSBtYXggPSBHRVQyKGVjb2RlLCAxKTsKICAgIGVjb2RlICs9IDM7CiAgICBnb3RvIFJFUEVBVENIQVI7CgogICAgY2FzZSBPUF9VUFRPOgogICAgY2FzZSBPUF9NSU5VUFRPOgogICAgbWluID0gMDsKICAgIG1heCA9IEdFVDIoZWNvZGUsIDEpOwogICAgbWluaW1pemUgPSAqZWNvZGUgPT0gT1BfTUlOVVBUTzsKICAgIGVjb2RlICs9IDM7CiAgICBnb3RvIFJFUEVBVENIQVI7CgogICAgY2FzZSBPUF9TVEFSOgogICAgY2FzZSBPUF9NSU5TVEFSOgogICAgY2FzZSBPUF9QTFVTOgogICAgY2FzZSBPUF9NSU5QTFVTOgogICAgY2FzZSBPUF9RVUVSWToKICAgIGNhc2UgT1BfTUlOUVVFUlk6CiAgICBjID0gKmVjb2RlKysgLSBPUF9TVEFSOwogICAgbWluaW1pemUgPSAoYyAmIDEpICE9IDA7CiAgICBtaW4gPSByZXBfbWluW2NdOyAgICAgICAgICAgICAgICAgLyogUGljayB1cCB2YWx1ZXMgZnJvbSB0YWJsZXM7ICovCiAgICBtYXggPSByZXBfbWF4W2NdOyAgICAgICAgICAgICAgICAgLyogemVybyBmb3IgbWF4ID0+IGluZmluaXR5ICovCiAgICBpZiAobWF4ID09IDApIG1heCA9IElOVF9NQVg7CgogICAgLyogQ29tbW9uIGNvZGUgZm9yIGFsbCByZXBlYXRlZCBzaW5nbGUtY2hhcmFjdGVyIG1hdGNoZXMuIFdlIGNhbiBnaXZlCiAgICB1cCBxdWlja2x5IGlmIHRoZXJlIGFyZSBmZXdlciB0aGFuIHRoZSBtaW5pbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGxlZnQgaW4KICAgIHRoZSBzdWJqZWN0LiAqLwoKICAgIFJFUEVBVENIQVI6CiNpZmRlZiBTVVBQT1JUX1VURjgKICAgIGlmIChtZC0+dXRmOCkKICAgICAgewogICAgICBsZW5ndGggPSAxOwogICAgICBjaGFycHRyID0gZWNvZGU7CiAgICAgIEdFVENIQVJMRU4oZmMsIGVjb2RlLCBsZW5ndGgpOwogICAgICBpZiAobWluICogbGVuZ3RoID4gbWQtPmVuZF9zdWJqZWN0IC0gZXB0cikgUlJFVFVSTihNQVRDSF9OT01BVENIKTsKICAgICAgZWNvZGUgKz0gbGVuZ3RoOwoKICAgICAgLyogSGFuZGxlIG11bHRpYnl0ZSBjaGFyYWN0ZXIgbWF0Y2hpbmcgc3BlY2lhbGx5IGhlcmUuIFRoZXJlIGlzCiAgICAgIHN1cHBvcnQgZm9yIGNhc2VsZXNzIG1hdGNoaW5nIGlmIFVDUCBzdXBwb3J0IGlzIHByZXNlbnQuICovCgogICAgICBpZiAobGVuZ3RoID4gMSkKICAgICAgICB7CiAgICAgICAgaW50IG9jbGVuZ3RoID0gMDsKICAgICAgICB1c2NoYXIgb2NjaGFyc1s4XTsKCiNpZmRlZiBTVVBQT1JUX1VDUAogICAgICAgIGludCBvdGhlcmNhc2U7CiAgICAgICAgaW50IGNoYXJ0eXBlOwogICAgICAgIGlmICgoaW1zICYgUENSRV9DQVNFTEVTUykgIT0gMCAmJgogICAgICAgICAgICAgdWNwX2ZpbmRjaGFyKGZjLCAmY2hhcnR5cGUsICZvdGhlcmNhc2UpID49IDAgJiYKICAgICAgICAgICAgIG90aGVyY2FzZSA+IDApCiAgICAgICAgICBvY2xlbmd0aCA9IG9yZDJ1dGY4KG90aGVyY2FzZSwgb2NjaGFycyk7CiNlbmRpZiAgLyogU1VQUE9SVF9VQ1AgKi8KCiAgICAgICAgZm9yIChpID0gMTsgaSA8PSBtaW47IGkrKykKICAgICAgICAgIHsKICAgICAgICAgIGlmIChtZW1jbXAoZXB0ciwgY2hhcnB0ciwgbGVuZ3RoKSA9PSAwKSBlcHRyICs9IGxlbmd0aDsKICAgICAgICAgIC8qIE5lZWQgYnJhY2VzIGJlY2F1c2Ugb2YgZm9sbG93aW5nIGVsc2UgKi8KICAgICAgICAgIGVsc2UgaWYgKG9jbGVuZ3RoID09IDApIHsgUlJFVFVSTihNQVRDSF9OT01BVENIKTsgfQogICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgIGlmIChtZW1jbXAoZXB0ciwgb2NjaGFycywgb2NsZW5ndGgpICE9IDApIFJSRVRVUk4oTUFUQ0hfTk9NQVRDSCk7CiAgICAgICAgICAgIGVwdHIgKz0gb2NsZW5ndGg7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgaWYgKG1pbiA9PSBtYXgpIGNvbnRpbnVlOwoKICAgICAgICBpZiAobWluaW1pemUpCiAgICAgICAgICB7CiAgICAgICAgICBmb3IgKGZpID0gbWluOzsgZmkrKykKICAgICAgICAgICAgewogICAgICAgICAgICBSTUFUQ0gocnJjLCBlcHRyLCBlY29kZSwgb2Zmc2V0X3RvcCwgbWQsIGltcywgZXB0cmIsIDApOwogICAgICAgICAgICBpZiAocnJjICE9IE1BVENIX05PTUFUQ0gpIFJSRVRVUk4ocnJjKTsKICAgICAgICAgICAgaWYgKGZpID49IG1heCB8fCBlcHRyID49IG1kLT5lbmRfc3ViamVjdCkgUlJFVFVSTihNQVRDSF9OT01BVENIKTsKICAgICAgICAgICAgaWYgKG1lbWNtcChlcHRyLCBjaGFycHRyLCBsZW5ndGgpID09IDApIGVwdHIgKz0gbGVuZ3RoOwogICAgICAgICAgICAvKiBOZWVkIGJyYWNlcyBiZWNhdXNlIG9mIGZvbGxvd2luZyBlbHNlICovCiAgICAgICAgICAgIGVsc2UgaWYgKG9jbGVuZ3RoID09IDApIHsgUlJFVFVSTihNQVRDSF9OT01BVENIKTsgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgIGlmIChtZW1jbXAoZXB0ciwgb2NjaGFycywgb2NsZW5ndGgpICE9IDApIFJSRVRVUk4oTUFUQ0hfTk9NQVRDSCk7CiAgICAgICAgICAgICAgZXB0ciArPSBvY2xlbmd0aDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIC8qIENvbnRyb2wgbmV2ZXIgZ2V0cyBoZXJlICovCiAgICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgICAgewogICAgICAgICAgcHAgPSBlcHRyOwogICAgICAgICAgZm9yIChpID0gbWluOyBpIDwgbWF4OyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgaWYgKGVwdHIgPiBtZC0+ZW5kX3N1YmplY3QgLSBsZW5ndGgpIGJyZWFrOwogICAgICAgICAgICBpZiAobWVtY21wKGVwdHIsIGNoYXJwdHIsIGxlbmd0aCkgPT0gMCkgZXB0ciArPSBsZW5ndGg7CiAgICAgICAgICAgIGVsc2UgaWYgKG9jbGVuZ3RoID09IDApIGJyZWFrOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgIGlmIChtZW1jbXAoZXB0ciwgb2NjaGFycywgb2NsZW5ndGgpICE9IDApIGJyZWFrOwogICAgICAgICAgICAgIGVwdHIgKz0gb2NsZW5ndGg7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB3aGlsZSAoZXB0ciA+PSBwcCkKICAgICAgICAgICB7CiAgICAgICAgICAgUk1BVENIKHJyYywgZXB0ciwgZWNvZGUsIG9mZnNldF90b3AsIG1kLCBpbXMsIGVwdHJiLCAwKTsKICAgICAgICAgICBpZiAocnJjICE9IE1BVENIX05PTUFUQ0gpIFJSRVRVUk4ocnJjKTsKICAgICAgICAgICBlcHRyIC09IGxlbmd0aDsKICAgICAgICAgICB9CiAgICAgICAgICBSUkVUVVJOKE1BVENIX05PTUFUQ0gpOwogICAgICAgICAgfQogICAgICAgIC8qIENvbnRyb2wgbmV2ZXIgZ2V0cyBoZXJlICovCiAgICAgICAgfQoKICAgICAgLyogSWYgdGhlIGxlbmd0aCBvZiBhIFVURi04IGNoYXJhY3RlciBpcyAxLCB3ZSBmYWxsIHRocm91Z2ggaGVyZSwgYW5kCiAgICAgIG9iZXkgdGhlIGNvZGUgYXMgZm9yIG5vbi1VVEYtOCBjaGFyYWN0ZXJzIGJlbG93LCB0aG91Z2ggaW4gdGhpcyBjYXNlIHRoZQogICAgICB2YWx1ZSBvZiBmYyB3aWxsIGFsd2F5cyBiZSA8IDEyOC4gKi8KICAgICAgfQogICAgZWxzZQojZW5kaWYgIC8qIFNVUFBPUlRfVVRGOCAqLwoKICAgIC8qIFdoZW4gbm90IGluIFVURi04IG1vZGUsIGxvYWQgYSBzaW5nbGUtYnl0ZSBjaGFyYWN0ZXIuICovCiAgICAgIHsKICAgICAgaWYgKG1pbiA+IG1kLT5lbmRfc3ViamVjdCAtIGVwdHIpIFJSRVRVUk4oTUFUQ0hfTk9NQVRDSCk7CiAgICAgIGZjID0gKmVjb2RlKys7CiAgICAgIH0KCiAgICAvKiBUaGUgdmFsdWUgb2YgZmMgYXQgdGhpcyBwb2ludCBpcyBhbHdheXMgbGVzcyB0aGFuIDI1NiwgdGhvdWdoIHdlIG1heSBvcgogICAgbWF5IG5vdCBiZSBpbiBVVEYtOCBtb2RlLiBUaGUgY29kZSBpcyBkdXBsaWNhdGVkIGZvciB0aGUgY2FzZWxlc3MgYW5kCiAgICBjYXNlZnVsIGNhc2VzLCBmb3Igc3BlZWQsIHNpbmNlIG1hdGNoaW5nIGNoYXJhY3RlcnMgaXMgbGlrZWx5IHRvIGJlIHF1aXRlCiAgICBjb21tb24uIEZpcnN0LCBlbnN1cmUgdGhlIG1pbmltdW0gbnVtYmVyIG9mIG1hdGNoZXMgYXJlIHByZXNlbnQuIElmIG1pbiA9CiAgICBtYXgsIGNvbnRpbnVlIGF0IHRoZSBzYW1lIGxldmVsIHdpdGhvdXQgcmVjdXJzaW5nLiBPdGhlcndpc2UsIGlmCiAgICBtaW5pbWl6aW5nLCBrZWVwIHRyeWluZyB0aGUgcmVzdCBvZiB0aGUgZXhwcmVzc2lvbiBhbmQgYWR2YW5jaW5nIG9uZQogICAgbWF0Y2hpbmcgY2hhcmFjdGVyIGlmIGZhaWxpbmcsIHVwIHRvIHRoZSBtYXhpbXVtLiBBbHRlcm5hdGl2ZWx5LCBpZgogICAgbWF4aW1pemluZywgZmluZCB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBhbmQgd29yayBiYWNrd2FyZHMuICovCgogICAgRFBSSU5URigoIm1hdGNoaW5nICVjeyVkLCVkfSBhZ2FpbnN0IHN1YmplY3QgJS4qc1xuIiwgZmMsIG1pbiwgbWF4LAogICAgICBtYXgsIGVwdHIpKTsKCiAgICBpZiAoKGltcyAmIFBDUkVfQ0FTRUxFU1MpICE9IDApCiAgICAgIHsKICAgICAgZmMgPSBtZC0+bGNjW2ZjXTsKICAgICAgZm9yIChpID0gMTsgaSA8PSBtaW47IGkrKykKICAgICAgICBpZiAoZmMgIT0gbWQtPmxjY1sqZXB0cisrXSkgUlJFVFVSTihNQVRDSF9OT01BVENIKTsKICAgICAgaWYgKG1pbiA9PSBtYXgpIGNvbnRpbnVlOwogICAgICBpZiAobWluaW1pemUpCiAgICAgICAgewogICAgICAgIGZvciAoZmkgPSBtaW47OyBmaSsrKQogICAgICAgICAgewogICAgICAgICAgUk1BVENIKHJyYywgZXB0ciwgZWNvZGUsIG9mZnNldF90b3AsIG1kLCBpbXMsIGVwdHJiLCAwKTsKICAgICAgICAgIGlmIChycmMgIT0gTUFUQ0hfTk9NQVRDSCkgUlJFVFVSTihycmMpOwogICAgICAgICAgaWYgKGZpID49IG1heCB8fCBlcHRyID49IG1kLT5lbmRfc3ViamVjdCB8fAogICAgICAgICAgICAgIGZjICE9IG1kLT5sY2NbKmVwdHIrK10pCiAgICAgICAgICAgIFJSRVRVUk4oTUFUQ0hfTk9NQVRDSCk7CiAgICAgICAgICB9CiAgICAgICAgLyogQ29udHJvbCBuZXZlciBnZXRzIGhlcmUgKi8KICAgICAgICB9CiAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgcHAgPSBlcHRyOwogICAgICAgIGZvciAoaSA9IG1pbjsgaSA8IG1heDsgaSsrKQogICAgICAgICAgewogICAgICAgICAgaWYgKGVwdHIgPj0gbWQtPmVuZF9zdWJqZWN0IHx8IGZjICE9IG1kLT5sY2NbKmVwdHJdKSBicmVhazsKICAgICAgICAgIGVwdHIrKzsKICAgICAgICAgIH0KICAgICAgICB3aGlsZSAoZXB0ciA+PSBwcCkKICAgICAgICAgIHsKICAgICAgICAgIFJNQVRDSChycmMsIGVwdHIsIGVjb2RlLCBvZmZzZXRfdG9wLCBtZCwgaW1zLCBlcHRyYiwgMCk7CiAgICAgICAgICBlcHRyLS07CiAgICAgICAgICBpZiAocnJjICE9IE1BVENIX05PTUFUQ0gpIFJSRVRVUk4ocnJjKTsKICAgICAgICAgIH0KICAgICAgICBSUkVUVVJOKE1BVENIX05PTUFUQ0gpOwogICAgICAgIH0KICAgICAgLyogQ29udHJvbCBuZXZlciBnZXRzIGhlcmUgKi8KICAgICAgfQoKICAgIC8qIENhc2VmdWwgY29tcGFyaXNvbnMgKGluY2x1ZGVzIGFsbCBtdWx0aS1ieXRlIGNoYXJhY3RlcnMpICovCgogICAgZWxzZQogICAgICB7CiAgICAgIGZvciAoaSA9IDE7IGkgPD0gbWluOyBpKyspIGlmIChmYyAhPSAqZXB0cisrKSBSUkVUVVJOKE1BVENIX05PTUFUQ0gpOwogICAgICBpZiAobWluID09IG1heCkgY29udGludWU7CiAgICAgIGlmIChtaW5pbWl6ZSkKICAgICAgICB7CiAgICAgICAgZm9yIChmaSA9IG1pbjs7IGZpKyspCiAgICAgICAgICB7CiAgICAgICAgICBSTUFUQ0gocnJjLCBlcHRyLCBlY29kZSwgb2Zmc2V0X3RvcCwgbWQsIGltcywgZXB0cmIsIDApOwogICAgICAgICAgaWYgKHJyYyAhPSBNQVRDSF9OT01BVENIKSBSUkVUVVJOKHJyYyk7CiAgICAgICAgICBpZiAoZmkgPj0gbWF4IHx8IGVwdHIgPj0gbWQtPmVuZF9zdWJqZWN0IHx8IGZjICE9ICplcHRyKyspCiAgICAgICAgICAgIFJSRVRVUk4oTUFUQ0hfTk9NQVRDSCk7CiAgICAgICAgICB9CiAgICAgICAgLyogQ29udHJvbCBuZXZlciBnZXRzIGhlcmUgKi8KICAgICAgICB9CiAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgcHAgPSBlcHRyOwogICAgICAgIGZvciAoaSA9IG1pbjsgaSA8IG1heDsgaSsrKQogICAgICAgICAgewogICAgICAgICAgaWYgKGVwdHIgPj0gbWQtPmVuZF9zdWJqZWN0IHx8IGZjICE9ICplcHRyKSBicmVhazsKICAgICAgICAgIGVwdHIrKzsKICAgICAgICAgIH0KICAgICAgICB3aGlsZSAoZXB0ciA+PSBwcCkKICAgICAgICAgIHsKICAgICAgICAgIFJNQVRDSChycmMsIGVwdHIsIGVjb2RlLCBvZmZzZXRfdG9wLCBtZCwgaW1zLCBlcHRyYiwgMCk7CiAgICAgICAgICBlcHRyLS07CiAgICAgICAgICBpZiAocnJjICE9IE1BVENIX05PTUFUQ0gpIFJSRVRVUk4ocnJjKTsKICAgICAgICAgIH0KICAgICAgICBSUkVUVVJOKE1BVENIX05PTUFUQ0gpOwogICAgICAgIH0KICAgICAgfQogICAgLyogQ29udHJvbCBuZXZlciBnZXRzIGhlcmUgKi8KCiAgICAvKiBNYXRjaCBhIG5lZ2F0ZWQgc2luZ2xlIG9uZS1ieXRlIGNoYXJhY3Rlci4gVGhlIGNoYXJhY3RlciB3ZSBhcmUKICAgIGNoZWNraW5nIGNhbiBiZSBtdWx0aWJ5dGUuICovCgogICAgY2FzZSBPUF9OT1Q6CiAgICBpZiAoZXB0ciA+PSBtZC0+ZW5kX3N1YmplY3QpIFJSRVRVUk4oTUFUQ0hfTk9NQVRDSCk7CiAgICBlY29kZSsrOwogICAgR0VUQ0hBUklOQ1RFU1QoYywgZXB0cik7CiAgICBpZiAoKGltcyAmIFBDUkVfQ0FTRUxFU1MpICE9IDApCiAgICAgIHsKI2lmZGVmIFNVUFBPUlRfVVRGOAogICAgICBpZiAoYyA8IDI1NikKI2VuZGlmCiAgICAgIGMgPSBtZC0+bGNjW2NdOwogICAgICBpZiAobWQtPmxjY1sqZWNvZGUrK10gPT0gYykgUlJFVFVSTihNQVRDSF9OT01BVENIKTsKICAgICAgfQogICAgZWxzZQogICAgICB7CiAgICAgIGlmICgqZWNvZGUrKyA9PSBjKSBSUkVUVVJOKE1BVENIX05PTUFUQ0gpOwogICAgICB9CiAgICBicmVhazsKCiAgICAvKiBNYXRjaCBhIG5lZ2F0ZWQgc2luZ2xlIG9uZS1ieXRlIGNoYXJhY3RlciByZXBlYXRlZGx5LiBUaGlzIGlzIGFsbW9zdCBhCiAgICByZXBlYXQgb2YgdGhlIGNvZGUgZm9yIGEgcmVwZWF0ZWQgc2luZ2xlIGNoYXJhY3RlciwgYnV0IEkgaGF2ZW4ndCBmb3VuZCBhCiAgICBuaWNlIHdheSBvZiBjb21tb25pbmcgdGhlc2UgdXAgdGhhdCBkb2Vzbid0IHJlcXVpcmUgYSB0ZXN0IG9mIHRoZQogICAgcG9zaXRpdmUvbmVnYXRpdmUgb3B0aW9uIGZvciBlYWNoIGNoYXJhY3RlciBtYXRjaC4gTWF5YmUgdGhhdCB3b3VsZG4ndCBhZGQKICAgIHZlcnkgbXVjaCB0byB0aGUgdGltZSB0YWtlbiwgYnV0IGNoYXJhY3RlciBtYXRjaGluZyAqaXMqIHdoYXQgdGhpcyBpcyBhbGwKICAgIGFib3V0Li4uICovCgogICAgY2FzZSBPUF9OT1RFWEFDVDoKICAgIG1pbiA9IG1heCA9IEdFVDIoZWNvZGUsIDEpOwogICAgZWNvZGUgKz0gMzsKICAgIGdvdG8gUkVQRUFUTk9UQ0hBUjsKCiAgICBjYXNlIE9QX05PVFVQVE86CiAgICBjYXNlIE9QX05PVE1JTlVQVE86CiAgICBtaW4gPSAwOwogICAgbWF4ID0gR0VUMihlY29kZSwgMSk7CiAgICBtaW5pbWl6ZSA9ICplY29kZSA9PSBPUF9OT1RNSU5VUFRPOwogICAgZWNvZGUgKz0gMzsKICAgIGdvdG8gUkVQRUFUTk9UQ0hBUjsKCiAgICBjYXNlIE9QX05PVFNUQVI6CiAgICBjYXNlIE9QX05PVE1JTlNUQVI6CiAgICBjYXNlIE9QX05PVFBMVVM6CiAgICBjYXNlIE9QX05PVE1JTlBMVVM6CiAgICBjYXNlIE9QX05PVFFVRVJZOgogICAgY2FzZSBPUF9OT1RNSU5RVUVSWToKICAgIGMgPSAqZWNvZGUrKyAtIE9QX05PVFNUQVI7CiAgICBtaW5pbWl6ZSA9IChjICYgMSkgIT0gMDsKICAgIG1pbiA9IHJlcF9taW5bY107ICAgICAgICAgICAgICAgICAvKiBQaWNrIHVwIHZhbHVlcyBmcm9tIHRhYmxlczsgKi8KICAgIG1heCA9IHJlcF9tYXhbY107ICAgICAgICAgICAgICAgICAvKiB6ZXJvIGZvciBtYXggPT4gaW5maW5pdHkgKi8KICAgIGlmIChtYXggPT0gMCkgbWF4ID0gSU5UX01BWDsKCiAgICAvKiBDb21tb24gY29kZSBmb3IgYWxsIHJlcGVhdGVkIHNpbmdsZS1ieXRlIG1hdGNoZXMuIFdlIGNhbiBnaXZlIHVwIHF1aWNrbHkKICAgIGlmIHRoZXJlIGFyZSBmZXdlciB0aGFuIHRoZSBtaW5pbXVtIG51bWJlciBvZiBieXRlcyBsZWZ0IGluIHRoZQogICAgc3ViamVjdC4gKi8KCiAgICBSRVBFQVROT1RDSEFSOgogICAgaWYgKG1pbiA+IG1kLT5lbmRfc3ViamVjdCAtIGVwdHIpIFJSRVRVUk4oTUFUQ0hfTk9NQVRDSCk7CiAgICBmYyA9ICplY29kZSsrOwoKICAgIC8qIFRoZSBjb2RlIGlzIGR1cGxpY2F0ZWQgZm9yIHRoZSBjYXNlbGVzcyBhbmQgY2FzZWZ1bCBjYXNlcywgZm9yIHNwZWVkLAogICAgc2luY2UgbWF0Y2hpbmcgY2hhcmFjdGVycyBpcyBsaWtlbHkgdG8gYmUgcXVpdGUgY29tbW9uLiBGaXJzdCwgZW5zdXJlIHRoZQogICAgbWluaW11bSBudW1iZXIgb2YgbWF0Y2hlcyBhcmUgcHJlc2VudC4gSWYgbWluID0gbWF4LCBjb250aW51ZSBhdCB0aGUgc2FtZQogICAgbGV2ZWwgd2l0aG91dCByZWN1cnNpbmcuIE90aGVyd2lzZSwgaWYgbWluaW1pemluZywga2VlcCB0cnlpbmcgdGhlIHJlc3Qgb2YKICAgIHRoZSBleHByZXNzaW9uIGFuZCBhZHZhbmNpbmcgb25lIG1hdGNoaW5nIGNoYXJhY3RlciBpZiBmYWlsaW5nLCB1cCB0byB0aGUKICAgIG1heGltdW0uIEFsdGVybmF0aXZlbHksIGlmIG1heGltaXppbmcsIGZpbmQgdGhlIG1heGltdW0gbnVtYmVyIG9mCiAgICBjaGFyYWN0ZXJzIGFuZCB3b3JrIGJhY2t3YXJkcy4gKi8KCiAgICBEUFJJTlRGKCgibmVnYXRpdmUgbWF0Y2hpbmcgJWN7JWQsJWR9IGFnYWluc3Qgc3ViamVjdCAlLipzXG4iLCBmYywgbWluLCBtYXgsCiAgICAgIG1heCwgZXB0cikpOwoKICAgIGlmICgoaW1zICYgUENSRV9DQVNFTEVTUykgIT0gMCkKICAgICAgewogICAgICBmYyA9IG1kLT5sY2NbZmNdOwoKI2lmZGVmIFNVUFBPUlRfVVRGOAogICAgICAvKiBVVEYtOCBtb2RlICovCiAgICAgIGlmIChtZC0+dXRmOCkKICAgICAgICB7CiAgICAgICAgcmVnaXN0ZXIgaW50IGQ7CiAgICAgICAgZm9yIChpID0gMTsgaSA8PSBtaW47IGkrKykKICAgICAgICAgIHsKICAgICAgICAgIEdFVENIQVJJTkMoZCwgZXB0cik7CiAgICAgICAgICBpZiAoZCA8IDI1NikgZCA9IG1kLT5sY2NbZF07CiAgICAgICAgICBpZiAoZmMgPT0gZCkgUlJFVFVSTihNQVRDSF9OT01BVENIKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIGVsc2UKI2VuZGlmCgogICAgICAvKiBOb3QgVVRGLTggbW9kZSAqLwogICAgICAgIHsKICAgICAgICBmb3IgKGkgPSAxOyBpIDw9IG1pbjsgaSsrKQogICAgICAgICAgaWYgKGZjID09IG1kLT5sY2NbKmVwdHIrK10pIFJSRVRVUk4oTUFUQ0hfTk9NQVRDSCk7CiAgICAgICAgfQoKICAgICAgaWYgKG1pbiA9PSBtYXgpIGNvbnRpbnVlOwoKICAgICAgaWYgKG1pbmltaXplKQogICAgICAgIHsKI2lmZGVmIFNVUFBPUlRfVVRGOAogICAgICAgIC8qIFVURi04IG1vZGUgKi8KICAgICAgICBpZiAobWQtPnV0ZjgpCiAgICAgICAgICB7CiAgICAgICAgICByZWdpc3RlciBpbnQgZDsKICAgICAgICAgIGZvciAoZmkgPSBtaW47OyBmaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgIFJNQVRDSChycmMsIGVwdHIsIGVjb2RlLCBvZmZzZXRfdG9wLCBtZCwgaW1zLCBlcHRyYiwgMCk7CiAgICAgICAgICAgIGlmIChycmMgIT0gTUFUQ0hfTk9NQVRDSCkgUlJFVFVSTihycmMpOwogICAgICAgICAgICBHRVRDSEFSSU5DKGQsIGVwdHIpOwogICAgICAgICAgICBpZiAoZCA8IDI1NikgZCA9IG1kLT5sY2NbZF07CiAgICAgICAgICAgIGlmIChmaSA+PSBtYXggfHwgZXB0ciA+PSBtZC0+ZW5kX3N1YmplY3QgfHwgZmMgPT0gZCkKICAgICAgICAgICAgICBSUkVUVVJOKE1BVENIX05PTUFUQ0gpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgZWxzZQojZW5kaWYKICAgICAgICAvKiBOb3QgVVRGLTggbW9kZSAqLwogICAgICAgICAgewogICAgICAgICAgZm9yIChmaSA9IG1pbjs7IGZpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgUk1BVENIKHJyYywgZXB0ciwgZWNvZGUsIG9mZnNldF90b3AsIG1kLCBpbXMsIGVwdHJiLCAwKTsKICAgICAgICAgICAgaWYgKHJyYyAhPSBNQVRDSF9OT01BVENIKSBSUkVUVVJOKHJyYyk7CiAgICAgICAgICAgIGlmIChmaSA+PSBtYXggfHwgZXB0ciA+PSBtZC0+ZW5kX3N1YmplY3QgfHwgZmMgPT0gbWQtPmxjY1sqZXB0cisrXSkKICAgICAgICAgICAgICBSUkVUVVJOKE1BVENIX05PTUFUQ0gpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgLyogQ29udHJvbCBuZXZlciBnZXRzIGhlcmUgKi8KICAgICAgICB9CgogICAgICAvKiBNYXhpbWl6ZSBjYXNlICovCgogICAgICBlbHNlCiAgICAgICAgewogICAgICAgIHBwID0gZXB0cjsKCiNpZmRlZiBTVVBQT1JUX1VURjgKICAgICAgICAvKiBVVEYtOCBtb2RlICovCiAgICAgICAgaWYgKG1kLT51dGY4KQogICAgICAgICAgewogICAgICAgICAgcmVnaXN0ZXIgaW50IGQ7CiAgICAgICAgICBmb3IgKGkgPSBtaW47IGkgPCBtYXg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICBpbnQgbGVuID0gMTsKICAgICAgICAgICAgaWYgKGVwdHIgPj0gbWQtPmVuZF9zdWJqZWN0KSBicmVhazsKICAgICAgICAgICAgR0VUQ0hBUkxFTihkLCBlcHRyLCBsZW4pOwogICAgICAgICAgICBpZiAoZCA8IDI1NikgZCA9IG1kLT5sY2NbZF07CiAgICAgICAgICAgIGlmIChmYyA9PSBkKSBicmVhazsKICAgICAgICAgICAgZXB0ciArPSBsZW47CiAgICAgICAgICAgIH0KICAgICAgICAgIGZvcig7OykKICAgICAgICAgICAgewogICAgICAgICAgICBSTUFUQ0gocnJjLCBlcHRyLCBlY29kZSwgb2Zmc2V0X3RvcCwgbWQsIGltcywgZXB0cmIsIDApOwogICAgICAgICAgICBpZiAocnJjICE9IE1BVENIX05PTUFUQ0gpIFJSRVRVUk4ocnJjKTsKICAgICAgICAgICAgaWYgKGVwdHItLSA9PSBwcCkgYnJlYWs7ICAgICAgICAvKiBTdG9wIGlmIHRyaWVkIGF0IG9yaWdpbmFsIHBvcyAqLwogICAgICAgICAgICBCQUNLQ0hBUihlcHRyKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIGVsc2UKI2VuZGlmCiAgICAgICAgLyogTm90IFVURi04IG1vZGUgKi8KICAgICAgICAgIHsKICAgICAgICAgIGZvciAoaSA9IG1pbjsgaSA8IG1heDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgIGlmIChlcHRyID49IG1kLT5lbmRfc3ViamVjdCB8fCBmYyA9PSBtZC0+bGNjWyplcHRyXSkgYnJlYWs7CiAgICAgICAgICAgIGVwdHIrKzsKICAgICAgICAgICAgfQogICAgICAgICAgd2hpbGUgKGVwdHIgPj0gcHApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgUk1BVENIKHJyYywgZXB0ciwgZWNvZGUsIG9mZnNldF90b3AsIG1kLCBpbXMsIGVwdHJiLCAwKTsKICAgICAgICAgICAgaWYgKHJyYyAhPSBNQVRDSF9OT01BVENIKSBSUkVUVVJOKHJyYyk7CiAgICAgICAgICAgIGVwdHItLTsKICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICBSUkVUVVJOKE1BVENIX05PTUFUQ0gpOwogICAgICAgIH0KICAgICAgLyogQ29udHJvbCBuZXZlciBnZXRzIGhlcmUgKi8KICAgICAgfQoKICAgIC8qIENhc2VmdWwgY29tcGFyaXNvbnMgKi8KCiAgICBlbHNlCiAgICAgIHsKI2lmZGVmIFNVUFBPUlRfVVRGOAogICAgICAvKiBVVEYtOCBtb2RlICovCiAgICAgIGlmIChtZC0+dXRmOCkKICAgICAgICB7CiAgICAgICAgcmVnaXN0ZXIgaW50IGQ7CiAgICAgICAgZm9yIChpID0gMTsgaSA8PSBtaW47IGkrKykKICAgICAgICAgIHsKICAgICAgICAgIEdFVENIQVJJTkMoZCwgZXB0cik7CiAgICAgICAgICBpZiAoZmMgPT0gZCkgUlJFVFVSTihNQVRDSF9OT01BVENIKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIGVsc2UKI2VuZGlmCiAgICAgIC8qIE5vdCBVVEYtOCBtb2RlICovCiAgICAgICAgewogICAgICAgIGZvciAoaSA9IDE7IGkgPD0gbWluOyBpKyspCiAgICAgICAgICBpZiAoZmMgPT0gKmVwdHIrKykgUlJFVFVSTihNQVRDSF9OT01BVENIKTsKICAgICAgICB9CgogICAgICBpZiAobWluID09IG1heCkgY29udGludWU7CgogICAgICBpZiAobWluaW1pemUpCiAgICAgICAgewojaWZkZWYgU1VQUE9SVF9VVEY4CiAgICAgICAgLyogVVRGLTggbW9kZSAqLwogICAgICAgIGlmIChtZC0+dXRmOCkKICAgICAgICAgIHsKICAgICAgICAgIHJlZ2lzdGVyIGludCBkOwogICAgICAgICAgZm9yIChmaSA9IG1pbjs7IGZpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgUk1BVENIKHJyYywgZXB0ciwgZWNvZGUsIG9mZnNldF90b3AsIG1kLCBpbXMsIGVwdHJiLCAwKTsKICAgICAgICAgICAgaWYgKHJyYyAhPSBNQVRDSF9OT01BVENIKSBSUkVUVVJOKHJyYyk7CiAgICAgICAgICAgIEdFVENIQVJJTkMoZCwgZXB0cik7CiAgICAgICAgICAgIGlmIChmaSA+PSBtYXggfHwgZXB0ciA+PSBtZC0+ZW5kX3N1YmplY3QgfHwgZmMgPT0gZCkKICAgICAgICAgICAgICBSUkVUVVJOKE1BVENIX05PTUFUQ0gpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgZWxzZQojZW5kaWYKICAgICAgICAvKiBOb3QgVVRGLTggbW9kZSAqLwogICAgICAgICAgewogICAgICAgICAgZm9yIChmaSA9IG1pbjs7IGZpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgUk1BVENIKHJyYywgZXB0ciwgZWNvZGUsIG9mZnNldF90b3AsIG1kLCBpbXMsIGVwdHJiLCAwKTsKICAgICAgICAgICAgaWYgKHJyYyAhPSBNQVRDSF9OT01BVENIKSBSUkVUVVJOKHJyYyk7CiAgICAgICAgICAgIGlmIChmaSA+PSBtYXggfHwgZXB0ciA+PSBtZC0+ZW5kX3N1YmplY3QgfHwgZmMgPT0gKmVwdHIrKykKICAgICAgICAgICAgICBSUkVUVVJOKE1BVENIX05PTUFUQ0gpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgLyogQ29udHJvbCBuZXZlciBnZXRzIGhlcmUgKi8KICAgICAgICB9CgogICAgICAvKiBNYXhpbWl6ZSBjYXNlICovCgogICAgICBlbHNlCiAgICAgICAgewogICAgICAgIHBwID0gZXB0cjsKCiNpZmRlZiBTVVBQT1JUX1VURjgKICAgICAgICAvKiBVVEYtOCBtb2RlICovCiAgICAgICAgaWYgKG1kLT51dGY4KQogICAgICAgICAgewogICAgICAgICAgcmVnaXN0ZXIgaW50IGQ7CiAgICAgICAgICBmb3IgKGkgPSBtaW47IGkgPCBtYXg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICBpbnQgbGVuID0gMTsKICAgICAgICAgICAgaWYgKGVwdHIgPj0gbWQtPmVuZF9zdWJqZWN0KSBicmVhazsKICAgICAgICAgICAgR0VUQ0hBUkxFTihkLCBlcHRyLCBsZW4pOwogICAgICAgICAgICBpZiAoZmMgPT0gZCkgYnJlYWs7CiAgICAgICAgICAgIGVwdHIgKz0gbGVuOwogICAgICAgICAgICB9CiAgICAgICAgICBmb3IoOzspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgUk1BVENIKHJyYywgZXB0ciwgZWNvZGUsIG9mZnNldF90b3AsIG1kLCBpbXMsIGVwdHJiLCAwKTsKICAgICAgICAgICAgaWYgKHJyYyAhPSBNQVRDSF9OT01BVENIKSBSUkVUVVJOKHJyYyk7CiAgICAgICAgICAgIGlmIChlcHRyLS0gPT0gcHApIGJyZWFrOyAgICAgICAgLyogU3RvcCBpZiB0cmllZCBhdCBvcmlnaW5hbCBwb3MgKi8KICAgICAgICAgICAgQkFDS0NIQVIoZXB0cik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICBlbHNlCiNlbmRpZgogICAgICAgIC8qIE5vdCBVVEYtOCBtb2RlICovCiAgICAgICAgICB7CiAgICAgICAgICBmb3IgKGkgPSBtaW47IGkgPCBtYXg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICBpZiAoZXB0ciA+PSBtZC0+ZW5kX3N1YmplY3QgfHwgZmMgPT0gKmVwdHIpIGJyZWFrOwogICAgICAgICAgICBlcHRyKys7CiAgICAgICAgICAgIH0KICAgICAgICAgIHdoaWxlIChlcHRyID49IHBwKQogICAgICAgICAgICB7CiAgICAgICAgICAgIFJNQVRDSChycmMsIGVwdHIsIGVjb2RlLCBvZmZzZXRfdG9wLCBtZCwgaW1zLCBlcHRyYiwgMCk7CiAgICAgICAgICAgIGlmIChycmMgIT0gTUFUQ0hfTk9NQVRDSCkgUlJFVFVSTihycmMpOwogICAgICAgICAgICBlcHRyLS07CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgUlJFVFVSTihNQVRDSF9OT01BVENIKTsKICAgICAgICB9CiAgICAgIH0KICAgIC8qIENvbnRyb2wgbmV2ZXIgZ2V0cyBoZXJlICovCgogICAgLyogTWF0Y2ggYSBzaW5nbGUgY2hhcmFjdGVyIHR5cGUgcmVwZWF0ZWRseTsgc2V2ZXJhbCBkaWZmZXJlbnQgb3Bjb2RlcwogICAgc2hhcmUgY29kZS4gVGhpcyBpcyB2ZXJ5IHNpbWlsYXIgdG8gdGhlIGNvZGUgZm9yIHNpbmdsZSBjaGFyYWN0ZXJzLCBidXQgd2UKICAgIHJlcGVhdCBpdCBpbiB0aGUgaW50ZXJlc3RzIG9mIGVmZmljaWVuY3kuICovCgogICAgY2FzZSBPUF9UWVBFRVhBQ1Q6CiAgICBtaW4gPSBtYXggPSBHRVQyKGVjb2RlLCAxKTsKICAgIG1pbmltaXplID0gVFJVRTsKICAgIGVjb2RlICs9IDM7CiAgICBnb3RvIFJFUEVBVFRZUEU7CgogICAgY2FzZSBPUF9UWVBFVVBUTzoKICAgIGNhc2UgT1BfVFlQRU1JTlVQVE86CiAgICBtaW4gPSAwOwogICAgbWF4ID0gR0VUMihlY29kZSwgMSk7CiAgICBtaW5pbWl6ZSA9ICplY29kZSA9PSBPUF9UWVBFTUlOVVBUTzsKICAgIGVjb2RlICs9IDM7CiAgICBnb3RvIFJFUEVBVFRZUEU7CgogICAgY2FzZSBPUF9UWVBFU1RBUjoKICAgIGNhc2UgT1BfVFlQRU1JTlNUQVI6CiAgICBjYXNlIE9QX1RZUEVQTFVTOgogICAgY2FzZSBPUF9UWVBFTUlOUExVUzoKICAgIGNhc2UgT1BfVFlQRVFVRVJZOgogICAgY2FzZSBPUF9UWVBFTUlOUVVFUlk6CiAgICBjID0gKmVjb2RlKysgLSBPUF9UWVBFU1RBUjsKICAgIG1pbmltaXplID0gKGMgJiAxKSAhPSAwOwogICAgbWluID0gcmVwX21pbltjXTsgICAgICAgICAgICAgICAgIC8qIFBpY2sgdXAgdmFsdWVzIGZyb20gdGFibGVzOyAqLwogICAgbWF4ID0gcmVwX21heFtjXTsgICAgICAgICAgICAgICAgIC8qIHplcm8gZm9yIG1heCA9PiBpbmZpbml0eSAqLwogICAgaWYgKG1heCA9PSAwKSBtYXggPSBJTlRfTUFYOwoKICAgIC8qIENvbW1vbiBjb2RlIGZvciBhbGwgcmVwZWF0ZWQgc2luZ2xlIGNoYXJhY3RlciB0eXBlIG1hdGNoZXMuIE5vdGUgdGhhdAogICAgaW4gVVRGLTggbW9kZSwgJy4nIG1hdGNoZXMgYSBjaGFyYWN0ZXIgb2YgYW55IGxlbmd0aCwgYnV0IGZvciB0aGUgb3RoZXIKICAgIGNoYXJhY3RlciB0eXBlcywgdGhlIHZhbGlkIGNoYXJhY3RlcnMgYXJlIGFsbCBvbmUtYnl0ZSBsb25nLiAqLwoKICAgIFJFUEVBVFRZUEU6CiAgICBjdHlwZSA9ICplY29kZSsrOyAgICAgIC8qIENvZGUgZm9yIHRoZSBjaGFyYWN0ZXIgdHlwZSAqLwoKI2lmZGVmIFNVUFBPUlRfVUNQCiAgICBpZiAoY3R5cGUgPT0gT1BfUFJPUCB8fCBjdHlwZSA9PSBPUF9OT1RQUk9QKQogICAgICB7CiAgICAgIHByb3BfZmFpbF9yZXN1bHQgPSBjdHlwZSA9PSBPUF9OT1RQUk9QOwogICAgICBwcm9wX3R5cGUgPSAqZWNvZGUrKzsKICAgICAgaWYgKHByb3BfdHlwZSA+PSAxMjgpCiAgICAgICAgewogICAgICAgIHByb3BfdGVzdF9hZ2FpbnN0ID0gcHJvcF90eXBlIC0gMTI4OwogICAgICAgIHByb3BfdGVzdF92YXJpYWJsZSA9ICZwcm9wX2NhdGVnb3J5OwogICAgICAgIH0KICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICBwcm9wX3Rlc3RfYWdhaW5zdCA9IHByb3BfdHlwZTsKICAgICAgICBwcm9wX3Rlc3RfdmFyaWFibGUgPSAmcHJvcF9jaGFydHlwZTsKICAgICAgICB9CiAgICAgIH0KICAgIGVsc2UgcHJvcF90eXBlID0gLTE7CiNlbmRpZgoKICAgIC8qIEZpcnN0LCBlbnN1cmUgdGhlIG1pbmltdW0gbnVtYmVyIG9mIG1hdGNoZXMgYXJlIHByZXNlbnQuIFVzZSBpbmxpbmUKICAgIGNvZGUgZm9yIG1heGltaXppbmcgdGhlIHNwZWVkLCBhbmQgZG8gdGhlIHR5cGUgdGVzdCBvbmNlIGF0IHRoZSBzdGFydAogICAgKGkuZS4ga2VlcCBpdCBvdXQgb2YgdGhlIGxvb3ApLiBBbHNvIHdlIGNhbiB0ZXN0IHRoYXQgdGhlcmUgYXJlIGF0IGxlYXN0CiAgICB0aGUgbWluaW11bSBudW1iZXIgb2YgYnl0ZXMgYmVmb3JlIHdlIHN0YXJ0LiBUaGlzIGlzbid0IGFzIGVmZmVjdGl2ZSBpbgogICAgVVRGLTggbW9kZSwgYnV0IGl0IGRvZXMgbm8gaGFybS4gU2VwYXJhdGUgdGhlIFVURi04IGNvZGUgY29tcGxldGVseSBhcyB0aGF0CiAgICBpcyB0aWRpZXIuIEFsc28gc2VwYXJhdGUgdGhlIFVDUCBjb2RlLCB3aGljaCBjYW4gYmUgdGhlIHNhbWUgZm9yIGJvdGggVVRGLTgKICAgIGFuZCBzaW5nbGUtYnl0ZXMuICovCgogICAgaWYgKG1pbiA+IG1kLT5lbmRfc3ViamVjdCAtIGVwdHIpIFJSRVRVUk4oTUFUQ0hfTk9NQVRDSCk7CiAgICBpZiAobWluID4gMCkKICAgICAgewojaWZkZWYgU1VQUE9SVF9VQ1AKICAgICAgaWYgKHByb3BfdHlwZSA+IDApCiAgICAgICAgewogICAgICAgIGZvciAoaSA9IDE7IGkgPD0gbWluOyBpKyspCiAgICAgICAgICB7CiAgICAgICAgICBHRVRDSEFSSU5DKGMsIGVwdHIpOwogICAgICAgICAgcHJvcF9jYXRlZ29yeSA9IHVjcF9maW5kY2hhcihjLCAmcHJvcF9jaGFydHlwZSwgJnByb3Bfb3RoZXJjYXNlKTsKICAgICAgICAgIGlmICgoKnByb3BfdGVzdF92YXJpYWJsZSA9PSBwcm9wX3Rlc3RfYWdhaW5zdCkgPT0gcHJvcF9mYWlsX3Jlc3VsdCkKICAgICAgICAgICAgUlJFVFVSTihNQVRDSF9OT01BVENIKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAvKiBNYXRjaCBleHRlbmRlZCBVbmljb2RlIHNlcXVlbmNlcy4gV2Ugd2lsbCBnZXQgaGVyZSBvbmx5IGlmIHRoZQogICAgICBzdXBwb3J0IGlzIGluIHRoZSBiaW5hcnk7IG90aGVyd2lzZSBhIGNvbXBpbGUtdGltZSBlcnJvciBvY2N1cnMuICovCgogICAgICBlbHNlIGlmIChjdHlwZSA9PSBPUF9FWFRVTkkpCiAgICAgICAgewogICAgICAgIGZvciAoaSA9IDE7IGkgPD0gbWluOyBpKyspCiAgICAgICAgICB7CiAgICAgICAgICBHRVRDSEFSSU5DVEVTVChjLCBlcHRyKTsKICAgICAgICAgIHByb3BfY2F0ZWdvcnkgPSB1Y3BfZmluZGNoYXIoYywgJnByb3BfY2hhcnR5cGUsICZwcm9wX290aGVyY2FzZSk7CiAgICAgICAgICBpZiAocHJvcF9jYXRlZ29yeSA9PSB1Y3BfTSkgUlJFVFVSTihNQVRDSF9OT01BVENIKTsKICAgICAgICAgIHdoaWxlIChlcHRyIDwgbWQtPmVuZF9zdWJqZWN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgIGludCBsZW4gPSAxOwogICAgICAgICAgICBpZiAoIW1kLT51dGY4KSBjID0gKmVwdHI7IGVsc2UKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgR0VUQ0hBUkxFTihjLCBlcHRyLCBsZW4pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJvcF9jYXRlZ29yeSA9IHVjcF9maW5kY2hhcihjLCAmcHJvcF9jaGFydHlwZSwgJnByb3Bfb3RoZXJjYXNlKTsKICAgICAgICAgICAgaWYgKHByb3BfY2F0ZWdvcnkgIT0gdWNwX00pIGJyZWFrOwogICAgICAgICAgICBlcHRyICs9IGxlbjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgIGVsc2UKI2VuZGlmICAgICAvKiBTVVBQT1JUX1VDUCAqLwoKLyogSGFuZGxlIGFsbCBvdGhlciBjYXNlcyB3aGVuIHRoZSBjb2RpbmcgaXMgVVRGLTggKi8KCiNpZmRlZiBTVVBQT1JUX1VURjgKICAgICAgaWYgKG1kLT51dGY4KSBzd2l0Y2goY3R5cGUpCiAgICAgICAgewogICAgICAgIGNhc2UgT1BfQU5ZOgogICAgICAgIGZvciAoaSA9IDE7IGkgPD0gbWluOyBpKyspCiAgICAgICAgICB7CiAgICAgICAgICBpZiAoZXB0ciA+PSBtZC0+ZW5kX3N1YmplY3QgfHwKICAgICAgICAgICAgICgqZXB0cisrID09IE5FV0xJTkUgJiYgKGltcyAmIFBDUkVfRE9UQUxMKSA9PSAwKSkKICAgICAgICAgICAgUlJFVFVSTihNQVRDSF9OT01BVENIKTsKICAgICAgICAgIHdoaWxlIChlcHRyIDwgbWQtPmVuZF9zdWJqZWN0ICYmICgqZXB0ciAmIDB4YzApID09IDB4ODApIGVwdHIrKzsKICAgICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBPUF9BTllCWVRFOgogICAgICAgIGVwdHIgKz0gbWluOwogICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIE9QX05PVF9ESUdJVDoKICAgICAgICBmb3IgKGkgPSAxOyBpIDw9IG1pbjsgaSsrKQogICAgICAgICAgewogICAgICAgICAgaWYgKGVwdHIgPj0gbWQtPmVuZF9zdWJqZWN0KSBSUkVUVVJOKE1BVENIX05PTUFUQ0gpOwogICAgICAgICAgR0VUQ0hBUklOQyhjLCBlcHRyKTsKICAgICAgICAgIGlmIChjIDwgMTI4ICYmIChtZC0+Y3R5cGVzW2NdICYgY3R5cGVfZGlnaXQpICE9IDApCiAgICAgICAgICAgIFJSRVRVUk4oTUFUQ0hfTk9NQVRDSCk7CiAgICAgICAgICB9CiAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgT1BfRElHSVQ6CiAgICAgICAgZm9yIChpID0gMTsgaSA8PSBtaW47IGkrKykKICAgICAgICAgIHsKICAgICAgICAgIGlmIChlcHRyID49IG1kLT5lbmRfc3ViamVjdCB8fAogICAgICAgICAgICAgKmVwdHIgPj0gMTI4IHx8IChtZC0+Y3R5cGVzWyplcHRyKytdICYgY3R5cGVfZGlnaXQpID09IDApCiAgICAgICAgICAgIFJSRVRVUk4oTUFUQ0hfTk9NQVRDSCk7CiAgICAgICAgICAvKiBObyBuZWVkIHRvIHNraXAgbW9yZSBieXRlcyAtIHdlIGtub3cgaXQncyBhIDEtYnl0ZSBjaGFyYWN0ZXIgKi8KICAgICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBPUF9OT1RfV0hJVEVTUEFDRToKICAgICAgICBmb3IgKGkgPSAxOyBpIDw9IG1pbjsgaSsrKQogICAgICAgICAgewogICAgICAgICAgaWYgKGVwdHIgPj0gbWQtPmVuZF9zdWJqZWN0IHx8CiAgICAgICAgICAgICAoKmVwdHIgPCAxMjggJiYgKG1kLT5jdHlwZXNbKmVwdHIrK10gJiBjdHlwZV9zcGFjZSkgIT0gMCkpCiAgICAgICAgICAgIFJSRVRVUk4oTUFUQ0hfTk9NQVRDSCk7CiAgICAgICAgICB3aGlsZSAoZXB0ciA8IG1kLT5lbmRfc3ViamVjdCAmJiAoKmVwdHIgJiAweGMwKSA9PSAweDgwKSBlcHRyKys7CiAgICAgICAgICB9CiAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgT1BfV0hJVEVTUEFDRToKICAgICAgICBmb3IgKGkgPSAxOyBpIDw9IG1pbjsgaSsrKQogICAgICAgICAgewogICAgICAgICAgaWYgKGVwdHIgPj0gbWQtPmVuZF9zdWJqZWN0IHx8CiAgICAgICAgICAgICAqZXB0ciA+PSAxMjggfHwgKG1kLT5jdHlwZXNbKmVwdHIrK10gJiBjdHlwZV9zcGFjZSkgPT0gMCkKICAgICAgICAgICAgUlJFVFVSTihNQVRDSF9OT01BVENIKTsKICAgICAgICAgIC8qIE5vIG5lZWQgdG8gc2tpcCBtb3JlIGJ5dGVzIC0gd2Uga25vdyBpdCdzIGEgMS1ieXRlIGNoYXJhY3RlciAqLwogICAgICAgICAgfQogICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIE9QX05PVF9XT1JEQ0hBUjoKICAgICAgICBmb3IgKGkgPSAxOyBpIDw9IG1pbjsgaSsrKQogICAgICAgICAgewogICAgICAgICAgaWYgKGVwdHIgPj0gbWQtPmVuZF9zdWJqZWN0IHx8CiAgICAgICAgICAgICAoKmVwdHIgPCAxMjggJiYgKG1kLT5jdHlwZXNbKmVwdHIrK10gJiBjdHlwZV93b3JkKSAhPSAwKSkKICAgICAgICAgICAgUlJFVFVSTihNQVRDSF9OT01BVENIKTsKICAgICAgICAgIHdoaWxlIChlcHRyIDwgbWQtPmVuZF9zdWJqZWN0ICYmICgqZXB0ciAmIDB4YzApID09IDB4ODApIGVwdHIrKzsKICAgICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBPUF9XT1JEQ0hBUjoKICAgICAgICBmb3IgKGkgPSAxOyBpIDw9IG1pbjsgaSsrKQogICAgICAgICAgewogICAgICAgICAgaWYgKGVwdHIgPj0gbWQtPmVuZF9zdWJqZWN0IHx8CiAgICAgICAgICAgICAqZXB0ciA+PSAxMjggfHwgKG1kLT5jdHlwZXNbKmVwdHIrK10gJiBjdHlwZV93b3JkKSA9PSAwKQogICAgICAgICAgICBSUkVUVVJOKE1BVENIX05PTUFUQ0gpOwogICAgICAgICAgLyogTm8gbmVlZCB0byBza2lwIG1vcmUgYnl0ZXMgLSB3ZSBrbm93IGl0J3MgYSAxLWJ5dGUgY2hhcmFjdGVyICovCiAgICAgICAgICB9CiAgICAgICAgYnJlYWs7CgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgUlJFVFVSTihQQ1JFX0VSUk9SX0lOVEVSTkFMKTsKICAgICAgICB9ICAvKiBFbmQgc3dpdGNoKGN0eXBlKSAqLwoKICAgICAgZWxzZQojZW5kaWYgICAgIC8qIFNVUFBPUlRfVVRGOCAqLwoKICAgICAgLyogQ29kZSBmb3IgdGhlIG5vbi1VVEYtOCBjYXNlIGZvciBtaW5pbXVtIG1hdGNoaW5nIG9mIG9wZXJhdG9ycyBvdGhlcgogICAgICB0aGFuIE9QX1BST1AgYW5kIE9QX05PVFBST1AuICovCgogICAgICBzd2l0Y2goY3R5cGUpCiAgICAgICAgewogICAgICAgIGNhc2UgT1BfQU5ZOgogICAgICAgIGlmICgoaW1zICYgUENSRV9ET1RBTEwpID09IDApCiAgICAgICAgICB7CiAgICAgICAgICBmb3IgKGkgPSAxOyBpIDw9IG1pbjsgaSsrKQogICAgICAgICAgICBpZiAoKmVwdHIrKyA9PSBORVdMSU5FKSBSUkVUVVJOKE1BVENIX05PTUFUQ0gpOwogICAgICAgICAgfQogICAgICAgIGVsc2UgZXB0ciArPSBtaW47CiAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgT1BfQU5ZQllURToKICAgICAgICBlcHRyICs9IG1pbjsKICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBPUF9OT1RfRElHSVQ6CiAgICAgICAgZm9yIChpID0gMTsgaSA8PSBtaW47IGkrKykKICAgICAgICAgIGlmICgobWQtPmN0eXBlc1sqZXB0cisrXSAmIGN0eXBlX2RpZ2l0KSAhPSAwKSBSUkVUVVJOKE1BVENIX05PTUFUQ0gpOwogICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIE9QX0RJR0lUOgogICAgICAgIGZvciAoaSA9IDE7IGkgPD0gbWluOyBpKyspCiAgICAgICAgICBpZiAoKG1kLT5jdHlwZXNbKmVwdHIrK10gJiBjdHlwZV9kaWdpdCkgPT0gMCkgUlJFVFVSTihNQVRDSF9OT01BVENIKTsKICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBPUF9OT1RfV0hJVEVTUEFDRToKICAgICAgICBmb3IgKGkgPSAxOyBpIDw9IG1pbjsgaSsrKQogICAgICAgICAgaWYgKChtZC0+Y3R5cGVzWyplcHRyKytdICYgY3R5cGVfc3BhY2UpICE9IDApIFJSRVRVUk4oTUFUQ0hfTk9NQVRDSCk7CiAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgT1BfV0hJVEVTUEFDRToKICAgICAgICBmb3IgKGkgPSAxOyBpIDw9IG1pbjsgaSsrKQogICAgICAgICAgaWYgKChtZC0+Y3R5cGVzWyplcHRyKytdICYgY3R5cGVfc3BhY2UpID09IDApIFJSRVRVUk4oTUFUQ0hfTk9NQVRDSCk7CiAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgT1BfTk9UX1dPUkRDSEFSOgogICAgICAgIGZvciAoaSA9IDE7IGkgPD0gbWluOyBpKyspCiAgICAgICAgICBpZiAoKG1kLT5jdHlwZXNbKmVwdHIrK10gJiBjdHlwZV93b3JkKSAhPSAwKQogICAgICAgICAgICBSUkVUVVJOKE1BVENIX05PTUFUQ0gpOwogICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIE9QX1dPUkRDSEFSOgogICAgICAgIGZvciAoaSA9IDE7IGkgPD0gbWluOyBpKyspCiAgICAgICAgICBpZiAoKG1kLT5jdHlwZXNbKmVwdHIrK10gJiBjdHlwZV93b3JkKSA9PSAwKQogICAgICAgICAgICBSUkVUVVJOKE1BVENIX05PTUFUQ0gpOwogICAgICAgIGJyZWFrOwoKICAgICAgICBkZWZhdWx0OgogICAgICAgIFJSRVRVUk4oUENSRV9FUlJPUl9JTlRFUk5BTCk7CiAgICAgICAgfQogICAgICB9CgogICAgLyogSWYgbWluID0gbWF4LCBjb250aW51ZSBhdCB0aGUgc2FtZSBsZXZlbCB3aXRob3V0IHJlY3Vyc2luZyAqLwoKICAgIGlmIChtaW4gPT0gbWF4KSBjb250aW51ZTsKCiAgICAvKiBJZiBtaW5pbWl6aW5nLCB3ZSBoYXZlIHRvIHRlc3QgdGhlIHJlc3Qgb2YgdGhlIHBhdHRlcm4gYmVmb3JlIGVhY2gKICAgIHN1YnNlcXVlbnQgbWF0Y2guIEFnYWluLCBzZXBhcmF0ZSB0aGUgVVRGLTggY2FzZSBmb3Igc3BlZWQsIGFuZCBhbHNvCiAgICBzZXBhcmF0ZSB0aGUgVUNQIGNhc2VzLiAqLwoKICAgIGlmIChtaW5pbWl6ZSkKICAgICAgewojaWZkZWYgU1VQUE9SVF9VQ1AKICAgICAgaWYgKHByb3BfdHlwZSA+IDApCiAgICAgICAgewogICAgICAgIGZvciAoZmkgPSBtaW47OyBmaSsrKQogICAgICAgICAgewogICAgICAgICAgUk1BVENIKHJyYywgZXB0ciwgZWNvZGUsIG9mZnNldF90b3AsIG1kLCBpbXMsIGVwdHJiLCAwKTsKICAgICAgICAgIGlmIChycmMgIT0gTUFUQ0hfTk9NQVRDSCkgUlJFVFVSTihycmMpOwogICAgICAgICAgaWYgKGZpID49IG1heCB8fCBlcHRyID49IG1kLT5lbmRfc3ViamVjdCkgUlJFVFVSTihNQVRDSF9OT01BVENIKTsKICAgICAgICAgIEdFVENIQVJJTkMoYywgZXB0cik7CiAgICAgICAgICBwcm9wX2NhdGVnb3J5ID0gdWNwX2ZpbmRjaGFyKGMsICZwcm9wX2NoYXJ0eXBlLCAmcHJvcF9vdGhlcmNhc2UpOwogICAgICAgICAgaWYgKCgqcHJvcF90ZXN0X3ZhcmlhYmxlID09IHByb3BfdGVzdF9hZ2FpbnN0KSA9PSBwcm9wX2ZhaWxfcmVzdWx0KQogICAgICAgICAgICBSUkVUVVJOKE1BVENIX05PTUFUQ0gpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgIC8qIE1hdGNoIGV4dGVuZGVkIFVuaWNvZGUgc2VxdWVuY2VzLiBXZSB3aWxsIGdldCBoZXJlIG9ubHkgaWYgdGhlCiAgICAgIHN1cHBvcnQgaXMgaW4gdGhlIGJpbmFyeTsgb3RoZXJ3aXNlIGEgY29tcGlsZS10aW1lIGVycm9yIG9jY3Vycy4gKi8KCiAgICAgIGVsc2UgaWYgKGN0eXBlID09IE9QX0VYVFVOSSkKICAgICAgICB7CiAgICAgICAgZm9yIChmaSA9IG1pbjs7IGZpKyspCiAgICAgICAgICB7CiAgICAgICAgICBSTUFUQ0gocnJjLCBlcHRyLCBlY29kZSwgb2Zmc2V0X3RvcCwgbWQsIGltcywgZXB0cmIsIDApOwogICAgICAgICAgaWYgKHJyYyAhPSBNQVRDSF9OT01BVENIKSBSUkVUVVJOKHJyYyk7CiAgICAgICAgICBpZiAoZmkgPj0gbWF4IHx8IGVwdHIgPj0gbWQtPmVuZF9zdWJqZWN0KSBSUkVUVVJOKE1BVENIX05PTUFUQ0gpOwogICAgICAgICAgR0VUQ0hBUklOQ1RFU1QoYywgZXB0cik7CiAgICAgICAgICBwcm9wX2NhdGVnb3J5ID0gdWNwX2ZpbmRjaGFyKGMsICZwcm9wX2NoYXJ0eXBlLCAmcHJvcF9vdGhlcmNhc2UpOwogICAgICAgICAgaWYgKHByb3BfY2F0ZWdvcnkgPT0gdWNwX00pIFJSRVRVUk4oTUFUQ0hfTk9NQVRDSCk7CiAgICAgICAgICB3aGlsZSAoZXB0ciA8IG1kLT5lbmRfc3ViamVjdCkKICAgICAgICAgICAgewogICAgICAgICAgICBpbnQgbGVuID0gMTsKICAgICAgICAgICAgaWYgKCFtZC0+dXRmOCkgYyA9ICplcHRyOyBlbHNlCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgIEdFVENIQVJMRU4oYywgZXB0ciwgbGVuKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIHByb3BfY2F0ZWdvcnkgPSB1Y3BfZmluZGNoYXIoYywgJnByb3BfY2hhcnR5cGUsICZwcm9wX290aGVyY2FzZSk7CiAgICAgICAgICAgIGlmIChwcm9wX2NhdGVnb3J5ICE9IHVjcF9NKSBicmVhazsKICAgICAgICAgICAgZXB0ciArPSBsZW47CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CgogICAgICBlbHNlCiNlbmRpZiAgICAgLyogU1VQUE9SVF9VQ1AgKi8KCiNpZmRlZiBTVVBQT1JUX1VURjgKICAgICAgLyogVVRGLTggbW9kZSAqLwogICAgICBpZiAobWQtPnV0ZjgpCiAgICAgICAgewogICAgICAgIGZvciAoZmkgPSBtaW47OyBmaSsrKQogICAgICAgICAgewogICAgICAgICAgUk1BVENIKHJyYywgZXB0ciwgZWNvZGUsIG9mZnNldF90b3AsIG1kLCBpbXMsIGVwdHJiLCAwKTsKICAgICAgICAgIGlmIChycmMgIT0gTUFUQ0hfTk9NQVRDSCkgUlJFVFVSTihycmMpOwogICAgICAgICAgaWYgKGZpID49IG1heCB8fCBlcHRyID49IG1kLT5lbmRfc3ViamVjdCkgUlJFVFVSTihNQVRDSF9OT01BVENIKTsKCiAgICAgICAgICBHRVRDSEFSSU5DKGMsIGVwdHIpOwogICAgICAgICAgc3dpdGNoKGN0eXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgIGNhc2UgT1BfQU5ZOgogICAgICAgICAgICBpZiAoKGltcyAmIFBDUkVfRE9UQUxMKSA9PSAwICYmIGMgPT0gTkVXTElORSkgUlJFVFVSTihNQVRDSF9OT01BVENIKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIE9QX0FOWUJZVEU6CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBPUF9OT1RfRElHSVQ6CiAgICAgICAgICAgIGlmIChjIDwgMjU2ICYmIChtZC0+Y3R5cGVzW2NdICYgY3R5cGVfZGlnaXQpICE9IDApCiAgICAgICAgICAgICAgUlJFVFVSTihNQVRDSF9OT01BVENIKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIE9QX0RJR0lUOgogICAgICAgICAgICBpZiAoYyA+PSAyNTYgfHwgKG1kLT5jdHlwZXNbY10gJiBjdHlwZV9kaWdpdCkgPT0gMCkKICAgICAgICAgICAgICBSUkVUVVJOKE1BVENIX05PTUFUQ0gpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgT1BfTk9UX1dISVRFU1BBQ0U6CiAgICAgICAgICAgIGlmIChjIDwgMjU2ICYmIChtZC0+Y3R5cGVzW2NdICYgY3R5cGVfc3BhY2UpICE9IDApCiAgICAgICAgICAgICAgUlJFVFVSTihNQVRDSF9OT01BVENIKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIE9QX1dISVRFU1BBQ0U6CiAgICAgICAgICAgIGlmICAoYyA+PSAyNTYgfHwgKG1kLT5jdHlwZXNbY10gJiBjdHlwZV9zcGFjZSkgPT0gMCkKICAgICAgICAgICAgICBSUkVUVVJOKE1BVENIX05PTUFUQ0gpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgT1BfTk9UX1dPUkRDSEFSOgogICAgICAgICAgICBpZiAoYyA8IDI1NiAmJiAobWQtPmN0eXBlc1tjXSAmIGN0eXBlX3dvcmQpICE9IDApCiAgICAgICAgICAgICAgUlJFVFVSTihNQVRDSF9OT01BVENIKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIE9QX1dPUkRDSEFSOgogICAgICAgICAgICBpZiAoYyA+PSAyNTYgJiYgKG1kLT5jdHlwZXNbY10gJiBjdHlwZV93b3JkKSA9PSAwKQogICAgICAgICAgICAgIFJSRVRVUk4oTUFUQ0hfTk9NQVRDSCk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgUlJFVFVSTihQQ1JFX0VSUk9SX0lOVEVSTkFMKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgZWxzZQojZW5kaWYKICAgICAgLyogTm90IFVURi04IG1vZGUgKi8KICAgICAgICB7CiAgICAgICAgZm9yIChmaSA9IG1pbjs7IGZpKyspCiAgICAgICAgICB7CiAgICAgICAgICBSTUFUQ0gocnJjLCBlcHRyLCBlY29kZSwgb2Zmc2V0X3RvcCwgbWQsIGltcywgZXB0cmIsIDApOwogICAgICAgICAgaWYgKHJyYyAhPSBNQVRDSF9OT01BVENIKSBSUkVUVVJOKHJyYyk7CiAgICAgICAgICBpZiAoZmkgPj0gbWF4IHx8IGVwdHIgPj0gbWQtPmVuZF9zdWJqZWN0KSBSUkVUVVJOKE1BVENIX05PTUFUQ0gpOwogICAgICAgICAgYyA9ICplcHRyKys7CiAgICAgICAgICBzd2l0Y2goY3R5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgY2FzZSBPUF9BTlk6CiAgICAgICAgICAgIGlmICgoaW1zICYgUENSRV9ET1RBTEwpID09IDAgJiYgYyA9PSBORVdMSU5FKSBSUkVUVVJOKE1BVENIX05PTUFUQ0gpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgT1BfQU5ZQllURToKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIE9QX05PVF9ESUdJVDoKICAgICAgICAgICAgaWYgKChtZC0+Y3R5cGVzW2NdICYgY3R5cGVfZGlnaXQpICE9IDApIFJSRVRVUk4oTUFUQ0hfTk9NQVRDSCk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBPUF9ESUdJVDoKICAgICAgICAgICAgaWYgKChtZC0+Y3R5cGVzW2NdICYgY3R5cGVfZGlnaXQpID09IDApIFJSRVRVUk4oTUFUQ0hfTk9NQVRDSCk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBPUF9OT1RfV0hJVEVTUEFDRToKICAgICAgICAgICAgaWYgKChtZC0+Y3R5cGVzW2NdICYgY3R5cGVfc3BhY2UpICE9IDApIFJSRVRVUk4oTUFUQ0hfTk9NQVRDSCk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBPUF9XSElURVNQQUNFOgogICAgICAgICAgICBpZiAgKChtZC0+Y3R5cGVzW2NdICYgY3R5cGVfc3BhY2UpID09IDApIFJSRVRVUk4oTUFUQ0hfTk9NQVRDSCk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBPUF9OT1RfV09SRENIQVI6CiAgICAgICAgICAgIGlmICgobWQtPmN0eXBlc1tjXSAmIGN0eXBlX3dvcmQpICE9IDApIFJSRVRVUk4oTUFUQ0hfTk9NQVRDSCk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBPUF9XT1JEQ0hBUjoKICAgICAgICAgICAgaWYgKChtZC0+Y3R5cGVzW2NdICYgY3R5cGVfd29yZCkgPT0gMCkgUlJFVFVSTihNQVRDSF9OT01BVENIKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBSUkVUVVJOKFBDUkVfRVJST1JfSU5URVJOQUwpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAvKiBDb250cm9sIG5ldmVyIGdldHMgaGVyZSAqLwogICAgICB9CgogICAgLyogSWYgbWF4aW1pemluZyBpdCBpcyB3b3J0aCB1c2luZyBpbmxpbmUgY29kZSBmb3Igc3BlZWQsIGRvaW5nIHRoZSB0eXBlCiAgICB0ZXN0IG9uY2UgYXQgdGhlIHN0YXJ0IChpLmUuIGtlZXAgaXQgb3V0IG9mIHRoZSBsb29wKS4gQWdhaW4sIGtlZXAgdGhlCiAgICBVVEYtOCBhbmQgVUNQIHN0dWZmIHNlcGFyYXRlLiAqLwoKICAgIGVsc2UKICAgICAgewogICAgICBwcCA9IGVwdHI7ICAvKiBSZW1lbWJlciB3aGVyZSB3ZSBzdGFydGVkICovCgojaWZkZWYgU1VQUE9SVF9VQ1AKICAgICAgaWYgKHByb3BfdHlwZSA+IDApCiAgICAgICAgewogICAgICAgIGZvciAoaSA9IG1pbjsgaSA8IG1heDsgaSsrKQogICAgICAgICAgewogICAgICAgICAgaW50IGxlbiA9IDE7CiAgICAgICAgICBpZiAoZXB0ciA+PSBtZC0+ZW5kX3N1YmplY3QpIGJyZWFrOwogICAgICAgICAgR0VUQ0hBUkxFTihjLCBlcHRyLCBsZW4pOwogICAgICAgICAgcHJvcF9jYXRlZ29yeSA9IHVjcF9maW5kY2hhcihjLCAmcHJvcF9jaGFydHlwZSwgJnByb3Bfb3RoZXJjYXNlKTsKICAgICAgICAgIGlmICgoKnByb3BfdGVzdF92YXJpYWJsZSA9PSBwcm9wX3Rlc3RfYWdhaW5zdCkgPT0gcHJvcF9mYWlsX3Jlc3VsdCkKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBlcHRyKz0gbGVuOwogICAgICAgICAgfQoKICAgICAgICAvKiBlcHRyIGlzIG5vdyBwYXN0IHRoZSBlbmQgb2YgdGhlIG1heGltdW0gcnVuICovCgogICAgICAgIGZvcig7OykKICAgICAgICAgIHsKICAgICAgICAgIFJNQVRDSChycmMsIGVwdHIsIGVjb2RlLCBvZmZzZXRfdG9wLCBtZCwgaW1zLCBlcHRyYiwgMCk7CiAgICAgICAgICBpZiAocnJjICE9IE1BVENIX05PTUFUQ0gpIFJSRVRVUk4ocnJjKTsKICAgICAgICAgIGlmIChlcHRyLS0gPT0gcHApIGJyZWFrOyAgICAgICAgLyogU3RvcCBpZiB0cmllZCBhdCBvcmlnaW5hbCBwb3MgKi8KICAgICAgICAgIEJBQ0tDSEFSKGVwdHIpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgIC8qIE1hdGNoIGV4dGVuZGVkIFVuaWNvZGUgc2VxdWVuY2VzLiBXZSB3aWxsIGdldCBoZXJlIG9ubHkgaWYgdGhlCiAgICAgIHN1cHBvcnQgaXMgaW4gdGhlIGJpbmFyeTsgb3RoZXJ3aXNlIGEgY29tcGlsZS10aW1lIGVycm9yIG9jY3Vycy4gKi8KCiAgICAgIGVsc2UgaWYgKGN0eXBlID09IE9QX0VYVFVOSSkKICAgICAgICB7CiAgICAgICAgZm9yIChpID0gbWluOyBpIDwgbWF4OyBpKyspCiAgICAgICAgICB7CiAgICAgICAgICBpZiAoZXB0ciA+PSBtZC0+ZW5kX3N1YmplY3QpIGJyZWFrOwogICAgICAgICAgR0VUQ0hBUklOQ1RFU1QoYywgZXB0cik7CiAgICAgICAgICBwcm9wX2NhdGVnb3J5ID0gdWNwX2ZpbmRjaGFyKGMsICZwcm9wX2NoYXJ0eXBlLCAmcHJvcF9vdGhlcmNhc2UpOwogICAgICAgICAgaWYgKHByb3BfY2F0ZWdvcnkgPT0gdWNwX00pIGJyZWFrOwogICAgICAgICAgd2hpbGUgKGVwdHIgPCBtZC0+ZW5kX3N1YmplY3QpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgaW50IGxlbiA9IDE7CiAgICAgICAgICAgIGlmICghbWQtPnV0ZjgpIGMgPSAqZXB0cjsgZWxzZQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICBHRVRDSEFSTEVOKGMsIGVwdHIsIGxlbik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICBwcm9wX2NhdGVnb3J5ID0gdWNwX2ZpbmRjaGFyKGMsICZwcm9wX2NoYXJ0eXBlLCAmcHJvcF9vdGhlcmNhc2UpOwogICAgICAgICAgICBpZiAocHJvcF9jYXRlZ29yeSAhPSB1Y3BfTSkgYnJlYWs7CiAgICAgICAgICAgIGVwdHIgKz0gbGVuOwogICAgICAgICAgICB9CiAgICAgICAgICB9CgogICAgICAgIC8qIGVwdHIgaXMgbm93IHBhc3QgdGhlIGVuZCBvZiB0aGUgbWF4aW11bSBydW4gKi8KCiAgICAgICAgZm9yKDs7KQogICAgICAgICAgewogICAgICAgICAgUk1BVENIKHJyYywgZXB0ciwgZWNvZGUsIG9mZnNldF90b3AsIG1kLCBpbXMsIGVwdHJiLCAwKTsKICAgICAgICAgIGlmIChycmMgIT0gTUFUQ0hfTk9NQVRDSCkgUlJFVFVSTihycmMpOwogICAgICAgICAgaWYgKGVwdHItLSA9PSBwcCkgYnJlYWs7ICAgICAgICAvKiBTdG9wIGlmIHRyaWVkIGF0IG9yaWdpbmFsIHBvcyAqLwogICAgICAgICAgZm9yICg7OykgICAgICAgICAgICAgICAgICAgICAgICAvKiBNb3ZlIGJhY2sgb3ZlciBvbmUgZXh0ZW5kZWQgKi8KICAgICAgICAgICAgewogICAgICAgICAgICBpbnQgbGVuID0gMTsKICAgICAgICAgICAgQkFDS0NIQVIoZXB0cik7CiAgICAgICAgICAgIGlmICghbWQtPnV0ZjgpIGMgPSAqZXB0cjsgZWxzZQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICBHRVRDSEFSTEVOKGMsIGVwdHIsIGxlbik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICBwcm9wX2NhdGVnb3J5ID0gdWNwX2ZpbmRjaGFyKGMsICZwcm9wX2NoYXJ0eXBlLCAmcHJvcF9vdGhlcmNhc2UpOwogICAgICAgICAgICBpZiAocHJvcF9jYXRlZ29yeSAhPSB1Y3BfTSkgYnJlYWs7CiAgICAgICAgICAgIGVwdHItLTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgIGVsc2UKI2VuZGlmICAgLyogU1VQUE9SVF9VQ1AgKi8KCiNpZmRlZiBTVVBQT1JUX1VURjgKICAgICAgLyogVVRGLTggbW9kZSAqLwoKICAgICAgaWYgKG1kLT51dGY4KQogICAgICAgIHsKICAgICAgICBzd2l0Y2goY3R5cGUpCiAgICAgICAgICB7CiAgICAgICAgICBjYXNlIE9QX0FOWToKCiAgICAgICAgICAvKiBTcGVjaWFsIGNvZGUgaXMgcmVxdWlyZWQgZm9yIFVURjgsIGJ1dCB3aGVuIHRoZSBtYXhpbXVtIGlzIHVubGltaXRlZAogICAgICAgICAgd2UgZG9uJ3QgbmVlZCBpdCwgc28gd2UgcmVwZWF0IHRoZSBub24tVVRGOCBjb2RlLiBUaGlzIGlzIHByb2JhYmx5CiAgICAgICAgICB3b3J0aCBpdCwgYmVjYXVzZSAuKiBpcyBxdWl0ZSBhIGNvbW1vbiBpZGlvbS4gKi8KCiAgICAgICAgICBpZiAobWF4IDwgSU5UX01BWCkKICAgICAgICAgICAgewogICAgICAgICAgICBpZiAoKGltcyAmIFBDUkVfRE9UQUxMKSA9PSAwKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICBmb3IgKGkgPSBtaW47IGkgPCBtYXg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChlcHRyID49IG1kLT5lbmRfc3ViamVjdCB8fCAqZXB0ciA9PSBORVdMSU5FKSBicmVhazsKICAgICAgICAgICAgICAgIGVwdHIrKzsKICAgICAgICAgICAgICAgIHdoaWxlIChlcHRyIDwgbWQtPmVuZF9zdWJqZWN0ICYmICgqZXB0ciAmIDB4YzApID09IDB4ODApIGVwdHIrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgZm9yIChpID0gbWluOyBpIDwgbWF4OyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBlcHRyKys7CiAgICAgICAgICAgICAgICB3aGlsZSAoZXB0ciA8IG1kLT5lbmRfc3ViamVjdCAmJiAoKmVwdHIgJiAweGMwKSA9PSAweDgwKSBlcHRyKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgLyogSGFuZGxlIHVubGltaXRlZCBVVEYtOCByZXBlYXQgKi8KCiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgaWYgKChpbXMgJiBQQ1JFX0RPVEFMTCkgPT0gMCkKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgZm9yIChpID0gbWluOyBpIDwgbWF4OyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoZXB0ciA+PSBtZC0+ZW5kX3N1YmplY3QgfHwgKmVwdHIgPT0gTkVXTElORSkgYnJlYWs7CiAgICAgICAgICAgICAgICBlcHRyKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgIGMgPSBtYXggLSBtaW47CiAgICAgICAgICAgICAgaWYgKGMgPiBtZC0+ZW5kX3N1YmplY3QgLSBlcHRyKSBjID0gbWQtPmVuZF9zdWJqZWN0IC0gZXB0cjsKICAgICAgICAgICAgICBlcHRyICs9IGM7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKCiAgICAgICAgICAvKiBUaGUgYnl0ZSBjYXNlIGlzIHRoZSBzYW1lIGFzIG5vbi1VVEY4ICovCgogICAgICAgICAgY2FzZSBPUF9BTllCWVRFOgogICAgICAgICAgYyA9IG1heCAtIG1pbjsKICAgICAgICAgIGlmIChjID4gbWQtPmVuZF9zdWJqZWN0IC0gZXB0cikgYyA9IG1kLT5lbmRfc3ViamVjdCAtIGVwdHI7CiAgICAgICAgICBlcHRyICs9IGM7CiAgICAgICAgICBicmVhazsKCiAgICAgICAgICBjYXNlIE9QX05PVF9ESUdJVDoKICAgICAgICAgIGZvciAoaSA9IG1pbjsgaSA8IG1heDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgIGludCBsZW4gPSAxOwogICAgICAgICAgICBpZiAoZXB0ciA+PSBtZC0+ZW5kX3N1YmplY3QpIGJyZWFrOwogICAgICAgICAgICBHRVRDSEFSTEVOKGMsIGVwdHIsIGxlbik7CiAgICAgICAgICAgIGlmIChjIDwgMjU2ICYmIChtZC0+Y3R5cGVzW2NdICYgY3R5cGVfZGlnaXQpICE9IDApIGJyZWFrOwogICAgICAgICAgICBlcHRyKz0gbGVuOwogICAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKCiAgICAgICAgICBjYXNlIE9QX0RJR0lUOgogICAgICAgICAgZm9yIChpID0gbWluOyBpIDwgbWF4OyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgaW50IGxlbiA9IDE7CiAgICAgICAgICAgIGlmIChlcHRyID49IG1kLT5lbmRfc3ViamVjdCkgYnJlYWs7CiAgICAgICAgICAgIEdFVENIQVJMRU4oYywgZXB0ciwgbGVuKTsKICAgICAgICAgICAgaWYgKGMgPj0gMjU2IHx8KG1kLT5jdHlwZXNbY10gJiBjdHlwZV9kaWdpdCkgPT0gMCkgYnJlYWs7CiAgICAgICAgICAgIGVwdHIrPSBsZW47CiAgICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgIGNhc2UgT1BfTk9UX1dISVRFU1BBQ0U6CiAgICAgICAgICBmb3IgKGkgPSBtaW47IGkgPCBtYXg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICBpbnQgbGVuID0gMTsKICAgICAgICAgICAgaWYgKGVwdHIgPj0gbWQtPmVuZF9zdWJqZWN0KSBicmVhazsKICAgICAgICAgICAgR0VUQ0hBUkxFTihjLCBlcHRyLCBsZW4pOwogICAgICAgICAgICBpZiAoYyA8IDI1NiAmJiAobWQtPmN0eXBlc1tjXSAmIGN0eXBlX3NwYWNlKSAhPSAwKSBicmVhazsKICAgICAgICAgICAgZXB0cis9IGxlbjsKICAgICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CgogICAgICAgICAgY2FzZSBPUF9XSElURVNQQUNFOgogICAgICAgICAgZm9yIChpID0gbWluOyBpIDwgbWF4OyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgaW50IGxlbiA9IDE7CiAgICAgICAgICAgIGlmIChlcHRyID49IG1kLT5lbmRfc3ViamVjdCkgYnJlYWs7CiAgICAgICAgICAgIEdFVENIQVJMRU4oYywgZXB0ciwgbGVuKTsKICAgICAgICAgICAgaWYgKGMgPj0gMjU2IHx8KG1kLT5jdHlwZXNbY10gJiBjdHlwZV9zcGFjZSkgPT0gMCkgYnJlYWs7CiAgICAgICAgICAgIGVwdHIrPSBsZW47CiAgICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgIGNhc2UgT1BfTk9UX1dPUkRDSEFSOgogICAgICAgICAgZm9yIChpID0gbWluOyBpIDwgbWF4OyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgaW50IGxlbiA9IDE7CiAgICAgICAgICAgIGlmIChlcHRyID49IG1kLT5lbmRfc3ViamVjdCkgYnJlYWs7CiAgICAgICAgICAgIEdFVENIQVJMRU4oYywgZXB0ciwgbGVuKTsKICAgICAgICAgICAgaWYgKGMgPCAyNTYgJiYgKG1kLT5jdHlwZXNbY10gJiBjdHlwZV93b3JkKSAhPSAwKSBicmVhazsKICAgICAgICAgICAgZXB0cis9IGxlbjsKICAgICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CgogICAgICAgICAgY2FzZSBPUF9XT1JEQ0hBUjoKICAgICAgICAgIGZvciAoaSA9IG1pbjsgaSA8IG1heDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgIGludCBsZW4gPSAxOwogICAgICAgICAgICBpZiAoZXB0ciA+PSBtZC0+ZW5kX3N1YmplY3QpIGJyZWFrOwogICAgICAgICAgICBHRVRDSEFSTEVOKGMsIGVwdHIsIGxlbik7CiAgICAgICAgICAgIGlmIChjID49IDI1NiB8fCAobWQtPmN0eXBlc1tjXSAmIGN0eXBlX3dvcmQpID09IDApIGJyZWFrOwogICAgICAgICAgICBlcHRyKz0gbGVuOwogICAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKCiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgUlJFVFVSTihQQ1JFX0VSUk9SX0lOVEVSTkFMKTsKICAgICAgICAgIH0KCiAgICAgICAgLyogZXB0ciBpcyBub3cgcGFzdCB0aGUgZW5kIG9mIHRoZSBtYXhpbXVtIHJ1biAqLwoKICAgICAgICBmb3IoOzspCiAgICAgICAgICB7CiAgICAgICAgICBSTUFUQ0gocnJjLCBlcHRyLCBlY29kZSwgb2Zmc2V0X3RvcCwgbWQsIGltcywgZXB0cmIsIDApOwogICAgICAgICAgaWYgKHJyYyAhPSBNQVRDSF9OT01BVENIKSBSUkVUVVJOKHJyYyk7CiAgICAgICAgICBpZiAoZXB0ci0tID09IHBwKSBicmVhazsgICAgICAgIC8qIFN0b3AgaWYgdHJpZWQgYXQgb3JpZ2luYWwgcG9zICovCiAgICAgICAgICBCQUNLQ0hBUihlcHRyKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIGVsc2UKI2VuZGlmCgogICAgICAvKiBOb3QgVVRGLTggbW9kZSAqLwogICAgICAgIHsKICAgICAgICBzd2l0Y2goY3R5cGUpCiAgICAgICAgICB7CiAgICAgICAgICBjYXNlIE9QX0FOWToKICAgICAgICAgIGlmICgoaW1zICYgUENSRV9ET1RBTEwpID09IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgZm9yIChpID0gbWluOyBpIDwgbWF4OyBpKyspCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgIGlmIChlcHRyID49IG1kLT5lbmRfc3ViamVjdCB8fCAqZXB0ciA9PSBORVdMSU5FKSBicmVhazsKICAgICAgICAgICAgICBlcHRyKys7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgLyogRm9yIERPVEFMTCBjYXNlLCBmYWxsIHRocm91Z2ggYW5kIHRyZWF0IGFzIFxDICovCgogICAgICAgICAgY2FzZSBPUF9BTllCWVRFOgogICAgICAgICAgYyA9IG1heCAtIG1pbjsKICAgICAgICAgIGlmIChjID4gbWQtPmVuZF9zdWJqZWN0IC0gZXB0cikgYyA9IG1kLT5lbmRfc3ViamVjdCAtIGVwdHI7CiAgICAgICAgICBlcHRyICs9IGM7CiAgICAgICAgICBicmVhazsKCiAgICAgICAgICBjYXNlIE9QX05PVF9ESUdJVDoKICAgICAgICAgIGZvciAoaSA9IG1pbjsgaSA8IG1heDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgIGlmIChlcHRyID49IG1kLT5lbmRfc3ViamVjdCB8fCAobWQtPmN0eXBlc1sqZXB0cl0gJiBjdHlwZV9kaWdpdCkgIT0gMCkKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZXB0cisrOwogICAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKCiAgICAgICAgICBjYXNlIE9QX0RJR0lUOgogICAgICAgICAgZm9yIChpID0gbWluOyBpIDwgbWF4OyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgaWYgKGVwdHIgPj0gbWQtPmVuZF9zdWJqZWN0IHx8IChtZC0+Y3R5cGVzWyplcHRyXSAmIGN0eXBlX2RpZ2l0KSA9PSAwKQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBlcHRyKys7CiAgICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgIGNhc2UgT1BfTk9UX1dISVRFU1BBQ0U6CiAgICAgICAgICBmb3IgKGkgPSBtaW47IGkgPCBtYXg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICBpZiAoZXB0ciA+PSBtZC0+ZW5kX3N1YmplY3QgfHwgKG1kLT5jdHlwZXNbKmVwdHJdICYgY3R5cGVfc3BhY2UpICE9IDApCiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGVwdHIrKzsKICAgICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CgogICAgICAgICAgY2FzZSBPUF9XSElURVNQQUNFOgogICAgICAgICAgZm9yIChpID0gbWluOyBpIDwgbWF4OyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgaWYgKGVwdHIgPj0gbWQtPmVuZF9zdWJqZWN0IHx8IChtZC0+Y3R5cGVzWyplcHRyXSAmIGN0eXBlX3NwYWNlKSA9PSAwKQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBlcHRyKys7CiAgICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgIGNhc2UgT1BfTk9UX1dPUkRDSEFSOgogICAgICAgICAgZm9yIChpID0gbWluOyBpIDwgbWF4OyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgaWYgKGVwdHIgPj0gbWQtPmVuZF9zdWJqZWN0IHx8IChtZC0+Y3R5cGVzWyplcHRyXSAmIGN0eXBlX3dvcmQpICE9IDApCiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGVwdHIrKzsKICAgICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CgogICAgICAgICAgY2FzZSBPUF9XT1JEQ0hBUjoKICAgICAgICAgIGZvciAoaSA9IG1pbjsgaSA8IG1heDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgIGlmIChlcHRyID49IG1kLT5lbmRfc3ViamVjdCB8fCAobWQtPmN0eXBlc1sqZXB0cl0gJiBjdHlwZV93b3JkKSA9PSAwKQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBlcHRyKys7CiAgICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICBSUkVUVVJOKFBDUkVfRVJST1JfSU5URVJOQUwpOwogICAgICAgICAgfQoKICAgICAgICAvKiBlcHRyIGlzIG5vdyBwYXN0IHRoZSBlbmQgb2YgdGhlIG1heGltdW0gcnVuICovCgogICAgICAgIHdoaWxlIChlcHRyID49IHBwKQogICAgICAgICAgewogICAgICAgICAgUk1BVENIKHJyYywgZXB0ciwgZWNvZGUsIG9mZnNldF90b3AsIG1kLCBpbXMsIGVwdHJiLCAwKTsKICAgICAgICAgIGVwdHItLTsKICAgICAgICAgIGlmIChycmMgIT0gTUFUQ0hfTk9NQVRDSCkgUlJFVFVSTihycmMpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgIC8qIEdldCBoZXJlIGlmIHdlIGNhbid0IG1ha2UgaXQgbWF0Y2ggd2l0aCBhbnkgcGVybWl0dGVkIHJlcGV0aXRpb25zICovCgogICAgICBSUkVUVVJOKE1BVENIX05PTUFUQ0gpOwogICAgICB9CiAgICAvKiBDb250cm9sIG5ldmVyIGdldHMgaGVyZSAqLwoKICAgIC8qIFRoZXJlJ3MgYmVlbiBzb21lIGhvcnJpYmxlIGRpc2FzdGVyLiBTaW5jZSBhbGwgY29kZXMgPiBPUF9CUkEgYXJlCiAgICBmb3IgY2FwdHVyaW5nIGJyYWNrZXRzLCBhbmQgdGhlcmUgc2hvdWxkbid0IGJlIGFueSBnYXBzIGJldHdlZW4gMCBhbmQKICAgIE9QX0JSQSwgYXJyaXZhbCBoZXJlIGNhbiBvbmx5IG1lYW4gdGhlcmUgaXMgc29tZXRoaW5nIHNlcmlvdXNseSB3cm9uZwogICAgaW4gdGhlIGNvZGUgYWJvdmUgb3IgdGhlIE9QX3h4eCBkZWZpbml0aW9ucy4gKi8KCiAgICBkZWZhdWx0OgogICAgRFBSSU5URigoIlVua25vd24gb3Bjb2RlICVkXG4iLCAqZWNvZGUpKTsKICAgIFJSRVRVUk4oUENSRV9FUlJPUl9VTktOT1dOX05PREUpOwogICAgfQoKICAvKiBEbyBub3Qgc3RpY2sgYW55IGNvZGUgaW4gaGVyZSB3aXRob3V0IG11Y2ggdGhvdWdodDsgaXQgaXMgYXNzdW1lZAogIHRoYXQgImNvbnRpbnVlIiBpbiB0aGUgY29kZSBhYm92ZSBjb21lcyBvdXQgdG8gaGVyZSB0byByZXBlYXQgdGhlIG1haW4KICBsb29wLiAqLwoKICB9ICAgICAgICAgICAgIC8qIEVuZCBvZiBtYWluIGxvb3AgKi8KLyogQ29udHJvbCBuZXZlciByZWFjaGVzIGhlcmUgKi8KfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgICAgICAgICAgICAgUkVDVVJTSU9OIElOIFRIRSBtYXRjaCgpIEZVTkNUSU9OCgpVbmRlZmluZSBhbGwgdGhlIG1hY3JvcyB0aGF0IHdlcmUgZGVmaW5lZCBhYm92ZSB0byBoYW5kbGUgdGhpcy4gKi8KCiNpZmRlZiBOT19SRUNVUlNFCiN1bmRlZiBlcHRyCiN1bmRlZiBlY29kZQojdW5kZWYgb2Zmc2V0X3RvcAojdW5kZWYgaW1zCiN1bmRlZiBlcHRyYgojdW5kZWYgZmxhZ3MKCiN1bmRlZiBjYWxscGF0CiN1bmRlZiBjaGFycHRyCiN1bmRlZiBkYXRhCiN1bmRlZiBuZXh0CiN1bmRlZiBwcAojdW5kZWYgcHJldgojdW5kZWYgc2F2ZWRfZXB0cgoKI3VuZGVmIG5ld19yZWN1cnNpdmUKCiN1bmRlZiBjdXJfaXNfd29yZAojdW5kZWYgY29uZGl0aW9uCiN1bmRlZiBtaW5pbWl6ZQojdW5kZWYgcHJldl9pc193b3JkCgojdW5kZWYgb3JpZ2luYWxfaW1zCgojdW5kZWYgY3R5cGUKI3VuZGVmIGxlbmd0aAojdW5kZWYgbWF4CiN1bmRlZiBtaW4KI3VuZGVmIG51bWJlcgojdW5kZWYgb2Zmc2V0CiN1bmRlZiBvcAojdW5kZWYgc2F2ZV9jYXB0dXJlX2xhc3QKI3VuZGVmIHNhdmVfb2Zmc2V0MQojdW5kZWYgc2F2ZV9vZmZzZXQyCiN1bmRlZiBzYXZlX29mZnNldDMKI3VuZGVmIHN0YWNrc2F2ZQoKI3VuZGVmIG5ld3B0cmIKCiNlbmRpZgoKLyogVGhlc2UgdHdvIGFyZSBkZWZpbmVkIGFzIG1hY3JvcyBpbiBib3RoIGNhc2VzICovCgojdW5kZWYgZmMKI3VuZGVmIGZpCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiAgICAgICAgIEV4ZWN1dGUgYSBSZWd1bGFyIEV4cHJlc3Npb24gICAgICAgICAgICoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qIFRoaXMgZnVuY3Rpb24gYXBwbGllcyBhIGNvbXBpbGVkIHJlIHRvIGEgc3ViamVjdCBzdHJpbmcgYW5kIHBpY2tzIG91dApwb3J0aW9ucyBvZiB0aGUgc3RyaW5nIGlmIGl0IG1hdGNoZXMuIFR3byBlbGVtZW50cyBpbiB0aGUgdmVjdG9yIGFyZSBzZXQgZm9yCmVhY2ggc3Vic3RyaW5nOiB0aGUgb2Zmc2V0cyB0byB0aGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgc3Vic3RyaW5nLgoKQXJndW1lbnRzOgogIGFyZ3VtZW50X3JlICAgICBwb2ludHMgdG8gdGhlIGNvbXBpbGVkIGV4cHJlc3Npb24KICBleHRyYV9kYXRhICAgICAgcG9pbnRzIHRvIGV4dHJhIGRhdGEgb3IgaXMgTlVMTAogIHN1YmplY3QgICAgICAgICBwb2ludHMgdG8gdGhlIHN1YmplY3Qgc3RyaW5nCiAgbGVuZ3RoICAgICAgICAgIGxlbmd0aCBvZiBzdWJqZWN0IHN0cmluZyAobWF5IGNvbnRhaW4gYmluYXJ5IHplcm9zKQogIHN0YXJ0X29mZnNldCAgICB3aGVyZSB0byBzdGFydCBpbiB0aGUgc3ViamVjdCBzdHJpbmcKICBvcHRpb25zICAgICAgICAgb3B0aW9uIGJpdHMKICBvZmZzZXRzICAgICAgICAgcG9pbnRzIHRvIGEgdmVjdG9yIG9mIGludHMgdG8gYmUgZmlsbGVkIGluIHdpdGggb2Zmc2V0cwogIG9mZnNldGNvdW50ICAgICB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSB2ZWN0b3IKClJldHVybnM6ICAgICAgICAgID4gMCA9PiBzdWNjZXNzOyB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGZpbGxlZCBpbgogICAgICAgICAgICAgICAgICA9IDAgPT4gc3VjY2VzcywgYnV0IG9mZnNldHMgaXMgbm90IGJpZyBlbm91Z2gKICAgICAgICAgICAgICAgICAgIC0xID0+IGZhaWxlZCB0byBtYXRjaAogICAgICAgICAgICAgICAgIDwgLTEgPT4gc29tZSBraW5kIG9mIHVuZXhwZWN0ZWQgcHJvYmxlbQoqLwoKRVhQT1JUIGludApwY3JlX2V4ZWMoY29uc3QgcGNyZSAqYXJndW1lbnRfcmUsIGNvbnN0IHBjcmVfZXh0cmEgKmV4dHJhX2RhdGEsCiAgY29uc3QgY2hhciAqc3ViamVjdCwgaW50IGxlbmd0aCwgaW50IHN0YXJ0X29mZnNldCwgaW50IG9wdGlvbnMsIGludCAqb2Zmc2V0cywKICBpbnQgb2Zmc2V0Y291bnQpCnsKaW50IHJjLCByZXNldGNvdW50LCBvY291bnQ7CmludCBmaXJzdF9ieXRlID0gLTE7CmludCByZXFfYnl0ZSA9IC0xOwppbnQgcmVxX2J5dGUyID0gLTE7CnVuc2lnbmVkIGxvbmcgaW50IGltcyA9IDA7CkJPT0wgdXNpbmdfdGVtcG9yYXJ5X29mZnNldHMgPSBGQUxTRTsKQk9PTCBhbmNob3JlZDsKQk9PTCBzdGFydGxpbmU7CkJPT0wgZmlyc3RfYnl0ZV9jYXNlbGVzcyA9IEZBTFNFOwpCT09MIHJlcV9ieXRlX2Nhc2VsZXNzID0gRkFMU0U7Cm1hdGNoX2RhdGEgbWF0Y2hfYmxvY2s7CmNvbnN0IHVzY2hhciAqdGFibGVzOwpjb25zdCB1c2NoYXIgKnN0YXJ0X2JpdHMgPSBOVUxMOwpjb25zdCB1c2NoYXIgKnN0YXJ0X21hdGNoID0gKGNvbnN0IHVzY2hhciAqKXN1YmplY3QgKyBzdGFydF9vZmZzZXQ7CmNvbnN0IHVzY2hhciAqZW5kX3N1YmplY3Q7CmNvbnN0IHVzY2hhciAqcmVxX2J5dGVfcHRyID0gc3RhcnRfbWF0Y2ggLSAxOwoKcGNyZV9zdHVkeV9kYXRhIGludGVybmFsX3N0dWR5Owpjb25zdCBwY3JlX3N0dWR5X2RhdGEgKnN0dWR5OwoKcmVhbF9wY3JlIGludGVybmFsX3JlOwpjb25zdCByZWFsX3BjcmUgKmV4dGVybmFsX3JlID0gKGNvbnN0IHJlYWxfcGNyZSAqKWFyZ3VtZW50X3JlOwpjb25zdCByZWFsX3BjcmUgKnJlID0gZXh0ZXJuYWxfcmU7CgovKiBQbGF1c2liaWxpdHkgY2hlY2tzICovCgppZiAoKG9wdGlvbnMgJiB+UFVCTElDX0VYRUNfT1BUSU9OUykgIT0gMCkgcmV0dXJuIFBDUkVfRVJST1JfQkFET1BUSU9OOwppZiAocmUgPT0gTlVMTCB8fCBzdWJqZWN0ID09IE5VTEwgfHwKICAgKG9mZnNldHMgPT0gTlVMTCAmJiBvZmZzZXRjb3VudCA+IDApKSByZXR1cm4gUENSRV9FUlJPUl9OVUxMOwppZiAob2Zmc2V0Y291bnQgPCAwKSByZXR1cm4gUENSRV9FUlJPUl9CQURDT1VOVDsKCi8qIEZpc2ggb3V0IHRoZSBvcHRpb25hbCBkYXRhIGZyb20gdGhlIGV4dHJhX2RhdGEgc3RydWN0dXJlLCBmaXJzdCBzZXR0aW5nCnRoZSBkZWZhdWx0IHZhbHVlcy4gKi8KCnN0dWR5ID0gTlVMTDsKbWF0Y2hfYmxvY2subWF0Y2hfbGltaXQgPSBNQVRDSF9MSU1JVDsKbWF0Y2hfYmxvY2suY2FsbG91dF9kYXRhID0gTlVMTDsKCi8qIFRoZSB0YWJsZSBwb2ludGVyIGlzIGFsd2F5cyBpbiBuYXRpdmUgYnl0ZSBvcmRlci4gKi8KCnRhYmxlcyA9IGV4dGVybmFsX3JlLT50YWJsZXM7CgppZiAoZXh0cmFfZGF0YSAhPSBOVUxMKQogIHsKICByZWdpc3RlciB1bnNpZ25lZCBpbnQgZmxhZ3MgPSBleHRyYV9kYXRhLT5mbGFnczsKICBpZiAoKGZsYWdzICYgUENSRV9FWFRSQV9TVFVEWV9EQVRBKSAhPSAwKQogICAgc3R1ZHkgPSAoY29uc3QgcGNyZV9zdHVkeV9kYXRhICopZXh0cmFfZGF0YS0+c3R1ZHlfZGF0YTsKICBpZiAoKGZsYWdzICYgUENSRV9FWFRSQV9NQVRDSF9MSU1JVCkgIT0gMCkKICAgIG1hdGNoX2Jsb2NrLm1hdGNoX2xpbWl0ID0gZXh0cmFfZGF0YS0+bWF0Y2hfbGltaXQ7CiAgaWYgKChmbGFncyAmIFBDUkVfRVhUUkFfQ0FMTE9VVF9EQVRBKSAhPSAwKQogICAgbWF0Y2hfYmxvY2suY2FsbG91dF9kYXRhID0gZXh0cmFfZGF0YS0+Y2FsbG91dF9kYXRhOwogIGlmICgoZmxhZ3MgJiBQQ1JFX0VYVFJBX1RBQkxFUykgIT0gMCkgdGFibGVzID0gZXh0cmFfZGF0YS0+dGFibGVzOwogIH0KCi8qIElmIHRoZSBleGVjIGNhbGwgc3VwcGxpZWQgTlVMTCBmb3IgdGFibGVzLCB1c2UgdGhlIGluYnVpbHQgb25lcy4gVGhpcwppcyBhIGZlYXR1cmUgdGhhdCBtYWtlcyBpdCBwb3NzaWJsZSB0byBzYXZlIGNvbXBpbGVkIHJlZ2V4IGFuZCByZS11c2UgdGhlbQppbiBvdGhlciBwcm9ncmFtcyBsYXRlci4gKi8KCmlmICh0YWJsZXMgPT0gTlVMTCkgdGFibGVzID0gcGNyZV9kZWZhdWx0X3RhYmxlczsKCi8qIENoZWNrIHRoYXQgdGhlIGZpcnN0IGZpZWxkIGluIHRoZSBibG9jayBpcyB0aGUgbWFnaWMgbnVtYmVyLiBJZiBpdCBpcyBub3QsCnRlc3QgZm9yIGEgcmVnZXggdGhhdCB3YXMgY29tcGlsZWQgb24gYSBob3N0IG9mIG9wcG9zaXRlIGVuZGlhbm5lc3MuIElmIHRoaXMgaXMKdGhlIGNhc2UsIGZsaXBwZWQgdmFsdWVzIGFyZSBwdXQgaW4gaW50ZXJuYWxfcmUgYW5kIGludGVybmFsX3N0dWR5IGlmIHRoZXJlIHdhcwpzdHVkeSBkYXRhIHRvby4gKi8KCmlmIChyZS0+bWFnaWNfbnVtYmVyICE9IE1BR0lDX05VTUJFUikKICB7CiAgcmUgPSB0cnlfZmxpcHBlZChyZSwgJmludGVybmFsX3JlLCBzdHVkeSwgJmludGVybmFsX3N0dWR5KTsKICBpZiAocmUgPT0gTlVMTCkgcmV0dXJuIFBDUkVfRVJST1JfQkFETUFHSUM7CiAgaWYgKHN0dWR5ICE9IE5VTEwpIHN0dWR5ID0gJmludGVybmFsX3N0dWR5OwogIH0KCi8qIFNldCB1cCBvdGhlciBkYXRhICovCgphbmNob3JlZCA9ICgocmUtPm9wdGlvbnMgfCBvcHRpb25zKSAmIFBDUkVfQU5DSE9SRUQpICE9IDA7CnN0YXJ0bGluZSA9IChyZS0+b3B0aW9ucyAmIFBDUkVfU1RBUlRMSU5FKSAhPSAwOwoKLyogVGhlIGNvZGUgc3RhcnRzIGFmdGVyIHRoZSByZWFsX3BjcmUgYmxvY2sgYW5kIHRoZSBjYXB0dXJlIG5hbWUgdGFibGUuICovCgptYXRjaF9ibG9jay5zdGFydF9jb2RlID0gKGNvbnN0IHVzY2hhciAqKWV4dGVybmFsX3JlICsgcmUtPm5hbWVfdGFibGVfb2Zmc2V0ICsKICByZS0+bmFtZV9jb3VudCAqIHJlLT5uYW1lX2VudHJ5X3NpemU7CgptYXRjaF9ibG9jay5zdGFydF9zdWJqZWN0ID0gKGNvbnN0IHVzY2hhciAqKXN1YmplY3Q7Cm1hdGNoX2Jsb2NrLnN0YXJ0X29mZnNldCA9IHN0YXJ0X29mZnNldDsKbWF0Y2hfYmxvY2suZW5kX3N1YmplY3QgPSBtYXRjaF9ibG9jay5zdGFydF9zdWJqZWN0ICsgbGVuZ3RoOwplbmRfc3ViamVjdCA9IG1hdGNoX2Jsb2NrLmVuZF9zdWJqZWN0OwoKbWF0Y2hfYmxvY2suZW5kb25seSA9IChyZS0+b3B0aW9ucyAmIFBDUkVfRE9MTEFSX0VORE9OTFkpICE9IDA7Cm1hdGNoX2Jsb2NrLnV0ZjggPSAocmUtPm9wdGlvbnMgJiBQQ1JFX1VURjgpICE9IDA7CgptYXRjaF9ibG9jay5ub3Rib2wgPSAob3B0aW9ucyAmIFBDUkVfTk9UQk9MKSAhPSAwOwptYXRjaF9ibG9jay5ub3Rlb2wgPSAob3B0aW9ucyAmIFBDUkVfTk9URU9MKSAhPSAwOwptYXRjaF9ibG9jay5ub3RlbXB0eSA9IChvcHRpb25zICYgUENSRV9OT1RFTVBUWSkgIT0gMDsKbWF0Y2hfYmxvY2sucGFydGlhbCA9IChvcHRpb25zICYgUENSRV9QQVJUSUFMKSAhPSAwOwptYXRjaF9ibG9jay5oaXRlbmQgPSBGQUxTRTsKCm1hdGNoX2Jsb2NrLnJlY3Vyc2l2ZSA9IE5VTEw7ICAgICAgICAgICAgICAgICAgIC8qIE5vIHJlY3Vyc2lvbiBhdCB0b3AgbGV2ZWwgKi8KCm1hdGNoX2Jsb2NrLmxjYyA9IHRhYmxlcyArIGxjY19vZmZzZXQ7Cm1hdGNoX2Jsb2NrLmN0eXBlcyA9IHRhYmxlcyArIGN0eXBlc19vZmZzZXQ7CgovKiBQYXJ0aWFsIG1hdGNoaW5nIGlzIHN1cHBvcnRlZCBvbmx5IGZvciBhIHJlc3RyaWN0ZWQgc2V0IG9mIHJlZ2V4ZXMgYXQgdGhlCm1vbWVudC4gKi8KCmlmIChtYXRjaF9ibG9jay5wYXJ0aWFsICYmIChyZS0+b3B0aW9ucyAmIFBDUkVfTk9QQVJUSUFMKSAhPSAwKQogIHJldHVybiBQQ1JFX0VSUk9SX0JBRFBBUlRJQUw7CgovKiBDaGVjayBhIFVURi04IHN0cmluZyBpZiByZXF1aXJlZC4gVW5mb3J0dW5hdGVseSB0aGVyZSdzIG5vIHdheSBvZiBwYXNzaW5nCmJhY2sgdGhlIGNoYXJhY3RlciBvZmZzZXQuICovCgojaWZkZWYgU1VQUE9SVF9VVEY4CmlmIChtYXRjaF9ibG9jay51dGY4ICYmIChvcHRpb25zICYgUENSRV9OT19VVEY4X0NIRUNLKSA9PSAwKQogIHsKICBpZiAodmFsaWRfdXRmOCgodXNjaGFyICopc3ViamVjdCwgbGVuZ3RoKSA+PSAwKQogICAgcmV0dXJuIFBDUkVfRVJST1JfQkFEVVRGODsKICBpZiAoc3RhcnRfb2Zmc2V0ID4gMCAmJiBzdGFydF9vZmZzZXQgPCBsZW5ndGgpCiAgICB7CiAgICBpbnQgdGIgPSAoKHVzY2hhciAqKXN1YmplY3QpW3N0YXJ0X29mZnNldF07CiAgICBpZiAodGIgPiAxMjcpCiAgICAgIHsKICAgICAgdGIgJj0gMHhjMDsKICAgICAgaWYgKHRiICE9IDAgJiYgdGIgIT0gMHhjMCkgcmV0dXJuIFBDUkVfRVJST1JfQkFEVVRGOF9PRkZTRVQ7CiAgICAgIH0KICAgIH0KICB9CiNlbmRpZgoKLyogVGhlIGltcyBvcHRpb25zIGNhbiB2YXJ5IGR1cmluZyB0aGUgbWF0Y2hpbmcgYXMgYSByZXN1bHQgb2YgdGhlIHByZXNlbmNlCm9mICg/aW1zKSBpdGVtcyBpbiB0aGUgcGF0dGVybi4gVGhleSBhcmUga2VwdCBpbiBhIGxvY2FsIHZhcmlhYmxlIHNvIHRoYXQKcmVzdG9yaW5nIGF0IHRoZSBleGl0IG9mIGEgZ3JvdXAgaXMgZWFzeS4gKi8KCmltcyA9IHJlLT5vcHRpb25zICYgKFBDUkVfQ0FTRUxFU1N8UENSRV9NVUxUSUxJTkV8UENSRV9ET1RBTEwpOwoKLyogSWYgdGhlIGV4cHJlc3Npb24gaGFzIGdvdCBtb3JlIGJhY2sgcmVmZXJlbmNlcyB0aGFuIHRoZSBvZmZzZXRzIHN1cHBsaWVkIGNhbgpob2xkLCB3ZSBnZXQgYSB0ZW1wb3JhcnkgY2h1bmsgb2Ygd29ya2luZyBzdG9yZSB0byB1c2UgZHVyaW5nIHRoZSBtYXRjaGluZy4KT3RoZXJ3aXNlLCB3ZSBjYW4gdXNlIHRoZSB2ZWN0b3Igc3VwcGxpZWQsIHJvdW5kaW5nIGRvd24gaXRzIHNpemUgdG8gYSBtdWx0aXBsZQpvZiAzLiAqLwoKb2NvdW50ID0gb2Zmc2V0Y291bnQgLSAob2Zmc2V0Y291bnQgJSAzKTsKCmlmIChyZS0+dG9wX2JhY2tyZWYgPiAwICYmIHJlLT50b3BfYmFja3JlZiA+PSBvY291bnQvMykKICB7CiAgb2NvdW50ID0gcmUtPnRvcF9iYWNrcmVmICogMyArIDM7CiAgbWF0Y2hfYmxvY2sub2Zmc2V0X3ZlY3RvciA9IChpbnQgKikocGNyZV9tYWxsb2MpKG9jb3VudCAqIHNpemVvZihpbnQpKTsKICBpZiAobWF0Y2hfYmxvY2sub2Zmc2V0X3ZlY3RvciA9PSBOVUxMKSByZXR1cm4gUENSRV9FUlJPUl9OT01FTU9SWTsKICB1c2luZ190ZW1wb3Jhcnlfb2Zmc2V0cyA9IFRSVUU7CiAgRFBSSU5URigoIkdvdCBtZW1vcnkgdG8gaG9sZCBiYWNrIHJlZmVyZW5jZXNcbiIpKTsKICB9CmVsc2UgbWF0Y2hfYmxvY2sub2Zmc2V0X3ZlY3RvciA9IG9mZnNldHM7CgptYXRjaF9ibG9jay5vZmZzZXRfZW5kID0gb2NvdW50OwptYXRjaF9ibG9jay5vZmZzZXRfbWF4ID0gKDIqb2NvdW50KS8zOwptYXRjaF9ibG9jay5vZmZzZXRfb3ZlcmZsb3cgPSBGQUxTRTsKbWF0Y2hfYmxvY2suY2FwdHVyZV9sYXN0ID0gLTE7CgovKiBDb21wdXRlIHRoZSBtaW5pbXVtIG51bWJlciBvZiBvZmZzZXRzIHRoYXQgd2UgbmVlZCB0byByZXNldCBlYWNoIHRpbWUuIERvaW5nCnRoaXMgbWFrZXMgYSBodWdlIGRpZmZlcmVuY2UgdG8gZXhlY3V0aW9uIHRpbWUgd2hlbiB0aGVyZSBhcmVuJ3QgbWFueSBicmFja2V0cwppbiB0aGUgcGF0dGVybi4gKi8KCnJlc2V0Y291bnQgPSAyICsgcmUtPnRvcF9icmFja2V0ICogMjsKaWYgKHJlc2V0Y291bnQgPiBvZmZzZXRjb3VudCkgcmVzZXRjb3VudCA9IG9jb3VudDsKCi8qIFJlc2V0IHRoZSB3b3JraW5nIHZhcmlhYmxlIGFzc29jaWF0ZWQgd2l0aCBlYWNoIGV4dHJhY3Rpb24uIFRoZXNlIHNob3VsZApuZXZlciBiZSB1c2VkIHVubGVzcyBwcmV2aW91c2x5IHNldCwgYnV0IHRoZXkgZ2V0IHNhdmVkIGFuZCByZXN0b3JlZCwgYW5kIHNvIHdlCmluaXRpYWxpemUgdGhlbSB0byBhdm9pZCByZWFkaW5nIHVuaW5pdGlhbGl6ZWQgbG9jYXRpb25zLiAqLwoKaWYgKG1hdGNoX2Jsb2NrLm9mZnNldF92ZWN0b3IgIT0gTlVMTCkKICB7CiAgcmVnaXN0ZXIgaW50ICppcHRyID0gbWF0Y2hfYmxvY2sub2Zmc2V0X3ZlY3RvciArIG9jb3VudDsKICByZWdpc3RlciBpbnQgKmllbmQgPSBpcHRyIC0gcmVzZXRjb3VudC8yICsgMTsKICB3aGlsZSAoLS1pcHRyID49IGllbmQpICppcHRyID0gLTE7CiAgfQoKLyogU2V0IHVwIHRoZSBmaXJzdCBjaGFyYWN0ZXIgdG8gbWF0Y2gsIGlmIGF2YWlsYWJsZS4gVGhlIGZpcnN0X2J5dGUgdmFsdWUgaXMKbmV2ZXIgc2V0IGZvciBhbiBhbmNob3JlZCByZWd1bGFyIGV4cHJlc3Npb24sIGJ1dCB0aGUgYW5jaG9yaW5nIG1heSBiZSBmb3JjZWQKYXQgcnVuIHRpbWUsIHNvIHdlIGhhdmUgdG8gdGVzdCBmb3IgYW5jaG9yaW5nLiBUaGUgZmlyc3QgY2hhciBtYXkgYmUgdW5zZXQgZm9yCmFuIHVuYW5jaG9yZWQgcGF0dGVybiwgb2YgY291cnNlLiBJZiB0aGVyZSdzIG5vIGZpcnN0IGNoYXIgYW5kIHRoZSBwYXR0ZXJuIHdhcwpzdHVkaWVkLCB0aGVyZSBtYXkgYmUgYSBiaXRtYXAgb2YgcG9zc2libGUgZmlyc3QgY2hhcmFjdGVycy4gKi8KCmlmICghYW5jaG9yZWQpCiAgewogIGlmICgocmUtPm9wdGlvbnMgJiBQQ1JFX0ZJUlNUU0VUKSAhPSAwKQogICAgewogICAgZmlyc3RfYnl0ZSA9IHJlLT5maXJzdF9ieXRlICYgMjU1OwogICAgaWYgKChmaXJzdF9ieXRlX2Nhc2VsZXNzID0gKChyZS0+Zmlyc3RfYnl0ZSAmIFJFUV9DQVNFTEVTUykgIT0gMCkpID09IFRSVUUpCiAgICAgIGZpcnN0X2J5dGUgPSBtYXRjaF9ibG9jay5sY2NbZmlyc3RfYnl0ZV07CiAgICB9CiAgZWxzZQogICAgaWYgKCFzdGFydGxpbmUgJiYgc3R1ZHkgIT0gTlVMTCAmJgogICAgICAoc3R1ZHktPm9wdGlvbnMgJiBQQ1JFX1NUVURZX01BUFBFRCkgIT0gMCkKICAgICAgICBzdGFydF9iaXRzID0gc3R1ZHktPnN0YXJ0X2JpdHM7CiAgfQoKLyogRm9yIGFuY2hvcmVkIG9yIHVuYW5jaG9yZWQgbWF0Y2hlcywgdGhlcmUgbWF5IGJlIGEgImxhc3Qga25vd24gcmVxdWlyZWQKY2hhcmFjdGVyIiBzZXQuICovCgppZiAoKHJlLT5vcHRpb25zICYgUENSRV9SRVFDSFNFVCkgIT0gMCkKICB7CiAgcmVxX2J5dGUgPSByZS0+cmVxX2J5dGUgJiAyNTU7CiAgcmVxX2J5dGVfY2FzZWxlc3MgPSAocmUtPnJlcV9ieXRlICYgUkVRX0NBU0VMRVNTKSAhPSAwOwogIHJlcV9ieXRlMiA9ICh0YWJsZXMgKyBmY2Nfb2Zmc2V0KVtyZXFfYnl0ZV07ICAvKiBjYXNlIGZsaXBwZWQgKi8KICB9CgovKiBMb29wIGZvciBoYW5kbGluZyB1bmFuY2hvcmVkIHJlcGVhdGVkIG1hdGNoaW5nIGF0dGVtcHRzOyBmb3IgYW5jaG9yZWQgcmVnZXhzCnRoZSBsb29wIHJ1bnMganVzdCBvbmNlLiAqLwoKZG8KICB7CiAgLyogUmVzZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGV4dHJhY3Rpb25zIHdlIG1pZ2h0IHNlZS4gKi8KCiAgaWYgKG1hdGNoX2Jsb2NrLm9mZnNldF92ZWN0b3IgIT0gTlVMTCkKICAgIHsKICAgIHJlZ2lzdGVyIGludCAqaXB0ciA9IG1hdGNoX2Jsb2NrLm9mZnNldF92ZWN0b3I7CiAgICByZWdpc3RlciBpbnQgKmllbmQgPSBpcHRyICsgcmVzZXRjb3VudDsKICAgIHdoaWxlIChpcHRyIDwgaWVuZCkgKmlwdHIrKyA9IC0xOwogICAgfQoKICAvKiBBZHZhbmNlIHRvIGEgdW5pcXVlIGZpcnN0IGNoYXIgaWYgcG9zc2libGUgKi8KCiAgaWYgKGZpcnN0X2J5dGUgPj0gMCkKICAgIHsKICAgIGlmIChmaXJzdF9ieXRlX2Nhc2VsZXNzKQogICAgICB3aGlsZSAoc3RhcnRfbWF0Y2ggPCBlbmRfc3ViamVjdCAmJgogICAgICAgICAgICAgbWF0Y2hfYmxvY2subGNjWypzdGFydF9tYXRjaF0gIT0gZmlyc3RfYnl0ZSkKICAgICAgICBzdGFydF9tYXRjaCsrOwogICAgZWxzZQogICAgICB3aGlsZSAoc3RhcnRfbWF0Y2ggPCBlbmRfc3ViamVjdCAmJiAqc3RhcnRfbWF0Y2ggIT0gZmlyc3RfYnl0ZSkKICAgICAgICBzdGFydF9tYXRjaCsrOwogICAgfQoKICAvKiBPciB0byBqdXN0IGFmdGVyIFxuIGZvciBhIG11bHRpbGluZSBtYXRjaCBpZiBwb3NzaWJsZSAqLwoKICBlbHNlIGlmIChzdGFydGxpbmUpCiAgICB7CiAgICBpZiAoc3RhcnRfbWF0Y2ggPiBtYXRjaF9ibG9jay5zdGFydF9zdWJqZWN0ICsgc3RhcnRfb2Zmc2V0KQogICAgICB7CiAgICAgIHdoaWxlIChzdGFydF9tYXRjaCA8IGVuZF9zdWJqZWN0ICYmIHN0YXJ0X21hdGNoWy0xXSAhPSBORVdMSU5FKQogICAgICAgIHN0YXJ0X21hdGNoKys7CiAgICAgIH0KICAgIH0KCiAgLyogT3IgdG8gYSBub24tdW5pcXVlIGZpcnN0IGNoYXIgYWZ0ZXIgc3R1ZHkgKi8KCiAgZWxzZSBpZiAoc3RhcnRfYml0cyAhPSBOVUxMKQogICAgewogICAgd2hpbGUgKHN0YXJ0X21hdGNoIDwgZW5kX3N1YmplY3QpCiAgICAgIHsKICAgICAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGMgPSAqc3RhcnRfbWF0Y2g7CiAgICAgIGlmICgoc3RhcnRfYml0c1tjLzhdICYgKDEgPDwgKGMmNykpKSA9PSAwKSBzdGFydF9tYXRjaCsrOyBlbHNlIGJyZWFrOwogICAgICB9CiAgICB9CgojaWZkZWYgREVCVUcgIC8qIFNpZ2guIFNvbWUgY29tcGlsZXJzIG5ldmVyIGxlYXJuLiAqLwogIHByaW50ZigiPj4+PiBNYXRjaCBhZ2FpbnN0OiAiKTsKICBwY2hhcnMoc3RhcnRfbWF0Y2gsIGVuZF9zdWJqZWN0IC0gc3RhcnRfbWF0Y2gsIFRSVUUsICZtYXRjaF9ibG9jayk7CiAgcHJpbnRmKCJcbiIpOwojZW5kaWYKCiAgLyogSWYgcmVxX2J5dGUgaXMgc2V0LCB3ZSBrbm93IHRoYXQgdGhhdCBjaGFyYWN0ZXIgbXVzdCBhcHBlYXIgaW4gdGhlIHN1YmplY3QKICBmb3IgdGhlIG1hdGNoIHRvIHN1Y2NlZWQuIElmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaXMgc2V0LCByZXFfYnl0ZSBtdXN0IGJlCiAgbGF0ZXIgaW4gdGhlIHN1YmplY3Q7IG90aGVyd2lzZSB0aGUgdGVzdCBzdGFydHMgYXQgdGhlIG1hdGNoIHBvaW50LiBUaGlzCiAgb3B0aW1pemF0aW9uIGNhbiBzYXZlIGEgaHVnZSBhbW91bnQgb2YgYmFja3RyYWNraW5nIGluIHBhdHRlcm5zIHdpdGggbmVzdGVkCiAgdW5saW1pdGVkIHJlcGVhdHMgdGhhdCBhcmVuJ3QgZ29pbmcgdG8gbWF0Y2guIFdyaXRpbmcgc2VwYXJhdGUgY29kZSBmb3IKICBjYXNlZC9jYXNlbGVzcyB2ZXJzaW9ucyBtYWtlcyBpdCBnbyBmYXN0ZXIsIGFzIGRvZXMgdXNpbmcgYW4gYXV0b2luY3JlbWVudAogIGFuZCBiYWNraW5nIG9mZiBvbiBhIG1hdGNoLgoKICBIT1dFVkVSOiB3aGVuIHRoZSBzdWJqZWN0IHN0cmluZyBpcyB2ZXJ5LCB2ZXJ5IGxvbmcsIHNlYXJjaGluZyB0byBpdHMgZW5kIGNhbgogIHRha2UgYSBsb25nIHRpbWUsIGFuZCBnaXZlIGJhZCBwZXJmb3JtYW5jZSBvbiBxdWl0ZSBvcmRpbmFyeSBwYXR0ZXJucy4gVGhpcwogIHNob3dlZCB1cCB3aGVuIHNvbWVib2R5IHdhcyBtYXRjaGluZyAvXkMvIG9uIGEgMzItbWVnYWJ5dGUgc3RyaW5nLi4uIHNvIHdlCiAgZG9uJ3QgZG8gdGhpcyB3aGVuIHRoZSBzdHJpbmcgaXMgc3VmZmljaWVudGx5IGxvbmcuCgogIEFMU086IHRoaXMgcHJvY2Vzc2luZyBpcyBkaXNhYmxlZCB3aGVuIHBhcnRpYWwgbWF0Y2hpbmcgaXMgcmVxdWVzdGVkLgogICovCgogIGlmIChyZXFfYnl0ZSA+PSAwICYmCiAgICAgIGVuZF9zdWJqZWN0IC0gc3RhcnRfbWF0Y2ggPCBSRVFfQllURV9NQVggJiYKICAgICAgIW1hdGNoX2Jsb2NrLnBhcnRpYWwpCiAgICB7CiAgICByZWdpc3RlciBjb25zdCB1c2NoYXIgKnAgPSBzdGFydF9tYXRjaCArICgoZmlyc3RfYnl0ZSA+PSAwKT8gMSA6IDApOwoKICAgIC8qIFdlIGRvbid0IG5lZWQgdG8gcmVwZWF0IHRoZSBzZWFyY2ggaWYgd2UgaGF2ZW4ndCB5ZXQgcmVhY2hlZCB0aGUKICAgIHBsYWNlIHdlIGZvdW5kIGl0IGF0IGxhc3QgdGltZS4gKi8KCiAgICBpZiAocCA+IHJlcV9ieXRlX3B0cikKICAgICAgewogICAgICBpZiAocmVxX2J5dGVfY2FzZWxlc3MpCiAgICAgICAgewogICAgICAgIHdoaWxlIChwIDwgZW5kX3N1YmplY3QpCiAgICAgICAgICB7CiAgICAgICAgICByZWdpc3RlciBpbnQgcHAgPSAqcCsrOwogICAgICAgICAgaWYgKHBwID09IHJlcV9ieXRlIHx8IHBwID09IHJlcV9ieXRlMikgeyBwLS07IGJyZWFrOyB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICBlbHNlCiAgICAgICAgewogICAgICAgIHdoaWxlIChwIDwgZW5kX3N1YmplY3QpCiAgICAgICAgICB7CiAgICAgICAgICBpZiAoKnArKyA9PSByZXFfYnl0ZSkgeyBwLS07IGJyZWFrOyB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgLyogSWYgd2UgY2FuJ3QgZmluZCB0aGUgcmVxdWlyZWQgY2hhcmFjdGVyLCBicmVhayB0aGUgbWF0Y2hpbmcgbG9vcCAqLwoKICAgICAgaWYgKHAgPj0gZW5kX3N1YmplY3QpIGJyZWFrOwoKICAgICAgLyogSWYgd2UgaGF2ZSBmb3VuZCB0aGUgcmVxdWlyZWQgY2hhcmFjdGVyLCBzYXZlIHRoZSBwb2ludCB3aGVyZSB3ZQogICAgICBmb3VuZCBpdCwgc28gdGhhdCB3ZSBkb24ndCBzZWFyY2ggYWdhaW4gbmV4dCB0aW1lIHJvdW5kIHRoZSBsb29wIGlmCiAgICAgIHRoZSBzdGFydCBoYXNuJ3QgcGFzc2VkIHRoaXMgY2hhcmFjdGVyIHlldC4gKi8KCiAgICAgIHJlcV9ieXRlX3B0ciA9IHA7CiAgICAgIH0KICAgIH0KCiAgLyogV2hlbiBhIG1hdGNoIG9jY3Vycywgc3Vic3RyaW5ncyB3aWxsIGJlIHNldCBmb3IgYWxsIGludGVybmFsIGV4dHJhY3Rpb25zOwogIHdlIGp1c3QgbmVlZCB0byBzZXQgdXAgdGhlIHdob2xlIHRoaW5nIGFzIHN1YnN0cmluZyAwIGJlZm9yZSByZXR1cm5pbmcuIElmCiAgdGhlcmUgd2VyZSB0b28gbWFueSBleHRyYWN0aW9ucywgc2V0IHRoZSByZXR1cm4gY29kZSB0byB6ZXJvLiBJbiB0aGUgY2FzZQogIHdoZXJlIHdlIGhhZCB0byBnZXQgc29tZSBsb2NhbCBzdG9yZSB0byBob2xkIG9mZnNldHMgZm9yIGJhY2tyZWZlcmVuY2VzLCBjb3B5CiAgdGhvc2UgYmFjayByZWZlcmVuY2VzIHRoYXQgd2UgY2FuLiBJbiB0aGlzIGNhc2UgdGhlcmUgbmVlZCBub3QgYmUgb3ZlcmZsb3cKICBpZiBjZXJ0YWluIHBhcnRzIG9mIHRoZSBwYXR0ZXJuIHdlcmUgbm90IHVzZWQuICovCgogIG1hdGNoX2Jsb2NrLnN0YXJ0X21hdGNoID0gc3RhcnRfbWF0Y2g7CiAgbWF0Y2hfYmxvY2subWF0Y2hfY2FsbF9jb3VudCA9IDA7CgogIHJjID0gbWF0Y2goc3RhcnRfbWF0Y2gsIG1hdGNoX2Jsb2NrLnN0YXJ0X2NvZGUsIDIsICZtYXRjaF9ibG9jaywgaW1zLCBOVUxMLAogICAgbWF0Y2hfaXNncm91cCk7CgogIGlmIChyYyA9PSBNQVRDSF9OT01BVENIKQogICAgewogICAgc3RhcnRfbWF0Y2grKzsKI2lmZGVmIFNVUFBPUlRfVVRGOAogICAgaWYgKG1hdGNoX2Jsb2NrLnV0ZjgpCiAgICAgIHdoaWxlKHN0YXJ0X21hdGNoIDwgZW5kX3N1YmplY3QgJiYgKCpzdGFydF9tYXRjaCAmIDB4YzApID09IDB4ODApCiAgICAgICAgc3RhcnRfbWF0Y2grKzsKI2VuZGlmCiAgICBjb250aW51ZTsKICAgIH0KCiAgaWYgKHJjICE9IE1BVENIX01BVENIKQogICAgewogICAgRFBSSU5URigoIj4+Pj4gZXJyb3I6IHJldHVybmluZyAlZFxuIiwgcmMpKTsKICAgIHJldHVybiByYzsKICAgIH0KCiAgLyogV2UgaGF2ZSBhIG1hdGNoISBDb3B5IHRoZSBvZmZzZXQgaW5mb3JtYXRpb24gZnJvbSB0ZW1wb3Jhcnkgc3RvcmUgaWYKICBuZWNlc3NhcnkgKi8KCiAgaWYgKHVzaW5nX3RlbXBvcmFyeV9vZmZzZXRzKQogICAgewogICAgaWYgKG9mZnNldGNvdW50ID49IDQpCiAgICAgIHsKICAgICAgbWVtY3B5KG9mZnNldHMgKyAyLCBtYXRjaF9ibG9jay5vZmZzZXRfdmVjdG9yICsgMiwKICAgICAgICAob2Zmc2V0Y291bnQgLSAyKSAqIHNpemVvZihpbnQpKTsKICAgICAgRFBSSU5URigoIkNvcGllZCBvZmZzZXRzIGZyb20gdGVtcG9yYXJ5IG1lbW9yeVxuIikpOwogICAgICB9CiAgICBpZiAobWF0Y2hfYmxvY2suZW5kX29mZnNldF90b3AgPiBvZmZzZXRjb3VudCkKICAgICAgbWF0Y2hfYmxvY2sub2Zmc2V0X292ZXJmbG93ID0gVFJVRTsKCiAgICBEUFJJTlRGKCgiRnJlZWluZyB0ZW1wb3JhcnkgbWVtb3J5XG4iKSk7CiAgICAocGNyZV9mcmVlKShtYXRjaF9ibG9jay5vZmZzZXRfdmVjdG9yKTsKICAgIH0KCiAgcmMgPSBtYXRjaF9ibG9jay5vZmZzZXRfb3ZlcmZsb3c/IDAgOiBtYXRjaF9ibG9jay5lbmRfb2Zmc2V0X3RvcC8yOwoKICBpZiAob2Zmc2V0Y291bnQgPCAyKSByYyA9IDA7IGVsc2UKICAgIHsKICAgIG9mZnNldHNbMF0gPSBzdGFydF9tYXRjaCAtIG1hdGNoX2Jsb2NrLnN0YXJ0X3N1YmplY3Q7CiAgICBvZmZzZXRzWzFdID0gbWF0Y2hfYmxvY2suZW5kX21hdGNoX3B0ciAtIG1hdGNoX2Jsb2NrLnN0YXJ0X3N1YmplY3Q7CiAgICB9CgogIERQUklOVEYoKCI+Pj4+IHJldHVybmluZyAlZFxuIiwgcmMpKTsKICByZXR1cm4gcmM7CiAgfQoKLyogVGhpcyAid2hpbGUiIGlzIHRoZSBlbmQgb2YgdGhlICJkbyIgYWJvdmUgKi8KCndoaWxlICghYW5jaG9yZWQgJiYgc3RhcnRfbWF0Y2ggPD0gZW5kX3N1YmplY3QpOwoKaWYgKHVzaW5nX3RlbXBvcmFyeV9vZmZzZXRzKQogIHsKICBEUFJJTlRGKCgiRnJlZWluZyB0ZW1wb3JhcnkgbWVtb3J5XG4iKSk7CiAgKHBjcmVfZnJlZSkobWF0Y2hfYmxvY2sub2Zmc2V0X3ZlY3Rvcik7CiAgfQoKaWYgKG1hdGNoX2Jsb2NrLnBhcnRpYWwgJiYgbWF0Y2hfYmxvY2suaGl0ZW5kKQogIHsKICBEUFJJTlRGKCgiPj4+PiByZXR1cm5pbmcgUENSRV9FUlJPUl9QQVJUSUFMXG4iKSk7CiAgcmV0dXJuIFBDUkVfRVJST1JfUEFSVElBTDsKICB9CmVsc2UKICB7CiAgRFBSSU5URigoIj4+Pj4gcmV0dXJuaW5nIFBDUkVfRVJST1JfTk9NQVRDSFxuIikpOwogIHJldHVybiBQQ1JFX0VSUk9SX05PTUFUQ0g7CiAgfQp9CgovKiBFbmQgb2YgcGNyZS5jICovCg==