From: Jim Cropcho Date: 2008-01-25T10:28:52+09:00 Subject: Re: [PATCH] Friendlier methods to compare two Time objects ------=_Part_31497_14112973.1201224539648 Content-Type: multipart/alternative; boundary="----=_Part_31498_14014214.1201224539648" ------=_Part_31498_14014214.1201224539648 Content-Type: text/plain; charset=ISO-2022-JP Content-Transfer-Encoding: 7bit Content-Disposition: inline Here is the newest patch. It creates a module called Temporal which contains functionality useful to classes which define temporal objects, such as dates and times. However, its intended scope is *not* limited to object comparison. It is handy in this regard, though, because it addresses differences between languages, as several in this thread have noted. The module is added to the compilation configuration, and unit tests are included, all of which pass. The module is included in the classes Time and Date (and DateTime, via extension). The module does not include the methods past? and present?, as intended, because the means of determining "now" is different even at the conceptual level between temporal classes. For example, "now" to Time is the number of microseconds after epoch, but "now" to Date is the current calendar date. It is my opinion that past?/future? functionality should be implemented at the class level. Please give my concept and source code consideration for being entered into the ruby core, and suggest modifications/additions at will. Jim Cropcho 2008/1/23 Jim Cropcho : > A new thought: > > > The way that the <=> method is rewritten for Time, it is > > optimized (as far as I can tell) to evaluate conditions > > based on nanoseconds only when equality cannot be > > determined via seconds. I may be misreading that. > > > > Conversely, Time inherits its > and < methods from its superclass, > > so surely those optimizations in <=> do not exist, and creating > > aliases would yield less-optimized code. Also, in the other classes > > where I add this functionality, current techniques to optimize > > comparisons will be reimplemented using the local methodology. > > from the rdoc for compar.c: > > The Comparable mixin is > used by classes whose objects may be ordered. The class must define the > <=> operator, which compares the receiver against another object, > returning -1, 0, or +1 depending on whether the receiver is less than, equal > to, or greater than the other object. Comparableuses > <=> to implement the conventional comparison operators (<, <=, ==, >=, and > >) and the method between? > . > > I am now writing a Mixin called Temporal which will be included in the > Time , Date and DateTime classes, and will contain the instance methods > > *before?(some_time) > *after?(some_time) > *future?(time = Time.now) > *past?(time = Time.now) > > I have the tests written and skeleton code to compile and include the > module where necessary. I hope to be finished tomorrow. > > 2008/1/23 Mathieu Blondel < mblondel@rubyforge.org >: > > > Hi, > > > > 2008/1/23, Martin Duerst < duerst@it.aoyama.ac.jp>: > > > > > There is even some cultural dependency here. In Japanese, for example, > > > the past is higher than the future, time flows down, > > > > And in Chinese as well. For example: > > > > 下个星期 = next week, lit. below week > > 上个星期 = last week, lit. above week > > > > > > Mathieu > > > > > ------=_Part_31498_14014214.1201224539648 Content-Type: text/html; charset=ISO-2022-JP Content-Transfer-Encoding: 7bit Content-Disposition: inline Here is the newest patch. It creates a module called Temporal which contains functionality useful to classes which define temporal objects, such as dates and times. However, its intended scope is *not* limited to object comparison. It is handy in this regard, though, because it addresses differences between languages, as several in this thread have noted.

The module is added to the compilation configuration, and unit tests are included, all of which pass. The module is included in the classes Time and Date (and DateTime, via extension).

The module does not include the methods past? and present?, as intended, because the means of determining "now" is different even at the conceptual level between temporal classes. For example, "now" to Time is the number of microseconds after epoch, but "now" to Date is the current calendar date. It is my opinion that past?/future? functionality should be implemented at the class level.

Please give my concept and source code consideration for being entered into the ruby core, and suggest modifications/additions at will.


Jim Cropcho

2008/1/23 Jim Cropcho < jim.cropcho@gmail.com>:
A new thought:

> The way that the <=> method is rewritten for Time, it is
> optimized (as far as I can tell) to evaluate conditions
> based on nanoseconds only when equality cannot be
> determined via seconds. I may be misreading that.
>
> Conversely, Time inherits its > and < methods from its superclass,
> so surely those optimizations in <=> do not exist, and creating
> aliases would yield less-optimized code. Also, in the other classes
> where I add this functionality, current techniques to optimize
> comparisons will be reimplemented using the local methodology.

from the rdoc for compar.c:

The Comparable mixin is used by classes whose objects may be ordered. The class must define the <=> operator, which compares the receiver against another object, returning -1, 0, or +1 depending on whether the receiver is less than, equal to, or greater than the other object. Comparable uses <=> to implement the conventional comparison operators (<, <=, ==, >=, and >) and the method between?.

I am now writing a Mixin called Temporal which will be included in the Time , Date and DateTime classes, and will contain the instance methods

*before?(some_time)
*after?(some_time)
*future?(time = Time.now)
*past?(time = Time.now)

I have the tests written and skeleton code to compile and include the module where necessary. I hope to be finished tomorrow.

2008/1/23 Mathieu Blondel < mblondel@rubyforge.org >:
Hi,

2008/1/23, Martin Duerst < duerst@it.aoyama.ac.jp>:

> There is even some cultural dependency here. In Japanese, for example,
> the past is higher than the future, time flows down,

And in Chinese as well. For example:

下个星期 = next week, lit. below week
上个星期 = last week, lit. above week


Mathieu



------=_Part_31498_14014214.1201224539648-- ------=_Part_31497_14112973.1201224539648 Content-Type: text/x-patch; name=ruby-module_temporal.patch Content-Transfer-Encoding: base64 X-Attachment-Id: f_fbu044800 Content-Disposition: attachment; filename=ruby-module_temporal.patch SW5kZXg6IHRpbWUuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSB0aW1lLmMJKHJldmlzaW9uIDE1MjIxKQorKysg dGltZS5jCSh3b3JraW5nIGNvcHkpCkBAIC0yMzMyLDYgKzIzMzIsNyBAQAogCiAgICAgcmJfY1Rp bWUgPSByYl9kZWZpbmVfY2xhc3MoIlRpbWUiLCByYl9jT2JqZWN0KTsKICAgICByYl9pbmNsdWRl X21vZHVsZShyYl9jVGltZSwgcmJfbUNvbXBhcmFibGUpOworICAgIHJiX2luY2x1ZGVfbW9kdWxl KHJiX2NUaW1lLCByYl9tVGVtcG9yYWwpOwogCiAgICAgcmJfZGVmaW5lX2FsbG9jX2Z1bmMocmJf Y1RpbWUsIHRpbWVfc19hbGxvYyk7CiAgICAgcmJfZGVmaW5lX3NpbmdsZXRvbl9tZXRob2QocmJf Y1RpbWUsICJub3ciLCByYl9jbGFzc19uZXdfaW5zdGFuY2UsIC0xKTsKSW5kZXg6IGluY2x1ZGUv cnVieS9pbnRlcm4uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBpbmNsdWRlL3J1YnkvaW50ZXJuLmgJKHJldmlz aW9uIDE1MjIxKQorKysgaW5jbHVkZS9ydWJ5L2ludGVybi5oCSh3b3JraW5nIGNvcHkpCkBAIC01 NjcsNiArNTY3LDggQEAKIFZBTFVFIHJiX2JhcnJpZXJfbmV3KHZvaWQpOwogVkFMVUUgcmJfYmFy cmllcl93YWl0KFZBTFVFIHNlbGYpOwogVkFMVUUgcmJfYmFycmllcl9yZWxlYXNlKFZBTFVFIHNl bGYpOworLyogdGVtcG9yYWwuYyAqLworaW50IHJiX3RlbXBvcmFsaW50KFZBTFVFLCBWQUxVRSwg VkFMVUUpOwogLyogdGltZS5jICovCiBWQUxVRSByYl90aW1lX25ldyh0aW1lX3QsIGxvbmcpOwog VkFMVUUgcmJfdGltZV9uYW5vX25ldyh0aW1lX3QsIGxvbmcpOwpJbmRleDogaW5jbHVkZS9ydWJ5 L3J1YnkuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09Ci0tLSBpbmNsdWRlL3J1YnkvcnVieS5oCShyZXZpc2lvbiAxNTIy MSkKKysrIGluY2x1ZGUvcnVieS9ydWJ5LmgJKHdvcmtpbmcgY29weSkKQEAgLTgxNyw2ICs4MTcs NyBAQAogUlVCWV9FWFRFUk4gVkFMVUUgcmJfbUdDOwogUlVCWV9FWFRFUk4gVkFMVUUgcmJfbU1h dGg7CiBSVUJZX0VYVEVSTiBWQUxVRSByYl9tUHJvY2VzczsKK1JVQllfRVhURVJOIFZBTFVFIHJi X21UZW1wb3JhbDsKIAogUlVCWV9FWFRFUk4gVkFMVUUgcmJfY0Jhc2ljT2JqZWN0OwogUlVCWV9F WFRFUk4gVkFMVUUgcmJfY09iamVjdDsKSW5kZXg6IHRlbXBvcmFsLmMKPT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g dGVtcG9yYWwuYwkocmV2aXNpb24gMCkKKysrIHRlbXBvcmFsLmMJKHJldmlzaW9uIDApCkBAIC0w LDAgKzEsMTAzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIHRlbXBvcmFsLmMgLQorCisgICRBdXRo b3I6IGFrciAkCisgIGNyZWF0ZWQgYXQ6IFdlZCAyMyBKYW4gMjAwOAorCisgIGNvZGUgYW5kIGRv Y3VtZW50YXRpb24gYnkgSmltIENyb3BjaG8gPGppbS5jcm9wY2hvQGdtYWlsLmNvbT4sIAorICB3 aXRoIHNlY3Rpb25zIGFkYXB0ZWQgZnJvbSA8Y29tcGFyLmM+CisKKyoqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisK KyNpbmNsdWRlICJydWJ5L3J1YnkuaCIKKworVkFMVUUgcmJfbVRlbXBvcmFsOworCitzdGF0aWMg SUQgc3BhY2VzaGlwOworCitpbnQKK3JiX3RlbXBvcmFsaW50KFZBTFVFIHZhbCwgVkFMVUUgYSwg VkFMVUUgYikKK3sKKyAgICBpZiAoTklMX1AodmFsKSkgeworCXJiX3RlbXBvcmFsZXJyKGEsIGIp OworICAgIH0KKyAgICBpZiAoRklYTlVNX1AodmFsKSkgcmV0dXJuIEZJWDJJTlQodmFsKTsKKyAg ICBpZiAoVFlQRSh2YWwpID09IFRfQklHTlVNKSB7CisJaWYgKFJCSUdOVU1fU0lHTih2YWwpKSBy ZXR1cm4gMTsKKwlyZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChSVEVTVChyYl9mdW5jYWxsKHZh bCwgJz4nLCAxLCBJTlQyRklYKDApKSkpIHJldHVybiAxOworICAgIGlmIChSVEVTVChyYl9mdW5j YWxsKHZhbCwgJzwnLCAxLCBJTlQyRklYKDApKSkpIHJldHVybiAtMTsKKyAgICByZXR1cm4gMDsK K30KKwordm9pZAorcmJfdGVtcG9yYWxlcnIoVkFMVUUgeCwgVkFMVUUgeSkKK3sKKyAgICBjb25z dCBjaGFyICpjbGFzc25hbWU7CisKKyAgICBpZiAoU1BFQ0lBTF9DT05TVF9QKHkpKSB7CisJeSA9 IHJiX2luc3BlY3QoeSk7CisJY2xhc3NuYW1lID0gU3RyaW5nVmFsdWVQdHIoeSk7CisgICAgfQor ICAgIGVsc2UgeworCWNsYXNzbmFtZSA9IHJiX29ial9jbGFzc25hbWUoeSk7CisgICAgfQorICAg IHJiX3JhaXNlKHJiX2VBcmdFcnJvciwgImNvbXBhcmlzb24gb2YgJXMgd2l0aCAlcyBmYWlsZWQi LAorCSAgICAgcmJfb2JqX2NsYXNzbmFtZSh4KSwgY2xhc3NuYW1lKTsKK30KKworLyoKKyAqIGNh bGwtc2VxOgorICogIG9iai5iZWZvcmU/KG90aGVyKQorICoKKyAqIFJldHVybiA8Y29kZT50cnVl PC9jb2RlPiBpZiA8aT50aW1lPC9pPiBpcyBiZWZvcmUgPGk+b3RoZXJfdGltZTwvaT4sIG9yCisg KiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgYWZ0ZXIgb3IgdGhlIHNhbWUgdGltZSBhcyA8aT5vdGhl cl90aW1lPC9pPi4KKyAqLworCitzdGF0aWMgVkFMVUUKK3RlbXBvcmFsX2JlZm9yZV9wKFZBTFVF IHgsIFZBTFVFIHkpCit7CisgICAgVkFMVUUgYyA9IHJiX2Z1bmNhbGwoeCwgc3BhY2VzaGlwLCAx LCB5KTsKKworICAgIGlmIChyYl90ZW1wb3JhbGludChjLCB4LCB5KSA8IDApIHJldHVybiBRdHJ1 ZTsKKyAgICByZXR1cm4gUWZhbHNlOworfQorCisvKgorICogY2FsbC1zZXE6CisgKiAgb2JqLmFm dGVyPyhvdGhlcikKKyAqCisgKiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgPGk+dGltZTwv aT4gaXMgYWZ0ZXIgPGk+b3RoZXJfdGltZTwvaT4sIG9yCisgKiA8Y29kZT5mYWxzZTwvY29kZT4g aWYgYmVmb3JlIG9yIHRoZSBzYW1lIHRpbWUgYXMgPGk+b3RoZXJfdGltZTwvaT4KKyAqLworCitz dGF0aWMgVkFMVUUKK3RlbXBvcmFsX2FmdGVyX3AoVkFMVUUgeCwgVkFMVUUgeSkKK3sKKyAgICBW QUxVRSBjID0gcmJfZnVuY2FsbCh4LCBzcGFjZXNoaXAsIDEsIHkpOworCisgICAgaWYgKHJiX3Rl bXBvcmFsaW50KGMsIHgsIHkpID4gMCkgcmV0dXJuIFF0cnVlOworICAgIHJldHVybiBRZmFsc2U7 Cit9CisKKy8qCisgKiAgVGhlIDxjb2RlPlRlbXBvcmFsPC9jb2RlPiBtaXhpbiBjb250YWlucyBm dW5jdGlvbmFsaXR5IHVzZWZ1bCB0byBjbGFzc2VzCisgKiAgd2hpY2ggZGVmaW5lIHRlbXBvcmFs IG9iamVjdHMsIHN1Y2ggYXMgZGF0ZXMgYW5kIHRpbWVzLiBBcyB3aXRoIHRoZSA8Y29kZT5Db21w YXJhYmxlPC9jb2RlCisgKiAgbWl4aW4sIHRoZSBjbGFzcyBtdXN0IGRlZmluZSB0aGUgPGNvZGU+ PD0+PC9jb2RlPiBvcGVyYXRvci4gPGNvZGU+VGVtcG9yYWw8L2NvZGU+CisgKiAgdXNlcyA8Y29k ZT48PT48L2NvZGU+IHRvIGltcGxlbWVudCB0aGUgY29tcGFyaXNvbiBvcGVyYXRvcnMgPGNvZGU+ YmVmb3JlPzwvY29kZT4gCisgKiAgYW5kIDxjb2RlPmFmdGVyPzwvY29kZT4sIGFsdGhvdWdoIGl0 cyBpbnRlbmRlZCBzY29wZSBpcyBub3QgbGltaXRlZCB0byBvYmplY3QgY29tcGFyaXNvbi4KKyAq ICAgICAKKyAqICAgICBlYXJsaWVyX3RlbXBvcmFsX29iamVjdC5iZWZvcmU/IGxhdGVyX3RlbXBv cmFsX29iamVjdCAgICMgPT4gdHJ1ZQorICogICAgIGVhcmxpZXJfdGVtcG9yYWxfb2JqZWN0LmFm dGVyPyAgICBsYXRlcl90ZW1wb3JhbF9vYmplY3QgICAjID0+IGZhbHNlCisgKi8KKwordm9pZAor SW5pdF9UZW1wb3JhbCh2b2lkKQoreworICAgIHJiX21UZW1wb3JhbCA9IHJiX2RlZmluZV9tb2R1 bGUoIlRlbXBvcmFsIik7CisJCXJiX2RlZmluZV9tZXRob2QocmJfbVRlbXBvcmFsLCAiYmVmb3Jl PyIsIHRlbXBvcmFsX2JlZm9yZV9wLCAxKTsKKwkJcmJfZGVmaW5lX21ldGhvZChyYl9tVGVtcG9y YWwsICJhZnRlcj8iLCB0ZW1wb3JhbF9hZnRlcl9wLCAxKTsKKyAgICBzcGFjZXNoaXAgPSByYl9p bnRlcm4oIjw9PiIpOworfQpJbmRleDogbGliL2RhdGUucmIKPT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gbGliL2Rh dGUucmIJKHJldmlzaW9uIDE1MjIxKQorKysgbGliL2RhdGUucmIJKHdvcmtpbmcgY29weSkKQEAg LTIyNiwxMCArMjI2LDEzIEBACiAjCiAjIFRoZSBEYXRlIGNsYXNzIGluY2x1ZGVzIHRoZSBDb21w YXJhYmxlIG1vZHVsZSwgYWxsb3dpbmcKICMgZGF0ZSBvYmplY3RzIHRvIGJlIGNvbXBhcmVkIGFu ZCBzb3J0ZWQsIHJhbmdlcyBvZiBkYXRlcwotIyB0byBiZSBjcmVhdGVkLCBhbmQgc28gZm9ydGgu CisjIHRvIGJlIGNyZWF0ZWQsIGFuZCBzbyBmb3J0aC4gVGhlIFRlbXBvcmFsIG9iamVjdCBpcyBh bHNvCisjIGluY2x1ZGVkIHRvIGFsbG93IGRhdGUgb2JqZWN0cyB0byBiZSBjb21wYXJlZCB1c2lu ZyBtb3JlCisjIG5hdHVyYWwgbGFuZ3VhZ2UuCiBjbGFzcyBEYXRlCiAKICAgaW5jbHVkZSBDb21w YXJhYmxlCisJaW5jbHVkZSBUZW1wb3JhbAogCiAgICMgRnVsbCBtb250aCBuYW1lcywgaW4gRW5n bGlzaC4gIE1vbnRocyBjb3VudCBmcm9tIDEgdG8gMTI7IGEKICAgIyBtb250aCdzIG51bWVyaWNh bCByZXByZXNlbnRhdGlvbiBpbmRleGVkIGludG8gdGhpcyBhcnJheQpJbmRleDogY29tbW9uLm1r Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT0KLS0tIGNvbW1vbi5tawkocmV2aXNpb24gMTUyMjEpCisrKyBjb21tb24ubWsJ KHdvcmtpbmcgY29weSkKQEAgLTU4LDYgKzU4LDcgQEAKIAkJc3QuJChPQkpFWFQpIFwKIAkJc3Ry aW5nLiQoT0JKRVhUKSBcCiAJCXN0cnVjdC4kKE9CSkVYVCkgXAorCQl0ZW1wb3JhbC4kKE9CSkVY VCkgXAogCQl0aW1lLiQoT0JKRVhUKSBcCiAJCXRyYW5zY29kZS4kKE9CSkVYVCkgXAogCQl1dGls LiQoT0JKRVhUKSBcCkBAIC01NzEsNiArNTcyLDkgQEAKIHN0cnVjdC4kKE9CSkVYVCk6IHskKFZQ QVRIKX1zdHJ1Y3QuYyB7JChWUEFUSCl9cnVieS5oIHskKFZQQVRIKX1jb25maWcuaCBcCiAgIHsk KFZQQVRIKX1kZWZpbmVzLmggeyQoVlBBVEgpfW1pc3NpbmcuaCB7JChWUEFUSCl9aW50ZXJuLmgg XAogICB7JChWUEFUSCl9c3QuaAordGVtcG9yYWwuJChPQkpFWFQpOiB7JChWUEFUSCl9dGVtcG9y YWwuYyB7JChWUEFUSCl9cnVieS5oIHskKFZQQVRIKX1jb25maWcuaCBcCisgIHskKFZQQVRIKX1k ZWZpbmVzLmggeyQoVlBBVEgpfW1pc3NpbmcuaCB7JChWUEFUSCl9aW50ZXJuLmggXAorICB7JChW UEFUSCl9c3QuaAogdGhyZWFkLiQoT0JKRVhUKTogeyQoVlBBVEgpfXRocmVhZC5jIHskKFZQQVRI KX1ldmFsX2ludGVybi5oIFwKICAgeyQoVlBBVEgpfXJ1YnkuaCB7JChWUEFUSCl9Y29uZmlnLmgg eyQoVlBBVEgpfWRlZmluZXMuaCBcCiAgIHskKFZQQVRIKX1taXNzaW5nLmggeyQoVlBBVEgpfWlu dGVybi5oIHskKFZQQVRIKX1zdC5oIHskKFZQQVRIKX1ub2RlLmggXApJbmRleDogaW5pdHMuYwo9 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09Ci0tLSBpbml0cy5jCShyZXZpc2lvbiAxNTIyMSkKKysrIGluaXRzLmMJKHdvcmtp bmcgY29weSkKQEAgLTQzLDYgKzQzLDcgQEAKIHZvaWQgSW5pdF9zaWduYWwodm9pZCk7CiB2b2lk IEluaXRfU3RyaW5nKHZvaWQpOwogdm9pZCBJbml0X1N0cnVjdCh2b2lkKTsKK3ZvaWQgSW5pdF9U ZW1wb3JhbCh2b2lkKTsKIHZvaWQgSW5pdF9UaW1lKHZvaWQpOwogdm9pZCBJbml0X3Zhcl90YWJs ZXModm9pZCk7CiB2b2lkIEluaXRfdmVyc2lvbih2b2lkKTsKQEAgLTgyLDYgKzgzLDcgQEAKICAg ICBJbml0X1JhbmdlKCk7CiAgICAgSW5pdF9JTygpOwogICAgIEluaXRfRGlyKCk7CisJCUluaXRf VGVtcG9yYWwoKTsKICAgICBJbml0X1RpbWUoKTsKICAgICBJbml0X1JhbmRvbSgpOwogICAgIElu aXRfc2lnbmFsKCk7CkluZGV4OiB0ZXN0L3J1YnkvdGVzdF90ZW1wb3JhbC5yYgo9PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 Ci0tLSB0ZXN0L3J1YnkvdGVzdF90ZW1wb3JhbC5yYgkocmV2aXNpb24gMCkKKysrIHRlc3QvcnVi eS90ZXN0X3RlbXBvcmFsLnJiCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDY2IEBACityZXF1aXJl ICd0ZXN0L3VuaXQnCityZXF1aXJlICdkYXRlJworCitjbGFzcyBUaW1lQ2xhc3NFeHRlbnNpb25z VGVzdCA8IFRlc3Q6OlVuaXQ6OlRlc3RDYXNlCisJCisJZGVmIHRlc3RfYmVmb3JlCisJCW9sZF90 aW1lID0gVGltZS5ub3cgLSAxMDAwCisJCWxlc3Nfb2xkX3RpbWUgPSBUaW1lLm5vdyAtIDE1CisJ CWFzc2VydCBvbGRfdGltZS5iZWZvcmU/KGxlc3Nfb2xkX3RpbWUpCisJZW5kCisJCisJZGVmIHRl c3RfYWZ0ZXIKKwkJZnV0dXJlX3RpbWUgPSBUaW1lLm5vdyArIDIKKwkJZGlzdGFudF9mdXR1cmUg PSBUaW1lLm5vdyArIDIwXzAwMAorCQlhc3NlcnQgZGlzdGFudF9mdXR1cmUuYWZ0ZXI/KGZ1dHVy ZV90aW1lKQorCWVuZAorCQorCWRlZiB0ZXN0X2VxdWFsCisJCXRpbWUxID0gVGltZS5ub3cKKwkJ dGltZTIgPSB0aW1lMS5jbG9uZQorCQlhc3NlcnQgIXRpbWUxLmJlZm9yZT8odGltZTIpCisJCWFz c2VydCAhdGltZTEuYWZ0ZXI/KHRpbWUyKQorCWVuZAorZW5kCisKK2NsYXNzIERhdGVDbGFzc0V4 dGVuc2lvbnNUZXN0IDwgVGVzdDo6VW5pdDo6VGVzdENhc2UKKwlkZWYgdGVzdF9iZWZvcmUKKwkJ b2xkX3RpbWUgPSBEYXRlLnRvZGF5IC0gMTAwMAorCQlsZXNzX29sZF90aW1lID0gRGF0ZS50b2Rh eSAtIDE1CisJCWFzc2VydCBvbGRfdGltZS5iZWZvcmU/KGxlc3Nfb2xkX3RpbWUpCisJZW5kCisJ CisJZGVmIHRlc3RfYWZ0ZXIKKwkJZnV0dXJlX3RpbWUgPSBEYXRlLnRvZGF5ICsgMgorCQlkaXN0 YW50X2Z1dHVyZSA9IERhdGUudG9kYXkgKyAyMDAwMAorCQlhc3NlcnQgZGlzdGFudF9mdXR1cmUu YWZ0ZXI/KGZ1dHVyZV90aW1lKQorCWVuZAorCQorCWRlZiB0ZXN0X2VxdWFsCisJCXRpbWUxID0g RGF0ZS50b2RheQorCQl0aW1lMiA9IHRpbWUxLmNsb25lCisJCWFzc2VydCAhdGltZTEuYmVmb3Jl Pyh0aW1lMikKKwkJYXNzZXJ0ICF0aW1lMS5hZnRlcj8odGltZTIpCisJZW5kCitlbmQKKworY2xh c3MgRGF0ZVRpbWVDbGFzc0V4dGVuc2lvbnNUZXN0IDwgVGVzdDo6VW5pdDo6VGVzdENhc2UKKwlk ZWYgdGVzdF9iZWZvcmUKKwkJb2xkX3RpbWUgPSBEYXRlVGltZS5ub3cgLSAxMDAwCisJCWxlc3Nf b2xkX3RpbWUgPSBEYXRlVGltZS5ub3cgLSAxNQorCQlhc3NlcnQgb2xkX3RpbWUuYmVmb3JlPyhs ZXNzX29sZF90aW1lKQorCWVuZAorCQorCWRlZiB0ZXN0X2FmdGVyCisJCWZ1dHVyZV90aW1lID0g RGF0ZVRpbWUubm93ICsgMgorCQlkaXN0YW50X2Z1dHVyZSA9IERhdGVUaW1lLm5vdyArIDIwMDAw CisJCWFzc2VydCBkaXN0YW50X2Z1dHVyZS5hZnRlcj8oZnV0dXJlX3RpbWUpCisJZW5kCisJCisJ ZGVmIHRlc3RfZXF1YWwKKwkJdGltZTEgPSBEYXRlVGltZS5ub3cKKwkJdGltZTIgPSB0aW1lMS5j bG9uZQorCQlhc3NlcnQgIXRpbWUxLmJlZm9yZT8odGltZTIpCisJCWFzc2VydCAhdGltZTEuYWZ0 ZXI/KHRpbWUyKQorCWVuZAorZW5kCg== ------=_Part_31497_14112973.1201224539648--