@jpoly1219/context-extractor 0.2.5 → 0.2.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. package/dist/src/app.js +2 -1
  2. package/dist/src/ocaml-utils/_build/.filesystem-clock +1 -0
  3. package/dist/src/ocaml-utils/_build/.lock +0 -0
  4. package/dist/src/ocaml-utils/_build/default/.dune/configurator +2 -0
  5. package/dist/src/ocaml-utils/_build/default/.dune/configurator.v2 +1 -0
  6. package/dist/src/ocaml-utils/_build/default/.js/default/compiler-libs.common/ocamlcommon.cma.js +160991 -0
  7. package/dist/src/ocaml-utils/_build/default/.js/default/js_of_ocaml/js_of_ocaml.cma.js +7195 -0
  8. package/dist/src/ocaml-utils/_build/default/.js/default/js_of_ocaml-compiler.runtime/jsoo_runtime.cma.js +73 -0
  9. package/dist/src/ocaml-utils/_build/default/.js/default/stdlib/std_exit.cmo.js +25 -0
  10. package/dist/src/ocaml-utils/_build/default/.js/default/stdlib/stdlib.cma.js +28451 -0
  11. package/dist/src/ocaml-utils/_build/default/.merlin-conf/exe-test_parser +0 -0
  12. package/dist/src/ocaml-utils/_build/default/.ppx/7b799aed44581cc79b02033532c5f775/_ppx.ml-gen +1 -0
  13. package/dist/src/ocaml-utils/_build/default/.ppx/7b799aed44581cc79b02033532c5f775/dune__exe___ppx.cmi +0 -0
  14. package/dist/src/ocaml-utils/_build/default/.ppx/7b799aed44581cc79b02033532c5f775/dune__exe___ppx.cmo +0 -0
  15. package/dist/src/ocaml-utils/_build/default/.ppx/7b799aed44581cc79b02033532c5f775/dune__exe___ppx.cmx +0 -0
  16. package/dist/src/ocaml-utils/_build/default/.ppx/7b799aed44581cc79b02033532c5f775/dune__exe___ppx.o +0 -0
  17. package/dist/src/ocaml-utils/_build/default/.ppx/7b799aed44581cc79b02033532c5f775/ppx.exe +0 -0
  18. package/dist/src/ocaml-utils/_build/default/.test_parser.eobjs/byte/dune__exe__Test_parser.cmi +0 -0
  19. package/dist/src/ocaml-utils/_build/default/.test_parser.eobjs/byte/dune__exe__Test_parser.cmo +0 -0
  20. package/dist/src/ocaml-utils/_build/default/.test_parser.eobjs/byte/dune__exe__Test_parser.cmt +0 -0
  21. package/dist/src/ocaml-utils/_build/default/.test_parser.eobjs/byte/dune__exe__Test_parser.cmti +0 -0
  22. package/dist/src/ocaml-utils/_build/default/.test_parser.eobjs/jsoo/dune__exe__Test_parser.cmo.js +215 -0
  23. package/dist/src/ocaml-utils/_build/default/.test_parser.eobjs/jsoo/test_parser.bc.runtime.js +8894 -0
  24. package/dist/src/ocaml-utils/_build/default/.test_parser.eobjs/native/dune__exe__Test_parser.cmx +0 -0
  25. package/dist/src/ocaml-utils/_build/default/.test_parser.eobjs/native/dune__exe__Test_parser.o +0 -0
  26. package/dist/src/ocaml-utils/_build/default/test_parser.bc-for-jsoo +0 -0
  27. package/dist/src/ocaml-utils/_build/default/test_parser.bc.d.ts +3 -0
  28. package/dist/src/ocaml-utils/_build/default/test_parser.bc.js +194658 -0
  29. package/dist/src/ocaml-utils/_build/default/test_parser.ml +315 -0
  30. package/dist/src/ocaml-utils/_build/default/test_parser.pp.ml +0 -0
  31. package/dist/src/ocaml-utils/_build/default/test_parser.pp.mli +1 -0
  32. package/dist/src/ocaml-utils/_build/log +22 -0
  33. package/dist/src/runner.js +10 -1
  34. package/dist/src/typescript-driver.js +13 -2
  35. package/package.json +6 -2
@@ -0,0 +1 @@
1
+ let () = Ppxlib.Driver.standalone ()
@@ -0,0 +1,215 @@
1
+ // Generated by js_of_ocaml
2
+ //# buildInfo:effects=false, kind=cmo, use-js-string=true, version=5.8.2+5.8.2
3
+
4
+ //# unitInfo: Provides: Dune__exe__Test_parser
5
+ //# unitInfo: Requires: Js_of_ocaml__Js, Parse, Stdlib, Stdlib__Array, Stdlib__Lexing, Stdlib__List, Stdlib__Printf, Stdlib__String
6
+ (function
7
+ (globalThis){
8
+ "use strict";
9
+ var
10
+ runtime = globalThis.jsoo_runtime,
11
+ cst$4 = " ",
12
+ cst_Failed_to_parse_type_span$1 = "Failed to parse type span",
13
+ cst_Other_core_type = "Other core type",
14
+ cst_Ptyp_constr$1 = "Ptyp_constr",
15
+ caml_js_from_array = runtime.caml_js_from_array,
16
+ caml_js_wrap_callback = runtime.caml_js_wrap_callback;
17
+ function caml_call1(f, a0){
18
+ return (f.l >= 0 ? f.l : f.l = f.length) == 1
19
+ ? f(a0)
20
+ : runtime.caml_call_gen(f, [a0]);
21
+ }
22
+ function caml_call2(f, a0, a1){
23
+ return (f.l >= 0 ? f.l : f.l = f.length) == 2
24
+ ? f(a0, a1)
25
+ : runtime.caml_call_gen(f, [a0, a1]);
26
+ }
27
+ function caml_call3(f, a0, a1, a2){
28
+ return (f.l >= 0 ? f.l : f.l = f.length) == 3
29
+ ? f(a0, a1, a2)
30
+ : runtime.caml_call_gen(f, [a0, a1, a2]);
31
+ }
32
+ var
33
+ global_data = runtime.caml_get_global_data(),
34
+ cst = " -> ",
35
+ cst$0 = " * ",
36
+ cst$1 = ", ",
37
+ cst$2 = cst$4,
38
+ cst$3 = cst$4,
39
+ Stdlib = global_data.Stdlib,
40
+ Stdlib_List = global_data.Stdlib__List,
41
+ Stdlib_String = global_data.Stdlib__String,
42
+ Stdlib_Printf = global_data.Stdlib__Printf,
43
+ Stdlib_Array = global_data.Stdlib__Array,
44
+ Stdlib_Lexing = global_data.Stdlib__Lexing,
45
+ Parse = global_data.Parse,
46
+ Js_of_ocaml_Js = global_data.Js_of_ocaml__Js,
47
+ cst_unknown = "unknown",
48
+ _a_ = [0, [11, cst_Other_core_type, 0], cst_Other_core_type],
49
+ _b_ = [0, cst_Other_core_type, 0],
50
+ cst_Ptyp_arrow = "Ptyp_arrow",
51
+ cst_Ptyp_tuple = "Ptyp_tuple",
52
+ cst_Ptyp_constr = cst_Ptyp_constr$1,
53
+ cst_Ptyp_constr$0 = cst_Ptyp_constr$1,
54
+ _c_ = [0, [11, cst_Other_core_type, 0], cst_Other_core_type],
55
+ cst_type_tmp = "type tmp = ",
56
+ cst_Failed_to_parse_type_span = cst_Failed_to_parse_type_span$1,
57
+ cst_Failed_to_parse_type_span$0 = cst_Failed_to_parse_type_span$1;
58
+ function string_of_type(typ){
59
+ var match = typ[1];
60
+ if(typeof match !== "number")
61
+ switch(match[0]){
62
+ case 1:
63
+ var
64
+ t2 = match[3],
65
+ t1 = match[2],
66
+ arg1 = string_of_type(t1),
67
+ arg2 = string_of_type(t2),
68
+ _r_ = caml_call2(Stdlib[28], cst, arg2);
69
+ return caml_call2(Stdlib[28], arg1, _r_);
70
+ case 2:
71
+ var
72
+ types = match[1],
73
+ type_strings = caml_call2(Stdlib_List[20], string_of_type, types);
74
+ return caml_call2(Stdlib_String[7], cst$0, type_strings);
75
+ case 3:
76
+ var _s_ = match[1][1];
77
+ if(0 === _s_[0]){
78
+ var s = _s_[1];
79
+ if(! match[2]) return s;
80
+ var
81
+ ctyp_list = match[2],
82
+ _t_ = caml_call2(Stdlib_List[20], string_of_type, ctyp_list),
83
+ args_str = caml_call1(caml_call1(Stdlib_String[7], cst$1), _t_),
84
+ _u_ = caml_call2(Stdlib[28], cst$2, s);
85
+ return caml_call2(Stdlib[28], args_str, _u_);
86
+ }
87
+ break;
88
+ }
89
+ return cst_unknown;
90
+ }
91
+ function extract_core_type(ctyp, components_only){
92
+ if(components_only){
93
+ var match = ctyp[1];
94
+ if(typeof match !== "number")
95
+ switch(match[0]){
96
+ case 1:
97
+ var
98
+ rettyp = match[3],
99
+ argtyp = match[2],
100
+ _i_ = [0, string_of_type(rettyp), 0];
101
+ return [0, cst_Ptyp_arrow, [0, string_of_type(argtyp), _i_]];
102
+ case 2:
103
+ var types = match[1];
104
+ return [0,
105
+ cst_Ptyp_tuple,
106
+ caml_call3
107
+ (Stdlib_List[27],
108
+ function(curr, acc){return [0, string_of_type(curr), acc];},
109
+ types,
110
+ 0)];
111
+ case 3:
112
+ var _j_ = match[1][1];
113
+ if(0 === _j_[0]){
114
+ var _k_ = match[2], id = _j_[1];
115
+ if(! _k_) return [0, cst_Ptyp_constr$0, [0, id, 0]];
116
+ if(! _k_[2]){
117
+ var ctyps = _k_[1];
118
+ return [0, cst_Ptyp_constr, [0, string_of_type(ctyps), [0, id, 0]]];
119
+ }
120
+ }
121
+ break;
122
+ }
123
+ caml_call1(Stdlib_Printf[2], _a_);
124
+ return _b_;
125
+ }
126
+ var match$0 = ctyp[1];
127
+ if(typeof match$0 !== "number")
128
+ switch(match$0[0]){
129
+ case 1:
130
+ var
131
+ rettyp$0 = match$0[3],
132
+ _l_ = extract_core_type(rettyp$0, components_only);
133
+ return [0, string_of_type(ctyp), _l_];
134
+ case 2:
135
+ var types$0 = match$0[1];
136
+ return caml_call3
137
+ (Stdlib_List[26],
138
+ function(acc, curr){
139
+ var _q_ = extract_core_type(curr, components_only);
140
+ return caml_call2(Stdlib_List[12], _q_, acc);
141
+ },
142
+ 0,
143
+ types$0);
144
+ case 3:
145
+ var _m_ = match$0[1][1];
146
+ if(0 === _m_[0]){
147
+ var _n_ = match$0[2], id$0 = _m_[1];
148
+ if(! _n_) return [0, id$0, 0];
149
+ if(! _n_[2]){
150
+ var
151
+ ctyps$0 = _n_[1],
152
+ _o_ = caml_call2(Stdlib[28], cst$3, id$0),
153
+ _p_ = string_of_type(ctyps$0);
154
+ return [0, caml_call2(Stdlib[28], _p_, _o_), 0];
155
+ }
156
+ }
157
+ break;
158
+ }
159
+ caml_call1(Stdlib_Printf[2], _c_);
160
+ return 0;
161
+ }
162
+ function parse_core_type_from_type_span(s){
163
+ var lexbuf = caml_call2(Stdlib_Lexing[3], 0, s);
164
+ try{var _g_ = [0, caml_call1(Parse[5], lexbuf)]; return _g_;}
165
+ catch(_h_){return 0;}
166
+ }
167
+ function parse_implementation_from_type(s){
168
+ var
169
+ _d_ = caml_call2(Stdlib[28], cst_type_tmp, s),
170
+ lexbuf = caml_call2(Stdlib_Lexing[3], 0, _d_);
171
+ try{var _e_ = [0, caml_call1(Parse[1], lexbuf)]; return _e_;}
172
+ catch(_f_){return 0;}
173
+ }
174
+ function js_extract_target_types(type_span){
175
+ var parsed = parse_core_type_from_type_span(type_span);
176
+ if(parsed)
177
+ var ctyp = parsed[1], extracted = extract_core_type(ctyp, 0);
178
+ else
179
+ var
180
+ parsed2 = parse_implementation_from_type(type_span),
181
+ extracted =
182
+ parsed2
183
+ ? [0, type_span, 0]
184
+ : caml_call1(Stdlib[2], cst_Failed_to_parse_type_span);
185
+ return caml_js_from_array(caml_call1(Stdlib_Array[11], extracted));
186
+ }
187
+ function js_extract_component_types(type_span){
188
+ var parsed = parse_core_type_from_type_span(type_span);
189
+ if(parsed)
190
+ var ctyp = parsed[1], extracted = extract_core_type(ctyp, 1);
191
+ else
192
+ var
193
+ parsed2 = parse_implementation_from_type(type_span),
194
+ extracted =
195
+ parsed2
196
+ ? [0, type_span, 0]
197
+ : caml_call1(Stdlib[2], cst_Failed_to_parse_type_span$0);
198
+ return caml_js_from_array(caml_call1(Stdlib_Array[11], extracted));
199
+ }
200
+ caml_call2
201
+ (Js_of_ocaml_Js[50],
202
+ "parse",
203
+ caml_js_wrap_callback(js_extract_target_types));
204
+ caml_call2
205
+ (Js_of_ocaml_Js[50],
206
+ "getComponents",
207
+ caml_js_wrap_callback(js_extract_component_types));
208
+ var Dune_exe_Test_parser = [0];
209
+ runtime.caml_register_global
210
+ (26, Dune_exe_Test_parser, "Dune__exe__Test_parser");
211
+ return;
212
+ }
213
+ (globalThis));
214
+
215
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLjAsImZpbGUiOiIudGVzdF9wYXJzZXIuZW9ianMvanNvby9kdW5lX19leGVfX1Rlc3RfcGFyc2VyLmNtby5qcyIsInNvdXJjZVJvb3QiOiIiLCJuYW1lcyI6WyJzdHJpbmdfb2ZfdHlwZSIsInR5cCIsInQyIiwidDEiLCJhcmcxIiwiYXJnMiIsInR5cGVzIiwidHlwZV9zdHJpbmdzIiwicyIsImN0eXBfbGlzdCIsImFyZ3Nfc3RyIiwiZXh0cmFjdF9jb3JlX3R5cGUiLCJjdHlwIiwiY29tcG9uZW50c19vbmx5IiwicmV0dHlwIiwiYXJndHlwIiwiY3VyciIsImFjYyIsImlkIiwiY3R5cHMiLCJyZXR0eXAkMCIsInR5cGVzJDAiLCJpZCQwIiwiY3R5cHMkMCIsInBhcnNlX2NvcmVfdHlwZV9mcm9tX3R5cGVfc3BhbiIsImxleGJ1ZiIsInBhcnNlX2ltcGxlbWVudGF0aW9uX2Zyb21fdHlwZSIsImpzX2V4dHJhY3RfdGFyZ2V0X3R5cGVzIiwidHlwZV9zcGFuIiwicGFyc2VkIiwiZXh0cmFjdGVkIiwicGFyc2VkMiIsImpzX2V4dHJhY3RfY29tcG9uZW50X3R5cGVzIl0sInNvdXJjZXMiOlsiL3dvcmtzcGFjZV9yb290L3Rlc3RfcGFyc2VyLm1sIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0c7Ozs7O0c7Ozs7O0c7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7WUF3S1FBLGVBQWdCQztJQUN0QixZQURzQkE7Ozs7UUFHUDtTQURNQztTQUFKQztTQUNUQyxPQUhGSixlQUVXRztTQUVURSxPQUpGTCxlQUVlRTtTQUdWLE1BQUEsNEJBREhHO1FBQ0csT0FBQSx1QkFGSEQ7O1FBSWU7U0FEVkU7U0FDTEMsZUFBZSw0QkFQakJQLGdCQU1PTTtRQUVULE9BQUEsb0NBRElDOzs7O2FBRXNCQzt3QkFBZSxPQUFmQTtTQUVYO1VBRG1CQztVQUNuQixNQUFBLDRCQVhiVCxnQkFVZ0NTO1VBQzlCQyxXQUFXLFdBQXFDO1VBQ3pDLE1BQUEsOEJBSGVGO1NBR2YsT0FBQSx1QkFEUEU7Ozs7SUFFRDtHQUFTO1lBRVZDLGtCQUFtQkMsTUFBNkJDO0lBRXRELEdBRnNEQTtpQkFBN0JEOzs7OztVQUlFRTtVQUFSQztvQkFuQmJmLGVBbUJxQmM7U0FDckIsK0JBcEJBZCxlQW1CYWU7O2FBRUpUO1NBQ1Q7O2lCQUNHOzs0QkFBcUJVLE1BQUtDLEtBQU8sV0F2QnBDakIsZUF1QndCZ0IsT0FBS0MsS0FBaUM7bUJBRnJEWDs7Ozs7OEJBR2lCWTtvQkFBZ0Isa0NBQWhCQTs7ZUFDV0M7V0FDckMsZ0NBMUJBbkIsZUF5QnFDbUIsWUFEWEQ7Ozs7O0tBSTFCO0tBQUE7O2tCQWJtQk47Ozs7UUFrQkk7U0FEUFE7U0FDTyxNQWxCdkJULGtCQWlCZ0JTLFVBakJnQ1A7UUFrQmhELFdBakNBYixlQWVtQlk7O1lBbUJWUztRQUNULE9BQUE7OzBCQUNPSixLQUFJRDtrQkFDSyxVQXRCaEJMLGtCQXFCV0ssTUFyQnFDSDtrQkFzQjVDLE9BQUEsaUNBREdJO2lCQUNxRDs7aUJBSG5ESTs7OzsrQkFLaUJDO21CQUFnQixXQUFoQkE7O1VBRUQ7V0FEWUM7V0FDWixNQUFBLDhCQUZDRDtXQUV4QixNQXpDRnRCLGVBd0NxQ3VCO1VBQ3JDLFdBQUU7Ozs7O0lBRUY7SUFBQTtHQUNFO1lBc0JOQywrQkFBK0JoQjtJQUNwQixJQUFUaUIsU0FBUyxnQ0FEb0JqQjtJQUVqQyxJQUFJLGNBQUsscUJBRExpQixVQUNBO2VBQXdDO0dBQUk7WUFFOUNDLCtCQUFvQ2xCO0lBQ3RDO0tBQWdDLE1BQUEscUNBRE1BO0tBQ2xDaUIsU0FBUztJQUNiLElBQUksY0FBSyxxQkFETEEsVUFDQTtlQUE2QztHQUFJO1lBNEJuREUsd0JBQXlCQztJQXhCZCxJQUFUQyxTQVZGTCwrQkFrQ3lCSTtJQXZCM0IsR0FESUM7U0FFR2pCLE9BRkhpQixXQXlCQUMsWUF0RkVuQixrQkErRENDOztLQUVXO01BQVZtQixVQVZOTCwrQkE4QnlCRTtNQUN2QkU7UUFyQklDO2VBb0JtQkg7V0FoQmI7SUFrQmQsT0FBQSxtQkFBUyw2QkFETEU7R0FDOEI7WUFJaENFLDJCQUE0Qko7SUFoQmpCLElBQVRDLFNBeEJGTCwrQkF3QzRCSTtJQWY5QixHQURJQztTQUVHakIsT0FGSGlCLFdBaUJBQyxZQTVGRW5CLGtCQTZFQ0M7O0tBRVc7TUFBVm1CLFVBeEJOTCwrQkFvQzRCRTtNQUMxQkU7UUFiSUM7ZUFZc0JIO1dBUmhCO0lBVWQsT0FBQSxtQkFBUyw2QkFETEU7R0FDOEI7R0ErQjVCOzs7S0FBa0Isc0JBdkN0Qkg7R0F3Q0k7OztLQUEwQixzQkFsQzlCSztHQWtDSTs7OztFIiwic291cmNlc0NvbnRlbnQiOlsib3BlbiBKc19vZl9vY2FtbFxuXG4oKiBQYXJzZSBzb21lIHN0cmluZ2lmaWVkIE9DYW1sIGNvZGUuICopXG4oKiBsZXQgcGFyc2VfZnJvbV9zdHJpbmcgc3RyID0gKilcbigqICAgbGV0IGxleGJ1ZiA9IExleGluZy5mcm9tX3N0cmluZyBzdHIgaW4gKilcbigqICAgdHJ5ICopXG4oKiAgICAgbGV0IHBhcnNlZF9zdHIgPSBQYXJzZS5pbXBsZW1lbnRhdGlvbiBsZXhidWYgaW4gKilcbigqICAgICBTb21lIHBhcnNlZF9zdHIgKilcbigqICAgd2l0aCAqKVxuKCogICB8IFN5bnRheGVyci5FcnJvciBfIC0+ICopXG4oKiAgICAgICBwcmVycl9lbmRsaW5lIFwiU3ludGF4IGVycm9yIVwiOyAqKVxuKCogICAgICAgTm9uZSAqKVxuKCogICB8IF8gLT4gKilcbigqICAgICAgIHByZXJyX2VuZGxpbmUgXCJBbiBlcnJvciBvY2N1cnJlZCFcIjsgKilcbigqICAgICAgIE5vbmUgKilcbigqKilcbigqIGxldCByZWMgcHJpbnRfY29yZV90eXBlIChjb3JlX3R5cGUgOiBQYXJzZXRyZWUuY29yZV90eXBlKSBpbmRlbnQgcHJpbnRfZGVzYyA9ICopXG4oKiAgIGxldCBpbmRlbnRfc3RyID0gU3RyaW5nLm1ha2UgaW5kZW50ICcgJyBpbiAqKVxuKCogICBtYXRjaCBjb3JlX3R5cGUucHR5cF9kZXNjIHdpdGggKilcbigqICAgfCBQdHlwX3R1cGxlIGVsZW1lbnRzIC0+ICopXG4oKiAgICAgICBpZiBwcmludF9kZXNjIHRoZW4gUHJpbnRmLnByaW50ZiBcIiVzVHVwbGUgY29yZSB0eXBlczogXCIgaW5kZW50X3N0cjsgKilcbigqICAgICAgIFByaW50Zi5wcmludGYgXCIlc1xcblwiIChGb3JtYXQuYXNwcmludGYgXCIlYVwiIFBwcmludGFzdC5jb3JlX3R5cGUgY29yZV90eXBlKTsgKilcbigqICAgICAgIExpc3QuaXRlciAoZnVuIGVsIC0+IHByaW50X2NvcmVfdHlwZSBlbCAoaW5kZW50ICsgMikgZmFsc2UpIGVsZW1lbnRzOyAqKVxuKCogICAgICAgaWYgcHJpbnRfZGVzYyB0aGVuIFByaW50Zi5wcmludGYgXCJcXG5cIiAqKVxuKCogICAoKiB8IFB0eXBfY29uc3RyIChsb2MsIFtdKSAtPiAqKSAqKVxuKCogICAoKiAgICAgUHJpbnRmLnByaW50ZiBcIiVzSWRlbnRpZmllcjogJXNcXG5cIiBpbmRlbnRfc3RyICopICopXG4oKiAgICgqICAgICAgIChtYXRjaCBsb2MudHh0IHdpdGggTG9uZ2lkZW50LkxpZGVudCBsaSAtPiBsaSB8IF8gLT4gXCJPdGhlciBjb25zdHJcIikgKikgKilcbigqICAgfCBQdHlwX2NvbnN0ciAobG9jLCBjb3JlX3R5cGVzKSAtPiAqKVxuKCogICAgICAgaWYgcHJpbnRfZGVzYyB0aGVuIFByaW50Zi5wcmludGYgXCIlc0NvbnN0ciBjb3JlIHR5cGVzOiBcIiBpbmRlbnRfc3RyOyAqKVxuKCogICAgICAgTGlzdC5pdGVyICopXG4oKiAgICAgICAgIChmdW4gY3R5cCAtPiAqKVxuKCogICAgICAgICAgIHByaW50X2NvcmVfdHlwZSBjdHlwIGluZGVudCBmYWxzZTsgKilcbigqICAgICAgICAgICBQcmludGYucHJpbnRmIFwiIFwiKSAqKVxuKCogICAgICAgICBjb3JlX3R5cGVzOyAqKVxuKCogICAgICAgUHJpbnRmLnByaW50ZiBcIiVzXCIgKilcbigqICAgICAgICAgKG1hdGNoIGxvYy50eHQgd2l0aCBMb25naWRlbnQuTGlkZW50IGxpIC0+IGxpIHwgXyAtPiBcIk90aGVyIGNvbnN0clwiKTsgKilcbigqICAgICAgIGlmIHByaW50X2Rlc2MgdGhlbiBQcmludGYucHJpbnRmIFwiXFxuXCIgKilcbigqICAgfCBQdHlwX2Fycm93IChfLCB0MSwgdDIpIC0+ICopXG4oKiAgICAgICBpZiBwcmludF9kZXNjIHRoZW4gUHJpbnRmLnByaW50ZiBcIiVzQXJyb3cgY29yZSB0eXBlOiBcIiBpbmRlbnRfc3RyOyAqKVxuKCogICAgICAgcHJpbnRfY29yZV90eXBlIHQxIChpbmRlbnQgKyAyKSBmYWxzZTsgKilcbigqICAgICAgIFByaW50Zi5wcmludGYgXCIgLT4gXCI7ICopXG4oKiAgICAgICBwcmludF9jb3JlX3R5cGUgdDIgKGluZGVudCArIDIpIGZhbHNlOyAqKVxuKCogICAgICAgaWYgcHJpbnRfZGVzYyB0aGVuIFByaW50Zi5wcmludGYgXCJcXG5cIiAqKVxuKCogICB8IF8gLT4gUHJpbnRmLnByaW50ZiBcIiVzT3RoZXIgY29yZV90eXBlXFxuXCIgaW5kZW50X3N0ciAqKVxuKCoqKVxuKCogbGV0IHJlYyBwcmludF9wYXR0ZXJuIChwYXR0ZXJuIDogUGFyc2V0cmVlLnBhdHRlcm4pIGluZGVudCA9ICopXG4oKiAgIGxldCBpbmRlbnRfc3RyID0gU3RyaW5nLm1ha2UgaW5kZW50ICcgJyBpbiAqKVxuKCogICBtYXRjaCBwYXR0ZXJuLnBwYXRfZGVzYyB3aXRoICopXG4oKiAgIHwgUGFyc2V0cmVlLlBwYXRfdmFyIGxvYyAtPiBQcmludGYucHJpbnRmIFwiJXNWYXI6ICVzXFxuXCIgaW5kZW50X3N0ciBsb2MudHh0ICopXG4oKiAgIHwgUGFyc2V0cmVlLlBwYXRfdHVwbGUgcGF0cyAtPiAqKVxuKCogICAgICAgUHJpbnRmLnByaW50ZiBcIiVzVHVwbGU6XFxuXCIgaW5kZW50X3N0cjsgKilcbigqICAgICAgIExpc3QuaXRlciAoZnVuIHBhdCAtPiBwcmludF9wYXR0ZXJuIHBhdCAoaW5kZW50ICsgMikpIHBhdHMgKilcbigqICAgfCBQYXJzZXRyZWUuUHBhdF9jb25zdHJhaW50IChwYXQsIGNvcmVfdHlwZSkgLT4gKilcbigqICAgICAgIFByaW50Zi5wcmludGYgXCIlc0NvbnN0cmFpbnQ6XFxuXCIgaW5kZW50X3N0cjsgKilcbigqICAgICAgIHByaW50X3BhdHRlcm4gcGF0IChpbmRlbnQgKyAyKTsgKilcbigqICAgICAgIHByaW50X2NvcmVfdHlwZSBjb3JlX3R5cGUgKGluZGVudCArIDIpIHRydWUgKilcbigqICAgfCBfIC0+IFByaW50Zi5wcmludGYgXCIlc090aGVyIHBhdHRlcm5cXG5cIiBpbmRlbnRfc3RyICopXG4oKiopXG4oKiAoKiBQcmludCB0aGUgZXhwcmVzc2lvbiB0cmVlLiAqKSAqKVxuKCogbGV0IHJlYyBwcmludF9leHByZXNzaW9uIChleHByIDogUGFyc2V0cmVlLmV4cHJlc3Npb24pIGluZGVudCA9ICopXG4oKiAgIGxldCBpbmRlbnRfc3RyID0gU3RyaW5nLm1ha2UgaW5kZW50ICcgJyBpbiAqKVxuKCogICBtYXRjaCBleHByLnBleHBfZGVzYyB3aXRoICopXG4oKiAgIHwgUGV4cF9pZGVudCB7IHR4dCA9IExvbmdpZGVudC5MaWRlbnQgaWQ7IF8gfSAtPiAqKVxuKCogICAgICAgUHJpbnRmLnByaW50ZiBcIiVzSWRlbnRpZmllcjogJXNcXG5cIiBpbmRlbnRfc3RyIGlkICopXG4oKiAgIHwgUGV4cF9jb25zdGFudCBjb25zdCAtPiAqKVxuKCogICAgICAgUHJpbnRmLnByaW50ZiBcIiVzQ29uc3RhbnQ6ICVzXFxuXCIgaW5kZW50X3N0ciAqKVxuKCogICAgICAgICAobWF0Y2ggY29uc3Qgd2l0aCAqKVxuKCogICAgICAgICB8IFBjb25zdF9pbnRlZ2VyIChuLCBfKSAtPiBuICopXG4oKiAgICAgICAgIHwgUGNvbnN0X3N0cmluZyAocywgXywgXykgLT4gXCJcXFwiXCIgXiBzIF4gXCJcXFwiXCIgKilcbigqICAgICAgICAgfCBQY29uc3RfZmxvYXQgKGYsIF8pIC0+IGYgKilcbigqICAgICAgICAgfCBQY29uc3RfY2hhciBjIC0+IFN0cmluZy5tYWtlIDEgYykgKilcbigqICAgfCBQZXhwX2FwcGx5IChmdW5jLCBhcmdzKSAtPiAqKVxuKCogICAgICAgUHJpbnRmLnByaW50ZiBcIiVzQXBwbHk6XFxuXCIgaW5kZW50X3N0cjsgKilcbigqICAgICAgIHByaW50X2V4cHJlc3Npb24gZnVuYyAoaW5kZW50ICsgMik7ICopXG4oKiAgICAgICBMaXN0Lml0ZXIgKGZ1biAoXywgYXJnKSAtPiBwcmludF9leHByZXNzaW9uIGFyZyAoaW5kZW50ICsgMikpIGFyZ3MgKilcbigqICAgfCBQZXhwX3R1cGxlIGVsZW1lbnRzIC0+ICopXG4oKiAgICAgICBQcmludGYucHJpbnRmIFwiJXNUdXBsZTpcXG5cIiBpbmRlbnRfc3RyOyAqKVxuKCogICAgICAgTGlzdC5pdGVyIChmdW4gZWwgLT4gcHJpbnRfZXhwcmVzc2lvbiBlbCAoaW5kZW50ICsgMikpIGVsZW1lbnRzICopXG4oKiAgIHwgUGV4cF9mdW5jdGlvbiAocGFyYW1zLCByZXR0eXBlLCBfKSAtPiAoICopXG4oKiAgICAgICBQcmludGYucHJpbnRmIFwiJXNGdW5jdGlvbjpcXG5cIiBpbmRlbnRfc3RyOyAqKVxuKCogICAgICAgTGlzdC5pdGVyICopXG4oKiAgICAgICAgIChmdW4gKHBhcmFtIDogUGFyc2V0cmVlLmZ1bmN0aW9uX3BhcmFtKSAtPiAqKVxuKCogICAgICAgICAgIG1hdGNoIHBhcmFtLnBwYXJhbV9kZXNjIHdpdGggKilcbigqICAgICAgICAgICB8IFBwYXJhbV92YWwgKE5vbGFiZWwsIE5vbmUsIHBhdCkgLT4gKilcbigqICAgICAgICAgICAgICAgUHJpbnRmLnByaW50ZiBcIiVzICBQYXJhbXM6XFxuXCIgaW5kZW50X3N0cjsgKilcbigqICAgICAgICAgICAgICAgcHJpbnRfcGF0dGVybiBwYXQgKGluZGVudCArIDQpICopXG4oKiAgICAgICAgICAgfCBQcGFyYW1fbmV3dHlwZSBsb2MgLT4gKilcbigqICAgICAgICAgICAgICAgUHJpbnRmLnByaW50ZiBcIiVzTmV3dHlwZSBQYXJhbTogJXNcXG5cIiBpbmRlbnRfc3RyIGxvYy50eHQgKilcbigqICAgICAgICAgICB8IF8gLT4gUHJpbnRmLnByaW50ZiBcIiVzT3RoZXIgcGFyYW1zXFxuXCIgaW5kZW50X3N0cikgKilcbigqICAgICAgICAgcGFyYW1zOyAqKVxuKCogICAgICAgbWF0Y2ggcmV0dHlwZSB3aXRoICopXG4oKiAgICAgICB8IFNvbWUgcGNvbiAtPiAoICopXG4oKiAgICAgICAgICAgbWF0Y2ggcGNvbiB3aXRoICopXG4oKiAgICAgICAgICAgfCBQY29uc3RyYWludCByZXQgLT4gKilcbigqICAgICAgICAgICAgICAgUHJpbnRmLnByaW50ZiBcIiVzICBSZXR1cm46XFxuXCIgaW5kZW50X3N0cjsgKilcbigqICAgICAgICAgICAgICAgcHJpbnRfY29yZV90eXBlIHJldCAoaW5kZW50ICsgNCkgdHJ1ZSAqKVxuKCogICAgICAgICAgIHwgXyAtPiBQcmludGYucHJpbnRmIFwiJXNPdGhlciByZXR0eXBlXCIgaW5kZW50X3N0cikgKilcbigqICAgICAgIHwgXyAtPiBQcmludGYucHJpbnRmIFwiJXNPdGhlciB0eXBlX2NvbnN0cmFpbnRcXG5cIiBpbmRlbnRfc3RyKSAqKVxuKCogICB8IF8gLT4gUHJpbnRmLnByaW50ZiBcIiVzT3RoZXIgZXhwcmVzc2lvblxcblwiIGluZGVudF9zdHIgKilcbigqKilcbigqICgqIFByaW50IHRoZSBwYXJzZWQgc3RydWN0dXJlLiAqKSAqKVxuKCogbGV0IHByaW50X3N0cnVjdHVyZV9pdGVtIChpdGVtIDogUGFyc2V0cmVlLnN0cnVjdHVyZV9pdGVtKSBpbmRlbnQgPSAqKVxuKCogICBsZXQgaW5kZW50X3N0ciA9IFN0cmluZy5tYWtlIGluZGVudCAnICcgaW4gKilcbigqICAgbWF0Y2ggaXRlbS5wc3RyX2Rlc2Mgd2l0aCAqKVxuKCogICB8IFBzdHJfdmFsdWUgKHJlY19mbGFnLCBiaW5kaW5ncykgLT4gKilcbigqICAgICAgIFByaW50Zi5wcmludGYgXCIlc1ZhbHVlIGJpbmRpbmclczpcXG5cIiBpbmRlbnRfc3RyICopXG4oKiAgICAgICAgIChpZiByZWNfZmxhZyA9IFJlY3Vyc2l2ZSB0aGVuIFwiIChyZWN1cnNpdmUpXCIgZWxzZSBcIlwiKTsgKilcbigqICAgICAgIExpc3QuaXRlciAqKVxuKCogICAgICAgICAoZnVuICh2YiA6IFBhcnNldHJlZS52YWx1ZV9iaW5kaW5nKSAtPiAqKVxuKCogICAgICAgICAgIFByaW50Zi5wcmludGYgXCIlcyAgUGF0dGVybjogJXNcXG5cIiBpbmRlbnRfc3RyICopXG4oKiAgICAgICAgICAgICAoRm9ybWF0LmFzcHJpbnRmIFwiJWFcIiBQcHJpbnRhc3QucGF0dGVybiB2Yi5wdmJfcGF0KTsgKilcbigqICAgICAgICAgICBQcmludGYucHJpbnRmIFwiJXMgIEV4cHJlc3Npb246XFxuXCIgaW5kZW50X3N0cjsgKilcbigqICAgICAgICAgICBwcmludF9leHByZXNzaW9uIHZiLnB2Yl9leHByIChpbmRlbnQgKyA0KSkgKilcbigqICAgICAgICAgYmluZGluZ3MgKilcbigqICAgfCBQc3RyX3R5cGUgKF8sIHR5cGVfZGVjbHMpIC0+ICopXG4oKiAgICAgICBQcmludGYucHJpbnRmIFwiJXNUeXBlIGRlY2xhcmF0aW9uczpcXG5cIiBpbmRlbnRfc3RyOyAqKVxuKCogICAgICAgTGlzdC5pdGVyICopXG4oKiAgICAgICAgIChmdW4gKHRkIDogUGFyc2V0cmVlLnR5cGVfZGVjbGFyYXRpb24pIC0+ICopXG4oKiAgICAgICAgICAgUHJpbnRmLnByaW50ZiBcIiVzICBUeXBlIG5hbWU6ICVzXFxuXCIgaW5kZW50X3N0ciB0ZC5wdHlwZV9uYW1lLnR4dDsgKilcbigqICAgICAgICAgICBtYXRjaCB0ZC5wdHlwZV9raW5kIHdpdGggKilcbigqICAgICAgICAgICB8IFB0eXBlX3ZhcmlhbnQgY3Rvcl9kZWNscyAtPiAqKVxuKCogICAgICAgICAgICAgICBMaXN0Lml0ZXIgKilcbigqICAgICAgICAgICAgICAgICAoZnVuIChjdG9yIDogUGFyc2V0cmVlLmNvbnN0cnVjdG9yX2RlY2xhcmF0aW9uKSAtPiAqKVxuKCogICAgICAgICAgICAgICAgICAgUHJpbnRmLnByaW50ZiBcIiVzICBDb25zdHJ1Y3RvciBuYW1lOiAlc1wiIGluZGVudF9zdHIgKilcbigqICAgICAgICAgICAgICAgICAgICAgY3Rvci5wY2RfbmFtZS50eHQ7ICopXG4oKiAgICAgICAgICAgICAgICAgICBtYXRjaCBjdG9yLnBjZF9hcmdzIHdpdGggKilcbigqICAgICAgICAgICAgICAgICAgIHwgUGFyc2V0cmVlLlBjc3RyX3R1cGxlIGNvcmVfdHlwZXMgLT4gKilcbigqICAgICAgICAgICAgICAgICAgICAgICBpZiBMaXN0Lmxlbmd0aCBjb3JlX3R5cGVzID0gMCB0aGVuIHByaW50X3N0cmluZyBcIlxcblwiICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgZWxzZSAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgTGlzdC5pdGVyICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgIChmdW4gKGNvcmVfdHlwZSA6IFBhcnNldHJlZS5jb3JlX3R5cGUpIC0+ICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggY29yZV90eXBlLnB0eXBfZGVzYyB3aXRoICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQdHlwX2NvbnN0ciAoeyB0eHQgPSBMb25naWRlbnQuTGlkZW50IGlkOyBfIH0sIF8pICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludGYucHJpbnRmIFwiJXMgb2YgJXNcXG5cIiBpbmRlbnRfc3RyIGlkICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBfIC0+ICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50Zi5wcmludGYgXCIlc090aGVyIHN0cnVjdHVyZSBpdGVtXFxuXCIgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnRfc3RyKSAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlX3R5cGVzICopXG4oKiAgICAgICAgICAgICAgICAgICB8IF8gLT4gUHJpbnRmLnByaW50ZiBcIiVzT3RoZXIgc3RydWN0dXJlIGl0ZW1cXG5cIiBpbmRlbnRfc3RyKSAqKVxuKCogICAgICAgICAgICAgICAgIGN0b3JfZGVjbHMgKilcbigqICAgICAgICAgICB8IF8gLT4gUHJpbnRmLnByaW50ZiBcIiVzT3RoZXIgc3RydWN0dXJlIGl0ZW1cXG5cIiBpbmRlbnRfc3RyKSAqKVxuKCogICAgICAgICB0eXBlX2RlY2xzICopXG4oKiAgIHwgXyAtPiBQcmludGYucHJpbnRmIFwiJXNPdGhlciBzdHJ1Y3R1cmUgaXRlbVxcblwiIGluZGVudF9zdHIgKilcbigqKilcbigqICgqIFByaW50IHRoZSBzdHJ1Y3R1cmUuICopICopXG4oKiBsZXQgcHJpbnRfc3RydWN0dXJlIHN0cnVjdHVyZSA9ICopXG4oKiAgIExpc3QuaXRlciAoZnVuIGl0ZW0gLT4gcHJpbnRfc3RydWN0dXJlX2l0ZW0gaXRlbSAwKSBzdHJ1Y3R1cmUgKilcblxuKCogRnVuY3Rpb24gdG8gcHJpbnQgdGhlIHBhcnNlZCBzdHJ1Y3R1cmUgKilcbigqIGxldCBwcmludF90eXBlZGVjbF90cmVlICh0eXBlZGVjbCA6IFBhcnNldHJlZS50eXBlX2RlY2xhcmF0aW9uKSAoaW5kZW50IDogaW50KSA9ICopXG4oKiAgIGxldCBpbmRlbnRfc3RyID0gU3RyaW5nLm1ha2UgaW5kZW50ICcgJyBpbiAqKVxuKCogICBtYXRjaCB0eXBlZGVjbC5wdHlwZV9raW5kIHdpdGggKilcbigqICAgfCBQdHlwZV92YXJpYW50IGN0b3JfZGVjbHMgLT4gKilcbigqICAgICAgIHByaW50X2ludCAoTGlzdC5sZW5ndGggY3Rvcl9kZWNscyk7ICopXG4oKiAgICAgICBwcmludF9zdHJpbmcgaW5kZW50X3N0ciAqKVxuKCogICB8IF8gLT4gUHJpbnRmLnByaW50ZiBcIiVzT3RoZXIgZXhwcmVzc2lvbiB0eXBlXFxuXCIgaW5kZW50X3N0ciAqKVxuKCoqKVxuKCogbGV0IHByaW50X3R5cGVkZWNsIHR5cGVkZWNsID0gcHJpbnRfdHlwZWRlY2xfdHJlZSB0eXBlZGVjbCAwICopXG5cbigqIEZ1bmN0aW9uIHRvIHByaW50IHRoZSBwYXJzZWQgZXhwcmVzc2lvbiAqKVxuKCogbGV0IHByaW50X2V4cHJlc3Npb24gZXhwciA9IHByaW50X2V4cHJlc3Npb25fdHJlZSBleHByIDAgKilcblxuKCogbGV0IHJlYWRfZmlsZSBmaWxlbmFtZSA9ICopXG4oKiAgIGxldCBjaCA9IG9wZW5faW5fYmluIGZpbGVuYW1lIGluICopXG4oKiAgIGxldCBzID0gcmVhbGx5X2lucHV0X3N0cmluZyBjaCAoaW5fY2hhbm5lbF9sZW5ndGggY2gpIGluICopXG4oKiAgIGNsb3NlX2luIGNoOyAqKVxuKCogICBzICopXG5sZXQgcmVjIHN0cmluZ19vZl90eXBlICh0eXAgOiBQYXJzZXRyZWUuY29yZV90eXBlKSA6IHN0cmluZyA9XG4gIG1hdGNoIHR5cC5wdHlwX2Rlc2Mgd2l0aFxuICB8IFB0eXBfYXJyb3cgKF8sIHQxLCB0MikgLT5cbiAgICAgIGxldCBhcmcxID0gc3RyaW5nX29mX3R5cGUgdDEgaW5cbiAgICAgIGxldCBhcmcyID0gc3RyaW5nX29mX3R5cGUgdDIgaW5cbiAgICAgIGFyZzEgXiBcIiAtPiBcIiBeIGFyZzJcbiAgfCBQdHlwX3R1cGxlIHR5cGVzIC0+XG4gICAgICBsZXQgdHlwZV9zdHJpbmdzID0gTGlzdC5tYXAgc3RyaW5nX29mX3R5cGUgdHlwZXMgaW5cbiAgICAgIFN0cmluZy5jb25jYXQgXCIgKiBcIiB0eXBlX3N0cmluZ3NcbiAgfCBQdHlwX2NvbnN0ciAoeyB0eHQgPSBMaWRlbnQgczsgXyB9LCBbXSkgLT4gc1xuICB8IFB0eXBfY29uc3RyICh7IHR4dCA9IExpZGVudCBzOyBfIH0sIGN0eXBfbGlzdCkgLT5cbiAgICAgIGxldCBhcmdzX3N0ciA9IExpc3QubWFwIHN0cmluZ19vZl90eXBlIGN0eXBfbGlzdCB8PiBTdHJpbmcuY29uY2F0IFwiLCBcIiBpblxuICAgICAgYXJnc19zdHIgXiBcIiBcIiBeIHNcbiAgfCBfIC0+IFwidW5rbm93blwiXG5cbmxldCByZWMgZXh0cmFjdF9jb3JlX3R5cGUgKGN0eXAgOiBQYXJzZXRyZWUuY29yZV90eXBlKSAoY29tcG9uZW50c19vbmx5IDogYm9vbClcbiAgICA9XG4gIGlmIGNvbXBvbmVudHNfb25seSB0aGVuIChcbiAgICBtYXRjaCBjdHlwLnB0eXBfZGVzYyB3aXRoXG4gICAgfCBQdHlwX2Fycm93IChfLCBhcmd0eXAsIHJldHR5cCkgLT5cbiAgICAgICAgWyBcIlB0eXBfYXJyb3dcIjsgc3RyaW5nX29mX3R5cGUgYXJndHlwOyBzdHJpbmdfb2ZfdHlwZSByZXR0eXAgXVxuICAgIHwgUHR5cF90dXBsZSB0eXBlcyAtPlxuICAgICAgICBcIlB0eXBfdHVwbGVcIlxuICAgICAgICA6OiBMaXN0LmZvbGRfcmlnaHQgKGZ1biBjdXJyIGFjYyAtPiBzdHJpbmdfb2ZfdHlwZSBjdXJyIDo6IGFjYykgdHlwZXMgW11cbiAgICB8IFB0eXBfY29uc3RyICh7IHR4dCA9IExpZGVudCBpZDsgXyB9LCBbXSkgLT4gWyBcIlB0eXBfY29uc3RyXCI7IGlkIF1cbiAgICB8IFB0eXBfY29uc3RyICh7IHR4dCA9IExpZGVudCBpZDsgXyB9LCBbIGN0eXBzIF0pIC0+XG4gICAgICAgIFsgXCJQdHlwX2NvbnN0clwiOyBzdHJpbmdfb2ZfdHlwZSBjdHlwczsgaWQgXVxuICAgIHwgXyAtPlxuICAgICAgICBQcmludGYucHJpbnRmIFwiT3RoZXIgY29yZSB0eXBlXCI7XG4gICAgICAgIFsgXCJPdGhlciBjb3JlIHR5cGVcIiBdKVxuICBlbHNlXG4gICAgbWF0Y2ggY3R5cC5wdHlwX2Rlc2Mgd2l0aFxuICAgIHwgUHR5cF9hcnJvdyAoXywgXywgcmV0dHlwKSAtPlxuICAgICAgICBzdHJpbmdfb2ZfdHlwZSBjdHlwIDo6IGV4dHJhY3RfY29yZV90eXBlIHJldHR5cCBjb21wb25lbnRzX29ubHlcbiAgICB8IFB0eXBfdHVwbGUgdHlwZXMgLT5cbiAgICAgICAgTGlzdC5mb2xkX2xlZnRcbiAgICAgICAgICAoZnVuIGFjYyBjdXJyIC0+XG4gICAgICAgICAgICBMaXN0LmFwcGVuZCAoZXh0cmFjdF9jb3JlX3R5cGUgY3VyciBjb21wb25lbnRzX29ubHkpIGFjYylcbiAgICAgICAgICBbXSB0eXBlc1xuICAgIHwgUHR5cF9jb25zdHIgKHsgdHh0ID0gTGlkZW50IGlkOyBfIH0sIFtdKSAtPiBpZCA6OiBbXVxuICAgIHwgUHR5cF9jb25zdHIgKHsgdHh0ID0gTGlkZW50IGlkOyBfIH0sIFsgY3R5cHMgXSkgLT5cbiAgICAgICAgWyBzdHJpbmdfb2ZfdHlwZSBjdHlwcyBeIFwiIFwiIF4gaWQgXVxuICAgIHwgXyAtPlxuICAgICAgICBQcmludGYucHJpbnRmIFwiT3RoZXIgY29yZSB0eXBlXCI7XG4gICAgICAgIFtdXG5cbigqIFNhdmUgdGhpcyBmb3IgbGF0ZXIgd2hlbiB3ZSBhY3R1YWxseSBuZWVkIHRvIGdldCB0aGUgY29uc3RydWN0b3JzICopXG4oKiBsZXQgYW5hbHl6ZV9zdHJ1Y3R1cmUgKHN0cnVjdHVyZSA6IFBhcnNldHJlZS5zdHJ1Y3R1cmUpID0gKilcbigqIExpc3QuaXRlciAqKVxuKCogICAoZnVuIChpdGVtIDogUGFyc2V0cmVlLnN0cnVjdHVyZV9pdGVtKSAtPiAqKVxuKCogICAgIG1hdGNoIGl0ZW0ucHN0cl9kZXNjIHdpdGggKilcbigqICAgICB8IFBzdHJfdHlwZSAoXywgdHlwZV9kZWNscykgLT4gKilcbigqICAgICAgICAgTGlzdC5pdGVyICopXG4oKiAgICAgICAgICAgKGZ1biAodGQgOiBQYXJzZXRyZWUudHlwZV9kZWNsYXJhdGlvbikgLT4gKilcbigqICAgICAgICAgICAgICgqIFByaW50Zi5wcmludGYgXCJUeXBlOiAlc1xcblwiIHRkLnB0eXBlX25hbWUudHh0OyAqKSAqKVxuKCogICAgICAgICAgICAgbWF0Y2ggdGQucHR5cGVfa2luZCB3aXRoICopXG4oKiAgICAgICAgICAgICB8IFB0eXBlX3ZhcmlhbnQgY3RvcnMgLT4gKilcbigqICAgICAgICAgICAgICAgICBMaXN0Lml0ZXIgKilcbigqICAgICAgICAgICAgICAgICAgIChmdW4gKGN0b3IgOiBQYXJzZXRyZWUuY29uc3RydWN0b3JfZGVjbGFyYXRpb24pIC0+ICopXG4oKiAgICAgICAgICAgICAgICAgICAgIFByaW50Zi5wcmludGYgXCIgIENvbnN0cnVjdG9yOiAlc1xcblwiIGN0b3IucGNkX25hbWUudHh0KSAqKVxuKCogICAgICAgICAgICAgICAgICAgY3RvcnMgKilcbigqICAgICAgICAgICAgIHwgXyAtPiBQcmludGYucHJpbnRmIFwiT3RoZXIgdHlwZSBraW5kXFxuXCIpICopXG4oKiAgICAgICAgICAgdHlwZV9kZWNscyAqKVxuKCogICAgIHwgXyAtPiBQcmludGYucHJpbnRmIFwiTm90IGEgdHlwZSBkZWNsYXJhdGlvblxcblwiKSAqKVxuKCogICBzdHJ1Y3R1cmU7ICopXG5cbmxldCBwYXJzZV9jb3JlX3R5cGVfZnJvbV90eXBlX3NwYW4gcyA9XG4gIGxldCBsZXhidWYgPSBMZXhpbmcuZnJvbV9zdHJpbmcgcyBpblxuICB0cnkgU29tZSAoUGFyc2UuY29yZV90eXBlIGxleGJ1Zikgd2l0aCBfIC0+IE5vbmVcblxubGV0IHBhcnNlX2ltcGxlbWVudGF0aW9uX2Zyb21fdHlwZV9zcGFuIHMgPVxuICBsZXQgbGV4YnVmID0gTGV4aW5nLmZyb21fc3RyaW5nIChcInR5cGUgdG1wID0gXCIgXiBzKSBpblxuICB0cnkgU29tZSAoUGFyc2UuaW1wbGVtZW50YXRpb24gbGV4YnVmKSB3aXRoIF8gLT4gTm9uZVxuXG4oKiBXYWxrIHRoZSBBU1QgYW5kIGV4dHJhY11ddCB0YXJnZXQgdHlwZXMuICopXG5sZXQgZXh0cmFjdF90YXJnZXRfdHlwZXMgKHR5cGVfc3BhbiA6IHN0cmluZykgPVxuICBsZXQgcGFyc2VkID0gcGFyc2VfY29yZV90eXBlX2Zyb21fdHlwZV9zcGFuIHR5cGVfc3BhbiBpblxuICBtYXRjaCBwYXJzZWQgd2l0aFxuICB8IFNvbWUgY3R5cCAtPiBleHRyYWN0X2NvcmVfdHlwZSBjdHlwIGZhbHNlXG4gIHwgTm9uZSAtPiAoXG4gICAgICBsZXQgcGFyc2VkMiA9IHBhcnNlX2ltcGxlbWVudGF0aW9uX2Zyb21fdHlwZV9zcGFuIHR5cGVfc3BhbiBpblxuICAgICAgbWF0Y2ggcGFyc2VkMiB3aXRoXG4gICAgICAoKiB8IFNvbWUgaW1wbCAtPiBhbmFseXplX3N0cnVjdHVyZSBpbXBsICopXG4gICAgICB8IFNvbWUgXyAtPiBbIHR5cGVfc3BhbiBdXG4gICAgICB8IE5vbmUgLT4gZmFpbHdpdGggXCJGYWlsZWQgdG8gcGFyc2UgdHlwZSBzcGFuXCIpXG5cbigqIHByaW50X2VuZGxpbmUgXCJTdHJ1Y3R1cmUgcGFyc2VkIHN1Y2Nlc3NmdWxseSFcIjsgKilcbigqIGV4dHJhY3RfY29yZV90eXBlIHBhcnNlZCBmYWxzZSAqKVxuXG5sZXQgZXh0cmFjdF9jb21wb25lbnRfdHlwZXMgKHR5cGVfc3BhbiA6IHN0cmluZykgPVxuICBsZXQgcGFyc2VkID0gcGFyc2VfY29yZV90eXBlX2Zyb21fdHlwZV9zcGFuIHR5cGVfc3BhbiBpblxuICBtYXRjaCBwYXJzZWQgd2l0aFxuICB8IFNvbWUgY3R5cCAtPiBleHRyYWN0X2NvcmVfdHlwZSBjdHlwIHRydWVcbiAgfCBOb25lIC0+IChcbiAgICAgIGxldCBwYXJzZWQyID0gcGFyc2VfaW1wbGVtZW50YXRpb25fZnJvbV90eXBlX3NwYW4gdHlwZV9zcGFuIGluXG4gICAgICBtYXRjaCBwYXJzZWQyIHdpdGhcbiAgICAgICgqIHwgU29tZSBpbXBsIC0+IGFuYWx5emVfc3RydWN0dXJlIGltcGwgKilcbiAgICAgIHwgU29tZSBfIC0+IFsgdHlwZV9zcGFuIF1cbiAgICAgIHwgTm9uZSAtPiBmYWlsd2l0aCBcIkZhaWxlZCB0byBwYXJzZSB0eXBlIHNwYW5cIilcblxubGV0IGpzX2V4dHJhY3RfdGFyZ2V0X3R5cGVzICh0eXBlX3NwYW4gOiBzdHJpbmcpID1cbiAgbGV0IGV4dHJhY3RlZCA9IGV4dHJhY3RfdGFyZ2V0X3R5cGVzIHR5cGVfc3BhbiBpblxuICBKcy5hcnJheSAoQXJyYXkub2ZfbGlzdCBleHRyYWN0ZWQpXG5cbigqIFdoYXQgZG8gd2Ugd2FudD8gdG9kbyAtPiBtb2RlbCAqIGludCB3b3VsZCB5aWVsZCB0b2RvLCBtb2RlbCAqIGludCAqKVxuKCogbW9kZWwgKiBpbnQgKiBzdHJpbmcgd291bGQgeWllbGQgbW9kZWwsIGludCwgc3RyaW5nICopXG5sZXQganNfZXh0cmFjdF9jb21wb25lbnRfdHlwZXMgKHR5cGVfc3BhbiA6IHN0cmluZykgPVxuICBsZXQgZXh0cmFjdGVkID0gZXh0cmFjdF9jb21wb25lbnRfdHlwZXMgdHlwZV9zcGFuIGluXG4gIEpzLmFycmF5IChBcnJheS5vZl9saXN0IGV4dHJhY3RlZClcblxuKCogRXhhbXBsZSB1c2FnZSAqKVxuKCogbGV0ICgpID0gKilcbigqICAgKCogVE9ETzogSG93IGRvIHdlIGV4dHJhY3QgdGhpcyB0eXBlIHNwYW4gc3RyaW5nPyAqKSAqKVxuKCogICBsZXQgc3RycyA9ICopXG4oKiAgICAgWyAqKVxuKCogICAgICAgXCJ0b2RvICogdG9kbyAtPiBib29sXCI7ICopXG4oKiAgICAgICBcIm1vZGVsICogbW9kZWwgLT4gYm9vbFwiOyAqKVxuKCogICAgICAgXCJtb2RlbFwiOyAqKVxuKCogICAgICAgXCJtb2RlbCAtPiB0b2RvIGxpc3RcIjsgKilcbigqICAgICAgIFwiaW50ICogdG9kbyBsaXN0IC0+IHRvZG8gbGlzdFwiOyAqKVxuKCogICAgICAgXCJpbnQgKiB0b2RvIGxpc3QgLT4gdG9kbyBsaXN0ICogYm9vbFwiOyAqKVxuKCogICAgICAgXCJpbnQgKiB0b2RvIGxpc3QgLT4gKCh0b2RvICogYWN0aW9uKSAqIChzdHJpbmcgLT4gYm9vbCkpXCI7ICopXG4oKiAgICAgICBcImlkIGxpc3QgKiBwbGF5bGlzdF9zdGF0ZVwiOyAqKVxuKCogICAgICAgXCJQbGF5aW5nIG9mIGlkIHwgUGF1c2VkT24gb2YgaWQgfCBOb1NvbmdTZWxlY3RlZFwiOyAqKVxuKCogICAgIF0gKilcbigqICAgaW4gKilcbigqICAgKCogbGV0IHN0ciA9ICopICopXG4oKiAgICgqICAgcmVhZF9maWxlICopICopXG4oKiAgICgqICAgICBcIi9ob21lL2phY29iL3Byb2plY3RzL2NvbnRleHQtZXh0cmFjdG9yL3RhcmdldHMvb2NhbWwvdG9kby9wcmVsdWRlLm1sXCIgKikgKilcbigqICAgKCogaW4gKikgKilcbigqICAgTGlzdC5pdGVyICopXG4oKiAgICAgKGZ1biBzdHIgLT4gKilcbigqICAgICAgIExpc3QuaXRlciAqKVxuKCogICAgICAgICAoZnVuIGVsIC0+ICopXG4oKiAgICAgICAgICAgcHJpbnRfc3RyaW5nIGVsOyAqKVxuKCogICAgICAgICAgIHByaW50X2VuZGxpbmUgXCIgOyBcIikgKilcbigqICAgICAgICAgKGV4dHJhY3RfdGFyZ2V0X3R5cGVzIHN0cikpICopXG4oKiAgICAgc3RycyAqKVxuXG5sZXQgXyA9IEpzLmV4cG9ydCBcInBhcnNlXCIgKEpzLndyYXBfY2FsbGJhY2sganNfZXh0cmFjdF90YXJnZXRfdHlwZXMpXG5sZXQgXyA9IEpzLmV4cG9ydCBcImdldENvbXBvbmVudHNcIiAoSnMud3JhcF9jYWxsYmFjayBqc19leHRyYWN0X2NvbXBvbmVudF90eXBlcylcblxuKCogbWF0Y2ggcGFyc2VfZnJvbV9zdHJpbmcgc3RyIHdpdGggKilcbigqIHwgU29tZSBwYXJzZWRfc3RyIC0+ICopXG4oKiAgICAgcHJpbnRfZW5kbGluZSBcIlN0cnVjdHVyZSBwYXJzZWQgc3VjY2Vzc2Z1bGx5IVwiOyAqKVxuKCogICAgIHByaW50X3N0cnVjdHVyZSBwYXJzZWRfc3RyICopXG4oKiB8IE5vbmUgLT4gcHJpbnRfZW5kbGluZSBcIkZhaWxlZCB0byBwYXJzZSBzdHJ1Y3R1cmUuXCIgKilcbiJdfQ==