In the investment management industry a company’s product is the financial return it produces. Generally, investment managers charge an annual management fee and then after certain pre-determined thresholds are met they earn a special fee known as a promote, incentive fee or a carried interest.

This fee is generally either a set of agreed upon interal rates of return [IRR] and/or a set of agreed upon multiples on invested capital [Capital Multiple]. This is known as a cash flow waterfall. These terms can be extremely complex and fully negotiable so you can’t say exact certainty what a “common” promote structure is.

In most entities that have a waterfall structure there is a general partner who invests a small portion of the total capital and one or many limited partners who invest the bulk of the equity capital. If the hurdles are met the promote is distributed to the general partner and the remainder of the cash flows are split parri-passu between the parties.

fundManager provides out of the box functionality allowing users perform these complex calculations given a set of dates, cash flows, and promote structures. In this example we will explore a hypothetical seed investment of Facebook akin to how the company was initially capitalized by Peter Thiel and his fund vehicle Founders Fund.

Setup

packages <-
  c('fundManageR', 'formattable', 'dplyr', 'lubridate')
lapply(packages, library, character.only = T)

Background and Investment Terms

In this toy example we pretend that Founder’s Fund makes a $500,000 investment Facebook on June 1st, 2006 through what is known as a convertible note. The convertible note accrues interest at a rate of 10% per annum on an Actual/360 schedule. The convertible note gives the fund the right to convert their investment into Facebook stock at the lesser of 33c per-share or the per-share price Facebook is able to raise it’s Series A investment.

investment <-
  500000
convertible_pref <-
  .10
investment_date <-
  "2006-06-01" %>% ymd
company_name <-
  "Facebook"
fund_name <- 
  'Founders Fund'
initial_data <- 
  data_frame(dateInvestment = investment_date,
           nameCompany = company_name,
           nameFund = fund_name,
           pctPref = convertible_pref %>% percent,
           amountInvestment = investment %>% currency
           )

Waterfall Structure and Equity Splits.

Given it’s successful history investing in start-ups Founders Fund [the General Partner] is able to raise a a fund for this once in a lifetime investment with a single pension fund investor [the Limited Partner]. The parties agree principals of Founders Fund will contribute 5% of the required capital and the limited partner will invest the remainder. The parties agree to the following promote structure:

  1. Parri-passu return of invested capital
  2. 20% promote after 3x distribution on invested capital
  3. 40% promote after a 5x distribution on invested capital
  4. 60% promote after a 10x distribution on invested capital
  5. 75% promote after a 100x distribution on invested capital.

It is important to note a promote structure like this is EXTREMELY unlikely as very few limited partners would likely agree to such manager friendly economics, not to mention the difficulty in tracking and calculating such a waterfall. This structure was selected purely to demonstrate fundmanageR's ability to handle the most complicated of waterfall calculations.

waterfall <-
  c("20 over a 3x", '40 over a 5x', "60 over a 10x", '75 over 100x')
promote_df <- 
  waterfall %>% 
  get_data_promote_structure()

Conversion to Common Shares

A little less than a year after the initial investment, on May 14th, 2007, Facebook closes on it’s Series A Investment at valuation of $1.20 triggering the convertible note share conversion. Keep in mind, even though the cash investment was $500,000, we accrued interest that gets included in the original investment upon share conversion. Also since the valuation exceed our cap of $0.33c per share we will convert to stock at 33c per share.

conversion_date <-
  "2007-05-14" %>% ymd
days_outsanding <-
  (conversion_date - investment_date) %>% as.numeric
pref_accrual <-
  calculate_days_accrued_pref(
    pct_pref = convertible_pref,
    is_actual_360 = T,
    days = days_outsanding,
    equity_bb = investment,
    pref_accrued_bb = 0
  )
conversion_price_per_share <-
  .33
amount_shares_conversion <- 
  ((investment + pref_accrual) / conversion_price_per_share) %>% as.numeric %>% floor %>% comma
conversion_data <- 
  data_frame(dateConversion = conversion_date,
             daysOutstanding = days_outsanding,
             amountAccruedPreference = pref_accrual,
             amountInvestmentConversion = investment + pref_accrual,
             countShares = amount_shares_conversion)

Initial Public Offering Liquidation Event

A few years pass and Facebook executes on its business plan, they are ready to take the next step and prepare for an Initial Public Offering. The company is taken public on May 15th 2012. After a 180 day lock-up period Founders Fund is able to sell its shares. In order to realize some promote and generate proceeds to invest in other assets Founders Fund decides to sell 660,774 shares on the open market at $25 per share.

ipo_sale_price <-
  25
ipo_sale_shares <-
  661196
lockup_period <-
  180
ipo_sale_date <-
  ("2012-05-18" %>% ymd) + lockup_period + 1
ipo_proceeds <-
  calculate_share_proceeds(price = ipo_sale_price, shares = ipo_sale_shares)

Final Liquidation Event

Most fund vehicles have pre-determined lifespans, with mechanisms to modify their original intended life, usually with a vote by the fund’s limited partners. These lifespans, depending on the asset class, generally range from 5 to 25 years. For the purpose of this exercise lets assume that this Facebook fund has a fund life not to exceed 11 years, meaning the vehicle must be wound down before June 1st, 2017. As such, and with Facebook stock at all-time highs, Founders Fund decides to liquidate it’s remaining 1,000,000 shares On September 19th, 2016 at $128.98 per share.

final_sale_price <-
  128.98
final_shares <-
  1000000
final_sale_date <-
  "2016-09-19" %>% ymd
final_sale_proceeds <-
  calculate_share_proceeds(price = final_sale_price, shares = final_shares)

Final Investment Analysis

Now given this set of assumptions, what were the returns for this investment, how were the economics split between the manager/general partner and the limited partner, fundManageR can tell you but we need to give it some important inputs this first being a data frame with the dates and amounts of the capital events

capital_event_dates <-
  c(investment_date, ipo_sale_date, final_sale_date)
capital_event_values <-
  c(-investment,  # this is negative because investments are considered cash-in
    ipo_proceeds, 
    final_sale_proceeds) %>%
  currency
cash_flow_df <-
  data_frame(dateCapitalEvent = capital_event_dates,
             amountContributionDistribution = capital_event_values)

Now we are ready to feed the necessary inputs to fundManageR’s calculate_cash_flow_waterfall_partnership function which will perform the requisite waterfall calculations and return a nested list of data frames summarizing: 1. Partnership Cash Flow by Period [cashflowWaterfall] 2. Waterfall by Tier and Period [entityWaterfall] 3. Summarised Partnership Total Returns [partnershipReturns]

fb_investment_data <-
  calculate_cash_flow_waterfall_partnership(
    dates = cash_flow_df$dateCapitalEvent, # vector of dates
    cash_flows = cash_flow_df$amountContributionDistribution, # vector of cash flows
    working_capital = 0, # amount of minimum cash
    promote_structure = waterfall,  # promote
    general_partner_pct = .05, #GP portion
    assign_to_environment = T, # create
    gp_promote_share = 1, #share of promote to GP
    remove_zero_cols = T, # remove zeroed out columns
  )
Cash Flow Produces a 8672.67%% irr
From 2006-06-01 to 2016-09-19
Profit of $145,009,900.00
Capital Multiple of 291.020
Cash Flow Produces a 15452.32%% irr
From 2006-06-01 to 2016-09-19
Profit of $91,787,757.08
Capital Multiple of 3672.510
Cash Flow Produces a 6951.64%% irr
From 2006-06-01 to 2016-09-19
Profit of $53,222,142.92
Capital Multiple of 113.047
Partnership Cash Flow Waterfall by Period
Waterfall by Tier and Period
Summarised Partnership Total Returns

Parting Notes

There you have it, you have a full waterfall calculation process for this hypothetical Facebook investment for an extremely complicated promote structure. You can use this function to calculate any form of a waterfall for any given set of capital multiple or internal rate of return hurdle hurdles. An example of an IRR based waterfall will be coming soon.

LS0tCnRpdGxlOiAiZnVuZE1hbmFnZVIgQ2FzaCBGbG93IFdhdGVyZmFsbFxuSHlwb3RoZXRpY2FsIEZhY2Vib29rIFNlZWQgSW52ZXN0bWVudCIKYXV0aG9yOiAiQWxleCBCcmVzbGVyIgpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6IAogICAgY3NzOiB+L0Rlc2t0b3AvU2VtYW50aWMtVUkvZGlzdC9zZW1hbnRpYy5jc3MKICAgIGZpZ193aWR0aDogOAogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAgdGhlbWU6IGNvc21vCi0tLQoKSW4gdGhlIGludmVzdG1lbnQgbWFuYWdlbWVudCBpbmR1c3RyeSBhIGNvbXBhbnkncyBwcm9kdWN0IGlzIHRoZSBmaW5hbmNpYWwgcmV0dXJuIGl0IHByb2R1Y2VzLiAgR2VuZXJhbGx5LCBpbnZlc3RtZW50IG1hbmFnZXJzIGNoYXJnZSBhbiBhbm51YWwgbWFuYWdlbWVudCBmZWUgYW5kIHRoZW4gYWZ0ZXIgY2VydGFpbiBwcmUtZGV0ZXJtaW5lZCB0aHJlc2hvbGRzIGFyZSBtZXQgdGhleSBlYXJuIGEgc3BlY2lhbCBmZWUga25vd24gYXMgYSBwcm9tb3RlLCBpbmNlbnRpdmUgZmVlIG9yIGEgY2FycmllZCBpbnRlcmVzdC4gIAoKVGhpcyBmZWUgaXMgZ2VuZXJhbGx5IGVpdGhlciBhIHNldCBvZiBhZ3JlZWQgdXBvbiBbaW50ZXJhbCByYXRlcyBvZiByZXR1cm5dKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0ludGVybmFsX3JhdGVfb2ZfcmV0dXJuKSBbSVJSXSBhbmQvb3IgYSBzZXQgb2YgYWdyZWVkIHVwb24gbXVsdGlwbGVzIG9uIGludmVzdGVkIGNhcGl0YWwgW0NhcGl0YWwgTXVsdGlwbGVdLiAgVGhpcyBpcyBrbm93biBhcyBhIGNhc2ggZmxvdyB3YXRlcmZhbGwuICBUaGVzZSB0ZXJtcyBjYW4gYmUgZXh0cmVtZWx5IGNvbXBsZXggYW5kIGZ1bGx5IG5lZ290aWFibGUgc28geW91IGNhbid0IHNheSBleGFjdCBjZXJ0YWludHkgd2hhdCBhICJjb21tb24iIHByb21vdGUgc3RydWN0dXJlIGlzLgoKSW4gbW9zdCBlbnRpdGllcyB0aGF0IGhhdmUgYSB3YXRlcmZhbGwgc3RydWN0dXJlIHRoZXJlIGlzIGEgZ2VuZXJhbCBwYXJ0bmVyIHdobyBpbnZlc3RzIGEgc21hbGwgcG9ydGlvbiBvZiB0aGUgdG90YWwgY2FwaXRhbCBhbmQgb25lIG9yIG1hbnkgbGltaXRlZCBwYXJ0bmVycyB3aG8gaW52ZXN0IHRoZSBidWxrIG9mIHRoZSBlcXVpdHkgY2FwaXRhbC4gIElmIHRoZSBodXJkbGVzIGFyZSBtZXQgdGhlIHByb21vdGUgaXMgZGlzdHJpYnV0ZWQgdG8gdGhlIGdlbmVyYWwgcGFydG5lciBhbmQgdGhlIHJlbWFpbmRlciBvZiB0aGUgY2FzaCBmbG93cyBhcmUgc3BsaXQgW3BhcnJpLXBhc3N1XShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9QYXJpX3Bhc3N1KSBiZXR3ZWVuIHRoZSBwYXJ0aWVzLiAgCgpgZnVuZE1hbmFnZXJgIHByb3ZpZGVzIG91dCBvZiB0aGUgYm94IGZ1bmN0aW9uYWxpdHkgYWxsb3dpbmcgdXNlcnMgcGVyZm9ybSB0aGVzZSBjb21wbGV4IGNhbGN1bGF0aW9ucyBnaXZlbiBhIHNldCBvZiBkYXRlcywgY2FzaCBmbG93cywgYW5kIHByb21vdGUgc3RydWN0dXJlcy4gIEluIHRoaXMgZXhhbXBsZSB3ZSB3aWxsIGV4cGxvcmUgYSBoeXBvdGhldGljYWwgc2VlZCBpbnZlc3RtZW50IG9mIFtGYWNlYm9va10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRmFjZWJvb2spIGFraW4gdG8gaG93IHRoZSBjb21wYW55IHdhcyBpbml0aWFsbHkgY2FwaXRhbGl6ZWQgYnkgW1BldGVyIFRoaWVsXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9QZXRlcl9UaGllbCkgYW5kIGhpcyBmdW5kIHZlaGljbGUgW0ZvdW5kZXJzIEZ1bmRdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0ZvdW5kZXJzX0Z1bmQpLgoKIyMjIFNldHVwCgpgYGB7ciByZXN1bHRzPSdoaWRlJywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KcGFja2FnZXMgPC0KICBjKCdmdW5kTWFuYWdlUicsICdmb3JtYXR0YWJsZScsICdkcGx5cicsICdsdWJyaWRhdGUnKQpsYXBwbHkocGFja2FnZXMsIGxpYnJhcnksIGNoYXJhY3Rlci5vbmx5ID0gVCkKYGBgCgojIyMgQmFja2dyb3VuZCBhbmQgSW52ZXN0bWVudCBUZXJtcwpJbiB0aGlzIHRveSBleGFtcGxlIHdlIHByZXRlbmQgdGhhdCBGb3VuZGVyJ3MgRnVuZCBtYWtlcyBhIDxzdHJvbmc+YCQ1MDAsMDAwYDwvc3Ryb25nPiBpbnZlc3RtZW50IEZhY2Vib29rIG9uIEp1bmUgMXN0LCAyMDA2IHRocm91Z2ggd2hhdCBpcyBrbm93biBhcyBhIFtjb252ZXJ0aWJsZSBub3RlXShodHRwczovL3RlY2hjcnVuY2guY29tLzIwMTIvMDQvMDcvY29udmVydGlibGUtbm90ZS1zZWVkLWZpbmFuY2luZ3MvKS4gIFRoZSBjb252ZXJ0aWJsZSBub3RlIGFjY3J1ZXMgaW50ZXJlc3QgYXQgYSByYXRlIG9mIDxzdHJvbmc+YDEwJSBwZXIgYW5udW1gPC9zdHJvbmc+IG9uIGFuIGBBY3R1YWwvMzYwYCBzY2hlZHVsZS4gIFRoZSBjb252ZXJ0aWJsZSBub3RlIGdpdmVzIHRoZSBmdW5kIHRoZSByaWdodCB0byBjb252ZXJ0IHRoZWlyIGludmVzdG1lbnQgaW50byBGYWNlYm9vayBzdG9jayBhdCB0aGUgbGVzc2VyIG9mIDMzYyBwZXItc2hhcmUgb3IgdGhlIHBlci1zaGFyZSBwcmljZSBGYWNlYm9vayBpcyBhYmxlIHRvIHJhaXNlIGl0J3MgU2VyaWVzIEEgaW52ZXN0bWVudC4KCmBgYHtyIGV2YWw9VFJVRX0KaW52ZXN0bWVudCA8LQogIDUwMDAwMAoKY29udmVydGlibGVfcHJlZiA8LQogIC4xMAoKaW52ZXN0bWVudF9kYXRlIDwtCiAgIjIwMDYtMDYtMDEiICU+JSB5bWQKCmNvbXBhbnlfbmFtZSA8LQogICJGYWNlYm9vayIKCmZ1bmRfbmFtZSA8LSAKICAnRm91bmRlcnMgRnVuZCcKCmluaXRpYWxfZGF0YSA8LSAKICBkYXRhX2ZyYW1lKGRhdGVJbnZlc3RtZW50ID0gaW52ZXN0bWVudF9kYXRlLAogICAgICAgICAgIG5hbWVDb21wYW55ID0gY29tcGFueV9uYW1lLAogICAgICAgICAgIG5hbWVGdW5kID0gZnVuZF9uYW1lLAogICAgICAgICAgIHBjdFByZWYgPSBjb252ZXJ0aWJsZV9wcmVmICU+JSBwZXJjZW50LAogICAgICAgICAgIGFtb3VudEludmVzdG1lbnQgPSBpbnZlc3RtZW50ICU+JSBjdXJyZW5jeQogICAgICAgICAgICkKCmBgYAoKCmBgYHtyIHJlc3VsdHM9J2FzaXMnLCBldmFsPVRSVUUsIGVjaG89RkFMU0V9CmluaXRpYWxfZGF0YSAlPiUgCiAgZm9ybWF0dGFibGU6OmZvcm1hdHRhYmxlKCkKYGBgCgojIyMjIFdhdGVyZmFsbCBTdHJ1Y3R1cmUgYW5kIEVxdWl0eSBTcGxpdHMuCgpHaXZlbiBpdCdzIHN1Y2Nlc3NmdWwgaGlzdG9yeSBpbnZlc3RpbmcgaW4gc3RhcnQtdXBzIEZvdW5kZXJzIEZ1bmQgW3RoZSBHZW5lcmFsIFBhcnRuZXJdIGlzIGFibGUgdG8gcmFpc2UgYSBhIGZ1bmQgZm9yIHRoaXMgb25jZSBpbiBhIGxpZmV0aW1lIGludmVzdG1lbnQgd2l0aCBhIHNpbmdsZSBwZW5zaW9uIGZ1bmQgaW52ZXN0b3IgW3RoZSBMaW1pdGVkIFBhcnRuZXJdLiAgVGhlIHBhcnRpZXMgYWdyZWUgcHJpbmNpcGFscyBvZiBGb3VuZGVycyBGdW5kIHdpbGwgY29udHJpYnV0ZSA1JSBvZiB0aGUgcmVxdWlyZWQgY2FwaXRhbCBhbmQgdGhlIGxpbWl0ZWQgcGFydG5lciB3aWxsIGludmVzdCB0aGUgcmVtYWluZGVyLiAgVGhlIHBhcnRpZXMgYWdyZWUgdG8gdGhlIGZvbGxvd2luZyBwcm9tb3RlIHN0cnVjdHVyZToKCjEuIFBhcnJpLXBhc3N1IHJldHVybiBvZiBpbnZlc3RlZCBjYXBpdGFsCjIuIDIwJSBwcm9tb3RlIGFmdGVyIDN4IGRpc3RyaWJ1dGlvbiBvbiBpbnZlc3RlZCBjYXBpdGFsCjMuIDQwJSBwcm9tb3RlIGFmdGVyIGEgNXggZGlzdHJpYnV0aW9uIG9uIGludmVzdGVkIGNhcGl0YWwKNC4gNjAlIHByb21vdGUgYWZ0ZXIgYSAxMHggZGlzdHJpYnV0aW9uIG9uIGludmVzdGVkIGNhcGl0YWwKNS4gNzUlIHByb21vdGUgYWZ0ZXIgYSAxMDB4IGRpc3RyaWJ1dGlvbiBvbiBpbnZlc3RlZCBjYXBpdGFsLgoKSXQgaXMgaW1wb3J0YW50IHRvIG5vdGUgYSBwcm9tb3RlIHN0cnVjdHVyZSBsaWtlIHRoaXMgaXMgPHN0cm9uZz5FWFRSRU1FTFk8L3N0cm9uZz4gdW5saWtlbHkgYXMgdmVyeSBmZXcgbGltaXRlZCBwYXJ0bmVycyB3b3VsZCBsaWtlbHkgYWdyZWUgdG8gc3VjaCBtYW5hZ2VyIGZyaWVuZGx5IGVjb25vbWljcywgbm90IHRvIG1lbnRpb24gdGhlIGRpZmZpY3VsdHkgaW4gdHJhY2tpbmcgYW5kIGNhbGN1bGF0aW5nIHN1Y2ggYSB3YXRlcmZhbGwuIFRoaXMgc3RydWN0dXJlIHdhcyBzZWxlY3RlZCBwdXJlbHkgdG8gZGVtb25zdHJhdGUgYGZ1bmRtYW5hZ2VSJ3NgIGFiaWxpdHkgdG8gaGFuZGxlIHRoZSBtb3N0IGNvbXBsaWNhdGVkIG9mIHdhdGVyZmFsbCBjYWxjdWxhdGlvbnMuCgpgYGB7ciBldmFsPVRSVUV9CndhdGVyZmFsbCA8LQogIGMoIjIwIG92ZXIgYSAzeCIsICc0MCBvdmVyIGEgNXgnLCAiNjAgb3ZlciBhIDEweCIsICc3NSBvdmVyIDEwMHgnKQoKcHJvbW90ZV9kZiA8LSAKICB3YXRlcmZhbGwgJT4lIAogIGdldF9kYXRhX3Byb21vdGVfc3RydWN0dXJlKCkKCmBgYAoKYGBge3IgcmVzdWx0cz0nYXNpcycsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0KcHJvbW90ZV9kZiAlPiUgCiAgZm9ybWF0dGFibGU6OmZvcm1hdHRhYmxlKCkKYGBgCgojIyMgQ29udmVyc2lvbiB0byBDb21tb24gU2hhcmVzCkEgbGl0dGxlIGxlc3MgdGhhbiBhIHllYXIgYWZ0ZXIgdGhlIGluaXRpYWwgaW52ZXN0bWVudCwgb24gTWF5IDE0dGgsIDIwMDcsIEZhY2Vib29rIGNsb3NlcyBvbiBpdCdzIFNlcmllcyBBIEludmVzdG1lbnQgYXQgdmFsdWF0aW9uIG9mIGAkMS4yMGAgdHJpZ2dlcmluZyB0aGUgY29udmVydGlibGUgbm90ZSBzaGFyZSBjb252ZXJzaW9uLiAgS2VlcCBpbiBtaW5kLCBldmVuIHRob3VnaCB0aGUgY2FzaCBpbnZlc3RtZW50IHdhcyBgJDUwMCwwMDBgLCB3ZSBhY2NydWVkIGludGVyZXN0IHRoYXQgZ2V0cyBpbmNsdWRlZCBpbiB0aGUgb3JpZ2luYWwgaW52ZXN0bWVudCB1cG9uIHNoYXJlIGNvbnZlcnNpb24uICBBbHNvIHNpbmNlIHRoZSB2YWx1YXRpb24gZXhjZWVkIG91ciBjYXAgb2YgJDAuMzNjIHBlciBzaGFyZSB3ZSB3aWxsIGNvbnZlcnQgdG8gc3RvY2sgYXQgMzNjIHBlciBzaGFyZS4KCmBgYHtyIGV2YWw9VFJVRX0KY29udmVyc2lvbl9kYXRlIDwtCiAgIjIwMDctMDUtMTQiICU+JSB5bWQKCmRheXNfb3V0c2FuZGluZyA8LQogIChjb252ZXJzaW9uX2RhdGUgLSBpbnZlc3RtZW50X2RhdGUpICU+JSBhcy5udW1lcmljCgpwcmVmX2FjY3J1YWwgPC0KICBjYWxjdWxhdGVfZGF5c19hY2NydWVkX3ByZWYoCiAgICBwY3RfcHJlZiA9IGNvbnZlcnRpYmxlX3ByZWYsCiAgICBpc19hY3R1YWxfMzYwID0gVCwKICAgIGRheXMgPSBkYXlzX291dHNhbmRpbmcsCiAgICBlcXVpdHlfYmIgPSBpbnZlc3RtZW50LAogICAgcHJlZl9hY2NydWVkX2JiID0gMAogICkKCmNvbnZlcnNpb25fcHJpY2VfcGVyX3NoYXJlIDwtCiAgLjMzCgphbW91bnRfc2hhcmVzX2NvbnZlcnNpb24gPC0gCiAgKChpbnZlc3RtZW50ICsgcHJlZl9hY2NydWFsKSAvIGNvbnZlcnNpb25fcHJpY2VfcGVyX3NoYXJlKSAlPiUgYXMubnVtZXJpYyAlPiUgZmxvb3IgJT4lIGNvbW1hCgpjb252ZXJzaW9uX2RhdGEgPC0gCiAgZGF0YV9mcmFtZShkYXRlQ29udmVyc2lvbiA9IGNvbnZlcnNpb25fZGF0ZSwKICAgICAgICAgICAgIGRheXNPdXRzdGFuZGluZyA9IGRheXNfb3V0c2FuZGluZywKICAgICAgICAgICAgIGFtb3VudEFjY3J1ZWRQcmVmZXJlbmNlID0gcHJlZl9hY2NydWFsLAogICAgICAgICAgICAgYW1vdW50SW52ZXN0bWVudENvbnZlcnNpb24gPSBpbnZlc3RtZW50ICsgcHJlZl9hY2NydWFsLAogICAgICAgICAgICAgY291bnRTaGFyZXMgPSBhbW91bnRfc2hhcmVzX2NvbnZlcnNpb24pCgpgYGAKCmBgYHtyIHJlc3VsdHM9J2FzaXMnLCBldmFsPVRSVUUsIGVjaG89RkFMU0V9CmNvbnZlcnNpb25fZGF0YSAlPiUgCiAgZm9ybWF0dGFibGU6OmZvcm1hdHRhYmxlKCkKYGBgCgojIyMjIEluaXRpYWwgUHVibGljIE9mZmVyaW5nIExpcXVpZGF0aW9uIEV2ZW50CgpBIGZldyB5ZWFycyBwYXNzIGFuZCBGYWNlYm9vayBleGVjdXRlcyBvbiBpdHMgYnVzaW5lc3MgcGxhbiwgdGhleSBhcmUgcmVhZHkgdG8gdGFrZSB0aGUgbmV4dCBzdGVwIGFuZCBwcmVwYXJlIGZvciBhbiBbSW5pdGlhbCBQdWJsaWMgT2ZmZXJpbmddKGh0dHA6Ly93d3cuaW52ZXN0b3BlZGlhLmNvbS90ZXJtcy9pL2lwby5hc3ApLiAgVGhlIGNvbXBhbnkgaXMgdGFrZW4gcHVibGljIG9uIE1heSAxNXRoIDIwMTIuICBBZnRlciBhIDE4MCBkYXkgW2xvY2stdXAgcGVyaW9kXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Mb2NrLXVwX3BlcmlvZCkgRm91bmRlcnMgRnVuZCBpcyBhYmxlIHRvIHNlbGwgaXRzIHNoYXJlcy4gIEluIG9yZGVyIHRvIHJlYWxpemUgc29tZSBwcm9tb3RlIGFuZCBnZW5lcmF0ZSBwcm9jZWVkcyB0byBpbnZlc3QgaW4gb3RoZXIgYXNzZXRzIEZvdW5kZXJzIEZ1bmQgZGVjaWRlcyB0byBzZWxsIDY2MCw3NzQgc2hhcmVzIG9uIHRoZSBvcGVuIG1hcmtldCBhdCAkMjUgcGVyIHNoYXJlLgoKYGBge3IgZXZhbD1UUlVFfQppcG9fc2FsZV9wcmljZSA8LQogIDI1CgppcG9fc2FsZV9zaGFyZXMgPC0KICA2NjExOTYKCmxvY2t1cF9wZXJpb2QgPC0KICAxODAKCmlwb19zYWxlX2RhdGUgPC0KICAoIjIwMTItMDUtMTgiICU+JSB5bWQpICsgbG9ja3VwX3BlcmlvZCArIDEKCgppcG9fcHJvY2VlZHMgPC0KICBjYWxjdWxhdGVfc2hhcmVfcHJvY2VlZHMocHJpY2UgPSBpcG9fc2FsZV9wcmljZSwgc2hhcmVzID0gaXBvX3NhbGVfc2hhcmVzKQoKYGBgCgojIyMjIEZpbmFsIExpcXVpZGF0aW9uIEV2ZW50CgpNb3N0IGZ1bmQgdmVoaWNsZXMgaGF2ZSBwcmUtZGV0ZXJtaW5lZCBsaWZlc3BhbnMsIHdpdGggbWVjaGFuaXNtcyB0byBtb2RpZnkgdGhlaXIgb3JpZ2luYWwgaW50ZW5kZWQgbGlmZSwgdXN1YWxseSB3aXRoIGEgdm90ZSBieSB0aGUgZnVuZCdzIGxpbWl0ZWQgcGFydG5lcnMuICBUaGVzZSBsaWZlc3BhbnMsIGRlcGVuZGluZyBvbiB0aGUgYXNzZXQgY2xhc3MsIGdlbmVyYWxseSByYW5nZSBmcm9tIDUgdG8gMjUgeWVhcnMuICBGb3IgdGhlIHB1cnBvc2Ugb2YgdGhpcyBleGVyY2lzZSBsZXRzIGFzc3VtZSB0aGF0IHRoaXMgRmFjZWJvb2sgZnVuZCBoYXMgYSBmdW5kIGxpZmUgbm90IHRvIGV4Y2VlZCAxMSB5ZWFycywgbWVhbmluZyB0aGUgdmVoaWNsZSBtdXN0IGJlIHdvdW5kIGRvd24gYmVmb3JlIEp1bmUgMXN0LCAyMDE3LiAgQXMgc3VjaCwgYW5kIHdpdGggRmFjZWJvb2sgc3RvY2sgYXQgYWxsLXRpbWUgaGlnaHMsIEZvdW5kZXJzIEZ1bmQgZGVjaWRlcyB0byBsaXF1aWRhdGUgaXQncyByZW1haW5pbmcgMSwwMDAsMDAwIHNoYXJlcyBPbiBTZXB0ZW1iZXIgMTl0aCwgMjAxNiBhdCAkMTI4Ljk4IHBlciBzaGFyZS4KCmBgYHtyIGV2YWw9VFJVRX0KZmluYWxfc2FsZV9wcmljZSA8LQogIDEyOC45OAoKZmluYWxfc2hhcmVzIDwtCiAgMTAwMDAwMAoKZmluYWxfc2FsZV9kYXRlIDwtCiAgIjIwMTYtMDktMTkiICU+JSB5bWQKCmZpbmFsX3NhbGVfcHJvY2VlZHMgPC0KICBjYWxjdWxhdGVfc2hhcmVfcHJvY2VlZHMocHJpY2UgPSBmaW5hbF9zYWxlX3ByaWNlLCBzaGFyZXMgPSBmaW5hbF9zaGFyZXMpCmBgYAoKIyMjIyBGaW5hbCBJbnZlc3RtZW50IEFuYWx5c2lzCk5vdyBnaXZlbiB0aGlzIHNldCBvZiBhc3N1bXB0aW9ucywgd2hhdCB3ZXJlIHRoZSByZXR1cm5zIGZvciB0aGlzIGludmVzdG1lbnQsIGhvdyB3ZXJlIHRoZSBlY29ub21pY3Mgc3BsaXQgYmV0d2VlbiB0aGUgbWFuYWdlci9nZW5lcmFsIHBhcnRuZXIgYW5kIHRoZSBsaW1pdGVkIHBhcnRuZXIsIGBmdW5kTWFuYWdlUmAgY2FuIHRlbGwgeW91IGJ1dCB3ZSBuZWVkIHRvIGdpdmUgaXQgc29tZSBpbXBvcnRhbnQgaW5wdXRzIHRoaXMgZmlyc3QgYmVpbmcgYSBkYXRhIGZyYW1lIHdpdGggdGhlIGRhdGVzIGFuZCBhbW91bnRzIG9mIHRoZSBjYXBpdGFsIGV2ZW50cwoKYGBge3IgZXZhbCA9IFRSVUV9CmNhcGl0YWxfZXZlbnRfZGF0ZXMgPC0KICBjKGludmVzdG1lbnRfZGF0ZSwgaXBvX3NhbGVfZGF0ZSwgZmluYWxfc2FsZV9kYXRlKQoKY2FwaXRhbF9ldmVudF92YWx1ZXMgPC0KICBjKC1pbnZlc3RtZW50LCAgIyB0aGlzIGlzIG5lZ2F0aXZlIGJlY2F1c2UgaW52ZXN0bWVudHMgYXJlIGNvbnNpZGVyZWQgY2FzaC1pbgogICAgaXBvX3Byb2NlZWRzLCAKICAgIGZpbmFsX3NhbGVfcHJvY2VlZHMpICU+JQogIGN1cnJlbmN5CgpjYXNoX2Zsb3dfZGYgPC0KICBkYXRhX2ZyYW1lKGRhdGVDYXBpdGFsRXZlbnQgPSBjYXBpdGFsX2V2ZW50X2RhdGVzLAogICAgICAgICAgICAgYW1vdW50Q29udHJpYnV0aW9uRGlzdHJpYnV0aW9uID0gY2FwaXRhbF9ldmVudF92YWx1ZXMpCgpgYGAKCmBgYHtyIHJlc3VsdHM9J2FzaXMnLCBldmFsPVRSVUUsIGVjaG89RkFMU0V9CmNhc2hfZmxvd19kZiAlPiUgCiAgZm9ybWF0dGFibGU6OmZvcm1hdHRhYmxlKCkKYGBgCk5vdyB3ZSBhcmUgcmVhZHkgdG8gZmVlZCB0aGUgbmVjZXNzYXJ5IGlucHV0cyB0byBgZnVuZE1hbmFnZVJgJ3MgYGNhbGN1bGF0ZV9jYXNoX2Zsb3dfd2F0ZXJmYWxsX3BhcnRuZXJzaGlwYCBmdW5jdGlvbiB3aGljaCB3aWxsIHBlcmZvcm0gdGhlIHJlcXVpc2l0ZSB3YXRlcmZhbGwgY2FsY3VsYXRpb25zIGFuZCByZXR1cm4gYSBuZXN0ZWQgbGlzdCBvZiBkYXRhIGZyYW1lcyBzdW1tYXJpemluZzoKMS4gUGFydG5lcnNoaXAgQ2FzaCBGbG93IGJ5IFBlcmlvZCBbY2FzaGZsb3dXYXRlcmZhbGxdCjIuIFdhdGVyZmFsbCBieSBUaWVyIGFuZCBQZXJpb2QgW2VudGl0eVdhdGVyZmFsbF0KMy4gU3VtbWFyaXNlZCBQYXJ0bmVyc2hpcCBUb3RhbCBSZXR1cm5zIFtwYXJ0bmVyc2hpcFJldHVybnNdCgpgYGB7ciBldmFsID0gVFJVRX0KZmJfaW52ZXN0bWVudF9kYXRhIDwtCiAgY2FsY3VsYXRlX2Nhc2hfZmxvd193YXRlcmZhbGxfcGFydG5lcnNoaXAoCiAgICBkYXRlcyA9IGNhc2hfZmxvd19kZiRkYXRlQ2FwaXRhbEV2ZW50LCAjIHZlY3RvciBvZiBkYXRlcwogICAgY2FzaF9mbG93cyA9IGNhc2hfZmxvd19kZiRhbW91bnRDb250cmlidXRpb25EaXN0cmlidXRpb24sICMgdmVjdG9yIG9mIGNhc2ggZmxvd3MKICAgIHdvcmtpbmdfY2FwaXRhbCA9IDAsICMgYW1vdW50IG9mIG1pbmltdW0gY2FzaAogICAgcHJvbW90ZV9zdHJ1Y3R1cmUgPSB3YXRlcmZhbGwsICAjIHByb21vdGUKICAgIGdlbmVyYWxfcGFydG5lcl9wY3QgPSAuMDUsICNHUCBwb3J0aW9uCiAgICBhc3NpZ25fdG9fZW52aXJvbm1lbnQgPSBULCAjIGNyZWF0ZQogICAgZ3BfcHJvbW90ZV9zaGFyZSA9IDEsICNzaGFyZSBvZiBwcm9tb3RlIHRvIEdQCiAgICByZW1vdmVfemVyb19jb2xzID0gVCwgIyByZW1vdmUgemVyb2VkIG91dCBjb2x1bW5zCiAgKQpgYGAKCjxoNT48Y2VudGVyPlBhcnRuZXJzaGlwIENhc2ggRmxvdyBXYXRlcmZhbGwgYnkgUGVyaW9kPC9oNT48L2NlbnRlcj4KCmBgYHtyIGNhc2hfZmxvdywgcmVzdWx0cz0nYXNpcycsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0KY2FzaGZsb3dXYXRlcmZhbGwKYGBgCgo8aDU+PGNlbnRlcj5XYXRlcmZhbGwgYnkgVGllciBhbmQgUGVyaW9kPC9oNT48L2NlbnRlcj4KCmBgYHtyIGVudGl0eV93YXRyZmFsbCwgcmVzdWx0cz0nYXNpcycsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0KZW50aXR5V2F0ZXJmYWxsICU+JSAKICBmb3JtYXR0YWJsZTo6Zm9ybWF0dGFibGUoKQpgYGAKCjxoNT48Y2VudGVyPlN1bW1hcmlzZWQgUGFydG5lcnNoaXAgVG90YWwgUmV0dXJuczwvY2VudGVyPjwvaDU+CgpgYGB7ciBwYXJ0bmVyc2hpcCwgcmVzdWx0cz0nYXNpcycsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0KcGFydG5lcnNoaXBSZXR1cm5zICU+JSAKICBmb3JtYXR0YWJsZTo6Zm9ybWF0dGFibGUoKQpgYGAKCiMjIyMgUGFydGluZyBOb3RlcwoKVGhlcmUgeW91IGhhdmUgaXQsIHlvdSBoYXZlIGEgZnVsbCB3YXRlcmZhbGwgY2FsY3VsYXRpb24gcHJvY2VzcyBmb3IgdGhpcyBoeXBvdGhldGljYWwgRmFjZWJvb2sgaW52ZXN0bWVudCBmb3IgYW4gZXh0cmVtZWx5IGNvbXBsaWNhdGVkIHByb21vdGUgc3RydWN0dXJlLiAgWW91IGNhbiB1c2UgdGhpcyBmdW5jdGlvbiB0byBjYWxjdWxhdGUgYW55IGZvcm0gb2YgYSB3YXRlcmZhbGwgZm9yIGFueSBnaXZlbiBzZXQgb2YgY2FwaXRhbCBtdWx0aXBsZSBvciBpbnRlcm5hbCByYXRlIG9mIHJldHVybiBodXJkbGUgaHVyZGxlcy4gIEFuIGV4YW1wbGUgb2YgYW4gSVJSIGJhc2VkIHdhdGVyZmFsbCB3aWxsIGJlIGNvbWluZyBzb29uLg==