A brief introduction to bibliometrix

#install.packages("dplyr")
#install.packages("Matrix")
#install.packages("stringr")
#install.packages("igraph")
#install.packages("bibliometrix", dependencies=TRUE)
library("dplyr")
library("Matrix")
library("stringr")
library("igraph")
library("FactoMineR")
library("factoextra")
library("ggplot2")
library("bibliometrix") ### load bibliometrix package
D <- readFiles("thales.bib")
#D
# base ISI WoK
# M <‐ convert2df(D, dbsource = "isi", format = "bibtex")
# base SCOPUS
M<‐ convert2df(D, dbsource = "scopus", format = "bibtex")
Articles extracted   100 
Articles extracted   151 
#M

The first step is to perform a descriptive analysis of the bibliographic data frame.

results <‐ biblioAnalysis(M, sep = ";")

Functions summary and plot

S=summary(object = results, k = 10, pause = FALSE)


Main Information about data

 Articles                              151 
 Sources (Journals, Books, etc.)       81 
 Keywords Plus (ID)                    774 
 Author's Keywords (DE)                374 
 Period                                1975 - 2017 
 Average citations per article         11.46 

 Authors                               244 
 Author Appearances                    352 
 Authors of single authored articles   21 
 Authors of multi authored articles    223 

 Articles per Author                   0.619 
 Authors per Article                   1.62 
 Co-Authors per Articles               2.33 
 Collaboration Index                   1.78 
 

Annual Scientific Production

 Year    Articles
    1975        2
    1981        1
    1982        1
    1983        3
    1987        1
    1990        3
    1991        1
    1992        3
    1993        1
    1995        3
    1996        1
    1997        5
    1999        5
    2000        3
    2001        1
    2002        1
    2003        2
    2004        1
    2005        3
    2006        4
    2007        6
    2008       14
    2009        9
    2010        7
    2011        9
    2012       14
    2013        6
    2014        8
    2015       12
    2016       19
    2017        2

Annual Percentage Growth Rate 0 


Most Productive Authors

   Authors        Articles Authors        Articles Fractionalized
1   NIAKI,STA            8  NIAKI,STA                        4.00
2   ASLAM,M              7  KAYA,I                           3.08
3   JUN,C-H              7  GADRE,MP                         2.67
4   GADRE,MP             6  RATTIHALLI,RN                    2.67
5   RATTIHALLI,RN        6  ABBASI,B                         2.50
6   ABBASI,B             5  SCHWERTMAN,NC                    2.50
7   KAHRAMAN,C           5  TESTIK,MC                        2.50
8   KAYA,I               5  ASLAM,M                          2.42
9   WU,Z                 5  JUN,C-H                          2.42
10  CASTAGLIOLA,P        4  WU,Z                             1.75


Top manuscripts per citations

                                                           Paper           TC
1  CALVIN TW,(1983),IEEE TRANS. COMP., HYBRIDS, MANUFACT. TECHNOL.        116
2  MARIONJR RR ;STOUMBOS ZG,(1999),J QUAL TECHNOL                         101
3  WANG J-H ;RAZ T,(1990),INT J PROD RES                                   87
4  CHIU WK,(1975),TECHNOMETRICS                                            79
5  KANAGAWA A ;TAMAKI F ;OHTA H,(1993),INT J PROD RES                      78
6  LAGASSE RS ;STEINBERG ES ;KATZ RI ;SAUBERMANN AJ,(1995),ANESTHESIOLOGY  67
7  RYAN TP ;SCHWERTMAN NC,(1997),J QUAL TECHNOL                            61
8  CALABRESE JOELM,(1995),MANAGE SCI                                       48
9  TOPALIDOU E ;PSARAKIS S,(2009),QUAL RELIAB ENG INT                      42
10 KAYA I,(2009),INF SCI                                                   34
   TCperYear
1       3.41
2       5.61
3       3.22
4       1.88
5       3.25
6       3.05
7       3.05
8       2.18
9       5.25
10      4.25


Most Productive Countries

      Country   Articles   Freq
1  USA                30 0.2069
2  IRAN               20 0.1379
3  TAIWAN             13 0.0897
4  TURKEY             11 0.0759
5  INDIA               9 0.0621
6  CHINA               8 0.0552
7  FRANCE              6 0.0414
8  SINGAPORE           6 0.0414
9  SAUDI ARABIA        5 0.0345
10 BRAZIL              4 0.0276


Total Citations per Country

     Country      Total Citations Average Article Citations
1  USA                        693                     23.10
2  IRAN                       174                      8.70
3  TURKEY                     157                     14.27
4  JAPAN                      104                     52.00
5  CHINA                       97                     12.12
6  SINGAPORE                   81                     13.50
7  TAIWAN                      70                      5.38
8  INDIA                       55                      6.11
9  CANADA                      49                     12.25
10 GREECE                      49                     24.50


Most Relevant Sources

                                               Sources        Articles
1  QUALITY AND RELIABILITY ENGINEERING INTERNATIONAL                17
2  COMMUNICATIONS IN STATISTICS - THEORY AND METHODS                 8
3  JOURNAL OF QUALITY TECHNOLOGY                                     8
4  INTERNATIONAL JOURNAL OF PRODUCTION RESEARCH                      7
5  JOURNAL OF APPLIED STATISTICS                                     7
6  QUALITY ENGINEERING                                               7
7  COMPUTERS AND INDUSTRIAL ENGINEERING                              4
8  INTERNATIONAL JOURNAL OF ADVANCED MANUFACTURING TECHNOLOGY        4
9  EXPERT SYSTEMS WITH APPLICATIONS                                  3
10 IIE TRANSACTIONS (INSTITUTE OF INDUSTRIAL ENGINEERS)              3


Most Relevant Keywords

     Author Keywords (DE)      Articles   Keywords-Plus (ID)     Articles
1  ATTRIBUTE CONTROL CHART           25 CONTROL CHARTS                 51
2  STATISTICAL PROCESS CONTROL       24 FLOWCHARTING                   45
3  ATTRIBUTE CONTROL CHARTS          21 ATTRIBUTE CONTROL CHARTS       25
4  AVERAGE RUN LENGTH                19 GRAPHIC METHODS                22
5  CONTROL CHART                     10 AVERAGE RUN LENGTHS            18
6  MARKOV CHAIN                       9 QUALITY CONTROL                17
7  SPC                                9 MARKOV PROCESSES               13
8  ATTRIBUTES CONTROL CHART           7 IN-CONTROL                     11
9  ATTRIBUTES CONTROL CHARTS          7 CONTROL LIMITS                 10
10 PROCESS CONTROL                    7 PARAMETER ESTIMATION           10

Some basic plots can be drawn using the generic function :

plot(x = results, k = 10, pause = FALSE)

Analysis of Cited References

To obtain the most frequent cited manuscripts:

#M$CR[1]
CR <‐ citations(M,field="article", sep = ";")
CR$Cited[1:10]
CR
                                                      PATEL, HI, QUALITY CONTROL METHODS FOR MULTIVARIATE BINOMIAL AND POISSON DISTRIBUTIONS (1973) TECHNOMETRICS, 15, PP 103-112 
                                                                                                                                                                               11 
                                                                                                MARCUCCI, M, MONITORING MULTINOMIAL PROCESSES (1985) J QUAL TECHNOL, 17, PP 86-91 
                                                                                                                                                                                7 
                                                    RYAN, TP, SCHWERTMAN, NC, OPTIMAL LIMITS FOR ATTRIBUTES CONTROL CHARTS (1997) JOURNAL OF QUALITY TECHNOLOGY, 29 (1), PP 86-98 
                                                                                                                                                                                7 
                                            WOODALL, WH, CONTROL CHARTS BASED ON ATTRIBUTE DATA: BIBLIOGRAPHY AND REVIEW (1997) JOURNAL OF QUALITY TECHNOLOGY, 29 (2), PP 172-183 
                                                                                                                                                                                7 
                BOURKE, PD, DETECTING A SHIFT IN FRACTION NONCONFORMING USING RUN-LENGTH CONTROL CHARTS WITH 100% INSPECTION (1991) JOURNAL OF QUALITY TECHNOLOGY, 23, PP 225-238 
                                                                                                                                                                                6 
          TOPALIDOU, E, PSARAKIS, S, REVIEW OF MULTINOMIAL AND MULTIATTRIBUTE QUALITY CONTROL CHARTS (2009) QUALITY AND RELIABILITY ENGINEERING INTERNATIONAL, 25 (7), PP 773-804 
                                                                                                                                                                                6 
                                                          BORROR, CM, CHAMP, CW, RIGDON, SE, POISSON EWMA CONTROL CHARTS (1998) JOURNAL OF QUALITY TECHNOLOGY, 30 (4), PP 352-361 
                                                                                                                                                                                5 
BERSIMIS, S, PSARAKIS, S, PANARETOS, J, MULTIVARIATE STATISTICAL PROCESS CONTROL CHARTS: AN OVERVIEW (2007) QUALITY AND RELIABILITY ENGINEERING INTERNATIONAL, 23 (5), PP 517-543 
                                                                                                                                                                                4 
                                                           BOURKE, PD, SAMPLE SIZE AND THE BINOMIAL CUSUM CONTROL CHART: THE CASE OF 100% INSPECTION (2001) METRIKA, 53, PP 51-70 
                                                                                                                                                                                4 
                                                       BROOK, D, EVANS, DA, AN APPROACH TO THE PROBABILITY DISTRIBUTION OF CUSUM RUN LENGTH (1972) BIOMETRIKA, 59 (3), PP 539-549 
                                                                                                                                                                                4 

To obtain the most frequent cited first authors:

CR <‐ citations(M, field = "author", sep = ";")
CR$Cited[1:10]
CR
MONTGOMERY, DC         XIE, M    WOODALL, WH        GOH, TN          WU, Z 
           138            111             98             90             81 
    NIAKI, STA      ABBASI, B      CHAMP, CW    KAHRAMAN, C      LUCAS, JM 
            79             64             53             51             41 

To obtain the most frequent local cited authors:

CR <‐ localCitations(M, results, sep = ";")
CR[1:10]
CR
        XIE,M          WU,Z      ABBASI,B    KAHRAMAN,C       ASLAM,M 
          111            81            64            51            36 
CASTAGLIOLA,P       GLBAY,M    PSARAKIS,S         RAZ,T CHAKRABORTI,S 
           36            33            27            26            25 

The function dominance calculates the authors’ dominance ranking as proposed by Kumar & Kumar, 2008. Function arguments are: results (object of class bibliometrix) obtained by biblioAnalysis; and k (the number of authors to consider in the analysis).

The Dominance Factor is a ratio indicating the fraction of multi authored articles in which a scholar appears as first author.

DF <‐ dominance(results, k = 10)
DF

Authors’ hindex

The index is based on the set of the scientist’s most cited papers and the number of citations that they have received in other publications.

indices <‐ Hindex(M, authors=c("CASTAGLIOLA P"), sep = ";")
# Bornmann's impact indices:
indices$H
indices$CitationList
[[1]]
NA

To calculate the hindex of the first 15 most productive authors (in this collection):

authors=gsub(","," ",names(results$Authors)[1:15])
indices <‐ Hindex(M, authors, sep = ";")
indices$H

Lotka’s Law coefficient estimation

The function lotka estimates Lotka’s law coefficients for scientific productivity (Lotka A.J., 1926). Lotka’s law describes the frequency of publication by authors in any given field as an inverse square law, where the number of authors publishing a certain number of articles is a fixed ratio to the number of authors publishing a single article. This assumption implies that the theoretical beta coefficient of Lotka’s law is equal to 2. Using lotka function is possible to estimate the Beta coefficient of our bibliographic collection and assess,through a statistical test, the similarity of this empirical distribution with the theoretical one.

L <‐ lotka(results)
# Author Productivity. Empirical Distribution
L$AuthorProd
# Beta coefficient estimate
L$Beta
[1] 2.414755
# Constant
L$C
[1] 0.673307
# Goodness of fit
L$R2
[1] 0.983198
# P‐value of K‐S two sample test
L$p.value
[1] 0.6271671

You can compare the two distributions using plot function:

# Observed distribution
Observed=L$AuthorProd[,3]
# Theoretical distribution with Beta = 2
Theoretical=10^(log10(L$C)‐2*log10(L$AuthorProd[,1]))
plot(L$AuthorProd[,1],Theoretical,type="l",col="red",ylim=c(0, 1), xlab="Articles",ylab="Freq. of
Authors",main="Scientific Productivity")
lines(L$AuthorProd[,1],Observed,col="blue")
legend(x="topright",c("Theoretical (B=2)","Observed"),col=c("red","blue"),lty =
c(1,1,1),cex=0.6,bty="n")

**___**

Bibliometric network matrices

Manuscript’s attributes are connected to each other through the manuscript itself: author(s) to journal, keywords to publication date, etc. These connections of different attributes generate bipartite networks that can be represented as rectangular matrices (Manuscripts x Attributes). Furthermore, scientific publications regularly contain references to other scientific works. This generates a further network, namely, cocitation or coupling network. These networks are analysed in order to capture meaningful properties of the underlying research system, and in particular to determine the influence of bibliometric units such as scholars and journals.

Bipartite networks

cocMatrix is a general function to compute a bipartite network selecting one of the metadata attributes. For example, to create a network Manuscript x Publication Source you have to use the field tag “SO”:

For a complete list of field tags see https://images.webofknowledge.com/WOKRS410B4/help/WOS/h_fieldtags.html

A <‐ cocMatrix(M, Field = "SO", sep = ";")

A is a rectangular binary matrix, representing a bipartite network where rows and columns are manuscripts and sources respectively. The generic element is 1 if the manuscript has been published in source , 0 otherwise. The column sum is the number of manuscripts published in source. Sorting, in decreasing order, the column sums of A, you can see the most relevant publication sources:

sort(Matrix::colSums(A), decreasing = TRUE)[1:15]
                   QUALITY AND RELIABILITY ENGINEERING INTERNATIONAL 
                                                                  17 
                   COMMUNICATIONS IN STATISTICS - THEORY AND METHODS 
                                                                   8 
                                       JOURNAL OF QUALITY TECHNOLOGY 
                                                                   8 
                                       JOURNAL OF APPLIED STATISTICS 
                                                                   7 
                        INTERNATIONAL JOURNAL OF PRODUCTION RESEARCH 
                                                                   7 
                                                 QUALITY ENGINEERING 
                                                                   7 
          INTERNATIONAL JOURNAL OF ADVANCED MANUFACTURING TECHNOLOGY 
                                                                   4 
                                COMPUTERS AND INDUSTRIAL ENGINEERING 
                                                                   4 
                             STUDIES IN FUZZINESS AND SOFT COMPUTING 
                                                                   3 
INTERNATIONAL JOURNAL OF RELIABILITY, QUALITY AND SAFETY ENGINEERING 
                                                                   3 
                IIE TRANSACTIONS (INSTITUTE OF INDUSTRIAL ENGINEERS) 
                                                                   3 
                                    EXPERT SYSTEMS WITH APPLICATIONS 
                                                                   3 
                       INTERNATIONAL JOURNAL OF PRODUCTION ECONOMICS 
                                                                   2 
                   JOURNAL OF STATISTICAL COMPUTATION AND SIMULATION 
                                                                   2 
                                                 SEQUENTIAL ANALYSIS 
                                                                   2 

Following this approach, you can compute several bipartite networks: Citation network

A <‐ cocMatrix(M, Field = "CR", sep = ". ")
sort(Matrix::colSums(A), decreasing = TRUE)[1:15]
  INTRODUCTIO TECHNOMETRICS  INTERNATIONA   DISTRIBUTIO INTERNATIONAL 
           82            71            69            64            51 
 DISTRIBUTION   ENGINEERING  TRANSACTIONS   MULTIVARIAT  EXPONENTIALL 
           51            48            47            46            40 
 MANUFACTURIN   APPLICATION  NONCONFORMIN COMMUNICATION   TRANSACTION 
           37            35            33            31            30 

Author network

A <‐ cocMatrix(M, Field = "AU", sep = ";")
sort(Matrix::colSums(A), decreasing = TRUE)[1:15]
    NIAKI STA        ASLAM M         JUN C-H      GADRE MP   RATTIHALLI RN 
             8              7              6              6              6 
      ABBASI B CASTAGLIOLA P       TESTIK MC   DOKOUHAKI P           WU Z  
             5              4              4              4              4 
   KAHRAMAN C        GLBAY M        KOOLI I         LIMAM M        WEI CH  
             3              3              3              3              3 

Country network Authors’ Countries is not a standard attribute of the bibliographic data frame. You need to extract this information from affiliation attribute using the function metaTagExtraction.

M <‐ metaTagExtraction(M, Field = "AU_CO", sep = ";")
A <‐ cocMatrix(M, Field = "AU_CO", sep = ";")
sort(Matrix::colSums(A), decreasing = TRUE)[1:15]
UNITED STATES          IRAN        TAIWAN        TURKEY         CHINA 
           37            21            14            14            11 
        INDIA         KOREA        BRAZIL        FRANCE     SINGAPORE 
           10             7             6             6             6 
 SAUDI ARABIA        CANADA         SPAIN     HONG KONG      PAKISTAN 
            5             5             4             4             4 

metaTagExtraction allows to extract the following additional field tags: Authors’ countries (Field = “AU_CO”); First author of each cited reference (Field = “CR_AU”); Publication source of each cited reference (Field = “CR_SO”); and Authors’ affiliations (Field = “AU_UN”).

Author keyword network

A <‐ cocMatrix(M, Field = "DE", sep = ";")
sort(Matrix::colSums(A), decreasing = TRUE)[1:15]
      ATTRIBUTE CONTROL CHART   STATISTICAL PROCESS CONTROL 
                           25                            24 
     ATTRIBUTE CONTROL CHARTS            AVERAGE RUN LENGTH 
                           21                            19 
                CONTROL CHART                  MARKOV CHAIN 
                           10                             9 
                          SPC     ATTRIBUTES CONTROL CHARTS 
                            9                             7 
     ATTRIBUTES CONTROL CHART               PROCESS CONTROL 
                            7                             7 
                          ARL          POISSON DISTRIBUTION 
                            6                             6 
MULTI-ATTRIBUTE CONTROL CHART            GENETIC ALGORITHMS 
                            6                             5 
       AVERAGE TIME TO SIGNAL 
                            5 

Keyword Plus network

A <‐ cocMatrix(M, Field = "ID", sep = ";")
sort(Matrix::colSums(A), decreasing = TRUE)[1:15]
          CONTROL CHARTS             FLOWCHARTING ATTRIBUTE CONTROL CHARTS 
                      50                       45                       25 
         GRAPHIC METHODS      AVERAGE RUN LENGTHS          QUALITY CONTROL 
                      22                       18                       17 
        MARKOV PROCESSES               IN-CONTROL     PARAMETER ESTIMATION 
                      13                       11                       10 
          CONTROL LIMITS              PROBABILITY             SAMPLE SIZES 
                      10                        9                        8 
    POISSON DISTRIBUTION   QUALITY CHARACTERISTIC       PROCESS MONITORING 
                       8                        8                        7 

Bibliographic coupling Two articles are said to be bibliographically coupled if at least one cited source appears in the bibliographies or reference lists of both articles (Kessler, 1963). A coupling network can be obtained using the general formulation: \(B=A.A^T\). Where A is a bipartite network.

The function biblioNetwork calculates, starting from a bibliographic data frame, the most frequently used coupling networks: Authors, Sources, and Countries.

biblioNetwork uses two arguments to define the network to compute:

  1. analysis argument can be “cocitation”, “coupling”, “collaboration”, or “cooccurrences”.
  2. network argument can be “authors”, “references”, “sources”, “countries”, “universities”, “keywords”, “author_keywords”, “titles” and “abstracts”.
NetMatrix <‐ biblioNetwork(M, analysis = "coupling", network = "references", sep = ". ")

Articles with only a few references, therefore, would tend to be more weakly bibliographically coupled, if coupling strength is measured simply according to the number of references that articles contain in common. This suggests that it might be more practicable to switch to a relative measure of bibliographic coupling. couplingSimilarity function calculates Jaccard or Salton similarity coefficient among vertices of a coupling network.

NetMatrix <‐ biblioNetwork(M, analysis = "coupling", network = "authors", sep = ";")
# plot authors' similarity (first 20 authors)
net=networkPlot(NetMatrix, n = 20, Title = "Authors' Coupling", type = "fruchterman", size=FALSE, remove.multiple=TRUE, vos.path="c:/Users/DE/Desktop/bibliometRics/VOSviewer")

# calculate jaccard similarity coefficient
S <‐ couplingSimilarity(NetMatrix, type="jaccard")
# plot authors' similarity (first 20 authors)
net=networkPlot(S, n = 20, Title = "Authors' Coupling", remove.multiple=TRUE, vos.path="c:/Users/DE/Desktop/bibliometRics/VOSviewer")

Bibliographic cocitation We talk about cocitation of two articles when both are cited in a third article. Thus, cocitation can be seen as the counterpart of bibliographic coupling. A cocitation network can be obtained using the general formulation: \(C=A^t.A\). where A is a bipartite network.

NetMatrix <‐ biblioNetwork(M, analysis = "co‐citation", network = "references", sep = ". ")
net=networkPlot(NetMatrix, n = 20, Title = "Bibliographic cocitation", type = "fruchterman", size=FALSE, remove.multiple=TRUE, vos.path="c:/Users/DE/Desktop/bibliometRics/VOSviewer")

Bibliographic collaboration Scientific collaboration network is a network where nodes are authors and links are coauthorships as the latter is one of the most well documented forms of scientific collaboration (Glanzel, 2004). An author collaboration network can be obtained using the general formulation: \(AC=A^t.A\). where A is a bipartite network Manuscripts x Authors.

NetMatrix <‐ biblioNetwork(M, analysis = "collaboration", network = "authors", sep = ";")
net=networkPlot(NetMatrix, n = 20, Title = "Bibliographic collaboration", type = "fruchterman", size=FALSE, remove.multiple=TRUE, vos.path="c:/Users/DE/Desktop/bibliometRics/VOSviewer")

Visualizing bibliographic networks

Country Scientific Collaboration

# Create a country collaboration network
M <‐ metaTagExtraction(M, Field = "AU_CO", sep = ";")
NetMatrix <‐ biblioNetwork(M, analysis = "collaboration", network = "countries", sep = ";")
# Plot the network
net=networkPlot(NetMatrix, n = 20, Title = "Country Collaboration", type = "circle", size=TRUE,remove.multiple=FALSE)

net=networkPlot(NetMatrix, n = 20, Title = "Country Collaboration", type = "fruchterman", size=FALSE, remove.multiple=TRUE, vos.path="c:/Users/DE/Desktop/bibliometRics/VOSviewer")

CoCitation Network

# Create a co‐citation network
NetMatrix <‐ biblioNetwork(M, analysis = "co‐citation", network = "references", sep = ". ")
# Plot the network
net=networkPlot(NetMatrix, n = 5, Title = "Co‐Citation Network", type = "fruchterman", size=T, remove.multiple=FALSE)

Keyword cooccurrences

# Create keyword co‐occurrencies network
NetMatrix <‐ biblioNetwork(M, analysis = "co‐occurrences", network = "keywords", sep = ";")
# Plot the network
net=networkPlot(NetMatrix, n = 20, Title = "Keyword Co‐occurrences", type = "kamada", size=T)

CoWord Analysis: Conceptual structure of a field The aim of the coword analysis is to map the conceptual structure of a framework using the word cooccurrences in a bibliographic collection. The analysis can be performed through dimensionality reduction techniques such as Multidimensional Scaling (MDS) or Multiple Correspondence Analysis (MCA). Here, we show an example using the function conceptualStructure that performs a MCA to draw a conceptual structure of the field and Kmeans clustering to identify clusters of documents which express common concepts. Results are plotted on a twodimensional map. conceptualStructure includes natural language processing (NLP) routines (see the function termExtraction) to extract terms from titles and abstracts. In addition, it implements the Porter’s stemming algorithm to reduce inflected (or sometimes derived) words to their word stem, base or root form.

# Conceptual Structure using keywords
CS <- conceptualStructure(M,field="ID", minDegree=4, k.max=5, stemming=FALSE)

Historical Co-Citation Network Historiographic map is a graph proposed by E. Garfield to represent a chronological network map of most relevant co-citations resulting from a bibliographic collection. The function generates a chronological co-citation network matrix which can be plotted using histPlot:

# Create a historical co-citation network
?histNetwork
histResults <- histNetwork(M, n = 10, sep = ";")
Error in regexpr(df$Year[i], df$Paper[i]) : invalid 'pattern' argument
LS0tDQp0aXRsZTogIlIgQmlibGlvbWV0UmljcyAtIFByb2YgRHIuIFJvYmVydG8gQ2FtcG9zIExlb25pICAtIFBlc3F1aXNhIFRIQUxFUyBNQUNIQURPIC0gVU5FU1AiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQojIyMgQSBicmllZiBpbnRyb2R1Y3Rpb24gdG8gYmlibGlvbWV0cml4DQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0V9DQojaW5zdGFsbC5wYWNrYWdlcygiZHBseXIiKQ0KI2luc3RhbGwucGFja2FnZXMoIk1hdHJpeCIpDQojaW5zdGFsbC5wYWNrYWdlcygic3RyaW5nciIpDQojaW5zdGFsbC5wYWNrYWdlcygiaWdyYXBoIikNCiNpbnN0YWxsLnBhY2thZ2VzKCJiaWJsaW9tZXRyaXgiLCBkZXBlbmRlbmNpZXM9VFJVRSkNCmxpYnJhcnkoImRwbHlyIikNCmxpYnJhcnkoIk1hdHJpeCIpDQpsaWJyYXJ5KCJzdHJpbmdyIikNCmxpYnJhcnkoImlncmFwaCIpDQpsaWJyYXJ5KCJGYWN0b01pbmVSIikNCmxpYnJhcnkoImZhY3RvZXh0cmEiKQ0KbGlicmFyeSgiZ2dwbG90MiIpDQpsaWJyYXJ5KCJiaWJsaW9tZXRyaXgiKSAjIyMgbG9hZCBiaWJsaW9tZXRyaXggcGFja2FnZQ0KYGBgDQoNCmBgYHtyfQ0KRCA8LSByZWFkRmlsZXMoInRoYWxlcy5iaWIiKQ0KI0QNCiMgYmFzZSBJU0kgV29LDQojIE0gPOKAkCBjb252ZXJ0MmRmKEQsIGRic291cmNlID0gImlzaSIsIGZvcm1hdCA9ICJiaWJ0ZXgiKQ0KDQojIGJhc2UgU0NPUFVTDQpNPOKAkCBjb252ZXJ0MmRmKEQsIGRic291cmNlID0gInNjb3B1cyIsIGZvcm1hdCA9ICJiaWJ0ZXgiKQ0KI00NCmBgYA0KDQoNCiMjIyBUaGUgZmlyc3Qgc3RlcCBpcyB0byBwZXJmb3JtIGEgZGVzY3JpcHRpdmUgYW5hbHlzaXMgb2YgdGhlIGJpYmxpb2dyYXBoaWMgZGF0YSBmcmFtZS4NCg0KYGBge3J9DQpyZXN1bHRzIDzigJAgYmlibGlvQW5hbHlzaXMoTSwgc2VwID0gIjsiKQ0KYGBgDQoNCiMjIyBGdW5jdGlvbnMgc3VtbWFyeSBhbmQgcGxvdA0KDQpgYGB7cn0NClM9c3VtbWFyeShvYmplY3QgPSByZXN1bHRzLCBrID0gMTAsIHBhdXNlID0gRkFMU0UpDQpgYGANCg0KIyMjIFNvbWUgYmFzaWMgcGxvdHMgY2FuIGJlIGRyYXduIHVzaW5nIHRoZSBnZW5lcmljIGZ1bmN0aW9uIDoNCg0KYGBge3J9DQpwbG90KHggPSByZXN1bHRzLCBrID0gMTAsIHBhdXNlID0gRkFMU0UpDQpgYGANCg0KIyMjIEFuYWx5c2lzIG9mIENpdGVkIFJlZmVyZW5jZXMNCiMjIyBUbyBvYnRhaW4gdGhlIG1vc3QgZnJlcXVlbnQgY2l0ZWQgbWFudXNjcmlwdHM6DQpgYGB7cn0NCiNNJENSWzFdDQpDUiA84oCQIGNpdGF0aW9ucyhNLGZpZWxkPSJhcnRpY2xlIiwgc2VwID0gIjsiKQ0KQ1IkQ2l0ZWRbMToxMF0NCmBgYA0KDQojIyMgVG8gb2J0YWluIHRoZSBtb3N0IGZyZXF1ZW50IGNpdGVkIGZpcnN0IGF1dGhvcnM6DQoNCmBgYHtyfQ0KQ1IgPOKAkCBjaXRhdGlvbnMoTSwgZmllbGQgPSAiYXV0aG9yIiwgc2VwID0gIjsiKQ0KQ1IkQ2l0ZWRbMToxMF0NCmBgYA0KDQojIyMgVG8gb2J0YWluIHRoZSBtb3N0IGZyZXF1ZW50IGxvY2FsIGNpdGVkIGF1dGhvcnM6DQoNCmBgYHtyfQ0KQ1IgPOKAkCBsb2NhbENpdGF0aW9ucyhNLCByZXN1bHRzLCBzZXAgPSAiOyIpDQpDUlsxOjEwXQ0KYGBgDQoNCiMjIyBUaGUgZnVuY3Rpb24gZG9taW5hbmNlIGNhbGN1bGF0ZXMgdGhlIGF1dGhvcnPigJkgZG9taW5hbmNlIHJhbmtpbmcgYXMgcHJvcG9zZWQgYnkgS3VtYXIgJiBLdW1hciwgMjAwOC4gRnVuY3Rpb24gYXJndW1lbnRzIGFyZTogcmVzdWx0cyAob2JqZWN0IG9mIGNsYXNzIGJpYmxpb21ldHJpeCkgb2J0YWluZWQgYnkgYmlibGlvQW5hbHlzaXM7IGFuZCBrICh0aGUgbnVtYmVyIG9mIGF1dGhvcnMgdG8gY29uc2lkZXIgaW4gdGhlIGFuYWx5c2lzKS4NCg0KPiBUaGUgRG9taW5hbmNlIEZhY3RvciBpcyBhIHJhdGlvIGluZGljYXRpbmcgdGhlIGZyYWN0aW9uIG9mIG11bHRpIGF1dGhvcmVkIGFydGljbGVzIGluIHdoaWNoIGEgc2Nob2xhciBhcHBlYXJzIGFzIGZpcnN0IGF1dGhvci4gDQoNCmBgYHtyfQ0KREYgPOKAkCBkb21pbmFuY2UocmVzdWx0cywgayA9IDEwKQ0KREYNCmBgYA0KDQojIyMgQXV0aG9yc+KAmSBoaW5kZXgNCj4gVGhlIGluZGV4IGlzIGJhc2VkIG9uIHRoZSBzZXQgb2YgdGhlIHNjaWVudGlzdOKAmXMgbW9zdCBjaXRlZCBwYXBlcnMgYW5kIHRoZSBudW1iZXIgb2YgY2l0YXRpb25zIHRoYXQgdGhleSBoYXZlIHJlY2VpdmVkIGluIG90aGVyIHB1YmxpY2F0aW9ucy4gDQoNCmBgYHtyfQ0KaW5kaWNlcyA84oCQIEhpbmRleChNLCBhdXRob3JzPWMoIkNBU1RBR0xJT0xBIFAiKSwgc2VwID0gIjsiKQ0KDQojIEJvcm5tYW5uJ3MgaW1wYWN0IGluZGljZXM6DQppbmRpY2VzJEgNCmluZGljZXMkQ2l0YXRpb25MaXN0DQpgYGANCg0KIyMjIFRvIGNhbGN1bGF0ZSB0aGUgaGluZGV4IG9mIHRoZSBmaXJzdCAxNSBtb3N0IHByb2R1Y3RpdmUgYXV0aG9ycyAoaW4gdGhpcyBjb2xsZWN0aW9uKToNCg0KYGBge3J9DQphdXRob3JzPWdzdWIoIiwiLCIgIixuYW1lcyhyZXN1bHRzJEF1dGhvcnMpWzE6MTVdKQ0KaW5kaWNlcyA84oCQIEhpbmRleChNLCBhdXRob3JzLCBzZXAgPSAiOyIpDQppbmRpY2VzJEgNCmBgYA0KDQoNCiMjIyBMb3RrYeKAmXMgTGF3IGNvZWZmaWNpZW50IGVzdGltYXRpb24NCj4gVGhlIGZ1bmN0aW9uIGxvdGthIGVzdGltYXRlcyBMb3RrYeKAmXMgbGF3IGNvZWZmaWNpZW50cyBmb3Igc2NpZW50aWZpYyBwcm9kdWN0aXZpdHkgKExvdGthIEEuSi4sIDE5MjYpLiBMb3RrYeKAmXMgbGF3IGRlc2NyaWJlcyB0aGUgZnJlcXVlbmN5IG9mIHB1YmxpY2F0aW9uIGJ5IGF1dGhvcnMgaW4gYW55IGdpdmVuIGZpZWxkIGFzIGFuIGludmVyc2Ugc3F1YXJlIGxhdywgd2hlcmUgdGhlIG51bWJlciBvZiBhdXRob3JzIHB1Ymxpc2hpbmcgYSBjZXJ0YWluIG51bWJlciBvZiBhcnRpY2xlcyBpcyBhIGZpeGVkIHJhdGlvIHRvIHRoZSBudW1iZXIgb2YgYXV0aG9ycyBwdWJsaXNoaW5nIGEgc2luZ2xlIGFydGljbGUuIFRoaXMgYXNzdW1wdGlvbiBpbXBsaWVzIHRoYXQgdGhlIHRoZW9yZXRpY2FsIGJldGEgY29lZmZpY2llbnQgb2YgTG90a2HigJlzIGxhdyBpcyBlcXVhbCB0byAyLiBVc2luZyBsb3RrYSBmdW5jdGlvbiBpcyBwb3NzaWJsZSB0byBlc3RpbWF0ZSB0aGUgQmV0YSBjb2VmZmljaWVudCBvZiBvdXIgYmlibGlvZ3JhcGhpYyBjb2xsZWN0aW9uIGFuZCBhc3Nlc3MsdGhyb3VnaCBhIHN0YXRpc3RpY2FsIHRlc3QsIHRoZSBzaW1pbGFyaXR5IG9mIHRoaXMgZW1waXJpY2FsIGRpc3RyaWJ1dGlvbiB3aXRoIHRoZSB0aGVvcmV0aWNhbCBvbmUuDQoNCg0KYGBge3J9DQpMIDzigJAgbG90a2EocmVzdWx0cykNCiMgQXV0aG9yIFByb2R1Y3Rpdml0eS4gRW1waXJpY2FsIERpc3RyaWJ1dGlvbg0KTCRBdXRob3JQcm9kDQojIEJldGEgY29lZmZpY2llbnQgZXN0aW1hdGUNCkwkQmV0YQ0KIyBDb25zdGFudA0KTCRDDQojIEdvb2RuZXNzIG9mIGZpdA0KTCRSMg0KIyBQ4oCQdmFsdWUgb2YgS+KAkFMgdHdvIHNhbXBsZSB0ZXN0DQpMJHAudmFsdWUNCmBgYA0KDQojIyMgWW91IGNhbiBjb21wYXJlIHRoZSB0d28gZGlzdHJpYnV0aW9ucyB1c2luZyBwbG90IGZ1bmN0aW9uOg0KDQpgYGB7cn0NCiMgT2JzZXJ2ZWQgZGlzdHJpYnV0aW9uDQpPYnNlcnZlZD1MJEF1dGhvclByb2RbLDNdDQojIFRoZW9yZXRpY2FsIGRpc3RyaWJ1dGlvbiB3aXRoIEJldGEgPSAyDQpUaGVvcmV0aWNhbD0xMF4obG9nMTAoTCRDKeKAkDIqbG9nMTAoTCRBdXRob3JQcm9kWywxXSkpDQpwbG90KEwkQXV0aG9yUHJvZFssMV0sVGhlb3JldGljYWwsdHlwZT0ibCIsY29sPSJyZWQiLHlsaW09YygwLCAxKSwgeGxhYj0iQXJ0aWNsZXMiLHlsYWI9IkZyZXEuIG9mDQpBdXRob3JzIixtYWluPSJTY2llbnRpZmljIFByb2R1Y3Rpdml0eSIpDQpsaW5lcyhMJEF1dGhvclByb2RbLDFdLE9ic2VydmVkLGNvbD0iYmx1ZSIpDQpsZWdlbmQoeD0idG9wcmlnaHQiLGMoIlRoZW9yZXRpY2FsIChCPTIpIiwiT2JzZXJ2ZWQiKSxjb2w9YygicmVkIiwiYmx1ZSIpLGx0eSA9DQpjKDEsMSwxKSxjZXg9MC42LGJ0eT0ibiIpDQpgYGANCg0KDQoqKl9fXyoqDQoNCiMjIyBCaWJsaW9tZXRyaWMgbmV0d29yayBtYXRyaWNlcw0KPiBNYW51c2NyaXB04oCZcyBhdHRyaWJ1dGVzIGFyZSBjb25uZWN0ZWQgdG8gZWFjaCBvdGhlciB0aHJvdWdoIHRoZSBtYW51c2NyaXB0IGl0c2VsZjogYXV0aG9yKHMpIHRvIGpvdXJuYWwsIGtleXdvcmRzIHRvIHB1YmxpY2F0aW9uIGRhdGUsIGV0Yy4gVGhlc2UgY29ubmVjdGlvbnMgb2YgZGlmZmVyZW50IGF0dHJpYnV0ZXMgZ2VuZXJhdGUgYmlwYXJ0aXRlIG5ldHdvcmtzIHRoYXQgY2FuIGJlIHJlcHJlc2VudGVkIGFzIHJlY3Rhbmd1bGFyIG1hdHJpY2VzIChNYW51c2NyaXB0cyB4IEF0dHJpYnV0ZXMpLiBGdXJ0aGVybW9yZSwgc2NpZW50aWZpYyBwdWJsaWNhdGlvbnMgcmVndWxhcmx5IGNvbnRhaW4gcmVmZXJlbmNlcyB0byBvdGhlciBzY2llbnRpZmljIHdvcmtzLiBUaGlzIGdlbmVyYXRlcyBhIGZ1cnRoZXIgbmV0d29yaywgbmFtZWx5LCBjb2NpdGF0aW9uIG9yIGNvdXBsaW5nIG5ldHdvcmsuDQpUaGVzZSBuZXR3b3JrcyBhcmUgYW5hbHlzZWQgaW4gb3JkZXIgdG8gY2FwdHVyZSBtZWFuaW5nZnVsIHByb3BlcnRpZXMgb2YgdGhlIHVuZGVybHlpbmcgcmVzZWFyY2ggc3lzdGVtLCBhbmQgaW4gcGFydGljdWxhciB0byBkZXRlcm1pbmUgdGhlIGluZmx1ZW5jZSBvZiBiaWJsaW9tZXRyaWMgdW5pdHMgc3VjaCBhcyBzY2hvbGFycyBhbmQgam91cm5hbHMuDQoNCiMjIyBCaXBhcnRpdGUgbmV0d29ya3MNCj4gY29jTWF0cml4IGlzIGEgZ2VuZXJhbCBmdW5jdGlvbiB0byBjb21wdXRlIGEgYmlwYXJ0aXRlIG5ldHdvcmsgc2VsZWN0aW5nIG9uZSBvZiB0aGUgbWV0YWRhdGEgYXR0cmlidXRlcy4gRm9yIGV4YW1wbGUsIHRvIGNyZWF0ZSBhIG5ldHdvcmsgTWFudXNjcmlwdCB4IFB1YmxpY2F0aW9uIFNvdXJjZSB5b3UgaGF2ZSB0byB1c2UgdGhlIGZpZWxkIHRhZyDigJxTT+KAnToNCg0KPiBGb3IgYSBjb21wbGV0ZSBsaXN0IG9mIGZpZWxkIHRhZ3Mgc2VlIGh0dHBzOi8vaW1hZ2VzLndlYm9ma25vd2xlZGdlLmNvbS9XT0tSUzQxMEI0L2hlbHAvV09TL2hfZmllbGR0YWdzLmh0bWwNCg0KYGBge3J9DQpBIDzigJAgY29jTWF0cml4KE0sIEZpZWxkID0gIlNPIiwgc2VwID0gIjsiKQ0KDQpgYGANCg0KPiBBIGlzIGEgcmVjdGFuZ3VsYXIgYmluYXJ5IG1hdHJpeCwgcmVwcmVzZW50aW5nIGEgYmlwYXJ0aXRlIG5ldHdvcmsgd2hlcmUgcm93cyBhbmQgY29sdW1ucyBhcmUgbWFudXNjcmlwdHMgYW5kIHNvdXJjZXMgcmVzcGVjdGl2ZWx5LiANClRoZSBnZW5lcmljIGVsZW1lbnQgaXMgMSBpZiB0aGUgbWFudXNjcmlwdCBoYXMgYmVlbiBwdWJsaXNoZWQgaW4gc291cmNlICwgMCBvdGhlcndpc2UuDQpUaGUgY29sdW1uIHN1bSBpcyB0aGUgbnVtYmVyIG9mIG1hbnVzY3JpcHRzIHB1Ymxpc2hlZCBpbiBzb3VyY2UuIFNvcnRpbmcsIGluIGRlY3JlYXNpbmcgb3JkZXIsIHRoZSBjb2x1bW4gc3VtcyBvZiBBLCB5b3UgY2FuIHNlZSB0aGUgbW9zdCByZWxldmFudCBwdWJsaWNhdGlvbiBzb3VyY2VzOg0KDQpgYGB7cn0NCnNvcnQoTWF0cml4Ojpjb2xTdW1zKEEpLCBkZWNyZWFzaW5nID0gVFJVRSlbMToxNV0NCg0KYGBgDQoNCj4gRm9sbG93aW5nIHRoaXMgYXBwcm9hY2gsIHlvdSBjYW4gY29tcHV0ZSBzZXZlcmFsIGJpcGFydGl0ZSBuZXR3b3JrczoNCkNpdGF0aW9uIG5ldHdvcmsNCg0KYGBge3J9DQpBIDzigJAgY29jTWF0cml4KE0sIEZpZWxkID0gIkNSIiwgc2VwID0gIi4gIikNCnNvcnQoTWF0cml4Ojpjb2xTdW1zKEEpLCBkZWNyZWFzaW5nID0gVFJVRSlbMToxNV0NCg0KYGBgDQoNCj4gQXV0aG9yIG5ldHdvcmsNCg0KYGBge3J9DQpBIDzigJAgY29jTWF0cml4KE0sIEZpZWxkID0gIkFVIiwgc2VwID0gIjsiKQ0Kc29ydChNYXRyaXg6OmNvbFN1bXMoQSksIGRlY3JlYXNpbmcgPSBUUlVFKVsxOjE1XQ0KDQpgYGANCg0KPiBDb3VudHJ5IG5ldHdvcmsNCkF1dGhvcnPigJkgQ291bnRyaWVzIGlzIG5vdCBhIHN0YW5kYXJkIGF0dHJpYnV0ZSBvZiB0aGUgYmlibGlvZ3JhcGhpYyBkYXRhIGZyYW1lLiBZb3UgbmVlZCB0byBleHRyYWN0IHRoaXMgaW5mb3JtYXRpb24gZnJvbSBhZmZpbGlhdGlvbiBhdHRyaWJ1dGUgdXNpbmcgdGhlIGZ1bmN0aW9uIG1ldGFUYWdFeHRyYWN0aW9uLg0KDQpgYGB7cn0NCk0gPOKAkCBtZXRhVGFnRXh0cmFjdGlvbihNLCBGaWVsZCA9ICJBVV9DTyIsIHNlcCA9ICI7IikNCkEgPOKAkCBjb2NNYXRyaXgoTSwgRmllbGQgPSAiQVVfQ08iLCBzZXAgPSAiOyIpDQpzb3J0KE1hdHJpeDo6Y29sU3VtcyhBKSwgZGVjcmVhc2luZyA9IFRSVUUpWzE6MTVdDQoNCmBgYA0KDQo+IG1ldGFUYWdFeHRyYWN0aW9uIGFsbG93cyB0byBleHRyYWN0IHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBmaWVsZCB0YWdzOiBBdXRob3Jz4oCZIGNvdW50cmllcyAoRmllbGQgPSAiQVVfQ08iKTsgRmlyc3QgYXV0aG9yIG9mIGVhY2ggY2l0ZWQgcmVmZXJlbmNlIChGaWVsZCA9ICJDUl9BVSIpOyBQdWJsaWNhdGlvbiBzb3VyY2Ugb2YgZWFjaCBjaXRlZCByZWZlcmVuY2UgKEZpZWxkID0gIkNSX1NPIik7IGFuZCBBdXRob3Jz4oCZIGFmZmlsaWF0aW9ucyAoRmllbGQgPSAiQVVfVU4iKS4NCg0KPiBBdXRob3Iga2V5d29yZCBuZXR3b3JrDQoNCmBgYHtyfQ0KQSA84oCQIGNvY01hdHJpeChNLCBGaWVsZCA9ICJERSIsIHNlcCA9ICI7IikNCnNvcnQoTWF0cml4Ojpjb2xTdW1zKEEpLCBkZWNyZWFzaW5nID0gVFJVRSlbMToxNV0NCg0KYGBgDQoNCj4gS2V5d29yZCBQbHVzIG5ldHdvcmsNCg0KYGBge3J9DQpBIDzigJAgY29jTWF0cml4KE0sIEZpZWxkID0gIklEIiwgc2VwID0gIjsiKQ0Kc29ydChNYXRyaXg6OmNvbFN1bXMoQSksIGRlY3JlYXNpbmcgPSBUUlVFKVsxOjE1XQ0KDQpgYGANCg0KDQo+IEJpYmxpb2dyYXBoaWMgY291cGxpbmcNClR3byBhcnRpY2xlcyBhcmUgc2FpZCB0byBiZSBiaWJsaW9ncmFwaGljYWxseSBjb3VwbGVkIGlmIGF0IGxlYXN0IG9uZSBjaXRlZCBzb3VyY2UgYXBwZWFycyBpbiB0aGUgYmlibGlvZ3JhcGhpZXMgb3IgcmVmZXJlbmNlIGxpc3RzIG9mIGJvdGggYXJ0aWNsZXMgKEtlc3NsZXIsIDE5NjMpLiANCkEgY291cGxpbmcgbmV0d29yayBjYW4gYmUgb2J0YWluZWQgdXNpbmcgdGhlIGdlbmVyYWwgZm9ybXVsYXRpb246ICRCPUEuQV5UJC4gV2hlcmUgQSBpcyBhIGJpcGFydGl0ZSBuZXR3b3JrLg0KDQo+IFRoZSBmdW5jdGlvbiBiaWJsaW9OZXR3b3JrIGNhbGN1bGF0ZXMsIHN0YXJ0aW5nIGZyb20gYSBiaWJsaW9ncmFwaGljIGRhdGEgZnJhbWUsIHRoZSBtb3N0IGZyZXF1ZW50bHkgdXNlZCBjb3VwbGluZyBuZXR3b3JrczogQXV0aG9ycywgU291cmNlcywgYW5kIENvdW50cmllcy4NCg0KPiBiaWJsaW9OZXR3b3JrIHVzZXMgdHdvIGFyZ3VtZW50cyB0byBkZWZpbmUgdGhlIG5ldHdvcmsgdG8gY29tcHV0ZTogDQoNCjEuIGFuYWx5c2lzIGFyZ3VtZW50IGNhbiBiZSDigJxjb2NpdGF0aW9u4oCdLCDigJxjb3VwbGluZ+KAnSwg4oCcY29sbGFib3JhdGlvbuKAnSwgb3Ig4oCcY29vY2N1cnJlbmNlc+KAnS4NCjIuIG5ldHdvcmsgYXJndW1lbnQgY2FuIGJlIOKAnGF1dGhvcnPigJ0sIOKAnHJlZmVyZW5jZXPigJ0sIOKAnHNvdXJjZXPigJ0sIOKAnGNvdW50cmllc+KAnSwg4oCcdW5pdmVyc2l0aWVz4oCdLCDigJxrZXl3b3Jkc+KAnSwg4oCcYXV0aG9yX2tleXdvcmRz4oCdLCDigJx0aXRsZXPigJ0gYW5kIOKAnGFic3RyYWN0c+KAnS4NCg0KYGBge3J9DQpOZXRNYXRyaXggPOKAkCBiaWJsaW9OZXR3b3JrKE0sIGFuYWx5c2lzID0gImNvdXBsaW5nIiwgbmV0d29yayA9ICJyZWZlcmVuY2VzIiwgc2VwID0gIi4gIikNCmBgYA0KDQo+IEFydGljbGVzIHdpdGggb25seSBhIGZldyByZWZlcmVuY2VzLCB0aGVyZWZvcmUsIHdvdWxkIHRlbmQgdG8gYmUgbW9yZSB3ZWFrbHkgYmlibGlvZ3JhcGhpY2FsbHkgY291cGxlZCwgaWYgY291cGxpbmcgc3RyZW5ndGggaXMgbWVhc3VyZWQgc2ltcGx5IGFjY29yZGluZyB0byB0aGUgbnVtYmVyIG9mIHJlZmVyZW5jZXMgdGhhdCBhcnRpY2xlcyBjb250YWluIGluIGNvbW1vbi4NClRoaXMgc3VnZ2VzdHMgdGhhdCBpdCBtaWdodCBiZSBtb3JlIHByYWN0aWNhYmxlIHRvIHN3aXRjaCB0byBhIHJlbGF0aXZlIG1lYXN1cmUgb2YgYmlibGlvZ3JhcGhpYyBjb3VwbGluZy4NCmNvdXBsaW5nU2ltaWxhcml0eSBmdW5jdGlvbiBjYWxjdWxhdGVzIEphY2NhcmQgb3IgU2FsdG9uIHNpbWlsYXJpdHkgY29lZmZpY2llbnQgYW1vbmcgdmVydGljZXMgb2YgYSBjb3VwbGluZyBuZXR3b3JrLg0KDQpgYGB7cn0NCk5ldE1hdHJpeCA84oCQIGJpYmxpb05ldHdvcmsoTSwgYW5hbHlzaXMgPSAiY291cGxpbmciLCBuZXR3b3JrID0gImF1dGhvcnMiLCBzZXAgPSAiOyIpDQoNCiMgcGxvdCBhdXRob3JzJyBzaW1pbGFyaXR5IChmaXJzdCAyMCBhdXRob3JzKQ0KbmV0PW5ldHdvcmtQbG90KE5ldE1hdHJpeCwgbiA9IDIwLCBUaXRsZSA9ICJBdXRob3JzJyBDb3VwbGluZyIsIHR5cGUgPSAiZnJ1Y2h0ZXJtYW4iLCBzaXplPUZBTFNFLCByZW1vdmUubXVsdGlwbGU9VFJVRSwgdm9zLnBhdGg9ImM6L1VzZXJzL0RFL0Rlc2t0b3AvYmlibGlvbWV0Umljcy9WT1N2aWV3ZXIiKQ0KYGBgDQoNCmBgYHtyLCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9MTB9DQojIGNhbGN1bGF0ZSBqYWNjYXJkIHNpbWlsYXJpdHkgY29lZmZpY2llbnQNClMgPOKAkCBjb3VwbGluZ1NpbWlsYXJpdHkoTmV0TWF0cml4LCB0eXBlPSJqYWNjYXJkIikNCg0KIyBwbG90IGF1dGhvcnMnIHNpbWlsYXJpdHkgKGZpcnN0IDIwIGF1dGhvcnMpDQpuZXQ9bmV0d29ya1Bsb3QoUywgbiA9IDIwLCBUaXRsZSA9ICJBdXRob3JzJyBDb3VwbGluZyIsIHJlbW92ZS5tdWx0aXBsZT1UUlVFLCB2b3MucGF0aD0iYzovVXNlcnMvREUvRGVza3RvcC9iaWJsaW9tZXRSaWNzL1ZPU3ZpZXdlciIpDQoNCg0KYGBgDQoNCg0KPiBCaWJsaW9ncmFwaGljIGNvY2l0YXRpb24NCldlIHRhbGsgYWJvdXQgY29jaXRhdGlvbiBvZiB0d28gYXJ0aWNsZXMgd2hlbiBib3RoIGFyZSBjaXRlZCBpbiBhIHRoaXJkIGFydGljbGUuIFRodXMsIGNvY2l0YXRpb24gY2FuIGJlIHNlZW4gYXMgdGhlIGNvdW50ZXJwYXJ0IG9mIGJpYmxpb2dyYXBoaWMgY291cGxpbmcuDQpBIGNvY2l0YXRpb24gbmV0d29yayBjYW4gYmUgb2J0YWluZWQgdXNpbmcgdGhlIGdlbmVyYWwgZm9ybXVsYXRpb246ICRDPUFedC5BJC4gd2hlcmUgQSBpcyBhIGJpcGFydGl0ZSBuZXR3b3JrLg0KDQpgYGB7cn0NCk5ldE1hdHJpeCA84oCQIGJpYmxpb05ldHdvcmsoTSwgYW5hbHlzaXMgPSAiY2/igJBjaXRhdGlvbiIsIG5ldHdvcmsgPSAicmVmZXJlbmNlcyIsIHNlcCA9ICIuICIpDQpuZXQ9bmV0d29ya1Bsb3QoTmV0TWF0cml4LCBuID0gMjAsIFRpdGxlID0gIkJpYmxpb2dyYXBoaWMgY29jaXRhdGlvbiIsIHR5cGUgPSAiZnJ1Y2h0ZXJtYW4iLCBzaXplPUZBTFNFLCByZW1vdmUubXVsdGlwbGU9VFJVRSwgdm9zLnBhdGg9ImM6L1VzZXJzL0RFL0Rlc2t0b3AvYmlibGlvbWV0Umljcy9WT1N2aWV3ZXIiKQ0KYGBgDQoNCg0KPiBCaWJsaW9ncmFwaGljIGNvbGxhYm9yYXRpb24NClNjaWVudGlmaWMgY29sbGFib3JhdGlvbiBuZXR3b3JrIGlzIGEgbmV0d29yayB3aGVyZSBub2RlcyBhcmUgYXV0aG9ycyBhbmQgbGlua3MgYXJlIGNvYXV0aG9yc2hpcHMgYXMgdGhlIGxhdHRlciBpcyBvbmUgb2YgdGhlIG1vc3Qgd2VsbCBkb2N1bWVudGVkIGZvcm1zIG9mIHNjaWVudGlmaWMgY29sbGFib3JhdGlvbiAoR2xhbnplbCwgMjAwNCkuDQpBbiBhdXRob3IgY29sbGFib3JhdGlvbiBuZXR3b3JrIGNhbiBiZSBvYnRhaW5lZCB1c2luZyB0aGUgZ2VuZXJhbCBmb3JtdWxhdGlvbjoNCiRBQz1BXnQuQSQuIHdoZXJlIEEgaXMgYSBiaXBhcnRpdGUgbmV0d29yayBNYW51c2NyaXB0cyB4IEF1dGhvcnMuDQoNCmBgYHtyfQ0KTmV0TWF0cml4IDzigJAgYmlibGlvTmV0d29yayhNLCBhbmFseXNpcyA9ICJjb2xsYWJvcmF0aW9uIiwgbmV0d29yayA9ICJhdXRob3JzIiwgc2VwID0gIjsiKQ0KbmV0PW5ldHdvcmtQbG90KE5ldE1hdHJpeCwgbiA9IDIwLCBUaXRsZSA9ICJCaWJsaW9ncmFwaGljIGNvbGxhYm9yYXRpb24iLCB0eXBlID0gImZydWNodGVybWFuIiwgc2l6ZT1GQUxTRSwgcmVtb3ZlLm11bHRpcGxlPVRSVUUsIHZvcy5wYXRoPSJjOi9Vc2Vycy9ERS9EZXNrdG9wL2JpYmxpb21ldFJpY3MvVk9Tdmlld2VyIikNCmBgYA0KDQo+IFZpc3VhbGl6aW5nIGJpYmxpb2dyYXBoaWMgbmV0d29ya3MNCg0KPiBDb3VudHJ5IFNjaWVudGlmaWMgQ29sbGFib3JhdGlvbg0KDQpgYGB7cn0NCiMgQ3JlYXRlIGEgY291bnRyeSBjb2xsYWJvcmF0aW9uIG5ldHdvcmsNCk0gPOKAkCBtZXRhVGFnRXh0cmFjdGlvbihNLCBGaWVsZCA9ICJBVV9DTyIsIHNlcCA9ICI7IikNCk5ldE1hdHJpeCA84oCQIGJpYmxpb05ldHdvcmsoTSwgYW5hbHlzaXMgPSAiY29sbGFib3JhdGlvbiIsIG5ldHdvcmsgPSAiY291bnRyaWVzIiwgc2VwID0gIjsiKQ0KIyBQbG90IHRoZSBuZXR3b3JrDQpuZXQ9bmV0d29ya1Bsb3QoTmV0TWF0cml4LCBuID0gMjAsIFRpdGxlID0gIkNvdW50cnkgQ29sbGFib3JhdGlvbiIsIHR5cGUgPSAiY2lyY2xlIiwgc2l6ZT1UUlVFLHJlbW92ZS5tdWx0aXBsZT1GQUxTRSkNCg0KbmV0PW5ldHdvcmtQbG90KE5ldE1hdHJpeCwgbiA9IDIwLCBUaXRsZSA9ICJDb3VudHJ5IENvbGxhYm9yYXRpb24iLCB0eXBlID0gImZydWNodGVybWFuIiwgc2l6ZT1GQUxTRSwgcmVtb3ZlLm11bHRpcGxlPVRSVUUsIHZvcy5wYXRoPSJjOi9Vc2Vycy9ERS9EZXNrdG9wL2JpYmxpb21ldFJpY3MvVk9Tdmlld2VyIikNCmBgYA0KDQo+IENvQ2l0YXRpb24gTmV0d29yaw0KDQpgYGB7cn0NCiMgQ3JlYXRlIGEgY2/igJBjaXRhdGlvbiBuZXR3b3JrDQpOZXRNYXRyaXggPOKAkCBiaWJsaW9OZXR3b3JrKE0sIGFuYWx5c2lzID0gImNv4oCQY2l0YXRpb24iLCBuZXR3b3JrID0gInJlZmVyZW5jZXMiLCBzZXAgPSAiLiAiKQ0KIyBQbG90IHRoZSBuZXR3b3JrDQpuZXQ9bmV0d29ya1Bsb3QoTmV0TWF0cml4LCBuID0gNSwgVGl0bGUgPSAiQ2/igJBDaXRhdGlvbiBOZXR3b3JrIiwgdHlwZSA9ICJmcnVjaHRlcm1hbiIsIHNpemU9VCwgcmVtb3ZlLm11bHRpcGxlPUZBTFNFKQ0KDQpgYGANCg0KPiBLZXl3b3JkIGNvb2NjdXJyZW5jZXMNCg0KYGBge3IsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD0xMH0NCiMgQ3JlYXRlIGtleXdvcmQgY2/igJBvY2N1cnJlbmNpZXMgbmV0d29yaw0KTmV0TWF0cml4IDzigJAgYmlibGlvTmV0d29yayhNLCBhbmFseXNpcyA9ICJjb+KAkG9jY3VycmVuY2VzIiwgbmV0d29yayA9ICJrZXl3b3JkcyIsIHNlcCA9ICI7IikNCiMgUGxvdCB0aGUgbmV0d29yaw0KbmV0PW5ldHdvcmtQbG90KE5ldE1hdHJpeCwgbiA9IDIwLCBUaXRsZSA9ICJLZXl3b3JkIENv4oCQb2NjdXJyZW5jZXMiLCB0eXBlID0gImthbWFkYSIsIHNpemU9VCkNCmBgYA0KDQo+IENvV29yZCBBbmFseXNpczogQ29uY2VwdHVhbCBzdHJ1Y3R1cmUgb2YgYSBmaWVsZCBUaGUgYWltIG9mIHRoZSBjb3dvcmQgYW5hbHlzaXMgaXMgdG8gbWFwIHRoZSBjb25jZXB0dWFsIHN0cnVjdHVyZSBvZiBhIGZyYW1ld29yayB1c2luZyB0aGUgd29yZCBjb29jY3VycmVuY2VzIGluIGEgYmlibGlvZ3JhcGhpYyBjb2xsZWN0aW9uLg0KVGhlIGFuYWx5c2lzIGNhbiBiZSBwZXJmb3JtZWQgdGhyb3VnaCBkaW1lbnNpb25hbGl0eSByZWR1Y3Rpb24gdGVjaG5pcXVlcyBzdWNoIGFzIE11bHRpZGltZW5zaW9uYWwgU2NhbGluZyAoTURTKSBvciBNdWx0aXBsZSBDb3JyZXNwb25kZW5jZSBBbmFseXNpcyAoTUNBKS4gDQpIZXJlLCB3ZSBzaG93IGFuIGV4YW1wbGUgdXNpbmcgdGhlIGZ1bmN0aW9uIGNvbmNlcHR1YWxTdHJ1Y3R1cmUgdGhhdCBwZXJmb3JtcyBhIE1DQSB0byBkcmF3IGEgY29uY2VwdHVhbCBzdHJ1Y3R1cmUgb2YgdGhlIGZpZWxkIGFuZCBLbWVhbnMgY2x1c3RlcmluZyB0byBpZGVudGlmeSBjbHVzdGVycyBvZiBkb2N1bWVudHMgd2hpY2ggZXhwcmVzcyBjb21tb24gY29uY2VwdHMuIFJlc3VsdHMgYXJlIHBsb3R0ZWQgb24gYSB0d29kaW1lbnNpb25hbA0KbWFwLiANCmNvbmNlcHR1YWxTdHJ1Y3R1cmUgaW5jbHVkZXMgbmF0dXJhbCBsYW5ndWFnZSBwcm9jZXNzaW5nIChOTFApIHJvdXRpbmVzIChzZWUgdGhlIGZ1bmN0aW9uIHRlcm1FeHRyYWN0aW9uKSB0byBleHRyYWN0IHRlcm1zIGZyb20gdGl0bGVzIGFuZCBhYnN0cmFjdHMuIEluIGFkZGl0aW9uLCBpdCBpbXBsZW1lbnRzIHRoZSBQb3J0ZXLigJlzIHN0ZW1taW5nIGFsZ29yaXRobSB0byByZWR1Y2UgaW5mbGVjdGVkIChvciBzb21ldGltZXMgZGVyaXZlZCkgd29yZHMgdG8gdGhlaXIgd29yZCBzdGVtLCBiYXNlIG9yIHJvb3QgZm9ybS4NCg0KYGBge3J9DQojIENvbmNlcHR1YWwgU3RydWN0dXJlIHVzaW5nIGtleXdvcmRzDQpDUyA8LSBjb25jZXB0dWFsU3RydWN0dXJlKE0sZmllbGQ9IklEIiwgbWluRGVncmVlPTQsIGsubWF4PTUsIHN0ZW1taW5nPUZBTFNFKQ0KYGBgDQoNCg0KPiBIaXN0b3JpY2FsIENvLUNpdGF0aW9uIE5ldHdvcmsgDQpIaXN0b3Jpb2dyYXBoaWMgbWFwIGlzIGEgZ3JhcGggcHJvcG9zZWQgYnkgRS4gR2FyZmllbGQgdG8gcmVwcmVzZW50IGEgY2hyb25vbG9naWNhbCBuZXR3b3JrIG1hcCBvZiBtb3N0IHJlbGV2YW50IGNvLWNpdGF0aW9ucyByZXN1bHRpbmcgZnJvbSBhIGJpYmxpb2dyYXBoaWMgY29sbGVjdGlvbi4NClRoZSBmdW5jdGlvbiBcY29kZXtoaXN0TmV0d29ya30gZ2VuZXJhdGVzIGEgY2hyb25vbG9naWNhbCBjby1jaXRhdGlvbiBuZXR3b3JrIG1hdHJpeCB3aGljaCBjYW4gYmUgcGxvdHRlZCB1c2luZyBoaXN0UGxvdDoNCg0KYGBge3J9DQojIENyZWF0ZSBhIGhpc3RvcmljYWwgY28tY2l0YXRpb24gbmV0d29yaw0KP2hpc3ROZXR3b3JrDQpoaXN0UmVzdWx0cyA8LSBoaXN0TmV0d29yayhNLCBuID0gMTAsIHNlcCA9ICI7IikNCg0KIyBQbG90IGEgaGlzdG9yaWNhbCBjby1jaXRhdGlvbiBuZXR3b3JrDQpuZXQgPC0gaGlzdFBsb3QoaGlzdFJlc3VsdHMsIHNpemUgPSBGQUxTRSkNCg0KYGBgDQoNCg0K