PGh0bWw+Cgo8aGVhZD4KPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KPHRpdGxlPlByb3BlcnR5IE1lcmdlIFVzYWdlPC90aXRsZT4KPC9oZWFkPgoKPGJvZHk+Cgo8cD48Zm9udCBmYWNlPSJDb3VyaWVyIE5ldyI+Lyo8YnI+CkNvcHlyaWdodCAyMDA4IEludGVsIENvcnBvcmF0aW9uPGJyPgo8YnI+ClVzZSwgbW9kaWZpY2F0aW9uIGFuZCBkaXN0cmlidXRpb24gYXJlIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsPGJyPgpWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdDxicj4KaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KS48YnI+CiovPGJyPgojaW5jbHVkZSAmbHQ7Ym9vc3QvcG9seWdvbi9wb2x5Z29uLmhwcCZndDs8YnI+CiNpbmNsdWRlICZsdDtjYXNzZXJ0Jmd0Ozxicj4KbmFtZXNwYWNlIGd0bCA9IGJvb3N0Ojpwb2x5Z29uOzxicj4KdXNpbmcgbmFtZXNwYWNlIGJvb3N0Ojpwb2x5Z29uOjpvcGVyYXRvcnM7PGJyPgo8YnI+Ly9qdXN0IGEgbGl0dGxlIG1ldGEtcHJvZ3JhbW1pbmcgdG8gZ2V0IHRoaW5ncyBvZmYgb24gdGhlIHJpZ2h0IGZvb3Q8YnI+CnRlbXBsYXRlICZsdDt0eXBlbmFtZSBUJmd0Ozxicj4Kc3RydWN0IGxvb2t1cF9wb2x5Z29uX3NldF90eXBlIHsgdHlwZWRlZiBndGw6OnBvbHlnb25fc2V0X2RhdGEmbHQ7aW50Jmd0OyB0eXBlOyB9Ozxicj4KdGVtcGxhdGUgJmx0O3R5cGVuYW1lIFQsIHR5cGVuYW1lIFQyJmd0Ozxicj4Kc3RydWN0IGxvb2t1cF9wb2x5Z29uX3NldF90eXBlJmx0O2d0bDo6cHJvcGVydHlfbWVyZ2VfOTAmbHQ7VCwgVDImZ3Q7ICZndDsgeyA8YnI+CiZuYnNwOyB0eXBlZGVmIGd0bDo6cG9seWdvbl85MF9zZXRfZGF0YSZsdDtpbnQmZ3Q7IHR5cGU7IH07PGJyPgo8YnI+Ci8vVGhpcyBmdW5jdGlvbiB3b3JrcyB3aXRoIGJvdGggdGhlIDkwIGFuZCBnZW5lcmFsIHZlcnNpb25zPGJyPgovL29mIHByb3BlcnR5IG1lcmdlL21hcCBvdmVybGF5IGFsZ29yaXRobTxicj4KdGVtcGxhdGUgJmx0O3R5cGVuYW1lIHBtX3R5cGUmZ3Q7PGJyPgp2b2lkIHRlc3RfcG0oKSB7PGJyPgombmJzcDsgc3RkOjp2ZWN0b3ImbHQ7Z3RsOjpyZWN0YW5nbGVfZGF0YSZsdDtpbnQmZ3Q7ICZndDsgdGVzdF9kYXRhOzxicj4KJm5ic3A7IHRlc3RfZGF0YS5wdXNoX2JhY2soZ3RsOjpyZWN0YW5nbGVfZGF0YSZsdDtpbnQmZ3Q7KDExLCAxMCwgMzEsIDMwKSk7PGJyPgombmJzcDsgdGVzdF9kYXRhLnB1c2hfYmFjayhndGw6OnJlY3RhbmdsZV9kYXRhJmx0O2ludCZndDsoMSwgMCwgMjEsIDIwKSk7PGJyPgombmJzcDsgdGVzdF9kYXRhLnB1c2hfYmFjayhndGw6OnJlY3RhbmdsZV9kYXRhJmx0O2ludCZndDsoNiwgMTUsIDE2LCAyNSkpOzxicj4KPGJyPgombmJzcDsgcG1fdHlwZSBwbTs8YnI+Cjxicj4KJm5ic3A7IC8vaW5zZXJ0IG91ciB0ZXN0IGdlb21ldHJ5IGludG8gdGhlIHByb3BlcnR5IG1lcmdlIGFsZ29yaXRobTxicj4KJm5ic3A7IGZvcih1bnNpZ25lZCBpbnQgaSA9IDA7IGkgJmx0OyB0ZXN0X2RhdGEuc2l6ZSgpOyArK2kpIHs8YnI+CiZuYnNwOyZuYnNwOyZuYnNwOyBwbS5pbnNlcnQodGVzdF9kYXRhW2ldLCBpKTsgLy9ub3RpY2UgSSB1c2UgdGhlIGluZGV4IGFzIHRoZSAKcHJvcGVydHkgdmFsdWU8YnI+CiZuYnNwOyB9PGJyPgo8YnI+CiZuYnNwOyB0eXBlZGVmIHR5cGVuYW1lIGxvb2t1cF9wb2x5Z29uX3NldF90eXBlJmx0O3BtX3R5cGUmZ3Q7Ojp0eXBlIHBvbHlnb25fc2V0X3R5cGU7PGJyPgombmJzcDsgdHlwZWRlZiBzdGQ6Om1hcCZsdDtzdGQ6OnNldCZsdDtpbnQmZ3Q7LCBwb2x5Z29uX3NldF90eXBlJmd0OyAKcHJvcGVydHlfbWVyZ2VfcmVzdWx0X3R5cGU7PGJyPgo8YnI+CiZuYnNwOyBzdGQ6OnNldCZsdDtpbnQmZ3Q7IGtleTs8YnI+Cjxicj4KJm5ic3A7IC8vVGhlcmUgYXJlIDggZGlmZmVyZW50IGNvbWJpbmF0aW9ucyBvZiBvdXIgaW5wdXQgZ2VvbWV0cmllczxicj4KJm5ic3A7IC8vbnVsbCBjb21iaW5hdGlvbiBpcyBub3QgaW50ZXJlc3RpbmcsIHNvIHJlYWxseSA3PGJyPgo8YnI+CiZuYnNwOyBwcm9wZXJ0eV9tZXJnZV9yZXN1bHRfdHlwZSByZXN1bHQ7PGJyPgombmJzcDsgcG0ubWVyZ2UocmVzdWx0KTs8YnI+Cjxicj4KJm5ic3A7IC8vbGV0cyBlbnVtZXJhdGUgYm9vbGVhbiBjb21iaW5hdGlvbnMgb2YgaW5wdXRzIChob2xkIG9udG8geW91ciBoYXRzKTxicj4KJm5ic3A7IGZvcih1bnNpZ25lZCBpbnQgaSA9IDA7IGkgJmx0OyA4OyArK2kpIHs8YnI+CiZuYnNwOyZuYnNwOyZuYnNwOyBib29sIGJpdHNbM10gPSB7aSAmYW1wOyAxLCBpICZhbXA7IDIsIGkgJmFtcDsgNH07IC8vYnJlYWsgb3V0IGJpdCBhcnJheTxicj4KJm5ic3A7Jm5ic3A7Jm5ic3A7IHBvbHlnb25fc2V0X3R5cGUgdGVzdF9zZXQ7PGJyPgombmJzcDsmbmJzcDsmbmJzcDsgc3RkOjpzZXQmbHQ7aW50Jmd0OyBrZXk7PGJyPgombmJzcDsmbmJzcDsmbmJzcDsgZm9yKHVuc2lnbmVkIGludCBqID0gMDsgaiAmbHQ7IDM7ICsraikgezxicj4KJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGlmKGJpdHNbal0pIHs8YnI+CiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBrZXkuaW5zZXJ0KGtleS5lbmQoKSwgaik7PGJyPgombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgdGVzdF9zZXQgKz0gdGVzdF9kYXRhW2pdOzxicj4KJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IH08YnI+CiZuYnNwOyZuYnNwOyZuYnNwOyB9PGJyPgombmJzcDsmbmJzcDsmbmJzcDsgZm9yKHVuc2lnbmVkIGludCBqID0gMDsgaiAmbHQ7IDM7ICsraikgezxicj4KJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGlmKGJpdHNbal0pIHs8YnI+CiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyB0ZXN0X3NldCAqPSB0ZXN0X2RhdGFbal07PGJyPgombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgfTxicj4KJm5ic3A7Jm5ic3A7Jm5ic3A7IH08YnI+CiZuYnNwOyZuYnNwOyZuYnNwOyBmb3IodW5zaWduZWQgaW50IGogPSAwOyBqICZsdDsgMzsgKytqKSB7PGJyPgombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgaWYoIWJpdHNbal0pPGJyPgombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgdGVzdF9zZXQgLT0gdGVzdF9kYXRhW2pdOzxicj4KJm5ic3A7Jm5ic3A7Jm5ic3A7IH08YnI+CiZuYnNwOyZuYnNwOyZuYnNwOyBpZih0ZXN0X3NldC5lbXB0eSgpKSB7PGJyPgombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgLy9vbmx5IHRoZSBudWxsIGNvbWJpbmF0aW9uIHNob3VsZCBub3QgZXhpc3Q8YnI+CiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBhc3NlcnQoaSA9PSAwKTs8YnI+CiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAvL2EgY29tYmluYXRpb24gdGhhdCBkb2VzIG5vdCBleGlzdCBzaG91bGQgbm90PGJyPgombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgLy9iZSBwcmVzZW50IGluIHJlc3VsdDxicj4KJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGFzc2VydChyZXN1bHQuZmluZChrZXkpID09IHJlc3VsdC5lbmQoKSk7PGJyPgombmJzcDsmbmJzcDsmbmJzcDsgfSBlbHNlIHs8YnI+CiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBhc3NlcnQoZ3RsOjplcXVpdmFsZW5jZShyZXN1bHRba2V5XSwgdGVzdF9zZXQpKTs8YnI+CiZuYnNwOyZuYnNwOyZuYnNwOyB9PGJyPgombmJzcDsgfTxicj4KPGJyPgombmJzcDsgLy9Ob3RpY2UgdGhhdCB3ZSBoYXZlIHRvIGRvIE8oMl5uKSBib29sZWFucyB0byBjb21wb3NlIHRoZSBzYW1lPGJyPgombmJzcDsgLy9yZXN1bHQgdGhhdCBpcyBwcm9kdWNlZCBpbiBvbmUgcGFzcyBvZiBwcm9wZXJ0eSBtZXJnZTxicj4KJm5ic3A7IC8vZ2l2ZW4gbiBpbnB1dCBsYXllcnMgKDggPSAyXjMgaW4gdGhpcyBleGFtcGxlKTxicj4KfTxicj4KPGJyPgppbnQgbWFpbigpIHs8YnI+CiZuYnNwOwp0ZXN0X3BtJmx0O2d0bDo6cHJvcGVydHlfbWVyZ2VfOTAmbHQ7aW50LCBpbnQmZ3Q7ICZndDsoKTs8YnI+CiZuYnNwOwp0ZXN0X3BtJmx0O2d0bDo6cHJvcGVydHlfbWVyZ2UmbHQ7aW50LCBpbnQmZ3Q7ICZndDsoKTs8YnI+CiZuYnNwOwpyZXR1cm4gMDs8YnI+Cn08YnI+Ci8vTm93IHlvdSBrbm93IGhvdyB0byB1c2UgdGhlIG1hbmhhdHRhbiBhbmQgYXJiaXRyYXJ5IGFuZ2xlIHByb3BlcnR5PGJyPgovL21lcmdlIGFsZ29yaXRobXMgdG8gcGVyZm9ybSBtYXAgb3ZlcmxheSBvbiBuIGxheWVycyBvZiBpbnB1dCBnZW9tZXRyeTxicj4KJm5ic3A7PC9mb250PjwvcD4KCgo8dGFibGUgY2xhc3M9ImRvY2luZm8iIHJ1bGVzPSJub25lIiBmcmFtZT0idm9pZCIgaWQ9InRhYmxlMSI+Cgk8Y29sZ3JvdXA+CgkJPGNvbCBjbGFzcz0iZG9jaW5mby1uYW1lIj48Y29sIGNsYXNzPSJkb2NpbmZvLWNvbnRlbnQiPgoJPC9jb2xncm91cD4KCTx0Ym9keSB2QWxpZ249InRvcCI+CgkJPHRyPgoJCQk8dGggY2xhc3M9ImRvY2luZm8tbmFtZSI+Q29weXJpZ2h0OjwvdGg+CgkJCTx0ZD5Db3B5cmlnaHQgqSBJbnRlbCBDb3Jwb3JhdGlvbiAyMDA4LTIwMTAuPC90ZD4KCQk8L3RyPgoJCTx0ciBjbGFzcz0iZmllbGQiPgoJCQk8dGggY2xhc3M9ImRvY2luZm8tbmFtZSI+TGljZW5zZTo8L3RoPgoJCQk8dGQgY2xhc3M9ImZpZWxkLWJvZHkiPkRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCAKCQkJVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nIGZpbGUgPHR0IGNsYXNzPSJsaXRlcmFsIj4KCQkJPHNwYW4gY2xhc3M9InByZSI+TElDRU5TRV8xXzAudHh0PC9zcGFuPjwvdHQ+IG9yIGNvcHkgYXQKCQkJPGEgY2xhc3M9InJlZmVyZW5jZSIgdGFyZ2V0PSJfdG9wIiBocmVmPSJodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQiPgoJCQlodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQ8L2E+KTwvdGQ+CgkJPC90cj4KPC90YWJsZT4KCjwvYm9keT4KCjwvaHRtbD4K