boost::python, returning new PyObject references
Arnaldur Gylfason
arnaldur at decode.is
Thu Jan 3 20:52:43 CET 2002
--0__=00256B36006B2DF58f9e8a93df938690918c00256B36006B2DF5
Content-type: text/plain; charset=iso-8859-1
Dave,
> > It is true that it is just used
> > for mapping.
> > (Should be used for dictionary also). The reason for it in those cases
> > is
> > detecting illegal key access
> > but allowing setting new key-value pair.
> Normally a proxy would only do the access on demand. I can't think of
> any reason to hold a reference to an object other than the underlying
> sequence or mapping in the proxy. Oh, well I guess in the mapping case
> the proxy should hold a reference to the key object and the underlying
> sequence.
> > You're right that it is probably better to override the get() and
> > reference
> > () methods for mapping
> > (dictionary later) instead of putting it in object_base.
> Did I suggest that? I'm not sure what you're referring to.
The proxy supports the sequence, mapping and number interfaces (plus object
interface through virtual inheritance)
by inheriting from them. It sent the ref to the sequence/mapping item to
the corresponding constructors.
What happens when we have a proxy for a key in a map when the key does not
exist.
a) If the proxy is used in an assignment that is OK and a new key is added
b) Otherwise an Illegal Key error should be thrown.
How can we distinguish between a) and b)? I decided to do that by grabbing
the request for the underlying item
in the get() and reference() methods. Thus by storing a NULL ref the
request can be grabbed and a callback used
to call the key get method.
If you have a better design by all means tell me. I´m not overly pleased
but I thought it was ok.
I have rewritten it though in accordance to some of the things you said and
this logic is just in
the proxy. The get() and reference() have to be virtual though.
I've combined the proxies into 1 , mutable_proxy, now used by sequence,
mapping and list.
The callbacks should be clearer (called get_ and set_ as you suggested).
I believe this is cleaner than before and I hope you can make more out of
it.
Here is objects.hpp: (See attached file: objects.hpp)
> What's the point of having different C++ types, then? You could just use
> the generic object for everything. I suppose there would be a very minor
> speed improvement if you know that an object is in fact a list rather
> than some generic sequence, but I don't think too many people are
> concerned about the speed of code operating at the C++/Python boundary.
The C++ types export the corresponding C API parts:
object - PyObject_*
sequence - PySequence
etc.
I guess maybe sequence, mapping, number should then inherit from
object_base not object.
The proxy should then also inherit from object.
Although a list does not support the __call__ interface we could have a
user-defined class that supports both the sequence and __call__ interfaces.
I am inclined to letting sequence, mapping etc. inherit from object_base
but supporting more combinations of interfaces:
object and sequence , object and mapping etc.
What do you think?
Cheers
Arnaldur
--0__=00256B36006B2DF58f9e8a93df938690918c00256B36006B2DF5
Content-type: application/octet-stream;
name="objects.hpp"
Content-Disposition: attachment; filename="objects.hpp"
Content-transfer-encoding: base64
Ly8gIChDKSBDb3B5cmlnaHQgRGF2aWQgQWJyYWhhbXMgMjAwMC4gUGVybWlzc2lvbiB0byBjb3B5
LCB1c2UsIG1vZGlmeSwgc2VsbCBhbmQKLy8gIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBpcyBn
cmFudGVkIHByb3ZpZGVkIHRoaXMgY29weXJpZ2h0IG5vdGljZSBhcHBlYXJzCi8vICBpbiBhbGwg
Y29waWVzLiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNz
IG9yIGltcGxpZWQKLy8gIHdhcnJhbnR5LCBhbmQgd2l0aCBubyBjbGFpbSBhcyB0byBpdHMgc3Vp
dGFiaWxpdHkgZm9yIGFueSBwdXJwb3NlLgovLwovLyAgVGhlIGF1dGhvciBncmF0ZWZ1bGx5IGFj
a25vd2xlZ2VzIHRoZSBzdXBwb3J0IG9mIERyYWdvbiBTeXN0ZW1zLCBJbmMuLCBpbgovLyAgcHJv
ZHVjaW5nIHRoaXMgd29yay4KCiNpZm5kZWYgT0JKRUNUU19EV0EwNTExMDBfSF8KIyBkZWZpbmUg
T0JKRUNUU19EV0EwNTExMDBfSF8KCiMgaW5jbHVkZSA8Ym9vc3QvcHl0aG9uL2RldGFpbC93cmFw
X3B5dGhvbi5ocHA+CiMgaW5jbHVkZSA8Ym9vc3QvcHl0aG9uL2RldGFpbC9jb25maWcuaHBwPgoj
IGluY2x1ZGUgPGJvb3N0L3B5dGhvbi9yZWZlcmVuY2UuaHBwPgojIGluY2x1ZGUgImJvb3N0L29w
ZXJhdG9ycy5ocHAiCiMgaW5jbHVkZSAiYm9vc3QvZnVuY3Rpb24uaHBwIgojIGluY2x1ZGUgImJv
b3N0L2JpbmQuaHBwIgojIGluY2x1ZGUgImJvb3N0L2l0ZXJhdG9yX2FkYXB0b3JzLmhwcCIKIyBp
bmNsdWRlICJQeXRob24uaCIKIyBpbmNsdWRlIDx1dGlsaXR5PgojaW5jbHVkZSA8aW9zdHJlYW0+
CgpuYW1lc3BhY2UgYm9vc3QgeyBuYW1lc3BhY2UgcHl0aG9uIHsKCgovKioKICogQSB3cmFwcGVy
IGZvciBhIHJlZiAoc21hcnQgcG9pbnRlciB0byBhIFB5T2JqZWN0LCBzZWUgcmVmZXJlbmNlLmhw
cCkuCiAqIFRoZSBiYXNlIGZvciBhbGwgcHl0aG9uIGludGVyZmFjZXMuCiAqIFxwYXIgRXh0ZW5z
aW9uOgogKiBBbGwgcHl0aG9uIGludGVyZmFjZXMgc2hvdWxkIGluaGVyaXQgKGRpcmVjdGx5IG9y
IGluZGlyZWN0bHkpIGZyb20gdGhpcyBjbGFzcy4KICoKICovCmNsYXNzIG9iamVjdF9iYXNlCnsK
IHB1YmxpYzoKICAgIGV4cGxpY2l0IG9iamVjdF9iYXNlKHJlZiBwKSA6IG1fcChwKSB7IH0KICAg
IAogICAgLy8gTk9URSEgVGhpcyBvbmx5IGFwcGllcyBpZiByaHMgaXMgYSBtdXRhYmxlX3Byb3h5
OiBJZiByaHMubV9wLmdldCgpIGlzIDAsCiAgICAvLyBhIHNlZ21lbnRhdGlvbiBmYXVsdCBvY2N1
cnMgaWYgdGhlIGRlZmF1bHQgY29weSBjb25zdHJ1Y3RvciBpcyB1c2VkIAogICAgLy8gKHBlY3Vs
aWFyIHNpbmNlIFB5X1hJTkNSRUYgaXMgdXNlZCBpbiByZWYgY29weSBjb25zdHJ1Y3RvcikKICAg
IC8vIFdlIG11c3QgY2FsbCByaHMucmVmZXJlbmNlKCkgdG8gY2FsbCB0aGUgY2FsbGJhY2sgZnVu
Y3Rpb24gaW4gdGhhdCBjYXNlLgogICAgb2JqZWN0X2Jhc2UoY29uc3Qgb2JqZWN0X2Jhc2UmIHJo
cykgOiBtX3AocmhzLnJlZmVyZW5jZSgpKSB7IH0KICAgIAogICAgLy8gU2ltaWxhciByZW1hcmtz
IHRvIHRoZSBjb3B5IGNvbnN0cnVjdG9yCiAgICBvYmplY3RfYmFzZSYgb3BlcmF0b3I9KGNvbnN0
IG9iamVjdF9iYXNlJiByaHMpCiAgICB7CiAgICAgICBpZiAodGhpcyA9PSAmcmhzKSByZXR1cm4g
KnRoaXM7CiAgICAgICBtX3AgPSByaHMucmVmZXJlbmNlKCk7CiAgICAgICByZXR1cm4gKnRoaXM7
CiAgICB9CiAgICAKICAgIC8vIFJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUgaGVsZCBvYmplY3QK
ICAgIHZpcnR1YWwgcmVmIHJlZmVyZW5jZSgpIGNvbnN0CiAgICB7CiAgICAgICByZXR1cm4gbV9w
OwogICAgfQoKICAgIC8vIFJldHVybiBhIHJhdyBwb2ludGVyIHRvIHRoZSBoZWxkIG9iamVjdAog
ICAgdmlydHVhbCBQeU9iamVjdCogZ2V0KCkgY29uc3QKICAgIHsKICAgICAgIHJldHVybiBtX3Au
Z2V0KCk7CiAgICB9CiAgICAKICAgIHZvaWQgcmVzZXQocmVmIG5ld19yZWYpIGNvbnN0CiAgICB7
CiAgICAgICBtX3AgPSBuZXdfcmVmOwogICAgfQogCgogICAgb3BlcmF0b3IgcmVmKCkgY29uc3QK
ICAgIHsKICAgICAgIHJldHVybiByZWZlcmVuY2UoKTsgCiAgICB9CiAgICAKIHByaXZhdGU6CiAg
ICBtdXRhYmxlIHJlZiBtX3A7Cn07CgoKCgoKY2xhc3Mgb2JqZWN0IDogcHVibGljIG9iamVjdF9i
YXNlCnsKICAgICAgCnB1YmxpYzoKICAgc3RhdGljIGJvb2wgYWNjZXB0cyhyZWYgcCkKICAgewog
ICAgICByZXR1cm4gcC5nZXQoKTsKICAgfQogICAKICAgZXhwbGljaXQgb2JqZWN0KHJlZiBwb2Jq
KTogb2JqZWN0X2Jhc2UocG9iaikgeyB9CgogICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogICB2b2lk
IHNldGF0dHIoY2hhciogYXR0cl9uYW1lLFQgdmFsKQogICB7CiAgICAgIFB5T2JqZWN0X1NldEF0
dHJTdHJpbmcoZ2V0KCksYXR0cl9uYW1lLG1ha2VfcmVmKHZhbCkuZ2V0KCkpOwogICB9CgogICB0
ZW1wbGF0ZTx0eXBlbmFtZSBUPgogICB2b2lkIGdldGF0dHIoY2hhciogYXR0cl9uYW1lLFQgJiB2
YWwpIGNvbnN0CiAgIHsKICAgICAgdmFsID0gZnJvbV9weXRob24ocmVmKFB5T2JqZWN0X0dldEF0
dHJTdHJpbmcoZ2V0KCksYXR0cl9uYW1lKSkuZ2V0KCksCiAgICAgICAgICAgICAgICAgICAgICAg
IHB5dGhvbjo6dHlwZTxUPigpKTsKICAgfQoKICAgb2JqZWN0IGdldGF0dHIoY2hhciogYXR0cl9u
YW1lKSBjb25zdAogICB7CiAgICAgIHJldHVybiBvYmplY3QocmVmKFB5T2JqZWN0X0dldEF0dHJT
dHJpbmcoZ2V0KCksYXR0cl9uYW1lKSkpOwogICB9CiAgIAoKICAgYm9vbCBoYXNhdHRyKGNoYXIq
IGF0dHJfbmFtZSkgY29uc3QKICAgewogICAgICByZXR1cm4gUHlPYmplY3RfSGFzQXR0clN0cmlu
ZyhnZXQoKSxhdHRyX25hbWUpICE9IDA7CiAgIH0KICAgCiAgIGludCBsZW4oKSBjb25zdAogICB7
CiAgICAgIHJldHVybiBQeU9iamVjdF9MZW5ndGgoZ2V0KCkpOwogICB9CiAgIAogICBzdGQ6OnN0
cmluZyBzdHIoKSBjb25zdAogICB7CiAgICAgIHJlZiBzdHIoUHlPYmplY3RfU3RyKGdldCgpKSk7
CiAgICAgIHJldHVybiBmcm9tX3B5dGhvbihzdHIuZ2V0KCkscHl0aG9uOjp0eXBlPHN0ZDo6c3Ry
aW5nPigpKTsKICAgfQoKICAgb2JqZWN0IG9wZXJhdG9yKCkoKQogICB7CiAgICAgIHJldHVybiBv
YmplY3QocmVmKFB5T2JqZWN0X0NhbGxGdW5jdGlvbihnZXQoKSwiKCkiKSkpOwogICB9CgogICBv
YmplY3QgY2FsbF9tZXRob2QoY2hhciogbWV0aG9kX25hbWUpCiAgIHsKICAgICAgcmV0dXJuIG9i
amVjdChyZWYoUHlPYmplY3RfQ2FsbE1ldGhvZChnZXQoKSxtZXRob2RfbmFtZSwiKCkiKSkpOwog
ICB9CgogICB0ZW1wbGF0ZSA8Y2xhc3MgQTE+CiAgIG9iamVjdCBvcGVyYXRvcigpKGNvbnN0IEEx
JiBhMSkKICAgewogICAgICByZXR1cm4gb2JqZWN0KHJlZihQeU9iamVjdF9DYWxsRnVuY3Rpb24o
Z2V0KCksIihPKSIsbWFrZV9yZWYoYTEpLmdldCgpKSkpOwogICB9CgogICB0ZW1wbGF0ZSA8Y2xh
c3MgQTE+CiAgIG9iamVjdCBjYWxsX21ldGhvZChjaGFyKiBtZXRob2RfbmFtZSxjb25zdCBBMSYg
YTEpCiAgIHsKICAgICAgcmV0dXJuIG9iamVjdChyZWYoUHlPYmplY3RfQ2FsbE1ldGhvZChnZXQo
KSxtZXRob2RfbmFtZSwiKE8pIiwKICAgICAgICAgICAgICAgICAgICBtYWtlX3JlZihhMSkuZ2V0
KCkpKSk7CiAgIH0KCiAgIHRlbXBsYXRlIDxjbGFzcyBBMSwgY2xhc3MgQTI+CiAgIG9iamVjdCBv
cGVyYXRvcigpKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyKQogICB7CiAgICAgIHJldHVybiBv
YmplY3QocmVmKFB5T2JqZWN0X0NhbGxGdW5jdGlvbihnZXQoKSwiKE9PKSIsbWFrZV9yZWYoYTEp
LmdldCgpLAogICAgICAgICAgICAgICAgICAgIG1ha2VfcmVmKGEyKS5nZXQoKSkpKTsKICAgfQoK
ICAgdGVtcGxhdGUgPGNsYXNzIEExLCBjbGFzcyBBMj4KICAgb2JqZWN0IGNhbGxfbWV0aG9kKGNo
YXIqIG1ldGhvZF9uYW1lLGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyKQogICB7CiAgICAgIHJl
dHVybiBvYmplY3QocmVmKFB5T2JqZWN0X0NhbGxNZXRob2QoZ2V0KCksbWV0aG9kX25hbWUsIihP
TykiLAogICAgICAgICAgICAgICAgICAgIG1ha2VfcmVmKGExKS5nZXQoKSxtYWtlX3JlZihhMiku
Z2V0KCkpKSk7CiAgIH0KICAgCiAgIHRlbXBsYXRlPGNsYXNzIFQ+CiAgIG9wZXJhdG9yIFQoKSBj
b25zdAogICB7CiAgICAgIGNvdXQgPDwgIm9wZXJhdG9yIFQoKSIgPDwgZW5kbDsKICAgICAgcmV0
dXJuIGZyb21fcHl0aG9uKGdldCgpLHR5cGU8VD4oKSk7CiAgIH0KICAgCn07CgoKY2xhc3MgbnVt
YmVyIDogcHVibGljIHZpcnR1YWwgb2JqZWN0CnsKcHVibGljOgogICBzdGF0aWMgYm9vbCBhY2Nl
cHRzKHJlZiByKSB7IHJldHVybiBQeU51bWJlcl9DaGVjayhyLmdldCgpKTsgfQogICAKICAgZXhw
bGljaXQgbnVtYmVyKGNvbnN0IG9iamVjdCAmIG9iaik6IG9iamVjdChvYmopIHt9CiAgIAogICBl
eHBsaWNpdCBudW1iZXIoY29uc3QgcmVmJiByaHMpOiBvYmplY3QocmhzKSB7fQoKCiAgIC8vIG9w
ZXJhdG9yIHN1cHBvcnQgZm9yIEMrKyB0eXBlcwoKICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAg
bnVtYmVyJiBvcGVyYXRvcis9KFQgeCkKICAgewogICAgICByZWYgdG1wKFB5TnVtYmVyX0luUGxh
Y2VBZGQoZ2V0KCksbWFrZV9yZWYoeCkuZ2V0KCkpKTsKICAgICAgcmVzZXQodG1wKTsKICAgICAg
cmV0dXJuICp0aGlzOwogICB9CiAgIAogICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogICBudW1iZXIm
IG9wZXJhdG9yLT0oVCB4KQogICB7CiAgICAgIHJlZiB0bXAoUHlOdW1iZXJfSW5QbGFjZVN1YnRy
YWN0KGdldCgpLG1ha2VfcmVmKHgpLmdldCgpKSk7CiAgICAgIHJlc2V0KHRtcCk7CiAgICAgIHJl
dHVybiAqdGhpczsKICAgfQoKICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgbnVtYmVyJiBvcGVy
YXRvcio9KFQgeCkKICAgewogICAgICByZWYgdG1wKFB5TnVtYmVyX0luUGxhY2VNdWx0aXBseShn
ZXQoKSxtYWtlX3JlZih4KS5nZXQoKSkpOwogICAgICByZXNldCh0bXApOwogICAgICByZXR1cm4g
KnRoaXM7CiAgIH0KCiAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiAgIG51bWJlciYgb3BlcmF0b3Iv
PShUIHgpCiAgIHsKICAgICAgcmVmIHRtcChQeU51bWJlcl9JblBsYWNlRGl2aWRlKGdldCgpLG1h
a2VfcmVmKHgpLmdldCgpKSk7CiAgICAgIHJlc2V0KHRtcCk7CiAgICAgIHJldHVybiAqdGhpczsK
ICAgfQoKICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgbnVtYmVyJiBvcGVyYXRvciU9KFQgeCkK
ICAgewogICAgICByZWYgdG1wKFB5TnVtYmVyX0luUGxhY2VSZW1haW5kZXIoZ2V0KCksbWFrZV9y
ZWYoeCkuZ2V0KCkpKTsKICAgICAgcmVzZXQodG1wKTsKICAgICAgcmV0dXJuICp0aGlzOwogICB9
CgogICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogICBudW1iZXImIG9wZXJhdG9yfD0oVCB4KQogICB7
CiAgICAgIHJlZiB0bXAoUHlOdW1iZXJfSW5QbGFjZU9yKGdldCgpLG1ha2VfcmVmKHgpLmdldCgp
KSk7CiAgICAgIHJlc2V0KHRtcCk7CiAgICAgIHJldHVybiAqdGhpczsKICAgfQoKICAgdGVtcGxh
dGU8dHlwZW5hbWUgVD4KICAgbnVtYmVyJiBvcGVyYXRvciY9KFQgeCkKICAgewogICAgICByZWYg
dG1wKFB5TnVtYmVyX0luUGxhY2VBbmQoZ2V0KCksbWFrZV9yZWYoeCkuZ2V0KCkpKTsKICAgICAg
cmVzZXQodG1wKTsKICAgICAgcmV0dXJuICp0aGlzOwogICB9CgogICB0ZW1wbGF0ZTx0eXBlbmFt
ZSBUPgogICBudW1iZXImIG9wZXJhdG9yXj0oVCB4KQogICB7CiAgICAgIHJlZiB0bXAoUHlOdW1i
ZXJfSW5QbGFjZVhvcihnZXQoKSxtYWtlX3JlZih4KS5nZXQoKSkpOwogICAgICByZXNldCh0bXAp
OwogICAgICByZXR1cm4gKnRoaXM7CiAgIH0KICAgCiAgIAp9OwoKCnRlbXBsYXRlPHR5cGVuYW1l
IFQ+Cm51bWJlciBvcGVyYXRvcisoVCB2YWwsY29uc3QgbnVtYmVyJiBuKQp7CiAgIHJldHVybiBu
dW1iZXIobikgKz0gdmFsOwp9Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpudW1iZXIgb3BlcmF0b3Ir
KGNvbnN0IG51bWJlciYgbiwgVCB2YWwpCnsKICAgcmV0dXJuIG51bWJlcihuKSArPSB2YWw7Cn0K
Cm51bWJlciBvcGVyYXRvcisoY29uc3QgbnVtYmVyJiBuLCBjb25zdCBudW1iZXImIHZhbCk7CgoK
CmNsYXNzIG11dGFibGVfcHJveHk7CgoKY2xhc3Mgc2VxdWVuY2UgOiBwdWJsaWMgdmlydHVhbCBv
YmplY3QKewpwdWJsaWM6CiAgIHN0YXRpYyBib29sIGFjY2VwdHMocmVmIHApCiAgIHsKICAgICAg
cmV0dXJuIFB5U2VxdWVuY2VfQ2hlY2socC5nZXQoKSk7CiAgIH0KCiAgIGV4cGxpY2l0IHNlcXVl
bmNlKGNvbnN0IG9iamVjdCAmIG9iaik6IG9iamVjdChvYmopIHt9CiAgIAogICBleHBsaWNpdCBz
ZXF1ZW5jZShjb25zdCByZWYmIHJocyk6IG9iamVjdChyaHMpIHt9CiAgIAogICBjb25zdCBtdXRh
YmxlX3Byb3h5IG9wZXJhdG9yW10oaW50IGkpIGNvbnN0OwoKICAgbXV0YWJsZV9wcm94eSBvcGVy
YXRvcltdKGludCBpKTsKICAgCiAgIHRlbXBsYXRlPGNsYXNzIFQ+CiAgIHZvaWQgYXBwZW5kKGNv
bnN0IFQmIHZhbCk7IC8vIGJ1aWxkcyBhIGxpc3QgaG9sZGluZyBqdXN0IHZhbCwgYW5kIGNhbGxz
ICs9LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbXBsZW0uIGFmdGVyIGxpc3QK
ICAgCiAgIGludCBzaXplKCkgY29uc3QKICAgewogICAgICByZXR1cm4gUHlTZXF1ZW5jZV9TaXpl
KGdldCgpKTsKICAgfQogICAKICAgcmVmIGdldF9pdGVtKGludCBpKSBjb25zdAogICB7CiAgICAg
IHJldHVybiByZWYoUHlTZXF1ZW5jZV9HZXRJdGVtKGdldCgpLGkpKTsKICAgfQoKICAgdGVtcGxh
dGU8Y2xhc3MgVD4KICAgdm9pZCBzZXRfaXRlbShpbnQgaSxjb25zdCBUJiB2YWwpCiAgIHsKICAg
ICAgc2V0X2l0ZW0oaSxtYWtlX3JlZih2YWwpKTsKICAgfQoKICAgdm9pZCBzZXRfaXRlbShpbnQg
aSxjb25zdCByZWYmIHJ2YWwpCiAgIHsKICAgICAgUHlTZXF1ZW5jZV9TZXRJdGVtKGdldCgpLGks
cnZhbC5nZXQoKSk7CiAgIH0gIAoKICAgdm9pZCByc2V0X2l0ZW0oaW50IGksY29uc3QgcmVmJiBy
dmFsKQogICB7CiAgICAgIFB5U2VxdWVuY2VfU2V0SXRlbShnZXQoKSxpLHJ2YWwuZ2V0KCkpOwog
ICB9ICAKCiAgIAogICB0ZW1wbGF0ZTxjbGFzcyBUPgogICBzZXF1ZW5jZSYgb3BlcmF0b3IrPShj
b25zdCBUJiB2YWwpCiAgIHsKICAgICAgcmVmIHRtcChQeVNlcXVlbmNlX0luUGxhY2VDb25jYXQo
Z2V0KCksbWFrZV9yZWYodmFsKS5nZXQoKSkpOwogICAgICByZXNldCh0bXApOwogICAgICByZXR1
cm4gKnRoaXM7CiAgIH0KCn07CgoKY2xhc3MgbWFwcGluZyA6IHB1YmxpYyB2aXJ0dWFsIG9iamVj
dAp7CnB1YmxpYzoKCiAgIHN0YXRpYyBib29sIGFjY2VwdHMocmVmIHApCiAgIHsKICAgICAgcmV0
dXJuIFB5TWFwcGluZ19DaGVjayhwLmdldCgpKTsKICAgfQogICAKICAgZXhwbGljaXQgbWFwcGlu
Zyhjb25zdCBvYmplY3QgJiBvYmopOiBvYmplY3Qob2JqKSB7fQogICAKICAgZXhwbGljaXQgbWFw
cGluZyhjb25zdCByZWYmIHJocyk6IG9iamVjdChyaHMpIHt9CgogICB0ZW1wbGF0ZTxjbGFzcyBU
PgogICBtdXRhYmxlX3Byb3h5IG9wZXJhdG9yW10oY29uc3QgVCAmIGtleSk7CgogICB0ZW1wbGF0
ZTxjbGFzcyBUPgogICBjb25zdCBtdXRhYmxlX3Byb3h5IG9wZXJhdG9yW10oY29uc3QgVCAmIGtl
eSkgY29uc3Q7CgogICB0ZW1wbGF0ZTxjbGFzcyBUPgogICBib29sIGhhc19rZXkoY29uc3QgVCAm
IGtleSkgY29uc3QKICAgewogICAgICByZXR1cm4gaGFzX2tleShtYWtlX3JlZihrZXkpKTsKICAg
fQoKICAgYm9vbCBoYXNfa2V5KGNvbnN0IHJlZiAmIGtleSkgY29uc3QKICAgewogICAgICByZXR1
cm4gUHlNYXBwaW5nX0hhc0tleShnZXQoKSxrZXkuZ2V0KCkpOwogICB9CiAgIAogICBzZXF1ZW5j
ZSBrZXlzKCkgY29uc3QKICAgewogICAgICByZXR1cm4gc2VxdWVuY2UocmVmKFB5TWFwcGluZ19L
ZXlzKGdldCgpKSkpOwogICB9CgogICBzZXF1ZW5jZSB2YWx1ZXMoKSBjb25zdAogICB7CiAgICAg
IHJldHVybiBzZXF1ZW5jZShyZWYoUHlNYXBwaW5nX1ZhbHVlcyhnZXQoKSkpKTsKICAgfQoKICAg
c2VxdWVuY2UgaXRlbXMoKSBjb25zdAogICB7CiAgICAgIHJldHVybiBzZXF1ZW5jZShyZWYoUHlN
YXBwaW5nX0l0ZW1zKGdldCgpKSkpOwogICB9CgogICB0ZW1wbGF0ZSA8Y2xhc3MgS2V5PgogICBy
ZWYgZ2V0X2l0ZW0oY29uc3QgS2V5JiBrZXkpIGNvbnN0CiAgIHsgCiAgICAgIHJldHVybiB0aGlz
LT5nZXRfaXRlbShtYWtlX3JlZihrZXkpKTsgCiAgIH0KCiAgIHJlZiBnZXRfaXRlbShjb25zdCBy
ZWYmIGtleSkgY29uc3QKICAgewogICAgICByZXR1cm4gcmVmKFB5T2JqZWN0X0dldEl0ZW0oZ2V0
KCksa2V5LmdldCgpKSk7CiAgIH0KCiAgIHJlZiByZ2V0X2l0ZW0oY29uc3QgcmVmJiBrZXkpIGNv
bnN0CiAgIHsKICAgICAgcmV0dXJuIHJlZihQeU9iamVjdF9HZXRJdGVtKGdldCgpLGtleS5nZXQo
KSkpOwogICB9CgogICB0ZW1wbGF0ZSA8Y2xhc3MgS2V5LCBjbGFzcyBWYWx1ZT4KICAgdm9pZCBz
ZXRfaXRlbShjb25zdCBLZXkmIGtleSwgY29uc3QgVmFsdWUmIHZhbHVlKQogICB7CiAgICAgIHRo
aXMtPnNldF9pdGVtKG1ha2VfcmVmKGtleSksIG1ha2VfcmVmKHZhbHVlKSk7IAogICB9CgogICB2
b2lkIHNldF9pdGVtKGNvbnN0IHJlZiYga2V5LCBjb25zdCByZWYmIHZhbHVlKQogICB7CiAgICAg
IFB5T2JqZWN0X1NldEl0ZW0oZ2V0KCksa2V5LmdldCgpLHZhbHVlLmdldCgpKTsKICAgfQoKCiAg
IHZvaWQgcnNldF9pdGVtKGNvbnN0IHJlZiYga2V5LCBjb25zdCByZWYmIHZhbHVlKQogICB7CiAg
ICAgIFB5T2JqZWN0X1NldEl0ZW0oZ2V0KCksa2V5LmdldCgpLHZhbHVlLmdldCgpKTsKICAgfQoK
Cn07CgoKCmNsYXNzIHNlcW1hcCA6IHB1YmxpYyBzZXF1ZW5jZSAsIHB1YmxpYyBtYXBwaW5nCnsK
cHVibGljOgoKICAgc3RhdGljIGJvb2wgYWNjZXB0cyhyZWYgcCkKICAgewogICAgICByZXR1cm4g
c2VxdWVuY2U6OmFjY2VwdHMocCkgJiYgbWFwcGluZzo6YWNjZXB0cyhwKTsKICAgfQoKICAgZXhw
bGljaXQgc2VxbWFwKGNvbnN0IG9iamVjdCAmIG9iaik6IG9iamVjdChvYmopLCBzZXF1ZW5jZShv
YmplY3Q6OnJlZmVyZW5jZSgpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIG1hcHBpbmcob2JqZWN0OjpyZWZlcmVuY2UoKSkge30KICAgCiAgIGV4cGxpY2l0IHNlcW1h
cChjb25zdCByZWYmIHJocyk6IG9iamVjdChyaHMpLCBzZXF1ZW5jZShvYmplY3Q6OnJlZmVyZW5j
ZSgpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcob2JqZWN0
OjpyZWZlcmVuY2UoKSkge30KCiAgIGNvbnN0IG11dGFibGVfcHJveHkgb3BlcmF0b3JbXShpbnQg
aSkgY29uc3Q7CiAgIG11dGFibGVfcHJveHkgb3BlcmF0b3JbXShpbnQgaSk7CgogICB0ZW1wbGF0
ZTxjbGFzcyBUPgogICBtdXRhYmxlX3Byb3h5IG9wZXJhdG9yW10oY29uc3QgVCAmIGtleSk7CiAg
IAogICB0ZW1wbGF0ZTxjbGFzcyBUPgogICBjb25zdCBtdXRhYmxlX3Byb3h5IG9wZXJhdG9yW10o
Y29uc3QgVCAmIGtleSkgY29uc3Q7CiAgIAogICAvLyBEZWZpbmVkIGJlY2F1c2UgdGhlIGRlZmF1
bHQgaW1wbGVtZW50YXRpb24gaXMgdW5zcGVjaWZpZWQgcmVnYXJkaW5nIAogICAvLyBob3cgb2Z0
ZW4gYSB2aXJ0dWFsIGJhc2UgY2xhc3MgaXMgYXNzaWduZWQKICAgc2VxbWFwJiBvcGVyYXRvcj0o
Y29uc3Qgc2VxbWFwJiByaHMpCiAgIHsKICAgICAgdGhpcy0+b2JqZWN0X2Jhc2U6Om9wZXJhdG9y
PShyaHMpOwogICAgICByZXR1cm4gKnRoaXM7CiAgIH0KICAgCn07CgoKY2xhc3Mgc2VxbWFwbnVt
IDogcHVibGljIHNlcW1hcCwgcHVibGljIG51bWJlcgp7CnB1YmxpYzoKCiAgIHN0YXRpYyBib29s
IGFjY2VwdHMocmVmIHApCiAgIHsKICAgICAgcmV0dXJuIHNlcW1hcDo6YWNjZXB0cyhwKSAmJiBu
dW1iZXI6OmFjY2VwdHMocCk7CiAgIH0KCiAgIGV4cGxpY2l0IHNlcW1hcG51bShjb25zdCBvYmpl
Y3QgJiBvYmopOiBvYmplY3Qob2JqKSwgc2VxbWFwKG9iamVjdDo6cmVmZXJlbmNlKCkpLAogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyKG9iamVjdDo6cmVm
ZXJlbmNlKCkpIHt9CiAgIAogICBleHBsaWNpdCBzZXFtYXBudW0oY29uc3QgcmVmJiByaHMpOiBv
YmplY3QocmhzKSwgc2VxbWFwKG9iamVjdDo6cmVmZXJlbmNlKCkpLAogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIob2JqZWN0OjpyZWZlcmVuY2UoKSkge30KCiAg
IC8vIERlZmluZWQgYmVjYXVzZSB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyB1bnNwZWNp
ZmllZCByZWdhcmRpbmcgCiAgIC8vIGhvdyBvZnRlbiBhIHZpcnR1YWwgYmFzZSBjbGFzcyBpcyBh
c3NpZ25lZAogICBzZXFtYXBudW0mIG9wZXJhdG9yPShjb25zdCBzZXFtYXBudW0mIHJocykKICAg
ewogICAgICB0aGlzLT5vYmplY3RfYmFzZTo6b3BlcmF0b3I9KHJocyk7CiAgICAgIHJldHVybiAq
dGhpczsKICAgfQoKICAgLy8gRXhwb3J0IHRoZSBudW1iZXI6Ois9IGluc3RlYWQgb2Ygc2VxdWVu
Y2U6Ois9CiAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiAgIHNlcW1hcG51bSYgb3BlcmF0b3IrPShU
IHgpCiAgIHsKICAgICAgdGhpcy0+bnVtYmVyOjpvcGVyYXRvcis9KHgpOwogICAgICByZXR1cm4g
KnRoaXM7CiAgIH0KICAgCn07CgoKY2xhc3MgbXV0YWJsZV9wcm94eSA6IHB1YmxpYyBzZXFtYXBu
dW0KewogcHVibGljOgogICAgZXhwbGljaXQgbXV0YWJsZV9wcm94eShib29zdDo6ZnVuY3Rpb248
cmVmPiBnZXRfY2FsbGJhY2spOiAgb2JqZWN0KHJlZigpKSwKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgc2VxbWFwbnVtKG9iamVjdDo6cmVmZXJlbmNlKCkpLCBnZXRfKGdldF9jYWxsYmFj
aykKICAgIHsgfQogICAgCiAgICBleHBsaWNpdCBtdXRhYmxlX3Byb3h5KGJvb3N0OjpmdW5jdGlv
bjxyZWY+IGdldF9jYWxsYmFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OmZ1
bmN0aW9uPHZvaWQscmVmPiBzZXRfY2FsbGJhY2spOiAgb2JqZWN0KHJlZigpKSwKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgc2VxbWFwbnVtKG9iamVjdDo6cmVmZXJlbmNlKCkpLCBnZXRf
KGdldF9jYWxsYmFjayksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldF8oc2V0X2Nh
bGxiYWNrKSB7fQoKICAgCiAgIC8vIFJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUgaGVsZCBvYmpl
Y3QKICAgdmlydHVhbCByZWYgcmVmZXJlbmNlKCkgY29uc3QKICAgewogICAgICBpZiAoIW9iamVj
dF9iYXNlOjpnZXQoKSkKICAgICAgICAgcmVzZXQoZ2V0XygpKTsKCiAgICAgIHJldHVybiBvYmpl
Y3RfYmFzZTo6cmVmZXJlbmNlKCk7CiAgIH0KCiAgICAvLyBSZXR1cm4gYSByYXcgcG9pbnRlciB0
byB0aGUgaGVsZCBvYmplY3QKICAgIHZpcnR1YWwgUHlPYmplY3QqIGdldCgpIGNvbnN0CiAgICB7
CiAgICAgIGlmICghb2JqZWN0X2Jhc2U6OmdldCgpKQogICAgICAgICByZXNldChnZXRfKCkpOwog
ICAgICByZXR1cm4gb2JqZWN0X2Jhc2U6OmdldCgpOyAKICAgIH0KCiAgIHRlbXBsYXRlPGNsYXNz
IFQ+CiAgIG11dGFibGVfcHJveHkmIG9wZXJhdG9yPShjb25zdCBUJiByaHMpCiAgIHsKICAgICAg
cmVmIHZhbChtYWtlX3JlZihyaHMpKTsKICAgICAgaWYgKHNldF8uZW1wdHkoKSkKICAgICAgICAg
dGhyb3cgcnVudGltZV9lcnJvcigiQXNzaWdubWVudCBub3QgcG9zc2libGUhIik7CiAgICAgIHNl
dF8odmFsKTsKICAgICAgcmVzZXQodmFsKTsKICAgICAgcmV0dXJuICp0aGlzOwogICB9CgogICBt
dXRhYmxlX3Byb3h5JiBvcGVyYXRvcj0oY29uc3QgbXV0YWJsZV9wcm94eSYgcmhzKQogICB7CiAg
ICAgIGlmICh0aGlzID09ICZyaHMpIHJldHVybiAqdGhpczsKICAgICAgaWYgKHNldF8uZW1wdHko
KSkKICAgICAgICAgdGhyb3cgcnVudGltZV9lcnJvcigiQXNzaWdubWVudCBub3QgcG9zc2libGUh
Iik7CiAgICAgIHNldF8ocmhzLnJlZmVyZW5jZSgpKTsKICAgICAgcmVzZXQocmhzLnJlZmVyZW5j
ZSgpKTsKICAgICAgcmV0dXJuICp0aGlzOwogICB9CgogICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgog
ICBtdXRhYmxlX3Byb3h5JiBvcGVyYXRvcis9KFQgeCkKICAgewogICAgICBzZXFtYXBudW06Om9w
ZXJhdG9yKz0oeCk7CiAgICAgIHNldF8ocmVmZXJlbmNlKCkpOwogICAgICByZXR1cm4gKnRoaXM7
CiAgIH0KCnByaXZhdGU6CiAgIGJvb3N0OjpmdW5jdGlvbjxyZWY+IGdldF87CiAgIGJvb3N0Ojpm
dW5jdGlvbjx2b2lkLHJlZj4gc2V0XzsKCn07IAoKCgoKaW5saW5lIG11dGFibGVfcHJveHkgc2Vx
dWVuY2U6Om9wZXJhdG9yW10oaW50IGkpCnsKICAgcmV0dXJuIG11dGFibGVfcHJveHkoYm9vc3Q6
OmJpbmQoJnNlcXVlbmNlOjpnZXRfaXRlbSx0aGlzLGkpLCAKICAgICAgICAgICAgICAgICAgICAg
ICAgYm9vc3Q6OmJpbmQoJnNlcXVlbmNlOjpyc2V0X2l0ZW0sdGhpcyxpLF8xKSk7Cn0KCmlubGlu
ZSBjb25zdCBtdXRhYmxlX3Byb3h5IHNlcXVlbmNlOjpvcGVyYXRvcltdKGludCBpKSBjb25zdAp7
CiAgIHJldHVybiBtdXRhYmxlX3Byb3h5KGJvb3N0OjpiaW5kKCZzZXF1ZW5jZTo6Z2V0X2l0ZW0s
dGhpcyxpKSk7Cn0KCgoKCnRlbXBsYXRlPGNsYXNzIFQ+CmlubGluZSBtdXRhYmxlX3Byb3h5IG1h
cHBpbmc6Om9wZXJhdG9yW10oY29uc3QgVCAmIGtleSkKewogICByZWYga2V5cmVmKHRvX3B5dGhv
bihrZXkpKTsKICAgcmV0dXJuIG11dGFibGVfcHJveHkoYm9vc3Q6OmJpbmQoJm1hcHBpbmc6OnJn
ZXRfaXRlbSx0aGlzLGtleXJlZiksIAogICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6Ymlu
ZCgmbWFwcGluZzo6cnNldF9pdGVtLHRoaXMsa2V5cmVmLF8xKSk7Cn0KCgp0ZW1wbGF0ZTxjbGFz
cyBUPgppbmxpbmUgY29uc3QgbXV0YWJsZV9wcm94eSBtYXBwaW5nOjpvcGVyYXRvcltdKGNvbnN0
IFQgJiBrZXkpIGNvbnN0CnsKICAgcmVmIGtleXJlZih0b19weXRob24oa2V5KSk7CiAgIHJldHVy
biBtdXRhYmxlX3Byb3h5KGJvb3N0OjpiaW5kKCZtYXBwaW5nOjpyZ2V0X2l0ZW0sdGhpcyxrZXly
ZWYpKTsgCn0KCgppbmxpbmUgbXV0YWJsZV9wcm94eSBzZXFtYXA6Om9wZXJhdG9yW10oaW50IGkp
CnsKICAgcmV0dXJuIHNlcXVlbmNlOjpvcGVyYXRvcltdKGkpOwp9CgppbmxpbmUgY29uc3QgbXV0
YWJsZV9wcm94eSBzZXFtYXA6Om9wZXJhdG9yW10oaW50IGkpIGNvbnN0CnsKICAgcmV0dXJuIHNl
cXVlbmNlOjpvcGVyYXRvcltdKGkpOwp9CgoKdGVtcGxhdGU8Y2xhc3MgVD4KaW5saW5lIG11dGFi
bGVfcHJveHkgc2VxbWFwOjpvcGVyYXRvcltdKGNvbnN0IFQgJiBrZXkpCnsKICAgcmV0dXJuIG1h
cHBpbmc6Om9wZXJhdG9yW10oa2V5KTsKfQoKdGVtcGxhdGU8Y2xhc3MgVD4KaW5saW5lIGNvbnN0
IG11dGFibGVfcHJveHkgc2VxbWFwOjpvcGVyYXRvcltdKGNvbnN0IFQgJiBrZXkpIGNvbnN0CnsK
ICAgcmV0dXJuIG1hcHBpbmc6Om9wZXJhdG9yW10oa2V5KTsKfQogICAKICAgCgpjbGFzcyB0dXBs
ZSA6IHB1YmxpYyBvYmplY3RfYmFzZQp7CiBwdWJsaWM6CiAgICBleHBsaWNpdCB0dXBsZShzdGQ6
OnNpemVfdCBuID0gMCk7CiAgICBleHBsaWNpdCB0dXBsZShyZWYgcCk7CgogICAgdGVtcGxhdGUg
PGNsYXNzIEZpcnN0LCBjbGFzcyBTZWNvbmQ+CiAgICB0dXBsZShjb25zdCBzdGQ6OnBhaXI8Rmly
c3QsU2Vjb25kPiYgeCkKICAgICAgICA6IG9iamVjdF9iYXNlKHJlZihQeVR1cGxlX05ldygyKSkp
CiAgICB7CiAgICAgICAgc2V0X2l0ZW0oMCwgeC5maXJzdCk7CiAgICAgICAgc2V0X2l0ZW0oMSwg
eC5zZWNvbmQpOwogICAgfQogICAgCiAgICB0ZW1wbGF0ZSA8Y2xhc3MgRmlyc3QsIGNsYXNzIFNl
Y29uZD4KICAgIHR1cGxlKGNvbnN0IEZpcnN0JiBmaXJzdCwgY29uc3QgU2Vjb25kJiBzZWNvbmQp
CiAgICAgICAgOiBvYmplY3RfYmFzZShyZWYoUHlUdXBsZV9OZXcoMikpKQogICAgewogICAgICAg
IHNldF9pdGVtKDAsIGZpcnN0KTsKICAgICAgICBzZXRfaXRlbSgxLCBzZWNvbmQpOwogICAgfQog
ICAgCiAgICB0ZW1wbGF0ZSA8Y2xhc3MgRmlyc3QsIGNsYXNzIFNlY29uZCwgY2xhc3MgVGhpcmQ+
CiAgICB0dXBsZShjb25zdCBGaXJzdCYgZmlyc3QsIGNvbnN0IFNlY29uZCYgc2Vjb25kLCBjb25z
dCBUaGlyZCYgdGhpcmQpCiAgICAgICAgOiBvYmplY3RfYmFzZShyZWYoUHlUdXBsZV9OZXcoMykp
KQogICAgewogICAgICAgIHNldF9pdGVtKDAsIGZpcnN0KTsKICAgICAgICBzZXRfaXRlbSgxLCBz
ZWNvbmQpOwogICAgICAgIHNldF9pdGVtKDIsIHRoaXJkKTsKICAgIH0KICAgIAogICAgdGVtcGxh
dGUgPGNsYXNzIEZpcnN0LCBjbGFzcyBTZWNvbmQsIGNsYXNzIFRoaXJkLCBjbGFzcyBGb3VydGg+
CiAgICB0dXBsZShjb25zdCBGaXJzdCYgZmlyc3QsIGNvbnN0IFNlY29uZCYgc2Vjb25kLCBjb25z
dCBUaGlyZCYgdGhpcmQsIGNvbnN0IEZvdXJ0aCYgZm91cnRoKQogICAgICAgIDogb2JqZWN0X2Jh
c2UocmVmKFB5VHVwbGVfTmV3KDQpKSkKICAgIHsKICAgICAgICBzZXRfaXRlbSgwLCBmaXJzdCk7
CiAgICAgICAgc2V0X2l0ZW0oMSwgc2Vjb25kKTsKICAgICAgICBzZXRfaXRlbSgyLCB0aGlyZCk7
CiAgICAgICAgc2V0X2l0ZW0oMywgZm91cnRoKTsKICAgIH0KICAgIAogICAgc3RhdGljIFB5VHlw
ZU9iamVjdCogdHlwZV9vYmooKTsKICAgIHN0YXRpYyBib29sIGFjY2VwdHMocmVmIHApOwogICAg
c3RkOjpzaXplX3Qgc2l6ZSgpIGNvbnN0OwogICAgcmVmIG9wZXJhdG9yW10oc3RkOjpzaXplX3Qg
cG9zKSBjb25zdDsKCiAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KICAgIHZvaWQgc2V0X2l0ZW0oc3Rk
OjpzaXplX3QgcG9zLCBjb25zdCBUJiByaHMpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0X2l0ZW0o
cG9zLCBtYWtlX3JlZihyaHMpKTsKICAgIH0KICAgIAogICAgdm9pZCBzZXRfaXRlbShzdGQ6OnNp
emVfdCBwb3MsIGNvbnN0IHJlZiYgcmhzKTsKICAgIAogICAgdHVwbGUgc2xpY2UoaW50IGxvdywg
aW50IGhpZ2gpIGNvbnN0OwoKICAgIGZyaWVuZCB0dXBsZSBvcGVyYXRvcisoY29uc3QgdHVwbGUm
LCBjb25zdCB0dXBsZSYpOwogICAgdHVwbGUmIG9wZXJhdG9yKz0oY29uc3QgdHVwbGUmIHJocyk7
Cn07CgoKc3RydWN0IGxpc3RfaXRlcmF0b3JfcG9saWNpZXMgOiBwdWJsaWMgYm9vc3Q6OmRlZmF1
bHRfaXRlcmF0b3JfcG9saWNpZXMKewogICB0ZW1wbGF0ZTwgY2xhc3MgSXRlcmF0b3JBZGFwdG9y
PgogICB0eXBlbmFtZSBJdGVyYXRvckFkYXB0b3I6OnJlZmVyZW5jZSBkZXJlZmVyZW5jZShjb25z
dCBJdGVyYXRvckFkYXB0b3ImIGl0ZXIpIGNvbnN0CiAgIHsKICAgICAgdHlwZWRlZiB0eXBlbmFt
ZSBJdGVyYXRvckFkYXB0b3I6OnJlZmVyZW5jZSByZXN1bHRfdDsKICAgICAgcmV0dXJuIHJlc3Vs
dF90KGl0ZXIuYmFzZSgpKTsKICAgfQogIAp9OwoKCmNsYXNzIGxpc3QgOiBwdWJsaWMgb2JqZWN0
X2Jhc2UKewogICAgc3RydWN0IGl0ZXJhdG9yX3Byb3h5IDogcHVibGljIHNlcW1hcAogICAgewog
ICAgICAgZXhwbGljaXQgaXRlcmF0b3JfcHJveHkoUHlPYmplY3QqKiBfYmFzZSkgOiBvYmplY3Qo
cmVmKCpfYmFzZSkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcW1hcChv
YmplY3Q6OnJlZmVyZW5jZSgpKSAsIGJhc2UoX2Jhc2UpIHsgfQogICAgICAgCiAgICAgIHRlbXBs
YXRlPGNsYXNzIFQ+CiAgICAgIGl0ZXJhdG9yX3Byb3h5JiBvcGVyYXRvcj0oY29uc3QgVCYgcmhz
KQogICAgICB7CiAgICAgICAgIHJlc2V0KG1ha2VfcmVmKHJocykpOwogICAgICAgICAqYmFzZSA9
IGdldCgpOwogICAgICAgICByZXR1cm4gKnRoaXM7CiAgICAgIH0KCiAgICAgIGl0ZXJhdG9yX3By
b3h5JiBvcGVyYXRvcj0oY29uc3QgaXRlcmF0b3JfcHJveHkmIHJocykKICAgICAgewogICAgICAg
ICByZXNldChyaHMucmVmZXJlbmNlKCkpOwogICAgICAgICAqYmFzZSA9IGdldCgpOwogICAgICAg
ICByZXR1cm4gKnRoaXM7CiAgICAgIH0KICAgICAgCiAgICAgIHByaXZhdGU6CiAgICAgICAgIFB5
T2JqZWN0KiogYmFzZTsKICAgIH07CiAgICAKICAgIAogICAgCiAgICBzdHJ1Y3QgcHJveHk7CiAg
ICBzdHJ1Y3Qgc2xpY2VfcHJveHk7CiBwdWJsaWM6CiAKICAgIHR5cGVkZWYgYm9vc3Q6Oml0ZXJh
dG9yX2FkYXB0b3I8UHlPYmplY3QqKixsaXN0X2l0ZXJhdG9yX3BvbGljaWVzLAogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6aXRlcmF0b3JfY2F0ZWdvcnlfaXM8c3Rk
OjppbnB1dF9pdGVyYXRvcl90YWc+LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBib29zdDo6dmFsdWVfdHlwZV9pczxpdGVyYXRvcl9wcm94eT4sCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGJvb3N0OjpyZWZlcmVuY2VfaXM8aXRlcmF0b3JfcHJveHk+ID4g
aXRlcmF0b3I7CgogICAgdHlwZWRlZiBib29zdDo6aXRlcmF0b3JfYWRhcHRvcjxQeU9iamVjdCoq
LGxpc3RfaXRlcmF0b3JfcG9saWNpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGJvb3N0OjppdGVyYXRvcl9jYXRlZ29yeV9pczxzdGQ6OmlucHV0X2l0ZXJhdG9yX3RhZz4s
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0Ojp2YWx1ZV90eXBlX2lz
PGNvbnN0IGl0ZXJhdG9yX3Byb3h5PiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgYm9vc3Q6OnJlZmVyZW5jZV9pczxjb25zdCBpdGVyYXRvcl9wcm94eT4gPiBjb25zdF9pdGVy
YXRvcjsKIAogICAgZXhwbGljaXQgbGlzdChjb25zdCBvYmplY3QgJiBvKTogb2JqZWN0X2Jhc2Uo
by5yZWZlcmVuY2UoKSkge30KICAgIGV4cGxpY2l0IGxpc3QocmVmIHApOwogICAgZXhwbGljaXQg
bGlzdChzdGQ6OnNpemVfdCBzeiA9IDApOwogICAgc3RhdGljIFB5VHlwZU9iamVjdCogdHlwZV9v
YmooKTsKICAgIHN0YXRpYyBib29sIGFjY2VwdHMocmVmIHApOwogICAgc3RkOjpzaXplX3Qgc2l6
ZSgpIGNvbnN0OwogICAgY29uc3QgbXV0YWJsZV9wcm94eSBvcGVyYXRvcltdKHN0ZDo6c2l6ZV90
IHBvcykgY29uc3QKICAgIHsKICAgICAgIHJldHVybiBtdXRhYmxlX3Byb3h5KGJvb3N0OjpiaW5k
KCZsaXN0OjpnZXRfaXRlbSx0aGlzLHBvcykpOwogICAgfQoKICAgIG11dGFibGVfcHJveHkgb3Bl
cmF0b3JbXShzdGQ6OnNpemVfdCBwb3MpCiAgICB7CiAgICAgICByZXR1cm4gbXV0YWJsZV9wcm94
eShib29zdDo6YmluZCgmbGlzdDo6Z2V0X2l0ZW0sdGhpcyxwb3MpLCAKICAgICAgICAgICAgICAg
ICAgICAgICAgYm9vc3Q6OmJpbmQoJmxpc3Q6OnNldF9pdGVtPHJlZj4sdGhpcyxwb3MsXzEpKTsK
ICAgIH0KCiAgICByZWYgZ2V0X2l0ZW0oc3RkOjpzaXplX3QgcG9zKSBjb25zdDsKCiAgICB0ZW1w
bGF0ZSA8Y2xhc3MgVD4KICAgIHZvaWQgc2V0X2l0ZW0oc3RkOjpzaXplX3QgcG9zLCBjb25zdCBU
JiB4KQogICAgICAgIHsgdGhpcy0+c2V0X2l0ZW0ocG9zLCBtYWtlX3JlZih4KSk7IH0KICAgIHZv
aWQgc2V0X2l0ZW0oc3RkOjpzaXplX3QgcG9zLCBjb25zdCByZWYmICk7CiAgICAKCiAgICB0ZW1w
bGF0ZSA8Y2xhc3MgVD4KICAgIHZvaWQgaW5zZXJ0KHN0ZDo6c2l6ZV90IGluZGV4LCBjb25zdCBU
JiB4KQogICAgICAgIHsgdGhpcy0+aW5zZXJ0KGluZGV4LCBtYWtlX3JlZih4KSk7IH0KICAgIHZv
aWQgaW5zZXJ0KHN0ZDo6c2l6ZV90IGluZGV4LCBjb25zdCByZWYmIGl0ZW0pOwoKICAgIHRlbXBs
YXRlIDxjbGFzcyBUPgogICAgdm9pZCBwdXNoX2JhY2soY29uc3QgVCYgaXRlbSkKICAgICAgICB7
IHRoaXMtPnB1c2hfYmFjayhtYWtlX3JlZihpdGVtKSk7IH0KICAgIHZvaWQgcHVzaF9iYWNrKGNv
bnN0IHJlZiYgaXRlbSk7CiAgICAKICAgIHRlbXBsYXRlIDxjbGFzcyBUPgogICAgdm9pZCBhcHBl
bmQoY29uc3QgVCYgaXRlbSkKICAgICAgICB7IHRoaXMtPmFwcGVuZChtYWtlX3JlZihpdGVtKSk7
IH0KICAgIHZvaWQgYXBwZW5kKGNvbnN0IHJlZiYgaXRlbSk7CiAgICAKICAgIGxpc3Qgc2xpY2Uo
aW50IGxvdywgaW50IGhpZ2gpIGNvbnN0OwogICAgc2xpY2VfcHJveHkgc2xpY2UoaW50IGxvdywg
aW50IGhpZ2gpOwogICAgdm9pZCBzb3J0KCk7CiAgICB2b2lkIHJldmVyc2UoKTsKICAgIHR1cGxl
IGFzX3R1cGxlKCkgY29uc3Q7CiAgICAKICAgIGl0ZXJhdG9yIGJlZ2luKCkKICAgIHsKICAgICAg
IHJldHVybiBpdGVyYXRvcihyZWludGVycHJldF9jYXN0PFB5TGlzdE9iamVjdCo+KGdldCgpKS0+
b2JfaXRlbSk7CiAgICB9CgogICAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdAogICAgewog
ICAgICAgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKHJlaW50ZXJwcmV0X2Nhc3Q8UHlMaXN0T2JqZWN0
Kj4oZ2V0KCkpLT5vYl9pdGVtKTsKICAgIH0KCiAgICBpdGVyYXRvciBlbmQoKQogICAgewogICAg
ICAgUHlMaXN0T2JqZWN0KiBwdHJfbGlzdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8UHlMaXN0T2JqZWN0
Kj4oZ2V0KCkpOwogICAgICAgcmV0dXJuIGl0ZXJhdG9yKHB0cl9saXN0LT5vYl9pdGVtICsgcHRy
X2xpc3QtPm9iX3NpemUpOwogICAgfQoKICAgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0CiAg
ICB7CiAgICAgICBQeUxpc3RPYmplY3QqIHB0cl9saXN0ID0gcmVpbnRlcnByZXRfY2FzdDxQeUxp
c3RPYmplY3QqPihnZXQoKSk7CiAgICAgICByZXR1cm4gY29uc3RfaXRlcmF0b3IocHRyX2xpc3Qt
Pm9iX2l0ZW0gKyBwdHJfbGlzdC0+b2Jfc2l6ZSk7CiAgICB9Cgp9OwoKCnRlbXBsYXRlPGNsYXNz
IFQ+CnZvaWQgc2VxdWVuY2U6OmFwcGVuZChjb25zdCBUJiB2YWwpCnsKICAgbGlzdCB0bXA7CiAg
IHRtcC5hcHBlbmQodmFsKTsKICAgKnRoaXMgKz0gdG1wOwp9CgoKCmNsYXNzIHN0cmluZwogICAg
OiBwdWJsaWMgb2JqZWN0X2Jhc2UsIHB1YmxpYyBib29zdDo6bXVsdGlwbGlhYmxlMjxzdHJpbmcs
IHVuc2lnbmVkIGludD4KewogcHVibGljOgogICAgLy8gQ29uc3RydWN0IGZyb20gYW4gb3duZWQg
UHlPYmplY3QqLgogICAgLy8gUHJlY29uZGl0aW9uOiBwIG11c3QgcG9pbnQgdG8gYSBweXRob24g
c3RyaW5nLgogICAgZXhwbGljaXQgc3RyaW5nKHJlZiBwKTsKICAgIGV4cGxpY2l0IHN0cmluZyhj
b25zdCBjaGFyKiBzKTsKICAgIHN0cmluZyhjb25zdCBjaGFyKiBzLCBzdGQ6OnNpemVfdCBsZW5n
dGgpOwogICAgc3RyaW5nKGNvbnN0IHN0cmluZyYgcmhzKTsKCiAgICBlbnVtIGludGVybmVkX3Qg
eyBpbnRlcm5lZCB9OwogICAgc3RyaW5nKGNvbnN0IGNoYXIqIHMsIGludGVybmVkX3QpOwogICAg
CiAgICAvLyBHZXQgdGhlIHR5cGUgb2JqZWN0IGZvciBTdHJpbmdzCiAgICBzdGF0aWMgUHlUeXBl
T2JqZWN0KiB0eXBlX29iaigpOwoKICAgIC8vIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBvYmpl
Y3QgaXMgYSBweXRob24gc3RyaW5nCiAgICBzdGF0aWMgYm9vbCBhY2NlcHRzKHJlZiBvKTsKCiAg
ICAvLyBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nLgogICAgc3RkOjpzaXplX3Qgc2l6
ZSgpIGNvbnN0OwoKICAgIC8vIFJldHVybnMgYSBudWxsLXRlcm1pbmF0ZWQgcmVwcmVzZW50YXRp
b24gb2YgdGhlIGNvbnRlbnRzIG9mIHN0cmluZy4KICAgIC8vIFRoZSBwb2ludGVyIHJlZmVycyB0
byB0aGUgaW50ZXJuYWwgYnVmZmVyIG9mIHN0cmluZywgbm90IGEgY29weS4KICAgIC8vIFRoZSBk
YXRhIG11c3Qgbm90IGJlIG1vZGlmaWVkIGluIGFueSB3YXkuIEl0IG11c3Qgbm90IGJlIGRlLWFs
bG9jYXRlZC4gCiAgICBjb25zdCBjaGFyKiBjX3N0cigpIGNvbnN0OwoKICAgIHN0cmluZyYgb3Bl
cmF0b3IqPSh1bnNpZ25lZCBpbnQgcmVwZWF0X2NvdW50KTsKICAgIHN0cmluZyYgb3BlcmF0b3Ir
PShjb25zdCBzdHJpbmcmIHJocyk7CiAgICBmcmllbmQgc3RyaW5nIG9wZXJhdG9yKyhzdHJpbmcg
eCwgc3RyaW5nIHkpOwogICAgc3RyaW5nJiBvcGVyYXRvcis9KGNvbnN0IGNoYXIqIHJocyk7CiAg
ICBmcmllbmQgc3RyaW5nIG9wZXJhdG9yKyhzdHJpbmcgeCwgY29uc3QgY2hhciogeSk7CiAgICBm
cmllbmQgc3RyaW5nIG9wZXJhdG9yKyhjb25zdCBjaGFyKiB4LCBzdHJpbmcgeSk7CgogICAgdm9p
ZCBpbnRlcm4oKTsKCiAgICBmcmllbmQgc3RyaW5nIG9wZXJhdG9yJShjb25zdCBzdHJpbmcmIGZv
cm1hdCwgY29uc3QgdHVwbGUmIGFyZ3MpOwp9OwoKY2xhc3MgZGljdGlvbmFyeSA6IHB1YmxpYyBv
YmplY3RfYmFzZQp7CiBwcml2YXRlOgogICAgc3RydWN0IHByb3h5OwogICAgCiBwdWJsaWM6CiAg
ICBleHBsaWNpdCBkaWN0aW9uYXJ5KGNvbnN0IG9iamVjdCAmIG8pOiBvYmplY3RfYmFzZShvLnJl
ZmVyZW5jZSgpKSB7fQogICAgZXhwbGljaXQgZGljdGlvbmFyeShyZWYgcCk7CiAgICBkaWN0aW9u
YXJ5KCk7CiAgICB2b2lkIGNsZWFyKCk7CgogICAgc3RhdGljIFB5VHlwZU9iamVjdCogdHlwZV9v
YmooKTsKICAgIHN0YXRpYyBib29sIGFjY2VwdHMocmVmIHApOwogICAgCiBwdWJsaWM6CiAgICB0
ZW1wbGF0ZSA8Y2xhc3MgS2V5PgogICAgcHJveHkgb3BlcmF0b3JbXShjb25zdCBLZXkmIGtleSkK
ICAgICAgICB7IHJldHVybiB0aGlzLT5vcGVyYXRvcltdKG1ha2VfcmVmKGtleSkpOyB9CiAgICBw
cm94eSBvcGVyYXRvcltdKHJlZiBrZXkpOwogICAgCiAgICB0ZW1wbGF0ZSA8Y2xhc3MgS2V5Pgog
ICAgcmVmIG9wZXJhdG9yW10oY29uc3QgS2V5JiBrZXkpIGNvbnN0CiAgICAgICAgeyByZXR1cm4g
dGhpcy0+b3BlcmF0b3JbXShtYWtlX3JlZihrZXkpKTsgfQogICAgcmVmIG9wZXJhdG9yW10ocmVm
IGtleSkgY29uc3Q7CgogICAgdGVtcGxhdGUgPGNsYXNzIEtleT4KICAgIHJlZiBnZXRfaXRlbShj
b25zdCBLZXkmIGtleSkgY29uc3QKICAgICAgICB7IHJldHVybiB0aGlzLT5nZXRfaXRlbShtYWtl
X3JlZihrZXkpKTsgfQogICAgcmVmIGdldF9pdGVtKGNvbnN0IHJlZiYga2V5KSBjb25zdDsKICAg
IAogICAgdGVtcGxhdGUgPGNsYXNzIEtleSwgY2xhc3MgRGVmYXVsdD4KICAgIHJlZiBnZXRfaXRl
bShjb25zdCBLZXkmIGtleSwgY29uc3QgRGVmYXVsdCYgZGVmYXVsdF8pIGNvbnN0CiAgICAgICAg
eyByZXR1cm4gdGhpcy0+Z2V0X2l0ZW0obWFrZV9yZWYoa2V5KSwgbWFrZV9yZWYoZGVmYXVsdF8p
KTsgfQogICAgcmVmIGdldF9pdGVtKGNvbnN0IHJlZiYga2V5LCBjb25zdCByZWYmIGRlZmF1bHRf
KSBjb25zdDsKICAgIAogICAgdGVtcGxhdGUgPGNsYXNzIEtleSwgY2xhc3MgVmFsdWU+CiAgICB2
b2lkIHNldF9pdGVtKGNvbnN0IEtleSYga2V5LCBjb25zdCBWYWx1ZSYgdmFsdWUpCiAgICAgICAg
eyB0aGlzLT5zZXRfaXRlbShtYWtlX3JlZihrZXkpLCBtYWtlX3JlZih2YWx1ZSkpOyB9CiAgICB2
b2lkIHNldF9pdGVtKGNvbnN0IHJlZiYga2V5LCBjb25zdCByZWYmIHZhbHVlKTsKCiAgICB0ZW1w
bGF0ZSA8Y2xhc3MgS2V5PgogICAgdm9pZCBlcmFzZShjb25zdCBLZXkmIGtleSkKICAgICAgICB7
IHRoaXMtPmVyYXNlKG1ha2VfcmVmKGtleSkpOyB9CiAgICB2b2lkIGVyYXNlKHJlZiBrZXkpOwoK
Ly8gICAgcHJveHkgb3BlcmF0b3JbXShjb25zdCBvYmplY3QmIGtleSk7Ci8vICAgIHJlZiBvcGVy
YXRvcltdKGNvbnN0IG9iamVjdCYga2V5KSBjb25zdDsKCi8vICAgIHJlZiBnZXRfaXRlbShjb25z
dCBvYmplY3QmIGtleSwgcmVmIGRlZmF1bHRfID0gcmVmKCkpIGNvbnN0OwovLyAgICB2b2lkIHNl
dF9pdGVtKGNvbnN0IG9iamVjdCYga2V5LCBjb25zdCByZWYmIHZhbHVlKTsKICAgICAgICAKLy8g
ICAgdm9pZCBlcmFzZShjb25zdCBvYmplY3QmIGtleSk7CgogICAgbGlzdCBpdGVtcygpIGNvbnN0
OwogICAgbGlzdCBrZXlzKCkgY29uc3Q7CiAgICBsaXN0IHZhbHVlcygpIGNvbnN0OwoKICAgIHN0
ZDo6c2l6ZV90IHNpemUoKSBjb25zdDsKICAgIC8vIFRPRE86IGl0ZXJhdG9yIHN1cHBvcnQKfTsK
CnN0cnVjdCBkaWN0aW9uYXJ5Ojpwcm94eQp7CiAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KICAgIGNv
bnN0IHJlZiYgb3BlcmF0b3I9KGNvbnN0IFQmIHJocykKICAgICAgICB7IHJldHVybiAoKnRoaXMp
ID0gbWFrZV9yZWYocmhzKTsgfQogICAgY29uc3QgcmVmJiBvcGVyYXRvcj0oY29uc3QgcmVmJiBy
aHMpOwoKICAgIG9wZXJhdG9yIHJlZigpIGNvbnN0OwogcHJpdmF0ZToKICAgIGZyaWVuZCBjbGFz
cyBkaWN0aW9uYXJ5OwogICAgcHJveHkoY29uc3QgcmVmJiBkaWN0LCBjb25zdCByZWYmIGtleSk7
CgogICAgLy8gVGhpcyBpcyBuZWVkZWQgdG8gd29yayBhcm91bmQgdGhlIHZlcnkgc3RyYW5nZSBN
U1ZDIGVycm9yIHJlcG9ydCB0aGF0IHRoZQogICAgLy8gcmV0dXJuIHR5cGUgb2YgdGhlIGJ1aWx0
LWluIG9wZXJhdG9yPSBkaWZmZXJzIGZyb20gdGhhdCBvZiB0aGUgb25lcwogICAgLy8gZGVmaW5l
ZCBhYm92ZS4gQ291bGRuJ3QgaHVydCB0byBtYWtlIHRoZXNlIHVuLWFzc2lnbmFibGUgYW55d2F5
LCB0aG91Z2guCiAgICBjb25zdCByZWYmIG9wZXJhdG9yPShjb25zdCBwcm94eSYpOyAvLyBOb3Qg
YWN0dWFsbHkgaW1wbGVtZW50ZWQKIHByaXZhdGU6CiAgICByZWYgbV9kaWN0OwogICAgcmVmIG1f
a2V5Owp9OwoKc3RydWN0IGxpc3Q6OnByb3h5IDogcHVibGljIHNlcW1hcG51bQp7CiAgICB0ZW1w
bGF0ZSA8Y2xhc3MgVD4KICAgIGNvbnN0IHJlZiYgb3BlcmF0b3I9KGNvbnN0IFQmIHJocykKICAg
ICAgICB7IHJldHVybiAoKnRoaXMpID0gbWFrZV9yZWYocmhzKTsgfQogICAgY29uc3QgcmVmJiBv
cGVyYXRvcj0oY29uc3QgcmVmJiByaHMpOwogICAgCiAgICAvL29wZXJhdG9yIHJlZigpIGNvbnN0
OwogICAgCiBwcml2YXRlOgogICAgcHJveHkoY29uc3QgcHJveHkmIHJocykgOiBvYmplY3Qocmhz
KSwgc2VxbWFwbnVtKG9iamVjdDo6cmVmZXJlbmNlKCkpICwgCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIG1fbGlzdChyaHMubV9saXN0KSAsIG1faW5kZXgocmhzLm1faW5kZXgpIHt9CiAg
ICBmcmllbmQgY2xhc3MgbGlzdDsKICAgIHByb3h5KGNvbnN0IHJlZiYgbGlzdCwgc3RkOjpzaXpl
X3QgaW5kZXgpOwogICAgCiAgICAvLyBUaGlzIGlzIG5lZWRlZCB0byB3b3JrIGFyb3VuZCB0aGUg
dmVyeSBzdHJhbmdlIE1TVkMgZXJyb3IgcmVwb3J0IHRoYXQgdGhlCiAgICAvLyByZXR1cm4gdHlw
ZSBvZiB0aGUgYnVpbHQtaW4gb3BlcmF0b3I9IGRpZmZlcnMgZnJvbSB0aGF0IG9mIHRoZSBvbmVz
CiAgICAvLyBkZWZpbmVkIGFib3ZlLiBDb3VsZG4ndCBodXJ0IHRvIG1ha2UgdGhlc2UgdW4tYXNz
aWduYWJsZSBhbnl3YXksIHRob3VnaC4KICAgIGNvbnN0IHJlZiYgb3BlcmF0b3I9KGNvbnN0IHBy
b3h5Jik7IC8vIE5vdCBhY3R1YWxseSBpbXBsZW1lbnRlZAogcHJpdmF0ZToKICAgIGxpc3QgbV9s
aXN0OwogICAgc3RkOjpzaXplX3QgbV9pbmRleDsKfTsKCnN0cnVjdCBsaXN0OjpzbGljZV9wcm94
eQp7CiAgICBjb25zdCBsaXN0JiBvcGVyYXRvcj0oY29uc3QgbGlzdCYgcmhzKTsKICAgIG9wZXJh
dG9yIHJlZigpIGNvbnN0OwogICAgb3BlcmF0b3IgbGlzdCgpIGNvbnN0OwogICAgc3RkOjpzaXpl
X3Qgc2l6ZSgpIGNvbnN0OwogICAgcmVmIG9wZXJhdG9yW10oc3RkOjpzaXplX3QgcG9zKSBjb25z
dDsKIHByaXZhdGU6CiAgICBmcmllbmQgY2xhc3MgbGlzdDsKICAgIHNsaWNlX3Byb3h5KGNvbnN0
IHJlZiYgbGlzdCwgaW50IGxvdywgaW50IGhpZ2gpOwogcHJpdmF0ZToKICAgIHJlZiBtX2xpc3Q7
CiAgICBpbnQgbV9sb3csIG1faGlnaDsKfTsKCn19IC8vIG5hbWVzcGFjZSBib29zdDo6cHl0aG9u
CgpCT09TVF9QWVRIT05fQkVHSU5fQ09OVkVSU0lPTl9OQU1FU1BBQ0UKCi8vIEdlbmVyaWMgb2Jq
ZWN0cwoKUHlPYmplY3QqIHRvX3B5dGhvbihjb25zdCBib29zdDo6cHl0aG9uOjpvYmplY3QmKTsK
Ym9vc3Q6OnB5dGhvbjo6b2JqZWN0IGZyb21fcHl0aG9uKFB5T2JqZWN0KiBwLCBib29zdDo6cHl0
aG9uOjp0eXBlPGJvb3N0OjpweXRob246Om9iamVjdD4pOwoKaW5saW5lIGJvb3N0OjpweXRob246
Om9iamVjdCBmcm9tX3B5dGhvbihQeU9iamVjdCogcCwgYm9vc3Q6OnB5dGhvbjo6dHlwZTxjb25z
dCBib29zdDo6cHl0aG9uOjpvYmplY3QmPikKewogICAgcmV0dXJuIGZyb21fcHl0aG9uKHAsIGJv
b3N0OjpweXRob246OnR5cGU8Ym9vc3Q6OnB5dGhvbjo6b2JqZWN0PigpKTsKfQoKUHlPYmplY3Qq
IHRvX3B5dGhvbihjb25zdCBib29zdDo6cHl0aG9uOjpzZXF1ZW5jZSYpOwpib29zdDo6cHl0aG9u
OjpzZXF1ZW5jZSBmcm9tX3B5dGhvbihQeU9iamVjdCogcCwgYm9vc3Q6OnB5dGhvbjo6dHlwZTxi
b29zdDo6cHl0aG9uOjpzZXF1ZW5jZT4pOwoKaW5saW5lIGJvb3N0OjpweXRob246OnNlcXVlbmNl
IGZyb21fcHl0aG9uKFB5T2JqZWN0KiBwLCBib29zdDo6cHl0aG9uOjp0eXBlPGNvbnN0IGJvb3N0
OjpweXRob246OnNlcXVlbmNlJj4pCnsKICAgIHJldHVybiBmcm9tX3B5dGhvbihwLCBib29zdDo6
cHl0aG9uOjp0eXBlPGJvb3N0OjpweXRob246OnNlcXVlbmNlPigpKTsKfQoKClB5T2JqZWN0KiB0
b19weXRob24oY29uc3QgYm9vc3Q6OnB5dGhvbjo6bnVtYmVyJik7CmJvb3N0OjpweXRob246Om51
bWJlciBmcm9tX3B5dGhvbihQeU9iamVjdCogcCwgYm9vc3Q6OnB5dGhvbjo6dHlwZTxib29zdDo6
cHl0aG9uOjpudW1iZXI+KTsKCmlubGluZSBib29zdDo6cHl0aG9uOjpudW1iZXIgZnJvbV9weXRo
b24oUHlPYmplY3QqIHAsIGJvb3N0OjpweXRob246OnR5cGU8Y29uc3QgYm9vc3Q6OnB5dGhvbjo6
bnVtYmVyJj4pCnsKICAgIHJldHVybiBmcm9tX3B5dGhvbihwLCBib29zdDo6cHl0aG9uOjp0eXBl
PGJvb3N0OjpweXRob246Om51bWJlcj4oKSk7Cn0KCgpQeU9iamVjdCogdG9fcHl0aG9uKGNvbnN0
IGJvb3N0OjpweXRob246Om1hcHBpbmcmKTsKYm9vc3Q6OnB5dGhvbjo6bWFwcGluZyBmcm9tX3B5
dGhvbihQeU9iamVjdCogcCwgYm9vc3Q6OnB5dGhvbjo6dHlwZTxib29zdDo6cHl0aG9uOjptYXBw
aW5nPik7CgppbmxpbmUgYm9vc3Q6OnB5dGhvbjo6bWFwcGluZyBmcm9tX3B5dGhvbihQeU9iamVj
dCogcCwgYm9vc3Q6OnB5dGhvbjo6dHlwZTxjb25zdCBib29zdDo6cHl0aG9uOjptYXBwaW5nJj4p
CnsKICAgIHJldHVybiBmcm9tX3B5dGhvbihwLCBib29zdDo6cHl0aG9uOjp0eXBlPGJvb3N0Ojpw
eXRob246Om1hcHBpbmc+KCkpOwp9CgpQeU9iamVjdCogdG9fcHl0aG9uKGNvbnN0IGJvb3N0Ojpw
eXRob246OnNlcW1hcCYpOwpib29zdDo6cHl0aG9uOjpzZXFtYXAgZnJvbV9weXRob24oUHlPYmpl
Y3QqIHAsIGJvb3N0OjpweXRob246OnR5cGU8Ym9vc3Q6OnB5dGhvbjo6c2VxbWFwPik7Cgppbmxp
bmUgYm9vc3Q6OnB5dGhvbjo6c2VxbWFwIGZyb21fcHl0aG9uKFB5T2JqZWN0KiBwLCBib29zdDo6
cHl0aG9uOjp0eXBlPGNvbnN0IGJvb3N0OjpweXRob246OnNlcW1hcCY+KQp7CiAgICByZXR1cm4g
ZnJvbV9weXRob24ocCwgYm9vc3Q6OnB5dGhvbjo6dHlwZTxib29zdDo6cHl0aG9uOjpzZXFtYXA+
KCkpOwp9CgpQeU9iamVjdCogdG9fcHl0aG9uKGNvbnN0IGJvb3N0OjpweXRob246OnNlcW1hcG51
bSYpOwpib29zdDo6cHl0aG9uOjpzZXFtYXBudW0gZnJvbV9weXRob24oUHlPYmplY3QqIHAsIGJv
b3N0OjpweXRob246OnR5cGU8Ym9vc3Q6OnB5dGhvbjo6c2VxbWFwbnVtPik7CgppbmxpbmUgYm9v
c3Q6OnB5dGhvbjo6c2VxbWFwbnVtIGZyb21fcHl0aG9uKFB5T2JqZWN0KiBwLCBib29zdDo6cHl0
aG9uOjp0eXBlPGNvbnN0IGJvb3N0OjpweXRob246OnNlcW1hcG51bSY+KQp7CiAgICByZXR1cm4g
ZnJvbV9weXRob24ocCwgYm9vc3Q6OnB5dGhvbjo6dHlwZTxib29zdDo6cHl0aG9uOjpzZXFtYXBu
dW0+KCkpOwp9CgpQeU9iamVjdCogdG9fcHl0aG9uKGNvbnN0IGJvb3N0OjpweXRob246Om11dGFi
bGVfcHJveHkmKTsKCgoKCi8vIENvbmNyZXRlIG9iamVjdHMKCgpQeU9iamVjdCogdG9fcHl0aG9u
KGNvbnN0IGJvb3N0OjpweXRob246OnR1cGxlJik7CmJvb3N0OjpweXRob246OnR1cGxlIGZyb21f
cHl0aG9uKFB5T2JqZWN0KiBwLCBib29zdDo6cHl0aG9uOjp0eXBlPGJvb3N0OjpweXRob246OnR1
cGxlPik7CgppbmxpbmUgYm9vc3Q6OnB5dGhvbjo6dHVwbGUgZnJvbV9weXRob24oUHlPYmplY3Qq
IHAsIGJvb3N0OjpweXRob246OnR5cGU8Y29uc3QgYm9vc3Q6OnB5dGhvbjo6dHVwbGUmPikKewog
ICAgcmV0dXJuIGZyb21fcHl0aG9uKHAsIGJvb3N0OjpweXRob246OnR5cGU8Ym9vc3Q6OnB5dGhv
bjo6dHVwbGU+KCkpOwp9CgpQeU9iamVjdCogdG9fcHl0aG9uKGNvbnN0IGJvb3N0OjpweXRob246
Omxpc3QmKTsKYm9vc3Q6OnB5dGhvbjo6bGlzdCBmcm9tX3B5dGhvbihQeU9iamVjdCogcCwgYm9v
c3Q6OnB5dGhvbjo6dHlwZTxib29zdDo6cHl0aG9uOjpsaXN0Pik7CgppbmxpbmUgYm9vc3Q6OnB5
dGhvbjo6bGlzdCBmcm9tX3B5dGhvbihQeU9iamVjdCogcCwgYm9vc3Q6OnB5dGhvbjo6dHlwZTxj
b25zdCBib29zdDo6cHl0aG9uOjpsaXN0Jj4pCnsKICAgIHJldHVybiBmcm9tX3B5dGhvbihwLCBi
b29zdDo6cHl0aG9uOjp0eXBlPGJvb3N0OjpweXRob246Omxpc3Q+KCkpOwp9CgpQeU9iamVjdCog
dG9fcHl0aG9uKGNvbnN0IGJvb3N0OjpweXRob246OnN0cmluZyYpOwpib29zdDo6cHl0aG9uOjpz
dHJpbmcgZnJvbV9weXRob24oUHlPYmplY3QqIHAsIGJvb3N0OjpweXRob246OnR5cGU8Ym9vc3Q6
OnB5dGhvbjo6c3RyaW5nPik7CgppbmxpbmUgYm9vc3Q6OnB5dGhvbjo6c3RyaW5nIGZyb21fcHl0
aG9uKFB5T2JqZWN0KiBwLCBib29zdDo6cHl0aG9uOjp0eXBlPGNvbnN0IGJvb3N0OjpweXRob246
OnN0cmluZyY+KQp7CiAgICByZXR1cm4gZnJvbV9weXRob24ocCwgYm9vc3Q6OnB5dGhvbjo6dHlw
ZTxib29zdDo6cHl0aG9uOjpzdHJpbmc+KCkpOwp9CgpQeU9iamVjdCogdG9fcHl0aG9uKGNvbnN0
IGJvb3N0OjpweXRob246OmRpY3Rpb25hcnkmKTsKYm9vc3Q6OnB5dGhvbjo6ZGljdGlvbmFyeSBm
cm9tX3B5dGhvbihQeU9iamVjdCogcCwgYm9vc3Q6OnB5dGhvbjo6dHlwZTxib29zdDo6cHl0aG9u
OjpkaWN0aW9uYXJ5Pik7CgppbmxpbmUgYm9vc3Q6OnB5dGhvbjo6ZGljdGlvbmFyeSBmcm9tX3B5
dGhvbihQeU9iamVjdCogcCwgYm9vc3Q6OnB5dGhvbjo6dHlwZTxjb25zdCBib29zdDo6cHl0aG9u
OjpkaWN0aW9uYXJ5Jj4pCnsKICAgIHJldHVybiBmcm9tX3B5dGhvbihwLCBib29zdDo6cHl0aG9u
Ojp0eXBlPGJvb3N0OjpweXRob246OmRpY3Rpb25hcnk+KCkpOwp9CgpCT09TVF9QWVRIT05fRU5E
X0NPTlZFUlNJT05fTkFNRVNQQUNFCgojZW5kaWYgLy8gT0JKRUNUU19EV0EwNTExMDBfSF8K
--0__=00256B36006B2DF58f9e8a93df938690918c00256B36006B2DF5--
More information about the Cplusplus-sig
mailing list