Introduzione

Texas Realty Insights ha richiesto un’analisi approfondita del mercato immobiliare texano per il periodo 2010–2014. L’obiettivo è identificare tendenze storiche, valutare l’efficacia delle inserzioni immobiliari e fornire insight strategici basati su dati concreti. Il dataset include informazioni mensili su vendite, prezzi, volumi e inventario per diverse città del Texas.

Attraverso un approccio statistico e visivo, questo report guiderà l’azienda nell’ottimizzazione delle strategie di vendita, evidenziando le città più dinamiche e i periodi più favorevoli per il mercato.

0. Esplorazione dataset

l numero totale di record nel dataset è: 240 


1. Analisi delle variabili

di seguito una tabella riassuntiva sulle variabili del data set realestate_texas.csv

Variabile Tipo Descrizione
city Categoriale Nome della città: variabile cardine su cui basare l’analisi condizionata
year Quantitativa Anno di riferimento: variabile tempo utilizzabile per analizzare il trend delle vendite negli anni
month Categoriale Mese (da 1 a 12): variabile tempo utilizzabile per analizzare il trend nei mesi dell’anno più prolifici
sales Quantitativa Numero di vendite: variabile utilizzabile per determinare sull’asse Y la quantità di vendite per ciascuna città o mese/anno
volume Quantitativa Valore totale delle vendite (milioni di $)
median_price Quantitativa Prezzo mediano di vendita: utilizzabile per analizzare il valore del mercato nel tempo, nello spazio e rispetto ad altri indicatori
listings Quantitativa Numero di annunci attivi: variabile utilizzabile per analizzare la correlazione tra annunci e vendite
months_inventory Quantitativa Mesi necessari per vendere tutte le case disponibili: variabile utilizzabile per


2. Indici di posizione - Analisi della variabilità e dell’asimmetria

Calcola Indici di posizione, variabilità e forma per tutte le variabili per le quali ha senso farlo, per le altre crea una distribuzione di frequenza.

Tabella- Indici di posizione, variabilità e asimmetria per variabili quantitative
Variabile Media Deviazione_Standard Coeff_Variazione Minimo Massimo Skewness Kurtosis
sales 192.29 79.65 0.41 79.00 423.00 0.72 2.69
volume 31.01 16.65 0.54 8.17 83.55 0.88 3.18
median_price 132665.42 22662.15 0.17 73800.00 180000.00 -0.36 2.38
listings 1738.02 752.71 0.43 743.00 3296.00 0.65 2.21
months_inventory 9.19 2.30 0.25 3.40 14.90 0.04 2.83
Tabella- Frequenza delle osservazioni per città
Città Numero di osservazioni
Beaumont 60
Bryan-College Station 60
Tyler 60
Wichita Falls 60


3. Identificazione delle variabili con maggiore variabilità e asimmetria

Determina: - Qual è la variabile con la più alta variabilità - Qual è la variabile con la distribuzione più asimmetrica

Commenti punto 2 e punto 3:

La variabile city presenta una distribuzione uniforme, con frequenze identiche per ciascuna modalità. Questo suggerisce che il dataset è bilanciato rispetto alla rappresentazione delle città analizzate.

La tabella “Indici di variabilità” e asimmetria per variabili quantitative mostra invece gli indici di variabilità e di forma per cinque variabili quantitative del dataset.

  • Variabilità: Le variabili volume e listings presentano la maggiore dispersione relativa (CV = 0.54 e 0.43), indicando un’elevata eterogeneità tra le osservazioni. Al contrario, median_price risulta la più stabile (CV = 0.17), suggerendo che i prezzi medi di vendita variano meno rispetto ad altri indicatori.

  • Asimmetria (Skewness): Le variabili sales, volume e listings mostrano una asimmetria positiva, con una coda più lunga verso destra. Questo implica la presenza di valori occasionalmente molto elevati. median_price ha una asimmetria negativa moderata (-0.36), indicando una leggera concentrazione di valori più alti. months_inventory è quasi simmetrica (skewness ≈ 0).

  • Forma della distribuzione (Kurtosis): Tutte le variabili hanno valori di kurtosis compresi tra 2.2 e 3.2, vicini a quelli di una distribuzione normale (kurtosis = 3). volume e sales sono leggermente leptocurtiche, con una maggiore concentrazione attorno alla media e code più pronunciate.



4. Creazione di classi per una variabile quantitativa

Seleziona una variabile quantitativa (es. sales o median_price) e suddividila in classi. Crea una distribuzione di frequenze e rappresenta i dati con un grafico a barre. Calcola l’indice di eterogeneità Gini e discuti i risultati.

Calcola l’indice di eterogeneità Gini

Gini index sales = 0.2311 

Commenti:

Un valore di Gini pari a 0.2311 indica una disuguaglianza moderata-bassa nella distribuzione delle vendite. Questo significa che, pur esistendo differenze tra le osservazioni, la maggior parte dei valori di sales si concentra in un intervallo relativamente omogeneo. Lo conferma anche il grafico a barre: la classe (100,200) domina nettamente, mentre le classi estreme sono poco rappresentate.



5. Calcolo della probabilità

Qual è la probabilità che, presa una riga a caso di questo dataset, essa riporti la città “Beaumont”? E la probabilità che riporti il mese di Luglio? E la probabilità che riporti il mese di dicembre 2012?

Probabilità che la città sia Beaumont = 25 %
Probabilità che il mese sia Luglio = 8.3 %
Probabilità che il mese sia dicembre 2012 = 1.7 %


6. Creazione di nuove variabili

Crea una nuova colonna che calcoli il prezzo medio degli immobili utilizzando le variabili disponibili

La seguente tabella mostra i primi 5 record della nuova colonna prezzo_mediodel dataframe che contiene prezzo_medio = volume/sales

prezzo_medio
170627
163796
157698
134095
142738

Prova a creare una colonna che misuri l’efficacia degli annunci di vendita. Commenta e discuti i risultati La seguente tabella mostra i primi 5 record della nuova colonna efficacia_annuncio del dataframe che contiente il prezzo_medio = volume/sales

Questa metrica indica quanti immobili sono stati venduti rispetto al numero di annunci attivi. In altre parole:

Valori vicini a 1 → quasi ogni annuncio ha portato a una vendita → molto efficace

Valori < 1 → non tutti gli annunci hanno generato vendite → meno efficace

efficacia_annuncio
0.0541422
0.0680958
0.1077561
0.1170960
0.1140599

Colonna creata nel dataset come da immagine.

La nuova variabile è stata subito utilizzata per creare il grafico “efficacia degl annunci per città”.

Il seguente grafico dell’efficacia degli annunci per città mostra infatti come gli annunci siano mediamente più efficaci nella città di Bryan-Collage Station



7. Analisi condizionata

Usa il pacchetto dplyr o il linguaggio base di R per effettuare analisi statistiche condizionate per città, anno e mese. Genera dei summary (media, deviazione standard) e rappresenta graficamente i risultati.

7.1 Statistiche condizionate per città

–Il grafico mette a confronto il prezzo medio per ogni Città. La città di Bryan-College Station risulta la città con il prezzo medio più alto.


7.2 Statistiche condizionate per anno

–Il grafico mostra l’andamento del prezzo medio su base annua.

L’andamento subisce un ribasso dal 2010 al 2011 per poi riprendere in crescente fino al 2014


7.3 Statistiche condizionate per mese

–Il grafico mostra l’andamento del prezzo medio su base mensile per evidenziare una “variazione stagionale”

Il grafico mostra un trend al rialzo del prezzi medi a partire da Aprile. I mesi iniziali sono quelli con il prezzo medio inferiore rispetto nell’anno.

Giugno è il mese con il picco di prezzo medio pù alto



8. Creazione di visualizzazioni con ggplot2

Visual 1: Confronto volume fatturato derivante dalle vendite (YoY)

il 2014 è l’anno con il volume più alto di vendite espresse in milioni di dollari


Visual 2: Confronto delle vendite MoM (filtrabile per anno)

Il grafico mostra che nei mesi centrali dell’anno sono concentrate più vendite. Giugno è il mese Top. Gennaio il mese peggiore


Visual 3: Andamento delle vendite per città e nel tempo

Il grafico mostra che Tyler è la top city per vendite di sempre


Visual 4: Andamento delle vendite per città e nel tempo

Il grafico interattivo mostra l’andamento delle vendite per città nel tempo ed effettuare eventuali previsioni future

La città di Tyler storicamente è quella con vendite maggiori anche se superata nel Luglio 2013 da Bryan-Collage Station


Visual 5: Andamento delle vendite per città su base mensile

Il grafico interattivo mostra la distribuzione del totale vendite delle città su base mensile


Visual 6: Andamento prezzo medio nel tempo (filtrabile per anno)

Il grafico interattivo mostra il trend del prezzo medio nel tempo per individuare cali o aumenti nel periodo ed effettuare eventuali previsioni future



Visual 7: Confrono prezzo medio per città

Il grafico mette a confronto il prezzo medio delle città.

Bryan-Collage Station risulta la città con il prezzo medio più alto

Visual 8: Correlazione tra le vatiabili annunci e vendite di casa

C’è una relazione positiva tra annunci e vendite: più annunci, più vendite .

Il valore r = 0.62 indica una buona correlazione, ma non perfetta

Il p-value molto basso conferma che la correlazione non è dovuta al caso


    Pearson's product-moment correlation

data:  dati$listings and dati$sales
t = 12.212, df = 238, p-value < 2.2e-16
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 0.5361890 0.6928509
sample estimates:
      cor 
0.6206765 

Add-on insight

⏱️ Il tempo medio per vendere le inserzioni è: 9.19 mesi

Nella città di Tyler mediamente si impiega più tempo a vendere gli immobili (11.3 mesi), mentre Bryan-Collage Station è quella con mediamente minor tempo(7.5 mesi) .


Conclusioni finali del progetto:

GRAZIE PER L’ATTENZIONE (Emanuele Risa)

LS0tDQp0aXRsZTogIlByb2dldHRvIGFuYWxpc2kgdmVuZGl0ZSBpbW1vYmlsaSBpbiBUZXhhcyINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCiMgSW50cm9kdXppb25lDQpUZXhhcyBSZWFsdHkgSW5zaWdodHMgaGEgcmljaGllc3RvIHVu4oCZYW5hbGlzaSBhcHByb2ZvbmRpdGEgZGVsIG1lcmNhdG8gaW1tb2JpbGlhcmUgdGV4YW5vIHBlciBpbCBwZXJpb2RvIDIwMTDigJMyMDE0LiBM4oCZb2JpZXR0aXZvIMOoIGlkZW50aWZpY2FyZSB0ZW5kZW56ZSBzdG9yaWNoZSwgdmFsdXRhcmUgbOKAmWVmZmljYWNpYSBkZWxsZSBpbnNlcnppb25pIGltbW9iaWxpYXJpIGUgZm9ybmlyZSBpbnNpZ2h0IHN0cmF0ZWdpY2kgYmFzYXRpIHN1IGRhdGkgY29uY3JldGkuIElsIGRhdGFzZXQgaW5jbHVkZSBpbmZvcm1hemlvbmkgbWVuc2lsaSBzdSB2ZW5kaXRlLCBwcmV6emksIHZvbHVtaSBlIGludmVudGFyaW8gcGVyIGRpdmVyc2UgY2l0dMOgIGRlbCBUZXhhcy4NCg0KQXR0cmF2ZXJzbyB1biBhcHByb2NjaW8gc3RhdGlzdGljbyBlIHZpc2l2bywgcXVlc3RvIHJlcG9ydCBndWlkZXLDoCBs4oCZYXppZW5kYSBuZWxs4oCZb3R0aW1penphemlvbmUgZGVsbGUgc3RyYXRlZ2llIGRpIHZlbmRpdGEsIGV2aWRlbnppYW5kbyBsZSBjaXR0w6AgcGnDuSBkaW5hbWljaGUgZSBpIHBlcmlvZGkgcGnDuSBmYXZvcmV2b2xpIHBlciBpbCBtZXJjYXRvLg0KDQoNCg0KYGBge3IgZWNobz1GQUxTRX0NCiMg8J+TmiBDYXJpY2FtZW50byBkZWxsZSBsaWJyZXJpZSBuZWNlc3NhcmllDQoNCmxpYnJhcnkoZHBseXIpICAgICAgICAjIE1hbmlwb2xhemlvbmUgZGVpIGRhdGkNCmxpYnJhcnkoZ2dwbG90MikgICAgICAjIEdyYWZpY2kgc3RhdGljaQ0KbGlicmFyeShwbG90bHkpICAgICAgICMgR3JhZmljaSBpbnRlcmF0dGl2aQ0KbGlicmFyeShjcm9zc3RhbGspICAgICMgRmlsdHJpIGludGVyYXR0aXZpIGNvbmRpdmlzaQ0KbGlicmFyeShic3BsdXMpICAgICAgICMgTGF5b3V0IGludGVyYXR0aXZvIGNvbiBic2NvbHMoKQ0KbGlicmFyeShzY2FsZXMpICAgICAgICMgRm9ybWF0dGF6aW9uZSBudW1lcmljYSAoZXRpY2hldHRlLCBhc3NpKQ0KbGlicmFyeShyZWFkcikgICAgICAgICMgTGV0dHVyYSBmaWxlIENTViAoc2UgdXNhdG8pDQojIE9wemlvbmFsaQ0KbGlicmFyeShEVCkgICAgICAgICAgICMgVGFiZWxsZSBpbnRlcmF0dGl2ZQ0KbGlicmFyeShrYWJsZUV4dHJhKSAgICMgVGFiZWxsZSBzdGF0aWNoZSBlbGVnYW50aQ0KbGlicmFyeSh0aWR5cikgICAgICAgICMgUmlzdHJ1dHR1cmF6aW9uZSBkYXRpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkgICAgIyBHZXN0aW9uZSBkYXRlDQpsaWJyYXJ5KGUxMDcxKQ0KbGlicmFyeShtb21lbnRzKQ0KDQoNCmBgYA0KDQoNCg0KDQoNCg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KZGF0aSA8LSByZWFkLmNzdigicmVhbGVzdGF0ZV90ZXhhcy5jc3YiKQ0KYGBgDQoNCiMjIyAwLiBFc3Bsb3JhemlvbmUgZGF0YXNldA0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KaGVhZChkYXRpKQ0KbnVtZXJvX3JlY29yZCA8LSBucm93KGRhdGkpDQpjYXQocGFzdGUoImwgbnVtZXJvIHRvdGFsZSBkaSByZWNvcmQgbmVsIGRhdGFzZXQgw6g6IiwgbnVtZXJvX3JlY29yZCwgIlxuIikpDQoNCg0KYGBgDQoNCg0KX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCg0KIyMjIDEuIEFuYWxpc2kgZGVsbGUgdmFyaWFiaWxpDQpkaSBzZWd1aXRvIHVuYSB0YWJlbGxhIHJpYXNzdW50aXZhIHN1bGxlIHZhcmlhYmlsaSBkZWwgZGF0YSBzZXQgcmVhbGVzdGF0ZV90ZXhhcy5jc3YNCg0KfCBWYXJpYWJpbGUgICAgICAgICAgfCBUaXBvICAgICAgICAgfCBEZXNjcml6aW9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCnwgYGNpdHlgICAgICAgICAgICAgIHwgQ2F0ZWdvcmlhbGUgIHwgTm9tZSBkZWxsYSBjaXR0w6A6IHZhcmlhYmlsZSBjYXJkaW5lIHN1IGN1aSBiYXNhcmUgbCdhbmFsaXNpIGNvbmRpemlvbmF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgYHllYXJgICAgICAgICAgICAgIHwgUXVhbnRpdGF0aXZhIHwgQW5ubyBkaSByaWZlcmltZW50bzogdmFyaWFiaWxlIHRlbXBvIHV0aWxpenphYmlsZSBwZXIgYW5hbGl6emFyZSBpbCB0cmVuZCBkZWxsZSB2ZW5kaXRlIG5lZ2xpIGFubmkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgYG1vbnRoYCAgICAgICAgICAgIHwgQ2F0ZWdvcmlhbGUgIHwgTWVzZSAoZGEgMSBhIDEyKTogdmFyaWFiaWxlIHRlbXBvIHV0aWxpenphYmlsZSBwZXIgYW5hbGl6emFyZSBpbCB0cmVuZCBuZWkgbWVzaSBkZWxsJ2Fubm8gcGnDuSBwcm9saWZpY2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCBgc2FsZXNgICAgICAgICAgICAgfCBRdWFudGl0YXRpdmEgfCBOdW1lcm8gZGkgdmVuZGl0ZTogdmFyaWFiaWxlIHV0aWxpenphYmlsZSBwZXIgZGV0ZXJtaW5hcmUgc3VsbCdhc3NlIFkgbGEgcXVhbnRpdMOgIGRpIHZlbmRpdGUgcGVyIGNpYXNjdW5hIGNpdHTDoCBvIG1lc2UvYW5ubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCBgdm9sdW1lYCAgICAgICAgICAgfCBRdWFudGl0YXRpdmEgfCBWYWxvcmUgdG90YWxlIGRlbGxlIHZlbmRpdGUgKG1pbGlvbmkgZGkgJCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCBgbWVkaWFuX3ByaWNlYCAgICAgfCBRdWFudGl0YXRpdmEgfCBQcmV6em8gbWVkaWFubyBkaSB2ZW5kaXRhOiB1dGlsaXp6YWJpbGUgcGVyIGFuYWxpenphcmUgaWwgdmFsb3JlIGRlbCBtZXJjYXRvIG5lbCB0ZW1wbywgbmVsbG8gc3BhemlvIGUgcmlzcGV0dG8gYWQgYWx0cmkgaW5kaWNhdG9yaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCBgbGlzdGluZ3NgICAgICAgICAgfCBRdWFudGl0YXRpdmEgfCBOdW1lcm8gZGkgYW5udW5jaSBhdHRpdmk6IHZhcmlhYmlsZSB1dGlsaXp6YWJpbGUgcGVyIGFuYWxpenphcmUgbGEgY29ycmVsYXppb25lIHRyYSBhbm51bmNpIGUgdmVuZGl0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IGBtb250aHNfaW52ZW50b3J5YCB8IFF1YW50aXRhdGl2YSB8IE1lc2kgbmVjZXNzYXJpIHBlciB2ZW5kZXJlIHR1dHRlIGxlIGNhc2UgZGlzcG9uaWJpbGk6IHZhcmlhYmlsZSB1dGlsaXp6YWJpbGUgcGVyICAgICAgICAgICAgICAgICAgICAgICAgIHwNCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KDQojIyMgMi4gSW5kaWNpIGRpIHBvc2l6aW9uZSAtIEFuYWxpc2kgZGVsbGEgdmFyaWFiaWxpdMOgIGUgZGVsbCdhc2ltbWV0cmlhDQpDYWxjb2xhIEluZGljaSBkaSBwb3NpemlvbmUsIHZhcmlhYmlsaXTDoCBlIGZvcm1hIHBlciB0dXR0ZSBsZSB2YXJpYWJpbGkgcGVyIGxlIHF1YWxpIGhhIHNlbnNvIGZhcmxvLCBwZXIgbGUgYWx0cmUgY3JlYSB1bmEgZGlzdHJpYnV6aW9uZSBkaSBmcmVxdWVuemEuDQoNCmBgYHtyIGVjaG89RkFMU0V9DQojIFNlbGV6aW9uYSBsZSB2YXJpYWJpbGkNCnZhcmlhYmlsaSA8LSBkYXRpICU+JQ0KICBzZWxlY3Qoc2FsZXMsIHZvbHVtZSwgbWVkaWFuX3ByaWNlLCBsaXN0aW5ncywgbW9udGhzX2ludmVudG9yeSkNCg0KIyBDYWxjb2xhIGdsaSBpbmRpY2kNCnRhYmVsbGFfdmFyIDwtIHRpYmJsZSgNCiAgVmFyaWFiaWxlID0gYygic2FsZXMiLCAidm9sdW1lIiwgIm1lZGlhbl9wcmljZSIsICJsaXN0aW5ncyIsICJtb250aHNfaW52ZW50b3J5IiksDQogIE1lZGlhID0gc2FwcGx5KHZhcmlhYmlsaSwgbWVhbiksDQogIERldmlhemlvbmVfU3RhbmRhcmQgPSBzYXBwbHkodmFyaWFiaWxpLCBzZCksDQogIENvZWZmX1ZhcmlhemlvbmUgPSBzYXBwbHkodmFyaWFiaWxpLCBzZCkgLyBzYXBwbHkodmFyaWFiaWxpLCBtZWFuKSwNCiAgTWluaW1vID0gc2FwcGx5KHZhcmlhYmlsaSwgbWluKSwNCiAgTWFzc2ltbyA9IHNhcHBseSh2YXJpYWJpbGksIG1heCksDQogIFNrZXduZXNzID0gc2FwcGx5KHZhcmlhYmlsaSwgc2tld25lc3MpLA0KICBLdXJ0b3NpcyA9IHNhcHBseSh2YXJpYWJpbGksIGt1cnRvc2lzKQ0KKSAlPiUNCiAgbXV0YXRlKGFjcm9zcyh3aGVyZShpcy5udW1lcmljKSwgfnJvdW5kKC54LCAyKSkpDQoNCiMgVmlzdWFsaXp6YSBsYSB0YWJlbGxhDQp0YWJlbGxhX3ZhciAlPiUNCiAga2FibGUoY2FwdGlvbiA9ICJUYWJlbGxhLSBJbmRpY2kgZGkgcG9zaXppb25lLCB2YXJpYWJpbGl0w6AgZSBhc2ltbWV0cmlhIHBlciB2YXJpYWJpbGkgcXVhbnRpdGF0aXZlIikgJT4lDQogIGthYmxlX3N0eWxpbmcoDQogICAgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIiksDQogICAgZnVsbF93aWR0aCA9IEZBTFNFLA0KICAgIHBvc2l0aW9uID0gImxlZnQiDQogICkNCmBgYA0KDQoNCmBgYHtyIGVjaG89RkFMU0V9DQp0YWJsZV9jaXR0YSA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKGRhdGkkY2l0eSkpDQpjb2xuYW1lcyh0YWJsZV9jaXR0YSkgPC0gYygiQ2l0dMOgIiwgIk51bWVybyBkaSBvc3NlcnZhemlvbmkiKQ0KDQprYWJsZSh0YWJsZV9jaXR0YSwgY2FwdGlvbiA9ICJUYWJlbGxhLSBGcmVxdWVuemEgZGVsbGUgb3NzZXJ2YXppb25pIHBlciBjaXR0w6AiKQ0KYGBgDQoNCg0KDQpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCg0KIyMjIDMuIElkZW50aWZpY2F6aW9uZSBkZWxsZSB2YXJpYWJpbGkgY29uIG1hZ2dpb3JlIHZhcmlhYmlsaXTDoCBlIGFzaW1tZXRyaWENCkRldGVybWluYTogLSBRdWFsIMOoIGxhIHZhcmlhYmlsZSBjb24gbGEgcGnDuSBhbHRhIHZhcmlhYmlsaXTDoCAtIFF1YWwgw6ggbGEgdmFyaWFiaWxlIGNvbiBsYSBkaXN0cmlidXppb25lIHBpw7kgYXNpbW1ldHJpY2ENCg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkoZHBseXIpDQoNCiMgUHJlcGFyYSBpIGRhdGkgaW4gZm9ybWF0byBsdW5nbw0KZGF0aV9sb25nIDwtIGRhdGkgJT4lDQogIHNlbGVjdChzYWxlcywgdm9sdW1lLCBtZWRpYW5fcHJpY2UsIGxpc3RpbmdzLCBtb250aHNfaW52ZW50b3J5KSAlPiUNCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBldmVyeXRoaW5nKCksIG5hbWVzX3RvID0gIlZhcmlhYmlsZSIsIHZhbHVlc190byA9ICJWYWxvcmUiKQ0KDQojIENhbGNvbGEgbGEgbWVkaWEgcGVyIG9nbmkgdmFyaWFiaWxlDQptZWRpZSA8LSBkYXRpX2xvbmcgJT4lDQogIGdyb3VwX2J5KFZhcmlhYmlsZSkgJT4lDQogIHN1bW1hcmlzZShNZWRpYSA9IG1lYW4oVmFsb3JlKSkNCg0KIyBDcmVhIGlsIGdyYWZpY28gY29uIGNvbG9yZSB1bmljbw0KZ2dwbG90KGRhdGlfbG9uZywgYWVzKHggPSBWYWxvcmUpKSArDQogIGdlb21fZGVuc2l0eShmaWxsID0gImdyZXk2MCIsIGFscGhhID0gMC42LCBjb2xvciA9ICJncmV5MzAiLCBsaW5ld2lkdGggPSAxKSArDQogIGdlb21fdmxpbmUoZGF0YSA9IG1lZGllLCBhZXMoeGludGVyY2VwdCA9IE1lZGlhKSwNCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICJibGFjayIsIGxpbmV3aWR0aCA9IDAuOCkgKw0KICBmYWNldF93cmFwKH5WYXJpYWJpbGUsIHNjYWxlcyA9ICJmcmVlIiwgbmNvbCA9IDIpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IE5VTEwpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJHcmFmaWNvIGRpc3RyaWJ1emlvbmUgZGVsbGUgdmFyaWFiaWxpIHF1YW50aXRhdGl2ZSIsDQogICAgeCA9ICIiLA0KICAgIHkgPSBOVUxMDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkNCiAgKQ0KYGBgDQoNCg0KDQoNCiMjIyBDb21tZW50aSBwdW50byAyIGUgcHVudG8gMzoNCg0KTGEgdmFyaWFiaWxlIGBjaXR5YCBwcmVzZW50YSB1bmEgZGlzdHJpYnV6aW9uZSB1bmlmb3JtZSwgY29uIGZyZXF1ZW56ZSBpZGVudGljaGUgcGVyIGNpYXNjdW5hIG1vZGFsaXTDoC5cYnINClF1ZXN0byBzdWdnZXJpc2NlIGNoZSBpbCBkYXRhc2V0IMOoIGJpbGFuY2lhdG8gcmlzcGV0dG8gYWxsYSByYXBwcmVzZW50YXppb25lIGRlbGxlIGNpdHTDoCBhbmFsaXp6YXRlLg0KDQpMYSB0YWJlbGxhICJJbmRpY2kgZGkgdmFyaWFiaWxpdMOgIiBlIGFzaW1tZXRyaWEgcGVyIHZhcmlhYmlsaSBxdWFudGl0YXRpdmUgbW9zdHJhIGludmVjZSBnbGkgaW5kaWNpIGRpIHZhcmlhYmlsaXTDoCBlIGRpIGZvcm1hIHBlciBjaW5xdWUgdmFyaWFiaWxpIHF1YW50aXRhdGl2ZSBkZWwgZGF0YXNldC4NCg0KLSAqKlZhcmlhYmlsaXTDoCoqOiBMZSB2YXJpYWJpbGkgYHZvbHVtZWAgZSBgbGlzdGluZ3NgIHByZXNlbnRhbm8gbGEgbWFnZ2lvcmUgZGlzcGVyc2lvbmUgcmVsYXRpdmEgKENWID0gMC41NCBlIDAuNDMpLCBpbmRpY2FuZG8gdW4nZWxldmF0YSBldGVyb2dlbmVpdMOgIHRyYSBsZSBvc3NlcnZhemlvbmkuIEFsIGNvbnRyYXJpbywgYG1lZGlhbl9wcmljZWAgcmlzdWx0YSBsYSBwacO5IHN0YWJpbGUgKENWID0gMC4xNyksIHN1Z2dlcmVuZG8gY2hlIGkgcHJlenppIG1lZGkgZGkgdmVuZGl0YSB2YXJpYW5vIG1lbm8gcmlzcGV0dG8gYWQgYWx0cmkgaW5kaWNhdG9yaS4NCg0KLSAqKkFzaW1tZXRyaWEgKFNrZXduZXNzKSoqOiBMZSB2YXJpYWJpbGkgYHNhbGVzYCwgYHZvbHVtZWAgZSBgbGlzdGluZ3NgIG1vc3RyYW5vIHVuYSAqKmFzaW1tZXRyaWEgcG9zaXRpdmEqKiwgY29uIHVuYSBjb2RhIHBpw7kgbHVuZ2EgdmVyc28gZGVzdHJhLiBRdWVzdG8gaW1wbGljYSBsYSBwcmVzZW56YSBkaSB2YWxvcmkgb2NjYXNpb25hbG1lbnRlIG1vbHRvIGVsZXZhdGkuIGBtZWRpYW5fcHJpY2VgIGhhIHVuYSAqKmFzaW1tZXRyaWEgbmVnYXRpdmEgbW9kZXJhdGEqKiAoLTAuMzYpLCBpbmRpY2FuZG8gdW5hIGxlZ2dlcmEgY29uY2VudHJhemlvbmUgZGkgdmFsb3JpIHBpw7kgYWx0aS4gYG1vbnRoc19pbnZlbnRvcnlgIMOoIHF1YXNpIHNpbW1ldHJpY2EgKHNrZXduZXNzIOKJiCAwKS4NCg0KLSAqKkZvcm1hIGRlbGxhIGRpc3RyaWJ1emlvbmUgKEt1cnRvc2lzKSoqOiBUdXR0ZSBsZSB2YXJpYWJpbGkgaGFubm8gdmFsb3JpIGRpIGt1cnRvc2lzIGNvbXByZXNpIHRyYSAyLjIgZSAzLjIsIHZpY2luaSBhIHF1ZWxsaSBkaSB1bmEgZGlzdHJpYnV6aW9uZSBub3JtYWxlIChrdXJ0b3NpcyA9IDMpLiBgdm9sdW1lYCBlIGBzYWxlc2Agc29ubyBsZWdnZXJtZW50ZSAqKmxlcHRvY3VydGljaGUqKiwgY29uIHVuYSBtYWdnaW9yZSBjb25jZW50cmF6aW9uZSBhdHRvcm5vIGFsbGEgbWVkaWEgZSBjb2RlIHBpw7kgcHJvbnVuY2lhdGUuXGJyDQoNCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KDQoNCg0KIyMjIDQuIENyZWF6aW9uZSBkaSBjbGFzc2kgcGVyIHVuYSB2YXJpYWJpbGUgcXVhbnRpdGF0aXZhDQpTZWxlemlvbmEgdW5hIHZhcmlhYmlsZSBxdWFudGl0YXRpdmEgKGVzLiBzYWxlcyBvIG1lZGlhbl9wcmljZSkgZSBzdWRkaXZpZGlsYSBpbiBjbGFzc2kuIENyZWEgdW5hIGRpc3RyaWJ1emlvbmUgZGkgZnJlcXVlbnplIGUgcmFwcHJlc2VudGEgaSBkYXRpIGNvbiB1biBncmFmaWNvIGEgYmFycmUuIENhbGNvbGEgbOKAmWluZGljZSBkaSBldGVyb2dlbmVpdMOgIEdpbmkgZSBkaXNjdXRpIGkgcmlzdWx0YXRpLg0KDQoNCmBgYHtyIGVjaG89RkFMU0V9DQojIFN1ZGRpdmlkZSAnc2FsZXMnIGluIGNsYXNzaQ0KYnJlYWtzIDwtIHByZXR0eShkYXRpJHNhbGVzLCBuID0gNCkNCmRhdGkgPC0gZGF0aSAlPiUNCiAgbXV0YXRlKHNhbGVzX2NsYXNzaSA9IGN1dChzYWxlcywgYnJlYWtzID0gYnJlYWtzLCBpbmNsdWRlLmxvd2VzdCA9IFRSVUUsIHJpZ2h0ID0gRkFMU0UpKQ0KDQojIENhbGNvbGEgbGEgZnJlcXVlbnphDQpmcmVxdWVuemUgPC0gZGF0aSAlPiUNCiAgY291bnQoc2FsZXNfY2xhc3NpKSAlPiUNCiAgbXV0YXRlKEZyZXF1ZW56YV9yZWxhdGl2YSA9IG4gLyBzdW0obikpDQoNCiMgR3JhZmljbyBhIGJhcnJlIGNvbiBldGljaGV0dGUNCmdncGxvdChmcmVxdWVuemUsIGFlcyh4ID0gc2FsZXNfY2xhc3NpLCB5ID0gbikpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIGZpbGwgPSAiZ3JleSIpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG4pLCB2anVzdCA9IC0wLjMsIHNpemUgPSA0KSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiRGlzdHJpYnV6aW9uZSBkZWxsZSB2ZW5kaXRlIFtzYWxlc10gcGVyIGNsYXNzaSIsDQogICAgeCA9ICJDbGFzc2kgZGkgc2FsZXMiLA0KICAgIHkgPSAiRnJlcXVlbnphIGFzc29sdXRhIg0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpDQogICkNCmBgYA0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KIyBmdW56aW9uZSBjYWxjb2xvIGluZGljZSBHaW5pDQpnaW5pLmluZGV4IDwtIGZ1bmN0aW9uKHgpIHsNCiAgeCA8LSBzb3J0KHgpICAgICAgICAgICAgICAjIE9yZGluYSBpIHZhbG9yaQ0KICBuIDwtIGxlbmd0aCh4KSAgICAgICAgICAgICMgTnVtZXJvIGRpIG9zc2VydmF6aW9uaQ0KICBHIDwtIHN1bSgoMiAqIDE6biAtIG4gLSAxKSAqIHgpIC8gKG4gKiBzdW0oeCkpICAjIEZvcm11bGEgR2luaQ0KICByZXR1cm4oRykNCn0NCg0KYGBgDQoNCkNhbGNvbGEgbOKAmWluZGljZSBkaSBldGVyb2dlbmVpdMOgIEdpbmkNCmBgYHtyIGVjaG89RkFMU0V9DQpnaW5pX3NhbGVzIDwtIGdpbmkuaW5kZXgoZGF0aSRzYWxlcykNCmNhdCgiR2luaSBpbmRleCBzYWxlcyA9Iiwgcm91bmQoZ2luaV9zYWxlcywgNCksICJcbiIpDQoNCmBgYA0KDQpDb21tZW50aTpcYnINCg0KVW4gdmFsb3JlIGRpIEdpbmkgcGFyaSBhIDAuMjMxMSBpbmRpY2EgdW5hIGRpc3VndWFnbGlhbnphIG1vZGVyYXRhLWJhc3NhIG5lbGxhIGRpc3RyaWJ1emlvbmUgZGVsbGUgdmVuZGl0ZS4gUXVlc3RvIHNpZ25pZmljYSBjaGUsIHB1ciBlc2lzdGVuZG8gZGlmZmVyZW56ZSB0cmEgbGUgb3NzZXJ2YXppb25pLCBsYSBtYWdnaW9yIHBhcnRlIGRlaSB2YWxvcmkgZGkgc2FsZXMgc2kgY29uY2VudHJhIGluIHVuIGludGVydmFsbG8gcmVsYXRpdmFtZW50ZSBvbW9nZW5lby4gTG8gY29uZmVybWEgYW5jaGUgaWwgZ3JhZmljbyBhIGJhcnJlOiBsYSBjbGFzc2UgKDEwMCwyMDApIGRvbWluYSBuZXR0YW1lbnRlLCBtZW50cmUgbGUgY2xhc3NpIGVzdHJlbWUgc29ubyBwb2NvIHJhcHByZXNlbnRhdGUuDQoNCg0KX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQoNCg0KIyMjIDUuIENhbGNvbG8gZGVsbGEgcHJvYmFiaWxpdMOgDQoNClF1YWwgw6ggbGEgcHJvYmFiaWxpdMOgIGNoZSwgcHJlc2EgdW5hIHJpZ2EgYSBjYXNvIGRpIHF1ZXN0byBkYXRhc2V0LCBlc3NhIHJpcG9ydGkgbGEgY2l0dMOgIOKAnEJlYXVtb2504oCdPyBFIGxhIHByb2JhYmlsaXTDoCBjaGUgcmlwb3J0aSBpbCBtZXNlIGRpIEx1Z2xpbz8gRSBsYSBwcm9iYWJpbGl0w6AgY2hlIHJpcG9ydGkgaWwgbWVzZSBkaSBkaWNlbWJyZSAyMDEyPw0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KDQojIE51bWVybyB0b3RhbGUgZGkgcmlnaGUNCm5fdG90YWxlIDwtIG5yb3coZGF0aSkNCg0KIyBQcm9iYWJpbGl0w6AgY2hlIGxhIGNpdHTDoCBzaWEgIkJlYXVtb250Ig0KcF9iZWF1bW9udCA8LSBzdW0oZGF0aSRjaXR5ID09ICJCZWF1bW9udCIpIC8gbl90b3RhbGUgKjEwMA0KDQojIFByb2JhYmlsaXTDoCBjaGUgaWwgbWVzZSBzaWEgTHVnbGlvIChtZXNlIDcpDQpwX2x1Z2xpbyA8LSBzdW0oZGF0aSRtb250aCA9PSA3KSAvIG5fdG90YWxlICogMTAwDQoNCiMgUHJvYmFiaWxpdMOgIGNoZSBpbCBtZXNlIHNpYSBkaWNlbWJyZSAyMDEyDQpwX2RpY2VtYnJlXzIwMTIgPC0gc3VtKGRhdGkkbW9udGggPT0gMTIgJiBkYXRpJHllYXIgPT0gMjAxMikgLyBuX3RvdGFsZSAqMTAwDQoNCiMgU3RhbXBhIGRlaSByaXN1bHRhdGkNCmNhdCgiUHJvYmFiaWxpdMOgIGNoZSBsYSBjaXR0w6Agc2lhIEJlYXVtb250ID0iLCByb3VuZChwX2JlYXVtb250LCAxKSwgIiVcbiIpDQpjYXQoIlByb2JhYmlsaXTDoCBjaGUgaWwgbWVzZSBzaWEgTHVnbGlvID0iLCByb3VuZChwX2x1Z2xpbywgMSksICIlXG4iKQ0KY2F0KCJQcm9iYWJpbGl0w6AgY2hlIGlsIG1lc2Ugc2lhIGRpY2VtYnJlIDIwMTIgPSIsIHJvdW5kKHBfZGljZW1icmVfMjAxMiwgMSksICIlXG4iKQ0KDQoNCmBgYA0KX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCiMjIDYuIENyZWF6aW9uZSBkaSBudW92ZSB2YXJpYWJpbGkNCg0KDQoNCmBgYHtyIGVjaG89RkFMU0V9DQpkYXRpIDwtIGRhdGkgJT4lDQogIG11dGF0ZShkYXRlID0gbWFrZV9kYXRlKHllYXIsIG1vbnRoLCAxKSkNCmBgYA0KDQoNCg0KQ3JlYSB1bmEgbnVvdmEgY29sb25uYSBjaGUgY2FsY29saSBpbCBwcmV6em8gbWVkaW8gZGVnbGkgaW1tb2JpbGkgdXRpbGl6emFuZG8gbGUgdmFyaWFiaWxpIGRpc3BvbmliaWxpXGJyDQoNCkxhIHNlZ3VlbnRlIHRhYmVsbGEgbW9zdHJhIGkgcHJpbWkgNSByZWNvcmQgZGVsbGEgbnVvdmEgY29sb25uYSBgcHJlenpvX21lZGlvYGRlbCBkYXRhZnJhbWUgY2hlIGNvbnRpZW5lIHByZXp6b19tZWRpbyA9IHZvbHVtZS9zYWxlcw0KYGBge3IgZWNobz1GQUxTRX0NCmRhdGkgPC0gZGF0aSAlPiUNCiAgbXV0YXRlKHByZXp6b19tZWRpbyA9IHJvdW5kKCh2b2x1bWUgLyBzYWxlcykgKiAxZTYsMCkpDQpkYXRpICU+JQ0KICBzZWxlY3QocHJlenpvX21lZGlvKSAlPiUNCiAgaGVhZCg1KSAlPiUNCiAga2FibGUoYWxpZ24gPSAibCIpICU+JQ0KICBrYWJsZV9zdHlsaW5nKCkNCg0KYGBgDQoNCg0KDQoNCg0KX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCg0KUHJvdmEgYSBjcmVhcmUgdW5hIGNvbG9ubmEgY2hlIG1pc3VyaSBs4oCZZWZmaWNhY2lhIGRlZ2xpIGFubnVuY2kgZGkgdmVuZGl0YS4gQ29tbWVudGEgZSBkaXNjdXRpIGkgcmlzdWx0YXRpDQpMYSBzZWd1ZW50ZSB0YWJlbGxhIG1vc3RyYSBpIHByaW1pIDUgcmVjb3JkIGRlbGxhIG51b3ZhIGNvbG9ubmEgYGVmZmljYWNpYV9hbm51bmNpb2AgZGVsIGRhdGFmcmFtZSBjaGUgY29udGllbnRlIGlsIHByZXp6b19tZWRpbyA9IHZvbHVtZS9zYWxlcw0KDQpRdWVzdGEgbWV0cmljYSBpbmRpY2EgcXVhbnRpIGltbW9iaWxpIHNvbm8gc3RhdGkgdmVuZHV0aSByaXNwZXR0byBhbCBudW1lcm8gZGkgYW5udW5jaSBhdHRpdmkuIEluIGFsdHJlIHBhcm9sZToNCg0KVmFsb3JpIHZpY2luaSBhIDEg4oaSIHF1YXNpIG9nbmkgYW5udW5jaW8gaGEgcG9ydGF0byBhIHVuYSB2ZW5kaXRhIOKGkiBtb2x0byBlZmZpY2FjZQ0KDQpWYWxvcmkgPCAxIOKGkiBub24gdHV0dGkgZ2xpIGFubnVuY2kgaGFubm8gZ2VuZXJhdG8gdmVuZGl0ZSDihpIgbWVubyBlZmZpY2FjZQ0KDQoNCg0KYGBge3IgZWNobz1GQUxTRX0NCmRhdGkgPC0gZGF0aSAlPiUNCiAgbXV0YXRlKGVmZmljYWNpYV9hbm51bmNpbyA9IGlmZWxzZShsaXN0aW5ncyA+IDAsIHNhbGVzIC8gbGlzdGluZ3MsIE5BKSkNCmRhdGkgJT4lDQogIHNlbGVjdChlZmZpY2FjaWFfYW5udW5jaW8pICU+JQ0KICBoZWFkKDUpICU+JQ0KICBrYWJsZShhbGlnbiA9ICJsIikgJT4lDQogIGthYmxlX3N0eWxpbmcoKQ0KDQpgYGANCg0KQ29sb25uYSBjcmVhdGEgbmVsIGRhdGFzZXQgY29tZSBkYSBpbW1hZ2luZS4gXGJyDQoNCkxhIG51b3ZhIHZhcmlhYmlsZSDDqCBzdGF0YSBzdWJpdG8gdXRpbGl6emF0YSBwZXIgY3JlYXJlIGlsIGdyYWZpY28gImVmZmljYWNpYSBkZWdsIGFubnVuY2kgcGVyIGNpdHTDoCIuDQoNCg0KSWwgc2VndWVudGUgZ3JhZmljbyBkZWxsJ2VmZmljYWNpYSBkZWdsaSBhbm51bmNpIHBlciBjaXR0w6AgbW9zdHJhIGluZmF0dGkgY29tZSBnbGkgYW5udW5jaSBzaWFubyBtZWRpYW1lbnRlIHBpw7kgZWZmaWNhY2kgbmVsbGEgY2l0dMOgIGRpIGBCcnlhbi1Db2xsYWdlIFN0YXRpb25gDQpgYGB7ciBlY2hvPUZBTFNFIH0NCg0KZ2dwbG90KGRhdGksIGFlcyh4ID0gY2l0eSwgeSA9IGVmZmljYWNpYV9hbm51bmNpbykpICsNCiAgZ2VvbV9ib3hwbG90KCkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBsYWJzKHRpdGxlID0gIkVmZmljYWNpYSBkZWdsaSBhbm51bmNpIHBlciBjaXR0w6AiLCB5ID0gIlZlbmRpdGUgLyBBbm51bmNpIikNCg0KYGBgDQoNCg0KDQoNCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KDQojIyA3LiBBbmFsaXNpIGNvbmRpemlvbmF0YQ0KDQoNClVzYSBpbCBwYWNjaGV0dG8gZHBseXIgbyBpbCBsaW5ndWFnZ2lvIGJhc2UgZGkgUiBwZXIgZWZmZXR0dWFyZSBhbmFsaXNpIHN0YXRpc3RpY2hlIGNvbmRpemlvbmF0ZSBwZXIgY2l0dMOgLCBhbm5vIGUgbWVzZS4gR2VuZXJhIGRlaSBzdW1tYXJ5IChtZWRpYSwgZGV2aWF6aW9uZSBzdGFuZGFyZCkgZSByYXBwcmVzZW50YSBncmFmaWNhbWVudGUgaSByaXN1bHRhdGkuDQoNCg0KIyMjIyA3LjEgU3RhdGlzdGljaGUgY29uZGl6aW9uYXRlIHBlciBjaXR0w6ANCg0KDQotLUlsIGdyYWZpY28gbWV0dGUgYSBjb25mcm9udG8gaWwgcHJlenpvIG1lZGlvIHBlciBvZ25pIENpdHTDoC4gTGEgY2l0dMOgIGRpIGBCcnlhbi1Db2xsZWdlIFN0YXRpb25gIHJpc3VsdGEgbGEgY2l0dMOgIGNvbiBpbCBwcmV6em8gbWVkaW8gcGnDuSBhbHRvLlxicg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0Kc3RhdGlzdGljaGVfY2l0dGEgPC0gZGF0aSAlPiUNCiAgZ3JvdXBfYnkoY2l0eSkgJT4lDQogIHN1bW1hcmlzZShtZWFuX3ByaWNlID0gbWVhbihtZWRpYW5fcHJpY2UpLCBzZF9wcmljZSA9IHNkKG1lZGlhbl9wcmljZSkpDQoNCnByaW50KHN0YXRpc3RpY2hlX2NpdHRhKQ0KDQpnZ3Bsb3Qoc3RhdGlzdGljaGVfY2l0dGEsIGFlcyh4ID0gcmVvcmRlcihjaXR5LCBtZWFuX3ByaWNlKSwgeSA9IG1lYW5fcHJpY2UpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBmaWxsID0gImdyZXkiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiR3JhZmljbyBwcmV6em8gbWVkaW8gcGVyIGNpdHTDoCIsDQogICAgeCA9ICJDaXR0w6AiLA0KICAgIHkgPSAiUHJlenpvIG1lZGlvIg0KICApICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkNCg0KYGBgDQoNCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KDQojIyMjIDcuMiBTdGF0aXN0aWNoZSBjb25kaXppb25hdGUgcGVyIGFubm8NCg0KLS1JbCBncmFmaWNvIG1vc3RyYSBsJ2FuZGFtZW50byBkZWwgcHJlenpvIG1lZGlvIHN1IGJhc2UgYW5udWEuXGJyDQoNCkwnYW5kYW1lbnRvIHN1YmlzY2UgdW4gcmliYXNzbyBkYWwgMjAxMCBhbCAyMDExIHBlciBwb2kgcmlwcmVuZGVyZSBpbiBjcmVzY2VudGUgZmlubyBhbCBgMjAxNGBcYnINCg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0Kc3RhdGlzdGljaGVfYW5ubyA8LSBkYXRpICU+JQ0KICBncm91cF9ieSh5ZWFyKSAlPiUNCiAgc3VtbWFyaXNlKG1lYW5fcHJpY2UgPSBtZWFuKG1lZGlhbl9wcmljZSksIHNkX3ByaWNlID0gc2QobWVkaWFuX3ByaWNlKSkNCg0KcHJpbnQoc3RhdGlzdGljaGVfYW5ubykNCg0KDQpnZ3Bsb3Qoc3RhdGlzdGljaGVfYW5ubywgYWVzKHggPSB5ZWFyLCB5ID0gbWVhbl9wcmljZSkpICsNCiAgZ2VvbV9saW5lKGNvbG9yID0gImdyYXkiLCBzaXplID0gMS4yKSArDQogIGdlb21fcG9pbnQoY29sb3IgPSAiIzJjN2ZiOCIsIHNpemUgPSAyKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSByb3VuZChtZWFuX3ByaWNlLCAwKSksIHZqdXN0ID0gLTAuNSwgc2l6ZSA9IDMuNSkrDQogIHRoZW1lX21pbmltYWwoKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiR3JhZmljbyBwcmV6em8gbWVkaW8gcGVyIGFubm8iLA0KICAgIHggPSAiQW5ubyIsDQogICAgeSA9ICJQcmV6em8gbWVkaW8iDQogICkNCg0KDQoNCmBgYA0KDQoNCg0KDQoNCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KDQojIyMjIDcuMyBTdGF0aXN0aWNoZSBjb25kaXppb25hdGUgcGVyIG1lc2UNCg0KLS1JbCBncmFmaWNvIG1vc3RyYSBsJ2FuZGFtZW50byBkZWwgcHJlenpvIG1lZGlvIHN1IGJhc2UgbWVuc2lsZSBwZXIgZXZpZGVuemlhcmUgdW5hICJ2YXJpYXppb25lIHN0YWdpb25hbGUiXGJyDQoNCklsIGdyYWZpY28gbW9zdHJhIHVuIHRyZW5kIGFsIHJpYWx6byBkZWwgcHJlenppIG1lZGkgYSBwYXJ0aXJlIGRhIEFwcmlsZS4gSSBtZXNpIGluaXppYWxpIHNvbm8gcXVlbGxpIGNvbiBpbCBwcmV6em8gbWVkaW8gaW5mZXJpb3JlIHJpc3BldHRvIG5lbGwnYW5uby5cYnINCg0KKipHaXVnbm8qKiDDqCBpbCBtZXNlIGNvbiBpbCBwaWNjbyBkaSBwcmV6em8gbWVkaW8gcMO5IGFsdG8NCg0KDQoNCg0KYGBge3IgZWNobz1GQUxTRX0NCnN0YXRpc3RpY2hlX21lc2UgPC0gZGF0aSAlPiUNCiAgZ3JvdXBfYnkobW9udGgsIG1vbnRoX25hbWUpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgbWVhbl9wcmljZSA9IG1lYW4obWVkaWFuX3ByaWNlLCBuYS5ybSA9IFRSVUUpLA0KICAgIHNkX3ByaWNlID0gc2QobWVkaWFuX3ByaWNlLCBuYS5ybSA9IFRSVUUpDQogICkgJT4lDQogIGFycmFuZ2UobW9udGgpDQoNCnByaW50KHN0YXRpc3RpY2hlX21lc2UpDQoNCmdncGxvdChzdGF0aXN0aWNoZV9tZXNlLCBhZXMoeCA9IGZhY3Rvcihtb250aF9uYW1lLCBsZXZlbHMgPSBtb250aC5uYW1lKSwgeSA9IG1lYW5fcHJpY2UsIGdyb3VwID0gMSkpICsNCiAgZ2VvbV9saW5lKGNvbG9yID0gImdyYXkiLCBzaXplID0gMS4yKSArDQogIGdlb21fcG9pbnQoY29sb3IgPSAiIzJjN2ZiOCIsIHNpemUgPSAyKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiUHJlenpvIG1lZGlvIHBlciBtZXNlIiwNCiAgICB4ID0gIk1vbnRoIiwNCiAgICB5ID0gIlByZXp6byBtZWRpbyINCiAgKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpDQoNCg0KYGBgDQoNCg0KDQpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KDQoNCiMjIDguIENyZWF6aW9uZSBkaSB2aXN1YWxpenphemlvbmkgY29uIGdncGxvdDINCg0KDQojIyMgVmlzdWFsIDE6IENvbmZyb250byB2b2x1bWUgZmF0dHVyYXRvIGRlcml2YW50ZSBkYWxsZSB2ZW5kaXRlIChZb1kpDQoNCg0KYGBge3IgZWNobz1GQUxTRX0NCnZlbmRpdGVfYW5udWFsaSA8LSBkYXRpICU+JQ0KICBncm91cF9ieSh5ZWFyKSAlPiUNCiAgc3VtbWFyaXNlKHZvbHVtZV9taWxpb25pID0gc3VtKHNhbGVzLCBuYS5ybSA9IFRSVUUpKQ0KDQpnZ3Bsb3QodmVuZGl0ZV9hbm51YWxpLCBhZXMoeCA9IGZhY3Rvcih5ZWFyKSwgeSA9IHZvbHVtZV9taWxpb25pKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgZmlsbCA9ICJncmF5IikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQodm9sdW1lX21pbGlvbmksIDEpKSwgdmp1c3QgPSAtMC41LCBzaXplID0gMykgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlZvbHVtZSB2ZW5kaXRlIGFubnVhbGkgKG1pbGlvbmkgZGkgJCkiLA0KICAgIHggPSAiQW5ubyIsDQogICAgeSA9ICJWb2x1bWUgdG90YWxlIChtaWxpb25pIGRpICQpIg0KICApDQoNCmBgYA0KDQoNCmlsICoqMjAxNCoqIMOoIGwnYW5ubyBjb24gaWwgdm9sdW1lIHBpw7kgYWx0byBkaSB2ZW5kaXRlIGVzcHJlc3NlIGluIG1pbGlvbmkgZGkgZG9sbGFyaQ0KDQpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KIyMjIFZpc3VhbCAyOiBDb25mcm9udG8gZGVsbGUgdmVuZGl0ZSBNb00gKGZpbHRyYWJpbGUgcGVyIGFubm8pDQoNCg0KYGBge3IgZWNobz1GQUxTRX0NCmRhdGkgPC0gZGF0aSAlPiUNCiAgbXV0YXRlKA0KICAgIG1vbnRoX25hbWUgPSBmYWN0b3IobW9udGgubmFtZVttb250aF0sIGxldmVscyA9IG1vbnRoLm5hbWUpLA0KICAgIHllYXIgPSBhcy5jaGFyYWN0ZXIoeWVhcikNCiAgKQ0KDQpzaGFyZWRfZGF0aSA8LSBTaGFyZWREYXRhJG5ldyhkYXRpKQ0KDQpic2NvbHMoDQogIHdpZHRocyA9IGMoNiwgMTIpLA0KICBmaWx0ZXJfc2VsZWN0KCJhbm5vIiwgIlNlbGV6aW9uYSBhbm5vOiIsIHNoYXJlZF9kYXRpLCB+eWVhciksDQogIHBsb3RfbHkoc2hhcmVkX2RhdGksIHggPSB+bW9udGhfbmFtZSwgeSA9IH5zYWxlcywgdHlwZSA9ICJiYXIiLA0KICAgICAgICAgIG1hcmtlciA9IGxpc3QoY29sb3IgPSAiZ3JheSIpKSAlPiUNCiAgICBsYXlvdXQodGl0bGUgPSAiVG90YWxlIHZlbmRpdGUgbWVuc2lsaSIsIHhheGlzID0gbGlzdCh0aXRsZSA9ICJNZXNlIiwgdGlja2FuZ2xlID0gNDUpKQ0KKQ0KYGBgDQoNCklsIGdyYWZpY28gbW9zdHJhIGNoZSAqKm5laSBtZXNpIGNlbnRyYWxpIGRlbGwnYW5ubyoqIHNvbm8gY29uY2VudHJhdGUgcGnDuSB2ZW5kaXRlLg0KKipHaXVnbm8qKiDDqCBpbCBtZXNlIFRvcC4gKipHZW5uYWlvKiogaWwgbWVzZSBwZWdnaW9yZQ0KDQpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KDQojIyMgVmlzdWFsIDM6IEFuZGFtZW50byBkZWxsZSB2ZW5kaXRlIHBlciBjaXR0w6AgZSBuZWwgdGVtcG8NCg0KSWwgZ3JhZmljbyBtb3N0cmEgY2hlICoqVHlsZXIqKiDDqCBsYSB0b3AgY2l0eSBwZXIgdmVuZGl0ZSBkaSBzZW1wcmUNCmBgYHtyfQ0KdmVuZGl0ZV9wZXJfY2l0dGEgPC0gZGF0aSAlPiUNCiAgZ3JvdXBfYnkoY2l0eSkgJT4lDQogIHN1bW1hcmlzZSh2ZW5kaXRlX3RvdGFsaSA9IHN1bShzYWxlcywgbmEucm0gPSBUUlVFKSkgJT4lDQogIGFycmFuZ2UoZGVzYyh2ZW5kaXRlX3RvdGFsaSkpDQoNCmdncGxvdCh2ZW5kaXRlX3Blcl9jaXR0YSwgYWVzKHggPSByZW9yZGVyKGNpdHksIHZlbmRpdGVfdG90YWxpKSwgeSA9IHZlbmRpdGVfdG90YWxpKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgZmlsbCA9ICJncmF5IikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQodmVuZGl0ZV90b3RhbGksIDApKSwgaGp1c3QgPSAxLjksIGNvbG9yID0gIndoaXRlIiwgZm9udGZhY2UgPSAiYm9sZCIpKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlRvdGFsZSB2ZW5kaXRlIHBlciBjaXR0w6AiLA0KICAgIHggPSAiQ2l0dMOgIiwNCiAgICB5ID0gIlRvdGFsZSB2ZW5kaXRlIg0KICApICsNCiAgY29vcmRfZmxpcCgpDQoNCg0KYGBgDQoNCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCg0KDQojIyMgVmlzdWFsIDQ6IEFuZGFtZW50byBkZWxsZSB2ZW5kaXRlIHBlciBjaXR0w6AgZSBuZWwgdGVtcG8NCklsIGdyYWZpY28gaW50ZXJhdHRpdm8gbW9zdHJhIGwnYW5kYW1lbnRvIGRlbGxlIHZlbmRpdGUgcGVyIGNpdHTDoCBuZWwgdGVtcG8gZWQgZWZmZXR0dWFyZSBldmVudHVhbGkgcHJldmlzaW9uaSBmdXR1cmVcYnINCg0KTGEgY2l0dMOgIGRpICoqVHlsZXIqKiBzdG9yaWNhbWVudGUgw6ggcXVlbGxhIGNvbiB2ZW5kaXRlIG1hZ2dpb3JpIGFuY2hlIHNlIHN1cGVyYXRhIG5lbCBMdWdsaW8gMjAxMyBkYSAqKkJyeWFuLUNvbGxhZ2UgU3RhdGlvbioqDQoNCmBgYHtyIGVjaG89RkFMU0V9DQojIENyZWEgdW4gb2dnZXR0byBjb25kaXZpc28gcGVyIGludGVyYXR0aXZpdMOgDQpzaGFyZWRfZGF0aSA8LSBTaGFyZWREYXRhJG5ldyhkYXRpKQ0KDQojIEZpbHRybyBpbnRlcmF0dGl2byBwZXIgY2l0dMOgDQpic2NvbHMoDQogIHdpZHRocyA9IGMoNiwgMTIpLA0KICBmaWx0ZXJfc2VsZWN0KCJjaXR5IiwgIlNlbGV6aW9uYSBjaXR0w6A6Iiwgc2hhcmVkX2RhdGksIH5jaXR5KSwNCiAgcGxvdF9seShzaGFyZWRfZGF0aSwgeCA9IH5kYXRlLCB5ID0gfnNhbGVzLCBjb2xvciA9IH5jaXR5LCB0eXBlID0gInNjYXR0ZXIiLCBtb2RlID0gImxpbmVzIikgJT4lDQogICAgbGF5b3V0KHRpdGxlID0gIkFuZGFtZW50byB2ZW5kaXRlIG5lbCB0ZW1wbyBwZXIgY2l0dMOgIikNCikNCmBgYA0KDQoNCg0KX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCg0KIyMjIFZpc3VhbCA1OiBBbmRhbWVudG8gZGVsbGUgdmVuZGl0ZSBwZXIgY2l0dMOgIHN1IGJhc2UgbWVuc2lsZQ0KSWwgZ3JhZmljbyBpbnRlcmF0dGl2byBtb3N0cmEgbGEgZGlzdHJpYnV6aW9uZSBkZWwgdG90YWxlIHZlbmRpdGUgZGVsbGUgY2l0dMOgIHN1IGJhc2UgbWVuc2lsZQ0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KZGF0aSA8LSBkYXRpICU+JQ0KICBtdXRhdGUoeWVhciA9IGFzLmludGVnZXIoeWVhcikpDQoNCnNoYXJlZF9kYXRpIDwtIFNoYXJlZERhdGEkbmV3KGRhdGkgJT4lIG11dGF0ZSh5ZWFyID0gYXMuaW50ZWdlcih5ZWFyKSkpDQoNCg0KIyBGaWx0cm8gcGVyIGFubm8gKyBncmFmaWNvIHN0YWNrZWQNCmJzY29scygNCiAgd2lkdGhzID0gYyg2LCAxMiksDQogIGZpbHRlcl9zZWxlY3QoImFubm8iLCAiU2VsZXppb25hIGFubm86Iiwgc2hhcmVkX2RhdGksIH55ZWFyKSwNCiAgcGxvdF9seShzaGFyZWRfZGF0aSwgeCA9IH5tb250aF9uYW1lLCB5ID0gfm1lZGlhbl9wcmljZSwgY29sb3IgPSB+Y2l0eSwgdHlwZSA9ICJiYXIiKSAlPiUNCiAgICBsYXlvdXQoYmFybW9kZSA9ICJzdGFjayIsIHRpdGxlID0gIlRvdGFsZSB2ZW5kaXRlIG1lbnNpbGkgcGVyIGNpdHTDoCIpDQopDQpgYGANCg0KDQpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KDQoNCg0KIyMjIFZpc3VhbCA2OiBBbmRhbWVudG8gcHJlenpvIG1lZGlvIG5lbCB0ZW1wbyAoZmlsdHJhYmlsZSBwZXIgYW5ubykNCg0KSWwgZ3JhZmljbyBpbnRlcmF0dGl2byBtb3N0cmEgaWwgdHJlbmQgZGVsIHByZXp6byBtZWRpbyBuZWwgdGVtcG8gcGVyIGluZGl2aWR1YXJlIGNhbGkgbyBhdW1lbnRpIG5lbCBwZXJpb2RvIGVkIGVmZmV0dHVhcmUgZXZlbnR1YWxpIHByZXZpc2lvbmkgZnV0dXJlDQoNCmBgYHtyIGVjaG89RkFMU0V9DQoNCiMgQ3JlYSB1biBvZ2dldHRvIGNvbmRpdmlzbyBwZXIgaW50ZXJhdHRpdml0w6ANCnNoYXJlZF9kYXRpIDwtIFNoYXJlZERhdGEkbmV3KGRhdGkpDQoNCiMgRmlsdHJvIGludGVyYXR0aXZvIHBlciBjaXR0w6ANCmJzY29scygNCiAgd2lkdGhzID0gYyg2LCAxMiksDQogIGZpbHRlcl9zZWxlY3QoImNpdHkiLCAiU2VsZXppb25hIGNpdHTDoDoiLCBzaGFyZWRfZGF0aSwgfmNpdHkpLA0KICBwbG90X2x5KHNoYXJlZF9kYXRpLCB4ID0gfmRhdGUsIHkgPSB+cHJlenpvX21lZGlvLCBjb2xvciA9IH5jaXR5LCB0eXBlID0gInNjYXR0ZXIiLCBtb2RlID0gImxpbmVzIikgJT4lDQogICAgbGF5b3V0KHRpdGxlID0gIkFuZGFtZW50byBwcmV6em8gbWVkaW8gbmVsIHRlbXBvIikNCikNCmBgYA0KDQpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCg0KIyMjIFZpc3VhbCA3OiBDb25mcm9ubyBwcmV6em8gbWVkaW8gcGVyIGNpdHTDoA0KSWwgZ3JhZmljbyBtZXR0ZSBhIGNvbmZyb250byBpbCBwcmV6em8gbWVkaW8gZGVsbGUgY2l0dMOgLlxicg0KDQoqKkJyeWFuLUNvbGxhZ2UgU3RhdGlvbioqIHJpc3VsdGEgbGEgY2l0dMOgIGNvbiBpbCBwcmV6em8gbWVkaW8gcGnDuSBhbHRvDQoNCmBgYHtyIGVjaG89RkFMU0V9DQpnZ3Bsb3QoZGF0aSwgYWVzKHggPSBjaXR5LCB5ID0gcHJlenpvX21lZGlvKSkgKw0KICBnZW9tX2JveHBsb3QoZmlsbCA9IE5BLCBjb2xvciA9ICJncmF5MzAiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiUHJlenpvIG1lZGlvIHBlciBjaXR0w6AiLA0KICAgIHggPSAiQ2l0dMOgIiwNCiAgICB5ID0gIlByZXp6byBtZWRpbyAoaW4gJCkiDQogICkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQ0KDQpgYGANCg0KDQoNCiMjIyBWaXN1YWwgODogQ29ycmVsYXppb25lIHRyYSBsZSB2YXRpYWJpbGkgYW5udW5jaSBlIHZlbmRpdGUgZGkgY2FzYVxicg0KDQpDJ8OoIHVuYSByZWxhemlvbmUgcG9zaXRpdmEgdHJhIGFubnVuY2kgZSB2ZW5kaXRlOiBwacO5IGFubnVuY2ksIHBpw7kgdmVuZGl0ZSAuXGJyDQoNCklsIHZhbG9yZSByID0gMC42MiBpbmRpY2EgdW5hIGJ1b25hIGNvcnJlbGF6aW9uZSwgbWEgbm9uIHBlcmZldHRhXGJyDQoNCklsIHAtdmFsdWUgbW9sdG8gYmFzc28gY29uZmVybWEgY2hlIGxhIGNvcnJlbGF6aW9uZSBub24gw6ggZG92dXRhIGFsIGNhc28NCg0KYGBge3IgZWNobz1GQUxTRX0NCmdncGxvdChkYXRpLCBhZXMoeCA9IGxpc3RpbmdzLCB5ID0gc2FsZXMpKSArDQogIGdlb21fcG9pbnQoY29sb3IgPSAiIzJjN2ZiOCIsIHNpemUgPSAyLCBhbHBoYSA9IDAuNikgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFLCBjb2xvciA9ICJncmF5NDAiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiQ29ycmVsYXppb25lIHRyYSBhbm51bmNpIGF0dGl2aSBlIHZlbmRpdGUgZGkgY2FzZSIsDQogICAgeCA9ICJBbm51bmNpIGF0dGl2aSIsDQogICAgeSA9ICJWZW5kaXRlIGRpIGNhc2UiDQogICkNCg0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0V9DQpjb3IudGVzdChkYXRpJGxpc3RpbmdzLCBkYXRpJHNhbGVzKQ0KDQpgYGANCg0KX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCg0KIyMgQWRkLW9uIGluc2lnaHQNCg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KdGVtcG9fbWVkaW9fdmVuZGl0YSA8LSBtZWFuKGRhdGkkbW9udGhzX2ludmVudG9yeSwgbmEucm0gPSBUUlVFKQ0KY2F0KCLij7HvuI8gSWwgdGVtcG8gbWVkaW8gcGVyIHZlbmRlcmUgbGUgaW5zZXJ6aW9uaSDDqDoiLCByb3VuZCh0ZW1wb19tZWRpb192ZW5kaXRhLCAyKSwgIm1lc2lcbiIpDQoNCmBgYA0KTmVsbGEgY2l0dMOgIGRpIFR5bGVyIG1lZGlhbWVudGUgc2kgaW1waWVnYSBwacO5IHRlbXBvIGEgdmVuZGVyZSBnbGkgaW1tb2JpbGkgKDExLjMgbWVzaSksIG1lbnRyZSAqKkJyeWFuLUNvbGxhZ2UgU3RhdGlvbioqIMOoIHF1ZWxsYSBjb24gbWVkaWFtZW50ZSBtaW5vciB0ZW1wbyg3LjUgbWVzaSkgIC4gDQoNCmBgYHtyIGVjaG89RkFMU0V9DQpkYXRpICU+JQ0KICBncm91cF9ieShjaXR5KSAlPiUNCiAgc3VtbWFyaXNlKHRlbXBvX21lZGlvID0gbWVhbihtb250aHNfaW52ZW50b3J5LCBuYS5ybSA9IFRSVUUpKSAlPiUNCiAgYXJyYW5nZShkZXNjKHRlbXBvX21lZGlvKSkNCg0KYGBgDQpgYGB7cn0NCiMgQ2FsY29sbyBkZWwgdGVtcG8gbWVkaW8gcGVyIGNpdHTDoA0KdGVtcG9fbWVkaW8gPC0gZGF0aSAlPiUNCiAgZ3JvdXBfYnkoY2l0eSkgJT4lDQogIHN1bW1hcmlzZSh0ZW1wb19tZWRpb19tZXNpID0gbWVhbihtb250aHNfaW52ZW50b3J5LCBuYS5ybSA9IFRSVUUpKSAlPiUNCiAgYXJyYW5nZShkZXNjKHRlbXBvX21lZGlvX21lc2kpKQ0KDQojIEdyYWZpY28gYSBiYXJyZSBvcml6em9udGFsaQ0KZ2dwbG90KHRlbXBvX21lZGlvLCBhZXMoeCA9IHJlb3JkZXIoY2l0eSwgdGVtcG9fbWVkaW9fbWVzaSksIHkgPSB0ZW1wb19tZWRpb19tZXNpKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgZmlsbCA9ICJncmF5IikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQodGVtcG9fbWVkaW9fbWVzaSwgMikpLCBoanVzdCA9IDEuMSwgY29sb3IgPSAid2hpdGUiLCBmb250ZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDMuNSkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlRlbXBvIG1lZGlvIGRpIHZlbmRpdGEgcGVyIGNpdHTDoCIsDQogICAgeCA9ICJDaXR0w6AiLA0KICAgIHkgPSAiVGVtcG8gbWVkaW8gKG1lc2kpIg0KICApICsNCiAgY29vcmRfZmxpcCgpDQoNCg0KYGBgDQpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KDQojIENvbmNsdXNpb25pIGZpbmFsaSBkZWwgcHJvZ2V0dG86DQoNCg0KLSBgZGF0YSBzZXRgDQogIC0gKipEaXN0cmlidXppb25lKio6IGlsIGRhdGEgc2V0IG9nZ2V0dG8gZGkgYW5hbGlzaSDDqCBlcXVhbWVudGUgYmlsYW5jaWF0by4gSSBkYXRpIG9zc2VydmFiaWxpIHNvbm8gbnVtZXJpY2FtZW50ZSBlcXVpIHBlciBvZ25pIGNpdHTDoA0KICAtICoqVmFyaWFiaWxpdMOgKio6IExlIHZhcmlhYmlsaSB2b2x1bWUgZSBsaXN0aW5ncyBwcmVzZW50YW5vIGxhIG1hZ2dpb3JlIGRpc3BlcnNpb25lIHJlbGF0aXZhIChDViA9IDAuNTQgZSAwLjQzKSwgaW5kaWNhbmRvIHVu4oCZZWxldmF0YSBldGVyb2dlbmVpdMOgIHRyYSBsZSBvc3NlcnZhemlvbmkuIEFsIGNvbnRyYXJpbywgbWVkaWFuX3ByaWNlIHJpc3VsdGEgbGEgcGnDuSBzdGFiaWxlIChDViA9IDAuMTcpLCBzdWdnZXJlbmRvIGNoZSBpIHByZXp6aSBtZWRpIGRpIHZlbmRpdGEgdmFyaWFubyBtZW5vIHJpc3BldHRvIGFkIGFsdHJpIGluZGljYXRvcmkNCiAgLSAqKkFzaW1tZXRyaWEqKiAoU2tld25lc3MpOiBMZSB2YXJpYWJpbGkgc2FsZXMsIHZvbHVtZSBlIGxpc3RpbmdzIG1vc3RyYW5vIHVuYSBhc2ltbWV0cmlhIHBvc2l0aXZhLCBjb24gdW5hIGNvZGEgcGnDuSBsdW5nYSB2ZXJzbyBkZXN0cmEuIFF1ZXN0byBpbXBsaWNhIGxhIHByZXNlbnphIGRpIHZhbG9yaSBvY2Nhc2lvbmFsbWVudGUgbW9sdG8gZWxldmF0aS4gbWVkaWFuX3ByaWNlIGhhIHVuYSBhc2ltbWV0cmlhIG5lZ2F0aXZhIG1vZGVyYXRhICgtMC4zNiksIGluZGljYW5kbyB1bmEgbGVnZ2VyYSBjb25jZW50cmF6aW9uZSBkaSB2YWxvcmkgcGnDuSBhbHRpLiBtb250aHNfaW52ZW50b3J5IMOoIHF1YXNpIHNpbW1ldHJpY2EgKHNrZXduZXNzIOKJiCAwKQ0KICAtICoqRm9ybWEgZGVsbGEgZGlzdHJpYnV6aW9uZSAoS3VydG9zaXMpKio6IFR1dHRlIGxlIHZhcmlhYmlsaSBoYW5ubyB2YWxvcmkgZGkga3VydG9zaXMgY29tcHJlc2kgdHJhIDIuMiBlIDMuMiwgdmljaW5pIGEgcXVlbGxpIGRpIHVuYSBkaXN0cmlidXppb25lIG5vcm1hbGUgKGt1cnRvc2lzID0gMykuIHZvbHVtZSBlIHNhbGVzIHNvbm8gbGVnZ2VybWVudGUgbGVwdG9jdXJ0aWNoZSwgY29uIHVuYSBtYWdnaW9yZSBjb25jZW50cmF6aW9uZSBhdHRvcm5vIGFsbGEgbWVkaWEgZSBjb2RlIHBpw7kgcHJvbnVuY2lhdGUuDQoNCg0KLSBgQW5hbGlzaSB2YWxvcmUgZGVnbGkgaW1tb2JpbGkgYA0KICAtICoqUHJlenpvIG1lZGlvIGltbW9iaWxpIHBlciBjaXR0w6AqKjogQnJ5YW4tQ29sbGVnZSBTdGF0aW9uIHJpc3VsdGEgbGEgY2l0dMOgIGNvbiBpbCBwcmV6em8gbWVkaW8gcGnDuSBhbHRvLiBQcm9iYWJpbG1lbnRlIGNpw7Igw6ggZ2l1c3RpZmljYXRvIGRhIHVuYSBwb3NpemlvbmUgc3RyYXRlZ2ljYSBhIHJpZG9zc28gZGVsbGEgc3RhemlvbmUgZSBkYWwgQ29sbGFnZS4NCiAgLSAqKkFuZGFtZW50byBkaSBtZXJjYXRvIGFubm8gc3UgYW5ubyoqOiBkb3BvIHVuIHJpYmFzc28gZGVsIHZhbG9yZSBtZWRpbyBuZWwgMjAxMSBpbCBwcmV6em8gbWVkaW8gZGVnbGkgaW1tb2JpbGkgw6ggY3Jlc2NpdXRvIGFubm8gc3UgYW5ubyBmaW5vIGFsIDIwMTQNCiAgLSAqKnN0YWdpb25hbGl0w6AgcHJlenppIGRpIG1lcmNhdG8qKjogR2VubmFpbyDDqCBpbCBtZXNlIGRvdmUgaWwgcHJlenpvIG1lZGlvIMOoIHBpw7kgYmFzc28sIG1lbnRyZSBjcmVzY2UgZmlubyBhZCBhcnJpdmFyZSBhbCBwaWNjbyBkaSBHaXVnbm8NCi0gYEFuYWxpc2kgdmVuZGl0ZSBgDQogIC0gKipUcmVuZCB2ZW5kaXRlKio6IGlsIGNvbmZyb250byBhbm5vIHN1IGFubm8gKFlvWSkgw6ggaW4gY3Jlc2NpdGEgZGFsIDIwMTAgYWwgMjAxNA0KICAtICoqU3RhZ2lvbmFsaXTDoCoqOiBsZSB2ZW5kaXRlIHNpIGNvbmNlbnRyYW5vIG5lbCBwZXJpb2RvIGNlbnRyYWxlIGRlbGwnYW5uby4gSSBtZXNpIGEgcmlkb3NzbyBkaSBpbml6aW8gZSBmaW5lIGFubm8gc29ubyBwacO5IHNvZmZlcmVudGkuDQogICAgICAgICAgICAgICAgICAgICAgKipHaXVnbm8qKiDDqCBpbCBtZXNlIFRPUCwgbm9ub3N0YW50ZSBpbCB2YWxvcmUgbWVkaW8gZGVnbGkgaW1tb2JpbGkgc2lhIHBpw7kgYWx0by4gTWVudHJlICoqR2VubmFpbyoqIGlsIHBlZ2dpb3JlIHBlciB2ZW5kaXRlDQogICAgICAgICAgICAgICAgICAgICAgDQogIC0gKipQZXJmb3JtYW5jZSBDaXR0w6AqKjogTGEgY2l0dMOgIGRpIFR5bGVyIMOoIGxhIHRvcCBwZXJmb3JtZXIgY29tZSB2ZW5kaXRlIGFzc29sdXRlIGRpIGltbW9iaWxpLCBzZWd1aXRhIGRhIEJyeWFuLUNvbGxlZ2UgU3RhdGlvbg0KICAtICoqUGVyZm9ybWFuY2UgQ2l0dMOgIG5lbCB0ZW1wbyoqOiBpIGRhdGkgbW9zdHJhbm8gdW5hIGNlcnRhIGZsdXR0dWFsaXTDoCBkZWxsZSB2ZW5kaXRlIG5lbCB0ZW1wbyBkb3Z1dGUgYWkgcGljY2hpIHN0YWdpb25hbGkNCg0KLSBgQ29ycmVsYXppb25lIHRyYSBhbm51bmNpIGUgdmVuZGl0ZSBgDQogIC0gKipQZXJmb3JtYW5jZSBhbm51bmNpKio6IEMnw6ggdW5hIHJlbGF6aW9uZSBwb3NpdGl2YSB0cmEgYW5udW5jaSBlIHZlbmRpdGU6IHBpw7kgYW5udW5jaT1wacO5IHZlbmRpdGUuIFBlciBhdW1lbnRhcmUgdWx0ZXJpb3JtZW50ZSBsZSB2ZW5kaXRlIHNpIHBvdHJlYmJlIGZhciBsZXZhIHN1bGwnaW5jcmVtZW50byBkaSBhbm51bmNpIHN1IHZhcmkgY2FuYWxpIGRpIGNvbXVuaWNhemlvbmUgKHJhZGlvLCB0diBsb2NhbGksIGdpb3JuYWxpIGUgcml2aXN0ZSwgZXRjIGV0YykNCg0KLSBgQW5hbGlzaSB0ZW1waSBkaSB2ZW5kaXRhIGltbW9iaWxpIGANCiAgLSAqKlBlcmZvcm1hbmNlIGdlbmVyYWxlKio6IElsIHRlbXBvIG1lZGlvIHBlciB2ZW5kZXJlIHR1dHRlIGxlIGluc2Vyemlvbmkgw6g6IDkuMTkgbWVzaQ0KICAtICoqUGVyZm9ybWFuY2UgcGVyIGNpdHTDoCoqOiBOZWxsYSBjaXR0w6AgZGkgVHlsZXIgbWVkaWFtZW50ZSBzaSBpbXBpZWdhIHBpw7kgdGVtcG8gYSB2ZW5kZXJlIGdsaSBpbW1vYmlsaSAoMTEuMyBtZXNpKSwgbWVudHJlIEJyeWFuLUNvbGxhZ2UgU3RhdGlvbiDDqCBxdWVsbGEgY29uIG1lZGlhbWVudGUgbWlub3IgdGVtcG8oNy41IG1lc2kpLiBQcm9iYWJpbG1lbnRlLCBzaSBwb3RyZWJiZSBpcG90aXp6YXJlIG5vbiBhdmVuZG8gZGF0aSBhIGRpc3Bvc2l6aW9uZSwgY2hlIGNpw7Igw6ggZG92dXRvIGRhIHVuYSBtYWdnaW9yZSAicm90YXppb25lIiB0aXBpY2EgZGkgY2l0dMOgIGZyZXF1ZW50YXRlIGRhIHN0dWRlbnRpLlBvdHJlYmJlIGVzc2VyZSB1biBvdHRpbW8gaW52ZXN0aW1lbnRvIGFjcXVpc2lyZSB1biBpbW1vYmlsZSBuZWxsYSBjaXR0w6AgZGkgQnJ5YW4tQ29sbGFnZSBTdGF0aW9uDQoNCiMjIEdSQVpJRSBQRVIgTCdBVFRFTlpJT05FIChFbWFudWVsZSBSaXNhKQ0KDQoNCg0KDQo=