Preprocess

Positive control: AlexaAntiMouseAb~N/A, HumanIgG1~N/A, HumanIgG2~N/A, HumanIgG3~N/A, HumanIgG4~N/A, Anti-HumanIgG1~N/A, Anti-HumanIgG2~N/A, Anti-HumanIgG3~N/A, Anti-HumanIgG4~N/A, V5control5~N/A, V5control4~N/A, V5control3~N/A, V5control2~N/A, V5control1~N/A

Negative control: Buffer, BSA~N/A, GST1~RFU:322.74, GST2~RFU:578.54, GST3~RFU:1770.2, GST4~RFU:4230.18

Preprocessing involves down-weighing the positive controls and up-weighing the negative controls. Positive controls should be ubiquotously expressed while we should expect little or no expression at the negative control spots.

Read ../rawdata/control_67336_18052013.gpr 
Read ../rawdata/control_68051_21052013.gpr 
Read ../rawdata/control_68213_11052013.gpr 
Read ../rawdata/control_68473_05062013.gpr 
Read ../rawdata/Grade_L_68204_11052013.gpr 
Read ../rawdata/Grade_L_67341_18052013.gpr 
Read ../rawdata/Grade_L_68210_13052013.gpr 
Read ../rawdata/Grade_III_67346_18052013.gpr 
Read ../rawdata/Grade_III_68001_21052013.gpr 
Read ../rawdata/Grade_III_68052_21052013.gpr 
Read ../rawdata/Grade_III_68207_11052013.gpr 
Read ../rawdata/Grade_III_68211_11052013.gpr 
Read ../rawdata/Grade_III_68476_18052013_2.gpr 
Read ../rawdata/Grade_IV_68037_21052013.gpr 
Read ../rawdata/Grade_IV_68056_21052013_2.gpr 
Read ../rawdata/Grade_IV_68209_11052013.gpr 
Read ../rawdata/Grade_IV_68212_11052013.gpr 
Read ../rawdata/Grade_IV_68481_18052013.gpr 
Read ../rawdata/Grade_IV_68055_21052013_2.gpr 
Read ../rawdata/Grade_IV_67347_18092013_2.gpr 

Intensity distribution pre normalization

Internsity distribution post normalization

PCA pre normalization

Performing principle component analysis on raw intensities, which have not been background corrected yields no separation for Low or high grade samples from the controls.

PCA post normalization

The variance explained here is only around 7.26% by the first principal component. Since the PCA plots do not show a lot of separation, we expect a handful of genes to be differentially expressed.

Heatmap post normalization

The samples are all over, with no well-defined clusters.

MDS plot post normalization

Multidimensional Scaling plot gives an overview of the level of similarity of samples. The points in the plot are placed such that their distances in the higher dimensions (if we have 10000 genes, we have 10000 dimensions) are preserved.

We do see that Grade4 samples seem to cluster together hinting that they are less heterogenous. While there is lot of heteregenity in the Grade3 samples.

Differential Expression

Since the sample size is too less, we do not remove any samples even though they look like outliers on the MDS plot.

LS0tCnRpdGxlOiAiUHJvdG9hcnJheSBDU0YgQW5hbHlzaXMiCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgZmlnX2hlaWdodDogMzAKICAgIGZpZ193aWR0aDogMzAKICBodG1sX2RvY3VtZW50OiAKICAgIGZpZ19oZWlnaHQ6IDMwCiAgICBmaWdfd2lkdGg6IDMwCiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0CmRhdGU6ICIwNC8xNy8yMDE3IgphdXRob3I6ICJTYWtldCBDaG91ZGhhcnkiCi0tLQoKCgoKIyMgUHJlcHJvY2VzcwpQb3NpdGl2ZSBjb250cm9sOiBBbGV4YUFudGlNb3VzZUFifk4vQSwgSHVtYW5JZ0cxfk4vQSwgSHVtYW5JZ0cyfk4vQSwgSHVtYW5JZ0czfk4vQSwgSHVtYW5JZ0c0fk4vQSwgQW50aS1IdW1hbklnRzF+Ti9BLCBBbnRpLUh1bWFuSWdHMn5OL0EsIEFudGktSHVtYW5JZ0czfk4vQSwgQW50aS1IdW1hbklnRzR+Ti9BLCBWNWNvbnRyb2w1fk4vQSwgVjVjb250cm9sNH5OL0EsIFY1Y29udHJvbDN+Ti9BLCBWNWNvbnRyb2wyfk4vQSwgVjVjb250cm9sMX5OL0EKCk5lZ2F0aXZlIGNvbnRyb2w6IEJ1ZmZlciwgQlNBfk4vQSwgR1NUMX5SRlU6MzIyLjc0LCBHU1QyflJGVTo1NzguNTQsIEdTVDN+UkZVOjE3NzAuMiwgR1NUNH5SRlU6NDIzMC4xOAoKUHJlcHJvY2Vzc2luZyBpbnZvbHZlcyBkb3duLXdlaWdoaW5nIHRoZSBwb3NpdGl2ZSBjb250cm9scyBhbmQgdXAtd2VpZ2hpbmcgdGhlIG5lZ2F0aXZlIGNvbnRyb2xzLiBQb3NpdGl2ZSBjb250cm9scyBzaG91bGQgYmUgdWJpcXVvdG91c2x5IGV4cHJlc3NlZCB3aGlsZSB3ZSBzaG91bGQgZXhwZWN0IGxpdHRsZSBvciBubyBleHByZXNzaW9uIGF0IHRoZSBuZWdhdGl2ZSBjb250cm9sIHNwb3RzLgoKCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlcnJvcj1GQUxTRSwgbWVzc2FnZT1GQUxTRX0Kc3VwcHJlc3NNZXNzYWdlcyhsaWJyYXJ5KGxpbW1hKSkKc3VwcHJlc3NNZXNzYWdlcyhsaWJyYXJ5KGdncGxvdDIpKQpzdXBwcmVzc01lc3NhZ2VzKGxpYnJhcnkoUkNvbG9yQnJld2VyKSkKc3VwcHJlc3NNZXNzYWdlcyhsaWJyYXJ5KGNvd3Bsb3QpKQpzdXBwcmVzc01lc3NhZ2VzKGxpYnJhcnkocGhlYXRtYXApKQpgYGAKCgpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgZXJyb3I9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CnBsb3RIZWF0TWFwIDwtIGZ1bmN0aW9uKHksIGNvbmRpdGlvbil7CiAgc2FtcGxlRGlzdHMgPC0gZGlzdCh0KGxvZzIoeSRFKSkpCiAgc2FtcGxlRGlzdE1hdHJpeCA8LSBhcy5tYXRyaXgoc2FtcGxlRGlzdHMpCiAgcm93bmFtZXMoc2FtcGxlRGlzdE1hdHJpeCkgPC0gcGFzdGUoY29uZGl0aW9uLCBjb2xuYW1lcyh5JEUpLCBzZXA9Ii0iKQogIGNvbG5hbWVzKHNhbXBsZURpc3RNYXRyaXgpIDwtIE5VTEwKICBjb2xvcnMgPC0gY29sb3JSYW1wUGFsZXR0ZSggcmV2KGJyZXdlci5wYWwoOSwgIkJsdWVzIikpICkoMjU1KQogIHBoZWF0bWFwKHNhbXBsZURpc3RNYXRyaXgsCiAgICAgICAgICAgY2x1c3RlcmluZ19kaXN0YW5jZV9yb3dzPXNhbXBsZURpc3RzLAogICAgICAgICAgY2x1c3RlcmluZ19kaXN0YW5jZV9jb2xzPXNhbXBsZURpc3RzLAogICAgICAgICAgIGNvbD1jb2xvcnMpCn0KYGBgCgpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgZXJyb3I9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CgoKd2VpZ2h0X3Nwb3RzIDwtIGZ1bmN0aW9uIChyZWNvcmQpewogICMjIEJ5IGRlZmF1bHQgd2VpZ2h0IGlzIDEKICByZWNvcmQKICB3ZWlnaHQgPC0gMSAKICBpcy5uZWdhdGl2ZSA8LSByZWNvcmRbLCAnTmFtZSddICVpbiUgYygnQnVmZmVyJywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0JTQX5OL0EnLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnR1NUMX5SRlU6MzIyLjc0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnR1NUMn5SRlU6NTc4LjU0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnR1NUM35SRlU6MTc3MC4yJywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0dTVDR+UkZVOjQyMzAuMTgnKQogIGlzLnBvc2l0aXZlIDwtIHJlY29yZFssICdOYW1lJ10gJWluJSBjKCdBbGV4YUFudGlNb3VzZUFifk4vQScsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdIdW1hbklnRzF+Ti9BJywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0h1bWFuSWdHMn5OL0EnLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSHVtYW5JZ0czfk4vQScsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdIdW1hbklnRzR+Ti9BJywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FudGktSHVtYW5JZ0cxfk4vQScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FudGktSHVtYW5JZ0cyfk4vQScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FudGktSHVtYW5JZ0czfk4vQScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FudGktSHVtYW5JZ0c0fk4vQScsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdWNWNvbnRyb2w1fk4vQScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1Y1Y29udHJvbDR+Ti9BJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVjVjb250cm9sM35OL0EnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdWNWNvbnRyb2wyfk4vQScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1Y1Y29udHJvbDF+Ti9BJykKICBpZiAoYW55KGlzLnBvc2l0aXZlKSl7CiAgICB3ZWlnaHQgPC0gMDsgIyMgRG9uJ3Qgd2VpZ2h0IGFscmVhZHkgREUgc3BvdHMKICB9CiAgZWxzZSBpZiAoYW55KGlzLm5lZ2F0aXZlKSkgewogICAgd2VpZ2h0IDwtIDI7CiAgfQogIHJldHVybih3ZWlnaHQpCn0KCmBgYAoKCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlcnJvcj1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KdGFyZ2V0cyA8LSByZWFkVGFyZ2V0cygnLi4vcmF3ZGF0YS9wcm90b2FycmF5X2NvbW1vbi5jc3YnLCBzZXA9JywnKQp0YXJnZXRzJENvbmRpdGlvbiA8LSBhcy5mYWN0b3IodGFyZ2V0cyRDb25kaXRpb24pCmBgYAoKYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVycm9yPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQp0YXJnZXRzCmBgYAoKCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlcnJvcj1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KdGFyZ2V0Q29sb3JzIDwtCiAgICB3aXRoKHRhcmdldHMsCiAgICAgICAgIGRhdGEuZnJhbWUoQ29uZGl0aW9uID0gbGV2ZWxzKENvbmRpdGlvbiksCiAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBJKGJyZXdlci5wYWwobmxldmVscyhDb25kaXRpb24pLCBuYW1lID0gJ0RhcmsyJykpKSkKeCA8LSByZWFkLm1haW1hZ2VzKHRhcmdldHMkRmlsZU5hbWUsCiAgICAgICAgICAgICAgICAgICBwYXRoPWZpbGUucGF0aCgnLi4nLCAncmF3ZGF0YScpLAogICAgICAgICAgICAgICAgICAgc291cmNlPSdnZW5lcGl4JywKICAgICAgICAgICAgICAgICAgIGNvbHVtbnM9bGlzdChHPSdGNjM1IE1lYW4nLCBHYj0nQjYzNSBNZWRpYW4nKSwKICAgICAgICAgICAgICAgICAgIGdyZWVuLm9ubHk9VFJVRSkjLAogICAgICAgICAgICAgICAgICAgI3d0LmZ1biA9IHdlaWdodF9zcG90cykKCgpgYGAKIyMgSW50ZW5zaXR5IGRpc3RyaWJ1dGlvbiBwcmUgbm9ybWFsaXphdGlvbgoKCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlcnJvcj1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KbmVnYXRpdmUuY29udHJvbHMgPC0geCRnZW5lcyROYW1lICVpbiUgYygnQnVmZmVyJywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0JTQX5OL0EnLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnR1NUMX5SRlU6MzIyLjc0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnR1NUMn5SRlU6NTc4LjU0JywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0dTVDN+UkZVOjE3NzAuMicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0dTVDR+UkZVOjQyMzAuMTgnKQpwb3NpdGl2ZS5jb250cm9scyA8LSB4JGdlbmVzJE5hbWUgJWluJSBjKCdBbGV4YUFudGlNb3VzZUFifk4vQScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0h1bWFuSWdHMX5OL0EnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdIdW1hbklnRzJ+Ti9BJywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0h1bWFuSWdHM35OL0EnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdIdW1hbklnRzR+Ti9BJywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FudGktSHVtYW5JZ0cxfk4vQScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FudGktSHVtYW5JZ0cyfk4vQScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FudGktSHVtYW5JZ0czfk4vQScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FudGktSHVtYW5JZ0c0fk4vQScsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdWNWNvbnRyb2w1fk4vQScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1Y1Y29udHJvbDR+Ti9BJywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1Y1Y29udHJvbDN+Ti9BJywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1Y1Y29udHJvbDJ+Ti9BJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVjVjb250cm9sMX5OL0EnKQoKY29udHJvbHMucHJvdG9hcnJheSA8LSBjKCdCdWZmZXInLCAKICAgICAgICAgICAgICAgICAgICAgICAgICdCU0F+Ti9BJywgCiAgICAgICAgICAgICAgICAgICAgICAgICAnR1NUMX5SRlU6MzIyLjc0JywKICAgICAgICAgICAgICAgICAgICAgICAgICdHU1QyflJGVTo1NzguNTQnLCAKICAgICAgICAgICAgICAgICAgICAgICAgICdHU1QzflJGVToxNzcwLjInLAogICAgICAgICAgICAgICAgICAgICAgICAgJ0dTVDR+UkZVOjQyMzAuMTgnLAogICAgICAgICAgICAgICAgICAgICAgICAgJ0FsZXhhQW50aU1vdXNlQWJ+Ti9BJywKICAgICAgICAgICAgICAgICAgICAgICAgICdIdW1hbklnRzF+Ti9BJywKICAgICAgICAgICAgICAgICAgICAgICAgICdIdW1hbklnRzJ+Ti9BJywgCiAgICAgICAgICAgICAgICAgICAgICAgICAnSHVtYW5JZ0czfk4vQScsCiAgICAgICAgICAgICAgICAgICAgICAgICAnSHVtYW5JZ0c0fk4vQScsIAogICAgICAgICAgICAgICAgICAgICAgICAgJ0FudGktSHVtYW5JZ0cxfk4vQScsCiAgICAgICAgICAgICAgICAgICAgICAgICAnQW50aS1IdW1hbklnRzJ+Ti9BJywKICAgICAgICAgICAgICAgICAgICAgICAgICdBbnRpLUh1bWFuSWdHM35OL0EnLAogICAgICAgICAgICAgICAgICAgICAgICAgJ0FudGktSHVtYW5JZ0c0fk4vQScsIAogICAgICAgICAgICAgICAgICAgICAgICAgJ1Y1Y29udHJvbDV+Ti9BJywKICAgICAgICAgICAgICAgICAgICAgICAgICdWNWNvbnRyb2w0fk4vQScsIAogICAgICAgICAgICAgICAgICAgICAgICAgJ1Y1Y29udHJvbDN+Ti9BJywgCiAgICAgICAgICAgICAgICAgICAgICAgICAnVjVjb250cm9sMn5OL0EnLAogICAgICAgICAgICAgICAgICAgICAgICAgJ1Y1Y29udHJvbDF+Ti9BJwogICAgICAgICAgICAgICAgICAgICAgICAgKQpjbGVhbl9uYW1lIDwtIGZ1bmN0aW9uKG5hbWUpewogIGlmIChuYW1lICVpbiUgY29udHJvbHMucHJvdG9hcnJheSl7CiAgICByZXR1cm4obmFtZSkKICB9CiAgbmFtZSA8LSBzdHJzcGxpdChuYW1lLCAiOiIpW1sxXV1bMl0KICBuYW1lIDwtIHN0cnNwbGl0KG5hbWUsICJ+IilbWzFdXVsxXQogIHJldHVybihuYW1lKQp9CiNwYXIobWZyb3c9YygxLDIpKQpuZXdfbmFtZSA8LSBzYXBwbHkoYXMudmVjdG9yKHgkZ2VuZXMkTmFtZSksIGNsZWFuX25hbWUpCngkZ2VuZXMkSUQgPC0gbmV3X25hbWUKeCRnZW5lcyRJRCA8LSAgZ3N1YignXFwuLionLCAnJywgeCRnZW5lcyRJRCkKCmJveHBsb3QobG9nMih4JEVbbmVnYXRpdmUuY29udHJvbHMsXSksbGFzPTIsIG1haW49Ik5lZ2F0aXZlIENvbnRyb2xzIHJhdyBpbnRlbnNpdGllcyIseWxhYj0ibG9nMi1pbnRlbnNpdHkiLCBjZXguYXhpcz0wLjcpCnBhcihtYXI9Yyg4LDQsNCw0KSsuMSkKCmJveHBsb3QobG9nMih4JEVbcG9zaXRpdmUuY29udHJvbHMsXSksbGFzPTIsIG1haW49IlBvc2l0aXZlIENvbnRyb2xzIHJhdyBpbnRlbnNpdGllcyIseWxhYj0ibG9nMi1pbnRlbnNpdHkiLCBjZXguYXhpcz0wLjcpCmBgYAoKIyMgSW50ZXJuc2l0eSBkaXN0cmlidXRpb24gcG9zdCBub3JtYWxpemF0aW9uCgpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgZXJyb3I9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CngkZ2VuZXMkU3RhdHVzICA8LSByZXAoJ3JlZ3VsYXInLCBucm93KHgpKQp4JGdlbmVzJFN0YXR1c1twb3NpdGl2ZS5jb250cm9sc10gPC0gJ1BPU0lUSVZFJwp4JGdlbmVzJFN0YXR1c1tuZWdhdGl2ZS5jb250cm9sc10gPC0gJ05FR0FUSVZFJwp5IDwtIG5lcWMoeCkKCnBhcihtYXI9Yyg4LDQsNCw0KSsuMSkKCmJveHBsb3QobG9nMih4JEUpLGxhcz0yLCBtYWluPSJQcmUtbm9ybWFsaXphdGlvbiBpbnRlbnNpdGllcyIseWxhYj0ibG9nMi1pbnRlbnNpdHkiLCBjb2w9dGFyZ2V0Q29sb3JzJGNvbG9yW21hdGNoKHRhcmdldHNbY29sbmFtZXMoeCRFKSxdJENvbmRpdGlvbiwgdGFyZ2V0Q29sb3JzJENvbmRpdGlvbildLCBwY2g9MTksIGNleC5heGlzPTAuNywgY2V4PTAuNykKCnBhcihtYXI9Yyg4LDQsNCw0KSsuMSkKYm94cGxvdChsb2cyKHkkRSksbGFzPTIsIG1haW49IlBvc3Qtbm9ybWFsaXphdGlvbiBpbnRlbnNpdGllcyIseWxhYj0ibG9nMi1pbnRlbnNpdHkiLCBjb2w9dGFyZ2V0Q29sb3JzJGNvbG9yW21hdGNoKHRhcmdldHNbY29sbmFtZXMoeCRFKSxdJENvbmRpdGlvbiwgdGFyZ2V0Q29sb3JzJENvbmRpdGlvbildLCBwY2g9MTksIGNleC5heGlzPTAuNywgY2V4PTAuNykKYGBgCgoKIyMgUENBIHByZSBub3JtYWxpemF0aW9uCgpQZXJmb3JtaW5nIHByaW5jaXBsZSBjb21wb25lbnQgYW5hbHlzaXMgb24gcmF3IGludGVuc2l0aWVzLCB3aGljaCBoYXZlIG5vdCBiZWVuIGJhY2tncm91bmQgY29ycmVjdGVkIHlpZWxkcyBubyBzZXBhcmF0aW9uIGZvciBMb3cgb3IgaGlnaCBncmFkZSBzYW1wbGVzIGZyb20gdGhlIGNvbnRyb2xzLgoKCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlcnJvcj1GQUxTRSwgbWVzc2FnZT1GQUxTRX0Kb3BhciA8LSBwYXIocGNoID0gMTkpCgpwYyA9IHByY29tcCggdCggeCRFICApLCBzY2FsZT1UUlVFICkKcGMuc3VtbWFyeSA8LSBzdW1tYXJ5KHBjKQpwYzEudmFyIDwtIHBjLnN1bW1hcnkkaW1wb3J0YW5jZVsyLDFdCnBjMi52YXIgPC0gcGMuc3VtbWFyeSRpbXBvcnRhbmNlWzIsMl0KCnBsb3QocGMkeFssIDE6Ml0sIAogICAgIGNvbD10YXJnZXRDb2xvcnMkY29sb3JbbWF0Y2godGFyZ2V0cyRDb25kaXRpb24sIHRhcmdldENvbG9ycyRDb25kaXRpb24pXSwgCiAgICAgY2V4PTEuNSwgCiAgICAgeGxhYiA9IHBhc3RlKCdQQzE6ICcsIDEwMCpwYzEudmFyLCAnJScsIHNlcD0nJyksIAogICAgIHlsYWIgPSAgcGFzdGUoJ1BDMjogJywgMTAwKnBjMi52YXIsICclJywgc2VwPScnKSwKICAgICBtYWluPSAiUENBIG9uIHJhdyBpbnRlbnNpdGllcyIpCgpsZWdlbmQoeCA9ICd0b3ByaWdodCcsIAogICAgICAgbGVnZW5kID0gYXMuY2hhcmFjdGVyKHRhcmdldENvbG9ycyRDb25kaXRpb24pLAogICAgICAgY29sID0gdGFyZ2V0Q29sb3JzJGNvbG9yLCBwY2ggPSBwYXIoInBjaCIpLCBidHkgPSAnbicsIHhqdXN0ID0gMSkKCmBgYAoKIyMgUENBIHBvc3Qgbm9ybWFsaXphdGlvbgoKYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVycm9yPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQpvcGFyIDwtIHBhcihwY2ggPSAxOSkKCnBjID0gcHJjb21wKCB0KCB5JEUgICksIHNjYWxlPVRSVUUgKQpwYy5zdW1tYXJ5IDwtIHN1bW1hcnkocGMpCnBjMS52YXIgPC0gcGMuc3VtbWFyeSRpbXBvcnRhbmNlWzIsMV0KcGMyLnZhciA8LSBwYy5zdW1tYXJ5JGltcG9ydGFuY2VbMiwyXQoKcGxvdChwYyR4WywgMToyXSwgY29sPXRhcmdldENvbG9ycyRjb2xvclttYXRjaCh0YXJnZXRzJENvbmRpdGlvbiwgdGFyZ2V0Q29sb3JzJENvbmRpdGlvbildLCBjZXg9MS41LCB4bGFiID0gcGFzdGUoJ1BDMTogJywgMTAwKnBjMS52YXIsICclJywgc2VwPScnKSwgeWxhYiA9ICBwYXN0ZSgnUEMyOiAnLCAxMDAqcGMyLnZhciwgJyUnLCBzZXA9JycpLCAgICAgbWFpbj0gIlBDQSBvbiBiYWNrZ3JvdW5kIGNvcnJlY3RlZCBhbmQgbm9ybWFsaXplZCBpbnRlbnNpdGllcyIpCmxlZ2VuZCh4ID0gJ3RvcGxlZnQnLCAKICAgICAgIGxlZ2VuZCA9IGFzLmNoYXJhY3Rlcih0YXJnZXRDb2xvcnMkQ29uZGl0aW9uKSwKICAgICAgIGNvbCA9IHRhcmdldENvbG9ycyRjb2xvciwgcGNoID0gcGFyKCJwY2giKSwgYnR5ID0gJ24nLCB4anVzdCA9IDEpCmBgYApUaGUgdmFyaWFuY2UgZXhwbGFpbmVkIGhlcmUgaXMgb25seSBhcm91bmQgNy4yNiUgYnkgdGhlIGZpcnN0IHByaW5jaXBhbCBjb21wb25lbnQuClNpbmNlIHRoZSBQQ0EgcGxvdHMgZG8gbm90IHNob3cgYSBsb3Qgb2Ygc2VwYXJhdGlvbiwgd2UgZXhwZWN0IGEgaGFuZGZ1bCBvZiBnZW5lcyB0byBiZSBkaWZmZXJlbnRpYWxseSBleHByZXNzZWQuCgojIyBIZWF0bWFwIHBvc3Qgbm9ybWFsaXphdGlvbgpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgZXJyb3I9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CnBsb3RIZWF0TWFwKHksIHRhcmdldHMkQ29uZGl0aW9uKQpgYGAKClRoZSBzYW1wbGVzIGFyZSBhbGwgb3Zlciwgd2l0aCBubyB3ZWxsLWRlZmluZWQgY2x1c3RlcnMuCgoKCgojIyBNRFMgcGxvdCBwb3N0IG5vcm1hbGl6YXRpb24KCk11bHRpZGltZW5zaW9uYWwgU2NhbGluZyBwbG90IGdpdmVzIGFuIG92ZXJ2aWV3IG9mIHRoZSBsZXZlbCBvZiBzaW1pbGFyaXR5IG9mIHNhbXBsZXMuIFRoZSBwb2ludHMgaW4gdGhlIHBsb3QgYXJlIHBsYWNlZCBzdWNoIHRoYXQgdGhlaXIgZGlzdGFuY2VzIGluIHRoZSBoaWdoZXIgZGltZW5zaW9ucyAoaWYgd2UgaGF2ZSAxMDAwMCBnZW5lcywgd2UgaGF2ZSAxMDAwMCBkaW1lbnNpb25zKSBhcmUgcHJlc2VydmVkLgoKYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVycm9yPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQpvcGFyIDwtIHBhcihwY2ggPSAxOSkKcGxvdE1EUyh5LCAgY29sPXRhcmdldENvbG9ycyRjb2xvclttYXRjaCh0YXJnZXRzJENvbmRpdGlvbiwgdGFyZ2V0Q29sb3JzJENvbmRpdGlvbildLCBjZXg9MS4yLCBwY2g9MTkpCmxlZ2VuZCh4ID0gJ3RvcHJpZ2h0JywgCiAgICAgICBsZWdlbmQgPSBhcy5jaGFyYWN0ZXIodGFyZ2V0Q29sb3JzJENvbmRpdGlvbiksCiAgICAgICBjb2wgPSB0YXJnZXRDb2xvcnMkY29sb3IsIHBjaCA9IHBhcigicGNoIiksIGJ0eSA9ICduJywgeGp1c3QgPSAxKQoKYGBgCgoKV2UgZG8gc2VlIHRoYXQgR3JhZGU0IHNhbXBsZXMgc2VlbSB0byBjbHVzdGVyIHRvZ2V0aGVyIGhpbnRpbmcgdGhhdCB0aGV5IGFyZSBsZXNzIGhldGVyb2dlbm91cy4gV2hpbGUgdGhlcmUgaXMgbG90IG9mIGhldGVyZWdlbml0eSBpbiB0aGUgR3JhZGUzIHNhbXBsZXMuCgojIyBEaWZmZXJlbnRpYWwgRXhwcmVzc2lvbgoKU2luY2UgdGhlIHNhbXBsZSBzaXplIGlzIHRvbyBsZXNzLCB3ZSBkbyBub3QgcmVtb3ZlIGFueSBzYW1wbGVzIGV2ZW4gdGhvdWdoIHRoZXkgbG9vayBsaWtlIG91dGxpZXJzIG9uIHRoZSBNRFMgcGxvdC4KCgpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgZXJyb3I9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CiBmIDwtIGZhY3Rvcih0YXJnZXRzJENvbmRpdGlvbiwgbGV2ZWxzID0gdW5pcXVlKHRhcmdldHMkQ29uZGl0aW9uKSkKIGRlc2lnbiA8LSBtb2RlbC5tYXRyaXgofjAgKyBmKQogY29sbmFtZXMoZGVzaWduKSA8LSBsZXZlbHMoZikKYGBgCgoKYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVycm9yPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQpjb3JmaXQgPC0gZHVwbGljYXRlQ29ycmVsYXRpb24oeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2lnbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5kdXBzPTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjaW5nPTEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKZml0IDwtIGxtRml0KHksCiAgICAgICAgICAgICBkZXNpZ24sCiAgICAgICAgICAgICBuZHVwcz0yLAogICAgICAgICAgICAgY29ycmVsYXRpb249Y29yZml0JGNvbnNlbnN1cy5jb3JyZWxhdGlvbikKCmNvbnRyYXN0Lm1hdHJpeCA8LSBtYWtlQ29udHJhc3RzKEdyYWRlMnZzR3JhZGUxPUdyYWRlMi1HcmFkZTEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFkZTN2c0dyYWRlMj1HcmFkZTMtR3JhZGUyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhZGU0dnNHcmFkZTM9R3JhZGU0LUdyYWRlMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhZGUxdnNDb250cm9sPUdyYWRlMS1Db250cm9sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFkZTJ2c0NvbnRyb2w9R3JhZGUyLUNvbnRyb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWRlM3ZzQ29udHJvbD1HcmFkZTMtQ29udHJvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhZGU0dnNDb250cm9sPUdyYWRlNC1Db250cm9sLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFkZXZzQ29udHJvbD0oR3JhZGUxK0dyYWRlMitHcmFkZTMrR3JhZGU0KS80LUNvbnRyb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhpZ2hHcmFkZXZzQ29udHJvbD0oR3JhZGUzK0dyYWRlNCkvMi1Db250cm9sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb3dHcmFkZXZzQ29udHJvbD0oR3JhZGUxK0dyYWRlMikvMi1Db250cm9sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIaWdoR3JhZGV2c0xvd0dyYWRlPShHcmFkZTMrR3JhZGU0KS8yLShHcmFkZTErR3JhZGUyKS8yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFkZTN2c0xvd0dyYWRlPUdyYWRlMy0oR3JhZGUxK0dyYWRlMikvMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhZGU0dnNMb3dHcmFkZT1HcmFkZTQtKEdyYWRlMStHcmFkZTIpLzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscz1kZXNpZ24pCmZpdDIgPC0gY29udHJhc3RzLmZpdChmaXQsIGNvbnRyYXN0Lm1hdHJpeCkKZml0MiA8LSBlQmF5ZXMoZml0MikKY29lZnMgPC0gYygnR3JhZGUydnNHcmFkZTEnLAogICAgICAgICAgICdHcmFkZTN2c0dyYWRlMicsCiAgICAgICAgICAgJ0dyYWRlNHZzR3JhZGUzJywKICAgICAgICAgICAnR3JhZGUxdnNDb250cm9sJywKICAgICAgICAgICAnR3JhZGUydnNDb250cm9sJywKICAgICAgICAgICAnR3JhZGUzdnNDb250cm9sJywKICAgICAgICAgICAnR3JhZGU0dnNDb250cm9sJywKICAgICAgICAgICAnR3JhZGV2c0NvbnRyb2wnLAogICAgICAgICAgICdIaWdoR3JhZGV2c0NvbnRyb2wnLAogICAgICAgICAgICdMb3dHcmFkZXZzQ29udHJvbCcsCiAgICAgICAgICAgJ0hpZ2hHcmFkZXZzTG93R3JhZGUnLAogICAgICAgICAgICdHcmFkZTN2c0xvd0dyYWRlJywKICAgICAgICAgICAnR3JhZGU0dnNMb3dHcmFkZScpCmV4cHJlc3Npb25WYWx1ZXMgPC0gYXMuZGF0YS5mcmFtZSh5JEUpCndyaXRlLnRhYmxlKGV4cHJlc3Npb25WYWx1ZXMsIAogICAgICAgICAgICBmaWxlLnBhdGgoJy4uJywgICdyZXN1bHRzX3Byb3RvYXJyYXlfMDQxNjIwMTcnLHBhc3RlKCdwcm90b2FycmF5X25vcm1hbGl6ZWRfdmFsdWVzJywnY3N2Jywgc2VwPScuJykgKSkKZm9yIChjb2VmIGluIGNvZWZzKXsKICB0dCA8LSB0b3BUYWJsZShmaXQyLCBjb2VmPWNvZWYsIG51bWJlciA9IEluZikKICB0dC5zaWcgPC0gc3Vic2V0KHR0LCB0dCRhZGouUC5WYWw8MC4xKQogIHdyaXRlLnRhYmxlKHR0LCBmaWxlLnBhdGgoJy4uJywgJ3Jlc3VsdHNfcHJvdG9hcnJheV8wNDE2MjAxNycsIHBhc3RlKGNvZWYsJ2NzdicsIHNlcD0nLicpICksIHJvdy5uYW1lcyA9IEZBTFNFKQogIHdyaXRlLnRhYmxlKHR0LnNpZywgZmlsZS5wYXRoKCcuLicsICdyZXN1bHRzX3Byb3RvYXJyYXlfMDQxNjIwMTcnLCAnc2lnbmlmaWNhbnRfZmlsdGVyZWQnLCBwYXN0ZShjb2VmLCdjc3YnLCBzZXA9Jy4nKSApLCByb3cubmFtZXMgPSBGQUxTRSkKfQoKYGBgCg==