LyogJElkJCAqLwovKiAKICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCiAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAogKi8KI2lmbmRlZiBfX1BKTUVESUFfQ09ERUNTX0c3MjIxX0hfXwojZGVmaW5lIF9fUEpNRURJQV9DT0RFQ1NfRzcyMjFfSF9fCgovKioKICogQGZpbGUgcGptZWRpYS1jb2RlYy9nNzIyMS5oCiAqIEBicmllZiBHNzIyLjEgY29kZWMuCiAqLwoKI2luY2x1ZGUgPHBqbWVkaWEtY29kZWMvdHlwZXMuaD4KCi8qKgogKiBAZGVmZ3JvdXAgUEpNRURfRzcyMjFfQ09ERUMgRy43MjIuMSBDb2RlYyAoU2lyZW43L1NpcmVuMTQpCiAqIEBpbmdyb3VwIFBKTUVESUFfQ09ERUNfQ09ERUNTCiAqIEBicmllZiBJbXBsZW1lbnRhdGlvbiBvZiBHLjcyMi4xIGNvZGVjCiAqIEB7CiAqCiAqIDxiPkcuNzIyLjEgbGljZW5zZWQgZnJvbSBQb2x5Y29trjwvYj48YnIgLz4KICogPGI+Ry43MjIuMSBBbm5leCBDIGxpY2Vuc2VkIGZyb20gUG9seWNvba48L2I+CiAqCiAqIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgZnVuY3Rpb25zIHRvIGluaXRpYWxpemUgYW5kIHJlZ2lzdGVyIEcuNzIyLjEgY29kZWMKICogZmFjdG9yeSB0byB0aGUgY29kZWMgbWFuYWdlci4gQWZ0ZXIgdGhlIGNvZGVjIGZhY3RvcnkgaGFzIGJlZW4gcmVnaXN0ZXJlZCwKICogYXBwbGljYXRpb24gY2FuIHVzZSBAcmVmIFBKTUVESUFfQ09ERUMgQVBJIHRvIG1hbmlwdWxhdGUgdGhlIGNvZGVjLgogKgogKiBQSk1FRElBIEc3MjIuMSBjb2RlYyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBJVFUtVCBSZWNvbW1lbmRhdGlvbiAKICogRy43MjIuMSAoMDUvMjAwNSkgQyBmaXhlZCBwb2ludCBpbXBsZW1lbnRhdGlvbiBpbmNsdWRpbmcgaXRzIEFubmV4IEMuCiAqCiAqIEcuNzIyLjEgaXMgYSBsb3cgY29tcGxleGl0eSBjb2RlYyB0aGF0IHN1cHBvcnRzIDdrSHogYW5kIDE0a0h6IGF1ZGlvIAogKiBiYW5kd2lkdGggd29ya2luZyBhdCBiaXRyYXRlcyByYW5naW5nIGZyb20gMTZrYnBzIHRvIDQ4a2Jwcy4gSXQgbWF5IGJlCiAqIHVzZWQgd2l0aCBzcGVlY2ggb3IgbXVzaWMgaW5wdXRzLgogKgogKgogKiBcc2VjdGlvbiBjb2RlY19zZXR0aW5nIENvZGVjIFNldHRpbmdzCiAqCiAqIFxzdWJzZWN0aW9uIGdlbmVyYWxfc2V0dGluZyBHZW5lcmFsIFNldHRpbmdzCiAqCiAqIEdlbmVyYWwgY29kZWMgc2V0dGluZ3MgZm9yIHRoaXMgY29kZWMgc3VjaCBhcyBWQUQgYW5kIFBMQyBjYW4gYmUgCiAqIG1hbmlwdWxhdGVkIHRocm91Z2ggdGhlIDx0dD5zZXR0aW5nPC90dD4gZmllbGQgaW4gI3BqbWVkaWFfY29kZWNfcGFyYW0uIAogKiBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudGF0aW9uIG9mICNwam1lZGlhX2NvZGVjX3BhcmFtIGZvciBtb3JlIGluZm8uCiAqCiAqIFxzdWJzZWN0aW9uIHNwZWNpZmljX3NldHRpbmcgQ29kZWMgU3BlY2lmaWMgU2V0dGluZ3MKICoKICogVGhlIGZvbGxvd2luZyBzZXR0aW5ncyBhcmUgYXBwbGljYWJsZSBmb3IgdGhpcyBjb2RlYy4KICoKICogXHN1YnN1YnNlY3Rpb24gYml0cmF0ZSBCaXRyYXRlCiAqCiAqIFRoZSBjb2RlYyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBzdGFuZGFyZCBhbmQgbm9uLXN0YW5kYXJkIGJpdHJhdGVzLgogKiBVc2UgI3BqbWVkaWFfY29kZWNfZzcyMjFfc2V0X21vZGUoKSB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgYml0cmF0ZXMuCiAqCiAqIEJ5IGRlZmF1bHQsIG9ubHkgc3RhbmRhcmQgYml0cmF0ZXMgYXJlIGVuYWJsZWQgdXBvbiBpbml0aWFsaXphdGlvbjoKICogLSBmb3IgN2tIeiBhdWRpbyBiYW5kd2lkdGggKDE2a0h6IHNhbXBsaW5nIHJhdGUpOiAyNGticHMgYW5kIDMya2JwcywKICogLSBmb3IgMTRrSHogYXVkaW8gYmFuZHdpZHRoICgzMmtIeiBzYW1wbGluZyByYXRlKTogMjRrYnBzLCAzMmticHMsIGFuZAogKiAgIDQ4a2Jwcy4KICoKICogVGhlIHVzYWdlIG9mIG5vbi1zdGFuZGFyZCBiaXRyYXRlcyBtdXN0IGZvbGxvdyB0aGVzZSByZXF1aXJlbWVudHM6CiAqIC0gZm9yIDdrSHogYXVkaW8gYmFuZHdpZHRoICgxNmtIeiBzYW1wbGluZyByYXRlKTogMTYwMDAgdG8gMzIwMDAgYnBzLCAKICogICBtdWx0aXBsaWNhdGlvbiBvZiA0MDAKICogLSBmb3IgMTRrSHogYXVkaW8gYmFuZHdpZHRoICgzMmtIeiBzYW1wbGluZyByYXRlKTogMjQwMDAgdG8gNDgwMDAgYnBzLAogKiAgIG11bHRpcGxpY2F0aW9uIG9mIDQwMAogKgogKiBcbm90ZQogKiBDdXJyZW50bHkgb25seSB1cCB0byB0d28gbm9uLXN0YW5kYXJkIG1vZGVzIGNhbiBiZSBlbmFibGVkLgogKgogKiBccmVtYXJrCiAqIFRoZXJlIGlzIGEgZmxhdyBpbiB0aGUgY29kZWMgbWFuYWdlciBhcyBjdXJyZW50bHkgaXQgY291bGQgbm90CiAqIGRpZmZlcmVudGlhdGUgRy43MjIuMSBjb2RlY3MgYnkgYml0cmF0ZXMsIGhlbmNlIGludm9raW5nIAogKiAjcGptZWRpYV9jb2RlY19tZ3Jfc2V0X2RlZmF1bHRfcGFyYW0oKSBtYXkgb25seSBhZmZlY3QgYSBHLjcyMi4xIGNvZGVjCiAqIHdpdGggdGhlIGhpZ2hlc3QgcHJpb3JpdHkgKG9yIGZpcnN0IGluZGV4IGZvdW5kIGluIGNvZGVjIGVudW1lcmF0aW9uIAogKiB3aGVuIHRoZXkgaGF2ZSBzYW1lIHByaW9yaXR5KSBhbmQgaW52b2tpbmcKICogI3BqbWVkaWFfY29kZWNfbWdyX3NldF9jb2RlY19wcmlvcml0eSgpIHdpbGwgc2V0IHByaW9yaXR5IG9mIGFsbCBHLjcyMi4xCiAqIGNvZGVjcyB3aXRoIHNhbXBsaW5nIHJhdGUgYXMgc3BlY2lmaWVkLgogKi8KClBKX0JFR0lOX0RFQ0wKCi8qKgogKiBJbml0aWFsaXplIGFuZCByZWdpc3RlciBHLjcyMi4xIGNvZGVjIGZhY3RvcnkgdG8gcGptZWRpYSBlbmRwb2ludC4KICoKICogQHBhcmFtIGVuZHB0CSAgICBUaGUgcGptZWRpYSBlbmRwb2ludC4KICoKICogQHJldHVybgkgICAgUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgogKi8KUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9jb2RlY19nNzIyMV9pbml0KCBwam1lZGlhX2VuZHB0ICplbmRwdCApOwoKCi8qKgogKiBFbmFibGUgYW5kIGRpc2FibGUgRy43MjIuMSBtb2RlLiBCeSBkZWZhdWx0LCB0aGUgc3RhbmRhcmQgbW9kZXMgYXJlIAogKiBlbmFibGVkIHVwb24gaW5pdGlhbGl6YXRpb24sIGkuZS46CiAqIC0gc2FtcGxpbmcgcmF0ZSAxNmtIeiwgYml0cmF0ZSAyNGticHMgYW5kIDMya2Jwcy4KICogLSBzYW1wbGluZyByYXRlIDMya0h6LCBiaXRyYXRlIDI0a2JwcywgMzJrYnBzLCBhbmQgNDhrYnBzLgogKiBUaGlzIGZ1bmN0aW9uIGNhbiBhbHNvIGJlIHVzZWQgZm9yIGVuYWJsaW5nIG5vbi1zdGFuZGFyZCBtb2Rlcy4KICogTm90ZSB0aGF0IGN1cnJlbnRseSBvbmx5IHVwIHRvIHR3byBub24tc3RhbmRhcmQgbW9kZXMgY2FuIGJlIGVuYWJsZWQKICogYXQgb25lIHRpbWUuCiAqCiAqIEBwYXJhbSBzYW1wbGVfcmF0ZQlQQ00gc2FtcGxpbmcgcmF0ZSwgaW4gSHosIHZhbGlkIHZhbHVlcyBhcmUgb25seSAKICoJCQkxNjAwMCBhbmQgMzIwMDAuCiAqIEBwYXJhbSBiaXRyYXRlCUc3MjIuMSBiaXRyYXRlLCBpbiBicHMsIHRoZSB2YWxpZCB2YWx1ZXMgYXJlCiAqCQkJc3RhbmRhcmQgYW5kIG5vbi1zdGFuZGFyZCBiaXRyYXRlcyBhcyBkZXNjcmliZWQgCiAqCQkJYWJvdmUuCiAqIEBwYXJhbSBlbmFibGVkCVBKX1RSVUUgZm9yIGVuYWJsaW5nIHNwZWNpZmllZCBtb2RlLgogKgogKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCiAqLwpQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX2NvZGVjX2c3MjIxX3NldF9tb2RlKHVuc2lnbmVkIHNhbXBsZV9yYXRlLCAKCQkJCQkJICB1bnNpZ25lZCBiaXRyYXRlLCAKCQkJCQkJICBwal9ib29sX3QgZW5hYmxlZCk7CgovKioKICogU2V0IHRoZSBHLjcyMi4xIGNvZGVjIGVuY29kZXIgYW5kIGRlY29kZXIgbGV2ZWwgYWRqdXN0bWVudC4gCiAqIElmIHRoZSB2YWx1ZSBpcyBub24temVybywgdGhlbiBQQ00gaW5wdXQgc2FtcGxlcyB0byB0aGUgZW5jb2RlciB3aWxsIAogKiBiZSBzaGlmdGVkIHJpZ2h0IGJ5IHRoaXMgdmFsdWUsIGFuZCBzaW1pbGFybHkgUENNIG91dHB1dCBzYW1wbGVzIGZyb20KICogdGhlIGRlY29kZXIgd2lsbCBiZSBzaGlmdGVkIGxlZnQgYnkgdGhpcyB2YWx1ZS4KICoKICogXG5vdGUKICogVGhpcyBmdW5jdGlvbiBpcyBhbHNvIGFwcGxpY2FibGUgZm9yIEc3MjIuMSBpbXBsZW1lbnRhdGlvbiB3aXRoIElQUAogKiBiYWNrLWVuZC4KICoKICogRGVmYXVsdCB2YWx1ZSBpcyBQSk1FRElBX0c3MjIxX0RFRkFVTFRfUENNX1NISUZULgogKgogKiBAcGFyYW0gdmFsCQlUaGUgdmFsdWUKICoKICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgogKi8KUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9jb2RlY19nNzIyMV9zZXRfcGNtX3NoaWZ0KGludCB2YWwpOwoKCgovKioKICogVW5yZWdpc3RlciBHLjcyMi4xIGNvZGVjcyBmYWN0b3J5IGZyb20gcGptZWRpYSBlbmRwb2ludC4KICoKICogQHJldHVybgkgICAgUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgogKi8KUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9jb2RlY19nNzIyMV9kZWluaXQodm9pZCk7CgoKUEpfRU5EX0RFQ0wKCgovKioKICogQH0KICovCgojZW5kaWYJLyogX19QSk1FRElBX0NPREVDU19HNzIyMV9IX18gKi8KCg==