Introduction
In recent years, consumer preferences in the packaged bread market
have shifted significantly toward healthier, more sustainable, and
higher-quality product offerings. Beyond basic functional needs,
attributes such as bread type, packaging, slicing format, and price
increasingly influence consumers’ purchase decisions and brand
evaluations.
UNO is one of the leading packaged bread brands in the market and
offers a wide portfolio ranging from traditional white bread to whole
grain and premium variants. Understanding how consumers trade off
different product attributes is critical for designing successful new
product concepts and pricing strategies.
The objective of this project is to analyze consumer preferences for
packaged bread products, with a specific focus on UNO, by combining
survey-based insights and conjoint analysis. Through this approach, we
aim to identify which product attributes drive consumer ratings the most
and how sensitive consumers are to price and packaging decisions.
This report presents the results of a consumer survey conducted via
Google Forms and applies a rating-based conjoint model to estimate the
relative impact of key bread attributes on overall product evaluations.
The findings are translated into managerial insights to support product
design, packaging, and pricing decisions for UNO’s future bread
offerings.
Research Objectives
The main objectives of this study are:
- To understand consumer preferences for different packaged bread
attributes.
- To estimate the relative importance of bread type, slice type,
packaging type, and price on overall product ratings.
- To evaluate consumer price sensitivity within the packaged bread
category.
- To derive actionable managerial insights for UNO’s product
development and positioning strategy.
Data and Methodology Overview
Data for this study were collected through an online consumer survey
administered via Google Forms. The survey included questions on bread
consumption habits, brand perceptions, purchase intentions, and a
conjoint experiment designed to evaluate trade-offs between different
bread attributes.
The conjoint data were reshaped into a long format suitable for
analysis and analyzed using a linear regression model (rating-based
conjoint analysis). The dependent variable is the overall product
rating, while the independent variables include bread type, slice type,
packaging type, and price.
Additional survey questions were organized into thematic sections and
analyzed descriptively to complement the conjoint findings.
Conjoint Analysis
(Rating-Based)
Purpose of the
conjoint analysis
To understand how consumers trade off different bread attributes, we
used a rating-based conjoint approach. Each respondent evaluated
multiple product profiles that differed in Bread Type,
Slice Type, Package Type, and
Price. We then estimated the average impact (part-worth
utility) of each attribute level on overall product ratings.
Model
specification
We estimated the following linear regression model:
Conjoint Analysis
(Rating-Based)
Purpose of the
conjoint analysis
To understand how consumers trade off different bread attributes, we
used a rating-based conjoint approach. Each respondent evaluated
multiple product profiles that differed in Bread Type,
Slice Type, Package Type, and
Price. We then estimated the average impact (part-worth
utility) of each attribute level on overall product ratings.
Model
specification
We estimated the following linear regression model:
\[
Rating = \beta_0 + \beta_1(Bread\ Type) + \beta_2(Slice\ Type) +
\beta_3(Price) + \beta_4(Package\ Type) + \varepsilon
\]
Regression results
(part-worth utilities)
The model is statistically significant overall (F-test p < 0.001),
suggesting that the included attributes collectively explain variation
in consumer ratings. The adjusted R-squared is approximately 0.084,
which is acceptable for preference/consumer rating data and indicates
that the model captures meaningful directional effects.
Key coefficients and interpretation:
- Bread Type
- Whole grain has a positive and
significant effect on ratings (+0.389, p = 0.001).
This indicates consumers value whole grain options and perceive them as
more attractive than the baseline bread type.
- Traditional is not statistically different from the
baseline (p = 0.875), suggesting it does not meaningfully increase
preference relative to the reference level.
- Slice Type
- Both Thick (-0.295, p = 0.016) and
Thin (-0.372, p = 0.004) have negative and
significant effects.
This implies the reference slice type (likely “standard/medium”) is
preferred; deviating to very thin or thick slices reduces ratings.
- Price
- Higher prices reduce ratings, especially at extreme levels.
- 150 TL shows a strong negative effect (-0.788, p
< 0.001), indicating a clear penalty when the price reaches very high
levels.
- 50 TL also reduces ratings (-0.350, p = 0.026),
suggesting consumers are sensitive once price crosses a certain
threshold.
- 25 TL and 35 TL are not
significant (p > 0.10), implying small increases at lower price
points do not strongly change ratings compared to the reference price
level.
- Package Type
- Plastic bag has the largest negative and
significant effect (-0.892, p < 0.001).
Packaging choice appears to be a dominant driver of preference: plastic
packaging substantially decreases consumer evaluations relative to the
reference package type.
Managerial insights
from conjoint results
Based on the conjoint model, the strongest drivers of consumer
ratings are packaging and price,
followed by bread type, while slice
type appears to be a lower-impact (hygiene) attribute.
From a product strategy perspective: - Favor whole
grain variants for stronger perceived value. - Use a
standard slice option rather than extreme thin/thick
slicing. - Avoid plastic bag packaging; consider
packaging formats that signal quality, freshness, or sustainability. -
Maintain pricing within acceptable ranges; very high prices generate a
sharp drop in preference unless justified by strong premium cues.
Suggested visuals for
the presentation
To communicate conjoint findings clearly, the following visuals are
recommended: - A coefficient plot (part-worth utilities
with confidence intervals) - A price sensitivity chart
(average rating by price level) - A packaging impact
chart (average rating by package type)
library(readxl) # # read Excel
library(broom) # # tidy model outputs
library(knitr) # # kable tables
library(kableExtra) # # nicer tables
library(broom)
library(ggplot2)
breadRatingData <- read_excel("ConjointData.xlsx")
ratingRegression <- lm(breadRatingData$Rating ~ breadRatingData$`Bread Type`
+ breadRatingData$`Slice Type`
+ breadRatingData$Price
+ breadRatingData$`Package Type`)
summary(ratingRegression)
##
## Call:
## lm(formula = breadRatingData$Rating ~ breadRatingData$`Bread Type` +
## breadRatingData$`Slice Type` + breadRatingData$Price + breadRatingData$`Package Type`)
##
## Residuals:
## Min 1Q Median 3Q Max
## -3.3940 -1.4284 -0.2546 1.3089 4.8860
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 4.10782 0.17067 24.069 < 2e-16
## breadRatingData$`Bread Type`Traditional -0.01912 0.12146 -0.157 0.87496
## breadRatingData$`Bread Type`Whole grain 0.38851 0.12146 3.199 0.00141
## breadRatingData$`Slice Type`Thick -0.29523 0.12207 -2.419 0.01570
## breadRatingData$`Slice Type`Thin -0.37151 0.12740 -2.916 0.00360
## breadRatingData$Price150 TL -0.78767 0.15431 -5.105 3.74e-07
## breadRatingData$Price25 TL -0.10233 0.17102 -0.598 0.54969
## breadRatingData$Price35 TL -0.17494 0.14914 -1.173 0.24098
## breadRatingData$Price50 TL -0.35000 0.15710 -2.228 0.02604
## breadRatingData$`Package Type`Plastic Bag -0.89179 0.10087 -8.841 < 2e-16
##
## (Intercept) ***
## breadRatingData$`Bread Type`Traditional
## breadRatingData$`Bread Type`Whole grain **
## breadRatingData$`Slice Type`Thick *
## breadRatingData$`Slice Type`Thin **
## breadRatingData$Price150 TL ***
## breadRatingData$Price25 TL
## breadRatingData$Price35 TL
## breadRatingData$Price50 TL *
## breadRatingData$`Package Type`Plastic Bag ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.876 on 1484 degrees of freedom
## Multiple R-squared: 0.08997, Adjusted R-squared: 0.08446
## F-statistic: 16.3 on 9 and 1484 DF, p-value: < 2.2e-16
coef_df <- tidy(ratingRegression)
ggplot(coef_df[coef_df$term != "(Intercept)", ],
aes(x = estimate, y = reorder(term, estimate))) +
geom_point(size = 3) +
geom_errorbarh(aes(xmin = estimate - 1.96*std.error,
xmax = estimate + 1.96*std.error),
height = 0.2) +
geom_vline(xintercept = 0, linetype = "dashed") +
labs(title = "Conjoint Part-Worth Utilities (Regression Coefficients)",
x = "Utility (Impact on Rating)",
y = "Attribute Level") +
theme_minimal()

Price
sensitivity
library(dplyr)
breadRatingData %>%
group_by(Price) %>%
summarise(mean_rating = mean(Rating), .groups = "drop") %>%
ggplot(aes(x = Price, y = mean_rating)) +
geom_line() +
geom_point(size = 2) +
labs(title = "Price Sensitivity: Average Rating by Price",
x = "Price Level",
y = "Average Rating") +
theme_minimal()

3) Packaging impact
(plastik etkisini vurgular)
breadRatingData %>%
group_by(`Package Type`) %>%
summarise(mean_rating = mean(Rating), .groups = "drop") %>%
ggplot(aes(x = `Package Type`, y = mean_rating)) +
geom_col() +
labs(title = "Packaging Impact: Average Rating by Package Type",
x = "Package Type",
y = "Average Rating") +
theme_minimal()

## speed dist
## Min. : 4.0 Min. : 2.00
## 1st Qu.:12.0 1st Qu.: 26.00
## Median :15.0 Median : 36.00
## Mean :15.4 Mean : 42.98
## 3rd Qu.:19.0 3rd Qu.: 56.00
## Max. :25.0 Max. :120.00
Including Plots
You can also embed plots, for example:

Note that the echo = FALSE parameter was added to the
code chunk to prevent printing of the R code that generated the
plot.
LS0tCnRpdGxlOiAiRGF0YSBJbnNpZ2h0cyBmb3IgTWFya2V0aW5nIChNaU04MTApIC0gR3JvdXA0IgpzdWJ0aXRsZTogIlVOTyBCcmVhZCBDb25zdW1lciBTdXJ2ZXkgJiBDb25qb2ludCBBbmFseXNpcyBSZXN1bHRzIgphdXRob3I6ICJHcm91cCA0IgpkYXRlOiAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICclQiAlZCwgJVknKWAiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgdGhlbWU6IGZsYXRseQogICAgaGlnaGxpZ2h0OiBweWdtZW50cwogICAgdG9jOiB0cnVlCiAgICB0b2NfZGVwdGg6IDMKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiB0cnVlCiAgICAgIHNtb290aF9zY3JvbGw6IHRydWUKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBkZl9wcmludDogcGFnZWQKICAgIHNlbGZfY29udGFpbmVkOiB0cnVlCiAgICBtYXRoamF4OiBkZWZhdWx0Ci0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkKYGBgCgoqKkludHJvZHVjdGlvbioqCgpJbiByZWNlbnQgeWVhcnMsIGNvbnN1bWVyIHByZWZlcmVuY2VzIGluIHRoZSBwYWNrYWdlZCBicmVhZCBtYXJrZXQgaGF2ZSBzaGlmdGVkIHNpZ25pZmljYW50bHkgdG93YXJkIGhlYWx0aGllciwgbW9yZSBzdXN0YWluYWJsZSwgYW5kIGhpZ2hlci1xdWFsaXR5IHByb2R1Y3Qgb2ZmZXJpbmdzLiBCZXlvbmQgYmFzaWMgZnVuY3Rpb25hbCBuZWVkcywgYXR0cmlidXRlcyBzdWNoIGFzIGJyZWFkIHR5cGUsIHBhY2thZ2luZywgc2xpY2luZyBmb3JtYXQsIGFuZCBwcmljZSBpbmNyZWFzaW5nbHkgaW5mbHVlbmNlIGNvbnN1bWVyc+KAmSBwdXJjaGFzZSBkZWNpc2lvbnMgYW5kIGJyYW5kIGV2YWx1YXRpb25zLgoKVU5PIGlzIG9uZSBvZiB0aGUgbGVhZGluZyBwYWNrYWdlZCBicmVhZCBicmFuZHMgaW4gdGhlIG1hcmtldCBhbmQgb2ZmZXJzIGEgd2lkZSBwb3J0Zm9saW8gcmFuZ2luZyBmcm9tIHRyYWRpdGlvbmFsIHdoaXRlIGJyZWFkIHRvIHdob2xlIGdyYWluIGFuZCBwcmVtaXVtIHZhcmlhbnRzLiBVbmRlcnN0YW5kaW5nIGhvdyBjb25zdW1lcnMgdHJhZGUgb2ZmIGRpZmZlcmVudCBwcm9kdWN0IGF0dHJpYnV0ZXMgaXMgY3JpdGljYWwgZm9yIGRlc2lnbmluZyBzdWNjZXNzZnVsIG5ldyBwcm9kdWN0IGNvbmNlcHRzIGFuZCBwcmljaW5nIHN0cmF0ZWdpZXMuCgpUaGUgb2JqZWN0aXZlIG9mIHRoaXMgcHJvamVjdCBpcyB0byBhbmFseXplIGNvbnN1bWVyIHByZWZlcmVuY2VzIGZvciBwYWNrYWdlZCBicmVhZCBwcm9kdWN0cywgd2l0aCBhIHNwZWNpZmljIGZvY3VzIG9uIFVOTywgYnkgY29tYmluaW5nIHN1cnZleS1iYXNlZCBpbnNpZ2h0cyBhbmQgY29uam9pbnQgYW5hbHlzaXMuIFRocm91Z2ggdGhpcyBhcHByb2FjaCwgd2UgYWltIHRvIGlkZW50aWZ5IHdoaWNoIHByb2R1Y3QgYXR0cmlidXRlcyBkcml2ZSBjb25zdW1lciByYXRpbmdzIHRoZSBtb3N0IGFuZCBob3cgc2Vuc2l0aXZlIGNvbnN1bWVycyBhcmUgdG8gcHJpY2UgYW5kIHBhY2thZ2luZyBkZWNpc2lvbnMuCgpUaGlzIHJlcG9ydCBwcmVzZW50cyB0aGUgcmVzdWx0cyBvZiBhIGNvbnN1bWVyIHN1cnZleSBjb25kdWN0ZWQgdmlhIEdvb2dsZSBGb3JtcyBhbmQgYXBwbGllcyBhIHJhdGluZy1iYXNlZCBjb25qb2ludCBtb2RlbCB0byBlc3RpbWF0ZSB0aGUgcmVsYXRpdmUgaW1wYWN0IG9mIGtleSBicmVhZCBhdHRyaWJ1dGVzIG9uIG92ZXJhbGwgcHJvZHVjdCBldmFsdWF0aW9ucy4gVGhlIGZpbmRpbmdzIGFyZSB0cmFuc2xhdGVkIGludG8gbWFuYWdlcmlhbCBpbnNpZ2h0cyB0byBzdXBwb3J0IHByb2R1Y3QgZGVzaWduLCBwYWNrYWdpbmcsIGFuZCBwcmljaW5nIGRlY2lzaW9ucyBmb3IgVU5P4oCZcyBmdXR1cmUgYnJlYWQgb2ZmZXJpbmdzLgoKKipSZXNlYXJjaCBPYmplY3RpdmVzKioKClRoZSBtYWluIG9iamVjdGl2ZXMgb2YgdGhpcyBzdHVkeSBhcmU6CgotIFRvIHVuZGVyc3RhbmQgY29uc3VtZXIgcHJlZmVyZW5jZXMgZm9yIGRpZmZlcmVudCBwYWNrYWdlZCBicmVhZCBhdHRyaWJ1dGVzLgotIFRvIGVzdGltYXRlIHRoZSByZWxhdGl2ZSBpbXBvcnRhbmNlIG9mIGJyZWFkIHR5cGUsIHNsaWNlIHR5cGUsIHBhY2thZ2luZyB0eXBlLCBhbmQgcHJpY2Ugb24gb3ZlcmFsbCBwcm9kdWN0IHJhdGluZ3MuCi0gVG8gZXZhbHVhdGUgY29uc3VtZXIgcHJpY2Ugc2Vuc2l0aXZpdHkgd2l0aGluIHRoZSBwYWNrYWdlZCBicmVhZCBjYXRlZ29yeS4KLSBUbyBkZXJpdmUgYWN0aW9uYWJsZSBtYW5hZ2VyaWFsIGluc2lnaHRzIGZvciBVTk/igJlzIHByb2R1Y3QgZGV2ZWxvcG1lbnQgYW5kIHBvc2l0aW9uaW5nIHN0cmF0ZWd5LgoKKipEYXRhIGFuZCBNZXRob2RvbG9neSBPdmVydmlldyoqCgpEYXRhIGZvciB0aGlzIHN0dWR5IHdlcmUgY29sbGVjdGVkIHRocm91Z2ggYW4gb25saW5lIGNvbnN1bWVyIHN1cnZleSBhZG1pbmlzdGVyZWQgdmlhIEdvb2dsZSBGb3Jtcy4gVGhlIHN1cnZleSBpbmNsdWRlZCBxdWVzdGlvbnMgb24gYnJlYWQgY29uc3VtcHRpb24gaGFiaXRzLCBicmFuZCBwZXJjZXB0aW9ucywgcHVyY2hhc2UgaW50ZW50aW9ucywgYW5kIGEgY29uam9pbnQgZXhwZXJpbWVudCBkZXNpZ25lZCB0byBldmFsdWF0ZSB0cmFkZS1vZmZzIGJldHdlZW4gZGlmZmVyZW50IGJyZWFkIGF0dHJpYnV0ZXMuCgpUaGUgY29uam9pbnQgZGF0YSB3ZXJlIHJlc2hhcGVkIGludG8gYSBsb25nIGZvcm1hdCBzdWl0YWJsZSBmb3IgYW5hbHlzaXMgYW5kIGFuYWx5emVkIHVzaW5nIGEgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwgKHJhdGluZy1iYXNlZCBjb25qb2ludCBhbmFseXNpcykuIFRoZSBkZXBlbmRlbnQgdmFyaWFibGUgaXMgdGhlIG92ZXJhbGwgcHJvZHVjdCByYXRpbmcsIHdoaWxlIHRoZSBpbmRlcGVuZGVudCB2YXJpYWJsZXMgaW5jbHVkZSBicmVhZCB0eXBlLCBzbGljZSB0eXBlLCBwYWNrYWdpbmcgdHlwZSwgYW5kIHByaWNlLgoKQWRkaXRpb25hbCBzdXJ2ZXkgcXVlc3Rpb25zIHdlcmUgb3JnYW5pemVkIGludG8gdGhlbWF0aWMgc2VjdGlvbnMgYW5kIGFuYWx5emVkIGRlc2NyaXB0aXZlbHkgdG8gY29tcGxlbWVudCB0aGUgY29uam9pbnQgZmluZGluZ3MuCgojIyBDb25qb2ludCBBbmFseXNpcyAoUmF0aW5nLUJhc2VkKQoKIyMjIFB1cnBvc2Ugb2YgdGhlIGNvbmpvaW50IGFuYWx5c2lzClRvIHVuZGVyc3RhbmQgaG93IGNvbnN1bWVycyB0cmFkZSBvZmYgZGlmZmVyZW50IGJyZWFkIGF0dHJpYnV0ZXMsIHdlIHVzZWQgYSByYXRpbmctYmFzZWQgY29uam9pbnQgYXBwcm9hY2guIEVhY2ggcmVzcG9uZGVudCBldmFsdWF0ZWQgbXVsdGlwbGUgcHJvZHVjdCBwcm9maWxlcyB0aGF0IGRpZmZlcmVkIGluICoqQnJlYWQgVHlwZSoqLCAqKlNsaWNlIFR5cGUqKiwgKipQYWNrYWdlIFR5cGUqKiwgYW5kICoqUHJpY2UqKi4gV2UgdGhlbiBlc3RpbWF0ZWQgdGhlIGF2ZXJhZ2UgaW1wYWN0IChwYXJ0LXdvcnRoIHV0aWxpdHkpIG9mIGVhY2ggYXR0cmlidXRlIGxldmVsIG9uIG92ZXJhbGwgcHJvZHVjdCByYXRpbmdzLgoKIyMjIE1vZGVsIHNwZWNpZmljYXRpb24KV2UgZXN0aW1hdGVkIHRoZSBmb2xsb3dpbmcgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWw6CgojIyBDb25qb2ludCBBbmFseXNpcyAoUmF0aW5nLUJhc2VkKQoKIyMjIFB1cnBvc2Ugb2YgdGhlIGNvbmpvaW50IGFuYWx5c2lzClRvIHVuZGVyc3RhbmQgaG93IGNvbnN1bWVycyB0cmFkZSBvZmYgZGlmZmVyZW50IGJyZWFkIGF0dHJpYnV0ZXMsIHdlIHVzZWQgYSByYXRpbmctYmFzZWQgY29uam9pbnQgYXBwcm9hY2guIEVhY2ggcmVzcG9uZGVudCBldmFsdWF0ZWQgbXVsdGlwbGUgcHJvZHVjdCBwcm9maWxlcyB0aGF0IGRpZmZlcmVkIGluICoqQnJlYWQgVHlwZSoqLCAqKlNsaWNlIFR5cGUqKiwgKipQYWNrYWdlIFR5cGUqKiwgYW5kICoqUHJpY2UqKi4gV2UgdGhlbiBlc3RpbWF0ZWQgdGhlIGF2ZXJhZ2UgaW1wYWN0IChwYXJ0LXdvcnRoIHV0aWxpdHkpIG9mIGVhY2ggYXR0cmlidXRlIGxldmVsIG9uIG92ZXJhbGwgcHJvZHVjdCByYXRpbmdzLgoKIyMjIE1vZGVsIHNwZWNpZmljYXRpb24KV2UgZXN0aW1hdGVkIHRoZSBmb2xsb3dpbmcgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWw6CgpcWwpSYXRpbmcgPSBcYmV0YV8wICsgXGJldGFfMShCcmVhZFwgVHlwZSkgKyBcYmV0YV8yKFNsaWNlXCBUeXBlKSArIFxiZXRhXzMoUHJpY2UpICsgXGJldGFfNChQYWNrYWdlXCBUeXBlKSArIFx2YXJlcHNpbG9uClxdCgojIyMgUmVncmVzc2lvbiByZXN1bHRzIChwYXJ0LXdvcnRoIHV0aWxpdGllcykKVGhlIG1vZGVsIGlzIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgb3ZlcmFsbCAoRi10ZXN0IHAgPCAwLjAwMSksIHN1Z2dlc3RpbmcgdGhhdCB0aGUgaW5jbHVkZWQgYXR0cmlidXRlcyBjb2xsZWN0aXZlbHkgZXhwbGFpbiB2YXJpYXRpb24gaW4gY29uc3VtZXIgcmF0aW5ncy4gVGhlIGFkanVzdGVkIFItc3F1YXJlZCBpcyBhcHByb3hpbWF0ZWx5IDAuMDg0LCB3aGljaCBpcyBhY2NlcHRhYmxlIGZvciBwcmVmZXJlbmNlL2NvbnN1bWVyIHJhdGluZyBkYXRhIGFuZCBpbmRpY2F0ZXMgdGhhdCB0aGUgbW9kZWwgY2FwdHVyZXMgbWVhbmluZ2Z1bCBkaXJlY3Rpb25hbCBlZmZlY3RzLgoKKipLZXkgY29lZmZpY2llbnRzIGFuZCBpbnRlcnByZXRhdGlvbjoqKgoKLSAqKkJyZWFkIFR5cGUqKgogIC0gKipXaG9sZSBncmFpbioqIGhhcyBhICoqcG9zaXRpdmUgYW5kIHNpZ25pZmljYW50KiogZWZmZWN0IG9uIHJhdGluZ3MgKCswLjM4OSwgcCA9IDAuMDAxKS4gIAogICAgVGhpcyBpbmRpY2F0ZXMgY29uc3VtZXJzIHZhbHVlIHdob2xlIGdyYWluIG9wdGlvbnMgYW5kIHBlcmNlaXZlIHRoZW0gYXMgbW9yZSBhdHRyYWN0aXZlIHRoYW4gdGhlIGJhc2VsaW5lIGJyZWFkIHR5cGUuCiAgLSAqKlRyYWRpdGlvbmFsKiogaXMgbm90IHN0YXRpc3RpY2FsbHkgZGlmZmVyZW50IGZyb20gdGhlIGJhc2VsaW5lIChwID0gMC44NzUpLCBzdWdnZXN0aW5nIGl0IGRvZXMgbm90IG1lYW5pbmdmdWxseSBpbmNyZWFzZSBwcmVmZXJlbmNlIHJlbGF0aXZlIHRvIHRoZSByZWZlcmVuY2UgbGV2ZWwuCgotICoqU2xpY2UgVHlwZSoqCiAgLSBCb3RoICoqVGhpY2sqKiAoLTAuMjk1LCBwID0gMC4wMTYpIGFuZCAqKlRoaW4qKiAoLTAuMzcyLCBwID0gMC4wMDQpIGhhdmUgKipuZWdhdGl2ZSBhbmQgc2lnbmlmaWNhbnQqKiBlZmZlY3RzLiAgCiAgICBUaGlzIGltcGxpZXMgdGhlIHJlZmVyZW5jZSBzbGljZSB0eXBlIChsaWtlbHkg4oCcc3RhbmRhcmQvbWVkaXVt4oCdKSBpcyBwcmVmZXJyZWQ7IGRldmlhdGluZyB0byB2ZXJ5IHRoaW4gb3IgdGhpY2sgc2xpY2VzIHJlZHVjZXMgcmF0aW5ncy4KCi0gKipQcmljZSoqCiAgLSBIaWdoZXIgcHJpY2VzIHJlZHVjZSByYXRpbmdzLCBlc3BlY2lhbGx5IGF0IGV4dHJlbWUgbGV2ZWxzLgogIC0gKioxNTAgVEwqKiBzaG93cyBhIHN0cm9uZyBuZWdhdGl2ZSBlZmZlY3QgKC0wLjc4OCwgcCA8IDAuMDAxKSwgaW5kaWNhdGluZyBhIGNsZWFyIHBlbmFsdHkgd2hlbiB0aGUgcHJpY2UgcmVhY2hlcyB2ZXJ5IGhpZ2ggbGV2ZWxzLgogIC0gKio1MCBUTCoqIGFsc28gcmVkdWNlcyByYXRpbmdzICgtMC4zNTAsIHAgPSAwLjAyNiksIHN1Z2dlc3RpbmcgY29uc3VtZXJzIGFyZSBzZW5zaXRpdmUgb25jZSBwcmljZSBjcm9zc2VzIGEgY2VydGFpbiB0aHJlc2hvbGQuCiAgLSAqKjI1IFRMKiogYW5kICoqMzUgVEwqKiBhcmUgbm90IHNpZ25pZmljYW50IChwID4gMC4xMCksIGltcGx5aW5nIHNtYWxsIGluY3JlYXNlcyBhdCBsb3dlciBwcmljZSBwb2ludHMgZG8gbm90IHN0cm9uZ2x5IGNoYW5nZSByYXRpbmdzIGNvbXBhcmVkIHRvIHRoZSByZWZlcmVuY2UgcHJpY2UgbGV2ZWwuCgotICoqUGFja2FnZSBUeXBlKioKICAtICoqUGxhc3RpYyBiYWcqKiBoYXMgdGhlICoqbGFyZ2VzdCBuZWdhdGl2ZSBhbmQgc2lnbmlmaWNhbnQqKiBlZmZlY3QgKC0wLjg5MiwgcCA8IDAuMDAxKS4gIAogICAgUGFja2FnaW5nIGNob2ljZSBhcHBlYXJzIHRvIGJlIGEgZG9taW5hbnQgZHJpdmVyIG9mIHByZWZlcmVuY2U6IHBsYXN0aWMgcGFja2FnaW5nIHN1YnN0YW50aWFsbHkgZGVjcmVhc2VzIGNvbnN1bWVyIGV2YWx1YXRpb25zIHJlbGF0aXZlIHRvIHRoZSByZWZlcmVuY2UgcGFja2FnZSB0eXBlLgoKIyMjIE1hbmFnZXJpYWwgaW5zaWdodHMgZnJvbSBjb25qb2ludCByZXN1bHRzCkJhc2VkIG9uIHRoZSBjb25qb2ludCBtb2RlbCwgdGhlIHN0cm9uZ2VzdCBkcml2ZXJzIG9mIGNvbnN1bWVyIHJhdGluZ3MgYXJlICoqcGFja2FnaW5nKiogYW5kICoqcHJpY2UqKiwgZm9sbG93ZWQgYnkgKipicmVhZCB0eXBlKiosIHdoaWxlICoqc2xpY2UgdHlwZSoqIGFwcGVhcnMgdG8gYmUgYSBsb3dlci1pbXBhY3QgKGh5Z2llbmUpIGF0dHJpYnV0ZS4KCkZyb20gYSBwcm9kdWN0IHN0cmF0ZWd5IHBlcnNwZWN0aXZlOgotIEZhdm9yICoqd2hvbGUgZ3JhaW4qKiB2YXJpYW50cyBmb3Igc3Ryb25nZXIgcGVyY2VpdmVkIHZhbHVlLgotIFVzZSBhICoqc3RhbmRhcmQgc2xpY2UqKiBvcHRpb24gcmF0aGVyIHRoYW4gZXh0cmVtZSB0aGluL3RoaWNrIHNsaWNpbmcuCi0gQXZvaWQgKipwbGFzdGljIGJhZyBwYWNrYWdpbmcqKjsgY29uc2lkZXIgcGFja2FnaW5nIGZvcm1hdHMgdGhhdCBzaWduYWwgcXVhbGl0eSwgZnJlc2huZXNzLCBvciBzdXN0YWluYWJpbGl0eS4KLSBNYWludGFpbiBwcmljaW5nIHdpdGhpbiBhY2NlcHRhYmxlIHJhbmdlczsgdmVyeSBoaWdoIHByaWNlcyBnZW5lcmF0ZSBhIHNoYXJwIGRyb3AgaW4gcHJlZmVyZW5jZSB1bmxlc3MganVzdGlmaWVkIGJ5IHN0cm9uZyBwcmVtaXVtIGN1ZXMuCgojIyMgU3VnZ2VzdGVkIHZpc3VhbHMgZm9yIHRoZSBwcmVzZW50YXRpb24KVG8gY29tbXVuaWNhdGUgY29uam9pbnQgZmluZGluZ3MgY2xlYXJseSwgdGhlIGZvbGxvd2luZyB2aXN1YWxzIGFyZSByZWNvbW1lbmRlZDoKLSBBICoqY29lZmZpY2llbnQgcGxvdCoqIChwYXJ0LXdvcnRoIHV0aWxpdGllcyB3aXRoIGNvbmZpZGVuY2UgaW50ZXJ2YWxzKQotIEEgKipwcmljZSBzZW5zaXRpdml0eSBjaGFydCoqIChhdmVyYWdlIHJhdGluZyBieSBwcmljZSBsZXZlbCkKLSBBICoqcGFja2FnaW5nIGltcGFjdCBjaGFydCoqIChhdmVyYWdlIHJhdGluZyBieSBwYWNrYWdlIHR5cGUpCgpgYGB7ciBwYWNrYWdlX2luc3RhbGwgfQoKbGlicmFyeShyZWFkeGwpICAgICAgIyAjIHJlYWQgRXhjZWwKbGlicmFyeShicm9vbSkgICAgICAgIyAjIHRpZHkgbW9kZWwgb3V0cHV0cwpsaWJyYXJ5KGtuaXRyKSAgICAgICAjICMga2FibGUgdGFibGVzCmxpYnJhcnkoa2FibGVFeHRyYSkgICMgIyBuaWNlciB0YWJsZXMKCmBgYAoKYGBge3IgcmVncmVzc2lvbiwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KbGlicmFyeShicm9vbSkKbGlicmFyeShnZ3Bsb3QyKQoKYnJlYWRSYXRpbmdEYXRhIDwtIHJlYWRfZXhjZWwoIkNvbmpvaW50RGF0YS54bHN4IikKcmF0aW5nUmVncmVzc2lvbiA8LSBsbShicmVhZFJhdGluZ0RhdGEkUmF0aW5nIH4gYnJlYWRSYXRpbmdEYXRhJGBCcmVhZCBUeXBlYCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYnJlYWRSYXRpbmdEYXRhJGBTbGljZSBUeXBlYCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYnJlYWRSYXRpbmdEYXRhJFByaWNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGJyZWFkUmF0aW5nRGF0YSRgUGFja2FnZSBUeXBlYCkKCnN1bW1hcnkocmF0aW5nUmVncmVzc2lvbikKYGBgCgpgYGB7ciBjb2VmLXBsb3QsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9Cgpjb2VmX2RmIDwtIHRpZHkocmF0aW5nUmVncmVzc2lvbikKCmdncGxvdChjb2VmX2RmW2NvZWZfZGYkdGVybSAhPSAiKEludGVyY2VwdCkiLCBdLCAKICAgICAgIGFlcyh4ID0gZXN0aW1hdGUsIHkgPSByZW9yZGVyKHRlcm0sIGVzdGltYXRlKSkpICsKICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBlc3RpbWF0ZSAtIDEuOTYqc3RkLmVycm9yLAogICAgICAgICAgICAgICAgICAgICB4bWF4ID0gZXN0aW1hdGUgKyAxLjk2KnN0ZC5lcnJvciksCiAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gMC4yKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGxhYnModGl0bGUgPSAiQ29uam9pbnQgUGFydC1Xb3J0aCBVdGlsaXRpZXMgKFJlZ3Jlc3Npb24gQ29lZmZpY2llbnRzKSIsCiAgICAgICB4ID0gIlV0aWxpdHkgKEltcGFjdCBvbiBSYXRpbmcpIiwKICAgICAgIHkgPSAiQXR0cmlidXRlIExldmVsIikgKwogIHRoZW1lX21pbmltYWwoKQoKYGBgCgoKIyMjIFByaWNlIHNlbnNpdGl2aXR5CgpgYGB7ciBwcmljZS1zZW5zaXRpdml0eSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KbGlicmFyeShkcGx5cikKCmJyZWFkUmF0aW5nRGF0YSAlPiUKICBncm91cF9ieShQcmljZSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fcmF0aW5nID0gbWVhbihSYXRpbmcpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBQcmljZSwgeSA9IG1lYW5fcmF0aW5nKSkgKwogIGdlb21fbGluZSgpICsKICBnZW9tX3BvaW50KHNpemUgPSAyKSArCiAgbGFicyh0aXRsZSA9ICJQcmljZSBTZW5zaXRpdml0eTogQXZlcmFnZSBSYXRpbmcgYnkgUHJpY2UiLAogICAgICAgeCA9ICJQcmljZSBMZXZlbCIsCiAgICAgICB5ID0gIkF2ZXJhZ2UgUmF0aW5nIikgKwogIHRoZW1lX21pbmltYWwoKQoKYGBgCgoKIyMjIDMpIFBhY2thZ2luZyBpbXBhY3QgKHBsYXN0aWsgZXRraXNpbmkgdnVyZ3VsYXIpCgpgYGB7ciBwYWNrYWdpbmctaW1wYWN0LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpicmVhZFJhdGluZ0RhdGEgJT4lCiAgZ3JvdXBfYnkoYFBhY2thZ2UgVHlwZWApICU+JQogIHN1bW1hcmlzZShtZWFuX3JhdGluZyA9IG1lYW4oUmF0aW5nKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gYFBhY2thZ2UgVHlwZWAsIHkgPSBtZWFuX3JhdGluZykpICsKICBnZW9tX2NvbCgpICsKICBsYWJzKHRpdGxlID0gIlBhY2thZ2luZyBJbXBhY3Q6IEF2ZXJhZ2UgUmF0aW5nIGJ5IFBhY2thZ2UgVHlwZSIsCiAgICAgICB4ID0gIlBhY2thZ2UgVHlwZSIsCiAgICAgICB5ID0gIkF2ZXJhZ2UgUmF0aW5nIikgKwogIHRoZW1lX21pbmltYWwoKQpgYGAKCmBgYHtyIGNhcnN9CnN1bW1hcnkoY2FycykKYGBgCgojIyBJbmNsdWRpbmcgUGxvdHMKCllvdSBjYW4gYWxzbyBlbWJlZCBwbG90cywgZm9yIGV4YW1wbGU6CgpgYGB7ciBwcmVzc3VyZSwgZWNobz1GQUxTRX0KcGxvdChwcmVzc3VyZSkKYGBgCgpOb3RlIHRoYXQgdGhlIGBlY2hvID0gRkFMU0VgIHBhcmFtZXRlciB3YXMgYWRkZWQgdG8gdGhlIGNvZGUgY2h1bmsgdG8gcHJldmVudCBwcmludGluZyBvZiB0aGUgUiBjb2RlIHRoYXQgZ2VuZXJhdGVkIHRoZSBwbG90Lgo=