Last finishers

Joining, by = c("start_date", "n")
Starting date Amount of finishers
2022-03-17 1
2022-03-09 1
2022-03-06 1
2022-03-02 1
2022-02-24 1
2022-02-23 1
2022-02-19 1
2022-02-06 1
2022-02-02 2
2022-01-25 2
2022-01-23 1
2022-01-22 22
2022-01-20 1
2022-01-19 1
2022-01-15 1
2022-01-14 2
2021-12-27 1
2021-12-26 1
2021-12-22 1
2021-12-20 2
2021-12-19 1
2021-12-16 1
2021-12-13 1
2021-12-12 1
2021-12-10 1
2021-12-09 1
2021-12-05 1
2021-12-02 1
2021-11-29 1
2021-11-27 1
2021-11-25 1
2021-11-19 1
2021-11-14 2
2021-11-10 1
2021-10-27 1
2021-10-24 1
2021-10-21 1
2021-10-16 2
2021-10-08 1
2021-10-06 1
2021-10-05 2
2021-09-27 1
2021-09-11 1
2021-08-24 2
2021-08-23 2
2021-08-22 2
2021-08-20 1
2021-08-19 3
2021-08-18 2
2021-08-16 1
2021-08-15 3
2021-08-14 1
2021-08-13 2
2021-08-12 2
2021-08-11 3
2021-08-10 3
2021-08-09 1
2021-08-08 4
2021-08-07 5
2021-08-06 2
2021-08-05 2
2021-08-04 1
2021-08-03 1
2021-08-02 4
2021-08-01 2
2021-07-31 6
2021-07-30 6
2021-07-29 6
2021-07-28 7
2021-07-27 32
2021-07-26 1
2021-07-24 1
2021-07-21 18
2021-07-16 1
2021-07-15 1
2021-07-11 1
2021-07-01 1
2021-06-28 2
2021-06-25 1
2021-06-23 1
2021-06-22 1
2021-06-20 1
2021-06-18 2
2021-06-16 5
2021-06-15 4
2021-06-14 2
2021-06-13 1
2021-06-12 2
2021-06-09 4
2021-06-08 1
2021-06-07 3
2021-06-06 6
2021-06-04 3
2021-06-03 10
2021-05-14 1
Total 251

Amount of unique users

There was 1325 unique users since 2021-06-22 (when design of data collection was changed).

Plot below shows, how many times people changed their clue settings. Percentage on top of each column shows % of people with same length of progress.

How far people usually go?

In the current design of data collection, many users are counted as few users, not just one. For example, instead of 1 user who learned 20 letters, we might have 3 users – one learned only 3 letters, second learned 12 and third — 5.

So we can’t really tell, how far in progress people usually go. Instead, let’s take a look at distribution of learned letters we have in our dataset.

Most users dropped it right away. This is to be expected. Many people may stumble upon the site - or read about it and start the game but not realise what its all about. Some may start and restart on a different device which will get recognised as a new session. Remember we don’t use usernames/logins.

Here is the table, which shows amount of learned letters for each user:

Starting letter Last letter Amount of letters
0 25 25
0 25 25
0 25 25
0 25 25
0 25 25
0 25 25
0 25 25
0 24 24
0 24 24
0 24 24
0 24 24
0 24 24
0 24 24
0 24 24
0 24 24
0 24 24
0 24 24
0 24 24
0 24 24
0 24 24
0 24 24
0 24 24
0 24 24
0 24 24
0 24 24
0 24 24
0 24 24
0 24 24
0 24 24
0 24 24
0 24 24
0 24 24
0 24 24
0 24 24
0 24 24
0 24 24
0 24 24
0 24 24
0 24 24
0 24 24
0 24 24
0 24 24
0 24 24
0 24 24
0 24 24
0 24 24
0 24 24
0 24 24
0 24 24
0 24 24
0 24 24
0 24 24
0 24 24
0 24 24
0 24 24
0 24 24
0 24 24
0 23 23
0 23 23
0 23 23
0 23 23
0 23 23
0 23 23
0 23 23
0 23 23
0 23 23
0 24 23
1 24 23
0 23 23
0 23 23
0 24 23
0 23 23
0 23 23
0 24 23
0 23 23
1 24 23
0 23 23
0 24 23
0 23 23
0 24 23
0 23 23
0 23 23
0 23 23
0 24 23
0 23 23
0 23 23
0 23 23
0 23 23
1 24 23
0 23 23
0 24 23
0 23 23
0 24 23
1 24 23
0 23 23
1 24 22
0 22 22
1 24 22
0 23 22
0 22 22
0 22 22
1 24 22
1 24 22
1 23 22
2 24 22
0 22 22
0 22 22
0 22 22
1 24 22
2 24 22
0 22 22
2 25 22
0 21 21
0 21 21
0 21 21
2 24 21
4 25 21
0 21 21
2 24 21
2 24 21
0 21 21
0 21 21
0 21 21
0 21 21
3 25 21
3 24 21
0 21 21
1 21 20
0 20 20
3 24 20
0 21 20
5 25 20
4 24 20
1 21 20
3 23 20
2 23 20
3 23 20
5 24 19
4 22 19
0 19 19
0 19 19
0 19 19
0 19 19
4 23 19
0 19 19
0 19 19
0 19 19
0 19 19
2 21 19
0 19 19
0 18 18
0 18 18
5 23 18
0 18 18
5 24 18
6 24 18
0 18 18
5 24 18
0 18 18
0 18 18
0 17 17
0 17 17
7 25 17
0 17 17
0 17 17
0 17 17
6 24 17
7 24 17
6 24 17
6 24 17
0 17 17
0 16 16
0 16 16
0 16 16
0 16 16
0 16 16
0 16 16
0 16 16
8 24 16
9 24 15
0 15 15
9 24 15
0 15 15
1 16 15
0 15 15
9 23 14
0 14 14
0 14 14
1 16 14
0 14 14
1 16 14
0 14 14
0 14 14
0 14 14
0 14 14
0 14 14
0 14 14
11 25 14
8 23 14
0 14 14
4 18 14
0 14 14
10 24 14
0 14 14
0 14 14
7 21 13
9 23 13
1 14 13
0 13 13
0 14 13
0 13 13
0 13 13
0 13 13
10 24 13
0 13 13
0 13 13
11 24 13
11 24 13
11 25 13
10 23 13
0 13 13
7 19 12
0 12 12
0 12 12
6 19 12
0 12 12
0 12 12
0 12 12
0 12 12
0 12 12
0 12 12
0 12 12
0 12 12
0 12 12
7 19 12
0 12 12
12 24 12
0 12 12
2 15 12
0 12 12
0 12 12
0 12 12
0 11 11
0 11 11
0 11 11
4 15 11
0 11 11
2 13 11
0 11 11
0 11 11
0 11 11
0 11 11
3 14 11
1 12 11
0 11 11
0 11 11
1 12 11
13 24 11
8 19 11
12 23 11
0 11 11
0 11 11
2 13 11
2 14 11
0 11 11
0 11 11
11 23 11
0 10 10
0 10 10
0 10 10
0 10 10
8 19 10
0 10 10
0 10 10
4 15 10
2 12 10
0 10 10
0 10 10
0 10 10
0 10 10
6 16 10
0 10 10
12 23 10
0 9 9
0 9 9
0 9 9
15 24 9
0 9 9
0 9 9
2 12 9
0 9 9
0 9 9
14 24 9
0 9 9
0 9 9
0 9 9
0 9 9
4 13 9
1 11 9
14 24 9
0 9 9
2 11 9
0 9 9
0 9 9
2 12 9
0 9 9
0 9 9
0 9 9
0 9 9
0 9 9
0 10 9
0 9 9
0 9 9
0 9 9
0 8 8
0 8 8
0 8 8
15 24 8
0 8 8
0 8 8
0 8 8
0 8 8
0 8 8
0 8 8
3 12 8
0 8 8
9 17 8
0 9 8
0 8 8
0 8 8
0 8 8
1 10 8
0 8 8
2 10 8
0 8 8
0 8 8
0 8 8
0 8 8
0 8 8
0 8 8
0 8 8
0 8 8
0 8 8
0 8 8
0 9 8
1 9 8
17 25 8
3 12 8
4 11 7
3 10 7
0 7 7
0 7 7
0 7 7
11 18 7
0 7 7
14 21 7
0 7 7
0 7 7
0 7 7
0 7 7
0 7 7
0 7 7
0 7 7
0 7 7
0 7 7
0 7 7
0 7 7
0 7 7
3 10 7
17 24 7
0 7 7
0 7 7
0 7 7
9 16 7
0 7 7
11 18 7
0 7 7
0 7 7
0 7 7
1 8 7
0 7 7
3 10 7
0 7 7
0 7 7
0 7 7
17 24 7
0 7 7
0 7 7
0 7 7
0 6 6
0 6 6
0 6 6
18 24 6
0 6 6
0 6 6
9 15 6
0 6 6
1 8 6
0 7 6
0 6 6
1 7 6
0 6 6
0 6 6
0 6 6
0 6 6
8 14 6
0 6 6
0 6 6
0 6 6
0 6 6
18 24 6
11 17 6
0 6 6
0 6 6
0 7 6
0 6 6
0 6 6
0 6 6
0 6 6
0 6 6
0 6 6
0 6 6
17 24 6
0 6 6
0 6 6
1 7 6
1 8 6
1 8 6
0 6 6
0 6 6
0 6 6
0 6 6
0 6 6
0 6 6
0 6 6
0 6 6
5 11 6
0 6 6
0 6 6
0 6 6
0 6 6
0 6 6
0 6 6
0 6 6
0 6 6
18 24 6
0 6 6
0 6 6
0 6 6
0 7 6
0 6 6
0 5 5
0 5 5
1 6 5
0 5 5
0 5 5
0 5 5
0 5 5
0 5 5
0 5 5
0 5 5
13 19 5
2 7 5
0 5 5
0 5 5
0 5 5
7 12 5
0 5 5
0 5 5
0 5 5
0 5 5
0 5 5
0 5 5
0 5 5
0 5 5
0 5 5
0 5 5
0 5 5
0 5 5
0 5 5
0 5 5
0 5 5
0 5 5
0 5 5
0 5 5
0 5 5
0 5 5
0 5 5
0 5 5
0 5 5
0 5 5
0 5 5
0 5 5
0 5 5
0 5 5
0 5 5
0 5 5
0 5 5
0 5 5
0 5 5
0 5 5
8 14 5
0 5 5
0 5 5
0 5 5
0 5 5
0 5 5
0 5 5
2 7 5
0 5 5
0 5 5
1 6 5
2 8 5
6 11 5
0 5 5
0 4 4
0 4 4
0 4 4
0 4 4
0 4 4
0 4 4
1 5 4
0 4 4
6 10 4
0 4 4
0 4 4
12 16 4
0 4 4
6 10 4
0 4 4
0 4 4
0 4 4
0 4 4
0 4 4
0 4 4
0 4 4
0 4 4
7 11 4
0 4 4
0 4 4
0 4 4
0 4 4
0 4 4
0 4 4
0 4 4
0 4 4
0 4 4
0 4 4
7 11 4
0 4 4
0 5 4
0 4 4
3 7 4
0 4 4
0 4 4
0 4 4
2 6 4
0 4 4
0 4 4
0 4 4
0 4 4
0 4 4
0 4 4
0 4 4
0 4 4
0 4 4
0 4 4
0 4 4
0 4 4
0 4 4
0 4 4
0 4 4
0 4 4
0 4 4
0 4 4
0 4 4
19 23 4
0 4 4
1 5 4
0 4 4
9 14 4
0 4 4
0 4 4
0 4 4
0 4 4
0 4 4
12 16 4
4 8 4
6 9 3
3 6 3
0 3 3
0 3 3
19 23 3
8 12 3
19 22 3
0 3 3
1 4 3
5 8 3
0 3 3
0 3 3
0 3 3
2 6 3
0 3 3
1 4 3
0 3 3
0 3 3
0 3 3
1 5 3
14 18 3
0 3 3
3 7 3
0 3 3
4 7 3
0 3 3
0 3 3
0 3 3
5 8 3
0 3 3
0 3 3
0 3 3
0 3 3
1 5 3
0 3 3
0 3 3
0 3 3
19 23 3
4 7 3
0 3 3
13 16 3
0 3 3
0 3 3
0 3 3
0 3 3
0 3 3
0 3 3
0 3 3
21 24 3
0 3 3
0 3 3
0 3 3
0 4 3
20 24 3
0 3 3
0 3 3
0 3 3
1 4 3
0 3 3
0 3 3
0 3 3
3 6 2
9 12 2
2 4 2
9 12 2
0 2 2
0 3 2
4 6 2
0 2 2
19 21 2
0 2 2
5 7 2
0 2 2
0 2 2
10 13 2
0 2 2
0 2 2
0 2 2
0 2 2
0 2 2
18 20 2
0 3 2
0 3 2
0 2 2
0 2 2
1 3 2
0 2 2
0 2 2
3 5 2
0 2 2
0 2 2
0 2 2
0 2 2
0 2 2
0 2 2
1 4 2
0 2 2
3 6 2
0 2 2
1 4 2
0 3 2
0 2 2
0 2 2
0 2 2
6 8 2
0 2 2
0 2 2
0 2 2
0 2 2
21 24 2
0 2 2
0 2 2
0 2 2
0 2 2
9 11 2
0 2 2
0 2 2
5 7 2
0 2 2
0 2 2
4 6 2
0 2 2
0 2 2
6 9 2
0 2 2
0 3 2
0 2 2
1 4 2
1 4 2
3 5 2
0 3 2
0 2 2
0 2 2
0 2 2
0 2 2
0 2 2
2 4 2
0 2 2
9 11 2
0 1 1
1 3 1
4 5 1
20 22 1
0 1 1
2 3 1
11 13 1
20 22 1
1 2 1
19 20 1
0 2 1
16 18 1
16 18 1
11 12 1
0 1 1
8 9 1
0 1 1
0 1 1
0 1 1
0 1 1
0 1 1
0 1 1
2 4 1
7 8 1
0 1 1
0 1 1
0 2 1
0 1 1
4 5 1
7 8 1
0 1 1
4 6 1
0 1 1
0 1 1
1 3 1
0 1 1
5 6 1
1 2 1
0 1 1
3 5 1
6 8 1
0 1 1
1 2 1
0 1 1
0 1 1
0 1 1
0 1 1
11 12 1
6 8 1
0 1 1
0 1 1
2 3 1
7 8 1
0 1 1
0 1 1
4 5 1
5 6 1
0 1 1
9 11 1
0 1 1
1 2 1
0 1 1
6 7 1
2 3 1
0 1 1
15 17 1
0 1 1
2 3 1
0 1 1
0 2 1
3 4 1
0 1 1
6 7 1
0 1 1
0 1 1
0 1 1
0 1 1
0 2 1
0 1 1
3 4 1
0 1 1
0 2 1

We have 97 users, who learned all alphabetical without changing settings.

How much time it takes to learn Morse code?

Even though we usually don’t know real time, which was required for each user to learn Morse code, we can estimate it. Let’s take all users, who learned at least 70% of alphabetical, calculate speed of that progress and estimate, how much time it would take for them to learn Morse code.

Warning: Removed 2 rows containing non-finite values (stat_bin).
Warning: Removed 2 rows containing missing values (geom_bar).

Red lines shows quantiles 50%, 80% and 90%. So 80% of people need less than 80 minutes for memorizing all letters. 90% need less than 2 hours. And most of the rest 10% probably people, who took long break during playing.

Below is same plot, but with people who learned all letters, not only 70%+.

Warning: Removed 1 rows containing non-finite values (stat_bin).
Warning: Removed 2 rows containing missing values (geom_bar).

Now let’s take another look at estimated time, this time we will check, is it correct to estimate time by shorter periods of learning.

Warning: Removed 83 rows containing non-finite values
(stat_ydensity).

People who learned less than 60% letters during that sessions for some reason has too high estimated speed, so we should estimate it by sessions with 60%+. Looks like for average people learning whole alphabetical takes ~60 minutes.

Below is the same plot, but only for people who played with settings without any clues.

How speed of the progress changes during the game?

Let’s take those users, who learned whole alphabeticall and see, how their speed changed during the game.

Units for speed are amount of letters, which would be learned in 10 minutes with that speed.

`geom_smooth()` using method = 'loess' and formula 'y ~ x'
Warning: Removed 330 rows containing non-finite values
(stat_smooth).

At beginning of the game we can see is a peak of speed, for first letters, but after that speed looks constant and usually around 3%. Mean speed is 3%.

For some users progress slows down (speed is negative), for others its never going back and they speed up.

Which hint options are better for learning?

Now let’s compare, how much time requires learning with different hint settings.

Minutes Visual hints Speech hints Sound enabled Users Total leters
40 ++ 24 526
42 ++ ++ 51 1112
43 ++ 21 458
44 ++ ++ 12 270
50 ++ ++ ++ 66 1469

With our current amount of data we can’t make reliable conlusions about which clue settings are more effective.

This is same table, but only for users who learned all alphabetical without changing settings:

Minutes Visual hints Speech hints Sound enabled Users Total leters
38 ++ 11 260
38 ++ ++ 16 385
42 ++ 9 209
43 ++ ++ 9 216
48 ++ ++ ++ 36 865

– – – – – – – – – – – – – –

Below is the older section, which is proved to be wrong after we did find out that speed of users with too short session (less than 70%) estimated too high. Sessions without any clues wre shorter, that’s why we estimated their speed higher.

Now let’s compare, how much time requires learning with different hint settings. At first look its like this:

Minutes Visual hints Speech hints Sound enabled Users Total leters
26 7 46
28 ++ 134 1239
29 ++ 106 1051
34 ++ ++ 43 456
36 ++ ++ 163 1977
41 ++ ++ 20 195
41 ++ ++ ++ 193 2453

According to this table, the best option is to play only with sound and without hints. But we must check, how statistically significant those differences are.

With our current amount of data we can’t make reliable conlusions about which clue settings are more effective.

In order to avoid misinterpretations, I will try to put my words very precisely in this part. Might be a bit repetitive.

After series of T-tests, according to our data, we can make those statements, which are totally independent of each other:


Visual hints

  • When sound is enabled, but speech hints aren’t, we can be sure with 100% certainty, that disabling visual hints will usually speed up learning process.
  • When sound and speech hints are enabled, we can be sure with at least 99% certainty, that disabling visual hints will usually speed up learning process.

Speech hints

  • When sound and visual hints are enabled, there is no significance enough difference between enabling and disabling speech hints. Probably there is some small difference, but with our current amount of data we can’t catch so small differences.
  • When visual hints are enabled, but sound isn’t, we can be sure with at least 99% certainty, that disabling speech hints will usually speed up learning process.

Sound

  • When visual hints are enabled, but speech hints aren’t, we can be sure with at least 100% certainty, that disabling sound will usually speed up learning process.

Accuracy for each letter

We took accuracy stats from each user only until they got 10 success trials for this letter. Column “Visual+” shows amount of correct inputs, while visual hints were shown. “Visual-” shows mistakes and “Visual%” shows percent of mistakes.

Letters with too insignificant amount of data not shown.

Looks like some visual hints makes it very hard to learn letter — B, H, R, K, E.

“F” might be just a hard letter.

Some visual hints probably makes it easier, for example L and U.

But for most letters accuracy is better without any clues.

Speech clue aren’t affect learning process that much as visual — accuracy for them is more similar with “no hints” option.

LS0tCnRpdGxlOiAnTW9yc2UgY29kZSBsZWFybmluZycKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3IgaW1wb3J0X2xpYnJhcmllcywgbWVzc2FnZT1GLCBlY2hvPUYsIHdhcm5pbmc9Rn0KIyBMb2FkaW5nIHJlcXVpcmVkIGxpYnJhcmllcwpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShtYWdyaXR0cikKbGlicmFyeShsdWJyaWRhdGUpCmxpYnJhcnkoc2NhbGVzKQpsaWJyYXJ5KG9wZW54bHN4KQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGthYmxlRXh0cmEpCmxpYnJhcnkoUk15U1FMKQoKdGhlbWVfc2V0KHRoZW1lX2xpZ2h0KCkpCm9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UpCgojc2V0d2QoJ0U6L1B5dGhvbi9SX3NjcmlwdHMvY29tcGxldGVkL21vcnNlX2NvZGVfbGVhcm5pbmcnKQpzZXR3ZCgnL2Nsb3VkL3Byb2plY3QvbW9yc2UtZGF0YS8nKSAgICAjIEZvciBSU3R1ZGlvIGNsb3VkLgp1cGRhdGVfZGF0YSA9IFQgICAgIyBJZiBpdCdzIFRSVUUsIHRoZW4gcmVhZCBuZXcgZGF0YSBmcm9tIFNRTCBhbmQgc2F2ZSB0byBjc3YuIEJ1dCBpdCB0YWtlcyB0aW1lLCBzbyBpZiBpdHMgRkFMU0UsIHRoZW4ganVzdCByZWFkIGRhdGEgZnJvbSBjc3YKYGBgCmBgYHtyIGxvYWRpbmd9CmlmKHVwZGF0ZV9kYXRhKSB7CiAgc3FsX2NvbiA9IGRiQ29ubmVjdChNeVNRTCgpLCBob3N0ID0gIjEwOS4xMDcuMzguMjU1IiwgcG9ydCA9IDMzMDYsIHVzZXIgPSAid3dhZGUiLCBwYXNzd29yZCA9ICdhZj9vSEQ5NWNvOCM/a25BJywgZGJfbmFtZSA9ICJtb3JzZV9sZWFybiIsIHRpbWVvdXQgPSAxMCkKICBycyA9IGRiU2VuZFF1ZXJ5KHNxbF9jb24sICdzZWxlY3QgKiBmcm9tIG1vcnNlX2xlYXJuLnByb2dyZXNzX2xvZycpCiAgZCA9IGZldGNoKHJzLCBuID0gLTEpCiAgb24uZXhpdChkYkRpc2Nvbm5lY3Qoc3FsX2NvbikpCiAgd3JpdGUuY3N2KGQsICdwcm9ncmVzc19sb2cuY3N2JykKfSBlbHNlIHsKICBkID0gcmVhZC5jc3YoJ3Byb2dyZXNzX2xvZy5jc3YnKSB9CmBgYApgYGB7ciB0cmFuc2Zvcm1pbmd9CiMgVHJhbnNmb3JtaW5nIGRhdGEKbGV0dGVycyA9IGMoJ2UnLCd0JywnYScsJ2knLCdtJywncycsJ28nLCdoJywnbicsJ2MnLCdyJywnZCcsJ3UnLCdrJywnbCcsJ2YnLCdiJywncCcsJ2cnLCdqJywndicsJ3EnLCd3JywneCcsJ3knLCd6JykKCnRvX2xldHRlcnMgPSBmdW5jdGlvbihwcm9ncmVzcykgewogIHByb2dyZXNzX2xldHRlcnMgPSBwcm9ncmVzcyAqIDEuMDQgLyA0CiAgbGV0dGVyc19sZWFybmVkID0gcm91bmQocHJvZ3Jlc3NfbGV0dGVycyAqIDUpICUvJSA1CiAgbGV0dGVyc19sZWFybmVkID0gaWZlbHNlKGxldHRlcnNfbGVhcm5lZCA8IDAsIDAsIGxldHRlcnNfbGVhcm5lZCkgJT4lCiAgICBhcy5pbnRlZ2VyKCkKfQoKZCAlPD4lCiAgbXV0YXRlKHNjb3JlcyA9IHN0cl9leHRyYWN0X2FsbChwcm9ncmVzc0R1bXAsICctKlswLTldJyksCiAgICAgICAgIG1pbnV0ZXMgPSB0aW1lUGxheWVkIC8gMTAwMCAvIDYwLAogICAgICAgICBzZXR0aW5ncyA9IHBhc3RlMCh2aXN1YWxIaW50cywgc3BlZWNoSGludHMsIHNvdW5kKSwKICAgICAgICAgdXNlciA9IHVzZXJJZGVudGlmaWVyLAogICAgICAgICBwcm9ncmVzcyA9IGlmZWxzZShwcm9ncmVzc1BlcmNlbnQgPCAwLCAwLCBwcm9ncmVzc1BlcmNlbnQpLAogICAgICAgICBsZXR0ZXJzX2xlYXJuZWQgPSB0b19sZXR0ZXJzKHByb2dyZXNzKSwKICAgICAgICAgZGF0ZSA9IHBhcnNlX2RhdGVfdGltZShkYXRlQ3JlYXRlZCwgJ3ktbS1kIEg6TTpTJyksCiAgICAgICAgIGFjY3VyYWN5ID0gcHJvZ3Jlc3NEZXRhaWwKICAgICAgICApICU+JQogIHNlbGVjdCh1c2VyLCBzZXR0aW5ncywgbWludXRlcywgcHJvZ3Jlc3MsIGxldHRlcnNfbGVhcm5lZCwgYWNjdXJhY3ksIHNjb3JlcywgZGF0ZSkgJT4lCiAgYXJyYW5nZSh1c2VyLCBtaW51dGVzKQoKZCRzcGVlZCA9IE5BICAgICMgQ2FsY3VsYXRpbmcgc3BlZWQgb2YgcHJvZ3Jlc3MgZm9yIGV2ZXJ5IHN0ZXAKZCRhZnRlcnBsYXkgPSBGICMgSWYgVFJVRSwgdGhlbiBpdCdzIHRpbWUgYWZ0ZXIgYWxwaGFiZXRpY2FsIHdhcyBhbHJlYWR5IGxlYXJuZWQKbGFzdF9taW51dGVzID0gZCRtaW51dGVzWzFdCmxhc3RfcHJvZ3Jlc3MgPSBkJHByb2dyZXNzWzFdCmxhc3RfdXNlciA9IGQkdXNlclsxXQpyZWFjaGVkX2VuZCA9IEYKZm9yIChpIGluIDE6bnJvdyhkKSkgewogIGlmIChkJHVzZXJbaV0gPT0gbGFzdF91c2VyICYgZCRtaW51dGVzW2ldICE9IGxhc3RfbWludXRlcyAmIGQkcHJvZ3Jlc3NbaV0gIT0gbGFzdF9wcm9ncmVzcyAmICEocmVhY2hlZF9lbmQpKSB7CiAgICBkJHNwZWVkW2ldID0gKGQkcHJvZ3Jlc3NbaV0gLSBsYXN0X3Byb2dyZXNzKSAvIChkJG1pbnV0ZXNbaV0gLSBsYXN0X21pbnV0ZXMpCiAgICBsYXN0X21pbnV0ZXMgPSBkJG1pbnV0ZXNbaV0KICAgIGxhc3RfcHJvZ3Jlc3MgPSBkJHByb2dyZXNzW2ldCiAgfQogIGlmIChkJHVzZXJbaV0gIT0gbGFzdF91c2VyKSB7CiAgICBsYXN0X3VzZXIgPSBkJHVzZXJbaV0KICAgIGxhc3RfbWludXRlcyA9IGQkbWludXRlc1tpXQogICAgbGFzdF9wcm9ncmVzcyA9IGQkcHJvZ3Jlc3NbaV0KICAgIHJlYWNoZWRfZW5kID0gRgogIH0KICBpZihkJHVzZXJbaV0gPT0gbGFzdF91c2VyICYgcmVhY2hlZF9lbmQpIHsgZCRhZnRlcnBsYXlbaV0gPSBUIH0KICByZWFjaGVkX2VuZCA9IGQkc2NvcmVzW2ldW1sxXV1bMjZdID4gMCAgICMgYWxzbyBtYXJraW5nIHJvd3Mgd2l0aCByZWFjaGVkIGxhc3QgbGV0dGVyCiAgZCRyZWFjaGVkX2VuZFtpXSA9IHJlYWNoZWRfZW5kCn0KCiMgQ2FsY3VsYXRpbmcgYWNjdXJhY3kgZm9yIGVhY2ggbGV0dGVyCmRfbmV3ID0gZCAlPiUKICBmaWx0ZXIoIWlzLm5hKGFjY3VyYWN5KSkgJT4lCiAgYXJyYW5nZSh1c2VyLCBkYXRlKQphY2NfdHJpYWxzID0gMTAgICAjIEFmdGVyIGhvdyBtdWNoIHRyaWFscyB3ZSB3aWxsIG1lYXN1cmUgYWNjdXJhY3kgb2YgbGV0dGVyCgphY2NfdGFibGUgPSBmdW5jdGlvbihkYXRhKSB7CiAgYWNjdXJhY3kgPSBkYXRhLmZyYW1lKGxldHRlcj1sZXR0ZXJzLCBjb3JyZWN0PTAsIHdyb25nPTApCiAgdXNlcnMgPSB1bmlxdWUoZGF0YSR1c2VyKQogIGZvciAodXNlciBpbiB1c2Vycyl7CiAgICBmb3IgKGxldHRlciBpbiBsZXR0ZXJzKXsKICAgICAgZm9yIChyb3cgaW4gZGF0YVtkYXRhJHVzZXIgPT0gdXNlciwgJ2FjY3VyYWN5J10pIHsKICAgICAgICBjb3JyZWN0cyA9IHN0cl9leHRyYWN0KHJvdywgcGFzdGUwKGxldHRlciwgJyI6XFx7Indyb25nIjpcXGQrLCJjb3JyZWN0IjpcXGQrJykpCiAgICAgICAgY29ycmVjdHMgPSBhcy5udW1lcmljKHN0cl9yZXBsYWNlKGNvcnJlY3RzLCBwYXN0ZTAobGV0dGVyLCAnIjpcXHsid3JvbmciOlxcZCssImNvcnJlY3QiOicpLCAnJykpCiAgICAgICAgaWYgKGNvcnJlY3RzID49IGFjY190cmlhbHMpIHsKICAgICAgICAgIGFjY3VyYWN5W2FjY3VyYWN5JGxldHRlcj09bGV0dGVyLCAnY29ycmVjdCddID0gYWNjdXJhY3lbYWNjdXJhY3kkbGV0dGVyPT1sZXR0ZXIsICdjb3JyZWN0J10gKyBjb3JyZWN0cwogICAgICAgICAgd3JvbmdzID0gc3RyX2V4dHJhY3Qocm93LCBwYXN0ZTAobGV0dGVyLCAnIjpcXHsid3JvbmciOlxcZCsnKSkKICAgICAgICAgIHdyb25ncyA9IGFzLm51bWVyaWMoc3RyX3JlcGxhY2Uod3JvbmdzLCBwYXN0ZTAobGV0dGVyLCAnIjpcXHsid3JvbmciOicpLCAnJykpCiAgICAgICAgICBhY2N1cmFjeVthY2N1cmFjeSRsZXR0ZXI9PWxldHRlciwgJ3dyb25nJ10gPSBhY2N1cmFjeVthY2N1cmFjeSRsZXR0ZXI9PWxldHRlciwgJ3dyb25nJ10gKyB3cm9uZ3MKICAgICAgICAgIGJyZWFrCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIGFjY3VyYWN5ICU8PiUgbXV0YXRlKG1pc3Rha2VfcGVyY2VudGFnZSA9IHdyb25nIC8gKGNvcnJlY3QgKyB3cm9uZykpCn0KCmNhbGN1bGF0ZV9hY2N1cmFjeSA9IEYgICMgRm9yIGRlYnVnZ2luZyBwdXJwb3NlcyBjYWxjdWxhdGlvbiBvZiBhY2N1cmFjeSBjYW4gYmUgdHVybmVkIG9mZiwgc2luY2UgaXQgdGFrZXMgc28gbG9uZwoKaWYoY2FsY3VsYXRlX2FjY3VyYWN5KSB7CnZpc3VhbF9hY2N1cmFjeSA9IGRfbmV3ICU+JSBmaWx0ZXIoc2V0dGluZ3MgJWluJSBjKCcxMDAnLCAnMTAxJywgJzExMCcsICcxMTEnKSkgJT4lIGFjY190YWJsZSgpCnNwZWVjaF9hY2N1cmFjeSA9IGRfbmV3ICU+JSBmaWx0ZXIoc2V0dGluZ3MgJWluJSBjKCcwMTAnLCAnMTEwJywgJzAxMScsICcxMTEnKSkgJT4lIGFjY190YWJsZSgpCm5vaGludHNfYWNjdXJhY3kgPSBkX25ldyAlPiUgZmlsdGVyKHNldHRpbmdzICVpbiUgYygnMDAxJykpICU+JSBhY2NfdGFibGUoKQphY2N1cmFjeSA9IHZpc3VhbF9hY2N1cmFjeSAlPiUKICByaWdodF9qb2luKHNwZWVjaF9hY2N1cmFjeSwgYnkgPSAnbGV0dGVyJykgJT4lCiAgcmlnaHRfam9pbihub2hpbnRzX2FjY3VyYWN5LCBieSA9ICdsZXR0ZXInKQpjb2xuYW1lcyhhY2N1cmFjeSkgPSBjKCdsZXR0ZXInLCAndmlzdWFsKycsICd2aXN1YWwtJywgJ3Zpc3VhbCUnLCAnc3BlZWNoKycsICdzcGVlY2gtJywgJ3NwZWVjaCUnLCAnbm9oaW50cysnLCAnbm9oaW50cy0nLCAnbm9oaW50cyUnKQp9CgpnZXRfYWNjdXJhY3kgPSBmdW5jdGlvbihzdHJpbmcpIHsgICAgICMgVHJhbnNmb3JtcyBKU09OIGFjY3VyYWN5IHRvIGRhdGFmcmFtZQogIGxldHRlcnMgPSBzdHJfZXh0cmFjdF9hbGwoc3RyaW5nLCAnKC4pKD89IjpcXHspJykKICB3cm9uZ3MgPSBzdHJfZXh0cmFjdF9hbGwoc3RyaW5nLCAnKFxcZCspKD89LCJjb3JyKScpCiAgY29ycmVjdHMgPSBzdHJfZXh0cmFjdF9hbGwoc3RyaW5nLCAnKFxcZCspKD89XFx9KScpCiAgZGYgPSBkYXRhLmZyYW1lKGxldHRlciA9IGxldHRlcnMsIGNvcnJlY3QgPSBjb3JyZWN0cywgd3JvbmcgPSB3cm9uZ3MpCiAgY29sbmFtZXMoZGYpID0gYygnbGV0dGVyJywgJ2NvcnJlY3QnLCAnd3JvbmcnKQogIHJldHVybihkZikKfQoKc2NvcmVzX2Zvcl9hZ2dyID0gZCAlPiUgICMgTG9va2luZyBmb3IgdGhlIGxhdGVzdCBhY2N1cmFjeSB2YWx1ZXMgZm9yIGVhY2ggdXNlci4gV2lsbCBiZSBqb2luZWQgdG8gYWdncmVnYXRlZCBkYXRhCiAgZ3JvdXBfYnkodXNlcikgJT4lCiAgZmlsdGVyKGRhdGUgPT0gbWF4KGRhdGUpKSAlPiUKICBtdXRhdGUoc2NvcmVzID0gbGFwcGx5KGFjY3VyYWN5LCAnZ2V0X2FjY3VyYWN5JykpICU+JQogIHNlbGVjdChzY29yZXMpCgpkX2FnZ3IgPSBkICU+JSAgICAjIEFnZ3JlZ2F0aW5nIGRhdGEKICBmaWx0ZXIoIWFmdGVycGxheSkgJT4lCiAgZ3JvdXBfYnkodXNlciwgc2V0dGluZ3MpICU+JQogIHN1bW1hcml6ZShtaW51dGVzID0gbWF4KG1pbnV0ZXMpLAogICAgICAgICAgICBtaW5fcHJvZ3Jlc3MgPSBtaW4ocHJvZ3Jlc3MpLAogICAgICAgICAgICBtYXhfcHJvZ3Jlc3MgPSBtYXgocHJvZ3Jlc3MpLAogICAgICAgICAgICBtaW5fbGV0dGVycyA9IHRvX2xldHRlcnMobWluX3Byb2dyZXNzKSwKICAgICAgICAgICAgbWF4X2xldHRlcnMgPSB0b19sZXR0ZXJzKG1heF9wcm9ncmVzcyksCiAgICAgICAgICAgIHNldHRpbmdzID0gbWF4KHNldHRpbmdzKSwKICAgICAgICAgICAgcmVhY2hlZF9lbmQgPSBhcy5sb2dpY2FsKG1heChyZWFjaGVkX2VuZCkpLAogICAgICAgICAgICBwcm9ncmVzc19pbnRlcnZhbCA9IG1heF9wcm9ncmVzcyAtIG1pbl9wcm9ncmVzcywKICAgICAgICAgICAgbGV0dGVyc19sZWFybmVkID0gdG9fbGV0dGVycyhwcm9ncmVzc19pbnRlcnZhbCksCiAgICAgICAgICAgIHNwZWVkID0gcHJvZ3Jlc3NfaW50ZXJ2YWwgLyBtaW51dGVzLAogICAgICAgICAgICBlc3RfdGltZSA9IG1pbnV0ZXMgLyBwcm9ncmVzc19pbnRlcnZhbCAqIDEwMCwKICAgICAgICAgICAgc3RhcnRfZGF0ZSA9IGRhdGUobWluKGRhdGUpKQogICAgICAgICAgICkgJT4lCiAgbXV0YXRlKHZpc3VhbF9oaW50cyA9IHN0cl9zdWIoc2V0dGluZ3MsIDEsIDEpID09ICcxJywKICAgICAgICAgc3BlZWNoX2hpbnRzID0gc3RyX3N1YihzZXR0aW5ncywgMiwgMikgPT0gJzEnLAogICAgICAgICBzb3VuZCA9IHN0cl9zdWIoc2V0dGluZ3MsIDMsIDMpID09ICcxJykgJT4lCiAgcmlnaHRfam9pbihzY29yZXNfZm9yX2FnZ3IsIGJ5PSd1c2VyJykgJT4lCiAgYXJyYW5nZShkZXNjKHN0YXJ0X2RhdGUpKQpgYGAKIyMgTGFzdCBmaW5pc2hlcnMKYGBge3IgTGFzdF9maW5pc2hlcnN9CmRfYWdnciAlPiUKICBmaWx0ZXIocmVhY2hlZF9lbmQpICU+JQogIGdyb3VwX2J5KHN0YXJ0X2RhdGUpICU+JQogIGNvdW50KCkgJT4lCiAgYXJyYW5nZShkZXNjKHN0YXJ0X2RhdGUpKSAlPiUKICBtdXRhdGUoc3RhcnRfZGF0ZSA9IGFzLmNoYXJhY3RlcihzdGFydF9kYXRlKSkgJT4lCiAgZnVsbF9qb2luKGRhdGEuZnJhbWUoJ3N0YXJ0X2RhdGUnID0gJ1RvdGFsJywgJ24nID0gc3VtKGRfYWdnciRyZWFjaGVkX2VuZCA9PSBUKSkpICU+JQogIGthYmxlKGZvcm1hdCA9ICdodG1sJywgdGFibGUuYXR0ciA9ICdzdHlsZT0id2lkdGg6MzAlIicsIGFsaWduID0gJ2NjJywKICAgICAgICBjb2wubmFtZXMgPSBjKCdTdGFydGluZyBkYXRlJywgJ0Ftb3VudCBvZiBmaW5pc2hlcnMnKSkgJT4lCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoJ2Jhc2ljJywgJ2hvdmVyJykpICU+JQogIHNjcm9sbF9ib3goaGVpZ2h0ID0gIjM1MHB4IikKYGBgCiMjIEFtb3VudCBvZiB1bmlxdWUgdXNlcnMKYGBge3J9CnVuaXF1ZV91c2VycyA9IGRfYWdnciAlPiUKICBmaWx0ZXIoc3RhcnRfZGF0ZSA+PSAnMjAyMS0wNi0yMicpICU+JQogIGdyb3VwX2J5KHVzZXIpICU+JQogIHN1bW1hcml6ZShzdGFydCA9IG1pbihzdGFydF9kYXRlKSwKICAgICAgICAgICAgc2V0dGluZ3NfY2hhbmdlcyA9IG4oKS0xLAogICAgICAgICAgICBwcm9ncmVzc19pbnRlcnZhbCA9IG1pbihyb3VuZChzdW0ocHJvZ3Jlc3NfaW50ZXJ2YWwpIC8gMjUpKjI1LCAxMDApICU+JSBmYWN0b3IobGV2ZWxzID0gYygwLCAyNSwgNTAsIDc1LCAxMDApKSkKYGBgClRoZXJlIHdhcyAqKmByIG5yb3codW5pcXVlX3VzZXJzKWAqKiB1bmlxdWUgdXNlcnMgc2luY2UgMjAyMS0wNi0yMiAod2hlbiBkZXNpZ24gb2YgZGF0YSBjb2xsZWN0aW9uIHdhcyBjaGFuZ2VkKS4KYGBge3J9CmdncGxvdCh1bmlxdWVfdXNlcnMpICsKICBnZW9tX2JhcihhZXMoc3RhcnQpLCBmaWxsID0gJyM1NUFBMjInKSArCiAgbGFicyh4PSdEYXRlJywgeT0nQW1vdW50IG9mIG5ldyB1c2VycycpCmBgYAoKUGxvdCBiZWxvdyBzaG93cywgaG93IG1hbnkgdGltZXMgcGVvcGxlIGNoYW5nZWQgdGhlaXIgY2x1ZSBzZXR0aW5ncy4KUGVyY2VudGFnZSBvbiB0b3Agb2YgZWFjaCBjb2x1bW4gc2hvd3MgJSBvZiBwZW9wbGUgd2l0aCBzYW1lIGxlbmd0aCBvZiBwcm9ncmVzcy4KYGBge3J9CnVuaXF1ZV91c2VycyAlPiUKICBjb3VudChzZXR0aW5nc19jaGFuZ2VzLCBwcm9ncmVzc19pbnRlcnZhbCkgJT4lCiAgZ3JvdXBfYnkocHJvZ3Jlc3NfaW50ZXJ2YWwpICU+JQogIG11dGF0ZShwZXJjZW50ID0gcGFzdGUwKHJvdW5kKG4vc3VtKG4pKjEwMCksICclJykpICU+JQogIGdncGxvdCgpICsKICAgIGFlcyhzZXR0aW5nc19jaGFuZ2VzLCBuLCBmaWxsID0gcHJvZ3Jlc3NfaW50ZXJ2YWwpICsKICAgIGdlb21fY29sKHBvc2l0aW9uID0gJ2RvZGdlMicpICsKICAgIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGU9J0JsdWVzJykgKwogICAgbGFicyh4PSdIb3cgbWFueSB0aW1lcyBzZXR0aW5ncyB3YXMgY2hhbmdlZCcsIHk9J0Ftb3VudCBvZiB1c2VycycsIGZpbGwgPSAnUHJvZ3Jlc3MnKSArCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcGVyY2VudCksIHZqdXN0PS0wLjUsIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuOSksIHNpemU9MikKYGBgCgojIyBIb3cgZmFyIHBlb3BsZSB1c3VhbGx5IGdvPwpJbiB0aGUgY3VycmVudCBkZXNpZ24gb2YgZGF0YSBjb2xsZWN0aW9uLCBtYW55IHVzZXJzIGFyZSBjb3VudGVkIGFzIGZldyB1c2Vycywgbm90IGp1c3Qgb25lLgpGb3IgZXhhbXBsZSwgaW5zdGVhZCBvZiAxIHVzZXIgd2hvIGxlYXJuZWQgMjAgbGV0dGVycywgd2UgbWlnaHQgaGF2ZSAzIHVzZXJzIOKAkwpvbmUgbGVhcm5lZCBvbmx5IDMgbGV0dGVycywgc2Vjb25kIGxlYXJuZWQgMTIgYW5kIHRoaXJkIOKAlCA1LgoKU28gd2UgY2FuJ3QgcmVhbGx5IHRlbGwsIGhvdyBmYXIgaW4gcHJvZ3Jlc3MgcGVvcGxlIHVzdWFsbHkgZ28uCkluc3RlYWQsIGxldCdzIHRha2UgYSBsb29rIGF0IGRpc3RyaWJ1dGlvbiBvZiBsZWFybmVkIGxldHRlcnMgd2UgaGF2ZSBpbiBvdXIgZGF0YXNldC4KYGBge3IgaG93X2Zhcn0KZF9hZ2dyICU+JQogIGZpbHRlcihzdGFydF9kYXRlID49ICcyMDIxLTA2LTIzJykgJT4lCiAgZ2dwbG90KGFlcyhsZXR0ZXJzX2xlYXJuZWQpKSArCiAgICBnZW9tX2hpc3RvZ3JhbShmaWxsID0gJyMwMEFBMjInLCBiaW5zPTIwKSArCiAgICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gYygwLCA1LCAxMCwgMTUsIDIwLCAyNikpICsKICAgIHhsYWIoJ0xldHRlcnMgbGVhcm5lZCcpICsgeWxhYignQW1vdW50IG9mIHVzZXJzJykgKwogICAgdGhlbWVfY2xhc3NpYygpCmBgYApNb3N0IHVzZXJzIGRyb3BwZWQgaXQgcmlnaHQgYXdheS4gVGhpcyBpcyB0byBiZSBleHBlY3RlZC4gTWFueSBwZW9wbGUgbWF5IHN0dW1ibGUgdXBvbiB0aGUgc2l0ZSAtIG9yIHJlYWQgYWJvdXQgaXQgYW5kIHN0YXJ0IHRoZSBnYW1lIGJ1dCBub3QgcmVhbGlzZSB3aGF0IGl0cyBhbGwgYWJvdXQuIFNvbWUgbWF5IHN0YXJ0IGFuZCByZXN0YXJ0IG9uIGEgZGlmZmVyZW50IGRldmljZSB3aGljaCB3aWxsIGdldCByZWNvZ25pc2VkIGFzIGEgbmV3IHNlc3Npb24uIFJlbWVtYmVyIHdlIGRvbid0IHVzZSB1c2VybmFtZXMvbG9naW5zLgoKSGVyZSBpcyB0aGUgdGFibGUsIHdoaWNoIHNob3dzIGFtb3VudCBvZiBsZWFybmVkIGxldHRlcnMgZm9yIGVhY2ggdXNlcjoKYGBge3IgdGFibGVfb2ZfcHJvZ3Jlc3N9CmRfYWdnclssIGMoJ21pbl9sZXR0ZXJzJywgJ21heF9sZXR0ZXJzJywgJ2xldHRlcnNfbGVhcm5lZCcpXSAlPiUKICAgIGZpbHRlcihsZXR0ZXJzX2xlYXJuZWQgPiAwKSAlPiUKICAgIGFycmFuZ2UoZGVzYyhsZXR0ZXJzX2xlYXJuZWQpKSAlPiUKICAgIGthYmxlKGZvcm1hdD0naHRtbCcsIHRhYmxlLmF0dHIgPSAnc3R5bGU9IndpZHRoOjQwJSInLAogICAgICAgICAgY29sLm5hbWVzPWMoJ1N0YXJ0aW5nIGxldHRlcicsICdMYXN0IGxldHRlcicsICdBbW91bnQgb2YgbGV0dGVycycpLCBhbGlnbiA9ICdjY2MnKSAlPiUKICAgIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCdzdHJpcGVkJywgJ2hvdmVyJykpICU+JQogICAgc2Nyb2xsX2JveChoZWlnaHQgPSAiNTAwcHgiKQpgYGAKYGBge3J9CmFsbF9pbl9vbmVfc2Vzc2lvbiA9IGRfYWdnciAlPiUKICBmaWx0ZXIocmVhY2hlZF9lbmQsIG1pbl9sZXR0ZXJzID09MCkgJT4lCiAgbnJvdygpCmBgYAoKV2UgaGF2ZSBgciBhbGxfaW5fb25lX3Nlc3Npb25gIHVzZXJzLCB3aG8gbGVhcm5lZCBhbGwgYWxwaGFiZXRpY2FsIHdpdGhvdXQgY2hhbmdpbmcgc2V0dGluZ3MuCgojIyBIb3cgbXVjaCB0aW1lIGl0IHRha2VzIHRvIGxlYXJuIE1vcnNlIGNvZGU/CgpFdmVuIHRob3VnaCB3ZSB1c3VhbGx5IGRvbid0IGtub3cgcmVhbCB0aW1lLCB3aGljaCB3YXMgcmVxdWlyZWQgZm9yIGVhY2ggdXNlciB0byBsZWFybiBNb3JzZSBjb2RlLCB3ZSBjYW4gZXN0aW1hdGUgaXQuCkxldCdzIHRha2UgYWxsIHVzZXJzLCB3aG8gbGVhcm5lZCBhdCBsZWFzdCA3MCUgb2YgYWxwaGFiZXRpY2FsLApjYWxjdWxhdGUgc3BlZWQgb2YgdGhhdCBwcm9ncmVzcyBhbmQgZXN0aW1hdGUsIGhvdyBtdWNoIHRpbWUgaXQgd291bGQgdGFrZSBmb3IgdGhlbSB0byBsZWFybiBNb3JzZSBjb2RlLgoKYGBge3IgaG93X211Y2hfdGltZX0KdGltZV9kaXN0cmlidXRpb24gPSBmdW5jdGlvbihkX2FnZ3IsIHRyZXNoaG9sZCA9IDcwLCB0aXRsZT0nJywgeGxhYj0nRXN0aW1hdGVkIHRpbWUgdG8gbGVhcm4gTW9yc2UgY29kZScpIHsKUTEgPSBxdWFudGlsZShkX2FnZ3IkZXN0X3RpbWVbZF9hZ2dyJHByb2dyZXNzX2ludGVydmFsID49IHRyZXNoaG9sZF0sIDAuNSkKUTIgPSBxdWFudGlsZShkX2FnZ3IkZXN0X3RpbWVbZF9hZ2dyJHByb2dyZXNzX2ludGVydmFsID49IHRyZXNoaG9sZF0sIDAuOCkKUTMgPSBxdWFudGlsZShkX2FnZ3IkZXN0X3RpbWVbZF9hZ2dyJHByb2dyZXNzX2ludGVydmFsID49IHRyZXNoaG9sZF0sIDAuOSkKCmRfYWdnciAlPiUKICAgICAgICBmaWx0ZXIocHJvZ3Jlc3NfaW50ZXJ2YWwgPj0gdHJlc2hob2xkKSAlPiUKICAgICAgICBtdXRhdGUobWVkaWFuID0gbWVkaWFuKGVzdF90aW1lKSkgJT4lCiAgICAgICAgZ2dwbG90KGFlcyhlc3RfdGltZSkpICsKICAgICAgICAgICAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDIwLCBmaWxsID0gJyMzMzMzQUEnKSArCiAgICAgICAgICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGMoUTEsIFEyLCBRMyksIGNvbG9yID0gJyNGRjAwMDAnKSArCiAgICAgICAgICAgIGxhYnMoeCA9IHhsYWIsIHkgPSAnQW1vdW50IG9mIHVzZXJzJywgdGl0bGUgPSB0aXRsZSkgKwogICAgICAgICAgICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwLCAxMjAsIDEwKSwgbGltaXRzID0gYygyMCwgMTIwKSkgKwogICAgICAgICAgICB0aGVtZV9jbGFzc2ljKCkKfQoKdGltZV9kaXN0cmlidXRpb24oZF9hZ2dyLCB0aXRsZSA9ICdVc2VycywgbGVhcm5lZCBhdCBsZWFzdCA3MCUnKQpgYGAKUmVkIGxpbmVzIHNob3dzIHF1YW50aWxlcyA1MCUsIDgwJSBhbmQgOTAlLiBTbyA4MCUgb2YgcGVvcGxlIG5lZWQgbGVzcyB0aGFuIDgwIG1pbnV0ZXMgZm9yIG1lbW9yaXppbmcgYWxsIGxldHRlcnMuCjkwJSBuZWVkIGxlc3MgdGhhbiAyIGhvdXJzLiBBbmQgbW9zdCBvZiB0aGUgcmVzdCAxMCUgcHJvYmFibHkgcGVvcGxlLCB3aG8gdG9vayBsb25nIGJyZWFrIGR1cmluZyBwbGF5aW5nLgoKQmVsb3cgaXMgc2FtZSBwbG90LCBidXQgd2l0aCBwZW9wbGUgd2hvIGxlYXJuZWQgYWxsIGxldHRlcnMsIG5vdCBvbmx5IDcwJSsuCmBgYHtyfQpkX2FnZ3IgJT4lCiAgZmlsdGVyKHJlYWNoZWRfZW5kLCBtaW5fbGV0dGVycyA9PSAwKSAlPiUKICB0aW1lX2Rpc3RyaWJ1dGlvbih0aXRsZSA9ICdVc2VycywgbGVhcm5lZCBhbGwgYWxwaGFiZXRpY2FsJywgeGxhYiA9ICdUaW1lIHRvIGxlYXJuIE1vcnNlIGNvZGUnKQpgYGAKCk5vdyBsZXQncyB0YWtlIGFub3RoZXIgbG9vayBhdCBlc3RpbWF0ZWQgdGltZSwgdGhpcyB0aW1lIHdlIHdpbGwgY2hlY2ssIGlzIGl0IGNvcnJlY3QgdG8gZXN0aW1hdGUgdGltZSBieSBzaG9ydGVyIHBlcmlvZHMgb2YgbGVhcm5pbmcuCmBgYHtyIGhvd19tdWNoX3RpbWUgMn0KZF9hZ2dyICU+JQogIGZpbHRlcihwcm9ncmVzc19pbnRlcnZhbCA+PSAxMCwKICAgICAgICAgcHJvZ3Jlc3NfaW50ZXJ2YWwgPD0gMTAwKSAlPiUgICMgUGVvcGxlIHdobyByZWFjaCAxMDAlIGNhbiBwbGF5IG11Y2ggbG9uZ2VyLCAgd2Ugd29uJ3QgY291bnQgdGltZSBhZnRlciB0aGV5IGxlYXJuIGFsbCBsZXR0ZXJzCiAgbXV0YXRlKHByb2dyZXNzX2ludGVydmFsID0gYXMuZmFjdG9yKHJvdW5kKHByb2dyZXNzX2ludGVydmFsLCAtMSkpLAogICAgICAgICBwcm9ncmVzc19pbnRlcnZhbCA9IGZjdF9yZWxldmVsKHByb2dyZXNzX2ludGVydmFsLCBjKCcxMCcsICcyMCcsICczMCcsICc0MCcsICc1MCcsICc2MCcsICc3MCcsICc4MCcsICc5MCcsICcxMDAnKSksCiAgKSAlPiUKICBncm91cF9ieShwcm9ncmVzc19pbnRlcnZhbCkgJT4lCiAgbXV0YXRlKG4gPSBuKCkpICU+JQogICMgc3VtbWFyaXplKG4gPSBuKCksCiAgIyAgICAgICAgICAgbWVkaWFuX3RpbWUgPSBtZWRpYW4oZXN0X3RpbWUpKSU+JQogICMgZmlsdGVyKG4+MikgJT4lCiAgZ2dwbG90KGFlcyh4PXByb2dyZXNzX2ludGVydmFsLCB5PWVzdF90aW1lKSkgKwogICAgZ2VvbV92aW9saW4oZmlsbCA9ICcjODg4OEZGJykgKwogICAgc2NhbGVfeF9kaXNjcmV0ZShicmVha3MgPSBzZXEoMTAsIDEwMCwgMTApKSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDEwLCA5MCwgMTApLCBsaW1pdHMgPSBjKDksIDkwKSkgKwogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHBhc3RlKG4sICd1c2VycycpLCB5PTkpLCB2anVzdCA9IC0wLjMsIHNpemUgPSAzLjIpICsKICAgIGxhYnMoeCA9ICclIG9mIGFsaGFiZXRpY2FsIHdhcyBsZWFybmVkIGR1cmluZyB0aGF0IHNlc3Npb24nLAogICAgICAgICB5ID0gJ2VzdGltYXRlZCB0aW1lIChtaW51dGVzKScKICAgICAgICApCmBgYApQZW9wbGUgd2hvIGxlYXJuZWQgbGVzcyB0aGFuIDYwJSBsZXR0ZXJzIGR1cmluZyB0aGF0IHNlc3Npb25zIGZvciBzb21lIHJlYXNvbiBoYXMgdG9vIGhpZ2ggZXN0aW1hdGVkIHNwZWVkLCBzbyB3ZSBzaG91bGQgZXN0aW1hdGUgaXQgYnkKc2Vzc2lvbnMgd2l0aCA2MCUrLiBMb29rcyBsaWtlIGZvciBhdmVyYWdlIHBlb3BsZSBsZWFybmluZyB3aG9sZSBhbHBoYWJldGljYWwgdGFrZXMgfjYwIG1pbnV0ZXMuCgpCZWxvdyBpcyB0aGUgc2FtZSBwbG90LCBidXQgb25seSBmb3IgcGVvcGxlIHdobyBwbGF5ZWQgd2l0aCBzZXR0aW5ncyB3aXRob3V0IGFueSBjbHVlcy4KYGBge3J9CmRfYWdnciAlPiUKICAgICAgICBmaWx0ZXIoc2V0dGluZ3MgPT0gJzAwMScpICU+JQogICAgICAgIGZpbHRlcihwcm9ncmVzc19pbnRlcnZhbCA+PSAxMCwKICAgICAgICAgICAgICAgcHJvZ3Jlc3NfaW50ZXJ2YWwgPCAxMDApICU+JSAgIyBQZW9wbGUgd2hvIHJlYWNoIDEwMCUgY2FuIHBsYXkgbXVjaCBsb25nZXIsICB3ZSB3b24ndCBjb3VudCB0aW1lIGFmdGVyIHRoZXkgbGVhcm4gYWxsIGxldHRlcnMKICAgICAgICBtdXRhdGUocHJvZ3Jlc3NfaW50ZXJ2YWwgPSByb3VuZChwcm9ncmVzc19pbnRlcnZhbCwgLTEpKSAlPiUKICAgICAgICBncm91cF9ieShwcm9ncmVzc19pbnRlcnZhbCkgJT4lCiAgICAgICAgc3VtbWFyaXplKG4gPSBuKCksCiAgICAgICAgICAgICAgICAgIG1lZGlhbl90aW1lID0gbWVkaWFuKGVzdF90aW1lKSklPiUKICAgICAgICBmaWx0ZXIobj4yKSAlPiUKICAgICAgICBnZ3Bsb3QoYWVzKHByb2dyZXNzX2ludGVydmFsLCBtZWRpYW5fdGltZSkpICsKICAgICAgICBnZW9tX2NvbChmaWxsID0gJyMzMzMzQUEnKSArCiAgICAgICAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgxMCwgMTAwLCAxMCkpICsKICAgICAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDkwLCAxNSkpICsKICAgICAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcGFzdGUobiwgJ3VzZXJzJykpLCB2anVzdCA9IC0wLjMsIHNpemUgPSAyLjUpICsKICAgICAgICBsYWJzKHggPSAnJSBvZiBhbGhhYmV0aWNhbCB3YXMgbGVhcm5lZCBkdXJpbmcgdGhhdCBzZXNzaW9uJywKICAgICAgICAgICAgIHkgPSAnbWVkaWFuIGVzdGltYXRlZCB0aW1lIChtaW51dGVzKScKICAgICAgICApCmBgYAojIEhvdyBzcGVlZCBvZiB0aGUgcHJvZ3Jlc3MgY2hhbmdlcyBkdXJpbmcgdGhlIGdhbWU/CgpMZXQncyB0YWtlIHRob3NlIHVzZXJzLCB3aG8gbGVhcm5lZCB3aG9sZSBhbHBoYWJldGljYWxsIGFuZCBzZWUsIGhvdyB0aGVpciBzcGVlZCBjaGFuZ2VkIGR1cmluZyB0aGUgZ2FtZS4KClVuaXRzIGZvciBzcGVlZCBhcmUgYW1vdW50IG9mIGxldHRlcnMsIHdoaWNoIHdvdWxkIGJlIGxlYXJuZWQgaW4gMTAgbWludXRlcyB3aXRoIHRoYXQgc3BlZWQuCmBgYHtyIHNwZWVkX2Rpc3RyaWJ1dGlvbiwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTIwfQpzcGVlZF9wbG90ID0gZCAlPiUKICAgICAgICBncm91cF9ieSh1c2VyKSAlPiUKICAgICAgICBmaWx0ZXIobWF4KHByb2dyZXNzKSAtIG1pbihwcm9ncmVzcykgPj0gOTgsCiAgICAgICAgICAgICAgICFpcy5uYShzcGVlZCkKICAgICAgICApICU+JQogICAgICAgIG11dGF0ZShzcGVlZCA9IHNwZWVkICogMS4wNCAvIDQgKjEwKSAlPiUKICAgICAgICBnZ3Bsb3QoKSArCiAgICAgICAgICAgIGdlb21fbGluZShhZXModG9fbGV0dGVycyhwcm9ncmVzcyksIHNwZWVkKSwgY29sb3I9J2RhcmtibHVlJykgKwogICAgICAgICAgICBnZW9tX3Ntb290aChhZXModG9fbGV0dGVycyhwcm9ncmVzcyksIHNwZWVkKSwgY29sb3I9J3JlZCcsIHNlPUYpICsKICAgICAgICAgICAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IGMoMCwgNSwgMTAsIDE1LCAyMCwgMjYpKSArCiAgICAgICAgICAgIGV4cGFuZF9saW1pdHMoeD1jKDAsIDI2KSkgKwogICAgICAgICAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gYygwLCA1LCAxMCwgMTUpLCBsaW1pdHMgPSBjKC0zLCAyMCkpICsKICAgICAgICAgICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgY29sb3IgPSAnYmxhY2snLCBzaXplPTEpICsKICAgICAgICAgICAgZmFjZXRfd3JhcCh+IHVzZXIsIG5jb2w9NCkgKwogICAgICAgICAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT05MCwgaGp1c3Q9MSwgdmp1c3Q9MC41KSwKICAgICAgICAgICAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9saW5lKCdkYXJrZ3JleScsMC43KSkgKwogICAgICAgICAgICB4bGFiKCdMZXR0ZXJzIGxlYXJuZWQnKSArIHlsYWIoJ1NwZWVkIChMZXR0ZXJzIGxlYXJuZWQgcGVyIDEwIG1pbnV0ZXMpJykKcHJpbnQoc3BlZWRfcGxvdCkKYGBgCkF0IGJlZ2lubmluZyBvZiB0aGUgZ2FtZSB3ZSBjYW4gc2VlIGlzIGEgcGVhayBvZiBzcGVlZCwgZm9yIGZpcnN0IGxldHRlcnMsIGJ1dCBhZnRlciB0aGF0IHNwZWVkIGxvb2tzIGNvbnN0YW50IGFuZCB1c3VhbGx5IGFyb3VuZCAzJS4KTWVhbiBzcGVlZCBpcyBgciBtZWFuKGQkc3BlZWQsIG5hLnJtPVQpICU+JSByb3VuZCgxKWAlLgoKRm9yIHNvbWUgdXNlcnMgcHJvZ3Jlc3Mgc2xvd3MgZG93biAoc3BlZWQgaXMgbmVnYXRpdmUpLCBmb3Igb3RoZXJzIGl0cyBuZXZlciBnb2luZyBiYWNrIGFuZCB0aGV5IHNwZWVkIHVwLiAKCiMgV2hpY2ggaGludCBvcHRpb25zIGFyZSBiZXR0ZXIgZm9yIGxlYXJuaW5nPwoKTm93IGxldCdzIGNvbXBhcmUsIGhvdyBtdWNoIHRpbWUgcmVxdWlyZXMgbGVhcm5pbmcgd2l0aCBkaWZmZXJlbnQgaGludCBzZXR0aW5ncy4KYGBge3IgY29tcGFyZV9zZXR0aW5nc30KY29tcGFyZV9zZXR0aW5ncyA9IGZ1bmN0aW9uKGRhdGEpIHsKICBjaGFydF9zZXR0aW5ncyA9IGRhdGEgJT4lCiAgICAgICAgbXV0YXRlKHVzZXJzPWFzLmludGVnZXIoMSkpICU+JQogICAgICAgIGZpbHRlcihwcm9ncmVzc19pbnRlcnZhbCA+IDYwKSAlPiUKICAgICAgICBncm91cF9ieShzZXR0aW5ncykgJT4lCiAgICAgICAgc3VtbWFyaXplKHRpbWUgID0gcm91bmQoMTAwIC8gbWVhbihzcGVlZCkpLAogICAgICAgICAgICAgICAgICB1c2VycyA9IHN1bSh1c2VycyksCiAgICAgICAgICAgICAgICAgIHRvdGFsX3Byb2dyZXNzID0gc3VtKHByb2dyZXNzX2ludGVydmFsKSwKICAgICAgICApICU+JQogICAgICAgIG11dGF0ZSh2aXN1YWxfaGludHMgPSBzdHJfc3ViKHNldHRpbmdzLCAxLCAxKSA9PSAnMScsCiAgICAgICAgICAgICAgIHNwZWVjaF9oaW50cyA9IHN0cl9zdWIoc2V0dGluZ3MsIDIsIDIpID09ICcxJywKICAgICAgICAgICAgICAgc291bmQgPSBzdHJfc3ViKHNldHRpbmdzLCAzLCAzKSA9PSAnMScsCiAgICAgICAgICAgICAgIHRvdGFsX2xldHRlcnMgPSB0b19sZXR0ZXJzKHRvdGFsX3Byb2dyZXNzKQogICAgICAgICAgICAgICkgJT4lCiAgICAgICAgZmlsdGVyKHVzZXJzID4gNSkgJT4lCiAgICAgICAgYXJyYW5nZSh0aW1lKQoKICBjaGFydF9zZXR0aW5ncyAlPiUKICAgICAgICBzZWxlY3QodGltZSwgdmlzdWFsX2hpbnRzLCBzcGVlY2hfaGludHMsIHNvdW5kLCB1c2VycywgdG90YWxfbGV0dGVycykgJT4lCiAgICAgICAgbXV0YXRlX2F0KHZhcnModmlzdWFsX2hpbnRzLCBzcGVlY2hfaGludHMsIHNvdW5kKSwgfiByZXBsYWNlKC4sIHdoaWNoKC4pLCAnKysnKSkgJT4lCiAgICAgICAgbXV0YXRlX2F0KHZhcnModmlzdWFsX2hpbnRzLCBzcGVlY2hfaGludHMsIHNvdW5kKSwgfiByZXBsYWNlKC4sIHdoaWNoKC4gIT0gJysrJyksICfigJMnKSkgJT4lCiAgICAgICAga2FibGUoZm9ybWF0PSdodG1sJywgdGFibGUuYXR0ciA9ICdzdHlsZT0id2lkdGg6NDAlIicsCiAgICAgICAgICAgICAgY29sLm5hbWVzPWMoJ01pbnV0ZXMnLCAnVmlzdWFsIGhpbnRzJywgJ1NwZWVjaCBoaW50cycsICdTb3VuZCBlbmFibGVkJywgJ1VzZXJzJywgJ1RvdGFsIGxldGVycycpLAogICAgICAgICAgICAgIGFsaWduID0gJ2MnCiAgICAgICAgKSAlPiUKICAgICAgICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygnc3RyaXBlZCcsICdob3ZlcicpKQp9Cgpjb21wYXJlX3NldHRpbmdzKGRfYWdncikKYGBgCldpdGggb3VyIGN1cnJlbnQgYW1vdW50IG9mIGRhdGEgd2UgY2FuJ3QgbWFrZSByZWxpYWJsZSBjb25sdXNpb25zIGFib3V0IHdoaWNoIGNsdWUgc2V0dGluZ3MgYXJlIG1vcmUgZWZmZWN0aXZlLgoKVGhpcyBpcyBzYW1lIHRhYmxlLCBidXQgb25seSBmb3IgdXNlcnMgd2hvIGxlYXJuZWQgYWxsIGFscGhhYmV0aWNhbCB3aXRob3V0IGNoYW5naW5nIHNldHRpbmdzOgpgYGB7cn0KZF9hZ2dyICU+JQogICAgICAgIGZpbHRlcihyZWFjaGVkX2VuZCwgbWluX3Byb2dyZXNzIDw9IDApICU+JQogICAgICAgIGNvbXBhcmVfc2V0dGluZ3MoKQpgYGAKCuKAkyDigJMg4oCTIOKAkyDigJMg4oCTIOKAkyDigJMg4oCTIOKAkyDigJMg4oCTIOKAkyDigJMKCkJlbG93IGlzIHRoZSBvbGRlciBzZWN0aW9uLCB3aGljaCBpcyBwcm92ZWQgdG8gYmUgd3JvbmcgYWZ0ZXIgd2UgZGlkIGZpbmQgb3V0IHRoYXQgc3BlZWQgb2YgdXNlcnMgd2l0aCB0b28gc2hvcnQgc2Vzc2lvbiAobGVzcyB0aGFuIDcwJSkgZXN0aW1hdGVkIHRvbyBoaWdoLgpTZXNzaW9ucyB3aXRob3V0IGFueSBjbHVlcyB3cmUgc2hvcnRlciwgdGhhdCdzIHdoeSB3ZSBlc3RpbWF0ZWQgdGhlaXIgc3BlZWQgaGlnaGVyLgoKTm93IGxldCdzIGNvbXBhcmUsIGhvdyBtdWNoIHRpbWUgcmVxdWlyZXMgbGVhcm5pbmcgd2l0aCBkaWZmZXJlbnQgaGludCBzZXR0aW5ncy4KQXQgZmlyc3QgbG9vayBpdHMgbGlrZSB0aGlzOgpgYGB7ciBjb21wYXJlX3NldHRpbmdzX29sZH0KY2hhcnRfc2V0dGluZ3MgPSBkX2FnZ3IgJT4lCiAgICAgICAgbXV0YXRlKHVzZXJzPWFzLmludGVnZXIoMSkpICU+JQogICAgICAgIGZpbHRlcihwcm9ncmVzc19pbnRlcnZhbCA+IDEwKSAlPiUKICAgICAgICBncm91cF9ieShzZXR0aW5ncykgJT4lCiAgICAgICAgc3VtbWFyaXplKHRpbWUgID0gcm91bmQoMTAwIC8gbWVhbihzcGVlZCkpLAogICAgICAgICAgICAgICAgICB1c2VycyA9IHN1bSh1c2VycyksCiAgICAgICAgICAgICAgICAgIHRvdGFsX3Byb2dyZXNzID0gc3VtKHByb2dyZXNzX2ludGVydmFsKSwKICAgICAgICApICU+JQogICAgICAgIG11dGF0ZSh2aXN1YWxfaGludHMgPSBzdHJfc3ViKHNldHRpbmdzLCAxLCAxKSA9PSAnMScsCiAgICAgICAgICAgICAgIHNwZWVjaF9oaW50cyA9IHN0cl9zdWIoc2V0dGluZ3MsIDIsIDIpID09ICcxJywKICAgICAgICAgICAgICAgc291bmQgPSBzdHJfc3ViKHNldHRpbmdzLCAzLCAzKSA9PSAnMScsCiAgICAgICAgICAgICAgIHRvdGFsX2xldHRlcnMgPSByb3VuZCh0b3RhbF9wcm9ncmVzcyAvIDEwMCAqIDI2KQogICAgICAgICAgICAgICkgJT4lCiAgICAgICAgZmlsdGVyKHVzZXJzID4gNSkgJT4lCiAgICAgICAgYXJyYW5nZSh0aW1lKQoKY2hhcnRfc2V0dGluZ3MgJT4lCiAgICAgICAgc2VsZWN0KHRpbWUsIHZpc3VhbF9oaW50cywgc3BlZWNoX2hpbnRzLCBzb3VuZCwgdXNlcnMsIHRvdGFsX2xldHRlcnMpICU+JQogICAgICAgIG11dGF0ZV9hdCh2YXJzKHZpc3VhbF9oaW50cywgc3BlZWNoX2hpbnRzLCBzb3VuZCksIH4gcmVwbGFjZSguLCB3aGljaCguKSwgJysrJykpICU+JQogICAgICAgIG11dGF0ZV9hdCh2YXJzKHZpc3VhbF9oaW50cywgc3BlZWNoX2hpbnRzLCBzb3VuZCksIH4gcmVwbGFjZSguLCB3aGljaCguICE9ICcrKycpLCAn4oCTJykpICU+JQogICAgICAgIGthYmxlKGZvcm1hdD0naHRtbCcsIHRhYmxlLmF0dHIgPSAnc3R5bGU9IndpZHRoOjQwJSInLAogICAgICAgICAgICAgIGNvbC5uYW1lcz1jKCdNaW51dGVzJywgJ1Zpc3VhbCBoaW50cycsICdTcGVlY2ggaGludHMnLCAnU291bmQgZW5hYmxlZCcsICdVc2VycycsICdUb3RhbCBsZXRlcnMnKSwKICAgICAgICAgICAgICBhbGlnbiA9ICdjJwogICAgICAgICkgJT4lCiAgICAgICAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoJ3N0cmlwZWQnLCAnaG92ZXInKSkKYGBgCkFjY29yZGluZyB0byB0aGlzIHRhYmxlLCB0aGUgYmVzdCBvcHRpb24gaXMgdG8gcGxheSBvbmx5IHdpdGggc291bmQgYW5kIHdpdGhvdXQgaGludHMuCkJ1dCB3ZSBtdXN0IGNoZWNrLCBob3cgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCB0aG9zZSBkaWZmZXJlbmNlcyBhcmUuCgpgYGB7ciByZXN1bHRzID0gJ2hpZGUnfQpkX3Rlc3QgPSBkX2FnZ3IgJT4lIGZpbHRlcihwcm9ncmVzc19pbnRlcnZhbCA+IDEwKQp0ZXN0XzAwMSA9IGRfdGVzdCAlPiUgZmlsdGVyKHNldHRpbmdzID09ICcwMDEnKQp0ZXN0XzEwMCA9IGRfdGVzdCAlPiUgZmlsdGVyKHNldHRpbmdzID09ICcxMDAnKQp0ZXN0XzEwMSA9IGRfdGVzdCAlPiUgZmlsdGVyKHNldHRpbmdzID09ICcxMDEnKQp0ZXN0XzExMCA9IGRfdGVzdCAlPiUgZmlsdGVyKHNldHRpbmdzID09ICcxMTAnKQp0ZXN0XzExMSA9IGRfdGVzdCAlPiUgZmlsdGVyKHNldHRpbmdzID09ICcxMTEnKQp0ZXN0XzAxMCA9IGRfdGVzdCAlPiUgZmlsdGVyKHNldHRpbmdzID09ICcwMTAnKQp0ZXN0XzAxMSA9IGRfdGVzdCAlPiUgZmlsdGVyKHNldHRpbmdzID09ICcwMTEnKQoKdGVzdF92aXN1YWxfb2ZmID0gZF90ZXN0ICU+JSBmaWx0ZXIoc2V0dGluZ3MgJWluJSBjKCcwMTEnLCAnMDAxJykpCnQudGVzdCh0ZXN0X3Zpc3VhbF9vZmYkc3BlZWQsIHRlc3RfMTAwJHNwZWVkKQp0LnRlc3QodGVzdF8xMDEkc3BlZWQsIHRlc3RfMTAwJHNwZWVkKQoKIyBWaXN1YWwgaGludHMKdC50ZXN0KHRlc3RfMTAxJHNwZWVkLCB0ZXN0XzAwMSRzcGVlZCkKdC50ZXN0KHRlc3RfMTExJHNwZWVkLCB0ZXN0XzAxMSRzcGVlZCkKCiMgU3BlZWNoIGhpbnRzCnQudGVzdCh0ZXN0XzExMSRzcGVlZCwgdGVzdF8xMDEkc3BlZWQpCnQudGVzdCh0ZXN0XzExMCRzcGVlZCwgdGVzdF8xMDAkc3BlZWQpCnQudGVzdCh0ZXN0XzAxMSRzcGVlZCwgdGVzdF8wMDEkc3BlZWQpCgojIFNvdW5kCnQudGVzdCh0ZXN0XzEwMSRzcGVlZCwgdGVzdF8xMDAkc3BlZWQpCnQudGVzdCh0ZXN0XzExMSRzcGVlZCwgdGVzdF8xMTAkc3BlZWQpCmBgYApXaXRoIG91ciBjdXJyZW50IGFtb3VudCBvZiBkYXRhIHdlIGNhbid0IG1ha2UgcmVsaWFibGUgY29ubHVzaW9ucyBhYm91dCB3aGljaCBjbHVlIHNldHRpbmdzIGFyZSBtb3JlIGVmZmVjdGl2ZS4KCkluIG9yZGVyIHRvIGF2b2lkIG1pc2ludGVycHJldGF0aW9ucywgSSB3aWxsIHRyeSB0byBwdXQgbXkgd29yZHMgdmVyeSBwcmVjaXNlbHkgaW4gdGhpcyBwYXJ0LiBNaWdodCBiZSBhIGJpdCByZXBldGl0aXZlLgoKQWZ0ZXIgc2VyaWVzIG9mIFQtdGVzdHMsIGFjY29yZGluZyB0byBvdXIgZGF0YSwgd2UgY2FuIG1ha2UgdGhvc2Ugc3RhdGVtZW50cywgd2hpY2ggYXJlIHRvdGFsbHkgaW5kZXBlbmRlbnQgb2YgZWFjaCBvdGhlcjoKCioqKgoKIyMjIyBWaXN1YWwgaGludHMKLSBXaGVuIHNvdW5kIGlzIGVuYWJsZWQsIGJ1dCBzcGVlY2ggaGludHMgYXJlbid0LCB3ZSBjYW4gYmUgc3VyZSB3aXRoCioqYHIgKDEwMCAtIHQudGVzdCh0ZXN0XzEwMSRzcGVlZCwgdGVzdF8wMDEkc3BlZWQpJHAudmFsdWUgKiAxMDApICU+JSByb3VuZCgpYCUgKioKY2VydGFpbnR5LCB0aGF0IGRpc2FibGluZyB2aXN1YWwgaGludHMgd2lsbCB1c3VhbGx5IHNwZWVkIHVwIGxlYXJuaW5nIHByb2Nlc3MuCi0gV2hlbiBzb3VuZCBhbmQgc3BlZWNoIGhpbnRzIGFyZSBlbmFibGVkLCB3ZSBjYW4gYmUgc3VyZSB3aXRoIGF0IGxlYXN0CioqYHIgKDEwMCAtIHQudGVzdCh0ZXN0XzExMSRzcGVlZCwgdGVzdF8wMTEkc3BlZWQpJHAudmFsdWUgKiAxMDApICU+JSByb3VuZCgpYCUgKioKY2VydGFpbnR5LCB0aGF0IGRpc2FibGluZyB2aXN1YWwgaGludHMgd2lsbCB1c3VhbGx5IHNwZWVkIHVwIGxlYXJuaW5nIHByb2Nlc3MuCgojIyMjIFNwZWVjaCBoaW50cwotIFdoZW4gc291bmQgYW5kIHZpc3VhbCBoaW50cyBhcmUgZW5hYmxlZCwgdGhlcmUgaXMgbm8gc2lnbmlmaWNhbmNlIGVub3VnaCBkaWZmZXJlbmNlCmJldHdlZW4gZW5hYmxpbmcgYW5kIGRpc2FibGluZyBzcGVlY2ggaGludHMuIFByb2JhYmx5IHRoZXJlIGlzIHNvbWUgc21hbGwgZGlmZmVyZW5jZSwKYnV0IHdpdGggb3VyIGN1cnJlbnQgYW1vdW50IG9mIGRhdGEgd2UgY2FuJ3QgY2F0Y2ggc28gc21hbGwgZGlmZmVyZW5jZXMuCi0gV2hlbiB2aXN1YWwgaGludHMgYXJlIGVuYWJsZWQsIGJ1dCBzb3VuZCBpc24ndCwgd2UgY2FuIGJlIHN1cmUgd2l0aCBhdCBsZWFzdAoqKmByICgxMDAgLSB0LnRlc3QodGVzdF8xMTAkc3BlZWQsIHRlc3RfMTAwJHNwZWVkKSRwLnZhbHVlICogMTAwKSAlPiUgcm91bmQoKWAlICoqCmNlcnRhaW50eSwgdGhhdCBkaXNhYmxpbmcgc3BlZWNoIGhpbnRzIHdpbGwgdXN1YWxseSBzcGVlZCB1cCBsZWFybmluZyBwcm9jZXNzLgoKIyMjIyBTb3VuZAotIFdoZW4gdmlzdWFsIGhpbnRzIGFyZSBlbmFibGVkLCBidXQgc3BlZWNoIGhpbnRzIGFyZW4ndCwgd2UgY2FuIGJlIHN1cmUgd2l0aCBhdCBsZWFzdAoqKmByICgxMDAgLSB0LnRlc3QodGVzdF8xMDEkc3BlZWQsIHRlc3RfMTAwJHNwZWVkKSRwLnZhbHVlICogMTAwKSAlPiUgcm91bmQoKWAlICoqCmNlcnRhaW50eSwgdGhhdCBkaXNhYmxpbmcgc291bmQgd2lsbCB1c3VhbGx5IHNwZWVkIHVwIGxlYXJuaW5nIHByb2Nlc3MuCmBgYHtyIHJlc3VsdHMgPSAnaGlkZSd9CmRfdGVzdCA9IGRfYWdnciAlPiUgZmlsdGVyKHByb2dyZXNzX2ludGVydmFsID4gMTApCnRlc3RfMDAxID0gZF90ZXN0ICU+JSBmaWx0ZXIoc2V0dGluZ3MgPT0gJzAwMScpCnRlc3RfMTAwID0gZF90ZXN0ICU+JSBmaWx0ZXIoc2V0dGluZ3MgPT0gJzEwMCcpCnRlc3RfMTAxID0gZF90ZXN0ICU+JSBmaWx0ZXIoc2V0dGluZ3MgPT0gJzEwMScpCnRlc3RfMTEwID0gZF90ZXN0ICU+JSBmaWx0ZXIoc2V0dGluZ3MgPT0gJzExMCcpCnRlc3RfMTExID0gZF90ZXN0ICU+JSBmaWx0ZXIoc2V0dGluZ3MgPT0gJzExMScpCnRlc3RfMDEwID0gZF90ZXN0ICU+JSBmaWx0ZXIoc2V0dGluZ3MgPT0gJzAxMCcpCnRlc3RfMDExID0gZF90ZXN0ICU+JSBmaWx0ZXIoc2V0dGluZ3MgPT0gJzAxMScpCgp0ZXN0X3Zpc3VhbF9vZmYgPSBkX3Rlc3QgJT4lIGZpbHRlcihzZXR0aW5ncyAlaW4lIGMoJzAxMScsICcwMDEnKSkKdC50ZXN0KHRlc3RfdmlzdWFsX29mZiRzcGVlZCwgdGVzdF8xMDAkc3BlZWQpCnQudGVzdCh0ZXN0XzEwMSRzcGVlZCwgdGVzdF8xMDAkc3BlZWQpCgojIFZpc3VhbCBoaW50cwp0LnRlc3QodGVzdF8xMDEkc3BlZWQsIHRlc3RfMDAxJHNwZWVkKQp0LnRlc3QodGVzdF8xMTEkc3BlZWQsIHRlc3RfMDExJHNwZWVkKQoKIyBTcGVlY2ggaGludHMKdC50ZXN0KHRlc3RfMTExJHNwZWVkLCB0ZXN0XzEwMSRzcGVlZCkKdC50ZXN0KHRlc3RfMTEwJHNwZWVkLCB0ZXN0XzEwMCRzcGVlZCkKdC50ZXN0KHRlc3RfMDExJHNwZWVkLCB0ZXN0XzAwMSRzcGVlZCkKCiMgU291bmQKdC50ZXN0KHRlc3RfMTAxJHNwZWVkLCB0ZXN0XzEwMCRzcGVlZCkKdC50ZXN0KHRlc3RfMTExJHNwZWVkLCB0ZXN0XzExMCRzcGVlZCkKYGBgCgojIyBBY2N1cmFjeSBmb3IgZWFjaCBsZXR0ZXIKCldlIHRvb2sgYWNjdXJhY3kgc3RhdHMgZnJvbSBlYWNoIHVzZXIgb25seSB1bnRpbCB0aGV5IGdvdCAxMCBzdWNjZXNzIHRyaWFscyBmb3IgdGhpcyBsZXR0ZXIuCkNvbHVtbiAiVmlzdWFsKyIgc2hvd3MgYW1vdW50IG9mIGNvcnJlY3QgaW5wdXRzLCB3aGlsZSB2aXN1YWwgaGludHMgd2VyZSBzaG93bi4KIlZpc3VhbC0iIHNob3dzIG1pc3Rha2VzIGFuZCAiVmlzdWFsJSIgc2hvd3MgcGVyY2VudCBvZiBtaXN0YWtlcy4KCkxldHRlcnMgd2l0aCB0b28gaW5zaWduaWZpY2FudCBhbW91bnQgb2YgZGF0YSBub3Qgc2hvd24uCgpgYGB7ciBhY2N1cmFjeV9mb3JfbGV0dGVyc30KaWYoY2FsY3VsYXRlX2FjY3VyYWN5KSB7CmFjY3VyYWN5ICU+JQogIGZpbHRlcihgdmlzdWFsK2AgPiA3MCkgJT4lCiAgYXJyYW5nZShkZXNjKGB2aXN1YWwlYCkpICU+JQogIG11dGF0ZSgndmlzdWFsJScgPSBwYXN0ZTAocm91bmQoYHZpc3VhbCVgKjEwMCksICclJyksCiAgJ3NwZWVjaCUnID0gcGFzdGUwKHJvdW5kKGBzcGVlY2glYCoxMDApLCAnJScpLAogICdub2hpbnRzJScgPSBwYXN0ZTAocm91bmQoYG5vaGludHMlYCoxMDApLCAnJScpKSAlPiUKICBrYWJsZShmb3JtYXQ9J2h0bWwnLCB0YWJsZS5hdHRyID0gJ3N0eWxlPSJ3aWR0aDo0MCUiJykgJT4lCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoJ3N0cmlwZWQnLCAnaG92ZXInKSkgJT4lCiAgY29sdW1uX3NwZWMoMSwgYm9sZCA9IFRSVUUpCn0KYGBgCkxvb2tzIGxpa2Ugc29tZSB2aXN1YWwgaGludHMgbWFrZXMgaXQgdmVyeSBoYXJkIHRvIGxlYXJuIGxldHRlciDigJQgQiwgSCwgUiwgSywgRS4KCiJGIiBtaWdodCBiZSBqdXN0IGEgaGFyZCBsZXR0ZXIuCgpTb21lIHZpc3VhbCBoaW50cyBwcm9iYWJseSBtYWtlcyBpdCBlYXNpZXIsIGZvciBleGFtcGxlIEwgYW5kIFUuCgpCdXQgZm9yIG1vc3QgbGV0dGVycyBhY2N1cmFjeSBpcyBiZXR0ZXIgd2l0aG91dCBhbnkgY2x1ZXMuCgpTcGVlY2ggY2x1ZSBhcmVuJ3QgYWZmZWN0IGxlYXJuaW5nIHByb2Nlc3MgdGhhdCBtdWNoIGFzIHZpc3VhbCDigJQgYWNjdXJhY3kgZm9yIHRoZW0gaXMgbW9yZSBzaW1pbGFyIHdpdGggIm5vIGhpbnRzIiBvcHRpb24uCg==