[Disclaimer: These are the versions of these routines from 23 Feb
1998, and are here for historical reasons; there are more recent
versions.
There are probably some links at
    http://www.cyclic.com/~kingdon/free-vms.html

Here are some implemetations of VMS time routines (SYS$BINTIM,
LIB$CVT_VECTIM, &c).  Except for the SYS$GETTIM issues mentioned
below, they should be fairly portable.  I've glanced at the code but
haven't tried it yet.

I'd like to highlight the design decision to always keep time values
in the 64 bit VMS format in little-endian storage.  I'm not really
sure which choice is best.

There is a comment in vmstime.c about 16 bit words in SYS$NUMTIM.
Unless I miscalculated, even if one specifies a delta time all the way
back to the base date (17 Nov 1858), this doesn't kick in until the
year 2042.

While I am here I'll mention the 10,000 day issues for delta times.
The new rules are that SYS$ASCTIM, SYS$BINTIM, and F$CVTIME still have
10,000 day limits and SYS$NUMTIM and the affected LIB$ routines no
longer do (source: "OpenVMS Delta-Time Limit Q&A", May 1997,
which used to be somewhere on http://www.openvms.digital.com/ (perhaps
still is, somewhere)).

-kingdon, Feb 1998]

Return-Path: <paulnank@au1.ibm.com>
From: Paul Nankervis <paulnank@au1.ibm.com>
To: <kingdon@cyclic.com>
Subject: Re: Portable SYS$ASCTIM
Date: Mon, 9 Feb 1998 02:02:41 -0500
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="Boundary=_0.0_=5030200023881031"


--Boundary=_0.0_=5030200023881031
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable

Jim,

OK, here 'tis. The files attached are  descrip.h, vmstime.h and vmstime=
.c.

These were written by me out of hours at home in my idle time... :-)
Naturally there is NO warranty! I have no problem distributing this
as public domain for the good of VMS users everywhere, although
I would prefer that my name is maintained in the source...

I have noticed a problem with the implementation of sys$gettim. It uses=

the C library routine time() to find the current time and some systems
do not handle this particularly well. On a VAX/VMS 7.0 system I have
tried it on time() incorrectly (I believe) returns -1. Other VAX system=
s,
or by using GCC instead of DEC C, seem to work OK. Also I have noticed
that the OS2 GCC version returns a time shifted by ten hours (our local=

time offset). Sigh!

If you have requests for bug fixes or enhancements please let me know
and I will attempt to provide them. I wrote these routines as part of a=

package which is coming together rather nicely to read ODS2 disk
volumes (I can already manage volume sets pretty well!). However
I did not know what time routines might be useful to other people so
did not implement things that could have been easily added....

If you have comments or do not receive the files properly please let
me know!!!! (This is the first time I have sent file attachments from
Lotus Notes to the internet!)

Goodluck!

Paul Nankervis

 - DESCRIP.H  - VMSTIME.H  - VMSTIME.C
=

--Boundary=_0.0_=5030200023881031
Content-Type: application/octet-stream; name=DESCRIP.H
Content-Transfer-Encoding: base64

LyoNCiAgICAgIERFU0NSSVAuSCB2MS4wDQoNCiovDQojaWZuZGVmIERTQyRLX0RUWVBFX1QNCiNk
ZWZpbmUgRFNDJEtfRFRZUEVfVCAwDQojZGVmaW5lIERTQyRLX0NMQVNTX1MgMA0KDQpzdHJ1Y3Qg
ZHNjJGRlc2NyaXB0b3Igew0KCXVuc2lnbmVkIHNob3J0IGRzYyR3X2xlbmd0aDsNCgl1bnNpZ25l
ZCBjaGFyICBkc2Mkd190eXBlOw0KCXVuc2lnbmVkIGNoYXIgZHNjJHdfY2xhc3M7DQoJY2hhciAq
ZHNjJGFfcG9pbnRlcjsNCn07DQoNCiNkZWZpbmUgJERFU0NSSVBUT1Ioc3RyaW5nLG5hbWUpIHN0
cnVjdCBkc2MkZGVzY3JpcHRvciBuYW1lID0ge3NpemVvZihzcmluZyktMSwwLDAsc3RyaW5nfTsN
CiNlbmRpZho=

--Boundary=_0.0_=5030200023881031
Content-Type: application/octet-stream; name=VMSTIME.H
Content-Transfer-Encoding: base64

LyoNCg0KICAgICAgIFZNU1RJTUUuSCAgdjEuMQ0KDQogICAgICAgQXV0aG9yOiBQYXVsIE5hbmtl
cnZpcw0KDQogICAgICAgUGxlYXNlIHNlbmQgYnVnIHJlcG9ydHMgdG8gUGF1bE5hbmtAYXUxLmli
bS5jb20NCg0KKi8NCg0KI2luY2x1ZGUgPHN0ZGlvLmg+DQojaW5jbHVkZSA8bWVtb3J5Lmg+DQoj
aW5jbHVkZSAiZGVzY3JpcC5oIg0KDQojaWZuZGVmIFNTJF9OT1JNQUwNCiNkZWZpbmUgU1MkX05P
Uk1BTCAxDQojZGVmaW5lIFNTJF9JVlRJTUUgMzg4DQojZGVmaW5lIExJQiRfT05FREVMVElNIDE0
MTAwMjANCiNlbmRpZg0KDQpzdHJ1Y3QgVElNRSB7DQogICAgdW5zaWduZWQgY2hhciB0aW1lWzhd
Ow0KfTsNCg0KI2RlZmluZSBsaWIkYWRkX3RpbWVzICAgICAgIGxpYl9hZGRfdGltZXMNCiNkZWZp
bmUgbGliJGFkZHggICAgICAgICAgICBsaWJfYWRkeA0KI2RlZmluZSBsaWIkY3Z0X3ZlY3RpbSAg
ICAgIGxpYl9jdnRfdmVjdGltDQojZGVmaW5lIGxpYiRkYXkgICAgICAgICAgICAgbGliX2RheQ0K
I2RlZmluZSBsaWIkZGF5X29mX3dlZWsgICAgIGxpYl9kYXlfb2Zfd2Vlaw0KI2RlZmluZSBsaWIk
bXVsdF9kZWx0YV90aW1lIGxpYl9tdWx0X2RlbHRhX3RpbWUNCiNkZWZpbmUgbGliJHN1Yl90aW1l
cyAgICAgICBsaWJfc3ViX3RpbWVzDQojZGVmaW5lIGxpYiRzdWJ4ICAgICAgICAgICAgbGliX3N1
YngNCiNkZWZpbmUgc3lzJGFzY3RpbSAgICAgICAgICBzeXNfYXNjdGltDQojZGVmaW5lIHN5cyRi
aW50aW0gICAgICAgICAgc3lzX2JpbnRpbQ0KI2RlZmluZSBzeXMkZ2V0dGltICAgICAgICAgIHN5
c19nZXR0aW0NCiNkZWZpbmUgc3lzJG51bXRpbSAgICAgICAgICBzeXNfbnVtdGltDQoNCg0KdW5z
aWduZWQgc3lzX2dldHRpbShzdHJ1Y3QgVElNRSAqdGltYWRyKTsNCnVuc2lnbmVkIGxpYl9jdnRf
dmVjdGltKHVuc2lnbmVkIHNob3J0IHRpbWJ1Zls3XSxzdHJ1Y3QgVElNRSAqdGltYWRyKTsNCnVu
c2lnbmVkIGxpYl9kYXkoaW50ICpkYXlzLHN0cnVjdCBUSU1FICp0aW1hZHIsaW50ICpkYXlfdGlt
ZSk7DQp1bnNpZ25lZCBzeXNfbnVtdGltKHVuc2lnbmVkIHNob3J0IHRpbWJ1Zls3XSxzdHJ1Y3Qg
VElNRSAqdGltYWRyKTsNCnVuc2lnbmVkIHN5c19iaW50aW0oc3RydWN0IGRzYyRkZXNjcmlwdG9y
ICp0aW1idWYsc3RydWN0IFRJTUUgKnRpbWFkcik7DQp1bnNpZ25lZCBzeXNfYXNjdGltKHVuc2ln
bmVkIHNob3J0ICp0aW1sZW4sc3RydWN0IGRzYyRkZXNjcmlwdG9yICp0aW1idWYsDQogICAgICAg
ICAgICAgICAgICAgIHN0cnVjdCBUSU1FICp0aW1hZHIsdW5zaWduZWQgY3Z0ZmxnKTsNCnVuc2ln
bmVkIGxpYl9kYXlfb2Zfd2VlayhzdHJ1Y3QgVElNRSAqdGltYWRyLHVuc2lnbmVkICp3ZWVrZGF5
KTsNCnVuc2lnbmVkIGxpYl9hZGR4KHZvaWQgKmFkZGFudCx2b2lkICphZGRlZSx2b2lkICpyZXN1
bHQsaW50ICpsZW5hZGQpOw0KdW5zaWduZWQgbGliX3N1Yngodm9pZCAqc3ViYW50LHZvaWQgKnN1
YmVlLHZvaWQgKnJlc3VsdCxpbnQgKmxlbmFkZCk7DQp1bnNpZ25lZCBsaWJfYWRkX3RpbWVzKHN0
cnVjdCBUSU1FICp0aW1lMSxzdHJ1Y3QgVElNRSAqdGltZTIsDQogICAgICAgICAgICAgICAgICAg
ICAgIHN0cnVjdCBUSU1FICpyZXN1bHQpOw0KdW5zaWduZWQgbGliX3N1Yl90aW1lcyhzdHJ1Y3Qg
VElNRSAqdGltZTEsc3RydWN0IFRJTUUgKnRpbWUyLA0KICAgICAgICAgICAgICAgICAgICAgICBz
dHJ1Y3QgVElNRSAqcmVzdWx0KTsNCnVuc2lnbmVkIGxpYl9tdWx0X2RlbHRhX3RpbWUoaW50ICpt
dWx0aXBsZSxzdHJ1Y3QgVElNRSAqdGltYWRyKTsNCho=

--Boundary=_0.0_=5030200023881031
Content-Type: application/octet-stream; name=VMSTIME.C
Content-Transfer-Encoding: base64

LyoNCg0KICAgICAgIFZNU1RJTUUuQyAgdjEuMQ0KDQogICAgICAgQXV0aG9yOiBQYXVsIE5hbmtl
cnZpcw0KDQogICAgICAgUGxlYXNlIHNlbmQgYnVnIHJlcG9ydHMgb3IgcmVxdWVzdHMgZm9yIGVu
aGFuY2VtZW50DQogICAgICAgb3IgaW1wcm92ZW1lbnQgdmlhIGVtYWlsIHRvOiAgICAgUGF1bE5h
bmtAYXUxLmlibS5jb20NCg0KDQogICAgICAgVGhpcyBtb2R1bGUgY29udGFpbnMgdmVyc2lvbnMg
b2YgdGhlIFZNUyB0aW1lIHJvdXRpbmVzDQogICAgICAgc3lzJG51bXRpbSgpLCBzeXMkYXNjdGlt
KCkgYW5kIGZyaWVuZHMuLi4gVGhleSBhcmUNCiAgICAgICBpbnRlbmRlZCB0byBiZSBjb21wYXRp
YmxlIHdpdGggdGhlIHJvdXRpbmVzIG9mIHRoZSBzYW1lDQogICAgICAgbmFtZSBvbiBhIFZNUyBz
eXN0ZW0gKHNvIGRlc2NyaXB0b3JzIGZlYXR1cmUgcmVndWxhcmx5ISkNCg0KICAgICAgIFRoaXMg
Y29kZSByZWxpZXMgb24gYmVpbmcgYWJsZSB0byBtYW5pcGx1YXRlIGRheSBudW1iZXJzDQogICAg
ICAgYW5kIHRpbWVzIHVzaW5nIDMyIGJpdCBhcml0aG1ldGljIHRvIGNyYWNrIGEgVk1TIHF1YWR3
b3JkDQogICAgICAgYnl0ZSBieSBieXRlLiBJZiB5b3VyIEMgY29tcGlsZXIgZG9lc24ndCBoYXZl
IDMyIGJpdCBpbnQNCiAgICAgICBmaWVsZHMgZ2l2ZSB1cCBub3chIE9uIGEgNjQgYml0IHN5c3Rl
bXMgdGhpcyBjb2RlIGNvdWxkDQogICAgICAgYmUgbW9kaWZpZWQgdG8gZG8gNjQgYml0IG9wZXJh
dGlvbnMgZGlyZWN0bHkuLi4uDQoNCiAgICAgICBPbmUgYWR2YW50YWdlIG9mIGRvaW5nIGFyaWht
ZXRpYyBieXRlIGJ5IGJ5dGUgaXMgdGhhdA0KICAgICAgIHRoZSBjb2RlIGRvZXMgbm90IGRlcGVu
ZCBvbiB3aGF0ICdlbmRpYW4nIHRoZSB0YXJnZXQNCiAgICAgICBtYWNoaW5lIGlzIC0gaXQgd2ls
bCBhbHdheXMgdHJlYXQgYnl0ZXMgaW4gdGhlIHNhbWUgb3JkZXIhDQogICAgICAgKEhvcGVmdWxs
eSBWTVMgdGltZSBieXRlcyB3aWxsIGFsd2F5cyBiZSBpbiB0aGUgc2FtZSBvcmRlciEpDQoNCiAg
ICAgICBBIGNvdXBsZSBvZiBzdHVwaWQgcXVlc3Rpb25zIHRvIGdvIG9uIHdpdGg6LQ0KICAgICAg
ICAgICBvIE9LLCBJIGdpdmUgdXAhIFdoYXQgaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhIHpl
cm8NCiAgICAgICAgICAgICBkYXRlIGFuZCBhIHplcm8gZGVsdGEgdGltZT8NCiAgICAgICAgICAg
byBBbnlvbmUgbm90aWNlIHRoYXQgdGhlIHVzZSBvZiAxNiBiaXQgd29yZHMgaW4NCiAgICAgICAg
ICAgICBzeXMkbnVtdGltIHJlc3RyaWN0cyBkZWx0YSB0aW1lcyB0byA2NTUzNSBkYXlzPw0KDQog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXVsIE5hbmtlcnZpcw0KDQoq
Lw0KDQojaW5jbHVkZSAidm1zdGltZS5oIiAgICAgICAgICAgIC8qIE91ciBoZWFkZXIgZmlsZSEg
Ki8NCiNpbmNsdWRlIDx0aW1lLmg+ICAgICAgICAgICAgICAgLyogQyBoZWFkZXIgZm9yICRHRVRU
SU0gdG8gZmluZCB0aW1lICovDQoNCiNkZWZpbmUgVElNRUJBU0UgMTAwMDAwICAgICAgICAgLyog
MTAgbWlsbGlzZWNvbmQgdW5pdHMgaW4gcXVhZHdvcmQgKi8NCiNkZWZpbmUgVElNRVNJWkUgODY0
MDAwMCAgICAgICAgLyogRmFjdG9yIGJldHdlZW4gZGF0ZXMgJiB0aW1lcyAqLw0KDQojZGVmaW5l
IFFVQURfQ0VOVFVSWV9EQVlTIDE0NjA5Nw0KLyogICAoNDAwKjM2NSkgKyAoNDAwLzQpIC0gKDQw
MC8xMDApICsgKDQwMC80MDApICAgKi8NCiNkZWZpbmUgQ0VOVFVSWV9EQVlTICAgIDM2NTI0DQov
KiAgICgxMDAqMzY1KSArICgxMDAvNCkgLSAoMTAwLzEwMCkgICAgKi8NCiNkZWZpbmUgUVVBRF9Z
RUFSX0RBWVMgIDE0NjENCi8qICAgKDQqMzY1KSArICg0LzQpICAgICovDQojZGVmaW5lIFlFQVJf
REFZUyAgICAgICAzNjUNCi8qICAgMzY1ICAgICAgICAqLw0KI2RlZmluZSBPRkZTRVRfREFZUyAg
ICAgOTQxODcNCi8qICAgKCgxODU4XzE2MDEpKjM2NSkgKyAoKDE4NThfMTYwMSkvNCkgLSAoKDE4
NThfMTYwMSkvMTAwKQ0KICAgKyAoKDE4NThfMTYwMSkvNDAwKSArIDMyMA0KICAgICAgICBPRkZT
RVQgRlJPTSAxLzEvMTYwMSBUTyAxNy8xMS8xODU4ICAqLw0KI2RlZmluZSBCQVNFX1lFQVIgICAg
ICAgMTYwMQ0KDQoNCg0KLyogY29tYmluZV9kYXRlX3RpbWUoKSBpcyBhbiBpbnRlcm5hbCByb3V0
aW5lIHRvIHB1dCBkYXRlIGFuZCB0aW1lIGludG8gYQ0KICAgcXVhZHdvcmQgLSBiYXNpY2FsbHkg
dGhlIG9wcG9zaXRlIG9mIGxpYl9kYXkoKSAuLi4uICovDQoNCnVuc2lnbmVkIGNvbWJpbmVfZGF0
ZV90aW1lKGludCBkYXlzLHN0cnVjdCBUSU1FICp0aW1hZHIsaW50IGRheV90aW1lKQ0Kew0KICAg
IGlmIChkYXlfdGltZSA+PSBUSU1FU0laRSkgew0KICAgICAgICByZXR1cm4gU1MkX0lWVElNRTsN
CiAgICB9IGVsc2Ugew0KDQogICAgICAgIC8qIFB1dCBkYXlzIGludG8gcXVhZCB0aW1idWYuLi4g
Ki8NCg0KICAgICAgICByZWdpc3RlciB1bnNpZ25lZCBjb3VudCx0aW1lOw0KICAgICAgICByZWdp
c3RlciB1bnNpZ25lZCBjaGFyICpwdHI7DQogICAgICAgIGNvdW50ID0gODsNCiAgICAgICAgcHRy
ID0gdGltYWRyLT50aW1lOw0KICAgICAgICB0aW1lID0gZGF5czsNCiAgICAgICAgZG8gew0KICAg
ICAgICAgICAgKnB0cisrID0gdGltZTsNCiAgICAgICAgICAgIHRpbWUgPSAodGltZSA+PiA4KTsN
CiAgICAgICAgfSB3aGlsZSAoLS1jb3VudCA+IDApOw0KDQogICAgICAgIC8qIEZhY3RvciBpbiB0
aGUgdGltZS4uLiAqLw0KDQogICAgICAgIGNvdW50ID0gODsNCiAgICAgICAgcHRyID0gdGltYWRy
LT50aW1lOw0KICAgICAgICB0aW1lID0gZGF5X3RpbWU7DQogICAgICAgIGRvIHsNCiAgICAgICAg
ICAgIHRpbWUgKz0gKnB0ciAqIFRJTUVTSVpFOw0KICAgICAgICAgICAgKnB0cisrID0gdGltZTsN
CiAgICAgICAgICAgIHRpbWUgPSAodGltZSA+PiA4KTsNCiAgICAgICAgfSB3aGlsZSAoLS1jb3Vu
dCA+IDApOw0KDQogICAgICAgIC8qIEZhY3RvciBieSB0aW1lIGJhc2UuLi4gKi8NCg0KICAgICAg
ICBjb3VudCA9IDg7DQogICAgICAgIHB0ciA9IHRpbWFkci0+dGltZTsNCiAgICAgICAgdGltZSA9
IDA7DQogICAgICAgIGRvIHsNCiAgICAgICAgICAgIHRpbWUgKz0gKnB0ciAqIFRJTUVCQVNFOw0K
ICAgICAgICAgICAgKnB0cisrID0gdGltZTsNCiAgICAgICAgICAgIHRpbWUgPSAodGltZSA+PiA4
KTsNCiAgICAgICAgfSB3aGlsZSAoLS1jb3VudCA+IDApOw0KDQogICAgICAgIHJldHVybiBTUyRf
Tk9STUFMOw0KICAgIH0NCn0NCg0KDQoNCi8qIHN5c19nZXR0aW0oKSBpbXBsZW1lbnRlZCBoZXJl
IGJ5IGdldHRpbmcgVU5JWCB0aW1lIGluIHNlY29uZHMgc2luY2UNCiAgIDEtSmFuLTE5NzAgdXNp
bmcgdGltZSgpIGFuZCBtdW5naW5nIGludG8gYSBxdWFkd29yZC4uLiBTb21lIHJ1biB0aW1lDQog
ICBzeXN0ZW1zIGRvbid0IHNlZW0gdG8gZG8gdGhpcyBwcm9wZXJseSEhISBOb3RlIHRoYXQgdGlt
ZSgpIGhhcyBhDQogICByZXNvbHV0aW9uIG9mIG9ubHkgb25lIHNlY29uZC4gKi8NCg0KdW5zaWdu
ZWQgc3lzX2dldHRpbShzdHJ1Y3QgVElNRSAqdGltYWRyKQ0Kew0KICAgIHRpbWVfdCBjdXJ0aW0g
PSB0aW1lKE5VTEwpOw0KICAgIHJldHVybiBjb21iaW5lX2RhdGVfdGltZSg0MDU4NyArIGN1cnRp
bSAvIDg2NDAwLHRpbWFkciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGN1cnRpbSAl
IDg2NDAwKSAqIDEwMCk7DQp9DQoNCg0KLyogbGliX2N2dF92ZWN0aW0oKSB0YWtlcyBpbmRpdmlk
dWFsIHRpbWUgZmllbGRzIGluIHNldmVuIHdvcmQgYnVmZmVyIGFuZA0KICAgbXVuZ2VzIGludG8g
YSBxdWFkd29yZC4uLiAqLw0KDQp1bnNpZ25lZCBzaG9ydCBtb250aF9lbmRbXSA9IHswLDMxLDU5
LDkwLDEyMCwxNTEsMTgxLDIxMiwyNDMsMjczLDMwNCwzMzQsMzY1fTsNCg0KdW5zaWduZWQgbGli
X2N2dF92ZWN0aW0odW5zaWduZWQgc2hvcnQgdGltYnVmWzddLHN0cnVjdCBUSU1FICp0aW1hZHIp
DQp7DQogICAgaW50IGRlbHRhID0gMDsNCiAgICByZWdpc3RlciB1bnNpZ25lZCBzdHMsZGF5cyxk
YXlfdGltZTsNCiAgICBzdHMgPSBTUyRfTk9STUFMOw0KDQogICAgLyogbGliX2N2dF92ZWN0aW0g
cGFja3MgdGhlIHNldmVuIGRhdGUvdGltZSBjb21wb25lbnRzIGludG8gYSBxdWFkd29yZC4uLiAq
Lw0KDQogICAgaWYgKHRpbWJ1ZlswXSA9PSAwICYmIHRpbWJ1ZlsxXSA9PSAwKSB7DQogICAgICAg
IGRlbHRhID0gMTsNCiAgICAgICAgZGF5cyA9IHRpbWJ1ZlsyXTsNCiAgICB9IGVsc2Ugew0KICAg
ICAgICByZWdpc3RlciBsZWFwID0gMCx5ZWFyID0gdGltYnVmWzBdLG1vbnRoID0gdGltYnVmWzFd
Ow0KICAgICAgICBpZiAobW9udGggPj0gMikgew0KICAgICAgICAgICAgaWYgKCh5ZWFyICUgNCkg
PT0gMCkgew0KICAgICAgICAgICAgICAgIGlmICgoeWVhciAlIDEwMCkgPT0gMCkgew0KICAgICAg
ICAgICAgICAgICAgICBpZiAoKHllYXIgJSA0MDApID09IDApIHsNCiAgICAgICAgICAgICAgICAg
ICAgICAgIGxlYXAgPSAxOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAg
fSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgbGVhcCA9IDE7DQogICAgICAgICAgICAgICAg
fQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGRheXMgPSB0aW1idWZbMl07DQog
ICAgICAgIGlmICh5ZWFyID49IDE4NTggJiYgeWVhciA8PSA5OTk5ICYmIG1vbnRoID49IDEgJiYN
CiAgICAgICAgICAgIG1vbnRoIDw9IDEyICYmIGRheXMgPj0gMSkgew0KICAgICAgICAgICAgZGF5
cyArPSBtb250aF9lbmRbbW9udGggLSAxXTsNCiAgICAgICAgICAgIGlmIChtb250aCA+IDIpIGRh
eXMgKz0gbGVhcDsNCiAgICAgICAgICAgIGlmIChkYXlzIDw9IG1vbnRoX2VuZFttb250aF0gKyBs
ZWFwKSB7DQogICAgICAgICAgICAgICAgeWVhciAtPSBCQVNFX1lFQVI7DQogICAgICAgICAgICAg
ICAgZGF5cyArPSB5ZWFyICogMzY1ICsgeWVhciAvIDQgLSB5ZWFyIC8gMTAwICsgeWVhciAvIDQw
MA0KICAgICAgICAgICAgICAgICAgICAgLSBPRkZTRVRfREFZUyAtIDE7DQogICAgICAgICAgICB9
IGVsc2Ugew0KICAgICAgICAgICAgICAgIHN0cyA9IFNTJF9JVlRJTUU7DQogICAgICAgICAgICB9
DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBzdHMgPSBTUyRfSVZUSU1FOw0KICAgICAg
ICB9DQogICAgfQ0KICAgIGlmICh0aW1idWZbM10gPiAyMyB8fCB0aW1idWZbNF0gPiA1OSB8fA0K
ICAgICAgICB0aW1idWZbNV0gPiA1OSB8fCB0aW1idWZbNl0gPiA5OSkgew0KICAgICAgICBzdHMg
PSBTUyRfSVZUSU1FOw0KICAgIH0NCiAgICBpZiAoc3RzICYgMSkgew0KICAgICAgICBkYXlfdGlt
ZSA9IHRpbWJ1ZlszXSAqIDM2MDAwMCArIHRpbWJ1Zls0XSAqIDYwMDAgKw0KICAgICAgICAgICAg
dGltYnVmWzVdICogMTAwICsgdGltYnVmWzZdOw0KICAgICAgICBzdHMgPSBjb21iaW5lX2RhdGVf
dGltZShkYXlzLHRpbWFkcixkYXlfdGltZSk7DQogICAgICAgIGlmIChkZWx0YSkgew0KDQogICAg
ICAgICAgICAvKiBXZSBoYXZlIHRvIDIncyBjb21wbGVtZW50IGRlbHRhIHRpbWVzIC0gc2lnaCEh
ICovDQoNCiAgICAgICAgICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGNvdW50LHRpbWU7DQogICAgICAg
ICAgICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICpwdHI7DQogICAgICAgICAgICBjb3VudCA9IDg7
DQogICAgICAgICAgICBwdHIgPSB0aW1hZHItPnRpbWU7DQogICAgICAgICAgICB0aW1lID0gMTsN
CiAgICAgICAgICAgIGRvIHsNCiAgICAgICAgICAgICAgICB0aW1lID0gdGltZSArICgofipwdHIp
ICYgMHhGRik7DQogICAgICAgICAgICAgICAgKnB0cisrID0gdGltZTsNCiAgICAgICAgICAgICAg
ICB0aW1lID0gKHRpbWUgPj4gOCk7DQogICAgICAgICAgICB9IHdoaWxlICgtLWNvdW50ID4gMCk7
DQogICAgICAgIH0NCiAgICB9DQogICAgcmV0dXJuIHN0czsNCn0NCg0KDQovKiBsaWJfZGF5KCkg
aXMgYSByb3V0aW5lIHRvIGNyYWNrIHF1YWR3b3JkIGludG8gZGF5IG51bWJlciBhbmQgdGltZSAq
Lw0KDQp1bnNpZ25lZCBsaWJfZGF5KGludCAqZGF5cyxzdHJ1Y3QgVElNRSAqdGltYWRyLGludCAq
ZGF5X3RpbWUpDQp7DQogICAgcmVnaXN0ZXIgdW5zaWduZWQgZGF0ZSx0aW1lLGNvdW50Ow0KICAg
IHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKmRzdHB0ciwqc3JjcHRyOw0KICAgIHN0cnVjdCBUSU1F
IHdya3RpbTsNCiAgICBpbnQgZGVsdGE7DQoNCiAgICAvKiBJZiBubyB0aW1lIHNwZWNpZmllZCBn
ZXQgY3VycmVudCB1c2luZyBnZXR0aW0oKSAqLw0KDQogICAgaWYgKHRpbWFkciA9PSBOVUxMKSB7
DQogICAgICAgIHJlZ2lzdGVyIHVuc2lnbmVkIHN0czsNCiAgICAgICAgc3RzID0gc3lzX2dldHRp
bSgmd3JrdGltKTsNCiAgICAgICAgaWYgKChzdHMgJiAxKSA9PSAwKSB7DQogICAgICAgICAgICBy
ZXR1cm4gc3RzOw0KICAgICAgICB9DQogICAgICAgIGRlbHRhID0gMDsNCiAgICAgICAgc3JjcHRy
ID0gd3JrdGltLnRpbWUgKyA3Ow0KICAgIH0gZWxzZSB7DQoNCiAgICAgICAgLyogQ2hlY2sgc3Bl
Y2lmaWVkIHRpbWUgZm9yIGRlbHRhLi4uICovDQoNCiAgICAgICAgc3JjcHRyID0gdGltYWRyLT50
aW1lICsgNzsNCiAgICAgICAgaWYgKChkZWx0YSA9ICgqc3JjcHRyICYgMHg4MCkpKSB7DQoNCiAg
ICAgICAgICAgIC8qIFdlIGhhdmUgdG8gMidzIGNvbXBsZW1lbnQgZGVsdGEgdGltZXMgLSBzaWdo
ISEgKi8NCg0KICAgICAgICAgICAgY291bnQgPSA4Ow0KICAgICAgICAgICAgc3JjcHRyID0gdGlt
YWRyLT50aW1lOw0KICAgICAgICAgICAgZHN0cHRyID0gd3JrdGltLnRpbWU7DQogICAgICAgICAg
ICB0aW1lID0gMTsNCiAgICAgICAgICAgIGRvIHsNCiAgICAgICAgICAgICAgICB0aW1lID0gdGlt
ZSArICgofipzcmNwdHIrKykgJiAweEZGKTsNCiAgICAgICAgICAgICAgICAqZHN0cHRyKysgPSB0
aW1lOw0KICAgICAgICAgICAgICAgIHRpbWUgPSAodGltZSA+PiA4KTsNCiAgICAgICAgICAgIH0g
d2hpbGUgKC0tY291bnQgPiAwKTsNCiAgICAgICAgICAgIHNyY3B0ciA9IHdya3RpbS50aW1lICsg
NzsNCiAgICAgICAgfQ0KICAgIH0NCg0KDQogICAgLyogVGhyb3cgYXdheSB0aGUgdW5yZXF1aXJl
ZCB0aW1lIHByZWNpc2lvbiAqLw0KDQogICAgY291bnQgPSA4Ow0KICAgIGRzdHB0ciA9IHdya3Rp
bS50aW1lICsgNzsNCiAgICB0aW1lID0gMDsNCiAgICBkbyB7DQogICAgICAgIHRpbWUgPSAodGlt
ZSA8PCA4KSB8ICpzcmNwdHItLTsNCiAgICAgICAgKmRzdHB0ci0tID0gdGltZSAvIFRJTUVCQVNF
Ow0KICAgICAgICB0aW1lICU9IFRJTUVCQVNFOw0KICAgIH0gd2hpbGUgKC0tY291bnQgPiAwKTsN
Cg0KDQogICAgLyogU2VwZXJhdGUgdGhlIGRhdGUgYW5kIHRpbWUgKi8NCg0KICAgIGRhdGUgPSB0
aW1lID0gMDsNCiAgICBzcmNwdHIgPSB3cmt0aW0udGltZSArIDc7DQogICAgY291bnQgPSA4Ow0K
ICAgIGRvIHsNCiAgICAgICAgdGltZSA9ICh0aW1lIDw8IDgpIHwgKnNyY3B0ci0tOw0KICAgICAg
ICBkYXRlID0gKGRhdGUgPDwgOCkgfCAodGltZSAvIFRJTUVTSVpFKTsNCiAgICAgICAgdGltZSAl
PSBUSU1FU0laRTsNCiAgICB9IHdoaWxlICgtLWNvdW50ID4gMCk7DQoNCiAgICAvKiBSZXR1cm4g
cmVzdWx0cy4uLiAqLw0KDQogICAgaWYgKGRlbHRhKSB7DQogICAgICAgICpkYXlzID0gLShpbnQp
IGRhdGU7DQogICAgICAgIGlmIChkYXlfdGltZSAhPSBOVUxMKSAqZGF5X3RpbWUgPSAtKGludCkg
dGltZTsNCiAgICB9IGVsc2Ugew0KICAgICAgICAqZGF5cyA9IGRhdGU7DQogICAgICAgIGlmIChk
YXlfdGltZSAhPSBOVUxMKSAqZGF5X3RpbWUgPSB0aW1lOw0KICAgIH0NCg0KICAgIHJldHVybiBT
UyRfTk9STUFMOw0KfQ0KDQoNCg0KLyogc3lzX251bXRpbSgpIHRha2VzIHF1YWR3b3JkIGFuZCBi
cmVha3MgaXQgaW50byBhIHNldmVuIHdvcmQgdGltZSBidWZmZXIgKi8NCg0KdW5zaWduZWQgY2hh
ciBtb250aF9kYXlzW10gPSB7MzEsMjksMzEsMzAsMzEsMzAsMzEsMzEsMzAsMzEsMzAsMzF9Ow0K
DQp1bnNpZ25lZCBzeXNfbnVtdGltKHVuc2lnbmVkIHNob3J0IHRpbWJ1Zls3XSxzdHJ1Y3QgVElN
RSAqdGltYWRyKQ0Kew0KICAgIHJlZ2lzdGVyIGRhdGUsdGltZTsNCg0KICAgIC8qIFVzZSBsaWJf
ZGF5IHRvIGNyYWNrIHRpbWUgaW50byBkYXRlL3RpbWUuLi4gKi8NCg0KICAgIHsNCiAgICAgICAg
aW50IGRheXMsZGF5X3RpbWU7DQogICAgICAgIHJlZ2lzdGVyIHVuc2lnbmVkIHN0czsNCiAgICAg
ICAgc3RzID0gbGliX2RheSgmZGF5cyx0aW1hZHIsJmRheV90aW1lKTsNCiAgICAgICAgaWYgKChz
dHMgJiAxKSA9PSAwKSB7DQogICAgICAgICAgICByZXR1cm4gc3RzOw0KICAgICAgICB9DQogICAg
ICAgIGRhdGUgPSBkYXlzOw0KICAgICAgICB0aW1lID0gZGF5X3RpbWU7DQogICAgfQ0KDQogICAg
LyogRGVsdGEgb3IgZGF0ZS4uLiAqLw0KDQogICAgaWYgKGRhdGUgPCAwIHx8IHRpbWUgPCAwKSB7
DQogICAgICAgIHRpbWJ1ZlsyXSA9IC1kYXRlOyAgICAgIC8qIERheXMgKi8NCiAgICAgICAgdGlt
YnVmWzFdID0gMDsgICAgICAgICAgLyogTW9udGggKi8NCiAgICAgICAgdGltYnVmWzBdID0gMDsg
ICAgICAgICAgLyogWWVhciAqLw0KICAgICAgICB0aW1lID0gLXRpbWU7DQoNCiAgICB9IGVsc2Ug
ew0KDQogICAgICAgIC8qIERhdGUuLi4gKi8NCg0KICAgICAgICByZWdpc3RlciB5ZWFyLG1vbnRo
Ow0KICAgICAgICBkYXRlICs9IE9GRlNFVF9EQVlTOw0KICAgICAgICB5ZWFyID0gQkFTRV9ZRUFS
ICsgKGRhdGUgLyBRVUFEX0NFTlRVUllfREFZUykgKiA0MDA7DQogICAgICAgIGRhdGUgJT0gUVVB
RF9DRU5UVVJZX0RBWVM7DQoNCiAgICAgICAgLyogS2x1ZGdlIGNlbnR1cnkgZGl2aXNpb24gLSBs
YXN0IGNlbnR1cnkgaW4gcXVhZCBpcyBsb25nZXIhISAqLw0KDQogICAgICAgIGlmICgobW9udGgg
PSBkYXRlIC8gQ0VOVFVSWV9EQVlTKSA9PSA0KSBtb250aCA9IDM7DQogICAgICAgIGRhdGUgLT0g
bW9udGggKiBDRU5UVVJZX0RBWVM7DQogICAgICAgIHllYXIgKz0gbW9udGggKiAxMDA7DQoNCiAg
ICAgICAgLyogVXNlIHRoZSBzYW1lIHRlY2huaXF1ZSB0byBmaW5kIG91dCB0aGUgcXVhZCB5ZWFy
IGFuZCB5ZWFyIC0NCiAgICAgICAgICAgbGFzdCB5ZWFyIGluIHF1YWQgaXMgbG9uZ2VyISEgKi8N
Cg0KICAgICAgICB5ZWFyICs9IChkYXRlIC8gUVVBRF9ZRUFSX0RBWVMpICogNDsNCiAgICAgICAg
ZGF0ZSAlPSBRVUFEX1lFQVJfREFZUzsNCg0KICAgICAgICBpZiAoKG1vbnRoID0gZGF0ZSAvIFlF
QVJfREFZUykgPT0gNCkgbW9udGggPSAzOw0KICAgICAgICBkYXRlIC09IG1vbnRoICogWUVBUl9E
QVlTOw0KICAgICAgICB5ZWFyICs9IG1vbnRoOw0KDQogICAgICAgIC8qIEFkanVzdCBmb3IgeWVh
cnMgd2hpY2ggaGF2ZSBubyBGZWIgMjl0aCAqLw0KDQogICAgICAgIGlmIChkYXRlKysgPiA1OCkg
ew0KICAgICAgICAgICAgaWYgKG1vbnRoICE9IDMpIHsNCiAgICAgICAgICAgICAgICBkYXRlKys7
DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIGlmICgoeWVhciAlIDEwMCkg
PT0gMCAmJiAoeWVhciAlIDQwMCkgIT0gMCkgZGF0ZSsrOw0KICAgICAgICAgICAgfQ0KICAgICAg
ICB9DQogICAgICAgIC8qIEZpZ3VyZSBvdXQgd2hhdCBtb250aCBpdCBpcy4uLiAqLw0KDQogICAg
ICAgIHsNCiAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm10aHB0ciA9IG1vbnRoX2RheXM7DQog
ICAgICAgICAgICBtb250aCA9IDE7DQogICAgICAgICAgICB3aGlsZSAoZGF0ZSA+ICptdGhwdHIp
IHsNCiAgICAgICAgICAgICAgICBkYXRlIC09ICptdGhwdHIrKzsNCiAgICAgICAgICAgICAgICBt
b250aCsrOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgLyogUmV0dXJuIGRh
dGUgcmVzdWx0cy4uLiAqLw0KDQogICAgICAgIHRpbWJ1ZlsyXSA9IGRhdGU7ICAgICAgIC8qIERh
eXMgKi8NCiAgICAgICAgdGltYnVmWzFdID0gbW9udGg7ICAgICAgLyogTW9udGggKi8NCiAgICAg
ICAgdGltYnVmWzBdID0geWVhcjsgICAgICAgLyogWWVhciAqLw0KICAgIH0NCg0KICAgIC8qIFJl
dHVybiB0aW1lLi4uICovDQoNCiAgICB0aW1idWZbNl0gPSB0aW1lICUgMTAwOyAgICAgLyogSHVu
ZHJlZHRocyAqLw0KICAgIHRpbWUgLz0gMTAwOw0KICAgIHRpbWJ1Zls1XSA9IHRpbWUgJSA2MDsg
ICAgICAvKiBTZWNvbmRzICovDQogICAgdGltZSAvPSA2MDsNCiAgICB0aW1idWZbNF0gPSB0aW1l
ICUgNjA7ICAgICAgLyogTWludXRlcyAqLw0KICAgIHRpbWJ1ZlszXSA9IHRpbWUgLyA2MDsgICAg
ICAvKiBIb3VycyAqLw0KDQogICAgcmV0dXJuIFNTJF9OT1JNQUw7DQp9DQoNCg0KDQovKiBzeXNf
YmludGltKCkgdGFrZXMgYXNjaWkgdGltZSBhbmQgY29udmVydCBpdCB0byBhIHF1YWR3b3JkICov
DQoNCmNoYXIgbW9udGhfbmFtZXNbXSA9ICItSkFOLUZFQi1NQVItQVBSLU1BWS1KVU4tSlVMLUFV
Ry1TRVAtT0NULU5PVi1ERUMtIjsNCmNoYXIgdGltZV9zZXBbXSA9ICI6Oi4iOw0KDQp1bnNpZ25l
ZCBzeXNfYmludGltKHN0cnVjdCBkc2MkZGVzY3JpcHRvciAqdGltYnVmLHN0cnVjdCBUSU1FICp0
aW1hZHIpDQp7DQogICAgcmVnaXN0ZXIgbGVuZ3RoID0gdGltYnVmLT5kc2Mkd19sZW5ndGg7DQog
ICAgcmVnaXN0ZXIgY2hhciAqY2hycHRyID0gdGltYnVmLT5kc2MkYV9wb2ludGVyOw0KICAgIHVu
c2lnbmVkIHNob3J0IHdya3RpbVs3XTsNCiAgICBpbnQgbnVtLHRmOw0KDQoNCiAgICAvKiBTa2lw
IGxlYWRpbmcgc3BhY2VzLi4uICovDQoNCiAgICB3aGlsZSAobGVuZ3RoID4gMCAmJiAqY2hycHRy
ID09ICcgJykgew0KICAgICAgICBsZW5ndGgtLTsNCiAgICAgICAgY2hycHRyKys7DQogICAgfQ0K
DQogICAgLyogR2V0IHRoZSBkYXkgbnVtYmVyLi4uICovDQoNCiAgICBudW0gPSAtMTsNCiAgICBp
ZiAobGVuZ3RoID4gMCAmJiAqY2hycHRyID49ICcwJyAmJiAqY2hycHRyIDw9ICc5Jykgew0KICAg
ICAgICBudW0gPSAwOw0KICAgICAgICBkbyB7DQogICAgICAgICAgICBudW0gPSBudW0gKiAxMCAr
ICgqY2hycHRyKysgLSAnMCcpOw0KICAgICAgICB9IHdoaWxlICgtLWxlbmd0aCA+IDAgJiYgKmNo
cnB0ciA+PSAnMCcgJiYgKmNocnB0ciA8PSAnOScpOw0KICAgIH0NCiAgICAvKiBDaGVjayBmb3Ig
bW9udGggc2VwYXJhdG9yICItIiAtIGlmIG5vbmUgZGVsdGEgdGltZS4uLiAqLw0KDQogICAgaWYg
KGxlbmd0aCA+IDAgJiYgKmNocnB0ciA9PSAnLScpIHsNCiAgICAgICAgY2hycHRyKys7DQoNCiAg
ICAgICAgLyogR2V0IGN1cnJlbnQgdGltZSBmb3IgZGVmYXVsdHMuLi4gKi8NCg0KICAgICAgICBz
eXNfbnVtdGltKHdya3RpbSxOVUxMKTsNCiAgICAgICAgaWYgKG51bSA+PSAwKSB3cmt0aW1bMl0g
PSBudW07DQogICAgICAgIG51bSA9IDA7DQogICAgICAgIGlmICgtLWxlbmd0aCA+PSAzICYmICpj
aHJwdHIgIT0gJy0nKSB7DQogICAgICAgICAgICBjaGFyICptbiA9IG1vbnRoX25hbWVzICsgMTsN
CiAgICAgICAgICAgIG51bSA9IDE7DQogICAgICAgICAgICB3aGlsZSAobnVtIDw9IDEyKSB7DQog
ICAgICAgICAgICAgICAgaWYgKG1lbWNtcChjaHJwdHIsbW4sMykgPT0gMCkgYnJlYWs7DQogICAg
ICAgICAgICAgICAgbW4gKz0gNDsNCiAgICAgICAgICAgICAgICBudW0rKzsNCiAgICAgICAgICAg
IH0NCiAgICAgICAgICAgIGNocnB0ciArPSAzOw0KICAgICAgICAgICAgbGVuZ3RoIC09IDM7DQog
ICAgICAgICAgICB3cmt0aW1bMV0gPSBudW07DQogICAgICAgIH0NCiAgICAgICAgLyogTm93IGxv
b2sgZm9yIHllYXIuLi4gKi8NCg0KICAgICAgICBpZiAobGVuZ3RoID4gMCAmJiAqY2hycHRyID09
ICctJykgew0KICAgICAgICAgICAgbGVuZ3RoLS07DQogICAgICAgICAgICBjaHJwdHIrKzsNCiAg
ICAgICAgICAgIGlmIChsZW5ndGggPiAwICYmICpjaHJwdHIgPj0gJzAnICYmICpjaHJwdHIgPD0g
JzknKSB7DQogICAgICAgICAgICAgICAgbnVtID0gMDsNCiAgICAgICAgICAgICAgICBkbyB7DQog
ICAgICAgICAgICAgICAgICAgIG51bSA9IG51bSAqIDEwICsgKCpjaHJwdHIrKyAtICcwJyk7DQog
ICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1sZW5ndGggPiAwICYmICpjaHJwdHIgPj0gJzAnICYm
ICpjaHJwdHIgPD0gJzknKTsNCiAgICAgICAgICAgICAgICB3cmt0aW1bMF0gPSBudW07DQogICAg
ICAgICAgICB9DQogICAgICAgIH0NCiAgICB9IGVsc2Ugew0KDQogICAgICAgIC8qIERlbHRhIHRp
bWUgdGhlbi4uLiAqLw0KDQogICAgICAgIHdya3RpbVswXSA9IHdya3RpbVsxXSA9IDA7DQogICAg
ICAgIHdya3RpbVsyXSA9IG51bTsNCiAgICAgICAgd3JrdGltWzNdID0gd3JrdGltWzRdID0gd3Jr
dGltWzVdID0gd3JrdGltWzZdID0gMDsNCiAgICB9DQoNCiAgICAvKiBTa2lwIGFueSBzcGFjZXMg
YmV0d2VlbiBkYXRlIGFuZCB0aW1lLi4uICovDQoNCiAgICB3aGlsZSAobGVuZ3RoID4gMCAmJiAq
Y2hycHRyID09ICcgJykgew0KICAgICAgICBsZW5ndGgtLTsNCiAgICAgICAgY2hycHRyKys7DQog
ICAgfQ0KDQogICAgLyogTm93IHdyYXAgdXAgdGltZSBmaWVsZHMuLi4gKi8NCg0KICAgIGZvciAo
dGYgPSAwOyB0ZiA8IDM7IHRmKyspIHsNCiAgICAgICAgaWYgKGxlbmd0aCA+IDAgJiYgKmNocnB0
ciA+PSAnMCcgJiYgKmNocnB0ciA8PSAnOScpIHsNCiAgICAgICAgICAgIG51bSA9IDA7DQogICAg
ICAgICAgICBkbyB7DQogICAgICAgICAgICAgICAgbnVtID0gbnVtICogMTAgKyAoKmNocnB0cisr
IC0gJzAnKTsNCiAgICAgICAgICAgIH0gd2hpbGUgKC0tbGVuZ3RoID4gMCAmJiAqY2hycHRyID49
ICcwJyAmJiAqY2hycHRyIDw9ICc5Jyk7DQogICAgICAgICAgICB3cmt0aW1bMyArIHRmXSA9IG51
bTsNCiAgICAgICAgICAgIGlmIChudW0gPiA1OSkgd3JrdGltWzFdID0gMTM7DQogICAgICAgIH0N
CiAgICAgICAgaWYgKGxlbmd0aCA+IDAgJiYgKmNocnB0ciA9PSB0aW1lX3NlcFt0Zl0pIHsNCiAg
ICAgICAgICAgIGxlbmd0aC0tOw0KICAgICAgICAgICAgY2hycHRyKys7DQogICAgICAgIH0gZWxz
ZSB7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8qIEh1bmRy
ZWR0aHMgb2Ygc2Vjb25kcyBuZWVkIHNwZWNpYWwgaGFuZGxpbmcuLi4gKi8NCg0KICAgIGlmIChs
ZW5ndGggPiAwICYmICpjaHJwdHIgPj0gJzAnICYmICpjaHJwdHIgPD0gJzknKSB7DQogICAgICAg
IHRmID0gMTA7DQogICAgICAgIG51bSA9IDA7DQogICAgICAgIGRvIHsNCiAgICAgICAgICAgIG51
bSA9IG51bSArIHRmICogKCpjaHJwdHIrKyAtICcwJyk7DQogICAgICAgICAgICB0ZiA9IHRmIC8g
MTA7DQogICAgICAgIH0gd2hpbGUgKC0tbGVuZ3RoID4gMCAmJiAqY2hycHRyID49ICcwJyAmJiAq
Y2hycHRyIDw9ICc5Jyk7DQogICAgICAgIHdya3RpbVs2XSA9IG51bTsNCiAgICB9DQogICAgLyog
Tm93IHNraXAgYW55IHRyYWlsaW5nIHNwYWNlcy4uLiAqLw0KDQogICAgd2hpbGUgKGxlbmd0aCA+
IDAgJiYgKmNocnB0ciA9PSAnICcpIHsNCiAgICAgICAgbGVuZ3RoLS07DQogICAgICAgIGNocnB0
cisrOw0KICAgIH0NCg0KICAgIC8qIElmIGFueXRoaW5nIGxlZnQgdGhlbiB3ZSBoYXZlIGEgcHJv
YmxlbS4uLiAqLw0KDQogICAgaWYgKGxlbmd0aCA9PSAwKSB7DQogICAgICAgIHJldHVybiBsaWJf
Y3Z0X3ZlY3RpbSh3cmt0aW0sdGltYWRyKTsNCiAgICB9IGVsc2Ugew0KICAgICAgICByZXR1cm4g
U1MkX0lWVElNRTsNCiAgICB9DQp9DQoNCg0KLyogc3lzX2FzY3RpbSgpIGNvbnZlcnRzIHF1YWR3
b3JkIHRvIGFzY2lpLi4uICovDQoNCnVuc2lnbmVkIHN5c19hc2N0aW0odW5zaWduZWQgc2hvcnQg
KnRpbWxlbixzdHJ1Y3QgZHNjJGRlc2NyaXB0b3IgKnRpbWJ1ZiwNCiAgICAgICAgICAgICAgICAg
ICAgc3RydWN0IFRJTUUgKnRpbWFkcix1bnNpZ25lZCBjdnRmbGcpDQp7DQogICAgcmVnaXN0ZXIg
Y291bnQsdGltdmFsOw0KICAgIHVuc2lnbmVkIHNob3J0IHdya3RpbVs3XTsNCiAgICByZWdpc3Rl
ciBsZW5ndGggPSB0aW1idWYtPmRzYyR3X2xlbmd0aDsNCiAgICByZWdpc3RlciBjaGFyICpjaHJw
dHIgPSB0aW1idWYtPmRzYyRhX3BvaW50ZXI7DQoNCiAgICAvKiBGaXJzdCB1c2Ugc3lzX251bXRp
bSB0byBnZXQgdGhlIGRhdGUvdGltZSBmaWVsZHMuLi4gKi8NCg0KICAgIHsNCiAgICAgICAgcmVn
aXN0ZXIgdW5zaWduZWQgc3RzOw0KICAgICAgICBzdHMgPSBzeXNfbnVtdGltKHdya3RpbSx0aW1h
ZHIpOw0KICAgICAgICBpZiAoKHN0cyAmIDEpID09IDApIHsNCiAgICAgICAgICAgIHJldHVybiBz
dHM7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAvKiBTZWUgaWYgd2Ugd2FudCBkZWx0YSBkYXlz
IG9yIGRhdGUuLi4gKi8NCg0KICAgIGlmIChjdnRmbGcgPT0gMCkgew0KDQogICAgICAgIC8qIENo
ZWNrIGlmIGRhdGUgb3IgZGVsdGEgdGltZS4uLiAqLw0KDQogICAgICAgIGlmICgqd3JrdGltKSB7
DQoNCiAgICAgICAgICAgIC8qIFB1dCBpbiBkYXlzIGFuZCBtb250aC4uLiAqLw0KDQogICAgICAg
ICAgICBpZiAobGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICAgIGlmICgodGltdmFsID0gd3Jr
dGltWzJdKSAvIDEwID09IDApIHsNCiAgICAgICAgICAgICAgICAgICAgKmNocnB0cisrID0gJyAn
Ow0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICpjaHJwdHIr
KyA9ICcwJyArIHRpbXZhbCAvIDEwOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAg
ICBsZW5ndGgtLTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChsZW5ndGggPiAwKSB7
DQogICAgICAgICAgICAgICAgKmNocnB0cisrID0gJzAnICsgKHRpbXZhbCAlIDEwKTsNCiAgICAg
ICAgICAgICAgICBsZW5ndGgtLTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmICgoY291
bnQgPSBsZW5ndGgpID4gNSkgY291bnQgPSA1Ow0KICAgICAgICAgICAgbWVtY3B5KGNocnB0cixt
b250aF9uYW1lcyArICh3cmt0aW1bMV0gKiA0IC0gNCksY291bnQpOw0KICAgICAgICAgICAgbGVu
Z3RoIC09IGNvdW50Ow0KICAgICAgICAgICAgY2hycHRyICs9IGNvdW50Ow0KICAgICAgICAgICAg
dGltdmFsID0gKndya3RpbTsNCiAgICAgICAgfSBlbHNlIHsNCg0KICAgICAgICAgICAgLyogR2V0
IGRlbHRhIGRheXMuLi4gKi8NCg0KICAgICAgICAgICAgdGltdmFsID0gd3JrdGltWzJdOw0KICAg
ICAgICB9DQoNCiAgICAgICAgLyogQ29tbW9uIGNvZGUgZm9yIHllYXIgbnVtYmVyIGFuZCBkZWx0
YSBkYXlzISEgKi8NCg0KICAgICAgICBjb3VudCA9IDEwMDAwOw0KICAgICAgICBpZiAodGltdmFs
IDwgY291bnQpIHsNCiAgICAgICAgICAgIGNvdW50ID0gMTAwMDsNCiAgICAgICAgICAgIHdoaWxl
IChsZW5ndGggPiAwICYmIHRpbXZhbCA8IGNvdW50ICYmIGNvdW50ID4gMSkgew0KICAgICAgICAg
ICAgICAgIGxlbmd0aC0tOw0KICAgICAgICAgICAgICAgICpjaHJwdHIrKyA9ICcgJzsNCiAgICAg
ICAgICAgICAgICBjb3VudCAvPSAxMDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAg
ICB3aGlsZSAobGVuZ3RoID4gMCAmJiBjb3VudCA+IDApIHsNCiAgICAgICAgICAgIGxlbmd0aC0t
Ow0KICAgICAgICAgICAgKmNocnB0cisrID0gJzAnICsgKHRpbXZhbCAvIGNvdW50KTsNCiAgICAg
ICAgICAgIHRpbXZhbCA9IHRpbXZhbCAlIGNvdW50Ow0KICAgICAgICAgICAgY291bnQgLz0gMTA7
DQogICAgICAgIH0NCg0KICAgICAgICAvKiBTcGFjZSBiZXR3ZWVuIGRhdGUgYW5kIHRpbWUuLi4g
Ki8NCg0KICAgICAgICBpZiAobGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgKmNocnB0cisrID0g
JyAnOw0KICAgICAgICAgICAgbGVuZ3RoLS07DQogICAgICAgIH0NCiAgICB9DQogICAgLyogRG8g
dGltZS4uLiA6LSkgKi8NCg0KICAgIGNvdW50ID0gMzsNCiAgICBkbyB7DQogICAgICAgIHRpbXZh
bCA9IHdya3RpbVtjb3VudF07DQogICAgICAgIGlmIChsZW5ndGggPj0gMSkgKmNocnB0cisrID0g
JzAnICsgKHRpbXZhbCAvIDEwKTsNCiAgICAgICAgaWYgKGxlbmd0aCA+PSAyKSB7DQogICAgICAg
ICAgICAqY2hycHRyKysgPSAnMCcgKyAodGltdmFsICUgMTApOw0KICAgICAgICAgICAgbGVuZ3Ro
IC09IDI7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBsZW5ndGggPSAwOw0KICAgICAg
ICB9DQogICAgICAgIGlmIChjb3VudCA8IDYgJiYgbGVuZ3RoID4gMCkgew0KICAgICAgICAgICAg
bGVuZ3RoLS07DQogICAgICAgICAgICBpZiAoY291bnQgPT0gNSkgew0KICAgICAgICAgICAgICAg
ICpjaHJwdHIrKyA9ICcuJzsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAg
KmNocnB0cisrID0gJzonOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSB3aGlsZSAo
Kytjb3VudCA8IDcpOw0KDQogICAgLyogV2UndmUgZG9uZSBpdCAtIHRpbWUgdG8gcmV0dXJuIGxl
bmd0aC4uLiAqLw0KDQogICAgaWYgKHRpbWxlbiAhPSBOVUxMKSAqdGltbGVuID0gdGltYnVmLT5k
c2Mkd19sZW5ndGggLSBsZW5ndGg7DQogICAgcmV0dXJuIFNTJF9OT1JNQUw7DQp9DQoNCg0KLyog
bGliX2RheV9vZl93ZWVrKCkgY29tcHV0ZXMgZGF5IG9mIHdlZWsgZnJvbSBxdWFkd29yZC4uLiAq
Lw0KDQp1bnNpZ25lZCBsaWJfZGF5X29mX3dlZWsoc3RydWN0IFRJTUUgKnRpbWFkcix1bnNpZ25l
ZCAqd2Vla2RheSkNCnsNCiAgICBpbnQgZGF5czsNCiAgICByZWdpc3RlciB1bnNpZ25lZCBzdHM7
DQoNCiAgICAvKiBVc2UgbGliX2RheSB0byBjcmFjayBxdWFkd29yZC4uLiAqLw0KDQogICAgc3Rz
ID0gbGliX2RheSgmZGF5cyx0aW1hZHIsTlVMTCk7DQogICAgaWYgKHN0cyAmIDEpIHsNCiAgICAg
ICAgKndlZWtkYXkgPSAoKGRheXMgKyAyKSAlIDcpICsgMTsNCiAgICB9DQogICAgcmV0dXJuIHN0
czsNCn0NCg0KDQovKiBhZGR4ICYgc3VieCBDT1VMRCB1c2UgMzIgYml0IGFyaXRobWV0aWMgdG8g
ZG8gYSB3b3JkIGF0IGEgdGltZS4gQnV0DQogICB0aGlzIG9ubHkgd29ya3Mgb24gaGFyZHdhcmUg
d2hpY2ggaGFzIHRoZSBzYW1lIGVuZGlhbiBhcyB0aGUgVkFYIQ0KICAgKEludGVsIHdvcmtzIGZp
bmUhISA6LSkgKSBTbyB0aGlzIHZlcnNpb24gd29ya3MgYnl0ZSBieSBieXRlIHdoaWNoDQogICBz
aG91bGQgd29yayBvbiBWTVMgZGF0ZXMgcmVnYXJkbGVzcyBvZiBzeXN0ZW0gZW5kaWFuIC0gYnV0
IHRoZXkNCiAgIHdpbGwgTk9UIHBlcmZvcm0gYXJpdGhtZXRpYyBjb3JyZWN0bHkgZm9yIG5hdGl2
ZSBkYXRhIHR5cGVzIG9uDQogICBzeXN0ZW1zIHdpdGggb3Bwb3NpdGUgZW5kaWFuISEhICovDQoN
CnVuc2lnbmVkIGxpYl9hZGR4KHZvaWQgKmFkZGFudCx2b2lkICphZGRlZSx2b2lkICpyZXN1bHQs
aW50ICpsZW5hZGQpDQp7DQogICAgcmVnaXN0ZXIgY291bnQ7DQogICAgcmVnaXN0ZXIgdW5zaWdu
ZWQgY2FycnkgPSAwOw0KICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKmFudCA9ICh1bnNpZ25l
ZCBjaGFyICopIGFkZGFudDsNCiAgICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICplZSA9ICh1bnNp
Z25lZCBjaGFyICopIGFkZGVlOw0KICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKnJlcyA9ICh1
bnNpZ25lZCBjaGFyICopIHJlc3VsdDsNCiAgICBpZiAobGVuYWRkID09IE5VTEwpIHsNCiAgICAg
ICAgY291bnQgPSA4Ow0KICAgIH0gZWxzZSB7DQogICAgICAgIGNvdW50ID0gKmxlbmFkZCAqIDQ7
DQogICAgfQ0KDQogICAgd2hpbGUgKGNvdW50LS0gPiAwKSB7DQogICAgICAgIGNhcnJ5ID0gKmFu
dCsrICsgKGNhcnJ5ICsgKmVlKyspOw0KICAgICAgICAqcmVzKysgPSBjYXJyeTsNCiAgICAgICAg
Y2FycnkgPSBjYXJyeSA+PiA4Ow0KICAgIH0NCiAgICByZXR1cm4gU1MkX05PUk1BTDsNCn0NCg0K
DQp1bnNpZ25lZCBsaWJfc3VieCh2b2lkICpzdWJhbnQsdm9pZCAqc3ViZWUsdm9pZCAqcmVzdWx0
LGludCAqbGVuYWRkKQ0Kew0KICAgIHJlZ2lzdGVyIGNvdW50Ow0KICAgIHJlZ2lzdGVyIHVuc2ln
bmVkIGNhcnJ5ID0gMDsNCiAgICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICphbnQgPSAodW5zaWdu
ZWQgY2hhciAqKSBzdWJhbnQ7DQogICAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqZWUgPSAodW5z
aWduZWQgY2hhciAqKSBzdWJlZTsNCiAgICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICpyZXMgPSAo
dW5zaWduZWQgY2hhciAqKSByZXN1bHQ7DQogICAgaWYgKGxlbmFkZCA9PSBOVUxMKSB7DQogICAg
ICAgIGNvdW50ID0gODsNCiAgICB9IGVsc2Ugew0KICAgICAgICBjb3VudCA9ICpsZW5hZGQgKiA0
Ow0KICAgIH0NCg0KICAgIHdoaWxlIChjb3VudC0tID4gMCkgew0KICAgICAgICBjYXJyeSA9ICph
bnQrKyAtIChjYXJyeSArICplZSsrKTsNCiAgICAgICAgKnJlcysrID0gY2Fycnk7DQogICAgICAg
IGNhcnJ5ID0gKGNhcnJ5ID4+IDgpICYgMTsNCg0KICAgIH0NCiAgICByZXR1cm4gU1MkX05PUk1B
TDsNCn0NCg0KDQoNCnVuc2lnbmVkIGxpYl9hZGRfdGltZXMoc3RydWN0IFRJTUUgKnRpbWUxLHN0
cnVjdCBUSU1FICp0aW1lMiwNCiAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFRJTUUgKnJl
c3VsdCkNCnsNCiAgICBpZiAodGltZTEtPnRpbWVbN10gJiAweDgwKSB7DQogICAgICAgIGlmICh0
aW1lMi0+dGltZVs3XSAmIDB4ODApIHsNCiAgICAgICAgICAgIHJldHVybiBsaWJfYWRkeCh0aW1l
MSx0aW1lMixyZXN1bHQsTlVMTCk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICByZXR1
cm4gbGliX3N1YngodGltZTIsdGltZTEscmVzdWx0LE5VTEwpOw0KICAgICAgICB9DQogICAgfSBl
bHNlIHsNCiAgICAgICAgaWYgKHRpbWUyLT50aW1lWzddICYgMHg4MCkgew0KICAgICAgICAgICAg
cmV0dXJuIGxpYl9zdWJ4KHRpbWUxLHRpbWUyLHJlc3VsdCxOVUxMKTsNCiAgICAgICAgfSBlbHNl
IHsNCiAgICAgICAgICAgIHJldHVybiBMSUIkX09ORURFTFRJTTsNCiAgICAgICAgfQ0KICAgIH0N
Cn0NCg0KDQoNCnVuc2lnbmVkIGxpYl9zdWJfdGltZXMoc3RydWN0IFRJTUUgKnRpbWUxLHN0cnVj
dCBUSU1FICp0aW1lMiwNCiAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFRJTUUgKnJlc3Vs
dCkNCnsNCiAgICBpZiAoKHRpbWUxLT50aW1lWzddICYgMHg4MCkgIT0gKHRpbWUyLT50aW1lWzdd
ICYgMHg4MCkpIHsNCiAgICAgICAgcmV0dXJuIGxpYl9hZGR4KHRpbWUxLHRpbWUyLHJlc3VsdCxO
VUxMKTsNCiAgICB9IGVsc2Ugew0KICAgICAgICByZWdpc3RlciBjbXAsY291bnQgPSA3Ow0KICAg
ICAgICBkbyB7DQogICAgICAgICAgICBpZiAoKGNtcCA9ICh0aW1lMS0+dGltZVtjb3VudF0gLSB0
aW1lMi0+dGltZVtjb3VudF0pKSkgYnJlYWs7DQogICAgICAgIH0gd2hpbGUgKC0tY291bnQgPj0g
MCk7DQogICAgICAgIGlmIChjbXAgPCAwKSB7DQogICAgICAgICAgICByZXR1cm4gbGliX3N1Yngo
dGltZTEsdGltZTIscmVzdWx0LE5VTEwpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAg
cmV0dXJuIGxpYl9zdWJ4KHRpbWUyLHRpbWUxLHJlc3VsdCxOVUxMKTsNCiAgICAgICAgfQ0KICAg
IH0NCn0NCg0KDQoNCnVuc2lnbmVkIGxpYl9tdWx0X2RlbHRhX3RpbWUoaW50ICptdWx0aXBsZSxz
dHJ1Y3QgVElNRSAqdGltYWRyKQ0Kew0KICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGNvdW50ID0gOCxj
YXJyeSA9IDA7DQogICAgcmVnaXN0ZXIgZmFjdG9yID0gKm11bHRpcGxlOw0KICAgIHJlZ2lzdGVy
IHVuc2lnbmVkIGNoYXIgKnB0ciA9IHRpbWFkci0+dGltZTsNCg0KICAgIC8qIENoZWNrIGZvciBk
ZWx0YSB0aW1lLi4uICovDQoNCiAgICBpZiAodGltYWRyLT50aW1lWzddICYgMHg4MCkgew0KDQog
ICAgICAgIC8qIFVzZSBhYnNvbHV0ZSBmYWN0b3IuLi4gKi8NCg0KICAgICAgICBpZiAoZmFjdG9y
IDwgMCkgZmFjdG9yID0gLWZhY3RvcjsNCg0KICAgICAgICAvKiBNdWx0aXBseSBkZWx0YSB0aW1l
Li4uICovDQoNCiAgICAgICAgZG8gew0KICAgICAgICAgICAgY2FycnkgKz0gKnB0ciAqIGZhY3Rv
cjsNCiAgICAgICAgICAgICpwdHIrKyA9IGNhcnJ5Ow0KICAgICAgICAgICAgY2FycnkgPSAoY2Fy
cnkgPj4gOCk7DQogICAgICAgIH0gd2hpbGUgKC0tY291bnQgPiAwKTsNCg0KICAgICAgICByZXR1
cm4gU1MkX05PUk1BTDsNCiAgICB9IGVsc2Ugew0KICAgICAgICByZXR1cm4gU1MkX0lWVElNRTsN
CiAgICB9DQp9DQo=

--Boundary=_0.0_=5030200023881031--