Data Description

Pleas download T4_Data.Rdata from Canvas for this tutorial.

The data for this tutorial describe the outcome of a field experiment involving an incentive to join a customer loyalty program. A software company produces mobile apps using a “freemium” sales model: the base app is available for free, and add-ons sell for €.50 each. The company announced a customer loyalty program. Customers would be able to enroll in the loyalty program for free, and in return, they would gain access to early releases of new add-ons, as well as discounts on (as of yet unspecified) future products. Because the company sells its app via mobile app stores, it knows the following:

  • Who each customer is
  • Whether they have enrolled in the loyalty program
  • How much revenue each customer generates

The company decided to incentivize some customers to join the loyalty program. Just prior to the launch of the loyalty program (i.e., before anybody could sign up), it randomly chose 15% of its customers and told then that if they enrolled in the loyalty program when it opened, they would be entered into a drawing to receive one of 10 Amazon gift cards worth €100 each.

To obtain the data from this experiment, run the following code:

# Load and scan the data.  
load("T4_Data.Rdata")
head(loyalty)
## # A tibble: 6 x 4
##   ID        A     D     Y
##   <chr> <int> <int> <dbl>
## 1 00001     0     0   0.5
## 2 00002     0     0   0  
## 3 00003     1     1   0  
## 4 00004     0     0   0  
## 5 00005     1     1   0  
## 6 00006     0     0   0

The variables are:

  • customer: a unique identifier for each customer
  • Z: whether the customer received the incentive to join the loyalty program
  • D: whether the customer joined the loyalty program
  • Y: revenue within the first 3 months after the launch of the loyalty program (for the sake of simplicity, assume that customers could only enroll when the program was first launched)

Managerial Background

From the field experiment, the company wants to know a few things:

  • Was revenue higher among customers who received the incentive? (This is the intention-to-treat effect of the incentive on revenue, or ITT_Y)
  • Were customers who received the incentive more likely to join the loyalty program? (This is the intention-to-treat effect of the incentive on joining the loyalty program, or ITT_D)
  • How much did joining the loyalty program increase revenue among customers who were nudged into joining the loyalty program by the incentive? (This is the complier average causal effect, CACE, which is also called the local average treatment effect, or LATE)
  • Was the incentive cost effective?

The company realizes customers who stand to benefit the most from joining the program are more likely to join it. That is, the change in revenue from joining the loyalty program is probably correlated with the decision to join the loyalty program, as illustrated in the DAG below.

DAG Representation of the Non-compliance Problem

Analysis

First, we will estimate the intention-to-treat effect on joining the loyalty program, or ITT_D. The formula for calculating ITT_D is: \[ ITT_D=\frac{\sum_{i=1}^N{D_{i}^{obs}}\cdot A_i}{\sum_{i=1}^N{A_i}}-\frac{\sum_{i=1}^N{D_{i}^{obs}}\cdot \left( 1-A_i \right)}{\sum_{i=1}^N{\left( 1-A_i \right)}} \]

ITT_D <- mean(loyalty$D[loyalty$A==1])-
  mean(loyalty$D[loyalty$A==0])
ITT_D
## [1] 0.410132

This supports that the company has decided a good incentive, as customers who received the assignment were on average 41% more likely to join the loyalty program.

Second, we can calculate the intention-to-treat effect on the revenue, or ITT_Y. This calculation gives us the effect of the assignment (or the incentive of 10 Amazon gift cards, worth in total at €1000). The formula for calcuating ITT_Y is: \[ ITT_Y=\frac{\sum_{i=1}^N{Y_{i}^{obs}}\cdot A_i}{\sum_{i=1}^N{A_i}}-\frac{\sum_{i=1}^N{Y_{i}^{obs}}\cdot \left( 1-A_i \right)}{\sum_{i=1}^N{\left( 1-A_i \right)}} \]

ITT_Y <- mean(loyalty$Y[loyalty$A==1])-
  mean(loyalty$Y[loyalty$A==0])
ITT_Y
## [1] 0.2412221

The assignment (or the incentive) brings in on average 0.241 euros per customer. To check the cost effectiveness of the assignment, we may calculate the cost per customer with:

Cost_A <- 1000/sum(loyalty$A)
Cost_A
## [1] 0.08653513

The cost per customer is about 0.087 euro, and the benefit is about 0.241. Therefore, the assignment of the incentives is cost-effective. Although the initial evidence looks positive, the company wants to get some further insights on the effectiveness of the loyalty program. Although it is impossible to obtain the ATE or average treatment effect of a typical customer, the company can still learn about the LATE or the ATE of those who complied with the assignment. In another word, the revenue of those who received the incentive and join the loyalty program minus those who did not receive the incentive and not joint the program.

Note that it is not straightforward to see how LATE is compared to ATE. LATE may be lower or higher than ATE. The interpretation requires substantive knowledge. For example, suppose the company believed that the incentive was really marginal, and those compliers who received the incentives and joined the loyalty program did so out of their true loyalty to the company. A reasonable conclusion is the LATE is an upper-bound effect for ATE.

LATE <- ITT_Y/ITT_D
LATE
## [1] 0.5881572

Given the LATE, we may also calculate the potential revenue that would have been generated, had we assigned all compliers the incentive. For this we need the proportion of compliers in the experiment, which is ITT_D under the “no defier” assumption.

Counterfactual_Revenue_Compliers <- LATE*ITT_D*dim(loyalty)[1] 
Counterfactual_Revenue_Compliers
## [1] 18882.14

Summary

Experiments under non-compliance require careful treatments. Without any further assumption, we can learn the effect of the assignment, which may or may not useful. Yet, in policy evaluation, it seems reasonable to stop here. To learn more about the effect of the treatment, we need to make more assumptions: exclusion restrictions and “no defier”. The interpretation of LATE requires substantive knowledge and the relationship of LATE with ATE is not always clear.

LS0tDQp0aXRsZTogJ1R1dG9yaWFsIDQ6IE5vbi1jb21wbGlhbmNlIGluIEZpZWxkIEV4cGVyaW1lbnRzJw0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGRmX3ByaW50OiB0aWJibGUNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICB0aGVtZTogY2VydWxlYW4NCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiBubw0KICBwZGZfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCi0tLQ0KDQojIyMgKipEYXRhIERlc2NyaXB0aW9uKioNClBsZWFzIGRvd25sb2FkIGBUNF9EYXRhLlJkYXRhYCBmcm9tIENhbnZhcyBmb3IgdGhpcyB0dXRvcmlhbC4gDQoNClRoZSBkYXRhIGZvciB0aGlzIHR1dG9yaWFsIGRlc2NyaWJlIHRoZSBvdXRjb21lIG9mIGEgZmllbGQgZXhwZXJpbWVudCBpbnZvbHZpbmcgYW4gaW5jZW50aXZlIHRvIGpvaW4gYSBjdXN0b21lciBsb3lhbHR5IHByb2dyYW0uIEEgc29mdHdhcmUgY29tcGFueSBwcm9kdWNlcyBtb2JpbGUgYXBwcyB1c2luZyBhIOKAnGZyZWVtaXVt4oCdIHNhbGVzIG1vZGVsOiB0aGUgYmFzZSBhcHAgaXMgYXZhaWxhYmxlIGZvciBmcmVlLCBhbmQgYWRkLW9ucyBzZWxsIGZvciDigqwuNTAgZWFjaC4gVGhlIGNvbXBhbnkgYW5ub3VuY2VkIGEgY3VzdG9tZXIgbG95YWx0eSBwcm9ncmFtLiBDdXN0b21lcnMgd291bGQgYmUgYWJsZSB0byBlbnJvbGwgaW4gdGhlIGxveWFsdHkgcHJvZ3JhbSBmb3IgZnJlZSwgYW5kIGluIHJldHVybiwgdGhleSB3b3VsZCBnYWluIGFjY2VzcyB0byBlYXJseSByZWxlYXNlcyBvZiBuZXcgYWRkLW9ucywgYXMgd2VsbCBhcyBkaXNjb3VudHMgb24gKGFzIG9mIHlldCB1bnNwZWNpZmllZCkgZnV0dXJlIHByb2R1Y3RzLiBCZWNhdXNlIHRoZSBjb21wYW55IHNlbGxzIGl0cyBhcHAgdmlhIG1vYmlsZSBhcHAgc3RvcmVzLCBpdCBrbm93cyB0aGUgZm9sbG93aW5nOg0KDQoqIFdobyBlYWNoIGN1c3RvbWVyIGlzDQoqIFdoZXRoZXIgdGhleSBoYXZlIGVucm9sbGVkIGluIHRoZSBsb3lhbHR5IHByb2dyYW0NCiogSG93IG11Y2ggcmV2ZW51ZSBlYWNoIGN1c3RvbWVyIGdlbmVyYXRlcw0KDQpUaGUgY29tcGFueSBkZWNpZGVkIHRvIGluY2VudGl2aXplIHNvbWUgY3VzdG9tZXJzIHRvIGpvaW4gdGhlIGxveWFsdHkgcHJvZ3JhbS4gSnVzdCBwcmlvciB0byB0aGUgbGF1bmNoIG9mIHRoZSBsb3lhbHR5IHByb2dyYW0gKGkuZS4sIGJlZm9yZSBhbnlib2R5IGNvdWxkIHNpZ24gdXApLCBpdCByYW5kb21seSBjaG9zZSAxNSUgb2YgaXRzIGN1c3RvbWVycyBhbmQgdG9sZCB0aGVuIHRoYXQgaWYgdGhleSBlbnJvbGxlZCBpbiB0aGUgbG95YWx0eSBwcm9ncmFtIHdoZW4gaXQgb3BlbmVkLCB0aGV5IHdvdWxkIGJlIGVudGVyZWQgaW50byBhIGRyYXdpbmcgdG8gcmVjZWl2ZSBvbmUgb2YgMTAgQW1hem9uIGdpZnQgY2FyZHMgd29ydGgg4oKsMTAwIGVhY2guDQoNClRvIG9idGFpbiB0aGUgZGF0YSBmcm9tIHRoaXMgZXhwZXJpbWVudCwgcnVuIHRoZSBmb2xsb3dpbmcgY29kZTogIA0KDQpgYGB7cn0NCiMgTG9hZCBhbmQgc2NhbiB0aGUgZGF0YS4gIA0KbG9hZCgiVDRfRGF0YS5SZGF0YSIpDQpoZWFkKGxveWFsdHkpDQpgYGANCg0KVGhlIHZhcmlhYmxlcyBhcmU6DQoNCiogYGN1c3RvbWVyYDogYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgZWFjaCBjdXN0b21lcg0KKiBgWmA6IHdoZXRoZXIgdGhlIGN1c3RvbWVyIHJlY2VpdmVkIHRoZSBpbmNlbnRpdmUgdG8gam9pbiB0aGUgbG95YWx0eSBwcm9ncmFtDQoqIGBEYDogd2hldGhlciB0aGUgY3VzdG9tZXIgam9pbmVkIHRoZSBsb3lhbHR5IHByb2dyYW0NCiogYFlgOiByZXZlbnVlIHdpdGhpbiB0aGUgZmlyc3QgMyBtb250aHMgYWZ0ZXIgdGhlIGxhdW5jaCBvZiB0aGUgbG95YWx0eSBwcm9ncmFtIChmb3IgdGhlIHNha2Ugb2Ygc2ltcGxpY2l0eSwgYXNzdW1lIHRoYXQgY3VzdG9tZXJzIGNvdWxkIG9ubHkgZW5yb2xsIHdoZW4gdGhlIHByb2dyYW0gd2FzIGZpcnN0IGxhdW5jaGVkKQ0KDQojIyMgKipNYW5hZ2VyaWFsIEJhY2tncm91bmQqKg0KRnJvbSB0aGUgZmllbGQgZXhwZXJpbWVudCwgdGhlIGNvbXBhbnkgd2FudHMgdG8ga25vdyBhIGZldyB0aGluZ3M6DQoNCiogV2FzIHJldmVudWUgaGlnaGVyIGFtb25nIGN1c3RvbWVycyB3aG8gcmVjZWl2ZWQgdGhlIGluY2VudGl2ZT8gKFRoaXMgaXMgdGhlIGBpbnRlbnRpb24tdG8tdHJlYXQgZWZmZWN0IG9mIHRoZSBpbmNlbnRpdmUgb24gcmV2ZW51ZWAsIG9yIGBJVFRfWWApDQoqIFdlcmUgY3VzdG9tZXJzIHdobyByZWNlaXZlZCB0aGUgaW5jZW50aXZlIG1vcmUgbGlrZWx5IHRvIGpvaW4gdGhlIGxveWFsdHkgcHJvZ3JhbT8gKFRoaXMgaXMgdGhlIGBpbnRlbnRpb24tdG8tdHJlYXQgZWZmZWN0IG9mIHRoZSBpbmNlbnRpdmUgb24gam9pbmluZyB0aGUgbG95YWx0eSBwcm9ncmFtYCwgb3IgYElUVF9EYCkNCiogSG93IG11Y2ggZGlkIGpvaW5pbmcgdGhlIGxveWFsdHkgcHJvZ3JhbSBpbmNyZWFzZSByZXZlbnVlIGFtb25nIGN1c3RvbWVycyB3aG8gd2VyZSBudWRnZWQgaW50byBqb2luaW5nIHRoZSBsb3lhbHR5IHByb2dyYW0gYnkgdGhlIGluY2VudGl2ZT8gKFRoaXMgaXMgdGhlIGNvbXBsaWVyIGF2ZXJhZ2UgY2F1c2FsIGVmZmVjdCwgQ0FDRSwgd2hpY2ggaXMgYWxzbyBjYWxsZWQgdGhlIGBsb2NhbCBhdmVyYWdlIHRyZWF0bWVudCBlZmZlY3RgLCBvciBgTEFURWApDQoqIFdhcyB0aGUgaW5jZW50aXZlIGNvc3QgZWZmZWN0aXZlPw0KDQpUaGUgY29tcGFueSByZWFsaXplcyBjdXN0b21lcnMgd2hvIHN0YW5kIHRvIGJlbmVmaXQgdGhlIG1vc3QgZnJvbSBqb2luaW5nIHRoZSBwcm9ncmFtIGFyZSBtb3JlIGxpa2VseSB0byBqb2luIGl0LiBUaGF0IGlzLCB0aGUgY2hhbmdlIGluIHJldmVudWUgZnJvbSBqb2luaW5nIHRoZSBsb3lhbHR5IHByb2dyYW0gaXMgcHJvYmFibHkgY29ycmVsYXRlZCB3aXRoIHRoZSBkZWNpc2lvbiB0byBqb2luIHRoZSBsb3lhbHR5IHByb2dyYW0sIGFzIGlsbHVzdHJhdGVkIGluIHRoZSBEQUcgYmVsb3cuIA0KDQohW0RBRyBSZXByZXNlbnRhdGlvbiBvZiB0aGUgTm9uLWNvbXBsaWFuY2UgUHJvYmxlbV0obG95YWx0eS1EQUctMS5wbmcpDQoNCiMjIyAqKkFuYWx5c2lzKioNCg0KRmlyc3QsIHdlIHdpbGwgZXN0aW1hdGUgdGhlIGludGVudGlvbi10by10cmVhdCBlZmZlY3Qgb24gam9pbmluZyB0aGUgbG95YWx0eSBwcm9ncmFtLCBvciBgSVRUX0RgLiBUaGUgZm9ybXVsYSBmb3IgY2FsY3VsYXRpbmcgYElUVF9EYCBpczogDQokJA0KSVRUX0Q9XGZyYWN7XHN1bV97aT0xfV5Oe0Rfe2l9XntvYnN9fVxjZG90IEFfaX17XHN1bV97aT0xfV5Oe0FfaX19LVxmcmFje1xzdW1fe2k9MX1eTntEX3tpfV57b2JzfX1cY2RvdCBcbGVmdCggMS1BX2kgXHJpZ2h0KX17XHN1bV97aT0xfV5Oe1xsZWZ0KCAxLUFfaSBccmlnaHQpfX0NCiQkDQpgYGB7cn0NCklUVF9EIDwtIG1lYW4obG95YWx0eSREW2xveWFsdHkkQT09MV0pLQ0KICBtZWFuKGxveWFsdHkkRFtsb3lhbHR5JEE9PTBdKQ0KSVRUX0QNCmBgYA0KVGhpcyBzdXBwb3J0cyB0aGF0IHRoZSBjb21wYW55IGhhcyBkZWNpZGVkIGEgZ29vZCBpbmNlbnRpdmUsIGFzIGN1c3RvbWVycyB3aG8gcmVjZWl2ZWQgdGhlIGFzc2lnbm1lbnQgd2VyZSBvbiBhdmVyYWdlIDQxJSBtb3JlIGxpa2VseSB0byBqb2luIHRoZSBsb3lhbHR5IHByb2dyYW0uIA0KDQpTZWNvbmQsIHdlIGNhbiBjYWxjdWxhdGUgdGhlIGludGVudGlvbi10by10cmVhdCBlZmZlY3Qgb24gdGhlIHJldmVudWUsIG9yIGBJVFRfWWAuIFRoaXMgY2FsY3VsYXRpb24gZ2l2ZXMgdXMgdGhlIGVmZmVjdCBvZiB0aGUgYXNzaWdubWVudCAob3IgdGhlIGluY2VudGl2ZSBvZiAxMCBBbWF6b24gZ2lmdCBjYXJkcywgd29ydGggaW4gdG90YWwgYXQg4oKsMTAwMCkuIFRoZSBmb3JtdWxhIGZvciBjYWxjdWF0aW5nIGBJVFRfWWAgaXM6IA0KJCQNCklUVF9ZPVxmcmFje1xzdW1fe2k9MX1eTntZX3tpfV57b2JzfX1cY2RvdCBBX2l9e1xzdW1fe2k9MX1eTntBX2l9fS1cZnJhY3tcc3VtX3tpPTF9Xk57WV97aX1ee29ic319XGNkb3QgXGxlZnQoIDEtQV9pIFxyaWdodCl9e1xzdW1fe2k9MX1eTntcbGVmdCggMS1BX2kgXHJpZ2h0KX19DQokJA0KYGBge3J9DQpJVFRfWSA8LSBtZWFuKGxveWFsdHkkWVtsb3lhbHR5JEE9PTFdKS0NCiAgbWVhbihsb3lhbHR5JFlbbG95YWx0eSRBPT0wXSkNCklUVF9ZDQpgYGANClRoZSBhc3NpZ25tZW50IChvciB0aGUgaW5jZW50aXZlKSBicmluZ3MgaW4gb24gYXZlcmFnZSAwLjI0MSBldXJvcyBwZXIgY3VzdG9tZXIuIFRvIGNoZWNrIHRoZSBjb3N0IGVmZmVjdGl2ZW5lc3Mgb2YgdGhlIGFzc2lnbm1lbnQsIHdlIG1heSBjYWxjdWxhdGUgdGhlIGNvc3QgcGVyIGN1c3RvbWVyIHdpdGg6IA0KYGBge3J9DQpDb3N0X0EgPC0gMTAwMC9zdW0obG95YWx0eSRBKQ0KQ29zdF9BDQpgYGANClRoZSBjb3N0IHBlciBjdXN0b21lciBpcyBhYm91dCAwLjA4NyBldXJvLCBhbmQgdGhlIGJlbmVmaXQgaXMgYWJvdXQgMC4yNDEuIFRoZXJlZm9yZSwgdGhlIGFzc2lnbm1lbnQgb2YgdGhlIGluY2VudGl2ZXMgaXMgY29zdC1lZmZlY3RpdmUuIEFsdGhvdWdoIHRoZSBpbml0aWFsIGV2aWRlbmNlIGxvb2tzIHBvc2l0aXZlLCB0aGUgY29tcGFueSB3YW50cyB0byBnZXQgc29tZSBmdXJ0aGVyIGluc2lnaHRzIG9uIHRoZSBlZmZlY3RpdmVuZXNzIG9mIHRoZSBsb3lhbHR5IHByb2dyYW0uIEFsdGhvdWdoIGl0IGlzIGltcG9zc2libGUgdG8gb2J0YWluIHRoZSBBVEUgb3IgYXZlcmFnZSB0cmVhdG1lbnQgZWZmZWN0IG9mIGEgdHlwaWNhbCBjdXN0b21lciwgdGhlIGNvbXBhbnkgY2FuIHN0aWxsIGxlYXJuIGFib3V0IHRoZSBMQVRFIG9yIHRoZSBBVEUgb2YgdGhvc2Ugd2hvIGNvbXBsaWVkIHdpdGggdGhlIGFzc2lnbm1lbnQuIEluIGFub3RoZXIgd29yZCwgdGhlIHJldmVudWUgb2YgdGhvc2Ugd2hvIHJlY2VpdmVkIHRoZSBpbmNlbnRpdmUgYW5kIGpvaW4gdGhlIGxveWFsdHkgcHJvZ3JhbSBtaW51cyB0aG9zZSB3aG8gZGlkIG5vdCByZWNlaXZlIHRoZSBpbmNlbnRpdmUgYW5kIG5vdCBqb2ludCB0aGUgcHJvZ3JhbS4NCg0KTm90ZSB0aGF0IGl0IGlzIG5vdCBzdHJhaWdodGZvcndhcmQgdG8gc2VlIGhvdyBMQVRFIGlzIGNvbXBhcmVkIHRvIEFURS4gTEFURSBtYXkgYmUgbG93ZXIgb3IgaGlnaGVyIHRoYW4gQVRFLiBUaGUgaW50ZXJwcmV0YXRpb24gcmVxdWlyZXMgc3Vic3RhbnRpdmUga25vd2xlZGdlLiBGb3IgZXhhbXBsZSwgc3VwcG9zZSB0aGUgY29tcGFueSBiZWxpZXZlZCB0aGF0IHRoZSBpbmNlbnRpdmUgd2FzIHJlYWxseSBtYXJnaW5hbCwgYW5kIHRob3NlIGNvbXBsaWVycyB3aG8gcmVjZWl2ZWQgdGhlIGluY2VudGl2ZXMgYW5kIGpvaW5lZCB0aGUgbG95YWx0eSBwcm9ncmFtIGRpZCBzbyBvdXQgb2YgdGhlaXIgdHJ1ZSBsb3lhbHR5IHRvIHRoZSBjb21wYW55LiBBIHJlYXNvbmFibGUgY29uY2x1c2lvbiBpcyB0aGUgTEFURSBpcyBhbiB1cHBlci1ib3VuZCBlZmZlY3QgZm9yIEFURS4gIA0KDQpgYGB7cn0NCkxBVEUgPC0gSVRUX1kvSVRUX0QNCkxBVEUNCmBgYA0KDQpHaXZlbiB0aGUgTEFURSwgd2UgbWF5IGFsc28gY2FsY3VsYXRlIHRoZSBwb3RlbnRpYWwgcmV2ZW51ZSB0aGF0IHdvdWxkIGhhdmUgYmVlbiBnZW5lcmF0ZWQsIGhhZCB3ZSBhc3NpZ25lZCBhbGwgY29tcGxpZXJzIHRoZSBpbmNlbnRpdmUuIEZvciB0aGlzIHdlIG5lZWQgdGhlIHByb3BvcnRpb24gb2YgY29tcGxpZXJzIGluIHRoZSBleHBlcmltZW50LCB3aGljaCBpcyBgSVRUX0RgIHVuZGVyIHRoZSAibm8gZGVmaWVyIiBhc3N1bXB0aW9uLiANCmBgYHtyfQ0KQ291bnRlcmZhY3R1YWxfUmV2ZW51ZV9Db21wbGllcnMgPC0gTEFURSpJVFRfRCpkaW0obG95YWx0eSlbMV0gDQpDb3VudGVyZmFjdHVhbF9SZXZlbnVlX0NvbXBsaWVycw0KYGBgDQojIyMgKipTdW1tYXJ5KioNCg0KRXhwZXJpbWVudHMgdW5kZXIgbm9uLWNvbXBsaWFuY2UgcmVxdWlyZSBjYXJlZnVsIHRyZWF0bWVudHMuIFdpdGhvdXQgYW55IGZ1cnRoZXIgYXNzdW1wdGlvbiwgd2UgY2FuIGxlYXJuIHRoZSBlZmZlY3Qgb2YgdGhlIGFzc2lnbm1lbnQsIHdoaWNoIG1heSBvciBtYXkgbm90IHVzZWZ1bC4gWWV0LCBpbiBwb2xpY3kgZXZhbHVhdGlvbiwgaXQgc2VlbXMgcmVhc29uYWJsZSB0byBzdG9wIGhlcmUuIFRvIGxlYXJuIG1vcmUgYWJvdXQgdGhlIGVmZmVjdCBvZiB0aGUgdHJlYXRtZW50LCB3ZSBuZWVkIHRvIG1ha2UgbW9yZSBhc3N1bXB0aW9uczogZXhjbHVzaW9uIHJlc3RyaWN0aW9ucyBhbmQgIm5vIGRlZmllciIuIFRoZSBpbnRlcnByZXRhdGlvbiBvZiBMQVRFIHJlcXVpcmVzIHN1YnN0YW50aXZlIGtub3dsZWRnZSBhbmQgdGhlIHJlbGF0aW9uc2hpcCBvZiBMQVRFIHdpdGggQVRFIGlzIG5vdCBhbHdheXMgY2xlYXIuICANCg==