data pulled: 2023-02-22
website: http://rpubs.com/nsharmaa/spasd_tracking
This report is meant to provide a quick overview of the
Social Processes Initiative in Neurobiology of Autism-spectrum
and Schizophrenia-spectrum Disorders (SPIN-ASD) study. All data
summarized here derives from the SPIN-ASD project on CAMH’s REDCap
database, the SPINS project on AHRC’s REDCap database, and TIGRLab’s
XNAT database. This summary is only as accurate as the data captured
there.
For each of the plots, you can hover over selected areas to see more
metadata. Dragging a rectangle over a specific area of the plot will
zoom in and double clicking will reset to the original view.
Demographics
As part of the study design, one of the goals is to collect cognitive
and MR imaging data from 140 participants (100
participants with autism-spectrum disorders and 40
healthy controls). Participants who either drop out, are
withdrawn prior to completing the study, or whose MRI data cannot be
used will be replaced until this goal is achieved.
The study will also leverage previously collected data from the
Social Processes Initiative in Neurobiology of Schizophrenias
(SPINS) study, which consists of a matching protocol. SPINS is
a multi-site study that collected cognitive and MR imaging data from
clinically stable patients with schizophrenia-spectrum
disorders and healthy controls from each of
CAMH (CMH), Zucker Hillside Hospital
(ZHH) and Maryland Psychiatric Research Center
(MRC).
SPIN-ASD
Thus far, 135 participants have consented to be in
the study. A table summarizing their demographics as well as histograms
of their age and estimated IQ distributions are shown below.
For estimated IQ, study participants either
completed the Wechsler Abbreviated Scale of Intelligence
(WASI-II) or the Wechsler Adult Intelligence Scale
(WAIS-IV).
|
Case (N=99) |
Control (N=36) |
Overall (N=135) |
| Age (years) |
|
|
|
| Mean (SD) |
21 (± 3.9) |
27 (± 4.6) |
22 (± 4.8) |
| Median [Min, Max] |
20 [15, 33] |
27 [17, 35] |
22 [15, 35] |
| Missing |
0 (0%) |
2 (5.6%) |
2 (1.5%) |
| Sex |
|
|
|
| Female |
40 (40 %) |
15 (42 %) |
55 (41 %) |
| Male |
59 (60 %) |
20 (56 %) |
79 (59 %) |
| Missing |
0 (0%) |
1 (2.8%) |
1 (0.7%) |
| Race |
|
|
|
| Asian |
14 (14 %) |
16 (44 %) |
30 (22 %) |
| Black or African American |
1 (1 %) |
6 (17 %) |
7 (5 %) |
| More than one race |
8 (8 %) |
2 (6 %) |
10 (7 %) |
| Other |
6 (6 %) |
0 (0 %) |
6 (4 %) |
| White |
70 (71 %) |
10 (28 %) |
80 (59 %) |
| Missing |
0 (0%) |
2 (5.6%) |
2 (1.5%) |
| Education (years) |
|
|
|
| Mean (SD) |
13 (± 2.2) |
16 (± 2.1) |
14 (± 2.6) |
| Median [Min, Max] |
12 [9.0, 20] |
16 [11, 20] |
13 [9.0, 20] |
| Missing |
0 (0%) |
2 (5.6%) |
2 (1.5%) |
| Estimated IQ |
|
|
|
| Mean (SD) |
110 (± 14) |
110 (± 11) |
110 (± 13) |
| Median [Min, Max] |
120 [73, 150] |
110 [96, 130] |
110 [73, 150] |
| Missing |
37 (37.4%) |
23 (63.9%) |
60 (44.4%) |
| MATRICS |
|
|
|
| Mean (SD) |
41 (± 11) |
48 (± 12) |
43 (± 11) |
| Median [Min, Max] |
43 [-3.0, 59] |
51 [16, 64] |
44 [-3.0, 64] |
| Missing |
11 (11.1%) |
8 (22.2%) |
19 (14.1%) |
SPINS
The total SPINS dataset consists of 359 participants
with an SSD and 198 participants. After filtering the
dataset for participants within the same age range as SPIN-ASD, we get
the demographics table, and age and estimated IQ distributions shown
below.
For estimated IQ, study participants completed the
Wechsler Test of Adult Reading (WTAR).
|
CMH |
CMP |
MRC |
MRP |
ZHH |
ZHP |
Overall |
|
Case (N=107) |
Control (N=47) |
Case (N=15) |
Control (N=14) |
Case (N=18) |
Control (N=15) |
Case (N=32) |
Control (N=27) |
Case (N=22) |
Control (N=13) |
Case (N=45) |
Control (N=26) |
Case (N=239) |
Control (N=142) |
| Age (years) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Mean (SD) |
26 (± 4.6) |
24 (± 4.2) |
25 (± 3.4) |
26 (± 4.1) |
27 (± 5.2) |
28 (± 4.1) |
28 (± 4.8) |
27 (± 4.1) |
28 (± 4.4) |
27 (± 5.2) |
25 (± 4.7) |
28 (± 4.7) |
26 (± 4.7) |
26 (± 4.5) |
| Median [Min, Max] |
25 [18, 35] |
23 [18, 35] |
24 [20, 31] |
25 [20, 34] |
26 [18, 34] |
29 [21, 33] |
28 [18, 35] |
26 [19, 34] |
30 [21, 35] |
26 [20, 35] |
24 [18, 35] |
28 [18, 35] |
25 [18, 35] |
25 [18, 35] |
| Sex |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Female |
31 (29 %) |
21 (45 %) |
7 (47 %) |
10 (71 %) |
3 (17 %) |
3 (20 %) |
7 (22 %) |
11 (41 %) |
9 (41 %) |
7 (54 %) |
15 (33 %) |
16 (62 %) |
72 (30 %) |
68 (48 %) |
| Male |
76 (71 %) |
26 (55 %) |
8 (53 %) |
4 (29 %) |
15 (83 %) |
12 (80 %) |
25 (78 %) |
16 (59 %) |
13 (59 %) |
6 (46 %) |
30 (67 %) |
10 (38 %) |
167 (70 %) |
74 (52 %) |
| Intersex |
0 (0 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
| Race |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| American Indian/Alaska Native |
1 (1 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
1 (0 %) |
0 (0 %) |
| Asian |
23 (21 %) |
15 (32 %) |
1 (7 %) |
7 (50 %) |
2 (11 %) |
1 (7 %) |
3 (9 %) |
1 (4 %) |
2 (9 %) |
1 (8 %) |
9 (20 %) |
5 (19 %) |
40 (17 %) |
30 (21 %) |
| Black or African American |
17 (16 %) |
3 (6 %) |
1 (7 %) |
0 (0 %) |
12 (67 %) |
7 (47 %) |
13 (41 %) |
4 (15 %) |
10 (45 %) |
4 (31 %) |
18 (40 %) |
11 (42 %) |
71 (30 %) |
29 (20 %) |
| More than one race |
8 (7 %) |
2 (4 %) |
5 (33 %) |
0 (0 %) |
1 (6 %) |
1 (7 %) |
1 (3 %) |
0 (0 %) |
3 (14 %) |
2 (15 %) |
1 (2 %) |
0 (0 %) |
19 (8 %) |
5 (4 %) |
| Other |
3 (3 %) |
1 (2 %) |
1 (7 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
1 (4 %) |
2 (9 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
6 (3 %) |
2 (1 %) |
| Unknown or not reported |
3 (3 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
2 (9 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
5 (2 %) |
0 (0 %) |
| White |
52 (49 %) |
26 (55 %) |
7 (47 %) |
7 (50 %) |
3 (17 %) |
6 (40 %) |
15 (47 %) |
21 (78 %) |
3 (14 %) |
6 (46 %) |
17 (38 %) |
10 (38 %) |
97 (41 %) |
76 (54 %) |
| Education (years) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Mean (SD) |
13 (± 1.8) |
15 (± 1.8) |
14 (± 2.1) |
17 (± 1.7) |
13 (± 1.8) |
15 (± 1.8) |
14 (± 2.3) |
17 (± 2.0) |
13 (± 2.2) |
15 (± 2.4) |
14 (± 1.8) |
17 (± 2.0) |
14 (± 1.9) |
16 (± 2.0) |
| Median [Min, Max] |
13 [10, 18] |
16 [11, 18] |
14 [10, 18] |
18 [14, 20] |
14 [10, 16] |
16 [12, 18] |
14 [7.0, 18] |
16 [12, 20] |
14 [10, 18] |
16 [12, 19] |
13 [9.0, 18] |
17 [13, 20] |
13 [7.0, 18] |
16 [11, 20] |
| Estimated IQ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Mean (SD) |
NA (± NA) |
NA (± NA) |
NA (± NA) |
NA (± NA) |
NA (± NA) |
NA (± NA) |
NA (± NA) |
NA (± NA) |
NA (± NA) |
NA (± NA) |
NA (± NA) |
NA (± NA) |
NA (± NA) |
NA (± NA) |
| Median [Min, Max] |
NA [NA, NA] |
NA [NA, NA] |
NA [NA, NA] |
NA [NA, NA] |
NA [NA, NA] |
NA [NA, NA] |
NA [NA, NA] |
NA [NA, NA] |
NA [NA, NA] |
NA [NA, NA] |
NA [NA, NA] |
NA [NA, NA] |
NA [NA, NA] |
NA [NA, NA] |
| Missing |
107 (100%) |
47 (100%) |
15 (100%) |
14 (100%) |
18 (100%) |
15 (100%) |
32 (100%) |
27 (100%) |
22 (100%) |
13 (100%) |
45 (100%) |
26 (100%) |
239 (100%) |
142 (100%) |
Assessment Completion Status
Below is a heatmap depicting which assessments have been completed
for each participant in SPIN-ASD. There are separate tabs dividing
Case and Control participants. The
Assessment is shown in the x axis and the
Subject ID is shown in the y axis. Green indicates ‘complete’,
red indicates
‘incomplete’ and yellow indicates a ‘partial
complete’. Blank rectangles indicate that the assessment either hasn’t
been attempted yet or that the data hasn’t been entered. You can hover
over each square to get more details on the reason for an assessment
being incomplete.
The Autism-Spectrum Quotient (AQ),
Schizotypal Personality Questionnaire-Brief (SPQ-B) and
Beck Depression Inventory-II (BDI-II) were added to the
study protocol partway through the study and haven’t been completed for
several participants at the beginning.
Case
The Autism Diagnostic Interview-Revised (ADI-R) was
included in the study protocol in the event of an inconclusive clinical
diagnosis and a need for further diagnostic information following the
Autism Diagnostic Observation Schedule, Second Edition
(ADOS-2) .
Social Cognition
RMET
The Reading the Mind in the Eyes test (RMET) is a
test of social sensitivity. The participant is presented with a series
of 36 photographs of the eye region and asked to choose which of 4 words
best describes what the actor in the photograph is thinking or
feeling.
IRI
The Interpersonal Reactivity Index (IRI) is a 28
item self-report measure of cognitive and affective empathy.
TASIT-R
The Awareness of Social Inference Test-Revised
(TASIT-R) consists of emotion evaluation (Part
1), social inference - minimal (Part 2), and
social inference - enriched (Part 3). In Part 1, the
participant views 28 brief video clips to identify the emotion expressed
by the actor. In Part 2 and 3, the participant views 31 videotaped
vignettes of social interactions involving lies and sarcasm and makes
judgements regarding what the individual in the scene believed or knew,
meant by what he or she said, intended to do, and actually felt.
ER-40
The Penn Emotion Recognition Task-40 (ER-40) is a
measure of emotional processing. Participants rate the emotional valence
of 40 faces displaying happy, sad or neutral expressions on a 7 point
scale.
A median response time below 1000 seconds indicates inattention and
should be filtered out from further analysis.
MRI
Thus far, 121 participants have been scanned. The
target is to scan 3.33 participants per month
(40 per year). We are currently averaging
2.28 participants per month.
Score Distributions
Framewise Displacement
We use mriqc to
obtain image quality metrics (IQMs) for the T1w, T2w, and fMRI scans.
Below are plots of framewise displacement (FD), a measure of head motion
across time. Specifically, the average FD for each scan across all
timepoints and the percentage of FDs above a threshold of 0.5
mm are shown.
LS0tCnRpdGxlOiAiU1BJTi1BU0QgU3R1ZHkgVHJhY2tpbmciCmRlc2NyaXB0aW9uOiB8CiAgVGhpcyByZXBvcnQgaXMgbWVhbnQgdG8gcHJvdmlkZSBhIHF1aWNrIG92ZXJ2aWV3IG9mIHRoZSBTUElOLUFTRCBzdHVkeS4Kb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICB0aGVtZTogZmxhdGx5CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiBmYWxzZQogICAgICBzbW9vdGhfc2Nyb2xsOiBmYWxzZQogICAgdG9jX2RlcHRoOiAzCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBmaWdfd2lkdGg6IDgKLS0tCgpkYXRhIHB1bGxlZDogYHIgU3lzLkRhdGUoKWAgIAp3ZWJzaXRlOiBodHRwOi8vcnB1YnMuY29tL25zaGFybWFhL3NwYXNkX3RyYWNraW5nCgotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoCiAgZWNobyA9IEZBTFNFLAogIHdhcm5pbmcgPSBGQUxTRSwKICBtZXNzYWdlID0gRkFMU0UsCiAgY29tbWVudCA9ICIjIyIsCiAgUi5vcHRpb25zID0gbGlzdCh3aWR0aCA9IDYwKQopCgpkYXRlIDwtIFN5cy5EYXRlKCkKCmdncGxvdDI6OnRoZW1lX3NldChnZ3Bsb3QyOjp0aGVtZV9taW5pbWFsKCkpCgp0IDwtIGxpc3QoCiAgZmFtaWx5ID0gImhlbHZldGljYSIsCiAgc2l6ZSA9IDE0CikKYGBgCgpgYGB7ciBsb2FkX2xpYnJhcmllc30KbGlicmFyeShkcGx5cikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGdsdWUpCmxpYnJhcnkoaGVyZSkKbGlicmFyeShsdWJyaWRhdGUpCmxpYnJhcnkocGxvdGx5KQpsaWJyYXJ5KHJlYWRyKQpsaWJyYXJ5KHN0cmluZ3IpCmxpYnJhcnkodGFibGUxKQpsaWJyYXJ5KHRpZHlyKQpgYGAKCmBgYHtyIGxvYWRfZGF0YX0Kc291cmNlKGhlcmUoIlIvZ2V0X3JlZGNhcC5SIikpCgpzZXR0aW5nc19jZmcgPC0gaGVyZSgibWV0YWRhdGEvc2V0dGluZ3MueWFtbCIpCnNwYXNkX2RhdGFfcGF0aCA8LSBnbHVlKGhlcmUoImRhdGEvY2xpbmljYWwvcmVkY2FwX2V4cG9ydF9TUEFTRF97ZGF0ZX0uY3N2IikpCgppZiAoIWZpbGUuZXhpc3RzKHNwYXNkX2RhdGFfcGF0aCkpewogIGdldF9yZWRjYXAoIlNQQVNEIiwgc2V0dGluZ3NfY2ZnLCBzcGFzZF9kYXRhX3BhdGgpCn0KCnNwaW5zX2RhdGFfcGF0aCA8LSBnbHVlKGhlcmUoImRhdGEvY2xpbmljYWwvcmVkY2FwX2V4cG9ydF9TUElOU197ZGF0ZX0uY3N2IikpCgppZiAoIWZpbGUuZXhpc3RzKHNwaW5zX2RhdGFfcGF0aCkpIHsKICAgIGdldF9yZWRjYXAoIlNQSU5TIiwgc2V0dGluZ3NfY2ZnLCBzcGluc19kYXRhX3BhdGgpCn0KYGBgCgpgYGB7ciBjbGVhbl9kYXRhfQpzcGFzZF9yZWRjYXBfZGYgPC0KICByZWFkX2NzdihzcGFzZF9kYXRhX3BhdGgsIG5hID0gYygiIiwgIk5BIiwgIk5JIiwgIklOViIsICJOQVNLIiwgIkFTS1UiKSkgJT4lCiAgbXV0YXRlKHN0dWR5ID0gIlNQSU4tQVNEIiwKICAgICAgICAgZ3JvdXAgPSBjYXNlX3doZW4oZ3JlcGwoImFybV8xIiwgcmVkY2FwX2V2ZW50X25hbWUpIH4gIkNhc2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBncmVwbCgiYXJtXzIiLCByZWRjYXBfZXZlbnRfbmFtZSkgfiAiQ29udHJvbCIpICU+JQogICAgICAgICAgIGZhY3RvciguKSkgJT4lCiAgZmlsdGVyKHJlZGNhcF9ldmVudF9uYW1lICE9ICJjbF9hcm1fMyIpICU+JQogIHNlbGVjdCgtYyhyZWRjYXBfZXZlbnRfbmFtZSkpICU+JQogIGdyb3VwX2J5KHJlY29yZF9pZCkgJT4lCiAgZmlsbCgtcmVjb3JkX2lkLCAuZGlyZWN0aW9uID0gImRvd24iKSAlPiUKICBmaWxsKC1yZWNvcmRfaWQsIC5kaXJlY3Rpb24gPSAidXAiKSAlPiUKICBzbGljZSgxKSAlPiUKICB1bmdyb3VwKCkKCnNwaW5zX3JlZGNhcF9kZiA8LQogIHJlYWRfY3N2KHNwaW5zX2RhdGFfcGF0aCkgJT4lCiAgbXV0YXRlKHN0dWR5ID0gIlNQSU5TIiwKICAgICAgICAgZ3JvdXAgPSBjYXNlX3doZW4oZ3JlcGwoImFybV8yIiwgcmVkY2FwX2V2ZW50X25hbWUpIH4gIkNhc2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBncmVwbCgiYXJtXzEiLCByZWRjYXBfZXZlbnRfbmFtZSkgfiAiQ29udHJvbCIpICU+JQogICAgICAgICAgICAgICAgICAgIGZhY3RvciguKSkgJT4lICAgICAgIAogIHNlbGVjdCgtYyhyZWRjYXBfZXZlbnRfbmFtZSkpICU+JQogIGdyb3VwX2J5KHJlY29yZF9pZCkgJT4lCiAgZmlsbCgtcmVjb3JkX2lkLCAuZGlyZWN0aW9uID0gImRvd24iKSAlPiUKICBmaWxsKC1yZWNvcmRfaWQsIC5kaXJlY3Rpb24gPSAidXAiKSAlPiUKICBzbGljZSgxKSAlPiUKICB1bmdyb3VwKCkKCnNwaW5zX3RvdGFsX2Nhc2UgPC0KICBzcGluc19yZWRjYXBfZGYgJT4lCiAgZmlsdGVyKGdyb3VwID09ICJDYXNlIikgJT4lCiAgbnJvdygpCgpzcGluc190b3RhbF9jb250cm9sIDwtCiAgc3BpbnNfcmVkY2FwX2RmICU+JQogIGZpbHRlcihncm91cCA9PSAiQ29udHJvbCIpICU+JQogIG5yb3coKQoKc3BpbnNfcmVkY2FwX2RmIDwtCiAgc3BpbnNfcmVkY2FwX2RmICU+JQogIGZpbHRlcihkZW1vX2FnZV9zdHVkeV9lbnRyeSA8IDM2KQoKCnRhcmdldHNfZGYgPC0KICByZWFkX2NzdihoZXJlKCJtZXRhZGF0YSIsICJyZWNydWl0bWVudF90YXJnZXRzLmNzdiIpKQpgYGAKClRoaXMgcmVwb3J0IGlzIG1lYW50IHRvIHByb3ZpZGUgYSBxdWljayBvdmVydmlldyBvZiB0aGUgKipTb2NpYWwgUHJvY2Vzc2VzIEluaXRpYXRpdmUgaW4gTmV1cm9iaW9sb2d5IG9mIEF1dGlzbS1zcGVjdHJ1bSBhbmQgU2NoaXpvcGhyZW5pYS1zcGVjdHJ1bSBEaXNvcmRlcnMgKFNQSU4tQVNEKSoqIHN0dWR5LiBBbGwgZGF0YSBzdW1tYXJpemVkIGhlcmUgZGVyaXZlcyBmcm9tIHRoZSBTUElOLUFTRCBwcm9qZWN0IG9uIENBTUgncyBSRURDYXAgZGF0YWJhc2UsIHRoZSBTUElOUyBwcm9qZWN0IG9uIEFIUkMncyBSRURDYXAgZGF0YWJhc2UsIGFuZCBUSUdSTGFiJ3MgWE5BVCBkYXRhYmFzZS4gVGhpcyBzdW1tYXJ5IGlzIG9ubHkgYXMgYWNjdXJhdGUgYXMgdGhlIGRhdGEgY2FwdHVyZWQgdGhlcmUuICAKCkZvciBlYWNoIG9mIHRoZSBwbG90cywgeW91IGNhbiBob3ZlciBvdmVyIHNlbGVjdGVkIGFyZWFzIHRvIHNlZSBtb3JlIG1ldGFkYXRhLiBEcmFnZ2luZyBhIHJlY3RhbmdsZSBvdmVyIGEgc3BlY2lmaWMgYXJlYSBvZiB0aGUgcGxvdCB3aWxsIHpvb20gaW4gYW5kIGRvdWJsZSBjbGlja2luZyB3aWxsIHJlc2V0IHRvIHRoZSBvcmlnaW5hbCB2aWV3LgoKIyMgRGVtb2dyYXBoaWNzIHsudGFic2V0fQoKQXMgcGFydCBvZiB0aGUgc3R1ZHkgZGVzaWduLCBvbmUgb2YgdGhlIGdvYWxzIGlzIHRvIGNvbGxlY3QgY29nbml0aXZlIGFuZCBNUiBpbWFnaW5nIGRhdGEgZnJvbSAqKjE0MCoqIHBhcnRpY2lwYW50cyAoKioxMDAgcGFydGljaXBhbnRzIHdpdGggYXV0aXNtLXNwZWN0cnVtIGRpc29yZGVycyoqIGFuZCAqKjQwIGhlYWx0aHkgY29udHJvbHMqKikuIFBhcnRpY2lwYW50cyB3aG8gZWl0aGVyIGRyb3Agb3V0LCBhcmUgd2l0aGRyYXduIHByaW9yIHRvIGNvbXBsZXRpbmcgdGhlIHN0dWR5LCBvciB3aG9zZSBNUkkgZGF0YSBjYW5ub3QgYmUgdXNlZCB3aWxsIGJlIHJlcGxhY2VkIHVudGlsIHRoaXMgZ29hbCBpcyBhY2hpZXZlZC4gIAoKVGhlIHN0dWR5IHdpbGwgYWxzbyBsZXZlcmFnZSBwcmV2aW91c2x5IGNvbGxlY3RlZCBkYXRhIGZyb20gdGhlICoqU29jaWFsIFByb2Nlc3NlcyBJbml0aWF0aXZlIGluIE5ldXJvYmlvbG9neSBvZiBTY2hpem9waHJlbmlhcyAoU1BJTlMpKiogc3R1ZHksIHdoaWNoIGNvbnNpc3RzIG9mIGEgbWF0Y2hpbmcgcHJvdG9jb2wuIFNQSU5TIGlzIGEgbXVsdGktc2l0ZSBzdHVkeSB0aGF0IGNvbGxlY3RlZCBjb2duaXRpdmUgYW5kIE1SIGltYWdpbmcgZGF0YSBmcm9tICoqY2xpbmljYWxseSBzdGFibGUgcGF0aWVudHMgd2l0aCBzY2hpem9waHJlbmlhLXNwZWN0cnVtIGRpc29yZGVycyoqIGFuZCAqKmhlYWx0aHkgY29udHJvbHMqKiBmcm9tIGVhY2ggb2YgKipDQU1IIChDTUgpKiosICoqWnVja2VyIEhpbGxzaWRlIEhvc3BpdGFsIChaSEgpKiogYW5kICoqTWFyeWxhbmQgUHN5Y2hpYXRyaWMgUmVzZWFyY2ggQ2VudGVyIChNUkMpKiouCgojIyMgU1BJTi1BU0QKCmBgYCB7ciBzcGFzZF9kZW1vX2RhdGFmcmFtZX0Kc3Bhc2RfZGVtb19kZiA8LQogIHNwYXNkX3JlZGNhcF9kZiAlPiUKICBzZWxlY3QocmVjb3JkX2lkLCBncm91cCwKICAgICAgICAgZGVtb19zZXhfYmlydGgsIGRlbW9fYWdlX3N0dWR5X2VudHJ5LAogICAgICAgICBkZW1vX3JhY2VfX18xX3doaXRlLCBkZW1vX3JhY2VfX18yX2JsYWNrLCBkZW1vX3JhY2VfX18zX25hdGl2ZSwKICAgICAgICAgZGVtb19yYWNlX19fNF9hc2lhbiwgZGVtb19yYWNlX19fNV9pc2xhbmRlciwgZGVtb19yYWNlX19fNl9vdGhlciwKICAgICAgICAgZGVtb19yYWNlX19fN19taXhlZCwgZGVtb19yYWNlX19fOF91bmtub3duLCBkZW1vX3JhY2Vfb3RoZXIsCiAgICAgICAgIGRlbW9faGlnaGVzdF9ncmFkZV9zZWxmLCB3YXNpX3dhaXNfZnNpcSwgd2FzaV9mc2lxNF9jcywgbnBfY29tcG9zaXRlX3RzY29yZSwKICAgICAgICAgaGFuZF9sYXRlcmFsaXR5X3F1b3RpZW50KSAlPiUKICBtdXRhdGUoc2V4ID0gZmFjdG9yKGRlbW9fc2V4X2JpcnRoLAogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygxLCAyLCAzKSwKICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkZlbWFsZSIsICJNYWxlIiwgIkludGVyc2V4IikpLAogICAgICAgICByYWNlID0gY2FzZV93aGVuKGRlbW9fcmFjZV9fXzdfbWl4ZWQgPT0gMSB+ICJNb3JlIHRoYW4gb25lIHJhY2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRlbW9fcmFjZV9fXzFfd2hpdGUgPT0gMSB+ICJXaGl0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVtb19yYWNlX19fMl9ibGFjayA9PSAxIH4gIkJsYWNrIG9yIEFmcmljYW4gQW1lcmljYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRlbW9fcmFjZV9fXzNfbmF0aXZlID09IDEgfiAiQW1lcmljYW4gSW5kaWFuL0FsYXNrYSBOYXRpdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRlbW9fcmFjZV9fXzRfYXNpYW4gPT0gMSB+ICJBc2lhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVtb19yYWNlX19fNV9pc2xhbmRlciA9PSAxIH4gIkhhd2FpaWFuIG9yIFBhY2lmaWMgSXNsYW5kZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRlbW9fcmFjZV9fXzZfb3RoZXIgPT0gMSB+ICJPdGhlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVtb19yYWNlX19fOF91bmtub3duID09IDEgfiAiVW5rbm93biBvciBub3QgcmVwb3J0ZWQiKSAlPiUKICAgICAgICAgICBmYWN0b3IoLiksCiAgICAgICAgIGlxID0gaWZlbHNlKGlzLm5hKHdhc2lfZnNpcTRfY3MpLCB3YXNpX3dhaXNfZnNpcSwgd2FzaV9mc2lxNF9jcykpICU+JQogIHNlbGVjdChyZWNvcmRfaWQsIGdyb3VwLCBzZXgsIGRlbW9fYWdlX3N0dWR5X2VudHJ5LCByYWNlLCBkZW1vX2hpZ2hlc3RfZ3JhZGVfc2VsZiwgaXEsIG5wX2NvbXBvc2l0ZV90c2NvcmUpICU+JQogIGRyb3BsZXZlbHMoKQpgYGAKClRodXMgZmFyLCAqKmByIG5yb3coc3Bhc2RfZGVtb19kZilgKiogcGFydGljaXBhbnRzIGhhdmUgY29uc2VudGVkIHRvIGJlIGluIHRoZSBzdHVkeS4gQSB0YWJsZSBzdW1tYXJpemluZyB0aGVpciBkZW1vZ3JhcGhpY3MgYXMgd2VsbCBhcyBoaXN0b2dyYW1zIG9mIHRoZWlyIGFnZSBhbmQgZXN0aW1hdGVkIElRIGRpc3RyaWJ1dGlvbnMgYXJlIHNob3duIGJlbG93LiAgCgpGb3IgKiplc3RpbWF0ZWQgSVEqKiwgc3R1ZHkgcGFydGljaXBhbnRzIGVpdGhlciBjb21wbGV0ZWQgdGhlICoqV2VjaHNsZXIgQWJicmV2aWF0ZWQgU2NhbGUgb2YgSW50ZWxsaWdlbmNlIChXQVNJLUlJKSoqIG9yIHRoZSAqKldlY2hzbGVyIEFkdWx0IEludGVsbGlnZW5jZSBTY2FsZSAoV0FJUy1JVikqKi4KCmBgYHtyIHNwYXNkX2RlbW9fdGFibGV9CmxhYmVsKHNwYXNkX2RlbW9fZGYkZGVtb19hZ2Vfc3R1ZHlfZW50cnkpIDwtICJBZ2UgKHllYXJzKSIKbGFiZWwoc3Bhc2RfZGVtb19kZiRzZXgpIDwtICJTZXgiCmxhYmVsKHNwYXNkX2RlbW9fZGYkcmFjZSkgPC0gIlJhY2UiCmxhYmVsKHNwYXNkX2RlbW9fZGYkZGVtb19oaWdoZXN0X2dyYWRlX3NlbGYpIDwtIkVkdWNhdGlvbiAoeWVhcnMpIgpsYWJlbChzcGFzZF9kZW1vX2RmJGlxKSA8LSAiRXN0aW1hdGVkIElRIgpsYWJlbChzcGFzZF9kZW1vX2RmJG5wX2NvbXBvc2l0ZV90c2NvcmUpIDwtICJNQVRSSUNTIgoKbXkucmVuZGVyLmNvbnQgPC0gZnVuY3Rpb24oeCkgewogICAgd2l0aChzdGF0cy5hcHBseS5yb3VuZGluZyhzdGF0cy5kZWZhdWx0KHgpLCBkaWdpdHM9MiksIGMoIiIsCiAgICAgICAgIk1lYW4gKFNEKSI9c3ByaW50ZigiJXMgKCZwbHVzbW47ICVzKSIsIE1FQU4sIFNEKSwKICAgICAgICAiTWVkaWFuIFtNaW4sIE1heF0iPXNwcmludGYoIiVzIFslcywgJXNdIiwgTUVESUFOLCBNSU4sIE1BWCkpKQp9Cm15LnJlbmRlci5jYXQgPC0gZnVuY3Rpb24oeCkgewogICAgYygiIiwgc2FwcGx5KHN0YXRzLmRlZmF1bHQoeCksIGZ1bmN0aW9uKHkpIHdpdGgoeSwKICAgICAgICBzcHJpbnRmKCIlZCAoJTAuMGYgJSUpIiwgRlJFUSwgUENUKSkpKQp9CgpzcGFzZF9kZW1vX3RhYmxlIDwtCiAgdGFibGUxKH4gZGVtb19hZ2Vfc3R1ZHlfZW50cnkgKyBzZXggKyByYWNlICsgZGVtb19oaWdoZXN0X2dyYWRlX3NlbGYgKyBpcSArIG5wX2NvbXBvc2l0ZV90c2NvcmUgfCBncm91cCwKICAgICAgICBkYXRhID0gc3Bhc2RfZGVtb19kZiwKICAgICAgICByZW5kZXIuY29udGludW91cyA9IG15LnJlbmRlci5jb250LCByZW5kZXIuY2F0ZWdvcmljYWwgPSBteS5yZW5kZXIuY2F0KQoKc3Bhc2RfZGVtb190YWJsZQpgYGAKCmBgYHtyIHNwYXNkX2RlbW9fZGlzdHJpYnV0aW9uc30Kc3Bhc2RfYWdlX2Rpc3RyaWJ1dGlvbiA8LQogIHBsb3RfbHkoYWxwaGEgPSAwLjYsIGF1dG9iaW54ID0gRkFMU0UsCiAgICAgICAgICB4YmlucyA9IGxpc3Qoc3RhcnQgPSAxNSwgZW5kID0gMzYsIHNpemUgPSAxKSkgJT4lCiAgYWRkX2hpc3RvZ3JhbSh4ID0gfnNwYXNkX2RlbW9fZGYkZGVtb19hZ2Vfc3R1ZHlfZW50cnlbc3Bhc2RfZGVtb19kZiRncm91cCA9PSAiQ2FzZSJdLCBuYW1lID0gIkNhc2UiKSAlPiUKICBhZGRfaGlzdG9ncmFtKHggPSB+c3Bhc2RfZGVtb19kZiRkZW1vX2FnZV9zdHVkeV9lbnRyeVtzcGFzZF9kZW1vX2RmJGdyb3VwID09ICJDb250cm9sIl0sIG5hbWUgPSAiQ29udHJvbCIpICU+JQogIGxheW91dChiYXJtb2RlID0gIm92ZXJsYXkiLAogICAgICAgICBmb250ID0gdCwKICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIkFnZSAoeWVhcnMpIiksCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJDb3VudCIpKSAlPiUKICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkKCnNwYXNkX2lxX2Rpc3RyaWJ1dGlvbiA8LQogIHBsb3RfbHkoYWxwaGEgPSAwLjYsIGF1dG9iaW54ID0gRkFMU0UsCiAgICAgICAgICB4YmlucyA9IGxpc3Qoc3RhcnQgPSA3MCwgZW5kID0gMTUwLCBzaXplID0gMTApKSAlPiUKICBhZGRfaGlzdG9ncmFtKHggPSB+c3Bhc2RfZGVtb19kZiRpcVtzcGFzZF9kZW1vX2RmJGdyb3VwID09ICJDYXNlIl0sIG5hbWUgPSAiQ2FzZSIpICU+JQogIGFkZF9oaXN0b2dyYW0oeCA9IH5zcGFzZF9kZW1vX2RmJGlxW3NwYXNkX2RlbW9fZGYkZ3JvdXAgPT0gIkNvbnRyb2wiXSwgbmFtZSA9ICJDb250cm9sIikgJT4lCiAgbGF5b3V0KGJhcm1vZGUgPSAib3ZlcmxheSIsCiAgICAgICAgIGZvbnQgPSB0LAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiRXN0aW1hdGVkIElRIiksCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJDb3VudCIpKSAlPiUKICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkKCnNwYXNkX2FnZV9kaXN0cmlidXRpb24Kc3Bhc2RfaXFfZGlzdHJpYnV0aW9uCmBgYAoKIyMjIFNQSU5TCgpgYGB7ciBzcGluc19kZW1vX2RhdGFmcmFtZX0Kc3BpbnNfZGVtb19kZiA8LQogIHNwaW5zX3JlZGNhcF9kZiAlPiUKICBzZWxlY3QocmVjb3JkX2lkLCBncm91cCwgIAogCiAgICAgICAgIGRlbW9fc2V4X2JpcnRoLCBkZW1vX2FnZV9zdHVkeV9lbnRyeSwKICAgICAgICAgZGVtb19yYWNlX19fMV93aGl0ZSwgZGVtb19yYWNlX19fMl9ibGFjaywgZGVtb19yYWNlX19fM19uYXRpdmUsCiAgICAgICAgIGRlbW9fcmFjZV9fXzRfYXNpYW4sIGRlbW9fcmFjZV9fXzVfaXNsYW5kZXIsIGRlbW9fcmFjZV9fXzZfb3RoZXIsCiAgICAgICAgIGRlbW9fcmFjZV9fXzdfbWl4ZWQsIGRlbW9fcmFjZV9fXzhfdW5rbm93biwgZGVtb19yYWNlX290aGVyLAogICAgICAgICBkZW1vX2hpZ2hlc3RfZ3JhZGVfc2VsZiwgd3Rhcl9zdGRfc2NvcmUsIHd0YXJzdW1fc3RkLAogICAgICAgICBoYW5kX2xhdGVyYWxpdHlfcXVvdGllbnQpICU+JQogIG11dGF0ZShzZXggPSBmYWN0b3IoZGVtb19zZXhfYmlydGgsCiAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKDEsIDIsIDMpLAogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiRmVtYWxlIiwgIk1hbGUiLCAiSW50ZXJzZXgiKSksCiAgICAgICAgIHJhY2UgPSBjYXNlX3doZW4oZGVtb19yYWNlX19fN19taXhlZCA9PSAxIH4gIk1vcmUgdGhhbiBvbmUgcmFjZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVtb19yYWNlX19fMV93aGl0ZSA9PSAxIH4gIldoaXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBkZW1vX3JhY2VfX18yX2JsYWNrID09IDEgfiAiQmxhY2sgb3IgQWZyaWNhbiBBbWVyaWNhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVtb19yYWNlX19fM19uYXRpdmUgPT0gMSB+ICJBbWVyaWNhbiBJbmRpYW4vQWxhc2thIE5hdGl2ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVtb19yYWNlX19fNF9hc2lhbiA9PSAxIH4gIkFzaWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBkZW1vX3JhY2VfX181X2lzbGFuZGVyID09IDEgfiAiSGF3YWlpYW4gb3IgUGFjaWZpYyBJc2xhbmRlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVtb19yYWNlX19fNl9vdGhlciA9PSAxIH4gIk90aGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBkZW1vX3JhY2VfX184X3Vua25vd24gPT0gMSB+ICJVbmtub3duIG9yIG5vdCByZXBvcnRlZCIpICU+JQogICAgICAgICAgIGZhY3RvciguKSwKICAgICAgICAgaXEgPSBpZmVsc2UoaXMubmEod3Rhcl9zdGRfc2NvcmUpLHd0YXJfc3RkX3Njb3JlLCB3dGFyc3VtX3N0ZCkpICU+JQogIHNlcGFyYXRlKHJlY29yZF9pZCwgYygic3R1ZHkiLCAic2l0ZSIsICJzdWIiKSwgc2VwID0gIl8iLCByZW1vdmUgPSBGQUxTRSkgJT4lCiAgc2VsZWN0KHJlY29yZF9pZCwgc2l0ZSwgZ3JvdXAsIHNleCwgZGVtb19hZ2Vfc3R1ZHlfZW50cnksIHJhY2UsIGRlbW9faGlnaGVzdF9ncmFkZV9zZWxmLCBpcSkKYGBgCgpUaGUgdG90YWwgU1BJTlMgZGF0YXNldCBjb25zaXN0cyBvZiAqKmByIHNwaW5zX3RvdGFsX2Nhc2VgKiogcGFydGljaXBhbnRzIHdpdGggYW4gU1NEIGFuZCAqKmByIHNwaW5zX3RvdGFsX2NvbnRyb2xgKiogcGFydGljaXBhbnRzLiBBZnRlciBmaWx0ZXJpbmcgdGhlIGRhdGFzZXQgZm9yIHBhcnRpY2lwYW50cyB3aXRoaW4gdGhlIHNhbWUgYWdlIHJhbmdlIGFzIFNQSU4tQVNELCB3ZSBnZXQgdGhlIGRlbW9ncmFwaGljcyB0YWJsZSwgYW5kIGFnZSBhbmQgZXN0aW1hdGVkIElRIGRpc3RyaWJ1dGlvbnMgc2hvd24gYmVsb3cuICAKCkZvciAqKmVzdGltYXRlZCBJUSoqLCBzdHVkeSBwYXJ0aWNpcGFudHMgY29tcGxldGVkIHRoZSAqKldlY2hzbGVyIFRlc3Qgb2YgQWR1bHQgUmVhZGluZyAoV1RBUikqKi4KCmBgYHtyIHNwaW5zX2RlbW9fdGFibGV9CmxhYmVsKHNwaW5zX2RlbW9fZGYkZGVtb19hZ2Vfc3R1ZHlfZW50cnkpIDwtICJBZ2UgKHllYXJzKSIKbGFiZWwoc3BpbnNfZGVtb19kZiRzZXgpIDwtICJTZXgiCmxhYmVsKHNwaW5zX2RlbW9fZGYkcmFjZSkgPC0gIlJhY2UiCmxhYmVsKHNwaW5zX2RlbW9fZGYkZGVtb19oaWdoZXN0X2dyYWRlX3NlbGYpIDwtIkVkdWNhdGlvbiAoeWVhcnMpIgpsYWJlbChzcGluc19kZW1vX2RmJGlxKSA8LSAiRXN0aW1hdGVkIElRIgoKbXkucmVuZGVyLmNvbnQgPC0gZnVuY3Rpb24oeCkgewogICAgd2l0aChzdGF0cy5hcHBseS5yb3VuZGluZyhzdGF0cy5kZWZhdWx0KHgpLCBkaWdpdHM9MiksIGMoIiIsCiAgICAgICAgIk1lYW4gKFNEKSI9c3ByaW50ZigiJXMgKCZwbHVzbW47ICVzKSIsIE1FQU4sIFNEKSwKICAgICAgICAiTWVkaWFuIFtNaW4sIE1heF0iPXNwcmludGYoIiVzIFslcywgJXNdIiwgTUVESUFOLCBNSU4sIE1BWCkpKQp9Cm15LnJlbmRlci5jYXQgPC0gZnVuY3Rpb24oeCkgewogICAgYygiIiwgc2FwcGx5KHN0YXRzLmRlZmF1bHQoeCksIGZ1bmN0aW9uKHkpIHdpdGgoeSwKICAgICAgICBzcHJpbnRmKCIlZCAoJTAuMGYgJSUpIiwgRlJFUSwgUENUKSkpKQp9CgpzcGluc19kZW1vX3RhYmxlIDwtCiAgdGFibGUxKH4gZGVtb19hZ2Vfc3R1ZHlfZW50cnkgKyBzZXggKyByYWNlICsgZGVtb19oaWdoZXN0X2dyYWRlX3NlbGYgKyBpcSB8IHNpdGUqZ3JvdXAsCiAgICAgICAgZGF0YSA9IHNwaW5zX2RlbW9fZGYsCiAgICAgICAgcmVuZGVyLmNvbnRpbnVvdXMgPSBteS5yZW5kZXIuY29udCwgcmVuZGVyLmNhdGVnb3JpY2FsID0gbXkucmVuZGVyLmNhdCkKCnNwaW5zX2RlbW9fdGFibGUKYGBgCgpgYGB7ciBzcGluc19kZW1vX2Rpc3RyaWJ1dGlvbnN9CnNwaW5zX2FnZV9kaXN0cmlidXRpb24gPC0KICBwbG90X2x5KGFscGhhID0gMC42LCBhdXRvYmlueCA9IEZBTFNFLAogICAgICAgICAgeGJpbnMgPSBsaXN0KHN0YXJ0ID0gMTcsIGVuZCA9IDM2LCBzaXplID0gMSkpICU+JQogIGFkZF9oaXN0b2dyYW0oeCA9IH5zcGluc19kZW1vX2RmJGRlbW9fYWdlX3N0dWR5X2VudHJ5W3NwaW5zX2RlbW9fZGYkZ3JvdXAgPT0gIkNhc2UiXSwgbmFtZSA9ICJDYXNlIikgJT4lCiAgYWRkX2hpc3RvZ3JhbSh4ID0gfnNwaW5zX2RlbW9fZGYkZGVtb19hZ2Vfc3R1ZHlfZW50cnlbc3BpbnNfZGVtb19kZiRncm91cCA9PSAiQ29udHJvbCJdLCBuYW1lID0gIkNvbnRyb2wiKSAlPiUKICBsYXlvdXQoYmFybW9kZSA9ICJvdmVybGF5IiwKICAgICAgICAgZm9udCA9IHQsCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJBZ2UgKHllYXJzKSIpLAogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiQ291bnQiKSkgJT4lCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpCgpzcGluc19pcV9kaXN0cmlidXRpb24gPC0KICBwbG90X2x5KGFscGhhID0gMC42LCBhdXRvYmlueCA9IEZBTFNFLAogICAgICAgICAgeGJpbnMgPSBsaXN0KHN0YXJ0ID0gNjAsIGVuZCA9IDEzMCwgc2l6ZSA9IDEwKSkgJT4lCiAgYWRkX2hpc3RvZ3JhbSh4ID0gfnNwaW5zX2RlbW9fZGYkaXFbc3BpbnNfZGVtb19kZiRncm91cCA9PSAiQ2FzZSJdLCBuYW1lID0gIkNhc2UiKSAlPiUKICBhZGRfaGlzdG9ncmFtKHggPSB+c3BpbnNfZGVtb19kZiRpcVtzcGluc19kZW1vX2RmJGdyb3VwID09ICJDb250cm9sIl0sIG5hbWUgPSAiQ29udHJvbCIpICU+JQogIGxheW91dChiYXJtb2RlID0gIm92ZXJsYXkiLAogICAgICAgICBmb250ID0gdCwKICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIkVzdGltYXRlZCBJUSIpLAogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiQ291bnQiKSkgJT4lCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpCgpzcGluc19hZ2VfZGlzdHJpYnV0aW9uCnNwaW5zX2lxX2Rpc3RyaWJ1dGlvbgpgYGAKCiMjIEFzc2Vzc21lbnQgQ29tcGxldGlvbiBTdGF0dXMgey50YWJzZXR9CgpCZWxvdyBpcyBhIGhlYXRtYXAgZGVwaWN0aW5nIHdoaWNoIGFzc2Vzc21lbnRzIGhhdmUgYmVlbiBjb21wbGV0ZWQgZm9yIGVhY2ggcGFydGljaXBhbnQgaW4gU1BJTi1BU0QuIFRoZXJlIGFyZSBzZXBhcmF0ZSB0YWJzIGRpdmlkaW5nIGBDYXNlYCBhbmQgYENvbnRyb2xgIHBhcnRpY2lwYW50cy4gVGhlIGBBc3Nlc3NtZW50YCBpcyBzaG93biBpbiB0aGUgeCBheGlzIGFuZCB0aGUgYFN1YmplY3QgSURgIGlzIHNob3duIGluIHRoZSB5IGF4aXMuICoqPHNwYW4gc3R5bGU9ImNvbG9yOiMyMzg4MjMiPkdyZWVuPC9zcGFuPioqIGluZGljYXRlcyAnY29tcGxldGUnLCAqKjxzcGFuIHN0eWxlPSJjb2xvcjojRDIyMjJEIj5yZWQ8L3NwYW4+KiogaW5kaWNhdGVzICdpbmNvbXBsZXRlJyBhbmQgKio8c3BhbiBzdHlsZT0iY29sb3I6I0ZGQkYwMCI+eWVsbG93PC9zcGFuPioqIGluZGljYXRlcyBhICdwYXJ0aWFsIGNvbXBsZXRlJy4gQmxhbmsgcmVjdGFuZ2xlcyBpbmRpY2F0ZSB0aGF0IHRoZSBhc3Nlc3NtZW50IGVpdGhlciBoYXNuJ3QgYmVlbiBhdHRlbXB0ZWQgeWV0IG9yIHRoYXQgdGhlIGRhdGEgaGFzbid0IGJlZW4gZW50ZXJlZC4gWW91IGNhbiBob3ZlciBvdmVyIGVhY2ggc3F1YXJlIHRvIGdldCBtb3JlIGRldGFpbHMgb24gdGhlIHJlYXNvbiBmb3IgYW4gYXNzZXNzbWVudCBiZWluZyBpbmNvbXBsZXRlLgoKYGBge3IgYXNzZXNzbWVudF9jb21wbGV0ZX0Kc3Bhc2RfYXNzZXNzbWVudF9zdGF0dXMgPC0KICBzcGFzZF9yZWRjYXBfZGYgJT4lCiAgdW5ncm91cCgpICU+JQogIHNlbGVjdChyZWNvcmRfaWQsIGdyb3VwLAogICAgICAgICBlbmRzX3dpdGgoIl9mb3JtX2NvbXBsZXRlIiksCiAgICAgICAgIGhhbmRfcmVkY2FwX2lkLAogICAgICAgICBhcV9yZWRjYXBfaWQsCiAgICAgICAgIHNwcWJfcmVkY2FwX2lkLAogICAgICAgICBiZGlfcmVkY2FwX2lkLAogICAgICAgICBpcmlfcmVkY2FwX2lkLAogICAgICAgICBlbmRzX3dpdGgoIl9leHBsYWluIiksCiAgICAgICAgIGVuZHNfd2l0aCgiX290aGVyX3JlYXNvbl9uYyIpKSAlPiUKICBtdXRhdGUocmVjb3JkX2lkID0gc3RyX3JlbW92ZShyZWNvcmRfaWQsICJTUEFTRF9DTVBfIiksCiAgICAgICAgIGhhbmRfZm9ybV9jb21wbGV0ZSA9IGlmZWxzZShoYW5kX3JlZGNhcF9pZCA9PSAiW3N1cnZleSByZXNwb25kZW50XSIsIDEsIGhhbmRfZm9ybV9jb21wbGV0ZSksCiAgICAgICAgIGFxX2Zvcm1fY29tcGxldGUgPSBpZmVsc2UoYXFfcmVkY2FwX2lkID09ICJbc3VydmV5IHJlc3BvbmRlbnRdIiwgMSwgYXFfZm9ybV9jb21wbGV0ZSksCiAgICAgICAgIHNwcWJfZm9ybV9jb21wbGV0ZSA9IGlmZWxzZShzcHFiX3JlZGNhcF9pZCA9PSAiW3N1cnZleSByZXNwb25kZW50XSIsIDEsIHNwcWJfZm9ybV9jb21wbGV0ZSksCiAgICAgICAgIGJkaV9mb3JtX2NvbXBsZXRlID0gaWZlbHNlKGJkaV9yZWRjYXBfaWQgPT0gIltzdXJ2ZXkgcmVzcG9uZGVudF0iLCAxLCBiZGlfZm9ybV9jb21wbGV0ZSksCiAgICAgICAgIGlyaV9mb3JtX2NvbXBsZXRlID0gaWZlbHNlKGlyaV9yZWRjYXBfaWQgPT0gIltzdXJ2ZXkgcmVzcG9uZGVudF0iLCAxLCBpcmlfZm9ybV9jb21wbGV0ZSkpCgpzcGFzZF9hc3Nlc3NtZW50X2NvbXBsZXRlIDwtCiAgc3Bhc2RfYXNzZXNzbWVudF9zdGF0dXMgJT4lCiAgc2VsZWN0KHJlY29yZF9pZCwgZ3JvdXAsIGVuZHNfd2l0aCgiX2Zvcm1fY29tcGxldGUiKSkgJT4lCiAgZ2F0aGVyKGtleSA9ICJhc3Nlc3NtZW50IiwgdmFsdWUgPSAiY29tcGxldGUiLCAtYyhyZWNvcmRfaWQsIGdyb3VwKSkgJT4lCiAgZmlsdGVyKCFpcy5uYShjb21wbGV0ZSkpICU+JQogIG11dGF0ZShhc3Nlc3NtZW50ID0gc3RyX3JlbW92ZShhc3Nlc3NtZW50LCAiX2Zvcm1fY29tcGxldGUiKSkKCnNwYXNkX2Fzc2Vzc21lbnRfZXhwbGFpbiA8LQogIHNwYXNkX2Fzc2Vzc21lbnRfc3RhdHVzICU+JQogIHNlbGVjdChyZWNvcmRfaWQsIGdyb3VwLCBlbmRzX3dpdGgoIl9leHBsYWluIikpICU+JQogIGdhdGhlcihrZXkgPSAiYXNzZXNzbWVudCIsIHZhbHVlID0gInJlYXNvbiIsIC1jKHJlY29yZF9pZCwgZ3JvdXApKSAlPiUKICBmaWx0ZXIoIWlzLm5hKHJlYXNvbikpICU+JQogIG11dGF0ZShhc3Nlc3NtZW50ID0gc3RyX3JlbW92ZShhc3Nlc3NtZW50LCAiX2V4cGxhaW4iKSkgJT4lCiAgZmlsdGVyKGFzc2Vzc21lbnQgIT0gIm5wX3ZhbGlkaXR5X2lzc3VlcyIpICU+JQogIG11dGF0ZShyZWFzb24gPSBmYWN0b3IocmVhc29uLAogICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYyg4OCwgODksIDkwLCA5MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTIsIDkzLCA5NCwgOTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk2LCA5NywgOTgsIDk5KSwKICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIk90aGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRlcm1pbmF0ZWQgZnJvbSBzdHVkeSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaXNzZWQgYXBwb2ludG1lbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmF0ZXIgZm9yZ290IHRvIGFkbWluaXN0ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGltZSBjb25zdHJhaW50cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXaXRoZHJldyBjb25zZW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRlY2Vhc2VkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBiZSBjb250YWN0ZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29tcGxldGVkIGJ1dCB3aXRoIGxlc3MgdGhhbiBiZXN0IGVmZm9ydCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWZ1c2VkIHRvIGJlZ2luL2ZpbmlzaCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQaHlzaWNhbCBpbXBhaXJtZW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvZ25pdGl2ZSBpbXBhaXJtZW50IikpKQoKc3Bhc2RfYXNzZXNzbWVudF9leHBsYWluX290aGVyIDwtCiAgc3Bhc2RfYXNzZXNzbWVudF9zdGF0dXMgJT4lCiAgc2VsZWN0KHJlY29yZF9pZCwgZ3JvdXAsIGVuZHNfd2l0aCgiX290aGVyX3JlYXNvbl9uYyIpKSAlPiUKICBnYXRoZXIoa2V5ID0gImFzc2Vzc21lbnQiLCB2YWx1ZSA9ICJyZWFzb25fb3RoZXIiLCAtYyhyZWNvcmRfaWQsIGdyb3VwKSkgJT4lCiAgZmlsdGVyKCFpcy5uYShyZWFzb25fb3RoZXIpKSAlPiUKICBtdXRhdGUoYXNzZXNzbWVudCA9IHN0cl9yZW1vdmUoYXNzZXNzbWVudCwgIl9vdGhlcl9yZWFzb25fbmMiKSkKCnNwYXNkX2Fzc2Vzc21lbnRfZGYgPC0KICBzcGFzZF9hc3Nlc3NtZW50X2NvbXBsZXRlICU+JQogIGxlZnRfam9pbihzcGFzZF9hc3Nlc3NtZW50X2V4cGxhaW4pICU+JQogIGxlZnRfam9pbihzcGFzZF9hc3Nlc3NtZW50X2V4cGxhaW5fb3RoZXIpICU+JQogIGZpbHRlcighYXNzZXNzbWVudCAlaW4lIGMoImVsZ19wIiwgImVsZ19jdCIsICJucF9mYWN0IiwgInRlcm0iKSkgJT4lCiAgbXV0YXRlKHJlYXNvbiA9IGlmZWxzZShyZWFzb24gPT0gIk90aGVyIiwgcmVhc29uX290aGVyLCBhcy5jaGFyYWN0ZXIocmVhc29uKSksCiAgICAgICAgIGNvbXBsZXRlX3RleHQgPSBjYXNlX3doZW4oY29tcGxldGUgPT0gMSB+ICJDb21wbGV0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGUgPT0gMiB+ICJOb3QgY29tcGxldGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlID09IDMgfiAiUGFydGlhbCIpKQpgYGAKClRoZSAqKkF1dGlzbS1TcGVjdHJ1bSBRdW90aWVudCAoQVEpKiosICoqU2NoaXpvdHlwYWwgUGVyc29uYWxpdHkgUXVlc3Rpb25uYWlyZS1CcmllZiAoU1BRLUIpKiogYW5kICoqQmVjayBEZXByZXNzaW9uIEludmVudG9yeS1JSSAoQkRJLUlJKSoqIHdlcmUgYWRkZWQgdG8gdGhlIHN0dWR5IHByb3RvY29sIHBhcnR3YXkgdGhyb3VnaCB0aGUgc3R1ZHkgYW5kIGhhdmVuJ3QgYmVlbiBjb21wbGV0ZWQgZm9yIHNldmVyYWwgcGFydGljaXBhbnRzIGF0IHRoZSBiZWdpbm5pbmcuCgojIyMgQ2FzZQoKVGhlICoqQXV0aXNtIERpYWdub3N0aWMgSW50ZXJ2aWV3LVJldmlzZWQgKEFESS1SKSoqIHdhcyBpbmNsdWRlZCBpbiB0aGUgc3R1ZHkgcHJvdG9jb2wgaW4gdGhlIGV2ZW50IG9mIGFuIGluY29uY2x1c2l2ZSBjbGluaWNhbCBkaWFnbm9zaXMgYW5kIGEgbmVlZCBmb3IgZnVydGhlciBkaWFnbm9zdGljIGluZm9ybWF0aW9uIGZvbGxvd2luZyB0aGUgKipBdXRpc20gRGlhZ25vc3RpYyBPYnNlcnZhdGlvbiBTY2hlZHVsZSwgU2Vjb25kIEVkaXRpb24gKEFET1MtMikqKiAuICAKCmBgYHtyIGNhc2VfYXNzZXNzbWVudF9jb21wbGV0ZX0KY2FzZV9hc3Nlc3NtZW50X2RmIDwtCiAgc3Bhc2RfYXNzZXNzbWVudF9kZiAlPiUKICBmaWx0ZXIoZ3JvdXAgPT0gIkNhc2UiKSAlPiUKICBtdXRhdGUoYXNzZXNzbWVudCA9IGZhY3Rvcihhc3Nlc3NtZW50LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJjb25zZW50IiwgImRlbW8iLCAic2NpZDUiLCAic29mYXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFoaCIsICJucG1lZCIsICJwbWVkIiwgInVyaW5lIiwgImh3diIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGFuZCIsICJ3YXNpIiwgImZuZCIsICJhZGlyIiwgImFkb3MiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFxIiwgImJwcnMiLCAic3BxYiIsICJiZGkiLCAiY28iLCAibXJpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhYmFzIiwgImJzZnMiLCAibnAiLCAidGFzaXQiLCAicm1ldCIsICJpcmkiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJDb25zZW50IiwgIkRlbW9ncmFwaGljcyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNDSUQtNS1SViIsICJTT0ZBUyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWVkaWNhbCBIaXN0b3J5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOb25wc3ljaG90cm9waWMgTWVkaWNhdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBzeWNob3Ryb3BpYyBNZWRpY2F0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVXJpbmUgVG94aWNvbG9neSBQcmVnbmFuY3kiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlaWdodCBXZWlnaHQgVml0YWxzIiwgIkhEUSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV0FTSS1JSS9XQUlTIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWdlcnN0cm9tIE5pY290aW5lIERlcGVuZGVuY2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFESS1SIiwgIkFET1MtMiIsICJBUSIsICJCUFJTIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTUFEtQiIsICJCREktSUkiLCAiTmljb3RpbmUgRXhwaXJlZCBDTyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1SSSIsICJBQkFTLUlJIiwgIkJTRlMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOZXVyb3BzeWNoIiwgIlRBU0lUIEEiLCAiUk1FVCIsICJJUkkiKSkpCgpjYXNlX2NvbXBsZXRlX3Bsb3QgPC0KICBjYXNlX2Fzc2Vzc21lbnRfZGYgJT4lCiAgcGxvdF9seSh4ID0gfmFzc2Vzc21lbnQsIHkgPSB+cmVjb3JkX2lkLCB6ID0gfmNvbXBsZXRlLAogICAgICAgICAgeGdhcCA9IDIsIHlnYXAgPSAyLAogICAgICAgICAgY29sb3JzID0gYygiIzIzODgyMyIsICIjRDIyMjJEIiwgIiNGRkJGMDAiKSwKICAgICAgICAgIHR5cGUgPSAiaGVhdG1hcCIsCiAgICAgICAgICBoZWlnaHQ9MTMwMCwKICAgICAgICAgIGhvdmVyaW5mbyA9ICd0ZXh0JywKICAgICAgICAgIHRleHQgPSB+cGFzdGUoJyBTdWJqZWN0IElEOiAnLCByZWNvcmRfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICc8YnI+IEFzc2Vzc21lbnQ6ICcsIGFzc2Vzc21lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICc8YnI+IFN0YXR1czogJywgY29tcGxldGVfdGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgJzxicj4gUmVhc29uOiAnLCByZWFzb24pKSAlPiUKICBsYXlvdXQoZm9udCA9IHQsCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJBc3Nlc3NtZW50IiwKICAgICAgICAgICAgICAgICAgICAgIHRpY2tzID0gIiIsCiAgICAgICAgICAgICAgICAgICAgICB0aWNrYW5nbGU9IDQ1LAogICAgICAgICAgICAgICAgICAgICAgc2hvd2dyaWQgPSBGQUxTRSksCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJTdWJqZWN0IElEIiwKICAgICAgICAgICAgICAgICAgICAgIGF1dG9yYW5nZSA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gImNhdGVnb3J5IiwKICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5b3JkZXIgPSAiY2F0ZWdvcnkgZGVzY2VuZGluZyIsCiAgICAgICAgICAgICAgICAgICAgICB0aWNrcyA9ICIiLAogICAgICAgICAgICAgICAgICAgICAgdGlja3ZhbHM9fnJlY29yZF9pZCwKICAgICAgICAgICAgICAgICAgICAgIHNob3dncmlkID0gRkFMU0UpKSAlPiUKICBoaWRlX2NvbG9yYmFyKCkgJT4lCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpCgpjYXNlX2NvbXBsZXRlX3Bsb3QKYGBgCgojIyMgQ29udHJvbAoKYGBge3IgY29udHJvbF9hc3Nlc3NtZW50X2NvbXBsZXRlfQpjb250cm9sX2Fzc2Vzc21lbnRfZGYgPC0KICBzcGFzZF9hc3Nlc3NtZW50X2RmICU+JQogIGZpbHRlcihncm91cCA9PSAiQ29udHJvbCIpICU+JQogIG11dGF0ZShhc3Nlc3NtZW50ID0gZmFjdG9yKGFzc2Vzc21lbnQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoImNvbnNlbnQiLCAiZGVtbyIsICJzY2lkNSIsICJzb2ZhcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWhoIiwgIm5wbWVkIiwgInBtZWQiLCAidXJpbmUiLCAiaHd2IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoYW5kIiwgIndhc2kiLCAiZm5kIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXEiLCAic3BxYiIsICJiZGkiLCAiY28iLCAibXJpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhYmFzIiwgImJzZnMiLCAibnAiLCAidGFzaXQiLCAicm1ldCIsICJpcmkiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJDb25zZW50IiwgIkRlbW9ncmFwaGljcyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNDSUQtNS1SViIsICJTT0ZBUyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWVkaWNhbCBIaXN0b3J5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOb25wc3ljaG90cm9waWMgTWVkaWNhdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBzeWNob3Ryb3BpYyBNZWRpY2F0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVXJpbmUgVG94aWNvbG9neSBQcmVnbmFuY3kiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlaWdodCBXZWlnaHQgVml0YWxzIiwgIkhEUSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV0FTSS1JSS9XQUlTIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWdlcnN0cm9tIE5pY290aW5lIERlcGVuZGVuY2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFRIiwgIlNQUS1CIiwgIkJESS1JSSIsICJOaWNvdGluZSBFeHBpcmVkIENPIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTVJJIiwgIkFCQVMtSUkiLCAiQlNGUyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5ldXJvcHN5Y2giLCAiVEFTSVQgQSIsICJSTUVUIiwgIklSSSIpKSkKCmNvbnRyb2xfY29tcGxldGVfcGxvdCA8LQogIGNvbnRyb2xfYXNzZXNzbWVudF9kZiAlPiUKICBwbG90X2x5KHggPSB+YXNzZXNzbWVudCwgeSA9IH5yZWNvcmRfaWQsIHogPSB+Y29tcGxldGUsCiAgICAgICAgICB4Z2FwID0gMiwgeWdhcCA9IDIsCiAgICAgICAgICBjb2xvcnMgPSBjKCIjMjM4ODIzIiwgIiNGRkJGMDAiLCAiI0QyMjIyRCIpLAogICAgICAgICAgdHlwZSA9ICJoZWF0bWFwIiwKICAgICAgICAgIGhvdmVyaW5mbyA9ICd0ZXh0JywKICAgICAgICAgIHRleHQgPSB+cGFzdGUoJyBTdWJqZWN0IElEOiAnLCByZWNvcmRfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICc8YnI+IEFzc2Vzc21lbnQ6ICcsIGFzc2Vzc21lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICc8YnI+IFN0YXR1czogJywgY29tcGxldGVfdGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgJzxicj4gUmVhc29uOiAnLCByZWFzb24pKSAlPiUKICBsYXlvdXQoZm9udCA9IHQsCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJBc3Nlc3NtZW50IiwKICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAiY2F0ZWdvcnkiLAogICAgICAgICAgICAgICAgICAgICAgdGlja3MgPSAiIiwKICAgICAgICAgICAgICAgICAgICAgIHRpY2thbmdsZSA9IDQ1LAogICAgICAgICAgICAgICAgICAgICAgc2hvd2dyaWQgPSBGQUxTRSksCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJTdWJqZWN0IElEIiwKICAgICAgICAgICAgICAgICAgICAgIGF1dG9yYW5nZSA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gImNhdGVnb3J5IiwKICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5b3JkZXIgPSAiY2F0ZWdvcnkgZGVzY2VuZGluZyIsCiAgICAgICAgICAgICAgICAgICAgICB0aWNrcyA9ICIiLAogICAgICAgICAgICAgICAgICAgICAgdGlja3ZhbHM9fnJlY29yZF9pZCwKICAgICAgICAgICAgICAgICAgICAgIHNob3dncmlkID0gRkFMU0UpKSAlPiUKICBoaWRlX2NvbG9yYmFyKCkgJT4lCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpCgpjb250cm9sX2NvbXBsZXRlX3Bsb3QKYGBgCgoKCgojIyBTb2NpYWwgQ29nbml0aW9uIHsudGFic2V0fQoKYGBge3Igc2NvZ19kYXRhZnJhbWV9CnNjb2dfZGYgPC0KICByYmluZCgKICAgIHNwYXNkX3JlZGNhcF9kZiAlPiUKICAgICAgc2VsZWN0KHJlY29yZF9pZCwgc3R1ZHksIGdyb3VwLAogICAgICAgICAgICAgcm1ldF90b3RhbCwKICAgICAgICAgICAgIGlyaV9mYWN0b3JfcHQsIGlyaV9mYWN0b3JfZnMsIGlyaV9mYWN0b3JfZWMsIGlyaV9mYWN0b3JfcGQsIGlyaV90b3RhbCwKICAgICAgICAgICAgIHNjb2dfZXI0MF9jcl9jb2x1bW5wY3JfdmFsdWUsIHNjb2dfZXI0MF9jcnRfY29sdW1ucWNydF92YWx1ZSwgc2NvZ19lcjQwYW5nX2NvbHVtbnYsIHNjb2dfZXI0MGZlYXJfY29sdW1udywKICAgICAgICAgICAgIHNjb2dfZXI0MGhhcF9jb2x1bW54LCBzY29nX2VyNDBub2VfY29sdW1ueSwgc2NvZ19lcjQwc2FkX2NvbHVtbnosIHNjb2dfZXI0MF9mcGFfY29sdW1uYWEsIHNjb2dfZXI0MF9mcGZfY29sdW1uYWIsCiAgICAgICAgICAgICBzY29nX2VyNDBtaWxkX2NvbHVtbmFwLCBzY29nX2VyNDBleHRyX2NvbHVtbmFxLCBzY29nX2VyNDBtZHJ0X2NvbHVtbmFyLCBzY29nX2VyNDBleHJ0X2NvbHVtbmFzLAogICAgICAgICAgICAgdGFzaXRfY29ycmVjdF90b3RhbCwgdGFzaXRfcGFydDJfZ3JhbmR0b3RhbCwgdGFzaXRfcGFydDNfZ3JhbmR0b3RhbF9saWVzLCB0YXNpdF9wYXJ0M19ncmFuZHRvdGFsX3NhcmNhc20pLAogICAgc3BpbnNfcmVkY2FwX2RmICU+JQogICAgICBzZWxlY3QocmVjb3JkX2lkLCBzdHVkeSwgZ3JvdXAsCiAgICAgICAgICAgICBybWV0X3RvdGFsLCBzY29nMl9ybWV0X3RvdGFsLAogICAgICAgICAgICAgaXJpX2ZhY3Rvcl9wdCwgc2NvZzJfaXJpX2ZhY3Rvcl9wZXJzcGVjdGl2ZSwKICAgICAgICAgICAgIGlyaV9mYWN0b3JfZnMsIHNjb2cyX2lyaV9mYWN0b3JfZmFudGFzeSwKICAgICAgICAgICAgIGlyaV9mYWN0b3JfZWMsIHNjb2cyX2lyaV9mYWN0b3JfZW1wYXRoaWNfY29uY2VybiwKICAgICAgICAgICAgIGlyaV9mYWN0b3JfcGQsIHNjb2cyX2lyaV9mYWN0b3JfcGVyc29uYWxfZGlzdHJlc3MsCiAgICAgICAgICAgICBpcmlfdG90YWwsCiAgICAgICAgICAgICBzY29nX2VyNDBfY3JfY29sdW1ucGNyX3ZhbHVlLCBzY29nX2VyNDAyX2NyX2NvbHVtbnBjcl92YWx1ZSwKICAgICAgICAgICAgIHNjb2dfZXI0MF9jcnRfY29sdW1ucWNydF92YWx1ZSwgc2NvZzJfZXI0MF9jcnRfY29sdW1ucWNydF92YWx1ZSwKICAgICAgICAgICAgIHNjb2dfZXI0MGFuZ19jb2x1bW52LCBzY29nMl9lcjQwYW5nX2NvbHVtbnYsCiAgICAgICAgICAgICBzY29nX2VyNDBmZWFyX2NvbHVtbncsIHNjb2cyX2VyNDBmZWFyX2NvbHVtbncsCiAgICAgICAgICAgICBzY29nX2VyNDBoYXBfY29sdW1ueCwgc2NvZzJfZXI0MGhhcF9jb2x1bW54LAogICAgICAgICAgICAgc2NvZ19lcjQwbm9lX2NvbHVtbnksIHNjb2cyX2VyNDBub2VfY29sdW1ueSwKICAgICAgICAgICAgIHNjb2dfZXI0MHNhZF9jb2x1bW56LCBzY29nMl9lcjQwc2FkX2NvbHVtbnosCiAgICAgICAgICAgICBzY29nX2VyNDBfZnBhX2NvbHVtbmFhLCBzY29nMl9lcjQwX2ZwYV9jb2x1bW5hYSwKICAgICAgICAgICAgIHNjb2dfZXI0MF9mcGZfY29sdW1uYWIsIHNjb2cyX2VyNDBfZnBmX2NvbHVtbmFiLAogICAgICAgICAgICAgc2NvZ19lcjQwbWlsZF9jb2x1bW5hcCwgc2NvZzJfZXI0MG1pbGRfY29sdW1uYXAsCiAgICAgICAgICAgICBzY29nX2VyNDBleHRyX2NvbHVtbmFxLCBzY29nMl9lcjQwZXh0cl9jb2x1bW5hcSwKICAgICAgICAgICAgIHNjb2dfZXI0MG1kcnRfY29sdW1uYXIsIHNjb2cyX2VyNDBtZHJ0X2NvbHVtbmFyLAogICAgICAgICAgICAgc2NvZ19lcjQwZXhydF9jb2x1bW5hcywgc2NvZzJfZXI0MGV4cnRfY29sdW1uYXMsCiAgICAgICAgICAgICB0YXNpdF9jb3JyZWN0X3RvdGFsLCB0YXNpdHN1bV90b3RhbF9jb3JyZWN0LAogICAgICAgICAgICAgdGFzaXRfcGFydDJfZ3JhbmR0b3RhbCwgdGFzaXRzdW1fcDJfdG90YWxfaXRlbXNjb3JyZWN0LAogICAgICAgICAgICAgdGFzaXRfcGFydDNfZ3JhbmR0b3RhbF9saWVzLCB0YXNpdHN1bV9wM19ncmFuZHRvdGFsX2xpZXMsCiAgICAgICAgICAgICB0YXNpdF9wYXJ0M19ncmFuZHRvdGFsX3NhcmNhc20sIHRhc2l0c3VtX3AzX2dyYW5kdG90YWxfc2FyY2FzbSkgJT4lCiAgICAgIG11dGF0ZShybWV0X3RvdGFsID0gaWZlbHNlKGlzLm5hKHJtZXRfdG90YWwpLCBzY29nMl9ybWV0X3RvdGFsLCBybWV0X3RvdGFsKSwKICAgICAgICAgICAgIGlyaV9mYWN0b3JfcHQgPSBpZmVsc2UoaXMubmEoaXJpX2ZhY3Rvcl9wdCksIHNjb2cyX2lyaV9mYWN0b3JfcGVyc3BlY3RpdmUsIGlyaV9mYWN0b3JfcHQpLAogICAgICAgICAgICAgaXJpX2ZhY3Rvcl9mcyA9IGlmZWxzZShpcy5uYShpcmlfZmFjdG9yX2ZzKSwgc2NvZzJfaXJpX2ZhY3Rvcl9mYW50YXN5LCBpcmlfZmFjdG9yX2ZzKSwKICAgICAgICAgICAgIGlyaV9mYWN0b3JfZWMgPSBpZmVsc2UoaXMubmEoaXJpX2ZhY3Rvcl9lYyksIHNjb2cyX2lyaV9mYWN0b3JfZW1wYXRoaWNfY29uY2VybiwgaXJpX2ZhY3Rvcl9lYyksCiAgICAgICAgICAgICBpcmlfZmFjdG9yX3BkID0gaWZlbHNlKGlzLm5hKGlyaV9mYWN0b3JfcGQpLCBzY29nMl9pcmlfZmFjdG9yX3BlcnNvbmFsX2Rpc3RyZXNzLCBpcmlfZmFjdG9yX3BkKSwKICAgICAgICAgICAgIGlyaV90b3RhbCA9IGlmZWxzZShpcy5uYShpcmlfdG90YWwpLCBpcmlfZmFjdG9yX3B0ICsgaXJpX2ZhY3Rvcl9mcyArIGlyaV9mYWN0b3JfZWMgKyBpcmlfZmFjdG9yX3BkLCBpcmlfdG90YWwpLAogICAgICAgICAgICAgc2NvZ19lcjQwX2NyX2NvbHVtbnBjcl92YWx1ZSA9IGlmZWxzZShncmVwbCgiTVJDfE1SUCIsIHJlY29yZF9pZCksIHNjb2dfZXI0MDJfY3JfY29sdW1ucGNyX3ZhbHVlLCBzY29nX2VyNDBfY3JfY29sdW1ucGNyX3ZhbHVlKSwKICAgICAgICAgICAgIHNjb2dfZXI0MF9jcnRfY29sdW1ucWNydF92YWx1ZSA9IGlmZWxzZShncmVwbCgiTVJDfE1SUCIsIHJlY29yZF9pZCksIHNjb2cyX2VyNDBfY3J0X2NvbHVtbnFjcnRfdmFsdWUsIHNjb2dfZXI0MF9jcnRfY29sdW1ucWNydF92YWx1ZSksCiAgICAgICAgICAgICBzY29nX2VyNDBhbmdfY29sdW1udiA9IGlmZWxzZShncmVwbCgiTVJDfE1SUCIsIHJlY29yZF9pZCksIHNjb2cyX2VyNDBhbmdfY29sdW1udiwgc2NvZ19lcjQwYW5nX2NvbHVtbnYpLAogICAgICAgICAgICAgc2NvZ19lcjQwZmVhcl9jb2x1bW53ID0gaWZlbHNlKGdyZXBsKCJNUkN8TVJQIiwgcmVjb3JkX2lkKSwgc2NvZzJfZXI0MGZlYXJfY29sdW1udywgc2NvZ19lcjQwZmVhcl9jb2x1bW53KSwKICAgICAgICAgICAgIHNjb2dfZXI0MGhhcF9jb2x1bW54ID0gaWZlbHNlKGdyZXBsKCJNUkN8TVJQIiwgcmVjb3JkX2lkKSwgc2NvZzJfZXI0MGhhcF9jb2x1bW54LCBzY29nX2VyNDBoYXBfY29sdW1ueCksCiAgICAgICAgICAgICBzY29nX2VyNDBub2VfY29sdW1ueSA9IGlmZWxzZShncmVwbCgiTVJDfE1SUCIsIHJlY29yZF9pZCksIHNjb2cyX2VyNDBub2VfY29sdW1ueSwgc2NvZ19lcjQwbm9lX2NvbHVtbnkpLAogICAgICAgICAgICAgc2NvZ19lcjQwc2FkX2NvbHVtbnogPSBpZmVsc2UoZ3JlcGwoIk1SQ3xNUlAiLCByZWNvcmRfaWQpLCBzY29nMl9lcjQwc2FkX2NvbHVtbnosIHNjb2dfZXI0MHNhZF9jb2x1bW56KSwKICAgICAgICAgICAgIHNjb2dfZXI0MF9mcGFfY29sdW1uYWEgPSBpZmVsc2UoZ3JlcGwoIk1SQ3xNUlAiLCByZWNvcmRfaWQpLCBzY29nMl9lcjQwX2ZwYV9jb2x1bW5hYSwgc2NvZ19lcjQwX2ZwYV9jb2x1bW5hYSksCiAgICAgICAgICAgICBzY29nX2VyNDBfZnBmX2NvbHVtbmFiID0gaWZlbHNlKGdyZXBsKCJNUkN8TVJQIiwgcmVjb3JkX2lkKSwgc2NvZzJfZXI0MF9mcGZfY29sdW1uYWIsIHNjb2dfZXI0MF9mcGZfY29sdW1uYWIpLAogICAgICAgICAgICAgc2NvZ19lcjQwbWlsZF9jb2x1bW5hcCA9IGlmZWxzZShncmVwbCgiTVJDfE1SUCIsIHJlY29yZF9pZCksIHNjb2cyX2VyNDBtaWxkX2NvbHVtbmFwLCBzY29nX2VyNDBtaWxkX2NvbHVtbmFwKSwKICAgICAgICAgICAgIHNjb2dfZXI0MGV4dHJfY29sdW1uYXEgPSBpZmVsc2UoZ3JlcGwoIk1SQ3xNUlAiLCByZWNvcmRfaWQpLCBzY29nMl9lcjQwZXh0cl9jb2x1bW5hcSwgc2NvZ19lcjQwZXh0cl9jb2x1bW5hcSksCiAgICAgICAgICAgICBzY29nX2VyNDBtZHJ0X2NvbHVtbmFyID0gaWZlbHNlKGdyZXBsKCJNUkN8TVJQIiwgcmVjb3JkX2lkKSwgc2NvZzJfZXI0MG1kcnRfY29sdW1uYXIsIHNjb2dfZXI0MG1kcnRfY29sdW1uYXIpLAogICAgICAgICAgICAgc2NvZ19lcjQwZXhydF9jb2x1bW5hcyA9IGlmZWxzZShncmVwbCgiTVJDfE1SUCIsIHJlY29yZF9pZCksIHNjb2cyX2VyNDBleHJ0X2NvbHVtbmFzLCBzY29nX2VyNDBleHJ0X2NvbHVtbmFzKSwKICAgICAgICAgICAgIHRhc2l0X2NvcnJlY3RfdG90YWwgPSBpZmVsc2UoZ3JlcGwoIk1SQ3xNUlAiLCByZWNvcmRfaWQpLCB0YXNpdHN1bV90b3RhbF9jb3JyZWN0LCB0YXNpdF9jb3JyZWN0X3RvdGFsKSwKICAgICAgICAgICAgIHRhc2l0X3BhcnQyX2dyYW5kdG90YWwgPSBpZmVsc2UoZ3JlcGwoIk1SQ3xNUlAiLCByZWNvcmRfaWQpLCB0YXNpdHN1bV9wMl90b3RhbF9pdGVtc2NvcnJlY3QsIHRhc2l0X3BhcnQyX2dyYW5kdG90YWwpLAogICAgICAgICAgICAgdGFzaXRfcGFydDNfZ3JhbmR0b3RhbF9saWVzID0gaWZlbHNlKGdyZXBsKCJNUkN8TVJQIiwgcmVjb3JkX2lkKSwgdGFzaXRzdW1fcDNfZ3JhbmR0b3RhbF9saWVzLCB0YXNpdF9wYXJ0M19ncmFuZHRvdGFsX2xpZXMpLAogICAgICAgICAgICAgdGFzaXRfcGFydDNfZ3JhbmR0b3RhbF9zYXJjYXNtID0gaWZlbHNlKGdyZXBsKCJNUkN8TVJQIiwgcmVjb3JkX2lkKSwgdGFzaXRzdW1fcDNfZ3JhbmR0b3RhbF9zYXJjYXNtLCB0YXNpdF9wYXJ0M19ncmFuZHRvdGFsX3NhcmNhc20pKSAlPiUKICAgICAgc2VsZWN0KC1jKHNjb2cyX3JtZXRfdG90YWwsCiAgICAgICAgICAgICAgICBzY29nMl9pcmlfZmFjdG9yX3BlcnNwZWN0aXZlLCBzY29nMl9pcmlfZmFjdG9yX2ZhbnRhc3ksIHNjb2cyX2lyaV9mYWN0b3JfZW1wYXRoaWNfY29uY2Vybiwgc2NvZzJfaXJpX2ZhY3Rvcl9wZXJzb25hbF9kaXN0cmVzcywKICAgICAgICAgICAgICAgIHNjb2dfZXI0MDJfY3JfY29sdW1ucGNyX3ZhbHVlLCBzY29nMl9lcjQwX2NydF9jb2x1bW5xY3J0X3ZhbHVlLCBzY29nMl9lcjQwYW5nX2NvbHVtbnYsIHNjb2cyX2VyNDBmZWFyX2NvbHVtbncsCiAgICAgICAgICAgICAgICBzY29nMl9lcjQwaGFwX2NvbHVtbngsIHNjb2cyX2VyNDBub2VfY29sdW1ueSwgc2NvZzJfZXI0MHNhZF9jb2x1bW56LAogICAgICAgICAgICAgICAgc2NvZzJfZXI0MF9mcGFfY29sdW1uYWEsIHNjb2cyX2VyNDBfZnBmX2NvbHVtbmFiLCBzY29nMl9lcjQwbWlsZF9jb2x1bW5hcCwKICAgICAgICAgICAgICAgIHNjb2cyX2VyNDBleHRyX2NvbHVtbmFxLCBzY29nMl9lcjQwbWRydF9jb2x1bW5hciwgc2NvZzJfZXI0MGV4cnRfY29sdW1uYXMsCiAgICAgICAgICAgICAgICB0YXNpdHN1bV90b3RhbF9jb3JyZWN0LCB0YXNpdHN1bV9wMl90b3RhbF9pdGVtc2NvcnJlY3QsIHRhc2l0c3VtX3AzX2dyYW5kdG90YWxfbGllcywgdGFzaXRzdW1fcDNfZ3JhbmR0b3RhbF9zYXJjYXNtKSkpCgojIGZpbHRlciBvdXQgcGFydGljaXBhbnRzIHdpdGggTkEgcm93cwpzY29nX2RmIDwtIHNjb2dfZGZbcm93U3Vtcyhpcy5uYShzY29nX2RmKSkgPCAxOCwgXQoKIyBmaWx0ZXIgb3V0IFRBU0lUIHNjb3JlcyB3aXRoIDAKc2NvZ19kZiA8LQogIHNjb2dfZGYgJT4lCiAgbXV0YXRlKHRhc2l0X2NvcnJlY3RfdG90YWwgPSBuYV9pZih0YXNpdF9jb3JyZWN0X3RvdGFsLCAwKSwKICAgICAgICAgdGFzaXRfcGFydDJfZ3JhbmR0b3RhbCA9IG5hX2lmKHRhc2l0X3BhcnQyX2dyYW5kdG90YWwsIDApLAogICAgICAgICB0YXNpdF9wYXJ0M19ncmFuZHRvdGFsX2xpZXMgPSBuYV9pZih0YXNpdF9wYXJ0M19ncmFuZHRvdGFsX2xpZXMsIDApLAogICAgICAgICB0YXNpdF9wYXJ0M19ncmFuZHRvdGFsX3NhcmNhc20gPSBuYV9pZih0YXNpdF9wYXJ0M19ncmFuZHRvdGFsX3NhcmNhc20sIDApKQpgYGAKCiMjIyBSTUVUCgpUaGUgKipSZWFkaW5nIHRoZSBNaW5kIGluIHRoZSBFeWVzIHRlc3QgKFJNRVQpKiogIGlzIGEgdGVzdCBvZiBzb2NpYWwgc2Vuc2l0aXZpdHkuIFRoZSBwYXJ0aWNpcGFudCBpcyBwcmVzZW50ZWQgd2l0aCBhIHNlcmllcyBvZiAzNiBwaG90b2dyYXBocyBvZiB0aGUgZXllIHJlZ2lvbiBhbmQgYXNrZWQgdG8gY2hvb3NlIHdoaWNoIG9mIDQgd29yZHMgYmVzdCBkZXNjcmliZXMgd2hhdCB0aGUgYWN0b3IgaW4gdGhlIHBob3RvZ3JhcGggaXMgdGhpbmtpbmcgb3IgZmVlbGluZy4KCmBgYHtyIHJtZXRfZGlzdHJpYnV0aW9ufQpwbG90X2x5KHNjb2dfZGYgJT4lCiAgICAgICAgICBnYXRoZXIoa2V5ID0gImFzc2Vzc21lbnQiLCB2YWx1ZSA9ICJzY29yZSIsIC1jKHJlY29yZF9pZCwgc3R1ZHksIGdyb3VwKSkgJT4lCiAgICAgICAgICBmaWx0ZXIoYXNzZXNzbWVudCAlaW4lIGMoInJtZXRfdG90YWwiKSkgJT4lCiAgICAgICAgICBtdXRhdGUoYXNzZXNzbWVudCA9IGZhY3Rvcihhc3Nlc3NtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygicm1ldF90b3RhbCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiUk1FVCBUb3RhbCIpKSksCiAgICAgICAgeCA9IH5hc3Nlc3NtZW50LCB5ID0gfnNjb3JlLCBjb2xvciA9IH5ncm91cCwgc3ltYm9sID0gfnN0dWR5LAogICAgICAgIHR5cGUgPSAiYm94IiwgYm94cG9pbnRzID0gImFsbCIsIGppdHRlciA9IDAuMywgcG9pbnRwb3MgPSAwLAogICAgICAgIGhvdmVyaW5mbyA9ICJ0ZXh0IiwKICAgICAgICB0ZXh0ID0gfnBhc3RlKCIgU3ViamVjdDogIiwgcmVjb3JkX2lkLAogICAgICAgICAgICAgICAgICAgICAgIjxicj4iLCBhc3Nlc3NtZW50LCAiOiAiLCBzY29yZSksCiAgICAgICAgbW9kZSA9ICJtYXJrZXJzIiwKICAgICAgICBtYXJrZXIgPSBsaXN0KGNvbG9yID0gIiMwMDAiLCBvcGFjaXR5ID0gMC41KSkgJT4lCiAgbGF5b3V0KGJveG1vZGUgPSAiZ3JvdXAiLAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiUk1FVCIpLAogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiU2NvcmUiKSkgJT4lCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpCmBgYAoKIyMjIElSSQoKVGhlICoqSW50ZXJwZXJzb25hbCBSZWFjdGl2aXR5IEluZGV4IChJUkkpKiogaXMgYSAyOCBpdGVtIHNlbGYtcmVwb3J0IG1lYXN1cmUgb2YgY29nbml0aXZlIGFuZCBhZmZlY3RpdmUgZW1wYXRoeS4KCmBgYHtyIGlyaV9kaXN0cmlidXRpb259CnBsb3RfbHkoc2NvZ19kZiAlPiUKICAgICAgICAgIGdhdGhlcihrZXkgPSAiYXNzZXNzbWVudCIsIHZhbHVlID0gInNjb3JlIiwgLWMocmVjb3JkX2lkLCBzdHVkeSwgZ3JvdXApKSAlPiUKICAgICAgICAgIGZpbHRlcihhc3Nlc3NtZW50ICVpbiUgYygiaXJpX2ZhY3Rvcl9wdCIsICJpcmlfZmFjdG9yX2ZzIiwgImlyaV9mYWN0b3JfZWMiLCAiaXJpX2ZhY3Rvcl9wZCIsICJpcmlfdG90YWwiKSkgJT4lCiAgICAgICAgICBtdXRhdGUoYXNzZXNzbWVudCA9IGZhY3Rvcihhc3Nlc3NtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiaXJpX2ZhY3Rvcl9wdCIsICJpcmlfZmFjdG9yX2ZzIiwgImlyaV9mYWN0b3JfZWMiLCAiaXJpX2ZhY3Rvcl9wZCIsICJpcmlfdG90YWwiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlBlcnNwZWN0aXZlLVRha2luZyIsICJGYW50YXN5IiwgIkVtcGF0aGljIENvbmNlcm4iLCAiUGVyc29uYWwgRGlzdHJlc3MiLCAiVG90YWwiKSkpLAogICAgICAgIHggPSB+YXNzZXNzbWVudCwgeSA9IH5zY29yZSwgY29sb3IgPSB+Z3JvdXAsIHN5bWJvbCA9IH5zdHVkeSwKICAgICAgICB0eXBlID0gImJveCIsIGJveHBvaW50cyA9ICJhbGwiLCBqaXR0ZXIgPSAwLjMsIHBvaW50cG9zID0gMCwKICAgICAgICBob3ZlcmluZm8gPSAidGV4dCIsCiAgICAgICAgdGV4dCA9IH5wYXN0ZSgiIFN1YmplY3Q6ICIsIHJlY29yZF9pZCwKICAgICAgICAgICAgICAgICAgICAgICI8YnI+IiwgYXNzZXNzbWVudCwgIjogIiwgc2NvcmUpLAogICAgICAgIG1vZGUgPSAibWFya2VycyIsCiAgICAgICAgbWFya2VyID0gbGlzdChjb2xvciA9ICIjMDAwIiwgb3BhY2l0eSA9IDAuNSkpICU+JQogIGxheW91dChib3htb2RlID0gImdyb3VwIiwKICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIklSSSBTdXNic2NhbGUiKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIlNjb3JlIikpICU+JQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQpgYGAKCiMjIyBUQVNJVC1SCgoqKlRoZSBBd2FyZW5lc3Mgb2YgU29jaWFsIEluZmVyZW5jZSBUZXN0LVJldmlzZWQgKFRBU0lULVIpKiogY29uc2lzdHMgb2YgZW1vdGlvbiBldmFsdWF0aW9uICgqKlBhcnQgMSoqKSwgc29jaWFsIGluZmVyZW5jZSAtIG1pbmltYWwgKCoqUGFydCAyKiopLCBhbmQgc29jaWFsIGluZmVyZW5jZSAtIGVucmljaGVkICgqKlBhcnQgMyoqKS4gSW4gUGFydCAxLCB0aGUgcGFydGljaXBhbnQgdmlld3MgMjggYnJpZWYgdmlkZW8gY2xpcHMgdG8gaWRlbnRpZnkgdGhlIGVtb3Rpb24gZXhwcmVzc2VkIGJ5IHRoZSBhY3Rvci4gSW4gUGFydCAyIGFuZCAzLCB0aGUgcGFydGljaXBhbnQgdmlld3MgMzEgdmlkZW90YXBlZCB2aWduZXR0ZXMgb2Ygc29jaWFsIGludGVyYWN0aW9ucyBpbnZvbHZpbmcgbGllcyBhbmQgc2FyY2FzbSBhbmQgbWFrZXMganVkZ2VtZW50cyByZWdhcmRpbmcgd2hhdCB0aGUgaW5kaXZpZHVhbCBpbiB0aGUgc2NlbmUgYmVsaWV2ZWQgb3Iga25ldywgbWVhbnQgYnkgd2hhdCBoZSBvciBzaGUgc2FpZCwgaW50ZW5kZWQgdG8gZG8sIGFuZCBhY3R1YWxseSBmZWx0LgoKYGBge3IgdGFzaXRfZGlzdHJpYnV0aW9uc30KcGxvdF9seShzY29nX2RmICU+JQogICAgICAgICAgZ2F0aGVyKGtleSA9ICJhc3Nlc3NtZW50IiwgdmFsdWUgPSAic2NvcmUiLCAtYyhyZWNvcmRfaWQsIHN0dWR5LCBncm91cCkpICU+JQogICAgICAgICAgZmlsdGVyKGFzc2Vzc21lbnQgJWluJSBjKCJ0YXNpdF9jb3JyZWN0X3RvdGFsIiwgInRhc2l0X3BhcnQyX2dyYW5kdG90YWwiLCAidGFzaXRfcGFydDNfZ3JhbmR0b3RhbF9saWVzIiwgInRhc2l0X3BhcnQzX2dyYW5kdG90YWxfc2FyY2FzbSIpKSAlPiUKICAgICAgICAgIG11dGF0ZShhc3Nlc3NtZW50ID0gZmFjdG9yKGFzc2Vzc21lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJ0YXNpdF9jb3JyZWN0X3RvdGFsIiwgInRhc2l0X3BhcnQyX2dyYW5kdG90YWwiLCAidGFzaXRfcGFydDNfZ3JhbmR0b3RhbF9saWVzIiwgInRhc2l0X3BhcnQzX2dyYW5kdG90YWxfc2FyY2FzbSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiUGFydCAxIiwgIlBhcnQgMiIsICJQYXJ0IDMgTGllcyIsICJQYXJ0IDMgU2FyY2FzbSIpKSksCiAgICAgICAgeCA9IH5hc3Nlc3NtZW50LCB5ID0gfnNjb3JlLCBjb2xvciA9IH5ncm91cCwgc3ltYm9sID0gfnN0dWR5LAogICAgICAgIHR5cGUgPSAiYm94IiwgYm94cG9pbnRzID0gImFsbCIsIGppdHRlciA9IDAuMywgcG9pbnRwb3MgPSAwLAogICAgICAgIGhvdmVyaW5mbyA9ICJ0ZXh0IiwKICAgICAgICB0ZXh0ID0gfnBhc3RlKCIgU3ViamVjdDogIiwgcmVjb3JkX2lkLAogICAgICAgICAgICAgICAgICAgICAgIjxicj4iLCBhc3Nlc3NtZW50LCAiOiAiLCBzY29yZSksCiAgICAgICAgbW9kZSA9ICJtYXJrZXJzIiwKICAgICAgICBtYXJrZXIgPSBsaXN0KGNvbG9yID0gIiMwMDAiLCBvcGFjaXR5ID0gMC41KSkgJT4lCiAgbGF5b3V0KGJveG1vZGUgPSAiZ3JvdXAiLAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiVEFTSVQtUiBTdXNic2NhbGUiKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIlNjb3JlIikpICU+JQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQpgYGAKCiMjIyBFUi00MAoKVGhlICoqUGVubiBFbW90aW9uIFJlY29nbml0aW9uIFRhc2stNDAgKEVSLTQwKSoqIGlzIGEgbWVhc3VyZSBvZiBlbW90aW9uYWwgcHJvY2Vzc2luZy4gUGFydGljaXBhbnRzIHJhdGUgdGhlIGVtb3Rpb25hbCB2YWxlbmNlIG9mIDQwIGZhY2VzIGRpc3BsYXlpbmcgaGFwcHksIHNhZCBvciBuZXV0cmFsIGV4cHJlc3Npb25zIG9uIGEgNyBwb2ludCBzY2FsZS4gCgpgYGB7ciBlcjQwX2NvcnJlY3R9CnBsb3RfbHkoc2NvZ19kZiAlPiUKICAgICAgICAgIGdhdGhlcihrZXkgPSAiYXNzZXNzbWVudCIsIHZhbHVlID0gInNjb3JlIiwgLWMocmVjb3JkX2lkLCBzdHVkeSwgZ3JvdXApKSAlPiUKICAgICAgICAgIGZpbHRlcihhc3Nlc3NtZW50ICVpbiUgYygic2NvZ19lcjQwX2NyX2NvbHVtbnBjcl92YWx1ZSIsICJzY29nX2VyNDBhbmdfY29sdW1udiIsICJzY29nX2VyNDBmZWFyX2NvbHVtbnciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzY29nX2VyNDBoYXBfY29sdW1ueCIsICJzY29nX2VyNDBub2VfY29sdW1ueSIsICJzY29nX2VyNDBzYWRfY29sdW1ueiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzY29nX2VyNDBtaWxkX2NvbHVtbmFwIiwgInNjb2dfZXI0MGV4dHJfY29sdW1uYXEiKSkgJT4lCiAgICAgICAgICBtdXRhdGUoYXNzZXNzbWVudCA9IGZhY3Rvcihhc3Nlc3NtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygic2NvZ19lcjQwX2NyX2NvbHVtbnBjcl92YWx1ZSIsICJzY29nX2VyNDBhbmdfY29sdW1udiIsICJzY29nX2VyNDBmZWFyX2NvbHVtbnciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2NvZ19lcjQwaGFwX2NvbHVtbngiLCAic2NvZ19lcjQwbm9lX2NvbHVtbnkiLCAic2NvZ19lcjQwc2FkX2NvbHVtbnoiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNjb2dfZXI0MG1pbGRfY29sdW1uYXAiLCAic2NvZ19lcjQwZXh0cl9jb2x1bW5hcSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQ29ycmVjdCBSZXNwb25zZXMiLCAiQ29ycmVjdCBBbmdlciIsICJDb3JyZWN0IEZlYXIiLCAiQ29ycmVjdCBIYXBweSIsICJDb3JyZWN0IE5ldXRyYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29ycmVjdCBTYWQiLCAiQ29ycmVjdCBNaWxkIiwgIkNvcnJlY3QgRXh0cmVtZSIpKSksCiAgICAgICAgeCA9IH5hc3Nlc3NtZW50LCB5ID0gfnNjb3JlLCBjb2xvciA9IH5ncm91cCwgc3ltYm9sID0gfnN0dWR5LAogICAgICAgIHR5cGUgPSAiYm94IiwgYm94cG9pbnRzID0gImFsbCIsIGppdHRlciA9IDAuMywgcG9pbnRwb3MgPSAwLAogICAgICAgIGhvdmVyaW5mbyA9ICJ0ZXh0IiwKICAgICAgICB0ZXh0ID0gfnBhc3RlKCIgU3ViamVjdDogIiwgcmVjb3JkX2lkLAogICAgICAgICAgICAgICAgICAgICAgIjxicj4iLCBhc3Nlc3NtZW50LCAiOiAiLCBzY29yZSksCiAgICAgICAgbW9kZSA9ICJtYXJrZXJzIiwKICAgICAgICBtYXJrZXIgPSBsaXN0KGNvbG9yID0gIiMwMDAiLCBvcGFjaXR5ID0gMC41KSkgJT4lCiAgbGF5b3V0KGJveG1vZGUgPSAiZ3JvdXAiLAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiRVItNDAgU3VzYnNjYWxlIiksCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJTY29yZSIpKSAlPiUKICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkKYGBgCgpBIG1lZGlhbiByZXNwb25zZSB0aW1lIGJlbG93IDEwMDAgc2Vjb25kcyBpbmRpY2F0ZXMgaW5hdHRlbnRpb24gYW5kIHNob3VsZCBiZSBmaWx0ZXJlZCBvdXQgZnJvbSBmdXJ0aGVyIGFuYWx5c2lzLgoKYGBge3IgZXI0MF9ydH0KcGxvdF9seShzY29nX2RmICU+JQogICAgICAgICAgZ2F0aGVyKGtleSA9ICJhc3Nlc3NtZW50IiwgdmFsdWUgPSAic2NvcmUiLCAtYyhyZWNvcmRfaWQsIHN0dWR5LCBncm91cCkpICU+JQogICAgICAgICAgZmlsdGVyKGFzc2Vzc21lbnQgJWluJSBjKCJzY29nX2VyNDBfY3J0X2NvbHVtbnFjcnRfdmFsdWUiLCAic2NvZ19lcjQwbWRydF9jb2x1bW5hciIsICJzY29nX2VyNDBleHJ0X2NvbHVtbmFzIikpICU+JQogICAgICAgICAgbXV0YXRlKGFzc2Vzc21lbnQgPSBmYWN0b3IoYXNzZXNzbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoInNjb2dfZXI0MF9jcnRfY29sdW1ucWNydF92YWx1ZSIsICJzY29nX2VyNDBtZHJ0X2NvbHVtbmFyIiwgInNjb2dfZXI0MGV4cnRfY29sdW1uYXMiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkNvcnJlY3QgUmVzcG9uc2VzIiwgIkNvcnJlY3QgTWlsZCIsICJDb3JyZWN0IEV4dHJlbWUiKSkpLAogICAgICAgIHggPSB+YXNzZXNzbWVudCwgeSA9IH5zY29yZSwgY29sb3IgPSB+Z3JvdXAsIHN5bWJvbCA9IH5zdHVkeSwKICAgICAgICB0eXBlID0gImJveCIsIGJveHBvaW50cyA9ICJhbGwiLCBqaXR0ZXIgPSAwLjMsIHBvaW50cG9zID0gMCwKICAgICAgICBob3ZlcmluZm8gPSAidGV4dCIsCiAgICAgICAgdGV4dCA9IH5wYXN0ZSgiIFN1YmplY3Q6ICIsIHJlY29yZF9pZCwKICAgICAgICAgICAgICAgICAgICAgICI8YnI+IiwgYXNzZXNzbWVudCwgIjogIiwgc2NvcmUpLAogICAgICAgIG1vZGUgPSAibWFya2VycyIsCiAgICAgICAgbWFya2VyID0gbGlzdChjb2xvciA9ICIjMDAwIiwgb3BhY2l0eSA9IDAuNSkpICU+JQogIGxheW91dChib3htb2RlID0gImdyb3VwIiwKICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIkVSLTQwIFN1c2JzY2FsZSIpLAogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiTWVkaWFuIFJlc3BvbnNlIFRpbWUgKHNlY29uZHMpIikpICU+JQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQpgYGAKCiMjIE1SSQoKYGBge3IgbXJpX2RhdGFmcmFtZX0KeG5hdF9kZiA8LQogIHNwYXNkX3JlZGNhcF9kZiAlPiUKICBzZWxlY3QocmVjb3JkX2lkLCBtcmlfZG9hLCBtcmlfZm9ybV9jb21wbGV0ZSkgJT4lCiAgZmlsdGVyKG1yaV9mb3JtX2NvbXBsZXRlICE9IDIpICU+JQogIHJlbmFtZShkYXRlID0gbXJpX2RvYSkgJT4lCiAgbXV0YXRlKHN0dWR5ID0gIlNQQVNEIikKCm1yaV9kZiA8LQogIHhuYXRfZGYgJT4lCiAgZ3JvdXBfYnkoc3R1ZHksIGRhdGUpICU+JQogIGNvdW50KCkgJT4lCiAgdW5ncm91cCgpICU+JQogIG11dGF0ZSh0b3RhbCA9IGN1bXN1bShuKSkgJT4lCiAgc2VsZWN0KC1uKSAlPiUKICBiaW5kX3Jvd3MoCiAgICB0YXJnZXRzX2RmICU+JQogICAgICBtdXRhdGUoc3R1ZHkgPSAidGFyZ2V0IikgJT4lCiAgICAgIHJlbmFtZSh0b3RhbCA9IHRhcmdldCwKICAgICAgICAgICAgIGRhdGUgPSBtb250aCkgJT4lCiAgICAgIHNlbGVjdChzdHVkeSwgZGF0ZSwgdG90YWwpKQoKcGFydGljaXBhbnRzX3JlY3J1aXRlZCA8LSBucm93KHhuYXRfZGYpCgptb250aHNfb2Zfc3R1ZHkgPC0gbnJvdygKICBtcmlfZGYgJT4lCiAgZmlsdGVyKHN0dWR5ID09ICJ0YXJnZXQiKSAlPiUKICBmaWx0ZXIoIWRhdGUgPT0gIjIwMTgtMDctMzEiKSAlPiUKICBmaWx0ZXIoZGF0ZSA8IGNlaWxpbmdfZGF0ZShTeXMuRGF0ZSgpLCAibW9udGgiKSkKKQoKYXZnX3JlY3J1aXRtZW50IDwtIHJvdW5kKHBhcnRpY2lwYW50c19yZWNydWl0ZWQgLyBtb250aHNfb2Zfc3R1ZHksIGRpZ2l0cyA9IDIpCmBgYAoKVGh1cyBmYXIsICoqYHIgcGFydGljaXBhbnRzX3JlY3J1aXRlZGAqKiBwYXJ0aWNpcGFudHMgaGF2ZSBiZWVuIHNjYW5uZWQuIFRoZSB0YXJnZXQgaXMgdG8gc2NhbiAqKjMuMzMqKiBwYXJ0aWNpcGFudHMgcGVyIG1vbnRoICgqKjQwKiogcGVyIHllYXIpLiBXZSBhcmUgY3VycmVudGx5IGF2ZXJhZ2luZyAqKmByIGF2Z19yZWNydWl0bWVudGAqKiBwYXJ0aWNpcGFudHMgcGVyIG1vbnRoLgoKYGBge3IgbXJpX3Bsb3R9CmEgPC0gbGlzdCgKICB4ID0gdGFpbChtcmlfZGYkZGF0ZSwgbiA9IDEpLAogIHkgPSB0YWlsKG1yaV9kZiR0b3RhbCwgbiA9IDEpLAogIHRleHQgPSBtcmlfZGYkdG90YWwsCiAgeHJlZiA9ICJ4IiwKICB5cmVmID0gInkiLAogIHNob3dhcnJvdyA9IEZBTFNFKQoKbXJpX3Bsb3QgPC0KICBwbG90X2x5KG1yaV9kZiwgCiAgICAgICAgICB4ID0gfmRhdGUsIHkgPSB+dG90YWwsCiAgICAgICAgICB0eXBlPSAnc2NhdHRlcicsIG1vZGUgPSAnbGluZXMrbWFya2VycycsCiAgICAgICAgICBjb2xvciA9IH5zdHVkeSkgJT4lCiAgbGF5b3V0KGZvbnQgPSB0LAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAnRGF0ZScsCiAgICAgICAgICAgICAgICAgICAgICByYW5nZSA9IGMoYXMuRGF0ZSgiMjAxOC0wNy0zMSIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXMuRGF0ZSgpICsgMzApKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gJyMgb2YgUGFydGljaXBhbnRzIFNjYW5uZWQnLAogICAgICAgICAgICAgICAgICAgICAgcmFuZ2UgPSBjKDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFpbCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1yaV9kZiR0b3RhbFttcmlfZGYkZGF0ZSA8IGx1YnJpZGF0ZTo6Y2VpbGluZ19kYXRlKFN5cy5EYXRlKCksIm1vbnRoIildLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IDEpKSkpICU+JQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQoKbXJpX3Bsb3QKCmBgYAoKCmBgYHtyIHNwaW5zIHogdHJhbnNmb3JtYXRpb24sIGluY2x1ZGU9RkFMU0V9CnNwaW5fbnBfZGYgPC0KIHJlYWRfY3N2KAogIi9zY3JhdGNoL25zaGFybWEvU1BJTi1BU0RyZG9jL3NwaW5fbnBfZGYuY3N2IikKCiN6c2NvcmVfZGYgPSBkYXRhLmZyYW1lKCkKY2FzZXMgPSBzcGluX25wX2RmW3NwaW5fbnBfZGYkZGlhZ25vc3RpY19ncm91cCA9PSAnY2FzZScsXQpjb250cm9scyA9IHNwaW5fbnBfZGZbc3Bpbl9ucF9kZiRkaWFnbm9zdGljX2dyb3VwID09ICdjb250cm9sJyxdCgptZWFuX01BVFJJQ1MgPSBtZWFuKGNvbnRyb2xzJG5wX2NvbXBvc2l0ZV90c2NvcmUsIG5hLnJtID0gVFJVRSkKc2RfTUFUUklDUyA9IHNkKGNvbnRyb2xzJG5wX2NvbXBvc2l0ZV90c2NvcmUsIG5hLnJtID0gVFJVRSkKY2FzZXMkenNjb3JlX01BVFJJQ1MgPSAoY2FzZXMkbnBfY29tcG9zaXRlX3RzY29yZSAtIG1lYW5fTUFUUklDUykvIHNkX01BVFJJQ1MKI3pzY29yZV9kZiA9IGNiaW5kKHpzY29yZV9kZiwgY2FzZXMkenNjb3JlX01BVFJJQ1MpCgptZWFuX01BVFJJQ1MgPSBtZWFuKGNvbnRyb2xzJG5wX2NvbXBvc2l0ZV90c2NvcmUsIG5hLnJtID0gVFJVRSkKc2RfTUFUUklDUyA9IHNkKGNvbnRyb2xzJG5wX2NvbXBvc2l0ZV90c2NvcmUsIG5hLnJtID0gVFJVRSkKY29udHJvbHMkenNjb3JlX01BVFJJQ1MgPSAoY29udHJvbHMkbnBfY29tcG9zaXRlX3RzY29yZSAtIG1lYW5fTUFUUklDUykvIHNkX01BVFJJQ1MKI3pzY29yZV9kZiA9IGNiaW5kKHpzY29yZV9kZiwgY2FzZXMkenNjb3JlX01BVFJJQ1MpCgptZWFuX1JNRVQgPSBtZWFuKGNvbnRyb2xzJHNjb2dfcm1ldF90b3RhbCwgbmEucm0gPSBUUlVFKQpzZF9STUVUID0gc2QoY29udHJvbHMkc2NvZ19ybWV0X3RvdGFsLCBuYS5ybSA9IFRSVUUpCmNhc2VzJHpzY29yZV9STUVUID0gKGNhc2VzJHNjb2dfcm1ldF90b3RhbCAtIG1lYW5fUk1FVCkgLyBzZF9STUVUCiN6c2NvcmVfZGYgPSBjYmluZCh6c2NvcmVfZGYsIGNhc2VzJHpzY29yZV9STUVUKQoKbWVhbl9STUVUID0gbWVhbihjb250cm9scyRzY29nX3JtZXRfdG90YWwsIG5hLnJtID0gVFJVRSkKc2RfUk1FVCA9IHNkKGNvbnRyb2xzJHNjb2dfcm1ldF90b3RhbCwgbmEucm0gPSBUUlVFKQpjb250cm9scyR6c2NvcmVfUk1FVCA9IChjb250cm9scyRzY29nX3JtZXRfdG90YWwgLSBtZWFuX1JNRVQpIC8gc2RfUk1FVAojenNjb3JlX2RmID0gY2JpbmQoenNjb3JlX2RmLCBjYXNlcyR6c2NvcmVfUk1FVCkKCm1lYW5fQlNGUz0gbWVhbihjb250cm9scyRic2ZzX3RvdGFsLCBuYS5ybSA9IFRSVUUpCnNkX0JTRlMgPSBzZChjb250cm9scyRic2ZzX3RvdGFsLCBuYS5ybSA9IFRSVUUpCmNhc2VzJHpzY29yZV9CU0ZTID0gKGNhc2VzJGJzZnNfdG90YWwgLSBtZWFuX0JTRlMpIC8gc2RfQlNGUwojenNjb3JlX2RmID0gY2JpbmQoenNjb3JlX2RmLCBjYXNlcyR6c2NvcmVfQlNGUykKCm1lYW5fQlNGUz0gbWVhbihjb250cm9scyRic2ZzX3RvdGFsLCBuYS5ybSA9IFRSVUUpCnNkX0JTRlMgPSBzZChjb250cm9scyRic2ZzX3RvdGFsLCBuYS5ybSA9IFRSVUUpCmNvbnRyb2xzJHpzY29yZV9CU0ZTID0gKGNvbnRyb2xzJGJzZnNfdG90YWwgLSBtZWFuX0JTRlMpIC8gc2RfQlNGUwojenNjb3JlX2RmID0gY2JpbmQoenNjb3JlX2RmLCBjYXNlcyR6c2NvcmVfQlNGUykKCm1lYW5fSVEgPSBtZWFuKGNvbnRyb2xzJHd0YXJfc3RkX3Njb3JlLCBuYS5ybSA9IFRSVUUpCnNkX0lRID0gc2QoY29udHJvbHMkd3Rhcl9zdGRfc2NvcmUsIG5hLnJtID0gVFJVRSkKY2FzZXMkenNjb3JlX0lRID0gKGNhc2VzJHd0YXJfc3RkX3Njb3JlIC0gbWVhbl9JUSkgLyBzZF9JUQojenNjb3JlX2RmID0gY2JpbmQoenNjb3JlX2RmLCBjYXNlcyR6c2NvcmVfSVEpCgptZWFuX0lRID0gbWVhbihjb250cm9scyR3dGFyX3N0ZF9zY29yZSwgbmEucm0gPSBUUlVFKQpzZF9JUSA9IHNkKGNvbnRyb2xzJHd0YXJfc3RkX3Njb3JlLCBuYS5ybSA9IFRSVUUpCmNvbnRyb2xzJHpzY29yZV9JUSA9IChjb250cm9scyR3dGFyX3N0ZF9zY29yZSAtIG1lYW5fSVEpIC8gc2RfSVEKI3pzY29yZV9kZiA9IGNiaW5kKHpzY29yZV9kZiwgY2FzZXMkenNjb3JlX0lRKQoKenNjb3JlX2RmPSBjYmluZChjYXNlcyR6c2NvcmVfTUFUUklDUyxjb250cm9scyR6c2NvcmVfTUFUUklDUyxjYXNlcyR6c2NvcmVfUk1FVCxjb250cm9scyR6c2NvcmVfUk1FVCxjYXNlcyR6c2NvcmVfSVEsIGNvbnRyb2xzJHpzY29yZV9JUSwgY2FzZXMkenNjb3JlX0JTRlMsY29udHJvbHMkenNjb3JlX0JTRlMpCgp6c2NvcmVfZGY9IHJiaW5kKGNhc2VzLGNvbnRyb2xzKQoKYGBgCgoKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CgpCU0ZTX2RmPC0KICAgcmVhZF9jc3YoCiAiL3NjcmF0Y2gvbnNoYXJtYS9TUElOLUFTRHJkb2MvQlNGU19kZi5jc3YiKSU+JQogIAptdXRhdGUoc3R1ZHkgPSAiU1BBU0QiLAogICAgICAgICBncm91cCA9IGNhc2Vfd2hlbihncmVwbCgiYXJtXzIiLCByZWRjYXBfZXZlbnRfbmFtZSkgfiAiQ2FzZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXBsKCJhcm1fMSIsIHJlZGNhcF9ldmVudF9uYW1lKSB+ICJDb250cm9sIikgJT4lCiAgICAgICAgICAgICAgICAgICAgZmFjdG9yKC4pKSAlPiUgICAgICAgCnNlbGVjdCgtYyhyZWRjYXBfZXZlbnRfbmFtZSkpICU+JQogIGdyb3VwX2J5KHJlY29yZF9pZCkgJT4lCiAgZmlsbCgtcmVjb3JkX2lkLCAuZGlyZWN0aW9uID0gImRvd24iKSAlPiUKICBmaWxsKC1yZWNvcmRfaWQsIC5kaXJlY3Rpb24gPSAidXAiKSAlPiUKICBzbGljZSgxKSAlPiUKICB1bmdyb3VwKCkKCmJzZnNfYXNkX2Nhc2UgPC0KICBCU0ZTX2RmICU+JQogIGZpbHRlcihncm91cCA9PSAiQ2FzZSIpICU+JQogIG5yb3coKQoKYnNmc19hc2RfY29udHJvbCA8LQogIEJTRlNfZGYgJT4lCiAgZmlsdGVyKGdyb3VwID09ICJDb250cm9sIikgJT4lCiAgbnJvdygpCgpCU0ZTX2RmJGJzZnNfYXNkX3RvdGFsIDwtIHJvd1N1bXMoQlNGU19kZlssYygnYnNmc19zZWNfZ3JhbmR0b3RhbDEnLCAnYnNmc19zZWNfZ3JhbmR0b3RhbDInKV0sIG5hLnJtPVRSVUUpCkJTRlNfZGZbQlNGU19kZiRic2ZzX2FzZF90b3RhbCA9PTAsJ2JzZnNfYXNkX3RvdGFsJ10gPC0gTkEKCmBgYAoKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CgpBQkFTX2RmPC0KICAgcmVhZF9jc3YoCiAiL3NjcmF0Y2gvbnNoYXJtYS9TUElOLUFTRHJkb2MvQUJBU19kZi5jc3YiKSAlPiUKICAKbXV0YXRlKHN0dWR5ID0gIlNQQVNEIiwKICAgICAgICAgZ3JvdXAgPSBjYXNlX3doZW4oZ3JlcGwoImFybV8yIiwgcmVkY2FwX2V2ZW50X25hbWUpIH4gIkNhc2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBncmVwbCgiYXJtXzEiLCByZWRjYXBfZXZlbnRfbmFtZSkgfiAiQ29udHJvbCIpICU+JQogICAgICAgICAgICAgICAgICAgIGZhY3RvciguKSkgJT4lICAgICAgIApzZWxlY3QoLWMocmVkY2FwX2V2ZW50X25hbWUpKSAlPiUKICBncm91cF9ieShyZWNvcmRfaWQpICU+JQogIGZpbGwoLXJlY29yZF9pZCwgLmRpcmVjdGlvbiA9ICJkb3duIikgJT4lCiAgZmlsbCgtcmVjb3JkX2lkLCAuZGlyZWN0aW9uID0gInVwIikgJT4lCiAgc2xpY2UoMSkgJT4lCiAgdW5ncm91cCgpCgphYmFzX2FzZF9jYXNlIDwtCiAgQUJBU19kZiAlPiUKICBmaWx0ZXIoZ3JvdXAgPT0gIkNhc2UiKSAlPiUKICBucm93KCkKCmFiYXNfYXNkX2NvbnRyb2wgPC0KICBBQkFTX2RmICU+JQogIGZpbHRlcihncm91cCA9PSAiQ29udHJvbCIpICU+JQogIG5yb3coKQoKQUJBU19kZiRhYmFzX2FzZF90b3RhbCA8LSByb3dTdW1zKEFCQVNfZGZbLGMoJ2FiYXNfZ2FjJywgJ2FiYXNfZ2FjMScsICJhYmFzX2dhYzIiKV0sIG5hLnJtPVRSVUUpCkFCQVNfZGZbQUJBU19kZiRhYmFzX2FzZF90b3RhbCA9PSAwLCdhYmFzX2FzZF90b3RhbCddIDwtIE5BIApgYGAKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CnNwYXNkX2RlbW9fZGYgCmNhc2VfYXNkID0gc3Bhc2RfZGVtb19kZltzcGFzZF9kZW1vX2RmJGdyb3VwPT0nQ2FzZScsXQpjb250cm9sX2FzZCA9IHNwYXNkX2RlbW9fZGZbc3Bhc2RfZGVtb19kZiRncm91cD09J0NvbnRyb2wnLF0KCm1lYW5fTUFUUklDU3NkID0gbWVhbihjb250cm9sX2FzZCRucF9jb21wb3NpdGVfdHNjb3JlLCBuYS5ybSA9IFRSVUUpCnNkX01BVFJJQ1NzZCA9IHNkKGNvbnRyb2xfYXNkJG5wX2NvbXBvc2l0ZV90c2NvcmUsIG5hLnJtID0gVFJVRSkKY29udHJvbF9hc2QkenNjb3JlX01BVFJJQ1NzZCA9IChjb250cm9sX2FzZCRucF9jb21wb3NpdGVfdHNjb3JlIC0gbWVhbl9NQVRSSUNTc2QpIC8gc2RfTUFUUklDU3NkCiN6c2NvcmVfYXNkID0gY2JpbmQoenNjb3JlX2FzZCwgY29udHJvbF9hc2QkenNjb3JlX01BVFJJQ1NzZCkKCgptZWFuX01BVFJJQ1NzZCA9IG1lYW4oY29udHJvbF9hc2QkbnBfY29tcG9zaXRlX3RzY29yZSwgbmEucm0gPSBUUlVFKQpzZF9NQVRSSUNTc2QgPSBzZChjb250cm9sX2FzZCRucF9jb21wb3NpdGVfdHNjb3JlLCBuYS5ybSA9IFRSVUUpCmNhc2VfYXNkJHpzY29yZV9NQVRSSUNTc2QgPSAoY2FzZV9hc2QkbnBfY29tcG9zaXRlX3RzY29yZSAtIG1lYW5fTUFUUklDU3NkKS8gc2RfTUFUUklDU3NkCiN6c2NvcmVfYXNkID0gY2JpbmQoenNjb3JlX2FzZCwgY2FzZV9hc2QkenNjb3JlX01BVFJJQ1NzZCkKCgptYXRyaWNzX2FzZF96c2NvcmUgPSBjYmluZChjYXNlX2FzZCR6c2NvcmVfTUFUUklDU3NkLGNvbnRyb2xfYXNkJHpzY29yZV9NQVRSSUNTc2QpCgptYXRyaWNzX2FzZF96c2NvcmUgPSByYmluZChjYXNlX2FzZCxjb250cm9sX2FzZCkKCmBgYAoKYGBge3IgaW5jbHVkZT1GQUxTRX0KCkJTRlNfZGYKCmNhc2VfYXNkID0gQlNGU19kZltCU0ZTX2RmJGdyb3VwPT0nQ2FzZScsXQpjb250cm9sX2FzZCA9IEJTRlNfZGZbQlNGU19kZiRncm91cD09J0NvbnRyb2wnLF0KIAptZWFuX0JTRlNzZCA9IG1lYW4oY2FzZV9hc2QkYnNmc19hc2RfdG90YWwsIG5hLnJtID0gVFJVRSkKc2RfQlNGU3NkPSBzZChjYXNlX2FzZCRic2ZzX2FzZF90b3RhbCwgbmEucm0gPSBUUlVFKQpjYXNlX2FzZCR6c2NvcmVfQlNGU3NkID0gKGNhc2VfYXNkJGJzZnNfYXNkX3RvdGFsIC0gbWVhbl9CU0ZTc2QpIC8gc2RfQlNGU3NkCgptZWFuX0JTRlNzZCA9IG1lYW4oY29udHJvbF9hc2QkYnNmc19hc2RfdG90YWwsIG5hLnJtID0gVFJVRSkKc2RfQlNGU3NkPSBzZChjb250cm9sX2FzZCRic2ZzX2FzZF90b3RhbCwgbmEucm0gPSBUUlVFKQpjb250cm9sX2FzZCR6c2NvcmVfQlNGU3NkID0gKGNvbnRyb2xfYXNkJGJzZnNfYXNkX3RvdGFsIC0gbWVhbl9CU0ZTc2QpIC8gc2RfQlNGU3NkCgpic2ZzX2FzZF96c2NvcmU9IGNiaW5kKGNhc2VfYXNkJHpzY29yZV9CU0ZTc2QsIGNvbnRyb2xfYXNkJHpzY29yZV9CU0ZTc2QpCmJzZnNfYXNkX3pzY29yZT0gcmJpbmQoY2FzZV9hc2QsY29udHJvbF9hc2QpCiN6c2NvcmVfYXNkPWNiaW5kKHpzY29yZV9hc2QsIEJTRlNfZGYpCmBgYAoKYGBge3IgaW5jbHVkZT1GQUxTRX0KQUJBU19kZgoKY2FzZV9hc2QgPSBBQkFTX2RmW0FCQVNfZGYkZ3JvdXA9PSdDYXNlJyxdCmNvbnRyb2xfYXNkID0gQUJBU19kZltBQkFTX2RmJGdyb3VwPT0nQ29udHJvbCcsXQoKbWVhbl9BQkFTc2QgPSBtZWFuKGNvbnRyb2xfYXNkJGFiYXNfYXNkX3RvdGFsLG5hLnJtID0gVFJVRSkKc2RfQUJBU3NkPSBzZChjb250cm9sX2FzZCRhYmFzX2FzZF90b3RhbCxuYS5ybSA9IFRSVUUpCmNvbnRyb2xfYXNkJHpzY29yZV9BQkFTc2QgPSAoY29udHJvbF9hc2QkYWJhc19hc2RfdG90YWwgLSBtZWFuX0FCQVNzZCkgLyBzZF9BQkFTc2QKCm1lYW5fQUJBU3NkID0gbWVhbihjb250cm9sX2FzZCRhYmFzX2FzZF90b3RhbCxuYS5ybSA9IFRSVUUpCnNkX0FCQVNzZD0gc2QoY29udHJvbF9hc2QkYWJhc19hc2RfdG90YWwsbmEucm0gPSBUUlVFKQpjYXNlX2FzZCR6c2NvcmVfQUJBU3NkID0gKGNhc2VfYXNkJGFiYXNfYXNkX3RvdGFsIC0gbWVhbl9BQkFTc2QpIC8gc2RfQUJBU3NkCgoKYWJhc19hc2RfenNjb3JlPSBjYmluZChjYXNlX2FzZCR6c2NvcmVfQUJBU3NkLGNvbnRyb2xfYXNkJHpzY29yZV9BQkFTc2QpCmFiYXNfYXNkX3pzY29yZT0gcmJpbmQoY2FzZV9hc2QsY29udHJvbF9hc2QpCgojenNjb3JlX2FzZD1jYmluZCh6c2NvcmVfYXNkICwgQUJBU19kZikKI3pzY29yZV9hc2Q9IGNiaW5kKGNhc2VfYXNkJHpzY29yZV9BQkFTc2QsY29udHJvbF9hc2QkenNjb3JlX0FCQVNzZCxjYXNlX2FzZCR6c2NvcmVfQlNGU3NkLCBjb250cm9sX2FzZCR6c2NvcmVfQlNGU3NkKQoKI0FCQVNfZGYgPC0gcmJpbmQoc3Bhc2RfZGVtb19kZixCU0ZTX2RmKQoKCmBgYAoKCgpgYGB7cn0KCiNtYXRyaWNzIHNjb3JlIG9mIHNwaW5zIHZpb2xpbiBwbG90CiNnZ3Bsb3QoenNjb3JlX2RmLCBhZXMoZGlhZ25vc3RpY19ncm91cCwgenNjb3JlX01BVFJJQ1MpKSArCiAgICAjZ2VvbV92aW9saW4oKSArZ2VvbV9wb2ludCgpIAoKI1JNRVQgU2NvcmUgb2Ygc3BpbnMgdmlvbGluIHBsb3QKI2dncGxvdCh6c2NvcmVfZGYsIGFlcyhkaWFnbm9zdGljX2dyb3VwLCB6c2NvcmVfUk1FVCkpICsKICAgICNnZW9tX3Zpb2xpbigpICtnZW9tX3BvaW50KCkgCiNCaXJjaHdvb2QgU0ZTIFNjb3JlIG9mIHNwaW5zIHZpb2xpbiBwbG90CiNnZ3Bsb3QoenNjb3JlX2RmLCBhZXMoZGlhZ25vc3RpY19ncm91cCwgenNjb3JlX0JTRlMpKSArCiAgICAjZ2VvbV92aW9saW4oKSArZ2VvbV9wb2ludCgpIAoKI0VzdGltYXRlZCBJUSBvZiBzcGlucyB2aW9saW4gcGxvdCAKI2dncGxvdCh6c2NvcmVfZGYsIGFlcyhkaWFnbm9zdGljX2dyb3VwLCB6c2NvcmVfSVEpKSArCiAgICAjZ2VvbV92aW9saW4oKSArZ2VvbV9wb2ludCgpIAoKYGBgCgoKCgoKCiMjIFNjb3JlIERpc3RyaWJ1dGlvbnMgCmBgYHtyfQoKbWF0cmljc19kaXN0cmlidXRpb24gPC0KcGxvdF9seShhbHBoYSA9IDAuNiwgYXV0b2JpbnggPSBGQUxTRSwKICAgICAgICAgIHhiaW5zID0gbGlzdChzdGFydCA9IC02LCBlbmQgPSA1LCBzaXplID0gMSkpICU+JQogIGFkZF9oaXN0b2dyYW0gKHggPSB+enNjb3JlX2RmJHpzY29yZV9NQVRSSUNTW3pzY29yZV9kZiRkaWFnbm9zdGljX2dyb3VwID09ICJjb250cm9sIl0sbmFtZSA9ICJDb250cm9sIFNQSU5TIiwpICU+JQogIGFkZF9oaXN0b2dyYW0gKHggPSB+enNjb3JlX2RmJHpzY29yZV9NQVRSSUNTW3pzY29yZV9kZiRkaWFnbm9zdGljX2dyb3VwID09ICJjYXNlIl0sIG5hbWUgPSAiQ2FzZSBTUElOUyIsKSAlPiUKICBhZGRfaGlzdG9ncmFtICh4PSB+bWF0cmljc19hc2RfenNjb3JlJHpzY29yZV9NQVRSSUNTc2RbbWF0cmljc19hc2RfenNjb3JlJGdyb3VwPT0gIkNvbnRyb2wiXSwgbmFtZSA9ICJDb250cm9sIFNQSU4tQVNEIikgICU+JSAKICBhZGRfaGlzdG9ncmFtICh4PSB+bWF0cmljc19hc2RfenNjb3JlJHpzY29yZV9NQVRSSUNTc2RbbWF0cmljc19hc2RfenNjb3JlJGdyb3VwPT0gIkNhc2UiXSwgbmFtZSA9ICJDYXNlIFNQSU4tQVNEIikgICU+JQogCiAgIGxheW91dChiYXJtb2RlID0gIm92ZXJsYXkiLAogICAgICAgICBmb250ID0gdCwKICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIk1BVFJJQ1MgU2NvcmUiKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIkNvdW50IikpICU+JQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQoKbWF0cmljc19kaXN0cmlidXRpb24KYGBgCgpgYGB7cn0KQlNGU19kaXN0cmlidXRpb24gPC0KcGxvdF9seShhbHBoYSA9IDAuNiwgYXV0b2JpbnggPSBGQUxTRSwKICAgICAgICAgIHhiaW5zID0gbGlzdChzdGFydCA9IC02LCBlbmQgPSA1LCBzaXplID0gMSkpICU+JQogIGFkZF9oaXN0b2dyYW0gKHggPSB+enNjb3JlX2RmJHpzY29yZV9CU0ZTW3pzY29yZV9kZiRkaWFnbm9zdGljX2dyb3VwID09ICJjb250cm9sIl0sbmFtZSA9ICJDb250cm9sIFNQSU5TIiwpICU+JQogIGFkZF9oaXN0b2dyYW0gKHggPSB+enNjb3JlX2RmJHpzY29yZV9CU0ZTW3pzY29yZV9kZiRkaWFnbm9zdGljX2dyb3VwID09ICJjYXNlIl0sIG5hbWUgPSAiQ2FzZSBTUElOUyIsKSAlPiUKICBhZGRfaGlzdG9ncmFtICh4PSB+YnNmc19hc2RfenNjb3JlJHpzY29yZV9CU0ZTc2RbYnNmc19hc2RfenNjb3JlJGdyb3VwPT0gIkNvbnRyb2wiXSwgbmFtZSA9ICJDb250cm9sIFNQSU4tQVNEIikgICU+JQogIGFkZF9oaXN0b2dyYW0gKHg9IH5ic2ZzX2FzZF96c2NvcmUkenNjb3JlX0JTRlNzZFtic2ZzX2FzZF96c2NvcmUkZ3JvdXA9PSAiQ2FzZSJdLCBuYW1lID0gIkNhc2UgU1BJTi1BU0QiKSAgJT4lCgogIGxheW91dChiYXJtb2RlID0gIm92ZXJsYXkiLAogICAgICAgICBmb250ID0gdCwKICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIkJTRlMgU2NvcmUiKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIkNvdW50IikpICU+JQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQoKQlNGU19kaXN0cmlidXRpb24KYGBgCgpgYGB7cn0KCkFCQVNfZGlzdHJpYnV0aW9uIDwtCnBsb3RfbHkoYWxwaGEgPSAwLjYsIGF1dG9iaW54ID0gRkFMU0UsCiAgICAgICAgICB4YmlucyA9IGxpc3Qoc3RhcnQgPSAtNiwgZW5kID0gNSwgc2l6ZSA9IDEpKSAlPiUKICBhZGRfaGlzdG9ncmFtICh4PSB+YWJhc19hc2RfenNjb3JlJHpzY29yZV9BQkFTc2RbYWJhc19hc2RfenNjb3JlJGdyb3VwPT0gIkNhc2UiXSwgbmFtZSA9ICIgQ2FzZSBTUElOLUFTRCIpICAlPiUKICBhZGRfaGlzdG9ncmFtICh4PSB+YWJhc19hc2RfenNjb3JlJHpzY29yZV9BQkFTc2RbYWJhc19hc2RfenNjb3JlJGdyb3VwPT0gIkNvbnRyb2wiXSwgbmFtZSA9ICJDb250cm9sIFNQSU4tQVNEIikgICU+JSAKICBsYXlvdXQoYmFybW9kZSA9ICJvdmVybGF5IiwKICAgICAgICAgZm9udCA9IHQsCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJBQkFTIFNjb3JlIiksCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJDb3VudCIpKSAlPiUKICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkKCgpBQkFTX2Rpc3RyaWJ1dGlvbgpgYGAgCgoKICAKIyMjIEZyYW1ld2lzZSBEaXNwbGFjZW1lbnQKCldlIHVzZSBbbXJpcWNdKGh0dHBzOi8vbXJpcWMucmVhZHRoZWRvY3MuaW8vZW4vc3RhYmxlL2luZGV4Lmh0bWwpIHRvIG9idGFpbiBpbWFnZSBxdWFsaXR5IG1ldHJpY3MgKElRTXMpIGZvciB0aGUgVDF3LCBUMncsIGFuZCBmTVJJIHNjYW5zLiBCZWxvdyBhcmUgcGxvdHMgb2YgZnJhbWV3aXNlIGRpc3BsYWNlbWVudCAoRkQpLCBhIG1lYXN1cmUgb2YgaGVhZCBtb3Rpb24gYWNyb3NzIHRpbWUuIFNwZWNpZmljYWxseSwgdGhlIGF2ZXJhZ2UgRkQgZm9yIGVhY2ggc2NhbiBhY3Jvc3MgYWxsIHRpbWVwb2ludHMgYW5kIHRoZSBwZXJjZW50YWdlIG9mIEZEcyBhYm92ZSBhIHRocmVzaG9sZCBvZiAqKjAuNSBtbSoqIGFyZSBzaG93bi4KCmBgYHtyfQpzcGFzZF9tcmlxY19ib2xkX2RmIDwtCiAgcmVhZF90c3YoCiAgICBoZXJlKCJkYXRhIiwgIm1yaSIsICJtcmlxY19ib2xkX1NQQVNELnRzdiIpCiAgKSAlPiUKICBtdXRhdGUoc3R1ZHkgPSAiU1BJTi1BU0QiLAogICAgICAgICBtb2RhbGl0eSA9ICJib2xkIiwKICAgICAgICAgZnVsbF9zdWJqZWN0X2lkID0gc3RyX21hdGNoKGJpZHNfbmFtZSwgInN1Yi0oW1s6YWxudW06XV0rKV8iKVssMl0sCiAgICAgICAgIHN1YmplY3RfaWQgPSBwYXN0ZSgiU1BBU0QiLCBzdWJzdHIoZnVsbF9zdWJqZWN0X2lkLCAxLCAzKSwgc3Vic3RyKGZ1bGxfc3ViamVjdF9pZCwgNCwgMTApLCBzZXAgPSAiXyIpICU+JSBnc3ViKCJDTUgiLCAiQ01QIiwgLiksCiAgICAgICAgIGFjcXVpc2l0aW9uID0gc3RyX21hdGNoKGJpZHNfbmFtZSwgImFjcS0oW1s6YWxudW06XV0rKV8iKVssMl0sCiAgICAgICAgIHJ1bl9udW0gPSBzdHJfbWF0Y2goYmlkc19uYW1lLCAicnVuLShbWzphbG51bTpdXSspXyIpWywyXSwKICAgICAgICAgc2Nhbl90eXBlID0gc3RyX21hdGNoKGJpZHNfbmFtZSwgInRhc2stKFtbOmFsbnVtOl1dKylfIilbLDJdICU+JSBnc3ViKCJcXGQiLCAiIiwgLikKICAgICAgICAgKSAlPiUKICBsZWZ0X2pvaW4oc3Bhc2RfcmVkY2FwX2RmICU+JSBzZWxlY3QocmVjb3JkX2lkLCBtcmlfZG9hKSwgYnkgPSBjKCJzdWJqZWN0X2lkIiA9ICJyZWNvcmRfaWQiKSkKCnNwaW5zX3N1YmplY3RzIDwtCiAgc3BpbnNfcmVkY2FwX2RmICU+JSAKICBzZWxlY3QocmVjb3JkX2lkKSAlPiUgCiAgdW5saXN0KCkKCnNwaW5zX21yaXFjX2JvbGRfZGYgPC0KIHJlYWRfdHN2KAogICBoZXJlKCJkYXRhIiwgIm1yaSIsICJtcmlxY19ib2xkX1NQSU5TLnRzdiIpCiApICU+JQogbXV0YXRlKHN0dWR5ID0gIlNQSU5TIiwKICAgICAgICBtb2RhbGl0eSA9ICJib2xkIiwKICAgICAgICBmdWxsX3N1YmplY3RfaWQgPSBzdHJfbWF0Y2goYmlkc19uYW1lLCAic3ViLShbWzphbG51bTpdXSspXyIpWywyXSwKICAgICAgICBzdWJqZWN0X2lkID0gcGFzdGUoIlNQTjAxIiwgc3Vic3RyKGZ1bGxfc3ViamVjdF9pZCwgMSwgMyksIHN1YnN0cihmdWxsX3N1YmplY3RfaWQsIDQsIDEwKSwgc2VwID0gIl8iKSwKICAgICAgICBhY3F1aXNpdGlvbiA9IHN0cl9tYXRjaChiaWRzX25hbWUsICJhY3EtKFtbOmFsbnVtOl1dKylfIilbLDJdLAogICAgICAgIHJ1bl9udW0gPSBzdHJfbWF0Y2goYmlkc19uYW1lLCAicnVuLShbWzphbG51bTpdXSspXyIpWywyXSwKICAgICAgICBzY2FuX3R5cGUgPSBzdHJfbWF0Y2goYmlkc19uYW1lLCAidGFzay0oW1s6YWxudW06XV0rKV8iKVssMl0pICU+JQogZmlsdGVyKHN1YmplY3RfaWQgJWluJSBzcGluc19zdWJqZWN0cykKCm1yaXFjX2JvbGRfZGYgPC0KIGJpbmRfcm93cyhzcGFzZF9tcmlxY19ib2xkX2RmLCBzcGluc19tcmlxY19ib2xkX2RmKSAlPiUKIG11dGF0ZShzY2FuX3R5cGUgPSBmYWN0b3Ioc2Nhbl90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJyZXN0IiwgImltaSIsICJvYnMiLCAiZW1wIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlJlc3RpbmcgU3RhdGUiLCAiSW1pdGF0ZSIsICJPYnNlcnZlIiwgIkVtcGF0aGljIEFjY3VyYWN5IikpKSAlPiUKIHNlbGVjdChzdHVkeSwgc3ViamVjdF9pZCwgc2Nhbl90eXBlLCBmZF9tZWFuLCBmZF9wZXJjLCBtcmlfZG9hKQpgYGAKCgpgYGB7cn0KcGxvdF9seSgKICBtcmlxY19ib2xkX2RmLCB4ID0gfnNjYW5fdHlwZSwgeSA9IH5mZF9tZWFuLCBjb2xvciA9IH5zdHVkeSwKICB0eXBlID0gImJveCIsIGJveHBvaW50cyA9ICJhbGwiLCBqaXR0ZXIgPSAwLjMsIHBvaW50cG9zID0gMCwKICBob3ZlcmluZm8gPSAidGV4dCIsCiAgdGV4dCA9IH5wYXN0ZSgiIFN1YmplY3Q6ICIsIHN1YmplY3RfaWQsCiAgICAgICAgICAgICAgICAiPGJyPiBNZWFuIEZEOiAiLCBmZF9tZWFuKSwKICBtb2RlID0gIm1hcmtlcnMiLAogIG1hcmtlciA9IGxpc3QoY29sb3IgPSAiIzAwMCIsCiAgICAgICAgICAgICAgICBvcGFjaXR5ID0gMC41KSkgJT4lCiAgbGF5b3V0KGJveG1vZGUgPSAiZ3JvdXAiLAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiU2NhbiBUeXBlIiksCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJNZWFuIEZyYW1ld2lzZSBEaXNwbGFjZW1lbnQiKSkgJT4lCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpCmBgYAoKYGBge3J9CnBsb3RfbHkobXJpcWNfYm9sZF9kZiAlPiUgbXV0YXRlKHN0dWR5PWFzLmZhY3RvcihzdHVkeSkpLCB4ID0gfm1yaV9kb2EsIHkgPSB+ZmRfbWVhbiwgY29sb3IgPSB+c2Nhbl90eXBlLAogIGhvdmVyaW5mbyA9ICJ0ZXh0IiwKICB0ZXh0ID0gfnBhc3RlKCIgU3ViamVjdDogIiwgc3ViamVjdF9pZCwKICAgICAgICAgICAgICAgICI8YnI+IFNjYW4gVHlwZTogIiwgc2Nhbl90eXBlLAogICAgICAgICAgICAgICAgIjxicj4gTWVhbiBGRDogIiwgZmRfbWVhbiksCiAgbW9kZSA9ICJtYXJrZXJzIikgJT4lCiAgbGF5b3V0KGJveG1vZGUgPSAiZ3JvdXAiLAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiTVJJIERhdGUiKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIk1lYW4gRnJhbWV3aXNlIERpc3BsYWNlbWVudCIpKSAlPiUKICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkKYGBgCgpgYGB7cn0KcGxvdF9seSgKICBtcmlxY19ib2xkX2RmLCB4ID0gfnNjYW5fdHlwZSwgeSA9IH5mZF9wZXJjLCBjb2xvciA9IH5zdHVkeSwKICB0eXBlID0gImJveCIsIGJveHBvaW50cyA9ICJhbGwiLCBqaXR0ZXIgPSAwLjMsIHBvaW50cG9zID0gMCwKICBob3ZlcmluZm8gPSAidGV4dCIsCiAgdGV4dCA9IH5wYXN0ZSgiIFN1YmplY3Q6ICIsIHN1YmplY3RfaWQsCiAgICAgICAgICAgICAgICAiPGJyPiBGRCAlOiAiLCBmZF9wZXJjKSwKICBtb2RlID0gIm1hcmtlcnMiLAogIG1hcmtlciA9IGxpc3QoY29sb3IgPSAiIzAwMCIsCiAgICAgICAgICAgICAgICBvcGFjaXR5ID0gMC41KSkgJT4lCiAgbGF5b3V0KGJveG1vZGUgPSAiZ3JvdXAiLAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiU2NhbiBUeXBlIiksCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJQZXJjZW50YWdlIG9mIEZyYW1ld2lzZSBEaXNwbGFjZW1lbnRzIEFib3ZlIFRocmVzaG9sZCIpKSAlPiUKICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkKYGBgCgpgYGB7cn0KcGxvdF9seShtcmlxY19ib2xkX2RmICU+JSBtdXRhdGUoc3R1ZHk9YXMuZmFjdG9yKHN0dWR5KSksIHggPSB+bXJpX2RvYSwgeSA9IH5mZF9wZXJjLCBjb2xvciA9IH5zY2FuX3R5cGUsCiAgaG92ZXJpbmZvID0gInRleHQiLAogIHRleHQgPSB+cGFzdGUoIiBTdWJqZWN0OiAiLCBzdWJqZWN0X2lkLAogICAgICAgICAgICAgICAgIjxicj4gRkQgJTogIiwgZmRfcGVyYyksCiAgbW9kZSA9ICJtYXJrZXJzIikgJT4lCiAgbGF5b3V0KGJveG1vZGUgPSAiZ3JvdXAiLAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiTVJJIERhdGUiKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIlBlcmNlbnRhZ2Ugb2YgRnJhbWV3aXNlIERpc3BsYWNlbWVudHMgQWJvdmUgVGhyZXNob2xkIikpICU+JQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQpgYGA=
Social Cognition
RMET
The Reading the Mind in the Eyes test (RMET) is a test of social sensitivity. The participant is presented with a series of 36 photographs of the eye region and asked to choose which of 4 words best describes what the actor in the photograph is thinking or feeling.
IRI
The Interpersonal Reactivity Index (IRI) is a 28 item self-report measure of cognitive and affective empathy.
TASIT-R
The Awareness of Social Inference Test-Revised (TASIT-R) consists of emotion evaluation (Part 1), social inference - minimal (Part 2), and social inference - enriched (Part 3). In Part 1, the participant views 28 brief video clips to identify the emotion expressed by the actor. In Part 2 and 3, the participant views 31 videotaped vignettes of social interactions involving lies and sarcasm and makes judgements regarding what the individual in the scene believed or knew, meant by what he or she said, intended to do, and actually felt.
ER-40
The Penn Emotion Recognition Task-40 (ER-40) is a measure of emotional processing. Participants rate the emotional valence of 40 faces displaying happy, sad or neutral expressions on a 7 point scale.
A median response time below 1000 seconds indicates inattention and should be filtered out from further analysis.