This is a multi-part message in MIME format. --------------EDD81E724667AA03453E0C67 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Howdy, please find attached my latest running version of continuationmodule.c which is really able to do continuations. You need stackless Python 0.3 for it, which I just submitted. This module is by no means ready. The central functions are getpcc() and putcc. Call/cc is at the moment to be done like: def callcc(fun, *args, **kw): cont = getpcc() return apply(fun, (cont,)+args, kw) getpcc(level=1) gets a parent's current continuation. putcc(cont, val) throws a continuation. At the moment, these are still frames (albeit special ones) which I will change. They should be turned into objects which have a link to the actual frame, which can be unlinked after a shot or by hand. This makes it easier to clean up circular references. I have a rough implementation of this in Python, also a couple of generators and coroutines, but all not pleasing me yet. Due to the fact that my son is ill, my energy has dropped a little for the moment, so I thought I'd better release something now. I will make the module public when things have been settled a little more. ciao - chris -- Christian Tismer :^) <mailto:tismer@appliedbiometrics.com> Applied Biometrics GmbH : Have a break! Take a ride on Python's Kaiserin-Augusta-Allee 101 : *Starship* http://starship.python.net 10553 Berlin : PGP key -> http://wwwkeys.pgp.net PGP Fingerprint E182 71C7 1A9D 66E9 9D15 D3CC D4D7 93E2 1FAE F6DF we're tired of banana software - shipped green, ripens at home --------------EDD81E724667AA03453E0C67 Content-Type: application/x-unknown-content-type-cfile; name="continuationmodule.c" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="continuationmodule.c" Ci8qIENvbnRpbnVhdGlvbiBvYmplY3RzICovCgovKgoKICBDVCA5OTA2MTkKCiAgQWZ0ZXIg bG90cyBvZiB0aG91Z2h0LCBJIGNhbWUgdXAgd2l0aCB0aGlzOgogIEZyYW1lcyBjYW4gYmUg c3dpdGNoZWQgYW5kIHRyZWF0ZWQgbGlrZQogIGNvbnRpbnVhdGlvbnMgaW4gbWFueSBjYXNl cy4KICBUaGlzIHdvcmtzIGZpbmUsIHVudGlsIGEgZnJhbWUgbmVlZHMgdG8KICBiZSByZXR1 cm5lZCB0byBtb3JlIHRoYW4gb25jZS4KICBUaGlzIGlzIHRoZSByZWFsIHNpdHVhdGlvbiwg d2hlcmUgd2UgbmVlZAogIHRvIHVzZSAicmVhbCIgY29udGludWF0aW9ucywgdGhhdCBtZWFu czoKICBUaGUgZnJhbWUncyBleGVjdXRpb24gc3RhdGUgbXVzdCBiZSBzZXQgYnkgdGhlCiAg cmV0dXJuaW5nIGNhbGxlZS4KCiAgSXQgd291bGQgYmUgYSBtYWpvciBkcmF3YmFjayB0byBh bHdheXMgaGF2ZSBjYWxsZWVzCiAgdG8gY2FycnkgdGhlaXIgY3VycmVudCBiYWNrIGNvbnRp bnVhdGlvbiBhcm91bmQuCiAgVGhpcyB3b3VsZCBiZSBhIGxvdCBvZiB1bm5lY2Vzc2FyeSBv dmVyaGVhZCBhbmQgd291bGQKICBzbG93IGRvd24gbW9zdCBvZiB0aGUgZnVuY3Rpb24gY2Fs bHMgd2l0aG91dCBhbnkgYmVuZWZpdC4KCiAgU29sdXRpb24gdG8gdGhpcyBwcm9ibGVtOgog IFdoZW5ldmVyIHRoZSBjdXJyZW50IGNvbnRpbnVhdGlvbiBpcyByZXF1ZXN0ZWQgZnJvbSBQ eXRob24gY29kZSwKICB3ZSB0YWtlIHRoZSBjdXJyZW50IGZyYW1lIGFuZCBkdXBsaWNhdGUg aXQuIER1cGxpY2F0aW9uCiAgb2Njb3VycyBhdCB0aGUgZl9iYWNrIHBvaW50ZXI6IEEgY29w eSBvZiB0aGUgZnJhbWUgaXMgc3BsaWNlZAogIGluIHRoZXJlLiBUaGlzIGtlZXBzIGFsbCBy ZWZlcmVuY2VzIGNvcnJlY3QuCiAgVGhlIGZvcm1lciBjdXJyZW50IGZyYW1lIGlzIG5vdyB0 cmFuc2Zvcm1lZCBpbnRvIGEgY29udGludWF0aW9uCiAgZnJhbWUuCiAgQ29udGludWF0aW9u IGZyYW1lcyBoYXZlIGEgc3BlY2lhbCBmX2V4ZWN1dGUgZW50cnkuCiAgVGhlaXIgb25seSBw dXJwb3NlIGlzIHRvIHBhcmFtZXRlcml6ZSB0aGUgdHJ1ZSBmcmFtZQogIGFuZCBydW4gaXQu CiAgVGhlIGNvcHktaW50by10aGUtYmVoaW5kIHRyaWNrIGlzIGFsd2F5cyBwZXJmb3JtZWQs IHdoZW4KICBhIGNvbnRpbnVhdGlvbiBmcmFtZSBpcyBydW4uIEF0IHRoZSBzYW1lIHRpbWUs IGl0IGlzIGVuc3VyZWQKICB0aGF0IGFueSB0cnVlIGZyYW1lIHdoaWNoIGlzIGludm9rZWQg YnkgYSBjb250aW51YXRpb24gaXMKICBpdHNlbGYgcG9pbnRpbmcgYmFjayB0byBhIGNvbnRp bnVhdGlvbi4KICBCeSBtZWFucyBvZiB0aGlzLCBpdCBhcHBlYXJzIGFzIGlmIHRoZSB3aG9s ZSBleGVjdXRpb24gdHJlZQogIHdlcmUgYnVpbHQgd2l0aCBjb250aW51YXRpb25zIHNsaWNl ZCBiZXR3ZWVuIG5vcm1hbCBmcmFtZXMuCiAgQnV0IHRoaXMgaGFwcGVucyBvbmx5IG9uIGRl bWFuZCwgaW4gYSBsYXp5IG1hbm5lci4KCiAgSSdtIHN1cmUgSSBoYXZlIHJlYWNoZWQgdGhl IG5leHQgbGV2ZWwgb2YgbWFkbmVzcyBieSB0aGF0LgoKICBDaHJpc3RpYW4gVGlzbWVyCiAg SnVuZSAxOSwgMTk5OQoKICBBZGRlbmR1bSA5OTA2MjA6IEl0IHdhcyBjcnVjaWFsIHRvIGNo YW5nZSB0aGUgZnJhbWUgcmVmY291bnRpbmcKICBwb2xpY3ksIGluIG9yZGVyIHRvIGdldCB0 aGlzIHRvIHdvcmsgcGFpbmxlc3NseS4KICBGcmFtZXMgbm93IGhhdmUgdXN1YWxseSBhbHdh eXMgYSByZWZjb3VudCBvZiAxLgogIE9uIHJldHVybiwgZl9iYWNrIGlzIGluY3JlZidkLCB0 aGVuIHRoZSBjdXJyZW50IGZyYW1lIGRlY3JlZidkLgoKICA5OTA2MjQgc3RpbGwgaHVudGlu ZyB0aGUgbGFzdCByZWZjb3VudCBmYXVsdHMgc2luY2UgNSBkYXlzKysuCgogIDk5MDYyNSBy ZWZjb3VudCBmYXVsdHMgc29sdmVkLiBJIGRpZCBub3QgdW5kZXJzdGFuZCB0aGF0CiAgYSBm cmFtZSdzIHN0YWNrc2l6ZSBmaWVsZCBzaG91bGQgbmV2ZXIgYmUgd3JpdHRlbi4KICBTZWUg ZnJhbWVvYmplY3QuYyBmb3IgR3VpZG8ncyBjb21tZW50cy4KCiAgQWRkZWQgcHJvcGVyIGhh bmRsaW5nIG9mIHJlY3Vyc2lvbiBkZXB0aC4gSXQgaXMgc2ltcGxlCiAgYW5kIGNoZWFwOiBT YXZlIGFuZCByZXN0b3JlIHRoZSByZWN1cnNpb24gbGV2ZWwgaW4gdGhlCiAgY29udGludWF0 aW9uIGZyYW1lcy4KCiAgOTkwNjI2IGl0IHNlZW1zIHRvIGJlIHZlcnkgc3RhYmxlIG5vdy4g QnV0OgoKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tCiAgVmVyc2lvbiAwLjIKCiAgQWxsIHRoZSBwcm9ibGVtcyBoYXZl IGJlZW4gc29sdmVkIHNvIGZhci4KICBBZnRlciBzb21lIHRlc3RpbmcgYW5kIG1vcmUgcmVh ZGluZyBhYm91dCBTY2hlbWUsIEkKICByZWFsaXplZCB0aGF0IHRoZSBldmFsdWF0aW9uIHN0 YWNrIGlzIGEgcmVhbGx5IGJhZCB0aGluZyEKICBCeSBjb3B5aW5nIHN0YWNrcyBiYWNrLCB3 ZSBhcmUgcmVzdG9yaW5nIG9sZCBpbmZvcm1hdGlvbgogIHdoaWNoIGlzIHdyb25nLiBXZSBo YXZlIHRvIHVzZSB0aGUgY3VycmVudCBpbmZvcm1hdGlvbi4KICBFeGFtcGxlOiBMb29wcyBj YXJyeSB0aGVpciBzdGF0ZSBvbiB0aGUgc3RhY2suIEl0IGlzCiAgYSBiYWQgaWRlYSB0byBy ZXN0b3JlIHRoYXQgdXNpbmcgb2xkIHZhbHVlcy4KCiAgQWxzbywgY3JlYXRpbmcgbmV3IHB1 c2ggYmFjayBmcmFtZXMgYWxsIHRoZSB0aW1lIGlzIG5vdAogIHRoZSBiZXN0IGlkZWEsIHNp bmNlIHRoZXJlIHNob3VsZCBiZSBvbmx5IG9uZSBjb250aW51YXRpb24KICBmcmFtZSBmb3Ig ZXZlcnkgY29udGludWF0aW9uIGVudHJ5IHBvaW50LgoKICBJbiBhbiBpZGVhbCB3b3JsZCwg ZXZlcnkgZW50cnkgcG9pbnQgd291bGQgbm90IGhhdmUgYQogIHN0YWNrLCBidXQgYSBudW1i ZXIgb2YgcmVnaXN0ZXJzIHdoaWNoIGFyZSBhc3NvY2lhdGVkCiAgd2l0aCB0aGUgcHJvZ3Jh bSBsb2NhdGlvbi4gVGhlc2UgcmVnaXN0ZXJzIHNob3VsZCBhbHdheXMKICBjYXJyeSBjdXJy ZW50IHZhbHVlcy4gSG93IGNhbiB3ZSBkbyB0aGlzPwoKICBBIGNvbXBsZXRlIHNvbHV0aW9u IHNlZW1zIHRvIGJlIGltcG9zc2libGUgd2l0aG91dAogIHJld3JpdGluZyBoYWxmIG9mIHRo ZSBQeXRob24ga2VybmVsLiBBbGwgd2UgY2FuIGRvCiAgaXMgdHJ5aW5nIHRvIG1ha2Ugc3Vy ZSB0aGF0IGV2ZXJ5IHByb2dyYW0gbG9jYXRpb24KICB3aGljaCBjYW4gYmUgcmVhY2hlZCBi eSBpdHMgY29udGludWF0aW9uIHVzZXMgdGhlCiAgc2FtZSwgZnJlc2hlc3QgdmVyc2lvbiBv ZiBkYXRhLgoKICA5OTA2MjcgTm8sIGl0ICppcyogcG9zc2libGUuIFdlIG5lZWQgYSBzbWFs bCBjaGFuZ2UKICBvZiBldmFsX2NvZGUgdG8gYWxsb3cgZm9yIHNvbWV0aGluZyBiZWluZyBj YWxsZWQKICBiZWZvcmUgYSBuZXcgZnJhbWUgaXMgcnVuLiBUaGlzIG1lYW5zIHRvIGFkZAog IG9uZSBuZXcgZmllbGQgdG8gZnJhbWVzOiBmX2NhbGxndWFyZC4KCiAgRGlkIGl0LiBJdCB3 b3Jrcy4gSXQgaXMgbm8gY29tcGxldGUgc29sdXRpb24sIGJ1dCBhdCBsZWFzdAogICJmb3Ii IGxvb3BzIGJlaGF2ZSBjb3JyZWN0bHkgaW4gc2ltcGxlIGNhc2VzLgogIFRoZSB0cnVlIHNv bHV0aW9uIGlzOiBFaXRoZXIgdHVybiB0aGUgZXZhbCBpbnRlcnByZXRlcgogIGludG8gYSBy ZWdpc3RlciBtYWNoaW5lLCBvciBkbyB0aGUgZm9sbG93aW5nOgogIE9uIGRlbWFuZCwgYSBk YXRhIGZsb3cgYW5hbHlzaXMgbXVzdCBiZSBkb25lIGZvciB0aGUKICBzdGFjayBpbiBvcmRl ciB0byBmaW5kIHRoZSBsaWZldGltZSBvZiBzdGFjayB2YXJpYWJsZXMuCiAgVGhpcyBpcyBu b3QgdG9vIGhhcmQuIEkgd2lsbCBub3QgZG8gdGhpcyB1bnRpbCBJIGNoYW5nZWQKICB0aGUg b3ZlcmFsbCBjb25jZXB0IGFnYWluOiBGcmFtZSBpbnRlcnByZXRlcnMgbXVzdCBiZWNvbWUK ICBvYmplY3QgYnkgdGhlbXNlbHZlcy4gTmVjZXNzYXJ5IGFjdGlvbnMgZm9yIGNvbnRpbnVh dGlvbnMKICB3aWxsIHRoZW4gYmVjb21lIG1ldGhvZHMgb2YgdGhlc2Ugb2JqZWN0cy4KICBU aGlzIGlzIHRoZSB3YXkgdG8gZ28sIGZvciBWZXJzaW9uIDAuMy4KCiAgLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICA5 OTA3MTAgZHJvcHBlZCB0aGUgZXh0cmEgaGlkZGVuIHJlZ2lzdGVyIGRldGVjdGlvbiBtZXNz LgogIExldCdzIGZvcmdldCBhYm91dCB0aGUgYWJvdmUgY29uc2lkZXJhdGlvbnMuCgogIFN0 YWNrbGVzcyBQeXRob24gZ290IGEgbmV3IG11dGFibGUgY291bnRlciBvYmplY3QgZm9yIHRo ZQogIGZvci1sb29wcywgYW5kIHdlJ3JlIGRvbmUuIEFsc28gcmV3b3JrZWQgdGhlIGRldGVj dGlvbgogIG9mIGRpZmZlcmVudCBkaXNwYXRjaGVyIGluc3RhbmNlcyBxdWl0ZSBtdWNoLgog IEdvaW5nIHRvIHJlbGVhc2Ugc29tZSBzdHVmZiBzb29uLgoKICA5OTA3MTEgTm93IEkgKnRo b3VnaHQqIGl0IHNob3VsZCBhbHNvIHdvcmsgdG8gc2F2ZQogIGNvbnRpbnVhdGlvbnMgaW5z aWRlIG9mIG5lc3RlZCBkaXNwYXRjaGVycy4gQWN0dWFsbHksCiAgaXQgZG9lc24ndC4gTXkg cHJldmVudGl2ZSBjb250aW51YXRpb24gZnJhbWUgY3JlYXRpb24KICB3aGljaCBJIGRvIGZv ciBjYWxsZXJzIGlzIGJyb2tlbiwgaWYgYW4gZXZhbF9jb2RlIGluc3RhbmNlCiAgY2FsbHMg YSBmdW5jdGlvbiB3aGljaCBkb2Vzbid0IGdlbmVyYXRlIHVud2luZCB0b2tlbnMuCiAgVGhh dCBtZWFucywgZXZhbF9jb2RlIGNvbnRpbnVlcyB0byBydW4gdGhpcyBmcmFtZSwgYWx0aG91 Z2gKICBpdCBoYWQgYmVlbiB0dXJuZWQgaW50byBhIGNvbnRpbnVhdGlvbiBmcmFtZS4gVGhp cyBsZWFkcyB0bwogIGZ1bm55IGVmZmVjdHMgYW5kIGlzIGJhZC4KCiAgQnV0IG5vdyBJIHJl YWxpemVkIHdoYXQgdGhlICpyZWFsKiB3YXkgaXMsIGFuZCB0aGF0IGl0IGlzCiAgc28gbXVj aCBlYXNpZXIgdGhhbiBldmVyeXRoaW5nLiBXZSB1c2UgdGhlIGZfY2FsbGd1YXJkLAogIHdo aWNoIG5vdyBtYWtlcyB2ZXJ5IG11Y2ggc2Vuc2UuIFRoZSBjYWxsZ3VhcmQgYmVjb21lcwog IGEgaGFuZGxlciB3aGljaCBjaGVja3Mgd2V0aGVyIHRoZSBjdXJyZW50IGZyYW1lIGhhcyBh CiAgcmVmY291bnQgb2YgbW9yZSB0aGFuIG9uZS4gSWYgc28sIHRoZW4gaXQgaXMgdHVybmVk IGludG8KICBhIGNvbnRpbnVhdGlvbiBmcmFtZSwgYW5kIHdlIHVud2luZCB3aXRoIHRoZSBw dXNoZWQgYmFjawogIGZyYW1lLgoKICA5OTA3MTIgVGhpcyBpcyBkb25lIG5vdy4gVGhlIGNh bGxndWFyZCBpcyBub3cgYWxzbyB1c2VkIHRvCiAgY2hlY2sgZm9yIGZ1bmN0aW9uIGNhbGxz IHdoaWNoIGRpZCBub3QgdW53aW5kIHRoZSBzdGFjay4KICBJbiBvdGhlciB3b3JkczogV2Ug Y2FuIGNhcHR1cmUgdGhlIGNvbnRpbnVhdGlvbnMgY29ycmVjdGx5LAogIGFsc28gaWYgd2Ug YXJlIGNhbGxlZCByZWN1cnNpdmVseSBieSBhbiBfX2luaXRfXyBjb250ZXh0LgoKICAqLwoK I2luY2x1ZGUgIlB5dGhvbi5oIgoKI2luY2x1ZGUgImNvbXBpbGUuaCIKI2luY2x1ZGUgImZy YW1lb2JqZWN0LmgiCgpzdGF0aWMgUHlPYmplY3QgKkVycm9yT2JqZWN0OwoJCgovKiBmb3J3 YXJkICovClB5T2JqZWN0ICogdGhyb3dfY29udGludWF0aW9uKFB5RnJhbWVPYmplY3QgKiwg UHlPYmplY3QgKik7CgpQeU9iamVjdCAqIHN0YWNrX3RvX3R1cGxlKGYpCglQeUZyYW1lT2Jq ZWN0ICpmOwp7CglQeU9iamVjdCAqKnAgPSBmLT5mX3N0YWNrcG9pbnRlcjsKCWludCBzaXpl ID0gcCAtIGYtPmZfdmFsdWVzdGFjazsKCVB5T2JqZWN0ICpyZXQgPSBQeVR1cGxlX05ldyhz aXplKTsKCWlmIChyZXQ9PU5VTEwpCgkJcmV0dXJuIE5VTEw7Cglmb3IgKCA7IHNpemU+MCA7 KSB7CgkJUHlPYmplY3QgKml0ZW0gPSAqLS1wOwoJCVB5X0lOQ1JFRihpdGVtKTsKCQlQeVR1 cGxlX1NFVF9JVEVNKHJldCwgLS1zaXplLCBpdGVtKTsKCX0KCXJldHVybiByZXQ7Cn0KCgoJ ClB5RnJhbWVPYmplY3QgKiBzZXRfZXhlY3V0aW9uX3N0YXRlKGYsIGZiKQoJUHlGcmFtZU9i amVjdCAqIGY7CglQeUZyYW1lT2JqZWN0ICogZmI7CnsKCVB5T2JqZWN0ICoqIGZzcDsKCVB5 T2JqZWN0ICogaXRlbTsKCglpZiAoZi0+Zl9leGVjdXRlICE9IHRocm93X2NvbnRpbnVhdGlv bikgewoJCVB5RXJyX1NldFN0cmluZyAoUHlFeGNfU3lzdGVtRXJyb3IsICJ3cm9uZyBleGVj dXRpb24gc291cmNlIGZyYW1lIik7CgkJcmV0dXJuIE5VTEw7Cgl9CgoJaWYgKGZiLT5mX2V4 ZWN1dGUgPT0gdGhyb3dfY29udGludWF0aW9uKSB7CgkJUHlFcnJfU2V0U3RyaW5nIChQeUV4 Y19TeXN0ZW1FcnJvciwgIndyb25nIGV4ZWN1dGlvbiB0YXJnZXQgZnJhbWUiKTsKCQlyZXR1 cm4gTlVMTDsKCX0KCgkvKiBjb3B5IGV4Y2VwdGlvbiBibG9ja3MgKi8KCWlmIChmLT5mX2li bG9jayA+IDApIHsKCQlmYi0+Zl9pYmxvY2sgPSBmLT5mX2libG9jazsKCQltZW1jcHkoJihm Yi0+Zl9ibG9ja3N0YWNrKSwgJihmLT5mX2Jsb2Nrc3RhY2spLCBmLT5mX2libG9jaypzaXpl b2YoUHlUcnlCbG9jaykpOwoJfQoKCS8qIGNsZWFyIHRoZSB0YXJnZXQgc3RhY2sgKi8KCXdo aWxlIChmYi0+Zl9zdGFja3BvaW50ZXIgPiBmYi0+Zl92YWx1ZXN0YWNrKSB7CgkJaXRlbSA9 ICotLShmYi0+Zl9zdGFja3BvaW50ZXIpOwoJCVB5X1hERUNSRUYoaXRlbSk7Cgl9CgkvKiBj b3B5IHRoZSBzdGFjayAqLwoJZnNwID0gZi0+Zl92YWx1ZXN0YWNrOwoJd2hpbGUgKGZzcCA8 IGYtPmZfc3RhY2twb2ludGVyKSB7CgkJaXRlbSA9ICooZnNwKyspOwoJCVB5X0lOQ1JFRihp dGVtKTsKCQkqKGZiLT5mX3N0YWNrcG9pbnRlcisrKSA9IGl0ZW07Cgl9CgkvKiBjb3B5IGFk ZGl0aW9uYWwgaW5mbyAqLwoJZmItPmZfbGFzdGkgPSBmLT5mX2xhc3RpOwoJZmItPmZfbGlu ZW5vID0gZi0+Zl9saW5lbm87CgkvKiBpbnN0cnVjdGlvbiBwb2ludGVyICovCglmYi0+Zl9u ZXh0X2luc3RyID0gZi0+Zl9uZXh0X2luc3RyOwoJLyogY29weSBhdXhpbGlhcnkgcmVnaXN0 ZXJzICovCglmYi0+Zl9zdGF0dXNmbGFncyA9IGYtPmZfc3RhdHVzZmxhZ3M7CgkvKiBidXQg bm90IHRoZSByZWdpc3RlcnMgKi8KCXJldHVybiBmYjsgLyogc3VjY2VzcyBmbGFnICovCn0K CgovKgpUaGUgaWRlYSBvZiBidWlsZF9jb250aW51YXRpb25fZnJhbWUgaXMKdG8gdGFrZSBh IGZyYW1lIGFuZCBkdXBsaWNhdGUgaXQgYXQgaXRzIGZfYmFjayBwb2ludGVyLgpUaGUgZXhl Y3V0aW9uIHBvaW50ZXIgaXMgY2hhbmdlZCB0byB0aHJvd19jb250aW51YXRpb24uClNpbmNl IHRoZSBmcmFtZSAqYmVjb21lcyogdGhlIGNvbnRpbnVhdGlvbiwgd2hpY2ggbGF0ZXIKZmFs bHMgYmFjayB0byB0aGUgdHJ1ZSBhY3Rpb24sIGFsbCByZWZlcmVuY2VzIHRvIHRoZQpmcmFt ZSBzdGF5IGludGFjdC4gClRoaXMgaXMgYSAiY3JlYXRlIGNvbnRpbnVhdGlvbiBvbiBkZW1h bmQiIGNvbmNlcHQgOi0pCiovCgppbnQgZmluZF9yZWN1cnNpb25fZGVwdGgoZikKCVB5RnJh bWVPYmplY3QgKiBmOwp7CgkvKiAKCSAgd2UgZWl0aGVyIGNvdW50IHVudGlsIHRoZSB0b3Ag b2YgdGhlIGNoYWluLCAKCSAgb3IgdW50aWwgd2UgZmluZCBhbm90aGVyIGNvbnRpbnVhdGlv biBmcmFtZSAKCSAgd2hpY2ggdGVsbHMgdXMgYnkgaXRzIGZfcmVnMSBmaWVsZC4gCgkqLwoJ aW50IGRlcHRoID0gMDsKCXdoaWxlIChmICE9IE5VTEwpIHsKCQlpZiAoZi0+Zl9leGVjdXRl ID09IHRocm93X2NvbnRpbnVhdGlvbikgewoJCQlkZXB0aCArPSBmLT5mX3JlZzE7CgkJCWJy ZWFrOwoJCX0KCQlmID0gZi0+Zl9iYWNrOwoJCWRlcHRoKys7Cgl9CglyZXR1cm4gZGVwdGg7 Cn0KClB5RnJhbWVPYmplY3QgKiBidWlsZF9jb250aW51YXRpb25fZnJhbWUoZikKCVB5RnJh bWVPYmplY3QgKiBmOwp7CglQeUZyYW1lT2JqZWN0ICogZmI7IC8qIGZyYW1lIGluIHRoZSBi YWNrICovCglpbnQgaTsKCglpZiAoZj09TlVMTCkKCQlyZXR1cm4gTlVMTDsKCWlmIChmLT5m X2V4ZWN1dGUgPT0gdGhyb3dfY29udGludWF0aW9uKQoJCXJldHVybiBmOyAvKiBhbHJlYWR5 IGEgY29udGludWF0aW9uICovCgoJZmIgPSBQeUZyYW1lX05ldyhmLT5mX3RzdGF0ZSwgZi0+ Zl9jb2RlLCBmLT5mX2dsb2JhbHMsIGYtPmZfbG9jYWxzKSA7CglpZiAoZmIgPT0gTlVMTCkK CQlyZXR1cm4gTlVMTCA7CgoJLyogbGluayB0aGUgbmV3IGZyYW1lIGJldHdlZW4gdGhpcyBh bmQgYmFjayAqLwoJZmItPmZfYmFjayA9IGYtPmZfYmFjazsKCWYtPmZfYmFjayA9IGZiOwoK CS8qIHRyYWNlYmFja3M6IG5vdCBjb3BpZWQsIHRoZXkgc3RheSBpbiB0aGUgY29udGludWF0 aW9uICovCgoJLyogCgkgIGZfYnVpbHRpbnMsIGZfZ2xvYmFscywgZl9sb2NhbHMsIGZfdHN0 YXRlLCBmX3Jlc3RyaWN0ZWQsIGZfbmxvY2FscyAKCSAgYW5kIGZfZmlyc3RfaW5zdHIgaGF2 ZSBiZWVuIHNldCBieSBQeUZyYW1lX05ldy4KCSAKCSAgbmV2ZXIgdG91Y2ggZl9zdGFja3Np emUhIEl0IG1heSBoYXZlIGJlZW4gc2V0IGxhcmdlciB0aGFuCgkgIG5lZWRlZC4gVGhpcyBj YXVzZWQgbWUgaG91cnMgYW5kIGhvdXJzIG9mIGRlYnVnZ2luZy4KCSovCgoJZm9yIChpPTA7 IGk8Zi0+Zl9ubG9jYWxzOyBpKyspIHsKCQlQeU9iamVjdCAqIGl0ZW0gPSBmLT5mX2xvY2Fs c3BsdXNbaV07CgkJUHlfWElOQ1JFRihpdGVtKTsKCQlmYi0+Zl9sb2NhbHNwbHVzW2ldID0g aXRlbTsKCX0KCgoJUHlfSU5DUkVGKGYtPmZfZGlzcGF0Y2hlcik7CglmYi0+Zl9kaXNwYXRj aGVyID0gZi0+Zl9kaXNwYXRjaGVyOwoJZmItPmZfaG9sZF9yZWYgPSBmLT5mX2hvbGRfcmVm OyBmLT5mX2hvbGRfcmVmID0gTlVMTDsKCWZiLT5mX21lbW9yeSA9IGYtPmZfbWVtb3J5OyBm LT5mX21lbW9yeSA9IE5VTEw7CglmYi0+Zl9jYWxsZ3VhcmQgPSBmLT5mX2NhbGxndWFyZDsg Zi0+Zl9jYWxsZ3VhcmQgPSBOVUxMOwoKCS8qIHJlZ2lzdGVycywgb25seSBvbmNlICovCglm Yi0+Zl9yZWcxID0gZi0+Zl9yZWcxOwoJZmItPmZfcmVnMiA9IGYtPmZfcmVnMjsKCWZiLT5m X3JlZzMgPSBmLT5mX3JlZzM7CgoJLyogY29weSBleGVjdXRvciBhbmQgcHV0IG91cnMgKi8K CWZiLT5mX2V4ZWN1dGUgPSBmLT5mX2V4ZWN1dGU7CglmLT5mX2V4ZWN1dGUgPSB0aHJvd19j b250aW51YXRpb247CgoJLyogcHV0IHJlY3Vyc2lvbl9kZXB0aCBpbnRvIGZfcmVnMSAqLwoJ Zi0+Zl9yZWcxID0gZmluZF9yZWN1cnNpb25fZGVwdGgoZmIpOwoKCWlmICghc2V0X2V4ZWN1 dGlvbl9zdGF0ZShmLCBmYikpCgkJcmV0dXJuIE5VTEw7CglyZXR1cm4gZjsKfQoKClB5RnJh bWVPYmplY3QgKiBmaW5kX2NvZGVfZnJhbWUoZikKCVB5RnJhbWVPYmplY3QgKmY7CnsKCWlm IChmPT1OVUxMKQoJCXJldHVybiBOVUxMOwoJd2hpbGUgKGYtPmZfZXhlY3V0ZSA9PSB0aHJv d19jb250aW51YXRpb24pIHsKCQlmID0gZi0+Zl9iYWNrOwoJCWlmIChmPT1OVUxMKQoJCQly ZXR1cm4gTlVMTDsKCX0KCXJldHVybiBmOwp9CgoKUHlGcmFtZU9iamVjdCAqIG5vcm1hbGl6 ZV9jb250aW51YXRpb24oZikKCVB5RnJhbWVPYmplY3QgKmY7CnsKCS8qIHdhbGsgYmFjayB0 aHJvdWdoIGEgcG9zc2libGUgcGlsZSBvZiBjb250aW51YXRpb25zIGFuZCByZWxpbmsgdG8g dGhlIHJlYWwgY29kZSAqLwoJUHlGcmFtZU9iamVjdCAqZmIgPSBmLT5mX2JhY2s7CglpZiAo ZmI9PU5VTEwpCgkJcmV0dXJuIE5VTEw7CglpZiAoZmItPmZfZXhlY3V0ZSA9PSB0aHJvd19j b250aW51YXRpb24pIHsKCQlmYiA9IG5vcm1hbGl6ZV9jb250aW51YXRpb24oZmIpOwoJCWlm IChmYj09TlVMTCkKCQkJcmV0dXJuIE5VTEw7Cgl9CglQeV9JTkNSRUYoZmIpOwoJUHlfREVD UkVGKGYtPmZfYmFjayk7CglmLT5mX2JhY2sgPSBmYjsKCS8qIHJldHVybiB0aGUgcmVhbCBj b2RlIGZyYW1lICovCglyZXR1cm4gZmI7Cn0KCgpQeUZyYW1lT2JqZWN0ICogZmluZF9jYWxs ZXJfZW50cnkoZikKCVB5RnJhbWVPYmplY3QgKmY7CnsKCS8qIHRoZSBvcHBvc2l0ZSBvZiBm aW5kX2NvZGVfZnJhbWUuIGZpbmQgdGhlIHRydWUgcmV0dXJuLiAqLwoJZiA9IGZpbmRfY29k ZV9mcmFtZShmKTsKCWlmIChmICE9IE5VTEwpCgkJZiAgPSBmLT5mX2JhY2s7CglyZXR1cm4g ZjsKfQoKCmludCBwcm90ZWN0X3RoaXNfZnJhbWVfbmV4dF90aW1lKGYsIHBoYXNlKTsgLyog Zm9yd2FyZCAqLwoKLyoKCUEgZnJhbWUgd2lsbCBjaGVjayB3ZXRoZXIgaXQgY2FuIGJlIHJl YWNoZWQgdHdpY2UgYmVmb3JlIGl0CglpcyBydW4uIElmIHNvLCBpdCBjcmVhdGVzIGEgY29u dGludWF0aW9uIGZyYW1lIGZyb20gaXRzZWxmLAoJcHV0cyB0aGUgcHVzaGVkIGJhY2sgYmVy c2lvbiBvbiB0aGUgZnJhbWUgc3RhY2sgYW5kIGp1bXBzIG9mZi4KCglwaGFzZSAwOiBmcmFt ZSBpcyBhYm91dCB0byBsZWF2ZSB3aXRoIHRoZSB1bndpbmQgdG9rZW4KCXBoYXNlIDE6IGZy YW1lIGlzIGFib3V0IHRvIHN0YXJ0IHRoZSBpbnRlcnByZXRlciBsb29wCglwaGFzZSAyOiBm cmFtZSBoYXMganVzdCBkb25lIGEgdHJ1ZSBmdW5jdGlvbiBjYWxsCiovCgppbnQgcHJvdGVj dF90aGlzX2ZyYW1lKGYsIHBoYXNlKQoJUHlGcmFtZU9iamVjdCAqZjsKCWludCBwaGFzZTsK ewoJUHlGcmFtZU9iamVjdCAqYmFjazsKCglpZiAoZi0+b2JfcmVmY250ID09IDEpIHsgLyog Y2Fubm90IGJlIHJlYWNoZWQgdHdpY2UgKi8KCQlpZiAocGhhc2UgIT0gMCkgLyogd2UgYXJl IG5vdCBvbiBleGl0ICovCgkJCWYtPmZfdGVtcF92YWwgPSBOVUxMOwoJCXJldHVybiAwOwoJ fQoKCWYgPSBidWlsZF9jb250aW51YXRpb25fZnJhbWUoZik7CglpZiAoZj09TlVMTCkKCQly ZXR1cm4gLTE7CgoJLyogb24gZXhpdCwgd2UganVzdCBwcm90ZWN0ICovCglpZiAocGhhc2Ug PT0gMCkKCQlyZXR1cm4gMDsKCgkvKiBvbiBlbnRyeSwgd2UgY2F1c2UgYSByZXN0YXJ0ICov CgkvKiB3ZSBhcmUgY2FsbGVkIHdpdGggCgkgICBwaGFzZSA9PSAxIHdoaWNoIGlzICJiZWZv cmUgZnJhbWUgc3RhcnQiCgkgICBwaGFzZSA9PSAyIHdoaWNoIGlzICJhZnRlciBmdW5jdGlv biBjYWxsIgoJICAgYnV0IHRoZSBhY3Rpb24gYXBwZWFycyB0byBiZSBpZGVudGljYWwuCgkq LwoJYmFjayA9IGZpbmRfY29kZV9mcmFtZShmKTsKCWJhY2stPmZfdGVtcF92YWwgPSBmLT5m X3RlbXBfdmFsOyBmLT5mX3RlbXBfdmFsID0gTlVMTDsKCWJhY2stPmZfY2FsbGd1YXJkID0g cHJvdGVjdF90aGlzX2ZyYW1lX25leHRfdGltZTsKCVB5X0lOQ1JFRihiYWNrKTsKCWYtPmZf dHN0YXRlLT5mcmFtZSA9IGJhY2s7CglQeV9ERUNSRUYoZik7CglyZXR1cm4gLTQyOyAvKiBk aXNwYXRjaCB0aGUgbmV3IGZyYW1lICovCn0KCgovKiAKCUEgZnJhbWUgaXMgYWN0aXZhdGVk IGJ5IGEgY29udGludWF0aW9uIGZyYW1lIG9yCglyZXN0YXJ0ZWQgZm9yIHNvbWUgb3RoZXIg cmVhc29uLiBUaGVyZWZvcmUKCWl0IHNob3VsZCBydW4gd2l0aG91dCBidWlsZGluZyBhIG5l dyBjb250aW51YXRpb24KCWZyYW1lIGltbWVkaWF0ZWx5LCBidXQgYmUgYXJtZWQgdG8gZG8g c28gbmV4dCB0aW1lLgoqLwoKaW50IHByb3RlY3RfdGhpc19mcmFtZV9uZXh0X3RpbWUoZiwg cGhhc2UpCglQeUZyYW1lT2JqZWN0ICpmOwoJaW50IHBoYXNlOwp7CglpZiAocGhhc2UgIT0g MSkgLyoganVzdCBvbiBlbnRyeSAqLwoJCXJldHVybiAwOwoJZi0+Zl9jYWxsZ3VhcmQgPSBw cm90ZWN0X3RoaXNfZnJhbWU7CglmLT5mX3RlbXBfdmFsID0gTlVMTDsKCXJldHVybiAwOwp9 CgoKUHlPYmplY3QgKiB0aHJvd19jb250aW51YXRpb24oZiwgcGFzc2VkX3JldHZhbCkKCVB5 RnJhbWVPYmplY3QgKmY7CglQeU9iamVjdCAqcGFzc2VkX3JldHZhbDsJLyogcGFzc2luZyBh IGZ1bmN0aW9uIHJldHVybiB2YWx1ZSBiYWNrIGluICovCnsKCS8qIAoJICB3ZSBhcmUgdGhl IGV4ZWN1dG9yIG9mIGEgY29udGludWF0aW9uIGZyYW1lLgoJICBPdXIgdGFzayBpcyB0byBl bnN1cmUgdGhhdCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUKCSAgdGFyZ2V0IGZyYW1lIGlz IGFnYWluIHNhdmVkIGFzIGEgY29udGludWF0aW9uLgoJICBUaGUgY2FsbGVyIG9mIHRoZSBy ZWFsIGZyYW1lIHdpbGwgYmUgdHVybmVkIGludG8KCSAgYSBjb250aW51YXRpb24gYXMgd2Vs bC4KCSovCglQeUZyYW1lT2JqZWN0ICpiYWNrOwoKCWJhY2sgPSBub3JtYWxpemVfY29udGlu dWF0aW9uKGYpOwoKCS8qIGVuc3VyZSB0aGF0IGJhY2sgaXMgc2F2ZWQgYW5kIHByb3RlY3Rl ZCAqLwoJaWYgKGJhY2sgIT0gTlVMTCkgewoJCWlmIChwcm90ZWN0X3RoaXNfZnJhbWUoYmFj aywgMCkpIHsKCQkJYmFjayA9IE5VTEw7CgkJfQoJCWVsc2UgewoJCQliYWNrID0gbm9ybWFs aXplX2NvbnRpbnVhdGlvbihmKTsKCQkJLyogZW5zdXJlIHRoYXQgYmFjaydzIGNhbGxlciBp cyBwcm90ZWN0ZWQgKi8KCQkJaWYgKGJhY2stPmZfYmFjayAhPSBOVUxMKSB7CgkJCQlQeUZy YW1lT2JqZWN0ICogb3RoZXIgPSBmaW5kX2NvZGVfZnJhbWUoYmFjay0+Zl9iYWNrKTsKCQkJ CW90aGVyLT5mX2NhbGxndWFyZCA9IHByb3RlY3RfdGhpc19mcmFtZTsKCQkJfQoJCQliYWNr ID0gc2V0X2V4ZWN1dGlvbl9zdGF0ZShmLCBiYWNrKTsKCQl9Cgl9CgkKICAgIGlmIChiYWNr PT1OVUxMKSB7CgkJUHlFcnJfU2V0U3RyaW5nIChQeUV4Y19TeXN0ZW1FcnJvciwgImJyb2tl biBjb250aW51YXRpb24iKTsKCQkvKiB0cnkgdG8gcmVwYWlyICovCgkJYmFjayA9IGZpbmRf Y29kZV9mcmFtZShmKTsKCQlQeV9YSU5DUkVGKGJhY2spOwoJCWYtPmZfdHN0YXRlLT5mcmFt ZSA9IGJhY2s7CgkJUHlfREVDUkVGKGYpOwoJCVB5X1hERUNSRUYocGFzc2VkX3JldHZhbCk7 CgkJcmV0dXJuIE5VTEw7Cgl9IGVsc2UgewoJCVB5X0lOQ1JFRihiYWNrKTsKCQlmLT5mX3Rz dGF0ZS0+ZnJhbWUgPSBiYWNrOwoJCWYtPmZfdHN0YXRlLT5yZWN1cnNpb25fZGVwdGggPSBm LT5mX3JlZzE7CgkJUHlfREVDUkVGKGYpOwoJCXJldHVybiBwYXNzZWRfcmV0dmFsOwoJfQp9 CgoKLyogTm93IFNhbSdzIGNvbnRpbnVhdGlvbiBtZXRob2RzICovCgovKiAKICA5OTA3MDEg QWZ0ZXIgbXkgZnJhbWUgZGVhbGxvY2F0aW9uIHdhcyBjb3JyZWN0ZWQgdG8KICBhbHNvIGNs ZWFuIHVwIHN0YWNrcywgSSByZWFsaXplZCB0aGF0IGFsc28gcHV0Y2MKICBpcyBub3Qgc28g dHJpdmlhbCwgc2luY2UgaXQgaXMgcnVuIGluIGEgY29udGV4dCB3aGVyZQogIHRoZSBleGVj dXRvciB3YW50cyB0byBmaW5pc2ggaXRzIGZyYW1lLCBidXQgcHV0Y2MKICBtaWdodCBkZWFs bG9jYXRlIGl0IHRvbyBlYXJseS4KCiAgT25lIGNvdWxkIG9mIGNvdXJzZSB3YWxrIGFyb3Vu ZCB0aGlzIGJ5IGNyZWF0aW5nCiAgYW4gZXh0cmEgZnJhbWUgd2hpY2ggaGFzIGEgY2FsbGJh Y2sgd2hpY2guLi4KCiAgQnV0IHdlIGhhdmUgdGhpcyBjYWxsZ3VhcmQgcG9pbnRlciBpbiBm cmFtZXMgYWxyZWFkeS4KICBUaGlzIGlzIHRoZSB3YXkgdG8gZ28hCiAgV2hlbmV2ZXIgYSBm cmFtZSBpcyBhYm91dCB0byBiZSBsZWZ0IGZpbmFsbHkgd2l0aAogIGFuIHVud2luZCB0b2tl biwgd2UgbGV0IGl0IGdlbmVyYXRlIGEgY2FsbGJhY2sKICB3aGljaCBkZXN0cm95cyBpdCBp bW1lZGlhdGVseSBiZWZvcmUgcmV0dXJuaW5nIHRvCiAgdGhlIGRpc3BhdGNoZXIuIFBoZXcg Oi0pCiovCgppbnQgZGVzdHJveV90aGlzX2ZyYW1lKGYsIHBoYXNlKQoJUHlGcmFtZU9iamVj dCAqZjsKCWludCBwaGFzZTsKewoJaWYgKGYtPm9iX3JlZmNudCAhPSAxIHx8IHBoYXNlICE9 IDApIHsKCQlQeUVycl9TZXRTdHJpbmcgKFB5RXhjX1N5c3RlbUVycm9yLCAid3JvbmcgYXR0 ZW1wdCB0byBkZXN0cm95IHRoaXMgZnJhbWUiKTsKCQlyZXR1cm4gLTE7Cgl9CglQeV9ERUNS RUYoZik7CglyZXR1cm4gMDsKfQoKCmludCBhY3F1aXJlX2RlYWRfZGlzcGF0Y2hlcnNfZnJh bWVzKGssIGYpCglQeUZyYW1lT2JqZWN0ICprOwoJUHlGcmFtZU9iamVjdCAqZjsKewoJUHlE aXNwYXRjaGVyT2JqZWN0ICpkaywgKmRmOwoJZGsgPSBrLT5mX2Rpc3BhdGNoZXI7CglpZiAo ZGstPmRfYWxpdmUpCgkJcmV0dXJuIC0xOwoJZGYgPSBmLT5mX2Rpc3BhdGNoZXI7CglkbyB7 CgkJUHlfREVDUkVGKGRrKTsKCQlQeV9JTkNSRUYoZGYpOwoJCWstPmZfZGlzcGF0Y2hlciA9 IGRmOwoJCWsgPSBrLT5mX2JhY2s7Cgl9IHdoaWxlIChrICE9IE5VTEwgJiYgay0+Zl9kaXNw YXRjaGVyPT1kayk7CglyZXR1cm4gMDsKfQoKCnN0YXRpYyBQeU9iamVjdCAqCmJ1aWx0aW5f cHV0Y2MgKHNlbGYsIGFyZ3MpCglQeU9iamVjdCAqc2VsZjsKCVB5T2JqZWN0ICphcmdzOwp7 CglQeUZyYW1lT2JqZWN0ICogaywgKiBmOwoJUHlPYmplY3QgKiB2OwoJaWYgKCFQeUFyZ19Q YXJzZVR1cGxlIChhcmdzLCAiT08iLCAmaywgJnYpKSB7CgkJcmV0dXJuIE5VTEw7Cgl9IGVs c2UgaWYgKCFQeUZyYW1lX0NoZWNrIChrKSB8fCBrLT5mX2V4ZWN1dGUgIT0gdGhyb3dfY29u dGludWF0aW9uKSB7CgkJUHlFcnJfU2V0U3RyaW5nIChQeUV4Y19UeXBlRXJyb3IsICJhcmd1 bWVudCBtdXN0IGJlIGEgY29udGludWF0aW9uIGZyYW1lIik7CgkJcmV0dXJuIE5VTEw7Cgl9 IGVsc2UgewoJCVB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7 CgkJZiA9IHRzdGF0ZS0+ZnJhbWU7CgkJaWYgKGstPmZfZGlzcGF0Y2hlciAhPSBmLT5mX2Rp c3BhdGNoZXIpIHsKCQkJaWYgKGFjcXVpcmVfZGVhZF9kaXNwYXRjaGVyc19mcmFtZXMoaywg ZikpIHsKCQkJCVB5RXJyX1NldFN0cmluZyAoUHlFeGNfVHlwZUVycm9yLCAiZnJhbWUgb2Jq ZWN0cyBhcmUgaW5jb21wYXRpYmxlIik7CgkJCQlyZXR1cm4gTlVMTDsKCQkJfQoJCX0KCQlQ eV9JTkNSRUYodik7CgkJay0+Zl90ZW1wX3ZhbCA9IHY7CgkJay0+Zl9jYWxsZ3VhcmQgPSBw cm90ZWN0X3RoaXNfZnJhbWU7CgkJUHlfSU5DUkVGKGspOwoJCXRzdGF0ZS0+ZnJhbWUgPSBr OwoJCWlmIChmLT5vYl9yZWZjbnQgPiAxKSB7CgkJCVB5X0RFQ1JFRiAoZik7CgkJfSBlbHNl IHsKCQkJZi0+Zl9jYWxsZ3VhcmQgPSBkZXN0cm95X3RoaXNfZnJhbWU7IC8qIHJlYXNvbjog aXQgaXMgc3RpbGwgcnVubmluZyAqLwoJCX0KCQlQeV9ERUNSRUYoZi0+Zl9kaXNwYXRjaGVy KTsKCQlyZXR1cm4gUHlfVW53aW5kVG9rZW47Cgl9Cn0KCgovKiBmb3J3YXJkICovClB5T2Jq ZWN0ICogZ2V0Y2NfY2F0Y2hfZnJhbWUoUHlGcmFtZU9iamVjdCAqLCBQeU9iamVjdCAqKTsK Ci8qCmdldGNjIGlzIGEgbGl0dGxlIHRyaWNreS4gU2FtIHRyaWVkIHRvIGZldGNoIHRoZSBj dXJyZW50IGZyYW1lCmRpcmVjdGx5IGluIHRoZSBmdW5jdGlvbi4gVGhlIHByb2JsZW0gaXMs IHRoYXQgaW4gdGhpcyBjb250ZXh0LAp0aGUgcnVubmluZyBleGVjdXRvciBpcyBub3QgZG9u ZSB3aXRoIHRoZSBmcmFtZS4gV2hpbGUgd2UgYXJlCmluIHRoZSBleGVjdXRvcidzIGNvbnRl eHQsIHRoZXJlIGlzIHN0aWxsIHNvbWUgc3RhdGUgaW4gdGhlIEMgc3RhY2ssCnNpbmNlIHRo ZSBleGVjdXRvciB3YW50cyB0byBwdXNoIGEgcmVzdWx0IHRvIHRoZSBvYmplY3Qgc3RhY2su CgpUbyBnZXQgdGhpcyBjb3JyZWN0LCB3ZSBoYXZlIGluc3RlYWQgdG8gYmFpbCBvdXQgb2Yg dGhlCmV4ZWN1dG9yLiBUaGUgZnJhbWUgaXMgdGhlbiBpbiBhIGNvbnNpc3RlbnQgc3RhdGUs IGV4YWN0bHkKdGhlIG9uZSB3ZSBuZWVkOgpJdCB3YW50cyB0byBiZSByZS1lbnRlcmVkIHdp dGggYSB2YWx1ZS4KKi8KCnN0YXRpYyBQeU9iamVjdCAqCmJ1aWx0aW5fZ2V0Y2MgKHNlbGYs IGFyZ3MpCglQeU9iamVjdCAqc2VsZjsKCVB5T2JqZWN0ICphcmdzOwp7CglpZiAoIVB5QXJn X1BhcnNlVHVwbGUgKGFyZ3MsICIiKSkgewoJCXJldHVybiBOVUxMOwoJfSBlbHNlIHsKCQlQ eUZyYW1lT2JqZWN0ICpmLCAqYmFjazsKCQlQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRo cmVhZFN0YXRlX0dFVCgpOwoJCWYgPSBidWlsZF9jb250aW51YXRpb25fZnJhbWUodHN0YXRl LT5mcmFtZSk7CgkJaWYgKGY9PU5VTEwpCgkJCXJldHVybiBOVUxMOwoKCQkvKiBlbnN1cmUg dGhhdCBiYWNrJ3MgY2FsbGVyIGlzIGEgY29udGludWF0aW9uIGFzIHdlbGwgKi8KCQliYWNr ID0gZi0+Zl9iYWNrOwoJCWlmIChiYWNrICE9IE5VTEwgJiYgYmFjay0+Zl9iYWNrICE9IE5V TEwpIHsKCQkJaWYgKGJ1aWxkX2NvbnRpbnVhdGlvbl9mcmFtZShiYWNrLT5mX2JhY2spID09 IE5VTEwpCgkJCQlyZXR1cm4gTlVMTDsKCQl9CgkKCQlQeV9JTkNSRUYgKGYpOwoJCS8qIGdv b2Qgc28gZmFyLCBqdXN0IHRoYXQgd2UgbmVlZCB0byBsZXQgdGhlIGV4ZWN1dGlvbiBmaW5p c2guICovCgkJLyogdGhlcmVmb3JlLCB3ZSBjaGFuZ2UgdGhlIGV4ZWN1dG9yIGFnYWluLCB0 byBnZXQgYSBjYWxsYmFjayAqLwoJCWYtPmZfZXhlY3V0ZSA9IGdldGNjX2NhdGNoX2ZyYW1l IDsKCQlmLT5mX3RlbXBfdmFsID0gKFB5T2JqZWN0ICopIGY7CgkJUHlfREVDUkVGKGYtPmZf ZGlzcGF0Y2hlcik7CgkJcmV0dXJuIFB5X1Vud2luZFRva2VuOwoJfQp9CgpQeU9iamVjdCAq IGdldGNjX2NhdGNoX2ZyYW1lKGYsIHBhc3NlZF9yZXR2YWwpCglQeUZyYW1lT2JqZWN0ICog ZjsKCVB5T2JqZWN0ICogcGFzc2VkX3JldHZhbDsKewoJUHlGcmFtZU9iamVjdCAqZmI7Cgkv KgoJICBIZXJlIHdlIGFyZSBhZ2FpbiwgYWZ0ZXIgdGhlIGN1cnJlbnQgZXhlY3V0b3IgaGFz IGZpbmlzaGVkCgkgIHRoZSBsYXN0IGZ1bmN0aW9uIGNhbGwgdG8gZ2V0Y2MuIFdlIGZpbmFs aXplIG91ciBmcmFtZXMKCSAgbm93IGFuZCByZXR1cm4gb3VyIGNvbnRpbnVhdGlvbiBmcmFt ZS4KCSovCgoJLyogYmUgc3VyZSB0aGF0IGYgYW5kIHBhc3NlZF9yZXR2YWwgYXJlIGlkZW50 aWNhbCAqLwoJaWYoZiE9KFB5RnJhbWVPYmplY3QqKXBhc3NlZF9yZXR2YWwpIHsKCQlQeUVy cl9TZXRTdHJpbmcgKFB5RXhjX1N5c3RlbUVycm9yLCAid3JvbmcgdmFsdWUgaW4gZ2V0Y2Mh Iik7CgkJcmV0dXJuIE5VTEw7IC8qIGNhbm5vdCBoYXBwZW4sIGJ1dCBiZSBzYWZlICovCgl9 CgkvKiBub3cgZmluYWxpemUgdGhpcyBjb250aW51YXRpb24gKi8KCWYtPmZfZXhlY3V0ZSA9 IHRocm93X2NvbnRpbnVhdGlvbjsKCWZiID0gZi0+Zl9iYWNrOwoJUHlfSU5DUkVGKGZiKTsg Lyogc2luY2UgZXZhbF9jb2RlIHdpbGwgZWF0IG9uZSAqLwoJaWYgKHNldF9leGVjdXRpb25f c3RhdGUoZiwgZmIpID09IE5VTEwpCgkJcmV0dXJuIDA7CgkvKiBnaXZlIHRoZSBmcmFtZSBi YWNrIG5vdywgYnV0IHJ1biB0aGUgY29weSAqLwoJZi0+Zl90c3RhdGUtPmZyYW1lID0gZmI7 CglmYi0+Zl90ZW1wX3ZhbCA9IHBhc3NlZF9yZXR2YWw7CglQeV9ERUNSRUYoZi0+Zl9kaXNw YXRjaGVyKTsgLyogd2lsbCBiZSBhc3NpZ25lZCBhbmQgaW5jcmVmJ2Qgb24gdW53aW5kICov CglyZXR1cm4gUHlfVW53aW5kVG9rZW47Cn0KCgovKiAKdmVyeSBtdWNoIHNpbXBsZXIgYW5k IGVhc2llciB0byB1c2UgaXMgdGhpcwpnZXRwY2MsIGdldCBhIHBhcmVudCdzIGN1cnJlbnQg Y29udGludWF0aW9uCiovCgpzdGF0aWMgUHlPYmplY3QgKgpidWlsdGluX2dldHBjYyAoc2Vs ZiwgYXJncykKCVB5T2JqZWN0ICpzZWxmOwoJUHlPYmplY3QgKmFyZ3M7CnsKCWludCBsZXZl bCA9IDE7CglpZiAoIVB5QXJnX1BhcnNlVHVwbGUgKGFyZ3MsICJ8aSIsICZsZXZlbCkpIHsK CQlyZXR1cm4gTlVMTDsKCX0gZWxzZSBpZiAobGV2ZWwgPD0gMCkgewoJCS8qIHVzZSB0aGUg dHJpY2t5IGdldGNjIHZlcnNpb24uICovCgkJUHlPYmplY3QgKnJldDsKCQlhcmdzID0gUHlU dXBsZV9OZXcoMCk7IC8qIG5ldmVyIGZhaWxzICovCgkJcmV0ID0gYnVpbHRpbl9nZXRjYyhz ZWxmLCBhcmdzKTsKCQlQeV9ERUNSRUYoYXJncyk7CgkJcmV0dXJuIHJldDsKCX0gZWxzZSB7 CgkJUHlGcmFtZU9iamVjdCAqZjsKCQlQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVh ZFN0YXRlX0dFVCgpOwoJCS8qIG1ha2UgYSBjb250aW51YXRpb24gZnJvbSB0aGUgdHJ1ZSBj YWxsZXIgKi8KCQlmID0gdHN0YXRlLT5mcmFtZTsKCQl3aGlsZSAoZiAhPSBOVUxMICYmIGxl dmVsLS0pIAoJCQlmID0gZmluZF9jYWxsZXJfZW50cnkoZik7CgkJaWYgKGY9PU5VTEwpIHsK CQkJUHlFcnJfU2V0U3RyaW5nIChQeUV4Y19WYWx1ZUVycm9yLCAicGFyYW1ldGVyIGV4Y2Vl ZHMgY3VycmVudCBuZXN0aW5nIGxldmVsIik7CgkJCXJldHVybiBOVUxMOwoJCX0KCQkvKiBt YWtlIHN1cmUgdGhpcyBpcyBhIGNvbnRpbnVhdGlvbiAqLwoJCWYgPSBidWlsZF9jb250aW51 YXRpb25fZnJhbWUoZik7CgkJUHlfWElOQ1JFRiAoZik7CgkJewoJCQkvKiBhY3RpdmF0ZSB0 aGUgY2FsbGd1YXJkIHNlY3VyaXR5IGZvciB0aGUgd2hvbGUgY2hhaW4gKi8KCQkJUHlGcmFt ZU9iamVjdCAqeCA9IGY7CgkJCXdoaWxlICh4ICE9IE5VTEwgJiYgeC0+Zl9jYWxsZ3VhcmQ9 PU5VTEwpIHsKCQkJCXgtPmZfY2FsbGd1YXJkID0gcHJvdGVjdF90aGlzX2ZyYW1lOwoJCQkJ eD14LT5mX2JhY2s7CgkJCX0KCQl9CgkJcmV0dXJuIChQeU9iamVjdCAqKSBmOwoJfQp9Cgov KiB2aWV3aW5nIHRoZSBzdGFjayBvZiBhIGZyYW1lICovCgpzdGF0aWMgUHlPYmplY3QgKgpi dWlsdGluX2dldHN0YWNrIChzZWxmLCBhcmdzKQoJUHlPYmplY3QgKnNlbGY7CglQeU9iamVj dCAqYXJnczsKewoJUHlGcmFtZU9iamVjdCAqZjsKCWlmICghUHlBcmdfUGFyc2VUdXBsZSAo YXJncywgIk8hIiwgJlB5RnJhbWVfVHlwZSwgJmYpKSB7CgkJcmV0dXJuIE5VTEw7Cgl9IGVs c2UgewoJCXJldHVybiBzdGFja190b190dXBsZShmKTsKCX0gCn0KCgoKc3RhdGljIFB5TWV0 aG9kRGVmIGNvbnRpbnVhdGlvbl9tZXRob2RzW10gPSB7CiAgeyJwdXRjYyIsCShQeUNGdW5j dGlvbilidWlsdGluX3B1dGNjLCAxfSwKICB7ImdldGNjIiwJKFB5Q0Z1bmN0aW9uKWJ1aWx0 aW5fZ2V0Y2MsIDF9LAogIHsiZ2V0cGNjIiwJKFB5Q0Z1bmN0aW9uKWJ1aWx0aW5fZ2V0cGNj LCAxfSwKICB7ImdldHN0YWNrIiwJKFB5Q0Z1bmN0aW9uKWJ1aWx0aW5fZ2V0c3RhY2ssIDF9 LAogIHtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCn07CgoKLyogSW5pdGlhbGl6YXRp b24gZnVuY3Rpb24gZm9yIHRoZSBtb2R1bGUgKCptdXN0KiBiZSBjYWxsZWQgaW5pdGNvbnRp bnVhdGlvbikgKi8KCi8qIHZlcnNpb24gY2hlY2sgKi8KCmludCBjaGVja192ZXJzaW9uKCkK ewoJY29uc3QgY2hhciAqc3lzOwoJc3lzID0gUHlfR2V0VmVyc2lvbigpOwoJaWYgKHN0cm5j bXAoc3lzLCBQWV9WRVJTSU9OLCBzdHJsZW4oUFlfVkVSU0lPTikpICE9IDApIHsKCQlyZXR1 cm4gMDsKCX0KCXJldHVybiAxOwp9CgoKI2lmZGVmIF9NU0NfVkVSCl9kZWNsc3BlYyhkbGxl eHBvcnQpCiNlbmRpZgp2b2lkCmluaXRjb250aW51YXRpb24oKQp7CglQeU9iamVjdCAqbSwg KmQ7CgoKCWlmICghY2hlY2tfdmVyc2lvbigpKSB7CgkJUHlFcnJfU2V0U3RyaW5nIChQeUV4 Y19JbXBvcnRFcnJvciwgImFyZ3VtZW50IG11c3QgYmUgYSBmcmFtZSBvYmplY3QiKTsKCQly ZXR1cm47Cgl9CgoJLyogQ3JlYXRlIHRoZSBtb2R1bGUgYW5kIGFkZCB0aGUgZnVuY3Rpb25z ICovCgltID0gUHlfSW5pdE1vZHVsZSgiY29udGludWF0aW9uIiwgY29udGludWF0aW9uX21l dGhvZHMpOwoKCS8qIEFkZCBzb21lIHN5bWJvbGljIGNvbnN0YW50cyB0byB0aGUgbW9kdWxl ICovCglkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKCUVycm9yT2JqZWN0ID0gUHlFcnJfTmV3 RXhjZXB0aW9uKCJjb250aW51YXRpb24uZXJyb3IiLCBOVUxMLCBOVUxMKTsKCVB5RGljdF9T ZXRJdGVtU3RyaW5nKGQsICJlcnJvciIsIEVycm9yT2JqZWN0KTsKfQo= --------------EDD81E724667AA03453E0C67--
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4