You are on page 1of 20

Discrete Event Simulation using Promodel Discrete event simulation is the imitation of a dynamic system using computer model

in order to evaluate and improve system performance. Simulation provides a virtual method for doing system experimentation. Typical applications of simulation include: Work-flow planning Capacity planning Cycle time reduction Staff and resource planning Bottleneck analysis Inventory reduction Throughput analysis Cost reduction Productivity improvement Production scheduling Line balancing Batch size optimization Layout analysis Maintenance scheduling

Simulation analysis is appropriate if the following hold: Decisions are operational in nature Process is well defined and repetitive in nature Activities and events are interdependent and variable The cost of simulation analysis does not exceed potential cost reduction Cost of simulation analysis does not exceed experimentation on the actual system Benefits of Simulation approach Captures system interdependencies Accounts for variability in the process Is versatile enough to model both manufacturing and service processes Shows behavior over time Is less costly, time consuming, and disruptive than experimenting on the actual system Provides information on multiple performance measures Provides results that are easy to understand and communicate Runs in compressed time Forces attention to detail in a process

Simulation procedure Step 1: Define objective, scope, and requirements Step 2: Collect and analyze system data Step 3: Build and validate model Step 4: Conduct experiments Step 5: Analyze results and develop recommendations

Simulation system elements Entities, activities, resources, and controls. Entities Items processed through the system

Human/animate (customers, patients, passenger, etc.) Inanimate (Parts, documents, etc.) Intangible (calls, e-mail, etc.) Activities Tasks performed in the system Entity processing (check-in, treatment, either directly or indirectly on the inspection, fabrication, etc.) entities. Activities consume time Entity/resource movement (ride elevator, and use resources forklift travel, etc.) Resource adjustment (Machine setups) Maintenance & repair Resources May be required for performing Human/animate (operator, doctors, etc.) activities. Have characteristics Inanimate (equipment, tooling, etc.) such as, capacity, speed, cycle Intangible (information, power, etc.) time, reliability, etc. Controls Controls how, when, and where Production routing sequence activities are performed Work schedules Task prioritization System variability Type of variability Activity times Event arrivals Quantities Decisions Random behavior Discrete distribution Continuous distribution System variables Decision variables Independent variable Response variables Examples Service time, repair time Time between customer arrivals, time between failure Order quantity, batch size, number of workers absent Customer routing, accept/reject part, join queue Finite number of possible values (number of items in a lot, number of members in a group, etc. A range of values such as a time between arrivals, service time, travel distance, etc. Controllable variables, such as number of machines, number of windows Service time, processing time Variables that measure the system performance (metrics)

System performance metrics (Response variables) Flow time Average time it takes for an entity to be processed through the system Utilization Percentage of time resources are in productive use Waiting time Time spent waiting Queue/inventory levels Number of customers waiting or parts in storage Throughput Number of customers served, no. of parts produced

Promodel objects Object Entities Description Anything the model can process, such as parts, customers, patients. Fixed place where entities are routed for processing, waiting, decision making, or some other activity. Arrival parameters for the entities Important parameters Creating a record With New checked, click a graphic . Capacity and number of units With New checked, click a graphic icon and click anywhere in the layout. For a waiting line double click the icon, change object type to Queue and set other parameters.

Locations

Arrival

Processing Process routing for an entity

Arrival location, Click header Entity and select number of objects the arrival entity. per arrival, total Click header Location and number of select the location for arrival. arrivals, frequency Type INF for Occurrences indicating no limit for number of arrivals during the simulation. Enter inter-arrival time parameter for Frequency. E.g. for exponential time with mean 2 minutes, enter e(2) min. Process Click header Entity and select Entity, Location, an entity for processing. and operation Click header Location and select a location. Click header Operation and type operation logic. E.g.: wait N(2.4,.5) min Routing Click header Output and Output, select an entity for output Destination, Rule Click header Destination and select a location Click header Rule and set up one or more rules for routing the entity. Click below the last row to create alternative routing

Example 1: Bank with one teller; Arrival of customers follows exponential distribution with an average of one customer every 2 minutes. Service time follows normal distribution with an average of 2.4 minutes and a standard deviation of .5 minutes. Waiting line is limited to 7 customers. Simulate the operation from 11 a.m. to 1 p.m. Let the warm-up period be 2 hours. Flowchart
Arrival Entity = Customer Frequency = e(2) min Routing First 1 Teller Window Units = 1, Capacity = 1 Service time: N(2.4,.5) min Exit

Teller Waiting Line FIFO, Capacity = 7

Entity record:

Location records

If the location is a queue, change Queuing for output to FIFO under the Rules tab. Arrival record

Process and Routing

Routing for Customer from Teller_Waiting_Line

Routing for Customer from Teller

Command: File/View text or File/Print Text


******************************************************************************** * Formatted Listing of Model: * * P:\public_html\583\Notes\ProModel\Models\BankTeller-1.MOD * ******************************************************************************** * Locations * ******************************************************************************** Name Cap Units Stats Rules Cost ------------------- --- ----- ----------- --------------- -----------Teller_Waiting_Line 7 1 Time Series Oldest, FIFO, Teller_Window 1 1 Time Series Oldest, , First ******************************************************************************** * Entities * ******************************************************************************** Name Speed (fpm) Stats Cost ---------- ------------ ----------- -----------Customer 150 Time Series ******************************************************************************** * Processing * ******************************************************************************** Process Routing Entity -------Customer Customer Location Operation ------------------- -----------------Teller_Waiting_Line Teller_Window Wait N(2.4,.5) min Blk Output Destination Rule ---- -------- ------------- ------1 Customer Teller_Window FIRST 1 1 Customer EXIT FIRST 1 Move Logic ------------

******************************************************************************** * Arrivals * ******************************************************************************** Entity Location Qty Each First Time Occurrences Frequency Logic -------- ------------------- ---------- ---------- ----------- ---------- -----------Customer Teller_Waiting_Line 1 INF e(2) min

Simulation options

Results: Locations
Name Teller Waiting Line Teller Window Scheduled Time (HR) 2 2 Capacity 7 1 Total Entries 54.23 50.20 Avg Time Per Entry (MIN) 10.43 2.35 Avg Contents 4.72 0.98 Maximum Contents 7 1 Current Contents 5.03 0.97 % Utilization 67.49 98.30

Results: Location state Multi


Name Teller Waiting Line Scheduled Time (HR) 2 % Empty 4.66 % Part Occupied 78.10 % Full 17.24 % Down 0

Results: Location state Single


Name Teller Window Scheduled Time (HR) 2 % Operation 98.30 % Setup 0 % Idle 1.70 % Waiting 0 % Blocked 0 % Down 0

Results: Failed arrivals


Entity Name Customer Location Name Teller Waiting Line Total Failed 9.6

Results: Entity Activity


Name Customer Total Exits 49.23 Current Qty In System 6 Avg Time In System (MIN) 13.80 Avg Time In Move Logic (MIN) 0.00 Avg Time Waiting (MIN) 9.09 Avg Time In Operation (MIN) 2.40 Avg Time Blocked (MIN) 2.32

Results: Entity States


Name Customer % In Move Logic 0 % Waiting 65.0 % In Operation 17.9 % Blocked 17.2

Summary of average results: Lobby Total number of customers served = Average wait time for exited customers (minutes) = Average length of waiting line = Average wait time for all customers including ones still in the bank (minutes) = % of time waiting line is empty = % of time waiting line is full = Utilization of teller windows 49.23 9.09 + 2.32 = 11.41 minutes 4.72 customers 10.43 minutes 4.66% 17.24% 98.3%

Service Level Total customer arrivals = Total entries at the waiting line + Failed arrivals = 54.23 + 9.60 = 63.83 Service level = Total entries at the waiting line /Total customer arrivals = (54.23/63.83) x 100 = 84.96% Example 2: Same bank as before, but with two tellers and 40% of arriving customers first sit at a desk and fill out forms. Time to fill forms takes between 2.5 and 5.5 minutes. Assume total customers in the bank cannot exceed 13. Flowchart
Arrival Entity = Customer Frequency = e(2) min
Door Capacity

p = .4 =1 p = .6

Desk Capacity = 3 Service time: U(4,1.5) min Routing First 1 Teller_Waiting_Line FIFO, Capacity = 7 Routing First 1 Teller_Window Units = 2, Capacity = 1 Service time: N(2.4,.5)

Exit

******************************************************************************** * Locations * ******************************************************************************** Name Cap Units Stats Rules Cost ------------------- --- ----- ----------- --------------- -----------Door 1 1 Time Series Oldest, , Desks 3 1 Time Series Oldest, , First Teller_Waiting_Line 7 1 Time Series Oldest, FIFO, Teller_Window 1 2 Time Series Oldest, , First Teller_Window.1 1 1 Time Series Oldest, , Teller_Window.2 1 1 Time Series Oldest, , ******************************************************************************** * Entities * ******************************************************************************** Name Speed (fpm) Stats Cost ---------- ------------ ----------- -----------Customer 150 Time Series ******************************************************************************** * Processing * ********************************************************************************
Process Entity Location Operation -------- ------------------- -----------------Customer Door Customer Desks WAIT U(4, 1.5) min Blk Output ---- -------1 Customer Customer 1 1 1 Routing Destination ------------------Teller_Waiting_Line Desks Rule ---------0.600000 1 0.400000 Move Logic ------------

Customer Teller_Waiting_Line Customer Teller_Window Wait N(2.4,.5) min

Customer Teller_Waiting_Line FIRST 1 Customer Teller_Window FIRST 1 Customer EXIT FIRST 1

******************************************************************************** * Arrivals * ******************************************************************************** Entity Location Qty Each First Time Occurrences Frequency Logic -------- -------- ---------- ---------- ----------- ---------- -----------Customer Door 1 0 INF e(2) min

Results: Locations
Name Door Desks Teller Waiting Line Teller Window.1 Teller Window.2 Teller Window Scheduled Time (HR) 2 2 2 2 2 4 Capacity 1 3 7 1 1 2 Total Entries 61.43 26.50 61.50 34.90 27.47 62.37 Avg Time Per Entry (MIN) 0.02 3.85 0.70 2.34 2.36 2.35 Avg Contents 0.01 0.85 0.38 0.68 0.54 0.61 Maximum Contents 1.00 3.00 3.53 1.00 1.00 2.00 Current Contents 0.00 0.93 0.20 0.70 0.47 1.17 % Utilization 0.86 28.32 5.38 68.00 54.04 61.02

Results: Location state Multi


Name Desks Teller Waiting Line Scheduled Time (HR) 2 2 % Empty 42.68 77.33 % Part Occupied 51.68 22.67 % Full 5.64 0.00 % Down 0.00 0.00

Results: Location state Single


Name Door Teller Window.1 Teller Window.2 Teller Window Scheduled Time (HR) 2 2 2 4 % Operation 0 68.00 54.04 61.02 % Setup 0 0 0 0 % Idle 99.14 32.00 45.96 38.98 % Waiting 0 0 0 0 % Blocked 0.86 0 0 0 % Down 0 0 0 0

Results: Failed arrivals


Entity Name Customer Location Name Door Total Failed 0.6

Results: Entity Activity


Name Customer Total Exits 61.20 Current Qty In System 2.30 Avg Time In System (MIN) 4.76 Avg Time In Move Logic (MIN) 0.00 Avg Time Waiting (MIN) 0.27 Avg Time In Operation (MIN) 4.05 Avg Time Blocked (MIN) 0.44

Results: Entity States


Name Customer % In Move Logic 0 % Waiting 5.35 % In Operation 85.59 % Blocked 9.05

Summary of average results: Lobby Total number of customers served = Average wait time for exited customers (minutes) = Average length of waiting line = Average wait time for all customers including ones still in the bank (minutes) = % of time waiting line is empty = 61.20 0.27 + 0.44 = 0.71 minutes 0.38 customers 0.70 + 0.02 = 0.72 minutes 77.33%

% of time waiting line is full = % of time desks are empty = % of time desks are full = Utilization of teller windows: Window # 1 = 68.0%, Window #2 = 54.04%, Overall = 61.02% Service Level Total customer arrivals = Total entries at the door + Failed arrivals = 61.43 + 0.60 = 62.03 Service level = Total entries at the door/Total customer arrivals = (61.43/62.03) x 100 = 99.0%

0% 42.68% 5.64%

Example 3: Same bank as in example 2, but with an ATM and a drive-thru window. The waiting line for ATM is limited to 3 customers. For customers arriving at the lobby, assume 40%-40%20% for customer directly joining the queue, sit down to fill forms and joining the ATM waiting line, respectively. The time to complete the ATM transaction follows normal distribution with mean = 2 minutes, and standard deviation =.5 minutes. For the drive-through line, cars arrive according to exponential distribution with a mean of 5 minutes. Service time for drive-thru window is triangular with minimum of 1 minutes, mode of 2 minutes and maximum of 5 minutes. There are only two tellers serving the two teller windows inside the lobby of the bank and the drive-through window. Also, assume only three cars can wait in line for drive-thru service. In addition to other statistics, track the number of customers in the bank also. Flowchart
Arrival 1 Entity = Customer Frequency = e(2) min Increment Customers_in_bank
Door Capacity

p = .4 =1 p = .2
ATM_Line FIFO, Capacity = 3 ATM Units=1, Capacity =1 Service time: N(2,.5) min

p = .4

Desk Capacity = 3 Service time: U(4,1.5) min Routing First 1 Teller_Waiting_Line FIFO, Capacity = 7 Routing First 1 Teller_Window Units = 2, Capacity = 1 Service time: N(2.4,.5) min

Exit
Decrement Customers_in_bank

Exit
Decrement Customers_in_bank

Arrival 2 Entity = Car Frequency = e(5) min

Resources Shared_Teller = 2 units


DriveThru_Line FIFO, Capacity =3

DriveThru_Window Units = 1, Capacity = 1 Service time: T(1,2,5) min

Exit

******************************************************************************** * Locations * ******************************************************************************** Name ------------------Door Desk Teller_Waiting_Line Teller_window Teller_window.1 Teller_window.2 ATM_Line ATM DriveThru_Line DriveThru_Window Cap --1 3 7 1 1 1 3 1 3 1 Units ----1 1 1 2 1 1 1 1 1 1 Stats ----------Time Series Time Series Time Series Time Series Time Series Time Series Time Series Time Series Time Series Time Series Rules Cost --------------- -----------Oldest, , Oldest, , First Oldest, FIFO, Oldest, , First Oldest, , Oldest, , Oldest, FIFO, Oldest, , Oldest, FIFO, Oldest, ,

******************************************************************************** * Entities * ******************************************************************************** Name Speed (fpm) Stats Cost ---------- ------------ ----------- -----------Customer 150 Time Series Car 150 Time Series ******************************************************************************** * Resources * ******************************************************************************** Res Ent Name Units Stats Search Search Path Motion Cost ------------- ----- -------- ------ ------ ---------- -------------- -----------Shared_Teller 2 By Unit None Oldest Empty: 150 fpm Full: 150 fpm ******************************************************************************** * Processing * ********************************************************************************
Process Entity Location Operation Blk Output -------- ------------------- --------------------- -------Customer Door Inc Customer_In_Bank 1 Customer Customer Customer Customer Desk WAIT U(4, 1.5) min 1 Customer Customer Teller_Waiting_Line 1 Customer Customer Teller_window GET 1 Shared_Teller Wait N(2.4,.5) min FREE 1 Shared_Teller Dec Customer_In_Bank 1 Customer Customer ATM_Line 1 Customer Customer ATM Wait N(2,.5) min 1 Customer Dec Customer_In_Bank Car DriveThru_Line 1 Car Car DriveThru_Window Get 1 Shared_Teller WAIT T(1,2,5) min Free 1 Shared_Teller 1 Car Routing Destination Rule ------------------- ---------Teller_Waiting_Line 0.400000 1 Desk 0.400000 ATM_Line 0.200000 Teller_Waiting_Line FIRST 1 Teller_window FIRST 1 Move Logic ------------

EXIT ATM EXIT DriveThru_Window

FIRST 1 FIRST 1 FIRST 1 FIRST 1

EXIT

FIRST 1

******************************************************************************** * Arrivals * ******************************************************************************** Entity Location Qty Each First Time Occurrences Frequency Logic -------- -------------- ---------- ---------- ----------- ---------- -----------Customer Door 1 0 INF e(2) min Car DriveThru_Line 1 0 INF e(5) min ******************************************************************************** * Variables (global) * ******************************************************************************** ID Type Initial value Stats ---------------- ------------ ------------- ----------Customers_In_Bank Integer 0 Time Series

Results: Locations
Name Door Desk Teller Waiting Line Teller window.1 Teller window.2 Teller window ATM Line ATM DriveThru Line DriveThru Window Scheduled Time (HR) 2 2 2 2 2 4 2 2 2 2 Capacity 1 3 7 1 1 2 3 1 3 1 Total Entries 60.03 24.53 48.53 27.97 21.40 49.37 11.50 11.70 23.37 23.57 Avg Time Per Entry (MIN) 0.01 3.84 1.09 2.77 2.90 2.82 0.22 2.00 2.07 3.00 Avg Contents 0.01 0.78 0.47 0.64 0.52 0.58 0.03 0.19 0.44 0.59 Maximum Contents 1.00 2.93 3.60 1.00 1.00 2.00 1.23 1.00 2.47 1.00 Current Contents 0.03 1.10 0.20 0.57 0.43 1.00 0.00 0.10 0.43 0.70 % Utilization 0.63 26.14 6.69 64.46 51.99 58.22 0.87 19.40 14.80 59.23

Results: Location state Multi


Name Desk Teller Waiting Line ATM Line DriveThru Line Scheduled Time (HR) 2 2 2 2 % Empty 44.96 76.46 97.80 71.30 % Part Occupied 50.33 23.06 2.10 25.31 % Full 4.71 0.48 0.09 3.39 % Down 0 0 0 0

Results: Location state Single


Name Door Teller window.1 Teller window.2 Teller window ATM DriveThru Window Scheduled Time (HR) 2 2 2 4 2 2 % Operation 0.00 55.30 41.64 48.47 19.40 50.83 % Setup 0.00 0.00 0.00 0.00 0.00 0.00 % Idle 99.37 35.54 48.01 41.78 80.60 40.77 % Waiting 0.00 9.16 10.36 9.76 0.00 8.40 % Blocked 0.63 0.00 0.00 0.00 0.00 0.00 % Down 0 0 0 0 0 0

Results: Resources
Name Shared Teller.1 Shared Teller.2 Shared Teller Units 1 1 2 Scheduled Time (HR) 2 2 4 Number Times Used 36.03 36.57 72.60 Avg Time Per Usage (MIN) 2.46 2.44 2.44 % Utilization 73.76 74.00 73.88

Results: Resources states


Name Shared Teller.1 Shared Teller.2 Shared Teller Scheduled Time (HR) 2 2 4 % In Use 73.76 74.00 73.88 % Idle 26.24 26.00 26.12 % Down 0 0 0

Results: Failed arrivals


Entity Name Customer Car Location Name Door DriveThru Line Total Failed 0.4 1

Results: Entity Activity


Name Customer Car Total Exits 59.97 22.87 Current Qty In System 2.43 1.13 Avg Time In System (MIN) 5.25 5.21 Avg Time In Move Logic (MIN) 0.00 0.00 Avg Time Waiting (MIN) 0.83 1.15 Avg Time In Operation (MIN) 3.90 2.66 Avg Time Blocked (MIN) 0.52 1.40

Results: Entity States


Name Customer Car % In Move Logic 0 0 % Waiting 13.87 19.34 % In Operation 76.58 55.43 % Blocked 9.55 25.23

Results: Variables
Name Customers In Bank Total Changes 120 Avg Time Per Change (MIN) 1.00 Minimum Value 0.00 Maximum Value 7.27 Current Value 2.43 Avg Value 2.64

Summary of average results:


Lobby Total number of customers served = Total number of customers in the bank (Lobby +ATM) Average wait time for exited customers (minutes) = Average length of waiting line Average wait time for all customers including ones still in the bank (minutes) = % of time waiting line is empty = % of time waiting line is full = % of time desks are empty = % of time desks are full = Utilization of tellers (Overall) Teller 1 Teller 2 59.97 2.64 0.83 + 0.52 = 1.35 0.47 .01 + 1.09 = 1.10 76.46% 0.48% 44.96% 4.71% 73.88% 73.76% 74.00% ATM 0.44 .01 + .22 = .23 97.80% 0.09% Cars 22.87 1.15 + 1.40 = 2.55 0.03 2.07 71.30% 3.39%

Service level: Total customer arrivals = Total entries at the door + Failed arrivals = i.e. = 60.03 + 0.40 = 60.43 Service level = Total entries at the door /Total customer arrivals = (60.03/60.43) x 100 = 99.3% Total car arrivals = Total entries at the drive-through line + failed car arrivals = 23.37 + 1.00 = 24.37 Service level for car arrivals = (23.37/24.37) x 100 = 95.90%

Lobby operation comparison


Summary of average results:
Bank 1 Total number of customers served = Average wait time for exited customers (minutes) = Average length of waiting line Average wait time for all customers including ones still in the bank (minutes) = % of time waiting line is empty = % of time waiting line is full = % of time desks are empty = % of time desks are full = Utilization of tellers (Overall) Teller 1 Teller 2 Service level (% customer able to enter) 49.23 11.41 4.72 10.43 4.66% 17.24% 98.3% 84.96% Bank 2 61.20 0.71 0.38 0.72 77.33% 0% 42.68% 5.64% 61.02% 68.00% 54.04% 99% Bank 3 59.97 + 22.87 cars 1.35 0.47 1.10 76.46% 0.48% 44.96% 4.71% 73.88% 73.76% 74.00% 99.3% (walk-in) & 95.90% (cars)

Example 4: Consider the same bank as in example 3. Suppose that 20% of the arriving customers are business customers, and the remaining 80% are regular customers. Also, assume that the service time for business customers will be according to exponential distribution with a mean of 20 minutes and no change in service time for the regular customers. Changes needed: 1. Define an entity Attribute for Customer Type 2. Define a User-defined distribution for the probability of customer type 3. Stamp each customer arrival with the Customer type attribute 4. Code the service time at teller window using Customer Type attribute 1. Define an entity Attribute for Customer Type

2. Define a User-defined distribution for the probability of customer type

Value = 1 represents business customer Value = 2 represents regular customer

3. Stamp each customer arrival with the Customer type attribute in the Arrival Table

4. Code the service time in the Process Table at the Teller window location using Customer Type attribute

Code for service time for the two customer types

Routing Rule Dialog Box


The Routing Rule dialog box provides methods for selecting an entity's destination after finishing a process. The Rule heading button in the Routing edit table, brings up the Routing Rule dialog box. The fields of this dialog box are defined in the following example.

Start new block Check this box to signal the beginning of a new routing block. Checking this box will place a number in the Blk field for that record. First Available By turn Until full Probability User condition Most available Random Longest Unoccupied If Send If Join Request Routing is to the first available location in the order they are listed. Routing rotates through the locations in the list. Routing is to a single location until it is full; then it is switched to the next location, and so on. Routing is according to the given probabilities. Routing is based on the condition provided. Routing is to the location with most available capacity. Routing is at random. Routing is to the location that was unoccupied the longest. Routed based on a SEND request from a location to the destination location. Selects a location whenever a JOIN request is issued at that location. Entities routed with the JOIN routing rule are not actually sent to their destination until a JOIN statement is encountered at the destination location.

Advanced commands Three commands for using and releasing resources: Get/Free Syntax samples
GET GET GET GET GET {<quantity>} <resource> {,<priority>} {AND or OR {quantity} <resource> {,<priority>}...} Res1 3 Res1, 5 2 Res1OR 3 Res2 Res1, 3 AND (Res2 OR Res3)

Description: Captures a specified number of resources as they become available. A resource captured with the GET statement is released with a FREE statement. Every GET must have a corresponding FREE or an error occurs when the entity exits the system. Use Syntax samples USE {<quantity>} <resource> {,<priority>} FOR <time> {AND or OR {<quantity>} <resource> {,<priority>} FOR <time>... } USE 2 Res2, 5 FOR 4:23:03 USE 2 Res1 FOR 2.0 min OR 3 Res2 FOR 1.5 min USE Res1, 3 FOR 1 hr AND (Res2 FOR 5 OR Res3 FOR 5) Description: Captures a resource or combination of resources as each resource becomes available. Once the resource has been captured it is used for the specified amount of time, and then freed when the specified duration is over. Jointly Get/Free ALL Syntax samples JOINTLY GET {<quantity>} <resource> {,<priority>} {AND or OR {<quantity>} <resource> {,<priority>}} JOINTLY GET 3 Res1,5 JOINTLY GET 2 Res1 OR 3 Res2 JOINTLY GET Res1,3 AND (Res2 OR Res3) Description: Captures a specified number of resources when that number of resources is available. When capturing multiple resources, none of the resources will be captured until all are available. The command Free ALL can be used to free all the resources.

You might also like