diff --git a/StudentNotebooks/Assignment07_DraftFinalProjectNotebook/peterc_finalProjectF24_roughdraft.Rmd b/StudentNotebooks/Assignment07_DraftFinalProjectNotebook/peterc_finalProjectF24_roughdraft.Rmd index ff5cb22..f72010e 100644 --- a/StudentNotebooks/Assignment07_DraftFinalProjectNotebook/peterc_finalProjectF24_roughdraft.Rmd +++ b/StudentNotebooks/Assignment07_DraftFinalProjectNotebook/peterc_finalProjectF24_roughdraft.Rmd @@ -3,16 +3,16 @@ title: "Data Analytics Research Individual Final Project Report - Mars" author: "Charlotte Peterson" date: "Fall 2024" output: - pdf_document: - toc: yes - toc_depth: '3' - html_notebook: default html_document: toc: yes toc_depth: 3 toc_float: yes number_sections: yes theme: united + html_notebook: default + pdf_document: + toc: yes + toc_depth: '3' --- @@ -155,10 +155,10 @@ This helped answer the question of how can we correlate the LIBS and PIXL data s Here is a list data sets, codes, that are used in your work. Along with brief description and URL where they are located. 1. peterc-finalProjectF24.Rmd (with knit pdf and html) is this notebook. -[https://github.rpi.edu/DataINCITE/DAR-Mars-F24/tree/main/StudentNotebooks/Assignment07/peterc-finalProjectF24.Rmd](https://github.rpi.edu/DataINCITE/DAR-Mars-F24/tree/main/StudentNotebooks/Assignment07/rcsid-finalProjectF24.Rmd) +[https://github.rpi.edu/DataINCITE/DAR-Mars-F24/blob/main/StudentNotebooks/Assignment07_DraftFinalProjectNotebook/peterc_finalProjectF24_roughdraft.Rmd](https://github.rpi.edu/DataINCITE/DAR-Mars-F24/blob/main/StudentNotebooks/Assignment07_DraftFinalProjectNotebook/peterc_finalProjectF24_roughdraft.Rmd) 2. v1_libs_to_sample.Rds is the combined data set of PIXL and LIBS that includes the distance from a PIXL abrasion to a LIBS sample. -[https://github.rpi.edu/DataINCITE/DAR-Mars-F24/blob/main/StudentData/v1_libs_to_sample.Rds](https://github.rpi.edu/DataINCITE/DAR-Mars-F24/blob/main/StudentData/PIXL_LIBS_Combined.Rds). +[https://github.rpi.edu/DataINCITE/DAR-Mars-F24/blob/main/StudentData/v1_libs_to_sample.Rds](https://github.rpi.edu/DataINCITE/DAR-Mars-F24/blob/main/StudentData/v1_libs_to_sample.Rds). Firstly, we set the number of meters distance threshold between a PIXL abrasion and LIBS sample. Within the v1_libs_to_sample.Rds, which Margo and I collaborated on there is a distance variable that is set via a function that Margo created to measure the distance between a PIXL abrasion and LIBS sample using their latitude and longitude coordinates. ```{r} @@ -234,10 +234,10 @@ Using the LIBS and PIXL combined data set, I created a plot of the composition p Here is a list data sets, codes, that are used in your work. Along with brief description and URL where they are located. 1. peterc_finalProjectF24.Rmd (with knit pdf and html) is this notebook. -[https://github.rpi.edu/DataINCITE/DAR-Mars-F24/tree/main/StudentNotebooks/Assignment07/peterc_finalProjectF24.Rmd](https://github.rpi.edu/DataINCITE/DAR-Mars-F24/tree/main/StudentNotebooks/Assignment07/peterc_finalProjectF24.Rmd) +[https://github.rpi.edu/DataINCITE/DAR-Mars-F24/blob/main/StudentNotebooks/Assignment07_DraftFinalProjectNotebook/peterc_finalProjectF24_roughdraft.Rmd](https://github.rpi.edu/DataINCITE/DAR-Mars-F24/blob/main/StudentNotebooks/Assignment07_DraftFinalProjectNotebook/peterc_finalProjectF24_roughdraft.Rmd) 2. peterc_assignment5.Rmd (with knit pdf and html) which is my previous notebook. -[https://github.rpi.edu/DataINCITE/DAR-Mars-F24/tree/main/StudentNotebooks/Assignment05/peterc_assigment05.Rmd](https://github.rpi.edu/DataINCITE/DAR-Mars-F24/tree/main/StudentNotebooks/Assignment05/peterc_-finalProjectF24_assignment05.Rmd) +[https://github.rpi.edu/DataINCITE/DAR-Mars-F24/tree/main/StudentNotebooks/Assignment05/peterc_assignment05.Rmd](https://github.rpi.edu/DataINCITE/DAR-Mars-F24/tree/main/StudentNotebooks/Assignment05/peterc_assignment05.Rmd]) 3. supercam_libs_moc_loc.Rds which is the original LIBS data given to our research group. [https://github.rpi.edu/DataINCITE/DAR-Mars-F24/blob/main/Data/supercam_libs_moc_loc.Rds](https://github.rpi.edu/DataINCITE/DAR-Mars-F24/blob/main/Data/supercam_libs_moc_loc.Rds) @@ -438,7 +438,7 @@ Using the LIBS and PIXL combined data set, we created a ternary plot to show the Here is a list data sets, codes, that are used in your work. Along with brief description and URL where they are located. 1. peterc-finalProjectF24.Rmd (with knit pdf and html) is this notebook. -[https://github.rpi.edu/DataINCITE/DAR-Mars-F24/tree/main/StudentNotebooks/Assignment07/peterc-finalProjectF24.Rmd](https://github.rpi.edu/DataINCITE/DAR-Mars-F24/tree/main/StudentNotebooks/Assignment07/rcsid-finalProjectF24.Rmd) +[https://github.rpi.edu/DataINCITE/DAR-Mars-F24/blob/main/StudentNotebooks/Assignment07_DraftFinalProjectNotebook/peterc_finalProjectF24_roughdraft.Rmd](https://github.rpi.edu/DataINCITE/DAR-Mars-F24/blob/main/StudentNotebooks/Assignment07_DraftFinalProjectNotebook/peterc_finalProjectF24_roughdraft.Rmd) 2. supercam_libs_moc_loc.Rds which is the original LIBS data given to our research group. [https://github.rpi.edu/DataINCITE/DAR-Mars-F24/blob/main/Data/supercam_libs_moc_loc.Rds](https://github.rpi.edu/DataINCITE/DAR-Mars-F24/blob/main/Data/supercam_libs_moc_loc.Rds) diff --git a/StudentNotebooks/Assignment07_DraftFinalProjectNotebook/peterc_finalProjectF24_roughdraft.html b/StudentNotebooks/Assignment07_DraftFinalProjectNotebook/peterc_finalProjectF24_roughdraft.html index 6e74b7d..69e10cd 100644 --- a/StudentNotebooks/Assignment07_DraftFinalProjectNotebook/peterc_finalProjectF24_roughdraft.html +++ b/StudentNotebooks/Assignment07_DraftFinalProjectNotebook/peterc_finalProjectF24_roughdraft.html @@ -1614,10 +1614,10 @@

5.1 3.1 Data, Code, and with brief description and URL where they are located.

  1. peterc-finalProjectF24.Rmd (with knit pdf and html) is this -notebook. https://github.rpi.edu/DataINCITE/DAR-Mars-F24/tree/main/StudentNotebooks/Assignment07/peterc-finalProjectF24.Rmd

  2. +notebook. https://github.rpi.edu/DataINCITE/DAR-Mars-F24/blob/main/StudentNotebooks/Assignment07_DraftFinalProjectNotebook/peterc_finalProjectF24_roughdraft.Rmd

  3. v1_libs_to_sample.Rds is the combined data set of PIXL and LIBS that includes the distance from a PIXL abrasion to a LIBS sample.
    -https://github.rpi.edu/DataINCITE/DAR-Mars-F24/blob/main/StudentData/v1_libs_to_sample.Rds.

  4. +https://github.rpi.edu/DataINCITE/DAR-Mars-F24/blob/main/StudentData/v1_libs_to_sample.Rds.

Firstly, we set the number of meters distance threshold between a PIXL abrasion and LIBS sample. Within the v1_libs_to_sample.Rds, which @@ -1707,7 +1707,7 @@

5.4 3.4 Result and theme( plot.caption = element_text(hjust = 0) # Aligns caption to the left ) -

+

#add legend for PIXL idk why it's not working
@@ -1749,9 +1749,9 @@

6.1 4.1 Data, Code, and with brief description and URL where they are located.

  1. peterc_finalProjectF24.Rmd (with knit pdf and html) is this -notebook. https://github.rpi.edu/DataINCITE/DAR-Mars-F24/tree/main/StudentNotebooks/Assignment07/peterc_finalProjectF24.Rmd

  2. +notebook. https://github.rpi.edu/DataINCITE/DAR-Mars-F24/blob/main/StudentNotebooks/Assignment07_DraftFinalProjectNotebook/peterc_finalProjectF24_roughdraft.Rmd

  3. peterc_assignment5.Rmd (with knit pdf and html) which is my -previous notebook. https://github.rpi.edu/DataINCITE/DAR-Mars-F24/tree/main/StudentNotebooks/Assignment05/peterc_assigment05.Rmd

  4. +previous notebook. https://github.rpi.edu/DataINCITE/DAR-Mars-F24/tree/main/StudentNotebooks/Assignment05/peterc_assignment05.Rmd

  5. supercam_libs_moc_loc.Rds which is the original LIBS data given to our research group. https://github.rpi.edu/DataINCITE/DAR-Mars-F24/blob/main/Data/supercam_libs_moc_loc.Rds

  6. pixl_sol_coordinates.Rds, which is the data set containing the @@ -1988,7 +1988,7 @@

    7.1 5.1 Data, Code, and with brief description and URL where they are located.

    1. peterc-finalProjectF24.Rmd (with knit pdf and html) is this -notebook. https://github.rpi.edu/DataINCITE/DAR-Mars-F24/tree/main/StudentNotebooks/Assignment07/peterc-finalProjectF24.Rmd

    2. +notebook. https://github.rpi.edu/DataINCITE/DAR-Mars-F24/blob/main/StudentNotebooks/Assignment07_DraftFinalProjectNotebook/peterc_finalProjectF24_roughdraft.Rmd

    3. supercam_libs_moc_loc.Rds which is the original LIBS data given to our research group. https://github.rpi.edu/DataINCITE/DAR-Mars-F24/blob/main/Data/supercam_libs_moc_loc.Rds

    diff --git a/StudentNotebooks/Assignment07_DraftFinalProjectNotebook/peterc_finalProjectF24_roughdraft.nb.html b/StudentNotebooks/Assignment07_DraftFinalProjectNotebook/peterc_finalProjectF24_roughdraft.nb.html index 450b902..4349dc1 100644 --- a/StudentNotebooks/Assignment07_DraftFinalProjectNotebook/peterc_finalProjectF24_roughdraft.nb.html +++ b/StudentNotebooks/Assignment07_DraftFinalProjectNotebook/peterc_finalProjectF24_roughdraft.nb.html @@ -1853,10 +1853,10 @@

    0.0 Preliminaries.

    Here is a list data sets, codes, that are used in your work. Along with brief description and URL where they are located. 1. peterc-finalProjectF24.Rmd (with knit pdf and html) is this notebook. -[https://github.rpi.edu/DataINCITE/DAR-Mars-F24/tree/main/StudentNotebooks/Assignment07/peterc-finalProjectF24.Rmd](https://github.rpi.edu/DataINCITE/DAR-Mars-F24/tree/main/StudentNotebooks/Assignment07/rcsid-finalProjectF24.Rmd) +[https://github.rpi.edu/DataINCITE/DAR-Mars-F24/blob/main/StudentNotebooks/Assignment07_DraftFinalProjectNotebook/peterc_finalProjectF24_roughdraft.Rmd](https://github.rpi.edu/DataINCITE/DAR-Mars-F24/blob/main/StudentNotebooks/Assignment07_DraftFinalProjectNotebook/peterc_finalProjectF24_roughdraft.Rmd) 2. v1_libs_to_sample.Rds is the combined data set of PIXL and LIBS that includes the distance from a PIXL abrasion to a LIBS sample. -[https://github.rpi.edu/DataINCITE/DAR-Mars-F24/blob/main/StudentData/v1_libs_to_sample.Rds](https://github.rpi.edu/DataINCITE/DAR-Mars-F24/blob/main/StudentData/PIXL_LIBS_Combined.Rds). +[https://github.rpi.edu/DataINCITE/DAR-Mars-F24/blob/main/StudentData/v1_libs_to_sample.Rds](https://github.rpi.edu/DataINCITE/DAR-Mars-F24/blob/main/StudentData/v1_libs_to_sample.Rds). Firstly, we set the number of meters distance threshold between a PIXL abrasion and LIBS sample. Within the v1_libs_to_sample.Rds, which Margo and I collaborated on there is a distance variable that is set via a function that Margo created to measure the distance between a PIXL abrasion and LIBS sample using their latitude and longitude coordinates. @@ -2027,9 +2027,9 @@

    4.1 Data, Code, and Resources

    with brief description and URL where they are located.

    1. peterc_finalProjectF24.Rmd (with knit pdf and html) is this -notebook. https://github.rpi.edu/DataINCITE/DAR-Mars-F24/tree/main/StudentNotebooks/Assignment07/peterc_finalProjectF24.Rmd

    2. +notebook. https://github.rpi.edu/DataINCITE/DAR-Mars-F24/blob/main/StudentNotebooks/Assignment07_DraftFinalProjectNotebook/peterc_finalProjectF24_roughdraft.Rmd

    3. peterc_assignment5.Rmd (with knit pdf and html) which is my -previous notebook. https://github.rpi.edu/DataINCITE/DAR-Mars-F24/tree/main/StudentNotebooks/Assignment05/peterc_assigment05.Rmd

    4. +previous notebook. https://github.rpi.edu/DataINCITE/DAR-Mars-F24/tree/main/StudentNotebooks/Assignment05/peterc_assignment05.Rmd

    5. supercam_libs_moc_loc.Rds which is the original LIBS data given to our research group. https://github.rpi.edu/DataINCITE/DAR-Mars-F24/blob/main/Data/supercam_libs_moc_loc.Rds

    6. pixl_sol_coordinates.Rds, which is the data set containing the @@ -2335,7 +2335,7 @@

      5.1 Data, Code, and Resources

      with brief description and URL where they are located.

      1. peterc-finalProjectF24.Rmd (with knit pdf and html) is this -notebook. https://github.rpi.edu/DataINCITE/DAR-Mars-F24/tree/main/StudentNotebooks/Assignment07/peterc-finalProjectF24.Rmd

      2. +notebook. https://github.rpi.edu/DataINCITE/DAR-Mars-F24/blob/main/StudentNotebooks/Assignment07_DraftFinalProjectNotebook/peterc_finalProjectF24_roughdraft.Rmd

      3. supercam_libs_moc_loc.Rds which is the original LIBS data given to our research group. https://github.rpi.edu/DataINCITE/DAR-Mars-F24/blob/main/Data/supercam_libs_moc_loc.Rds

      @@ -2568,7 +2568,7 @@

      Appendix

-
LS0tCnRpdGxlOiAiRGF0YSBBbmFseXRpY3MgUmVzZWFyY2ggSW5kaXZpZHVhbCBGaW5hbCBQcm9qZWN0IFJlcG9ydCAtIE1hcnMiCmF1dGhvcjogIkNoYXJsb3R0ZSBQZXRlcnNvbiIKZGF0ZTogIkZhbGwgMjAyNCIKb3V0cHV0OgogIHBkZl9kb2N1bWVudDoKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6ICczJwogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKICBodG1sX2RvY3VtZW50OgogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogMwogICAgdG9jX2Zsb2F0OiB5ZXMKICAgIG51bWJlcl9zZWN0aW9uczogeWVzCiAgICB0aGVtZTogdW5pdGVkCi0tLQoKCiMgREFSIFByb2plY3QgYW5kIEdyb3VwIE1lbWJlcnMKCiogUHJvamVjdCBuYW1lOiBNYXJzCiogR2l0SHViIElEOiBkYXItcGV0ZXJjCiogUHJvamVjdCB0ZWFtIG1lbWJlcnM6IERhbnRlIE13YXRpYm8sIERvw7FhIFJvYmVydHMsIERhdmlkIFdhbGN5emssIFh1YW50aW5nIFdhbmcsIEFzaHRvbiBDb21wdG9uLCBNYXJnbyBWYW5Fc3NlbHN0eW4sIE5pY29sYXMgTW9yYXdza2ksIENKIE1hcmlubywgQWFkaSBMYWhpcmkgCgojIDAuMCBQcmVsaW1pbmFyaWVzLgoKKlIgTm90ZWJvb2tzIGFyZSBtZWFudCB0byBiZSBkeW5hbWljIGRvY3VtZW50cy4gUHJvdmlkZSBhbnkgcmVsZXZhbnQgdGVjaG5pY2FsIGd1aWRhbmNlIGZvciB1c2VycyBvZiB5b3VyIG5vdGVib29rLiBBbHNvIHRha2UgY2FyZSBvZiBhbnkgcHJlbGltaW5hcmllcywgc3VjaCBhcyByZXF1aXJlZCBwYWNrYWdlcy4gU2FtcGxlIHRleHQ6KgoKVGhpcyByZXBvcnQgaXMgZ2VuZXJhdGVkIGZyb20gYW4gUiBNYXJrZG93biBmaWxlIHRoYXQgaW5jbHVkZXMgYWxsIHRoZSBSIGNvZGUgbmVjZXNzYXJ5IHRvIHByb2R1Y2UgdGhlIHJlc3VsdHMgZGVzY3JpYmVkIGFuZCBlbWJlZGRlZCBpbiB0aGUgcmVwb3J0LiAgQ29kZSBibG9ja3MgY2FuIGJlIHN1cnByZXNzZWQgZnJvbSBvdXRwdXQgZm9yIHJlYWRhYmlsaXR5IHVzaW5nIHRoZSBjb21tYW5kIGNvZGUgYHtSLCAgZWNobz1zaG93fWAgaW4gdGhlIGNvZGUgYmxvY2sgaGVhZGVyLiBJZiBgc2hvdyA8LSBGQUxTRWAgdGhlIGNvZGUgYmxvY2sgd2lsbCBiZSBzdXJwcmVzc2VkOyBpZiBgc2hvdyA8LSBUUlVFYCB0aGVuIHRoZSBjb2RlIHdpbGwgYmUgc2hvdy4gCgpgYGB7cn0KIyBTZXQgdG8gVFJVRSB0byBleHBhbmQgUiBjb2RlIGJsb2Nrczsgc2V0IHRvIEZBTFNFIHRvIGNvbGxhcHNlIFIgY29kZSBibG9ja3MgCnNob3cgPC0gVFJVRQpgYGAKCjwhLS0gRXhwYW5kIHRoaXMgbGlzdCBhcyBuZWNlc3NhcnkgZm9yIHlvdXIgbm90ZWJvb2sgLS0+CkV4ZWN1dGluZyB0aGlzIFIgbm90ZWJvb2sgcmVxdWlyZXMgc29tZSBzdWJzZXQgb2YgdGhlIGZvbGxvd2luZyBwYWNrYWdlczoKCiogYGdncGxvdDJgCiogYHRpZHl2ZXJzZWAKKiBgcGFuZG9jYAoqIGBybWFya2Rvd25gCiogYHN0cmluZ3JgCiogYGdnYmlwbG90YAoqIGBrbml0cmAKKiBgcnBhcnRgCiogYHJwYXJ0LnBsb3RgCiogYGNhcmV0YAoqIGBnZ3JlcGVsYAoqIGBnZ3Rlcm5gCgoKVGhlc2Ugd2lsbCBiZSBpbnN0YWxsZWQgYW5kIGxvYWRlZCBhcyBuZWNlc3NhcnkgKGNvZGUgc3VwcHJlc3NlZCkuIAoKPCEtLSBUaGUgYGluY2x1ZGU9RkFMU0VgIG9wdGlvbiBwcmV2ZW50cyB5b3VyIGNvZGUgZnJvbSBiZWluZyBzaG93biBhdCBhbGwgLS0+CmBgYHtyLCBpbmNsdWRlPUZBTFNFfQojIFRoaXMgY29kZSB3aWxsIGluc3RhbGwgcmVxdWlyZWQgcGFja2FnZXMgaWYgdGhleSBhcmUgbm90IGFscmVhZHkgaW5zdGFsbGVkCiMgQUxXQVlTIElOU1RBTEwgWU9VUiBQQUNLQUdFUyBMSUtFIFRISVMhCmlmICghcmVxdWlyZSgiZ2dwbG90MiIpKSB7CiAgIGluc3RhbGwucGFja2FnZXMoImdncGxvdDIiKQogICBsaWJyYXJ5KGdncGxvdDIpCn0KaWYgKCFyZXF1aXJlKCJ0aWR5dmVyc2UiKSkgewogICBpbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiKQogICBsaWJyYXJ5KHRpZHl2ZXJzZSkKfQoKaWYgKCFyZXF1aXJlKCJwYW5kb2MiKSkgewogIGluc3RhbGwucGFja2FnZXMoInBhbmRvYyIpCiAgbGlicmFyeShwYW5kb2MpCn0KCiMgUmVxdWlyZWQgcGFja2FnZXMgZm9yIE0yMCBMSUJTIGFuYWx5c2lzCmlmICghcmVxdWlyZSgicm1hcmtkb3duIikpIHsKICBpbnN0YWxsLnBhY2thZ2VzKCJybWFya2Rvd24iKQogIGxpYnJhcnkocm1hcmtkb3duKQp9CgppZiAoIXJlcXVpcmUoInN0cmluZ3IiKSkgewogIGluc3RhbGwucGFja2FnZXMoInN0cmluZ3IiKQogIGxpYnJhcnkoc3RyaW5ncikKfQoKaWYgKCFyZXF1aXJlKCJnZ2JpcGxvdCIpKSB7CiAgaW5zdGFsbC5wYWNrYWdlcygiZ2diaXBsb3QiKQogIGxpYnJhcnkoZ2diaXBsb3QpCn0KCmlmICghcmVxdWlyZSgia25pdHIiKSkgewogIGluc3RhbGwucGFja2FnZXMoImtuaXRyIikKICBsaWJyYXJ5KGtuaXRyKQp9CgppZiAoIXJlcXVpcmUoInJwYXJ0IikpIHsKICBpbnN0YWxsLnBhY2thZ2VzKCJycGFydCIpCiAgbGlicmFyeShycGFydCkKfQoKaWYgKCFyZXF1aXJlKCJycGFydC5wbG90IikpIHsKICBpbnN0YWxsLnBhY2thZ2VzKCJycGFydC5wbG90IikKICBsaWJyYXJ5KHJwYXJ0KQp9CgppZiAoIXJlcXVpcmUoImNhcmV0IikpIHsKICBpbnN0YWxsLnBhY2thZ2VzKCJjYXJldCIpCiAgbGlicmFyeShjYXJldCkKfQogIAppZiAoIXJlcXVpcmUoImdncmVwZWwiKSkgewogIGluc3RhbGwucGFja2FnZXMoImdncmVwZWwiKQogIGxpYnJhcnkoZ2dyZXBlbCkKfQoKaWYgKCFyZXF1aXJlKCJnZW9zcGhlcmUiKSkgewogIGluc3RhbGwucGFja2FnZXMoImdlb3NwaGVyZSIpCiAgbGlicmFyeShnZ3JlcGVsKQp9CgppZiAoIXJlcXVpcmUoImdndGVybiIpKSB7CiAgaW5zdGFsbC5wYWNrYWdlcygiZ2d0ZXJuIikKICBsaWJyYXJ5KGdncmVwZWwpCn0KCmBgYAoKIyAxLjAgUHJvamVjdCBJbnRyb2R1Y3Rpb24KClRoZSBNYXJzIFByb2plY3QgaXMgZm9jdXNlZCBvbiBkYXRhIGZyb20gdGhlIDIwMjAgTWFycyBQZXJzZXZlcmFuY2UgUm92ZXIuIFRoZSBnb2FsIG9mIHRoZSBtaXNzaW9uIGlzIHRvIGxvb2sgZm9yIG1pY3JvYmlhbCBhbmNpZW50IGxpZmUgb3IgZm9ybXMgb2Ygd2F0ZXIgb24gTWFycyAodGhpbmdzIHRoYXQgY291bGQgc3VnZ2VzdCBsaWZlKS4gUGVyc2V2ZXJhbmNlIHVzZXMgbXVsdGlwbGUgaW5zdHJ1bWVudHMsIGluY2x1ZGluZyBQSVhMIChQbGFuZXRhcnkgSW5zdHJ1bWVudCBmb3IgWC1SYXkgTGl0aG9jaGVtaXN0cnkpLCBTSEVSTE9DIChTY2FubmluZyBIYWJpdGFibGUgRW52aXJvbm1lbnRzIHdpdGggUmFtYW4gYW5kIEx1bWluZXNjZW5jZSBmb3IgT3JnYW5pY3MgYW5kIENoZW1pY2FscykgYW5kIFNVUEVSQ0FNLiBTVVBFUkNBTSBoYXMgbXVsdGlwbGUgaW5zdHJ1bWVudHMgdGhhdCBtZWFzdXJlIHNwZWN0cm9zY29weSB0byBtZWFzdXJlIHByb3BlcnRpZXMgb2YgbWF0ZXJpYWxzIG9uIE1hcnMsIGluY2x1ZGluZyBMSUJTIChMYXNlci1pbmR1Y2VkIGJyZWFrZG93biBzcGVjdHJvc2NvcHkpLiBUaGlzIG5vdGVib29rIHdpbGwgcHJpbWFyaWx5IGZvY3VzIG9uIHRoZSBkYXRhIHdlIGhhdmUgYmVlbiBnaXZlbiBvZiBQSVhMIGFuZCBMSUJTLiAgCgojIDIuMCBPcmdhbml6YXRpb24gb2YgUmVwb3J0CgpUaGlzIHJlcG9ydCBpcyBvcmdhbml6ZSBhcyBmb2xsb3dzOiAKCiogU2VjdGlvbiAzLjAuICBGaW5kaW5nIDE6IExJQlMgYW5kIFBJWEwgTWF0Y2hpbmcgLSBXZSB3ZXJlIGFibGUgdG8gY29tYmluZSB0aGUgTElCUyBhbmQgUElYTCBkYXRhIHNldHMgYnkgcGlja2luZyBhIG1heGltdW0gZGlzdGFuY2UgdmFyaWFibGUgZnJvbSBhIFBJWEwgYWJyYXNpb24gYW5kIG1hdGNoaW5nIExJQlMgc2FtcGxlcyB0aGF0IHdlcmUgd2l0aGluIHRoZSBzZXQgZGlzdGFuY2Ugb2YgYSBQSVhMIGFicmFzaW9uLiAgCgoqIFNlY3Rpb24gNC4wOiBGaW5kaW5nIDI6IFNvaWwgQ29tcG9zaXRpb24gQW5hbHlzaXMgLSBVc2luZyB0aGUgTElCUyBhbmQgUElYTCBjb21iaW5lZCBkYXRhIHNldCwgSSBjcmVhdGVkIGEgcGxvdCBvZiB0aGUgY29tcG9zaXRpb24gcGVyY2VudGFnZXMgb2YgY2hlbWljYWwgY29tcG91bmRzIHN1Y2ggYXMgU2kwMiwgSzIwLCBldGMuIHVzaW5nIGxvZyBzY2FsaW5nIHRvIGNvbXBhcmUgdGhlIGNvbXBvc2l0aW9ucyBvZiBhIFBJWEwgYWJyYXNpb24gYW5kIHRoZSBjb3JyZXNwb25kaW5nIExJQlMgc2FtcGxlIGNvbXBvc2l0aW9ucyAoYmFzZWQgb24gdGhlIExJQlMgc2FtcGxlcyBmb3IgeCBkaXN0YW5jZSBhd2F5IGZyb20gYSBQSVhMIGFicmFzaW9uKS4KCiogU2VjdGlvbiA1LjAgRmluZGluZyAzOiBBbmFseXppbmcgQ2F0aW9uIENvbWJpbmF0aW9ucyB1c2luZyBMSUJTIGFuZCBQSVhMIG1hdGNoZWQgZGF0YTogVXNpbmcgdGhlIExJQlMgYW5kIFBJWEwgY29tYmluZWQgZGF0YSBzZXQsIHdlIGNyZWF0ZWQgYSB0ZXJuYXJ5IHBsb3QgdG8gc2hvdyB0aGUgZGlzdHJpYnV0aW9uIG9mIExJQlMgc2FtcGxlcyBzb3J0ZWQgYnkgd2hhdCBQSVhMIGFicmFzaW9uIHRoZXkgYXJlIGNsb3Nlc3QgdG8gKGJhc2VkIG9uIGEgY2hvc2VuIGRpc3RhbmNlIHZhcmlhYmxlKS4KCiogU2VjdGlvbiA2LjAgT3ZlcmFsbCBjb25jbHVzaW9ucyBhbmQgc3VnZ2VzdGlvbnMgCgoqIFNlY3Rpb24gNy4wIEFwcGVuZGl4IFRoaXMgc2VjdGlvbiBkZXNjcmliZSB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgd29ya3MgdGhhdCBtYXkgYmUgaGVscGZ1bCBpbiB0aGUgZnV0dXJlIHdvcms6ICpsaXN0IHN1YmplY3RzKi4gIAoKCiMgMy4wIEZpbmRpbmcgMTogUElYTCBhbmQgTElCUyBNYXRjaGluZwoKX0dpdmUgYSBoaWdobGV2ZWwgb3ZlcnZpZXcgb2YgdGhlIG1ham9yIGZpbmRpbmcuIFdoYXQgcXVlc3Rpb25zIHdlcmUgeW91ciB0cnlpbmcgdG8gYWRkcmVzcywgd2hhdCBhcHByb2FjaGVzIGRpZCB5b3UgZW1wbG95LCBhbmQgd2hhdCBoYXBwZW5lZD9fCgpGaXJzdGx5LCB3ZSB3aWxsIGJlIHRha2luZyBhIGxvb2sgYXQgaG93IFBJWEwgYW5kIExJQlMgY29ycmVzcG9uZC4gT3VyIGdyb3VwIGZvdW5kIHZlcnkgZWFybHkgaW4gb3VyIHJlc2VhcmNoIHRoYXQgdGhlcmUgd2Fzbid0IGEgZmVhdHVyZSBhbW9uZyB0aGVtIHRoYXQgY2FuIGJlIHVzZWQgdG8gbWF0Y2ggdGhlIGRhdGEgc2V0cy4gRm9yIGV4YW1wbGUsIHRoZSBjb2x1bW5zIG9mIFBJWEwgYXJlIG9yZ2FuaXplZCBieSBsYXRpdHVkZSBhbmQgbG9uZ2l0dWRlIGFzIHdlbGwgYXMgc2FtcGxlIG51bWJlciAoMS0xNiksIHNhbXBsZSBuYW1lLCBhbmQgYWJyYXNpb24gbmFtZS4gVW5mb3J0dW5hdGVseSwgTElCUyB3YXNuJ3Qgc29ydGVkIHRoZSBzYW1lIHdheS4gTElCUyB3YXMgb3JnYW5pemVkIGJ5IHRoZSBzb2wgdGhhdCB0aGUgc2FtcGxlIHdhcyB0YWtlbiBhdC4gTElCUyBpcyBicm9rZW4gdXAgaW50byBtYW55IGRpZmZlcmVudCB0eXBlcyBvZiBzYW1wbGVzIGFzIHdlbGwsIGluY2x1ZGluZyB0aGUgZmFjdCBpdCBjYXJyaWVzIGFyb3VuZCBlYXJ0aCByZWZlcmVuY2UgZGF0YSB0byBiZSB1c2VkIGluIGNvbXBhcmluZyB3aXRoIGRpZmZlcmVudCBzYW1wbGUgc2l0ZXMuIFRoYXQgYmVpbmcgc2FpZCwgaW4gb3JkZXIgdG8gbWF0Y2ggUElYTCB0YXJnZXRzIHRvIGNvcnJlc3BvbmRpbmcgTElCUyBzYW1wbGVzLCBNYXJnbyBhbmQgSSBjcmVhdGVkIGEgbmV3IGRhdGEgc2V0IHRoYXQgYWRkZWQgYW5vdGhlciBtZXRhZGF0YSBmZWF0dXJlIHRvIFBJWEwgKGxhdGl0dWRlIGFuZCBsb25naXR1ZGUgY29vcmRpbmF0ZXMpIHdoaWNoIHdlIG9idGFpbmVkIGZyb20gdGhlIEFuYWx5c3QncyBOb3RlYm9vay4gT25jZSB0aGlzIHdhcyBhZGRlZCBpbiwgd2UgcmVhbGl6ZWQgdGhhdCB0aGUgbG9uZ2l0dWRlIGFuZCBsYXRpdHVkZSBkaWRuJ3QgcmVhbGx5IG1hdGNoLiBTbyBNYXJnbyBjcmVhdGVkIGEgZGlzdGFuY2UgZnVuY3Rpb24gdG8gbWF0Y2ggTElCUyBzYW1wbGVzIHRvIFBJWEwgdGFyZ2V0cyBiYXNlZCBvbiB3aGF0ZXZlciBkaXN0YW5jZSBhIHBlcnNvbiBzcGVjaWZpZXMuIE9yaWdpbmFsbHksIHdlIHNldCBpdCB0byBiZSByb3VuZGVkIHRvIHRocmVlIHRob3VzYW5kdGhzIGFuZCBtYXRjaCBiYXNlZCBvbiB0aGF0LgoKVGhpcyBoZWxwZWQgYW5zd2VyIHRoZSBxdWVzdGlvbiBvZiBob3cgY2FuIHdlIGNvcnJlbGF0ZSB0aGUgTElCUyBhbmQgUElYTCBkYXRhIHNldHMgdG8gYmUgYWJsZSB0byBwbG90IHRoZW0gb24gdGhlIHNhbWUgYXhpcyBvZiB3aGF0ZXZlciBwbG90IGlzIHRyeWluZyB0byBiZSBjcmVhdGVkLiBJIHdhcyBjdXJpb3VzIHRvIHNlZSBob3cgY2xvc2UgUElYTCB0YXJnZXRzIHdlcmUgdG8gTElCUyBzYW1wbGUgc2l0ZXMgYXMgd2VsbCBhcyBob3cgbWFueSBMSUJTIHNhbXBsZXMgd291bGQgYmUgYXNzb2NpYXRlZCB3aXRoIGEgUElYTCB0YXJnZXQgcGVyaGFwcyB3aXRoIGEgcmFkaXVzIG9mIDcgb3IgMTAgbWV0ZXJzLgoKIyMgMy4xIERhdGEsIENvZGUsIGFuZCBSZXNvdXJjZXMKCkhlcmUgaXMgYSBsaXN0IGRhdGEgc2V0cywgY29kZXMsIHRoYXQgYXJlIHVzZWQgaW4geW91ciB3b3JrLiBBbG9uZyB3aXRoIGJyaWVmIGRlc2NyaXB0aW9uIGFuZCBVUkwgd2hlcmUgdGhleSBhcmUgbG9jYXRlZC4KCjEuIHBldGVyYy1maW5hbFByb2plY3RGMjQuUm1kICh3aXRoIGtuaXQgcGRmIGFuZCBodG1sKSBpcyB0aGlzIG5vdGVib29rLgpbaHR0cHM6Ly9naXRodWIucnBpLmVkdS9EYXRhSU5DSVRFL0RBUi1NYXJzLUYyNC90cmVlL21haW4vU3R1ZGVudE5vdGVib29rcy9Bc3NpZ25tZW50MDcvcGV0ZXJjLWZpbmFsUHJvamVjdEYyNC5SbWRdKGh0dHBzOi8vZ2l0aHViLnJwaS5lZHUvRGF0YUlOQ0lURS9EQVItTWFycy1GMjQvdHJlZS9tYWluL1N0dWRlbnROb3RlYm9va3MvQXNzaWdubWVudDA3L3Jjc2lkLWZpbmFsUHJvamVjdEYyNC5SbWQpCgoyLiB2MV9saWJzX3RvX3NhbXBsZS5SZHMgaXMgdGhlIGNvbWJpbmVkIGRhdGEgc2V0IG9mIFBJWEwgYW5kIExJQlMgdGhhdCBpbmNsdWRlcyB0aGUgZGlzdGFuY2UgZnJvbSBhIFBJWEwgYWJyYXNpb24gdG8gYSBMSUJTIHNhbXBsZS4gIApbaHR0cHM6Ly9naXRodWIucnBpLmVkdS9EYXRhSU5DSVRFL0RBUi1NYXJzLUYyNC9ibG9iL21haW4vU3R1ZGVudERhdGEvdjFfbGlic190b19zYW1wbGUuUmRzXShodHRwczovL2dpdGh1Yi5ycGkuZWR1L0RhdGFJTkNJVEUvREFSLU1hcnMtRjI0L2Jsb2IvbWFpbi9TdHVkZW50RGF0YS9QSVhMX0xJQlNfQ29tYmluZWQuUmRzKS4gCgpGaXJzdGx5LCB3ZSBzZXQgdGhlIG51bWJlciBvZiBtZXRlcnMgZGlzdGFuY2UgdGhyZXNob2xkIGJldHdlZW4gYSBQSVhMIGFicmFzaW9uIGFuZCBMSUJTIHNhbXBsZS4gV2l0aGluIHRoZSB2MV9saWJzX3RvX3NhbXBsZS5SZHMsIHdoaWNoIE1hcmdvIGFuZCBJIGNvbGxhYm9yYXRlZCBvbiB0aGVyZSBpcyBhIGRpc3RhbmNlIHZhcmlhYmxlIHRoYXQgaXMgc2V0IHZpYSBhIGZ1bmN0aW9uIHRoYXQgTWFyZ28gY3JlYXRlZCB0byBtZWFzdXJlIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIGEgUElYTCBhYnJhc2lvbiBhbmQgTElCUyBzYW1wbGUgdXNpbmcgdGhlaXIgbGF0aXR1ZGUgYW5kIGxvbmdpdHVkZSBjb29yZGluYXRlcy4gCmBgYHtyfQptZXRlcnMgPC0gMTAwCmBgYAoKVG8gcHJlcGFyZSB0aGUgZGF0YSwgd2Ugd2lsbCBsb2FkIGluIHRoZSB2MV9saWJzX3RvX3NhbXBsZS5SZHMsIGdyb3VwIGJ5IGxhdGl0dWRlIGFuZCBsb25naXR1ZGUgb2YgTElCUywgYW5kIGZpbHRlciBvdXQgZXZlcnkgTElCUyBzYW1wbGUgdGhhdCBoYXMgYSBsYXJnZXIgZGlzdGFuY2UgZnJvbSBpdHMgY29ycmVzcG9uZGluZyBQSVhMIGFicmFzaW9uIHRoYW4gc3BlY2lmaWVkIGluIHRoZSBjaG9zZW4gZGlzdGFuY2UgKG1ldGVyKSB2YWx1ZS4gSW4gb3JkZXIgdG8gbWFrZSBhIHNjYXR0ZXIgcGxvdCBvZiB0aGUgTElCUyBhbmQgUElYTCBwb2ludHMsIHdlIHdpbGwgY3JlYXRlIGEgbmV3IGRhdGEgZnJhbWUgb2YgZWFjaCB1bmlxdWUgUElYTCBhYnJhc2lvbiBhbmQgaXRzIGNvb3JkaW5hdGVzLiBUaGF0IGlzIHRoZSB1bmlxdWVfcGl4bCBkYXRhIGZyYW1lIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBwbG90IHRoZSBQSVhMIGFicmFzaW9uIGNvb3JkaW5hdGVzLgoKYGBge3IgfQpsaWJzX3RvX3NhbXBsZSA8LSByZWFkUkRTKCJ+L0RBUi1NYXJzLUYyNC9TdHVkZW50RGF0YS92MV9saWJzX3RvX3NhbXBsZS5SZHMiKQojbWFrZSBhIGZpbHRlcmVkIGRhdGEgZnJhbWUgdGhhdCBwaWNrcyB0aGUgbWF4IHBvaW50IG91dCBvZiBhbGwgbGlicyBzYW1wbGVzIGF0IGEgY2VydGFpbiB0YXJnZXQgCiMgZm9yIHNpbXBsaWNpdHkKZGZfZmlsdGVyZWQgPC0gbGlic190b19zYW1wbGUgJT4lCiAgZ3JvdXBfYnkoTGF0LmxpYnMsIExvbi5saWJzKSAlPiUKICBmaWx0ZXIoUG9pbnQubGlicyA9PSBtYXgoUG9pbnQubGlicykpICU+JQogIHVuZ3JvdXAoKQpkZl9kaXN0YW5jZV9maWx0ZXIgPC0gZGZfZmlsdGVyZWRbZGZfZmlsdGVyZWQkRGlzdGFuY2UgPD0gbWV0ZXJzLF0KCiNtYWtlIGEgZGF0YSBmcmFtZSB3aXRoIHRoZSB1bmlxdWUgcGl4bCBjb29yZGluYXRlcyBzaW5jZSB0aGV5IGFyZSBpbiBwYWlycyBvZiBpZGVudGljYWwgbGF0L2xvbgp1bmlxdWVfcGl4bCA8LSBkZl9maWx0ZXJlZCAlPiUKICBzZWxlY3QoTGF0LnBpeGwsIExvbi5waXhsLCBBYnJhc2lvbi5waXhsKSAlPiUgZGlzdGluY3QoKQpgYGAKCgojIyAzLjIgQ29udHJpYnV0aW9uCgpUaGUgbG9naXN0aWNzIG9mIGZpbHRlcmluZyB0aGUgb3JpZ2luYWwgZGF0YSBzZXQgaXMgbXkgd29yay4gUHJldmlvdXNseSwgSSBoYWQgdG8gZG8gYSBsb3QgbW9yZSBmaWx0ZXJpbmcgaW4gb3JkZXIgdG8gY2hvb3NlIHRoZSBkaXN0YW5jZSBhbmQgZ2V0IHVuaXF1ZSBMSUJTIHBvaW50cyBpbiBvcmRlciB0byBub3QgcHV0IHRvbyBtYW55IHBvaW50cyBvbiB0aGUgc2NhdHRlcnBsb3QuIE1hcmdvIGFuZCBJIHdvcmtlZCB0b2dldGhlciB0byBjcmVhdGUgdGhlIGRhdGEgc2V0IHRoYXQgSSB1c2UgaW4gdGhpcyBzZWN0aW9uICh2MV9saWJzX3RvX3NhbXBsZS5SZHMpIGJ5IGRlY2lkaW5nIGhvdyB0byBtYXRjaCB1cCBMSUJTIHRvIGNlcnRhaW4gUElYTCBhYnJhc2lvbnMuIE1hcmdvIGNyZWF0ZWQgdGhlIGRpc3RhbmNlIGZ1bmN0aW9uIHRvIGZpbmQgdGhlIGRpc3RhbmNlIGJldHdlZW4gUElYTCBhYnJhc2lvbnMgYW5kIExJQlMgc2FtcGxlcyBhbmQgYWRkZWQgdGhhdCBjb2x1bW4gdG8gdGhlIGRhdGEgc2V0LiBUaGVuLCBEb25hIGZpeGVkIGFsbCB0aGUgbmFtaW5nIGNvbnZlbnRpb25zIGluIHRoZSBkYXRhIHNldCBpbiBvcmRlciB0byBoYXZlIGNvbnNpc3RlbmN5IGFuZCBtYWtlIGl0IGVhc3kgdG8gdGVsbCB3aGljaCB2YXJpYWJsZSB3YXMgb3JpZ2luYWxseSBmcm9tIGVhY2ggZGF0YSBzZXQgKGV4LiBOYW1lLnBpeGwsIFRhcmdldC5saWJzKS4gSSB0aGVuIHVzZWQgdGhlIGRhdGEgdG8gY3JlYXRlIHBsb3RzIGFuZCBhbmFseXplLiBCZWxvdyBpcyBhIHNjYXR0ZXJwbG90IHNob3djYXNpbmcgdGhlIGRpc3RyaWJ1dGlvbiBvZiBQSVhMIGFicmFzaW9ucyBhbmQgY29ycmVzcG9uZGluZyBMSUJTIHNhbXBsZXMgYmFzZWQgb24gdGhlIHNwZWNpZmllZCBtYXggZGlzdGFuY2UgYmV0d2VlbiB0aGVtLiAKCgojIyAzLjMgTWV0aG9kcyBEZXNjcmlwdGlvbiAKCkkgY2hvc2UgdG8gdXNlIGdncGxvdCB0byBkaXNwbGF5IHRoZSBMSUJTIGFuZCBQSVhMIGRhdGEgZm9yIGVhc2llciBhbmFseXNpcyBvZiBzZWVpbmcgaG93IG1hbnkgTElCUyBzYW1wbGVzIGFsaWduIHdpdGggZGlmZmVyZW50IFBJWEwgYWJyYXNpb25zLiBJdCB3YXMgdmVyeSBpbnRlcmVzdGluZyB0byBjaGFuZ2UgYXJvdW5kIHRoZSBtYXggZGlzdGFuY2UgYW5kIHNlZSB3aGljaCBhbGlnbmVkIHdpdGggd2hpY2ggYWJyYXNpb24uIEluIHRlcm1zIG9mIGV4ZWN1dGlvbiwgaXQgdG9vayBtZSBhIGJpdCBvZiB0aW1lIHRvIG9yZ2FuaXplIGFsbCBvZiB0aGUgdGhvdWdodHMgTWFyZ28gYW5kIEkgaGFkIG9uIGhvdyB0byBjcmVhdGUgYW5kIG1hbmFnZSB0aGlzIGRhdGEgc2V0LiBPcmlnaW5hbGx5LCB3ZSBoYWQgcm91bmRlZCB0aGUgZGlzdGFuY2VzIHRvIHRoZSBuZWFyZXN0IHRob3VzYW5kdGggdG8gbWF0Y2ggdGhlbSwgYW5kIHRoZW4gd2VyZSBwbG90dGluZyB0aGF0IHdheS4gSG93ZXZlciwgdGhhdCBsZWZ0IGEgbG90IG9mIHJvb20gZm9yIGVycm9yIGFuZCB3YXNuJ3QgYXMgYWNjdXJhdGUuIENyZWF0aW5nIGEgZGlzdGFuY2UgZnVuY3Rpb24gYWxsb3dzIGZvciB0aGUgc2NpZW50aXN0IG9yIHBlcnNvbiB1c2luZyB0aGUgTWFycyBNaXNzaW9uIE1pbmRlciBBcHAgdG8gY2hvb3NlIHdoYXRldmVyIGRpc3RhbmNlIHRoZXkgd291bGQgbGlrZSBhbmQgYWxsb3dzIGZvciBtdWNoIG1vcmUgZnVuY3Rpb25hbGl0eS4gTW9kaWZ5aW5nIHRoZSBkYXRhIHNldCBtb3JlIGVuZGVkIHVwIGJlaW5nIG1vcmUgZWZmaWNpZW50IHRoYW4gYWRkaW5nIHNtYWxsIGVkaXRzIGFzIEkgd2FzIG1ha2luZyBteSBwbG90cyB3aGljaCB3YXMgb3JpZ2luYWxseSBtYWtpbmcgbWUgY3JhenkgKGFzIGluIGNoYW5naW5nIHZhcmlhYmxlIHR5cGVzIGlmIHRoZXkgd2VyZW4ndCB3aGF0IHRoZXkgd2VyZSBzdXBwb3NlZCB0byBiZSkuIEluIHRoZSBlbmQsIEkgbGVhcm5lZCBhIGxvdCBhYm91dCBkYXRhIG9yZ2FuaXphdGlvbiBhbmQgdGhhdCBjb25zaXN0ZW5jeSBhbmQgc3RheWluZyBvcmdhbml6ZWQgaXMga2V5IGFuZCBzYXZlcyBhIGxvdCBvZiB0aW1lIGxhdGVyIG9uLgoKCiMjIDMuNCBSZXN1bHQgYW5kIERpc2N1c3Npb24gCgpUbyBjcmVhdGUgYSBwbG90IG9mIHRoZSBMSUJTIGFuZCBQSVhMIGRhdGEgb3JnYW5pemVkIGJ5IHdoYXQgTElCUyBzYW1wbGVzIGFsaWduIHdpdGggd2hhdCBhYnJhc2lvbnMsIGZpcnN0IHBsb3R0ZWQgdGhlIExJQlMgc2FtcGxlcyBjb2xvcmVkIGJ5IHdoYXQgUElYTCBhYnJhc2lvbiB0aGV5IHdlcmUgY2xvc2VzdCB0bywgYW5kIHRoZW4gcGxvdHRlZCB0aCBQSVhMIGFicmFzaW9ucyBhcyByZWQgc3RhcnMgb24gdGhlIHBsb3QgdG8gc2hvdyB3aGVyZSB0aGUgUElYTCBhYnJhc2lvbnMgd2VyZSByZWxhdGl2ZSB0byB0aGUgTElCUyBzYW1wbGVzLgoKYGBge3IgfQojcGxvdCBvZiBsaWJzIGFuZCBwaXhsIGRhdGEgYnkgbGF0L2xvbgpnZ3Bsb3QoZGF0YSA9IGRmX2Rpc3RhbmNlX2ZpbHRlcikgKwogIGdlb21fcG9pbnQobWFwcGluZyA9IGFlcyh4ID0gTG9uLmxpYnMsIHkgPSBMYXQubGlicywgY29sb3IgPSBBYnJhc2lvbi5waXhsKSkgKyAgICAgICAgICAgICAgICAgIyBDb2xvciBieSBhYnJhc2lvbgogIGdlb21fcG9pbnQobWFwcGluZyA9IGFlcyh4ID0gTG9uLnBpeGwsIHkgPSBMYXQucGl4bCksIGRhdGEgPSB1bmlxdWVfcGl4bCwgY29sb3IgPSAicmVkIiwgc2hhcGUgPSAzLCBzaXplID0gMykgKyAjIEZpeGVkIGNvbG9yIGZvciB1bmlxdWVfcGl4bCBwb2ludHMKICBnZW9tX3RleHRfcmVwZWwobWFwcGluZyA9IGFlcyh4ID0gTG9uLnBpeGwsIHkgPSBMYXQucGl4bCwgbGFiZWwgPSBBYnJhc2lvbi5waXhsKSwgZGF0YSA9IHVuaXF1ZV9waXhsLAogICAgICAgICAgICAgICAgICB2anVzdCA9IDIsIGNvbG9yID0gInJlZCIpICsKICBsYWJzKHRpdGxlID0gcGFzdGUoIkxJQlMgU2FtcGxlcyBhbmQgUElYTCBBYnJhc2lvbnMgd2l0aGluIiwgbWV0ZXJzLCAibWV0ZXJzIiksCiAgICAgICB4ID0gIkxvbmdpdHVkZSIsCiAgICAgICB5ID0gIkxhdGl0dWRlIiwKICAgICAgIGNvbG9yID0gIlBJWEwgQWJyYXNpb24iLAogICAgICAgY2FwdGlvbiA9ICJEYXRhIGNvbGxlY3RlZCB1c2luZyBMSUJTIGFuZCBQSVhMIGluc3RydW1lbnRzIG9uIFBlcnNlcnZlcmFuY2Ugcm92ZXIuXG4gU2hvd3MgUElYTCBhYnJhc2lvbnMgcGxvdHRlZCBhcyByZWQgc3RhcnMsXG4gYW5kIHRoZSBjb3JyZXNwb25kaW5nIExJQlMgc2FtcGxlcyBjb2xvcmVkIGJ5IHRoZWlyIGNsb3Nlc3QgUElYTCBhYnJhc2lvbi4iKSsgICAgICAgICAgIyBMYWJlbCBmb3IgdGhlIGNvbG9yIGxlZ2VuZCAKICMgQ2VudGVyIHRoZSBjYXB0aW9uIG9uIHRoZSBsZWZ0IHNpZGUKICB0aGVtZSgKICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDApICAjIEFsaWducyBjYXB0aW9uIHRvIHRoZSBsZWZ0CiAgKQoKI2FkZCBsZWdlbmQgZm9yIFBJWEwgaWRrIHdoeSBpdCdzIG5vdCB3b3JraW5nCmBgYAoKCiMjIDMuNSBDb25jbHVzaW9ucywgTGltaXRhdGlvbnMsIGFuZCBGdXR1cmUgV29yay4KCkkgYmVsaWV2ZSBteSBmaW5kaW5ncyBtYWtlIGl0IHZlcnkgZWFzeSBmb3IgcmVzZWFyY2hlcnMgYW5kIHNjaWVudGlzdHMgdG8gaGF2ZSBhIHZpc3VhbGl6YXRpb24gb2YgUElYTCBhbmQgTElCUyBzYW1wbGVzIHRoYXQgdGhleSB3YW50IHRvIHNlZSBiYXNlZCBvbiB3aGF0IG1heCBkaXN0YW5jZSB0aGV5IGFyZSBmb2N1c2luZyBvbiB3aGVuIGV4YW1pbmluZyBQSVhMIGFuZCBMSUJTIHRvZ2V0aGVyLiBGb3IgZnV0dXJlIHdvcmssIEkgdGhpbmsgYXMgbW9yZSBjb29yZGluYXRlcyBhbmQgZGF0YSBpcyBhZGRlZCB0byB0aGUgTElCUyBhbmQgUElYTCBkYXRhIHNldHMgYXMgdGhleSBiZWNvbWUgYXZhaWxhYmxlIGZyb20gTkFTQSB0aGlzIHdpbGwgY29udGludWUgdG8gYmUgYnVpbHQgdXBvbiBhbmQgYWx0aG91Z2ggaXQgaXNuJ3Qgc3VwZXIgY29tcGxpY2F0ZWQgb2YgYSBwbG90LCBpdCBwcm92aWRlcyBhIHZlcnkgbmVjZXNzYXJ5IGNvbnRleHQgdG8gdmlzdWFsaXplIFBJWEwgYW5kIExJQlMuIAoKLSBBZGQgbW9yZSBhYm91dCBsaW1pdGF0aW9ucz8KCiMgNC4wIEZpbmRpbmcgMjogU29pbCBDb21wb3NpdGlvbiBBbmFseXNpcwpfR2l2ZSBhIGhpZ2hsZXZlbCBvdmVydmlldyBvZiB0aGUgbWFqb3IgZmluZGluZy4gV2hhdCBxdWVzdGlvbnMgd2VyZSB5b3VyIHRyeWluZyB0byBhZGRyZXNzLCB3aGF0IGFwcHJvYWNoZXMgZGlkIHlvdSBlbXBsb3ksIGFuZCB3aGF0IGhhcHBlbmVkP18KClVzaW5nIHRoZSBMSUJTIGFuZCBQSVhMIGNvbWJpbmVkIGRhdGEgc2V0LCBJIGNyZWF0ZWQgYSBwbG90IG9mIHRoZSBjb21wb3NpdGlvbiBwZXJjZW50YWdlcyBvZiBjaGVtaWNhbCBjb21wb3VuZHMgc3VjaCBhcyBTaTAyLCBLMjAsIGV0Yy4gdXNpbmcgbG9nIHNjYWxpbmcgdG8gY29tcGFyZSB0aGUgY29tcG9zaXRpb25zIG9mIGEgUElYTCBhYnJhc2lvbiBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgTElCUyBzYW1wbGUgY29tcG9zaXRpb25zIChiYXNlZCBvbiB0aGUgTElCUyBzYW1wbGVzIGZvciB4IGRpc3RhbmNlIGF3YXkgZnJvbSBhIFBJWEwgYWJyYXNpb24pLiBUaGUgcXVlc3Rpb24gSSB3YXMgdHJ5aW5nIHRvIGFuc3dlciB3YXMgaG93IGRvZXMgdGhlIExJQlMgZGF0YSBvZiBhIGNlcnRhaW4gYXJlYSBjb21wYXJlIHRvIHRoZSBQSVhMIGRhdGEgb2YgdGhhdCBhcmVhPyBCeSBsb29raW5nIGF0IHRoZSBjb21wb3NpdGlvbiBvZiB0aGUgc29pbCBpbiBjZXJ0YWluIGxvY2F0aW9ucywgd2UgY2FuIGNvbXBhcmUgdGhlIGRpZmZlcmVuY2VzIGluIHRoZSBQSVhMIGFicmFzaW9uIGFuZCByZWxhdGluZyBMSUJTIHNhbXBsZXMgZm9yIGEgY2VydGFpbiBhcmVhIHV0aWxpemluZyB0aGUgc2FtZSBkYXRhIHNldCAodjFfbGlic190b19zYW1wbGUuUm1kKS4gSW4gb3JkZXIgdG8gYWNjb21wbGlzaCB0aGlzLCAKCgojIyA0LjEgRGF0YSwgQ29kZSwgYW5kIFJlc291cmNlcwpIZXJlIGlzIGEgbGlzdCBkYXRhIHNldHMsIGNvZGVzLCB0aGF0IGFyZSB1c2VkIGluIHlvdXIgd29yay4gQWxvbmcgd2l0aCBicmllZiBkZXNjcmlwdGlvbiBhbmQgVVJMIHdoZXJlIHRoZXkgYXJlIGxvY2F0ZWQuCgoxLiBwZXRlcmNfZmluYWxQcm9qZWN0RjI0LlJtZCAod2l0aCBrbml0IHBkZiBhbmQgaHRtbCkgaXMgdGhpcyBub3RlYm9vay4KW2h0dHBzOi8vZ2l0aHViLnJwaS5lZHUvRGF0YUlOQ0lURS9EQVItTWFycy1GMjQvdHJlZS9tYWluL1N0dWRlbnROb3RlYm9va3MvQXNzaWdubWVudDA3L3BldGVyY19maW5hbFByb2plY3RGMjQuUm1kXShodHRwczovL2dpdGh1Yi5ycGkuZWR1L0RhdGFJTkNJVEUvREFSLU1hcnMtRjI0L3RyZWUvbWFpbi9TdHVkZW50Tm90ZWJvb2tzL0Fzc2lnbm1lbnQwNy9wZXRlcmNfZmluYWxQcm9qZWN0RjI0LlJtZCkKCjIuIHBldGVyY19hc3NpZ25tZW50NS5SbWQgKHdpdGgga25pdCBwZGYgYW5kIGh0bWwpIHdoaWNoIGlzIG15IHByZXZpb3VzIG5vdGVib29rLgpbaHR0cHM6Ly9naXRodWIucnBpLmVkdS9EYXRhSU5DSVRFL0RBUi1NYXJzLUYyNC90cmVlL21haW4vU3R1ZGVudE5vdGVib29rcy9Bc3NpZ25tZW50MDUvcGV0ZXJjX2Fzc2lnbWVudDA1LlJtZF0oaHR0cHM6Ly9naXRodWIucnBpLmVkdS9EYXRhSU5DSVRFL0RBUi1NYXJzLUYyNC90cmVlL21haW4vU3R1ZGVudE5vdGVib29rcy9Bc3NpZ25tZW50MDUvcGV0ZXJjXy1maW5hbFByb2plY3RGMjRfYXNzaWdubWVudDA1LlJtZCkKCjMuIHN1cGVyY2FtX2xpYnNfbW9jX2xvYy5SZHMgd2hpY2ggaXMgdGhlIG9yaWdpbmFsIExJQlMgZGF0YSBnaXZlbiB0byBvdXIgcmVzZWFyY2ggZ3JvdXAuCltodHRwczovL2dpdGh1Yi5ycGkuZWR1L0RhdGFJTkNJVEUvREFSLU1hcnMtRjI0L2Jsb2IvbWFpbi9EYXRhL3N1cGVyY2FtX2xpYnNfbW9jX2xvYy5SZHNdKGh0dHBzOi8vZ2l0aHViLnJwaS5lZHUvRGF0YUlOQ0lURS9EQVItTWFycy1GMjQvYmxvYi9tYWluL0RhdGEvc3VwZXJjYW1fbGlic19tb2NfbG9jLlJkcykKCjQuIHBpeGxfc29sX2Nvb3JkaW5hdGVzLlJkcywgd2hpY2ggaXMgdGhlIGRhdGEgc2V0IGNvbnRhaW5pbmcgdGhlIFBJWEwgZGF0YSwgc29sLCBhbmQgY29vcmRpbmF0ZXMuCltodHRwczovL2dpdGh1Yi5ycGkuZWR1L0RhdGFJTkNJVEUvREFSLU1hcnMtRjI0L2Jsb2IvbWFpbi9TdHVkZW50RGF0YS9waXhsX3NvbF9jb29yZGluYXRlcy5SZHNdKGh0dHBzOi8vZ2l0aHViLnJwaS5lZHUvRGF0YUlOQ0lURS9EQVItTWFycy1GMjQvYmxvYi9tYWluL1N0dWRlbnREYXRhL3BpeGxfc29sX2Nvb3JkaW5hdGVzLlJkcykKCjQuIExJQlNfdHJhaW5pbmdfc2V0X3F1YXJ0aWxlcy5SZHMgaXMgdGhlIGRhdGEgd2l0aCBlYXJ0aCBxdWFydGlsZSByZWZlcmVuY2UgZGF0YS4KW2h0dHBzOi8vZ2l0aHViLnJwaS5lZHUvRGF0YUlOQ0lURS9EQVItTWFycy1GMjQvYmxvYi9tYWluL0RhdGEvTElCU190cmFpbmluZ19zZXRfcXVhcnRpbGVzLlJkc10oaHR0cHM6Ly9naXRodWIucnBpLmVkdS9EYXRhSU5DSVRFL0RBUi1NYXJzLUYyNC9ibG9iL21haW4vRGF0YS9MSUJTX3RyYWluaW5nX3NldF9xdWFydGlsZXMuUmRzKS4gCgpUbyBwcmVwYXJlIHRoZSBkYXRhLCBJIHN0YXJ0IGJ5IGxvYWRpbmcgaW4gdGhlIExJQlMgZGF0YS4gVGhlbiwgd2UgZHJvcCB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIGNvbHVtbnMgYW5kIHN1bSBvZiBwZXJjZW50YWdlIGNvbHVtbnMgbGVhdmluZyB1cyB3aXRoIGp1c3QgdGhlIHdlaWdodGVkIGNvbXBvc2l0aW9uIGluIHRlcm1zIG9mIG51bWVyaWNhbCBkYXRhLiBXZSBhbHNvIHJlbW92ZSB0aGUgc2NjdCB2YWx1ZXMsIGFzIHRob3NlIHZhbHVlcyBhcmUgdGhlIG9uZXMgdGhhdCBhcmUgZWFydGggcmVmZXJlbmNlIHNhbXBsZXMgdGhhdCBQZXJzZXJ2ZXJhbmNlIGNhcnJpZXMgd2l0aCBpdC4gVGhlcmVmb3JlLCB0aGV5IHdpbGwgbm90IGJlIHZlcnkgcmVsZXZhbnQgd2hlbiBwbG90dGluZyB0aGUgTElCUyBkYXRhIGFzIHdlIGFyZSBmb2N1c2VkIG9uIHRoZSBNYXJzIHNvaWwgY29tcG9zaXRpb25zLgoKYGBge3J9CiNFYXJ0aCBxdWFydGlsZXMKZWFydGhxdWFydGlsZXMuZGY8LXJlYWRSRFMoIi9hY2FkZW1pY3MvTUFUUC00OTEwLUYyNC9EQVItTWFycy1GMjQvRGF0YS9MSUJTX3RyYWluaW5nX3NldF9xdWFydGlsZXMuUmRzIikKI0xvYWQgaW4gTElCUyBkYXRhCmxpYnMuZGYgPC0gcmVhZFJEUygiL2FjYWRlbWljcy9NQVRQLTQ5MTAtRjI0L0RBUi1NYXJzLUYyNC9EYXRhL3N1cGVyY2FtX2xpYnNfbW9jX2xvYy5SZHMiKQojRHJvcCB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIGZlYXR1cmVzLCB0aGUgc3VtIG9mIHRoZSBwZXJjZW50YWdlcywgCiN0aGUgZGlzdGFuY2UsIGFuZCB0aGUgdG90YWwgZnJlcXVlbmNpZXMKbGlicy5kZiA8LSBsaWJzLmRmICU+JSAKICBzZWxlY3QoIShjKGRpc3RhbmNlX21tLFRvdC5FbS4sU2lPMl9zdGRldixUaU8yX3N0ZGV2LEFsMk8zX3N0ZGV2LEZlT1Rfc3RkZXYsCiAgICAgICAgICAgICBNZ09fc3RkZXYsTmEyT19zdGRldixDYU9fc3RkZXYsSzJPX3N0ZGV2LFRvdGFsKSkpCiMgQ29udmVydCB0aGUgcG9pbnRzIHRvIG51bWVyaWMKbGlicy5kZiRwb2ludCA8LSBhcy5udW1lcmljKGxpYnMuZGYkcG9pbnQpCmxpYnMuZGZbLDY6MTNdIDwtIHNhcHBseShsaWJzLmRmWyw2OjEzXSxhcy5udW1lcmljKQojcmVtb3ZlIHRoZSBzY2N0L3JlZmVyZW5jZSBzYW1wbGVzCmxpYnMuZGY8LWxpYnMuZGYlPiUKICBmaWx0ZXIoIShncmVwbCgic2NjdCIsIHRhcmdldCkpKQojYWRkIGEgY29sdW1uIHRvIGluZGljYXRlIHRoZSBuZWFyZXN0IHBpeGwKbGlicy5kZjwtY2JpbmQobmVhcmVzdHBpeGw9MCxsaWJzLmRmKQojbWFrZSBhIGRhdGFmcmFtZSBvZiBqdXN0IHRoZSBMSUJTIExhdC9Mb25nIGFuZCB0YXJnZXQgbmFtZSBhbmQgcmVtb3ZlIGR1cGxpY2F0ZXMKbGlic3RhcmdldHMuZGY8LWxpYnMuZGZbLGMoMSwzLDQsNSldCmxpYnN0YXJnZXRzLmRmPC1kaXN0aW5jdChsaWJzdGFyZ2V0cy5kZikKYGBgCgpTZXQgbWV0ZXJzIGFuZCBjaG9zZW4gYWJyYXNpb24gdG8gYWN0IGFzIGEgc2xpZGVyIGluIHRoZSAyZCBhcHAuCmBgYHtyfQojQ2hvb3NlIG1heCBkaXN0YW5jZSB2YXJpYWJsZSBiZXR3ZWVuIFBJWEwgYW5kIExJQlMgZGF0YQptZXRlcnMgPSAxMDAKI0Nob29zZSBQSVhMIGFicmFzaW9uIHlvdSB3YW50IHRvIGxvb2sgYXQKYWJyYXNpb25fbmFtZSA9ICJCZXJyeSBIb2xsb3ciCmBgYAoKTmV4dCwgd2UgbG9hZCBpbiB0aGUgUElYTCBkYXRhLiBXZSByZW1vdmUgdGhlIGF0bW9zcGhlcmljIHNhbXBsZSBhbmQgb25seSBzZWxlY3Qgb25lIFBJWEwgc2FtcGxlIG9mIGVhY2ggYWJyYXNpb24uCmBgYHtyLCBkYXRhMDJ9CiNyZWFkIGluIHBpeGwgZGF0YSB3aXRoIGxhdC9sb25nCnBpeGwuZGY8LXJlYWRSRFMoIi9hY2FkZW1pY3MvTUFUUC00OTEwLUYyNC9EQVItTWFycy1GMjQvU3R1ZGVudERhdGEvcGl4bF9zb2xfY29vcmRpbmF0ZXMuUmRzIikKI2luY2x1ZGUgb25seSBwaXhsIG1ldGFkYXRhCnBpeGwuZGY8LXBpeGwuZGYgJT4lCiAgc2VsZWN0KGMoMSwyLDE5LDIwLDIyKSkKI2NvbnZlcnQgTGF0L0xvbmcgdG8gbnVtZXJpYwpwaXhsLmRmJExhdCA8LSBhcy5udW1lcmljKHBpeGwuZGYkTGF0KQpwaXhsLmRmJExvbmcgPC0gYXMubnVtZXJpYyhwaXhsLmRmJExvbmcpCiNyZW1vdmUgcm93cyBzbyB3ZSBvbmx5IGhhdmUgb25lIHNhbXBsZSBwZXIgYWJyYXNpb24gYW5kIHJlbW92ZSBhdG1vc3BoZXJpYyBzYW1wbGUKcGl4bC5kZjwtcGl4bC5kZltjKDIsNCw2LDgsMTAsMTIsMTQsMTYpLF0KYGBgCgpOZXh0LCB3ZSB3aWxsIGluaXRpYWxpemUgYSBkaXN0YW5jZSB2YXJpYWJsZSAodG8gaW5kaWNhdGUgZGlzdGFuY2UgYmV0d2VlbiBQSVhMIGFicmFzaW9uIGFuZCBMSUJTIHRhcmdldCkgYW5kIGFsc28gaW5pdGlhbGl6ZSBlYWNoIFBJWEwgYWJyYXNpb24sIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBtYXJrIHdoaWNoIFBJWEwgYWJyYXNpb24gdGhlIExJQlMgc2FtcGxlIGlzIGNsb3Nlc3QgdG8gYnkgdXNpbmcgYSBmYWN0b3Igb2YgMCBvciAxLiAKYGBge3J9CmxpYnN0YXJnZXRzLmRmPC1jYmluZChsaWJzdGFyZ2V0cy5kZiwiRGlzdGFuY2UiPTAsIkJlbGxlZ3JhZGUiPTAsIkRvdXJiZXMiPTAsIlF1YXJ0aWVyIj0wLCJBbGZhbGZhIj0wLCJUaG9ybnRvbkdhcCI9MCwiQmVycnkgSG9sbG93Ij0wLCJOb3ZhcnVwdGEiPTAsIlVnYW5payBJc2xhbmQiPTApCmBgYAoKVGhlIGRpc3RhbmNlIGZ1bmN0aW9uIGJlbG93IHdpbGwgY2FsY3VsYXRlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gTElCUyB0YXJnZXQgYW5kIGFsbCB0aGUgUElYTCBhYnJhc2lvbnMsIGFuZCBwaWNrIHRoZSBzbWFsbGVzdCBkaXN0YW5jZSB0byBwaWNrIHRoZSBjbG9lc3QgUElYTCBhYnJhc2lvbiB0byB0aGF0IExJQlMgdGFyZ2V0LgpgYGB7cn0KZm9yKGkgaW4gMTpucm93KGxpYnN0YXJnZXRzLmRmKSkgewogICAgbGlic3RhcmdldHMuZGZbaSxjKDY6MTMpXTwtYyhkaXN0SGF2ZXJzaW5lKHBpeGwuZGZbMSxjKDEsMildLGxpYnN0YXJnZXRzLmRmW2ksYygyLDMpXSxyPTMzOTMxNjkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0SGF2ZXJzaW5lKHBpeGwuZGZbMixjKDEsMildLGxpYnN0YXJnZXRzLmRmW2ksYygyLDMpXSxyPTMzOTMxNjkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0SGF2ZXJzaW5lKHBpeGwuZGZbMyxjKDEsMildLGxpYnN0YXJnZXRzLmRmW2ksYygyLDMpXSxyPTMzOTMxNjkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0SGF2ZXJzaW5lKHBpeGwuZGZbNCxjKDEsMildLGxpYnN0YXJnZXRzLmRmW2ksYygyLDMpXSxyPTMzOTMxNjkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0SGF2ZXJzaW5lKHBpeGwuZGZbNSxjKDEsMildLGxpYnN0YXJnZXRzLmRmW2ksYygyLDMpXSxyPTMzOTMxNjkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0SGF2ZXJzaW5lKHBpeGwuZGZbNixjKDEsMildLGxpYnN0YXJnZXRzLmRmW2ksYygyLDMpXSxyPTMzOTMxNjkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0SGF2ZXJzaW5lKHBpeGwuZGZbNyxjKDEsMildLGxpYnN0YXJnZXRzLmRmW2ksYygyLDMpXSxyPTMzOTMxNjkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0SGF2ZXJzaW5lKHBpeGwuZGZbOCxjKDEsMildLGxpYnN0YXJnZXRzLmRmW2ksYygyLDMpXSxyPTMzOTMxNjkpKQogICAgCiAgICBsaWJzdGFyZ2V0cy5kZltpLDFdPC13aGljaC5taW4obGlic3RhcmdldHMuZGZbaSxjKDY6MTMpXSkKICAgIGxpYnN0YXJnZXRzLmRmW2ksNV08LW1pbihsaWJzdGFyZ2V0cy5kZltpLGMoNjoxMyldKQp9CmxpYnN0YXJnZXRzLmRmJG5lYXJlc3RwaXhsPC1hcy5mYWN0b3IobGlic3RhcmdldHMuZGYkbmVhcmVzdHBpeGwpCmxldmVscyhsaWJzdGFyZ2V0cy5kZiRuZWFyZXN0cGl4bCk8LShjKCJCZWxsZWdyYWRlIiwiRG91cmJlcyIsIlF1YXJ0aWVyIiwiQWxmYWxmYSIsIlRob3JudG9uR2FwIiwiQmVycnkgSG9sbG93IiwiTm92YXJ1cHRhIiwiVWdhbmlrIElzbGFuZCIpKQpgYGAKCkJlbG93IGlzIGFub3RoZXIgaW5pdGlhbGl6ZXIgZm9yIHRoZSBQSVhMIGFicmFzaW9uIGRhdGEuIFRoaXMgc2V0cyB0aGUgdmFyaWFibGVzIGZvciBlYWNoIFBJWEwgYWJyYXNpb24uCmBgYHtyfQpCZWxsZWdyYWRlPC1saWJzdGFyZ2V0cy5kZltsaWJzdGFyZ2V0cy5kZiRuZWFyZXN0cGl4bD09IkJlbGxlZ3JhZGUiLF0kdGFyZ2V0CkRvdXJiZXM8LWxpYnN0YXJnZXRzLmRmW2xpYnN0YXJnZXRzLmRmJG5lYXJlc3RwaXhsPT0iRG91cmJlcyIsXSR0YXJnZXQKUXVhcnRpZXI8LWxpYnN0YXJnZXRzLmRmW2xpYnN0YXJnZXRzLmRmJG5lYXJlc3RwaXhsPT0iUXVhcnRpZXIiLF0kdGFyZ2V0CkFsZmFsZmE8LWxpYnN0YXJnZXRzLmRmW2xpYnN0YXJnZXRzLmRmJG5lYXJlc3RwaXhsPT0iQWxmYWxmYSIsXSR0YXJnZXQKVGhvcm50b25HYXA8LWxpYnN0YXJnZXRzLmRmW2xpYnN0YXJnZXRzLmRmJG5lYXJlc3RwaXhsPT0iVGhvcm50b25HYXAiLF0kdGFyZ2V0CkJlcnJ5SG9sbG93PC1saWJzdGFyZ2V0cy5kZltsaWJzdGFyZ2V0cy5kZiRuZWFyZXN0cGl4bD09IkJlcnJ5IEhvbGxvdyIsXSR0YXJnZXQKTm92YXJ1cHRhPC1saWJzdGFyZ2V0cy5kZltsaWJzdGFyZ2V0cy5kZiRuZWFyZXN0cGl4bD09Ik5vdmFydXB0YSIsXSR0YXJnZXQKVWdhbmlrSXNsYW5kPC1saWJzdGFyZ2V0cy5kZltsaWJzdGFyZ2V0cy5kZiRuZWFyZXN0cGl4bD09IlVnYW5payBJc2xhbmQiLF0kdGFyZ2V0CmBgYAoKTmV4dCwgd2UgZmlsdGVyIG91dCB0aGUgTElCUyB0YXJnZXRzIHRoYXQgYXJlIG5vdCB3aXRoaW4gdGhlIHNwZWNpZmllZCBkaXN0YW5jZSB2YXJpYWJsZS4gVGhlbiwgd2UgbWVyZ2UgdGhlIExJQlMgZGF0YSB3aXRoIHRoZSByZXNwZWN0aXZlIFBJWEwgYWJyYXNpb24gYnkgbXV0YXRpbmcgYW5kIGFkZGluZyBhbiBhYnJhc2lvbiBjb2x1bW4gdGhhdCBoYXMgdGhlIGFicmFzaW9uIG5hbWUgY2xvc2VzdCB0byBlYWNoIExJQlMgdGFyZ2V0LiBXZSBhbHNvIGFkZCBhIGNvbHVtbiwgTElCUyBvciBQSVhMLCB3aGljaCBkZW5vdGVzIGlmIHRoZSByb3cgb2YgZGF0YSBpcyBmcm9tIHRoZSBQSVhMIGFuZCBMSUJTIGRhdGEgc2V0cy4KYGBge3J9CmluY2x1ZGVkLmxpYnM8LShsaWJzdGFyZ2V0cy5kZiU+JQogIGZpbHRlcihEaXN0YW5jZTxtZXRlcnMpKSR0YXJnZXQKbGlicy5tYXRyaXggPC1saWJzLmRmICU+JQogIGZpbHRlcih0YXJnZXQgJWluJSBpbmNsdWRlZC5saWJzKQpsaWJzLm1hdHJpeCA8LSBsaWJzLm1hdHJpeFssYyg1LDc6MTQpXQpsaWJzLm1hdHJpeDwtbGlicy5tYXRyaXhbLGMoMToyLDQ6OSwzKV0KbGlicy5tYXRyaXg8LWNiaW5kKCJBYnJhc2lvbiI9MCxsaWJzLm1hdHJpeCkKbGlicy5tYXRyaXg8LWxpYnMubWF0cml4JT4lCiAgbXV0YXRlKEFicmFzaW9uID0gaWZlbHNlKHRhcmdldCVpbiVBbGZhbGZhLCJBbGZhbGZhIiwgCiAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHRhcmdldCAlaW4lIEJlbGxlZ3JhZGUsICJCZWxlZ3JhZGUiLAogICAgICAgICAgICAgICAgICAgIGlmZWxzZSh0YXJnZXQgJWluJSBCZXJyeUhvbGxvdywgIkJlcnJ5IEhvbGxvdyIsCiAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHRhcmdldCAlaW4lIERvdXJiZXMsICJEb3VyYmVzIiwKICAgICAgICAgICAgICAgICAgICBpZmVsc2UodGFyZ2V0ICVpbiUgTm92YXJ1cHRhLCAiTm92YXJ1cHRhIiwKICAgICAgICAgICAgICAgICAgICBpZmVsc2UodGFyZ2V0ICVpbiUgUXVhcnRpZXIsICJRdWFydGllciIsCiAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHRhcmdldCAlaW4lIFRob3JudG9uR2FwLCAiVGhvcm50b25HYXAiLAogICAgICAgICAgICAgICAgICAgIGlmZWxzZSh0YXJnZXQgJWluJSBVZ2FuaWtJc2xhbmQsICJVZ2FuaWsgSXNsYW5kIixBYnJhc2lvbikpKSkpKSkpKQpsaWJzLm1hdHJpeDwtY2JpbmQobGlic29ycGl4bD0xLGxpYnMubWF0cml4KQpgYGAKCk5leHQsIHdlIHdpbGwgcmVhZCBpbiB0aGUgUElYTCBkYXRhLiBXZSB3aWxsIHJlbW92ZSB0aGUgYXRtb3NwaGVyaWMgc2FtcGxlIChmaXJzdCBzYW1wbGUpIGFuZCBvbmx5IGNob29zZSBvbmUgb2YgZWFjaCBQSVhMIHNhbXBsZSBpbiBhcyBlYWNoIGFicmFzaW9uIGhhcyB0d28gc2FtcGxlcyAob25seSBvbmUgd2lsbCBiZSBuZWNlc3NhcnkgZm9yIHRoZSBwbG90KS4KCmBgYHtyLCBkYXRhMDN9CiNyZWFkIGluIHBpeGwgZGF0YSB3aXRoIGxhdC9sb25nCnBpeGwuZGY8LXJlYWRSRFMoIi9hY2FkZW1pY3MvTUFUUC00OTEwLUYyNC9EQVItTWFycy1GMjQvU3R1ZGVudERhdGEvcGl4bF9zb2xfY29vcmRpbmF0ZXMuUmRzIikKcGl4bC5kZjwtcGl4bC5kZiAlPiUKICBzZWxlY3QoYyg1OjgsMTI6MTQsMTcsMTksMTgsMjIpKQojcmVvcmRlciBwaXhsIGNvbHVtbnMgc28gdGhhdCBpdCBtYXRjaGVzIGxpYnMgZGF0YSBvcmdhbml6YXRpb24KcGl4bC5kZjwtcGl4bC5kZlssYygxMSwxMCw0LDMsOCwyLDYsMSw1LDcpXQojcmVtb3ZlIGF0bW9zcGhlcmljIHNhbXBsZQpwaXhsLmRmPC1waXhsLmRmWzI6MTYsXQpwaXhsLmRmPC1jYmluZChsaWJzb3JwaXhsPTAscGl4bC5kZikKYGBgCgpGaW5hbGx5LCB3ZSBtZXJnZSB0aGUgTElCUyBhbmQgUElYTCBkYXRhIHNldHMgd2UgaGF2ZSBtb2RpZmllZCB0aHVzIGZhciBmb3IgYSBjb21iaW5lZCBMSUJTIGFuZCBQSVhMIGRhdGEgZnJhbWUgc3VpdGFibGUgZm9yIGEgc29pbCBjb21wb3NpdGlvbiBsaW5lIHBsb3QuCmBgYHtyfQpjb2xuYW1lcyhwaXhsLmRmKTwtY29sbmFtZXMobGlicy5tYXRyaXgpCnBpeGxsaWJzLmRmPC1yYmluZChwaXhsLmRmLGxpYnMubWF0cml4KQpgYGAKCiMjIDQuMiBDb250cmlidXRpb24KClNvbWUgb2YgdGhlIGRhdGEgbWFuaXB1bGF0aW5nIHdvcmsgd2FzIE1hcmdvJ3MsIHN1Y2ggYXMgdGhlIGRpc3RhbmNlIGZ1bmN0aW9uLiBJbiB0ZXJtcyBvZiBwaXZvdGluZyB0aGUgZGF0YSBmcmFtZSBhbmQgdGhlIG90aGVyIHN0ZXBzIG9mIHRoZSBwcmVwcm9jZXNzaW5nIGlzIG15IG93biB3b3JrLiBUaGUgbWFuaXB1bGF0aW5nIGJlbG93IHRvIHBsb3QgdGhlIGxpbmUgc29pbCBjb21wb3NpdGlvbiBwbG90cyBpcyBteSBvd24uCgojIyA0LjMgTWV0aG9kcyBEZXNjcmlwdGlvbiAKCldoZW4gZGVjaWRpbmcgaG93IHRvIGFwcHJvYWNoIHRoZSBjb25jZXB0IG9mIGJ1aWxkaW5nIHNvaWwgY29tcG9zaXRpb24gcGxvdHMgb2YgZWFjaCBQSVhMIGFicmFzaW9uIGFuZCB0aGUgY29ycmVzcG9uZGluZyBMSUJTIHRhcmdldHMgd2l0aGluIGEgY2VydGFpbiBkaXN0YW5jZSBtYXhpbXVtLCBJIGRlY2lkZWQgdGhlIGJlc3Qgd2F5IHdhcyB0byBzdGFydCB3aXRoIHRoZSBvcmlnaW5hbCBkYXRhIHNldHMgYW5kIG1vZGlmeSB0aGVtIGFzIG5lZWRlZC4gRm9yIHRoZSBhY3R1YWwgcGxvdCwgdGhlIGJlc3Qgd2F5IHRvIGZvcm1hdCB0aGUgZGF0YSBjb3JyZWN0bHkgaXMgdG8gcGl2b3QgaXQsIGFzIEkgbmVlZCB0aGUgeCBheGlzIHRvIGJlIHRoZSBjb2x1bW4gbmFtZXMgaW4gdGhlIGN1cnJlbnQgZGF0YSBmcmFtZSB3ZSBoYXZlIChTaU8yIGFuZCBvdGhlciBjb21wb3NpdGlvbnMpIGFuZCB0aGUgeSBheGlzIHRvIGJlIHRoZSB3ZWlnaHRlZCBjb21wb3NpdGlvbiB2YWx1ZXMuIFdlIGFsc28gbmVlZCBhbiBpbmRpY2F0b3Igb2YgaWYgdGhlIGRhdGEgaXMgZnJvbSBQSVhMIG9yIExJQlMsIHdoaWNoIGFsc28gaXMgaGVscGZ1bCBmb3IgYnVpbGRpbmcgdGhlIGxpbmUgcGxvdHMuIAoKVXNlcnMgd2lsbCBoYXZlIHRvIHNldCB0aGUgZGlzdGFuY2UgdmFyaWFibGUgaW4gb3JkZXIgdG8gY2hvb3NlIHRoZSBtYXggZGlzdGFuY2UgYmV0d2VlbiBQSVhMIGFicmFzaW9ucyBhbmQgTElCUyB0YXJnZXRzLiBUaGlzIGNhbiB2YXN0bHkgY2hhbmdlIHRoZSBudW1iZXIgb2YgbGluZXMgb24gdGhlIHBsb3RzIHdoaWNoIGNhbiBoZWxwIHByZXZlbnQgb3ZlcmNyb3dkZWQgcGxvdHMuIFVzZXJzIGFsc28gY2FuIHNldCBhIHZhcmlhYmxlIHRvIGNob29zZSBhIHNwZWNpZmljIFBJWEwgYWJyYXNpb24gYW5kIGNvcnJlc3BvbmRpbmcgTElCUyB0YXJnZXRzLCB3aGljaCBpcyBlYXNpZXIgdG8gaW50ZXJwcmV0IGFzIHBsb3R0aW5nIGFsbCBvZiB0aGUgTElCUyBhbmQgUElYTCBjb21wb3NpdGlvbiBpbmZvcm1hdGlvbiBvbiBsaW5lIHBsb3RzIGxlYWRzIHRvIHZlcnkgY29uZGVuc2VkIGdyYXBocyB0aGF0IGFyZSBoYXJkIHRvIHJlYWQuCgojIyA0LjQgUmVzdWx0IGFuZCBEaXNjdXNzaW9uIAoKRmlyc3QsIHdlIHdpbGwgdHVybiB0aGUgZWFydGggcXVhcnRpbGUgaW5mb3JtYXRpb24gaW50byBhIGxvbmcgZGF0YSBmcmFtZSAobWVhbmluZyBwaXZvdGluZyB0aGUgY29sdW1ucyBpbnRvIHRoZSB2YWx1ZXMpLiAKYGBge3J9CiMgRWFydGggcXVhcnRpbGVzCmVhcnRocXVhcnRpbGVzX2xvbmcgPC0gZWFydGhxdWFydGlsZXMuZGYgJT4lCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBzdGFydHNfd2l0aCgiU2lPMiIpOmxhc3RfY29sKCksIG5hbWVzX3RvID0gIkNvbXBvdW5kIiwgdmFsdWVzX3RvID0gIlBlcmNlbnRhZ2UiKQoKZWFydGhxdWFydGlsZXNfbG9uZyA8LSBlYXJ0aHF1YXJ0aWxlc19sb25nICU+JSByZW5hbWUoUXVhcnRpbGVzID0gYFRyYWluaW5nIHNldCBRdWFydGlsZXNgKQpgYGAKClRoZW4sIHRoZSBkYXRhIHdpbGwgYmUgZmlsdGVyZWQgdG8gb25seSBpbmNsdWRlIHRoZSBkYXRhIGZyb20gYSBzcGVjaWZpYyBQSVhMIGFicmFzaW9uIGNob3NlbiBieSB0aGUgdXNlci4gVGhlIGRhdGEgaXMgcGl2b3RlZCBpbnRvIGEgbG9uZyBmb3JtYXQsIGFuZCB0aGUgY29sdW1ucyBhcmUgcmVvcmRlcmVkIHRvIG1pbWljIHNpbWlsYXIgcGxvdHMgZnJvbSBOQVNBIHBhcGVycy4KYGBge3J9CiMgRmlsdGVyIGZvciB0aGUgc3BlY2lmaWMgYWJyYXNpb24gc2FtcGxlLCBlLmcuLCAiQWxmYWxmYSIKcGl4bGxpYnNfZmlsdGVyZWQgPC0gcGl4bGxpYnMuZGYgJT4lCiAgZmlsdGVyKEFicmFzaW9uID09IGFicmFzaW9uX25hbWUpCgojIFBpdm90IHRoZSBkYXRhIHRvIGxvbmdlciBmb3JtYXQgZm9yIGdncGxvdApwaXhsbGlic19sb25nIDwtIHBpeGxsaWJzX2ZpbHRlcmVkICU+JQogIHBpdm90X2xvbmdlcihjb2xzID0gc3RhcnRzX3dpdGgoIlNpTzIiKTpsYXN0X2NvbCgpLCBuYW1lc190byA9ICJDb21wb3VuZCIsIHZhbHVlc190byA9ICJQZXJjZW50YWdlIikKCmRlc2lyZWRfb3JkZXIgPC0gYygiU2lPMiIsICJBbDJPMyIsICJGZU9UIiwgIk1nTyIsICJDYU8iLCAiTmEyTyIsICJLMk8iLCAiVGlPMiIpICAjIFNwZWNpZnkgeW91ciBjdXN0b20gb3JkZXIgaGVyZQpwaXhsbGlic19sb25nJENvbXBvdW5kIDwtIGZhY3RvcihwaXhsbGlic19sb25nJENvbXBvdW5kLCBsZXZlbHMgPSBkZXNpcmVkX29yZGVyKQpgYGAKCkZvciB0aGUgcGxvdCwgd2UgdXNlIGdncGxvdCB0byBwbG90IHRoZSBwaXhsbGlic19sb25nIGRhdGEgZnJhbWUgd2UgY3JlYXRlZC4gVGhlIHBsb3QgaXMgY29sb3JlZCBieSBpZiB0aGUgbGluZSBpcyBhIFBJWEwgYWJyYXNpb24ncyBjb21wb3NpdGlvbiBvciBhIExJQlMgdGFyZ2V0J3MgY29tcG9zaXRpb24uIFdlIGFsc28gYWRkIGEgbGF5ZXIgd2l0aCB0aGUgZWFydGggcXVhcnRpbGUgaW5mb3JtYXRpb24sIHdoaWNoIGlzIHRoZSBkb3R0ZWQgbGluZXMuCmBgYHtyfQojIE1hcCB0aGUgUElYTC9MSUJTIGNvbHVtbiB0byBjb2xvciBhbmQgdXNlIHRhcmdldF9uYW1lIHRvIGRpZmZlcmVudGlhdGUgbGluZXMKZ2dwbG90KHBpeGxsaWJzX2xvbmcsIGFlcyh4ID0gQ29tcG91bmQsIHkgPSBQZXJjZW50YWdlLCBjb2xvciA9IGFzLmZhY3RvcihsaWJzb3JwaXhsKSwgZ3JvdXAgPSB0YXJnZXQpKSArCiAgZ2VvbV9saW5lKCkgKwogIGdlb21fcG9pbnQoKSArCiAgc2NhbGVfeV9jb250aW51b3VzKHRyYW5zPSdsb2cxMCcpICsKICAjIEFkZCBFYXJ0aCBxdWFydGlsZSBsaW5lcyB1c2luZyBlYXJ0aHF1YXJ0aWxlc19sb25nCiAgZ2VvbV9saW5lKGRhdGEgPSBlYXJ0aHF1YXJ0aWxlc19sb25nLCBhZXMoeCA9IENvbXBvdW5kLCB5ID0gUGVyY2VudGFnZSwgbGluZXR5cGUgPSBRdWFydGlsZXMsIGdyb3VwID0gUXVhcnRpbGVzKSwgCiAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgbGluZXR5cGUgPSAiZG90dGVkIikgKwogIGxhYnModGl0bGUgPSBwYXN0ZSgiU29pbCBDb21wb3NpdGlvbiBmb3IgUElYTCBhYnJhc2lvbiIsYWJyYXNpb25fbmFtZSwiYW5kIExJQlMgd2l0aGluIiwgbWV0ZXJzLCAibWV0ZXJzIiwgc2VwID0gIiAiKSwKICAgICAgIHggPSAiQ2hlbWljYWwgQ29tcG91bmQiLAogICAgICAgeSA9ICJXZWlnaHQgUGVyY2VudGFnZSIsCiAgICAgICBjb2xvciA9ICJNZWFzdXJlbWVudCBUeXBlIiwKICAgICAgIGxpbmV0eXBlID0gIkVhcnRoIFF1YXJ0aWxlcyIpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiMCIgPSAiYmx1ZSIsICIxIiA9ICJyZWQiKSwgbGFiZWxzID0gYygiUElYTCIsICJMSUJTIikpICsKICB0aGVtZV9taW5pbWFsKCkKYGBgCkkgc3RpbGwgcGxhbiB0byB1cGRhdGUgYW5kIHRyeSB1c2luZyB0aGUgZ2dwbG90bGF5IGZlYXR1cmUgdG8gaW5jb3Jwb3JhdGUgYWxsIHRoZSBhYnJhc2lvbnMgYW5kIGRhdGEgb250byBvbmUgZ3JpZCBvZiBsaW5lIHBsb3RzLiBJIGFsc28gYW0gZ29pbmcgdG8gYWRkIHBsb3RzIHdoZXJlIHRoZSBtZWFuIGlzIHRha2VuIG9mIGFsbCB0aGUgTElCUyB0YXJnZXRzIHRoYXQgY29ycmVzcG9uZCB0byBhIFBJWEwgYWJyYXNpb24gc28gdGhlIHBsb3Qgd2lsbCBvbmx5IGhhdmUgb25lIExJQlMgbGluZSBhbmQgb25lIFBJWEwgbGluZSAoYWxvbmcgd2l0aCB0aGUgcmVmZXJlbmNlcyksIHRoaXMgaXMgYWxsIGp1c3QgZm9yIHRoZSBkcmFmdC4gSSBhbHNvIG5lZWQgdG8gb25seSBhZGQgY2VydGFpbiBxdWFydGlsZSBpbmZvcm1hdGlvbiBhbmQgbGFiZWwgdGhlbSwgdGhpcyBpcyBqdXN0IGEgcGxhY2Vob2xkZXIgb2YgdGhlIHByZXZpb3VzIHBsb3QuIEFsc28gbWF5YmUgd2lsbCBhZGQgaW4gU0NDVCB2YWx1ZXMgYXMgcmVmZXJlbmNlcywgbm90IHN1cmUgaWYgdGhleSBhcmUgc3VwZXIgcmVsZXZhbnQgb3IgaG93IHRvIHNvcnQgdGhlbS4KCiMjIDQuNSBDb25jbHVzaW9ucyBhbmQgRnV0dXJlIFdvcmsKVGhpcyBmaW5kaW5nIGNhbiBiZSB1c2VkIGJ5IGdlb2xvZ2lzdHMgdG8gYW5hbHl6ZSB3aGF0IGRpZmZlcmVudCBzb2lsIGNvbXBvc2l0aW9ucyBhcm91bmQgZGlmZmVyZW50IFBJWEwgYWJyYXNpb25zIGNhbiBtZWFuIGZvciBsaWZlIG9uIE1hcnMuIEZvciBleGFtcGxlLCBveGlkZSBwcmVzZW5jZSBkb2Vzbid0IG5lY2Vzc2FyaWx5IGluZGljYXRlIGxpZmUsIGJ1dCBpdCBjb3VsZCBpbmRpY2F0ZSBiaW9sb2dpY2FsIG9yIGNoZW1pY2FsIGxpZmUgcHJvY2Vzc2VzLiBGb3IgZXhhbXBsZSwgQ2FPIGNhbiBpbmRpY2F0ZSB0aGUgcHJlc2VuY2Ugb2Ygb2xkIGJpb2xvZ2ljYWwgbWF0ZXJpYWwgbGlrZSBzaGVsbHMgb3IgZm9zc2lscy4KLUFkZCBtb3JlIGFib3V0IGZ1dHVyZSB3b3JrLCBub3Qgc3VyZSB3aGF0IGVsc2UgdG8gaW5jbHVkZQoKIyA1LjAgRmluZGluZyAzOiBBbmFseXppbmcgQ2F0aW9uIENvbWJpbmF0aW9ucyB1c2luZyBMSUJTIGFuZCBQSVhMIG1hdGNoZWQgZGF0YQpVc2luZyB0aGUgTElCUyBhbmQgUElYTCBjb21iaW5lZCBkYXRhIHNldCwgd2UgY3JlYXRlZCBhIHRlcm5hcnkgcGxvdCB0byBzaG93IHRoZSBkaXN0cmlidXRpb24gb2YgTElCUyBzYW1wbGVzIHNvcnRlZCBieSB3aGF0IFBJWEwgYWJyYXNpb24gdGhleSBhcmUgY2xvc2VzdCB0byAoYmFzZWQgb24gYSBjaG9zZW4gZGlzdGFuY2UgdmFyaWFibGUpLiBNdWNoIG9mIHRoZSBkYXRhIHByZXByb2Nlc3NpbmcgaXMgc2ltaWxhciB0byBGaW5kaW5nIDEgd2hpY2ggd2Ugd2lsbCByZXBlYXQgaGVyZS4gSG93ZXZlciwgdGhlIGdvYWwgaGVyZSBpcyB0byBhbmFseXplIGhvdyBkaWZmZXJlbnQgZ3JvdXBzIG9mIExJQlMgc2FtcGxlcyAoY29sb3JlZCBieSBtYXRjaGluZyBQSVhMIGFicmFzaW9uKSBkaWZmZXIgYnkgY2F0aW9uIGNvbXBvc2l0aW9uLgoKIyMgNS4xIERhdGEsIENvZGUsIGFuZCBSZXNvdXJjZXMKSGVyZSBpcyBhIGxpc3QgZGF0YSBzZXRzLCBjb2RlcywgdGhhdCBhcmUgdXNlZCBpbiB5b3VyIHdvcmsuIEFsb25nIHdpdGggYnJpZWYgZGVzY3JpcHRpb24gYW5kIFVSTCB3aGVyZSB0aGV5IGFyZSBsb2NhdGVkLgoKMS4gcGV0ZXJjLWZpbmFsUHJvamVjdEYyNC5SbWQgKHdpdGgga25pdCBwZGYgYW5kIGh0bWwpIGlzIHRoaXMgbm90ZWJvb2suCltodHRwczovL2dpdGh1Yi5ycGkuZWR1L0RhdGFJTkNJVEUvREFSLU1hcnMtRjI0L3RyZWUvbWFpbi9TdHVkZW50Tm90ZWJvb2tzL0Fzc2lnbm1lbnQwNy9wZXRlcmMtZmluYWxQcm9qZWN0RjI0LlJtZF0oaHR0cHM6Ly9naXRodWIucnBpLmVkdS9EYXRhSU5DSVRFL0RBUi1NYXJzLUYyNC90cmVlL21haW4vU3R1ZGVudE5vdGVib29rcy9Bc3NpZ25tZW50MDcvcmNzaWQtZmluYWxQcm9qZWN0RjI0LlJtZCkKCjIuIHN1cGVyY2FtX2xpYnNfbW9jX2xvYy5SZHMgd2hpY2ggaXMgdGhlIG9yaWdpbmFsIExJQlMgZGF0YSBnaXZlbiB0byBvdXIgcmVzZWFyY2ggZ3JvdXAuCltodHRwczovL2dpdGh1Yi5ycGkuZWR1L0RhdGFJTkNJVEUvREFSLU1hcnMtRjI0L2Jsb2IvbWFpbi9EYXRhL3N1cGVyY2FtX2xpYnNfbW9jX2xvYy5SZHNdKGh0dHBzOi8vZ2l0aHViLnJwaS5lZHUvRGF0YUlOQ0lURS9EQVItTWFycy1GMjQvYmxvYi9tYWluL0RhdGEvc3VwZXJjYW1fbGlic19tb2NfbG9jLlJkcykKCgpGaXJzdCwgd2Ugc2V0IGEgZGlzdGFuY2UgdmFyaWFibGUgd2hpY2ggY2FuIGJlIHVzZWQgYXMgYSBzbGlkZXIgYmFyIGluIHRoZSBhcHAuIENoYW5naW5nIHRoaXMgdmFyaWFibGUgc2V0cyB0aGUgbWF4aW11bSBkaXN0YW5jZSBiZXR3ZWVuIGEgUElYTCB0YXJnZXQgYW5kIExJQlMgc2FtcGxlIGZvciB0aGVtIHRvIGJlIGNsYXNzaWZpZWQgdG9nZXRoZXIuCmBgYHtyfQojc2V0IGRpc3RhbmNlIHZhcmlhYmxlIHdoaWNoIGNhbiBiZSB1c2VkIGFzIGEgdG9nZ2xlIHRvb2wKZGlzdGFuY2U9NTAKYGBgCgpUbyBwcmVwYXJlIHRoZSBkYXRhLCBJIHN0YXJ0IGJ5IGxvYWRpbmcgaW4gdGhlIExJQlMgZGF0YS4gVGhlbiwgd2UgZHJvcCB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIGNvbHVtbnMgYW5kIHN1bSBvZiBwZXJjZW50YWdlIGNvbHVtbnMgbGVhdmluZyB1cyB3aXRoIGp1c3QgdGhlIHdlaWdodGVkIGNvbXBvc2l0aW9uIGluIHRlcm1zIG9mIG51bWVyaWNhbCBkYXRhLiBXZSBhbHNvIHJlbW92ZSB0aGUgc2NjdCB2YWx1ZXMsIGFzIHRob3NlIHZhbHVlcyBhcmUgdGhlIG9uZXMgdGhhdCBhcmUgZWFydGggcmVmZXJlbmNlIHNhbXBsZXMgdGhhdCBQZXJzZXJ2ZXJhbmNlIGNhcnJpZXMgd2l0aCBpdC4gVGhlcmVmb3JlLCB0aGV5IHdpbGwgbm90IGJlIHZlcnkgcmVsZXZhbnQgd2hlbiBwbG90dGluZyB0aGUgTElCUyBkYXRhIGFzIHdlIGFyZSBmb2N1c2VkIG9uIHRoZSBjYXRpb24gY29tYmluYXRpb25zIGFuZCB0aGVyZWZvcmUgb25seSBuZWVkIHRoZSB3ZWlnaHRlZCBjb21wb3NpdGlvbnMuCmBgYHtyfQojTG9hZCBpbiBMSUJTIGRhdGEKbGlicy5kZiA8LSByZWFkUkRTKCIvYWNhZGVtaWNzL01BVFAtNDkxMC1GMjQvREFSLU1hcnMtRjI0L0RhdGEvc3VwZXJjYW1fbGlic19tb2NfbG9jLlJkcyIpCiNEcm9wIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gZmVhdHVyZXMsIHRoZSBzdW0gb2YgdGhlIHBlcmNlbnRhZ2VzLCAKI3RoZSBkaXN0YW5jZSwgYW5kIHRoZSB0b3RhbCBmcmVxdWVuY2llcwpsaWJzLmRmIDwtIGxpYnMuZGYgJT4lIAogIHNlbGVjdCghKGMoZGlzdGFuY2VfbW0sVG90LkVtLixTaU8yX3N0ZGV2LFRpTzJfc3RkZXYsQWwyTzNfc3RkZXYsRmVPVF9zdGRldiwKICAgICAgICAgICAgIE1nT19zdGRldixOYTJPX3N0ZGV2LENhT19zdGRldixLMk9fc3RkZXYsVG90YWwpKSkKIyBDb252ZXJ0IHRoZSBwb2ludHMgdG8gbnVtZXJpYwpsaWJzLmRmJHBvaW50IDwtIGFzLm51bWVyaWMobGlicy5kZiRwb2ludCkKbGlicy5kZlssNjoxM10gPC0gc2FwcGx5KGxpYnMuZGZbLDY6MTNdLGFzLm51bWVyaWMpCiNyZW1vdmUgdGhlIHNjY3QvcmVmZXJlbmNlIHNhbXBsZXMKbGlicy5kZjwtbGlicy5kZiU+JQogIGZpbHRlcighKGdyZXBsKCJzY2N0IiwgdGFyZ2V0KSkpCiNhZGQgYSBjb2x1bW4gdG8gaW5kaWNhdGUgdGhlIG5lYXJlc3QgcGl4bApsaWJzLmRmPC1jYmluZChuZWFyZXN0cGl4bD0wLGxpYnMuZGYpCiNtYWtlIGEgZGF0YWZyYW1lIG9mIGp1c3QgdGhlIExJQlMgTGF0L0xvbmcgYW5kIHRhcmdldCBuYW1lIGFuZCByZW1vdmUgZHVwbGljYXRlcwpsaWJzdGFyZ2V0cy5kZjwtbGlicy5kZlssYygxLDMsNCw1KV0KbGlic3RhcmdldHMuZGY8LWRpc3RpbmN0KGxpYnN0YXJnZXRzLmRmKQpgYGAKCkxvYWQgaW4gUElYTCBkYXRhCmBgYHtyfQojcmVhZCBpbiBwaXhsIGRhdGEgd2l0aCBsYXQvbG9uZwpwaXhsLmRmPC1yZWFkUkRTKCIvYWNhZGVtaWNzL01BVFAtNDkxMC1GMjQvREFSLU1hcnMtRjI0L1N0dWRlbnREYXRhL3BpeGxfc29sX2Nvb3JkaW5hdGVzLlJkcyIpCiNpbmNsdWRlIG9ubHkgcGl4bCBtZXRhZGF0YQpwaXhsLmRmPC1waXhsLmRmICU+JQogIHNlbGVjdChjKDEsMiwxOSwyMCwyMikpCiNjb252ZXJ0IExhdC9Mb25nIHRvIG51bWVyaWMKcGl4bC5kZiRMYXQgPC0gYXMubnVtZXJpYyhwaXhsLmRmJExhdCkKcGl4bC5kZiRMb25nIDwtIGFzLm51bWVyaWMocGl4bC5kZiRMb25nKQojcmVtb3ZlIHJvd3Mgc28gd2Ugb25seSBoYXZlIG9uZSBzYW1wbGUgcGVyIGFicmFzaW9uIGFuZCByZW1vdmUgYXRtb3NwaGVyaWMgc2FtcGxlCnBpeGwuZGY8LXBpeGwuZGZbYygyLDQsNiw4LDEwLDEyLDE0LDE2KSxdCmBgYAoKTmV4dCwgd2Ugd2lsbCBpbml0aWFsaXplIGEgZGlzdGFuY2UgdmFyaWFibGUgKHRvIGluZGljYXRlIGRpc3RhbmNlIGJldHdlZW4gUElYTCBhYnJhc2lvbiBhbmQgTElCUyB0YXJnZXQpIGFuZCBhbHNvIGluaXRpYWxpemUgZWFjaCBQSVhMIGFicmFzaW9uLCB3aGljaCB3aWxsIGJlIHVzZWQgdG8gbWFyayB3aGljaCBQSVhMIGFicmFzaW9uIHRoZSBMSUJTIHNhbXBsZSBpcyBjbG9zZXN0IHRvIGJ5IHVzaW5nIGEgZmFjdG9yIG9mIDAgb3IgMS4gCmBgYHtyfQojTElCUyB0YXJnZXQgZGF0YSBmcmFtZSB3aXRoIGRpc3RhbmNlIHZhcmlhYmxlIGFzIHdlbGwKbGlic3RhcmdldHMuZGY8LWNiaW5kKGxpYnN0YXJnZXRzLmRmLCJEaXN0YW5jZSI9MCwiQmVsbGVncmFkZSI9MCwiRG91cmJlcyI9MCwiUXVhcnRpZXIiPTAsIkFsZmFsZmEiPTAsIlRob3JudG9uR2FwIj0wLCJCZXJyeUhvbGxvdyI9MCwiTm92YXJ1cHRhIj0wLCJVZ2FuaWtJc2xhbmQiPTApCmBgYAoKVGhlIGRpc3RhbmNlIGZ1bmN0aW9uIGJlbG93IHdpbGwgY2FsY3VsYXRlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gTElCUyB0YXJnZXQgYW5kIGFsbCB0aGUgUElYTCBhYnJhc2lvbnMsIGFuZCBwaWNrIHRoZSBzbWFsbGVzdCBkaXN0YW5jZSB0byBwaWNrIHRoZSBjbG9zZXN0IFBJWEwgYWJyYXNpb24gdG8gdGhhdCBMSUJTIHRhcmdldC4KYGBge3J9CiNEaXN0YW5jZSBmdW5jdGlvbgpmb3IoaSBpbiAxOm5yb3cobGlic3RhcmdldHMuZGYpKSB7CiAgICBsaWJzdGFyZ2V0cy5kZltpLGMoNjoxMyldPC1jKGRpc3RIYXZlcnNpbmUocGl4bC5kZlsxLGMoMSwyKV0sbGlic3RhcmdldHMuZGZbaSxjKDIsMyldLHI9MzM5MzE2OSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RIYXZlcnNpbmUocGl4bC5kZlsyLGMoMSwyKV0sbGlic3RhcmdldHMuZGZbaSxjKDIsMyldLHI9MzM5MzE2OSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RIYXZlcnNpbmUocGl4bC5kZlszLGMoMSwyKV0sbGlic3RhcmdldHMuZGZbaSxjKDIsMyldLHI9MzM5MzE2OSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RIYXZlcnNpbmUocGl4bC5kZls0LGMoMSwyKV0sbGlic3RhcmdldHMuZGZbaSxjKDIsMyldLHI9MzM5MzE2OSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RIYXZlcnNpbmUocGl4bC5kZls1LGMoMSwyKV0sbGlic3RhcmdldHMuZGZbaSxjKDIsMyldLHI9MzM5MzE2OSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RIYXZlcnNpbmUocGl4bC5kZls2LGMoMSwyKV0sbGlic3RhcmdldHMuZGZbaSxjKDIsMyldLHI9MzM5MzE2OSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RIYXZlcnNpbmUocGl4bC5kZls3LGMoMSwyKV0sbGlic3RhcmdldHMuZGZbaSxjKDIsMyldLHI9MzM5MzE2OSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RIYXZlcnNpbmUocGl4bC5kZls4LGMoMSwyKV0sbGlic3RhcmdldHMuZGZbaSxjKDIsMyldLHI9MzM5MzE2OSkpCiAgICAKICAgIGxpYnN0YXJnZXRzLmRmW2ksMV08LXdoaWNoLm1pbihsaWJzdGFyZ2V0cy5kZltpLGMoNjoxMyldKQogICAgbGlic3RhcmdldHMuZGZbaSw1XTwtbWluKGxpYnN0YXJnZXRzLmRmW2ksYyg2OjEzKV0pCn0KbGlic3RhcmdldHMuZGYkbmVhcmVzdHBpeGw8LWFzLmZhY3RvcihsaWJzdGFyZ2V0cy5kZiRuZWFyZXN0cGl4bCkKbGV2ZWxzKGxpYnN0YXJnZXRzLmRmJG5lYXJlc3RwaXhsKTwtKGMoIkJlbGxlZ3JhZGUiLCJEb3VyYmVzIiwiUXVhcnRpZXIiLCJBbGZhbGZhIiwiVGhvcm50b25HYXAiLCJCZXJyeUhvbGxvdyIsIk5vdmFydXB0YSIsIlVnYW5pa0lzbGFuZCIpKQpgYGAKCkJlbG93IGlzIGFub3RoZXIgaW5pdGlhbGl6ZXIgZm9yIHRoZSBQSVhMIGFicmFzaW9uIGRhdGEuIFRoaXMgc2V0cyB0aGUgdmFyaWFibGVzIGZvciBlYWNoIFBJWEwgYWJyYXNpb24uCmBgYHtyfQojU2V0cyBlYWNoIG5lYXJlc3QgUElYTCB2YXJpYWJsZSBmb3IgZnV0dXJlIHVzZSBpbiBkZWNpZGluZyB3aGljaCB0YXJnZXQgaXMgY2xvc2VzdCB0byBhIExJQlMgc2FtcGxlCkJlbGxlZ3JhZGU8LWxpYnN0YXJnZXRzLmRmW2xpYnN0YXJnZXRzLmRmJG5lYXJlc3RwaXhsPT0iQmVsbGVncmFkZSIsXSR0YXJnZXQKRG91cmJlczwtbGlic3RhcmdldHMuZGZbbGlic3RhcmdldHMuZGYkbmVhcmVzdHBpeGw9PSJEb3VyYmVzIixdJHRhcmdldApRdWFydGllcjwtbGlic3RhcmdldHMuZGZbbGlic3RhcmdldHMuZGYkbmVhcmVzdHBpeGw9PSJRdWFydGllciIsXSR0YXJnZXQKQWxmYWxmYTwtbGlic3RhcmdldHMuZGZbbGlic3RhcmdldHMuZGYkbmVhcmVzdHBpeGw9PSJBbGZhbGZhIixdJHRhcmdldApUaG9ybnRvbkdhcDwtbGlic3RhcmdldHMuZGZbbGlic3RhcmdldHMuZGYkbmVhcmVzdHBpeGw9PSJUaG9ybnRvbkdhcCIsXSR0YXJnZXQKQmVycnlIb2xsb3c8LWxpYnN0YXJnZXRzLmRmW2xpYnN0YXJnZXRzLmRmJG5lYXJlc3RwaXhsPT0iQmVycnlIb2xsb3ciLF0kdGFyZ2V0Ck5vdmFydXB0YTwtbGlic3RhcmdldHMuZGZbbGlic3RhcmdldHMuZGYkbmVhcmVzdHBpeGw9PSJOb3ZhcnVwdGEiLF0kdGFyZ2V0ClVnYW5pa0lzbGFuZDwtbGlic3RhcmdldHMuZGZbbGlic3RhcmdldHMuZGYkbmVhcmVzdHBpeGw9PSJVZ2FuaWtJc2xhbmQiLF0kdGFyZ2V0CmBgYAoKTmV4dCwgd2UgZmlsdGVyIG91dCB0aGUgTElCUyB0YXJnZXRzIHRoYXQgYXJlIG5vdCB3aXRoaW4gdGhlIHNwZWNpZmllZCBkaXN0YW5jZSB2YXJpYWJsZS4gVGhlbiwgd2UgbWVyZ2UgdGhlIExJQlMgZGF0YSB3aXRoIHRoZSByZXNwZWN0aXZlIFBJWEwgYWJyYXNpb24gYnkgbXV0YXRpbmcgYW5kIGFkZGluZyBhbiBhYnJhc2lvbiBjb2x1bW4gdGhhdCBoYXMgdGhlIGFicmFzaW9uIG5hbWUgY2xvc2VzdCB0byBlYWNoIExJQlMgdGFyZ2V0LiBXZSBhbHNvIGFkZCBhIGNvbHVtbiwgTElCUyBvciBQSVhMLCB3aGljaCBkZW5vdGVzIGlmIHRoZSByb3cgb2YgZGF0YSBpcyBmcm9tIHRoZSBQSVhMIGFuZCBMSUJTIGRhdGEgc2V0cy4gV2UgYWxzbyBzZXQgdXAgdGhlIGxpYnMudGVybiBtYXRyaXggd2hpY2ggd2lsbCAKYGBge3J9CmluY2x1ZGVkLmxpYnM8LShsaWJzdGFyZ2V0cy5kZiU+JQogIGZpbHRlcihEaXN0YW5jZTxtZXRlcnMpKSR0YXJnZXQKbGlicy5tYXRyaXggPC1saWJzLmRmICU+JQogIGZpbHRlcih0YXJnZXQgJWluJSBpbmNsdWRlZC5saWJzKQojc2V0IExJQlMgbWF0cml4IGFuZCB0ZXJuYXJ5IHBsb3QgYnkgYWRkaW5nIGluIGNhdGlvbiBjb21wb25lbnRzIGFuZCBtdXRhdGluZwpsaWJzLm1hdHJpeCA8LSBsaWJzLm1hdHJpeFssYyg1LDc6MTQpXQpsaWJzLnRlcm4gPC0gYXMuZGF0YS5mcmFtZShsaWJzLm1hdHJpeCkgJT4lCiAgbXV0YXRlKHg9KFNpTzIrQWwyTzMpLzEwMCx5PShGZU9UK01nTykvMTAwLHo9KENhTytOYTJPK0syTykvMTAwKSAlPiUKICBzZWxlY3QoLWMoU2lPMixBbDJPMyxGZU9ULE1nTyxDYU8sTmEyTyxLMk8sVGlPMikpCmxpYnMudGVybjwtY2JpbmQoIkFicmFzaW9uIj0wLGxpYnMudGVybikKI1NldCB3aGF0IGFicmFzaW9uIGdvZXMgd2l0aCB0aGUgcmVzcGVjdGl2ZSBMSUJTIHNhbXBsZSBpdCBtYXRjaGVzIHdpdGgKbGlicy50ZXJuPC1saWJzLnRlcm4lPiUKICBtdXRhdGUoQWJyYXNpb24gPSBpZmVsc2UodGFyZ2V0JWluJUFsZmFsZmEsIkFsZmFsZmEiLCAKICAgICAgICAgICAgICAgICAgICBpZmVsc2UodGFyZ2V0ICVpbiUgQmVsbGVncmFkZSwgIkJlbGVncmFkZSIsCiAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHRhcmdldCAlaW4lIEJlcnJ5SG9sbG93LCAiQmVycnlIb2xsb3ciLAogICAgICAgICAgICAgICAgICAgIGlmZWxzZSh0YXJnZXQgJWluJSBEb3VyYmVzLCAiRG91cmJlcyIsCiAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHRhcmdldCAlaW4lIE5vdmFydXB0YSwgIk5vdmFydXB0YSIsCiAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHRhcmdldCAlaW4lIFF1YXJ0aWVyLCAiUXVhcnRpZXIiLAogICAgICAgICAgICAgICAgICAgIGlmZWxzZSh0YXJnZXQgJWluJSBUaG9ybnRvbkdhcCwgIlRob3JudG9uR2FwIiwKICAgICAgICAgICAgICAgICAgICBpZmVsc2UodGFyZ2V0ICVpbiUgVWdhbmlrSXNsYW5kLCAiVWdhbmlrSXNsYW5kIixBYnJhc2lvbikpKSkpKSkpKQojc3VtbWFyeSBvZiBMSUJTIGRhdGEgaW5jbHVkaW5nIGRpc3RhbmNlIHBhcmFtZXRlciwgbnVtYmVyIG9mIExJQlMgdGFyZ2V0cywgYW5kIG51bWJlciBvZiBMSUJTIHBvaW50cwprYWJsZWRmPC1yYmluZCgiRGlzdGFuY2UgKG0pIj1tZXRlcnMsIlRhcmdldHMiPWxlbmd0aChpbmNsdWRlZC5saWJzKSwiUG9pbnRzIj1ucm93KGxpYnMudGVybikpCmthYmxlKGthYmxlZGYsIGNhcHRpb24gPSJMSUJTICMgb2YgVGFyZ2V0cyBhbmQgUG9pbnRzIHdpdGhpbiBTcGVjaWZpZWQgRGlzdGFuY2UiKQpgYGAKCgoKIyMgNS4yIENvbnRyaWJ1dGlvbgoKVGhpcyB3b3JrIHdhcyBhbHNvIGEgY29tYmluYXRpb24gb2YgbWUgYW5kIE1hcmdvLiBUaGUgZGF0YSBzZXQgY3JlYXRpb24gd2FzIGJvdGggb2YgdXMgaW4gb3VyIGJyYWluc3Rvcm1pbmcgYXMgdGhpcyB1dGlsaXplcyB0aGUgZGF0YSBzZXQgd2UgY3JlYXRlZCBvZiBsYXRpdHVkZSBhbmQgbG9uZ2l0dWRlIGZvciBQSVhMLgotIEFkZCBtb3JlIGhlcmUKLSBWZXJ5IHNpbWlsYXIgdG8gb3RoZXIgdHdvIHNlY3Rpb25zIGFkZCBpbiBsYXRlciwgTWFyZ28gYW5kIEkgd29ya2VkIG9uIG1vc3Qgb2YgdGhpcyB0b2dldGhlcgoKIyMgNS4zIE1ldGhvZHMgRGVzY3JpcHRpb24gCgotIFN0YXJ0ZWQgd2l0aCBmaWx0ZXJpbmcgb3JpZ2luYWwgZGF0YSB0byBnZXQgcmlkIG9mIFNDQ1QgdmFsdWVzCi0gdGhlbiBzZXQgdXAgdGVybmFyeSBkYXRhIGZyYW1lIGJ5IG11dGF0aW5nIGJ5IGNhdGlvbiBjb21wb3NpdGlvbnMKLSB0aGVuIG11dGF0ZWQgdG8gbWFrZSB0aGUgUElYTCBhYnJhc2lvbnMgdGhlIGtleSwgc28gdGhlIExJQlMgdGFyZ2V0cyBhcmUgY29sb3JlZCBieSB0aGUgY2xvc2VzdCBQSVhMIGFicmFzaW9uLCBjcmVhdGluZyBhIGZvcm0gb2YgY2x1c3RlcnMuCgojIyA1LjQgUmVzdWx0IGFuZCBEaXNjdXNzaW9uIApVc2luZyBhbGwgb2YgdGhlIG1hbmlwdWxhdGlvbiBkb25lIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIHRlcm5hcnkgcGxvdCwgd2UgdGhlbiBwbG90IHVzaW5nIHRoZSBnZ3Rlcm4gY29tbWFuZC4gV2Ugd2lsbCBjb2xvciBieSBhYnJhc2lvbiB0byBzZWUgdGhlIGRpc3RyaWJ1dGlvbiBvZiBjb21wb3NpdGlvbiBiZXR3ZWVuIGRpZmZlcmVudCBhYnJhc2lvbnMuIFRoaXMgc2hvdWxkIGhlbHAgdXMgYmUgYWJsZSB0byBkcmF3IGRpZmZlcmVudCBjb25jbHVzaW9ucyBhYm91dCBob3cgYWJyYXNpb25zIHJlbGF0ZSBvciBkb24ndCByZWxhdGUuIFRoZSBtYXggZGlzdGFuY2UgYmV0d2VlbiB0aGUgUElYTCB0YXJnZXQgYW5kIExJQlMgc2FtcGxlIGNhbiBiZSBtb2RpZmllZCBob3dldmVyIGRlc2lyZWQuCmBgYHtyfQpnZ3Rlcm4obGlicy50ZXJuLCBnZ3Rlcm46OmFlcyh4PXgseT15LHo9eikpICsKICBnZW9tX3BvaW50KGRhdGE9bGlicy50ZXJuLGFlcyhjb2xvcj1BYnJhc2lvbixhbHBoYT0wLjUpKSArIAogIHRoZW1lX3JnYncoKSArIAogIGxhYnModGl0bGU9cGFzdGUoIk1hcnMgTElCUyBEYXRhIFdpdGhpbiIsZGlzdGFuY2UsIm1ldGVycyBvZiBQSVhMIixzZXA9IiAiKSwKICAgICAgIHg9IlNpK0FsIiwKICAgICAgIHk9IkZlK01nIiwKICAgICAgIHo9IkNhK05hK0siKSt0aGVtZShsZWdlbmQucG9zaXRpb249InJpZ2h0IikgKyAKICBndWlkZXMoYWxwaGE9Im5vbmUiKQpgYGAKCiMjIDUuNSBDb25jbHVzaW9ucyBhbmQgRnV0dXJlIFdvcmsKQmFzZWQgb24gdGhpcyB0ZXJuYXJ5IHBsb3QsIHdlIGNhbiBzZWUgQWxmYWxmYSBhbmQgQmVsZWdyYWRlIGFyZSBoaWdoZXIgaW4gU2krQWwgYW5kIFVnYW5payBJc2xhbmQgaXMgYW4gb3V0bGllci4gQXMgdGhpcyB3YXMgdGhlIGxhc3QgcGllY2Ugb2YgdGhlIFBJWEwgZGF0YSBpbiB0aGUgZGF0YSBzZXQgYW5kIGl0IHdhcyBtaXNzaW5nIGEgcGFpciBzaW5jZSBldmVyeSBvdGhlciBhYnJhc2lvbiB3YXMgbWFkZSB1cCBvZiB0d28gc2FtcGxlcywgaXQgaXMgaW5jbHVkZWQgaW4gaGVyZSBidXQgdW50aWwgdGhlIGRhdGEgc2V0IGlzIHVwZGF0ZWQgdGhlcmUgaXMgbm90IGVub3VnaCBjb250ZXh0IHRvIGV4cGxhaW4gd2h5IGl0IGlzIHNvIHZhc3RseSBkaWZmZXJlbnQuIEkgd291bGQgYXNzdW1lIGl0IGlzIGR1ZSB0byBob3cgdGhlIHJvYm90IGlzIHRyYXZlbGluZyBhbmQgdGhlIGxvY2F0aW9uIG9mIHRoZSBVZ2FuaWtJc2xhbmQgYWJyYXNpb24gaXMgdmVyeSBkaWZmZXJlbnQgdGhhbiB0aGUgb3RoZXIgNyBhYnJhc2lvbnMuCi0gRnV0dXJlIHdvcmssIHdvdWxkIGluY2x1ZGUgbW9yZSBkYXRhIHRvIGdhaW4gYnJvYWRlciBjb250ZXh0CgojIEJpYmxpb2dyYXBoeQpQcm92aWRlIGEgbGlzdGluZyBvZiByZWZlcmVuY2VzIGFuZCBvdGhlciBzb3VyY2VzLgoKKiBBbmFseXN0J3MgTm90ZWJvb2sKKiBOb3Qgc3VyZSB3aGF0IGVsc2UgaXMgcmVsZXZhbnQsIG1vc3Qgb2Ygd2hhdCBJIHVzZWQgd2FzIHNpbWlsYXIgdG8gQW5hbHlzdCdzIE5vdGVib29rCgojIEFwcGVuZGl4CgoqSW5jbHVkZSBoZXJlIHdoYXRldmVyIHlvdSB0aGluayBpcyByZWxldmFudCB0byBzdXBwb3J0IHRoZSBtYWluIGNvbnRlbnQgb2YgeW91ciBub3RlYm9vay4gRm9yIGV4YW1wbGUsIHlvdSBtYXkgaGF2ZSBvbmx5IGluY2x1ZGUgZXhhbXBsZSBmaWd1cmVzIGFib3ZlIGluIHlvdXIgbWFpbiB0ZXh0IGJ1dCBpbmNsdWRlIGFkZGl0aW9uYWwgb25lcyBoZXJlLiBPciB5b3UgbWF5IGhhdmUgZG9uZSBhIG1vcmUgZXh0ZW5zaXZlIGludmVzdGlnYXRpb24sIGFuZCB3YW50IHRvIHB1dCBtb3JlIHJlc3VsdHMgaGVyZSB0byBkb2N1bWVudCB5b3VyIHdvcmsgaW4gdGhlIHNlbWVzdGVyLiBCZSBzdXJlIHRvIGRpdmlkZSBhcHBlbmRpeCBpbnRvIGFwcHJvcHJpYXRlIHNlY3Rpb25zIGFuZCBtYWtlIHRoZSBjb250ZW50cyBjbGVhciB0byB0aGUgcmVhZGVyIHVzaW5nIGFwcHJvYWNoZXMgZGlzY3Vzc2VkIGFib3ZlLiAqIApTaG91bGQgSSBhZGQgbW9yZSBleGFtcGxlcyBoZXJlIG9mIHNvaWwgY29tcG9zaXRpb24gcGxvdHMgb2YgZGlmZmVyZW50IGFicmFzaW9ucz8gSSBhbHNvIGNvdWxkIGFkZCBoZWF0IG1hcCBhbmFseXNpcyB0byB0aGlzIG5vdGVib29rIGFzIGEgZmluZGluZyBidXQgd2Fzbid0IHN1cmUgaWYgaXQgd2FzIHJlYWxseSByZWxldmFudC4KCg==
+
LS0tCnRpdGxlOiAiRGF0YSBBbmFseXRpY3MgUmVzZWFyY2ggSW5kaXZpZHVhbCBGaW5hbCBQcm9qZWN0IFJlcG9ydCAtIE1hcnMiCmF1dGhvcjogIkNoYXJsb3R0ZSBQZXRlcnNvbiIKZGF0ZTogIkZhbGwgMjAyNCIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiAzCiAgICB0b2NfZmxvYXQ6IHllcwogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMKICAgIHRoZW1lOiB1bml0ZWQKICBodG1sX25vdGVib29rOiBkZWZhdWx0CiAgcGRmX2RvY3VtZW50OgogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogJzMnCi0tLQoKCiMgREFSIFByb2plY3QgYW5kIEdyb3VwIE1lbWJlcnMKCiogUHJvamVjdCBuYW1lOiBNYXJzCiogR2l0SHViIElEOiBkYXItcGV0ZXJjCiogUHJvamVjdCB0ZWFtIG1lbWJlcnM6IERhbnRlIE13YXRpYm8sIERvw7FhIFJvYmVydHMsIERhdmlkIFdhbGN5emssIFh1YW50aW5nIFdhbmcsIEFzaHRvbiBDb21wdG9uLCBNYXJnbyBWYW5Fc3NlbHN0eW4sIE5pY29sYXMgTW9yYXdza2ksIENKIE1hcmlubywgQWFkaSBMYWhpcmkgCgojIDAuMCBQcmVsaW1pbmFyaWVzLgoKKlIgTm90ZWJvb2tzIGFyZSBtZWFudCB0byBiZSBkeW5hbWljIGRvY3VtZW50cy4gUHJvdmlkZSBhbnkgcmVsZXZhbnQgdGVjaG5pY2FsIGd1aWRhbmNlIGZvciB1c2VycyBvZiB5b3VyIG5vdGVib29rLiBBbHNvIHRha2UgY2FyZSBvZiBhbnkgcHJlbGltaW5hcmllcywgc3VjaCBhcyByZXF1aXJlZCBwYWNrYWdlcy4gU2FtcGxlIHRleHQ6KgoKVGhpcyByZXBvcnQgaXMgZ2VuZXJhdGVkIGZyb20gYW4gUiBNYXJrZG93biBmaWxlIHRoYXQgaW5jbHVkZXMgYWxsIHRoZSBSIGNvZGUgbmVjZXNzYXJ5IHRvIHByb2R1Y2UgdGhlIHJlc3VsdHMgZGVzY3JpYmVkIGFuZCBlbWJlZGRlZCBpbiB0aGUgcmVwb3J0LiAgQ29kZSBibG9ja3MgY2FuIGJlIHN1cnByZXNzZWQgZnJvbSBvdXRwdXQgZm9yIHJlYWRhYmlsaXR5IHVzaW5nIHRoZSBjb21tYW5kIGNvZGUgYHtSLCAgZWNobz1zaG93fWAgaW4gdGhlIGNvZGUgYmxvY2sgaGVhZGVyLiBJZiBgc2hvdyA8LSBGQUxTRWAgdGhlIGNvZGUgYmxvY2sgd2lsbCBiZSBzdXJwcmVzc2VkOyBpZiBgc2hvdyA8LSBUUlVFYCB0aGVuIHRoZSBjb2RlIHdpbGwgYmUgc2hvdy4gCgpgYGB7cn0KIyBTZXQgdG8gVFJVRSB0byBleHBhbmQgUiBjb2RlIGJsb2Nrczsgc2V0IHRvIEZBTFNFIHRvIGNvbGxhcHNlIFIgY29kZSBibG9ja3MgCnNob3cgPC0gVFJVRQpgYGAKCjwhLS0gRXhwYW5kIHRoaXMgbGlzdCBhcyBuZWNlc3NhcnkgZm9yIHlvdXIgbm90ZWJvb2sgLS0+CkV4ZWN1dGluZyB0aGlzIFIgbm90ZWJvb2sgcmVxdWlyZXMgc29tZSBzdWJzZXQgb2YgdGhlIGZvbGxvd2luZyBwYWNrYWdlczoKCiogYGdncGxvdDJgCiogYHRpZHl2ZXJzZWAKKiBgcGFuZG9jYAoqIGBybWFya2Rvd25gCiogYHN0cmluZ3JgCiogYGdnYmlwbG90YAoqIGBrbml0cmAKKiBgcnBhcnRgCiogYHJwYXJ0LnBsb3RgCiogYGNhcmV0YAoqIGBnZ3JlcGVsYAoqIGBnZ3Rlcm5gCgoKVGhlc2Ugd2lsbCBiZSBpbnN0YWxsZWQgYW5kIGxvYWRlZCBhcyBuZWNlc3NhcnkgKGNvZGUgc3VwcHJlc3NlZCkuIAoKPCEtLSBUaGUgYGluY2x1ZGU9RkFMU0VgIG9wdGlvbiBwcmV2ZW50cyB5b3VyIGNvZGUgZnJvbSBiZWluZyBzaG93biBhdCBhbGwgLS0+CmBgYHtyLCBpbmNsdWRlPUZBTFNFfQojIFRoaXMgY29kZSB3aWxsIGluc3RhbGwgcmVxdWlyZWQgcGFja2FnZXMgaWYgdGhleSBhcmUgbm90IGFscmVhZHkgaW5zdGFsbGVkCiMgQUxXQVlTIElOU1RBTEwgWU9VUiBQQUNLQUdFUyBMSUtFIFRISVMhCmlmICghcmVxdWlyZSgiZ2dwbG90MiIpKSB7CiAgIGluc3RhbGwucGFja2FnZXMoImdncGxvdDIiKQogICBsaWJyYXJ5KGdncGxvdDIpCn0KaWYgKCFyZXF1aXJlKCJ0aWR5dmVyc2UiKSkgewogICBpbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiKQogICBsaWJyYXJ5KHRpZHl2ZXJzZSkKfQoKaWYgKCFyZXF1aXJlKCJwYW5kb2MiKSkgewogIGluc3RhbGwucGFja2FnZXMoInBhbmRvYyIpCiAgbGlicmFyeShwYW5kb2MpCn0KCiMgUmVxdWlyZWQgcGFja2FnZXMgZm9yIE0yMCBMSUJTIGFuYWx5c2lzCmlmICghcmVxdWlyZSgicm1hcmtkb3duIikpIHsKICBpbnN0YWxsLnBhY2thZ2VzKCJybWFya2Rvd24iKQogIGxpYnJhcnkocm1hcmtkb3duKQp9CgppZiAoIXJlcXVpcmUoInN0cmluZ3IiKSkgewogIGluc3RhbGwucGFja2FnZXMoInN0cmluZ3IiKQogIGxpYnJhcnkoc3RyaW5ncikKfQoKaWYgKCFyZXF1aXJlKCJnZ2JpcGxvdCIpKSB7CiAgaW5zdGFsbC5wYWNrYWdlcygiZ2diaXBsb3QiKQogIGxpYnJhcnkoZ2diaXBsb3QpCn0KCmlmICghcmVxdWlyZSgia25pdHIiKSkgewogIGluc3RhbGwucGFja2FnZXMoImtuaXRyIikKICBsaWJyYXJ5KGtuaXRyKQp9CgppZiAoIXJlcXVpcmUoInJwYXJ0IikpIHsKICBpbnN0YWxsLnBhY2thZ2VzKCJycGFydCIpCiAgbGlicmFyeShycGFydCkKfQoKaWYgKCFyZXF1aXJlKCJycGFydC5wbG90IikpIHsKICBpbnN0YWxsLnBhY2thZ2VzKCJycGFydC5wbG90IikKICBsaWJyYXJ5KHJwYXJ0KQp9CgppZiAoIXJlcXVpcmUoImNhcmV0IikpIHsKICBpbnN0YWxsLnBhY2thZ2VzKCJjYXJldCIpCiAgbGlicmFyeShjYXJldCkKfQogIAppZiAoIXJlcXVpcmUoImdncmVwZWwiKSkgewogIGluc3RhbGwucGFja2FnZXMoImdncmVwZWwiKQogIGxpYnJhcnkoZ2dyZXBlbCkKfQoKaWYgKCFyZXF1aXJlKCJnZW9zcGhlcmUiKSkgewogIGluc3RhbGwucGFja2FnZXMoImdlb3NwaGVyZSIpCiAgbGlicmFyeShnZ3JlcGVsKQp9CgppZiAoIXJlcXVpcmUoImdndGVybiIpKSB7CiAgaW5zdGFsbC5wYWNrYWdlcygiZ2d0ZXJuIikKICBsaWJyYXJ5KGdncmVwZWwpCn0KCmBgYAoKIyAxLjAgUHJvamVjdCBJbnRyb2R1Y3Rpb24KClRoZSBNYXJzIFByb2plY3QgaXMgZm9jdXNlZCBvbiBkYXRhIGZyb20gdGhlIDIwMjAgTWFycyBQZXJzZXZlcmFuY2UgUm92ZXIuIFRoZSBnb2FsIG9mIHRoZSBtaXNzaW9uIGlzIHRvIGxvb2sgZm9yIG1pY3JvYmlhbCBhbmNpZW50IGxpZmUgb3IgZm9ybXMgb2Ygd2F0ZXIgb24gTWFycyAodGhpbmdzIHRoYXQgY291bGQgc3VnZ2VzdCBsaWZlKS4gUGVyc2V2ZXJhbmNlIHVzZXMgbXVsdGlwbGUgaW5zdHJ1bWVudHMsIGluY2x1ZGluZyBQSVhMIChQbGFuZXRhcnkgSW5zdHJ1bWVudCBmb3IgWC1SYXkgTGl0aG9jaGVtaXN0cnkpLCBTSEVSTE9DIChTY2FubmluZyBIYWJpdGFibGUgRW52aXJvbm1lbnRzIHdpdGggUmFtYW4gYW5kIEx1bWluZXNjZW5jZSBmb3IgT3JnYW5pY3MgYW5kIENoZW1pY2FscykgYW5kIFNVUEVSQ0FNLiBTVVBFUkNBTSBoYXMgbXVsdGlwbGUgaW5zdHJ1bWVudHMgdGhhdCBtZWFzdXJlIHNwZWN0cm9zY29weSB0byBtZWFzdXJlIHByb3BlcnRpZXMgb2YgbWF0ZXJpYWxzIG9uIE1hcnMsIGluY2x1ZGluZyBMSUJTIChMYXNlci1pbmR1Y2VkIGJyZWFrZG93biBzcGVjdHJvc2NvcHkpLiBUaGlzIG5vdGVib29rIHdpbGwgcHJpbWFyaWx5IGZvY3VzIG9uIHRoZSBkYXRhIHdlIGhhdmUgYmVlbiBnaXZlbiBvZiBQSVhMIGFuZCBMSUJTLiAgCgojIDIuMCBPcmdhbml6YXRpb24gb2YgUmVwb3J0CgpUaGlzIHJlcG9ydCBpcyBvcmdhbml6ZSBhcyBmb2xsb3dzOiAKCiogU2VjdGlvbiAzLjAuICBGaW5kaW5nIDE6IExJQlMgYW5kIFBJWEwgTWF0Y2hpbmcgLSBXZSB3ZXJlIGFibGUgdG8gY29tYmluZSB0aGUgTElCUyBhbmQgUElYTCBkYXRhIHNldHMgYnkgcGlja2luZyBhIG1heGltdW0gZGlzdGFuY2UgdmFyaWFibGUgZnJvbSBhIFBJWEwgYWJyYXNpb24gYW5kIG1hdGNoaW5nIExJQlMgc2FtcGxlcyB0aGF0IHdlcmUgd2l0aGluIHRoZSBzZXQgZGlzdGFuY2Ugb2YgYSBQSVhMIGFicmFzaW9uLiAgCgoqIFNlY3Rpb24gNC4wOiBGaW5kaW5nIDI6IFNvaWwgQ29tcG9zaXRpb24gQW5hbHlzaXMgLSBVc2luZyB0aGUgTElCUyBhbmQgUElYTCBjb21iaW5lZCBkYXRhIHNldCwgSSBjcmVhdGVkIGEgcGxvdCBvZiB0aGUgY29tcG9zaXRpb24gcGVyY2VudGFnZXMgb2YgY2hlbWljYWwgY29tcG91bmRzIHN1Y2ggYXMgU2kwMiwgSzIwLCBldGMuIHVzaW5nIGxvZyBzY2FsaW5nIHRvIGNvbXBhcmUgdGhlIGNvbXBvc2l0aW9ucyBvZiBhIFBJWEwgYWJyYXNpb24gYW5kIHRoZSBjb3JyZXNwb25kaW5nIExJQlMgc2FtcGxlIGNvbXBvc2l0aW9ucyAoYmFzZWQgb24gdGhlIExJQlMgc2FtcGxlcyBmb3IgeCBkaXN0YW5jZSBhd2F5IGZyb20gYSBQSVhMIGFicmFzaW9uKS4KCiogU2VjdGlvbiA1LjAgRmluZGluZyAzOiBBbmFseXppbmcgQ2F0aW9uIENvbWJpbmF0aW9ucyB1c2luZyBMSUJTIGFuZCBQSVhMIG1hdGNoZWQgZGF0YTogVXNpbmcgdGhlIExJQlMgYW5kIFBJWEwgY29tYmluZWQgZGF0YSBzZXQsIHdlIGNyZWF0ZWQgYSB0ZXJuYXJ5IHBsb3QgdG8gc2hvdyB0aGUgZGlzdHJpYnV0aW9uIG9mIExJQlMgc2FtcGxlcyBzb3J0ZWQgYnkgd2hhdCBQSVhMIGFicmFzaW9uIHRoZXkgYXJlIGNsb3Nlc3QgdG8gKGJhc2VkIG9uIGEgY2hvc2VuIGRpc3RhbmNlIHZhcmlhYmxlKS4KCiogU2VjdGlvbiA2LjAgT3ZlcmFsbCBjb25jbHVzaW9ucyBhbmQgc3VnZ2VzdGlvbnMgCgoqIFNlY3Rpb24gNy4wIEFwcGVuZGl4IFRoaXMgc2VjdGlvbiBkZXNjcmliZSB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgd29ya3MgdGhhdCBtYXkgYmUgaGVscGZ1bCBpbiB0aGUgZnV0dXJlIHdvcms6ICpsaXN0IHN1YmplY3RzKi4gIAoKCiMgMy4wIEZpbmRpbmcgMTogUElYTCBhbmQgTElCUyBNYXRjaGluZwoKX0dpdmUgYSBoaWdobGV2ZWwgb3ZlcnZpZXcgb2YgdGhlIG1ham9yIGZpbmRpbmcuIFdoYXQgcXVlc3Rpb25zIHdlcmUgeW91ciB0cnlpbmcgdG8gYWRkcmVzcywgd2hhdCBhcHByb2FjaGVzIGRpZCB5b3UgZW1wbG95LCBhbmQgd2hhdCBoYXBwZW5lZD9fCgpGaXJzdGx5LCB3ZSB3aWxsIGJlIHRha2luZyBhIGxvb2sgYXQgaG93IFBJWEwgYW5kIExJQlMgY29ycmVzcG9uZC4gT3VyIGdyb3VwIGZvdW5kIHZlcnkgZWFybHkgaW4gb3VyIHJlc2VhcmNoIHRoYXQgdGhlcmUgd2Fzbid0IGEgZmVhdHVyZSBhbW9uZyB0aGVtIHRoYXQgY2FuIGJlIHVzZWQgdG8gbWF0Y2ggdGhlIGRhdGEgc2V0cy4gRm9yIGV4YW1wbGUsIHRoZSBjb2x1bW5zIG9mIFBJWEwgYXJlIG9yZ2FuaXplZCBieSBsYXRpdHVkZSBhbmQgbG9uZ2l0dWRlIGFzIHdlbGwgYXMgc2FtcGxlIG51bWJlciAoMS0xNiksIHNhbXBsZSBuYW1lLCBhbmQgYWJyYXNpb24gbmFtZS4gVW5mb3J0dW5hdGVseSwgTElCUyB3YXNuJ3Qgc29ydGVkIHRoZSBzYW1lIHdheS4gTElCUyB3YXMgb3JnYW5pemVkIGJ5IHRoZSBzb2wgdGhhdCB0aGUgc2FtcGxlIHdhcyB0YWtlbiBhdC4gTElCUyBpcyBicm9rZW4gdXAgaW50byBtYW55IGRpZmZlcmVudCB0eXBlcyBvZiBzYW1wbGVzIGFzIHdlbGwsIGluY2x1ZGluZyB0aGUgZmFjdCBpdCBjYXJyaWVzIGFyb3VuZCBlYXJ0aCByZWZlcmVuY2UgZGF0YSB0byBiZSB1c2VkIGluIGNvbXBhcmluZyB3aXRoIGRpZmZlcmVudCBzYW1wbGUgc2l0ZXMuIFRoYXQgYmVpbmcgc2FpZCwgaW4gb3JkZXIgdG8gbWF0Y2ggUElYTCB0YXJnZXRzIHRvIGNvcnJlc3BvbmRpbmcgTElCUyBzYW1wbGVzLCBNYXJnbyBhbmQgSSBjcmVhdGVkIGEgbmV3IGRhdGEgc2V0IHRoYXQgYWRkZWQgYW5vdGhlciBtZXRhZGF0YSBmZWF0dXJlIHRvIFBJWEwgKGxhdGl0dWRlIGFuZCBsb25naXR1ZGUgY29vcmRpbmF0ZXMpIHdoaWNoIHdlIG9idGFpbmVkIGZyb20gdGhlIEFuYWx5c3QncyBOb3RlYm9vay4gT25jZSB0aGlzIHdhcyBhZGRlZCBpbiwgd2UgcmVhbGl6ZWQgdGhhdCB0aGUgbG9uZ2l0dWRlIGFuZCBsYXRpdHVkZSBkaWRuJ3QgcmVhbGx5IG1hdGNoLiBTbyBNYXJnbyBjcmVhdGVkIGEgZGlzdGFuY2UgZnVuY3Rpb24gdG8gbWF0Y2ggTElCUyBzYW1wbGVzIHRvIFBJWEwgdGFyZ2V0cyBiYXNlZCBvbiB3aGF0ZXZlciBkaXN0YW5jZSBhIHBlcnNvbiBzcGVjaWZpZXMuIE9yaWdpbmFsbHksIHdlIHNldCBpdCB0byBiZSByb3VuZGVkIHRvIHRocmVlIHRob3VzYW5kdGhzIGFuZCBtYXRjaCBiYXNlZCBvbiB0aGF0LgoKVGhpcyBoZWxwZWQgYW5zd2VyIHRoZSBxdWVzdGlvbiBvZiBob3cgY2FuIHdlIGNvcnJlbGF0ZSB0aGUgTElCUyBhbmQgUElYTCBkYXRhIHNldHMgdG8gYmUgYWJsZSB0byBwbG90IHRoZW0gb24gdGhlIHNhbWUgYXhpcyBvZiB3aGF0ZXZlciBwbG90IGlzIHRyeWluZyB0byBiZSBjcmVhdGVkLiBJIHdhcyBjdXJpb3VzIHRvIHNlZSBob3cgY2xvc2UgUElYTCB0YXJnZXRzIHdlcmUgdG8gTElCUyBzYW1wbGUgc2l0ZXMgYXMgd2VsbCBhcyBob3cgbWFueSBMSUJTIHNhbXBsZXMgd291bGQgYmUgYXNzb2NpYXRlZCB3aXRoIGEgUElYTCB0YXJnZXQgcGVyaGFwcyB3aXRoIGEgcmFkaXVzIG9mIDcgb3IgMTAgbWV0ZXJzLgoKIyMgMy4xIERhdGEsIENvZGUsIGFuZCBSZXNvdXJjZXMKCkhlcmUgaXMgYSBsaXN0IGRhdGEgc2V0cywgY29kZXMsIHRoYXQgYXJlIHVzZWQgaW4geW91ciB3b3JrLiBBbG9uZyB3aXRoIGJyaWVmIGRlc2NyaXB0aW9uIGFuZCBVUkwgd2hlcmUgdGhleSBhcmUgbG9jYXRlZC4KCjEuIHBldGVyYy1maW5hbFByb2plY3RGMjQuUm1kICh3aXRoIGtuaXQgcGRmIGFuZCBodG1sKSBpcyB0aGlzIG5vdGVib29rLgpbaHR0cHM6Ly9naXRodWIucnBpLmVkdS9EYXRhSU5DSVRFL0RBUi1NYXJzLUYyNC9ibG9iL21haW4vU3R1ZGVudE5vdGVib29rcy9Bc3NpZ25tZW50MDdfRHJhZnRGaW5hbFByb2plY3ROb3RlYm9vay9wZXRlcmNfZmluYWxQcm9qZWN0RjI0X3JvdWdoZHJhZnQuUm1kXShodHRwczovL2dpdGh1Yi5ycGkuZWR1L0RhdGFJTkNJVEUvREFSLU1hcnMtRjI0L2Jsb2IvbWFpbi9TdHVkZW50Tm90ZWJvb2tzL0Fzc2lnbm1lbnQwN19EcmFmdEZpbmFsUHJvamVjdE5vdGVib29rL3BldGVyY19maW5hbFByb2plY3RGMjRfcm91Z2hkcmFmdC5SbWQpCgoyLiB2MV9saWJzX3RvX3NhbXBsZS5SZHMgaXMgdGhlIGNvbWJpbmVkIGRhdGEgc2V0IG9mIFBJWEwgYW5kIExJQlMgdGhhdCBpbmNsdWRlcyB0aGUgZGlzdGFuY2UgZnJvbSBhIFBJWEwgYWJyYXNpb24gdG8gYSBMSUJTIHNhbXBsZS4gIApbaHR0cHM6Ly9naXRodWIucnBpLmVkdS9EYXRhSU5DSVRFL0RBUi1NYXJzLUYyNC9ibG9iL21haW4vU3R1ZGVudERhdGEvdjFfbGlic190b19zYW1wbGUuUmRzXShodHRwczovL2dpdGh1Yi5ycGkuZWR1L0RhdGFJTkNJVEUvREFSLU1hcnMtRjI0L2Jsb2IvbWFpbi9TdHVkZW50RGF0YS92MV9saWJzX3RvX3NhbXBsZS5SZHMpLiAKCkZpcnN0bHksIHdlIHNldCB0aGUgbnVtYmVyIG9mIG1ldGVycyBkaXN0YW5jZSB0aHJlc2hvbGQgYmV0d2VlbiBhIFBJWEwgYWJyYXNpb24gYW5kIExJQlMgc2FtcGxlLiBXaXRoaW4gdGhlIHYxX2xpYnNfdG9fc2FtcGxlLlJkcywgd2hpY2ggTWFyZ28gYW5kIEkgY29sbGFib3JhdGVkIG9uIHRoZXJlIGlzIGEgZGlzdGFuY2UgdmFyaWFibGUgdGhhdCBpcyBzZXQgdmlhIGEgZnVuY3Rpb24gdGhhdCBNYXJnbyBjcmVhdGVkIHRvIG1lYXN1cmUgdGhlIGRpc3RhbmNlIGJldHdlZW4gYSBQSVhMIGFicmFzaW9uIGFuZCBMSUJTIHNhbXBsZSB1c2luZyB0aGVpciBsYXRpdHVkZSBhbmQgbG9uZ2l0dWRlIGNvb3JkaW5hdGVzLiAKYGBge3J9Cm1ldGVycyA8LSAxMDAKYGBgCgpUbyBwcmVwYXJlIHRoZSBkYXRhLCB3ZSB3aWxsIGxvYWQgaW4gdGhlIHYxX2xpYnNfdG9fc2FtcGxlLlJkcywgZ3JvdXAgYnkgbGF0aXR1ZGUgYW5kIGxvbmdpdHVkZSBvZiBMSUJTLCBhbmQgZmlsdGVyIG91dCBldmVyeSBMSUJTIHNhbXBsZSB0aGF0IGhhcyBhIGxhcmdlciBkaXN0YW5jZSBmcm9tIGl0cyBjb3JyZXNwb25kaW5nIFBJWEwgYWJyYXNpb24gdGhhbiBzcGVjaWZpZWQgaW4gdGhlIGNob3NlbiBkaXN0YW5jZSAobWV0ZXIpIHZhbHVlLiBJbiBvcmRlciB0byBtYWtlIGEgc2NhdHRlciBwbG90IG9mIHRoZSBMSUJTIGFuZCBQSVhMIHBvaW50cywgd2Ugd2lsbCBjcmVhdGUgYSBuZXcgZGF0YSBmcmFtZSBvZiBlYWNoIHVuaXF1ZSBQSVhMIGFicmFzaW9uIGFuZCBpdHMgY29vcmRpbmF0ZXMuIFRoYXQgaXMgdGhlIHVuaXF1ZV9waXhsIGRhdGEgZnJhbWUgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIHBsb3QgdGhlIFBJWEwgYWJyYXNpb24gY29vcmRpbmF0ZXMuCgpgYGB7ciB9CmxpYnNfdG9fc2FtcGxlIDwtIHJlYWRSRFMoIn4vREFSLU1hcnMtRjI0L1N0dWRlbnREYXRhL3YxX2xpYnNfdG9fc2FtcGxlLlJkcyIpCiNtYWtlIGEgZmlsdGVyZWQgZGF0YSBmcmFtZSB0aGF0IHBpY2tzIHRoZSBtYXggcG9pbnQgb3V0IG9mIGFsbCBsaWJzIHNhbXBsZXMgYXQgYSBjZXJ0YWluIHRhcmdldCAKIyBmb3Igc2ltcGxpY2l0eQpkZl9maWx0ZXJlZCA8LSBsaWJzX3RvX3NhbXBsZSAlPiUKICBncm91cF9ieShMYXQubGlicywgTG9uLmxpYnMpICU+JQogIGZpbHRlcihQb2ludC5saWJzID09IG1heChQb2ludC5saWJzKSkgJT4lCiAgdW5ncm91cCgpCmRmX2Rpc3RhbmNlX2ZpbHRlciA8LSBkZl9maWx0ZXJlZFtkZl9maWx0ZXJlZCREaXN0YW5jZSA8PSBtZXRlcnMsXQoKI21ha2UgYSBkYXRhIGZyYW1lIHdpdGggdGhlIHVuaXF1ZSBwaXhsIGNvb3JkaW5hdGVzIHNpbmNlIHRoZXkgYXJlIGluIHBhaXJzIG9mIGlkZW50aWNhbCBsYXQvbG9uCnVuaXF1ZV9waXhsIDwtIGRmX2ZpbHRlcmVkICU+JQogIHNlbGVjdChMYXQucGl4bCwgTG9uLnBpeGwsIEFicmFzaW9uLnBpeGwpICU+JSBkaXN0aW5jdCgpCmBgYAoKCiMjIDMuMiBDb250cmlidXRpb24KClRoZSBsb2dpc3RpY3Mgb2YgZmlsdGVyaW5nIHRoZSBvcmlnaW5hbCBkYXRhIHNldCBpcyBteSB3b3JrLiBQcmV2aW91c2x5LCBJIGhhZCB0byBkbyBhIGxvdCBtb3JlIGZpbHRlcmluZyBpbiBvcmRlciB0byBjaG9vc2UgdGhlIGRpc3RhbmNlIGFuZCBnZXQgdW5pcXVlIExJQlMgcG9pbnRzIGluIG9yZGVyIHRvIG5vdCBwdXQgdG9vIG1hbnkgcG9pbnRzIG9uIHRoZSBzY2F0dGVycGxvdC4gTWFyZ28gYW5kIEkgd29ya2VkIHRvZ2V0aGVyIHRvIGNyZWF0ZSB0aGUgZGF0YSBzZXQgdGhhdCBJIHVzZSBpbiB0aGlzIHNlY3Rpb24gKHYxX2xpYnNfdG9fc2FtcGxlLlJkcykgYnkgZGVjaWRpbmcgaG93IHRvIG1hdGNoIHVwIExJQlMgdG8gY2VydGFpbiBQSVhMIGFicmFzaW9ucy4gTWFyZ28gY3JlYXRlZCB0aGUgZGlzdGFuY2UgZnVuY3Rpb24gdG8gZmluZCB0aGUgZGlzdGFuY2UgYmV0d2VlbiBQSVhMIGFicmFzaW9ucyBhbmQgTElCUyBzYW1wbGVzIGFuZCBhZGRlZCB0aGF0IGNvbHVtbiB0byB0aGUgZGF0YSBzZXQuIFRoZW4sIERvbmEgZml4ZWQgYWxsIHRoZSBuYW1pbmcgY29udmVudGlvbnMgaW4gdGhlIGRhdGEgc2V0IGluIG9yZGVyIHRvIGhhdmUgY29uc2lzdGVuY3kgYW5kIG1ha2UgaXQgZWFzeSB0byB0ZWxsIHdoaWNoIHZhcmlhYmxlIHdhcyBvcmlnaW5hbGx5IGZyb20gZWFjaCBkYXRhIHNldCAoZXguIE5hbWUucGl4bCwgVGFyZ2V0LmxpYnMpLiBJIHRoZW4gdXNlZCB0aGUgZGF0YSB0byBjcmVhdGUgcGxvdHMgYW5kIGFuYWx5emUuIEJlbG93IGlzIGEgc2NhdHRlcnBsb3Qgc2hvd2Nhc2luZyB0aGUgZGlzdHJpYnV0aW9uIG9mIFBJWEwgYWJyYXNpb25zIGFuZCBjb3JyZXNwb25kaW5nIExJQlMgc2FtcGxlcyBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIG1heCBkaXN0YW5jZSBiZXR3ZWVuIHRoZW0uIAoKCiMjIDMuMyBNZXRob2RzIERlc2NyaXB0aW9uIAoKSSBjaG9zZSB0byB1c2UgZ2dwbG90IHRvIGRpc3BsYXkgdGhlIExJQlMgYW5kIFBJWEwgZGF0YSBmb3IgZWFzaWVyIGFuYWx5c2lzIG9mIHNlZWluZyBob3cgbWFueSBMSUJTIHNhbXBsZXMgYWxpZ24gd2l0aCBkaWZmZXJlbnQgUElYTCBhYnJhc2lvbnMuIEl0IHdhcyB2ZXJ5IGludGVyZXN0aW5nIHRvIGNoYW5nZSBhcm91bmQgdGhlIG1heCBkaXN0YW5jZSBhbmQgc2VlIHdoaWNoIGFsaWduZWQgd2l0aCB3aGljaCBhYnJhc2lvbi4gSW4gdGVybXMgb2YgZXhlY3V0aW9uLCBpdCB0b29rIG1lIGEgYml0IG9mIHRpbWUgdG8gb3JnYW5pemUgYWxsIG9mIHRoZSB0aG91Z2h0cyBNYXJnbyBhbmQgSSBoYWQgb24gaG93IHRvIGNyZWF0ZSBhbmQgbWFuYWdlIHRoaXMgZGF0YSBzZXQuIE9yaWdpbmFsbHksIHdlIGhhZCByb3VuZGVkIHRoZSBkaXN0YW5jZXMgdG8gdGhlIG5lYXJlc3QgdGhvdXNhbmR0aCB0byBtYXRjaCB0aGVtLCBhbmQgdGhlbiB3ZXJlIHBsb3R0aW5nIHRoYXQgd2F5LiBIb3dldmVyLCB0aGF0IGxlZnQgYSBsb3Qgb2Ygcm9vbSBmb3IgZXJyb3IgYW5kIHdhc24ndCBhcyBhY2N1cmF0ZS4gQ3JlYXRpbmcgYSBkaXN0YW5jZSBmdW5jdGlvbiBhbGxvd3MgZm9yIHRoZSBzY2llbnRpc3Qgb3IgcGVyc29uIHVzaW5nIHRoZSBNYXJzIE1pc3Npb24gTWluZGVyIEFwcCB0byBjaG9vc2Ugd2hhdGV2ZXIgZGlzdGFuY2UgdGhleSB3b3VsZCBsaWtlIGFuZCBhbGxvd3MgZm9yIG11Y2ggbW9yZSBmdW5jdGlvbmFsaXR5LiBNb2RpZnlpbmcgdGhlIGRhdGEgc2V0IG1vcmUgZW5kZWQgdXAgYmVpbmcgbW9yZSBlZmZpY2llbnQgdGhhbiBhZGRpbmcgc21hbGwgZWRpdHMgYXMgSSB3YXMgbWFraW5nIG15IHBsb3RzIHdoaWNoIHdhcyBvcmlnaW5hbGx5IG1ha2luZyBtZSBjcmF6eSAoYXMgaW4gY2hhbmdpbmcgdmFyaWFibGUgdHlwZXMgaWYgdGhleSB3ZXJlbid0IHdoYXQgdGhleSB3ZXJlIHN1cHBvc2VkIHRvIGJlKS4gSW4gdGhlIGVuZCwgSSBsZWFybmVkIGEgbG90IGFib3V0IGRhdGEgb3JnYW5pemF0aW9uIGFuZCB0aGF0IGNvbnNpc3RlbmN5IGFuZCBzdGF5aW5nIG9yZ2FuaXplZCBpcyBrZXkgYW5kIHNhdmVzIGEgbG90IG9mIHRpbWUgbGF0ZXIgb24uCgoKIyMgMy40IFJlc3VsdCBhbmQgRGlzY3Vzc2lvbiAKClRvIGNyZWF0ZSBhIHBsb3Qgb2YgdGhlIExJQlMgYW5kIFBJWEwgZGF0YSBvcmdhbml6ZWQgYnkgd2hhdCBMSUJTIHNhbXBsZXMgYWxpZ24gd2l0aCB3aGF0IGFicmFzaW9ucywgZmlyc3QgcGxvdHRlZCB0aGUgTElCUyBzYW1wbGVzIGNvbG9yZWQgYnkgd2hhdCBQSVhMIGFicmFzaW9uIHRoZXkgd2VyZSBjbG9zZXN0IHRvLCBhbmQgdGhlbiBwbG90dGVkIHRoIFBJWEwgYWJyYXNpb25zIGFzIHJlZCBzdGFycyBvbiB0aGUgcGxvdCB0byBzaG93IHdoZXJlIHRoZSBQSVhMIGFicmFzaW9ucyB3ZXJlIHJlbGF0aXZlIHRvIHRoZSBMSUJTIHNhbXBsZXMuCgpgYGB7ciB9CiNwbG90IG9mIGxpYnMgYW5kIHBpeGwgZGF0YSBieSBsYXQvbG9uCmdncGxvdChkYXRhID0gZGZfZGlzdGFuY2VfZmlsdGVyKSArCiAgZ2VvbV9wb2ludChtYXBwaW5nID0gYWVzKHggPSBMb24ubGlicywgeSA9IExhdC5saWJzLCBjb2xvciA9IEFicmFzaW9uLnBpeGwpKSArICAgICAgICAgICAgICAgICAjIENvbG9yIGJ5IGFicmFzaW9uCiAgZ2VvbV9wb2ludChtYXBwaW5nID0gYWVzKHggPSBMb24ucGl4bCwgeSA9IExhdC5waXhsKSwgZGF0YSA9IHVuaXF1ZV9waXhsLCBjb2xvciA9ICJyZWQiLCBzaGFwZSA9IDMsIHNpemUgPSAzKSArICMgRml4ZWQgY29sb3IgZm9yIHVuaXF1ZV9waXhsIHBvaW50cwogIGdlb21fdGV4dF9yZXBlbChtYXBwaW5nID0gYWVzKHggPSBMb24ucGl4bCwgeSA9IExhdC5waXhsLCBsYWJlbCA9IEFicmFzaW9uLnBpeGwpLCBkYXRhID0gdW5pcXVlX3BpeGwsCiAgICAgICAgICAgICAgICAgIHZqdXN0ID0gMiwgY29sb3IgPSAicmVkIikgKwogIGxhYnModGl0bGUgPSBwYXN0ZSgiTElCUyBTYW1wbGVzIGFuZCBQSVhMIEFicmFzaW9ucyB3aXRoaW4iLCBtZXRlcnMsICJtZXRlcnMiKSwKICAgICAgIHggPSAiTG9uZ2l0dWRlIiwKICAgICAgIHkgPSAiTGF0aXR1ZGUiLAogICAgICAgY29sb3IgPSAiUElYTCBBYnJhc2lvbiIsCiAgICAgICBjYXB0aW9uID0gIkRhdGEgY29sbGVjdGVkIHVzaW5nIExJQlMgYW5kIFBJWEwgaW5zdHJ1bWVudHMgb24gUGVyc2VydmVyYW5jZSByb3Zlci5cbiBTaG93cyBQSVhMIGFicmFzaW9ucyBwbG90dGVkIGFzIHJlZCBzdGFycyxcbiBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgTElCUyBzYW1wbGVzIGNvbG9yZWQgYnkgdGhlaXIgY2xvc2VzdCBQSVhMIGFicmFzaW9uLiIpKyAgICAgICAgICAjIExhYmVsIGZvciB0aGUgY29sb3IgbGVnZW5kIAogIyBDZW50ZXIgdGhlIGNhcHRpb24gb24gdGhlIGxlZnQgc2lkZQogIHRoZW1lKAogICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMCkgICMgQWxpZ25zIGNhcHRpb24gdG8gdGhlIGxlZnQKICApCgojYWRkIGxlZ2VuZCBmb3IgUElYTCBpZGsgd2h5IGl0J3Mgbm90IHdvcmtpbmcKYGBgCgoKIyMgMy41IENvbmNsdXNpb25zLCBMaW1pdGF0aW9ucywgYW5kIEZ1dHVyZSBXb3JrLgoKSSBiZWxpZXZlIG15IGZpbmRpbmdzIG1ha2UgaXQgdmVyeSBlYXN5IGZvciByZXNlYXJjaGVycyBhbmQgc2NpZW50aXN0cyB0byBoYXZlIGEgdmlzdWFsaXphdGlvbiBvZiBQSVhMIGFuZCBMSUJTIHNhbXBsZXMgdGhhdCB0aGV5IHdhbnQgdG8gc2VlIGJhc2VkIG9uIHdoYXQgbWF4IGRpc3RhbmNlIHRoZXkgYXJlIGZvY3VzaW5nIG9uIHdoZW4gZXhhbWluaW5nIFBJWEwgYW5kIExJQlMgdG9nZXRoZXIuIEZvciBmdXR1cmUgd29yaywgSSB0aGluayBhcyBtb3JlIGNvb3JkaW5hdGVzIGFuZCBkYXRhIGlzIGFkZGVkIHRvIHRoZSBMSUJTIGFuZCBQSVhMIGRhdGEgc2V0cyBhcyB0aGV5IGJlY29tZSBhdmFpbGFibGUgZnJvbSBOQVNBIHRoaXMgd2lsbCBjb250aW51ZSB0byBiZSBidWlsdCB1cG9uIGFuZCBhbHRob3VnaCBpdCBpc24ndCBzdXBlciBjb21wbGljYXRlZCBvZiBhIHBsb3QsIGl0IHByb3ZpZGVzIGEgdmVyeSBuZWNlc3NhcnkgY29udGV4dCB0byB2aXN1YWxpemUgUElYTCBhbmQgTElCUy4gCgotIEFkZCBtb3JlIGFib3V0IGxpbWl0YXRpb25zPwoKIyA0LjAgRmluZGluZyAyOiBTb2lsIENvbXBvc2l0aW9uIEFuYWx5c2lzCl9HaXZlIGEgaGlnaGxldmVsIG92ZXJ2aWV3IG9mIHRoZSBtYWpvciBmaW5kaW5nLiBXaGF0IHF1ZXN0aW9ucyB3ZXJlIHlvdXIgdHJ5aW5nIHRvIGFkZHJlc3MsIHdoYXQgYXBwcm9hY2hlcyBkaWQgeW91IGVtcGxveSwgYW5kIHdoYXQgaGFwcGVuZWQ/XwoKVXNpbmcgdGhlIExJQlMgYW5kIFBJWEwgY29tYmluZWQgZGF0YSBzZXQsIEkgY3JlYXRlZCBhIHBsb3Qgb2YgdGhlIGNvbXBvc2l0aW9uIHBlcmNlbnRhZ2VzIG9mIGNoZW1pY2FsIGNvbXBvdW5kcyBzdWNoIGFzIFNpMDIsIEsyMCwgZXRjLiB1c2luZyBsb2cgc2NhbGluZyB0byBjb21wYXJlIHRoZSBjb21wb3NpdGlvbnMgb2YgYSBQSVhMIGFicmFzaW9uIGFuZCB0aGUgY29ycmVzcG9uZGluZyBMSUJTIHNhbXBsZSBjb21wb3NpdGlvbnMgKGJhc2VkIG9uIHRoZSBMSUJTIHNhbXBsZXMgZm9yIHggZGlzdGFuY2UgYXdheSBmcm9tIGEgUElYTCBhYnJhc2lvbikuIFRoZSBxdWVzdGlvbiBJIHdhcyB0cnlpbmcgdG8gYW5zd2VyIHdhcyBob3cgZG9lcyB0aGUgTElCUyBkYXRhIG9mIGEgY2VydGFpbiBhcmVhIGNvbXBhcmUgdG8gdGhlIFBJWEwgZGF0YSBvZiB0aGF0IGFyZWE/IEJ5IGxvb2tpbmcgYXQgdGhlIGNvbXBvc2l0aW9uIG9mIHRoZSBzb2lsIGluIGNlcnRhaW4gbG9jYXRpb25zLCB3ZSBjYW4gY29tcGFyZSB0aGUgZGlmZmVyZW5jZXMgaW4gdGhlIFBJWEwgYWJyYXNpb24gYW5kIHJlbGF0aW5nIExJQlMgc2FtcGxlcyBmb3IgYSBjZXJ0YWluIGFyZWEgdXRpbGl6aW5nIHRoZSBzYW1lIGRhdGEgc2V0ICh2MV9saWJzX3RvX3NhbXBsZS5SbWQpLiBJbiBvcmRlciB0byBhY2NvbXBsaXNoIHRoaXMsIAoKCiMjIDQuMSBEYXRhLCBDb2RlLCBhbmQgUmVzb3VyY2VzCkhlcmUgaXMgYSBsaXN0IGRhdGEgc2V0cywgY29kZXMsIHRoYXQgYXJlIHVzZWQgaW4geW91ciB3b3JrLiBBbG9uZyB3aXRoIGJyaWVmIGRlc2NyaXB0aW9uIGFuZCBVUkwgd2hlcmUgdGhleSBhcmUgbG9jYXRlZC4KCjEuIHBldGVyY19maW5hbFByb2plY3RGMjQuUm1kICh3aXRoIGtuaXQgcGRmIGFuZCBodG1sKSBpcyB0aGlzIG5vdGVib29rLgpbaHR0cHM6Ly9naXRodWIucnBpLmVkdS9EYXRhSU5DSVRFL0RBUi1NYXJzLUYyNC9ibG9iL21haW4vU3R1ZGVudE5vdGVib29rcy9Bc3NpZ25tZW50MDdfRHJhZnRGaW5hbFByb2plY3ROb3RlYm9vay9wZXRlcmNfZmluYWxQcm9qZWN0RjI0X3JvdWdoZHJhZnQuUm1kXShodHRwczovL2dpdGh1Yi5ycGkuZWR1L0RhdGFJTkNJVEUvREFSLU1hcnMtRjI0L2Jsb2IvbWFpbi9TdHVkZW50Tm90ZWJvb2tzL0Fzc2lnbm1lbnQwN19EcmFmdEZpbmFsUHJvamVjdE5vdGVib29rL3BldGVyY19maW5hbFByb2plY3RGMjRfcm91Z2hkcmFmdC5SbWQpCgoyLiBwZXRlcmNfYXNzaWdubWVudDUuUm1kICh3aXRoIGtuaXQgcGRmIGFuZCBodG1sKSB3aGljaCBpcyBteSBwcmV2aW91cyBub3RlYm9vay4KW2h0dHBzOi8vZ2l0aHViLnJwaS5lZHUvRGF0YUlOQ0lURS9EQVItTWFycy1GMjQvdHJlZS9tYWluL1N0dWRlbnROb3RlYm9va3MvQXNzaWdubWVudDA1L3BldGVyY19hc3NpZ25tZW50MDUuUm1kXShodHRwczovL2dpdGh1Yi5ycGkuZWR1L0RhdGFJTkNJVEUvREFSLU1hcnMtRjI0L3RyZWUvbWFpbi9TdHVkZW50Tm90ZWJvb2tzL0Fzc2lnbm1lbnQwNS9wZXRlcmNfYXNzaWdubWVudDA1LlJtZF0pCgozLiBzdXBlcmNhbV9saWJzX21vY19sb2MuUmRzIHdoaWNoIGlzIHRoZSBvcmlnaW5hbCBMSUJTIGRhdGEgZ2l2ZW4gdG8gb3VyIHJlc2VhcmNoIGdyb3VwLgpbaHR0cHM6Ly9naXRodWIucnBpLmVkdS9EYXRhSU5DSVRFL0RBUi1NYXJzLUYyNC9ibG9iL21haW4vRGF0YS9zdXBlcmNhbV9saWJzX21vY19sb2MuUmRzXShodHRwczovL2dpdGh1Yi5ycGkuZWR1L0RhdGFJTkNJVEUvREFSLU1hcnMtRjI0L2Jsb2IvbWFpbi9EYXRhL3N1cGVyY2FtX2xpYnNfbW9jX2xvYy5SZHMpCgo0LiBwaXhsX3NvbF9jb29yZGluYXRlcy5SZHMsIHdoaWNoIGlzIHRoZSBkYXRhIHNldCBjb250YWluaW5nIHRoZSBQSVhMIGRhdGEsIHNvbCwgYW5kIGNvb3JkaW5hdGVzLgpbaHR0cHM6Ly9naXRodWIucnBpLmVkdS9EYXRhSU5DSVRFL0RBUi1NYXJzLUYyNC9ibG9iL21haW4vU3R1ZGVudERhdGEvcGl4bF9zb2xfY29vcmRpbmF0ZXMuUmRzXShodHRwczovL2dpdGh1Yi5ycGkuZWR1L0RhdGFJTkNJVEUvREFSLU1hcnMtRjI0L2Jsb2IvbWFpbi9TdHVkZW50RGF0YS9waXhsX3NvbF9jb29yZGluYXRlcy5SZHMpCgo0LiBMSUJTX3RyYWluaW5nX3NldF9xdWFydGlsZXMuUmRzIGlzIHRoZSBkYXRhIHdpdGggZWFydGggcXVhcnRpbGUgcmVmZXJlbmNlIGRhdGEuCltodHRwczovL2dpdGh1Yi5ycGkuZWR1L0RhdGFJTkNJVEUvREFSLU1hcnMtRjI0L2Jsb2IvbWFpbi9EYXRhL0xJQlNfdHJhaW5pbmdfc2V0X3F1YXJ0aWxlcy5SZHNdKGh0dHBzOi8vZ2l0aHViLnJwaS5lZHUvRGF0YUlOQ0lURS9EQVItTWFycy1GMjQvYmxvYi9tYWluL0RhdGEvTElCU190cmFpbmluZ19zZXRfcXVhcnRpbGVzLlJkcykuIAoKVG8gcHJlcGFyZSB0aGUgZGF0YSwgSSBzdGFydCBieSBsb2FkaW5nIGluIHRoZSBMSUJTIGRhdGEuIFRoZW4sIHdlIGRyb3AgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBjb2x1bW5zIGFuZCBzdW0gb2YgcGVyY2VudGFnZSBjb2x1bW5zIGxlYXZpbmcgdXMgd2l0aCBqdXN0IHRoZSB3ZWlnaHRlZCBjb21wb3NpdGlvbiBpbiB0ZXJtcyBvZiBudW1lcmljYWwgZGF0YS4gV2UgYWxzbyByZW1vdmUgdGhlIHNjY3QgdmFsdWVzLCBhcyB0aG9zZSB2YWx1ZXMgYXJlIHRoZSBvbmVzIHRoYXQgYXJlIGVhcnRoIHJlZmVyZW5jZSBzYW1wbGVzIHRoYXQgUGVyc2VydmVyYW5jZSBjYXJyaWVzIHdpdGggaXQuIFRoZXJlZm9yZSwgdGhleSB3aWxsIG5vdCBiZSB2ZXJ5IHJlbGV2YW50IHdoZW4gcGxvdHRpbmcgdGhlIExJQlMgZGF0YSBhcyB3ZSBhcmUgZm9jdXNlZCBvbiB0aGUgTWFycyBzb2lsIGNvbXBvc2l0aW9ucy4KCmBgYHtyfQojRWFydGggcXVhcnRpbGVzCmVhcnRocXVhcnRpbGVzLmRmPC1yZWFkUkRTKCIvYWNhZGVtaWNzL01BVFAtNDkxMC1GMjQvREFSLU1hcnMtRjI0L0RhdGEvTElCU190cmFpbmluZ19zZXRfcXVhcnRpbGVzLlJkcyIpCiNMb2FkIGluIExJQlMgZGF0YQpsaWJzLmRmIDwtIHJlYWRSRFMoIi9hY2FkZW1pY3MvTUFUUC00OTEwLUYyNC9EQVItTWFycy1GMjQvRGF0YS9zdXBlcmNhbV9saWJzX21vY19sb2MuUmRzIikKI0Ryb3AgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBmZWF0dXJlcywgdGhlIHN1bSBvZiB0aGUgcGVyY2VudGFnZXMsIAojdGhlIGRpc3RhbmNlLCBhbmQgdGhlIHRvdGFsIGZyZXF1ZW5jaWVzCmxpYnMuZGYgPC0gbGlicy5kZiAlPiUgCiAgc2VsZWN0KCEoYyhkaXN0YW5jZV9tbSxUb3QuRW0uLFNpTzJfc3RkZXYsVGlPMl9zdGRldixBbDJPM19zdGRldixGZU9UX3N0ZGV2LAogICAgICAgICAgICAgTWdPX3N0ZGV2LE5hMk9fc3RkZXYsQ2FPX3N0ZGV2LEsyT19zdGRldixUb3RhbCkpKQojIENvbnZlcnQgdGhlIHBvaW50cyB0byBudW1lcmljCmxpYnMuZGYkcG9pbnQgPC0gYXMubnVtZXJpYyhsaWJzLmRmJHBvaW50KQpsaWJzLmRmWyw2OjEzXSA8LSBzYXBwbHkobGlicy5kZlssNjoxM10sYXMubnVtZXJpYykKI3JlbW92ZSB0aGUgc2NjdC9yZWZlcmVuY2Ugc2FtcGxlcwpsaWJzLmRmPC1saWJzLmRmJT4lCiAgZmlsdGVyKCEoZ3JlcGwoInNjY3QiLCB0YXJnZXQpKSkKI2FkZCBhIGNvbHVtbiB0byBpbmRpY2F0ZSB0aGUgbmVhcmVzdCBwaXhsCmxpYnMuZGY8LWNiaW5kKG5lYXJlc3RwaXhsPTAsbGlicy5kZikKI21ha2UgYSBkYXRhZnJhbWUgb2YganVzdCB0aGUgTElCUyBMYXQvTG9uZyBhbmQgdGFyZ2V0IG5hbWUgYW5kIHJlbW92ZSBkdXBsaWNhdGVzCmxpYnN0YXJnZXRzLmRmPC1saWJzLmRmWyxjKDEsMyw0LDUpXQpsaWJzdGFyZ2V0cy5kZjwtZGlzdGluY3QobGlic3RhcmdldHMuZGYpCmBgYAoKU2V0IG1ldGVycyBhbmQgY2hvc2VuIGFicmFzaW9uIHRvIGFjdCBhcyBhIHNsaWRlciBpbiB0aGUgMmQgYXBwLgpgYGB7cn0KI0Nob29zZSBtYXggZGlzdGFuY2UgdmFyaWFibGUgYmV0d2VlbiBQSVhMIGFuZCBMSUJTIGRhdGEKbWV0ZXJzID0gMTAwCiNDaG9vc2UgUElYTCBhYnJhc2lvbiB5b3Ugd2FudCB0byBsb29rIGF0CmFicmFzaW9uX25hbWUgPSAiQmVycnkgSG9sbG93IgpgYGAKCk5leHQsIHdlIGxvYWQgaW4gdGhlIFBJWEwgZGF0YS4gV2UgcmVtb3ZlIHRoZSBhdG1vc3BoZXJpYyBzYW1wbGUgYW5kIG9ubHkgc2VsZWN0IG9uZSBQSVhMIHNhbXBsZSBvZiBlYWNoIGFicmFzaW9uLgpgYGB7ciwgZGF0YTAyfQojcmVhZCBpbiBwaXhsIGRhdGEgd2l0aCBsYXQvbG9uZwpwaXhsLmRmPC1yZWFkUkRTKCIvYWNhZGVtaWNzL01BVFAtNDkxMC1GMjQvREFSLU1hcnMtRjI0L1N0dWRlbnREYXRhL3BpeGxfc29sX2Nvb3JkaW5hdGVzLlJkcyIpCiNpbmNsdWRlIG9ubHkgcGl4bCBtZXRhZGF0YQpwaXhsLmRmPC1waXhsLmRmICU+JQogIHNlbGVjdChjKDEsMiwxOSwyMCwyMikpCiNjb252ZXJ0IExhdC9Mb25nIHRvIG51bWVyaWMKcGl4bC5kZiRMYXQgPC0gYXMubnVtZXJpYyhwaXhsLmRmJExhdCkKcGl4bC5kZiRMb25nIDwtIGFzLm51bWVyaWMocGl4bC5kZiRMb25nKQojcmVtb3ZlIHJvd3Mgc28gd2Ugb25seSBoYXZlIG9uZSBzYW1wbGUgcGVyIGFicmFzaW9uIGFuZCByZW1vdmUgYXRtb3NwaGVyaWMgc2FtcGxlCnBpeGwuZGY8LXBpeGwuZGZbYygyLDQsNiw4LDEwLDEyLDE0LDE2KSxdCmBgYAoKTmV4dCwgd2Ugd2lsbCBpbml0aWFsaXplIGEgZGlzdGFuY2UgdmFyaWFibGUgKHRvIGluZGljYXRlIGRpc3RhbmNlIGJldHdlZW4gUElYTCBhYnJhc2lvbiBhbmQgTElCUyB0YXJnZXQpIGFuZCBhbHNvIGluaXRpYWxpemUgZWFjaCBQSVhMIGFicmFzaW9uLCB3aGljaCB3aWxsIGJlIHVzZWQgdG8gbWFyayB3aGljaCBQSVhMIGFicmFzaW9uIHRoZSBMSUJTIHNhbXBsZSBpcyBjbG9zZXN0IHRvIGJ5IHVzaW5nIGEgZmFjdG9yIG9mIDAgb3IgMS4gCmBgYHtyfQpsaWJzdGFyZ2V0cy5kZjwtY2JpbmQobGlic3RhcmdldHMuZGYsIkRpc3RhbmNlIj0wLCJCZWxsZWdyYWRlIj0wLCJEb3VyYmVzIj0wLCJRdWFydGllciI9MCwiQWxmYWxmYSI9MCwiVGhvcm50b25HYXAiPTAsIkJlcnJ5IEhvbGxvdyI9MCwiTm92YXJ1cHRhIj0wLCJVZ2FuaWsgSXNsYW5kIj0wKQpgYGAKClRoZSBkaXN0YW5jZSBmdW5jdGlvbiBiZWxvdyB3aWxsIGNhbGN1bGF0ZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIExJQlMgdGFyZ2V0IGFuZCBhbGwgdGhlIFBJWEwgYWJyYXNpb25zLCBhbmQgcGljayB0aGUgc21hbGxlc3QgZGlzdGFuY2UgdG8gcGljayB0aGUgY2xvZXN0IFBJWEwgYWJyYXNpb24gdG8gdGhhdCBMSUJTIHRhcmdldC4KYGBge3J9CmZvcihpIGluIDE6bnJvdyhsaWJzdGFyZ2V0cy5kZikpIHsKICAgIGxpYnN0YXJnZXRzLmRmW2ksYyg2OjEzKV08LWMoZGlzdEhhdmVyc2luZShwaXhsLmRmWzEsYygxLDIpXSxsaWJzdGFyZ2V0cy5kZltpLGMoMiwzKV0scj0zMzkzMTY5KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdEhhdmVyc2luZShwaXhsLmRmWzIsYygxLDIpXSxsaWJzdGFyZ2V0cy5kZltpLGMoMiwzKV0scj0zMzkzMTY5KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdEhhdmVyc2luZShwaXhsLmRmWzMsYygxLDIpXSxsaWJzdGFyZ2V0cy5kZltpLGMoMiwzKV0scj0zMzkzMTY5KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdEhhdmVyc2luZShwaXhsLmRmWzQsYygxLDIpXSxsaWJzdGFyZ2V0cy5kZltpLGMoMiwzKV0scj0zMzkzMTY5KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdEhhdmVyc2luZShwaXhsLmRmWzUsYygxLDIpXSxsaWJzdGFyZ2V0cy5kZltpLGMoMiwzKV0scj0zMzkzMTY5KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdEhhdmVyc2luZShwaXhsLmRmWzYsYygxLDIpXSxsaWJzdGFyZ2V0cy5kZltpLGMoMiwzKV0scj0zMzkzMTY5KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdEhhdmVyc2luZShwaXhsLmRmWzcsYygxLDIpXSxsaWJzdGFyZ2V0cy5kZltpLGMoMiwzKV0scj0zMzkzMTY5KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdEhhdmVyc2luZShwaXhsLmRmWzgsYygxLDIpXSxsaWJzdGFyZ2V0cy5kZltpLGMoMiwzKV0scj0zMzkzMTY5KSkKICAgIAogICAgbGlic3RhcmdldHMuZGZbaSwxXTwtd2hpY2gubWluKGxpYnN0YXJnZXRzLmRmW2ksYyg2OjEzKV0pCiAgICBsaWJzdGFyZ2V0cy5kZltpLDVdPC1taW4obGlic3RhcmdldHMuZGZbaSxjKDY6MTMpXSkKfQpsaWJzdGFyZ2V0cy5kZiRuZWFyZXN0cGl4bDwtYXMuZmFjdG9yKGxpYnN0YXJnZXRzLmRmJG5lYXJlc3RwaXhsKQpsZXZlbHMobGlic3RhcmdldHMuZGYkbmVhcmVzdHBpeGwpPC0oYygiQmVsbGVncmFkZSIsIkRvdXJiZXMiLCJRdWFydGllciIsIkFsZmFsZmEiLCJUaG9ybnRvbkdhcCIsIkJlcnJ5IEhvbGxvdyIsIk5vdmFydXB0YSIsIlVnYW5payBJc2xhbmQiKSkKYGBgCgpCZWxvdyBpcyBhbm90aGVyIGluaXRpYWxpemVyIGZvciB0aGUgUElYTCBhYnJhc2lvbiBkYXRhLiBUaGlzIHNldHMgdGhlIHZhcmlhYmxlcyBmb3IgZWFjaCBQSVhMIGFicmFzaW9uLgpgYGB7cn0KQmVsbGVncmFkZTwtbGlic3RhcmdldHMuZGZbbGlic3RhcmdldHMuZGYkbmVhcmVzdHBpeGw9PSJCZWxsZWdyYWRlIixdJHRhcmdldApEb3VyYmVzPC1saWJzdGFyZ2V0cy5kZltsaWJzdGFyZ2V0cy5kZiRuZWFyZXN0cGl4bD09IkRvdXJiZXMiLF0kdGFyZ2V0ClF1YXJ0aWVyPC1saWJzdGFyZ2V0cy5kZltsaWJzdGFyZ2V0cy5kZiRuZWFyZXN0cGl4bD09IlF1YXJ0aWVyIixdJHRhcmdldApBbGZhbGZhPC1saWJzdGFyZ2V0cy5kZltsaWJzdGFyZ2V0cy5kZiRuZWFyZXN0cGl4bD09IkFsZmFsZmEiLF0kdGFyZ2V0ClRob3JudG9uR2FwPC1saWJzdGFyZ2V0cy5kZltsaWJzdGFyZ2V0cy5kZiRuZWFyZXN0cGl4bD09IlRob3JudG9uR2FwIixdJHRhcmdldApCZXJyeUhvbGxvdzwtbGlic3RhcmdldHMuZGZbbGlic3RhcmdldHMuZGYkbmVhcmVzdHBpeGw9PSJCZXJyeSBIb2xsb3ciLF0kdGFyZ2V0Ck5vdmFydXB0YTwtbGlic3RhcmdldHMuZGZbbGlic3RhcmdldHMuZGYkbmVhcmVzdHBpeGw9PSJOb3ZhcnVwdGEiLF0kdGFyZ2V0ClVnYW5pa0lzbGFuZDwtbGlic3RhcmdldHMuZGZbbGlic3RhcmdldHMuZGYkbmVhcmVzdHBpeGw9PSJVZ2FuaWsgSXNsYW5kIixdJHRhcmdldApgYGAKCk5leHQsIHdlIGZpbHRlciBvdXQgdGhlIExJQlMgdGFyZ2V0cyB0aGF0IGFyZSBub3Qgd2l0aGluIHRoZSBzcGVjaWZpZWQgZGlzdGFuY2UgdmFyaWFibGUuIFRoZW4sIHdlIG1lcmdlIHRoZSBMSUJTIGRhdGEgd2l0aCB0aGUgcmVzcGVjdGl2ZSBQSVhMIGFicmFzaW9uIGJ5IG11dGF0aW5nIGFuZCBhZGRpbmcgYW4gYWJyYXNpb24gY29sdW1uIHRoYXQgaGFzIHRoZSBhYnJhc2lvbiBuYW1lIGNsb3Nlc3QgdG8gZWFjaCBMSUJTIHRhcmdldC4gV2UgYWxzbyBhZGQgYSBjb2x1bW4sIExJQlMgb3IgUElYTCwgd2hpY2ggZGVub3RlcyBpZiB0aGUgcm93IG9mIGRhdGEgaXMgZnJvbSB0aGUgUElYTCBhbmQgTElCUyBkYXRhIHNldHMuCmBgYHtyfQppbmNsdWRlZC5saWJzPC0obGlic3RhcmdldHMuZGYlPiUKICBmaWx0ZXIoRGlzdGFuY2U8bWV0ZXJzKSkkdGFyZ2V0CmxpYnMubWF0cml4IDwtbGlicy5kZiAlPiUKICBmaWx0ZXIodGFyZ2V0ICVpbiUgaW5jbHVkZWQubGlicykKbGlicy5tYXRyaXggPC0gbGlicy5tYXRyaXhbLGMoNSw3OjE0KV0KbGlicy5tYXRyaXg8LWxpYnMubWF0cml4WyxjKDE6Miw0OjksMyldCmxpYnMubWF0cml4PC1jYmluZCgiQWJyYXNpb24iPTAsbGlicy5tYXRyaXgpCmxpYnMubWF0cml4PC1saWJzLm1hdHJpeCU+JQogIG11dGF0ZShBYnJhc2lvbiA9IGlmZWxzZSh0YXJnZXQlaW4lQWxmYWxmYSwiQWxmYWxmYSIsIAogICAgICAgICAgICAgICAgICAgIGlmZWxzZSh0YXJnZXQgJWluJSBCZWxsZWdyYWRlLCAiQmVsZWdyYWRlIiwKICAgICAgICAgICAgICAgICAgICBpZmVsc2UodGFyZ2V0ICVpbiUgQmVycnlIb2xsb3csICJCZXJyeSBIb2xsb3ciLAogICAgICAgICAgICAgICAgICAgIGlmZWxzZSh0YXJnZXQgJWluJSBEb3VyYmVzLCAiRG91cmJlcyIsCiAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHRhcmdldCAlaW4lIE5vdmFydXB0YSwgIk5vdmFydXB0YSIsCiAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHRhcmdldCAlaW4lIFF1YXJ0aWVyLCAiUXVhcnRpZXIiLAogICAgICAgICAgICAgICAgICAgIGlmZWxzZSh0YXJnZXQgJWluJSBUaG9ybnRvbkdhcCwgIlRob3JudG9uR2FwIiwKICAgICAgICAgICAgICAgICAgICBpZmVsc2UodGFyZ2V0ICVpbiUgVWdhbmlrSXNsYW5kLCAiVWdhbmlrIElzbGFuZCIsQWJyYXNpb24pKSkpKSkpKSkKbGlicy5tYXRyaXg8LWNiaW5kKGxpYnNvcnBpeGw9MSxsaWJzLm1hdHJpeCkKYGBgCgpOZXh0LCB3ZSB3aWxsIHJlYWQgaW4gdGhlIFBJWEwgZGF0YS4gV2Ugd2lsbCByZW1vdmUgdGhlIGF0bW9zcGhlcmljIHNhbXBsZSAoZmlyc3Qgc2FtcGxlKSBhbmQgb25seSBjaG9vc2Ugb25lIG9mIGVhY2ggUElYTCBzYW1wbGUgaW4gYXMgZWFjaCBhYnJhc2lvbiBoYXMgdHdvIHNhbXBsZXMgKG9ubHkgb25lIHdpbGwgYmUgbmVjZXNzYXJ5IGZvciB0aGUgcGxvdCkuCgpgYGB7ciwgZGF0YTAzfQojcmVhZCBpbiBwaXhsIGRhdGEgd2l0aCBsYXQvbG9uZwpwaXhsLmRmPC1yZWFkUkRTKCIvYWNhZGVtaWNzL01BVFAtNDkxMC1GMjQvREFSLU1hcnMtRjI0L1N0dWRlbnREYXRhL3BpeGxfc29sX2Nvb3JkaW5hdGVzLlJkcyIpCnBpeGwuZGY8LXBpeGwuZGYgJT4lCiAgc2VsZWN0KGMoNTo4LDEyOjE0LDE3LDE5LDE4LDIyKSkKI3Jlb3JkZXIgcGl4bCBjb2x1bW5zIHNvIHRoYXQgaXQgbWF0Y2hlcyBsaWJzIGRhdGEgb3JnYW5pemF0aW9uCnBpeGwuZGY8LXBpeGwuZGZbLGMoMTEsMTAsNCwzLDgsMiw2LDEsNSw3KV0KI3JlbW92ZSBhdG1vc3BoZXJpYyBzYW1wbGUKcGl4bC5kZjwtcGl4bC5kZlsyOjE2LF0KcGl4bC5kZjwtY2JpbmQobGlic29ycGl4bD0wLHBpeGwuZGYpCmBgYAoKRmluYWxseSwgd2UgbWVyZ2UgdGhlIExJQlMgYW5kIFBJWEwgZGF0YSBzZXRzIHdlIGhhdmUgbW9kaWZpZWQgdGh1cyBmYXIgZm9yIGEgY29tYmluZWQgTElCUyBhbmQgUElYTCBkYXRhIGZyYW1lIHN1aXRhYmxlIGZvciBhIHNvaWwgY29tcG9zaXRpb24gbGluZSBwbG90LgpgYGB7cn0KY29sbmFtZXMocGl4bC5kZik8LWNvbG5hbWVzKGxpYnMubWF0cml4KQpwaXhsbGlicy5kZjwtcmJpbmQocGl4bC5kZixsaWJzLm1hdHJpeCkKYGBgCgojIyA0LjIgQ29udHJpYnV0aW9uCgpTb21lIG9mIHRoZSBkYXRhIG1hbmlwdWxhdGluZyB3b3JrIHdhcyBNYXJnbydzLCBzdWNoIGFzIHRoZSBkaXN0YW5jZSBmdW5jdGlvbi4gSW4gdGVybXMgb2YgcGl2b3RpbmcgdGhlIGRhdGEgZnJhbWUgYW5kIHRoZSBvdGhlciBzdGVwcyBvZiB0aGUgcHJlcHJvY2Vzc2luZyBpcyBteSBvd24gd29yay4gVGhlIG1hbmlwdWxhdGluZyBiZWxvdyB0byBwbG90IHRoZSBsaW5lIHNvaWwgY29tcG9zaXRpb24gcGxvdHMgaXMgbXkgb3duLgoKIyMgNC4zIE1ldGhvZHMgRGVzY3JpcHRpb24gCgpXaGVuIGRlY2lkaW5nIGhvdyB0byBhcHByb2FjaCB0aGUgY29uY2VwdCBvZiBidWlsZGluZyBzb2lsIGNvbXBvc2l0aW9uIHBsb3RzIG9mIGVhY2ggUElYTCBhYnJhc2lvbiBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgTElCUyB0YXJnZXRzIHdpdGhpbiBhIGNlcnRhaW4gZGlzdGFuY2UgbWF4aW11bSwgSSBkZWNpZGVkIHRoZSBiZXN0IHdheSB3YXMgdG8gc3RhcnQgd2l0aCB0aGUgb3JpZ2luYWwgZGF0YSBzZXRzIGFuZCBtb2RpZnkgdGhlbSBhcyBuZWVkZWQuIEZvciB0aGUgYWN0dWFsIHBsb3QsIHRoZSBiZXN0IHdheSB0byBmb3JtYXQgdGhlIGRhdGEgY29ycmVjdGx5IGlzIHRvIHBpdm90IGl0LCBhcyBJIG5lZWQgdGhlIHggYXhpcyB0byBiZSB0aGUgY29sdW1uIG5hbWVzIGluIHRoZSBjdXJyZW50IGRhdGEgZnJhbWUgd2UgaGF2ZSAoU2lPMiBhbmQgb3RoZXIgY29tcG9zaXRpb25zKSBhbmQgdGhlIHkgYXhpcyB0byBiZSB0aGUgd2VpZ2h0ZWQgY29tcG9zaXRpb24gdmFsdWVzLiBXZSBhbHNvIG5lZWQgYW4gaW5kaWNhdG9yIG9mIGlmIHRoZSBkYXRhIGlzIGZyb20gUElYTCBvciBMSUJTLCB3aGljaCBhbHNvIGlzIGhlbHBmdWwgZm9yIGJ1aWxkaW5nIHRoZSBsaW5lIHBsb3RzLiAKClVzZXJzIHdpbGwgaGF2ZSB0byBzZXQgdGhlIGRpc3RhbmNlIHZhcmlhYmxlIGluIG9yZGVyIHRvIGNob29zZSB0aGUgbWF4IGRpc3RhbmNlIGJldHdlZW4gUElYTCBhYnJhc2lvbnMgYW5kIExJQlMgdGFyZ2V0cy4gVGhpcyBjYW4gdmFzdGx5IGNoYW5nZSB0aGUgbnVtYmVyIG9mIGxpbmVzIG9uIHRoZSBwbG90cyB3aGljaCBjYW4gaGVscCBwcmV2ZW50IG92ZXJjcm93ZGVkIHBsb3RzLiBVc2VycyBhbHNvIGNhbiBzZXQgYSB2YXJpYWJsZSB0byBjaG9vc2UgYSBzcGVjaWZpYyBQSVhMIGFicmFzaW9uIGFuZCBjb3JyZXNwb25kaW5nIExJQlMgdGFyZ2V0cywgd2hpY2ggaXMgZWFzaWVyIHRvIGludGVycHJldCBhcyBwbG90dGluZyBhbGwgb2YgdGhlIExJQlMgYW5kIFBJWEwgY29tcG9zaXRpb24gaW5mb3JtYXRpb24gb24gbGluZSBwbG90cyBsZWFkcyB0byB2ZXJ5IGNvbmRlbnNlZCBncmFwaHMgdGhhdCBhcmUgaGFyZCB0byByZWFkLgoKIyMgNC40IFJlc3VsdCBhbmQgRGlzY3Vzc2lvbiAKCkZpcnN0LCB3ZSB3aWxsIHR1cm4gdGhlIGVhcnRoIHF1YXJ0aWxlIGluZm9ybWF0aW9uIGludG8gYSBsb25nIGRhdGEgZnJhbWUgKG1lYW5pbmcgcGl2b3RpbmcgdGhlIGNvbHVtbnMgaW50byB0aGUgdmFsdWVzKS4gCmBgYHtyfQojIEVhcnRoIHF1YXJ0aWxlcwplYXJ0aHF1YXJ0aWxlc19sb25nIDwtIGVhcnRocXVhcnRpbGVzLmRmICU+JQogIHBpdm90X2xvbmdlcihjb2xzID0gc3RhcnRzX3dpdGgoIlNpTzIiKTpsYXN0X2NvbCgpLCBuYW1lc190byA9ICJDb21wb3VuZCIsIHZhbHVlc190byA9ICJQZXJjZW50YWdlIikKCmVhcnRocXVhcnRpbGVzX2xvbmcgPC0gZWFydGhxdWFydGlsZXNfbG9uZyAlPiUgcmVuYW1lKFF1YXJ0aWxlcyA9IGBUcmFpbmluZyBzZXQgUXVhcnRpbGVzYCkKYGBgCgpUaGVuLCB0aGUgZGF0YSB3aWxsIGJlIGZpbHRlcmVkIHRvIG9ubHkgaW5jbHVkZSB0aGUgZGF0YSBmcm9tIGEgc3BlY2lmaWMgUElYTCBhYnJhc2lvbiBjaG9zZW4gYnkgdGhlIHVzZXIuIFRoZSBkYXRhIGlzIHBpdm90ZWQgaW50byBhIGxvbmcgZm9ybWF0LCBhbmQgdGhlIGNvbHVtbnMgYXJlIHJlb3JkZXJlZCB0byBtaW1pYyBzaW1pbGFyIHBsb3RzIGZyb20gTkFTQSBwYXBlcnMuCmBgYHtyfQojIEZpbHRlciBmb3IgdGhlIHNwZWNpZmljIGFicmFzaW9uIHNhbXBsZSwgZS5nLiwgIkFsZmFsZmEiCnBpeGxsaWJzX2ZpbHRlcmVkIDwtIHBpeGxsaWJzLmRmICU+JQogIGZpbHRlcihBYnJhc2lvbiA9PSBhYnJhc2lvbl9uYW1lKQoKIyBQaXZvdCB0aGUgZGF0YSB0byBsb25nZXIgZm9ybWF0IGZvciBnZ3Bsb3QKcGl4bGxpYnNfbG9uZyA8LSBwaXhsbGlic19maWx0ZXJlZCAlPiUKICBwaXZvdF9sb25nZXIoY29scyA9IHN0YXJ0c193aXRoKCJTaU8yIik6bGFzdF9jb2woKSwgbmFtZXNfdG8gPSAiQ29tcG91bmQiLCB2YWx1ZXNfdG8gPSAiUGVyY2VudGFnZSIpCgpkZXNpcmVkX29yZGVyIDwtIGMoIlNpTzIiLCAiQWwyTzMiLCAiRmVPVCIsICJNZ08iLCAiQ2FPIiwgIk5hMk8iLCAiSzJPIiwgIlRpTzIiKSAgIyBTcGVjaWZ5IHlvdXIgY3VzdG9tIG9yZGVyIGhlcmUKcGl4bGxpYnNfbG9uZyRDb21wb3VuZCA8LSBmYWN0b3IocGl4bGxpYnNfbG9uZyRDb21wb3VuZCwgbGV2ZWxzID0gZGVzaXJlZF9vcmRlcikKYGBgCgpGb3IgdGhlIHBsb3QsIHdlIHVzZSBnZ3Bsb3QgdG8gcGxvdCB0aGUgcGl4bGxpYnNfbG9uZyBkYXRhIGZyYW1lIHdlIGNyZWF0ZWQuIFRoZSBwbG90IGlzIGNvbG9yZWQgYnkgaWYgdGhlIGxpbmUgaXMgYSBQSVhMIGFicmFzaW9uJ3MgY29tcG9zaXRpb24gb3IgYSBMSUJTIHRhcmdldCdzIGNvbXBvc2l0aW9uLiBXZSBhbHNvIGFkZCBhIGxheWVyIHdpdGggdGhlIGVhcnRoIHF1YXJ0aWxlIGluZm9ybWF0aW9uLCB3aGljaCBpcyB0aGUgZG90dGVkIGxpbmVzLgpgYGB7cn0KIyBNYXAgdGhlIFBJWEwvTElCUyBjb2x1bW4gdG8gY29sb3IgYW5kIHVzZSB0YXJnZXRfbmFtZSB0byBkaWZmZXJlbnRpYXRlIGxpbmVzCmdncGxvdChwaXhsbGlic19sb25nLCBhZXMoeCA9IENvbXBvdW5kLCB5ID0gUGVyY2VudGFnZSwgY29sb3IgPSBhcy5mYWN0b3IobGlic29ycGl4bCksIGdyb3VwID0gdGFyZ2V0KSkgKwogIGdlb21fbGluZSgpICsKICBnZW9tX3BvaW50KCkgKwogIHNjYWxlX3lfY29udGludW91cyh0cmFucz0nbG9nMTAnKSArCiAgIyBBZGQgRWFydGggcXVhcnRpbGUgbGluZXMgdXNpbmcgZWFydGhxdWFydGlsZXNfbG9uZwogIGdlb21fbGluZShkYXRhID0gZWFydGhxdWFydGlsZXNfbG9uZywgYWVzKHggPSBDb21wb3VuZCwgeSA9IFBlcmNlbnRhZ2UsIGxpbmV0eXBlID0gUXVhcnRpbGVzLCBncm91cCA9IFF1YXJ0aWxlcyksIAogICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIGxpbmV0eXBlID0gImRvdHRlZCIpICsKICBsYWJzKHRpdGxlID0gcGFzdGUoIlNvaWwgQ29tcG9zaXRpb24gZm9yIFBJWEwgYWJyYXNpb24iLGFicmFzaW9uX25hbWUsImFuZCBMSUJTIHdpdGhpbiIsIG1ldGVycywgIm1ldGVycyIsIHNlcCA9ICIgIiksCiAgICAgICB4ID0gIkNoZW1pY2FsIENvbXBvdW5kIiwKICAgICAgIHkgPSAiV2VpZ2h0IFBlcmNlbnRhZ2UiLAogICAgICAgY29sb3IgPSAiTWVhc3VyZW1lbnQgVHlwZSIsCiAgICAgICBsaW5ldHlwZSA9ICJFYXJ0aCBRdWFydGlsZXMiKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIjAiID0gImJsdWUiLCAiMSIgPSAicmVkIiksIGxhYmVscyA9IGMoIlBJWEwiLCAiTElCUyIpKSArCiAgdGhlbWVfbWluaW1hbCgpCmBgYApJIHN0aWxsIHBsYW4gdG8gdXBkYXRlIGFuZCB0cnkgdXNpbmcgdGhlIGdncGxvdGxheSBmZWF0dXJlIHRvIGluY29ycG9yYXRlIGFsbCB0aGUgYWJyYXNpb25zIGFuZCBkYXRhIG9udG8gb25lIGdyaWQgb2YgbGluZSBwbG90cy4gSSBhbHNvIGFtIGdvaW5nIHRvIGFkZCBwbG90cyB3aGVyZSB0aGUgbWVhbiBpcyB0YWtlbiBvZiBhbGwgdGhlIExJQlMgdGFyZ2V0cyB0aGF0IGNvcnJlc3BvbmQgdG8gYSBQSVhMIGFicmFzaW9uIHNvIHRoZSBwbG90IHdpbGwgb25seSBoYXZlIG9uZSBMSUJTIGxpbmUgYW5kIG9uZSBQSVhMIGxpbmUgKGFsb25nIHdpdGggdGhlIHJlZmVyZW5jZXMpLCB0aGlzIGlzIGFsbCBqdXN0IGZvciB0aGUgZHJhZnQuIEkgYWxzbyBuZWVkIHRvIG9ubHkgYWRkIGNlcnRhaW4gcXVhcnRpbGUgaW5mb3JtYXRpb24gYW5kIGxhYmVsIHRoZW0sIHRoaXMgaXMganVzdCBhIHBsYWNlaG9sZGVyIG9mIHRoZSBwcmV2aW91cyBwbG90LiBBbHNvIG1heWJlIHdpbGwgYWRkIGluIFNDQ1QgdmFsdWVzIGFzIHJlZmVyZW5jZXMsIG5vdCBzdXJlIGlmIHRoZXkgYXJlIHN1cGVyIHJlbGV2YW50IG9yIGhvdyB0byBzb3J0IHRoZW0uCgojIyA0LjUgQ29uY2x1c2lvbnMgYW5kIEZ1dHVyZSBXb3JrClRoaXMgZmluZGluZyBjYW4gYmUgdXNlZCBieSBnZW9sb2dpc3RzIHRvIGFuYWx5emUgd2hhdCBkaWZmZXJlbnQgc29pbCBjb21wb3NpdGlvbnMgYXJvdW5kIGRpZmZlcmVudCBQSVhMIGFicmFzaW9ucyBjYW4gbWVhbiBmb3IgbGlmZSBvbiBNYXJzLiBGb3IgZXhhbXBsZSwgb3hpZGUgcHJlc2VuY2UgZG9lc24ndCBuZWNlc3NhcmlseSBpbmRpY2F0ZSBsaWZlLCBidXQgaXQgY291bGQgaW5kaWNhdGUgYmlvbG9naWNhbCBvciBjaGVtaWNhbCBsaWZlIHByb2Nlc3Nlcy4gRm9yIGV4YW1wbGUsIENhTyBjYW4gaW5kaWNhdGUgdGhlIHByZXNlbmNlIG9mIG9sZCBiaW9sb2dpY2FsIG1hdGVyaWFsIGxpa2Ugc2hlbGxzIG9yIGZvc3NpbHMuCi1BZGQgbW9yZSBhYm91dCBmdXR1cmUgd29yaywgbm90IHN1cmUgd2hhdCBlbHNlIHRvIGluY2x1ZGUKCiMgNS4wIEZpbmRpbmcgMzogQW5hbHl6aW5nIENhdGlvbiBDb21iaW5hdGlvbnMgdXNpbmcgTElCUyBhbmQgUElYTCBtYXRjaGVkIGRhdGEKVXNpbmcgdGhlIExJQlMgYW5kIFBJWEwgY29tYmluZWQgZGF0YSBzZXQsIHdlIGNyZWF0ZWQgYSB0ZXJuYXJ5IHBsb3QgdG8gc2hvdyB0aGUgZGlzdHJpYnV0aW9uIG9mIExJQlMgc2FtcGxlcyBzb3J0ZWQgYnkgd2hhdCBQSVhMIGFicmFzaW9uIHRoZXkgYXJlIGNsb3Nlc3QgdG8gKGJhc2VkIG9uIGEgY2hvc2VuIGRpc3RhbmNlIHZhcmlhYmxlKS4gTXVjaCBvZiB0aGUgZGF0YSBwcmVwcm9jZXNzaW5nIGlzIHNpbWlsYXIgdG8gRmluZGluZyAxIHdoaWNoIHdlIHdpbGwgcmVwZWF0IGhlcmUuIEhvd2V2ZXIsIHRoZSBnb2FsIGhlcmUgaXMgdG8gYW5hbHl6ZSBob3cgZGlmZmVyZW50IGdyb3VwcyBvZiBMSUJTIHNhbXBsZXMgKGNvbG9yZWQgYnkgbWF0Y2hpbmcgUElYTCBhYnJhc2lvbikgZGlmZmVyIGJ5IGNhdGlvbiBjb21wb3NpdGlvbi4KCiMjIDUuMSBEYXRhLCBDb2RlLCBhbmQgUmVzb3VyY2VzCkhlcmUgaXMgYSBsaXN0IGRhdGEgc2V0cywgY29kZXMsIHRoYXQgYXJlIHVzZWQgaW4geW91ciB3b3JrLiBBbG9uZyB3aXRoIGJyaWVmIGRlc2NyaXB0aW9uIGFuZCBVUkwgd2hlcmUgdGhleSBhcmUgbG9jYXRlZC4KCjEuIHBldGVyYy1maW5hbFByb2plY3RGMjQuUm1kICh3aXRoIGtuaXQgcGRmIGFuZCBodG1sKSBpcyB0aGlzIG5vdGVib29rLgpbaHR0cHM6Ly9naXRodWIucnBpLmVkdS9EYXRhSU5DSVRFL0RBUi1NYXJzLUYyNC9ibG9iL21haW4vU3R1ZGVudE5vdGVib29rcy9Bc3NpZ25tZW50MDdfRHJhZnRGaW5hbFByb2plY3ROb3RlYm9vay9wZXRlcmNfZmluYWxQcm9qZWN0RjI0X3JvdWdoZHJhZnQuUm1kXShodHRwczovL2dpdGh1Yi5ycGkuZWR1L0RhdGFJTkNJVEUvREFSLU1hcnMtRjI0L2Jsb2IvbWFpbi9TdHVkZW50Tm90ZWJvb2tzL0Fzc2lnbm1lbnQwN19EcmFmdEZpbmFsUHJvamVjdE5vdGVib29rL3BldGVyY19maW5hbFByb2plY3RGMjRfcm91Z2hkcmFmdC5SbWQpCgoyLiBzdXBlcmNhbV9saWJzX21vY19sb2MuUmRzIHdoaWNoIGlzIHRoZSBvcmlnaW5hbCBMSUJTIGRhdGEgZ2l2ZW4gdG8gb3VyIHJlc2VhcmNoIGdyb3VwLgpbaHR0cHM6Ly9naXRodWIucnBpLmVkdS9EYXRhSU5DSVRFL0RBUi1NYXJzLUYyNC9ibG9iL21haW4vRGF0YS9zdXBlcmNhbV9saWJzX21vY19sb2MuUmRzXShodHRwczovL2dpdGh1Yi5ycGkuZWR1L0RhdGFJTkNJVEUvREFSLU1hcnMtRjI0L2Jsb2IvbWFpbi9EYXRhL3N1cGVyY2FtX2xpYnNfbW9jX2xvYy5SZHMpCgoKRmlyc3QsIHdlIHNldCBhIGRpc3RhbmNlIHZhcmlhYmxlIHdoaWNoIGNhbiBiZSB1c2VkIGFzIGEgc2xpZGVyIGJhciBpbiB0aGUgYXBwLiBDaGFuZ2luZyB0aGlzIHZhcmlhYmxlIHNldHMgdGhlIG1heGltdW0gZGlzdGFuY2UgYmV0d2VlbiBhIFBJWEwgdGFyZ2V0IGFuZCBMSUJTIHNhbXBsZSBmb3IgdGhlbSB0byBiZSBjbGFzc2lmaWVkIHRvZ2V0aGVyLgpgYGB7cn0KI3NldCBkaXN0YW5jZSB2YXJpYWJsZSB3aGljaCBjYW4gYmUgdXNlZCBhcyBhIHRvZ2dsZSB0b29sCmRpc3RhbmNlPTUwCmBgYAoKVG8gcHJlcGFyZSB0aGUgZGF0YSwgSSBzdGFydCBieSBsb2FkaW5nIGluIHRoZSBMSUJTIGRhdGEuIFRoZW4sIHdlIGRyb3AgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBjb2x1bW5zIGFuZCBzdW0gb2YgcGVyY2VudGFnZSBjb2x1bW5zIGxlYXZpbmcgdXMgd2l0aCBqdXN0IHRoZSB3ZWlnaHRlZCBjb21wb3NpdGlvbiBpbiB0ZXJtcyBvZiBudW1lcmljYWwgZGF0YS4gV2UgYWxzbyByZW1vdmUgdGhlIHNjY3QgdmFsdWVzLCBhcyB0aG9zZSB2YWx1ZXMgYXJlIHRoZSBvbmVzIHRoYXQgYXJlIGVhcnRoIHJlZmVyZW5jZSBzYW1wbGVzIHRoYXQgUGVyc2VydmVyYW5jZSBjYXJyaWVzIHdpdGggaXQuIFRoZXJlZm9yZSwgdGhleSB3aWxsIG5vdCBiZSB2ZXJ5IHJlbGV2YW50IHdoZW4gcGxvdHRpbmcgdGhlIExJQlMgZGF0YSBhcyB3ZSBhcmUgZm9jdXNlZCBvbiB0aGUgY2F0aW9uIGNvbWJpbmF0aW9ucyBhbmQgdGhlcmVmb3JlIG9ubHkgbmVlZCB0aGUgd2VpZ2h0ZWQgY29tcG9zaXRpb25zLgpgYGB7cn0KI0xvYWQgaW4gTElCUyBkYXRhCmxpYnMuZGYgPC0gcmVhZFJEUygiL2FjYWRlbWljcy9NQVRQLTQ5MTAtRjI0L0RBUi1NYXJzLUYyNC9EYXRhL3N1cGVyY2FtX2xpYnNfbW9jX2xvYy5SZHMiKQojRHJvcCB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIGZlYXR1cmVzLCB0aGUgc3VtIG9mIHRoZSBwZXJjZW50YWdlcywgCiN0aGUgZGlzdGFuY2UsIGFuZCB0aGUgdG90YWwgZnJlcXVlbmNpZXMKbGlicy5kZiA8LSBsaWJzLmRmICU+JSAKICBzZWxlY3QoIShjKGRpc3RhbmNlX21tLFRvdC5FbS4sU2lPMl9zdGRldixUaU8yX3N0ZGV2LEFsMk8zX3N0ZGV2LEZlT1Rfc3RkZXYsCiAgICAgICAgICAgICBNZ09fc3RkZXYsTmEyT19zdGRldixDYU9fc3RkZXYsSzJPX3N0ZGV2LFRvdGFsKSkpCiMgQ29udmVydCB0aGUgcG9pbnRzIHRvIG51bWVyaWMKbGlicy5kZiRwb2ludCA8LSBhcy5udW1lcmljKGxpYnMuZGYkcG9pbnQpCmxpYnMuZGZbLDY6MTNdIDwtIHNhcHBseShsaWJzLmRmWyw2OjEzXSxhcy5udW1lcmljKQojcmVtb3ZlIHRoZSBzY2N0L3JlZmVyZW5jZSBzYW1wbGVzCmxpYnMuZGY8LWxpYnMuZGYlPiUKICBmaWx0ZXIoIShncmVwbCgic2NjdCIsIHRhcmdldCkpKQojYWRkIGEgY29sdW1uIHRvIGluZGljYXRlIHRoZSBuZWFyZXN0IHBpeGwKbGlicy5kZjwtY2JpbmQobmVhcmVzdHBpeGw9MCxsaWJzLmRmKQojbWFrZSBhIGRhdGFmcmFtZSBvZiBqdXN0IHRoZSBMSUJTIExhdC9Mb25nIGFuZCB0YXJnZXQgbmFtZSBhbmQgcmVtb3ZlIGR1cGxpY2F0ZXMKbGlic3RhcmdldHMuZGY8LWxpYnMuZGZbLGMoMSwzLDQsNSldCmxpYnN0YXJnZXRzLmRmPC1kaXN0aW5jdChsaWJzdGFyZ2V0cy5kZikKYGBgCgpMb2FkIGluIFBJWEwgZGF0YQpgYGB7cn0KI3JlYWQgaW4gcGl4bCBkYXRhIHdpdGggbGF0L2xvbmcKcGl4bC5kZjwtcmVhZFJEUygiL2FjYWRlbWljcy9NQVRQLTQ5MTAtRjI0L0RBUi1NYXJzLUYyNC9TdHVkZW50RGF0YS9waXhsX3NvbF9jb29yZGluYXRlcy5SZHMiKQojaW5jbHVkZSBvbmx5IHBpeGwgbWV0YWRhdGEKcGl4bC5kZjwtcGl4bC5kZiAlPiUKICBzZWxlY3QoYygxLDIsMTksMjAsMjIpKQojY29udmVydCBMYXQvTG9uZyB0byBudW1lcmljCnBpeGwuZGYkTGF0IDwtIGFzLm51bWVyaWMocGl4bC5kZiRMYXQpCnBpeGwuZGYkTG9uZyA8LSBhcy5udW1lcmljKHBpeGwuZGYkTG9uZykKI3JlbW92ZSByb3dzIHNvIHdlIG9ubHkgaGF2ZSBvbmUgc2FtcGxlIHBlciBhYnJhc2lvbiBhbmQgcmVtb3ZlIGF0bW9zcGhlcmljIHNhbXBsZQpwaXhsLmRmPC1waXhsLmRmW2MoMiw0LDYsOCwxMCwxMiwxNCwxNiksXQpgYGAKCk5leHQsIHdlIHdpbGwgaW5pdGlhbGl6ZSBhIGRpc3RhbmNlIHZhcmlhYmxlICh0byBpbmRpY2F0ZSBkaXN0YW5jZSBiZXR3ZWVuIFBJWEwgYWJyYXNpb24gYW5kIExJQlMgdGFyZ2V0KSBhbmQgYWxzbyBpbml0aWFsaXplIGVhY2ggUElYTCBhYnJhc2lvbiwgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIG1hcmsgd2hpY2ggUElYTCBhYnJhc2lvbiB0aGUgTElCUyBzYW1wbGUgaXMgY2xvc2VzdCB0byBieSB1c2luZyBhIGZhY3RvciBvZiAwIG9yIDEuIApgYGB7cn0KI0xJQlMgdGFyZ2V0IGRhdGEgZnJhbWUgd2l0aCBkaXN0YW5jZSB2YXJpYWJsZSBhcyB3ZWxsCmxpYnN0YXJnZXRzLmRmPC1jYmluZChsaWJzdGFyZ2V0cy5kZiwiRGlzdGFuY2UiPTAsIkJlbGxlZ3JhZGUiPTAsIkRvdXJiZXMiPTAsIlF1YXJ0aWVyIj0wLCJBbGZhbGZhIj0wLCJUaG9ybnRvbkdhcCI9MCwiQmVycnlIb2xsb3ciPTAsIk5vdmFydXB0YSI9MCwiVWdhbmlrSXNsYW5kIj0wKQpgYGAKClRoZSBkaXN0YW5jZSBmdW5jdGlvbiBiZWxvdyB3aWxsIGNhbGN1bGF0ZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIExJQlMgdGFyZ2V0IGFuZCBhbGwgdGhlIFBJWEwgYWJyYXNpb25zLCBhbmQgcGljayB0aGUgc21hbGxlc3QgZGlzdGFuY2UgdG8gcGljayB0aGUgY2xvc2VzdCBQSVhMIGFicmFzaW9uIHRvIHRoYXQgTElCUyB0YXJnZXQuCmBgYHtyfQojRGlzdGFuY2UgZnVuY3Rpb24KZm9yKGkgaW4gMTpucm93KGxpYnN0YXJnZXRzLmRmKSkgewogICAgbGlic3RhcmdldHMuZGZbaSxjKDY6MTMpXTwtYyhkaXN0SGF2ZXJzaW5lKHBpeGwuZGZbMSxjKDEsMildLGxpYnN0YXJnZXRzLmRmW2ksYygyLDMpXSxyPTMzOTMxNjkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0SGF2ZXJzaW5lKHBpeGwuZGZbMixjKDEsMildLGxpYnN0YXJnZXRzLmRmW2ksYygyLDMpXSxyPTMzOTMxNjkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0SGF2ZXJzaW5lKHBpeGwuZGZbMyxjKDEsMildLGxpYnN0YXJnZXRzLmRmW2ksYygyLDMpXSxyPTMzOTMxNjkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0SGF2ZXJzaW5lKHBpeGwuZGZbNCxjKDEsMildLGxpYnN0YXJnZXRzLmRmW2ksYygyLDMpXSxyPTMzOTMxNjkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0SGF2ZXJzaW5lKHBpeGwuZGZbNSxjKDEsMildLGxpYnN0YXJnZXRzLmRmW2ksYygyLDMpXSxyPTMzOTMxNjkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0SGF2ZXJzaW5lKHBpeGwuZGZbNixjKDEsMildLGxpYnN0YXJnZXRzLmRmW2ksYygyLDMpXSxyPTMzOTMxNjkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0SGF2ZXJzaW5lKHBpeGwuZGZbNyxjKDEsMildLGxpYnN0YXJnZXRzLmRmW2ksYygyLDMpXSxyPTMzOTMxNjkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0SGF2ZXJzaW5lKHBpeGwuZGZbOCxjKDEsMildLGxpYnN0YXJnZXRzLmRmW2ksYygyLDMpXSxyPTMzOTMxNjkpKQogICAgCiAgICBsaWJzdGFyZ2V0cy5kZltpLDFdPC13aGljaC5taW4obGlic3RhcmdldHMuZGZbaSxjKDY6MTMpXSkKICAgIGxpYnN0YXJnZXRzLmRmW2ksNV08LW1pbihsaWJzdGFyZ2V0cy5kZltpLGMoNjoxMyldKQp9CmxpYnN0YXJnZXRzLmRmJG5lYXJlc3RwaXhsPC1hcy5mYWN0b3IobGlic3RhcmdldHMuZGYkbmVhcmVzdHBpeGwpCmxldmVscyhsaWJzdGFyZ2V0cy5kZiRuZWFyZXN0cGl4bCk8LShjKCJCZWxsZWdyYWRlIiwiRG91cmJlcyIsIlF1YXJ0aWVyIiwiQWxmYWxmYSIsIlRob3JudG9uR2FwIiwiQmVycnlIb2xsb3ciLCJOb3ZhcnVwdGEiLCJVZ2FuaWtJc2xhbmQiKSkKYGBgCgpCZWxvdyBpcyBhbm90aGVyIGluaXRpYWxpemVyIGZvciB0aGUgUElYTCBhYnJhc2lvbiBkYXRhLiBUaGlzIHNldHMgdGhlIHZhcmlhYmxlcyBmb3IgZWFjaCBQSVhMIGFicmFzaW9uLgpgYGB7cn0KI1NldHMgZWFjaCBuZWFyZXN0IFBJWEwgdmFyaWFibGUgZm9yIGZ1dHVyZSB1c2UgaW4gZGVjaWRpbmcgd2hpY2ggdGFyZ2V0IGlzIGNsb3Nlc3QgdG8gYSBMSUJTIHNhbXBsZQpCZWxsZWdyYWRlPC1saWJzdGFyZ2V0cy5kZltsaWJzdGFyZ2V0cy5kZiRuZWFyZXN0cGl4bD09IkJlbGxlZ3JhZGUiLF0kdGFyZ2V0CkRvdXJiZXM8LWxpYnN0YXJnZXRzLmRmW2xpYnN0YXJnZXRzLmRmJG5lYXJlc3RwaXhsPT0iRG91cmJlcyIsXSR0YXJnZXQKUXVhcnRpZXI8LWxpYnN0YXJnZXRzLmRmW2xpYnN0YXJnZXRzLmRmJG5lYXJlc3RwaXhsPT0iUXVhcnRpZXIiLF0kdGFyZ2V0CkFsZmFsZmE8LWxpYnN0YXJnZXRzLmRmW2xpYnN0YXJnZXRzLmRmJG5lYXJlc3RwaXhsPT0iQWxmYWxmYSIsXSR0YXJnZXQKVGhvcm50b25HYXA8LWxpYnN0YXJnZXRzLmRmW2xpYnN0YXJnZXRzLmRmJG5lYXJlc3RwaXhsPT0iVGhvcm50b25HYXAiLF0kdGFyZ2V0CkJlcnJ5SG9sbG93PC1saWJzdGFyZ2V0cy5kZltsaWJzdGFyZ2V0cy5kZiRuZWFyZXN0cGl4bD09IkJlcnJ5SG9sbG93IixdJHRhcmdldApOb3ZhcnVwdGE8LWxpYnN0YXJnZXRzLmRmW2xpYnN0YXJnZXRzLmRmJG5lYXJlc3RwaXhsPT0iTm92YXJ1cHRhIixdJHRhcmdldApVZ2FuaWtJc2xhbmQ8LWxpYnN0YXJnZXRzLmRmW2xpYnN0YXJnZXRzLmRmJG5lYXJlc3RwaXhsPT0iVWdhbmlrSXNsYW5kIixdJHRhcmdldApgYGAKCk5leHQsIHdlIGZpbHRlciBvdXQgdGhlIExJQlMgdGFyZ2V0cyB0aGF0IGFyZSBub3Qgd2l0aGluIHRoZSBzcGVjaWZpZWQgZGlzdGFuY2UgdmFyaWFibGUuIFRoZW4sIHdlIG1lcmdlIHRoZSBMSUJTIGRhdGEgd2l0aCB0aGUgcmVzcGVjdGl2ZSBQSVhMIGFicmFzaW9uIGJ5IG11dGF0aW5nIGFuZCBhZGRpbmcgYW4gYWJyYXNpb24gY29sdW1uIHRoYXQgaGFzIHRoZSBhYnJhc2lvbiBuYW1lIGNsb3Nlc3QgdG8gZWFjaCBMSUJTIHRhcmdldC4gV2UgYWxzbyBhZGQgYSBjb2x1bW4sIExJQlMgb3IgUElYTCwgd2hpY2ggZGVub3RlcyBpZiB0aGUgcm93IG9mIGRhdGEgaXMgZnJvbSB0aGUgUElYTCBhbmQgTElCUyBkYXRhIHNldHMuIFdlIGFsc28gc2V0IHVwIHRoZSBsaWJzLnRlcm4gbWF0cml4IHdoaWNoIHdpbGwgCmBgYHtyfQppbmNsdWRlZC5saWJzPC0obGlic3RhcmdldHMuZGYlPiUKICBmaWx0ZXIoRGlzdGFuY2U8bWV0ZXJzKSkkdGFyZ2V0CmxpYnMubWF0cml4IDwtbGlicy5kZiAlPiUKICBmaWx0ZXIodGFyZ2V0ICVpbiUgaW5jbHVkZWQubGlicykKI3NldCBMSUJTIG1hdHJpeCBhbmQgdGVybmFyeSBwbG90IGJ5IGFkZGluZyBpbiBjYXRpb24gY29tcG9uZW50cyBhbmQgbXV0YXRpbmcKbGlicy5tYXRyaXggPC0gbGlicy5tYXRyaXhbLGMoNSw3OjE0KV0KbGlicy50ZXJuIDwtIGFzLmRhdGEuZnJhbWUobGlicy5tYXRyaXgpICU+JQogIG11dGF0ZSh4PShTaU8yK0FsMk8zKS8xMDAseT0oRmVPVCtNZ08pLzEwMCx6PShDYU8rTmEyTytLMk8pLzEwMCkgJT4lCiAgc2VsZWN0KC1jKFNpTzIsQWwyTzMsRmVPVCxNZ08sQ2FPLE5hMk8sSzJPLFRpTzIpKQpsaWJzLnRlcm48LWNiaW5kKCJBYnJhc2lvbiI9MCxsaWJzLnRlcm4pCiNTZXQgd2hhdCBhYnJhc2lvbiBnb2VzIHdpdGggdGhlIHJlc3BlY3RpdmUgTElCUyBzYW1wbGUgaXQgbWF0Y2hlcyB3aXRoCmxpYnMudGVybjwtbGlicy50ZXJuJT4lCiAgbXV0YXRlKEFicmFzaW9uID0gaWZlbHNlKHRhcmdldCVpbiVBbGZhbGZhLCJBbGZhbGZhIiwgCiAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHRhcmdldCAlaW4lIEJlbGxlZ3JhZGUsICJCZWxlZ3JhZGUiLAogICAgICAgICAgICAgICAgICAgIGlmZWxzZSh0YXJnZXQgJWluJSBCZXJyeUhvbGxvdywgIkJlcnJ5SG9sbG93IiwKICAgICAgICAgICAgICAgICAgICBpZmVsc2UodGFyZ2V0ICVpbiUgRG91cmJlcywgIkRvdXJiZXMiLAogICAgICAgICAgICAgICAgICAgIGlmZWxzZSh0YXJnZXQgJWluJSBOb3ZhcnVwdGEsICJOb3ZhcnVwdGEiLAogICAgICAgICAgICAgICAgICAgIGlmZWxzZSh0YXJnZXQgJWluJSBRdWFydGllciwgIlF1YXJ0aWVyIiwKICAgICAgICAgICAgICAgICAgICBpZmVsc2UodGFyZ2V0ICVpbiUgVGhvcm50b25HYXAsICJUaG9ybnRvbkdhcCIsCiAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHRhcmdldCAlaW4lIFVnYW5pa0lzbGFuZCwgIlVnYW5pa0lzbGFuZCIsQWJyYXNpb24pKSkpKSkpKSkKI3N1bW1hcnkgb2YgTElCUyBkYXRhIGluY2x1ZGluZyBkaXN0YW5jZSBwYXJhbWV0ZXIsIG51bWJlciBvZiBMSUJTIHRhcmdldHMsIGFuZCBudW1iZXIgb2YgTElCUyBwb2ludHMKa2FibGVkZjwtcmJpbmQoIkRpc3RhbmNlIChtKSI9bWV0ZXJzLCJUYXJnZXRzIj1sZW5ndGgoaW5jbHVkZWQubGlicyksIlBvaW50cyI9bnJvdyhsaWJzLnRlcm4pKQprYWJsZShrYWJsZWRmLCBjYXB0aW9uID0iTElCUyAjIG9mIFRhcmdldHMgYW5kIFBvaW50cyB3aXRoaW4gU3BlY2lmaWVkIERpc3RhbmNlIikKYGBgCgoKCiMjIDUuMiBDb250cmlidXRpb24KClRoaXMgd29yayB3YXMgYWxzbyBhIGNvbWJpbmF0aW9uIG9mIG1lIGFuZCBNYXJnby4gVGhlIGRhdGEgc2V0IGNyZWF0aW9uIHdhcyBib3RoIG9mIHVzIGluIG91ciBicmFpbnN0b3JtaW5nIGFzIHRoaXMgdXRpbGl6ZXMgdGhlIGRhdGEgc2V0IHdlIGNyZWF0ZWQgb2YgbGF0aXR1ZGUgYW5kIGxvbmdpdHVkZSBmb3IgUElYTC4KLSBBZGQgbW9yZSBoZXJlCi0gVmVyeSBzaW1pbGFyIHRvIG90aGVyIHR3byBzZWN0aW9ucyBhZGQgaW4gbGF0ZXIsIE1hcmdvIGFuZCBJIHdvcmtlZCBvbiBtb3N0IG9mIHRoaXMgdG9nZXRoZXIKCiMjIDUuMyBNZXRob2RzIERlc2NyaXB0aW9uIAoKLSBTdGFydGVkIHdpdGggZmlsdGVyaW5nIG9yaWdpbmFsIGRhdGEgdG8gZ2V0IHJpZCBvZiBTQ0NUIHZhbHVlcwotIHRoZW4gc2V0IHVwIHRlcm5hcnkgZGF0YSBmcmFtZSBieSBtdXRhdGluZyBieSBjYXRpb24gY29tcG9zaXRpb25zCi0gdGhlbiBtdXRhdGVkIHRvIG1ha2UgdGhlIFBJWEwgYWJyYXNpb25zIHRoZSBrZXksIHNvIHRoZSBMSUJTIHRhcmdldHMgYXJlIGNvbG9yZWQgYnkgdGhlIGNsb3Nlc3QgUElYTCBhYnJhc2lvbiwgY3JlYXRpbmcgYSBmb3JtIG9mIGNsdXN0ZXJzLgoKIyMgNS40IFJlc3VsdCBhbmQgRGlzY3Vzc2lvbiAKVXNpbmcgYWxsIG9mIHRoZSBtYW5pcHVsYXRpb24gZG9uZSBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSB0ZXJuYXJ5IHBsb3QsIHdlIHRoZW4gcGxvdCB1c2luZyB0aGUgZ2d0ZXJuIGNvbW1hbmQuIFdlIHdpbGwgY29sb3IgYnkgYWJyYXNpb24gdG8gc2VlIHRoZSBkaXN0cmlidXRpb24gb2YgY29tcG9zaXRpb24gYmV0d2VlbiBkaWZmZXJlbnQgYWJyYXNpb25zLiBUaGlzIHNob3VsZCBoZWxwIHVzIGJlIGFibGUgdG8gZHJhdyBkaWZmZXJlbnQgY29uY2x1c2lvbnMgYWJvdXQgaG93IGFicmFzaW9ucyByZWxhdGUgb3IgZG9uJ3QgcmVsYXRlLiBUaGUgbWF4IGRpc3RhbmNlIGJldHdlZW4gdGhlIFBJWEwgdGFyZ2V0IGFuZCBMSUJTIHNhbXBsZSBjYW4gYmUgbW9kaWZpZWQgaG93ZXZlciBkZXNpcmVkLgpgYGB7cn0KZ2d0ZXJuKGxpYnMudGVybiwgZ2d0ZXJuOjphZXMoeD14LHk9eSx6PXopKSArCiAgZ2VvbV9wb2ludChkYXRhPWxpYnMudGVybixhZXMoY29sb3I9QWJyYXNpb24sYWxwaGE9MC41KSkgKyAKICB0aGVtZV9yZ2J3KCkgKyAKICBsYWJzKHRpdGxlPXBhc3RlKCJNYXJzIExJQlMgRGF0YSBXaXRoaW4iLGRpc3RhbmNlLCJtZXRlcnMgb2YgUElYTCIsc2VwPSIgIiksCiAgICAgICB4PSJTaStBbCIsCiAgICAgICB5PSJGZStNZyIsCiAgICAgICB6PSJDYStOYStLIikrdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJyaWdodCIpICsgCiAgZ3VpZGVzKGFscGhhPSJub25lIikKYGBgCgojIyA1LjUgQ29uY2x1c2lvbnMgYW5kIEZ1dHVyZSBXb3JrCkJhc2VkIG9uIHRoaXMgdGVybmFyeSBwbG90LCB3ZSBjYW4gc2VlIEFsZmFsZmEgYW5kIEJlbGVncmFkZSBhcmUgaGlnaGVyIGluIFNpK0FsIGFuZCBVZ2FuaWsgSXNsYW5kIGlzIGFuIG91dGxpZXIuIEFzIHRoaXMgd2FzIHRoZSBsYXN0IHBpZWNlIG9mIHRoZSBQSVhMIGRhdGEgaW4gdGhlIGRhdGEgc2V0IGFuZCBpdCB3YXMgbWlzc2luZyBhIHBhaXIgc2luY2UgZXZlcnkgb3RoZXIgYWJyYXNpb24gd2FzIG1hZGUgdXAgb2YgdHdvIHNhbXBsZXMsIGl0IGlzIGluY2x1ZGVkIGluIGhlcmUgYnV0IHVudGlsIHRoZSBkYXRhIHNldCBpcyB1cGRhdGVkIHRoZXJlIGlzIG5vdCBlbm91Z2ggY29udGV4dCB0byBleHBsYWluIHdoeSBpdCBpcyBzbyB2YXN0bHkgZGlmZmVyZW50LiBJIHdvdWxkIGFzc3VtZSBpdCBpcyBkdWUgdG8gaG93IHRoZSByb2JvdCBpcyB0cmF2ZWxpbmcgYW5kIHRoZSBsb2NhdGlvbiBvZiB0aGUgVWdhbmlrSXNsYW5kIGFicmFzaW9uIGlzIHZlcnkgZGlmZmVyZW50IHRoYW4gdGhlIG90aGVyIDcgYWJyYXNpb25zLgotIEZ1dHVyZSB3b3JrLCB3b3VsZCBpbmNsdWRlIG1vcmUgZGF0YSB0byBnYWluIGJyb2FkZXIgY29udGV4dAoKIyBCaWJsaW9ncmFwaHkKUHJvdmlkZSBhIGxpc3Rpbmcgb2YgcmVmZXJlbmNlcyBhbmQgb3RoZXIgc291cmNlcy4KCiogQW5hbHlzdCdzIE5vdGVib29rCiogTm90IHN1cmUgd2hhdCBlbHNlIGlzIHJlbGV2YW50LCBtb3N0IG9mIHdoYXQgSSB1c2VkIHdhcyBzaW1pbGFyIHRvIEFuYWx5c3QncyBOb3RlYm9vawoKIyBBcHBlbmRpeAoKKkluY2x1ZGUgaGVyZSB3aGF0ZXZlciB5b3UgdGhpbmsgaXMgcmVsZXZhbnQgdG8gc3VwcG9ydCB0aGUgbWFpbiBjb250ZW50IG9mIHlvdXIgbm90ZWJvb2suIEZvciBleGFtcGxlLCB5b3UgbWF5IGhhdmUgb25seSBpbmNsdWRlIGV4YW1wbGUgZmlndXJlcyBhYm92ZSBpbiB5b3VyIG1haW4gdGV4dCBidXQgaW5jbHVkZSBhZGRpdGlvbmFsIG9uZXMgaGVyZS4gT3IgeW91IG1heSBoYXZlIGRvbmUgYSBtb3JlIGV4dGVuc2l2ZSBpbnZlc3RpZ2F0aW9uLCBhbmQgd2FudCB0byBwdXQgbW9yZSByZXN1bHRzIGhlcmUgdG8gZG9jdW1lbnQgeW91ciB3b3JrIGluIHRoZSBzZW1lc3Rlci4gQmUgc3VyZSB0byBkaXZpZGUgYXBwZW5kaXggaW50byBhcHByb3ByaWF0ZSBzZWN0aW9ucyBhbmQgbWFrZSB0aGUgY29udGVudHMgY2xlYXIgdG8gdGhlIHJlYWRlciB1c2luZyBhcHByb2FjaGVzIGRpc2N1c3NlZCBhYm92ZS4gKiAKU2hvdWxkIEkgYWRkIG1vcmUgZXhhbXBsZXMgaGVyZSBvZiBzb2lsIGNvbXBvc2l0aW9uIHBsb3RzIG9mIGRpZmZlcmVudCBhYnJhc2lvbnM/IEkgYWxzbyBjb3VsZCBhZGQgaGVhdCBtYXAgYW5hbHlzaXMgdG8gdGhpcyBub3RlYm9vayBhcyBhIGZpbmRpbmcgYnV0IHdhc24ndCBzdXJlIGlmIGl0IHdhcyByZWFsbHkgcmVsZXZhbnQuCgo=
diff --git a/StudentNotebooks/Assignment07_DraftFinalProjectNotebook/peterc_finalProjectF24_roughdraft.pdf b/StudentNotebooks/Assignment07_DraftFinalProjectNotebook/peterc_finalProjectF24_roughdraft.pdf index 8a91384..32e58be 100644 Binary files a/StudentNotebooks/Assignment07_DraftFinalProjectNotebook/peterc_finalProjectF24_roughdraft.pdf and b/StudentNotebooks/Assignment07_DraftFinalProjectNotebook/peterc_finalProjectF24_roughdraft.pdf differ