/**
* Kelas untuk menghitung jumlah setiap elemen dalam sebuah deret aritmatik. Metode
* yang dipakai adalah metode Gauss ditambah dengan prinsip Inklusi-Ekslusi.
*/
class Gauss {
/**
* Fungsi untuk menjumlahkan semua bilangan kelipatan a1, a2, a3 ... an dari
* 1 sampai limit (inclusive). Sebagai contoh: Jumlah bilangan kelipatan 2 dan 3
* dari 1 sampai 100 adalah sum(new long[]{2L, 3L}, 0, 2, 100L).
*
* Bagian terkeren dari fungsi ini : ga ada if! Kekekekekek
*
* @param numbers array dari bilangan-bilangan yang diinginkan. Asumsi : array
* tidak null. Asumsi : setiap bilangan koprima (FPB-nya 1) dengan bilangan
* lainnya.
*
* @param lower batas bawah dari array. Asumsi : lower berada di dalam rentang
* yang diperbolehkan : 0 s/d numbers.length - 1
*
* @param length panjang array. Asumsi : lower + length <= numbers.length
*
* @param limit batas maksimal deret (inclusive). Asumsi : limit adalah bilangan
* bulat tidak negatif.
*
* @return jumlah bilangan kelipatan a1, a2, a3 ... an dari 1 sampai limit
*/
public long sum( long [ ] numbers, int lower, int length, long limit) {
assert ( numbers != null ) ;
// Siaga 2 : Pemeriksaan asumsi fpb(ai, aj) = 1 tidak dilakukan!!
assert ( lower >= 0 && lower < numbers.length ) ;
assert ( lower + length <= numbers.length ) ;
assert ( limit >= 0L) ;
// Menghitung ukuran array : 2^length - 1
// Siaga 1 : Arithmetic Overflow!
// Siaga 1 : Out of memory!
int size = ( 1 << length) - 1 ;
// Deklarasi array
long [ ] ar = new long [ size] ;
// Inisialisasi setiap elemen pada array dengan -1
for ( int i = 0 ; i < size; i++ ) ar[ i] = - 1L;
// Deklarasi & inisialisasi return value
long result = 0L;
// Deklarasi & inisialisasi index array yang akan ditulisi
int idx = 0 ;
// Deklarasi & inisialisasi batas atas/guard dari loop
int upper = lower + length;
// Selama batas bawah masih belum 'bertemu' batas atas, lanjutkan iterasi
for ( ; lower < upper; lower++ ) {
// Bilangan yang di-input
long number = numbers[ lower] ;
// Baca semua isi array yang sudah pernah ditulisi
// Jaga loop untuk tidak membaca elemen yang belum ditulis
for ( int i = 0 , j = idx; i < j; i++ ) {
// Elemen berikut = -Bilangan yang diinput * isi array
// Siaga 1 : Arithmetic Overflow!
long element = - number * ar[ i] ;
// Tulis elemen tersebut ke dalam array
// Naikkan index
ar[ idx++ ] = element;
// Hitung jumlah
// Tambahkan jumlah tersebut ke dalam hasil akhir
result += calculate( limit, element) ;
}
// Default : tulis bilangan yang di-input oleh user ke dalam array
// Naikkan index
ar[ idx++ ] = number;
// Hitung jumlah
// Tambahkan jumlah tersebut ke dalam hasil akhir
result += calculate( limit, number) ;
}
return result;
}
/**
* Fungsi untuk menghitung jumlah semua bilangan kelipatan 'number' dari 1
* sampai 'limit' (inclusive). Sebagai contoh: Jumlah bilangan kelipatan 2 dari
* 1 sampai 100 dinyatakan sebagai calculate(2, 100) = 2550
*
* Bagian terkeren dari fungsi ini : mampu menerima 'number' positif ataupun
* negatif! xixixi
*
* @param limit batas maksimal deret yang ingin dihitung (inclusive). Asumsi :
* limit adalah bilangan bulat tidak negatif
*
* @param number kelipatan bilangan yang ingin dihitung. Asumsi : number adalah
* bilangan bulat tidak 0
*
* @return jumlah semua bilangan kelipatan number dari 1...limit
*/
public long calculate( long limit, long number) {
assert ( limit >= 0L) ;
assert ( number != 0L) ;
// Menghitung banyaknya elemen
long count = limit / number;
// Banyaknya elemen selalu positif
if ( count < 0 ) count = - count;
// Jika ada elemen yang dimaksud maka akan dihitung.
// Jika tidak ada berarti 0
if ( count > 0 )
// S(n) = 1/2 * banyaknya elemen * (elemen pertama + elemen terakhir)
// Siaga 1 : Arithmetic Overflow!
return number * ( count + 1L) * count / 2L;
else
return 0L;
}
/**
main method - test case
*/
public static void main
( String ...
args ) { Gauss g = new Gauss( ) ;
long before, after, ellapsed;
long result;
before
= System .
currentTimeMillis ( ) ; result = g.sum ( new long [ ] { 2L, 3L, 5L, 7L, 11L, 13L} , 0 , 6 , 999999L) ;
after
= System .
currentTimeMillis ( ) ; ellapsed = after - before;
System .
out .
println ( result
+ " dalam " + ellapsed
+ " ms" ) ;
before
= System .
currentTimeMillis ( ) ; result = g.sum ( new long [ ] { 2L, 3L, 5L, 7L, 11L, 13L} , 0 , 6 , 9999999L) ;
after
= System .
currentTimeMillis ( ) ; ellapsed = after - before;
System .
out .
println ( result
+ " dalam " + ellapsed
+ " ms" ) ;
before
= System .
currentTimeMillis ( ) ; result = g.sum ( new long [ ] { 2L, 3L, 5L, 7L, 11L, 13L} , 0 , 6 , 99999999L) ;
after
= System .
currentTimeMillis ( ) ; ellapsed = after - before;
System .
out .
println ( result
+ " dalam " + ellapsed
+ " ms" ) ;
before
= System .
currentTimeMillis ( ) ; result = g.sum ( new long [ ] { 2L, 3L, 5L, 7L, 11L, 13L} , 0 , 6 , 999999999L) ;
after
= System .
currentTimeMillis ( ) ; ellapsed = after - before;
System .
out .
println ( result
+ " dalam " + ellapsed
+ " ms" ) ;
before
= System .
currentTimeMillis ( ) ; result = g.sum ( new long [ ] { 2L, 3L, 5L, 7L, 11L, 13L, 17L} , 0 , 7 , 999999L) ;
after
= System .
currentTimeMillis ( ) ; ellapsed = after - before;
System .
out .
println ( result
+ " dalam " + ellapsed
+ " ms" ) ;
before
= System .
currentTimeMillis ( ) ; result = g.sum ( new long [ ] { 2L, 3L, 5L, 7L, 11L, 13L, 17L} , 0 , 7 , 9999999L) ;
after
= System .
currentTimeMillis ( ) ; ellapsed = after - before;
System .
out .
println ( result
+ " dalam " + ellapsed
+ " ms" ) ;
before
= System .
currentTimeMillis ( ) ; result = g.sum ( new long [ ] { 2L, 3L, 5L, 7L, 11L, 13L, 17L} , 0 , 7 , 99999999L) ;
after
= System .
currentTimeMillis ( ) ; ellapsed = after - before;
System .
out .
println ( result
+ " dalam " + ellapsed
+ " ms" ) ;
before
= System .
currentTimeMillis ( ) ; result = g.sum ( new long [ ] { 2L, 3L, 5L, 7L, 11L, 13L, 17L} , 0 , 7 , 999999999L) ;
after
= System .
currentTimeMillis ( ) ; ellapsed = after - before;
System .
out .
println ( result
+ " dalam " + ellapsed
+ " ms" ) ;
before
= System .
currentTimeMillis ( ) ; result = g.sum ( new long [ ] { 2L, 3L, 5L, 7L, 11L, 13L, 17L, 19L} , 0 , 8 , 999999L) ;
after
= System .
currentTimeMillis ( ) ; ellapsed = after - before;
System .
out .
println ( result
+ " dalam " + ellapsed
+ " ms" ) ;
before
= System .
currentTimeMillis ( ) ; result = g.sum ( new long [ ] { 2L, 3L, 5L, 7L, 11L, 13L, 17L, 19L} , 0 , 8 , 9999999L) ;
after
= System .
currentTimeMillis ( ) ; ellapsed = after - before;
System .
out .
println ( result
+ " dalam " + ellapsed
+ " ms" ) ;
before
= System .
currentTimeMillis ( ) ; result = g.sum ( new long [ ] { 2L, 3L, 5L, 7L, 11L, 13L, 17L, 19L} , 0 , 8 , 99999999L) ;
after
= System .
currentTimeMillis ( ) ; ellapsed = after - before;
System .
out .
println ( result
+ " dalam " + ellapsed
+ " ms" ) ;
before
= System .
currentTimeMillis ( ) ; result = g.sum ( new long [ ] { 2L, 3L, 5L, 7L, 11L, 13L, 17L, 19L} , 0 , 8 , 999999999L) ;
after
= System .
currentTimeMillis ( ) ; ellapsed = after - before;
System .
out .
println ( result
+ " dalam " + ellapsed
+ " ms" ) ; }
}
LyoqCiAqIEtlbGFzIHVudHVrIG1lbmdoaXR1bmcganVtbGFoIHNldGlhcCBlbGVtZW4gZGFsYW0gc2VidWFoIGRlcmV0IGFyaXRtYXRpay4gTWV0b2RlCiAqIHlhbmcgZGlwYWthaSBhZGFsYWggbWV0b2RlIEdhdXNzIGRpdGFtYmFoIGRlbmdhbiBwcmluc2lwIElua2x1c2ktRWtzbHVzaS4KICovCmNsYXNzIEdhdXNzIHsKCS8qKgoJICogRnVuZ3NpIHVudHVrIG1lbmp1bWxhaGthbiBzZW11YSBiaWxhbmdhbiBrZWxpcGF0YW4gYTEsIGEyLCBhMyAuLi4gYW4gZGFyaQoJICogMSBzYW1wYWkgbGltaXQgKGluY2x1c2l2ZSkuIFNlYmFnYWkgY29udG9oOiBKdW1sYWggYmlsYW5nYW4ga2VsaXBhdGFuIDIgZGFuIDMKCSAqIGRhcmkgMSBzYW1wYWkgMTAwIGFkYWxhaCBzdW0obmV3IGxvbmdbXXsyTCwgM0x9LCAwLCAyLCAxMDBMKS4KCSAqIAoJICogQmFnaWFuIHRlcmtlcmVuIGRhcmkgZnVuZ3NpIGluaSA6IGdhIGFkYSBpZiEgS2VrZWtla2VrZWsKCSAqIAoJICogQHBhcmFtIG51bWJlcnMgYXJyYXkgZGFyaSBiaWxhbmdhbi1iaWxhbmdhbiB5YW5nIGRpaW5naW5rYW4uIEFzdW1zaSA6IGFycmF5CgkgKiB0aWRhayBudWxsLiBBc3Vtc2kgOiBzZXRpYXAgYmlsYW5nYW4ga29wcmltYSAoRlBCLW55YSAxKSBkZW5nYW4gYmlsYW5nYW4KCSAqIGxhaW5ueWEuCgkgKiAKCSAqIEBwYXJhbSBsb3dlciBiYXRhcyBiYXdhaCBkYXJpIGFycmF5LiBBc3Vtc2kgOiBsb3dlciBiZXJhZGEgZGkgZGFsYW0gcmVudGFuZwoJICogeWFuZyBkaXBlcmJvbGVoa2FuIDogMCBzL2QgbnVtYmVycy5sZW5ndGggLSAxCgkgKiAKCSAqIEBwYXJhbSBsZW5ndGggcGFuamFuZyBhcnJheS4gQXN1bXNpIDogbG93ZXIgKyBsZW5ndGggPD0gbnVtYmVycy5sZW5ndGgKCSAqIAoJICogQHBhcmFtIGxpbWl0IGJhdGFzIG1ha3NpbWFsIGRlcmV0IChpbmNsdXNpdmUpLiBBc3Vtc2kgOiBsaW1pdCBhZGFsYWggYmlsYW5nYW4KCSAqIGJ1bGF0IHRpZGFrIG5lZ2F0aWYuCgkgKiAKCSAqIEByZXR1cm4ganVtbGFoIGJpbGFuZ2FuIGtlbGlwYXRhbiBhMSwgYTIsIGEzIC4uLiBhbiBkYXJpIDEgc2FtcGFpIGxpbWl0CgkgKi8KCXB1YmxpYyBsb25nIHN1bShsb25nW10gbnVtYmVycywgaW50IGxvd2VyLCBpbnQgbGVuZ3RoLCBsb25nIGxpbWl0KXsKCQlhc3NlcnQobnVtYmVycyAhPSBudWxsKTsKCQkvLyBTaWFnYSAyIDogUGVtZXJpa3NhYW4gYXN1bXNpIGZwYihhaSwgYWopID0gMSB0aWRhayBkaWxha3VrYW4hIQoJCWFzc2VydChsb3dlciA+PSAwICYmIGxvd2VyIDwgbnVtYmVycy5sZW5ndGgpOwoJCWFzc2VydChsb3dlciArIGxlbmd0aCA8PSBudW1iZXJzLmxlbmd0aCk7CgkJYXNzZXJ0KGxpbWl0ID49IDBMKTsKCgkJLy8gTWVuZ2hpdHVuZyB1a3VyYW4gYXJyYXkgOiAyXmxlbmd0aCAtIDEKCQkvLyBTaWFnYSAxIDogQXJpdGhtZXRpYyBPdmVyZmxvdyEKCQkvLyBTaWFnYSAxIDogT3V0IG9mIG1lbW9yeSEKCQlpbnQgc2l6ZSA9ICgxIDw8IGxlbmd0aCkgLSAxOwoKCQkvLyBEZWtsYXJhc2kgYXJyYXkKCQlsb25nW10gYXIgPSBuZXcgbG9uZ1tzaXplXTsKCgkJLy8gSW5pc2lhbGlzYXNpIHNldGlhcCBlbGVtZW4gcGFkYSBhcnJheSBkZW5nYW4gLTEKCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgYXJbaV0gPSAtMUw7CiAgICAgICAgCgkJLy8gRGVrbGFyYXNpICYgaW5pc2lhbGlzYXNpIHJldHVybiB2YWx1ZQogICAgICAgIGxvbmcgcmVzdWx0ID0gMEw7CiAgICAgICAgCiAgICAgICAgLy8gRGVrbGFyYXNpICYgaW5pc2lhbGlzYXNpIGluZGV4IGFycmF5IHlhbmcgYWthbiBkaXR1bGlzaQogICAgICAgIGludCBpZHggPSAwOwogICAgICAgIAogICAgICAgIC8vIERla2xhcmFzaSAmIGluaXNpYWxpc2FzaSBiYXRhcyBhdGFzL2d1YXJkIGRhcmkgbG9vcAogICAgICAgIGludCB1cHBlciA9IGxvd2VyICsgbGVuZ3RoOwogICAgICAgIAogICAgICAgIC8vIFNlbGFtYSBiYXRhcyBiYXdhaCBtYXNpaCBiZWx1bSAnYmVydGVtdScgYmF0YXMgYXRhcywgbGFuanV0a2FuIGl0ZXJhc2kKICAgICAgICBmb3IgKDsgbG93ZXIgPCB1cHBlcjsgbG93ZXIrKyl7CiAgICAgICAgICAgIC8vIEJpbGFuZ2FuIHlhbmcgZGktaW5wdXQKICAgICAgICAgICAgbG9uZyBudW1iZXIgPSBudW1iZXJzW2xvd2VyXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIEJhY2Egc2VtdWEgaXNpIGFycmF5IHlhbmcgc3VkYWggcGVybmFoIGRpdHVsaXNpCiAgICAgICAgICAgIC8vIEphZ2EgbG9vcCB1bnR1ayB0aWRhayBtZW1iYWNhIGVsZW1lbiB5YW5nIGJlbHVtIGRpdHVsaXMKICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIGogPSBpZHg7IGkgPCBqOyBpKyspIHsKICAgICAgICAgICAgICAgIC8vIEVsZW1lbiBiZXJpa3V0ID0gLUJpbGFuZ2FuIHlhbmcgZGlpbnB1dCAqIGlzaSBhcnJheQogICAgICAgICAgICAJLy8gU2lhZ2EgMSA6IEFyaXRobWV0aWMgT3ZlcmZsb3chCiAgICAgICAgICAgICAgICBsb25nIGVsZW1lbnQgPSAtbnVtYmVyICogYXJbaV07CgogICAgICAgICAgICAgICAgLy8gVHVsaXMgZWxlbWVuIHRlcnNlYnV0IGtlIGRhbGFtIGFycmF5CiAgICAgICAgICAgICAgICAvLyBOYWlra2FuIGluZGV4CiAgICAgICAgICAgICAgICBhcltpZHgrK10gPSBlbGVtZW50OwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvLyBIaXR1bmcganVtbGFoCiAgICAgICAgICAgICAgICAvLyBUYW1iYWhrYW4ganVtbGFoIHRlcnNlYnV0IGtlIGRhbGFtIGhhc2lsIGFraGlyCiAgICAgICAgICAgICAgICByZXN1bHQgKz0gY2FsY3VsYXRlKGxpbWl0LCBlbGVtZW50KTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgLy8gRGVmYXVsdCA6IHR1bGlzIGJpbGFuZ2FuIHlhbmcgZGktaW5wdXQgb2xlaCB1c2VyIGtlIGRhbGFtIGFycmF5CiAgICAgICAgICAgIC8vIE5haWtrYW4gaW5kZXgKICAgICAgICAgICAgYXJbaWR4KytdID0gbnVtYmVyOwogICAgICAgICAgICAKICAgICAgICAgICAgLy8gSGl0dW5nIGp1bWxhaAogICAgICAgICAgICAvLyBUYW1iYWhrYW4ganVtbGFoIHRlcnNlYnV0IGtlIGRhbGFtIGhhc2lsIGFraGlyCiAgICAgICAgICAgIHJlc3VsdCArPSBjYWxjdWxhdGUobGltaXQsIG51bWJlcik7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogRnVuZ3NpIHVudHVrIG1lbmdoaXR1bmcganVtbGFoIHNlbXVhIGJpbGFuZ2FuIGtlbGlwYXRhbiAnbnVtYmVyJyBkYXJpIDEKICAgICAqIHNhbXBhaSAnbGltaXQnIChpbmNsdXNpdmUpLiBTZWJhZ2FpIGNvbnRvaDogSnVtbGFoIGJpbGFuZ2FuIGtlbGlwYXRhbiAyIGRhcmkKICAgICAqIDEgc2FtcGFpIDEwMCBkaW55YXRha2FuIHNlYmFnYWkgY2FsY3VsYXRlKDIsIDEwMCkgPSAyNTUwCiAgICAgKiAKICAgICAqIEJhZ2lhbiB0ZXJrZXJlbiBkYXJpIGZ1bmdzaSBpbmkgOiBtYW1wdSBtZW5lcmltYSAnbnVtYmVyJyBwb3NpdGlmIGF0YXVwdW4KICAgICAqIG5lZ2F0aWYhIHhpeGl4aQogICAgICogCiAgICAgKiBAcGFyYW0gbGltaXQgYmF0YXMgbWFrc2ltYWwgZGVyZXQgeWFuZyBpbmdpbiBkaWhpdHVuZyAoaW5jbHVzaXZlKS4gQXN1bXNpIDoKICAgICAqIGxpbWl0IGFkYWxhaCBiaWxhbmdhbiBidWxhdCB0aWRhayBuZWdhdGlmCiAgICAgKiAKICAgICAqIEBwYXJhbSBudW1iZXIga2VsaXBhdGFuIGJpbGFuZ2FuIHlhbmcgaW5naW4gZGloaXR1bmcuIEFzdW1zaSA6IG51bWJlciBhZGFsYWgKICAgICAqIGJpbGFuZ2FuIGJ1bGF0IHRpZGFrIDAKICAgICAqIAogICAgICogQHJldHVybiBqdW1sYWggc2VtdWEgYmlsYW5nYW4ga2VsaXBhdGFuIG51bWJlciBkYXJpIDEuLi5saW1pdAogICAgICovCglwdWJsaWMgbG9uZyBjYWxjdWxhdGUobG9uZyBsaW1pdCwgbG9uZyBudW1iZXIpewoJCWFzc2VydChsaW1pdCA+PSAwTCk7CgkJYXNzZXJ0KG51bWJlciAhPSAwTCk7CgkJCiAgICAgICAgLy8gTWVuZ2hpdHVuZyBiYW55YWtueWEgZWxlbWVuCiAgICAgICAgbG9uZyBjb3VudCA9IGxpbWl0IC8gbnVtYmVyOwogICAgICAgIAogICAgICAgIC8vIEJhbnlha255YSBlbGVtZW4gc2VsYWx1IHBvc2l0aWYKICAgICAgICBpZiAoY291bnQgPCAwKSBjb3VudCA9IC1jb3VudDsKICAgICAgICAKICAgICAgICAvLyBKaWthIGFkYSBlbGVtZW4geWFuZyBkaW1ha3N1ZCBtYWthIGFrYW4gZGloaXR1bmcuCiAgICAgICAgLy8gSmlrYSB0aWRhayBhZGEgYmVyYXJ0aSAwCiAgICAgICAgaWYgKGNvdW50ID4gMCkKICAgICAgICAgICAgLy8gUyhuKSA9IDEvMiAqIGJhbnlha255YSBlbGVtZW4gKiAoZWxlbWVuIHBlcnRhbWEgKyBlbGVtZW4gdGVyYWtoaXIpCiAgICAgICAgCS8vIFNpYWdhIDEgOiBBcml0aG1ldGljIE92ZXJmbG93IQogICAgICAgICAgICByZXR1cm4gbnVtYmVyICogKGNvdW50ICsgMUwpICogY291bnQgLyAyTDsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHJldHVybiAwTDsKICAgIH0KICAgIAogICAgCiAgICAvKioKICAgIAltYWluIG1ldGhvZCAtIHRlc3QgY2FzZQogICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcuLi4gYXJncyl7CiAgICAJR2F1c3MgZyA9IG5ldyBHYXVzcygpOwogICAgCWxvbmcgYmVmb3JlLCBhZnRlciwgZWxsYXBzZWQ7CiAgICAJbG9uZyByZXN1bHQ7CiAgICAJCiAgICAJYmVmb3JlID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CiAgICAJcmVzdWx0ID0gZy5zdW0obmV3IGxvbmdbXXsyTCwgM0wsIDVMLCA3TCwgMTFMLCAxM0x9LCAwLCA2LCA5OTk5OTlMKTsKICAgIAlhZnRlciA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgCWVsbGFwc2VkID0gYWZ0ZXIgLSBiZWZvcmU7CiAgICAJU3lzdGVtLm91dC5wcmludGxuKHJlc3VsdCArICIgZGFsYW0gIiArIGVsbGFwc2VkICsgIiBtcyIpOwoKICAgIAliZWZvcmUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKICAgIAlyZXN1bHQgPSBnLnN1bShuZXcgbG9uZ1tdezJMLCAzTCwgNUwsIDdMLCAxMUwsIDEzTH0sIDAsIDYsIDk5OTk5OTlMKTsKICAgIAlhZnRlciA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgCWVsbGFwc2VkID0gYWZ0ZXIgLSBiZWZvcmU7CiAgICAJU3lzdGVtLm91dC5wcmludGxuKHJlc3VsdCArICIgZGFsYW0gIiArIGVsbGFwc2VkICsgIiBtcyIpOwoKICAgIAliZWZvcmUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKICAgIAlyZXN1bHQgPSBnLnN1bShuZXcgbG9uZ1tdezJMLCAzTCwgNUwsIDdMLCAxMUwsIDEzTH0sIDAsIDYsIDk5OTk5OTk5TCk7CiAgICAJYWZ0ZXIgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKICAgIAllbGxhcHNlZCA9IGFmdGVyIC0gYmVmb3JlOwogICAgCVN5c3RlbS5vdXQucHJpbnRsbihyZXN1bHQgKyAiIGRhbGFtICIgKyBlbGxhcHNlZCArICIgbXMiKTsKCiAgICAJYmVmb3JlID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CiAgICAJcmVzdWx0ID0gZy5zdW0obmV3IGxvbmdbXXsyTCwgM0wsIDVMLCA3TCwgMTFMLCAxM0x9LCAwLCA2LCA5OTk5OTk5OTlMKTsKICAgIAlhZnRlciA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgCWVsbGFwc2VkID0gYWZ0ZXIgLSBiZWZvcmU7CiAgICAJU3lzdGVtLm91dC5wcmludGxuKHJlc3VsdCArICIgZGFsYW0gIiArIGVsbGFwc2VkICsgIiBtcyIpOwoKICAgIAliZWZvcmUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKICAgIAlyZXN1bHQgPSBnLnN1bShuZXcgbG9uZ1tdezJMLCAzTCwgNUwsIDdMLCAxMUwsIDEzTCwgMTdMfSwgMCwgNywgOTk5OTk5TCk7CiAgICAJYWZ0ZXIgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKICAgIAllbGxhcHNlZCA9IGFmdGVyIC0gYmVmb3JlOwogICAgCVN5c3RlbS5vdXQucHJpbnRsbihyZXN1bHQgKyAiIGRhbGFtICIgKyBlbGxhcHNlZCArICIgbXMiKTsKCiAgICAJYmVmb3JlID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CiAgICAJcmVzdWx0ID0gZy5zdW0obmV3IGxvbmdbXXsyTCwgM0wsIDVMLCA3TCwgMTFMLCAxM0wsIDE3TH0sIDAsIDcsIDk5OTk5OTlMKTsKICAgIAlhZnRlciA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgCWVsbGFwc2VkID0gYWZ0ZXIgLSBiZWZvcmU7CiAgICAJU3lzdGVtLm91dC5wcmludGxuKHJlc3VsdCArICIgZGFsYW0gIiArIGVsbGFwc2VkICsgIiBtcyIpOwoKICAgIAliZWZvcmUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKICAgIAlyZXN1bHQgPSBnLnN1bShuZXcgbG9uZ1tdezJMLCAzTCwgNUwsIDdMLCAxMUwsIDEzTCwgMTdMfSwgMCwgNywgOTk5OTk5OTlMKTsKICAgIAlhZnRlciA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgCWVsbGFwc2VkID0gYWZ0ZXIgLSBiZWZvcmU7CiAgICAJU3lzdGVtLm91dC5wcmludGxuKHJlc3VsdCArICIgZGFsYW0gIiArIGVsbGFwc2VkICsgIiBtcyIpOwoKICAgIAliZWZvcmUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKICAgIAlyZXN1bHQgPSBnLnN1bShuZXcgbG9uZ1tdezJMLCAzTCwgNUwsIDdMLCAxMUwsIDEzTCwgMTdMfSwgMCwgNywgOTk5OTk5OTk5TCk7CiAgICAJYWZ0ZXIgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKICAgIAllbGxhcHNlZCA9IGFmdGVyIC0gYmVmb3JlOwogICAgCVN5c3RlbS5vdXQucHJpbnRsbihyZXN1bHQgKyAiIGRhbGFtICIgKyBlbGxhcHNlZCArICIgbXMiKTsKCiAgICAJYmVmb3JlID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CiAgICAJcmVzdWx0ID0gZy5zdW0obmV3IGxvbmdbXXsyTCwgM0wsIDVMLCA3TCwgMTFMLCAxM0wsIDE3TCwgMTlMfSwgMCwgOCwgOTk5OTk5TCk7CiAgICAJYWZ0ZXIgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKICAgIAllbGxhcHNlZCA9IGFmdGVyIC0gYmVmb3JlOwogICAgCVN5c3RlbS5vdXQucHJpbnRsbihyZXN1bHQgKyAiIGRhbGFtICIgKyBlbGxhcHNlZCArICIgbXMiKTsKCiAgICAJYmVmb3JlID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CiAgICAJcmVzdWx0ID0gZy5zdW0obmV3IGxvbmdbXXsyTCwgM0wsIDVMLCA3TCwgMTFMLCAxM0wsIDE3TCwgMTlMfSwgMCwgOCwgOTk5OTk5OUwpOwogICAgCWFmdGVyID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CiAgICAJZWxsYXBzZWQgPSBhZnRlciAtIGJlZm9yZTsKICAgIAlTeXN0ZW0ub3V0LnByaW50bG4ocmVzdWx0ICsgIiBkYWxhbSAiICsgZWxsYXBzZWQgKyAiIG1zIik7CgogICAgCWJlZm9yZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgCXJlc3VsdCA9IGcuc3VtKG5ldyBsb25nW117MkwsIDNMLCA1TCwgN0wsIDExTCwgMTNMLCAxN0wsIDE5TH0sIDAsIDgsIDk5OTk5OTk5TCk7CiAgICAJYWZ0ZXIgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKICAgIAllbGxhcHNlZCA9IGFmdGVyIC0gYmVmb3JlOwogICAgCVN5c3RlbS5vdXQucHJpbnRsbihyZXN1bHQgKyAiIGRhbGFtICIgKyBlbGxhcHNlZCArICIgbXMiKTsKCiAgICAJYmVmb3JlID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CiAgICAJcmVzdWx0ID0gZy5zdW0obmV3IGxvbmdbXXsyTCwgM0wsIDVMLCA3TCwgMTFMLCAxM0wsIDE3TCwgMTlMfSwgMCwgOCwgOTk5OTk5OTk5TCk7CiAgICAJYWZ0ZXIgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKICAgIAllbGxhcHNlZCA9IGFmdGVyIC0gYmVmb3JlOwogICAgCVN5c3RlbS5vdXQucHJpbnRsbihyZXN1bHQgKyAiIGRhbGFtICIgKyBlbGxhcHNlZCArICIgbXMiKTsKICAgIH0gICAgCn0=