LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAKICogRmlsZW5hbWU6ICAgICAgaXJxdWV1ZS5jCiAqIFZlcnNpb246ICAgICAgIDAuMwogKiBEZXNjcmlwdGlvbjogICBHZW5lcmFsIHF1ZXVlIGltcGxlbWVudGF0aW9uCiAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgogKiBDcmVhdGVkIGF0OiAgICBUdWUgSnVuICA5IDEzOjI5OjMxIDE5OTgKICogTW9kaWZpZWQgYXQ6ICAgU3VuIERlYyAxMiAxMzo0ODoyMiAxOTk5CiAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KICogTW9kaWZpZWQgYXQ6ICAgVGh1IEphbiAgNCAxNDoyOToxMCBDRVQgMjAwMQogKiBNb2RpZmllZCBieTogICBNYXJjIFp5bmdpZXIgPG16eW5naWVyQGZyZWVzdXJmLmZyPgogKiAKICogICAgIENvcHlyaWdodCAoQykgMTk5OC0xOTk5LCBBYWdlIEt2YWxuZXMgPGFhZ2VAY3MudWl0Lm5vPgogKiAgICAgQ29weXJpZ2h0IChDKSAxOTk4LCBEYWcgQnJhdHRsaSwgCiAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiAgICAgVGhpcyBjb2RlIGlzIHRha2VuIGZyb20gdGhlIFZvcnRleCBPcGVyYXRpbmcgU3lzdGVtIHdyaXR0ZW4gYnkgQWFnZQogKiAgICAgS3ZhbG5lcy4gQWFnZSBoYXMgYWdyZWVkIHRoYXQgdGhpcyBjb2RlIGNhbiB1c2UgdGhlIEdQTCBsaWNlbmNlLAogKiAgICAgYWx0aG91Z2ggaGUgZG9lcyBub3QgdXNlIHRoYXQgbGljZW5jZSBpbiBoaXMgb3duIGNvZGUuCiAqICAgICAKICogICAgIFRoaXMgY29weXJpZ2h0IGRvZXMgaG93ZXZlciBfbm90XyBpbmNsdWRlIHRoZSBFTEYgaGFzaCgpIGZ1bmN0aW9uCiAqICAgICB3aGljaCBJIGN1cnJlbnRseSBkb24ndCBrbm93IHdoaWNoIGxpY2VuY2Ugb3IgY29weXJpZ2h0IGl0CiAqICAgICBoYXMuIFBsZWFzZSBpbmZvcm0gbWUgaWYgeW91IGtub3cuCiAqICAgICAgCiAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAogKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCiAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKiAgCiAqICAgICBOZWl0aGVyIERhZyBCcmF0dGxpIG5vciBVbml2ZXJzaXR5IG9mIFRyb21z+CBhZG1pdCBsaWFiaWxpdHkgbm9yCiAqICAgICBwcm92aWRlIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcyAKICogICAgIHByb3ZpZGVkICJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KICogICAgIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKgogKiBOT1RFIDoKICogVGhlcmUgYXJlIHZhcmlvdXMgcHJvYmxlbXMgd2l0aCB0aGlzIHBhY2thZ2UgOgogKglvIHRoZSBoYXNoIGZ1bmN0aW9uIGZvciBpbnRzIGlzIHBhdGhldGljIChidXQgY291bGQgYmUgY2hhbmdlZCkKICoJbyBsb2NraW5nIGlzIHNvbWV0aW1lIHN1c3BpY2lvdXMgKGVzcGVjaWFsbHkgZHVyaW5nIGVudW1lcmF0aW9uKQogKglvIG1vc3QgdXNlcnMgaGF2ZSBvbmx5IGEgZmV3IGVsZW1lbnRzICg9PSBvdmVyaGVhZCkKICoJbyBtb3N0IHVzZXJzIG5ldmVyIHVzZSBzZWFjaCwgc28gZG9uJ3QgYmVuZWZpdCBmcm9tIGhhc2hpbmcKICogUHJvYmxlbSBhbHJlYWR5IGZpeGVkIDoKICoJbyBub3QgNjQgYml0IGNvbXBsaWFudCAobW9zdCB1c2VycyBkbyBoYXNodiA9IChpbnQpIHNlbGYpCiAqCW8gaGFzaGJpbl9yZW1vdmUoKSBpcyBicm9rZW4gPT4gdXNlIGhhc2hiaW5fcmVtb3ZlX3RoaXMoKQogKiBJIHRoaW5rIG1vc3QgdXNlcnMgd291bGQgYmUgYmV0dGVyIHNlcnZlZCBieSBhIHNpbXBsZSBsaW5rZWQgbGlzdAogKiAobGlrZSBpbmNsdWRlL2xpbnV4L2xpc3QuaCkgd2l0aCBhIGdsb2JhbCBzcGlubG9jayBwZXIgbGlzdC4KICogSmVhbiBJSQogKi8KCi8qCiAqIE5vdGVzIG9uIHRoZSBjb25jdXJyZW50IGFjY2VzcyB0byBoYXNoYmluIGFuZCBvdGhlciBTTVAgaXNzdWVzCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICoJSGFzaGJpbnMgYXJlIHZlcnkgb2Z0ZW4gaW4gdGhlIElyREEgc3RhY2sgYSBnbG9iYWwgcmVwb3NpdG9yeSBvZgogKiBpbmZvcm1hdGlvbiwgYW5kIHRoZXJlZm9yZSB1c2VkIGluIGEgdmVyeSBhc3luY2hyb25vdXMgbWFubmVyIGZvbGxvd2luZwogKiB2YXJpb3VzIGV2ZW50cyAoZHJpdmVyIGNhbGxzLCB0aW1lcnMsIHVzZXIgY2FsbHMuLi4pLgogKglUaGVyZWZvcmUsIHZlcnkgb2Z0ZW4gaXQgaXMgaGlnaGx5IGltcG9ydGFudCB0byBjb25zaWRlciB0aGUKICogbWFuYWdlbWVudCBvZiBjb25jdXJyZW50IGFjY2VzcyB0byB0aGUgaGFzaGJpbiBhbmQgaG93IHRvIGd1YXJhbnRlZSB0aGUKICogY29uc2lzdGVuY3kgb2YgdGhlIG9wZXJhdGlvbnMgb24gaXQuCiAqCiAqCUZpcnN0LCB3ZSBuZWVkIHRvIGRlZmluZSB0aGUgb2JqZWN0aXZlIG9mIGxvY2tpbmcgOgogKgkJMSkgUHJvdGVjdCB1c2VyIGRhdGEgKGNvbnRlbnQgcG9pbnRlZCBieSB0aGUgaGFzaGJpbikKICoJCTIpIFByb3RlY3QgaGFzaGJpbiBzdHJ1Y3R1cmUgaXRzZWxmIChsaW5rZWQgbGlzdCBpbiBlYWNoIGJpbikKICoKICoJCQkgICAgIE9MRCBMT0NLSU5HCiAqCQkJICAgICAtLS0tLS0tLS0tLQogKgogKglUaGUgcHJldmlvdXMgbG9ja2luZyBzdHJhdGVneSwgZWl0aGVyIEhCX0xPQ0FMIG9yIEhCX0dMT0JBTCB3ZXJlCiAqIGJvdGggaW5hZGVxdWF0ZSBpbiAqYm90aCogYXNwZWN0LgogKgkJbyBIQl9HTE9CQUwgd2FzIHVzaW5nIGEgc3BpbmxvY2sgZm9yIGVhY2ggYmluIChsb2NhbCBsb2NraW5nKS4KICoJCW8gSEJfTE9DQUwgd2FzIGRpc2FibGluZyBpcnEgb24gKmFsbCogQ1BVcywgc28gdXNlIGEgc2luZ2xlCiAqCQkgIGdsb2JhbCBzZW1hcGhvcmUuCiAqCVRoZSBwcm9ibGVtcyB3ZXJlIDoKICoJCUEpIEdsb2JhbCBpcnEgZGlzYWJsaW5nIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQgYnkgdGhlIGtlcm5lbAogKgkJQikgTm8gcHJvdGVjdGlvbiBmb3IgdGhlIGhhc2hiaW4gc3RydWN0IGdsb2JhbCBkYXRhCiAqCQkJbyBoYXNoYmluX2RlbGV0ZSgpCiAqCQkJbyBoYl9jdXJyZW50CiAqCQlDKSBObyBwcm90ZWN0aW9uIGZvciB1c2VyIGRhdGEgaW4gc29tZSBjYXNlcwogKgogKglBKSBIQl9MT0NBTCB1c2UgZ2xvYmFsIGlycSBkaXNhYmxpbmcsIHNvIGRvZXNuJ3Qgd29yayBvbiBrZXJuZWwKICogMi41LlguIEV2ZW4gd2hlbiBpdCBpcyBzdXBwb3J0ZWQgKGtlcm5lbCAyLjQuWCBhbmQgZWFybGllciksIGl0cwogKiBwZXJmb3JtYW5jZSBpcyBub3Qgc2F0aXNmYWN0b3J5IG9uIFNNUCBzZXR1cHMuIE1vc3QgaGFzaGJpbnMgd2VyZQogKiBIQl9MT0NBTCwgc28gKEEpIGRlZmluaXRlbHkgbmVlZCBmaXhpbmcuCiAqCUIpIEhCX0xPQ0FMIGNvdWxkIGJlIG1vZGlmaWVkIHRvIGZpeCAoQikuIEhvd2V2ZXIsIGJlY2F1c2UgSEJfR0xPQkFMCiAqIGxvY2sgb25seSB0aGUgaW5kaXZpZHVhbCBiaW5zLCBpdCB3aWxsIG5ldmVyIGJlIGFibGUgdG8gbG9jayB0aGUKICogZ2xvYmFsIGRhdGEsIHNvIGNhbid0IGRvIChCKS4KICoJQykgU29tZSBmdW5jdGlvbnMgcmV0dXJuIHBvaW50ZXIgdG8gZGF0YSB0aGF0IGlzIHN0aWxsIGluIHRoZQogKiBoYXNoYmluIDoKICoJCW8gaGFzaGJpbl9maW5kKCkKICoJCW8gaGFzaGJpbl9nZXRfZmlyc3QoKQogKgkJbyBoYXNoYmluX2dldF9uZXh0KCkKICoJQXMgdGhlIGRhdGEgaXMgc3RpbGwgaW4gdGhlIGhhc2hiaW4sIGl0IG1heSBiZSBjaGFuZ2VkIG9yIGZyZWUnZAogKiB3aGlsZSB0aGUgY2FsbGVyIGlzIGV4YW1pbmltZyB0aGUgZGF0YS4gSW4gdGhvc2UgY2FzZSwgbG9ja2luZyBjYW4ndAogKiBiZSBkb25lIHdpdGhpbiB0aGUgaGFzaGJpbiwgYnV0IG11c3QgaW5jbHVkZSB1c2Ugb2YgdGhlIGRhdGEgd2l0aGluCiAqIHRoZSBjYWxsZXIuCiAqCVRoZSBjYWxsZXIgY2FuIGVhc2lseSBkbyB0aGlzIHdpdGggSEJfTE9DQUwgKGp1c3QgZGlzYWJsZSBpcnFzKS4KICogSG93ZXZlciwgdGhpcyBpcyBpbXBvc3NpYmxlIHdpdGggSEJfR0xPQkFMIGJlY2F1c2UgdGhlIGNhbGxlciBoYXMgbm8KICogd2F5IHRvIGtub3cgdGhlIHByb3BlciBiaW4sIHNvIGRvbid0IGtub3cgd2hpY2ggc3BpbmxvY2sgdG8gdXNlLgogKgogKglRdWljayBzdW1tYXJ5IDogY2FuIG5vIGxvbmdlciB1c2UgSEJfTE9DQUwsIGFuZCBIQl9HTE9CQUwgaXMKICogZnVuZGFtZW50YWxseSBicm9rZW4gYW5kIHdpbGwgbmV2ZXIgd29yay4KICoKICoJCQkgICAgIE5FVyBMT0NLSU5HCiAqCQkJICAgICAtLS0tLS0tLS0tLQogKgogKglUbyBmaXggdGhvc2UgcHJvYmxlbXMsIEkndmUgaW50cm9kdWNlIGEgZmV3IGNoYW5nZXMgaW4gdGhlCiAqIGhhc2hiaW4gbG9ja2luZyA6CiAqCQkxKSBOZXcgSEJfTE9DSyBzY2hlbWUKICoJCTIpIGhhc2hiaW4tPmhiX3NwaW5sb2NrCiAqCQkzKSBOZXcgaGFzaGJpbiB1c2FnZSBwb2xpY3kKICoKICogSEJfTE9DSyA6CiAqIC0tLS0tLS0KICoJSEJfTE9DSyBpcyBhIGxvY2tpbmcgc2NoZW1lIGludGVybWVkaWF0ZSBiZXR3ZWVuIHRoZSBvbGQgSEJfTE9DQUwKICogYW5kIEhCX0dMT0JBTC4gSXQgdXNlcyBhIHNpbmdsZSBzcGlubG9jayB0byBwcm90ZWN0IHRoZSB3aG9sZSBjb250ZW50CiAqIG9mIHRoZSBoYXNoYmluLiBBcyBpdCBpcyBhIHNpbmdsZSBzcGlubG9jaywgaXQgY2FuIHByb3RlY3QgdGhlIGdsb2JhbAogKiBkYXRhIG9mIHRoZSBoYXNoYmluIGFuZCBub3Qgb25seSB0aGUgYmlucyB0aGVtc2VsdmVzLgogKglIQl9MT0NLIGNhbiBvbmx5IHByb3RlY3Qgc29tZSBvZiB0aGUgaGFzaGJpbiBjYWxscywgc28gaXQgb25seSBsb2NrCiAqIGNhbGwgdGhhdCBjYW4gYmUgbWFkZSAxMDAlIHNhZmUgYW5kIGxlYXZlIG90aGVyIGNhbGwgdW5wcm90ZWN0ZWQuCiAqCUhCX0xPQ0sgaW4gdGhlb3J5IGlzIHNsb3dlciB0aGFuIEhCX0dMT0JBTCwgYnV0IGFzIHRoZSBoYXNoYmluCiAqIGNvbnRlbnQgaXMgYWx3YXlzIHNtYWxsIGNvbnRlbnRpb24gaXMgbm90IGhpZ2gsIHNvIGl0IGRvZXNuJ3QgbWF0dGVyCiAqIG11Y2guIEhCX0xPQ0sgaXMgcHJvYmFibHkgZmFzdGVyIHRoYW4gSEJfTE9DQUwuCiAqCiAqIGhhc2hiaW4tPmhiX3NwaW5sb2NrIDoKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0KICoJVGhlIHNwaW5sb2NrIHRoYXQgSEJfTE9DSyB1c2VzIGlzIGF2YWlsYWJsZSBmb3IgY2FsbGVyLCBzbyB0aGF0CiAqIHRoZSBjYWxsZXIgY2FuIHByb3RlY3QgdW5wcm90ZWN0ZWQgY2FsbHMgKHNlZSBiZWxvdykuCiAqCUlmIHRoZSBjYWxsZXIgd2FudCB0byBkbyBlbnRpcmVseSBpdHMgb3duIGxvY2tpbmcgKEhCX05PTE9DSyksIGhlCiAqIGNhbiBkbyBzbyBhbmQgbWF5IHVzZSBzYWZlbHkgdGhpcyBzcGlubG9jay4KICoJTG9ja2luZyBpcyBkb25lIGxpa2UgdGhpcyA6CiAqCQlzcGluX2xvY2tfaXJxc2F2ZSgmaGFzaGJpbi0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKICoJUmVsZWFzaW5nIHRoZSBsb2NrIDoKICoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhc2hiaW4tPmhiX3NwaW5sb2NrLCBmbGFncyk7CiAqCiAqIFNhZmUgJiBQcm90ZWN0ZWQgY2FsbHMgOgogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqCVRoZSBmb2xsb3dpbmcgY2FsbHMgYXJlIHNhZmUgb3IgcHJvdGVjdGVkIHZpYSBIQl9MT0NLIDoKICoJCW8gaGFzaGJpbl9uZXcoKQkJLT4gc2FmZQogKgkJbyBoYXNoYmluX2RlbGV0ZSgpCiAqCQlvIGhhc2hiaW5faW5zZXJ0KCkKICoJCW8gaGFzaGJpbl9yZW1vdmVfZmlyc3QoKQogKgkJbyBoYXNoYmluX3JlbW92ZSgpCiAqCQlvIGhhc2hiaW5fcmVtb3ZlX3RoaXMoKQogKgkJbyBIQVNIQklOX0dFVF9TSVpFKCkJLT4gYXRvbWljCiAqCiAqCVRoZSBmb2xsb3dpbmcgY2FsbHMgb25seSBwcm90ZWN0IHRoZSBoYXNoYmluIGl0c2VsZiA6CiAqCQlvIGhhc2hiaW5fbG9ja19maW5kKCkKICoJCW8gaGFzaGJpbl9maW5kX25leHQoKQogKgogKiBVbnByb3RlY3RlZCBjYWxscyA6CiAqIC0tLS0tLS0tLS0tLS0tLS0tCiAqCVRoZSBmb2xsb3dpbmcgY2FsbHMgbmVlZCB0byBiZSBwcm90ZWN0ZWQgYnkgdGhlIGNhbGxlciA6CiAqCQlvIGhhc2hiaW5fZmluZCgpCiAqCQlvIGhhc2hiaW5fZ2V0X2ZpcnN0KCkKICoJCW8gaGFzaGJpbl9nZXRfbmV4dCgpCiAqCiAqIExvY2tpbmcgUG9saWN5IDoKICogLS0tLS0tLS0tLS0tLS0KICoJSWYgdGhlIGhhc2hiaW4gaXMgdXNlZCBvbmx5IGluIGEgc2luZ2xlIHRocmVhZCBvZiBleGVjdXRpb24KICogKGV4cGxpY2l0bHkgb3IgaW1wbGljaXRlbHkpLCB5b3UgY2FuIHVzZSBIQl9OT0xPQ0sKICoJSWYgdGhlIGNhbGxpbmcgbW9kdWxlIGFscmVhZHkgcHJvdmlkZSBjb25jdXJyZW50IGFjY2VzcyBwcm90ZWN0aW9uLAogKiB5b3UgbWF5IHVzZSBIQl9OT0xPQ0suCiAqCiAqCUluIGFsbCBvdGhlciBjYXNlcywgeW91IG5lZWQgdG8gdXNlIEhCX0xPQ0sgYW5kIGxvY2sgdGhlIGhhc2hiaW4KICogZXZlcnkgdGltZSBiZWZvcmUgY2FsbGluZyBvbmUgb2YgdGhlIHVucHJvdGVjdGVkIGNhbGxzLiBZb3UgYWxzbyBtdXN0CiAqIHVzZSB0aGUgcG9pbnRlciByZXR1cm5lZCBieSB0aGUgdW5wcm90ZWN0ZWQgY2FsbCB3aXRoaW4gdGhlIGxvY2tlZAogKiByZWdpb24uCiAqCiAqIEV4dHJhIGNhcmUgZm9yIGVudW1lcmF0aW9uIDoKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICoJaGFzaGJpbl9nZXRfZmlyc3QoKSBhbmQgaGFzaGJpbl9nZXRfbmV4dCgpIHVzZSB0aGUgaGFzaGJpbiB0bwogKiBzdG9yZSB0aGUgY3VycmVudCBwb3NpdGlvbiwgaW4gaGJfY3VycmVudC4KICoJQXMgbG9uZyBhcyB0aGUgaGFzaGJpbiByZW1haW5zIGxvY2tlZCwgdGhpcyBpcyBzYWZlLiBJZiB5b3UgdW5sb2NrCiAqIHRoZSBoYXNoYmluLCB0aGUgY3VycmVudCBwb3NpdGlvbiBtYXkgY2hhbmdlIGlmIGFueWJvZHkgZWxzZSBtb2RpZnkKICogb3IgZW51bWVyYXRlIHRoZSBoYXNoYmluLgogKglTdW1tYXJ5IDogZG8gdGhlIGZ1bGwgZW51bWVyYXRpb24gd2hpbGUgbG9ja2VkLgogKgogKglBbHRlcm5hdGl2ZWx5LCB5b3UgbWF5IHVzZSBoYXNoYmluX2ZpbmRfbmV4dCgpLiBCdXQsIHRoaXMgd2lsbAogKiBiZSBzbG93ZXIsIGlzIG1vcmUgY29tcGxleCB0byB1c2UgYW5kIGRvZXNuJ3QgcHJvdGVjdCB0aGUgaGFzaGJpbgogKiBjb250ZW50LiBTbywgY2FyZSBpcyBuZWVkZWQgaGVyZSBhcyB3ZWxsLgogKgogKiBPdGhlciBpc3N1ZXMgOgogKiAtLS0tLS0tLS0tLS0KICoJSSBiZWxpZXZlIHRoYXQgd2UgYXJlIG92ZXJkb2luZyBpdCBieSB1c2luZyBzcGluX2xvY2tfaXJxc2F2ZSgpCiAqIGFuZCB3ZSBzaG91bGQgdXNlIG9ubHkgc3Bpbl9sb2NrX2JoKCkgb3Igc2ltaWxhci4gQnV0LCBJIGRvbid0IGhhdmUKICogdGhlIGJhbGxzIHRvIHRyeSBpdCBvdXQuCiAqCURvbid0IGJlbGlldmUgdGhhdCBiZWNhdXNlIGhhc2hiaW4gYXJlIG5vdyAoc29tZXdoYXQpIFNNUCBzYWZlCiAqIHRoYXQgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgaXMuIEhpZ2hlciBsYXllcnMgdGVuZCB0byBiZSBzYWZlc3QsCiAqIGJ1dCBMQVAgYW5kIExNUCB3b3VsZCBuZWVkIHNvbWUgc2VyaW91cyBkZWRpY2F0ZWQgbG92ZS4KICoKICogSmVhbiBJSQogKi8KI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgoKI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KI2luY2x1ZGUgPG5ldC9pcmRhL2lycXVldWUuaD4KCi8qKioqKioqKioqKioqKioqKioqKioqKiogUVVFVUUgU1VCUk9VVElORVMgKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoKICogSGFzaGJpbgogKi8KI2RlZmluZSBHRVRfSEFTSEJJTih4KSAoIHggJiBIQVNIQklOX01BU0sgKQoKLyoKICogRnVuY3Rpb24gaGFzaCAobmFtZSkKICoKICogICAgVGhpcyBmdW5jdGlvbiBoYXNoIHRoZSBpbnB1dCBzdHJpbmcgJ25hbWUnIHVzaW5nIHRoZSBFTEYgaGFzaAogKiAgICBmdW5jdGlvbiBmb3Igc3RyaW5ncy4KICovCnN0YXRpYyBfX3UzMiBoYXNoKCBjb25zdCBjaGFyKiBuYW1lKQp7CglfX3UzMiBoID0gMDsKCV9fdTMyIGc7CgkKCXdoaWxlKCpuYW1lKSB7CgkJaCA9IChoPDw0KSArICpuYW1lKys7CgkJaWYgKChnID0gKGggJiAweGYwMDAwMDAwKSkpCgkJCWggXj1nPj4yNDsKCQloICY9fmc7Cgl9CglyZXR1cm4gaDsKfQoKLyoKICogRnVuY3Rpb24gZW5xdWV1ZV9maXJzdCAocXVldWUsIHByb2MpCiAqCiAqICAgIEluc2VydCBpdGVtIGZpcnN0IGluIHF1ZXVlLgogKgogKi8Kc3RhdGljIHZvaWQgZW5xdWV1ZV9maXJzdChpcmRhX3F1ZXVlX3QgKipxdWV1ZSwgaXJkYV9xdWV1ZV90KiBlbGVtZW50KQp7CgkKCUlSREFfREVCVUcoIDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwoKCS8qCgkgKiBDaGVjayBpZiBxdWV1ZSBpcyBlbXB0eS4KCSAqLwoJaWYgKCAqcXVldWUgPT0gTlVMTCApIHsKCQkvKgoJCSAqIFF1ZXVlIGlzIGVtcHR5LiAgSW5zZXJ0IG9uZSBlbGVtZW50IGludG8gdGhlIHF1ZXVlLgoJCSAqLwoJCWVsZW1lbnQtPnFfbmV4dCA9IGVsZW1lbnQtPnFfcHJldiA9ICpxdWV1ZSA9IGVsZW1lbnQ7CgkJCgl9IGVsc2UgewoJCS8qCgkJICogUXVldWUgaXMgbm90IGVtcHR5LiAgSW5zZXJ0IGVsZW1lbnQgaW50byBmcm9udCBvZiBxdWV1ZS4KCQkgKi8KCQllbGVtZW50LT5xX25leHQgICAgICAgICAgPSAoKnF1ZXVlKTsKCQkoKnF1ZXVlKS0+cV9wcmV2LT5xX25leHQgPSBlbGVtZW50OwoJCWVsZW1lbnQtPnFfcHJldiAgICAgICAgICA9ICgqcXVldWUpLT5xX3ByZXY7CgkJKCpxdWV1ZSktPnFfcHJldiAgICAgICAgID0gZWxlbWVudDsKCQkoKnF1ZXVlKSAgICAgICAgICAgICAgICAgPSBlbGVtZW50OwoJfQp9CgoKLyoKICogRnVuY3Rpb24gZGVxdWV1ZSAocXVldWUpCiAqCiAqICAgIFJlbW92ZSBmaXJzdCBlbnRyeSBpbiBxdWV1ZQogKgogKi8Kc3RhdGljIGlyZGFfcXVldWVfdCAqZGVxdWV1ZV9maXJzdChpcmRhX3F1ZXVlX3QgKipxdWV1ZSkKewoJaXJkYV9xdWV1ZV90ICpyZXQ7CgoJSVJEQV9ERUJVRyggNCwgImRlcXVldWVfZmlyc3QoKVxuIik7CgkKCS8qCgkgKiBTZXQgcmV0dXJuIHZhbHVlCgkgKi8KCXJldCA9ICAqcXVldWU7CgkKCWlmICggKnF1ZXVlID09IE5VTEwgKSB7CgkJLyoKCQkgKiBRdWV1ZSB3YXMgZW1wdHkuCgkJICovCgl9IGVsc2UgaWYgKCAoKnF1ZXVlKS0+cV9uZXh0ID09ICpxdWV1ZSApIHsKCQkvKiAKCQkgKiAgUXVldWUgb25seSBjb250YWluZWQgYSBzaW5nbGUgZWxlbWVudC4gSXQgd2lsbCBub3cgYmUKCQkgKiAgZW1wdHkuICAKCQkgKi8KCQkqcXVldWUgPSBOVUxMOwoJfSBlbHNlIHsKCQkvKgoJCSAqIFF1ZXVlIGNvbnRhaW5lZCBzZXZlcmFsIGVsZW1lbnQuICBSZW1vdmUgdGhlIGZpcnN0IG9uZS4KCQkgKi8KCQkoKnF1ZXVlKS0+cV9wcmV2LT5xX25leHQgPSAoKnF1ZXVlKS0+cV9uZXh0OwoJCSgqcXVldWUpLT5xX25leHQtPnFfcHJldiA9ICgqcXVldWUpLT5xX3ByZXY7CgkJKnF1ZXVlID0gKCpxdWV1ZSktPnFfbmV4dDsKCX0KCQoJLyoKCSAqIFJldHVybiB0aGUgcmVtb3ZlZCBlbnRyeSAob3IgTlVMTCBvZiBxdWV1ZSB3YXMgZW1wdHkpLgoJICovCglyZXR1cm4gcmV0Owp9CgovKgogKiBGdW5jdGlvbiBkZXF1ZXVlX2dlbmVyYWwgKHF1ZXVlLCBlbGVtZW50KQogKgogKgogKi8Kc3RhdGljIGlyZGFfcXVldWVfdCAqZGVxdWV1ZV9nZW5lcmFsKGlyZGFfcXVldWVfdCAqKnF1ZXVlLCBpcmRhX3F1ZXVlX3QqIGVsZW1lbnQpCnsKCWlyZGFfcXVldWVfdCAqcmV0OwoJCglJUkRBX0RFQlVHKCA0LCAiZGVxdWV1ZV9nZW5lcmFsKClcbiIpOwoJCgkvKgoJICogU2V0IHJldHVybiB2YWx1ZQoJICovCglyZXQgPSAgKnF1ZXVlOwoJCQoJaWYgKCAqcXVldWUgPT0gTlVMTCApIHsKCQkvKgoJCSAqIFF1ZXVlIHdhcyBlbXB0eS4KCQkgKi8KCX0gZWxzZSBpZiAoICgqcXVldWUpLT5xX25leHQgPT0gKnF1ZXVlICkgewoJCS8qIAoJCSAqICBRdWV1ZSBvbmx5IGNvbnRhaW5lZCBhIHNpbmdsZSBlbGVtZW50LiBJdCB3aWxsIG5vdyBiZQoJCSAqICBlbXB0eS4gIAoJCSAqLwoJCSpxdWV1ZSA9IE5VTEw7CgkJCgl9IGVsc2UgewoJCS8qCgkJICogIFJlbW92ZSBzcGVjaWZpYyBlbGVtZW50LgoJCSAqLwoJCWVsZW1lbnQtPnFfcHJldi0+cV9uZXh0ID0gZWxlbWVudC0+cV9uZXh0OwoJCWVsZW1lbnQtPnFfbmV4dC0+cV9wcmV2ID0gZWxlbWVudC0+cV9wcmV2OwoJCWlmICggKCpxdWV1ZSkgPT0gZWxlbWVudCkKCQkJKCpxdWV1ZSkgPSBlbGVtZW50LT5xX25leHQ7Cgl9CgkKCS8qCgkgKiBSZXR1cm4gdGhlIHJlbW92ZWQgZW50cnkgKG9yIE5VTEwgb2YgcXVldWUgd2FzIGVtcHR5KS4KCSAqLwoJcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKiBIQVNIQklOIE1BTkFHRU1FTlQgKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoKICogRnVuY3Rpb24gaGFzaGJpbl9jcmVhdGUgKCB0eXBlLCBuYW1lICkKICoKICogICAgQ3JlYXRlIGhhc2hiaW4hCiAqCiAqLwpoYXNoYmluX3QgKmhhc2hiaW5fbmV3KGludCB0eXBlKQp7CgloYXNoYmluX3QqIGhhc2hiaW47CgkKCS8qCgkgKiBBbGxvY2F0ZSBuZXcgaGFzaGJpbgoJICovCgloYXNoYmluID0ga21hbGxvYyggc2l6ZW9mKGhhc2hiaW5fdCksIEdGUF9BVE9NSUMpOwoJaWYgKCFoYXNoYmluKQoJCXJldHVybiBOVUxMOwoKCS8qCgkgKiBJbml0aWFsaXplIHN0cnVjdHVyZQoJICovCgltZW1zZXQoaGFzaGJpbiwgMCwgc2l6ZW9mKGhhc2hiaW5fdCkpOwoJaGFzaGJpbi0+aGJfdHlwZSA9IHR5cGU7CgloYXNoYmluLT5tYWdpYyA9IEhCX01BR0lDOwoJLy9oYXNoYmluLT5oYl9jdXJyZW50ID0gTlVMTDsKCgkvKiBNYWtlIHN1cmUgYWxsIHNwaW5sb2NrJ3MgYXJlIHVubG9ja2VkICovCglpZiAoIGhhc2hiaW4tPmhiX3R5cGUgJiBIQl9MT0NLICkgewoJCXNwaW5fbG9ja19pbml0KCZoYXNoYmluLT5oYl9zcGlubG9jayk7Cgl9CgoJcmV0dXJuIGhhc2hiaW47Cn0KRVhQT1JUX1NZTUJPTChoYXNoYmluX25ldyk7CgoKLyoKICogRnVuY3Rpb24gaGFzaGJpbl9kZWxldGUgKGhhc2hiaW4sIGZyZWVfZnVuYykKICoKICogICAgRGVzdHJveSBoYXNoYmluLCB0aGUgZnJlZV9mdW5jIGNhbiBiZSBhIHVzZXIgc3VwcGxpZWQgc3BlY2lhbCByb3V0aW5lIAogKiAgICBmb3IgZGVhbGxvY2F0aW5nIHRoaXMgc3RydWN0dXJlIGlmIGl0J3MgY29tcGxleC4gSWYgbm90IHRoZSB1c2VyIGNhbiAKICogICAganVzdCBzdXBwbHkga2ZyZWUsIHdoaWNoIHNob3VsZCB0YWtlIGNhcmUgb2YgdGhlIGpvYi4KICovCmludCBoYXNoYmluX2RlbGV0ZSggaGFzaGJpbl90KiBoYXNoYmluLCBGUkVFX0ZVTkMgZnJlZV9mdW5jKQp7CglpcmRhX3F1ZXVlX3QqIHF1ZXVlOwoJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CglpbnQgaTsKCglJUkRBX0FTU0VSVChoYXNoYmluICE9IE5VTEwsIHJldHVybiAtMTspOwoJSVJEQV9BU1NFUlQoaGFzaGJpbi0+bWFnaWMgPT0gSEJfTUFHSUMsIHJldHVybiAtMTspOwoJCgkvKiBTeW5jaHJvbml6ZSAqLwoJaWYgKCBoYXNoYmluLT5oYl90eXBlICYgSEJfTE9DSyApIHsKCQlzcGluX2xvY2tfaXJxc2F2ZSgmaGFzaGJpbi0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKCX0KCgkvKgoJICogIEZyZWUgdGhlIGVudHJpZXMgaW4gdGhlIGhhc2hiaW4sIFRPRE86IHVzZSBoYXNoYmluX2NsZWFyIHdoZW4KCSAqICBpdCBoYXMgYmVlbiBzaG93biB0byB3b3JrCgkgKi8KCWZvciAoaSA9IDA7IGkgPCBIQVNIQklOX1NJWkU7IGkgKysgKSB7CgkJcXVldWUgPSBkZXF1ZXVlX2ZpcnN0KChpcmRhX3F1ZXVlX3QqKikgJmhhc2hiaW4tPmhiX3F1ZXVlW2ldKTsKCQl3aGlsZSAocXVldWUgKSB7CgkJCWlmIChmcmVlX2Z1bmMpCgkJCQkoKmZyZWVfZnVuYykocXVldWUpOwoJCQlxdWV1ZSA9IGRlcXVldWVfZmlyc3QoIAoJCQkJKGlyZGFfcXVldWVfdCoqKSAmaGFzaGJpbi0+aGJfcXVldWVbaV0pOwoJCX0KCX0KCQoJLyogQ2xlYW51cCBsb2NhbCBkYXRhICovCgloYXNoYmluLT5oYl9jdXJyZW50ID0gTlVMTDsKCWhhc2hiaW4tPm1hZ2ljID0gfkhCX01BR0lDOwoKCS8qIFJlbGVhc2UgbG9jayAqLwoJaWYgKCBoYXNoYmluLT5oYl90eXBlICYgSEJfTE9DSykgewoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhc2hiaW4tPmhiX3NwaW5sb2NrLCBmbGFncyk7Cgl9CgoJLyoKCSAqICBGcmVlIHRoZSBoYXNoYmluIHN0cnVjdHVyZQoJICovCglrZnJlZShoYXNoYmluKTsKCglyZXR1cm4gMDsKfQpFWFBPUlRfU1lNQk9MKGhhc2hiaW5fZGVsZXRlKTsKCi8qKioqKioqKioqKioqKioqKioqKiogSEFTSEJJTiBMSVNUIE9QRVJBVElPTlMgKioqKioqKioqKioqKioqKioqKioqLwoKLyoKICogRnVuY3Rpb24gaGFzaGJpbl9pbnNlcnQgKGhhc2hiaW4sIGVudHJ5LCBuYW1lKQogKgogKiAgICBJbnNlcnQgYW4gZW50cnkgaW50byB0aGUgaGFzaGJpbgogKgogKi8Kdm9pZCBoYXNoYmluX2luc2VydChoYXNoYmluX3QqIGhhc2hiaW4sIGlyZGFfcXVldWVfdCogZW50cnksIGxvbmcgaGFzaHYsIAoJCSAgICBjb25zdCBjaGFyKiBuYW1lKQp7Cgl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKCWludCBiaW47CgoJSVJEQV9ERUJVRyggNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CgoJSVJEQV9BU1NFUlQoIGhhc2hiaW4gIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVCggaGFzaGJpbi0+bWFnaWMgPT0gSEJfTUFHSUMsIHJldHVybjspOwoKCS8qCgkgKiBMb2NhdGUgaGFzaGJpbgoJICovCglpZiAoIG5hbWUgKQoJCWhhc2h2ID0gaGFzaCggbmFtZSApOwoJYmluID0gR0VUX0hBU0hCSU4oIGhhc2h2ICk7CgoJLyogU3luY2hyb25pemUgKi8KCWlmICggaGFzaGJpbi0+aGJfdHlwZSAmIEhCX0xPQ0sgKSB7CgkJc3Bpbl9sb2NrX2lycXNhdmUoJmhhc2hiaW4tPmhiX3NwaW5sb2NrLCBmbGFncyk7Cgl9IC8qIERlZmF1bHQgaXMgbm8tbG9jayAgKi8KCQoJLyoKCSAqIFN0b3JlIG5hbWUgYW5kIGtleQoJICovCgllbnRyeS0+cV9oYXNoID0gaGFzaHY7CglpZiAoIG5hbWUgKQoJCXN0cmxjcHkoIGVudHJ5LT5xX25hbWUsIG5hbWUsIHNpemVvZihlbnRyeS0+cV9uYW1lKSk7CgkKCS8qCgkgKiBJbnNlcnQgbmV3IGVudHJ5IGZpcnN0CgkgKi8KCWVucXVldWVfZmlyc3QoIChpcmRhX3F1ZXVlX3QqKikgJmhhc2hiaW4tPmhiX3F1ZXVlWyBiaW4gXSwKCQkgICAgICAgZW50cnkpOwoJaGFzaGJpbi0+aGJfc2l6ZSsrOwoKCS8qIFJlbGVhc2UgbG9jayAqLwoJaWYgKCBoYXNoYmluLT5oYl90eXBlICYgSEJfTE9DSyApIHsKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYXNoYmluLT5oYl9zcGlubG9jaywgZmxhZ3MpOwoJfSAvKiBEZWZhdWx0IGlzIG5vLWxvY2sgICovCn0KRVhQT1JUX1NZTUJPTChoYXNoYmluX2luc2VydCk7CgovKiAKICogIEZ1bmN0aW9uIGhhc2hiaW5fcmVtb3ZlX2ZpcnN0IChoYXNoYmluKQogKgogKiAgICBSZW1vdmUgZmlyc3QgZW50cnkgb2YgdGhlIGhhc2hiaW4KICoKICogTm90ZSA6IHRoaXMgZnVuY3Rpb24gbm8gbG9uZ2VyIHVzZSBoYXNoYmluX3JlbW92ZSgpLCBidXQgZG9lcyB0aGluZ3MKICogc2ltaWxhciB0byBoYXNoYmluX3JlbW92ZV90aGlzKCksIHNvIGNhbiBiZSBjb25zaWRlcmVkIHNhZmUuCiAqIEplYW4gSUkKICovCnZvaWQgKmhhc2hiaW5fcmVtb3ZlX2ZpcnN0KCBoYXNoYmluX3QgKmhhc2hiaW4pCnsKCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwoJaXJkYV9xdWV1ZV90ICplbnRyeSA9IE5VTEw7CgoJLyogU3luY2hyb25pemUgKi8KCWlmICggaGFzaGJpbi0+aGJfdHlwZSAmIEhCX0xPQ0sgKSB7CgkJc3Bpbl9sb2NrX2lycXNhdmUoJmhhc2hiaW4tPmhiX3NwaW5sb2NrLCBmbGFncyk7Cgl9IC8qIERlZmF1bHQgaXMgbm8tbG9jayAgKi8KCgllbnRyeSA9IGhhc2hiaW5fZ2V0X2ZpcnN0KCBoYXNoYmluKTsKCWlmICggZW50cnkgIT0gTlVMTCkgewoJCWludAliaW47CgkJbG9uZwloYXNodjsKCQkvKgoJCSAqIExvY2F0ZSBoYXNoYmluCgkJICovCgkJaGFzaHYgPSBlbnRyeS0+cV9oYXNoOwoJCWJpbiA9IEdFVF9IQVNIQklOKCBoYXNodiApOwoKCQkvKgoJCSAqIERlcXVldWUgdGhlIGVudHJ5Li4uCgkJICovCgkJZGVxdWV1ZV9nZW5lcmFsKCAoaXJkYV9xdWV1ZV90KiopICZoYXNoYmluLT5oYl9xdWV1ZVsgYmluIF0sCgkJCQkgKGlyZGFfcXVldWVfdCopIGVudHJ5ICk7CgkJaGFzaGJpbi0+aGJfc2l6ZS0tOwoJCWVudHJ5LT5xX25leHQgPSBOVUxMOwoJCWVudHJ5LT5xX3ByZXYgPSBOVUxMOwoKCQkvKgoJCSAqICBDaGVjayBpZiB0aGlzIGl0ZW0gaXMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtLCBhbmQgaW4KCQkgKiAgdGhhdCBjYXNlIHdlIG11c3QgcmVzZXQgaGJfY3VycmVudAoJCSAqLwoJCWlmICggZW50cnkgPT0gaGFzaGJpbi0+aGJfY3VycmVudCkKCQkJaGFzaGJpbi0+aGJfY3VycmVudCA9IE5VTEw7Cgl9CgoJLyogUmVsZWFzZSBsb2NrICovCglpZiAoIGhhc2hiaW4tPmhiX3R5cGUgJiBIQl9MT0NLICkgewoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhc2hiaW4tPmhiX3NwaW5sb2NrLCBmbGFncyk7Cgl9IC8qIERlZmF1bHQgaXMgbm8tbG9jayAgKi8KCglyZXR1cm4gZW50cnk7Cn0KCgovKiAKICogIEZ1bmN0aW9uIGhhc2hiaW5fcmVtb3ZlIChoYXNoYmluLCBoYXNodiwgbmFtZSkKICoKICogICAgUmVtb3ZlIGVudHJ5IHdpdGggdGhlIGdpdmVuIG5hbWUKICoKICogIFRoZSB1c2Ugb2YgdGhpcyBmdW5jdGlvbiBpcyBoaWdobHkgZGlzY291cmFnZWQsIGJlY2F1c2UgdGhlIHdob2xlCiAqICBjb25jZXB0IGJlaGluZCBoYXNoYmluX3JlbW92ZSgpIGlzIGJyb2tlbi4gSW4gbWFueSBjYXNlcywgaXQncyBub3QKICogIHBvc3NpYmxlIHRvIGd1YXJhbnRlZSB0aGUgdW5pY2l0eSBvZiB0aGUgaW5kZXggKGVpdGhlciBoYXNodiBvciBuYW1lKSwKICogIGxlYWRpbmcgdG8gcmVtb3ZpbmcgdGhlIFdST05HIGVudHJ5LgogKiAgVGhlIG9ubHkgc2ltcGxlIHNhZmUgdXNlIGlzIDoKICoJCWhhc2hiaW5fcmVtb3ZlKGhhc2JpbiwgKGludCkgc2VsZiwgTlVMTCk7CiAqICBJbiBvdGhlciBjYXNlLCB5b3UgbXVzdCB0aGluayBoYXJkIHRvIGd1YXJhbnRlZSB1bmljaXR5IG9mIHRoZSBpbmRleC4KICogIEplYW4gSUkKICovCnZvaWQqIGhhc2hiaW5fcmVtb3ZlKCBoYXNoYmluX3QqIGhhc2hiaW4sIGxvbmcgaGFzaHYsIGNvbnN0IGNoYXIqIG5hbWUpCnsKCWludCBiaW4sIGZvdW5kID0gRkFMU0U7Cgl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKCWlyZGFfcXVldWVfdCogZW50cnk7CgoJSVJEQV9ERUJVRyggNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CgoJSVJEQV9BU1NFUlQoIGhhc2hiaW4gIT0gTlVMTCwgcmV0dXJuIE5VTEw7KTsKCUlSREFfQVNTRVJUKCBoYXNoYmluLT5tYWdpYyA9PSBIQl9NQUdJQywgcmV0dXJuIE5VTEw7KTsKCQoJLyoKCSAqIExvY2F0ZSBoYXNoYmluCgkgKi8KCWlmICggbmFtZSApCgkJaGFzaHYgPSBoYXNoKCBuYW1lICk7CgliaW4gPSBHRVRfSEFTSEJJTiggaGFzaHYgKTsKCgkvKiBTeW5jaHJvbml6ZSAqLwoJaWYgKCBoYXNoYmluLT5oYl90eXBlICYgSEJfTE9DSyApIHsKCQlzcGluX2xvY2tfaXJxc2F2ZSgmaGFzaGJpbi0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKCX0gLyogRGVmYXVsdCBpcyBuby1sb2NrICAqLwoKCS8qCgkgKiBTZWFyY2ggZm9yIGVudHJ5CgkgKi8KCWVudHJ5ID0gaGFzaGJpbi0+aGJfcXVldWVbIGJpbiBdOwoJaWYgKCBlbnRyeSApIHsKCQlkbyB7CgkJCS8qCgkJCSAqIENoZWNrIGZvciBrZXkKCQkJICovCgkJCWlmICggZW50cnktPnFfaGFzaCA9PSBoYXNodiApIHsKCQkJCS8qCgkJCQkgKiBOYW1lIGNvbXBhcmUgdG9vPwoJCQkJICovCgkJCQlpZiAoIG5hbWUgKSB7CgkJCQkJaWYgKCBzdHJjbXAoIGVudHJ5LT5xX25hbWUsIG5hbWUpID09IDApCgkJCQkJewoJCQkJCQlmb3VuZCA9IFRSVUU7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJZm91bmQgPSBUUlVFOwoJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgkJCWVudHJ5ID0gZW50cnktPnFfbmV4dDsKCQl9IHdoaWxlICggZW50cnkgIT0gaGFzaGJpbi0+aGJfcXVldWVbIGJpbiBdICk7Cgl9CgkKCS8qCgkgKiBJZiBlbnRyeSB3YXMgZm91bmQsIGRlcXVldWUgaXQKCSAqLwoJaWYgKCBmb3VuZCApIHsKCQlkZXF1ZXVlX2dlbmVyYWwoIChpcmRhX3F1ZXVlX3QqKikgJmhhc2hiaW4tPmhiX3F1ZXVlWyBiaW4gXSwKCQkJCSAoaXJkYV9xdWV1ZV90KikgZW50cnkgKTsKCQloYXNoYmluLT5oYl9zaXplLS07CgoJCS8qCgkJICogIENoZWNrIGlmIHRoaXMgaXRlbSBpcyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGl0ZW0sIGFuZCBpbgoJCSAqICB0aGF0IGNhc2Ugd2UgbXVzdCByZXNldCBoYl9jdXJyZW50CgkJICovCgkJaWYgKCBlbnRyeSA9PSBoYXNoYmluLT5oYl9jdXJyZW50KQoJCQloYXNoYmluLT5oYl9jdXJyZW50ID0gTlVMTDsKCX0KCgkvKiBSZWxlYXNlIGxvY2sgKi8KCWlmICggaGFzaGJpbi0+aGJfdHlwZSAmIEhCX0xPQ0sgKSB7CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGFzaGJpbi0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKCX0gLyogRGVmYXVsdCBpcyBuby1sb2NrICAqLwogICAgICAgCgkKCS8qIFJldHVybiAqLwoJaWYgKCBmb3VuZCApIAoJCXJldHVybiBlbnRyeTsKCWVsc2UKCQlyZXR1cm4gTlVMTDsKCQp9CkVYUE9SVF9TWU1CT0woaGFzaGJpbl9yZW1vdmUpOwoKLyogCiAqICBGdW5jdGlvbiBoYXNoYmluX3JlbW92ZV90aGlzIChoYXNoYmluLCBlbnRyeSkKICoKICogICAgUmVtb3ZlIGVudHJ5IHdpdGggdGhlIGdpdmVuIG5hbWUKICoKICogSW4gc29tZSBjYXNlcywgdGhlIHVzZXIgb2YgaGFzaGJpbiBjYW4ndCBndWFyYW50ZWUgdGhlIHVuaWNpdHkKICogb2YgZWl0aGVyIHRoZSBoYXNodiBvciBuYW1lLgogKiBJbiB0aG9zZSBjYXNlcywgdXNpbmcgdGhlIGFib3ZlIGZ1bmN0aW9uIGlzIGd1YXJhbnRlZWQgdG8gY2F1c2UgdHJvdWJsZXMsCiAqIHNvIHdlIHVzZSB0aGlzIG9uZSBpbnN0ZWFkLi4uCiAqIEFuZCBieSB0aGUgd2F5LCBpdCdzIGFsc28gZmFzdGVyLCBiZWNhdXNlIHdlIHNraXAgdGhlIHNlYXJjaCBwaGFzZSA7LSkKICovCnZvaWQqIGhhc2hiaW5fcmVtb3ZlX3RoaXMoIGhhc2hiaW5fdCogaGFzaGJpbiwgaXJkYV9xdWV1ZV90KiBlbnRyeSkKewoJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CglpbnQJYmluOwoJbG9uZwloYXNodjsKCglJUkRBX0RFQlVHKCA0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKCglJUkRBX0FTU0VSVCggaGFzaGJpbiAhPSBOVUxMLCByZXR1cm4gTlVMTDspOwoJSVJEQV9BU1NFUlQoIGhhc2hiaW4tPm1hZ2ljID09IEhCX01BR0lDLCByZXR1cm4gTlVMTDspOwoJSVJEQV9BU1NFUlQoIGVudHJ5ICE9IE5VTEwsIHJldHVybiBOVUxMOyk7CgkKCS8qIFN5bmNocm9uaXplICovCglpZiAoIGhhc2hiaW4tPmhiX3R5cGUgJiBIQl9MT0NLICkgewoJCXNwaW5fbG9ja19pcnFzYXZlKCZoYXNoYmluLT5oYl9zcGlubG9jaywgZmxhZ3MpOwoJfSAvKiBEZWZhdWx0IGlzIG5vLWxvY2sgICovCgoJLyogQ2hlY2sgaWYgdmFsaWQgYW5kIG5vdCBhbHJlYWR5IHJlbW92ZWQuLi4gKi8KCWlmKChlbnRyeS0+cV9uZXh0ID09IE5VTEwpIHx8IChlbnRyeS0+cV9wcmV2ID09IE5VTEwpKSB7CgkJZW50cnkgPSBOVUxMOwoJCWdvdG8gb3V0OwoJfQoKCS8qCgkgKiBMb2NhdGUgaGFzaGJpbgoJICovCgloYXNodiA9IGVudHJ5LT5xX2hhc2g7CgliaW4gPSBHRVRfSEFTSEJJTiggaGFzaHYgKTsKCgkvKgoJICogRGVxdWV1ZSB0aGUgZW50cnkuLi4KCSAqLwoJZGVxdWV1ZV9nZW5lcmFsKCAoaXJkYV9xdWV1ZV90KiopICZoYXNoYmluLT5oYl9xdWV1ZVsgYmluIF0sCgkJCSAoaXJkYV9xdWV1ZV90KikgZW50cnkgKTsKCWhhc2hiaW4tPmhiX3NpemUtLTsKCWVudHJ5LT5xX25leHQgPSBOVUxMOwoJZW50cnktPnFfcHJldiA9IE5VTEw7CgoJLyoKCSAqICBDaGVjayBpZiB0aGlzIGl0ZW0gaXMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtLCBhbmQgaW4KCSAqICB0aGF0IGNhc2Ugd2UgbXVzdCByZXNldCBoYl9jdXJyZW50CgkgKi8KCWlmICggZW50cnkgPT0gaGFzaGJpbi0+aGJfY3VycmVudCkKCQloYXNoYmluLT5oYl9jdXJyZW50ID0gTlVMTDsKb3V0OgoJLyogUmVsZWFzZSBsb2NrICovCglpZiAoIGhhc2hiaW4tPmhiX3R5cGUgJiBIQl9MT0NLICkgewoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhc2hiaW4tPmhiX3NwaW5sb2NrLCBmbGFncyk7Cgl9IC8qIERlZmF1bHQgaXMgbm8tbG9jayAgKi8KCglyZXR1cm4gZW50cnk7Cn0KRVhQT1JUX1NZTUJPTChoYXNoYmluX3JlbW92ZV90aGlzKTsKCi8qKioqKioqKioqKioqKioqKioqKioqKiBIQVNIQklOIEVOVU1FUkFUSU9OICoqKioqKioqKioqKioqKioqKioqKioqLwoKLyoKICogRnVuY3Rpb24gaGFzaGJpbl9jb21tb25fZmluZCAoaGFzaGJpbiwgaGFzaHYsIG5hbWUpCiAqCiAqICAgIEZpbmQgaXRlbSB3aXRoIHRoZSBnaXZlbiBoYXNodiBvciBuYW1lCiAqCiAqLwp2b2lkKiBoYXNoYmluX2ZpbmQoIGhhc2hiaW5fdCogaGFzaGJpbiwgbG9uZyBoYXNodiwgY29uc3QgY2hhciogbmFtZSApCnsKCWludCBiaW47CglpcmRhX3F1ZXVlX3QqIGVudHJ5OwoKCUlSREFfREVCVUcoIDQsICJoYXNoYmluX2ZpbmQoKVxuIik7CgoJSVJEQV9BU1NFUlQoIGhhc2hiaW4gIT0gTlVMTCwgcmV0dXJuIE5VTEw7KTsKCUlSREFfQVNTRVJUKCBoYXNoYmluLT5tYWdpYyA9PSBIQl9NQUdJQywgcmV0dXJuIE5VTEw7KTsKCgkvKgoJICogTG9jYXRlIGhhc2hiaW4KCSAqLwoJaWYgKCBuYW1lICkKCQloYXNodiA9IGhhc2goIG5hbWUgKTsKCWJpbiA9IEdFVF9IQVNIQklOKCBoYXNodiApOwoJCgkvKgoJICogU2VhcmNoIGZvciBlbnRyeQoJICovCgllbnRyeSA9IGhhc2hiaW4tPmhiX3F1ZXVlWyBiaW5dOwoJaWYgKCBlbnRyeSApIHsKCQlkbyB7CgkJCS8qCgkJCSAqIENoZWNrIGZvciBrZXkKCQkJICovCgkJCWlmICggZW50cnktPnFfaGFzaCA9PSBoYXNodiApIHsKCQkJCS8qCgkJCQkgKiBOYW1lIGNvbXBhcmUgdG9vPwoJCQkJICovCgkJCQlpZiAoIG5hbWUgKSB7CgkJCQkJaWYgKCBzdHJjbXAoIGVudHJ5LT5xX25hbWUsIG5hbWUgKSA9PSAwICkgewoJCQkJCQlyZXR1cm4gZW50cnk7CgkJCQkJfQoJCQkJfSBlbHNlIHsKCQkJCQlyZXR1cm4gZW50cnk7CgkJCQl9CgkJCX0KCQkJZW50cnkgPSBlbnRyeS0+cV9uZXh0OwoJCX0gd2hpbGUgKCBlbnRyeSAhPSBoYXNoYmluLT5oYl9xdWV1ZVsgYmluIF0gKTsKCX0KCglyZXR1cm4gTlVMTDsKfQpFWFBPUlRfU1lNQk9MKGhhc2hiaW5fZmluZCk7CgovKgogKiBGdW5jdGlvbiBoYXNoYmluX2xvY2tfZmluZCAoaGFzaGJpbiwgaGFzaHYsIG5hbWUpCiAqCiAqICAgIEZpbmQgaXRlbSB3aXRoIHRoZSBnaXZlbiBoYXNodiBvciBuYW1lCiAqCiAqIFNhbWUsIGJ1dCB3aXRoIHNwaW5sb2NrIHByb3RlY3Rpb24uLi4KICogSSBjYWxsIGl0IHNhZmUsIGJ1dCBpdCdzIG9ubHkgc2FmZSB3aXRoIHJlc3BlY3QgdG8gdGhlIGhhc2hiaW4sIG5vdCBpdHMKICogY29udGVudC4gLSBKZWFuIElJCiAqLwp2b2lkKiBoYXNoYmluX2xvY2tfZmluZCggaGFzaGJpbl90KiBoYXNoYmluLCBsb25nIGhhc2h2LCBjb25zdCBjaGFyKiBuYW1lICkKewoJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CglpcmRhX3F1ZXVlX3QqIGVudHJ5OwoKCS8qIFN5bmNocm9uaXplICovCglzcGluX2xvY2tfaXJxc2F2ZSgmaGFzaGJpbi0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKCgkvKgoJICogU2VhcmNoIGZvciBlbnRyeQoJICovCgllbnRyeSA9IChpcmRhX3F1ZXVlX3QqICkgaGFzaGJpbl9maW5kKCBoYXNoYmluLCBoYXNodiwgbmFtZSApOwoKCS8qIFJlbGVhc2UgbG9jayAqLwoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGFzaGJpbi0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKCglyZXR1cm4gZW50cnk7Cn0KRVhQT1JUX1NZTUJPTChoYXNoYmluX2xvY2tfZmluZCk7CgovKgogKiBGdW5jdGlvbiBoYXNoYmluX2ZpbmQgKGhhc2hiaW4sIGhhc2h2LCBuYW1lLCBwbmV4dCkKICoKICogICAgRmluZCBhbiBpdGVtIHdpdGggdGhlIGdpdmVuIGhhc2h2IG9yIG5hbWUsIGFuZCBpdHMgc3VjY2Vzc29yCiAqCiAqIFRoaXMgZnVuY3Rpb24gYWxsb3cgdG8gZG8gY29uY3VycmVudCBlbnVtZXJhdGlvbnMgd2l0aG91dCB0aGUKICogbmVlZCB0byBsb2NrIG92ZXIgdGhlIHdob2xlIHNlc3Npb24sIGJlY2F1c2UgdGhlIGNhbGxlciBrZWVwIHRoZQogKiBjb250ZXh0IG9mIHRoZSBzZWFyY2guIE9uIHRoZSBvdGhlciBoYW5kLCBpdCBtaWdodCBmYWlsIGFuZCByZXR1cm4KICogTlVMTCBpZiB0aGUgZW50cnkgaXMgcmVtb3ZlZC4gLSBKZWFuIElJCiAqLwp2b2lkKiBoYXNoYmluX2ZpbmRfbmV4dCggaGFzaGJpbl90KiBoYXNoYmluLCBsb25nIGhhc2h2LCBjb25zdCBjaGFyKiBuYW1lLAoJCQkgdm9pZCAqKiBwbmV4dCkKewoJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CglpcmRhX3F1ZXVlX3QqIGVudHJ5OwoKCS8qIFN5bmNocm9uaXplICovCglzcGluX2xvY2tfaXJxc2F2ZSgmaGFzaGJpbi0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKCgkvKgoJICogU2VhcmNoIGZvciBjdXJyZW50IGVudHJ5CgkgKiBUaGlzIGFsbG93IHRvIGNoZWNrIGlmIHRoZSBjdXJyZW50IGl0ZW0gaXMgc3RpbGwgaW4gdGhlCgkgKiBoYXNoYmluIG9yIGhhcyBiZWVuIHJlbW92ZWQuCgkgKi8KCWVudHJ5ID0gKGlyZGFfcXVldWVfdCogKSBoYXNoYmluX2ZpbmQoIGhhc2hiaW4sIGhhc2h2LCBuYW1lICk7CgoJLyoKCSAqIFRyaWNrIGhhc2hiaW5fZ2V0X25leHQoKSB0byByZXR1cm4gd2hhdCB3ZSB3YW50CgkgKi8KCWlmKGVudHJ5KSB7CgkJaGFzaGJpbi0+aGJfY3VycmVudCA9IGVudHJ5OwoJCSpwbmV4dCA9IGhhc2hiaW5fZ2V0X25leHQoIGhhc2hiaW4gKTsKCX0gZWxzZQoJCSpwbmV4dCA9IE5VTEw7CgoJLyogUmVsZWFzZSBsb2NrICovCglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYXNoYmluLT5oYl9zcGlubG9jaywgZmxhZ3MpOwoKCXJldHVybiBlbnRyeTsKfQoKLyoKICogRnVuY3Rpb24gaGFzaGJpbl9nZXRfZmlyc3QgKGhhc2hiaW4pCiAqCiAqICAgIEdldCBhIHBvaW50ZXIgdG8gZmlyc3QgZWxlbWVudCBpbiBoYXNoYmluLCB0aGlzIGZ1bmN0aW9uIG11c3QgYmUKICogICAgY2FsbGVkIGJlZm9yZSBhbnkgY2FsbHMgdG8gaGFzaGJpbl9nZXRfbmV4dCgpIQogKgogKi8KaXJkYV9xdWV1ZV90ICpoYXNoYmluX2dldF9maXJzdCggaGFzaGJpbl90KiBoYXNoYmluKSAKewoJaXJkYV9xdWV1ZV90ICplbnRyeTsKCWludCBpOwoKCUlSREFfQVNTRVJUKCBoYXNoYmluICE9IE5VTEwsIHJldHVybiBOVUxMOyk7CglJUkRBX0FTU0VSVCggaGFzaGJpbi0+bWFnaWMgPT0gSEJfTUFHSUMsIHJldHVybiBOVUxMOyk7CgoJaWYgKCBoYXNoYmluID09IE5VTEwpCgkJcmV0dXJuIE5VTEw7CgoJZm9yICggaSA9IDA7IGkgPCBIQVNIQklOX1NJWkU7IGkgKysgKSB7CgkJZW50cnkgPSBoYXNoYmluLT5oYl9xdWV1ZVsgaV07CgkJaWYgKCBlbnRyeSkgewoJCQloYXNoYmluLT5oYl9jdXJyZW50ID0gZW50cnk7CgkJCXJldHVybiBlbnRyeTsKCQl9Cgl9CgkvKgoJICogIERpZCBub3QgZmluZCBhbnkgaXRlbSBpbiBoYXNoYmluCgkgKi8KCXJldHVybiBOVUxMOwp9CkVYUE9SVF9TWU1CT0woaGFzaGJpbl9nZXRfZmlyc3QpOwoKLyoKICogRnVuY3Rpb24gaGFzaGJpbl9nZXRfbmV4dCAoaGFzaGJpbikKICoKICogICAgR2V0IG5leHQgaXRlbSBpbiBoYXNoYmluLiBBIHNlcmllcyBvZiBoYXNoYmluX2dldF9uZXh0KCkgY2FsbHMgbXVzdAogKiAgICBiZSBzdGFydGVkIGJ5IGEgY2FsbCB0byBoYXNoYmluX2dldF9maXJzdCgpLiBUaGUgZnVuY3Rpb24gcmV0dXJucwogKiAgICBOVUxMIHdoZW4gYWxsIGl0ZW1zIGhhdmUgYmVlbiB0cmF2ZXJzZWQKICogCiAqIFRoZSBjb250ZXh0IG9mIHRoZSBzZWFyY2ggaXMgc3RvcmVkIHdpdGhpbiB0aGUgaGFzaGJpbiwgc28geW91IG11c3QKICogcHJvdGVjdCB5b3Vyc2VsZiBmcm9tIGNvbmN1cnJlbnQgZW51bWVyYXRpb25zLiAtIEplYW4gSUkKICovCmlyZGFfcXVldWVfdCAqaGFzaGJpbl9nZXRfbmV4dCggaGFzaGJpbl90ICpoYXNoYmluKQp7CglpcmRhX3F1ZXVlX3QqIGVudHJ5OwoJaW50IGJpbjsKCWludCBpOwoKCUlSREFfQVNTRVJUKCBoYXNoYmluICE9IE5VTEwsIHJldHVybiBOVUxMOyk7CglJUkRBX0FTU0VSVCggaGFzaGJpbi0+bWFnaWMgPT0gSEJfTUFHSUMsIHJldHVybiBOVUxMOyk7CgoJaWYgKCBoYXNoYmluLT5oYl9jdXJyZW50ID09IE5VTEwpIHsKCQlJUkRBX0FTU0VSVCggaGFzaGJpbi0+aGJfY3VycmVudCAhPSBOVUxMLCByZXR1cm4gTlVMTDspOwoJCXJldHVybiBOVUxMOwoJfQkKCWVudHJ5ID0gaGFzaGJpbi0+aGJfY3VycmVudC0+cV9uZXh0OwoJYmluID0gR0VUX0hBU0hCSU4oIGVudHJ5LT5xX2hhc2gpOwoKCS8qICAKCSAqICBNYWtlIHN1cmUgdGhhdCB3ZSBhcmUgbm90IGJhY2sgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcXVldWUKCSAqICBhZ2FpbiAKCSAqLwoJaWYgKCBlbnRyeSAhPSBoYXNoYmluLT5oYl9xdWV1ZVsgYmluIF0pIHsKCQloYXNoYmluLT5oYl9jdXJyZW50ID0gZW50cnk7CgoJCXJldHVybiBlbnRyeTsKCX0KCgkvKgoJICogIENoZWNrIHRoYXQgdGhpcyBpcyBub3QgdGhlIGxhc3QgcXVldWUgaW4gaGFzaGJpbgoJICovCglpZiAoIGJpbiA+PSBIQVNIQklOX1NJWkUpCgkJcmV0dXJuIE5VTEw7CgkKCS8qCgkgKiAgTW92ZSB0byBuZXh0IHF1ZXVlIGluIGhhc2hiaW4KCSAqLwoJYmluKys7Cglmb3IgKCBpID0gYmluOyBpIDwgSEFTSEJJTl9TSVpFOyBpKysgKSB7CgkJZW50cnkgPSBoYXNoYmluLT5oYl9xdWV1ZVsgaV07CgkJaWYgKCBlbnRyeSkgewoJCQloYXNoYmluLT5oYl9jdXJyZW50ID0gZW50cnk7CgkJCQoJCQlyZXR1cm4gZW50cnk7CgkJfQoJfQoJcmV0dXJuIE5VTEw7Cn0KRVhQT1JUX1NZTUJPTChoYXNoYmluX2dldF9uZXh0KTsK