-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsankey_tool.html
More file actions
164 lines (140 loc) · 406 KB
/
Copy pathsankey_tool.html
File metadata and controls
164 lines (140 loc) · 406 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
<!doctype HTML>
<meta charset = 'utf-8'>
<html>
<head>
<link rel='stylesheet' href='data:text/css;base64,LyoKbm90IHN1cmUgb3JpZ2luYWwgYXV0aG9yCmJlbGlldmUgSSBjb3BpZWQvcGFzdGVkIGZyb20KaHR0cDovL3d3dy5kM25vb2Iub3JnLzIwMTMvMDIvc2Fua2V5LWRpYWdyYW1zLWRlc2NyaXB0aW9uLW9mLWQzanMtY29kZS5odG1sCmJ1dCBoYXZlIHRvIHRoaW5rIG9yaWdpbmFsIHNvdXJjZSB3YXMgTWlrZSBCb3N0b2NrCmh0dHA6Ly9ib3N0Lm9ja3Mub3JnL21pa2Uvc2Fua2V5LwoqLwoKLm5vZGUgcmVjdCB7CiAgY3Vyc29yOiBtb3ZlOwogIGZpbGwtb3BhY2l0eTogLjk7CiAgc2hhcGUtcmVuZGVyaW5nOiBjcmlzcEVkZ2VzOwp9Cgoubm9kZSB0ZXh0IHsKICBwb2ludGVyLWV2ZW50czogbm9uZTsKICB0ZXh0LXNoYWRvdzogMCAxcHggMCAjZmZmOwp9CgoubGluayB7CiAgZmlsbDogbm9uZTsKICBzdHJva2U6ICMwMDA7CiAgc3Ryb2tlLW9wYWNpdHk6IC4yOwp9CgoubGluazpob3ZlciB7CiAgc3Ryb2tlLW9wYWNpdHk6IC41Owp9CgpzdmcgewogIGZvbnQ6IDEwcHggc2Fucy1zZXJpZjsKfQ=='>
<script src='data:application/javascript;base64,ZDMgPSBmdW5jdGlvbigpIHsKICB2YXIgZDMgPSB7CiAgICB2ZXJzaW9uOiAiMy4xLjkiCiAgfTsKICBpZiAoIURhdGUubm93KSBEYXRlLm5vdyA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuICtuZXcgRGF0ZSgpOwogIH07CiAgdmFyIGQzX2RvY3VtZW50ID0gZG9jdW1lbnQsIGQzX3dpbmRvdyA9IHdpbmRvdzsKICB0cnkgewogICAgZDNfZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGUuc2V0UHJvcGVydHkoIm9wYWNpdHkiLCAwLCAiIik7CiAgfSBjYXRjaCAoZXJyb3IpIHsKICAgIHZhciBkM19zdHlsZV9wcm90b3R5cGUgPSBkM193aW5kb3cuQ1NTU3R5bGVEZWNsYXJhdGlvbi5wcm90b3R5cGUsIGQzX3N0eWxlX3NldFByb3BlcnR5ID0gZDNfc3R5bGVfcHJvdG90eXBlLnNldFByb3BlcnR5OwogICAgZDNfc3R5bGVfcHJvdG90eXBlLnNldFByb3BlcnR5ID0gZnVuY3Rpb24obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7CiAgICAgIGQzX3N0eWxlX3NldFByb3BlcnR5LmNhbGwodGhpcywgbmFtZSwgdmFsdWUgKyAiIiwgcHJpb3JpdHkpOwogICAgfTsKICB9CiAgZDMuYXNjZW5kaW5nID0gZnVuY3Rpb24oYSwgYikgewogICAgcmV0dXJuIGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiBhID49IGIgPyAwIDogTmFOOwogIH07CiAgZDMuZGVzY2VuZGluZyA9IGZ1bmN0aW9uKGEsIGIpIHsKICAgIHJldHVybiBiIDwgYSA/IC0xIDogYiA+IGEgPyAxIDogYiA+PSBhID8gMCA6IE5hTjsKICB9OwogIGQzLm1pbiA9IGZ1bmN0aW9uKGFycmF5LCBmKSB7CiAgICB2YXIgaSA9IC0xLCBuID0gYXJyYXkubGVuZ3RoLCBhLCBiOwogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHsKICAgICAgd2hpbGUgKCsraSA8IG4gJiYgKChhID0gYXJyYXlbaV0pID09IG51bGwgfHwgYSAhPSBhKSkgYSA9IHVuZGVmaW5lZDsKICAgICAgd2hpbGUgKCsraSA8IG4pIGlmICgoYiA9IGFycmF5W2ldKSAhPSBudWxsICYmIGEgPiBiKSBhID0gYjsKICAgIH0gZWxzZSB7CiAgICAgIHdoaWxlICgrK2kgPCBuICYmICgoYSA9IGYuY2FsbChhcnJheSwgYXJyYXlbaV0sIGkpKSA9PSBudWxsIHx8IGEgIT0gYSkpIGEgPSB1bmRlZmluZWQ7CiAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoKGIgPSBmLmNhbGwoYXJyYXksIGFycmF5W2ldLCBpKSkgIT0gbnVsbCAmJiBhID4gYikgYSA9IGI7CiAgICB9CiAgICByZXR1cm4gYTsKICB9OwogIGQzLm1heCA9IGZ1bmN0aW9uKGFycmF5LCBmKSB7CiAgICB2YXIgaSA9IC0xLCBuID0gYXJyYXkubGVuZ3RoLCBhLCBiOwogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHsKICAgICAgd2hpbGUgKCsraSA8IG4gJiYgKChhID0gYXJyYXlbaV0pID09IG51bGwgfHwgYSAhPSBhKSkgYSA9IHVuZGVmaW5lZDsKICAgICAgd2hpbGUgKCsraSA8IG4pIGlmICgoYiA9IGFycmF5W2ldKSAhPSBudWxsICYmIGIgPiBhKSBhID0gYjsKICAgIH0gZWxzZSB7CiAgICAgIHdoaWxlICgrK2kgPCBuICYmICgoYSA9IGYuY2FsbChhcnJheSwgYXJyYXlbaV0sIGkpKSA9PSBudWxsIHx8IGEgIT0gYSkpIGEgPSB1bmRlZmluZWQ7CiAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoKGIgPSBmLmNhbGwoYXJyYXksIGFycmF5W2ldLCBpKSkgIT0gbnVsbCAmJiBiID4gYSkgYSA9IGI7CiAgICB9CiAgICByZXR1cm4gYTsKICB9OwogIGQzLmV4dGVudCA9IGZ1bmN0aW9uKGFycmF5LCBmKSB7CiAgICB2YXIgaSA9IC0xLCBuID0gYXJyYXkubGVuZ3RoLCBhLCBiLCBjOwogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHsKICAgICAgd2hpbGUgKCsraSA8IG4gJiYgKChhID0gYyA9IGFycmF5W2ldKSA9PSBudWxsIHx8IGEgIT0gYSkpIGEgPSBjID0gdW5kZWZpbmVkOwogICAgICB3aGlsZSAoKytpIDwgbikgaWYgKChiID0gYXJyYXlbaV0pICE9IG51bGwpIHsKICAgICAgICBpZiAoYSA+IGIpIGEgPSBiOwogICAgICAgIGlmIChjIDwgYikgYyA9IGI7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHdoaWxlICgrK2kgPCBuICYmICgoYSA9IGMgPSBmLmNhbGwoYXJyYXksIGFycmF5W2ldLCBpKSkgPT0gbnVsbCB8fCBhICE9IGEpKSBhID0gdW5kZWZpbmVkOwogICAgICB3aGlsZSAoKytpIDwgbikgaWYgKChiID0gZi5jYWxsKGFycmF5LCBhcnJheVtpXSwgaSkpICE9IG51bGwpIHsKICAgICAgICBpZiAoYSA+IGIpIGEgPSBiOwogICAgICAgIGlmIChjIDwgYikgYyA9IGI7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBbIGEsIGMgXTsKICB9OwogIGQzLnN1bSA9IGZ1bmN0aW9uKGFycmF5LCBmKSB7CiAgICB2YXIgcyA9IDAsIG4gPSBhcnJheS5sZW5ndGgsIGEsIGkgPSAtMTsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7CiAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoIWlzTmFOKGEgPSArYXJyYXlbaV0pKSBzICs9IGE7CiAgICB9IGVsc2UgewogICAgICB3aGlsZSAoKytpIDwgbikgaWYgKCFpc05hTihhID0gK2YuY2FsbChhcnJheSwgYXJyYXlbaV0sIGkpKSkgcyArPSBhOwogICAgfQogICAgcmV0dXJuIHM7CiAgfTsKICBmdW5jdGlvbiBkM19udW1iZXIoeCkgewogICAgcmV0dXJuIHggIT0gbnVsbCAmJiAhaXNOYU4oeCk7CiAgfQogIGQzLm1lYW4gPSBmdW5jdGlvbihhcnJheSwgZikgewogICAgdmFyIG4gPSBhcnJheS5sZW5ndGgsIGEsIG0gPSAwLCBpID0gLTEsIGogPSAwOwogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHsKICAgICAgd2hpbGUgKCsraSA8IG4pIGlmIChkM19udW1iZXIoYSA9IGFycmF5W2ldKSkgbSArPSAoYSAtIG0pIC8gKytqOwogICAgfSBlbHNlIHsKICAgICAgd2hpbGUgKCsraSA8IG4pIGlmIChkM19udW1iZXIoYSA9IGYuY2FsbChhcnJheSwgYXJyYXlbaV0sIGkpKSkgbSArPSAoYSAtIG0pIC8gKytqOwogICAgfQogICAgcmV0dXJuIGogPyBtIDogdW5kZWZpbmVkOwogIH07CiAgZDMucXVhbnRpbGUgPSBmdW5jdGlvbih2YWx1ZXMsIHApIHsKICAgIHZhciBIID0gKHZhbHVlcy5sZW5ndGggLSAxKSAqIHAgKyAxLCBoID0gTWF0aC5mbG9vcihIKSwgdiA9ICt2YWx1ZXNbaCAtIDFdLCBlID0gSCAtIGg7CiAgICByZXR1cm4gZSA/IHYgKyBlICogKHZhbHVlc1toXSAtIHYpIDogdjsKICB9OwogIGQzLm1lZGlhbiA9IGZ1bmN0aW9uKGFycmF5LCBmKSB7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIGFycmF5ID0gYXJyYXkubWFwKGYpOwogICAgYXJyYXkgPSBhcnJheS5maWx0ZXIoZDNfbnVtYmVyKTsKICAgIHJldHVybiBhcnJheS5sZW5ndGggPyBkMy5xdWFudGlsZShhcnJheS5zb3J0KGQzLmFzY2VuZGluZyksIC41KSA6IHVuZGVmaW5lZDsKICB9OwogIGQzLmJpc2VjdG9yID0gZnVuY3Rpb24oZikgewogICAgcmV0dXJuIHsKICAgICAgbGVmdDogZnVuY3Rpb24oYSwgeCwgbG8sIGhpKSB7CiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSBsbyA9IDA7CiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCA0KSBoaSA9IGEubGVuZ3RoOwogICAgICAgIHdoaWxlIChsbyA8IGhpKSB7CiAgICAgICAgICB2YXIgbWlkID0gbG8gKyBoaSA+Pj4gMTsKICAgICAgICAgIGlmIChmLmNhbGwoYSwgYVttaWRdLCBtaWQpIDwgeCkgbG8gPSBtaWQgKyAxOyBlbHNlIGhpID0gbWlkOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbG87CiAgICAgIH0sCiAgICAgIHJpZ2h0OiBmdW5jdGlvbihhLCB4LCBsbywgaGkpIHsKICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDMpIGxvID0gMDsKICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDQpIGhpID0gYS5sZW5ndGg7CiAgICAgICAgd2hpbGUgKGxvIDwgaGkpIHsKICAgICAgICAgIHZhciBtaWQgPSBsbyArIGhpID4+PiAxOwogICAgICAgICAgaWYgKHggPCBmLmNhbGwoYSwgYVttaWRdLCBtaWQpKSBoaSA9IG1pZDsgZWxzZSBsbyA9IG1pZCArIDE7CiAgICAgICAgfQogICAgICAgIHJldHVybiBsbzsKICAgICAgfQogICAgfTsKICB9OwogIHZhciBkM19iaXNlY3RvciA9IGQzLmJpc2VjdG9yKGZ1bmN0aW9uKGQpIHsKICAgIHJldHVybiBkOwogIH0pOwogIGQzLmJpc2VjdExlZnQgPSBkM19iaXNlY3Rvci5sZWZ0OwogIGQzLmJpc2VjdCA9IGQzLmJpc2VjdFJpZ2h0ID0gZDNfYmlzZWN0b3IucmlnaHQ7CiAgZDMuc2h1ZmZsZSA9IGZ1bmN0aW9uKGFycmF5KSB7CiAgICB2YXIgbSA9IGFycmF5Lmxlbmd0aCwgdCwgaTsKICAgIHdoaWxlIChtKSB7CiAgICAgIGkgPSBNYXRoLnJhbmRvbSgpICogbS0tIHwgMDsKICAgICAgdCA9IGFycmF5W21dLCBhcnJheVttXSA9IGFycmF5W2ldLCBhcnJheVtpXSA9IHQ7CiAgICB9CiAgICByZXR1cm4gYXJyYXk7CiAgfTsKICBkMy5wZXJtdXRlID0gZnVuY3Rpb24oYXJyYXksIGluZGV4ZXMpIHsKICAgIHZhciBwZXJtdXRlcyA9IFtdLCBpID0gLTEsIG4gPSBpbmRleGVzLmxlbmd0aDsKICAgIHdoaWxlICgrK2kgPCBuKSBwZXJtdXRlc1tpXSA9IGFycmF5W2luZGV4ZXNbaV1dOwogICAgcmV0dXJuIHBlcm11dGVzOwogIH07CiAgZDMuemlwID0gZnVuY3Rpb24oKSB7CiAgICBpZiAoIShuID0gYXJndW1lbnRzLmxlbmd0aCkpIHJldHVybiBbXTsKICAgIGZvciAodmFyIGkgPSAtMSwgbSA9IGQzLm1pbihhcmd1bWVudHMsIGQzX3ppcExlbmd0aCksIHppcHMgPSBuZXcgQXJyYXkobSk7ICsraSA8IG07ICkgewogICAgICBmb3IgKHZhciBqID0gLTEsIG4sIHppcCA9IHppcHNbaV0gPSBuZXcgQXJyYXkobik7ICsraiA8IG47ICkgewogICAgICAgIHppcFtqXSA9IGFyZ3VtZW50c1tqXVtpXTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHppcHM7CiAgfTsKICBmdW5jdGlvbiBkM196aXBMZW5ndGgoZCkgewogICAgcmV0dXJuIGQubGVuZ3RoOwogIH0KICBkMy50cmFuc3Bvc2UgPSBmdW5jdGlvbihtYXRyaXgpIHsKICAgIHJldHVybiBkMy56aXAuYXBwbHkoZDMsIG1hdHJpeCk7CiAgfTsKICBkMy5rZXlzID0gZnVuY3Rpb24obWFwKSB7CiAgICB2YXIga2V5cyA9IFtdOwogICAgZm9yICh2YXIga2V5IGluIG1hcCkga2V5cy5wdXNoKGtleSk7CiAgICByZXR1cm4ga2V5czsKICB9OwogIGQzLnZhbHVlcyA9IGZ1bmN0aW9uKG1hcCkgewogICAgdmFyIHZhbHVlcyA9IFtdOwogICAgZm9yICh2YXIga2V5IGluIG1hcCkgdmFsdWVzLnB1c2gobWFwW2tleV0pOwogICAgcmV0dXJuIHZhbHVlczsKICB9OwogIGQzLmVudHJpZXMgPSBmdW5jdGlvbihtYXApIHsKICAgIHZhciBlbnRyaWVzID0gW107CiAgICBmb3IgKHZhciBrZXkgaW4gbWFwKSBlbnRyaWVzLnB1c2goewogICAgICBrZXk6IGtleSwKICAgICAgdmFsdWU6IG1hcFtrZXldCiAgICB9KTsKICAgIHJldHVybiBlbnRyaWVzOwogIH07CiAgZDMubWVyZ2UgPSBmdW5jdGlvbihhcnJheXMpIHsKICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLCBhcnJheXMpOwogIH07CiAgZDMucmFuZ2UgPSBmdW5jdGlvbihzdGFydCwgc3RvcCwgc3RlcCkgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSB7CiAgICAgIHN0ZXAgPSAxOwogICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHsKICAgICAgICBzdG9wID0gc3RhcnQ7CiAgICAgICAgc3RhcnQgPSAwOwogICAgICB9CiAgICB9CiAgICBpZiAoKHN0b3AgLSBzdGFydCkgLyBzdGVwID09PSBJbmZpbml0eSkgdGhyb3cgbmV3IEVycm9yKCJpbmZpbml0ZSByYW5nZSIpOwogICAgdmFyIHJhbmdlID0gW10sIGsgPSBkM19yYW5nZV9pbnRlZ2VyU2NhbGUoTWF0aC5hYnMoc3RlcCkpLCBpID0gLTEsIGo7CiAgICBzdGFydCAqPSBrLCBzdG9wICo9IGssIHN0ZXAgKj0gazsKICAgIGlmIChzdGVwIDwgMCkgd2hpbGUgKChqID0gc3RhcnQgKyBzdGVwICogKytpKSA+IHN0b3ApIHJhbmdlLnB1c2goaiAvIGspOyBlbHNlIHdoaWxlICgoaiA9IHN0YXJ0ICsgc3RlcCAqICsraSkgPCBzdG9wKSByYW5nZS5wdXNoKGogLyBrKTsKICAgIHJldHVybiByYW5nZTsKICB9OwogIGZ1bmN0aW9uIGQzX3JhbmdlX2ludGVnZXJTY2FsZSh4KSB7CiAgICB2YXIgayA9IDE7CiAgICB3aGlsZSAoeCAqIGsgJSAxKSBrICo9IDEwOwogICAgcmV0dXJuIGs7CiAgfQogIGZ1bmN0aW9uIGQzX2NsYXNzKGN0b3IsIHByb3BlcnRpZXMpIHsKICAgIHRyeSB7CiAgICAgIGZvciAodmFyIGtleSBpbiBwcm9wZXJ0aWVzKSB7CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN0b3IucHJvdG90eXBlLCBrZXksIHsKICAgICAgICAgIHZhbHVlOiBwcm9wZXJ0aWVzW2tleV0sCiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZQogICAgICAgIH0pOwogICAgICB9CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIGN0b3IucHJvdG90eXBlID0gcHJvcGVydGllczsKICAgIH0KICB9CiAgZDMubWFwID0gZnVuY3Rpb24ob2JqZWN0KSB7CiAgICB2YXIgbWFwID0gbmV3IGQzX01hcCgpOwogICAgZm9yICh2YXIga2V5IGluIG9iamVjdCkgbWFwLnNldChrZXksIG9iamVjdFtrZXldKTsKICAgIHJldHVybiBtYXA7CiAgfTsKICBmdW5jdGlvbiBkM19NYXAoKSB7fQogIGQzX2NsYXNzKGQzX01hcCwgewogICAgaGFzOiBmdW5jdGlvbihrZXkpIHsKICAgICAgcmV0dXJuIGQzX21hcF9wcmVmaXggKyBrZXkgaW4gdGhpczsKICAgIH0sCiAgICBnZXQ6IGZ1bmN0aW9uKGtleSkgewogICAgICByZXR1cm4gdGhpc1tkM19tYXBfcHJlZml4ICsga2V5XTsKICAgIH0sCiAgICBzZXQ6IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKICAgICAgcmV0dXJuIHRoaXNbZDNfbWFwX3ByZWZpeCArIGtleV0gPSB2YWx1ZTsKICAgIH0sCiAgICByZW1vdmU6IGZ1bmN0aW9uKGtleSkgewogICAgICBrZXkgPSBkM19tYXBfcHJlZml4ICsga2V5OwogICAgICByZXR1cm4ga2V5IGluIHRoaXMgJiYgZGVsZXRlIHRoaXNba2V5XTsKICAgIH0sCiAgICBrZXlzOiBmdW5jdGlvbigpIHsKICAgICAgdmFyIGtleXMgPSBbXTsKICAgICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKGtleSkgewogICAgICAgIGtleXMucHVzaChrZXkpOwogICAgICB9KTsKICAgICAgcmV0dXJuIGtleXM7CiAgICB9LAogICAgdmFsdWVzOiBmdW5jdGlvbigpIHsKICAgICAgdmFyIHZhbHVlcyA9IFtdOwogICAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24oa2V5LCB2YWx1ZSkgewogICAgICAgIHZhbHVlcy5wdXNoKHZhbHVlKTsKICAgICAgfSk7CiAgICAgIHJldHVybiB2YWx1ZXM7CiAgICB9LAogICAgZW50cmllczogZnVuY3Rpb24oKSB7CiAgICAgIHZhciBlbnRyaWVzID0gW107CiAgICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbihrZXksIHZhbHVlKSB7CiAgICAgICAgZW50cmllcy5wdXNoKHsKICAgICAgICAgIGtleToga2V5LAogICAgICAgICAgdmFsdWU6IHZhbHVlCiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgICByZXR1cm4gZW50cmllczsKICAgIH0sCiAgICBmb3JFYWNoOiBmdW5jdGlvbihmKSB7CiAgICAgIGZvciAodmFyIGtleSBpbiB0aGlzKSB7CiAgICAgICAgaWYgKGtleS5jaGFyQ29kZUF0KDApID09PSBkM19tYXBfcHJlZml4Q29kZSkgewogICAgICAgICAgZi5jYWxsKHRoaXMsIGtleS5zdWJzdHJpbmcoMSksIHRoaXNba2V5XSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfSk7CiAgdmFyIGQzX21hcF9wcmVmaXggPSAiXDAiLCBkM19tYXBfcHJlZml4Q29kZSA9IGQzX21hcF9wcmVmaXguY2hhckNvZGVBdCgwKTsKICBkMy5uZXN0ID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgbmVzdCA9IHt9LCBrZXlzID0gW10sIHNvcnRLZXlzID0gW10sIHNvcnRWYWx1ZXMsIHJvbGx1cDsKICAgIGZ1bmN0aW9uIG1hcChtYXBUeXBlLCBhcnJheSwgZGVwdGgpIHsKICAgICAgaWYgKGRlcHRoID49IGtleXMubGVuZ3RoKSByZXR1cm4gcm9sbHVwID8gcm9sbHVwLmNhbGwobmVzdCwgYXJyYXkpIDogc29ydFZhbHVlcyA/IGFycmF5LnNvcnQoc29ydFZhbHVlcykgOiBhcnJheTsKICAgICAgdmFyIGkgPSAtMSwgbiA9IGFycmF5Lmxlbmd0aCwga2V5ID0ga2V5c1tkZXB0aCsrXSwga2V5VmFsdWUsIG9iamVjdCwgc2V0dGVyLCB2YWx1ZXNCeUtleSA9IG5ldyBkM19NYXAoKSwgdmFsdWVzOwogICAgICB3aGlsZSAoKytpIDwgbikgewogICAgICAgIGlmICh2YWx1ZXMgPSB2YWx1ZXNCeUtleS5nZXQoa2V5VmFsdWUgPSBrZXkob2JqZWN0ID0gYXJyYXlbaV0pKSkgewogICAgICAgICAgdmFsdWVzLnB1c2gob2JqZWN0KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFsdWVzQnlLZXkuc2V0KGtleVZhbHVlLCBbIG9iamVjdCBdKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKG1hcFR5cGUpIHsKICAgICAgICBvYmplY3QgPSBtYXBUeXBlKCk7CiAgICAgICAgc2V0dGVyID0gZnVuY3Rpb24oa2V5VmFsdWUsIHZhbHVlcykgewogICAgICAgICAgb2JqZWN0LnNldChrZXlWYWx1ZSwgbWFwKG1hcFR5cGUsIHZhbHVlcywgZGVwdGgpKTsKICAgICAgICB9OwogICAgICB9IGVsc2UgewogICAgICAgIG9iamVjdCA9IHt9OwogICAgICAgIHNldHRlciA9IGZ1bmN0aW9uKGtleVZhbHVlLCB2YWx1ZXMpIHsKICAgICAgICAgIG9iamVjdFtrZXlWYWx1ZV0gPSBtYXAobWFwVHlwZSwgdmFsdWVzLCBkZXB0aCk7CiAgICAgICAgfTsKICAgICAgfQogICAgICB2YWx1ZXNCeUtleS5mb3JFYWNoKHNldHRlcik7CiAgICAgIHJldHVybiBvYmplY3Q7CiAgICB9CiAgICBmdW5jdGlvbiBlbnRyaWVzKG1hcCwgZGVwdGgpIHsKICAgICAgaWYgKGRlcHRoID49IGtleXMubGVuZ3RoKSByZXR1cm4gbWFwOwogICAgICB2YXIgYXJyYXkgPSBbXSwgc29ydEtleSA9IHNvcnRLZXlzW2RlcHRoKytdOwogICAgICBtYXAuZm9yRWFjaChmdW5jdGlvbihrZXksIGtleU1hcCkgewogICAgICAgIGFycmF5LnB1c2goewogICAgICAgICAga2V5OiBrZXksCiAgICAgICAgICB2YWx1ZXM6IGVudHJpZXMoa2V5TWFwLCBkZXB0aCkKICAgICAgICB9KTsKICAgICAgfSk7CiAgICAgIHJldHVybiBzb3J0S2V5ID8gYXJyYXkuc29ydChmdW5jdGlvbihhLCBiKSB7CiAgICAgICAgcmV0dXJuIHNvcnRLZXkoYS5rZXksIGIua2V5KTsKICAgICAgfSkgOiBhcnJheTsKICAgIH0KICAgIG5lc3QubWFwID0gZnVuY3Rpb24oYXJyYXksIG1hcFR5cGUpIHsKICAgICAgcmV0dXJuIG1hcChtYXBUeXBlLCBhcnJheSwgMCk7CiAgICB9OwogICAgbmVzdC5lbnRyaWVzID0gZnVuY3Rpb24oYXJyYXkpIHsKICAgICAgcmV0dXJuIGVudHJpZXMobWFwKGQzLm1hcCwgYXJyYXksIDApLCAwKTsKICAgIH07CiAgICBuZXN0LmtleSA9IGZ1bmN0aW9uKGQpIHsKICAgICAga2V5cy5wdXNoKGQpOwogICAgICByZXR1cm4gbmVzdDsKICAgIH07CiAgICBuZXN0LnNvcnRLZXlzID0gZnVuY3Rpb24ob3JkZXIpIHsKICAgICAgc29ydEtleXNba2V5cy5sZW5ndGggLSAxXSA9IG9yZGVyOwogICAgICByZXR1cm4gbmVzdDsKICAgIH07CiAgICBuZXN0LnNvcnRWYWx1ZXMgPSBmdW5jdGlvbihvcmRlcikgewogICAgICBzb3J0VmFsdWVzID0gb3JkZXI7CiAgICAgIHJldHVybiBuZXN0OwogICAgfTsKICAgIG5lc3Qucm9sbHVwID0gZnVuY3Rpb24oZikgewogICAgICByb2xsdXAgPSBmOwogICAgICByZXR1cm4gbmVzdDsKICAgIH07CiAgICByZXR1cm4gbmVzdDsKICB9OwogIGQzLnNldCA9IGZ1bmN0aW9uKGFycmF5KSB7CiAgICB2YXIgc2V0ID0gbmV3IGQzX1NldCgpOwogICAgaWYgKGFycmF5KSBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSBzZXQuYWRkKGFycmF5W2ldKTsKICAgIHJldHVybiBzZXQ7CiAgfTsKICBmdW5jdGlvbiBkM19TZXQoKSB7fQogIGQzX2NsYXNzKGQzX1NldCwgewogICAgaGFzOiBmdW5jdGlvbih2YWx1ZSkgewogICAgICByZXR1cm4gZDNfbWFwX3ByZWZpeCArIHZhbHVlIGluIHRoaXM7CiAgICB9LAogICAgYWRkOiBmdW5jdGlvbih2YWx1ZSkgewogICAgICB0aGlzW2QzX21hcF9wcmVmaXggKyB2YWx1ZV0gPSB0cnVlOwogICAgICByZXR1cm4gdmFsdWU7CiAgICB9LAogICAgcmVtb3ZlOiBmdW5jdGlvbih2YWx1ZSkgewogICAgICB2YWx1ZSA9IGQzX21hcF9wcmVmaXggKyB2YWx1ZTsKICAgICAgcmV0dXJuIHZhbHVlIGluIHRoaXMgJiYgZGVsZXRlIHRoaXNbdmFsdWVdOwogICAgfSwKICAgIHZhbHVlczogZnVuY3Rpb24oKSB7CiAgICAgIHZhciB2YWx1ZXMgPSBbXTsKICAgICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgdmFsdWVzLnB1c2godmFsdWUpOwogICAgICB9KTsKICAgICAgcmV0dXJuIHZhbHVlczsKICAgIH0sCiAgICBmb3JFYWNoOiBmdW5jdGlvbihmKSB7CiAgICAgIGZvciAodmFyIHZhbHVlIGluIHRoaXMpIHsKICAgICAgICBpZiAodmFsdWUuY2hhckNvZGVBdCgwKSA9PT0gZDNfbWFwX3ByZWZpeENvZGUpIHsKICAgICAgICAgIGYuY2FsbCh0aGlzLCB2YWx1ZS5zdWJzdHJpbmcoMSkpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0pOwogIGQzLmJlaGF2aW9yID0ge307CiAgZDMucmViaW5kID0gZnVuY3Rpb24odGFyZ2V0LCBzb3VyY2UpIHsKICAgIHZhciBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGgsIG1ldGhvZDsKICAgIHdoaWxlICgrK2kgPCBuKSB0YXJnZXRbbWV0aG9kID0gYXJndW1lbnRzW2ldXSA9IGQzX3JlYmluZCh0YXJnZXQsIHNvdXJjZSwgc291cmNlW21ldGhvZF0pOwogICAgcmV0dXJuIHRhcmdldDsKICB9OwogIGZ1bmN0aW9uIGQzX3JlYmluZCh0YXJnZXQsIHNvdXJjZSwgbWV0aG9kKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgIHZhciB2YWx1ZSA9IG1ldGhvZC5hcHBseShzb3VyY2UsIGFyZ3VtZW50cyk7CiAgICAgIHJldHVybiB2YWx1ZSA9PT0gc291cmNlID8gdGFyZ2V0IDogdmFsdWU7CiAgICB9OwogIH0KICBkMy5kaXNwYXRjaCA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGRpc3BhdGNoID0gbmV3IGQzX2Rpc3BhdGNoKCksIGkgPSAtMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7CiAgICB3aGlsZSAoKytpIDwgbikgZGlzcGF0Y2hbYXJndW1lbnRzW2ldXSA9IGQzX2Rpc3BhdGNoX2V2ZW50KGRpc3BhdGNoKTsKICAgIHJldHVybiBkaXNwYXRjaDsKICB9OwogIGZ1bmN0aW9uIGQzX2Rpc3BhdGNoKCkge30KICBkM19kaXNwYXRjaC5wcm90b3R5cGUub24gPSBmdW5jdGlvbih0eXBlLCBsaXN0ZW5lcikgewogICAgdmFyIGkgPSB0eXBlLmluZGV4T2YoIi4iKSwgbmFtZSA9ICIiOwogICAgaWYgKGkgPj0gMCkgewogICAgICBuYW1lID0gdHlwZS5zdWJzdHJpbmcoaSArIDEpOwogICAgICB0eXBlID0gdHlwZS5zdWJzdHJpbmcoMCwgaSk7CiAgICB9CiAgICBpZiAodHlwZSkgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPCAyID8gdGhpc1t0eXBlXS5vbihuYW1lKSA6IHRoaXNbdHlwZV0ub24obmFtZSwgbGlzdGVuZXIpOwogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHsKICAgICAgaWYgKGxpc3RlbmVyID09IG51bGwpIGZvciAodHlwZSBpbiB0aGlzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkodHlwZSkpIHRoaXNbdHlwZV0ub24obmFtZSwgbnVsbCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgfTsKICBmdW5jdGlvbiBkM19kaXNwYXRjaF9ldmVudChkaXNwYXRjaCkgewogICAgdmFyIGxpc3RlbmVycyA9IFtdLCBsaXN0ZW5lckJ5TmFtZSA9IG5ldyBkM19NYXAoKTsKICAgIGZ1bmN0aW9uIGV2ZW50KCkgewogICAgICB2YXIgeiA9IGxpc3RlbmVycywgaSA9IC0xLCBuID0gei5sZW5ndGgsIGw7CiAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAobCA9IHpbaV0ub24pIGwuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgcmV0dXJuIGRpc3BhdGNoOwogICAgfQogICAgZXZlbnQub24gPSBmdW5jdGlvbihuYW1lLCBsaXN0ZW5lcikgewogICAgICB2YXIgbCA9IGxpc3RlbmVyQnlOYW1lLmdldChuYW1lKSwgaTsKICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSByZXR1cm4gbCAmJiBsLm9uOwogICAgICBpZiAobCkgewogICAgICAgIGwub24gPSBudWxsOwogICAgICAgIGxpc3RlbmVycyA9IGxpc3RlbmVycy5zbGljZSgwLCBpID0gbGlzdGVuZXJzLmluZGV4T2YobCkpLmNvbmNhdChsaXN0ZW5lcnMuc2xpY2UoaSArIDEpKTsKICAgICAgICBsaXN0ZW5lckJ5TmFtZS5yZW1vdmUobmFtZSk7CiAgICAgIH0KICAgICAgaWYgKGxpc3RlbmVyKSBsaXN0ZW5lcnMucHVzaChsaXN0ZW5lckJ5TmFtZS5zZXQobmFtZSwgewogICAgICAgIG9uOiBsaXN0ZW5lcgogICAgICB9KSk7CiAgICAgIHJldHVybiBkaXNwYXRjaDsKICAgIH07CiAgICByZXR1cm4gZXZlbnQ7CiAgfQogIGQzLmV2ZW50ID0gbnVsbDsKICBmdW5jdGlvbiBkM19ldmVudENhbmNlbCgpIHsKICAgIGQzLmV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwogICAgZDMuZXZlbnQucHJldmVudERlZmF1bHQoKTsKICB9CiAgZnVuY3Rpb24gZDNfZXZlbnRTb3VyY2UoKSB7CiAgICB2YXIgZSA9IGQzLmV2ZW50LCBzOwogICAgd2hpbGUgKHMgPSBlLnNvdXJjZUV2ZW50KSBlID0gczsKICAgIHJldHVybiBlOwogIH0KICBmdW5jdGlvbiBkM19ldmVudFN1cHByZXNzKHRhcmdldCwgdHlwZSkgewogICAgZnVuY3Rpb24gb2ZmKCkgewogICAgICB0YXJnZXQub24odHlwZSwgbnVsbCk7CiAgICB9CiAgICB0YXJnZXQub24odHlwZSwgZnVuY3Rpb24oKSB7CiAgICAgIGQzX2V2ZW50Q2FuY2VsKCk7CiAgICAgIG9mZigpOwogICAgfSwgdHJ1ZSk7CiAgICBzZXRUaW1lb3V0KG9mZiwgMCk7CiAgfQogIGZ1bmN0aW9uIGQzX2V2ZW50RGlzcGF0Y2godGFyZ2V0KSB7CiAgICB2YXIgZGlzcGF0Y2ggPSBuZXcgZDNfZGlzcGF0Y2goKSwgaSA9IDAsIG4gPSBhcmd1bWVudHMubGVuZ3RoOwogICAgd2hpbGUgKCsraSA8IG4pIGRpc3BhdGNoW2FyZ3VtZW50c1tpXV0gPSBkM19kaXNwYXRjaF9ldmVudChkaXNwYXRjaCk7CiAgICBkaXNwYXRjaC5vZiA9IGZ1bmN0aW9uKHRoaXosIGFyZ3VtZW50eikgewogICAgICByZXR1cm4gZnVuY3Rpb24oZTEpIHsKICAgICAgICB0cnkgewogICAgICAgICAgdmFyIGUwID0gZTEuc291cmNlRXZlbnQgPSBkMy5ldmVudDsKICAgICAgICAgIGUxLnRhcmdldCA9IHRhcmdldDsKICAgICAgICAgIGQzLmV2ZW50ID0gZTE7CiAgICAgICAgICBkaXNwYXRjaFtlMS50eXBlXS5hcHBseSh0aGl6LCBhcmd1bWVudHopOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICBkMy5ldmVudCA9IGUwOwogICAgICAgIH0KICAgICAgfTsKICAgIH07CiAgICByZXR1cm4gZGlzcGF0Y2g7CiAgfQogIGQzLm1vdXNlID0gZnVuY3Rpb24oY29udGFpbmVyKSB7CiAgICByZXR1cm4gZDNfbW91c2VQb2ludChjb250YWluZXIsIGQzX2V2ZW50U291cmNlKCkpOwogIH07CiAgdmFyIGQzX21vdXNlX2J1ZzQ0MDgzID0gL1dlYktpdC8udGVzdChkM193aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCkgPyAtMSA6IDA7CiAgZnVuY3Rpb24gZDNfbW91c2VQb2ludChjb250YWluZXIsIGUpIHsKICAgIHZhciBzdmcgPSBjb250YWluZXIub3duZXJTVkdFbGVtZW50IHx8IGNvbnRhaW5lcjsKICAgIGlmIChzdmcuY3JlYXRlU1ZHUG9pbnQpIHsKICAgICAgdmFyIHBvaW50ID0gc3ZnLmNyZWF0ZVNWR1BvaW50KCk7CiAgICAgIGlmIChkM19tb3VzZV9idWc0NDA4MyA8IDAgJiYgKGQzX3dpbmRvdy5zY3JvbGxYIHx8IGQzX3dpbmRvdy5zY3JvbGxZKSkgewogICAgICAgIHN2ZyA9IGQzLnNlbGVjdChkM19kb2N1bWVudC5ib2R5KS5hcHBlbmQoInN2ZyIpLnN0eWxlKCJwb3NpdGlvbiIsICJhYnNvbHV0ZSIpLnN0eWxlKCJ0b3AiLCAwKS5zdHlsZSgibGVmdCIsIDApOwogICAgICAgIHZhciBjdG0gPSBzdmdbMF1bMF0uZ2V0U2NyZWVuQ1RNKCk7CiAgICAgICAgZDNfbW91c2VfYnVnNDQwODMgPSAhKGN0bS5mIHx8IGN0bS5lKTsKICAgICAgICBzdmcucmVtb3ZlKCk7CiAgICAgIH0KICAgICAgaWYgKGQzX21vdXNlX2J1ZzQ0MDgzKSB7CiAgICAgICAgcG9pbnQueCA9IGUucGFnZVg7CiAgICAgICAgcG9pbnQueSA9IGUucGFnZVk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcG9pbnQueCA9IGUuY2xpZW50WDsKICAgICAgICBwb2ludC55ID0gZS5jbGllbnRZOwogICAgICB9CiAgICAgIHBvaW50ID0gcG9pbnQubWF0cml4VHJhbnNmb3JtKGNvbnRhaW5lci5nZXRTY3JlZW5DVE0oKS5pbnZlcnNlKCkpOwogICAgICByZXR1cm4gWyBwb2ludC54LCBwb2ludC55IF07CiAgICB9CiAgICB2YXIgcmVjdCA9IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgIHJldHVybiBbIGUuY2xpZW50WCAtIHJlY3QubGVmdCAtIGNvbnRhaW5lci5jbGllbnRMZWZ0LCBlLmNsaWVudFkgLSByZWN0LnRvcCAtIGNvbnRhaW5lci5jbGllbnRUb3AgXTsKICB9CiAgdmFyIGQzX2FycmF5ID0gZDNfYXJyYXlTbGljZTsKICBmdW5jdGlvbiBkM19hcnJheUNvcHkocHNldWRvYXJyYXkpIHsKICAgIHZhciBpID0gLTEsIG4gPSBwc2V1ZG9hcnJheS5sZW5ndGgsIGFycmF5ID0gW107CiAgICB3aGlsZSAoKytpIDwgbikgYXJyYXkucHVzaChwc2V1ZG9hcnJheVtpXSk7CiAgICByZXR1cm4gYXJyYXk7CiAgfQogIGZ1bmN0aW9uIGQzX2FycmF5U2xpY2UocHNldWRvYXJyYXkpIHsKICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChwc2V1ZG9hcnJheSk7CiAgfQogIHRyeSB7CiAgICBkM19hcnJheShkM19kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2hpbGROb2RlcylbMF0ubm9kZVR5cGU7CiAgfSBjYXRjaCAoZSkgewogICAgZDNfYXJyYXkgPSBkM19hcnJheUNvcHk7CiAgfQogIHZhciBkM19hcnJheVN1YmNsYXNzID0gW10uX19wcm90b19fID8gZnVuY3Rpb24oYXJyYXksIHByb3RvdHlwZSkgewogICAgYXJyYXkuX19wcm90b19fID0gcHJvdG90eXBlOwogIH0gOiBmdW5jdGlvbihhcnJheSwgcHJvdG90eXBlKSB7CiAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBwcm90b3R5cGUpIGFycmF5W3Byb3BlcnR5XSA9IHByb3RvdHlwZVtwcm9wZXJ0eV07CiAgfTsKICBkMy50b3VjaGVzID0gZnVuY3Rpb24oY29udGFpbmVyLCB0b3VjaGVzKSB7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHRvdWNoZXMgPSBkM19ldmVudFNvdXJjZSgpLnRvdWNoZXM7CiAgICByZXR1cm4gdG91Y2hlcyA/IGQzX2FycmF5KHRvdWNoZXMpLm1hcChmdW5jdGlvbih0b3VjaCkgewogICAgICB2YXIgcG9pbnQgPSBkM19tb3VzZVBvaW50KGNvbnRhaW5lciwgdG91Y2gpOwogICAgICBwb2ludC5pZGVudGlmaWVyID0gdG91Y2guaWRlbnRpZmllcjsKICAgICAgcmV0dXJuIHBvaW50OwogICAgfSkgOiBbXTsKICB9OwogIGQzLmJlaGF2aW9yLmRyYWcgPSBmdW5jdGlvbigpIHsKICAgIHZhciBldmVudCA9IGQzX2V2ZW50RGlzcGF0Y2goZHJhZywgImRyYWciLCAiZHJhZ3N0YXJ0IiwgImRyYWdlbmQiKSwgb3JpZ2luID0gbnVsbDsKICAgIGZ1bmN0aW9uIGRyYWcoKSB7CiAgICAgIHRoaXMub24oIm1vdXNlZG93bi5kcmFnIiwgbW91c2Vkb3duKS5vbigidG91Y2hzdGFydC5kcmFnIiwgbW91c2Vkb3duKTsKICAgIH0KICAgIGZ1bmN0aW9uIG1vdXNlZG93bigpIHsKICAgICAgdmFyIHRhcmdldCA9IHRoaXMsIGV2ZW50XyA9IGV2ZW50Lm9mKHRhcmdldCwgYXJndW1lbnRzKSwgZXZlbnRUYXJnZXQgPSBkMy5ldmVudC50YXJnZXQsIHRvdWNoSWQgPSBkMy5ldmVudC50b3VjaGVzID8gZDMuZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uaWRlbnRpZmllciA6IG51bGwsIG9mZnNldCwgb3JpZ2luXyA9IHBvaW50KCksIG1vdmVkID0gMDsKICAgICAgdmFyIHcgPSBkMy5zZWxlY3QoZDNfd2luZG93KS5vbih0b3VjaElkICE9IG51bGwgPyAidG91Y2htb3ZlLmRyYWctIiArIHRvdWNoSWQgOiAibW91c2Vtb3ZlLmRyYWciLCBkcmFnbW92ZSkub24odG91Y2hJZCAhPSBudWxsID8gInRvdWNoZW5kLmRyYWctIiArIHRvdWNoSWQgOiAibW91c2V1cC5kcmFnIiwgZHJhZ2VuZCwgdHJ1ZSk7CiAgICAgIGlmIChvcmlnaW4pIHsKICAgICAgICBvZmZzZXQgPSBvcmlnaW4uYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpOwogICAgICAgIG9mZnNldCA9IFsgb2Zmc2V0LnggLSBvcmlnaW5fWzBdLCBvZmZzZXQueSAtIG9yaWdpbl9bMV0gXTsKICAgICAgfSBlbHNlIHsKICAgICAgICBvZmZzZXQgPSBbIDAsIDAgXTsKICAgICAgfQogICAgICBpZiAodG91Y2hJZCA9PSBudWxsKSBkM19ldmVudENhbmNlbCgpOwogICAgICBldmVudF8oewogICAgICAgIHR5cGU6ICJkcmFnc3RhcnQiCiAgICAgIH0pOwogICAgICBmdW5jdGlvbiBwb2ludCgpIHsKICAgICAgICB2YXIgcCA9IHRhcmdldC5wYXJlbnROb2RlOwogICAgICAgIHJldHVybiB0b3VjaElkICE9IG51bGwgPyBkMy50b3VjaGVzKHApLmZpbHRlcihmdW5jdGlvbihwKSB7CiAgICAgICAgICByZXR1cm4gcC5pZGVudGlmaWVyID09PSB0b3VjaElkOwogICAgICAgIH0pWzBdIDogZDMubW91c2UocCk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gZHJhZ21vdmUoKSB7CiAgICAgICAgaWYgKCF0YXJnZXQucGFyZW50Tm9kZSkgcmV0dXJuIGRyYWdlbmQoKTsKICAgICAgICB2YXIgcCA9IHBvaW50KCksIGR4ID0gcFswXSAtIG9yaWdpbl9bMF0sIGR5ID0gcFsxXSAtIG9yaWdpbl9bMV07CiAgICAgICAgbW92ZWQgfD0gZHggfCBkeTsKICAgICAgICBvcmlnaW5fID0gcDsKICAgICAgICBkM19ldmVudENhbmNlbCgpOwogICAgICAgIGV2ZW50Xyh7CiAgICAgICAgICB0eXBlOiAiZHJhZyIsCiAgICAgICAgICB4OiBwWzBdICsgb2Zmc2V0WzBdLAogICAgICAgICAgeTogcFsxXSArIG9mZnNldFsxXSwKICAgICAgICAgIGR4OiBkeCwKICAgICAgICAgIGR5OiBkeQogICAgICAgIH0pOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGRyYWdlbmQoKSB7CiAgICAgICAgZXZlbnRfKHsKICAgICAgICAgIHR5cGU6ICJkcmFnZW5kIgogICAgICAgIH0pOwogICAgICAgIGlmIChtb3ZlZCkgewogICAgICAgICAgZDNfZXZlbnRDYW5jZWwoKTsKICAgICAgICAgIGlmIChkMy5ldmVudC50YXJnZXQgPT09IGV2ZW50VGFyZ2V0KSBkM19ldmVudFN1cHByZXNzKHcsICJjbGljayIpOwogICAgICAgIH0KICAgICAgICB3Lm9uKHRvdWNoSWQgIT0gbnVsbCA/ICJ0b3VjaG1vdmUuZHJhZy0iICsgdG91Y2hJZCA6ICJtb3VzZW1vdmUuZHJhZyIsIG51bGwpLm9uKHRvdWNoSWQgIT0gbnVsbCA/ICJ0b3VjaGVuZC5kcmFnLSIgKyB0b3VjaElkIDogIm1vdXNldXAuZHJhZyIsIG51bGwpOwogICAgICB9CiAgICB9CiAgICBkcmFnLm9yaWdpbiA9IGZ1bmN0aW9uKHgpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gb3JpZ2luOwogICAgICBvcmlnaW4gPSB4OwogICAgICByZXR1cm4gZHJhZzsKICAgIH07CiAgICByZXR1cm4gZDMucmViaW5kKGRyYWcsIGV2ZW50LCAib24iKTsKICB9OwogIGZ1bmN0aW9uIGQzX3NlbGVjdGlvbihncm91cHMpIHsKICAgIGQzX2FycmF5U3ViY2xhc3MoZ3JvdXBzLCBkM19zZWxlY3Rpb25Qcm90b3R5cGUpOwogICAgcmV0dXJuIGdyb3VwczsKICB9CiAgdmFyIGQzX3NlbGVjdCA9IGZ1bmN0aW9uKHMsIG4pIHsKICAgIHJldHVybiBuLnF1ZXJ5U2VsZWN0b3Iocyk7CiAgfSwgZDNfc2VsZWN0QWxsID0gZnVuY3Rpb24ocywgbikgewogICAgcmV0dXJuIG4ucXVlcnlTZWxlY3RvckFsbChzKTsKICB9LCBkM19zZWxlY3RSb290ID0gZDNfZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCBkM19zZWxlY3RNYXRjaGVyID0gZDNfc2VsZWN0Um9vdC5tYXRjaGVzU2VsZWN0b3IgfHwgZDNfc2VsZWN0Um9vdC53ZWJraXRNYXRjaGVzU2VsZWN0b3IgfHwgZDNfc2VsZWN0Um9vdC5tb3pNYXRjaGVzU2VsZWN0b3IgfHwgZDNfc2VsZWN0Um9vdC5tc01hdGNoZXNTZWxlY3RvciB8fCBkM19zZWxlY3RSb290Lm9NYXRjaGVzU2VsZWN0b3IsIGQzX3NlbGVjdE1hdGNoZXMgPSBmdW5jdGlvbihuLCBzKSB7CiAgICByZXR1cm4gZDNfc2VsZWN0TWF0Y2hlci5jYWxsKG4sIHMpOwogIH07CiAgaWYgKHR5cGVvZiBTaXp6bGUgPT09ICJmdW5jdGlvbiIpIHsKICAgIGQzX3NlbGVjdCA9IGZ1bmN0aW9uKHMsIG4pIHsKICAgICAgcmV0dXJuIFNpenpsZShzLCBuKVswXSB8fCBudWxsOwogICAgfTsKICAgIGQzX3NlbGVjdEFsbCA9IGZ1bmN0aW9uKHMsIG4pIHsKICAgICAgcmV0dXJuIFNpenpsZS51bmlxdWVTb3J0KFNpenpsZShzLCBuKSk7CiAgICB9OwogICAgZDNfc2VsZWN0TWF0Y2hlcyA9IFNpenpsZS5tYXRjaGVzU2VsZWN0b3I7CiAgfQogIGQzLnNlbGVjdGlvbiA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGQzX3NlbGVjdGlvblJvb3Q7CiAgfTsKICB2YXIgZDNfc2VsZWN0aW9uUHJvdG90eXBlID0gZDMuc2VsZWN0aW9uLnByb3RvdHlwZSA9IFtdOwogIGQzX3NlbGVjdGlvblByb3RvdHlwZS5zZWxlY3QgPSBmdW5jdGlvbihzZWxlY3RvcikgewogICAgdmFyIHN1Ymdyb3VwcyA9IFtdLCBzdWJncm91cCwgc3Vibm9kZSwgZ3JvdXAsIG5vZGU7CiAgICBpZiAodHlwZW9mIHNlbGVjdG9yICE9PSAiZnVuY3Rpb24iKSBzZWxlY3RvciA9IGQzX3NlbGVjdGlvbl9zZWxlY3RvcihzZWxlY3Rvcik7CiAgICBmb3IgKHZhciBqID0gLTEsIG0gPSB0aGlzLmxlbmd0aDsgKytqIDwgbTsgKSB7CiAgICAgIHN1Ymdyb3Vwcy5wdXNoKHN1Ymdyb3VwID0gW10pOwogICAgICBzdWJncm91cC5wYXJlbnROb2RlID0gKGdyb3VwID0gdGhpc1tqXSkucGFyZW50Tm9kZTsKICAgICAgZm9yICh2YXIgaSA9IC0xLCBuID0gZ3JvdXAubGVuZ3RoOyArK2kgPCBuOyApIHsKICAgICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7CiAgICAgICAgICBzdWJncm91cC5wdXNoKHN1Ym5vZGUgPSBzZWxlY3Rvci5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGkpKTsKICAgICAgICAgIGlmIChzdWJub2RlICYmICJfX2RhdGFfXyIgaW4gbm9kZSkgc3Vibm9kZS5fX2RhdGFfXyA9IG5vZGUuX19kYXRhX187CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHN1Ymdyb3VwLnB1c2gobnVsbCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gZDNfc2VsZWN0aW9uKHN1Ymdyb3Vwcyk7CiAgfTsKICBmdW5jdGlvbiBkM19zZWxlY3Rpb25fc2VsZWN0b3Ioc2VsZWN0b3IpIHsKICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGQzX3NlbGVjdChzZWxlY3RvciwgdGhpcyk7CiAgICB9OwogIH0KICBkM19zZWxlY3Rpb25Qcm90b3R5cGUuc2VsZWN0QWxsID0gZnVuY3Rpb24oc2VsZWN0b3IpIHsKICAgIHZhciBzdWJncm91cHMgPSBbXSwgc3ViZ3JvdXAsIG5vZGU7CiAgICBpZiAodHlwZW9mIHNlbGVjdG9yICE9PSAiZnVuY3Rpb24iKSBzZWxlY3RvciA9IGQzX3NlbGVjdGlvbl9zZWxlY3RvckFsbChzZWxlY3Rvcik7CiAgICBmb3IgKHZhciBqID0gLTEsIG0gPSB0aGlzLmxlbmd0aDsgKytqIDwgbTsgKSB7CiAgICAgIGZvciAodmFyIGdyb3VwID0gdGhpc1tqXSwgaSA9IC0xLCBuID0gZ3JvdXAubGVuZ3RoOyArK2kgPCBuOyApIHsKICAgICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7CiAgICAgICAgICBzdWJncm91cHMucHVzaChzdWJncm91cCA9IGQzX2FycmF5KHNlbGVjdG9yLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSkpKTsKICAgICAgICAgIHN1Ymdyb3VwLnBhcmVudE5vZGUgPSBub2RlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIGQzX3NlbGVjdGlvbihzdWJncm91cHMpOwogIH07CiAgZnVuY3Rpb24gZDNfc2VsZWN0aW9uX3NlbGVjdG9yQWxsKHNlbGVjdG9yKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBkM19zZWxlY3RBbGwoc2VsZWN0b3IsIHRoaXMpOwogICAgfTsKICB9CiAgdmFyIGQzX25zUHJlZml4ID0gewogICAgc3ZnOiAiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLAogICAgeGh0bWw6ICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwKICAgIHhsaW5rOiAiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIsCiAgICB4bWw6ICJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiLAogICAgeG1sbnM6ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyIKICB9OwogIGQzLm5zID0gewogICAgcHJlZml4OiBkM19uc1ByZWZpeCwKICAgIHF1YWxpZnk6IGZ1bmN0aW9uKG5hbWUpIHsKICAgICAgdmFyIGkgPSBuYW1lLmluZGV4T2YoIjoiKSwgcHJlZml4ID0gbmFtZTsKICAgICAgaWYgKGkgPj0gMCkgewogICAgICAgIHByZWZpeCA9IG5hbWUuc3Vic3RyaW5nKDAsIGkpOwogICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZyhpICsgMSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGQzX25zUHJlZml4Lmhhc093blByb3BlcnR5KHByZWZpeCkgPyB7CiAgICAgICAgc3BhY2U6IGQzX25zUHJlZml4W3ByZWZpeF0sCiAgICAgICAgbG9jYWw6IG5hbWUKICAgICAgfSA6IG5hbWU7CiAgICB9CiAgfTsKICBkM19zZWxlY3Rpb25Qcm90b3R5cGUuYXR0ciA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHsKICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSAic3RyaW5nIikgewogICAgICAgIHZhciBub2RlID0gdGhpcy5ub2RlKCk7CiAgICAgICAgbmFtZSA9IGQzLm5zLnF1YWxpZnkobmFtZSk7CiAgICAgICAgcmV0dXJuIG5hbWUubG9jYWwgPyBub2RlLmdldEF0dHJpYnV0ZU5TKG5hbWUuc3BhY2UsIG5hbWUubG9jYWwpIDogbm9kZS5nZXRBdHRyaWJ1dGUobmFtZSk7CiAgICAgIH0KICAgICAgZm9yICh2YWx1ZSBpbiBuYW1lKSB0aGlzLmVhY2goZDNfc2VsZWN0aW9uX2F0dHIodmFsdWUsIG5hbWVbdmFsdWVdKSk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgcmV0dXJuIHRoaXMuZWFjaChkM19zZWxlY3Rpb25fYXR0cihuYW1lLCB2YWx1ZSkpOwogIH07CiAgZnVuY3Rpb24gZDNfc2VsZWN0aW9uX2F0dHIobmFtZSwgdmFsdWUpIHsKICAgIG5hbWUgPSBkMy5ucy5xdWFsaWZ5KG5hbWUpOwogICAgZnVuY3Rpb24gYXR0ck51bGwoKSB7CiAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwogICAgfQogICAgZnVuY3Rpb24gYXR0ck51bGxOUygpIHsKICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhuYW1lLnNwYWNlLCBuYW1lLmxvY2FsKTsKICAgIH0KICAgIGZ1bmN0aW9uIGF0dHJDb25zdGFudCgpIHsKICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpOwogICAgfQogICAgZnVuY3Rpb24gYXR0ckNvbnN0YW50TlMoKSB7CiAgICAgIHRoaXMuc2V0QXR0cmlidXRlTlMobmFtZS5zcGFjZSwgbmFtZS5sb2NhbCwgdmFsdWUpOwogICAgfQogICAgZnVuY3Rpb24gYXR0ckZ1bmN0aW9uKCkgewogICAgICB2YXIgeCA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgIGlmICh4ID09IG51bGwpIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpOyBlbHNlIHRoaXMuc2V0QXR0cmlidXRlKG5hbWUsIHgpOwogICAgfQogICAgZnVuY3Rpb24gYXR0ckZ1bmN0aW9uTlMoKSB7CiAgICAgIHZhciB4ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgaWYgKHggPT0gbnVsbCkgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhuYW1lLnNwYWNlLCBuYW1lLmxvY2FsKTsgZWxzZSB0aGlzLnNldEF0dHJpYnV0ZU5TKG5hbWUuc3BhY2UsIG5hbWUubG9jYWwsIHgpOwogICAgfQogICAgcmV0dXJuIHZhbHVlID09IG51bGwgPyBuYW1lLmxvY2FsID8gYXR0ck51bGxOUyA6IGF0dHJOdWxsIDogdHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iID8gbmFtZS5sb2NhbCA/IGF0dHJGdW5jdGlvbk5TIDogYXR0ckZ1bmN0aW9uIDogbmFtZS5sb2NhbCA/IGF0dHJDb25zdGFudE5TIDogYXR0ckNvbnN0YW50OwogIH0KICBmdW5jdGlvbiBkM19jb2xsYXBzZShzKSB7CiAgICByZXR1cm4gcy50cmltKCkucmVwbGFjZSgvXHMrL2csICIgIik7CiAgfQogIGQzLnJlcXVvdGUgPSBmdW5jdGlvbihzKSB7CiAgICByZXR1cm4gcy5yZXBsYWNlKGQzX3JlcXVvdGVfcmUsICJcXCQmIik7CiAgfTsKICB2YXIgZDNfcmVxdW90ZV9yZSA9IC9bXFxcXlwkXCpcK1w/XHxcW1xdXChcKVwuXHtcfV0vZzsKICBkM19zZWxlY3Rpb25Qcm90b3R5cGUuY2xhc3NlZCA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHsKICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSAic3RyaW5nIikgewogICAgICAgIHZhciBub2RlID0gdGhpcy5ub2RlKCksIG4gPSAobmFtZSA9IG5hbWUudHJpbSgpLnNwbGl0KC9efFxzKy9nKSkubGVuZ3RoLCBpID0gLTE7CiAgICAgICAgaWYgKHZhbHVlID0gbm9kZS5jbGFzc0xpc3QpIHsKICAgICAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoIXZhbHVlLmNvbnRhaW5zKG5hbWVbaV0pKSByZXR1cm4gZmFsc2U7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZhbHVlID0gbm9kZS5nZXRBdHRyaWJ1dGUoImNsYXNzIik7CiAgICAgICAgICB3aGlsZSAoKytpIDwgbikgaWYgKCFkM19zZWxlY3Rpb25fY2xhc3NlZFJlKG5hbWVbaV0pLnRlc3QodmFsdWUpKSByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIGZvciAodmFsdWUgaW4gbmFtZSkgdGhpcy5lYWNoKGQzX3NlbGVjdGlvbl9jbGFzc2VkKHZhbHVlLCBuYW1lW3ZhbHVlXSkpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHJldHVybiB0aGlzLmVhY2goZDNfc2VsZWN0aW9uX2NsYXNzZWQobmFtZSwgdmFsdWUpKTsKICB9OwogIGZ1bmN0aW9uIGQzX3NlbGVjdGlvbl9jbGFzc2VkUmUobmFtZSkgewogICAgcmV0dXJuIG5ldyBSZWdFeHAoIig/Ol58XFxzKykiICsgZDMucmVxdW90ZShuYW1lKSArICIoPzpcXHMrfCQpIiwgImciKTsKICB9CiAgZnVuY3Rpb24gZDNfc2VsZWN0aW9uX2NsYXNzZWQobmFtZSwgdmFsdWUpIHsKICAgIG5hbWUgPSBuYW1lLnRyaW0oKS5zcGxpdCgvXHMrLykubWFwKGQzX3NlbGVjdGlvbl9jbGFzc2VkTmFtZSk7CiAgICB2YXIgbiA9IG5hbWUubGVuZ3RoOwogICAgZnVuY3Rpb24gY2xhc3NlZENvbnN0YW50KCkgewogICAgICB2YXIgaSA9IC0xOwogICAgICB3aGlsZSAoKytpIDwgbikgbmFtZVtpXSh0aGlzLCB2YWx1ZSk7CiAgICB9CiAgICBmdW5jdGlvbiBjbGFzc2VkRnVuY3Rpb24oKSB7CiAgICAgIHZhciBpID0gLTEsIHggPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICB3aGlsZSAoKytpIDwgbikgbmFtZVtpXSh0aGlzLCB4KTsKICAgIH0KICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIgPyBjbGFzc2VkRnVuY3Rpb24gOiBjbGFzc2VkQ29uc3RhbnQ7CiAgfQogIGZ1bmN0aW9uIGQzX3NlbGVjdGlvbl9jbGFzc2VkTmFtZShuYW1lKSB7CiAgICB2YXIgcmUgPSBkM19zZWxlY3Rpb25fY2xhc3NlZFJlKG5hbWUpOwogICAgcmV0dXJuIGZ1bmN0aW9uKG5vZGUsIHZhbHVlKSB7CiAgICAgIGlmIChjID0gbm9kZS5jbGFzc0xpc3QpIHJldHVybiB2YWx1ZSA/IGMuYWRkKG5hbWUpIDogYy5yZW1vdmUobmFtZSk7CiAgICAgIHZhciBjID0gbm9kZS5nZXRBdHRyaWJ1dGUoImNsYXNzIikgfHwgIiI7CiAgICAgIGlmICh2YWx1ZSkgewogICAgICAgIHJlLmxhc3RJbmRleCA9IDA7CiAgICAgICAgaWYgKCFyZS50ZXN0KGMpKSBub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCBkM19jb2xsYXBzZShjICsgIiAiICsgbmFtZSkpOwogICAgICB9IGVsc2UgewogICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKCJjbGFzcyIsIGQzX2NvbGxhcHNlKGMucmVwbGFjZShyZSwgIiAiKSkpOwogICAgICB9CiAgICB9OwogIH0KICBkM19zZWxlY3Rpb25Qcm90b3R5cGUuc3R5bGUgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHsKICAgIHZhciBuID0gYXJndW1lbnRzLmxlbmd0aDsKICAgIGlmIChuIDwgMykgewogICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICJzdHJpbmciKSB7CiAgICAgICAgaWYgKG4gPCAyKSB2YWx1ZSA9ICIiOwogICAgICAgIGZvciAocHJpb3JpdHkgaW4gbmFtZSkgdGhpcy5lYWNoKGQzX3NlbGVjdGlvbl9zdHlsZShwcmlvcml0eSwgbmFtZVtwcmlvcml0eV0sIHZhbHVlKSk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0KICAgICAgaWYgKG4gPCAyKSByZXR1cm4gZDNfd2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5ub2RlKCksIG51bGwpLmdldFByb3BlcnR5VmFsdWUobmFtZSk7CiAgICAgIHByaW9yaXR5ID0gIiI7CiAgICB9CiAgICByZXR1cm4gdGhpcy5lYWNoKGQzX3NlbGVjdGlvbl9zdHlsZShuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpKTsKICB9OwogIGZ1bmN0aW9uIGQzX3NlbGVjdGlvbl9zdHlsZShuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHsKICAgIGZ1bmN0aW9uIHN0eWxlTnVsbCgpIHsKICAgICAgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTsKICAgIH0KICAgIGZ1bmN0aW9uIHN0eWxlQ29uc3RhbnQoKSB7CiAgICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgdmFsdWUsIHByaW9yaXR5KTsKICAgIH0KICAgIGZ1bmN0aW9uIHN0eWxlRnVuY3Rpb24oKSB7CiAgICAgIHZhciB4ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgaWYgKHggPT0gbnVsbCkgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTsgZWxzZSB0aGlzLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHgsIHByaW9yaXR5KTsKICAgIH0KICAgIHJldHVybiB2YWx1ZSA9PSBudWxsID8gc3R5bGVOdWxsIDogdHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iID8gc3R5bGVGdW5jdGlvbiA6IHN0eWxlQ29uc3RhbnQ7CiAgfQogIGQzX3NlbGVjdGlvblByb3RvdHlwZS5wcm9wZXJ0eSA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHsKICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSAic3RyaW5nIikgcmV0dXJuIHRoaXMubm9kZSgpW25hbWVdOwogICAgICBmb3IgKHZhbHVlIGluIG5hbWUpIHRoaXMuZWFjaChkM19zZWxlY3Rpb25fcHJvcGVydHkodmFsdWUsIG5hbWVbdmFsdWVdKSk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgcmV0dXJuIHRoaXMuZWFjaChkM19zZWxlY3Rpb25fcHJvcGVydHkobmFtZSwgdmFsdWUpKTsKICB9OwogIGZ1bmN0aW9uIGQzX3NlbGVjdGlvbl9wcm9wZXJ0eShuYW1lLCB2YWx1ZSkgewogICAgZnVuY3Rpb24gcHJvcGVydHlOdWxsKCkgewogICAgICBkZWxldGUgdGhpc1tuYW1lXTsKICAgIH0KICAgIGZ1bmN0aW9uIHByb3BlcnR5Q29uc3RhbnQoKSB7CiAgICAgIHRoaXNbbmFtZV0gPSB2YWx1ZTsKICAgIH0KICAgIGZ1bmN0aW9uIHByb3BlcnR5RnVuY3Rpb24oKSB7CiAgICAgIHZhciB4ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgaWYgKHggPT0gbnVsbCkgZGVsZXRlIHRoaXNbbmFtZV07IGVsc2UgdGhpc1tuYW1lXSA9IHg7CiAgICB9CiAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/IHByb3BlcnR5TnVsbCA6IHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIiA/IHByb3BlcnR5RnVuY3Rpb24gOiBwcm9wZXJ0eUNvbnN0YW50OwogIH0KICBkM19zZWxlY3Rpb25Qcm90b3R5cGUudGV4dCA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IHRoaXMuZWFjaCh0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIgPyBmdW5jdGlvbigpIHsKICAgICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICB0aGlzLnRleHRDb250ZW50ID0gdiA9PSBudWxsID8gIiIgOiB2OwogICAgfSA6IHZhbHVlID09IG51bGwgPyBmdW5jdGlvbigpIHsKICAgICAgdGhpcy50ZXh0Q29udGVudCA9ICIiOwogICAgfSA6IGZ1bmN0aW9uKCkgewogICAgICB0aGlzLnRleHRDb250ZW50ID0gdmFsdWU7CiAgICB9KSA6IHRoaXMubm9kZSgpLnRleHRDb250ZW50OwogIH07CiAgZDNfc2VsZWN0aW9uUHJvdG90eXBlLmh0bWwgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyB0aGlzLmVhY2godHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iID8gZnVuY3Rpb24oKSB7CiAgICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgdGhpcy5pbm5lckhUTUwgPSB2ID09IG51bGwgPyAiIiA6IHY7CiAgICB9IDogdmFsdWUgPT0gbnVsbCA/IGZ1bmN0aW9uKCkgewogICAgICB0aGlzLmlubmVySFRNTCA9ICIiOwogICAgfSA6IGZ1bmN0aW9uKCkgewogICAgICB0aGlzLmlubmVySFRNTCA9IHZhbHVlOwogICAgfSkgOiB0aGlzLm5vZGUoKS5pbm5lckhUTUw7CiAgfTsKICBkM19zZWxlY3Rpb25Qcm90b3R5cGUuYXBwZW5kID0gZnVuY3Rpb24obmFtZSkgewogICAgbmFtZSA9IGQzLm5zLnF1YWxpZnkobmFtZSk7CiAgICBmdW5jdGlvbiBhcHBlbmQoKSB7CiAgICAgIHJldHVybiB0aGlzLmFwcGVuZENoaWxkKGQzX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh0aGlzLm5hbWVzcGFjZVVSSSwgbmFtZSkpOwogICAgfQogICAgZnVuY3Rpb24gYXBwZW5kTlMoKSB7CiAgICAgIHJldHVybiB0aGlzLmFwcGVuZENoaWxkKGQzX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhuYW1lLnNwYWNlLCBuYW1lLmxvY2FsKSk7CiAgICB9CiAgICByZXR1cm4gdGhpcy5zZWxlY3QobmFtZS5sb2NhbCA/IGFwcGVuZE5TIDogYXBwZW5kKTsKICB9OwogIGQzX3NlbGVjdGlvblByb3RvdHlwZS5pbnNlcnQgPSBmdW5jdGlvbihuYW1lLCBiZWZvcmUpIHsKICAgIG5hbWUgPSBkMy5ucy5xdWFsaWZ5KG5hbWUpOwogICAgaWYgKHR5cGVvZiBiZWZvcmUgIT09ICJmdW5jdGlvbiIpIGJlZm9yZSA9IGQzX3NlbGVjdGlvbl9zZWxlY3RvcihiZWZvcmUpOwogICAgZnVuY3Rpb24gaW5zZXJ0KGQsIGkpIHsKICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0QmVmb3JlKGQzX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh0aGlzLm5hbWVzcGFjZVVSSSwgbmFtZSksIGJlZm9yZS5jYWxsKHRoaXMsIGQsIGkpKTsKICAgIH0KICAgIGZ1bmN0aW9uIGluc2VydE5TKGQsIGkpIHsKICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0QmVmb3JlKGQzX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhuYW1lLnNwYWNlLCBuYW1lLmxvY2FsKSwgYmVmb3JlLmNhbGwodGhpcywgZCwgaSkpOwogICAgfQogICAgcmV0dXJuIHRoaXMuc2VsZWN0KG5hbWUubG9jYWwgPyBpbnNlcnROUyA6IGluc2VydCk7CiAgfTsKICBkM19zZWxlY3Rpb25Qcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewogICAgICB2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlOwogICAgICBpZiAocGFyZW50KSBwYXJlbnQucmVtb3ZlQ2hpbGQodGhpcyk7CiAgICB9KTsKICB9OwogIGQzX3NlbGVjdGlvblByb3RvdHlwZS5kYXRhID0gZnVuY3Rpb24odmFsdWUsIGtleSkgewogICAgdmFyIGkgPSAtMSwgbiA9IHRoaXMubGVuZ3RoLCBncm91cCwgbm9kZTsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgewogICAgICB2YWx1ZSA9IG5ldyBBcnJheShuID0gKGdyb3VwID0gdGhpc1swXSkubGVuZ3RoKTsKICAgICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7CiAgICAgICAgICB2YWx1ZVtpXSA9IG5vZGUuX19kYXRhX187CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB2YWx1ZTsKICAgIH0KICAgIGZ1bmN0aW9uIGJpbmQoZ3JvdXAsIGdyb3VwRGF0YSkgewogICAgICB2YXIgaSwgbiA9IGdyb3VwLmxlbmd0aCwgbSA9IGdyb3VwRGF0YS5sZW5ndGgsIG4wID0gTWF0aC5taW4obiwgbSksIHVwZGF0ZU5vZGVzID0gbmV3IEFycmF5KG0pLCBlbnRlck5vZGVzID0gbmV3IEFycmF5KG0pLCBleGl0Tm9kZXMgPSBuZXcgQXJyYXkobiksIG5vZGUsIG5vZGVEYXRhOwogICAgICBpZiAoa2V5KSB7CiAgICAgICAgdmFyIG5vZGVCeUtleVZhbHVlID0gbmV3IGQzX01hcCgpLCBkYXRhQnlLZXlWYWx1ZSA9IG5ldyBkM19NYXAoKSwga2V5VmFsdWVzID0gW10sIGtleVZhbHVlOwogICAgICAgIGZvciAoaSA9IC0xOyArK2kgPCBuOyApIHsKICAgICAgICAgIGtleVZhbHVlID0ga2V5LmNhbGwobm9kZSA9IGdyb3VwW2ldLCBub2RlLl9fZGF0YV9fLCBpKTsKICAgICAgICAgIGlmIChub2RlQnlLZXlWYWx1ZS5oYXMoa2V5VmFsdWUpKSB7CiAgICAgICAgICAgIGV4aXROb2Rlc1tpXSA9IG5vZGU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBub2RlQnlLZXlWYWx1ZS5zZXQoa2V5VmFsdWUsIG5vZGUpOwogICAgICAgICAgfQogICAgICAgICAga2V5VmFsdWVzLnB1c2goa2V5VmFsdWUpOwogICAgICAgIH0KICAgICAgICBmb3IgKGkgPSAtMTsgKytpIDwgbTsgKSB7CiAgICAgICAgICBrZXlWYWx1ZSA9IGtleS5jYWxsKGdyb3VwRGF0YSwgbm9kZURhdGEgPSBncm91cERhdGFbaV0sIGkpOwogICAgICAgICAgaWYgKG5vZGUgPSBub2RlQnlLZXlWYWx1ZS5nZXQoa2V5VmFsdWUpKSB7CiAgICAgICAgICAgIHVwZGF0ZU5vZGVzW2ldID0gbm9kZTsKICAgICAgICAgICAgbm9kZS5fX2RhdGFfXyA9IG5vZGVEYXRhOwogICAgICAgICAgfSBlbHNlIGlmICghZGF0YUJ5S2V5VmFsdWUuaGFzKGtleVZhbHVlKSkgewogICAgICAgICAgICBlbnRlck5vZGVzW2ldID0gZDNfc2VsZWN0aW9uX2RhdGFOb2RlKG5vZGVEYXRhKTsKICAgICAgICAgIH0KICAgICAgICAgIGRhdGFCeUtleVZhbHVlLnNldChrZXlWYWx1ZSwgbm9kZURhdGEpOwogICAgICAgICAgbm9kZUJ5S2V5VmFsdWUucmVtb3ZlKGtleVZhbHVlKTsKICAgICAgICB9CiAgICAgICAgZm9yIChpID0gLTE7ICsraSA8IG47ICkgewogICAgICAgICAgaWYgKG5vZGVCeUtleVZhbHVlLmhhcyhrZXlWYWx1ZXNbaV0pKSB7CiAgICAgICAgICAgIGV4aXROb2Rlc1tpXSA9IGdyb3VwW2ldOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBmb3IgKGkgPSAtMTsgKytpIDwgbjA7ICkgewogICAgICAgICAgbm9kZSA9IGdyb3VwW2ldOwogICAgICAgICAgbm9kZURhdGEgPSBncm91cERhdGFbaV07CiAgICAgICAgICBpZiAobm9kZSkgewogICAgICAgICAgICBub2RlLl9fZGF0YV9fID0gbm9kZURhdGE7CiAgICAgICAgICAgIHVwZGF0ZU5vZGVzW2ldID0gbm9kZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVudGVyTm9kZXNbaV0gPSBkM19zZWxlY3Rpb25fZGF0YU5vZGUobm9kZURhdGEpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3IgKDtpIDwgbTsgKytpKSB7CiAgICAgICAgICBlbnRlck5vZGVzW2ldID0gZDNfc2VsZWN0aW9uX2RhdGFOb2RlKGdyb3VwRGF0YVtpXSk7CiAgICAgICAgfQogICAgICAgIGZvciAoO2kgPCBuOyArK2kpIHsKICAgICAgICAgIGV4aXROb2Rlc1tpXSA9IGdyb3VwW2ldOwogICAgICAgIH0KICAgICAgfQogICAgICBlbnRlck5vZGVzLnVwZGF0ZSA9IHVwZGF0ZU5vZGVzOwogICAgICBlbnRlck5vZGVzLnBhcmVudE5vZGUgPSB1cGRhdGVOb2Rlcy5wYXJlbnROb2RlID0gZXhpdE5vZGVzLnBhcmVudE5vZGUgPSBncm91cC5wYXJlbnROb2RlOwogICAgICBlbnRlci5wdXNoKGVudGVyTm9kZXMpOwogICAgICB1cGRhdGUucHVzaCh1cGRhdGVOb2Rlcyk7CiAgICAgIGV4aXQucHVzaChleGl0Tm9kZXMpOwogICAgfQogICAgdmFyIGVudGVyID0gZDNfc2VsZWN0aW9uX2VudGVyKFtdKSwgdXBkYXRlID0gZDNfc2VsZWN0aW9uKFtdKSwgZXhpdCA9IGQzX3NlbGVjdGlvbihbXSk7CiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iKSB7CiAgICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgICAgYmluZChncm91cCA9IHRoaXNbaV0sIHZhbHVlLmNhbGwoZ3JvdXAsIGdyb3VwLnBhcmVudE5vZGUuX19kYXRhX18sIGkpKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgICBiaW5kKGdyb3VwID0gdGhpc1tpXSwgdmFsdWUpOwogICAgICB9CiAgICB9CiAgICB1cGRhdGUuZW50ZXIgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGVudGVyOwogICAgfTsKICAgIHVwZGF0ZS5leGl0ID0gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBleGl0OwogICAgfTsKICAgIHJldHVybiB1cGRhdGU7CiAgfTsKICBmdW5jdGlvbiBkM19zZWxlY3Rpb25fZGF0YU5vZGUoZGF0YSkgewogICAgcmV0dXJuIHsKICAgICAgX19kYXRhX186IGRhdGEKICAgIH07CiAgfQogIGQzX3NlbGVjdGlvblByb3RvdHlwZS5kYXR1bSA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IHRoaXMucHJvcGVydHkoIl9fZGF0YV9fIiwgdmFsdWUpIDogdGhpcy5wcm9wZXJ0eSgiX19kYXRhX18iKTsKICB9OwogIGQzX3NlbGVjdGlvblByb3RvdHlwZS5maWx0ZXIgPSBmdW5jdGlvbihmaWx0ZXIpIHsKICAgIHZhciBzdWJncm91cHMgPSBbXSwgc3ViZ3JvdXAsIGdyb3VwLCBub2RlOwogICAgaWYgKHR5cGVvZiBmaWx0ZXIgIT09ICJmdW5jdGlvbiIpIGZpbHRlciA9IGQzX3NlbGVjdGlvbl9maWx0ZXIoZmlsdGVyKTsKICAgIGZvciAodmFyIGogPSAwLCBtID0gdGhpcy5sZW5ndGg7IGogPCBtOyBqKyspIHsKICAgICAgc3ViZ3JvdXBzLnB1c2goc3ViZ3JvdXAgPSBbXSk7CiAgICAgIHN1Ymdyb3VwLnBhcmVudE5vZGUgPSAoZ3JvdXAgPSB0aGlzW2pdKS5wYXJlbnROb2RlOwogICAgICBmb3IgKHZhciBpID0gMCwgbiA9IGdyb3VwLmxlbmd0aDsgaSA8IG47IGkrKykgewogICAgICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiBmaWx0ZXIuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpKSkgewogICAgICAgICAgc3ViZ3JvdXAucHVzaChub2RlKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBkM19zZWxlY3Rpb24oc3ViZ3JvdXBzKTsKICB9OwogIGZ1bmN0aW9uIGQzX3NlbGVjdGlvbl9maWx0ZXIoc2VsZWN0b3IpIHsKICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGQzX3NlbGVjdE1hdGNoZXModGhpcywgc2VsZWN0b3IpOwogICAgfTsKICB9CiAgZDNfc2VsZWN0aW9uUHJvdG90eXBlLm9yZGVyID0gZnVuY3Rpb24oKSB7CiAgICBmb3IgKHZhciBqID0gLTEsIG0gPSB0aGlzLmxlbmd0aDsgKytqIDwgbTsgKSB7CiAgICAgIGZvciAodmFyIGdyb3VwID0gdGhpc1tqXSwgaSA9IGdyb3VwLmxlbmd0aCAtIDEsIG5leHQgPSBncm91cFtpXSwgbm9kZTsgLS1pID49IDA7ICkgewogICAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHsKICAgICAgICAgIGlmIChuZXh0ICYmIG5leHQgIT09IG5vZGUubmV4dFNpYmxpbmcpIG5leHQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobm9kZSwgbmV4dCk7CiAgICAgICAgICBuZXh0ID0gbm9kZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0aGlzOwogIH07CiAgZDNfc2VsZWN0aW9uUHJvdG90eXBlLnNvcnQgPSBmdW5jdGlvbihjb21wYXJhdG9yKSB7CiAgICBjb21wYXJhdG9yID0gZDNfc2VsZWN0aW9uX3NvcnRDb21wYXJhdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICBmb3IgKHZhciBqID0gLTEsIG0gPSB0aGlzLmxlbmd0aDsgKytqIDwgbTsgKSB0aGlzW2pdLnNvcnQoY29tcGFyYXRvcik7CiAgICByZXR1cm4gdGhpcy5vcmRlcigpOwogIH07CiAgZnVuY3Rpb24gZDNfc2VsZWN0aW9uX3NvcnRDb21wYXJhdG9yKGNvbXBhcmF0b3IpIHsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgY29tcGFyYXRvciA9IGQzLmFzY2VuZGluZzsKICAgIHJldHVybiBmdW5jdGlvbihhLCBiKSB7CiAgICAgIHJldHVybiAhYSAtICFiIHx8IGNvbXBhcmF0b3IoYS5fX2RhdGFfXywgYi5fX2RhdGFfXyk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBkM19ub29wKCkge30KICBkM19zZWxlY3Rpb25Qcm90b3R5cGUub24gPSBmdW5jdGlvbih0eXBlLCBsaXN0ZW5lciwgY2FwdHVyZSkgewogICAgdmFyIG4gPSBhcmd1bWVudHMubGVuZ3RoOwogICAgaWYgKG4gPCAzKSB7CiAgICAgIGlmICh0eXBlb2YgdHlwZSAhPT0gInN0cmluZyIpIHsKICAgICAgICBpZiAobiA8IDIpIGxpc3RlbmVyID0gZmFsc2U7CiAgICAgICAgZm9yIChjYXB0dXJlIGluIHR5cGUpIHRoaXMuZWFjaChkM19zZWxlY3Rpb25fb24oY2FwdHVyZSwgdHlwZVtjYXB0dXJlXSwgbGlzdGVuZXIpKTsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfQogICAgICBpZiAobiA8IDIpIHJldHVybiAobiA9IHRoaXMubm9kZSgpWyJfX29uIiArIHR5cGVdKSAmJiBuLl87CiAgICAgIGNhcHR1cmUgPSBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0aGlzLmVhY2goZDNfc2VsZWN0aW9uX29uKHR5cGUsIGxpc3RlbmVyLCBjYXB0dXJlKSk7CiAgfTsKICBmdW5jdGlvbiBkM19zZWxlY3Rpb25fb24odHlwZSwgbGlzdGVuZXIsIGNhcHR1cmUpIHsKICAgIHZhciBuYW1lID0gIl9fb24iICsgdHlwZSwgaSA9IHR5cGUuaW5kZXhPZigiLiIpLCB3cmFwID0gZDNfc2VsZWN0aW9uX29uTGlzdGVuZXI7CiAgICBpZiAoaSA+IDApIHR5cGUgPSB0eXBlLnN1YnN0cmluZygwLCBpKTsKICAgIHZhciBmaWx0ZXIgPSBkM19zZWxlY3Rpb25fb25GaWx0ZXJzLmdldCh0eXBlKTsKICAgIGlmIChmaWx0ZXIpIHR5cGUgPSBmaWx0ZXIsIHdyYXAgPSBkM19zZWxlY3Rpb25fb25GaWx0ZXI7CiAgICBmdW5jdGlvbiBvblJlbW92ZSgpIHsKICAgICAgdmFyIGwgPSB0aGlzW25hbWVdOwogICAgICBpZiAobCkgewogICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsLCBsLiQpOwogICAgICAgIGRlbGV0ZSB0aGlzW25hbWVdOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBvbkFkZCgpIHsKICAgICAgdmFyIGwgPSB3cmFwKGxpc3RlbmVyLCBkM19hcnJheShhcmd1bWVudHMpKTsKICAgICAgb25SZW1vdmUuY2FsbCh0aGlzKTsKICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKHR5cGUsIHRoaXNbbmFtZV0gPSBsLCBsLiQgPSBjYXB0dXJlKTsKICAgICAgbC5fID0gbGlzdGVuZXI7CiAgICB9CiAgICBmdW5jdGlvbiByZW1vdmVBbGwoKSB7CiAgICAgIHZhciByZSA9IG5ldyBSZWdFeHAoIl5fX29uKFteLl0rKSIgKyBkMy5yZXF1b3RlKHR5cGUpICsgIiQiKSwgbWF0Y2g7CiAgICAgIGZvciAodmFyIG5hbWUgaW4gdGhpcykgewogICAgICAgIGlmIChtYXRjaCA9IG5hbWUubWF0Y2gocmUpKSB7CiAgICAgICAgICB2YXIgbCA9IHRoaXNbbmFtZV07CiAgICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIobWF0Y2hbMV0sIGwsIGwuJCk7CiAgICAgICAgICBkZWxldGUgdGhpc1tuYW1lXTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBpID8gbGlzdGVuZXIgPyBvbkFkZCA6IG9uUmVtb3ZlIDogbGlzdGVuZXIgPyBkM19ub29wIDogcmVtb3ZlQWxsOwogIH0KICB2YXIgZDNfc2VsZWN0aW9uX29uRmlsdGVycyA9IGQzLm1hcCh7CiAgICBtb3VzZWVudGVyOiAibW91c2VvdmVyIiwKICAgIG1vdXNlbGVhdmU6ICJtb3VzZW91dCIKICB9KTsKICBkM19zZWxlY3Rpb25fb25GaWx0ZXJzLmZvckVhY2goZnVuY3Rpb24oaykgewogICAgaWYgKCJvbiIgKyBrIGluIGQzX2RvY3VtZW50KSBkM19zZWxlY3Rpb25fb25GaWx0ZXJzLnJlbW92ZShrKTsKICB9KTsKICBmdW5jdGlvbiBkM19zZWxlY3Rpb25fb25MaXN0ZW5lcihsaXN0ZW5lciwgYXJndW1lbnR6KSB7CiAgICByZXR1cm4gZnVuY3Rpb24oZSkgewogICAgICB2YXIgbyA9IGQzLmV2ZW50OwogICAgICBkMy5ldmVudCA9IGU7CiAgICAgIGFyZ3VtZW50elswXSA9IHRoaXMuX19kYXRhX187CiAgICAgIHRyeSB7CiAgICAgICAgbGlzdGVuZXIuYXBwbHkodGhpcywgYXJndW1lbnR6KTsKICAgICAgfSBmaW5hbGx5IHsKICAgICAgICBkMy5ldmVudCA9IG87CiAgICAgIH0KICAgIH07CiAgfQogIGZ1bmN0aW9uIGQzX3NlbGVjdGlvbl9vbkZpbHRlcihsaXN0ZW5lciwgYXJndW1lbnR6KSB7CiAgICB2YXIgbCA9IGQzX3NlbGVjdGlvbl9vbkxpc3RlbmVyKGxpc3RlbmVyLCBhcmd1bWVudHopOwogICAgcmV0dXJuIGZ1bmN0aW9uKGUpIHsKICAgICAgdmFyIHRhcmdldCA9IHRoaXMsIHJlbGF0ZWQgPSBlLnJlbGF0ZWRUYXJnZXQ7CiAgICAgIGlmICghcmVsYXRlZCB8fCByZWxhdGVkICE9PSB0YXJnZXQgJiYgIShyZWxhdGVkLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHRhcmdldCkgJiA4KSkgewogICAgICAgIGwuY2FsbCh0YXJnZXQsIGUpOwogICAgICB9CiAgICB9OwogIH0KICBkM19zZWxlY3Rpb25Qcm90b3R5cGUuZWFjaCA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CiAgICByZXR1cm4gZDNfc2VsZWN0aW9uX2VhY2godGhpcywgZnVuY3Rpb24obm9kZSwgaSwgaikgewogICAgICBjYWxsYmFjay5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGopOwogICAgfSk7CiAgfTsKICBmdW5jdGlvbiBkM19zZWxlY3Rpb25fZWFjaChncm91cHMsIGNhbGxiYWNrKSB7CiAgICBmb3IgKHZhciBqID0gMCwgbSA9IGdyb3Vwcy5sZW5ndGg7IGogPCBtOyBqKyspIHsKICAgICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIGkgPSAwLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgY2FsbGJhY2sobm9kZSwgaSwgaik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBncm91cHM7CiAgfQogIGQzX3NlbGVjdGlvblByb3RvdHlwZS5jYWxsID0gZnVuY3Rpb24oY2FsbGJhY2spIHsKICAgIHZhciBhcmdzID0gZDNfYXJyYXkoYXJndW1lbnRzKTsKICAgIGNhbGxiYWNrLmFwcGx5KGFyZ3NbMF0gPSB0aGlzLCBhcmdzKTsKICAgIHJldHVybiB0aGlzOwogIH07CiAgZDNfc2VsZWN0aW9uUHJvdG90eXBlLmVtcHR5ID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gIXRoaXMubm9kZSgpOwogIH07CiAgZDNfc2VsZWN0aW9uUHJvdG90eXBlLm5vZGUgPSBmdW5jdGlvbigpIHsKICAgIGZvciAodmFyIGogPSAwLCBtID0gdGhpcy5sZW5ndGg7IGogPCBtOyBqKyspIHsKICAgICAgZm9yICh2YXIgZ3JvdXAgPSB0aGlzW2pdLCBpID0gMCwgbiA9IGdyb3VwLmxlbmd0aDsgaSA8IG47IGkrKykgewogICAgICAgIHZhciBub2RlID0gZ3JvdXBbaV07CiAgICAgICAgaWYgKG5vZGUpIHJldHVybiBub2RlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9OwogIGZ1bmN0aW9uIGQzX3NlbGVjdGlvbl9lbnRlcihzZWxlY3Rpb24pIHsKICAgIGQzX2FycmF5U3ViY2xhc3Moc2VsZWN0aW9uLCBkM19zZWxlY3Rpb25fZW50ZXJQcm90b3R5cGUpOwogICAgcmV0dXJuIHNlbGVjdGlvbjsKICB9CiAgdmFyIGQzX3NlbGVjdGlvbl9lbnRlclByb3RvdHlwZSA9IFtdOwogIGQzLnNlbGVjdGlvbi5lbnRlciA9IGQzX3NlbGVjdGlvbl9lbnRlcjsKICBkMy5zZWxlY3Rpb24uZW50ZXIucHJvdG90eXBlID0gZDNfc2VsZWN0aW9uX2VudGVyUHJvdG90eXBlOwogIGQzX3NlbGVjdGlvbl9lbnRlclByb3RvdHlwZS5hcHBlbmQgPSBkM19zZWxlY3Rpb25Qcm90b3R5cGUuYXBwZW5kOwogIGQzX3NlbGVjdGlvbl9lbnRlclByb3RvdHlwZS5pbnNlcnQgPSBkM19zZWxlY3Rpb25Qcm90b3R5cGUuaW5zZXJ0OwogIGQzX3NlbGVjdGlvbl9lbnRlclByb3RvdHlwZS5lbXB0eSA9IGQzX3NlbGVjdGlvblByb3RvdHlwZS5lbXB0eTsKICBkM19zZWxlY3Rpb25fZW50ZXJQcm90b3R5cGUubm9kZSA9IGQzX3NlbGVjdGlvblByb3RvdHlwZS5ub2RlOwogIGQzX3NlbGVjdGlvbl9lbnRlclByb3RvdHlwZS5zZWxlY3QgPSBmdW5jdGlvbihzZWxlY3RvcikgewogICAgdmFyIHN1Ymdyb3VwcyA9IFtdLCBzdWJncm91cCwgc3Vibm9kZSwgdXBncm91cCwgZ3JvdXAsIG5vZGU7CiAgICBmb3IgKHZhciBqID0gLTEsIG0gPSB0aGlzLmxlbmd0aDsgKytqIDwgbTsgKSB7CiAgICAgIHVwZ3JvdXAgPSAoZ3JvdXAgPSB0aGlzW2pdKS51cGRhdGU7CiAgICAgIHN1Ymdyb3Vwcy5wdXNoKHN1Ymdyb3VwID0gW10pOwogICAgICBzdWJncm91cC5wYXJlbnROb2RlID0gZ3JvdXAucGFyZW50Tm9kZTsKICAgICAgZm9yICh2YXIgaSA9IC0xLCBuID0gZ3JvdXAubGVuZ3RoOyArK2kgPCBuOyApIHsKICAgICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7CiAgICAgICAgICBzdWJncm91cC5wdXNoKHVwZ3JvdXBbaV0gPSBzdWJub2RlID0gc2VsZWN0b3IuY2FsbChncm91cC5wYXJlbnROb2RlLCBub2RlLl9fZGF0YV9fLCBpKSk7CiAgICAgICAgICBzdWJub2RlLl9fZGF0YV9fID0gbm9kZS5fX2RhdGFfXzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3ViZ3JvdXAucHVzaChudWxsKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBkM19zZWxlY3Rpb24oc3ViZ3JvdXBzKTsKICB9OwogIGQzX3NlbGVjdGlvblByb3RvdHlwZS50cmFuc2l0aW9uID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgaWQgPSBkM190cmFuc2l0aW9uSW5oZXJpdElkIHx8ICsrZDNfdHJhbnNpdGlvbklkLCBzdWJncm91cHMgPSBbXSwgc3ViZ3JvdXAsIG5vZGUsIHRyYW5zaXRpb24gPSBPYmplY3QuY3JlYXRlKGQzX3RyYW5zaXRpb25Jbmhlcml0KTsKICAgIHRyYW5zaXRpb24udGltZSA9IERhdGUubm93KCk7CiAgICBmb3IgKHZhciBqID0gLTEsIG0gPSB0aGlzLmxlbmd0aDsgKytqIDwgbTsgKSB7CiAgICAgIHN1Ymdyb3Vwcy5wdXNoKHN1Ymdyb3VwID0gW10pOwogICAgICBmb3IgKHZhciBncm91cCA9IHRoaXNbal0sIGkgPSAtMSwgbiA9IGdyb3VwLmxlbmd0aDsgKytpIDwgbjsgKSB7CiAgICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgZDNfdHJhbnNpdGlvbk5vZGUobm9kZSwgaSwgaWQsIHRyYW5zaXRpb24pOwogICAgICAgIHN1Ymdyb3VwLnB1c2gobm9kZSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBkM190cmFuc2l0aW9uKHN1Ymdyb3VwcywgaWQpOwogIH07CiAgZDMuc2VsZWN0ID0gZnVuY3Rpb24obm9kZSkgewogICAgdmFyIGdyb3VwID0gWyB0eXBlb2Ygbm9kZSA9PT0gInN0cmluZyIgPyBkM19zZWxlY3Qobm9kZSwgZDNfZG9jdW1lbnQpIDogbm9kZSBdOwogICAgZ3JvdXAucGFyZW50Tm9kZSA9IGQzX3NlbGVjdFJvb3Q7CiAgICByZXR1cm4gZDNfc2VsZWN0aW9uKFsgZ3JvdXAgXSk7CiAgfTsKICBkMy5zZWxlY3RBbGwgPSBmdW5jdGlvbihub2RlcykgewogICAgdmFyIGdyb3VwID0gZDNfYXJyYXkodHlwZW9mIG5vZGVzID09PSAic3RyaW5nIiA/IGQzX3NlbGVjdEFsbChub2RlcywgZDNfZG9jdW1lbnQpIDogbm9kZXMpOwogICAgZ3JvdXAucGFyZW50Tm9kZSA9IGQzX3NlbGVjdFJvb3Q7CiAgICByZXR1cm4gZDNfc2VsZWN0aW9uKFsgZ3JvdXAgXSk7CiAgfTsKICB2YXIgZDNfc2VsZWN0aW9uUm9vdCA9IGQzLnNlbGVjdChkM19zZWxlY3RSb290KTsKICBkMy5iZWhhdmlvci56b29tID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgdHJhbnNsYXRlID0gWyAwLCAwIF0sIHRyYW5zbGF0ZTAsIHNjYWxlID0gMSwgc2NhbGUwLCBzY2FsZUV4dGVudCA9IGQzX2JlaGF2aW9yX3pvb21JbmZpbml0eSwgZXZlbnQgPSBkM19ldmVudERpc3BhdGNoKHpvb20sICJ6b29tIiksIHgwLCB4MSwgeTAsIHkxLCB0b3VjaHRpbWU7CiAgICBmdW5jdGlvbiB6b29tKCkgewogICAgICB0aGlzLm9uKCJtb3VzZWRvd24uem9vbSIsIG1vdXNlZG93bikub24oIm1vdXNlbW92ZS56b29tIiwgbW91c2Vtb3ZlKS5vbihkM19iZWhhdmlvcl96b29tV2hlZWwgKyAiLnpvb20iLCBtb3VzZXdoZWVsKS5vbigiZGJsY2xpY2suem9vbSIsIGRibGNsaWNrKS5vbigidG91Y2hzdGFydC56b29tIiwgdG91Y2hzdGFydCkub24oInRvdWNobW92ZS56b29tIiwgdG91Y2htb3ZlKS5vbigidG91Y2hlbmQuem9vbSIsIHRvdWNoc3RhcnQpOwogICAgfQogICAgem9vbS50cmFuc2xhdGUgPSBmdW5jdGlvbih4KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRyYW5zbGF0ZTsKICAgICAgdHJhbnNsYXRlID0geC5tYXAoTnVtYmVyKTsKICAgICAgcmVzY2FsZSgpOwogICAgICByZXR1cm4gem9vbTsKICAgIH07CiAgICB6b29tLnNjYWxlID0gZnVuY3Rpb24oeCkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzY2FsZTsKICAgICAgc2NhbGUgPSAreDsKICAgICAgcmVzY2FsZSgpOwogICAgICByZXR1cm4gem9vbTsKICAgIH07CiAgICB6b29tLnNjYWxlRXh0ZW50ID0gZnVuY3Rpb24oeCkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzY2FsZUV4dGVudDsKICAgICAgc2NhbGVFeHRlbnQgPSB4ID09IG51bGwgPyBkM19iZWhhdmlvcl96b29tSW5maW5pdHkgOiB4Lm1hcChOdW1iZXIpOwogICAgICByZXR1cm4gem9vbTsKICAgIH07CiAgICB6b29tLnggPSBmdW5jdGlvbih6KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHgxOwogICAgICB4MSA9IHo7CiAgICAgIHgwID0gei5jb3B5KCk7CiAgICAgIHRyYW5zbGF0ZSA9IFsgMCwgMCBdOwogICAgICBzY2FsZSA9IDE7CiAgICAgIHJldHVybiB6b29tOwogICAgfTsKICAgIHpvb20ueSA9IGZ1bmN0aW9uKHopIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4geTE7CiAgICAgIHkxID0gejsKICAgICAgeTAgPSB6LmNvcHkoKTsKICAgICAgdHJhbnNsYXRlID0gWyAwLCAwIF07CiAgICAgIHNjYWxlID0gMTsKICAgICAgcmV0dXJuIHpvb207CiAgICB9OwogICAgZnVuY3Rpb24gbG9jYXRpb24ocCkgewogICAgICByZXR1cm4gWyAocFswXSAtIHRyYW5zbGF0ZVswXSkgLyBzY2FsZSwgKHBbMV0gLSB0cmFuc2xhdGVbMV0pIC8gc2NhbGUgXTsKICAgIH0KICAgIGZ1bmN0aW9uIHBvaW50KGwpIHsKICAgICAgcmV0dXJuIFsgbFswXSAqIHNjYWxlICsgdHJhbnNsYXRlWzBdLCBsWzFdICogc2NhbGUgKyB0cmFuc2xhdGVbMV0gXTsKICAgIH0KICAgIGZ1bmN0aW9uIHNjYWxlVG8ocykgewogICAgICBzY2FsZSA9IE1hdGgubWF4KHNjYWxlRXh0ZW50WzBdLCBNYXRoLm1pbihzY2FsZUV4dGVudFsxXSwgcykpOwogICAgfQogICAgZnVuY3Rpb24gdHJhbnNsYXRlVG8ocCwgbCkgewogICAgICBsID0gcG9pbnQobCk7CiAgICAgIHRyYW5zbGF0ZVswXSArPSBwWzBdIC0gbFswXTsKICAgICAgdHJhbnNsYXRlWzFdICs9IHBbMV0gLSBsWzFdOwogICAgfQogICAgZnVuY3Rpb24gcmVzY2FsZSgpIHsKICAgICAgaWYgKHgxKSB4MS5kb21haW4oeDAucmFuZ2UoKS5tYXAoZnVuY3Rpb24oeCkgewogICAgICAgIHJldHVybiAoeCAtIHRyYW5zbGF0ZVswXSkgLyBzY2FsZTsKICAgICAgfSkubWFwKHgwLmludmVydCkpOwogICAgICBpZiAoeTEpIHkxLmRvbWFpbih5MC5yYW5nZSgpLm1hcChmdW5jdGlvbih5KSB7CiAgICAgICAgcmV0dXJuICh5IC0gdHJhbnNsYXRlWzFdKSAvIHNjYWxlOwogICAgICB9KS5tYXAoeTAuaW52ZXJ0KSk7CiAgICB9CiAgICBmdW5jdGlvbiBkaXNwYXRjaChldmVudCkgewogICAgICByZXNjYWxlKCk7CiAgICAgIGQzLmV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGV2ZW50KHsKICAgICAgICB0eXBlOiAiem9vbSIsCiAgICAgICAgc2NhbGU6IHNjYWxlLAogICAgICAgIHRyYW5zbGF0ZTogdHJhbnNsYXRlCiAgICAgIH0pOwogICAgfQogICAgZnVuY3Rpb24gbW91c2Vkb3duKCkgewogICAgICB2YXIgdGFyZ2V0ID0gdGhpcywgZXZlbnRfID0gZXZlbnQub2YodGFyZ2V0LCBhcmd1bWVudHMpLCBldmVudFRhcmdldCA9IGQzLmV2ZW50LnRhcmdldCwgbW92ZWQgPSAwLCB3ID0gZDMuc2VsZWN0KGQzX3dpbmRvdykub24oIm1vdXNlbW92ZS56b29tIiwgbW91c2Vtb3ZlKS5vbigibW91c2V1cC56b29tIiwgbW91c2V1cCksIGwgPSBsb2NhdGlvbihkMy5tb3VzZSh0YXJnZXQpKTsKICAgICAgZDNfd2luZG93LmZvY3VzKCk7CiAgICAgIGQzX2V2ZW50Q2FuY2VsKCk7CiAgICAgIGZ1bmN0aW9uIG1vdXNlbW92ZSgpIHsKICAgICAgICBtb3ZlZCA9IDE7CiAgICAgICAgdHJhbnNsYXRlVG8oZDMubW91c2UodGFyZ2V0KSwgbCk7CiAgICAgICAgZGlzcGF0Y2goZXZlbnRfKTsKICAgICAgfQogICAgICBmdW5jdGlvbiBtb3VzZXVwKCkgewogICAgICAgIGlmIChtb3ZlZCkgZDNfZXZlbnRDYW5jZWwoKTsKICAgICAgICB3Lm9uKCJtb3VzZW1vdmUuem9vbSIsIG51bGwpLm9uKCJtb3VzZXVwLnpvb20iLCBudWxsKTsKICAgICAgICBpZiAobW92ZWQgJiYgZDMuZXZlbnQudGFyZ2V0ID09PSBldmVudFRhcmdldCkgZDNfZXZlbnRTdXBwcmVzcyh3LCAiY2xpY2suem9vbSIpOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBtb3VzZXdoZWVsKCkgewogICAgICBpZiAoIXRyYW5zbGF0ZTApIHRyYW5zbGF0ZTAgPSBsb2NhdGlvbihkMy5tb3VzZSh0aGlzKSk7CiAgICAgIHNjYWxlVG8oTWF0aC5wb3coMiwgZDNfYmVoYXZpb3Jfem9vbURlbHRhKCkgKiAuMDAyKSAqIHNjYWxlKTsKICAgICAgdHJhbnNsYXRlVG8oZDMubW91c2UodGhpcyksIHRyYW5zbGF0ZTApOwogICAgICBkaXNwYXRjaChldmVudC5vZih0aGlzLCBhcmd1bWVudHMpKTsKICAgIH0KICAgIGZ1bmN0aW9uIG1vdXNlbW92ZSgpIHsKICAgICAgdHJhbnNsYXRlMCA9IG51bGw7CiAgICB9CiAgICBmdW5jdGlvbiBkYmxjbGljaygpIHsKICAgICAgdmFyIHAgPSBkMy5tb3VzZSh0aGlzKSwgbCA9IGxvY2F0aW9uKHApLCBrID0gTWF0aC5sb2coc2NhbGUpIC8gTWF0aC5MTjI7CiAgICAgIHNjYWxlVG8oTWF0aC5wb3coMiwgZDMuZXZlbnQuc2hpZnRLZXkgPyBNYXRoLmNlaWwoaykgLSAxIDogTWF0aC5mbG9vcihrKSArIDEpKTsKICAgICAgdHJhbnNsYXRlVG8ocCwgbCk7CiAgICAgIGRpc3BhdGNoKGV2ZW50Lm9mKHRoaXMsIGFyZ3VtZW50cykpOwogICAgfQogICAgZnVuY3Rpb24gdG91Y2hzdGFydCgpIHsKICAgICAgdmFyIHRvdWNoZXMgPSBkMy50b3VjaGVzKHRoaXMpLCBub3cgPSBEYXRlLm5vdygpOwogICAgICBzY2FsZTAgPSBzY2FsZTsKICAgICAgdHJhbnNsYXRlMCA9IHt9OwogICAgICB0b3VjaGVzLmZvckVhY2goZnVuY3Rpb24odCkgewogICAgICAgIHRyYW5zbGF0ZTBbdC5pZGVudGlmaWVyXSA9IGxvY2F0aW9uKHQpOwogICAgICB9KTsKICAgICAgZDNfZXZlbnRDYW5jZWwoKTsKICAgICAgaWYgKHRvdWNoZXMubGVuZ3RoID09PSAxKSB7CiAgICAgICAgaWYgKG5vdyAtIHRvdWNodGltZSA8IDUwMCkgewogICAgICAgICAgdmFyIHAgPSB0b3VjaGVzWzBdLCBsID0gbG9jYXRpb24odG91Y2hlc1swXSk7CiAgICAgICAgICBzY2FsZVRvKHNjYWxlICogMik7CiAgICAgICAgICB0cmFuc2xhdGVUbyhwLCBsKTsKICAgICAgICAgIGRpc3BhdGNoKGV2ZW50Lm9mKHRoaXMsIGFyZ3VtZW50cykpOwogICAgICAgIH0KICAgICAgICB0b3VjaHRpbWUgPSBub3c7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHRvdWNobW92ZSgpIHsKICAgICAgdmFyIHRvdWNoZXMgPSBkMy50b3VjaGVzKHRoaXMpLCBwMCA9IHRvdWNoZXNbMF0sIGwwID0gdHJhbnNsYXRlMFtwMC5pZGVudGlmaWVyXTsKICAgICAgaWYgKHAxID0gdG91Y2hlc1sxXSkgewogICAgICAgIHZhciBwMSwgbDEgPSB0cmFuc2xhdGUwW3AxLmlkZW50aWZpZXJdOwogICAgICAgIHAwID0gWyAocDBbMF0gKyBwMVswXSkgLyAyLCAocDBbMV0gKyBwMVsxXSkgLyAyIF07CiAgICAgICAgbDAgPSBbIChsMFswXSArIGwxWzBdKSAvIDIsIChsMFsxXSArIGwxWzFdKSAvIDIgXTsKICAgICAgICBzY2FsZVRvKGQzLmV2ZW50LnNjYWxlICogc2NhbGUwKTsKICAgICAgfQogICAgICB0cmFuc2xhdGVUbyhwMCwgbDApOwogICAgICB0b3VjaHRpbWUgPSBudWxsOwogICAgICBkaXNwYXRjaChldmVudC5vZih0aGlzLCBhcmd1bWVudHMpKTsKICAgIH0KICAgIHJldHVybiBkMy5yZWJpbmQoem9vbSwgZXZlbnQsICJvbiIpOwogIH07CiAgdmFyIGQzX2JlaGF2aW9yX3pvb21JbmZpbml0eSA9IFsgMCwgSW5maW5pdHkgXTsKICB2YXIgZDNfYmVoYXZpb3Jfem9vbURlbHRhLCBkM19iZWhhdmlvcl96b29tV2hlZWwgPSAib253aGVlbCIgaW4gZDNfZG9jdW1lbnQgPyAoZDNfYmVoYXZpb3Jfem9vbURlbHRhID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gLWQzLmV2ZW50LmRlbHRhWSAqIChkMy5ldmVudC5kZWx0YU1vZGUgPyAxMjAgOiAxKTsKICB9LCAid2hlZWwiKSA6ICJvbm1vdXNld2hlZWwiIGluIGQzX2RvY3VtZW50ID8gKGQzX2JlaGF2aW9yX3pvb21EZWx0YSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGQzLmV2ZW50LndoZWVsRGVsdGE7CiAgfSwgIm1vdXNld2hlZWwiKSA6IChkM19iZWhhdmlvcl96b29tRGVsdGEgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiAtZDMuZXZlbnQuZGV0YWlsOwogIH0sICJNb3pNb3VzZVBpeGVsU2Nyb2xsIik7CiAgZnVuY3Rpb24gZDNfQ29sb3IoKSB7fQogIGQzX0NvbG9yLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMucmdiKCkgKyAiIjsKICB9OwogIGQzLmhzbCA9IGZ1bmN0aW9uKGgsIHMsIGwpIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gaCBpbnN0YW5jZW9mIGQzX0hzbCA/IGQzX2hzbChoLmgsIGgucywgaC5sKSA6IGQzX3JnYl9wYXJzZSgiIiArIGgsIGQzX3JnYl9oc2wsIGQzX2hzbCkgOiBkM19oc2woK2gsICtzLCArbCk7CiAgfTsKICBmdW5jdGlvbiBkM19oc2woaCwgcywgbCkgewogICAgcmV0dXJuIG5ldyBkM19Ic2woaCwgcywgbCk7CiAgfQogIGZ1bmN0aW9uIGQzX0hzbChoLCBzLCBsKSB7CiAgICB0aGlzLmggPSBoOwogICAgdGhpcy5zID0gczsKICAgIHRoaXMubCA9IGw7CiAgfQogIHZhciBkM19oc2xQcm90b3R5cGUgPSBkM19Ic2wucHJvdG90eXBlID0gbmV3IGQzX0NvbG9yKCk7CiAgZDNfaHNsUHJvdG90eXBlLmJyaWdodGVyID0gZnVuY3Rpb24oaykgewogICAgayA9IE1hdGgucG93KC43LCBhcmd1bWVudHMubGVuZ3RoID8gayA6IDEpOwogICAgcmV0dXJuIGQzX2hzbCh0aGlzLmgsIHRoaXMucywgdGhpcy5sIC8gayk7CiAgfTsKICBkM19oc2xQcm90b3R5cGUuZGFya2VyID0gZnVuY3Rpb24oaykgewogICAgayA9IE1hdGgucG93KC43LCBhcmd1bWVudHMubGVuZ3RoID8gayA6IDEpOwogICAgcmV0dXJuIGQzX2hzbCh0aGlzLmgsIHRoaXMucywgayAqIHRoaXMubCk7CiAgfTsKICBkM19oc2xQcm90b3R5cGUucmdiID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gZDNfaHNsX3JnYih0aGlzLmgsIHRoaXMucywgdGhpcy5sKTsKICB9OwogIGZ1bmN0aW9uIGQzX2hzbF9yZ2IoaCwgcywgbCkgewogICAgdmFyIG0xLCBtMjsKICAgIGggPSBpc05hTihoKSA/IDAgOiAoaCAlPSAzNjApIDwgMCA/IGggKyAzNjAgOiBoOwogICAgcyA9IGlzTmFOKHMpID8gMCA6IHMgPCAwID8gMCA6IHMgPiAxID8gMSA6IHM7CiAgICBsID0gbCA8IDAgPyAwIDogbCA+IDEgPyAxIDogbDsKICAgIG0yID0gbCA8PSAuNSA/IGwgKiAoMSArIHMpIDogbCArIHMgLSBsICogczsKICAgIG0xID0gMiAqIGwgLSBtMjsKICAgIGZ1bmN0aW9uIHYoaCkgewogICAgICBpZiAoaCA+IDM2MCkgaCAtPSAzNjA7IGVsc2UgaWYgKGggPCAwKSBoICs9IDM2MDsKICAgICAgaWYgKGggPCA2MCkgcmV0dXJuIG0xICsgKG0yIC0gbTEpICogaCAvIDYwOwogICAgICBpZiAoaCA8IDE4MCkgcmV0dXJuIG0yOwogICAgICBpZiAoaCA8IDI0MCkgcmV0dXJuIG0xICsgKG0yIC0gbTEpICogKDI0MCAtIGgpIC8gNjA7CiAgICAgIHJldHVybiBtMTsKICAgIH0KICAgIGZ1bmN0aW9uIHZ2KGgpIHsKICAgICAgcmV0dXJuIE1hdGgucm91bmQodihoKSAqIDI1NSk7CiAgICB9CiAgICByZXR1cm4gZDNfcmdiKHZ2KGggKyAxMjApLCB2dihoKSwgdnYoaCAtIDEyMCkpOwogIH0KICB2YXIgz4AgPSBNYXRoLlBJLCDOtSA9IDFlLTYsIGQzX3JhZGlhbnMgPSDPgCAvIDE4MCwgZDNfZGVncmVlcyA9IDE4MCAvIM+AOwogIGZ1bmN0aW9uIGQzX3Nnbih4KSB7CiAgICByZXR1cm4geCA+IDAgPyAxIDogeCA8IDAgPyAtMSA6IDA7CiAgfQogIGZ1bmN0aW9uIGQzX2Fjb3MoeCkgewogICAgcmV0dXJuIE1hdGguYWNvcyhNYXRoLm1heCgtMSwgTWF0aC5taW4oMSwgeCkpKTsKICB9CiAgZnVuY3Rpb24gZDNfYXNpbih4KSB7CiAgICByZXR1cm4geCA+IDEgPyDPgCAvIDIgOiB4IDwgLTEgPyAtz4AgLyAyIDogTWF0aC5hc2luKHgpOwogIH0KICBmdW5jdGlvbiBkM19zaW5oKHgpIHsKICAgIHJldHVybiAoTWF0aC5leHAoeCkgLSBNYXRoLmV4cCgteCkpIC8gMjsKICB9CiAgZnVuY3Rpb24gZDNfY29zaCh4KSB7CiAgICByZXR1cm4gKE1hdGguZXhwKHgpICsgTWF0aC5leHAoLXgpKSAvIDI7CiAgfQogIGZ1bmN0aW9uIGQzX2hhdmVyc2luKHgpIHsKICAgIHJldHVybiAoeCA9IE1hdGguc2luKHggLyAyKSkgKiB4OwogIH0KICBkMy5oY2wgPSBmdW5jdGlvbihoLCBjLCBsKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGggaW5zdGFuY2VvZiBkM19IY2wgPyBkM19oY2woaC5oLCBoLmMsIGgubCkgOiBoIGluc3RhbmNlb2YgZDNfTGFiID8gZDNfbGFiX2hjbChoLmwsIGguYSwgaC5iKSA6IGQzX2xhYl9oY2woKGggPSBkM19yZ2JfbGFiKChoID0gZDMucmdiKGgpKS5yLCBoLmcsIGguYikpLmwsIGguYSwgaC5iKSA6IGQzX2hjbCgraCwgK2MsICtsKTsKICB9OwogIGZ1bmN0aW9uIGQzX2hjbChoLCBjLCBsKSB7CiAgICByZXR1cm4gbmV3IGQzX0hjbChoLCBjLCBsKTsKICB9CiAgZnVuY3Rpb24gZDNfSGNsKGgsIGMsIGwpIHsKICAgIHRoaXMuaCA9IGg7CiAgICB0aGlzLmMgPSBjOwogICAgdGhpcy5sID0gbDsKICB9CiAgdmFyIGQzX2hjbFByb3RvdHlwZSA9IGQzX0hjbC5wcm90b3R5cGUgPSBuZXcgZDNfQ29sb3IoKTsKICBkM19oY2xQcm90b3R5cGUuYnJpZ2h0ZXIgPSBmdW5jdGlvbihrKSB7CiAgICByZXR1cm4gZDNfaGNsKHRoaXMuaCwgdGhpcy5jLCBNYXRoLm1pbigxMDAsIHRoaXMubCArIGQzX2xhYl9LICogKGFyZ3VtZW50cy5sZW5ndGggPyBrIDogMSkpKTsKICB9OwogIGQzX2hjbFByb3RvdHlwZS5kYXJrZXIgPSBmdW5jdGlvbihrKSB7CiAgICByZXR1cm4gZDNfaGNsKHRoaXMuaCwgdGhpcy5jLCBNYXRoLm1heCgwLCB0aGlzLmwgLSBkM19sYWJfSyAqIChhcmd1bWVudHMubGVuZ3RoID8gayA6IDEpKSk7CiAgfTsKICBkM19oY2xQcm90b3R5cGUucmdiID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gZDNfaGNsX2xhYih0aGlzLmgsIHRoaXMuYywgdGhpcy5sKS5yZ2IoKTsKICB9OwogIGZ1bmN0aW9uIGQzX2hjbF9sYWIoaCwgYywgbCkgewogICAgaWYgKGlzTmFOKGgpKSBoID0gMDsKICAgIGlmIChpc05hTihjKSkgYyA9IDA7CiAgICByZXR1cm4gZDNfbGFiKGwsIE1hdGguY29zKGggKj0gZDNfcmFkaWFucykgKiBjLCBNYXRoLnNpbihoKSAqIGMpOwogIH0KICBkMy5sYWIgPSBmdW5jdGlvbihsLCBhLCBiKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGwgaW5zdGFuY2VvZiBkM19MYWIgPyBkM19sYWIobC5sLCBsLmEsIGwuYikgOiBsIGluc3RhbmNlb2YgZDNfSGNsID8gZDNfaGNsX2xhYihsLmwsIGwuYywgbC5oKSA6IGQzX3JnYl9sYWIoKGwgPSBkMy5yZ2IobCkpLnIsIGwuZywgbC5iKSA6IGQzX2xhYigrbCwgK2EsICtiKTsKICB9OwogIGZ1bmN0aW9uIGQzX2xhYihsLCBhLCBiKSB7CiAgICByZXR1cm4gbmV3IGQzX0xhYihsLCBhLCBiKTsKICB9CiAgZnVuY3Rpb24gZDNfTGFiKGwsIGEsIGIpIHsKICAgIHRoaXMubCA9IGw7CiAgICB0aGlzLmEgPSBhOwogICAgdGhpcy5iID0gYjsKICB9CiAgdmFyIGQzX2xhYl9LID0gMTg7CiAgdmFyIGQzX2xhYl9YID0gLjk1MDQ3LCBkM19sYWJfWSA9IDEsIGQzX2xhYl9aID0gMS4wODg4MzsKICB2YXIgZDNfbGFiUHJvdG90eXBlID0gZDNfTGFiLnByb3RvdHlwZSA9IG5ldyBkM19Db2xvcigpOwogIGQzX2xhYlByb3RvdHlwZS5icmlnaHRlciA9IGZ1bmN0aW9uKGspIHsKICAgIHJldHVybiBkM19sYWIoTWF0aC5taW4oMTAwLCB0aGlzLmwgKyBkM19sYWJfSyAqIChhcmd1bWVudHMubGVuZ3RoID8gayA6IDEpKSwgdGhpcy5hLCB0aGlzLmIpOwogIH07CiAgZDNfbGFiUHJvdG90eXBlLmRhcmtlciA9IGZ1bmN0aW9uKGspIHsKICAgIHJldHVybiBkM19sYWIoTWF0aC5tYXgoMCwgdGhpcy5sIC0gZDNfbGFiX0sgKiAoYXJndW1lbnRzLmxlbmd0aCA/IGsgOiAxKSksIHRoaXMuYSwgdGhpcy5iKTsKICB9OwogIGQzX2xhYlByb3RvdHlwZS5yZ2IgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBkM19sYWJfcmdiKHRoaXMubCwgdGhpcy5hLCB0aGlzLmIpOwogIH07CiAgZnVuY3Rpb24gZDNfbGFiX3JnYihsLCBhLCBiKSB7CiAgICB2YXIgeSA9IChsICsgMTYpIC8gMTE2LCB4ID0geSArIGEgLyA1MDAsIHogPSB5IC0gYiAvIDIwMDsKICAgIHggPSBkM19sYWJfeHl6KHgpICogZDNfbGFiX1g7CiAgICB5ID0gZDNfbGFiX3h5eih5KSAqIGQzX2xhYl9ZOwogICAgeiA9IGQzX2xhYl94eXooeikgKiBkM19sYWJfWjsKICAgIHJldHVybiBkM19yZ2IoZDNfeHl6X3JnYigzLjI0MDQ1NDIgKiB4IC0gMS41MzcxMzg1ICogeSAtIC40OTg1MzE0ICogeiksIGQzX3h5el9yZ2IoLS45NjkyNjYgKiB4ICsgMS44NzYwMTA4ICogeSArIC4wNDE1NTYgKiB6KSwgZDNfeHl6X3JnYiguMDU1NjQzNCAqIHggLSAuMjA0MDI1OSAqIHkgKyAxLjA1NzIyNTIgKiB6KSk7CiAgfQogIGZ1bmN0aW9uIGQzX2xhYl9oY2wobCwgYSwgYikgewogICAgcmV0dXJuIGwgPiAwID8gZDNfaGNsKE1hdGguYXRhbjIoYiwgYSkgKiBkM19kZWdyZWVzLCBNYXRoLnNxcnQoYSAqIGEgKyBiICogYiksIGwpIDogZDNfaGNsKE5hTiwgTmFOLCBsKTsKICB9CiAgZnVuY3Rpb24gZDNfbGFiX3h5eih4KSB7CiAgICByZXR1cm4geCA+IC4yMDY4OTMwMzQgPyB4ICogeCAqIHggOiAoeCAtIDQgLyAyOSkgLyA3Ljc4NzAzNzsKICB9CiAgZnVuY3Rpb24gZDNfeHl6X2xhYih4KSB7CiAgICByZXR1cm4geCA+IC4wMDg4NTYgPyBNYXRoLnBvdyh4LCAxIC8gMykgOiA3Ljc4NzAzNyAqIHggKyA0IC8gMjk7CiAgfQogIGZ1bmN0aW9uIGQzX3h5el9yZ2IocikgewogICAgcmV0dXJuIE1hdGgucm91bmQoMjU1ICogKHIgPD0gLjAwMzA0ID8gMTIuOTIgKiByIDogMS4wNTUgKiBNYXRoLnBvdyhyLCAxIC8gMi40KSAtIC4wNTUpKTsKICB9CiAgZDMucmdiID0gZnVuY3Rpb24ociwgZywgYikgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyByIGluc3RhbmNlb2YgZDNfUmdiID8gZDNfcmdiKHIuciwgci5nLCByLmIpIDogZDNfcmdiX3BhcnNlKCIiICsgciwgZDNfcmdiLCBkM19oc2xfcmdiKSA6IGQzX3JnYih+fnIsIH5+Zywgfn5iKTsKICB9OwogIGZ1bmN0aW9uIGQzX3JnYihyLCBnLCBiKSB7CiAgICByZXR1cm4gbmV3IGQzX1JnYihyLCBnLCBiKTsKICB9CiAgZnVuY3Rpb24gZDNfUmdiKHIsIGcsIGIpIHsKICAgIHRoaXMuciA9IHI7CiAgICB0aGlzLmcgPSBnOwogICAgdGhpcy5iID0gYjsKICB9CiAgdmFyIGQzX3JnYlByb3RvdHlwZSA9IGQzX1JnYi5wcm90b3R5cGUgPSBuZXcgZDNfQ29sb3IoKTsKICBkM19yZ2JQcm90b3R5cGUuYnJpZ2h0ZXIgPSBmdW5jdGlvbihrKSB7CiAgICBrID0gTWF0aC5wb3coLjcsIGFyZ3VtZW50cy5sZW5ndGggPyBrIDogMSk7CiAgICB2YXIgciA9IHRoaXMuciwgZyA9IHRoaXMuZywgYiA9IHRoaXMuYiwgaSA9IDMwOwogICAgaWYgKCFyICYmICFnICYmICFiKSByZXR1cm4gZDNfcmdiKGksIGksIGkpOwogICAgaWYgKHIgJiYgciA8IGkpIHIgPSBpOwogICAgaWYgKGcgJiYgZyA8IGkpIGcgPSBpOwogICAgaWYgKGIgJiYgYiA8IGkpIGIgPSBpOwogICAgcmV0dXJuIGQzX3JnYihNYXRoLm1pbigyNTUsIE1hdGguZmxvb3IociAvIGspKSwgTWF0aC5taW4oMjU1LCBNYXRoLmZsb29yKGcgLyBrKSksIE1hdGgubWluKDI1NSwgTWF0aC5mbG9vcihiIC8gaykpKTsKICB9OwogIGQzX3JnYlByb3RvdHlwZS5kYXJrZXIgPSBmdW5jdGlvbihrKSB7CiAgICBrID0gTWF0aC5wb3coLjcsIGFyZ3VtZW50cy5sZW5ndGggPyBrIDogMSk7CiAgICByZXR1cm4gZDNfcmdiKE1hdGguZmxvb3IoayAqIHRoaXMuciksIE1hdGguZmxvb3IoayAqIHRoaXMuZyksIE1hdGguZmxvb3IoayAqIHRoaXMuYikpOwogIH07CiAgZDNfcmdiUHJvdG90eXBlLmhzbCA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGQzX3JnYl9oc2wodGhpcy5yLCB0aGlzLmcsIHRoaXMuYik7CiAgfTsKICBkM19yZ2JQcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiAiIyIgKyBkM19yZ2JfaGV4KHRoaXMucikgKyBkM19yZ2JfaGV4KHRoaXMuZykgKyBkM19yZ2JfaGV4KHRoaXMuYik7CiAgfTsKICBmdW5jdGlvbiBkM19yZ2JfaGV4KHYpIHsKICAgIHJldHVybiB2IDwgMTYgPyAiMCIgKyBNYXRoLm1heCgwLCB2KS50b1N0cmluZygxNikgOiBNYXRoLm1pbigyNTUsIHYpLnRvU3RyaW5nKDE2KTsKICB9CiAgZnVuY3Rpb24gZDNfcmdiX3BhcnNlKGZvcm1hdCwgcmdiLCBoc2wpIHsKICAgIHZhciByID0gMCwgZyA9IDAsIGIgPSAwLCBtMSwgbTIsIG5hbWU7CiAgICBtMSA9IC8oW2Etel0rKVwoKC4qKVwpL2kuZXhlYyhmb3JtYXQpOwogICAgaWYgKG0xKSB7CiAgICAgIG0yID0gbTFbMl0uc3BsaXQoIiwiKTsKICAgICAgc3dpdGNoIChtMVsxXSkgewogICAgICAgY2FzZSAiaHNsIjoKICAgICAgICB7CiAgICAgICAgICByZXR1cm4gaHNsKHBhcnNlRmxvYXQobTJbMF0pLCBwYXJzZUZsb2F0KG0yWzFdKSAvIDEwMCwgcGFyc2VGbG9hdChtMlsyXSkgLyAxMDApOwogICAgICAgIH0KCiAgICAgICBjYXNlICJyZ2IiOgogICAgICAgIHsKICAgICAgICAgIHJldHVybiByZ2IoZDNfcmdiX3BhcnNlTnVtYmVyKG0yWzBdKSwgZDNfcmdiX3BhcnNlTnVtYmVyKG0yWzFdKSwgZDNfcmdiX3BhcnNlTnVtYmVyKG0yWzJdKSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAobmFtZSA9IGQzX3JnYl9uYW1lcy5nZXQoZm9ybWF0KSkgcmV0dXJuIHJnYihuYW1lLnIsIG5hbWUuZywgbmFtZS5iKTsKICAgIGlmIChmb3JtYXQgIT0gbnVsbCAmJiBmb3JtYXQuY2hhckF0KDApID09PSAiIyIpIHsKICAgICAgaWYgKGZvcm1hdC5sZW5ndGggPT09IDQpIHsKICAgICAgICByID0gZm9ybWF0LmNoYXJBdCgxKTsKICAgICAgICByICs9IHI7CiAgICAgICAgZyA9IGZvcm1hdC5jaGFyQXQoMik7CiAgICAgICAgZyArPSBnOwogICAgICAgIGIgPSBmb3JtYXQuY2hhckF0KDMpOwogICAgICAgIGIgKz0gYjsKICAgICAgfSBlbHNlIGlmIChmb3JtYXQubGVuZ3RoID09PSA3KSB7CiAgICAgICAgciA9IGZvcm1hdC5zdWJzdHJpbmcoMSwgMyk7CiAgICAgICAgZyA9IGZvcm1hdC5zdWJzdHJpbmcoMywgNSk7CiAgICAgICAgYiA9IGZvcm1hdC5zdWJzdHJpbmcoNSwgNyk7CiAgICAgIH0KICAgICAgciA9IHBhcnNlSW50KHIsIDE2KTsKICAgICAgZyA9IHBhcnNlSW50KGcsIDE2KTsKICAgICAgYiA9IHBhcnNlSW50KGIsIDE2KTsKICAgIH0KICAgIHJldHVybiByZ2IociwgZywgYik7CiAgfQogIGZ1bmN0aW9uIGQzX3JnYl9oc2wociwgZywgYikgewogICAgdmFyIG1pbiA9IE1hdGgubWluKHIgLz0gMjU1LCBnIC89IDI1NSwgYiAvPSAyNTUpLCBtYXggPSBNYXRoLm1heChyLCBnLCBiKSwgZCA9IG1heCAtIG1pbiwgaCwgcywgbCA9IChtYXggKyBtaW4pIC8gMjsKICAgIGlmIChkKSB7CiAgICAgIHMgPSBsIDwgLjUgPyBkIC8gKG1heCArIG1pbikgOiBkIC8gKDIgLSBtYXggLSBtaW4pOwogICAgICBpZiAociA9PSBtYXgpIGggPSAoZyAtIGIpIC8gZCArIChnIDwgYiA/IDYgOiAwKTsgZWxzZSBpZiAoZyA9PSBtYXgpIGggPSAoYiAtIHIpIC8gZCArIDI7IGVsc2UgaCA9IChyIC0gZykgLyBkICsgNDsKICAgICAgaCAqPSA2MDsKICAgIH0gZWxzZSB7CiAgICAgIGggPSBOYU47CiAgICAgIHMgPSBsID4gMCAmJiBsIDwgMSA/IDAgOiBoOwogICAgfQogICAgcmV0dXJuIGQzX2hzbChoLCBzLCBsKTsKICB9CiAgZnVuY3Rpb24gZDNfcmdiX2xhYihyLCBnLCBiKSB7CiAgICByID0gZDNfcmdiX3h5eihyKTsKICAgIGcgPSBkM19yZ2JfeHl6KGcpOwogICAgYiA9IGQzX3JnYl94eXooYik7CiAgICB2YXIgeCA9IGQzX3h5el9sYWIoKC40MTI0NTY0ICogciArIC4zNTc1NzYxICogZyArIC4xODA0Mzc1ICogYikgLyBkM19sYWJfWCksIHkgPSBkM194eXpfbGFiKCguMjEyNjcyOSAqIHIgKyAuNzE1MTUyMiAqIGcgKyAuMDcyMTc1ICogYikgLyBkM19sYWJfWSksIHogPSBkM194eXpfbGFiKCguMDE5MzMzOSAqIHIgKyAuMTE5MTkyICogZyArIC45NTAzMDQxICogYikgLyBkM19sYWJfWik7CiAgICByZXR1cm4gZDNfbGFiKDExNiAqIHkgLSAxNiwgNTAwICogKHggLSB5KSwgMjAwICogKHkgLSB6KSk7CiAgfQogIGZ1bmN0aW9uIGQzX3JnYl94eXoocikgewogICAgcmV0dXJuIChyIC89IDI1NSkgPD0gLjA0MDQ1ID8gciAvIDEyLjkyIDogTWF0aC5wb3coKHIgKyAuMDU1KSAvIDEuMDU1LCAyLjQpOwogIH0KICBmdW5jdGlvbiBkM19yZ2JfcGFyc2VOdW1iZXIoYykgewogICAgdmFyIGYgPSBwYXJzZUZsb2F0KGMpOwogICAgcmV0dXJuIGMuY2hhckF0KGMubGVuZ3RoIC0gMSkgPT09ICIlIiA/IE1hdGgucm91bmQoZiAqIDIuNTUpIDogZjsKICB9CiAgdmFyIGQzX3JnYl9uYW1lcyA9IGQzLm1hcCh7CiAgICBhbGljZWJsdWU6ICIjZjBmOGZmIiwKICAgIGFudGlxdWV3aGl0ZTogIiNmYWViZDciLAogICAgYXF1YTogIiMwMGZmZmYiLAogICAgYXF1YW1hcmluZTogIiM3ZmZmZDQiLAogICAgYXp1cmU6ICIjZjBmZmZmIiwKICAgIGJlaWdlOiAiI2Y1ZjVkYyIsCiAgICBiaXNxdWU6ICIjZmZlNGM0IiwKICAgIGJsYWNrOiAiIzAwMDAwMCIsCiAgICBibGFuY2hlZGFsbW9uZDogIiNmZmViY2QiLAogICAgYmx1ZTogIiMwMDAwZmYiLAogICAgYmx1ZXZpb2xldDogIiM4YTJiZTIiLAogICAgYnJvd246ICIjYTUyYTJhIiwKICAgIGJ1cmx5d29vZDogIiNkZWI4ODciLAogICAgY2FkZXRibHVlOiAiIzVmOWVhMCIsCiAgICBjaGFydHJldXNlOiAiIzdmZmYwMCIsCiAgICBjaG9jb2xhdGU6ICIjZDI2OTFlIiwKICAgIGNvcmFsOiAiI2ZmN2Y1MCIsCiAgICBjb3JuZmxvd2VyYmx1ZTogIiM2NDk1ZWQiLAogICAgY29ybnNpbGs6ICIjZmZmOGRjIiwKICAgIGNyaW1zb246ICIjZGMxNDNjIiwKICAgIGN5YW46ICIjMDBmZmZmIiwKICAgIGRhcmtibHVlOiAiIzAwMDA4YiIsCiAgICBkYXJrY3lhbjogIiMwMDhiOGIiLAogICAgZGFya2dvbGRlbnJvZDogIiNiODg2MGIiLAogICAgZGFya2dyYXk6ICIjYTlhOWE5IiwKICAgIGRhcmtncmVlbjogIiMwMDY0MDAiLAogICAgZGFya2dyZXk6ICIjYTlhOWE5IiwKICAgIGRhcmtraGFraTogIiNiZGI3NmIiLAogICAgZGFya21hZ2VudGE6ICIjOGIwMDhiIiwKICAgIGRhcmtvbGl2ZWdyZWVuOiAiIzU1NmIyZiIsCiAgICBkYXJrb3JhbmdlOiAiI2ZmOGMwMCIsCiAgICBkYXJrb3JjaGlkOiAiIzk5MzJjYyIsCiAgICBkYXJrcmVkOiAiIzhiMDAwMCIsCiAgICBkYXJrc2FsbW9uOiAiI2U5OTY3YSIsCiAgICBkYXJrc2VhZ3JlZW46ICIjOGZiYzhmIiwKICAgIGRhcmtzbGF0ZWJsdWU6ICIjNDgzZDhiIiwKICAgIGRhcmtzbGF0ZWdyYXk6ICIjMmY0ZjRmIiwKICAgIGRhcmtzbGF0ZWdyZXk6ICIjMmY0ZjRmIiwKICAgIGRhcmt0dXJxdW9pc2U6ICIjMDBjZWQxIiwKICAgIGRhcmt2aW9sZXQ6ICIjOTQwMGQzIiwKICAgIGRlZXBwaW5rOiAiI2ZmMTQ5MyIsCiAgICBkZWVwc2t5Ymx1ZTogIiMwMGJmZmYiLAogICAgZGltZ3JheTogIiM2OTY5NjkiLAogICAgZGltZ3JleTogIiM2OTY5NjkiLAogICAgZG9kZ2VyYmx1ZTogIiMxZTkwZmYiLAogICAgZmlyZWJyaWNrOiAiI2IyMjIyMiIsCiAgICBmbG9yYWx3aGl0ZTogIiNmZmZhZjAiLAogICAgZm9yZXN0Z3JlZW46ICIjMjI4YjIyIiwKICAgIGZ1Y2hzaWE6ICIjZmYwMGZmIiwKICAgIGdhaW5zYm9ybzogIiNkY2RjZGMiLAogICAgZ2hvc3R3aGl0ZTogIiNmOGY4ZmYiLAogICAgZ29sZDogIiNmZmQ3MDAiLAogICAgZ29sZGVucm9kOiAiI2RhYTUyMCIsCiAgICBncmF5OiAiIzgwODA4MCIsCiAgICBncmVlbjogIiMwMDgwMDAiLAogICAgZ3JlZW55ZWxsb3c6ICIjYWRmZjJmIiwKICAgIGdyZXk6ICIjODA4MDgwIiwKICAgIGhvbmV5ZGV3OiAiI2YwZmZmMCIsCiAgICBob3RwaW5rOiAiI2ZmNjliNCIsCiAgICBpbmRpYW5yZWQ6ICIjY2Q1YzVjIiwKICAgIGluZGlnbzogIiM0YjAwODIiLAogICAgaXZvcnk6ICIjZmZmZmYwIiwKICAgIGtoYWtpOiAiI2YwZTY4YyIsCiAgICBsYXZlbmRlcjogIiNlNmU2ZmEiLAogICAgbGF2ZW5kZXJibHVzaDogIiNmZmYwZjUiLAogICAgbGF3bmdyZWVuOiAiIzdjZmMwMCIsCiAgICBsZW1vbmNoaWZmb246ICIjZmZmYWNkIiwKICAgIGxpZ2h0Ymx1ZTogIiNhZGQ4ZTYiLAogICAgbGlnaHRjb3JhbDogIiNmMDgwODAiLAogICAgbGlnaHRjeWFuOiAiI2UwZmZmZiIsCiAgICBsaWdodGdvbGRlbnJvZHllbGxvdzogIiNmYWZhZDIiLAogICAgbGlnaHRncmF5OiAiI2QzZDNkMyIsCiAgICBsaWdodGdyZWVuOiAiIzkwZWU5MCIsCiAgICBsaWdodGdyZXk6ICIjZDNkM2QzIiwKICAgIGxpZ2h0cGluazogIiNmZmI2YzEiLAogICAgbGlnaHRzYWxtb246ICIjZmZhMDdhIiwKICAgIGxpZ2h0c2VhZ3JlZW46ICIjMjBiMmFhIiwKICAgIGxpZ2h0c2t5Ymx1ZTogIiM4N2NlZmEiLAogICAgbGlnaHRzbGF0ZWdyYXk6ICIjNzc4ODk5IiwKICAgIGxpZ2h0c2xhdGVncmV5OiAiIzc3ODg5OSIsCiAgICBsaWdodHN0ZWVsYmx1ZTogIiNiMGM0ZGUiLAogICAgbGlnaHR5ZWxsb3c6ICIjZmZmZmUwIiwKICAgIGxpbWU6ICIjMDBmZjAwIiwKICAgIGxpbWVncmVlbjogIiMzMmNkMzIiLAogICAgbGluZW46ICIjZmFmMGU2IiwKICAgIG1hZ2VudGE6ICIjZmYwMGZmIiwKICAgIG1hcm9vbjogIiM4MDAwMDAiLAogICAgbWVkaXVtYXF1YW1hcmluZTogIiM2NmNkYWEiLAogICAgbWVkaXVtYmx1ZTogIiMwMDAwY2QiLAogICAgbWVkaXVtb3JjaGlkOiAiI2JhNTVkMyIsCiAgICBtZWRpdW1wdXJwbGU6ICIjOTM3MGRiIiwKICAgIG1lZGl1bXNlYWdyZWVuOiAiIzNjYjM3MSIsCiAgICBtZWRpdW1zbGF0ZWJsdWU6ICIjN2I2OGVlIiwKICAgIG1lZGl1bXNwcmluZ2dyZWVuOiAiIzAwZmE5YSIsCiAgICBtZWRpdW10dXJxdW9pc2U6ICIjNDhkMWNjIiwKICAgIG1lZGl1bXZpb2xldHJlZDogIiNjNzE1ODUiLAogICAgbWlkbmlnaHRibHVlOiAiIzE5MTk3MCIsCiAgICBtaW50Y3JlYW06ICIjZjVmZmZhIiwKICAgIG1pc3R5cm9zZTogIiNmZmU0ZTEiLAogICAgbW9jY2FzaW46ICIjZmZlNGI1IiwKICAgIG5hdmFqb3doaXRlOiAiI2ZmZGVhZCIsCiAgICBuYXZ5OiAiIzAwMDA4MCIsCiAgICBvbGRsYWNlOiAiI2ZkZjVlNiIsCiAgICBvbGl2ZTogIiM4MDgwMDAiLAogICAgb2xpdmVkcmFiOiAiIzZiOGUyMyIsCiAgICBvcmFuZ2U6ICIjZmZhNTAwIiwKICAgIG9yYW5nZXJlZDogIiNmZjQ1MDAiLAogICAgb3JjaGlkOiAiI2RhNzBkNiIsCiAgICBwYWxlZ29sZGVucm9kOiAiI2VlZThhYSIsCiAgICBwYWxlZ3JlZW46ICIjOThmYjk4IiwKICAgIHBhbGV0dXJxdW9pc2U6ICIjYWZlZWVlIiwKICAgIHBhbGV2aW9sZXRyZWQ6ICIjZGI3MDkzIiwKICAgIHBhcGF5YXdoaXA6ICIjZmZlZmQ1IiwKICAgIHBlYWNocHVmZjogIiNmZmRhYjkiLAogICAgcGVydTogIiNjZDg1M2YiLAogICAgcGluazogIiNmZmMwY2IiLAogICAgcGx1bTogIiNkZGEwZGQiLAogICAgcG93ZGVyYmx1ZTogIiNiMGUwZTYiLAogICAgcHVycGxlOiAiIzgwMDA4MCIsCiAgICByZWQ6ICIjZmYwMDAwIiwKICAgIHJvc3licm93bjogIiNiYzhmOGYiLAogICAgcm95YWxibHVlOiAiIzQxNjllMSIsCiAgICBzYWRkbGVicm93bjogIiM4YjQ1MTMiLAogICAgc2FsbW9uOiAiI2ZhODA3MiIsCiAgICBzYW5keWJyb3duOiAiI2Y0YTQ2MCIsCiAgICBzZWFncmVlbjogIiMyZThiNTciLAogICAgc2Vhc2hlbGw6ICIjZmZmNWVlIiwKICAgIHNpZW5uYTogIiNhMDUyMmQiLAogICAgc2lsdmVyOiAiI2MwYzBjMCIsCiAgICBza3libHVlOiAiIzg3Y2VlYiIsCiAgICBzbGF0ZWJsdWU6ICIjNmE1YWNkIiwKICAgIHNsYXRlZ3JheTogIiM3MDgwOTAiLAogICAgc2xhdGVncmV5OiAiIzcwODA5MCIsCiAgICBzbm93OiAiI2ZmZmFmYSIsCiAgICBzcHJpbmdncmVlbjogIiMwMGZmN2YiLAogICAgc3RlZWxibHVlOiAiIzQ2ODJiNCIsCiAgICB0YW46ICIjZDJiNDhjIiwKICAgIHRlYWw6ICIjMDA4MDgwIiwKICAgIHRoaXN0bGU6ICIjZDhiZmQ4IiwKICAgIHRvbWF0bzogIiNmZjYzNDciLAogICAgdHVycXVvaXNlOiAiIzQwZTBkMCIsCiAgICB2aW9sZXQ6ICIjZWU4MmVlIiwKICAgIHdoZWF0OiAiI2Y1ZGViMyIsCiAgICB3aGl0ZTogIiNmZmZmZmYiLAogICAgd2hpdGVzbW9rZTogIiNmNWY1ZjUiLAogICAgeWVsbG93OiAiI2ZmZmYwMCIsCiAgICB5ZWxsb3dncmVlbjogIiM5YWNkMzIiCiAgfSk7CiAgZDNfcmdiX25hbWVzLmZvckVhY2goZnVuY3Rpb24oa2V5LCB2YWx1ZSkgewogICAgZDNfcmdiX25hbWVzLnNldChrZXksIGQzX3JnYl9wYXJzZSh2YWx1ZSwgZDNfcmdiLCBkM19oc2xfcmdiKSk7CiAgfSk7CiAgZnVuY3Rpb24gZDNfZnVuY3Rvcih2KSB7CiAgICByZXR1cm4gdHlwZW9mIHYgPT09ICJmdW5jdGlvbiIgPyB2IDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB2OwogICAgfTsKICB9CiAgZDMuZnVuY3RvciA9IGQzX2Z1bmN0b3I7CiAgZnVuY3Rpb24gZDNfaWRlbnRpdHkoZCkgewogICAgcmV0dXJuIGQ7CiAgfQogIGQzLnhociA9IGZ1bmN0aW9uKHVybCwgbWltZVR5cGUsIGNhbGxiYWNrKSB7CiAgICB2YXIgeGhyID0ge30sIGRpc3BhdGNoID0gZDMuZGlzcGF0Y2goInByb2dyZXNzIiwgImxvYWQiLCAiZXJyb3IiKSwgaGVhZGVycyA9IHt9LCByZXNwb25zZSA9IGQzX2lkZW50aXR5LCByZXF1ZXN0ID0gbmV3IChkM193aW5kb3cuWERvbWFpblJlcXVlc3QgJiYgL14oaHR0cChzKT86KT9cL1wvLy50ZXN0KHVybCkgPyBYRG9tYWluUmVxdWVzdCA6IFhNTEh0dHBSZXF1ZXN0KSgpOwogICAgIm9ubG9hZCIgaW4gcmVxdWVzdCA/IHJlcXVlc3Qub25sb2FkID0gcmVxdWVzdC5vbmVycm9yID0gcmVzcG9uZCA6IHJlcXVlc3Qub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7CiAgICAgIHJlcXVlc3QucmVhZHlTdGF0ZSA+IDMgJiYgcmVzcG9uZCgpOwogICAgfTsKICAgIGZ1bmN0aW9uIHJlc3BvbmQoKSB7CiAgICAgIHZhciBzID0gcmVxdWVzdC5zdGF0dXM7CiAgICAgICFzICYmIHJlcXVlc3QucmVzcG9uc2VUZXh0IHx8IHMgPj0gMjAwICYmIHMgPCAzMDAgfHwgcyA9PT0gMzA0ID8gZGlzcGF0Y2gubG9hZC5jYWxsKHhociwgcmVzcG9uc2UuY2FsbCh4aHIsIHJlcXVlc3QpKSA6IGRpc3BhdGNoLmVycm9yLmNhbGwoeGhyLCByZXF1ZXN0KTsKICAgIH0KICAgIHJlcXVlc3Qub25wcm9ncmVzcyA9IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgIHZhciBvID0gZDMuZXZlbnQ7CiAgICAgIGQzLmV2ZW50ID0gZXZlbnQ7CiAgICAgIHRyeSB7CiAgICAgICAgZGlzcGF0Y2gucHJvZ3Jlc3MuY2FsbCh4aHIsIHJlcXVlc3QpOwogICAgICB9IGZpbmFsbHkgewogICAgICAgIGQzLmV2ZW50ID0gbzsKICAgICAgfQogICAgfTsKICAgIHhoci5oZWFkZXIgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkgewogICAgICBuYW1lID0gKG5hbWUgKyAiIikudG9Mb3dlckNhc2UoKTsKICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSByZXR1cm4gaGVhZGVyc1tuYW1lXTsKICAgICAgaWYgKHZhbHVlID09IG51bGwpIGRlbGV0ZSBoZWFkZXJzW25hbWVdOyBlbHNlIGhlYWRlcnNbbmFtZV0gPSB2YWx1ZSArICIiOwogICAgICByZXR1cm4geGhyOwogICAgfTsKICAgIHhoci5taW1lVHlwZSA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIG1pbWVUeXBlOwogICAgICBtaW1lVHlwZSA9IHZhbHVlID09IG51bGwgPyBudWxsIDogdmFsdWUgKyAiIjsKICAgICAgcmV0dXJuIHhocjsKICAgIH07CiAgICB4aHIucmVzcG9uc2UgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICByZXNwb25zZSA9IHZhbHVlOwogICAgICByZXR1cm4geGhyOwogICAgfTsKICAgIFsgImdldCIsICJwb3N0IiBdLmZvckVhY2goZnVuY3Rpb24obWV0aG9kKSB7CiAgICAgIHhoclttZXRob2RdID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHhoci5zZW5kLmFwcGx5KHhociwgWyBtZXRob2QgXS5jb25jYXQoZDNfYXJyYXkoYXJndW1lbnRzKSkpOwogICAgICB9OwogICAgfSk7CiAgICB4aHIuc2VuZCA9IGZ1bmN0aW9uKG1ldGhvZCwgZGF0YSwgY2FsbGJhY2spIHsKICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIgJiYgdHlwZW9mIGRhdGEgPT09ICJmdW5jdGlvbiIpIGNhbGxiYWNrID0gZGF0YSwgZGF0YSA9IG51bGw7CiAgICAgIHJlcXVlc3Qub3BlbihtZXRob2QsIHVybCwgdHJ1ZSk7CiAgICAgIGlmIChtaW1lVHlwZSAhPSBudWxsICYmICEoImFjY2VwdCIgaW4gaGVhZGVycykpIGhlYWRlcnNbImFjY2VwdCJdID0gbWltZVR5cGUgKyAiLCovKiI7CiAgICAgIGlmIChyZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIpIGZvciAodmFyIG5hbWUgaW4gaGVhZGVycykgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKG5hbWUsIGhlYWRlcnNbbmFtZV0pOwogICAgICBpZiAobWltZVR5cGUgIT0gbnVsbCAmJiByZXF1ZXN0Lm92ZXJyaWRlTWltZVR5cGUpIHJlcXVlc3Qub3ZlcnJpZGVNaW1lVHlwZShtaW1lVHlwZSk7CiAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB4aHIub24oImVycm9yIiwgY2FsbGJhY2spLm9uKCJsb2FkIiwgZnVuY3Rpb24ocmVxdWVzdCkgewogICAgICAgIGNhbGxiYWNrKG51bGwsIHJlcXVlc3QpOwogICAgICB9KTsKICAgICAgcmVxdWVzdC5zZW5kKGRhdGEgPT0gbnVsbCA/IG51bGwgOiBkYXRhKTsKICAgICAgcmV0dXJuIHhocjsKICAgIH07CiAgICB4aHIuYWJvcnQgPSBmdW5jdGlvbigpIHsKICAgICAgcmVxdWVzdC5hYm9ydCgpOwogICAgICByZXR1cm4geGhyOwogICAgfTsKICAgIGQzLnJlYmluZCh4aHIsIGRpc3BhdGNoLCAib24iKTsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyICYmIHR5cGVvZiBtaW1lVHlwZSA9PT0gImZ1bmN0aW9uIikgY2FsbGJhY2sgPSBtaW1lVHlwZSwgCiAgICBtaW1lVHlwZSA9IG51bGw7CiAgICByZXR1cm4gY2FsbGJhY2sgPT0gbnVsbCA/IHhociA6IHhoci5nZXQoZDNfeGhyX2ZpeENhbGxiYWNrKGNhbGxiYWNrKSk7CiAgfTsKICBmdW5jdGlvbiBkM194aHJfZml4Q2FsbGJhY2soY2FsbGJhY2spIHsKICAgIHJldHVybiBjYWxsYmFjay5sZW5ndGggPT09IDEgPyBmdW5jdGlvbihlcnJvciwgcmVxdWVzdCkgewogICAgICBjYWxsYmFjayhlcnJvciA9PSBudWxsID8gcmVxdWVzdCA6IG51bGwpOwogICAgfSA6IGNhbGxiYWNrOwogIH0KICBmdW5jdGlvbiBkM19kc3YoZGVsaW1pdGVyLCBtaW1lVHlwZSkgewogICAgdmFyIHJlRm9ybWF0ID0gbmV3IFJlZ0V4cCgnWyInICsgZGVsaW1pdGVyICsgIlxuXSIpLCBkZWxpbWl0ZXJDb2RlID0gZGVsaW1pdGVyLmNoYXJDb2RlQXQoMCk7CiAgICBmdW5jdGlvbiBkc3YodXJsLCByb3csIGNhbGxiYWNrKSB7CiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMykgY2FsbGJhY2sgPSByb3csIHJvdyA9IG51bGw7CiAgICAgIHZhciB4aHIgPSBkMy54aHIodXJsLCBtaW1lVHlwZSwgY2FsbGJhY2spOwogICAgICB4aHIucm93ID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8geGhyLnJlc3BvbnNlKChyb3cgPSBfKSA9PSBudWxsID8gcmVzcG9uc2UgOiB0eXBlZFJlc3BvbnNlKF8pKSA6IHJvdzsKICAgICAgfTsKICAgICAgcmV0dXJuIHhoci5yb3cocm93KTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlc3BvbnNlKHJlcXVlc3QpIHsKICAgICAgcmV0dXJuIGRzdi5wYXJzZShyZXF1ZXN0LnJlc3BvbnNlVGV4dCk7CiAgICB9CiAgICBmdW5jdGlvbiB0eXBlZFJlc3BvbnNlKGYpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHJlcXVlc3QpIHsKICAgICAgICByZXR1cm4gZHN2LnBhcnNlKHJlcXVlc3QucmVzcG9uc2VUZXh0LCBmKTsKICAgICAgfTsKICAgIH0KICAgIGRzdi5wYXJzZSA9IGZ1bmN0aW9uKHRleHQsIGYpIHsKICAgICAgdmFyIG87CiAgICAgIHJldHVybiBkc3YucGFyc2VSb3dzKHRleHQsIGZ1bmN0aW9uKHJvdywgaSkgewogICAgICAgIGlmIChvKSByZXR1cm4gbyhyb3csIGkgLSAxKTsKICAgICAgICB2YXIgYSA9IG5ldyBGdW5jdGlvbigiZCIsICJyZXR1cm4geyIgKyByb3cubWFwKGZ1bmN0aW9uKG5hbWUsIGkpIHsKICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShuYW1lKSArICI6IGRbIiArIGkgKyAiXSI7CiAgICAgICAgfSkuam9pbigiLCIpICsgIn0iKTsKICAgICAgICBvID0gZiA/IGZ1bmN0aW9uKHJvdywgaSkgewogICAgICAgICAgcmV0dXJuIGYoYShyb3cpLCBpKTsKICAgICAgICB9IDogYTsKICAgICAgfSk7CiAgICB9OwogICAgZHN2LnBhcnNlUm93cyA9IGZ1bmN0aW9uKHRleHQsIGYpIHsKICAgICAgdmFyIEVPTCA9IHt9LCBFT0YgPSB7fSwgcm93cyA9IFtdLCBOID0gdGV4dC5sZW5ndGgsIEkgPSAwLCBuID0gMCwgdCwgZW9sOwogICAgICBmdW5jdGlvbiB0b2tlbigpIHsKICAgICAgICBpZiAoSSA+PSBOKSByZXR1cm4gRU9GOwogICAgICAgIGlmIChlb2wpIHJldHVybiBlb2wgPSBmYWxzZSwgRU9MOwogICAgICAgIHZhciBqID0gSTsKICAgICAgICBpZiAodGV4dC5jaGFyQ29kZUF0KGopID09PSAzNCkgewogICAgICAgICAgdmFyIGkgPSBqOwogICAgICAgICAgd2hpbGUgKGkrKyA8IE4pIHsKICAgICAgICAgICAgaWYgKHRleHQuY2hhckNvZGVBdChpKSA9PT0gMzQpIHsKICAgICAgICAgICAgICBpZiAodGV4dC5jaGFyQ29kZUF0KGkgKyAxKSAhPT0gMzQpIGJyZWFrOwogICAgICAgICAgICAgICsraTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgSSA9IGkgKyAyOwogICAgICAgICAgdmFyIGMgPSB0ZXh0LmNoYXJDb2RlQXQoaSArIDEpOwogICAgICAgICAgaWYgKGMgPT09IDEzKSB7CiAgICAgICAgICAgIGVvbCA9IHRydWU7CiAgICAgICAgICAgIGlmICh0ZXh0LmNoYXJDb2RlQXQoaSArIDIpID09PSAxMCkgKytJOwogICAgICAgICAgfSBlbHNlIGlmIChjID09PSAxMCkgewogICAgICAgICAgICBlb2wgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHRleHQuc3Vic3RyaW5nKGogKyAxLCBpKS5yZXBsYWNlKC8iIi9nLCAnIicpOwogICAgICAgIH0KICAgICAgICB3aGlsZSAoSSA8IE4pIHsKICAgICAgICAgIHZhciBjID0gdGV4dC5jaGFyQ29kZUF0KEkrKyksIGsgPSAxOwogICAgICAgICAgaWYgKGMgPT09IDEwKSBlb2wgPSB0cnVlOyBlbHNlIGlmIChjID09PSAxMykgewogICAgICAgICAgICBlb2wgPSB0cnVlOwogICAgICAgICAgICBpZiAodGV4dC5jaGFyQ29kZUF0KEkpID09PSAxMCkgKytJLCArK2s7CiAgICAgICAgICB9IGVsc2UgaWYgKGMgIT09IGRlbGltaXRlckNvZGUpIGNvbnRpbnVlOwogICAgICAgICAgcmV0dXJuIHRleHQuc3Vic3RyaW5nKGosIEkgLSBrKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRleHQuc3Vic3RyaW5nKGopOwogICAgICB9CiAgICAgIHdoaWxlICgodCA9IHRva2VuKCkpICE9PSBFT0YpIHsKICAgICAgICB2YXIgYSA9IFtdOwogICAgICAgIHdoaWxlICh0ICE9PSBFT0wgJiYgdCAhPT0gRU9GKSB7CiAgICAgICAgICBhLnB1c2godCk7CiAgICAgICAgICB0ID0gdG9rZW4oKTsKICAgICAgICB9CiAgICAgICAgaWYgKGYgJiYgIShhID0gZihhLCBuKyspKSkgY29udGludWU7CiAgICAgICAgcm93cy5wdXNoKGEpOwogICAgICB9CiAgICAgIHJldHVybiByb3dzOwogICAgfTsKICAgIGRzdi5mb3JtYXQgPSBmdW5jdGlvbihyb3dzKSB7CiAgICAgIGlmIChBcnJheS5pc0FycmF5KHJvd3NbMF0pKSByZXR1cm4gZHN2LmZvcm1hdFJvd3Mocm93cyk7CiAgICAgIHZhciBmaWVsZFNldCA9IG5ldyBkM19TZXQoKSwgZmllbGRzID0gW107CiAgICAgIHJvd3MuZm9yRWFjaChmdW5jdGlvbihyb3cpIHsKICAgICAgICBmb3IgKHZhciBmaWVsZCBpbiByb3cpIHsKICAgICAgICAgIGlmICghZmllbGRTZXQuaGFzKGZpZWxkKSkgewogICAgICAgICAgICBmaWVsZHMucHVzaChmaWVsZFNldC5hZGQoZmllbGQpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0pOwogICAgICByZXR1cm4gWyBmaWVsZHMubWFwKGZvcm1hdFZhbHVlKS5qb2luKGRlbGltaXRlcikgXS5jb25jYXQocm93cy5tYXAoZnVuY3Rpb24ocm93KSB7CiAgICAgICAgcmV0dXJuIGZpZWxkcy5tYXAoZnVuY3Rpb24oZmllbGQpIHsKICAgICAgICAgIHJldHVybiBmb3JtYXRWYWx1ZShyb3dbZmllbGRdKTsKICAgICAgICB9KS5qb2luKGRlbGltaXRlcik7CiAgICAgIH0pKS5qb2luKCJcbiIpOwogICAgfTsKICAgIGRzdi5mb3JtYXRSb3dzID0gZnVuY3Rpb24ocm93cykgewogICAgICByZXR1cm4gcm93cy5tYXAoZm9ybWF0Um93KS5qb2luKCJcbiIpOwogICAgfTsKICAgIGZ1bmN0aW9uIGZvcm1hdFJvdyhyb3cpIHsKICAgICAgcmV0dXJuIHJvdy5tYXAoZm9ybWF0VmFsdWUpLmpvaW4oZGVsaW1pdGVyKTsKICAgIH0KICAgIGZ1bmN0aW9uIGZvcm1hdFZhbHVlKHRleHQpIHsKICAgICAgcmV0dXJuIHJlRm9ybWF0LnRlc3QodGV4dCkgPyAnIicgKyB0ZXh0LnJlcGxhY2UoL1wiL2csICciIicpICsgJyInIDogdGV4dDsKICAgIH0KICAgIHJldHVybiBkc3Y7CiAgfQogIGQzLmNzdiA9IGQzX2RzdigiLCIsICJ0ZXh0L2NzdiIpOwogIGQzLnRzdiA9IGQzX2RzdigiCSIsICJ0ZXh0L3RhYi1zZXBhcmF0ZWQtdmFsdWVzIik7CiAgdmFyIGQzX3RpbWVyX2lkID0gMCwgZDNfdGltZXJfYnlJZCA9IHt9LCBkM190aW1lcl9xdWV1ZSA9IG51bGwsIGQzX3RpbWVyX2ludGVydmFsLCBkM190aW1lcl90aW1lb3V0OwogIGQzLnRpbWVyID0gZnVuY3Rpb24oY2FsbGJhY2ssIGRlbGF5LCB0aGVuKSB7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDMpIHsKICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSBkZWxheSA9IDA7IGVsc2UgaWYgKCFpc0Zpbml0ZShkZWxheSkpIHJldHVybjsKICAgICAgdGhlbiA9IERhdGUubm93KCk7CiAgICB9CiAgICB2YXIgdGltZXIgPSBkM190aW1lcl9ieUlkW2NhbGxiYWNrLmlkXTsKICAgIGlmICh0aW1lciAmJiB0aW1lci5jYWxsYmFjayA9PT0gY2FsbGJhY2spIHsKICAgICAgdGltZXIudGhlbiA9IHRoZW47CiAgICAgIHRpbWVyLmRlbGF5ID0gZGVsYXk7CiAgICB9IGVsc2UgZDNfdGltZXJfYnlJZFtjYWxsYmFjay5pZCA9ICsrZDNfdGltZXJfaWRdID0gZDNfdGltZXJfcXVldWUgPSB7CiAgICAgIGNhbGxiYWNrOiBjYWxsYmFjaywKICAgICAgdGhlbjogdGhlbiwKICAgICAgZGVsYXk6IGRlbGF5LAogICAgICBuZXh0OiBkM190aW1lcl9xdWV1ZQogICAgfTsKICAgIGlmICghZDNfdGltZXJfaW50ZXJ2YWwpIHsKICAgICAgZDNfdGltZXJfdGltZW91dCA9IGNsZWFyVGltZW91dChkM190aW1lcl90aW1lb3V0KTsKICAgICAgZDNfdGltZXJfaW50ZXJ2YWwgPSAxOwogICAgICBkM190aW1lcl9mcmFtZShkM190aW1lcl9zdGVwKTsKICAgIH0KICB9OwogIGZ1bmN0aW9uIGQzX3RpbWVyX3N0ZXAoKSB7CiAgICB2YXIgZWxhcHNlZCwgbm93ID0gRGF0ZS5ub3coKSwgdDEgPSBkM190aW1lcl9xdWV1ZTsKICAgIHdoaWxlICh0MSkgewogICAgICBlbGFwc2VkID0gbm93IC0gdDEudGhlbjsKICAgICAgaWYgKGVsYXBzZWQgPj0gdDEuZGVsYXkpIHQxLmZsdXNoID0gdDEuY2FsbGJhY2soZWxhcHNlZCk7CiAgICAgIHQxID0gdDEubmV4dDsKICAgIH0KICAgIHZhciBkZWxheSA9IGQzX3RpbWVyX2ZsdXNoKCkgLSBub3c7CiAgICBpZiAoZGVsYXkgPiAyNCkgewogICAgICBpZiAoaXNGaW5pdGUoZGVsYXkpKSB7CiAgICAgICAgY2xlYXJUaW1lb3V0KGQzX3RpbWVyX3RpbWVvdXQpOwogICAgICAgIGQzX3RpbWVyX3RpbWVvdXQgPSBzZXRUaW1lb3V0KGQzX3RpbWVyX3N0ZXAsIGRlbGF5KTsKICAgICAgfQogICAgICBkM190aW1lcl9pbnRlcnZhbCA9IDA7CiAgICB9IGVsc2UgewogICAgICBkM190aW1lcl9pbnRlcnZhbCA9IDE7CiAgICAgIGQzX3RpbWVyX2ZyYW1lKGQzX3RpbWVyX3N0ZXApOwogICAgfQogIH0KICBkMy50aW1lci5mbHVzaCA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGVsYXBzZWQsIG5vdyA9IERhdGUubm93KCksIHQxID0gZDNfdGltZXJfcXVldWU7CiAgICB3aGlsZSAodDEpIHsKICAgICAgZWxhcHNlZCA9IG5vdyAtIHQxLnRoZW47CiAgICAgIGlmICghdDEuZGVsYXkpIHQxLmZsdXNoID0gdDEuY2FsbGJhY2soZWxhcHNlZCk7CiAgICAgIHQxID0gdDEubmV4dDsKICAgIH0KICAgIGQzX3RpbWVyX2ZsdXNoKCk7CiAgfTsKICBmdW5jdGlvbiBkM190aW1lcl9mbHVzaCgpIHsKICAgIHZhciB0MCA9IG51bGwsIHQxID0gZDNfdGltZXJfcXVldWUsIHRoZW4gPSBJbmZpbml0eTsKICAgIHdoaWxlICh0MSkgewogICAgICBpZiAodDEuZmx1c2gpIHsKICAgICAgICBkZWxldGUgZDNfdGltZXJfYnlJZFt0MS5jYWxsYmFjay5pZF07CiAgICAgICAgdDEgPSB0MCA/IHQwLm5leHQgPSB0MS5uZXh0IDogZDNfdGltZXJfcXVldWUgPSB0MS5uZXh0OwogICAgICB9IGVsc2UgewogICAgICAgIHRoZW4gPSBNYXRoLm1pbih0aGVuLCB0MS50aGVuICsgdDEuZGVsYXkpOwogICAgICAgIHQxID0gKHQwID0gdDEpLm5leHQ7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0aGVuOwogIH0KICB2YXIgZDNfdGltZXJfZnJhbWUgPSBkM193aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8IGQzX3dpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgZDNfd2luZG93Lm1velJlcXVlc3RBbmltYXRpb25GcmFtZSB8fCBkM193aW5kb3cub1JlcXVlc3RBbmltYXRpb25GcmFtZSB8fCBkM193aW5kb3cubXNSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgZnVuY3Rpb24oY2FsbGJhY2spIHsKICAgIHNldFRpbWVvdXQoY2FsbGJhY2ssIDE3KTsKICB9OwogIHZhciBkM19mb3JtYXRfZGVjaW1hbFBvaW50ID0gIi4iLCBkM19mb3JtYXRfdGhvdXNhbmRzU2VwYXJhdG9yID0gIiwiLCBkM19mb3JtYXRfZ3JvdXBpbmcgPSBbIDMsIDMgXTsKICB2YXIgZDNfZm9ybWF0UHJlZml4ZXMgPSBbICJ5IiwgInoiLCAiYSIsICJmIiwgInAiLCAibiIsICLCtSIsICJtIiwgIiIsICJrIiwgIk0iLCAiRyIsICJUIiwgIlAiLCAiRSIsICJaIiwgIlkiIF0ubWFwKGQzX2Zvcm1hdFByZWZpeCk7CiAgZDMuZm9ybWF0UHJlZml4ID0gZnVuY3Rpb24odmFsdWUsIHByZWNpc2lvbikgewogICAgdmFyIGkgPSAwOwogICAgaWYgKHZhbHVlKSB7CiAgICAgIGlmICh2YWx1ZSA8IDApIHZhbHVlICo9IC0xOwogICAgICBpZiAocHJlY2lzaW9uKSB2YWx1ZSA9IGQzLnJvdW5kKHZhbHVlLCBkM19mb3JtYXRfcHJlY2lzaW9uKHZhbHVlLCBwcmVjaXNpb24pKTsKICAgICAgaSA9IDEgKyBNYXRoLmZsb29yKDFlLTEyICsgTWF0aC5sb2codmFsdWUpIC8gTWF0aC5MTjEwKTsKICAgICAgaSA9IE1hdGgubWF4KC0yNCwgTWF0aC5taW4oMjQsIE1hdGguZmxvb3IoKGkgPD0gMCA/IGkgKyAxIDogaSAtIDEpIC8gMykgKiAzKSk7CiAgICB9CiAgICByZXR1cm4gZDNfZm9ybWF0UHJlZml4ZXNbOCArIGkgLyAzXTsKICB9OwogIGZ1bmN0aW9uIGQzX2Zvcm1hdFByZWZpeChkLCBpKSB7CiAgICB2YXIgayA9IE1hdGgucG93KDEwLCBNYXRoLmFicyg4IC0gaSkgKiAzKTsKICAgIHJldHVybiB7CiAgICAgIHNjYWxlOiBpID4gOCA/IGZ1bmN0aW9uKGQpIHsKICAgICAgICByZXR1cm4gZCAvIGs7CiAgICAgIH0gOiBmdW5jdGlvbihkKSB7CiAgICAgICAgcmV0dXJuIGQgKiBrOwogICAgICB9LAogICAgICBzeW1ib2w6IGQKICAgIH07CiAgfQogIGQzLnJvdW5kID0gZnVuY3Rpb24oeCwgbikgewogICAgcmV0dXJuIG4gPyBNYXRoLnJvdW5kKHggKiAobiA9IE1hdGgucG93KDEwLCBuKSkpIC8gbiA6IE1hdGgucm91bmQoeCk7CiAgfTsKICBkMy5mb3JtYXQgPSBmdW5jdGlvbihzcGVjaWZpZXIpIHsKICAgIHZhciBtYXRjaCA9IGQzX2Zvcm1hdF9yZS5leGVjKHNwZWNpZmllciksIGZpbGwgPSBtYXRjaFsxXSB8fCAiICIsIGFsaWduID0gbWF0Y2hbMl0gfHwgIj4iLCBzaWduID0gbWF0Y2hbM10gfHwgIiIsIGJhc2VQcmVmaXggPSBtYXRjaFs0XSB8fCAiIiwgemZpbGwgPSBtYXRjaFs1XSwgd2lkdGggPSArbWF0Y2hbNl0sIGNvbW1hID0gbWF0Y2hbN10sIHByZWNpc2lvbiA9IG1hdGNoWzhdLCB0eXBlID0gbWF0Y2hbOV0sIHNjYWxlID0gMSwgc3VmZml4ID0gIiIsIGludGVnZXIgPSBmYWxzZTsKICAgIGlmIChwcmVjaXNpb24pIHByZWNpc2lvbiA9ICtwcmVjaXNpb24uc3Vic3RyaW5nKDEpOwogICAgaWYgKHpmaWxsIHx8IGZpbGwgPT09ICIwIiAmJiBhbGlnbiA9PT0gIj0iKSB7CiAgICAgIHpmaWxsID0gZmlsbCA9ICIwIjsKICAgICAgYWxpZ24gPSAiPSI7CiAgICAgIGlmIChjb21tYSkgd2lkdGggLT0gTWF0aC5mbG9vcigod2lkdGggLSAxKSAvIDQpOwogICAgfQogICAgc3dpdGNoICh0eXBlKSB7CiAgICAgY2FzZSAibiI6CiAgICAgIGNvbW1hID0gdHJ1ZTsKICAgICAgdHlwZSA9ICJnIjsKICAgICAgYnJlYWs7CgogICAgIGNhc2UgIiUiOgogICAgICBzY2FsZSA9IDEwMDsKICAgICAgc3VmZml4ID0gIiUiOwogICAgICB0eXBlID0gImYiOwogICAgICBicmVhazsKCiAgICAgY2FzZSAicCI6CiAgICAgIHNjYWxlID0gMTAwOwogICAgICBzdWZmaXggPSAiJSI7CiAgICAgIHR5cGUgPSAiciI7CiAgICAgIGJyZWFrOwoKICAgICBjYXNlICJiIjoKICAgICBjYXNlICJvIjoKICAgICBjYXNlICJ4IjoKICAgICBjYXNlICJYIjoKICAgICAgaWYgKGJhc2VQcmVmaXgpIGJhc2VQcmVmaXggPSAiMCIgKyB0eXBlLnRvTG93ZXJDYXNlKCk7CgogICAgIGNhc2UgImMiOgogICAgIGNhc2UgImQiOgogICAgICBpbnRlZ2VyID0gdHJ1ZTsKICAgICAgcHJlY2lzaW9uID0gMDsKICAgICAgYnJlYWs7CgogICAgIGNhc2UgInMiOgogICAgICBzY2FsZSA9IC0xOwogICAgICB0eXBlID0gInIiOwogICAgICBicmVhazsKICAgIH0KICAgIGlmIChiYXNlUHJlZml4ID09PSAiIyIpIGJhc2VQcmVmaXggPSAiIjsKICAgIGlmICh0eXBlID09ICJyIiAmJiAhcHJlY2lzaW9uKSB0eXBlID0gImciOwogICAgaWYgKHByZWNpc2lvbiAhPSBudWxsKSB7CiAgICAgIGlmICh0eXBlID09ICJnIikgcHJlY2lzaW9uID0gTWF0aC5tYXgoMSwgTWF0aC5taW4oMjEsIHByZWNpc2lvbikpOyBlbHNlIGlmICh0eXBlID09ICJlIiB8fCB0eXBlID09ICJmIikgcHJlY2lzaW9uID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMjAsIHByZWNpc2lvbikpOwogICAgfQogICAgdHlwZSA9IGQzX2Zvcm1hdF90eXBlcy5nZXQodHlwZSkgfHwgZDNfZm9ybWF0X3R5cGVEZWZhdWx0OwogICAgdmFyIHpjb21tYSA9IHpmaWxsICYmIGNvbW1hOwogICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIGlmIChpbnRlZ2VyICYmIHZhbHVlICUgMSkgcmV0dXJuICIiOwogICAgICB2YXIgbmVnYXRpdmUgPSB2YWx1ZSA8IDAgfHwgdmFsdWUgPT09IDAgJiYgMSAvIHZhbHVlIDwgMCA/ICh2YWx1ZSA9IC12YWx1ZSwgIi0iKSA6IHNpZ247CiAgICAgIGlmIChzY2FsZSA8IDApIHsKICAgICAgICB2YXIgcHJlZml4ID0gZDMuZm9ybWF0UHJlZml4KHZhbHVlLCBwcmVjaXNpb24pOwogICAgICAgIHZhbHVlID0gcHJlZml4LnNjYWxlKHZhbHVlKTsKICAgICAgICBzdWZmaXggPSBwcmVmaXguc3ltYm9sOwogICAgICB9IGVsc2UgewogICAgICAgIHZhbHVlICo9IHNjYWxlOwogICAgICB9CiAgICAgIHZhbHVlID0gdHlwZSh2YWx1ZSwgcHJlY2lzaW9uKTsKICAgICAgaWYgKCF6ZmlsbCAmJiBjb21tYSkgdmFsdWUgPSBkM19mb3JtYXRfZ3JvdXAodmFsdWUpOwogICAgICB2YXIgbGVuZ3RoID0gYmFzZVByZWZpeC5sZW5ndGggKyB2YWx1ZS5sZW5ndGggKyAoemNvbW1hID8gMCA6IG5lZ2F0aXZlLmxlbmd0aCksIHBhZGRpbmcgPSBsZW5ndGggPCB3aWR0aCA/IG5ldyBBcnJheShsZW5ndGggPSB3aWR0aCAtIGxlbmd0aCArIDEpLmpvaW4oZmlsbCkgOiAiIjsKICAgICAgaWYgKHpjb21tYSkgdmFsdWUgPSBkM19mb3JtYXRfZ3JvdXAocGFkZGluZyArIHZhbHVlKTsKICAgICAgaWYgKGQzX2Zvcm1hdF9kZWNpbWFsUG9pbnQpIHZhbHVlLnJlcGxhY2UoIi4iLCBkM19mb3JtYXRfZGVjaW1hbFBvaW50KTsKICAgICAgbmVnYXRpdmUgKz0gYmFzZVByZWZpeDsKICAgICAgcmV0dXJuIChhbGlnbiA9PT0gIjwiID8gbmVnYXRpdmUgKyB2YWx1ZSArIHBhZGRpbmcgOiBhbGlnbiA9PT0gIj4iID8gcGFkZGluZyArIG5lZ2F0aXZlICsgdmFsdWUgOiBhbGlnbiA9PT0gIl4iID8gcGFkZGluZy5zdWJzdHJpbmcoMCwgbGVuZ3RoID4+PSAxKSArIG5lZ2F0aXZlICsgdmFsdWUgKyBwYWRkaW5nLnN1YnN0cmluZyhsZW5ndGgpIDogbmVnYXRpdmUgKyAoemNvbW1hID8gdmFsdWUgOiBwYWRkaW5nICsgdmFsdWUpKSArIHN1ZmZpeDsKICAgIH07CiAgfTsKICB2YXIgZDNfZm9ybWF0X3JlID0gLyg/OihbXntdKT8oWzw+PV5dKSk/KFsrXC0gXSk/KCMpPygwKT8oXGQrKT8oLCk/KFwuLT9cZCspPyhbYS16JV0pPy9pOwogIHZhciBkM19mb3JtYXRfdHlwZXMgPSBkMy5tYXAoewogICAgYjogZnVuY3Rpb24oeCkgewogICAgICByZXR1cm4geC50b1N0cmluZygyKTsKICAgIH0sCiAgICBjOiBmdW5jdGlvbih4KSB7CiAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHgpOwogICAgfSwKICAgIG86IGZ1bmN0aW9uKHgpIHsKICAgICAgcmV0dXJuIHgudG9TdHJpbmcoOCk7CiAgICB9LAogICAgeDogZnVuY3Rpb24oeCkgewogICAgICByZXR1cm4geC50b1N0cmluZygxNik7CiAgICB9LAogICAgWDogZnVuY3Rpb24oeCkgewogICAgICByZXR1cm4geC50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTsKICAgIH0sCiAgICBnOiBmdW5jdGlvbih4LCBwKSB7CiAgICAgIHJldHVybiB4LnRvUHJlY2lzaW9uKHApOwogICAgfSwKICAgIGU6IGZ1bmN0aW9uKHgsIHApIHsKICAgICAgcmV0dXJuIHgudG9FeHBvbmVudGlhbChwKTsKICAgIH0sCiAgICBmOiBmdW5jdGlvbih4LCBwKSB7CiAgICAgIHJldHVybiB4LnRvRml4ZWQocCk7CiAgICB9LAogICAgcjogZnVuY3Rpb24oeCwgcCkgewogICAgICByZXR1cm4gKHggPSBkMy5yb3VuZCh4LCBkM19mb3JtYXRfcHJlY2lzaW9uKHgsIHApKSkudG9GaXhlZChNYXRoLm1heCgwLCBNYXRoLm1pbigyMCwgZDNfZm9ybWF0X3ByZWNpc2lvbih4ICogKDEgKyAxZS0xNSksIHApKSkpOwogICAgfQogIH0pOwogIGZ1bmN0aW9uIGQzX2Zvcm1hdF9wcmVjaXNpb24oeCwgcCkgewogICAgcmV0dXJuIHAgLSAoeCA/IE1hdGguY2VpbChNYXRoLmxvZyh4KSAvIE1hdGguTE4xMCkgOiAxKTsKICB9CiAgZnVuY3Rpb24gZDNfZm9ybWF0X3R5cGVEZWZhdWx0KHgpIHsKICAgIHJldHVybiB4ICsgIiI7CiAgfQogIHZhciBkM19mb3JtYXRfZ3JvdXAgPSBkM19pZGVudGl0eTsKICBpZiAoZDNfZm9ybWF0X2dyb3VwaW5nKSB7CiAgICB2YXIgZDNfZm9ybWF0X2dyb3VwaW5nTGVuZ3RoID0gZDNfZm9ybWF0X2dyb3VwaW5nLmxlbmd0aDsKICAgIGQzX2Zvcm1hdF9ncm91cCA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIHZhciBpID0gdmFsdWUubGFzdEluZGV4T2YoIi4iKSwgZiA9IGkgPj0gMCA/ICIuIiArIHZhbHVlLnN1YnN0cmluZyhpICsgMSkgOiAoaSA9IHZhbHVlLmxlbmd0aCwgCiAgICAgICIiKSwgdCA9IFtdLCBqID0gMCwgZyA9IGQzX2Zvcm1hdF9ncm91cGluZ1swXTsKICAgICAgd2hpbGUgKGkgPiAwICYmIGcgPiAwKSB7CiAgICAgICAgdC5wdXNoKHZhbHVlLnN1YnN0cmluZyhpIC09IGcsIGkgKyBnKSk7CiAgICAgICAgZyA9IGQzX2Zvcm1hdF9ncm91cGluZ1tqID0gKGogKyAxKSAlIGQzX2Zvcm1hdF9ncm91cGluZ0xlbmd0aF07CiAgICAgIH0KICAgICAgcmV0dXJuIHQucmV2ZXJzZSgpLmpvaW4oZDNfZm9ybWF0X3Rob3VzYW5kc1NlcGFyYXRvciB8fCAiIikgKyBmOwogICAgfTsKICB9CiAgZDMuZ2VvID0ge307CiAgZDMuZ2VvLnN0cmVhbSA9IGZ1bmN0aW9uKG9iamVjdCwgbGlzdGVuZXIpIHsKICAgIGlmIChvYmplY3QgJiYgZDNfZ2VvX3N0cmVhbU9iamVjdFR5cGUuaGFzT3duUHJvcGVydHkob2JqZWN0LnR5cGUpKSB7CiAgICAgIGQzX2dlb19zdHJlYW1PYmplY3RUeXBlW29iamVjdC50eXBlXShvYmplY3QsIGxpc3RlbmVyKTsKICAgIH0gZWxzZSB7CiAgICAgIGQzX2dlb19zdHJlYW1HZW9tZXRyeShvYmplY3QsIGxpc3RlbmVyKTsKICAgIH0KICB9OwogIGZ1bmN0aW9uIGQzX2dlb19zdHJlYW1HZW9tZXRyeShnZW9tZXRyeSwgbGlzdGVuZXIpIHsKICAgIGlmIChnZW9tZXRyeSAmJiBkM19nZW9fc3RyZWFtR2VvbWV0cnlUeXBlLmhhc093blByb3BlcnR5KGdlb21ldHJ5LnR5cGUpKSB7CiAgICAgIGQzX2dlb19zdHJlYW1HZW9tZXRyeVR5cGVbZ2VvbWV0cnkudHlwZV0oZ2VvbWV0cnksIGxpc3RlbmVyKTsKICAgIH0KICB9CiAgdmFyIGQzX2dlb19zdHJlYW1PYmplY3RUeXBlID0gewogICAgRmVhdHVyZTogZnVuY3Rpb24oZmVhdHVyZSwgbGlzdGVuZXIpIHsKICAgICAgZDNfZ2VvX3N0cmVhbUdlb21ldHJ5KGZlYXR1cmUuZ2VvbWV0cnksIGxpc3RlbmVyKTsKICAgIH0sCiAgICBGZWF0dXJlQ29sbGVjdGlvbjogZnVuY3Rpb24ob2JqZWN0LCBsaXN0ZW5lcikgewogICAgICB2YXIgZmVhdHVyZXMgPSBvYmplY3QuZmVhdHVyZXMsIGkgPSAtMSwgbiA9IGZlYXR1cmVzLmxlbmd0aDsKICAgICAgd2hpbGUgKCsraSA8IG4pIGQzX2dlb19zdHJlYW1HZW9tZXRyeShmZWF0dXJlc1tpXS5nZW9tZXRyeSwgbGlzdGVuZXIpOwogICAgfQogIH07CiAgdmFyIGQzX2dlb19zdHJlYW1HZW9tZXRyeVR5cGUgPSB7CiAgICBTcGhlcmU6IGZ1bmN0aW9uKG9iamVjdCwgbGlzdGVuZXIpIHsKICAgICAgbGlzdGVuZXIuc3BoZXJlKCk7CiAgICB9LAogICAgUG9pbnQ6IGZ1bmN0aW9uKG9iamVjdCwgbGlzdGVuZXIpIHsKICAgICAgdmFyIGNvb3JkaW5hdGUgPSBvYmplY3QuY29vcmRpbmF0ZXM7CiAgICAgIGxpc3RlbmVyLnBvaW50KGNvb3JkaW5hdGVbMF0sIGNvb3JkaW5hdGVbMV0pOwogICAgfSwKICAgIE11bHRpUG9pbnQ6IGZ1bmN0aW9uKG9iamVjdCwgbGlzdGVuZXIpIHsKICAgICAgdmFyIGNvb3JkaW5hdGVzID0gb2JqZWN0LmNvb3JkaW5hdGVzLCBpID0gLTEsIG4gPSBjb29yZGluYXRlcy5sZW5ndGgsIGNvb3JkaW5hdGU7CiAgICAgIHdoaWxlICgrK2kgPCBuKSBjb29yZGluYXRlID0gY29vcmRpbmF0ZXNbaV0sIGxpc3RlbmVyLnBvaW50KGNvb3JkaW5hdGVbMF0sIGNvb3JkaW5hdGVbMV0pOwogICAgfSwKICAgIExpbmVTdHJpbmc6IGZ1bmN0aW9uKG9iamVjdCwgbGlzdGVuZXIpIHsKICAgICAgZDNfZ2VvX3N0cmVhbUxpbmUob2JqZWN0LmNvb3JkaW5hdGVzLCBsaXN0ZW5lciwgMCk7CiAgICB9LAogICAgTXVsdGlMaW5lU3RyaW5nOiBmdW5jdGlvbihvYmplY3QsIGxpc3RlbmVyKSB7CiAgICAgIHZhciBjb29yZGluYXRlcyA9IG9iamVjdC5jb29yZGluYXRlcywgaSA9IC0xLCBuID0gY29vcmRpbmF0ZXMubGVuZ3RoOwogICAgICB3aGlsZSAoKytpIDwgbikgZDNfZ2VvX3N0cmVhbUxpbmUoY29vcmRpbmF0ZXNbaV0sIGxpc3RlbmVyLCAwKTsKICAgIH0sCiAgICBQb2x5Z29uOiBmdW5jdGlvbihvYmplY3QsIGxpc3RlbmVyKSB7CiAgICAgIGQzX2dlb19zdHJlYW1Qb2x5Z29uKG9iamVjdC5jb29yZGluYXRlcywgbGlzdGVuZXIpOwogICAgfSwKICAgIE11bHRpUG9seWdvbjogZnVuY3Rpb24ob2JqZWN0LCBsaXN0ZW5lcikgewogICAgICB2YXIgY29vcmRpbmF0ZXMgPSBvYmplY3QuY29vcmRpbmF0ZXMsIGkgPSAtMSwgbiA9IGNvb3JkaW5hdGVzLmxlbmd0aDsKICAgICAgd2hpbGUgKCsraSA8IG4pIGQzX2dlb19zdHJlYW1Qb2x5Z29uKGNvb3JkaW5hdGVzW2ldLCBsaXN0ZW5lcik7CiAgICB9LAogICAgR2VvbWV0cnlDb2xsZWN0aW9uOiBmdW5jdGlvbihvYmplY3QsIGxpc3RlbmVyKSB7CiAgICAgIHZhciBnZW9tZXRyaWVzID0gb2JqZWN0Lmdlb21ldHJpZXMsIGkgPSAtMSwgbiA9IGdlb21ldHJpZXMubGVuZ3RoOwogICAgICB3aGlsZSAoKytpIDwgbikgZDNfZ2VvX3N0cmVhbUdlb21ldHJ5KGdlb21ldHJpZXNbaV0sIGxpc3RlbmVyKTsKICAgIH0KICB9OwogIGZ1bmN0aW9uIGQzX2dlb19zdHJlYW1MaW5lKGNvb3JkaW5hdGVzLCBsaXN0ZW5lciwgY2xvc2VkKSB7CiAgICB2YXIgaSA9IC0xLCBuID0gY29vcmRpbmF0ZXMubGVuZ3RoIC0gY2xvc2VkLCBjb29yZGluYXRlOwogICAgbGlzdGVuZXIubGluZVN0YXJ0KCk7CiAgICB3aGlsZSAoKytpIDwgbikgY29vcmRpbmF0ZSA9IGNvb3JkaW5hdGVzW2ldLCBsaXN0ZW5lci5wb2ludChjb29yZGluYXRlWzBdLCBjb29yZGluYXRlWzFdKTsKICAgIGxpc3RlbmVyLmxpbmVFbmQoKTsKICB9CiAgZnVuY3Rpb24gZDNfZ2VvX3N0cmVhbVBvbHlnb24oY29vcmRpbmF0ZXMsIGxpc3RlbmVyKSB7CiAgICB2YXIgaSA9IC0xLCBuID0gY29vcmRpbmF0ZXMubGVuZ3RoOwogICAgbGlzdGVuZXIucG9seWdvblN0YXJ0KCk7CiAgICB3aGlsZSAoKytpIDwgbikgZDNfZ2VvX3N0cmVhbUxpbmUoY29vcmRpbmF0ZXNbaV0sIGxpc3RlbmVyLCAxKTsKICAgIGxpc3RlbmVyLnBvbHlnb25FbmQoKTsKICB9CiAgZDMuZ2VvLmFyZWEgPSBmdW5jdGlvbihvYmplY3QpIHsKICAgIGQzX2dlb19hcmVhU3VtID0gMDsKICAgIGQzLmdlby5zdHJlYW0ob2JqZWN0LCBkM19nZW9fYXJlYSk7CiAgICByZXR1cm4gZDNfZ2VvX2FyZWFTdW07CiAgfTsKICB2YXIgZDNfZ2VvX2FyZWFTdW0sIGQzX2dlb19hcmVhUmluZ1N1bTsKICB2YXIgZDNfZ2VvX2FyZWEgPSB7CiAgICBzcGhlcmU6IGZ1bmN0aW9uKCkgewogICAgICBkM19nZW9fYXJlYVN1bSArPSA0ICogz4A7CiAgICB9LAogICAgcG9pbnQ6IGQzX25vb3AsCiAgICBsaW5lU3RhcnQ6IGQzX25vb3AsCiAgICBsaW5lRW5kOiBkM19ub29wLAogICAgcG9seWdvblN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAgZDNfZ2VvX2FyZWFSaW5nU3VtID0gMDsKICAgICAgZDNfZ2VvX2FyZWEubGluZVN0YXJ0ID0gZDNfZ2VvX2FyZWFSaW5nU3RhcnQ7CiAgICB9LAogICAgcG9seWdvbkVuZDogZnVuY3Rpb24oKSB7CiAgICAgIHZhciBhcmVhID0gMiAqIGQzX2dlb19hcmVhUmluZ1N1bTsKICAgICAgZDNfZ2VvX2FyZWFTdW0gKz0gYXJlYSA8IDAgPyA0ICogz4AgKyBhcmVhIDogYXJlYTsKICAgICAgZDNfZ2VvX2FyZWEubGluZVN0YXJ0ID0gZDNfZ2VvX2FyZWEubGluZUVuZCA9IGQzX2dlb19hcmVhLnBvaW50ID0gZDNfbm9vcDsKICAgIH0KICB9OwogIGZ1bmN0aW9uIGQzX2dlb19hcmVhUmluZ1N0YXJ0KCkgewogICAgdmFyIM67MDAsIM+GMDAsIM67MCwgY29zz4YwLCBzaW7PhjA7CiAgICBkM19nZW9fYXJlYS5wb2ludCA9IGZ1bmN0aW9uKM67LCDPhikgewogICAgICBkM19nZW9fYXJlYS5wb2ludCA9IG5leHRQb2ludDsKICAgICAgzrswID0gKM67MDAgPSDOuykgKiBkM19yYWRpYW5zLCBjb3PPhjAgPSBNYXRoLmNvcyjPhiA9ICjPhjAwID0gz4YpICogZDNfcmFkaWFucyAvIDIgKyDPgCAvIDQpLCAKICAgICAgc2luz4YwID0gTWF0aC5zaW4oz4YpOwogICAgfTsKICAgIGZ1bmN0aW9uIG5leHRQb2ludCjOuywgz4YpIHsKICAgICAgzrsgKj0gZDNfcmFkaWFuczsKICAgICAgz4YgPSDPhiAqIGQzX3JhZGlhbnMgLyAyICsgz4AgLyA0OwogICAgICB2YXIgZM67ID0gzrsgLSDOuzAsIGNvc8+GID0gTWF0aC5jb3Moz4YpLCBzaW7PhiA9IE1hdGguc2luKM+GKSwgayA9IHNpbs+GMCAqIHNpbs+GLCB1ID0gY29zz4YwICogY29zz4YgKyBrICogTWF0aC5jb3MoZM67KSwgdiA9IGsgKiBNYXRoLnNpbihkzrspOwogICAgICBkM19nZW9fYXJlYVJpbmdTdW0gKz0gTWF0aC5hdGFuMih2LCB1KTsKICAgICAgzrswID0gzrssIGNvc8+GMCA9IGNvc8+GLCBzaW7PhjAgPSBzaW7PhjsKICAgIH0KICAgIGQzX2dlb19hcmVhLmxpbmVFbmQgPSBmdW5jdGlvbigpIHsKICAgICAgbmV4dFBvaW50KM67MDAsIM+GMDApOwogICAgfTsKICB9CiAgZnVuY3Rpb24gZDNfZ2VvX2NhcnRlc2lhbihzcGhlcmljYWwpIHsKICAgIHZhciDOuyA9IHNwaGVyaWNhbFswXSwgz4YgPSBzcGhlcmljYWxbMV0sIGNvc8+GID0gTWF0aC5jb3Moz4YpOwogICAgcmV0dXJuIFsgY29zz4YgKiBNYXRoLmNvcyjOuyksIGNvc8+GICogTWF0aC5zaW4ozrspLCBNYXRoLnNpbijPhikgXTsKICB9CiAgZnVuY3Rpb24gZDNfZ2VvX2NhcnRlc2lhbkRvdChhLCBiKSB7CiAgICByZXR1cm4gYVswXSAqIGJbMF0gKyBhWzFdICogYlsxXSArIGFbMl0gKiBiWzJdOwogIH0KICBmdW5jdGlvbiBkM19nZW9fY2FydGVzaWFuQ3Jvc3MoYSwgYikgewogICAgcmV0dXJuIFsgYVsxXSAqIGJbMl0gLSBhWzJdICogYlsxXSwgYVsyXSAqIGJbMF0gLSBhWzBdICogYlsyXSwgYVswXSAqIGJbMV0gLSBhWzFdICogYlswXSBdOwogIH0KICBmdW5jdGlvbiBkM19nZW9fY2FydGVzaWFuQWRkKGEsIGIpIHsKICAgIGFbMF0gKz0gYlswXTsKICAgIGFbMV0gKz0gYlsxXTsKICAgIGFbMl0gKz0gYlsyXTsKICB9CiAgZnVuY3Rpb24gZDNfZ2VvX2NhcnRlc2lhblNjYWxlKHZlY3RvciwgaykgewogICAgcmV0dXJuIFsgdmVjdG9yWzBdICogaywgdmVjdG9yWzFdICogaywgdmVjdG9yWzJdICogayBdOwogIH0KICBmdW5jdGlvbiBkM19nZW9fY2FydGVzaWFuTm9ybWFsaXplKGQpIHsKICAgIHZhciBsID0gTWF0aC5zcXJ0KGRbMF0gKiBkWzBdICsgZFsxXSAqIGRbMV0gKyBkWzJdICogZFsyXSk7CiAgICBkWzBdIC89IGw7CiAgICBkWzFdIC89IGw7CiAgICBkWzJdIC89IGw7CiAgfQogIGZ1bmN0aW9uIGQzX2dlb19zcGhlcmljYWwoY2FydGVzaWFuKSB7CiAgICByZXR1cm4gWyBNYXRoLmF0YW4yKGNhcnRlc2lhblsxXSwgY2FydGVzaWFuWzBdKSwgTWF0aC5hc2luKE1hdGgubWF4KC0xLCBNYXRoLm1pbigxLCBjYXJ0ZXNpYW5bMl0pKSkgXTsKICB9CiAgZnVuY3Rpb24gZDNfZ2VvX3NwaGVyaWNhbEVxdWFsKGEsIGIpIHsKICAgIHJldHVybiBNYXRoLmFicyhhWzBdIC0gYlswXSkgPCDOtSAmJiBNYXRoLmFicyhhWzFdIC0gYlsxXSkgPCDOtTsKICB9CiAgZDMuZ2VvLmJvdW5kcyA9IGZ1bmN0aW9uKCkgewogICAgdmFyIM67MCwgz4YwLCDOuzEsIM+GMSwgzrtfLCDOu19fLCDPhl9fLCBwMCwgZM67U3VtLCByYW5nZXMsIHJhbmdlOwogICAgdmFyIGJvdW5kID0gewogICAgICBwb2ludDogcG9pbnQsCiAgICAgIGxpbmVTdGFydDogbGluZVN0YXJ0LAogICAgICBsaW5lRW5kOiBsaW5lRW5kLAogICAgICBwb2x5Z29uU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgICAgIGJvdW5kLnBvaW50ID0gcmluZ1BvaW50OwogICAgICAgIGJvdW5kLmxpbmVTdGFydCA9IHJpbmdTdGFydDsKICAgICAgICBib3VuZC5saW5lRW5kID0gcmluZ0VuZDsKICAgICAgICBkzrtTdW0gPSAwOwogICAgICAgIGQzX2dlb19hcmVhLnBvbHlnb25TdGFydCgpOwogICAgICB9LAogICAgICBwb2x5Z29uRW5kOiBmdW5jdGlvbigpIHsKICAgICAgICBkM19nZW9fYXJlYS5wb2x5Z29uRW5kKCk7CiAgICAgICAgYm91bmQucG9pbnQgPSBwb2ludDsKICAgICAgICBib3VuZC5saW5lU3RhcnQgPSBsaW5lU3RhcnQ7CiAgICAgICAgYm91bmQubGluZUVuZCA9IGxpbmVFbmQ7CiAgICAgICAgaWYgKGQzX2dlb19hcmVhUmluZ1N1bSA8IDApIM67MCA9IC0ozrsxID0gMTgwKSwgz4YwID0gLSjPhjEgPSA5MCk7IGVsc2UgaWYgKGTOu1N1bSA+IM61KSDPhjEgPSA5MDsgZWxzZSBpZiAoZM67U3VtIDwgLc61KSDPhjAgPSAtOTA7CiAgICAgICAgcmFuZ2VbMF0gPSDOuzAsIHJhbmdlWzFdID0gzrsxOwogICAgICB9CiAgICB9OwogICAgZnVuY3Rpb24gcG9pbnQozrssIM+GKSB7CiAgICAgIHJhbmdlcy5wdXNoKHJhbmdlID0gWyDOuzAgPSDOuywgzrsxID0gzrsgXSk7CiAgICAgIGlmICjPhiA8IM+GMCkgz4YwID0gz4Y7CiAgICAgIGlmICjPhiA+IM+GMSkgz4YxID0gz4Y7CiAgICB9CiAgICBmdW5jdGlvbiBsaW5lUG9pbnQozrssIM+GKSB7CiAgICAgIHZhciBwID0gZDNfZ2VvX2NhcnRlc2lhbihbIM67ICogZDNfcmFkaWFucywgz4YgKiBkM19yYWRpYW5zIF0pOwogICAgICBpZiAocDApIHsKICAgICAgICB2YXIgbm9ybWFsID0gZDNfZ2VvX2NhcnRlc2lhbkNyb3NzKHAwLCBwKSwgZXF1YXRvcmlhbCA9IFsgbm9ybWFsWzFdLCAtbm9ybWFsWzBdLCAwIF0sIGluZmxlY3Rpb24gPSBkM19nZW9fY2FydGVzaWFuQ3Jvc3MoZXF1YXRvcmlhbCwgbm9ybWFsKTsKICAgICAgICBkM19nZW9fY2FydGVzaWFuTm9ybWFsaXplKGluZmxlY3Rpb24pOwogICAgICAgIGluZmxlY3Rpb24gPSBkM19nZW9fc3BoZXJpY2FsKGluZmxlY3Rpb24pOwogICAgICAgIHZhciBkzrsgPSDOuyAtIM67XywgcyA9IGTOuyA+IDAgPyAxIDogLTEsIM67aSA9IGluZmxlY3Rpb25bMF0gKiBkM19kZWdyZWVzICogcywgYW50aW1lcmlkaWFuID0gTWF0aC5hYnMoZM67KSA+IDE4MDsKICAgICAgICBpZiAoYW50aW1lcmlkaWFuIF4gKHMgKiDOu18gPCDOu2kgJiYgzrtpIDwgcyAqIM67KSkgewogICAgICAgICAgdmFyIM+GaSA9IGluZmxlY3Rpb25bMV0gKiBkM19kZWdyZWVzOwogICAgICAgICAgaWYgKM+GaSA+IM+GMSkgz4YxID0gz4ZpOwogICAgICAgIH0gZWxzZSBpZiAozrtpID0gKM67aSArIDM2MCkgJSAzNjAgLSAxODAsIGFudGltZXJpZGlhbiBeIChzICogzrtfIDwgzrtpICYmIM67aSA8IHMgKiDOuykpIHsKICAgICAgICAgIHZhciDPhmkgPSAtaW5mbGVjdGlvblsxXSAqIGQzX2RlZ3JlZXM7CiAgICAgICAgICBpZiAoz4ZpIDwgz4YwKSDPhjAgPSDPhmk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmICjPhiA8IM+GMCkgz4YwID0gz4Y7CiAgICAgICAgICBpZiAoz4YgPiDPhjEpIM+GMSA9IM+GOwogICAgICAgIH0KICAgICAgICBpZiAoYW50aW1lcmlkaWFuKSB7CiAgICAgICAgICBpZiAozrsgPCDOu18pIHsKICAgICAgICAgICAgaWYgKGFuZ2xlKM67MCwgzrspID4gYW5nbGUozrswLCDOuzEpKSDOuzEgPSDOuzsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChhbmdsZSjOuywgzrsxKSA+IGFuZ2xlKM67MCwgzrsxKSkgzrswID0gzrs7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmICjOuzEgPj0gzrswKSB7CiAgICAgICAgICAgIGlmICjOuyA8IM67MCkgzrswID0gzrs7CiAgICAgICAgICAgIGlmICjOuyA+IM67MSkgzrsxID0gzrs7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAozrsgPiDOu18pIHsKICAgICAgICAgICAgICBpZiAoYW5nbGUozrswLCDOuykgPiBhbmdsZSjOuzAsIM67MSkpIM67MSA9IM67OwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGlmIChhbmdsZSjOuywgzrsxKSA+IGFuZ2xlKM67MCwgzrsxKSkgzrswID0gzrs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcG9pbnQozrssIM+GKTsKICAgICAgfQogICAgICBwMCA9IHAsIM67XyA9IM67OwogICAgfQogICAgZnVuY3Rpb24gbGluZVN0YXJ0KCkgewogICAgICBib3VuZC5wb2ludCA9IGxpbmVQb2ludDsKICAgIH0KICAgIGZ1bmN0aW9uIGxpbmVFbmQoKSB7CiAgICAgIHJhbmdlWzBdID0gzrswLCByYW5nZVsxXSA9IM67MTsKICAgICAgYm91bmQucG9pbnQgPSBwb2ludDsKICAgICAgcDAgPSBudWxsOwogICAgfQogICAgZnVuY3Rpb24gcmluZ1BvaW50KM67LCDPhikgewogICAgICBpZiAocDApIHsKICAgICAgICB2YXIgZM67ID0gzrsgLSDOu187CiAgICAgICAgZM67U3VtICs9IE1hdGguYWJzKGTOuykgPiAxODAgPyBkzrsgKyAoZM67ID4gMCA/IDM2MCA6IC0zNjApIDogZM67OwogICAgICB9IGVsc2UgzrtfXyA9IM67LCDPhl9fID0gz4Y7CiAgICAgIGQzX2dlb19hcmVhLnBvaW50KM67LCDPhik7CiAgICAgIGxpbmVQb2ludCjOuywgz4YpOwogICAgfQogICAgZnVuY3Rpb24gcmluZ1N0YXJ0KCkgewogICAgICBkM19nZW9fYXJlYS5saW5lU3RhcnQoKTsKICAgIH0KICAgIGZ1bmN0aW9uIHJpbmdFbmQoKSB7CiAgICAgIHJpbmdQb2ludCjOu19fLCDPhl9fKTsKICAgICAgZDNfZ2VvX2FyZWEubGluZUVuZCgpOwogICAgICBpZiAoTWF0aC5hYnMoZM67U3VtKSA+IM61KSDOuzAgPSAtKM67MSA9IDE4MCk7CiAgICAgIHJhbmdlWzBdID0gzrswLCByYW5nZVsxXSA9IM67MTsKICAgICAgcDAgPSBudWxsOwogICAgfQogICAgZnVuY3Rpb24gYW5nbGUozrswLCDOuzEpIHsKICAgICAgcmV0dXJuICjOuzEgLT0gzrswKSA8IDAgPyDOuzEgKyAzNjAgOiDOuzE7CiAgICB9CiAgICBmdW5jdGlvbiBjb21wYXJlUmFuZ2VzKGEsIGIpIHsKICAgICAgcmV0dXJuIGFbMF0gLSBiWzBdOwogICAgfQogICAgZnVuY3Rpb24gd2l0aGluUmFuZ2UoeCwgcmFuZ2UpIHsKICAgICAgcmV0dXJuIHJhbmdlWzBdIDw9IHJhbmdlWzFdID8gcmFuZ2VbMF0gPD0geCAmJiB4IDw9IHJhbmdlWzFdIDogeCA8IHJhbmdlWzBdIHx8IHJhbmdlWzFdIDwgeDsKICAgIH0KICAgIHJldHVybiBmdW5jdGlvbihmZWF0dXJlKSB7CiAgICAgIM+GMSA9IM67MSA9IC0ozrswID0gz4YwID0gSW5maW5pdHkpOwogICAgICByYW5nZXMgPSBbXTsKICAgICAgZDMuZ2VvLnN0cmVhbShmZWF0dXJlLCBib3VuZCk7CiAgICAgIHJhbmdlcy5zb3J0KGNvbXBhcmVSYW5nZXMpOwogICAgICBmb3IgKHZhciBpID0gMSwgbiA9IHJhbmdlcy5sZW5ndGgsIGEgPSByYW5nZXNbMF0sIGIsIG1lcmdlZCA9IFsgYSBdOyBpIDwgbjsgKytpKSB7CiAgICAgICAgYiA9IHJhbmdlc1tpXTsKICAgICAgICBpZiAod2l0aGluUmFuZ2UoYlswXSwgYSkgfHwgd2l0aGluUmFuZ2UoYlsxXSwgYSkpIHsKICAgICAgICAgIGlmIChhbmdsZShhWzBdLCBiWzFdKSA+IGFuZ2xlKGFbMF0sIGFbMV0pKSBhWzFdID0gYlsxXTsKICAgICAgICAgIGlmIChhbmdsZShiWzBdLCBhWzFdKSA+IGFuZ2xlKGFbMF0sIGFbMV0pKSBhWzBdID0gYlswXTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbWVyZ2VkLnB1c2goYSA9IGIpOwogICAgICAgIH0KICAgICAgfQogICAgICB2YXIgYmVzdCA9IC1JbmZpbml0eSwgZM67OwogICAgICBmb3IgKHZhciBuID0gbWVyZ2VkLmxlbmd0aCAtIDEsIGkgPSAwLCBhID0gbWVyZ2VkW25dLCBiOyBpIDw9IG47IGEgPSBiLCArK2kpIHsKICAgICAgICBiID0gbWVyZ2VkW2ldOwogICAgICAgIGlmICgoZM67ID0gYW5nbGUoYVsxXSwgYlswXSkpID4gYmVzdCkgYmVzdCA9IGTOuywgzrswID0gYlswXSwgzrsxID0gYVsxXTsKICAgICAgfQogICAgICByYW5nZXMgPSByYW5nZSA9IG51bGw7CiAgICAgIHJldHVybiBbIFsgzrswLCDPhjAgXSwgWyDOuzEsIM+GMSBdIF07CiAgICB9OwogIH0oKTsKICBkMy5nZW8uY2VudHJvaWQgPSBmdW5jdGlvbihvYmplY3QpIHsKICAgIGQzX2dlb19jZW50cm9pZERpbWVuc2lvbiA9IGQzX2dlb19jZW50cm9pZFcgPSBkM19nZW9fY2VudHJvaWRYID0gZDNfZ2VvX2NlbnRyb2lkWSA9IGQzX2dlb19jZW50cm9pZFogPSAwOwogICAgZDMuZ2VvLnN0cmVhbShvYmplY3QsIGQzX2dlb19jZW50cm9pZCk7CiAgICB2YXIgbTsKICAgIGlmIChkM19nZW9fY2VudHJvaWRXICYmIE1hdGguYWJzKG0gPSBNYXRoLnNxcnQoZDNfZ2VvX2NlbnRyb2lkWCAqIGQzX2dlb19jZW50cm9pZFggKyBkM19nZW9fY2VudHJvaWRZICogZDNfZ2VvX2NlbnRyb2lkWSArIGQzX2dlb19jZW50cm9pZFogKiBkM19nZW9fY2VudHJvaWRaKSkgPiDOtSkgewogICAgICByZXR1cm4gWyBNYXRoLmF0YW4yKGQzX2dlb19jZW50cm9pZFksIGQzX2dlb19jZW50cm9pZFgpICogZDNfZGVncmVlcywgTWF0aC5hc2luKE1hdGgubWF4KC0xLCBNYXRoLm1pbigxLCBkM19nZW9fY2VudHJvaWRaIC8gbSkpKSAqIGQzX2RlZ3JlZXMgXTsKICAgIH0KICB9OwogIHZhciBkM19nZW9fY2VudHJvaWREaW1lbnNpb24sIGQzX2dlb19jZW50cm9pZFcsIGQzX2dlb19jZW50cm9pZFgsIGQzX2dlb19jZW50cm9pZFksIGQzX2dlb19jZW50cm9pZFo7CiAgdmFyIGQzX2dlb19jZW50cm9pZCA9IHsKICAgIHNwaGVyZTogZnVuY3Rpb24oKSB7CiAgICAgIGlmIChkM19nZW9fY2VudHJvaWREaW1lbnNpb24gPCAyKSB7CiAgICAgICAgZDNfZ2VvX2NlbnRyb2lkRGltZW5zaW9uID0gMjsKICAgICAgICBkM19nZW9fY2VudHJvaWRXID0gZDNfZ2VvX2NlbnRyb2lkWCA9IGQzX2dlb19jZW50cm9pZFkgPSBkM19nZW9fY2VudHJvaWRaID0gMDsKICAgICAgfQogICAgfSwKICAgIHBvaW50OiBkM19nZW9fY2VudHJvaWRQb2ludCwKICAgIGxpbmVTdGFydDogZDNfZ2VvX2NlbnRyb2lkTGluZVN0YXJ0LAogICAgbGluZUVuZDogZDNfZ2VvX2NlbnRyb2lkTGluZUVuZCwKICAgIHBvbHlnb25TdGFydDogZnVuY3Rpb24oKSB7CiAgICAgIGlmIChkM19nZW9fY2VudHJvaWREaW1lbnNpb24gPCAyKSB7CiAgICAgICAgZDNfZ2VvX2NlbnRyb2lkRGltZW5zaW9uID0gMjsKICAgICAgICBkM19nZW9fY2VudHJvaWRXID0gZDNfZ2VvX2NlbnRyb2lkWCA9IGQzX2dlb19jZW50cm9pZFkgPSBkM19nZW9fY2VudHJvaWRaID0gMDsKICAgICAgfQogICAgICBkM19nZW9fY2VudHJvaWQubGluZVN0YXJ0ID0gZDNfZ2VvX2NlbnRyb2lkUmluZ1N0YXJ0OwogICAgfSwKICAgIHBvbHlnb25FbmQ6IGZ1bmN0aW9uKCkgewogICAgICBkM19nZW9fY2VudHJvaWQubGluZVN0YXJ0ID0gZDNfZ2VvX2NlbnRyb2lkTGluZVN0YXJ0OwogICAgfQogIH07CiAgZnVuY3Rpb24gZDNfZ2VvX2NlbnRyb2lkUG9pbnQozrssIM+GKSB7CiAgICBpZiAoZDNfZ2VvX2NlbnRyb2lkRGltZW5zaW9uKSByZXR1cm47CiAgICArK2QzX2dlb19jZW50cm9pZFc7CiAgICDOuyAqPSBkM19yYWRpYW5zOwogICAgdmFyIGNvc8+GID0gTWF0aC5jb3Moz4YgKj0gZDNfcmFkaWFucyk7CiAgICBkM19nZW9fY2VudHJvaWRYICs9IChjb3PPhiAqIE1hdGguY29zKM67KSAtIGQzX2dlb19jZW50cm9pZFgpIC8gZDNfZ2VvX2NlbnRyb2lkVzsKICAgIGQzX2dlb19jZW50cm9pZFkgKz0gKGNvc8+GICogTWF0aC5zaW4ozrspIC0gZDNfZ2VvX2NlbnRyb2lkWSkgLyBkM19nZW9fY2VudHJvaWRXOwogICAgZDNfZ2VvX2NlbnRyb2lkWiArPSAoTWF0aC5zaW4oz4YpIC0gZDNfZ2VvX2NlbnRyb2lkWikgLyBkM19nZW9fY2VudHJvaWRXOwogIH0KICBmdW5jdGlvbiBkM19nZW9fY2VudHJvaWRSaW5nU3RhcnQoKSB7CiAgICB2YXIgzrswMCwgz4YwMDsKICAgIGQzX2dlb19jZW50cm9pZERpbWVuc2lvbiA9IDE7CiAgICBkM19nZW9fY2VudHJvaWRMaW5lU3RhcnQoKTsKICAgIGQzX2dlb19jZW50cm9pZERpbWVuc2lvbiA9IDI7CiAgICB2YXIgbGluZVBvaW50ID0gZDNfZ2VvX2NlbnRyb2lkLnBvaW50OwogICAgZDNfZ2VvX2NlbnRyb2lkLnBvaW50ID0gZnVuY3Rpb24ozrssIM+GKSB7CiAgICAgIGxpbmVQb2ludCjOuzAwID0gzrssIM+GMDAgPSDPhik7CiAgICB9OwogICAgZDNfZ2VvX2NlbnRyb2lkLmxpbmVFbmQgPSBmdW5jdGlvbigpIHsKICAgICAgZDNfZ2VvX2NlbnRyb2lkLnBvaW50KM67MDAsIM+GMDApOwogICAgICBkM19nZW9fY2VudHJvaWRMaW5lRW5kKCk7CiAgICAgIGQzX2dlb19jZW50cm9pZC5saW5lRW5kID0gZDNfZ2VvX2NlbnRyb2lkTGluZUVuZDsKICAgIH07CiAgfQogIGZ1bmN0aW9uIGQzX2dlb19jZW50cm9pZExpbmVTdGFydCgpIHsKICAgIHZhciB4MCwgeTAsIHowOwogICAgaWYgKGQzX2dlb19jZW50cm9pZERpbWVuc2lvbiA+IDEpIHJldHVybjsKICAgIGlmIChkM19nZW9fY2VudHJvaWREaW1lbnNpb24gPCAxKSB7CiAgICAgIGQzX2dlb19jZW50cm9pZERpbWVuc2lvbiA9IDE7CiAgICAgIGQzX2dlb19jZW50cm9pZFcgPSBkM19nZW9fY2VudHJvaWRYID0gZDNfZ2VvX2NlbnRyb2lkWSA9IGQzX2dlb19jZW50cm9pZFogPSAwOwogICAgfQogICAgZDNfZ2VvX2NlbnRyb2lkLnBvaW50ID0gZnVuY3Rpb24ozrssIM+GKSB7CiAgICAgIM67ICo9IGQzX3JhZGlhbnM7CiAgICAgIHZhciBjb3PPhiA9IE1hdGguY29zKM+GICo9IGQzX3JhZGlhbnMpOwogICAgICB4MCA9IGNvc8+GICogTWF0aC5jb3MozrspOwogICAgICB5MCA9IGNvc8+GICogTWF0aC5zaW4ozrspOwogICAgICB6MCA9IE1hdGguc2luKM+GKTsKICAgICAgZDNfZ2VvX2NlbnRyb2lkLnBvaW50ID0gbmV4dFBvaW50OwogICAgfTsKICAgIGZ1bmN0aW9uIG5leHRQb2ludCjOuywgz4YpIHsKICAgICAgzrsgKj0gZDNfcmFkaWFuczsKICAgICAgdmFyIGNvc8+GID0gTWF0aC5jb3Moz4YgKj0gZDNfcmFkaWFucyksIHggPSBjb3PPhiAqIE1hdGguY29zKM67KSwgeSA9IGNvc8+GICogTWF0aC5zaW4ozrspLCB6ID0gTWF0aC5zaW4oz4YpLCB3ID0gTWF0aC5hdGFuMihNYXRoLnNxcnQoKHcgPSB5MCAqIHogLSB6MCAqIHkpICogdyArICh3ID0gejAgKiB4IC0geDAgKiB6KSAqIHcgKyAodyA9IHgwICogeSAtIHkwICogeCkgKiB3KSwgeDAgKiB4ICsgeTAgKiB5ICsgejAgKiB6KTsKICAgICAgZDNfZ2VvX2NlbnRyb2lkVyArPSB3OwogICAgICBkM19nZW9fY2VudHJvaWRYICs9IHcgKiAoeDAgKyAoeDAgPSB4KSk7CiAgICAgIGQzX2dlb19jZW50cm9pZFkgKz0gdyAqICh5MCArICh5MCA9IHkpKTsKICAgICAgZDNfZ2VvX2NlbnRyb2lkWiArPSB3ICogKHowICsgKHowID0geikpOwogICAgfQogIH0KICBmdW5jdGlvbiBkM19nZW9fY2VudHJvaWRMaW5lRW5kKCkgewogICAgZDNfZ2VvX2NlbnRyb2lkLnBvaW50ID0gZDNfZ2VvX2NlbnRyb2lkUG9pbnQ7CiAgfQogIGZ1bmN0aW9uIGQzX3RydWUoKSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgZnVuY3Rpb24gZDNfZ2VvX2NsaXBQb2x5Z29uKHNlZ21lbnRzLCBjb21wYXJlLCBpbnNpZGUsIGludGVycG9sYXRlLCBsaXN0ZW5lcikgewogICAgdmFyIHN1YmplY3QgPSBbXSwgY2xpcCA9IFtdOwogICAgc2VnbWVudHMuZm9yRWFjaChmdW5jdGlvbihzZWdtZW50KSB7CiAgICAgIGlmICgobiA9IHNlZ21lbnQubGVuZ3RoIC0gMSkgPD0gMCkgcmV0dXJuOwogICAgICB2YXIgbiwgcDAgPSBzZWdtZW50WzBdLCBwMSA9IHNlZ21lbnRbbl07CiAgICAgIGlmIChkM19nZW9fc3BoZXJpY2FsRXF1YWwocDAsIHAxKSkgewogICAgICAgIGxpc3RlbmVyLmxpbmVTdGFydCgpOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgKytpKSBsaXN0ZW5lci5wb2ludCgocDAgPSBzZWdtZW50W2ldKVswXSwgcDBbMV0pOwogICAgICAgIGxpc3RlbmVyLmxpbmVFbmQoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdmFyIGEgPSB7CiAgICAgICAgcG9pbnQ6IHAwLAogICAgICAgIHBvaW50czogc2VnbWVudCwKICAgICAgICBvdGhlcjogbnVsbCwKICAgICAgICB2aXNpdGVkOiBmYWxzZSwKICAgICAgICBlbnRyeTogdHJ1ZSwKICAgICAgICBzdWJqZWN0OiB0cnVlCiAgICAgIH0sIGIgPSB7CiAgICAgICAgcG9pbnQ6IHAwLAogICAgICAgIHBvaW50czogWyBwMCBdLAogICAgICAgIG90aGVyOiBhLAogICAgICAgIHZpc2l0ZWQ6IGZhbHNlLAogICAgICAgIGVudHJ5OiBmYWxzZSwKICAgICAgICBzdWJqZWN0OiBmYWxzZQogICAgICB9OwogICAgICBhLm90aGVyID0gYjsKICAgICAgc3ViamVjdC5wdXNoKGEpOwogICAgICBjbGlwLnB1c2goYik7CiAgICAgIGEgPSB7CiAgICAgICAgcG9pbnQ6IHAxLAogICAgICAgIHBvaW50czogWyBwMSBdLAogICAgICAgIG90aGVyOiBudWxsLAogICAgICAgIHZpc2l0ZWQ6IGZhbHNlLAogICAgICAgIGVudHJ5OiBmYWxzZSwKICAgICAgICBzdWJqZWN0OiB0cnVlCiAgICAgIH07CiAgICAgIGIgPSB7CiAgICAgICAgcG9pbnQ6IHAxLAogICAgICAgIHBvaW50czogWyBwMSBdLAogICAgICAgIG90aGVyOiBhLAogICAgICAgIHZpc2l0ZWQ6IGZhbHNlLAogICAgICAgIGVudHJ5OiB0cnVlLAogICAgICAgIHN1YmplY3Q6IGZhbHNlCiAgICAgIH07CiAgICAgIGEub3RoZXIgPSBiOwogICAgICBzdWJqZWN0LnB1c2goYSk7CiAgICAgIGNsaXAucHVzaChiKTsKICAgIH0pOwogICAgY2xpcC5zb3J0KGNvbXBhcmUpOwogICAgZDNfZ2VvX2NsaXBQb2x5Z29uTGlua0NpcmN1bGFyKHN1YmplY3QpOwogICAgZDNfZ2VvX2NsaXBQb2x5Z29uTGlua0NpcmN1bGFyKGNsaXApOwogICAgaWYgKCFzdWJqZWN0Lmxlbmd0aCkgcmV0dXJuOwogICAgaWYgKGluc2lkZSkgZm9yICh2YXIgaSA9IDEsIGUgPSAhaW5zaWRlKGNsaXBbMF0ucG9pbnQpLCBuID0gY2xpcC5sZW5ndGg7IGkgPCBuOyArK2kpIHsKICAgICAgY2xpcFtpXS5lbnRyeSA9IGUgPSAhZTsKICAgIH0KICAgIHZhciBzdGFydCA9IHN1YmplY3RbMF0sIGN1cnJlbnQsIHBvaW50cywgcG9pbnQ7CiAgICB3aGlsZSAoMSkgewogICAgICBjdXJyZW50ID0gc3RhcnQ7CiAgICAgIHdoaWxlIChjdXJyZW50LnZpc2l0ZWQpIGlmICgoY3VycmVudCA9IGN1cnJlbnQubmV4dCkgPT09IHN0YXJ0KSByZXR1cm47CiAgICAgIHBvaW50cyA9IGN1cnJlbnQucG9pbnRzOwogICAgICBsaXN0ZW5lci5saW5lU3RhcnQoKTsKICAgICAgZG8gewogICAgICAgIGN1cnJlbnQudmlzaXRlZCA9IGN1cnJlbnQub3RoZXIudmlzaXRlZCA9IHRydWU7CiAgICAgICAgaWYgKGN1cnJlbnQuZW50cnkpIHsKICAgICAgICAgIGlmIChjdXJyZW50LnN1YmplY3QpIHsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspIGxpc3RlbmVyLnBvaW50KChwb2ludCA9IHBvaW50c1tpXSlbMF0sIHBvaW50WzFdKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGludGVycG9sYXRlKGN1cnJlbnQucG9pbnQsIGN1cnJlbnQubmV4dC5wb2ludCwgMSwgbGlzdGVuZXIpOwogICAgICAgICAgfQogICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKGN1cnJlbnQuc3ViamVjdCkgewogICAgICAgICAgICBwb2ludHMgPSBjdXJyZW50LnByZXYucG9pbnRzOwogICAgICAgICAgICBmb3IgKHZhciBpID0gcG9pbnRzLmxlbmd0aDsgLS1pID49IDA7ICkgbGlzdGVuZXIucG9pbnQoKHBvaW50ID0gcG9pbnRzW2ldKVswXSwgcG9pbnRbMV0pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaW50ZXJwb2xhdGUoY3VycmVudC5wb2ludCwgY3VycmVudC5wcmV2LnBvaW50LCAtMSwgbGlzdGVuZXIpOwogICAgICAgICAgfQogICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQucHJldjsKICAgICAgICB9CiAgICAgICAgY3VycmVudCA9IGN1cnJlbnQub3RoZXI7CiAgICAgICAgcG9pbnRzID0gY3VycmVudC5wb2ludHM7CiAgICAgIH0gd2hpbGUgKCFjdXJyZW50LnZpc2l0ZWQpOwogICAgICBsaXN0ZW5lci5saW5lRW5kKCk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGQzX2dlb19jbGlwUG9seWdvbkxpbmtDaXJjdWxhcihhcnJheSkgewogICAgaWYgKCEobiA9IGFycmF5Lmxlbmd0aCkpIHJldHVybjsKICAgIHZhciBuLCBpID0gMCwgYSA9IGFycmF5WzBdLCBiOwogICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgYS5uZXh0ID0gYiA9IGFycmF5W2ldOwogICAgICBiLnByZXYgPSBhOwogICAgICBhID0gYjsKICAgIH0KICAgIGEubmV4dCA9IGIgPSBhcnJheVswXTsKICAgIGIucHJldiA9IGE7CiAgfQogIGZ1bmN0aW9uIGQzX2dlb19jbGlwKHBvaW50VmlzaWJsZSwgY2xpcExpbmUsIGludGVycG9sYXRlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24obGlzdGVuZXIpIHsKICAgICAgdmFyIGxpbmUgPSBjbGlwTGluZShsaXN0ZW5lcik7CiAgICAgIHZhciBjbGlwID0gewogICAgICAgIHBvaW50OiBwb2ludCwKICAgICAgICBsaW5lU3RhcnQ6IGxpbmVTdGFydCwKICAgICAgICBsaW5lRW5kOiBsaW5lRW5kLAogICAgICAgIHBvbHlnb25TdGFydDogZnVuY3Rpb24oKSB7CiAgICAgICAgICBjbGlwLnBvaW50ID0gcG9pbnRSaW5nOwogICAgICAgICAgY2xpcC5saW5lU3RhcnQgPSByaW5nU3RhcnQ7CiAgICAgICAgICBjbGlwLmxpbmVFbmQgPSByaW5nRW5kOwogICAgICAgICAgaW52aXNpYmxlID0gZmFsc2U7CiAgICAgICAgICBpbnZpc2libGVBcmVhID0gdmlzaWJsZUFyZWEgPSAwOwogICAgICAgICAgc2VnbWVudHMgPSBbXTsKICAgICAgICAgIGxpc3RlbmVyLnBvbHlnb25TdGFydCgpOwogICAgICAgIH0sCiAgICAgICAgcG9seWdvbkVuZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICBjbGlwLnBvaW50ID0gcG9pbnQ7CiAgICAgICAgICBjbGlwLmxpbmVTdGFydCA9IGxpbmVTdGFydDsKICAgICAgICAgIGNsaXAubGluZUVuZCA9IGxpbmVFbmQ7CiAgICAgICAgICBzZWdtZW50cyA9IGQzLm1lcmdlKHNlZ21lbnRzKTsKICAgICAgICAgIGlmIChzZWdtZW50cy5sZW5ndGgpIHsKICAgICAgICAgICAgZDNfZ2VvX2NsaXBQb2x5Z29uKHNlZ21lbnRzLCBkM19nZW9fY2xpcFNvcnQsIG51bGwsIGludGVycG9sYXRlLCBsaXN0ZW5lcik7CiAgICAgICAgICB9IGVsc2UgaWYgKHZpc2libGVBcmVhIDwgLc61IHx8IGludmlzaWJsZSAmJiBpbnZpc2libGVBcmVhIDwgLc61KSB7CiAgICAgICAgICAgIGxpc3RlbmVyLmxpbmVTdGFydCgpOwogICAgICAgICAgICBpbnRlcnBvbGF0ZShudWxsLCBudWxsLCAxLCBsaXN0ZW5lcik7CiAgICAgICAgICAgIGxpc3RlbmVyLmxpbmVFbmQoKTsKICAgICAgICAgIH0KICAgICAgICAgIGxpc3RlbmVyLnBvbHlnb25FbmQoKTsKICAgICAgICAgIHNlZ21lbnRzID0gbnVsbDsKICAgICAgICB9LAogICAgICAgIHNwaGVyZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICBsaXN0ZW5lci5wb2x5Z29uU3RhcnQoKTsKICAgICAgICAgIGxpc3RlbmVyLmxpbmVTdGFydCgpOwogICAgICAgICAgaW50ZXJwb2xhdGUobnVsbCwgbnVsbCwgMSwgbGlzdGVuZXIpOwogICAgICAgICAgbGlzdGVuZXIubGluZUVuZCgpOwogICAgICAgICAgbGlzdGVuZXIucG9seWdvbkVuZCgpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgZnVuY3Rpb24gcG9pbnQozrssIM+GKSB7CiAgICAgICAgaWYgKHBvaW50VmlzaWJsZSjOuywgz4YpKSBsaXN0ZW5lci5wb2ludCjOuywgz4YpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIHBvaW50TGluZSjOuywgz4YpIHsKICAgICAgICBsaW5lLnBvaW50KM67LCDPhik7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gbGluZVN0YXJ0KCkgewogICAgICAgIGNsaXAucG9pbnQgPSBwb2ludExpbmU7CiAgICAgICAgbGluZS5saW5lU3RhcnQoKTsKICAgICAgfQogICAgICBmdW5jdGlvbiBsaW5lRW5kKCkgewogICAgICAgIGNsaXAucG9pbnQgPSBwb2ludDsKICAgICAgICBsaW5lLmxpbmVFbmQoKTsKICAgICAgfQogICAgICB2YXIgc2VnbWVudHMsIHZpc2libGVBcmVhLCBpbnZpc2libGVBcmVhLCBpbnZpc2libGU7CiAgICAgIHZhciBidWZmZXIgPSBkM19nZW9fY2xpcEJ1ZmZlckxpc3RlbmVyKCksIHJpbmdMaXN0ZW5lciA9IGNsaXBMaW5lKGJ1ZmZlciksIHJpbmc7CiAgICAgIGZ1bmN0aW9uIHBvaW50UmluZyjOuywgz4YpIHsKICAgICAgICByaW5nTGlzdGVuZXIucG9pbnQozrssIM+GKTsKICAgICAgICByaW5nLnB1c2goWyDOuywgz4YgXSk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gcmluZ1N0YXJ0KCkgewogICAgICAgIHJpbmdMaXN0ZW5lci5saW5lU3RhcnQoKTsKICAgICAgICByaW5nID0gW107CiAgICAgIH0KICAgICAgZnVuY3Rpb24gcmluZ0VuZCgpIHsKICAgICAgICBwb2ludFJpbmcocmluZ1swXVswXSwgcmluZ1swXVsxXSk7CiAgICAgICAgcmluZ0xpc3RlbmVyLmxpbmVFbmQoKTsKICAgICAgICB2YXIgY2xlYW4gPSByaW5nTGlzdGVuZXIuY2xlYW4oKSwgcmluZ1NlZ21lbnRzID0gYnVmZmVyLmJ1ZmZlcigpLCBzZWdtZW50LCBuID0gcmluZ1NlZ21lbnRzLmxlbmd0aDsKICAgICAgICBpZiAoIW4pIHsKICAgICAgICAgIGludmlzaWJsZSA9IHRydWU7CiAgICAgICAgICBpbnZpc2libGVBcmVhICs9IGQzX2dlb19jbGlwQXJlYVJpbmcocmluZywgLTEpOwogICAgICAgICAgcmluZyA9IG51bGw7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHJpbmcgPSBudWxsOwogICAgICAgIGlmIChjbGVhbiAmIDEpIHsKICAgICAgICAgIHNlZ21lbnQgPSByaW5nU2VnbWVudHNbMF07CiAgICAgICAgICB2aXNpYmxlQXJlYSArPSBkM19nZW9fY2xpcEFyZWFSaW5nKHNlZ21lbnQsIDEpOwogICAgICAgICAgdmFyIG4gPSBzZWdtZW50Lmxlbmd0aCAtIDEsIGkgPSAtMSwgcG9pbnQ7CiAgICAgICAgICBsaXN0ZW5lci5saW5lU3RhcnQoKTsKICAgICAgICAgIHdoaWxlICgrK2kgPCBuKSBsaXN0ZW5lci5wb2ludCgocG9pbnQgPSBzZWdtZW50W2ldKVswXSwgcG9pbnRbMV0pOwogICAgICAgICAgbGlzdGVuZXIubGluZUVuZCgpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAobiA+IDEgJiYgY2xlYW4gJiAyKSByaW5nU2VnbWVudHMucHVzaChyaW5nU2VnbWVudHMucG9wKCkuY29uY2F0KHJpbmdTZWdtZW50cy5zaGlmdCgpKSk7CiAgICAgICAgc2VnbWVudHMucHVzaChyaW5nU2VnbWVudHMuZmlsdGVyKGQzX2dlb19jbGlwU2VnbWVudExlbmd0aDEpKTsKICAgICAgfQogICAgICByZXR1cm4gY2xpcDsKICAgIH07CiAgfQogIGZ1bmN0aW9uIGQzX2dlb19jbGlwU2VnbWVudExlbmd0aDEoc2VnbWVudCkgewogICAgcmV0dXJuIHNlZ21lbnQubGVuZ3RoID4gMTsKICB9CiAgZnVuY3Rpb24gZDNfZ2VvX2NsaXBCdWZmZXJMaXN0ZW5lcigpIHsKICAgIHZhciBsaW5lcyA9IFtdLCBsaW5lOwogICAgcmV0dXJuIHsKICAgICAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAgICBsaW5lcy5wdXNoKGxpbmUgPSBbXSk7CiAgICAgIH0sCiAgICAgIHBvaW50OiBmdW5jdGlvbijOuywgz4YpIHsKICAgICAgICBsaW5lLnB1c2goWyDOuywgz4YgXSk7CiAgICAgIH0sCiAgICAgIGxpbmVFbmQ6IGQzX25vb3AsCiAgICAgIGJ1ZmZlcjogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGJ1ZmZlciA9IGxpbmVzOwogICAgICAgIGxpbmVzID0gW107CiAgICAgICAgbGluZSA9IG51bGw7CiAgICAgICAgcmV0dXJuIGJ1ZmZlcjsKICAgICAgfSwKICAgICAgcmVqb2luOiBmdW5jdGlvbigpIHsKICAgICAgICBpZiAobGluZXMubGVuZ3RoID4gMSkgbGluZXMucHVzaChsaW5lcy5wb3AoKS5jb25jYXQobGluZXMuc2hpZnQoKSkpOwogICAgICB9CiAgICB9OwogIH0KICBmdW5jdGlvbiBkM19nZW9fY2xpcEFyZWFSaW5nKHJpbmcsIGludmlzaWJsZSkgewogICAgaWYgKCEobiA9IHJpbmcubGVuZ3RoKSkgcmV0dXJuIDA7CiAgICB2YXIgbiwgaSA9IDAsIGFyZWEgPSAwLCBwID0gcmluZ1swXSwgzrsgPSBwWzBdLCDPhiA9IHBbMV0sIGNvc8+GID0gTWF0aC5jb3Moz4YpLCB4MCA9IE1hdGguYXRhbjIoaW52aXNpYmxlICogTWF0aC5zaW4ozrspICogY29zz4YsIE1hdGguc2luKM+GKSksIHkwID0gMSAtIGludmlzaWJsZSAqIE1hdGguY29zKM67KSAqIGNvc8+GLCB4MSA9IHgwLCB4LCB5OwogICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgcCA9IHJpbmdbaV07CiAgICAgIGNvc8+GID0gTWF0aC5jb3Moz4YgPSBwWzFdKTsKICAgICAgeCA9IE1hdGguYXRhbjIoaW52aXNpYmxlICogTWF0aC5zaW4ozrsgPSBwWzBdKSAqIGNvc8+GLCBNYXRoLnNpbijPhikpOwogICAgICB5ID0gMSAtIGludmlzaWJsZSAqIE1hdGguY29zKM67KSAqIGNvc8+GOwogICAgICBpZiAoTWF0aC5hYnMoeTAgLSAyKSA8IM61ICYmIE1hdGguYWJzKHkgLSAyKSA8IM61KSBjb250aW51ZTsKICAgICAgaWYgKE1hdGguYWJzKHkpIDwgzrUgfHwgTWF0aC5hYnMoeTApIDwgzrUpIHt9IGVsc2UgaWYgKE1hdGguYWJzKE1hdGguYWJzKHggLSB4MCkgLSDPgCkgPCDOtSkgewogICAgICAgIGlmICh5ICsgeTAgPiAyKSBhcmVhICs9IDQgKiAoeCAtIHgwKTsKICAgICAgfSBlbHNlIGlmIChNYXRoLmFicyh5MCAtIDIpIDwgzrUpIGFyZWEgKz0gNCAqICh4IC0geDEpOyBlbHNlIGFyZWEgKz0gKCgzICogz4AgKyB4IC0geDApICUgKDIgKiDPgCkgLSDPgCkgKiAoeTAgKyB5KTsKICAgICAgeDEgPSB4MCwgeDAgPSB4LCB5MCA9IHk7CiAgICB9CiAgICByZXR1cm4gYXJlYTsKICB9CiAgZnVuY3Rpb24gZDNfZ2VvX2NsaXBTb3J0KGEsIGIpIHsKICAgIHJldHVybiAoKGEgPSBhLnBvaW50KVswXSA8IDAgPyBhWzFdIC0gz4AgLyAyIC0gzrUgOiDPgCAvIDIgLSBhWzFdKSAtICgoYiA9IGIucG9pbnQpWzBdIDwgMCA/IGJbMV0gLSDPgCAvIDIgLSDOtSA6IM+AIC8gMiAtIGJbMV0pOwogIH0KICB2YXIgZDNfZ2VvX2NsaXBBbnRpbWVyaWRpYW4gPSBkM19nZW9fY2xpcChkM190cnVlLCBkM19nZW9fY2xpcEFudGltZXJpZGlhbkxpbmUsIGQzX2dlb19jbGlwQW50aW1lcmlkaWFuSW50ZXJwb2xhdGUpOwogIGZ1bmN0aW9uIGQzX2dlb19jbGlwQW50aW1lcmlkaWFuTGluZShsaXN0ZW5lcikgewogICAgdmFyIM67MCA9IE5hTiwgz4YwID0gTmFOLCBzzrswID0gTmFOLCBjbGVhbjsKICAgIHJldHVybiB7CiAgICAgIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7CiAgICAgICAgbGlzdGVuZXIubGluZVN0YXJ0KCk7CiAgICAgICAgY2xlYW4gPSAxOwogICAgICB9LAogICAgICBwb2ludDogZnVuY3Rpb24ozrsxLCDPhjEpIHsKICAgICAgICB2YXIgc867MSA9IM67MSA+IDAgPyDPgCA6IC3PgCwgZM67ID0gTWF0aC5hYnMozrsxIC0gzrswKTsKICAgICAgICBpZiAoTWF0aC5hYnMoZM67IC0gz4ApIDwgzrUpIHsKICAgICAgICAgIGxpc3RlbmVyLnBvaW50KM67MCwgz4YwID0gKM+GMCArIM+GMSkgLyAyID4gMCA/IM+AIC8gMiA6IC3PgCAvIDIpOwogICAgICAgICAgbGlzdGVuZXIucG9pbnQoc867MCwgz4YwKTsKICAgICAgICAgIGxpc3RlbmVyLmxpbmVFbmQoKTsKICAgICAgICAgIGxpc3RlbmVyLmxpbmVTdGFydCgpOwogICAgICAgICAgbGlzdGVuZXIucG9pbnQoc867MSwgz4YwKTsKICAgICAgICAgIGxpc3RlbmVyLnBvaW50KM67MSwgz4YwKTsKICAgICAgICAgIGNsZWFuID0gMDsKICAgICAgICB9IGVsc2UgaWYgKHPOuzAgIT09IHPOuzEgJiYgZM67ID49IM+AKSB7CiAgICAgICAgICBpZiAoTWF0aC5hYnMozrswIC0gc867MCkgPCDOtSkgzrswIC09IHPOuzAgKiDOtTsKICAgICAgICAgIGlmIChNYXRoLmFicyjOuzEgLSBzzrsxKSA8IM61KSDOuzEgLT0gc867MSAqIM61OwogICAgICAgICAgz4YwID0gZDNfZ2VvX2NsaXBBbnRpbWVyaWRpYW5JbnRlcnNlY3QozrswLCDPhjAsIM67MSwgz4YxKTsKICAgICAgICAgIGxpc3RlbmVyLnBvaW50KHPOuzAsIM+GMCk7CiAgICAgICAgICBsaXN0ZW5lci5saW5lRW5kKCk7CiAgICAgICAgICBsaXN0ZW5lci5saW5lU3RhcnQoKTsKICAgICAgICAgIGxpc3RlbmVyLnBvaW50KHPOuzEsIM+GMCk7CiAgICAgICAgICBjbGVhbiA9IDA7CiAgICAgICAgfQogICAgICAgIGxpc3RlbmVyLnBvaW50KM67MCA9IM67MSwgz4YwID0gz4YxKTsKICAgICAgICBzzrswID0gc867MTsKICAgICAgfSwKICAgICAgbGluZUVuZDogZnVuY3Rpb24oKSB7CiAgICAgICAgbGlzdGVuZXIubGluZUVuZCgpOwogICAgICAgIM67MCA9IM+GMCA9IE5hTjsKICAgICAgfSwKICAgICAgY2xlYW46IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiAyIC0gY2xlYW47CiAgICAgIH0KICAgIH07CiAgfQogIGZ1bmN0aW9uIGQzX2dlb19jbGlwQW50aW1lcmlkaWFuSW50ZXJzZWN0KM67MCwgz4YwLCDOuzEsIM+GMSkgewogICAgdmFyIGNvc8+GMCwgY29zz4YxLCBzaW7OuzBfzrsxID0gTWF0aC5zaW4ozrswIC0gzrsxKTsKICAgIHJldHVybiBNYXRoLmFicyhzaW7OuzBfzrsxKSA+IM61ID8gTWF0aC5hdGFuKChNYXRoLnNpbijPhjApICogKGNvc8+GMSA9IE1hdGguY29zKM+GMSkpICogTWF0aC5zaW4ozrsxKSAtIE1hdGguc2luKM+GMSkgKiAoY29zz4YwID0gTWF0aC5jb3Moz4YwKSkgKiBNYXRoLnNpbijOuzApKSAvIChjb3PPhjAgKiBjb3PPhjEgKiBzaW7OuzBfzrsxKSkgOiAoz4YwICsgz4YxKSAvIDI7CiAgfQogIGZ1bmN0aW9uIGQzX2dlb19jbGlwQW50aW1lcmlkaWFuSW50ZXJwb2xhdGUoZnJvbSwgdG8sIGRpcmVjdGlvbiwgbGlzdGVuZXIpIHsKICAgIHZhciDPhjsKICAgIGlmIChmcm9tID09IG51bGwpIHsKICAgICAgz4YgPSBkaXJlY3Rpb24gKiDPgCAvIDI7CiAgICAgIGxpc3RlbmVyLnBvaW50KC3PgCwgz4YpOwogICAgICBsaXN0ZW5lci5wb2ludCgwLCDPhik7CiAgICAgIGxpc3RlbmVyLnBvaW50KM+ALCDPhik7CiAgICAgIGxpc3RlbmVyLnBvaW50KM+ALCAwKTsKICAgICAgbGlzdGVuZXIucG9pbnQoz4AsIC3Phik7CiAgICAgIGxpc3RlbmVyLnBvaW50KDAsIC3Phik7CiAgICAgIGxpc3RlbmVyLnBvaW50KC3PgCwgLc+GKTsKICAgICAgbGlzdGVuZXIucG9pbnQoLc+ALCAwKTsKICAgICAgbGlzdGVuZXIucG9pbnQoLc+ALCDPhik7CiAgICB9IGVsc2UgaWYgKE1hdGguYWJzKGZyb21bMF0gLSB0b1swXSkgPiDOtSkgewogICAgICB2YXIgcyA9IChmcm9tWzBdIDwgdG9bMF0gPyAxIDogLTEpICogz4A7CiAgICAgIM+GID0gZGlyZWN0aW9uICogcyAvIDI7CiAgICAgIGxpc3RlbmVyLnBvaW50KC1zLCDPhik7CiAgICAgIGxpc3RlbmVyLnBvaW50KDAsIM+GKTsKICAgICAgbGlzdGVuZXIucG9pbnQocywgz4YpOwogICAgfSBlbHNlIHsKICAgICAgbGlzdGVuZXIucG9pbnQodG9bMF0sIHRvWzFdKTsKICAgIH0KICB9CiAgZnVuY3Rpb24gZDNfZ2VvX2NsaXBDaXJjbGUocmFkaXVzKSB7CiAgICB2YXIgY3IgPSBNYXRoLmNvcyhyYWRpdXMpLCBzbWFsbFJhZGl1cyA9IGNyID4gMCwgbm90SGVtaXNwaGVyZSA9IE1hdGguYWJzKGNyKSA+IM61LCBpbnRlcnBvbGF0ZSA9IGQzX2dlb19jaXJjbGVJbnRlcnBvbGF0ZShyYWRpdXMsIDYgKiBkM19yYWRpYW5zKTsKICAgIHJldHVybiBkM19nZW9fY2xpcCh2aXNpYmxlLCBjbGlwTGluZSwgaW50ZXJwb2xhdGUpOwogICAgZnVuY3Rpb24gdmlzaWJsZSjOuywgz4YpIHsKICAgICAgcmV0dXJuIE1hdGguY29zKM67KSAqIE1hdGguY29zKM+GKSA+IGNyOwogICAgfQogICAgZnVuY3Rpb24gY2xpcExpbmUobGlzdGVuZXIpIHsKICAgICAgdmFyIHBvaW50MCwgYzAsIHYwLCB2MDAsIGNsZWFuOwogICAgICByZXR1cm4gewogICAgICAgIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7CiAgICAgICAgICB2MDAgPSB2MCA9IGZhbHNlOwogICAgICAgICAgY2xlYW4gPSAxOwogICAgICAgIH0sCiAgICAgICAgcG9pbnQ6IGZ1bmN0aW9uKM67LCDPhikgewogICAgICAgICAgdmFyIHBvaW50MSA9IFsgzrssIM+GIF0sIHBvaW50MiwgdiA9IHZpc2libGUozrssIM+GKSwgYyA9IHNtYWxsUmFkaXVzID8gdiA/IDAgOiBjb2RlKM67LCDPhikgOiB2ID8gY29kZSjOuyArICjOuyA8IDAgPyDPgCA6IC3PgCksIM+GKSA6IDA7CiAgICAgICAgICBpZiAoIXBvaW50MCAmJiAodjAwID0gdjAgPSB2KSkgbGlzdGVuZXIubGluZVN0YXJ0KCk7CiAgICAgICAgICBpZiAodiAhPT0gdjApIHsKICAgICAgICAgICAgcG9pbnQyID0gaW50ZXJzZWN0KHBvaW50MCwgcG9pbnQxKTsKICAgICAgICAgICAgaWYgKGQzX2dlb19zcGhlcmljYWxFcXVhbChwb2ludDAsIHBvaW50MikgfHwgZDNfZ2VvX3NwaGVyaWNhbEVxdWFsKHBvaW50MSwgcG9pbnQyKSkgewogICAgICAgICAgICAgIHBvaW50MVswXSArPSDOtTsKICAgICAgICAgICAgICBwb2ludDFbMV0gKz0gzrU7CiAgICAgICAgICAgICAgdiA9IHZpc2libGUocG9pbnQxWzBdLCBwb2ludDFbMV0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodiAhPT0gdjApIHsKICAgICAgICAgICAgY2xlYW4gPSAwOwogICAgICAgICAgICBpZiAodikgewogICAgICAgICAgICAgIGxpc3RlbmVyLmxpbmVTdGFydCgpOwogICAgICAgICAgICAgIHBvaW50MiA9IGludGVyc2VjdChwb2ludDEsIHBvaW50MCk7CiAgICAgICAgICAgICAgbGlzdGVuZXIucG9pbnQocG9pbnQyWzBdLCBwb2ludDJbMV0pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHBvaW50MiA9IGludGVyc2VjdChwb2ludDAsIHBvaW50MSk7CiAgICAgICAgICAgICAgbGlzdGVuZXIucG9pbnQocG9pbnQyWzBdLCBwb2ludDJbMV0pOwogICAgICAgICAgICAgIGxpc3RlbmVyLmxpbmVFbmQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwb2ludDAgPSBwb2ludDI7CiAgICAgICAgICB9IGVsc2UgaWYgKG5vdEhlbWlzcGhlcmUgJiYgcG9pbnQwICYmIHNtYWxsUmFkaXVzIF4gdikgewogICAgICAgICAgICB2YXIgdDsKICAgICAgICAgICAgaWYgKCEoYyAmIGMwKSAmJiAodCA9IGludGVyc2VjdChwb2ludDEsIHBvaW50MCwgdHJ1ZSkpKSB7CiAgICAgICAgICAgICAgY2xlYW4gPSAwOwogICAgICAgICAgICAgIGlmIChzbWFsbFJhZGl1cykgewogICAgICAgICAgICAgICAgbGlzdGVuZXIubGluZVN0YXJ0KCk7CiAgICAgICAgICAgICAgICBsaXN0ZW5lci5wb2ludCh0WzBdWzBdLCB0WzBdWzFdKTsKICAgICAgICAgICAgICAgIGxpc3RlbmVyLnBvaW50KHRbMV1bMF0sIHRbMV1bMV0pOwogICAgICAgICAgICAgICAgbGlzdGVuZXIubGluZUVuZCgpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBsaXN0ZW5lci5wb2ludCh0WzFdWzBdLCB0WzFdWzFdKTsKICAgICAgICAgICAgICAgIGxpc3RlbmVyLmxpbmVFbmQoKTsKICAgICAgICAgICAgICAgIGxpc3RlbmVyLmxpbmVTdGFydCgpOwogICAgICAgICAgICAgICAgbGlzdGVuZXIucG9pbnQodFswXVswXSwgdFswXVsxXSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodiAmJiAoIXBvaW50MCB8fCAhZDNfZ2VvX3NwaGVyaWNhbEVxdWFsKHBvaW50MCwgcG9pbnQxKSkpIHsKICAgICAgICAgICAgbGlzdGVuZXIucG9pbnQocG9pbnQxWzBdLCBwb2ludDFbMV0pOwogICAgICAgICAgfQogICAgICAgICAgcG9pbnQwID0gcG9pbnQxLCB2MCA9IHYsIGMwID0gYzsKICAgICAgICB9LAogICAgICAgIGxpbmVFbmQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgaWYgKHYwKSBsaXN0ZW5lci5saW5lRW5kKCk7CiAgICAgICAgICBwb2ludDAgPSBudWxsOwogICAgICAgIH0sCiAgICAgICAgY2xlYW46IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIGNsZWFuIHwgKHYwMCAmJiB2MCkgPDwgMTsKICAgICAgICB9CiAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBpbnRlcnNlY3QoYSwgYiwgdHdvKSB7CiAgICAgIHZhciBwYSA9IGQzX2dlb19jYXJ0ZXNpYW4oYSksIHBiID0gZDNfZ2VvX2NhcnRlc2lhbihiKTsKICAgICAgdmFyIG4xID0gWyAxLCAwLCAwIF0sIG4yID0gZDNfZ2VvX2NhcnRlc2lhbkNyb3NzKHBhLCBwYiksIG4ybjIgPSBkM19nZW9fY2FydGVzaWFuRG90KG4yLCBuMiksIG4xbjIgPSBuMlswXSwgZGV0ZXJtaW5hbnQgPSBuMm4yIC0gbjFuMiAqIG4xbjI7CiAgICAgIGlmICghZGV0ZXJtaW5hbnQpIHJldHVybiAhdHdvICYmIGE7CiAgICAgIHZhciBjMSA9IGNyICogbjJuMiAvIGRldGVybWluYW50LCBjMiA9IC1jciAqIG4xbjIgLyBkZXRlcm1pbmFudCwgbjF4bjIgPSBkM19nZW9fY2FydGVzaWFuQ3Jvc3MobjEsIG4yKSwgQSA9IGQzX2dlb19jYXJ0ZXNpYW5TY2FsZShuMSwgYzEpLCBCID0gZDNfZ2VvX2NhcnRlc2lhblNjYWxlKG4yLCBjMik7CiAgICAgIGQzX2dlb19jYXJ0ZXNpYW5BZGQoQSwgQik7CiAgICAgIHZhciB1ID0gbjF4bjIsIHcgPSBkM19nZW9fY2FydGVzaWFuRG90KEEsIHUpLCB1dSA9IGQzX2dlb19jYXJ0ZXNpYW5Eb3QodSwgdSksIHQyID0gdyAqIHcgLSB1dSAqIChkM19nZW9fY2FydGVzaWFuRG90KEEsIEEpIC0gMSk7CiAgICAgIGlmICh0MiA8IDApIHJldHVybjsKICAgICAgdmFyIHQgPSBNYXRoLnNxcnQodDIpLCBxID0gZDNfZ2VvX2NhcnRlc2lhblNjYWxlKHUsICgtdyAtIHQpIC8gdXUpOwogICAgICBkM19nZW9fY2FydGVzaWFuQWRkKHEsIEEpOwogICAgICBxID0gZDNfZ2VvX3NwaGVyaWNhbChxKTsKICAgICAgaWYgKCF0d28pIHJldHVybiBxOwogICAgICB2YXIgzrswID0gYVswXSwgzrsxID0gYlswXSwgz4YwID0gYVsxXSwgz4YxID0gYlsxXSwgejsKICAgICAgaWYgKM67MSA8IM67MCkgeiA9IM67MCwgzrswID0gzrsxLCDOuzEgPSB6OwogICAgICB2YXIgzrTOuyA9IM67MSAtIM67MCwgcG9sYXIgPSBNYXRoLmFicyjOtM67IC0gz4ApIDwgzrUsIG1lcmlkaWFuID0gcG9sYXIgfHwgzrTOuyA8IM61OwogICAgICBpZiAoIXBvbGFyICYmIM+GMSA8IM+GMCkgeiA9IM+GMCwgz4YwID0gz4YxLCDPhjEgPSB6OwogICAgICBpZiAobWVyaWRpYW4gPyBwb2xhciA/IM+GMCArIM+GMSA+IDAgXiBxWzFdIDwgKE1hdGguYWJzKHFbMF0gLSDOuzApIDwgzrUgPyDPhjAgOiDPhjEpIDogz4YwIDw9IHFbMV0gJiYgcVsxXSA8PSDPhjEgOiDOtM67ID4gz4AgXiAozrswIDw9IHFbMF0gJiYgcVswXSA8PSDOuzEpKSB7CiAgICAgICAgdmFyIHExID0gZDNfZ2VvX2NhcnRlc2lhblNjYWxlKHUsICgtdyArIHQpIC8gdXUpOwogICAgICAgIGQzX2dlb19jYXJ0ZXNpYW5BZGQocTEsIEEpOwogICAgICAgIHJldHVybiBbIHEsIGQzX2dlb19zcGhlcmljYWwocTEpIF07CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGNvZGUozrssIM+GKSB7CiAgICAgIHZhciByID0gc21hbGxSYWRpdXMgPyByYWRpdXMgOiDPgCAtIHJhZGl1cywgY29kZSA9IDA7CiAgICAgIGlmICjOuyA8IC1yKSBjb2RlIHw9IDE7IGVsc2UgaWYgKM67ID4gcikgY29kZSB8PSAyOwogICAgICBpZiAoz4YgPCAtcikgY29kZSB8PSA0OyBlbHNlIGlmICjPhiA+IHIpIGNvZGUgfD0gODsKICAgICAgcmV0dXJuIGNvZGU7CiAgICB9CiAgfQogIHZhciBkM19nZW9fY2xpcFZpZXdNQVggPSAxZTk7CiAgZnVuY3Rpb24gZDNfZ2VvX2NsaXBWaWV3KHgwLCB5MCwgeDEsIHkxKSB7CiAgICByZXR1cm4gZnVuY3Rpb24obGlzdGVuZXIpIHsKICAgICAgdmFyIGxpc3RlbmVyXyA9IGxpc3RlbmVyLCBidWZmZXJMaXN0ZW5lciA9IGQzX2dlb19jbGlwQnVmZmVyTGlzdGVuZXIoKSwgc2VnbWVudHMsIHBvbHlnb24sIHJpbmc7CiAgICAgIHZhciBjbGlwID0gewogICAgICAgIHBvaW50OiBwb2ludCwKICAgICAgICBsaW5lU3RhcnQ6IGxpbmVTdGFydCwKICAgICAgICBsaW5lRW5kOiBsaW5lRW5kLAogICAgICAgIHBvbHlnb25TdGFydDogZnVuY3Rpb24oKSB7CiAgICAgICAgICBsaXN0ZW5lciA9IGJ1ZmZlckxpc3RlbmVyOwogICAgICAgICAgc2VnbWVudHMgPSBbXTsKICAgICAgICAgIHBvbHlnb24gPSBbXTsKICAgICAgICB9LAogICAgICAgIHBvbHlnb25FbmQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgbGlzdGVuZXIgPSBsaXN0ZW5lcl87CiAgICAgICAgICBpZiAoKHNlZ21lbnRzID0gZDMubWVyZ2Uoc2VnbWVudHMpKS5sZW5ndGgpIHsKICAgICAgICAgICAgbGlzdGVuZXIucG9seWdvblN0YXJ0KCk7CiAgICAgICAgICAgIGQzX2dlb19jbGlwUG9seWdvbihzZWdtZW50cywgY29tcGFyZSwgaW5zaWRlLCBpbnRlcnBvbGF0ZSwgbGlzdGVuZXIpOwogICAgICAgICAgICBsaXN0ZW5lci5wb2x5Z29uRW5kKCk7CiAgICAgICAgICB9IGVsc2UgaWYgKGluc2lkZVBvbHlnb24oWyB4MCwgeTAgXSkpIHsKICAgICAgICAgICAgbGlzdGVuZXIucG9seWdvblN0YXJ0KCksIGxpc3RlbmVyLmxpbmVTdGFydCgpOwogICAgICAgICAgICBpbnRlcnBvbGF0ZShudWxsLCBudWxsLCAxLCBsaXN0ZW5lcik7CiAgICAgICAgICAgIGxpc3RlbmVyLmxpbmVFbmQoKSwgbGlzdGVuZXIucG9seWdvbkVuZCgpOwogICAgICAgICAgfQogICAgICAgICAgc2VnbWVudHMgPSBwb2x5Z29uID0gcmluZyA9IG51bGw7CiAgICAgICAgfQogICAgICB9OwogICAgICBmdW5jdGlvbiBpbnNpZGUocG9pbnQpIHsKICAgICAgICB2YXIgYSA9IGNvcm5lcihwb2ludCwgLTEpLCBpID0gaW5zaWRlUG9seWdvbihbIGEgPT09IDAgfHwgYSA9PT0gMyA/IHgwIDogeDEsIGEgPiAxID8geTEgOiB5MCBdKTsKICAgICAgICByZXR1cm4gaTsKICAgICAgfQogICAgICBmdW5jdGlvbiBpbnNpZGVQb2x5Z29uKHApIHsKICAgICAgICB2YXIgd24gPSAwLCBuID0gcG9seWdvbi5sZW5ndGgsIHkgPSBwWzFdOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBmb3IgKHZhciBqID0gMSwgdiA9IHBvbHlnb25baV0sIG0gPSB2Lmxlbmd0aCwgYSA9IHZbMF07IGogPCBtOyArK2opIHsKICAgICAgICAgICAgYiA9IHZbal07CiAgICAgICAgICAgIGlmIChhWzFdIDw9IHkpIHsKICAgICAgICAgICAgICBpZiAoYlsxXSA+IHkgJiYgaXNMZWZ0KGEsIGIsIHApID4gMCkgKyt3bjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBpZiAoYlsxXSA8PSB5ICYmIGlzTGVmdChhLCBiLCBwKSA8IDApIC0td247CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYSA9IGI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB3biAhPT0gMDsKICAgICAgfQogICAgICBmdW5jdGlvbiBpc0xlZnQoYSwgYiwgYykgewogICAgICAgIHJldHVybiAoYlswXSAtIGFbMF0pICogKGNbMV0gLSBhWzFdKSAtIChjWzBdIC0gYVswXSkgKiAoYlsxXSAtIGFbMV0pOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGludGVycG9sYXRlKGZyb20sIHRvLCBkaXJlY3Rpb24sIGxpc3RlbmVyKSB7CiAgICAgICAgdmFyIGEgPSAwLCBhMSA9IDA7CiAgICAgICAgaWYgKGZyb20gPT0gbnVsbCB8fCAoYSA9IGNvcm5lcihmcm9tLCBkaXJlY3Rpb24pKSAhPT0gKGExID0gY29ybmVyKHRvLCBkaXJlY3Rpb24pKSB8fCBjb21wYXJlUG9pbnRzKGZyb20sIHRvKSA8IDAgXiBkaXJlY3Rpb24gPiAwKSB7CiAgICAgICAgICBkbyB7CiAgICAgICAgICAgIGxpc3RlbmVyLnBvaW50KGEgPT09IDAgfHwgYSA9PT0gMyA/IHgwIDogeDEsIGEgPiAxID8geTEgOiB5MCk7CiAgICAgICAgICB9IHdoaWxlICgoYSA9IChhICsgZGlyZWN0aW9uICsgNCkgJSA0KSAhPT0gYTEpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBsaXN0ZW5lci5wb2ludCh0b1swXSwgdG9bMV0pOwogICAgICAgIH0KICAgICAgfQogICAgICBmdW5jdGlvbiB2aXNpYmxlKHgsIHkpIHsKICAgICAgICByZXR1cm4geDAgPD0geCAmJiB4IDw9IHgxICYmIHkwIDw9IHkgJiYgeSA8PSB5MTsKICAgICAgfQogICAgICBmdW5jdGlvbiBwb2ludCh4LCB5KSB7CiAgICAgICAgaWYgKHZpc2libGUoeCwgeSkpIGxpc3RlbmVyLnBvaW50KHgsIHkpOwogICAgICB9CiAgICAgIHZhciB4X18sIHlfXywgdl9fLCB4XywgeV8sIHZfLCBmaXJzdDsKICAgICAgZnVuY3Rpb24gbGluZVN0YXJ0KCkgewogICAgICAgIGNsaXAucG9pbnQgPSBsaW5lUG9pbnQ7CiAgICAgICAgaWYgKHBvbHlnb24pIHBvbHlnb24ucHVzaChyaW5nID0gW10pOwogICAgICAgIGZpcnN0ID0gdHJ1ZTsKICAgICAgICB2XyA9IGZhbHNlOwogICAgICAgIHhfID0geV8gPSBOYU47CiAgICAgIH0KICAgICAgZnVuY3Rpb24gbGluZUVuZCgpIHsKICAgICAgICBpZiAoc2VnbWVudHMpIHsKICAgICAgICAgIGxpbmVQb2ludCh4X18sIHlfXyk7CiAgICAgICAgICBpZiAodl9fICYmIHZfKSBidWZmZXJMaXN0ZW5lci5yZWpvaW4oKTsKICAgICAgICAgIHNlZ21lbnRzLnB1c2goYnVmZmVyTGlzdGVuZXIuYnVmZmVyKCkpOwogICAgICAgIH0KICAgICAgICBjbGlwLnBvaW50ID0gcG9pbnQ7CiAgICAgICAgaWYgKHZfKSBsaXN0ZW5lci5saW5lRW5kKCk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gbGluZVBvaW50KHgsIHkpIHsKICAgICAgICB4ID0gTWF0aC5tYXgoLWQzX2dlb19jbGlwVmlld01BWCwgTWF0aC5taW4oZDNfZ2VvX2NsaXBWaWV3TUFYLCB4KSk7CiAgICAgICAgeSA9IE1hdGgubWF4KC1kM19nZW9fY2xpcFZpZXdNQVgsIE1hdGgubWluKGQzX2dlb19jbGlwVmlld01BWCwgeSkpOwogICAgICAgIHZhciB2ID0gdmlzaWJsZSh4LCB5KTsKICAgICAgICBpZiAocG9seWdvbikgcmluZy5wdXNoKFsgeCwgeSBdKTsKICAgICAgICBpZiAoZmlyc3QpIHsKICAgICAgICAgIHhfXyA9IHgsIHlfXyA9IHksIHZfXyA9IHY7CiAgICAgICAgICBmaXJzdCA9IGZhbHNlOwogICAgICAgICAgaWYgKHYpIHsKICAgICAgICAgICAgbGlzdGVuZXIubGluZVN0YXJ0KCk7CiAgICAgICAgICAgIGxpc3RlbmVyLnBvaW50KHgsIHkpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAodiAmJiB2XykgbGlzdGVuZXIucG9pbnQoeCwgeSk7IGVsc2UgewogICAgICAgICAgICB2YXIgYSA9IFsgeF8sIHlfIF0sIGIgPSBbIHgsIHkgXTsKICAgICAgICAgICAgaWYgKGNsaXBMaW5lKGEsIGIpKSB7CiAgICAgICAgICAgICAgaWYgKCF2XykgewogICAgICAgICAgICAgICAgbGlzdGVuZXIubGluZVN0YXJ0KCk7CiAgICAgICAgICAgICAgICBsaXN0ZW5lci5wb2ludChhWzBdLCBhWzFdKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgbGlzdGVuZXIucG9pbnQoYlswXSwgYlsxXSk7CiAgICAgICAgICAgICAgaWYgKCF2KSBsaXN0ZW5lci5saW5lRW5kKCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAodikgewogICAgICAgICAgICAgIGxpc3RlbmVyLmxpbmVTdGFydCgpOwogICAgICAgICAgICAgIGxpc3RlbmVyLnBvaW50KHgsIHkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHhfID0geCwgeV8gPSB5LCB2XyA9IHY7CiAgICAgIH0KICAgICAgcmV0dXJuIGNsaXA7CiAgICB9OwogICAgZnVuY3Rpb24gY29ybmVyKHAsIGRpcmVjdGlvbikgewogICAgICByZXR1cm4gTWF0aC5hYnMocFswXSAtIHgwKSA8IM61ID8gZGlyZWN0aW9uID4gMCA/IDAgOiAzIDogTWF0aC5hYnMocFswXSAtIHgxKSA8IM61ID8gZGlyZWN0aW9uID4gMCA/IDIgOiAxIDogTWF0aC5hYnMocFsxXSAtIHkwKSA8IM61ID8gZGlyZWN0aW9uID4gMCA/IDEgOiAwIDogZGlyZWN0aW9uID4gMCA/IDMgOiAyOwogICAgfQogICAgZnVuY3Rpb24gY29tcGFyZShhLCBiKSB7CiAgICAgIHJldHVybiBjb21wYXJlUG9pbnRzKGEucG9pbnQsIGIucG9pbnQpOwogICAgfQogICAgZnVuY3Rpb24gY29tcGFyZVBvaW50cyhhLCBiKSB7CiAgICAgIHZhciBjYSA9IGNvcm5lcihhLCAxKSwgY2IgPSBjb3JuZXIoYiwgMSk7CiAgICAgIHJldHVybiBjYSAhPT0gY2IgPyBjYSAtIGNiIDogY2EgPT09IDAgPyBiWzFdIC0gYVsxXSA6IGNhID09PSAxID8gYVswXSAtIGJbMF0gOiBjYSA9PT0gMiA/IGFbMV0gLSBiWzFdIDogYlswXSAtIGFbMF07CiAgICB9CiAgICBmdW5jdGlvbiBjbGlwTGluZShhLCBiKSB7CiAgICAgIHZhciBkeCA9IGJbMF0gLSBhWzBdLCBkeSA9IGJbMV0gLSBhWzFdLCB0ID0gWyAwLCAxIF07CiAgICAgIGlmIChNYXRoLmFicyhkeCkgPCDOtSAmJiBNYXRoLmFicyhkeSkgPCDOtSkgcmV0dXJuIHgwIDw9IGFbMF0gJiYgYVswXSA8PSB4MSAmJiB5MCA8PSBhWzFdICYmIGFbMV0gPD0geTE7CiAgICAgIGlmIChkM19nZW9fY2xpcFZpZXdUKHgwIC0gYVswXSwgZHgsIHQpICYmIGQzX2dlb19jbGlwVmlld1QoYVswXSAtIHgxLCAtZHgsIHQpICYmIGQzX2dlb19jbGlwVmlld1QoeTAgLSBhWzFdLCBkeSwgdCkgJiYgZDNfZ2VvX2NsaXBWaWV3VChhWzFdIC0geTEsIC1keSwgdCkpIHsKICAgICAgICBpZiAodFsxXSA8IDEpIHsKICAgICAgICAgIGJbMF0gPSBhWzBdICsgdFsxXSAqIGR4OwogICAgICAgICAgYlsxXSA9IGFbMV0gKyB0WzFdICogZHk7CiAgICAgICAgfQogICAgICAgIGlmICh0WzBdID4gMCkgewogICAgICAgICAgYVswXSArPSB0WzBdICogZHg7CiAgICAgICAgICBhWzFdICs9IHRbMF0gKiBkeTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KICBmdW5jdGlvbiBkM19nZW9fY2xpcFZpZXdUKG51bSwgZGVub21pbmF0b3IsIHQpIHsKICAgIGlmIChNYXRoLmFicyhkZW5vbWluYXRvcikgPCDOtSkgcmV0dXJuIG51bSA8PSAwOwogICAgdmFyIHUgPSBudW0gLyBkZW5vbWluYXRvcjsKICAgIGlmIChkZW5vbWluYXRvciA+IDApIHsKICAgICAgaWYgKHUgPiB0WzFdKSByZXR1cm4gZmFsc2U7CiAgICAgIGlmICh1ID4gdFswXSkgdFswXSA9IHU7CiAgICB9IGVsc2UgewogICAgICBpZiAodSA8IHRbMF0pIHJldHVybiBmYWxzZTsKICAgICAgaWYgKHUgPCB0WzFdKSB0WzFdID0gdTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KICBmdW5jdGlvbiBkM19nZW9fY29tcG9zZShhLCBiKSB7CiAgICBmdW5jdGlvbiBjb21wb3NlKHgsIHkpIHsKICAgICAgcmV0dXJuIHggPSBhKHgsIHkpLCBiKHhbMF0sIHhbMV0pOwogICAgfQogICAgaWYgKGEuaW52ZXJ0ICYmIGIuaW52ZXJ0KSBjb21wb3NlLmludmVydCA9IGZ1bmN0aW9uKHgsIHkpIHsKICAgICAgcmV0dXJuIHggPSBiLmludmVydCh4LCB5KSwgeCAmJiBhLmludmVydCh4WzBdLCB4WzFdKTsKICAgIH07CiAgICByZXR1cm4gY29tcG9zZTsKICB9CiAgZnVuY3Rpb24gZDNfZ2VvX3Jlc2FtcGxlKHByb2plY3QpIHsKICAgIHZhciDOtDIgPSAuNSwgbWF4RGVwdGggPSAxNjsKICAgIGZ1bmN0aW9uIHJlc2FtcGxlKHN0cmVhbSkgewogICAgICB2YXIgzrswLCB4MCwgeTAsIGEwLCBiMCwgYzA7CiAgICAgIHZhciByZXNhbXBsZSA9IHsKICAgICAgICBwb2ludDogcG9pbnQsCiAgICAgICAgbGluZVN0YXJ0OiBsaW5lU3RhcnQsCiAgICAgICAgbGluZUVuZDogbGluZUVuZCwKICAgICAgICBwb2x5Z29uU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgc3RyZWFtLnBvbHlnb25TdGFydCgpOwogICAgICAgICAgcmVzYW1wbGUubGluZVN0YXJ0ID0gcG9seWdvbkxpbmVTdGFydDsKICAgICAgICB9LAogICAgICAgIHBvbHlnb25FbmQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgc3RyZWFtLnBvbHlnb25FbmQoKTsKICAgICAgICAgIHJlc2FtcGxlLmxpbmVTdGFydCA9IGxpbmVTdGFydDsKICAgICAgICB9CiAgICAgIH07CiAgICAgIGZ1bmN0aW9uIHBvaW50KHgsIHkpIHsKICAgICAgICB4ID0gcHJvamVjdCh4LCB5KTsKICAgICAgICBzdHJlYW0ucG9pbnQoeFswXSwgeFsxXSk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gbGluZVN0YXJ0KCkgewogICAgICAgIHgwID0gTmFOOwogICAgICAgIHJlc2FtcGxlLnBvaW50ID0gbGluZVBvaW50OwogICAgICAgIHN0cmVhbS5saW5lU3RhcnQoKTsKICAgICAgfQogICAgICBmdW5jdGlvbiBsaW5lUG9pbnQozrssIM+GKSB7CiAgICAgICAgdmFyIGMgPSBkM19nZW9fY2FydGVzaWFuKFsgzrssIM+GIF0pLCBwID0gcHJvamVjdCjOuywgz4YpOwogICAgICAgIHJlc2FtcGxlTGluZVRvKHgwLCB5MCwgzrswLCBhMCwgYjAsIGMwLCB4MCA9IHBbMF0sIHkwID0gcFsxXSwgzrswID0gzrssIGEwID0gY1swXSwgYjAgPSBjWzFdLCBjMCA9IGNbMl0sIG1heERlcHRoLCBzdHJlYW0pOwogICAgICAgIHN0cmVhbS5wb2ludCh4MCwgeTApOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGxpbmVFbmQoKSB7CiAgICAgICAgcmVzYW1wbGUucG9pbnQgPSBwb2ludDsKICAgICAgICBzdHJlYW0ubGluZUVuZCgpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIHBvbHlnb25MaW5lU3RhcnQoKSB7CiAgICAgICAgdmFyIM67MDAsIM+GMDAsIHgwMCwgeTAwLCBhMDAsIGIwMCwgYzAwOwogICAgICAgIGxpbmVTdGFydCgpOwogICAgICAgIHJlc2FtcGxlLnBvaW50ID0gZnVuY3Rpb24ozrssIM+GKSB7CiAgICAgICAgICBsaW5lUG9pbnQozrswMCA9IM67LCDPhjAwID0gz4YpLCB4MDAgPSB4MCwgeTAwID0geTAsIGEwMCA9IGEwLCBiMDAgPSBiMCwgYzAwID0gYzA7CiAgICAgICAgICByZXNhbXBsZS5wb2ludCA9IGxpbmVQb2ludDsKICAgICAgICB9OwogICAgICAgIHJlc2FtcGxlLmxpbmVFbmQgPSBmdW5jdGlvbigpIHsKICAgICAgICAgIHJlc2FtcGxlTGluZVRvKHgwLCB5MCwgzrswLCBhMCwgYjAsIGMwLCB4MDAsIHkwMCwgzrswMCwgYTAwLCBiMDAsIGMwMCwgbWF4RGVwdGgsIHN0cmVhbSk7CiAgICAgICAgICByZXNhbXBsZS5saW5lRW5kID0gbGluZUVuZDsKICAgICAgICAgIGxpbmVFbmQoKTsKICAgICAgICB9OwogICAgICB9CiAgICAgIHJldHVybiByZXNhbXBsZTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlc2FtcGxlTGluZVRvKHgwLCB5MCwgzrswLCBhMCwgYjAsIGMwLCB4MSwgeTEsIM67MSwgYTEsIGIxLCBjMSwgZGVwdGgsIHN0cmVhbSkgewogICAgICB2YXIgZHggPSB4MSAtIHgwLCBkeSA9IHkxIC0geTAsIGQyID0gZHggKiBkeCArIGR5ICogZHk7CiAgICAgIGlmIChkMiA+IDQgKiDOtDIgJiYgZGVwdGgtLSkgewogICAgICAgIHZhciBhID0gYTAgKyBhMSwgYiA9IGIwICsgYjEsIGMgPSBjMCArIGMxLCBtID0gTWF0aC5zcXJ0KGEgKiBhICsgYiAqIGIgKyBjICogYyksIM+GMiA9IE1hdGguYXNpbihjIC89IG0pLCDOuzIgPSBNYXRoLmFicyhNYXRoLmFicyhjKSAtIDEpIDwgzrUgPyAozrswICsgzrsxKSAvIDIgOiBNYXRoLmF0YW4yKGIsIGEpLCBwID0gcHJvamVjdCjOuzIsIM+GMiksIHgyID0gcFswXSwgeTIgPSBwWzFdLCBkeDIgPSB4MiAtIHgwLCBkeTIgPSB5MiAtIHkwLCBkeiA9IGR5ICogZHgyIC0gZHggKiBkeTI7CiAgICAgICAgaWYgKGR6ICogZHogLyBkMiA+IM60MiB8fCBNYXRoLmFicygoZHggKiBkeDIgKyBkeSAqIGR5MikgLyBkMiAtIC41KSA+IC4zKSB7CiAgICAgICAgICByZXNhbXBsZUxpbmVUbyh4MCwgeTAsIM67MCwgYTAsIGIwLCBjMCwgeDIsIHkyLCDOuzIsIGEgLz0gbSwgYiAvPSBtLCBjLCBkZXB0aCwgc3RyZWFtKTsKICAgICAgICAgIHN0cmVhbS5wb2ludCh4MiwgeTIpOwogICAgICAgICAgcmVzYW1wbGVMaW5lVG8oeDIsIHkyLCDOuzIsIGEsIGIsIGMsIHgxLCB5MSwgzrsxLCBhMSwgYjEsIGMxLCBkZXB0aCwgc3RyZWFtKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJlc2FtcGxlLnByZWNpc2lvbiA9IGZ1bmN0aW9uKF8pIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gTWF0aC5zcXJ0KM60Mik7CiAgICAgIG1heERlcHRoID0gKM60MiA9IF8gKiBfKSA+IDAgJiYgMTY7CiAgICAgIHJldHVybiByZXNhbXBsZTsKICAgIH07CiAgICByZXR1cm4gcmVzYW1wbGU7CiAgfQogIGQzLmdlby5wcm9qZWN0aW9uID0gZDNfZ2VvX3Byb2plY3Rpb247CiAgZDMuZ2VvLnByb2plY3Rpb25NdXRhdG9yID0gZDNfZ2VvX3Byb2plY3Rpb25NdXRhdG9yOwogIGZ1bmN0aW9uIGQzX2dlb19wcm9qZWN0aW9uKHByb2plY3QpIHsKICAgIHJldHVybiBkM19nZW9fcHJvamVjdGlvbk11dGF0b3IoZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBwcm9qZWN0OwogICAgfSkoKTsKICB9CiAgZnVuY3Rpb24gZDNfZ2VvX3Byb2plY3Rpb25NdXRhdG9yKHByb2plY3RBdCkgewogICAgdmFyIHByb2plY3QsIHJvdGF0ZSwgcHJvamVjdFJvdGF0ZSwgcHJvamVjdFJlc2FtcGxlID0gZDNfZ2VvX3Jlc2FtcGxlKGZ1bmN0aW9uKHgsIHkpIHsKICAgICAgeCA9IHByb2plY3QoeCwgeSk7CiAgICAgIHJldHVybiBbIHhbMF0gKiBrICsgzrR4LCDOtHkgLSB4WzFdICogayBdOwogICAgfSksIGsgPSAxNTAsIHggPSA0ODAsIHkgPSAyNTAsIM67ID0gMCwgz4YgPSAwLCDOtM67ID0gMCwgzrTPhiA9IDAsIM60zrMgPSAwLCDOtHgsIM60eSwgcHJlY2xpcCA9IGQzX2dlb19jbGlwQW50aW1lcmlkaWFuLCBwb3N0Y2xpcCA9IGQzX2lkZW50aXR5LCBjbGlwQW5nbGUgPSBudWxsLCBjbGlwRXh0ZW50ID0gbnVsbDsKICAgIGZ1bmN0aW9uIHByb2plY3Rpb24ocG9pbnQpIHsKICAgICAgcG9pbnQgPSBwcm9qZWN0Um90YXRlKHBvaW50WzBdICogZDNfcmFkaWFucywgcG9pbnRbMV0gKiBkM19yYWRpYW5zKTsKICAgICAgcmV0dXJuIFsgcG9pbnRbMF0gKiBrICsgzrR4LCDOtHkgLSBwb2ludFsxXSAqIGsgXTsKICAgIH0KICAgIGZ1bmN0aW9uIGludmVydChwb2ludCkgewogICAgICBwb2ludCA9IHByb2plY3RSb3RhdGUuaW52ZXJ0KChwb2ludFswXSAtIM60eCkgLyBrLCAozrR5IC0gcG9pbnRbMV0pIC8gayk7CiAgICAgIHJldHVybiBwb2ludCAmJiBbIHBvaW50WzBdICogZDNfZGVncmVlcywgcG9pbnRbMV0gKiBkM19kZWdyZWVzIF07CiAgICB9CiAgICBwcm9qZWN0aW9uLnN0cmVhbSA9IGZ1bmN0aW9uKHN0cmVhbSkgewogICAgICByZXR1cm4gZDNfZ2VvX3Byb2plY3Rpb25SYWRpYW5zUm90YXRlKHJvdGF0ZSwgcHJlY2xpcChwcm9qZWN0UmVzYW1wbGUocG9zdGNsaXAoc3RyZWFtKSkpKTsKICAgIH07CiAgICBwcm9qZWN0aW9uLmNsaXBBbmdsZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gY2xpcEFuZ2xlOwogICAgICBwcmVjbGlwID0gXyA9PSBudWxsID8gKGNsaXBBbmdsZSA9IF8sIGQzX2dlb19jbGlwQW50aW1lcmlkaWFuKSA6IGQzX2dlb19jbGlwQ2lyY2xlKChjbGlwQW5nbGUgPSArXykgKiBkM19yYWRpYW5zKTsKICAgICAgcmV0dXJuIHByb2plY3Rpb247CiAgICB9OwogICAgcHJvamVjdGlvbi5jbGlwRXh0ZW50ID0gZnVuY3Rpb24oXykgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBjbGlwRXh0ZW50OwogICAgICBjbGlwRXh0ZW50ID0gXzsKICAgICAgcG9zdGNsaXAgPSBfID09IG51bGwgPyBkM19pZGVudGl0eSA6IGQzX2dlb19jbGlwVmlldyhfWzBdWzBdLCBfWzBdWzFdLCBfWzFdWzBdLCBfWzFdWzFdKTsKICAgICAgcmV0dXJuIHByb2plY3Rpb247CiAgICB9OwogICAgcHJvamVjdGlvbi5zY2FsZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gazsKICAgICAgayA9ICtfOwogICAgICByZXR1cm4gcmVzZXQoKTsKICAgIH07CiAgICBwcm9qZWN0aW9uLnRyYW5zbGF0ZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gWyB4LCB5IF07CiAgICAgIHggPSArX1swXTsKICAgICAgeSA9ICtfWzFdOwogICAgICByZXR1cm4gcmVzZXQoKTsKICAgIH07CiAgICBwcm9qZWN0aW9uLmNlbnRlciA9IGZ1bmN0aW9uKF8pIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gWyDOuyAqIGQzX2RlZ3JlZXMsIM+GICogZDNfZGVncmVlcyBdOwogICAgICDOuyA9IF9bMF0gJSAzNjAgKiBkM19yYWRpYW5zOwogICAgICDPhiA9IF9bMV0gJSAzNjAgKiBkM19yYWRpYW5zOwogICAgICByZXR1cm4gcmVzZXQoKTsKICAgIH07CiAgICBwcm9qZWN0aW9uLnJvdGF0ZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gWyDOtM67ICogZDNfZGVncmVlcywgzrTPhiAqIGQzX2RlZ3JlZXMsIM60zrMgKiBkM19kZWdyZWVzIF07CiAgICAgIM60zrsgPSBfWzBdICUgMzYwICogZDNfcmFkaWFuczsKICAgICAgzrTPhiA9IF9bMV0gJSAzNjAgKiBkM19yYWRpYW5zOwogICAgICDOtM6zID0gXy5sZW5ndGggPiAyID8gX1syXSAlIDM2MCAqIGQzX3JhZGlhbnMgOiAwOwogICAgICByZXR1cm4gcmVzZXQoKTsKICAgIH07CiAgICBkMy5yZWJpbmQocHJvamVjdGlvbiwgcHJvamVjdFJlc2FtcGxlLCAicHJlY2lzaW9uIik7CiAgICBmdW5jdGlvbiByZXNldCgpIHsKICAgICAgcHJvamVjdFJvdGF0ZSA9IGQzX2dlb19jb21wb3NlKHJvdGF0ZSA9IGQzX2dlb19yb3RhdGlvbijOtM67LCDOtM+GLCDOtM6zKSwgcHJvamVjdCk7CiAgICAgIHZhciBjZW50ZXIgPSBwcm9qZWN0KM67LCDPhik7CiAgICAgIM60eCA9IHggLSBjZW50ZXJbMF0gKiBrOwogICAgICDOtHkgPSB5ICsgY2VudGVyWzFdICogazsKICAgICAgcmV0dXJuIHByb2plY3Rpb247CiAgICB9CiAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgIHByb2plY3QgPSBwcm9qZWN0QXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgcHJvamVjdGlvbi5pbnZlcnQgPSBwcm9qZWN0LmludmVydCAmJiBpbnZlcnQ7CiAgICAgIHJldHVybiByZXNldCgpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gZDNfZ2VvX3Byb2plY3Rpb25SYWRpYW5zUm90YXRlKHJvdGF0ZSwgc3RyZWFtKSB7CiAgICByZXR1cm4gewogICAgICBwb2ludDogZnVuY3Rpb24oeCwgeSkgewogICAgICAgIHkgPSByb3RhdGUoeCAqIGQzX3JhZGlhbnMsIHkgKiBkM19yYWRpYW5zKSwgeCA9IHlbMF07CiAgICAgICAgc3RyZWFtLnBvaW50KHggPiDPgCA/IHggLSAyICogz4AgOiB4IDwgLc+AID8geCArIDIgKiDPgCA6IHgsIHlbMV0pOwogICAgICB9LAogICAgICBzcGhlcmU6IGZ1bmN0aW9uKCkgewogICAgICAgIHN0cmVhbS5zcGhlcmUoKTsKICAgICAgfSwKICAgICAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAgICBzdHJlYW0ubGluZVN0YXJ0KCk7CiAgICAgIH0sCiAgICAgIGxpbmVFbmQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHN0cmVhbS5saW5lRW5kKCk7CiAgICAgIH0sCiAgICAgIHBvbHlnb25TdGFydDogZnVuY3Rpb24oKSB7CiAgICAgICAgc3RyZWFtLnBvbHlnb25TdGFydCgpOwogICAgICB9LAogICAgICBwb2x5Z29uRW5kOiBmdW5jdGlvbigpIHsKICAgICAgICBzdHJlYW0ucG9seWdvbkVuZCgpOwogICAgICB9CiAgICB9OwogIH0KICBmdW5jdGlvbiBkM19nZW9fZXF1aXJlY3Rhbmd1bGFyKM67LCDPhikgewogICAgcmV0dXJuIFsgzrssIM+GIF07CiAgfQogIChkMy5nZW8uZXF1aXJlY3Rhbmd1bGFyID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gZDNfZ2VvX3Byb2plY3Rpb24oZDNfZ2VvX2VxdWlyZWN0YW5ndWxhcik7CiAgfSkucmF3ID0gZDNfZ2VvX2VxdWlyZWN0YW5ndWxhci5pbnZlcnQgPSBkM19nZW9fZXF1aXJlY3Rhbmd1bGFyOwogIGQzLmdlby5yb3RhdGlvbiA9IGZ1bmN0aW9uKHJvdGF0ZSkgewogICAgcm90YXRlID0gZDNfZ2VvX3JvdGF0aW9uKHJvdGF0ZVswXSAlIDM2MCAqIGQzX3JhZGlhbnMsIHJvdGF0ZVsxXSAqIGQzX3JhZGlhbnMsIHJvdGF0ZS5sZW5ndGggPiAyID8gcm90YXRlWzJdICogZDNfcmFkaWFucyA6IDApOwogICAgZnVuY3Rpb24gZm9yd2FyZChjb29yZGluYXRlcykgewogICAgICBjb29yZGluYXRlcyA9IHJvdGF0ZShjb29yZGluYXRlc1swXSAqIGQzX3JhZGlhbnMsIGNvb3JkaW5hdGVzWzFdICogZDNfcmFkaWFucyk7CiAgICAgIHJldHVybiBjb29yZGluYXRlc1swXSAqPSBkM19kZWdyZWVzLCBjb29yZGluYXRlc1sxXSAqPSBkM19kZWdyZWVzLCBjb29yZGluYXRlczsKICAgIH0KICAgIGZvcndhcmQuaW52ZXJ0ID0gZnVuY3Rpb24oY29vcmRpbmF0ZXMpIHsKICAgICAgY29vcmRpbmF0ZXMgPSByb3RhdGUuaW52ZXJ0KGNvb3JkaW5hdGVzWzBdICogZDNfcmFkaWFucywgY29vcmRpbmF0ZXNbMV0gKiBkM19yYWRpYW5zKTsKICAgICAgcmV0dXJuIGNvb3JkaW5hdGVzWzBdICo9IGQzX2RlZ3JlZXMsIGNvb3JkaW5hdGVzWzFdICo9IGQzX2RlZ3JlZXMsIGNvb3JkaW5hdGVzOwogICAgfTsKICAgIHJldHVybiBmb3J3YXJkOwogIH07CiAgZnVuY3Rpb24gZDNfZ2VvX3JvdGF0aW9uKM60zrssIM60z4YsIM60zrMpIHsKICAgIHJldHVybiDOtM67ID8gzrTPhiB8fCDOtM6zID8gZDNfZ2VvX2NvbXBvc2UoZDNfZ2VvX3JvdGF0aW9uzrsozrTOuyksIGQzX2dlb19yb3RhdGlvbs+GzrMozrTPhiwgzrTOsykpIDogZDNfZ2VvX3JvdGF0aW9uzrsozrTOuykgOiDOtM+GIHx8IM60zrMgPyBkM19nZW9fcm90YXRpb27Phs6zKM60z4YsIM60zrMpIDogZDNfZ2VvX2VxdWlyZWN0YW5ndWxhcjsKICB9CiAgZnVuY3Rpb24gZDNfZ2VvX2ZvcndhcmRSb3RhdGlvbs67KM60zrspIHsKICAgIHJldHVybiBmdW5jdGlvbijOuywgz4YpIHsKICAgICAgcmV0dXJuIM67ICs9IM60zrssIFsgzrsgPiDPgCA/IM67IC0gMiAqIM+AIDogzrsgPCAtz4AgPyDOuyArIDIgKiDPgCA6IM67LCDPhiBdOwogICAgfTsKICB9CiAgZnVuY3Rpb24gZDNfZ2VvX3JvdGF0aW9uzrsozrTOuykgewogICAgdmFyIHJvdGF0aW9uID0gZDNfZ2VvX2ZvcndhcmRSb3RhdGlvbs67KM60zrspOwogICAgcm90YXRpb24uaW52ZXJ0ID0gZDNfZ2VvX2ZvcndhcmRSb3RhdGlvbs67KC3OtM67KTsKICAgIHJldHVybiByb3RhdGlvbjsKICB9CiAgZnVuY3Rpb24gZDNfZ2VvX3JvdGF0aW9uz4bOsyjOtM+GLCDOtM6zKSB7CiAgICB2YXIgY29zzrTPhiA9IE1hdGguY29zKM60z4YpLCBzaW7OtM+GID0gTWF0aC5zaW4ozrTPhiksIGNvc860zrMgPSBNYXRoLmNvcyjOtM6zKSwgc2luzrTOsyA9IE1hdGguc2luKM60zrMpOwogICAgZnVuY3Rpb24gcm90YXRpb24ozrssIM+GKSB7CiAgICAgIHZhciBjb3PPhiA9IE1hdGguY29zKM+GKSwgeCA9IE1hdGguY29zKM67KSAqIGNvc8+GLCB5ID0gTWF0aC5zaW4ozrspICogY29zz4YsIHogPSBNYXRoLnNpbijPhiksIGsgPSB6ICogY29zzrTPhiArIHggKiBzaW7OtM+GOwogICAgICByZXR1cm4gWyBNYXRoLmF0YW4yKHkgKiBjb3POtM6zIC0gayAqIHNpbs60zrMsIHggKiBjb3POtM+GIC0geiAqIHNpbs60z4YpLCBNYXRoLmFzaW4oTWF0aC5tYXgoLTEsIE1hdGgubWluKDEsIGsgKiBjb3POtM6zICsgeSAqIHNpbs60zrMpKSkgXTsKICAgIH0KICAgIHJvdGF0aW9uLmludmVydCA9IGZ1bmN0aW9uKM67LCDPhikgewogICAgICB2YXIgY29zz4YgPSBNYXRoLmNvcyjPhiksIHggPSBNYXRoLmNvcyjOuykgKiBjb3PPhiwgeSA9IE1hdGguc2luKM67KSAqIGNvc8+GLCB6ID0gTWF0aC5zaW4oz4YpLCBrID0geiAqIGNvc860zrMgLSB5ICogc2luzrTOszsKICAgICAgcmV0dXJuIFsgTWF0aC5hdGFuMih5ICogY29zzrTOsyArIHogKiBzaW7OtM6zLCB4ICogY29zzrTPhiArIGsgKiBzaW7OtM+GKSwgTWF0aC5hc2luKE1hdGgubWF4KC0xLCBNYXRoLm1pbigxLCBrICogY29zzrTPhiAtIHggKiBzaW7OtM+GKSkpIF07CiAgICB9OwogICAgcmV0dXJuIHJvdGF0aW9uOwogIH0KICBkMy5nZW8uY2lyY2xlID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgb3JpZ2luID0gWyAwLCAwIF0sIGFuZ2xlLCBwcmVjaXNpb24gPSA2LCBpbnRlcnBvbGF0ZTsKICAgIGZ1bmN0aW9uIGNpcmNsZSgpIHsKICAgICAgdmFyIGNlbnRlciA9IHR5cGVvZiBvcmlnaW4gPT09ICJmdW5jdGlvbiIgPyBvcmlnaW4uYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IG9yaWdpbiwgcm90YXRlID0gZDNfZ2VvX3JvdGF0aW9uKC1jZW50ZXJbMF0gKiBkM19yYWRpYW5zLCAtY2VudGVyWzFdICogZDNfcmFkaWFucywgMCkuaW52ZXJ0LCByaW5nID0gW107CiAgICAgIGludGVycG9sYXRlKG51bGwsIG51bGwsIDEsIHsKICAgICAgICBwb2ludDogZnVuY3Rpb24oeCwgeSkgewogICAgICAgICAgcmluZy5wdXNoKHggPSByb3RhdGUoeCwgeSkpOwogICAgICAgICAgeFswXSAqPSBkM19kZWdyZWVzLCB4WzFdICo9IGQzX2RlZ3JlZXM7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgcmV0dXJuIHsKICAgICAgICB0eXBlOiAiUG9seWdvbiIsCiAgICAgICAgY29vcmRpbmF0ZXM6IFsgcmluZyBdCiAgICAgIH07CiAgICB9CiAgICBjaXJjbGUub3JpZ2luID0gZnVuY3Rpb24oeCkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBvcmlnaW47CiAgICAgIG9yaWdpbiA9IHg7CiAgICAgIHJldHVybiBjaXJjbGU7CiAgICB9OwogICAgY2lyY2xlLmFuZ2xlID0gZnVuY3Rpb24oeCkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBhbmdsZTsKICAgICAgaW50ZXJwb2xhdGUgPSBkM19nZW9fY2lyY2xlSW50ZXJwb2xhdGUoKGFuZ2xlID0gK3gpICogZDNfcmFkaWFucywgcHJlY2lzaW9uICogZDNfcmFkaWFucyk7CiAgICAgIHJldHVybiBjaXJjbGU7CiAgICB9OwogICAgY2lyY2xlLnByZWNpc2lvbiA9IGZ1bmN0aW9uKF8pIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcHJlY2lzaW9uOwogICAgICBpbnRlcnBvbGF0ZSA9IGQzX2dlb19jaXJjbGVJbnRlcnBvbGF0ZShhbmdsZSAqIGQzX3JhZGlhbnMsIChwcmVjaXNpb24gPSArXykgKiBkM19yYWRpYW5zKTsKICAgICAgcmV0dXJuIGNpcmNsZTsKICAgIH07CiAgICByZXR1cm4gY2lyY2xlLmFuZ2xlKDkwKTsKICB9OwogIGZ1bmN0aW9uIGQzX2dlb19jaXJjbGVJbnRlcnBvbGF0ZShyYWRpdXMsIHByZWNpc2lvbikgewogICAgdmFyIGNyID0gTWF0aC5jb3MocmFkaXVzKSwgc3IgPSBNYXRoLnNpbihyYWRpdXMpOwogICAgcmV0dXJuIGZ1bmN0aW9uKGZyb20sIHRvLCBkaXJlY3Rpb24sIGxpc3RlbmVyKSB7CiAgICAgIGlmIChmcm9tICE9IG51bGwpIHsKICAgICAgICBmcm9tID0gZDNfZ2VvX2NpcmNsZUFuZ2xlKGNyLCBmcm9tKTsKICAgICAgICB0byA9IGQzX2dlb19jaXJjbGVBbmdsZShjciwgdG8pOwogICAgICAgIGlmIChkaXJlY3Rpb24gPiAwID8gZnJvbSA8IHRvIDogZnJvbSA+IHRvKSBmcm9tICs9IGRpcmVjdGlvbiAqIDIgKiDPgDsKICAgICAgfSBlbHNlIHsKICAgICAgICBmcm9tID0gcmFkaXVzICsgZGlyZWN0aW9uICogMiAqIM+AOwogICAgICAgIHRvID0gcmFkaXVzOwogICAgICB9CiAgICAgIHZhciBwb2ludDsKICAgICAgZm9yICh2YXIgc3RlcCA9IGRpcmVjdGlvbiAqIHByZWNpc2lvbiwgdCA9IGZyb207IGRpcmVjdGlvbiA+IDAgPyB0ID4gdG8gOiB0IDwgdG87IHQgLT0gc3RlcCkgewogICAgICAgIGxpc3RlbmVyLnBvaW50KChwb2ludCA9IGQzX2dlb19zcGhlcmljYWwoWyBjciwgLXNyICogTWF0aC5jb3ModCksIC1zciAqIE1hdGguc2luKHQpIF0pKVswXSwgcG9pbnRbMV0pOwogICAgICB9CiAgICB9OwogIH0KICBmdW5jdGlvbiBkM19nZW9fY2lyY2xlQW5nbGUoY3IsIHBvaW50KSB7CiAgICB2YXIgYSA9IGQzX2dlb19jYXJ0ZXNpYW4ocG9pbnQpOwogICAgYVswXSAtPSBjcjsKICAgIGQzX2dlb19jYXJ0ZXNpYW5Ob3JtYWxpemUoYSk7CiAgICB2YXIgYW5nbGUgPSBkM19hY29zKC1hWzFdKTsKICAgIHJldHVybiAoKC1hWzJdIDwgMCA/IC1hbmdsZSA6IGFuZ2xlKSArIDIgKiBNYXRoLlBJIC0gzrUpICUgKDIgKiBNYXRoLlBJKTsKICB9CiAgZDMuZ2VvLmRpc3RhbmNlID0gZnVuY3Rpb24oYSwgYikgewogICAgdmFyIM6UzrsgPSAoYlswXSAtIGFbMF0pICogZDNfcmFkaWFucywgz4YwID0gYVsxXSAqIGQzX3JhZGlhbnMsIM+GMSA9IGJbMV0gKiBkM19yYWRpYW5zLCBzaW7OlM67ID0gTWF0aC5zaW4ozpTOuyksIGNvc86UzrsgPSBNYXRoLmNvcyjOlM67KSwgc2luz4YwID0gTWF0aC5zaW4oz4YwKSwgY29zz4YwID0gTWF0aC5jb3Moz4YwKSwgc2luz4YxID0gTWF0aC5zaW4oz4YxKSwgY29zz4YxID0gTWF0aC5jb3Moz4YxKSwgdDsKICAgIHJldHVybiBNYXRoLmF0YW4yKE1hdGguc3FydCgodCA9IGNvc8+GMSAqIHNpbs6UzrspICogdCArICh0ID0gY29zz4YwICogc2luz4YxIC0gc2luz4YwICogY29zz4YxICogY29zzpTOuykgKiB0KSwgc2luz4YwICogc2luz4YxICsgY29zz4YwICogY29zz4YxICogY29zzpTOuyk7CiAgfTsKICBkMy5nZW8uZ3JhdGljdWxlID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgeDEsIHgwLCBYMSwgWDAsIHkxLCB5MCwgWTEsIFkwLCBkeCA9IDEwLCBkeSA9IGR4LCBEWCA9IDkwLCBEWSA9IDM2MCwgeCwgeSwgWCwgWSwgcHJlY2lzaW9uID0gMi41OwogICAgZnVuY3Rpb24gZ3JhdGljdWxlKCkgewogICAgICByZXR1cm4gewogICAgICAgIHR5cGU6ICJNdWx0aUxpbmVTdHJpbmciLAogICAgICAgIGNvb3JkaW5hdGVzOiBsaW5lcygpCiAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBsaW5lcygpIHsKICAgICAgcmV0dXJuIGQzLnJhbmdlKE1hdGguY2VpbChYMCAvIERYKSAqIERYLCBYMSwgRFgpLm1hcChYKS5jb25jYXQoZDMucmFuZ2UoTWF0aC5jZWlsKFkwIC8gRFkpICogRFksIFkxLCBEWSkubWFwKFkpKS5jb25jYXQoZDMucmFuZ2UoTWF0aC5jZWlsKHgwIC8gZHgpICogZHgsIHgxLCBkeCkuZmlsdGVyKGZ1bmN0aW9uKHgpIHsKICAgICAgICByZXR1cm4gTWF0aC5hYnMoeCAlIERYKSA+IM61OwogICAgICB9KS5tYXAoeCkpLmNvbmNhdChkMy5yYW5nZShNYXRoLmNlaWwoeTAgLyBkeSkgKiBkeSwgeTEsIGR5KS5maWx0ZXIoZnVuY3Rpb24oeSkgewogICAgICAgIHJldHVybiBNYXRoLmFicyh5ICUgRFkpID4gzrU7CiAgICAgIH0pLm1hcCh5KSk7CiAgICB9CiAgICBncmF0aWN1bGUubGluZXMgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGxpbmVzKCkubWFwKGZ1bmN0aW9uKGNvb3JkaW5hdGVzKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHR5cGU6ICJMaW5lU3RyaW5nIiwKICAgICAgICAgIGNvb3JkaW5hdGVzOiBjb29yZGluYXRlcwogICAgICAgIH07CiAgICAgIH0pOwogICAgfTsKICAgIGdyYXRpY3VsZS5vdXRsaW5lID0gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgdHlwZTogIlBvbHlnb24iLAogICAgICAgIGNvb3JkaW5hdGVzOiBbIFgoWDApLmNvbmNhdChZKFkxKS5zbGljZSgxKSwgWChYMSkucmV2ZXJzZSgpLnNsaWNlKDEpLCBZKFkwKS5yZXZlcnNlKCkuc2xpY2UoMSkpIF0KICAgICAgfTsKICAgIH07CiAgICBncmF0aWN1bGUuZXh0ZW50ID0gZnVuY3Rpb24oXykgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBncmF0aWN1bGUubWlub3JFeHRlbnQoKTsKICAgICAgcmV0dXJuIGdyYXRpY3VsZS5tYWpvckV4dGVudChfKS5taW5vckV4dGVudChfKTsKICAgIH07CiAgICBncmF0aWN1bGUubWFqb3JFeHRlbnQgPSBmdW5jdGlvbihfKSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIFsgWyBYMCwgWTAgXSwgWyBYMSwgWTEgXSBdOwogICAgICBYMCA9ICtfWzBdWzBdLCBYMSA9ICtfWzFdWzBdOwogICAgICBZMCA9ICtfWzBdWzFdLCBZMSA9ICtfWzFdWzFdOwogICAgICBpZiAoWDAgPiBYMSkgXyA9IFgwLCBYMCA9IFgxLCBYMSA9IF87CiAgICAgIGlmIChZMCA+IFkxKSBfID0gWTAsIFkwID0gWTEsIFkxID0gXzsKICAgICAgcmV0dXJuIGdyYXRpY3VsZS5wcmVjaXNpb24ocHJlY2lzaW9uKTsKICAgIH07CiAgICBncmF0aWN1bGUubWlub3JFeHRlbnQgPSBmdW5jdGlvbihfKSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIFsgWyB4MCwgeTAgXSwgWyB4MSwgeTEgXSBdOwogICAgICB4MCA9ICtfWzBdWzBdLCB4MSA9ICtfWzFdWzBdOwogICAgICB5MCA9ICtfWzBdWzFdLCB5MSA9ICtfWzFdWzFdOwogICAgICBpZiAoeDAgPiB4MSkgXyA9IHgwLCB4MCA9IHgxLCB4MSA9IF87CiAgICAgIGlmICh5MCA+IHkxKSBfID0geTAsIHkwID0geTEsIHkxID0gXzsKICAgICAgcmV0dXJuIGdyYXRpY3VsZS5wcmVjaXNpb24ocHJlY2lzaW9uKTsKICAgIH07CiAgICBncmF0aWN1bGUuc3RlcCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZ3JhdGljdWxlLm1pbm9yU3RlcCgpOwogICAgICByZXR1cm4gZ3JhdGljdWxlLm1ham9yU3RlcChfKS5taW5vclN0ZXAoXyk7CiAgICB9OwogICAgZ3JhdGljdWxlLm1ham9yU3RlcCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gWyBEWCwgRFkgXTsKICAgICAgRFggPSArX1swXSwgRFkgPSArX1sxXTsKICAgICAgcmV0dXJuIGdyYXRpY3VsZTsKICAgIH07CiAgICBncmF0aWN1bGUubWlub3JTdGVwID0gZnVuY3Rpb24oXykgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBbIGR4LCBkeSBdOwogICAgICBkeCA9ICtfWzBdLCBkeSA9ICtfWzFdOwogICAgICByZXR1cm4gZ3JhdGljdWxlOwogICAgfTsKICAgIGdyYXRpY3VsZS5wcmVjaXNpb24gPSBmdW5jdGlvbihfKSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHByZWNpc2lvbjsKICAgICAgcHJlY2lzaW9uID0gK187CiAgICAgIHggPSBkM19nZW9fZ3JhdGljdWxlWCh5MCwgeTEsIDkwKTsKICAgICAgeSA9IGQzX2dlb19ncmF0aWN1bGVZKHgwLCB4MSwgcHJlY2lzaW9uKTsKICAgICAgWCA9IGQzX2dlb19ncmF0aWN1bGVYKFkwLCBZMSwgOTApOwogICAgICBZID0gZDNfZ2VvX2dyYXRpY3VsZVkoWDAsIFgxLCBwcmVjaXNpb24pOwogICAgICByZXR1cm4gZ3JhdGljdWxlOwogICAgfTsKICAgIHJldHVybiBncmF0aWN1bGUubWFqb3JFeHRlbnQoWyBbIC0xODAsIC05MCArIM61IF0sIFsgMTgwLCA5MCAtIM61IF0gXSkubWlub3JFeHRlbnQoWyBbIC0xODAsIC04MCAtIM61IF0sIFsgMTgwLCA4MCArIM61IF0gXSk7CiAgfTsKICBmdW5jdGlvbiBkM19nZW9fZ3JhdGljdWxlWCh5MCwgeTEsIGR5KSB7CiAgICB2YXIgeSA9IGQzLnJhbmdlKHkwLCB5MSAtIM61LCBkeSkuY29uY2F0KHkxKTsKICAgIHJldHVybiBmdW5jdGlvbih4KSB7CiAgICAgIHJldHVybiB5Lm1hcChmdW5jdGlvbih5KSB7CiAgICAgICAgcmV0dXJuIFsgeCwgeSBdOwogICAgICB9KTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIGQzX2dlb19ncmF0aWN1bGVZKHgwLCB4MSwgZHgpIHsKICAgIHZhciB4ID0gZDMucmFuZ2UoeDAsIHgxIC0gzrUsIGR4KS5jb25jYXQoeDEpOwogICAgcmV0dXJuIGZ1bmN0aW9uKHkpIHsKICAgICAgcmV0dXJuIHgubWFwKGZ1bmN0aW9uKHgpIHsKICAgICAgICByZXR1cm4gWyB4LCB5IF07CiAgICAgIH0pOwogICAgfTsKICB9CiAgZnVuY3Rpb24gZDNfc291cmNlKGQpIHsKICAgIHJldHVybiBkLnNvdXJjZTsKICB9CiAgZnVuY3Rpb24gZDNfdGFyZ2V0KGQpIHsKICAgIHJldHVybiBkLnRhcmdldDsKICB9CiAgZDMuZ2VvLmdyZWF0QXJjID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgc291cmNlID0gZDNfc291cmNlLCBzb3VyY2VfLCB0YXJnZXQgPSBkM190YXJnZXQsIHRhcmdldF87CiAgICBmdW5jdGlvbiBncmVhdEFyYygpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICB0eXBlOiAiTGluZVN0cmluZyIsCiAgICAgICAgY29vcmRpbmF0ZXM6IFsgc291cmNlXyB8fCBzb3VyY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKSwgdGFyZ2V0XyB8fCB0YXJnZXQuYXBwbHkodGhpcywgYXJndW1lbnRzKSBdCiAgICAgIH07CiAgICB9CiAgICBncmVhdEFyYy5kaXN0YW5jZSA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gZDMuZ2VvLmRpc3RhbmNlKHNvdXJjZV8gfHwgc291cmNlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHRhcmdldF8gfHwgdGFyZ2V0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpOwogICAgfTsKICAgIGdyZWF0QXJjLnNvdXJjZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc291cmNlOwogICAgICBzb3VyY2UgPSBfLCBzb3VyY2VfID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBudWxsIDogXzsKICAgICAgcmV0dXJuIGdyZWF0QXJjOwogICAgfTsKICAgIGdyZWF0QXJjLnRhcmdldCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdGFyZ2V0OwogICAgICB0YXJnZXQgPSBfLCB0YXJnZXRfID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBudWxsIDogXzsKICAgICAgcmV0dXJuIGdyZWF0QXJjOwogICAgfTsKICAgIGdyZWF0QXJjLnByZWNpc2lvbiA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IGdyZWF0QXJjIDogMDsKICAgIH07CiAgICByZXR1cm4gZ3JlYXRBcmM7CiAgfTsKICBkMy5nZW8uaW50ZXJwb2xhdGUgPSBmdW5jdGlvbihzb3VyY2UsIHRhcmdldCkgewogICAgcmV0dXJuIGQzX2dlb19pbnRlcnBvbGF0ZShzb3VyY2VbMF0gKiBkM19yYWRpYW5zLCBzb3VyY2VbMV0gKiBkM19yYWRpYW5zLCB0YXJnZXRbMF0gKiBkM19yYWRpYW5zLCB0YXJnZXRbMV0gKiBkM19yYWRpYW5zKTsKICB9OwogIGZ1bmN0aW9uIGQzX2dlb19pbnRlcnBvbGF0ZSh4MCwgeTAsIHgxLCB5MSkgewogICAgdmFyIGN5MCA9IE1hdGguY29zKHkwKSwgc3kwID0gTWF0aC5zaW4oeTApLCBjeTEgPSBNYXRoLmNvcyh5MSksIHN5MSA9IE1hdGguc2luKHkxKSwga3gwID0gY3kwICogTWF0aC5jb3MoeDApLCBreTAgPSBjeTAgKiBNYXRoLnNpbih4MCksIGt4MSA9IGN5MSAqIE1hdGguY29zKHgxKSwga3kxID0gY3kxICogTWF0aC5zaW4oeDEpLCBkID0gMiAqIE1hdGguYXNpbihNYXRoLnNxcnQoZDNfaGF2ZXJzaW4oeTEgLSB5MCkgKyBjeTAgKiBjeTEgKiBkM19oYXZlcnNpbih4MSAtIHgwKSkpLCBrID0gMSAvIE1hdGguc2luKGQpOwogICAgdmFyIGludGVycG9sYXRlID0gZCA/IGZ1bmN0aW9uKHQpIHsKICAgICAgdmFyIEIgPSBNYXRoLnNpbih0ICo9IGQpICogaywgQSA9IE1hdGguc2luKGQgLSB0KSAqIGssIHggPSBBICoga3gwICsgQiAqIGt4MSwgeSA9IEEgKiBreTAgKyBCICoga3kxLCB6ID0gQSAqIHN5MCArIEIgKiBzeTE7CiAgICAgIHJldHVybiBbIE1hdGguYXRhbjIoeSwgeCkgKiBkM19kZWdyZWVzLCBNYXRoLmF0YW4yKHosIE1hdGguc3FydCh4ICogeCArIHkgKiB5KSkgKiBkM19kZWdyZWVzIF07CiAgICB9IDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBbIHgwICogZDNfZGVncmVlcywgeTAgKiBkM19kZWdyZWVzIF07CiAgICB9OwogICAgaW50ZXJwb2xhdGUuZGlzdGFuY2UgPSBkOwogICAgcmV0dXJuIGludGVycG9sYXRlOwogIH0KICBkMy5nZW8ubGVuZ3RoID0gZnVuY3Rpb24ob2JqZWN0KSB7CiAgICBkM19nZW9fbGVuZ3RoU3VtID0gMDsKICAgIGQzLmdlby5zdHJlYW0ob2JqZWN0LCBkM19nZW9fbGVuZ3RoKTsKICAgIHJldHVybiBkM19nZW9fbGVuZ3RoU3VtOwogIH07CiAgdmFyIGQzX2dlb19sZW5ndGhTdW07CiAgdmFyIGQzX2dlb19sZW5ndGggPSB7CiAgICBzcGhlcmU6IGQzX25vb3AsCiAgICBwb2ludDogZDNfbm9vcCwKICAgIGxpbmVTdGFydDogZDNfZ2VvX2xlbmd0aExpbmVTdGFydCwKICAgIGxpbmVFbmQ6IGQzX25vb3AsCiAgICBwb2x5Z29uU3RhcnQ6IGQzX25vb3AsCiAgICBwb2x5Z29uRW5kOiBkM19ub29wCiAgfTsKICBmdW5jdGlvbiBkM19nZW9fbGVuZ3RoTGluZVN0YXJ0KCkgewogICAgdmFyIM67MCwgc2luz4YwLCBjb3PPhjA7CiAgICBkM19nZW9fbGVuZ3RoLnBvaW50ID0gZnVuY3Rpb24ozrssIM+GKSB7CiAgICAgIM67MCA9IM67ICogZDNfcmFkaWFucywgc2luz4YwID0gTWF0aC5zaW4oz4YgKj0gZDNfcmFkaWFucyksIGNvc8+GMCA9IE1hdGguY29zKM+GKTsKICAgICAgZDNfZ2VvX2xlbmd0aC5wb2ludCA9IG5leHRQb2ludDsKICAgIH07CiAgICBkM19nZW9fbGVuZ3RoLmxpbmVFbmQgPSBmdW5jdGlvbigpIHsKICAgICAgZDNfZ2VvX2xlbmd0aC5wb2ludCA9IGQzX2dlb19sZW5ndGgubGluZUVuZCA9IGQzX25vb3A7CiAgICB9OwogICAgZnVuY3Rpb24gbmV4dFBvaW50KM67LCDPhikgewogICAgICB2YXIgc2luz4YgPSBNYXRoLnNpbijPhiAqPSBkM19yYWRpYW5zKSwgY29zz4YgPSBNYXRoLmNvcyjPhiksIHQgPSBNYXRoLmFicygozrsgKj0gZDNfcmFkaWFucykgLSDOuzApLCBjb3POlM67ID0gTWF0aC5jb3ModCk7CiAgICAgIGQzX2dlb19sZW5ndGhTdW0gKz0gTWF0aC5hdGFuMihNYXRoLnNxcnQoKHQgPSBjb3PPhiAqIE1hdGguc2luKHQpKSAqIHQgKyAodCA9IGNvc8+GMCAqIHNpbs+GIC0gc2luz4YwICogY29zz4YgKiBjb3POlM67KSAqIHQpLCBzaW7PhjAgKiBzaW7PhiArIGNvc8+GMCAqIGNvc8+GICogY29zzpTOuyk7CiAgICAgIM67MCA9IM67LCBzaW7PhjAgPSBzaW7PhiwgY29zz4YwID0gY29zz4Y7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGQzX2dlb19jb25pYyhwcm9qZWN0QXQpIHsKICAgIHZhciDPhjAgPSAwLCDPhjEgPSDPgCAvIDMsIG0gPSBkM19nZW9fcHJvamVjdGlvbk11dGF0b3IocHJvamVjdEF0KSwgcCA9IG0oz4YwLCDPhjEpOwogICAgcC5wYXJhbGxlbHMgPSBmdW5jdGlvbihfKSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIFsgz4YwIC8gz4AgKiAxODAsIM+GMSAvIM+AICogMTgwIF07CiAgICAgIHJldHVybiBtKM+GMCA9IF9bMF0gKiDPgCAvIDE4MCwgz4YxID0gX1sxXSAqIM+AIC8gMTgwKTsKICAgIH07CiAgICByZXR1cm4gcDsKICB9CiAgZnVuY3Rpb24gZDNfZ2VvX2NvbmljRXF1YWxBcmVhKM+GMCwgz4YxKSB7CiAgICB2YXIgc2luz4YwID0gTWF0aC5zaW4oz4YwKSwgbiA9IChzaW7PhjAgKyBNYXRoLnNpbijPhjEpKSAvIDIsIEMgPSAxICsgc2luz4YwICogKDIgKiBuIC0gc2luz4YwKSwgz4EwID0gTWF0aC5zcXJ0KEMpIC8gbjsKICAgIGZ1bmN0aW9uIGZvcndhcmQozrssIM+GKSB7CiAgICAgIHZhciDPgSA9IE1hdGguc3FydChDIC0gMiAqIG4gKiBNYXRoLnNpbijPhikpIC8gbjsKICAgICAgcmV0dXJuIFsgz4EgKiBNYXRoLnNpbijOuyAqPSBuKSwgz4EwIC0gz4EgKiBNYXRoLmNvcyjOuykgXTsKICAgIH0KICAgIGZvcndhcmQuaW52ZXJ0ID0gZnVuY3Rpb24oeCwgeSkgewogICAgICB2YXIgz4EwX3kgPSDPgTAgLSB5OwogICAgICByZXR1cm4gWyBNYXRoLmF0YW4yKHgsIM+BMF95KSAvIG4sIGQzX2FzaW4oKEMgLSAoeCAqIHggKyDPgTBfeSAqIM+BMF95KSAqIG4gKiBuKSAvICgyICogbikpIF07CiAgICB9OwogICAgcmV0dXJuIGZvcndhcmQ7CiAgfQogIChkMy5nZW8uY29uaWNFcXVhbEFyZWEgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBkM19nZW9fY29uaWMoZDNfZ2VvX2NvbmljRXF1YWxBcmVhKTsKICB9KS5yYXcgPSBkM19nZW9fY29uaWNFcXVhbEFyZWE7CiAgZDMuZ2VvLmFsYmVycyA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGQzLmdlby5jb25pY0VxdWFsQXJlYSgpLnJvdGF0ZShbIDk2LCAwIF0pLmNlbnRlcihbIC0uNiwgMzguNyBdKS5wYXJhbGxlbHMoWyAyOS41LCA0NS41IF0pLnNjYWxlKDEwNzApOwogIH07CiAgZDMuZ2VvLmFsYmVyc1VzYSA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGxvd2VyNDggPSBkMy5nZW8uYWxiZXJzKCk7CiAgICB2YXIgYWxhc2thID0gZDMuZ2VvLmNvbmljRXF1YWxBcmVhKCkucm90YXRlKFsgMTU0LCAwIF0pLmNlbnRlcihbIC0yLCA1OC41IF0pLnBhcmFsbGVscyhbIDU1LCA2NSBdKTsKICAgIHZhciBoYXdhaWkgPSBkMy5nZW8uY29uaWNFcXVhbEFyZWEoKS5yb3RhdGUoWyAxNTcsIDAgXSkuY2VudGVyKFsgLTMsIDE5LjkgXSkucGFyYWxsZWxzKFsgOCwgMTggXSk7CiAgICB2YXIgcG9pbnQsIHBvaW50U3RyZWFtID0gewogICAgICBwb2ludDogZnVuY3Rpb24oeCwgeSkgewogICAgICAgIHBvaW50ID0gWyB4LCB5IF07CiAgICAgIH0KICAgIH0sIGxvd2VyNDhQb2ludCwgYWxhc2thUG9pbnQsIGhhd2FpaVBvaW50OwogICAgZnVuY3Rpb24gYWxiZXJzVXNhKGNvb3JkaW5hdGVzKSB7CiAgICAgIHZhciB4ID0gY29vcmRpbmF0ZXNbMF0sIHkgPSBjb29yZGluYXRlc1sxXTsKICAgICAgcG9pbnQgPSBudWxsOwogICAgICAobG93ZXI0OFBvaW50KHgsIHkpLCBwb2ludCkgfHwgKGFsYXNrYVBvaW50KHgsIHkpLCBwb2ludCkgfHwgaGF3YWlpUG9pbnQoeCwgeSk7CiAgICAgIHJldHVybiBwb2ludDsKICAgIH0KICAgIGFsYmVyc1VzYS5pbnZlcnQgPSBmdW5jdGlvbihjb29yZGluYXRlcykgewogICAgICB2YXIgayA9IGxvd2VyNDguc2NhbGUoKSwgdCA9IGxvd2VyNDgudHJhbnNsYXRlKCksIHggPSAoY29vcmRpbmF0ZXNbMF0gLSB0WzBdKSAvIGssIHkgPSAoY29vcmRpbmF0ZXNbMV0gLSB0WzFdKSAvIGs7CiAgICAgIHJldHVybiAoeSA+PSAuMTIgJiYgeSA8IC4yMzQgJiYgeCA+PSAtLjQyNSAmJiB4IDwgLS4yMTQgPyBhbGFza2EgOiB5ID49IC4xNjYgJiYgeSA8IC4yMzQgJiYgeCA+PSAtLjIxNCAmJiB4IDwgLS4xMTUgPyBoYXdhaWkgOiBsb3dlcjQ4KS5pbnZlcnQoY29vcmRpbmF0ZXMpOwogICAgfTsKICAgIGFsYmVyc1VzYS5zdHJlYW0gPSBmdW5jdGlvbihzdHJlYW0pIHsKICAgICAgdmFyIGxvd2VyNDhTdHJlYW0gPSBsb3dlcjQ4LnN0cmVhbShzdHJlYW0pLCBhbGFza2FTdHJlYW0gPSBhbGFza2Euc3RyZWFtKHN0cmVhbSksIGhhd2FpaVN0cmVhbSA9IGhhd2FpaS5zdHJlYW0oc3RyZWFtKTsKICAgICAgcmV0dXJuIHsKICAgICAgICBwb2ludDogZnVuY3Rpb24oeCwgeSkgewogICAgICAgICAgbG93ZXI0OFN0cmVhbS5wb2ludCh4LCB5KTsKICAgICAgICAgIGFsYXNrYVN0cmVhbS5wb2ludCh4LCB5KTsKICAgICAgICAgIGhhd2FpaVN0cmVhbS5wb2ludCh4LCB5KTsKICAgICAgICB9LAogICAgICAgIHNwaGVyZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICBsb3dlcjQ4U3RyZWFtLnNwaGVyZSgpOwogICAgICAgICAgYWxhc2thU3RyZWFtLnNwaGVyZSgpOwogICAgICAgICAgaGF3YWlpU3RyZWFtLnNwaGVyZSgpOwogICAgICAgIH0sCiAgICAgICAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAgICAgIGxvd2VyNDhTdHJlYW0ubGluZVN0YXJ0KCk7CiAgICAgICAgICBhbGFza2FTdHJlYW0ubGluZVN0YXJ0KCk7CiAgICAgICAgICBoYXdhaWlTdHJlYW0ubGluZVN0YXJ0KCk7CiAgICAgICAgfSwKICAgICAgICBsaW5lRW5kOiBmdW5jdGlvbigpIHsKICAgICAgICAgIGxvd2VyNDhTdHJlYW0ubGluZUVuZCgpOwogICAgICAgICAgYWxhc2thU3RyZWFtLmxpbmVFbmQoKTsKICAgICAgICAgIGhhd2FpaVN0cmVhbS5saW5lRW5kKCk7CiAgICAgICAgfSwKICAgICAgICBwb2x5Z29uU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgbG93ZXI0OFN0cmVhbS5wb2x5Z29uU3RhcnQoKTsKICAgICAgICAgIGFsYXNrYVN0cmVhbS5wb2x5Z29uU3RhcnQoKTsKICAgICAgICAgIGhhd2FpaVN0cmVhbS5wb2x5Z29uU3RhcnQoKTsKICAgICAgICB9LAogICAgICAgIHBvbHlnb25FbmQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgbG93ZXI0OFN0cmVhbS5wb2x5Z29uRW5kKCk7CiAgICAgICAgICBhbGFza2FTdHJlYW0ucG9seWdvbkVuZCgpOwogICAgICAgICAgaGF3YWlpU3RyZWFtLnBvbHlnb25FbmQoKTsKICAgICAgICB9CiAgICAgIH07CiAgICB9OwogICAgYWxiZXJzVXNhLnByZWNpc2lvbiA9IGZ1bmN0aW9uKF8pIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbG93ZXI0OC5wcmVjaXNpb24oKTsKICAgICAgbG93ZXI0OC5wcmVjaXNpb24oXyk7CiAgICAgIGFsYXNrYS5wcmVjaXNpb24oXyk7CiAgICAgIGhhd2FpaS5wcmVjaXNpb24oXyk7CiAgICAgIHJldHVybiBhbGJlcnNVc2E7CiAgICB9OwogICAgYWxiZXJzVXNhLnNjYWxlID0gZnVuY3Rpb24oXykgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBsb3dlcjQ4LnNjYWxlKCk7CiAgICAgIGxvd2VyNDguc2NhbGUoXyk7CiAgICAgIGFsYXNrYS5zY2FsZShfICogLjM1KTsKICAgICAgaGF3YWlpLnNjYWxlKF8pOwogICAgICByZXR1cm4gYWxiZXJzVXNhLnRyYW5zbGF0ZShsb3dlcjQ4LnRyYW5zbGF0ZSgpKTsKICAgIH07CiAgICBhbGJlcnNVc2EudHJhbnNsYXRlID0gZnVuY3Rpb24oXykgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBsb3dlcjQ4LnRyYW5zbGF0ZSgpOwogICAgICB2YXIgayA9IGxvd2VyNDguc2NhbGUoKSwgeCA9ICtfWzBdLCB5ID0gK19bMV07CiAgICAgIGxvd2VyNDhQb2ludCA9IGxvd2VyNDgudHJhbnNsYXRlKF8pLmNsaXBFeHRlbnQoWyBbIHggLSAuNDU1ICogaywgeSAtIC4yMzggKiBrIF0sIFsgeCArIC40NTUgKiBrLCB5ICsgLjIzOCAqIGsgXSBdKS5zdHJlYW0ocG9pbnRTdHJlYW0pLnBvaW50OwogICAgICBhbGFza2FQb2ludCA9IGFsYXNrYS50cmFuc2xhdGUoWyB4IC0gLjMwNyAqIGssIHkgKyAuMjAxICogayBdKS5jbGlwRXh0ZW50KFsgWyB4IC0gLjQyNSAqIGsgKyDOtSwgeSArIC4xMiAqIGsgKyDOtSBdLCBbIHggLSAuMjE0ICogayAtIM61LCB5ICsgLjIzNCAqIGsgLSDOtSBdIF0pLnN0cmVhbShwb2ludFN0cmVhbSkucG9pbnQ7CiAgICAgIGhhd2FpaVBvaW50ID0gaGF3YWlpLnRyYW5zbGF0ZShbIHggLSAuMjA1ICogaywgeSArIC4yMTIgKiBrIF0pLmNsaXBFeHRlbnQoWyBbIHggLSAuMjE0ICogayArIM61LCB5ICsgLjE2NiAqIGsgKyDOtSBdLCBbIHggLSAuMTE1ICogayAtIM61LCB5ICsgLjIzNCAqIGsgLSDOtSBdIF0pLnN0cmVhbShwb2ludFN0cmVhbSkucG9pbnQ7CiAgICAgIHJldHVybiBhbGJlcnNVc2E7CiAgICB9OwogICAgcmV0dXJuIGFsYmVyc1VzYS5zY2FsZSgxMDcwKTsKICB9OwogIHZhciBkM19nZW9fcGF0aEFyZWFTdW0sIGQzX2dlb19wYXRoQXJlYVBvbHlnb24sIGQzX2dlb19wYXRoQXJlYSA9IHsKICAgIHBvaW50OiBkM19ub29wLAogICAgbGluZVN0YXJ0OiBkM19ub29wLAogICAgbGluZUVuZDogZDNfbm9vcCwKICAgIHBvbHlnb25TdGFydDogZnVuY3Rpb24oKSB7CiAgICAgIGQzX2dlb19wYXRoQXJlYVBvbHlnb24gPSAwOwogICAgICBkM19nZW9fcGF0aEFyZWEubGluZVN0YXJ0ID0gZDNfZ2VvX3BhdGhBcmVhUmluZ1N0YXJ0OwogICAgfSwKICAgIHBvbHlnb25FbmQ6IGZ1bmN0aW9uKCkgewogICAgICBkM19nZW9fcGF0aEFyZWEubGluZVN0YXJ0ID0gZDNfZ2VvX3BhdGhBcmVhLmxpbmVFbmQgPSBkM19nZW9fcGF0aEFyZWEucG9pbnQgPSBkM19ub29wOwogICAgICBkM19nZW9fcGF0aEFyZWFTdW0gKz0gTWF0aC5hYnMoZDNfZ2VvX3BhdGhBcmVhUG9seWdvbiAvIDIpOwogICAgfQogIH07CiAgZnVuY3Rpb24gZDNfZ2VvX3BhdGhBcmVhUmluZ1N0YXJ0KCkgewogICAgdmFyIHgwMCwgeTAwLCB4MCwgeTA7CiAgICBkM19nZW9fcGF0aEFyZWEucG9pbnQgPSBmdW5jdGlvbih4LCB5KSB7CiAgICAgIGQzX2dlb19wYXRoQXJlYS5wb2ludCA9IG5leHRQb2ludDsKICAgICAgeDAwID0geDAgPSB4LCB5MDAgPSB5MCA9IHk7CiAgICB9OwogICAgZnVuY3Rpb24gbmV4dFBvaW50KHgsIHkpIHsKICAgICAgZDNfZ2VvX3BhdGhBcmVhUG9seWdvbiArPSB5MCAqIHggLSB4MCAqIHk7CiAgICAgIHgwID0geCwgeTAgPSB5OwogICAgfQogICAgZDNfZ2VvX3BhdGhBcmVhLmxpbmVFbmQgPSBmdW5jdGlvbigpIHsKICAgICAgbmV4dFBvaW50KHgwMCwgeTAwKTsKICAgIH07CiAgfQogIHZhciBkM19nZW9fcGF0aEJvdW5kc1gwLCBkM19nZW9fcGF0aEJvdW5kc1kwLCBkM19nZW9fcGF0aEJvdW5kc1gxLCBkM19nZW9fcGF0aEJvdW5kc1kxOwogIHZhciBkM19nZW9fcGF0aEJvdW5kcyA9IHsKICAgIHBvaW50OiBkM19nZW9fcGF0aEJvdW5kc1BvaW50LAogICAgbGluZVN0YXJ0OiBkM19ub29wLAogICAgbGluZUVuZDogZDNfbm9vcCwKICAgIHBvbHlnb25TdGFydDogZDNfbm9vcCwKICAgIHBvbHlnb25FbmQ6IGQzX25vb3AKICB9OwogIGZ1bmN0aW9uIGQzX2dlb19wYXRoQm91bmRzUG9pbnQoeCwgeSkgewogICAgaWYgKHggPCBkM19nZW9fcGF0aEJvdW5kc1gwKSBkM19nZW9fcGF0aEJvdW5kc1gwID0geDsKICAgIGlmICh4ID4gZDNfZ2VvX3BhdGhCb3VuZHNYMSkgZDNfZ2VvX3BhdGhCb3VuZHNYMSA9IHg7CiAgICBpZiAoeSA8IGQzX2dlb19wYXRoQm91bmRzWTApIGQzX2dlb19wYXRoQm91bmRzWTAgPSB5OwogICAgaWYgKHkgPiBkM19nZW9fcGF0aEJvdW5kc1kxKSBkM19nZW9fcGF0aEJvdW5kc1kxID0geTsKICB9CiAgZnVuY3Rpb24gZDNfZ2VvX3BhdGhCdWZmZXIoKSB7CiAgICB2YXIgcG9pbnRDaXJjbGUgPSBkM19nZW9fcGF0aEJ1ZmZlckNpcmNsZSg0LjUpLCBidWZmZXIgPSBbXTsKICAgIHZhciBzdHJlYW0gPSB7CiAgICAgIHBvaW50OiBwb2ludCwKICAgICAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAgICBzdHJlYW0ucG9pbnQgPSBwb2ludExpbmVTdGFydDsKICAgICAgfSwKICAgICAgbGluZUVuZDogbGluZUVuZCwKICAgICAgcG9seWdvblN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAgICBzdHJlYW0ubGluZUVuZCA9IGxpbmVFbmRQb2x5Z29uOwogICAgICB9LAogICAgICBwb2x5Z29uRW5kOiBmdW5jdGlvbigpIHsKICAgICAgICBzdHJlYW0ubGluZUVuZCA9IGxpbmVFbmQ7CiAgICAgICAgc3RyZWFtLnBvaW50ID0gcG9pbnQ7CiAgICAgIH0sCiAgICAgIHBvaW50UmFkaXVzOiBmdW5jdGlvbihfKSB7CiAgICAgICAgcG9pbnRDaXJjbGUgPSBkM19nZW9fcGF0aEJ1ZmZlckNpcmNsZShfKTsKICAgICAgICByZXR1cm4gc3RyZWFtOwogICAgICB9LAogICAgICByZXN1bHQ6IGZ1bmN0aW9uKCkgewogICAgICAgIGlmIChidWZmZXIubGVuZ3RoKSB7CiAgICAgICAgICB2YXIgcmVzdWx0ID0gYnVmZmVyLmpvaW4oIiIpOwogICAgICAgICAgYnVmZmVyID0gW107CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgfQogICAgfTsKICAgIGZ1bmN0aW9uIHBvaW50KHgsIHkpIHsKICAgICAgYnVmZmVyLnB1c2goIk0iLCB4LCAiLCIsIHksIHBvaW50Q2lyY2xlKTsKICAgIH0KICAgIGZ1bmN0aW9uIHBvaW50TGluZVN0YXJ0KHgsIHkpIHsKICAgICAgYnVmZmVyLnB1c2goIk0iLCB4LCAiLCIsIHkpOwogICAgICBzdHJlYW0ucG9pbnQgPSBwb2ludExpbmU7CiAgICB9CiAgICBmdW5jdGlvbiBwb2ludExpbmUoeCwgeSkgewogICAgICBidWZmZXIucHVzaCgiTCIsIHgsICIsIiwgeSk7CiAgICB9CiAgICBmdW5jdGlvbiBsaW5lRW5kKCkgewogICAgICBzdHJlYW0ucG9pbnQgPSBwb2ludDsKICAgIH0KICAgIGZ1bmN0aW9uIGxpbmVFbmRQb2x5Z29uKCkgewogICAgICBidWZmZXIucHVzaCgiWiIpOwogICAgfQogICAgcmV0dXJuIHN0cmVhbTsKICB9CiAgZnVuY3Rpb24gZDNfZ2VvX3BhdGhCdWZmZXJDaXJjbGUocmFkaXVzKSB7CiAgICByZXR1cm4gIm0wLCIgKyByYWRpdXMgKyAiYSIgKyByYWRpdXMgKyAiLCIgKyByYWRpdXMgKyAiIDAgMSwxIDAsIiArIC0yICogcmFkaXVzICsgImEiICsgcmFkaXVzICsgIiwiICsgcmFkaXVzICsgIiAwIDEsMSAwLCIgKyAyICogcmFkaXVzICsgInoiOwogIH0KICB2YXIgZDNfZ2VvX3BhdGhDZW50cm9pZCA9IHsKICAgIHBvaW50OiBkM19nZW9fcGF0aENlbnRyb2lkUG9pbnQsCiAgICBsaW5lU3RhcnQ6IGQzX2dlb19wYXRoQ2VudHJvaWRMaW5lU3RhcnQsCiAgICBsaW5lRW5kOiBkM19nZW9fcGF0aENlbnRyb2lkTGluZUVuZCwKICAgIHBvbHlnb25TdGFydDogZnVuY3Rpb24oKSB7CiAgICAgIGQzX2dlb19wYXRoQ2VudHJvaWQubGluZVN0YXJ0ID0gZDNfZ2VvX3BhdGhDZW50cm9pZFJpbmdTdGFydDsKICAgIH0sCiAgICBwb2x5Z29uRW5kOiBmdW5jdGlvbigpIHsKICAgICAgZDNfZ2VvX3BhdGhDZW50cm9pZC5wb2ludCA9IGQzX2dlb19wYXRoQ2VudHJvaWRQb2ludDsKICAgICAgZDNfZ2VvX3BhdGhDZW50cm9pZC5saW5lU3RhcnQgPSBkM19nZW9fcGF0aENlbnRyb2lkTGluZVN0YXJ0OwogICAgICBkM19nZW9fcGF0aENlbnRyb2lkLmxpbmVFbmQgPSBkM19nZW9fcGF0aENlbnRyb2lkTGluZUVuZDsKICAgIH0KICB9OwogIGZ1bmN0aW9uIGQzX2dlb19wYXRoQ2VudHJvaWRQb2ludCh4LCB5KSB7CiAgICBpZiAoZDNfZ2VvX2NlbnRyb2lkRGltZW5zaW9uKSByZXR1cm47CiAgICBkM19nZW9fY2VudHJvaWRYICs9IHg7CiAgICBkM19nZW9fY2VudHJvaWRZICs9IHk7CiAgICArK2QzX2dlb19jZW50cm9pZFo7CiAgfQogIGZ1bmN0aW9uIGQzX2dlb19wYXRoQ2VudHJvaWRMaW5lU3RhcnQoKSB7CiAgICB2YXIgeDAsIHkwOwogICAgaWYgKGQzX2dlb19jZW50cm9pZERpbWVuc2lvbiAhPT0gMSkgewogICAgICBpZiAoZDNfZ2VvX2NlbnRyb2lkRGltZW5zaW9uIDwgMSkgewogICAgICAgIGQzX2dlb19jZW50cm9pZERpbWVuc2lvbiA9IDE7CiAgICAgICAgZDNfZ2VvX2NlbnRyb2lkWCA9IGQzX2dlb19jZW50cm9pZFkgPSBkM19nZW9fY2VudHJvaWRaID0gMDsKICAgICAgfSBlbHNlIHJldHVybjsKICAgIH0KICAgIGQzX2dlb19wYXRoQ2VudHJvaWQucG9pbnQgPSBmdW5jdGlvbih4LCB5KSB7CiAgICAgIGQzX2dlb19wYXRoQ2VudHJvaWQucG9pbnQgPSBuZXh0UG9pbnQ7CiAgICAgIHgwID0geCwgeTAgPSB5OwogICAgfTsKICAgIGZ1bmN0aW9uIG5leHRQb2ludCh4LCB5KSB7CiAgICAgIHZhciBkeCA9IHggLSB4MCwgZHkgPSB5IC0geTAsIHogPSBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpOwogICAgICBkM19nZW9fY2VudHJvaWRYICs9IHogKiAoeDAgKyB4KSAvIDI7CiAgICAgIGQzX2dlb19jZW50cm9pZFkgKz0geiAqICh5MCArIHkpIC8gMjsKICAgICAgZDNfZ2VvX2NlbnRyb2lkWiArPSB6OwogICAgICB4MCA9IHgsIHkwID0geTsKICAgIH0KICB9CiAgZnVuY3Rpb24gZDNfZ2VvX3BhdGhDZW50cm9pZExpbmVFbmQoKSB7CiAgICBkM19nZW9fcGF0aENlbnRyb2lkLnBvaW50ID0gZDNfZ2VvX3BhdGhDZW50cm9pZFBvaW50OwogIH0KICBmdW5jdGlvbiBkM19nZW9fcGF0aENlbnRyb2lkUmluZ1N0YXJ0KCkgewogICAgdmFyIHgwMCwgeTAwLCB4MCwgeTA7CiAgICBpZiAoZDNfZ2VvX2NlbnRyb2lkRGltZW5zaW9uIDwgMikgewogICAgICBkM19nZW9fY2VudHJvaWREaW1lbnNpb24gPSAyOwogICAgICBkM19nZW9fY2VudHJvaWRYID0gZDNfZ2VvX2NlbnRyb2lkWSA9IGQzX2dlb19jZW50cm9pZFogPSAwOwogICAgfQogICAgZDNfZ2VvX3BhdGhDZW50cm9pZC5wb2ludCA9IGZ1bmN0aW9uKHgsIHkpIHsKICAgICAgZDNfZ2VvX3BhdGhDZW50cm9pZC5wb2ludCA9IG5leHRQb2ludDsKICAgICAgeDAwID0geDAgPSB4LCB5MDAgPSB5MCA9IHk7CiAgICB9OwogICAgZnVuY3Rpb24gbmV4dFBvaW50KHgsIHkpIHsKICAgICAgdmFyIHogPSB5MCAqIHggLSB4MCAqIHk7CiAgICAgIGQzX2dlb19jZW50cm9pZFggKz0geiAqICh4MCArIHgpOwogICAgICBkM19nZW9fY2VudHJvaWRZICs9IHogKiAoeTAgKyB5KTsKICAgICAgZDNfZ2VvX2NlbnRyb2lkWiArPSB6ICogMzsKICAgICAgeDAgPSB4LCB5MCA9IHk7CiAgICB9CiAgICBkM19nZW9fcGF0aENlbnRyb2lkLmxpbmVFbmQgPSBmdW5jdGlvbigpIHsKICAgICAgbmV4dFBvaW50KHgwMCwgeTAwKTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIGQzX2dlb19wYXRoQ29udGV4dChjb250ZXh0KSB7CiAgICB2YXIgcG9pbnRSYWRpdXMgPSA0LjU7CiAgICB2YXIgc3RyZWFtID0gewogICAgICBwb2ludDogcG9pbnQsCiAgICAgIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7CiAgICAgICAgc3RyZWFtLnBvaW50ID0gcG9pbnRMaW5lU3RhcnQ7CiAgICAgIH0sCiAgICAgIGxpbmVFbmQ6IGxpbmVFbmQsCiAgICAgIHBvbHlnb25TdGFydDogZnVuY3Rpb24oKSB7CiAgICAgICAgc3RyZWFtLmxpbmVFbmQgPSBsaW5lRW5kUG9seWdvbjsKICAgICAgfSwKICAgICAgcG9seWdvbkVuZDogZnVuY3Rpb24oKSB7CiAgICAgICAgc3RyZWFtLmxpbmVFbmQgPSBsaW5lRW5kOwogICAgICAgIHN0cmVhbS5wb2ludCA9IHBvaW50OwogICAgICB9LAogICAgICBwb2ludFJhZGl1czogZnVuY3Rpb24oXykgewogICAgICAgIHBvaW50UmFkaXVzID0gXzsKICAgICAgICByZXR1cm4gc3RyZWFtOwogICAgICB9LAogICAgICByZXN1bHQ6IGQzX25vb3AKICAgIH07CiAgICBmdW5jdGlvbiBwb2ludCh4LCB5KSB7CiAgICAgIGNvbnRleHQubW92ZVRvKHgsIHkpOwogICAgICBjb250ZXh0LmFyYyh4LCB5LCBwb2ludFJhZGl1cywgMCwgMiAqIM+AKTsKICAgIH0KICAgIGZ1bmN0aW9uIHBvaW50TGluZVN0YXJ0KHgsIHkpIHsKICAgICAgY29udGV4dC5tb3ZlVG8oeCwgeSk7CiAgICAgIHN0cmVhbS5wb2ludCA9IHBvaW50TGluZTsKICAgIH0KICAgIGZ1bmN0aW9uIHBvaW50TGluZSh4LCB5KSB7CiAgICAgIGNvbnRleHQubGluZVRvKHgsIHkpOwogICAgfQogICAgZnVuY3Rpb24gbGluZUVuZCgpIHsKICAgICAgc3RyZWFtLnBvaW50ID0gcG9pbnQ7CiAgICB9CiAgICBmdW5jdGlvbiBsaW5lRW5kUG9seWdvbigpIHsKICAgICAgY29udGV4dC5jbG9zZVBhdGgoKTsKICAgIH0KICAgIHJldHVybiBzdHJlYW07CiAgfQogIGQzLmdlby5wYXRoID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgcG9pbnRSYWRpdXMgPSA0LjUsIHByb2plY3Rpb24sIGNvbnRleHQsIHByb2plY3RTdHJlYW0sIGNvbnRleHRTdHJlYW07CiAgICBmdW5jdGlvbiBwYXRoKG9iamVjdCkgewogICAgICBpZiAob2JqZWN0KSBkMy5nZW8uc3RyZWFtKG9iamVjdCwgcHJvamVjdFN0cmVhbShjb250ZXh0U3RyZWFtLnBvaW50UmFkaXVzKHR5cGVvZiBwb2ludFJhZGl1cyA9PT0gImZ1bmN0aW9uIiA/ICtwb2ludFJhZGl1cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogcG9pbnRSYWRpdXMpKSk7CiAgICAgIHJldHVybiBjb250ZXh0U3RyZWFtLnJlc3VsdCgpOwogICAgfQogICAgcGF0aC5hcmVhID0gZnVuY3Rpb24ob2JqZWN0KSB7CiAgICAgIGQzX2dlb19wYXRoQXJlYVN1bSA9IDA7CiAgICAgIGQzLmdlby5zdHJlYW0ob2JqZWN0LCBwcm9qZWN0U3RyZWFtKGQzX2dlb19wYXRoQXJlYSkpOwogICAgICByZXR1cm4gZDNfZ2VvX3BhdGhBcmVhU3VtOwogICAgfTsKICAgIHBhdGguY2VudHJvaWQgPSBmdW5jdGlvbihvYmplY3QpIHsKICAgICAgZDNfZ2VvX2NlbnRyb2lkRGltZW5zaW9uID0gZDNfZ2VvX2NlbnRyb2lkWCA9IGQzX2dlb19jZW50cm9pZFkgPSBkM19nZW9fY2VudHJvaWRaID0gMDsKICAgICAgZDMuZ2VvLnN0cmVhbShvYmplY3QsIHByb2plY3RTdHJlYW0oZDNfZ2VvX3BhdGhDZW50cm9pZCkpOwogICAgICByZXR1cm4gZDNfZ2VvX2NlbnRyb2lkWiA/IFsgZDNfZ2VvX2NlbnRyb2lkWCAvIGQzX2dlb19jZW50cm9pZFosIGQzX2dlb19jZW50cm9pZFkgLyBkM19nZW9fY2VudHJvaWRaIF0gOiB1bmRlZmluZWQ7CiAgICB9OwogICAgcGF0aC5ib3VuZHMgPSBmdW5jdGlvbihvYmplY3QpIHsKICAgICAgZDNfZ2VvX3BhdGhCb3VuZHNYMSA9IGQzX2dlb19wYXRoQm91bmRzWTEgPSAtKGQzX2dlb19wYXRoQm91bmRzWDAgPSBkM19nZW9fcGF0aEJvdW5kc1kwID0gSW5maW5pdHkpOwogICAgICBkMy5nZW8uc3RyZWFtKG9iamVjdCwgcHJvamVjdFN0cmVhbShkM19nZW9fcGF0aEJvdW5kcykpOwogICAgICByZXR1cm4gWyBbIGQzX2dlb19wYXRoQm91bmRzWDAsIGQzX2dlb19wYXRoQm91bmRzWTAgXSwgWyBkM19nZW9fcGF0aEJvdW5kc1gxLCBkM19nZW9fcGF0aEJvdW5kc1kxIF0gXTsKICAgIH07CiAgICBwYXRoLnByb2plY3Rpb24gPSBmdW5jdGlvbihfKSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHByb2plY3Rpb247CiAgICAgIHByb2plY3RTdHJlYW0gPSAocHJvamVjdGlvbiA9IF8pID8gXy5zdHJlYW0gfHwgZDNfZ2VvX3BhdGhQcm9qZWN0U3RyZWFtKF8pIDogZDNfaWRlbnRpdHk7CiAgICAgIHJldHVybiBwYXRoOwogICAgfTsKICAgIHBhdGguY29udGV4dCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gY29udGV4dDsKICAgICAgY29udGV4dFN0cmVhbSA9IChjb250ZXh0ID0gXykgPT0gbnVsbCA/IG5ldyBkM19nZW9fcGF0aEJ1ZmZlcigpIDogbmV3IGQzX2dlb19wYXRoQ29udGV4dChfKTsKICAgICAgcmV0dXJuIHBhdGg7CiAgICB9OwogICAgcGF0aC5wb2ludFJhZGl1cyA9IGZ1bmN0aW9uKF8pIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcG9pbnRSYWRpdXM7CiAgICAgIHBvaW50UmFkaXVzID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogK187CiAgICAgIHJldHVybiBwYXRoOwogICAgfTsKICAgIHJldHVybiBwYXRoLnByb2plY3Rpb24oZDMuZ2VvLmFsYmVyc1VzYSgpKS5jb250ZXh0KG51bGwpOwogIH07CiAgZnVuY3Rpb24gZDNfZ2VvX3BhdGhQcm9qZWN0U3RyZWFtKHByb2plY3QpIHsKICAgIHZhciByZXNhbXBsZSA9IGQzX2dlb19yZXNhbXBsZShmdW5jdGlvbijOuywgz4YpIHsKICAgICAgcmV0dXJuIHByb2plY3QoWyDOuyAqIGQzX2RlZ3JlZXMsIM+GICogZDNfZGVncmVlcyBdKTsKICAgIH0pOwogICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSkgewogICAgICBzdHJlYW0gPSByZXNhbXBsZShzdHJlYW0pOwogICAgICByZXR1cm4gewogICAgICAgIHBvaW50OiBmdW5jdGlvbijOuywgz4YpIHsKICAgICAgICAgIHN0cmVhbS5wb2ludCjOuyAqIGQzX3JhZGlhbnMsIM+GICogZDNfcmFkaWFucyk7CiAgICAgICAgfSwKICAgICAgICBzcGhlcmU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgc3RyZWFtLnNwaGVyZSgpOwogICAgICAgIH0sCiAgICAgICAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAgICAgIHN0cmVhbS5saW5lU3RhcnQoKTsKICAgICAgICB9LAogICAgICAgIGxpbmVFbmQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgc3RyZWFtLmxpbmVFbmQoKTsKICAgICAgICB9LAogICAgICAgIHBvbHlnb25TdGFydDogZnVuY3Rpb24oKSB7CiAgICAgICAgICBzdHJlYW0ucG9seWdvblN0YXJ0KCk7CiAgICAgICAgfSwKICAgICAgICBwb2x5Z29uRW5kOiBmdW5jdGlvbigpIHsKICAgICAgICAgIHN0cmVhbS5wb2x5Z29uRW5kKCk7CiAgICAgICAgfQogICAgICB9OwogICAgfTsKICB9CiAgZnVuY3Rpb24gZDNfZ2VvX2F6aW11dGhhbChzY2FsZSwgYW5nbGUpIHsKICAgIGZ1bmN0aW9uIGF6aW11dGhhbCjOuywgz4YpIHsKICAgICAgdmFyIGNvc867ID0gTWF0aC5jb3MozrspLCBjb3PPhiA9IE1hdGguY29zKM+GKSwgayA9IHNjYWxlKGNvc867ICogY29zz4YpOwogICAgICByZXR1cm4gWyBrICogY29zz4YgKiBNYXRoLnNpbijOuyksIGsgKiBNYXRoLnNpbijPhikgXTsKICAgIH0KICAgIGF6aW11dGhhbC5pbnZlcnQgPSBmdW5jdGlvbih4LCB5KSB7CiAgICAgIHZhciDPgSA9IE1hdGguc3FydCh4ICogeCArIHkgKiB5KSwgYyA9IGFuZ2xlKM+BKSwgc2luYyA9IE1hdGguc2luKGMpLCBjb3NjID0gTWF0aC5jb3MoYyk7CiAgICAgIHJldHVybiBbIE1hdGguYXRhbjIoeCAqIHNpbmMsIM+BICogY29zYyksIE1hdGguYXNpbijPgSAmJiB5ICogc2luYyAvIM+BKSBdOwogICAgfTsKICAgIHJldHVybiBhemltdXRoYWw7CiAgfQogIHZhciBkM19nZW9fYXppbXV0aGFsRXF1YWxBcmVhID0gZDNfZ2VvX2F6aW11dGhhbChmdW5jdGlvbihjb3POu2Nvc8+GKSB7CiAgICByZXR1cm4gTWF0aC5zcXJ0KDIgLyAoMSArIGNvc867Y29zz4YpKTsKICB9LCBmdW5jdGlvbijPgSkgewogICAgcmV0dXJuIDIgKiBNYXRoLmFzaW4oz4EgLyAyKTsKICB9KTsKICAoZDMuZ2VvLmF6aW11dGhhbEVxdWFsQXJlYSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGQzX2dlb19wcm9qZWN0aW9uKGQzX2dlb19hemltdXRoYWxFcXVhbEFyZWEpOwogIH0pLnJhdyA9IGQzX2dlb19hemltdXRoYWxFcXVhbEFyZWE7CiAgdmFyIGQzX2dlb19hemltdXRoYWxFcXVpZGlzdGFudCA9IGQzX2dlb19hemltdXRoYWwoZnVuY3Rpb24oY29zzrtjb3PPhikgewogICAgdmFyIGMgPSBNYXRoLmFjb3MoY29zzrtjb3PPhik7CiAgICByZXR1cm4gYyAmJiBjIC8gTWF0aC5zaW4oYyk7CiAgfSwgZDNfaWRlbnRpdHkpOwogIChkMy5nZW8uYXppbXV0aGFsRXF1aWRpc3RhbnQgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBkM19nZW9fcHJvamVjdGlvbihkM19nZW9fYXppbXV0aGFsRXF1aWRpc3RhbnQpOwogIH0pLnJhdyA9IGQzX2dlb19hemltdXRoYWxFcXVpZGlzdGFudDsKICBmdW5jdGlvbiBkM19nZW9fY29uaWNDb25mb3JtYWwoz4YwLCDPhjEpIHsKICAgIHZhciBjb3PPhjAgPSBNYXRoLmNvcyjPhjApLCB0ID0gZnVuY3Rpb24oz4YpIHsKICAgICAgcmV0dXJuIE1hdGgudGFuKM+AIC8gNCArIM+GIC8gMik7CiAgICB9LCBuID0gz4YwID09PSDPhjEgPyBNYXRoLnNpbijPhjApIDogTWF0aC5sb2coY29zz4YwIC8gTWF0aC5jb3Moz4YxKSkgLyBNYXRoLmxvZyh0KM+GMSkgLyB0KM+GMCkpLCBGID0gY29zz4YwICogTWF0aC5wb3codCjPhjApLCBuKSAvIG47CiAgICBpZiAoIW4pIHJldHVybiBkM19nZW9fbWVyY2F0b3I7CiAgICBmdW5jdGlvbiBmb3J3YXJkKM67LCDPhikgewogICAgICB2YXIgz4EgPSBNYXRoLmFicyhNYXRoLmFicyjPhikgLSDPgCAvIDIpIDwgzrUgPyAwIDogRiAvIE1hdGgucG93KHQoz4YpLCBuKTsKICAgICAgcmV0dXJuIFsgz4EgKiBNYXRoLnNpbihuICogzrspLCBGIC0gz4EgKiBNYXRoLmNvcyhuICogzrspIF07CiAgICB9CiAgICBmb3J3YXJkLmludmVydCA9IGZ1bmN0aW9uKHgsIHkpIHsKICAgICAgdmFyIM+BMF95ID0gRiAtIHksIM+BID0gZDNfc2duKG4pICogTWF0aC5zcXJ0KHggKiB4ICsgz4EwX3kgKiDPgTBfeSk7CiAgICAgIHJldHVybiBbIE1hdGguYXRhbjIoeCwgz4EwX3kpIC8gbiwgMiAqIE1hdGguYXRhbihNYXRoLnBvdyhGIC8gz4EsIDEgLyBuKSkgLSDPgCAvIDIgXTsKICAgIH07CiAgICByZXR1cm4gZm9yd2FyZDsKICB9CiAgKGQzLmdlby5jb25pY0NvbmZvcm1hbCA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGQzX2dlb19jb25pYyhkM19nZW9fY29uaWNDb25mb3JtYWwpOwogIH0pLnJhdyA9IGQzX2dlb19jb25pY0NvbmZvcm1hbDsKICBmdW5jdGlvbiBkM19nZW9fY29uaWNFcXVpZGlzdGFudCjPhjAsIM+GMSkgewogICAgdmFyIGNvc8+GMCA9IE1hdGguY29zKM+GMCksIG4gPSDPhjAgPT09IM+GMSA/IE1hdGguc2luKM+GMCkgOiAoY29zz4YwIC0gTWF0aC5jb3Moz4YxKSkgLyAoz4YxIC0gz4YwKSwgRyA9IGNvc8+GMCAvIG4gKyDPhjA7CiAgICBpZiAoTWF0aC5hYnMobikgPCDOtSkgcmV0dXJuIGQzX2dlb19lcXVpcmVjdGFuZ3VsYXI7CiAgICBmdW5jdGlvbiBmb3J3YXJkKM67LCDPhikgewogICAgICB2YXIgz4EgPSBHIC0gz4Y7CiAgICAgIHJldHVybiBbIM+BICogTWF0aC5zaW4obiAqIM67KSwgRyAtIM+BICogTWF0aC5jb3MobiAqIM67KSBdOwogICAgfQogICAgZm9yd2FyZC5pbnZlcnQgPSBmdW5jdGlvbih4LCB5KSB7CiAgICAgIHZhciDPgTBfeSA9IEcgLSB5OwogICAgICByZXR1cm4gWyBNYXRoLmF0YW4yKHgsIM+BMF95KSAvIG4sIEcgLSBkM19zZ24obikgKiBNYXRoLnNxcnQoeCAqIHggKyDPgTBfeSAqIM+BMF95KSBdOwogICAgfTsKICAgIHJldHVybiBmb3J3YXJkOwogIH0KICAoZDMuZ2VvLmNvbmljRXF1aWRpc3RhbnQgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBkM19nZW9fY29uaWMoZDNfZ2VvX2NvbmljRXF1aWRpc3RhbnQpOwogIH0pLnJhdyA9IGQzX2dlb19jb25pY0VxdWlkaXN0YW50OwogIHZhciBkM19nZW9fZ25vbW9uaWMgPSBkM19nZW9fYXppbXV0aGFsKGZ1bmN0aW9uKGNvc867Y29zz4YpIHsKICAgIHJldHVybiAxIC8gY29zzrtjb3PPhjsKICB9LCBNYXRoLmF0YW4pOwogIChkMy5nZW8uZ25vbW9uaWMgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBkM19nZW9fcHJvamVjdGlvbihkM19nZW9fZ25vbW9uaWMpOwogIH0pLnJhdyA9IGQzX2dlb19nbm9tb25pYzsKICBmdW5jdGlvbiBkM19nZW9fbWVyY2F0b3IozrssIM+GKSB7CiAgICByZXR1cm4gWyDOuywgTWF0aC5sb2coTWF0aC50YW4oz4AgLyA0ICsgz4YgLyAyKSkgXTsKICB9CiAgZDNfZ2VvX21lcmNhdG9yLmludmVydCA9IGZ1bmN0aW9uKHgsIHkpIHsKICAgIHJldHVybiBbIHgsIDIgKiBNYXRoLmF0YW4oTWF0aC5leHAoeSkpIC0gz4AgLyAyIF07CiAgfTsKICBmdW5jdGlvbiBkM19nZW9fbWVyY2F0b3JQcm9qZWN0aW9uKHByb2plY3QpIHsKICAgIHZhciBtID0gZDNfZ2VvX3Byb2plY3Rpb24ocHJvamVjdCksIHNjYWxlID0gbS5zY2FsZSwgdHJhbnNsYXRlID0gbS50cmFuc2xhdGUsIGNsaXBFeHRlbnQgPSBtLmNsaXBFeHRlbnQsIGNsaXBBdXRvOwogICAgbS5zY2FsZSA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgdiA9IHNjYWxlLmFwcGx5KG0sIGFyZ3VtZW50cyk7CiAgICAgIHJldHVybiB2ID09PSBtID8gY2xpcEF1dG8gPyBtLmNsaXBFeHRlbnQobnVsbCkgOiBtIDogdjsKICAgIH07CiAgICBtLnRyYW5zbGF0ZSA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgdiA9IHRyYW5zbGF0ZS5hcHBseShtLCBhcmd1bWVudHMpOwogICAgICByZXR1cm4gdiA9PT0gbSA/IGNsaXBBdXRvID8gbS5jbGlwRXh0ZW50KG51bGwpIDogbSA6IHY7CiAgICB9OwogICAgbS5jbGlwRXh0ZW50ID0gZnVuY3Rpb24oXykgewogICAgICB2YXIgdiA9IGNsaXBFeHRlbnQuYXBwbHkobSwgYXJndW1lbnRzKTsKICAgICAgaWYgKHYgPT09IG0pIHsKICAgICAgICBpZiAoY2xpcEF1dG8gPSBfID09IG51bGwpIHsKICAgICAgICAgIHZhciBrID0gz4AgKiBzY2FsZSgpLCB0ID0gdHJhbnNsYXRlKCk7CiAgICAgICAgICBjbGlwRXh0ZW50KFsgWyB0WzBdIC0gaywgdFsxXSAtIGsgXSwgWyB0WzBdICsgaywgdFsxXSArIGsgXSBdKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoY2xpcEF1dG8pIHsKICAgICAgICB2ID0gbnVsbDsKICAgICAgfQogICAgICByZXR1cm4gdjsKICAgIH07CiAgICByZXR1cm4gbS5jbGlwRXh0ZW50KG51bGwpOwogIH0KICAoZDMuZ2VvLm1lcmNhdG9yID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gZDNfZ2VvX21lcmNhdG9yUHJvamVjdGlvbihkM19nZW9fbWVyY2F0b3IpOwogIH0pLnJhdyA9IGQzX2dlb19tZXJjYXRvcjsKICB2YXIgZDNfZ2VvX29ydGhvZ3JhcGhpYyA9IGQzX2dlb19hemltdXRoYWwoZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gMTsKICB9LCBNYXRoLmFzaW4pOwogIChkMy5nZW8ub3J0aG9ncmFwaGljID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gZDNfZ2VvX3Byb2plY3Rpb24oZDNfZ2VvX29ydGhvZ3JhcGhpYyk7CiAgfSkucmF3ID0gZDNfZ2VvX29ydGhvZ3JhcGhpYzsKICB2YXIgZDNfZ2VvX3N0ZXJlb2dyYXBoaWMgPSBkM19nZW9fYXppbXV0aGFsKGZ1bmN0aW9uKGNvc867Y29zz4YpIHsKICAgIHJldHVybiAxIC8gKDEgKyBjb3POu2Nvc8+GKTsKICB9LCBmdW5jdGlvbijPgSkgewogICAgcmV0dXJuIDIgKiBNYXRoLmF0YW4oz4EpOwogIH0pOwogIChkMy5nZW8uc3RlcmVvZ3JhcGhpYyA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGQzX2dlb19wcm9qZWN0aW9uKGQzX2dlb19zdGVyZW9ncmFwaGljKTsKICB9KS5yYXcgPSBkM19nZW9fc3RlcmVvZ3JhcGhpYzsKICBmdW5jdGlvbiBkM19nZW9fdHJhbnN2ZXJzZU1lcmNhdG9yKM67LCDPhikgewogICAgdmFyIEIgPSBNYXRoLmNvcyjPhikgKiBNYXRoLnNpbijOuyk7CiAgICByZXR1cm4gWyBNYXRoLmxvZygoMSArIEIpIC8gKDEgLSBCKSkgLyAyLCBNYXRoLmF0YW4yKE1hdGgudGFuKM+GKSwgTWF0aC5jb3MozrspKSBdOwogIH0KICBkM19nZW9fdHJhbnN2ZXJzZU1lcmNhdG9yLmludmVydCA9IGZ1bmN0aW9uKHgsIHkpIHsKICAgIHJldHVybiBbIE1hdGguYXRhbjIoZDNfc2luaCh4KSwgTWF0aC5jb3MoeSkpLCBkM19hc2luKE1hdGguc2luKHkpIC8gZDNfY29zaCh4KSkgXTsKICB9OwogIChkMy5nZW8udHJhbnN2ZXJzZU1lcmNhdG9yID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gZDNfZ2VvX21lcmNhdG9yUHJvamVjdGlvbihkM19nZW9fdHJhbnN2ZXJzZU1lcmNhdG9yKTsKICB9KS5yYXcgPSBkM19nZW9fdHJhbnN2ZXJzZU1lcmNhdG9yOwogIGQzLmdlb20gPSB7fTsKICBkMy5zdmcgPSB7fTsKICBmdW5jdGlvbiBkM19zdmdfbGluZShwcm9qZWN0aW9uKSB7CiAgICB2YXIgeCA9IGQzX3N2Z19saW5lWCwgeSA9IGQzX3N2Z19saW5lWSwgZGVmaW5lZCA9IGQzX3RydWUsIGludGVycG9sYXRlID0gZDNfc3ZnX2xpbmVMaW5lYXIsIGludGVycG9sYXRlS2V5ID0gaW50ZXJwb2xhdGUua2V5LCB0ZW5zaW9uID0gLjc7CiAgICBmdW5jdGlvbiBsaW5lKGRhdGEpIHsKICAgICAgdmFyIHNlZ21lbnRzID0gW10sIHBvaW50cyA9IFtdLCBpID0gLTEsIG4gPSBkYXRhLmxlbmd0aCwgZCwgZnggPSBkM19mdW5jdG9yKHgpLCBmeSA9IGQzX2Z1bmN0b3IoeSk7CiAgICAgIGZ1bmN0aW9uIHNlZ21lbnQoKSB7CiAgICAgICAgc2VnbWVudHMucHVzaCgiTSIsIGludGVycG9sYXRlKHByb2plY3Rpb24ocG9pbnRzKSwgdGVuc2lvbikpOwogICAgICB9CiAgICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgICAgaWYgKGRlZmluZWQuY2FsbCh0aGlzLCBkID0gZGF0YVtpXSwgaSkpIHsKICAgICAgICAgIHBvaW50cy5wdXNoKFsgK2Z4LmNhbGwodGhpcywgZCwgaSksICtmeS5jYWxsKHRoaXMsIGQsIGkpIF0pOwogICAgICAgIH0gZWxzZSBpZiAocG9pbnRzLmxlbmd0aCkgewogICAgICAgICAgc2VnbWVudCgpOwogICAgICAgICAgcG9pbnRzID0gW107CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChwb2ludHMubGVuZ3RoKSBzZWdtZW50KCk7CiAgICAgIHJldHVybiBzZWdtZW50cy5sZW5ndGggPyBzZWdtZW50cy5qb2luKCIiKSA6IG51bGw7CiAgICB9CiAgICBsaW5lLnggPSBmdW5jdGlvbihfKSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHg7CiAgICAgIHggPSBfOwogICAgICByZXR1cm4gbGluZTsKICAgIH07CiAgICBsaW5lLnkgPSBmdW5jdGlvbihfKSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHk7CiAgICAgIHkgPSBfOwogICAgICByZXR1cm4gbGluZTsKICAgIH07CiAgICBsaW5lLmRlZmluZWQgPSBmdW5jdGlvbihfKSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGRlZmluZWQ7CiAgICAgIGRlZmluZWQgPSBfOwogICAgICByZXR1cm4gbGluZTsKICAgIH07CiAgICBsaW5lLmludGVycG9sYXRlID0gZnVuY3Rpb24oXykgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBpbnRlcnBvbGF0ZUtleTsKICAgICAgaWYgKHR5cGVvZiBfID09PSAiZnVuY3Rpb24iKSBpbnRlcnBvbGF0ZUtleSA9IGludGVycG9sYXRlID0gXzsgZWxzZSBpbnRlcnBvbGF0ZUtleSA9IChpbnRlcnBvbGF0ZSA9IGQzX3N2Z19saW5lSW50ZXJwb2xhdG9ycy5nZXQoXykgfHwgZDNfc3ZnX2xpbmVMaW5lYXIpLmtleTsKICAgICAgcmV0dXJuIGxpbmU7CiAgICB9OwogICAgbGluZS50ZW5zaW9uID0gZnVuY3Rpb24oXykgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB0ZW5zaW9uOwogICAgICB0ZW5zaW9uID0gXzsKICAgICAgcmV0dXJuIGxpbmU7CiAgICB9OwogICAgcmV0dXJuIGxpbmU7CiAgfQogIGQzLnN2Zy5saW5lID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gZDNfc3ZnX2xpbmUoZDNfaWRlbnRpdHkpOwogIH07CiAgZnVuY3Rpb24gZDNfc3ZnX2xpbmVYKGQpIHsKICAgIHJldHVybiBkWzBdOwogIH0KICBmdW5jdGlvbiBkM19zdmdfbGluZVkoZCkgewogICAgcmV0dXJuIGRbMV07CiAgfQogIHZhciBkM19zdmdfbGluZUludGVycG9sYXRvcnMgPSBkMy5tYXAoewogICAgbGluZWFyOiBkM19zdmdfbGluZUxpbmVhciwKICAgICJsaW5lYXItY2xvc2VkIjogZDNfc3ZnX2xpbmVMaW5lYXJDbG9zZWQsCiAgICAic3RlcC1iZWZvcmUiOiBkM19zdmdfbGluZVN0ZXBCZWZvcmUsCiAgICAic3RlcC1hZnRlciI6IGQzX3N2Z19saW5lU3RlcEFmdGVyLAogICAgYmFzaXM6IGQzX3N2Z19saW5lQmFzaXMsCiAgICAiYmFzaXMtb3BlbiI6IGQzX3N2Z19saW5lQmFzaXNPcGVuLAogICAgImJhc2lzLWNsb3NlZCI6IGQzX3N2Z19saW5lQmFzaXNDbG9zZWQsCiAgICBidW5kbGU6IGQzX3N2Z19saW5lQnVuZGxlLAogICAgY2FyZGluYWw6IGQzX3N2Z19saW5lQ2FyZGluYWwsCiAgICAiY2FyZGluYWwtb3BlbiI6IGQzX3N2Z19saW5lQ2FyZGluYWxPcGVuLAogICAgImNhcmRpbmFsLWNsb3NlZCI6IGQzX3N2Z19saW5lQ2FyZGluYWxDbG9zZWQsCiAgICBtb25vdG9uZTogZDNfc3ZnX2xpbmVNb25vdG9uZQogIH0pOwogIGQzX3N2Z19saW5lSW50ZXJwb2xhdG9ycy5mb3JFYWNoKGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKICAgIHZhbHVlLmtleSA9IGtleTsKICAgIHZhbHVlLmNsb3NlZCA9IC8tY2xvc2VkJC8udGVzdChrZXkpOwogIH0pOwogIGZ1bmN0aW9uIGQzX3N2Z19saW5lTGluZWFyKHBvaW50cykgewogICAgcmV0dXJuIHBvaW50cy5qb2luKCJMIik7CiAgfQogIGZ1bmN0aW9uIGQzX3N2Z19saW5lTGluZWFyQ2xvc2VkKHBvaW50cykgewogICAgcmV0dXJuIGQzX3N2Z19saW5lTGluZWFyKHBvaW50cykgKyAiWiI7CiAgfQogIGZ1bmN0aW9uIGQzX3N2Z19saW5lU3RlcEJlZm9yZShwb2ludHMpIHsKICAgIHZhciBpID0gMCwgbiA9IHBvaW50cy5sZW5ndGgsIHAgPSBwb2ludHNbMF0sIHBhdGggPSBbIHBbMF0sICIsIiwgcFsxXSBdOwogICAgd2hpbGUgKCsraSA8IG4pIHBhdGgucHVzaCgiViIsIChwID0gcG9pbnRzW2ldKVsxXSwgIkgiLCBwWzBdKTsKICAgIHJldHVybiBwYXRoLmpvaW4oIiIpOwogIH0KICBmdW5jdGlvbiBkM19zdmdfbGluZVN0ZXBBZnRlcihwb2ludHMpIHsKICAgIHZhciBpID0gMCwgbiA9IHBvaW50cy5sZW5ndGgsIHAgPSBwb2ludHNbMF0sIHBhdGggPSBbIHBbMF0sICIsIiwgcFsxXSBdOwogICAgd2hpbGUgKCsraSA8IG4pIHBhdGgucHVzaCgiSCIsIChwID0gcG9pbnRzW2ldKVswXSwgIlYiLCBwWzFdKTsKICAgIHJldHVybiBwYXRoLmpvaW4oIiIpOwogIH0KICBmdW5jdGlvbiBkM19zdmdfbGluZUNhcmRpbmFsT3Blbihwb2ludHMsIHRlbnNpb24pIHsKICAgIHJldHVybiBwb2ludHMubGVuZ3RoIDwgNCA/IGQzX3N2Z19saW5lTGluZWFyKHBvaW50cykgOiBwb2ludHNbMV0gKyBkM19zdmdfbGluZUhlcm1pdGUocG9pbnRzLnNsaWNlKDEsIHBvaW50cy5sZW5ndGggLSAxKSwgZDNfc3ZnX2xpbmVDYXJkaW5hbFRhbmdlbnRzKHBvaW50cywgdGVuc2lvbikpOwogIH0KICBmdW5jdGlvbiBkM19zdmdfbGluZUNhcmRpbmFsQ2xvc2VkKHBvaW50cywgdGVuc2lvbikgewogICAgcmV0dXJuIHBvaW50cy5sZW5ndGggPCAzID8gZDNfc3ZnX2xpbmVMaW5lYXIocG9pbnRzKSA6IHBvaW50c1swXSArIGQzX3N2Z19saW5lSGVybWl0ZSgocG9pbnRzLnB1c2gocG9pbnRzWzBdKSwgCiAgICBwb2ludHMpLCBkM19zdmdfbGluZUNhcmRpbmFsVGFuZ2VudHMoWyBwb2ludHNbcG9pbnRzLmxlbmd0aCAtIDJdIF0uY29uY2F0KHBvaW50cywgWyBwb2ludHNbMV0gXSksIHRlbnNpb24pKTsKICB9CiAgZnVuY3Rpb24gZDNfc3ZnX2xpbmVDYXJkaW5hbChwb2ludHMsIHRlbnNpb24pIHsKICAgIHJldHVybiBwb2ludHMubGVuZ3RoIDwgMyA/IGQzX3N2Z19saW5lTGluZWFyKHBvaW50cykgOiBwb2ludHNbMF0gKyBkM19zdmdfbGluZUhlcm1pdGUocG9pbnRzLCBkM19zdmdfbGluZUNhcmRpbmFsVGFuZ2VudHMocG9pbnRzLCB0ZW5zaW9uKSk7CiAgfQogIGZ1bmN0aW9uIGQzX3N2Z19saW5lSGVybWl0ZShwb2ludHMsIHRhbmdlbnRzKSB7CiAgICBpZiAodGFuZ2VudHMubGVuZ3RoIDwgMSB8fCBwb2ludHMubGVuZ3RoICE9IHRhbmdlbnRzLmxlbmd0aCAmJiBwb2ludHMubGVuZ3RoICE9IHRhbmdlbnRzLmxlbmd0aCArIDIpIHsKICAgICAgcmV0dXJuIGQzX3N2Z19saW5lTGluZWFyKHBvaW50cyk7CiAgICB9CiAgICB2YXIgcXVhZCA9IHBvaW50cy5sZW5ndGggIT0gdGFuZ2VudHMubGVuZ3RoLCBwYXRoID0gIiIsIHAwID0gcG9pbnRzWzBdLCBwID0gcG9pbnRzWzFdLCB0MCA9IHRhbmdlbnRzWzBdLCB0ID0gdDAsIHBpID0gMTsKICAgIGlmIChxdWFkKSB7CiAgICAgIHBhdGggKz0gIlEiICsgKHBbMF0gLSB0MFswXSAqIDIgLyAzKSArICIsIiArIChwWzFdIC0gdDBbMV0gKiAyIC8gMykgKyAiLCIgKyBwWzBdICsgIiwiICsgcFsxXTsKICAgICAgcDAgPSBwb2ludHNbMV07CiAgICAgIHBpID0gMjsKICAgIH0KICAgIGlmICh0YW5nZW50cy5sZW5ndGggPiAxKSB7CiAgICAgIHQgPSB0YW5nZW50c1sxXTsKICAgICAgcCA9IHBvaW50c1twaV07CiAgICAgIHBpKys7CiAgICAgIHBhdGggKz0gIkMiICsgKHAwWzBdICsgdDBbMF0pICsgIiwiICsgKHAwWzFdICsgdDBbMV0pICsgIiwiICsgKHBbMF0gLSB0WzBdKSArICIsIiArIChwWzFdIC0gdFsxXSkgKyAiLCIgKyBwWzBdICsgIiwiICsgcFsxXTsKICAgICAgZm9yICh2YXIgaSA9IDI7IGkgPCB0YW5nZW50cy5sZW5ndGg7IGkrKywgcGkrKykgewogICAgICAgIHAgPSBwb2ludHNbcGldOwogICAgICAgIHQgPSB0YW5nZW50c1tpXTsKICAgICAgICBwYXRoICs9ICJTIiArIChwWzBdIC0gdFswXSkgKyAiLCIgKyAocFsxXSAtIHRbMV0pICsgIiwiICsgcFswXSArICIsIiArIHBbMV07CiAgICAgIH0KICAgIH0KICAgIGlmIChxdWFkKSB7CiAgICAgIHZhciBscCA9IHBvaW50c1twaV07CiAgICAgIHBhdGggKz0gIlEiICsgKHBbMF0gKyB0WzBdICogMiAvIDMpICsgIiwiICsgKHBbMV0gKyB0WzFdICogMiAvIDMpICsgIiwiICsgbHBbMF0gKyAiLCIgKyBscFsxXTsKICAgIH0KICAgIHJldHVybiBwYXRoOwogIH0KICBmdW5jdGlvbiBkM19zdmdfbGluZUNhcmRpbmFsVGFuZ2VudHMocG9pbnRzLCB0ZW5zaW9uKSB7CiAgICB2YXIgdGFuZ2VudHMgPSBbXSwgYSA9ICgxIC0gdGVuc2lvbikgLyAyLCBwMCwgcDEgPSBwb2ludHNbMF0sIHAyID0gcG9pbnRzWzFdLCBpID0gMSwgbiA9IHBvaW50cy5sZW5ndGg7CiAgICB3aGlsZSAoKytpIDwgbikgewogICAgICBwMCA9IHAxOwogICAgICBwMSA9IHAyOwogICAgICBwMiA9IHBvaW50c1tpXTsKICAgICAgdGFuZ2VudHMucHVzaChbIGEgKiAocDJbMF0gLSBwMFswXSksIGEgKiAocDJbMV0gLSBwMFsxXSkgXSk7CiAgICB9CiAgICByZXR1cm4gdGFuZ2VudHM7CiAgfQogIGZ1bmN0aW9uIGQzX3N2Z19saW5lQmFzaXMocG9pbnRzKSB7CiAgICBpZiAocG9pbnRzLmxlbmd0aCA8IDMpIHJldHVybiBkM19zdmdfbGluZUxpbmVhcihwb2ludHMpOwogICAgdmFyIGkgPSAxLCBuID0gcG9pbnRzLmxlbmd0aCwgcGkgPSBwb2ludHNbMF0sIHgwID0gcGlbMF0sIHkwID0gcGlbMV0sIHB4ID0gWyB4MCwgeDAsIHgwLCAocGkgPSBwb2ludHNbMV0pWzBdIF0sIHB5ID0gWyB5MCwgeTAsIHkwLCBwaVsxXSBdLCBwYXRoID0gWyB4MCwgIiwiLCB5MCBdOwogICAgZDNfc3ZnX2xpbmVCYXNpc0JlemllcihwYXRoLCBweCwgcHkpOwogICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgcGkgPSBwb2ludHNbaV07CiAgICAgIHB4LnNoaWZ0KCk7CiAgICAgIHB4LnB1c2gocGlbMF0pOwogICAgICBweS5zaGlmdCgpOwogICAgICBweS5wdXNoKHBpWzFdKTsKICAgICAgZDNfc3ZnX2xpbmVCYXNpc0JlemllcihwYXRoLCBweCwgcHkpOwogICAgfQogICAgaSA9IC0xOwogICAgd2hpbGUgKCsraSA8IDIpIHsKICAgICAgcHguc2hpZnQoKTsKICAgICAgcHgucHVzaChwaVswXSk7CiAgICAgIHB5LnNoaWZ0KCk7CiAgICAgIHB5LnB1c2gocGlbMV0pOwogICAgICBkM19zdmdfbGluZUJhc2lzQmV6aWVyKHBhdGgsIHB4LCBweSk7CiAgICB9CiAgICByZXR1cm4gcGF0aC5qb2luKCIiKTsKICB9CiAgZnVuY3Rpb24gZDNfc3ZnX2xpbmVCYXNpc09wZW4ocG9pbnRzKSB7CiAgICBpZiAocG9pbnRzLmxlbmd0aCA8IDQpIHJldHVybiBkM19zdmdfbGluZUxpbmVhcihwb2ludHMpOwogICAgdmFyIHBhdGggPSBbXSwgaSA9IC0xLCBuID0gcG9pbnRzLmxlbmd0aCwgcGksIHB4ID0gWyAwIF0sIHB5ID0gWyAwIF07CiAgICB3aGlsZSAoKytpIDwgMykgewogICAgICBwaSA9IHBvaW50c1tpXTsKICAgICAgcHgucHVzaChwaVswXSk7CiAgICAgIHB5LnB1c2gocGlbMV0pOwogICAgfQogICAgcGF0aC5wdXNoKGQzX3N2Z19saW5lRG90NChkM19zdmdfbGluZUJhc2lzQmV6aWVyMywgcHgpICsgIiwiICsgZDNfc3ZnX2xpbmVEb3Q0KGQzX3N2Z19saW5lQmFzaXNCZXppZXIzLCBweSkpOwogICAgLS1pOwogICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgcGkgPSBwb2ludHNbaV07CiAgICAgIHB4LnNoaWZ0KCk7CiAgICAgIHB4LnB1c2gocGlbMF0pOwogICAgICBweS5zaGlmdCgpOwogICAgICBweS5wdXNoKHBpWzFdKTsKICAgICAgZDNfc3ZnX2xpbmVCYXNpc0JlemllcihwYXRoLCBweCwgcHkpOwogICAgfQogICAgcmV0dXJuIHBhdGguam9pbigiIik7CiAgfQogIGZ1bmN0aW9uIGQzX3N2Z19saW5lQmFzaXNDbG9zZWQocG9pbnRzKSB7CiAgICB2YXIgcGF0aCwgaSA9IC0xLCBuID0gcG9pbnRzLmxlbmd0aCwgbSA9IG4gKyA0LCBwaSwgcHggPSBbXSwgcHkgPSBbXTsKICAgIHdoaWxlICgrK2kgPCA0KSB7CiAgICAgIHBpID0gcG9pbnRzW2kgJSBuXTsKICAgICAgcHgucHVzaChwaVswXSk7CiAgICAgIHB5LnB1c2gocGlbMV0pOwogICAgfQogICAgcGF0aCA9IFsgZDNfc3ZnX2xpbmVEb3Q0KGQzX3N2Z19saW5lQmFzaXNCZXppZXIzLCBweCksICIsIiwgZDNfc3ZnX2xpbmVEb3Q0KGQzX3N2Z19saW5lQmFzaXNCZXppZXIzLCBweSkgXTsKICAgIC0taTsKICAgIHdoaWxlICgrK2kgPCBtKSB7CiAgICAgIHBpID0gcG9pbnRzW2kgJSBuXTsKICAgICAgcHguc2hpZnQoKTsKICAgICAgcHgucHVzaChwaVswXSk7CiAgICAgIHB5LnNoaWZ0KCk7CiAgICAgIHB5LnB1c2gocGlbMV0pOwogICAgICBkM19zdmdfbGluZUJhc2lzQmV6aWVyKHBhdGgsIHB4LCBweSk7CiAgICB9CiAgICByZXR1cm4gcGF0aC5qb2luKCIiKTsKICB9CiAgZnVuY3Rpb24gZDNfc3ZnX2xpbmVCdW5kbGUocG9pbnRzLCB0ZW5zaW9uKSB7CiAgICB2YXIgbiA9IHBvaW50cy5sZW5ndGggLSAxOwogICAgaWYgKG4pIHsKICAgICAgdmFyIHgwID0gcG9pbnRzWzBdWzBdLCB5MCA9IHBvaW50c1swXVsxXSwgZHggPSBwb2ludHNbbl1bMF0gLSB4MCwgZHkgPSBwb2ludHNbbl1bMV0gLSB5MCwgaSA9IC0xLCBwLCB0OwogICAgICB3aGlsZSAoKytpIDw9IG4pIHsKICAgICAgICBwID0gcG9pbnRzW2ldOwogICAgICAgIHQgPSBpIC8gbjsKICAgICAgICBwWzBdID0gdGVuc2lvbiAqIHBbMF0gKyAoMSAtIHRlbnNpb24pICogKHgwICsgdCAqIGR4KTsKICAgICAgICBwWzFdID0gdGVuc2lvbiAqIHBbMV0gKyAoMSAtIHRlbnNpb24pICogKHkwICsgdCAqIGR5KTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGQzX3N2Z19saW5lQmFzaXMocG9pbnRzKTsKICB9CiAgZnVuY3Rpb24gZDNfc3ZnX2xpbmVEb3Q0KGEsIGIpIHsKICAgIHJldHVybiBhWzBdICogYlswXSArIGFbMV0gKiBiWzFdICsgYVsyXSAqIGJbMl0gKyBhWzNdICogYlszXTsKICB9CiAgdmFyIGQzX3N2Z19saW5lQmFzaXNCZXppZXIxID0gWyAwLCAyIC8gMywgMSAvIDMsIDAgXSwgZDNfc3ZnX2xpbmVCYXNpc0JlemllcjIgPSBbIDAsIDEgLyAzLCAyIC8gMywgMCBdLCBkM19zdmdfbGluZUJhc2lzQmV6aWVyMyA9IFsgMCwgMSAvIDYsIDIgLyAzLCAxIC8gNiBdOwogIGZ1bmN0aW9uIGQzX3N2Z19saW5lQmFzaXNCZXppZXIocGF0aCwgeCwgeSkgewogICAgcGF0aC5wdXNoKCJDIiwgZDNfc3ZnX2xpbmVEb3Q0KGQzX3N2Z19saW5lQmFzaXNCZXppZXIxLCB4KSwgIiwiLCBkM19zdmdfbGluZURvdDQoZDNfc3ZnX2xpbmVCYXNpc0JlemllcjEsIHkpLCAiLCIsIGQzX3N2Z19saW5lRG90NChkM19zdmdfbGluZUJhc2lzQmV6aWVyMiwgeCksICIsIiwgZDNfc3ZnX2xpbmVEb3Q0KGQzX3N2Z19saW5lQmFzaXNCZXppZXIyLCB5KSwgIiwiLCBkM19zdmdfbGluZURvdDQoZDNfc3ZnX2xpbmVCYXNpc0JlemllcjMsIHgpLCAiLCIsIGQzX3N2Z19saW5lRG90NChkM19zdmdfbGluZUJhc2lzQmV6aWVyMywgeSkpOwogIH0KICBmdW5jdGlvbiBkM19zdmdfbGluZVNsb3BlKHAwLCBwMSkgewogICAgcmV0dXJuIChwMVsxXSAtIHAwWzFdKSAvIChwMVswXSAtIHAwWzBdKTsKICB9CiAgZnVuY3Rpb24gZDNfc3ZnX2xpbmVGaW5pdGVEaWZmZXJlbmNlcyhwb2ludHMpIHsKICAgIHZhciBpID0gMCwgaiA9IHBvaW50cy5sZW5ndGggLSAxLCBtID0gW10sIHAwID0gcG9pbnRzWzBdLCBwMSA9IHBvaW50c1sxXSwgZCA9IG1bMF0gPSBkM19zdmdfbGluZVNsb3BlKHAwLCBwMSk7CiAgICB3aGlsZSAoKytpIDwgaikgewogICAgICBtW2ldID0gKGQgKyAoZCA9IGQzX3N2Z19saW5lU2xvcGUocDAgPSBwMSwgcDEgPSBwb2ludHNbaSArIDFdKSkpIC8gMjsKICAgIH0KICAgIG1baV0gPSBkOwogICAgcmV0dXJuIG07CiAgfQogIGZ1bmN0aW9uIGQzX3N2Z19saW5lTW9ub3RvbmVUYW5nZW50cyhwb2ludHMpIHsKICAgIHZhciB0YW5nZW50cyA9IFtdLCBkLCBhLCBiLCBzLCBtID0gZDNfc3ZnX2xpbmVGaW5pdGVEaWZmZXJlbmNlcyhwb2ludHMpLCBpID0gLTEsIGogPSBwb2ludHMubGVuZ3RoIC0gMTsKICAgIHdoaWxlICgrK2kgPCBqKSB7CiAgICAgIGQgPSBkM19zdmdfbGluZVNsb3BlKHBvaW50c1tpXSwgcG9pbnRzW2kgKyAxXSk7CiAgICAgIGlmIChNYXRoLmFicyhkKSA8IDFlLTYpIHsKICAgICAgICBtW2ldID0gbVtpICsgMV0gPSAwOwogICAgICB9IGVsc2UgewogICAgICAgIGEgPSBtW2ldIC8gZDsKICAgICAgICBiID0gbVtpICsgMV0gLyBkOwogICAgICAgIHMgPSBhICogYSArIGIgKiBiOwogICAgICAgIGlmIChzID4gOSkgewogICAgICAgICAgcyA9IGQgKiAzIC8gTWF0aC5zcXJ0KHMpOwogICAgICAgICAgbVtpXSA9IHMgKiBhOwogICAgICAgICAgbVtpICsgMV0gPSBzICogYjsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGkgPSAtMTsKICAgIHdoaWxlICgrK2kgPD0gaikgewogICAgICBzID0gKHBvaW50c1tNYXRoLm1pbihqLCBpICsgMSldWzBdIC0gcG9pbnRzW01hdGgubWF4KDAsIGkgLSAxKV1bMF0pIC8gKDYgKiAoMSArIG1baV0gKiBtW2ldKSk7CiAgICAgIHRhbmdlbnRzLnB1c2goWyBzIHx8IDAsIG1baV0gKiBzIHx8IDAgXSk7CiAgICB9CiAgICByZXR1cm4gdGFuZ2VudHM7CiAgfQogIGZ1bmN0aW9uIGQzX3N2Z19saW5lTW9ub3RvbmUocG9pbnRzKSB7CiAgICByZXR1cm4gcG9pbnRzLmxlbmd0aCA8IDMgPyBkM19zdmdfbGluZUxpbmVhcihwb2ludHMpIDogcG9pbnRzWzBdICsgZDNfc3ZnX2xpbmVIZXJtaXRlKHBvaW50cywgZDNfc3ZnX2xpbmVNb25vdG9uZVRhbmdlbnRzKHBvaW50cykpOwogIH0KICBkMy5nZW9tLmh1bGwgPSBmdW5jdGlvbih2ZXJ0aWNlcykgewogICAgdmFyIHggPSBkM19zdmdfbGluZVgsIHkgPSBkM19zdmdfbGluZVk7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGh1bGwodmVydGljZXMpOwogICAgZnVuY3Rpb24gaHVsbChkYXRhKSB7CiAgICAgIGlmIChkYXRhLmxlbmd0aCA8IDMpIHJldHVybiBbXTsKICAgICAgdmFyIGZ4ID0gZDNfZnVuY3Rvcih4KSwgZnkgPSBkM19mdW5jdG9yKHkpLCBuID0gZGF0YS5sZW5ndGgsIHZlcnRpY2VzLCBwbGVuID0gbiAtIDEsIHBvaW50cyA9IFtdLCBzdGFjayA9IFtdLCBkLCBpLCBqLCBoID0gMCwgeDEsIHkxLCB4MiwgeTIsIHUsIHYsIGEsIHNwOwogICAgICBpZiAoZnggPT09IGQzX3N2Z19saW5lWCAmJiB5ID09PSBkM19zdmdfbGluZVkpIHZlcnRpY2VzID0gZGF0YTsgZWxzZSBmb3IgKGkgPSAwLCAKICAgICAgdmVydGljZXMgPSBbXTsgaSA8IG47ICsraSkgewogICAgICAgIHZlcnRpY2VzLnB1c2goWyArZnguY2FsbCh0aGlzLCBkID0gZGF0YVtpXSwgaSksICtmeS5jYWxsKHRoaXMsIGQsIGkpIF0pOwogICAgICB9CiAgICAgIGZvciAoaSA9IDE7IGkgPCBuOyArK2kpIHsKICAgICAgICBpZiAodmVydGljZXNbaV1bMV0gPCB2ZXJ0aWNlc1toXVsxXSB8fCB2ZXJ0aWNlc1tpXVsxXSA9PSB2ZXJ0aWNlc1toXVsxXSAmJiB2ZXJ0aWNlc1tpXVswXSA8IHZlcnRpY2VzW2hdWzBdKSBoID0gaTsKICAgICAgfQogICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgaWYgKGkgPT09IGgpIGNvbnRpbnVlOwogICAgICAgIHkxID0gdmVydGljZXNbaV1bMV0gLSB2ZXJ0aWNlc1toXVsxXTsKICAgICAgICB4MSA9IHZlcnRpY2VzW2ldWzBdIC0gdmVydGljZXNbaF1bMF07CiAgICAgICAgcG9pbnRzLnB1c2goewogICAgICAgICAgYW5nbGU6IE1hdGguYXRhbjIoeTEsIHgxKSwKICAgICAgICAgIGluZGV4OiBpCiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgcG9pbnRzLnNvcnQoZnVuY3Rpb24oYSwgYikgewogICAgICAgIHJldHVybiBhLmFuZ2xlIC0gYi5hbmdsZTsKICAgICAgfSk7CiAgICAgIGEgPSBwb2ludHNbMF0uYW5nbGU7CiAgICAgIHYgPSBwb2ludHNbMF0uaW5kZXg7CiAgICAgIHUgPSAwOwogICAgICBmb3IgKGkgPSAxOyBpIDwgcGxlbjsgKytpKSB7CiAgICAgICAgaiA9IHBvaW50c1tpXS5pbmRleDsKICAgICAgICBpZiAoYSA9PSBwb2ludHNbaV0uYW5nbGUpIHsKICAgICAgICAgIHgxID0gdmVydGljZXNbdl1bMF0gLSB2ZXJ0aWNlc1toXVswXTsKICAgICAgICAgIHkxID0gdmVydGljZXNbdl1bMV0gLSB2ZXJ0aWNlc1toXVsxXTsKICAgICAgICAgIHgyID0gdmVydGljZXNbal1bMF0gLSB2ZXJ0aWNlc1toXVswXTsKICAgICAgICAgIHkyID0gdmVydGljZXNbal1bMV0gLSB2ZXJ0aWNlc1toXVsxXTsKICAgICAgICAgIGlmICh4MSAqIHgxICsgeTEgKiB5MSA+PSB4MiAqIHgyICsgeTIgKiB5MikgewogICAgICAgICAgICBwb2ludHNbaV0uaW5kZXggPSAtMTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwb2ludHNbdV0uaW5kZXggPSAtMTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYSA9IHBvaW50c1tpXS5hbmdsZTsKICAgICAgICB1ID0gaTsKICAgICAgICB2ID0gajsKICAgICAgfQogICAgICBzdGFjay5wdXNoKGgpOwogICAgICBmb3IgKGkgPSAwLCBqID0gMDsgaSA8IDI7ICsraikgewogICAgICAgIGlmIChwb2ludHNbal0uaW5kZXggPiAtMSkgewogICAgICAgICAgc3RhY2sucHVzaChwb2ludHNbal0uaW5kZXgpOwogICAgICAgICAgaSsrOwogICAgICAgIH0KICAgICAgfQogICAgICBzcCA9IHN0YWNrLmxlbmd0aDsKICAgICAgZm9yICg7aiA8IHBsZW47ICsraikgewogICAgICAgIGlmIChwb2ludHNbal0uaW5kZXggPCAwKSBjb250aW51ZTsKICAgICAgICB3aGlsZSAoIWQzX2dlb21faHVsbENDVyhzdGFja1tzcCAtIDJdLCBzdGFja1tzcCAtIDFdLCBwb2ludHNbal0uaW5kZXgsIHZlcnRpY2VzKSkgewogICAgICAgICAgLS1zcDsKICAgICAgICB9CiAgICAgICAgc3RhY2tbc3ArK10gPSBwb2ludHNbal0uaW5kZXg7CiAgICAgIH0KICAgICAgdmFyIHBvbHkgPSBbXTsKICAgICAgZm9yIChpID0gc3AgLSAxOyBpID49IDA7IC0taSkgcG9seS5wdXNoKGRhdGFbc3RhY2tbaV1dKTsKICAgICAgcmV0dXJuIHBvbHk7CiAgICB9CiAgICBodWxsLnggPSBmdW5jdGlvbihfKSB7CiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHggPSBfLCBodWxsKSA6IHg7CiAgICB9OwogICAgaHVsbC55ID0gZnVuY3Rpb24oXykgewogICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5ID0gXywgaHVsbCkgOiB5OwogICAgfTsKICAgIHJldHVybiBodWxsOwogIH07CiAgZnVuY3Rpb24gZDNfZ2VvbV9odWxsQ0NXKGkxLCBpMiwgaTMsIHYpIHsKICAgIHZhciB0LCBhLCBiLCBjLCBkLCBlLCBmOwogICAgdCA9IHZbaTFdOwogICAgYSA9IHRbMF07CiAgICBiID0gdFsxXTsKICAgIHQgPSB2W2kyXTsKICAgIGMgPSB0WzBdOwogICAgZCA9IHRbMV07CiAgICB0ID0gdltpM107CiAgICBlID0gdFswXTsKICAgIGYgPSB0WzFdOwogICAgcmV0dXJuIChmIC0gYikgKiAoYyAtIGEpIC0gKGQgLSBiKSAqIChlIC0gYSkgPiAwOwogIH0KICBkMy5nZW9tLnBvbHlnb24gPSBmdW5jdGlvbihjb29yZGluYXRlcykgewogICAgY29vcmRpbmF0ZXMuYXJlYSA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgaSA9IDAsIG4gPSBjb29yZGluYXRlcy5sZW5ndGgsIGFyZWEgPSBjb29yZGluYXRlc1tuIC0gMV1bMV0gKiBjb29yZGluYXRlc1swXVswXSAtIGNvb3JkaW5hdGVzW24gLSAxXVswXSAqIGNvb3JkaW5hdGVzWzBdWzFdOwogICAgICB3aGlsZSAoKytpIDwgbikgewogICAgICAgIGFyZWEgKz0gY29vcmRpbmF0ZXNbaSAtIDFdWzFdICogY29vcmRpbmF0ZXNbaV1bMF0gLSBjb29yZGluYXRlc1tpIC0gMV1bMF0gKiBjb29yZGluYXRlc1tpXVsxXTsKICAgICAgfQogICAgICByZXR1cm4gYXJlYSAqIC41OwogICAgfTsKICAgIGNvb3JkaW5hdGVzLmNlbnRyb2lkID0gZnVuY3Rpb24oaykgewogICAgICB2YXIgaSA9IC0xLCBuID0gY29vcmRpbmF0ZXMubGVuZ3RoLCB4ID0gMCwgeSA9IDAsIGEsIGIgPSBjb29yZGluYXRlc1tuIC0gMV0sIGM7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgayA9IC0xIC8gKDYgKiBjb29yZGluYXRlcy5hcmVhKCkpOwogICAgICB3aGlsZSAoKytpIDwgbikgewogICAgICAgIGEgPSBiOwogICAgICAgIGIgPSBjb29yZGluYXRlc1tpXTsKICAgICAgICBjID0gYVswXSAqIGJbMV0gLSBiWzBdICogYVsxXTsKICAgICAgICB4ICs9IChhWzBdICsgYlswXSkgKiBjOwogICAgICAgIHkgKz0gKGFbMV0gKyBiWzFdKSAqIGM7CiAgICAgIH0KICAgICAgcmV0dXJuIFsgeCAqIGssIHkgKiBrIF07CiAgICB9OwogICAgY29vcmRpbmF0ZXMuY2xpcCA9IGZ1bmN0aW9uKHN1YmplY3QpIHsKICAgICAgdmFyIGlucHV0LCBpID0gLTEsIG4gPSBjb29yZGluYXRlcy5sZW5ndGgsIGosIG0sIGEgPSBjb29yZGluYXRlc1tuIC0gMV0sIGIsIGMsIGQ7CiAgICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgICAgaW5wdXQgPSBzdWJqZWN0LnNsaWNlKCk7CiAgICAgICAgc3ViamVjdC5sZW5ndGggPSAwOwogICAgICAgIGIgPSBjb29yZGluYXRlc1tpXTsKICAgICAgICBjID0gaW5wdXRbKG0gPSBpbnB1dC5sZW5ndGgpIC0gMV07CiAgICAgICAgaiA9IC0xOwogICAgICAgIHdoaWxlICgrK2ogPCBtKSB7CiAgICAgICAgICBkID0gaW5wdXRbal07CiAgICAgICAgICBpZiAoZDNfZ2VvbV9wb2x5Z29uSW5zaWRlKGQsIGEsIGIpKSB7CiAgICAgICAgICAgIGlmICghZDNfZ2VvbV9wb2x5Z29uSW5zaWRlKGMsIGEsIGIpKSB7CiAgICAgICAgICAgICAgc3ViamVjdC5wdXNoKGQzX2dlb21fcG9seWdvbkludGVyc2VjdChjLCBkLCBhLCBiKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3ViamVjdC5wdXNoKGQpOwogICAgICAgICAgfSBlbHNlIGlmIChkM19nZW9tX3BvbHlnb25JbnNpZGUoYywgYSwgYikpIHsKICAgICAgICAgICAgc3ViamVjdC5wdXNoKGQzX2dlb21fcG9seWdvbkludGVyc2VjdChjLCBkLCBhLCBiKSk7CiAgICAgICAgICB9CiAgICAgICAgICBjID0gZDsKICAgICAgICB9CiAgICAgICAgYSA9IGI7CiAgICAgIH0KICAgICAgcmV0dXJuIHN1YmplY3Q7CiAgICB9OwogICAgcmV0dXJuIGNvb3JkaW5hdGVzOwogIH07CiAgZnVuY3Rpb24gZDNfZ2VvbV9wb2x5Z29uSW5zaWRlKHAsIGEsIGIpIHsKICAgIHJldHVybiAoYlswXSAtIGFbMF0pICogKHBbMV0gLSBhWzFdKSA8IChiWzFdIC0gYVsxXSkgKiAocFswXSAtIGFbMF0pOwogIH0KICBmdW5jdGlvbiBkM19nZW9tX3BvbHlnb25JbnRlcnNlY3QoYywgZCwgYSwgYikgewogICAgdmFyIHgxID0gY1swXSwgeDMgPSBhWzBdLCB4MjEgPSBkWzBdIC0geDEsIHg0MyA9IGJbMF0gLSB4MywgeTEgPSBjWzFdLCB5MyA9IGFbMV0sIHkyMSA9IGRbMV0gLSB5MSwgeTQzID0gYlsxXSAtIHkzLCB1YSA9ICh4NDMgKiAoeTEgLSB5MykgLSB5NDMgKiAoeDEgLSB4MykpIC8gKHk0MyAqIHgyMSAtIHg0MyAqIHkyMSk7CiAgICByZXR1cm4gWyB4MSArIHVhICogeDIxLCB5MSArIHVhICogeTIxIF07CiAgfQogIGQzLmdlb20uZGVsYXVuYXkgPSBmdW5jdGlvbih2ZXJ0aWNlcykgewogICAgdmFyIGVkZ2VzID0gdmVydGljZXMubWFwKGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gW107CiAgICB9KSwgdHJpYW5nbGVzID0gW107CiAgICBkM19nZW9tX3Zvcm9ub2lUZXNzZWxsYXRlKHZlcnRpY2VzLCBmdW5jdGlvbihlKSB7CiAgICAgIGVkZ2VzW2UucmVnaW9uLmwuaW5kZXhdLnB1c2godmVydGljZXNbZS5yZWdpb24uci5pbmRleF0pOwogICAgfSk7CiAgICBlZGdlcy5mb3JFYWNoKGZ1bmN0aW9uKGVkZ2UsIGkpIHsKICAgICAgdmFyIHYgPSB2ZXJ0aWNlc1tpXSwgY3ggPSB2WzBdLCBjeSA9IHZbMV07CiAgICAgIGVkZ2UuZm9yRWFjaChmdW5jdGlvbih2KSB7CiAgICAgICAgdi5hbmdsZSA9IE1hdGguYXRhbjIodlswXSAtIGN4LCB2WzFdIC0gY3kpOwogICAgICB9KTsKICAgICAgZWRnZS5zb3J0KGZ1bmN0aW9uKGEsIGIpIHsKICAgICAgICByZXR1cm4gYS5hbmdsZSAtIGIuYW5nbGU7CiAgICAgIH0pOwogICAgICBmb3IgKHZhciBqID0gMCwgbSA9IGVkZ2UubGVuZ3RoIC0gMTsgaiA8IG07IGorKykgewogICAgICAgIHRyaWFuZ2xlcy5wdXNoKFsgdiwgZWRnZVtqXSwgZWRnZVtqICsgMV0gXSk7CiAgICAgIH0KICAgIH0pOwogICAgcmV0dXJuIHRyaWFuZ2xlczsKICB9OwogIGQzLmdlb20udm9yb25vaSA9IGZ1bmN0aW9uKHBvaW50cykgewogICAgdmFyIHNpemUgPSBudWxsLCB4ID0gZDNfc3ZnX2xpbmVYLCB5ID0gZDNfc3ZnX2xpbmVZLCBjbGlwOwogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB2b3Jvbm9pKHBvaW50cyk7CiAgICBmdW5jdGlvbiB2b3Jvbm9pKGRhdGEpIHsKICAgICAgdmFyIHBvaW50cywgcG9seWdvbnMgPSBkYXRhLm1hcChmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gW107CiAgICAgIH0pLCBmeCA9IGQzX2Z1bmN0b3IoeCksIGZ5ID0gZDNfZnVuY3Rvcih5KSwgZCwgaSwgbiA9IGRhdGEubGVuZ3RoLCBaID0gMWU2OwogICAgICBpZiAoZnggPT09IGQzX3N2Z19saW5lWCAmJiBmeSA9PT0gZDNfc3ZnX2xpbmVZKSBwb2ludHMgPSBkYXRhOyBlbHNlIGZvciAocG9pbnRzID0gW10sIAogICAgICBpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgIHBvaW50cy5wdXNoKFsgK2Z4LmNhbGwodGhpcywgZCA9IGRhdGFbaV0sIGkpLCArZnkuY2FsbCh0aGlzLCBkLCBpKSBdKTsKICAgICAgfQogICAgICBkM19nZW9tX3Zvcm9ub2lUZXNzZWxsYXRlKHBvaW50cywgZnVuY3Rpb24oZSkgewogICAgICAgIHZhciBzMSwgczIsIHgxLCB4MiwgeTEsIHkyOwogICAgICAgIGlmIChlLmEgPT09IDEgJiYgZS5iID49IDApIHsKICAgICAgICAgIHMxID0gZS5lcC5yOwogICAgICAgICAgczIgPSBlLmVwLmw7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHMxID0gZS5lcC5sOwogICAgICAgICAgczIgPSBlLmVwLnI7CiAgICAgICAgfQogICAgICAgIGlmIChlLmEgPT09IDEpIHsKICAgICAgICAgIHkxID0gczEgPyBzMS55IDogLVo7CiAgICAgICAgICB4MSA9IGUuYyAtIGUuYiAqIHkxOwogICAgICAgICAgeTIgPSBzMiA/IHMyLnkgOiBaOwogICAgICAgICAgeDIgPSBlLmMgLSBlLmIgKiB5MjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgeDEgPSBzMSA/IHMxLnggOiAtWjsKICAgICAgICAgIHkxID0gZS5jIC0gZS5hICogeDE7CiAgICAgICAgICB4MiA9IHMyID8gczIueCA6IFo7CiAgICAgICAgICB5MiA9IGUuYyAtIGUuYSAqIHgyOwogICAgICAgIH0KICAgICAgICB2YXIgdjEgPSBbIHgxLCB5MSBdLCB2MiA9IFsgeDIsIHkyIF07CiAgICAgICAgcG9seWdvbnNbZS5yZWdpb24ubC5pbmRleF0ucHVzaCh2MSwgdjIpOwogICAgICAgIHBvbHlnb25zW2UucmVnaW9uLnIuaW5kZXhdLnB1c2godjEsIHYyKTsKICAgICAgfSk7CiAgICAgIHBvbHlnb25zID0gcG9seWdvbnMubWFwKGZ1bmN0aW9uKHBvbHlnb24sIGkpIHsKICAgICAgICB2YXIgY3ggPSBwb2ludHNbaV1bMF0sIGN5ID0gcG9pbnRzW2ldWzFdLCBhbmdsZSA9IHBvbHlnb24ubWFwKGZ1bmN0aW9uKHYpIHsKICAgICAgICAgIHJldHVybiBNYXRoLmF0YW4yKHZbMF0gLSBjeCwgdlsxXSAtIGN5KTsKICAgICAgICB9KSwgb3JkZXIgPSBkMy5yYW5nZShwb2x5Z29uLmxlbmd0aCkuc29ydChmdW5jdGlvbihhLCBiKSB7CiAgICAgICAgICByZXR1cm4gYW5nbGVbYV0gLSBhbmdsZVtiXTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gb3JkZXIuZmlsdGVyKGZ1bmN0aW9uKGQsIGkpIHsKICAgICAgICAgIHJldHVybiAhaSB8fCBhbmdsZVtkXSAtIGFuZ2xlW29yZGVyW2kgLSAxXV0gPiDOtTsKICAgICAgICB9KS5tYXAoZnVuY3Rpb24oZCkgewogICAgICAgICAgcmV0dXJuIHBvbHlnb25bZF07CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgICBwb2x5Z29ucy5mb3JFYWNoKGZ1bmN0aW9uKHBvbHlnb24sIGkpIHsKICAgICAgICB2YXIgbiA9IHBvbHlnb24ubGVuZ3RoOwogICAgICAgIGlmICghbikgcmV0dXJuIHBvbHlnb24ucHVzaChbIC1aLCAtWiBdLCBbIC1aLCBaIF0sIFsgWiwgWiBdLCBbIFosIC1aIF0pOwogICAgICAgIGlmIChuID4gMikgcmV0dXJuOwogICAgICAgIHZhciBwMCA9IHBvaW50c1tpXSwgcDEgPSBwb2x5Z29uWzBdLCBwMiA9IHBvbHlnb25bMV0sIHgwID0gcDBbMF0sIHkwID0gcDBbMV0sIHgxID0gcDFbMF0sIHkxID0gcDFbMV0sIHgyID0gcDJbMF0sIHkyID0gcDJbMV0sIGR4ID0gTWF0aC5hYnMoeDIgLSB4MSksIGR5ID0geTIgLSB5MTsKICAgICAgICBpZiAoTWF0aC5hYnMoZHkpIDwgzrUpIHsKICAgICAgICAgIHZhciB5ID0geTAgPCB5MSA/IC1aIDogWjsKICAgICAgICAgIHBvbHlnb24ucHVzaChbIC1aLCB5IF0sIFsgWiwgeSBdKTsKICAgICAgICB9IGVsc2UgaWYgKGR4IDwgzrUpIHsKICAgICAgICAgIHZhciB4ID0geDAgPCB4MSA/IC1aIDogWjsKICAgICAgICAgIHBvbHlnb24ucHVzaChbIHgsIC1aIF0sIFsgeCwgWiBdKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFyIHkgPSAoeDIgLSB4MSkgKiAoeTEgLSB5MCkgPCAoeDEgLSB4MCkgKiAoeTIgLSB5MSkgPyBaIDogLVosIHogPSBNYXRoLmFicyhkeSkgLSBkeDsKICAgICAgICAgIGlmIChNYXRoLmFicyh6KSA8IM61KSB7CiAgICAgICAgICAgIHBvbHlnb24ucHVzaChbIGR5IDwgMCA/IHkgOiAteSwgeSBdKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICh6ID4gMCkgeSAqPSAtMTsKICAgICAgICAgICAgcG9seWdvbi5wdXNoKFsgLVosIHkgXSwgWyBaLCB5IF0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICAgIGlmIChjbGlwKSBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSBjbGlwKHBvbHlnb25zW2ldKTsKICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgcG9seWdvbnNbaV0ucG9pbnQgPSBkYXRhW2ldOwogICAgICByZXR1cm4gcG9seWdvbnM7CiAgICB9CiAgICB2b3Jvbm9pLnggPSBmdW5jdGlvbihfKSB7CiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHggPSBfLCB2b3Jvbm9pKSA6IHg7CiAgICB9OwogICAgdm9yb25vaS55ID0gZnVuY3Rpb24oXykgewogICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5ID0gXywgdm9yb25vaSkgOiB5OwogICAgfTsKICAgIHZvcm9ub2kuc2l6ZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc2l6ZTsKICAgICAgaWYgKF8gPT0gbnVsbCkgewogICAgICAgIGNsaXAgPSBudWxsOwogICAgICB9IGVsc2UgewogICAgICAgIHNpemUgPSBbICtfWzBdLCArX1sxXSBdOwogICAgICAgIGNsaXAgPSBkMy5nZW9tLnBvbHlnb24oWyBbIDAsIDAgXSwgWyAwLCBzaXplWzFdIF0sIHNpemUsIFsgc2l6ZVswXSwgMCBdIF0pLmNsaXA7CiAgICAgIH0KICAgICAgcmV0dXJuIHZvcm9ub2k7CiAgICB9OwogICAgdm9yb25vaS5saW5rcyA9IGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgdmFyIHBvaW50cywgZ3JhcGggPSBkYXRhLm1hcChmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gW107CiAgICAgIH0pLCBsaW5rcyA9IFtdLCBmeCA9IGQzX2Z1bmN0b3IoeCksIGZ5ID0gZDNfZnVuY3Rvcih5KSwgZCwgaSwgbiA9IGRhdGEubGVuZ3RoOwogICAgICBpZiAoZnggPT09IGQzX3N2Z19saW5lWCAmJiBmeSA9PT0gZDNfc3ZnX2xpbmVZKSBwb2ludHMgPSBkYXRhOyBlbHNlIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICBwb2ludHMucHVzaChbICtmeC5jYWxsKHRoaXMsIGQgPSBkYXRhW2ldLCBpKSwgK2Z5LmNhbGwodGhpcywgZCwgaSkgXSk7CiAgICAgIH0KICAgICAgZDNfZ2VvbV92b3Jvbm9pVGVzc2VsbGF0ZShwb2ludHMsIGZ1bmN0aW9uKGUpIHsKICAgICAgICB2YXIgbCA9IGUucmVnaW9uLmwuaW5kZXgsIHIgPSBlLnJlZ2lvbi5yLmluZGV4OwogICAgICAgIGlmIChncmFwaFtsXVtyXSkgcmV0dXJuOwogICAgICAgIGdyYXBoW2xdW3JdID0gZ3JhcGhbcl1bbF0gPSB0cnVlOwogICAgICAgIGxpbmtzLnB1c2goewogICAgICAgICAgc291cmNlOiBkYXRhW2xdLAogICAgICAgICAgdGFyZ2V0OiBkYXRhW3JdCiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgICByZXR1cm4gbGlua3M7CiAgICB9OwogICAgdm9yb25vaS50cmlhbmdsZXMgPSBmdW5jdGlvbihkYXRhKSB7CiAgICAgIGlmICh4ID09PSBkM19zdmdfbGluZVggJiYgeSA9PT0gZDNfc3ZnX2xpbmVZKSByZXR1cm4gZDMuZ2VvbS5kZWxhdW5heShkYXRhKTsKICAgICAgdmFyIHBvaW50cywgcG9pbnQsIGZ4ID0gZDNfZnVuY3Rvcih4KSwgZnkgPSBkM19mdW5jdG9yKHkpLCBkLCBpLCBuOwogICAgICBmb3IgKGkgPSAwLCBwb2ludHMgPSBbXSwgbiA9IGRhdGEubGVuZ3RoOyBpIDwgbjsgKytpKSB7CiAgICAgICAgcG9pbnQgPSBbICtmeC5jYWxsKHRoaXMsIGQgPSBkYXRhW2ldLCBpKSwgK2Z5LmNhbGwodGhpcywgZCwgaSkgXTsKICAgICAgICBwb2ludC5kYXRhID0gZDsKICAgICAgICBwb2ludHMucHVzaChwb2ludCk7CiAgICAgIH0KICAgICAgcmV0dXJuIGQzLmdlb20uZGVsYXVuYXkocG9pbnRzKS5tYXAoZnVuY3Rpb24odHJpYW5nbGUpIHsKICAgICAgICByZXR1cm4gdHJpYW5nbGUubWFwKGZ1bmN0aW9uKHBvaW50KSB7CiAgICAgICAgICByZXR1cm4gcG9pbnQuZGF0YTsKICAgICAgICB9KTsKICAgICAgfSk7CiAgICB9OwogICAgcmV0dXJuIHZvcm9ub2k7CiAgfTsKICB2YXIgZDNfZ2VvbV92b3Jvbm9pT3Bwb3NpdGUgPSB7CiAgICBsOiAiciIsCiAgICByOiAibCIKICB9OwogIGZ1bmN0aW9uIGQzX2dlb21fdm9yb25vaVRlc3NlbGxhdGUocG9pbnRzLCBjYWxsYmFjaykgewogICAgdmFyIFNpdGVzID0gewogICAgICBsaXN0OiBwb2ludHMubWFwKGZ1bmN0aW9uKHYsIGkpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgaW5kZXg6IGksCiAgICAgICAgICB4OiB2WzBdLAogICAgICAgICAgeTogdlsxXQogICAgICAgIH07CiAgICAgIH0pLnNvcnQoZnVuY3Rpb24oYSwgYikgewogICAgICAgIHJldHVybiBhLnkgPCBiLnkgPyAtMSA6IGEueSA+IGIueSA/IDEgOiBhLnggPCBiLnggPyAtMSA6IGEueCA+IGIueCA/IDEgOiAwOwogICAgICB9KSwKICAgICAgYm90dG9tU2l0ZTogbnVsbAogICAgfTsKICAgIHZhciBFZGdlTGlzdCA9IHsKICAgICAgbGlzdDogW10sCiAgICAgIGxlZnRFbmQ6IG51bGwsCiAgICAgIHJpZ2h0RW5kOiBudWxsLAogICAgICBpbml0OiBmdW5jdGlvbigpIHsKICAgICAgICBFZGdlTGlzdC5sZWZ0RW5kID0gRWRnZUxpc3QuY3JlYXRlSGFsZkVkZ2UobnVsbCwgImwiKTsKICAgICAgICBFZGdlTGlzdC5yaWdodEVuZCA9IEVkZ2VMaXN0LmNyZWF0ZUhhbGZFZGdlKG51bGwsICJsIik7CiAgICAgICAgRWRnZUxpc3QubGVmdEVuZC5yID0gRWRnZUxpc3QucmlnaHRFbmQ7CiAgICAgICAgRWRnZUxpc3QucmlnaHRFbmQubCA9IEVkZ2VMaXN0LmxlZnRFbmQ7CiAgICAgICAgRWRnZUxpc3QubGlzdC51bnNoaWZ0KEVkZ2VMaXN0LmxlZnRFbmQsIEVkZ2VMaXN0LnJpZ2h0RW5kKTsKICAgICAgfSwKICAgICAgY3JlYXRlSGFsZkVkZ2U6IGZ1bmN0aW9uKGVkZ2UsIHNpZGUpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgZWRnZTogZWRnZSwKICAgICAgICAgIHNpZGU6IHNpZGUsCiAgICAgICAgICB2ZXJ0ZXg6IG51bGwsCiAgICAgICAgICBsOiBudWxsLAogICAgICAgICAgcjogbnVsbAogICAgICAgIH07CiAgICAgIH0sCiAgICAgIGluc2VydDogZnVuY3Rpb24obGIsIGhlKSB7CiAgICAgICAgaGUubCA9IGxiOwogICAgICAgIGhlLnIgPSBsYi5yOwogICAgICAgIGxiLnIubCA9IGhlOwogICAgICAgIGxiLnIgPSBoZTsKICAgICAgfSwKICAgICAgbGVmdEJvdW5kOiBmdW5jdGlvbihwKSB7CiAgICAgICAgdmFyIGhlID0gRWRnZUxpc3QubGVmdEVuZDsKICAgICAgICBkbyB7CiAgICAgICAgICBoZSA9IGhlLnI7CiAgICAgICAgfSB3aGlsZSAoaGUgIT0gRWRnZUxpc3QucmlnaHRFbmQgJiYgR2VvbS5yaWdodE9mKGhlLCBwKSk7CiAgICAgICAgaGUgPSBoZS5sOwogICAgICAgIHJldHVybiBoZTsKICAgICAgfSwKICAgICAgZGVsOiBmdW5jdGlvbihoZSkgewogICAgICAgIGhlLmwuciA9IGhlLnI7CiAgICAgICAgaGUuci5sID0gaGUubDsKICAgICAgICBoZS5lZGdlID0gbnVsbDsKICAgICAgfSwKICAgICAgcmlnaHQ6IGZ1bmN0aW9uKGhlKSB7CiAgICAgICAgcmV0dXJuIGhlLnI7CiAgICAgIH0sCiAgICAgIGxlZnQ6IGZ1bmN0aW9uKGhlKSB7CiAgICAgICAgcmV0dXJuIGhlLmw7CiAgICAgIH0sCiAgICAgIGxlZnRSZWdpb246IGZ1bmN0aW9uKGhlKSB7CiAgICAgICAgcmV0dXJuIGhlLmVkZ2UgPT0gbnVsbCA/IFNpdGVzLmJvdHRvbVNpdGUgOiBoZS5lZGdlLnJlZ2lvbltoZS5zaWRlXTsKICAgICAgfSwKICAgICAgcmlnaHRSZWdpb246IGZ1bmN0aW9uKGhlKSB7CiAgICAgICAgcmV0dXJuIGhlLmVkZ2UgPT0gbnVsbCA/IFNpdGVzLmJvdHRvbVNpdGUgOiBoZS5lZGdlLnJlZ2lvbltkM19nZW9tX3Zvcm9ub2lPcHBvc2l0ZVtoZS5zaWRlXV07CiAgICAgIH0KICAgIH07CiAgICB2YXIgR2VvbSA9IHsKICAgICAgYmlzZWN0OiBmdW5jdGlvbihzMSwgczIpIHsKICAgICAgICB2YXIgbmV3RWRnZSA9IHsKICAgICAgICAgIHJlZ2lvbjogewogICAgICAgICAgICBsOiBzMSwKICAgICAgICAgICAgcjogczIKICAgICAgICAgIH0sCiAgICAgICAgICBlcDogewogICAgICAgICAgICBsOiBudWxsLAogICAgICAgICAgICByOiBudWxsCiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICB2YXIgZHggPSBzMi54IC0gczEueCwgZHkgPSBzMi55IC0gczEueSwgYWR4ID0gZHggPiAwID8gZHggOiAtZHgsIGFkeSA9IGR5ID4gMCA/IGR5IDogLWR5OwogICAgICAgIG5ld0VkZ2UuYyA9IHMxLnggKiBkeCArIHMxLnkgKiBkeSArIChkeCAqIGR4ICsgZHkgKiBkeSkgKiAuNTsKICAgICAgICBpZiAoYWR4ID4gYWR5KSB7CiAgICAgICAgICBuZXdFZGdlLmEgPSAxOwogICAgICAgICAgbmV3RWRnZS5iID0gZHkgLyBkeDsKICAgICAgICAgIG5ld0VkZ2UuYyAvPSBkeDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbmV3RWRnZS5iID0gMTsKICAgICAgICAgIG5ld0VkZ2UuYSA9IGR4IC8gZHk7CiAgICAgICAgICBuZXdFZGdlLmMgLz0gZHk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXdFZGdlOwogICAgICB9LAogICAgICBpbnRlcnNlY3Q6IGZ1bmN0aW9uKGVsMSwgZWwyKSB7CiAgICAgICAgdmFyIGUxID0gZWwxLmVkZ2UsIGUyID0gZWwyLmVkZ2U7CiAgICAgICAgaWYgKCFlMSB8fCAhZTIgfHwgZTEucmVnaW9uLnIgPT0gZTIucmVnaW9uLnIpIHsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICB2YXIgZCA9IGUxLmEgKiBlMi5iIC0gZTEuYiAqIGUyLmE7CiAgICAgICAgaWYgKE1hdGguYWJzKGQpIDwgMWUtMTApIHsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICB2YXIgeGludCA9IChlMS5jICogZTIuYiAtIGUyLmMgKiBlMS5iKSAvIGQsIHlpbnQgPSAoZTIuYyAqIGUxLmEgLSBlMS5jICogZTIuYSkgLyBkLCBlMXIgPSBlMS5yZWdpb24uciwgZTJyID0gZTIucmVnaW9uLnIsIGVsLCBlOwogICAgICAgIGlmIChlMXIueSA8IGUyci55IHx8IGUxci55ID09IGUyci55ICYmIGUxci54IDwgZTJyLngpIHsKICAgICAgICAgIGVsID0gZWwxOwogICAgICAgICAgZSA9IGUxOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBlbCA9IGVsMjsKICAgICAgICAgIGUgPSBlMjsKICAgICAgICB9CiAgICAgICAgdmFyIHJpZ2h0T2ZTaXRlID0geGludCA+PSBlLnJlZ2lvbi5yLng7CiAgICAgICAgaWYgKHJpZ2h0T2ZTaXRlICYmIGVsLnNpZGUgPT09ICJsIiB8fCAhcmlnaHRPZlNpdGUgJiYgZWwuc2lkZSA9PT0gInIiKSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHg6IHhpbnQsCiAgICAgICAgICB5OiB5aW50CiAgICAgICAgfTsKICAgICAgfSwKICAgICAgcmlnaHRPZjogZnVuY3Rpb24oaGUsIHApIHsKICAgICAgICB2YXIgZSA9IGhlLmVkZ2UsIHRvcHNpdGUgPSBlLnJlZ2lvbi5yLCByaWdodE9mU2l0ZSA9IHAueCA+IHRvcHNpdGUueDsKICAgICAgICBpZiAocmlnaHRPZlNpdGUgJiYgaGUuc2lkZSA9PT0gImwiKSB7CiAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICAgICAgaWYgKCFyaWdodE9mU2l0ZSAmJiBoZS5zaWRlID09PSAiciIpIHsKICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBpZiAoZS5hID09PSAxKSB7CiAgICAgICAgICB2YXIgZHlwID0gcC55IC0gdG9wc2l0ZS55LCBkeHAgPSBwLnggLSB0b3BzaXRlLngsIGZhc3QgPSAwLCBhYm92ZSA9IDA7CiAgICAgICAgICBpZiAoIXJpZ2h0T2ZTaXRlICYmIGUuYiA8IDAgfHwgcmlnaHRPZlNpdGUgJiYgZS5iID49IDApIHsKICAgICAgICAgICAgYWJvdmUgPSBmYXN0ID0gZHlwID49IGUuYiAqIGR4cDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGFib3ZlID0gcC54ICsgcC55ICogZS5iID4gZS5jOwogICAgICAgICAgICBpZiAoZS5iIDwgMCkgewogICAgICAgICAgICAgIGFib3ZlID0gIWFib3ZlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYWJvdmUpIHsKICAgICAgICAgICAgICBmYXN0ID0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKCFmYXN0KSB7CiAgICAgICAgICAgIHZhciBkeHMgPSB0b3BzaXRlLnggLSBlLnJlZ2lvbi5sLng7CiAgICAgICAgICAgIGFib3ZlID0gZS5iICogKGR4cCAqIGR4cCAtIGR5cCAqIGR5cCkgPCBkeHMgKiBkeXAgKiAoMSArIDIgKiBkeHAgLyBkeHMgKyBlLmIgKiBlLmIpOwogICAgICAgICAgICBpZiAoZS5iIDwgMCkgewogICAgICAgICAgICAgIGFib3ZlID0gIWFib3ZlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZhciB5bCA9IGUuYyAtIGUuYSAqIHAueCwgdDEgPSBwLnkgLSB5bCwgdDIgPSBwLnggLSB0b3BzaXRlLngsIHQzID0geWwgLSB0b3BzaXRlLnk7CiAgICAgICAgICBhYm92ZSA9IHQxICogdDEgPiB0MiAqIHQyICsgdDMgKiB0MzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGhlLnNpZGUgPT09ICJsIiA/IGFib3ZlIDogIWFib3ZlOwogICAgICB9LAogICAgICBlbmRQb2ludDogZnVuY3Rpb24oZWRnZSwgc2lkZSwgc2l0ZSkgewogICAgICAgIGVkZ2UuZXBbc2lkZV0gPSBzaXRlOwogICAgICAgIGlmICghZWRnZS5lcFtkM19nZW9tX3Zvcm9ub2lPcHBvc2l0ZVtzaWRlXV0pIHJldHVybjsKICAgICAgICBjYWxsYmFjayhlZGdlKTsKICAgICAgfSwKICAgICAgZGlzdGFuY2U6IGZ1bmN0aW9uKHMsIHQpIHsKICAgICAgICB2YXIgZHggPSBzLnggLSB0LngsIGR5ID0gcy55IC0gdC55OwogICAgICAgIHJldHVybiBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpOwogICAgICB9CiAgICB9OwogICAgdmFyIEV2ZW50UXVldWUgPSB7CiAgICAgIGxpc3Q6IFtdLAogICAgICBpbnNlcnQ6IGZ1bmN0aW9uKGhlLCBzaXRlLCBvZmZzZXQpIHsKICAgICAgICBoZS52ZXJ0ZXggPSBzaXRlOwogICAgICAgIGhlLnlzdGFyID0gc2l0ZS55ICsgb2Zmc2V0OwogICAgICAgIGZvciAodmFyIGkgPSAwLCBsaXN0ID0gRXZlbnRRdWV1ZS5saXN0LCBsID0gbGlzdC5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgICAgIHZhciBuZXh0ID0gbGlzdFtpXTsKICAgICAgICAgIGlmIChoZS55c3RhciA+IG5leHQueXN0YXIgfHwgaGUueXN0YXIgPT0gbmV4dC55c3RhciAmJiBzaXRlLnggPiBuZXh0LnZlcnRleC54KSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGxpc3Quc3BsaWNlKGksIDAsIGhlKTsKICAgICAgfSwKICAgICAgZGVsOiBmdW5jdGlvbihoZSkgewogICAgICAgIGZvciAodmFyIGkgPSAwLCBscyA9IEV2ZW50UXVldWUubGlzdCwgbCA9IGxzLmxlbmd0aDsgaSA8IGwgJiYgbHNbaV0gIT0gaGU7ICsraSkge30KICAgICAgICBscy5zcGxpY2UoaSwgMSk7CiAgICAgIH0sCiAgICAgIGVtcHR5OiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gRXZlbnRRdWV1ZS5saXN0Lmxlbmd0aCA9PT0gMDsKICAgICAgfSwKICAgICAgbmV4dEV2ZW50OiBmdW5jdGlvbihoZSkgewogICAgICAgIGZvciAodmFyIGkgPSAwLCBscyA9IEV2ZW50UXVldWUubGlzdCwgbCA9IGxzLmxlbmd0aDsgaSA8IGw7ICsraSkgewogICAgICAgICAgaWYgKGxzW2ldID09IGhlKSByZXR1cm4gbHNbaSArIDFdOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfSwKICAgICAgbWluOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgZWxlbSA9IEV2ZW50UXVldWUubGlzdFswXTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgeDogZWxlbS52ZXJ0ZXgueCwKICAgICAgICAgIHk6IGVsZW0ueXN0YXIKICAgICAgICB9OwogICAgICB9LAogICAgICBleHRyYWN0TWluOiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gRXZlbnRRdWV1ZS5saXN0LnNoaWZ0KCk7CiAgICAgIH0KICAgIH07CiAgICBFZGdlTGlzdC5pbml0KCk7CiAgICBTaXRlcy5ib3R0b21TaXRlID0gU2l0ZXMubGlzdC5zaGlmdCgpOwogICAgdmFyIG5ld1NpdGUgPSBTaXRlcy5saXN0LnNoaWZ0KCksIG5ld0ludFN0YXI7CiAgICB2YXIgbGJuZCwgcmJuZCwgbGxibmQsIHJyYm5kLCBiaXNlY3RvcjsKICAgIHZhciBib3QsIHRvcCwgdGVtcCwgcCwgdjsKICAgIHZhciBlLCBwbTsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIGlmICghRXZlbnRRdWV1ZS5lbXB0eSgpKSB7CiAgICAgICAgbmV3SW50U3RhciA9IEV2ZW50UXVldWUubWluKCk7CiAgICAgIH0KICAgICAgaWYgKG5ld1NpdGUgJiYgKEV2ZW50UXVldWUuZW1wdHkoKSB8fCBuZXdTaXRlLnkgPCBuZXdJbnRTdGFyLnkgfHwgbmV3U2l0ZS55ID09IG5ld0ludFN0YXIueSAmJiBuZXdTaXRlLnggPCBuZXdJbnRTdGFyLngpKSB7CiAgICAgICAgbGJuZCA9IEVkZ2VMaXN0LmxlZnRCb3VuZChuZXdTaXRlKTsKICAgICAgICByYm5kID0gRWRnZUxpc3QucmlnaHQobGJuZCk7CiAgICAgICAgYm90ID0gRWRnZUxpc3QucmlnaHRSZWdpb24obGJuZCk7CiAgICAgICAgZSA9IEdlb20uYmlzZWN0KGJvdCwgbmV3U2l0ZSk7CiAgICAgICAgYmlzZWN0b3IgPSBFZGdlTGlzdC5jcmVhdGVIYWxmRWRnZShlLCAibCIpOwogICAgICAgIEVkZ2VMaXN0Lmluc2VydChsYm5kLCBiaXNlY3Rvcik7CiAgICAgICAgcCA9IEdlb20uaW50ZXJzZWN0KGxibmQsIGJpc2VjdG9yKTsKICAgICAgICBpZiAocCkgewogICAgICAgICAgRXZlbnRRdWV1ZS5kZWwobGJuZCk7CiAgICAgICAgICBFdmVudFF1ZXVlLmluc2VydChsYm5kLCBwLCBHZW9tLmRpc3RhbmNlKHAsIG5ld1NpdGUpKTsKICAgICAgICB9CiAgICAgICAgbGJuZCA9IGJpc2VjdG9yOwogICAgICAgIGJpc2VjdG9yID0gRWRnZUxpc3QuY3JlYXRlSGFsZkVkZ2UoZSwgInIiKTsKICAgICAgICBFZGdlTGlzdC5pbnNlcnQobGJuZCwgYmlzZWN0b3IpOwogICAgICAgIHAgPSBHZW9tLmludGVyc2VjdChiaXNlY3RvciwgcmJuZCk7CiAgICAgICAgaWYgKHApIHsKICAgICAgICAgIEV2ZW50UXVldWUuaW5zZXJ0KGJpc2VjdG9yLCBwLCBHZW9tLmRpc3RhbmNlKHAsIG5ld1NpdGUpKTsKICAgICAgICB9CiAgICAgICAgbmV3U2l0ZSA9IFNpdGVzLmxpc3Quc2hpZnQoKTsKICAgICAgfSBlbHNlIGlmICghRXZlbnRRdWV1ZS5lbXB0eSgpKSB7CiAgICAgICAgbGJuZCA9IEV2ZW50UXVldWUuZXh0cmFjdE1pbigpOwogICAgICAgIGxsYm5kID0gRWRnZUxpc3QubGVmdChsYm5kKTsKICAgICAgICByYm5kID0gRWRnZUxpc3QucmlnaHQobGJuZCk7CiAgICAgICAgcnJibmQgPSBFZGdlTGlzdC5yaWdodChyYm5kKTsKICAgICAgICBib3QgPSBFZGdlTGlzdC5sZWZ0UmVnaW9uKGxibmQpOwogICAgICAgIHRvcCA9IEVkZ2VMaXN0LnJpZ2h0UmVnaW9uKHJibmQpOwogICAgICAgIHYgPSBsYm5kLnZlcnRleDsKICAgICAgICBHZW9tLmVuZFBvaW50KGxibmQuZWRnZSwgbGJuZC5zaWRlLCB2KTsKICAgICAgICBHZW9tLmVuZFBvaW50KHJibmQuZWRnZSwgcmJuZC5zaWRlLCB2KTsKICAgICAgICBFZGdlTGlzdC5kZWwobGJuZCk7CiAgICAgICAgRXZlbnRRdWV1ZS5kZWwocmJuZCk7CiAgICAgICAgRWRnZUxpc3QuZGVsKHJibmQpOwogICAgICAgIHBtID0gImwiOwogICAgICAgIGlmIChib3QueSA+IHRvcC55KSB7CiAgICAgICAgICB0ZW1wID0gYm90OwogICAgICAgICAgYm90ID0gdG9wOwogICAgICAgICAgdG9wID0gdGVtcDsKICAgICAgICAgIHBtID0gInIiOwogICAgICAgIH0KICAgICAgICBlID0gR2VvbS5iaXNlY3QoYm90LCB0b3ApOwogICAgICAgIGJpc2VjdG9yID0gRWRnZUxpc3QuY3JlYXRlSGFsZkVkZ2UoZSwgcG0pOwogICAgICAgIEVkZ2VMaXN0Lmluc2VydChsbGJuZCwgYmlzZWN0b3IpOwogICAgICAgIEdlb20uZW5kUG9pbnQoZSwgZDNfZ2VvbV92b3Jvbm9pT3Bwb3NpdGVbcG1dLCB2KTsKICAgICAgICBwID0gR2VvbS5pbnRlcnNlY3QobGxibmQsIGJpc2VjdG9yKTsKICAgICAgICBpZiAocCkgewogICAgICAgICAgRXZlbnRRdWV1ZS5kZWwobGxibmQpOwogICAgICAgICAgRXZlbnRRdWV1ZS5pbnNlcnQobGxibmQsIHAsIEdlb20uZGlzdGFuY2UocCwgYm90KSk7CiAgICAgICAgfQogICAgICAgIHAgPSBHZW9tLmludGVyc2VjdChiaXNlY3RvciwgcnJibmQpOwogICAgICAgIGlmIChwKSB7CiAgICAgICAgICBFdmVudFF1ZXVlLmluc2VydChiaXNlY3RvciwgcCwgR2VvbS5kaXN0YW5jZShwLCBib3QpKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIGZvciAobGJuZCA9IEVkZ2VMaXN0LnJpZ2h0KEVkZ2VMaXN0LmxlZnRFbmQpOyBsYm5kICE9IEVkZ2VMaXN0LnJpZ2h0RW5kOyBsYm5kID0gRWRnZUxpc3QucmlnaHQobGJuZCkpIHsKICAgICAgY2FsbGJhY2sobGJuZC5lZGdlKTsKICAgIH0KICB9CiAgZDMuZ2VvbS5xdWFkdHJlZSA9IGZ1bmN0aW9uKHBvaW50cywgeDEsIHkxLCB4MiwgeTIpIHsKICAgIHZhciB4ID0gZDNfc3ZnX2xpbmVYLCB5ID0gZDNfc3ZnX2xpbmVZLCBjb21wYXQ7CiAgICBpZiAoY29tcGF0ID0gYXJndW1lbnRzLmxlbmd0aCkgewogICAgICB4ID0gZDNfZ2VvbV9xdWFkdHJlZUNvbXBhdFg7CiAgICAgIHkgPSBkM19nZW9tX3F1YWR0cmVlQ29tcGF0WTsKICAgICAgaWYgKGNvbXBhdCA9PT0gMykgewogICAgICAgIHkyID0geTE7CiAgICAgICAgeDIgPSB4MTsKICAgICAgICB5MSA9IHgxID0gMDsKICAgICAgfQogICAgICByZXR1cm4gcXVhZHRyZWUocG9pbnRzKTsKICAgIH0KICAgIGZ1bmN0aW9uIHF1YWR0cmVlKGRhdGEpIHsKICAgICAgdmFyIGQsIGZ4ID0gZDNfZnVuY3Rvcih4KSwgZnkgPSBkM19mdW5jdG9yKHkpLCB4cywgeXMsIGksIG4sIHgxXywgeTFfLCB4Ml8sIHkyXzsKICAgICAgaWYgKHgxICE9IG51bGwpIHsKICAgICAgICB4MV8gPSB4MSwgeTFfID0geTEsIHgyXyA9IHgyLCB5Ml8gPSB5MjsKICAgICAgfSBlbHNlIHsKICAgICAgICB4Ml8gPSB5Ml8gPSAtKHgxXyA9IHkxXyA9IEluZmluaXR5KTsKICAgICAgICB4cyA9IFtdLCB5cyA9IFtdOwogICAgICAgIG4gPSBkYXRhLmxlbmd0aDsKICAgICAgICBpZiAoY29tcGF0KSBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBkID0gZGF0YVtpXTsKICAgICAgICAgIGlmIChkLnggPCB4MV8pIHgxXyA9IGQueDsKICAgICAgICAgIGlmIChkLnkgPCB5MV8pIHkxXyA9IGQueTsKICAgICAgICAgIGlmIChkLnggPiB4Ml8pIHgyXyA9IGQueDsKICAgICAgICAgIGlmIChkLnkgPiB5Ml8pIHkyXyA9IGQueTsKICAgICAgICAgIHhzLnB1c2goZC54KTsKICAgICAgICAgIHlzLnB1c2goZC55KTsKICAgICAgICB9IGVsc2UgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgICAgdmFyIHhfID0gK2Z4KGQgPSBkYXRhW2ldLCBpKSwgeV8gPSArZnkoZCwgaSk7CiAgICAgICAgICBpZiAoeF8gPCB4MV8pIHgxXyA9IHhfOwogICAgICAgICAgaWYgKHlfIDwgeTFfKSB5MV8gPSB5XzsKICAgICAgICAgIGlmICh4XyA+IHgyXykgeDJfID0geF87CiAgICAgICAgICBpZiAoeV8gPiB5Ml8pIHkyXyA9IHlfOwogICAgICAgICAgeHMucHVzaCh4Xyk7CiAgICAgICAgICB5cy5wdXNoKHlfKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdmFyIGR4ID0geDJfIC0geDFfLCBkeSA9IHkyXyAtIHkxXzsKICAgICAgaWYgKGR4ID4gZHkpIHkyXyA9IHkxXyArIGR4OyBlbHNlIHgyXyA9IHgxXyArIGR5OwogICAgICBmdW5jdGlvbiBpbnNlcnQobiwgZCwgeCwgeSwgeDEsIHkxLCB4MiwgeTIpIHsKICAgICAgICBpZiAoaXNOYU4oeCkgfHwgaXNOYU4oeSkpIHJldHVybjsKICAgICAgICBpZiAobi5sZWFmKSB7CiAgICAgICAgICB2YXIgbnggPSBuLngsIG55ID0gbi55OwogICAgICAgICAgaWYgKG54ICE9IG51bGwpIHsKICAgICAgICAgICAgaWYgKE1hdGguYWJzKG54IC0geCkgKyBNYXRoLmFicyhueSAtIHkpIDwgLjAxKSB7CiAgICAgICAgICAgICAgaW5zZXJ0Q2hpbGQobiwgZCwgeCwgeSwgeDEsIHkxLCB4MiwgeTIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHZhciBuUG9pbnQgPSBuLnBvaW50OwogICAgICAgICAgICAgIG4ueCA9IG4ueSA9IG4ucG9pbnQgPSBudWxsOwogICAgICAgICAgICAgIGluc2VydENoaWxkKG4sIG5Qb2ludCwgbngsIG55LCB4MSwgeTEsIHgyLCB5Mik7CiAgICAgICAgICAgICAgaW5zZXJ0Q2hpbGQobiwgZCwgeCwgeSwgeDEsIHkxLCB4MiwgeTIpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBuLnggPSB4LCBuLnkgPSB5LCBuLnBvaW50ID0gZDsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgaW5zZXJ0Q2hpbGQobiwgZCwgeCwgeSwgeDEsIHkxLCB4MiwgeTIpOwogICAgICAgIH0KICAgICAgfQogICAgICBmdW5jdGlvbiBpbnNlcnRDaGlsZChuLCBkLCB4LCB5LCB4MSwgeTEsIHgyLCB5MikgewogICAgICAgIHZhciBzeCA9ICh4MSArIHgyKSAqIC41LCBzeSA9ICh5MSArIHkyKSAqIC41LCByaWdodCA9IHggPj0gc3gsIGJvdHRvbSA9IHkgPj0gc3ksIGkgPSAoYm90dG9tIDw8IDEpICsgcmlnaHQ7CiAgICAgICAgbi5sZWFmID0gZmFsc2U7CiAgICAgICAgbiA9IG4ubm9kZXNbaV0gfHwgKG4ubm9kZXNbaV0gPSBkM19nZW9tX3F1YWR0cmVlTm9kZSgpKTsKICAgICAgICBpZiAocmlnaHQpIHgxID0gc3g7IGVsc2UgeDIgPSBzeDsKICAgICAgICBpZiAoYm90dG9tKSB5MSA9IHN5OyBlbHNlIHkyID0gc3k7CiAgICAgICAgaW5zZXJ0KG4sIGQsIHgsIHksIHgxLCB5MSwgeDIsIHkyKTsKICAgICAgfQogICAgICB2YXIgcm9vdCA9IGQzX2dlb21fcXVhZHRyZWVOb2RlKCk7CiAgICAgIHJvb3QuYWRkID0gZnVuY3Rpb24oZCkgewogICAgICAgIGluc2VydChyb290LCBkLCArZngoZCwgKytpKSwgK2Z5KGQsIGkpLCB4MV8sIHkxXywgeDJfLCB5Ml8pOwogICAgICB9OwogICAgICByb290LnZpc2l0ID0gZnVuY3Rpb24oZikgewogICAgICAgIGQzX2dlb21fcXVhZHRyZWVWaXNpdChmLCByb290LCB4MV8sIHkxXywgeDJfLCB5Ml8pOwogICAgICB9OwogICAgICBpID0gLTE7CiAgICAgIGlmICh4MSA9PSBudWxsKSB7CiAgICAgICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgICAgIGluc2VydChyb290LCBkYXRhW2ldLCB4c1tpXSwgeXNbaV0sIHgxXywgeTFfLCB4Ml8sIHkyXyk7CiAgICAgICAgfQogICAgICAgIC0taTsKICAgICAgfSBlbHNlIGRhdGEuZm9yRWFjaChyb290LmFkZCk7CiAgICAgIHhzID0geXMgPSBkYXRhID0gZCA9IG51bGw7CiAgICAgIHJldHVybiByb290OwogICAgfQogICAgcXVhZHRyZWUueCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeCA9IF8sIHF1YWR0cmVlKSA6IHg7CiAgICB9OwogICAgcXVhZHRyZWUueSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeSA9IF8sIHF1YWR0cmVlKSA6IHk7CiAgICB9OwogICAgcXVhZHRyZWUuc2l6ZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4geDEgPT0gbnVsbCA/IG51bGwgOiBbIHgyLCB5MiBdOwogICAgICBpZiAoXyA9PSBudWxsKSB7CiAgICAgICAgeDEgPSB5MSA9IHgyID0geTIgPSBudWxsOwogICAgICB9IGVsc2UgewogICAgICAgIHgxID0geTEgPSAwOwogICAgICAgIHgyID0gK19bMF0sIHkyID0gK19bMV07CiAgICAgIH0KICAgICAgcmV0dXJuIHF1YWR0cmVlOwogICAgfTsKICAgIHJldHVybiBxdWFkdHJlZTsKICB9OwogIGZ1bmN0aW9uIGQzX2dlb21fcXVhZHRyZWVDb21wYXRYKGQpIHsKICAgIHJldHVybiBkLng7CiAgfQogIGZ1bmN0aW9uIGQzX2dlb21fcXVhZHRyZWVDb21wYXRZKGQpIHsKICAgIHJldHVybiBkLnk7CiAgfQogIGZ1bmN0aW9uIGQzX2dlb21fcXVhZHRyZWVOb2RlKCkgewogICAgcmV0dXJuIHsKICAgICAgbGVhZjogdHJ1ZSwKICAgICAgbm9kZXM6IFtdLAogICAgICBwb2ludDogbnVsbCwKICAgICAgeDogbnVsbCwKICAgICAgeTogbnVsbAogICAgfTsKICB9CiAgZnVuY3Rpb24gZDNfZ2VvbV9xdWFkdHJlZVZpc2l0KGYsIG5vZGUsIHgxLCB5MSwgeDIsIHkyKSB7CiAgICBpZiAoIWYobm9kZSwgeDEsIHkxLCB4MiwgeTIpKSB7CiAgICAgIHZhciBzeCA9ICh4MSArIHgyKSAqIC41LCBzeSA9ICh5MSArIHkyKSAqIC41LCBjaGlsZHJlbiA9IG5vZGUubm9kZXM7CiAgICAgIGlmIChjaGlsZHJlblswXSkgZDNfZ2VvbV9xdWFkdHJlZVZpc2l0KGYsIGNoaWxkcmVuWzBdLCB4MSwgeTEsIHN4LCBzeSk7CiAgICAgIGlmIChjaGlsZHJlblsxXSkgZDNfZ2VvbV9xdWFkdHJlZVZpc2l0KGYsIGNoaWxkcmVuWzFdLCBzeCwgeTEsIHgyLCBzeSk7CiAgICAgIGlmIChjaGlsZHJlblsyXSkgZDNfZ2VvbV9xdWFkdHJlZVZpc2l0KGYsIGNoaWxkcmVuWzJdLCB4MSwgc3ksIHN4LCB5Mik7CiAgICAgIGlmIChjaGlsZHJlblszXSkgZDNfZ2VvbV9xdWFkdHJlZVZpc2l0KGYsIGNoaWxkcmVuWzNdLCBzeCwgc3ksIHgyLCB5Mik7CiAgICB9CiAgfQogIGQzLmludGVycG9sYXRlUmdiID0gZDNfaW50ZXJwb2xhdGVSZ2I7CiAgZnVuY3Rpb24gZDNfaW50ZXJwb2xhdGVSZ2IoYSwgYikgewogICAgYSA9IGQzLnJnYihhKTsKICAgIGIgPSBkMy5yZ2IoYik7CiAgICB2YXIgYXIgPSBhLnIsIGFnID0gYS5nLCBhYiA9IGEuYiwgYnIgPSBiLnIgLSBhciwgYmcgPSBiLmcgLSBhZywgYmIgPSBiLmIgLSBhYjsKICAgIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICAgIHJldHVybiAiIyIgKyBkM19yZ2JfaGV4KE1hdGgucm91bmQoYXIgKyBiciAqIHQpKSArIGQzX3JnYl9oZXgoTWF0aC5yb3VuZChhZyArIGJnICogdCkpICsgZDNfcmdiX2hleChNYXRoLnJvdW5kKGFiICsgYmIgKiB0KSk7CiAgICB9OwogIH0KICBkMy50cmFuc2Zvcm0gPSBmdW5jdGlvbihzdHJpbmcpIHsKICAgIHZhciBnID0gZDNfZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGQzLm5zLnByZWZpeC5zdmcsICJnIik7CiAgICByZXR1cm4gKGQzLnRyYW5zZm9ybSA9IGZ1bmN0aW9uKHN0cmluZykgewogICAgICBpZiAoc3RyaW5nICE9IG51bGwpIHsKICAgICAgICBnLnNldEF0dHJpYnV0ZSgidHJhbnNmb3JtIiwgc3RyaW5nKTsKICAgICAgICB2YXIgdCA9IGcudHJhbnNmb3JtLmJhc2VWYWwuY29uc29saWRhdGUoKTsKICAgICAgfQogICAgICByZXR1cm4gbmV3IGQzX3RyYW5zZm9ybSh0ID8gdC5tYXRyaXggOiBkM190cmFuc2Zvcm1JZGVudGl0eSk7CiAgICB9KShzdHJpbmcpOwogIH07CiAgZnVuY3Rpb24gZDNfdHJhbnNmb3JtKG0pIHsKICAgIHZhciByMCA9IFsgbS5hLCBtLmIgXSwgcjEgPSBbIG0uYywgbS5kIF0sIGt4ID0gZDNfdHJhbnNmb3JtTm9ybWFsaXplKHIwKSwga3ogPSBkM190cmFuc2Zvcm1Eb3QocjAsIHIxKSwga3kgPSBkM190cmFuc2Zvcm1Ob3JtYWxpemUoZDNfdHJhbnNmb3JtQ29tYmluZShyMSwgcjAsIC1reikpIHx8IDA7CiAgICBpZiAocjBbMF0gKiByMVsxXSA8IHIxWzBdICogcjBbMV0pIHsKICAgICAgcjBbMF0gKj0gLTE7CiAgICAgIHIwWzFdICo9IC0xOwogICAgICBreCAqPSAtMTsKICAgICAga3ogKj0gLTE7CiAgICB9CiAgICB0aGlzLnJvdGF0ZSA9IChreCA/IE1hdGguYXRhbjIocjBbMV0sIHIwWzBdKSA6IE1hdGguYXRhbjIoLXIxWzBdLCByMVsxXSkpICogZDNfZGVncmVlczsKICAgIHRoaXMudHJhbnNsYXRlID0gWyBtLmUsIG0uZiBdOwogICAgdGhpcy5zY2FsZSA9IFsga3gsIGt5IF07CiAgICB0aGlzLnNrZXcgPSBreSA/IE1hdGguYXRhbjIoa3osIGt5KSAqIGQzX2RlZ3JlZXMgOiAwOwogIH0KICBkM190cmFuc2Zvcm0ucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gInRyYW5zbGF0ZSgiICsgdGhpcy50cmFuc2xhdGUgKyAiKXJvdGF0ZSgiICsgdGhpcy5yb3RhdGUgKyAiKXNrZXdYKCIgKyB0aGlzLnNrZXcgKyAiKXNjYWxlKCIgKyB0aGlzLnNjYWxlICsgIikiOwogIH07CiAgZnVuY3Rpb24gZDNfdHJhbnNmb3JtRG90KGEsIGIpIHsKICAgIHJldHVybiBhWzBdICogYlswXSArIGFbMV0gKiBiWzFdOwogIH0KICBmdW5jdGlvbiBkM190cmFuc2Zvcm1Ob3JtYWxpemUoYSkgewogICAgdmFyIGsgPSBNYXRoLnNxcnQoZDNfdHJhbnNmb3JtRG90KGEsIGEpKTsKICAgIGlmIChrKSB7CiAgICAgIGFbMF0gLz0gazsKICAgICAgYVsxXSAvPSBrOwogICAgfQogICAgcmV0dXJuIGs7CiAgfQogIGZ1bmN0aW9uIGQzX3RyYW5zZm9ybUNvbWJpbmUoYSwgYiwgaykgewogICAgYVswXSArPSBrICogYlswXTsKICAgIGFbMV0gKz0gayAqIGJbMV07CiAgICByZXR1cm4gYTsKICB9CiAgdmFyIGQzX3RyYW5zZm9ybUlkZW50aXR5ID0gewogICAgYTogMSwKICAgIGI6IDAsCiAgICBjOiAwLAogICAgZDogMSwKICAgIGU6IDAsCiAgICBmOiAwCiAgfTsKICBkMy5pbnRlcnBvbGF0ZU51bWJlciA9IGQzX2ludGVycG9sYXRlTnVtYmVyOwogIGZ1bmN0aW9uIGQzX2ludGVycG9sYXRlTnVtYmVyKGEsIGIpIHsKICAgIGIgLT0gYSA9ICthOwogICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKICAgICAgcmV0dXJuIGEgKyBiICogdDsKICAgIH07CiAgfQogIGQzLmludGVycG9sYXRlVHJhbnNmb3JtID0gZDNfaW50ZXJwb2xhdGVUcmFuc2Zvcm07CiAgZnVuY3Rpb24gZDNfaW50ZXJwb2xhdGVUcmFuc2Zvcm0oYSwgYikgewogICAgdmFyIHMgPSBbXSwgcSA9IFtdLCBuLCBBID0gZDMudHJhbnNmb3JtKGEpLCBCID0gZDMudHJhbnNmb3JtKGIpLCB0YSA9IEEudHJhbnNsYXRlLCB0YiA9IEIudHJhbnNsYXRlLCByYSA9IEEucm90YXRlLCByYiA9IEIucm90YXRlLCB3YSA9IEEuc2tldywgd2IgPSBCLnNrZXcsIGthID0gQS5zY2FsZSwga2IgPSBCLnNjYWxlOwogICAgaWYgKHRhWzBdICE9IHRiWzBdIHx8IHRhWzFdICE9IHRiWzFdKSB7CiAgICAgIHMucHVzaCgidHJhbnNsYXRlKCIsIG51bGwsICIsIiwgbnVsbCwgIikiKTsKICAgICAgcS5wdXNoKHsKICAgICAgICBpOiAxLAogICAgICAgIHg6IGQzX2ludGVycG9sYXRlTnVtYmVyKHRhWzBdLCB0YlswXSkKICAgICAgfSwgewogICAgICAgIGk6IDMsCiAgICAgICAgeDogZDNfaW50ZXJwb2xhdGVOdW1iZXIodGFbMV0sIHRiWzFdKQogICAgICB9KTsKICAgIH0gZWxzZSBpZiAodGJbMF0gfHwgdGJbMV0pIHsKICAgICAgcy5wdXNoKCJ0cmFuc2xhdGUoIiArIHRiICsgIikiKTsKICAgIH0gZWxzZSB7CiAgICAgIHMucHVzaCgiIik7CiAgICB9CiAgICBpZiAocmEgIT0gcmIpIHsKICAgICAgaWYgKHJhIC0gcmIgPiAxODApIHJiICs9IDM2MDsgZWxzZSBpZiAocmIgLSByYSA+IDE4MCkgcmEgKz0gMzYwOwogICAgICBxLnB1c2goewogICAgICAgIGk6IHMucHVzaChzLnBvcCgpICsgInJvdGF0ZSgiLCBudWxsLCAiKSIpIC0gMiwKICAgICAgICB4OiBkM19pbnRlcnBvbGF0ZU51bWJlcihyYSwgcmIpCiAgICAgIH0pOwogICAgfSBlbHNlIGlmIChyYikgewogICAgICBzLnB1c2gocy5wb3AoKSArICJyb3RhdGUoIiArIHJiICsgIikiKTsKICAgIH0KICAgIGlmICh3YSAhPSB3YikgewogICAgICBxLnB1c2goewogICAgICAgIGk6IHMucHVzaChzLnBvcCgpICsgInNrZXdYKCIsIG51bGwsICIpIikgLSAyLAogICAgICAgIHg6IGQzX2ludGVycG9sYXRlTnVtYmVyKHdhLCB3YikKICAgICAgfSk7CiAgICB9IGVsc2UgaWYgKHdiKSB7CiAgICAgIHMucHVzaChzLnBvcCgpICsgInNrZXdYKCIgKyB3YiArICIpIik7CiAgICB9CiAgICBpZiAoa2FbMF0gIT0ga2JbMF0gfHwga2FbMV0gIT0ga2JbMV0pIHsKICAgICAgbiA9IHMucHVzaChzLnBvcCgpICsgInNjYWxlKCIsIG51bGwsICIsIiwgbnVsbCwgIikiKTsKICAgICAgcS5wdXNoKHsKICAgICAgICBpOiBuIC0gNCwKICAgICAgICB4OiBkM19pbnRlcnBvbGF0ZU51bWJlcihrYVswXSwga2JbMF0pCiAgICAgIH0sIHsKICAgICAgICBpOiBuIC0gMiwKICAgICAgICB4OiBkM19pbnRlcnBvbGF0ZU51bWJlcihrYVsxXSwga2JbMV0pCiAgICAgIH0pOwogICAgfSBlbHNlIGlmIChrYlswXSAhPSAxIHx8IGtiWzFdICE9IDEpIHsKICAgICAgcy5wdXNoKHMucG9wKCkgKyAic2NhbGUoIiArIGtiICsgIikiKTsKICAgIH0KICAgIG4gPSBxLmxlbmd0aDsKICAgIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICAgIHZhciBpID0gLTEsIG87CiAgICAgIHdoaWxlICgrK2kgPCBuKSBzWyhvID0gcVtpXSkuaV0gPSBvLngodCk7CiAgICAgIHJldHVybiBzLmpvaW4oIiIpOwogICAgfTsKICB9CiAgZDMuaW50ZXJwb2xhdGVPYmplY3QgPSBkM19pbnRlcnBvbGF0ZU9iamVjdDsKICBmdW5jdGlvbiBkM19pbnRlcnBvbGF0ZU9iamVjdChhLCBiKSB7CiAgICB2YXIgaSA9IHt9LCBjID0ge30sIGs7CiAgICBmb3IgKGsgaW4gYSkgewogICAgICBpZiAoayBpbiBiKSB7CiAgICAgICAgaVtrXSA9IGQzX2ludGVycG9sYXRlQnlOYW1lKGspKGFba10sIGJba10pOwogICAgICB9IGVsc2UgewogICAgICAgIGNba10gPSBhW2tdOwogICAgICB9CiAgICB9CiAgICBmb3IgKGsgaW4gYikgewogICAgICBpZiAoIShrIGluIGEpKSB7CiAgICAgICAgY1trXSA9IGJba107CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICAgIGZvciAoayBpbiBpKSBjW2tdID0gaVtrXSh0KTsKICAgICAgcmV0dXJuIGM7CiAgICB9OwogIH0KICBkMy5pbnRlcnBvbGF0ZVN0cmluZyA9IGQzX2ludGVycG9sYXRlU3RyaW5nOwogIGZ1bmN0aW9uIGQzX2ludGVycG9sYXRlU3RyaW5nKGEsIGIpIHsKICAgIHZhciBtLCBpLCBqLCBzMCA9IDAsIHMxID0gMCwgcyA9IFtdLCBxID0gW10sIG4sIG87CiAgICBhID0gYSArICIiLCBiID0gYiArICIiOwogICAgZDNfaW50ZXJwb2xhdGVfbnVtYmVyLmxhc3RJbmRleCA9IDA7CiAgICBmb3IgKGkgPSAwOyBtID0gZDNfaW50ZXJwb2xhdGVfbnVtYmVyLmV4ZWMoYik7ICsraSkgewogICAgICBpZiAobS5pbmRleCkgcy5wdXNoKGIuc3Vic3RyaW5nKHMwLCBzMSA9IG0uaW5kZXgpKTsKICAgICAgcS5wdXNoKHsKICAgICAgICBpOiBzLmxlbmd0aCwKICAgICAgICB4OiBtWzBdCiAgICAgIH0pOwogICAgICBzLnB1c2gobnVsbCk7CiAgICAgIHMwID0gZDNfaW50ZXJwb2xhdGVfbnVtYmVyLmxhc3RJbmRleDsKICAgIH0KICAgIGlmIChzMCA8IGIubGVuZ3RoKSBzLnB1c2goYi5zdWJzdHJpbmcoczApKTsKICAgIGZvciAoaSA9IDAsIG4gPSBxLmxlbmd0aDsgKG0gPSBkM19pbnRlcnBvbGF0ZV9udW1iZXIuZXhlYyhhKSkgJiYgaSA8IG47ICsraSkgewogICAgICBvID0gcVtpXTsKICAgICAgaWYgKG8ueCA9PSBtWzBdKSB7CiAgICAgICAgaWYgKG8uaSkgewogICAgICAgICAgaWYgKHNbby5pICsgMV0gPT0gbnVsbCkgewogICAgICAgICAgICBzW28uaSAtIDFdICs9IG8ueDsKICAgICAgICAgICAgcy5zcGxpY2Uoby5pLCAxKTsKICAgICAgICAgICAgZm9yIChqID0gaSArIDE7IGogPCBuOyArK2opIHFbal0uaS0tOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc1tvLmkgLSAxXSArPSBvLnggKyBzW28uaSArIDFdOwogICAgICAgICAgICBzLnNwbGljZShvLmksIDIpOwogICAgICAgICAgICBmb3IgKGogPSBpICsgMTsgaiA8IG47ICsraikgcVtqXS5pIC09IDI7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmIChzW28uaSArIDFdID09IG51bGwpIHsKICAgICAgICAgICAgc1tvLmldID0gby54OwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc1tvLmldID0gby54ICsgc1tvLmkgKyAxXTsKICAgICAgICAgICAgcy5zcGxpY2Uoby5pICsgMSwgMSk7CiAgICAgICAgICAgIGZvciAoaiA9IGkgKyAxOyBqIDwgbjsgKytqKSBxW2pdLmktLTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcS5zcGxpY2UoaSwgMSk7CiAgICAgICAgbi0tOwogICAgICAgIGktLTsKICAgICAgfSBlbHNlIHsKICAgICAgICBvLnggPSBkM19pbnRlcnBvbGF0ZU51bWJlcihwYXJzZUZsb2F0KG1bMF0pLCBwYXJzZUZsb2F0KG8ueCkpOwogICAgICB9CiAgICB9CiAgICB3aGlsZSAoaSA8IG4pIHsKICAgICAgbyA9IHEucG9wKCk7CiAgICAgIGlmIChzW28uaSArIDFdID09IG51bGwpIHsKICAgICAgICBzW28uaV0gPSBvLng7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc1tvLmldID0gby54ICsgc1tvLmkgKyAxXTsKICAgICAgICBzLnNwbGljZShvLmkgKyAxLCAxKTsKICAgICAgfQogICAgICBuLS07CiAgICB9CiAgICBpZiAocy5sZW5ndGggPT09IDEpIHsKICAgICAgcmV0dXJuIHNbMF0gPT0gbnVsbCA/IChvID0gcVswXS54LCBmdW5jdGlvbih0KSB7CiAgICAgICAgcmV0dXJuIG8odCkgKyAiIjsKICAgICAgfSkgOiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gYjsKICAgICAgfTsKICAgIH0KICAgIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHNbKG8gPSBxW2ldKS5pXSA9IG8ueCh0KTsKICAgICAgcmV0dXJuIHMuam9pbigiIik7CiAgICB9OwogIH0KICB2YXIgZDNfaW50ZXJwb2xhdGVfbnVtYmVyID0gL1stK10/KD86XGQrXC4/XGQqfFwuP1xkKykoPzpbZUVdWy0rXT9cZCspPy9nOwogIGQzLmludGVycG9sYXRlID0gZDNfaW50ZXJwb2xhdGU7CiAgZnVuY3Rpb24gZDNfaW50ZXJwb2xhdGUoYSwgYikgewogICAgdmFyIGkgPSBkMy5pbnRlcnBvbGF0b3JzLmxlbmd0aCwgZjsKICAgIHdoaWxlICgtLWkgPj0gMCAmJiAhKGYgPSBkMy5pbnRlcnBvbGF0b3JzW2ldKGEsIGIpKSkgOwogICAgcmV0dXJuIGY7CiAgfQogIGZ1bmN0aW9uIGQzX2ludGVycG9sYXRlQnlOYW1lKG5hbWUpIHsKICAgIHJldHVybiBuYW1lID09ICJ0cmFuc2Zvcm0iID8gZDNfaW50ZXJwb2xhdGVUcmFuc2Zvcm0gOiBkM19pbnRlcnBvbGF0ZTsKICB9CiAgZDMuaW50ZXJwb2xhdG9ycyA9IFsgZnVuY3Rpb24oYSwgYikgewogICAgdmFyIHQgPSB0eXBlb2YgYjsKICAgIHJldHVybiAodCA9PT0gInN0cmluZyIgPyBkM19yZ2JfbmFtZXMuaGFzKGIpIHx8IC9eKCN8cmdiXCh8aHNsXCgpLy50ZXN0KGIpID8gZDNfaW50ZXJwb2xhdGVSZ2IgOiBkM19pbnRlcnBvbGF0ZVN0cmluZyA6IGIgaW5zdGFuY2VvZiBkM19Db2xvciA/IGQzX2ludGVycG9sYXRlUmdiIDogdCA9PT0gIm9iamVjdCIgPyBBcnJheS5pc0FycmF5KGIpID8gZDNfaW50ZXJwb2xhdGVBcnJheSA6IGQzX2ludGVycG9sYXRlT2JqZWN0IDogZDNfaW50ZXJwb2xhdGVOdW1iZXIpKGEsIGIpOwogIH0gXTsKICBkMy5pbnRlcnBvbGF0ZUFycmF5ID0gZDNfaW50ZXJwb2xhdGVBcnJheTsKICBmdW5jdGlvbiBkM19pbnRlcnBvbGF0ZUFycmF5KGEsIGIpIHsKICAgIHZhciB4ID0gW10sIGMgPSBbXSwgbmEgPSBhLmxlbmd0aCwgbmIgPSBiLmxlbmd0aCwgbjAgPSBNYXRoLm1pbihhLmxlbmd0aCwgYi5sZW5ndGgpLCBpOwogICAgZm9yIChpID0gMDsgaSA8IG4wOyArK2kpIHgucHVzaChkM19pbnRlcnBvbGF0ZShhW2ldLCBiW2ldKSk7CiAgICBmb3IgKDtpIDwgbmE7ICsraSkgY1tpXSA9IGFbaV07CiAgICBmb3IgKDtpIDwgbmI7ICsraSkgY1tpXSA9IGJbaV07CiAgICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgICBmb3IgKGkgPSAwOyBpIDwgbjA7ICsraSkgY1tpXSA9IHhbaV0odCk7CiAgICAgIHJldHVybiBjOwogICAgfTsKICB9CiAgdmFyIGQzX2Vhc2VfZGVmYXVsdCA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGQzX2lkZW50aXR5OwogIH07CiAgdmFyIGQzX2Vhc2UgPSBkMy5tYXAoewogICAgbGluZWFyOiBkM19lYXNlX2RlZmF1bHQsCiAgICBwb2x5OiBkM19lYXNlX3BvbHksCiAgICBxdWFkOiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGQzX2Vhc2VfcXVhZDsKICAgIH0sCiAgICBjdWJpYzogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBkM19lYXNlX2N1YmljOwogICAgfSwKICAgIHNpbjogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBkM19lYXNlX3NpbjsKICAgIH0sCiAgICBleHA6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gZDNfZWFzZV9leHA7CiAgICB9LAogICAgY2lyY2xlOiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGQzX2Vhc2VfY2lyY2xlOwogICAgfSwKICAgIGVsYXN0aWM6IGQzX2Vhc2VfZWxhc3RpYywKICAgIGJhY2s6IGQzX2Vhc2VfYmFjaywKICAgIGJvdW5jZTogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBkM19lYXNlX2JvdW5jZTsKICAgIH0KICB9KTsKICB2YXIgZDNfZWFzZV9tb2RlID0gZDMubWFwKHsKICAgICJpbiI6IGQzX2lkZW50aXR5LAogICAgb3V0OiBkM19lYXNlX3JldmVyc2UsCiAgICAiaW4tb3V0IjogZDNfZWFzZV9yZWZsZWN0LAogICAgIm91dC1pbiI6IGZ1bmN0aW9uKGYpIHsKICAgICAgcmV0dXJuIGQzX2Vhc2VfcmVmbGVjdChkM19lYXNlX3JldmVyc2UoZikpOwogICAgfQogIH0pOwogIGQzLmVhc2UgPSBmdW5jdGlvbihuYW1lKSB7CiAgICB2YXIgaSA9IG5hbWUuaW5kZXhPZigiLSIpLCB0ID0gaSA+PSAwID8gbmFtZS5zdWJzdHJpbmcoMCwgaSkgOiBuYW1lLCBtID0gaSA+PSAwID8gbmFtZS5zdWJzdHJpbmcoaSArIDEpIDogImluIjsKICAgIHQgPSBkM19lYXNlLmdldCh0KSB8fCBkM19lYXNlX2RlZmF1bHQ7CiAgICBtID0gZDNfZWFzZV9tb2RlLmdldChtKSB8fCBkM19pZGVudGl0eTsKICAgIHJldHVybiBkM19lYXNlX2NsYW1wKG0odC5hcHBseShudWxsLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKSkpOwogIH07CiAgZnVuY3Rpb24gZDNfZWFzZV9jbGFtcChmKSB7CiAgICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgICByZXR1cm4gdCA8PSAwID8gMCA6IHQgPj0gMSA/IDEgOiBmKHQpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gZDNfZWFzZV9yZXZlcnNlKGYpIHsKICAgIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICAgIHJldHVybiAxIC0gZigxIC0gdCk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBkM19lYXNlX3JlZmxlY3QoZikgewogICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKICAgICAgcmV0dXJuIC41ICogKHQgPCAuNSA/IGYoMiAqIHQpIDogMiAtIGYoMiAtIDIgKiB0KSk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBkM19lYXNlX3F1YWQodCkgewogICAgcmV0dXJuIHQgKiB0OwogIH0KICBmdW5jdGlvbiBkM19lYXNlX2N1YmljKHQpIHsKICAgIHJldHVybiB0ICogdCAqIHQ7CiAgfQogIGZ1bmN0aW9uIGQzX2Vhc2VfY3ViaWNJbk91dCh0KSB7CiAgICBpZiAodCA8PSAwKSByZXR1cm4gMDsKICAgIGlmICh0ID49IDEpIHJldHVybiAxOwogICAgdmFyIHQyID0gdCAqIHQsIHQzID0gdDIgKiB0OwogICAgcmV0dXJuIDQgKiAodCA8IC41ID8gdDMgOiAzICogKHQgLSB0MikgKyB0MyAtIC43NSk7CiAgfQogIGZ1bmN0aW9uIGQzX2Vhc2VfcG9seShlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgICByZXR1cm4gTWF0aC5wb3codCwgZSk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBkM19lYXNlX3Npbih0KSB7CiAgICByZXR1cm4gMSAtIE1hdGguY29zKHQgKiDPgCAvIDIpOwogIH0KICBmdW5jdGlvbiBkM19lYXNlX2V4cCh0KSB7CiAgICByZXR1cm4gTWF0aC5wb3coMiwgMTAgKiAodCAtIDEpKTsKICB9CiAgZnVuY3Rpb24gZDNfZWFzZV9jaXJjbGUodCkgewogICAgcmV0dXJuIDEgLSBNYXRoLnNxcnQoMSAtIHQgKiB0KTsKICB9CiAgZnVuY3Rpb24gZDNfZWFzZV9lbGFzdGljKGEsIHApIHsKICAgIHZhciBzOwogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSBwID0gLjQ1OwogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGgpIHMgPSBwIC8gKDIgKiDPgCkgKiBNYXRoLmFzaW4oMSAvIGEpOyBlbHNlIGEgPSAxLCBzID0gcCAvIDQ7CiAgICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgICByZXR1cm4gMSArIGEgKiBNYXRoLnBvdygyLCAxMCAqIC10KSAqIE1hdGguc2luKCh0IC0gcykgKiAyICogz4AgLyBwKTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIGQzX2Vhc2VfYmFjayhzKSB7CiAgICBpZiAoIXMpIHMgPSAxLjcwMTU4OwogICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKICAgICAgcmV0dXJuIHQgKiB0ICogKChzICsgMSkgKiB0IC0gcyk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBkM19lYXNlX2JvdW5jZSh0KSB7CiAgICByZXR1cm4gdCA8IDEgLyAyLjc1ID8gNy41NjI1ICogdCAqIHQgOiB0IDwgMiAvIDIuNzUgPyA3LjU2MjUgKiAodCAtPSAxLjUgLyAyLjc1KSAqIHQgKyAuNzUgOiB0IDwgMi41IC8gMi43NSA/IDcuNTYyNSAqICh0IC09IDIuMjUgLyAyLjc1KSAqIHQgKyAuOTM3NSA6IDcuNTYyNSAqICh0IC09IDIuNjI1IC8gMi43NSkgKiB0ICsgLjk4NDM3NTsKICB9CiAgZDMuaW50ZXJwb2xhdGVIY2wgPSBkM19pbnRlcnBvbGF0ZUhjbDsKICBmdW5jdGlvbiBkM19pbnRlcnBvbGF0ZUhjbChhLCBiKSB7CiAgICBhID0gZDMuaGNsKGEpOwogICAgYiA9IGQzLmhjbChiKTsKICAgIHZhciBhaCA9IGEuaCwgYWMgPSBhLmMsIGFsID0gYS5sLCBiaCA9IGIuaCAtIGFoLCBiYyA9IGIuYyAtIGFjLCBibCA9IGIubCAtIGFsOwogICAgaWYgKGlzTmFOKGJjKSkgYmMgPSAwLCBhYyA9IGlzTmFOKGFjKSA/IGIuYyA6IGFjOwogICAgaWYgKGlzTmFOKGJoKSkgYmggPSAwLCBhaCA9IGlzTmFOKGFoKSA/IGIuaCA6IGFoOyBlbHNlIGlmIChiaCA+IDE4MCkgYmggLT0gMzYwOyBlbHNlIGlmIChiaCA8IC0xODApIGJoICs9IDM2MDsKICAgIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICAgIHJldHVybiBkM19oY2xfbGFiKGFoICsgYmggKiB0LCBhYyArIGJjICogdCwgYWwgKyBibCAqIHQpICsgIiI7CiAgICB9OwogIH0KICBkMy5pbnRlcnBvbGF0ZUhzbCA9IGQzX2ludGVycG9sYXRlSHNsOwogIGZ1bmN0aW9uIGQzX2ludGVycG9sYXRlSHNsKGEsIGIpIHsKICAgIGEgPSBkMy5oc2woYSk7CiAgICBiID0gZDMuaHNsKGIpOwogICAgdmFyIGFoID0gYS5oLCBhcyA9IGEucywgYWwgPSBhLmwsIGJoID0gYi5oIC0gYWgsIGJzID0gYi5zIC0gYXMsIGJsID0gYi5sIC0gYWw7CiAgICBpZiAoaXNOYU4oYnMpKSBicyA9IDAsIGFzID0gaXNOYU4oYXMpID8gYi5zIDogYXM7CiAgICBpZiAoaXNOYU4oYmgpKSBiaCA9IDAsIGFoID0gaXNOYU4oYWgpID8gYi5oIDogYWg7IGVsc2UgaWYgKGJoID4gMTgwKSBiaCAtPSAzNjA7IGVsc2UgaWYgKGJoIDwgLTE4MCkgYmggKz0gMzYwOwogICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKICAgICAgcmV0dXJuIGQzX2hzbF9yZ2IoYWggKyBiaCAqIHQsIGFzICsgYnMgKiB0LCBhbCArIGJsICogdCkgKyAiIjsKICAgIH07CiAgfQogIGQzLmludGVycG9sYXRlTGFiID0gZDNfaW50ZXJwb2xhdGVMYWI7CiAgZnVuY3Rpb24gZDNfaW50ZXJwb2xhdGVMYWIoYSwgYikgewogICAgYSA9IGQzLmxhYihhKTsKICAgIGIgPSBkMy5sYWIoYik7CiAgICB2YXIgYWwgPSBhLmwsIGFhID0gYS5hLCBhYiA9IGEuYiwgYmwgPSBiLmwgLSBhbCwgYmEgPSBiLmEgLSBhYSwgYmIgPSBiLmIgLSBhYjsKICAgIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICAgIHJldHVybiBkM19sYWJfcmdiKGFsICsgYmwgKiB0LCBhYSArIGJhICogdCwgYWIgKyBiYiAqIHQpICsgIiI7CiAgICB9OwogIH0KICBkMy5pbnRlcnBvbGF0ZVJvdW5kID0gZDNfaW50ZXJwb2xhdGVSb3VuZDsKICBmdW5jdGlvbiBkM19pbnRlcnBvbGF0ZVJvdW5kKGEsIGIpIHsKICAgIGIgLT0gYTsKICAgIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICAgIHJldHVybiBNYXRoLnJvdW5kKGEgKyBiICogdCk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBkM191bmludGVycG9sYXRlTnVtYmVyKGEsIGIpIHsKICAgIGIgPSBiIC0gKGEgPSArYSkgPyAxIC8gKGIgLSBhKSA6IDA7CiAgICByZXR1cm4gZnVuY3Rpb24oeCkgewogICAgICByZXR1cm4gKHggLSBhKSAqIGI7CiAgICB9OwogIH0KICBmdW5jdGlvbiBkM191bmludGVycG9sYXRlQ2xhbXAoYSwgYikgewogICAgYiA9IGIgLSAoYSA9ICthKSA/IDEgLyAoYiAtIGEpIDogMDsKICAgIHJldHVybiBmdW5jdGlvbih4KSB7CiAgICAgIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCAoeCAtIGEpICogYikpOwogICAgfTsKICB9CiAgZDMubGF5b3V0ID0ge307CiAgZDMubGF5b3V0LmJ1bmRsZSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGZ1bmN0aW9uKGxpbmtzKSB7CiAgICAgIHZhciBwYXRocyA9IFtdLCBpID0gLTEsIG4gPSBsaW5rcy5sZW5ndGg7CiAgICAgIHdoaWxlICgrK2kgPCBuKSBwYXRocy5wdXNoKGQzX2xheW91dF9idW5kbGVQYXRoKGxpbmtzW2ldKSk7CiAgICAgIHJldHVybiBwYXRoczsKICAgIH07CiAgfTsKICBmdW5jdGlvbiBkM19sYXlvdXRfYnVuZGxlUGF0aChsaW5rKSB7CiAgICB2YXIgc3RhcnQgPSBsaW5rLnNvdXJjZSwgZW5kID0gbGluay50YXJnZXQsIGxjYSA9IGQzX2xheW91dF9idW5kbGVMZWFzdENvbW1vbkFuY2VzdG9yKHN0YXJ0LCBlbmQpLCBwb2ludHMgPSBbIHN0YXJ0IF07CiAgICB3aGlsZSAoc3RhcnQgIT09IGxjYSkgewogICAgICBzdGFydCA9IHN0YXJ0LnBhcmVudDsKICAgICAgcG9pbnRzLnB1c2goc3RhcnQpOwogICAgfQogICAgdmFyIGsgPSBwb2ludHMubGVuZ3RoOwogICAgd2hpbGUgKGVuZCAhPT0gbGNhKSB7CiAgICAgIHBvaW50cy5zcGxpY2UoaywgMCwgZW5kKTsKICAgICAgZW5kID0gZW5kLnBhcmVudDsKICAgIH0KICAgIHJldHVybiBwb2ludHM7CiAgfQogIGZ1bmN0aW9uIGQzX2xheW91dF9idW5kbGVBbmNlc3RvcnMobm9kZSkgewogICAgdmFyIGFuY2VzdG9ycyA9IFtdLCBwYXJlbnQgPSBub2RlLnBhcmVudDsKICAgIHdoaWxlIChwYXJlbnQgIT0gbnVsbCkgewogICAgICBhbmNlc3RvcnMucHVzaChub2RlKTsKICAgICAgbm9kZSA9IHBhcmVudDsKICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudDsKICAgIH0KICAgIGFuY2VzdG9ycy5wdXNoKG5vZGUpOwogICAgcmV0dXJuIGFuY2VzdG9yczsKICB9CiAgZnVuY3Rpb24gZDNfbGF5b3V0X2J1bmRsZUxlYXN0Q29tbW9uQW5jZXN0b3IoYSwgYikgewogICAgaWYgKGEgPT09IGIpIHJldHVybiBhOwogICAgdmFyIGFOb2RlcyA9IGQzX2xheW91dF9idW5kbGVBbmNlc3RvcnMoYSksIGJOb2RlcyA9IGQzX2xheW91dF9idW5kbGVBbmNlc3RvcnMoYiksIGFOb2RlID0gYU5vZGVzLnBvcCgpLCBiTm9kZSA9IGJOb2Rlcy5wb3AoKSwgc2hhcmVkTm9kZSA9IG51bGw7CiAgICB3aGlsZSAoYU5vZGUgPT09IGJOb2RlKSB7CiAgICAgIHNoYXJlZE5vZGUgPSBhTm9kZTsKICAgICAgYU5vZGUgPSBhTm9kZXMucG9wKCk7CiAgICAgIGJOb2RlID0gYk5vZGVzLnBvcCgpOwogICAgfQogICAgcmV0dXJuIHNoYXJlZE5vZGU7CiAgfQogIGQzLmxheW91dC5jaG9yZCA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGNob3JkID0ge30sIGNob3JkcywgZ3JvdXBzLCBtYXRyaXgsIG4sIHBhZGRpbmcgPSAwLCBzb3J0R3JvdXBzLCBzb3J0U3ViZ3JvdXBzLCBzb3J0Q2hvcmRzOwogICAgZnVuY3Rpb24gcmVsYXlvdXQoKSB7CiAgICAgIHZhciBzdWJncm91cHMgPSB7fSwgZ3JvdXBTdW1zID0gW10sIGdyb3VwSW5kZXggPSBkMy5yYW5nZShuKSwgc3ViZ3JvdXBJbmRleCA9IFtdLCBrLCB4LCB4MCwgaSwgajsKICAgICAgY2hvcmRzID0gW107CiAgICAgIGdyb3VwcyA9IFtdOwogICAgICBrID0gMCwgaSA9IC0xOwogICAgICB3aGlsZSAoKytpIDwgbikgewogICAgICAgIHggPSAwLCBqID0gLTE7CiAgICAgICAgd2hpbGUgKCsraiA8IG4pIHsKICAgICAgICAgIHggKz0gbWF0cml4W2ldW2pdOwogICAgICAgIH0KICAgICAgICBncm91cFN1bXMucHVzaCh4KTsKICAgICAgICBzdWJncm91cEluZGV4LnB1c2goZDMucmFuZ2UobikpOwogICAgICAgIGsgKz0geDsKICAgICAgfQogICAgICBpZiAoc29ydEdyb3VwcykgewogICAgICAgIGdyb3VwSW5kZXguc29ydChmdW5jdGlvbihhLCBiKSB7CiAgICAgICAgICByZXR1cm4gc29ydEdyb3Vwcyhncm91cFN1bXNbYV0sIGdyb3VwU3Vtc1tiXSk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgaWYgKHNvcnRTdWJncm91cHMpIHsKICAgICAgICBzdWJncm91cEluZGV4LmZvckVhY2goZnVuY3Rpb24oZCwgaSkgewogICAgICAgICAgZC5zb3J0KGZ1bmN0aW9uKGEsIGIpIHsKICAgICAgICAgICAgcmV0dXJuIHNvcnRTdWJncm91cHMobWF0cml4W2ldW2FdLCBtYXRyaXhbaV1bYl0pOwogICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgayA9ICgyICogz4AgLSBwYWRkaW5nICogbikgLyBrOwogICAgICB4ID0gMCwgaSA9IC0xOwogICAgICB3aGlsZSAoKytpIDwgbikgewogICAgICAgIHgwID0geCwgaiA9IC0xOwogICAgICAgIHdoaWxlICgrK2ogPCBuKSB7CiAgICAgICAgICB2YXIgZGkgPSBncm91cEluZGV4W2ldLCBkaiA9IHN1Ymdyb3VwSW5kZXhbZGldW2pdLCB2ID0gbWF0cml4W2RpXVtkal0sIGEwID0geCwgYTEgPSB4ICs9IHYgKiBrOwogICAgICAgICAgc3ViZ3JvdXBzW2RpICsgIi0iICsgZGpdID0gewogICAgICAgICAgICBpbmRleDogZGksCiAgICAgICAgICAgIHN1YmluZGV4OiBkaiwKICAgICAgICAgICAgc3RhcnRBbmdsZTogYTAsCiAgICAgICAgICAgIGVuZEFuZ2xlOiBhMSwKICAgICAgICAgICAgdmFsdWU6IHYKICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGdyb3Vwc1tkaV0gPSB7CiAgICAgICAgICBpbmRleDogZGksCiAgICAgICAgICBzdGFydEFuZ2xlOiB4MCwKICAgICAgICAgIGVuZEFuZ2xlOiB4LAogICAgICAgICAgdmFsdWU6ICh4IC0geDApIC8gawogICAgICAgIH07CiAgICAgICAgeCArPSBwYWRkaW5nOwogICAgICB9CiAgICAgIGkgPSAtMTsKICAgICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgICBqID0gaSAtIDE7CiAgICAgICAgd2hpbGUgKCsraiA8IG4pIHsKICAgICAgICAgIHZhciBzb3VyY2UgPSBzdWJncm91cHNbaSArICItIiArIGpdLCB0YXJnZXQgPSBzdWJncm91cHNbaiArICItIiArIGldOwogICAgICAgICAgaWYgKHNvdXJjZS52YWx1ZSB8fCB0YXJnZXQudmFsdWUpIHsKICAgICAgICAgICAgY2hvcmRzLnB1c2goc291cmNlLnZhbHVlIDwgdGFyZ2V0LnZhbHVlID8gewogICAgICAgICAgICAgIHNvdXJjZTogdGFyZ2V0LAogICAgICAgICAgICAgIHRhcmdldDogc291cmNlCiAgICAgICAgICAgIH0gOiB7CiAgICAgICAgICAgICAgc291cmNlOiBzb3VyY2UsCiAgICAgICAgICAgICAgdGFyZ2V0OiB0YXJnZXQKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChzb3J0Q2hvcmRzKSByZXNvcnQoKTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlc29ydCgpIHsKICAgICAgY2hvcmRzLnNvcnQoZnVuY3Rpb24oYSwgYikgewogICAgICAgIHJldHVybiBzb3J0Q2hvcmRzKChhLnNvdXJjZS52YWx1ZSArIGEudGFyZ2V0LnZhbHVlKSAvIDIsIChiLnNvdXJjZS52YWx1ZSArIGIudGFyZ2V0LnZhbHVlKSAvIDIpOwogICAgICB9KTsKICAgIH0KICAgIGNob3JkLm1hdHJpeCA9IGZ1bmN0aW9uKHgpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbWF0cml4OwogICAgICBuID0gKG1hdHJpeCA9IHgpICYmIG1hdHJpeC5sZW5ndGg7CiAgICAgIGNob3JkcyA9IGdyb3VwcyA9IG51bGw7CiAgICAgIHJldHVybiBjaG9yZDsKICAgIH07CiAgICBjaG9yZC5wYWRkaW5nID0gZnVuY3Rpb24oeCkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBwYWRkaW5nOwogICAgICBwYWRkaW5nID0geDsKICAgICAgY2hvcmRzID0gZ3JvdXBzID0gbnVsbDsKICAgICAgcmV0dXJuIGNob3JkOwogICAgfTsKICAgIGNob3JkLnNvcnRHcm91cHMgPSBmdW5jdGlvbih4KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNvcnRHcm91cHM7CiAgICAgIHNvcnRHcm91cHMgPSB4OwogICAgICBjaG9yZHMgPSBncm91cHMgPSBudWxsOwogICAgICByZXR1cm4gY2hvcmQ7CiAgICB9OwogICAgY2hvcmQuc29ydFN1Ymdyb3VwcyA9IGZ1bmN0aW9uKHgpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc29ydFN1Ymdyb3VwczsKICAgICAgc29ydFN1Ymdyb3VwcyA9IHg7CiAgICAgIGNob3JkcyA9IG51bGw7CiAgICAgIHJldHVybiBjaG9yZDsKICAgIH07CiAgICBjaG9yZC5zb3J0Q2hvcmRzID0gZnVuY3Rpb24oeCkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzb3J0Q2hvcmRzOwogICAgICBzb3J0Q2hvcmRzID0geDsKICAgICAgaWYgKGNob3JkcykgcmVzb3J0KCk7CiAgICAgIHJldHVybiBjaG9yZDsKICAgIH07CiAgICBjaG9yZC5jaG9yZHMgPSBmdW5jdGlvbigpIHsKICAgICAgaWYgKCFjaG9yZHMpIHJlbGF5b3V0KCk7CiAgICAgIHJldHVybiBjaG9yZHM7CiAgICB9OwogICAgY2hvcmQuZ3JvdXBzID0gZnVuY3Rpb24oKSB7CiAgICAgIGlmICghZ3JvdXBzKSByZWxheW91dCgpOwogICAgICByZXR1cm4gZ3JvdXBzOwogICAgfTsKICAgIHJldHVybiBjaG9yZDsKICB9OwogIGQzLmxheW91dC5mb3JjZSA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGZvcmNlID0ge30sIGV2ZW50ID0gZDMuZGlzcGF0Y2goInN0YXJ0IiwgInRpY2siLCAiZW5kIiksIHNpemUgPSBbIDEsIDEgXSwgZHJhZywgYWxwaGEsIGZyaWN0aW9uID0gLjksIGxpbmtEaXN0YW5jZSA9IGQzX2xheW91dF9mb3JjZUxpbmtEaXN0YW5jZSwgbGlua1N0cmVuZ3RoID0gZDNfbGF5b3V0X2ZvcmNlTGlua1N0cmVuZ3RoLCBjaGFyZ2UgPSAtMzAsIGdyYXZpdHkgPSAuMSwgdGhldGEgPSAuOCwgbm9kZXMgPSBbXSwgbGlua3MgPSBbXSwgZGlzdGFuY2VzLCBzdHJlbmd0aHMsIGNoYXJnZXM7CiAgICBmdW5jdGlvbiByZXB1bHNlKG5vZGUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHF1YWQsIHgxLCBfLCB4MikgewogICAgICAgIGlmIChxdWFkLnBvaW50ICE9PSBub2RlKSB7CiAgICAgICAgICB2YXIgZHggPSBxdWFkLmN4IC0gbm9kZS54LCBkeSA9IHF1YWQuY3kgLSBub2RlLnksIGRuID0gMSAvIE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSk7CiAgICAgICAgICBpZiAoKHgyIC0geDEpICogZG4gPCB0aGV0YSkgewogICAgICAgICAgICB2YXIgayA9IHF1YWQuY2hhcmdlICogZG4gKiBkbjsKICAgICAgICAgICAgbm9kZS5weCAtPSBkeCAqIGs7CiAgICAgICAgICAgIG5vZGUucHkgLT0gZHkgKiBrOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChxdWFkLnBvaW50ICYmIGlzRmluaXRlKGRuKSkgewogICAgICAgICAgICB2YXIgayA9IHF1YWQucG9pbnRDaGFyZ2UgKiBkbiAqIGRuOwogICAgICAgICAgICBub2RlLnB4IC09IGR4ICogazsKICAgICAgICAgICAgbm9kZS5weSAtPSBkeSAqIGs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAhcXVhZC5jaGFyZ2U7CiAgICAgIH07CiAgICB9CiAgICBmb3JjZS50aWNrID0gZnVuY3Rpb24oKSB7CiAgICAgIGlmICgoYWxwaGEgKj0gLjk5KSA8IC4wMDUpIHsKICAgICAgICBldmVudC5lbmQoewogICAgICAgICAgdHlwZTogImVuZCIsCiAgICAgICAgICBhbHBoYTogYWxwaGEgPSAwCiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgdmFyIG4gPSBub2Rlcy5sZW5ndGgsIG0gPSBsaW5rcy5sZW5ndGgsIHEsIGksIG8sIHMsIHQsIGwsIGssIHgsIHk7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHsKICAgICAgICBvID0gbGlua3NbaV07CiAgICAgICAgcyA9IG8uc291cmNlOwogICAgICAgIHQgPSBvLnRhcmdldDsKICAgICAgICB4ID0gdC54IC0gcy54OwogICAgICAgIHkgPSB0LnkgLSBzLnk7CiAgICAgICAgaWYgKGwgPSB4ICogeCArIHkgKiB5KSB7CiAgICAgICAgICBsID0gYWxwaGEgKiBzdHJlbmd0aHNbaV0gKiAoKGwgPSBNYXRoLnNxcnQobCkpIC0gZGlzdGFuY2VzW2ldKSAvIGw7CiAgICAgICAgICB4ICo9IGw7CiAgICAgICAgICB5ICo9IGw7CiAgICAgICAgICB0LnggLT0geCAqIChrID0gcy53ZWlnaHQgLyAodC53ZWlnaHQgKyBzLndlaWdodCkpOwogICAgICAgICAgdC55IC09IHkgKiBrOwogICAgICAgICAgcy54ICs9IHggKiAoayA9IDEgLSBrKTsKICAgICAgICAgIHMueSArPSB5ICogazsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGsgPSBhbHBoYSAqIGdyYXZpdHkpIHsKICAgICAgICB4ID0gc2l6ZVswXSAvIDI7CiAgICAgICAgeSA9IHNpemVbMV0gLyAyOwogICAgICAgIGkgPSAtMTsKICAgICAgICBpZiAoaykgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgICAgIG8gPSBub2Rlc1tpXTsKICAgICAgICAgIG8ueCArPSAoeCAtIG8ueCkgKiBrOwogICAgICAgICAgby55ICs9ICh5IC0gby55KSAqIGs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChjaGFyZ2UpIHsKICAgICAgICBkM19sYXlvdXRfZm9yY2VBY2N1bXVsYXRlKHEgPSBkMy5nZW9tLnF1YWR0cmVlKG5vZGVzKSwgYWxwaGEsIGNoYXJnZXMpOwogICAgICAgIGkgPSAtMTsKICAgICAgICB3aGlsZSAoKytpIDwgbikgewogICAgICAgICAgaWYgKCEobyA9IG5vZGVzW2ldKS5maXhlZCkgewogICAgICAgICAgICBxLnZpc2l0KHJlcHVsc2UobykpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBpID0gLTE7CiAgICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgICAgbyA9IG5vZGVzW2ldOwogICAgICAgIGlmIChvLmZpeGVkKSB7CiAgICAgICAgICBvLnggPSBvLnB4OwogICAgICAgICAgby55ID0gby5weTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgby54IC09IChvLnB4IC0gKG8ucHggPSBvLngpKSAqIGZyaWN0aW9uOwogICAgICAgICAgby55IC09IChvLnB5IC0gKG8ucHkgPSBvLnkpKSAqIGZyaWN0aW9uOwogICAgICAgIH0KICAgICAgfQogICAgICBldmVudC50aWNrKHsKICAgICAgICB0eXBlOiAidGljayIsCiAgICAgICAgYWxwaGE6IGFscGhhCiAgICAgIH0pOwogICAgfTsKICAgIGZvcmNlLm5vZGVzID0gZnVuY3Rpb24oeCkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBub2RlczsKICAgICAgbm9kZXMgPSB4OwogICAgICByZXR1cm4gZm9yY2U7CiAgICB9OwogICAgZm9yY2UubGlua3MgPSBmdW5jdGlvbih4KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGxpbmtzOwogICAgICBsaW5rcyA9IHg7CiAgICAgIHJldHVybiBmb3JjZTsKICAgIH07CiAgICBmb3JjZS5zaXplID0gZnVuY3Rpb24oeCkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzaXplOwogICAgICBzaXplID0geDsKICAgICAgcmV0dXJuIGZvcmNlOwogICAgfTsKICAgIGZvcmNlLmxpbmtEaXN0YW5jZSA9IGZ1bmN0aW9uKHgpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbGlua0Rpc3RhbmNlOwogICAgICBsaW5rRGlzdGFuY2UgPSB0eXBlb2YgeCA9PT0gImZ1bmN0aW9uIiA/IHggOiAreDsKICAgICAgcmV0dXJuIGZvcmNlOwogICAgfTsKICAgIGZvcmNlLmRpc3RhbmNlID0gZm9yY2UubGlua0Rpc3RhbmNlOwogICAgZm9yY2UubGlua1N0cmVuZ3RoID0gZnVuY3Rpb24oeCkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBsaW5rU3RyZW5ndGg7CiAgICAgIGxpbmtTdHJlbmd0aCA9IHR5cGVvZiB4ID09PSAiZnVuY3Rpb24iID8geCA6ICt4OwogICAgICByZXR1cm4gZm9yY2U7CiAgICB9OwogICAgZm9yY2UuZnJpY3Rpb24gPSBmdW5jdGlvbih4KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGZyaWN0aW9uOwogICAgICBmcmljdGlvbiA9ICt4OwogICAgICByZXR1cm4gZm9yY2U7CiAgICB9OwogICAgZm9yY2UuY2hhcmdlID0gZnVuY3Rpb24oeCkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBjaGFyZ2U7CiAgICAgIGNoYXJnZSA9IHR5cGVvZiB4ID09PSAiZnVuY3Rpb24iID8geCA6ICt4OwogICAgICByZXR1cm4gZm9yY2U7CiAgICB9OwogICAgZm9yY2UuZ3Jhdml0eSA9IGZ1bmN0aW9uKHgpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZ3Jhdml0eTsKICAgICAgZ3Jhdml0eSA9ICt4OwogICAgICByZXR1cm4gZm9yY2U7CiAgICB9OwogICAgZm9yY2UudGhldGEgPSBmdW5jdGlvbih4KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRoZXRhOwogICAgICB0aGV0YSA9ICt4OwogICAgICByZXR1cm4gZm9yY2U7CiAgICB9OwogICAgZm9yY2UuYWxwaGEgPSBmdW5jdGlvbih4KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGFscGhhOwogICAgICB4ID0gK3g7CiAgICAgIGlmIChhbHBoYSkgewogICAgICAgIGlmICh4ID4gMCkgYWxwaGEgPSB4OyBlbHNlIGFscGhhID0gMDsKICAgICAgfSBlbHNlIGlmICh4ID4gMCkgewogICAgICAgIGV2ZW50LnN0YXJ0KHsKICAgICAgICAgIHR5cGU6ICJzdGFydCIsCiAgICAgICAgICBhbHBoYTogYWxwaGEgPSB4CiAgICAgICAgfSk7CiAgICAgICAgZDMudGltZXIoZm9yY2UudGljayk7CiAgICAgIH0KICAgICAgcmV0dXJuIGZvcmNlOwogICAgfTsKICAgIGZvcmNlLnN0YXJ0ID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBpLCBqLCBuID0gbm9kZXMubGVuZ3RoLCBtID0gbGlua3MubGVuZ3RoLCB3ID0gc2l6ZVswXSwgaCA9IHNpemVbMV0sIG5laWdoYm9ycywgbzsKICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgIChvID0gbm9kZXNbaV0pLmluZGV4ID0gaTsKICAgICAgICBvLndlaWdodCA9IDA7CiAgICAgIH0KICAgICAgZm9yIChpID0gMDsgaSA8IG07ICsraSkgewogICAgICAgIG8gPSBsaW5rc1tpXTsKICAgICAgICBpZiAodHlwZW9mIG8uc291cmNlID09ICJudW1iZXIiKSBvLnNvdXJjZSA9IG5vZGVzW28uc291cmNlXTsKICAgICAgICBpZiAodHlwZW9mIG8udGFyZ2V0ID09ICJudW1iZXIiKSBvLnRhcmdldCA9IG5vZGVzW28udGFyZ2V0XTsKICAgICAgICArK28uc291cmNlLndlaWdodDsKICAgICAgICArK28udGFyZ2V0LndlaWdodDsKICAgICAgfQogICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgbyA9IG5vZGVzW2ldOwogICAgICAgIGlmIChpc05hTihvLngpKSBvLnggPSBwb3NpdGlvbigieCIsIHcpOwogICAgICAgIGlmIChpc05hTihvLnkpKSBvLnkgPSBwb3NpdGlvbigieSIsIGgpOwogICAgICAgIGlmIChpc05hTihvLnB4KSkgby5weCA9IG8ueDsKICAgICAgICBpZiAoaXNOYU4oby5weSkpIG8ucHkgPSBvLnk7CiAgICAgIH0KICAgICAgZGlzdGFuY2VzID0gW107CiAgICAgIGlmICh0eXBlb2YgbGlua0Rpc3RhbmNlID09PSAiZnVuY3Rpb24iKSBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSBkaXN0YW5jZXNbaV0gPSArbGlua0Rpc3RhbmNlLmNhbGwodGhpcywgbGlua3NbaV0sIGkpOyBlbHNlIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIGRpc3RhbmNlc1tpXSA9IGxpbmtEaXN0YW5jZTsKICAgICAgc3RyZW5ndGhzID0gW107CiAgICAgIGlmICh0eXBlb2YgbGlua1N0cmVuZ3RoID09PSAiZnVuY3Rpb24iKSBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSBzdHJlbmd0aHNbaV0gPSArbGlua1N0cmVuZ3RoLmNhbGwodGhpcywgbGlua3NbaV0sIGkpOyBlbHNlIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHN0cmVuZ3Roc1tpXSA9IGxpbmtTdHJlbmd0aDsKICAgICAgY2hhcmdlcyA9IFtdOwogICAgICBpZiAodHlwZW9mIGNoYXJnZSA9PT0gImZ1bmN0aW9uIikgZm9yIChpID0gMDsgaSA8IG47ICsraSkgY2hhcmdlc1tpXSA9ICtjaGFyZ2UuY2FsbCh0aGlzLCBub2Rlc1tpXSwgaSk7IGVsc2UgZm9yIChpID0gMDsgaSA8IG47ICsraSkgY2hhcmdlc1tpXSA9IGNoYXJnZTsKICAgICAgZnVuY3Rpb24gcG9zaXRpb24oZGltZW5zaW9uLCBzaXplKSB7CiAgICAgICAgdmFyIG5laWdoYm9ycyA9IG5laWdoYm9yKGkpLCBqID0gLTEsIG0gPSBuZWlnaGJvcnMubGVuZ3RoLCB4OwogICAgICAgIHdoaWxlICgrK2ogPCBtKSBpZiAoIWlzTmFOKHggPSBuZWlnaGJvcnNbal1bZGltZW5zaW9uXSkpIHJldHVybiB4OwogICAgICAgIHJldHVybiBNYXRoLnJhbmRvbSgpICogc2l6ZTsKICAgICAgfQogICAgICBmdW5jdGlvbiBuZWlnaGJvcigpIHsKICAgICAgICBpZiAoIW5laWdoYm9ycykgewogICAgICAgICAgbmVpZ2hib3JzID0gW107CiAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbjsgKytqKSB7CiAgICAgICAgICAgIG5laWdoYm9yc1tqXSA9IFtdOwogICAgICAgICAgfQogICAgICAgICAgZm9yIChqID0gMDsgaiA8IG07ICsraikgewogICAgICAgICAgICB2YXIgbyA9IGxpbmtzW2pdOwogICAgICAgICAgICBuZWlnaGJvcnNbby5zb3VyY2UuaW5kZXhdLnB1c2goby50YXJnZXQpOwogICAgICAgICAgICBuZWlnaGJvcnNbby50YXJnZXQuaW5kZXhdLnB1c2goby5zb3VyY2UpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gbmVpZ2hib3JzW2ldOwogICAgICB9CiAgICAgIHJldHVybiBmb3JjZS5yZXN1bWUoKTsKICAgIH07CiAgICBmb3JjZS5yZXN1bWUgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGZvcmNlLmFscGhhKC4xKTsKICAgIH07CiAgICBmb3JjZS5zdG9wID0gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBmb3JjZS5hbHBoYSgwKTsKICAgIH07CiAgICBmb3JjZS5kcmFnID0gZnVuY3Rpb24oKSB7CiAgICAgIGlmICghZHJhZykgZHJhZyA9IGQzLmJlaGF2aW9yLmRyYWcoKS5vcmlnaW4oZDNfaWRlbnRpdHkpLm9uKCJkcmFnc3RhcnQuZm9yY2UiLCBkM19sYXlvdXRfZm9yY2VEcmFnc3RhcnQpLm9uKCJkcmFnLmZvcmNlIiwgZHJhZ21vdmUpLm9uKCJkcmFnZW5kLmZvcmNlIiwgZDNfbGF5b3V0X2ZvcmNlRHJhZ2VuZCk7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGRyYWc7CiAgICAgIHRoaXMub24oIm1vdXNlb3Zlci5mb3JjZSIsIGQzX2xheW91dF9mb3JjZU1vdXNlb3Zlcikub24oIm1vdXNlb3V0LmZvcmNlIiwgZDNfbGF5b3V0X2ZvcmNlTW91c2VvdXQpLmNhbGwoZHJhZyk7CiAgICB9OwogICAgZnVuY3Rpb24gZHJhZ21vdmUoZCkgewogICAgICBkLnB4ID0gZDMuZXZlbnQueCwgZC5weSA9IGQzLmV2ZW50Lnk7CiAgICAgIGZvcmNlLnJlc3VtZSgpOwogICAgfQogICAgcmV0dXJuIGQzLnJlYmluZChmb3JjZSwgZXZlbnQsICJvbiIpOwogIH07CiAgZnVuY3Rpb24gZDNfbGF5b3V0X2ZvcmNlRHJhZ3N0YXJ0KGQpIHsKICAgIGQuZml4ZWQgfD0gMjsKICB9CiAgZnVuY3Rpb24gZDNfbGF5b3V0X2ZvcmNlRHJhZ2VuZChkKSB7CiAgICBkLmZpeGVkICY9IH42OwogIH0KICBmdW5jdGlvbiBkM19sYXlvdXRfZm9yY2VNb3VzZW92ZXIoZCkgewogICAgZC5maXhlZCB8PSA0OwogICAgZC5weCA9IGQueCwgZC5weSA9IGQueTsKICB9CiAgZnVuY3Rpb24gZDNfbGF5b3V0X2ZvcmNlTW91c2VvdXQoZCkgewogICAgZC5maXhlZCAmPSB+NDsKICB9CiAgZnVuY3Rpb24gZDNfbGF5b3V0X2ZvcmNlQWNjdW11bGF0ZShxdWFkLCBhbHBoYSwgY2hhcmdlcykgewogICAgdmFyIGN4ID0gMCwgY3kgPSAwOwogICAgcXVhZC5jaGFyZ2UgPSAwOwogICAgaWYgKCFxdWFkLmxlYWYpIHsKICAgICAgdmFyIG5vZGVzID0gcXVhZC5ub2RlcywgbiA9IG5vZGVzLmxlbmd0aCwgaSA9IC0xLCBjOwogICAgICB3aGlsZSAoKytpIDwgbikgewogICAgICAgIGMgPSBub2Rlc1tpXTsKICAgICAgICBpZiAoYyA9PSBudWxsKSBjb250aW51ZTsKICAgICAgICBkM19sYXlvdXRfZm9yY2VBY2N1bXVsYXRlKGMsIGFscGhhLCBjaGFyZ2VzKTsKICAgICAgICBxdWFkLmNoYXJnZSArPSBjLmNoYXJnZTsKICAgICAgICBjeCArPSBjLmNoYXJnZSAqIGMuY3g7CiAgICAgICAgY3kgKz0gYy5jaGFyZ2UgKiBjLmN5OwogICAgICB9CiAgICB9CiAgICBpZiAocXVhZC5wb2ludCkgewogICAgICBpZiAoIXF1YWQubGVhZikgewogICAgICAgIHF1YWQucG9pbnQueCArPSBNYXRoLnJhbmRvbSgpIC0gLjU7CiAgICAgICAgcXVhZC5wb2ludC55ICs9IE1hdGgucmFuZG9tKCkgLSAuNTsKICAgICAgfQogICAgICB2YXIgayA9IGFscGhhICogY2hhcmdlc1txdWFkLnBvaW50LmluZGV4XTsKICAgICAgcXVhZC5jaGFyZ2UgKz0gcXVhZC5wb2ludENoYXJnZSA9IGs7CiAgICAgIGN4ICs9IGsgKiBxdWFkLnBvaW50Lng7CiAgICAgIGN5ICs9IGsgKiBxdWFkLnBvaW50Lnk7CiAgICB9CiAgICBxdWFkLmN4ID0gY3ggLyBxdWFkLmNoYXJnZTsKICAgIHF1YWQuY3kgPSBjeSAvIHF1YWQuY2hhcmdlOwogIH0KICB2YXIgZDNfbGF5b3V0X2ZvcmNlTGlua0Rpc3RhbmNlID0gMjAsIGQzX2xheW91dF9mb3JjZUxpbmtTdHJlbmd0aCA9IDE7CiAgZDMubGF5b3V0LmhpZXJhcmNoeSA9IGZ1bmN0aW9uKCkgewogICAgdmFyIHNvcnQgPSBkM19sYXlvdXRfaGllcmFyY2h5U29ydCwgY2hpbGRyZW4gPSBkM19sYXlvdXRfaGllcmFyY2h5Q2hpbGRyZW4sIHZhbHVlID0gZDNfbGF5b3V0X2hpZXJhcmNoeVZhbHVlOwogICAgZnVuY3Rpb24gcmVjdXJzZShub2RlLCBkZXB0aCwgbm9kZXMpIHsKICAgICAgdmFyIGNoaWxkcyA9IGNoaWxkcmVuLmNhbGwoaGllcmFyY2h5LCBub2RlLCBkZXB0aCk7CiAgICAgIG5vZGUuZGVwdGggPSBkZXB0aDsKICAgICAgbm9kZXMucHVzaChub2RlKTsKICAgICAgaWYgKGNoaWxkcyAmJiAobiA9IGNoaWxkcy5sZW5ndGgpKSB7CiAgICAgICAgdmFyIGkgPSAtMSwgbiwgYyA9IG5vZGUuY2hpbGRyZW4gPSBbXSwgdiA9IDAsIGogPSBkZXB0aCArIDEsIGQ7CiAgICAgICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgICAgIGQgPSByZWN1cnNlKGNoaWxkc1tpXSwgaiwgbm9kZXMpOwogICAgICAgICAgZC5wYXJlbnQgPSBub2RlOwogICAgICAgICAgYy5wdXNoKGQpOwogICAgICAgICAgdiArPSBkLnZhbHVlOwogICAgICAgIH0KICAgICAgICBpZiAoc29ydCkgYy5zb3J0KHNvcnQpOwogICAgICAgIGlmICh2YWx1ZSkgbm9kZS52YWx1ZSA9IHY7CiAgICAgIH0gZWxzZSBpZiAodmFsdWUpIHsKICAgICAgICBub2RlLnZhbHVlID0gK3ZhbHVlLmNhbGwoaGllcmFyY2h5LCBub2RlLCBkZXB0aCkgfHwgMDsKICAgICAgfQogICAgICByZXR1cm4gbm9kZTsKICAgIH0KICAgIGZ1bmN0aW9uIHJldmFsdWUobm9kZSwgZGVwdGgpIHsKICAgICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbiwgdiA9IDA7CiAgICAgIGlmIChjaGlsZHJlbiAmJiAobiA9IGNoaWxkcmVuLmxlbmd0aCkpIHsKICAgICAgICB2YXIgaSA9IC0xLCBuLCBqID0gZGVwdGggKyAxOwogICAgICAgIHdoaWxlICgrK2kgPCBuKSB2ICs9IHJldmFsdWUoY2hpbGRyZW5baV0sIGopOwogICAgICB9IGVsc2UgaWYgKHZhbHVlKSB7CiAgICAgICAgdiA9ICt2YWx1ZS5jYWxsKGhpZXJhcmNoeSwgbm9kZSwgZGVwdGgpIHx8IDA7CiAgICAgIH0KICAgICAgaWYgKHZhbHVlKSBub2RlLnZhbHVlID0gdjsKICAgICAgcmV0dXJuIHY7CiAgICB9CiAgICBmdW5jdGlvbiBoaWVyYXJjaHkoZCkgewogICAgICB2YXIgbm9kZXMgPSBbXTsKICAgICAgcmVjdXJzZShkLCAwLCBub2Rlcyk7CiAgICAgIHJldHVybiBub2RlczsKICAgIH0KICAgIGhpZXJhcmNoeS5zb3J0ID0gZnVuY3Rpb24oeCkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzb3J0OwogICAgICBzb3J0ID0geDsKICAgICAgcmV0dXJuIGhpZXJhcmNoeTsKICAgIH07CiAgICBoaWVyYXJjaHkuY2hpbGRyZW4gPSBmdW5jdGlvbih4KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGNoaWxkcmVuOwogICAgICBjaGlsZHJlbiA9IHg7CiAgICAgIHJldHVybiBoaWVyYXJjaHk7CiAgICB9OwogICAgaGllcmFyY2h5LnZhbHVlID0gZnVuY3Rpb24oeCkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB2YWx1ZTsKICAgICAgdmFsdWUgPSB4OwogICAgICByZXR1cm4gaGllcmFyY2h5OwogICAgfTsKICAgIGhpZXJhcmNoeS5yZXZhbHVlID0gZnVuY3Rpb24ocm9vdCkgewogICAgICByZXZhbHVlKHJvb3QsIDApOwogICAgICByZXR1cm4gcm9vdDsKICAgIH07CiAgICByZXR1cm4gaGllcmFyY2h5OwogIH07CiAgZnVuY3Rpb24gZDNfbGF5b3V0X2hpZXJhcmNoeVJlYmluZChvYmplY3QsIGhpZXJhcmNoeSkgewogICAgZDMucmViaW5kKG9iamVjdCwgaGllcmFyY2h5LCAic29ydCIsICJjaGlsZHJlbiIsICJ2YWx1ZSIpOwogICAgb2JqZWN0Lm5vZGVzID0gb2JqZWN0OwogICAgb2JqZWN0LmxpbmtzID0gZDNfbGF5b3V0X2hpZXJhcmNoeUxpbmtzOwogICAgcmV0dXJuIG9iamVjdDsKICB9CiAgZnVuY3Rpb24gZDNfbGF5b3V0X2hpZXJhcmNoeUNoaWxkcmVuKGQpIHsKICAgIHJldHVybiBkLmNoaWxkcmVuOwogIH0KICBmdW5jdGlvbiBkM19sYXlvdXRfaGllcmFyY2h5VmFsdWUoZCkgewogICAgcmV0dXJuIGQudmFsdWU7CiAgfQogIGZ1bmN0aW9uIGQzX2xheW91dF9oaWVyYXJjaHlTb3J0KGEsIGIpIHsKICAgIHJldHVybiBiLnZhbHVlIC0gYS52YWx1ZTsKICB9CiAgZnVuY3Rpb24gZDNfbGF5b3V0X2hpZXJhcmNoeUxpbmtzKG5vZGVzKSB7CiAgICByZXR1cm4gZDMubWVyZ2Uobm9kZXMubWFwKGZ1bmN0aW9uKHBhcmVudCkgewogICAgICByZXR1cm4gKHBhcmVudC5jaGlsZHJlbiB8fCBbXSkubWFwKGZ1bmN0aW9uKGNoaWxkKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHNvdXJjZTogcGFyZW50LAogICAgICAgICAgdGFyZ2V0OiBjaGlsZAogICAgICAgIH07CiAgICAgIH0pOwogICAgfSkpOwogIH0KICBkMy5sYXlvdXQucGFydGl0aW9uID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgaGllcmFyY2h5ID0gZDMubGF5b3V0LmhpZXJhcmNoeSgpLCBzaXplID0gWyAxLCAxIF07CiAgICBmdW5jdGlvbiBwb3NpdGlvbihub2RlLCB4LCBkeCwgZHkpIHsKICAgICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjsKICAgICAgbm9kZS54ID0geDsKICAgICAgbm9kZS55ID0gbm9kZS5kZXB0aCAqIGR5OwogICAgICBub2RlLmR4ID0gZHg7CiAgICAgIG5vZGUuZHkgPSBkeTsKICAgICAgaWYgKGNoaWxkcmVuICYmIChuID0gY2hpbGRyZW4ubGVuZ3RoKSkgewogICAgICAgIHZhciBpID0gLTEsIG4sIGMsIGQ7CiAgICAgICAgZHggPSBub2RlLnZhbHVlID8gZHggLyBub2RlLnZhbHVlIDogMDsKICAgICAgICB3aGlsZSAoKytpIDwgbikgewogICAgICAgICAgcG9zaXRpb24oYyA9IGNoaWxkcmVuW2ldLCB4LCBkID0gYy52YWx1ZSAqIGR4LCBkeSk7CiAgICAgICAgICB4ICs9IGQ7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBkZXB0aChub2RlKSB7CiAgICAgIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4sIGQgPSAwOwogICAgICBpZiAoY2hpbGRyZW4gJiYgKG4gPSBjaGlsZHJlbi5sZW5ndGgpKSB7CiAgICAgICAgdmFyIGkgPSAtMSwgbjsKICAgICAgICB3aGlsZSAoKytpIDwgbikgZCA9IE1hdGgubWF4KGQsIGRlcHRoKGNoaWxkcmVuW2ldKSk7CiAgICAgIH0KICAgICAgcmV0dXJuIDEgKyBkOwogICAgfQogICAgZnVuY3Rpb24gcGFydGl0aW9uKGQsIGkpIHsKICAgICAgdmFyIG5vZGVzID0gaGllcmFyY2h5LmNhbGwodGhpcywgZCwgaSk7CiAgICAgIHBvc2l0aW9uKG5vZGVzWzBdLCAwLCBzaXplWzBdLCBzaXplWzFdIC8gZGVwdGgobm9kZXNbMF0pKTsKICAgICAgcmV0dXJuIG5vZGVzOwogICAgfQogICAgcGFydGl0aW9uLnNpemUgPSBmdW5jdGlvbih4KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNpemU7CiAgICAgIHNpemUgPSB4OwogICAgICByZXR1cm4gcGFydGl0aW9uOwogICAgfTsKICAgIHJldHVybiBkM19sYXlvdXRfaGllcmFyY2h5UmViaW5kKHBhcnRpdGlvbiwgaGllcmFyY2h5KTsKICB9OwogIGQzLmxheW91dC5waWUgPSBmdW5jdGlvbigpIHsKICAgIHZhciB2YWx1ZSA9IE51bWJlciwgc29ydCA9IGQzX2xheW91dF9waWVTb3J0QnlWYWx1ZSwgc3RhcnRBbmdsZSA9IDAsIGVuZEFuZ2xlID0gMiAqIM+AOwogICAgZnVuY3Rpb24gcGllKGRhdGEpIHsKICAgICAgdmFyIHZhbHVlcyA9IGRhdGEubWFwKGZ1bmN0aW9uKGQsIGkpIHsKICAgICAgICByZXR1cm4gK3ZhbHVlLmNhbGwocGllLCBkLCBpKTsKICAgICAgfSk7CiAgICAgIHZhciBhID0gKyh0eXBlb2Ygc3RhcnRBbmdsZSA9PT0gImZ1bmN0aW9uIiA/IHN0YXJ0QW5nbGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHN0YXJ0QW5nbGUpOwogICAgICB2YXIgayA9ICgodHlwZW9mIGVuZEFuZ2xlID09PSAiZnVuY3Rpb24iID8gZW5kQW5nbGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IGVuZEFuZ2xlKSAtIGEpIC8gZDMuc3VtKHZhbHVlcyk7CiAgICAgIHZhciBpbmRleCA9IGQzLnJhbmdlKGRhdGEubGVuZ3RoKTsKICAgICAgaWYgKHNvcnQgIT0gbnVsbCkgaW5kZXguc29ydChzb3J0ID09PSBkM19sYXlvdXRfcGllU29ydEJ5VmFsdWUgPyBmdW5jdGlvbihpLCBqKSB7CiAgICAgICAgcmV0dXJuIHZhbHVlc1tqXSAtIHZhbHVlc1tpXTsKICAgICAgfSA6IGZ1bmN0aW9uKGksIGopIHsKICAgICAgICByZXR1cm4gc29ydChkYXRhW2ldLCBkYXRhW2pdKTsKICAgICAgfSk7CiAgICAgIHZhciBhcmNzID0gW107CiAgICAgIGluZGV4LmZvckVhY2goZnVuY3Rpb24oaSkgewogICAgICAgIHZhciBkOwogICAgICAgIGFyY3NbaV0gPSB7CiAgICAgICAgICBkYXRhOiBkYXRhW2ldLAogICAgICAgICAgdmFsdWU6IGQgPSB2YWx1ZXNbaV0sCiAgICAgICAgICBzdGFydEFuZ2xlOiBhLAogICAgICAgICAgZW5kQW5nbGU6IGEgKz0gZCAqIGsKICAgICAgICB9OwogICAgICB9KTsKICAgICAgcmV0dXJuIGFyY3M7CiAgICB9CiAgICBwaWUudmFsdWUgPSBmdW5jdGlvbih4KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHZhbHVlOwogICAgICB2YWx1ZSA9IHg7CiAgICAgIHJldHVybiBwaWU7CiAgICB9OwogICAgcGllLnNvcnQgPSBmdW5jdGlvbih4KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNvcnQ7CiAgICAgIHNvcnQgPSB4OwogICAgICByZXR1cm4gcGllOwogICAgfTsKICAgIHBpZS5zdGFydEFuZ2xlID0gZnVuY3Rpb24oeCkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzdGFydEFuZ2xlOwogICAgICBzdGFydEFuZ2xlID0geDsKICAgICAgcmV0dXJuIHBpZTsKICAgIH07CiAgICBwaWUuZW5kQW5nbGUgPSBmdW5jdGlvbih4KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGVuZEFuZ2xlOwogICAgICBlbmRBbmdsZSA9IHg7CiAgICAgIHJldHVybiBwaWU7CiAgICB9OwogICAgcmV0dXJuIHBpZTsKICB9OwogIHZhciBkM19sYXlvdXRfcGllU29ydEJ5VmFsdWUgPSB7fTsKICBkMy5sYXlvdXQuc3RhY2sgPSBmdW5jdGlvbigpIHsKICAgIHZhciB2YWx1ZXMgPSBkM19pZGVudGl0eSwgb3JkZXIgPSBkM19sYXlvdXRfc3RhY2tPcmRlckRlZmF1bHQsIG9mZnNldCA9IGQzX2xheW91dF9zdGFja09mZnNldFplcm8sIG91dCA9IGQzX2xheW91dF9zdGFja091dCwgeCA9IGQzX2xheW91dF9zdGFja1gsIHkgPSBkM19sYXlvdXRfc3RhY2tZOwogICAgZnVuY3Rpb24gc3RhY2soZGF0YSwgaW5kZXgpIHsKICAgICAgdmFyIHNlcmllcyA9IGRhdGEubWFwKGZ1bmN0aW9uKGQsIGkpIHsKICAgICAgICByZXR1cm4gdmFsdWVzLmNhbGwoc3RhY2ssIGQsIGkpOwogICAgICB9KTsKICAgICAgdmFyIHBvaW50cyA9IHNlcmllcy5tYXAoZnVuY3Rpb24oZCkgewogICAgICAgIHJldHVybiBkLm1hcChmdW5jdGlvbih2LCBpKSB7CiAgICAgICAgICByZXR1cm4gWyB4LmNhbGwoc3RhY2ssIHYsIGkpLCB5LmNhbGwoc3RhY2ssIHYsIGkpIF07CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgICB2YXIgb3JkZXJzID0gb3JkZXIuY2FsbChzdGFjaywgcG9pbnRzLCBpbmRleCk7CiAgICAgIHNlcmllcyA9IGQzLnBlcm11dGUoc2VyaWVzLCBvcmRlcnMpOwogICAgICBwb2ludHMgPSBkMy5wZXJtdXRlKHBvaW50cywgb3JkZXJzKTsKICAgICAgdmFyIG9mZnNldHMgPSBvZmZzZXQuY2FsbChzdGFjaywgcG9pbnRzLCBpbmRleCk7CiAgICAgIHZhciBuID0gc2VyaWVzLmxlbmd0aCwgbSA9IHNlcmllc1swXS5sZW5ndGgsIGksIGosIG87CiAgICAgIGZvciAoaiA9IDA7IGogPCBtOyArK2opIHsKICAgICAgICBvdXQuY2FsbChzdGFjaywgc2VyaWVzWzBdW2pdLCBvID0gb2Zmc2V0c1tqXSwgcG9pbnRzWzBdW2pdWzFdKTsKICAgICAgICBmb3IgKGkgPSAxOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBvdXQuY2FsbChzdGFjaywgc2VyaWVzW2ldW2pdLCBvICs9IHBvaW50c1tpIC0gMV1bal1bMV0sIHBvaW50c1tpXVtqXVsxXSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBkYXRhOwogICAgfQogICAgc3RhY2sudmFsdWVzID0gZnVuY3Rpb24oeCkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB2YWx1ZXM7CiAgICAgIHZhbHVlcyA9IHg7CiAgICAgIHJldHVybiBzdGFjazsKICAgIH07CiAgICBzdGFjay5vcmRlciA9IGZ1bmN0aW9uKHgpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gb3JkZXI7CiAgICAgIG9yZGVyID0gdHlwZW9mIHggPT09ICJmdW5jdGlvbiIgPyB4IDogZDNfbGF5b3V0X3N0YWNrT3JkZXJzLmdldCh4KSB8fCBkM19sYXlvdXRfc3RhY2tPcmRlckRlZmF1bHQ7CiAgICAgIHJldHVybiBzdGFjazsKICAgIH07CiAgICBzdGFjay5vZmZzZXQgPSBmdW5jdGlvbih4KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIG9mZnNldDsKICAgICAgb2Zmc2V0ID0gdHlwZW9mIHggPT09ICJmdW5jdGlvbiIgPyB4IDogZDNfbGF5b3V0X3N0YWNrT2Zmc2V0cy5nZXQoeCkgfHwgZDNfbGF5b3V0X3N0YWNrT2Zmc2V0WmVybzsKICAgICAgcmV0dXJuIHN0YWNrOwogICAgfTsKICAgIHN0YWNrLnggPSBmdW5jdGlvbih6KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHg7CiAgICAgIHggPSB6OwogICAgICByZXR1cm4gc3RhY2s7CiAgICB9OwogICAgc3RhY2sueSA9IGZ1bmN0aW9uKHopIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4geTsKICAgICAgeSA9IHo7CiAgICAgIHJldHVybiBzdGFjazsKICAgIH07CiAgICBzdGFjay5vdXQgPSBmdW5jdGlvbih6KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIG91dDsKICAgICAgb3V0ID0gejsKICAgICAgcmV0dXJuIHN0YWNrOwogICAgfTsKICAgIHJldHVybiBzdGFjazsKICB9OwogIGZ1bmN0aW9uIGQzX2xheW91dF9zdGFja1goZCkgewogICAgcmV0dXJuIGQueDsKICB9CiAgZnVuY3Rpb24gZDNfbGF5b3V0X3N0YWNrWShkKSB7CiAgICByZXR1cm4gZC55OwogIH0KICBmdW5jdGlvbiBkM19sYXlvdXRfc3RhY2tPdXQoZCwgeTAsIHkpIHsKICAgIGQueTAgPSB5MDsKICAgIGQueSA9IHk7CiAgfQogIHZhciBkM19sYXlvdXRfc3RhY2tPcmRlcnMgPSBkMy5tYXAoewogICAgImluc2lkZS1vdXQiOiBmdW5jdGlvbihkYXRhKSB7CiAgICAgIHZhciBuID0gZGF0YS5sZW5ndGgsIGksIGosIG1heCA9IGRhdGEubWFwKGQzX2xheW91dF9zdGFja01heEluZGV4KSwgc3VtcyA9IGRhdGEubWFwKGQzX2xheW91dF9zdGFja1JlZHVjZVN1bSksIGluZGV4ID0gZDMucmFuZ2Uobikuc29ydChmdW5jdGlvbihhLCBiKSB7CiAgICAgICAgcmV0dXJuIG1heFthXSAtIG1heFtiXTsKICAgICAgfSksIHRvcCA9IDAsIGJvdHRvbSA9IDAsIHRvcHMgPSBbXSwgYm90dG9tcyA9IFtdOwogICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgaiA9IGluZGV4W2ldOwogICAgICAgIGlmICh0b3AgPCBib3R0b20pIHsKICAgICAgICAgIHRvcCArPSBzdW1zW2pdOwogICAgICAgICAgdG9wcy5wdXNoKGopOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBib3R0b20gKz0gc3Vtc1tqXTsKICAgICAgICAgIGJvdHRvbXMucHVzaChqKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGJvdHRvbXMucmV2ZXJzZSgpLmNvbmNhdCh0b3BzKTsKICAgIH0sCiAgICByZXZlcnNlOiBmdW5jdGlvbihkYXRhKSB7CiAgICAgIHJldHVybiBkMy5yYW5nZShkYXRhLmxlbmd0aCkucmV2ZXJzZSgpOwogICAgfSwKICAgICJkZWZhdWx0IjogZDNfbGF5b3V0X3N0YWNrT3JkZXJEZWZhdWx0CiAgfSk7CiAgdmFyIGQzX2xheW91dF9zdGFja09mZnNldHMgPSBkMy5tYXAoewogICAgc2lsaG91ZXR0ZTogZnVuY3Rpb24oZGF0YSkgewogICAgICB2YXIgbiA9IGRhdGEubGVuZ3RoLCBtID0gZGF0YVswXS5sZW5ndGgsIHN1bXMgPSBbXSwgbWF4ID0gMCwgaSwgaiwgbywgeTAgPSBbXTsKICAgICAgZm9yIChqID0gMDsgaiA8IG07ICsraikgewogICAgICAgIGZvciAoaSA9IDAsIG8gPSAwOyBpIDwgbjsgaSsrKSBvICs9IGRhdGFbaV1bal1bMV07CiAgICAgICAgaWYgKG8gPiBtYXgpIG1heCA9IG87CiAgICAgICAgc3Vtcy5wdXNoKG8pOwogICAgICB9CiAgICAgIGZvciAoaiA9IDA7IGogPCBtOyArK2opIHsKICAgICAgICB5MFtqXSA9IChtYXggLSBzdW1zW2pdKSAvIDI7CiAgICAgIH0KICAgICAgcmV0dXJuIHkwOwogICAgfSwKICAgIHdpZ2dsZTogZnVuY3Rpb24oZGF0YSkgewogICAgICB2YXIgbiA9IGRhdGEubGVuZ3RoLCB4ID0gZGF0YVswXSwgbSA9IHgubGVuZ3RoLCBpLCBqLCBrLCBzMSwgczIsIHMzLCBkeCwgbywgbzAsIHkwID0gW107CiAgICAgIHkwWzBdID0gbyA9IG8wID0gMDsKICAgICAgZm9yIChqID0gMTsgaiA8IG07ICsraikgewogICAgICAgIGZvciAoaSA9IDAsIHMxID0gMDsgaSA8IG47ICsraSkgczEgKz0gZGF0YVtpXVtqXVsxXTsKICAgICAgICBmb3IgKGkgPSAwLCBzMiA9IDAsIGR4ID0geFtqXVswXSAtIHhbaiAtIDFdWzBdOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBmb3IgKGsgPSAwLCBzMyA9IChkYXRhW2ldW2pdWzFdIC0gZGF0YVtpXVtqIC0gMV1bMV0pIC8gKDIgKiBkeCk7IGsgPCBpOyArK2spIHsKICAgICAgICAgICAgczMgKz0gKGRhdGFba11bal1bMV0gLSBkYXRhW2tdW2ogLSAxXVsxXSkgLyBkeDsKICAgICAgICAgIH0KICAgICAgICAgIHMyICs9IHMzICogZGF0YVtpXVtqXVsxXTsKICAgICAgICB9CiAgICAgICAgeTBbal0gPSBvIC09IHMxID8gczIgLyBzMSAqIGR4IDogMDsKICAgICAgICBpZiAobyA8IG8wKSBvMCA9IG87CiAgICAgIH0KICAgICAgZm9yIChqID0gMDsgaiA8IG07ICsraikgeTBbal0gLT0gbzA7CiAgICAgIHJldHVybiB5MDsKICAgIH0sCiAgICBleHBhbmQ6IGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgdmFyIG4gPSBkYXRhLmxlbmd0aCwgbSA9IGRhdGFbMF0ubGVuZ3RoLCBrID0gMSAvIG4sIGksIGosIG8sIHkwID0gW107CiAgICAgIGZvciAoaiA9IDA7IGogPCBtOyArK2opIHsKICAgICAgICBmb3IgKGkgPSAwLCBvID0gMDsgaSA8IG47IGkrKykgbyArPSBkYXRhW2ldW2pdWzFdOwogICAgICAgIGlmIChvKSBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSBkYXRhW2ldW2pdWzFdIC89IG87IGVsc2UgZm9yIChpID0gMDsgaSA8IG47IGkrKykgZGF0YVtpXVtqXVsxXSA9IGs7CiAgICAgIH0KICAgICAgZm9yIChqID0gMDsgaiA8IG07ICsraikgeTBbal0gPSAwOwogICAgICByZXR1cm4geTA7CiAgICB9LAogICAgemVybzogZDNfbGF5b3V0X3N0YWNrT2Zmc2V0WmVybwogIH0pOwogIGZ1bmN0aW9uIGQzX2xheW91dF9zdGFja09yZGVyRGVmYXVsdChkYXRhKSB7CiAgICByZXR1cm4gZDMucmFuZ2UoZGF0YS5sZW5ndGgpOwogIH0KICBmdW5jdGlvbiBkM19sYXlvdXRfc3RhY2tPZmZzZXRaZXJvKGRhdGEpIHsKICAgIHZhciBqID0gLTEsIG0gPSBkYXRhWzBdLmxlbmd0aCwgeTAgPSBbXTsKICAgIHdoaWxlICgrK2ogPCBtKSB5MFtqXSA9IDA7CiAgICByZXR1cm4geTA7CiAgfQogIGZ1bmN0aW9uIGQzX2xheW91dF9zdGFja01heEluZGV4KGFycmF5KSB7CiAgICB2YXIgaSA9IDEsIGogPSAwLCB2ID0gYXJyYXlbMF1bMV0sIGssIG4gPSBhcnJheS5sZW5ndGg7CiAgICBmb3IgKDtpIDwgbjsgKytpKSB7CiAgICAgIGlmICgoayA9IGFycmF5W2ldWzFdKSA+IHYpIHsKICAgICAgICBqID0gaTsKICAgICAgICB2ID0gazsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGo7CiAgfQogIGZ1bmN0aW9uIGQzX2xheW91dF9zdGFja1JlZHVjZVN1bShkKSB7CiAgICByZXR1cm4gZC5yZWR1Y2UoZDNfbGF5b3V0X3N0YWNrU3VtLCAwKTsKICB9CiAgZnVuY3Rpb24gZDNfbGF5b3V0X3N0YWNrU3VtKHAsIGQpIHsKICAgIHJldHVybiBwICsgZFsxXTsKICB9CiAgZDMubGF5b3V0Lmhpc3RvZ3JhbSA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGZyZXF1ZW5jeSA9IHRydWUsIHZhbHVlciA9IE51bWJlciwgcmFuZ2VyID0gZDNfbGF5b3V0X2hpc3RvZ3JhbVJhbmdlLCBiaW5uZXIgPSBkM19sYXlvdXRfaGlzdG9ncmFtQmluU3R1cmdlczsKICAgIGZ1bmN0aW9uIGhpc3RvZ3JhbShkYXRhLCBpKSB7CiAgICAgIHZhciBiaW5zID0gW10sIHZhbHVlcyA9IGRhdGEubWFwKHZhbHVlciwgdGhpcyksIHJhbmdlID0gcmFuZ2VyLmNhbGwodGhpcywgdmFsdWVzLCBpKSwgdGhyZXNob2xkcyA9IGJpbm5lci5jYWxsKHRoaXMsIHJhbmdlLCB2YWx1ZXMsIGkpLCBiaW4sIGkgPSAtMSwgbiA9IHZhbHVlcy5sZW5ndGgsIG0gPSB0aHJlc2hvbGRzLmxlbmd0aCAtIDEsIGsgPSBmcmVxdWVuY3kgPyAxIDogMSAvIG4sIHg7CiAgICAgIHdoaWxlICgrK2kgPCBtKSB7CiAgICAgICAgYmluID0gYmluc1tpXSA9IFtdOwogICAgICAgIGJpbi5keCA9IHRocmVzaG9sZHNbaSArIDFdIC0gKGJpbi54ID0gdGhyZXNob2xkc1tpXSk7CiAgICAgICAgYmluLnkgPSAwOwogICAgICB9CiAgICAgIGlmIChtID4gMCkgewogICAgICAgIGkgPSAtMTsKICAgICAgICB3aGlsZSAoKytpIDwgbikgewogICAgICAgICAgeCA9IHZhbHVlc1tpXTsKICAgICAgICAgIGlmICh4ID49IHJhbmdlWzBdICYmIHggPD0gcmFuZ2VbMV0pIHsKICAgICAgICAgICAgYmluID0gYmluc1tkMy5iaXNlY3QodGhyZXNob2xkcywgeCwgMSwgbSkgLSAxXTsKICAgICAgICAgICAgYmluLnkgKz0gazsKICAgICAgICAgICAgYmluLnB1c2goZGF0YVtpXSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBiaW5zOwogICAgfQogICAgaGlzdG9ncmFtLnZhbHVlID0gZnVuY3Rpb24oeCkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB2YWx1ZXI7CiAgICAgIHZhbHVlciA9IHg7CiAgICAgIHJldHVybiBoaXN0b2dyYW07CiAgICB9OwogICAgaGlzdG9ncmFtLnJhbmdlID0gZnVuY3Rpb24oeCkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiByYW5nZXI7CiAgICAgIHJhbmdlciA9IGQzX2Z1bmN0b3IoeCk7CiAgICAgIHJldHVybiBoaXN0b2dyYW07CiAgICB9OwogICAgaGlzdG9ncmFtLmJpbnMgPSBmdW5jdGlvbih4KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGJpbm5lcjsKICAgICAgYmlubmVyID0gdHlwZW9mIHggPT09ICJudW1iZXIiID8gZnVuY3Rpb24ocmFuZ2UpIHsKICAgICAgICByZXR1cm4gZDNfbGF5b3V0X2hpc3RvZ3JhbUJpbkZpeGVkKHJhbmdlLCB4KTsKICAgICAgfSA6IGQzX2Z1bmN0b3IoeCk7CiAgICAgIHJldHVybiBoaXN0b2dyYW07CiAgICB9OwogICAgaGlzdG9ncmFtLmZyZXF1ZW5jeSA9IGZ1bmN0aW9uKHgpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZnJlcXVlbmN5OwogICAgICBmcmVxdWVuY3kgPSAhIXg7CiAgICAgIHJldHVybiBoaXN0b2dyYW07CiAgICB9OwogICAgcmV0dXJuIGhpc3RvZ3JhbTsKICB9OwogIGZ1bmN0aW9uIGQzX2xheW91dF9oaXN0b2dyYW1CaW5TdHVyZ2VzKHJhbmdlLCB2YWx1ZXMpIHsKICAgIHJldHVybiBkM19sYXlvdXRfaGlzdG9ncmFtQmluRml4ZWQocmFuZ2UsIE1hdGguY2VpbChNYXRoLmxvZyh2YWx1ZXMubGVuZ3RoKSAvIE1hdGguTE4yICsgMSkpOwogIH0KICBmdW5jdGlvbiBkM19sYXlvdXRfaGlzdG9ncmFtQmluRml4ZWQocmFuZ2UsIG4pIHsKICAgIHZhciB4ID0gLTEsIGIgPSArcmFuZ2VbMF0sIG0gPSAocmFuZ2VbMV0gLSBiKSAvIG4sIGYgPSBbXTsKICAgIHdoaWxlICgrK3ggPD0gbikgZlt4XSA9IG0gKiB4ICsgYjsKICAgIHJldHVybiBmOwogIH0KICBmdW5jdGlvbiBkM19sYXlvdXRfaGlzdG9ncmFtUmFuZ2UodmFsdWVzKSB7CiAgICByZXR1cm4gWyBkMy5taW4odmFsdWVzKSwgZDMubWF4KHZhbHVlcykgXTsKICB9CiAgZDMubGF5b3V0LnRyZWUgPSBmdW5jdGlvbigpIHsKICAgIHZhciBoaWVyYXJjaHkgPSBkMy5sYXlvdXQuaGllcmFyY2h5KCkuc29ydChudWxsKS52YWx1ZShudWxsKSwgc2VwYXJhdGlvbiA9IGQzX2xheW91dF90cmVlU2VwYXJhdGlvbiwgc2l6ZSA9IFsgMSwgMSBdOwogICAgZnVuY3Rpb24gdHJlZShkLCBpKSB7CiAgICAgIHZhciBub2RlcyA9IGhpZXJhcmNoeS5jYWxsKHRoaXMsIGQsIGkpLCByb290ID0gbm9kZXNbMF07CiAgICAgIGZ1bmN0aW9uIGZpcnN0V2Fsayhub2RlLCBwcmV2aW91c1NpYmxpbmcpIHsKICAgICAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuLCBsYXlvdXQgPSBub2RlLl90cmVlOwogICAgICAgIGlmIChjaGlsZHJlbiAmJiAobiA9IGNoaWxkcmVuLmxlbmd0aCkpIHsKICAgICAgICAgIHZhciBuLCBmaXJzdENoaWxkID0gY2hpbGRyZW5bMF0sIHByZXZpb3VzQ2hpbGQsIGFuY2VzdG9yID0gZmlyc3RDaGlsZCwgY2hpbGQsIGkgPSAtMTsKICAgICAgICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgICAgICAgIGNoaWxkID0gY2hpbGRyZW5baV07CiAgICAgICAgICAgIGZpcnN0V2FsayhjaGlsZCwgcHJldmlvdXNDaGlsZCk7CiAgICAgICAgICAgIGFuY2VzdG9yID0gYXBwb3J0aW9uKGNoaWxkLCBwcmV2aW91c0NoaWxkLCBhbmNlc3Rvcik7CiAgICAgICAgICAgIHByZXZpb3VzQ2hpbGQgPSBjaGlsZDsKICAgICAgICAgIH0KICAgICAgICAgIGQzX2xheW91dF90cmVlU2hpZnQobm9kZSk7CiAgICAgICAgICB2YXIgbWlkcG9pbnQgPSAuNSAqIChmaXJzdENoaWxkLl90cmVlLnByZWxpbSArIGNoaWxkLl90cmVlLnByZWxpbSk7CiAgICAgICAgICBpZiAocHJldmlvdXNTaWJsaW5nKSB7CiAgICAgICAgICAgIGxheW91dC5wcmVsaW0gPSBwcmV2aW91c1NpYmxpbmcuX3RyZWUucHJlbGltICsgc2VwYXJhdGlvbihub2RlLCBwcmV2aW91c1NpYmxpbmcpOwogICAgICAgICAgICBsYXlvdXQubW9kID0gbGF5b3V0LnByZWxpbSAtIG1pZHBvaW50OwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbGF5b3V0LnByZWxpbSA9IG1pZHBvaW50OwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAocHJldmlvdXNTaWJsaW5nKSB7CiAgICAgICAgICAgIGxheW91dC5wcmVsaW0gPSBwcmV2aW91c1NpYmxpbmcuX3RyZWUucHJlbGltICsgc2VwYXJhdGlvbihub2RlLCBwcmV2aW91c1NpYmxpbmcpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBmdW5jdGlvbiBzZWNvbmRXYWxrKG5vZGUsIHgpIHsKICAgICAgICBub2RlLnggPSBub2RlLl90cmVlLnByZWxpbSArIHg7CiAgICAgICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjsKICAgICAgICBpZiAoY2hpbGRyZW4gJiYgKG4gPSBjaGlsZHJlbi5sZW5ndGgpKSB7CiAgICAgICAgICB2YXIgaSA9IC0xLCBuOwogICAgICAgICAgeCArPSBub2RlLl90cmVlLm1vZDsKICAgICAgICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgICAgICAgIHNlY29uZFdhbGsoY2hpbGRyZW5baV0sIHgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBmdW5jdGlvbiBhcHBvcnRpb24obm9kZSwgcHJldmlvdXNTaWJsaW5nLCBhbmNlc3RvcikgewogICAgICAgIGlmIChwcmV2aW91c1NpYmxpbmcpIHsKICAgICAgICAgIHZhciB2aXAgPSBub2RlLCB2b3AgPSBub2RlLCB2aW0gPSBwcmV2aW91c1NpYmxpbmcsIHZvbSA9IG5vZGUucGFyZW50LmNoaWxkcmVuWzBdLCBzaXAgPSB2aXAuX3RyZWUubW9kLCBzb3AgPSB2b3AuX3RyZWUubW9kLCBzaW0gPSB2aW0uX3RyZWUubW9kLCBzb20gPSB2b20uX3RyZWUubW9kLCBzaGlmdDsKICAgICAgICAgIHdoaWxlICh2aW0gPSBkM19sYXlvdXRfdHJlZVJpZ2h0KHZpbSksIHZpcCA9IGQzX2xheW91dF90cmVlTGVmdCh2aXApLCB2aW0gJiYgdmlwKSB7CiAgICAgICAgICAgIHZvbSA9IGQzX2xheW91dF90cmVlTGVmdCh2b20pOwogICAgICAgICAgICB2b3AgPSBkM19sYXlvdXRfdHJlZVJpZ2h0KHZvcCk7CiAgICAgICAgICAgIHZvcC5fdHJlZS5hbmNlc3RvciA9IG5vZGU7CiAgICAgICAgICAgIHNoaWZ0ID0gdmltLl90cmVlLnByZWxpbSArIHNpbSAtIHZpcC5fdHJlZS5wcmVsaW0gLSBzaXAgKyBzZXBhcmF0aW9uKHZpbSwgdmlwKTsKICAgICAgICAgICAgaWYgKHNoaWZ0ID4gMCkgewogICAgICAgICAgICAgIGQzX2xheW91dF90cmVlTW92ZShkM19sYXlvdXRfdHJlZUFuY2VzdG9yKHZpbSwgbm9kZSwgYW5jZXN0b3IpLCBub2RlLCBzaGlmdCk7CiAgICAgICAgICAgICAgc2lwICs9IHNoaWZ0OwogICAgICAgICAgICAgIHNvcCArPSBzaGlmdDsKICAgICAgICAgICAgfQogICAgICAgICAgICBzaW0gKz0gdmltLl90cmVlLm1vZDsKICAgICAgICAgICAgc2lwICs9IHZpcC5fdHJlZS5tb2Q7CiAgICAgICAgICAgIHNvbSArPSB2b20uX3RyZWUubW9kOwogICAgICAgICAgICBzb3AgKz0gdm9wLl90cmVlLm1vZDsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh2aW0gJiYgIWQzX2xheW91dF90cmVlUmlnaHQodm9wKSkgewogICAgICAgICAgICB2b3AuX3RyZWUudGhyZWFkID0gdmltOwogICAgICAgICAgICB2b3AuX3RyZWUubW9kICs9IHNpbSAtIHNvcDsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh2aXAgJiYgIWQzX2xheW91dF90cmVlTGVmdCh2b20pKSB7CiAgICAgICAgICAgIHZvbS5fdHJlZS50aHJlYWQgPSB2aXA7CiAgICAgICAgICAgIHZvbS5fdHJlZS5tb2QgKz0gc2lwIC0gc29tOwogICAgICAgICAgICBhbmNlc3RvciA9IG5vZGU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBhbmNlc3RvcjsKICAgICAgfQogICAgICBkM19sYXlvdXRfdHJlZVZpc2l0QWZ0ZXIocm9vdCwgZnVuY3Rpb24obm9kZSwgcHJldmlvdXNTaWJsaW5nKSB7CiAgICAgICAgbm9kZS5fdHJlZSA9IHsKICAgICAgICAgIGFuY2VzdG9yOiBub2RlLAogICAgICAgICAgcHJlbGltOiAwLAogICAgICAgICAgbW9kOiAwLAogICAgICAgICAgY2hhbmdlOiAwLAogICAgICAgICAgc2hpZnQ6IDAsCiAgICAgICAgICBudW1iZXI6IHByZXZpb3VzU2libGluZyA/IHByZXZpb3VzU2libGluZy5fdHJlZS5udW1iZXIgKyAxIDogMAogICAgICAgIH07CiAgICAgIH0pOwogICAgICBmaXJzdFdhbGsocm9vdCk7CiAgICAgIHNlY29uZFdhbGsocm9vdCwgLXJvb3QuX3RyZWUucHJlbGltKTsKICAgICAgdmFyIGxlZnQgPSBkM19sYXlvdXRfdHJlZVNlYXJjaChyb290LCBkM19sYXlvdXRfdHJlZUxlZnRtb3N0KSwgcmlnaHQgPSBkM19sYXlvdXRfdHJlZVNlYXJjaChyb290LCBkM19sYXlvdXRfdHJlZVJpZ2h0bW9zdCksIGRlZXAgPSBkM19sYXlvdXRfdHJlZVNlYXJjaChyb290LCBkM19sYXlvdXRfdHJlZURlZXBlc3QpLCB4MCA9IGxlZnQueCAtIHNlcGFyYXRpb24obGVmdCwgcmlnaHQpIC8gMiwgeDEgPSByaWdodC54ICsgc2VwYXJhdGlvbihyaWdodCwgbGVmdCkgLyAyLCB5MSA9IGRlZXAuZGVwdGggfHwgMTsKICAgICAgZDNfbGF5b3V0X3RyZWVWaXNpdEFmdGVyKHJvb3QsIGZ1bmN0aW9uKG5vZGUpIHsKICAgICAgICBub2RlLnggPSAobm9kZS54IC0geDApIC8gKHgxIC0geDApICogc2l6ZVswXTsKICAgICAgICBub2RlLnkgPSBub2RlLmRlcHRoIC8geTEgKiBzaXplWzFdOwogICAgICAgIGRlbGV0ZSBub2RlLl90cmVlOwogICAgICB9KTsKICAgICAgcmV0dXJuIG5vZGVzOwogICAgfQogICAgdHJlZS5zZXBhcmF0aW9uID0gZnVuY3Rpb24oeCkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzZXBhcmF0aW9uOwogICAgICBzZXBhcmF0aW9uID0geDsKICAgICAgcmV0dXJuIHRyZWU7CiAgICB9OwogICAgdHJlZS5zaXplID0gZnVuY3Rpb24oeCkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzaXplOwogICAgICBzaXplID0geDsKICAgICAgcmV0dXJuIHRyZWU7CiAgICB9OwogICAgcmV0dXJuIGQzX2xheW91dF9oaWVyYXJjaHlSZWJpbmQodHJlZSwgaGllcmFyY2h5KTsKICB9OwogIGZ1bmN0aW9uIGQzX2xheW91dF90cmVlU2VwYXJhdGlvbihhLCBiKSB7CiAgICByZXR1cm4gYS5wYXJlbnQgPT0gYi5wYXJlbnQgPyAxIDogMjsKICB9CiAgZnVuY3Rpb24gZDNfbGF5b3V0X3RyZWVMZWZ0KG5vZGUpIHsKICAgIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47CiAgICByZXR1cm4gY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoID8gY2hpbGRyZW5bMF0gOiBub2RlLl90cmVlLnRocmVhZDsKICB9CiAgZnVuY3Rpb24gZDNfbGF5b3V0X3RyZWVSaWdodChub2RlKSB7CiAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuLCBuOwogICAgcmV0dXJuIGNoaWxkcmVuICYmIChuID0gY2hpbGRyZW4ubGVuZ3RoKSA/IGNoaWxkcmVuW24gLSAxXSA6IG5vZGUuX3RyZWUudGhyZWFkOwogIH0KICBmdW5jdGlvbiBkM19sYXlvdXRfdHJlZVNlYXJjaChub2RlLCBjb21wYXJlKSB7CiAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuOwogICAgaWYgKGNoaWxkcmVuICYmIChuID0gY2hpbGRyZW4ubGVuZ3RoKSkgewogICAgICB2YXIgY2hpbGQsIG4sIGkgPSAtMTsKICAgICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgICBpZiAoY29tcGFyZShjaGlsZCA9IGQzX2xheW91dF90cmVlU2VhcmNoKGNoaWxkcmVuW2ldLCBjb21wYXJlKSwgbm9kZSkgPiAwKSB7CiAgICAgICAgICBub2RlID0gY2hpbGQ7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gbm9kZTsKICB9CiAgZnVuY3Rpb24gZDNfbGF5b3V0X3RyZWVSaWdodG1vc3QoYSwgYikgewogICAgcmV0dXJuIGEueCAtIGIueDsKICB9CiAgZnVuY3Rpb24gZDNfbGF5b3V0X3RyZWVMZWZ0bW9zdChhLCBiKSB7CiAgICByZXR1cm4gYi54IC0gYS54OwogIH0KICBmdW5jdGlvbiBkM19sYXlvdXRfdHJlZURlZXBlc3QoYSwgYikgewogICAgcmV0dXJuIGEuZGVwdGggLSBiLmRlcHRoOwogIH0KICBmdW5jdGlvbiBkM19sYXlvdXRfdHJlZVZpc2l0QWZ0ZXIobm9kZSwgY2FsbGJhY2spIHsKICAgIGZ1bmN0aW9uIHZpc2l0KG5vZGUsIHByZXZpb3VzU2libGluZykgewogICAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuOwogICAgICBpZiAoY2hpbGRyZW4gJiYgKG4gPSBjaGlsZHJlbi5sZW5ndGgpKSB7CiAgICAgICAgdmFyIGNoaWxkLCBwcmV2aW91c0NoaWxkID0gbnVsbCwgaSA9IC0xLCBuOwogICAgICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgICAgICBjaGlsZCA9IGNoaWxkcmVuW2ldOwogICAgICAgICAgdmlzaXQoY2hpbGQsIHByZXZpb3VzQ2hpbGQpOwogICAgICAgICAgcHJldmlvdXNDaGlsZCA9IGNoaWxkOwogICAgICAgIH0KICAgICAgfQogICAgICBjYWxsYmFjayhub2RlLCBwcmV2aW91c1NpYmxpbmcpOwogICAgfQogICAgdmlzaXQobm9kZSwgbnVsbCk7CiAgfQogIGZ1bmN0aW9uIGQzX2xheW91dF90cmVlU2hpZnQobm9kZSkgewogICAgdmFyIHNoaWZ0ID0gMCwgY2hhbmdlID0gMCwgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuLCBpID0gY2hpbGRyZW4ubGVuZ3RoLCBjaGlsZDsKICAgIHdoaWxlICgtLWkgPj0gMCkgewogICAgICBjaGlsZCA9IGNoaWxkcmVuW2ldLl90cmVlOwogICAgICBjaGlsZC5wcmVsaW0gKz0gc2hpZnQ7CiAgICAgIGNoaWxkLm1vZCArPSBzaGlmdDsKICAgICAgc2hpZnQgKz0gY2hpbGQuc2hpZnQgKyAoY2hhbmdlICs9IGNoaWxkLmNoYW5nZSk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGQzX2xheW91dF90cmVlTW92ZShhbmNlc3Rvciwgbm9kZSwgc2hpZnQpIHsKICAgIGFuY2VzdG9yID0gYW5jZXN0b3IuX3RyZWU7CiAgICBub2RlID0gbm9kZS5fdHJlZTsKICAgIHZhciBjaGFuZ2UgPSBzaGlmdCAvIChub2RlLm51bWJlciAtIGFuY2VzdG9yLm51bWJlcik7CiAgICBhbmNlc3Rvci5jaGFuZ2UgKz0gY2hhbmdlOwogICAgbm9kZS5jaGFuZ2UgLT0gY2hhbmdlOwogICAgbm9kZS5zaGlmdCArPSBzaGlmdDsKICAgIG5vZGUucHJlbGltICs9IHNoaWZ0OwogICAgbm9kZS5tb2QgKz0gc2hpZnQ7CiAgfQogIGZ1bmN0aW9uIGQzX2xheW91dF90cmVlQW5jZXN0b3IodmltLCBub2RlLCBhbmNlc3RvcikgewogICAgcmV0dXJuIHZpbS5fdHJlZS5hbmNlc3Rvci5wYXJlbnQgPT0gbm9kZS5wYXJlbnQgPyB2aW0uX3RyZWUuYW5jZXN0b3IgOiBhbmNlc3RvcjsKICB9CiAgZDMubGF5b3V0LnBhY2sgPSBmdW5jdGlvbigpIHsKICAgIHZhciBoaWVyYXJjaHkgPSBkMy5sYXlvdXQuaGllcmFyY2h5KCkuc29ydChkM19sYXlvdXRfcGFja1NvcnQpLCBwYWRkaW5nID0gMCwgc2l6ZSA9IFsgMSwgMSBdOwogICAgZnVuY3Rpb24gcGFjayhkLCBpKSB7CiAgICAgIHZhciBub2RlcyA9IGhpZXJhcmNoeS5jYWxsKHRoaXMsIGQsIGkpLCByb290ID0gbm9kZXNbMF07CiAgICAgIHJvb3QueCA9IDA7CiAgICAgIHJvb3QueSA9IDA7CiAgICAgIGQzX2xheW91dF90cmVlVmlzaXRBZnRlcihyb290LCBmdW5jdGlvbihkKSB7CiAgICAgICAgZC5yID0gTWF0aC5zcXJ0KGQudmFsdWUpOwogICAgICB9KTsKICAgICAgZDNfbGF5b3V0X3RyZWVWaXNpdEFmdGVyKHJvb3QsIGQzX2xheW91dF9wYWNrU2libGluZ3MpOwogICAgICB2YXIgdyA9IHNpemVbMF0sIGggPSBzaXplWzFdLCBrID0gTWF0aC5tYXgoMiAqIHJvb3QuciAvIHcsIDIgKiByb290LnIgLyBoKTsKICAgICAgaWYgKHBhZGRpbmcgPiAwKSB7CiAgICAgICAgdmFyIGRyID0gcGFkZGluZyAqIGsgLyAyOwogICAgICAgIGQzX2xheW91dF90cmVlVmlzaXRBZnRlcihyb290LCBmdW5jdGlvbihkKSB7CiAgICAgICAgICBkLnIgKz0gZHI7CiAgICAgICAgfSk7CiAgICAgICAgZDNfbGF5b3V0X3RyZWVWaXNpdEFmdGVyKHJvb3QsIGQzX2xheW91dF9wYWNrU2libGluZ3MpOwogICAgICAgIGQzX2xheW91dF90cmVlVmlzaXRBZnRlcihyb290LCBmdW5jdGlvbihkKSB7CiAgICAgICAgICBkLnIgLT0gZHI7CiAgICAgICAgfSk7CiAgICAgICAgayA9IE1hdGgubWF4KDIgKiByb290LnIgLyB3LCAyICogcm9vdC5yIC8gaCk7CiAgICAgIH0KICAgICAgZDNfbGF5b3V0X3BhY2tUcmFuc2Zvcm0ocm9vdCwgdyAvIDIsIGggLyAyLCAxIC8gayk7CiAgICAgIHJldHVybiBub2RlczsKICAgIH0KICAgIHBhY2suc2l6ZSA9IGZ1bmN0aW9uKHgpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc2l6ZTsKICAgICAgc2l6ZSA9IHg7CiAgICAgIHJldHVybiBwYWNrOwogICAgfTsKICAgIHBhY2sucGFkZGluZyA9IGZ1bmN0aW9uKF8pIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcGFkZGluZzsKICAgICAgcGFkZGluZyA9ICtfOwogICAgICByZXR1cm4gcGFjazsKICAgIH07CiAgICByZXR1cm4gZDNfbGF5b3V0X2hpZXJhcmNoeVJlYmluZChwYWNrLCBoaWVyYXJjaHkpOwogIH07CiAgZnVuY3Rpb24gZDNfbGF5b3V0X3BhY2tTb3J0KGEsIGIpIHsKICAgIHJldHVybiBhLnZhbHVlIC0gYi52YWx1ZTsKICB9CiAgZnVuY3Rpb24gZDNfbGF5b3V0X3BhY2tJbnNlcnQoYSwgYikgewogICAgdmFyIGMgPSBhLl9wYWNrX25leHQ7CiAgICBhLl9wYWNrX25leHQgPSBiOwogICAgYi5fcGFja19wcmV2ID0gYTsKICAgIGIuX3BhY2tfbmV4dCA9IGM7CiAgICBjLl9wYWNrX3ByZXYgPSBiOwogIH0KICBmdW5jdGlvbiBkM19sYXlvdXRfcGFja1NwbGljZShhLCBiKSB7CiAgICBhLl9wYWNrX25leHQgPSBiOwogICAgYi5fcGFja19wcmV2ID0gYTsKICB9CiAgZnVuY3Rpb24gZDNfbGF5b3V0X3BhY2tJbnRlcnNlY3RzKGEsIGIpIHsKICAgIHZhciBkeCA9IGIueCAtIGEueCwgZHkgPSBiLnkgLSBhLnksIGRyID0gYS5yICsgYi5yOwogICAgcmV0dXJuIGRyICogZHIgLSBkeCAqIGR4IC0gZHkgKiBkeSA+IC4wMDE7CiAgfQogIGZ1bmN0aW9uIGQzX2xheW91dF9wYWNrU2libGluZ3Mobm9kZSkgewogICAgaWYgKCEobm9kZXMgPSBub2RlLmNoaWxkcmVuKSB8fCAhKG4gPSBub2Rlcy5sZW5ndGgpKSByZXR1cm47CiAgICB2YXIgbm9kZXMsIHhNaW4gPSBJbmZpbml0eSwgeE1heCA9IC1JbmZpbml0eSwgeU1pbiA9IEluZmluaXR5LCB5TWF4ID0gLUluZmluaXR5LCBhLCBiLCBjLCBpLCBqLCBrLCBuOwogICAgZnVuY3Rpb24gYm91bmQobm9kZSkgewogICAgICB4TWluID0gTWF0aC5taW4obm9kZS54IC0gbm9kZS5yLCB4TWluKTsKICAgICAgeE1heCA9IE1hdGgubWF4KG5vZGUueCArIG5vZGUuciwgeE1heCk7CiAgICAgIHlNaW4gPSBNYXRoLm1pbihub2RlLnkgLSBub2RlLnIsIHlNaW4pOwogICAgICB5TWF4ID0gTWF0aC5tYXgobm9kZS55ICsgbm9kZS5yLCB5TWF4KTsKICAgIH0KICAgIG5vZGVzLmZvckVhY2goZDNfbGF5b3V0X3BhY2tMaW5rKTsKICAgIGEgPSBub2Rlc1swXTsKICAgIGEueCA9IC1hLnI7CiAgICBhLnkgPSAwOwogICAgYm91bmQoYSk7CiAgICBpZiAobiA+IDEpIHsKICAgICAgYiA9IG5vZGVzWzFdOwogICAgICBiLnggPSBiLnI7CiAgICAgIGIueSA9IDA7CiAgICAgIGJvdW5kKGIpOwogICAgICBpZiAobiA+IDIpIHsKICAgICAgICBjID0gbm9kZXNbMl07CiAgICAgICAgZDNfbGF5b3V0X3BhY2tQbGFjZShhLCBiLCBjKTsKICAgICAgICBib3VuZChjKTsKICAgICAgICBkM19sYXlvdXRfcGFja0luc2VydChhLCBjKTsKICAgICAgICBhLl9wYWNrX3ByZXYgPSBjOwogICAgICAgIGQzX2xheW91dF9wYWNrSW5zZXJ0KGMsIGIpOwogICAgICAgIGIgPSBhLl9wYWNrX25leHQ7CiAgICAgICAgZm9yIChpID0gMzsgaSA8IG47IGkrKykgewogICAgICAgICAgZDNfbGF5b3V0X3BhY2tQbGFjZShhLCBiLCBjID0gbm9kZXNbaV0pOwogICAgICAgICAgdmFyIGlzZWN0ID0gMCwgczEgPSAxLCBzMiA9IDE7CiAgICAgICAgICBmb3IgKGogPSBiLl9wYWNrX25leHQ7IGogIT09IGI7IGogPSBqLl9wYWNrX25leHQsIHMxKyspIHsKICAgICAgICAgICAgaWYgKGQzX2xheW91dF9wYWNrSW50ZXJzZWN0cyhqLCBjKSkgewogICAgICAgICAgICAgIGlzZWN0ID0gMTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGlzZWN0ID09IDEpIHsKICAgICAgICAgICAgZm9yIChrID0gYS5fcGFja19wcmV2OyBrICE9PSBqLl9wYWNrX3ByZXY7IGsgPSBrLl9wYWNrX3ByZXYsIHMyKyspIHsKICAgICAgICAgICAgICBpZiAoZDNfbGF5b3V0X3BhY2tJbnRlcnNlY3RzKGssIGMpKSB7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChpc2VjdCkgewogICAgICAgICAgICBpZiAoczEgPCBzMiB8fCBzMSA9PSBzMiAmJiBiLnIgPCBhLnIpIGQzX2xheW91dF9wYWNrU3BsaWNlKGEsIGIgPSBqKTsgZWxzZSBkM19sYXlvdXRfcGFja1NwbGljZShhID0gaywgYik7CiAgICAgICAgICAgIGktLTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGQzX2xheW91dF9wYWNrSW5zZXJ0KGEsIGMpOwogICAgICAgICAgICBiID0gYzsKICAgICAgICAgICAgYm91bmQoYyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICB2YXIgY3ggPSAoeE1pbiArIHhNYXgpIC8gMiwgY3kgPSAoeU1pbiArIHlNYXgpIC8gMiwgY3IgPSAwOwogICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewogICAgICBjID0gbm9kZXNbaV07CiAgICAgIGMueCAtPSBjeDsKICAgICAgYy55IC09IGN5OwogICAgICBjciA9IE1hdGgubWF4KGNyLCBjLnIgKyBNYXRoLnNxcnQoYy54ICogYy54ICsgYy55ICogYy55KSk7CiAgICB9CiAgICBub2RlLnIgPSBjcjsKICAgIG5vZGVzLmZvckVhY2goZDNfbGF5b3V0X3BhY2tVbmxpbmspOwogIH0KICBmdW5jdGlvbiBkM19sYXlvdXRfcGFja0xpbmsobm9kZSkgewogICAgbm9kZS5fcGFja19uZXh0ID0gbm9kZS5fcGFja19wcmV2ID0gbm9kZTsKICB9CiAgZnVuY3Rpb24gZDNfbGF5b3V0X3BhY2tVbmxpbmsobm9kZSkgewogICAgZGVsZXRlIG5vZGUuX3BhY2tfbmV4dDsKICAgIGRlbGV0ZSBub2RlLl9wYWNrX3ByZXY7CiAgfQogIGZ1bmN0aW9uIGQzX2xheW91dF9wYWNrVHJhbnNmb3JtKG5vZGUsIHgsIHksIGspIHsKICAgIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47CiAgICBub2RlLnggPSB4ICs9IGsgKiBub2RlLng7CiAgICBub2RlLnkgPSB5ICs9IGsgKiBub2RlLnk7CiAgICBub2RlLnIgKj0gazsKICAgIGlmIChjaGlsZHJlbikgewogICAgICB2YXIgaSA9IC0xLCBuID0gY2hpbGRyZW4ubGVuZ3RoOwogICAgICB3aGlsZSAoKytpIDwgbikgZDNfbGF5b3V0X3BhY2tUcmFuc2Zvcm0oY2hpbGRyZW5baV0sIHgsIHksIGspOwogICAgfQogIH0KICBmdW5jdGlvbiBkM19sYXlvdXRfcGFja1BsYWNlKGEsIGIsIGMpIHsKICAgIHZhciBkYiA9IGEuciArIGMuciwgZHggPSBiLnggLSBhLngsIGR5ID0gYi55IC0gYS55OwogICAgaWYgKGRiICYmIChkeCB8fCBkeSkpIHsKICAgICAgdmFyIGRhID0gYi5yICsgYy5yLCBkYyA9IGR4ICogZHggKyBkeSAqIGR5OwogICAgICBkYSAqPSBkYTsKICAgICAgZGIgKj0gZGI7CiAgICAgIHZhciB4ID0gLjUgKyAoZGIgLSBkYSkgLyAoMiAqIGRjKSwgeSA9IE1hdGguc3FydChNYXRoLm1heCgwLCAyICogZGEgKiAoZGIgKyBkYykgLSAoZGIgLT0gZGMpICogZGIgLSBkYSAqIGRhKSkgLyAoMiAqIGRjKTsKICAgICAgYy54ID0gYS54ICsgeCAqIGR4ICsgeSAqIGR5OwogICAgICBjLnkgPSBhLnkgKyB4ICogZHkgLSB5ICogZHg7CiAgICB9IGVsc2UgewogICAgICBjLnggPSBhLnggKyBkYjsKICAgICAgYy55ID0gYS55OwogICAgfQogIH0KICBkMy5sYXlvdXQuY2x1c3RlciA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGhpZXJhcmNoeSA9IGQzLmxheW91dC5oaWVyYXJjaHkoKS5zb3J0KG51bGwpLnZhbHVlKG51bGwpLCBzZXBhcmF0aW9uID0gZDNfbGF5b3V0X3RyZWVTZXBhcmF0aW9uLCBzaXplID0gWyAxLCAxIF07CiAgICBmdW5jdGlvbiBjbHVzdGVyKGQsIGkpIHsKICAgICAgdmFyIG5vZGVzID0gaGllcmFyY2h5LmNhbGwodGhpcywgZCwgaSksIHJvb3QgPSBub2Rlc1swXSwgcHJldmlvdXNOb2RlLCB4ID0gMDsKICAgICAgZDNfbGF5b3V0X3RyZWVWaXNpdEFmdGVyKHJvb3QsIGZ1bmN0aW9uKG5vZGUpIHsKICAgICAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuOwogICAgICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGgpIHsKICAgICAgICAgIG5vZGUueCA9IGQzX2xheW91dF9jbHVzdGVyWChjaGlsZHJlbik7CiAgICAgICAgICBub2RlLnkgPSBkM19sYXlvdXRfY2x1c3RlclkoY2hpbGRyZW4pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBub2RlLnggPSBwcmV2aW91c05vZGUgPyB4ICs9IHNlcGFyYXRpb24obm9kZSwgcHJldmlvdXNOb2RlKSA6IDA7CiAgICAgICAgICBub2RlLnkgPSAwOwogICAgICAgICAgcHJldmlvdXNOb2RlID0gbm9kZTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICB2YXIgbGVmdCA9IGQzX2xheW91dF9jbHVzdGVyTGVmdChyb290KSwgcmlnaHQgPSBkM19sYXlvdXRfY2x1c3RlclJpZ2h0KHJvb3QpLCB4MCA9IGxlZnQueCAtIHNlcGFyYXRpb24obGVmdCwgcmlnaHQpIC8gMiwgeDEgPSByaWdodC54ICsgc2VwYXJhdGlvbihyaWdodCwgbGVmdCkgLyAyOwogICAgICBkM19sYXlvdXRfdHJlZVZpc2l0QWZ0ZXIocm9vdCwgZnVuY3Rpb24obm9kZSkgewogICAgICAgIG5vZGUueCA9IChub2RlLnggLSB4MCkgLyAoeDEgLSB4MCkgKiBzaXplWzBdOwogICAgICAgIG5vZGUueSA9ICgxIC0gKHJvb3QueSA/IG5vZGUueSAvIHJvb3QueSA6IDEpKSAqIHNpemVbMV07CiAgICAgIH0pOwogICAgICByZXR1cm4gbm9kZXM7CiAgICB9CiAgICBjbHVzdGVyLnNlcGFyYXRpb24gPSBmdW5jdGlvbih4KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNlcGFyYXRpb247CiAgICAgIHNlcGFyYXRpb24gPSB4OwogICAgICByZXR1cm4gY2x1c3RlcjsKICAgIH07CiAgICBjbHVzdGVyLnNpemUgPSBmdW5jdGlvbih4KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNpemU7CiAgICAgIHNpemUgPSB4OwogICAgICByZXR1cm4gY2x1c3RlcjsKICAgIH07CiAgICByZXR1cm4gZDNfbGF5b3V0X2hpZXJhcmNoeVJlYmluZChjbHVzdGVyLCBoaWVyYXJjaHkpOwogIH07CiAgZnVuY3Rpb24gZDNfbGF5b3V0X2NsdXN0ZXJZKGNoaWxkcmVuKSB7CiAgICByZXR1cm4gMSArIGQzLm1heChjaGlsZHJlbiwgZnVuY3Rpb24oY2hpbGQpIHsKICAgICAgcmV0dXJuIGNoaWxkLnk7CiAgICB9KTsKICB9CiAgZnVuY3Rpb24gZDNfbGF5b3V0X2NsdXN0ZXJYKGNoaWxkcmVuKSB7CiAgICByZXR1cm4gY2hpbGRyZW4ucmVkdWNlKGZ1bmN0aW9uKHgsIGNoaWxkKSB7CiAgICAgIHJldHVybiB4ICsgY2hpbGQueDsKICAgIH0sIDApIC8gY2hpbGRyZW4ubGVuZ3RoOwogIH0KICBmdW5jdGlvbiBkM19sYXlvdXRfY2x1c3RlckxlZnQobm9kZSkgewogICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjsKICAgIHJldHVybiBjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGggPyBkM19sYXlvdXRfY2x1c3RlckxlZnQoY2hpbGRyZW5bMF0pIDogbm9kZTsKICB9CiAgZnVuY3Rpb24gZDNfbGF5b3V0X2NsdXN0ZXJSaWdodChub2RlKSB7CiAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuLCBuOwogICAgcmV0dXJuIGNoaWxkcmVuICYmIChuID0gY2hpbGRyZW4ubGVuZ3RoKSA/IGQzX2xheW91dF9jbHVzdGVyUmlnaHQoY2hpbGRyZW5bbiAtIDFdKSA6IG5vZGU7CiAgfQogIGQzLmxheW91dC50cmVlbWFwID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgaGllcmFyY2h5ID0gZDMubGF5b3V0LmhpZXJhcmNoeSgpLCByb3VuZCA9IE1hdGgucm91bmQsIHNpemUgPSBbIDEsIDEgXSwgcGFkZGluZyA9IG51bGwsIHBhZCA9IGQzX2xheW91dF90cmVlbWFwUGFkTnVsbCwgc3RpY2t5ID0gZmFsc2UsIHN0aWNraWVzLCBtb2RlID0gInNxdWFyaWZ5IiwgcmF0aW8gPSAuNSAqICgxICsgTWF0aC5zcXJ0KDUpKTsKICAgIGZ1bmN0aW9uIHNjYWxlKGNoaWxkcmVuLCBrKSB7CiAgICAgIHZhciBpID0gLTEsIG4gPSBjaGlsZHJlbi5sZW5ndGgsIGNoaWxkLCBhcmVhOwogICAgICB3aGlsZSAoKytpIDwgbikgewogICAgICAgIGFyZWEgPSAoY2hpbGQgPSBjaGlsZHJlbltpXSkudmFsdWUgKiAoayA8IDAgPyAwIDogayk7CiAgICAgICAgY2hpbGQuYXJlYSA9IGlzTmFOKGFyZWEpIHx8IGFyZWEgPD0gMCA/IDAgOiBhcmVhOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBzcXVhcmlmeShub2RlKSB7CiAgICAgIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47CiAgICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGgpIHsKICAgICAgICB2YXIgcmVjdCA9IHBhZChub2RlKSwgcm93ID0gW10sIHJlbWFpbmluZyA9IGNoaWxkcmVuLnNsaWNlKCksIGNoaWxkLCBiZXN0ID0gSW5maW5pdHksIHNjb3JlLCB1ID0gbW9kZSA9PT0gInNsaWNlIiA/IHJlY3QuZHggOiBtb2RlID09PSAiZGljZSIgPyByZWN0LmR5IDogbW9kZSA9PT0gInNsaWNlLWRpY2UiID8gbm9kZS5kZXB0aCAmIDEgPyByZWN0LmR5IDogcmVjdC5keCA6IE1hdGgubWluKHJlY3QuZHgsIHJlY3QuZHkpLCBuOwogICAgICAgIHNjYWxlKHJlbWFpbmluZywgcmVjdC5keCAqIHJlY3QuZHkgLyBub2RlLnZhbHVlKTsKICAgICAgICByb3cuYXJlYSA9IDA7CiAgICAgICAgd2hpbGUgKChuID0gcmVtYWluaW5nLmxlbmd0aCkgPiAwKSB7CiAgICAgICAgICByb3cucHVzaChjaGlsZCA9IHJlbWFpbmluZ1tuIC0gMV0pOwogICAgICAgICAgcm93LmFyZWEgKz0gY2hpbGQuYXJlYTsKICAgICAgICAgIGlmIChtb2RlICE9PSAic3F1YXJpZnkiIHx8IChzY29yZSA9IHdvcnN0KHJvdywgdSkpIDw9IGJlc3QpIHsKICAgICAgICAgICAgcmVtYWluaW5nLnBvcCgpOwogICAgICAgICAgICBiZXN0ID0gc2NvcmU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByb3cuYXJlYSAtPSByb3cucG9wKCkuYXJlYTsKICAgICAgICAgICAgcG9zaXRpb24ocm93LCB1LCByZWN0LCBmYWxzZSk7CiAgICAgICAgICAgIHUgPSBNYXRoLm1pbihyZWN0LmR4LCByZWN0LmR5KTsKICAgICAgICAgICAgcm93Lmxlbmd0aCA9IHJvdy5hcmVhID0gMDsKICAgICAgICAgICAgYmVzdCA9IEluZmluaXR5OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAocm93Lmxlbmd0aCkgewogICAgICAgICAgcG9zaXRpb24ocm93LCB1LCByZWN0LCB0cnVlKTsKICAgICAgICAgIHJvdy5sZW5ndGggPSByb3cuYXJlYSA9IDA7CiAgICAgICAgfQogICAgICAgIGNoaWxkcmVuLmZvckVhY2goc3F1YXJpZnkpOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBzdGlja2lmeShub2RlKSB7CiAgICAgIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47CiAgICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGgpIHsKICAgICAgICB2YXIgcmVjdCA9IHBhZChub2RlKSwgcmVtYWluaW5nID0gY2hpbGRyZW4uc2xpY2UoKSwgY2hpbGQsIHJvdyA9IFtdOwogICAgICAgIHNjYWxlKHJlbWFpbmluZywgcmVjdC5keCAqIHJlY3QuZHkgLyBub2RlLnZhbHVlKTsKICAgICAgICByb3cuYXJlYSA9IDA7CiAgICAgICAgd2hpbGUgKGNoaWxkID0gcmVtYWluaW5nLnBvcCgpKSB7CiAgICAgICAgICByb3cucHVzaChjaGlsZCk7CiAgICAgICAgICByb3cuYXJlYSArPSBjaGlsZC5hcmVhOwogICAgICAgICAgaWYgKGNoaWxkLnogIT0gbnVsbCkgewogICAgICAgICAgICBwb3NpdGlvbihyb3csIGNoaWxkLnogPyByZWN0LmR4IDogcmVjdC5keSwgcmVjdCwgIXJlbWFpbmluZy5sZW5ndGgpOwogICAgICAgICAgICByb3cubGVuZ3RoID0gcm93LmFyZWEgPSAwOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjaGlsZHJlbi5mb3JFYWNoKHN0aWNraWZ5KTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gd29yc3Qocm93LCB1KSB7CiAgICAgIHZhciBzID0gcm93LmFyZWEsIHIsIHJtYXggPSAwLCBybWluID0gSW5maW5pdHksIGkgPSAtMSwgbiA9IHJvdy5sZW5ndGg7CiAgICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgICAgaWYgKCEociA9IHJvd1tpXS5hcmVhKSkgY29udGludWU7CiAgICAgICAgaWYgKHIgPCBybWluKSBybWluID0gcjsKICAgICAgICBpZiAociA+IHJtYXgpIHJtYXggPSByOwogICAgICB9CiAgICAgIHMgKj0gczsKICAgICAgdSAqPSB1OwogICAgICByZXR1cm4gcyA/IE1hdGgubWF4KHUgKiBybWF4ICogcmF0aW8gLyBzLCBzIC8gKHUgKiBybWluICogcmF0aW8pKSA6IEluZmluaXR5OwogICAgfQogICAgZnVuY3Rpb24gcG9zaXRpb24ocm93LCB1LCByZWN0LCBmbHVzaCkgewogICAgICB2YXIgaSA9IC0xLCBuID0gcm93Lmxlbmd0aCwgeCA9IHJlY3QueCwgeSA9IHJlY3QueSwgdiA9IHUgPyByb3VuZChyb3cuYXJlYSAvIHUpIDogMCwgbzsKICAgICAgaWYgKHUgPT0gcmVjdC5keCkgewogICAgICAgIGlmIChmbHVzaCB8fCB2ID4gcmVjdC5keSkgdiA9IHJlY3QuZHk7CiAgICAgICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgICAgIG8gPSByb3dbaV07CiAgICAgICAgICBvLnggPSB4OwogICAgICAgICAgby55ID0geTsKICAgICAgICAgIG8uZHkgPSB2OwogICAgICAgICAgeCArPSBvLmR4ID0gTWF0aC5taW4ocmVjdC54ICsgcmVjdC5keCAtIHgsIHYgPyByb3VuZChvLmFyZWEgLyB2KSA6IDApOwogICAgICAgIH0KICAgICAgICBvLnogPSB0cnVlOwogICAgICAgIG8uZHggKz0gcmVjdC54ICsgcmVjdC5keCAtIHg7CiAgICAgICAgcmVjdC55ICs9IHY7CiAgICAgICAgcmVjdC5keSAtPSB2OwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChmbHVzaCB8fCB2ID4gcmVjdC5keCkgdiA9IHJlY3QuZHg7CiAgICAgICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgICAgIG8gPSByb3dbaV07CiAgICAgICAgICBvLnggPSB4OwogICAgICAgICAgby55ID0geTsKICAgICAgICAgIG8uZHggPSB2OwogICAgICAgICAgeSArPSBvLmR5ID0gTWF0aC5taW4ocmVjdC55ICsgcmVjdC5keSAtIHksIHYgPyByb3VuZChvLmFyZWEgLyB2KSA6IDApOwogICAgICAgIH0KICAgICAgICBvLnogPSBmYWxzZTsKICAgICAgICBvLmR5ICs9IHJlY3QueSArIHJlY3QuZHkgLSB5OwogICAgICAgIHJlY3QueCArPSB2OwogICAgICAgIHJlY3QuZHggLT0gdjsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gdHJlZW1hcChkKSB7CiAgICAgIHZhciBub2RlcyA9IHN0aWNraWVzIHx8IGhpZXJhcmNoeShkKSwgcm9vdCA9IG5vZGVzWzBdOwogICAgICByb290LnggPSAwOwogICAgICByb290LnkgPSAwOwogICAgICByb290LmR4ID0gc2l6ZVswXTsKICAgICAgcm9vdC5keSA9IHNpemVbMV07CiAgICAgIGlmIChzdGlja2llcykgaGllcmFyY2h5LnJldmFsdWUocm9vdCk7CiAgICAgIHNjYWxlKFsgcm9vdCBdLCByb290LmR4ICogcm9vdC5keSAvIHJvb3QudmFsdWUpOwogICAgICAoc3RpY2tpZXMgPyBzdGlja2lmeSA6IHNxdWFyaWZ5KShyb290KTsKICAgICAgaWYgKHN0aWNreSkgc3RpY2tpZXMgPSBub2RlczsKICAgICAgcmV0dXJuIG5vZGVzOwogICAgfQogICAgdHJlZW1hcC5zaXplID0gZnVuY3Rpb24oeCkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzaXplOwogICAgICBzaXplID0geDsKICAgICAgcmV0dXJuIHRyZWVtYXA7CiAgICB9OwogICAgdHJlZW1hcC5wYWRkaW5nID0gZnVuY3Rpb24oeCkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBwYWRkaW5nOwogICAgICBmdW5jdGlvbiBwYWRGdW5jdGlvbihub2RlKSB7CiAgICAgICAgdmFyIHAgPSB4LmNhbGwodHJlZW1hcCwgbm9kZSwgbm9kZS5kZXB0aCk7CiAgICAgICAgcmV0dXJuIHAgPT0gbnVsbCA/IGQzX2xheW91dF90cmVlbWFwUGFkTnVsbChub2RlKSA6IGQzX2xheW91dF90cmVlbWFwUGFkKG5vZGUsIHR5cGVvZiBwID09PSAibnVtYmVyIiA/IFsgcCwgcCwgcCwgcCBdIDogcCk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gcGFkQ29uc3RhbnQobm9kZSkgewogICAgICAgIHJldHVybiBkM19sYXlvdXRfdHJlZW1hcFBhZChub2RlLCB4KTsKICAgICAgfQogICAgICB2YXIgdHlwZTsKICAgICAgcGFkID0gKHBhZGRpbmcgPSB4KSA9PSBudWxsID8gZDNfbGF5b3V0X3RyZWVtYXBQYWROdWxsIDogKHR5cGUgPSB0eXBlb2YgeCkgPT09ICJmdW5jdGlvbiIgPyBwYWRGdW5jdGlvbiA6IHR5cGUgPT09ICJudW1iZXIiID8gKHggPSBbIHgsIHgsIHgsIHggXSwgCiAgICAgIHBhZENvbnN0YW50KSA6IHBhZENvbnN0YW50OwogICAgICByZXR1cm4gdHJlZW1hcDsKICAgIH07CiAgICB0cmVlbWFwLnJvdW5kID0gZnVuY3Rpb24oeCkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiByb3VuZCAhPSBOdW1iZXI7CiAgICAgIHJvdW5kID0geCA/IE1hdGgucm91bmQgOiBOdW1iZXI7CiAgICAgIHJldHVybiB0cmVlbWFwOwogICAgfTsKICAgIHRyZWVtYXAuc3RpY2t5ID0gZnVuY3Rpb24oeCkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzdGlja3k7CiAgICAgIHN0aWNreSA9IHg7CiAgICAgIHN0aWNraWVzID0gbnVsbDsKICAgICAgcmV0dXJuIHRyZWVtYXA7CiAgICB9OwogICAgdHJlZW1hcC5yYXRpbyA9IGZ1bmN0aW9uKHgpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcmF0aW87CiAgICAgIHJhdGlvID0geDsKICAgICAgcmV0dXJuIHRyZWVtYXA7CiAgICB9OwogICAgdHJlZW1hcC5tb2RlID0gZnVuY3Rpb24oeCkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBtb2RlOwogICAgICBtb2RlID0geCArICIiOwogICAgICByZXR1cm4gdHJlZW1hcDsKICAgIH07CiAgICByZXR1cm4gZDNfbGF5b3V0X2hpZXJhcmNoeVJlYmluZCh0cmVlbWFwLCBoaWVyYXJjaHkpOwogIH07CiAgZnVuY3Rpb24gZDNfbGF5b3V0X3RyZWVtYXBQYWROdWxsKG5vZGUpIHsKICAgIHJldHVybiB7CiAgICAgIHg6IG5vZGUueCwKICAgICAgeTogbm9kZS55LAogICAgICBkeDogbm9kZS5keCwKICAgICAgZHk6IG5vZGUuZHkKICAgIH07CiAgfQogIGZ1bmN0aW9uIGQzX2xheW91dF90cmVlbWFwUGFkKG5vZGUsIHBhZGRpbmcpIHsKICAgIHZhciB4ID0gbm9kZS54ICsgcGFkZGluZ1szXSwgeSA9IG5vZGUueSArIHBhZGRpbmdbMF0sIGR4ID0gbm9kZS5keCAtIHBhZGRpbmdbMV0gLSBwYWRkaW5nWzNdLCBkeSA9IG5vZGUuZHkgLSBwYWRkaW5nWzBdIC0gcGFkZGluZ1syXTsKICAgIGlmIChkeCA8IDApIHsKICAgICAgeCArPSBkeCAvIDI7CiAgICAgIGR4ID0gMDsKICAgIH0KICAgIGlmIChkeSA8IDApIHsKICAgICAgeSArPSBkeSAvIDI7CiAgICAgIGR5ID0gMDsKICAgIH0KICAgIHJldHVybiB7CiAgICAgIHg6IHgsCiAgICAgIHk6IHksCiAgICAgIGR4OiBkeCwKICAgICAgZHk6IGR5CiAgICB9OwogIH0KICBkMy5yYW5kb20gPSB7CiAgICBub3JtYWw6IGZ1bmN0aW9uKMK1LCDPgykgewogICAgICB2YXIgbiA9IGFyZ3VtZW50cy5sZW5ndGg7CiAgICAgIGlmIChuIDwgMikgz4MgPSAxOwogICAgICBpZiAobiA8IDEpIMK1ID0gMDsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciB4LCB5LCByOwogICAgICAgIGRvIHsKICAgICAgICAgIHggPSBNYXRoLnJhbmRvbSgpICogMiAtIDE7CiAgICAgICAgICB5ID0gTWF0aC5yYW5kb20oKSAqIDIgLSAxOwogICAgICAgICAgciA9IHggKiB4ICsgeSAqIHk7CiAgICAgICAgfSB3aGlsZSAoIXIgfHwgciA+IDEpOwogICAgICAgIHJldHVybiDCtSArIM+DICogeCAqIE1hdGguc3FydCgtMiAqIE1hdGgubG9nKHIpIC8gcik7CiAgICAgIH07CiAgICB9LAogICAgbG9nTm9ybWFsOiBmdW5jdGlvbigpIHsKICAgICAgdmFyIHJhbmRvbSA9IGQzLnJhbmRvbS5ub3JtYWwuYXBwbHkoZDMsIGFyZ3VtZW50cyk7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gTWF0aC5leHAocmFuZG9tKCkpOwogICAgICB9OwogICAgfSwKICAgIGlyd2luSGFsbDogZnVuY3Rpb24obSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgZm9yICh2YXIgcyA9IDAsIGogPSAwOyBqIDwgbTsgaisrKSBzICs9IE1hdGgucmFuZG9tKCk7CiAgICAgICAgcmV0dXJuIHMgLyBtOwogICAgICB9OwogICAgfQogIH07CiAgZDMuc2NhbGUgPSB7fTsKICBmdW5jdGlvbiBkM19zY2FsZUV4dGVudChkb21haW4pIHsKICAgIHZhciBzdGFydCA9IGRvbWFpblswXSwgc3RvcCA9IGRvbWFpbltkb21haW4ubGVuZ3RoIC0gMV07CiAgICByZXR1cm4gc3RhcnQgPCBzdG9wID8gWyBzdGFydCwgc3RvcCBdIDogWyBzdG9wLCBzdGFydCBdOwogIH0KICBmdW5jdGlvbiBkM19zY2FsZVJhbmdlKHNjYWxlKSB7CiAgICByZXR1cm4gc2NhbGUucmFuZ2VFeHRlbnQgPyBzY2FsZS5yYW5nZUV4dGVudCgpIDogZDNfc2NhbGVFeHRlbnQoc2NhbGUucmFuZ2UoKSk7CiAgfQogIGZ1bmN0aW9uIGQzX3NjYWxlX2JpbGluZWFyKGRvbWFpbiwgcmFuZ2UsIHVuaW50ZXJwb2xhdGUsIGludGVycG9sYXRlKSB7CiAgICB2YXIgdSA9IHVuaW50ZXJwb2xhdGUoZG9tYWluWzBdLCBkb21haW5bMV0pLCBpID0gaW50ZXJwb2xhdGUocmFuZ2VbMF0sIHJhbmdlWzFdKTsKICAgIHJldHVybiBmdW5jdGlvbih4KSB7CiAgICAgIHJldHVybiBpKHUoeCkpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gZDNfc2NhbGVfbmljZShkb21haW4sIG5pY2UpIHsKICAgIHZhciBpMCA9IDAsIGkxID0gZG9tYWluLmxlbmd0aCAtIDEsIHgwID0gZG9tYWluW2kwXSwgeDEgPSBkb21haW5baTFdLCBkeDsKICAgIGlmICh4MSA8IHgwKSB7CiAgICAgIGR4ID0gaTAsIGkwID0gaTEsIGkxID0gZHg7CiAgICAgIGR4ID0geDAsIHgwID0geDEsIHgxID0gZHg7CiAgICB9CiAgICBpZiAobmljZSA9IG5pY2UoeDEgLSB4MCkpIHsKICAgICAgZG9tYWluW2kwXSA9IG5pY2UuZmxvb3IoeDApOwogICAgICBkb21haW5baTFdID0gbmljZS5jZWlsKHgxKTsKICAgIH0KICAgIHJldHVybiBkb21haW47CiAgfQogIGZ1bmN0aW9uIGQzX3NjYWxlX3BvbHlsaW5lYXIoZG9tYWluLCByYW5nZSwgdW5pbnRlcnBvbGF0ZSwgaW50ZXJwb2xhdGUpIHsKICAgIHZhciB1ID0gW10sIGkgPSBbXSwgaiA9IDAsIGsgPSBNYXRoLm1pbihkb21haW4ubGVuZ3RoLCByYW5nZS5sZW5ndGgpIC0gMTsKICAgIGlmIChkb21haW5ba10gPCBkb21haW5bMF0pIHsKICAgICAgZG9tYWluID0gZG9tYWluLnNsaWNlKCkucmV2ZXJzZSgpOwogICAgICByYW5nZSA9IHJhbmdlLnNsaWNlKCkucmV2ZXJzZSgpOwogICAgfQogICAgd2hpbGUgKCsraiA8PSBrKSB7CiAgICAgIHUucHVzaCh1bmludGVycG9sYXRlKGRvbWFpbltqIC0gMV0sIGRvbWFpbltqXSkpOwogICAgICBpLnB1c2goaW50ZXJwb2xhdGUocmFuZ2VbaiAtIDFdLCByYW5nZVtqXSkpOwogICAgfQogICAgcmV0dXJuIGZ1bmN0aW9uKHgpIHsKICAgICAgdmFyIGogPSBkMy5iaXNlY3QoZG9tYWluLCB4LCAxLCBrKSAtIDE7CiAgICAgIHJldHVybiBpW2pdKHVbal0oeCkpOwogICAgfTsKICB9CiAgZDMuc2NhbGUubGluZWFyID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gZDNfc2NhbGVfbGluZWFyKFsgMCwgMSBdLCBbIDAsIDEgXSwgZDNfaW50ZXJwb2xhdGUsIGZhbHNlKTsKICB9OwogIGZ1bmN0aW9uIGQzX3NjYWxlX2xpbmVhcihkb21haW4sIHJhbmdlLCBpbnRlcnBvbGF0ZSwgY2xhbXApIHsKICAgIHZhciBvdXRwdXQsIGlucHV0OwogICAgZnVuY3Rpb24gcmVzY2FsZSgpIHsKICAgICAgdmFyIGxpbmVhciA9IE1hdGgubWluKGRvbWFpbi5sZW5ndGgsIHJhbmdlLmxlbmd0aCkgPiAyID8gZDNfc2NhbGVfcG9seWxpbmVhciA6IGQzX3NjYWxlX2JpbGluZWFyLCB1bmludGVycG9sYXRlID0gY2xhbXAgPyBkM191bmludGVycG9sYXRlQ2xhbXAgOiBkM191bmludGVycG9sYXRlTnVtYmVyOwogICAgICBvdXRwdXQgPSBsaW5lYXIoZG9tYWluLCByYW5nZSwgdW5pbnRlcnBvbGF0ZSwgaW50ZXJwb2xhdGUpOwogICAgICBpbnB1dCA9IGxpbmVhcihyYW5nZSwgZG9tYWluLCB1bmludGVycG9sYXRlLCBkM19pbnRlcnBvbGF0ZSk7CiAgICAgIHJldHVybiBzY2FsZTsKICAgIH0KICAgIGZ1bmN0aW9uIHNjYWxlKHgpIHsKICAgICAgcmV0dXJuIG91dHB1dCh4KTsKICAgIH0KICAgIHNjYWxlLmludmVydCA9IGZ1bmN0aW9uKHkpIHsKICAgICAgcmV0dXJuIGlucHV0KHkpOwogICAgfTsKICAgIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKHgpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZG9tYWluOwogICAgICBkb21haW4gPSB4Lm1hcChOdW1iZXIpOwogICAgICByZXR1cm4gcmVzY2FsZSgpOwogICAgfTsKICAgIHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oeCkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiByYW5nZTsKICAgICAgcmFuZ2UgPSB4OwogICAgICByZXR1cm4gcmVzY2FsZSgpOwogICAgfTsKICAgIHNjYWxlLnJhbmdlUm91bmQgPSBmdW5jdGlvbih4KSB7CiAgICAgIHJldHVybiBzY2FsZS5yYW5nZSh4KS5pbnRlcnBvbGF0ZShkM19pbnRlcnBvbGF0ZVJvdW5kKTsKICAgIH07CiAgICBzY2FsZS5jbGFtcCA9IGZ1bmN0aW9uKHgpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gY2xhbXA7CiAgICAgIGNsYW1wID0geDsKICAgICAgcmV0dXJuIHJlc2NhbGUoKTsKICAgIH07CiAgICBzY2FsZS5pbnRlcnBvbGF0ZSA9IGZ1bmN0aW9uKHgpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gaW50ZXJwb2xhdGU7CiAgICAgIGludGVycG9sYXRlID0geDsKICAgICAgcmV0dXJuIHJlc2NhbGUoKTsKICAgIH07CiAgICBzY2FsZS50aWNrcyA9IGZ1bmN0aW9uKG0pIHsKICAgICAgcmV0dXJuIGQzX3NjYWxlX2xpbmVhclRpY2tzKGRvbWFpbiwgbSk7CiAgICB9OwogICAgc2NhbGUudGlja0Zvcm1hdCA9IGZ1bmN0aW9uKG0sIGZvcm1hdCkgewogICAgICByZXR1cm4gZDNfc2NhbGVfbGluZWFyVGlja0Zvcm1hdChkb21haW4sIG0sIGZvcm1hdCk7CiAgICB9OwogICAgc2NhbGUubmljZSA9IGZ1bmN0aW9uKCkgewogICAgICBkM19zY2FsZV9uaWNlKGRvbWFpbiwgZDNfc2NhbGVfbGluZWFyTmljZSk7CiAgICAgIHJldHVybiByZXNjYWxlKCk7CiAgICB9OwogICAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gZDNfc2NhbGVfbGluZWFyKGRvbWFpbiwgcmFuZ2UsIGludGVycG9sYXRlLCBjbGFtcCk7CiAgICB9OwogICAgcmV0dXJuIHJlc2NhbGUoKTsKICB9CiAgZnVuY3Rpb24gZDNfc2NhbGVfbGluZWFyUmViaW5kKHNjYWxlLCBsaW5lYXIpIHsKICAgIHJldHVybiBkMy5yZWJpbmQoc2NhbGUsIGxpbmVhciwgInJhbmdlIiwgInJhbmdlUm91bmQiLCAiaW50ZXJwb2xhdGUiLCAiY2xhbXAiKTsKICB9CiAgZnVuY3Rpb24gZDNfc2NhbGVfbGluZWFyTmljZShkeCkgewogICAgZHggPSBNYXRoLnBvdygxMCwgTWF0aC5yb3VuZChNYXRoLmxvZyhkeCkgLyBNYXRoLkxOMTApIC0gMSk7CiAgICByZXR1cm4gZHggJiYgewogICAgICBmbG9vcjogZnVuY3Rpb24oeCkgewogICAgICAgIHJldHVybiBNYXRoLmZsb29yKHggLyBkeCkgKiBkeDsKICAgICAgfSwKICAgICAgY2VpbDogZnVuY3Rpb24oeCkgewogICAgICAgIHJldHVybiBNYXRoLmNlaWwoeCAvIGR4KSAqIGR4OwogICAgICB9CiAgICB9OwogIH0KICBmdW5jdGlvbiBkM19zY2FsZV9saW5lYXJUaWNrUmFuZ2UoZG9tYWluLCBtKSB7CiAgICB2YXIgZXh0ZW50ID0gZDNfc2NhbGVFeHRlbnQoZG9tYWluKSwgc3BhbiA9IGV4dGVudFsxXSAtIGV4dGVudFswXSwgc3RlcCA9IE1hdGgucG93KDEwLCBNYXRoLmZsb29yKE1hdGgubG9nKHNwYW4gLyBtKSAvIE1hdGguTE4xMCkpLCBlcnIgPSBtIC8gc3BhbiAqIHN0ZXA7CiAgICBpZiAoZXJyIDw9IC4xNSkgc3RlcCAqPSAxMDsgZWxzZSBpZiAoZXJyIDw9IC4zNSkgc3RlcCAqPSA1OyBlbHNlIGlmIChlcnIgPD0gLjc1KSBzdGVwICo9IDI7CiAgICBleHRlbnRbMF0gPSBNYXRoLmNlaWwoZXh0ZW50WzBdIC8gc3RlcCkgKiBzdGVwOwogICAgZXh0ZW50WzFdID0gTWF0aC5mbG9vcihleHRlbnRbMV0gLyBzdGVwKSAqIHN0ZXAgKyBzdGVwICogLjU7CiAgICBleHRlbnRbMl0gPSBzdGVwOwogICAgcmV0dXJuIGV4dGVudDsKICB9CiAgZnVuY3Rpb24gZDNfc2NhbGVfbGluZWFyVGlja3MoZG9tYWluLCBtKSB7CiAgICByZXR1cm4gZDMucmFuZ2UuYXBwbHkoZDMsIGQzX3NjYWxlX2xpbmVhclRpY2tSYW5nZShkb21haW4sIG0pKTsKICB9CiAgZnVuY3Rpb24gZDNfc2NhbGVfbGluZWFyVGlja0Zvcm1hdChkb21haW4sIG0sIGZvcm1hdCkgewogICAgdmFyIHByZWNpc2lvbiA9IC1NYXRoLmZsb29yKE1hdGgubG9nKGQzX3NjYWxlX2xpbmVhclRpY2tSYW5nZShkb21haW4sIG0pWzJdKSAvIE1hdGguTE4xMCArIC4wMSk7CiAgICByZXR1cm4gZDMuZm9ybWF0KGZvcm1hdCA/IGZvcm1hdC5yZXBsYWNlKGQzX2Zvcm1hdF9yZSwgZnVuY3Rpb24oYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaikgewogICAgICByZXR1cm4gWyBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpIHx8ICIuIiArIChwcmVjaXNpb24gLSAoaiA9PT0gIiUiKSAqIDIpLCBqIF0uam9pbigiIik7CiAgICB9KSA6ICIsLiIgKyBwcmVjaXNpb24gKyAiZiIpOwogIH0KICBkMy5zY2FsZS5sb2cgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBkM19zY2FsZV9sb2coZDMuc2NhbGUubGluZWFyKCkuZG9tYWluKFsgMCwgTWF0aC5MTjEwIF0pLCAxMCwgZDNfc2NhbGVfbG9ncCwgZDNfc2NhbGVfcG93cCwgWyAxLCAxMCBdKTsKICB9OwogIGZ1bmN0aW9uIGQzX3NjYWxlX2xvZyhsaW5lYXIsIGJhc2UsIGxvZywgcG93LCBkb21haW4pIHsKICAgIGZ1bmN0aW9uIHNjYWxlKHgpIHsKICAgICAgcmV0dXJuIGxpbmVhcihsb2coeCkpOwogICAgfQogICAgc2NhbGUuaW52ZXJ0ID0gZnVuY3Rpb24oeCkgewogICAgICByZXR1cm4gcG93KGxpbmVhci5pbnZlcnQoeCkpOwogICAgfTsKICAgIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKHgpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZG9tYWluOwogICAgICBpZiAoeFswXSA8IDApIGxvZyA9IGQzX3NjYWxlX2xvZ24sIHBvdyA9IGQzX3NjYWxlX3Bvd247IGVsc2UgbG9nID0gZDNfc2NhbGVfbG9ncCwgCiAgICAgIHBvdyA9IGQzX3NjYWxlX3Bvd3A7CiAgICAgIGxpbmVhci5kb21haW4oKGRvbWFpbiA9IHgubWFwKE51bWJlcikpLm1hcChsb2cpKTsKICAgICAgcmV0dXJuIHNjYWxlOwogICAgfTsKICAgIHNjYWxlLmJhc2UgPSBmdW5jdGlvbihfKSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGJhc2U7CiAgICAgIGJhc2UgPSArXzsKICAgICAgcmV0dXJuIHNjYWxlOwogICAgfTsKICAgIHNjYWxlLm5pY2UgPSBmdW5jdGlvbigpIHsKICAgICAgbGluZWFyLmRvbWFpbihkM19zY2FsZV9uaWNlKGRvbWFpbiwgbmljZSkubWFwKGxvZykpOwogICAgICByZXR1cm4gc2NhbGU7CiAgICB9OwogICAgc2NhbGUudGlja3MgPSBmdW5jdGlvbigpIHsKICAgICAgdmFyIGV4dGVudCA9IGQzX3NjYWxlRXh0ZW50KGxpbmVhci5kb21haW4oKSksIHRpY2tzID0gW107CiAgICAgIGlmIChleHRlbnQuZXZlcnkoaXNGaW5pdGUpKSB7CiAgICAgICAgdmFyIGIgPSBNYXRoLmxvZyhiYXNlKSwgaSA9IE1hdGguZmxvb3IoZXh0ZW50WzBdIC8gYiksIGogPSBNYXRoLmNlaWwoZXh0ZW50WzFdIC8gYiksIHUgPSBwb3coZXh0ZW50WzBdKSwgdiA9IHBvdyhleHRlbnRbMV0pLCBuID0gYmFzZSAlIDEgPyAyIDogYmFzZTsKICAgICAgICBpZiAobG9nID09PSBkM19zY2FsZV9sb2duKSB7CiAgICAgICAgICB0aWNrcy5wdXNoKC1NYXRoLnBvdyhiYXNlLCAtaSkpOwogICAgICAgICAgZm9yICg7aSsrIDwgajsgKSBmb3IgKHZhciBrID0gbiAtIDE7IGsgPiAwOyBrLS0pIHRpY2tzLnB1c2goLU1hdGgucG93KGJhc2UsIC1pKSAqIGspOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBmb3IgKDtpIDwgajsgaSsrKSBmb3IgKHZhciBrID0gMTsgayA8IG47IGsrKykgdGlja3MucHVzaChNYXRoLnBvdyhiYXNlLCBpKSAqIGspOwogICAgICAgICAgdGlja3MucHVzaChNYXRoLnBvdyhiYXNlLCBpKSk7CiAgICAgICAgfQogICAgICAgIGZvciAoaSA9IDA7IHRpY2tzW2ldIDwgdTsgaSsrKSB7fQogICAgICAgIGZvciAoaiA9IHRpY2tzLmxlbmd0aDsgdGlja3NbaiAtIDFdID4gdjsgai0tKSB7fQogICAgICAgIHRpY2tzID0gdGlja3Muc2xpY2UoaSwgaik7CiAgICAgIH0KICAgICAgcmV0dXJuIHRpY2tzOwogICAgfTsKICAgIHNjYWxlLnRpY2tGb3JtYXQgPSBmdW5jdGlvbihuLCBmb3JtYXQpIHsKICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSBmb3JtYXQgPSBkM19zY2FsZV9sb2dGb3JtYXQ7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGZvcm1hdDsKICAgICAgdmFyIGIgPSBNYXRoLmxvZyhiYXNlKSwgayA9IE1hdGgubWF4KC4xLCBuIC8gc2NhbGUudGlja3MoKS5sZW5ndGgpLCBmID0gbG9nID09PSBkM19zY2FsZV9sb2duID8gKGUgPSAtMWUtMTIsIAogICAgICBNYXRoLmZsb29yKSA6IChlID0gMWUtMTIsIE1hdGguY2VpbCksIGU7CiAgICAgIHJldHVybiBmdW5jdGlvbihkKSB7CiAgICAgICAgcmV0dXJuIGQgLyBwb3coYiAqIGYobG9nKGQpIC8gYiArIGUpKSA8PSBrID8gZm9ybWF0KGQpIDogIiI7CiAgICAgIH07CiAgICB9OwogICAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gZDNfc2NhbGVfbG9nKGxpbmVhci5jb3B5KCksIGJhc2UsIGxvZywgcG93LCBkb21haW4pOwogICAgfTsKICAgIGZ1bmN0aW9uIG5pY2UoKSB7CiAgICAgIHJldHVybiBsb2cgPT09IGQzX3NjYWxlX2xvZ3AgPyB7CiAgICAgICAgZmxvb3I6IGZsb29yLAogICAgICAgIGNlaWw6IGNlaWwKICAgICAgfSA6IHsKICAgICAgICBmbG9vcjogZnVuY3Rpb24oeCkgewogICAgICAgICAgcmV0dXJuIC1jZWlsKC14KTsKICAgICAgICB9LAogICAgICAgIGNlaWw6IGZ1bmN0aW9uKHgpIHsKICAgICAgICAgIHJldHVybiAtZmxvb3IoLXgpOwogICAgICAgIH0KICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGZsb29yKHgpIHsKICAgICAgcmV0dXJuIE1hdGgucG93KGJhc2UsIE1hdGguZmxvb3IoTWF0aC5sb2coeCkgLyBNYXRoLmxvZyhiYXNlKSkpOwogICAgfQogICAgZnVuY3Rpb24gY2VpbCh4KSB7CiAgICAgIHJldHVybiBNYXRoLnBvdyhiYXNlLCBNYXRoLmNlaWwoTWF0aC5sb2coeCkgLyBNYXRoLmxvZyhiYXNlKSkpOwogICAgfQogICAgcmV0dXJuIGQzX3NjYWxlX2xpbmVhclJlYmluZChzY2FsZSwgbGluZWFyKTsKICB9CiAgdmFyIGQzX3NjYWxlX2xvZ0Zvcm1hdCA9IGQzLmZvcm1hdCgiLjBlIik7CiAgZnVuY3Rpb24gZDNfc2NhbGVfbG9ncCh4KSB7CiAgICByZXR1cm4gTWF0aC5sb2coeCA8IDAgPyAwIDogeCk7CiAgfQogIGZ1bmN0aW9uIGQzX3NjYWxlX3Bvd3AoeCkgewogICAgcmV0dXJuIE1hdGguZXhwKHgpOwogIH0KICBmdW5jdGlvbiBkM19zY2FsZV9sb2duKHgpIHsKICAgIHJldHVybiAtTWF0aC5sb2coeCA+IDAgPyAwIDogLXgpOwogIH0KICBmdW5jdGlvbiBkM19zY2FsZV9wb3duKHgpIHsKICAgIHJldHVybiAtTWF0aC5leHAoLXgpOwogIH0KICBkMy5zY2FsZS5wb3cgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBkM19zY2FsZV9wb3coZDMuc2NhbGUubGluZWFyKCksIDEsIFsgMCwgMSBdKTsKICB9OwogIGZ1bmN0aW9uIGQzX3NjYWxlX3BvdyhsaW5lYXIsIGV4cG9uZW50LCBkb21haW4pIHsKICAgIHZhciBwb3dwID0gZDNfc2NhbGVfcG93UG93KGV4cG9uZW50KSwgcG93YiA9IGQzX3NjYWxlX3Bvd1BvdygxIC8gZXhwb25lbnQpOwogICAgZnVuY3Rpb24gc2NhbGUoeCkgewogICAgICByZXR1cm4gbGluZWFyKHBvd3AoeCkpOwogICAgfQogICAgc2NhbGUuaW52ZXJ0ID0gZnVuY3Rpb24oeCkgewogICAgICByZXR1cm4gcG93YihsaW5lYXIuaW52ZXJ0KHgpKTsKICAgIH07CiAgICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbih4KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGRvbWFpbjsKICAgICAgbGluZWFyLmRvbWFpbigoZG9tYWluID0geC5tYXAoTnVtYmVyKSkubWFwKHBvd3ApKTsKICAgICAgcmV0dXJuIHNjYWxlOwogICAgfTsKICAgIHNjYWxlLnRpY2tzID0gZnVuY3Rpb24obSkgewogICAgICByZXR1cm4gZDNfc2NhbGVfbGluZWFyVGlja3MoZG9tYWluLCBtKTsKICAgIH07CiAgICBzY2FsZS50aWNrRm9ybWF0ID0gZnVuY3Rpb24obSwgZm9ybWF0KSB7CiAgICAgIHJldHVybiBkM19zY2FsZV9saW5lYXJUaWNrRm9ybWF0KGRvbWFpbiwgbSwgZm9ybWF0KTsKICAgIH07CiAgICBzY2FsZS5uaWNlID0gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBzY2FsZS5kb21haW4oZDNfc2NhbGVfbmljZShkb21haW4sIGQzX3NjYWxlX2xpbmVhck5pY2UpKTsKICAgIH07CiAgICBzY2FsZS5leHBvbmVudCA9IGZ1bmN0aW9uKHgpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZXhwb25lbnQ7CiAgICAgIHBvd3AgPSBkM19zY2FsZV9wb3dQb3coZXhwb25lbnQgPSB4KTsKICAgICAgcG93YiA9IGQzX3NjYWxlX3Bvd1BvdygxIC8gZXhwb25lbnQpOwogICAgICBsaW5lYXIuZG9tYWluKGRvbWFpbi5tYXAocG93cCkpOwogICAgICByZXR1cm4gc2NhbGU7CiAgICB9OwogICAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gZDNfc2NhbGVfcG93KGxpbmVhci5jb3B5KCksIGV4cG9uZW50LCBkb21haW4pOwogICAgfTsKICAgIHJldHVybiBkM19zY2FsZV9saW5lYXJSZWJpbmQoc2NhbGUsIGxpbmVhcik7CiAgfQogIGZ1bmN0aW9uIGQzX3NjYWxlX3Bvd1BvdyhlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oeCkgewogICAgICByZXR1cm4geCA8IDAgPyAtTWF0aC5wb3coLXgsIGUpIDogTWF0aC5wb3coeCwgZSk7CiAgICB9OwogIH0KICBkMy5zY2FsZS5zcXJ0ID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gZDMuc2NhbGUucG93KCkuZXhwb25lbnQoLjUpOwogIH07CiAgZDMuc2NhbGUub3JkaW5hbCA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGQzX3NjYWxlX29yZGluYWwoW10sIHsKICAgICAgdDogInJhbmdlIiwKICAgICAgYTogWyBbXSBdCiAgICB9KTsKICB9OwogIGZ1bmN0aW9uIGQzX3NjYWxlX29yZGluYWwoZG9tYWluLCByYW5nZXIpIHsKICAgIHZhciBpbmRleCwgcmFuZ2UsIHJhbmdlQmFuZDsKICAgIGZ1bmN0aW9uIHNjYWxlKHgpIHsKICAgICAgcmV0dXJuIHJhbmdlWygoaW5kZXguZ2V0KHgpIHx8IGluZGV4LnNldCh4LCBkb21haW4ucHVzaCh4KSkpIC0gMSkgJSByYW5nZS5sZW5ndGhdOwogICAgfQogICAgZnVuY3Rpb24gc3RlcHMoc3RhcnQsIHN0ZXApIHsKICAgICAgcmV0dXJuIGQzLnJhbmdlKGRvbWFpbi5sZW5ndGgpLm1hcChmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHN0YXJ0ICsgc3RlcCAqIGk7CiAgICAgIH0pOwogICAgfQogICAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oeCkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBkb21haW47CiAgICAgIGRvbWFpbiA9IFtdOwogICAgICBpbmRleCA9IG5ldyBkM19NYXAoKTsKICAgICAgdmFyIGkgPSAtMSwgbiA9IHgubGVuZ3RoLCB4aTsKICAgICAgd2hpbGUgKCsraSA8IG4pIGlmICghaW5kZXguaGFzKHhpID0geFtpXSkpIGluZGV4LnNldCh4aSwgZG9tYWluLnB1c2goeGkpKTsKICAgICAgcmV0dXJuIHNjYWxlW3Jhbmdlci50XS5hcHBseShzY2FsZSwgcmFuZ2VyLmEpOwogICAgfTsKICAgIHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oeCkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiByYW5nZTsKICAgICAgcmFuZ2UgPSB4OwogICAgICByYW5nZUJhbmQgPSAwOwogICAgICByYW5nZXIgPSB7CiAgICAgICAgdDogInJhbmdlIiwKICAgICAgICBhOiBhcmd1bWVudHMKICAgICAgfTsKICAgICAgcmV0dXJuIHNjYWxlOwogICAgfTsKICAgIHNjYWxlLnJhbmdlUG9pbnRzID0gZnVuY3Rpb24oeCwgcGFkZGluZykgewogICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHBhZGRpbmcgPSAwOwogICAgICB2YXIgc3RhcnQgPSB4WzBdLCBzdG9wID0geFsxXSwgc3RlcCA9IChzdG9wIC0gc3RhcnQpIC8gKE1hdGgubWF4KDEsIGRvbWFpbi5sZW5ndGggLSAxKSArIHBhZGRpbmcpOwogICAgICByYW5nZSA9IHN0ZXBzKGRvbWFpbi5sZW5ndGggPCAyID8gKHN0YXJ0ICsgc3RvcCkgLyAyIDogc3RhcnQgKyBzdGVwICogcGFkZGluZyAvIDIsIHN0ZXApOwogICAgICByYW5nZUJhbmQgPSAwOwogICAgICByYW5nZXIgPSB7CiAgICAgICAgdDogInJhbmdlUG9pbnRzIiwKICAgICAgICBhOiBhcmd1bWVudHMKICAgICAgfTsKICAgICAgcmV0dXJuIHNjYWxlOwogICAgfTsKICAgIHNjYWxlLnJhbmdlQmFuZHMgPSBmdW5jdGlvbih4LCBwYWRkaW5nLCBvdXRlclBhZGRpbmcpIHsKICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSBwYWRkaW5nID0gMDsKICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSBvdXRlclBhZGRpbmcgPSBwYWRkaW5nOwogICAgICB2YXIgcmV2ZXJzZSA9IHhbMV0gPCB4WzBdLCBzdGFydCA9IHhbcmV2ZXJzZSAtIDBdLCBzdG9wID0geFsxIC0gcmV2ZXJzZV0sIHN0ZXAgPSAoc3RvcCAtIHN0YXJ0KSAvIChkb21haW4ubGVuZ3RoIC0gcGFkZGluZyArIDIgKiBvdXRlclBhZGRpbmcpOwogICAgICByYW5nZSA9IHN0ZXBzKHN0YXJ0ICsgc3RlcCAqIG91dGVyUGFkZGluZywgc3RlcCk7CiAgICAgIGlmIChyZXZlcnNlKSByYW5nZS5yZXZlcnNlKCk7CiAgICAgIHJhbmdlQmFuZCA9IHN0ZXAgKiAoMSAtIHBhZGRpbmcpOwogICAgICByYW5nZXIgPSB7CiAgICAgICAgdDogInJhbmdlQmFuZHMiLAogICAgICAgIGE6IGFyZ3VtZW50cwogICAgICB9OwogICAgICByZXR1cm4gc2NhbGU7CiAgICB9OwogICAgc2NhbGUucmFuZ2VSb3VuZEJhbmRzID0gZnVuY3Rpb24oeCwgcGFkZGluZywgb3V0ZXJQYWRkaW5nKSB7CiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcGFkZGluZyA9IDA7CiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMykgb3V0ZXJQYWRkaW5nID0gcGFkZGluZzsKICAgICAgdmFyIHJldmVyc2UgPSB4WzFdIDwgeFswXSwgc3RhcnQgPSB4W3JldmVyc2UgLSAwXSwgc3RvcCA9IHhbMSAtIHJldmVyc2VdLCBzdGVwID0gTWF0aC5mbG9vcigoc3RvcCAtIHN0YXJ0KSAvIChkb21haW4ubGVuZ3RoIC0gcGFkZGluZyArIDIgKiBvdXRlclBhZGRpbmcpKSwgZXJyb3IgPSBzdG9wIC0gc3RhcnQgLSAoZG9tYWluLmxlbmd0aCAtIHBhZGRpbmcpICogc3RlcDsKICAgICAgcmFuZ2UgPSBzdGVwcyhzdGFydCArIE1hdGgucm91bmQoZXJyb3IgLyAyKSwgc3RlcCk7CiAgICAgIGlmIChyZXZlcnNlKSByYW5nZS5yZXZlcnNlKCk7CiAgICAgIHJhbmdlQmFuZCA9IE1hdGgucm91bmQoc3RlcCAqICgxIC0gcGFkZGluZykpOwogICAgICByYW5nZXIgPSB7CiAgICAgICAgdDogInJhbmdlUm91bmRCYW5kcyIsCiAgICAgICAgYTogYXJndW1lbnRzCiAgICAgIH07CiAgICAgIHJldHVybiBzY2FsZTsKICAgIH07CiAgICBzY2FsZS5yYW5nZUJhbmQgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHJhbmdlQmFuZDsKICAgIH07CiAgICBzY2FsZS5yYW5nZUV4dGVudCA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gZDNfc2NhbGVFeHRlbnQocmFuZ2VyLmFbMF0pOwogICAgfTsKICAgIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGQzX3NjYWxlX29yZGluYWwoZG9tYWluLCByYW5nZXIpOwogICAgfTsKICAgIHJldHVybiBzY2FsZS5kb21haW4oZG9tYWluKTsKICB9CiAgZDMuc2NhbGUuY2F0ZWdvcnkxMCA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGQzLnNjYWxlLm9yZGluYWwoKS5yYW5nZShkM19jYXRlZ29yeTEwKTsKICB9OwogIGQzLnNjYWxlLmNhdGVnb3J5MjAgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBkMy5zY2FsZS5vcmRpbmFsKCkucmFuZ2UoZDNfY2F0ZWdvcnkyMCk7CiAgfTsKICBkMy5zY2FsZS5jYXRlZ29yeTIwYiA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGQzLnNjYWxlLm9yZGluYWwoKS5yYW5nZShkM19jYXRlZ29yeTIwYik7CiAgfTsKICBkMy5zY2FsZS5jYXRlZ29yeTIwYyA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGQzLnNjYWxlLm9yZGluYWwoKS5yYW5nZShkM19jYXRlZ29yeTIwYyk7CiAgfTsKICB2YXIgZDNfY2F0ZWdvcnkxMCA9IFsgIiMxZjc3YjQiLCAiI2ZmN2YwZSIsICIjMmNhMDJjIiwgIiNkNjI3MjgiLCAiIzk0NjdiZCIsICIjOGM1NjRiIiwgIiNlMzc3YzIiLCAiIzdmN2Y3ZiIsICIjYmNiZDIyIiwgIiMxN2JlY2YiIF07CiAgdmFyIGQzX2NhdGVnb3J5MjAgPSBbICIjMWY3N2I0IiwgIiNhZWM3ZTgiLCAiI2ZmN2YwZSIsICIjZmZiYjc4IiwgIiMyY2EwMmMiLCAiIzk4ZGY4YSIsICIjZDYyNzI4IiwgIiNmZjk4OTYiLCAiIzk0NjdiZCIsICIjYzViMGQ1IiwgIiM4YzU2NGIiLCAiI2M0OWM5NCIsICIjZTM3N2MyIiwgIiNmN2I2ZDIiLCAiIzdmN2Y3ZiIsICIjYzdjN2M3IiwgIiNiY2JkMjIiLCAiI2RiZGI4ZCIsICIjMTdiZWNmIiwgIiM5ZWRhZTUiIF07CiAgdmFyIGQzX2NhdGVnb3J5MjBiID0gWyAiIzM5M2I3OSIsICIjNTI1NGEzIiwgIiM2YjZlY2YiLCAiIzljOWVkZSIsICIjNjM3OTM5IiwgIiM4Y2EyNTIiLCAiI2I1Y2Y2YiIsICIjY2VkYjljIiwgIiM4YzZkMzEiLCAiI2JkOWUzOSIsICIjZTdiYTUyIiwgIiNlN2NiOTQiLCAiIzg0M2MzOSIsICIjYWQ0OTRhIiwgIiNkNjYxNmIiLCAiI2U3OTY5YyIsICIjN2I0MTczIiwgIiNhNTUxOTQiLCAiI2NlNmRiZCIsICIjZGU5ZWQ2IiBdOwogIHZhciBkM19jYXRlZ29yeTIwYyA9IFsgIiMzMTgyYmQiLCAiIzZiYWVkNiIsICIjOWVjYWUxIiwgIiNjNmRiZWYiLCAiI2U2NTUwZCIsICIjZmQ4ZDNjIiwgIiNmZGFlNmIiLCAiI2ZkZDBhMiIsICIjMzFhMzU0IiwgIiM3NGM0NzYiLCAiI2ExZDk5YiIsICIjYzdlOWMwIiwgIiM3NTZiYjEiLCAiIzllOWFjOCIsICIjYmNiZGRjIiwgIiNkYWRhZWIiLCAiIzYzNjM2MyIsICIjOTY5Njk2IiwgIiNiZGJkYmQiLCAiI2Q5ZDlkOSIgXTsKICBkMy5zY2FsZS5xdWFudGlsZSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGQzX3NjYWxlX3F1YW50aWxlKFtdLCBbXSk7CiAgfTsKICBmdW5jdGlvbiBkM19zY2FsZV9xdWFudGlsZShkb21haW4sIHJhbmdlKSB7CiAgICB2YXIgdGhyZXNob2xkczsKICAgIGZ1bmN0aW9uIHJlc2NhbGUoKSB7CiAgICAgIHZhciBrID0gMCwgcSA9IHJhbmdlLmxlbmd0aDsKICAgICAgdGhyZXNob2xkcyA9IFtdOwogICAgICB3aGlsZSAoKytrIDwgcSkgdGhyZXNob2xkc1trIC0gMV0gPSBkMy5xdWFudGlsZShkb21haW4sIGsgLyBxKTsKICAgICAgcmV0dXJuIHNjYWxlOwogICAgfQogICAgZnVuY3Rpb24gc2NhbGUoeCkgewogICAgICBpZiAoaXNOYU4oeCA9ICt4KSkgcmV0dXJuIE5hTjsKICAgICAgcmV0dXJuIHJhbmdlW2QzLmJpc2VjdCh0aHJlc2hvbGRzLCB4KV07CiAgICB9CiAgICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbih4KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGRvbWFpbjsKICAgICAgZG9tYWluID0geC5maWx0ZXIoZnVuY3Rpb24oZCkgewogICAgICAgIHJldHVybiAhaXNOYU4oZCk7CiAgICAgIH0pLnNvcnQoZDMuYXNjZW5kaW5nKTsKICAgICAgcmV0dXJuIHJlc2NhbGUoKTsKICAgIH07CiAgICBzY2FsZS5yYW5nZSA9IGZ1bmN0aW9uKHgpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcmFuZ2U7CiAgICAgIHJhbmdlID0geDsKICAgICAgcmV0dXJuIHJlc2NhbGUoKTsKICAgIH07CiAgICBzY2FsZS5xdWFudGlsZXMgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRocmVzaG9sZHM7CiAgICB9OwogICAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gZDNfc2NhbGVfcXVhbnRpbGUoZG9tYWluLCByYW5nZSk7CiAgICB9OwogICAgcmV0dXJuIHJlc2NhbGUoKTsKICB9CiAgZDMuc2NhbGUucXVhbnRpemUgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBkM19zY2FsZV9xdWFudGl6ZSgwLCAxLCBbIDAsIDEgXSk7CiAgfTsKICBmdW5jdGlvbiBkM19zY2FsZV9xdWFudGl6ZSh4MCwgeDEsIHJhbmdlKSB7CiAgICB2YXIga3gsIGk7CiAgICBmdW5jdGlvbiBzY2FsZSh4KSB7CiAgICAgIHJldHVybiByYW5nZVtNYXRoLm1heCgwLCBNYXRoLm1pbihpLCBNYXRoLmZsb29yKGt4ICogKHggLSB4MCkpKSldOwogICAgfQogICAgZnVuY3Rpb24gcmVzY2FsZSgpIHsKICAgICAga3ggPSByYW5nZS5sZW5ndGggLyAoeDEgLSB4MCk7CiAgICAgIGkgPSByYW5nZS5sZW5ndGggLSAxOwogICAgICByZXR1cm4gc2NhbGU7CiAgICB9CiAgICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbih4KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIFsgeDAsIHgxIF07CiAgICAgIHgwID0gK3hbMF07CiAgICAgIHgxID0gK3hbeC5sZW5ndGggLSAxXTsKICAgICAgcmV0dXJuIHJlc2NhbGUoKTsKICAgIH07CiAgICBzY2FsZS5yYW5nZSA9IGZ1bmN0aW9uKHgpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcmFuZ2U7CiAgICAgIHJhbmdlID0geDsKICAgICAgcmV0dXJuIHJlc2NhbGUoKTsKICAgIH07CiAgICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBkM19zY2FsZV9xdWFudGl6ZSh4MCwgeDEsIHJhbmdlKTsKICAgIH07CiAgICByZXR1cm4gcmVzY2FsZSgpOwogIH0KICBkMy5zY2FsZS50aHJlc2hvbGQgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBkM19zY2FsZV90aHJlc2hvbGQoWyAuNSBdLCBbIDAsIDEgXSk7CiAgfTsKICBmdW5jdGlvbiBkM19zY2FsZV90aHJlc2hvbGQoZG9tYWluLCByYW5nZSkgewogICAgZnVuY3Rpb24gc2NhbGUoeCkgewogICAgICByZXR1cm4gcmFuZ2VbZDMuYmlzZWN0KGRvbWFpbiwgeCldOwogICAgfQogICAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oXykgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBkb21haW47CiAgICAgIGRvbWFpbiA9IF87CiAgICAgIHJldHVybiBzY2FsZTsKICAgIH07CiAgICBzY2FsZS5yYW5nZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcmFuZ2U7CiAgICAgIHJhbmdlID0gXzsKICAgICAgcmV0dXJuIHNjYWxlOwogICAgfTsKICAgIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGQzX3NjYWxlX3RocmVzaG9sZChkb21haW4sIHJhbmdlKTsKICAgIH07CiAgICByZXR1cm4gc2NhbGU7CiAgfQogIGQzLnNjYWxlLmlkZW50aXR5ID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gZDNfc2NhbGVfaWRlbnRpdHkoWyAwLCAxIF0pOwogIH07CiAgZnVuY3Rpb24gZDNfc2NhbGVfaWRlbnRpdHkoZG9tYWluKSB7CiAgICBmdW5jdGlvbiBpZGVudGl0eSh4KSB7CiAgICAgIHJldHVybiAreDsKICAgIH0KICAgIGlkZW50aXR5LmludmVydCA9IGlkZW50aXR5OwogICAgaWRlbnRpdHkuZG9tYWluID0gaWRlbnRpdHkucmFuZ2UgPSBmdW5jdGlvbih4KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGRvbWFpbjsKICAgICAgZG9tYWluID0geC5tYXAoaWRlbnRpdHkpOwogICAgICByZXR1cm4gaWRlbnRpdHk7CiAgICB9OwogICAgaWRlbnRpdHkudGlja3MgPSBmdW5jdGlvbihtKSB7CiAgICAgIHJldHVybiBkM19zY2FsZV9saW5lYXJUaWNrcyhkb21haW4sIG0pOwogICAgfTsKICAgIGlkZW50aXR5LnRpY2tGb3JtYXQgPSBmdW5jdGlvbihtLCBmb3JtYXQpIHsKICAgICAgcmV0dXJuIGQzX3NjYWxlX2xpbmVhclRpY2tGb3JtYXQoZG9tYWluLCBtLCBmb3JtYXQpOwogICAgfTsKICAgIGlkZW50aXR5LmNvcHkgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGQzX3NjYWxlX2lkZW50aXR5KGRvbWFpbik7CiAgICB9OwogICAgcmV0dXJuIGlkZW50aXR5OwogIH0KICBkMy5zdmcuYXJjID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgaW5uZXJSYWRpdXMgPSBkM19zdmdfYXJjSW5uZXJSYWRpdXMsIG91dGVyUmFkaXVzID0gZDNfc3ZnX2FyY091dGVyUmFkaXVzLCBzdGFydEFuZ2xlID0gZDNfc3ZnX2FyY1N0YXJ0QW5nbGUsIGVuZEFuZ2xlID0gZDNfc3ZnX2FyY0VuZEFuZ2xlOwogICAgZnVuY3Rpb24gYXJjKCkgewogICAgICB2YXIgcjAgPSBpbm5lclJhZGl1cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCByMSA9IG91dGVyUmFkaXVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIGEwID0gc3RhcnRBbmdsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpICsgZDNfc3ZnX2FyY09mZnNldCwgYTEgPSBlbmRBbmdsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpICsgZDNfc3ZnX2FyY09mZnNldCwgZGEgPSAoYTEgPCBhMCAmJiAoZGEgPSBhMCwgCiAgICAgIGEwID0gYTEsIGExID0gZGEpLCBhMSAtIGEwKSwgZGYgPSBkYSA8IM+AID8gIjAiIDogIjEiLCBjMCA9IE1hdGguY29zKGEwKSwgczAgPSBNYXRoLnNpbihhMCksIGMxID0gTWF0aC5jb3MoYTEpLCBzMSA9IE1hdGguc2luKGExKTsKICAgICAgcmV0dXJuIGRhID49IGQzX3N2Z19hcmNNYXggPyByMCA/ICJNMCwiICsgcjEgKyAiQSIgKyByMSArICIsIiArIHIxICsgIiAwIDEsMSAwLCIgKyAtcjEgKyAiQSIgKyByMSArICIsIiArIHIxICsgIiAwIDEsMSAwLCIgKyByMSArICJNMCwiICsgcjAgKyAiQSIgKyByMCArICIsIiArIHIwICsgIiAwIDEsMCAwLCIgKyAtcjAgKyAiQSIgKyByMCArICIsIiArIHIwICsgIiAwIDEsMCAwLCIgKyByMCArICJaIiA6ICJNMCwiICsgcjEgKyAiQSIgKyByMSArICIsIiArIHIxICsgIiAwIDEsMSAwLCIgKyAtcjEgKyAiQSIgKyByMSArICIsIiArIHIxICsgIiAwIDEsMSAwLCIgKyByMSArICJaIiA6IHIwID8gIk0iICsgcjEgKiBjMCArICIsIiArIHIxICogczAgKyAiQSIgKyByMSArICIsIiArIHIxICsgIiAwICIgKyBkZiArICIsMSAiICsgcjEgKiBjMSArICIsIiArIHIxICogczEgKyAiTCIgKyByMCAqIGMxICsgIiwiICsgcjAgKiBzMSArICJBIiArIHIwICsgIiwiICsgcjAgKyAiIDAgIiArIGRmICsgIiwwICIgKyByMCAqIGMwICsgIiwiICsgcjAgKiBzMCArICJaIiA6ICJNIiArIHIxICogYzAgKyAiLCIgKyByMSAqIHMwICsgIkEiICsgcjEgKyAiLCIgKyByMSArICIgMCAiICsgZGYgKyAiLDEgIiArIHIxICogYzEgKyAiLCIgKyByMSAqIHMxICsgIkwwLDAiICsgIloiOwogICAgfQogICAgYXJjLmlubmVyUmFkaXVzID0gZnVuY3Rpb24odikgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBpbm5lclJhZGl1czsKICAgICAgaW5uZXJSYWRpdXMgPSBkM19mdW5jdG9yKHYpOwogICAgICByZXR1cm4gYXJjOwogICAgfTsKICAgIGFyYy5vdXRlclJhZGl1cyA9IGZ1bmN0aW9uKHYpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gb3V0ZXJSYWRpdXM7CiAgICAgIG91dGVyUmFkaXVzID0gZDNfZnVuY3Rvcih2KTsKICAgICAgcmV0dXJuIGFyYzsKICAgIH07CiAgICBhcmMuc3RhcnRBbmdsZSA9IGZ1bmN0aW9uKHYpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc3RhcnRBbmdsZTsKICAgICAgc3RhcnRBbmdsZSA9IGQzX2Z1bmN0b3Iodik7CiAgICAgIHJldHVybiBhcmM7CiAgICB9OwogICAgYXJjLmVuZEFuZ2xlID0gZnVuY3Rpb24odikgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBlbmRBbmdsZTsKICAgICAgZW5kQW5nbGUgPSBkM19mdW5jdG9yKHYpOwogICAgICByZXR1cm4gYXJjOwogICAgfTsKICAgIGFyYy5jZW50cm9pZCA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgciA9IChpbm5lclJhZGl1cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpICsgb3V0ZXJSYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSkgLyAyLCBhID0gKHN0YXJ0QW5nbGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSArIGVuZEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIC8gMiArIGQzX3N2Z19hcmNPZmZzZXQ7CiAgICAgIHJldHVybiBbIE1hdGguY29zKGEpICogciwgTWF0aC5zaW4oYSkgKiByIF07CiAgICB9OwogICAgcmV0dXJuIGFyYzsKICB9OwogIHZhciBkM19zdmdfYXJjT2Zmc2V0ID0gLc+AIC8gMiwgZDNfc3ZnX2FyY01heCA9IDIgKiDPgCAtIDFlLTY7CiAgZnVuY3Rpb24gZDNfc3ZnX2FyY0lubmVyUmFkaXVzKGQpIHsKICAgIHJldHVybiBkLmlubmVyUmFkaXVzOwogIH0KICBmdW5jdGlvbiBkM19zdmdfYXJjT3V0ZXJSYWRpdXMoZCkgewogICAgcmV0dXJuIGQub3V0ZXJSYWRpdXM7CiAgfQogIGZ1bmN0aW9uIGQzX3N2Z19hcmNTdGFydEFuZ2xlKGQpIHsKICAgIHJldHVybiBkLnN0YXJ0QW5nbGU7CiAgfQogIGZ1bmN0aW9uIGQzX3N2Z19hcmNFbmRBbmdsZShkKSB7CiAgICByZXR1cm4gZC5lbmRBbmdsZTsKICB9CiAgZDMuc3ZnLmxpbmUucmFkaWFsID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgbGluZSA9IGQzX3N2Z19saW5lKGQzX3N2Z19saW5lUmFkaWFsKTsKICAgIGxpbmUucmFkaXVzID0gbGluZS54LCBkZWxldGUgbGluZS54OwogICAgbGluZS5hbmdsZSA9IGxpbmUueSwgZGVsZXRlIGxpbmUueTsKICAgIHJldHVybiBsaW5lOwogIH07CiAgZnVuY3Rpb24gZDNfc3ZnX2xpbmVSYWRpYWwocG9pbnRzKSB7CiAgICB2YXIgcG9pbnQsIGkgPSAtMSwgbiA9IHBvaW50cy5sZW5ndGgsIHIsIGE7CiAgICB3aGlsZSAoKytpIDwgbikgewogICAgICBwb2ludCA9IHBvaW50c1tpXTsKICAgICAgciA9IHBvaW50WzBdOwogICAgICBhID0gcG9pbnRbMV0gKyBkM19zdmdfYXJjT2Zmc2V0OwogICAgICBwb2ludFswXSA9IHIgKiBNYXRoLmNvcyhhKTsKICAgICAgcG9pbnRbMV0gPSByICogTWF0aC5zaW4oYSk7CiAgICB9CiAgICByZXR1cm4gcG9pbnRzOwogIH0KICBmdW5jdGlvbiBkM19zdmdfYXJlYShwcm9qZWN0aW9uKSB7CiAgICB2YXIgeDAgPSBkM19zdmdfbGluZVgsIHgxID0gZDNfc3ZnX2xpbmVYLCB5MCA9IDAsIHkxID0gZDNfc3ZnX2xpbmVZLCBkZWZpbmVkID0gZDNfdHJ1ZSwgaW50ZXJwb2xhdGUgPSBkM19zdmdfbGluZUxpbmVhciwgaW50ZXJwb2xhdGVLZXkgPSBpbnRlcnBvbGF0ZS5rZXksIGludGVycG9sYXRlUmV2ZXJzZSA9IGludGVycG9sYXRlLCBMID0gIkwiLCB0ZW5zaW9uID0gLjc7CiAgICBmdW5jdGlvbiBhcmVhKGRhdGEpIHsKICAgICAgdmFyIHNlZ21lbnRzID0gW10sIHBvaW50czAgPSBbXSwgcG9pbnRzMSA9IFtdLCBpID0gLTEsIG4gPSBkYXRhLmxlbmd0aCwgZCwgZngwID0gZDNfZnVuY3Rvcih4MCksIGZ5MCA9IGQzX2Z1bmN0b3IoeTApLCBmeDEgPSB4MCA9PT0geDEgPyBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4geDsKICAgICAgfSA6IGQzX2Z1bmN0b3IoeDEpLCBmeTEgPSB5MCA9PT0geTEgPyBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4geTsKICAgICAgfSA6IGQzX2Z1bmN0b3IoeTEpLCB4LCB5OwogICAgICBmdW5jdGlvbiBzZWdtZW50KCkgewogICAgICAgIHNlZ21lbnRzLnB1c2goIk0iLCBpbnRlcnBvbGF0ZShwcm9qZWN0aW9uKHBvaW50czEpLCB0ZW5zaW9uKSwgTCwgaW50ZXJwb2xhdGVSZXZlcnNlKHByb2plY3Rpb24ocG9pbnRzMC5yZXZlcnNlKCkpLCB0ZW5zaW9uKSwgIloiKTsKICAgICAgfQogICAgICB3aGlsZSAoKytpIDwgbikgewogICAgICAgIGlmIChkZWZpbmVkLmNhbGwodGhpcywgZCA9IGRhdGFbaV0sIGkpKSB7CiAgICAgICAgICBwb2ludHMwLnB1c2goWyB4ID0gK2Z4MC5jYWxsKHRoaXMsIGQsIGkpLCB5ID0gK2Z5MC5jYWxsKHRoaXMsIGQsIGkpIF0pOwogICAgICAgICAgcG9pbnRzMS5wdXNoKFsgK2Z4MS5jYWxsKHRoaXMsIGQsIGkpLCArZnkxLmNhbGwodGhpcywgZCwgaSkgXSk7CiAgICAgICAgfSBlbHNlIGlmIChwb2ludHMwLmxlbmd0aCkgewogICAgICAgICAgc2VnbWVudCgpOwogICAgICAgICAgcG9pbnRzMCA9IFtdOwogICAgICAgICAgcG9pbnRzMSA9IFtdOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAocG9pbnRzMC5sZW5ndGgpIHNlZ21lbnQoKTsKICAgICAgcmV0dXJuIHNlZ21lbnRzLmxlbmd0aCA/IHNlZ21lbnRzLmpvaW4oIiIpIDogbnVsbDsKICAgIH0KICAgIGFyZWEueCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4geDE7CiAgICAgIHgwID0geDEgPSBfOwogICAgICByZXR1cm4gYXJlYTsKICAgIH07CiAgICBhcmVhLngwID0gZnVuY3Rpb24oXykgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB4MDsKICAgICAgeDAgPSBfOwogICAgICByZXR1cm4gYXJlYTsKICAgIH07CiAgICBhcmVhLngxID0gZnVuY3Rpb24oXykgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB4MTsKICAgICAgeDEgPSBfOwogICAgICByZXR1cm4gYXJlYTsKICAgIH07CiAgICBhcmVhLnkgPSBmdW5jdGlvbihfKSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHkxOwogICAgICB5MCA9IHkxID0gXzsKICAgICAgcmV0dXJuIGFyZWE7CiAgICB9OwogICAgYXJlYS55MCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4geTA7CiAgICAgIHkwID0gXzsKICAgICAgcmV0dXJuIGFyZWE7CiAgICB9OwogICAgYXJlYS55MSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4geTE7CiAgICAgIHkxID0gXzsKICAgICAgcmV0dXJuIGFyZWE7CiAgICB9OwogICAgYXJlYS5kZWZpbmVkID0gZnVuY3Rpb24oXykgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBkZWZpbmVkOwogICAgICBkZWZpbmVkID0gXzsKICAgICAgcmV0dXJuIGFyZWE7CiAgICB9OwogICAgYXJlYS5pbnRlcnBvbGF0ZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gaW50ZXJwb2xhdGVLZXk7CiAgICAgIGlmICh0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIikgaW50ZXJwb2xhdGVLZXkgPSBpbnRlcnBvbGF0ZSA9IF87IGVsc2UgaW50ZXJwb2xhdGVLZXkgPSAoaW50ZXJwb2xhdGUgPSBkM19zdmdfbGluZUludGVycG9sYXRvcnMuZ2V0KF8pIHx8IGQzX3N2Z19saW5lTGluZWFyKS5rZXk7CiAgICAgIGludGVycG9sYXRlUmV2ZXJzZSA9IGludGVycG9sYXRlLnJldmVyc2UgfHwgaW50ZXJwb2xhdGU7CiAgICAgIEwgPSBpbnRlcnBvbGF0ZS5jbG9zZWQgPyAiTSIgOiAiTCI7CiAgICAgIHJldHVybiBhcmVhOwogICAgfTsKICAgIGFyZWEudGVuc2lvbiA9IGZ1bmN0aW9uKF8pIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdGVuc2lvbjsKICAgICAgdGVuc2lvbiA9IF87CiAgICAgIHJldHVybiBhcmVhOwogICAgfTsKICAgIHJldHVybiBhcmVhOwogIH0KICBkM19zdmdfbGluZVN0ZXBCZWZvcmUucmV2ZXJzZSA9IGQzX3N2Z19saW5lU3RlcEFmdGVyOwogIGQzX3N2Z19saW5lU3RlcEFmdGVyLnJldmVyc2UgPSBkM19zdmdfbGluZVN0ZXBCZWZvcmU7CiAgZDMuc3ZnLmFyZWEgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBkM19zdmdfYXJlYShkM19pZGVudGl0eSk7CiAgfTsKICBkMy5zdmcuYXJlYS5yYWRpYWwgPSBmdW5jdGlvbigpIHsKICAgIHZhciBhcmVhID0gZDNfc3ZnX2FyZWEoZDNfc3ZnX2xpbmVSYWRpYWwpOwogICAgYXJlYS5yYWRpdXMgPSBhcmVhLngsIGRlbGV0ZSBhcmVhLng7CiAgICBhcmVhLmlubmVyUmFkaXVzID0gYXJlYS54MCwgZGVsZXRlIGFyZWEueDA7CiAgICBhcmVhLm91dGVyUmFkaXVzID0gYXJlYS54MSwgZGVsZXRlIGFyZWEueDE7CiAgICBhcmVhLmFuZ2xlID0gYXJlYS55LCBkZWxldGUgYXJlYS55OwogICAgYXJlYS5zdGFydEFuZ2xlID0gYXJlYS55MCwgZGVsZXRlIGFyZWEueTA7CiAgICBhcmVhLmVuZEFuZ2xlID0gYXJlYS55MSwgZGVsZXRlIGFyZWEueTE7CiAgICByZXR1cm4gYXJlYTsKICB9OwogIGQzLnN2Zy5jaG9yZCA9IGZ1bmN0aW9uKCkgewogICAgdmFyIHNvdXJjZSA9IGQzX3NvdXJjZSwgdGFyZ2V0ID0gZDNfdGFyZ2V0LCByYWRpdXMgPSBkM19zdmdfY2hvcmRSYWRpdXMsIHN0YXJ0QW5nbGUgPSBkM19zdmdfYXJjU3RhcnRBbmdsZSwgZW5kQW5nbGUgPSBkM19zdmdfYXJjRW5kQW5nbGU7CiAgICBmdW5jdGlvbiBjaG9yZChkLCBpKSB7CiAgICAgIHZhciBzID0gc3ViZ3JvdXAodGhpcywgc291cmNlLCBkLCBpKSwgdCA9IHN1Ymdyb3VwKHRoaXMsIHRhcmdldCwgZCwgaSk7CiAgICAgIHJldHVybiAiTSIgKyBzLnAwICsgYXJjKHMuciwgcy5wMSwgcy5hMSAtIHMuYTApICsgKGVxdWFscyhzLCB0KSA/IGN1cnZlKHMuciwgcy5wMSwgcy5yLCBzLnAwKSA6IGN1cnZlKHMuciwgcy5wMSwgdC5yLCB0LnAwKSArIGFyYyh0LnIsIHQucDEsIHQuYTEgLSB0LmEwKSArIGN1cnZlKHQuciwgdC5wMSwgcy5yLCBzLnAwKSkgKyAiWiI7CiAgICB9CiAgICBmdW5jdGlvbiBzdWJncm91cChzZWxmLCBmLCBkLCBpKSB7CiAgICAgIHZhciBzdWJncm91cCA9IGYuY2FsbChzZWxmLCBkLCBpKSwgciA9IHJhZGl1cy5jYWxsKHNlbGYsIHN1Ymdyb3VwLCBpKSwgYTAgPSBzdGFydEFuZ2xlLmNhbGwoc2VsZiwgc3ViZ3JvdXAsIGkpICsgZDNfc3ZnX2FyY09mZnNldCwgYTEgPSBlbmRBbmdsZS5jYWxsKHNlbGYsIHN1Ymdyb3VwLCBpKSArIGQzX3N2Z19hcmNPZmZzZXQ7CiAgICAgIHJldHVybiB7CiAgICAgICAgcjogciwKICAgICAgICBhMDogYTAsCiAgICAgICAgYTE6IGExLAogICAgICAgIHAwOiBbIHIgKiBNYXRoLmNvcyhhMCksIHIgKiBNYXRoLnNpbihhMCkgXSwKICAgICAgICBwMTogWyByICogTWF0aC5jb3MoYTEpLCByICogTWF0aC5zaW4oYTEpIF0KICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGVxdWFscyhhLCBiKSB7CiAgICAgIHJldHVybiBhLmEwID09IGIuYTAgJiYgYS5hMSA9PSBiLmExOwogICAgfQogICAgZnVuY3Rpb24gYXJjKHIsIHAsIGEpIHsKICAgICAgcmV0dXJuICJBIiArIHIgKyAiLCIgKyByICsgIiAwICIgKyArKGEgPiDPgCkgKyAiLDEgIiArIHA7CiAgICB9CiAgICBmdW5jdGlvbiBjdXJ2ZShyMCwgcDAsIHIxLCBwMSkgewogICAgICByZXR1cm4gIlEgMCwwICIgKyBwMTsKICAgIH0KICAgIGNob3JkLnJhZGl1cyA9IGZ1bmN0aW9uKHYpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcmFkaXVzOwogICAgICByYWRpdXMgPSBkM19mdW5jdG9yKHYpOwogICAgICByZXR1cm4gY2hvcmQ7CiAgICB9OwogICAgY2hvcmQuc291cmNlID0gZnVuY3Rpb24odikgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzb3VyY2U7CiAgICAgIHNvdXJjZSA9IGQzX2Z1bmN0b3Iodik7CiAgICAgIHJldHVybiBjaG9yZDsKICAgIH07CiAgICBjaG9yZC50YXJnZXQgPSBmdW5jdGlvbih2KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRhcmdldDsKICAgICAgdGFyZ2V0ID0gZDNfZnVuY3Rvcih2KTsKICAgICAgcmV0dXJuIGNob3JkOwogICAgfTsKICAgIGNob3JkLnN0YXJ0QW5nbGUgPSBmdW5jdGlvbih2KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHN0YXJ0QW5nbGU7CiAgICAgIHN0YXJ0QW5nbGUgPSBkM19mdW5jdG9yKHYpOwogICAgICByZXR1cm4gY2hvcmQ7CiAgICB9OwogICAgY2hvcmQuZW5kQW5nbGUgPSBmdW5jdGlvbih2KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGVuZEFuZ2xlOwogICAgICBlbmRBbmdsZSA9IGQzX2Z1bmN0b3Iodik7CiAgICAgIHJldHVybiBjaG9yZDsKICAgIH07CiAgICByZXR1cm4gY2hvcmQ7CiAgfTsKICBmdW5jdGlvbiBkM19zdmdfY2hvcmRSYWRpdXMoZCkgewogICAgcmV0dXJuIGQucmFkaXVzOwogIH0KICBkMy5zdmcuZGlhZ29uYWwgPSBmdW5jdGlvbigpIHsKICAgIHZhciBzb3VyY2UgPSBkM19zb3VyY2UsIHRhcmdldCA9IGQzX3RhcmdldCwgcHJvamVjdGlvbiA9IGQzX3N2Z19kaWFnb25hbFByb2plY3Rpb247CiAgICBmdW5jdGlvbiBkaWFnb25hbChkLCBpKSB7CiAgICAgIHZhciBwMCA9IHNvdXJjZS5jYWxsKHRoaXMsIGQsIGkpLCBwMyA9IHRhcmdldC5jYWxsKHRoaXMsIGQsIGkpLCBtID0gKHAwLnkgKyBwMy55KSAvIDIsIHAgPSBbIHAwLCB7CiAgICAgICAgeDogcDAueCwKICAgICAgICB5OiBtCiAgICAgIH0sIHsKICAgICAgICB4OiBwMy54LAogICAgICAgIHk6IG0KICAgICAgfSwgcDMgXTsKICAgICAgcCA9IHAubWFwKHByb2plY3Rpb24pOwogICAgICByZXR1cm4gIk0iICsgcFswXSArICJDIiArIHBbMV0gKyAiICIgKyBwWzJdICsgIiAiICsgcFszXTsKICAgIH0KICAgIGRpYWdvbmFsLnNvdXJjZSA9IGZ1bmN0aW9uKHgpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc291cmNlOwogICAgICBzb3VyY2UgPSBkM19mdW5jdG9yKHgpOwogICAgICByZXR1cm4gZGlhZ29uYWw7CiAgICB9OwogICAgZGlhZ29uYWwudGFyZ2V0ID0gZnVuY3Rpb24oeCkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB0YXJnZXQ7CiAgICAgIHRhcmdldCA9IGQzX2Z1bmN0b3IoeCk7CiAgICAgIHJldHVybiBkaWFnb25hbDsKICAgIH07CiAgICBkaWFnb25hbC5wcm9qZWN0aW9uID0gZnVuY3Rpb24oeCkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBwcm9qZWN0aW9uOwogICAgICBwcm9qZWN0aW9uID0geDsKICAgICAgcmV0dXJuIGRpYWdvbmFsOwogICAgfTsKICAgIHJldHVybiBkaWFnb25hbDsKICB9OwogIGZ1bmN0aW9uIGQzX3N2Z19kaWFnb25hbFByb2plY3Rpb24oZCkgewogICAgcmV0dXJuIFsgZC54LCBkLnkgXTsKICB9CiAgZDMuc3ZnLmRpYWdvbmFsLnJhZGlhbCA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGRpYWdvbmFsID0gZDMuc3ZnLmRpYWdvbmFsKCksIHByb2plY3Rpb24gPSBkM19zdmdfZGlhZ29uYWxQcm9qZWN0aW9uLCBwcm9qZWN0aW9uXyA9IGRpYWdvbmFsLnByb2plY3Rpb247CiAgICBkaWFnb25hbC5wcm9qZWN0aW9uID0gZnVuY3Rpb24oeCkgewogICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IHByb2plY3Rpb25fKGQzX3N2Z19kaWFnb25hbFJhZGlhbFByb2plY3Rpb24ocHJvamVjdGlvbiA9IHgpKSA6IHByb2plY3Rpb247CiAgICB9OwogICAgcmV0dXJuIGRpYWdvbmFsOwogIH07CiAgZnVuY3Rpb24gZDNfc3ZnX2RpYWdvbmFsUmFkaWFsUHJvamVjdGlvbihwcm9qZWN0aW9uKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBkID0gcHJvamVjdGlvbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCByID0gZFswXSwgYSA9IGRbMV0gKyBkM19zdmdfYXJjT2Zmc2V0OwogICAgICByZXR1cm4gWyByICogTWF0aC5jb3MoYSksIHIgKiBNYXRoLnNpbihhKSBdOwogICAgfTsKICB9CiAgZDMuc3ZnLnN5bWJvbCA9IGZ1bmN0aW9uKCkgewogICAgdmFyIHR5cGUgPSBkM19zdmdfc3ltYm9sVHlwZSwgc2l6ZSA9IGQzX3N2Z19zeW1ib2xTaXplOwogICAgZnVuY3Rpb24gc3ltYm9sKGQsIGkpIHsKICAgICAgcmV0dXJuIChkM19zdmdfc3ltYm9scy5nZXQodHlwZS5jYWxsKHRoaXMsIGQsIGkpKSB8fCBkM19zdmdfc3ltYm9sQ2lyY2xlKShzaXplLmNhbGwodGhpcywgZCwgaSkpOwogICAgfQogICAgc3ltYm9sLnR5cGUgPSBmdW5jdGlvbih4KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHR5cGU7CiAgICAgIHR5cGUgPSBkM19mdW5jdG9yKHgpOwogICAgICByZXR1cm4gc3ltYm9sOwogICAgfTsKICAgIHN5bWJvbC5zaXplID0gZnVuY3Rpb24oeCkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzaXplOwogICAgICBzaXplID0gZDNfZnVuY3Rvcih4KTsKICAgICAgcmV0dXJuIHN5bWJvbDsKICAgIH07CiAgICByZXR1cm4gc3ltYm9sOwogIH07CiAgZnVuY3Rpb24gZDNfc3ZnX3N5bWJvbFNpemUoKSB7CiAgICByZXR1cm4gNjQ7CiAgfQogIGZ1bmN0aW9uIGQzX3N2Z19zeW1ib2xUeXBlKCkgewogICAgcmV0dXJuICJjaXJjbGUiOwogIH0KICBmdW5jdGlvbiBkM19zdmdfc3ltYm9sQ2lyY2xlKHNpemUpIHsKICAgIHZhciByID0gTWF0aC5zcXJ0KHNpemUgLyDPgCk7CiAgICByZXR1cm4gIk0wLCIgKyByICsgIkEiICsgciArICIsIiArIHIgKyAiIDAgMSwxIDAsIiArIC1yICsgIkEiICsgciArICIsIiArIHIgKyAiIDAgMSwxIDAsIiArIHIgKyAiWiI7CiAgfQogIHZhciBkM19zdmdfc3ltYm9scyA9IGQzLm1hcCh7CiAgICBjaXJjbGU6IGQzX3N2Z19zeW1ib2xDaXJjbGUsCiAgICBjcm9zczogZnVuY3Rpb24oc2l6ZSkgewogICAgICB2YXIgciA9IE1hdGguc3FydChzaXplIC8gNSkgLyAyOwogICAgICByZXR1cm4gIk0iICsgLTMgKiByICsgIiwiICsgLXIgKyAiSCIgKyAtciArICJWIiArIC0zICogciArICJIIiArIHIgKyAiViIgKyAtciArICJIIiArIDMgKiByICsgIlYiICsgciArICJIIiArIHIgKyAiViIgKyAzICogciArICJIIiArIC1yICsgIlYiICsgciArICJIIiArIC0zICogciArICJaIjsKICAgIH0sCiAgICBkaWFtb25kOiBmdW5jdGlvbihzaXplKSB7CiAgICAgIHZhciByeSA9IE1hdGguc3FydChzaXplIC8gKDIgKiBkM19zdmdfc3ltYm9sVGFuMzApKSwgcnggPSByeSAqIGQzX3N2Z19zeW1ib2xUYW4zMDsKICAgICAgcmV0dXJuICJNMCwiICsgLXJ5ICsgIkwiICsgcnggKyAiLDAiICsgIiAwLCIgKyByeSArICIgIiArIC1yeCArICIsMCIgKyAiWiI7CiAgICB9LAogICAgc3F1YXJlOiBmdW5jdGlvbihzaXplKSB7CiAgICAgIHZhciByID0gTWF0aC5zcXJ0KHNpemUpIC8gMjsKICAgICAgcmV0dXJuICJNIiArIC1yICsgIiwiICsgLXIgKyAiTCIgKyByICsgIiwiICsgLXIgKyAiICIgKyByICsgIiwiICsgciArICIgIiArIC1yICsgIiwiICsgciArICJaIjsKICAgIH0sCiAgICAidHJpYW5nbGUtZG93biI6IGZ1bmN0aW9uKHNpemUpIHsKICAgICAgdmFyIHJ4ID0gTWF0aC5zcXJ0KHNpemUgLyBkM19zdmdfc3ltYm9sU3FydDMpLCByeSA9IHJ4ICogZDNfc3ZnX3N5bWJvbFNxcnQzIC8gMjsKICAgICAgcmV0dXJuICJNMCwiICsgcnkgKyAiTCIgKyByeCArICIsIiArIC1yeSArICIgIiArIC1yeCArICIsIiArIC1yeSArICJaIjsKICAgIH0sCiAgICAidHJpYW5nbGUtdXAiOiBmdW5jdGlvbihzaXplKSB7CiAgICAgIHZhciByeCA9IE1hdGguc3FydChzaXplIC8gZDNfc3ZnX3N5bWJvbFNxcnQzKSwgcnkgPSByeCAqIGQzX3N2Z19zeW1ib2xTcXJ0MyAvIDI7CiAgICAgIHJldHVybiAiTTAsIiArIC1yeSArICJMIiArIHJ4ICsgIiwiICsgcnkgKyAiICIgKyAtcnggKyAiLCIgKyByeSArICJaIjsKICAgIH0KICB9KTsKICBkMy5zdmcuc3ltYm9sVHlwZXMgPSBkM19zdmdfc3ltYm9scy5rZXlzKCk7CiAgdmFyIGQzX3N2Z19zeW1ib2xTcXJ0MyA9IE1hdGguc3FydCgzKSwgZDNfc3ZnX3N5bWJvbFRhbjMwID0gTWF0aC50YW4oMzAgKiBkM19yYWRpYW5zKTsKICBmdW5jdGlvbiBkM190cmFuc2l0aW9uKGdyb3VwcywgaWQpIHsKICAgIGQzX2FycmF5U3ViY2xhc3MoZ3JvdXBzLCBkM190cmFuc2l0aW9uUHJvdG90eXBlKTsKICAgIGdyb3Vwcy5pZCA9IGlkOwogICAgcmV0dXJuIGdyb3VwczsKICB9CiAgdmFyIGQzX3RyYW5zaXRpb25Qcm90b3R5cGUgPSBbXSwgZDNfdHJhbnNpdGlvbklkID0gMCwgZDNfdHJhbnNpdGlvbkluaGVyaXRJZCwgZDNfdHJhbnNpdGlvbkluaGVyaXQgPSB7CiAgICBlYXNlOiBkM19lYXNlX2N1YmljSW5PdXQsCiAgICBkZWxheTogMCwKICAgIGR1cmF0aW9uOiAyNTAKICB9OwogIGQzX3RyYW5zaXRpb25Qcm90b3R5cGUuY2FsbCA9IGQzX3NlbGVjdGlvblByb3RvdHlwZS5jYWxsOwogIGQzX3RyYW5zaXRpb25Qcm90b3R5cGUuZW1wdHkgPSBkM19zZWxlY3Rpb25Qcm90b3R5cGUuZW1wdHk7CiAgZDNfdHJhbnNpdGlvblByb3RvdHlwZS5ub2RlID0gZDNfc2VsZWN0aW9uUHJvdG90eXBlLm5vZGU7CiAgZDMudHJhbnNpdGlvbiA9IGZ1bmN0aW9uKHNlbGVjdGlvbikgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyBkM190cmFuc2l0aW9uSW5oZXJpdElkID8gc2VsZWN0aW9uLnRyYW5zaXRpb24oKSA6IHNlbGVjdGlvbiA6IGQzX3NlbGVjdGlvblJvb3QudHJhbnNpdGlvbigpOwogIH07CiAgZDMudHJhbnNpdGlvbi5wcm90b3R5cGUgPSBkM190cmFuc2l0aW9uUHJvdG90eXBlOwogIGQzX3RyYW5zaXRpb25Qcm90b3R5cGUuc2VsZWN0ID0gZnVuY3Rpb24oc2VsZWN0b3IpIHsKICAgIHZhciBpZCA9IHRoaXMuaWQsIHN1Ymdyb3VwcyA9IFtdLCBzdWJncm91cCwgc3Vibm9kZSwgbm9kZTsKICAgIGlmICh0eXBlb2Ygc2VsZWN0b3IgIT09ICJmdW5jdGlvbiIpIHNlbGVjdG9yID0gZDNfc2VsZWN0aW9uX3NlbGVjdG9yKHNlbGVjdG9yKTsKICAgIGZvciAodmFyIGogPSAtMSwgbSA9IHRoaXMubGVuZ3RoOyArK2ogPCBtOyApIHsKICAgICAgc3ViZ3JvdXBzLnB1c2goc3ViZ3JvdXAgPSBbXSk7CiAgICAgIGZvciAodmFyIGdyb3VwID0gdGhpc1tqXSwgaSA9IC0xLCBuID0gZ3JvdXAubGVuZ3RoOyArK2kgPCBuOyApIHsKICAgICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgKHN1Ym5vZGUgPSBzZWxlY3Rvci5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGkpKSkgewogICAgICAgICAgaWYgKCJfX2RhdGFfXyIgaW4gbm9kZSkgc3Vibm9kZS5fX2RhdGFfXyA9IG5vZGUuX19kYXRhX187CiAgICAgICAgICBkM190cmFuc2l0aW9uTm9kZShzdWJub2RlLCBpLCBpZCwgbm9kZS5fX3RyYW5zaXRpb25fX1tpZF0pOwogICAgICAgICAgc3ViZ3JvdXAucHVzaChzdWJub2RlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3ViZ3JvdXAucHVzaChudWxsKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBkM190cmFuc2l0aW9uKHN1Ymdyb3VwcywgaWQpOwogIH07CiAgZDNfdHJhbnNpdGlvblByb3RvdHlwZS5zZWxlY3RBbGwgPSBmdW5jdGlvbihzZWxlY3RvcikgewogICAgdmFyIGlkID0gdGhpcy5pZCwgc3ViZ3JvdXBzID0gW10sIHN1Ymdyb3VwLCBzdWJub2Rlcywgbm9kZSwgc3Vibm9kZSwgdHJhbnNpdGlvbjsKICAgIGlmICh0eXBlb2Ygc2VsZWN0b3IgIT09ICJmdW5jdGlvbiIpIHNlbGVjdG9yID0gZDNfc2VsZWN0aW9uX3NlbGVjdG9yQWxsKHNlbGVjdG9yKTsKICAgIGZvciAodmFyIGogPSAtMSwgbSA9IHRoaXMubGVuZ3RoOyArK2ogPCBtOyApIHsKICAgICAgZm9yICh2YXIgZ3JvdXAgPSB0aGlzW2pdLCBpID0gLTEsIG4gPSBncm91cC5sZW5ndGg7ICsraSA8IG47ICkgewogICAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHsKICAgICAgICAgIHRyYW5zaXRpb24gPSBub2RlLl9fdHJhbnNpdGlvbl9fW2lkXTsKICAgICAgICAgIHN1Ym5vZGVzID0gc2VsZWN0b3IuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpKTsKICAgICAgICAgIHN1Ymdyb3Vwcy5wdXNoKHN1Ymdyb3VwID0gW10pOwogICAgICAgICAgZm9yICh2YXIgayA9IC0xLCBvID0gc3Vibm9kZXMubGVuZ3RoOyArK2sgPCBvOyApIHsKICAgICAgICAgICAgZDNfdHJhbnNpdGlvbk5vZGUoc3Vibm9kZSA9IHN1Ym5vZGVzW2tdLCBrLCBpZCwgdHJhbnNpdGlvbik7CiAgICAgICAgICAgIHN1Ymdyb3VwLnB1c2goc3Vibm9kZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gZDNfdHJhbnNpdGlvbihzdWJncm91cHMsIGlkKTsKICB9OwogIGQzX3RyYW5zaXRpb25Qcm90b3R5cGUuZmlsdGVyID0gZnVuY3Rpb24oZmlsdGVyKSB7CiAgICB2YXIgc3ViZ3JvdXBzID0gW10sIHN1Ymdyb3VwLCBncm91cCwgbm9kZTsKICAgIGlmICh0eXBlb2YgZmlsdGVyICE9PSAiZnVuY3Rpb24iKSBmaWx0ZXIgPSBkM19zZWxlY3Rpb25fZmlsdGVyKGZpbHRlcik7CiAgICBmb3IgKHZhciBqID0gMCwgbSA9IHRoaXMubGVuZ3RoOyBqIDwgbTsgaisrKSB7CiAgICAgIHN1Ymdyb3Vwcy5wdXNoKHN1Ymdyb3VwID0gW10pOwogICAgICBmb3IgKHZhciBncm91cCA9IHRoaXNbal0sIGkgPSAwLCBuID0gZ3JvdXAubGVuZ3RoOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIGZpbHRlci5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGkpKSB7CiAgICAgICAgICBzdWJncm91cC5wdXNoKG5vZGUpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIGQzX3RyYW5zaXRpb24oc3ViZ3JvdXBzLCB0aGlzLmlkLCB0aGlzLnRpbWUpLmVhc2UodGhpcy5lYXNlKCkpOwogIH07CiAgZDNfdHJhbnNpdGlvblByb3RvdHlwZS50d2VlbiA9IGZ1bmN0aW9uKG5hbWUsIHR3ZWVuKSB7CiAgICB2YXIgaWQgPSB0aGlzLmlkOwogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSByZXR1cm4gdGhpcy5ub2RlKCkuX190cmFuc2l0aW9uX19baWRdLnR3ZWVuLmdldChuYW1lKTsKICAgIHJldHVybiBkM19zZWxlY3Rpb25fZWFjaCh0aGlzLCB0d2VlbiA9PSBudWxsID8gZnVuY3Rpb24obm9kZSkgewogICAgICBub2RlLl9fdHJhbnNpdGlvbl9fW2lkXS50d2Vlbi5yZW1vdmUobmFtZSk7CiAgICB9IDogZnVuY3Rpb24obm9kZSkgewogICAgICBub2RlLl9fdHJhbnNpdGlvbl9fW2lkXS50d2Vlbi5zZXQobmFtZSwgdHdlZW4pOwogICAgfSk7CiAgfTsKICBmdW5jdGlvbiBkM190cmFuc2l0aW9uX3R3ZWVuKGdyb3VwcywgbmFtZSwgdmFsdWUsIHR3ZWVuKSB7CiAgICB2YXIgaWQgPSBncm91cHMuaWQ7CiAgICByZXR1cm4gZDNfc2VsZWN0aW9uX2VhY2goZ3JvdXBzLCB0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIgPyBmdW5jdGlvbihub2RlLCBpLCBqKSB7CiAgICAgIG5vZGUuX190cmFuc2l0aW9uX19baWRdLnR3ZWVuLnNldChuYW1lLCB0d2Vlbih2YWx1ZS5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGopKSk7CiAgICB9IDogKHZhbHVlID0gdHdlZW4odmFsdWUpLCBmdW5jdGlvbihub2RlKSB7CiAgICAgIG5vZGUuX190cmFuc2l0aW9uX19baWRdLnR3ZWVuLnNldChuYW1lLCB2YWx1ZSk7CiAgICB9KSk7CiAgfQogIGQzX3RyYW5zaXRpb25Qcm90b3R5cGUuYXR0ciA9IGZ1bmN0aW9uKG5hbWVOUywgdmFsdWUpIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgewogICAgICBmb3IgKHZhbHVlIGluIG5hbWVOUykgdGhpcy5hdHRyKHZhbHVlLCBuYW1lTlNbdmFsdWVdKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICB2YXIgaW50ZXJwb2xhdGUgPSBkM19pbnRlcnBvbGF0ZUJ5TmFtZShuYW1lTlMpLCBuYW1lID0gZDMubnMucXVhbGlmeShuYW1lTlMpOwogICAgZnVuY3Rpb24gYXR0ck51bGwoKSB7CiAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwogICAgfQogICAgZnVuY3Rpb24gYXR0ck51bGxOUygpIHsKICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhuYW1lLnNwYWNlLCBuYW1lLmxvY2FsKTsKICAgIH0KICAgIGZ1bmN0aW9uIGF0dHJUd2VlbihiKSB7CiAgICAgIHJldHVybiBiID09IG51bGwgPyBhdHRyTnVsbCA6IChiICs9ICIiLCBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgYSA9IHRoaXMuZ2V0QXR0cmlidXRlKG5hbWUpLCBpOwogICAgICAgIHJldHVybiBhICE9PSBiICYmIChpID0gaW50ZXJwb2xhdGUoYSwgYiksIGZ1bmN0aW9uKHQpIHsKICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKG5hbWUsIGkodCkpOwogICAgICAgIH0pOwogICAgICB9KTsKICAgIH0KICAgIGZ1bmN0aW9uIGF0dHJUd2Vlbk5TKGIpIHsKICAgICAgcmV0dXJuIGIgPT0gbnVsbCA/IGF0dHJOdWxsTlMgOiAoYiArPSAiIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGEgPSB0aGlzLmdldEF0dHJpYnV0ZU5TKG5hbWUuc3BhY2UsIG5hbWUubG9jYWwpLCBpOwogICAgICAgIHJldHVybiBhICE9PSBiICYmIChpID0gaW50ZXJwb2xhdGUoYSwgYiksIGZ1bmN0aW9uKHQpIHsKICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlTlMobmFtZS5zcGFjZSwgbmFtZS5sb2NhbCwgaSh0KSk7CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIGQzX3RyYW5zaXRpb25fdHdlZW4odGhpcywgImF0dHIuIiArIG5hbWVOUywgdmFsdWUsIG5hbWUubG9jYWwgPyBhdHRyVHdlZW5OUyA6IGF0dHJUd2Vlbik7CiAgfTsKICBkM190cmFuc2l0aW9uUHJvdG90eXBlLmF0dHJUd2VlbiA9IGZ1bmN0aW9uKG5hbWVOUywgdHdlZW4pIHsKICAgIHZhciBuYW1lID0gZDMubnMucXVhbGlmeShuYW1lTlMpOwogICAgZnVuY3Rpb24gYXR0clR3ZWVuKGQsIGkpIHsKICAgICAgdmFyIGYgPSB0d2Vlbi5jYWxsKHRoaXMsIGQsIGksIHRoaXMuZ2V0QXR0cmlidXRlKG5hbWUpKTsKICAgICAgcmV0dXJuIGYgJiYgZnVuY3Rpb24odCkgewogICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKG5hbWUsIGYodCkpOwogICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gYXR0clR3ZWVuTlMoZCwgaSkgewogICAgICB2YXIgZiA9IHR3ZWVuLmNhbGwodGhpcywgZCwgaSwgdGhpcy5nZXRBdHRyaWJ1dGVOUyhuYW1lLnNwYWNlLCBuYW1lLmxvY2FsKSk7CiAgICAgIHJldHVybiBmICYmIGZ1bmN0aW9uKHQpIHsKICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZU5TKG5hbWUuc3BhY2UsIG5hbWUubG9jYWwsIGYodCkpOwogICAgICB9OwogICAgfQogICAgcmV0dXJuIHRoaXMudHdlZW4oImF0dHIuIiArIG5hbWVOUywgbmFtZS5sb2NhbCA/IGF0dHJUd2Vlbk5TIDogYXR0clR3ZWVuKTsKICB9OwogIGQzX3RyYW5zaXRpb25Qcm90b3R5cGUuc3R5bGUgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHsKICAgIHZhciBuID0gYXJndW1lbnRzLmxlbmd0aDsKICAgIGlmIChuIDwgMykgewogICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICJzdHJpbmciKSB7CiAgICAgICAgaWYgKG4gPCAyKSB2YWx1ZSA9ICIiOwogICAgICAgIGZvciAocHJpb3JpdHkgaW4gbmFtZSkgdGhpcy5zdHlsZShwcmlvcml0eSwgbmFtZVtwcmlvcml0eV0sIHZhbHVlKTsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfQogICAgICBwcmlvcml0eSA9ICIiOwogICAgfQogICAgdmFyIGludGVycG9sYXRlID0gZDNfaW50ZXJwb2xhdGVCeU5hbWUobmFtZSk7CiAgICBmdW5jdGlvbiBzdHlsZU51bGwoKSB7CiAgICAgIHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSk7CiAgICB9CiAgICBmdW5jdGlvbiBzdHlsZVN0cmluZyhiKSB7CiAgICAgIHJldHVybiBiID09IG51bGwgPyBzdHlsZU51bGwgOiAoYiArPSAiIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGEgPSBkM193aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLCBudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpLCBpOwogICAgICAgIHJldHVybiBhICE9PSBiICYmIChpID0gaW50ZXJwb2xhdGUoYSwgYiksIGZ1bmN0aW9uKHQpIHsKICAgICAgICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgaSh0KSwgcHJpb3JpdHkpOwogICAgICAgIH0pOwogICAgICB9KTsKICAgIH0KICAgIHJldHVybiBkM190cmFuc2l0aW9uX3R3ZWVuKHRoaXMsICJzdHlsZS4iICsgbmFtZSwgdmFsdWUsIHN0eWxlU3RyaW5nKTsKICB9OwogIGQzX3RyYW5zaXRpb25Qcm90b3R5cGUuc3R5bGVUd2VlbiA9IGZ1bmN0aW9uKG5hbWUsIHR3ZWVuLCBwcmlvcml0eSkgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSBwcmlvcml0eSA9ICIiOwogICAgZnVuY3Rpb24gc3R5bGVUd2VlbihkLCBpKSB7CiAgICAgIHZhciBmID0gdHdlZW4uY2FsbCh0aGlzLCBkLCBpLCBkM193aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLCBudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpKTsKICAgICAgcmV0dXJuIGYgJiYgZnVuY3Rpb24odCkgewogICAgICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgZih0KSwgcHJpb3JpdHkpOwogICAgICB9OwogICAgfQogICAgcmV0dXJuIHRoaXMudHdlZW4oInN0eWxlLiIgKyBuYW1lLCBzdHlsZVR3ZWVuKTsKICB9OwogIGQzX3RyYW5zaXRpb25Qcm90b3R5cGUudGV4dCA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICByZXR1cm4gZDNfdHJhbnNpdGlvbl90d2Vlbih0aGlzLCAidGV4dCIsIHZhbHVlLCBkM190cmFuc2l0aW9uX3RleHQpOwogIH07CiAgZnVuY3Rpb24gZDNfdHJhbnNpdGlvbl90ZXh0KGIpIHsKICAgIGlmIChiID09IG51bGwpIGIgPSAiIjsKICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgdGhpcy50ZXh0Q29udGVudCA9IGI7CiAgICB9OwogIH0KICBkM190cmFuc2l0aW9uUHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMuZWFjaCgiZW5kLnRyYW5zaXRpb24iLCBmdW5jdGlvbigpIHsKICAgICAgdmFyIHA7CiAgICAgIGlmICghdGhpcy5fX3RyYW5zaXRpb25fXyAmJiAocCA9IHRoaXMucGFyZW50Tm9kZSkpIHAucmVtb3ZlQ2hpbGQodGhpcyk7CiAgICB9KTsKICB9OwogIGQzX3RyYW5zaXRpb25Qcm90b3R5cGUuZWFzZSA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICB2YXIgaWQgPSB0aGlzLmlkOwogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAxKSByZXR1cm4gdGhpcy5ub2RlKCkuX190cmFuc2l0aW9uX19baWRdLmVhc2U7CiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAiZnVuY3Rpb24iKSB2YWx1ZSA9IGQzLmVhc2UuYXBwbHkoZDMsIGFyZ3VtZW50cyk7CiAgICByZXR1cm4gZDNfc2VsZWN0aW9uX2VhY2godGhpcywgZnVuY3Rpb24obm9kZSkgewogICAgICBub2RlLl9fdHJhbnNpdGlvbl9fW2lkXS5lYXNlID0gdmFsdWU7CiAgICB9KTsKICB9OwogIGQzX3RyYW5zaXRpb25Qcm90b3R5cGUuZGVsYXkgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgdmFyIGlkID0gdGhpcy5pZDsKICAgIHJldHVybiBkM19zZWxlY3Rpb25fZWFjaCh0aGlzLCB0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIgPyBmdW5jdGlvbihub2RlLCBpLCBqKSB7CiAgICAgIG5vZGUuX190cmFuc2l0aW9uX19baWRdLmRlbGF5ID0gdmFsdWUuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBqKSB8IDA7CiAgICB9IDogKHZhbHVlIHw9IDAsIGZ1bmN0aW9uKG5vZGUpIHsKICAgICAgbm9kZS5fX3RyYW5zaXRpb25fX1tpZF0uZGVsYXkgPSB2YWx1ZTsKICAgIH0pKTsKICB9OwogIGQzX3RyYW5zaXRpb25Qcm90b3R5cGUuZHVyYXRpb24gPSBmdW5jdGlvbih2YWx1ZSkgewogICAgdmFyIGlkID0gdGhpcy5pZDsKICAgIHJldHVybiBkM19zZWxlY3Rpb25fZWFjaCh0aGlzLCB0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIgPyBmdW5jdGlvbihub2RlLCBpLCBqKSB7CiAgICAgIG5vZGUuX190cmFuc2l0aW9uX19baWRdLmR1cmF0aW9uID0gTWF0aC5tYXgoMSwgdmFsdWUuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBqKSB8IDApOwogICAgfSA6ICh2YWx1ZSA9IE1hdGgubWF4KDEsIHZhbHVlIHwgMCksIGZ1bmN0aW9uKG5vZGUpIHsKICAgICAgbm9kZS5fX3RyYW5zaXRpb25fX1tpZF0uZHVyYXRpb24gPSB2YWx1ZTsKICAgIH0pKTsKICB9OwogIGQzX3RyYW5zaXRpb25Qcm90b3R5cGUuZWFjaCA9IGZ1bmN0aW9uKHR5cGUsIGxpc3RlbmVyKSB7CiAgICB2YXIgaWQgPSB0aGlzLmlkOwogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7CiAgICAgIHZhciBpbmhlcml0ID0gZDNfdHJhbnNpdGlvbkluaGVyaXQsIGluaGVyaXRJZCA9IGQzX3RyYW5zaXRpb25Jbmhlcml0SWQ7CiAgICAgIGQzX3RyYW5zaXRpb25Jbmhlcml0SWQgPSBpZDsKICAgICAgZDNfc2VsZWN0aW9uX2VhY2godGhpcywgZnVuY3Rpb24obm9kZSwgaSwgaikgewogICAgICAgIGQzX3RyYW5zaXRpb25Jbmhlcml0ID0gbm9kZS5fX3RyYW5zaXRpb25fX1tpZF07CiAgICAgICAgdHlwZS5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGopOwogICAgICB9KTsKICAgICAgZDNfdHJhbnNpdGlvbkluaGVyaXQgPSBpbmhlcml0OwogICAgICBkM190cmFuc2l0aW9uSW5oZXJpdElkID0gaW5oZXJpdElkOwogICAgfSBlbHNlIHsKICAgICAgZDNfc2VsZWN0aW9uX2VhY2godGhpcywgZnVuY3Rpb24obm9kZSkgewogICAgICAgIG5vZGUuX190cmFuc2l0aW9uX19baWRdLmV2ZW50Lm9uKHR5cGUsIGxpc3RlbmVyKTsKICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gdGhpczsKICB9OwogIGQzX3RyYW5zaXRpb25Qcm90b3R5cGUudHJhbnNpdGlvbiA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGlkMCA9IHRoaXMuaWQsIGlkMSA9ICsrZDNfdHJhbnNpdGlvbklkLCBzdWJncm91cHMgPSBbXSwgc3ViZ3JvdXAsIGdyb3VwLCBub2RlLCB0cmFuc2l0aW9uOwogICAgZm9yICh2YXIgaiA9IDAsIG0gPSB0aGlzLmxlbmd0aDsgaiA8IG07IGorKykgewogICAgICBzdWJncm91cHMucHVzaChzdWJncm91cCA9IFtdKTsKICAgICAgZm9yICh2YXIgZ3JvdXAgPSB0aGlzW2pdLCBpID0gMCwgbiA9IGdyb3VwLmxlbmd0aDsgaSA8IG47IGkrKykgewogICAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHsKICAgICAgICAgIHRyYW5zaXRpb24gPSBPYmplY3QuY3JlYXRlKG5vZGUuX190cmFuc2l0aW9uX19baWQwXSk7CiAgICAgICAgICB0cmFuc2l0aW9uLmRlbGF5ICs9IHRyYW5zaXRpb24uZHVyYXRpb247CiAgICAgICAgICBkM190cmFuc2l0aW9uTm9kZShub2RlLCBpLCBpZDEsIHRyYW5zaXRpb24pOwogICAgICAgIH0KICAgICAgICBzdWJncm91cC5wdXNoKG5vZGUpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZDNfdHJhbnNpdGlvbihzdWJncm91cHMsIGlkMSk7CiAgfTsKICBmdW5jdGlvbiBkM190cmFuc2l0aW9uTm9kZShub2RlLCBpLCBpZCwgaW5oZXJpdCkgewogICAgdmFyIGxvY2sgPSBub2RlLl9fdHJhbnNpdGlvbl9fIHx8IChub2RlLl9fdHJhbnNpdGlvbl9fID0gewogICAgICBhY3RpdmU6IDAsCiAgICAgIGNvdW50OiAwCiAgICB9KSwgdHJhbnNpdGlvbiA9IGxvY2tbaWRdOwogICAgaWYgKCF0cmFuc2l0aW9uKSB7CiAgICAgIHZhciB0aW1lID0gaW5oZXJpdC50aW1lOwogICAgICB0cmFuc2l0aW9uID0gbG9ja1tpZF0gPSB7CiAgICAgICAgdHdlZW46IG5ldyBkM19NYXAoKSwKICAgICAgICBldmVudDogZDMuZGlzcGF0Y2goInN0YXJ0IiwgImVuZCIpLAogICAgICAgIHRpbWU6IHRpbWUsCiAgICAgICAgZWFzZTogaW5oZXJpdC5lYXNlLAogICAgICAgIGRlbGF5OiBpbmhlcml0LmRlbGF5LAogICAgICAgIGR1cmF0aW9uOiBpbmhlcml0LmR1cmF0aW9uCiAgICAgIH07CiAgICAgICsrbG9jay5jb3VudDsKICAgICAgZDMudGltZXIoZnVuY3Rpb24oZWxhcHNlZCkgewogICAgICAgIHZhciBkID0gbm9kZS5fX2RhdGFfXywgZWFzZSA9IHRyYW5zaXRpb24uZWFzZSwgZXZlbnQgPSB0cmFuc2l0aW9uLmV2ZW50LCBkZWxheSA9IHRyYW5zaXRpb24uZGVsYXksIGR1cmF0aW9uID0gdHJhbnNpdGlvbi5kdXJhdGlvbiwgdHdlZW5lZCA9IFtdOwogICAgICAgIHJldHVybiBkZWxheSA8PSBlbGFwc2VkID8gc3RhcnQoZWxhcHNlZCkgOiBkMy50aW1lcihzdGFydCwgZGVsYXksIHRpbWUpLCAxOwogICAgICAgIGZ1bmN0aW9uIHN0YXJ0KGVsYXBzZWQpIHsKICAgICAgICAgIGlmIChsb2NrLmFjdGl2ZSA+IGlkKSByZXR1cm4gc3RvcCgpOwogICAgICAgICAgbG9jay5hY3RpdmUgPSBpZDsKICAgICAgICAgIGV2ZW50LnN0YXJ0LmNhbGwobm9kZSwgZCwgaSk7CiAgICAgICAgICB0cmFuc2l0aW9uLnR3ZWVuLmZvckVhY2goZnVuY3Rpb24oa2V5LCB2YWx1ZSkgewogICAgICAgICAgICBpZiAodmFsdWUgPSB2YWx1ZS5jYWxsKG5vZGUsIGQsIGkpKSB7CiAgICAgICAgICAgICAgdHdlZW5lZC5wdXNoKHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgICBpZiAoIXRpY2soZWxhcHNlZCkpIGQzLnRpbWVyKHRpY2ssIDAsIHRpbWUpOwogICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIHRpY2soZWxhcHNlZCkgewogICAgICAgICAgaWYgKGxvY2suYWN0aXZlICE9PSBpZCkgcmV0dXJuIHN0b3AoKTsKICAgICAgICAgIHZhciB0ID0gKGVsYXBzZWQgLSBkZWxheSkgLyBkdXJhdGlvbiwgZSA9IGVhc2UodCksIG4gPSB0d2VlbmVkLmxlbmd0aDsKICAgICAgICAgIHdoaWxlIChuID4gMCkgewogICAgICAgICAgICB0d2VlbmVkWy0tbl0uY2FsbChub2RlLCBlKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0ID49IDEpIHsKICAgICAgICAgICAgc3RvcCgpOwogICAgICAgICAgICBldmVudC5lbmQuY2FsbChub2RlLCBkLCBpKTsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIHN0b3AoKSB7CiAgICAgICAgICBpZiAoLS1sb2NrLmNvdW50KSBkZWxldGUgbG9ja1tpZF07IGVsc2UgZGVsZXRlIG5vZGUuX190cmFuc2l0aW9uX187CiAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICAgIH0sIDAsIHRpbWUpOwogICAgICByZXR1cm4gdHJhbnNpdGlvbjsKICAgIH0KICB9CiAgZDMuc3ZnLmF4aXMgPSBmdW5jdGlvbigpIHsKICAgIHZhciBzY2FsZSA9IGQzLnNjYWxlLmxpbmVhcigpLCBvcmllbnQgPSBkM19zdmdfYXhpc0RlZmF1bHRPcmllbnQsIHRpY2tNYWpvclNpemUgPSA2LCB0aWNrTWlub3JTaXplID0gNiwgdGlja0VuZFNpemUgPSA2LCB0aWNrUGFkZGluZyA9IDMsIHRpY2tBcmd1bWVudHNfID0gWyAxMCBdLCB0aWNrVmFsdWVzID0gbnVsbCwgdGlja0Zvcm1hdF8sIHRpY2tTdWJkaXZpZGUgPSAwOwogICAgZnVuY3Rpb24gYXhpcyhnKSB7CiAgICAgIGcuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICB2YXIgZyA9IGQzLnNlbGVjdCh0aGlzKTsKICAgICAgICB2YXIgdGlja3MgPSB0aWNrVmFsdWVzID09IG51bGwgPyBzY2FsZS50aWNrcyA/IHNjYWxlLnRpY2tzLmFwcGx5KHNjYWxlLCB0aWNrQXJndW1lbnRzXykgOiBzY2FsZS5kb21haW4oKSA6IHRpY2tWYWx1ZXMsIHRpY2tGb3JtYXQgPSB0aWNrRm9ybWF0XyA9PSBudWxsID8gc2NhbGUudGlja0Zvcm1hdCA/IHNjYWxlLnRpY2tGb3JtYXQuYXBwbHkoc2NhbGUsIHRpY2tBcmd1bWVudHNfKSA6IFN0cmluZyA6IHRpY2tGb3JtYXRfOwogICAgICAgIHZhciBzdWJ0aWNrcyA9IGQzX3N2Z19heGlzU3ViZGl2aWRlKHNjYWxlLCB0aWNrcywgdGlja1N1YmRpdmlkZSksIHN1YnRpY2sgPSBnLnNlbGVjdEFsbCgiLnRpY2subWlub3IiKS5kYXRhKHN1YnRpY2tzLCBTdHJpbmcpLCBzdWJ0aWNrRW50ZXIgPSBzdWJ0aWNrLmVudGVyKCkuaW5zZXJ0KCJsaW5lIiwgIi50aWNrIikuYXR0cigiY2xhc3MiLCAidGljayBtaW5vciIpLnN0eWxlKCJvcGFjaXR5IiwgMWUtNiksIHN1YnRpY2tFeGl0ID0gZDMudHJhbnNpdGlvbihzdWJ0aWNrLmV4aXQoKSkuc3R5bGUoIm9wYWNpdHkiLCAxZS02KS5yZW1vdmUoKSwgc3VidGlja1VwZGF0ZSA9IGQzLnRyYW5zaXRpb24oc3VidGljaykuc3R5bGUoIm9wYWNpdHkiLCAxKTsKICAgICAgICB2YXIgdGljayA9IGcuc2VsZWN0QWxsKCIudGljay5tYWpvciIpLmRhdGEodGlja3MsIFN0cmluZyksIHRpY2tFbnRlciA9IHRpY2suZW50ZXIoKS5pbnNlcnQoImciLCAicGF0aCIpLmF0dHIoImNsYXNzIiwgInRpY2sgbWFqb3IiKS5zdHlsZSgib3BhY2l0eSIsIDFlLTYpLCB0aWNrRXhpdCA9IGQzLnRyYW5zaXRpb24odGljay5leGl0KCkpLnN0eWxlKCJvcGFjaXR5IiwgMWUtNikucmVtb3ZlKCksIHRpY2tVcGRhdGUgPSBkMy50cmFuc2l0aW9uKHRpY2spLnN0eWxlKCJvcGFjaXR5IiwgMSksIHRpY2tUcmFuc2Zvcm07CiAgICAgICAgdmFyIHJhbmdlID0gZDNfc2NhbGVSYW5nZShzY2FsZSksIHBhdGggPSBnLnNlbGVjdEFsbCgiLmRvbWFpbiIpLmRhdGEoWyAwIF0pLCBwYXRoVXBkYXRlID0gKHBhdGguZW50ZXIoKS5hcHBlbmQoInBhdGgiKS5hdHRyKCJjbGFzcyIsICJkb21haW4iKSwgCiAgICAgICAgZDMudHJhbnNpdGlvbihwYXRoKSk7CiAgICAgICAgdmFyIHNjYWxlMSA9IHNjYWxlLmNvcHkoKSwgc2NhbGUwID0gdGhpcy5fX2NoYXJ0X18gfHwgc2NhbGUxOwogICAgICAgIHRoaXMuX19jaGFydF9fID0gc2NhbGUxOwogICAgICAgIHRpY2tFbnRlci5hcHBlbmQoImxpbmUiKTsKICAgICAgICB0aWNrRW50ZXIuYXBwZW5kKCJ0ZXh0Iik7CiAgICAgICAgdmFyIGxpbmVFbnRlciA9IHRpY2tFbnRlci5zZWxlY3QoImxpbmUiKSwgbGluZVVwZGF0ZSA9IHRpY2tVcGRhdGUuc2VsZWN0KCJsaW5lIiksIHRleHQgPSB0aWNrLnNlbGVjdCgidGV4dCIpLnRleHQodGlja0Zvcm1hdCksIHRleHRFbnRlciA9IHRpY2tFbnRlci5zZWxlY3QoInRleHQiKSwgdGV4dFVwZGF0ZSA9IHRpY2tVcGRhdGUuc2VsZWN0KCJ0ZXh0Iik7CiAgICAgICAgc3dpdGNoIChvcmllbnQpIHsKICAgICAgICAgY2FzZSAiYm90dG9tIjoKICAgICAgICAgIHsKICAgICAgICAgICAgdGlja1RyYW5zZm9ybSA9IGQzX3N2Z19heGlzWDsKICAgICAgICAgICAgc3VidGlja0VudGVyLmF0dHIoInkyIiwgdGlja01pbm9yU2l6ZSk7CiAgICAgICAgICAgIHN1YnRpY2tVcGRhdGUuYXR0cigieDIiLCAwKS5hdHRyKCJ5MiIsIHRpY2tNaW5vclNpemUpOwogICAgICAgICAgICBsaW5lRW50ZXIuYXR0cigieTIiLCB0aWNrTWFqb3JTaXplKTsKICAgICAgICAgICAgdGV4dEVudGVyLmF0dHIoInkiLCBNYXRoLm1heCh0aWNrTWFqb3JTaXplLCAwKSArIHRpY2tQYWRkaW5nKTsKICAgICAgICAgICAgbGluZVVwZGF0ZS5hdHRyKCJ4MiIsIDApLmF0dHIoInkyIiwgdGlja01ham9yU2l6ZSk7CiAgICAgICAgICAgIHRleHRVcGRhdGUuYXR0cigieCIsIDApLmF0dHIoInkiLCBNYXRoLm1heCh0aWNrTWFqb3JTaXplLCAwKSArIHRpY2tQYWRkaW5nKTsKICAgICAgICAgICAgdGV4dC5hdHRyKCJkeSIsICIuNzFlbSIpLnN0eWxlKCJ0ZXh0LWFuY2hvciIsICJtaWRkbGUiKTsKICAgICAgICAgICAgcGF0aFVwZGF0ZS5hdHRyKCJkIiwgIk0iICsgcmFuZ2VbMF0gKyAiLCIgKyB0aWNrRW5kU2l6ZSArICJWMEgiICsgcmFuZ2VbMV0gKyAiViIgKyB0aWNrRW5kU2l6ZSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQoKICAgICAgICAgY2FzZSAidG9wIjoKICAgICAgICAgIHsKICAgICAgICAgICAgdGlja1RyYW5zZm9ybSA9IGQzX3N2Z19heGlzWDsKICAgICAgICAgICAgc3VidGlja0VudGVyLmF0dHIoInkyIiwgLXRpY2tNaW5vclNpemUpOwogICAgICAgICAgICBzdWJ0aWNrVXBkYXRlLmF0dHIoIngyIiwgMCkuYXR0cigieTIiLCAtdGlja01pbm9yU2l6ZSk7CiAgICAgICAgICAgIGxpbmVFbnRlci5hdHRyKCJ5MiIsIC10aWNrTWFqb3JTaXplKTsKICAgICAgICAgICAgdGV4dEVudGVyLmF0dHIoInkiLCAtKE1hdGgubWF4KHRpY2tNYWpvclNpemUsIDApICsgdGlja1BhZGRpbmcpKTsKICAgICAgICAgICAgbGluZVVwZGF0ZS5hdHRyKCJ4MiIsIDApLmF0dHIoInkyIiwgLXRpY2tNYWpvclNpemUpOwogICAgICAgICAgICB0ZXh0VXBkYXRlLmF0dHIoIngiLCAwKS5hdHRyKCJ5IiwgLShNYXRoLm1heCh0aWNrTWFqb3JTaXplLCAwKSArIHRpY2tQYWRkaW5nKSk7CiAgICAgICAgICAgIHRleHQuYXR0cigiZHkiLCAiMGVtIikuc3R5bGUoInRleHQtYW5jaG9yIiwgIm1pZGRsZSIpOwogICAgICAgICAgICBwYXRoVXBkYXRlLmF0dHIoImQiLCAiTSIgKyByYW5nZVswXSArICIsIiArIC10aWNrRW5kU2l6ZSArICJWMEgiICsgcmFuZ2VbMV0gKyAiViIgKyAtdGlja0VuZFNpemUpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KCiAgICAgICAgIGNhc2UgImxlZnQiOgogICAgICAgICAgewogICAgICAgICAgICB0aWNrVHJhbnNmb3JtID0gZDNfc3ZnX2F4aXNZOwogICAgICAgICAgICBzdWJ0aWNrRW50ZXIuYXR0cigieDIiLCAtdGlja01pbm9yU2l6ZSk7CiAgICAgICAgICAgIHN1YnRpY2tVcGRhdGUuYXR0cigieDIiLCAtdGlja01pbm9yU2l6ZSkuYXR0cigieTIiLCAwKTsKICAgICAgICAgICAgbGluZUVudGVyLmF0dHIoIngyIiwgLXRpY2tNYWpvclNpemUpOwogICAgICAgICAgICB0ZXh0RW50ZXIuYXR0cigieCIsIC0oTWF0aC5tYXgodGlja01ham9yU2l6ZSwgMCkgKyB0aWNrUGFkZGluZykpOwogICAgICAgICAgICBsaW5lVXBkYXRlLmF0dHIoIngyIiwgLXRpY2tNYWpvclNpemUpLmF0dHIoInkyIiwgMCk7CiAgICAgICAgICAgIHRleHRVcGRhdGUuYXR0cigieCIsIC0oTWF0aC5tYXgodGlja01ham9yU2l6ZSwgMCkgKyB0aWNrUGFkZGluZykpLmF0dHIoInkiLCAwKTsKICAgICAgICAgICAgdGV4dC5hdHRyKCJkeSIsICIuMzJlbSIpLnN0eWxlKCJ0ZXh0LWFuY2hvciIsICJlbmQiKTsKICAgICAgICAgICAgcGF0aFVwZGF0ZS5hdHRyKCJkIiwgIk0iICsgLXRpY2tFbmRTaXplICsgIiwiICsgcmFuZ2VbMF0gKyAiSDBWIiArIHJhbmdlWzFdICsgIkgiICsgLXRpY2tFbmRTaXplKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CgogICAgICAgICBjYXNlICJyaWdodCI6CiAgICAgICAgICB7CiAgICAgICAgICAgIHRpY2tUcmFuc2Zvcm0gPSBkM19zdmdfYXhpc1k7CiAgICAgICAgICAgIHN1YnRpY2tFbnRlci5hdHRyKCJ4MiIsIHRpY2tNaW5vclNpemUpOwogICAgICAgICAgICBzdWJ0aWNrVXBkYXRlLmF0dHIoIngyIiwgdGlja01pbm9yU2l6ZSkuYXR0cigieTIiLCAwKTsKICAgICAgICAgICAgbGluZUVudGVyLmF0dHIoIngyIiwgdGlja01ham9yU2l6ZSk7CiAgICAgICAgICAgIHRleHRFbnRlci5hdHRyKCJ4IiwgTWF0aC5tYXgodGlja01ham9yU2l6ZSwgMCkgKyB0aWNrUGFkZGluZyk7CiAgICAgICAgICAgIGxpbmVVcGRhdGUuYXR0cigieDIiLCB0aWNrTWFqb3JTaXplKS5hdHRyKCJ5MiIsIDApOwogICAgICAgICAgICB0ZXh0VXBkYXRlLmF0dHIoIngiLCBNYXRoLm1heCh0aWNrTWFqb3JTaXplLCAwKSArIHRpY2tQYWRkaW5nKS5hdHRyKCJ5IiwgMCk7CiAgICAgICAgICAgIHRleHQuYXR0cigiZHkiLCAiLjMyZW0iKS5zdHlsZSgidGV4dC1hbmNob3IiLCAic3RhcnQiKTsKICAgICAgICAgICAgcGF0aFVwZGF0ZS5hdHRyKCJkIiwgIk0iICsgdGlja0VuZFNpemUgKyAiLCIgKyByYW5nZVswXSArICJIMFYiICsgcmFuZ2VbMV0gKyAiSCIgKyB0aWNrRW5kU2l6ZSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoc2NhbGUudGlja3MpIHsKICAgICAgICAgIHRpY2tFbnRlci5jYWxsKHRpY2tUcmFuc2Zvcm0sIHNjYWxlMCk7CiAgICAgICAgICB0aWNrVXBkYXRlLmNhbGwodGlja1RyYW5zZm9ybSwgc2NhbGUxKTsKICAgICAgICAgIHRpY2tFeGl0LmNhbGwodGlja1RyYW5zZm9ybSwgc2NhbGUxKTsKICAgICAgICAgIHN1YnRpY2tFbnRlci5jYWxsKHRpY2tUcmFuc2Zvcm0sIHNjYWxlMCk7CiAgICAgICAgICBzdWJ0aWNrVXBkYXRlLmNhbGwodGlja1RyYW5zZm9ybSwgc2NhbGUxKTsKICAgICAgICAgIHN1YnRpY2tFeGl0LmNhbGwodGlja1RyYW5zZm9ybSwgc2NhbGUxKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFyIGR4ID0gc2NhbGUxLnJhbmdlQmFuZCgpIC8gMiwgeCA9IGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgcmV0dXJuIHNjYWxlMShkKSArIGR4OwogICAgICAgICAgfTsKICAgICAgICAgIHRpY2tFbnRlci5jYWxsKHRpY2tUcmFuc2Zvcm0sIHgpOwogICAgICAgICAgdGlja1VwZGF0ZS5jYWxsKHRpY2tUcmFuc2Zvcm0sIHgpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgICBheGlzLnNjYWxlID0gZnVuY3Rpb24oeCkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzY2FsZTsKICAgICAgc2NhbGUgPSB4OwogICAgICByZXR1cm4gYXhpczsKICAgIH07CiAgICBheGlzLm9yaWVudCA9IGZ1bmN0aW9uKHgpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gb3JpZW50OwogICAgICBvcmllbnQgPSB4IGluIGQzX3N2Z19heGlzT3JpZW50cyA/IHggKyAiIiA6IGQzX3N2Z19heGlzRGVmYXVsdE9yaWVudDsKICAgICAgcmV0dXJuIGF4aXM7CiAgICB9OwogICAgYXhpcy50aWNrcyA9IGZ1bmN0aW9uKCkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB0aWNrQXJndW1lbnRzXzsKICAgICAgdGlja0FyZ3VtZW50c18gPSBhcmd1bWVudHM7CiAgICAgIHJldHVybiBheGlzOwogICAgfTsKICAgIGF4aXMudGlja1ZhbHVlcyA9IGZ1bmN0aW9uKHgpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdGlja1ZhbHVlczsKICAgICAgdGlja1ZhbHVlcyA9IHg7CiAgICAgIHJldHVybiBheGlzOwogICAgfTsKICAgIGF4aXMudGlja0Zvcm1hdCA9IGZ1bmN0aW9uKHgpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdGlja0Zvcm1hdF87CiAgICAgIHRpY2tGb3JtYXRfID0geDsKICAgICAgcmV0dXJuIGF4aXM7CiAgICB9OwogICAgYXhpcy50aWNrU2l6ZSA9IGZ1bmN0aW9uKHgsIHkpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdGlja01ham9yU2l6ZTsKICAgICAgdmFyIG4gPSBhcmd1bWVudHMubGVuZ3RoIC0gMTsKICAgICAgdGlja01ham9yU2l6ZSA9ICt4OwogICAgICB0aWNrTWlub3JTaXplID0gbiA+IDEgPyAreSA6IHRpY2tNYWpvclNpemU7CiAgICAgIHRpY2tFbmRTaXplID0gbiA+IDAgPyArYXJndW1lbnRzW25dIDogdGlja01ham9yU2l6ZTsKICAgICAgcmV0dXJuIGF4aXM7CiAgICB9OwogICAgYXhpcy50aWNrUGFkZGluZyA9IGZ1bmN0aW9uKHgpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdGlja1BhZGRpbmc7CiAgICAgIHRpY2tQYWRkaW5nID0gK3g7CiAgICAgIHJldHVybiBheGlzOwogICAgfTsKICAgIGF4aXMudGlja1N1YmRpdmlkZSA9IGZ1bmN0aW9uKHgpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdGlja1N1YmRpdmlkZTsKICAgICAgdGlja1N1YmRpdmlkZSA9ICt4OwogICAgICByZXR1cm4gYXhpczsKICAgIH07CiAgICByZXR1cm4gYXhpczsKICB9OwogIHZhciBkM19zdmdfYXhpc0RlZmF1bHRPcmllbnQgPSAiYm90dG9tIiwgZDNfc3ZnX2F4aXNPcmllbnRzID0gewogICAgdG9wOiAxLAogICAgcmlnaHQ6IDEsCiAgICBib3R0b206IDEsCiAgICBsZWZ0OiAxCiAgfTsKICBmdW5jdGlvbiBkM19zdmdfYXhpc1goc2VsZWN0aW9uLCB4KSB7CiAgICBzZWxlY3Rpb24uYXR0cigidHJhbnNmb3JtIiwgZnVuY3Rpb24oZCkgewogICAgICByZXR1cm4gInRyYW5zbGF0ZSgiICsgeChkKSArICIsMCkiOwogICAgfSk7CiAgfQogIGZ1bmN0aW9uIGQzX3N2Z19heGlzWShzZWxlY3Rpb24sIHkpIHsKICAgIHNlbGVjdGlvbi5hdHRyKCJ0cmFuc2Zvcm0iLCBmdW5jdGlvbihkKSB7CiAgICAgIHJldHVybiAidHJhbnNsYXRlKDAsIiArIHkoZCkgKyAiKSI7CiAgICB9KTsKICB9CiAgZnVuY3Rpb24gZDNfc3ZnX2F4aXNTdWJkaXZpZGUoc2NhbGUsIHRpY2tzLCBtKSB7CiAgICBzdWJ0aWNrcyA9IFtdOwogICAgaWYgKG0gJiYgdGlja3MubGVuZ3RoID4gMSkgewogICAgICB2YXIgZXh0ZW50ID0gZDNfc2NhbGVFeHRlbnQoc2NhbGUuZG9tYWluKCkpLCBzdWJ0aWNrcywgaSA9IC0xLCBuID0gdGlja3MubGVuZ3RoLCBkID0gKHRpY2tzWzFdIC0gdGlja3NbMF0pIC8gKyttLCBqLCB2OwogICAgICB3aGlsZSAoKytpIDwgbikgewogICAgICAgIGZvciAoaiA9IG07IC0taiA+IDA7ICkgewogICAgICAgICAgaWYgKCh2ID0gK3RpY2tzW2ldIC0gaiAqIGQpID49IGV4dGVudFswXSkgewogICAgICAgICAgICBzdWJ0aWNrcy5wdXNoKHYpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBmb3IgKC0taSwgaiA9IDA7ICsraiA8IG0gJiYgKHYgPSArdGlja3NbaV0gKyBqICogZCkgPCBleHRlbnRbMV07ICkgewogICAgICAgIHN1YnRpY2tzLnB1c2godik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBzdWJ0aWNrczsKICB9CiAgZDMuc3ZnLmJydXNoID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgZXZlbnQgPSBkM19ldmVudERpc3BhdGNoKGJydXNoLCAiYnJ1c2hzdGFydCIsICJicnVzaCIsICJicnVzaGVuZCIpLCB4ID0gbnVsbCwgeSA9IG51bGwsIHJlc2l6ZXMgPSBkM19zdmdfYnJ1c2hSZXNpemVzWzBdLCBleHRlbnQgPSBbIFsgMCwgMCBdLCBbIDAsIDAgXSBdLCBleHRlbnREb21haW47CiAgICBmdW5jdGlvbiBicnVzaChnKSB7CiAgICAgIGcuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICB2YXIgZyA9IGQzLnNlbGVjdCh0aGlzKSwgYmcgPSBnLnNlbGVjdEFsbCgiLmJhY2tncm91bmQiKS5kYXRhKFsgMCBdKSwgZmcgPSBnLnNlbGVjdEFsbCgiLmV4dGVudCIpLmRhdGEoWyAwIF0pLCB0eiA9IGcuc2VsZWN0QWxsKCIucmVzaXplIikuZGF0YShyZXNpemVzLCBTdHJpbmcpLCBlOwogICAgICAgIGcuc3R5bGUoInBvaW50ZXItZXZlbnRzIiwgImFsbCIpLm9uKCJtb3VzZWRvd24uYnJ1c2giLCBicnVzaHN0YXJ0KS5vbigidG91Y2hzdGFydC5icnVzaCIsIGJydXNoc3RhcnQpOwogICAgICAgIGJnLmVudGVyKCkuYXBwZW5kKCJyZWN0IikuYXR0cigiY2xhc3MiLCAiYmFja2dyb3VuZCIpLnN0eWxlKCJ2aXNpYmlsaXR5IiwgImhpZGRlbiIpLnN0eWxlKCJjdXJzb3IiLCAiY3Jvc3NoYWlyIik7CiAgICAgICAgZmcuZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJjbGFzcyIsICJleHRlbnQiKS5zdHlsZSgiY3Vyc29yIiwgIm1vdmUiKTsKICAgICAgICB0ei5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwgZnVuY3Rpb24oZCkgewogICAgICAgICAgcmV0dXJuICJyZXNpemUgIiArIGQ7CiAgICAgICAgfSkuc3R5bGUoImN1cnNvciIsIGZ1bmN0aW9uKGQpIHsKICAgICAgICAgIHJldHVybiBkM19zdmdfYnJ1c2hDdXJzb3JbZF07CiAgICAgICAgfSkuYXBwZW5kKCJyZWN0IikuYXR0cigieCIsIGZ1bmN0aW9uKGQpIHsKICAgICAgICAgIHJldHVybiAvW2V3XSQvLnRlc3QoZCkgPyAtMyA6IG51bGw7CiAgICAgICAgfSkuYXR0cigieSIsIGZ1bmN0aW9uKGQpIHsKICAgICAgICAgIHJldHVybiAvXltuc10vLnRlc3QoZCkgPyAtMyA6IG51bGw7CiAgICAgICAgfSkuYXR0cigid2lkdGgiLCA2KS5hdHRyKCJoZWlnaHQiLCA2KS5zdHlsZSgidmlzaWJpbGl0eSIsICJoaWRkZW4iKTsKICAgICAgICB0ei5zdHlsZSgiZGlzcGxheSIsIGJydXNoLmVtcHR5KCkgPyAibm9uZSIgOiBudWxsKTsKICAgICAgICB0ei5leGl0KCkucmVtb3ZlKCk7CiAgICAgICAgaWYgKHgpIHsKICAgICAgICAgIGUgPSBkM19zY2FsZVJhbmdlKHgpOwogICAgICAgICAgYmcuYXR0cigieCIsIGVbMF0pLmF0dHIoIndpZHRoIiwgZVsxXSAtIGVbMF0pOwogICAgICAgICAgcmVkcmF3WChnKTsKICAgICAgICB9CiAgICAgICAgaWYgKHkpIHsKICAgICAgICAgIGUgPSBkM19zY2FsZVJhbmdlKHkpOwogICAgICAgICAgYmcuYXR0cigieSIsIGVbMF0pLmF0dHIoImhlaWdodCIsIGVbMV0gLSBlWzBdKTsKICAgICAgICAgIHJlZHJhd1koZyk7CiAgICAgICAgfQogICAgICAgIHJlZHJhdyhnKTsKICAgICAgfSk7CiAgICB9CiAgICBmdW5jdGlvbiByZWRyYXcoZykgewogICAgICBnLnNlbGVjdEFsbCgiLnJlc2l6ZSIpLmF0dHIoInRyYW5zZm9ybSIsIGZ1bmN0aW9uKGQpIHsKICAgICAgICByZXR1cm4gInRyYW5zbGF0ZSgiICsgZXh0ZW50WysvZSQvLnRlc3QoZCldWzBdICsgIiwiICsgZXh0ZW50WysvXnMvLnRlc3QoZCldWzFdICsgIikiOwogICAgICB9KTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlZHJhd1goZykgewogICAgICBnLnNlbGVjdCgiLmV4dGVudCIpLmF0dHIoIngiLCBleHRlbnRbMF1bMF0pOwogICAgICBnLnNlbGVjdEFsbCgiLmV4dGVudCwubj5yZWN0LC5zPnJlY3QiKS5hdHRyKCJ3aWR0aCIsIGV4dGVudFsxXVswXSAtIGV4dGVudFswXVswXSk7CiAgICB9CiAgICBmdW5jdGlvbiByZWRyYXdZKGcpIHsKICAgICAgZy5zZWxlY3QoIi5leHRlbnQiKS5hdHRyKCJ5IiwgZXh0ZW50WzBdWzFdKTsKICAgICAgZy5zZWxlY3RBbGwoIi5leHRlbnQsLmU+cmVjdCwudz5yZWN0IikuYXR0cigiaGVpZ2h0IiwgZXh0ZW50WzFdWzFdIC0gZXh0ZW50WzBdWzFdKTsKICAgIH0KICAgIGZ1bmN0aW9uIGJydXNoc3RhcnQoKSB7CiAgICAgIHZhciB0YXJnZXQgPSB0aGlzLCBldmVudFRhcmdldCA9IGQzLnNlbGVjdChkMy5ldmVudC50YXJnZXQpLCBldmVudF8gPSBldmVudC5vZih0YXJnZXQsIGFyZ3VtZW50cyksIGcgPSBkMy5zZWxlY3QodGFyZ2V0KSwgcmVzaXppbmcgPSBldmVudFRhcmdldC5kYXR1bSgpLCByZXNpemluZ1ggPSAhL14obnxzKSQvLnRlc3QocmVzaXppbmcpICYmIHgsIHJlc2l6aW5nWSA9ICEvXihlfHcpJC8udGVzdChyZXNpemluZykgJiYgeSwgZHJhZ2dpbmcgPSBldmVudFRhcmdldC5jbGFzc2VkKCJleHRlbnQiKSwgY2VudGVyLCBvcmlnaW4gPSBtb3VzZSgpLCBvZmZzZXQ7CiAgICAgIHZhciB3ID0gZDMuc2VsZWN0KGQzX3dpbmRvdykub24oIm1vdXNlbW92ZS5icnVzaCIsIGJydXNobW92ZSkub24oIm1vdXNldXAuYnJ1c2giLCBicnVzaGVuZCkub24oInRvdWNobW92ZS5icnVzaCIsIGJydXNobW92ZSkub24oInRvdWNoZW5kLmJydXNoIiwgYnJ1c2hlbmQpLm9uKCJrZXlkb3duLmJydXNoIiwga2V5ZG93bikub24oImtleXVwLmJydXNoIiwga2V5dXApOwogICAgICBpZiAoZHJhZ2dpbmcpIHsKICAgICAgICBvcmlnaW5bMF0gPSBleHRlbnRbMF1bMF0gLSBvcmlnaW5bMF07CiAgICAgICAgb3JpZ2luWzFdID0gZXh0ZW50WzBdWzFdIC0gb3JpZ2luWzFdOwogICAgICB9IGVsc2UgaWYgKHJlc2l6aW5nKSB7CiAgICAgICAgdmFyIGV4ID0gKy93JC8udGVzdChyZXNpemluZyksIGV5ID0gKy9ebi8udGVzdChyZXNpemluZyk7CiAgICAgICAgb2Zmc2V0ID0gWyBleHRlbnRbMSAtIGV4XVswXSAtIG9yaWdpblswXSwgZXh0ZW50WzEgLSBleV1bMV0gLSBvcmlnaW5bMV0gXTsKICAgICAgICBvcmlnaW5bMF0gPSBleHRlbnRbZXhdWzBdOwogICAgICAgIG9yaWdpblsxXSA9IGV4dGVudFtleV1bMV07CiAgICAgIH0gZWxzZSBpZiAoZDMuZXZlbnQuYWx0S2V5KSBjZW50ZXIgPSBvcmlnaW4uc2xpY2UoKTsKICAgICAgZy5zdHlsZSgicG9pbnRlci1ldmVudHMiLCAibm9uZSIpLnNlbGVjdEFsbCgiLnJlc2l6ZSIpLnN0eWxlKCJkaXNwbGF5IiwgbnVsbCk7CiAgICAgIGQzLnNlbGVjdCgiYm9keSIpLnN0eWxlKCJjdXJzb3IiLCBldmVudFRhcmdldC5zdHlsZSgiY3Vyc29yIikpOwogICAgICBldmVudF8oewogICAgICAgIHR5cGU6ICJicnVzaHN0YXJ0IgogICAgICB9KTsKICAgICAgYnJ1c2htb3ZlKCk7CiAgICAgIGQzX2V2ZW50Q2FuY2VsKCk7CiAgICAgIGZ1bmN0aW9uIG1vdXNlKCkgewogICAgICAgIHZhciB0b3VjaGVzID0gZDMuZXZlbnQuY2hhbmdlZFRvdWNoZXM7CiAgICAgICAgcmV0dXJuIHRvdWNoZXMgPyBkMy50b3VjaGVzKHRhcmdldCwgdG91Y2hlcylbMF0gOiBkMy5tb3VzZSh0YXJnZXQpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGtleWRvd24oKSB7CiAgICAgICAgaWYgKGQzLmV2ZW50LmtleUNvZGUgPT0gMzIpIHsKICAgICAgICAgIGlmICghZHJhZ2dpbmcpIHsKICAgICAgICAgICAgY2VudGVyID0gbnVsbDsKICAgICAgICAgICAgb3JpZ2luWzBdIC09IGV4dGVudFsxXVswXTsKICAgICAgICAgICAgb3JpZ2luWzFdIC09IGV4dGVudFsxXVsxXTsKICAgICAgICAgICAgZHJhZ2dpbmcgPSAyOwogICAgICAgICAgfQogICAgICAgICAgZDNfZXZlbnRDYW5jZWwoKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZnVuY3Rpb24ga2V5dXAoKSB7CiAgICAgICAgaWYgKGQzLmV2ZW50LmtleUNvZGUgPT0gMzIgJiYgZHJhZ2dpbmcgPT0gMikgewogICAgICAgICAgb3JpZ2luWzBdICs9IGV4dGVudFsxXVswXTsKICAgICAgICAgIG9yaWdpblsxXSArPSBleHRlbnRbMV1bMV07CiAgICAgICAgICBkcmFnZ2luZyA9IDA7CiAgICAgICAgICBkM19ldmVudENhbmNlbCgpOwogICAgICAgIH0KICAgICAgfQogICAgICBmdW5jdGlvbiBicnVzaG1vdmUoKSB7CiAgICAgICAgdmFyIHBvaW50ID0gbW91c2UoKSwgbW92ZWQgPSBmYWxzZTsKICAgICAgICBpZiAob2Zmc2V0KSB7CiAgICAgICAgICBwb2ludFswXSArPSBvZmZzZXRbMF07CiAgICAgICAgICBwb2ludFsxXSArPSBvZmZzZXRbMV07CiAgICAgICAgfQogICAgICAgIGlmICghZHJhZ2dpbmcpIHsKICAgICAgICAgIGlmIChkMy5ldmVudC5hbHRLZXkpIHsKICAgICAgICAgICAgaWYgKCFjZW50ZXIpIGNlbnRlciA9IFsgKGV4dGVudFswXVswXSArIGV4dGVudFsxXVswXSkgLyAyLCAoZXh0ZW50WzBdWzFdICsgZXh0ZW50WzFdWzFdKSAvIDIgXTsKICAgICAgICAgICAgb3JpZ2luWzBdID0gZXh0ZW50WysocG9pbnRbMF0gPCBjZW50ZXJbMF0pXVswXTsKICAgICAgICAgICAgb3JpZ2luWzFdID0gZXh0ZW50WysocG9pbnRbMV0gPCBjZW50ZXJbMV0pXVsxXTsKICAgICAgICAgIH0gZWxzZSBjZW50ZXIgPSBudWxsOwogICAgICAgIH0KICAgICAgICBpZiAocmVzaXppbmdYICYmIG1vdmUxKHBvaW50LCB4LCAwKSkgewogICAgICAgICAgcmVkcmF3WChnKTsKICAgICAgICAgIG1vdmVkID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHJlc2l6aW5nWSAmJiBtb3ZlMShwb2ludCwgeSwgMSkpIHsKICAgICAgICAgIHJlZHJhd1koZyk7CiAgICAgICAgICBtb3ZlZCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGlmIChtb3ZlZCkgewogICAgICAgICAgcmVkcmF3KGcpOwogICAgICAgICAgZXZlbnRfKHsKICAgICAgICAgICAgdHlwZTogImJydXNoIiwKICAgICAgICAgICAgbW9kZTogZHJhZ2dpbmcgPyAibW92ZSIgOiAicmVzaXplIgogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGZ1bmN0aW9uIG1vdmUxKHBvaW50LCBzY2FsZSwgaSkgewogICAgICAgIHZhciByYW5nZSA9IGQzX3NjYWxlUmFuZ2Uoc2NhbGUpLCByMCA9IHJhbmdlWzBdLCByMSA9IHJhbmdlWzFdLCBwb3NpdGlvbiA9IG9yaWdpbltpXSwgc2l6ZSA9IGV4dGVudFsxXVtpXSAtIGV4dGVudFswXVtpXSwgbWluLCBtYXg7CiAgICAgICAgaWYgKGRyYWdnaW5nKSB7CiAgICAgICAgICByMCAtPSBwb3NpdGlvbjsKICAgICAgICAgIHIxIC09IHNpemUgKyBwb3NpdGlvbjsKICAgICAgICB9CiAgICAgICAgbWluID0gTWF0aC5tYXgocjAsIE1hdGgubWluKHIxLCBwb2ludFtpXSkpOwogICAgICAgIGlmIChkcmFnZ2luZykgewogICAgICAgICAgbWF4ID0gKG1pbiArPSBwb3NpdGlvbikgKyBzaXplOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoY2VudGVyKSBwb3NpdGlvbiA9IE1hdGgubWF4KHIwLCBNYXRoLm1pbihyMSwgMiAqIGNlbnRlcltpXSAtIG1pbikpOwogICAgICAgICAgaWYgKHBvc2l0aW9uIDwgbWluKSB7CiAgICAgICAgICAgIG1heCA9IG1pbjsKICAgICAgICAgICAgbWluID0gcG9zaXRpb247CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBtYXggPSBwb3NpdGlvbjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGV4dGVudFswXVtpXSAhPT0gbWluIHx8IGV4dGVudFsxXVtpXSAhPT0gbWF4KSB7CiAgICAgICAgICBleHRlbnREb21haW4gPSBudWxsOwogICAgICAgICAgZXh0ZW50WzBdW2ldID0gbWluOwogICAgICAgICAgZXh0ZW50WzFdW2ldID0gbWF4OwogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIGZ1bmN0aW9uIGJydXNoZW5kKCkgewogICAgICAgIGJydXNobW92ZSgpOwogICAgICAgIGcuc3R5bGUoInBvaW50ZXItZXZlbnRzIiwgImFsbCIpLnNlbGVjdEFsbCgiLnJlc2l6ZSIpLnN0eWxlKCJkaXNwbGF5IiwgYnJ1c2guZW1wdHkoKSA/ICJub25lIiA6IG51bGwpOwogICAgICAgIGQzLnNlbGVjdCgiYm9keSIpLnN0eWxlKCJjdXJzb3IiLCBudWxsKTsKICAgICAgICB3Lm9uKCJtb3VzZW1vdmUuYnJ1c2giLCBudWxsKS5vbigibW91c2V1cC5icnVzaCIsIG51bGwpLm9uKCJ0b3VjaG1vdmUuYnJ1c2giLCBudWxsKS5vbigidG91Y2hlbmQuYnJ1c2giLCBudWxsKS5vbigia2V5ZG93bi5icnVzaCIsIG51bGwpLm9uKCJrZXl1cC5icnVzaCIsIG51bGwpOwogICAgICAgIGV2ZW50Xyh7CiAgICAgICAgICB0eXBlOiAiYnJ1c2hlbmQiCiAgICAgICAgfSk7CiAgICAgICAgZDNfZXZlbnRDYW5jZWwoKTsKICAgICAgfQogICAgfQogICAgYnJ1c2gueCA9IGZ1bmN0aW9uKHopIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4geDsKICAgICAgeCA9IHo7CiAgICAgIHJlc2l6ZXMgPSBkM19zdmdfYnJ1c2hSZXNpemVzWyF4IDw8IDEgfCAheV07CiAgICAgIHJldHVybiBicnVzaDsKICAgIH07CiAgICBicnVzaC55ID0gZnVuY3Rpb24oeikgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB5OwogICAgICB5ID0gejsKICAgICAgcmVzaXplcyA9IGQzX3N2Z19icnVzaFJlc2l6ZXNbIXggPDwgMSB8ICF5XTsKICAgICAgcmV0dXJuIGJydXNoOwogICAgfTsKICAgIGJydXNoLmV4dGVudCA9IGZ1bmN0aW9uKHopIHsKICAgICAgdmFyIHgwLCB4MSwgeTAsIHkxLCB0OwogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgICB6ID0gZXh0ZW50RG9tYWluIHx8IGV4dGVudDsKICAgICAgICBpZiAoeCkgewogICAgICAgICAgeDAgPSB6WzBdWzBdLCB4MSA9IHpbMV1bMF07CiAgICAgICAgICBpZiAoIWV4dGVudERvbWFpbikgewogICAgICAgICAgICB4MCA9IGV4dGVudFswXVswXSwgeDEgPSBleHRlbnRbMV1bMF07CiAgICAgICAgICAgIGlmICh4LmludmVydCkgeDAgPSB4LmludmVydCh4MCksIHgxID0geC5pbnZlcnQoeDEpOwogICAgICAgICAgICBpZiAoeDEgPCB4MCkgdCA9IHgwLCB4MCA9IHgxLCB4MSA9IHQ7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICh5KSB7CiAgICAgICAgICB5MCA9IHpbMF1bMV0sIHkxID0gelsxXVsxXTsKICAgICAgICAgIGlmICghZXh0ZW50RG9tYWluKSB7CiAgICAgICAgICAgIHkwID0gZXh0ZW50WzBdWzFdLCB5MSA9IGV4dGVudFsxXVsxXTsKICAgICAgICAgICAgaWYgKHkuaW52ZXJ0KSB5MCA9IHkuaW52ZXJ0KHkwKSwgeTEgPSB5LmludmVydCh5MSk7CiAgICAgICAgICAgIGlmICh5MSA8IHkwKSB0ID0geTAsIHkwID0geTEsIHkxID0gdDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHggJiYgeSA/IFsgWyB4MCwgeTAgXSwgWyB4MSwgeTEgXSBdIDogeCA/IFsgeDAsIHgxIF0gOiB5ICYmIFsgeTAsIHkxIF07CiAgICAgIH0KICAgICAgZXh0ZW50RG9tYWluID0gWyBbIDAsIDAgXSwgWyAwLCAwIF0gXTsKICAgICAgaWYgKHgpIHsKICAgICAgICB4MCA9IHpbMF0sIHgxID0gelsxXTsKICAgICAgICBpZiAoeSkgeDAgPSB4MFswXSwgeDEgPSB4MVswXTsKICAgICAgICBleHRlbnREb21haW5bMF1bMF0gPSB4MCwgZXh0ZW50RG9tYWluWzFdWzBdID0geDE7CiAgICAgICAgaWYgKHguaW52ZXJ0KSB4MCA9IHgoeDApLCB4MSA9IHgoeDEpOwogICAgICAgIGlmICh4MSA8IHgwKSB0ID0geDAsIHgwID0geDEsIHgxID0gdDsKICAgICAgICBleHRlbnRbMF1bMF0gPSB4MCB8IDAsIGV4dGVudFsxXVswXSA9IHgxIHwgMDsKICAgICAgfQogICAgICBpZiAoeSkgewogICAgICAgIHkwID0gelswXSwgeTEgPSB6WzFdOwogICAgICAgIGlmICh4KSB5MCA9IHkwWzFdLCB5MSA9IHkxWzFdOwogICAgICAgIGV4dGVudERvbWFpblswXVsxXSA9IHkwLCBleHRlbnREb21haW5bMV1bMV0gPSB5MTsKICAgICAgICBpZiAoeS5pbnZlcnQpIHkwID0geSh5MCksIHkxID0geSh5MSk7CiAgICAgICAgaWYgKHkxIDwgeTApIHQgPSB5MCwgeTAgPSB5MSwgeTEgPSB0OwogICAgICAgIGV4dGVudFswXVsxXSA9IHkwIHwgMCwgZXh0ZW50WzFdWzFdID0geTEgfCAwOwogICAgICB9CiAgICAgIHJldHVybiBicnVzaDsKICAgIH07CiAgICBicnVzaC5jbGVhciA9IGZ1bmN0aW9uKCkgewogICAgICBleHRlbnREb21haW4gPSBudWxsOwogICAgICBleHRlbnRbMF1bMF0gPSBleHRlbnRbMF1bMV0gPSBleHRlbnRbMV1bMF0gPSBleHRlbnRbMV1bMV0gPSAwOwogICAgICByZXR1cm4gYnJ1c2g7CiAgICB9OwogICAgYnJ1c2guZW1wdHkgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHggJiYgZXh0ZW50WzBdWzBdID09PSBleHRlbnRbMV1bMF0gfHwgeSAmJiBleHRlbnRbMF1bMV0gPT09IGV4dGVudFsxXVsxXTsKICAgIH07CiAgICByZXR1cm4gZDMucmViaW5kKGJydXNoLCBldmVudCwgIm9uIik7CiAgfTsKICB2YXIgZDNfc3ZnX2JydXNoQ3Vyc29yID0gewogICAgbjogIm5zLXJlc2l6ZSIsCiAgICBlOiAiZXctcmVzaXplIiwKICAgIHM6ICJucy1yZXNpemUiLAogICAgdzogImV3LXJlc2l6ZSIsCiAgICBudzogIm53c2UtcmVzaXplIiwKICAgIG5lOiAibmVzdy1yZXNpemUiLAogICAgc2U6ICJud3NlLXJlc2l6ZSIsCiAgICBzdzogIm5lc3ctcmVzaXplIgogIH07CiAgdmFyIGQzX3N2Z19icnVzaFJlc2l6ZXMgPSBbIFsgIm4iLCAiZSIsICJzIiwgInciLCAibnciLCAibmUiLCAic2UiLCAic3ciIF0sIFsgImUiLCAidyIgXSwgWyAibiIsICJzIiBdLCBbXSBdOwogIGQzLnRpbWUgPSB7fTsKICB2YXIgZDNfdGltZSA9IERhdGUsIGQzX3RpbWVfZGF5U3ltYm9scyA9IFsgIlN1bmRheSIsICJNb25kYXkiLCAiVHVlc2RheSIsICJXZWRuZXNkYXkiLCAiVGh1cnNkYXkiLCAiRnJpZGF5IiwgIlNhdHVyZGF5IiBdOwogIGZ1bmN0aW9uIGQzX3RpbWVfdXRjKCkgewogICAgdGhpcy5fID0gbmV3IERhdGUoYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBEYXRlLlVUQy5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogYXJndW1lbnRzWzBdKTsKICB9CiAgZDNfdGltZV91dGMucHJvdG90eXBlID0gewogICAgZ2V0RGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLl8uZ2V0VVRDRGF0ZSgpOwogICAgfSwKICAgIGdldERheTogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLl8uZ2V0VVRDRGF5KCk7CiAgICB9LAogICAgZ2V0RnVsbFllYXI6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy5fLmdldFVUQ0Z1bGxZZWFyKCk7CiAgICB9LAogICAgZ2V0SG91cnM6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy5fLmdldFVUQ0hvdXJzKCk7CiAgICB9LAogICAgZ2V0TWlsbGlzZWNvbmRzOiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuXy5nZXRVVENNaWxsaXNlY29uZHMoKTsKICAgIH0sCiAgICBnZXRNaW51dGVzOiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuXy5nZXRVVENNaW51dGVzKCk7CiAgICB9LAogICAgZ2V0TW9udGg6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy5fLmdldFVUQ01vbnRoKCk7CiAgICB9LAogICAgZ2V0U2Vjb25kczogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLl8uZ2V0VVRDU2Vjb25kcygpOwogICAgfSwKICAgIGdldFRpbWU6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy5fLmdldFRpbWUoKTsKICAgIH0sCiAgICBnZXRUaW1lem9uZU9mZnNldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIHZhbHVlT2Y6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy5fLnZhbHVlT2YoKTsKICAgIH0sCiAgICBzZXREYXRlOiBmdW5jdGlvbigpIHsKICAgICAgZDNfdGltZV9wcm90b3R5cGUuc2V0VVRDRGF0ZS5hcHBseSh0aGlzLl8sIGFyZ3VtZW50cyk7CiAgICB9LAogICAgc2V0RGF5OiBmdW5jdGlvbigpIHsKICAgICAgZDNfdGltZV9wcm90b3R5cGUuc2V0VVRDRGF5LmFwcGx5KHRoaXMuXywgYXJndW1lbnRzKTsKICAgIH0sCiAgICBzZXRGdWxsWWVhcjogZnVuY3Rpb24oKSB7CiAgICAgIGQzX3RpbWVfcHJvdG90eXBlLnNldFVUQ0Z1bGxZZWFyLmFwcGx5KHRoaXMuXywgYXJndW1lbnRzKTsKICAgIH0sCiAgICBzZXRIb3VyczogZnVuY3Rpb24oKSB7CiAgICAgIGQzX3RpbWVfcHJvdG90eXBlLnNldFVUQ0hvdXJzLmFwcGx5KHRoaXMuXywgYXJndW1lbnRzKTsKICAgIH0sCiAgICBzZXRNaWxsaXNlY29uZHM6IGZ1bmN0aW9uKCkgewogICAgICBkM190aW1lX3Byb3RvdHlwZS5zZXRVVENNaWxsaXNlY29uZHMuYXBwbHkodGhpcy5fLCBhcmd1bWVudHMpOwogICAgfSwKICAgIHNldE1pbnV0ZXM6IGZ1bmN0aW9uKCkgewogICAgICBkM190aW1lX3Byb3RvdHlwZS5zZXRVVENNaW51dGVzLmFwcGx5KHRoaXMuXywgYXJndW1lbnRzKTsKICAgIH0sCiAgICBzZXRNb250aDogZnVuY3Rpb24oKSB7CiAgICAgIGQzX3RpbWVfcHJvdG90eXBlLnNldFVUQ01vbnRoLmFwcGx5KHRoaXMuXywgYXJndW1lbnRzKTsKICAgIH0sCiAgICBzZXRTZWNvbmRzOiBmdW5jdGlvbigpIHsKICAgICAgZDNfdGltZV9wcm90b3R5cGUuc2V0VVRDU2Vjb25kcy5hcHBseSh0aGlzLl8sIGFyZ3VtZW50cyk7CiAgICB9LAogICAgc2V0VGltZTogZnVuY3Rpb24oKSB7CiAgICAgIGQzX3RpbWVfcHJvdG90eXBlLnNldFRpbWUuYXBwbHkodGhpcy5fLCBhcmd1bWVudHMpOwogICAgfQogIH07CiAgdmFyIGQzX3RpbWVfcHJvdG90eXBlID0gRGF0ZS5wcm90b3R5cGU7CiAgdmFyIGQzX3RpbWVfZm9ybWF0RGF0ZVRpbWUgPSAiJWEgJWIgJWUgJVggJVkiLCBkM190aW1lX2Zvcm1hdERhdGUgPSAiJW0vJWQvJVkiLCBkM190aW1lX2Zvcm1hdFRpbWUgPSAiJUg6JU06JVMiOwogIHZhciBkM190aW1lX2RheXMgPSBbICJTdW5kYXkiLCAiTW9uZGF5IiwgIlR1ZXNkYXkiLCAiV2VkbmVzZGF5IiwgIlRodXJzZGF5IiwgIkZyaWRheSIsICJTYXR1cmRheSIgXSwgZDNfdGltZV9kYXlBYmJyZXZpYXRpb25zID0gWyAiU3VuIiwgIk1vbiIsICJUdWUiLCAiV2VkIiwgIlRodSIsICJGcmkiLCAiU2F0IiBdLCBkM190aW1lX21vbnRocyA9IFsgIkphbnVhcnkiLCAiRmVicnVhcnkiLCAiTWFyY2giLCAiQXByaWwiLCAiTWF5IiwgIkp1bmUiLCAiSnVseSIsICJBdWd1c3QiLCAiU2VwdGVtYmVyIiwgIk9jdG9iZXIiLCAiTm92ZW1iZXIiLCAiRGVjZW1iZXIiIF0sIGQzX3RpbWVfbW9udGhBYmJyZXZpYXRpb25zID0gWyAiSmFuIiwgIkZlYiIsICJNYXIiLCAiQXByIiwgIk1heSIsICJKdW4iLCAiSnVsIiwgIkF1ZyIsICJTZXAiLCAiT2N0IiwgIk5vdiIsICJEZWMiIF07CiAgZnVuY3Rpb24gZDNfdGltZV9pbnRlcnZhbChsb2NhbCwgc3RlcCwgbnVtYmVyKSB7CiAgICBmdW5jdGlvbiByb3VuZChkYXRlKSB7CiAgICAgIHZhciBkMCA9IGxvY2FsKGRhdGUpLCBkMSA9IG9mZnNldChkMCwgMSk7CiAgICAgIHJldHVybiBkYXRlIC0gZDAgPCBkMSAtIGRhdGUgPyBkMCA6IGQxOwogICAgfQogICAgZnVuY3Rpb24gY2VpbChkYXRlKSB7CiAgICAgIHN0ZXAoZGF0ZSA9IGxvY2FsKG5ldyBkM190aW1lKGRhdGUgLSAxKSksIDEpOwogICAgICByZXR1cm4gZGF0ZTsKICAgIH0KICAgIGZ1bmN0aW9uIG9mZnNldChkYXRlLCBrKSB7CiAgICAgIHN0ZXAoZGF0ZSA9IG5ldyBkM190aW1lKCtkYXRlKSwgayk7CiAgICAgIHJldHVybiBkYXRlOwogICAgfQogICAgZnVuY3Rpb24gcmFuZ2UodDAsIHQxLCBkdCkgewogICAgICB2YXIgdGltZSA9IGNlaWwodDApLCB0aW1lcyA9IFtdOwogICAgICBpZiAoZHQgPiAxKSB7CiAgICAgICAgd2hpbGUgKHRpbWUgPCB0MSkgewogICAgICAgICAgaWYgKCEobnVtYmVyKHRpbWUpICUgZHQpKSB0aW1lcy5wdXNoKG5ldyBEYXRlKCt0aW1lKSk7CiAgICAgICAgICBzdGVwKHRpbWUsIDEpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICB3aGlsZSAodGltZSA8IHQxKSB0aW1lcy5wdXNoKG5ldyBEYXRlKCt0aW1lKSksIHN0ZXAodGltZSwgMSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRpbWVzOwogICAgfQogICAgZnVuY3Rpb24gcmFuZ2VfdXRjKHQwLCB0MSwgZHQpIHsKICAgICAgdHJ5IHsKICAgICAgICBkM190aW1lID0gZDNfdGltZV91dGM7CiAgICAgICAgdmFyIHV0YyA9IG5ldyBkM190aW1lX3V0YygpOwogICAgICAgIHV0Yy5fID0gdDA7CiAgICAgICAgcmV0dXJuIHJhbmdlKHV0YywgdDEsIGR0KTsKICAgICAgfSBmaW5hbGx5IHsKICAgICAgICBkM190aW1lID0gRGF0ZTsKICAgICAgfQogICAgfQogICAgbG9jYWwuZmxvb3IgPSBsb2NhbDsKICAgIGxvY2FsLnJvdW5kID0gcm91bmQ7CiAgICBsb2NhbC5jZWlsID0gY2VpbDsKICAgIGxvY2FsLm9mZnNldCA9IG9mZnNldDsKICAgIGxvY2FsLnJhbmdlID0gcmFuZ2U7CiAgICB2YXIgdXRjID0gbG9jYWwudXRjID0gZDNfdGltZV9pbnRlcnZhbF91dGMobG9jYWwpOwogICAgdXRjLmZsb29yID0gdXRjOwogICAgdXRjLnJvdW5kID0gZDNfdGltZV9pbnRlcnZhbF91dGMocm91bmQpOwogICAgdXRjLmNlaWwgPSBkM190aW1lX2ludGVydmFsX3V0YyhjZWlsKTsKICAgIHV0Yy5vZmZzZXQgPSBkM190aW1lX2ludGVydmFsX3V0YyhvZmZzZXQpOwogICAgdXRjLnJhbmdlID0gcmFuZ2VfdXRjOwogICAgcmV0dXJuIGxvY2FsOwogIH0KICBmdW5jdGlvbiBkM190aW1lX2ludGVydmFsX3V0YyhtZXRob2QpIHsKICAgIHJldHVybiBmdW5jdGlvbihkYXRlLCBrKSB7CiAgICAgIHRyeSB7CiAgICAgICAgZDNfdGltZSA9IGQzX3RpbWVfdXRjOwogICAgICAgIHZhciB1dGMgPSBuZXcgZDNfdGltZV91dGMoKTsKICAgICAgICB1dGMuXyA9IGRhdGU7CiAgICAgICAgcmV0dXJuIG1ldGhvZCh1dGMsIGspLl87CiAgICAgIH0gZmluYWxseSB7CiAgICAgICAgZDNfdGltZSA9IERhdGU7CiAgICAgIH0KICAgIH07CiAgfQogIGQzLnRpbWUueWVhciA9IGQzX3RpbWVfaW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkgewogICAgZGF0ZSA9IGQzLnRpbWUuZGF5KGRhdGUpOwogICAgZGF0ZS5zZXRNb250aCgwLCAxKTsKICAgIHJldHVybiBkYXRlOwogIH0sIGZ1bmN0aW9uKGRhdGUsIG9mZnNldCkgewogICAgZGF0ZS5zZXRGdWxsWWVhcihkYXRlLmdldEZ1bGxZZWFyKCkgKyBvZmZzZXQpOwogIH0sIGZ1bmN0aW9uKGRhdGUpIHsKICAgIHJldHVybiBkYXRlLmdldEZ1bGxZZWFyKCk7CiAgfSk7CiAgZDMudGltZS55ZWFycyA9IGQzLnRpbWUueWVhci5yYW5nZTsKICBkMy50aW1lLnllYXJzLnV0YyA9IGQzLnRpbWUueWVhci51dGMucmFuZ2U7CiAgZDMudGltZS5kYXkgPSBkM190aW1lX2ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsKICAgIHZhciBkYXkgPSBuZXcgZDNfdGltZSgxOTcwLCAwKTsKICAgIGRheS5zZXRGdWxsWWVhcihkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSwgZGF0ZS5nZXREYXRlKCkpOwogICAgcmV0dXJuIGRheTsKICB9LCBmdW5jdGlvbihkYXRlLCBvZmZzZXQpIHsKICAgIGRhdGUuc2V0RGF0ZShkYXRlLmdldERhdGUoKSArIG9mZnNldCk7CiAgfSwgZnVuY3Rpb24oZGF0ZSkgewogICAgcmV0dXJuIGRhdGUuZ2V0RGF0ZSgpIC0gMTsKICB9KTsKICBkMy50aW1lLmRheXMgPSBkMy50aW1lLmRheS5yYW5nZTsKICBkMy50aW1lLmRheXMudXRjID0gZDMudGltZS5kYXkudXRjLnJhbmdlOwogIGQzLnRpbWUuZGF5T2ZZZWFyID0gZnVuY3Rpb24oZGF0ZSkgewogICAgdmFyIHllYXIgPSBkMy50aW1lLnllYXIoZGF0ZSk7CiAgICByZXR1cm4gTWF0aC5mbG9vcigoZGF0ZSAtIHllYXIgLSAoZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpIC0geWVhci5nZXRUaW1lem9uZU9mZnNldCgpKSAqIDZlNCkgLyA4NjRlNSk7CiAgfTsKICBkM190aW1lX2RheVN5bWJvbHMuZm9yRWFjaChmdW5jdGlvbihkYXksIGkpIHsKICAgIGRheSA9IGRheS50b0xvd2VyQ2FzZSgpOwogICAgaSA9IDcgLSBpOwogICAgdmFyIGludGVydmFsID0gZDMudGltZVtkYXldID0gZDNfdGltZV9pbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7CiAgICAgIChkYXRlID0gZDMudGltZS5kYXkoZGF0ZSkpLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgLSAoZGF0ZS5nZXREYXkoKSArIGkpICUgNyk7CiAgICAgIHJldHVybiBkYXRlOwogICAgfSwgZnVuY3Rpb24oZGF0ZSwgb2Zmc2V0KSB7CiAgICAgIGRhdGUuc2V0RGF0ZShkYXRlLmdldERhdGUoKSArIE1hdGguZmxvb3Iob2Zmc2V0KSAqIDcpOwogICAgfSwgZnVuY3Rpb24oZGF0ZSkgewogICAgICB2YXIgZGF5ID0gZDMudGltZS55ZWFyKGRhdGUpLmdldERheSgpOwogICAgICByZXR1cm4gTWF0aC5mbG9vcigoZDMudGltZS5kYXlPZlllYXIoZGF0ZSkgKyAoZGF5ICsgaSkgJSA3KSAvIDcpIC0gKGRheSAhPT0gaSk7CiAgICB9KTsKICAgIGQzLnRpbWVbZGF5ICsgInMiXSA9IGludGVydmFsLnJhbmdlOwogICAgZDMudGltZVtkYXkgKyAicyJdLnV0YyA9IGludGVydmFsLnV0Yy5yYW5nZTsKICAgIGQzLnRpbWVbZGF5ICsgIk9mWWVhciJdID0gZnVuY3Rpb24oZGF0ZSkgewogICAgICB2YXIgZGF5ID0gZDMudGltZS55ZWFyKGRhdGUpLmdldERheSgpOwogICAgICByZXR1cm4gTWF0aC5mbG9vcigoZDMudGltZS5kYXlPZlllYXIoZGF0ZSkgKyAoZGF5ICsgaSkgJSA3KSAvIDcpOwogICAgfTsKICB9KTsKICBkMy50aW1lLndlZWsgPSBkMy50aW1lLnN1bmRheTsKICBkMy50aW1lLndlZWtzID0gZDMudGltZS5zdW5kYXkucmFuZ2U7CiAgZDMudGltZS53ZWVrcy51dGMgPSBkMy50aW1lLnN1bmRheS51dGMucmFuZ2U7CiAgZDMudGltZS53ZWVrT2ZZZWFyID0gZDMudGltZS5zdW5kYXlPZlllYXI7CiAgZDMudGltZS5mb3JtYXQgPSBmdW5jdGlvbih0ZW1wbGF0ZSkgewogICAgdmFyIG4gPSB0ZW1wbGF0ZS5sZW5ndGg7CiAgICBmdW5jdGlvbiBmb3JtYXQoZGF0ZSkgewogICAgICB2YXIgc3RyaW5nID0gW10sIGkgPSAtMSwgaiA9IDAsIGMsIHAsIGY7CiAgICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgICAgaWYgKHRlbXBsYXRlLmNoYXJDb2RlQXQoaSkgPT09IDM3KSB7CiAgICAgICAgICBzdHJpbmcucHVzaCh0ZW1wbGF0ZS5zdWJzdHJpbmcoaiwgaSkpOwogICAgICAgICAgaWYgKChwID0gZDNfdGltZV9mb3JtYXRQYWRzW2MgPSB0ZW1wbGF0ZS5jaGFyQXQoKytpKV0pICE9IG51bGwpIGMgPSB0ZW1wbGF0ZS5jaGFyQXQoKytpKTsKICAgICAgICAgIGlmIChmID0gZDNfdGltZV9mb3JtYXRzW2NdKSBjID0gZihkYXRlLCBwID09IG51bGwgPyBjID09PSAiZSIgPyAiICIgOiAiMCIgOiBwKTsKICAgICAgICAgIHN0cmluZy5wdXNoKGMpOwogICAgICAgICAgaiA9IGkgKyAxOwogICAgICAgIH0KICAgICAgfQogICAgICBzdHJpbmcucHVzaCh0ZW1wbGF0ZS5zdWJzdHJpbmcoaiwgaSkpOwogICAgICByZXR1cm4gc3RyaW5nLmpvaW4oIiIpOwogICAgfQogICAgZm9ybWF0LnBhcnNlID0gZnVuY3Rpb24oc3RyaW5nKSB7CiAgICAgIHZhciBkID0gewogICAgICAgIHk6IDE5MDAsCiAgICAgICAgbTogMCwKICAgICAgICBkOiAxLAogICAgICAgIEg6IDAsCiAgICAgICAgTTogMCwKICAgICAgICBTOiAwLAogICAgICAgIEw6IDAKICAgICAgfSwgaSA9IGQzX3RpbWVfcGFyc2UoZCwgdGVtcGxhdGUsIHN0cmluZywgMCk7CiAgICAgIGlmIChpICE9IHN0cmluZy5sZW5ndGgpIHJldHVybiBudWxsOwogICAgICBpZiAoInAiIGluIGQpIGQuSCA9IGQuSCAlIDEyICsgZC5wICogMTI7CiAgICAgIHZhciBkYXRlID0gbmV3IGQzX3RpbWUoKTsKICAgICAgZGF0ZS5zZXRGdWxsWWVhcihkLnksIGQubSwgZC5kKTsKICAgICAgZGF0ZS5zZXRIb3VycyhkLkgsIGQuTSwgZC5TLCBkLkwpOwogICAgICByZXR1cm4gZGF0ZTsKICAgIH07CiAgICBmb3JtYXQudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRlbXBsYXRlOwogICAgfTsKICAgIHJldHVybiBmb3JtYXQ7CiAgfTsKICBmdW5jdGlvbiBkM190aW1lX3BhcnNlKGRhdGUsIHRlbXBsYXRlLCBzdHJpbmcsIGopIHsKICAgIHZhciBjLCBwLCBpID0gMCwgbiA9IHRlbXBsYXRlLmxlbmd0aCwgbSA9IHN0cmluZy5sZW5ndGg7CiAgICB3aGlsZSAoaSA8IG4pIHsKICAgICAgaWYgKGogPj0gbSkgcmV0dXJuIC0xOwogICAgICBjID0gdGVtcGxhdGUuY2hhckNvZGVBdChpKyspOwogICAgICBpZiAoYyA9PT0gMzcpIHsKICAgICAgICBwID0gZDNfdGltZV9wYXJzZXJzW3RlbXBsYXRlLmNoYXJBdChpKyspXTsKICAgICAgICBpZiAoIXAgfHwgKGogPSBwKGRhdGUsIHN0cmluZywgaikpIDwgMCkgcmV0dXJuIC0xOwogICAgICB9IGVsc2UgaWYgKGMgIT0gc3RyaW5nLmNoYXJDb2RlQXQoaisrKSkgewogICAgICAgIHJldHVybiAtMTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGo7CiAgfQogIGZ1bmN0aW9uIGQzX3RpbWVfZm9ybWF0UmUobmFtZXMpIHsKICAgIHJldHVybiBuZXcgUmVnRXhwKCJeKD86IiArIG5hbWVzLm1hcChkMy5yZXF1b3RlKS5qb2luKCJ8IikgKyAiKSIsICJpIik7CiAgfQogIGZ1bmN0aW9uIGQzX3RpbWVfZm9ybWF0TG9va3VwKG5hbWVzKSB7CiAgICB2YXIgbWFwID0gbmV3IGQzX01hcCgpLCBpID0gLTEsIG4gPSBuYW1lcy5sZW5ndGg7CiAgICB3aGlsZSAoKytpIDwgbikgbWFwLnNldChuYW1lc1tpXS50b0xvd2VyQ2FzZSgpLCBpKTsKICAgIHJldHVybiBtYXA7CiAgfQogIGZ1bmN0aW9uIGQzX3RpbWVfZm9ybWF0UGFkKHZhbHVlLCBmaWxsLCB3aWR0aCkgewogICAgdmFsdWUgKz0gIiI7CiAgICB2YXIgbGVuZ3RoID0gdmFsdWUubGVuZ3RoOwogICAgcmV0dXJuIGxlbmd0aCA8IHdpZHRoID8gbmV3IEFycmF5KHdpZHRoIC0gbGVuZ3RoICsgMSkuam9pbihmaWxsKSArIHZhbHVlIDogdmFsdWU7CiAgfQogIHZhciBkM190aW1lX2RheVJlID0gZDNfdGltZV9mb3JtYXRSZShkM190aW1lX2RheXMpLCBkM190aW1lX2RheUFiYnJldlJlID0gZDNfdGltZV9mb3JtYXRSZShkM190aW1lX2RheUFiYnJldmlhdGlvbnMpLCBkM190aW1lX21vbnRoUmUgPSBkM190aW1lX2Zvcm1hdFJlKGQzX3RpbWVfbW9udGhzKSwgZDNfdGltZV9tb250aExvb2t1cCA9IGQzX3RpbWVfZm9ybWF0TG9va3VwKGQzX3RpbWVfbW9udGhzKSwgZDNfdGltZV9tb250aEFiYnJldlJlID0gZDNfdGltZV9mb3JtYXRSZShkM190aW1lX21vbnRoQWJicmV2aWF0aW9ucyksIGQzX3RpbWVfbW9udGhBYmJyZXZMb29rdXAgPSBkM190aW1lX2Zvcm1hdExvb2t1cChkM190aW1lX21vbnRoQWJicmV2aWF0aW9ucyk7CiAgdmFyIGQzX3RpbWVfZm9ybWF0UGFkcyA9IHsKICAgICItIjogIiIsCiAgICBfOiAiICIsCiAgICAiMCI6ICIwIgogIH07CiAgdmFyIGQzX3RpbWVfZm9ybWF0cyA9IHsKICAgIGE6IGZ1bmN0aW9uKGQpIHsKICAgICAgcmV0dXJuIGQzX3RpbWVfZGF5QWJicmV2aWF0aW9uc1tkLmdldERheSgpXTsKICAgIH0sCiAgICBBOiBmdW5jdGlvbihkKSB7CiAgICAgIHJldHVybiBkM190aW1lX2RheXNbZC5nZXREYXkoKV07CiAgICB9LAogICAgYjogZnVuY3Rpb24oZCkgewogICAgICByZXR1cm4gZDNfdGltZV9tb250aEFiYnJldmlhdGlvbnNbZC5nZXRNb250aCgpXTsKICAgIH0sCiAgICBCOiBmdW5jdGlvbihkKSB7CiAgICAgIHJldHVybiBkM190aW1lX21vbnRoc1tkLmdldE1vbnRoKCldOwogICAgfSwKICAgIGM6IGQzLnRpbWUuZm9ybWF0KGQzX3RpbWVfZm9ybWF0RGF0ZVRpbWUpLAogICAgZDogZnVuY3Rpb24oZCwgcCkgewogICAgICByZXR1cm4gZDNfdGltZV9mb3JtYXRQYWQoZC5nZXREYXRlKCksIHAsIDIpOwogICAgfSwKICAgIGU6IGZ1bmN0aW9uKGQsIHApIHsKICAgICAgcmV0dXJuIGQzX3RpbWVfZm9ybWF0UGFkKGQuZ2V0RGF0ZSgpLCBwLCAyKTsKICAgIH0sCiAgICBIOiBmdW5jdGlvbihkLCBwKSB7CiAgICAgIHJldHVybiBkM190aW1lX2Zvcm1hdFBhZChkLmdldEhvdXJzKCksIHAsIDIpOwogICAgfSwKICAgIEk6IGZ1bmN0aW9uKGQsIHApIHsKICAgICAgcmV0dXJuIGQzX3RpbWVfZm9ybWF0UGFkKGQuZ2V0SG91cnMoKSAlIDEyIHx8IDEyLCBwLCAyKTsKICAgIH0sCiAgICBqOiBmdW5jdGlvbihkLCBwKSB7CiAgICAgIHJldHVybiBkM190aW1lX2Zvcm1hdFBhZCgxICsgZDMudGltZS5kYXlPZlllYXIoZCksIHAsIDMpOwogICAgfSwKICAgIEw6IGZ1bmN0aW9uKGQsIHApIHsKICAgICAgcmV0dXJuIGQzX3RpbWVfZm9ybWF0UGFkKGQuZ2V0TWlsbGlzZWNvbmRzKCksIHAsIDMpOwogICAgfSwKICAgIG06IGZ1bmN0aW9uKGQsIHApIHsKICAgICAgcmV0dXJuIGQzX3RpbWVfZm9ybWF0UGFkKGQuZ2V0TW9udGgoKSArIDEsIHAsIDIpOwogICAgfSwKICAgIE06IGZ1bmN0aW9uKGQsIHApIHsKICAgICAgcmV0dXJuIGQzX3RpbWVfZm9ybWF0UGFkKGQuZ2V0TWludXRlcygpLCBwLCAyKTsKICAgIH0sCiAgICBwOiBmdW5jdGlvbihkKSB7CiAgICAgIHJldHVybiBkLmdldEhvdXJzKCkgPj0gMTIgPyAiUE0iIDogIkFNIjsKICAgIH0sCiAgICBTOiBmdW5jdGlvbihkLCBwKSB7CiAgICAgIHJldHVybiBkM190aW1lX2Zvcm1hdFBhZChkLmdldFNlY29uZHMoKSwgcCwgMik7CiAgICB9LAogICAgVTogZnVuY3Rpb24oZCwgcCkgewogICAgICByZXR1cm4gZDNfdGltZV9mb3JtYXRQYWQoZDMudGltZS5zdW5kYXlPZlllYXIoZCksIHAsIDIpOwogICAgfSwKICAgIHc6IGZ1bmN0aW9uKGQpIHsKICAgICAgcmV0dXJuIGQuZ2V0RGF5KCk7CiAgICB9LAogICAgVzogZnVuY3Rpb24oZCwgcCkgewogICAgICByZXR1cm4gZDNfdGltZV9mb3JtYXRQYWQoZDMudGltZS5tb25kYXlPZlllYXIoZCksIHAsIDIpOwogICAgfSwKICAgIHg6IGQzLnRpbWUuZm9ybWF0KGQzX3RpbWVfZm9ybWF0RGF0ZSksCiAgICBYOiBkMy50aW1lLmZvcm1hdChkM190aW1lX2Zvcm1hdFRpbWUpLAogICAgeTogZnVuY3Rpb24oZCwgcCkgewogICAgICByZXR1cm4gZDNfdGltZV9mb3JtYXRQYWQoZC5nZXRGdWxsWWVhcigpICUgMTAwLCBwLCAyKTsKICAgIH0sCiAgICBZOiBmdW5jdGlvbihkLCBwKSB7CiAgICAgIHJldHVybiBkM190aW1lX2Zvcm1hdFBhZChkLmdldEZ1bGxZZWFyKCkgJSAxZTQsIHAsIDQpOwogICAgfSwKICAgIFo6IGQzX3RpbWVfem9uZSwKICAgICIlIjogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiAiJSI7CiAgICB9CiAgfTsKICB2YXIgZDNfdGltZV9wYXJzZXJzID0gewogICAgYTogZDNfdGltZV9wYXJzZVdlZWtkYXlBYmJyZXYsCiAgICBBOiBkM190aW1lX3BhcnNlV2Vla2RheSwKICAgIGI6IGQzX3RpbWVfcGFyc2VNb250aEFiYnJldiwKICAgIEI6IGQzX3RpbWVfcGFyc2VNb250aCwKICAgIGM6IGQzX3RpbWVfcGFyc2VMb2NhbGVGdWxsLAogICAgZDogZDNfdGltZV9wYXJzZURheSwKICAgIGU6IGQzX3RpbWVfcGFyc2VEYXksCiAgICBIOiBkM190aW1lX3BhcnNlSG91cjI0LAogICAgSTogZDNfdGltZV9wYXJzZUhvdXIyNCwKICAgIEw6IGQzX3RpbWVfcGFyc2VNaWxsaXNlY29uZHMsCiAgICBtOiBkM190aW1lX3BhcnNlTW9udGhOdW1iZXIsCiAgICBNOiBkM190aW1lX3BhcnNlTWludXRlcywKICAgIHA6IGQzX3RpbWVfcGFyc2VBbVBtLAogICAgUzogZDNfdGltZV9wYXJzZVNlY29uZHMsCiAgICB4OiBkM190aW1lX3BhcnNlTG9jYWxlRGF0ZSwKICAgIFg6IGQzX3RpbWVfcGFyc2VMb2NhbGVUaW1lLAogICAgeTogZDNfdGltZV9wYXJzZVllYXIsCiAgICBZOiBkM190aW1lX3BhcnNlRnVsbFllYXIKICB9OwogIGZ1bmN0aW9uIGQzX3RpbWVfcGFyc2VXZWVrZGF5QWJicmV2KGRhdGUsIHN0cmluZywgaSkgewogICAgZDNfdGltZV9kYXlBYmJyZXZSZS5sYXN0SW5kZXggPSAwOwogICAgdmFyIG4gPSBkM190aW1lX2RheUFiYnJldlJlLmV4ZWMoc3RyaW5nLnN1YnN0cmluZyhpKSk7CiAgICByZXR1cm4gbiA/IGkgKz0gblswXS5sZW5ndGggOiAtMTsKICB9CiAgZnVuY3Rpb24gZDNfdGltZV9wYXJzZVdlZWtkYXkoZGF0ZSwgc3RyaW5nLCBpKSB7CiAgICBkM190aW1lX2RheVJlLmxhc3RJbmRleCA9IDA7CiAgICB2YXIgbiA9IGQzX3RpbWVfZGF5UmUuZXhlYyhzdHJpbmcuc3Vic3RyaW5nKGkpKTsKICAgIHJldHVybiBuID8gaSArPSBuWzBdLmxlbmd0aCA6IC0xOwogIH0KICBmdW5jdGlvbiBkM190aW1lX3BhcnNlTW9udGhBYmJyZXYoZGF0ZSwgc3RyaW5nLCBpKSB7CiAgICBkM190aW1lX21vbnRoQWJicmV2UmUubGFzdEluZGV4ID0gMDsKICAgIHZhciBuID0gZDNfdGltZV9tb250aEFiYnJldlJlLmV4ZWMoc3RyaW5nLnN1YnN0cmluZyhpKSk7CiAgICByZXR1cm4gbiA/IChkYXRlLm0gPSBkM190aW1lX21vbnRoQWJicmV2TG9va3VwLmdldChuWzBdLnRvTG93ZXJDYXNlKCkpLCBpICs9IG5bMF0ubGVuZ3RoKSA6IC0xOwogIH0KICBmdW5jdGlvbiBkM190aW1lX3BhcnNlTW9udGgoZGF0ZSwgc3RyaW5nLCBpKSB7CiAgICBkM190aW1lX21vbnRoUmUubGFzdEluZGV4ID0gMDsKICAgIHZhciBuID0gZDNfdGltZV9tb250aFJlLmV4ZWMoc3RyaW5nLnN1YnN0cmluZyhpKSk7CiAgICByZXR1cm4gbiA/IChkYXRlLm0gPSBkM190aW1lX21vbnRoTG9va3VwLmdldChuWzBdLnRvTG93ZXJDYXNlKCkpLCBpICs9IG5bMF0ubGVuZ3RoKSA6IC0xOwogIH0KICBmdW5jdGlvbiBkM190aW1lX3BhcnNlTG9jYWxlRnVsbChkYXRlLCBzdHJpbmcsIGkpIHsKICAgIHJldHVybiBkM190aW1lX3BhcnNlKGRhdGUsIGQzX3RpbWVfZm9ybWF0cy5jLnRvU3RyaW5nKCksIHN0cmluZywgaSk7CiAgfQogIGZ1bmN0aW9uIGQzX3RpbWVfcGFyc2VMb2NhbGVEYXRlKGRhdGUsIHN0cmluZywgaSkgewogICAgcmV0dXJuIGQzX3RpbWVfcGFyc2UoZGF0ZSwgZDNfdGltZV9mb3JtYXRzLngudG9TdHJpbmcoKSwgc3RyaW5nLCBpKTsKICB9CiAgZnVuY3Rpb24gZDNfdGltZV9wYXJzZUxvY2FsZVRpbWUoZGF0ZSwgc3RyaW5nLCBpKSB7CiAgICByZXR1cm4gZDNfdGltZV9wYXJzZShkYXRlLCBkM190aW1lX2Zvcm1hdHMuWC50b1N0cmluZygpLCBzdHJpbmcsIGkpOwogIH0KICBmdW5jdGlvbiBkM190aW1lX3BhcnNlRnVsbFllYXIoZGF0ZSwgc3RyaW5nLCBpKSB7CiAgICBkM190aW1lX251bWJlclJlLmxhc3RJbmRleCA9IDA7CiAgICB2YXIgbiA9IGQzX3RpbWVfbnVtYmVyUmUuZXhlYyhzdHJpbmcuc3Vic3RyaW5nKGksIGkgKyA0KSk7CiAgICByZXR1cm4gbiA/IChkYXRlLnkgPSArblswXSwgaSArPSBuWzBdLmxlbmd0aCkgOiAtMTsKICB9CiAgZnVuY3Rpb24gZDNfdGltZV9wYXJzZVllYXIoZGF0ZSwgc3RyaW5nLCBpKSB7CiAgICBkM190aW1lX251bWJlclJlLmxhc3RJbmRleCA9IDA7CiAgICB2YXIgbiA9IGQzX3RpbWVfbnVtYmVyUmUuZXhlYyhzdHJpbmcuc3Vic3RyaW5nKGksIGkgKyAyKSk7CiAgICByZXR1cm4gbiA/IChkYXRlLnkgPSBkM190aW1lX2V4cGFuZFllYXIoK25bMF0pLCBpICs9IG5bMF0ubGVuZ3RoKSA6IC0xOwogIH0KICBmdW5jdGlvbiBkM190aW1lX2V4cGFuZFllYXIoZCkgewogICAgcmV0dXJuIGQgKyAoZCA+IDY4ID8gMTkwMCA6IDJlMyk7CiAgfQogIGZ1bmN0aW9uIGQzX3RpbWVfcGFyc2VNb250aE51bWJlcihkYXRlLCBzdHJpbmcsIGkpIHsKICAgIGQzX3RpbWVfbnVtYmVyUmUubGFzdEluZGV4ID0gMDsKICAgIHZhciBuID0gZDNfdGltZV9udW1iZXJSZS5leGVjKHN0cmluZy5zdWJzdHJpbmcoaSwgaSArIDIpKTsKICAgIHJldHVybiBuID8gKGRhdGUubSA9IG5bMF0gLSAxLCBpICs9IG5bMF0ubGVuZ3RoKSA6IC0xOwogIH0KICBmdW5jdGlvbiBkM190aW1lX3BhcnNlRGF5KGRhdGUsIHN0cmluZywgaSkgewogICAgZDNfdGltZV9udW1iZXJSZS5sYXN0SW5kZXggPSAwOwogICAgdmFyIG4gPSBkM190aW1lX251bWJlclJlLmV4ZWMoc3RyaW5nLnN1YnN0cmluZyhpLCBpICsgMikpOwogICAgcmV0dXJuIG4gPyAoZGF0ZS5kID0gK25bMF0sIGkgKz0gblswXS5sZW5ndGgpIDogLTE7CiAgfQogIGZ1bmN0aW9uIGQzX3RpbWVfcGFyc2VIb3VyMjQoZGF0ZSwgc3RyaW5nLCBpKSB7CiAgICBkM190aW1lX251bWJlclJlLmxhc3RJbmRleCA9IDA7CiAgICB2YXIgbiA9IGQzX3RpbWVfbnVtYmVyUmUuZXhlYyhzdHJpbmcuc3Vic3RyaW5nKGksIGkgKyAyKSk7CiAgICByZXR1cm4gbiA/IChkYXRlLkggPSArblswXSwgaSArPSBuWzBdLmxlbmd0aCkgOiAtMTsKICB9CiAgZnVuY3Rpb24gZDNfdGltZV9wYXJzZU1pbnV0ZXMoZGF0ZSwgc3RyaW5nLCBpKSB7CiAgICBkM190aW1lX251bWJlclJlLmxhc3RJbmRleCA9IDA7CiAgICB2YXIgbiA9IGQzX3RpbWVfbnVtYmVyUmUuZXhlYyhzdHJpbmcuc3Vic3RyaW5nKGksIGkgKyAyKSk7CiAgICByZXR1cm4gbiA/IChkYXRlLk0gPSArblswXSwgaSArPSBuWzBdLmxlbmd0aCkgOiAtMTsKICB9CiAgZnVuY3Rpb24gZDNfdGltZV9wYXJzZVNlY29uZHMoZGF0ZSwgc3RyaW5nLCBpKSB7CiAgICBkM190aW1lX251bWJlclJlLmxhc3RJbmRleCA9IDA7CiAgICB2YXIgbiA9IGQzX3RpbWVfbnVtYmVyUmUuZXhlYyhzdHJpbmcuc3Vic3RyaW5nKGksIGkgKyAyKSk7CiAgICByZXR1cm4gbiA/IChkYXRlLlMgPSArblswXSwgaSArPSBuWzBdLmxlbmd0aCkgOiAtMTsKICB9CiAgZnVuY3Rpb24gZDNfdGltZV9wYXJzZU1pbGxpc2Vjb25kcyhkYXRlLCBzdHJpbmcsIGkpIHsKICAgIGQzX3RpbWVfbnVtYmVyUmUubGFzdEluZGV4ID0gMDsKICAgIHZhciBuID0gZDNfdGltZV9udW1iZXJSZS5leGVjKHN0cmluZy5zdWJzdHJpbmcoaSwgaSArIDMpKTsKICAgIHJldHVybiBuID8gKGRhdGUuTCA9ICtuWzBdLCBpICs9IG5bMF0ubGVuZ3RoKSA6IC0xOwogIH0KICB2YXIgZDNfdGltZV9udW1iZXJSZSA9IC9eXHMqXGQrLzsKICBmdW5jdGlvbiBkM190aW1lX3BhcnNlQW1QbShkYXRlLCBzdHJpbmcsIGkpIHsKICAgIHZhciBuID0gZDNfdGltZV9hbVBtTG9va3VwLmdldChzdHJpbmcuc3Vic3RyaW5nKGksIGkgKz0gMikudG9Mb3dlckNhc2UoKSk7CiAgICByZXR1cm4gbiA9PSBudWxsID8gLTEgOiAoZGF0ZS5wID0gbiwgaSk7CiAgfQogIHZhciBkM190aW1lX2FtUG1Mb29rdXAgPSBkMy5tYXAoewogICAgYW06IDAsCiAgICBwbTogMQogIH0pOwogIGZ1bmN0aW9uIGQzX3RpbWVfem9uZShkKSB7CiAgICB2YXIgeiA9IGQuZ2V0VGltZXpvbmVPZmZzZXQoKSwgenMgPSB6ID4gMCA/ICItIiA6ICIrIiwgemggPSB+fihNYXRoLmFicyh6KSAvIDYwKSwgem0gPSBNYXRoLmFicyh6KSAlIDYwOwogICAgcmV0dXJuIHpzICsgZDNfdGltZV9mb3JtYXRQYWQoemgsICIwIiwgMikgKyBkM190aW1lX2Zvcm1hdFBhZCh6bSwgIjAiLCAyKTsKICB9CiAgZDMudGltZS5mb3JtYXQudXRjID0gZnVuY3Rpb24odGVtcGxhdGUpIHsKICAgIHZhciBsb2NhbCA9IGQzLnRpbWUuZm9ybWF0KHRlbXBsYXRlKTsKICAgIGZ1bmN0aW9uIGZvcm1hdChkYXRlKSB7CiAgICAgIHRyeSB7CiAgICAgICAgZDNfdGltZSA9IGQzX3RpbWVfdXRjOwogICAgICAgIHZhciB1dGMgPSBuZXcgZDNfdGltZSgpOwogICAgICAgIHV0Yy5fID0gZGF0ZTsKICAgICAgICByZXR1cm4gbG9jYWwodXRjKTsKICAgICAgfSBmaW5hbGx5IHsKICAgICAgICBkM190aW1lID0gRGF0ZTsKICAgICAgfQogICAgfQogICAgZm9ybWF0LnBhcnNlID0gZnVuY3Rpb24oc3RyaW5nKSB7CiAgICAgIHRyeSB7CiAgICAgICAgZDNfdGltZSA9IGQzX3RpbWVfdXRjOwogICAgICAgIHZhciBkYXRlID0gbG9jYWwucGFyc2Uoc3RyaW5nKTsKICAgICAgICByZXR1cm4gZGF0ZSAmJiBkYXRlLl87CiAgICAgIH0gZmluYWxseSB7CiAgICAgICAgZDNfdGltZSA9IERhdGU7CiAgICAgIH0KICAgIH07CiAgICBmb3JtYXQudG9TdHJpbmcgPSBsb2NhbC50b1N0cmluZzsKICAgIHJldHVybiBmb3JtYXQ7CiAgfTsKICB2YXIgZDNfdGltZV9mb3JtYXRJc28gPSBkMy50aW1lLmZvcm1hdC51dGMoIiVZLSVtLSVkVCVIOiVNOiVTLiVMWiIpOwogIGQzLnRpbWUuZm9ybWF0LmlzbyA9IERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nICYmICtuZXcgRGF0ZSgiMjAwMC0wMS0wMVQwMDowMDowMC4wMDBaIikgPyBkM190aW1lX2Zvcm1hdElzb05hdGl2ZSA6IGQzX3RpbWVfZm9ybWF0SXNvOwogIGZ1bmN0aW9uIGQzX3RpbWVfZm9ybWF0SXNvTmF0aXZlKGRhdGUpIHsKICAgIHJldHVybiBkYXRlLnRvSVNPU3RyaW5nKCk7CiAgfQogIGQzX3RpbWVfZm9ybWF0SXNvTmF0aXZlLnBhcnNlID0gZnVuY3Rpb24oc3RyaW5nKSB7CiAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKHN0cmluZyk7CiAgICByZXR1cm4gaXNOYU4oZGF0ZSkgPyBudWxsIDogZGF0ZTsKICB9OwogIGQzX3RpbWVfZm9ybWF0SXNvTmF0aXZlLnRvU3RyaW5nID0gZDNfdGltZV9mb3JtYXRJc28udG9TdHJpbmc7CiAgZDMudGltZS5zZWNvbmQgPSBkM190aW1lX2ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsKICAgIHJldHVybiBuZXcgZDNfdGltZShNYXRoLmZsb29yKGRhdGUgLyAxZTMpICogMWUzKTsKICB9LCBmdW5jdGlvbihkYXRlLCBvZmZzZXQpIHsKICAgIGRhdGUuc2V0VGltZShkYXRlLmdldFRpbWUoKSArIE1hdGguZmxvb3Iob2Zmc2V0KSAqIDFlMyk7CiAgfSwgZnVuY3Rpb24oZGF0ZSkgewogICAgcmV0dXJuIGRhdGUuZ2V0U2Vjb25kcygpOwogIH0pOwogIGQzLnRpbWUuc2Vjb25kcyA9IGQzLnRpbWUuc2Vjb25kLnJhbmdlOwogIGQzLnRpbWUuc2Vjb25kcy51dGMgPSBkMy50aW1lLnNlY29uZC51dGMucmFuZ2U7CiAgZDMudGltZS5taW51dGUgPSBkM190aW1lX2ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsKICAgIHJldHVybiBuZXcgZDNfdGltZShNYXRoLmZsb29yKGRhdGUgLyA2ZTQpICogNmU0KTsKICB9LCBmdW5jdGlvbihkYXRlLCBvZmZzZXQpIHsKICAgIGRhdGUuc2V0VGltZShkYXRlLmdldFRpbWUoKSArIE1hdGguZmxvb3Iob2Zmc2V0KSAqIDZlNCk7CiAgfSwgZnVuY3Rpb24oZGF0ZSkgewogICAgcmV0dXJuIGRhdGUuZ2V0TWludXRlcygpOwogIH0pOwogIGQzLnRpbWUubWludXRlcyA9IGQzLnRpbWUubWludXRlLnJhbmdlOwogIGQzLnRpbWUubWludXRlcy51dGMgPSBkMy50aW1lLm1pbnV0ZS51dGMucmFuZ2U7CiAgZDMudGltZS5ob3VyID0gZDNfdGltZV9pbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7CiAgICB2YXIgdGltZXpvbmUgPSBkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCkgLyA2MDsKICAgIHJldHVybiBuZXcgZDNfdGltZSgoTWF0aC5mbG9vcihkYXRlIC8gMzZlNSAtIHRpbWV6b25lKSArIHRpbWV6b25lKSAqIDM2ZTUpOwogIH0sIGZ1bmN0aW9uKGRhdGUsIG9mZnNldCkgewogICAgZGF0ZS5zZXRUaW1lKGRhdGUuZ2V0VGltZSgpICsgTWF0aC5mbG9vcihvZmZzZXQpICogMzZlNSk7CiAgfSwgZnVuY3Rpb24oZGF0ZSkgewogICAgcmV0dXJuIGRhdGUuZ2V0SG91cnMoKTsKICB9KTsKICBkMy50aW1lLmhvdXJzID0gZDMudGltZS5ob3VyLnJhbmdlOwogIGQzLnRpbWUuaG91cnMudXRjID0gZDMudGltZS5ob3VyLnV0Yy5yYW5nZTsKICBkMy50aW1lLm1vbnRoID0gZDNfdGltZV9pbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7CiAgICBkYXRlID0gZDMudGltZS5kYXkoZGF0ZSk7CiAgICBkYXRlLnNldERhdGUoMSk7CiAgICByZXR1cm4gZGF0ZTsKICB9LCBmdW5jdGlvbihkYXRlLCBvZmZzZXQpIHsKICAgIGRhdGUuc2V0TW9udGgoZGF0ZS5nZXRNb250aCgpICsgb2Zmc2V0KTsKICB9LCBmdW5jdGlvbihkYXRlKSB7CiAgICByZXR1cm4gZGF0ZS5nZXRNb250aCgpOwogIH0pOwogIGQzLnRpbWUubW9udGhzID0gZDMudGltZS5tb250aC5yYW5nZTsKICBkMy50aW1lLm1vbnRocy51dGMgPSBkMy50aW1lLm1vbnRoLnV0Yy5yYW5nZTsKICBmdW5jdGlvbiBkM190aW1lX3NjYWxlKGxpbmVhciwgbWV0aG9kcywgZm9ybWF0KSB7CiAgICBmdW5jdGlvbiBzY2FsZSh4KSB7CiAgICAgIHJldHVybiBsaW5lYXIoeCk7CiAgICB9CiAgICBzY2FsZS5pbnZlcnQgPSBmdW5jdGlvbih4KSB7CiAgICAgIHJldHVybiBkM190aW1lX3NjYWxlRGF0ZShsaW5lYXIuaW52ZXJ0KHgpKTsKICAgIH07CiAgICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbih4KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGxpbmVhci5kb21haW4oKS5tYXAoZDNfdGltZV9zY2FsZURhdGUpOwogICAgICBsaW5lYXIuZG9tYWluKHgpOwogICAgICByZXR1cm4gc2NhbGU7CiAgICB9OwogICAgc2NhbGUubmljZSA9IGZ1bmN0aW9uKG0pIHsKICAgICAgcmV0dXJuIHNjYWxlLmRvbWFpbihkM19zY2FsZV9uaWNlKHNjYWxlLmRvbWFpbigpLCBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gbTsKICAgICAgfSkpOwogICAgfTsKICAgIHNjYWxlLnRpY2tzID0gZnVuY3Rpb24obSwgaykgewogICAgICB2YXIgZXh0ZW50ID0gZDNfc2NhbGVFeHRlbnQoc2NhbGUuZG9tYWluKCkpOwogICAgICBpZiAodHlwZW9mIG0gIT09ICJmdW5jdGlvbiIpIHsKICAgICAgICB2YXIgc3BhbiA9IGV4dGVudFsxXSAtIGV4dGVudFswXSwgdGFyZ2V0ID0gc3BhbiAvIG0sIGkgPSBkMy5iaXNlY3QoZDNfdGltZV9zY2FsZVN0ZXBzLCB0YXJnZXQpOwogICAgICAgIGlmIChpID09IGQzX3RpbWVfc2NhbGVTdGVwcy5sZW5ndGgpIHJldHVybiBtZXRob2RzLnllYXIoZXh0ZW50LCBtKTsKICAgICAgICBpZiAoIWkpIHJldHVybiBsaW5lYXIudGlja3MobSkubWFwKGQzX3RpbWVfc2NhbGVEYXRlKTsKICAgICAgICBpZiAoTWF0aC5sb2codGFyZ2V0IC8gZDNfdGltZV9zY2FsZVN0ZXBzW2kgLSAxXSkgPCBNYXRoLmxvZyhkM190aW1lX3NjYWxlU3RlcHNbaV0gLyB0YXJnZXQpKSAtLWk7CiAgICAgICAgbSA9IG1ldGhvZHNbaV07CiAgICAgICAgayA9IG1bMV07CiAgICAgICAgbSA9IG1bMF0ucmFuZ2U7CiAgICAgIH0KICAgICAgcmV0dXJuIG0oZXh0ZW50WzBdLCBuZXcgRGF0ZSgrZXh0ZW50WzFdICsgMSksIGspOwogICAgfTsKICAgIHNjYWxlLnRpY2tGb3JtYXQgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGZvcm1hdDsKICAgIH07CiAgICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBkM190aW1lX3NjYWxlKGxpbmVhci5jb3B5KCksIG1ldGhvZHMsIGZvcm1hdCk7CiAgICB9OwogICAgcmV0dXJuIGQzX3NjYWxlX2xpbmVhclJlYmluZChzY2FsZSwgbGluZWFyKTsKICB9CiAgZnVuY3Rpb24gZDNfdGltZV9zY2FsZURhdGUodCkgewogICAgcmV0dXJuIG5ldyBEYXRlKHQpOwogIH0KICBmdW5jdGlvbiBkM190aW1lX3NjYWxlRm9ybWF0KGZvcm1hdHMpIHsKICAgIHJldHVybiBmdW5jdGlvbihkYXRlKSB7CiAgICAgIHZhciBpID0gZm9ybWF0cy5sZW5ndGggLSAxLCBmID0gZm9ybWF0c1tpXTsKICAgICAgd2hpbGUgKCFmWzFdKGRhdGUpKSBmID0gZm9ybWF0c1stLWldOwogICAgICByZXR1cm4gZlswXShkYXRlKTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIGQzX3RpbWVfc2NhbGVTZXRZZWFyKHkpIHsKICAgIHZhciBkID0gbmV3IERhdGUoeSwgMCwgMSk7CiAgICBkLnNldEZ1bGxZZWFyKHkpOwogICAgcmV0dXJuIGQ7CiAgfQogIGZ1bmN0aW9uIGQzX3RpbWVfc2NhbGVHZXRZZWFyKGQpIHsKICAgIHZhciB5ID0gZC5nZXRGdWxsWWVhcigpLCBkMCA9IGQzX3RpbWVfc2NhbGVTZXRZZWFyKHkpLCBkMSA9IGQzX3RpbWVfc2NhbGVTZXRZZWFyKHkgKyAxKTsKICAgIHJldHVybiB5ICsgKGQgLSBkMCkgLyAoZDEgLSBkMCk7CiAgfQogIHZhciBkM190aW1lX3NjYWxlU3RlcHMgPSBbIDFlMywgNWUzLCAxNWUzLCAzZTQsIDZlNCwgM2U1LCA5ZTUsIDE4ZTUsIDM2ZTUsIDEwOGU1LCAyMTZlNSwgNDMyZTUsIDg2NGU1LCAxNzI4ZTUsIDYwNDhlNSwgMjU5MmU2LCA3Nzc2ZTYsIDMxNTM2ZTYgXTsKICB2YXIgZDNfdGltZV9zY2FsZUxvY2FsTWV0aG9kcyA9IFsgWyBkMy50aW1lLnNlY29uZCwgMSBdLCBbIGQzLnRpbWUuc2Vjb25kLCA1IF0sIFsgZDMudGltZS5zZWNvbmQsIDE1IF0sIFsgZDMudGltZS5zZWNvbmQsIDMwIF0sIFsgZDMudGltZS5taW51dGUsIDEgXSwgWyBkMy50aW1lLm1pbnV0ZSwgNSBdLCBbIGQzLnRpbWUubWludXRlLCAxNSBdLCBbIGQzLnRpbWUubWludXRlLCAzMCBdLCBbIGQzLnRpbWUuaG91ciwgMSBdLCBbIGQzLnRpbWUuaG91ciwgMyBdLCBbIGQzLnRpbWUuaG91ciwgNiBdLCBbIGQzLnRpbWUuaG91ciwgMTIgXSwgWyBkMy50aW1lLmRheSwgMSBdLCBbIGQzLnRpbWUuZGF5LCAyIF0sIFsgZDMudGltZS53ZWVrLCAxIF0sIFsgZDMudGltZS5tb250aCwgMSBdLCBbIGQzLnRpbWUubW9udGgsIDMgXSwgWyBkMy50aW1lLnllYXIsIDEgXSBdOwogIHZhciBkM190aW1lX3NjYWxlTG9jYWxGb3JtYXRzID0gWyBbIGQzLnRpbWUuZm9ybWF0KCIlWSIpLCBkM190cnVlIF0sIFsgZDMudGltZS5mb3JtYXQoIiVCIiksIGZ1bmN0aW9uKGQpIHsKICAgIHJldHVybiBkLmdldE1vbnRoKCk7CiAgfSBdLCBbIGQzLnRpbWUuZm9ybWF0KCIlYiAlZCIpLCBmdW5jdGlvbihkKSB7CiAgICByZXR1cm4gZC5nZXREYXRlKCkgIT0gMTsKICB9IF0sIFsgZDMudGltZS5mb3JtYXQoIiVhICVkIiksIGZ1bmN0aW9uKGQpIHsKICAgIHJldHVybiBkLmdldERheSgpICYmIGQuZ2V0RGF0ZSgpICE9IDE7CiAgfSBdLCBbIGQzLnRpbWUuZm9ybWF0KCIlSSAlcCIpLCBmdW5jdGlvbihkKSB7CiAgICByZXR1cm4gZC5nZXRIb3VycygpOwogIH0gXSwgWyBkMy50aW1lLmZvcm1hdCgiJUk6JU0iKSwgZnVuY3Rpb24oZCkgewogICAgcmV0dXJuIGQuZ2V0TWludXRlcygpOwogIH0gXSwgWyBkMy50aW1lLmZvcm1hdCgiOiVTIiksIGZ1bmN0aW9uKGQpIHsKICAgIHJldHVybiBkLmdldFNlY29uZHMoKTsKICB9IF0sIFsgZDMudGltZS5mb3JtYXQoIi4lTCIpLCBmdW5jdGlvbihkKSB7CiAgICByZXR1cm4gZC5nZXRNaWxsaXNlY29uZHMoKTsKICB9IF0gXTsKICB2YXIgZDNfdGltZV9zY2FsZUxpbmVhciA9IGQzLnNjYWxlLmxpbmVhcigpLCBkM190aW1lX3NjYWxlTG9jYWxGb3JtYXQgPSBkM190aW1lX3NjYWxlRm9ybWF0KGQzX3RpbWVfc2NhbGVMb2NhbEZvcm1hdHMpOwogIGQzX3RpbWVfc2NhbGVMb2NhbE1ldGhvZHMueWVhciA9IGZ1bmN0aW9uKGV4dGVudCwgbSkgewogICAgcmV0dXJuIGQzX3RpbWVfc2NhbGVMaW5lYXIuZG9tYWluKGV4dGVudC5tYXAoZDNfdGltZV9zY2FsZUdldFllYXIpKS50aWNrcyhtKS5tYXAoZDNfdGltZV9zY2FsZVNldFllYXIpOwogIH07CiAgZDMudGltZS5zY2FsZSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGQzX3RpbWVfc2NhbGUoZDMuc2NhbGUubGluZWFyKCksIGQzX3RpbWVfc2NhbGVMb2NhbE1ldGhvZHMsIGQzX3RpbWVfc2NhbGVMb2NhbEZvcm1hdCk7CiAgfTsKICB2YXIgZDNfdGltZV9zY2FsZVVUQ01ldGhvZHMgPSBkM190aW1lX3NjYWxlTG9jYWxNZXRob2RzLm1hcChmdW5jdGlvbihtKSB7CiAgICByZXR1cm4gWyBtWzBdLnV0YywgbVsxXSBdOwogIH0pOwogIHZhciBkM190aW1lX3NjYWxlVVRDRm9ybWF0cyA9IFsgWyBkMy50aW1lLmZvcm1hdC51dGMoIiVZIiksIGQzX3RydWUgXSwgWyBkMy50aW1lLmZvcm1hdC51dGMoIiVCIiksIGZ1bmN0aW9uKGQpIHsKICAgIHJldHVybiBkLmdldFVUQ01vbnRoKCk7CiAgfSBdLCBbIGQzLnRpbWUuZm9ybWF0LnV0YygiJWIgJWQiKSwgZnVuY3Rpb24oZCkgewogICAgcmV0dXJuIGQuZ2V0VVRDRGF0ZSgpICE9IDE7CiAgfSBdLCBbIGQzLnRpbWUuZm9ybWF0LnV0YygiJWEgJWQiKSwgZnVuY3Rpb24oZCkgewogICAgcmV0dXJuIGQuZ2V0VVRDRGF5KCkgJiYgZC5nZXRVVENEYXRlKCkgIT0gMTsKICB9IF0sIFsgZDMudGltZS5mb3JtYXQudXRjKCIlSSAlcCIpLCBmdW5jdGlvbihkKSB7CiAgICByZXR1cm4gZC5nZXRVVENIb3VycygpOwogIH0gXSwgWyBkMy50aW1lLmZvcm1hdC51dGMoIiVJOiVNIiksIGZ1bmN0aW9uKGQpIHsKICAgIHJldHVybiBkLmdldFVUQ01pbnV0ZXMoKTsKICB9IF0sIFsgZDMudGltZS5mb3JtYXQudXRjKCI6JVMiKSwgZnVuY3Rpb24oZCkgewogICAgcmV0dXJuIGQuZ2V0VVRDU2Vjb25kcygpOwogIH0gXSwgWyBkMy50aW1lLmZvcm1hdC51dGMoIi4lTCIpLCBmdW5jdGlvbihkKSB7CiAgICByZXR1cm4gZC5nZXRVVENNaWxsaXNlY29uZHMoKTsKICB9IF0gXTsKICB2YXIgZDNfdGltZV9zY2FsZVVUQ0Zvcm1hdCA9IGQzX3RpbWVfc2NhbGVGb3JtYXQoZDNfdGltZV9zY2FsZVVUQ0Zvcm1hdHMpOwogIGZ1bmN0aW9uIGQzX3RpbWVfc2NhbGVVVENTZXRZZWFyKHkpIHsKICAgIHZhciBkID0gbmV3IERhdGUoRGF0ZS5VVEMoeSwgMCwgMSkpOwogICAgZC5zZXRVVENGdWxsWWVhcih5KTsKICAgIHJldHVybiBkOwogIH0KICBmdW5jdGlvbiBkM190aW1lX3NjYWxlVVRDR2V0WWVhcihkKSB7CiAgICB2YXIgeSA9IGQuZ2V0VVRDRnVsbFllYXIoKSwgZDAgPSBkM190aW1lX3NjYWxlVVRDU2V0WWVhcih5KSwgZDEgPSBkM190aW1lX3NjYWxlVVRDU2V0WWVhcih5ICsgMSk7CiAgICByZXR1cm4geSArIChkIC0gZDApIC8gKGQxIC0gZDApOwogIH0KICBkM190aW1lX3NjYWxlVVRDTWV0aG9kcy55ZWFyID0gZnVuY3Rpb24oZXh0ZW50LCBtKSB7CiAgICByZXR1cm4gZDNfdGltZV9zY2FsZUxpbmVhci5kb21haW4oZXh0ZW50Lm1hcChkM190aW1lX3NjYWxlVVRDR2V0WWVhcikpLnRpY2tzKG0pLm1hcChkM190aW1lX3NjYWxlVVRDU2V0WWVhcik7CiAgfTsKICBkMy50aW1lLnNjYWxlLnV0YyA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGQzX3RpbWVfc2NhbGUoZDMuc2NhbGUubGluZWFyKCksIGQzX3RpbWVfc2NhbGVVVENNZXRob2RzLCBkM190aW1lX3NjYWxlVVRDRm9ybWF0KTsKICB9OwogIGQzLnRleHQgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBkMy54aHIuYXBwbHkoZDMsIGFyZ3VtZW50cykucmVzcG9uc2UoZDNfdGV4dCk7CiAgfTsKICBmdW5jdGlvbiBkM190ZXh0KHJlcXVlc3QpIHsKICAgIHJldHVybiByZXF1ZXN0LnJlc3BvbnNlVGV4dDsKICB9CiAgZDMuanNvbiA9IGZ1bmN0aW9uKHVybCwgY2FsbGJhY2spIHsKICAgIHJldHVybiBkMy54aHIodXJsLCAiYXBwbGljYXRpb24vanNvbiIsIGNhbGxiYWNrKS5yZXNwb25zZShkM19qc29uKTsKICB9OwogIGZ1bmN0aW9uIGQzX2pzb24ocmVxdWVzdCkgewogICAgcmV0dXJuIEpTT04ucGFyc2UocmVxdWVzdC5yZXNwb25zZVRleHQpOwogIH0KICBkMy5odG1sID0gZnVuY3Rpb24odXJsLCBjYWxsYmFjaykgewogICAgcmV0dXJuIGQzLnhocih1cmwsICJ0ZXh0L2h0bWwiLCBjYWxsYmFjaykucmVzcG9uc2UoZDNfaHRtbCk7CiAgfTsKICBmdW5jdGlvbiBkM19odG1sKHJlcXVlc3QpIHsKICAgIHZhciByYW5nZSA9IGQzX2RvY3VtZW50LmNyZWF0ZVJhbmdlKCk7CiAgICByYW5nZS5zZWxlY3ROb2RlKGQzX2RvY3VtZW50LmJvZHkpOwogICAgcmV0dXJuIHJhbmdlLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudChyZXF1ZXN0LnJlc3BvbnNlVGV4dCk7CiAgfQogIGQzLnhtbCA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGQzLnhoci5hcHBseShkMywgYXJndW1lbnRzKS5yZXNwb25zZShkM194bWwpOwogIH07CiAgZnVuY3Rpb24gZDNfeG1sKHJlcXVlc3QpIHsKICAgIHJldHVybiByZXF1ZXN0LnJlc3BvbnNlWE1MOwogIH0KICByZXR1cm4gZDM7Cn0oKTs=' type='text/javascript'></script>
<script src='data:application/javascript;base64,ZDMuc2Fua2V5ID0gZnVuY3Rpb24oKSB7CiAgdmFyIHNhbmtleSA9IHt9LAogICAgICBub2RlV2lkdGggPSAyNCwKICAgICAgbm9kZVBhZGRpbmcgPSA4LAogICAgICBzaXplID0gWzEsIDFdLAogICAgICBub2RlcyA9IFtdLAogICAgICBsaW5rcyA9IFtdOwoKICBzYW5rZXkubm9kZVdpZHRoID0gZnVuY3Rpb24oXykgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbm9kZVdpZHRoOwogICAgbm9kZVdpZHRoID0gK187CiAgICByZXR1cm4gc2Fua2V5OwogIH07CgogIHNhbmtleS5ub2RlUGFkZGluZyA9IGZ1bmN0aW9uKF8pIHsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIG5vZGVQYWRkaW5nOwogICAgbm9kZVBhZGRpbmcgPSArXzsKICAgIHJldHVybiBzYW5rZXk7CiAgfTsKCiAgc2Fua2V5Lm5vZGVzID0gZnVuY3Rpb24oXykgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbm9kZXM7CiAgICBub2RlcyA9IF87CiAgICByZXR1cm4gc2Fua2V5OwogIH07CgogIHNhbmtleS5saW5rcyA9IGZ1bmN0aW9uKF8pIHsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGxpbmtzOwogICAgbGlua3MgPSBfOwogICAgcmV0dXJuIHNhbmtleTsKICB9OwoKICBzYW5rZXkuc2l6ZSA9IGZ1bmN0aW9uKF8pIHsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNpemU7CiAgICBzaXplID0gXzsKICAgIHJldHVybiBzYW5rZXk7CiAgfTsKCiAgc2Fua2V5LmxheW91dCA9IGZ1bmN0aW9uKGl0ZXJhdGlvbnMpIHsKICAgIGNvbXB1dGVOb2RlTGlua3MoKTsKICAgIGNvbXB1dGVOb2RlVmFsdWVzKCk7CiAgICBjb21wdXRlTm9kZUJyZWFkdGhzKCk7CiAgICBjb21wdXRlTm9kZURlcHRocyhpdGVyYXRpb25zKTsKICAgIGNvbXB1dGVMaW5rRGVwdGhzKCk7CiAgICByZXR1cm4gc2Fua2V5OwogIH07CgogIHNhbmtleS5yZWxheW91dCA9IGZ1bmN0aW9uKCkgewogICAgY29tcHV0ZUxpbmtEZXB0aHMoKTsKICAgIHJldHVybiBzYW5rZXk7CiAgfTsKCiAgc2Fua2V5LmxpbmsgPSBmdW5jdGlvbigpIHsKICAgIHZhciBjdXJ2YXR1cmUgPSAuNTsKCiAgICBmdW5jdGlvbiBsaW5rKGQpIHsKICAgICAgdmFyIHgwID0gZC5zb3VyY2UueCArIGQuc291cmNlLmR4LAogICAgICAgICAgeDEgPSBkLnRhcmdldC54LAogICAgICAgICAgeGkgPSBkMy5pbnRlcnBvbGF0ZU51bWJlcih4MCwgeDEpLAogICAgICAgICAgeDIgPSB4aShjdXJ2YXR1cmUpLAogICAgICAgICAgeDMgPSB4aSgxIC0gY3VydmF0dXJlKSwKICAgICAgICAgIHkwID0gZC5zb3VyY2UueSArIGQuc3kgKyBkLmR5IC8gMiwKICAgICAgICAgIHkxID0gZC50YXJnZXQueSArIGQudHkgKyBkLmR5IC8gMjsKICAgICAgcmV0dXJuICJNIiArIHgwICsgIiwiICsgeTAKICAgICAgICAgICArICJDIiArIHgyICsgIiwiICsgeTAKICAgICAgICAgICArICIgIiArIHgzICsgIiwiICsgeTEKICAgICAgICAgICArICIgIiArIHgxICsgIiwiICsgeTE7CiAgICB9CgogICAgbGluay5jdXJ2YXR1cmUgPSBmdW5jdGlvbihfKSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGN1cnZhdHVyZTsKICAgICAgY3VydmF0dXJlID0gK187CiAgICAgIHJldHVybiBsaW5rOwogICAgfTsKCiAgICByZXR1cm4gbGluazsKICB9OwoKICAvLyBQb3B1bGF0ZSB0aGUgc291cmNlTGlua3MgYW5kIHRhcmdldExpbmtzIGZvciBlYWNoIG5vZGUuCiAgLy8gQWxzbywgaWYgdGhlIHNvdXJjZSBhbmQgdGFyZ2V0IGFyZSBub3Qgb2JqZWN0cywgYXNzdW1lIHRoZXkgYXJlIGluZGljZXMuCiAgZnVuY3Rpb24gY29tcHV0ZU5vZGVMaW5rcygpIHsKICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24obm9kZSkgewogICAgICBub2RlLnNvdXJjZUxpbmtzID0gW107CiAgICAgIG5vZGUudGFyZ2V0TGlua3MgPSBbXTsKICAgIH0pOwogICAgbGlua3MuZm9yRWFjaChmdW5jdGlvbihsaW5rKSB7CiAgICAgIHZhciBzb3VyY2UgPSBsaW5rLnNvdXJjZSwKICAgICAgICAgIHRhcmdldCA9IGxpbmsudGFyZ2V0OwogICAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gIm51bWJlciIpIHNvdXJjZSA9IGxpbmsuc291cmNlID0gbm9kZXNbbGluay5zb3VyY2VdOwogICAgICBpZiAodHlwZW9mIHRhcmdldCA9PT0gIm51bWJlciIpIHRhcmdldCA9IGxpbmsudGFyZ2V0ID0gbm9kZXNbbGluay50YXJnZXRdOwogICAgICBzb3VyY2Uuc291cmNlTGlua3MucHVzaChsaW5rKTsKICAgICAgdGFyZ2V0LnRhcmdldExpbmtzLnB1c2gobGluayk7CiAgICB9KTsKICB9CgogIC8vIENvbXB1dGUgdGhlIHZhbHVlIChzaXplKSBvZiBlYWNoIG5vZGUgYnkgc3VtbWluZyB0aGUgYXNzb2NpYXRlZCBsaW5rcy4KICBmdW5jdGlvbiBjb21wdXRlTm9kZVZhbHVlcygpIHsKICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24obm9kZSkgewogICAgICBub2RlLnZhbHVlID0gTWF0aC5tYXgoCiAgICAgICAgZDMuc3VtKG5vZGUuc291cmNlTGlua3MsIHZhbHVlKSwKICAgICAgICBkMy5zdW0obm9kZS50YXJnZXRMaW5rcywgdmFsdWUpCiAgICAgICk7CiAgICB9KTsKICB9CgogIC8vIEl0ZXJhdGl2ZWx5IGFzc2lnbiB0aGUgYnJlYWR0aCAoeC1wb3NpdGlvbikgZm9yIGVhY2ggbm9kZS4KICAvLyBOb2RlcyBhcmUgYXNzaWduZWQgdGhlIG1heGltdW0gYnJlYWR0aCBvZiBpbmNvbWluZyBuZWlnaGJvcnMgcGx1cyBvbmU7CiAgLy8gbm9kZXMgd2l0aCBubyBpbmNvbWluZyBsaW5rcyBhcmUgYXNzaWduZWQgYnJlYWR0aCB6ZXJvLCB3aGlsZQogIC8vIG5vZGVzIHdpdGggbm8gb3V0Z29pbmcgbGlua3MgYXJlIGFzc2lnbmVkIHRoZSBtYXhpbXVtIGJyZWFkdGguCiAgZnVuY3Rpb24gY29tcHV0ZU5vZGVCcmVhZHRocygpIHsKICAgIHZhciByZW1haW5pbmdOb2RlcyA9IG5vZGVzLAogICAgICAgIG5leHROb2RlcywKICAgICAgICB4ID0gMDsKCiAgICB3aGlsZSAocmVtYWluaW5nTm9kZXMubGVuZ3RoKSB7CiAgICAgIG5leHROb2RlcyA9IFtdOwogICAgICByZW1haW5pbmdOb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKG5vZGUpIHsKICAgICAgICBub2RlLnggPSB4OwogICAgICAgIG5vZGUuZHggPSBub2RlV2lkdGg7CiAgICAgICAgbm9kZS5zb3VyY2VMaW5rcy5mb3JFYWNoKGZ1bmN0aW9uKGxpbmspIHsKICAgICAgICAgIG5leHROb2Rlcy5wdXNoKGxpbmsudGFyZ2V0KTsKICAgICAgICB9KTsKICAgICAgfSk7CiAgICAgIHJlbWFpbmluZ05vZGVzID0gbmV4dE5vZGVzOwogICAgICArK3g7CiAgICB9CgogICAgLy8KICAgIG1vdmVTaW5rc1JpZ2h0KHgpOwogICAgc2NhbGVOb2RlQnJlYWR0aHMoKHNpemVbMF0gLSBub2RlV2lkdGgpIC8gKHggLSAxKSk7CiAgfQoKICBmdW5jdGlvbiBtb3ZlU291cmNlc1JpZ2h0KCkgewogICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbihub2RlKSB7CiAgICAgIGlmICghbm9kZS50YXJnZXRMaW5rcy5sZW5ndGgpIHsKICAgICAgICBub2RlLnggPSBkMy5taW4obm9kZS5zb3VyY2VMaW5rcywgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC50YXJnZXQueDsgfSkgLSAxOwogICAgICB9CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIG1vdmVTaW5rc1JpZ2h0KHgpIHsKICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24obm9kZSkgewogICAgICBpZiAoIW5vZGUuc291cmNlTGlua3MubGVuZ3RoKSB7CiAgICAgICAgbm9kZS54ID0geCAtIDE7CiAgICAgIH0KICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gc2NhbGVOb2RlQnJlYWR0aHMoa3gpIHsKICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24obm9kZSkgewogICAgICBub2RlLnggKj0ga3g7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGNvbXB1dGVOb2RlRGVwdGhzKGl0ZXJhdGlvbnMpIHsKICAgIHZhciBub2Rlc0J5QnJlYWR0aCA9IGQzLm5lc3QoKQogICAgICAgIC5rZXkoZnVuY3Rpb24oZCkgeyByZXR1cm4gZC54OyB9KQogICAgICAgIC5zb3J0S2V5cyhkMy5hc2NlbmRpbmcpCiAgICAgICAgLmVudHJpZXMobm9kZXMpCiAgICAgICAgLm1hcChmdW5jdGlvbihkKSB7IHJldHVybiBkLnZhbHVlczsgfSk7CgogICAgLy8KICAgIGluaXRpYWxpemVOb2RlRGVwdGgoKTsKICAgIHJlc29sdmVDb2xsaXNpb25zKCk7CiAgICBmb3IgKHZhciBhbHBoYSA9IDE7IGl0ZXJhdGlvbnMgPiAwOyAtLWl0ZXJhdGlvbnMpIHsKICAgICAgcmVsYXhSaWdodFRvTGVmdChhbHBoYSAqPSAuOTkpOwogICAgICByZXNvbHZlQ29sbGlzaW9ucygpOwogICAgICByZWxheExlZnRUb1JpZ2h0KGFscGhhKTsKICAgICAgcmVzb2x2ZUNvbGxpc2lvbnMoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBpbml0aWFsaXplTm9kZURlcHRoKCkgewogICAgICB2YXIga3kgPSBkMy5taW4obm9kZXNCeUJyZWFkdGgsIGZ1bmN0aW9uKG5vZGVzKSB7CiAgICAgICAgcmV0dXJuIChzaXplWzFdIC0gKG5vZGVzLmxlbmd0aCAtIDEpICogbm9kZVBhZGRpbmcpIC8gZDMuc3VtKG5vZGVzLCB2YWx1ZSk7CiAgICAgIH0pOwoKICAgICAgbm9kZXNCeUJyZWFkdGguZm9yRWFjaChmdW5jdGlvbihub2RlcykgewogICAgICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24obm9kZSwgaSkgewogICAgICAgICAgbm9kZS55ID0gaTsKICAgICAgICAgIG5vZGUuZHkgPSBub2RlLnZhbHVlICoga3k7CiAgICAgICAgfSk7CiAgICAgIH0pOwoKICAgICAgbGlua3MuZm9yRWFjaChmdW5jdGlvbihsaW5rKSB7CiAgICAgICAgbGluay5keSA9IGxpbmsudmFsdWUgKiBreTsKICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gcmVsYXhMZWZ0VG9SaWdodChhbHBoYSkgewogICAgICBub2Rlc0J5QnJlYWR0aC5mb3JFYWNoKGZ1bmN0aW9uKG5vZGVzLCBicmVhZHRoKSB7CiAgICAgICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbihub2RlKSB7CiAgICAgICAgICBpZiAobm9kZS50YXJnZXRMaW5rcy5sZW5ndGgpIHsKICAgICAgICAgICAgdmFyIHkgPSBkMy5zdW0obm9kZS50YXJnZXRMaW5rcywgd2VpZ2h0ZWRTb3VyY2UpIC8gZDMuc3VtKG5vZGUudGFyZ2V0TGlua3MsIHZhbHVlKTsKICAgICAgICAgICAgbm9kZS55ICs9ICh5IC0gY2VudGVyKG5vZGUpKSAqIGFscGhhOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9KTsKCiAgICAgIGZ1bmN0aW9uIHdlaWdodGVkU291cmNlKGxpbmspIHsKICAgICAgICByZXR1cm4gY2VudGVyKGxpbmsuc291cmNlKSAqIGxpbmsudmFsdWU7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiByZWxheFJpZ2h0VG9MZWZ0KGFscGhhKSB7CiAgICAgIG5vZGVzQnlCcmVhZHRoLnNsaWNlKCkucmV2ZXJzZSgpLmZvckVhY2goZnVuY3Rpb24obm9kZXMpIHsKICAgICAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKG5vZGUpIHsKICAgICAgICAgIGlmIChub2RlLnNvdXJjZUxpbmtzLmxlbmd0aCkgewogICAgICAgICAgICB2YXIgeSA9IGQzLnN1bShub2RlLnNvdXJjZUxpbmtzLCB3ZWlnaHRlZFRhcmdldCkgLyBkMy5zdW0obm9kZS5zb3VyY2VMaW5rcywgdmFsdWUpOwogICAgICAgICAgICBub2RlLnkgKz0gKHkgLSBjZW50ZXIobm9kZSkpICogYWxwaGE7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0pOwoKICAgICAgZnVuY3Rpb24gd2VpZ2h0ZWRUYXJnZXQobGluaykgewogICAgICAgIHJldHVybiBjZW50ZXIobGluay50YXJnZXQpICogbGluay52YWx1ZTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHJlc29sdmVDb2xsaXNpb25zKCkgewogICAgICBub2Rlc0J5QnJlYWR0aC5mb3JFYWNoKGZ1bmN0aW9uKG5vZGVzKSB7CiAgICAgICAgdmFyIG5vZGUsCiAgICAgICAgICAgIGR5LAogICAgICAgICAgICB5MCA9IDAsCiAgICAgICAgICAgIG4gPSBub2Rlcy5sZW5ndGgsCiAgICAgICAgICAgIGk7CgogICAgICAgIC8vIFB1c2ggYW55IG92ZXJsYXBwaW5nIG5vZGVzIGRvd24uCiAgICAgICAgbm9kZXMuc29ydChhc2NlbmRpbmdEZXB0aCk7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgICAgbm9kZSA9IG5vZGVzW2ldOwogICAgICAgICAgZHkgPSB5MCAtIG5vZGUueTsKICAgICAgICAgIGlmIChkeSA+IDApIG5vZGUueSArPSBkeTsKICAgICAgICAgIHkwID0gbm9kZS55ICsgbm9kZS5keSArIG5vZGVQYWRkaW5nOwogICAgICAgIH0KCiAgICAgICAgLy8gSWYgdGhlIGJvdHRvbW1vc3Qgbm9kZSBnb2VzIG91dHNpZGUgdGhlIGJvdW5kcywgcHVzaCBpdCBiYWNrIHVwLgogICAgICAgIGR5ID0geTAgLSBub2RlUGFkZGluZyAtIHNpemVbMV07CiAgICAgICAgaWYgKGR5ID4gMCkgewogICAgICAgICAgeTAgPSBub2RlLnkgLT0gZHk7CgogICAgICAgICAgLy8gUHVzaCBhbnkgb3ZlcmxhcHBpbmcgbm9kZXMgYmFjayB1cC4KICAgICAgICAgIGZvciAoaSA9IG4gLSAyOyBpID49IDA7IC0taSkgewogICAgICAgICAgICBub2RlID0gbm9kZXNbaV07CiAgICAgICAgICAgIGR5ID0gbm9kZS55ICsgbm9kZS5keSArIG5vZGVQYWRkaW5nIC0geTA7CiAgICAgICAgICAgIGlmIChkeSA+IDApIG5vZGUueSAtPSBkeTsKICAgICAgICAgICAgeTAgPSBub2RlLnk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBhc2NlbmRpbmdEZXB0aChhLCBiKSB7CiAgICAgIHJldHVybiBhLnkgLSBiLnk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjb21wdXRlTGlua0RlcHRocygpIHsKICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24obm9kZSkgewogICAgICBub2RlLnNvdXJjZUxpbmtzLnNvcnQoYXNjZW5kaW5nVGFyZ2V0RGVwdGgpOwogICAgICBub2RlLnRhcmdldExpbmtzLnNvcnQoYXNjZW5kaW5nU291cmNlRGVwdGgpOwogICAgfSk7CiAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKG5vZGUpIHsKICAgICAgdmFyIHN5ID0gMCwgdHkgPSAwOwogICAgICBub2RlLnNvdXJjZUxpbmtzLmZvckVhY2goZnVuY3Rpb24obGluaykgewogICAgICAgIGxpbmsuc3kgPSBzeTsKICAgICAgICBzeSArPSBsaW5rLmR5OwogICAgICB9KTsKICAgICAgbm9kZS50YXJnZXRMaW5rcy5mb3JFYWNoKGZ1bmN0aW9uKGxpbmspIHsKICAgICAgICBsaW5rLnR5ID0gdHk7CiAgICAgICAgdHkgKz0gbGluay5keTsKICAgICAgfSk7CiAgICB9KTsKCiAgICBmdW5jdGlvbiBhc2NlbmRpbmdTb3VyY2VEZXB0aChhLCBiKSB7CiAgICAgIHJldHVybiBhLnNvdXJjZS55IC0gYi5zb3VyY2UueTsKICAgIH0KCiAgICBmdW5jdGlvbiBhc2NlbmRpbmdUYXJnZXREZXB0aChhLCBiKSB7CiAgICAgIHJldHVybiBhLnRhcmdldC55IC0gYi50YXJnZXQueTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGNlbnRlcihub2RlKSB7CiAgICByZXR1cm4gbm9kZS55ICsgbm9kZS5keSAvIDI7CiAgfQoKICBmdW5jdGlvbiB2YWx1ZShsaW5rKSB7CiAgICByZXR1cm4gbGluay52YWx1ZTsKICB9CgogIHJldHVybiBzYW5rZXk7Cn07Cg==' type='text/javascript'></script>
<style>
.rChart {
display: block;
margin-left: auto;
margin-right: auto;
width: 750px;
height: 500px;
}
</style>
</head>
<body >
<div id = 'chart74d402b4380' class = 'rChart d3_sankey'></div>
<!--Attribution:
Mike Bostock https://github.com/d3/d3-plugins/tree/master/sankey
Mike Bostock http://bost.ocks.org/mike/sankey/
-->
<script>
(function(){
var params = {
"dom": "chart74d402b4380",
"width": 750,
"height": 500,
"data": {
"source": [ "exp.Github", "exp.Matlab", "exp.R.advanced", "exp.R.graphics", "exp.R.manipulation", "exp.R.reproducible", "exp.Github", "exp.Matlab", "exp.R.advanced", "exp.R.graphics", "exp.R.manipulation", "exp.R.reproducible", "exp.Github", "exp.Matlab", "exp.R.advanced", "exp.R.graphics", "exp.R.manipulation", "exp.R.reproducible", "exp.Github", "exp.Matlab", "exp.R.advanced", "exp.R.graphics", "exp.R.manipulation", "exp.R.reproducible", "Applied Math", "Data Science Certification", "IDSE (master)", "Other masters", "Ph.D.", "QMSS", "QMSS (master)", "Statistics (master)", "Unknown", "Applied Math", "Data Science Certification", "IDSE (master)", "Other masters", "Ph.D.", "QMSS", "QMSS (master)", "Statistics (master)", "Unknown", "Applied Math", "Data Science Certification", "IDSE (master)", "Other masters", "Ph.D.", "QMSS", "QMSS (master)", "Statistics (master)", "Unknown", "Applied Math", "Data Science Certification", "IDSE (master)", "Other masters", "Ph.D.", "QMSS", "QMSS (master)", "Statistics (master)", "Unknown", "Applied Math", "Data Science Certification", "IDSE (master)", "Other masters", "Ph.D.", "QMSS", "QMSS (master)", "Statistics (master)", "Unknown", "Applied Math", "Data Science Certification", "IDSE (master)", "Other masters", "Ph.D.", "QMSS", "QMSS (master)", "Statistics (master)", "Unknown" ],
"target": [ "A little", "A little", "A little", "A little", "A little", "A little", "Confident", "Confident", "Confident", "Confident", "Confident", "Confident", "Expert", "Expert", "Expert", "Expert", "Expert", "Expert", "None", "None", "None", "None", "None", "None", "exp.Github", "exp.Github", "exp.Github", "exp.Github", "exp.Github", "exp.Github", "exp.Github", "exp.Github", "exp.Github", "exp.Matlab", "exp.Matlab", "exp.Matlab", "exp.Matlab", "exp.Matlab", "exp.Matlab", "exp.Matlab", "exp.Matlab", "exp.Matlab", "exp.R.advanced", "exp.R.advanced", "exp.R.advanced", "exp.R.advanced", "exp.R.advanced", "exp.R.advanced", "exp.R.advanced", "exp.R.advanced", "exp.R.advanced", "exp.R.graphics", "exp.R.graphics", "exp.R.graphics", "exp.R.graphics", "exp.R.graphics", "exp.R.graphics", "exp.R.graphics", "exp.R.graphics", "exp.R.graphics", "exp.R.manipulation", "exp.R.manipulation", "exp.R.manipulation", "exp.R.manipulation", "exp.R.manipulation", "exp.R.manipulation", "exp.R.manipulation", "exp.R.manipulation", "exp.R.manipulation", "exp.R.reproducible", "exp.R.reproducible", "exp.R.reproducible", "exp.R.reproducible", "exp.R.reproducible", "exp.R.reproducible", "exp.R.reproducible", "exp.R.reproducible", "exp.R.reproducible" ],
"value": [ 48, 44, 57, 53, 33, 39, 28, 24, 22, 34, 60, 26, 3, 1, 2, 2, 11, 6, 35, 45, 33, 25, 10, 43, 1, 19, 34, 9, 2, 1, 1, 11, 1, 0, 11, 37, 6, 1, 2, 1, 10, 1, 0, 10, 41, 10, 2, 2, 1, 14, 1, 0, 12, 46, 11, 3, 1, 1, 14, 1, 0, 17, 52, 11, 3, 2, 1, 17, 1, 1, 7, 41, 10, 0, 2, 1, 8, 1 ]
},
"nodeWidth": 15,
"nodePadding": 10,
"layout": 35,
"units": "TWh",
"title": "Editor-Program",
"id": "chart74d402b4380"
};
params.units ? units = " " + params.units : units = "";
//hard code these now but eventually make available
var formatNumber = d3.format("0,.0f"), // zero decimal places
format = function(d) { return formatNumber(d) + units; },
color = d3.scale.category20();
if(params.labelFormat){
formatNumber = d3.format(".2%");
}
var svg = d3.select('#' + params.id).append("svg")
.attr("width", params.width)
.attr("height", params.height);
var sankey = d3.sankey()
.nodeWidth(params.nodeWidth)
.nodePadding(params.nodePadding)
.layout(params.layout)
.size([params.width,params.height]);
var path = sankey.link();
var data = params.data,
links = [],
nodes = [];
//get all source and target into nodes
//will reduce to unique in the next step
//also get links in object form
data.source.forEach(function (d, i) {
nodes.push({ "name": data.source[i] });
nodes.push({ "name": data.target[i] });
links.push({ "source": data.source[i], "target": data.target[i], "value": +data.value[i] });
});
//now get nodes based on links data
//thanks Mike Bostock https://groups.google.com/d/msg/d3-js/pl297cFtIQk/Eso4q_eBu1IJ
//this handy little function returns only the distinct / unique nodes
nodes = d3.keys(d3.nest()
.key(function (d) { return d.name; })
.map(nodes));
//it appears d3 with force layout wants a numeric source and target
//so loop through each link replacing the text with its index from node
links.forEach(function (d, i) {
links[i].source = nodes.indexOf(links[i].source);
links[i].target = nodes.indexOf(links[i].target);
});
//now loop through each nodes to make nodes an array of objects rather than an array of strings
nodes.forEach(function (d, i) {
nodes[i] = { "name": d };
});
sankey
.nodes(nodes)
.links(links)
.layout(params.layout);
var link = svg.append("g").selectAll(".link")
.data(links)
.enter().append("path")
.attr("class", "link")
.attr("d", path)
.style("stroke-width", function (d) { return Math.max(1, d.dy); })
.sort(function (a, b) { return b.dy - a.dy; });
link.append("title")
.text(function (d) { return d.source.name + " → " + d.target.name + "\n" + format(d.value); });
var node = svg.append("g").selectAll(".node")
.data(nodes)
.enter().append("g")
.attr("class", "node")
.attr("transform", function (d) { return "translate(" + d.x + "," + d.y + ")"; })
.call(d3.behavior.drag()
.origin(function (d) { return d; })
.on("dragstart", function () { this.parentNode.appendChild(this); })
.on("drag", dragmove));
node.append("rect")
.attr("height", function (d) { return d.dy; })
.attr("width", sankey.nodeWidth())
.style("fill", function (d) { return d.color = color(d.name.replace(/ .*/, "")); })
.style("stroke", function (d) { return d3.rgb(d.color).darker(2); })
.append("title")
.text(function (d) { return d.name + "\n" + format(d.value); });
node.append("text")
.attr("x", -6)
.attr("y", function (d) { return d.dy / 2; })
.attr("dy", ".35em")
.attr("text-anchor", "end")
.attr("transform", null)
.text(function (d) { return d.name; })
.filter(function (d) { return d.x < params.width / 2; })
.attr("x", 6 + sankey.nodeWidth())
.attr("text-anchor", "start");
// the function for moving the nodes
function dragmove(d) {
d3.select(this).attr("transform",
"translate(" + (
d.x = Math.max(0, Math.min(params.width - d.dx, d3.event.x))
) + "," + (
d.y = Math.max(0, Math.min(params.height - d.dy, d3.event.y))
) + ")");
sankey.relayout();
link.attr("d", path);
}
})();
</script>
<script></script>
</body>
</html>