ABC, a major technological company, is facing supply chain disruptions due to the COVID-19 pandemic. They need to analyze the relationship between ODM sites, ship modes, and logistics lead times to mitigate risks. ABC operates with multiple ODMs, shipping modes, and warehouses. The pandemic has caused uncertainty in lead times, leading to early or late deliveries. This makes it challenging for ABC to set accurate expectations for customers. The project focuses on data preparation and exploration to understand supply chain dynamics and make informed decisions. The goal is to reduce lead times and maintain a competitive edge. In this project, the focus is on data preparation and exploration to gain insights into the relationship between ODM sites, ship modes, and logistics lead times. The analysis aims to help ABC mitigate risks and make informed decisions regarding supply chain management.

Programming 1a

Read Raw-Data and Calendar worksheets from RawData.xlsx

## # A tibble: 9,124 × 6
##    LOB       Origin `Ship Mode` `PO Download Date`  `Ship Date`        
##    <chr>     <chr>  <chr>       <dttm>              <dttm>             
##  1 Product B Site C AIR         2020-07-25 00:00:00 2020-07-29 00:00:00
##  2 Product B Site B OCEAN       2020-06-20 00:00:00 2020-07-01 00:00:00
##  3 Product B Site C AIR         2020-01-25 00:00:00 2020-02-01 00:00:00
##  4 Product B Site C AIR         2020-07-18 00:00:00 2020-07-24 00:00:00
##  5 Product A Site A OCEAN       2020-05-01 00:00:00 2020-05-27 00:00:00
##  6 Product C Site A AIR         2020-01-11 00:00:00 2020-01-31 00:00:00
##  7 Product A Site A AIR         2020-07-16 00:00:00 2020-07-25 00:00:00
##  8 Product B Site D GROUND      2020-07-28 00:00:00 2020-07-31 00:00:00
##  9 Product B Site C AIR         2020-03-28 00:00:00 2020-04-07 00:00:00
## 10 Product B Site D GROUND      2020-01-24 00:00:00 2020-01-30 00:00:00
## # ℹ 9,114 more rows
## # ℹ 1 more variable: `Receipt Date` <dttm>
## # A tibble: 6 × 5
##    S.No Start_Date          End_date            Quarter  Year
##   <dbl> <dttm>              <dttm>              <chr>   <dbl>
## 1     1 2019-08-03 00:00:00 2019-11-01 00:00:00 Q3       2019
## 2     2 2019-11-02 00:00:00 2020-01-31 00:00:00 Q4       2019
## 3     3 2020-02-01 00:00:00 2020-05-01 00:00:00 Q1       2020
## 4     4 2020-05-02 00:00:00 2020-07-31 00:00:00 Q2       2020
## 5     5 2020-08-01 00:00:00 2020-10-30 00:00:00 Q3       2020
## 6     6 2020-10-31 00:00:00 2021-01-29 00:00:00 Q4       2020

Programming 1b

Adding Quarter and Year columns to the Raw-Data sheet by matching Receipt Date that in the date ranges of Calendar sheet

## # A tibble: 6 × 8
##   LOB   Origin `Ship Mode` `PO Download Date` `Ship Date` `Receipt Date` Quarter
##   <chr> <chr>  <chr>       <date>             <date>      <date>         <chr>  
## 1 Prod… Site C AIR         2020-07-25         2020-07-29  2020-08-05     Q3     
## 2 Prod… Site B OCEAN       2020-06-20         2020-07-01  2020-07-28     Q2     
## 3 Prod… Site C AIR         2020-01-25         2020-02-01  2020-02-11     Q1     
## 4 Prod… Site C AIR         2020-07-18         2020-07-24  2020-08-01     Q3     
## 5 Prod… Site A OCEAN       2020-05-01         2020-05-27  2020-07-08     Q2     
## 6 Prod… Site A AIR         2020-01-11         2020-01-31  2020-02-03     Q1     
## # ℹ 1 more variable: Year <dbl>

Programming 1c

Calculate In-transit Lead Time and Manufacturing Lead Time for each row in the joined dataset

## # A tibble: 6 × 10
##   LOB   Origin `Ship Mode` `PO Download Date` `Ship Date` `Receipt Date` Quarter
##   <chr> <chr>  <chr>       <date>             <date>      <date>         <chr>  
## 1 Prod… Site C AIR         2020-07-25         2020-07-29  2020-08-05     Q3     
## 2 Prod… Site B OCEAN       2020-06-20         2020-07-01  2020-07-28     Q2     
## 3 Prod… Site C AIR         2020-01-25         2020-02-01  2020-02-11     Q1     
## 4 Prod… Site C AIR         2020-07-18         2020-07-24  2020-08-01     Q3     
## 5 Prod… Site A OCEAN       2020-05-01         2020-05-27  2020-07-08     Q2     
## 6 Prod… Site A AIR         2020-01-11         2020-01-31  2020-02-03     Q1     
## # ℹ 3 more variables: Year <dbl>, `In-transit Lead Time` <dbl>,
## #   `Manufacturing Lead Time` <dbl>

As we can see from the data frame, there are some unusual values (negative values, and over 100 days), and missing values of In-transit Lead Time and Manufacturing Lead Time

##   [1]    7   27   10    8   42    3    6    5    9   19   23   12    4   17   50
##  [16]   39   25   20   21    2   48   31   29   11   26   34   43    1   22   37
##  [31]   32   30   24   28   33   15   57   NA   18   16   14   59   44   35   52
##  [46]   40   38   41   13   36    0   55   45   47   58   54   46   53   71   56
##  [61] -167 -190 -221 -225 -235 -136 -201 -116 -205 -121 -129 -182 -200 -219 -217
##  [76] -109 -171 -159 -107 -120 -104 -142 -202 -150 -189 -187 -203 -164 -191 -208
##  [91] -173 -186 -125 -108 -168 -147 -175 -197 -162 -115 -153 -113  -87 -138 -185
## [106] -124 -212  -84 -184 -137 -135 -117 -183 -148 -141 -132 -207 -111 -122 -130
## [121] -176 -211 -112 -152 -133 -174  -88  -94 -118 -218   49   64   85   86   51
## [136]   70   67   63
##   [1]   4  11   7   6  26  20   9   3  10   2   5  12  15   8  16  25  18  24
##  [19]   1  30  14  13  34  31  19   0  NA -19 -14 -20 -21 -16 -15 -13 -18  -6
##  [37] -17 -12  -1 -28 -10  -4  -9 -24 -22 -26  -7 -11  -5  -2 -25  -8  -3 -23
##  [55] -27 172 215 222 226 237 140 204 141 216 132 123 178 224 231 105 185 106
##  [73] 113 111 234 201 213 197 189 203 227 179 187 119 175 143 198 159 117 155
##  [91] 125 137 170 162 208 120 212 174 144 180 147 156 184 181 115 127 220 122
## [109] 176 195 217 202 135 173 200 110 138 116  32  23  22  17  29  50  39  27
## [127]  35  33  49  43  28  36  51  37  21  48  41  45
## [1] 145
## [1] 145

Programming 1d/e

Cleaning data. Delete the NAs values and Impute new values for all other unusual values

## # A tibble: 6 × 10
##   LOB   Origin `Ship Mode` `PO Download Date` `Ship Date` `Receipt Date` Quarter
##   <chr> <chr>  <chr>       <date>             <date>      <date>         <chr>  
## 1 Prod… Site C AIR         2020-07-25         2020-07-29  2020-08-05     Q3     
## 2 Prod… Site B OCEAN       2020-06-20         2020-07-01  2020-07-28     Q2     
## 3 Prod… Site C AIR         2020-01-25         2020-02-01  2020-02-11     Q1     
## 4 Prod… Site C AIR         2020-07-18         2020-07-24  2020-08-01     Q3     
## 5 Prod… Site A OCEAN       2020-05-01         2020-05-27  2020-07-08     Q2     
## 6 Prod… Site A AIR         2020-01-11         2020-01-31  2020-02-03     Q1     
## # ℹ 3 more variables: Year <dbl>, `In-transit Lead Time` <dbl>,
## #   `Manufacturing Lead Time` <dbl>

Now, NAs values and unusual values are not included in my dataset clean_raw_data

Programming 1f

Exploring the columns In-transit Lead Time and Manufacturing Lead Time

## # A tibble: 4 × 3
##   `Ship Mode` avg_Intransit_lead_time avg_manufacturing_lead_time
##   <chr>                         <dbl>                       <dbl>
## 1 OCEAN                         29.9                        12.1 
## 2 FASTBOAT                      26.0                         9.45
## 3 AIR                            8.39                        5.87
## 4 GROUND                         3.77                        6.05

We can see the outliers of the In-transit Lead Time, also shipped by OCEAN took the longest days

Programming 1g

Calculate and report correlations between all variables.

##    Ship Mode      Quarter          LOB       Origin 
##  0.508419525  0.269427191  0.009724228 -0.508065586

We can see the Ship Mode has the most relative to In-transit Lead Time

Use the lm() function to perform a multiple linear regression with In-transit Lead Time as the response and all other variables as the predictors. Use the summary() function to print the results

## 
## Call:
## lm(formula = `In-transit Lead Time` ~ ., data = num_raw_data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -35.921  -3.885  -1.823   3.870  50.079 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  7.03731    0.28818   24.42   <2e-16 ***
## LOB          7.74209    0.18987   40.78   <2e-16 ***
## Origin      -8.17025    0.07637 -106.98   <2e-16 ***
## `Ship Mode`  5.43146    0.06466   84.00   <2e-16 ***
## Quarter     -0.15587    0.10602   -1.47    0.142    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 6.859 on 8974 degrees of freedom
## Multiple R-squared:  0.6936, Adjusted R-squared:  0.6934 
## F-statistic:  5078 on 4 and 8974 DF,  p-value: < 2.2e-16

There is a relationship between predictors and the response variable by a p-value < 0.05. Thus, LOB, Origin, and Ship Mode have a statistically significant relationship with In-transit Lead Time

LS0tDQp0aXRsZTogIkZpbmFsIFByb2plY3QiDQphdXRob3I6ICJUaWVuIFZvIg0KZGF0ZTogImByIFN5cy5EYXRlKClgIg0Kb3V0cHV0OiBvcGVuaW50cm86OmxhYl9yZXBvcnQNCi0tLQ0KDQpBQkMsIGEgbWFqb3IgdGVjaG5vbG9naWNhbCBjb21wYW55LCBpcyBmYWNpbmcgc3VwcGx5IGNoYWluIGRpc3J1cHRpb25zIGR1ZSB0byB0aGUgQ09WSUQtMTkgcGFuZGVtaWMuIFRoZXkgbmVlZCB0byBhbmFseXplIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBPRE0gc2l0ZXMsIHNoaXAgbW9kZXMsIGFuZCBsb2dpc3RpY3MgbGVhZCB0aW1lcyB0byBtaXRpZ2F0ZSByaXNrcy4gQUJDIG9wZXJhdGVzIHdpdGggbXVsdGlwbGUgT0RNcywgc2hpcHBpbmcgbW9kZXMsIGFuZCB3YXJlaG91c2VzLiBUaGUgcGFuZGVtaWMgaGFzIGNhdXNlZCB1bmNlcnRhaW50eSBpbiBsZWFkIHRpbWVzLCBsZWFkaW5nIHRvIGVhcmx5IG9yIGxhdGUgZGVsaXZlcmllcy4gVGhpcyBtYWtlcyBpdCBjaGFsbGVuZ2luZyBmb3IgQUJDIHRvIHNldCBhY2N1cmF0ZSBleHBlY3RhdGlvbnMgZm9yIGN1c3RvbWVycy4gVGhlIHByb2plY3QgZm9jdXNlcyBvbiBkYXRhIHByZXBhcmF0aW9uIGFuZCBleHBsb3JhdGlvbiB0byB1bmRlcnN0YW5kIHN1cHBseSBjaGFpbiBkeW5hbWljcyBhbmQgbWFrZSBpbmZvcm1lZCBkZWNpc2lvbnMuIFRoZSBnb2FsIGlzIHRvIHJlZHVjZSBsZWFkIHRpbWVzIGFuZCBtYWludGFpbiBhIGNvbXBldGl0aXZlIGVkZ2UuIEluIHRoaXMgcHJvamVjdCwgdGhlIGZvY3VzIGlzIG9uIGRhdGEgcHJlcGFyYXRpb24gYW5kIGV4cGxvcmF0aW9uIHRvIGdhaW4gaW5zaWdodHMgaW50byB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gT0RNIHNpdGVzLCBzaGlwIG1vZGVzLCBhbmQgbG9naXN0aWNzIGxlYWQgdGltZXMuIFRoZSBhbmFseXNpcyBhaW1zIHRvIGhlbHAgQUJDIG1pdGlnYXRlIHJpc2tzIGFuZCBtYWtlIGluZm9ybWVkIGRlY2lzaW9ucyByZWdhcmRpbmcgc3VwcGx5IGNoYWluIG1hbmFnZW1lbnQuDQoNCmBgYHtyIGxvYWQtcGFja2FnZXMsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0V9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkob3BlbmludHJvKQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShsdWJyaWRhdGUpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGZhc3REdW1taWVzKQ0KYGBgDQoNCiMjIyBQcm9ncmFtbWluZyAxYQ0KDQpSZWFkIGBSYXctRGF0YWAgYW5kIGBDYWxlbmRhcmAgd29ya3NoZWV0cyBmcm9tIGBSYXdEYXRhLnhsc3hgDQoNCmBgYHtyIHJlYWQgRGF0YSwgZWNobz1GQUxTRX0NCg0KcmF3X2RhdGEgPC0gcmVhZF9leGNlbCgifi9SYXdEYXRhLnhsc3giLCBzaGVldCA9ICJSYXctRGF0YSIpDQpjYWxlbmRhciA8LSByZWFkX2V4Y2VsKCJ+L1Jhd0RhdGEueGxzeCIsIHNoZWV0ID0gIkNhbGVuZGFyIikNCg0KI3ZpZXcgdGhlIGRhdGEgc2V0cyANCnJhd19kYXRhDQpjYWxlbmRhcg0KYGBgDQoNCg0KIyMjIFByb2dyYW1taW5nIDFiDQoNCkFkZGluZyBgUXVhcnRlcmAgYW5kIGBZZWFyYCBjb2x1bW5zIHRvIHRoZSBgUmF3LURhdGFgIHNoZWV0IGJ5IG1hdGNoaW5nIGBSZWNlaXB0IERhdGVgIHRoYXQgaW4gdGhlIGRhdGUgcmFuZ2VzIG9mIGBDYWxlbmRhcmAgc2hlZXQNCg0KYGBge3IgMWIsIGVjaG89RkFMU0V9DQoNCiMgQ29udmVydCBSZWNlaXB0IERhdGUsIFNoaXAgRGF0ZSwgYW5kIFBPIERvd25sb2FkIERhdGUgY29sdW1uIHRvIERhdGUgZm9ybWF0DQpyYXdfZGF0YSQiUmVjZWlwdCBEYXRlIiA8LSBhcy5EYXRlKHJhd19kYXRhJCJSZWNlaXB0IERhdGUiKQ0KcmF3X2RhdGEkIlNoaXAgRGF0ZSIgPC0gYXMuRGF0ZShyYXdfZGF0YSQiU2hpcCBEYXRlIikNCnJhd19kYXRhJCJQTyBEb3dubG9hZCBEYXRlIiA8LSBhcy5EYXRlKHJhd19kYXRhJCJQTyBEb3dubG9hZCBEYXRlIikNCg0KI0FkZCBRdWFydGVyIGFuZCBZZWFyIGNvbHVtbnMgaW50byBSYXctRGF0YSBkYXRhIGZyYW1lDQoNCnJhd19kYXRhJFF1YXJ0ZXIgPC0gTkENCnJhd19kYXRhJFllYXIgPC0gTkENCg0KDQoNCmZvciAoaSBpbiAxOm5yb3cocmF3X2RhdGEpKSB7DQogIG1hdGNoaW5nIDwtIGNhbGVuZGFyICU+JQ0KICAgIGZpbHRlcihyYXdfZGF0YSQiUmVjZWlwdCBEYXRlIltpXSAld2l0aGluJSBpbnRlcnZhbChzdGFydCA9IFN0YXJ0X0RhdGUsIGVuZCA9IEVuZF9kYXRlKSkNCiAgDQogIGlmIChucm93KG1hdGNoaW5nKSA+IDApIHsNCiAgICByYXdfZGF0YSRRdWFydGVyW2ldIDwtIG1hdGNoaW5nJFF1YXJ0ZXINCiAgICByYXdfZGF0YSRZZWFyW2ldIDwtIG1hdGNoaW5nJFllYXINCiAgICANCiAgfQ0KfQ0KDQpoZWFkKHJhd19kYXRhKQ0KYGBgDQoNCg0KIyMjIFByb2dyYW1taW5nIDFjDQoNCkNhbGN1bGF0ZSBgSW4tdHJhbnNpdCBMZWFkIFRpbWVgIGFuZCBgTWFudWZhY3R1cmluZyBMZWFkIFRpbWVgIGZvciBlYWNoIHJvdyBpbiB0aGUgam9pbmVkIGRhdGFzZXQNCg0KYGBge3IgMWMsIGVjaG89RkFMU0V9DQoNCiNBZGQgSW4tdHJhbnNpdCBMZWFkIFRpbWUgYW5kIE1hbnVmYWN0dXJpbmcgTGVhZCBUaW1lIGNvbHVtbnMgaW50byBSYXctRGF0YSBkYXRhIGZyYW1lDQoNCnJhd19kYXRhJCJJbi10cmFuc2l0IExlYWQgVGltZSIgPC0gTkENCnJhd19kYXRhJCJNYW51ZmFjdHVyaW5nIExlYWQgVGltZSIgPC0gTkENCg0KI0NyZWF0ZSBhIGZ1bmN0aW9uDQpDYWxjdWxhdGlvbiA8LSBmdW5jdGlvbih4LHkpIHsNCiAgZGlmZnRpbWUgPSBkaWZmdGltZSh4LHksdW5pdHMgPSAnZGF5cycpDQogIHJldHVybihkaWZmdGltZSkNCn0NCiMgQ2FsY3VsYXRlIEluLXRyYW5zaXQgTGVhZCBUaW1lIGFuZCBNYW51ZmFjdHVyaW5nIExlYWQgVGltZQ0KZm9yIChpIGluIDE6bnJvdyhyYXdfZGF0YSkpIHsNCiAgcmF3X2RhdGEkIkluLXRyYW5zaXQgTGVhZCBUaW1lIltpXSA8LSBhcy5udW1lcmljKENhbGN1bGF0aW9uKHJhd19kYXRhJCJSZWNlaXB0IERhdGUiW2ldLHJhd19kYXRhJCJTaGlwIERhdGUiW2ldKSkNCiAgcmF3X2RhdGEkIk1hbnVmYWN0dXJpbmcgTGVhZCBUaW1lIltpXSA8LSBhcy5udW1lcmljKENhbGN1bGF0aW9uKHJhd19kYXRhJCJTaGlwIERhdGUiW2ldLHJhd19kYXRhJCJQTyBEb3dubG9hZCBEYXRlIltpXSkpDQp9DQoNCmhlYWQocmF3X2RhdGEpDQoNCmBgYA0KDQpBcyB3ZSBjYW4gc2VlIGZyb20gdGhlIGRhdGEgZnJhbWUsIHRoZXJlIGFyZSBzb21lIHVudXN1YWwgdmFsdWVzIChuZWdhdGl2ZSB2YWx1ZXMsIGFuZCBvdmVyIDEwMCBkYXlzKSwgYW5kIG1pc3NpbmcgdmFsdWVzIG9mIGBJbi10cmFuc2l0IExlYWQgVGltZWAgYW5kIGBNYW51ZmFjdHVyaW5nIExlYWQgVGltZWANCg0KYGBge3IgY2hlY2stdmFsdWVzLCBlY2hvPUZBTFNFfQ0KdW5pcXVlKHJhd19kYXRhJCJJbi10cmFuc2l0IExlYWQgVGltZSIpDQp1bmlxdWUocmF3X2RhdGEkIk1hbnVmYWN0dXJpbmcgTGVhZCBUaW1lIikNCg0KI3RvdGFsIG1pc3NpbmcgdmFsdWVzIG9mIEluLXRyYW5zaXQgTGVhZCBUaW1lIGFuZCBNYW51ZmFjdHVyaW5nIExlYWQgVGltZQ0Kc3VtKGlzLm5hKHJhd19kYXRhJCJJbi10cmFuc2l0IExlYWQgVGltZSIpKQ0Kc3VtKGlzLm5hKHJhd19kYXRhJCJNYW51ZmFjdHVyaW5nIExlYWQgVGltZSIpKQ0KYGBgDQoNCg0KIyMjIFByb2dyYW1taW5nIDFkL2UNCg0KQ2xlYW5pbmcgZGF0YS4gRGVsZXRlIHRoZSBOQXMgdmFsdWVzIGFuZCBJbXB1dGUgbmV3IHZhbHVlcyBmb3IgYWxsIG90aGVyIHVudXN1YWwgdmFsdWVzDQoNCmBgYHtyIGNsZWFuaW5nLWRhdGEsIGVjaG89RkFMU0V9DQoNCmNsZWFuX3Jhd19kYXRhIDwtIHJhd19kYXRhICU+JQ0KICBmaWx0ZXIoIWlzLm5hKGBJbi10cmFuc2l0IExlYWQgVGltZWApIHwgIWlzLm5hKGBNYW51ZmFjdHVyaW5nIExlYWQgVGltZWApKSAlPiUNCiAgbXV0YXRlKGBJbi10cmFuc2l0IExlYWQgVGltZWAgPSBpZmVsc2UoYEluLXRyYW5zaXQgTGVhZCBUaW1lYCA8IDAgfCBgSW4tdHJhbnNpdCBMZWFkIFRpbWVgID4gMTAwLCAwLCBgSW4tdHJhbnNpdCBMZWFkIFRpbWVgKSwNCiAgICAgICAgICBgTWFudWZhY3R1cmluZyBMZWFkIFRpbWVgID0gIGlmZWxzZShgTWFudWZhY3R1cmluZyBMZWFkIFRpbWVgIDwgMCB8IGBNYW51ZmFjdHVyaW5nIExlYWQgVGltZWAgPiAxMDAsIDAsIGBNYW51ZmFjdHVyaW5nIExlYWQgVGltZWApKQ0KDQpoZWFkKGNsZWFuX3Jhd19kYXRhKQ0KDQpgYGANCg0KTm93LCBOQXMgdmFsdWVzIGFuZCB1bnVzdWFsIHZhbHVlcyBhcmUgbm90IGluY2x1ZGVkIGluIG15IGRhdGFzZXQgYGNsZWFuX3Jhd19kYXRhYA0KDQojIyMgUHJvZ3JhbW1pbmcgMWYNCg0KRXhwbG9yaW5nIHRoZSBjb2x1bW5zIGBJbi10cmFuc2l0IExlYWQgVGltZWAgYW5kIGBNYW51ZmFjdHVyaW5nIExlYWQgVGltZWANCg0KYGBge3IgZXhwbG9yaW5nIGRhdGEsIGVjaG89RkFMU0V9DQoNCiNVc2luZyBnZ3Bsb3QgdG8gdmlzdWFsaXplIEluLXRyYW5zaXQgTGVhZCBUaW1lDQpnZ3Bsb3QoY2xlYW5fcmF3X2RhdGEsIGFlcyh4ID0gYEluLXRyYW5zaXQgTGVhZCBUaW1lYCwgeSA9IGBTaGlwIE1vZGVgKSkgKw0KICBnZW9tX2JveHBsb3QoKQ0KDQojQ2FsY3VsYXRlIGF2ZXJhZ2UgSW4tdHJhbnNpdCBMZWFkIFRpbWUNCmZpbmFsX3Jhd19kYXRhIDwtIGNsZWFuX3Jhd19kYXRhICU+JQ0KICBncm91cF9ieShgU2hpcCBNb2RlYCkgJT4lDQogIHN1bW1hcmlzZShhdmdfSW50cmFuc2l0X2xlYWRfdGltZSA9IG1lYW4oYEluLXRyYW5zaXQgTGVhZCBUaW1lYCksDQogICAgICAgICAgICBhdmdfbWFudWZhY3R1cmluZ19sZWFkX3RpbWUgPSBtZWFuKGBNYW51ZmFjdHVyaW5nIExlYWQgVGltZWApKSAlPiUNCiAgYXJyYW5nZShkZXNjKGF2Z19JbnRyYW5zaXRfbGVhZF90aW1lKSkNCg0KZmluYWxfcmF3X2RhdGENCmBgYA0KDQpXZSBjYW4gc2VlIHRoZSBvdXRsaWVycyBvZiB0aGUgYEluLXRyYW5zaXQgTGVhZCBUaW1lYCwgYWxzbyBzaGlwcGVkIGJ5IGBPQ0VBTmAgdG9vayB0aGUgbG9uZ2VzdCBkYXlzDQoNCiMjIyBQcm9ncmFtbWluZyAxZw0KDQpDYWxjdWxhdGUgYW5kIHJlcG9ydCBjb3JyZWxhdGlvbnMgYmV0d2VlbiBhbGwgdmFyaWFibGVzLg0KDQpgYGB7ciByZXBvcnQsIGVjaG89RkFMU0V9DQoNCiNjb252ZXJ0IHRoZSBMT0IsIE9yaWdpbiwgU2hpcCBNb2RlLCBhbmQgUXVhcnRlciB0byBudW1lcmljIHZhcmlhYmxlcw0KbnVtX3Jhd19kYXRhIDwtIGNsZWFuX3Jhd19kYXRhICU+JQ0KICBzZWxlY3QoTE9CLE9yaWdpbixgU2hpcCBNb2RlYCxRdWFydGVyLGBJbi10cmFuc2l0IExlYWQgVGltZWAgKSAlPiUNCiAgbXV0YXRlX2lmKGlzLmNoYXJhY3RlciwgfiBhcy5udW1lcmljKGZhY3RvciguKSkpDQogIA0KI0NhbGN1bGF0ZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIEluLXRyYW5zaXQgbGVhZCB0aW1lIGFuZCBvdGhlciBhZmZlY3RpbmcgZmFjdG9ycw0KY29ycmVsYXRpb24gPC0gbnVtX3Jhd19kYXRhICU+JQ0KICBjb3IoKSAlPiUNCiAgLlsiSW4tdHJhbnNpdCBMZWFkIFRpbWUiLCAtNV0gJT4lDQogIHNvcnQoZGVjcmVhc2luZyA9IFRSVUUpDQoNCmNvcnJlbGF0aW9uDQoNCmBgYA0KV2UgY2FuIHNlZSB0aGUgYFNoaXAgTW9kZWAgaGFzIHRoZSBtb3N0IHJlbGF0aXZlIHRvIGBJbi10cmFuc2l0IExlYWQgVGltZWANCg0KIyMjIFVzZSB0aGUgbG0oKSBmdW5jdGlvbiB0byBwZXJmb3JtIGEgbXVsdGlwbGUgbGluZWFyIHJlZ3Jlc3Npb24gd2l0aCBgSW4tdHJhbnNpdCBMZWFkIFRpbWVgIGFzIHRoZSByZXNwb25zZSBhbmQgYWxsIG90aGVyIHZhcmlhYmxlcyBhcyB0aGUgcHJlZGljdG9ycy4gVXNlIHRoZSBzdW1tYXJ5KCkgZnVuY3Rpb24gdG8gcHJpbnQgdGhlIHJlc3VsdHMNCg0KYGBge3IgbGluZWFyLXJlZ3Jlc3Npb24sIGVjaG89RkFMU0V9DQoNCmxtLmZpdCA8LSBsbShgSW4tdHJhbnNpdCBMZWFkIFRpbWVgIH4gLiwgZGF0YSA9IG51bV9yYXdfZGF0YSkNCnN1bW1hcnkobG0uZml0KQ0KDQpgYGANCg0KVGhlcmUgaXMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiBwcmVkaWN0b3JzIGFuZCB0aGUgcmVzcG9uc2UgdmFyaWFibGUgYnkgYSBwLXZhbHVlIDwgMC4wNS4gVGh1cywgYExPQmAsIGBPcmlnaW5gLCBhbmQgYFNoaXAgTW9kZWAgaGF2ZSBhIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgcmVsYXRpb25zaGlwIHdpdGggYEluLXRyYW5zaXQgTGVhZCBUaW1lYA0KDQo=