+ محدودیت زمان: ۱ ثانیه
+ محدودیت حافظه: ۲۵۶ مگابایت
----------
پارک پردیس برای برگزاری مسابقات المپیک فناوری تعداد زیادی استف استخدام کرده تا این مسابقات به بهترین نحو ممکن برگزار بشن، حالا نیاز به سامانه ای برای مدیریت سلف دارد و از شما میخواهد تا این سامانه را طراحی کنید.
این سامانه از دو بخش تشکیل شده است.
<details class="blue">
<summary> **بخش کاربران** </summary>
<details class="green">
<summary> **ثبت نام** </summary>
کارمندان جدید نیاز دارند در سامانه ثبت نام کنند. برای اینکار دستور زیر را وارد میکنند:
```
REGISTER username password
```
$username$ نامکاربری مورد نظر
$password$ رمز عبور مورد نظر
در صورتی که شخصی با این نام کاربری از پیش در سامانه وجود داشته باشد پیام زیر نمایش داده میشود:
```
USERNAME username ALREADY EXISTS
```
رمز عبور وارد شده توسط کاربر (password) باید حداقل هشت کاراکتر داشته باشد و شامل ارقام، حروف کوچک و بزرگ و کاراکترهای خاص ( +=_-)(*&^%$#@! ) باشد. در غیر این صورت پیام زیر نمایش داده میشود:
```
PASSWORD IS NOT STRONG ENOGH
```
در صورتی که کاربر از قبل داخل سامانه باشد، پیام زیر نمایش داده میشود:
```
YOU NEED TO LOGOUT FIRST
```
در صورت موفقیت آمیز بودن ثبت نام، پیام زیر نمایش داده میشود:
```
username REGISTERED SUCCESSFULLY
```
</details>
<details class="green">
<summary> **ورود** </summary>
بعد از ثبت نام، کاربران باید توسط بخش مدیریت تایید شوند تا بتوانند از سامانه استفاده کنند که دستورات مربوط به آن در بخش مدیریت آورده شده است.
کارمندان برای ورود به سامانه دستور زیر را وارد میکنند:
```
LOGIN username password
```
در صورتی که شخصی با نام کاربری username از پیش در سامانه وجود نداشته باشد یا رمز عبور نادرست باشد، پیام زیر نمایش داده میشود:
```
WRONG PASSWORD OR USERNAME DOESN'T EXIST
```
در صورتی که حساب کاربر توسط مدیریت تایید نشده باشد یا غیرفعال شده باشد ، پیام زیر نمایش داده میشود:
```
ACCOUNT IS DEACTIVE
```
در صورتی که کاربر از قبل داخل سامانه باشد، پیام زیر نمایش داده میشود:
```
YOU NEED TO LOGOUT FIRST
```
در صورت موفقیت آمیز بودن ورود پیام زیر نمایش داده میشود :
```
username LOGGEDIN SUCCESSFULLY
```
</details>
<details class="green">
<summary> **خروج** </summary>
کارمندان برای خروج از سامانه دستور زیر را وارد میکنند:
```
LOGOUT
```
در صورتی که کاربر وارد سامانه نشده باشد، پیام زیر نمایش داده میشود:
```
YOU NEED TO LOGIN FIRST
```
در صورت موفقیت آمیز بودن خروج پیام زیر نمایش داده میشود :
```
LOGGEDOUT SUCCESSFULLY
```
</details>
<details class="green">
<summary> **مشاهده برنامه غذایی** </summary>
کارمندان برای مشاهده برنامه غذایی ارائه شده در بازه تاریخی مورد نظرشان دستور زیر را وارد میکنند:
```
MENU startdate enddate
```
مقادیر $startdate$ و $enddate$ با فرمت YYYY-MM-DD وارد میشود.
در صورتی که کاربر وارد سامانه نشده باشد، پیام زیر نمایش داده میشود:
```
YOU NEED TO LOGIN FIRST
```
در صورتی که تاریخ شروع (startdate) قبل از (enddate) باشد، پیام زیر نمایش داده میشود :
```
STARTDATE MUST BE BEFORE ENDDATE
```
برنامه غذایی به فرم زیر به کاربر نمایش داده میشود:
```
date1: food1:remaining,food2:remaining,...
date2: food1:remaining,food2:remaining,...
```
مقدار date باید با فرمت YYYY-MM-DD باشد.
در صورتی که برای روزی منو غذایی تعریف نشده باشد، آن روز نمایش داده نمیشود.
در صورتی که برای یک روز بیش از یک غذا تعریف شده باشد، نام غذاها رابه صورت مرتب شده (به ترتیب حروف الفبا) با $,$ از هم جدا میشود.
در صورتی که باقی مانده یک غذا صفر شده باشد، آن غذا نمایش داده نمیشود و در نتیجه اگر تمام غذاهای یک روز رزرو شده باشند و باقیمانده نداشته باشند، آن روز نمایش داده نمیشود.
برای درک بهتر به نمونه زیر توجه کنید.
ورودی
```
MENU 2024-10-19 2024-10-23
```
خروجی
```
2024-10-19: GhormeSabzi:10
2024-10-21: AdasPolo:20
2024-10-23: Fesenjoon:5,Abgoosht:15
```
در مثال فوق برای روز ۱۹ ام ۱۰ قورمهسبزی باقی مانده و برای روز های ۲۰ ام و ۲۲ ام غذایی تعریف نشده و یا تمام غذاهای آنها رزرو شده اند،بنابراین در لیست آورده نشده اند.
</details>
<details class="green">
<summary> **رزرو** </summary>
کارمندان برای رزرو غذا دستور زیر را وارد میکنند:
```
RESERVE date food
```
در صورتی که کاربر وارد سامانه نشده باشد، پیام زیر نمایش داده میشود:
```
YOU NEED TO LOGIN FIRST
```
در صورتی که غذا مورد نظر در آن روز وجود نداشته باشد و یا همه آن رزرو شده باشد، پیام زیر نمایش داده میشود:
```
SELECTED FOOD WAS NOT SERVED
```
کاربر برای هر روز تنها میتواند یک غذا رزرو کند، بنابر این اگر کاربر از قبل برای آن روز غذایی رزرو کرده باشد، نمیتواند غذای دیگری رزرو کند و پیام زیر نمایش داده میشود:
```
RESERVATION ALREADY EXISTS FOR THIS DATE
```
در صورت موفقیت آمیز بودن رزرو، از تعداد باقی مانده غذا کاسته میشود و پیام زیر نمایش داده میشود :
```
SUCCESSFULLY RESERVED
```
</details>
</details>
<details class="orange">
<summary> **بخش مدیریت** </summary>
<details>
<summary> **مدیریت کاربران** </summary>
<details class="purple">
<summary> **فعال کردن کاربران** </summary>
برای فعال کردن یک کاربر مدیر دستور زیر را وارد میکند:
```
ACTIVE username
```
در صورتی که نام کاربری (username) در سیستم وجود نداشته باشد، پیام زیر نمایش داده میشود:
```
USER NOT FOUND
```
در صورتی که کاربر از قبل فعال باشد، پیام زیر نمایش داده میشود:
```
USER WAS ALREADY ACTIVE
```
</details>
<details class="purple">
<summary> **غیرفعال کردن کاربران** </summary>
برای فعال کردن یک کاربر مدیر دستور زیر را وارد میکند:
```
INACTIVE username
```
در صورتی که نام کاربری (username) در سیستم وجود نداشته باشد، پیام زیر نمایش داده میشود:
```
USER NOT FOUND
```
در صورتی که کاربر از قبل غیرفعال باشد، پیام زیر نمایش داده میشود:
```
USER WAS ALREADY INACTIVE
```
</details>
<details class="purple">
<summary> **مشاهده لیست کاربران** </summary>
برای مشاده لیست کاربران مدیر دستور زیر را وارد میکند:
```
LIST ACTIVE/DEACTIVE/(empty)
```
در صورت وارد شدن $ACTIVE$ یا $DEACTIVE$ به ترتیب لیست کاربران فعال یا غیر فعال نمایش داده میشود و در صورت خالی بودن بخش دوم (منظور از empty آمدن دستور $LIST$ به تنهایی است)، لیست تمام کاربران نمایش داده میشود.
لیست کاربران به فرمت زیر نمایش داده میشود:
```
user1
user2
user3
```
لیست کاربران رابه صورت مرتب شده (به ترتیب حروف الفبا) و هر نام کاربری در یک خط جداگانه چاپ کنید.
</details>
</details>
<details>
<summary> **مدیریت غذاها** </summary>
<details class="purple">
<summary> **افزودن غذا** </summary>
برای افزودن غذا به برنامه غذایی مدیر دستور زیر را وارد میکند:
```
ADDFOOD food amount date
```
تعداد موردنظر (amount) باید بزرگتر از $۰$ باشد در غیر این صورت پیام زیر نمایش داده میشود :
```
AMOUNT SHOULD BE BIGGER THAN 0
```
این دستور غذا مورد نظر (food) را با تعداد قابل رزرو مورد نظر (amount) به برنامه روز موردنظر (date) اضافه میکند.
در صورتی که غذای وارد شده از قبل در آن روز وجود داشته باشد، تعداد قابل رزرو جدید به تعداد قبلی افزوده میشود.
</details>
<details class="purple">
<summary> **حذف غذا** </summary>
برای حذف غذا از برنامه غذایی، مدیر دستور زیر را وارد میکند:
```
REMOVEFOOD food date
```
این دستور غذا مورد نظر (food) را از برنامه روز موردنظر (date) حذف میکند.
در صورتی که غذای وارد شده در برنامه آن روز وجود نداشته باشد پیام زیر نمایش داده میشود :
```
FOOD NOT FOUND IN SELECTED DATE
```
در صورتی که شخصی غذای موردنظر را رزرو کرده باشد، مدیر دیگر نمیتواند آن غذا را از لیست حذف کند و پیام زیر نمایش داده میشود :
```
FOOD IS RESERVED AND CAN'T BE REMOVED
```
</details>
<details class="purple">
<summary> **گزارش رزروها** </summary>
برای گزارشگیری از وضعیت غذاهای رزرو شده در بازه زمانی مورد نظر (از تاریخ $startdate$ تا تاریخ $enddate$)، مدیر دستور زیر را وارد میکند:
```
REPORT startdate enddate
```
مقادیر $startdate$ و $enddate$ با فرمت YYYY-MM-DD وارد میشود.
در صورتی که تاریخ شروع (startdate) قبل از (enddate) باشد، پیام زیر نمایش داده میشود :
```
STARTDATE MUST BE BEFORE ENDDATE
```
گزارش به صورت زیر ارائه میشود :
```
date1: food1:amount rserved, food2:amount reserved
date2: food1:amount rserved, food2:amount reserved
.
.
.
```
مقدار $date$ تاریخ و به فرمت YYYY-MM-DD
مقدار $food$ نام غذا
مقدار $amount$ تعداد اولیه تعریف شده غذا
مقدار $reserved$ تعداد رزرو شده غذا
تاریخ هایی که در آنها غذایی وجود ندارد در لیست نمایش داده نمیشوند.
در صورتی که در یک روز بیش از یک غذا وجود داشته باشد نام غذا ها به صورت مرتب شده(به ترتیب حروف الفبا) و با $,$ از هم جدا میشوند.
برای درک بهتر به نمونه زیر توجه کنید:
ورودی
```
REPORT 2024-10-19 2024-10-23
```
خروجی
```
2024-10-19: GhormeSabzi:50 30
2024-10-20: AdasPolo:40 15, ZereshkPolo:20 10
2024-10-23: Fesenjoon:25 5
```
در مثال فوق، در تاریخ ۱۹م از ۵۰ پرس قورمهسبزی، ۳۰ پرس رزرو شده است.در تاریخ ۲۰م دو غذا با مقادیر اولیه و تعداد رزرو متفاوت وجود دارد، و در تاریخ ۲۳م تنها فسنجون ارائه شده است.
</details>
</details>
</details>
مدیر برای ورود از دستور ورود که در بخش کاربران آورده شده با نام کاربری و کلمه عبور زیر استفاده میکند.
```
username : admin
password : admin
```
در صورتی که کاربر ساده دستورات مربوط به بخش مدیر را وارد کند یا مدیر دستورات مربوط به کاربر(مشاهده برنامه غذایی و رزرو) را وارد کند، پیام زیر نمایش داده میشود:
```
ACCESS DENIED
```
# ورودی
در خط اول عدد صحیح $n$ وارد میشود که بیانگر تعداد دستورات است.
در $n$ خط بعدی دستورات به نحوی که در بالا توضیح داده شده است وارد میشود.
# خروجی
خروجی هر دستور در بخش توضیحات آن دستور آورده شده.
# مثال
## ورودی نمونه ۱
```
10
REGISTER reza 1234Reza!
LOGIN admin admin
LIST DEACTIVE
ACTIVE reza
ADDFOOD GhormeSabzi 50 2024-10-27
LOGOUT
LOGIN reza 1234Reza!
MENU 2024-10-25 2024-10-28
RESERVE 2024-10-27 GhormeSabzi
LOGOUT
```
## خروجی نمونه ۱
```
reza REGISTERED SUCCESSFULLY
admin LOGGEDIN SUCCESSFULLY
reza
LOGGEDOUT SUCCESSFULLY
reza LOGGEDIN SUCCESSFULLY
2024-10-27: GhormeSabzi:50
SUCCESSFULLY RESERVED
LOGGEDOUT SUCCESSFULLY
```