LyoKICogQ29weXJpZ2h0IChDKSAxOTk4LTE5OTkgRnJhbudvaXMgR291Z2V0CiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KCiNpbmNsdWRlIDxycGMuaD4KI2luY2x1ZGUgPHJwY25kci5oPgoKI2lmbmRlZiBfT0JKQkFTRV9IXwojZGVmaW5lIF9PQkpCQVNFX0hfCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogTWFjcm9zIHRvIGRlZmluZSBhIENPTSBpbnRlcmZhY2UKICovCi8qCiAqIFRoZSBnb2FsIG9mIHRoZSBmb2xsb3dpbmcgc2V0IG9mIGRlZmluaXRpb25zIGlzIHRvIHByb3ZpZGUgYSB3YXkgdG8gdXNlIHRoZSBzYW1lCiAqIGhlYWRlciBmaWxlIGRlZmluaXRpb25zIHRvIHByb3ZpZGUgYm90aCBhIEMgaW50ZXJmYWNlIGFuZCBhIEMrKyBvYmplY3Qgb3JpZW50ZWQKICogaW50ZXJmYWNlIHRvIENPTSBpbnRlcmZhY2VzLiBUaGUgdHlwZSBvZiBpbnRlcmZhY2UgaXMgc2VsZWN0ZWQgYXV0b21hdGljYWxseQogKiBkZXBlbmRpbmcgb24gdGhlIGxhbmd1YWdlIGJ1dCBpdCBpcyBhbHdheXMgcG9zc2libGUgdG8gZ2V0IHRoZSBDIGludGVyZmFjZSBpbiBDKysKICogYnkgZGVmaW5pbmcgQ0lOVEVSRkFDRS4KICoKICogSXQgaXMgYmFzZWQgb24gdGhlIGZvbGxvd2luZyBhc3N1bXB0aW9uczoKICogIC0gYWxsIENPTSBpbnRlcmZhY2VzIGRlcml2ZSBmcm9tIElVbmtub3duLCB0aGlzIHNob3VsZCBub3QgYmUgYSBwcm9ibGVtLgogKiAgLSB0aGUgaGVhZGVyIGZpbGUgb25seSBkZWZpbmVzIHRoZSBpbnRlcmZhY2UsIHRoZSBhY3R1YWwgZmllbGRzIGFyZSBkZWZpbmVkCiAqICAgIHNlcGFyYXRlbHkgaW4gdGhlIEMgZmlsZSBpbXBsZW1lbnRpbmcgdGhlIGludGVyZmFjZS4KICoKICogVGhlIG5hdHVyYWwgYXBwcm9hY2ggdG8gdGhpcyBwcm9ibGVtIHdvdWxkIGJlIHRvIG1ha2Ugc3VyZSB3ZSBnZXQgYSBDKysgY2xhc3MgYW5kCiAqIHZpcnR1YWwgbWV0aG9kcyBpbiBDKysgYW5kIGEgc3RydWN0dXJlIHdpdGggYSB0YWJsZSBvZiBwb2ludGVyIHRvIGZ1bmN0aW9ucyBpbiBDLgogKiBVbmZvcnR1bmF0ZWx5IHRoZSBsYXlvdXQgb2YgdGhlIHZpcnR1YWwgdGFibGUgaXMgY29tcGlsZXIgc3BlY2lmaWMsIHRoZSBsYXlvdXQgb2YKICogZysrIHZpcnR1YWwgdGFibGVzIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGF0IG9mIGFuIGVnY3MgdmlydHVhbCB0YWJsZSB3aGljaCBpcyBub3QgdGhlCiAqIHNhbWUgYXMgdGhhdCBnZW5lcmF0ZWQgYnkgVmlzdWFsIEMrLiBUaGVyZSBhcmUgd29ya2Fyb3VuZHMgdG8gbWFrZSB0aGUgdmlydHVhbCB0YWJsZXMKICogY29tcGF0aWJsZSB2aWEgcGFkZGluZyBidXQgdW5mb3J0dW5hdGVseSB0aGUgb25lIHdoaWNoIGlzIGltcG9zZWQgdG8gdGhlIFdJTkUgZW11bGF0b3IKICogYnkgdGhlIFdpbmRvd3MgYmluYXJpZXMsIGkuZS4gdGhlIFZpc3VhbCBDKysgb25lLCBpcyB0aGUgbW9zdCBjb21wYWN0IG9mIGFsbC4KICoKICogU28gdGhlIHNvbHV0aW9uIEkgZmluYWxseSBhZG9wdGVkIGRvZXMgbm90IHVzZSB2aXJ0dWFsIHRhYmxlcy4gSW5zdGVhZCBJIHVzZSBpbmxpbmUKICogbm9uIHZpcnR1YWwgbWV0aG9kcyB0aGF0IGRlcmVmZXJlbmNlIHRoZSBtZXRob2QgcG9pbnRlciB0aGVtc2VsdmVzIGFuZCBwZXJmb3JtIHRoZSBjYWxsLgogKgogKiBMZXQncyB0YWtlIERpcmVjdDNEIGFzIGFuIGV4YW1wbGU6CiAqCiAqICAgICNkZWZpbmUgSU5URVJGQUNFIElEaXJlY3QzRAogKiAgICBERUNMQVJFX0lOVEVSRkFDRV8oSURpcmVjdDNELElVbmtub3duKQogKiAgICB7CiAqICAgICAgICAvLyAqKiogSVVua25vd24gbWV0aG9kcyAqKiogLy8KICogICAgICAgIFNURE1FVEhPRF8oSFJFU1VMVCxRdWVyeUludGVyZmFjZSkoVEhJU18gUkVGSUlELCB2b2lkKiopIFBVUkU7CiAqICAgICAgICBTVERNRVRIT0RfKFVMT05HLEFkZFJlZikoVEhJUykgUFVSRTsKICogICAgICAgIFNURE1FVEhPRF8oVUxPTkcsUmVsZWFzZSkoVEhJUykgUFVSRTsKICogICAgICAgIC8vICoqKiBJRGlyZWN0M0QgbWV0aG9kcyAqKiogLy8KICogICAgICAgIFNURE1FVEhPRChJbml0aWFsaXplKShUSElTXyBSRUZJSUQpIFBVUkU7CiAqICAgICAgICBTVERNRVRIT0QoRW51bURldmljZXMpKFRISVNfIExQRDNERU5VTURFVklDRVNDQUxMQkFDSywgTFBWT0lEKSBQVVJFOwogKiAgICAgICAgU1RETUVUSE9EKENyZWF0ZUxpZ2h0KShUSElTXyBMUERJUkVDVDNETElHSFQgKiwgSVVua25vd24gKikgUFVSRTsKICogICAgICAgIFNURE1FVEhPRChDcmVhdGVNYXRlcmlhbCkoVEhJU18gTFBESVJFQ1QzRE1BVEVSSUFMICosIElVbmtub3duICopIFBVUkU7CiAqICAgICAgICBTVERNRVRIT0QoQ3JlYXRlVmlld3BvcnQpKFRISVNfIExQRElSRUNUM0RWSUVXUE9SVCAqLCBJVW5rbm93biAqKSBQVVJFOwogKiAgICAgICAgU1RETUVUSE9EKEZpbmREZXZpY2UpKFRISVNfIExQRDNERklORERFVklDRVNFQVJDSCwgTFBEM0RGSU5EREVWSUNFUkVTVUxUKSBQVVJFOwogKiAgICB9OwogKiAgICAjdW5kZWYgSU5URVJGQUNFCiAqCiAqICAgICNpZmRlZiBDT0JKTUFDUk9TCiAqICAgIC8vICoqKiBJVW5rbm93biBtZXRob2RzICoqKiAvLwogKiAgICAjZGVmaW5lIElEaXJlY3QzRF9RdWVyeUludGVyZmFjZShwLGEsYikgKHApLT5scFZ0YmwtPlF1ZXJ5SW50ZXJmYWNlKHAsYSxiKQogKiAgICAjZGVmaW5lIElEaXJlY3QzRF9BZGRSZWYocCkgICAgICAgICAgICAgKHApLT5scFZ0YmwtPkFkZFJlZihwKQogKiAgICAjZGVmaW5lIElEaXJlY3QzRF9SZWxlYXNlKHApICAgICAgICAgICAgKHApLT5scFZ0YmwtPlJlbGVhc2UocCkKICogICAgLy8gKioqIElEaXJlY3QzRCBtZXRob2RzICoqKiAvLwogKiAgICAjZGVmaW5lIElEaXJlY3QzRF9Jbml0aWFsaXplKHAsYSkgICAgICAgKHApLT5scFZ0YmwtPkluaXRpYWxpemUocCxhKQogKiAgICAjZGVmaW5lIElEaXJlY3QzRF9FbnVtRGV2aWNlcyhwLGEsYikgICAgKHApLT5scFZ0YmwtPkVudW1EZXZpY2UocCxhLGIpCiAqICAgICNkZWZpbmUgSURpcmVjdDNEX0NyZWF0ZUxpZ2h0KHAsYSxiKSAgICAocCktPmxwVnRibC0+Q3JlYXRlTGlnaHQocCxhLGIpCiAqICAgICNkZWZpbmUgSURpcmVjdDNEX0NyZWF0ZU1hdGVyaWFsKHAsYSxiKSAocCktPmxwVnRibC0+Q3JlYXRlTWF0ZXJpYWwocCxhLGIpCiAqICAgICNkZWZpbmUgSURpcmVjdDNEX0NyZWF0ZVZpZXdwb3J0KHAsYSxiKSAocCktPmxwVnRibC0+Q3JlYXRlVmlld3BvcnQocCxhLGIpCiAqICAgICNkZWZpbmUgSURpcmVjdDNEX0ZpbmREZXZpY2UocCxhLGIpICAgICAocCktPmxwVnRibC0+RmluZERldmljZShwLGEsYikKICogICAgI2VuZGlmCiAqCiAqIENvbW1lbnRzOgogKiAgLSBUaGUgSU5URVJGQUNFIG1hY3JvIGlzIHVzZWQgaW4gdGhlIFNURE1FVEhPRCBtYWNyb3MgdG8gZGVmaW5lIHRoZSB0eXBlIG9mIHRoZSAndGhpcycKICogICAgcG9pbnRlci4gRGVmaW5pbmcgdGhpcyBtYWNybyBoZXJlIHNhdmVzIHVzIHRoZSB0cm91YmxlIG9mIGhhdmluZyB0byByZXBlYXQgdGhlIGludGVyZmFjZQogKiAgICBuYW1lIGV2ZXJ5d2hlcmUuIE5vdGUgaG93ZXZlciB0aGF0IGJlY2F1c2Ugb2YgdGhlIHdheSBtYWNyb3Mgd29yaywgYSBtYWNybyBsaWtlIFNURE1FVEhPRAogKiAgICBjYW5ub3QgdXNlICdJTlRFUkZBQ0UjI19WVEFCTEUnIGJlY2F1c2UgdGhpcyB3b3VsZCBnaXZlICdJTlRFUkZBQ0VfVlRBQkxFJyBhbmQgbm90CiAqICAgICdJRGlyZWN0M0RfVlRBQkxFJy4KICogIC0gVGhlIERFQ0xBUkVfSU5URVJGQUNFIGRlY2xhcmVzIGFsbCB0aGUgc3RydWN0dXJlcyBuZWNlc3NhcnkgZm9yIHRoZSBpbnRlcmZhY2UuIFdlIGhhdmUgdG8KICogICAgZXhwbGljaXRseSB1c2UgdGhlIGludGVyZmFjZSBuYW1lIGZvciBtYWNybyBleHBhbnNpb24gcmVhc29ucyBhZ2Fpbi4gSXQgZGVmaW5lcyB0aGUgbGlzdCBvZgogKiAgICBtZXRob2RzIHRoYXQgYXJlIGluaGVyaXRhYmxlIGZyb20gdGhpcyBpbnRlcmZhY2UuIEl0IG11c3QgYmUgd3JpdHRlbiBtYW51YWxseSAocmF0aGVyIHRoYW4KICogICAgdXNpbmcgYSBtYWNybyB0byBnZW5lcmF0ZSB0aGUgZXF1aXZhbGVudCBjb2RlKSB0byBhdm9pZCBtYWNybyByZWN1cnNpb24gKHdoaWNoIGNvbXBpbGVycwogKiAgICBkb24ndCBsaWtlKS4gSXQgbXVzdCBzdGFydCB3aXRoIHRoZSBtZXRob2RzIGRlZmluaXRpb24gb2YgdGhlIHBhcmVudCBpbnRlcmZhY2Ugc28gdGhhdAogKiAgICBtZXRob2QgaW5oZXJpdGFuY2Ugd29ya3MgcHJvcGVybHkuCiAqICAtIFRoZSAndW5kZWYgSU5URVJGQUNFJyBpcyBoZXJlIHRvIHJlbWluZCB5b3UgdGhhdCB1c2luZyBJTlRFUkZBQ0UgaW4gdGhlIGZvbGxvd2luZyBtYWNyb3MKICogICAgd2lsbCBub3Qgd29yay4KICogIC0gRmluYWxseSB0aGUgc2V0IG9mICdJRGlyZWN0M0RfWHh4JyBtYWNyb3MgaXMgYSBzdGFuZGFyZCBzZXQgb2YgbWFjcm9zIGRlZmluZWQgdG8gZWFzZSBhY2Nlc3MKICogICAgdG8gdGhlIGludGVyZmFjZSBtZXRob2RzIGluIEMuIFVuZm9ydHVuYXRlbHkgSSBkb24ndCBzZWUgYW55IHdheSB0byBhdm9pZCBoYXZpbmcgdG8gZHVwbGljYXRlCiAqICAgIHRoZSBpbmhlcml0ZWQgbWV0aG9kIGRlZmluaXRpb25zIHRoZXJlLiBUaGlzIHRpbWUgSSBjb3VsZCBoYXZlIHVzZWQgYSB0cmljayB0byB1c2Ugb25seSBvbmUKICogICAgbWFjcm8gd2hhdGV2ZXIgdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIGJ1dCBJIHByZWZlcnJlZCB0byBoYXZlIGl0IHdvcmsgdGhlIHNhbWUgd2F5IGFzIGFib3ZlLgogKiAgLSBZb3UgcHJvYmFibHkgaGF2ZSBub3RpY2VkIHRoYXQgd2UgZG9uJ3QgZGVmaW5lIHRoZSBmaWVsZHMgd2UgbmVlZCB0byBhY3R1YWxseSBpbXBsZW1lbnQgdGhpcwogKiAgICBpbnRlcmZhY2U6IHJlZmVyZW5jZSBjb3VudCwgcG9pbnRlciB0byBvdGhlciByZXNvdXJjZXMgYW5kIG1pc2NlbGxhbmVvdXMgZmllbGRzLiBUaGF0J3MKICogICAgYmVjYXVzZSB0aGVzZSBpbnRlcmZhY2VzIGFyZSBqdXN0IHRoYXQ6IGludGVyZmFjZXMuIFRoZXkgbWF5IGJlIGltcGxlbWVudGVkIG1vcmUgdGhhbiBvbmNlLCBpbgogKiAgICBkaWZmZXJlbnQgY29udGV4dHMgYW5kIHNvbWV0aW1lcyBub3QgZXZlbiBpbiBXaW5lLiBUaHVzIGl0IHdvdWxkIG5vdCBtYWtlIHNlbnNlIHRvIGltcG9zZQogKiAgICB0aGF0IHRoZSBpbnRlcmZhY2UgY29udGFpbnMgc29tZSBzcGVjaWZpYyBmaWVsZHMuCiAqCiAqCiAqIEluIEMgdGhpcyBnaXZlczoKICogICAgdHlwZWRlZiBzdHJ1Y3QgSURpcmVjdDNEVnRibCBJRGlyZWN0M0RWdGJsOwogKiAgICBzdHJ1Y3QgSURpcmVjdDNEIHsKICogICAgICAgIElEaXJlY3QzRFZ0YmwqIGxwVnRibDsKICogICAgfTsKICogICAgc3RydWN0IElEaXJlY3QzRFZ0YmwgewogKiAgICAgICAgSFJFU1VMVCAoKlF1ZXJ5SW50ZXJmYWNlKShJRGlyZWN0M0QqIG1lLCBSRUZJSUQgcmlpZCwgTFBWT0lEKiBwcHZPYmopOwogKiAgICAgICAgVUxPTkcgKCpRdWVyeUludGVyZmFjZSkoSURpcmVjdDNEKiBtZSk7CiAqICAgICAgICBVTE9ORyAoKlF1ZXJ5SW50ZXJmYWNlKShJRGlyZWN0M0QqIG1lKTsKICogICAgICAgIEhSRVNVTFQgKCpJbml0aWFsaXplKShJRGlyZWN0M0QqIG1lLCBSRUZJSUQgYSk7CiAqICAgICAgICBIUkVTVUxUICgqRW51bURldmljZXMpKElEaXJlY3QzRCogbWUsIExQRDNERU5VTURFVklDRVNDQUxMQkFDSyBhLCBMUFZPSUQgYik7CiAqICAgICAgICBIUkVTVUxUICgqQ3JlYXRlTGlnaHQpKElEaXJlY3QzRCogbWUsIExQRElSRUNUM0RMSUdIVCogYSwgSVVua25vd24qIGIpOwogKiAgICAgICAgSFJFU1VMVCAoKkNyZWF0ZU1hdGVyaWFsKShJRGlyZWN0M0QqIG1lLCBMUERJUkVDVDNETUFURVJJQUwqIGEsIElVbmtub3duKiBiKTsKICogICAgICAgIEhSRVNVTFQgKCpDcmVhdGVWaWV3cG9ydCkoSURpcmVjdDNEKiBtZSwgTFBESVJFQ1QzRFZJRVdQT1JUKiBhLCBJVW5rbm93biogYik7CiAqICAgICAgICBIUkVTVUxUICgqRmluZERldmljZSkoSURpcmVjdDNEKiBtZSwgTFBEM0RGSU5EREVWSUNFU0VBUkNIIGEsIExQRDNERklORERFVklDRVJFU1VMVCBiKTsKICogICAgfTsKICoKICogICAgI2lmZGVmIENPQkpNQUNST1MKICogICAgLy8gKioqIElVbmtub3duIG1ldGhvZHMgKioqIC8vCiAqICAgICNkZWZpbmUgSURpcmVjdDNEX1F1ZXJ5SW50ZXJmYWNlKHAsYSxiKSAocCktPmxwVnRibC0+UXVlcnlJbnRlcmZhY2UocCxhLGIpCiAqICAgICNkZWZpbmUgSURpcmVjdDNEX0FkZFJlZihwKSAgICAgICAgICAgICAocCktPmxwVnRibC0+QWRkUmVmKHApCiAqICAgICNkZWZpbmUgSURpcmVjdDNEX1JlbGVhc2UocCkgICAgICAgICAgICAocCktPmxwVnRibC0+UmVsZWFzZShwKQogKiAgICAvLyAqKiogSURpcmVjdDNEIG1ldGhvZHMgKioqIC8vCiAqICAgICNkZWZpbmUgSURpcmVjdDNEX0luaXRpYWxpemUocCxhKSAgICAgICAocCktPmxwVnRibC0+SW5pdGlhbGl6ZShwLGEpCiAqICAgICNkZWZpbmUgSURpcmVjdDNEX0VudW1EZXZpY2VzKHAsYSxiKSAgICAocCktPmxwVnRibC0+RW51bURldmljZShwLGEsYikKICogICAgI2RlZmluZSBJRGlyZWN0M0RfQ3JlYXRlTGlnaHQocCxhLGIpICAgIChwKS0+bHBWdGJsLT5DcmVhdGVMaWdodChwLGEsYikKICogICAgI2RlZmluZSBJRGlyZWN0M0RfQ3JlYXRlTWF0ZXJpYWwocCxhLGIpIChwKS0+bHBWdGJsLT5DcmVhdGVNYXRlcmlhbChwLGEsYikKICogICAgI2RlZmluZSBJRGlyZWN0M0RfQ3JlYXRlVmlld3BvcnQocCxhLGIpIChwKS0+bHBWdGJsLT5DcmVhdGVWaWV3cG9ydChwLGEsYikKICogICAgI2RlZmluZSBJRGlyZWN0M0RfRmluZERldmljZShwLGEsYikgICAgIChwKS0+bHBWdGJsLT5GaW5kRGV2aWNlKHAsYSxiKQogKiAgICAjZW5kaWYKICoKICogQ29tbWVudHM6CiAqICAtIElEaXJlY3QzRCBvbmx5IGNvbnRhaW5zIGEgcG9pbnRlciB0byB0aGUgSURpcmVjdDNEIHZpcnR1YWwvanVtcCB0YWJsZS4gVGhpcyBpcyB0aGUgb25seSB0aGluZwogKiAgICB0aGUgdXNlciBuZWVkcyB0byBrbm93IHRvIHVzZSB0aGUgaW50ZXJmYWNlLiBPZiBjb3Vyc2UgdGhlIHN0cnVjdHVyZSB3ZSB3aWxsIGRlZmluZSB0bwogKiAgICBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2Ugd2lsbCBoYXZlIG1vcmUgZmllbGRzIGJ1dCB0aGUgZmlyc3Qgb25lIHdpbGwgbWF0Y2ggdGhpcyBwb2ludGVyLgogKiAgLSBUaGUgY29kZSBnZW5lcmF0ZWQgYnkgREVDTEFSRV9JTlRFUkZBQ0UgZGVmaW5lcyBib3RoIHRoZSBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIHRoZSBpbnRlcmZhY2UgYW5kCiAqICAgIHRoZSBzdHJ1Y3R1cmUgZm9yIHRoZSBqdW1wIHRhYmxlLgogKiAgLSBFYWNoIG1ldGhvZCBpcyBkZWNsYXJlZCBhcyBhIHBvaW50ZXIgdG8gZnVuY3Rpb24gZmllbGQgaW4gdGhlIGp1bXAgdGFibGUuIFRoZSBpbXBsZW1lbnRhdGlvbgogKiAgICB3aWxsIGZpbGwgdGhpcyBqdW1wIHRhYmxlIHdpdGggYXBwcm9wcmlhdGUgdmFsdWVzLCBwcm9iYWJseSB1c2luZyBhIHN0YXRpYyB2YXJpYWJsZSwgYW5kCiAqICAgIGluaXRpYWxpemUgdGhlIGxwVnRibCBmaWVsZCB0byBwb2ludCB0byB0aGlzIHZhcmlhYmxlLgogKiAgLSBUaGUgSURpcmVjdDNEX1h4eCBtYWNyb3MgdGhlbiBqdXN0IGRlcmVmZW5jZSB0aGUgbHBWdGJsIHBvaW50ZXIgYW5kIHVzZSB0aGUgZnVuY3Rpb24gcG9pbnRlcgogKiAgICBjb3JyZXNwb25kaW5nIHRvIHRoZSBtYWNybyBuYW1lLiBUaGlzIGVtdWxhdGVzIHRoZSBiZWhhdmlvciBvZiBhIHZpcnR1YWwgdGFibGUgYW5kIHNob3VsZCBiZQogKiAgICBqdXN0IGFzIGZhc3QuCiAqICAtIFRoaXMgQyBjb2RlIHNob3VsZCBiZSBxdWl0ZSBjb21wYXRpYmxlIHdpdGggdGhlIFdpbmRvd3MgaGVhZGVycyBib3RoIGZvciBjb2RlIHRoYXQgdXNlcyBDT00KICogICAgaW50ZXJmYWNlcyBhbmQgZm9yIGNvZGUgaW1wbGVtZW50aW5nIGEgQ09NIGludGVyZmFjZS4KICoKICoKICogQW5kIGluIEMrKyAod2l0aCBnY2MncyBnKyspOgogKgogKiAgICB0eXBlZGVmIHN0cnVjdCBJRGlyZWN0M0Q6IHB1YmxpYyBJVW5rbm93biB7CiAqICAgICAgICB2aXJ0dWFsIEhSRVNVTFQgSW5pdGlhbGl6ZShSRUZJSUQgYSkgPSAwOwogKiAgICAgICAgdmlydHVhbCBIUkVTVUxUIEVudW1EZXZpY2VzKExQRDNERU5VTURFVklDRVNDQUxMQkFDSyBhLCBMUFZPSUQgYikgPSAwOwogKiAgICAgICAgdmlydHVhbCBIUkVTVUxUIENyZWF0ZUxpZ2h0KExQRElSRUNUM0RMSUdIVCogYSwgSVVua25vd24qIGIpID0gMDsKICogICAgICAgIHZpcnR1YWwgSFJFU1VMVCBDcmVhdGVNYXRlcmlhbChMUERJUkVDVDNETUFURVJJQUwqIGEsIElVbmtub3duKiBiKSA9IDA7CiAqICAgICAgICB2aXJ0dWFsIEhSRVNVTFQgQ3JlYXRlVmlld3BvcnQoTFBESVJFQ1QzRFZJRVdQT1JUKiBhLCBJVW5rbm93biogYikgPSAwOwogKiAgICAgICAgdmlydHVhbCBIUkVTVUxUIEZpbmREZXZpY2UoTFBEM0RGSU5EREVWSUNFU0VBUkNIIGEsIExQRDNERklORERFVklDRVJFU1VMVCBiKSA9IDA7CiAqICAgIH07CiAqCiAqIENvbW1lbnRzOgogKiAgLSBPZiBjb3Vyc2UgaW4gQysrIHdlIHVzZSBpbmhlcml0YW5jZSBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gZHVwbGljYXRlIHRoZSBtZXRob2QgZGVmaW5pdGlvbnMuCiAqICAtIEZpbmFsbHkgdGhlcmUgaXMgbm8gSURpcmVjdDNEX1h4eCBtYWNyby4gVGhlc2UgYXJlIG5vdCBuZWVkZWQgaW4gQysrIHVubGVzcyB0aGUgQ0lOVEVSRkFDRQogKiAgICBtYWNybyBpcyBkZWZpbmVkIGluIHdoaWNoIGNhc2Ugd2Ugd291bGQgbm90IGJlIGhlcmUuCiAqCiAqCiAqIEltcGxlbWVudGluZyBhIENPTSBpbnRlcmZhY2UuCiAqCiAqIFRoaXMgY29udGludWVzIHRoZSBhYm92ZSBleGFtcGxlLiBUaGlzIGV4YW1wbGUgYXNzdW1lcyB0aGF0IHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBpbiBDLgogKgogKiAgICB0eXBlZGVmIHN0cnVjdCBJRGlyZWN0M0RJbXBsIHsKICogICAgICAgIHZvaWQqIGxwVnRibDsKICogICAgICAgIC8vIC4uLgogKgogKiAgICB9IElEaXJlY3QzREltcGw7CiAqCiAqICAgIHN0YXRpYyBJRGlyZWN0M0RWdGJsIGQzZHZ0OwogKgogKiAgICAvLyBpbXBsZW1lbnQgdGhlIElEaXJlY3QzRCBtZXRob2RzIGhlcmUKICoKICogICAgaW50IElEaXJlY3QzRF9RdWVyeUludGVyZmFjZShJRGlyZWN0M0QqIG1lKQogKiAgICB7CiAqICAgICAgICBJRGlyZWN0M0RJbXBsICpUaGlzID0gKElEaXJlY3QzREltcGwgKiltZTsKICogICAgICAgIC8vIC4uLgogKiAgICB9CiAqCiAqICAgIC8vIC4uLgogKgogKiAgICBzdGF0aWMgSURpcmVjdDNEVnRibCBkM2R2dCA9IHsKICogICAgICAgIElEaXJlY3QzRF9RdWVyeUludGVyZmFjZSwKICogICAgICAgIElEaXJlY3QzRF9BZGQsCiAqICAgICAgICBJRGlyZWN0M0RfQWRkMiwKICogICAgICAgIElEaXJlY3QzRF9Jbml0aWFsaXplLAogKiAgICAgICAgSURpcmVjdDNEX1NldFdpZHRoCiAqICAgIH07CiAqCiAqIENvbW1lbnRzOgogKiAgLSBXZSBmaXJzdCBkZWZpbmUgd2hhdCB0aGUgaW50ZXJmYWNlIHJlYWxseSBjb250YWlucy4gVGhpcyBpcyB0aGUgSURpcmVjdDNESW1wbCBzdHJ1Y3R1cmUuIFRoZQogKiAgICBmaXJzdCBmaWVsZCBtdXN0IG9mIGNvdXJzZSBiZSB0aGUgdmlydHVhbCB0YWJsZSBwb2ludGVyLiBFdmVyeXRoaW5nIGVsc2UgaXMgZnJlZS4KICogIC0gVGhlbiB3ZSBwcmVkZWNsYXJlIG91ciBzdGF0aWMgdmlydHVhbCB0YWJsZSB2YXJpYWJsZSwgd2Ugd2lsbCBuZWVkIGl0cyBhZGRyZXNzIGluIHNvbWUKICogICAgbWV0aG9kcyB0byBpbml0aWFsaXplIHRoZSB2aXJ0dWFsIHRhYmxlIHBvaW50ZXIgb2YgdGhlIHJldHVybmVkIGludGVyZmFjZSBvYmplY3RzLgogKiAgLSBUaGVuIHdlIGltcGxlbWVudCB0aGUgaW50ZXJmYWNlIG1ldGhvZHMuIFRvIG1hdGNoIHdoYXQgaGFzIGJlZW4gZGVjbGFyZWQgaW4gdGhlIGhlYWRlciBmaWxlCiAqICAgIHRoZXkgbXVzdCB0YWtlIGEgcG9pbnRlciB0byBhIElEaXJlY3QzRCBzdHJ1Y3R1cmUgYW5kIHdlIG11c3QgY2FzdCBpdCB0byBhbiBJRGlyZWN0M0RJbXBsIHNvCiAqICAgIHRoYXQgd2UgY2FuIG1hbmlwdWxhdGUgdGhlIGZpZWxkcy4KICogIC0gRmluYWxseSB3ZSBpbml0aWFsaXplIHRoZSB2aXJ0dWFsIHRhYmxlLgogKi8KCiNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSAmJiAhZGVmaW5lZChDSU5URVJGQUNFKQoKLyogQysrIGludGVyZmFjZSAqLwoKI2RlZmluZSBTVERNRVRIT0QobWV0aG9kKSAgICAgICAgdmlydHVhbCBIUkVTVUxUIFNURE1FVEhPRENBTExUWVBFIG1ldGhvZAojZGVmaW5lIFNURE1FVEhPRF8odHlwZSxtZXRob2QpICB2aXJ0dWFsIHR5cGUgU1RETUVUSE9EQ0FMTFRZUEUgbWV0aG9kCiNkZWZpbmUgU1RETUVUSE9EVihtZXRob2QpICAgICAgIHZpcnR1YWwgSFJFU1VMVCBTVERNRVRIT0RWQ0FMTFRZUEUgbWV0aG9kCiNkZWZpbmUgU1RETUVUSE9EVl8odHlwZSxtZXRob2QpIHZpcnR1YWwgdHlwZSBTVERNRVRIT0RWQ0FMTFRZUEUgbWV0aG9kCgojZGVmaW5lIFBVUkUgICA9IDAKI2RlZmluZSBUSElTXwojZGVmaW5lIFRISVMgICB2b2lkCgojZGVmaW5lIGludGVyZmFjZSBzdHJ1Y3QKI2RlZmluZSBERUNMQVJFX0lOVEVSRkFDRShpZmFjZSkgICAgICAgIGludGVyZmFjZSBpZmFjZQojZGVmaW5lIERFQ0xBUkVfSU5URVJGQUNFXyhpZmFjZSxpYmFzZSkgaW50ZXJmYWNlIGlmYWNlIDogcHVibGljIGliYXNlCgojZGVmaW5lIEJFR0lOX0lOVEVSRkFDRQojZGVmaW5lIEVORF9JTlRFUkZBQ0UKCiNlbHNlICAvKiBfX2NwbHVzcGx1cyAmJiAhQ0lOVEVSRkFDRSAqLwoKLyogQyBpbnRlcmZhY2UgKi8KCiNkZWZpbmUgU1RETUVUSE9EKG1ldGhvZCkgICAgICAgIEhSRVNVTFQgKFNURE1FVEhPRENBTExUWVBFICptZXRob2QpCiNkZWZpbmUgU1RETUVUSE9EXyh0eXBlLG1ldGhvZCkgIHR5cGUgKFNURE1FVEhPRENBTExUWVBFICptZXRob2QpCiNkZWZpbmUgU1RETUVUSE9EVihtZXRob2QpICAgICAgIEhSRVNVTFQgKFNURE1FVEhPRFZDQUxMVFlQRSAqbWV0aG9kKQojZGVmaW5lIFNURE1FVEhPRFZfKHR5cGUsbWV0aG9kKSB0eXBlIChTVERNRVRIT0RWQ0FMTFRZUEUgKm1ldGhvZCkKCiNkZWZpbmUgUFVSRQojZGVmaW5lIFRISVNfIElOVEVSRkFDRSAqVGhpcywKI2RlZmluZSBUSElTICBJTlRFUkZBQ0UgKlRoaXMKCiNkZWZpbmUgaW50ZXJmYWNlIHN0cnVjdAoKI2lmZGVmIENPTlNUX1ZUQUJMRQojdW5kZWYgQ09OU1RfVlRCTAojZGVmaW5lIENPTlNUX1ZUQkwgY29uc3QKI2RlZmluZSBERUNMQVJFX0lOVEVSRkFDRShpZmFjZSkgXAogICAgICAgICAvKnR5cGVkZWYqLyBpbnRlcmZhY2UgaWZhY2UgeyBjb25zdCBzdHJ1Y3QgaWZhY2UjI1Z0YmwgKmxwVnRibDsgfSAvKmlmYWNlKi87IFwKICAgICAgICAgdHlwZWRlZiBjb25zdCBzdHJ1Y3QgaWZhY2UjI1Z0YmwgaWZhY2UjI1Z0Ymw7IFwKICAgICAgICAgY29uc3Qgc3RydWN0IGlmYWNlIyNWdGJsCiNlbHNlCiN1bmRlZiBDT05TVF9WVEJMCiNkZWZpbmUgQ09OU1RfVlRCTAojZGVmaW5lIERFQ0xBUkVfSU5URVJGQUNFKGlmYWNlKSBcCiAgICAgICAgIC8qdHlwZWRlZiovIGludGVyZmFjZSBpZmFjZSB7IHN0cnVjdCBpZmFjZSMjVnRibCAqbHBWdGJsOyB9IC8qaWZhY2UqLzsgXAogICAgICAgICB0eXBlZGVmIHN0cnVjdCBpZmFjZSMjVnRibCBpZmFjZSMjVnRibDsgXAogICAgICAgICBzdHJ1Y3QgaWZhY2UjI1Z0YmwKI2VuZGlmCiNkZWZpbmUgREVDTEFSRV9JTlRFUkZBQ0VfKGlmYWNlLGliYXNlKSBERUNMQVJFX0lOVEVSRkFDRShpZmFjZSkKCiNkZWZpbmUgQkVHSU5fSU5URVJGQUNFCiNkZWZpbmUgRU5EX0lOVEVSRkFDRQoKI2VuZGlmICAvKiBfX2NwbHVzcGx1cyAmJiAhQ0lOVEVSRkFDRSAqLwoKI2luY2x1ZGUgPG9iamlkbC5oPgoKI2lmbmRlZiBSQ19JTlZPS0VECi8qIEZvciBjb21wYXRpYmlsaXR5IG9ubHksIGF0IGxlYXN0IGZvciBub3cgKi8KI2luY2x1ZGUgPHN0ZGxpYi5oPgojZW5kaWYKCiNpZm5kZWYgSU5JVEdVSUQKI2luY2x1ZGUgPGNndWlkLmg+CiNlbmRpZgoKI2lmZGVmIF9fY3BsdXNwbHVzCmV4dGVybiAiQyIgewojZW5kaWYKCiNpZm5kZWYgTk9OQU1FTEVTU1NUUlVDVAojZGVmaW5lIExJU2V0MzIobGksIHYpICAgKChsaSkuSGlnaFBhcnQgPSAodikgPCAwID8gLTEgOiAwLCAobGkpLkxvd1BhcnQgPSAodikpCiNkZWZpbmUgVUxJU2V0MzIobGksIHYpICAoKGxpKS5IaWdoUGFydCA9IDAsIChsaSkuTG93UGFydCA9ICh2KSkKI2Vsc2UKI2RlZmluZSBMSVNldDMyKGxpLCB2KSAgICgobGkpLnUuSGlnaFBhcnQgPSAodikgPCAwID8gLTEgOiAwLCAobGkpLnUuTG93UGFydCA9ICh2KSkKI2RlZmluZSBVTElTZXQzMihsaSwgdikgICgobGkpLnUuSGlnaFBhcnQgPSAwLCAobGkpLnUuTG93UGFydCA9ICh2KSkKI2VuZGlmCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJU3RhbmRhcmQgQVBJCiAqLwpEV09SRCBXSU5BUEkgQ29CdWlsZFZlcnNpb24odm9pZCk7Cgp0eXBlZGVmIGVudW0gdGFnQ09JTklUCnsKICAgIENPSU5JVF9BUEFSVE1FTlRUSFJFQURFRCAgPSAweDIsIC8qIEFwYXJ0bWVudCBtb2RlbCAqLwogICAgQ09JTklUX01VTFRJVEhSRUFERUQgICAgICA9IDB4MCwgLyogT0xFIGNhbGxzIG9iamVjdHMgb24gYW55IHRocmVhZCAqLwogICAgQ09JTklUX0RJU0FCTEVfT0xFMURERSAgICA9IDB4NCwgLyogRG9uJ3QgdXNlIERERSBmb3IgT2xlMSBzdXBwb3J0ICovCiAgICBDT0lOSVRfU1BFRURfT1ZFUl9NRU1PUlkgID0gMHg4ICAvKiBUcmFkZSBtZW1vcnkgZm9yIHNwZWVkICovCn0gQ09JTklUOwoKSFJFU1VMVCBXSU5BUEkgQ29Jbml0aWFsaXplKExQVk9JRCBscFJlc2VydmVkKTsKSFJFU1VMVCBXSU5BUEkgQ29Jbml0aWFsaXplRXgoTFBWT0lEIGxwUmVzZXJ2ZWQsIERXT1JEIGR3Q29Jbml0KTsKdm9pZCBXSU5BUEkgQ29VbmluaXRpYWxpemUodm9pZCk7CkRXT1JEIFdJTkFQSSBDb0dldEN1cnJlbnRQcm9jZXNzKHZvaWQpOwoKSElOU1RBTkNFIFdJTkFQSSBDb0xvYWRMaWJyYXJ5KExQT0xFU1RSIGxwc3pMaWJOYW1lLCBCT09MIGJBdXRvRnJlZSk7CnZvaWQgV0lOQVBJIENvRnJlZUFsbExpYnJhcmllcyh2b2lkKTsKdm9pZCBXSU5BUEkgQ29GcmVlTGlicmFyeShISU5TVEFOQ0UgaExpYnJhcnkpOwp2b2lkIFdJTkFQSSBDb0ZyZWVVbnVzZWRMaWJyYXJpZXModm9pZCk7CgpIUkVTVUxUIFdJTkFQSSBDb0NyZWF0ZUluc3RhbmNlKFJFRkNMU0lEIHJjbHNpZCwgTFBVTktOT1dOIHBVbmtPdXRlciwgRFdPUkQgZHdDbHNDb250ZXh0LCBSRUZJSUQgaWlkLCBMUFZPSUQgKnBwdik7CkhSRVNVTFQgV0lOQVBJIENvQ3JlYXRlSW5zdGFuY2VFeChSRUZDTFNJRCAgICAgIHJjbHNpZCwKCQkJCSAgTFBVTktOT1dOICAgICBwVW5rT3V0ZXIsCgkJCQkgIERXT1JEICAgICAgICAgZHdDbHNDb250ZXh0LAoJCQkJICBDT1NFUlZFUklORk8qIHBTZXJ2ZXJJbmZvLAoJCQkJICBVTE9ORyAgICAgICAgIGNtcSwKCQkJCSAgTVVMVElfUUkqICAgICBwUmVzdWx0cyk7CgpIUkVTVUxUIFdJTkFQSSBDb0dldEluc3RhbmNlRnJvbUZpbGUoQ09TRVJWRVJJTkZPKiBwU2VydmVySW5mbywgQ0xTSUQqIHBDbHNpZCwgSVVua25vd24qIHB1bmtPdXRlciwgRFdPUkQgZHdDbHNDdHgsIERXT1JEIGdyZk1vZGUsIE9MRUNIQVIqIHB3c3pOYW1lLCBEV09SRCBkd0NvdW50LCBNVUxUSV9RSSogcFJlc3VsdHMpOwpIUkVTVUxUIFdJTkFQSSBDb0dldEluc3RhbmNlRnJvbUlTdG9yYWdlKENPU0VSVkVSSU5GTyogcFNlcnZlckluZm8sIENMU0lEKiBwQ2xzaWQsIElVbmtub3duKiBwdW5rT3V0ZXIsIERXT1JEIGR3Q2xzQ3R4LCBJU3RvcmFnZSogcHN0ZywgRFdPUkQgZHdDb3VudCwgTVVMVElfUUkqIHBSZXN1bHRzKTsKCkhSRVNVTFQgV0lOQVBJIENvR2V0TWFsbG9jKERXT1JEIGR3TWVtQ29udGV4dCwgTFBNQUxMT0MqIGxwTWFsbG9jKTsKTFBWT0lEIFdJTkFQSSBDb1Rhc2tNZW1BbGxvYyhVTE9ORyBzaXplKTsKdm9pZCBXSU5BUEkgQ29UYXNrTWVtRnJlZShMUFZPSUQgcHRyKTsKTFBWT0lEIFdJTkFQSSBDb1Rhc2tNZW1SZWFsbG9jKExQVk9JRCBwdHIsIFVMT05HIHNpemUpOwoKSFJFU1VMVCBXSU5BUEkgQ29SZWdpc3Rlck1hbGxvY1NweShMUE1BTExPQ1NQWSBwTWFsbG9jU3B5KTsKSFJFU1VMVCBXSU5BUEkgQ29SZXZva2VNYWxsb2NTcHkodm9pZCk7CgovKiBjbGFzcyByZWdpc3RyYXRpb24gZmxhZ3M7IHBhc3NlZCB0byBDb1JlZ2lzdGVyQ2xhc3NPYmplY3QgKi8KdHlwZWRlZiBlbnVtIHRhZ1JFR0NMUwp7CiAgICBSRUdDTFNfU0lOR0xFVVNFID0gMCwKICAgIFJFR0NMU19NVUxUSVBMRVVTRSA9IDEsCiAgICBSRUdDTFNfTVVMVElfU0VQQVJBVEUgPSAyLAogICAgUkVHQ0xTX1NVU1BFTkRFRCA9IDQKfSBSRUdDTFM7CgpIUkVTVUxUIFdJTkFQSSBDb0dldENsYXNzT2JqZWN0KFJFRkNMU0lEIHJjbHNpZCwgRFdPUkQgZHdDbHNDb250ZXh0LCBDT1NFUlZFUklORk8gKnBTZXJ2ZXJJbmZvLCBSRUZJSUQgaWlkLCBMUFZPSUQgKnBwdik7CkhSRVNVTFQgV0lOQVBJIENvUmVnaXN0ZXJDbGFzc09iamVjdChSRUZDTFNJRCByY2xzaWQsTFBVTktOT1dOIHBVbmssRFdPUkQgZHdDbHNDb250ZXh0LERXT1JEIGZsYWdzLExQRFdPUkQgbHBkd1JlZ2lzdGVyKTsKSFJFU1VMVCBXSU5BUEkgQ29SZXZva2VDbGFzc09iamVjdChEV09SRCBkd1JlZ2lzdGVyKTsKSFJFU1VMVCBXSU5BUEkgQ29HZXRQU0Nsc2lkKFJFRklJRCByaWlkLENMU0lEICpwY2xzaWQpOwpIUkVTVUxUIFdJTkFQSSBDb1JlZ2lzdGVyUFNDbHNpZChSRUZJSUQgcmlpZCwgUkVGQ0xTSUQgcmNsc2lkKTsKSFJFU1VMVCBXSU5BUEkgQ29TdXNwZW5kQ2xhc3NPYmplY3RzKHZvaWQpOwpIUkVTVUxUIFdJTkFQSSBDb1Jlc3VtZUNsYXNzT2JqZWN0cyh2b2lkKTsKVUxPTkcgV0lOQVBJIENvQWRkUmVmU2VydmVyUHJvY2Vzcyh2b2lkKTsKVUxPTkcgV0lOQVBJIENvUmVsZWFzZVNlcnZlclByb2Nlc3Modm9pZCk7CgovKiBtYXJzaGFsbGluZyAqLwpIUkVTVUxUIFdJTkFQSSBDb0NyZWF0ZUZyZWVUaHJlYWRlZE1hcnNoYWxlcihMUFVOS05PV04gcHVua091dGVyLCBMUFVOS05PV04qIHBwdW5rTWFyc2hhbCk7CkhSRVNVTFQgV0lOQVBJIENvR2V0SW50ZXJmYWNlQW5kUmVsZWFzZVN0cmVhbShMUFNUUkVBTSBwU3RtLCBSRUZJSUQgaWlkLCBMUFZPSUQqIHBwdik7CkhSRVNVTFQgV0lOQVBJIENvR2V0TWFyc2hhbFNpemVNYXgoVUxPTkcqIHB1bFNpemUsIFJFRklJRCByaWlkLCBMUFVOS05PV04gcFVuaywgRFdPUkQgZHdEZXN0Q29udGV4dCwgTFBWT0lEIHB2RGVzdENvbnRleHQsIERXT1JEIG1zaGxmbGFncyk7CkhSRVNVTFQgV0lOQVBJIENvR2V0U3RhbmRhcmRNYXJzaGFsKFJFRklJRCByaWlkLCBMUFVOS05PV04gcFVuaywgRFdPUkQgZHdEZXN0Q29udGV4dCwgTFBWT0lEIHB2RGVzdENvbnRleHQsIERXT1JEIG1zaGxmbGFncywgTFBNQVJTSEFMKiBwcE1hcnNoYWwpOwpIUkVTVUxUIFdJTkFQSSBDb01hcnNoYWxIcmVzdWx0KExQU1RSRUFNIHBzdG0sIEhSRVNVTFQgaHJlc3VsdCk7CkhSRVNVTFQgV0lOQVBJIENvTWFyc2hhbEludGVyZmFjZShMUFNUUkVBTSBwU3RtLCBSRUZJSUQgcmlpZCwgTFBVTktOT1dOIHBVbmssIERXT1JEIGR3RGVzdENvbnRleHQsIExQVk9JRCBwdkRlc3RDb250ZXh0LCBEV09SRCBtc2hsZmxhZ3MpOwpIUkVTVUxUIFdJTkFQSSBDb01hcnNoYWxJbnRlclRocmVhZEludGVyZmFjZUluU3RyZWFtKFJFRklJRCByaWlkLCBMUFVOS05PV04gcFVuaywgTFBTVFJFQU0qIHBwU3RtKTsKSFJFU1VMVCBXSU5BUEkgQ29SZWxlYXNlTWFyc2hhbERhdGEoTFBTVFJFQU0gcFN0bSk7CkhSRVNVTFQgV0lOQVBJIENvRGlzY29ubmVjdE9iamVjdChMUFVOS05PV04gbHBVbmssIERXT1JEIHJlc2VydmVkKTsKSFJFU1VMVCBXSU5BUEkgQ29Vbm1hcnNoYWxIcmVzdWx0KExQU1RSRUFNIHBzdG0sIEhSRVNVTFQqIHBocmVzdWx0KTsKSFJFU1VMVCBXSU5BUEkgQ29Vbm1hcnNoYWxJbnRlcmZhY2UoTFBTVFJFQU0gcFN0bSwgUkVGSUlEIHJpaWQsIExQVk9JRCogcHB2KTsKSFJFU1VMVCBXSU5BUEkgQ29Mb2NrT2JqZWN0RXh0ZXJuYWwoTFBVTktOT1dOIHBVbmssIEJPT0wgZkxvY2ssIEJPT0wgZkxhc3RVbmxvY2tSZWxlYXNlcyk7CkJPT0wgV0lOQVBJIENvSXNIYW5kbGVyQ29ubmVjdGVkKExQVU5LTk9XTiBwVW5rKTsKCi8qIHNlY3VyaXR5ICovCkhSRVNVTFQgV0lOQVBJIENvSW5pdGlhbGl6ZVNlY3VyaXR5KFBTRUNVUklUWV9ERVNDUklQVE9SIHBTZWNEZXNjLCBMT05HIGNBdXRoU3ZjLCBTT0xFX0FVVEhFTlRJQ0FUSU9OX1NFUlZJQ0UqIGFzQXV0aFN2Yywgdm9pZCogcFJlc2VydmVkMSwgRFdPUkQgZHdBdXRobkxldmVsLCBEV09SRCBkd0ltcExldmVsLCB2b2lkKiBwUmVzZXJ2ZWQyLCBEV09SRCBkd0NhcGFiaWxpdGllcywgdm9pZCogcFJlc2VydmVkMyk7CkhSRVNVTFQgV0lOQVBJIENvR2V0Q2FsbENvbnRleHQoUkVGSUlEIHJpaWQsIHZvaWQqKiBwcEludGVyZmFjZSk7CkhSRVNVTFQgV0lOQVBJIENvUXVlcnlBdXRoZW50aWNhdGlvblNlcnZpY2VzKERXT1JEKiBwY0F1dGhTdmMsIFNPTEVfQVVUSEVOVElDQVRJT05fU0VSVklDRSoqIGFzQXV0aFN2Yyk7CgpIUkVTVUxUIFdJTkFQSSBDb1F1ZXJ5UHJveHlCbGFua2V0KElVbmtub3duKiBwUHJveHksIERXT1JEKiBwd0F1dGhuU3ZjLCBEV09SRCogcEF1dGh6U3ZjLCBPTEVDSEFSKiogcFNlcnZlclByaW5jTmFtZSwgRFdPUkQqIHBBdXRobkxldmVsLCBEV09SRCogcEltcExldmVsLCBSUENfQVVUSF9JREVOVElUWV9IQU5ETEUqIHBBdXRoSW5mbywgRFdPUkQqIHBDYXBhYmlsaXRlcyk7CkhSRVNVTFQgV0lOQVBJIENvU2V0UHJveHlCbGFua2V0KElVbmtub3duKiBwUHJveHksIERXT1JEIGR3QXV0aG5TdmMsIERXT1JEIGR3QXV0aHpTdmMsIE9MRUNIQVIqIHBTZXJ2ZXJQcmluY05hbWUsIERXT1JEIGR3QXV0aG5MZXZlbCwgRFdPUkQgZHdJbXBMZXZlbCwgUlBDX0FVVEhfSURFTlRJVFlfSEFORExFIHBBdXRoSW5mbywgRFdPUkQgZHdDYXBhYmlsaXRpZXMpOwpIUkVTVUxUIFdJTkFQSSBDb0NvcHlQcm94eShJVW5rbm93biogcFByb3h5LCBJVW5rbm93bioqIHBwQ29weSk7CgpIUkVTVUxUIFdJTkFQSSBDb0ltcGVyc29uYXRlQ2xpZW50KHZvaWQpOwpIUkVTVUxUIFdJTkFQSSBDb1F1ZXJ5Q2xpZW50QmxhbmtldChEV09SRCogcEF1dGhuU3ZjLCBEV09SRCogcEF1dGh6U3ZjLCBPTEVDSEFSKiogcFNlcnZlclByaW5jTmFtZSwgRFdPUkQqIHBBdXRobkxldmVsLCBEV09SRCogcEltcExldmVsLCBSUENfQVVUSFpfSEFORExFKiBwUHJpdnMsIERXT1JEKiBwQ2FwYWJpbGl0aWVzKTsKSFJFU1VMVCBXSU5BUEkgQ29SZXZlcnRUb1NlbGYodm9pZCk7CgovKiBtaXNjICovCkhSRVNVTFQgV0lOQVBJIENvR2V0VHJlYXRBc0NsYXNzKFJFRkNMU0lEIGNsc2lkT2xkLCBMUENMU0lEIHBDbHNpZE5ldyk7CkhSRVNVTFQgV0lOQVBJIENvVHJlYXRBc0NsYXNzKFJFRkNMU0lEIGNsc2lkT2xkLCBSRUZDTFNJRCBjbHNpZE5ldyk7CgpIUkVTVUxUIFdJTkFQSSBDb0NyZWF0ZUd1aWQoR1VJRCogcGd1aWQpOwpCT09MIFdJTkFQSSBDb0lzT2xlMUNsYXNzKFJFRkNMU0lEIHJjbHNpZCk7CgpCT09MIFdJTkFQSSBDb0Rvc0RhdGVUaW1lVG9GaWxlVGltZShXT1JEIG5Eb3NEYXRlLCBXT1JEIG5Eb3NUaW1lLCBGSUxFVElNRSogbHBGaWxlVGltZSk7CkJPT0wgV0lOQVBJIENvRmlsZVRpbWVUb0Rvc0RhdGVUaW1lKEZJTEVUSU1FKiBscEZpbGVUaW1lLCBXT1JEKiBscERvc0RhdGUsIFdPUkQqIGxwRG9zVGltZSk7CkhSRVNVTFQgV0lOQVBJIENvRmlsZVRpbWVOb3coRklMRVRJTUUqIGxwRmlsZVRpbWUpOwpIUkVTVUxUIFdJTkFQSSBDb1JlZ2lzdGVyTWVzc2FnZUZpbHRlcihMUE1FU1NBR0VGSUxURVIgbHBNZXNzYWdlRmlsdGVyLExQTUVTU0FHRUZJTFRFUiAqbHBscE1lc3NhZ2VGaWx0ZXIpOwoKdHlwZWRlZiBlbnVtIHRhZ0NPV0FJVF9GTEFHUwp7CiAgICBDT1dBSVRfV0FJVEFMTCAgID0gMHgwMDAwMDAwMSwKICAgIENPV0FJVF9BTEVSVEFCTEUgPSAweDAwMDAwMDAyCn0gQ09XQUlUX0ZMQUdTOwoKSFJFU1VMVCBXSU5BUEkgQ29XYWl0Rm9yTXVsdGlwbGVIYW5kbGVzKERXT1JEIGR3RmxhZ3MsRFdPUkQgZHdUaW1lb3V0LFVMT05HIGNIYW5kbGVzLGNvbnN0IEhBTkRMRSogcEhhbmRsZXMsTFBEV09SRCBscGR3aW5kZXgpOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCUdVSUQgQVBJCiAqLwpIUkVTVUxUIFdJTkFQSSBTdHJpbmdGcm9tQ0xTSUQoUkVGQ0xTSUQgaWQsIExQT0xFU1RSKik7CkhSRVNVTFQgV0lOQVBJIENMU0lERnJvbVN0cmluZyhMUE9MRVNUUiwgQ0xTSUQgKik7CkhSRVNVTFQgV0lOQVBJIENMU0lERnJvbVByb2dJRChMUENPTEVTVFIgcHJvZ2lkLCBMUENMU0lEIHJpaWQpOwpIUkVTVUxUIFdJTkFQSSBQcm9nSURGcm9tQ0xTSUQoUkVGQ0xTSUQgY2xzaWQsIExQT0xFU1RSICpscGxwc3pQcm9nSUQpOwoKSU5UIFdJTkFQSSBTdHJpbmdGcm9tR1VJRDIoUkVGR1VJRCBpZCwgTFBPTEVTVFIgc3RyLCBJTlQgY21heCk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJQ09NIFNlcnZlciBkbGwgLSBleHBvcnRzCiAqLwpIUkVTVUxUIFdJTkFQSSBEbGxHZXRDbGFzc09iamVjdChSRUZDTFNJRCByY2xzaWQsIFJFRklJRCByaWlkLCBMUFZPSUQgKiBwcHYpOwpIUkVTVUxUIFdJTkFQSSBEbGxDYW5VbmxvYWROb3codm9pZCk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJRGF0YSBPYmplY3QKICovCkhSRVNVTFQgV0lOQVBJIENyZWF0ZURhdGFBZHZpc2VIb2xkZXIoTFBEQVRBQURWSVNFSE9MREVSKiBwcERBSG9sZGVyKTsKSFJFU1VMVCBXSU5BUEkgQ3JlYXRlRGF0YUNhY2hlKExQVU5LTk9XTiBwVW5rT3V0ZXIsIFJFRkNMU0lEIHJjbHNpZCwgUkVGSUlEIGlpZCwgTFBWT0lEKiBwcHYpOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCU1vbmlrZXIgQVBJCiAqLwpIUkVTVUxUIFdJTkFQSSBCaW5kTW9uaWtlcihMUE1PTklLRVIgcG1rLCBEV09SRCBncmZPcHQsIFJFRklJRCBpaWRSZXN1bHQsIExQVk9JRCogcHB2UmVzdWx0KTsKSFJFU1VMVCBXSU5BUEkgQ29HZXRPYmplY3QoTFBDV1NUUiBwc3pOYW1lLCBCSU5EX09QVFMgKnBCaW5kT3B0aW9ucywgUkVGSUlEIHJpaWQsIHZvaWQgKipwcHYpOwpIUkVTVUxUIFdJTkFQSSBDcmVhdGVBbnRpTW9uaWtlcihMUE1PTklLRVIgKiBwcG1rKTsKSFJFU1VMVCBXSU5BUEkgQ3JlYXRlQmluZEN0eChEV09SRCByZXNlcnZlZCwgTFBCQyogcHBiYyk7CkhSRVNVTFQgV0lOQVBJIENyZWF0ZUNsYXNzTW9uaWtlcihSRUZDTFNJRCByY2xzaWQsIExQTU9OSUtFUiogcHBtayk7CkhSRVNVTFQgV0lOQVBJIENyZWF0ZUZpbGVNb25pa2VyKExQQ09MRVNUUiBscHN6UGF0aE5hbWUsIExQTU9OSUtFUiogcHBtayk7CkhSRVNVTFQgV0lOQVBJIENyZWF0ZUdlbmVyaWNDb21wb3NpdGUoTFBNT05JS0VSIHBta0ZpcnN0LCBMUE1PTklLRVIgcG1rUmVzdCwgTFBNT05JS0VSKiBwcG1rQ29tcG9zaXRlKTsKSFJFU1VMVCBXSU5BUEkgQ3JlYXRlSXRlbU1vbmlrZXIoTFBDT0xFU1RSIGxwc3pEZWxpbSwgTFBDT0xFU1RSICBscHN6SXRlbSwgTFBNT05JS0VSKiBwcG1rKTsKSFJFU1VMVCBXSU5BUEkgQ3JlYXRlT2JqcmVmTW9uaWtlcihMUFVOS05PV04gcHVuaywgTFBNT05JS0VSICogcHBtayk7CkhSRVNVTFQgV0lOQVBJIENyZWF0ZVBvaW50ZXJNb25pa2VyKExQVU5LTk9XTiBwdW5rLCBMUE1PTklLRVIgKiBwcG1rKTsKSFJFU1VMVCBXSU5BUEkgR2V0Q2xhc3NGaWxlKExQQ09MRVNUUiBmaWxlUGF0aE5hbWUsQ0xTSUQgKnBjbHNpZCk7CkhSRVNVTFQgV0lOQVBJIEdldFJ1bm5pbmdPYmplY3RUYWJsZShEV09SRCByZXNlcnZlZCwgTFBSVU5OSU5HT0JKRUNUVEFCTEUgKnBwcm90KTsKSFJFU1VMVCBXSU5BUEkgTWtQYXJzZURpc3BsYXlOYW1lKExQQkMgcGJjLCBMUENPTEVTVFIgc3pVc2VyTmFtZSwgVUxPTkcgKiBwY2hFYXRlbiwgTFBNT05JS0VSICogcHBtayk7CkhSRVNVTFQgV0lOQVBJIE1vbmlrZXJDb21tb25QcmVmaXhXaXRoKElNb25pa2VyKiBwbWtUaGlzLElNb25pa2VyKiBwbWtPdGhlcixJTW9uaWtlcioqIHBwbWtDb21tb24pOwpIUkVTVUxUIFdJTkFQSSBNb25pa2VyUmVsYXRpdmVQYXRoVG8oTFBNT05JS0VSIHBta1NyYywgTFBNT05JS0VSIHBta0Rlc3QsIExQTU9OSUtFUiAqIHBwbWtSZWxQYXRoLCBCT09MIGR3UmVzZXJ2ZWQpOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVN0b3JhZ2UgQVBJCiAqLwojZGVmaW5lIFNUR01fRElSRUNUCQkweDAwMDAwMDAwCiNkZWZpbmUgU1RHTV9UUkFOU0FDVEVECQkweDAwMDEwMDAwCiNkZWZpbmUgU1RHTV9TSU1QTEUJCTB4MDgwMDAwMDAKI2RlZmluZSBTVEdNX1JFQUQJCTB4MDAwMDAwMDAKI2RlZmluZSBTVEdNX1dSSVRFCQkweDAwMDAwMDAxCiNkZWZpbmUgU1RHTV9SRUFEV1JJVEUJCTB4MDAwMDAwMDIKI2RlZmluZSBTVEdNX1NIQVJFX0RFTllfTk9ORQkweDAwMDAwMDQwCiNkZWZpbmUgU1RHTV9TSEFSRV9ERU5ZX1JFQUQJMHgwMDAwMDAzMAojZGVmaW5lIFNUR01fU0hBUkVfREVOWV9XUklURQkweDAwMDAwMDIwCiNkZWZpbmUgU1RHTV9TSEFSRV9FWENMVVNJVkUJMHgwMDAwMDAxMAojZGVmaW5lIFNUR01fUFJJT1JJVFkJCTB4MDAwNDAwMDAKI2RlZmluZSBTVEdNX0RFTEVURU9OUkVMRUFTRQkweDA0MDAwMDAwCiNkZWZpbmUgU1RHTV9DUkVBVEUJCTB4MDAwMDEwMDAKI2RlZmluZSBTVEdNX0NPTlZFUlQJCTB4MDAwMjAwMDAKI2RlZmluZSBTVEdNX0ZBSUxJRlRIRVJFCTB4MDAwMDAwMDAKI2RlZmluZSBTVEdNX05PU0NSQVRDSAkJMHgwMDEwMDAwMAojZGVmaW5lIFNUR01fTk9TTkFQU0hPVAkJMHgwMDIwMDAwMAojZGVmaW5lIFNUR01fRElSRUNUX1NXTVIJMHgwMDQwMDAwMAoKdHlwZWRlZiBzdHJ1Y3QgdGFnU1RHT1BUSU9OUwp7CiAgICBVU0hPUlQgdXNWZXJzaW9uOwogICAgVVNIT1JUIHJlc2VydmVkOwogICAgVUxPTkcgdWxTZWN0b3JTaXplOwogICAgY29uc3QgV0NIQVIqIHB3Y3NUZW1wbGF0ZUZpbGU7Cn0gU1RHT1BUSU9OUzsKCkhSRVNVTFQgV0lOQVBJIFN0Z0NyZWF0ZURvY2ZpbGUoTFBDT0xFU1RSIHB3Y3NOYW1lLERXT1JEIGdyZk1vZGUsRFdPUkQgcmVzZXJ2ZWQsSVN0b3JhZ2UgKipwcHN0Z09wZW4pOwpIUkVTVUxUIFdJTkFQSSBTdGdDcmVhdGVTdG9yYWdlRXgoY29uc3QgV0NIQVIqLERXT1JELERXT1JELERXT1JELFNUR09QVElPTlMqLHZvaWQqLFJFRklJRCx2b2lkKiopOwpIUkVTVUxUIFdJTkFQSSBTdGdJc1N0b3JhZ2VGaWxlKExQQ09MRVNUUiBmbik7CkhSRVNVTFQgV0lOQVBJIFN0Z0lzU3RvcmFnZUlMb2NrQnl0ZXMoSUxvY2tCeXRlcyAqcGxrYnl0KTsKSFJFU1VMVCBXSU5BUEkgU3RnT3BlblN0b3JhZ2UoY29uc3QgT0xFQ0hBUiogcHdjc05hbWUsSVN0b3JhZ2UqIHBzdGdQcmlvcml0eSxEV09SRCBncmZNb2RlLFNOQiBzbmJFeGNsdWRlLERXT1JEIHJlc2VydmVkLElTdG9yYWdlKipwcHN0Z09wZW4pOwoKSFJFU1VMVCBXSU5BUEkgV3JpdGVDbGFzc1N0ZyhJU3RvcmFnZSogcFN0ZywgUkVGQ0xTSUQgcmNsc2lkKTsKSFJFU1VMVCBXSU5BUEkgUmVhZENsYXNzU3RnKElTdG9yYWdlICpwc3RnLENMU0lEICpwY2xzaWQpOwoKSFJFU1VMVCBXSU5BUEkgU3RnQ3JlYXRlRG9jZmlsZU9uSUxvY2tCeXRlcyhJTG9ja0J5dGVzICpwbGtieXQsRFdPUkQgZ3JmTW9kZSwgRFdPUkQgcmVzZXJ2ZWQsIElTdG9yYWdlKiogcHBzdGdPcGVuKTsKSFJFU1VMVCBXSU5BUEkgU3RnT3BlblN0b3JhZ2VPbklMb2NrQnl0ZXMoSUxvY2tCeXRlcyAqcGxrYnl0LCBJU3RvcmFnZSAqcHN0Z1ByaW9yaXR5LCBEV09SRCBncmZNb2RlLCBTTkIgc25iRXhjbHVkZSwgRFdPUkQgcmVzZXJ2ZWQsIElTdG9yYWdlICoqcHBzdGdPcGVuKTsKCiNpZmRlZiBfX2NwbHVzcGx1cwp9CiNlbmRpZgoKLyogRklYTUU6ICNpbmNsdWRlIDx1cmxtb24uaD4gKi8KI2luY2x1ZGUgPHByb3BpZGwuaD4KCiNpZm5kZWYgX19XSU5FU1JDX18KCiNkZWZpbmUgRkFSU1RSVUNUCiNkZWZpbmUgSFVHRVAKCiNkZWZpbmUgV0lOT0xFQVBJICAgICAgICBTVERBUEkKI2RlZmluZSBXSU5PTEVBUElfKHR5cGUpIFNUREFQSV8odHlwZSkKCiNlbmRpZiAvKiBfX1dJTkVTUkNfXyAqLwoKI2VuZGlmIC8qIF9PQkpCQVNFX0hfICovCg==