چند ماهی است که احمد یک وبسرویس پرداخت با نام *بپرداز* پیادهسازی کرده است. این وبسرویس اخیراً شاهد ترافیک سنگین درخواستها بوده است. احمد برای رفع این مشکل، تصمیم گرفت تا از چند سرور مختلف برای پردازش درخواستها استفاده کند. این سرورها با یکدیگر *sync* هستند؛ اما هماکنون برخی از آنها همچنان به دلیل ترافیک بالای درخواستها کند شدهاند. از آنجایی که احمد هنوز راهحل درستی برای این مسئله پیدا نکرده، میخواهد یک تغییر موقتی روی *SDK* ای که در اختیار توسعهدهندگان قرار داده است اعمال کند.
احمد میخواهد *SDK* جاوای وبسرویسش را طوری پیادهسازی کند که درخواست تأیید یک تراکنش بهصورت همزمان به همهی سرورهای موجود ارسال شود و به محض اولین پاسخی که از یکی از سرورها دریافت میشود، این پاسخ برگردانده شود. همچنین، او میخواهد قابلیت ست کردن *timeout* وجود داشته باشد تا اگر پس از $n$ واحد زمانی هیچ پاسخی دریافت نشد، برنامه یک `Exception` پرتاب کند.
# جزئیات پروژه
پروژهی اولیه را از [این لینک](/problemset/assignments/4367/download_problem_initial_project/111986/) دانلود کنید.
## کلاس `TransactionVerifier`
این کلاس در کانستراکتور خود لیستی از `URL`های مربوط به درخواست تأیید تراکنش را دریافت میکند.
+ بدنهی کانستراکتور را بهگونهای تغییر دهید که اگر لیست `URL`ها خالی بود، یک `IllegalArgumentException` پرتاب شود.
+ متد `setTimeout` را طوری پیادهسازی کنید که با دریافت یک واحد زمانی از نوع `Duration`، حداکثر زمان انتظار برای دریافت پاسخ را مشخص کند. همچنین، مقدار پیشفرض *timeout* را برابر با ۳ ثانیه قرار دهید.
+ متد `verify` را طوری پیادهسازی کنید که با دریافت شناسهی یک تراکنش (که از نوع `String` است)، درخواست تأیید تراکنش را بهصورت همروند به همهی آدرسها ارسال کند و به محض دریافت اولین پاسخ، آن را در قالب یک رشته برگرداند. این متد باید حداکثر به اندازهی *timeout* ست شده منتظر پاسخ بماند. اگر *timeout* رخ دهد، این متد باید یک `TimeoutException` پرتاب کند. درخواستها باید از نوع `POST` باشند و مقدار پارامتر `transaction_id` باید برابر با شناسهی تراکنش قرار داده شود. بدنهی درخواست باید از نوع *JSON* باشد.
+ متد `getFastestServer` را طوری پیادهسازی کنید که `URL` سروری که تاکنون بیشترین پاسخها از آن دریافت شده است را برگرداند. اگر تعداد دفعات دریافت زودترین پاسخ از چند سرور یکسان بود، `URL` یکی از آنها را به دلخواه برگردانید.
# مثال
با اجرای متد `main`، یکی از سه خروجی زیر مورد انتظار است:
```json
{
"sever_id": 1,
"status": true
}
```
```json
{
"sever_id": 2,
"status": true
}
```
```json
{
"sever_id": 3,
"status": true
}
```
**توجه:** برنامهی شما نباید *resource leak* داشته باشد.
# آنچه باید آپلود کنید
پس از پیادهسازی کلاس `TransactionVerifier`، فایل `TransactionVerifier.java` را آپلود کنید.