-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.html
1159 lines (1094 loc) · 906 KB
/
main.html
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
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head>
<meta charset="utf-8">
<meta name="generator" content="quarto-1.5.57">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
<title>quarto-inputf33afa8f516b447c</title>
<style>
code{white-space: pre-wrap;}
span.smallcaps{font-variant: small-caps;}
div.columns{display: flex; gap: min(4vw, 1.5em);}
div.column{flex: auto; overflow-x: auto;}
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
ul.task-list{list-style: none;}
ul.task-list li input[type="checkbox"] {
width: 0.8em;
margin: 0 0.8em 0.2em -1em; /* quarto-specific, see https://github.com/quarto-dev/quarto-cli/issues/4556 */
vertical-align: middle;
}
</style>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js" integrity="sha512-bLT0Qm9VnAYZDflyKcBaQ2gg0hSYNQrJ8RilYldYQ1FxQYoCLtUjuuRuZo+fjqhx/qtq/1itJ0C2ejDxltZVFg==" crossorigin="anonymous"></script><script src="main_files/libs/clipboard/clipboard.min.js"></script>
<script src="main_files/libs/quarto-html/quarto.js"></script>
<script src="main_files/libs/quarto-html/popper.min.js"></script>
<script src="main_files/libs/quarto-html/tippy.umd.min.js"></script>
<script src="main_files/libs/quarto-html/anchor.min.js"></script>
<link href="main_files/libs/quarto-html/tippy.css" rel="stylesheet">
<link href="main_files/libs/quarto-html/quarto-syntax-highlighting.css" rel="stylesheet" id="quarto-text-highlighting-styles">
<script src="main_files/libs/bootstrap/bootstrap.min.js"></script>
<link href="main_files/libs/bootstrap/bootstrap-icons.css" rel="stylesheet">
<link href="main_files/libs/bootstrap/bootstrap.min.css" rel="stylesheet" id="quarto-bootstrap" data-mode="light">
<script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" integrity="sha512-c3Nl8+7g4LMSTdrm621y7kf9v3SDPnhxLNhcjFJbKECVnmZHTdo+IRO05sNLTH/D3vA6u1X32ehoLC7WFVdheg==" crossorigin="anonymous"></script>
<script type="application/javascript">define('jquery', [],function() {return window.jQuery;})</script>
<script type="text/javascript">
window.PlotlyConfig = {MathJaxConfig: 'local'};
if (window.MathJax && window.MathJax.Hub && window.MathJax.Hub.Config) {window.MathJax.Hub.Config({SVG: {font: "STIX-Web"}});}
if (typeof require !== 'undefined') {
require.undef("plotly");
requirejs.config({
paths: {
'plotly': ['https://cdn.plot.ly/plotly-2.35.2.min']
}
});
require(['plotly'], function(Plotly) {
window._Plotly = Plotly;
});
}
</script>
</head>
<body>
<div id="quarto-content" class="page-columns page-rows-contents page-layout-article">
<div id="quarto-margin-sidebar" class="sidebar margin-sidebar">
<nav id="TOC" role="doc-toc" class="toc-active">
<h2 id="toc-title">Table of contents</h2>
<ul>
<li><a href="#the-spezi-project" id="toc-the-spezi-project" class="nav-link active" data-scroll-target="#the-spezi-project">The Spezi Project</a>
<ul class="collapse">
<li><a href="#spezi-cola-database" id="toc-spezi-cola-database" class="nav-link" data-scroll-target="#spezi-cola-database">Spezi & Cola Database</a></li>
<li><a href="#values" id="toc-values" class="nav-link" data-scroll-target="#values">Values</a>
<ul class="collapse">
<li><a href="#rating" id="toc-rating" class="nav-link" data-scroll-target="#rating">Rating</a></li>
</ul></li>
<li><a href="#top-spezi" id="toc-top-spezi" class="nav-link" data-scroll-target="#top-spezi">Top Spezi</a></li>
<li><a href="#correlations" id="toc-correlations" class="nav-link" data-scroll-target="#correlations">Correlations</a>
<ul class="collapse">
<li><a href="#sweetness-sugar-correlation" id="toc-sweetness-sugar-correlation" class="nav-link" data-scroll-target="#sweetness-sugar-correlation">Sweetness / Sugar Correlation</a></li>
<li><a href="#sweetness-fruitiness-correlation" id="toc-sweetness-fruitiness-correlation" class="nav-link" data-scroll-target="#sweetness-fruitiness-correlation">Sweetness / Fruitiness Correlation</a></li>
<li><a href="#individual-ratings" id="toc-individual-ratings" class="nav-link" data-scroll-target="#individual-ratings">Individual Ratings</a></li>
</ul></li>
</ul></li>
<li><a href="#confirmed-missing" id="toc-confirmed-missing" class="nav-link" data-scroll-target="#confirmed-missing">Confirmed Missing</a>
<ul class="collapse">
<li><a href="#spezi" id="toc-spezi" class="nav-link" data-scroll-target="#spezi">Spezi</a></li>
<li><a href="#cola" id="toc-cola" class="nav-link" data-scroll-target="#cola">Cola</a></li>
</ul></li>
<li><a href="#changelog" id="toc-changelog" class="nav-link" data-scroll-target="#changelog">Changelog</a></li>
</ul>
</nav>
</div>
<main class="content" id="quarto-document-content">
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="./the-spezi-project.png" class="img-fluid quarto-figure quarto-figure-center figure-img" style="width:50.0%"></p>
</figure>
</div>
<section id="the-spezi-project" class="level1">
<h1>The Spezi Project</h1>
<p>A completely subjective test of different Spezi and Cola brands that I got my hands on. Let me know if one is missing!</p>
<div id="51689f18" class="cell" data-execution_count="2">
<div class="cell-output cell-output-display">
<div> <div id="7d6833b0-3687-4ad7-8cef-a8896ee84607" class="plotly-graph-div" style="height:525px; width:100%;"></div> <script type="text/javascript"> require(["plotly"], function(Plotly) { window.PLOTLYENV=window.PLOTLYENV || {}; if (document.getElementById("7d6833b0-3687-4ad7-8cef-a8896ee84607")) { Plotly.newPlot( "7d6833b0-3687-4ad7-8cef-a8896ee84607", [{"customdata":[[4,"Adelholzener Alpenquellen GmbH"],[2,"Almdudler"],[3,"alwa Mineralbrunnen GmbH"],[2,"Auerbr\u00e4u GmbH"],[3,"Bad Brambacher Mineralquellen GmbH"],[2,"Privatbrauerei Schimpfle"],[2,"Brunnthaler Mineralbrunnen Brassler oHG"],[2,"Hohenthanner Schlossbrauerei"],[1,"Vereinigte Mineralbrunnen Verwaltungs GmbH"],[4,"Privatbrauerei Eichbaum GmbH & Co. KG"],[5,"Eizbach Getr\u00e4nke GmbH"],[3,"Mineral-Heilquellen GmbH"],[2,"Feldschl\u00f6\u00dfchen AG"],[3,"Privatbrauerei Ustersbach KG"],[5,"Fl\u00f6tzinger Br\u00e4u"],[3,"Franken Brunnen GmbH & Co. KG"],[3,"MEG Wei\u00dfenfels GmbH"],[4,"Privat-Brauerei Hohenfelde GmbH"],[4,"KUNZMANN Weinkellerei"],[4,"Giesinger Biermanufaktur & Spezialit\u00e4ten Braugesellschaft mbH"],[1,"Oettinger Brauerei GmbH"],[3,"Privatbrauerei Rothenbach"],[2,"EDEKA AG"],[3,"G\u00fcnther-Br\u00e4u GmbH"],[2,"Brunnenverwaltung Hoellensprudel"],[3,"Trinks S\u00fcd GmbH"],[3,"Hansa-Heemann AG"],[2,"Kaufland"],[3,"Krombacher Brauerei"],[3,"Brauerei zum Kuchlbauer GmbH & Co. KG"],[3,"Getr\u00e4nke Hausler GmbH"],[2,"Potts Brauerei"],[4,"Landbrauerei Ludwig Erl"],[3,"Brauhaus Leikeim"],[3,"Getr\u00e4nkehaus Pl\u00f6chl GmbH & Co.KG"],[3,"Brauerei Maisach GmbH"],[2,"The Coca-Cola Company"],[2,"The Coca-Cola Company"],[3,"fritz-kulturg\u00fcter gmbh"],[2,"Schlo\u00dfbrauerei Reckendorf"],[3,"Neumarkter Lammsbr\u00e4u"],[4,"Otto Pachmayr Erfrischungsgetr\u00e4nke GmbH"],[4,"Paul Anderl GmbH"],[4,"Paul Anderl GmbH"],[4,"Paulaner Brauerei Gruppe GmbH & Co. KGaA"],[3,"Paulaner Brauerei Gruppe GmbH & Co. KGaA"],[3,"Hansa-Heemann AG"],[1,"Hansa-Heemann AG"],[2,"Siegsdorfer Petrusquelle GmbH"],[3,"Brauerei Poellinger GmbH & Co. KG"],[3,"PepsiCo Deutschland GmbH"],[4,"Deutsche Sinalco GmbH"],[5,"Brauhaus Riegele"],[2,"GET-Kooperationspartner GmbH"],[2,"Mineralbrunnen Teinach GmbH"],[2,"F\u00fcrstlich Bissinger Auerquelle GmbH & Co. KG"],[3,"Brauerei C. Wittmann oHG"]],"hovertemplate":"\u003cb\u003e%{hovertext}\u003c\u002fb\u003e\u003cbr\u003e\u003cbr\u003elat=%{lat}\u003cbr\u003elong=%{lon}\u003cbr\u003eRating=%{customdata[0]}\u003cbr\u003eManufacturer=%{customdata[1]}\u003cextra\u003e\u003c\u002fextra\u003e","hovertext":["Adelholzener Cola Mix","Almdudler Spezi","alwa Limo Cola-Mix","Auer Br\u00e4u Cola Mix","Bad Brambacher Cola Mix","Bazi Cola-Mix","Brunnthaler Brunnen Cola-Mix","Cubanita Cola Mix","deit zuckerfrei Cola Mix","Eichbaum Braumeisters Cola-Mix","Eizbach Calypzo Orange & Cola","Ensinger Cola-Mix Limonade","Feldschl\u00f6\u00dfchen Mix","flumi Cola-Mix","Fl\u00f6tzinger Cola Mix","Franken Brunnen Mexi Cola Mix","Freeway Mixx Max","Frische Mische","Frucade Cola-Mix","Giesinger Kracherl Cola Mix","Glorietta Cola Mix","Gluggerla Cola-Mix","Gut und g\u00fcnstig Cola Mix","G\u00fcnni\u2019s Cola-Mix","Hoellen Sprudel Cubana","Hubauer Cola-Mix","ja! Cola-Mix","K-Classic Cola + Orange","Krombacher Spezi","Kuchlbauer Cola~Mix","Labertaler Spezial","Land L!mo","Landbrauerei Cola-Mix","Leikeim Cola-Mix","Libella Cola Mix","Maisacher Cola-Mix","Mezzo Mix","Mezzo Mix Zero","mischmasch ","Nawinta Cola-Mix","Now Orange Cola","Pali Cola Mix","Paul Anderl\u2019s Cola-Mix","Paul Anderl\u2019s Schwupp Cola-Mix","Paulaner Spezi","Paulaner Spezi Zero","Penny Cola Mix","Penny Cola Mix Zero","Petrusquelle Cola-Mix","P\u00f6llinger Cola Mix","Schwip Schwap","Sinalco Cola Mix","Spezi","sunfit Cola Mix","Teinacher Genuss Cola-Mix","VC Cola-Mix","XXL Limonade Cola Mix"],"lat":[47.81270986012518,null,48.955602657910006,47.85283377262999,50.23461573049112,48.33124868591981,48.698406202406616,48.65846178480279,49.99702833279913,49.496110560109145,48.15012088747128,48.968292721776535,51.01600432320822,48.31588736057756,47.85604555101825,49.58788439198117,51.19535864491068,51.792276515594224,48.39357421132855,48.19259933208099,48.957596522838735,49.88355567403234,53.6026248153398,50.13656188575778,50.36539874759844,48.26727429321914,53.643966451572446,49.17928715695621,50.99115232619812,48.81687964707285,48.82818167781848,51.81098351250184,48.82777788906098,50.124758248686526,48.916543562044495,48.21701425605438,52.69245522190986,52.69245522190986,53.54835410514133,50.02245514053136,49.28426599748721,48.0326911775788,48.02308238175476,48.02308238175476,48.17674815070871,48.17674815070871,53.643966451572446,53.643966451572446,47.81936757502257,48.65794119438894,50.04482296021824,51.52348966003287,48.36740243993363,48.55885465366366,48.68795050503167,48.71963244299501,48.52585813541628],"legendgroup":"","lon":[12.613221636473613,null,9.008670211386429,12.11593706823443,12.310889412907846,10.733698609111467,11.004818651773098,12.092083634079248,12.291342192553348,8.489984046729129,11.563869611313931,8.959291216648229,13.70830559691828,10.641356961816362,12.122195009529092,10.6227401483759,11.966840495643162,8.318962115218875,11.054739206906683,11.556843129846104,10.599260792368137,11.228239435520573,10.020243756289013,11.249058185393404,11.693415598882265,12.61172202227135,9.83922078437626,9.225034723502544,7.956457893602654,11.84275565696606,12.150078187202396,8.131769901175534,12.396026198677571,11.237660150562162,13.266580983584763,11.26352458011196,14.22042918527796,14.22042918527796,10.013956036849734,10.829658621298432,11.46086485963511,11.58811910715298,11.808907535396717,11.808907535396717,11.436520786667453,11.436520786667453,9.83922078437626,9.83922078437626,12.644312717371545,11.965391781621404,8.691164552538472,6.725791501055494,10.884821109379956,13.377447005441011,8.683956439968238,10.60937279212304,12.140251631013223],"marker":{"color":["#00CC96","#FECB52","#B6E880","#00CC96","#FECB52","#B6E880","#FECB52","#00CC96","#B6E880","#FECB52","#FECB52","#00CC96","#FECB52","#FECB52","#FECB52","#00CC96","#2CA02C","#00CC96","#FECB52","#EF553B","#B6E880","#B6E880","#EF553B","#EF553B","#00CC96","#2CA02C","#B6E880","#B6E880","#FECB52","#FECB52","#B6E880","#2CA02C","#B6E880","#B6E880","#B6E880","#B6E880","#00CC96","#00CC96","#FECB52","#B6E880","#00CC96","#00CC96","#00CC96","#FECB52","#EF553B","#B6E880","#EF553B","#B6E880","#FECB52","#B6E880","#B6E880","#FECB52","#FECB52","#B6E880","#FECB52","#B6E880","#00CC96","#B6E880","#FECB52","#B6E880","#B6E880","#B6E880","#FECB52","#00CC96","#B6E880","#B6E880","#B6E880","#FECB52","#FECB52","#B6E880","#B6E880","#B6E880","#FECB52","#EF553B","#B6E880","#FECB52","#00CC96","#00CC96","#00CC96","#00CC96","#B6E880","#EF553B","#B6E880","#EF553B","#2CA02C","#B6E880","#B6E880","#FECB52","#B6E880","#B6E880","#B6E880","#00CC96","#2CA02C","#00CC96","#FECB52","#FECB52","#FECB52","#00CC96","#EF553B","#FECB52","#B6E880","#B6E880","#B6E880"],"size":10},"mode":"markers","name":"","showlegend":false,"subplot":"map","type":"scattermap"}], {"template":{"data":{"histogram2dcontour":[{"type":"histogram2dcontour","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"choropleth":[{"type":"choropleth","colorbar":{"outlinewidth":0,"ticks":""}}],"histogram2d":[{"type":"histogram2d","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"heatmap":[{"type":"heatmap","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"heatmapgl":[{"type":"heatmapgl","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"contourcarpet":[{"type":"contourcarpet","colorbar":{"outlinewidth":0,"ticks":""}}],"contour":[{"type":"contour","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"surface":[{"type":"surface","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"mesh3d":[{"type":"mesh3d","colorbar":{"outlinewidth":0,"ticks":""}}],"scatter":[{"fillpattern":{"fillmode":"overlay","size":10,"solidity":0.2},"type":"scatter"}],"parcoords":[{"type":"parcoords","line":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatterpolargl":[{"type":"scatterpolargl","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"bar":[{"error_x":{"color":"#2a3f5f"},"error_y":{"color":"#2a3f5f"},"marker":{"line":{"color":"#E5ECF6","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"bar"}],"scattergeo":[{"type":"scattergeo","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatterpolar":[{"type":"scatterpolar","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"histogram":[{"marker":{"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"histogram"}],"scattergl":[{"type":"scattergl","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatter3d":[{"type":"scatter3d","line":{"colorbar":{"outlinewidth":0,"ticks":""}},"marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scattermapbox":[{"type":"scattermapbox","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatterternary":[{"type":"scatterternary","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scattercarpet":[{"type":"scattercarpet","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"carpet":[{"aaxis":{"endlinecolor":"#2a3f5f","gridcolor":"white","linecolor":"white","minorgridcolor":"white","startlinecolor":"#2a3f5f"},"baxis":{"endlinecolor":"#2a3f5f","gridcolor":"white","linecolor":"white","minorgridcolor":"white","startlinecolor":"#2a3f5f"},"type":"carpet"}],"table":[{"cells":{"fill":{"color":"#EBF0F8"},"line":{"color":"white"}},"header":{"fill":{"color":"#C8D4E3"},"line":{"color":"white"}},"type":"table"}],"barpolar":[{"marker":{"line":{"color":"#E5ECF6","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"barpolar"}],"pie":[{"automargin":true,"type":"pie"}]},"layout":{"autotypenumbers":"strict","colorway":["#636efa","#EF553B","#00cc96","#ab63fa","#FFA15A","#19d3f3","#FF6692","#B6E880","#FF97FF","#FECB52"],"font":{"color":"#2a3f5f"},"hovermode":"closest","hoverlabel":{"align":"left"},"paper_bgcolor":"white","plot_bgcolor":"#E5ECF6","polar":{"bgcolor":"#E5ECF6","angularaxis":{"gridcolor":"white","linecolor":"white","ticks":""},"radialaxis":{"gridcolor":"white","linecolor":"white","ticks":""}},"ternary":{"bgcolor":"#E5ECF6","aaxis":{"gridcolor":"white","linecolor":"white","ticks":""},"baxis":{"gridcolor":"white","linecolor":"white","ticks":""},"caxis":{"gridcolor":"white","linecolor":"white","ticks":""}},"coloraxis":{"colorbar":{"outlinewidth":0,"ticks":""}},"colorscale":{"sequential":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"sequentialminus":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"diverging":[[0,"#8e0152"],[0.1,"#c51b7d"],[0.2,"#de77ae"],[0.3,"#f1b6da"],[0.4,"#fde0ef"],[0.5,"#f7f7f7"],[0.6,"#e6f5d0"],[0.7,"#b8e186"],[0.8,"#7fbc41"],[0.9,"#4d9221"],[1,"#276419"]]},"xaxis":{"gridcolor":"white","linecolor":"white","ticks":"","title":{"standoff":15},"zerolinecolor":"white","automargin":true,"zerolinewidth":2},"yaxis":{"gridcolor":"white","linecolor":"white","ticks":"","title":{"standoff":15},"zerolinecolor":"white","automargin":true,"zerolinewidth":2},"scene":{"xaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white","gridwidth":2},"yaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white","gridwidth":2},"zaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white","gridwidth":2}},"shapedefaults":{"line":{"color":"#2a3f5f"}},"annotationdefaults":{"arrowcolor":"#2a3f5f","arrowhead":0,"arrowwidth":1},"geo":{"bgcolor":"white","landcolor":"#E5ECF6","subunitcolor":"white","showland":true,"showlakes":true,"lakecolor":"white"},"title":{"x":0.05},"mapbox":{"style":"light"},"margin":{"b":0,"l":0,"r":0,"t":30}}},"map":{"domain":{"x":[0.0,1.0],"y":[0.0,1.0]},"center":{"lat":50.9566626954365,"lon":9.891571267180636},"zoom":4.7,"style":"carto-positron-nolabels"},"legend":{"tracegroupgap":0},"mapbox":{"center":{"lat":49.659646582021914,"lon":11.07343040258638},"zoom":8}}, {"staticPlot": true, "responsive": true} ).then(function(){
var gd = document.getElementById('7d6833b0-3687-4ad7-8cef-a8896ee84607');
var x = new MutationObserver(function (mutations, observer) {{
var display = window.getComputedStyle(gd).display;
if (!display || display === 'none') {{
console.log([gd, 'removed!']);
Plotly.purge(gd);
observer.disconnect();
}}
}});
// Listen for the removal of the full notebook cells
var notebookContainer = gd.closest('#notebook-container');
if (notebookContainer) {{
x.observe(notebookContainer, {childList: true});
}}
// Listen for the clearing of the current output cell
var outputEl = gd.closest('.output');
if (outputEl) {{
x.observe(outputEl, {childList: true});
}}
}) }; }); </script> </div>
</div>
</div>
<p>The map shows all Spezi locations as they are written on the bottle or can. In most cases this refers to the brewing location. Sometimes, especially for larger companies, it is different (eg. location of the distribution headquarters).</p>
<section id="spezi-cola-database" class="level2">
<h2 class="anchored" data-anchor-id="spezi-cola-database">Spezi & Cola Database</h2>
<div id="21dfcc0b" class="cell" data-execution_count="3">
<div class="cell-output cell-output-display">
<script>
let is_dark_theme = function () {
// Jupyter Lab
if ('jpThemeLight' in document.body.dataset)
return (document.body.dataset.jpThemeLight === "false");
// VS Code
if ('vscodeThemeKind' in document.body.dataset)
return document.body.dataset.vscodeThemeKind.includes('dark');
// Jupyter Book
if ('theme' in document.documentElement.dataset)
return document.documentElement.dataset.theme.includes('dark');
// Default
return window.matchMedia('(prefers-color-scheme: dark)').matches;
}
if (is_dark_theme()) {
document.documentElement.classList.add('dark');
}
else {
document.documentElement.classList.remove('dark');
}
</script>
</div>
<div class="cell-output cell-output-display">
<style>:root{--dt-row-selected: 13, 110, 253;--dt-row-selected-text: 255, 255, 255;--dt-row-selected-link: 9, 10, 11;--dt-row-stripe: 0, 0, 0;--dt-row-hover: 0, 0, 0;--dt-column-ordering: 0, 0, 0;--dt-html-background: white}:root.dark{--dt-html-background: rgb(33, 37, 41)}table.dataTable td.dt-control{text-align:center;cursor:pointer}table.dataTable td.dt-control:before{display:inline-block;box-sizing:border-box;content:"";border-top:5px solid transparent;border-left:10px solid rgba(0,0,0,.5);border-bottom:5px solid transparent;border-right:0px solid transparent}table.dataTable tr.dt-hasChild td.dt-control:before{border-top:10px solid rgba(0,0,0,.5);border-left:5px solid transparent;border-bottom:0px solid transparent;border-right:5px solid transparent}html.dark table.dataTable td.dt-control:before,:root[data-bs-theme=dark] table.dataTable td.dt-control:before,:root[data-theme=dark] table.dataTable td.dt-control:before{border-left-color:#ffffff80}html.dark table.dataTable tr.dt-hasChild td.dt-control:before,:root[data-bs-theme=dark] table.dataTable tr.dt-hasChild td.dt-control:before,:root[data-theme=dark] table.dataTable tr.dt-hasChild td.dt-control:before{border-top-color:#ffffff80;border-left-color:transparent}div.dt-scroll{width:100%}div.dt-scroll-body thead tr,div.dt-scroll-body tfoot tr{height:0}div.dt-scroll-body thead tr th,div.dt-scroll-body thead tr td,div.dt-scroll-body tfoot tr th,div.dt-scroll-body tfoot tr td{height:0!important;padding-top:0!important;padding-bottom:0!important;border-top-width:0px!important;border-bottom-width:0px!important}div.dt-scroll-body thead tr th div.dt-scroll-sizing,div.dt-scroll-body thead tr td div.dt-scroll-sizing,div.dt-scroll-body tfoot tr th div.dt-scroll-sizing,div.dt-scroll-body tfoot tr td div.dt-scroll-sizing{height:0!important;overflow:hidden!important}table.dataTable thead>tr>th.dt-orderable-asc span.dt-column-order:before,table.dataTable thead>tr>th.dt-ordering-asc span.dt-column-order:before,table.dataTable thead>tr>td.dt-orderable-asc span.dt-column-order:before,table.dataTable thead>tr>td.dt-ordering-asc span.dt-column-order:before{position:absolute;display:block;bottom:50%;content:"\25b2";content:"\25b2"/""}table.dataTable thead>tr>th.dt-orderable-desc span.dt-column-order:after,table.dataTable thead>tr>th.dt-ordering-desc span.dt-column-order:after,table.dataTable thead>tr>td.dt-orderable-desc span.dt-column-order:after,table.dataTable thead>tr>td.dt-ordering-desc span.dt-column-order:after{position:absolute;display:block;top:50%;content:"\25bc";content:"\25bc"/""}table.dataTable thead>tr>th.dt-orderable-asc,table.dataTable thead>tr>th.dt-orderable-desc,table.dataTable thead>tr>th.dt-ordering-asc,table.dataTable thead>tr>th.dt-ordering-desc,table.dataTable thead>tr>td.dt-orderable-asc,table.dataTable thead>tr>td.dt-orderable-desc,table.dataTable thead>tr>td.dt-ordering-asc,table.dataTable thead>tr>td.dt-ordering-desc{position:relative;padding-right:30px}table.dataTable thead>tr>th.dt-orderable-asc span.dt-column-order,table.dataTable thead>tr>th.dt-orderable-desc span.dt-column-order,table.dataTable thead>tr>th.dt-ordering-asc span.dt-column-order,table.dataTable thead>tr>th.dt-ordering-desc span.dt-column-order,table.dataTable thead>tr>td.dt-orderable-asc span.dt-column-order,table.dataTable thead>tr>td.dt-orderable-desc span.dt-column-order,table.dataTable thead>tr>td.dt-ordering-asc span.dt-column-order,table.dataTable thead>tr>td.dt-ordering-desc span.dt-column-order{position:absolute;right:12px;top:0;bottom:0;width:12px}table.dataTable thead>tr>th.dt-orderable-asc span.dt-column-order:before,table.dataTable thead>tr>th.dt-orderable-asc span.dt-column-order:after,table.dataTable thead>tr>th.dt-orderable-desc span.dt-column-order:before,table.dataTable thead>tr>th.dt-orderable-desc span.dt-column-order:after,table.dataTable thead>tr>th.dt-ordering-asc span.dt-column-order:before,table.dataTable thead>tr>th.dt-ordering-asc span.dt-column-order:after,table.dataTable thead>tr>th.dt-ordering-desc span.dt-column-order:before,table.dataTable thead>tr>th.dt-ordering-desc span.dt-column-order:after,table.dataTable thead>tr>td.dt-orderable-asc span.dt-column-order:before,table.dataTable thead>tr>td.dt-orderable-asc span.dt-column-order:after,table.dataTable thead>tr>td.dt-orderable-desc span.dt-column-order:before,table.dataTable thead>tr>td.dt-orderable-desc span.dt-column-order:after,table.dataTable thead>tr>td.dt-ordering-asc span.dt-column-order:before,table.dataTable thead>tr>td.dt-ordering-asc span.dt-column-order:after,table.dataTable thead>tr>td.dt-ordering-desc span.dt-column-order:before,table.dataTable thead>tr>td.dt-ordering-desc span.dt-column-order:after{left:0;opacity:.125;line-height:9px;font-size:.8em}table.dataTable thead>tr>th.dt-orderable-asc,table.dataTable thead>tr>th.dt-orderable-desc,table.dataTable thead>tr>td.dt-orderable-asc,table.dataTable thead>tr>td.dt-orderable-desc{cursor:pointer}table.dataTable thead>tr>th.dt-orderable-asc:hover,table.dataTable thead>tr>th.dt-orderable-desc:hover,table.dataTable thead>tr>td.dt-orderable-asc:hover,table.dataTable thead>tr>td.dt-orderable-desc:hover{outline:2px solid rgba(0,0,0,.05);outline-offset:-2px}table.dataTable thead>tr>th.dt-ordering-asc span.dt-column-order:before,table.dataTable thead>tr>th.dt-ordering-desc span.dt-column-order:after,table.dataTable thead>tr>td.dt-ordering-asc span.dt-column-order:before,table.dataTable thead>tr>td.dt-ordering-desc span.dt-column-order:after{opacity:.6}table.dataTable thead>tr>th.sorting_desc_disabled span.dt-column-order:after,table.dataTable thead>tr>th.sorting_asc_disabled span.dt-column-order:before,table.dataTable thead>tr>td.sorting_desc_disabled span.dt-column-order:after,table.dataTable thead>tr>td.sorting_asc_disabled span.dt-column-order:before{display:none}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}div.dt-scroll-body>table.dataTable>thead>tr>th,div.dt-scroll-body>table.dataTable>thead>tr>td{overflow:hidden}:root.dark table.dataTable thead>tr>th.dt-orderable-asc:hover,:root.dark table.dataTable thead>tr>th.dt-orderable-desc:hover,:root.dark table.dataTable thead>tr>td.dt-orderable-asc:hover,:root.dark table.dataTable thead>tr>td.dt-orderable-desc:hover,:root[data-bs-theme=dark] table.dataTable thead>tr>th.dt-orderable-asc:hover,:root[data-bs-theme=dark] table.dataTable thead>tr>th.dt-orderable-desc:hover,:root[data-bs-theme=dark] table.dataTable thead>tr>td.dt-orderable-asc:hover,:root[data-bs-theme=dark] table.dataTable thead>tr>td.dt-orderable-desc:hover{outline:2px solid rgba(255,255,255,.05)}div.dt-processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-22px;text-align:center;padding:2px;z-index:10}div.dt-processing>div:last-child{position:relative;width:80px;height:15px;margin:1em auto}div.dt-processing>div:last-child>div{position:absolute;top:0;width:13px;height:13px;border-radius:50%;background:#0d6efd;background:rgb(var(--dt-row-selected));animation-timing-function:cubic-bezier(0,1,1,0)}div.dt-processing>div:last-child>div:nth-child(1){left:8px;animation:datatables-loader-1 .6s infinite}div.dt-processing>div:last-child>div:nth-child(2){left:8px;animation:datatables-loader-2 .6s infinite}div.dt-processing>div:last-child>div:nth-child(3){left:32px;animation:datatables-loader-2 .6s infinite}div.dt-processing>div:last-child>div:nth-child(4){left:56px;animation:datatables-loader-3 .6s infinite}@keyframes datatables-loader-1{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes datatables-loader-3{0%{transform:scale(1)}to{transform:scale(0)}}@keyframes datatables-loader-2{0%{transform:translate(0)}to{transform:translate(24px)}}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable th,table.dataTable td{box-sizing:border-box}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable th.dt-empty,table.dataTable td.dt-empty{text-align:center;vertical-align:top}table.dataTable th.dt-type-numeric,table.dataTable th.dt-type-date,table.dataTable td.dt-type-numeric,table.dataTable td.dt-type-date{text-align:right}table.dataTable thead th,table.dataTable thead td,table.dataTable tfoot th,table.dataTable tfoot td,table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable{width:100%;margin:0 auto;border-spacing:0}table.dataTable thead th,table.dataTable tfoot th{font-weight:700}table.dataTable>thead>tr>th,table.dataTable>thead>tr>td{padding:10px;border-bottom:1px solid rgba(0,0,0,.3)}table.dataTable>thead>tr>th:active,table.dataTable>thead>tr>td:active{outline:none}table.dataTable>tfoot>tr>th,table.dataTable>tfoot>tr>td{border-top:1px solid rgba(0,0,0,.3);padding:10px 10px 6px}table.dataTable>tbody>tr{background-color:transparent}table.dataTable>tbody>tr:first-child>*{border-top:none}table.dataTable>tbody>tr:last-child>*{border-bottom:none}table.dataTable>tbody>tr.selected>*{box-shadow:inset 0 0 0 9999px #0d6efde6;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.9);color:#fff;color:rgb(var(--dt-row-selected-text))}table.dataTable>tbody>tr.selected a{color:#090a0b;color:rgb(var(--dt-row-selected-link))}table.dataTable>tbody>tr>th,table.dataTable>tbody>tr>td{padding:8px 10px}table.dataTable.row-border>tbody>tr>*,table.dataTable.display>tbody>tr>*{border-top:1px solid rgba(0,0,0,.15)}table.dataTable.row-border>tbody>tr:first-child>*,table.dataTable.display>tbody>tr:first-child>*{border-top:none}table.dataTable.row-border>tbody>tr.selected+tr.selected>td,table.dataTable.display>tbody>tr.selected+tr.selected>td{border-top-color:#0d6efda6;border-top-color:rgba(var(--dt-row-selected),.65)}table.dataTable.cell-border>tbody>tr>*{border-top:1px solid rgba(0,0,0,.15);border-right:1px solid rgba(0,0,0,.15)}table.dataTable.cell-border>tbody>tr>*:first-child{border-left:1px solid rgba(0,0,0,.15)}table.dataTable.cell-border>tbody>tr:first-child>*{border-top:1px solid rgba(0,0,0,.3)}table.dataTable.stripe>tbody>tr:nth-child(odd)>*,table.dataTable.display>tbody>tr:nth-child(odd)>*{box-shadow:inset 0 0 0 9999px #00000006;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-stripe),.023)}table.dataTable.stripe>tbody>tr:nth-child(odd).selected>*,table.dataTable.display>tbody>tr:nth-child(odd).selected>*{box-shadow:inset 0 0 0 9999px #0d6efdeb;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.923)}table.dataTable.hover>tbody>tr:hover>*,table.dataTable.display>tbody>tr:hover>*{box-shadow:inset 0 0 0 9999px #00000009;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-hover),.035)}table.dataTable.hover>tbody>tr.selected:hover>*,table.dataTable.display>tbody>tr.selected:hover>*{box-shadow:inset 0 0 0 9999px #0d6efd!important;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),1)!important}table.dataTable.order-column>tbody tr>.sorting_1,table.dataTable.order-column>tbody tr>.sorting_2,table.dataTable.order-column>tbody tr>.sorting_3,table.dataTable.display>tbody tr>.sorting_1,table.dataTable.display>tbody tr>.sorting_2,table.dataTable.display>tbody tr>.sorting_3{box-shadow:inset 0 0 0 9999px #00000005;box-shadow:inset 0 0 0 9999px rgba(var(--dt-column-ordering),.019)}table.dataTable.order-column>tbody tr.selected>.sorting_1,table.dataTable.order-column>tbody tr.selected>.sorting_2,table.dataTable.order-column>tbody tr.selected>.sorting_3,table.dataTable.display>tbody tr.selected>.sorting_1,table.dataTable.display>tbody tr.selected>.sorting_2,table.dataTable.display>tbody tr.selected>.sorting_3{box-shadow:inset 0 0 0 9999px #0d6efdea;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.919)}table.dataTable.display>tbody>tr:nth-child(odd)>.sorting_1,table.dataTable.order-column.stripe>tbody>tr:nth-child(odd)>.sorting_1{box-shadow:inset 0 0 0 9999px #0000000e;box-shadow:inset 0 0 0 9999px rgba(var(--dt-column-ordering),.054)}table.dataTable.display>tbody>tr:nth-child(odd)>.sorting_2,table.dataTable.order-column.stripe>tbody>tr:nth-child(odd)>.sorting_2{box-shadow:inset 0 0 0 9999px #0000000c;box-shadow:inset 0 0 0 9999px rgba(var(--dt-column-ordering),.047)}table.dataTable.display>tbody>tr:nth-child(odd)>.sorting_3,table.dataTable.order-column.stripe>tbody>tr:nth-child(odd)>.sorting_3{box-shadow:inset 0 0 0 9999px #0000000a;box-shadow:inset 0 0 0 9999px rgba(var(--dt-column-ordering),.039)}table.dataTable.display>tbody>tr:nth-child(odd).selected>.sorting_1,table.dataTable.order-column.stripe>tbody>tr:nth-child(odd).selected>.sorting_1{box-shadow:inset 0 0 0 9999px #0d6efdf3;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.954)}table.dataTable.display>tbody>tr:nth-child(odd).selected>.sorting_2,table.dataTable.order-column.stripe>tbody>tr:nth-child(odd).selected>.sorting_2{box-shadow:inset 0 0 0 9999px #0d6efdf1;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.947)}table.dataTable.display>tbody>tr:nth-child(odd).selected>.sorting_3,table.dataTable.order-column.stripe>tbody>tr:nth-child(odd).selected>.sorting_3{box-shadow:inset 0 0 0 9999px #0d6efdef;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.939)}table.dataTable.display>tbody>tr.even>.sorting_1,table.dataTable.order-column.stripe>tbody>tr.even>.sorting_1{box-shadow:inset 0 0 0 9999px #00000005;box-shadow:inset 0 0 0 9999px rgba(var(--dt-column-ordering),.019)}table.dataTable.display>tbody>tr.even>.sorting_2,table.dataTable.order-column.stripe>tbody>tr.even>.sorting_2{box-shadow:inset 0 0 0 9999px #00000003;box-shadow:inset 0 0 0 9999px rgba(var(--dt-column-ordering),.011)}table.dataTable.display>tbody>tr.even>.sorting_3,table.dataTable.order-column.stripe>tbody>tr.even>.sorting_3{box-shadow:inset 0 0 0 9999px #00000001;box-shadow:inset 0 0 0 9999px rgba(var(--dt-column-ordering),.003)}table.dataTable.display>tbody>tr.even.selected>.sorting_1,table.dataTable.order-column.stripe>tbody>tr.even.selected>.sorting_1{box-shadow:inset 0 0 0 9999px #0d6efdea;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.919)}table.dataTable.display>tbody>tr.even.selected>.sorting_2,table.dataTable.order-column.stripe>tbody>tr.even.selected>.sorting_2{box-shadow:inset 0 0 0 9999px #0d6efde8;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.911)}table.dataTable.display>tbody>tr.even.selected>.sorting_3,table.dataTable.order-column.stripe>tbody>tr.even.selected>.sorting_3{box-shadow:inset 0 0 0 9999px #0d6efde6;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.903)}table.dataTable.display tbody tr:hover>.sorting_1,table.dataTable.order-column.hover tbody tr:hover>.sorting_1{box-shadow:inset 0 0 0 9999px #00000015;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-hover),.082)}table.dataTable.display tbody tr:hover>.sorting_2,table.dataTable.order-column.hover tbody tr:hover>.sorting_2{box-shadow:inset 0 0 0 9999px #00000013;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-hover),.074)}table.dataTable.display tbody tr:hover>.sorting_3,table.dataTable.order-column.hover tbody tr:hover>.sorting_3{box-shadow:inset 0 0 0 9999px #00000010;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-hover),.062)}table.dataTable.display tbody tr:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_1{box-shadow:inset 0 0 0 9999px #0d6efdfa;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.982)}table.dataTable.display tbody tr:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_2{box-shadow:inset 0 0 0 9999px #0d6efdf8;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.974)}table.dataTable.display tbody tr:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_3{box-shadow:inset 0 0 0 9999px #0d6efdf5;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.962)}table.dataTable.compact thead th,table.dataTable.compact thead td,table.dataTable.compact tfoot th,table.dataTable.compact tfoot td,table.dataTable.compact tbody th,table.dataTable.compact tbody td{padding:4px}div.dt-container div.dt-layout-row{display:flex;justify-content:space-between;align-items:center;width:100%;margin:.75em 0}div.dt-container div.dt-layout-row div.dt-layout-cell{display:flex;justify-content:space-between;align-items:center}div.dt-container div.dt-layout-row div.dt-layout-cell.dt-layout-start{justify-content:flex-start;margin-right:auto}div.dt-container div.dt-layout-row div.dt-layout-cell.dt-layout-end{justify-content:flex-end;margin-left:auto}div.dt-container div.dt-layout-row div.dt-layout-cell:empty{display:none}@media screen and (max-width: 767px){div.dt-container div.dt-layout-row:not(.dt-layout-table){display:block}div.dt-container div.dt-layout-row:not(.dt-layout-table) div.dt-layout-cell{display:block;text-align:center}div.dt-container div.dt-layout-row:not(.dt-layout-table) div.dt-layout-cell>*{margin:.5em 0}div.dt-container div.dt-layout-row:not(.dt-layout-table) div.dt-layout-cell.dt-layout-start{margin-right:0}div.dt-container div.dt-layout-row:not(.dt-layout-table) div.dt-layout-cell.dt-layout-end{margin-left:0}}div.dt-container div.dt-layout-start>*:not(:last-child){margin-right:1em}div.dt-container div.dt-layout-end>*:not(:first-child){margin-left:1em}div.dt-container div.dt-layout-full{width:100%}div.dt-container div.dt-layout-full>*:only-child{margin-left:auto;margin-right:auto}div.dt-container div.dt-layout-table>div{display:block!important}@media screen and (max-width: 767px){div.dt-container div.dt-layout-start>*:not(:last-child){margin-right:0}div.dt-container div.dt-layout-end>*:not(:first-child){margin-left:0}}div.dt-container{position:relative;clear:both}div.dt-container .dt-search input{border:1px solid #aaa;border-radius:3px;padding:5px;background-color:transparent;color:inherit;margin-left:3px}div.dt-container .dt-input{border:1px solid #aaa;border-radius:3px;padding:5px;background-color:transparent;color:inherit}div.dt-container select.dt-input{padding:4px}div.dt-container .dt-paging .dt-paging-button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:.5em 1em;margin-left:2px;text-align:center;text-decoration:none!important;cursor:pointer;color:inherit!important;border:1px solid transparent;border-radius:2px;background:transparent}div.dt-container .dt-paging .dt-paging-button.current,div.dt-container .dt-paging .dt-paging-button.current:hover{color:inherit!important;border:1px solid rgba(0,0,0,.3);background-color:#0000000d;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,rgba(230,230,230,.05)),color-stop(100%,rgba(0,0,0,.05)));background:-webkit-linear-gradient(top,rgba(230,230,230,.05) 0%,rgba(0,0,0,.05) 100%);background:-moz-linear-gradient(top,rgba(230,230,230,.05) 0%,rgba(0,0,0,.05) 100%);background:-ms-linear-gradient(top,rgba(230,230,230,.05) 0%,rgba(0,0,0,.05) 100%);background:-o-linear-gradient(top,rgba(230,230,230,.05) 0%,rgba(0,0,0,.05) 100%);background:linear-gradient(to bottom,#e6e6e60d,#0000000d)}div.dt-container .dt-paging .dt-paging-button.disabled,div.dt-container .dt-paging .dt-paging-button.disabled:hover,div.dt-container .dt-paging .dt-paging-button.disabled:active{cursor:default;color:#00000080!important;border:1px solid transparent;background:transparent;box-shadow:none}div.dt-container .dt-paging .dt-paging-button:hover{color:#fff!important;border:1px solid #111;background-color:#111;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#585858),color-stop(100%,#111));background:-webkit-linear-gradient(top,#585858 0%,#111 100%);background:-moz-linear-gradient(top,#585858 0%,#111 100%);background:-ms-linear-gradient(top,#585858 0%,#111 100%);background:-o-linear-gradient(top,#585858 0%,#111 100%);background:linear-gradient(to bottom,#585858,#111)}div.dt-container .dt-paging .dt-paging-button:active{outline:none;background-color:#0c0c0c;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#2b2b2b),color-stop(100%,#0c0c0c));background:-webkit-linear-gradient(top,#2b2b2b 0%,#0c0c0c 100%);background:-moz-linear-gradient(top,#2b2b2b 0%,#0c0c0c 100%);background:-ms-linear-gradient(top,#2b2b2b 0%,#0c0c0c 100%);background:-o-linear-gradient(top,#2b2b2b 0%,#0c0c0c 100%);background:linear-gradient(to bottom,#2b2b2b,#0c0c0c);box-shadow:inset 0 0 3px #111}div.dt-container .dt-paging .ellipsis{padding:0 1em}div.dt-container .dt-length,div.dt-container .dt-search,div.dt-container .dt-info,div.dt-container .dt-processing,div.dt-container .dt-paging{color:inherit}div.dt-container .dataTables_scroll{clear:both}div.dt-container .dataTables_scroll div.dt-scroll-body{-webkit-overflow-scrolling:touch}div.dt-container .dataTables_scroll div.dt-scroll-body>table>thead>tr>th,div.dt-container .dataTables_scroll div.dt-scroll-body>table>thead>tr>td,div.dt-container .dataTables_scroll div.dt-scroll-body>table>tbody>tr>th,div.dt-container .dataTables_scroll div.dt-scroll-body>table>tbody>tr>td{vertical-align:middle}div.dt-container .dataTables_scroll div.dt-scroll-body>table>thead>tr>th>div.dataTables_sizing,div.dt-container .dataTables_scroll div.dt-scroll-body>table>thead>tr>td>div.dataTables_sizing,div.dt-container .dataTables_scroll div.dt-scroll-body>table>tbody>tr>th>div.dataTables_sizing,div.dt-container .dataTables_scroll div.dt-scroll-body>table>tbody>tr>td>div.dataTables_sizing{height:0;overflow:hidden;margin:0!important;padding:0!important}div.dt-container.dt-empty-footer tbody>tr:last-child>*{border-bottom:1px solid rgba(0,0,0,.3)}div.dt-container.dt-empty-footer .dt-scroll-body{border-bottom:1px solid rgba(0,0,0,.3)}div.dt-container.dt-empty-footer .dt-scroll-body tbody>tr:last-child>*{border-bottom:none}html.dark{--dt-row-hover: 255, 255, 255;--dt-row-stripe: 255, 255, 255;--dt-column-ordering: 255, 255, 255}html.dark table.dataTable>thead>tr>th,html.dark table.dataTable>thead>tr>td{border-bottom:1px solid rgb(89,91,94)}html.dark table.dataTable>thead>tr>th:active,html.dark table.dataTable>thead>tr>td:active{outline:none}html.dark table.dataTable>tfoot>tr>th,html.dark table.dataTable>tfoot>tr>td{border-top:1px solid rgb(89,91,94)}html.dark table.dataTable.row-border>tbody>tr>*,html.dark table.dataTable.display>tbody>tr>*{border-top:1px solid rgb(64,67,70)}html.dark table.dataTable.row-border>tbody>tr:first-child>*,html.dark table.dataTable.display>tbody>tr:first-child>*{border-top:none}html.dark table.dataTable.row-border>tbody>tr.selected+tr.selected>td,html.dark table.dataTable.display>tbody>tr.selected+tr.selected>td{border-top-color:#0d6efda6;border-top-color:rgba(var(--dt-row-selected),.65)}html.dark table.dataTable.cell-border>tbody>tr>th,html.dark table.dataTable.cell-border>tbody>tr>td{border-top:1px solid rgb(64,67,70);border-right:1px solid rgb(64,67,70)}html.dark table.dataTable.cell-border>tbody>tr>th:first-child,html.dark table.dataTable.cell-border>tbody>tr>td:first-child{border-left:1px solid rgb(64,67,70)}html.dark .dt-container.dt-empty-footer table.dataTable{border-bottom:1px solid rgb(89,91,94)}html.dark .dt-container .dt-search input,html.dark .dt-container .dt-length select{border:1px solid rgba(255,255,255,.2);background-color:var(--dt-html-background)}html.dark .dt-container .dt-paging .dt-paging-button.current,html.dark .dt-container .dt-paging .dt-paging-button.current:hover{border:1px solid rgb(89,91,94);background:#ffffff26}html.dark .dt-container .dt-paging .dt-paging-button.disabled,html.dark .dt-container .dt-paging .dt-paging-button.disabled:hover,html.dark .dt-container .dt-paging .dt-paging-button.disabled:active{color:#666!important}html.dark .dt-container .dt-paging .dt-paging-button:hover{border:1px solid rgb(53,53,53);background:#353535}html.dark .dt-container .dt-paging .dt-paging-button:active{background:#3a3a3a}*[dir=rtl] table.dataTable thead th,*[dir=rtl] table.dataTable thead td,*[dir=rtl] table.dataTable tfoot th,*[dir=rtl] table.dataTable tfoot td{text-align:right}*[dir=rtl] table.dataTable th.dt-type-numeric,*[dir=rtl] table.dataTable th.dt-type-date,*[dir=rtl] table.dataTable td.dt-type-numeric,*[dir=rtl] table.dataTable td.dt-type-date{text-align:left}*[dir=rtl] div.dt-container div.dt-layout-cell.dt-start{text-align:right}*[dir=rtl] div.dt-container div.dt-layout-cell.dt-end{text-align:left}*[dir=rtl] div.dt-container div.dt-search input{margin:0 3px 0 0}@keyframes dtb-spinner{to{transform:rotate(360deg)}}@-o-keyframes dtb-spinner{to{-o-transform:rotate(360deg);transform:rotate(360deg)}}@-ms-keyframes dtb-spinner{to{-ms-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes dtb-spinner{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-moz-keyframes dtb-spinner{to{-moz-transform:rotate(360deg);transform:rotate(360deg)}}div.dataTables_wrapper{position:relative}div.dt-buttons{position:initial}div.dt-buttons .dt-button{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}div.dt-button-info{position:fixed;top:50%;left:50%;width:400px;margin-top:-100px;margin-left:-200px;background-color:#fff;border-radius:.75em;box-shadow:3px 4px 10px 1px #000c;text-align:center;z-index:2003;overflow:hidden}div.dt-button-info h2{padding:2rem 2rem 1rem;margin:0;font-weight:400}div.dt-button-info>div{padding:1em 2em 2em}div.dtb-popover-close{position:absolute;top:6px;right:6px;width:22px;height:22px;text-align:center;border-radius:3px;cursor:pointer;z-index:2003}button.dtb-hide-drop{display:none!important}div.dt-button-collection-title{text-align:center;padding:.3em .5em .5em;margin-left:.5em;margin-right:.5em;font-size:.9em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}div.dt-button-collection-title:empty{display:none}span.dt-button-spacer{display:inline-block;margin:.5em;white-space:nowrap}span.dt-button-spacer.bar{border-left:1px solid rgba(0,0,0,.3);vertical-align:middle;padding-left:.5em}span.dt-button-spacer.bar:empty{height:1em;width:1px;padding-left:0}div.dt-button-collection .dt-button-active{padding-right:3em}div.dt-button-collection .dt-button-active:after{position:absolute;top:50%;margin-top:-10px;right:1em;display:inline-block;content:"\2713";color:inherit}div.dt-button-collection .dt-button-active.dt-button-split{padding-right:0}div.dt-button-collection .dt-button-active.dt-button-split:after{display:none}div.dt-button-collection .dt-button-active.dt-button-split>*:first-child{padding-right:3em}div.dt-button-collection .dt-button-active.dt-button-split>*:first-child:after{position:absolute;top:50%;margin-top:-10px;right:1em;display:inline-block;content:"\2713";color:inherit}div.dt-button-collection .dt-button-active-a a{padding-right:3em}div.dt-button-collection .dt-button-active-a a:after{position:absolute;right:1em;display:inline-block;content:"\2713";color:inherit}div.dt-button-collection span.dt-button-spacer{width:100%;font-size:.9em;text-align:center;margin:.5em 0}div.dt-button-collection span.dt-button-spacer:empty{height:0;width:100%}div.dt-button-collection span.dt-button-spacer.bar{border-left:none;border-bottom:1px solid rgba(0,0,0,.1);padding-left:0}@media print{table.dataTable tr>*{box-shadow:none!important}}html.dark div.dt-button-info{background-color:var(--dt-html-background);border:1px solid rgba(255,255,255,.15)}div.dt-buttons>.dt-button,div.dt-buttons>div.dt-button-split .dt-button{position:relative;display:inline-block;box-sizing:border-box;margin-left:.167em;margin-right:.167em;margin-bottom:.333em;padding:.5em 1em;border:1px solid rgba(0,0,0,.3);border-radius:2px;cursor:pointer;font-size:.88em;line-height:1.6em;color:inherit;white-space:nowrap;overflow:hidden;background-color:#0000001a;background:linear-gradient(to bottom,#e6e6e61a,#0000001a);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr="rgba(230, 230, 230, 0.1)",EndColorStr="rgba(0, 0, 0, 0.1)");-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-decoration:none;outline:none;text-overflow:ellipsis}div.dt-buttons>.dt-button:first-child,div.dt-buttons>div.dt-button-split .dt-button:first-child{margin-left:0}div.dt-buttons>.dt-button.disabled,div.dt-buttons>div.dt-button-split .dt-button.disabled{cursor:default;opacity:.4}div.dt-buttons>.dt-button.dt-button-active:not(.disabled),div.dt-buttons>div.dt-button-split .dt-button.dt-button-active:not(.disabled){background-color:#0000001a;background:linear-gradient(to bottom,#b3b3b31a,#0000001a);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr="rgba(179, 179, 179, 0.1)",EndColorStr="rgba(0, 0, 0, 0.1)");box-shadow:inset 1px 1px 3px #999}div.dt-buttons>.dt-button.dt-button-active:not(.disabled):hover:not(.disabled),div.dt-buttons>div.dt-button-split .dt-button.dt-button-active:not(.disabled):hover:not(.disabled){box-shadow:inset 1px 1px 3px #999;background-color:#0000001a;background:linear-gradient(to bottom,#8080801a,#0000001a);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr="rgba(128, 128, 128, 0.1)",EndColorStr="rgba(0, 0, 0, 0.1)")}div.dt-buttons>.dt-button:hover,div.dt-buttons>div.dt-button-split .dt-button:hover{text-decoration:none}div.dt-buttons>.dt-button:hover:not(.disabled),div.dt-buttons>div.dt-button-split .dt-button:hover:not(.disabled){border:1px solid #666;background-color:#0000001a;background:linear-gradient(to bottom,#9999991a,#0000001a);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr="rgba(153, 153, 153, 0.1)",EndColorStr="rgba(0, 0, 0, 0.1)")}div.dt-buttons>.dt-button:focus:not(.disabled),div.dt-buttons>div.dt-button-split .dt-button:focus:not(.disabled){outline:2px solid rgb(53,132,228)}div.dt-buttons>.dt-button embed,div.dt-buttons>div.dt-button-split .dt-button embed{outline:none}div.dt-buttons>div.dt-button-split .dt-button:first-child{border-right:1px solid rgba(0,0,0,.15);border-top-right-radius:0;border-bottom-right-radius:0}div.dt-buttons>div.dt-button-split .dt-button:first-child:hover{border-right:1px solid #666}div.dt-buttons>div.dt-button-split .dt-button:last-child{border-left:1px solid transparent;border-top-left-radius:0;border-bottom-left-radius:0}div.dt-buttons>div.dt-button-split .dt-button:last-child:hover{border-left:1px solid #666}div.dt-buttons span.dt-button-down-arrow{position:relative;top:-2px;font-size:10px;padding-left:10px;line-height:1em;opacity:.6}div.dt-buttons div.dt-button-split{display:inline-block}div.dt-buttons div.dt-button-split .dt-button:first-child{margin-right:0}div.dt-buttons div.dt-button-split .dt-button:last-child{margin-left:-1px;padding-left:.75em;padding-right:.75em;z-index:2}div.dt-buttons div.dt-button-split .dt-button:last-child span{padding-left:0}div.dt-button-collection{position:absolute;top:0;left:0;width:200px;margin-top:3px;margin-bottom:3px;padding:.75em 0;border:1px solid rgba(0,0,0,.4);background-color:#fff;overflow:hidden;z-index:2002;border-radius:5px;box-shadow:3px 4px 10px 1px #0000004d;box-sizing:border-box}div.dt-button-collection .dt-button{position:relative;left:0;right:0;width:100%;display:block;float:none;background:none;margin:0;padding:.5em 1em;border:none;text-align:left;cursor:pointer;color:inherit}div.dt-button-collection .dt-button.dt-button-active{background:none;box-shadow:none}div.dt-button-collection .dt-button.disabled{cursor:default;opacity:.4}div.dt-button-collection .dt-button:hover:not(.disabled){border:none;background:#9999991a;box-shadow:none}div.dt-button-collection div.dt-button-split{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:flex-start;align-content:flex-start;align-items:stretch}div.dt-button-collection div.dt-button-split button.dt-button{margin:0;display:inline-block;width:0;flex-grow:1;flex-shrink:0;flex-basis:50px}div.dt-button-collection div.dt-button-split button.dt-button-split-drop{min-width:33px;flex:0}div.dt-button-collection.fixed .dt-button{border-radius:.25em;background:#ffffff1a}div.dt-button-collection.fixed{position:fixed;display:block;top:50%;left:50%;margin-left:-75px;border-radius:5px;background-color:#fff;padding:.5em}div.dt-button-collection.fixed.two-column{margin-left:-200px}div.dt-button-collection.fixed.three-column{margin-left:-225px}div.dt-button-collection.fixed.four-column{margin-left:-300px}div.dt-button-collection.fixed.columns{margin-left:-409px}@media screen and (max-width: 1024px){div.dt-button-collection.fixed.columns{margin-left:-308px}}@media screen and (max-width: 640px){div.dt-button-collection.fixed.columns{margin-left:-203px}}@media screen and (max-width: 460px){div.dt-button-collection.fixed.columns{margin-left:-100px}}div.dt-button-collection.fixed>:last-child{max-height:100vh;overflow:auto}div.dt-button-collection.two-column>:last-child,div.dt-button-collection.three-column>:last-child,div.dt-button-collection.four-column>:last-child{display:block!important;-webkit-column-gap:8px;-moz-column-gap:8px;-ms-column-gap:8px;-o-column-gap:8px;column-gap:8px}div.dt-button-collection.two-column>:last-child>*,div.dt-button-collection.three-column>:last-child>*,div.dt-button-collection.four-column>:last-child>*{-webkit-column-break-inside:avoid;break-inside:avoid}div.dt-button-collection.two-column{width:400px}div.dt-button-collection.two-column>:last-child{padding-bottom:1px;column-count:2}div.dt-button-collection.three-column{width:450px}div.dt-button-collection.three-column>:last-child{padding-bottom:1px;column-count:3}div.dt-button-collection.four-column{width:600px}div.dt-button-collection.four-column>:last-child{padding-bottom:1px;column-count:4}div.dt-button-collection .dt-button{border-radius:0}div.dt-button-collection.columns{width:auto}div.dt-button-collection.columns>:last-child{display:flex;flex-wrap:wrap;justify-content:flex-start;align-items:center;gap:6px;width:818px;padding-bottom:1px}div.dt-button-collection.columns>:last-child .dt-button{min-width:200px;flex:0 1;margin:0}div.dt-button-collection.columns.dtb-b3>:last-child,div.dt-button-collection.columns.dtb-b2>:last-child,div.dt-button-collection.columns.dtb-b1>:last-child{justify-content:space-between}div.dt-button-collection.columns.dtb-b3 .dt-button{flex:1 1 32%}div.dt-button-collection.columns.dtb-b2 .dt-button{flex:1 1 48%}div.dt-button-collection.columns.dtb-b1 .dt-button{flex:1 1 100%}@media screen and (max-width: 1024px){div.dt-button-collection.columns>:last-child{width:612px}}@media screen and (max-width: 640px){div.dt-button-collection.columns>:last-child{width:406px}div.dt-button-collection.columns.dtb-b3 .dt-button{flex:0 1 32%}}@media screen and (max-width: 460px){div.dt-button-collection.columns>:last-child{width:200px}}div.dt-button-background{position:fixed;top:0;left:0;width:100%;height:100%;background:#000000b3;background:radial-gradient(ellipse farthest-corner at center,#0000004d,#000000b3);z-index:2001}.dt-button.processing{color:#0003}.dt-button.processing:after{position:absolute;top:50%;left:50%;width:16px;height:16px;margin:-8px 0 0 -8px;box-sizing:border-box;display:block;content:" ";border:2px solid rgb(40,40,40);border-radius:50%;border-left-color:transparent;border-right-color:transparent;animation:dtb-spinner 1.5s infinite linear;-o-animation:dtb-spinner 1.5s infinite linear;-ms-animation:dtb-spinner 1.5s infinite linear;-webkit-animation:dtb-spinner 1.5s infinite linear;-moz-animation:dtb-spinner 1.5s infinite linear}@media screen and (max-width: 640px){div.dt-buttons{float:none!important;text-align:center}}html.dark div.dt-buttons>.dt-button,html.dark div.dt-buttons>div.dt-button-split .dt-button{border:1px solid rgb(89,91,94);background:#ffffff26}html.dark div.dt-buttons>.dt-button.dt-button-active:not(.disabled),html.dark div.dt-buttons>div.dt-button-split .dt-button.dt-button-active:not(.disabled){background:#b3b3b326;box-shadow:inset 1px 1px 2px #000}html.dark div.dt-buttons>.dt-button.dt-button-active:not(.disabled):hover:not(.disabled),html.dark div.dt-buttons>div.dt-button-split .dt-button.dt-button-active:not(.disabled):hover:not(.disabled){background:#80808026;box-shadow:inset 1px 1px 3px #000}html.dark div.dt-buttons>.dt-button:hover:not(.disabled),html.dark div.dt-buttons>div.dt-button-split .dt-button:hover:not(.disabled){background:#b3b3b326}html.dark div.dt-buttons>.dt-button:focus:not(.disabled),html.dark div.dt-buttons>div.dt-button-split .dt-button:focus:not(.disabled){outline:2px solid rgb(110,168,254)}html.dark div.dt-buttons>div.dt-button-split .dt-button:first-child{border-right:1px solid rgba(255,255,255,.1)}html.dark div.dt-buttons>div.dt-button-split .dt-button:first-child:hover{border-right:1px solid rgb(89,91,94)}html.dark div.dt-buttons>div.dt-button-split .dt-button:last-child:hover{border-left:1px solid rgb(89,91,94)}html.dark div.dt-button-collection{border:1px solid rgba(255,255,255,.15);background-color:#212529;box-shadow:3px 4px 10px 1px #000c}table.dataTable thead tr>.dtfc-fixed-start,table.dataTable thead tr>.dtfc-fixed-end,table.dataTable tfoot tr>.dtfc-fixed-start,table.dataTable tfoot tr>.dtfc-fixed-end{top:0;bottom:0;z-index:3;background-color:#fff}table.dataTable tbody tr>.dtfc-fixed-start,table.dataTable tbody tr>.dtfc-fixed-end{z-index:1;background-color:#fff}table.dataTable tr>.dtfc-fixed-left:after,table.dataTable tr>.dtfc-fixed-right:after{position:absolute;top:0;bottom:0;width:10px;transition:box-shadow .3s;content:"";pointer-events:none}table.dataTable tr>.dtfc-fixed-left:after{right:0;transform:translate(100%)}table.dataTable tr>.dtfc-fixed-right:after{left:0;transform:translate(-80%)}table.dataTable.dtfc-scrolling-left tr>.dtfc-fixed-left:after{box-shadow:inset 10px 0 8px -8px #0003}table.dataTable.dtfc-scrolling-right tr>.dtfc-fixed-right:after{box-shadow:inset -10px 0 8px -8px #0003}table.dataTable.dtfc-scrolling-right tr>.dtfc-fixed-right+.dtfc-fixed-right:after{box-shadow:none}div.dt-scroll,div.dtfh-floatingparent{position:relative}div.dt-scroll div.dtfc-top-blocker,div.dt-scroll div.dtfc-bottom-blocker,div.dtfh-floatingparent div.dtfc-top-blocker,div.dtfh-floatingparent div.dtfc-bottom-blocker{position:absolute;background-color:#fff}html.dark table.dataTable thead tr>.dtfc-fixed-start,html.dark table.dataTable thead tr>.dtfc-fixed-end,html.dark table.dataTable tfoot tr>.dtfc-fixed-start,html.dark table.dataTable tfoot tr>.dtfc-fixed-end{background-color:var(--dt-html-background)}html.dark table.dataTable tbody tr>.dtfc-fixed-start,html.dark table.dataTable tbody tr>.dtfc-fixed-end{background-color:var(--dt-html-background)}html.dark table.dataTable.dtfc-scrolling-left tbody>tr>.dtfc-fixed-left:after{box-shadow:inset 10px 0 8px -8px #0000004d}html.dark table.dataTable.dtfc-scrolling-right tbody>tr>.dtfc-fixed-right:after{box-shadow:inset -10px 0 8px -8px #0000004d}html.dark table.dataTable.dtfc-scrolling-right tbody>tr>.dtfc-fixed-right+.dtfc-fixed-right:after{box-shadow:none}html.dark div.dtfc-top-blocker,html.dark div.dtfc-bottom-blocker{background-color:var(--dt-html-background)}table.dataTable tbody th.focus,table.dataTable tbody td.focus{outline:2px solid #36f;outline-offset:-2px}table.dataTable tbody tr.selected th.focus,table.dataTable tbody tr.selected td.focus{outline-color:#03c}div.dtk-focus-alt table.dataTable tbody th.focus,div.dtk-focus-alt table.dataTable tbody td.focus{outline:2px solid #ff8b33;outline-offset:-2px}html.dark table.dataTable tbody th.focus,html.dark table.dataTable tbody td.focus{outline-color:#0d6efd}html.dark table.dataTable tbody tr.selected th.focus,html.dark table.dataTable tbody tr.selected td.focus{outline-color:#0143a3}html.dark div.dtk-focus-alt table.dataTable tbody th.focus,html.dark div.dtk-focus-alt table.dataTable tbody td.focus{outline-color:#ff8b33}table.dataTable tr.dtrg-group th{background-color:#0000001a;text-align:left}table.dataTable tr.dtrg-group.dtrg-level-0 th{font-weight:700}table.dataTable tr.dtrg-group.dtrg-level-1 th,table.dataTable tr.dtrg-group.dtrg-level-2 th,table.dataTable tr.dtrg-group.dtrg-level-3 th,table.dataTable tr.dtrg-group.dtrg-level-4 th,table.dataTable tr.dtrg-group.dtrg-level-5 th{background-color:#0000000d;padding-top:.25em;padding-bottom:.25em;padding-left:2em;font-size:.9em}table.dataTable tr.dtrg-group.dtrg-level-2 th{background-color:#00000003;padding-left:2.5em}table.dataTable tr.dtrg-group.dtrg-level-3 th{background-color:#00000003;padding-left:3em}table.dataTable tr.dtrg-group.dtrg-level-4 th{background-color:#00000003;padding-left:3.5em}table.dataTable tr.dtrg-group.dtrg-level-5 th{background-color:#00000003;padding-left:4em}html.dark table.dataTable tr.dtrg-group th{background-color:#ffffff1a}html.dark table.dataTable tr.dtrg-group.dtrg-level-1 th{background-color:#ffffff0d}html.dark table.dataTable tr.dtrg-group.dtrg-level-2 th,html.dark table.dataTable tr.dtrg-group.dtrg-level-3 th,html.dark table.dataTable tr.dtrg-group.dtrg-level-4 th,html.dark table.dataTable tr.dtrg-group.dtrg-level-5 th{background-color:#ffffff03}div.dt-datetime{position:absolute;background-color:#fff;z-index:2050;border:1px solid #ccc;box-shadow:0 5px 15px -5px #00000080;padding:6px 20px;width:275px;border-radius:5px}div.dt-datetime.inline{position:relative;box-shadow:none}div.dt-datetime div.dt-datetime-title{text-align:center;padding:5px 0 3px}div.dt-datetime div.dt-datetime-buttons{text-align:center}div.dt-datetime div.dt-datetime-buttons a{display:inline-block;padding:0 .5em .5em;margin:0;font-size:.9em}div.dt-datetime div.dt-datetime-buttons a:hover{text-decoration:underline}div.dt-datetime table{border-spacing:0;margin:12px 0;width:100%}div.dt-datetime table.dt-datetime-table-nospace{margin-top:-12px}div.dt-datetime table th{font-size:.8em;color:#777;font-weight:400;width:14.285714286%;padding:0 0 4px;text-align:center}div.dt-datetime table td{font-size:.9em;color:#444;padding:0}div.dt-datetime table td.selectable{text-align:center;background:#f5f5f5}div.dt-datetime table td.selectable.disabled,div.dt-datetime table td.selectable.disabled button:hover{color:#aaa;background:#fff}div.dt-datetime table td.selectable.now{background-color:#ddd}div.dt-datetime table td.selectable.now button{font-weight:700}div.dt-datetime table td.selectable.selected button{background:#4e6ca3;color:#fff;border-radius:2px}div.dt-datetime table td.selectable button:hover{background:#ff8000;color:#fff;border-radius:2px}div.dt-datetime table td.dt-datetime-week{font-size:.7em}div.dt-datetime table button{width:100%;box-sizing:border-box;border:none;background:transparent;font-size:inherit;color:inherit;text-align:center;padding:4px 0;cursor:pointer;margin:0}div.dt-datetime table button span{display:inline-block;min-width:14px;text-align:right}div.dt-datetime table.weekNumber th{width:12.5%}div.dt-datetime div.dt-datetime-calendar table{margin-top:0}div.dt-datetime div.dt-datetime-label{position:relative;display:inline-block;height:30px;padding:5px 6px;border:1px solid transparent;box-sizing:border-box;cursor:pointer}div.dt-datetime div.dt-datetime-label:hover{border:1px solid #ddd;border-radius:2px;background-color:#f5f5f5}div.dt-datetime div.dt-datetime-label select{position:absolute;top:6px;left:0;cursor:pointer;opacity:0}div.dt-datetime.horizontal{width:550px}div.dt-datetime.horizontal div.dt-datetime-date,div.dt-datetime.horizontal div.dt-datetime-time{width:48%}div.dt-datetime.horizontal div.dt-datetime-time{margin-left:4%}div.dt-datetime div.dt-datetime-date{position:relative;float:left;width:100%}div.dt-datetime div.dt-datetime-time{position:relative;float:left;width:100%;text-align:center}div.dt-datetime div.dt-datetime-time>span{vertical-align:middle}div.dt-datetime div.dt-datetime-time th{text-align:left}div.dt-datetime div.dt-datetime-time div.dt-datetime-timeblock{display:inline-block;vertical-align:middle}div.dt-datetime div.dt-datetime-iconLeft,div.dt-datetime div.dt-datetime-iconRight{width:30px;height:30px;background-position:center;background-repeat:no-repeat;opacity:.3;overflow:hidden;box-sizing:border-box;border:1px solid transparent}div.dt-datetime div.dt-datetime-iconLeft:hover,div.dt-datetime div.dt-datetime-iconRight:hover{border:1px solid #ccc;border-radius:2px;background-color:#f0f0f0;opacity:.6}div.dt-datetime div.dt-datetime-iconLeft button,div.dt-datetime div.dt-datetime-iconRight button{border:none;background:transparent;text-indent:30px;height:100%;width:100%;cursor:pointer}div.dt-datetime div.dt-datetime-iconLeft{position:absolute;top:5px;left:5px}div.dt-datetime div.dt-datetime-iconLeft button{position:relative;z-index:1}div.dt-datetime div.dt-datetime-iconLeft:after{position:absolute;top:7px;left:10px;display:block;content:"";border-top:7px solid transparent;border-right:7px solid black;border-bottom:7px solid transparent}div.dt-datetime div.dt-datetime-iconRight{position:absolute;top:5px;right:5px}div.dt-datetime div.dt-datetime-iconRight button{position:relative;z-index:1}div.dt-datetime div.dt-datetime-iconRight:after{position:absolute;top:7px;left:12px;display:block;content:"";border-top:7px solid transparent;border-left:7px solid black;border-bottom:7px solid transparent}div.dt-datetime-error{clear:both;padding:0 1em;max-width:240px;font-size:11px;line-height:1.25em;text-align:center;color:#b11f1f}html.dark input.dt-datetime{color-scheme:dark}html.dark div.dt-datetime{border:1px solid #595b5e;background-color:#212529;box-shadow:3px 4px 10px 1px #000c}html.dark div.dt-datetime table th{color:#ccc}html.dark div.dt-datetime table td{color:#eee}html.dark div.dt-datetime table td.selectable{background:#373c41}html.dark div.dt-datetime table td.selectable.disabled,html.dark div.dt-datetime table td.selectable.disabled button:hover{color:#aaa;background:#171b1f}html.dark div.dt-datetime table td.selectable.now{background:#4b5055}html.dark div.dt-datetime table td.selectable.selected button{background:#6ea8fe;color:#000}html.dark div.dt-datetime table td.selectable button:hover{background:#ff8000;color:#000}html.dark div.dt-datetime div.dt-datetime-label:hover,html.dark div.dt-datetime div.dt-datetime-iconLeft:hover,html.dark div.dt-datetime div.dt-datetime-iconRight:hover,html.dark div.dt-datetime div.dt-datetime-iconUp:hover,html.dark div.dt-datetime div.dt-datetime-iconDown:hover{border:1px solid transparent;background-color:#ffffff1a}html.dark div.dt-datetime div.dt-datetime-iconLeft:after{border-right-color:#fff}html.dark div.dt-datetime div.dt-datetime-iconRight:after{border-left-color:#fff}html.dark div.dt-datetime select{color-scheme:dark}html.dark div.dt-datetime-error{color:#b11f1f}div.dt-button-collection{overflow:visible!important;z-index:2002!important}div.dt-button-collection div.dtsb-searchBuilder{padding-left:1em!important;padding-right:1em!important}div.dt-button-collection.dtb-collection-closeable div.dtsb-titleRow{padding-right:40px}.dtsb-greyscale{border:1px solid #cecece!important}div.dtsb-logicContainer .dtsb-greyscale{border:none!important}div.dtsb-searchBuilder{justify-content:space-evenly;cursor:default;margin-bottom:1em;text-align:left;width:100%}div.dtsb-searchBuilder button.dtsb-button,div.dtsb-searchBuilder select{font-size:1em}div.dtsb-searchBuilder div.dtsb-titleRow{justify-content:space-evenly;margin-bottom:.5em}div.dtsb-searchBuilder div.dtsb-titleRow div.dtsb-title{display:inline-block;padding-top:14px}div.dtsb-searchBuilder div.dtsb-titleRow div.dtsb-title:empty{display:inline}div.dtsb-searchBuilder div.dtsb-titleRow button.dtsb-clearAll{float:right;margin-bottom:.8em}div.dtsb-searchBuilder div.dtsb-vertical .dtsb-value,div.dtsb-searchBuilder div.dtsb-vertical .dtsb-data,div.dtsb-searchBuilder div.dtsb-vertical .dtsb-condition{display:block}div.dtsb-searchBuilder div.dtsb-group{position:relative;clear:both;margin-bottom:.8em}div.dtsb-searchBuilder div.dtsb-group button.dtsb-search{float:right}div.dtsb-searchBuilder div.dtsb-group button.dtsb-clearGroup{margin:2px;text-align:center;padding:0}div.dtsb-searchBuilder div.dtsb-group div.dtsb-logicContainer{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg);position:absolute;margin-top:.8em;margin-right:.8em}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria{margin-bottom:.8em;display:flex;justify-content:start;flex-flow:row wrap}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria select.dtsb-dropDown,div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria input.dtsb-input{padding:.4em;margin-right:.8em;min-width:5em;max-width:20em;color:inherit;font-size:1em}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria select.dtsb-dropDown option.dtsb-notItalic,div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria input.dtsb-input option.dtsb-notItalic{font-style:normal}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria select.dtsb-italic{font-style:italic}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-inputCont{flex:1;white-space:nowrap}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-inputCont span.dtsb-joiner{margin-right:.8em}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-inputCont input.dtsb-value{width:33%}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-inputCont select,div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-inputCont input{height:100%;box-sizing:border-box}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-buttonContainer{margin-left:auto;display:inline-block}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-buttonContainer button.dtsb-delete,div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-buttonContainer button.dtsb-right,div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-buttonContainer button.dtsb-left{margin-right:.8em}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-buttonContainer button.dtsb-delete:last-child,div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-buttonContainer button.dtsb-right:last-child,div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-buttonContainer button.dtsb-left:last-child{margin-right:0}@media screen and (max-width: 550px){div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria{display:flex;flex-flow:none;flex-direction:column;justify-content:start;padding-right:calc(35px + .8em);margin-bottom:0}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria:not(:first-child),div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria:not(:nth-child(2)),div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria:not(:last-child){padding-top:.8em}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria:first-child,div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria:nth-child(2),div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria:last-child{padding-top:0}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria select.dtsb-dropDown,div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria input.dtsb-input{max-width:none;width:100%;margin-bottom:.8em;margin-right:.8em}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-inputCont{margin-right:.8em}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-buttonContainer{position:absolute;width:35px;display:flex;flex-wrap:wrap-reverse;right:0}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-buttonContainer button{margin-right:0!important}}div.dtsb-searchBuilder button,div.dtsb-searchBuilder select.dtsb-dropDown,div.dtsb-searchBuilder input{background-color:#f9f9f9}div.dtsb-searchBuilder button.dtsb-button{position:relative;display:inline-block;box-sizing:border-box;padding:.5em 1em;border:1px solid rgba(0,0,0,.3);border-radius:2px;cursor:pointer;font-size:.88em;line-height:1.6em;color:inherit;white-space:nowrap;overflow:hidden;background-color:#0000001a;background:linear-gradient(to bottom,#e6e6e61a,#0000001a);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-decoration:none;outline:none;text-overflow:ellipsis}div.dtsb-searchBuilder button.dtsb-button:hover{background-color:#cecece;cursor:pointer}div.dtsb-searchBuilder div.dtsb-logicContainer{border:1px solid rgba(0,0,0,.3);background-color:#0000001a;background:linear-gradient(to right,#e6e6e61a,#0000001a)}div.dtsb-searchBuilder div.dtsb-logicContainer button{border:1px solid transparent;background:transparent}div.dtsb-searchBuilder button.dtsb-clearGroup{min-width:2em;padding:0}div.dtsb-searchBuilder button.dtsb-iptbtn{min-width:100px;text-align:left}div.dtsb-searchBuilder div.dtsb-group div.dtsb-logicContainer{border:1px solid;border-color:#cecece;border-radius:3px;display:flex;flex-direction:row;flex-wrap:wrap;justify-content:flex-start;align-content:flex-start;align-items:flex-start}div.dtsb-searchBuilder div.dtsb-group div.dtsb-logicContainer button.dtsb-logic{border:none;border-radius:0;flex-grow:1;flex-shrink:0;flex-basis:3em;margin:0}div.dtsb-searchBuilder div.dtsb-group div.dtsb-logicContainer button.dtsb-clearGroup{border:none;border-radius:0;width:2em;margin:0}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria select.dtsb-dropDown,div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria input.dtsb-input{border:1px solid;border-radius:3px}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria select.dtsb-condition{border-color:#48b13c}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria select.dtsb-data{border-color:#e70f00}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria select.dtsb-value,div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria input.dtsb-value{border-color:#0069ba}html.dark div.dtsb-searchBuilder button.dtsb-button,html.dark div.dtsb-searchBuilder select.dtsb-dropDown,html.dark div.dtsb-searchBuilder input.dtsb-input{background-color:#424549!important;color-scheme:dark}html.dark div.dtsb-searchBuilder button.dtsb-button{border:1px solid rgb(89,91,94);background:#ffffff26}html.dark div.dtsb-searchBuilder button.dtsb-button:hover{background:#b3b3b326}html.dark div.dtsb-searchBuilder div.dtsb-logicContainer{border:1px solid rgb(89,91,94)}html.dark div.dtsb-searchBuilder .dtsb-greyscale{border-color:#fff3!important}div.dtsp-topRow{display:flex;flex-direction:row;flex-wrap:nowrap;border:2px solid rgba(0,0,0,0);border-radius:3px;justify-content:space-around;align-content:flex-start;align-items:flex-start}div.dtsp-topRow input.dtsp-search{text-overflow:ellipsis;min-width:50px;flex-basis:90px;max-width:none}div.dtsp-topRow input.dtsp-search::placeholder{color:inherit}div.dtsp-topRow div.dtsp-subRow1{display:flex;flex-direction:row;flex-wrap:nowrap;flex:1 1 auto}div.dtsp-topRow div.dtsp-subRow1 div.dtsp-searchCont{position:relative;width:100%}div.dtsp-topRow div.dtsp-subRow1 input{padding-right:2em;width:100%!important;box-sizing:border-box;font-size:1em}div.dtsp-topRow div.dtsp-subRow1 input[disabled=disabled]{background-color:transparent;border:none;cursor:initial;box-shadow:none;padding-bottom:0;padding-top:0;min-height:1em;height:fit-content;box-sizing:content-box}div.dtsp-topRow div.dtsp-subRow1 input[disabled=disabled]::placeholder{color:initial;opacity:1}div.dtsp-topRow div.dtsp-subRow1 button.dtsp-searchIcon{position:absolute;top:0;right:0;bottom:0}div.dtsp-topRow div.dtsp-subRow1 button.dtsp-searchIcon span{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAABbmlDQ1BpY2MAACiRdZE7SwNBFIU/EyWikRRaiFhsoWKhEBREO42FTZAQFYza7G5eQhKX3QQJtoKNhWAh2vgq/AfaCrYKgqAIIhb+Al+NhPVOEkiQZJbZ+3FmzmXmDHjCGTPrtAYhm8vb0bmQthxb0Xzv+PHRxRSabjrWTCQSpun4eaRF1YdR1av5voajM55wTGhpF54wLTsvPC0c3sxbineFe8y0Hhc+ER6x5YDCt0o3KvymOFXhL8X2YnQWPKqnlqpjo47NtJ0VHhYeyGYKZvU86ib+RG5pQWqfzH4coswRQsOgwDoZ8oxKzUlmjX3Bsm+eDfGY8rcoYosjRVq8I6IWpGtCalL0hHwZiir3/3k6yfGxSnd/CNpeXfdzEHz7UNpz3d9T1y2dgfcFrnM1/4bkNPkt+l5NGziGwDZc3tQ04wCudqD32dJtvSx5ZXqSSfi4gK4YdN9Dx2olq+o650+wuCVPdAeHRzAk+wNrfw8JaBFXEnV+AAAACXBIWXMAAA9hAAAPYQGoP6dpAAABMUlEQVQoU6XRr0vDQRjH8akoM4iIjqGoOIZ5oIjB5XWxajaYDGLSIhhNYjcPRDSJwbQNw+L+BNGgYYo/5pT5/shz8vDlBgMPXux7z3N3z+25VOofYyCyd4ZYCavI4gXPsRp9LqiDdrEMH+8wv8Vh8gBfWclFPOEUN3hAHjlMoRa7wTzBS5xgKLFglPkZLjDic6HyDsEMNvGR2Nxifoci3tEI+X770JU0XmPXIlax+LTPh83fFox1X6kxyzdjm9UcdXi9S+Vti6svfyNULhNR9TVsYNhW6Ff9KKCNR7/Zv6eeaQ+6+qcdpu9BqGlp1HFgud+FYdzzUcUExu0Q/cdzHGEFetIlXKPjK/sbqYoOftMiS+j9jzEJPd1Wt+5+kdR/9EM9ucIC5jCbyPc01Q32kfsBppYz3hYFcCwAAAAASUVORK5CYII=)!important;background-repeat:no-repeat;background-position:center;background-size:12px}div.dtsp-topRow div.dtsp-subRow2{white-space:nowrap;flex:0 0 auto}div.dtsp-topRow button>span{display:inline-block;height:100%;width:100%}div.dtsp-topRow button.dtsp-nameButton span{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAjCAYAAAAe2bNZAAABcGlDQ1BpY2MAACiRdZHNSwJBGMYftTDS8FCHkA57sOigIAXRMQzyYh3UIKvL7rirwe66zK6IdA26dBA6RF36OvQf1DXoWhAERRAR9B/0dQnZ3nEFJXSG2ffHs/O8zDwD+DM6M+yBJGCYDs+mU9JaYV0KviNMM4QoEjKzreXcUh59x88jfKI+JESv/vt6jlBRtRngGyKeYxZ3iBeIMzXHErxHPMbKcpH4hDjO6YDEt0JXPH4TXPL4SzDPZxcBv+gplbpY6WJW5gbxNHHM0KusfR5xk7BqruaoRmlNwEYWaaQgQUEVW9DhIEHVpMx6+5It3woq5GH0tVAHJ0cJZfLGSa1SV5WqRrpKU0dd5P4/T1ubnfG6h1PA4Kvrfk4CwX2g2XDd31PXbZ4BgRfg2uz4K5TT/DfpjY4WOwYiO8DlTUdTDoCrXWD82ZK53JICtPyaBnxcACMFYPQeGN7wsmr/x/kTkN+mJ7oDDo+AKdof2fwDCBRoDkL8UccAAAAJcEhZcwAAD2EAAA9hAag/p2kAAAK2SURBVFgJ7ZY9j41BFICvryCExrJBQ6HyEYVEIREaUZDQIRoR2ViJKCioxV+gkVXYTVZEQiEUhG2EQnxUCh0FKolY4ut5XnM2cyfva3Pt5m7EPcmzZ2bemTNnzjkzd1utnvQi0IvAfxiBy5z5FoxO89kPY+8mbMjtzs47RXs5/WVpbAG6bWExt5PuIibvhVkwmC+ck3eK9ln6/fAddFojYzBVuYSBpcnIEvRaqOw2RcaN18FPuJH0JvRUxbT3wWf4ltiKPgfVidWlbGZgPozDFfgAC+EA/K2EI4cwcAJ+gPaeQ+VQU2SOMMGcPgPl/m/V2p50rrbRsRgt9Iv5h6xtpP22Bz7Ce1C+gFFxfKzOmShcU+Qmyh2w3w8rIJfddHTck66EukL/xPhj+JM8rHNmFys0Pg4v0up3aFNlwR9NYyodd3OL/C64zpsymcTFcf6ElM4YzjAWKYrJkaq8kE/yUYNP4BoYvS1QRo+hNtF5xfkTUjoTheukSFFMjlTFm6PjceOca/SMpKfeCR1L6Uzk/y2WIkVhNFJlJAZhP+hYns7b9D3IPuhY5mYrIv8OrQJvR5NYyNaW4jsU8pSGNySiVx4o5tXq3JkoXE/mg5R/M8dGJCJpKhaDcjBRdbI/Rm8g69c122om33BHmj2CHoV5qa9jUXBraJ+G1fAVjIBO1klc87ro1K4JZ/K35SWW3TwcyDd6TecqnAEd8cGq2+w84xvBm1n3vS0izKkkwh5XNC/GmFPqqAtPF89AOScKuemaNzoTV1SD5dtSbmLf1/RV+tC0WTgcj6R7HEtrVGWaqu/lYDZ/2pvxQ/kIyw/gFByHC9AHw910hv1aUUumyd8yy0QfhmEkfiNod0Xusct68J1qc8Tdux0Z97Q+hsDb+AYGYEbF/4Guw2Q/qDPqZG/zXgT+3Qj8AtKnfWhFwmuAAAAAAElFTkSuQmCC)!important;background-repeat:no-repeat;background-position:center;background-size:23px;vertical-align:bottom}div.dtsp-topRow button.dtsp-countButton span{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAABcGlDQ1BpY2MAACiRdZHNSwJBGMYftTDS8FCHkA57sOigIAXRMQzyYh3UIKvL7rirwe66zK6IdA26dBA6RF36OvQf1DXoWhAERRAR9B/0dQnZ3nEFJXSG2ffHs/O8zDwD+DM6M+yBJGCYDs+mU9JaYV0KviNMM4QoEjKzreXcUh59x88jfKI+JESv/vt6jlBRtRngGyKeYxZ3iBeIMzXHErxHPMbKcpH4hDjO6YDEt0JXPH4TXPL4SzDPZxcBv+gplbpY6WJW5gbxNHHM0KusfR5xk7BqruaoRmlNwEYWaaQgQUEVW9DhIEHVpMx6+5It3woq5GH0tVAHJ0cJZfLGSa1SV5WqRrpKU0dd5P4/T1ubnfG6h1PA4Kvrfk4CwX2g2XDd31PXbZ4BgRfg2uz4K5TT/DfpjY4WOwYiO8DlTUdTDoCrXWD82ZK53JICtPyaBnxcACMFYPQeGN7wsmr/x/kTkN+mJ7oDDo+AKdof2fwDCBRoDkL8UccAAAAJcEhZcwAAD2EAAA9hAag/p2kAAAG5SURBVEgN3VU9LwVBFF0fiYhofUSlEQkKhU7z/oBCQkIiGr9BgUbhVzy9BAnhFyjV/AYFiU5ICM7ZN+c5Zud5dm3lJmfmzrkz9+7cu3c3y/6jjOBSF8CxXS7FmTkbwqIJjDpJvTcmsJ4K3KPZUpyZsx0sxoB9J6mnAkyC7wGuuCFIipNtEcpcWExgXpOBc78vgj6N+QO4NVsjwdFM59tUIDxDrHMBOeIQ34C5ZDregXuAQm4YcI68nN9B3wr2PcwPAIPkN2EqtJH6b+QZm1ajjTx7BqwAr26Lb+C2Kvpbt0Mb2HAJ7NrGFGfmXO3DeA4UshDfQAVmH0gaUFg852TTTDvlxwBlCtxy9zXyBhQFaq0wMmIdRebrfgosA3zb2hKnqG0oqchp4QbuR8X0TjzABhbdOT8jnQ/atcgqpnfwOA7yqZyTU587ZkIGdesLTt2EkynOnbreMUUKMI/dA4B/QVOcO13CQh+5wWCgDwo/75u59odB/wjmfhbgvACcAOyZPHihMWAoIwxyCLgf1oxfgjzVbgBXSTzIN+f0pg6s5DkcesLMRpsBrgE2XO3CN64JFP7JtUeKHX4CKtRRXFZ+7dEAAAAASUVORK5CYII=)!important;background-repeat:no-repeat;background-position:center;background-size:18px;vertical-align:bottom}div.dtsp-topRow button.dtsp-collapseButton span.dtsp-caret{position:relative;top:9px;display:inline-block}div.dtsp-topRow button.dtsp-collapseButton.dtsp-rotated{transform:rotate(180deg)}div.dtsp-searchPane table thead th,div.dtsp-searchPane table thead td{width:100%!important}div.dt-button-collection{z-index:2002}div.dt-button-collection.dtb-collection-closeable div.dtsp-titleRow{padding-right:25px}div.dtsp-columns-1{max-width:100%;min-width:100%;margin:0!important}div.dtsp-columns-2{max-width:49%;min-width:49%;margin:0!important}div.dtsp-columns-3{max-width:32%;min-width:32%;margin:0!important}div.dtsp-columns-4{max-width:24%;min-width:24%;margin:0!important}div.dtsp-columns-5{max-width:19%;min-width:19%;margin:0!important}div.dtsp-columns-6{max-width:16%;min-width:16%;margin:0!important}div.dtsp-columns-7{max-width:14%;min-width:14%;margin:0!important}div.dtsp-columns-8{max-width:12%;min-width:12%;margin:0!important}div.dtsp-columns-9{max-width:10.5%;min-width:10.5%;margin:0!important}div.dtsp-narrow{flex-direction:column!important}div.dtsp-narrow div.dtsp-subRow1,div.dtsp-narrow div.dtsp-subRow2{width:100%}div.dtsp-narrow div.dtsp-subRow2 button{margin:0!important;width:25%!important}div.dt-button-collection div.dtsp-panesContainer{padding-left:1em;padding-right:1em;margin-bottom:0}div.dtsp-panesContainer{margin-bottom:1em}div.dtsp-searchPane div.dt-container,div.dtsp-searchPane div.dataTables_wrapper{width:100%}div.dtsp-searchPane div.dt-container div.dataTables_layout_cell,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_layout_cell{padding:0}div.dtsp-searchPane div.dt-container div.dt-scroll-head,div.dtsp-searchPane div.dt-container div.dataTables_scrollHead,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-head,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollHead{display:none!important}div.dtsp-searchPane div.dt-container div.dt-scroll-body,div.dtsp-searchPane div.dt-container div.dataTables_scrollBody,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody{background:#fff!important;border:none}div.dtsp-searchPane div.dt-container div.dt-scroll-body thead,div.dtsp-searchPane div.dt-container div.dataTables_scrollBody thead,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body thead,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody thead{display:none}div.dtsp-searchPane div.dt-container div.dt-scroll-body table tr>th,div.dtsp-searchPane div.dt-container div.dt-scroll-body table tr>td,div.dtsp-searchPane div.dt-container div.dataTables_scrollBody table tr>th,div.dtsp-searchPane div.dt-container div.dataTables_scrollBody table tr>td,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body table tr>th,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body table tr>td,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody table tr>th,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody table tr>td{padding:5px 10px}div.dtsp-searchPane div.dt-container div.dt-scroll-body td.dtsp-nameColumn,div.dtsp-searchPane div.dt-container div.dataTables_scrollBody td.dtsp-nameColumn,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body td.dtsp-nameColumn,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody td.dtsp-nameColumn{width:100%!important}div.dtsp-searchPane div.dt-container div.dt-scroll-body div.dtsp-nameCont,div.dtsp-searchPane div.dt-container div.dataTables_scrollBody div.dtsp-nameCont,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body div.dtsp-nameCont,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody div.dtsp-nameCont{width:100%;display:flex;flex-direction:row;justify-content:flex-start;align-content:flex-start;align-items:flex-start}div.dtsp-searchPane div.dt-container div.dt-scroll-body div.dtsp-nameCont span.dtsp-name,div.dtsp-searchPane div.dt-container div.dt-scroll-body div.dtsp-nameCont span.dtsp-pill,div.dtsp-searchPane div.dt-container div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-name,div.dtsp-searchPane div.dt-container div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-pill,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body div.dtsp-nameCont span.dtsp-name,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body div.dtsp-nameCont span.dtsp-pill,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-name,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-pill{cursor:default}div.dtsp-searchPane div.dt-container div.dt-scroll-body div.dtsp-nameCont span.dtsp-name,div.dtsp-searchPane div.dt-container div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-name,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body div.dtsp-nameCont span.dtsp-name,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-name{text-overflow:ellipsis;overflow:hidden;display:inline-block;vertical-align:middle;white-space:nowrap;flex-grow:1;text-align:left}div.dtsp-searchPane div.dt-container div.dt-scroll-body div.dtsp-nameCont span.dtsp-pill,div.dtsp-searchPane div.dt-container div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-pill,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body div.dtsp-nameCont span.dtsp-pill,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-pill{display:inline-block;background-color:#cfcfcf;text-align:center;border-radius:10px;width:auto;min-width:30px;color:#000;font-size:.9em;padding:0 4px}div.dtsp-searchPane div.dt-container div.dt-scroll-body div.dtsp-nameCont span.dtsp-pill:empty,div.dtsp-searchPane div.dt-container div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-pill:empty,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body div.dtsp-nameCont span.dtsp-pill:empty,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-pill:empty{display:none}div.dtsp-panesContainer{clear:both;padding-left:0;padding-right:0;text-align:center}div.dtsp-panesContainer div.dtsp-searchPanes{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between;align-content:flex-start;align-items:stretch;clear:both;text-align:left}div.dtsp-panesContainer div.dtsp-searchPanes div.dtsp-searchPane{flex-grow:1;flex-shrink:0;font-size:.9em;margin-top:15px!important}div.dtsp-panesContainer div.dtsp-searchPanes div.dtsp-searchPane div.dt-container,div.dtsp-panesContainer div.dtsp-searchPanes div.dtsp-searchPane div.dataTables_wrapper{flex:1;box-sizing:border-box}div.dtsp-panesContainer div.dtsp-searchPanes div.dtsp-searchPane div.dt-container div.dt-search,div.dtsp-panesContainer div.dtsp-searchPanes div.dtsp-searchPane div.dt-container div.dataTables_filter,div.dtsp-panesContainer div.dtsp-searchPanes div.dtsp-searchPane div.dataTables_wrapper div.dt-search,div.dtsp-panesContainer div.dtsp-searchPanes div.dtsp-searchPane div.dataTables_wrapper div.dataTables_filter{display:none}div.dtsp-panesContainer div.dtsp-title{float:left;padding:10px 0}div.dtsp-panesContainer button.dtsp-clearAll,div.dtsp-panesContainer button.dtsp-collapseAll,div.dtsp-panesContainer button.dtsp-showAll{float:right}div.dtsp-hidden{display:none!important}html.dark div.dtsp-topRow div.dtsp-subRow1 div.dtsp-searchCont input[disabled=disabled]::placeholder,html[data-bs-theme=dark] div.dtsp-topRow div.dtsp-subRow1 div.dtsp-searchCont input[disabled=disabled]::placeholder{color:#fff}div.dtsp-searchPane div.dt-container,div.dtsp-searchPane div.dataTables_wrapper{border:1px solid #f0f0f0;border-radius:4px;overflow:hidden}div.dtsp-searchPane div.dt-container:hover,div.dtsp-searchPane div.dataTables_wrapper:hover{border:1px solid #cfcfcf}div.dtsp-searchPane div.dt-container div.dt-scroll,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll{margin:-5px 0}div.dtsp-searchPane div.dt-container table.dataTable,div.dtsp-searchPane div.dataTables_wrapper table.dataTable{border-bottom:none!important}div.dtsp-searchPane div.dtsp-topRow{border:1px solid transparent}div.dtsp-searchPane div.dtsp-topRow div.dtsp-subRow1 input[disabled=disabled]{padding-bottom:5px}div.dtsp-searchPane div.dtsp-topRow div.dtsp-searchCont input.dtsp-search{border:none;padding-left:3px}div.dtsp-searchPane div.dtsp-topRow.dtsp-bordered{border:1px solid #f0f0f0;border-radius:3px}div.dtsp-searchPane div.dtsp-topRow.dtsp-bordered:hover{background-color:#f0f0f0}div.dtsp-searchPane input.dtsp-paneInputButton,div.dtsp-searchPane button.dtsp-paneButton{height:35px;width:35px;min-width:0;display:inline-block;margin:2px 2px 0;border:0px solid transparent;background-color:transparent}div.dtsp-searchPane input.dtsp-paneInputButton:hover,div.dtsp-searchPane button.dtsp-paneButton:hover{background-color:#f0f0f0;border-radius:2px;cursor:pointer}div.dtsp-searchPane button.dtsp-paneButton{vertical-align:middle;opacity:.6}div.dtsp-panesContainer button.dtsp-clearAll,div.dtsp-panesContainer button.dtsp-collapseAll,div.dtsp-panesContainer button.dtsp-showAll{border:1px solid transparent;background-color:transparent}div.dtsp-panesContainer button.dtsp-clearAll:hover,div.dtsp-panesContainer button.dtsp-collapseAll:hover,div.dtsp-panesContainer button.dtsp-showAll:hover{background-color:#f0f0f0;border-radius:2px;cursor:pointer}div.dtsp-panesContainer button.dtsp-disabledButton{cursor:default!important;color:#7c7c7c}div.dtsp-panesContainer button.dtsp-disabledButton:hover{background-color:transparent}div.dtsp-panesContainer button.dtsp-disabledButton:focus{outline:none}@media screen and (max-width: 767px){div.dtsp-columns-4,div.dtsp-columns-5,div.dtsp-columns-6{max-width:31%!important;min-width:31%!important}}@media screen and (max-width: 640px){div.dtsp-searchPanes{flex-direction:column!important}div.dtsp-searchPane{max-width:98%!important;min-width:98%!important}}html.dark div.dtsp-topRow div.dtsp-subRow1 button.dtsp-searchIcon span,html.dark div.dtsp-topRow button.dtsp-nameButton span,html.dark div.dtsp-topRow button.dtsp-countButton span{filter:invert(1)}html.dark div.dtsp-topRow input.dtsp-paneInputButton,html.dark div.dtsp-topRow button.dtsp-paneButton{color:inherit}html.dark div.dtsp-topRow input.dtsp-paneInputButton:hover,html.dark div.dtsp-topRow button.dtsp-paneButton:hover{background-color:#404549}html.dark div.dtsp-topRow.dtsp-bordered{border:1px solid rgba(255,255,255,.2);background:#2f3438!important}html.dark div.dtsp-topRow.dtsp-bordered:hover{border:1px solid rgba(255,255,255,.3)}html.dark div.dtsp-panesContainer button.dtsp-clearAll,html.dark div.dtsp-panesContainer button.dtsp-collapseAll,html.dark div.dtsp-panesContainer button.dtsp-showAll{color:inherit}html.dark div.dtsp-panesContainer button.dtsp-clearAll:hover,html.dark div.dtsp-panesContainer button.dtsp-collapseAll:hover,html.dark div.dtsp-panesContainer button.dtsp-showAll:hover{background-color:#404549}html.dark div.dtsp-panesContainer button.dtsp-disabledButton{color:#7c7c7c}html.dark div.dtsp-searchPane div.dt-container,html.dark div.dtsp-searchPane div.dataTables_wrapper{border:1px solid rgba(255,255,255,.2)}html.dark div.dtsp-searchPane div.dt-container:hover,html.dark div.dtsp-searchPane div.dataTables_wrapper:hover{border:1px solid rgba(255,255,255,.3)}html.dark div.dtsp-searchPane div.dt-container div.dt-scroll-body,html.dark div.dtsp-searchPane div.dt-container div.dataTables_scrollBody,html.dark div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body,html.dark div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody{background:#2f3438!important}html.dark div.dtsp-searchPane div.dt-container div.dt-scroll-body div.dtsp-nameCont span.dtsp-pill,html.dark div.dtsp-searchPane div.dt-container div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-pill,html.dark div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body div.dtsp-nameCont span.dtsp-pill,html.dark div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-pill{background-color:#212529;color:inherit}table.dataTable>tbody>tr>.selected{background-color:#0d6efde6;color:#fff}table.dataTable>tbody>tr>.dt-select{text-align:center;vertical-align:middle}table.dataTable>thead>tr>.dt-select{text-align:center}table.dataTable input.dt-select-checkbox{appearance:none;position:relative;display:inline-block;width:12px;height:12px;border:1px solid;border-radius:3px;vertical-align:middle;margin-top:1px;color:inherit;font-size:20px;line-height:1em}table.dataTable input.dt-select-checkbox:checked:after{display:block;content:"\2713";margin-top:-8px}table.dataTable input.dt-select-checkbox:indeterminate:after{display:block;position:absolute;content:" ";top:3px;left:3px;height:4px;width:4px;background-color:#000;border-radius:2px}table.dataTable>tbody>tr.selected input.dt-select-checkbox:checked{border:1px solid}table.dataTable>tbody>tr>td.select-checkbox,table.dataTable>tbody>tr>th.select-checkbox{position:relative}table.dataTable>tbody>tr>td.select-checkbox:before,table.dataTable>tbody>tr>th.select-checkbox:before{display:block;position:absolute;top:50%;left:50%;width:12px;height:12px;box-sizing:border-box;content:" ";margin-top:-6px;margin-left:-6px;border:1px solid;border-radius:3px}table.dataTable>tbody>tr.selected>td.select-checkbox:before,table.dataTable>tbody>tr.selected>th.select-checkbox:before{border:1px solid;content:"\2713";font-size:20px;line-height:6px;text-align:center}table.dataTable.compact>tbody>tr>td.select-checkbox:before,table.dataTable.compact>tbody>tr>th.select-checkbox:before{margin-top:-12px}table.dataTable.compact>tbody>tr.selected>td.select-checkbox:after,table.dataTable.compact>tbody>tr.selected>th.select-checkbox:after{margin-top:-16px}div.dt-container span.select-info,div.dt-container span.select-item{margin-left:.5em}html.dark table.dataTable input.dt-select-checkbox:indeterminate:after,html[data-bs-theme=dark] table.dataTable input.dt-select-checkbox:indeterminate:after{background-color:#fff}@media screen and (max-width: 640px){div.dt-container span.select-info,div.dt-container span.select-item{margin-left:0;display:block}}div.dt-container{max-width:100%}div.dt-layout-table>div{overflow:auto;max-width:100%}
</style>
<div id="itables_init_notebook_mode_394070e8_4660_44d6_a393_3fa82ccbdee7" style="vertical-align:middle; text-align:left">
<div style="float:left; margin-right: 10px;">
<a href="https://mwouts.github.io/itables/"><svg class="main-svg" xmlns="http://www.w3.org/2000/svg" xlink="http://www.w3.org/1999/xlink" width="64" viewbox="0 0 500 400" style="font-family: 'Droid Sans', sans-serif;">
<g style="fill:#d9d7fc">
<path d="M100,400H500V357H100Z"></path>
<path d="M100,300H400V257H100Z"></path>
<path d="M0,200H400V157H0Z"></path>
<path d="M100,100H500V57H100Z"></path>
<path d="M100,350H500V307H100Z"></path>
<path d="M100,250H400V207H100Z"></path>
<path d="M0,150H400V107H0Z"></path>
<path d="M100,50H500V7H100Z"></path>
</g>
<g style="fill:#1a1366;stroke:#1a1366;">
<rect x="100" y="7" width="400" height="43">
<animate attributename="width" values="0;400;0" dur="5s" repeatcount="indefinite"></animate>
<animate attributename="x" values="100;100;500" dur="5s" repeatcount="indefinite"></animate>
</rect>
<rect x="0" y="107" width="400" height="43">
<animate attributename="width" values="0;400;0" dur="3.5s" repeatcount="indefinite"></animate>
<animate attributename="x" values="0;0;400" dur="3.5s" repeatcount="indefinite"></animate>
</rect>
<rect x="100" y="207" width="300" height="43">
<animate attributename="width" values="0;300;0" dur="3s" repeatcount="indefinite"></animate>
<animate attributename="x" values="100;100;400" dur="3s" repeatcount="indefinite"></animate>
</rect>
<rect x="100" y="307" width="400" height="43">
<animate attributename="width" values="0;400;0" dur="4s" repeatcount="indefinite"></animate>
<animate attributename="x" values="100;100;500" dur="4s" repeatcount="indefinite"></animate>
</rect>
<g style="fill:transparent;stroke-width:8; stroke-linejoin:round" rx="5">
<g transform="translate(45 50) rotate(-45)">
<circle r="33" cx="0" cy="0"></circle>
<rect x="-8" y="32" width="16" height="30"></rect>
</g>
<g transform="translate(450 152)">
<polyline points="-15,-20 -35,-20 -35,40 25,40 25,20"></polyline>
<rect x="-15" y="-40" width="60" height="60"></rect>
</g>
<g transform="translate(50 352)">
<polygon points="-35,-5 0,-40 35,-5"></polygon>
<polygon points="-35,10 0,45 35,10"></polygon>
</g>
<g transform="translate(75 250)">
<polyline points="-30,30 -60,0 -30,-30"></polyline>
<polyline points="0,30 -30,0 0,-30"></polyline>
</g>
<g transform="translate(425 250) rotate(180)">
<polyline points="-30,30 -60,0 -30,-30"></polyline>
<polyline points="0,30 -30,0 0,-30"></polyline>
</g>
</g>
</g>
</svg>
</a>
</div>
<div>
This is the <code>init_notebook_mode</code> cell from ITables v2.1.5<br>
(you should not see this message - is your notebook <it>trusted</it>?)
</div>
</div>
<script>
window._datatables_src_for_itables_2_1_5 = "data:text/javascript;base64,dmFyIHFvPU9iamVjdC5jcmVhdGU7dmFyIE5hPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgWG89T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjt2YXIgWW89T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7dmFyICRvPU9iamVjdC5nZXRQcm90b3R5cGVPZixabz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBabj0odD0+dHlwZW9mIHJlcXVpcmU8InUiP3JlcXVpcmU6dHlwZW9mIFByb3h5PCJ1Ij9uZXcgUHJveHkodCx7Z2V0OihlLG4pPT4odHlwZW9mIHJlcXVpcmU8InUiP3JlcXVpcmU6ZSlbbl19KTp0KShmdW5jdGlvbih0KXtpZih0eXBlb2YgcmVxdWlyZTwidSIpcmV0dXJuIHJlcXVpcmUuYXBwbHkodGhpcyxhcmd1bWVudHMpO3Rocm93IEVycm9yKCdEeW5hbWljIHJlcXVpcmUgb2YgIicrdCsnIiBpcyBub3Qgc3VwcG9ydGVkJyl9KTt2YXIgT2E9KHQsZSk9PigpPT4oZXx8dCgoZT17ZXhwb3J0czp7fX0pLmV4cG9ydHMsZSksZS5leHBvcnRzKTt2YXIgS289KHQsZSxuLHIpPT57aWYoZSYmdHlwZW9mIGU9PSJvYmplY3QifHx0eXBlb2YgZT09ImZ1bmN0aW9uIilmb3IobGV0IHMgb2YgWW8oZSkpIVpvLmNhbGwodCxzKSYmcyE9PW4mJk5hKHQscyx7Z2V0OigpPT5lW3NdLGVudW1lcmFibGU6IShyPVhvKGUscykpfHxyLmVudW1lcmFibGV9KTtyZXR1cm4gdH07dmFyIGllPSh0LGUsbik9PihuPXQhPW51bGw/cW8oJG8odCkpOnt9LEtvKGV8fCF0fHwhdC5fX2VzTW9kdWxlP05hKG4sImRlZmF1bHQiLHt2YWx1ZTp0LGVudW1lcmFibGU6ITB9KTpuLHQpKTt2YXIgUmE9T2EoKEVhLHBpKT0+eyhmdW5jdGlvbih0KXt0eXBlb2YgRWE9PSJvYmplY3QiJiZ0eXBlb2YgcGk8InUiP3BpLmV4cG9ydHM9dCgpOnR5cGVvZiBkZWZpbmU9PSJmdW5jdGlvbiImJmRlZmluZS5hbWQ/ZGVmaW5lKFtdLHQpOih0eXBlb2Ygd2luZG93PCJ1Ij93aW5kb3c6dHlwZW9mIGdsb2JhbDwidSI/Z2xvYmFsOnR5cGVvZiBzZWxmPCJ1Ij9zZWxmOnRoaXMpLkpTWmlwPXQoKX0pKGZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uIHQoZSxuLHIpe2Z1bmN0aW9uIHModSxwKXtpZighblt1XSl7aWYoIWVbdV0pe3ZhciBiPXR5cGVvZiBabj09ImZ1bmN0aW9uIiYmWm47aWYoIXAmJmIpcmV0dXJuIGIodSwhMCk7aWYoaSlyZXR1cm4gaSh1LCEwKTt2YXIgZz1uZXcgRXJyb3IoIkNhbm5vdCBmaW5kIG1vZHVsZSAnIit1KyInIik7dGhyb3cgZy5jb2RlPSJNT0RVTEVfTk9UX0ZPVU5EIixnfXZhciBtPW5bdV09e2V4cG9ydHM6e319O2VbdV1bMF0uY2FsbChtLmV4cG9ydHMsZnVuY3Rpb24oQyl7dmFyIHk9ZVt1XVsxXVtDXTtyZXR1cm4gcyh5fHxDKX0sbSxtLmV4cG9ydHMsdCxlLG4scil9cmV0dXJuIG5bdV0uZXhwb3J0c31mb3IodmFyIGk9dHlwZW9mIFpuPT0iZnVuY3Rpb24iJiZabixvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30oezE6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgiLi91dGlscyIpLHM9dCgiLi9zdXBwb3J0IiksaT0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iO24uZW5jb2RlPWZ1bmN0aW9uKG8pe2Zvcih2YXIgdSxwLGIsZyxtLEMseSxUPVtdLFA9MCxjPW8ubGVuZ3RoLGw9YyxoPXIuZ2V0VHlwZU9mKG8pIT09InN0cmluZyI7UDxvLmxlbmd0aDspbD1jLVAsYj1oPyh1PW9bUCsrXSxwPVA8Yz9vW1ArK106MCxQPGM/b1tQKytdOjApOih1PW8uY2hhckNvZGVBdChQKyspLHA9UDxjP28uY2hhckNvZGVBdChQKyspOjAsUDxjP28uY2hhckNvZGVBdChQKyspOjApLGc9dT4+MixtPSgzJnUpPDw0fHA+PjQsQz0xPGw/KDE1JnApPDwyfGI+PjY6NjQseT0yPGw/NjMmYjo2NCxULnB1c2goaS5jaGFyQXQoZykraS5jaGFyQXQobSkraS5jaGFyQXQoQykraS5jaGFyQXQoeSkpO3JldHVybiBULmpvaW4oIiIpfSxuLmRlY29kZT1mdW5jdGlvbihvKXt2YXIgdSxwLGIsZyxtLEMseT0wLFQ9MCxQPSJkYXRhOiI7aWYoby5zdWJzdHIoMCxQLmxlbmd0aCk9PT1QKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBiYXNlNjQgaW5wdXQsIGl0IGxvb2tzIGxpa2UgYSBkYXRhIHVybC4iKTt2YXIgYyxsPTMqKG89by5yZXBsYWNlKC9bXkEtWmEtejAtOSsvPV0vZywiIikpLmxlbmd0aC80O2lmKG8uY2hhckF0KG8ubGVuZ3RoLTEpPT09aS5jaGFyQXQoNjQpJiZsLS0sby5jaGFyQXQoby5sZW5ndGgtMik9PT1pLmNoYXJBdCg2NCkmJmwtLSxsJTEhPTApdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGJhc2U2NCBpbnB1dCwgYmFkIGNvbnRlbnQgbGVuZ3RoLiIpO2ZvcihjPXMudWludDhhcnJheT9uZXcgVWludDhBcnJheSgwfGwpOm5ldyBBcnJheSgwfGwpO3k8by5sZW5ndGg7KXU9aS5pbmRleE9mKG8uY2hhckF0KHkrKykpPDwyfChnPWkuaW5kZXhPZihvLmNoYXJBdCh5KyspKSk+PjQscD0oMTUmZyk8PDR8KG09aS5pbmRleE9mKG8uY2hhckF0KHkrKykpKT4+MixiPSgzJm0pPDw2fChDPWkuaW5kZXhPZihvLmNoYXJBdCh5KyspKSksY1tUKytdPXUsbSE9PTY0JiYoY1tUKytdPXApLEMhPT02NCYmKGNbVCsrXT1iKTtyZXR1cm4gY319LHsiLi9zdXBwb3J0IjozMCwiLi91dGlscyI6MzJ9XSwyOltmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPXQoIi4vZXh0ZXJuYWwiKSxzPXQoIi4vc3RyZWFtL0RhdGFXb3JrZXIiKSxpPXQoIi4vc3RyZWFtL0NyYzMyUHJvYmUiKSxvPXQoIi4vc3RyZWFtL0RhdGFMZW5ndGhQcm9iZSIpO2Z1bmN0aW9uIHUocCxiLGcsbSxDKXt0aGlzLmNvbXByZXNzZWRTaXplPXAsdGhpcy51bmNvbXByZXNzZWRTaXplPWIsdGhpcy5jcmMzMj1nLHRoaXMuY29tcHJlc3Npb249bSx0aGlzLmNvbXByZXNzZWRDb250ZW50PUN9dS5wcm90b3R5cGU9e2dldENvbnRlbnRXb3JrZXI6ZnVuY3Rpb24oKXt2YXIgcD1uZXcgcyhyLlByb21pc2UucmVzb2x2ZSh0aGlzLmNvbXByZXNzZWRDb250ZW50KSkucGlwZSh0aGlzLmNvbXByZXNzaW9uLnVuY29tcHJlc3NXb3JrZXIoKSkucGlwZShuZXcgbygiZGF0YV9sZW5ndGgiKSksYj10aGlzO3JldHVybiBwLm9uKCJlbmQiLGZ1bmN0aW9uKCl7aWYodGhpcy5zdHJlYW1JbmZvLmRhdGFfbGVuZ3RoIT09Yi51bmNvbXByZXNzZWRTaXplKXRocm93IG5ldyBFcnJvcigiQnVnIDogdW5jb21wcmVzc2VkIGRhdGEgc2l6ZSBtaXNtYXRjaCIpfSkscH0sZ2V0Q29tcHJlc3NlZFdvcmtlcjpmdW5jdGlvbigpe3JldHVybiBuZXcgcyhyLlByb21pc2UucmVzb2x2ZSh0aGlzLmNvbXByZXNzZWRDb250ZW50KSkud2l0aFN0cmVhbUluZm8oImNvbXByZXNzZWRTaXplIix0aGlzLmNvbXByZXNzZWRTaXplKS53aXRoU3RyZWFtSW5mbygidW5jb21wcmVzc2VkU2l6ZSIsdGhpcy51bmNvbXByZXNzZWRTaXplKS53aXRoU3RyZWFtSW5mbygiY3JjMzIiLHRoaXMuY3JjMzIpLndpdGhTdHJlYW1JbmZvKCJjb21wcmVzc2lvbiIsdGhpcy5jb21wcmVzc2lvbil9fSx1LmNyZWF0ZVdvcmtlckZyb209ZnVuY3Rpb24ocCxiLGcpe3JldHVybiBwLnBpcGUobmV3IGkpLnBpcGUobmV3IG8oInVuY29tcHJlc3NlZFNpemUiKSkucGlwZShiLmNvbXByZXNzV29ya2VyKGcpKS5waXBlKG5ldyBvKCJjb21wcmVzc2VkU2l6ZSIpKS53aXRoU3RyZWFtSW5mbygiY29tcHJlc3Npb24iLGIpfSxlLmV4cG9ydHM9dX0seyIuL2V4dGVybmFsIjo2LCIuL3N0cmVhbS9DcmMzMlByb2JlIjoyNSwiLi9zdHJlYW0vRGF0YUxlbmd0aFByb2JlIjoyNiwiLi9zdHJlYW0vRGF0YVdvcmtlciI6Mjd9XSwzOltmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPXQoIi4vc3RyZWFtL0dlbmVyaWNXb3JrZXIiKTtuLlNUT1JFPXttYWdpYzoiXDBcMCIsY29tcHJlc3NXb3JrZXI6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHIoIlNUT1JFIGNvbXByZXNzaW9uIil9LHVuY29tcHJlc3NXb3JrZXI6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHIoIlNUT1JFIGRlY29tcHJlc3Npb24iKX19LG4uREVGTEFURT10KCIuL2ZsYXRlIil9LHsiLi9mbGF0ZSI6NywiLi9zdHJlYW0vR2VuZXJpY1dvcmtlciI6Mjh9XSw0OltmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPXQoIi4vdXRpbHMiKSxzPWZ1bmN0aW9uKCl7Zm9yKHZhciBpLG89W10sdT0wO3U8MjU2O3UrKyl7aT11O2Zvcih2YXIgcD0wO3A8ODtwKyspaT0xJmk/Mzk4ODI5MjM4NF5pPj4+MTppPj4+MTtvW3VdPWl9cmV0dXJuIG99KCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGksbyl7cmV0dXJuIGkhPT12b2lkIDAmJmkubGVuZ3RoP3IuZ2V0VHlwZU9mKGkpIT09InN0cmluZyI/ZnVuY3Rpb24odSxwLGIsZyl7dmFyIG09cyxDPWcrYjt1Xj0tMTtmb3IodmFyIHk9Zzt5PEM7eSsrKXU9dT4+PjhebVsyNTUmKHVecFt5XSldO3JldHVybi0xXnV9KDB8byxpLGkubGVuZ3RoLDApOmZ1bmN0aW9uKHUscCxiLGcpe3ZhciBtPXMsQz1nK2I7dV49LTE7Zm9yKHZhciB5PWc7eTxDO3krKyl1PXU+Pj44Xm1bMjU1Jih1XnAuY2hhckNvZGVBdCh5KSldO3JldHVybi0xXnV9KDB8byxpLGkubGVuZ3RoLDApOjB9fSx7Ii4vdXRpbHMiOjMyfV0sNTpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtuLmJhc2U2ND0hMSxuLmJpbmFyeT0hMSxuLmRpcj0hMSxuLmNyZWF0ZUZvbGRlcnM9ITAsbi5kYXRlPW51bGwsbi5jb21wcmVzc2lvbj1udWxsLG4uY29tcHJlc3Npb25PcHRpb25zPW51bGwsbi5jb21tZW50PW51bGwsbi51bml4UGVybWlzc2lvbnM9bnVsbCxuLmRvc1Blcm1pc3Npb25zPW51bGx9LHt9XSw2OltmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW51bGw7cj10eXBlb2YgUHJvbWlzZTwidSI/UHJvbWlzZTp0KCJsaWUiKSxlLmV4cG9ydHM9e1Byb21pc2U6cn19LHtsaWU6Mzd9XSw3OltmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPXR5cGVvZiBVaW50OEFycmF5PCJ1IiYmdHlwZW9mIFVpbnQxNkFycmF5PCJ1IiYmdHlwZW9mIFVpbnQzMkFycmF5PCJ1IixzPXQoInBha28iKSxpPXQoIi4vdXRpbHMiKSxvPXQoIi4vc3RyZWFtL0dlbmVyaWNXb3JrZXIiKSx1PXI/InVpbnQ4YXJyYXkiOiJhcnJheSI7ZnVuY3Rpb24gcChiLGcpe28uY2FsbCh0aGlzLCJGbGF0ZVdvcmtlci8iK2IpLHRoaXMuX3Bha289bnVsbCx0aGlzLl9wYWtvQWN0aW9uPWIsdGhpcy5fcGFrb09wdGlvbnM9Zyx0aGlzLm1ldGE9e319bi5tYWdpYz0iXGJcMCIsaS5pbmhlcml0cyhwLG8pLHAucHJvdG90eXBlLnByb2Nlc3NDaHVuaz1mdW5jdGlvbihiKXt0aGlzLm1ldGE9Yi5tZXRhLHRoaXMuX3Bha289PT1udWxsJiZ0aGlzLl9jcmVhdGVQYWtvKCksdGhpcy5fcGFrby5wdXNoKGkudHJhbnNmb3JtVG8odSxiLmRhdGEpLCExKX0scC5wcm90b3R5cGUuZmx1c2g9ZnVuY3Rpb24oKXtvLnByb3RvdHlwZS5mbHVzaC5jYWxsKHRoaXMpLHRoaXMuX3Bha289PT1udWxsJiZ0aGlzLl9jcmVhdGVQYWtvKCksdGhpcy5fcGFrby5wdXNoKFtdLCEwKX0scC5wcm90b3R5cGUuY2xlYW5VcD1mdW5jdGlvbigpe28ucHJvdG90eXBlLmNsZWFuVXAuY2FsbCh0aGlzKSx0aGlzLl9wYWtvPW51bGx9LHAucHJvdG90eXBlLl9jcmVhdGVQYWtvPWZ1bmN0aW9uKCl7dGhpcy5fcGFrbz1uZXcgc1t0aGlzLl9wYWtvQWN0aW9uXSh7cmF3OiEwLGxldmVsOnRoaXMuX3Bha29PcHRpb25zLmxldmVsfHwtMX0pO3ZhciBiPXRoaXM7dGhpcy5fcGFrby5vbkRhdGE9ZnVuY3Rpb24oZyl7Yi5wdXNoKHtkYXRhOmcsbWV0YTpiLm1ldGF9KX19LG4uY29tcHJlc3NXb3JrZXI9ZnVuY3Rpb24oYil7cmV0dXJuIG5ldyBwKCJEZWZsYXRlIixiKX0sbi51bmNvbXByZXNzV29ya2VyPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBwKCJJbmZsYXRlIix7fSl9fSx7Ii4vc3RyZWFtL0dlbmVyaWNXb3JrZXIiOjI4LCIuL3V0aWxzIjozMixwYWtvOjM4fV0sODpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKG0sQyl7dmFyIHksVD0iIjtmb3IoeT0wO3k8Qzt5KyspVCs9U3RyaW5nLmZyb21DaGFyQ29kZSgyNTUmbSksbT4+Pj04O3JldHVybiBUfWZ1bmN0aW9uIHMobSxDLHksVCxQLGMpe3ZhciBsLGgsXz1tLmZpbGUsRj1tLmNvbXByZXNzaW9uLE89YyE9PXUudXRmOGVuY29kZSxmPWkudHJhbnNmb3JtVG8oInN0cmluZyIsYyhfLm5hbWUpKSxVPWkudHJhbnNmb3JtVG8oInN0cmluZyIsdS51dGY4ZW5jb2RlKF8ubmFtZSkpLFg9Xy5jb21tZW50LFE9aS50cmFuc2Zvcm1Ubygic3RyaW5nIixjKFgpKSxFPWkudHJhbnNmb3JtVG8oInN0cmluZyIsdS51dGY4ZW5jb2RlKFgpKSwkPVUubGVuZ3RoIT09Xy5uYW1lLmxlbmd0aCx3PUUubGVuZ3RoIT09WC5sZW5ndGgsaz0iIixTPSIiLEI9IiIsTD1fLmRpcixSPV8uZGF0ZSxxPXtjcmMzMjowLGNvbXByZXNzZWRTaXplOjAsdW5jb21wcmVzc2VkU2l6ZTowfTtDJiYheXx8KHEuY3JjMzI9bS5jcmMzMixxLmNvbXByZXNzZWRTaXplPW0uY29tcHJlc3NlZFNpemUscS51bmNvbXByZXNzZWRTaXplPW0udW5jb21wcmVzc2VkU2l6ZSk7dmFyIHo9MDtDJiYoenw9OCksT3x8ISQmJiF3fHwoenw9MjA0OCk7dmFyIEc9MCxudD0wO0wmJihHfD0xNiksUD09PSJVTklYIj8obnQ9Nzk4LEd8PWZ1bmN0aW9uKGV0LHd0KXt2YXIgU3Q9ZXQ7cmV0dXJuIGV0fHwoU3Q9d3Q/MTY4OTM6MzMyMDQpLCg2NTUzNSZTdCk8PDE2fShfLnVuaXhQZXJtaXNzaW9ucyxMKSk6KG50PTIwLEd8PWZ1bmN0aW9uKGV0KXtyZXR1cm4gNjMmKGV0fHwwKX0oXy5kb3NQZXJtaXNzaW9ucykpLGw9Ui5nZXRVVENIb3VycygpLGw8PD02LGx8PVIuZ2V0VVRDTWludXRlcygpLGw8PD01LGx8PVIuZ2V0VVRDU2Vjb25kcygpLzIsaD1SLmdldFVUQ0Z1bGxZZWFyKCktMTk4MCxoPDw9NCxofD1SLmdldFVUQ01vbnRoKCkrMSxoPDw9NSxofD1SLmdldFVUQ0RhdGUoKSwkJiYoUz1yKDEsMSkrcihwKGYpLDQpK1Usays9InVwIityKFMubGVuZ3RoLDIpK1MpLHcmJihCPXIoMSwxKStyKHAoUSksNCkrRSxrKz0idWMiK3IoQi5sZW5ndGgsMikrQik7dmFyIHR0PSIiO3JldHVybiB0dCs9YApcMGAsdHQrPXIoeiwyKSx0dCs9Ri5tYWdpYyx0dCs9cihsLDIpLHR0Kz1yKGgsMiksdHQrPXIocS5jcmMzMiw0KSx0dCs9cihxLmNvbXByZXNzZWRTaXplLDQpLHR0Kz1yKHEudW5jb21wcmVzc2VkU2l6ZSw0KSx0dCs9cihmLmxlbmd0aCwyKSx0dCs9cihrLmxlbmd0aCwyKSx7ZmlsZVJlY29yZDpiLkxPQ0FMX0ZJTEVfSEVBREVSK3R0K2YrayxkaXJSZWNvcmQ6Yi5DRU5UUkFMX0ZJTEVfSEVBREVSK3IobnQsMikrdHQrcihRLmxlbmd0aCwyKSsiXDBcMFwwXDAiK3IoRyw0KStyKFQsNCkrZitrK1F9fXZhciBpPXQoIi4uL3V0aWxzIiksbz10KCIuLi9zdHJlYW0vR2VuZXJpY1dvcmtlciIpLHU9dCgiLi4vdXRmOCIpLHA9dCgiLi4vY3JjMzIiKSxiPXQoIi4uL3NpZ25hdHVyZSIpO2Z1bmN0aW9uIGcobSxDLHksVCl7by5jYWxsKHRoaXMsIlppcEZpbGVXb3JrZXIiKSx0aGlzLmJ5dGVzV3JpdHRlbj0wLHRoaXMuemlwQ29tbWVudD1DLHRoaXMuemlwUGxhdGZvcm09eSx0aGlzLmVuY29kZUZpbGVOYW1lPVQsdGhpcy5zdHJlYW1GaWxlcz1tLHRoaXMuYWNjdW11bGF0ZT0hMSx0aGlzLmNvbnRlbnRCdWZmZXI9W10sdGhpcy5kaXJSZWNvcmRzPVtdLHRoaXMuY3VycmVudFNvdXJjZU9mZnNldD0wLHRoaXMuZW50cmllc0NvdW50PTAsdGhpcy5jdXJyZW50RmlsZT1udWxsLHRoaXMuX3NvdXJjZXM9W119aS5pbmhlcml0cyhnLG8pLGcucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24obSl7dmFyIEM9bS5tZXRhLnBlcmNlbnR8fDAseT10aGlzLmVudHJpZXNDb3VudCxUPXRoaXMuX3NvdXJjZXMubGVuZ3RoO3RoaXMuYWNjdW11bGF0ZT90aGlzLmNvbnRlbnRCdWZmZXIucHVzaChtKToodGhpcy5ieXRlc1dyaXR0ZW4rPW0uZGF0YS5sZW5ndGgsby5wcm90b3R5cGUucHVzaC5jYWxsKHRoaXMse2RhdGE6bS5kYXRhLG1ldGE6e2N1cnJlbnRGaWxlOnRoaXMuY3VycmVudEZpbGUscGVyY2VudDp5PyhDKzEwMCooeS1ULTEpKS95OjEwMH19KSl9LGcucHJvdG90eXBlLm9wZW5lZFNvdXJjZT1mdW5jdGlvbihtKXt0aGlzLmN1cnJlbnRTb3VyY2VPZmZzZXQ9dGhpcy5ieXRlc1dyaXR0ZW4sdGhpcy5jdXJyZW50RmlsZT1tLmZpbGUubmFtZTt2YXIgQz10aGlzLnN0cmVhbUZpbGVzJiYhbS5maWxlLmRpcjtpZihDKXt2YXIgeT1zKG0sQywhMSx0aGlzLmN1cnJlbnRTb3VyY2VPZmZzZXQsdGhpcy56aXBQbGF0Zm9ybSx0aGlzLmVuY29kZUZpbGVOYW1lKTt0aGlzLnB1c2goe2RhdGE6eS5maWxlUmVjb3JkLG1ldGE6e3BlcmNlbnQ6MH19KX1lbHNlIHRoaXMuYWNjdW11bGF0ZT0hMH0sZy5wcm90b3R5cGUuY2xvc2VkU291cmNlPWZ1bmN0aW9uKG0pe3RoaXMuYWNjdW11bGF0ZT0hMTt2YXIgQz10aGlzLnN0cmVhbUZpbGVzJiYhbS5maWxlLmRpcix5PXMobSxDLCEwLHRoaXMuY3VycmVudFNvdXJjZU9mZnNldCx0aGlzLnppcFBsYXRmb3JtLHRoaXMuZW5jb2RlRmlsZU5hbWUpO2lmKHRoaXMuZGlyUmVjb3Jkcy5wdXNoKHkuZGlyUmVjb3JkKSxDKXRoaXMucHVzaCh7ZGF0YTpmdW5jdGlvbihUKXtyZXR1cm4gYi5EQVRBX0RFU0NSSVBUT1IrcihULmNyYzMyLDQpK3IoVC5jb21wcmVzc2VkU2l6ZSw0KStyKFQudW5jb21wcmVzc2VkU2l6ZSw0KX0obSksbWV0YTp7cGVyY2VudDoxMDB9fSk7ZWxzZSBmb3IodGhpcy5wdXNoKHtkYXRhOnkuZmlsZVJlY29yZCxtZXRhOntwZXJjZW50OjB9fSk7dGhpcy5jb250ZW50QnVmZmVyLmxlbmd0aDspdGhpcy5wdXNoKHRoaXMuY29udGVudEJ1ZmZlci5zaGlmdCgpKTt0aGlzLmN1cnJlbnRGaWxlPW51bGx9LGcucHJvdG90eXBlLmZsdXNoPWZ1bmN0aW9uKCl7Zm9yKHZhciBtPXRoaXMuYnl0ZXNXcml0dGVuLEM9MDtDPHRoaXMuZGlyUmVjb3Jkcy5sZW5ndGg7QysrKXRoaXMucHVzaCh7ZGF0YTp0aGlzLmRpclJlY29yZHNbQ10sbWV0YTp7cGVyY2VudDoxMDB9fSk7dmFyIHk9dGhpcy5ieXRlc1dyaXR0ZW4tbSxUPWZ1bmN0aW9uKFAsYyxsLGgsXyl7dmFyIEY9aS50cmFuc2Zvcm1Ubygic3RyaW5nIixfKGgpKTtyZXR1cm4gYi5DRU5UUkFMX0RJUkVDVE9SWV9FTkQrIlwwXDBcMFwwIityKFAsMikrcihQLDIpK3IoYyw0KStyKGwsNCkrcihGLmxlbmd0aCwyKStGfSh0aGlzLmRpclJlY29yZHMubGVuZ3RoLHksbSx0aGlzLnppcENvbW1lbnQsdGhpcy5lbmNvZGVGaWxlTmFtZSk7dGhpcy5wdXNoKHtkYXRhOlQsbWV0YTp7cGVyY2VudDoxMDB9fSl9LGcucHJvdG90eXBlLnByZXBhcmVOZXh0U291cmNlPWZ1bmN0aW9uKCl7dGhpcy5wcmV2aW91cz10aGlzLl9zb3VyY2VzLnNoaWZ0KCksdGhpcy5vcGVuZWRTb3VyY2UodGhpcy5wcmV2aW91cy5zdHJlYW1JbmZvKSx0aGlzLmlzUGF1c2VkP3RoaXMucHJldmlvdXMucGF1c2UoKTp0aGlzLnByZXZpb3VzLnJlc3VtZSgpfSxnLnByb3RvdHlwZS5yZWdpc3RlclByZXZpb3VzPWZ1bmN0aW9uKG0pe3RoaXMuX3NvdXJjZXMucHVzaChtKTt2YXIgQz10aGlzO3JldHVybiBtLm9uKCJkYXRhIixmdW5jdGlvbih5KXtDLnByb2Nlc3NDaHVuayh5KX0pLG0ub24oImVuZCIsZnVuY3Rpb24oKXtDLmNsb3NlZFNvdXJjZShDLnByZXZpb3VzLnN0cmVhbUluZm8pLEMuX3NvdXJjZXMubGVuZ3RoP0MucHJlcGFyZU5leHRTb3VyY2UoKTpDLmVuZCgpfSksbS5vbigiZXJyb3IiLGZ1bmN0aW9uKHkpe0MuZXJyb3IoeSl9KSx0aGlzfSxnLnByb3RvdHlwZS5yZXN1bWU9ZnVuY3Rpb24oKXtyZXR1cm4hIW8ucHJvdG90eXBlLnJlc3VtZS5jYWxsKHRoaXMpJiYoIXRoaXMucHJldmlvdXMmJnRoaXMuX3NvdXJjZXMubGVuZ3RoPyh0aGlzLnByZXBhcmVOZXh0U291cmNlKCksITApOnRoaXMucHJldmlvdXN8fHRoaXMuX3NvdXJjZXMubGVuZ3RofHx0aGlzLmdlbmVyYXRlZEVycm9yP3ZvaWQgMDoodGhpcy5lbmQoKSwhMCkpfSxnLnByb3RvdHlwZS5lcnJvcj1mdW5jdGlvbihtKXt2YXIgQz10aGlzLl9zb3VyY2VzO2lmKCFvLnByb3RvdHlwZS5lcnJvci5jYWxsKHRoaXMsbSkpcmV0dXJuITE7Zm9yKHZhciB5PTA7eTxDLmxlbmd0aDt5KyspdHJ5e0NbeV0uZXJyb3IobSl9Y2F0Y2h7fXJldHVybiEwfSxnLnByb3RvdHlwZS5sb2NrPWZ1bmN0aW9uKCl7by5wcm90b3R5cGUubG9jay5jYWxsKHRoaXMpO2Zvcih2YXIgbT10aGlzLl9zb3VyY2VzLEM9MDtDPG0ubGVuZ3RoO0MrKyltW0NdLmxvY2soKX0sZS5leHBvcnRzPWd9LHsiLi4vY3JjMzIiOjQsIi4uL3NpZ25hdHVyZSI6MjMsIi4uL3N0cmVhbS9HZW5lcmljV29ya2VyIjoyOCwiLi4vdXRmOCI6MzEsIi4uL3V0aWxzIjozMn1dLDk6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgiLi4vY29tcHJlc3Npb25zIikscz10KCIuL1ppcEZpbGVXb3JrZXIiKTtuLmdlbmVyYXRlV29ya2VyPWZ1bmN0aW9uKGksbyx1KXt2YXIgcD1uZXcgcyhvLnN0cmVhbUZpbGVzLHUsby5wbGF0Zm9ybSxvLmVuY29kZUZpbGVOYW1lKSxiPTA7dHJ5e2kuZm9yRWFjaChmdW5jdGlvbihnLG0pe2IrKzt2YXIgQz1mdW5jdGlvbihjLGwpe3ZhciBoPWN8fGwsXz1yW2hdO2lmKCFfKXRocm93IG5ldyBFcnJvcihoKyIgaXMgbm90IGEgdmFsaWQgY29tcHJlc3Npb24gbWV0aG9kICEiKTtyZXR1cm4gX30obS5vcHRpb25zLmNvbXByZXNzaW9uLG8uY29tcHJlc3Npb24pLHk9bS5vcHRpb25zLmNvbXByZXNzaW9uT3B0aW9uc3x8by5jb21wcmVzc2lvbk9wdGlvbnN8fHt9LFQ9bS5kaXIsUD1tLmRhdGU7bS5fY29tcHJlc3NXb3JrZXIoQyx5KS53aXRoU3RyZWFtSW5mbygiZmlsZSIse25hbWU6ZyxkaXI6VCxkYXRlOlAsY29tbWVudDptLmNvbW1lbnR8fCIiLHVuaXhQZXJtaXNzaW9uczptLnVuaXhQZXJtaXNzaW9ucyxkb3NQZXJtaXNzaW9uczptLmRvc1Blcm1pc3Npb25zfSkucGlwZShwKX0pLHAuZW50cmllc0NvdW50PWJ9Y2F0Y2goZyl7cC5lcnJvcihnKX1yZXR1cm4gcH19LHsiLi4vY29tcHJlc3Npb25zIjozLCIuL1ppcEZpbGVXb3JrZXIiOjh9XSwxMDpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKCl7aWYoISh0aGlzIGluc3RhbmNlb2YgcikpcmV0dXJuIG5ldyByO2lmKGFyZ3VtZW50cy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJUaGUgY29uc3RydWN0b3Igd2l0aCBwYXJhbWV0ZXJzIGhhcyBiZWVuIHJlbW92ZWQgaW4gSlNaaXAgMy4wLCBwbGVhc2UgY2hlY2sgdGhlIHVwZ3JhZGUgZ3VpZGUuIik7dGhpcy5maWxlcz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuY29tbWVudD1udWxsLHRoaXMucm9vdD0iIix0aGlzLmNsb25lPWZ1bmN0aW9uKCl7dmFyIHM9bmV3IHI7Zm9yKHZhciBpIGluIHRoaXMpdHlwZW9mIHRoaXNbaV0hPSJmdW5jdGlvbiImJihzW2ldPXRoaXNbaV0pO3JldHVybiBzfX0oci5wcm90b3R5cGU9dCgiLi9vYmplY3QiKSkubG9hZEFzeW5jPXQoIi4vbG9hZCIpLHIuc3VwcG9ydD10KCIuL3N1cHBvcnQiKSxyLmRlZmF1bHRzPXQoIi4vZGVmYXVsdHMiKSxyLnZlcnNpb249IjMuMTAuMSIsci5sb2FkQXN5bmM9ZnVuY3Rpb24ocyxpKXtyZXR1cm4gbmV3IHIoKS5sb2FkQXN5bmMocyxpKX0sci5leHRlcm5hbD10KCIuL2V4dGVybmFsIiksZS5leHBvcnRzPXJ9LHsiLi9kZWZhdWx0cyI6NSwiLi9leHRlcm5hbCI6NiwiLi9sb2FkIjoxMSwiLi9vYmplY3QiOjE1LCIuL3N1cHBvcnQiOjMwfV0sMTE6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgiLi91dGlscyIpLHM9dCgiLi9leHRlcm5hbCIpLGk9dCgiLi91dGY4Iiksbz10KCIuL3ppcEVudHJpZXMiKSx1PXQoIi4vc3RyZWFtL0NyYzMyUHJvYmUiKSxwPXQoIi4vbm9kZWpzVXRpbHMiKTtmdW5jdGlvbiBiKGcpe3JldHVybiBuZXcgcy5Qcm9taXNlKGZ1bmN0aW9uKG0sQyl7dmFyIHk9Zy5kZWNvbXByZXNzZWQuZ2V0Q29udGVudFdvcmtlcigpLnBpcGUobmV3IHUpO3kub24oImVycm9yIixmdW5jdGlvbihUKXtDKFQpfSkub24oImVuZCIsZnVuY3Rpb24oKXt5LnN0cmVhbUluZm8uY3JjMzIhPT1nLmRlY29tcHJlc3NlZC5jcmMzMj9DKG5ldyBFcnJvcigiQ29ycnVwdGVkIHppcCA6IENSQzMyIG1pc21hdGNoIikpOm0oKX0pLnJlc3VtZSgpfSl9ZS5leHBvcnRzPWZ1bmN0aW9uKGcsbSl7dmFyIEM9dGhpcztyZXR1cm4gbT1yLmV4dGVuZChtfHx7fSx7YmFzZTY0OiExLGNoZWNrQ1JDMzI6ITEsb3B0aW1pemVkQmluYXJ5U3RyaW5nOiExLGNyZWF0ZUZvbGRlcnM6ITEsZGVjb2RlRmlsZU5hbWU6aS51dGY4ZGVjb2RlfSkscC5pc05vZGUmJnAuaXNTdHJlYW0oZyk/cy5Qcm9taXNlLnJlamVjdChuZXcgRXJyb3IoIkpTWmlwIGNhbid0IGFjY2VwdCBhIHN0cmVhbSB3aGVuIGxvYWRpbmcgYSB6aXAgZmlsZS4iKSk6ci5wcmVwYXJlQ29udGVudCgidGhlIGxvYWRlZCB6aXAgZmlsZSIsZywhMCxtLm9wdGltaXplZEJpbmFyeVN0cmluZyxtLmJhc2U2NCkudGhlbihmdW5jdGlvbih5KXt2YXIgVD1uZXcgbyhtKTtyZXR1cm4gVC5sb2FkKHkpLFR9KS50aGVuKGZ1bmN0aW9uKHkpe3ZhciBUPVtzLlByb21pc2UucmVzb2x2ZSh5KV0sUD15LmZpbGVzO2lmKG0uY2hlY2tDUkMzMilmb3IodmFyIGM9MDtjPFAubGVuZ3RoO2MrKylULnB1c2goYihQW2NdKSk7cmV0dXJuIHMuUHJvbWlzZS5hbGwoVCl9KS50aGVuKGZ1bmN0aW9uKHkpe2Zvcih2YXIgVD15LnNoaWZ0KCksUD1ULmZpbGVzLGM9MDtjPFAubGVuZ3RoO2MrKyl7dmFyIGw9UFtjXSxoPWwuZmlsZU5hbWVTdHIsXz1yLnJlc29sdmUobC5maWxlTmFtZVN0cik7Qy5maWxlKF8sbC5kZWNvbXByZXNzZWQse2JpbmFyeTohMCxvcHRpbWl6ZWRCaW5hcnlTdHJpbmc6ITAsZGF0ZTpsLmRhdGUsZGlyOmwuZGlyLGNvbW1lbnQ6bC5maWxlQ29tbWVudFN0ci5sZW5ndGg/bC5maWxlQ29tbWVudFN0cjpudWxsLHVuaXhQZXJtaXNzaW9uczpsLnVuaXhQZXJtaXNzaW9ucyxkb3NQZXJtaXNzaW9uczpsLmRvc1Blcm1pc3Npb25zLGNyZWF0ZUZvbGRlcnM6bS5jcmVhdGVGb2xkZXJzfSksbC5kaXJ8fChDLmZpbGUoXykudW5zYWZlT3JpZ2luYWxOYW1lPWgpfXJldHVybiBULnppcENvbW1lbnQubGVuZ3RoJiYoQy5jb21tZW50PVQuemlwQ29tbWVudCksQ30pfX0seyIuL2V4dGVybmFsIjo2LCIuL25vZGVqc1V0aWxzIjoxNCwiLi9zdHJlYW0vQ3JjMzJQcm9iZSI6MjUsIi4vdXRmOCI6MzEsIi4vdXRpbHMiOjMyLCIuL3ppcEVudHJpZXMiOjMzfV0sMTI6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgiLi4vdXRpbHMiKSxzPXQoIi4uL3N0cmVhbS9HZW5lcmljV29ya2VyIik7ZnVuY3Rpb24gaShvLHUpe3MuY2FsbCh0aGlzLCJOb2RlanMgc3RyZWFtIGlucHV0IGFkYXB0ZXIgZm9yICIrbyksdGhpcy5fdXBzdHJlYW1FbmRlZD0hMSx0aGlzLl9iaW5kU3RyZWFtKHUpfXIuaW5oZXJpdHMoaSxzKSxpLnByb3RvdHlwZS5fYmluZFN0cmVhbT1mdW5jdGlvbihvKXt2YXIgdT10aGlzOyh0aGlzLl9zdHJlYW09bykucGF1c2UoKSxvLm9uKCJkYXRhIixmdW5jdGlvbihwKXt1LnB1c2goe2RhdGE6cCxtZXRhOntwZXJjZW50OjB9fSl9KS5vbigiZXJyb3IiLGZ1bmN0aW9uKHApe3UuaXNQYXVzZWQ/dGhpcy5nZW5lcmF0ZWRFcnJvcj1wOnUuZXJyb3IocCl9KS5vbigiZW5kIixmdW5jdGlvbigpe3UuaXNQYXVzZWQ/dS5fdXBzdHJlYW1FbmRlZD0hMDp1LmVuZCgpfSl9LGkucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7cmV0dXJuISFzLnByb3RvdHlwZS5wYXVzZS5jYWxsKHRoaXMpJiYodGhpcy5fc3RyZWFtLnBhdXNlKCksITApfSxpLnByb3RvdHlwZS5yZXN1bWU9ZnVuY3Rpb24oKXtyZXR1cm4hIXMucHJvdG90eXBlLnJlc3VtZS5jYWxsKHRoaXMpJiYodGhpcy5fdXBzdHJlYW1FbmRlZD90aGlzLmVuZCgpOnRoaXMuX3N0cmVhbS5yZXN1bWUoKSwhMCl9LGUuZXhwb3J0cz1pfSx7Ii4uL3N0cmVhbS9HZW5lcmljV29ya2VyIjoyOCwiLi4vdXRpbHMiOjMyfV0sMTM6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgicmVhZGFibGUtc3RyZWFtIikuUmVhZGFibGU7ZnVuY3Rpb24gcyhpLG8sdSl7ci5jYWxsKHRoaXMsbyksdGhpcy5faGVscGVyPWk7dmFyIHA9dGhpcztpLm9uKCJkYXRhIixmdW5jdGlvbihiLGcpe3AucHVzaChiKXx8cC5faGVscGVyLnBhdXNlKCksdSYmdShnKX0pLm9uKCJlcnJvciIsZnVuY3Rpb24oYil7cC5lbWl0KCJlcnJvciIsYil9KS5vbigiZW5kIixmdW5jdGlvbigpe3AucHVzaChudWxsKX0pfXQoIi4uL3V0aWxzIikuaW5oZXJpdHMocyxyKSxzLnByb3RvdHlwZS5fcmVhZD1mdW5jdGlvbigpe3RoaXMuX2hlbHBlci5yZXN1bWUoKX0sZS5leHBvcnRzPXN9LHsiLi4vdXRpbHMiOjMyLCJyZWFkYWJsZS1zdHJlYW0iOjE2fV0sMTQ6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXtpc05vZGU6dHlwZW9mIEJ1ZmZlcjwidSIsbmV3QnVmZmVyRnJvbTpmdW5jdGlvbihyLHMpe2lmKEJ1ZmZlci5mcm9tJiZCdWZmZXIuZnJvbSE9PVVpbnQ4QXJyYXkuZnJvbSlyZXR1cm4gQnVmZmVyLmZyb20ocixzKTtpZih0eXBlb2Ygcj09Im51bWJlciIpdGhyb3cgbmV3IEVycm9yKCdUaGUgImRhdGEiIGFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJyk7cmV0dXJuIG5ldyBCdWZmZXIocixzKX0sYWxsb2NCdWZmZXI6ZnVuY3Rpb24ocil7aWYoQnVmZmVyLmFsbG9jKXJldHVybiBCdWZmZXIuYWxsb2Mocik7dmFyIHM9bmV3IEJ1ZmZlcihyKTtyZXR1cm4gcy5maWxsKDApLHN9LGlzQnVmZmVyOmZ1bmN0aW9uKHIpe3JldHVybiBCdWZmZXIuaXNCdWZmZXIocil9LGlzU3RyZWFtOmZ1bmN0aW9uKHIpe3JldHVybiByJiZ0eXBlb2Ygci5vbj09ImZ1bmN0aW9uIiYmdHlwZW9mIHIucGF1c2U9PSJmdW5jdGlvbiImJnR5cGVvZiByLnJlc3VtZT09ImZ1bmN0aW9uIn19fSx7fV0sMTU6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihfLEYsTyl7dmFyIGYsVT1pLmdldFR5cGVPZihGKSxYPWkuZXh0ZW5kKE98fHt9LHApO1guZGF0ZT1YLmRhdGV8fG5ldyBEYXRlLFguY29tcHJlc3Npb24hPT1udWxsJiYoWC5jb21wcmVzc2lvbj1YLmNvbXByZXNzaW9uLnRvVXBwZXJDYXNlKCkpLHR5cGVvZiBYLnVuaXhQZXJtaXNzaW9ucz09InN0cmluZyImJihYLnVuaXhQZXJtaXNzaW9ucz1wYXJzZUludChYLnVuaXhQZXJtaXNzaW9ucyw4KSksWC51bml4UGVybWlzc2lvbnMmJjE2Mzg0JlgudW5peFBlcm1pc3Npb25zJiYoWC5kaXI9ITApLFguZG9zUGVybWlzc2lvbnMmJjE2JlguZG9zUGVybWlzc2lvbnMmJihYLmRpcj0hMCksWC5kaXImJihfPVAoXykpLFguY3JlYXRlRm9sZGVycyYmKGY9VChfKSkmJmMuY2FsbCh0aGlzLGYsITApO3ZhciBRPVU9PT0ic3RyaW5nIiYmWC5iaW5hcnk9PT0hMSYmWC5iYXNlNjQ9PT0hMTtPJiZPLmJpbmFyeSE9PXZvaWQgMHx8KFguYmluYXJ5PSFRKSwoRiBpbnN0YW5jZW9mIGImJkYudW5jb21wcmVzc2VkU2l6ZT09PTB8fFguZGlyfHwhRnx8Ri5sZW5ndGg9PT0wKSYmKFguYmFzZTY0PSExLFguYmluYXJ5PSEwLEY9IiIsWC5jb21wcmVzc2lvbj0iU1RPUkUiLFU9InN0cmluZyIpO3ZhciBFPW51bGw7RT1GIGluc3RhbmNlb2YgYnx8RiBpbnN0YW5jZW9mIG8/RjpDLmlzTm9kZSYmQy5pc1N0cmVhbShGKT9uZXcgeShfLEYpOmkucHJlcGFyZUNvbnRlbnQoXyxGLFguYmluYXJ5LFgub3B0aW1pemVkQmluYXJ5U3RyaW5nLFguYmFzZTY0KTt2YXIgJD1uZXcgZyhfLEUsWCk7dGhpcy5maWxlc1tfXT0kfXZhciBzPXQoIi4vdXRmOCIpLGk9dCgiLi91dGlscyIpLG89dCgiLi9zdHJlYW0vR2VuZXJpY1dvcmtlciIpLHU9dCgiLi9zdHJlYW0vU3RyZWFtSGVscGVyIikscD10KCIuL2RlZmF1bHRzIiksYj10KCIuL2NvbXByZXNzZWRPYmplY3QiKSxnPXQoIi4vemlwT2JqZWN0IiksbT10KCIuL2dlbmVyYXRlIiksQz10KCIuL25vZGVqc1V0aWxzIikseT10KCIuL25vZGVqcy9Ob2RlanNTdHJlYW1JbnB1dEFkYXB0ZXIiKSxUPWZ1bmN0aW9uKF8pe18uc2xpY2UoLTEpPT09Ii8iJiYoXz1fLnN1YnN0cmluZygwLF8ubGVuZ3RoLTEpKTt2YXIgRj1fLmxhc3RJbmRleE9mKCIvIik7cmV0dXJuIDA8Rj9fLnN1YnN0cmluZygwLEYpOiIifSxQPWZ1bmN0aW9uKF8pe3JldHVybiBfLnNsaWNlKC0xKSE9PSIvIiYmKF8rPSIvIiksX30sYz1mdW5jdGlvbihfLEYpe3JldHVybiBGPUYhPT12b2lkIDA/RjpwLmNyZWF0ZUZvbGRlcnMsXz1QKF8pLHRoaXMuZmlsZXNbX118fHIuY2FsbCh0aGlzLF8sbnVsbCx7ZGlyOiEwLGNyZWF0ZUZvbGRlcnM6Rn0pLHRoaXMuZmlsZXNbX119O2Z1bmN0aW9uIGwoXyl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChfKT09PSJbb2JqZWN0IFJlZ0V4cF0ifXZhciBoPXtsb2FkOmZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJUaGlzIG1ldGhvZCBoYXMgYmVlbiByZW1vdmVkIGluIEpTWmlwIDMuMCwgcGxlYXNlIGNoZWNrIHRoZSB1cGdyYWRlIGd1aWRlLiIpfSxmb3JFYWNoOmZ1bmN0aW9uKF8pe3ZhciBGLE8sZjtmb3IoRiBpbiB0aGlzLmZpbGVzKWY9dGhpcy5maWxlc1tGXSwoTz1GLnNsaWNlKHRoaXMucm9vdC5sZW5ndGgsRi5sZW5ndGgpKSYmRi5zbGljZSgwLHRoaXMucm9vdC5sZW5ndGgpPT09dGhpcy5yb290JiZfKE8sZil9LGZpbHRlcjpmdW5jdGlvbihfKXt2YXIgRj1bXTtyZXR1cm4gdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKE8sZil7XyhPLGYpJiZGLnB1c2goZil9KSxGfSxmaWxlOmZ1bmN0aW9uKF8sRixPKXtpZihhcmd1bWVudHMubGVuZ3RoIT09MSlyZXR1cm4gXz10aGlzLnJvb3QrXyxyLmNhbGwodGhpcyxfLEYsTyksdGhpcztpZihsKF8pKXt2YXIgZj1fO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbihYLFEpe3JldHVybiFRLmRpciYmZi50ZXN0KFgpfSl9dmFyIFU9dGhpcy5maWxlc1t0aGlzLnJvb3QrX107cmV0dXJuIFUmJiFVLmRpcj9VOm51bGx9LGZvbGRlcjpmdW5jdGlvbihfKXtpZighXylyZXR1cm4gdGhpcztpZihsKF8pKXJldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbihVLFgpe3JldHVybiBYLmRpciYmXy50ZXN0KFUpfSk7dmFyIEY9dGhpcy5yb290K18sTz1jLmNhbGwodGhpcyxGKSxmPXRoaXMuY2xvbmUoKTtyZXR1cm4gZi5yb290PU8ubmFtZSxmfSxyZW1vdmU6ZnVuY3Rpb24oXyl7Xz10aGlzLnJvb3QrXzt2YXIgRj10aGlzLmZpbGVzW19dO2lmKEZ8fChfLnNsaWNlKC0xKSE9PSIvIiYmKF8rPSIvIiksRj10aGlzLmZpbGVzW19dKSxGJiYhRi5kaXIpZGVsZXRlIHRoaXMuZmlsZXNbX107ZWxzZSBmb3IodmFyIE89dGhpcy5maWx0ZXIoZnVuY3Rpb24oVSxYKXtyZXR1cm4gWC5uYW1lLnNsaWNlKDAsXy5sZW5ndGgpPT09X30pLGY9MDtmPE8ubGVuZ3RoO2YrKylkZWxldGUgdGhpcy5maWxlc1tPW2ZdLm5hbWVdO3JldHVybiB0aGlzfSxnZW5lcmF0ZTpmdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiVGhpcyBtZXRob2QgaGFzIGJlZW4gcmVtb3ZlZCBpbiBKU1ppcCAzLjAsIHBsZWFzZSBjaGVjayB0aGUgdXBncmFkZSBndWlkZS4iKX0sZ2VuZXJhdGVJbnRlcm5hbFN0cmVhbTpmdW5jdGlvbihfKXt2YXIgRixPPXt9O3RyeXtpZigoTz1pLmV4dGVuZChffHx7fSx7c3RyZWFtRmlsZXM6ITEsY29tcHJlc3Npb246IlNUT1JFIixjb21wcmVzc2lvbk9wdGlvbnM6bnVsbCx0eXBlOiIiLHBsYXRmb3JtOiJET1MiLGNvbW1lbnQ6bnVsbCxtaW1lVHlwZToiYXBwbGljYXRpb24vemlwIixlbmNvZGVGaWxlTmFtZTpzLnV0ZjhlbmNvZGV9KSkudHlwZT1PLnR5cGUudG9Mb3dlckNhc2UoKSxPLmNvbXByZXNzaW9uPU8uY29tcHJlc3Npb24udG9VcHBlckNhc2UoKSxPLnR5cGU9PT0iYmluYXJ5c3RyaW5nIiYmKE8udHlwZT0ic3RyaW5nIiksIU8udHlwZSl0aHJvdyBuZXcgRXJyb3IoIk5vIG91dHB1dCB0eXBlIHNwZWNpZmllZC4iKTtpLmNoZWNrU3VwcG9ydChPLnR5cGUpLE8ucGxhdGZvcm0hPT0iZGFyd2luIiYmTy5wbGF0Zm9ybSE9PSJmcmVlYnNkIiYmTy5wbGF0Zm9ybSE9PSJsaW51eCImJk8ucGxhdGZvcm0hPT0ic3Vub3MifHwoTy5wbGF0Zm9ybT0iVU5JWCIpLE8ucGxhdGZvcm09PT0id2luMzIiJiYoTy5wbGF0Zm9ybT0iRE9TIik7dmFyIGY9Ty5jb21tZW50fHx0aGlzLmNvbW1lbnR8fCIiO0Y9bS5nZW5lcmF0ZVdvcmtlcih0aGlzLE8sZil9Y2F0Y2goVSl7KEY9bmV3IG8oImVycm9yIikpLmVycm9yKFUpfXJldHVybiBuZXcgdShGLE8udHlwZXx8InN0cmluZyIsTy5taW1lVHlwZSl9LGdlbmVyYXRlQXN5bmM6ZnVuY3Rpb24oXyxGKXtyZXR1cm4gdGhpcy5nZW5lcmF0ZUludGVybmFsU3RyZWFtKF8pLmFjY3VtdWxhdGUoRil9LGdlbmVyYXRlTm9kZVN0cmVhbTpmdW5jdGlvbihfLEYpe3JldHVybihfPV98fHt9KS50eXBlfHwoXy50eXBlPSJub2RlYnVmZmVyIiksdGhpcy5nZW5lcmF0ZUludGVybmFsU3RyZWFtKF8pLnRvTm9kZWpzU3RyZWFtKEYpfX07ZS5leHBvcnRzPWh9LHsiLi9jb21wcmVzc2VkT2JqZWN0IjoyLCIuL2RlZmF1bHRzIjo1LCIuL2dlbmVyYXRlIjo5LCIuL25vZGVqcy9Ob2RlanNTdHJlYW1JbnB1dEFkYXB0ZXIiOjEyLCIuL25vZGVqc1V0aWxzIjoxNCwiLi9zdHJlYW0vR2VuZXJpY1dvcmtlciI6MjgsIi4vc3RyZWFtL1N0cmVhbUhlbHBlciI6MjksIi4vdXRmOCI6MzEsIi4vdXRpbHMiOjMyLCIuL3ppcE9iamVjdCI6MzV9XSwxNjpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9dCgic3RyZWFtIil9LHtzdHJlYW06dm9pZCAwfV0sMTc6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgiLi9EYXRhUmVhZGVyIik7ZnVuY3Rpb24gcyhpKXtyLmNhbGwodGhpcyxpKTtmb3IodmFyIG89MDtvPHRoaXMuZGF0YS5sZW5ndGg7bysrKWlbb109MjU1Jmlbb119dCgiLi4vdXRpbHMiKS5pbmhlcml0cyhzLHIpLHMucHJvdG90eXBlLmJ5dGVBdD1mdW5jdGlvbihpKXtyZXR1cm4gdGhpcy5kYXRhW3RoaXMuemVybytpXX0scy5wcm90b3R5cGUubGFzdEluZGV4T2ZTaWduYXR1cmU9ZnVuY3Rpb24oaSl7Zm9yKHZhciBvPWkuY2hhckNvZGVBdCgwKSx1PWkuY2hhckNvZGVBdCgxKSxwPWkuY2hhckNvZGVBdCgyKSxiPWkuY2hhckNvZGVBdCgzKSxnPXRoaXMubGVuZ3RoLTQ7MDw9ZzstLWcpaWYodGhpcy5kYXRhW2ddPT09byYmdGhpcy5kYXRhW2crMV09PT11JiZ0aGlzLmRhdGFbZysyXT09PXAmJnRoaXMuZGF0YVtnKzNdPT09YilyZXR1cm4gZy10aGlzLnplcm87cmV0dXJuLTF9LHMucHJvdG90eXBlLnJlYWRBbmRDaGVja1NpZ25hdHVyZT1mdW5jdGlvbihpKXt2YXIgbz1pLmNoYXJDb2RlQXQoMCksdT1pLmNoYXJDb2RlQXQoMSkscD1pLmNoYXJDb2RlQXQoMiksYj1pLmNoYXJDb2RlQXQoMyksZz10aGlzLnJlYWREYXRhKDQpO3JldHVybiBvPT09Z1swXSYmdT09PWdbMV0mJnA9PT1nWzJdJiZiPT09Z1szXX0scy5wcm90b3R5cGUucmVhZERhdGE9ZnVuY3Rpb24oaSl7aWYodGhpcy5jaGVja09mZnNldChpKSxpPT09MClyZXR1cm5bXTt2YXIgbz10aGlzLmRhdGEuc2xpY2UodGhpcy56ZXJvK3RoaXMuaW5kZXgsdGhpcy56ZXJvK3RoaXMuaW5kZXgraSk7cmV0dXJuIHRoaXMuaW5kZXgrPWksb30sZS5leHBvcnRzPXN9LHsiLi4vdXRpbHMiOjMyLCIuL0RhdGFSZWFkZXIiOjE4fV0sMTg6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgiLi4vdXRpbHMiKTtmdW5jdGlvbiBzKGkpe3RoaXMuZGF0YT1pLHRoaXMubGVuZ3RoPWkubGVuZ3RoLHRoaXMuaW5kZXg9MCx0aGlzLnplcm89MH1zLnByb3RvdHlwZT17Y2hlY2tPZmZzZXQ6ZnVuY3Rpb24oaSl7dGhpcy5jaGVja0luZGV4KHRoaXMuaW5kZXgraSl9LGNoZWNrSW5kZXg6ZnVuY3Rpb24oaSl7aWYodGhpcy5sZW5ndGg8dGhpcy56ZXJvK2l8fGk8MCl0aHJvdyBuZXcgRXJyb3IoIkVuZCBvZiBkYXRhIHJlYWNoZWQgKGRhdGEgbGVuZ3RoID0gIit0aGlzLmxlbmd0aCsiLCBhc2tlZCBpbmRleCA9ICIraSsiKS4gQ29ycnVwdGVkIHppcCA/Iil9LHNldEluZGV4OmZ1bmN0aW9uKGkpe3RoaXMuY2hlY2tJbmRleChpKSx0aGlzLmluZGV4PWl9LHNraXA6ZnVuY3Rpb24oaSl7dGhpcy5zZXRJbmRleCh0aGlzLmluZGV4K2kpfSxieXRlQXQ6ZnVuY3Rpb24oKXt9LHJlYWRJbnQ6ZnVuY3Rpb24oaSl7dmFyIG8sdT0wO2Zvcih0aGlzLmNoZWNrT2Zmc2V0KGkpLG89dGhpcy5pbmRleCtpLTE7bz49dGhpcy5pbmRleDtvLS0pdT0odTw8OCkrdGhpcy5ieXRlQXQobyk7cmV0dXJuIHRoaXMuaW5kZXgrPWksdX0scmVhZFN0cmluZzpmdW5jdGlvbihpKXtyZXR1cm4gci50cmFuc2Zvcm1Ubygic3RyaW5nIix0aGlzLnJlYWREYXRhKGkpKX0scmVhZERhdGE6ZnVuY3Rpb24oKXt9LGxhc3RJbmRleE9mU2lnbmF0dXJlOmZ1bmN0aW9uKCl7fSxyZWFkQW5kQ2hlY2tTaWduYXR1cmU6ZnVuY3Rpb24oKXt9LHJlYWREYXRlOmZ1bmN0aW9uKCl7dmFyIGk9dGhpcy5yZWFkSW50KDQpO3JldHVybiBuZXcgRGF0ZShEYXRlLlVUQygxOTgwKyhpPj4yNSYxMjcpLChpPj4yMSYxNSktMSxpPj4xNiYzMSxpPj4xMSYzMSxpPj41JjYzLCgzMSZpKTw8MSkpfX0sZS5leHBvcnRzPXN9LHsiLi4vdXRpbHMiOjMyfV0sMTk6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgiLi9VaW50OEFycmF5UmVhZGVyIik7ZnVuY3Rpb24gcyhpKXtyLmNhbGwodGhpcyxpKX10KCIuLi91dGlscyIpLmluaGVyaXRzKHMscikscy5wcm90b3R5cGUucmVhZERhdGE9ZnVuY3Rpb24oaSl7dGhpcy5jaGVja09mZnNldChpKTt2YXIgbz10aGlzLmRhdGEuc2xpY2UodGhpcy56ZXJvK3RoaXMuaW5kZXgsdGhpcy56ZXJvK3RoaXMuaW5kZXgraSk7cmV0dXJuIHRoaXMuaW5kZXgrPWksb30sZS5leHBvcnRzPXN9LHsiLi4vdXRpbHMiOjMyLCIuL1VpbnQ4QXJyYXlSZWFkZXIiOjIxfV0sMjA6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgiLi9EYXRhUmVhZGVyIik7ZnVuY3Rpb24gcyhpKXtyLmNhbGwodGhpcyxpKX10KCIuLi91dGlscyIpLmluaGVyaXRzKHMscikscy5wcm90b3R5cGUuYnl0ZUF0PWZ1bmN0aW9uKGkpe3JldHVybiB0aGlzLmRhdGEuY2hhckNvZGVBdCh0aGlzLnplcm8raSl9LHMucHJvdG90eXBlLmxhc3RJbmRleE9mU2lnbmF0dXJlPWZ1bmN0aW9uKGkpe3JldHVybiB0aGlzLmRhdGEubGFzdEluZGV4T2YoaSktdGhpcy56ZXJvfSxzLnByb3RvdHlwZS5yZWFkQW5kQ2hlY2tTaWduYXR1cmU9ZnVuY3Rpb24oaSl7cmV0dXJuIGk9PT10aGlzLnJlYWREYXRhKDQpfSxzLnByb3RvdHlwZS5yZWFkRGF0YT1mdW5jdGlvbihpKXt0aGlzLmNoZWNrT2Zmc2V0KGkpO3ZhciBvPXRoaXMuZGF0YS5zbGljZSh0aGlzLnplcm8rdGhpcy5pbmRleCx0aGlzLnplcm8rdGhpcy5pbmRleCtpKTtyZXR1cm4gdGhpcy5pbmRleCs9aSxvfSxlLmV4cG9ydHM9c30seyIuLi91dGlscyI6MzIsIi4vRGF0YVJlYWRlciI6MTh9XSwyMTpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj10KCIuL0FycmF5UmVhZGVyIik7ZnVuY3Rpb24gcyhpKXtyLmNhbGwodGhpcyxpKX10KCIuLi91dGlscyIpLmluaGVyaXRzKHMscikscy5wcm90b3R5cGUucmVhZERhdGE9ZnVuY3Rpb24oaSl7aWYodGhpcy5jaGVja09mZnNldChpKSxpPT09MClyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCk7dmFyIG89dGhpcy5kYXRhLnN1YmFycmF5KHRoaXMuemVybyt0aGlzLmluZGV4LHRoaXMuemVybyt0aGlzLmluZGV4K2kpO3JldHVybiB0aGlzLmluZGV4Kz1pLG99LGUuZXhwb3J0cz1zfSx7Ii4uL3V0aWxzIjozMiwiLi9BcnJheVJlYWRlciI6MTd9XSwyMjpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj10KCIuLi91dGlscyIpLHM9dCgiLi4vc3VwcG9ydCIpLGk9dCgiLi9BcnJheVJlYWRlciIpLG89dCgiLi9TdHJpbmdSZWFkZXIiKSx1PXQoIi4vTm9kZUJ1ZmZlclJlYWRlciIpLHA9dCgiLi9VaW50OEFycmF5UmVhZGVyIik7ZS5leHBvcnRzPWZ1bmN0aW9uKGIpe3ZhciBnPXIuZ2V0VHlwZU9mKGIpO3JldHVybiByLmNoZWNrU3VwcG9ydChnKSxnIT09InN0cmluZyJ8fHMudWludDhhcnJheT9nPT09Im5vZGVidWZmZXIiP25ldyB1KGIpOnMudWludDhhcnJheT9uZXcgcChyLnRyYW5zZm9ybVRvKCJ1aW50OGFycmF5IixiKSk6bmV3IGkoci50cmFuc2Zvcm1UbygiYXJyYXkiLGIpKTpuZXcgbyhiKX19LHsiLi4vc3VwcG9ydCI6MzAsIi4uL3V0aWxzIjozMiwiLi9BcnJheVJlYWRlciI6MTcsIi4vTm9kZUJ1ZmZlclJlYWRlciI6MTksIi4vU3RyaW5nUmVhZGVyIjoyMCwiLi9VaW50OEFycmF5UmVhZGVyIjoyMX1dLDIzOltmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO24uTE9DQUxfRklMRV9IRUFERVI9IlBLAwQiLG4uQ0VOVFJBTF9GSUxFX0hFQURFUj0iUEsBAiIsbi5DRU5UUkFMX0RJUkVDVE9SWV9FTkQ9IlBLBQYiLG4uWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfTE9DQVRPUj0iUEsGXHgwNyIsbi5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQ9IlBLBgYiLG4uREFUQV9ERVNDUklQVE9SPSJQS1x4MDdcYiJ9LHt9XSwyNDpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj10KCIuL0dlbmVyaWNXb3JrZXIiKSxzPXQoIi4uL3V0aWxzIik7ZnVuY3Rpb24gaShvKXtyLmNhbGwodGhpcywiQ29udmVydFdvcmtlciB0byAiK28pLHRoaXMuZGVzdFR5cGU9b31zLmluaGVyaXRzKGksciksaS5wcm90b3R5cGUucHJvY2Vzc0NodW5rPWZ1bmN0aW9uKG8pe3RoaXMucHVzaCh7ZGF0YTpzLnRyYW5zZm9ybVRvKHRoaXMuZGVzdFR5cGUsby5kYXRhKSxtZXRhOm8ubWV0YX0pfSxlLmV4cG9ydHM9aX0seyIuLi91dGlscyI6MzIsIi4vR2VuZXJpY1dvcmtlciI6Mjh9XSwyNTpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj10KCIuL0dlbmVyaWNXb3JrZXIiKSxzPXQoIi4uL2NyYzMyIik7ZnVuY3Rpb24gaSgpe3IuY2FsbCh0aGlzLCJDcmMzMlByb2JlIiksdGhpcy53aXRoU3RyZWFtSW5mbygiY3JjMzIiLDApfXQoIi4uL3V0aWxzIikuaW5oZXJpdHMoaSxyKSxpLnByb3RvdHlwZS5wcm9jZXNzQ2h1bms9ZnVuY3Rpb24obyl7dGhpcy5zdHJlYW1JbmZvLmNyYzMyPXMoby5kYXRhLHRoaXMuc3RyZWFtSW5mby5jcmMzMnx8MCksdGhpcy5wdXNoKG8pfSxlLmV4cG9ydHM9aX0seyIuLi9jcmMzMiI6NCwiLi4vdXRpbHMiOjMyLCIuL0dlbmVyaWNXb3JrZXIiOjI4fV0sMjY6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgiLi4vdXRpbHMiKSxzPXQoIi4vR2VuZXJpY1dvcmtlciIpO2Z1bmN0aW9uIGkobyl7cy5jYWxsKHRoaXMsIkRhdGFMZW5ndGhQcm9iZSBmb3IgIitvKSx0aGlzLnByb3BOYW1lPW8sdGhpcy53aXRoU3RyZWFtSW5mbyhvLDApfXIuaW5oZXJpdHMoaSxzKSxpLnByb3RvdHlwZS5wcm9jZXNzQ2h1bms9ZnVuY3Rpb24obyl7aWYobyl7dmFyIHU9dGhpcy5zdHJlYW1JbmZvW3RoaXMucHJvcE5hbWVdfHwwO3RoaXMuc3RyZWFtSW5mb1t0aGlzLnByb3BOYW1lXT11K28uZGF0YS5sZW5ndGh9cy5wcm90b3R5cGUucHJvY2Vzc0NodW5rLmNhbGwodGhpcyxvKX0sZS5leHBvcnRzPWl9LHsiLi4vdXRpbHMiOjMyLCIuL0dlbmVyaWNXb3JrZXIiOjI4fV0sMjc6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgiLi4vdXRpbHMiKSxzPXQoIi4vR2VuZXJpY1dvcmtlciIpO2Z1bmN0aW9uIGkobyl7cy5jYWxsKHRoaXMsIkRhdGFXb3JrZXIiKTt2YXIgdT10aGlzO3RoaXMuZGF0YUlzUmVhZHk9ITEsdGhpcy5pbmRleD0wLHRoaXMubWF4PTAsdGhpcy5kYXRhPW51bGwsdGhpcy50eXBlPSIiLHRoaXMuX3RpY2tTY2hlZHVsZWQ9ITEsby50aGVuKGZ1bmN0aW9uKHApe3UuZGF0YUlzUmVhZHk9ITAsdS5kYXRhPXAsdS5tYXg9cCYmcC5sZW5ndGh8fDAsdS50eXBlPXIuZ2V0VHlwZU9mKHApLHUuaXNQYXVzZWR8fHUuX3RpY2tBbmRSZXBlYXQoKX0sZnVuY3Rpb24ocCl7dS5lcnJvcihwKX0pfXIuaW5oZXJpdHMoaSxzKSxpLnByb3RvdHlwZS5jbGVhblVwPWZ1bmN0aW9uKCl7cy5wcm90b3R5cGUuY2xlYW5VcC5jYWxsKHRoaXMpLHRoaXMuZGF0YT1udWxsfSxpLnByb3RvdHlwZS5yZXN1bWU9ZnVuY3Rpb24oKXtyZXR1cm4hIXMucHJvdG90eXBlLnJlc3VtZS5jYWxsKHRoaXMpJiYoIXRoaXMuX3RpY2tTY2hlZHVsZWQmJnRoaXMuZGF0YUlzUmVhZHkmJih0aGlzLl90aWNrU2NoZWR1bGVkPSEwLHIuZGVsYXkodGhpcy5fdGlja0FuZFJlcGVhdCxbXSx0aGlzKSksITApfSxpLnByb3RvdHlwZS5fdGlja0FuZFJlcGVhdD1mdW5jdGlvbigpe3RoaXMuX3RpY2tTY2hlZHVsZWQ9ITEsdGhpcy5pc1BhdXNlZHx8dGhpcy5pc0ZpbmlzaGVkfHwodGhpcy5fdGljaygpLHRoaXMuaXNGaW5pc2hlZHx8KHIuZGVsYXkodGhpcy5fdGlja0FuZFJlcGVhdCxbXSx0aGlzKSx0aGlzLl90aWNrU2NoZWR1bGVkPSEwKSl9LGkucHJvdG90eXBlLl90aWNrPWZ1bmN0aW9uKCl7aWYodGhpcy5pc1BhdXNlZHx8dGhpcy5pc0ZpbmlzaGVkKXJldHVybiExO3ZhciBvPW51bGwsdT1NYXRoLm1pbih0aGlzLm1heCx0aGlzLmluZGV4KzE2Mzg0KTtpZih0aGlzLmluZGV4Pj10aGlzLm1heClyZXR1cm4gdGhpcy5lbmQoKTtzd2l0Y2godGhpcy50eXBlKXtjYXNlInN0cmluZyI6bz10aGlzLmRhdGEuc3Vic3RyaW5nKHRoaXMuaW5kZXgsdSk7YnJlYWs7Y2FzZSJ1aW50OGFycmF5IjpvPXRoaXMuZGF0YS5zdWJhcnJheSh0aGlzLmluZGV4LHUpO2JyZWFrO2Nhc2UiYXJyYXkiOmNhc2Uibm9kZWJ1ZmZlciI6bz10aGlzLmRhdGEuc2xpY2UodGhpcy5pbmRleCx1KX1yZXR1cm4gdGhpcy5pbmRleD11LHRoaXMucHVzaCh7ZGF0YTpvLG1ldGE6e3BlcmNlbnQ6dGhpcy5tYXg/dGhpcy5pbmRleC90aGlzLm1heCoxMDA6MH19KX0sZS5leHBvcnRzPWl9LHsiLi4vdXRpbHMiOjMyLCIuL0dlbmVyaWNXb3JrZXIiOjI4fV0sMjg6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihzKXt0aGlzLm5hbWU9c3x8ImRlZmF1bHQiLHRoaXMuc3RyZWFtSW5mbz17fSx0aGlzLmdlbmVyYXRlZEVycm9yPW51bGwsdGhpcy5leHRyYVN0cmVhbUluZm89e30sdGhpcy5pc1BhdXNlZD0hMCx0aGlzLmlzRmluaXNoZWQ9ITEsdGhpcy5pc0xvY2tlZD0hMSx0aGlzLl9saXN0ZW5lcnM9e2RhdGE6W10sZW5kOltdLGVycm9yOltdfSx0aGlzLnByZXZpb3VzPW51bGx9ci5wcm90b3R5cGU9e3B1c2g6ZnVuY3Rpb24ocyl7dGhpcy5lbWl0KCJkYXRhIixzKX0sZW5kOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0ZpbmlzaGVkKXJldHVybiExO3RoaXMuZmx1c2goKTt0cnl7dGhpcy5lbWl0KCJlbmQiKSx0aGlzLmNsZWFuVXAoKSx0aGlzLmlzRmluaXNoZWQ9ITB9Y2F0Y2gocyl7dGhpcy5lbWl0KCJlcnJvciIscyl9cmV0dXJuITB9LGVycm9yOmZ1bmN0aW9uKHMpe3JldHVybiF0aGlzLmlzRmluaXNoZWQmJih0aGlzLmlzUGF1c2VkP3RoaXMuZ2VuZXJhdGVkRXJyb3I9czoodGhpcy5pc0ZpbmlzaGVkPSEwLHRoaXMuZW1pdCgiZXJyb3IiLHMpLHRoaXMucHJldmlvdXMmJnRoaXMucHJldmlvdXMuZXJyb3IocyksdGhpcy5jbGVhblVwKCkpLCEwKX0sb246ZnVuY3Rpb24ocyxpKXtyZXR1cm4gdGhpcy5fbGlzdGVuZXJzW3NdLnB1c2goaSksdGhpc30sY2xlYW5VcDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtSW5mbz10aGlzLmdlbmVyYXRlZEVycm9yPXRoaXMuZXh0cmFTdHJlYW1JbmZvPW51bGwsdGhpcy5fbGlzdGVuZXJzPVtdfSxlbWl0OmZ1bmN0aW9uKHMsaSl7aWYodGhpcy5fbGlzdGVuZXJzW3NdKWZvcih2YXIgbz0wO288dGhpcy5fbGlzdGVuZXJzW3NdLmxlbmd0aDtvKyspdGhpcy5fbGlzdGVuZXJzW3NdW29dLmNhbGwodGhpcyxpKX0scGlwZTpmdW5jdGlvbihzKXtyZXR1cm4gcy5yZWdpc3RlclByZXZpb3VzKHRoaXMpfSxyZWdpc3RlclByZXZpb3VzOmZ1bmN0aW9uKHMpe2lmKHRoaXMuaXNMb2NrZWQpdGhyb3cgbmV3IEVycm9yKCJUaGUgc3RyZWFtICciK3RoaXMrIicgaGFzIGFscmVhZHkgYmVlbiB1c2VkLiIpO3RoaXMuc3RyZWFtSW5mbz1zLnN0cmVhbUluZm8sdGhpcy5tZXJnZVN0cmVhbUluZm8oKSx0aGlzLnByZXZpb3VzPXM7dmFyIGk9dGhpcztyZXR1cm4gcy5vbigiZGF0YSIsZnVuY3Rpb24obyl7aS5wcm9jZXNzQ2h1bmsobyl9KSxzLm9uKCJlbmQiLGZ1bmN0aW9uKCl7aS5lbmQoKX0pLHMub24oImVycm9yIixmdW5jdGlvbihvKXtpLmVycm9yKG8pfSksdGhpc30scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5pc1BhdXNlZCYmIXRoaXMuaXNGaW5pc2hlZCYmKHRoaXMuaXNQYXVzZWQ9ITAsdGhpcy5wcmV2aW91cyYmdGhpcy5wcmV2aW91cy5wYXVzZSgpLCEwKX0scmVzdW1lOmZ1bmN0aW9uKCl7aWYoIXRoaXMuaXNQYXVzZWR8fHRoaXMuaXNGaW5pc2hlZClyZXR1cm4hMTt2YXIgcz10aGlzLmlzUGF1c2VkPSExO3JldHVybiB0aGlzLmdlbmVyYXRlZEVycm9yJiYodGhpcy5lcnJvcih0aGlzLmdlbmVyYXRlZEVycm9yKSxzPSEwKSx0aGlzLnByZXZpb3VzJiZ0aGlzLnByZXZpb3VzLnJlc3VtZSgpLCFzfSxmbHVzaDpmdW5jdGlvbigpe30scHJvY2Vzc0NodW5rOmZ1bmN0aW9uKHMpe3RoaXMucHVzaChzKX0sd2l0aFN0cmVhbUluZm86ZnVuY3Rpb24ocyxpKXtyZXR1cm4gdGhpcy5leHRyYVN0cmVhbUluZm9bc109aSx0aGlzLm1lcmdlU3RyZWFtSW5mbygpLHRoaXN9LG1lcmdlU3RyZWFtSW5mbzpmdW5jdGlvbigpe2Zvcih2YXIgcyBpbiB0aGlzLmV4dHJhU3RyZWFtSW5mbylPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5leHRyYVN0cmVhbUluZm8scykmJih0aGlzLnN0cmVhbUluZm9bc109dGhpcy5leHRyYVN0cmVhbUluZm9bc10pfSxsb2NrOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0xvY2tlZCl0aHJvdyBuZXcgRXJyb3IoIlRoZSBzdHJlYW0gJyIrdGhpcysiJyBoYXMgYWxyZWFkeSBiZWVuIHVzZWQuIik7dGhpcy5pc0xvY2tlZD0hMCx0aGlzLnByZXZpb3VzJiZ0aGlzLnByZXZpb3VzLmxvY2soKX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXt2YXIgcz0iV29ya2VyICIrdGhpcy5uYW1lO3JldHVybiB0aGlzLnByZXZpb3VzP3RoaXMucHJldmlvdXMrIiAtPiAiK3M6c319LGUuZXhwb3J0cz1yfSx7fV0sMjk6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgiLi4vdXRpbHMiKSxzPXQoIi4vQ29udmVydFdvcmtlciIpLGk9dCgiLi9HZW5lcmljV29ya2VyIiksbz10KCIuLi9iYXNlNjQiKSx1PXQoIi4uL3N1cHBvcnQiKSxwPXQoIi4uL2V4dGVybmFsIiksYj1udWxsO2lmKHUubm9kZXN0cmVhbSl0cnl7Yj10KCIuLi9ub2RlanMvTm9kZWpzU3RyZWFtT3V0cHV0QWRhcHRlciIpfWNhdGNoe31mdW5jdGlvbiBnKEMseSl7cmV0dXJuIG5ldyBwLlByb21pc2UoZnVuY3Rpb24oVCxQKXt2YXIgYz1bXSxsPUMuX2ludGVybmFsVHlwZSxoPUMuX291dHB1dFR5cGUsXz1DLl9taW1lVHlwZTtDLm9uKCJkYXRhIixmdW5jdGlvbihGLE8pe2MucHVzaChGKSx5JiZ5KE8pfSkub24oImVycm9yIixmdW5jdGlvbihGKXtjPVtdLFAoRil9KS5vbigiZW5kIixmdW5jdGlvbigpe3RyeXt2YXIgRj1mdW5jdGlvbihPLGYsVSl7c3dpdGNoKE8pe2Nhc2UiYmxvYiI6cmV0dXJuIHIubmV3QmxvYihyLnRyYW5zZm9ybVRvKCJhcnJheWJ1ZmZlciIsZiksVSk7Y2FzZSJiYXNlNjQiOnJldHVybiBvLmVuY29kZShmKTtkZWZhdWx0OnJldHVybiByLnRyYW5zZm9ybVRvKE8sZil9fShoLGZ1bmN0aW9uKE8sZil7dmFyIFUsWD0wLFE9bnVsbCxFPTA7Zm9yKFU9MDtVPGYubGVuZ3RoO1UrKylFKz1mW1VdLmxlbmd0aDtzd2l0Y2goTyl7Y2FzZSJzdHJpbmciOnJldHVybiBmLmpvaW4oIiIpO2Nhc2UiYXJyYXkiOnJldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLGYpO2Nhc2UidWludDhhcnJheSI6Zm9yKFE9bmV3IFVpbnQ4QXJyYXkoRSksVT0wO1U8Zi5sZW5ndGg7VSsrKVEuc2V0KGZbVV0sWCksWCs9ZltVXS5sZW5ndGg7cmV0dXJuIFE7Y2FzZSJub2RlYnVmZmVyIjpyZXR1cm4gQnVmZmVyLmNvbmNhdChmKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiY29uY2F0IDogdW5zdXBwb3J0ZWQgdHlwZSAnIitPKyInIil9fShsLGMpLF8pO1QoRil9Y2F0Y2goTyl7UChPKX1jPVtdfSkucmVzdW1lKCl9KX1mdW5jdGlvbiBtKEMseSxUKXt2YXIgUD15O3N3aXRjaCh5KXtjYXNlImJsb2IiOmNhc2UiYXJyYXlidWZmZXIiOlA9InVpbnQ4YXJyYXkiO2JyZWFrO2Nhc2UiYmFzZTY0IjpQPSJzdHJpbmcifXRyeXt0aGlzLl9pbnRlcm5hbFR5cGU9UCx0aGlzLl9vdXRwdXRUeXBlPXksdGhpcy5fbWltZVR5cGU9VCxyLmNoZWNrU3VwcG9ydChQKSx0aGlzLl93b3JrZXI9Qy5waXBlKG5ldyBzKFApKSxDLmxvY2soKX1jYXRjaChjKXt0aGlzLl93b3JrZXI9bmV3IGkoImVycm9yIiksdGhpcy5fd29ya2VyLmVycm9yKGMpfX1tLnByb3RvdHlwZT17YWNjdW11bGF0ZTpmdW5jdGlvbihDKXtyZXR1cm4gZyh0aGlzLEMpfSxvbjpmdW5jdGlvbihDLHkpe3ZhciBUPXRoaXM7cmV0dXJuIEM9PT0iZGF0YSI/dGhpcy5fd29ya2VyLm9uKEMsZnVuY3Rpb24oUCl7eS5jYWxsKFQsUC5kYXRhLFAubWV0YSl9KTp0aGlzLl93b3JrZXIub24oQyxmdW5jdGlvbigpe3IuZGVsYXkoeSxhcmd1bWVudHMsVCl9KSx0aGlzfSxyZXN1bWU6ZnVuY3Rpb24oKXtyZXR1cm4gci5kZWxheSh0aGlzLl93b3JrZXIucmVzdW1lLFtdLHRoaXMuX3dvcmtlciksdGhpc30scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fd29ya2VyLnBhdXNlKCksdGhpc30sdG9Ob2RlanNTdHJlYW06ZnVuY3Rpb24oQyl7aWYoci5jaGVja1N1cHBvcnQoIm5vZGVzdHJlYW0iKSx0aGlzLl9vdXRwdXRUeXBlIT09Im5vZGVidWZmZXIiKXRocm93IG5ldyBFcnJvcih0aGlzLl9vdXRwdXRUeXBlKyIgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIG1ldGhvZCIpO3JldHVybiBuZXcgYih0aGlzLHtvYmplY3RNb2RlOnRoaXMuX291dHB1dFR5cGUhPT0ibm9kZWJ1ZmZlciJ9LEMpfX0sZS5leHBvcnRzPW19LHsiLi4vYmFzZTY0IjoxLCIuLi9leHRlcm5hbCI6NiwiLi4vbm9kZWpzL05vZGVqc1N0cmVhbU91dHB1dEFkYXB0ZXIiOjEzLCIuLi9zdXBwb3J0IjozMCwiLi4vdXRpbHMiOjMyLCIuL0NvbnZlcnRXb3JrZXIiOjI0LCIuL0dlbmVyaWNXb3JrZXIiOjI4fV0sMzA6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7aWYobi5iYXNlNjQ9ITAsbi5hcnJheT0hMCxuLnN0cmluZz0hMCxuLmFycmF5YnVmZmVyPXR5cGVvZiBBcnJheUJ1ZmZlcjwidSImJnR5cGVvZiBVaW50OEFycmF5PCJ1IixuLm5vZGVidWZmZXI9dHlwZW9mIEJ1ZmZlcjwidSIsbi51aW50OGFycmF5PXR5cGVvZiBVaW50OEFycmF5PCJ1Iix0eXBlb2YgQXJyYXlCdWZmZXI+InUiKW4uYmxvYj0hMTtlbHNle3ZhciByPW5ldyBBcnJheUJ1ZmZlcigwKTt0cnl7bi5ibG9iPW5ldyBCbG9iKFtyXSx7dHlwZToiYXBwbGljYXRpb24vemlwIn0pLnNpemU9PT0wfWNhdGNoe3RyeXt2YXIgcz1uZXcoc2VsZi5CbG9iQnVpbGRlcnx8c2VsZi5XZWJLaXRCbG9iQnVpbGRlcnx8c2VsZi5Nb3pCbG9iQnVpbGRlcnx8c2VsZi5NU0Jsb2JCdWlsZGVyKTtzLmFwcGVuZChyKSxuLmJsb2I9cy5nZXRCbG9iKCJhcHBsaWNhdGlvbi96aXAiKS5zaXplPT09MH1jYXRjaHtuLmJsb2I9ITF9fX10cnl7bi5ub2Rlc3RyZWFtPSEhdCgicmVhZGFibGUtc3RyZWFtIikuUmVhZGFibGV9Y2F0Y2h7bi5ub2Rlc3RyZWFtPSExfX0seyJyZWFkYWJsZS1zdHJlYW0iOjE2fV0sMzE6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7Zm9yKHZhciByPXQoIi4vdXRpbHMiKSxzPXQoIi4vc3VwcG9ydCIpLGk9dCgiLi9ub2RlanNVdGlscyIpLG89dCgiLi9zdHJlYW0vR2VuZXJpY1dvcmtlciIpLHU9bmV3IEFycmF5KDI1NikscD0wO3A8MjU2O3ArKyl1W3BdPTI1Mjw9cD82OjI0ODw9cD81OjI0MDw9cD80OjIyNDw9cD8zOjE5Mjw9cD8yOjE7dVsyNTRdPXVbMjU0XT0xO2Z1bmN0aW9uIGIoKXtvLmNhbGwodGhpcywidXRmLTggZGVjb2RlIiksdGhpcy5sZWZ0T3Zlcj1udWxsfWZ1bmN0aW9uIGcoKXtvLmNhbGwodGhpcywidXRmLTggZW5jb2RlIil9bi51dGY4ZW5jb2RlPWZ1bmN0aW9uKG0pe3JldHVybiBzLm5vZGVidWZmZXI/aS5uZXdCdWZmZXJGcm9tKG0sInV0Zi04Iik6ZnVuY3Rpb24oQyl7dmFyIHksVCxQLGMsbCxoPUMubGVuZ3RoLF89MDtmb3IoYz0wO2M8aDtjKyspKDY0NTEyJihUPUMuY2hhckNvZGVBdChjKSkpPT01NTI5NiYmYysxPGgmJig2NDUxMiYoUD1DLmNoYXJDb2RlQXQoYysxKSkpPT01NjMyMCYmKFQ9NjU1MzYrKFQtNTUyOTY8PDEwKSsoUC01NjMyMCksYysrKSxfKz1UPDEyOD8xOlQ8MjA0OD8yOlQ8NjU1MzY/Mzo0O2Zvcih5PXMudWludDhhcnJheT9uZXcgVWludDhBcnJheShfKTpuZXcgQXJyYXkoXyksYz1sPTA7bDxfO2MrKykoNjQ1MTImKFQ9Qy5jaGFyQ29kZUF0KGMpKSk9PTU1Mjk2JiZjKzE8aCYmKDY0NTEyJihQPUMuY2hhckNvZGVBdChjKzEpKSk9PTU2MzIwJiYoVD02NTUzNisoVC01NTI5Njw8MTApKyhQLTU2MzIwKSxjKyspLFQ8MTI4P3lbbCsrXT1UOihUPDIwNDg/eVtsKytdPTE5MnxUPj4+NjooVDw2NTUzNj95W2wrK109MjI0fFQ+Pj4xMjooeVtsKytdPTI0MHxUPj4+MTgseVtsKytdPTEyOHxUPj4+MTImNjMpLHlbbCsrXT0xMjh8VD4+PjYmNjMpLHlbbCsrXT0xMjh8NjMmVCk7cmV0dXJuIHl9KG0pfSxuLnV0ZjhkZWNvZGU9ZnVuY3Rpb24obSl7cmV0dXJuIHMubm9kZWJ1ZmZlcj9yLnRyYW5zZm9ybVRvKCJub2RlYnVmZmVyIixtKS50b1N0cmluZygidXRmLTgiKTpmdW5jdGlvbihDKXt2YXIgeSxULFAsYyxsPUMubGVuZ3RoLGg9bmV3IEFycmF5KDIqbCk7Zm9yKHk9VD0wO3k8bDspaWYoKFA9Q1t5KytdKTwxMjgpaFtUKytdPVA7ZWxzZSBpZig0PChjPXVbUF0pKWhbVCsrXT02NTUzMyx5Kz1jLTE7ZWxzZXtmb3IoUCY9Yz09PTI/MzE6Yz09PTM/MTU6NzsxPGMmJnk8bDspUD1QPDw2fDYzJkNbeSsrXSxjLS07MTxjP2hbVCsrXT02NTUzMzpQPDY1NTM2P2hbVCsrXT1QOihQLT02NTUzNixoW1QrK109NTUyOTZ8UD4+MTAmMTAyMyxoW1QrK109NTYzMjB8MTAyMyZQKX1yZXR1cm4gaC5sZW5ndGghPT1UJiYoaC5zdWJhcnJheT9oPWguc3ViYXJyYXkoMCxUKTpoLmxlbmd0aD1UKSxyLmFwcGx5RnJvbUNoYXJDb2RlKGgpfShtPXIudHJhbnNmb3JtVG8ocy51aW50OGFycmF5PyJ1aW50OGFycmF5IjoiYXJyYXkiLG0pKX0sci5pbmhlcml0cyhiLG8pLGIucHJvdG90eXBlLnByb2Nlc3NDaHVuaz1mdW5jdGlvbihtKXt2YXIgQz1yLnRyYW5zZm9ybVRvKHMudWludDhhcnJheT8idWludDhhcnJheSI6ImFycmF5IixtLmRhdGEpO2lmKHRoaXMubGVmdE92ZXImJnRoaXMubGVmdE92ZXIubGVuZ3RoKXtpZihzLnVpbnQ4YXJyYXkpe3ZhciB5PUM7KEM9bmV3IFVpbnQ4QXJyYXkoeS5sZW5ndGgrdGhpcy5sZWZ0T3Zlci5sZW5ndGgpKS5zZXQodGhpcy5sZWZ0T3ZlciwwKSxDLnNldCh5LHRoaXMubGVmdE92ZXIubGVuZ3RoKX1lbHNlIEM9dGhpcy5sZWZ0T3Zlci5jb25jYXQoQyk7dGhpcy5sZWZ0T3Zlcj1udWxsfXZhciBUPWZ1bmN0aW9uKGMsbCl7dmFyIGg7Zm9yKChsPWx8fGMubGVuZ3RoKT5jLmxlbmd0aCYmKGw9Yy5sZW5ndGgpLGg9bC0xOzA8PWgmJigxOTImY1toXSk9PTEyODspaC0tO3JldHVybiBoPDB8fGg9PT0wP2w6aCt1W2NbaF1dPmw/aDpsfShDKSxQPUM7VCE9PUMubGVuZ3RoJiYocy51aW50OGFycmF5PyhQPUMuc3ViYXJyYXkoMCxUKSx0aGlzLmxlZnRPdmVyPUMuc3ViYXJyYXkoVCxDLmxlbmd0aCkpOihQPUMuc2xpY2UoMCxUKSx0aGlzLmxlZnRPdmVyPUMuc2xpY2UoVCxDLmxlbmd0aCkpKSx0aGlzLnB1c2goe2RhdGE6bi51dGY4ZGVjb2RlKFApLG1ldGE6bS5tZXRhfSl9LGIucHJvdG90eXBlLmZsdXNoPWZ1bmN0aW9uKCl7dGhpcy5sZWZ0T3ZlciYmdGhpcy5sZWZ0T3Zlci5sZW5ndGgmJih0aGlzLnB1c2goe2RhdGE6bi51dGY4ZGVjb2RlKHRoaXMubGVmdE92ZXIpLG1ldGE6e319KSx0aGlzLmxlZnRPdmVyPW51bGwpfSxuLlV0ZjhEZWNvZGVXb3JrZXI9YixyLmluaGVyaXRzKGcsbyksZy5wcm90b3R5cGUucHJvY2Vzc0NodW5rPWZ1bmN0aW9uKG0pe3RoaXMucHVzaCh7ZGF0YTpuLnV0ZjhlbmNvZGUobS5kYXRhKSxtZXRhOm0ubWV0YX0pfSxuLlV0ZjhFbmNvZGVXb3JrZXI9Z30seyIuL25vZGVqc1V0aWxzIjoxNCwiLi9zdHJlYW0vR2VuZXJpY1dvcmtlciI6MjgsIi4vc3VwcG9ydCI6MzAsIi4vdXRpbHMiOjMyfV0sMzI6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgiLi9zdXBwb3J0Iikscz10KCIuL2Jhc2U2NCIpLGk9dCgiLi9ub2RlanNVdGlscyIpLG89dCgiLi9leHRlcm5hbCIpO2Z1bmN0aW9uIHUoeSl7cmV0dXJuIHl9ZnVuY3Rpb24gcCh5LFQpe2Zvcih2YXIgUD0wO1A8eS5sZW5ndGg7KytQKVRbUF09MjU1JnkuY2hhckNvZGVBdChQKTtyZXR1cm4gVH10KCJzZXRpbW1lZGlhdGUiKSxuLm5ld0Jsb2I9ZnVuY3Rpb24oeSxUKXtuLmNoZWNrU3VwcG9ydCgiYmxvYiIpO3RyeXtyZXR1cm4gbmV3IEJsb2IoW3ldLHt0eXBlOlR9KX1jYXRjaHt0cnl7dmFyIFA9bmV3KHNlbGYuQmxvYkJ1aWxkZXJ8fHNlbGYuV2ViS2l0QmxvYkJ1aWxkZXJ8fHNlbGYuTW96QmxvYkJ1aWxkZXJ8fHNlbGYuTVNCbG9iQnVpbGRlcik7cmV0dXJuIFAuYXBwZW5kKHkpLFAuZ2V0QmxvYihUKX1jYXRjaHt0aHJvdyBuZXcgRXJyb3IoIkJ1ZyA6IGNhbid0IGNvbnN0cnVjdCB0aGUgQmxvYi4iKX19fTt2YXIgYj17c3RyaW5naWZ5QnlDaHVuazpmdW5jdGlvbih5LFQsUCl7dmFyIGM9W10sbD0wLGg9eS5sZW5ndGg7aWYoaDw9UClyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLHkpO2Zvcig7bDxoOylUPT09ImFycmF5Inx8VD09PSJub2RlYnVmZmVyIj9jLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLHkuc2xpY2UobCxNYXRoLm1pbihsK1AsaCkpKSk6Yy5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCx5LnN1YmFycmF5KGwsTWF0aC5taW4obCtQLGgpKSkpLGwrPVA7cmV0dXJuIGMuam9pbigiIil9LHN0cmluZ2lmeUJ5Q2hhcjpmdW5jdGlvbih5KXtmb3IodmFyIFQ9IiIsUD0wO1A8eS5sZW5ndGg7UCsrKVQrPVN0cmluZy5mcm9tQ2hhckNvZGUoeVtQXSk7cmV0dXJuIFR9LGFwcGx5Q2FuQmVVc2VkOnt1aW50OGFycmF5OmZ1bmN0aW9uKCl7dHJ5e3JldHVybiByLnVpbnQ4YXJyYXkmJlN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxuZXcgVWludDhBcnJheSgxKSkubGVuZ3RoPT09MX1jYXRjaHtyZXR1cm4hMX19KCksbm9kZWJ1ZmZlcjpmdW5jdGlvbigpe3RyeXtyZXR1cm4gci5ub2RlYnVmZmVyJiZTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsaS5hbGxvY0J1ZmZlcigxKSkubGVuZ3RoPT09MX1jYXRjaHtyZXR1cm4hMX19KCl9fTtmdW5jdGlvbiBnKHkpe3ZhciBUPTY1NTM2LFA9bi5nZXRUeXBlT2YoeSksYz0hMDtpZihQPT09InVpbnQ4YXJyYXkiP2M9Yi5hcHBseUNhbkJlVXNlZC51aW50OGFycmF5OlA9PT0ibm9kZWJ1ZmZlciImJihjPWIuYXBwbHlDYW5CZVVzZWQubm9kZWJ1ZmZlciksYylmb3IoOzE8VDspdHJ5e3JldHVybiBiLnN0cmluZ2lmeUJ5Q2h1bmsoeSxQLFQpfWNhdGNoe1Q9TWF0aC5mbG9vcihULzIpfXJldHVybiBiLnN0cmluZ2lmeUJ5Q2hhcih5KX1mdW5jdGlvbiBtKHksVCl7Zm9yKHZhciBQPTA7UDx5Lmxlbmd0aDtQKyspVFtQXT15W1BdO3JldHVybiBUfW4uYXBwbHlGcm9tQ2hhckNvZGU9Zzt2YXIgQz17fTtDLnN0cmluZz17c3RyaW5nOnUsYXJyYXk6ZnVuY3Rpb24oeSl7cmV0dXJuIHAoeSxuZXcgQXJyYXkoeS5sZW5ndGgpKX0sYXJyYXlidWZmZXI6ZnVuY3Rpb24oeSl7cmV0dXJuIEMuc3RyaW5nLnVpbnQ4YXJyYXkoeSkuYnVmZmVyfSx1aW50OGFycmF5OmZ1bmN0aW9uKHkpe3JldHVybiBwKHksbmV3IFVpbnQ4QXJyYXkoeS5sZW5ndGgpKX0sbm9kZWJ1ZmZlcjpmdW5jdGlvbih5KXtyZXR1cm4gcCh5LGkuYWxsb2NCdWZmZXIoeS5sZW5ndGgpKX19LEMuYXJyYXk9e3N0cmluZzpnLGFycmF5OnUsYXJyYXlidWZmZXI6ZnVuY3Rpb24oeSl7cmV0dXJuIG5ldyBVaW50OEFycmF5KHkpLmJ1ZmZlcn0sdWludDhhcnJheTpmdW5jdGlvbih5KXtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoeSl9LG5vZGVidWZmZXI6ZnVuY3Rpb24oeSl7cmV0dXJuIGkubmV3QnVmZmVyRnJvbSh5KX19LEMuYXJyYXlidWZmZXI9e3N0cmluZzpmdW5jdGlvbih5KXtyZXR1cm4gZyhuZXcgVWludDhBcnJheSh5KSl9LGFycmF5OmZ1bmN0aW9uKHkpe3JldHVybiBtKG5ldyBVaW50OEFycmF5KHkpLG5ldyBBcnJheSh5LmJ5dGVMZW5ndGgpKX0sYXJyYXlidWZmZXI6dSx1aW50OGFycmF5OmZ1bmN0aW9uKHkpe3JldHVybiBuZXcgVWludDhBcnJheSh5KX0sbm9kZWJ1ZmZlcjpmdW5jdGlvbih5KXtyZXR1cm4gaS5uZXdCdWZmZXJGcm9tKG5ldyBVaW50OEFycmF5KHkpKX19LEMudWludDhhcnJheT17c3RyaW5nOmcsYXJyYXk6ZnVuY3Rpb24oeSl7cmV0dXJuIG0oeSxuZXcgQXJyYXkoeS5sZW5ndGgpKX0sYXJyYXlidWZmZXI6ZnVuY3Rpb24oeSl7cmV0dXJuIHkuYnVmZmVyfSx1aW50OGFycmF5OnUsbm9kZWJ1ZmZlcjpmdW5jdGlvbih5KXtyZXR1cm4gaS5uZXdCdWZmZXJGcm9tKHkpfX0sQy5ub2RlYnVmZmVyPXtzdHJpbmc6ZyxhcnJheTpmdW5jdGlvbih5KXtyZXR1cm4gbSh5LG5ldyBBcnJheSh5Lmxlbmd0aCkpfSxhcnJheWJ1ZmZlcjpmdW5jdGlvbih5KXtyZXR1cm4gQy5ub2RlYnVmZmVyLnVpbnQ4YXJyYXkoeSkuYnVmZmVyfSx1aW50OGFycmF5OmZ1bmN0aW9uKHkpe3JldHVybiBtKHksbmV3IFVpbnQ4QXJyYXkoeS5sZW5ndGgpKX0sbm9kZWJ1ZmZlcjp1fSxuLnRyYW5zZm9ybVRvPWZ1bmN0aW9uKHksVCl7aWYoVD1UfHwiIiwheSlyZXR1cm4gVDtuLmNoZWNrU3VwcG9ydCh5KTt2YXIgUD1uLmdldFR5cGVPZihUKTtyZXR1cm4gQ1tQXVt5XShUKX0sbi5yZXNvbHZlPWZ1bmN0aW9uKHkpe2Zvcih2YXIgVD15LnNwbGl0KCIvIiksUD1bXSxjPTA7YzxULmxlbmd0aDtjKyspe3ZhciBsPVRbY107bD09PSIuInx8bD09PSIiJiZjIT09MCYmYyE9PVQubGVuZ3RoLTF8fChsPT09Ii4uIj9QLnBvcCgpOlAucHVzaChsKSl9cmV0dXJuIFAuam9pbigiLyIpfSxuLmdldFR5cGVPZj1mdW5jdGlvbih5KXtyZXR1cm4gdHlwZW9mIHk9PSJzdHJpbmciPyJzdHJpbmciOk9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh5KT09PSJbb2JqZWN0IEFycmF5XSI/ImFycmF5IjpyLm5vZGVidWZmZXImJmkuaXNCdWZmZXIoeSk/Im5vZGVidWZmZXIiOnIudWludDhhcnJheSYmeSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXk/InVpbnQ4YXJyYXkiOnIuYXJyYXlidWZmZXImJnkgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcj8iYXJyYXlidWZmZXIiOnZvaWQgMH0sbi5jaGVja1N1cHBvcnQ9ZnVuY3Rpb24oeSl7aWYoIXJbeS50b0xvd2VyQ2FzZSgpXSl0aHJvdyBuZXcgRXJyb3IoeSsiIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBwbGF0Zm9ybSIpfSxuLk1BWF9WQUxVRV8xNkJJVFM9NjU1MzUsbi5NQVhfVkFMVUVfMzJCSVRTPS0xLG4ucHJldHR5PWZ1bmN0aW9uKHkpe3ZhciBULFAsYz0iIjtmb3IoUD0wO1A8KHl8fCIiKS5sZW5ndGg7UCsrKWMrPSJcXHgiKygoVD15LmNoYXJDb2RlQXQoUCkpPDE2PyIwIjoiIikrVC50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtyZXR1cm4gY30sbi5kZWxheT1mdW5jdGlvbih5LFQsUCl7c2V0SW1tZWRpYXRlKGZ1bmN0aW9uKCl7eS5hcHBseShQfHxudWxsLFR8fFtdKX0pfSxuLmluaGVyaXRzPWZ1bmN0aW9uKHksVCl7ZnVuY3Rpb24gUCgpe31QLnByb3RvdHlwZT1ULnByb3RvdHlwZSx5LnByb3RvdHlwZT1uZXcgUH0sbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgeSxULFA9e307Zm9yKHk9MDt5PGFyZ3VtZW50cy5sZW5ndGg7eSsrKWZvcihUIGluIGFyZ3VtZW50c1t5XSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYXJndW1lbnRzW3ldLFQpJiZQW1RdPT09dm9pZCAwJiYoUFtUXT1hcmd1bWVudHNbeV1bVF0pO3JldHVybiBQfSxuLnByZXBhcmVDb250ZW50PWZ1bmN0aW9uKHksVCxQLGMsbCl7cmV0dXJuIG8uUHJvbWlzZS5yZXNvbHZlKFQpLnRoZW4oZnVuY3Rpb24oaCl7cmV0dXJuIHIuYmxvYiYmKGggaW5zdGFuY2VvZiBCbG9ifHxbIltvYmplY3QgRmlsZV0iLCJbb2JqZWN0IEJsb2JdIl0uaW5kZXhPZihPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaCkpIT09LTEpJiZ0eXBlb2YgRmlsZVJlYWRlcjwidSI/bmV3IG8uUHJvbWlzZShmdW5jdGlvbihfLEYpe3ZhciBPPW5ldyBGaWxlUmVhZGVyO08ub25sb2FkPWZ1bmN0aW9uKGYpe18oZi50YXJnZXQucmVzdWx0KX0sTy5vbmVycm9yPWZ1bmN0aW9uKGYpe0YoZi50YXJnZXQuZXJyb3IpfSxPLnJlYWRBc0FycmF5QnVmZmVyKGgpfSk6aH0pLnRoZW4oZnVuY3Rpb24oaCl7dmFyIF89bi5nZXRUeXBlT2YoaCk7cmV0dXJuIF8/KF89PT0iYXJyYXlidWZmZXIiP2g9bi50cmFuc2Zvcm1UbygidWludDhhcnJheSIsaCk6Xz09PSJzdHJpbmciJiYobD9oPXMuZGVjb2RlKGgpOlAmJmMhPT0hMCYmKGg9ZnVuY3Rpb24oRil7cmV0dXJuIHAoRixyLnVpbnQ4YXJyYXk/bmV3IFVpbnQ4QXJyYXkoRi5sZW5ndGgpOm5ldyBBcnJheShGLmxlbmd0aCkpfShoKSkpLGgpOm8uUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCJDYW4ndCByZWFkIHRoZSBkYXRhIG9mICciK3krIicuIElzIGl0IGluIGEgc3VwcG9ydGVkIEphdmFTY3JpcHQgdHlwZSAoU3RyaW5nLCBCbG9iLCBBcnJheUJ1ZmZlciwgZXRjKSA/IikpfSl9fSx7Ii4vYmFzZTY0IjoxLCIuL2V4dGVybmFsIjo2LCIuL25vZGVqc1V0aWxzIjoxNCwiLi9zdXBwb3J0IjozMCxzZXRpbW1lZGlhdGU6NTR9XSwzMzpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj10KCIuL3JlYWRlci9yZWFkZXJGb3IiKSxzPXQoIi4vdXRpbHMiKSxpPXQoIi4vc2lnbmF0dXJlIiksbz10KCIuL3ppcEVudHJ5IiksdT10KCIuL3N1cHBvcnQiKTtmdW5jdGlvbiBwKGIpe3RoaXMuZmlsZXM9W10sdGhpcy5sb2FkT3B0aW9ucz1ifXAucHJvdG90eXBlPXtjaGVja1NpZ25hdHVyZTpmdW5jdGlvbihiKXtpZighdGhpcy5yZWFkZXIucmVhZEFuZENoZWNrU2lnbmF0dXJlKGIpKXt0aGlzLnJlYWRlci5pbmRleC09NDt2YXIgZz10aGlzLnJlYWRlci5yZWFkU3RyaW5nKDQpO3Rocm93IG5ldyBFcnJvcigiQ29ycnVwdGVkIHppcCBvciBidWc6IHVuZXhwZWN0ZWQgc2lnbmF0dXJlICgiK3MucHJldHR5KGcpKyIsIGV4cGVjdGVkICIrcy5wcmV0dHkoYikrIikiKX19LGlzU2lnbmF0dXJlOmZ1bmN0aW9uKGIsZyl7dmFyIG09dGhpcy5yZWFkZXIuaW5kZXg7dGhpcy5yZWFkZXIuc2V0SW5kZXgoYik7dmFyIEM9dGhpcy5yZWFkZXIucmVhZFN0cmluZyg0KT09PWc7cmV0dXJuIHRoaXMucmVhZGVyLnNldEluZGV4KG0pLEN9LHJlYWRCbG9ja0VuZE9mQ2VudHJhbDpmdW5jdGlvbigpe3RoaXMuZGlza051bWJlcj10aGlzLnJlYWRlci5yZWFkSW50KDIpLHRoaXMuZGlza1dpdGhDZW50cmFsRGlyU3RhcnQ9dGhpcy5yZWFkZXIucmVhZEludCgyKSx0aGlzLmNlbnRyYWxEaXJSZWNvcmRzT25UaGlzRGlzaz10aGlzLnJlYWRlci5yZWFkSW50KDIpLHRoaXMuY2VudHJhbERpclJlY29yZHM9dGhpcy5yZWFkZXIucmVhZEludCgyKSx0aGlzLmNlbnRyYWxEaXJTaXplPXRoaXMucmVhZGVyLnJlYWRJbnQoNCksdGhpcy5jZW50cmFsRGlyT2Zmc2V0PXRoaXMucmVhZGVyLnJlYWRJbnQoNCksdGhpcy56aXBDb21tZW50TGVuZ3RoPXRoaXMucmVhZGVyLnJlYWRJbnQoMik7dmFyIGI9dGhpcy5yZWFkZXIucmVhZERhdGEodGhpcy56aXBDb21tZW50TGVuZ3RoKSxnPXUudWludDhhcnJheT8idWludDhhcnJheSI6ImFycmF5IixtPXMudHJhbnNmb3JtVG8oZyxiKTt0aGlzLnppcENvbW1lbnQ9dGhpcy5sb2FkT3B0aW9ucy5kZWNvZGVGaWxlTmFtZShtKX0scmVhZEJsb2NrWmlwNjRFbmRPZkNlbnRyYWw6ZnVuY3Rpb24oKXt0aGlzLnppcDY0RW5kT2ZDZW50cmFsU2l6ZT10aGlzLnJlYWRlci5yZWFkSW50KDgpLHRoaXMucmVhZGVyLnNraXAoNCksdGhpcy5kaXNrTnVtYmVyPXRoaXMucmVhZGVyLnJlYWRJbnQoNCksdGhpcy5kaXNrV2l0aENlbnRyYWxEaXJTdGFydD10aGlzLnJlYWRlci5yZWFkSW50KDQpLHRoaXMuY2VudHJhbERpclJlY29yZHNPblRoaXNEaXNrPXRoaXMucmVhZGVyLnJlYWRJbnQoOCksdGhpcy5jZW50cmFsRGlyUmVjb3Jkcz10aGlzLnJlYWRlci5yZWFkSW50KDgpLHRoaXMuY2VudHJhbERpclNpemU9dGhpcy5yZWFkZXIucmVhZEludCg4KSx0aGlzLmNlbnRyYWxEaXJPZmZzZXQ9dGhpcy5yZWFkZXIucmVhZEludCg4KSx0aGlzLnppcDY0RXh0ZW5zaWJsZURhdGE9e307Zm9yKHZhciBiLGcsbSxDPXRoaXMuemlwNjRFbmRPZkNlbnRyYWxTaXplLTQ0OzA8QzspYj10aGlzLnJlYWRlci5yZWFkSW50KDIpLGc9dGhpcy5yZWFkZXIucmVhZEludCg0KSxtPXRoaXMucmVhZGVyLnJlYWREYXRhKGcpLHRoaXMuemlwNjRFeHRlbnNpYmxlRGF0YVtiXT17aWQ6YixsZW5ndGg6Zyx2YWx1ZTptfX0scmVhZEJsb2NrWmlwNjRFbmRPZkNlbnRyYWxMb2NhdG9yOmZ1bmN0aW9uKCl7aWYodGhpcy5kaXNrV2l0aFppcDY0Q2VudHJhbERpclN0YXJ0PXRoaXMucmVhZGVyLnJlYWRJbnQoNCksdGhpcy5yZWxhdGl2ZU9mZnNldEVuZE9mWmlwNjRDZW50cmFsRGlyPXRoaXMucmVhZGVyLnJlYWRJbnQoOCksdGhpcy5kaXNrc0NvdW50PXRoaXMucmVhZGVyLnJlYWRJbnQoNCksMTx0aGlzLmRpc2tzQ291bnQpdGhyb3cgbmV3IEVycm9yKCJNdWx0aS12b2x1bWVzIHppcCBhcmUgbm90IHN1cHBvcnRlZCIpfSxyZWFkTG9jYWxGaWxlczpmdW5jdGlvbigpe3ZhciBiLGc7Zm9yKGI9MDtiPHRoaXMuZmlsZXMubGVuZ3RoO2IrKylnPXRoaXMuZmlsZXNbYl0sdGhpcy5yZWFkZXIuc2V0SW5kZXgoZy5sb2NhbEhlYWRlck9mZnNldCksdGhpcy5jaGVja1NpZ25hdHVyZShpLkxPQ0FMX0ZJTEVfSEVBREVSKSxnLnJlYWRMb2NhbFBhcnQodGhpcy5yZWFkZXIpLGcuaGFuZGxlVVRGOCgpLGcucHJvY2Vzc0F0dHJpYnV0ZXMoKX0scmVhZENlbnRyYWxEaXI6ZnVuY3Rpb24oKXt2YXIgYjtmb3IodGhpcy5yZWFkZXIuc2V0SW5kZXgodGhpcy5jZW50cmFsRGlyT2Zmc2V0KTt0aGlzLnJlYWRlci5yZWFkQW5kQ2hlY2tTaWduYXR1cmUoaS5DRU5UUkFMX0ZJTEVfSEVBREVSKTspKGI9bmV3IG8oe3ppcDY0OnRoaXMuemlwNjR9LHRoaXMubG9hZE9wdGlvbnMpKS5yZWFkQ2VudHJhbFBhcnQodGhpcy5yZWFkZXIpLHRoaXMuZmlsZXMucHVzaChiKTtpZih0aGlzLmNlbnRyYWxEaXJSZWNvcmRzIT09dGhpcy5maWxlcy5sZW5ndGgmJnRoaXMuY2VudHJhbERpclJlY29yZHMhPT0wJiZ0aGlzLmZpbGVzLmxlbmd0aD09PTApdGhyb3cgbmV3IEVycm9yKCJDb3JydXB0ZWQgemlwIG9yIGJ1ZzogZXhwZWN0ZWQgIit0aGlzLmNlbnRyYWxEaXJSZWNvcmRzKyIgcmVjb3JkcyBpbiBjZW50cmFsIGRpciwgZ290ICIrdGhpcy5maWxlcy5sZW5ndGgpfSxyZWFkRW5kT2ZDZW50cmFsOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5yZWFkZXIubGFzdEluZGV4T2ZTaWduYXR1cmUoaS5DRU5UUkFMX0RJUkVDVE9SWV9FTkQpO2lmKGI8MCl0aHJvdyB0aGlzLmlzU2lnbmF0dXJlKDAsaS5MT0NBTF9GSUxFX0hFQURFUik/bmV3IEVycm9yKCJDb3JydXB0ZWQgemlwOiBjYW4ndCBmaW5kIGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSIpOm5ldyBFcnJvcigiQ2FuJ3QgZmluZCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgOiBpcyB0aGlzIGEgemlwIGZpbGUgPyBJZiBpdCBpcywgc2VlIGh0dHBzOi8vc3R1ay5naXRodWIuaW8vanN6aXAvZG9jdW1lbnRhdGlvbi9ob3d0by9yZWFkX3ppcC5odG1sIik7dGhpcy5yZWFkZXIuc2V0SW5kZXgoYik7dmFyIGc9YjtpZih0aGlzLmNoZWNrU2lnbmF0dXJlKGkuQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKSx0aGlzLnJlYWRCbG9ja0VuZE9mQ2VudHJhbCgpLHRoaXMuZGlza051bWJlcj09PXMuTUFYX1ZBTFVFXzE2QklUU3x8dGhpcy5kaXNrV2l0aENlbnRyYWxEaXJTdGFydD09PXMuTUFYX1ZBTFVFXzE2QklUU3x8dGhpcy5jZW50cmFsRGlyUmVjb3Jkc09uVGhpc0Rpc2s9PT1zLk1BWF9WQUxVRV8xNkJJVFN8fHRoaXMuY2VudHJhbERpclJlY29yZHM9PT1zLk1BWF9WQUxVRV8xNkJJVFN8fHRoaXMuY2VudHJhbERpclNpemU9PT1zLk1BWF9WQUxVRV8zMkJJVFN8fHRoaXMuY2VudHJhbERpck9mZnNldD09PXMuTUFYX1ZBTFVFXzMyQklUUyl7aWYodGhpcy56aXA2ND0hMCwoYj10aGlzLnJlYWRlci5sYXN0SW5kZXhPZlNpZ25hdHVyZShpLlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0xPQ0FUT1IpKTwwKXRocm93IG5ldyBFcnJvcigiQ29ycnVwdGVkIHppcDogY2FuJ3QgZmluZCB0aGUgWklQNjQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IGxvY2F0b3IiKTtpZih0aGlzLnJlYWRlci5zZXRJbmRleChiKSx0aGlzLmNoZWNrU2lnbmF0dXJlKGkuWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfTE9DQVRPUiksdGhpcy5yZWFkQmxvY2taaXA2NEVuZE9mQ2VudHJhbExvY2F0b3IoKSwhdGhpcy5pc1NpZ25hdHVyZSh0aGlzLnJlbGF0aXZlT2Zmc2V0RW5kT2ZaaXA2NENlbnRyYWxEaXIsaS5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQpJiYodGhpcy5yZWxhdGl2ZU9mZnNldEVuZE9mWmlwNjRDZW50cmFsRGlyPXRoaXMucmVhZGVyLmxhc3RJbmRleE9mU2lnbmF0dXJlKGkuWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKSx0aGlzLnJlbGF0aXZlT2Zmc2V0RW5kT2ZaaXA2NENlbnRyYWxEaXI8MCkpdGhyb3cgbmV3IEVycm9yKCJDb3JydXB0ZWQgemlwOiBjYW4ndCBmaW5kIHRoZSBaSVA2NCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkiKTt0aGlzLnJlYWRlci5zZXRJbmRleCh0aGlzLnJlbGF0aXZlT2Zmc2V0RW5kT2ZaaXA2NENlbnRyYWxEaXIpLHRoaXMuY2hlY2tTaWduYXR1cmUoaS5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQpLHRoaXMucmVhZEJsb2NrWmlwNjRFbmRPZkNlbnRyYWwoKX12YXIgbT10aGlzLmNlbnRyYWxEaXJPZmZzZXQrdGhpcy5jZW50cmFsRGlyU2l6ZTt0aGlzLnppcDY0JiYobSs9MjAsbSs9MTIrdGhpcy56aXA2NEVuZE9mQ2VudHJhbFNpemUpO3ZhciBDPWctbTtpZigwPEMpdGhpcy5pc1NpZ25hdHVyZShnLGkuQ0VOVFJBTF9GSUxFX0hFQURFUil8fCh0aGlzLnJlYWRlci56ZXJvPUMpO2Vsc2UgaWYoQzwwKXRocm93IG5ldyBFcnJvcigiQ29ycnVwdGVkIHppcDogbWlzc2luZyAiK01hdGguYWJzKEMpKyIgYnl0ZXMuIil9LHByZXBhcmVSZWFkZXI6ZnVuY3Rpb24oYil7dGhpcy5yZWFkZXI9cihiKX0sbG9hZDpmdW5jdGlvbihiKXt0aGlzLnByZXBhcmVSZWFkZXIoYiksdGhpcy5yZWFkRW5kT2ZDZW50cmFsKCksdGhpcy5yZWFkQ2VudHJhbERpcigpLHRoaXMucmVhZExvY2FsRmlsZXMoKX19LGUuZXhwb3J0cz1wfSx7Ii4vcmVhZGVyL3JlYWRlckZvciI6MjIsIi4vc2lnbmF0dXJlIjoyMywiLi9zdXBwb3J0IjozMCwiLi91dGlscyI6MzIsIi4vemlwRW50cnkiOjM0fV0sMzQ6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgiLi9yZWFkZXIvcmVhZGVyRm9yIikscz10KCIuL3V0aWxzIiksaT10KCIuL2NvbXByZXNzZWRPYmplY3QiKSxvPXQoIi4vY3JjMzIiKSx1PXQoIi4vdXRmOCIpLHA9dCgiLi9jb21wcmVzc2lvbnMiKSxiPXQoIi4vc3VwcG9ydCIpO2Z1bmN0aW9uIGcobSxDKXt0aGlzLm9wdGlvbnM9bSx0aGlzLmxvYWRPcHRpb25zPUN9Zy5wcm90b3R5cGU9e2lzRW5jcnlwdGVkOmZ1bmN0aW9uKCl7cmV0dXJuKDEmdGhpcy5iaXRGbGFnKT09MX0sdXNlVVRGODpmdW5jdGlvbigpe3JldHVybigyMDQ4JnRoaXMuYml0RmxhZyk9PTIwNDh9LHJlYWRMb2NhbFBhcnQ6ZnVuY3Rpb24obSl7dmFyIEMseTtpZihtLnNraXAoMjIpLHRoaXMuZmlsZU5hbWVMZW5ndGg9bS5yZWFkSW50KDIpLHk9bS5yZWFkSW50KDIpLHRoaXMuZmlsZU5hbWU9bS5yZWFkRGF0YSh0aGlzLmZpbGVOYW1lTGVuZ3RoKSxtLnNraXAoeSksdGhpcy5jb21wcmVzc2VkU2l6ZT09PS0xfHx0aGlzLnVuY29tcHJlc3NlZFNpemU9PT0tMSl0aHJvdyBuZXcgRXJyb3IoIkJ1ZyBvciBjb3JydXB0ZWQgemlwIDogZGlkbid0IGdldCBlbm91Z2ggaW5mb3JtYXRpb24gZnJvbSB0aGUgY2VudHJhbCBkaXJlY3RvcnkgKGNvbXByZXNzZWRTaXplID09PSAtMSB8fCB1bmNvbXByZXNzZWRTaXplID09PSAtMSkiKTtpZigoQz1mdW5jdGlvbihUKXtmb3IodmFyIFAgaW4gcClpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocCxQKSYmcFtQXS5tYWdpYz09PVQpcmV0dXJuIHBbUF07cmV0dXJuIG51bGx9KHRoaXMuY29tcHJlc3Npb25NZXRob2QpKT09PW51bGwpdGhyb3cgbmV3IEVycm9yKCJDb3JydXB0ZWQgemlwIDogY29tcHJlc3Npb24gIitzLnByZXR0eSh0aGlzLmNvbXByZXNzaW9uTWV0aG9kKSsiIHVua25vd24gKGlubmVyIGZpbGUgOiAiK3MudHJhbnNmb3JtVG8oInN0cmluZyIsdGhpcy5maWxlTmFtZSkrIikiKTt0aGlzLmRlY29tcHJlc3NlZD1uZXcgaSh0aGlzLmNvbXByZXNzZWRTaXplLHRoaXMudW5jb21wcmVzc2VkU2l6ZSx0aGlzLmNyYzMyLEMsbS5yZWFkRGF0YSh0aGlzLmNvbXByZXNzZWRTaXplKSl9LHJlYWRDZW50cmFsUGFydDpmdW5jdGlvbihtKXt0aGlzLnZlcnNpb25NYWRlQnk9bS5yZWFkSW50KDIpLG0uc2tpcCgyKSx0aGlzLmJpdEZsYWc9bS5yZWFkSW50KDIpLHRoaXMuY29tcHJlc3Npb25NZXRob2Q9bS5yZWFkU3RyaW5nKDIpLHRoaXMuZGF0ZT1tLnJlYWREYXRlKCksdGhpcy5jcmMzMj1tLnJlYWRJbnQoNCksdGhpcy5jb21wcmVzc2VkU2l6ZT1tLnJlYWRJbnQoNCksdGhpcy51bmNvbXByZXNzZWRTaXplPW0ucmVhZEludCg0KTt2YXIgQz1tLnJlYWRJbnQoMik7aWYodGhpcy5leHRyYUZpZWxkc0xlbmd0aD1tLnJlYWRJbnQoMiksdGhpcy5maWxlQ29tbWVudExlbmd0aD1tLnJlYWRJbnQoMiksdGhpcy5kaXNrTnVtYmVyU3RhcnQ9bS5yZWFkSW50KDIpLHRoaXMuaW50ZXJuYWxGaWxlQXR0cmlidXRlcz1tLnJlYWRJbnQoMiksdGhpcy5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzPW0ucmVhZEludCg0KSx0aGlzLmxvY2FsSGVhZGVyT2Zmc2V0PW0ucmVhZEludCg0KSx0aGlzLmlzRW5jcnlwdGVkKCkpdGhyb3cgbmV3IEVycm9yKCJFbmNyeXB0ZWQgemlwIGFyZSBub3Qgc3VwcG9ydGVkIik7bS5za2lwKEMpLHRoaXMucmVhZEV4dHJhRmllbGRzKG0pLHRoaXMucGFyc2VaSVA2NEV4dHJhRmllbGQobSksdGhpcy5maWxlQ29tbWVudD1tLnJlYWREYXRhKHRoaXMuZmlsZUNvbW1lbnRMZW5ndGgpfSxwcm9jZXNzQXR0cmlidXRlczpmdW5jdGlvbigpe3RoaXMudW5peFBlcm1pc3Npb25zPW51bGwsdGhpcy5kb3NQZXJtaXNzaW9ucz1udWxsO3ZhciBtPXRoaXMudmVyc2lvbk1hZGVCeT4+ODt0aGlzLmRpcj0hISgxNiZ0aGlzLmV4dGVybmFsRmlsZUF0dHJpYnV0ZXMpLG09PTAmJih0aGlzLmRvc1Blcm1pc3Npb25zPTYzJnRoaXMuZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyksbT09MyYmKHRoaXMudW5peFBlcm1pc3Npb25zPXRoaXMuZXh0ZXJuYWxGaWxlQXR0cmlidXRlcz4+MTYmNjU1MzUpLHRoaXMuZGlyfHx0aGlzLmZpbGVOYW1lU3RyLnNsaWNlKC0xKSE9PSIvInx8KHRoaXMuZGlyPSEwKX0scGFyc2VaSVA2NEV4dHJhRmllbGQ6ZnVuY3Rpb24oKXtpZih0aGlzLmV4dHJhRmllbGRzWzFdKXt2YXIgbT1yKHRoaXMuZXh0cmFGaWVsZHNbMV0udmFsdWUpO3RoaXMudW5jb21wcmVzc2VkU2l6ZT09PXMuTUFYX1ZBTFVFXzMyQklUUyYmKHRoaXMudW5jb21wcmVzc2VkU2l6ZT1tLnJlYWRJbnQoOCkpLHRoaXMuY29tcHJlc3NlZFNpemU9PT1zLk1BWF9WQUxVRV8zMkJJVFMmJih0aGlzLmNvbXByZXNzZWRTaXplPW0ucmVhZEludCg4KSksdGhpcy5sb2NhbEhlYWRlck9mZnNldD09PXMuTUFYX1ZBTFVFXzMyQklUUyYmKHRoaXMubG9jYWxIZWFkZXJPZmZzZXQ9bS5yZWFkSW50KDgpKSx0aGlzLmRpc2tOdW1iZXJTdGFydD09PXMuTUFYX1ZBTFVFXzMyQklUUyYmKHRoaXMuZGlza051bWJlclN0YXJ0PW0ucmVhZEludCg0KSl9fSxyZWFkRXh0cmFGaWVsZHM6ZnVuY3Rpb24obSl7dmFyIEMseSxULFA9bS5pbmRleCt0aGlzLmV4dHJhRmllbGRzTGVuZ3RoO2Zvcih0aGlzLmV4dHJhRmllbGRzfHwodGhpcy5leHRyYUZpZWxkcz17fSk7bS5pbmRleCs0PFA7KUM9bS5yZWFkSW50KDIpLHk9bS5yZWFkSW50KDIpLFQ9bS5yZWFkRGF0YSh5KSx0aGlzLmV4dHJhRmllbGRzW0NdPXtpZDpDLGxlbmd0aDp5LHZhbHVlOlR9O20uc2V0SW5kZXgoUCl9LGhhbmRsZVVURjg6ZnVuY3Rpb24oKXt2YXIgbT1iLnVpbnQ4YXJyYXk/InVpbnQ4YXJyYXkiOiJhcnJheSI7aWYodGhpcy51c2VVVEY4KCkpdGhpcy5maWxlTmFtZVN0cj11LnV0ZjhkZWNvZGUodGhpcy5maWxlTmFtZSksdGhpcy5maWxlQ29tbWVudFN0cj11LnV0ZjhkZWNvZGUodGhpcy5maWxlQ29tbWVudCk7ZWxzZXt2YXIgQz10aGlzLmZpbmRFeHRyYUZpZWxkVW5pY29kZVBhdGgoKTtpZihDIT09bnVsbCl0aGlzLmZpbGVOYW1lU3RyPUM7ZWxzZXt2YXIgeT1zLnRyYW5zZm9ybVRvKG0sdGhpcy5maWxlTmFtZSk7dGhpcy5maWxlTmFtZVN0cj10aGlzLmxvYWRPcHRpb25zLmRlY29kZUZpbGVOYW1lKHkpfXZhciBUPXRoaXMuZmluZEV4dHJhRmllbGRVbmljb2RlQ29tbWVudCgpO2lmKFQhPT1udWxsKXRoaXMuZmlsZUNvbW1lbnRTdHI9VDtlbHNle3ZhciBQPXMudHJhbnNmb3JtVG8obSx0aGlzLmZpbGVDb21tZW50KTt0aGlzLmZpbGVDb21tZW50U3RyPXRoaXMubG9hZE9wdGlvbnMuZGVjb2RlRmlsZU5hbWUoUCl9fX0sZmluZEV4dHJhRmllbGRVbmljb2RlUGF0aDpmdW5jdGlvbigpe3ZhciBtPXRoaXMuZXh0cmFGaWVsZHNbMjg3ODldO2lmKG0pe3ZhciBDPXIobS52YWx1ZSk7cmV0dXJuIEMucmVhZEludCgxKSE9PTF8fG8odGhpcy5maWxlTmFtZSkhPT1DLnJlYWRJbnQoNCk/bnVsbDp1LnV0ZjhkZWNvZGUoQy5yZWFkRGF0YShtLmxlbmd0aC01KSl9cmV0dXJuIG51bGx9LGZpbmRFeHRyYUZpZWxkVW5pY29kZUNvbW1lbnQ6ZnVuY3Rpb24oKXt2YXIgbT10aGlzLmV4dHJhRmllbGRzWzI1NDYxXTtpZihtKXt2YXIgQz1yKG0udmFsdWUpO3JldHVybiBDLnJlYWRJbnQoMSkhPT0xfHxvKHRoaXMuZmlsZUNvbW1lbnQpIT09Qy5yZWFkSW50KDQpP251bGw6dS51dGY4ZGVjb2RlKEMucmVhZERhdGEobS5sZW5ndGgtNSkpfXJldHVybiBudWxsfX0sZS5leHBvcnRzPWd9LHsiLi9jb21wcmVzc2VkT2JqZWN0IjoyLCIuL2NvbXByZXNzaW9ucyI6MywiLi9jcmMzMiI6NCwiLi9yZWFkZXIvcmVhZGVyRm9yIjoyMiwiLi9zdXBwb3J0IjozMCwiLi91dGY4IjozMSwiLi91dGlscyI6MzJ9XSwzNTpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKEMseSxUKXt0aGlzLm5hbWU9Qyx0aGlzLmRpcj1ULmRpcix0aGlzLmRhdGU9VC5kYXRlLHRoaXMuY29tbWVudD1ULmNvbW1lbnQsdGhpcy51bml4UGVybWlzc2lvbnM9VC51bml4UGVybWlzc2lvbnMsdGhpcy5kb3NQZXJtaXNzaW9ucz1ULmRvc1Blcm1pc3Npb25zLHRoaXMuX2RhdGE9eSx0aGlzLl9kYXRhQmluYXJ5PVQuYmluYXJ5LHRoaXMub3B0aW9ucz17Y29tcHJlc3Npb246VC5jb21wcmVzc2lvbixjb21wcmVzc2lvbk9wdGlvbnM6VC5jb21wcmVzc2lvbk9wdGlvbnN9fXZhciBzPXQoIi4vc3RyZWFtL1N0cmVhbUhlbHBlciIpLGk9dCgiLi9zdHJlYW0vRGF0YVdvcmtlciIpLG89dCgiLi91dGY4IiksdT10KCIuL2NvbXByZXNzZWRPYmplY3QiKSxwPXQoIi4vc3RyZWFtL0dlbmVyaWNXb3JrZXIiKTtyLnByb3RvdHlwZT17aW50ZXJuYWxTdHJlYW06ZnVuY3Rpb24oQyl7dmFyIHk9bnVsbCxUPSJzdHJpbmciO3RyeXtpZighQyl0aHJvdyBuZXcgRXJyb3IoIk5vIG91dHB1dCB0eXBlIHNwZWNpZmllZC4iKTt2YXIgUD0oVD1DLnRvTG93ZXJDYXNlKCkpPT09InN0cmluZyJ8fFQ9PT0idGV4dCI7VCE9PSJiaW5hcnlzdHJpbmciJiZUIT09InRleHQifHwoVD0ic3RyaW5nIikseT10aGlzLl9kZWNvbXByZXNzV29ya2VyKCk7dmFyIGM9IXRoaXMuX2RhdGFCaW5hcnk7YyYmIVAmJih5PXkucGlwZShuZXcgby5VdGY4RW5jb2RlV29ya2VyKSksIWMmJlAmJih5PXkucGlwZShuZXcgby5VdGY4RGVjb2RlV29ya2VyKSl9Y2F0Y2gobCl7KHk9bmV3IHAoImVycm9yIikpLmVycm9yKGwpfXJldHVybiBuZXcgcyh5LFQsIiIpfSxhc3luYzpmdW5jdGlvbihDLHkpe3JldHVybiB0aGlzLmludGVybmFsU3RyZWFtKEMpLmFjY3VtdWxhdGUoeSl9LG5vZGVTdHJlYW06ZnVuY3Rpb24oQyx5KXtyZXR1cm4gdGhpcy5pbnRlcm5hbFN0cmVhbShDfHwibm9kZWJ1ZmZlciIpLnRvTm9kZWpzU3RyZWFtKHkpfSxfY29tcHJlc3NXb3JrZXI6ZnVuY3Rpb24oQyx5KXtpZih0aGlzLl9kYXRhIGluc3RhbmNlb2YgdSYmdGhpcy5fZGF0YS5jb21wcmVzc2lvbi5tYWdpYz09PUMubWFnaWMpcmV0dXJuIHRoaXMuX2RhdGEuZ2V0Q29tcHJlc3NlZFdvcmtlcigpO3ZhciBUPXRoaXMuX2RlY29tcHJlc3NXb3JrZXIoKTtyZXR1cm4gdGhpcy5fZGF0YUJpbmFyeXx8KFQ9VC5waXBlKG5ldyBvLlV0ZjhFbmNvZGVXb3JrZXIpKSx1LmNyZWF0ZVdvcmtlckZyb20oVCxDLHkpfSxfZGVjb21wcmVzc1dvcmtlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kYXRhIGluc3RhbmNlb2YgdT90aGlzLl9kYXRhLmdldENvbnRlbnRXb3JrZXIoKTp0aGlzLl9kYXRhIGluc3RhbmNlb2YgcD90aGlzLl9kYXRhOm5ldyBpKHRoaXMuX2RhdGEpfX07Zm9yKHZhciBiPVsiYXNUZXh0IiwiYXNCaW5hcnkiLCJhc05vZGVCdWZmZXIiLCJhc1VpbnQ4QXJyYXkiLCJhc0FycmF5QnVmZmVyIl0sZz1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiVGhpcyBtZXRob2QgaGFzIGJlZW4gcmVtb3ZlZCBpbiBKU1ppcCAzLjAsIHBsZWFzZSBjaGVjayB0aGUgdXBncmFkZSBndWlkZS4iKX0sbT0wO208Yi5sZW5ndGg7bSsrKXIucHJvdG90eXBlW2JbbV1dPWc7ZS5leHBvcnRzPXJ9LHsiLi9jb21wcmVzc2VkT2JqZWN0IjoyLCIuL3N0cmVhbS9EYXRhV29ya2VyIjoyNywiLi9zdHJlYW0vR2VuZXJpY1dvcmtlciI6MjgsIi4vc3RyZWFtL1N0cmVhbUhlbHBlciI6MjksIi4vdXRmOCI6MzF9XSwzNjpbZnVuY3Rpb24odCxlLG4peyhmdW5jdGlvbihyKXsidXNlIHN0cmljdCI7dmFyIHMsaSxvPXIuTXV0YXRpb25PYnNlcnZlcnx8ci5XZWJLaXRNdXRhdGlvbk9ic2VydmVyO2lmKG8pe3ZhciB1PTAscD1uZXcgbyhDKSxiPXIuZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIiIpO3Aub2JzZXJ2ZShiLHtjaGFyYWN0ZXJEYXRhOiEwfSkscz1mdW5jdGlvbigpe2IuZGF0YT11PSsrdSUyfX1lbHNlIGlmKHIuc2V0SW1tZWRpYXRlfHxyLk1lc3NhZ2VDaGFubmVsPT09dm9pZCAwKXM9ImRvY3VtZW50ImluIHImJiJvbnJlYWR5c3RhdGVjaGFuZ2UiaW4gci5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKT9mdW5jdGlvbigpe3ZhciB5PXIuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7eS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtDKCkseS5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCx5LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoeSkseT1udWxsfSxyLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZCh5KX06ZnVuY3Rpb24oKXtzZXRUaW1lb3V0KEMsMCl9O2Vsc2V7dmFyIGc9bmV3IHIuTWVzc2FnZUNoYW5uZWw7Zy5wb3J0MS5vbm1lc3NhZ2U9QyxzPWZ1bmN0aW9uKCl7Zy5wb3J0Mi5wb3N0TWVzc2FnZSgwKX19dmFyIG09W107ZnVuY3Rpb24gQygpe3ZhciB5LFQ7aT0hMDtmb3IodmFyIFA9bS5sZW5ndGg7UDspe2ZvcihUPW0sbT1bXSx5PS0xOysreTxQOylUW3ldKCk7UD1tLmxlbmd0aH1pPSExfWUuZXhwb3J0cz1mdW5jdGlvbih5KXttLnB1c2goeSkhPT0xfHxpfHxzKCl9fSkuY2FsbCh0aGlzLHR5cGVvZiBnbG9iYWw8InUiP2dsb2JhbDp0eXBlb2Ygc2VsZjwidSI/c2VsZjp0eXBlb2Ygd2luZG93PCJ1Ij93aW5kb3c6e30pfSx7fV0sMzc6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgiaW1tZWRpYXRlIik7ZnVuY3Rpb24gcygpe312YXIgaT17fSxvPVsiUkVKRUNURUQiXSx1PVsiRlVMRklMTEVEIl0scD1bIlBFTkRJTkciXTtmdW5jdGlvbiBiKFApe2lmKHR5cGVvZiBQIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoInJlc29sdmVyIG11c3QgYmUgYSBmdW5jdGlvbiIpO3RoaXMuc3RhdGU9cCx0aGlzLnF1ZXVlPVtdLHRoaXMub3V0Y29tZT12b2lkIDAsUCE9PXMmJnkodGhpcyxQKX1mdW5jdGlvbiBnKFAsYyxsKXt0aGlzLnByb21pc2U9UCx0eXBlb2YgYz09ImZ1bmN0aW9uIiYmKHRoaXMub25GdWxmaWxsZWQ9Yyx0aGlzLmNhbGxGdWxmaWxsZWQ9dGhpcy5vdGhlckNhbGxGdWxmaWxsZWQpLHR5cGVvZiBsPT0iZnVuY3Rpb24iJiYodGhpcy5vblJlamVjdGVkPWwsdGhpcy5jYWxsUmVqZWN0ZWQ9dGhpcy5vdGhlckNhbGxSZWplY3RlZCl9ZnVuY3Rpb24gbShQLGMsbCl7cihmdW5jdGlvbigpe3ZhciBoO3RyeXtoPWMobCl9Y2F0Y2goXyl7cmV0dXJuIGkucmVqZWN0KFAsXyl9aD09PVA/aS5yZWplY3QoUCxuZXcgVHlwZUVycm9yKCJDYW5ub3QgcmVzb2x2ZSBwcm9taXNlIHdpdGggaXRzZWxmIikpOmkucmVzb2x2ZShQLGgpfSl9ZnVuY3Rpb24gQyhQKXt2YXIgYz1QJiZQLnRoZW47aWYoUCYmKHR5cGVvZiBQPT0ib2JqZWN0Inx8dHlwZW9mIFA9PSJmdW5jdGlvbiIpJiZ0eXBlb2YgYz09ImZ1bmN0aW9uIilyZXR1cm4gZnVuY3Rpb24oKXtjLmFwcGx5KFAsYXJndW1lbnRzKX19ZnVuY3Rpb24geShQLGMpe3ZhciBsPSExO2Z1bmN0aW9uIGgoTyl7bHx8KGw9ITAsaS5yZWplY3QoUCxPKSl9ZnVuY3Rpb24gXyhPKXtsfHwobD0hMCxpLnJlc29sdmUoUCxPKSl9dmFyIEY9VChmdW5jdGlvbigpe2MoXyxoKX0pO0Yuc3RhdHVzPT09ImVycm9yIiYmaChGLnZhbHVlKX1mdW5jdGlvbiBUKFAsYyl7dmFyIGw9e307dHJ5e2wudmFsdWU9UChjKSxsLnN0YXR1cz0ic3VjY2VzcyJ9Y2F0Y2goaCl7bC5zdGF0dXM9ImVycm9yIixsLnZhbHVlPWh9cmV0dXJuIGx9KGUuZXhwb3J0cz1iKS5wcm90b3R5cGUuZmluYWxseT1mdW5jdGlvbihQKXtpZih0eXBlb2YgUCE9ImZ1bmN0aW9uIilyZXR1cm4gdGhpczt2YXIgYz10aGlzLmNvbnN0cnVjdG9yO3JldHVybiB0aGlzLnRoZW4oZnVuY3Rpb24obCl7cmV0dXJuIGMucmVzb2x2ZShQKCkpLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gbH0pfSxmdW5jdGlvbihsKXtyZXR1cm4gYy5yZXNvbHZlKFAoKSkudGhlbihmdW5jdGlvbigpe3Rocm93IGx9KX0pfSxiLnByb3RvdHlwZS5jYXRjaD1mdW5jdGlvbihQKXtyZXR1cm4gdGhpcy50aGVuKG51bGwsUCl9LGIucHJvdG90eXBlLnRoZW49ZnVuY3Rpb24oUCxjKXtpZih0eXBlb2YgUCE9ImZ1bmN0aW9uIiYmdGhpcy5zdGF0ZT09PXV8fHR5cGVvZiBjIT0iZnVuY3Rpb24iJiZ0aGlzLnN0YXRlPT09bylyZXR1cm4gdGhpczt2YXIgbD1uZXcgdGhpcy5jb25zdHJ1Y3RvcihzKTtyZXR1cm4gdGhpcy5zdGF0ZSE9PXA/bShsLHRoaXMuc3RhdGU9PT11P1A6Yyx0aGlzLm91dGNvbWUpOnRoaXMucXVldWUucHVzaChuZXcgZyhsLFAsYykpLGx9LGcucHJvdG90eXBlLmNhbGxGdWxmaWxsZWQ9ZnVuY3Rpb24oUCl7aS5yZXNvbHZlKHRoaXMucHJvbWlzZSxQKX0sZy5wcm90b3R5cGUub3RoZXJDYWxsRnVsZmlsbGVkPWZ1bmN0aW9uKFApe20odGhpcy5wcm9taXNlLHRoaXMub25GdWxmaWxsZWQsUCl9LGcucHJvdG90eXBlLmNhbGxSZWplY3RlZD1mdW5jdGlvbihQKXtpLnJlamVjdCh0aGlzLnByb21pc2UsUCl9LGcucHJvdG90eXBlLm90aGVyQ2FsbFJlamVjdGVkPWZ1bmN0aW9uKFApe20odGhpcy5wcm9taXNlLHRoaXMub25SZWplY3RlZCxQKX0saS5yZXNvbHZlPWZ1bmN0aW9uKFAsYyl7dmFyIGw9VChDLGMpO2lmKGwuc3RhdHVzPT09ImVycm9yIilyZXR1cm4gaS5yZWplY3QoUCxsLnZhbHVlKTt2YXIgaD1sLnZhbHVlO2lmKGgpeShQLGgpO2Vsc2V7UC5zdGF0ZT11LFAub3V0Y29tZT1jO2Zvcih2YXIgXz0tMSxGPVAucXVldWUubGVuZ3RoOysrXzxGOylQLnF1ZXVlW19dLmNhbGxGdWxmaWxsZWQoYyl9cmV0dXJuIFB9LGkucmVqZWN0PWZ1bmN0aW9uKFAsYyl7UC5zdGF0ZT1vLFAub3V0Y29tZT1jO2Zvcih2YXIgbD0tMSxoPVAucXVldWUubGVuZ3RoOysrbDxoOylQLnF1ZXVlW2xdLmNhbGxSZWplY3RlZChjKTtyZXR1cm4gUH0sYi5yZXNvbHZlPWZ1bmN0aW9uKFApe3JldHVybiBQIGluc3RhbmNlb2YgdGhpcz9QOmkucmVzb2x2ZShuZXcgdGhpcyhzKSxQKX0sYi5yZWplY3Q9ZnVuY3Rpb24oUCl7dmFyIGM9bmV3IHRoaXMocyk7cmV0dXJuIGkucmVqZWN0KGMsUCl9LGIuYWxsPWZ1bmN0aW9uKFApe3ZhciBjPXRoaXM7aWYoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFApIT09IltvYmplY3QgQXJyYXldIilyZXR1cm4gdGhpcy5yZWplY3QobmV3IFR5cGVFcnJvcigibXVzdCBiZSBhbiBhcnJheSIpKTt2YXIgbD1QLmxlbmd0aCxoPSExO2lmKCFsKXJldHVybiB0aGlzLnJlc29sdmUoW10pO2Zvcih2YXIgXz1uZXcgQXJyYXkobCksRj0wLE89LTEsZj1uZXcgdGhpcyhzKTsrK088bDspVShQW09dLE8pO3JldHVybiBmO2Z1bmN0aW9uIFUoWCxRKXtjLnJlc29sdmUoWCkudGhlbihmdW5jdGlvbihFKXtfW1FdPUUsKytGIT09bHx8aHx8KGg9ITAsaS5yZXNvbHZlKGYsXykpfSxmdW5jdGlvbihFKXtofHwoaD0hMCxpLnJlamVjdChmLEUpKX0pfX0sYi5yYWNlPWZ1bmN0aW9uKFApe3ZhciBjPXRoaXM7aWYoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFApIT09IltvYmplY3QgQXJyYXldIilyZXR1cm4gdGhpcy5yZWplY3QobmV3IFR5cGVFcnJvcigibXVzdCBiZSBhbiBhcnJheSIpKTt2YXIgbD1QLmxlbmd0aCxoPSExO2lmKCFsKXJldHVybiB0aGlzLnJlc29sdmUoW10pO2Zvcih2YXIgXz0tMSxGPW5ldyB0aGlzKHMpOysrXzxsOylPPVBbX10sYy5yZXNvbHZlKE8pLnRoZW4oZnVuY3Rpb24oZil7aHx8KGg9ITAsaS5yZXNvbHZlKEYsZikpfSxmdW5jdGlvbihmKXtofHwoaD0hMCxpLnJlamVjdChGLGYpKX0pO3ZhciBPO3JldHVybiBGfX0se2ltbWVkaWF0ZTozNn1dLDM4OltmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPXt9OygwLHQoIi4vbGliL3V0aWxzL2NvbW1vbiIpLmFzc2lnbikocix0KCIuL2xpYi9kZWZsYXRlIiksdCgiLi9saWIvaW5mbGF0ZSIpLHQoIi4vbGliL3psaWIvY29uc3RhbnRzIikpLGUuZXhwb3J0cz1yfSx7Ii4vbGliL2RlZmxhdGUiOjM5LCIuL2xpYi9pbmZsYXRlIjo0MCwiLi9saWIvdXRpbHMvY29tbW9uIjo0MSwiLi9saWIvemxpYi9jb25zdGFudHMiOjQ0fV0sMzk6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgiLi96bGliL2RlZmxhdGUiKSxzPXQoIi4vdXRpbHMvY29tbW9uIiksaT10KCIuL3V0aWxzL3N0cmluZ3MiKSxvPXQoIi4vemxpYi9tZXNzYWdlcyIpLHU9dCgiLi96bGliL3pzdHJlYW0iKSxwPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsYj0wLGc9LTEsbT0wLEM9ODtmdW5jdGlvbiB5KFApe2lmKCEodGhpcyBpbnN0YW5jZW9mIHkpKXJldHVybiBuZXcgeShQKTt0aGlzLm9wdGlvbnM9cy5hc3NpZ24oe2xldmVsOmcsbWV0aG9kOkMsY2h1bmtTaXplOjE2Mzg0LHdpbmRvd0JpdHM6MTUsbWVtTGV2ZWw6OCxzdHJhdGVneTptLHRvOiIifSxQfHx7fSk7dmFyIGM9dGhpcy5vcHRpb25zO2MucmF3JiYwPGMud2luZG93Qml0cz9jLndpbmRvd0JpdHM9LWMud2luZG93Qml0czpjLmd6aXAmJjA8Yy53aW5kb3dCaXRzJiZjLndpbmRvd0JpdHM8MTYmJihjLndpbmRvd0JpdHMrPTE2KSx0aGlzLmVycj0wLHRoaXMubXNnPSIiLHRoaXMuZW5kZWQ9ITEsdGhpcy5jaHVua3M9W10sdGhpcy5zdHJtPW5ldyB1LHRoaXMuc3RybS5hdmFpbF9vdXQ9MDt2YXIgbD1yLmRlZmxhdGVJbml0Mih0aGlzLnN0cm0sYy5sZXZlbCxjLm1ldGhvZCxjLndpbmRvd0JpdHMsYy5tZW1MZXZlbCxjLnN0cmF0ZWd5KTtpZihsIT09Yil0aHJvdyBuZXcgRXJyb3Iob1tsXSk7aWYoYy5oZWFkZXImJnIuZGVmbGF0ZVNldEhlYWRlcih0aGlzLnN0cm0sYy5oZWFkZXIpLGMuZGljdGlvbmFyeSl7dmFyIGg7aWYoaD10eXBlb2YgYy5kaWN0aW9uYXJ5PT0ic3RyaW5nIj9pLnN0cmluZzJidWYoYy5kaWN0aW9uYXJ5KTpwLmNhbGwoYy5kaWN0aW9uYXJ5KT09PSJbb2JqZWN0IEFycmF5QnVmZmVyXSI/bmV3IFVpbnQ4QXJyYXkoYy5kaWN0aW9uYXJ5KTpjLmRpY3Rpb25hcnksKGw9ci5kZWZsYXRlU2V0RGljdGlvbmFyeSh0aGlzLnN0cm0saCkpIT09Yil0aHJvdyBuZXcgRXJyb3Iob1tsXSk7dGhpcy5fZGljdF9zZXQ9ITB9fWZ1bmN0aW9uIFQoUCxjKXt2YXIgbD1uZXcgeShjKTtpZihsLnB1c2goUCwhMCksbC5lcnIpdGhyb3cgbC5tc2d8fG9bbC5lcnJdO3JldHVybiBsLnJlc3VsdH15LnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKFAsYyl7dmFyIGwsaCxfPXRoaXMuc3RybSxGPXRoaXMub3B0aW9ucy5jaHVua1NpemU7aWYodGhpcy5lbmRlZClyZXR1cm4hMTtoPWM9PT1+fmM/YzpjPT09ITA/NDowLHR5cGVvZiBQPT0ic3RyaW5nIj9fLmlucHV0PWkuc3RyaW5nMmJ1ZihQKTpwLmNhbGwoUCk9PT0iW29iamVjdCBBcnJheUJ1ZmZlcl0iP18uaW5wdXQ9bmV3IFVpbnQ4QXJyYXkoUCk6Xy5pbnB1dD1QLF8ubmV4dF9pbj0wLF8uYXZhaWxfaW49Xy5pbnB1dC5sZW5ndGg7ZG97aWYoXy5hdmFpbF9vdXQ9PT0wJiYoXy5vdXRwdXQ9bmV3IHMuQnVmOChGKSxfLm5leHRfb3V0PTAsXy5hdmFpbF9vdXQ9RiksKGw9ci5kZWZsYXRlKF8saCkpIT09MSYmbCE9PWIpcmV0dXJuIHRoaXMub25FbmQobCksISh0aGlzLmVuZGVkPSEwKTtfLmF2YWlsX291dCE9PTAmJihfLmF2YWlsX2luIT09MHx8aCE9PTQmJmghPT0yKXx8KHRoaXMub3B0aW9ucy50bz09PSJzdHJpbmciP3RoaXMub25EYXRhKGkuYnVmMmJpbnN0cmluZyhzLnNocmlua0J1ZihfLm91dHB1dCxfLm5leHRfb3V0KSkpOnRoaXMub25EYXRhKHMuc2hyaW5rQnVmKF8ub3V0cHV0LF8ubmV4dF9vdXQpKSl9d2hpbGUoKDA8Xy5hdmFpbF9pbnx8Xy5hdmFpbF9vdXQ9PT0wKSYmbCE9PTEpO3JldHVybiBoPT09ND8obD1yLmRlZmxhdGVFbmQodGhpcy5zdHJtKSx0aGlzLm9uRW5kKGwpLHRoaXMuZW5kZWQ9ITAsbD09PWIpOmghPT0yfHwodGhpcy5vbkVuZChiKSwhKF8uYXZhaWxfb3V0PTApKX0seS5wcm90b3R5cGUub25EYXRhPWZ1bmN0aW9uKFApe3RoaXMuY2h1bmtzLnB1c2goUCl9LHkucHJvdG90eXBlLm9uRW5kPWZ1bmN0aW9uKFApe1A9PT1iJiYodGhpcy5vcHRpb25zLnRvPT09InN0cmluZyI/dGhpcy5yZXN1bHQ9dGhpcy5jaHVua3Muam9pbigiIik6dGhpcy5yZXN1bHQ9cy5mbGF0dGVuQ2h1bmtzKHRoaXMuY2h1bmtzKSksdGhpcy5jaHVua3M9W10sdGhpcy5lcnI9UCx0aGlzLm1zZz10aGlzLnN0cm0ubXNnfSxuLkRlZmxhdGU9eSxuLmRlZmxhdGU9VCxuLmRlZmxhdGVSYXc9ZnVuY3Rpb24oUCxjKXtyZXR1cm4oYz1jfHx7fSkucmF3PSEwLFQoUCxjKX0sbi5nemlwPWZ1bmN0aW9uKFAsYyl7cmV0dXJuKGM9Y3x8e30pLmd6aXA9ITAsVChQLGMpfX0seyIuL3V0aWxzL2NvbW1vbiI6NDEsIi4vdXRpbHMvc3RyaW5ncyI6NDIsIi4vemxpYi9kZWZsYXRlIjo0NiwiLi96bGliL21lc3NhZ2VzIjo1MSwiLi96bGliL3pzdHJlYW0iOjUzfV0sNDA6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgiLi96bGliL2luZmxhdGUiKSxzPXQoIi4vdXRpbHMvY29tbW9uIiksaT10KCIuL3V0aWxzL3N0cmluZ3MiKSxvPXQoIi4vemxpYi9jb25zdGFudHMiKSx1PXQoIi4vemxpYi9tZXNzYWdlcyIpLHA9dCgiLi96bGliL3pzdHJlYW0iKSxiPXQoIi4vemxpYi9nemhlYWRlciIpLGc9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztmdW5jdGlvbiBtKHkpe2lmKCEodGhpcyBpbnN0YW5jZW9mIG0pKXJldHVybiBuZXcgbSh5KTt0aGlzLm9wdGlvbnM9cy5hc3NpZ24oe2NodW5rU2l6ZToxNjM4NCx3aW5kb3dCaXRzOjAsdG86IiJ9LHl8fHt9KTt2YXIgVD10aGlzLm9wdGlvbnM7VC5yYXcmJjA8PVQud2luZG93Qml0cyYmVC53aW5kb3dCaXRzPDE2JiYoVC53aW5kb3dCaXRzPS1ULndpbmRvd0JpdHMsVC53aW5kb3dCaXRzPT09MCYmKFQud2luZG93Qml0cz0tMTUpKSwhKDA8PVQud2luZG93Qml0cyYmVC53aW5kb3dCaXRzPDE2KXx8eSYmeS53aW5kb3dCaXRzfHwoVC53aW5kb3dCaXRzKz0zMiksMTU8VC53aW5kb3dCaXRzJiZULndpbmRvd0JpdHM8NDgmJiEoMTUmVC53aW5kb3dCaXRzKSYmKFQud2luZG93Qml0c3w9MTUpLHRoaXMuZXJyPTAsdGhpcy5tc2c9IiIsdGhpcy5lbmRlZD0hMSx0aGlzLmNodW5rcz1bXSx0aGlzLnN0cm09bmV3IHAsdGhpcy5zdHJtLmF2YWlsX291dD0wO3ZhciBQPXIuaW5mbGF0ZUluaXQyKHRoaXMuc3RybSxULndpbmRvd0JpdHMpO2lmKFAhPT1vLlpfT0spdGhyb3cgbmV3IEVycm9yKHVbUF0pO3RoaXMuaGVhZGVyPW5ldyBiLHIuaW5mbGF0ZUdldEhlYWRlcih0aGlzLnN0cm0sdGhpcy5oZWFkZXIpfWZ1bmN0aW9uIEMoeSxUKXt2YXIgUD1uZXcgbShUKTtpZihQLnB1c2goeSwhMCksUC5lcnIpdGhyb3cgUC5tc2d8fHVbUC5lcnJdO3JldHVybiBQLnJlc3VsdH1tLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKHksVCl7dmFyIFAsYyxsLGgsXyxGLE89dGhpcy5zdHJtLGY9dGhpcy5vcHRpb25zLmNodW5rU2l6ZSxVPXRoaXMub3B0aW9ucy5kaWN0aW9uYXJ5LFg9ITE7aWYodGhpcy5lbmRlZClyZXR1cm4hMTtjPVQ9PT1+flQ/VDpUPT09ITA/by5aX0ZJTklTSDpvLlpfTk9fRkxVU0gsdHlwZW9mIHk9PSJzdHJpbmciP08uaW5wdXQ9aS5iaW5zdHJpbmcyYnVmKHkpOmcuY2FsbCh5KT09PSJbb2JqZWN0IEFycmF5QnVmZmVyXSI/Ty5pbnB1dD1uZXcgVWludDhBcnJheSh5KTpPLmlucHV0PXksTy5uZXh0X2luPTAsTy5hdmFpbF9pbj1PLmlucHV0Lmxlbmd0aDtkb3tpZihPLmF2YWlsX291dD09PTAmJihPLm91dHB1dD1uZXcgcy5CdWY4KGYpLE8ubmV4dF9vdXQ9MCxPLmF2YWlsX291dD1mKSwoUD1yLmluZmxhdGUoTyxvLlpfTk9fRkxVU0gpKT09PW8uWl9ORUVEX0RJQ1QmJlUmJihGPXR5cGVvZiBVPT0ic3RyaW5nIj9pLnN0cmluZzJidWYoVSk6Zy5jYWxsKFUpPT09IltvYmplY3QgQXJyYXlCdWZmZXJdIj9uZXcgVWludDhBcnJheShVKTpVLFA9ci5pbmZsYXRlU2V0RGljdGlvbmFyeSh0aGlzLnN0cm0sRikpLFA9PT1vLlpfQlVGX0VSUk9SJiZYPT09ITAmJihQPW8uWl9PSyxYPSExKSxQIT09by5aX1NUUkVBTV9FTkQmJlAhPT1vLlpfT0spcmV0dXJuIHRoaXMub25FbmQoUCksISh0aGlzLmVuZGVkPSEwKTtPLm5leHRfb3V0JiYoTy5hdmFpbF9vdXQhPT0wJiZQIT09by5aX1NUUkVBTV9FTkQmJihPLmF2YWlsX2luIT09MHx8YyE9PW8uWl9GSU5JU0gmJmMhPT1vLlpfU1lOQ19GTFVTSCl8fCh0aGlzLm9wdGlvbnMudG89PT0ic3RyaW5nIj8obD1pLnV0Zjhib3JkZXIoTy5vdXRwdXQsTy5uZXh0X291dCksaD1PLm5leHRfb3V0LWwsXz1pLmJ1ZjJzdHJpbmcoTy5vdXRwdXQsbCksTy5uZXh0X291dD1oLE8uYXZhaWxfb3V0PWYtaCxoJiZzLmFycmF5U2V0KE8ub3V0cHV0LE8ub3V0cHV0LGwsaCwwKSx0aGlzLm9uRGF0YShfKSk6dGhpcy5vbkRhdGEocy5zaHJpbmtCdWYoTy5vdXRwdXQsTy5uZXh0X291dCkpKSksTy5hdmFpbF9pbj09PTAmJk8uYXZhaWxfb3V0PT09MCYmKFg9ITApfXdoaWxlKCgwPE8uYXZhaWxfaW58fE8uYXZhaWxfb3V0PT09MCkmJlAhPT1vLlpfU1RSRUFNX0VORCk7cmV0dXJuIFA9PT1vLlpfU1RSRUFNX0VORCYmKGM9by5aX0ZJTklTSCksYz09PW8uWl9GSU5JU0g/KFA9ci5pbmZsYXRlRW5kKHRoaXMuc3RybSksdGhpcy5vbkVuZChQKSx0aGlzLmVuZGVkPSEwLFA9PT1vLlpfT0spOmMhPT1vLlpfU1lOQ19GTFVTSHx8KHRoaXMub25FbmQoby5aX09LKSwhKE8uYXZhaWxfb3V0PTApKX0sbS5wcm90b3R5cGUub25EYXRhPWZ1bmN0aW9uKHkpe3RoaXMuY2h1bmtzLnB1c2goeSl9LG0ucHJvdG90eXBlLm9uRW5kPWZ1bmN0aW9uKHkpe3k9PT1vLlpfT0smJih0aGlzLm9wdGlvbnMudG89PT0ic3RyaW5nIj90aGlzLnJlc3VsdD10aGlzLmNodW5rcy5qb2luKCIiKTp0aGlzLnJlc3VsdD1zLmZsYXR0ZW5DaHVua3ModGhpcy5jaHVua3MpKSx0aGlzLmNodW5rcz1bXSx0aGlzLmVycj15LHRoaXMubXNnPXRoaXMuc3RybS5tc2d9LG4uSW5mbGF0ZT1tLG4uaW5mbGF0ZT1DLG4uaW5mbGF0ZVJhdz1mdW5jdGlvbih5LFQpe3JldHVybihUPVR8fHt9KS5yYXc9ITAsQyh5LFQpfSxuLnVuZ3ppcD1DfSx7Ii4vdXRpbHMvY29tbW9uIjo0MSwiLi91dGlscy9zdHJpbmdzIjo0MiwiLi96bGliL2NvbnN0YW50cyI6NDQsIi4vemxpYi9nemhlYWRlciI6NDcsIi4vemxpYi9pbmZsYXRlIjo0OSwiLi96bGliL21lc3NhZ2VzIjo1MSwiLi96bGliL3pzdHJlYW0iOjUzfV0sNDE6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dHlwZW9mIFVpbnQ4QXJyYXk8InUiJiZ0eXBlb2YgVWludDE2QXJyYXk8InUiJiZ0eXBlb2YgSW50MzJBcnJheTwidSI7bi5hc3NpZ249ZnVuY3Rpb24obyl7Zm9yKHZhciB1PUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKTt1Lmxlbmd0aDspe3ZhciBwPXUuc2hpZnQoKTtpZihwKXtpZih0eXBlb2YgcCE9Im9iamVjdCIpdGhyb3cgbmV3IFR5cGVFcnJvcihwKyJtdXN0IGJlIG5vbi1vYmplY3QiKTtmb3IodmFyIGIgaW4gcClwLmhhc093blByb3BlcnR5KGIpJiYob1tiXT1wW2JdKX19cmV0dXJuIG99LG4uc2hyaW5rQnVmPWZ1bmN0aW9uKG8sdSl7cmV0dXJuIG8ubGVuZ3RoPT09dT9vOm8uc3ViYXJyYXk/by5zdWJhcnJheSgwLHUpOihvLmxlbmd0aD11LG8pfTt2YXIgcz17YXJyYXlTZXQ6ZnVuY3Rpb24obyx1LHAsYixnKXtpZih1LnN1YmFycmF5JiZvLnN1YmFycmF5KW8uc2V0KHUuc3ViYXJyYXkocCxwK2IpLGcpO2Vsc2UgZm9yKHZhciBtPTA7bTxiO20rKylvW2crbV09dVtwK21dfSxmbGF0dGVuQ2h1bmtzOmZ1bmN0aW9uKG8pe3ZhciB1LHAsYixnLG0sQztmb3IodT1iPTAscD1vLmxlbmd0aDt1PHA7dSsrKWIrPW9bdV0ubGVuZ3RoO2ZvcihDPW5ldyBVaW50OEFycmF5KGIpLHU9Zz0wLHA9by5sZW5ndGg7dTxwO3UrKyltPW9bdV0sQy5zZXQobSxnKSxnKz1tLmxlbmd0aDtyZXR1cm4gQ319LGk9e2FycmF5U2V0OmZ1bmN0aW9uKG8sdSxwLGIsZyl7Zm9yKHZhciBtPTA7bTxiO20rKylvW2crbV09dVtwK21dfSxmbGF0dGVuQ2h1bmtzOmZ1bmN0aW9uKG8pe3JldHVybltdLmNvbmNhdC5hcHBseShbXSxvKX19O24uc2V0VHlwZWQ9ZnVuY3Rpb24obyl7bz8obi5CdWY4PVVpbnQ4QXJyYXksbi5CdWYxNj1VaW50MTZBcnJheSxuLkJ1ZjMyPUludDMyQXJyYXksbi5hc3NpZ24obixzKSk6KG4uQnVmOD1BcnJheSxuLkJ1ZjE2PUFycmF5LG4uQnVmMzI9QXJyYXksbi5hc3NpZ24obixpKSl9LG4uc2V0VHlwZWQocil9LHt9XSw0MjpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj10KCIuL2NvbW1vbiIpLHM9ITAsaT0hMDt0cnl7U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLFswXSl9Y2F0Y2h7cz0hMX10cnl7U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLG5ldyBVaW50OEFycmF5KDEpKX1jYXRjaHtpPSExfWZvcih2YXIgbz1uZXcgci5CdWY4KDI1NiksdT0wO3U8MjU2O3UrKylvW3VdPTI1Mjw9dT82OjI0ODw9dT81OjI0MDw9dT80OjIyNDw9dT8zOjE5Mjw9dT8yOjE7ZnVuY3Rpb24gcChiLGcpe2lmKGc8NjU1MzcmJihiLnN1YmFycmF5JiZpfHwhYi5zdWJhcnJheSYmcykpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxyLnNocmlua0J1ZihiLGcpKTtmb3IodmFyIG09IiIsQz0wO0M8ZztDKyspbSs9U3RyaW5nLmZyb21DaGFyQ29kZShiW0NdKTtyZXR1cm4gbX1vWzI1NF09b1syNTRdPTEsbi5zdHJpbmcyYnVmPWZ1bmN0aW9uKGIpe3ZhciBnLG0sQyx5LFQsUD1iLmxlbmd0aCxjPTA7Zm9yKHk9MDt5PFA7eSsrKSg2NDUxMiYobT1iLmNoYXJDb2RlQXQoeSkpKT09NTUyOTYmJnkrMTxQJiYoNjQ1MTImKEM9Yi5jaGFyQ29kZUF0KHkrMSkpKT09NTYzMjAmJihtPTY1NTM2KyhtLTU1Mjk2PDwxMCkrKEMtNTYzMjApLHkrKyksYys9bTwxMjg/MTptPDIwNDg/MjptPDY1NTM2PzM6NDtmb3IoZz1uZXcgci5CdWY4KGMpLHk9VD0wO1Q8Yzt5KyspKDY0NTEyJihtPWIuY2hhckNvZGVBdCh5KSkpPT01NTI5NiYmeSsxPFAmJig2NDUxMiYoQz1iLmNoYXJDb2RlQXQoeSsxKSkpPT01NjMyMCYmKG09NjU1MzYrKG0tNTUyOTY8PDEwKSsoQy01NjMyMCkseSsrKSxtPDEyOD9nW1QrK109bToobTwyMDQ4P2dbVCsrXT0xOTJ8bT4+PjY6KG08NjU1MzY/Z1tUKytdPTIyNHxtPj4+MTI6KGdbVCsrXT0yNDB8bT4+PjE4LGdbVCsrXT0xMjh8bT4+PjEyJjYzKSxnW1QrK109MTI4fG0+Pj42JjYzKSxnW1QrK109MTI4fDYzJm0pO3JldHVybiBnfSxuLmJ1ZjJiaW5zdHJpbmc9ZnVuY3Rpb24oYil7cmV0dXJuIHAoYixiLmxlbmd0aCl9LG4uYmluc3RyaW5nMmJ1Zj1mdW5jdGlvbihiKXtmb3IodmFyIGc9bmV3IHIuQnVmOChiLmxlbmd0aCksbT0wLEM9Zy5sZW5ndGg7bTxDO20rKylnW21dPWIuY2hhckNvZGVBdChtKTtyZXR1cm4gZ30sbi5idWYyc3RyaW5nPWZ1bmN0aW9uKGIsZyl7dmFyIG0sQyx5LFQsUD1nfHxiLmxlbmd0aCxjPW5ldyBBcnJheSgyKlApO2ZvcihtPUM9MDttPFA7KWlmKCh5PWJbbSsrXSk8MTI4KWNbQysrXT15O2Vsc2UgaWYoNDwoVD1vW3ldKSljW0MrK109NjU1MzMsbSs9VC0xO2Vsc2V7Zm9yKHkmPVQ9PT0yPzMxOlQ9PT0zPzE1Ojc7MTxUJiZtPFA7KXk9eTw8Nnw2MyZiW20rK10sVC0tOzE8VD9jW0MrK109NjU1MzM6eTw2NTUzNj9jW0MrK109eTooeS09NjU1MzYsY1tDKytdPTU1Mjk2fHk+PjEwJjEwMjMsY1tDKytdPTU2MzIwfDEwMjMmeSl9cmV0dXJuIHAoYyxDKX0sbi51dGY4Ym9yZGVyPWZ1bmN0aW9uKGIsZyl7dmFyIG07Zm9yKChnPWd8fGIubGVuZ3RoKT5iLmxlbmd0aCYmKGc9Yi5sZW5ndGgpLG09Zy0xOzA8PW0mJigxOTImYlttXSk9PTEyODspbS0tO3JldHVybiBtPDB8fG09PT0wP2c6bStvW2JbbV1dPmc/bTpnfX0seyIuL2NvbW1vbiI6NDF9XSw0MzpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9ZnVuY3Rpb24ocixzLGksbyl7Zm9yKHZhciB1PTY1NTM1JnJ8MCxwPXI+Pj4xNiY2NTUzNXwwLGI9MDtpIT09MDspe2ZvcihpLT1iPTJlMzxpPzJlMzppO3A9cCsodT11K3NbbysrXXwwKXwwLC0tYjspO3UlPTY1NTIxLHAlPTY1NTIxfXJldHVybiB1fHA8PDE2fDB9fSx7fV0sNDQ6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXtaX05PX0ZMVVNIOjAsWl9QQVJUSUFMX0ZMVVNIOjEsWl9TWU5DX0ZMVVNIOjIsWl9GVUxMX0ZMVVNIOjMsWl9GSU5JU0g6NCxaX0JMT0NLOjUsWl9UUkVFUzo2LFpfT0s6MCxaX1NUUkVBTV9FTkQ6MSxaX05FRURfRElDVDoyLFpfRVJSTk86LTEsWl9TVFJFQU1fRVJST1I6LTIsWl9EQVRBX0VSUk9SOi0zLFpfQlVGX0VSUk9SOi01LFpfTk9fQ09NUFJFU1NJT046MCxaX0JFU1RfU1BFRUQ6MSxaX0JFU1RfQ09NUFJFU1NJT046OSxaX0RFRkFVTFRfQ09NUFJFU1NJT046LTEsWl9GSUxURVJFRDoxLFpfSFVGRk1BTl9PTkxZOjIsWl9STEU6MyxaX0ZJWEVEOjQsWl9ERUZBVUxUX1NUUkFURUdZOjAsWl9CSU5BUlk6MCxaX1RFWFQ6MSxaX1VOS05PV046MixaX0RFRkxBVEVEOjh9fSx7fV0sNDU6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZnVuY3Rpb24oKXtmb3IodmFyIHMsaT1bXSxvPTA7bzwyNTY7bysrKXtzPW87Zm9yKHZhciB1PTA7dTw4O3UrKylzPTEmcz8zOTg4MjkyMzg0XnM+Pj4xOnM+Pj4xO2lbb109c31yZXR1cm4gaX0oKTtlLmV4cG9ydHM9ZnVuY3Rpb24ocyxpLG8sdSl7dmFyIHA9cixiPXUrbztzXj0tMTtmb3IodmFyIGc9dTtnPGI7ZysrKXM9cz4+PjhecFsyNTUmKHNeaVtnXSldO3JldHVybi0xXnN9fSx7fV0sNDY6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHIscz10KCIuLi91dGlscy9jb21tb24iKSxpPXQoIi4vdHJlZXMiKSxvPXQoIi4vYWRsZXIzMiIpLHU9dCgiLi9jcmMzMiIpLHA9dCgiLi9tZXNzYWdlcyIpLGI9MCxnPTQsbT0wLEM9LTIseT0tMSxUPTQsUD0yLGM9OCxsPTksaD0yODYsXz0zMCxGPTE5LE89MipoKzEsZj0xNSxVPTMsWD0yNTgsUT1YK1UrMSxFPTQyLCQ9MTEzLHc9MSxrPTIsUz0zLEI9NDtmdW5jdGlvbiBMKEQsdXQpe3JldHVybiBELm1zZz1wW3V0XSx1dH1mdW5jdGlvbiBSKEQpe3JldHVybihEPDwxKS0oNDxEPzk6MCl9ZnVuY3Rpb24gcShEKXtmb3IodmFyIHV0PUQubGVuZ3RoOzA8PS0tdXQ7KURbdXRdPTB9ZnVuY3Rpb24geihEKXt2YXIgdXQ9RC5zdGF0ZSxvdD11dC5wZW5kaW5nO290PkQuYXZhaWxfb3V0JiYob3Q9RC5hdmFpbF9vdXQpLG90IT09MCYmKHMuYXJyYXlTZXQoRC5vdXRwdXQsdXQucGVuZGluZ19idWYsdXQucGVuZGluZ19vdXQsb3QsRC5uZXh0X291dCksRC5uZXh0X291dCs9b3QsdXQucGVuZGluZ19vdXQrPW90LEQudG90YWxfb3V0Kz1vdCxELmF2YWlsX291dC09b3QsdXQucGVuZGluZy09b3QsdXQucGVuZGluZz09PTAmJih1dC5wZW5kaW5nX291dD0wKSl9ZnVuY3Rpb24gRyhELHV0KXtpLl90cl9mbHVzaF9ibG9jayhELDA8PUQuYmxvY2tfc3RhcnQ/RC5ibG9ja19zdGFydDotMSxELnN0cnN0YXJ0LUQuYmxvY2tfc3RhcnQsdXQpLEQuYmxvY2tfc3RhcnQ9RC5zdHJzdGFydCx6KEQuc3RybSl9ZnVuY3Rpb24gbnQoRCx1dCl7RC5wZW5kaW5nX2J1ZltELnBlbmRpbmcrK109dXR9ZnVuY3Rpb24gdHQoRCx1dCl7RC5wZW5kaW5nX2J1ZltELnBlbmRpbmcrK109dXQ+Pj44JjI1NSxELnBlbmRpbmdfYnVmW0QucGVuZGluZysrXT0yNTUmdXR9ZnVuY3Rpb24gZXQoRCx1dCl7dmFyIG90LFYsaj1ELm1heF9jaGFpbl9sZW5ndGgsSz1ELnN0cnN0YXJ0LHB0PUQucHJldl9sZW5ndGgsdnQ9RC5uaWNlX21hdGNoLHJ0PUQuc3Ryc3RhcnQ+RC53X3NpemUtUT9ELnN0cnN0YXJ0LShELndfc2l6ZS1RKTowLGd0PUQud2luZG93LEN0PUQud19tYXNrLHh0PUQucHJldixtdD1ELnN0cnN0YXJ0K1gsenQ9Z3RbSytwdC0xXSxHdD1ndFtLK3B0XTtELnByZXZfbGVuZ3RoPj1ELmdvb2RfbWF0Y2gmJihqPj49MiksdnQ+RC5sb29rYWhlYWQmJih2dD1ELmxvb2thaGVhZCk7ZG8gaWYoZ3RbKG90PXV0KStwdF09PT1HdCYmZ3Rbb3QrcHQtMV09PT16dCYmZ3Rbb3RdPT09Z3RbS10mJmd0Wysrb3RdPT09Z3RbSysxXSl7Sys9MixvdCsrO2RvO3doaWxlKGd0WysrS109PT1ndFsrK290XSYmZ3RbKytLXT09PWd0Wysrb3RdJiZndFsrK0tdPT09Z3RbKytvdF0mJmd0WysrS109PT1ndFsrK290XSYmZ3RbKytLXT09PWd0Wysrb3RdJiZndFsrK0tdPT09Z3RbKytvdF0mJmd0WysrS109PT1ndFsrK290XSYmZ3RbKytLXT09PWd0Wysrb3RdJiZLPG10KTtpZihWPVgtKG10LUspLEs9bXQtWCxwdDxWKXtpZihELm1hdGNoX3N0YXJ0PXV0LHZ0PD0ocHQ9VikpYnJlYWs7enQ9Z3RbSytwdC0xXSxHdD1ndFtLK3B0XX19d2hpbGUoKHV0PXh0W3V0JkN0XSk+cnQmJi0taiE9MCk7cmV0dXJuIHB0PD1ELmxvb2thaGVhZD9wdDpELmxvb2thaGVhZH1mdW5jdGlvbiB3dChEKXt2YXIgdXQsb3QsVixqLEsscHQsdnQscnQsZ3QsQ3QseHQ9RC53X3NpemU7ZG97aWYoaj1ELndpbmRvd19zaXplLUQubG9va2FoZWFkLUQuc3Ryc3RhcnQsRC5zdHJzdGFydD49eHQrKHh0LVEpKXtmb3Iocy5hcnJheVNldChELndpbmRvdyxELndpbmRvdyx4dCx4dCwwKSxELm1hdGNoX3N0YXJ0LT14dCxELnN0cnN0YXJ0LT14dCxELmJsb2NrX3N0YXJ0LT14dCx1dD1vdD1ELmhhc2hfc2l6ZTtWPUQuaGVhZFstLXV0XSxELmhlYWRbdXRdPXh0PD1WP1YteHQ6MCwtLW90Oyk7Zm9yKHV0PW90PXh0O1Y9RC5wcmV2Wy0tdXRdLEQucHJldlt1dF09eHQ8PVY/Vi14dDowLC0tb3Q7KTtqKz14dH1pZihELnN0cm0uYXZhaWxfaW49PT0wKWJyZWFrO2lmKHB0PUQuc3RybSx2dD1ELndpbmRvdyxydD1ELnN0cnN0YXJ0K0QubG9va2FoZWFkLGd0PWosQ3Q9dm9pZCAwLEN0PXB0LmF2YWlsX2luLGd0PEN0JiYoQ3Q9Z3QpLG90PUN0PT09MD8wOihwdC5hdmFpbF9pbi09Q3Qscy5hcnJheVNldCh2dCxwdC5pbnB1dCxwdC5uZXh0X2luLEN0LHJ0KSxwdC5zdGF0ZS53cmFwPT09MT9wdC5hZGxlcj1vKHB0LmFkbGVyLHZ0LEN0LHJ0KTpwdC5zdGF0ZS53cmFwPT09MiYmKHB0LmFkbGVyPXUocHQuYWRsZXIsdnQsQ3QscnQpKSxwdC5uZXh0X2luKz1DdCxwdC50b3RhbF9pbis9Q3QsQ3QpLEQubG9va2FoZWFkKz1vdCxELmxvb2thaGVhZCtELmluc2VydD49VSlmb3IoSz1ELnN0cnN0YXJ0LUQuaW5zZXJ0LEQuaW5zX2g9RC53aW5kb3dbS10sRC5pbnNfaD0oRC5pbnNfaDw8RC5oYXNoX3NoaWZ0XkQud2luZG93W0srMV0pJkQuaGFzaF9tYXNrO0QuaW5zZXJ0JiYoRC5pbnNfaD0oRC5pbnNfaDw8RC5oYXNoX3NoaWZ0XkQud2luZG93W0srVS0xXSkmRC5oYXNoX21hc2ssRC5wcmV2W0smRC53X21hc2tdPUQuaGVhZFtELmluc19oXSxELmhlYWRbRC5pbnNfaF09SyxLKyssRC5pbnNlcnQtLSwhKEQubG9va2FoZWFkK0QuaW5zZXJ0PFUpKTspO313aGlsZShELmxvb2thaGVhZDxRJiZELnN0cm0uYXZhaWxfaW4hPT0wKX1mdW5jdGlvbiBTdChELHV0KXtmb3IodmFyIG90LFY7Oyl7aWYoRC5sb29rYWhlYWQ8USl7aWYod3QoRCksRC5sb29rYWhlYWQ8USYmdXQ9PT1iKXJldHVybiB3O2lmKEQubG9va2FoZWFkPT09MClicmVha31pZihvdD0wLEQubG9va2FoZWFkPj1VJiYoRC5pbnNfaD0oRC5pbnNfaDw8RC5oYXNoX3NoaWZ0XkQud2luZG93W0Quc3Ryc3RhcnQrVS0xXSkmRC5oYXNoX21hc2ssb3Q9RC5wcmV2W0Quc3Ryc3RhcnQmRC53X21hc2tdPUQuaGVhZFtELmluc19oXSxELmhlYWRbRC5pbnNfaF09RC5zdHJzdGFydCksb3QhPT0wJiZELnN0cnN0YXJ0LW90PD1ELndfc2l6ZS1RJiYoRC5tYXRjaF9sZW5ndGg9ZXQoRCxvdCkpLEQubWF0Y2hfbGVuZ3RoPj1VKWlmKFY9aS5fdHJfdGFsbHkoRCxELnN0cnN0YXJ0LUQubWF0Y2hfc3RhcnQsRC5tYXRjaF9sZW5ndGgtVSksRC5sb29rYWhlYWQtPUQubWF0Y2hfbGVuZ3RoLEQubWF0Y2hfbGVuZ3RoPD1ELm1heF9sYXp5X21hdGNoJiZELmxvb2thaGVhZD49VSl7Zm9yKEQubWF0Y2hfbGVuZ3RoLS07RC5zdHJzdGFydCsrLEQuaW5zX2g9KEQuaW5zX2g8PEQuaGFzaF9zaGlmdF5ELndpbmRvd1tELnN0cnN0YXJ0K1UtMV0pJkQuaGFzaF9tYXNrLG90PUQucHJldltELnN0cnN0YXJ0JkQud19tYXNrXT1ELmhlYWRbRC5pbnNfaF0sRC5oZWFkW0QuaW5zX2hdPUQuc3Ryc3RhcnQsLS1ELm1hdGNoX2xlbmd0aCE9MDspO0Quc3Ryc3RhcnQrK31lbHNlIEQuc3Ryc3RhcnQrPUQubWF0Y2hfbGVuZ3RoLEQubWF0Y2hfbGVuZ3RoPTAsRC5pbnNfaD1ELndpbmRvd1tELnN0cnN0YXJ0XSxELmluc19oPShELmluc19oPDxELmhhc2hfc2hpZnReRC53aW5kb3dbRC5zdHJzdGFydCsxXSkmRC5oYXNoX21hc2s7ZWxzZSBWPWkuX3RyX3RhbGx5KEQsMCxELndpbmRvd1tELnN0cnN0YXJ0XSksRC5sb29rYWhlYWQtLSxELnN0cnN0YXJ0Kys7aWYoViYmKEcoRCwhMSksRC5zdHJtLmF2YWlsX291dD09PTApKXJldHVybiB3fXJldHVybiBELmluc2VydD1ELnN0cnN0YXJ0PFUtMT9ELnN0cnN0YXJ0OlUtMSx1dD09PWc/KEcoRCwhMCksRC5zdHJtLmF2YWlsX291dD09PTA/UzpCKTpELmxhc3RfbGl0JiYoRyhELCExKSxELnN0cm0uYXZhaWxfb3V0PT09MCk/dzprfWZ1bmN0aW9uIFR0KEQsdXQpe2Zvcih2YXIgb3QsVixqOzspe2lmKEQubG9va2FoZWFkPFEpe2lmKHd0KEQpLEQubG9va2FoZWFkPFEmJnV0PT09YilyZXR1cm4gdztpZihELmxvb2thaGVhZD09PTApYnJlYWt9aWYob3Q9MCxELmxvb2thaGVhZD49VSYmKEQuaW5zX2g9KEQuaW5zX2g8PEQuaGFzaF9zaGlmdF5ELndpbmRvd1tELnN0cnN0YXJ0K1UtMV0pJkQuaGFzaF9tYXNrLG90PUQucHJldltELnN0cnN0YXJ0JkQud19tYXNrXT1ELmhlYWRbRC5pbnNfaF0sRC5oZWFkW0QuaW5zX2hdPUQuc3Ryc3RhcnQpLEQucHJldl9sZW5ndGg9RC5tYXRjaF9sZW5ndGgsRC5wcmV2X21hdGNoPUQubWF0Y2hfc3RhcnQsRC5tYXRjaF9sZW5ndGg9VS0xLG90IT09MCYmRC5wcmV2X2xlbmd0aDxELm1heF9sYXp5X21hdGNoJiZELnN0cnN0YXJ0LW90PD1ELndfc2l6ZS1RJiYoRC5tYXRjaF9sZW5ndGg9ZXQoRCxvdCksRC5tYXRjaF9sZW5ndGg8PTUmJihELnN0cmF0ZWd5PT09MXx8RC5tYXRjaF9sZW5ndGg9PT1VJiY0MDk2PEQuc3Ryc3RhcnQtRC5tYXRjaF9zdGFydCkmJihELm1hdGNoX2xlbmd0aD1VLTEpKSxELnByZXZfbGVuZ3RoPj1VJiZELm1hdGNoX2xlbmd0aDw9RC5wcmV2X2xlbmd0aCl7Zm9yKGo9RC5zdHJzdGFydCtELmxvb2thaGVhZC1VLFY9aS5fdHJfdGFsbHkoRCxELnN0cnN0YXJ0LTEtRC5wcmV2X21hdGNoLEQucHJldl9sZW5ndGgtVSksRC5sb29rYWhlYWQtPUQucHJldl9sZW5ndGgtMSxELnByZXZfbGVuZ3RoLT0yOysrRC5zdHJzdGFydDw9aiYmKEQuaW5zX2g9KEQuaW5zX2g8PEQuaGFzaF9zaGlmdF5ELndpbmRvd1tELnN0cnN0YXJ0K1UtMV0pJkQuaGFzaF9tYXNrLG90PUQucHJldltELnN0cnN0YXJ0JkQud19tYXNrXT1ELmhlYWRbRC5pbnNfaF0sRC5oZWFkW0QuaW5zX2hdPUQuc3Ryc3RhcnQpLC0tRC5wcmV2X2xlbmd0aCE9MDspO2lmKEQubWF0Y2hfYXZhaWxhYmxlPTAsRC5tYXRjaF9sZW5ndGg9VS0xLEQuc3Ryc3RhcnQrKyxWJiYoRyhELCExKSxELnN0cm0uYXZhaWxfb3V0PT09MCkpcmV0dXJuIHd9ZWxzZSBpZihELm1hdGNoX2F2YWlsYWJsZSl7aWYoKFY9aS5fdHJfdGFsbHkoRCwwLEQud2luZG93W0Quc3Ryc3RhcnQtMV0pKSYmRyhELCExKSxELnN0cnN0YXJ0KyssRC5sb29rYWhlYWQtLSxELnN0cm0uYXZhaWxfb3V0PT09MClyZXR1cm4gd31lbHNlIEQubWF0Y2hfYXZhaWxhYmxlPTEsRC5zdHJzdGFydCsrLEQubG9va2FoZWFkLS19cmV0dXJuIEQubWF0Y2hfYXZhaWxhYmxlJiYoVj1pLl90cl90YWxseShELDAsRC53aW5kb3dbRC5zdHJzdGFydC0xXSksRC5tYXRjaF9hdmFpbGFibGU9MCksRC5pbnNlcnQ9RC5zdHJzdGFydDxVLTE/RC5zdHJzdGFydDpVLTEsdXQ9PT1nPyhHKEQsITApLEQuc3RybS5hdmFpbF9vdXQ9PT0wP1M6Qik6RC5sYXN0X2xpdCYmKEcoRCwhMSksRC5zdHJtLmF2YWlsX291dD09PTApP3c6a31mdW5jdGlvbiBrdChELHV0LG90LFYsail7dGhpcy5nb29kX2xlbmd0aD1ELHRoaXMubWF4X2xhenk9dXQsdGhpcy5uaWNlX2xlbmd0aD1vdCx0aGlzLm1heF9jaGFpbj1WLHRoaXMuZnVuYz1qfWZ1bmN0aW9uIEx0KCl7dGhpcy5zdHJtPW51bGwsdGhpcy5zdGF0dXM9MCx0aGlzLnBlbmRpbmdfYnVmPW51bGwsdGhpcy5wZW5kaW5nX2J1Zl9zaXplPTAsdGhpcy5wZW5kaW5nX291dD0wLHRoaXMucGVuZGluZz0wLHRoaXMud3JhcD0wLHRoaXMuZ3poZWFkPW51bGwsdGhpcy5nemluZGV4PTAsdGhpcy5tZXRob2Q9Yyx0aGlzLmxhc3RfZmx1c2g9LTEsdGhpcy53X3NpemU9MCx0aGlzLndfYml0cz0wLHRoaXMud19tYXNrPTAsdGhpcy53aW5kb3c9bnVsbCx0aGlzLndpbmRvd19zaXplPTAsdGhpcy5wcmV2PW51bGwsdGhpcy5oZWFkPW51bGwsdGhpcy5pbnNfaD0wLHRoaXMuaGFzaF9zaXplPTAsdGhpcy5oYXNoX2JpdHM9MCx0aGlzLmhhc2hfbWFzaz0wLHRoaXMuaGFzaF9zaGlmdD0wLHRoaXMuYmxvY2tfc3RhcnQ9MCx0aGlzLm1hdGNoX2xlbmd0aD0wLHRoaXMucHJldl9tYXRjaD0wLHRoaXMubWF0Y2hfYXZhaWxhYmxlPTAsdGhpcy5zdHJzdGFydD0wLHRoaXMubWF0Y2hfc3RhcnQ9MCx0aGlzLmxvb2thaGVhZD0wLHRoaXMucHJldl9sZW5ndGg9MCx0aGlzLm1heF9jaGFpbl9sZW5ndGg9MCx0aGlzLm1heF9sYXp5X21hdGNoPTAsdGhpcy5sZXZlbD0wLHRoaXMuc3RyYXRlZ3k9MCx0aGlzLmdvb2RfbWF0Y2g9MCx0aGlzLm5pY2VfbWF0Y2g9MCx0aGlzLmR5bl9sdHJlZT1uZXcgcy5CdWYxNigyKk8pLHRoaXMuZHluX2R0cmVlPW5ldyBzLkJ1ZjE2KDIqKDIqXysxKSksdGhpcy5ibF90cmVlPW5ldyBzLkJ1ZjE2KDIqKDIqRisxKSkscSh0aGlzLmR5bl9sdHJlZSkscSh0aGlzLmR5bl9kdHJlZSkscSh0aGlzLmJsX3RyZWUpLHRoaXMubF9kZXNjPW51bGwsdGhpcy5kX2Rlc2M9bnVsbCx0aGlzLmJsX2Rlc2M9bnVsbCx0aGlzLmJsX2NvdW50PW5ldyBzLkJ1ZjE2KGYrMSksdGhpcy5oZWFwPW5ldyBzLkJ1ZjE2KDIqaCsxKSxxKHRoaXMuaGVhcCksdGhpcy5oZWFwX2xlbj0wLHRoaXMuaGVhcF9tYXg9MCx0aGlzLmRlcHRoPW5ldyBzLkJ1ZjE2KDIqaCsxKSxxKHRoaXMuZGVwdGgpLHRoaXMubF9idWY9MCx0aGlzLmxpdF9idWZzaXplPTAsdGhpcy5sYXN0X2xpdD0wLHRoaXMuZF9idWY9MCx0aGlzLm9wdF9sZW49MCx0aGlzLnN0YXRpY19sZW49MCx0aGlzLm1hdGNoZXM9MCx0aGlzLmluc2VydD0wLHRoaXMuYmlfYnVmPTAsdGhpcy5iaV92YWxpZD0wfWZ1bmN0aW9uIEJ0KEQpe3ZhciB1dDtyZXR1cm4gRCYmRC5zdGF0ZT8oRC50b3RhbF9pbj1ELnRvdGFsX291dD0wLEQuZGF0YV90eXBlPVAsKHV0PUQuc3RhdGUpLnBlbmRpbmc9MCx1dC5wZW5kaW5nX291dD0wLHV0LndyYXA8MCYmKHV0LndyYXA9LXV0LndyYXApLHV0LnN0YXR1cz11dC53cmFwP0U6JCxELmFkbGVyPXV0LndyYXA9PT0yPzA6MSx1dC5sYXN0X2ZsdXNoPWIsaS5fdHJfaW5pdCh1dCksbSk6TChELEMpfWZ1bmN0aW9uICR0KEQpe3ZhciB1dD1CdChEKTtyZXR1cm4gdXQ9PT1tJiZmdW5jdGlvbihvdCl7b3Qud2luZG93X3NpemU9MipvdC53X3NpemUscShvdC5oZWFkKSxvdC5tYXhfbGF6eV9tYXRjaD1yW290LmxldmVsXS5tYXhfbGF6eSxvdC5nb29kX21hdGNoPXJbb3QubGV2ZWxdLmdvb2RfbGVuZ3RoLG90Lm5pY2VfbWF0Y2g9cltvdC5sZXZlbF0ubmljZV9sZW5ndGgsb3QubWF4X2NoYWluX2xlbmd0aD1yW290LmxldmVsXS5tYXhfY2hhaW4sb3Quc3Ryc3RhcnQ9MCxvdC5ibG9ja19zdGFydD0wLG90Lmxvb2thaGVhZD0wLG90Lmluc2VydD0wLG90Lm1hdGNoX2xlbmd0aD1vdC5wcmV2X2xlbmd0aD1VLTEsb3QubWF0Y2hfYXZhaWxhYmxlPTAsb3QuaW5zX2g9MH0oRC5zdGF0ZSksdXR9ZnVuY3Rpb24gS3QoRCx1dCxvdCxWLGosSyl7aWYoIUQpcmV0dXJuIEM7dmFyIHB0PTE7aWYodXQ9PT15JiYodXQ9NiksVjwwPyhwdD0wLFY9LVYpOjE1PFYmJihwdD0yLFYtPTE2KSxqPDF8fGw8anx8b3QhPT1jfHxWPDh8fDE1PFZ8fHV0PDB8fDk8dXR8fEs8MHx8VDxLKXJldHVybiBMKEQsQyk7Vj09PTgmJihWPTkpO3ZhciB2dD1uZXcgTHQ7cmV0dXJuKEQuc3RhdGU9dnQpLnN0cm09RCx2dC53cmFwPXB0LHZ0Lmd6aGVhZD1udWxsLHZ0LndfYml0cz1WLHZ0Lndfc2l6ZT0xPDx2dC53X2JpdHMsdnQud19tYXNrPXZ0Lndfc2l6ZS0xLHZ0Lmhhc2hfYml0cz1qKzcsdnQuaGFzaF9zaXplPTE8PHZ0Lmhhc2hfYml0cyx2dC5oYXNoX21hc2s9dnQuaGFzaF9zaXplLTEsdnQuaGFzaF9zaGlmdD1+figodnQuaGFzaF9iaXRzK1UtMSkvVSksdnQud2luZG93PW5ldyBzLkJ1ZjgoMip2dC53X3NpemUpLHZ0LmhlYWQ9bmV3IHMuQnVmMTYodnQuaGFzaF9zaXplKSx2dC5wcmV2PW5ldyBzLkJ1ZjE2KHZ0Lndfc2l6ZSksdnQubGl0X2J1ZnNpemU9MTw8ais2LHZ0LnBlbmRpbmdfYnVmX3NpemU9NCp2dC5saXRfYnVmc2l6ZSx2dC5wZW5kaW5nX2J1Zj1uZXcgcy5CdWY4KHZ0LnBlbmRpbmdfYnVmX3NpemUpLHZ0LmRfYnVmPTEqdnQubGl0X2J1ZnNpemUsdnQubF9idWY9Myp2dC5saXRfYnVmc2l6ZSx2dC5sZXZlbD11dCx2dC5zdHJhdGVneT1LLHZ0Lm1ldGhvZD1vdCwkdChEKX1yPVtuZXcga3QoMCwwLDAsMCxmdW5jdGlvbihELHV0KXt2YXIgb3Q9NjU1MzU7Zm9yKG90PkQucGVuZGluZ19idWZfc2l6ZS01JiYob3Q9RC5wZW5kaW5nX2J1Zl9zaXplLTUpOzspe2lmKEQubG9va2FoZWFkPD0xKXtpZih3dChEKSxELmxvb2thaGVhZD09PTAmJnV0PT09YilyZXR1cm4gdztpZihELmxvb2thaGVhZD09PTApYnJlYWt9RC5zdHJzdGFydCs9RC5sb29rYWhlYWQsRC5sb29rYWhlYWQ9MDt2YXIgVj1ELmJsb2NrX3N0YXJ0K290O2lmKChELnN0cnN0YXJ0PT09MHx8RC5zdHJzdGFydD49VikmJihELmxvb2thaGVhZD1ELnN0cnN0YXJ0LVYsRC5zdHJzdGFydD1WLEcoRCwhMSksRC5zdHJtLmF2YWlsX291dD09PTApfHxELnN0cnN0YXJ0LUQuYmxvY2tfc3RhcnQ+PUQud19zaXplLVEmJihHKEQsITEpLEQuc3RybS5hdmFpbF9vdXQ9PT0wKSlyZXR1cm4gd31yZXR1cm4gRC5pbnNlcnQ9MCx1dD09PWc/KEcoRCwhMCksRC5zdHJtLmF2YWlsX291dD09PTA/UzpCKTooRC5zdHJzdGFydD5ELmJsb2NrX3N0YXJ0JiYoRyhELCExKSxELnN0cm0uYXZhaWxfb3V0KSx3KX0pLG5ldyBrdCg0LDQsOCw0LFN0KSxuZXcga3QoNCw1LDE2LDgsU3QpLG5ldyBrdCg0LDYsMzIsMzIsU3QpLG5ldyBrdCg0LDQsMTYsMTYsVHQpLG5ldyBrdCg4LDE2LDMyLDMyLFR0KSxuZXcga3QoOCwxNiwxMjgsMTI4LFR0KSxuZXcga3QoOCwzMiwxMjgsMjU2LFR0KSxuZXcga3QoMzIsMTI4LDI1OCwxMDI0LFR0KSxuZXcga3QoMzIsMjU4LDI1OCw0MDk2LFR0KV0sbi5kZWZsYXRlSW5pdD1mdW5jdGlvbihELHV0KXtyZXR1cm4gS3QoRCx1dCxjLDE1LDgsMCl9LG4uZGVmbGF0ZUluaXQyPUt0LG4uZGVmbGF0ZVJlc2V0PSR0LG4uZGVmbGF0ZVJlc2V0S2VlcD1CdCxuLmRlZmxhdGVTZXRIZWFkZXI9ZnVuY3Rpb24oRCx1dCl7cmV0dXJuIEQmJkQuc3RhdGU/RC5zdGF0ZS53cmFwIT09Mj9DOihELnN0YXRlLmd6aGVhZD11dCxtKTpDfSxuLmRlZmxhdGU9ZnVuY3Rpb24oRCx1dCl7dmFyIG90LFYsaixLO2lmKCFEfHwhRC5zdGF0ZXx8NTx1dHx8dXQ8MClyZXR1cm4gRD9MKEQsQyk6QztpZihWPUQuc3RhdGUsIUQub3V0cHV0fHwhRC5pbnB1dCYmRC5hdmFpbF9pbiE9PTB8fFYuc3RhdHVzPT09NjY2JiZ1dCE9PWcpcmV0dXJuIEwoRCxELmF2YWlsX291dD09PTA/LTU6Qyk7aWYoVi5zdHJtPUQsb3Q9Vi5sYXN0X2ZsdXNoLFYubGFzdF9mbHVzaD11dCxWLnN0YXR1cz09PUUpaWYoVi53cmFwPT09MilELmFkbGVyPTAsbnQoViwzMSksbnQoViwxMzkpLG50KFYsOCksVi5nemhlYWQ/KG50KFYsKFYuZ3poZWFkLnRleHQ/MTowKSsoVi5nemhlYWQuaGNyYz8yOjApKyhWLmd6aGVhZC5leHRyYT80OjApKyhWLmd6aGVhZC5uYW1lPzg6MCkrKFYuZ3poZWFkLmNvbW1lbnQ/MTY6MCkpLG50KFYsMjU1JlYuZ3poZWFkLnRpbWUpLG50KFYsVi5nemhlYWQudGltZT4+OCYyNTUpLG50KFYsVi5nemhlYWQudGltZT4+MTYmMjU1KSxudChWLFYuZ3poZWFkLnRpbWU+PjI0JjI1NSksbnQoVixWLmxldmVsPT09OT8yOjI8PVYuc3RyYXRlZ3l8fFYubGV2ZWw8Mj80OjApLG50KFYsMjU1JlYuZ3poZWFkLm9zKSxWLmd6aGVhZC5leHRyYSYmVi5nemhlYWQuZXh0cmEubGVuZ3RoJiYobnQoViwyNTUmVi5nemhlYWQuZXh0cmEubGVuZ3RoKSxudChWLFYuZ3poZWFkLmV4dHJhLmxlbmd0aD4+OCYyNTUpKSxWLmd6aGVhZC5oY3JjJiYoRC5hZGxlcj11KEQuYWRsZXIsVi5wZW5kaW5nX2J1ZixWLnBlbmRpbmcsMCkpLFYuZ3ppbmRleD0wLFYuc3RhdHVzPTY5KToobnQoViwwKSxudChWLDApLG50KFYsMCksbnQoViwwKSxudChWLDApLG50KFYsVi5sZXZlbD09PTk/MjoyPD1WLnN0cmF0ZWd5fHxWLmxldmVsPDI/NDowKSxudChWLDMpLFYuc3RhdHVzPSQpO2Vsc2V7dmFyIHB0PWMrKFYud19iaXRzLTg8PDQpPDw4O3B0fD0oMjw9Vi5zdHJhdGVneXx8Vi5sZXZlbDwyPzA6Vi5sZXZlbDw2PzE6Vi5sZXZlbD09PTY/MjozKTw8NixWLnN0cnN0YXJ0IT09MCYmKHB0fD0zMikscHQrPTMxLXB0JTMxLFYuc3RhdHVzPSQsdHQoVixwdCksVi5zdHJzdGFydCE9PTAmJih0dChWLEQuYWRsZXI+Pj4xNiksdHQoViw2NTUzNSZELmFkbGVyKSksRC5hZGxlcj0xfWlmKFYuc3RhdHVzPT09NjkpaWYoVi5nemhlYWQuZXh0cmEpe2ZvcihqPVYucGVuZGluZztWLmd6aW5kZXg8KDY1NTM1JlYuZ3poZWFkLmV4dHJhLmxlbmd0aCkmJihWLnBlbmRpbmchPT1WLnBlbmRpbmdfYnVmX3NpemV8fChWLmd6aGVhZC5oY3JjJiZWLnBlbmRpbmc+aiYmKEQuYWRsZXI9dShELmFkbGVyLFYucGVuZGluZ19idWYsVi5wZW5kaW5nLWosaikpLHooRCksaj1WLnBlbmRpbmcsVi5wZW5kaW5nIT09Vi5wZW5kaW5nX2J1Zl9zaXplKSk7KW50KFYsMjU1JlYuZ3poZWFkLmV4dHJhW1YuZ3ppbmRleF0pLFYuZ3ppbmRleCsrO1YuZ3poZWFkLmhjcmMmJlYucGVuZGluZz5qJiYoRC5hZGxlcj11KEQuYWRsZXIsVi5wZW5kaW5nX2J1ZixWLnBlbmRpbmctaixqKSksVi5nemluZGV4PT09Vi5nemhlYWQuZXh0cmEubGVuZ3RoJiYoVi5nemluZGV4PTAsVi5zdGF0dXM9NzMpfWVsc2UgVi5zdGF0dXM9NzM7aWYoVi5zdGF0dXM9PT03MylpZihWLmd6aGVhZC5uYW1lKXtqPVYucGVuZGluZztkb3tpZihWLnBlbmRpbmc9PT1WLnBlbmRpbmdfYnVmX3NpemUmJihWLmd6aGVhZC5oY3JjJiZWLnBlbmRpbmc+aiYmKEQuYWRsZXI9dShELmFkbGVyLFYucGVuZGluZ19idWYsVi5wZW5kaW5nLWosaikpLHooRCksaj1WLnBlbmRpbmcsVi5wZW5kaW5nPT09Vi5wZW5kaW5nX2J1Zl9zaXplKSl7Sz0xO2JyZWFrfUs9Vi5nemluZGV4PFYuZ3poZWFkLm5hbWUubGVuZ3RoPzI1NSZWLmd6aGVhZC5uYW1lLmNoYXJDb2RlQXQoVi5nemluZGV4KyspOjAsbnQoVixLKX13aGlsZShLIT09MCk7Vi5nemhlYWQuaGNyYyYmVi5wZW5kaW5nPmomJihELmFkbGVyPXUoRC5hZGxlcixWLnBlbmRpbmdfYnVmLFYucGVuZGluZy1qLGopKSxLPT09MCYmKFYuZ3ppbmRleD0wLFYuc3RhdHVzPTkxKX1lbHNlIFYuc3RhdHVzPTkxO2lmKFYuc3RhdHVzPT09OTEpaWYoVi5nemhlYWQuY29tbWVudCl7aj1WLnBlbmRpbmc7ZG97aWYoVi5wZW5kaW5nPT09Vi5wZW5kaW5nX2J1Zl9zaXplJiYoVi5nemhlYWQuaGNyYyYmVi5wZW5kaW5nPmomJihELmFkbGVyPXUoRC5hZGxlcixWLnBlbmRpbmdfYnVmLFYucGVuZGluZy1qLGopKSx6KEQpLGo9Vi5wZW5kaW5nLFYucGVuZGluZz09PVYucGVuZGluZ19idWZfc2l6ZSkpe0s9MTticmVha31LPVYuZ3ppbmRleDxWLmd6aGVhZC5jb21tZW50Lmxlbmd0aD8yNTUmVi5nemhlYWQuY29tbWVudC5jaGFyQ29kZUF0KFYuZ3ppbmRleCsrKTowLG50KFYsSyl9d2hpbGUoSyE9PTApO1YuZ3poZWFkLmhjcmMmJlYucGVuZGluZz5qJiYoRC5hZGxlcj11KEQuYWRsZXIsVi5wZW5kaW5nX2J1ZixWLnBlbmRpbmctaixqKSksSz09PTAmJihWLnN0YXR1cz0xMDMpfWVsc2UgVi5zdGF0dXM9MTAzO2lmKFYuc3RhdHVzPT09MTAzJiYoVi5nemhlYWQuaGNyYz8oVi5wZW5kaW5nKzI+Vi5wZW5kaW5nX2J1Zl9zaXplJiZ6KEQpLFYucGVuZGluZysyPD1WLnBlbmRpbmdfYnVmX3NpemUmJihudChWLDI1NSZELmFkbGVyKSxudChWLEQuYWRsZXI+PjgmMjU1KSxELmFkbGVyPTAsVi5zdGF0dXM9JCkpOlYuc3RhdHVzPSQpLFYucGVuZGluZyE9PTApe2lmKHooRCksRC5hdmFpbF9vdXQ9PT0wKXJldHVybiBWLmxhc3RfZmx1c2g9LTEsbX1lbHNlIGlmKEQuYXZhaWxfaW49PT0wJiZSKHV0KTw9UihvdCkmJnV0IT09ZylyZXR1cm4gTChELC01KTtpZihWLnN0YXR1cz09PTY2NiYmRC5hdmFpbF9pbiE9PTApcmV0dXJuIEwoRCwtNSk7aWYoRC5hdmFpbF9pbiE9PTB8fFYubG9va2FoZWFkIT09MHx8dXQhPT1iJiZWLnN0YXR1cyE9PTY2Nil7dmFyIHZ0PVYuc3RyYXRlZ3k9PT0yP2Z1bmN0aW9uKHJ0LGd0KXtmb3IodmFyIEN0Ozspe2lmKHJ0Lmxvb2thaGVhZD09PTAmJih3dChydCkscnQubG9va2FoZWFkPT09MCkpe2lmKGd0PT09YilyZXR1cm4gdzticmVha31pZihydC5tYXRjaF9sZW5ndGg9MCxDdD1pLl90cl90YWxseShydCwwLHJ0LndpbmRvd1tydC5zdHJzdGFydF0pLHJ0Lmxvb2thaGVhZC0tLHJ0LnN0cnN0YXJ0KyssQ3QmJihHKHJ0LCExKSxydC5zdHJtLmF2YWlsX291dD09PTApKXJldHVybiB3fXJldHVybiBydC5pbnNlcnQ9MCxndD09PWc/KEcocnQsITApLHJ0LnN0cm0uYXZhaWxfb3V0PT09MD9TOkIpOnJ0Lmxhc3RfbGl0JiYoRyhydCwhMSkscnQuc3RybS5hdmFpbF9vdXQ9PT0wKT93Omt9KFYsdXQpOlYuc3RyYXRlZ3k9PT0zP2Z1bmN0aW9uKHJ0LGd0KXtmb3IodmFyIEN0LHh0LG10LHp0LEd0PXJ0LndpbmRvdzs7KXtpZihydC5sb29rYWhlYWQ8PVgpe2lmKHd0KHJ0KSxydC5sb29rYWhlYWQ8PVgmJmd0PT09YilyZXR1cm4gdztpZihydC5sb29rYWhlYWQ9PT0wKWJyZWFrfWlmKHJ0Lm1hdGNoX2xlbmd0aD0wLHJ0Lmxvb2thaGVhZD49VSYmMDxydC5zdHJzdGFydCYmKHh0PUd0W210PXJ0LnN0cnN0YXJ0LTFdKT09PUd0WysrbXRdJiZ4dD09PUd0WysrbXRdJiZ4dD09PUd0WysrbXRdKXt6dD1ydC5zdHJzdGFydCtYO2RvO3doaWxlKHh0PT09R3RbKyttdF0mJnh0PT09R3RbKyttdF0mJnh0PT09R3RbKyttdF0mJnh0PT09R3RbKyttdF0mJnh0PT09R3RbKyttdF0mJnh0PT09R3RbKyttdF0mJnh0PT09R3RbKyttdF0mJnh0PT09R3RbKyttdF0mJm10PHp0KTtydC5tYXRjaF9sZW5ndGg9WC0oenQtbXQpLHJ0Lm1hdGNoX2xlbmd0aD5ydC5sb29rYWhlYWQmJihydC5tYXRjaF9sZW5ndGg9cnQubG9va2FoZWFkKX1pZihydC5tYXRjaF9sZW5ndGg+PVU/KEN0PWkuX3RyX3RhbGx5KHJ0LDEscnQubWF0Y2hfbGVuZ3RoLVUpLHJ0Lmxvb2thaGVhZC09cnQubWF0Y2hfbGVuZ3RoLHJ0LnN0cnN0YXJ0Kz1ydC5tYXRjaF9sZW5ndGgscnQubWF0Y2hfbGVuZ3RoPTApOihDdD1pLl90cl90YWxseShydCwwLHJ0LndpbmRvd1tydC5zdHJzdGFydF0pLHJ0Lmxvb2thaGVhZC0tLHJ0LnN0cnN0YXJ0KyspLEN0JiYoRyhydCwhMSkscnQuc3RybS5hdmFpbF9vdXQ9PT0wKSlyZXR1cm4gd31yZXR1cm4gcnQuaW5zZXJ0PTAsZ3Q9PT1nPyhHKHJ0LCEwKSxydC5zdHJtLmF2YWlsX291dD09PTA/UzpCKTpydC5sYXN0X2xpdCYmKEcocnQsITEpLHJ0LnN0cm0uYXZhaWxfb3V0PT09MCk/dzprfShWLHV0KTpyW1YubGV2ZWxdLmZ1bmMoVix1dCk7aWYodnQhPT1TJiZ2dCE9PUJ8fChWLnN0YXR1cz02NjYpLHZ0PT09d3x8dnQ9PT1TKXJldHVybiBELmF2YWlsX291dD09PTAmJihWLmxhc3RfZmx1c2g9LTEpLG07aWYodnQ9PT1rJiYodXQ9PT0xP2kuX3RyX2FsaWduKFYpOnV0IT09NSYmKGkuX3RyX3N0b3JlZF9ibG9jayhWLDAsMCwhMSksdXQ9PT0zJiYocShWLmhlYWQpLFYubG9va2FoZWFkPT09MCYmKFYuc3Ryc3RhcnQ9MCxWLmJsb2NrX3N0YXJ0PTAsVi5pbnNlcnQ9MCkpKSx6KEQpLEQuYXZhaWxfb3V0PT09MCkpcmV0dXJuIFYubGFzdF9mbHVzaD0tMSxtfXJldHVybiB1dCE9PWc/bTpWLndyYXA8PTA/MTooVi53cmFwPT09Mj8obnQoViwyNTUmRC5hZGxlciksbnQoVixELmFkbGVyPj44JjI1NSksbnQoVixELmFkbGVyPj4xNiYyNTUpLG50KFYsRC5hZGxlcj4+MjQmMjU1KSxudChWLDI1NSZELnRvdGFsX2luKSxudChWLEQudG90YWxfaW4+PjgmMjU1KSxudChWLEQudG90YWxfaW4+PjE2JjI1NSksbnQoVixELnRvdGFsX2luPj4yNCYyNTUpKToodHQoVixELmFkbGVyPj4+MTYpLHR0KFYsNjU1MzUmRC5hZGxlcikpLHooRCksMDxWLndyYXAmJihWLndyYXA9LVYud3JhcCksVi5wZW5kaW5nIT09MD9tOjEpfSxuLmRlZmxhdGVFbmQ9ZnVuY3Rpb24oRCl7dmFyIHV0O3JldHVybiBEJiZELnN0YXRlPyh1dD1ELnN0YXRlLnN0YXR1cykhPT1FJiZ1dCE9PTY5JiZ1dCE9PTczJiZ1dCE9PTkxJiZ1dCE9PTEwMyYmdXQhPT0kJiZ1dCE9PTY2Nj9MKEQsQyk6KEQuc3RhdGU9bnVsbCx1dD09PSQ/TChELC0zKTptKTpDfSxuLmRlZmxhdGVTZXREaWN0aW9uYXJ5PWZ1bmN0aW9uKEQsdXQpe3ZhciBvdCxWLGosSyxwdCx2dCxydCxndCxDdD11dC5sZW5ndGg7aWYoIUR8fCFELnN0YXRlfHwoSz0ob3Q9RC5zdGF0ZSkud3JhcCk9PT0yfHxLPT09MSYmb3Quc3RhdHVzIT09RXx8b3QubG9va2FoZWFkKXJldHVybiBDO2ZvcihLPT09MSYmKEQuYWRsZXI9byhELmFkbGVyLHV0LEN0LDApKSxvdC53cmFwPTAsQ3Q+PW90Lndfc2l6ZSYmKEs9PT0wJiYocShvdC5oZWFkKSxvdC5zdHJzdGFydD0wLG90LmJsb2NrX3N0YXJ0PTAsb3QuaW5zZXJ0PTApLGd0PW5ldyBzLkJ1Zjgob3Qud19zaXplKSxzLmFycmF5U2V0KGd0LHV0LEN0LW90Lndfc2l6ZSxvdC53X3NpemUsMCksdXQ9Z3QsQ3Q9b3Qud19zaXplKSxwdD1ELmF2YWlsX2luLHZ0PUQubmV4dF9pbixydD1ELmlucHV0LEQuYXZhaWxfaW49Q3QsRC5uZXh0X2luPTAsRC5pbnB1dD11dCx3dChvdCk7b3QubG9va2FoZWFkPj1VOyl7Zm9yKFY9b3Quc3Ryc3RhcnQsaj1vdC5sb29rYWhlYWQtKFUtMSk7b3QuaW5zX2g9KG90Lmluc19oPDxvdC5oYXNoX3NoaWZ0Xm90LndpbmRvd1tWK1UtMV0pJm90Lmhhc2hfbWFzayxvdC5wcmV2W1Ymb3Qud19tYXNrXT1vdC5oZWFkW290Lmluc19oXSxvdC5oZWFkW290Lmluc19oXT1WLFYrKywtLWo7KTtvdC5zdHJzdGFydD1WLG90Lmxvb2thaGVhZD1VLTEsd3Qob3QpfXJldHVybiBvdC5zdHJzdGFydCs9b3QubG9va2FoZWFkLG90LmJsb2NrX3N0YXJ0PW90LnN0cnN0YXJ0LG90Lmluc2VydD1vdC5sb29rYWhlYWQsb3QubG9va2FoZWFkPTAsb3QubWF0Y2hfbGVuZ3RoPW90LnByZXZfbGVuZ3RoPVUtMSxvdC5tYXRjaF9hdmFpbGFibGU9MCxELm5leHRfaW49dnQsRC5pbnB1dD1ydCxELmF2YWlsX2luPXB0LG90LndyYXA9SyxtfSxuLmRlZmxhdGVJbmZvPSJwYWtvIGRlZmxhdGUgKGZyb20gTm9kZWNhIHByb2plY3QpIn0seyIuLi91dGlscy9jb21tb24iOjQxLCIuL2FkbGVyMzIiOjQzLCIuL2NyYzMyIjo0NSwiLi9tZXNzYWdlcyI6NTEsIi4vdHJlZXMiOjUyfV0sNDc6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPWZ1bmN0aW9uKCl7dGhpcy50ZXh0PTAsdGhpcy50aW1lPTAsdGhpcy54ZmxhZ3M9MCx0aGlzLm9zPTAsdGhpcy5leHRyYT1udWxsLHRoaXMuZXh0cmFfbGVuPTAsdGhpcy5uYW1lPSIiLHRoaXMuY29tbWVudD0iIix0aGlzLmhjcmM9MCx0aGlzLmRvbmU9ITF9fSx7fV0sNDg6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPWZ1bmN0aW9uKHIscyl7dmFyIGksbyx1LHAsYixnLG0sQyx5LFQsUCxjLGwsaCxfLEYsTyxmLFUsWCxRLEUsJCx3LGs7aT1yLnN0YXRlLG89ci5uZXh0X2luLHc9ci5pbnB1dCx1PW8rKHIuYXZhaWxfaW4tNSkscD1yLm5leHRfb3V0LGs9ci5vdXRwdXQsYj1wLShzLXIuYXZhaWxfb3V0KSxnPXArKHIuYXZhaWxfb3V0LTI1NyksbT1pLmRtYXgsQz1pLndzaXplLHk9aS53aGF2ZSxUPWkud25leHQsUD1pLndpbmRvdyxjPWkuaG9sZCxsPWkuYml0cyxoPWkubGVuY29kZSxfPWkuZGlzdGNvZGUsRj0oMTw8aS5sZW5iaXRzKS0xLE89KDE8PGkuZGlzdGJpdHMpLTE7dDpkb3tsPDE1JiYoYys9d1tvKytdPDxsLGwrPTgsYys9d1tvKytdPDxsLGwrPTgpLGY9aFtjJkZdO2U6Zm9yKDs7KXtpZihjPj4+PVU9Zj4+PjI0LGwtPVUsKFU9Zj4+PjE2JjI1NSk9PT0wKWtbcCsrXT02NTUzNSZmO2Vsc2V7aWYoISgxNiZVKSl7aWYoISg2NCZVKSl7Zj1oWyg2NTUzNSZmKSsoYyYoMTw8VSktMSldO2NvbnRpbnVlIGV9aWYoMzImVSl7aS5tb2RlPTEyO2JyZWFrIHR9ci5tc2c9ImludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSIsaS5tb2RlPTMwO2JyZWFrIHR9WD02NTUzNSZmLChVJj0xNSkmJihsPFUmJihjKz13W28rK108PGwsbCs9OCksWCs9YyYoMTw8VSktMSxjPj4+PVUsbC09VSksbDwxNSYmKGMrPXdbbysrXTw8bCxsKz04LGMrPXdbbysrXTw8bCxsKz04KSxmPV9bYyZPXTtuOmZvcig7Oyl7aWYoYz4+Pj1VPWY+Pj4yNCxsLT1VLCEoMTYmKFU9Zj4+PjE2JjI1NSkpKXtpZighKDY0JlUpKXtmPV9bKDY1NTM1JmYpKyhjJigxPDxVKS0xKV07Y29udGludWUgbn1yLm1zZz0iaW52YWxpZCBkaXN0YW5jZSBjb2RlIixpLm1vZGU9MzA7YnJlYWsgdH1pZihRPTY1NTM1JmYsbDwoVSY9MTUpJiYoYys9d1tvKytdPDxsLChsKz04KTxVJiYoYys9d1tvKytdPDxsLGwrPTgpKSxtPChRKz1jJigxPDxVKS0xKSl7ci5tc2c9ImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIixpLm1vZGU9MzA7YnJlYWsgdH1pZihjPj4+PVUsbC09VSwoVT1wLWIpPFEpe2lmKHk8KFU9US1VKSYmaS5zYW5lKXtyLm1zZz0iaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siLGkubW9kZT0zMDticmVhayB0fWlmKCQ9UCwoRT0wKT09PVQpe2lmKEUrPUMtVSxVPFgpe2ZvcihYLT1VO2tbcCsrXT1QW0UrK10sLS1VOyk7RT1wLVEsJD1rfX1lbHNlIGlmKFQ8VSl7aWYoRSs9QytULVUsKFUtPVQpPFgpe2ZvcihYLT1VO2tbcCsrXT1QW0UrK10sLS1VOyk7aWYoRT0wLFQ8WCl7Zm9yKFgtPVU9VDtrW3ArK109UFtFKytdLC0tVTspO0U9cC1RLCQ9a319fWVsc2UgaWYoRSs9VC1VLFU8WCl7Zm9yKFgtPVU7a1twKytdPVBbRSsrXSwtLVU7KTtFPXAtUSwkPWt9Zm9yKDsyPFg7KWtbcCsrXT0kW0UrK10sa1twKytdPSRbRSsrXSxrW3ArK109JFtFKytdLFgtPTM7WCYmKGtbcCsrXT0kW0UrK10sMTxYJiYoa1twKytdPSRbRSsrXSkpfWVsc2V7Zm9yKEU9cC1RO2tbcCsrXT1rW0UrK10sa1twKytdPWtbRSsrXSxrW3ArK109a1tFKytdLDI8KFgtPTMpOyk7WCYmKGtbcCsrXT1rW0UrK10sMTxYJiYoa1twKytdPWtbRSsrXSkpfWJyZWFrfX1icmVha319d2hpbGUobzx1JiZwPGcpO28tPVg9bD4+MyxjJj0oMTw8KGwtPVg8PDMpKS0xLHIubmV4dF9pbj1vLHIubmV4dF9vdXQ9cCxyLmF2YWlsX2luPW88dT91LW8rNTo1LShvLXUpLHIuYXZhaWxfb3V0PXA8Zz9nLXArMjU3OjI1Ny0ocC1nKSxpLmhvbGQ9YyxpLmJpdHM9bH19LHt9XSw0OTpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj10KCIuLi91dGlscy9jb21tb24iKSxzPXQoIi4vYWRsZXIzMiIpLGk9dCgiLi9jcmMzMiIpLG89dCgiLi9pbmZmYXN0IiksdT10KCIuL2luZnRyZWVzIikscD0xLGI9MixnPTAsbT0tMixDPTEseT04NTIsVD01OTI7ZnVuY3Rpb24gUChFKXtyZXR1cm4oRT4+PjI0JjI1NSkrKEU+Pj44JjY1MjgwKSsoKDY1MjgwJkUpPDw4KSsoKDI1NSZFKTw8MjQpfWZ1bmN0aW9uIGMoKXt0aGlzLm1vZGU9MCx0aGlzLmxhc3Q9ITEsdGhpcy53cmFwPTAsdGhpcy5oYXZlZGljdD0hMSx0aGlzLmZsYWdzPTAsdGhpcy5kbWF4PTAsdGhpcy5jaGVjaz0wLHRoaXMudG90YWw9MCx0aGlzLmhlYWQ9bnVsbCx0aGlzLndiaXRzPTAsdGhpcy53c2l6ZT0wLHRoaXMud2hhdmU9MCx0aGlzLnduZXh0PTAsdGhpcy53aW5kb3c9bnVsbCx0aGlzLmhvbGQ9MCx0aGlzLmJpdHM9MCx0aGlzLmxlbmd0aD0wLHRoaXMub2Zmc2V0PTAsdGhpcy5leHRyYT0wLHRoaXMubGVuY29kZT1udWxsLHRoaXMuZGlzdGNvZGU9bnVsbCx0aGlzLmxlbmJpdHM9MCx0aGlzLmRpc3RiaXRzPTAsdGhpcy5uY29kZT0wLHRoaXMubmxlbj0wLHRoaXMubmRpc3Q9MCx0aGlzLmhhdmU9MCx0aGlzLm5leHQ9bnVsbCx0aGlzLmxlbnM9bmV3IHIuQnVmMTYoMzIwKSx0aGlzLndvcms9bmV3IHIuQnVmMTYoMjg4KSx0aGlzLmxlbmR5bj1udWxsLHRoaXMuZGlzdGR5bj1udWxsLHRoaXMuc2FuZT0wLHRoaXMuYmFjaz0wLHRoaXMud2FzPTB9ZnVuY3Rpb24gbChFKXt2YXIgJDtyZXR1cm4gRSYmRS5zdGF0ZT8oJD1FLnN0YXRlLEUudG90YWxfaW49RS50b3RhbF9vdXQ9JC50b3RhbD0wLEUubXNnPSIiLCQud3JhcCYmKEUuYWRsZXI9MSYkLndyYXApLCQubW9kZT1DLCQubGFzdD0wLCQuaGF2ZWRpY3Q9MCwkLmRtYXg9MzI3NjgsJC5oZWFkPW51bGwsJC5ob2xkPTAsJC5iaXRzPTAsJC5sZW5jb2RlPSQubGVuZHluPW5ldyByLkJ1ZjMyKHkpLCQuZGlzdGNvZGU9JC5kaXN0ZHluPW5ldyByLkJ1ZjMyKFQpLCQuc2FuZT0xLCQuYmFjaz0tMSxnKTptfWZ1bmN0aW9uIGgoRSl7dmFyICQ7cmV0dXJuIEUmJkUuc3RhdGU/KCgkPUUuc3RhdGUpLndzaXplPTAsJC53aGF2ZT0wLCQud25leHQ9MCxsKEUpKTptfWZ1bmN0aW9uIF8oRSwkKXt2YXIgdyxrO3JldHVybiBFJiZFLnN0YXRlPyhrPUUuc3RhdGUsJDwwPyh3PTAsJD0tJCk6KHc9MSsoJD4+NCksJDw0OCYmKCQmPTE1KSksJCYmKCQ8OHx8MTU8JCk/bTooay53aW5kb3chPT1udWxsJiZrLndiaXRzIT09JCYmKGsud2luZG93PW51bGwpLGsud3JhcD13LGsud2JpdHM9JCxoKEUpKSk6bX1mdW5jdGlvbiBGKEUsJCl7dmFyIHcsaztyZXR1cm4gRT8oaz1uZXcgYywoRS5zdGF0ZT1rKS53aW5kb3c9bnVsbCwodz1fKEUsJCkpIT09ZyYmKEUuc3RhdGU9bnVsbCksdyk6bX12YXIgTyxmLFU9ITA7ZnVuY3Rpb24gWChFKXtpZihVKXt2YXIgJDtmb3IoTz1uZXcgci5CdWYzMig1MTIpLGY9bmV3IHIuQnVmMzIoMzIpLCQ9MDskPDE0NDspRS5sZW5zWyQrK109ODtmb3IoOyQ8MjU2OylFLmxlbnNbJCsrXT05O2Zvcig7JDwyODA7KUUubGVuc1skKytdPTc7Zm9yKDskPDI4ODspRS5sZW5zWyQrK109ODtmb3IodShwLEUubGVucywwLDI4OCxPLDAsRS53b3JrLHtiaXRzOjl9KSwkPTA7JDwzMjspRS5sZW5zWyQrK109NTt1KGIsRS5sZW5zLDAsMzIsZiwwLEUud29yayx7Yml0czo1fSksVT0hMX1FLmxlbmNvZGU9TyxFLmxlbmJpdHM9OSxFLmRpc3Rjb2RlPWYsRS5kaXN0Yml0cz01fWZ1bmN0aW9uIFEoRSwkLHcsayl7dmFyIFMsQj1FLnN0YXRlO3JldHVybiBCLndpbmRvdz09PW51bGwmJihCLndzaXplPTE8PEIud2JpdHMsQi53bmV4dD0wLEIud2hhdmU9MCxCLndpbmRvdz1uZXcgci5CdWY4KEIud3NpemUpKSxrPj1CLndzaXplPyhyLmFycmF5U2V0KEIud2luZG93LCQsdy1CLndzaXplLEIud3NpemUsMCksQi53bmV4dD0wLEIud2hhdmU9Qi53c2l6ZSk6KGs8KFM9Qi53c2l6ZS1CLnduZXh0KSYmKFM9ayksci5hcnJheVNldChCLndpbmRvdywkLHctayxTLEIud25leHQpLChrLT1TKT8oci5hcnJheVNldChCLndpbmRvdywkLHctayxrLDApLEIud25leHQ9ayxCLndoYXZlPUIud3NpemUpOihCLnduZXh0Kz1TLEIud25leHQ9PT1CLndzaXplJiYoQi53bmV4dD0wKSxCLndoYXZlPEIud3NpemUmJihCLndoYXZlKz1TKSkpLDB9bi5pbmZsYXRlUmVzZXQ9aCxuLmluZmxhdGVSZXNldDI9XyxuLmluZmxhdGVSZXNldEtlZXA9bCxuLmluZmxhdGVJbml0PWZ1bmN0aW9uKEUpe3JldHVybiBGKEUsMTUpfSxuLmluZmxhdGVJbml0Mj1GLG4uaW5mbGF0ZT1mdW5jdGlvbihFLCQpe3ZhciB3LGssUyxCLEwsUixxLHosRyxudCx0dCxldCx3dCxTdCxUdCxrdCxMdCxCdCwkdCxLdCxELHV0LG90LFYsaj0wLEs9bmV3IHIuQnVmOCg0KSxwdD1bMTYsMTcsMTgsMCw4LDcsOSw2LDEwLDUsMTEsNCwxMiwzLDEzLDIsMTQsMSwxNV07aWYoIUV8fCFFLnN0YXRlfHwhRS5vdXRwdXR8fCFFLmlucHV0JiZFLmF2YWlsX2luIT09MClyZXR1cm4gbTsodz1FLnN0YXRlKS5tb2RlPT09MTImJih3Lm1vZGU9MTMpLEw9RS5uZXh0X291dCxTPUUub3V0cHV0LHE9RS5hdmFpbF9vdXQsQj1FLm5leHRfaW4saz1FLmlucHV0LFI9RS5hdmFpbF9pbix6PXcuaG9sZCxHPXcuYml0cyxudD1SLHR0PXEsdXQ9Zzt0OmZvcig7Oylzd2l0Y2gody5tb2RlKXtjYXNlIEM6aWYody53cmFwPT09MCl7dy5tb2RlPTEzO2JyZWFrfWZvcig7RzwxNjspe2lmKFI9PT0wKWJyZWFrIHQ7Ui0tLHorPWtbQisrXTw8RyxHKz04fWlmKDImdy53cmFwJiZ6PT09MzU2MTUpe0tbdy5jaGVjaz0wXT0yNTUmeixLWzFdPXo+Pj44JjI1NSx3LmNoZWNrPWkody5jaGVjayxLLDIsMCksRz16PTAsdy5tb2RlPTI7YnJlYWt9aWYody5mbGFncz0wLHcuaGVhZCYmKHcuaGVhZC5kb25lPSExKSwhKDEmdy53cmFwKXx8KCgoMjU1JnopPDw4KSsoej4+OCkpJTMxKXtFLm1zZz0iaW5jb3JyZWN0IGhlYWRlciBjaGVjayIsdy5tb2RlPTMwO2JyZWFrfWlmKCgxNSZ6KSE9OCl7RS5tc2c9InVua25vd24gY29tcHJlc3Npb24gbWV0aG9kIix3Lm1vZGU9MzA7YnJlYWt9aWYoRy09NCxEPTgrKDE1Jih6Pj4+PTQpKSx3LndiaXRzPT09MCl3LndiaXRzPUQ7ZWxzZSBpZihEPncud2JpdHMpe0UubXNnPSJpbnZhbGlkIHdpbmRvdyBzaXplIix3Lm1vZGU9MzA7YnJlYWt9dy5kbWF4PTE8PEQsRS5hZGxlcj13LmNoZWNrPTEsdy5tb2RlPTUxMiZ6PzEwOjEyLEc9ej0wO2JyZWFrO2Nhc2UgMjpmb3IoO0c8MTY7KXtpZihSPT09MClicmVhayB0O1ItLSx6Kz1rW0IrK108PEcsRys9OH1pZih3LmZsYWdzPXosKDI1NSZ3LmZsYWdzKSE9OCl7RS5tc2c9InVua25vd24gY29tcHJlc3Npb24gbWV0aG9kIix3Lm1vZGU9MzA7YnJlYWt9aWYoNTczNDQmdy5mbGFncyl7RS5tc2c9InVua25vd24gaGVhZGVyIGZsYWdzIHNldCIsdy5tb2RlPTMwO2JyZWFrfXcuaGVhZCYmKHcuaGVhZC50ZXh0PXo+PjgmMSksNTEyJncuZmxhZ3MmJihLWzBdPTI1NSZ6LEtbMV09ej4+PjgmMjU1LHcuY2hlY2s9aSh3LmNoZWNrLEssMiwwKSksRz16PTAsdy5tb2RlPTM7Y2FzZSAzOmZvcig7RzwzMjspe2lmKFI9PT0wKWJyZWFrIHQ7Ui0tLHorPWtbQisrXTw8RyxHKz04fXcuaGVhZCYmKHcuaGVhZC50aW1lPXopLDUxMiZ3LmZsYWdzJiYoS1swXT0yNTUmeixLWzFdPXo+Pj44JjI1NSxLWzJdPXo+Pj4xNiYyNTUsS1szXT16Pj4+MjQmMjU1LHcuY2hlY2s9aSh3LmNoZWNrLEssNCwwKSksRz16PTAsdy5tb2RlPTQ7Y2FzZSA0OmZvcig7RzwxNjspe2lmKFI9PT0wKWJyZWFrIHQ7Ui0tLHorPWtbQisrXTw8RyxHKz04fXcuaGVhZCYmKHcuaGVhZC54ZmxhZ3M9MjU1Jnosdy5oZWFkLm9zPXo+PjgpLDUxMiZ3LmZsYWdzJiYoS1swXT0yNTUmeixLWzFdPXo+Pj44JjI1NSx3LmNoZWNrPWkody5jaGVjayxLLDIsMCkpLEc9ej0wLHcubW9kZT01O2Nhc2UgNTppZigxMDI0JncuZmxhZ3Mpe2Zvcig7RzwxNjspe2lmKFI9PT0wKWJyZWFrIHQ7Ui0tLHorPWtbQisrXTw8RyxHKz04fXcubGVuZ3RoPXosdy5oZWFkJiYody5oZWFkLmV4dHJhX2xlbj16KSw1MTImdy5mbGFncyYmKEtbMF09MjU1JnosS1sxXT16Pj4+OCYyNTUsdy5jaGVjaz1pKHcuY2hlY2ssSywyLDApKSxHPXo9MH1lbHNlIHcuaGVhZCYmKHcuaGVhZC5leHRyYT1udWxsKTt3Lm1vZGU9NjtjYXNlIDY6aWYoMTAyNCZ3LmZsYWdzJiYoUjwoZXQ9dy5sZW5ndGgpJiYoZXQ9UiksZXQmJih3LmhlYWQmJihEPXcuaGVhZC5leHRyYV9sZW4tdy5sZW5ndGgsdy5oZWFkLmV4dHJhfHwody5oZWFkLmV4dHJhPW5ldyBBcnJheSh3LmhlYWQuZXh0cmFfbGVuKSksci5hcnJheVNldCh3LmhlYWQuZXh0cmEsayxCLGV0LEQpKSw1MTImdy5mbGFncyYmKHcuY2hlY2s9aSh3LmNoZWNrLGssZXQsQikpLFItPWV0LEIrPWV0LHcubGVuZ3RoLT1ldCksdy5sZW5ndGgpKWJyZWFrIHQ7dy5sZW5ndGg9MCx3Lm1vZGU9NztjYXNlIDc6aWYoMjA0OCZ3LmZsYWdzKXtpZihSPT09MClicmVhayB0O2ZvcihldD0wO0Q9a1tCK2V0KytdLHcuaGVhZCYmRCYmdy5sZW5ndGg8NjU1MzYmJih3LmhlYWQubmFtZSs9U3RyaW5nLmZyb21DaGFyQ29kZShEKSksRCYmZXQ8UjspO2lmKDUxMiZ3LmZsYWdzJiYody5jaGVjaz1pKHcuY2hlY2ssayxldCxCKSksUi09ZXQsQis9ZXQsRClicmVhayB0fWVsc2Ugdy5oZWFkJiYody5oZWFkLm5hbWU9bnVsbCk7dy5sZW5ndGg9MCx3Lm1vZGU9ODtjYXNlIDg6aWYoNDA5NiZ3LmZsYWdzKXtpZihSPT09MClicmVhayB0O2ZvcihldD0wO0Q9a1tCK2V0KytdLHcuaGVhZCYmRCYmdy5sZW5ndGg8NjU1MzYmJih3LmhlYWQuY29tbWVudCs9U3RyaW5nLmZyb21DaGFyQ29kZShEKSksRCYmZXQ8UjspO2lmKDUxMiZ3LmZsYWdzJiYody5jaGVjaz1pKHcuY2hlY2ssayxldCxCKSksUi09ZXQsQis9ZXQsRClicmVhayB0fWVsc2Ugdy5oZWFkJiYody5oZWFkLmNvbW1lbnQ9bnVsbCk7dy5tb2RlPTk7Y2FzZSA5OmlmKDUxMiZ3LmZsYWdzKXtmb3IoO0c8MTY7KXtpZihSPT09MClicmVhayB0O1ItLSx6Kz1rW0IrK108PEcsRys9OH1pZih6IT09KDY1NTM1JncuY2hlY2spKXtFLm1zZz0iaGVhZGVyIGNyYyBtaXNtYXRjaCIsdy5tb2RlPTMwO2JyZWFrfUc9ej0wfXcuaGVhZCYmKHcuaGVhZC5oY3JjPXcuZmxhZ3M+PjkmMSx3LmhlYWQuZG9uZT0hMCksRS5hZGxlcj13LmNoZWNrPTAsdy5tb2RlPTEyO2JyZWFrO2Nhc2UgMTA6Zm9yKDtHPDMyOyl7aWYoUj09PTApYnJlYWsgdDtSLS0seis9a1tCKytdPDxHLEcrPTh9RS5hZGxlcj13LmNoZWNrPVAoeiksRz16PTAsdy5tb2RlPTExO2Nhc2UgMTE6aWYody5oYXZlZGljdD09PTApcmV0dXJuIEUubmV4dF9vdXQ9TCxFLmF2YWlsX291dD1xLEUubmV4dF9pbj1CLEUuYXZhaWxfaW49Uix3LmhvbGQ9eix3LmJpdHM9RywyO0UuYWRsZXI9dy5jaGVjaz0xLHcubW9kZT0xMjtjYXNlIDEyOmlmKCQ9PT01fHwkPT09NilicmVhayB0O2Nhc2UgMTM6aWYody5sYXN0KXt6Pj4+PTcmRyxHLT03Jkcsdy5tb2RlPTI3O2JyZWFrfWZvcig7RzwzOyl7aWYoUj09PTApYnJlYWsgdDtSLS0seis9a1tCKytdPDxHLEcrPTh9c3dpdGNoKHcubGFzdD0xJnosRy09MSwzJih6Pj4+PTEpKXtjYXNlIDA6dy5tb2RlPTE0O2JyZWFrO2Nhc2UgMTppZihYKHcpLHcubW9kZT0yMCwkIT09NilicmVhazt6Pj4+PTIsRy09MjticmVhayB0O2Nhc2UgMjp3Lm1vZGU9MTc7YnJlYWs7Y2FzZSAzOkUubXNnPSJpbnZhbGlkIGJsb2NrIHR5cGUiLHcubW9kZT0zMH16Pj4+PTIsRy09MjticmVhaztjYXNlIDE0OmZvcih6Pj4+PTcmRyxHLT03Jkc7RzwzMjspe2lmKFI9PT0wKWJyZWFrIHQ7Ui0tLHorPWtbQisrXTw8RyxHKz04fWlmKCg2NTUzNSZ6KSE9KHo+Pj4xNl42NTUzNSkpe0UubXNnPSJpbnZhbGlkIHN0b3JlZCBibG9jayBsZW5ndGhzIix3Lm1vZGU9MzA7YnJlYWt9aWYody5sZW5ndGg9NjU1MzUmeixHPXo9MCx3Lm1vZGU9MTUsJD09PTYpYnJlYWsgdDtjYXNlIDE1OncubW9kZT0xNjtjYXNlIDE2OmlmKGV0PXcubGVuZ3RoKXtpZihSPGV0JiYoZXQ9UikscTxldCYmKGV0PXEpLGV0PT09MClicmVhayB0O3IuYXJyYXlTZXQoUyxrLEIsZXQsTCksUi09ZXQsQis9ZXQscS09ZXQsTCs9ZXQsdy5sZW5ndGgtPWV0O2JyZWFrfXcubW9kZT0xMjticmVhaztjYXNlIDE3OmZvcig7RzwxNDspe2lmKFI9PT0wKWJyZWFrIHQ7Ui0tLHorPWtbQisrXTw8RyxHKz04fWlmKHcubmxlbj0yNTcrKDMxJnopLHo+Pj49NSxHLT01LHcubmRpc3Q9MSsoMzEmeiksej4+Pj01LEctPTUsdy5uY29kZT00KygxNSZ6KSx6Pj4+PTQsRy09NCwyODY8dy5ubGVufHwzMDx3Lm5kaXN0KXtFLm1zZz0idG9vIG1hbnkgbGVuZ3RoIG9yIGRpc3RhbmNlIHN5bWJvbHMiLHcubW9kZT0zMDticmVha313LmhhdmU9MCx3Lm1vZGU9MTg7Y2FzZSAxODpmb3IoO3cuaGF2ZTx3Lm5jb2RlOyl7Zm9yKDtHPDM7KXtpZihSPT09MClicmVhayB0O1ItLSx6Kz1rW0IrK108PEcsRys9OH13LmxlbnNbcHRbdy5oYXZlKytdXT03Jnosej4+Pj0zLEctPTN9Zm9yKDt3LmhhdmU8MTk7KXcubGVuc1twdFt3LmhhdmUrK11dPTA7aWYody5sZW5jb2RlPXcubGVuZHluLHcubGVuYml0cz03LG90PXtiaXRzOncubGVuYml0c30sdXQ9dSgwLHcubGVucywwLDE5LHcubGVuY29kZSwwLHcud29yayxvdCksdy5sZW5iaXRzPW90LmJpdHMsdXQpe0UubXNnPSJpbnZhbGlkIGNvZGUgbGVuZ3RocyBzZXQiLHcubW9kZT0zMDticmVha313LmhhdmU9MCx3Lm1vZGU9MTk7Y2FzZSAxOTpmb3IoO3cuaGF2ZTx3Lm5sZW4rdy5uZGlzdDspe2Zvcig7a3Q9KGo9dy5sZW5jb2RlW3omKDE8PHcubGVuYml0cyktMV0pPj4+MTYmMjU1LEx0PTY1NTM1JmosISgoVHQ9aj4+PjI0KTw9Ryk7KXtpZihSPT09MClicmVhayB0O1ItLSx6Kz1rW0IrK108PEcsRys9OH1pZihMdDwxNil6Pj4+PVR0LEctPVR0LHcubGVuc1t3LmhhdmUrK109THQ7ZWxzZXtpZihMdD09PTE2KXtmb3IoVj1UdCsyO0c8Vjspe2lmKFI9PT0wKWJyZWFrIHQ7Ui0tLHorPWtbQisrXTw8RyxHKz04fWlmKHo+Pj49VHQsRy09VHQsdy5oYXZlPT09MCl7RS5tc2c9ImludmFsaWQgYml0IGxlbmd0aCByZXBlYXQiLHcubW9kZT0zMDticmVha31EPXcubGVuc1t3LmhhdmUtMV0sZXQ9MysoMyZ6KSx6Pj4+PTIsRy09Mn1lbHNlIGlmKEx0PT09MTcpe2ZvcihWPVR0KzM7RzxWOyl7aWYoUj09PTApYnJlYWsgdDtSLS0seis9a1tCKytdPDxHLEcrPTh9Ry09VHQsRD0wLGV0PTMrKDcmKHo+Pj49VHQpKSx6Pj4+PTMsRy09M31lbHNle2ZvcihWPVR0Kzc7RzxWOyl7aWYoUj09PTApYnJlYWsgdDtSLS0seis9a1tCKytdPDxHLEcrPTh9Ry09VHQsRD0wLGV0PTExKygxMjcmKHo+Pj49VHQpKSx6Pj4+PTcsRy09N31pZih3LmhhdmUrZXQ+dy5ubGVuK3cubmRpc3Qpe0UubXNnPSJpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0Iix3Lm1vZGU9MzA7YnJlYWt9Zm9yKDtldC0tOyl3LmxlbnNbdy5oYXZlKytdPUR9fWlmKHcubW9kZT09PTMwKWJyZWFrO2lmKHcubGVuc1syNTZdPT09MCl7RS5tc2c9ImludmFsaWQgY29kZSAtLSBtaXNzaW5nIGVuZC1vZi1ibG9jayIsdy5tb2RlPTMwO2JyZWFrfWlmKHcubGVuYml0cz05LG90PXtiaXRzOncubGVuYml0c30sdXQ9dShwLHcubGVucywwLHcubmxlbix3LmxlbmNvZGUsMCx3Lndvcmssb3QpLHcubGVuYml0cz1vdC5iaXRzLHV0KXtFLm1zZz0iaW52YWxpZCBsaXRlcmFsL2xlbmd0aHMgc2V0Iix3Lm1vZGU9MzA7YnJlYWt9aWYody5kaXN0Yml0cz02LHcuZGlzdGNvZGU9dy5kaXN0ZHluLG90PXtiaXRzOncuZGlzdGJpdHN9LHV0PXUoYix3LmxlbnMsdy5ubGVuLHcubmRpc3Qsdy5kaXN0Y29kZSwwLHcud29yayxvdCksdy5kaXN0Yml0cz1vdC5iaXRzLHV0KXtFLm1zZz0iaW52YWxpZCBkaXN0YW5jZXMgc2V0Iix3Lm1vZGU9MzA7YnJlYWt9aWYody5tb2RlPTIwLCQ9PT02KWJyZWFrIHQ7Y2FzZSAyMDp3Lm1vZGU9MjE7Y2FzZSAyMTppZig2PD1SJiYyNTg8PXEpe0UubmV4dF9vdXQ9TCxFLmF2YWlsX291dD1xLEUubmV4dF9pbj1CLEUuYXZhaWxfaW49Uix3LmhvbGQ9eix3LmJpdHM9RyxvKEUsdHQpLEw9RS5uZXh0X291dCxTPUUub3V0cHV0LHE9RS5hdmFpbF9vdXQsQj1FLm5leHRfaW4saz1FLmlucHV0LFI9RS5hdmFpbF9pbix6PXcuaG9sZCxHPXcuYml0cyx3Lm1vZGU9PT0xMiYmKHcuYmFjaz0tMSk7YnJlYWt9Zm9yKHcuYmFjaz0wO2t0PShqPXcubGVuY29kZVt6JigxPDx3LmxlbmJpdHMpLTFdKT4+PjE2JjI1NSxMdD02NTUzNSZqLCEoKFR0PWo+Pj4yNCk8PUcpOyl7aWYoUj09PTApYnJlYWsgdDtSLS0seis9a1tCKytdPDxHLEcrPTh9aWYoa3QmJiEoMjQwJmt0KSl7Zm9yKEJ0PVR0LCR0PWt0LEt0PUx0O2t0PShqPXcubGVuY29kZVtLdCsoKHomKDE8PEJ0KyR0KS0xKT4+QnQpXSk+Pj4xNiYyNTUsTHQ9NjU1MzUmaiwhKEJ0KyhUdD1qPj4+MjQpPD1HKTspe2lmKFI9PT0wKWJyZWFrIHQ7Ui0tLHorPWtbQisrXTw8RyxHKz04fXo+Pj49QnQsRy09QnQsdy5iYWNrKz1CdH1pZih6Pj4+PVR0LEctPVR0LHcuYmFjays9VHQsdy5sZW5ndGg9THQsa3Q9PT0wKXt3Lm1vZGU9MjY7YnJlYWt9aWYoMzIma3Qpe3cuYmFjaz0tMSx3Lm1vZGU9MTI7YnJlYWt9aWYoNjQma3Qpe0UubXNnPSJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUiLHcubW9kZT0zMDticmVha313LmV4dHJhPTE1Jmt0LHcubW9kZT0yMjtjYXNlIDIyOmlmKHcuZXh0cmEpe2ZvcihWPXcuZXh0cmE7RzxWOyl7aWYoUj09PTApYnJlYWsgdDtSLS0seis9a1tCKytdPDxHLEcrPTh9dy5sZW5ndGgrPXomKDE8PHcuZXh0cmEpLTEsej4+Pj13LmV4dHJhLEctPXcuZXh0cmEsdy5iYWNrKz13LmV4dHJhfXcud2FzPXcubGVuZ3RoLHcubW9kZT0yMztjYXNlIDIzOmZvcig7a3Q9KGo9dy5kaXN0Y29kZVt6JigxPDx3LmRpc3RiaXRzKS0xXSk+Pj4xNiYyNTUsTHQ9NjU1MzUmaiwhKChUdD1qPj4+MjQpPD1HKTspe2lmKFI9PT0wKWJyZWFrIHQ7Ui0tLHorPWtbQisrXTw8RyxHKz04fWlmKCEoMjQwJmt0KSl7Zm9yKEJ0PVR0LCR0PWt0LEt0PUx0O2t0PShqPXcuZGlzdGNvZGVbS3QrKCh6JigxPDxCdCskdCktMSk+PkJ0KV0pPj4+MTYmMjU1LEx0PTY1NTM1JmosIShCdCsoVHQ9aj4+PjI0KTw9Ryk7KXtpZihSPT09MClicmVhayB0O1ItLSx6Kz1rW0IrK108PEcsRys9OH16Pj4+PUJ0LEctPUJ0LHcuYmFjays9QnR9aWYoej4+Pj1UdCxHLT1UdCx3LmJhY2srPVR0LDY0Jmt0KXtFLm1zZz0iaW52YWxpZCBkaXN0YW5jZSBjb2RlIix3Lm1vZGU9MzA7YnJlYWt9dy5vZmZzZXQ9THQsdy5leHRyYT0xNSZrdCx3Lm1vZGU9MjQ7Y2FzZSAyNDppZih3LmV4dHJhKXtmb3IoVj13LmV4dHJhO0c8Vjspe2lmKFI9PT0wKWJyZWFrIHQ7Ui0tLHorPWtbQisrXTw8RyxHKz04fXcub2Zmc2V0Kz16JigxPDx3LmV4dHJhKS0xLHo+Pj49dy5leHRyYSxHLT13LmV4dHJhLHcuYmFjays9dy5leHRyYX1pZih3Lm9mZnNldD53LmRtYXgpe0UubXNnPSJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayIsdy5tb2RlPTMwO2JyZWFrfXcubW9kZT0yNTtjYXNlIDI1OmlmKHE9PT0wKWJyZWFrIHQ7aWYoZXQ9dHQtcSx3Lm9mZnNldD5ldCl7aWYoKGV0PXcub2Zmc2V0LWV0KT53LndoYXZlJiZ3LnNhbmUpe0UubXNnPSJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayIsdy5tb2RlPTMwO2JyZWFrfXd0PWV0Pncud25leHQ/KGV0LT13LnduZXh0LHcud3NpemUtZXQpOncud25leHQtZXQsZXQ+dy5sZW5ndGgmJihldD13Lmxlbmd0aCksU3Q9dy53aW5kb3d9ZWxzZSBTdD1TLHd0PUwtdy5vZmZzZXQsZXQ9dy5sZW5ndGg7Zm9yKHE8ZXQmJihldD1xKSxxLT1ldCx3Lmxlbmd0aC09ZXQ7U1tMKytdPVN0W3d0KytdLC0tZXQ7KTt3Lmxlbmd0aD09PTAmJih3Lm1vZGU9MjEpO2JyZWFrO2Nhc2UgMjY6aWYocT09PTApYnJlYWsgdDtTW0wrK109dy5sZW5ndGgscS0tLHcubW9kZT0yMTticmVhaztjYXNlIDI3OmlmKHcud3JhcCl7Zm9yKDtHPDMyOyl7aWYoUj09PTApYnJlYWsgdDtSLS0senw9a1tCKytdPDxHLEcrPTh9aWYodHQtPXEsRS50b3RhbF9vdXQrPXR0LHcudG90YWwrPXR0LHR0JiYoRS5hZGxlcj13LmNoZWNrPXcuZmxhZ3M/aSh3LmNoZWNrLFMsdHQsTC10dCk6cyh3LmNoZWNrLFMsdHQsTC10dCkpLHR0PXEsKHcuZmxhZ3M/ejpQKHopKSE9PXcuY2hlY2spe0UubXNnPSJpbmNvcnJlY3QgZGF0YSBjaGVjayIsdy5tb2RlPTMwO2JyZWFrfUc9ej0wfXcubW9kZT0yODtjYXNlIDI4OmlmKHcud3JhcCYmdy5mbGFncyl7Zm9yKDtHPDMyOyl7aWYoUj09PTApYnJlYWsgdDtSLS0seis9a1tCKytdPDxHLEcrPTh9aWYoeiE9PSg0Mjk0OTY3Mjk1JncudG90YWwpKXtFLm1zZz0iaW5jb3JyZWN0IGxlbmd0aCBjaGVjayIsdy5tb2RlPTMwO2JyZWFrfUc9ej0wfXcubW9kZT0yOTtjYXNlIDI5OnV0PTE7YnJlYWsgdDtjYXNlIDMwOnV0PS0zO2JyZWFrIHQ7Y2FzZSAzMTpyZXR1cm4tNDtjYXNlIDMyOmRlZmF1bHQ6cmV0dXJuIG19cmV0dXJuIEUubmV4dF9vdXQ9TCxFLmF2YWlsX291dD1xLEUubmV4dF9pbj1CLEUuYXZhaWxfaW49Uix3LmhvbGQ9eix3LmJpdHM9Rywody53c2l6ZXx8dHQhPT1FLmF2YWlsX291dCYmdy5tb2RlPDMwJiYody5tb2RlPDI3fHwkIT09NCkpJiZRKEUsRS5vdXRwdXQsRS5uZXh0X291dCx0dC1FLmF2YWlsX291dCk/KHcubW9kZT0zMSwtNCk6KG50LT1FLmF2YWlsX2luLHR0LT1FLmF2YWlsX291dCxFLnRvdGFsX2luKz1udCxFLnRvdGFsX291dCs9dHQsdy50b3RhbCs9dHQsdy53cmFwJiZ0dCYmKEUuYWRsZXI9dy5jaGVjaz13LmZsYWdzP2kody5jaGVjayxTLHR0LEUubmV4dF9vdXQtdHQpOnMody5jaGVjayxTLHR0LEUubmV4dF9vdXQtdHQpKSxFLmRhdGFfdHlwZT13LmJpdHMrKHcubGFzdD82NDowKSsody5tb2RlPT09MTI/MTI4OjApKyh3Lm1vZGU9PT0yMHx8dy5tb2RlPT09MTU/MjU2OjApLChudD09MCYmdHQ9PT0wfHwkPT09NCkmJnV0PT09ZyYmKHV0PS01KSx1dCl9LG4uaW5mbGF0ZUVuZD1mdW5jdGlvbihFKXtpZighRXx8IUUuc3RhdGUpcmV0dXJuIG07dmFyICQ9RS5zdGF0ZTtyZXR1cm4gJC53aW5kb3cmJigkLndpbmRvdz1udWxsKSxFLnN0YXRlPW51bGwsZ30sbi5pbmZsYXRlR2V0SGVhZGVyPWZ1bmN0aW9uKEUsJCl7dmFyIHc7cmV0dXJuIEUmJkUuc3RhdGUmJjImKHc9RS5zdGF0ZSkud3JhcD8oKHcuaGVhZD0kKS5kb25lPSExLGcpOm19LG4uaW5mbGF0ZVNldERpY3Rpb25hcnk9ZnVuY3Rpb24oRSwkKXt2YXIgdyxrPSQubGVuZ3RoO3JldHVybiBFJiZFLnN0YXRlPyh3PUUuc3RhdGUpLndyYXAhPT0wJiZ3Lm1vZGUhPT0xMT9tOncubW9kZT09PTExJiZzKDEsJCxrLDApIT09dy5jaGVjaz8tMzpRKEUsJCxrLGspPyh3Lm1vZGU9MzEsLTQpOih3LmhhdmVkaWN0PTEsZyk6bX0sbi5pbmZsYXRlSW5mbz0icGFrbyBpbmZsYXRlIChmcm9tIE5vZGVjYSBwcm9qZWN0KSJ9LHsiLi4vdXRpbHMvY29tbW9uIjo0MSwiLi9hZGxlcjMyIjo0MywiLi9jcmMzMiI6NDUsIi4vaW5mZmFzdCI6NDgsIi4vaW5mdHJlZXMiOjUwfV0sNTA6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgiLi4vdXRpbHMvY29tbW9uIikscz1bMyw0LDUsNiw3LDgsOSwxMCwxMSwxMywxNSwxNywxOSwyMywyNywzMSwzNSw0Myw1MSw1OSw2Nyw4Myw5OSwxMTUsMTMxLDE2MywxOTUsMjI3LDI1OCwwLDBdLGk9WzE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE3LDE3LDE3LDE3LDE4LDE4LDE4LDE4LDE5LDE5LDE5LDE5LDIwLDIwLDIwLDIwLDIxLDIxLDIxLDIxLDE2LDcyLDc4XSxvPVsxLDIsMyw0LDUsNyw5LDEzLDE3LDI1LDMzLDQ5LDY1LDk3LDEyOSwxOTMsMjU3LDM4NSw1MTMsNzY5LDEwMjUsMTUzNywyMDQ5LDMwNzMsNDA5Nyw2MTQ1LDgxOTMsMTIyODksMTYzODUsMjQ1NzcsMCwwXSx1PVsxNiwxNiwxNiwxNiwxNywxNywxOCwxOCwxOSwxOSwyMCwyMCwyMSwyMSwyMiwyMiwyMywyMywyNCwyNCwyNSwyNSwyNiwyNiwyNywyNywyOCwyOCwyOSwyOSw2NCw2NF07ZS5leHBvcnRzPWZ1bmN0aW9uKHAsYixnLG0sQyx5LFQsUCl7dmFyIGMsbCxoLF8sRixPLGYsVSxYLFE9UC5iaXRzLEU9MCwkPTAsdz0wLGs9MCxTPTAsQj0wLEw9MCxSPTAscT0wLHo9MCxHPW51bGwsbnQ9MCx0dD1uZXcgci5CdWYxNigxNiksZXQ9bmV3IHIuQnVmMTYoMTYpLHd0PW51bGwsU3Q9MDtmb3IoRT0wO0U8PTE1O0UrKyl0dFtFXT0wO2ZvcigkPTA7JDxtOyQrKyl0dFtiW2crJF1dKys7Zm9yKFM9USxrPTE1OzE8PWsmJnR0W2tdPT09MDtrLS0pO2lmKGs8UyYmKFM9ayksaz09PTApcmV0dXJuIENbeSsrXT0yMDk3MTUyMCxDW3krK109MjA5NzE1MjAsUC5iaXRzPTEsMDtmb3Iodz0xO3c8ayYmdHRbd109PT0wO3crKyk7Zm9yKFM8dyYmKFM9dyksRT1SPTE7RTw9MTU7RSsrKWlmKFI8PD0xLChSLT10dFtFXSk8MClyZXR1cm4tMTtpZigwPFImJihwPT09MHx8ayE9PTEpKXJldHVybi0xO2ZvcihldFsxXT0wLEU9MTtFPDE1O0UrKylldFtFKzFdPWV0W0VdK3R0W0VdO2ZvcigkPTA7JDxtOyQrKyliW2crJF0hPT0wJiYoVFtldFtiW2crJF1dKytdPSQpO2lmKE89cD09PTA/KEc9d3Q9VCwxOSk6cD09PTE/KEc9cyxudC09MjU3LHd0PWksU3QtPTI1NywyNTYpOihHPW8sd3Q9dSwtMSksRT13LEY9eSxMPSQ9ej0wLGg9LTEsXz0ocT0xPDwoQj1TKSktMSxwPT09MSYmODUyPHF8fHA9PT0yJiY1OTI8cSlyZXR1cm4gMTtmb3IoOzspe2ZvcihmPUUtTCxYPVRbJF08Tz8oVT0wLFRbJF0pOlRbJF0+Tz8oVT13dFtTdCtUWyRdXSxHW250K1RbJF1dKTooVT05NiwwKSxjPTE8PEUtTCx3PWw9MTw8QjtDW0YrKHo+PkwpKyhsLT1jKV09Zjw8MjR8VTw8MTZ8WHwwLGwhPT0wOyk7Zm9yKGM9MTw8RS0xO3omYzspYz4+PTE7aWYoYyE9PTA/KHomPWMtMSx6Kz1jKTp6PTAsJCsrLC0tdHRbRV09PTApe2lmKEU9PT1rKWJyZWFrO0U9YltnK1RbJF1dfWlmKFM8RSYmKHomXykhPT1oKXtmb3IoTD09PTAmJihMPVMpLEYrPXcsUj0xPDwoQj1FLUwpO0IrTDxrJiYhKChSLT10dFtCK0xdKTw9MCk7KUIrKyxSPDw9MTtpZihxKz0xPDxCLHA9PT0xJiY4NTI8cXx8cD09PTImJjU5MjxxKXJldHVybiAxO0NbaD16Jl9dPVM8PDI0fEI8PDE2fEYteXwwfX1yZXR1cm4geiE9PTAmJihDW0Yrel09RS1MPDwyNHw2NDw8MTZ8MCksUC5iaXRzPVMsMH19LHsiLi4vdXRpbHMvY29tbW9uIjo0MX1dLDUxOltmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz17MjoibmVlZCBkaWN0aW9uYXJ5IiwxOiJzdHJlYW0gZW5kIiwwOiIiLCItMSI6ImZpbGUgZXJyb3IiLCItMiI6InN0cmVhbSBlcnJvciIsIi0zIjoiZGF0YSBlcnJvciIsIi00IjoiaW5zdWZmaWNpZW50IG1lbW9yeSIsIi01IjoiYnVmZmVyIGVycm9yIiwiLTYiOiJpbmNvbXBhdGlibGUgdmVyc2lvbiJ9fSx7fV0sNTI6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgiLi4vdXRpbHMvY29tbW9uIikscz0wLGk9MTtmdW5jdGlvbiBvKGope2Zvcih2YXIgSz1qLmxlbmd0aDswPD0tLUs7KWpbS109MH12YXIgdT0wLHA9MjksYj0yNTYsZz1iKzErcCxtPTMwLEM9MTkseT0yKmcrMSxUPTE1LFA9MTYsYz03LGw9MjU2LGg9MTYsXz0xNyxGPTE4LE89WzAsMCwwLDAsMCwwLDAsMCwxLDEsMSwxLDIsMiwyLDIsMywzLDMsMyw0LDQsNCw0LDUsNSw1LDUsMF0sZj1bMCwwLDAsMCwxLDEsMiwyLDMsMyw0LDQsNSw1LDYsNiw3LDcsOCw4LDksOSwxMCwxMCwxMSwxMSwxMiwxMiwxMywxM10sVT1bMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDMsN10sWD1bMTYsMTcsMTgsMCw4LDcsOSw2LDEwLDUsMTEsNCwxMiwzLDEzLDIsMTQsMSwxNV0sUT1uZXcgQXJyYXkoMiooZysyKSk7byhRKTt2YXIgRT1uZXcgQXJyYXkoMiptKTtvKEUpO3ZhciAkPW5ldyBBcnJheSg1MTIpO28oJCk7dmFyIHc9bmV3IEFycmF5KDI1Nik7byh3KTt2YXIgaz1uZXcgQXJyYXkocCk7byhrKTt2YXIgUyxCLEwsUj1uZXcgQXJyYXkobSk7ZnVuY3Rpb24gcShqLEsscHQsdnQscnQpe3RoaXMuc3RhdGljX3RyZWU9aix0aGlzLmV4dHJhX2JpdHM9Syx0aGlzLmV4dHJhX2Jhc2U9cHQsdGhpcy5lbGVtcz12dCx0aGlzLm1heF9sZW5ndGg9cnQsdGhpcy5oYXNfc3RyZWU9aiYmai5sZW5ndGh9ZnVuY3Rpb24geihqLEspe3RoaXMuZHluX3RyZWU9aix0aGlzLm1heF9jb2RlPTAsdGhpcy5zdGF0X2Rlc2M9S31mdW5jdGlvbiBHKGope3JldHVybiBqPDI1Nj8kW2pdOiRbMjU2KyhqPj4+NyldfWZ1bmN0aW9uIG50KGosSyl7ai5wZW5kaW5nX2J1ZltqLnBlbmRpbmcrK109MjU1Jkssai5wZW5kaW5nX2J1ZltqLnBlbmRpbmcrK109Sz4+PjgmMjU1fWZ1bmN0aW9uIHR0KGosSyxwdCl7ai5iaV92YWxpZD5QLXB0PyhqLmJpX2J1Znw9Szw8ai5iaV92YWxpZCY2NTUzNSxudChqLGouYmlfYnVmKSxqLmJpX2J1Zj1LPj5QLWouYmlfdmFsaWQsai5iaV92YWxpZCs9cHQtUCk6KGouYmlfYnVmfD1LPDxqLmJpX3ZhbGlkJjY1NTM1LGouYmlfdmFsaWQrPXB0KX1mdW5jdGlvbiBldChqLEsscHQpe3R0KGoscHRbMipLXSxwdFsyKksrMV0pfWZ1bmN0aW9uIHd0KGosSyl7Zm9yKHZhciBwdD0wO3B0fD0xJmosaj4+Pj0xLHB0PDw9MSwwPC0tSzspO3JldHVybiBwdD4+PjF9ZnVuY3Rpb24gU3QoaixLLHB0KXt2YXIgdnQscnQsZ3Q9bmV3IEFycmF5KFQrMSksQ3Q9MDtmb3IodnQ9MTt2dDw9VDt2dCsrKWd0W3Z0XT1DdD1DdCtwdFt2dC0xXTw8MTtmb3IocnQ9MDtydDw9SztydCsrKXt2YXIgeHQ9alsyKnJ0KzFdO3h0IT09MCYmKGpbMipydF09d3QoZ3RbeHRdKysseHQpKX19ZnVuY3Rpb24gVHQoail7dmFyIEs7Zm9yKEs9MDtLPGc7SysrKWouZHluX2x0cmVlWzIqS109MDtmb3IoSz0wO0s8bTtLKyspai5keW5fZHRyZWVbMipLXT0wO2ZvcihLPTA7SzxDO0srKylqLmJsX3RyZWVbMipLXT0wO2ouZHluX2x0cmVlWzIqbF09MSxqLm9wdF9sZW49ai5zdGF0aWNfbGVuPTAsai5sYXN0X2xpdD1qLm1hdGNoZXM9MH1mdW5jdGlvbiBrdChqKXs4PGouYmlfdmFsaWQ/bnQoaixqLmJpX2J1Zik6MDxqLmJpX3ZhbGlkJiYoai5wZW5kaW5nX2J1ZltqLnBlbmRpbmcrK109ai5iaV9idWYpLGouYmlfYnVmPTAsai5iaV92YWxpZD0wfWZ1bmN0aW9uIEx0KGosSyxwdCx2dCl7dmFyIHJ0PTIqSyxndD0yKnB0O3JldHVybiBqW3J0XTxqW2d0XXx8altydF09PT1qW2d0XSYmdnRbS108PXZ0W3B0XX1mdW5jdGlvbiBCdChqLEsscHQpe2Zvcih2YXIgdnQ9ai5oZWFwW3B0XSxydD1wdDw8MTtydDw9ai5oZWFwX2xlbiYmKHJ0PGouaGVhcF9sZW4mJkx0KEssai5oZWFwW3J0KzFdLGouaGVhcFtydF0sai5kZXB0aCkmJnJ0KyssIUx0KEssdnQsai5oZWFwW3J0XSxqLmRlcHRoKSk7KWouaGVhcFtwdF09ai5oZWFwW3J0XSxwdD1ydCxydDw8PTE7ai5oZWFwW3B0XT12dH1mdW5jdGlvbiAkdChqLEsscHQpe3ZhciB2dCxydCxndCxDdCx4dD0wO2lmKGoubGFzdF9saXQhPT0wKWZvcig7dnQ9ai5wZW5kaW5nX2J1ZltqLmRfYnVmKzIqeHRdPDw4fGoucGVuZGluZ19idWZbai5kX2J1ZisyKnh0KzFdLHJ0PWoucGVuZGluZ19idWZbai5sX2J1Zit4dF0seHQrKyx2dD09PTA/ZXQoaixydCxLKTooZXQoaiwoZ3Q9d1tydF0pK2IrMSxLKSwoQ3Q9T1tndF0pIT09MCYmdHQoaixydC09a1tndF0sQ3QpLGV0KGosZ3Q9RygtLXZ0KSxwdCksKEN0PWZbZ3RdKSE9PTAmJnR0KGosdnQtPVJbZ3RdLEN0KSkseHQ8ai5sYXN0X2xpdDspO2V0KGosbCxLKX1mdW5jdGlvbiBLdChqLEspe3ZhciBwdCx2dCxydCxndD1LLmR5bl90cmVlLEN0PUsuc3RhdF9kZXNjLnN0YXRpY190cmVlLHh0PUsuc3RhdF9kZXNjLmhhc19zdHJlZSxtdD1LLnN0YXRfZGVzYy5lbGVtcyx6dD0tMTtmb3Ioai5oZWFwX2xlbj0wLGouaGVhcF9tYXg9eSxwdD0wO3B0PG10O3B0KyspZ3RbMipwdF0hPT0wPyhqLmhlYXBbKytqLmhlYXBfbGVuXT16dD1wdCxqLmRlcHRoW3B0XT0wKTpndFsyKnB0KzFdPTA7Zm9yKDtqLmhlYXBfbGVuPDI7KWd0WzIqKHJ0PWouaGVhcFsrK2ouaGVhcF9sZW5dPXp0PDI/Kyt6dDowKV09MSxqLmRlcHRoW3J0XT0wLGoub3B0X2xlbi0tLHh0JiYoai5zdGF0aWNfbGVuLT1DdFsyKnJ0KzFdKTtmb3IoSy5tYXhfY29kZT16dCxwdD1qLmhlYXBfbGVuPj4xOzE8PXB0O3B0LS0pQnQoaixndCxwdCk7Zm9yKHJ0PW10O3B0PWouaGVhcFsxXSxqLmhlYXBbMV09ai5oZWFwW2ouaGVhcF9sZW4tLV0sQnQoaixndCwxKSx2dD1qLmhlYXBbMV0sai5oZWFwWy0tai5oZWFwX21heF09cHQsai5oZWFwWy0tai5oZWFwX21heF09dnQsZ3RbMipydF09Z3RbMipwdF0rZ3RbMip2dF0sai5kZXB0aFtydF09KGouZGVwdGhbcHRdPj1qLmRlcHRoW3Z0XT9qLmRlcHRoW3B0XTpqLmRlcHRoW3Z0XSkrMSxndFsyKnB0KzFdPWd0WzIqdnQrMV09cnQsai5oZWFwWzFdPXJ0KyssQnQoaixndCwxKSwyPD1qLmhlYXBfbGVuOyk7ai5oZWFwWy0tai5oZWFwX21heF09ai5oZWFwWzFdLGZ1bmN0aW9uKEd0LHZlKXt2YXIgZm4sVGUsdG4sZWUsZ2UsemUsZmU9dmUuZHluX3RyZWUsZHI9dmUubWF4X2NvZGUsVG49dmUuc3RhdF9kZXNjLnN0YXRpY190cmVlLHVyPXZlLnN0YXRfZGVzYy5oYXNfc3RyZWUsY3I9dmUuc3RhdF9kZXNjLmV4dHJhX2JpdHMsZnI9dmUuc3RhdF9kZXNjLmV4dHJhX2Jhc2UsQWU9dmUuc3RhdF9kZXNjLm1heF9sZW5ndGgsVWU9MDtmb3IoZWU9MDtlZTw9VDtlZSsrKUd0LmJsX2NvdW50W2VlXT0wO2ZvcihmZVsyKkd0LmhlYXBbR3QuaGVhcF9tYXhdKzFdPTAsZm49R3QuaGVhcF9tYXgrMTtmbjx5O2ZuKyspQWU8KGVlPWZlWzIqZmVbMiooVGU9R3QuaGVhcFtmbl0pKzFdKzFdKzEpJiYoZWU9QWUsVWUrKyksZmVbMipUZSsxXT1lZSxkcjxUZXx8KEd0LmJsX2NvdW50W2VlXSsrLGdlPTAsZnI8PVRlJiYoZ2U9Y3JbVGUtZnJdKSx6ZT1mZVsyKlRlXSxHdC5vcHRfbGVuKz16ZSooZWUrZ2UpLHVyJiYoR3Quc3RhdGljX2xlbis9emUqKFRuWzIqVGUrMV0rZ2UpKSk7aWYoVWUhPT0wKXtkb3tmb3IoZWU9QWUtMTtHdC5ibF9jb3VudFtlZV09PT0wOyllZS0tO0d0LmJsX2NvdW50W2VlXS0tLEd0LmJsX2NvdW50W2VlKzFdKz0yLEd0LmJsX2NvdW50W0FlXS0tLFVlLT0yfXdoaWxlKDA8VWUpO2ZvcihlZT1BZTtlZSE9PTA7ZWUtLSlmb3IoVGU9R3QuYmxfY291bnRbZWVdO1RlIT09MDspZHI8KHRuPUd0LmhlYXBbLS1mbl0pfHwoZmVbMip0bisxXSE9PWVlJiYoR3Qub3B0X2xlbis9KGVlLWZlWzIqdG4rMV0pKmZlWzIqdG5dLGZlWzIqdG4rMV09ZWUpLFRlLS0pfX0oaixLKSxTdChndCx6dCxqLmJsX2NvdW50KX1mdW5jdGlvbiBEKGosSyxwdCl7dmFyIHZ0LHJ0LGd0PS0xLEN0PUtbMV0seHQ9MCxtdD03LHp0PTQ7Zm9yKEN0PT09MCYmKG10PTEzOCx6dD0zKSxLWzIqKHB0KzEpKzFdPTY1NTM1LHZ0PTA7dnQ8PXB0O3Z0KyspcnQ9Q3QsQ3Q9S1syKih2dCsxKSsxXSwrK3h0PG10JiZydD09PUN0fHwoeHQ8enQ/ai5ibF90cmVlWzIqcnRdKz14dDpydCE9PTA/KHJ0IT09Z3QmJmouYmxfdHJlZVsyKnJ0XSsrLGouYmxfdHJlZVsyKmhdKyspOnh0PD0xMD9qLmJsX3RyZWVbMipfXSsrOmouYmxfdHJlZVsyKkZdKyssZ3Q9cnQsenQ9KHh0PTApPT09Q3Q/KG10PTEzOCwzKTpydD09PUN0PyhtdD02LDMpOihtdD03LDQpKX1mdW5jdGlvbiB1dChqLEsscHQpe3ZhciB2dCxydCxndD0tMSxDdD1LWzFdLHh0PTAsbXQ9Nyx6dD00O2ZvcihDdD09PTAmJihtdD0xMzgsenQ9MyksdnQ9MDt2dDw9cHQ7dnQrKylpZihydD1DdCxDdD1LWzIqKHZ0KzEpKzFdLCEoKyt4dDxtdCYmcnQ9PT1DdCkpe2lmKHh0PHp0KWZvcig7ZXQoaixydCxqLmJsX3RyZWUpLC0teHQhPTA7KTtlbHNlIHJ0IT09MD8ocnQhPT1ndCYmKGV0KGoscnQsai5ibF90cmVlKSx4dC0tKSxldChqLGgsai5ibF90cmVlKSx0dChqLHh0LTMsMikpOnh0PD0xMD8oZXQoaixfLGouYmxfdHJlZSksdHQoaix4dC0zLDMpKTooZXQoaixGLGouYmxfdHJlZSksdHQoaix4dC0xMSw3KSk7Z3Q9cnQsenQ9KHh0PTApPT09Q3Q/KG10PTEzOCwzKTpydD09PUN0PyhtdD02LDMpOihtdD03LDQpfX1vKFIpO3ZhciBvdD0hMTtmdW5jdGlvbiBWKGosSyxwdCx2dCl7dHQoaiwodTw8MSkrKHZ0PzE6MCksMyksZnVuY3Rpb24ocnQsZ3QsQ3QseHQpe2t0KHJ0KSx4dCYmKG50KHJ0LEN0KSxudChydCx+Q3QpKSxyLmFycmF5U2V0KHJ0LnBlbmRpbmdfYnVmLHJ0LndpbmRvdyxndCxDdCxydC5wZW5kaW5nKSxydC5wZW5kaW5nKz1DdH0oaixLLHB0LCEwKX1uLl90cl9pbml0PWZ1bmN0aW9uKGope290fHwoZnVuY3Rpb24oKXt2YXIgSyxwdCx2dCxydCxndCxDdD1uZXcgQXJyYXkoVCsxKTtmb3IocnQ9dnQ9MDtydDxwLTE7cnQrKylmb3Ioa1tydF09dnQsSz0wO0s8MTw8T1tydF07SysrKXdbdnQrK109cnQ7Zm9yKHdbdnQtMV09cnQscnQ9Z3Q9MDtydDwxNjtydCsrKWZvcihSW3J0XT1ndCxLPTA7SzwxPDxmW3J0XTtLKyspJFtndCsrXT1ydDtmb3IoZ3Q+Pj03O3J0PG07cnQrKylmb3IoUltydF09Z3Q8PDcsSz0wO0s8MTw8ZltydF0tNztLKyspJFsyNTYrZ3QrK109cnQ7Zm9yKHB0PTA7cHQ8PVQ7cHQrKylDdFtwdF09MDtmb3IoSz0wO0s8PTE0MzspUVsyKksrMV09OCxLKyssQ3RbOF0rKztmb3IoO0s8PTI1NTspUVsyKksrMV09OSxLKyssQ3RbOV0rKztmb3IoO0s8PTI3OTspUVsyKksrMV09NyxLKyssQ3RbN10rKztmb3IoO0s8PTI4NzspUVsyKksrMV09OCxLKyssQ3RbOF0rKztmb3IoU3QoUSxnKzEsQ3QpLEs9MDtLPG07SysrKUVbMipLKzFdPTUsRVsyKktdPXd0KEssNSk7Uz1uZXcgcShRLE8sYisxLGcsVCksQj1uZXcgcShFLGYsMCxtLFQpLEw9bmV3IHEobmV3IEFycmF5KDApLFUsMCxDLGMpfSgpLG90PSEwKSxqLmxfZGVzYz1uZXcgeihqLmR5bl9sdHJlZSxTKSxqLmRfZGVzYz1uZXcgeihqLmR5bl9kdHJlZSxCKSxqLmJsX2Rlc2M9bmV3IHooai5ibF90cmVlLEwpLGouYmlfYnVmPTAsai5iaV92YWxpZD0wLFR0KGopfSxuLl90cl9zdG9yZWRfYmxvY2s9VixuLl90cl9mbHVzaF9ibG9jaz1mdW5jdGlvbihqLEsscHQsdnQpe3ZhciBydCxndCxDdD0wOzA8ai5sZXZlbD8oai5zdHJtLmRhdGFfdHlwZT09PTImJihqLnN0cm0uZGF0YV90eXBlPWZ1bmN0aW9uKHh0KXt2YXIgbXQsenQ9NDA5MzYyNDQ0Nztmb3IobXQ9MDttdDw9MzE7bXQrKyx6dD4+Pj0xKWlmKDEmenQmJnh0LmR5bl9sdHJlZVsyKm10XSE9PTApcmV0dXJuIHM7aWYoeHQuZHluX2x0cmVlWzE4XSE9PTB8fHh0LmR5bl9sdHJlZVsyMF0hPT0wfHx4dC5keW5fbHRyZWVbMjZdIT09MClyZXR1cm4gaTtmb3IobXQ9MzI7bXQ8YjttdCsrKWlmKHh0LmR5bl9sdHJlZVsyKm10XSE9PTApcmV0dXJuIGk7cmV0dXJuIHN9KGopKSxLdChqLGoubF9kZXNjKSxLdChqLGouZF9kZXNjKSxDdD1mdW5jdGlvbih4dCl7dmFyIG10O2ZvcihEKHh0LHh0LmR5bl9sdHJlZSx4dC5sX2Rlc2MubWF4X2NvZGUpLEQoeHQseHQuZHluX2R0cmVlLHh0LmRfZGVzYy5tYXhfY29kZSksS3QoeHQseHQuYmxfZGVzYyksbXQ9Qy0xOzM8PW10JiZ4dC5ibF90cmVlWzIqWFttdF0rMV09PT0wO210LS0pO3JldHVybiB4dC5vcHRfbGVuKz0zKihtdCsxKSs1KzUrNCxtdH0oaikscnQ9ai5vcHRfbGVuKzMrNz4+PjMsKGd0PWouc3RhdGljX2xlbiszKzc+Pj4zKTw9cnQmJihydD1ndCkpOnJ0PWd0PXB0KzUscHQrNDw9cnQmJkshPT0tMT9WKGosSyxwdCx2dCk6ai5zdHJhdGVneT09PTR8fGd0PT09cnQ/KHR0KGosMisodnQ/MTowKSwzKSwkdChqLFEsRSkpOih0dChqLDQrKHZ0PzE6MCksMyksZnVuY3Rpb24oeHQsbXQsenQsR3Qpe3ZhciB2ZTtmb3IodHQoeHQsbXQtMjU3LDUpLHR0KHh0LHp0LTEsNSksdHQoeHQsR3QtNCw0KSx2ZT0wO3ZlPEd0O3ZlKyspdHQoeHQseHQuYmxfdHJlZVsyKlhbdmVdKzFdLDMpO3V0KHh0LHh0LmR5bl9sdHJlZSxtdC0xKSx1dCh4dCx4dC5keW5fZHRyZWUsenQtMSl9KGosai5sX2Rlc2MubWF4X2NvZGUrMSxqLmRfZGVzYy5tYXhfY29kZSsxLEN0KzEpLCR0KGosai5keW5fbHRyZWUsai5keW5fZHRyZWUpKSxUdChqKSx2dCYma3Qoail9LG4uX3RyX3RhbGx5PWZ1bmN0aW9uKGosSyxwdCl7cmV0dXJuIGoucGVuZGluZ19idWZbai5kX2J1ZisyKmoubGFzdF9saXRdPUs+Pj44JjI1NSxqLnBlbmRpbmdfYnVmW2ouZF9idWYrMipqLmxhc3RfbGl0KzFdPTI1NSZLLGoucGVuZGluZ19idWZbai5sX2J1ZitqLmxhc3RfbGl0XT0yNTUmcHQsai5sYXN0X2xpdCsrLEs9PT0wP2ouZHluX2x0cmVlWzIqcHRdKys6KGoubWF0Y2hlcysrLEstLSxqLmR5bl9sdHJlZVsyKih3W3B0XStiKzEpXSsrLGouZHluX2R0cmVlWzIqRyhLKV0rKyksai5sYXN0X2xpdD09PWoubGl0X2J1ZnNpemUtMX0sbi5fdHJfYWxpZ249ZnVuY3Rpb24oail7dHQoaiwyLDMpLGV0KGosbCxRKSxmdW5jdGlvbihLKXtLLmJpX3ZhbGlkPT09MTY/KG50KEssSy5iaV9idWYpLEsuYmlfYnVmPTAsSy5iaV92YWxpZD0wKTo4PD1LLmJpX3ZhbGlkJiYoSy5wZW5kaW5nX2J1ZltLLnBlbmRpbmcrK109MjU1JksuYmlfYnVmLEsuYmlfYnVmPj49OCxLLmJpX3ZhbGlkLT04KX0oail9fSx7Ii4uL3V0aWxzL2NvbW1vbiI6NDF9XSw1MzpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9ZnVuY3Rpb24oKXt0aGlzLmlucHV0PW51bGwsdGhpcy5uZXh0X2luPTAsdGhpcy5hdmFpbF9pbj0wLHRoaXMudG90YWxfaW49MCx0aGlzLm91dHB1dD1udWxsLHRoaXMubmV4dF9vdXQ9MCx0aGlzLmF2YWlsX291dD0wLHRoaXMudG90YWxfb3V0PTAsdGhpcy5tc2c9IiIsdGhpcy5zdGF0ZT1udWxsLHRoaXMuZGF0YV90eXBlPTIsdGhpcy5hZGxlcj0wfX0se31dLDU0OltmdW5jdGlvbih0LGUsbil7KGZ1bmN0aW9uKHIpeyhmdW5jdGlvbihzLGkpeyJ1c2Ugc3RyaWN0IjtpZighcy5zZXRJbW1lZGlhdGUpe3ZhciBvLHUscCxiLGc9MSxtPXt9LEM9ITEseT1zLmRvY3VtZW50LFQ9T2JqZWN0LmdldFByb3RvdHlwZU9mJiZPYmplY3QuZ2V0UHJvdG90eXBlT2Yocyk7VD1UJiZULnNldFRpbWVvdXQ/VDpzLG89e30udG9TdHJpbmcuY2FsbChzLnByb2Nlc3MpPT09IltvYmplY3QgcHJvY2Vzc10iP2Z1bmN0aW9uKGgpe3Byb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24oKXtjKGgpfSl9OmZ1bmN0aW9uKCl7aWYocy5wb3N0TWVzc2FnZSYmIXMuaW1wb3J0U2NyaXB0cyl7dmFyIGg9ITAsXz1zLm9ubWVzc2FnZTtyZXR1cm4gcy5vbm1lc3NhZ2U9ZnVuY3Rpb24oKXtoPSExfSxzLnBvc3RNZXNzYWdlKCIiLCIqIikscy5vbm1lc3NhZ2U9XyxofX0oKT8oYj0ic2V0SW1tZWRpYXRlJCIrTWF0aC5yYW5kb20oKSsiJCIscy5hZGRFdmVudExpc3RlbmVyP3MuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsbCwhMSk6cy5hdHRhY2hFdmVudCgib25tZXNzYWdlIixsKSxmdW5jdGlvbihoKXtzLnBvc3RNZXNzYWdlKGIraCwiKiIpfSk6cy5NZXNzYWdlQ2hhbm5lbD8oKHA9bmV3IE1lc3NhZ2VDaGFubmVsKS5wb3J0MS5vbm1lc3NhZ2U9ZnVuY3Rpb24oaCl7YyhoLmRhdGEpfSxmdW5jdGlvbihoKXtwLnBvcnQyLnBvc3RNZXNzYWdlKGgpfSk6eSYmIm9ucmVhZHlzdGF0ZWNoYW5nZSJpbiB5LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpPyh1PXkuZG9jdW1lbnRFbGVtZW50LGZ1bmN0aW9uKGgpe3ZhciBfPXkuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Xy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtjKGgpLF8ub25yZWFkeXN0YXRlY2hhbmdlPW51bGwsdS5yZW1vdmVDaGlsZChfKSxfPW51bGx9LHUuYXBwZW5kQ2hpbGQoXyl9KTpmdW5jdGlvbihoKXtzZXRUaW1lb3V0KGMsMCxoKX0sVC5zZXRJbW1lZGlhdGU9ZnVuY3Rpb24oaCl7dHlwZW9mIGghPSJmdW5jdGlvbiImJihoPW5ldyBGdW5jdGlvbigiIitoKSk7Zm9yKHZhciBfPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoLTEpLEY9MDtGPF8ubGVuZ3RoO0YrKylfW0ZdPWFyZ3VtZW50c1tGKzFdO3ZhciBPPXtjYWxsYmFjazpoLGFyZ3M6X307cmV0dXJuIG1bZ109TyxvKGcpLGcrK30sVC5jbGVhckltbWVkaWF0ZT1QfWZ1bmN0aW9uIFAoaCl7ZGVsZXRlIG1baF19ZnVuY3Rpb24gYyhoKXtpZihDKXNldFRpbWVvdXQoYywwLGgpO2Vsc2V7dmFyIF89bVtoXTtpZihfKXtDPSEwO3RyeXsoZnVuY3Rpb24oRil7dmFyIE89Ri5jYWxsYmFjayxmPUYuYXJncztzd2l0Y2goZi5sZW5ndGgpe2Nhc2UgMDpPKCk7YnJlYWs7Y2FzZSAxOk8oZlswXSk7YnJlYWs7Y2FzZSAyOk8oZlswXSxmWzFdKTticmVhaztjYXNlIDM6TyhmWzBdLGZbMV0sZlsyXSk7YnJlYWs7ZGVmYXVsdDpPLmFwcGx5KGksZil9fSkoXyl9ZmluYWxseXtQKGgpLEM9ITF9fX19ZnVuY3Rpb24gbChoKXtoLnNvdXJjZT09PXMmJnR5cGVvZiBoLmRhdGE9PSJzdHJpbmciJiZoLmRhdGEuaW5kZXhPZihiKT09PTAmJmMoK2guZGF0YS5zbGljZShiLmxlbmd0aCkpfX0pKHR5cGVvZiBzZWxmPiJ1Ij9yPT09dm9pZCAwP3RoaXM6cjpzZWxmKX0pLmNhbGwodGhpcyx0eXBlb2YgZ2xvYmFsPCJ1Ij9nbG9iYWw6dHlwZW9mIHNlbGY8InUiP3NlbGY6dHlwZW9mIHdpbmRvdzwidSI/d2luZG93Ont9KX0se31dfSx7fSxbMTBdKSgxMCl9KX0pO3ZhciBhZT1PYSgoTGEseHIpPT57KGZ1bmN0aW9uKHQsZSl7InVzZSBzdHJpY3QiO3R5cGVvZiB4cj09Im9iamVjdCImJnR5cGVvZiB4ci5leHBvcnRzPT0ib2JqZWN0Ij94ci5leHBvcnRzPXQuZG9jdW1lbnQ/ZSh0LCEwKTpmdW5jdGlvbihuKXtpZighbi5kb2N1bWVudCl0aHJvdyBuZXcgRXJyb3IoImpRdWVyeSByZXF1aXJlcyBhIHdpbmRvdyB3aXRoIGEgZG9jdW1lbnQiKTtyZXR1cm4gZShuKX06ZSh0KX0pKHR5cGVvZiB3aW5kb3c8InUiP3dpbmRvdzpMYSxmdW5jdGlvbih0LGUpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1bXSxyPU9iamVjdC5nZXRQcm90b3R5cGVPZixzPW4uc2xpY2UsaT1uLmZsYXQ/ZnVuY3Rpb24oYSl7cmV0dXJuIG4uZmxhdC5jYWxsKGEpfTpmdW5jdGlvbihhKXtyZXR1cm4gbi5jb25jYXQuYXBwbHkoW10sYSl9LG89bi5wdXNoLHU9bi5pbmRleE9mLHA9e30sYj1wLnRvU3RyaW5nLGc9cC5oYXNPd25Qcm9wZXJ0eSxtPWcudG9TdHJpbmcsQz1tLmNhbGwoT2JqZWN0KSx5PXt9LFQ9ZnVuY3Rpb24oZCl7cmV0dXJuIHR5cGVvZiBkPT0iZnVuY3Rpb24iJiZ0eXBlb2YgZC5ub2RlVHlwZSE9Im51bWJlciImJnR5cGVvZiBkLml0ZW0hPSJmdW5jdGlvbiJ9LFA9ZnVuY3Rpb24oZCl7cmV0dXJuIGQhPW51bGwmJmQ9PT1kLndpbmRvd30sYz10LmRvY3VtZW50LGw9e3R5cGU6ITAsc3JjOiEwLG5vbmNlOiEwLG5vTW9kdWxlOiEwfTtmdW5jdGlvbiBoKGEsZCx2KXt2PXZ8fGM7dmFyIHgsQSxJPXYuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7aWYoSS50ZXh0PWEsZClmb3IoeCBpbiBsKUE9ZFt4XXx8ZC5nZXRBdHRyaWJ1dGUmJmQuZ2V0QXR0cmlidXRlKHgpLEEmJkkuc2V0QXR0cmlidXRlKHgsQSk7di5oZWFkLmFwcGVuZENoaWxkKEkpLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoSSl9ZnVuY3Rpb24gXyhhKXtyZXR1cm4gYT09bnVsbD9hKyIiOnR5cGVvZiBhPT0ib2JqZWN0Inx8dHlwZW9mIGE9PSJmdW5jdGlvbiI/cFtiLmNhbGwoYSldfHwib2JqZWN0Ijp0eXBlb2YgYX12YXIgRj0iMy43LjEiLE89L0hUTUwkL2ksZj1mdW5jdGlvbihhLGQpe3JldHVybiBuZXcgZi5mbi5pbml0KGEsZCl9O2YuZm49Zi5wcm90b3R5cGU9e2pxdWVyeTpGLGNvbnN0cnVjdG9yOmYsbGVuZ3RoOjAsdG9BcnJheTpmdW5jdGlvbigpe3JldHVybiBzLmNhbGwodGhpcyl9LGdldDpmdW5jdGlvbihhKXtyZXR1cm4gYT09bnVsbD9zLmNhbGwodGhpcyk6YTwwP3RoaXNbYSt0aGlzLmxlbmd0aF06dGhpc1thXX0scHVzaFN0YWNrOmZ1bmN0aW9uKGEpe3ZhciBkPWYubWVyZ2UodGhpcy5jb25zdHJ1Y3RvcigpLGEpO3JldHVybiBkLnByZXZPYmplY3Q9dGhpcyxkfSxlYWNoOmZ1bmN0aW9uKGEpe3JldHVybiBmLmVhY2godGhpcyxhKX0sbWFwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnB1c2hTdGFjayhmLm1hcCh0aGlzLGZ1bmN0aW9uKGQsdil7cmV0dXJuIGEuY2FsbChkLHYsZCl9KSl9LHNsaWNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHMuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sZmlyc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgwKX0sbGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKC0xKX0sZXZlbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayhmLmdyZXAodGhpcyxmdW5jdGlvbihhLGQpe3JldHVybihkKzEpJTJ9KSl9LG9kZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayhmLmdyZXAodGhpcyxmdW5jdGlvbihhLGQpe3JldHVybiBkJTJ9KSl9LGVxOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMubGVuZ3RoLHY9K2ErKGE8MD9kOjApO3JldHVybiB0aGlzLnB1c2hTdGFjayh2Pj0wJiZ2PGQ/W3RoaXNbdl1dOltdKX0sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJldk9iamVjdHx8dGhpcy5jb25zdHJ1Y3RvcigpfSxwdXNoOm8sc29ydDpuLnNvcnQsc3BsaWNlOm4uc3BsaWNlfSxmLmV4dGVuZD1mLmZuLmV4dGVuZD1mdW5jdGlvbigpe3ZhciBhLGQsdix4LEEsSSxOPWFyZ3VtZW50c1swXXx8e30sWT0xLFc9YXJndW1lbnRzLmxlbmd0aCxKPSExO2Zvcih0eXBlb2YgTj09ImJvb2xlYW4iJiYoSj1OLE49YXJndW1lbnRzW1ldfHx7fSxZKyspLHR5cGVvZiBOIT0ib2JqZWN0IiYmIVQoTikmJihOPXt9KSxZPT09VyYmKE49dGhpcyxZLS0pO1k8VztZKyspaWYoKGE9YXJndW1lbnRzW1ldKSE9bnVsbClmb3IoZCBpbiBhKXg9YVtkXSwhKGQ9PT0iX19wcm90b19fInx8Tj09PXgpJiYoSiYmeCYmKGYuaXNQbGFpbk9iamVjdCh4KXx8KEE9QXJyYXkuaXNBcnJheSh4KSkpPyh2PU5bZF0sQSYmIUFycmF5LmlzQXJyYXkodik/ST1bXTohQSYmIWYuaXNQbGFpbk9iamVjdCh2KT9JPXt9Okk9dixBPSExLE5bZF09Zi5leHRlbmQoSixJLHgpKTp4IT09dm9pZCAwJiYoTltkXT14KSk7cmV0dXJuIE59LGYuZXh0ZW5kKHtleHBhbmRvOiJqUXVlcnkiKyhGK01hdGgucmFuZG9tKCkpLnJlcGxhY2UoL1xEL2csIiIpLGlzUmVhZHk6ITAsZXJyb3I6ZnVuY3Rpb24oYSl7dGhyb3cgbmV3IEVycm9yKGEpfSxub29wOmZ1bmN0aW9uKCl7fSxpc1BsYWluT2JqZWN0OmZ1bmN0aW9uKGEpe3ZhciBkLHY7cmV0dXJuIWF8fGIuY2FsbChhKSE9PSJbb2JqZWN0IE9iamVjdF0iPyExOihkPXIoYSksZD8odj1nLmNhbGwoZCwiY29uc3RydWN0b3IiKSYmZC5jb25zdHJ1Y3Rvcix0eXBlb2Ygdj09ImZ1bmN0aW9uIiYmbS5jYWxsKHYpPT09Qyk6ITApfSxpc0VtcHR5T2JqZWN0OmZ1bmN0aW9uKGEpe3ZhciBkO2ZvcihkIGluIGEpcmV0dXJuITE7cmV0dXJuITB9LGdsb2JhbEV2YWw6ZnVuY3Rpb24oYSxkLHYpe2goYSx7bm9uY2U6ZCYmZC5ub25jZX0sdil9LGVhY2g6ZnVuY3Rpb24oYSxkKXt2YXIgdix4PTA7aWYoVShhKSlmb3Iodj1hLmxlbmd0aDt4PHYmJmQuY2FsbChhW3hdLHgsYVt4XSkhPT0hMTt4KyspO2Vsc2UgZm9yKHggaW4gYSlpZihkLmNhbGwoYVt4XSx4LGFbeF0pPT09ITEpYnJlYWs7cmV0dXJuIGF9LHRleHQ6ZnVuY3Rpb24oYSl7dmFyIGQsdj0iIix4PTAsQT1hLm5vZGVUeXBlO2lmKCFBKWZvcig7ZD1hW3grK107KXYrPWYudGV4dChkKTtyZXR1cm4gQT09PTF8fEE9PT0xMT9hLnRleHRDb250ZW50OkE9PT05P2EuZG9jdW1lbnRFbGVtZW50LnRleHRDb250ZW50OkE9PT0zfHxBPT09ND9hLm5vZGVWYWx1ZTp2fSxtYWtlQXJyYXk6ZnVuY3Rpb24oYSxkKXt2YXIgdj1kfHxbXTtyZXR1cm4gYSE9bnVsbCYmKFUoT2JqZWN0KGEpKT9mLm1lcmdlKHYsdHlwZW9mIGE9PSJzdHJpbmciP1thXTphKTpvLmNhbGwodixhKSksdn0saW5BcnJheTpmdW5jdGlvbihhLGQsdil7cmV0dXJuIGQ9PW51bGw/LTE6dS5jYWxsKGQsYSx2KX0saXNYTUxEb2M6ZnVuY3Rpb24oYSl7dmFyIGQ9YSYmYS5uYW1lc3BhY2VVUkksdj1hJiYoYS5vd25lckRvY3VtZW50fHxhKS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJuIU8udGVzdChkfHx2JiZ2Lm5vZGVOYW1lfHwiSFRNTCIpfSxtZXJnZTpmdW5jdGlvbihhLGQpe2Zvcih2YXIgdj0rZC5sZW5ndGgseD0wLEE9YS5sZW5ndGg7eDx2O3grKylhW0ErK109ZFt4XTtyZXR1cm4gYS5sZW5ndGg9QSxhfSxncmVwOmZ1bmN0aW9uKGEsZCx2KXtmb3IodmFyIHgsQT1bXSxJPTAsTj1hLmxlbmd0aCxZPSF2O0k8TjtJKyspeD0hZChhW0ldLEkpLHghPT1ZJiZBLnB1c2goYVtJXSk7cmV0dXJuIEF9LG1hcDpmdW5jdGlvbihhLGQsdil7dmFyIHgsQSxJPTAsTj1bXTtpZihVKGEpKWZvcih4PWEubGVuZ3RoO0k8eDtJKyspQT1kKGFbSV0sSSx2KSxBIT1udWxsJiZOLnB1c2goQSk7ZWxzZSBmb3IoSSBpbiBhKUE9ZChhW0ldLEksdiksQSE9bnVsbCYmTi5wdXNoKEEpO3JldHVybiBpKE4pfSxndWlkOjEsc3VwcG9ydDp5fSksdHlwZW9mIFN5bWJvbD09ImZ1bmN0aW9uIiYmKGYuZm5bU3ltYm9sLml0ZXJhdG9yXT1uW1N5bWJvbC5pdGVyYXRvcl0pLGYuZWFjaCgiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvciBTeW1ib2wiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxkKXtwWyJbb2JqZWN0ICIrZCsiXSJdPWQudG9Mb3dlckNhc2UoKX0pO2Z1bmN0aW9uIFUoYSl7dmFyIGQ9ISFhJiYibGVuZ3RoImluIGEmJmEubGVuZ3RoLHY9XyhhKTtyZXR1cm4gVChhKXx8UChhKT8hMTp2PT09ImFycmF5Inx8ZD09PTB8fHR5cGVvZiBkPT0ibnVtYmVyIiYmZD4wJiZkLTEgaW4gYX1mdW5jdGlvbiBYKGEsZCl7cmV0dXJuIGEubm9kZU5hbWUmJmEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWQudG9Mb3dlckNhc2UoKX12YXIgUT1uLnBvcCxFPW4uc29ydCwkPW4uc3BsaWNlLHc9IltcXHgyMFxcdFxcclxcblxcZl0iLGs9bmV3IFJlZ0V4cCgiXiIrdysiK3woKD86XnxbXlxcXFxdKSg/OlxcXFwuKSopIit3KyIrJCIsImciKTtmLmNvbnRhaW5zPWZ1bmN0aW9uKGEsZCl7dmFyIHY9ZCYmZC5wYXJlbnROb2RlO3JldHVybiBhPT09dnx8ISEodiYmdi5ub2RlVHlwZT09PTEmJihhLmNvbnRhaW5zP2EuY29udGFpbnModik6YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiYmYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih2KSYxNikpfTt2YXIgUz0vKFtcMC1ceDFmXHg3Zl18Xi0/XGQpfF4tJHxbXlx4ODAtXHVGRkZGXHctXS9nO2Z1bmN0aW9uIEIoYSxkKXtyZXR1cm4gZD9hPT09IlwwIj8iXHVGRkZEIjphLnNsaWNlKDAsLTEpKyJcXCIrYS5jaGFyQ29kZUF0KGEubGVuZ3RoLTEpLnRvU3RyaW5nKDE2KSsiICI6IlxcIithfWYuZXNjYXBlU2VsZWN0b3I9ZnVuY3Rpb24oYSl7cmV0dXJuKGErIiIpLnJlcGxhY2UoUyxCKX07dmFyIEw9YyxSPW87KGZ1bmN0aW9uKCl7dmFyIGEsZCx2LHgsQSxJPVIsTixZLFcsSixkdCxmdD1mLmV4cGFuZG8sc3Q9MCx5dD0wLE90PXZyKCksWHQ9dnIoKSxWdD12cigpLHVlPXZyKCksb2U9ZnVuY3Rpb24oTSxaKXtyZXR1cm4gTT09PVomJihBPSEwKSwwfSxXZT0iY2hlY2tlZHxzZWxlY3RlZHxhc3luY3xhdXRvZm9jdXN8YXV0b3BsYXl8Y29udHJvbHN8ZGVmZXJ8ZGlzYWJsZWR8aGlkZGVufGlzbWFwfGxvb3B8bXVsdGlwbGV8b3BlbnxyZWFkb25seXxyZXF1aXJlZHxzY29wZWQiLEdlPSIoPzpcXFxcW1xcZGEtZkEtRl17MSw2fSIrdysiP3xcXFxcW15cXHJcXG5cXGZdfFtcXHctXXxbXlwwLVxceDdmXSkrIixxdD0iXFxbIit3KyIqKCIrR2UrIikoPzoiK3crIiooWypeJHwhfl0/PSkiK3crYCooPzonKCg/OlxcXFwufFteXFxcXCddKSopJ3wiKCg/OlxcXFwufFteXFxcXCJdKSopInwoYCtHZSsiKSl8KSIrdysiKlxcXSIsYm49IjooIitHZStgKSg/OlxcKCgoJygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8IigoPzpcXFxcLnxbXlxcXFwiXSkqKSIpfCgoPzpcXFxcLnxbXlxcXFwoKVtcXF1dfGArcXQrIikqKXwuKilcXCl8KSIsWXQ9bmV3IFJlZ0V4cCh3KyIrIiwiZyIpLHJlPW5ldyBSZWdFeHAoIl4iK3crIiosIit3KyIqIiksWG49bmV3IFJlZ0V4cCgiXiIrdysiKihbPit+XXwiK3crIikiK3crIioiKSxvaT1uZXcgUmVnRXhwKHcrInw+IikscWU9bmV3IFJlZ0V4cChibiksWW49bmV3IFJlZ0V4cCgiXiIrR2UrIiQiKSxYZT17SUQ6bmV3IFJlZ0V4cCgiXiMoIitHZSsiKSIpLENMQVNTOm5ldyBSZWdFeHAoIl5cXC4oIitHZSsiKSIpLFRBRzpuZXcgUmVnRXhwKCJeKCIrR2UrInxbKl0pIiksQVRUUjpuZXcgUmVnRXhwKCJeIitxdCksUFNFVURPOm5ldyBSZWdFeHAoIl4iK2JuKSxDSElMRDpuZXcgUmVnRXhwKCJeOihvbmx5fGZpcnN0fGxhc3R8bnRofG50aC1sYXN0KS0oY2hpbGR8b2YtdHlwZSkoPzpcXCgiK3crIiooZXZlbnxvZGR8KChbKy1dfCkoXFxkKilufCkiK3crIiooPzooWystXXwpIit3KyIqKFxcZCspfCkpIit3KyIqXFwpfCkiLCJpIiksYm9vbDpuZXcgUmVnRXhwKCJeKD86IitXZSsiKSQiLCJpIiksbmVlZHNDb250ZXh0Om5ldyBSZWdFeHAoIl4iK3crIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxsYXN0KSg/OlxcKCIrdysiKigoPzotXFxkKT9cXGQqKSIrdysiKlxcKXwpKD89W14tXXwkKSIsImkiKX0sZW49L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSxubj0vXmhcZCQvaSxQZT0vXig/OiMoW1x3LV0rKXwoXHcrKXxcLihbXHctXSspKSQvLGxpPS9bK35dLyxKZT1uZXcgUmVnRXhwKCJcXFxcW1xcZGEtZkEtRl17MSw2fSIrdysiP3xcXFxcKFteXFxyXFxuXFxmXSkiLCJnIiksUWU9ZnVuY3Rpb24oTSxaKXt2YXIgaXQ9IjB4IitNLnNsaWNlKDEpLTY1NTM2O3JldHVybiBafHwoaXQ8MD9TdHJpbmcuZnJvbUNoYXJDb2RlKGl0KzY1NTM2KTpTdHJpbmcuZnJvbUNoYXJDb2RlKGl0Pj4xMHw1NTI5NixpdCYxMDIzfDU2MzIwKSl9LGpvPWZ1bmN0aW9uKCl7cm4oKX0sTW89eXIoZnVuY3Rpb24oTSl7cmV0dXJuIE0uZGlzYWJsZWQ9PT0hMCYmWChNLCJmaWVsZHNldCIpfSx7ZGlyOiJwYXJlbnROb2RlIixuZXh0OiJsZWdlbmQifSk7ZnVuY3Rpb24gVm8oKXt0cnl7cmV0dXJuIE4uYWN0aXZlRWxlbWVudH1jYXRjaHt9fXRyeXtJLmFwcGx5KG49cy5jYWxsKEwuY2hpbGROb2RlcyksTC5jaGlsZE5vZGVzKSxuW0wuY2hpbGROb2Rlcy5sZW5ndGhdLm5vZGVUeXBlfWNhdGNoe0k9e2FwcGx5OmZ1bmN0aW9uKFosaXQpe1IuYXBwbHkoWixzLmNhbGwoaXQpKX0sY2FsbDpmdW5jdGlvbihaKXtSLmFwcGx5KFoscy5jYWxsKGFyZ3VtZW50cywxKSl9fX1mdW5jdGlvbiBKdChNLFosaXQsbHQpe3ZhciBjdCxfdCxEdCxQdCxBdCxIdCxOdCxSdD1aJiZaLm93bmVyRG9jdW1lbnQsVXQ9Wj9aLm5vZGVUeXBlOjk7aWYoaXQ9aXR8fFtdLHR5cGVvZiBNIT0ic3RyaW5nInx8IU18fFV0IT09MSYmVXQhPT05JiZVdCE9PTExKXJldHVybiBpdDtpZighbHQmJihybihaKSxaPVp8fE4sVykpe2lmKFV0IT09MTEmJihBdD1QZS5leGVjKE0pKSlpZihjdD1BdFsxXSl7aWYoVXQ9PT05KWlmKER0PVouZ2V0RWxlbWVudEJ5SWQoY3QpKXtpZihEdC5pZD09PWN0KXJldHVybiBJLmNhbGwoaXQsRHQpLGl0fWVsc2UgcmV0dXJuIGl0O2Vsc2UgaWYoUnQmJihEdD1SdC5nZXRFbGVtZW50QnlJZChjdCkpJiZKdC5jb250YWlucyhaLER0KSYmRHQuaWQ9PT1jdClyZXR1cm4gSS5jYWxsKGl0LER0KSxpdH1lbHNle2lmKEF0WzJdKXJldHVybiBJLmFwcGx5KGl0LFouZ2V0RWxlbWVudHNCeVRhZ05hbWUoTSkpLGl0O2lmKChjdD1BdFszXSkmJlouZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSlyZXR1cm4gSS5hcHBseShpdCxaLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoY3QpKSxpdH1pZighdWVbTSsiICJdJiYoIUp8fCFKLnRlc3QoTSkpKXtpZihOdD1NLFJ0PVosVXQ9PT0xJiYob2kudGVzdChNKXx8WG4udGVzdChNKSkpe2ZvcihSdD1saS50ZXN0KE0pJiZkaShaLnBhcmVudE5vZGUpfHxaLChSdCE9Wnx8IXkuc2NvcGUpJiYoKFB0PVouZ2V0QXR0cmlidXRlKCJpZCIpKT9QdD1mLmVzY2FwZVNlbGVjdG9yKFB0KTpaLnNldEF0dHJpYnV0ZSgiaWQiLFB0PWZ0KSksSHQ9JG4oTSksX3Q9SHQubGVuZ3RoO190LS07KUh0W190XT0oUHQ/IiMiK1B0OiI6c2NvcGUiKSsiICIrZ3IoSHRbX3RdKTtOdD1IdC5qb2luKCIsIil9dHJ5e3JldHVybiBJLmFwcGx5KGl0LFJ0LnF1ZXJ5U2VsZWN0b3JBbGwoTnQpKSxpdH1jYXRjaHt1ZShNLCEwKX1maW5hbGx5e1B0PT09ZnQmJloucmVtb3ZlQXR0cmlidXRlKCJpZCIpfX19cmV0dXJuIEJhKE0ucmVwbGFjZShrLCIkMSIpLFosaXQsbHQpfWZ1bmN0aW9uIHZyKCl7dmFyIE09W107ZnVuY3Rpb24gWihpdCxsdCl7cmV0dXJuIE0ucHVzaChpdCsiICIpPmQuY2FjaGVMZW5ndGgmJmRlbGV0ZSBaW00uc2hpZnQoKV0sWltpdCsiICJdPWx0fXJldHVybiBafWZ1bmN0aW9uIE1lKE0pe3JldHVybiBNW2Z0XT0hMCxNfWZ1bmN0aW9uIEluKE0pe3ZhciBaPU4uY3JlYXRlRWxlbWVudCgiZmllbGRzZXQiKTt0cnl7cmV0dXJuISFNKFopfWNhdGNoe3JldHVybiExfWZpbmFsbHl7Wi5wYXJlbnROb2RlJiZaLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoWiksWj1udWxsfX1mdW5jdGlvbiBIbyhNKXtyZXR1cm4gZnVuY3Rpb24oWil7cmV0dXJuIFgoWiwiaW5wdXQiKSYmWi50eXBlPT09TX19ZnVuY3Rpb24gVW8oTSl7cmV0dXJuIGZ1bmN0aW9uKFope3JldHVybihYKFosImlucHV0Iil8fFgoWiwiYnV0dG9uIikpJiZaLnR5cGU9PT1NfX1mdW5jdGlvbiBQYShNKXtyZXR1cm4gZnVuY3Rpb24oWil7cmV0dXJuImZvcm0iaW4gWj9aLnBhcmVudE5vZGUmJlouZGlzYWJsZWQ9PT0hMT8ibGFiZWwiaW4gWj8ibGFiZWwiaW4gWi5wYXJlbnROb2RlP1oucGFyZW50Tm9kZS5kaXNhYmxlZD09PU06Wi5kaXNhYmxlZD09PU06Wi5pc0Rpc2FibGVkPT09TXx8Wi5pc0Rpc2FibGVkIT09IU0mJk1vKFopPT09TTpaLmRpc2FibGVkPT09TToibGFiZWwiaW4gWj9aLmRpc2FibGVkPT09TTohMX19ZnVuY3Rpb24gbW4oTSl7cmV0dXJuIE1lKGZ1bmN0aW9uKFope3JldHVybiBaPStaLE1lKGZ1bmN0aW9uKGl0LGx0KXtmb3IodmFyIGN0LF90PU0oW10saXQubGVuZ3RoLFopLER0PV90Lmxlbmd0aDtEdC0tOylpdFtjdD1fdFtEdF1dJiYoaXRbY3RdPSEobHRbY3RdPWl0W2N0XSkpfSl9KX1mdW5jdGlvbiBkaShNKXtyZXR1cm4gTSYmdHlwZW9mIE0uZ2V0RWxlbWVudHNCeVRhZ05hbWU8InUiJiZNfWZ1bmN0aW9uIHJuKE0pe3ZhciBaLGl0PU0/TS5vd25lckRvY3VtZW50fHxNOkw7cmV0dXJuIGl0PT1OfHxpdC5ub2RlVHlwZSE9PTl8fCFpdC5kb2N1bWVudEVsZW1lbnR8fChOPWl0LFk9Ti5kb2N1bWVudEVsZW1lbnQsVz0hZi5pc1hNTERvYyhOKSxkdD1ZLm1hdGNoZXN8fFkud2Via2l0TWF0Y2hlc1NlbGVjdG9yfHxZLm1zTWF0Y2hlc1NlbGVjdG9yLFkubXNNYXRjaGVzU2VsZWN0b3ImJkwhPU4mJihaPU4uZGVmYXVsdFZpZXcpJiZaLnRvcCE9PVomJlouYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixqbykseS5nZXRCeUlkPUluKGZ1bmN0aW9uKGx0KXtyZXR1cm4gWS5hcHBlbmRDaGlsZChsdCkuaWQ9Zi5leHBhbmRvLCFOLmdldEVsZW1lbnRzQnlOYW1lfHwhTi5nZXRFbGVtZW50c0J5TmFtZShmLmV4cGFuZG8pLmxlbmd0aH0pLHkuZGlzY29ubmVjdGVkTWF0Y2g9SW4oZnVuY3Rpb24obHQpe3JldHVybiBkdC5jYWxsKGx0LCIqIil9KSx5LnNjb3BlPUluKGZ1bmN0aW9uKCl7cmV0dXJuIE4ucXVlcnlTZWxlY3RvckFsbCgiOnNjb3BlIil9KSx5LmNzc0hhcz1JbihmdW5jdGlvbigpe3RyeXtyZXR1cm4gTi5xdWVyeVNlbGVjdG9yKCI6aGFzKCosOmpxZmFrZSkiKSwhMX1jYXRjaHtyZXR1cm4hMH19KSx5LmdldEJ5SWQ/KGQuZmlsdGVyLklEPWZ1bmN0aW9uKGx0KXt2YXIgY3Q9bHQucmVwbGFjZShKZSxRZSk7cmV0dXJuIGZ1bmN0aW9uKF90KXtyZXR1cm4gX3QuZ2V0QXR0cmlidXRlKCJpZCIpPT09Y3R9fSxkLmZpbmQuSUQ9ZnVuY3Rpb24obHQsY3Qpe2lmKHR5cGVvZiBjdC5nZXRFbGVtZW50QnlJZDwidSImJlcpe3ZhciBfdD1jdC5nZXRFbGVtZW50QnlJZChsdCk7cmV0dXJuIF90P1tfdF06W119fSk6KGQuZmlsdGVyLklEPWZ1bmN0aW9uKGx0KXt2YXIgY3Q9bHQucmVwbGFjZShKZSxRZSk7cmV0dXJuIGZ1bmN0aW9uKF90KXt2YXIgRHQ9dHlwZW9mIF90LmdldEF0dHJpYnV0ZU5vZGU8InUiJiZfdC5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpO3JldHVybiBEdCYmRHQudmFsdWU9PT1jdH19LGQuZmluZC5JRD1mdW5jdGlvbihsdCxjdCl7aWYodHlwZW9mIGN0LmdldEVsZW1lbnRCeUlkPCJ1IiYmVyl7dmFyIF90LER0LFB0LEF0PWN0LmdldEVsZW1lbnRCeUlkKGx0KTtpZihBdCl7aWYoX3Q9QXQuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKSxfdCYmX3QudmFsdWU9PT1sdClyZXR1cm5bQXRdO2ZvcihQdD1jdC5nZXRFbGVtZW50c0J5TmFtZShsdCksRHQ9MDtBdD1QdFtEdCsrXTspaWYoX3Q9QXQuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKSxfdCYmX3QudmFsdWU9PT1sdClyZXR1cm5bQXRdfXJldHVybltdfX0pLGQuZmluZC5UQUc9ZnVuY3Rpb24obHQsY3Qpe3JldHVybiB0eXBlb2YgY3QuZ2V0RWxlbWVudHNCeVRhZ05hbWU8InUiP2N0LmdldEVsZW1lbnRzQnlUYWdOYW1lKGx0KTpjdC5xdWVyeVNlbGVjdG9yQWxsKGx0KX0sZC5maW5kLkNMQVNTPWZ1bmN0aW9uKGx0LGN0KXtpZih0eXBlb2YgY3QuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZTwidSImJlcpcmV0dXJuIGN0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUobHQpfSxKPVtdLEluKGZ1bmN0aW9uKGx0KXt2YXIgY3Q7WS5hcHBlbmRDaGlsZChsdCkuaW5uZXJIVE1MPSI8YSBpZD0nIitmdCsiJyBocmVmPScnIGRpc2FibGVkPSdkaXNhYmxlZCc+PC9hPjxzZWxlY3QgaWQ9JyIrZnQrIi1cclxcJyBkaXNhYmxlZD0nZGlzYWJsZWQnPjxvcHRpb24gc2VsZWN0ZWQ9Jyc+PC9vcHRpb24+PC9zZWxlY3Q+IixsdC5xdWVyeVNlbGVjdG9yQWxsKCJbc2VsZWN0ZWRdIikubGVuZ3RofHxKLnB1c2goIlxcWyIrdysiKig/OnZhbHVlfCIrV2UrIikiKSxsdC5xdWVyeVNlbGVjdG9yQWxsKCJbaWR+PSIrZnQrIi1dIikubGVuZ3RofHxKLnB1c2goIn49IiksbHQucXVlcnlTZWxlY3RvckFsbCgiYSMiK2Z0KyIrKiIpLmxlbmd0aHx8Si5wdXNoKCIuIy4rWyt+XSIpLGx0LnF1ZXJ5U2VsZWN0b3JBbGwoIjpjaGVja2VkIikubGVuZ3RofHxKLnB1c2goIjpjaGVja2VkIiksY3Q9Ti5jcmVhdGVFbGVtZW50KCJpbnB1dCIpLGN0LnNldEF0dHJpYnV0ZSgidHlwZSIsImhpZGRlbiIpLGx0LmFwcGVuZENoaWxkKGN0KS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJEIiksWS5hcHBlbmRDaGlsZChsdCkuZGlzYWJsZWQ9ITAsbHQucXVlcnlTZWxlY3RvckFsbCgiOmRpc2FibGVkIikubGVuZ3RoIT09MiYmSi5wdXNoKCI6ZW5hYmxlZCIsIjpkaXNhYmxlZCIpLGN0PU4uY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxjdC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCIiKSxsdC5hcHBlbmRDaGlsZChjdCksbHQucXVlcnlTZWxlY3RvckFsbCgiW25hbWU9JyddIikubGVuZ3RofHxKLnB1c2goIlxcWyIrdysiKm5hbWUiK3crIio9Iit3K2AqKD86Jyd8IiIpYCl9KSx5LmNzc0hhc3x8Si5wdXNoKCI6aGFzIiksSj1KLmxlbmd0aCYmbmV3IFJlZ0V4cChKLmpvaW4oInwiKSksb2U9ZnVuY3Rpb24obHQsY3Qpe2lmKGx0PT09Y3QpcmV0dXJuIEE9ITAsMDt2YXIgX3Q9IWx0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uLSFjdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbjtyZXR1cm4gX3R8fChfdD0obHQub3duZXJEb2N1bWVudHx8bHQpPT0oY3Qub3duZXJEb2N1bWVudHx8Y3QpP2x0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGN0KToxLF90JjF8fCF5LnNvcnREZXRhY2hlZCYmY3QuY29tcGFyZURvY3VtZW50UG9zaXRpb24obHQpPT09X3Q/bHQ9PT1OfHxsdC5vd25lckRvY3VtZW50PT1MJiZKdC5jb250YWlucyhMLGx0KT8tMTpjdD09PU58fGN0Lm93bmVyRG9jdW1lbnQ9PUwmJkp0LmNvbnRhaW5zKEwsY3QpPzE6eD91LmNhbGwoeCxsdCktdS5jYWxsKHgsY3QpOjA6X3QmND8tMToxKX0pLE59SnQubWF0Y2hlcz1mdW5jdGlvbihNLFope3JldHVybiBKdChNLG51bGwsbnVsbCxaKX0sSnQubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKE0sWil7aWYocm4oTSksVyYmIXVlW1orIiAiXSYmKCFKfHwhSi50ZXN0KFopKSl0cnl7dmFyIGl0PWR0LmNhbGwoTSxaKTtpZihpdHx8eS5kaXNjb25uZWN0ZWRNYXRjaHx8TS5kb2N1bWVudCYmTS5kb2N1bWVudC5ub2RlVHlwZSE9PTExKXJldHVybiBpdH1jYXRjaHt1ZShaLCEwKX1yZXR1cm4gSnQoWixOLG51bGwsW01dKS5sZW5ndGg+MH0sSnQuY29udGFpbnM9ZnVuY3Rpb24oTSxaKXtyZXR1cm4oTS5vd25lckRvY3VtZW50fHxNKSE9TiYmcm4oTSksZi5jb250YWlucyhNLFopfSxKdC5hdHRyPWZ1bmN0aW9uKE0sWil7KE0ub3duZXJEb2N1bWVudHx8TSkhPU4mJnJuKE0pO3ZhciBpdD1kLmF0dHJIYW5kbGVbWi50b0xvd2VyQ2FzZSgpXSxsdD1pdCYmZy5jYWxsKGQuYXR0ckhhbmRsZSxaLnRvTG93ZXJDYXNlKCkpP2l0KE0sWiwhVyk6dm9pZCAwO3JldHVybiBsdCE9PXZvaWQgMD9sdDpNLmdldEF0dHJpYnV0ZShaKX0sSnQuZXJyb3I9ZnVuY3Rpb24oTSl7dGhyb3cgbmV3IEVycm9yKCJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiK00pfSxmLnVuaXF1ZVNvcnQ9ZnVuY3Rpb24oTSl7dmFyIFosaXQ9W10sbHQ9MCxjdD0wO2lmKEE9IXkuc29ydFN0YWJsZSx4PSF5LnNvcnRTdGFibGUmJnMuY2FsbChNLDApLEUuY2FsbChNLG9lKSxBKXtmb3IoO1o9TVtjdCsrXTspWj09PU1bY3RdJiYobHQ9aXQucHVzaChjdCkpO2Zvcig7bHQtLTspJC5jYWxsKE0saXRbbHRdLDEpfXJldHVybiB4PW51bGwsTX0sZi5mbi51bmlxdWVTb3J0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGYudW5pcXVlU29ydChzLmFwcGx5KHRoaXMpKSl9LGQ9Zi5leHByPXtjYWNoZUxlbmd0aDo1MCxjcmVhdGVQc2V1ZG86TWUsbWF0Y2g6WGUsYXR0ckhhbmRsZTp7fSxmaW5kOnt9LHJlbGF0aXZlOnsiPiI6e2RpcjoicGFyZW50Tm9kZSIsZmlyc3Q6ITB9LCIgIjp7ZGlyOiJwYXJlbnROb2RlIn0sIisiOntkaXI6InByZXZpb3VzU2libGluZyIsZmlyc3Q6ITB9LCJ+Ijp7ZGlyOiJwcmV2aW91c1NpYmxpbmcifX0scHJlRmlsdGVyOntBVFRSOmZ1bmN0aW9uKE0pe3JldHVybiBNWzFdPU1bMV0ucmVwbGFjZShKZSxRZSksTVszXT0oTVszXXx8TVs0XXx8TVs1XXx8IiIpLnJlcGxhY2UoSmUsUWUpLE1bMl09PT0ifj0iJiYoTVszXT0iICIrTVszXSsiICIpLE0uc2xpY2UoMCw0KX0sQ0hJTEQ6ZnVuY3Rpb24oTSl7cmV0dXJuIE1bMV09TVsxXS50b0xvd2VyQ2FzZSgpLE1bMV0uc2xpY2UoMCwzKT09PSJudGgiPyhNWzNdfHxKdC5lcnJvcihNWzBdKSxNWzRdPSsoTVs0XT9NWzVdKyhNWzZdfHwxKToyKihNWzNdPT09ImV2ZW4ifHxNWzNdPT09Im9kZCIpKSxNWzVdPSsoTVs3XStNWzhdfHxNWzNdPT09Im9kZCIpKTpNWzNdJiZKdC5lcnJvcihNWzBdKSxNfSxQU0VVRE86ZnVuY3Rpb24oTSl7dmFyIFosaXQ9IU1bNl0mJk1bMl07cmV0dXJuIFhlLkNISUxELnRlc3QoTVswXSk/bnVsbDooTVszXT9NWzJdPU1bNF18fE1bNV18fCIiOml0JiZxZS50ZXN0KGl0KSYmKFo9JG4oaXQsITApKSYmKFo9aXQuaW5kZXhPZigiKSIsaXQubGVuZ3RoLVopLWl0Lmxlbmd0aCkmJihNWzBdPU1bMF0uc2xpY2UoMCxaKSxNWzJdPWl0LnNsaWNlKDAsWikpLE0uc2xpY2UoMCwzKSl9fSxmaWx0ZXI6e1RBRzpmdW5jdGlvbihNKXt2YXIgWj1NLnJlcGxhY2UoSmUsUWUpLnRvTG93ZXJDYXNlKCk7cmV0dXJuIE09PT0iKiI/ZnVuY3Rpb24oKXtyZXR1cm4hMH06ZnVuY3Rpb24oaXQpe3JldHVybiBYKGl0LFopfX0sQ0xBU1M6ZnVuY3Rpb24oTSl7dmFyIFo9T3RbTSsiICJdO3JldHVybiBafHwoWj1uZXcgUmVnRXhwKCIoXnwiK3crIikiK00rIigiK3crInwkKSIpKSYmT3QoTSxmdW5jdGlvbihpdCl7cmV0dXJuIFoudGVzdCh0eXBlb2YgaXQuY2xhc3NOYW1lPT0ic3RyaW5nIiYmaXQuY2xhc3NOYW1lfHx0eXBlb2YgaXQuZ2V0QXR0cmlidXRlPCJ1IiYmaXQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIil9KX0sQVRUUjpmdW5jdGlvbihNLFosaXQpe3JldHVybiBmdW5jdGlvbihsdCl7dmFyIGN0PUp0LmF0dHIobHQsTSk7cmV0dXJuIGN0PT1udWxsP1o9PT0iIT0iOlo/KGN0Kz0iIixaPT09Ij0iP2N0PT09aXQ6Wj09PSIhPSI/Y3QhPT1pdDpaPT09Il49Ij9pdCYmY3QuaW5kZXhPZihpdCk9PT0wOlo9PT0iKj0iP2l0JiZjdC5pbmRleE9mKGl0KT4tMTpaPT09IiQ9Ij9pdCYmY3Quc2xpY2UoLWl0Lmxlbmd0aCk9PT1pdDpaPT09In49Ij8oIiAiK2N0LnJlcGxhY2UoWXQsIiAiKSsiICIpLmluZGV4T2YoaXQpPi0xOlo9PT0ifD0iP2N0PT09aXR8fGN0LnNsaWNlKDAsaXQubGVuZ3RoKzEpPT09aXQrIi0iOiExKTohMH19LENISUxEOmZ1bmN0aW9uKE0sWixpdCxsdCxjdCl7dmFyIF90PU0uc2xpY2UoMCwzKSE9PSJudGgiLER0PU0uc2xpY2UoLTQpIT09Imxhc3QiLFB0PVo9PT0ib2YtdHlwZSI7cmV0dXJuIGx0PT09MSYmY3Q9PT0wP2Z1bmN0aW9uKEF0KXtyZXR1cm4hIUF0LnBhcmVudE5vZGV9OmZ1bmN0aW9uKEF0LEh0LE50KXt2YXIgUnQsVXQsRnQsbmUseGUsaGU9X3QhPT1EdD8ibmV4dFNpYmxpbmciOiJwcmV2aW91c1NpYmxpbmciLEZlPUF0LnBhcmVudE5vZGUsWWU9UHQmJkF0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksUG49IU50JiYhUHQscGU9ITE7aWYoRmUpe2lmKF90KXtmb3IoO2hlOyl7Zm9yKEZ0PUF0O0Z0PUZ0W2hlXTspaWYoUHQ/WChGdCxZZSk6RnQubm9kZVR5cGU9PT0xKXJldHVybiExO3hlPWhlPU09PT0ib25seSImJiF4ZSYmIm5leHRTaWJsaW5nIn1yZXR1cm4hMH1pZih4ZT1bRHQ/RmUuZmlyc3RDaGlsZDpGZS5sYXN0Q2hpbGRdLER0JiZQbil7Zm9yKFV0PUZlW2Z0XXx8KEZlW2Z0XT17fSksUnQ9VXRbTV18fFtdLG5lPVJ0WzBdPT09c3QmJlJ0WzFdLHBlPW5lJiZSdFsyXSxGdD1uZSYmRmUuY2hpbGROb2Rlc1tuZV07RnQ9KytuZSYmRnQmJkZ0W2hlXXx8KHBlPW5lPTApfHx4ZS5wb3AoKTspaWYoRnQubm9kZVR5cGU9PT0xJiYrK3BlJiZGdD09PUF0KXtVdFtNXT1bc3QsbmUscGVdO2JyZWFrfX1lbHNlIGlmKFBuJiYoVXQ9QXRbZnRdfHwoQXRbZnRdPXt9KSxSdD1VdFtNXXx8W10sbmU9UnRbMF09PT1zdCYmUnRbMV0scGU9bmUpLHBlPT09ITEpZm9yKDsoRnQ9KytuZSYmRnQmJkZ0W2hlXXx8KHBlPW5lPTApfHx4ZS5wb3AoKSkmJiEoKFB0P1goRnQsWWUpOkZ0Lm5vZGVUeXBlPT09MSkmJisrcGUmJihQbiYmKFV0PUZ0W2Z0XXx8KEZ0W2Z0XT17fSksVXRbTV09W3N0LHBlXSksRnQ9PT1BdCkpOyk7cmV0dXJuIHBlLT1jdCxwZT09PWx0fHxwZSVsdD09PTAmJnBlL2x0Pj0wfX19LFBTRVVETzpmdW5jdGlvbihNLFope3ZhciBpdCxsdD1kLnBzZXVkb3NbTV18fGQuc2V0RmlsdGVyc1tNLnRvTG93ZXJDYXNlKCldfHxKdC5lcnJvcigidW5zdXBwb3J0ZWQgcHNldWRvOiAiK00pO3JldHVybiBsdFtmdF0/bHQoWik6bHQubGVuZ3RoPjE/KGl0PVtNLE0sIiIsWl0sZC5zZXRGaWx0ZXJzLmhhc093blByb3BlcnR5KE0udG9Mb3dlckNhc2UoKSk/TWUoZnVuY3Rpb24oY3QsX3Qpe2Zvcih2YXIgRHQsUHQ9bHQoY3QsWiksQXQ9UHQubGVuZ3RoO0F0LS07KUR0PXUuY2FsbChjdCxQdFtBdF0pLGN0W0R0XT0hKF90W0R0XT1QdFtBdF0pfSk6ZnVuY3Rpb24oY3Qpe3JldHVybiBsdChjdCwwLGl0KX0pOmx0fX0scHNldWRvczp7bm90Ok1lKGZ1bmN0aW9uKE0pe3ZhciBaPVtdLGl0PVtdLGx0PWhpKE0ucmVwbGFjZShrLCIkMSIpKTtyZXR1cm4gbHRbZnRdP01lKGZ1bmN0aW9uKGN0LF90LER0LFB0KXtmb3IodmFyIEF0LEh0PWx0KGN0LG51bGwsUHQsW10pLE50PWN0Lmxlbmd0aDtOdC0tOykoQXQ9SHRbTnRdKSYmKGN0W050XT0hKF90W050XT1BdCkpfSk6ZnVuY3Rpb24oY3QsX3QsRHQpe3JldHVybiBaWzBdPWN0LGx0KFosbnVsbCxEdCxpdCksWlswXT1udWxsLCFpdC5wb3AoKX19KSxoYXM6TWUoZnVuY3Rpb24oTSl7cmV0dXJuIGZ1bmN0aW9uKFope3JldHVybiBKdChNLFopLmxlbmd0aD4wfX0pLGNvbnRhaW5zOk1lKGZ1bmN0aW9uKE0pe3JldHVybiBNPU0ucmVwbGFjZShKZSxRZSksZnVuY3Rpb24oWil7cmV0dXJuKFoudGV4dENvbnRlbnR8fGYudGV4dChaKSkuaW5kZXhPZihNKT4tMX19KSxsYW5nOk1lKGZ1bmN0aW9uKE0pe3JldHVybiBZbi50ZXN0KE18fCIiKXx8SnQuZXJyb3IoInVuc3VwcG9ydGVkIGxhbmc6ICIrTSksTT1NLnJlcGxhY2UoSmUsUWUpLnRvTG93ZXJDYXNlKCksZnVuY3Rpb24oWil7dmFyIGl0O2RvIGlmKGl0PVc/Wi5sYW5nOlouZ2V0QXR0cmlidXRlKCJ4bWw6bGFuZyIpfHxaLmdldEF0dHJpYnV0ZSgibGFuZyIpKXJldHVybiBpdD1pdC50b0xvd2VyQ2FzZSgpLGl0PT09TXx8aXQuaW5kZXhPZihNKyItIik9PT0wO3doaWxlKChaPVoucGFyZW50Tm9kZSkmJloubm9kZVR5cGU9PT0xKTtyZXR1cm4hMX19KSx0YXJnZXQ6ZnVuY3Rpb24oTSl7dmFyIFo9dC5sb2NhdGlvbiYmdC5sb2NhdGlvbi5oYXNoO3JldHVybiBaJiZaLnNsaWNlKDEpPT09TS5pZH0scm9vdDpmdW5jdGlvbihNKXtyZXR1cm4gTT09PVl9LGZvY3VzOmZ1bmN0aW9uKE0pe3JldHVybiBNPT09Vm8oKSYmTi5oYXNGb2N1cygpJiYhIShNLnR5cGV8fE0uaHJlZnx8fk0udGFiSW5kZXgpfSxlbmFibGVkOlBhKCExKSxkaXNhYmxlZDpQYSghMCksY2hlY2tlZDpmdW5jdGlvbihNKXtyZXR1cm4gWChNLCJpbnB1dCIpJiYhIU0uY2hlY2tlZHx8WChNLCJvcHRpb24iKSYmISFNLnNlbGVjdGVkfSxzZWxlY3RlZDpmdW5jdGlvbihNKXtyZXR1cm4gTS5wYXJlbnROb2RlJiZNLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCxNLnNlbGVjdGVkPT09ITB9LGVtcHR5OmZ1bmN0aW9uKE0pe2ZvcihNPU0uZmlyc3RDaGlsZDtNO009TS5uZXh0U2libGluZylpZihNLm5vZGVUeXBlPDYpcmV0dXJuITE7cmV0dXJuITB9LHBhcmVudDpmdW5jdGlvbihNKXtyZXR1cm4hZC5wc2V1ZG9zLmVtcHR5KE0pfSxoZWFkZXI6ZnVuY3Rpb24oTSl7cmV0dXJuIG5uLnRlc3QoTS5ub2RlTmFtZSl9LGlucHV0OmZ1bmN0aW9uKE0pe3JldHVybiBlbi50ZXN0KE0ubm9kZU5hbWUpfSxidXR0b246ZnVuY3Rpb24oTSl7cmV0dXJuIFgoTSwiaW5wdXQiKSYmTS50eXBlPT09ImJ1dHRvbiJ8fFgoTSwiYnV0dG9uIil9LHRleHQ6ZnVuY3Rpb24oTSl7dmFyIFo7cmV0dXJuIFgoTSwiaW5wdXQiKSYmTS50eXBlPT09InRleHQiJiYoKFo9TS5nZXRBdHRyaWJ1dGUoInR5cGUiKSk9PW51bGx8fFoudG9Mb3dlckNhc2UoKT09PSJ0ZXh0Iil9LGZpcnN0Om1uKGZ1bmN0aW9uKCl7cmV0dXJuWzBdfSksbGFzdDptbihmdW5jdGlvbihNLFope3JldHVybltaLTFdfSksZXE6bW4oZnVuY3Rpb24oTSxaLGl0KXtyZXR1cm5baXQ8MD9pdCtaOml0XX0pLGV2ZW46bW4oZnVuY3Rpb24oTSxaKXtmb3IodmFyIGl0PTA7aXQ8WjtpdCs9MilNLnB1c2goaXQpO3JldHVybiBNfSksb2RkOm1uKGZ1bmN0aW9uKE0sWil7Zm9yKHZhciBpdD0xO2l0PFo7aXQrPTIpTS5wdXNoKGl0KTtyZXR1cm4gTX0pLGx0Om1uKGZ1bmN0aW9uKE0sWixpdCl7dmFyIGx0O2ZvcihpdDwwP2x0PWl0K1o6aXQ+Wj9sdD1aOmx0PWl0Oy0tbHQ+PTA7KU0ucHVzaChsdCk7cmV0dXJuIE19KSxndDptbihmdW5jdGlvbihNLFosaXQpe2Zvcih2YXIgbHQ9aXQ8MD9pdCtaOml0OysrbHQ8WjspTS5wdXNoKGx0KTtyZXR1cm4gTX0pfX0sZC5wc2V1ZG9zLm50aD1kLnBzZXVkb3MuZXE7Zm9yKGEgaW57cmFkaW86ITAsY2hlY2tib3g6ITAsZmlsZTohMCxwYXNzd29yZDohMCxpbWFnZTohMH0pZC5wc2V1ZG9zW2FdPUhvKGEpO2ZvcihhIGlue3N1Ym1pdDohMCxyZXNldDohMH0pZC5wc2V1ZG9zW2FdPVVvKGEpO2Z1bmN0aW9uIEZhKCl7fUZhLnByb3RvdHlwZT1kLmZpbHRlcnM9ZC5wc2V1ZG9zLGQuc2V0RmlsdGVycz1uZXcgRmE7ZnVuY3Rpb24gJG4oTSxaKXt2YXIgaXQsbHQsY3QsX3QsRHQsUHQsQXQsSHQ9WHRbTSsiICJdO2lmKEh0KXJldHVybiBaPzA6SHQuc2xpY2UoMCk7Zm9yKER0PU0sUHQ9W10sQXQ9ZC5wcmVGaWx0ZXI7RHQ7KXsoIWl0fHwobHQ9cmUuZXhlYyhEdCkpKSYmKGx0JiYoRHQ9RHQuc2xpY2UobHRbMF0ubGVuZ3RoKXx8RHQpLFB0LnB1c2goY3Q9W10pKSxpdD0hMSwobHQ9WG4uZXhlYyhEdCkpJiYoaXQ9bHQuc2hpZnQoKSxjdC5wdXNoKHt2YWx1ZTppdCx0eXBlOmx0WzBdLnJlcGxhY2UoaywiICIpfSksRHQ9RHQuc2xpY2UoaXQubGVuZ3RoKSk7Zm9yKF90IGluIGQuZmlsdGVyKShsdD1YZVtfdF0uZXhlYyhEdCkpJiYoIUF0W190XXx8KGx0PUF0W190XShsdCkpKSYmKGl0PWx0LnNoaWZ0KCksY3QucHVzaCh7dmFsdWU6aXQsdHlwZTpfdCxtYXRjaGVzOmx0fSksRHQ9RHQuc2xpY2UoaXQubGVuZ3RoKSk7aWYoIWl0KWJyZWFrfXJldHVybiBaP0R0Lmxlbmd0aDpEdD9KdC5lcnJvcihNKTpYdChNLFB0KS5zbGljZSgwKX1mdW5jdGlvbiBncihNKXtmb3IodmFyIFo9MCxpdD1NLmxlbmd0aCxsdD0iIjtaPGl0O1orKylsdCs9TVtaXS52YWx1ZTtyZXR1cm4gbHR9ZnVuY3Rpb24geXIoTSxaLGl0KXt2YXIgbHQ9Wi5kaXIsY3Q9Wi5uZXh0LF90PWN0fHxsdCxEdD1pdCYmX3Q9PT0icGFyZW50Tm9kZSIsUHQ9eXQrKztyZXR1cm4gWi5maXJzdD9mdW5jdGlvbihBdCxIdCxOdCl7Zm9yKDtBdD1BdFtsdF07KWlmKEF0Lm5vZGVUeXBlPT09MXx8RHQpcmV0dXJuIE0oQXQsSHQsTnQpO3JldHVybiExfTpmdW5jdGlvbihBdCxIdCxOdCl7dmFyIFJ0LFV0LEZ0PVtzdCxQdF07aWYoTnQpe2Zvcig7QXQ9QXRbbHRdOylpZigoQXQubm9kZVR5cGU9PT0xfHxEdCkmJk0oQXQsSHQsTnQpKXJldHVybiEwfWVsc2UgZm9yKDtBdD1BdFtsdF07KWlmKEF0Lm5vZGVUeXBlPT09MXx8RHQpaWYoVXQ9QXRbZnRdfHwoQXRbZnRdPXt9KSxjdCYmWChBdCxjdCkpQXQ9QXRbbHRdfHxBdDtlbHNle2lmKChSdD1VdFtfdF0pJiZSdFswXT09PXN0JiZSdFsxXT09PVB0KXJldHVybiBGdFsyXT1SdFsyXTtpZihVdFtfdF09RnQsRnRbMl09TShBdCxIdCxOdCkpcmV0dXJuITB9cmV0dXJuITF9fWZ1bmN0aW9uIHVpKE0pe3JldHVybiBNLmxlbmd0aD4xP2Z1bmN0aW9uKFosaXQsbHQpe2Zvcih2YXIgY3Q9TS5sZW5ndGg7Y3QtLTspaWYoIU1bY3RdKFosaXQsbHQpKXJldHVybiExO3JldHVybiEwfTpNWzBdfWZ1bmN0aW9uIFdvKE0sWixpdCl7Zm9yKHZhciBsdD0wLGN0PVoubGVuZ3RoO2x0PGN0O2x0KyspSnQoTSxaW2x0XSxpdCk7cmV0dXJuIGl0fWZ1bmN0aW9uIHdyKE0sWixpdCxsdCxjdCl7Zm9yKHZhciBfdCxEdD1bXSxQdD0wLEF0PU0ubGVuZ3RoLEh0PVohPW51bGw7UHQ8QXQ7UHQrKykoX3Q9TVtQdF0pJiYoIWl0fHxpdChfdCxsdCxjdCkpJiYoRHQucHVzaChfdCksSHQmJloucHVzaChQdCkpO3JldHVybiBEdH1mdW5jdGlvbiBjaShNLFosaXQsbHQsY3QsX3Qpe3JldHVybiBsdCYmIWx0W2Z0XSYmKGx0PWNpKGx0KSksY3QmJiFjdFtmdF0mJihjdD1jaShjdCxfdCkpLE1lKGZ1bmN0aW9uKER0LFB0LEF0LEh0KXt2YXIgTnQsUnQsVXQsRnQsbmU9W10seGU9W10saGU9UHQubGVuZ3RoLEZlPUR0fHxXbyhafHwiKiIsQXQubm9kZVR5cGU/W0F0XTpBdCxbXSksWWU9TSYmKER0fHwhWik/d3IoRmUsbmUsTSxBdCxIdCk6RmU7aWYoaXQ/KEZ0PWN0fHwoRHQ/TTpoZXx8bHQpP1tdOlB0LGl0KFllLEZ0LEF0LEh0KSk6RnQ9WWUsbHQpZm9yKE50PXdyKEZ0LHhlKSxsdChOdCxbXSxBdCxIdCksUnQ9TnQubGVuZ3RoO1J0LS07KShVdD1OdFtSdF0pJiYoRnRbeGVbUnRdXT0hKFllW3hlW1J0XV09VXQpKTtpZihEdCl7aWYoY3R8fE0pe2lmKGN0KXtmb3IoTnQ9W10sUnQ9RnQubGVuZ3RoO1J0LS07KShVdD1GdFtSdF0pJiZOdC5wdXNoKFllW1J0XT1VdCk7Y3QobnVsbCxGdD1bXSxOdCxIdCl9Zm9yKFJ0PUZ0Lmxlbmd0aDtSdC0tOykoVXQ9RnRbUnRdKSYmKE50PWN0P3UuY2FsbChEdCxVdCk6bmVbUnRdKT4tMSYmKER0W050XT0hKFB0W050XT1VdCkpfX1lbHNlIEZ0PXdyKEZ0PT09UHQ/RnQuc3BsaWNlKGhlLEZ0Lmxlbmd0aCk6RnQpLGN0P2N0KG51bGwsUHQsRnQsSHQpOkkuYXBwbHkoUHQsRnQpfSl9ZnVuY3Rpb24gZmkoTSl7Zm9yKHZhciBaLGl0LGx0LGN0PU0ubGVuZ3RoLF90PWQucmVsYXRpdmVbTVswXS50eXBlXSxEdD1fdHx8ZC5yZWxhdGl2ZVsiICJdLFB0PV90PzE6MCxBdD15cihmdW5jdGlvbihSdCl7cmV0dXJuIFJ0PT09Wn0sRHQsITApLEh0PXlyKGZ1bmN0aW9uKFJ0KXtyZXR1cm4gdS5jYWxsKFosUnQpPi0xfSxEdCwhMCksTnQ9W2Z1bmN0aW9uKFJ0LFV0LEZ0KXt2YXIgbmU9IV90JiYoRnR8fFV0IT12KXx8KChaPVV0KS5ub2RlVHlwZT9BdChSdCxVdCxGdCk6SHQoUnQsVXQsRnQpKTtyZXR1cm4gWj1udWxsLG5lfV07UHQ8Y3Q7UHQrKylpZihpdD1kLnJlbGF0aXZlW01bUHRdLnR5cGVdKU50PVt5cih1aShOdCksaXQpXTtlbHNle2lmKGl0PWQuZmlsdGVyW01bUHRdLnR5cGVdLmFwcGx5KG51bGwsTVtQdF0ubWF0Y2hlcyksaXRbZnRdKXtmb3IobHQ9KytQdDtsdDxjdCYmIWQucmVsYXRpdmVbTVtsdF0udHlwZV07bHQrKyk7cmV0dXJuIGNpKFB0PjEmJnVpKE50KSxQdD4xJiZncihNLnNsaWNlKDAsUHQtMSkuY29uY2F0KHt2YWx1ZTpNW1B0LTJdLnR5cGU9PT0iICI/IioiOiIifSkpLnJlcGxhY2UoaywiJDEiKSxpdCxQdDxsdCYmZmkoTS5zbGljZShQdCxsdCkpLGx0PGN0JiZmaShNPU0uc2xpY2UobHQpKSxsdDxjdCYmZ3IoTSkpfU50LnB1c2goaXQpfXJldHVybiB1aShOdCl9ZnVuY3Rpb24gR28oTSxaKXt2YXIgaXQ9Wi5sZW5ndGg+MCxsdD1NLmxlbmd0aD4wLGN0PWZ1bmN0aW9uKF90LER0LFB0LEF0LEh0KXt2YXIgTnQsUnQsVXQsRnQ9MCxuZT0iMCIseGU9X3QmJltdLGhlPVtdLEZlPXYsWWU9X3R8fGx0JiZkLmZpbmQuVEFHKCIqIixIdCksUG49c3QrPUZlPT1udWxsPzE6TWF0aC5yYW5kb20oKXx8LjEscGU9WWUubGVuZ3RoO2ZvcihIdCYmKHY9RHQ9PU58fER0fHxIdCk7bmUhPT1wZSYmKE50PVllW25lXSkhPW51bGw7bmUrKyl7aWYobHQmJk50KXtmb3IoUnQ9MCwhRHQmJk50Lm93bmVyRG9jdW1lbnQhPU4mJihybihOdCksUHQ9IVcpO1V0PU1bUnQrK107KWlmKFV0KE50LER0fHxOLFB0KSl7SS5jYWxsKEF0LE50KTticmVha31IdCYmKHN0PVBuKX1pdCYmKChOdD0hVXQmJk50KSYmRnQtLSxfdCYmeGUucHVzaChOdCkpfWlmKEZ0Kz1uZSxpdCYmbmUhPT1GdCl7Zm9yKFJ0PTA7VXQ9WltSdCsrXTspVXQoeGUsaGUsRHQsUHQpO2lmKF90KXtpZihGdD4wKWZvcig7bmUtLTspeGVbbmVdfHxoZVtuZV18fChoZVtuZV09US5jYWxsKEF0KSk7aGU9d3IoaGUpfUkuYXBwbHkoQXQsaGUpLEh0JiYhX3QmJmhlLmxlbmd0aD4wJiZGdCtaLmxlbmd0aD4xJiZmLnVuaXF1ZVNvcnQoQXQpfXJldHVybiBIdCYmKHN0PVBuLHY9RmUpLHhlfTtyZXR1cm4gaXQ/TWUoY3QpOmN0fWZ1bmN0aW9uIGhpKE0sWil7dmFyIGl0LGx0PVtdLGN0PVtdLF90PVZ0W00rIiAiXTtpZighX3Qpe2ZvcihafHwoWj0kbihNKSksaXQ9Wi5sZW5ndGg7aXQtLTspX3Q9ZmkoWltpdF0pLF90W2Z0XT9sdC5wdXNoKF90KTpjdC5wdXNoKF90KTtfdD1WdChNLEdvKGN0LGx0KSksX3Quc2VsZWN0b3I9TX1yZXR1cm4gX3R9ZnVuY3Rpb24gQmEoTSxaLGl0LGx0KXt2YXIgY3QsX3QsRHQsUHQsQXQsSHQ9dHlwZW9mIE09PSJmdW5jdGlvbiImJk0sTnQ9IWx0JiYkbihNPUh0LnNlbGVjdG9yfHxNKTtpZihpdD1pdHx8W10sTnQubGVuZ3RoPT09MSl7aWYoX3Q9TnRbMF09TnRbMF0uc2xpY2UoMCksX3QubGVuZ3RoPjImJihEdD1fdFswXSkudHlwZT09PSJJRCImJloubm9kZVR5cGU9PT05JiZXJiZkLnJlbGF0aXZlW190WzFdLnR5cGVdKXtpZihaPShkLmZpbmQuSUQoRHQubWF0Y2hlc1swXS5yZXBsYWNlKEplLFFlKSxaKXx8W10pWzBdLFopSHQmJihaPVoucGFyZW50Tm9kZSk7ZWxzZSByZXR1cm4gaXQ7TT1NLnNsaWNlKF90LnNoaWZ0KCkudmFsdWUubGVuZ3RoKX1mb3IoY3Q9WGUubmVlZHNDb250ZXh0LnRlc3QoTSk/MDpfdC5sZW5ndGg7Y3QtLSYmKER0PV90W2N0XSwhZC5yZWxhdGl2ZVtQdD1EdC50eXBlXSk7KWlmKChBdD1kLmZpbmRbUHRdKSYmKGx0PUF0KER0Lm1hdGNoZXNbMF0ucmVwbGFjZShKZSxRZSksbGkudGVzdChfdFswXS50eXBlKSYmZGkoWi5wYXJlbnROb2RlKXx8WikpKXtpZihfdC5zcGxpY2UoY3QsMSksTT1sdC5sZW5ndGgmJmdyKF90KSwhTSlyZXR1cm4gSS5hcHBseShpdCxsdCksaXQ7YnJlYWt9fXJldHVybihIdHx8aGkoTSxOdCkpKGx0LFosIVcsaXQsIVp8fGxpLnRlc3QoTSkmJmRpKFoucGFyZW50Tm9kZSl8fFopLGl0fXkuc29ydFN0YWJsZT1mdC5zcGxpdCgiIikuc29ydChvZSkuam9pbigiIik9PT1mdCxybigpLHkuc29ydERldGFjaGVkPUluKGZ1bmN0aW9uKE0pe3JldHVybiBNLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKE4uY3JlYXRlRWxlbWVudCgiZmllbGRzZXQiKSkmMX0pLGYuZmluZD1KdCxmLmV4cHJbIjoiXT1mLmV4cHIucHNldWRvcyxmLnVuaXF1ZT1mLnVuaXF1ZVNvcnQsSnQuY29tcGlsZT1oaSxKdC5zZWxlY3Q9QmEsSnQuc2V0RG9jdW1lbnQ9cm4sSnQudG9rZW5pemU9JG4sSnQuZXNjYXBlPWYuZXNjYXBlU2VsZWN0b3IsSnQuZ2V0VGV4dD1mLnRleHQsSnQuaXNYTUw9Zi5pc1hNTERvYyxKdC5zZWxlY3RvcnM9Zi5leHByLEp0LnN1cHBvcnQ9Zi5zdXBwb3J0LEp0LnVuaXF1ZVNvcnQ9Zi51bmlxdWVTb3J0fSkoKTt2YXIgcT1mdW5jdGlvbihhLGQsdil7Zm9yKHZhciB4PVtdLEE9diE9PXZvaWQgMDsoYT1hW2RdKSYmYS5ub2RlVHlwZSE9PTk7KWlmKGEubm9kZVR5cGU9PT0xKXtpZihBJiZmKGEpLmlzKHYpKWJyZWFrO3gucHVzaChhKX1yZXR1cm4geH0sej1mdW5jdGlvbihhLGQpe2Zvcih2YXIgdj1bXTthO2E9YS5uZXh0U2libGluZylhLm5vZGVUeXBlPT09MSYmYSE9PWQmJnYucHVzaChhKTtyZXR1cm4gdn0sRz1mLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LG50PS9ePChbYS16XVteXC9cMD46XHgyMFx0XHJcblxmXSopW1x4MjBcdFxyXG5cZl0qXC8/Pig/OjxcL1wxPnwpJC9pO2Z1bmN0aW9uIHR0KGEsZCx2KXtyZXR1cm4gVChkKT9mLmdyZXAoYSxmdW5jdGlvbih4LEEpe3JldHVybiEhZC5jYWxsKHgsQSx4KSE9PXZ9KTpkLm5vZGVUeXBlP2YuZ3JlcChhLGZ1bmN0aW9uKHgpe3JldHVybiB4PT09ZCE9PXZ9KTp0eXBlb2YgZCE9InN0cmluZyI/Zi5ncmVwKGEsZnVuY3Rpb24oeCl7cmV0dXJuIHUuY2FsbChkLHgpPi0xIT09dn0pOmYuZmlsdGVyKGQsYSx2KX1mLmZpbHRlcj1mdW5jdGlvbihhLGQsdil7dmFyIHg9ZFswXTtyZXR1cm4gdiYmKGE9Ijpub3QoIithKyIpIiksZC5sZW5ndGg9PT0xJiZ4Lm5vZGVUeXBlPT09MT9mLmZpbmQubWF0Y2hlc1NlbGVjdG9yKHgsYSk/W3hdOltdOmYuZmluZC5tYXRjaGVzKGEsZi5ncmVwKGQsZnVuY3Rpb24oQSl7cmV0dXJuIEEubm9kZVR5cGU9PT0xfSkpfSxmLmZuLmV4dGVuZCh7ZmluZDpmdW5jdGlvbihhKXt2YXIgZCx2LHg9dGhpcy5sZW5ndGgsQT10aGlzO2lmKHR5cGVvZiBhIT0ic3RyaW5nIilyZXR1cm4gdGhpcy5wdXNoU3RhY2soZihhKS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IoZD0wO2Q8eDtkKyspaWYoZi5jb250YWlucyhBW2RdLHRoaXMpKXJldHVybiEwfSkpO2Zvcih2PXRoaXMucHVzaFN0YWNrKFtdKSxkPTA7ZDx4O2QrKylmLmZpbmQoYSxBW2RdLHYpO3JldHVybiB4PjE/Zi51bmlxdWVTb3J0KHYpOnZ9LGZpbHRlcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sodHQodGhpcyxhfHxbXSwhMSkpfSxub3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHR0KHRoaXMsYXx8W10sITApKX0saXM6ZnVuY3Rpb24oYSl7cmV0dXJuISF0dCh0aGlzLHR5cGVvZiBhPT0ic3RyaW5nIiYmRy50ZXN0KGEpP2YoYSk6YXx8W10sITEpLmxlbmd0aH19KTt2YXIgZXQsd3Q9L14oPzpccyooPFtcd1xXXSs+KVtePl0qfCMoW1x3LV0rKSkkLyxTdD1mLmZuLmluaXQ9ZnVuY3Rpb24oYSxkLHYpe3ZhciB4LEE7aWYoIWEpcmV0dXJuIHRoaXM7aWYodj12fHxldCx0eXBlb2YgYT09InN0cmluZyIpaWYoYVswXT09PSI8IiYmYVthLmxlbmd0aC0xXT09PSI+IiYmYS5sZW5ndGg+PTM/eD1bbnVsbCxhLG51bGxdOng9d3QuZXhlYyhhKSx4JiYoeFsxXXx8IWQpKWlmKHhbMV0pe2lmKGQ9ZCBpbnN0YW5jZW9mIGY/ZFswXTpkLGYubWVyZ2UodGhpcyxmLnBhcnNlSFRNTCh4WzFdLGQmJmQubm9kZVR5cGU/ZC5vd25lckRvY3VtZW50fHxkOmMsITApKSxudC50ZXN0KHhbMV0pJiZmLmlzUGxhaW5PYmplY3QoZCkpZm9yKHggaW4gZClUKHRoaXNbeF0pP3RoaXNbeF0oZFt4XSk6dGhpcy5hdHRyKHgsZFt4XSk7cmV0dXJuIHRoaXN9ZWxzZSByZXR1cm4gQT1jLmdldEVsZW1lbnRCeUlkKHhbMl0pLEEmJih0aGlzWzBdPUEsdGhpcy5sZW5ndGg9MSksdGhpcztlbHNlIHJldHVybiFkfHxkLmpxdWVyeT8oZHx8dikuZmluZChhKTp0aGlzLmNvbnN0cnVjdG9yKGQpLmZpbmQoYSk7ZWxzZXtpZihhLm5vZGVUeXBlKXJldHVybiB0aGlzWzBdPWEsdGhpcy5sZW5ndGg9MSx0aGlzO2lmKFQoYSkpcmV0dXJuIHYucmVhZHkhPT12b2lkIDA/di5yZWFkeShhKTphKGYpfXJldHVybiBmLm1ha2VBcnJheShhLHRoaXMpfTtTdC5wcm90b3R5cGU9Zi5mbixldD1mKGMpO3ZhciBUdD0vXig/OnBhcmVudHN8cHJldig/OlVudGlsfEFsbCkpLyxrdD17Y2hpbGRyZW46ITAsY29udGVudHM6ITAsbmV4dDohMCxwcmV2OiEwfTtmLmZuLmV4dGVuZCh7aGFzOmZ1bmN0aW9uKGEpe3ZhciBkPWYoYSx0aGlzKSx2PWQubGVuZ3RoO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2Zvcih2YXIgeD0wO3g8djt4KyspaWYoZi5jb250YWlucyh0aGlzLGRbeF0pKXJldHVybiEwfSl9LGNsb3Nlc3Q6ZnVuY3Rpb24oYSxkKXt2YXIgdix4PTAsQT10aGlzLmxlbmd0aCxJPVtdLE49dHlwZW9mIGEhPSJzdHJpbmciJiZmKGEpO2lmKCFHLnRlc3QoYSkpe2Zvcig7eDxBO3grKylmb3Iodj10aGlzW3hdO3YmJnYhPT1kO3Y9di5wYXJlbnROb2RlKWlmKHYubm9kZVR5cGU8MTEmJihOP04uaW5kZXgodik+LTE6di5ub2RlVHlwZT09PTEmJmYuZmluZC5tYXRjaGVzU2VsZWN0b3IodixhKSkpe0kucHVzaCh2KTticmVha319cmV0dXJuIHRoaXMucHVzaFN0YWNrKEkubGVuZ3RoPjE/Zi51bmlxdWVTb3J0KEkpOkkpfSxpbmRleDpmdW5jdGlvbihhKXtyZXR1cm4gYT90eXBlb2YgYT09InN0cmluZyI/dS5jYWxsKGYoYSksdGhpc1swXSk6dS5jYWxsKHRoaXMsYS5qcXVlcnk/YVswXTphKTp0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGU/dGhpcy5maXJzdCgpLnByZXZBbGwoKS5sZW5ndGg6LTF9LGFkZDpmdW5jdGlvbihhLGQpe3JldHVybiB0aGlzLnB1c2hTdGFjayhmLnVuaXF1ZVNvcnQoZi5tZXJnZSh0aGlzLmdldCgpLGYoYSxkKSkpKX0sYWRkQmFjazpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hZGQoYT09bnVsbD90aGlzLnByZXZPYmplY3Q6dGhpcy5wcmV2T2JqZWN0LmZpbHRlcihhKSl9fSk7ZnVuY3Rpb24gTHQoYSxkKXtmb3IoOyhhPWFbZF0pJiZhLm5vZGVUeXBlIT09MTspO3JldHVybiBhfWYuZWFjaCh7cGFyZW50OmZ1bmN0aW9uKGEpe3ZhciBkPWEucGFyZW50Tm9kZTtyZXR1cm4gZCYmZC5ub2RlVHlwZSE9PTExP2Q6bnVsbH0scGFyZW50czpmdW5jdGlvbihhKXtyZXR1cm4gcShhLCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihhLGQsdil7cmV0dXJuIHEoYSwicGFyZW50Tm9kZSIsdil9LG5leHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIEx0KGEsIm5leHRTaWJsaW5nIil9LHByZXY6ZnVuY3Rpb24oYSl7cmV0dXJuIEx0KGEsInByZXZpb3VzU2libGluZyIpfSxuZXh0QWxsOmZ1bmN0aW9uKGEpe3JldHVybiBxKGEsIm5leHRTaWJsaW5nIil9LHByZXZBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIHEoYSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRVbnRpbDpmdW5jdGlvbihhLGQsdil7cmV0dXJuIHEoYSwibmV4dFNpYmxpbmciLHYpfSxwcmV2VW50aWw6ZnVuY3Rpb24oYSxkLHYpe3JldHVybiBxKGEsInByZXZpb3VzU2libGluZyIsdil9LHNpYmxpbmdzOmZ1bmN0aW9uKGEpe3JldHVybiB6KChhLnBhcmVudE5vZGV8fHt9KS5maXJzdENoaWxkLGEpfSxjaGlsZHJlbjpmdW5jdGlvbihhKXtyZXR1cm4geihhLmZpcnN0Q2hpbGQpfSxjb250ZW50czpmdW5jdGlvbihhKXtyZXR1cm4gYS5jb250ZW50RG9jdW1lbnQhPW51bGwmJnIoYS5jb250ZW50RG9jdW1lbnQpP2EuY29udGVudERvY3VtZW50OihYKGEsInRlbXBsYXRlIikmJihhPWEuY29udGVudHx8YSksZi5tZXJnZShbXSxhLmNoaWxkTm9kZXMpKX19LGZ1bmN0aW9uKGEsZCl7Zi5mblthXT1mdW5jdGlvbih2LHgpe3ZhciBBPWYubWFwKHRoaXMsZCx2KTtyZXR1cm4gYS5zbGljZSgtNSkhPT0iVW50aWwiJiYoeD12KSx4JiZ0eXBlb2YgeD09InN0cmluZyImJihBPWYuZmlsdGVyKHgsQSkpLHRoaXMubGVuZ3RoPjEmJihrdFthXXx8Zi51bmlxdWVTb3J0KEEpLFR0LnRlc3QoYSkmJkEucmV2ZXJzZSgpKSx0aGlzLnB1c2hTdGFjayhBKX19KTt2YXIgQnQ9L1teXHgyMFx0XHJcblxmXSsvZztmdW5jdGlvbiAkdChhKXt2YXIgZD17fTtyZXR1cm4gZi5lYWNoKGEubWF0Y2goQnQpfHxbXSxmdW5jdGlvbih2LHgpe2RbeF09ITB9KSxkfWYuQ2FsbGJhY2tzPWZ1bmN0aW9uKGEpe2E9dHlwZW9mIGE9PSJzdHJpbmciPyR0KGEpOmYuZXh0ZW5kKHt9LGEpO3ZhciBkLHYseCxBLEk9W10sTj1bXSxZPS0xLFc9ZnVuY3Rpb24oKXtmb3IoQT1BfHxhLm9uY2UseD1kPSEwO04ubGVuZ3RoO1k9LTEpZm9yKHY9Ti5zaGlmdCgpOysrWTxJLmxlbmd0aDspSVtZXS5hcHBseSh2WzBdLHZbMV0pPT09ITEmJmEuc3RvcE9uRmFsc2UmJihZPUkubGVuZ3RoLHY9ITEpO2EubWVtb3J5fHwodj0hMSksZD0hMSxBJiYodj9JPVtdOkk9IiIpfSxKPXthZGQ6ZnVuY3Rpb24oKXtyZXR1cm4gSSYmKHYmJiFkJiYoWT1JLmxlbmd0aC0xLE4ucHVzaCh2KSksZnVuY3Rpb24gZHQoZnQpe2YuZWFjaChmdCxmdW5jdGlvbihzdCx5dCl7VCh5dCk/KCFhLnVuaXF1ZXx8IUouaGFzKHl0KSkmJkkucHVzaCh5dCk6eXQmJnl0Lmxlbmd0aCYmXyh5dCkhPT0ic3RyaW5nIiYmZHQoeXQpfSl9KGFyZ3VtZW50cyksdiYmIWQmJlcoKSksdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIGYuZWFjaChhcmd1bWVudHMsZnVuY3Rpb24oZHQsZnQpe2Zvcih2YXIgc3Q7KHN0PWYuaW5BcnJheShmdCxJLHN0KSk+LTE7KUkuc3BsaWNlKHN0LDEpLHN0PD1ZJiZZLS19KSx0aGlzfSxoYXM6ZnVuY3Rpb24oZHQpe3JldHVybiBkdD9mLmluQXJyYXkoZHQsSSk+LTE6SS5sZW5ndGg+MH0sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gSSYmKEk9W10pLHRoaXN9LGRpc2FibGU6ZnVuY3Rpb24oKXtyZXR1cm4gQT1OPVtdLEk9dj0iIix0aGlzfSxkaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiFJfSxsb2NrOmZ1bmN0aW9uKCl7cmV0dXJuIEE9Tj1bXSwhdiYmIWQmJihJPXY9IiIpLHRoaXN9LGxvY2tlZDpmdW5jdGlvbigpe3JldHVybiEhQX0sZmlyZVdpdGg6ZnVuY3Rpb24oZHQsZnQpe3JldHVybiBBfHwoZnQ9ZnR8fFtdLGZ0PVtkdCxmdC5zbGljZT9mdC5zbGljZSgpOmZ0XSxOLnB1c2goZnQpLGR8fFcoKSksdGhpc30sZmlyZTpmdW5jdGlvbigpe3JldHVybiBKLmZpcmVXaXRoKHRoaXMsYXJndW1lbnRzKSx0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEheH19O3JldHVybiBKfTtmdW5jdGlvbiBLdChhKXtyZXR1cm4gYX1mdW5jdGlvbiBEKGEpe3Rocm93IGF9ZnVuY3Rpb24gdXQoYSxkLHYseCl7dmFyIEE7dHJ5e2EmJlQoQT1hLnByb21pc2UpP0EuY2FsbChhKS5kb25lKGQpLmZhaWwodik6YSYmVChBPWEudGhlbik/QS5jYWxsKGEsZCx2KTpkLmFwcGx5KHZvaWQgMCxbYV0uc2xpY2UoeCkpfWNhdGNoKEkpe3YuYXBwbHkodm9pZCAwLFtJXSl9fWYuZXh0ZW5kKHtEZWZlcnJlZDpmdW5jdGlvbihhKXt2YXIgZD1bWyJub3RpZnkiLCJwcm9ncmVzcyIsZi5DYWxsYmFja3MoIm1lbW9yeSIpLGYuQ2FsbGJhY2tzKCJtZW1vcnkiKSwyXSxbInJlc29sdmUiLCJkb25lIixmLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxmLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwwLCJyZXNvbHZlZCJdLFsicmVqZWN0IiwiZmFpbCIsZi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksZi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksMSwicmVqZWN0ZWQiXV0sdj0icGVuZGluZyIseD17c3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gdn0sYWx3YXlzOmZ1bmN0aW9uKCl7cmV0dXJuIEEuZG9uZShhcmd1bWVudHMpLmZhaWwoYXJndW1lbnRzKSx0aGlzfSxjYXRjaDpmdW5jdGlvbihJKXtyZXR1cm4geC50aGVuKG51bGwsSSl9LHBpcGU6ZnVuY3Rpb24oKXt2YXIgST1hcmd1bWVudHM7cmV0dXJuIGYuRGVmZXJyZWQoZnVuY3Rpb24oTil7Zi5lYWNoKGQsZnVuY3Rpb24oWSxXKXt2YXIgSj1UKElbV1s0XV0pJiZJW1dbNF1dO0FbV1sxXV0oZnVuY3Rpb24oKXt2YXIgZHQ9SiYmSi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7ZHQmJlQoZHQucHJvbWlzZSk/ZHQucHJvbWlzZSgpLnByb2dyZXNzKE4ubm90aWZ5KS5kb25lKE4ucmVzb2x2ZSkuZmFpbChOLnJlamVjdCk6TltXWzBdKyJXaXRoIl0odGhpcyxKP1tkdF06YXJndW1lbnRzKX0pfSksST1udWxsfSkucHJvbWlzZSgpfSx0aGVuOmZ1bmN0aW9uKEksTixZKXt2YXIgVz0wO2Z1bmN0aW9uIEooZHQsZnQsc3QseXQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBPdD10aGlzLFh0PWFyZ3VtZW50cyxWdD1mdW5jdGlvbigpe3ZhciBvZSxXZTtpZighKGR0PFcpKXtpZihvZT1zdC5hcHBseShPdCxYdCksb2U9PT1mdC5wcm9taXNlKCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlbmFibGUgc2VsZi1yZXNvbHV0aW9uIik7V2U9b2UmJih0eXBlb2Ygb2U9PSJvYmplY3QifHx0eXBlb2Ygb2U9PSJmdW5jdGlvbiIpJiZvZS50aGVuLFQoV2UpP3l0P1dlLmNhbGwob2UsSihXLGZ0LEt0LHl0KSxKKFcsZnQsRCx5dCkpOihXKyssV2UuY2FsbChvZSxKKFcsZnQsS3QseXQpLEooVyxmdCxELHl0KSxKKFcsZnQsS3QsZnQubm90aWZ5V2l0aCkpKTooc3QhPT1LdCYmKE90PXZvaWQgMCxYdD1bb2VdKSwoeXR8fGZ0LnJlc29sdmVXaXRoKShPdCxYdCkpfX0sdWU9eXQ/VnQ6ZnVuY3Rpb24oKXt0cnl7VnQoKX1jYXRjaChvZSl7Zi5EZWZlcnJlZC5leGNlcHRpb25Ib29rJiZmLkRlZmVycmVkLmV4Y2VwdGlvbkhvb2sob2UsdWUuZXJyb3IpLGR0KzE+PVcmJihzdCE9PUQmJihPdD12b2lkIDAsWHQ9W29lXSksZnQucmVqZWN0V2l0aChPdCxYdCkpfX07ZHQ/dWUoKTooZi5EZWZlcnJlZC5nZXRFcnJvckhvb2s/dWUuZXJyb3I9Zi5EZWZlcnJlZC5nZXRFcnJvckhvb2soKTpmLkRlZmVycmVkLmdldFN0YWNrSG9vayYmKHVlLmVycm9yPWYuRGVmZXJyZWQuZ2V0U3RhY2tIb29rKCkpLHQuc2V0VGltZW91dCh1ZSkpfX1yZXR1cm4gZi5EZWZlcnJlZChmdW5jdGlvbihkdCl7ZFswXVszXS5hZGQoSigwLGR0LFQoWSk/WTpLdCxkdC5ub3RpZnlXaXRoKSksZFsxXVszXS5hZGQoSigwLGR0LFQoSSk/STpLdCkpLGRbMl1bM10uYWRkKEooMCxkdCxUKE4pP046RCkpfSkucHJvbWlzZSgpfSxwcm9taXNlOmZ1bmN0aW9uKEkpe3JldHVybiBJIT1udWxsP2YuZXh0ZW5kKEkseCk6eH19LEE9e307cmV0dXJuIGYuZWFjaChkLGZ1bmN0aW9uKEksTil7dmFyIFk9TlsyXSxXPU5bNV07eFtOWzFdXT1ZLmFkZCxXJiZZLmFkZChmdW5jdGlvbigpe3Y9V30sZFszLUldWzJdLmRpc2FibGUsZFszLUldWzNdLmRpc2FibGUsZFswXVsyXS5sb2NrLGRbMF1bM10ubG9jayksWS5hZGQoTlszXS5maXJlKSxBW05bMF1dPWZ1bmN0aW9uKCl7cmV0dXJuIEFbTlswXSsiV2l0aCJdKHRoaXM9PT1BP3ZvaWQgMDp0aGlzLGFyZ3VtZW50cyksdGhpc30sQVtOWzBdKyJXaXRoIl09WS5maXJlV2l0aH0pLHgucHJvbWlzZShBKSxhJiZhLmNhbGwoQSxBKSxBfSx3aGVuOmZ1bmN0aW9uKGEpe3ZhciBkPWFyZ3VtZW50cy5sZW5ndGgsdj1kLHg9QXJyYXkodiksQT1zLmNhbGwoYXJndW1lbnRzKSxJPWYuRGVmZXJyZWQoKSxOPWZ1bmN0aW9uKFkpe3JldHVybiBmdW5jdGlvbihXKXt4W1ldPXRoaXMsQVtZXT1hcmd1bWVudHMubGVuZ3RoPjE/cy5jYWxsKGFyZ3VtZW50cyk6VywtLWR8fEkucmVzb2x2ZVdpdGgoeCxBKX19O2lmKGQ8PTEmJih1dChhLEkuZG9uZShOKHYpKS5yZXNvbHZlLEkucmVqZWN0LCFkKSxJLnN0YXRlKCk9PT0icGVuZGluZyJ8fFQoQVt2XSYmQVt2XS50aGVuKSkpcmV0dXJuIEkudGhlbigpO2Zvcig7di0tOyl1dChBW3ZdLE4odiksSS5yZWplY3QpO3JldHVybiBJLnByb21pc2UoKX19KTt2YXIgb3Q9L14oRXZhbHxJbnRlcm5hbHxSYW5nZXxSZWZlcmVuY2V8U3ludGF4fFR5cGV8VVJJKUVycm9yJC87Zi5EZWZlcnJlZC5leGNlcHRpb25Ib29rPWZ1bmN0aW9uKGEsZCl7dC5jb25zb2xlJiZ0LmNvbnNvbGUud2FybiYmYSYmb3QudGVzdChhLm5hbWUpJiZ0LmNvbnNvbGUud2FybigialF1ZXJ5LkRlZmVycmVkIGV4Y2VwdGlvbjogIithLm1lc3NhZ2UsYS5zdGFjayxkKX0sZi5yZWFkeUV4Y2VwdGlvbj1mdW5jdGlvbihhKXt0LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aHJvdyBhfSl9O3ZhciBWPWYuRGVmZXJyZWQoKTtmLmZuLnJlYWR5PWZ1bmN0aW9uKGEpe3JldHVybiBWLnRoZW4oYSkuY2F0Y2goZnVuY3Rpb24oZCl7Zi5yZWFkeUV4Y2VwdGlvbihkKX0pLHRoaXN9LGYuZXh0ZW5kKHtpc1JlYWR5OiExLHJlYWR5V2FpdDoxLHJlYWR5OmZ1bmN0aW9uKGEpeyhhPT09ITA/LS1mLnJlYWR5V2FpdDpmLmlzUmVhZHkpfHwoZi5pc1JlYWR5PSEwLCEoYSE9PSEwJiYtLWYucmVhZHlXYWl0PjApJiZWLnJlc29sdmVXaXRoKGMsW2ZdKSl9fSksZi5yZWFkeS50aGVuPVYudGhlbjtmdW5jdGlvbiBqKCl7Yy5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixqKSx0LnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLGopLGYucmVhZHkoKX1jLnJlYWR5U3RhdGU9PT0iY29tcGxldGUifHxjLnJlYWR5U3RhdGUhPT0ibG9hZGluZyImJiFjLmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbD90LnNldFRpbWVvdXQoZi5yZWFkeSk6KGMuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsaiksdC5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixqKSk7dmFyIEs9ZnVuY3Rpb24oYSxkLHYseCxBLEksTil7dmFyIFk9MCxXPWEubGVuZ3RoLEo9dj09bnVsbDtpZihfKHYpPT09Im9iamVjdCIpe0E9ITA7Zm9yKFkgaW4gdilLKGEsZCxZLHZbWV0sITAsSSxOKX1lbHNlIGlmKHghPT12b2lkIDAmJihBPSEwLFQoeCl8fChOPSEwKSxKJiYoTj8oZC5jYWxsKGEseCksZD1udWxsKTooSj1kLGQ9ZnVuY3Rpb24oZHQsZnQsc3Qpe3JldHVybiBKLmNhbGwoZihkdCksc3QpfSkpLGQpKWZvcig7WTxXO1krKylkKGFbWV0sdixOP3g6eC5jYWxsKGFbWV0sWSxkKGFbWV0sdikpKTtyZXR1cm4gQT9hOko/ZC5jYWxsKGEpOlc/ZChhWzBdLHYpOkl9LHB0PS9eLW1zLS8sdnQ9Ly0oW2Etel0pL2c7ZnVuY3Rpb24gcnQoYSxkKXtyZXR1cm4gZC50b1VwcGVyQ2FzZSgpfWZ1bmN0aW9uIGd0KGEpe3JldHVybiBhLnJlcGxhY2UocHQsIm1zLSIpLnJlcGxhY2UodnQscnQpfXZhciBDdD1mdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlVHlwZT09PTF8fGEubm9kZVR5cGU9PT05fHwhK2Eubm9kZVR5cGV9O2Z1bmN0aW9uIHh0KCl7dGhpcy5leHBhbmRvPWYuZXhwYW5kbyt4dC51aWQrK314dC51aWQ9MSx4dC5wcm90b3R5cGU9e2NhY2hlOmZ1bmN0aW9uKGEpe3ZhciBkPWFbdGhpcy5leHBhbmRvXTtyZXR1cm4gZHx8KGQ9e30sQ3QoYSkmJihhLm5vZGVUeXBlP2FbdGhpcy5leHBhbmRvXT1kOk9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLHRoaXMuZXhwYW5kbyx7dmFsdWU6ZCxjb25maWd1cmFibGU6ITB9KSkpLGR9LHNldDpmdW5jdGlvbihhLGQsdil7dmFyIHgsQT10aGlzLmNhY2hlKGEpO2lmKHR5cGVvZiBkPT0ic3RyaW5nIilBW2d0KGQpXT12O2Vsc2UgZm9yKHggaW4gZClBW2d0KHgpXT1kW3hdO3JldHVybiBBfSxnZXQ6ZnVuY3Rpb24oYSxkKXtyZXR1cm4gZD09PXZvaWQgMD90aGlzLmNhY2hlKGEpOmFbdGhpcy5leHBhbmRvXSYmYVt0aGlzLmV4cGFuZG9dW2d0KGQpXX0sYWNjZXNzOmZ1bmN0aW9uKGEsZCx2KXtyZXR1cm4gZD09PXZvaWQgMHx8ZCYmdHlwZW9mIGQ9PSJzdHJpbmciJiZ2PT09dm9pZCAwP3RoaXMuZ2V0KGEsZCk6KHRoaXMuc2V0KGEsZCx2KSx2IT09dm9pZCAwP3Y6ZCl9LHJlbW92ZTpmdW5jdGlvbihhLGQpe3ZhciB2LHg9YVt0aGlzLmV4cGFuZG9dO2lmKHghPT12b2lkIDApe2lmKGQhPT12b2lkIDApZm9yKEFycmF5LmlzQXJyYXkoZCk/ZD1kLm1hcChndCk6KGQ9Z3QoZCksZD1kIGluIHg/W2RdOmQubWF0Y2goQnQpfHxbXSksdj1kLmxlbmd0aDt2LS07KWRlbGV0ZSB4W2Rbdl1dOyhkPT09dm9pZCAwfHxmLmlzRW1wdHlPYmplY3QoeCkpJiYoYS5ub2RlVHlwZT9hW3RoaXMuZXhwYW5kb109dm9pZCAwOmRlbGV0ZSBhW3RoaXMuZXhwYW5kb10pfX0saGFzRGF0YTpmdW5jdGlvbihhKXt2YXIgZD1hW3RoaXMuZXhwYW5kb107cmV0dXJuIGQhPT12b2lkIDAmJiFmLmlzRW1wdHlPYmplY3QoZCl9fTt2YXIgbXQ9bmV3IHh0LHp0PW5ldyB4dCxHdD0vXig/Olx7W1x3XFddKlx9fFxbW1x3XFddKlxdKSQvLHZlPS9bQS1aXS9nO2Z1bmN0aW9uIGZuKGEpe3JldHVybiBhPT09InRydWUiPyEwOmE9PT0iZmFsc2UiPyExOmE9PT0ibnVsbCI/bnVsbDphPT09K2ErIiI/K2E6R3QudGVzdChhKT9KU09OLnBhcnNlKGEpOmF9ZnVuY3Rpb24gVGUoYSxkLHYpe3ZhciB4O2lmKHY9PT12b2lkIDAmJmEubm9kZVR5cGU9PT0xKWlmKHg9ImRhdGEtIitkLnJlcGxhY2UodmUsIi0kJiIpLnRvTG93ZXJDYXNlKCksdj1hLmdldEF0dHJpYnV0ZSh4KSx0eXBlb2Ygdj09InN0cmluZyIpe3RyeXt2PWZuKHYpfWNhdGNoe316dC5zZXQoYSxkLHYpfWVsc2Ugdj12b2lkIDA7cmV0dXJuIHZ9Zi5leHRlbmQoe2hhc0RhdGE6ZnVuY3Rpb24oYSl7cmV0dXJuIHp0Lmhhc0RhdGEoYSl8fG10Lmhhc0RhdGEoYSl9LGRhdGE6ZnVuY3Rpb24oYSxkLHYpe3JldHVybiB6dC5hY2Nlc3MoYSxkLHYpfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEsZCl7enQucmVtb3ZlKGEsZCl9LF9kYXRhOmZ1bmN0aW9uKGEsZCx2KXtyZXR1cm4gbXQuYWNjZXNzKGEsZCx2KX0sX3JlbW92ZURhdGE6ZnVuY3Rpb24oYSxkKXttdC5yZW1vdmUoYSxkKX19KSxmLmZuLmV4dGVuZCh7ZGF0YTpmdW5jdGlvbihhLGQpe3ZhciB2LHgsQSxJPXRoaXNbMF0sTj1JJiZJLmF0dHJpYnV0ZXM7aWYoYT09PXZvaWQgMCl7aWYodGhpcy5sZW5ndGgmJihBPXp0LmdldChJKSxJLm5vZGVUeXBlPT09MSYmIW10LmdldChJLCJoYXNEYXRhQXR0cnMiKSkpe2Zvcih2PU4ubGVuZ3RoO3YtLTspTlt2XSYmKHg9Tlt2XS5uYW1lLHguaW5kZXhPZigiZGF0YS0iKT09PTAmJih4PWd0KHguc2xpY2UoNSkpLFRlKEkseCxBW3hdKSkpO210LnNldChJLCJoYXNEYXRhQXR0cnMiLCEwKX1yZXR1cm4gQX1yZXR1cm4gdHlwZW9mIGE9PSJvYmplY3QiP3RoaXMuZWFjaChmdW5jdGlvbigpe3p0LnNldCh0aGlzLGEpfSk6Syh0aGlzLGZ1bmN0aW9uKFkpe3ZhciBXO2lmKEkmJlk9PT12b2lkIDApcmV0dXJuIFc9enQuZ2V0KEksYSksVyE9PXZvaWQgMHx8KFc9VGUoSSxhKSxXIT09dm9pZCAwKT9XOnZvaWQgMDt0aGlzLmVhY2goZnVuY3Rpb24oKXt6dC5zZXQodGhpcyxhLFkpfSl9LG51bGwsZCxhcmd1bWVudHMubGVuZ3RoPjEsbnVsbCwhMCl9LHJlbW92ZURhdGE6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3p0LnJlbW92ZSh0aGlzLGEpfSl9fSksZi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGEsZCx2KXt2YXIgeDtpZihhKXJldHVybiBkPShkfHwiZngiKSsicXVldWUiLHg9bXQuZ2V0KGEsZCksdiYmKCF4fHxBcnJheS5pc0FycmF5KHYpP3g9bXQuYWNjZXNzKGEsZCxmLm1ha2VBcnJheSh2KSk6eC5wdXNoKHYpKSx4fHxbXX0sZGVxdWV1ZTpmdW5jdGlvbihhLGQpe2Q9ZHx8ImZ4Ijt2YXIgdj1mLnF1ZXVlKGEsZCkseD12Lmxlbmd0aCxBPXYuc2hpZnQoKSxJPWYuX3F1ZXVlSG9va3MoYSxkKSxOPWZ1bmN0aW9uKCl7Zi5kZXF1ZXVlKGEsZCl9O0E9PT0iaW5wcm9ncmVzcyImJihBPXYuc2hpZnQoKSx4LS0pLEEmJihkPT09ImZ4IiYmdi51bnNoaWZ0KCJpbnByb2dyZXNzIiksZGVsZXRlIEkuc3RvcCxBLmNhbGwoYSxOLEkpKSwheCYmSSYmSS5lbXB0eS5maXJlKCl9LF9xdWV1ZUhvb2tzOmZ1bmN0aW9uKGEsZCl7dmFyIHY9ZCsicXVldWVIb29rcyI7cmV0dXJuIG10LmdldChhLHYpfHxtdC5hY2Nlc3MoYSx2LHtlbXB0eTpmLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKS5hZGQoZnVuY3Rpb24oKXttdC5yZW1vdmUoYSxbZCsicXVldWUiLHZdKX0pfSl9fSksZi5mbi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGEsZCl7dmFyIHY9MjtyZXR1cm4gdHlwZW9mIGEhPSJzdHJpbmciJiYoZD1hLGE9ImZ4Iix2LS0pLGFyZ3VtZW50cy5sZW5ndGg8dj9mLnF1ZXVlKHRoaXNbMF0sYSk6ZD09PXZvaWQgMD90aGlzOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciB4PWYucXVldWUodGhpcyxhLGQpO2YuX3F1ZXVlSG9va3ModGhpcyxhKSxhPT09ImZ4IiYmeFswXSE9PSJpbnByb2dyZXNzIiYmZi5kZXF1ZXVlKHRoaXMsYSl9KX0sZGVxdWV1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5kZXF1ZXVlKHRoaXMsYSl9KX0sY2xlYXJRdWV1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5xdWV1ZShhfHwiZngiLFtdKX0scHJvbWlzZTpmdW5jdGlvbihhLGQpe3ZhciB2LHg9MSxBPWYuRGVmZXJyZWQoKSxJPXRoaXMsTj10aGlzLmxlbmd0aCxZPWZ1bmN0aW9uKCl7LS14fHxBLnJlc29sdmVXaXRoKEksW0ldKX07Zm9yKHR5cGVvZiBhIT0ic3RyaW5nIiYmKGQ9YSxhPXZvaWQgMCksYT1hfHwiZngiO04tLTspdj1tdC5nZXQoSVtOXSxhKyJxdWV1ZUhvb2tzIiksdiYmdi5lbXB0eSYmKHgrKyx2LmVtcHR5LmFkZChZKSk7cmV0dXJuIFkoKSxBLnByb21pc2UoZCl9fSk7dmFyIHRuPS9bKy1dPyg/OlxkKlwufClcZCsoPzpbZUVdWystXT9cZCt8KS8uc291cmNlLGVlPW5ldyBSZWdFeHAoIl4oPzooWystXSk9fCkoIit0bisiKShbYS16JV0qKSQiLCJpIiksZ2U9WyJUb3AiLCJSaWdodCIsIkJvdHRvbSIsIkxlZnQiXSx6ZT1jLmRvY3VtZW50RWxlbWVudCxmZT1mdW5jdGlvbihhKXtyZXR1cm4gZi5jb250YWlucyhhLm93bmVyRG9jdW1lbnQsYSl9LGRyPXtjb21wb3NlZDohMH07emUuZ2V0Um9vdE5vZGUmJihmZT1mdW5jdGlvbihhKXtyZXR1cm4gZi5jb250YWlucyhhLm93bmVyRG9jdW1lbnQsYSl8fGEuZ2V0Um9vdE5vZGUoZHIpPT09YS5vd25lckRvY3VtZW50fSk7dmFyIFRuPWZ1bmN0aW9uKGEsZCl7cmV0dXJuIGE9ZHx8YSxhLnN0eWxlLmRpc3BsYXk9PT0ibm9uZSJ8fGEuc3R5bGUuZGlzcGxheT09PSIiJiZmZShhKSYmZi5jc3MoYSwiZGlzcGxheSIpPT09Im5vbmUifTtmdW5jdGlvbiB1cihhLGQsdix4KXt2YXIgQSxJLE49MjAsWT14P2Z1bmN0aW9uKCl7cmV0dXJuIHguY3VyKCl9OmZ1bmN0aW9uKCl7cmV0dXJuIGYuY3NzKGEsZCwiIil9LFc9WSgpLEo9diYmdlszXXx8KGYuY3NzTnVtYmVyW2RdPyIiOiJweCIpLGR0PWEubm9kZVR5cGUmJihmLmNzc051bWJlcltkXXx8SiE9PSJweCImJitXKSYmZWUuZXhlYyhmLmNzcyhhLGQpKTtpZihkdCYmZHRbM10hPT1KKXtmb3IoVz1XLzIsSj1KfHxkdFszXSxkdD0rV3x8MTtOLS07KWYuc3R5bGUoYSxkLGR0K0opLCgxLUkpKigxLShJPVkoKS9XfHwuNSkpPD0wJiYoTj0wKSxkdD1kdC9JO2R0PWR0KjIsZi5zdHlsZShhLGQsZHQrSiksdj12fHxbXX1yZXR1cm4gdiYmKGR0PStkdHx8K1d8fDAsQT12WzFdP2R0Kyh2WzFdKzEpKnZbMl06K3ZbMl0seCYmKHgudW5pdD1KLHguc3RhcnQ9ZHQseC5lbmQ9QSkpLEF9dmFyIGNyPXt9O2Z1bmN0aW9uIGZyKGEpe3ZhciBkLHY9YS5vd25lckRvY3VtZW50LHg9YS5ub2RlTmFtZSxBPWNyW3hdO3JldHVybiBBfHwoZD12LmJvZHkuYXBwZW5kQ2hpbGQodi5jcmVhdGVFbGVtZW50KHgpKSxBPWYuY3NzKGQsImRpc3BsYXkiKSxkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCksQT09PSJub25lIiYmKEE9ImJsb2NrIiksY3JbeF09QSxBKX1mdW5jdGlvbiBBZShhLGQpe2Zvcih2YXIgdix4LEE9W10sST0wLE49YS5sZW5ndGg7STxOO0krKyl4PWFbSV0seC5zdHlsZSYmKHY9eC5zdHlsZS5kaXNwbGF5LGQ/KHY9PT0ibm9uZSImJihBW0ldPW10LmdldCh4LCJkaXNwbGF5Iil8fG51bGwsQVtJXXx8KHguc3R5bGUuZGlzcGxheT0iIikpLHguc3R5bGUuZGlzcGxheT09PSIiJiZUbih4KSYmKEFbSV09ZnIoeCkpKTp2IT09Im5vbmUiJiYoQVtJXT0ibm9uZSIsbXQuc2V0KHgsImRpc3BsYXkiLHYpKSk7Zm9yKEk9MDtJPE47SSsrKUFbSV0hPW51bGwmJihhW0ldLnN0eWxlLmRpc3BsYXk9QVtJXSk7cmV0dXJuIGF9Zi5mbi5leHRlbmQoe3Nob3c6ZnVuY3Rpb24oKXtyZXR1cm4gQWUodGhpcywhMCl9LGhpZGU6ZnVuY3Rpb24oKXtyZXR1cm4gQWUodGhpcyl9LHRvZ2dsZTpmdW5jdGlvbihhKXtyZXR1cm4gdHlwZW9mIGE9PSJib29sZWFuIj9hP3RoaXMuc2hvdygpOnRoaXMuaGlkZSgpOnRoaXMuZWFjaChmdW5jdGlvbigpe1RuKHRoaXMpP2YodGhpcykuc2hvdygpOmYodGhpcykuaGlkZSgpfSl9fSk7dmFyIFVlPS9eKD86Y2hlY2tib3h8cmFkaW8pJC9pLHJhPS88KFthLXpdW15cL1wwPlx4MjBcdFxyXG5cZl0qKS9pLGlhPS9eJHxebW9kdWxlJHxcLyg/OmphdmF8ZWNtYSlzY3JpcHQvaTsoZnVuY3Rpb24oKXt2YXIgYT1jLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxkPWEuYXBwZW5kQ2hpbGQoYy5jcmVhdGVFbGVtZW50KCJkaXYiKSksdj1jLmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7di5zZXRBdHRyaWJ1dGUoInR5cGUiLCJyYWRpbyIpLHYuc2V0QXR0cmlidXRlKCJjaGVja2VkIiwiY2hlY2tlZCIpLHYuc2V0QXR0cmlidXRlKCJuYW1lIiwidCIpLGQuYXBwZW5kQ2hpbGQodikseS5jaGVja0Nsb25lPWQuY2xvbmVOb2RlKCEwKS5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5jaGVja2VkLGQuaW5uZXJIVE1MPSI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+Iix5Lm5vQ2xvbmVDaGVja2VkPSEhZC5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5kZWZhdWx0VmFsdWUsZC5pbm5lckhUTUw9IjxvcHRpb24+PC9vcHRpb24+Iix5Lm9wdGlvbj0hIWQubGFzdENoaWxkfSkoKTt2YXIgSWU9e3RoZWFkOlsxLCI8dGFibGU+IiwiPC90YWJsZT4iXSxjb2w6WzIsIjx0YWJsZT48Y29sZ3JvdXA+IiwiPC9jb2xncm91cD48L3RhYmxlPiJdLHRyOlsyLCI8dGFibGU+PHRib2R5PiIsIjwvdGJvZHk+PC90YWJsZT4iXSx0ZDpbMywiPHRhYmxlPjx0Ym9keT48dHI+IiwiPC90cj48L3Rib2R5PjwvdGFibGU+Il0sX2RlZmF1bHQ6WzAsIiIsIiJdfTtJZS50Ym9keT1JZS50Zm9vdD1JZS5jb2xncm91cD1JZS5jYXB0aW9uPUllLnRoZWFkLEllLnRoPUllLnRkLHkub3B0aW9ufHwoSWUub3B0Z3JvdXA9SWUub3B0aW9uPVsxLCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwiPC9zZWxlY3Q+Il0pO2Z1bmN0aW9uIHllKGEsZCl7dmFyIHY7cmV0dXJuIHR5cGVvZiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lPCJ1Ij92PWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZHx8IioiKTp0eXBlb2YgYS5xdWVyeVNlbGVjdG9yQWxsPCJ1Ij92PWEucXVlcnlTZWxlY3RvckFsbChkfHwiKiIpOnY9W10sZD09PXZvaWQgMHx8ZCYmWChhLGQpP2YubWVyZ2UoW2FdLHYpOnZ9ZnVuY3Rpb24gWHIoYSxkKXtmb3IodmFyIHY9MCx4PWEubGVuZ3RoO3Y8eDt2KyspbXQuc2V0KGFbdl0sImdsb2JhbEV2YWwiLCFkfHxtdC5nZXQoZFt2XSwiZ2xvYmFsRXZhbCIpKX12YXIgaW89Lzx8JiM/XHcrOy87ZnVuY3Rpb24gYWEoYSxkLHYseCxBKXtmb3IodmFyIEksTixZLFcsSixkdCxmdD1kLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxzdD1bXSx5dD0wLE90PWEubGVuZ3RoO3l0PE90O3l0KyspaWYoST1hW3l0XSxJfHxJPT09MClpZihfKEkpPT09Im9iamVjdCIpZi5tZXJnZShzdCxJLm5vZGVUeXBlP1tJXTpJKTtlbHNlIGlmKCFpby50ZXN0KEkpKXN0LnB1c2goZC5jcmVhdGVUZXh0Tm9kZShJKSk7ZWxzZXtmb3IoTj1OfHxmdC5hcHBlbmRDaGlsZChkLmNyZWF0ZUVsZW1lbnQoImRpdiIpKSxZPShyYS5leGVjKEkpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpLFc9SWVbWV18fEllLl9kZWZhdWx0LE4uaW5uZXJIVE1MPVdbMV0rZi5odG1sUHJlZmlsdGVyKEkpK1dbMl0sZHQ9V1swXTtkdC0tOylOPU4ubGFzdENoaWxkO2YubWVyZ2Uoc3QsTi5jaGlsZE5vZGVzKSxOPWZ0LmZpcnN0Q2hpbGQsTi50ZXh0Q29udGVudD0iIn1mb3IoZnQudGV4dENvbnRlbnQ9IiIseXQ9MDtJPXN0W3l0KytdOyl7aWYoeCYmZi5pbkFycmF5KEkseCk+LTEpe0EmJkEucHVzaChJKTtjb250aW51ZX1pZihKPWZlKEkpLE49eWUoZnQuYXBwZW5kQ2hpbGQoSSksInNjcmlwdCIpLEomJlhyKE4pLHYpZm9yKGR0PTA7ST1OW2R0KytdOylpYS50ZXN0KEkudHlwZXx8IiIpJiZ2LnB1c2goSSl9cmV0dXJuIGZ0fXZhciBzYT0vXihbXi5dKikoPzpcLiguKyl8KS87ZnVuY3Rpb24ga24oKXtyZXR1cm4hMH1mdW5jdGlvbiBTbigpe3JldHVybiExfWZ1bmN0aW9uIFlyKGEsZCx2LHgsQSxJKXt2YXIgTixZO2lmKHR5cGVvZiBkPT0ib2JqZWN0Iil7dHlwZW9mIHYhPSJzdHJpbmciJiYoeD14fHx2LHY9dm9pZCAwKTtmb3IoWSBpbiBkKVlyKGEsWSx2LHgsZFtZXSxJKTtyZXR1cm4gYX1pZih4PT1udWxsJiZBPT1udWxsPyhBPXYseD12PXZvaWQgMCk6QT09bnVsbCYmKHR5cGVvZiB2PT0ic3RyaW5nIj8oQT14LHg9dm9pZCAwKTooQT14LHg9dix2PXZvaWQgMCkpLEE9PT0hMSlBPVNuO2Vsc2UgaWYoIUEpcmV0dXJuIGE7cmV0dXJuIEk9PT0xJiYoTj1BLEE9ZnVuY3Rpb24oVyl7cmV0dXJuIGYoKS5vZmYoVyksTi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LEEuZ3VpZD1OLmd1aWR8fChOLmd1aWQ9Zi5ndWlkKyspKSxhLmVhY2goZnVuY3Rpb24oKXtmLmV2ZW50LmFkZCh0aGlzLGQsQSx4LHYpfSl9Zi5ldmVudD17Z2xvYmFsOnt9LGFkZDpmdW5jdGlvbihhLGQsdix4LEEpe3ZhciBJLE4sWSxXLEosZHQsZnQsc3QseXQsT3QsWHQsVnQ9bXQuZ2V0KGEpO2lmKEN0KGEpKWZvcih2LmhhbmRsZXImJihJPXYsdj1JLmhhbmRsZXIsQT1JLnNlbGVjdG9yKSxBJiZmLmZpbmQubWF0Y2hlc1NlbGVjdG9yKHplLEEpLHYuZ3VpZHx8KHYuZ3VpZD1mLmd1aWQrKyksKFc9VnQuZXZlbnRzKXx8KFc9VnQuZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCkpLChOPVZ0LmhhbmRsZSl8fChOPVZ0LmhhbmRsZT1mdW5jdGlvbih1ZSl7cmV0dXJuIHR5cGVvZiBmPCJ1IiYmZi5ldmVudC50cmlnZ2VyZWQhPT11ZS50eXBlP2YuZXZlbnQuZGlzcGF0Y2guYXBwbHkoYSxhcmd1bWVudHMpOnZvaWQgMH0pLGQ9KGR8fCIiKS5tYXRjaChCdCl8fFsiIl0sSj1kLmxlbmd0aDtKLS07KVk9c2EuZXhlYyhkW0pdKXx8W10seXQ9WHQ9WVsxXSxPdD0oWVsyXXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLHl0JiYoZnQ9Zi5ldmVudC5zcGVjaWFsW3l0XXx8e30seXQ9KEE/ZnQuZGVsZWdhdGVUeXBlOmZ0LmJpbmRUeXBlKXx8eXQsZnQ9Zi5ldmVudC5zcGVjaWFsW3l0XXx8e30sZHQ9Zi5leHRlbmQoe3R5cGU6eXQsb3JpZ1R5cGU6WHQsZGF0YTp4LGhhbmRsZXI6dixndWlkOnYuZ3VpZCxzZWxlY3RvcjpBLG5lZWRzQ29udGV4dDpBJiZmLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LnRlc3QoQSksbmFtZXNwYWNlOk90LmpvaW4oIi4iKX0sSSksKHN0PVdbeXRdKXx8KHN0PVdbeXRdPVtdLHN0LmRlbGVnYXRlQ291bnQ9MCwoIWZ0LnNldHVwfHxmdC5zZXR1cC5jYWxsKGEseCxPdCxOKT09PSExKSYmYS5hZGRFdmVudExpc3RlbmVyJiZhLmFkZEV2ZW50TGlzdGVuZXIoeXQsTikpLGZ0LmFkZCYmKGZ0LmFkZC5jYWxsKGEsZHQpLGR0LmhhbmRsZXIuZ3VpZHx8KGR0LmhhbmRsZXIuZ3VpZD12Lmd1aWQpKSxBP3N0LnNwbGljZShzdC5kZWxlZ2F0ZUNvdW50KyssMCxkdCk6c3QucHVzaChkdCksZi5ldmVudC5nbG9iYWxbeXRdPSEwKX0scmVtb3ZlOmZ1bmN0aW9uKGEsZCx2LHgsQSl7dmFyIEksTixZLFcsSixkdCxmdCxzdCx5dCxPdCxYdCxWdD1tdC5oYXNEYXRhKGEpJiZtdC5nZXQoYSk7aWYoISghVnR8fCEoVz1WdC5ldmVudHMpKSl7Zm9yKGQ9KGR8fCIiKS5tYXRjaChCdCl8fFsiIl0sSj1kLmxlbmd0aDtKLS07KXtpZihZPXNhLmV4ZWMoZFtKXSl8fFtdLHl0PVh0PVlbMV0sT3Q9KFlbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSwheXQpe2Zvcih5dCBpbiBXKWYuZXZlbnQucmVtb3ZlKGEseXQrZFtKXSx2LHgsITApO2NvbnRpbnVlfWZvcihmdD1mLmV2ZW50LnNwZWNpYWxbeXRdfHx7fSx5dD0oeD9mdC5kZWxlZ2F0ZVR5cGU6ZnQuYmluZFR5cGUpfHx5dCxzdD1XW3l0XXx8W10sWT1ZWzJdJiZuZXcgUmVnRXhwKCIoXnxcXC4pIitPdC5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKSxOPUk9c3QubGVuZ3RoO0ktLTspZHQ9c3RbSV0sKEF8fFh0PT09ZHQub3JpZ1R5cGUpJiYoIXZ8fHYuZ3VpZD09PWR0Lmd1aWQpJiYoIVl8fFkudGVzdChkdC5uYW1lc3BhY2UpKSYmKCF4fHx4PT09ZHQuc2VsZWN0b3J8fHg9PT0iKioiJiZkdC5zZWxlY3RvcikmJihzdC5zcGxpY2UoSSwxKSxkdC5zZWxlY3RvciYmc3QuZGVsZWdhdGVDb3VudC0tLGZ0LnJlbW92ZSYmZnQucmVtb3ZlLmNhbGwoYSxkdCkpO04mJiFzdC5sZW5ndGgmJigoIWZ0LnRlYXJkb3dufHxmdC50ZWFyZG93bi5jYWxsKGEsT3QsVnQuaGFuZGxlKT09PSExKSYmZi5yZW1vdmVFdmVudChhLHl0LFZ0LmhhbmRsZSksZGVsZXRlIFdbeXRdKX1mLmlzRW1wdHlPYmplY3QoVykmJm10LnJlbW92ZShhLCJoYW5kbGUgZXZlbnRzIil9fSxkaXNwYXRjaDpmdW5jdGlvbihhKXt2YXIgZCx2LHgsQSxJLE4sWT1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCksVz1mLmV2ZW50LmZpeChhKSxKPShtdC5nZXQodGhpcywiZXZlbnRzIil8fE9iamVjdC5jcmVhdGUobnVsbCkpW1cudHlwZV18fFtdLGR0PWYuZXZlbnQuc3BlY2lhbFtXLnR5cGVdfHx7fTtmb3IoWVswXT1XLGQ9MTtkPGFyZ3VtZW50cy5sZW5ndGg7ZCsrKVlbZF09YXJndW1lbnRzW2RdO2lmKFcuZGVsZWdhdGVUYXJnZXQ9dGhpcywhKGR0LnByZURpc3BhdGNoJiZkdC5wcmVEaXNwYXRjaC5jYWxsKHRoaXMsVyk9PT0hMSkpe2ZvcihOPWYuZXZlbnQuaGFuZGxlcnMuY2FsbCh0aGlzLFcsSiksZD0wOyhBPU5bZCsrXSkmJiFXLmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7KWZvcihXLmN1cnJlbnRUYXJnZXQ9QS5lbGVtLHY9MDsoST1BLmhhbmRsZXJzW3YrK10pJiYhVy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpOykoIVcucm5hbWVzcGFjZXx8SS5uYW1lc3BhY2U9PT0hMXx8Vy5ybmFtZXNwYWNlLnRlc3QoSS5uYW1lc3BhY2UpKSYmKFcuaGFuZGxlT2JqPUksVy5kYXRhPUkuZGF0YSx4PSgoZi5ldmVudC5zcGVjaWFsW0kub3JpZ1R5cGVdfHx7fSkuaGFuZGxlfHxJLmhhbmRsZXIpLmFwcGx5KEEuZWxlbSxZKSx4IT09dm9pZCAwJiYoVy5yZXN1bHQ9eCk9PT0hMSYmKFcucHJldmVudERlZmF1bHQoKSxXLnN0b3BQcm9wYWdhdGlvbigpKSk7cmV0dXJuIGR0LnBvc3REaXNwYXRjaCYmZHQucG9zdERpc3BhdGNoLmNhbGwodGhpcyxXKSxXLnJlc3VsdH19LGhhbmRsZXJzOmZ1bmN0aW9uKGEsZCl7dmFyIHYseCxBLEksTixZPVtdLFc9ZC5kZWxlZ2F0ZUNvdW50LEo9YS50YXJnZXQ7aWYoVyYmSi5ub2RlVHlwZSYmIShhLnR5cGU9PT0iY2xpY2siJiZhLmJ1dHRvbj49MSkpe2Zvcig7SiE9PXRoaXM7Sj1KLnBhcmVudE5vZGV8fHRoaXMpaWYoSi5ub2RlVHlwZT09PTEmJiEoYS50eXBlPT09ImNsaWNrIiYmSi5kaXNhYmxlZD09PSEwKSl7Zm9yKEk9W10sTj17fSx2PTA7djxXO3YrKyl4PWRbdl0sQT14LnNlbGVjdG9yKyIgIixOW0FdPT09dm9pZCAwJiYoTltBXT14Lm5lZWRzQ29udGV4dD9mKEEsdGhpcykuaW5kZXgoSik+LTE6Zi5maW5kKEEsdGhpcyxudWxsLFtKXSkubGVuZ3RoKSxOW0FdJiZJLnB1c2goeCk7SS5sZW5ndGgmJlkucHVzaCh7ZWxlbTpKLGhhbmRsZXJzOkl9KX19cmV0dXJuIEo9dGhpcyxXPGQubGVuZ3RoJiZZLnB1c2goe2VsZW06SixoYW5kbGVyczpkLnNsaWNlKFcpfSksWX0sYWRkUHJvcDpmdW5jdGlvbihhLGQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShmLkV2ZW50LnByb3RvdHlwZSxhLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6VChkKT9mdW5jdGlvbigpe2lmKHRoaXMub3JpZ2luYWxFdmVudClyZXR1cm4gZCh0aGlzLm9yaWdpbmFsRXZlbnQpfTpmdW5jdGlvbigpe2lmKHRoaXMub3JpZ2luYWxFdmVudClyZXR1cm4gdGhpcy5vcmlnaW5hbEV2ZW50W2FdfSxzZXQ6ZnVuY3Rpb24odil7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsYSx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dn0pfX0pfSxmaXg6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbZi5leHBhbmRvXT9hOm5ldyBmLkV2ZW50KGEpfSxzcGVjaWFsOntsb2FkOntub0J1YmJsZTohMH0sY2xpY2s6e3NldHVwOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXN8fGE7cmV0dXJuIFVlLnRlc3QoZC50eXBlKSYmZC5jbGljayYmWChkLCJpbnB1dCIpJiZocihkLCJjbGljayIsITApLCExfSx0cmlnZ2VyOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXN8fGE7cmV0dXJuIFVlLnRlc3QoZC50eXBlKSYmZC5jbGljayYmWChkLCJpbnB1dCIpJiZocihkLCJjbGljayIpLCEwfSxfZGVmYXVsdDpmdW5jdGlvbihhKXt2YXIgZD1hLnRhcmdldDtyZXR1cm4gVWUudGVzdChkLnR5cGUpJiZkLmNsaWNrJiZYKGQsImlucHV0IikmJm10LmdldChkLCJjbGljayIpfHxYKGQsImEiKX19LGJlZm9yZXVubG9hZDp7cG9zdERpc3BhdGNoOmZ1bmN0aW9uKGEpe2EucmVzdWx0IT09dm9pZCAwJiZhLm9yaWdpbmFsRXZlbnQmJihhLm9yaWdpbmFsRXZlbnQucmV0dXJuVmFsdWU9YS5yZXN1bHQpfX19fTtmdW5jdGlvbiBocihhLGQsdil7aWYoIXYpe210LmdldChhLGQpPT09dm9pZCAwJiZmLmV2ZW50LmFkZChhLGQsa24pO3JldHVybn1tdC5zZXQoYSxkLCExKSxmLmV2ZW50LmFkZChhLGQse25hbWVzcGFjZTohMSxoYW5kbGVyOmZ1bmN0aW9uKHgpe3ZhciBBLEk9bXQuZ2V0KHRoaXMsZCk7aWYoeC5pc1RyaWdnZXImMSYmdGhpc1tkXSl7aWYoSSkoZi5ldmVudC5zcGVjaWFsW2RdfHx7fSkuZGVsZWdhdGVUeXBlJiZ4LnN0b3BQcm9wYWdhdGlvbigpO2Vsc2UgaWYoST1zLmNhbGwoYXJndW1lbnRzKSxtdC5zZXQodGhpcyxkLEkpLHRoaXNbZF0oKSxBPW10LmdldCh0aGlzLGQpLG10LnNldCh0aGlzLGQsITEpLEkhPT1BKXJldHVybiB4LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLHgucHJldmVudERlZmF1bHQoKSxBfWVsc2UgSSYmKG10LnNldCh0aGlzLGQsZi5ldmVudC50cmlnZ2VyKElbMF0sSS5zbGljZSgxKSx0aGlzKSkseC5zdG9wUHJvcGFnYXRpb24oKSx4LmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkPWtuKX19KX1mLnJlbW92ZUV2ZW50PWZ1bmN0aW9uKGEsZCx2KXthLnJlbW92ZUV2ZW50TGlzdGVuZXImJmEucmVtb3ZlRXZlbnRMaXN0ZW5lcihkLHYpfSxmLkV2ZW50PWZ1bmN0aW9uKGEsZCl7aWYoISh0aGlzIGluc3RhbmNlb2YgZi5FdmVudCkpcmV0dXJuIG5ldyBmLkV2ZW50KGEsZCk7YSYmYS50eXBlPyh0aGlzLm9yaWdpbmFsRXZlbnQ9YSx0aGlzLnR5cGU9YS50eXBlLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWEuZGVmYXVsdFByZXZlbnRlZHx8YS5kZWZhdWx0UHJldmVudGVkPT09dm9pZCAwJiZhLnJldHVyblZhbHVlPT09ITE/a246U24sdGhpcy50YXJnZXQ9YS50YXJnZXQmJmEudGFyZ2V0Lm5vZGVUeXBlPT09Mz9hLnRhcmdldC5wYXJlbnROb2RlOmEudGFyZ2V0LHRoaXMuY3VycmVudFRhcmdldD1hLmN1cnJlbnRUYXJnZXQsdGhpcy5yZWxhdGVkVGFyZ2V0PWEucmVsYXRlZFRhcmdldCk6dGhpcy50eXBlPWEsZCYmZi5leHRlbmQodGhpcyxkKSx0aGlzLnRpbWVTdGFtcD1hJiZhLnRpbWVTdGFtcHx8RGF0ZS5ub3coKSx0aGlzW2YuZXhwYW5kb109ITB9LGYuRXZlbnQucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpmLkV2ZW50LGlzRGVmYXVsdFByZXZlbnRlZDpTbixpc1Byb3BhZ2F0aW9uU3RvcHBlZDpTbixpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDpTbixpc1NpbXVsYXRlZDohMSxwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1rbixhJiYhdGhpcy5pc1NpbXVsYXRlZCYmYS5wcmV2ZW50RGVmYXVsdCgpfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1rbixhJiYhdGhpcy5pc1NpbXVsYXRlZCYmYS5zdG9wUHJvcGFnYXRpb24oKX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9a24sYSYmIXRoaXMuaXNTaW11bGF0ZWQmJmEuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksdGhpcy5zdG9wUHJvcGFnYXRpb24oKX19LGYuZWFjaCh7YWx0S2V5OiEwLGJ1YmJsZXM6ITAsY2FuY2VsYWJsZTohMCxjaGFuZ2VkVG91Y2hlczohMCxjdHJsS2V5OiEwLGRldGFpbDohMCxldmVudFBoYXNlOiEwLG1ldGFLZXk6ITAscGFnZVg6ITAscGFnZVk6ITAsc2hpZnRLZXk6ITAsdmlldzohMCxjaGFyOiEwLGNvZGU6ITAsY2hhckNvZGU6ITAsa2V5OiEwLGtleUNvZGU6ITAsYnV0dG9uOiEwLGJ1dHRvbnM6ITAsY2xpZW50WDohMCxjbGllbnRZOiEwLG9mZnNldFg6ITAsb2Zmc2V0WTohMCxwb2ludGVySWQ6ITAscG9pbnRlclR5cGU6ITAsc2NyZWVuWDohMCxzY3JlZW5ZOiEwLHRhcmdldFRvdWNoZXM6ITAsdG9FbGVtZW50OiEwLHRvdWNoZXM6ITAsd2hpY2g6ITB9LGYuZXZlbnQuYWRkUHJvcCksZi5lYWNoKHtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxmdW5jdGlvbihhLGQpe2Z1bmN0aW9uIHYoeCl7aWYoYy5kb2N1bWVudE1vZGUpe3ZhciBBPW10LmdldCh0aGlzLCJoYW5kbGUiKSxJPWYuZXZlbnQuZml4KHgpO0kudHlwZT14LnR5cGU9PT0iZm9jdXNpbiI/ImZvY3VzIjoiYmx1ciIsSS5pc1NpbXVsYXRlZD0hMCxBKHgpLEkudGFyZ2V0PT09SS5jdXJyZW50VGFyZ2V0JiZBKEkpfWVsc2UgZi5ldmVudC5zaW11bGF0ZShkLHgudGFyZ2V0LGYuZXZlbnQuZml4KHgpKX1mLmV2ZW50LnNwZWNpYWxbYV09e3NldHVwOmZ1bmN0aW9uKCl7dmFyIHg7aWYoaHIodGhpcyxhLCEwKSxjLmRvY3VtZW50TW9kZSl4PW10LmdldCh0aGlzLGQpLHh8fHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihkLHYpLG10LnNldCh0aGlzLGQsKHh8fDApKzEpO2Vsc2UgcmV0dXJuITF9LHRyaWdnZXI6ZnVuY3Rpb24oKXtyZXR1cm4gaHIodGhpcyxhKSwhMH0sdGVhcmRvd246ZnVuY3Rpb24oKXt2YXIgeDtpZihjLmRvY3VtZW50TW9kZSl4PW10LmdldCh0aGlzLGQpLTEseD9tdC5zZXQodGhpcyxkLHgpOih0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoZCx2KSxtdC5yZW1vdmUodGhpcyxkKSk7ZWxzZSByZXR1cm4hMX0sX2RlZmF1bHQ6ZnVuY3Rpb24oeCl7cmV0dXJuIG10LmdldCh4LnRhcmdldCxhKX0sZGVsZWdhdGVUeXBlOmR9LGYuZXZlbnQuc3BlY2lhbFtkXT17c2V0dXA6ZnVuY3Rpb24oKXt2YXIgeD10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMuZG9jdW1lbnR8fHRoaXMsQT1jLmRvY3VtZW50TW9kZT90aGlzOngsST1tdC5nZXQoQSxkKTtJfHwoYy5kb2N1bWVudE1vZGU/dGhpcy5hZGRFdmVudExpc3RlbmVyKGQsdik6eC5hZGRFdmVudExpc3RlbmVyKGEsdiwhMCkpLG10LnNldChBLGQsKEl8fDApKzEpfSx0ZWFyZG93bjpmdW5jdGlvbigpe3ZhciB4PXRoaXMub3duZXJEb2N1bWVudHx8dGhpcy5kb2N1bWVudHx8dGhpcyxBPWMuZG9jdW1lbnRNb2RlP3RoaXM6eCxJPW10LmdldChBLGQpLTE7ST9tdC5zZXQoQSxkLEkpOihjLmRvY3VtZW50TW9kZT90aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoZCx2KTp4LnJlbW92ZUV2ZW50TGlzdGVuZXIoYSx2LCEwKSxtdC5yZW1vdmUoQSxkKSl9fX0pLGYuZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCIscG9pbnRlcmVudGVyOiJwb2ludGVyb3ZlciIscG9pbnRlcmxlYXZlOiJwb2ludGVyb3V0In0sZnVuY3Rpb24oYSxkKXtmLmV2ZW50LnNwZWNpYWxbYV09e2RlbGVnYXRlVHlwZTpkLGJpbmRUeXBlOmQsaGFuZGxlOmZ1bmN0aW9uKHYpe3ZhciB4LEE9dGhpcyxJPXYucmVsYXRlZFRhcmdldCxOPXYuaGFuZGxlT2JqO3JldHVybighSXx8SSE9PUEmJiFmLmNvbnRhaW5zKEEsSSkpJiYodi50eXBlPU4ub3JpZ1R5cGUseD1OLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLHYudHlwZT1kKSx4fX19KSxmLmZuLmV4dGVuZCh7b246ZnVuY3Rpb24oYSxkLHYseCl7cmV0dXJuIFlyKHRoaXMsYSxkLHYseCl9LG9uZTpmdW5jdGlvbihhLGQsdix4KXtyZXR1cm4gWXIodGhpcyxhLGQsdix4LDEpfSxvZmY6ZnVuY3Rpb24oYSxkLHYpe3ZhciB4LEE7aWYoYSYmYS5wcmV2ZW50RGVmYXVsdCYmYS5oYW5kbGVPYmopcmV0dXJuIHg9YS5oYW5kbGVPYmosZihhLmRlbGVnYXRlVGFyZ2V0KS5vZmYoeC5uYW1lc3BhY2U/eC5vcmlnVHlwZSsiLiIreC5uYW1lc3BhY2U6eC5vcmlnVHlwZSx4LnNlbGVjdG9yLHguaGFuZGxlciksdGhpcztpZih0eXBlb2YgYT09Im9iamVjdCIpe2ZvcihBIGluIGEpdGhpcy5vZmYoQSxkLGFbQV0pO3JldHVybiB0aGlzfXJldHVybihkPT09ITF8fHR5cGVvZiBkPT0iZnVuY3Rpb24iKSYmKHY9ZCxkPXZvaWQgMCksdj09PSExJiYodj1TbiksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5ldmVudC5yZW1vdmUodGhpcyxhLHYsZCl9KX19KTt2YXIgYW89LzxzY3JpcHR8PHN0eWxlfDxsaW5rL2ksc289L2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2ksb289L15ccyo8IVxbQ0RBVEFcW3xcXVxdPlxzKiQvZztmdW5jdGlvbiBvYShhLGQpe3JldHVybiBYKGEsInRhYmxlIikmJlgoZC5ub2RlVHlwZSE9PTExP2Q6ZC5maXJzdENoaWxkLCJ0ciIpJiZmKGEpLmNoaWxkcmVuKCJ0Ym9keSIpWzBdfHxhfWZ1bmN0aW9uIGxvKGEpe3JldHVybiBhLnR5cGU9KGEuZ2V0QXR0cmlidXRlKCJ0eXBlIikhPT1udWxsKSsiLyIrYS50eXBlLGF9ZnVuY3Rpb24gdW8oYSl7cmV0dXJuKGEudHlwZXx8IiIpLnNsaWNlKDAsNSk9PT0idHJ1ZS8iP2EudHlwZT1hLnR5cGUuc2xpY2UoNSk6YS5yZW1vdmVBdHRyaWJ1dGUoInR5cGUiKSxhfWZ1bmN0aW9uIGxhKGEsZCl7dmFyIHYseCxBLEksTixZLFc7aWYoZC5ub2RlVHlwZT09PTEpe2lmKG10Lmhhc0RhdGEoYSkmJihJPW10LmdldChhKSxXPUkuZXZlbnRzLFcpKXttdC5yZW1vdmUoZCwiaGFuZGxlIGV2ZW50cyIpO2ZvcihBIGluIFcpZm9yKHY9MCx4PVdbQV0ubGVuZ3RoO3Y8eDt2KyspZi5ldmVudC5hZGQoZCxBLFdbQV1bdl0pfXp0Lmhhc0RhdGEoYSkmJihOPXp0LmFjY2VzcyhhKSxZPWYuZXh0ZW5kKHt9LE4pLHp0LnNldChkLFkpKX19ZnVuY3Rpb24gY28oYSxkKXt2YXIgdj1kLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7dj09PSJpbnB1dCImJlVlLnRlc3QoYS50eXBlKT9kLmNoZWNrZWQ9YS5jaGVja2VkOih2PT09ImlucHV0Inx8dj09PSJ0ZXh0YXJlYSIpJiYoZC5kZWZhdWx0VmFsdWU9YS5kZWZhdWx0VmFsdWUpfWZ1bmN0aW9uIERuKGEsZCx2LHgpe2Q9aShkKTt2YXIgQSxJLE4sWSxXLEosZHQ9MCxmdD1hLmxlbmd0aCxzdD1mdC0xLHl0PWRbMF0sT3Q9VCh5dCk7aWYoT3R8fGZ0PjEmJnR5cGVvZiB5dD09InN0cmluZyImJiF5LmNoZWNrQ2xvbmUmJnNvLnRlc3QoeXQpKXJldHVybiBhLmVhY2goZnVuY3Rpb24oWHQpe3ZhciBWdD1hLmVxKFh0KTtPdCYmKGRbMF09eXQuY2FsbCh0aGlzLFh0LFZ0Lmh0bWwoKSkpLERuKFZ0LGQsdix4KX0pO2lmKGZ0JiYoQT1hYShkLGFbMF0ub3duZXJEb2N1bWVudCwhMSxhLHgpLEk9QS5maXJzdENoaWxkLEEuY2hpbGROb2Rlcy5sZW5ndGg9PT0xJiYoQT1JKSxJfHx4KSl7Zm9yKE49Zi5tYXAoeWUoQSwic2NyaXB0IiksbG8pLFk9Ti5sZW5ndGg7ZHQ8ZnQ7ZHQrKylXPUEsZHQhPT1zdCYmKFc9Zi5jbG9uZShXLCEwLCEwKSxZJiZmLm1lcmdlKE4seWUoVywic2NyaXB0IikpKSx2LmNhbGwoYVtkdF0sVyxkdCk7aWYoWSlmb3IoSj1OW04ubGVuZ3RoLTFdLm93bmVyRG9jdW1lbnQsZi5tYXAoTix1byksZHQ9MDtkdDxZO2R0KyspVz1OW2R0XSxpYS50ZXN0KFcudHlwZXx8IiIpJiYhbXQuYWNjZXNzKFcsImdsb2JhbEV2YWwiKSYmZi5jb250YWlucyhKLFcpJiYoVy5zcmMmJihXLnR5cGV8fCIiKS50b0xvd2VyQ2FzZSgpIT09Im1vZHVsZSI/Zi5fZXZhbFVybCYmIVcubm9Nb2R1bGUmJmYuX2V2YWxVcmwoVy5zcmMse25vbmNlOlcubm9uY2V8fFcuZ2V0QXR0cmlidXRlKCJub25jZSIpfSxKKTpoKFcudGV4dENvbnRlbnQucmVwbGFjZShvbywiIiksVyxKKSl9cmV0dXJuIGF9ZnVuY3Rpb24gZGEoYSxkLHYpe2Zvcih2YXIgeCxBPWQ/Zi5maWx0ZXIoZCxhKTphLEk9MDsoeD1BW0ldKSE9bnVsbDtJKyspIXYmJngubm9kZVR5cGU9PT0xJiZmLmNsZWFuRGF0YSh5ZSh4KSkseC5wYXJlbnROb2RlJiYodiYmZmUoeCkmJlhyKHllKHgsInNjcmlwdCIpKSx4LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoeCkpO3JldHVybiBhfWYuZXh0ZW5kKHtodG1sUHJlZmlsdGVyOmZ1bmN0aW9uKGEpe3JldHVybiBhfSxjbG9uZTpmdW5jdGlvbihhLGQsdil7dmFyIHgsQSxJLE4sWT1hLmNsb25lTm9kZSghMCksVz1mZShhKTtpZigheS5ub0Nsb25lQ2hlY2tlZCYmKGEubm9kZVR5cGU9PT0xfHxhLm5vZGVUeXBlPT09MTEpJiYhZi5pc1hNTERvYyhhKSlmb3IoTj15ZShZKSxJPXllKGEpLHg9MCxBPUkubGVuZ3RoO3g8QTt4KyspY28oSVt4XSxOW3hdKTtpZihkKWlmKHYpZm9yKEk9SXx8eWUoYSksTj1OfHx5ZShZKSx4PTAsQT1JLmxlbmd0aDt4PEE7eCsrKWxhKElbeF0sTlt4XSk7ZWxzZSBsYShhLFkpO3JldHVybiBOPXllKFksInNjcmlwdCIpLE4ubGVuZ3RoPjAmJlhyKE4sIVcmJnllKGEsInNjcmlwdCIpKSxZfSxjbGVhbkRhdGE6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkLHYseCxBPWYuZXZlbnQuc3BlY2lhbCxJPTA7KHY9YVtJXSkhPT12b2lkIDA7SSsrKWlmKEN0KHYpKXtpZihkPXZbbXQuZXhwYW5kb10pe2lmKGQuZXZlbnRzKWZvcih4IGluIGQuZXZlbnRzKUFbeF0/Zi5ldmVudC5yZW1vdmUodix4KTpmLnJlbW92ZUV2ZW50KHYseCxkLmhhbmRsZSk7dlttdC5leHBhbmRvXT12b2lkIDB9dlt6dC5leHBhbmRvXSYmKHZbenQuZXhwYW5kb109dm9pZCAwKX19fSksZi5mbi5leHRlbmQoe2RldGFjaDpmdW5jdGlvbihhKXtyZXR1cm4gZGEodGhpcyxhLCEwKX0scmVtb3ZlOmZ1bmN0aW9uKGEpe3JldHVybiBkYSh0aGlzLGEpfSx0ZXh0OmZ1bmN0aW9uKGEpe3JldHVybiBLKHRoaXMsZnVuY3Rpb24oZCl7cmV0dXJuIGQ9PT12b2lkIDA/Zi50ZXh0KHRoaXMpOnRoaXMuZW1wdHkoKS5lYWNoKGZ1bmN0aW9uKCl7KHRoaXMubm9kZVR5cGU9PT0xfHx0aGlzLm5vZGVUeXBlPT09MTF8fHRoaXMubm9kZVR5cGU9PT05KSYmKHRoaXMudGV4dENvbnRlbnQ9ZCl9KX0sbnVsbCxhLGFyZ3VtZW50cy5sZW5ndGgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gRG4odGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oYSl7aWYodGhpcy5ub2RlVHlwZT09PTF8fHRoaXMubm9kZVR5cGU9PT0xMXx8dGhpcy5ub2RlVHlwZT09PTkpe3ZhciBkPW9hKHRoaXMsYSk7ZC5hcHBlbmRDaGlsZChhKX19KX0scHJlcGVuZDpmdW5jdGlvbigpe3JldHVybiBEbih0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihhKXtpZih0aGlzLm5vZGVUeXBlPT09MXx8dGhpcy5ub2RlVHlwZT09PTExfHx0aGlzLm5vZGVUeXBlPT09OSl7dmFyIGQ9b2EodGhpcyxhKTtkLmluc2VydEJlZm9yZShhLGQuZmlyc3RDaGlsZCl9fSl9LGJlZm9yZTpmdW5jdGlvbigpe3JldHVybiBEbih0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihhKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSx0aGlzKX0pfSxhZnRlcjpmdW5jdGlvbigpe3JldHVybiBEbih0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihhKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSx0aGlzLm5leHRTaWJsaW5nKX0pfSxlbXB0eTpmdW5jdGlvbigpe2Zvcih2YXIgYSxkPTA7KGE9dGhpc1tkXSkhPW51bGw7ZCsrKWEubm9kZVR5cGU9PT0xJiYoZi5jbGVhbkRhdGEoeWUoYSwhMSkpLGEudGV4dENvbnRlbnQ9IiIpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbihhLGQpe3JldHVybiBhPWE/PyExLGQ9ZD8/YSx0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiBmLmNsb25lKHRoaXMsYSxkKX0pfSxodG1sOmZ1bmN0aW9uKGEpe3JldHVybiBLKHRoaXMsZnVuY3Rpb24oZCl7dmFyIHY9dGhpc1swXXx8e30seD0wLEE9dGhpcy5sZW5ndGg7aWYoZD09PXZvaWQgMCYmdi5ub2RlVHlwZT09PTEpcmV0dXJuIHYuaW5uZXJIVE1MO2lmKHR5cGVvZiBkPT0ic3RyaW5nIiYmIWFvLnRlc3QoZCkmJiFJZVsocmEuZXhlYyhkKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKV0pe2Q9Zi5odG1sUHJlZmlsdGVyKGQpO3RyeXtmb3IoO3g8QTt4Kyspdj10aGlzW3hdfHx7fSx2Lm5vZGVUeXBlPT09MSYmKGYuY2xlYW5EYXRhKHllKHYsITEpKSx2LmlubmVySFRNTD1kKTt2PTB9Y2F0Y2h7fX12JiZ0aGlzLmVtcHR5KCkuYXBwZW5kKGQpfSxudWxsLGEsYXJndW1lbnRzLmxlbmd0aCl9LHJlcGxhY2VXaXRoOmZ1bmN0aW9uKCl7dmFyIGE9W107cmV0dXJuIERuKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGQpe3ZhciB2PXRoaXMucGFyZW50Tm9kZTtmLmluQXJyYXkodGhpcyxhKTwwJiYoZi5jbGVhbkRhdGEoeWUodGhpcykpLHYmJnYucmVwbGFjZUNoaWxkKGQsdGhpcykpfSxhKX19KSxmLmVhY2goe2FwcGVuZFRvOiJhcHBlbmQiLHByZXBlbmRUbzoicHJlcGVuZCIsaW5zZXJ0QmVmb3JlOiJiZWZvcmUiLGluc2VydEFmdGVyOiJhZnRlciIscmVwbGFjZUFsbDoicmVwbGFjZVdpdGgifSxmdW5jdGlvbihhLGQpe2YuZm5bYV09ZnVuY3Rpb24odil7Zm9yKHZhciB4LEE9W10sST1mKHYpLE49SS5sZW5ndGgtMSxZPTA7WTw9TjtZKyspeD1ZPT09Tj90aGlzOnRoaXMuY2xvbmUoITApLGYoSVtZXSlbZF0oeCksby5hcHBseShBLHguZ2V0KCkpO3JldHVybiB0aGlzLnB1c2hTdGFjayhBKX19KTt2YXIgJHI9bmV3IFJlZ0V4cCgiXigiK3RuKyIpKD8hcHgpW2EteiVdKyQiLCJpIiksWnI9L14tLS8scHI9ZnVuY3Rpb24oYSl7dmFyIGQ9YS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O3JldHVybighZHx8IWQub3BlbmVyKSYmKGQ9dCksZC5nZXRDb21wdXRlZFN0eWxlKGEpfSx1YT1mdW5jdGlvbihhLGQsdil7dmFyIHgsQSxJPXt9O2ZvcihBIGluIGQpSVtBXT1hLnN0eWxlW0FdLGEuc3R5bGVbQV09ZFtBXTt4PXYuY2FsbChhKTtmb3IoQSBpbiBkKWEuc3R5bGVbQV09SVtBXTtyZXR1cm4geH0sZm89bmV3IFJlZ0V4cChnZS5qb2luKCJ8IiksImkiKTsoZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7aWYoSil7Vy5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0Oi0xMTExMXB4O3dpZHRoOjYwcHg7bWFyZ2luLXRvcDoxcHg7cGFkZGluZzowO2JvcmRlcjowIixKLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94O292ZXJmbG93OnNjcm9sbDttYXJnaW46YXV0bztib3JkZXI6MXB4O3BhZGRpbmc6MXB4O3dpZHRoOjYwJTt0b3A6MSUiLHplLmFwcGVuZENoaWxkKFcpLmFwcGVuZENoaWxkKEopO3ZhciBkdD10LmdldENvbXB1dGVkU3R5bGUoSik7dj1kdC50b3AhPT0iMSUiLFk9ZChkdC5tYXJnaW5MZWZ0KT09PTEyLEouc3R5bGUucmlnaHQ9IjYwJSIsST1kKGR0LnJpZ2h0KT09PTM2LHg9ZChkdC53aWR0aCk9PT0zNixKLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsQT1kKEoub2Zmc2V0V2lkdGgvMyk9PT0xMix6ZS5yZW1vdmVDaGlsZChXKSxKPW51bGx9fWZ1bmN0aW9uIGQoZHQpe3JldHVybiBNYXRoLnJvdW5kKHBhcnNlRmxvYXQoZHQpKX12YXIgdix4LEEsSSxOLFksVz1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLEo9Yy5jcmVhdGVFbGVtZW50KCJkaXYiKTtKLnN0eWxlJiYoSi5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iY29udGVudC1ib3giLEouY2xvbmVOb2RlKCEwKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iIix5LmNsZWFyQ2xvbmVTdHlsZT1KLnN0eWxlLmJhY2tncm91bmRDbGlwPT09ImNvbnRlbnQtYm94IixmLmV4dGVuZCh5LHtib3hTaXppbmdSZWxpYWJsZTpmdW5jdGlvbigpe3JldHVybiBhKCkseH0scGl4ZWxCb3hTdHlsZXM6ZnVuY3Rpb24oKXtyZXR1cm4gYSgpLEl9LHBpeGVsUG9zaXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gYSgpLHZ9LHJlbGlhYmxlTWFyZ2luTGVmdDpmdW5jdGlvbigpe3JldHVybiBhKCksWX0sc2Nyb2xsYm94U2l6ZTpmdW5jdGlvbigpe3JldHVybiBhKCksQX0scmVsaWFibGVUckRpbWVuc2lvbnM6ZnVuY3Rpb24oKXt2YXIgZHQsZnQsc3QseXQ7cmV0dXJuIE49PW51bGwmJihkdD1jLmNyZWF0ZUVsZW1lbnQoInRhYmxlIiksZnQ9Yy5jcmVhdGVFbGVtZW50KCJ0ciIpLHN0PWMuY3JlYXRlRWxlbWVudCgiZGl2IiksZHQuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7bGVmdDotMTExMTFweDtib3JkZXItY29sbGFwc2U6c2VwYXJhdGUiLGZ0LnN0eWxlLmNzc1RleHQ9ImJveC1zaXppbmc6Y29udGVudC1ib3g7Ym9yZGVyOjFweCBzb2xpZCIsZnQuc3R5bGUuaGVpZ2h0PSIxcHgiLHN0LnN0eWxlLmhlaWdodD0iOXB4IixzdC5zdHlsZS5kaXNwbGF5PSJibG9jayIsemUuYXBwZW5kQ2hpbGQoZHQpLmFwcGVuZENoaWxkKGZ0KS5hcHBlbmRDaGlsZChzdCkseXQ9dC5nZXRDb21wdXRlZFN0eWxlKGZ0KSxOPXBhcnNlSW50KHl0LmhlaWdodCwxMCkrcGFyc2VJbnQoeXQuYm9yZGVyVG9wV2lkdGgsMTApK3BhcnNlSW50KHl0LmJvcmRlckJvdHRvbVdpZHRoLDEwKT09PWZ0Lm9mZnNldEhlaWdodCx6ZS5yZW1vdmVDaGlsZChkdCkpLE59fSkpfSkoKTtmdW5jdGlvbiBVbihhLGQsdil7dmFyIHgsQSxJLE4sWT1aci50ZXN0KGQpLFc9YS5zdHlsZTtyZXR1cm4gdj12fHxwcihhKSx2JiYoTj12LmdldFByb3BlcnR5VmFsdWUoZCl8fHZbZF0sWSYmTiYmKE49Ti5yZXBsYWNlKGssIiQxIil8fHZvaWQgMCksTj09PSIiJiYhZmUoYSkmJihOPWYuc3R5bGUoYSxkKSksIXkucGl4ZWxCb3hTdHlsZXMoKSYmJHIudGVzdChOKSYmZm8udGVzdChkKSYmKHg9Vy53aWR0aCxBPVcubWluV2lkdGgsST1XLm1heFdpZHRoLFcubWluV2lkdGg9Vy5tYXhXaWR0aD1XLndpZHRoPU4sTj12LndpZHRoLFcud2lkdGg9eCxXLm1pbldpZHRoPUEsVy5tYXhXaWR0aD1JKSksTiE9PXZvaWQgMD9OKyIiOk59ZnVuY3Rpb24gY2EoYSxkKXtyZXR1cm57Z2V0OmZ1bmN0aW9uKCl7aWYoYSgpKXtkZWxldGUgdGhpcy5nZXQ7cmV0dXJufXJldHVybih0aGlzLmdldD1kKS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fX12YXIgZmE9WyJXZWJraXQiLCJNb3oiLCJtcyJdLGhhPWMuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGUscGE9e307ZnVuY3Rpb24gaG8oYSl7Zm9yKHZhciBkPWFbMF0udG9VcHBlckNhc2UoKSthLnNsaWNlKDEpLHY9ZmEubGVuZ3RoO3YtLTspaWYoYT1mYVt2XStkLGEgaW4gaGEpcmV0dXJuIGF9ZnVuY3Rpb24gS3IoYSl7dmFyIGQ9Zi5jc3NQcm9wc1thXXx8cGFbYV07cmV0dXJuIGR8fChhIGluIGhhP2E6cGFbYV09aG8oYSl8fGEpfXZhciBwbz0vXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sYm89e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LGJhPXtsZXR0ZXJTcGFjaW5nOiIwIixmb250V2VpZ2h0OiI0MDAifTtmdW5jdGlvbiBtYShhLGQsdil7dmFyIHg9ZWUuZXhlYyhkKTtyZXR1cm4geD9NYXRoLm1heCgwLHhbMl0tKHZ8fDApKSsoeFszXXx8InB4Iik6ZH1mdW5jdGlvbiBKcihhLGQsdix4LEEsSSl7dmFyIE49ZD09PSJ3aWR0aCI/MTowLFk9MCxXPTAsSj0wO2lmKHY9PT0oeD8iYm9yZGVyIjoiY29udGVudCIpKXJldHVybiAwO2Zvcig7Tjw0O04rPTIpdj09PSJtYXJnaW4iJiYoSis9Zi5jc3MoYSx2K2dlW05dLCEwLEEpKSx4Pyh2PT09ImNvbnRlbnQiJiYoVy09Zi5jc3MoYSwicGFkZGluZyIrZ2VbTl0sITAsQSkpLHYhPT0ibWFyZ2luIiYmKFctPWYuY3NzKGEsImJvcmRlciIrZ2VbTl0rIldpZHRoIiwhMCxBKSkpOihXKz1mLmNzcyhhLCJwYWRkaW5nIitnZVtOXSwhMCxBKSx2IT09InBhZGRpbmciP1crPWYuY3NzKGEsImJvcmRlciIrZ2VbTl0rIldpZHRoIiwhMCxBKTpZKz1mLmNzcyhhLCJib3JkZXIiK2dlW05dKyJXaWR0aCIsITAsQSkpO3JldHVybiF4JiZJPj0wJiYoVys9TWF0aC5tYXgoMCxNYXRoLmNlaWwoYVsib2Zmc2V0IitkWzBdLnRvVXBwZXJDYXNlKCkrZC5zbGljZSgxKV0tSS1XLVktLjUpKXx8MCksVytKfWZ1bmN0aW9uIHZhKGEsZCx2KXt2YXIgeD1wcihhKSxBPSF5LmJveFNpemluZ1JlbGlhYmxlKCl8fHYsST1BJiZmLmNzcyhhLCJib3hTaXppbmciLCExLHgpPT09ImJvcmRlci1ib3giLE49SSxZPVVuKGEsZCx4KSxXPSJvZmZzZXQiK2RbMF0udG9VcHBlckNhc2UoKStkLnNsaWNlKDEpO2lmKCRyLnRlc3QoWSkpe2lmKCF2KXJldHVybiBZO1k9ImF1dG8ifXJldHVybigheS5ib3hTaXppbmdSZWxpYWJsZSgpJiZJfHwheS5yZWxpYWJsZVRyRGltZW5zaW9ucygpJiZYKGEsInRyIil8fFk9PT0iYXV0byJ8fCFwYXJzZUZsb2F0KFkpJiZmLmNzcyhhLCJkaXNwbGF5IiwhMSx4KT09PSJpbmxpbmUiKSYmYS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCYmKEk9Zi5jc3MoYSwiYm94U2l6aW5nIiwhMSx4KT09PSJib3JkZXItYm94IixOPVcgaW4gYSxOJiYoWT1hW1ddKSksWT1wYXJzZUZsb2F0KFkpfHwwLFkrSnIoYSxkLHZ8fChJPyJib3JkZXIiOiJjb250ZW50IiksTix4LFkpKyJweCJ9Zi5leHRlbmQoe2Nzc0hvb2tzOntvcGFjaXR5OntnZXQ6ZnVuY3Rpb24oYSxkKXtpZihkKXt2YXIgdj1VbihhLCJvcGFjaXR5Iik7cmV0dXJuIHY9PT0iIj8iMSI6dn19fX0sY3NzTnVtYmVyOnthbmltYXRpb25JdGVyYXRpb25Db3VudDohMCxhc3BlY3RSYXRpbzohMCxib3JkZXJJbWFnZVNsaWNlOiEwLGNvbHVtbkNvdW50OiEwLGZsZXhHcm93OiEwLGZsZXhTaHJpbms6ITAsZm9udFdlaWdodDohMCxncmlkQXJlYTohMCxncmlkQ29sdW1uOiEwLGdyaWRDb2x1bW5FbmQ6ITAsZ3JpZENvbHVtblN0YXJ0OiEwLGdyaWRSb3c6ITAsZ3JpZFJvd0VuZDohMCxncmlkUm93U3RhcnQ6ITAsbGluZUhlaWdodDohMCxvcGFjaXR5OiEwLG9yZGVyOiEwLG9ycGhhbnM6ITAsc2NhbGU6ITAsd2lkb3dzOiEwLHpJbmRleDohMCx6b29tOiEwLGZpbGxPcGFjaXR5OiEwLGZsb29kT3BhY2l0eTohMCxzdG9wT3BhY2l0eTohMCxzdHJva2VNaXRlcmxpbWl0OiEwLHN0cm9rZU9wYWNpdHk6ITB9LGNzc1Byb3BzOnt9LHN0eWxlOmZ1bmN0aW9uKGEsZCx2LHgpe2lmKCEoIWF8fGEubm9kZVR5cGU9PT0zfHxhLm5vZGVUeXBlPT09OHx8IWEuc3R5bGUpKXt2YXIgQSxJLE4sWT1ndChkKSxXPVpyLnRlc3QoZCksSj1hLnN0eWxlO2lmKFd8fChkPUtyKFkpKSxOPWYuY3NzSG9va3NbZF18fGYuY3NzSG9va3NbWV0sdiE9PXZvaWQgMCl7aWYoST10eXBlb2YgdixJPT09InN0cmluZyImJihBPWVlLmV4ZWModikpJiZBWzFdJiYodj11cihhLGQsQSksST0ibnVtYmVyIiksdj09bnVsbHx8diE9PXYpcmV0dXJuO0k9PT0ibnVtYmVyIiYmIVcmJih2Kz1BJiZBWzNdfHwoZi5jc3NOdW1iZXJbWV0/IiI6InB4IikpLCF5LmNsZWFyQ2xvbmVTdHlsZSYmdj09PSIiJiZkLmluZGV4T2YoImJhY2tncm91bmQiKT09PTAmJihKW2RdPSJpbmhlcml0IiksKCFOfHwhKCJzZXQiaW4gTil8fCh2PU4uc2V0KGEsdix4KSkhPT12b2lkIDApJiYoVz9KLnNldFByb3BlcnR5KGQsdik6SltkXT12KX1lbHNlIHJldHVybiBOJiYiZ2V0ImluIE4mJihBPU4uZ2V0KGEsITEseCkpIT09dm9pZCAwP0E6SltkXX19LGNzczpmdW5jdGlvbihhLGQsdix4KXt2YXIgQSxJLE4sWT1ndChkKSxXPVpyLnRlc3QoZCk7cmV0dXJuIFd8fChkPUtyKFkpKSxOPWYuY3NzSG9va3NbZF18fGYuY3NzSG9va3NbWV0sTiYmImdldCJpbiBOJiYoQT1OLmdldChhLCEwLHYpKSxBPT09dm9pZCAwJiYoQT1VbihhLGQseCkpLEE9PT0ibm9ybWFsIiYmZCBpbiBiYSYmKEE9YmFbZF0pLHY9PT0iInx8dj8oST1wYXJzZUZsb2F0KEEpLHY9PT0hMHx8aXNGaW5pdGUoSSk/SXx8MDpBKTpBfX0pLGYuZWFjaChbImhlaWdodCIsIndpZHRoIl0sZnVuY3Rpb24oYSxkKXtmLmNzc0hvb2tzW2RdPXtnZXQ6ZnVuY3Rpb24odix4LEEpe2lmKHgpcmV0dXJuIHBvLnRlc3QoZi5jc3ModiwiZGlzcGxheSIpKSYmKCF2LmdldENsaWVudFJlY3RzKCkubGVuZ3RofHwhdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCk/dWEodixibyxmdW5jdGlvbigpe3JldHVybiB2YSh2LGQsQSl9KTp2YSh2LGQsQSl9LHNldDpmdW5jdGlvbih2LHgsQSl7dmFyIEksTj1wcih2KSxZPSF5LnNjcm9sbGJveFNpemUoKSYmTi5wb3NpdGlvbj09PSJhYnNvbHV0ZSIsVz1ZfHxBLEo9VyYmZi5jc3ModiwiYm94U2l6aW5nIiwhMSxOKT09PSJib3JkZXItYm94IixkdD1BP0pyKHYsZCxBLEosTik6MDtyZXR1cm4gSiYmWSYmKGR0LT1NYXRoLmNlaWwodlsib2Zmc2V0IitkWzBdLnRvVXBwZXJDYXNlKCkrZC5zbGljZSgxKV0tcGFyc2VGbG9hdChOW2RdKS1Kcih2LGQsImJvcmRlciIsITEsTiktLjUpKSxkdCYmKEk9ZWUuZXhlYyh4KSkmJihJWzNdfHwicHgiKSE9PSJweCImJih2LnN0eWxlW2RdPXgseD1mLmNzcyh2LGQpKSxtYSh2LHgsZHQpfX19KSxmLmNzc0hvb2tzLm1hcmdpbkxlZnQ9Y2EoeS5yZWxpYWJsZU1hcmdpbkxlZnQsZnVuY3Rpb24oYSxkKXtpZihkKXJldHVybihwYXJzZUZsb2F0KFVuKGEsIm1hcmdpbkxlZnQiKSl8fGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdC11YShhLHttYXJnaW5MZWZ0OjB9LGZ1bmN0aW9uKCl7cmV0dXJuIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdH0pKSsicHgifSksZi5lYWNoKHttYXJnaW46IiIscGFkZGluZzoiIixib3JkZXI6IldpZHRoIn0sZnVuY3Rpb24oYSxkKXtmLmNzc0hvb2tzW2ErZF09e2V4cGFuZDpmdW5jdGlvbih2KXtmb3IodmFyIHg9MCxBPXt9LEk9dHlwZW9mIHY9PSJzdHJpbmciP3Yuc3BsaXQoIiAiKTpbdl07eDw0O3grKylBW2ErZ2VbeF0rZF09SVt4XXx8SVt4LTJdfHxJWzBdO3JldHVybiBBfX0sYSE9PSJtYXJnaW4iJiYoZi5jc3NIb29rc1thK2RdLnNldD1tYSl9KSxmLmZuLmV4dGVuZCh7Y3NzOmZ1bmN0aW9uKGEsZCl7cmV0dXJuIEsodGhpcyxmdW5jdGlvbih2LHgsQSl7dmFyIEksTixZPXt9LFc9MDtpZihBcnJheS5pc0FycmF5KHgpKXtmb3IoST1wcih2KSxOPXgubGVuZ3RoO1c8TjtXKyspWVt4W1ddXT1mLmNzcyh2LHhbV10sITEsSSk7cmV0dXJuIFl9cmV0dXJuIEEhPT12b2lkIDA/Zi5zdHlsZSh2LHgsQSk6Zi5jc3Modix4KX0sYSxkLGFyZ3VtZW50cy5sZW5ndGg+MSl9fSk7ZnVuY3Rpb24gd2UoYSxkLHYseCxBKXtyZXR1cm4gbmV3IHdlLnByb3RvdHlwZS5pbml0KGEsZCx2LHgsQSl9Zi5Ud2Vlbj13ZSx3ZS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOndlLGluaXQ6ZnVuY3Rpb24oYSxkLHYseCxBLEkpe3RoaXMuZWxlbT1hLHRoaXMucHJvcD12LHRoaXMuZWFzaW5nPUF8fGYuZWFzaW5nLl9kZWZhdWx0LHRoaXMub3B0aW9ucz1kLHRoaXMuc3RhcnQ9dGhpcy5ub3c9dGhpcy5jdXIoKSx0aGlzLmVuZD14LHRoaXMudW5pdD1JfHwoZi5jc3NOdW1iZXJbdl0/IiI6InB4Iil9LGN1cjpmdW5jdGlvbigpe3ZhciBhPXdlLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiBhJiZhLmdldD9hLmdldCh0aGlzKTp3ZS5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KHRoaXMpfSxydW46ZnVuY3Rpb24oYSl7dmFyIGQsdj13ZS5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gdGhpcy5vcHRpb25zLmR1cmF0aW9uP3RoaXMucG9zPWQ9Zi5lYXNpbmdbdGhpcy5lYXNpbmddKGEsdGhpcy5vcHRpb25zLmR1cmF0aW9uKmEsMCwxLHRoaXMub3B0aW9ucy5kdXJhdGlvbik6dGhpcy5wb3M9ZD1hLHRoaXMubm93PSh0aGlzLmVuZC10aGlzLnN0YXJ0KSpkK3RoaXMuc3RhcnQsdGhpcy5vcHRpb25zLnN0ZXAmJnRoaXMub3B0aW9ucy5zdGVwLmNhbGwodGhpcy5lbGVtLHRoaXMubm93LHRoaXMpLHYmJnYuc2V0P3Yuc2V0KHRoaXMpOndlLnByb3BIb29rcy5fZGVmYXVsdC5zZXQodGhpcyksdGhpc319LHdlLnByb3RvdHlwZS5pbml0LnByb3RvdHlwZT13ZS5wcm90b3R5cGUsd2UucHJvcEhvb2tzPXtfZGVmYXVsdDp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBkO3JldHVybiBhLmVsZW0ubm9kZVR5cGUhPT0xfHxhLmVsZW1bYS5wcm9wXSE9bnVsbCYmYS5lbGVtLnN0eWxlW2EucHJvcF09PW51bGw/YS5lbGVtW2EucHJvcF06KGQ9Zi5jc3MoYS5lbGVtLGEucHJvcCwiIiksIWR8fGQ9PT0iYXV0byI/MDpkKX0sc2V0OmZ1bmN0aW9uKGEpe2YuZnguc3RlcFthLnByb3BdP2YuZnguc3RlcFthLnByb3BdKGEpOmEuZWxlbS5ub2RlVHlwZT09PTEmJihmLmNzc0hvb2tzW2EucHJvcF18fGEuZWxlbS5zdHlsZVtLcihhLnByb3ApXSE9bnVsbCk/Zi5zdHlsZShhLmVsZW0sYS5wcm9wLGEubm93K2EudW5pdCk6YS5lbGVtW2EucHJvcF09YS5ub3d9fX0sd2UucHJvcEhvb2tzLnNjcm9sbFRvcD13ZS5wcm9wSG9va3Muc2Nyb2xsTGVmdD17c2V0OmZ1bmN0aW9uKGEpe2EuZWxlbS5ub2RlVHlwZSYmYS5lbGVtLnBhcmVudE5vZGUmJihhLmVsZW1bYS5wcm9wXT1hLm5vdyl9fSxmLmVhc2luZz17bGluZWFyOmZ1bmN0aW9uKGEpe3JldHVybiBhfSxzd2luZzpmdW5jdGlvbihhKXtyZXR1cm4gLjUtTWF0aC5jb3MoYSpNYXRoLlBJKS8yfSxfZGVmYXVsdDoic3dpbmcifSxmLmZ4PXdlLnByb3RvdHlwZS5pbml0LGYuZnguc3RlcD17fTt2YXIgQW4sYnIsbW89L14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLHZvPS9xdWV1ZUhvb2tzJC87ZnVuY3Rpb24gUXIoKXticiYmKGMuaGlkZGVuPT09ITEmJnQucmVxdWVzdEFuaW1hdGlvbkZyYW1lP3QucmVxdWVzdEFuaW1hdGlvbkZyYW1lKFFyKTp0LnNldFRpbWVvdXQoUXIsZi5meC5pbnRlcnZhbCksZi5meC50aWNrKCkpfWZ1bmN0aW9uIGdhKCl7cmV0dXJuIHQuc2V0VGltZW91dChmdW5jdGlvbigpe0FuPXZvaWQgMH0pLEFuPURhdGUubm93KCl9ZnVuY3Rpb24gbXIoYSxkKXt2YXIgdix4PTAsQT17aGVpZ2h0OmF9O2ZvcihkPWQ/MTowO3g8NDt4Kz0yLWQpdj1nZVt4XSxBWyJtYXJnaW4iK3ZdPUFbInBhZGRpbmciK3ZdPWE7cmV0dXJuIGQmJihBLm9wYWNpdHk9QS53aWR0aD1hKSxBfWZ1bmN0aW9uIHlhKGEsZCx2KXtmb3IodmFyIHgsQT0oamUudHdlZW5lcnNbZF18fFtdKS5jb25jYXQoamUudHdlZW5lcnNbIioiXSksST0wLE49QS5sZW5ndGg7STxOO0krKylpZih4PUFbSV0uY2FsbCh2LGQsYSkpcmV0dXJuIHh9ZnVuY3Rpb24gZ28oYSxkLHYpe3ZhciB4LEEsSSxOLFksVyxKLGR0LGZ0PSJ3aWR0aCJpbiBkfHwiaGVpZ2h0ImluIGQsc3Q9dGhpcyx5dD17fSxPdD1hLnN0eWxlLFh0PWEubm9kZVR5cGUmJlRuKGEpLFZ0PW10LmdldChhLCJmeHNob3ciKTt2LnF1ZXVlfHwoTj1mLl9xdWV1ZUhvb2tzKGEsImZ4IiksTi51bnF1ZXVlZD09bnVsbCYmKE4udW5xdWV1ZWQ9MCxZPU4uZW1wdHkuZmlyZSxOLmVtcHR5LmZpcmU9ZnVuY3Rpb24oKXtOLnVucXVldWVkfHxZKCl9KSxOLnVucXVldWVkKyssc3QuYWx3YXlzKGZ1bmN0aW9uKCl7c3QuYWx3YXlzKGZ1bmN0aW9uKCl7Ti51bnF1ZXVlZC0tLGYucXVldWUoYSwiZngiKS5sZW5ndGh8fE4uZW1wdHkuZmlyZSgpfSl9KSk7Zm9yKHggaW4gZClpZihBPWRbeF0sbW8udGVzdChBKSl7aWYoZGVsZXRlIGRbeF0sST1JfHxBPT09InRvZ2dsZSIsQT09PShYdD8iaGlkZSI6InNob3ciKSlpZihBPT09InNob3ciJiZWdCYmVnRbeF0hPT12b2lkIDApWHQ9ITA7ZWxzZSBjb250aW51ZTt5dFt4XT1WdCYmVnRbeF18fGYuc3R5bGUoYSx4KX1pZihXPSFmLmlzRW1wdHlPYmplY3QoZCksISghVyYmZi5pc0VtcHR5T2JqZWN0KHl0KSkpe2Z0JiZhLm5vZGVUeXBlPT09MSYmKHYub3ZlcmZsb3c9W090Lm92ZXJmbG93LE90Lm92ZXJmbG93WCxPdC5vdmVyZmxvd1ldLEo9VnQmJlZ0LmRpc3BsYXksSj09bnVsbCYmKEo9bXQuZ2V0KGEsImRpc3BsYXkiKSksZHQ9Zi5jc3MoYSwiZGlzcGxheSIpLGR0PT09Im5vbmUiJiYoSj9kdD1KOihBZShbYV0sITApLEo9YS5zdHlsZS5kaXNwbGF5fHxKLGR0PWYuY3NzKGEsImRpc3BsYXkiKSxBZShbYV0pKSksKGR0PT09ImlubGluZSJ8fGR0PT09ImlubGluZS1ibG9jayImJkohPW51bGwpJiZmLmNzcyhhLCJmbG9hdCIpPT09Im5vbmUiJiYoV3x8KHN0LmRvbmUoZnVuY3Rpb24oKXtPdC5kaXNwbGF5PUp9KSxKPT1udWxsJiYoZHQ9T3QuZGlzcGxheSxKPWR0PT09Im5vbmUiPyIiOmR0KSksT3QuZGlzcGxheT0iaW5saW5lLWJsb2NrIikpLHYub3ZlcmZsb3cmJihPdC5vdmVyZmxvdz0iaGlkZGVuIixzdC5hbHdheXMoZnVuY3Rpb24oKXtPdC5vdmVyZmxvdz12Lm92ZXJmbG93WzBdLE90Lm92ZXJmbG93WD12Lm92ZXJmbG93WzFdLE90Lm92ZXJmbG93WT12Lm92ZXJmbG93WzJdfSkpLFc9ITE7Zm9yKHggaW4geXQpV3x8KFZ0PyJoaWRkZW4iaW4gVnQmJihYdD1WdC5oaWRkZW4pOlZ0PW10LmFjY2VzcyhhLCJmeHNob3ciLHtkaXNwbGF5Okp9KSxJJiYoVnQuaGlkZGVuPSFYdCksWHQmJkFlKFthXSwhMCksc3QuZG9uZShmdW5jdGlvbigpe1h0fHxBZShbYV0pLG10LnJlbW92ZShhLCJmeHNob3ciKTtmb3IoeCBpbiB5dClmLnN0eWxlKGEseCx5dFt4XSl9KSksVz15YShYdD9WdFt4XTowLHgsc3QpLHggaW4gVnR8fChWdFt4XT1XLnN0YXJ0LFh0JiYoVy5lbmQ9Vy5zdGFydCxXLnN0YXJ0PTApKX19ZnVuY3Rpb24geW8oYSxkKXt2YXIgdix4LEEsSSxOO2Zvcih2IGluIGEpaWYoeD1ndCh2KSxBPWRbeF0sST1hW3ZdLEFycmF5LmlzQXJyYXkoSSkmJihBPUlbMV0sST1hW3ZdPUlbMF0pLHYhPT14JiYoYVt4XT1JLGRlbGV0ZSBhW3ZdKSxOPWYuY3NzSG9va3NbeF0sTiYmImV4cGFuZCJpbiBOKXtJPU4uZXhwYW5kKEkpLGRlbGV0ZSBhW3hdO2Zvcih2IGluIEkpdiBpbiBhfHwoYVt2XT1JW3ZdLGRbdl09QSl9ZWxzZSBkW3hdPUF9ZnVuY3Rpb24gamUoYSxkLHYpe3ZhciB4LEEsST0wLE49amUucHJlZmlsdGVycy5sZW5ndGgsWT1mLkRlZmVycmVkKCkuYWx3YXlzKGZ1bmN0aW9uKCl7ZGVsZXRlIFcuZWxlbX0pLFc9ZnVuY3Rpb24oKXtpZihBKXJldHVybiExO2Zvcih2YXIgZnQ9QW58fGdhKCksc3Q9TWF0aC5tYXgoMCxKLnN0YXJ0VGltZStKLmR1cmF0aW9uLWZ0KSx5dD1zdC9KLmR1cmF0aW9ufHwwLE90PTEteXQsWHQ9MCxWdD1KLnR3ZWVucy5sZW5ndGg7WHQ8VnQ7WHQrKylKLnR3ZWVuc1tYdF0ucnVuKE90KTtyZXR1cm4gWS5ub3RpZnlXaXRoKGEsW0osT3Qsc3RdKSxPdDwxJiZWdD9zdDooVnR8fFkubm90aWZ5V2l0aChhLFtKLDEsMF0pLFkucmVzb2x2ZVdpdGgoYSxbSl0pLCExKX0sSj1ZLnByb21pc2Uoe2VsZW06YSxwcm9wczpmLmV4dGVuZCh7fSxkKSxvcHRzOmYuZXh0ZW5kKCEwLHtzcGVjaWFsRWFzaW5nOnt9LGVhc2luZzpmLmVhc2luZy5fZGVmYXVsdH0sdiksb3JpZ2luYWxQcm9wZXJ0aWVzOmQsb3JpZ2luYWxPcHRpb25zOnYsc3RhcnRUaW1lOkFufHxnYSgpLGR1cmF0aW9uOnYuZHVyYXRpb24sdHdlZW5zOltdLGNyZWF0ZVR3ZWVuOmZ1bmN0aW9uKGZ0LHN0KXt2YXIgeXQ9Zi5Ud2VlbihhLEoub3B0cyxmdCxzdCxKLm9wdHMuc3BlY2lhbEVhc2luZ1tmdF18fEoub3B0cy5lYXNpbmcpO3JldHVybiBKLnR3ZWVucy5wdXNoKHl0KSx5dH0sc3RvcDpmdW5jdGlvbihmdCl7dmFyIHN0PTAseXQ9ZnQ/Si50d2VlbnMubGVuZ3RoOjA7aWYoQSlyZXR1cm4gdGhpcztmb3IoQT0hMDtzdDx5dDtzdCsrKUoudHdlZW5zW3N0XS5ydW4oMSk7cmV0dXJuIGZ0PyhZLm5vdGlmeVdpdGgoYSxbSiwxLDBdKSxZLnJlc29sdmVXaXRoKGEsW0osZnRdKSk6WS5yZWplY3RXaXRoKGEsW0osZnRdKSx0aGlzfX0pLGR0PUoucHJvcHM7Zm9yKHlvKGR0LEoub3B0cy5zcGVjaWFsRWFzaW5nKTtJPE47SSsrKWlmKHg9amUucHJlZmlsdGVyc1tJXS5jYWxsKEosYSxkdCxKLm9wdHMpLHgpcmV0dXJuIFQoeC5zdG9wKSYmKGYuX3F1ZXVlSG9va3MoSi5lbGVtLEoub3B0cy5xdWV1ZSkuc3RvcD14LnN0b3AuYmluZCh4KSkseDtyZXR1cm4gZi5tYXAoZHQseWEsSiksVChKLm9wdHMuc3RhcnQpJiZKLm9wdHMuc3RhcnQuY2FsbChhLEopLEoucHJvZ3Jlc3MoSi5vcHRzLnByb2dyZXNzKS5kb25lKEoub3B0cy5kb25lLEoub3B0cy5jb21wbGV0ZSkuZmFpbChKLm9wdHMuZmFpbCkuYWx3YXlzKEoub3B0cy5hbHdheXMpLGYuZngudGltZXIoZi5leHRlbmQoVyx7ZWxlbTphLGFuaW06SixxdWV1ZTpKLm9wdHMucXVldWV9KSksSn1mLkFuaW1hdGlvbj1mLmV4dGVuZChqZSx7dHdlZW5lcnM6eyIqIjpbZnVuY3Rpb24oYSxkKXt2YXIgdj10aGlzLmNyZWF0ZVR3ZWVuKGEsZCk7cmV0dXJuIHVyKHYuZWxlbSxhLGVlLmV4ZWMoZCksdiksdn1dfSx0d2VlbmVyOmZ1bmN0aW9uKGEsZCl7VChhKT8oZD1hLGE9WyIqIl0pOmE9YS5tYXRjaChCdCk7Zm9yKHZhciB2LHg9MCxBPWEubGVuZ3RoO3g8QTt4Kyspdj1hW3hdLGplLnR3ZWVuZXJzW3ZdPWplLnR3ZWVuZXJzW3ZdfHxbXSxqZS50d2VlbmVyc1t2XS51bnNoaWZ0KGQpfSxwcmVmaWx0ZXJzOltnb10scHJlZmlsdGVyOmZ1bmN0aW9uKGEsZCl7ZD9qZS5wcmVmaWx0ZXJzLnVuc2hpZnQoYSk6amUucHJlZmlsdGVycy5wdXNoKGEpfX0pLGYuc3BlZWQ9ZnVuY3Rpb24oYSxkLHYpe3ZhciB4PWEmJnR5cGVvZiBhPT0ib2JqZWN0Ij9mLmV4dGVuZCh7fSxhKTp7Y29tcGxldGU6dnx8IXYmJmR8fFQoYSkmJmEsZHVyYXRpb246YSxlYXNpbmc6diYmZHx8ZCYmIVQoZCkmJmR9O3JldHVybiBmLmZ4Lm9mZj94LmR1cmF0aW9uPTA6dHlwZW9mIHguZHVyYXRpb24hPSJudW1iZXIiJiYoeC5kdXJhdGlvbiBpbiBmLmZ4LnNwZWVkcz94LmR1cmF0aW9uPWYuZnguc3BlZWRzW3guZHVyYXRpb25dOnguZHVyYXRpb249Zi5meC5zcGVlZHMuX2RlZmF1bHQpLCh4LnF1ZXVlPT1udWxsfHx4LnF1ZXVlPT09ITApJiYoeC5xdWV1ZT0iZngiKSx4Lm9sZD14LmNvbXBsZXRlLHguY29tcGxldGU9ZnVuY3Rpb24oKXtUKHgub2xkKSYmeC5vbGQuY2FsbCh0aGlzKSx4LnF1ZXVlJiZmLmRlcXVldWUodGhpcyx4LnF1ZXVlKX0seH0sZi5mbi5leHRlbmQoe2ZhZGVUbzpmdW5jdGlvbihhLGQsdix4KXtyZXR1cm4gdGhpcy5maWx0ZXIoVG4pLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6ZH0sYSx2LHgpfSxhbmltYXRlOmZ1bmN0aW9uKGEsZCx2LHgpe3ZhciBBPWYuaXNFbXB0eU9iamVjdChhKSxJPWYuc3BlZWQoZCx2LHgpLE49ZnVuY3Rpb24oKXt2YXIgWT1qZSh0aGlzLGYuZXh0ZW5kKHt9LGEpLEkpOyhBfHxtdC5nZXQodGhpcywiZmluaXNoIikpJiZZLnN0b3AoITApfTtyZXR1cm4gTi5maW5pc2g9TixBfHxJLnF1ZXVlPT09ITE/dGhpcy5lYWNoKE4pOnRoaXMucXVldWUoSS5xdWV1ZSxOKX0sc3RvcDpmdW5jdGlvbihhLGQsdil7dmFyIHg9ZnVuY3Rpb24oQSl7dmFyIEk9QS5zdG9wO2RlbGV0ZSBBLnN0b3AsSSh2KX07cmV0dXJuIHR5cGVvZiBhIT0ic3RyaW5nIiYmKHY9ZCxkPWEsYT12b2lkIDApLGQmJnRoaXMucXVldWUoYXx8ImZ4IixbXSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIEE9ITAsST1hIT1udWxsJiZhKyJxdWV1ZUhvb2tzIixOPWYudGltZXJzLFk9bXQuZ2V0KHRoaXMpO2lmKEkpWVtJXSYmWVtJXS5zdG9wJiZ4KFlbSV0pO2Vsc2UgZm9yKEkgaW4gWSlZW0ldJiZZW0ldLnN0b3AmJnZvLnRlc3QoSSkmJngoWVtJXSk7Zm9yKEk9Ti5sZW5ndGg7SS0tOylOW0ldLmVsZW09PT10aGlzJiYoYT09bnVsbHx8TltJXS5xdWV1ZT09PWEpJiYoTltJXS5hbmltLnN0b3AodiksQT0hMSxOLnNwbGljZShJLDEpKTsoQXx8IXYpJiZmLmRlcXVldWUodGhpcyxhKX0pfSxmaW5pc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEhPT0hMSYmKGE9YXx8ImZ4IiksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGQsdj1tdC5nZXQodGhpcykseD12W2ErInF1ZXVlIl0sQT12W2ErInF1ZXVlSG9va3MiXSxJPWYudGltZXJzLE49eD94Lmxlbmd0aDowO2Zvcih2LmZpbmlzaD0hMCxmLnF1ZXVlKHRoaXMsYSxbXSksQSYmQS5zdG9wJiZBLnN0b3AuY2FsbCh0aGlzLCEwKSxkPUkubGVuZ3RoO2QtLTspSVtkXS5lbGVtPT09dGhpcyYmSVtkXS5xdWV1ZT09PWEmJihJW2RdLmFuaW0uc3RvcCghMCksSS5zcGxpY2UoZCwxKSk7Zm9yKGQ9MDtkPE47ZCsrKXhbZF0mJnhbZF0uZmluaXNoJiZ4W2RdLmZpbmlzaC5jYWxsKHRoaXMpO2RlbGV0ZSB2LmZpbmlzaH0pfX0pLGYuZWFjaChbInRvZ2dsZSIsInNob3ciLCJoaWRlIl0sZnVuY3Rpb24oYSxkKXt2YXIgdj1mLmZuW2RdO2YuZm5bZF09ZnVuY3Rpb24oeCxBLEkpe3JldHVybiB4PT1udWxsfHx0eXBlb2YgeD09ImJvb2xlYW4iP3YuYXBwbHkodGhpcyxhcmd1bWVudHMpOnRoaXMuYW5pbWF0ZShtcihkLCEwKSx4LEEsSSl9fSksZi5lYWNoKHtzbGlkZURvd246bXIoInNob3ciKSxzbGlkZVVwOm1yKCJoaWRlIiksc2xpZGVUb2dnbGU6bXIoInRvZ2dsZSIpLGZhZGVJbjp7b3BhY2l0eToic2hvdyJ9LGZhZGVPdXQ6e29wYWNpdHk6ImhpZGUifSxmYWRlVG9nZ2xlOntvcGFjaXR5OiJ0b2dnbGUifX0sZnVuY3Rpb24oYSxkKXtmLmZuW2FdPWZ1bmN0aW9uKHYseCxBKXtyZXR1cm4gdGhpcy5hbmltYXRlKGQsdix4LEEpfX0pLGYudGltZXJzPVtdLGYuZngudGljaz1mdW5jdGlvbigpe3ZhciBhLGQ9MCx2PWYudGltZXJzO2ZvcihBbj1EYXRlLm5vdygpO2Q8di5sZW5ndGg7ZCsrKWE9dltkXSwhYSgpJiZ2W2RdPT09YSYmdi5zcGxpY2UoZC0tLDEpO3YubGVuZ3RofHxmLmZ4LnN0b3AoKSxBbj12b2lkIDB9LGYuZngudGltZXI9ZnVuY3Rpb24oYSl7Zi50aW1lcnMucHVzaChhKSxmLmZ4LnN0YXJ0KCl9LGYuZnguaW50ZXJ2YWw9MTMsZi5meC5zdGFydD1mdW5jdGlvbigpe2JyfHwoYnI9ITAsUXIoKSl9LGYuZnguc3RvcD1mdW5jdGlvbigpe2JyPW51bGx9LGYuZnguc3BlZWRzPXtzbG93OjYwMCxmYXN0OjIwMCxfZGVmYXVsdDo0MDB9LGYuZm4uZGVsYXk9ZnVuY3Rpb24oYSxkKXtyZXR1cm4gYT1mLmZ4JiZmLmZ4LnNwZWVkc1thXXx8YSxkPWR8fCJmeCIsdGhpcy5xdWV1ZShkLGZ1bmN0aW9uKHYseCl7dmFyIEE9dC5zZXRUaW1lb3V0KHYsYSk7eC5zdG9wPWZ1bmN0aW9uKCl7dC5jbGVhclRpbWVvdXQoQSl9fSl9LGZ1bmN0aW9uKCl7dmFyIGE9Yy5jcmVhdGVFbGVtZW50KCJpbnB1dCIpLGQ9Yy5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKSx2PWQuYXBwZW5kQ2hpbGQoYy5jcmVhdGVFbGVtZW50KCJvcHRpb24iKSk7YS50eXBlPSJjaGVja2JveCIseS5jaGVja09uPWEudmFsdWUhPT0iIix5Lm9wdFNlbGVjdGVkPXYuc2VsZWN0ZWQsYT1jLmNyZWF0ZUVsZW1lbnQoImlucHV0IiksYS52YWx1ZT0idCIsYS50eXBlPSJyYWRpbyIseS5yYWRpb1ZhbHVlPWEudmFsdWU9PT0idCJ9KCk7dmFyIHdhLFduPWYuZXhwci5hdHRySGFuZGxlO2YuZm4uZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGEsZCl7cmV0dXJuIEsodGhpcyxmLmF0dHIsYSxkLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YucmVtb3ZlQXR0cih0aGlzLGEpfSl9fSksZi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oYSxkLHYpe3ZhciB4LEEsST1hLm5vZGVUeXBlO2lmKCEoST09PTN8fEk9PT04fHxJPT09Mikpe2lmKHR5cGVvZiBhLmdldEF0dHJpYnV0ZT4idSIpcmV0dXJuIGYucHJvcChhLGQsdik7aWYoKEkhPT0xfHwhZi5pc1hNTERvYyhhKSkmJihBPWYuYXR0ckhvb2tzW2QudG9Mb3dlckNhc2UoKV18fChmLmV4cHIubWF0Y2guYm9vbC50ZXN0KGQpP3dhOnZvaWQgMCkpLHYhPT12b2lkIDApe2lmKHY9PT1udWxsKXtmLnJlbW92ZUF0dHIoYSxkKTtyZXR1cm59cmV0dXJuIEEmJiJzZXQiaW4gQSYmKHg9QS5zZXQoYSx2LGQpKSE9PXZvaWQgMD94OihhLnNldEF0dHJpYnV0ZShkLHYrIiIpLHYpfXJldHVybiBBJiYiZ2V0ImluIEEmJih4PUEuZ2V0KGEsZCkpIT09bnVsbD94Oih4PWYuZmluZC5hdHRyKGEsZCkseD8/dm9pZCAwKX19LGF0dHJIb29rczp7dHlwZTp7c2V0OmZ1bmN0aW9uKGEsZCl7aWYoIXkucmFkaW9WYWx1ZSYmZD09PSJyYWRpbyImJlgoYSwiaW5wdXQiKSl7dmFyIHY9YS52YWx1ZTtyZXR1cm4gYS5zZXRBdHRyaWJ1dGUoInR5cGUiLGQpLHYmJihhLnZhbHVlPXYpLGR9fX19LHJlbW92ZUF0dHI6ZnVuY3Rpb24oYSxkKXt2YXIgdix4PTAsQT1kJiZkLm1hdGNoKEJ0KTtpZihBJiZhLm5vZGVUeXBlPT09MSlmb3IoO3Y9QVt4KytdOylhLnJlbW92ZUF0dHJpYnV0ZSh2KX19KSx3YT17c2V0OmZ1bmN0aW9uKGEsZCx2KXtyZXR1cm4gZD09PSExP2YucmVtb3ZlQXR0cihhLHYpOmEuc2V0QXR0cmlidXRlKHYsdiksdn19LGYuZWFjaChmLmV4cHIubWF0Y2guYm9vbC5zb3VyY2UubWF0Y2goL1x3Ky9nKSxmdW5jdGlvbihhLGQpe3ZhciB2PVduW2RdfHxmLmZpbmQuYXR0cjtXbltkXT1mdW5jdGlvbih4LEEsSSl7dmFyIE4sWSxXPUEudG9Mb3dlckNhc2UoKTtyZXR1cm4gSXx8KFk9V25bV10sV25bV109TixOPXYoeCxBLEkpIT1udWxsP1c6bnVsbCxXbltXXT1ZKSxOfX0pO3ZhciB3bz0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLHhvPS9eKD86YXxhcmVhKSQvaTtmLmZuLmV4dGVuZCh7cHJvcDpmdW5jdGlvbihhLGQpe3JldHVybiBLKHRoaXMsZi5wcm9wLGEsZCxhcmd1bWVudHMubGVuZ3RoPjEpfSxyZW1vdmVQcm9wOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtkZWxldGUgdGhpc1tmLnByb3BGaXhbYV18fGFdfSl9fSksZi5leHRlbmQoe3Byb3A6ZnVuY3Rpb24oYSxkLHYpe3ZhciB4LEEsST1hLm5vZGVUeXBlO2lmKCEoST09PTN8fEk9PT04fHxJPT09MikpcmV0dXJuKEkhPT0xfHwhZi5pc1hNTERvYyhhKSkmJihkPWYucHJvcEZpeFtkXXx8ZCxBPWYucHJvcEhvb2tzW2RdKSx2IT09dm9pZCAwP0EmJiJzZXQiaW4gQSYmKHg9QS5zZXQoYSx2LGQpKSE9PXZvaWQgMD94OmFbZF09djpBJiYiZ2V0ImluIEEmJih4PUEuZ2V0KGEsZCkpIT09bnVsbD94OmFbZF19LHByb3BIb29rczp7dGFiSW5kZXg6e2dldDpmdW5jdGlvbihhKXt2YXIgZD1mLmZpbmQuYXR0cihhLCJ0YWJpbmRleCIpO3JldHVybiBkP3BhcnNlSW50KGQsMTApOndvLnRlc3QoYS5ub2RlTmFtZSl8fHhvLnRlc3QoYS5ub2RlTmFtZSkmJmEuaHJlZj8wOi0xfX19LHByb3BGaXg6e2ZvcjoiaHRtbEZvciIsY2xhc3M6ImNsYXNzTmFtZSJ9fSkseS5vcHRTZWxlY3RlZHx8KGYucHJvcEhvb2tzLnNlbGVjdGVkPXtnZXQ6ZnVuY3Rpb24oYSl7dmFyIGQ9YS5wYXJlbnROb2RlO3JldHVybiBkJiZkLnBhcmVudE5vZGUmJmQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4LG51bGx9LHNldDpmdW5jdGlvbihhKXt2YXIgZD1hLnBhcmVudE5vZGU7ZCYmKGQuc2VsZWN0ZWRJbmRleCxkLnBhcmVudE5vZGUmJmQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4KX19KSxmLmVhY2goWyJ0YWJJbmRleCIsInJlYWRPbmx5IiwibWF4TGVuZ3RoIiwiY2VsbFNwYWNpbmciLCJjZWxsUGFkZGluZyIsInJvd1NwYW4iLCJjb2xTcGFuIiwidXNlTWFwIiwiZnJhbWVCb3JkZXIiLCJjb250ZW50RWRpdGFibGUiXSxmdW5jdGlvbigpe2YucHJvcEZpeFt0aGlzLnRvTG93ZXJDYXNlKCldPXRoaXN9KTtmdW5jdGlvbiBobihhKXt2YXIgZD1hLm1hdGNoKEJ0KXx8W107cmV0dXJuIGQuam9pbigiICIpfWZ1bmN0aW9uIHBuKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSYmYS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIifWZ1bmN0aW9uIHRpKGEpe3JldHVybiBBcnJheS5pc0FycmF5KGEpP2E6dHlwZW9mIGE9PSJzdHJpbmciP2EubWF0Y2goQnQpfHxbXTpbXX1mLmZuLmV4dGVuZCh7YWRkQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGQsdix4LEEsSSxOO3JldHVybiBUKGEpP3RoaXMuZWFjaChmdW5jdGlvbihZKXtmKHRoaXMpLmFkZENsYXNzKGEuY2FsbCh0aGlzLFkscG4odGhpcykpKX0pOihkPXRpKGEpLGQubGVuZ3RoP3RoaXMuZWFjaChmdW5jdGlvbigpe2lmKHg9cG4odGhpcyksdj10aGlzLm5vZGVUeXBlPT09MSYmIiAiK2huKHgpKyIgIix2KXtmb3IoST0wO0k8ZC5sZW5ndGg7SSsrKUE9ZFtJXSx2LmluZGV4T2YoIiAiK0ErIiAiKTwwJiYodis9QSsiICIpO049aG4odikseCE9PU4mJnRoaXMuc2V0QXR0cmlidXRlKCJjbGFzcyIsTil9fSk6dGhpcyl9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGEpe3ZhciBkLHYseCxBLEksTjtyZXR1cm4gVChhKT90aGlzLmVhY2goZnVuY3Rpb24oWSl7Zih0aGlzKS5yZW1vdmVDbGFzcyhhLmNhbGwodGhpcyxZLHBuKHRoaXMpKSl9KTphcmd1bWVudHMubGVuZ3RoPyhkPXRpKGEpLGQubGVuZ3RoP3RoaXMuZWFjaChmdW5jdGlvbigpe2lmKHg9cG4odGhpcyksdj10aGlzLm5vZGVUeXBlPT09MSYmIiAiK2huKHgpKyIgIix2KXtmb3IoST0wO0k8ZC5sZW5ndGg7SSsrKWZvcihBPWRbSV07di5pbmRleE9mKCIgIitBKyIgIik+LTE7KXY9di5yZXBsYWNlKCIgIitBKyIgIiwiICIpO049aG4odikseCE9PU4mJnRoaXMuc2V0QXR0cmlidXRlKCJjbGFzcyIsTil9fSk6dGhpcyk6dGhpcy5hdHRyKCJjbGFzcyIsIiIpfSx0b2dnbGVDbGFzczpmdW5jdGlvbihhLGQpe3ZhciB2LHgsQSxJLE49dHlwZW9mIGEsWT1OPT09InN0cmluZyJ8fEFycmF5LmlzQXJyYXkoYSk7cmV0dXJuIFQoYSk/dGhpcy5lYWNoKGZ1bmN0aW9uKFcpe2YodGhpcykudG9nZ2xlQ2xhc3MoYS5jYWxsKHRoaXMsVyxwbih0aGlzKSxkKSxkKX0pOnR5cGVvZiBkPT0iYm9vbGVhbiImJlk/ZD90aGlzLmFkZENsYXNzKGEpOnRoaXMucmVtb3ZlQ2xhc3MoYSk6KHY9dGkoYSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7aWYoWSlmb3IoST1mKHRoaXMpLEE9MDtBPHYubGVuZ3RoO0ErKyl4PXZbQV0sSS5oYXNDbGFzcyh4KT9JLnJlbW92ZUNsYXNzKHgpOkkuYWRkQ2xhc3MoeCk7ZWxzZShhPT09dm9pZCAwfHxOPT09ImJvb2xlYW4iKSYmKHg9cG4odGhpcykseCYmbXQuc2V0KHRoaXMsIl9fY2xhc3NOYW1lX18iLHgpLHRoaXMuc2V0QXR0cmlidXRlJiZ0aGlzLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHh8fGE9PT0hMT8iIjptdC5nZXQodGhpcywiX19jbGFzc05hbWVfXyIpfHwiIikpfSkpfSxoYXNDbGFzczpmdW5jdGlvbihhKXt2YXIgZCx2LHg9MDtmb3IoZD0iICIrYSsiICI7dj10aGlzW3grK107KWlmKHYubm9kZVR5cGU9PT0xJiYoIiAiK2huKHBuKHYpKSsiICIpLmluZGV4T2YoZCk+LTEpcmV0dXJuITA7cmV0dXJuITF9fSk7dmFyIF9vPS9cci9nO2YuZm4uZXh0ZW5kKHt2YWw6ZnVuY3Rpb24oYSl7dmFyIGQsdix4LEE9dGhpc1swXTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeD1UKGEpLHRoaXMuZWFjaChmdW5jdGlvbihJKXt2YXIgTjt0aGlzLm5vZGVUeXBlPT09MSYmKHg/Tj1hLmNhbGwodGhpcyxJLGYodGhpcykudmFsKCkpOk49YSxOPT1udWxsP049IiI6dHlwZW9mIE49PSJudW1iZXIiP04rPSIiOkFycmF5LmlzQXJyYXkoTikmJihOPWYubWFwKE4sZnVuY3Rpb24oWSl7cmV0dXJuIFk9PW51bGw/IiI6WSsiIn0pKSxkPWYudmFsSG9va3NbdGhpcy50eXBlXXx8Zi52YWxIb29rc1t0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldLCghZHx8ISgic2V0ImluIGQpfHxkLnNldCh0aGlzLE4sInZhbHVlIik9PT12b2lkIDApJiYodGhpcy52YWx1ZT1OKSl9KSk6QT8oZD1mLnZhbEhvb2tzW0EudHlwZV18fGYudmFsSG9va3NbQS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSxkJiYiZ2V0ImluIGQmJih2PWQuZ2V0KEEsInZhbHVlIikpIT09dm9pZCAwP3Y6KHY9QS52YWx1ZSx0eXBlb2Ygdj09InN0cmluZyI/di5yZXBsYWNlKF9vLCIiKTp2Pz8iIikpOnZvaWQgMH19KSxmLmV4dGVuZCh7dmFsSG9va3M6e29wdGlvbjp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBkPWYuZmluZC5hdHRyKGEsInZhbHVlIik7cmV0dXJuIGQ/P2huKGYudGV4dChhKSl9fSxzZWxlY3Q6e2dldDpmdW5jdGlvbihhKXt2YXIgZCx2LHgsQT1hLm9wdGlvbnMsST1hLnNlbGVjdGVkSW5kZXgsTj1hLnR5cGU9PT0ic2VsZWN0LW9uZSIsWT1OP251bGw6W10sVz1OP0krMTpBLmxlbmd0aDtmb3IoSTwwP3g9Vzp4PU4/STowO3g8Vzt4KyspaWYodj1BW3hdLCh2LnNlbGVjdGVkfHx4PT09SSkmJiF2LmRpc2FibGVkJiYoIXYucGFyZW50Tm9kZS5kaXNhYmxlZHx8IVgodi5wYXJlbnROb2RlLCJvcHRncm91cCIpKSl7aWYoZD1mKHYpLnZhbCgpLE4pcmV0dXJuIGQ7WS5wdXNoKGQpfXJldHVybiBZfSxzZXQ6ZnVuY3Rpb24oYSxkKXtmb3IodmFyIHYseCxBPWEub3B0aW9ucyxJPWYubWFrZUFycmF5KGQpLE49QS5sZW5ndGg7Ti0tOyl4PUFbTl0sKHguc2VsZWN0ZWQ9Zi5pbkFycmF5KGYudmFsSG9va3Mub3B0aW9uLmdldCh4KSxJKT4tMSkmJih2PSEwKTtyZXR1cm4gdnx8KGEuc2VsZWN0ZWRJbmRleD0tMSksSX19fX0pLGYuZWFjaChbInJhZGlvIiwiY2hlY2tib3giXSxmdW5jdGlvbigpe2YudmFsSG9va3NbdGhpc109e3NldDpmdW5jdGlvbihhLGQpe2lmKEFycmF5LmlzQXJyYXkoZCkpcmV0dXJuIGEuY2hlY2tlZD1mLmluQXJyYXkoZihhKS52YWwoKSxkKT4tMX19LHkuY2hlY2tPbnx8KGYudmFsSG9va3NbdGhpc10uZ2V0PWZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgidmFsdWUiKT09PW51bGw/Im9uIjphLnZhbHVlfSl9KTt2YXIgR249dC5sb2NhdGlvbix4YT17Z3VpZDpEYXRlLm5vdygpfSxlaT0vXD8vO2YucGFyc2VYTUw9ZnVuY3Rpb24oYSl7dmFyIGQsdjtpZighYXx8dHlwZW9mIGEhPSJzdHJpbmciKXJldHVybiBudWxsO3RyeXtkPW5ldyB0LkRPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpfWNhdGNoe31yZXR1cm4gdj1kJiZkLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwYXJzZXJlcnJvciIpWzBdLCghZHx8dikmJmYuZXJyb3IoIkludmFsaWQgWE1MOiAiKyh2P2YubWFwKHYuY2hpbGROb2RlcyxmdW5jdGlvbih4KXtyZXR1cm4geC50ZXh0Q29udGVudH0pLmpvaW4oYApgKTphKSksZH07dmFyIF9hPS9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1cikkLyxDYT1mdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbigpfTtmLmV4dGVuZChmLmV2ZW50LHt0cmlnZ2VyOmZ1bmN0aW9uKGEsZCx2LHgpe3ZhciBBLEksTixZLFcsSixkdCxmdCxzdD1bdnx8Y10seXQ9Zy5jYWxsKGEsInR5cGUiKT9hLnR5cGU6YSxPdD1nLmNhbGwoYSwibmFtZXNwYWNlIik/YS5uYW1lc3BhY2Uuc3BsaXQoIi4iKTpbXTtpZihJPWZ0PU49dj12fHxjLCEodi5ub2RlVHlwZT09PTN8fHYubm9kZVR5cGU9PT04KSYmIV9hLnRlc3QoeXQrZi5ldmVudC50cmlnZ2VyZWQpJiYoeXQuaW5kZXhPZigiLiIpPi0xJiYoT3Q9eXQuc3BsaXQoIi4iKSx5dD1PdC5zaGlmdCgpLE90LnNvcnQoKSksVz15dC5pbmRleE9mKCI6Iik8MCYmIm9uIit5dCxhPWFbZi5leHBhbmRvXT9hOm5ldyBmLkV2ZW50KHl0LHR5cGVvZiBhPT0ib2JqZWN0IiYmYSksYS5pc1RyaWdnZXI9eD8yOjMsYS5uYW1lc3BhY2U9T3Quam9pbigiLiIpLGEucm5hbWVzcGFjZT1hLm5hbWVzcGFjZT9uZXcgUmVnRXhwKCIoXnxcXC4pIitPdC5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKTpudWxsLGEucmVzdWx0PXZvaWQgMCxhLnRhcmdldHx8KGEudGFyZ2V0PXYpLGQ9ZD09bnVsbD9bYV06Zi5tYWtlQXJyYXkoZCxbYV0pLGR0PWYuZXZlbnQuc3BlY2lhbFt5dF18fHt9LCEoIXgmJmR0LnRyaWdnZXImJmR0LnRyaWdnZXIuYXBwbHkodixkKT09PSExKSkpe2lmKCF4JiYhZHQubm9CdWJibGUmJiFQKHYpKXtmb3IoWT1kdC5kZWxlZ2F0ZVR5cGV8fHl0LF9hLnRlc3QoWSt5dCl8fChJPUkucGFyZW50Tm9kZSk7STtJPUkucGFyZW50Tm9kZSlzdC5wdXNoKEkpLE49STtOPT09KHYub3duZXJEb2N1bWVudHx8YykmJnN0LnB1c2goTi5kZWZhdWx0Vmlld3x8Ti5wYXJlbnRXaW5kb3d8fHQpfWZvcihBPTA7KEk9c3RbQSsrXSkmJiFhLmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7KWZ0PUksYS50eXBlPUE+MT9ZOmR0LmJpbmRUeXBlfHx5dCxKPShtdC5nZXQoSSwiZXZlbnRzIil8fE9iamVjdC5jcmVhdGUobnVsbCkpW2EudHlwZV0mJm10LmdldChJLCJoYW5kbGUiKSxKJiZKLmFwcGx5KEksZCksSj1XJiZJW1ddLEomJkouYXBwbHkmJkN0KEkpJiYoYS5yZXN1bHQ9Si5hcHBseShJLGQpLGEucmVzdWx0PT09ITEmJmEucHJldmVudERlZmF1bHQoKSk7cmV0dXJuIGEudHlwZT15dCwheCYmIWEuaXNEZWZhdWx0UHJldmVudGVkKCkmJighZHQuX2RlZmF1bHR8fGR0Ll9kZWZhdWx0LmFwcGx5KHN0LnBvcCgpLGQpPT09ITEpJiZDdCh2KSYmVyYmVCh2W3l0XSkmJiFQKHYpJiYoTj12W1ddLE4mJih2W1ddPW51bGwpLGYuZXZlbnQudHJpZ2dlcmVkPXl0LGEuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSYmZnQuYWRkRXZlbnRMaXN0ZW5lcih5dCxDYSksdlt5dF0oKSxhLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkmJmZ0LnJlbW92ZUV2ZW50TGlzdGVuZXIoeXQsQ2EpLGYuZXZlbnQudHJpZ2dlcmVkPXZvaWQgMCxOJiYodltXXT1OKSksYS5yZXN1bHR9fSxzaW11bGF0ZTpmdW5jdGlvbihhLGQsdil7dmFyIHg9Zi5leHRlbmQobmV3IGYuRXZlbnQsdix7dHlwZTphLGlzU2ltdWxhdGVkOiEwfSk7Zi5ldmVudC50cmlnZ2VyKHgsbnVsbCxkKX19KSxmLmZuLmV4dGVuZCh7dHJpZ2dlcjpmdW5jdGlvbihhLGQpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmLmV2ZW50LnRyaWdnZXIoYSxkLHRoaXMpfSl9LHRyaWdnZXJIYW5kbGVyOmZ1bmN0aW9uKGEsZCl7dmFyIHY9dGhpc1swXTtpZih2KXJldHVybiBmLmV2ZW50LnRyaWdnZXIoYSxkLHYsITApfX0pO3ZhciBDbz0vXFtcXSQvLFRhPS9ccj9cbi9nLFRvPS9eKD86c3VibWl0fGJ1dHRvbnxpbWFnZXxyZXNldHxmaWxlKSQvaSxrbz0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxrZXlnZW4pL2k7ZnVuY3Rpb24gbmkoYSxkLHYseCl7dmFyIEE7aWYoQXJyYXkuaXNBcnJheShkKSlmLmVhY2goZCxmdW5jdGlvbihJLE4pe3Z8fENvLnRlc3QoYSk/eChhLE4pOm5pKGErIlsiKyh0eXBlb2YgTj09Im9iamVjdCImJk4hPW51bGw/SToiIikrIl0iLE4sdix4KX0pO2Vsc2UgaWYoIXYmJl8oZCk9PT0ib2JqZWN0Iilmb3IoQSBpbiBkKW5pKGErIlsiK0ErIl0iLGRbQV0sdix4KTtlbHNlIHgoYSxkKX1mLnBhcmFtPWZ1bmN0aW9uKGEsZCl7dmFyIHYseD1bXSxBPWZ1bmN0aW9uKEksTil7dmFyIFk9VChOKT9OKCk6Tjt4W3gubGVuZ3RoXT1lbmNvZGVVUklDb21wb25lbnQoSSkrIj0iK2VuY29kZVVSSUNvbXBvbmVudChZPz8iIil9O2lmKGE9PW51bGwpcmV0dXJuIiI7aWYoQXJyYXkuaXNBcnJheShhKXx8YS5qcXVlcnkmJiFmLmlzUGxhaW5PYmplY3QoYSkpZi5lYWNoKGEsZnVuY3Rpb24oKXtBKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9yKHYgaW4gYSluaSh2LGFbdl0sZCxBKTtyZXR1cm4geC5qb2luKCImIil9LGYuZm4uZXh0ZW5kKHtzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gZi5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBhPWYucHJvcCh0aGlzLCJlbGVtZW50cyIpO3JldHVybiBhP2YubWFrZUFycmF5KGEpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgYT10aGlzLnR5cGU7cmV0dXJuIHRoaXMubmFtZSYmIWYodGhpcykuaXMoIjpkaXNhYmxlZCIpJiZrby50ZXN0KHRoaXMubm9kZU5hbWUpJiYhVG8udGVzdChhKSYmKHRoaXMuY2hlY2tlZHx8IVVlLnRlc3QoYSkpfSkubWFwKGZ1bmN0aW9uKGEsZCl7dmFyIHY9Zih0aGlzKS52YWwoKTtyZXR1cm4gdj09bnVsbD9udWxsOkFycmF5LmlzQXJyYXkodik/Zi5tYXAodixmdW5jdGlvbih4KXtyZXR1cm57bmFtZTpkLm5hbWUsdmFsdWU6eC5yZXBsYWNlKFRhLGBccgpgKX19KTp7bmFtZTpkLm5hbWUsdmFsdWU6di5yZXBsYWNlKFRhLGBccgpgKX19KS5nZXQoKX19KTt2YXIgU289LyUyMC9nLERvPS8jLiokLyxBbz0vKFs/Jl0pXz1bXiZdKi8sSW89L14oLio/KTpbIFx0XSooW15cclxuXSopJC9tZyxQbz0vXig/OmFib3V0fGFwcHxhcHAtc3RvcmFnZXwuKy1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLyxGbz0vXig/OkdFVHxIRUFEKSQvLEJvPS9eXC9cLy8sa2E9e30scmk9e30sU2E9IiovIi5jb25jYXQoIioiKSxpaT1jLmNyZWF0ZUVsZW1lbnQoImEiKTtpaS5ocmVmPUduLmhyZWY7ZnVuY3Rpb24gRGEoYSl7cmV0dXJuIGZ1bmN0aW9uKGQsdil7dHlwZW9mIGQhPSJzdHJpbmciJiYodj1kLGQ9IioiKTt2YXIgeCxBPTAsST1kLnRvTG93ZXJDYXNlKCkubWF0Y2goQnQpfHxbXTtpZihUKHYpKWZvcig7eD1JW0ErK107KXhbMF09PT0iKyI/KHg9eC5zbGljZSgxKXx8IioiLChhW3hdPWFbeF18fFtdKS51bnNoaWZ0KHYpKTooYVt4XT1hW3hdfHxbXSkucHVzaCh2KX19ZnVuY3Rpb24gQWEoYSxkLHYseCl7dmFyIEE9e30sST1hPT09cmk7ZnVuY3Rpb24gTihZKXt2YXIgVztyZXR1cm4gQVtZXT0hMCxmLmVhY2goYVtZXXx8W10sZnVuY3Rpb24oSixkdCl7dmFyIGZ0PWR0KGQsdix4KTtpZih0eXBlb2YgZnQ9PSJzdHJpbmciJiYhSSYmIUFbZnRdKXJldHVybiBkLmRhdGFUeXBlcy51bnNoaWZ0KGZ0KSxOKGZ0KSwhMTtpZihJKXJldHVybiEoVz1mdCl9KSxXfXJldHVybiBOKGQuZGF0YVR5cGVzWzBdKXx8IUFbIioiXSYmTigiKiIpfWZ1bmN0aW9uIGFpKGEsZCl7dmFyIHYseCxBPWYuYWpheFNldHRpbmdzLmZsYXRPcHRpb25zfHx7fTtmb3IodiBpbiBkKWRbdl0hPT12b2lkIDAmJigoQVt2XT9hOnh8fCh4PXt9KSlbdl09ZFt2XSk7cmV0dXJuIHgmJmYuZXh0ZW5kKCEwLGEseCksYX1mdW5jdGlvbiBObyhhLGQsdil7Zm9yKHZhciB4LEEsSSxOLFk9YS5jb250ZW50cyxXPWEuZGF0YVR5cGVzO1dbMF09PT0iKiI7KVcuc2hpZnQoKSx4PT09dm9pZCAwJiYoeD1hLm1pbWVUeXBlfHxkLmdldFJlc3BvbnNlSGVhZGVyKCJDb250ZW50LVR5cGUiKSk7aWYoeCl7Zm9yKEEgaW4gWSlpZihZW0FdJiZZW0FdLnRlc3QoeCkpe1cudW5zaGlmdChBKTticmVha319aWYoV1swXWluIHYpST1XWzBdO2Vsc2V7Zm9yKEEgaW4gdil7aWYoIVdbMF18fGEuY29udmVydGVyc1tBKyIgIitXWzBdXSl7ST1BO2JyZWFrfU58fChOPUEpfUk9SXx8Tn1pZihJKXJldHVybiBJIT09V1swXSYmVy51bnNoaWZ0KEkpLHZbSV19ZnVuY3Rpb24gT28oYSxkLHYseCl7dmFyIEEsSSxOLFksVyxKPXt9LGR0PWEuZGF0YVR5cGVzLnNsaWNlKCk7aWYoZHRbMV0pZm9yKE4gaW4gYS5jb252ZXJ0ZXJzKUpbTi50b0xvd2VyQ2FzZSgpXT1hLmNvbnZlcnRlcnNbTl07Zm9yKEk9ZHQuc2hpZnQoKTtJOylpZihhLnJlc3BvbnNlRmllbGRzW0ldJiYodlthLnJlc3BvbnNlRmllbGRzW0ldXT1kKSwhVyYmeCYmYS5kYXRhRmlsdGVyJiYoZD1hLmRhdGFGaWx0ZXIoZCxhLmRhdGFUeXBlKSksVz1JLEk9ZHQuc2hpZnQoKSxJKXtpZihJPT09IioiKUk9VztlbHNlIGlmKFchPT0iKiImJlchPT1JKXtpZihOPUpbVysiICIrSV18fEpbIiogIitJXSwhTil7Zm9yKEEgaW4gSilpZihZPUEuc3BsaXQoIiAiKSxZWzFdPT09SSYmKE49SltXKyIgIitZWzBdXXx8SlsiKiAiK1lbMF1dLE4pKXtOPT09ITA/Tj1KW0FdOkpbQV0hPT0hMCYmKEk9WVswXSxkdC51bnNoaWZ0KFlbMV0pKTticmVha319aWYoTiE9PSEwKWlmKE4mJmEudGhyb3dzKWQ9TihkKTtlbHNlIHRyeXtkPU4oZCl9Y2F0Y2goZnQpe3JldHVybntzdGF0ZToicGFyc2VyZXJyb3IiLGVycm9yOk4/ZnQ6Ik5vIGNvbnZlcnNpb24gZnJvbSAiK1crIiB0byAiK0l9fX19cmV0dXJue3N0YXRlOiJzdWNjZXNzIixkYXRhOmR9fWYuZXh0ZW5kKHthY3RpdmU6MCxsYXN0TW9kaWZpZWQ6e30sZXRhZzp7fSxhamF4U2V0dGluZ3M6e3VybDpHbi5ocmVmLHR5cGU6IkdFVCIsaXNMb2NhbDpQby50ZXN0KEduLnByb3RvY29sKSxnbG9iYWw6ITAscHJvY2Vzc0RhdGE6ITAsYXN5bmM6ITAsY29udGVudFR5cGU6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCIsYWNjZXB0czp7IioiOlNhLHRleHQ6InRleHQvcGxhaW4iLGh0bWw6InRleHQvaHRtbCIseG1sOiJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sIixqc29uOiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQifSxjb250ZW50czp7eG1sOi9cYnhtbFxiLyxodG1sOi9cYmh0bWwvLGpzb246L1xianNvblxiL30scmVzcG9uc2VGaWVsZHM6e3htbDoicmVzcG9uc2VYTUwiLHRleHQ6InJlc3BvbnNlVGV4dCIsanNvbjoicmVzcG9uc2VKU09OIn0sY29udmVydGVyczp7IiogdGV4dCI6U3RyaW5nLCJ0ZXh0IGh0bWwiOiEwLCJ0ZXh0IGpzb24iOkpTT04ucGFyc2UsInRleHQgeG1sIjpmLnBhcnNlWE1MfSxmbGF0T3B0aW9uczp7dXJsOiEwLGNvbnRleHQ6ITB9fSxhamF4U2V0dXA6ZnVuY3Rpb24oYSxkKXtyZXR1cm4gZD9haShhaShhLGYuYWpheFNldHRpbmdzKSxkKTphaShmLmFqYXhTZXR0aW5ncyxhKX0sYWpheFByZWZpbHRlcjpEYShrYSksYWpheFRyYW5zcG9ydDpEYShyaSksYWpheDpmdW5jdGlvbihhLGQpe3R5cGVvZiBhPT0ib2JqZWN0IiYmKGQ9YSxhPXZvaWQgMCksZD1kfHx7fTt2YXIgdix4LEEsSSxOLFksVyxKLGR0LGZ0LHN0PWYuYWpheFNldHVwKHt9LGQpLHl0PXN0LmNvbnRleHR8fHN0LE90PXN0LmNvbnRleHQmJih5dC5ub2RlVHlwZXx8eXQuanF1ZXJ5KT9mKHl0KTpmLmV2ZW50LFh0PWYuRGVmZXJyZWQoKSxWdD1mLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSx1ZT1zdC5zdGF0dXNDb2RlfHx7fSxvZT17fSxXZT17fSxHZT0iY2FuY2VsZWQiLHF0PXtyZWFkeVN0YXRlOjAsZ2V0UmVzcG9uc2VIZWFkZXI6ZnVuY3Rpb24oWXQpe3ZhciByZTtpZihXKXtpZighSSlmb3IoST17fTtyZT1Jby5leGVjKEEpOylJW3JlWzFdLnRvTG93ZXJDYXNlKCkrIiAiXT0oSVtyZVsxXS50b0xvd2VyQ2FzZSgpKyIgIl18fFtdKS5jb25jYXQocmVbMl0pO3JlPUlbWXQudG9Mb3dlckNhc2UoKSsiICJdfXJldHVybiByZT09bnVsbD9udWxsOnJlLmpvaW4oIiwgIil9LGdldEFsbFJlc3BvbnNlSGVhZGVyczpmdW5jdGlvbigpe3JldHVybiBXP0E6bnVsbH0sc2V0UmVxdWVzdEhlYWRlcjpmdW5jdGlvbihZdCxyZSl7cmV0dXJuIFc9PW51bGwmJihZdD1XZVtZdC50b0xvd2VyQ2FzZSgpXT1XZVtZdC50b0xvd2VyQ2FzZSgpXXx8WXQsb2VbWXRdPXJlKSx0aGlzfSxvdmVycmlkZU1pbWVUeXBlOmZ1bmN0aW9uKFl0KXtyZXR1cm4gVz09bnVsbCYmKHN0Lm1pbWVUeXBlPVl0KSx0aGlzfSxzdGF0dXNDb2RlOmZ1bmN0aW9uKFl0KXt2YXIgcmU7aWYoWXQpaWYoVylxdC5hbHdheXMoWXRbcXQuc3RhdHVzXSk7ZWxzZSBmb3IocmUgaW4gWXQpdWVbcmVdPVt1ZVtyZV0sWXRbcmVdXTtyZXR1cm4gdGhpc30sYWJvcnQ6ZnVuY3Rpb24oWXQpe3ZhciByZT1ZdHx8R2U7cmV0dXJuIHYmJnYuYWJvcnQocmUpLGJuKDAscmUpLHRoaXN9fTtpZihYdC5wcm9taXNlKHF0KSxzdC51cmw9KChhfHxzdC51cmx8fEduLmhyZWYpKyIiKS5yZXBsYWNlKEJvLEduLnByb3RvY29sKyIvLyIpLHN0LnR5cGU9ZC5tZXRob2R8fGQudHlwZXx8c3QubWV0aG9kfHxzdC50eXBlLHN0LmRhdGFUeXBlcz0oc3QuZGF0YVR5cGV8fCIqIikudG9Mb3dlckNhc2UoKS5tYXRjaChCdCl8fFsiIl0sc3QuY3Jvc3NEb21haW49PW51bGwpe1k9Yy5jcmVhdGVFbGVtZW50KCJhIik7dHJ5e1kuaHJlZj1zdC51cmwsWS5ocmVmPVkuaHJlZixzdC5jcm9zc0RvbWFpbj1paS5wcm90b2NvbCsiLy8iK2lpLmhvc3QhPVkucHJvdG9jb2wrIi8vIitZLmhvc3R9Y2F0Y2h7c3QuY3Jvc3NEb21haW49ITB9fWlmKHN0LmRhdGEmJnN0LnByb2Nlc3NEYXRhJiZ0eXBlb2Ygc3QuZGF0YSE9InN0cmluZyImJihzdC5kYXRhPWYucGFyYW0oc3QuZGF0YSxzdC50cmFkaXRpb25hbCkpLEFhKGthLHN0LGQscXQpLFcpcmV0dXJuIHF0O0o9Zi5ldmVudCYmc3QuZ2xvYmFsLEomJmYuYWN0aXZlKys9PT0wJiZmLmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpLHN0LnR5cGU9c3QudHlwZS50b1VwcGVyQ2FzZSgpLHN0Lmhhc0NvbnRlbnQ9IUZvLnRlc3Qoc3QudHlwZSkseD1zdC51cmwucmVwbGFjZShEbywiIiksc3QuaGFzQ29udGVudD9zdC5kYXRhJiZzdC5wcm9jZXNzRGF0YSYmKHN0LmNvbnRlbnRUeXBlfHwiIikuaW5kZXhPZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIik9PT0wJiYoc3QuZGF0YT1zdC5kYXRhLnJlcGxhY2UoU28sIisiKSk6KGZ0PXN0LnVybC5zbGljZSh4Lmxlbmd0aCksc3QuZGF0YSYmKHN0LnByb2Nlc3NEYXRhfHx0eXBlb2Ygc3QuZGF0YT09InN0cmluZyIpJiYoeCs9KGVpLnRlc3QoeCk/IiYiOiI/Iikrc3QuZGF0YSxkZWxldGUgc3QuZGF0YSksc3QuY2FjaGU9PT0hMSYmKHg9eC5yZXBsYWNlKEFvLCIkMSIpLGZ0PShlaS50ZXN0KHgpPyImIjoiPyIpKyJfPSIreGEuZ3VpZCsrK2Z0KSxzdC51cmw9eCtmdCksc3QuaWZNb2RpZmllZCYmKGYubGFzdE1vZGlmaWVkW3hdJiZxdC5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIsZi5sYXN0TW9kaWZpZWRbeF0pLGYuZXRhZ1t4XSYmcXQuc2V0UmVxdWVzdEhlYWRlcigiSWYtTm9uZS1NYXRjaCIsZi5ldGFnW3hdKSksKHN0LmRhdGEmJnN0Lmhhc0NvbnRlbnQmJnN0LmNvbnRlbnRUeXBlIT09ITF8fGQuY29udGVudFR5cGUpJiZxdC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLHN0LmNvbnRlbnRUeXBlKSxxdC5zZXRSZXF1ZXN0SGVhZGVyKCJBY2NlcHQiLHN0LmRhdGFUeXBlc1swXSYmc3QuYWNjZXB0c1tzdC5kYXRhVHlwZXNbMF1dP3N0LmFjY2VwdHNbc3QuZGF0YVR5cGVzWzBdXSsoc3QuZGF0YVR5cGVzWzBdIT09IioiPyIsICIrU2ErIjsgcT0wLjAxIjoiIik6c3QuYWNjZXB0c1siKiJdKTtmb3IoZHQgaW4gc3QuaGVhZGVycylxdC5zZXRSZXF1ZXN0SGVhZGVyKGR0LHN0LmhlYWRlcnNbZHRdKTtpZihzdC5iZWZvcmVTZW5kJiYoc3QuYmVmb3JlU2VuZC5jYWxsKHl0LHF0LHN0KT09PSExfHxXKSlyZXR1cm4gcXQuYWJvcnQoKTtpZihHZT0iYWJvcnQiLFZ0LmFkZChzdC5jb21wbGV0ZSkscXQuZG9uZShzdC5zdWNjZXNzKSxxdC5mYWlsKHN0LmVycm9yKSx2PUFhKHJpLHN0LGQscXQpLCF2KWJuKC0xLCJObyBUcmFuc3BvcnQiKTtlbHNle2lmKHF0LnJlYWR5U3RhdGU9MSxKJiZPdC50cmlnZ2VyKCJhamF4U2VuZCIsW3F0LHN0XSksVylyZXR1cm4gcXQ7c3QuYXN5bmMmJnN0LnRpbWVvdXQ+MCYmKE49dC5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cXQuYWJvcnQoInRpbWVvdXQiKX0sc3QudGltZW91dCkpO3RyeXtXPSExLHYuc2VuZChvZSxibil9Y2F0Y2goWXQpe2lmKFcpdGhyb3cgWXQ7Ym4oLTEsWXQpfX1mdW5jdGlvbiBibihZdCxyZSxYbixvaSl7dmFyIHFlLFluLFhlLGVuLG5uLFBlPXJlO1d8fChXPSEwLE4mJnQuY2xlYXJUaW1lb3V0KE4pLHY9dm9pZCAwLEE9b2l8fCIiLHF0LnJlYWR5U3RhdGU9WXQ+MD80OjAscWU9WXQ+PTIwMCYmWXQ8MzAwfHxZdD09PTMwNCxYbiYmKGVuPU5vKHN0LHF0LFhuKSksIXFlJiZmLmluQXJyYXkoInNjcmlwdCIsc3QuZGF0YVR5cGVzKT4tMSYmZi5pbkFycmF5KCJqc29uIixzdC5kYXRhVHlwZXMpPDAmJihzdC5jb252ZXJ0ZXJzWyJ0ZXh0IHNjcmlwdCJdPWZ1bmN0aW9uKCl7fSksZW49T28oc3QsZW4scXQscWUpLHFlPyhzdC5pZk1vZGlmaWVkJiYobm49cXQuZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKSxubiYmKGYubGFzdE1vZGlmaWVkW3hdPW5uKSxubj1xdC5nZXRSZXNwb25zZUhlYWRlcigiZXRhZyIpLG5uJiYoZi5ldGFnW3hdPW5uKSksWXQ9PT0yMDR8fHN0LnR5cGU9PT0iSEVBRCI/UGU9Im5vY29udGVudCI6WXQ9PT0zMDQ/UGU9Im5vdG1vZGlmaWVkIjooUGU9ZW4uc3RhdGUsWW49ZW4uZGF0YSxYZT1lbi5lcnJvcixxZT0hWGUpKTooWGU9UGUsKFl0fHwhUGUpJiYoUGU9ImVycm9yIixZdDwwJiYoWXQ9MCkpKSxxdC5zdGF0dXM9WXQscXQuc3RhdHVzVGV4dD0ocmV8fFBlKSsiIixxZT9YdC5yZXNvbHZlV2l0aCh5dCxbWW4sUGUscXRdKTpYdC5yZWplY3RXaXRoKHl0LFtxdCxQZSxYZV0pLHF0LnN0YXR1c0NvZGUodWUpLHVlPXZvaWQgMCxKJiZPdC50cmlnZ2VyKHFlPyJhamF4U3VjY2VzcyI6ImFqYXhFcnJvciIsW3F0LHN0LHFlP1luOlhlXSksVnQuZmlyZVdpdGgoeXQsW3F0LFBlXSksSiYmKE90LnRyaWdnZXIoImFqYXhDb21wbGV0ZSIsW3F0LHN0XSksLS1mLmFjdGl2ZXx8Zi5ldmVudC50cmlnZ2VyKCJhamF4U3RvcCIpKSl9cmV0dXJuIHF0fSxnZXRKU09OOmZ1bmN0aW9uKGEsZCx2KXtyZXR1cm4gZi5nZXQoYSxkLHYsImpzb24iKX0sZ2V0U2NyaXB0OmZ1bmN0aW9uKGEsZCl7cmV0dXJuIGYuZ2V0KGEsdm9pZCAwLGQsInNjcmlwdCIpfX0pLGYuZWFjaChbImdldCIsInBvc3QiXSxmdW5jdGlvbihhLGQpe2ZbZF09ZnVuY3Rpb24odix4LEEsSSl7cmV0dXJuIFQoeCkmJihJPUl8fEEsQT14LHg9dm9pZCAwKSxmLmFqYXgoZi5leHRlbmQoe3VybDp2LHR5cGU6ZCxkYXRhVHlwZTpJLGRhdGE6eCxzdWNjZXNzOkF9LGYuaXNQbGFpbk9iamVjdCh2KSYmdikpfX0pLGYuYWpheFByZWZpbHRlcihmdW5jdGlvbihhKXt2YXIgZDtmb3IoZCBpbiBhLmhlYWRlcnMpZC50b0xvd2VyQ2FzZSgpPT09ImNvbnRlbnQtdHlwZSImJihhLmNvbnRlbnRUeXBlPWEuaGVhZGVyc1tkXXx8IiIpfSksZi5fZXZhbFVybD1mdW5jdGlvbihhLGQsdil7cmV0dXJuIGYuYWpheCh7dXJsOmEsdHlwZToiR0VUIixkYXRhVHlwZToic2NyaXB0IixjYWNoZTohMCxhc3luYzohMSxnbG9iYWw6ITEsY29udmVydGVyczp7InRleHQgc2NyaXB0IjpmdW5jdGlvbigpe319LGRhdGFGaWx0ZXI6ZnVuY3Rpb24oeCl7Zi5nbG9iYWxFdmFsKHgsZCx2KX19KX0sZi5mbi5leHRlbmQoe3dyYXBBbGw6ZnVuY3Rpb24oYSl7dmFyIGQ7cmV0dXJuIHRoaXNbMF0mJihUKGEpJiYoYT1hLmNhbGwodGhpc1swXSkpLGQ9ZihhLHRoaXNbMF0ub3duZXJEb2N1bWVudCkuZXEoMCkuY2xvbmUoITApLHRoaXNbMF0ucGFyZW50Tm9kZSYmZC5pbnNlcnRCZWZvcmUodGhpc1swXSksZC5tYXAoZnVuY3Rpb24oKXtmb3IodmFyIHY9dGhpczt2LmZpcnN0RWxlbWVudENoaWxkOyl2PXYuZmlyc3RFbGVtZW50Q2hpbGQ7cmV0dXJuIHZ9KS5hcHBlbmQodGhpcykpLHRoaXN9LHdyYXBJbm5lcjpmdW5jdGlvbihhKXtyZXR1cm4gVChhKT90aGlzLmVhY2goZnVuY3Rpb24oZCl7Zih0aGlzKS53cmFwSW5uZXIoYS5jYWxsKHRoaXMsZCkpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGQ9Zih0aGlzKSx2PWQuY29udGVudHMoKTt2Lmxlbmd0aD92LndyYXBBbGwoYSk6ZC5hcHBlbmQoYSl9KX0sd3JhcDpmdW5jdGlvbihhKXt2YXIgZD1UKGEpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24odil7Zih0aGlzKS53cmFwQWxsKGQ/YS5jYWxsKHRoaXMsdik6YSl9KX0sdW53cmFwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnBhcmVudChhKS5ub3QoImJvZHkiKS5lYWNoKGZ1bmN0aW9uKCl7Zih0aGlzKS5yZXBsYWNlV2l0aCh0aGlzLmNoaWxkTm9kZXMpfSksdGhpc319KSxmLmV4cHIucHNldWRvcy5oaWRkZW49ZnVuY3Rpb24oYSl7cmV0dXJuIWYuZXhwci5wc2V1ZG9zLnZpc2libGUoYSl9LGYuZXhwci5wc2V1ZG9zLnZpc2libGU9ZnVuY3Rpb24oYSl7cmV0dXJuISEoYS5vZmZzZXRXaWR0aHx8YS5vZmZzZXRIZWlnaHR8fGEuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgpfSxmLmFqYXhTZXR0aW5ncy54aHI9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIG5ldyB0LlhNTEh0dHBSZXF1ZXN0fWNhdGNoe319O3ZhciBFbz17MDoyMDAsMTIyMzoyMDR9LHFuPWYuYWpheFNldHRpbmdzLnhocigpO3kuY29ycz0hIXFuJiYid2l0aENyZWRlbnRpYWxzImluIHFuLHkuYWpheD1xbj0hIXFuLGYuYWpheFRyYW5zcG9ydChmdW5jdGlvbihhKXt2YXIgZCx2O2lmKHkuY29yc3x8cW4mJiFhLmNyb3NzRG9tYWluKXJldHVybntzZW5kOmZ1bmN0aW9uKHgsQSl7dmFyIEksTj1hLnhocigpO2lmKE4ub3BlbihhLnR5cGUsYS51cmwsYS5hc3luYyxhLnVzZXJuYW1lLGEucGFzc3dvcmQpLGEueGhyRmllbGRzKWZvcihJIGluIGEueGhyRmllbGRzKU5bSV09YS54aHJGaWVsZHNbSV07YS5taW1lVHlwZSYmTi5vdmVycmlkZU1pbWVUeXBlJiZOLm92ZXJyaWRlTWltZVR5cGUoYS5taW1lVHlwZSksIWEuY3Jvc3NEb21haW4mJiF4WyJYLVJlcXVlc3RlZC1XaXRoIl0mJih4WyJYLVJlcXVlc3RlZC1XaXRoIl09IlhNTEh0dHBSZXF1ZXN0Iik7Zm9yKEkgaW4geClOLnNldFJlcXVlc3RIZWFkZXIoSSx4W0ldKTtkPWZ1bmN0aW9uKFkpe3JldHVybiBmdW5jdGlvbigpe2QmJihkPXY9Ti5vbmxvYWQ9Ti5vbmVycm9yPU4ub25hYm9ydD1OLm9udGltZW91dD1OLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLFk9PT0iYWJvcnQiP04uYWJvcnQoKTpZPT09ImVycm9yIj90eXBlb2YgTi5zdGF0dXMhPSJudW1iZXIiP0EoMCwiZXJyb3IiKTpBKE4uc3RhdHVzLE4uc3RhdHVzVGV4dCk6QShFb1tOLnN0YXR1c118fE4uc3RhdHVzLE4uc3RhdHVzVGV4dCwoTi5yZXNwb25zZVR5cGV8fCJ0ZXh0IikhPT0idGV4dCJ8fHR5cGVvZiBOLnJlc3BvbnNlVGV4dCE9InN0cmluZyI/e2JpbmFyeTpOLnJlc3BvbnNlfTp7dGV4dDpOLnJlc3BvbnNlVGV4dH0sTi5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSkpfX0sTi5vbmxvYWQ9ZCgpLHY9Ti5vbmVycm9yPU4ub250aW1lb3V0PWQoImVycm9yIiksTi5vbmFib3J0IT09dm9pZCAwP04ub25hYm9ydD12Ok4ub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7Ti5yZWFkeVN0YXRlPT09NCYmdC5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZCYmdigpfSl9LGQ9ZCgiYWJvcnQiKTt0cnl7Ti5zZW5kKGEuaGFzQ29udGVudCYmYS5kYXRhfHxudWxsKX1jYXRjaChZKXtpZihkKXRocm93IFl9fSxhYm9ydDpmdW5jdGlvbigpe2QmJmQoKX19fSksZi5hamF4UHJlZmlsdGVyKGZ1bmN0aW9uKGEpe2EuY3Jvc3NEb21haW4mJihhLmNvbnRlbnRzLnNjcmlwdD0hMSl9KSxmLmFqYXhTZXR1cCh7YWNjZXB0czp7c2NyaXB0OiJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCJ9LGNvbnRlbnRzOntzY3JpcHQ6L1xiKD86amF2YXxlY21hKXNjcmlwdFxiL30sY29udmVydGVyczp7InRleHQgc2NyaXB0IjpmdW5jdGlvbihhKXtyZXR1cm4gZi5nbG9iYWxFdmFsKGEpLGF9fX0pLGYuYWpheFByZWZpbHRlcigic2NyaXB0IixmdW5jdGlvbihhKXthLmNhY2hlPT09dm9pZCAwJiYoYS5jYWNoZT0hMSksYS5jcm9zc0RvbWFpbiYmKGEudHlwZT0iR0VUIil9KSxmLmFqYXhUcmFuc3BvcnQoInNjcmlwdCIsZnVuY3Rpb24oYSl7aWYoYS5jcm9zc0RvbWFpbnx8YS5zY3JpcHRBdHRycyl7dmFyIGQsdjtyZXR1cm57c2VuZDpmdW5jdGlvbih4LEEpe2Q9ZigiPHNjcmlwdD4iKS5hdHRyKGEuc2NyaXB0QXR0cnN8fHt9KS5wcm9wKHtjaGFyc2V0OmEuc2NyaXB0Q2hhcnNldCxzcmM6YS51cmx9KS5vbigibG9hZCBlcnJvciIsdj1mdW5jdGlvbihJKXtkLnJlbW92ZSgpLHY9bnVsbCxJJiZBKEkudHlwZT09PSJlcnJvciI/NDA0OjIwMCxJLnR5cGUpfSksYy5oZWFkLmFwcGVuZENoaWxkKGRbMF0pfSxhYm9ydDpmdW5jdGlvbigpe3YmJnYoKX19fX0pO3ZhciBJYT1bXSxzaT0vKD0pXD8oPz0mfCQpfFw/XD8vO2YuYWpheFNldHVwKHtqc29ucDoiY2FsbGJhY2siLGpzb25wQ2FsbGJhY2s6ZnVuY3Rpb24oKXt2YXIgYT1JYS5wb3AoKXx8Zi5leHBhbmRvKyJfIit4YS5ndWlkKys7cmV0dXJuIHRoaXNbYV09ITAsYX19KSxmLmFqYXhQcmVmaWx0ZXIoImpzb24ganNvbnAiLGZ1bmN0aW9uKGEsZCx2KXt2YXIgeCxBLEksTj1hLmpzb25wIT09ITEmJihzaS50ZXN0KGEudXJsKT8idXJsIjp0eXBlb2YgYS5kYXRhPT0ic3RyaW5nIiYmKGEuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKT09PTAmJnNpLnRlc3QoYS5kYXRhKSYmImRhdGEiKTtpZihOfHxhLmRhdGFUeXBlc1swXT09PSJqc29ucCIpcmV0dXJuIHg9YS5qc29ucENhbGxiYWNrPVQoYS5qc29ucENhbGxiYWNrKT9hLmpzb25wQ2FsbGJhY2soKTphLmpzb25wQ2FsbGJhY2ssTj9hW05dPWFbTl0ucmVwbGFjZShzaSwiJDEiK3gpOmEuanNvbnAhPT0hMSYmKGEudXJsKz0oZWkudGVzdChhLnVybCk/IiYiOiI/IikrYS5qc29ucCsiPSIreCksYS5jb252ZXJ0ZXJzWyJzY3JpcHQganNvbiJdPWZ1bmN0aW9uKCl7cmV0dXJuIEl8fGYuZXJyb3IoeCsiIHdhcyBub3QgY2FsbGVkIiksSVswXX0sYS5kYXRhVHlwZXNbMF09Impzb24iLEE9dFt4XSx0W3hdPWZ1bmN0aW9uKCl7ST1hcmd1bWVudHN9LHYuYWx3YXlzKGZ1bmN0aW9uKCl7QT09PXZvaWQgMD9mKHQpLnJlbW92ZVByb3AoeCk6dFt4XT1BLGFbeF0mJihhLmpzb25wQ2FsbGJhY2s9ZC5qc29ucENhbGxiYWNrLElhLnB1c2goeCkpLEkmJlQoQSkmJkEoSVswXSksST1BPXZvaWQgMH0pLCJzY3JpcHQifSkseS5jcmVhdGVIVE1MRG9jdW1lbnQ9ZnVuY3Rpb24oKXt2YXIgYT1jLmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgiIikuYm9keTtyZXR1cm4gYS5pbm5lckhUTUw9Ijxmb3JtPjwvZm9ybT48Zm9ybT48L2Zvcm0+IixhLmNoaWxkTm9kZXMubGVuZ3RoPT09Mn0oKSxmLnBhcnNlSFRNTD1mdW5jdGlvbihhLGQsdil7aWYodHlwZW9mIGEhPSJzdHJpbmciKXJldHVybltdO3R5cGVvZiBkPT0iYm9vbGVhbiImJih2PWQsZD0hMSk7dmFyIHgsQSxJO3JldHVybiBkfHwoeS5jcmVhdGVIVE1MRG9jdW1lbnQ/KGQ9Yy5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIiIpLHg9ZC5jcmVhdGVFbGVtZW50KCJiYXNlIikseC5ocmVmPWMubG9jYXRpb24uaHJlZixkLmhlYWQuYXBwZW5kQ2hpbGQoeCkpOmQ9YyksQT1udC5leGVjKGEpLEk9IXYmJltdLEE/W2QuY3JlYXRlRWxlbWVudChBWzFdKV06KEE9YWEoW2FdLGQsSSksSSYmSS5sZW5ndGgmJmYoSSkucmVtb3ZlKCksZi5tZXJnZShbXSxBLmNoaWxkTm9kZXMpKX0sZi5mbi5sb2FkPWZ1bmN0aW9uKGEsZCx2KXt2YXIgeCxBLEksTj10aGlzLFk9YS5pbmRleE9mKCIgIik7cmV0dXJuIFk+LTEmJih4PWhuKGEuc2xpY2UoWSkpLGE9YS5zbGljZSgwLFkpKSxUKGQpPyh2PWQsZD12b2lkIDApOmQmJnR5cGVvZiBkPT0ib2JqZWN0IiYmKEE9IlBPU1QiKSxOLmxlbmd0aD4wJiZmLmFqYXgoe3VybDphLHR5cGU6QXx8IkdFVCIsZGF0YVR5cGU6Imh0bWwiLGRhdGE6ZH0pLmRvbmUoZnVuY3Rpb24oVyl7ST1hcmd1bWVudHMsTi5odG1sKHg/ZigiPGRpdj4iKS5hcHBlbmQoZi5wYXJzZUhUTUwoVykpLmZpbmQoeCk6Vyl9KS5hbHdheXModiYmZnVuY3Rpb24oVyxKKXtOLmVhY2goZnVuY3Rpb24oKXt2LmFwcGx5KHRoaXMsSXx8W1cucmVzcG9uc2VUZXh0LEosV10pfSl9KSx0aGlzfSxmLmV4cHIucHNldWRvcy5hbmltYXRlZD1mdW5jdGlvbihhKXtyZXR1cm4gZi5ncmVwKGYudGltZXJzLGZ1bmN0aW9uKGQpe3JldHVybiBhPT09ZC5lbGVtfSkubGVuZ3RofSxmLm9mZnNldD17c2V0T2Zmc2V0OmZ1bmN0aW9uKGEsZCx2KXt2YXIgeCxBLEksTixZLFcsSixkdD1mLmNzcyhhLCJwb3NpdGlvbiIpLGZ0PWYoYSksc3Q9e307ZHQ9PT0ic3RhdGljIiYmKGEuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIiksWT1mdC5vZmZzZXQoKSxJPWYuY3NzKGEsInRvcCIpLFc9Zi5jc3MoYSwibGVmdCIpLEo9KGR0PT09ImFic29sdXRlInx8ZHQ9PT0iZml4ZWQiKSYmKEkrVykuaW5kZXhPZigiYXV0byIpPi0xLEo/KHg9ZnQucG9zaXRpb24oKSxOPXgudG9wLEE9eC5sZWZ0KTooTj1wYXJzZUZsb2F0KEkpfHwwLEE9cGFyc2VGbG9hdChXKXx8MCksVChkKSYmKGQ9ZC5jYWxsKGEsdixmLmV4dGVuZCh7fSxZKSkpLGQudG9wIT1udWxsJiYoc3QudG9wPWQudG9wLVkudG9wK04pLGQubGVmdCE9bnVsbCYmKHN0LmxlZnQ9ZC5sZWZ0LVkubGVmdCtBKSwidXNpbmciaW4gZD9kLnVzaW5nLmNhbGwoYSxzdCk6ZnQuY3NzKHN0KX19LGYuZm4uZXh0ZW5kKHtvZmZzZXQ6ZnVuY3Rpb24oYSl7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gYT09PXZvaWQgMD90aGlzOnRoaXMuZWFjaChmdW5jdGlvbihBKXtmLm9mZnNldC5zZXRPZmZzZXQodGhpcyxhLEEpfSk7dmFyIGQsdix4PXRoaXNbMF07aWYoeClyZXR1cm4geC5nZXRDbGllbnRSZWN0cygpLmxlbmd0aD8oZD14LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHY9eC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LHt0b3A6ZC50b3Ardi5wYWdlWU9mZnNldCxsZWZ0OmQubGVmdCt2LnBhZ2VYT2Zmc2V0fSk6e3RvcDowLGxlZnQ6MH19LHBvc2l0aW9uOmZ1bmN0aW9uKCl7aWYodGhpc1swXSl7dmFyIGEsZCx2LHg9dGhpc1swXSxBPXt0b3A6MCxsZWZ0OjB9O2lmKGYuY3NzKHgsInBvc2l0aW9uIik9PT0iZml4ZWQiKWQ9eC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtlbHNle2ZvcihkPXRoaXMub2Zmc2V0KCksdj14Lm93bmVyRG9jdW1lbnQsYT14Lm9mZnNldFBhcmVudHx8di5kb2N1bWVudEVsZW1lbnQ7YSYmKGE9PT12LmJvZHl8fGE9PT12LmRvY3VtZW50RWxlbWVudCkmJmYuY3NzKGEsInBvc2l0aW9uIik9PT0ic3RhdGljIjspYT1hLnBhcmVudE5vZGU7YSYmYSE9PXgmJmEubm9kZVR5cGU9PT0xJiYoQT1mKGEpLm9mZnNldCgpLEEudG9wKz1mLmNzcyhhLCJib3JkZXJUb3BXaWR0aCIsITApLEEubGVmdCs9Zi5jc3MoYSwiYm9yZGVyTGVmdFdpZHRoIiwhMCkpfXJldHVybnt0b3A6ZC50b3AtQS50b3AtZi5jc3MoeCwibWFyZ2luVG9wIiwhMCksbGVmdDpkLmxlZnQtQS5sZWZ0LWYuY3NzKHgsIm1hcmdpbkxlZnQiLCEwKX19fSxvZmZzZXRQYXJlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5vZmZzZXRQYXJlbnQ7YSYmZi5jc3MoYSwicG9zaXRpb24iKT09PSJzdGF0aWMiOylhPWEub2Zmc2V0UGFyZW50O3JldHVybiBhfHx6ZX0pfX0pLGYuZWFjaCh7c2Nyb2xsTGVmdDoicGFnZVhPZmZzZXQiLHNjcm9sbFRvcDoicGFnZVlPZmZzZXQifSxmdW5jdGlvbihhLGQpe3ZhciB2PWQ9PT0icGFnZVlPZmZzZXQiO2YuZm5bYV09ZnVuY3Rpb24oeCl7cmV0dXJuIEsodGhpcyxmdW5jdGlvbihBLEksTil7dmFyIFk7aWYoUChBKT9ZPUE6QS5ub2RlVHlwZT09PTkmJihZPUEuZGVmYXVsdFZpZXcpLE49PT12b2lkIDApcmV0dXJuIFk/WVtkXTpBW0ldO1k/WS5zY3JvbGxUbyh2P1kucGFnZVhPZmZzZXQ6Tix2P046WS5wYWdlWU9mZnNldCk6QVtJXT1OfSxhLHgsYXJndW1lbnRzLmxlbmd0aCl9fSksZi5lYWNoKFsidG9wIiwibGVmdCJdLGZ1bmN0aW9uKGEsZCl7Zi5jc3NIb29rc1tkXT1jYSh5LnBpeGVsUG9zaXRpb24sZnVuY3Rpb24odix4KXtpZih4KXJldHVybiB4PVVuKHYsZCksJHIudGVzdCh4KT9mKHYpLnBvc2l0aW9uKClbZF0rInB4Ijp4fSl9KSxmLmVhY2goe0hlaWdodDoiaGVpZ2h0IixXaWR0aDoid2lkdGgifSxmdW5jdGlvbihhLGQpe2YuZWFjaCh7cGFkZGluZzoiaW5uZXIiK2EsY29udGVudDpkLCIiOiJvdXRlciIrYX0sZnVuY3Rpb24odix4KXtmLmZuW3hdPWZ1bmN0aW9uKEEsSSl7dmFyIE49YXJndW1lbnRzLmxlbmd0aCYmKHZ8fHR5cGVvZiBBIT0iYm9vbGVhbiIpLFk9dnx8KEE9PT0hMHx8ST09PSEwPyJtYXJnaW4iOiJib3JkZXIiKTtyZXR1cm4gSyh0aGlzLGZ1bmN0aW9uKFcsSixkdCl7dmFyIGZ0O3JldHVybiBQKFcpP3guaW5kZXhPZigib3V0ZXIiKT09PTA/V1siaW5uZXIiK2FdOlcuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyJjbGllbnQiK2FdOlcubm9kZVR5cGU9PT05PyhmdD1XLmRvY3VtZW50RWxlbWVudCxNYXRoLm1heChXLmJvZHlbInNjcm9sbCIrYV0sZnRbInNjcm9sbCIrYV0sVy5ib2R5WyJvZmZzZXQiK2FdLGZ0WyJvZmZzZXQiK2FdLGZ0WyJjbGllbnQiK2FdKSk6ZHQ9PT12b2lkIDA/Zi5jc3MoVyxKLFkpOmYuc3R5bGUoVyxKLGR0LFkpfSxkLE4/QTp2b2lkIDAsTil9fSl9KSxmLmVhY2goWyJhamF4U3RhcnQiLCJhamF4U3RvcCIsImFqYXhDb21wbGV0ZSIsImFqYXhFcnJvciIsImFqYXhTdWNjZXNzIiwiYWpheFNlbmQiXSxmdW5jdGlvbihhLGQpe2YuZm5bZF09ZnVuY3Rpb24odil7cmV0dXJuIHRoaXMub24oZCx2KX19KSxmLmZuLmV4dGVuZCh7YmluZDpmdW5jdGlvbihhLGQsdil7cmV0dXJuIHRoaXMub24oYSxudWxsLGQsdil9LHVuYmluZDpmdW5jdGlvbihhLGQpe3JldHVybiB0aGlzLm9mZihhLG51bGwsZCl9LGRlbGVnYXRlOmZ1bmN0aW9uKGEsZCx2LHgpe3JldHVybiB0aGlzLm9uKGQsYSx2LHgpfSx1bmRlbGVnYXRlOmZ1bmN0aW9uKGEsZCx2KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD09PTE/dGhpcy5vZmYoYSwiKioiKTp0aGlzLm9mZihkLGF8fCIqKiIsdil9LGhvdmVyOmZ1bmN0aW9uKGEsZCl7cmV0dXJuIHRoaXMub24oIm1vdXNlZW50ZXIiLGEpLm9uKCJtb3VzZWxlYXZlIixkfHxhKX19KSxmLmVhY2goImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCByZXNpemUgc2Nyb2xsIGNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIGNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgY29udGV4dG1lbnUiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxkKXtmLmZuW2RdPWZ1bmN0aW9uKHYseCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MD90aGlzLm9uKGQsbnVsbCx2LHgpOnRoaXMudHJpZ2dlcihkKX19KTt2YXIgUm89L15bXHNcdUZFRkZceEEwXSt8KFteXHNcdUZFRkZceEEwXSlbXHNcdUZFRkZceEEwXSskL2c7Zi5wcm94eT1mdW5jdGlvbihhLGQpe3ZhciB2LHgsQTtpZih0eXBlb2YgZD09InN0cmluZyImJih2PWFbZF0sZD1hLGE9diksISFUKGEpKXJldHVybiB4PXMuY2FsbChhcmd1bWVudHMsMiksQT1mdW5jdGlvbigpe3JldHVybiBhLmFwcGx5KGR8fHRoaXMseC5jb25jYXQocy5jYWxsKGFyZ3VtZW50cykpKX0sQS5ndWlkPWEuZ3VpZD1hLmd1aWR8fGYuZ3VpZCsrLEF9LGYuaG9sZFJlYWR5PWZ1bmN0aW9uKGEpe2E/Zi5yZWFkeVdhaXQrKzpmLnJlYWR5KCEwKX0sZi5pc0FycmF5PUFycmF5LmlzQXJyYXksZi5wYXJzZUpTT049SlNPTi5wYXJzZSxmLm5vZGVOYW1lPVgsZi5pc0Z1bmN0aW9uPVQsZi5pc1dpbmRvdz1QLGYuY2FtZWxDYXNlPWd0LGYudHlwZT1fLGYubm93PURhdGUubm93LGYuaXNOdW1lcmljPWZ1bmN0aW9uKGEpe3ZhciBkPWYudHlwZShhKTtyZXR1cm4oZD09PSJudW1iZXIifHxkPT09InN0cmluZyIpJiYhaXNOYU4oYS1wYXJzZUZsb2F0KGEpKX0sZi50cmltPWZ1bmN0aW9uKGEpe3JldHVybiBhPT1udWxsPyIiOihhKyIiKS5yZXBsYWNlKFJvLCIkMSIpfSx0eXBlb2YgZGVmaW5lPT0iZnVuY3Rpb24iJiZkZWZpbmUuYW1kJiZkZWZpbmUoImpxdWVyeSIsW10sZnVuY3Rpb24oKXtyZXR1cm4gZn0pO3ZhciBMbz10LmpRdWVyeSx6bz10LiQ7cmV0dXJuIGYubm9Db25mbGljdD1mdW5jdGlvbihhKXtyZXR1cm4gdC4kPT09ZiYmKHQuJD16byksYSYmdC5qUXVlcnk9PT1mJiYodC5qUXVlcnk9TG8pLGZ9LHR5cGVvZiBlPiJ1IiYmKHQualF1ZXJ5PXQuJD1mKSxmfSl9KTt2YXIgcm89aWUoUmEoKSksdWQ9aWUoYWUoKSk7dmFyIFVsPWllKGFlKCksMSk7dmFyIEthPWllKGFlKCksMSk7dmFyIEg9S2EuZGVmYXVsdCxidD1mdW5jdGlvbih0LGUpe2lmKGJ0LmZhY3RvcnkodCxlKSlyZXR1cm4gYnQ7aWYodGhpcyBpbnN0YW5jZW9mIGJ0KXJldHVybiBIKHQpLkRhdGFUYWJsZShlKTtlPXQ7dmFyIG49dGhpcyxyPWU9PT12b2lkIDAscz10aGlzLmxlbmd0aDtyZXR1cm4gciYmKGU9e30pLHRoaXMuYXBpPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBXdCh0aGlzKX0sdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGk9e30sbz1zPjE/cWEoaSxlLCEwKTplLHU9MCxwLGI9dGhpcy5nZXRBdHRyaWJ1dGUoImlkIiksZz1idC5kZWZhdWx0cyxtPUgodGhpcyk7aWYodGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIT0idGFibGUiKXtPZShudWxsLDAsIk5vbi10YWJsZSBub2RlIGluaXRpYWxpc2F0aW9uICgiK3RoaXMubm9kZU5hbWUrIikiLDIpO3JldHVybn1IKHRoaXMpLnRyaWdnZXIoIm9wdGlvbnMuZHQiLG8pLGphKGcpLGVzKGcuY29sdW1uKSxzbihnLGcsITApLHNuKGcuY29sdW1uLGcuY29sdW1uLCEwKSxzbihnLEguZXh0ZW5kKG8sbS5kYXRhKCkpLCEwKTt2YXIgQz1idC5zZXR0aW5ncztmb3IodT0wLHA9Qy5sZW5ndGg7dTxwO3UrKyl7dmFyIHk9Q1t1XTtpZih5Lm5UYWJsZT09dGhpc3x8eS5uVEhlYWQmJnkublRIZWFkLnBhcmVudE5vZGU9PXRoaXN8fHkublRGb290JiZ5Lm5URm9vdC5wYXJlbnROb2RlPT10aGlzKXt2YXIgVD1vLmJSZXRyaWV2ZSE9PXZvaWQgMD9vLmJSZXRyaWV2ZTpnLmJSZXRyaWV2ZSxQPW8uYkRlc3Ryb3khPT12b2lkIDA/by5iRGVzdHJveTpnLmJEZXN0cm95O2lmKHJ8fFQpcmV0dXJuIHkub0luc3RhbmNlO2lmKFApe25ldyBidC5BcGkoeSkuZGVzdHJveSgpO2JyZWFrfWVsc2V7T2UoeSwwLCJDYW5ub3QgcmVpbml0aWFsaXNlIERhdGFUYWJsZSIsMyk7cmV0dXJufX1pZih5LnNUYWJsZUlkPT10aGlzLmlkKXtDLnNwbGljZSh1LDEpO2JyZWFrfX0oYj09PW51bGx8fGI9PT0iIikmJihiPSJEYXRhVGFibGVzX1RhYmxlXyIrYnQuZXh0Ll91bmlxdWUrKyx0aGlzLmlkPWIpO3ZhciBjPUguZXh0ZW5kKCEwLHt9LGJ0Lm1vZGVscy5vU2V0dGluZ3Mse3NEZXN0cm95V2lkdGg6bVswXS5zdHlsZS53aWR0aCxzSW5zdGFuY2U6YixzVGFibGVJZDpiLGNvbGdyb3VwOkgoIjxjb2xncm91cD4iKS5wcmVwZW5kVG8odGhpcyksZmFzdERhdGE6ZnVuY3Rpb24oQixMLFIpe3JldHVybiBSZShjLEIsTCxSKX19KTtjLm5UYWJsZT10aGlzLGMub0luaXQ9byxDLnB1c2goYyksYy5hcGk9bmV3IFd0KGMpLGMub0luc3RhbmNlPW4ubGVuZ3RoPT09MT9uOm0uZGF0YVRhYmxlKCksamEobyksby5hTGVuZ3RoTWVudSYmIW8uaURpc3BsYXlMZW5ndGgmJihvLmlEaXNwbGF5TGVuZ3RoPUFycmF5LmlzQXJyYXkoby5hTGVuZ3RoTWVudVswXSk/by5hTGVuZ3RoTWVudVswXVswXTpILmlzUGxhaW5PYmplY3Qoby5hTGVuZ3RoTWVudVswXSk/by5hTGVuZ3RoTWVudVswXS52YWx1ZTpvLmFMZW5ndGhNZW51WzBdKSxvPXFhKEguZXh0ZW5kKCEwLHt9LGcpLG8pLGxuKGMub0ZlYXR1cmVzLG8sWyJiUGFnaW5hdGUiLCJiTGVuZ3RoQ2hhbmdlIiwiYkZpbHRlciIsImJTb3J0IiwiYlNvcnRNdWx0aSIsImJJbmZvIiwiYlByb2Nlc3NpbmciLCJiQXV0b1dpZHRoIiwiYlNvcnRDbGFzc2VzIiwiYlNlcnZlclNpZGUiLCJiRGVmZXJSZW5kZXIiXSksbG4oYyxvLFsiYWpheCIsImZuRm9ybWF0TnVtYmVyIiwic1NlcnZlck1ldGhvZCIsImFhU29ydGluZyIsImFhU29ydGluZ0ZpeGVkIiwiYUxlbmd0aE1lbnUiLCJzUGFnaW5hdGlvblR5cGUiLCJpU3RhdGVEdXJhdGlvbiIsImJTb3J0Q2VsbHNUb3AiLCJpVGFiSW5kZXgiLCJzRG9tIiwiZm5TdGF0ZUxvYWRDYWxsYmFjayIsImZuU3RhdGVTYXZlQ2FsbGJhY2siLCJyZW5kZXJlciIsInNlYXJjaERlbGF5Iiwicm93SWQiLCJjYXB0aW9uIiwibGF5b3V0Iiwib3JkZXJEZXNjUmV2ZXJzZSIsInR5cGVEZXRlY3QiLFsiaUNvb2tpZUR1cmF0aW9uIiwiaVN0YXRlRHVyYXRpb24iXSxbIm9TZWFyY2giLCJvUHJldmlvdXNTZWFyY2giXSxbImFvU2VhcmNoQ29scyIsImFvUHJlU2VhcmNoQ29scyJdLFsiaURpc3BsYXlMZW5ndGgiLCJfaURpc3BsYXlMZW5ndGgiXV0pLGxuKGMub1Njcm9sbCxvLFtbInNTY3JvbGxYIiwic1giXSxbInNTY3JvbGxYSW5uZXIiLCJzWElubmVyIl0sWyJzU2Nyb2xsWSIsInNZIl0sWyJiU2Nyb2xsQ29sbGFwc2UiLCJiQ29sbGFwc2UiXV0pLGxuKGMub0xhbmd1YWdlLG8sImZuSW5mb0NhbGxiYWNrIiksQmUoYywiYW9EcmF3Q2FsbGJhY2siLG8uZm5EcmF3Q2FsbGJhY2spLEJlKGMsImFvU3RhdGVTYXZlUGFyYW1zIixvLmZuU3RhdGVTYXZlUGFyYW1zKSxCZShjLCJhb1N0YXRlTG9hZFBhcmFtcyIsby5mblN0YXRlTG9hZFBhcmFtcyksQmUoYywiYW9TdGF0ZUxvYWRlZCIsby5mblN0YXRlTG9hZGVkKSxCZShjLCJhb1Jvd0NhbGxiYWNrIixvLmZuUm93Q2FsbGJhY2spLEJlKGMsImFvUm93Q3JlYXRlZENhbGxiYWNrIixvLmZuQ3JlYXRlZFJvdyksQmUoYywiYW9IZWFkZXJDYWxsYmFjayIsby5mbkhlYWRlckNhbGxiYWNrKSxCZShjLCJhb0Zvb3RlckNhbGxiYWNrIixvLmZuRm9vdGVyQ2FsbGJhY2spLEJlKGMsImFvSW5pdENvbXBsZXRlIixvLmZuSW5pdENvbXBsZXRlKSxCZShjLCJhb1ByZURyYXdDYWxsYmFjayIsby5mblByZURyYXdDYWxsYmFjayksYy5yb3dJZEZuPUVuKG8ucm93SWQpLHJsKGMpO3ZhciBsPWMub0NsYXNzZXM7SC5leHRlbmQobCxidC5leHQuY2xhc3NlcyxvLm9DbGFzc2VzKSxtLmFkZENsYXNzKGwudGFibGUpLGMub0ZlYXR1cmVzLmJQYWdpbmF0ZXx8KG8uaURpc3BsYXlTdGFydD0wKSxjLmlJbml0RGlzcGxheVN0YXJ0PT09dm9pZCAwJiYoYy5pSW5pdERpc3BsYXlTdGFydD1vLmlEaXNwbGF5U3RhcnQsYy5faURpc3BsYXlTdGFydD1vLmlEaXNwbGF5U3RhcnQpO3ZhciBoPW8uaURlZmVyTG9hZGluZztpZihoIT09bnVsbCl7Yy5kZWZlckxvYWRpbmc9ITA7dmFyIF89QXJyYXkuaXNBcnJheShoKTtjLl9pUmVjb3Jkc0Rpc3BsYXk9Xz9oWzBdOmgsYy5faVJlY29yZHNUb3RhbD1fP2hbMV06aH12YXIgRj1bXSxPPXRoaXMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRoZWFkIiksZj1scyhjLE9bMF0pO2lmKG8uYW9Db2x1bW5zKUY9by5hb0NvbHVtbnM7ZWxzZSBpZihmLmxlbmd0aClmb3IodT0wLHA9ZlswXS5sZW5ndGg7dTxwO3UrKylGLnB1c2gobnVsbCk7Zm9yKHU9MCxwPUYubGVuZ3RoO3U8cDt1KyspbnMoYyk7c2woYyxvLmFvQ29sdW1uRGVmcyxGLGYsZnVuY3Rpb24oQixMKXt4aShjLEIsTCl9KTt2YXIgVT1tLmNoaWxkcmVuKCJ0Ym9keSIpLmZpbmQoInRyIikuZXEoMCk7aWYoVS5sZW5ndGgpe3ZhciBYPWZ1bmN0aW9uKEIsTCl7cmV0dXJuIEIuZ2V0QXR0cmlidXRlKCJkYXRhLSIrTCkhPT1udWxsP0w6bnVsbH07SChVWzBdKS5jaGlsZHJlbigidGgsIHRkIikuZWFjaChmdW5jdGlvbihCLEwpe3ZhciBSPWMuYW9Db2x1bW5zW0JdO2lmKFJ8fE9lKGMsMCwiSW5jb3JyZWN0IGNvbHVtbiBjb3VudCIsMTgpLFIubURhdGE9PT1CKXt2YXIgcT1YKEwsInNvcnQiKXx8WChMLCJvcmRlciIpLHo9WChMLCJmaWx0ZXIiKXx8WChMLCJzZWFyY2giKTsocSE9PW51bGx8fHohPT1udWxsKSYmKFIubURhdGE9e186QisiLmRpc3BsYXkiLHNvcnQ6cSE9PW51bGw/QisiLkBkYXRhLSIrcTp2b2lkIDAsdHlwZTpxIT09bnVsbD9CKyIuQGRhdGEtIitxOnZvaWQgMCxmaWx0ZXI6eiE9PW51bGw/QisiLkBkYXRhLSIrejp2b2lkIDB9LFIuX2lzQXJyYXlIb3N0PSEwLHhpKGMsQikpfX0pfUJlKGMsImFvRHJhd0NhbGxiYWNrIixqcik7dmFyIFE9Yy5vRmVhdHVyZXM7aWYoby5iU3RhdGVTYXZlJiYoUS5iU3RhdGVTYXZlPSEwKSxvLmFhU29ydGluZz09PXZvaWQgMCl7dmFyIEU9Yy5hYVNvcnRpbmc7Zm9yKHU9MCxwPUUubGVuZ3RoO3U8cDt1KyspRVt1XVsxXT1jLmFvQ29sdW1uc1t1XS5hc1NvcnRpbmdbMF19VGkoYyksQmUoYywiYW9EcmF3Q2FsbGJhY2siLGZ1bmN0aW9uKCl7KGMuYlNvcnRlZHx8RWUoYyk9PT0ic3NwInx8US5iRGVmZXJSZW5kZXIpJiZUaShjKX0pO3ZhciAkPW0uY2hpbGRyZW4oImNhcHRpb24iKTtjLmNhcHRpb24mJigkLmxlbmd0aD09PTAmJigkPUgoIjxjYXB0aW9uLz4iKS5hcHBlbmRUbyhtKSksJC5odG1sKGMuY2FwdGlvbikpLCQubGVuZ3RoJiYoJFswXS5fY2FwdGlvblNpZGU9JC5jc3MoImNhcHRpb24tc2lkZSIpLGMuY2FwdGlvbk5vZGU9JFswXSksTy5sZW5ndGg9PT0wJiYoTz1IKCI8dGhlYWQvPiIpLmFwcGVuZFRvKG0pKSxjLm5USGVhZD1PWzBdLEgoInRyIixPKS5hZGRDbGFzcyhsLnRoZWFkLnJvdyk7dmFyIHc9bS5jaGlsZHJlbigidGJvZHkiKTt3Lmxlbmd0aD09PTAmJih3PUgoIjx0Ym9keS8+IikuaW5zZXJ0QWZ0ZXIoTykpLGMublRCb2R5PXdbMF07dmFyIGs9bS5jaGlsZHJlbigidGZvb3QiKTtrLmxlbmd0aD09PTAmJihrPUgoIjx0Zm9vdC8+IikuYXBwZW5kVG8obSkpLGMublRGb290PWtbMF0sSCgidHIiLGspLmFkZENsYXNzKGwudGZvb3Qucm93KSxjLmFpRGlzcGxheT1jLmFpRGlzcGxheU1hc3Rlci5zbGljZSgpLGMuYkluaXRpYWxpc2VkPSEwO3ZhciBTPWMub0xhbmd1YWdlO0guZXh0ZW5kKCEwLFMsby5vTGFuZ3VhZ2UpLFMuc1VybD9ILmFqYXgoe2RhdGFUeXBlOiJqc29uIix1cmw6Uy5zVXJsLHN1Y2Nlc3M6ZnVuY3Rpb24oQil7c24oZy5vTGFuZ3VhZ2UsQiksSC5leHRlbmQoITAsUyxCLGMub0luaXQub0xhbmd1YWdlKSxadChjLG51bGwsImkxOG4iLFtjXSwhMCksa3IoYyl9LGVycm9yOmZ1bmN0aW9uKCl7T2UoYywwLCJpMThuIGZpbGUgbG9hZGluZyBlcnJvciIsMjEpLGtyKGMpfX0pOihadChjLG51bGwsImkxOG4iLFtjXSwhMCksa3IoYykpfSksbj1udWxsLHRoaXN9O2J0LmV4dD1sZT17YnV0dG9uczp7fSxjbGFzc2VzOnt9LGJ1aWxkZXI6Ii1zb3VyY2UtIixlcnJNb2RlOiJhbGVydCIsZmVhdHVyZTpbXSxmZWF0dXJlczp7fSxzZWFyY2g6W10sc2VsZWN0b3I6e2NlbGw6W10sY29sdW1uOltdLHJvdzpbXX0sbGVnYWN5OnthamF4Om51bGx9LHBhZ2VyOnt9LHJlbmRlcmVyOntwYWdlQnV0dG9uOnt9LGhlYWRlcjp7fX0sb3JkZXI6e30sdHlwZTp7Y2xhc3NOYW1lOnt9LGRldGVjdDpbXSxyZW5kZXI6e30sc2VhcmNoOnt9LG9yZGVyOnt9fSxfdW5pcXVlOjAsZm5WZXJzaW9uQ2hlY2s6YnQuZm5WZXJzaW9uQ2hlY2ssaUFwaUluZGV4OjAsc1ZlcnNpb246YnQudmVyc2lvbn07SC5leHRlbmQobGUse2FmbkZpbHRlcmluZzpsZS5zZWFyY2gsYVR5cGVzOmxlLnR5cGUuZGV0ZWN0LG9mblNlYXJjaDpsZS50eXBlLnNlYXJjaCxvU29ydDpsZS50eXBlLm9yZGVyLGFmblNvcnREYXRhOmxlLm9yZGVyLGFvRmVhdHVyZXM6bGUuZmVhdHVyZSxvU3RkQ2xhc3NlczpsZS5jbGFzc2VzLG9QYWdpbmF0aW9uOmxlLnBhZ2VyfSk7SC5leHRlbmQoYnQuZXh0LmNsYXNzZXMse2NvbnRhaW5lcjoiZHQtY29udGFpbmVyIixlbXB0eTp7cm93OiJkdC1lbXB0eSJ9LGluZm86e2NvbnRhaW5lcjoiZHQtaW5mbyJ9LGxheW91dDp7cm93OiJkdC1sYXlvdXQtcm93IixjZWxsOiJkdC1sYXlvdXQtY2VsbCIsdGFibGVSb3c6ImR0LWxheW91dC10YWJsZSIsdGFibGVDZWxsOiIiLHN0YXJ0OiJkdC1sYXlvdXQtc3RhcnQiLGVuZDoiZHQtbGF5b3V0LWVuZCIsZnVsbDoiZHQtbGF5b3V0LWZ1bGwifSxsZW5ndGg6e2NvbnRhaW5lcjoiZHQtbGVuZ3RoIixzZWxlY3Q6ImR0LWlucHV0In0sb3JkZXI6e2NhbkFzYzoiZHQtb3JkZXJhYmxlLWFzYyIsY2FuRGVzYzoiZHQtb3JkZXJhYmxlLWRlc2MiLGlzQXNjOiJkdC1vcmRlcmluZy1hc2MiLGlzRGVzYzoiZHQtb3JkZXJpbmctZGVzYyIsbm9uZToiZHQtb3JkZXJhYmxlLW5vbmUiLHBvc2l0aW9uOiJzb3J0aW5nXyJ9LHByb2Nlc3Npbmc6e2NvbnRhaW5lcjoiZHQtcHJvY2Vzc2luZyJ9LHNjcm9sbGluZzp7Ym9keToiZHQtc2Nyb2xsLWJvZHkiLGNvbnRhaW5lcjoiZHQtc2Nyb2xsIixmb290ZXI6e3NlbGY6ImR0LXNjcm9sbC1mb290Iixpbm5lcjoiZHQtc2Nyb2xsLWZvb3RJbm5lciJ9LGhlYWRlcjp7c2VsZjoiZHQtc2Nyb2xsLWhlYWQiLGlubmVyOiJkdC1zY3JvbGwtaGVhZElubmVyIn19LHNlYXJjaDp7Y29udGFpbmVyOiJkdC1zZWFyY2giLGlucHV0OiJkdC1pbnB1dCJ9LHRhYmxlOiJkYXRhVGFibGUiLHRib2R5OntjZWxsOiIiLHJvdzoiIn0sdGhlYWQ6e2NlbGw6IiIscm93OiIifSx0Zm9vdDp7Y2VsbDoiIixyb3c6IiJ9LHBhZ2luZzp7YWN0aXZlOiJjdXJyZW50IixidXR0b246ImR0LXBhZ2luZy1idXR0b24iLGNvbnRhaW5lcjoiZHQtcGFnaW5nIixkaXNhYmxlZDoiZGlzYWJsZWQiLG5hdjoiIn19KTt2YXIgbGUsV3QsSXQsUXQsYmk9e30sSm89L1tcclxuXHUyMDI4XS9nLFNpPS88KFtePl0qPikvZyxRbz1NYXRoLnBvdygyLDI4KSx6YT0vXlxkezIsNH1bLi8tXVxkezEsMn1bLi8tXVxkezEsMn0oW1QgXXsxfVxkezEsMn1bOi5dXGR7Mn0oWy46XVxkezJ9KT8pPyQvLHRsPW5ldyBSZWdFeHAoIihcXCIrWyIvIiwiLiIsIioiLCIrIiwiPyIsInwiLCIoIiwiKSIsIlsiLCJdIiwieyIsIn0iLCJcXCIsIiQiLCJeIiwiLSJdLmpvaW4oInxcXCIpKyIpIiwiZyIpLERpPS9bJ1x1MDBBMCwkwqPigqzCpSVcdTIwMDlcdTIwMkZcdTIwQkRcdTIwYTlcdTIwQkFyZmvJg86eXS9naSxWZT1mdW5jdGlvbih0KXtyZXR1cm4hdHx8dD09PSEwfHx0PT09Ii0ifSxKYT1mdW5jdGlvbih0KXt2YXIgZT1wYXJzZUludCh0LDEwKTtyZXR1cm4haXNOYU4oZSkmJmlzRmluaXRlKHQpP2U6bnVsbH0sUWE9ZnVuY3Rpb24odCxlKXtyZXR1cm4gYmlbZV18fChiaVtlXT1uZXcgUmVnRXhwKENpKGUpLCJnIikpLHR5cGVvZiB0PT0ic3RyaW5nIiYmZSE9PSIuIj90LnJlcGxhY2UoL1wuL2csIiIpLnJlcGxhY2UoYmlbZV0sIi4iKTp0fSxRbj1mdW5jdGlvbih0LGUsbixyKXt2YXIgcz10eXBlb2YgdCxpPXM9PT0ic3RyaW5nIjtyZXR1cm4gcz09PSJudW1iZXIifHxzPT09ImJpZ2ludCJ8fHImJlZlKHQpPyEwOihlJiZpJiYodD1RYSh0LGUpKSxuJiZpJiYodD10LnJlcGxhY2UoRGksIiIpKSwhaXNOYU4ocGFyc2VGbG9hdCh0KSkmJmlzRmluaXRlKHQpKX0sZWw9ZnVuY3Rpb24odCl7cmV0dXJuIFZlKHQpfHx0eXBlb2YgdD09InN0cmluZyJ9LFNyPWZ1bmN0aW9uKHQsZSxuLHIpe2lmKHImJlZlKHQpKXJldHVybiEwO2lmKHR5cGVvZiB0PT0ic3RyaW5nIiYmdC5tYXRjaCgvPChpbnB1dHxzZWxlY3QpL2kpKXJldHVybiBudWxsO3ZhciBzPWVsKHQpO3JldHVybiBzJiZRbihnbih0KSxlLG4scik/ITA6bnVsbH0sQ2U9ZnVuY3Rpb24odCxlLG4pe3ZhciByPVtdLHM9MCxpPXQubGVuZ3RoO2lmKG4hPT12b2lkIDApZm9yKDtzPGk7cysrKXRbc10mJnRbc11bZV0mJnIucHVzaCh0W3NdW2VdW25dKTtlbHNlIGZvcig7czxpO3MrKyl0W3NdJiZyLnB1c2godFtzXVtlXSk7cmV0dXJuIHJ9LGVyPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBzPVtdLGk9MCxvPWUubGVuZ3RoO2lmKHIhPT12b2lkIDApZm9yKDtpPG87aSsrKXRbZVtpXV0mJnRbZVtpXV1bbl0mJnMucHVzaCh0W2VbaV1dW25dW3JdKTtlbHNlIGZvcig7aTxvO2krKyl0W2VbaV1dJiZzLnB1c2godFtlW2ldXVtuXSk7cmV0dXJuIHN9LGFuPWZ1bmN0aW9uKHQsZSl7dmFyIG49W10scjtlPT09dm9pZCAwPyhlPTAscj10KToocj1lLGU9dCk7Zm9yKHZhciBzPWU7czxyO3MrKyluLnB1c2gocyk7cmV0dXJuIG59LHRzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxuPTAscj10Lmxlbmd0aDtuPHI7bisrKXRbbl0mJmUucHVzaCh0W25dKTtyZXR1cm4gZX0sZ249ZnVuY3Rpb24odCl7aWYoIXR8fHR5cGVvZiB0IT0ic3RyaW5nIilyZXR1cm4gdDtpZih0Lmxlbmd0aD5Rbyl0aHJvdyBuZXcgRXJyb3IoIkV4Y2VlZGVkIG1heCBzdHIgbGVuIik7dmFyIGU7dD10LnJlcGxhY2UoU2ksIiIpO2RvIGU9dCx0PXQucmVwbGFjZSgvPHNjcmlwdC9pLCIiKTt3aGlsZSh0IT09ZSk7cmV0dXJuIGV9LE5uPWZ1bmN0aW9uKHQpe3JldHVybiBBcnJheS5pc0FycmF5KHQpJiYodD10LmpvaW4oIiwiKSksdHlwZW9mIHQ9PSJzdHJpbmciP3QucmVwbGFjZSgvJi9nLCImYW1wOyIpLnJlcGxhY2UoLzwvZywiJmx0OyIpLnJlcGxhY2UoLz4vZywiJmd0OyIpLnJlcGxhY2UoLyIvZywiJnF1b3Q7Iik6dH0sRHI9ZnVuY3Rpb24odCxlKXtpZih0eXBlb2YgdCE9InN0cmluZyIpcmV0dXJuIHQ7dmFyIG49dC5ub3JtYWxpemUoIk5GRCIpO3JldHVybiBuLmxlbmd0aCE9PXQubGVuZ3RoPyhlPT09ITA/dCsiICI6IiIpK24ucmVwbGFjZSgvW1x1MDMwMC1cdTAzNmZdL2csIiIpOm59LG5sPWZ1bmN0aW9uKHQpe2lmKHQubGVuZ3RoPDIpcmV0dXJuITA7Zm9yKHZhciBlPXQuc2xpY2UoKS5zb3J0KCksbj1lWzBdLHI9MSxzPWUubGVuZ3RoO3I8cztyKyspe2lmKGVbcl09PT1uKXJldHVybiExO249ZVtyXX1yZXR1cm4hMH0seG49ZnVuY3Rpb24odCl7aWYoQXJyYXkuZnJvbSYmU2V0KXJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQodCkpO2lmKG5sKHQpKXJldHVybiB0LnNsaWNlKCk7dmFyIGU9W10sbixyLHM9dC5sZW5ndGgsaSxvPTA7dDpmb3Iocj0wO3I8cztyKyspe2ZvcihuPXRbcl0saT0wO2k8bztpKyspaWYoZVtpXT09PW4pY29udGludWUgdDtlLnB1c2gobiksbysrfXJldHVybiBlfSxBaT1mdW5jdGlvbih0LGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpZm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspQWkodCxlW25dKTtlbHNlIHQucHVzaChlKTtyZXR1cm4gdH07ZnVuY3Rpb24gT24odCxlKXtlJiZlLnNwbGl0KCIgIikuZm9yRWFjaChmdW5jdGlvbihuKXtuJiZ0LmNsYXNzTGlzdC5hZGQobil9KX1idC51dGlsPXtkaWFjcml0aWNzOmZ1bmN0aW9uKHQsZSl7dmFyIG49dHlwZW9mIHQ7aWYobiE9PSJmdW5jdGlvbiIpcmV0dXJuIERyKHQsZSk7RHI9dH0sZGVib3VuY2U6ZnVuY3Rpb24odCxlKXt2YXIgbjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcj10aGlzLHM9YXJndW1lbnRzO2NsZWFyVGltZW91dChuKSxuPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt0LmFwcGx5KHIscyl9LGV8fDI1MCl9fSx0aHJvdHRsZTpmdW5jdGlvbih0LGUpe3ZhciBuPWUhPT12b2lkIDA/ZToyMDAscixzO3JldHVybiBmdW5jdGlvbigpe3ZhciBpPXRoaXMsbz0rbmV3IERhdGUsdT1hcmd1bWVudHM7ciYmbzxyK24/KGNsZWFyVGltZW91dChzKSxzPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtyPXZvaWQgMCx0LmFwcGx5KGksdSl9LG4pKToocj1vLHQuYXBwbHkoaSx1KSl9fSxlc2NhcGVSZWdleDpmdW5jdGlvbih0KXtyZXR1cm4gdC5yZXBsYWNlKHRsLCJcXCQxIil9LHNldDpmdW5jdGlvbih0KXtpZihILmlzUGxhaW5PYmplY3QodCkpcmV0dXJuIGJ0LnV0aWwuc2V0KHQuXyk7aWYodD09PW51bGwpcmV0dXJuIGZ1bmN0aW9uKCl7fTtpZih0eXBlb2YgdD09ImZ1bmN0aW9uIilyZXR1cm4gZnVuY3Rpb24obixyLHMpe3Qobiwic2V0IixyLHMpfTtpZih0eXBlb2YgdD09InN0cmluZyImJih0LmluZGV4T2YoIi4iKSE9PS0xfHx0LmluZGV4T2YoIlsiKSE9PS0xfHx0LmluZGV4T2YoIigiKSE9PS0xKSl7dmFyIGU9ZnVuY3Rpb24obixyLHMpe2Zvcih2YXIgaT1WYShzKSxvLHU9aVtpLmxlbmd0aC0xXSxwLGIsZyxtLEM9MCx5PWkubGVuZ3RoLTE7Qzx5O0MrKyl7aWYoaVtDXT09PSJfX3Byb3RvX18ifHxpW0NdPT09ImNvbnN0cnVjdG9yIil0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBzZXQgcHJvdG90eXBlIHZhbHVlcyIpO2lmKHA9aVtDXS5tYXRjaChLbiksYj1pW0NdLm1hdGNoKEZuKSxwKXtpZihpW0NdPWlbQ10ucmVwbGFjZShLbiwiIiksbltpW0NdXT1bXSxvPWkuc2xpY2UoKSxvLnNwbGljZSgwLEMrMSksbT1vLmpvaW4oIi4iKSxBcnJheS5pc0FycmF5KHIpKWZvcih2YXIgVD0wLFA9ci5sZW5ndGg7VDxQO1QrKylnPXt9LGUoZyxyW1RdLG0pLG5baVtDXV0ucHVzaChnKTtlbHNlIG5baVtDXV09cjtyZXR1cm59ZWxzZSBiJiYoaVtDXT1pW0NdLnJlcGxhY2UoRm4sIiIpLG49bltpW0NdXShyKSk7KG5baVtDXV09PT1udWxsfHxuW2lbQ11dPT09dm9pZCAwKSYmKG5baVtDXV09e30pLG49bltpW0NdXX11Lm1hdGNoKEZuKT9uPW5bdS5yZXBsYWNlKEZuLCIiKV0ocik6blt1LnJlcGxhY2UoS24sIiIpXT1yfTtyZXR1cm4gZnVuY3Rpb24obixyKXtyZXR1cm4gZShuLHIsdCl9fWVsc2UgcmV0dXJuIGZ1bmN0aW9uKG4scil7blt0XT1yfX0sZ2V0OmZ1bmN0aW9uKHQpe2lmKEguaXNQbGFpbk9iamVjdCh0KSl7dmFyIGU9e307cmV0dXJuIEguZWFjaCh0LGZ1bmN0aW9uKHIscyl7cyYmKGVbcl09YnQudXRpbC5nZXQocykpfSksZnVuY3Rpb24ocixzLGksbyl7dmFyIHU9ZVtzXXx8ZS5fO3JldHVybiB1IT09dm9pZCAwP3UocixzLGksbyk6cn19ZWxzZXtpZih0PT09bnVsbClyZXR1cm4gZnVuY3Rpb24ocil7cmV0dXJuIHJ9O2lmKHR5cGVvZiB0PT0iZnVuY3Rpb24iKXJldHVybiBmdW5jdGlvbihyLHMsaSxvKXtyZXR1cm4gdChyLHMsaSxvKX07aWYodHlwZW9mIHQ9PSJzdHJpbmciJiYodC5pbmRleE9mKCIuIikhPT0tMXx8dC5pbmRleE9mKCJbIikhPT0tMXx8dC5pbmRleE9mKCIoIikhPT0tMSkpe3ZhciBuPWZ1bmN0aW9uKHIscyxpKXt2YXIgbyx1LHAsYjtpZihpIT09IiIpZm9yKHZhciBnPVZhKGkpLG09MCxDPWcubGVuZ3RoO208QzttKyspe2lmKG89Z1ttXS5tYXRjaChLbiksdT1nW21dLm1hdGNoKEZuKSxvKXtpZihnW21dPWdbbV0ucmVwbGFjZShLbiwiIiksZ1ttXSE9PSIiJiYocj1yW2dbbV1dKSxwPVtdLGcuc3BsaWNlKDAsbSsxKSxiPWcuam9pbigiLiIpLEFycmF5LmlzQXJyYXkocikpZm9yKHZhciB5PTAsVD1yLmxlbmd0aDt5PFQ7eSsrKXAucHVzaChuKHJbeV0scyxiKSk7dmFyIFA9b1swXS5zdWJzdHJpbmcoMSxvWzBdLmxlbmd0aC0xKTtyPVA9PT0iIj9wOnAuam9pbihQKTticmVha31lbHNlIGlmKHUpe2dbbV09Z1ttXS5yZXBsYWNlKEZuLCIiKSxyPXJbZ1ttXV0oKTtjb250aW51ZX1pZihyPT09bnVsbHx8cltnW21dXT09PW51bGwpcmV0dXJuIG51bGw7aWYocj09PXZvaWQgMHx8cltnW21dXT09PXZvaWQgMClyZXR1cm47cj1yW2dbbV1dfXJldHVybiByfTtyZXR1cm4gZnVuY3Rpb24ocixzKXtyZXR1cm4gbihyLHMsdCl9fWVsc2UgcmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiByW3RdfX19LHN0cmlwSHRtbDpmdW5jdGlvbih0KXt2YXIgZT10eXBlb2YgdDtpZihlPT09ImZ1bmN0aW9uIil7Z249dDtyZXR1cm59ZWxzZSBpZihlPT09InN0cmluZyIpcmV0dXJuIGduKHQpO3JldHVybiB0fSxlc2NhcGVIdG1sOmZ1bmN0aW9uKHQpe3ZhciBlPXR5cGVvZiB0O2lmKGU9PT0iZnVuY3Rpb24iKXtObj10O3JldHVybn1lbHNlIGlmKGU9PT0ic3RyaW5nInx8QXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gTm4odCk7cmV0dXJuIHR9LHVuaXF1ZTp4bn07ZnVuY3Rpb24gTnIodCl7dmFyIGU9ImEgYWEgYWkgYW8gYXMgYiBmbiBpIG0gbyBzICIsbixyLHM9e307SC5lYWNoKHQsZnVuY3Rpb24oaSl7bj1pLm1hdGNoKC9eKFteQS1aXSs/KShbQS1aXSkvKSxuJiZlLmluZGV4T2YoblsxXSsiICIpIT09LTEmJihyPWkucmVwbGFjZShuWzBdLG5bMl0udG9Mb3dlckNhc2UoKSksc1tyXT1pLG5bMV09PT0ibyImJk5yKHRbaV0pKX0pLHQuX2h1bmdhcmlhbk1hcD1zfWZ1bmN0aW9uIHNuKHQsZSxuKXt0Ll9odW5nYXJpYW5NYXB8fE5yKHQpO3ZhciByO0guZWFjaChlLGZ1bmN0aW9uKHMpe3I9dC5faHVuZ2FyaWFuTWFwW3NdLHIhPT12b2lkIDAmJihufHxlW3JdPT09dm9pZCAwKSYmKHIuY2hhckF0KDApPT09Im8iPyhlW3JdfHwoZVtyXT17fSksSC5leHRlbmQoITAsZVtyXSxlW3NdKSxzbih0W3JdLGVbcl0sbikpOmVbcl09ZVtzXSl9KX12YXIgX2U9ZnVuY3Rpb24odCxlLG4pe3RbZV0hPT12b2lkIDAmJih0W25dPXRbZV0pfTtmdW5jdGlvbiBqYSh0KXtfZSh0LCJvcmRlcmluZyIsImJTb3J0IiksX2UodCwib3JkZXJNdWx0aSIsImJTb3J0TXVsdGkiKSxfZSh0LCJvcmRlckNsYXNzZXMiLCJiU29ydENsYXNzZXMiKSxfZSh0LCJvcmRlckNlbGxzVG9wIiwiYlNvcnRDZWxsc1RvcCIpLF9lKHQsIm9yZGVyIiwiYWFTb3J0aW5nIiksX2UodCwib3JkZXJGaXhlZCIsImFhU29ydGluZ0ZpeGVkIiksX2UodCwicGFnaW5nIiwiYlBhZ2luYXRlIiksX2UodCwicGFnaW5nVHlwZSIsInNQYWdpbmF0aW9uVHlwZSIpLF9lKHQsInBhZ2VMZW5ndGgiLCJpRGlzcGxheUxlbmd0aCIpLF9lKHQsInNlYXJjaGluZyIsImJGaWx0ZXIiKSx0eXBlb2YgdC5zU2Nyb2xsWD09ImJvb2xlYW4iJiYodC5zU2Nyb2xsWD10LnNTY3JvbGxYPyIxMDAlIjoiIiksdHlwZW9mIHQuc2Nyb2xsWD09ImJvb2xlYW4iJiYodC5zY3JvbGxYPXQuc2Nyb2xsWD8iMTAwJSI6IiIpO3ZhciBlPXQuYW9TZWFyY2hDb2xzO2lmKGUpZm9yKHZhciBuPTAscj1lLmxlbmd0aDtuPHI7bisrKWVbbl0mJnNuKGJ0Lm1vZGVscy5vU2VhcmNoLGVbbl0pO3Quc2VydmVyU2lkZSYmIXQuc2VhcmNoRGVsYXkmJih0LnNlYXJjaERlbGF5PTQwMCl9ZnVuY3Rpb24gZXModCl7X2UodCwib3JkZXJhYmxlIiwiYlNvcnRhYmxlIiksX2UodCwib3JkZXJEYXRhIiwiYURhdGFTb3J0IiksX2UodCwib3JkZXJTZXF1ZW5jZSIsImFzU29ydGluZyIpLF9lKHQsIm9yZGVyRGF0YVR5cGUiLCJzb3J0RGF0YVR5cGUiKTt2YXIgZT10LmFEYXRhU29ydDt0eXBlb2YgZT09Im51bWJlciImJiFBcnJheS5pc0FycmF5KGUpJiYodC5hRGF0YVNvcnQ9W2VdKX1mdW5jdGlvbiBybCh0KXtpZighYnQuX19icm93c2VyKXt2YXIgZT17fTtidC5fX2Jyb3dzZXI9ZTt2YXIgbj1IKCI8ZGl2Lz4iKS5jc3Moe3Bvc2l0aW9uOiJmaXhlZCIsdG9wOjAsbGVmdDotMSp3aW5kb3cucGFnZVhPZmZzZXQsaGVpZ2h0OjEsd2lkdGg6MSxvdmVyZmxvdzoiaGlkZGVuIn0pLmFwcGVuZChIKCI8ZGl2Lz4iKS5jc3Moe3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOjEsbGVmdDoxLHdpZHRoOjEwMCxvdmVyZmxvdzoic2Nyb2xsIn0pLmFwcGVuZChIKCI8ZGl2Lz4iKS5jc3Moe3dpZHRoOiIxMDAlIixoZWlnaHQ6MTB9KSkpLmFwcGVuZFRvKCJib2R5Iikscj1uLmNoaWxkcmVuKCkscz1yLmNoaWxkcmVuKCk7ZS5iYXJXaWR0aD1yWzBdLm9mZnNldFdpZHRoLXJbMF0uY2xpZW50V2lkdGgsZS5iU2Nyb2xsYmFyTGVmdD1NYXRoLnJvdW5kKHMub2Zmc2V0KCkubGVmdCkhPT0xLG4ucmVtb3ZlKCl9SC5leHRlbmQodC5vQnJvd3NlcixidC5fX2Jyb3dzZXIpLHQub1Njcm9sbC5pQmFyV2lkdGg9YnQuX19icm93c2VyLmJhcldpZHRofWZ1bmN0aW9uIG5zKHQpe3ZhciBlPWJ0LmRlZmF1bHRzLmNvbHVtbixuPXQuYW9Db2x1bW5zLmxlbmd0aCxyPUguZXh0ZW5kKHt9LGJ0Lm1vZGVscy5vQ29sdW1uLGUse2FEYXRhU29ydDplLmFEYXRhU29ydD9lLmFEYXRhU29ydDpbbl0sbURhdGE6ZS5tRGF0YT9lLm1EYXRhOm4saWR4Om4sc2VhcmNoRml4ZWQ6e30sY29sRWw6SCgiPGNvbD4iKS5hdHRyKCJkYXRhLWR0LWNvbHVtbiIsbil9KTt0LmFvQ29sdW1ucy5wdXNoKHIpO3ZhciBzPXQuYW9QcmVTZWFyY2hDb2xzO3Nbbl09SC5leHRlbmQoe30sYnQubW9kZWxzLm9TZWFyY2gsc1tuXSl9ZnVuY3Rpb24geGkodCxlLG4pe3ZhciByPXQuYW9Db2x1bW5zW2VdO2lmKG4hPW51bGwpe2VzKG4pLHNuKGJ0LmRlZmF1bHRzLmNvbHVtbixuLCEwKSxuLm1EYXRhUHJvcCE9PXZvaWQgMCYmIW4ubURhdGEmJihuLm1EYXRhPW4ubURhdGFQcm9wKSxuLnNUeXBlJiYoci5fc01hbnVhbFR5cGU9bi5zVHlwZSksbi5jbGFzc05hbWUmJiFuLnNDbGFzcyYmKG4uc0NsYXNzPW4uY2xhc3NOYW1lKTt2YXIgcz1yLnNDbGFzcztILmV4dGVuZChyLG4pLGxuKHIsbiwic1dpZHRoIiwic1dpZHRoT3JpZyIpLHMhPT1yLnNDbGFzcyYmKHIuc0NsYXNzPXMrIiAiK3Iuc0NsYXNzKSxuLmlEYXRhU29ydCE9PXZvaWQgMCYmKHIuYURhdGFTb3J0PVtuLmlEYXRhU29ydF0pLGxuKHIsbiwiYURhdGFTb3J0Iil9dmFyIGk9ci5tRGF0YSxvPUVuKGkpO2lmKHIubVJlbmRlciYmQXJyYXkuaXNBcnJheShyLm1SZW5kZXIpKXt2YXIgdT1yLm1SZW5kZXIuc2xpY2UoKSxwPXUuc2hpZnQoKTtyLm1SZW5kZXI9YnQucmVuZGVyW3BdLmFwcGx5KHdpbmRvdyx1KX1yLl9yZW5kZXI9ci5tUmVuZGVyP0VuKHIubVJlbmRlcik6bnVsbDt2YXIgYj1mdW5jdGlvbihnKXtyZXR1cm4gdHlwZW9mIGc9PSJzdHJpbmciJiZnLmluZGV4T2YoIkAiKSE9PS0xfTtyLl9iQXR0clNyYz1ILmlzUGxhaW5PYmplY3QoaSkmJihiKGkuc29ydCl8fGIoaS50eXBlKXx8YihpLmZpbHRlcikpLHIuX3NldHRlcj1udWxsLHIuZm5HZXREYXRhPWZ1bmN0aW9uKGcsbSxDKXt2YXIgeT1vKGcsbSx2b2lkIDAsQyk7cmV0dXJuIHIuX3JlbmRlciYmbT9yLl9yZW5kZXIoeSxtLGcsQyk6eX0sci5mblNldERhdGE9ZnVuY3Rpb24oZyxtLEMpe3JldHVybiB2bihpKShnLG0sQyl9LHR5cGVvZiBpIT0ibnVtYmVyIiYmIXIuX2lzQXJyYXlIb3N0JiYodC5fcm93UmVhZE9iamVjdD0hMCksdC5vRmVhdHVyZXMuYlNvcnR8fChyLmJTb3J0YWJsZT0hMSl9ZnVuY3Rpb24gT3IodCl7eGwodCksaWwodCk7dmFyIGU9dC5vU2Nyb2xsOyhlLnNZIT09IiJ8fGUuc1ghPT0iIikmJmZzKHQpLFp0KHQsbnVsbCwiY29sdW1uLXNpemluZyIsW3RdKX1mdW5jdGlvbiBpbCh0KXtmb3IodmFyIGU9dC5hb0NvbHVtbnMsbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1ycyh0LFtuXSwhMSwhMSk7ZVtuXS5jb2xFbC5jc3MoIndpZHRoIixyKS5jc3MoIm1pbi13aWR0aCIscil9fWZ1bmN0aW9uIElpKHQsZSl7dmFyIG49UGkodCwiYlZpc2libGUiKTtyZXR1cm4gdHlwZW9mIG5bZV09PSJudW1iZXIiP25bZV06bnVsbH1mdW5jdGlvbiBucih0LGUpe3ZhciBuPVBpKHQsImJWaXNpYmxlIikscj1uLmluZGV4T2YoZSk7cmV0dXJuIHIhPT0tMT9yOm51bGx9ZnVuY3Rpb24gRXIodCl7dmFyIGU9dC5hb0hlYWRlcixuPXQuYW9Db2x1bW5zLHI9MDtpZihlLmxlbmd0aClmb3IodmFyIHM9MCxpPWVbMF0ubGVuZ3RoO3M8aTtzKyspbltzXS5iVmlzaWJsZSYmSChlWzBdW3NdLmNlbGwpLmNzcygiZGlzcGxheSIpIT09Im5vbmUiJiZyKys7cmV0dXJuIHJ9ZnVuY3Rpb24gUGkodCxlKXt2YXIgbj1bXTtyZXR1cm4gdC5hb0NvbHVtbnMubWFwKGZ1bmN0aW9uKHIscyl7cltlXSYmbi5wdXNoKHMpfSksbn1mdW5jdGlvbiBtaSh0LGUpe3JldHVybiBlPT09ITA/dC5uYW1lOmV9ZnVuY3Rpb24gRmkodCl7dmFyIGU9dC5hb0NvbHVtbnMsbj10LmFvRGF0YSxyPWJ0LmV4dC50eXBlLmRldGVjdCxzLGksbyx1LHAsYixnLG0sQztmb3Iocz0wLGk9ZS5sZW5ndGg7czxpO3MrKyl7aWYoZz1lW3NdLEM9W10sIWcuc1R5cGUmJmcuX3NNYW51YWxUeXBlKWcuc1R5cGU9Zy5fc01hbnVhbFR5cGU7ZWxzZSBpZighZy5zVHlwZSl7aWYoIXQudHlwZURldGVjdClyZXR1cm47Zm9yKG89MCx1PXIubGVuZ3RoO288dTtvKyspe3ZhciB5PXJbb10sVD15Lm9uZU9mLFA9eS5hbGxPZnx8eSxjPXkuaW5pdCxsPSExO2lmKG09bnVsbCxjJiYobT1taSh5LGModCxnLHMpKSxtKSl7Zy5zVHlwZT1tO2JyZWFrfWZvcihwPTAsYj1uLmxlbmd0aDtwPGImJiEobltwXSYmKENbcF09PT12b2lkIDAmJihDW3BdPVJlKHQscCxzLCJ0eXBlIikpLFQmJiFsJiYobD1taSh5LFQoQ1twXSx0KSkpLG09bWkoeSxQKENbcF0sdCkpLCFtJiZvIT09ci5sZW5ndGgtM3x8bT09PSJodG1sIiYmIVZlKENbcF0pKSk7cCsrKTtpZihUJiZsJiZtfHwhVCYmbSl7Zy5zVHlwZT1tO2JyZWFrfX1nLnNUeXBlfHwoZy5zVHlwZT0ic3RyaW5nIil9dmFyIGg9bGUudHlwZS5jbGFzc05hbWVbZy5zVHlwZV07aCYmKE1hKHQuYW9IZWFkZXIscyxoKSxNYSh0LmFvRm9vdGVyLHMsaCkpO3ZhciBfPWxlLnR5cGUucmVuZGVyW2cuc1R5cGVdO18mJiFnLl9yZW5kZXImJihnLl9yZW5kZXI9YnQudXRpbC5nZXQoXyksYWwodCxzKSl9fWZ1bmN0aW9uIGFsKHQsZSl7Zm9yKHZhciBuPXQuYW9EYXRhLHI9MDtyPG4ubGVuZ3RoO3IrKylpZihuW3JdLm5Ucil7dmFyIHM9UmUodCxyLGUsImRpc3BsYXkiKTtuW3JdLmRpc3BsYXlEYXRhW2VdPXMsQXIobltyXS5hbkNlbGxzW2VdLHMpfX1mdW5jdGlvbiBNYSh0LGUsbil7dC5mb3JFYWNoKGZ1bmN0aW9uKHIpe3JbZV0mJnJbZV0udW5pcXVlJiZPbihyW2VdLmNlbGwsbil9KX1mdW5jdGlvbiBzbCh0LGUsbixyLHMpe3ZhciBpLG8sdSxwLGIsZyxtLEM9dC5hb0NvbHVtbnM7aWYobilmb3IoaT0wLG89bi5sZW5ndGg7aTxvO2krKyluW2ldJiZuW2ldLm5hbWUmJihDW2ldLnNOYW1lPW5baV0ubmFtZSk7aWYoZSlmb3IoaT1lLmxlbmd0aC0xO2k+PTA7aS0tKXttPWVbaV07dmFyIHk9bS50YXJnZXQhPT12b2lkIDA/bS50YXJnZXQ6bS50YXJnZXRzIT09dm9pZCAwP20udGFyZ2V0czptLmFUYXJnZXRzO2ZvcihBcnJheS5pc0FycmF5KHkpfHwoeT1beV0pLHU9MCxwPXkubGVuZ3RoO3U8cDt1Kyspe3ZhciBUPXlbdV07aWYodHlwZW9mIFQ9PSJudW1iZXIiJiZUPj0wKXtmb3IoO0MubGVuZ3RoPD1UOylucyh0KTtzKFQsbSl9ZWxzZSBpZih0eXBlb2YgVD09Im51bWJlciImJlQ8MClzKEMubGVuZ3RoK1QsbSk7ZWxzZSBpZih0eXBlb2YgVD09InN0cmluZyIpZm9yKGI9MCxnPUMubGVuZ3RoO2I8ZztiKyspVD09PSJfYWxsIj9zKGIsbSk6VC5pbmRleE9mKCI6bmFtZSIpIT09LTE/Q1tiXS5zTmFtZT09PVQucmVwbGFjZSgiOm5hbWUiLCIiKSYmcyhiLG0pOnIuZm9yRWFjaChmdW5jdGlvbihQKXtpZihQW2JdKXt2YXIgYz1IKFBbYl0uY2VsbCk7VC5tYXRjaCgvXlthLXpdW1x3LV0qJC9pKSYmKFQ9Ii4iK1QpLGMuaXMoVCkmJnMoYixtKX19KX19aWYobilmb3IoaT0wLG89bi5sZW5ndGg7aTxvO2krKylzKGksbltpXSl9ZnVuY3Rpb24gcnModCxlLG4scil7QXJyYXkuaXNBcnJheShlKXx8KGU9QmkoZSkpO2Zvcih2YXIgcz0wLGksbz10LmFvQ29sdW1ucyx1PTAscD1lLmxlbmd0aDt1PHA7dSsrKXt2YXIgYj1vW2VbdV1dLGc9bj9iLnNXaWR0aE9yaWc6Yi5zV2lkdGg7aWYoISghciYmYi5iVmlzaWJsZT09PSExKSl7aWYoZz09bnVsbClyZXR1cm4gbnVsbDtpZih0eXBlb2YgZz09Im51bWJlciIpaT0icHgiLHMrPWc7ZWxzZXt2YXIgbT1nLm1hdGNoKC8oW1xkXC5dKykoW15cZF0qKS8pO20mJihzKz1tWzFdKjEsaT1tLmxlbmd0aD09PTM/bVsyXToicHgiKX19fXJldHVybiBzK2l9ZnVuY3Rpb24gQmkodCl7dmFyIGU9SCh0KS5jbG9zZXN0KCJbZGF0YS1kdC1jb2x1bW5dIikuYXR0cigiZGF0YS1kdC1jb2x1bW4iKTtyZXR1cm4gZT9lLnNwbGl0KCIsIikubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBuKjF9KTpbXX1mdW5jdGlvbiB5bih0LGUsbixyKXt2YXIgcz10LmFvRGF0YS5sZW5ndGgsaT1ILmV4dGVuZCghMCx7fSxidC5tb2RlbHMub1Jvdyx7c3JjOm4/ImRvbSI6ImRhdGEiLGlkeDpzfSk7aS5fYURhdGE9ZSx0LmFvRGF0YS5wdXNoKGkpO2Zvcih2YXIgbz10LmFvQ29sdW1ucyx1PTAscD1vLmxlbmd0aDt1PHA7dSsrKW9bdV0uc1R5cGU9bnVsbDt0LmFpRGlzcGxheU1hc3Rlci5wdXNoKHMpO3ZhciBiPXQucm93SWRGbihlKTtyZXR1cm4gYiE9PXZvaWQgMCYmKHQuYUlkc1tiXT1pKSwobnx8IXQub0ZlYXR1cmVzLmJEZWZlclJlbmRlcikmJmFzKHQscyxuLHIpLHN9ZnVuY3Rpb24gTmkodCxlKXt2YXIgbjtyZXR1cm4gZSBpbnN0YW5jZW9mIEh8fChlPUgoZSkpLGUubWFwKGZ1bmN0aW9uKHIscyl7cmV0dXJuIG49aXModCxzKSx5bih0LG4uZGF0YSxzLG4uY2VsbHMpfSl9ZnVuY3Rpb24gUmUodCxlLG4scil7cj09PSJzZWFyY2giP3I9ImZpbHRlciI6cj09PSJvcmRlciImJihyPSJzb3J0Iik7dmFyIHM9dC5hb0RhdGFbZV07aWYocyl7dmFyIGk9dC5pRHJhdyxvPXQuYW9Db2x1bW5zW25dLHU9cy5fYURhdGEscD1vLnNEZWZhdWx0Q29udGVudCxiPW8uZm5HZXREYXRhKHUscix7c2V0dGluZ3M6dCxyb3c6ZSxjb2w6bn0pO2lmKHIhPT0iZGlzcGxheSImJmImJnR5cGVvZiBiPT0ib2JqZWN0IiYmYi5ub2RlTmFtZSYmKGI9Yi5pbm5lckhUTUwpLGI9PT12b2lkIDApcmV0dXJuIHQuaURyYXdFcnJvciE9aSYmcD09PW51bGwmJihPZSh0LDAsIlJlcXVlc3RlZCB1bmtub3duIHBhcmFtZXRlciAiKyh0eXBlb2Ygby5tRGF0YT09ImZ1bmN0aW9uIj8ie2Z1bmN0aW9ufSI6IiciK28ubURhdGErIiciKSsiIGZvciByb3cgIitlKyIsIGNvbHVtbiAiK24sNCksdC5pRHJhd0Vycm9yPWkpLHA7aWYoKGI9PT11fHxiPT09bnVsbCkmJnAhPT1udWxsJiZyIT09dm9pZCAwKWI9cDtlbHNlIGlmKHR5cGVvZiBiPT0iZnVuY3Rpb24iKXJldHVybiBiLmNhbGwodSk7aWYoYj09PW51bGwmJnI9PT0iZGlzcGxheSIpcmV0dXJuIiI7aWYocj09PSJmaWx0ZXIiKXt2YXIgZz1idC5leHQudHlwZS5zZWFyY2g7Z1tvLnNUeXBlXSYmKGI9Z1tvLnNUeXBlXShiKSl9cmV0dXJuIGJ9fWZ1bmN0aW9uIG9sKHQsZSxuLHIpe3ZhciBzPXQuYW9Db2x1bW5zW25dLGk9dC5hb0RhdGFbZV0uX2FEYXRhO3MuZm5TZXREYXRhKGkscix7c2V0dGluZ3M6dCxyb3c6ZSxjb2w6bn0pfWZ1bmN0aW9uIEFyKHQsZSl7ZSYmdHlwZW9mIGU9PSJvYmplY3QiJiZlLm5vZGVOYW1lP0godCkuZW1wdHkoKS5hcHBlbmQoZSk6dC5pbm5lckhUTUw9ZX12YXIgS249L1xbLio/XF0kLyxGbj0vXChcKSQvO2Z1bmN0aW9uIFZhKHQpe3ZhciBlPXQubWF0Y2goLyhcXC58W14uXSkrL2cpfHxbIiJdO3JldHVybiBlLm1hcChmdW5jdGlvbihuKXtyZXR1cm4gbi5yZXBsYWNlKC9cXFwuL2csIi4iKX0pfXZhciBFbj1idC51dGlsLmdldCx2bj1idC51dGlsLnNldDtmdW5jdGlvbiBIYSh0KXtyZXR1cm4gQ2UodC5hb0RhdGEsIl9hRGF0YSIpfWZ1bmN0aW9uIE9pKHQpe3QuYW9EYXRhLmxlbmd0aD0wLHQuYWlEaXNwbGF5TWFzdGVyLmxlbmd0aD0wLHQuYWlEaXNwbGF5Lmxlbmd0aD0wLHQuYUlkcz17fX1mdW5jdGlvbiBScih0LGUsbixyKXt2YXIgcz10LmFvRGF0YVtlXSxpLG87aWYocy5fYVNvcnREYXRhPW51bGwscy5fYUZpbHRlckRhdGE9bnVsbCxzLmRpc3BsYXlEYXRhPW51bGwsbj09PSJkb20ifHwoIW58fG49PT0iYXV0byIpJiZzLnNyYz09PSJkb20iKXMuX2FEYXRhPWlzKHQscyxyLHI9PT12b2lkIDA/dm9pZCAwOnMuX2FEYXRhKS5kYXRhO2Vsc2V7dmFyIHU9cy5hbkNlbGxzLHA9RWkodCxlKTtpZih1KWlmKHIhPT12b2lkIDApQXIodVtyXSxwW3JdKTtlbHNlIGZvcihpPTAsbz11Lmxlbmd0aDtpPG87aSsrKUFyKHVbaV0scFtpXSl9dmFyIGI9dC5hb0NvbHVtbnM7aWYociE9PXZvaWQgMCliW3JdLnNUeXBlPW51bGwsYltyXS5tYXhMZW5TdHJpbmc9bnVsbDtlbHNle2ZvcihpPTAsbz1iLmxlbmd0aDtpPG87aSsrKWJbaV0uc1R5cGU9bnVsbCxiW2ldLm1heExlblN0cmluZz1udWxsO3NzKHQscyl9fWZ1bmN0aW9uIGlzKHQsZSxuLHIpe3ZhciBzPVtdLGk9ZS5maXJzdENoaWxkLG8sdSxwPTAsYixnPXQuYW9Db2x1bW5zLG09dC5fcm93UmVhZE9iamVjdDtyPXIhPT12b2lkIDA/cjptP3t9OltdO3ZhciBDPWZ1bmN0aW9uKGgsXyl7aWYodHlwZW9mIGg9PSJzdHJpbmciKXt2YXIgRj1oLmluZGV4T2YoIkAiKTtpZihGIT09LTEpe3ZhciBPPWguc3Vic3RyaW5nKEYrMSksZj12bihoKTtmKHIsXy5nZXRBdHRyaWJ1dGUoTykpfX19LHk9ZnVuY3Rpb24oaCl7aWYobj09PXZvaWQgMHx8bj09PXApaWYodT1nW3BdLGI9aC5pbm5lckhUTUwudHJpbSgpLHUmJnUuX2JBdHRyU3JjKXt2YXIgXz12bih1Lm1EYXRhLl8pO18ocixiKSxDKHUubURhdGEuc29ydCxoKSxDKHUubURhdGEudHlwZSxoKSxDKHUubURhdGEuZmlsdGVyLGgpfWVsc2UgbT8odS5fc2V0dGVyfHwodS5fc2V0dGVyPXZuKHUubURhdGEpKSx1Ll9zZXR0ZXIocixiKSk6cltwXT1iO3ArK307aWYoaSlmb3IoO2k7KW89aS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpLChvPT0iVEQifHxvPT0iVEgiKSYmKHkoaSkscy5wdXNoKGkpKSxpPWkubmV4dFNpYmxpbmc7ZWxzZXtzPWUuYW5DZWxscztmb3IodmFyIFQ9MCxQPXMubGVuZ3RoO1Q8UDtUKyspeShzW1RdKX12YXIgYz1lLmZpcnN0Q2hpbGQ/ZTplLm5UcjtpZihjKXt2YXIgbD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtsJiZ2bih0LnJvd0lkKShyLGwpfXJldHVybntkYXRhOnIsY2VsbHM6c319ZnVuY3Rpb24gRWkodCxlKXtsZXQgbj10LmFvRGF0YVtlXSxyPXQuYW9Db2x1bW5zO2lmKCFuLmRpc3BsYXlEYXRhKXtuLmRpc3BsYXlEYXRhPVtdO2Zvcih2YXIgcz0wLGk9ci5sZW5ndGg7czxpO3MrKyluLmRpc3BsYXlEYXRhLnB1c2goUmUodCxlLHMsImRpc3BsYXkiKSl9cmV0dXJuIG4uZGlzcGxheURhdGF9ZnVuY3Rpb24gYXModCxlLG4scil7dmFyIHM9dC5hb0RhdGFbZV0saT1zLl9hRGF0YSxvPVtdLHUscCxiLGcsbSxDLHk9dC5vQ2xhc3Nlcy50Ym9keS5yb3c7aWYocy5uVHI9PT1udWxsKXtmb3IodT1ufHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ciIpLHMublRyPXUscy5hbkNlbGxzPW8sT24odSx5KSx1Ll9EVF9Sb3dJbmRleD1lLHNzKHQscyksZz0wLG09dC5hb0NvbHVtbnMubGVuZ3RoO2c8bTtnKyspe2I9dC5hb0NvbHVtbnNbZ10sQz0hKG4mJnJbZ10pLHA9Qz9kb2N1bWVudC5jcmVhdGVFbGVtZW50KGIuc0NlbGxUeXBlKTpyW2ddLHB8fE9lKHQsMCwiSW5jb3JyZWN0IGNvbHVtbiBjb3VudCIsMTgpLHAuX0RUX0NlbGxJbmRleD17cm93OmUsY29sdW1uOmd9LG8ucHVzaChwKTt2YXIgVD1FaSh0LGUpOyhDfHwoYi5tUmVuZGVyfHxiLm1EYXRhIT09ZykmJighSC5pc1BsYWluT2JqZWN0KGIubURhdGEpfHxiLm1EYXRhLl8hPT1nKyIuZGlzcGxheSIpKSYmQXIocCxUW2ddKSxPbihwLGIuc0NsYXNzKSxiLmJWaXNpYmxlJiZDP3UuYXBwZW5kQ2hpbGQocCk6IWIuYlZpc2libGUmJiFDJiZwLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocCksYi5mbkNyZWF0ZWRDZWxsJiZiLmZuQ3JlYXRlZENlbGwuY2FsbCh0Lm9JbnN0YW5jZSxwLFJlKHQsZSxnKSxpLGUsZyl9WnQodCwiYW9Sb3dDcmVhdGVkQ2FsbGJhY2siLCJyb3ctY3JlYXRlZCIsW3UsaSxlLG9dKX1lbHNlIE9uKHMublRyLHkpfWZ1bmN0aW9uIHNzKHQsZSl7dmFyIG49ZS5uVHIscj1lLl9hRGF0YTtpZihuKXt2YXIgcz10LnJvd0lkRm4ocik7aWYocyYmKG4uaWQ9cyksci5EVF9Sb3dDbGFzcyl7dmFyIGk9ci5EVF9Sb3dDbGFzcy5zcGxpdCgiICIpO2UuX19yb3djPWUuX19yb3djP3huKGUuX19yb3djLmNvbmNhdChpKSk6aSxIKG4pLnJlbW92ZUNsYXNzKGUuX19yb3djLmpvaW4oIiAiKSkuYWRkQ2xhc3Moci5EVF9Sb3dDbGFzcyl9ci5EVF9Sb3dBdHRyJiZIKG4pLmF0dHIoci5EVF9Sb3dBdHRyKSxyLkRUX1Jvd0RhdGEmJkgobikuZGF0YShyLkRUX1Jvd0RhdGEpfX1mdW5jdGlvbiBVYSh0LGUpe3ZhciBuPXQub0NsYXNzZXMscj10LmFvQ29sdW1ucyxzLGksbyx1PWU9PT0iaGVhZGVyIj90Lm5USGVhZDp0Lm5URm9vdCxwPWU9PT0iaGVhZGVyIj8ic1RpdGxlIjplO2lmKHUpe2lmKChlPT09ImhlYWRlciJ8fENlKHQuYW9Db2x1bW5zLHApLmpvaW4oIiIpKSYmKG89SCgidHIiLHUpLG8ubGVuZ3RofHwobz1IKCI8dHIvPiIpLmFwcGVuZFRvKHUpKSxvLmxlbmd0aD09PTEpKXt2YXIgYj1IKCJ0ZCwgdGgiLG8pO2ZvcihzPWIubGVuZ3RoLGk9ci5sZW5ndGg7czxpO3MrKylIKCI8dGgvPiIpLmh0bWwocltzXVtwXXx8IiIpLmFwcGVuZFRvKG8pfXZhciBnPWxzKHQsdSwhMCk7ZT09PSJoZWFkZXIiP3QuYW9IZWFkZXI9Zzp0LmFvRm9vdGVyPWcsSCh1KS5jaGlsZHJlbigidHIiKS5hdHRyKCJyb2xlIiwicm93IiksSCh1KS5jaGlsZHJlbigidHIiKS5jaGlsZHJlbigidGgsIHRkIikuZWFjaChmdW5jdGlvbigpe0ZyKHQsZSkodCxIKHRoaXMpLG4pfSl9fWZ1bmN0aW9uIG9zKHQsZSxuKXt2YXIgcixzLGksbz1bXSx1PVtdLHA9dC5hb0NvbHVtbnMsYj1wLmxlbmd0aCxnLG07aWYoZSl7Zm9yKG58fChuPWFuKGIpLmZpbHRlcihmdW5jdGlvbihUKXtyZXR1cm4gcFtUXS5iVmlzaWJsZX0pKSxyPTA7cjxlLmxlbmd0aDtyKyspb1tyXT1lW3JdLnNsaWNlKCkuZmlsdGVyKGZ1bmN0aW9uKFQsUCl7cmV0dXJuIG4uaW5jbHVkZXMoUCl9KSx1LnB1c2goW10pO2ZvcihyPTA7cjxvLmxlbmd0aDtyKyspZm9yKHM9MDtzPG9bcl0ubGVuZ3RoO3MrKylpZihnPTEsbT0xLHVbcl1bc109PT12b2lkIDApe2ZvcihpPW9bcl1bc10uY2VsbDtvW3IrZ10hPT12b2lkIDAmJm9bcl1bc10uY2VsbD09b1tyK2ddW3NdLmNlbGw7KXVbcitnXVtzXT1udWxsLGcrKztmb3IoO29bcl1bcyttXSE9PXZvaWQgMCYmb1tyXVtzXS5jZWxsPT1vW3JdW3MrbV0uY2VsbDspe2Zvcih2YXIgQz0wO0M8ZztDKyspdVtyK0NdW3MrbV09bnVsbDttKyt9dmFyIHk9SCgic3Bhbi5kdC1jb2x1bW4tdGl0bGUiLGkpO3Vbcl1bc109e2NlbGw6aSxjb2xzcGFuOm0scm93c3BhbjpnLHRpdGxlOnkubGVuZ3RoP3kuaHRtbCgpOkgoaSkuaHRtbCgpfX1yZXR1cm4gdX19ZnVuY3Rpb24gSXIodCxlKXtmb3IodmFyIG49b3ModCxlKSxyLHMsaT0wO2k8ZS5sZW5ndGg7aSsrKXtpZihyPWVbaV0ucm93LHIpZm9yKDtzPXIuZmlyc3RDaGlsZDspci5yZW1vdmVDaGlsZChzKTtmb3IodmFyIG89MDtvPG5baV0ubGVuZ3RoO28rKyl7dmFyIHU9bltpXVtvXTt1JiZIKHUuY2VsbCkuYXBwZW5kVG8ocikuYXR0cigicm93c3BhbiIsdS5yb3dzcGFuKS5hdHRyKCJjb2xzcGFuIix1LmNvbHNwYW4pfX19ZnVuY3Rpb24gTG4odCxlKXtmbCh0KTt2YXIgbj1adCh0LCJhb1ByZURyYXdDYWxsYmFjayIsInByZURyYXciLFt0XSk7aWYobi5pbmRleE9mKCExKSE9PS0xKXtrZSh0LCExKTtyZXR1cm59dmFyIHI9W10scz0wLGk9RWUodCk9PSJzc3AiLG89dC5haURpc3BsYXksdT10Ll9pRGlzcGxheVN0YXJ0LHA9dC5mbkRpc3BsYXlFbmQoKSxiPXQuYW9Db2x1bW5zLGc9SCh0Lm5UQm9keSk7aWYodC5iRHJhd2luZz0hMCx0LmRlZmVyTG9hZGluZyl0LmRlZmVyTG9hZGluZz0hMSx0LmlEcmF3Kyssa2UodCwhMSk7ZWxzZSBpZighaSl0LmlEcmF3Kys7ZWxzZSBpZighdC5iRGVzdHJveWluZyYmIWUpe3QuaURyYXc9PT0wJiZnLmVtcHR5KCkuYXBwZW5kKFdhKHQpKSxobCh0KTtyZXR1cm59aWYoby5sZW5ndGghPT0wKWZvcih2YXIgbT1pPzA6dSxDPWk/dC5hb0RhdGEubGVuZ3RoOnAseT1tO3k8Qzt5Kyspe3ZhciBUPW9beV0sUD10LmFvRGF0YVtUXTtQLm5Ucj09PW51bGwmJmFzKHQsVCk7Zm9yKHZhciBjPVAublRyLGw9MDtsPGIubGVuZ3RoO2wrKyl7dmFyIGg9YltsXSxfPVAuYW5DZWxsc1tsXTtPbihfLGxlLnR5cGUuY2xhc3NOYW1lW2guc1R5cGVdKSxPbihfLHQub0NsYXNzZXMudGJvZHkuY2VsbCl9WnQodCwiYW9Sb3dDYWxsYmFjayIsbnVsbCxbYyxQLl9hRGF0YSxzLHksVF0pLHIucHVzaChjKSxzKyt9ZWxzZSByWzBdPVdhKHQpO1p0KHQsImFvSGVhZGVyQ2FsbGJhY2siLCJoZWFkZXIiLFtIKHQublRIZWFkKS5jaGlsZHJlbigidHIiKVswXSxIYSh0KSx1LHAsb10pLFp0KHQsImFvRm9vdGVyQ2FsbGJhY2siLCJmb290ZXIiLFtIKHQublRGb290KS5jaGlsZHJlbigidHIiKVswXSxIYSh0KSx1LHAsb10pLGdbMF0ucmVwbGFjZUNoaWxkcmVuP2dbMF0ucmVwbGFjZUNoaWxkcmVuLmFwcGx5KGdbMF0scik6KGcuY2hpbGRyZW4oKS5kZXRhY2goKSxnLmFwcGVuZChIKHIpKSksSCh0Lm5UYWJsZVdyYXBwZXIpLnRvZ2dsZUNsYXNzKCJkdC1lbXB0eS1mb290ZXIiLEgoInRyIix0Lm5URm9vdCkubGVuZ3RoPT09MCksWnQodCwiYW9EcmF3Q2FsbGJhY2siLCJkcmF3IixbdF0sITApLHQuYlNvcnRlZD0hMSx0LmJGaWx0ZXJlZD0hMSx0LmJEcmF3aW5nPSExfWZ1bmN0aW9uIFJuKHQsZSxuKXt2YXIgcj10Lm9GZWF0dXJlcyxzPXIuYlNvcnQsaT1yLmJGaWx0ZXI7KG49PT12b2lkIDB8fG49PT0hMCkmJihGaSh0KSxzJiZ6aSh0KSxpP3RyKHQsdC5vUHJldmlvdXNTZWFyY2gpOnQuYWlEaXNwbGF5PXQuYWlEaXNwbGF5TWFzdGVyLnNsaWNlKCkpLGUhPT0hMCYmKHQuX2lEaXNwbGF5U3RhcnQ9MCksdC5fZHJhd0hvbGQ9ZSxMbih0KSx0Ll9kcmF3SG9sZD0hMX1mdW5jdGlvbiBXYSh0KXt2YXIgZT10Lm9MYW5ndWFnZSxuPWUuc1plcm9SZWNvcmRzLHI9RWUodCk7cmV0dXJuIHQuaURyYXc8MSYmcj09PSJzc3AifHx0LmlEcmF3PD0xJiZyPT09ImFqYXgiP249ZS5zTG9hZGluZ1JlY29yZHM6ZS5zRW1wdHlUYWJsZSYmdC5mblJlY29yZHNUb3RhbCgpPT09MCYmKG49ZS5zRW1wdHlUYWJsZSksSCgiPHRyLz4iKS5hcHBlbmQoSCgiPHRkIC8+Iix7Y29sU3BhbjpFcih0KSxjbGFzczp0Lm9DbGFzc2VzLmVtcHR5LnJvd30pLmh0bWwobikpWzBdfWZ1bmN0aW9uIF9pKHQsZSxuKXtpZihBcnJheS5pc0FycmF5KG4pKXtmb3IodmFyIHI9MDtyPG4ubGVuZ3RoO3IrKylfaSh0LGUsbltyXSk7cmV0dXJufXZhciBzPXRbZV07SC5pc1BsYWluT2JqZWN0KG4pP24uZmVhdHVyZXM/KG4ucm93SWQmJih0LmlkPW4ucm93SWQpLG4ucm93Q2xhc3MmJih0LmNsYXNzTmFtZT1uLnJvd0NsYXNzKSxzLmlkPW4uaWQscy5jbGFzc05hbWU9bi5jbGFzc05hbWUsX2kodCxlLG4uZmVhdHVyZXMpKTpPYmplY3Qua2V5cyhuKS5tYXAoZnVuY3Rpb24oaSl7cy5jb250ZW50cy5wdXNoKHtmZWF0dXJlOmksb3B0czpuW2ldfSl9KTpzLmNvbnRlbnRzLnB1c2gobil9ZnVuY3Rpb24gbGwodCxlLG4pe2Zvcih2YXIgcixzPTA7czx0Lmxlbmd0aDtzKyspaWYocj10W3NdLHIucm93TnVtPT09ZSYmKG49PT0iZnVsbCImJnIuZnVsbHx8KG49PT0ic3RhcnQifHxuPT09ImVuZCIpJiYoci5zdGFydHx8ci5lbmQpKSlyZXR1cm4gcltuXXx8KHJbbl09e2NvbnRlbnRzOltdfSkscjtyZXR1cm4gcj17cm93TnVtOmV9LHJbbl09e2NvbnRlbnRzOltdfSx0LnB1c2gocikscn1mdW5jdGlvbiBHYSh0LGUsbil7dmFyIHI9W107SC5lYWNoKGUsZnVuY3Rpb24oaSxvKXtpZihvIT09bnVsbCl7dmFyIHU9aS5tYXRjaCgvXihbYS16XSspKFswLTldKikoW0EtWmEtel0qKSQvKSxwPXVbMl0/dVsyXSoxOjAsYj11WzNdP3VbM10udG9Mb3dlckNhc2UoKToiZnVsbCI7aWYodVsxXT09PW4pe3ZhciBnPWxsKHIscCxiKTtfaShnLGIsbyl9fX0pLHIuc29ydChmdW5jdGlvbihpLG8pe3ZhciB1PWkucm93TnVtLHA9by5yb3dOdW07aWYodT09PXApe3ZhciBiPWkuZnVsbCYmIW8uZnVsbD8tMToxO3JldHVybiBuPT09ImJvdHRvbSI/YiotMTpifXJldHVybiBwLXV9KSxuPT09ImJvdHRvbSImJnIucmV2ZXJzZSgpO2Zvcih2YXIgcz0wO3M8ci5sZW5ndGg7cysrKWRlbGV0ZSByW3NdLnJvd051bSxkbCh0LHJbc10pO3JldHVybiByfWZ1bmN0aW9uIGRsKHQsZSl7dmFyIG49ZnVuY3Rpb24ocyxpKXtyZXR1cm4gbGUuZmVhdHVyZXNbc118fE9lKHQsMCwiVW5rbm93biBmZWF0dXJlOiAiK3MpLGxlLmZlYXR1cmVzW3NdLmFwcGx5KHRoaXMsW3QsaV0pfSxyPWZ1bmN0aW9uKHMpe2lmKGVbc10pZm9yKHZhciBpPWVbc10uY29udGVudHMsbz0wLHU9aS5sZW5ndGg7bzx1O28rKylpZihpW29dKXtpZih0eXBlb2YgaVtvXT09InN0cmluZyIpaVtvXT1uKGlbb10sbnVsbCk7ZWxzZSBpZihILmlzUGxhaW5PYmplY3QoaVtvXSkpaVtvXT1uKGlbb10uZmVhdHVyZSxpW29dLm9wdHMpO2Vsc2UgaWYodHlwZW9mIGlbb10ubm9kZT09ImZ1bmN0aW9uIilpW29dPWlbb10ubm9kZSh0KTtlbHNlIGlmKHR5cGVvZiBpW29dPT0iZnVuY3Rpb24iKXt2YXIgcD1pW29dKHQpO2lbb109dHlwZW9mIHAubm9kZT09ImZ1bmN0aW9uIj9wLm5vZGUoKTpwfX1lbHNlIGNvbnRpbnVlfTtyKCJzdGFydCIpLHIoImVuZCIpLHIoImZ1bGwiKX1mdW5jdGlvbiB1bCh0KXt2YXIgZT10Lm9DbGFzc2VzLG49SCh0Lm5UYWJsZSkscj1IKCI8ZGl2Lz4iKS5hdHRyKHtpZDp0LnNUYWJsZUlkKyJfd3JhcHBlciIsY2xhc3M6ZS5jb250YWluZXJ9KS5pbnNlcnRCZWZvcmUobik7aWYodC5uVGFibGVXcmFwcGVyPXJbMF0sdC5zRG9tKWNsKHQsdC5zRG9tLHIpO2Vsc2V7dmFyIHM9R2EodCx0LmxheW91dCwidG9wIiksaT1HYSh0LHQubGF5b3V0LCJib3R0b20iKSxvPUZyKHQsImxheW91dCIpO3MuZm9yRWFjaChmdW5jdGlvbih1KXtvKHQscix1KX0pLG8odCxyLHtmdWxsOnt0YWJsZTohMCxjb250ZW50czpbY3ModCldfX0pLGkuZm9yRWFjaChmdW5jdGlvbih1KXtvKHQscix1KX0pfXdsKHQpfWZ1bmN0aW9uIGNsKHQsZSxuKXtmb3IodmFyIHI9ZS5tYXRjaCgvKCIuKj8iKXwoJy4qPycpfC4vZykscyxpLG8sdSxwLGI9MDtiPHIubGVuZ3RoO2IrKyl7aWYocz1udWxsLGk9cltiXSxpPT0iPCIpe2lmKG89SCgiPGRpdi8+IiksdT1yW2IrMV0sdVswXT09IicifHx1WzBdPT0nIicpe3A9dS5yZXBsYWNlKC9bJyJdL2csIiIpO3ZhciBnPSIiLG07aWYocC5pbmRleE9mKCIuIikhPS0xKXt2YXIgQz1wLnNwbGl0KCIuIik7Zz1DWzBdLG09Q1sxXX1lbHNlIHBbMF09PSIjIj9nPXA6bT1wO28uYXR0cigiaWQiLGcuc3Vic3RyaW5nKDEpKS5hZGRDbGFzcyhtKSxiKyt9bi5hcHBlbmQobyksbj1vfWVsc2UgaT09Ij4iP249bi5wYXJlbnQoKTppPT0idCI/cz1jcyh0KTpidC5leHQuZmVhdHVyZS5mb3JFYWNoKGZ1bmN0aW9uKHkpe2k9PXkuY0ZlYXR1cmUmJihzPXkuZm5Jbml0KHQpKX0pO3MmJm4uYXBwZW5kKHMpfX1mdW5jdGlvbiBscyh0LGUsbil7dmFyIHI9dC5hb0NvbHVtbnMscz1IKGUpLmNoaWxkcmVuKCJ0ciIpLGksbyx1LHAsYixnLG0sQyx5LFQsUD1lJiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0idGhlYWQiLGM9W10sbCxoPWZ1bmN0aW9uKFUsWCxRKXtmb3IodmFyIEU9VVtYXTtFW1FdOylRKys7cmV0dXJuIFF9O2Zvcih1PTAsZz1zLmxlbmd0aDt1PGc7dSsrKWMucHVzaChbXSk7Zm9yKHU9MCxnPXMubGVuZ3RoO3U8Zzt1KyspZm9yKGk9c1t1XSxDPTAsbz1pLmZpcnN0Q2hpbGQ7bzspe2lmKG8ubm9kZU5hbWUudG9VcHBlckNhc2UoKT09IlREInx8by5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpPT0iVEgiKXt2YXIgXz1bXTtpZih5PW8uZ2V0QXR0cmlidXRlKCJjb2xzcGFuIikqMSxUPW8uZ2V0QXR0cmlidXRlKCJyb3dzcGFuIikqMSx5PSF5fHx5PT09MHx8eT09PTE/MTp5LFQ9IVR8fFQ9PT0wfHxUPT09MT8xOlQsbT1oKGMsdSxDKSxsPXk9PT0xLG4pe2lmKGwpe3hpKHQsbSxIKG8pLmRhdGEoKSk7dmFyIEY9clttXSxPPW8uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpfHxudWxsLGY9by5zdHlsZS53aWR0aC5tYXRjaCgvd2lkdGg6XHMqKFxkK1tweGVtJV0rKS8pO2YmJihPPWZbMV0pLEYuc1dpZHRoT3JpZz1GLnNXaWR0aHx8TyxQPyhGLnNUaXRsZSE9PW51bGwmJiFGLmF1dG9UaXRsZSYmKG8uaW5uZXJIVE1MPUYuc1RpdGxlKSwhRi5zVGl0bGUmJmwmJihGLnNUaXRsZT1nbihvLmlubmVySFRNTCksRi5hdXRvVGl0bGU9ITApKTpGLmZvb3RlciYmKG8uaW5uZXJIVE1MPUYuZm9vdGVyKSxGLmFyaWFUaXRsZXx8KEYuYXJpYVRpdGxlPUgobykuYXR0cigiYXJpYS1sYWJlbCIpfHxGLnNUaXRsZSksRi5jbGFzc05hbWUmJkgobykuYWRkQ2xhc3MoRi5jbGFzc05hbWUpfUgoInNwYW4uZHQtY29sdW1uLXRpdGxlIixvKS5sZW5ndGg9PT0wJiZIKCI8c3Bhbj4iKS5hZGRDbGFzcygiZHQtY29sdW1uLXRpdGxlIikuYXBwZW5kKG8uY2hpbGROb2RlcykuYXBwZW5kVG8obyksUCYmSCgic3Bhbi5kdC1jb2x1bW4tb3JkZXIiLG8pLmxlbmd0aD09PTAmJkgoIjxzcGFuPiIpLmFkZENsYXNzKCJkdC1jb2x1bW4tb3JkZXIiKS5hcHBlbmRUbyhvKX1mb3IoYj0wO2I8eTtiKyspe2ZvcihwPTA7cDxUO3ArKyljW3UrcF1bbStiXT17Y2VsbDpvLHVuaXF1ZTpsfSxjW3UrcF0ucm93PWk7Xy5wdXNoKG0rYil9by5zZXRBdHRyaWJ1dGUoImRhdGEtZHQtY29sdW1uIix4bihfKS5qb2luKCIsIikpfW89by5uZXh0U2libGluZ31yZXR1cm4gY31mdW5jdGlvbiBmbCh0KXt2YXIgZT1FZSh0KT09InNzcCIsbj10LmlJbml0RGlzcGxheVN0YXJ0O24hPT12b2lkIDAmJm4hPT0tMSYmKHQuX2lEaXNwbGF5U3RhcnQ9ZT9uOm4+PXQuZm5SZWNvcmRzRGlzcGxheSgpPzA6bix0LmlJbml0RGlzcGxheVN0YXJ0PS0xKX1mdW5jdGlvbiBSaSh0LGUsbil7dmFyIHIscz10LmFqYXgsaT10Lm9JbnN0YW5jZSxvPWZ1bmN0aW9uKGcpe3ZhciBtPXQuanFYSFI/dC5qcVhIUi5zdGF0dXM6bnVsbDsoZz09PW51bGx8fHR5cGVvZiBtPT0ibnVtYmVyIiYmbT09MjA0KSYmKGc9e30sTHIodCxnLFtdKSk7dmFyIEM9Zy5lcnJvcnx8Zy5zRXJyb3I7aWYoQyYmT2UodCwwLEMpLGcuZCYmdHlwZW9mIGcuZD09InN0cmluZyIpdHJ5e2c9SlNPTi5wYXJzZShnLmQpfWNhdGNoe310Lmpzb249ZyxadCh0LG51bGwsInhociIsW3QsZyx0LmpxWEhSXSwhMCksbihnKX07aWYoSC5pc1BsYWluT2JqZWN0KHMpJiZzLmRhdGEpe3I9cy5kYXRhO3ZhciB1PXR5cGVvZiByPT0iZnVuY3Rpb24iP3IoZSx0KTpyO2U9dHlwZW9mIHI9PSJmdW5jdGlvbiImJnU/dTpILmV4dGVuZCghMCxlLHUpLGRlbGV0ZSBzLmRhdGF9dmFyIHA9e3VybDp0eXBlb2Ygcz09InN0cmluZyI/czoiIixkYXRhOmUsc3VjY2VzczpvLGRhdGFUeXBlOiJqc29uIixjYWNoZTohMSx0eXBlOnQuc1NlcnZlck1ldGhvZCxlcnJvcjpmdW5jdGlvbihnLG0pe3ZhciBDPVp0KHQsbnVsbCwieGhyIixbdCxudWxsLHQuanFYSFJdLCEwKTtDLmluZGV4T2YoITApPT09LTEmJihtPT0icGFyc2VyZXJyb3IiP09lKHQsMCwiSW52YWxpZCBKU09OIHJlc3BvbnNlIiwxKTpnLnJlYWR5U3RhdGU9PT00JiZPZSh0LDAsIkFqYXggZXJyb3IiLDcpKSxrZSh0LCExKX19O2lmKEguaXNQbGFpbk9iamVjdChzKSYmSC5leHRlbmQocCxzKSx0Lm9BamF4RGF0YT1lLFp0KHQsbnVsbCwicHJlWGhyIixbdCxlLHBdLCEwKSx0eXBlb2Ygcz09ImZ1bmN0aW9uIil0LmpxWEhSPXMuY2FsbChpLGUsbyx0KTtlbHNlIGlmKHMudXJsPT09IiIpe3ZhciBiPXt9O2J0LnV0aWwuc2V0KHMuZGF0YVNyYykoYixbXSksbyhiKX1lbHNlIHQuanFYSFI9SC5hamF4KHApO3ImJihzLmRhdGE9cil9ZnVuY3Rpb24gaGwodCl7dC5pRHJhdysrLGtlKHQsITApLFJpKHQscGwodCksZnVuY3Rpb24oZSl7YmwodCxlKX0pfWZ1bmN0aW9uIHBsKHQpe3ZhciBlPXQuYW9Db2x1bW5zLG49dC5vRmVhdHVyZXMscj10Lm9QcmV2aW91c1NlYXJjaCxzPXQuYW9QcmVTZWFyY2hDb2xzLGk9ZnVuY3Rpb24obyx1KXtyZXR1cm4gdHlwZW9mIGVbb11bdV09PSJmdW5jdGlvbiI/ImZ1bmN0aW9uIjplW29dW3VdfTtyZXR1cm57ZHJhdzp0LmlEcmF3LGNvbHVtbnM6ZS5tYXAoZnVuY3Rpb24obyx1KXtyZXR1cm57ZGF0YTppKHUsIm1EYXRhIiksbmFtZTpvLnNOYW1lLHNlYXJjaGFibGU6by5iU2VhcmNoYWJsZSxvcmRlcmFibGU6by5iU29ydGFibGUsc2VhcmNoOnt2YWx1ZTpzW3VdLnNlYXJjaCxyZWdleDpzW3VdLnJlZ2V4LGZpeGVkOk9iamVjdC5rZXlzKG8uc2VhcmNoRml4ZWQpLm1hcChmdW5jdGlvbihwKXtyZXR1cm57bmFtZTpwLHRlcm06by5zZWFyY2hGaXhlZFtwXS50b1N0cmluZygpfX0pfX19KSxvcmRlcjp6cih0KS5tYXAoZnVuY3Rpb24obyl7cmV0dXJue2NvbHVtbjpvLmNvbCxkaXI6by5kaXIsbmFtZTppKG8uY29sLCJzTmFtZSIpfX0pLHN0YXJ0OnQuX2lEaXNwbGF5U3RhcnQsbGVuZ3RoOm4uYlBhZ2luYXRlP3QuX2lEaXNwbGF5TGVuZ3RoOi0xLHNlYXJjaDp7dmFsdWU6ci5zZWFyY2gscmVnZXg6ci5yZWdleCxmaXhlZDpPYmplY3Qua2V5cyh0LnNlYXJjaEZpeGVkKS5tYXAoZnVuY3Rpb24obyl7cmV0dXJue25hbWU6byx0ZXJtOnQuc2VhcmNoRml4ZWRbb10udG9TdHJpbmcoKX19KX19fWZ1bmN0aW9uIGJsKHQsZSl7dmFyIG49THIodCxlKSxyPXZpKHQsImRyYXciLGUpLHM9dmkodCwicmVjb3Jkc1RvdGFsIixlKSxpPXZpKHQsInJlY29yZHNGaWx0ZXJlZCIsZSk7aWYociE9PXZvaWQgMCl7aWYocioxPHQuaURyYXcpcmV0dXJuO3QuaURyYXc9cioxfW58fChuPVtdKSxPaSh0KSx0Ll9pUmVjb3Jkc1RvdGFsPXBhcnNlSW50KHMsMTApLHQuX2lSZWNvcmRzRGlzcGxheT1wYXJzZUludChpLDEwKTtmb3IodmFyIG89MCx1PW4ubGVuZ3RoO288dTtvKyspeW4odCxuW29dKTt0LmFpRGlzcGxheT10LmFpRGlzcGxheU1hc3Rlci5zbGljZSgpLEZpKHQpLExuKHQsITApLFByKHQpLGtlKHQsITEpfWZ1bmN0aW9uIExyKHQsZSxuKXt2YXIgcj0iZGF0YSI7aWYoSC5pc1BsYWluT2JqZWN0KHQuYWpheCkmJnQuYWpheC5kYXRhU3JjIT09dm9pZCAwKXt2YXIgcz10LmFqYXguZGF0YVNyYzt0eXBlb2Ygcz09InN0cmluZyJ8fHR5cGVvZiBzPT0iZnVuY3Rpb24iP3I9czpzLmRhdGEhPT12b2lkIDAmJihyPXMuZGF0YSl9aWYoIW4pcmV0dXJuIHI9PT0iZGF0YSI/ZS5hYURhdGF8fGVbcl06ciE9PSIiP0VuKHIpKGUpOmU7dm4ocikoZSxuKX1mdW5jdGlvbiB2aSh0LGUsbil7dmFyIHI9SC5pc1BsYWluT2JqZWN0KHQuYWpheCk/dC5hamF4LmRhdGFTcmM6bnVsbDtpZihyJiZyW2VdKXJldHVybiBFbihyW2VdKShuKTt2YXIgcz0iIjtyZXR1cm4gZT09PSJkcmF3Ij9zPSJzRWNobyI6ZT09PSJyZWNvcmRzVG90YWwiP3M9ImlUb3RhbFJlY29yZHMiOmU9PT0icmVjb3Jkc0ZpbHRlcmVkIiYmKHM9ImlUb3RhbERpc3BsYXlSZWNvcmRzIiksbltzXSE9PXZvaWQgMD9uW3NdOm5bZV19ZnVuY3Rpb24gdHIodCxlKXt2YXIgbj10LmFvUHJlU2VhcmNoQ29scztpZihFZSh0KSE9InNzcCIpe3lsKHQpLHQuYWlEaXNwbGF5PXQuYWlEaXNwbGF5TWFzdGVyLnNsaWNlKCksX3IodC5haURpc3BsYXksdCxlLnNlYXJjaCxlKSxILmVhY2godC5zZWFyY2hGaXhlZCxmdW5jdGlvbihpLG8pe19yKHQuYWlEaXNwbGF5LHQsbyx7fSl9KTtmb3IodmFyIHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIHM9bltyXTtfcih0LmFpRGlzcGxheSx0LHMuc2VhcmNoLHMsciksSC5lYWNoKHQuYW9Db2x1bW5zW3JdLnNlYXJjaEZpeGVkLGZ1bmN0aW9uKGksbyl7X3IodC5haURpc3BsYXksdCxvLHt9LHIpfSl9bWwodCl9dC5iRmlsdGVyZWQ9ITAsWnQodCxudWxsLCJzZWFyY2giLFt0XSl9ZnVuY3Rpb24gbWwodCl7Zm9yKHZhciBlPWJ0LmV4dC5zZWFyY2gsbj10LmFpRGlzcGxheSxyLHMsaT0wLG89ZS5sZW5ndGg7aTxvO2krKyl7Zm9yKHZhciB1PVtdLHA9MCxiPW4ubGVuZ3RoO3A8YjtwKyspcz1uW3BdLHI9dC5hb0RhdGFbc10sZVtpXSh0LHIuX2FGaWx0ZXJEYXRhLHMsci5fYURhdGEscCkmJnUucHVzaChzKTtuLmxlbmd0aD0wLG4ucHVzaC5hcHBseShuLHUpfX1mdW5jdGlvbiBfcih0LGUsbixyLHMpe2lmKG4hPT0iIil7dmFyIGk9MCxvPVtdLHU9dHlwZW9mIG49PSJmdW5jdGlvbiI/bjpudWxsLHA9biBpbnN0YW5jZW9mIFJlZ0V4cD9uOnU/bnVsbDp2bChuLHIpO2ZvcihpPTA7aTx0Lmxlbmd0aDtpKyspe3ZhciBiPWUuYW9EYXRhW3RbaV1dLGc9cz09PXZvaWQgMD9iLl9zRmlsdGVyUm93OmIuX2FGaWx0ZXJEYXRhW3NdOyh1JiZ1KGcsYi5fYURhdGEsdFtpXSxzKXx8cCYmcC50ZXN0KGcpKSYmby5wdXNoKHRbaV0pfWZvcih0Lmxlbmd0aD1vLmxlbmd0aCxpPTA7aTxvLmxlbmd0aDtpKyspdFtpXT1vW2ldfX1mdW5jdGlvbiB2bCh0LGUpe3ZhciBuPVtdLHI9SC5leHRlbmQoe30se2JvdW5kYXJ5OiExLGNhc2VJbnNlbnNpdGl2ZTohMCxleGFjdDohMSxyZWdleDohMSxzbWFydDohMH0sZSk7aWYodHlwZW9mIHQhPSJzdHJpbmciJiYodD10LnRvU3RyaW5nKCkpLHQ9RHIodCksci5leGFjdClyZXR1cm4gbmV3IFJlZ0V4cCgiXiIrQ2kodCkrIiQiLHIuY2FzZUluc2Vuc2l0aXZlPyJpIjoiIik7aWYodD1yLnJlZ2V4P3Q6Q2kodCksci5zbWFydCl7dmFyIHM9dC5tYXRjaCgvIT9bIlx1MjAxQ11bXiJcdTIwMURdK1siXHUyMDFEXXxbXiBdKy9nKXx8WyIiXSxpPXMubWFwKGZ1bmN0aW9uKHApe3ZhciBiPSExLGc7cmV0dXJuIHAuY2hhckF0KDApPT09IiEiJiYoYj0hMCxwPXAuc3Vic3RyaW5nKDEpKSxwLmNoYXJBdCgwKT09PSciJz8oZz1wLm1hdGNoKC9eIiguKikiJC8pLHA9Zz9nWzFdOnApOnAuY2hhckF0KDApPT09Ilx1MjAxQyImJihnPXAubWF0Y2goL15cdTIwMUMoLiopXHUyMDFEJC8pLHA9Zz9nWzFdOnApLGImJihwLmxlbmd0aD4xJiZuLnB1c2goIig/ISIrcCsiKSIpLHA9IiIpLHAucmVwbGFjZSgvIi9nLCIiKX0pLG89bi5sZW5ndGg/bi5qb2luKCIiKToiIix1PXIuYm91bmRhcnk/IlxcYiI6IiI7dD0iXig/PS4qPyIrdStpLmpvaW4oIikoPz0uKj8iK3UpKyIpKCIrbysiLikqJCJ9cmV0dXJuIG5ldyBSZWdFeHAodCxyLmNhc2VJbnNlbnNpdGl2ZT8iaSI6IiIpfXZhciBDaT1idC51dGlsLmVzY2FwZVJlZ2V4LFRyPUgoIjxkaXY+IilbMF0sZ2w9VHIudGV4dENvbnRlbnQhPT12b2lkIDA7ZnVuY3Rpb24geWwodCl7Zm9yKHZhciBlPXQuYW9Db2x1bW5zLG49dC5hb0RhdGEscixzLGksbyx1LHAsYj0hMSxnPTA7ZzxuLmxlbmd0aDtnKyspaWYobltnXSYmKHA9bltnXSwhcC5fYUZpbHRlckRhdGEpKXtmb3Iobz1bXSxzPTAsaT1lLmxlbmd0aDtzPGk7cysrKXI9ZVtzXSxyLmJTZWFyY2hhYmxlPyh1PVJlKHQsZyxzLCJmaWx0ZXIiKSx1PT09bnVsbCYmKHU9IiIpLHR5cGVvZiB1IT0ic3RyaW5nIiYmdS50b1N0cmluZyYmKHU9dS50b1N0cmluZygpKSk6dT0iIix1LmluZGV4T2YmJnUuaW5kZXhPZigiJiIpIT09LTEmJihUci5pbm5lckhUTUw9dSx1PWdsP1RyLnRleHRDb250ZW50OlRyLmlubmVyVGV4dCksdS5yZXBsYWNlJiYodT11LnJlcGxhY2UoL1tcclxuXHUyMDI4XS9nLCIiKSksby5wdXNoKHUpO3AuX2FGaWx0ZXJEYXRhPW8scC5fc0ZpbHRlclJvdz1vLmpvaW4oIiAgIiksYj0hMH1yZXR1cm4gYn1mdW5jdGlvbiBrcih0KXt2YXIgZSxuPXQub0luaXQscj10LmRlZmVyTG9hZGluZyxzPUVlKHQpO2lmKCF0LmJJbml0aWFsaXNlZCl7c2V0VGltZW91dChmdW5jdGlvbigpe2tyKHQpfSwyMDApO3JldHVybn1VYSh0LCJoZWFkZXIiKSxVYSh0LCJmb290ZXIiKSxTbCh0LG4sZnVuY3Rpb24oKXtJcih0LHQuYW9IZWFkZXIpLElyKHQsdC5hb0Zvb3Rlcik7dmFyIGk9dC5pSW5pdERpc3BsYXlTdGFydDtpZihuLmFhRGF0YSlmb3IoZT0wO2U8bi5hYURhdGEubGVuZ3RoO2UrKyl5bih0LG4uYWFEYXRhW2VdKTtlbHNlKHJ8fHM9PSJkb20iKSYmTmkodCxIKHQublRCb2R5KS5jaGlsZHJlbigidHIiKSk7dC5haURpc3BsYXk9dC5haURpc3BsYXlNYXN0ZXIuc2xpY2UoKSx1bCh0KSxDbCh0KSxocyh0KSxrZSh0LCEwKSxadCh0LG51bGwsInByZUluaXQiLFt0XSwhMCksUm4odCksKHMhPSJzc3AifHxyKSYmKHM9PSJhamF4Ij9SaSh0LHt9LGZ1bmN0aW9uKG8pe3ZhciB1PUxyKHQsbyk7Zm9yKGU9MDtlPHUubGVuZ3RoO2UrKyl5bih0LHVbZV0pO3QuaUluaXREaXNwbGF5U3RhcnQ9aSxSbih0KSxrZSh0LCExKSxQcih0KX0sdCk6KFByKHQpLGtlKHQsITEpKSl9KX1mdW5jdGlvbiBQcih0KXtpZighdC5fYkluaXRDb21wbGV0ZSl7dmFyIGU9W3QsdC5qc29uXTt0Ll9iSW5pdENvbXBsZXRlPSEwLE9yKHQpLFp0KHQsbnVsbCwicGx1Z2luLWluaXQiLGUsITApLFp0KHQsImFvSW5pdENvbXBsZXRlIiwiaW5pdCIsZSwhMCl9fWZ1bmN0aW9uIGRzKHQsZSl7dmFyIG49cGFyc2VJbnQoZSwxMCk7dC5faURpc3BsYXlMZW5ndGg9bix2cyh0KSxadCh0LG51bGwsImxlbmd0aCIsW3Qsbl0pfWZ1bmN0aW9uIExpKHQsZSxuKXt2YXIgcj10Ll9pRGlzcGxheVN0YXJ0LHM9dC5faURpc3BsYXlMZW5ndGgsaT10LmZuUmVjb3Jkc0Rpc3BsYXkoKTtpZihpPT09MHx8cz09PS0xKXI9MDtlbHNlIGlmKHR5cGVvZiBlPT0ibnVtYmVyIilyPWUqcyxyPmkmJihyPTApO2Vsc2UgaWYoZT09ImZpcnN0IilyPTA7ZWxzZSBpZihlPT0icHJldmlvdXMiKXI9cz49MD9yLXM6MCxyPDAmJihyPTApO2Vsc2UgaWYoZT09Im5leHQiKXIrczxpJiYocis9cyk7ZWxzZSBpZihlPT0ibGFzdCIpcj1NYXRoLmZsb29yKChpLTEpL3MpKnM7ZWxzZXtpZihlPT09ImVsbGlwc2lzIilyZXR1cm47T2UodCwwLCJVbmtub3duIHBhZ2luZyBhY3Rpb246ICIrZSw1KX12YXIgbz10Ll9pRGlzcGxheVN0YXJ0IT09cjtyZXR1cm4gdC5faURpc3BsYXlTdGFydD1yLFp0KHQsbnVsbCxvPyJwYWdlIjoicGFnZS1uYyIsW3RdKSxvJiZuJiZMbih0KSxvfWZ1bmN0aW9uIHdsKHQpe3ZhciBlPXQublRhYmxlLG49dC5vU2Nyb2xsLnNYIT09IiJ8fHQub1Njcm9sbC5zWSE9PSIiO2lmKHQub0ZlYXR1cmVzLmJQcm9jZXNzaW5nKXt2YXIgcj1IKCI8ZGl2Lz4iLHtpZDp0LnNUYWJsZUlkKyJfcHJvY2Vzc2luZyIsY2xhc3M6dC5vQ2xhc3Nlcy5wcm9jZXNzaW5nLmNvbnRhaW5lcixyb2xlOiJzdGF0dXMifSkuaHRtbCh0Lm9MYW5ndWFnZS5zUHJvY2Vzc2luZykuYXBwZW5kKCI8ZGl2PjxkaXY+PC9kaXY+PGRpdj48L2Rpdj48ZGl2PjwvZGl2PjxkaXY+PC9kaXY+PC9kaXY+Iik7bj9yLnByZXBlbmRUbyhIKCJkaXYuZHQtc2Nyb2xsIix0Lm5UYWJsZVdyYXBwZXIpKTpyLmluc2VydEJlZm9yZShlKSxIKGUpLm9uKCJwcm9jZXNzaW5nLmR0LkRUIixmdW5jdGlvbihzLGksbyl7ci5jc3MoImRpc3BsYXkiLG8/ImJsb2NrIjoibm9uZSIpfSl9fWZ1bmN0aW9uIGtlKHQsZSl7dC5iRHJhd2luZyYmZT09PSExfHxadCh0LG51bGwsInByb2Nlc3NpbmciLFt0LGVdKX1mdW5jdGlvbiB1cyh0LGUsbil7ZT8oa2UodCwhMCksc2V0VGltZW91dChmdW5jdGlvbigpe24oKSxrZSh0LCExKX0sMCkpOm4oKX1mdW5jdGlvbiBjcyh0KXt2YXIgZT1IKHQublRhYmxlKSxuPXQub1Njcm9sbDtpZihuLnNYPT09IiImJm4uc1k9PT0iIilyZXR1cm4gdC5uVGFibGU7dmFyIHI9bi5zWCxzPW4uc1ksaT10Lm9DbGFzc2VzLnNjcm9sbGluZyxvPXQuY2FwdGlvbk5vZGUsdT1vP28uX2NhcHRpb25TaWRlOm51bGwscD1IKGVbMF0uY2xvbmVOb2RlKCExKSksYj1IKGVbMF0uY2xvbmVOb2RlKCExKSksZz1lLmNoaWxkcmVuKCJ0Zm9vdCIpLG09IjxkaXYvPiIsQz1mdW5jdGlvbihoKXtyZXR1cm4gaD9vbihoKTpudWxsfTtnLmxlbmd0aHx8KGc9bnVsbCk7dmFyIHk9SChtLHtjbGFzczppLmNvbnRhaW5lcn0pLmFwcGVuZChIKG0se2NsYXNzOmkuaGVhZGVyLnNlbGZ9KS5jc3Moe292ZXJmbG93OiJoaWRkZW4iLHBvc2l0aW9uOiJyZWxhdGl2ZSIsYm9yZGVyOjAsd2lkdGg6cj9DKHIpOiIxMDAlIn0pLmFwcGVuZChIKG0se2NsYXNzOmkuaGVhZGVyLmlubmVyfSkuY3NzKHsiYm94LXNpemluZyI6ImNvbnRlbnQtYm94Iix3aWR0aDpuLnNYSW5uZXJ8fCIxMDAlIn0pLmFwcGVuZChwLnJlbW92ZUF0dHIoImlkIikuY3NzKCJtYXJnaW4tbGVmdCIsMCkuYXBwZW5kKHU9PT0idG9wIj9vOm51bGwpLmFwcGVuZChlLmNoaWxkcmVuKCJ0aGVhZCIpKSkpKS5hcHBlbmQoSChtLHtjbGFzczppLmJvZHl9KS5jc3Moe3Bvc2l0aW9uOiJyZWxhdGl2ZSIsb3ZlcmZsb3c6ImF1dG8iLHdpZHRoOkMocil9KS5hcHBlbmQoZSkpO2cmJnkuYXBwZW5kKEgobSx7Y2xhc3M6aS5mb290ZXIuc2VsZn0pLmNzcyh7b3ZlcmZsb3c6ImhpZGRlbiIsYm9yZGVyOjAsd2lkdGg6cj9DKHIpOiIxMDAlIn0pLmFwcGVuZChIKG0se2NsYXNzOmkuZm9vdGVyLmlubmVyfSkuYXBwZW5kKGIucmVtb3ZlQXR0cigiaWQiKS5jc3MoIm1hcmdpbi1sZWZ0IiwwKS5hcHBlbmQodT09PSJib3R0b20iP286bnVsbCkuYXBwZW5kKGUuY2hpbGRyZW4oInRmb290IikpKSkpO3ZhciBUPXkuY2hpbGRyZW4oKSxQPVRbMF0sYz1UWzFdLGw9Zz9UWzJdOm51bGw7cmV0dXJuIEgoYykub24oInNjcm9sbC5EVCIsZnVuY3Rpb24oKXt2YXIgaD10aGlzLnNjcm9sbExlZnQ7UC5zY3JvbGxMZWZ0PWgsZyYmKGwuc2Nyb2xsTGVmdD1oKX0pLEgoInRoLCB0ZCIsUCkub24oImZvY3VzIixmdW5jdGlvbigpe3ZhciBoPVAuc2Nyb2xsTGVmdDtjLnNjcm9sbExlZnQ9aCxnJiYoYy5zY3JvbGxMZWZ0PWgpfSksSChjKS5jc3MoIm1heC1oZWlnaHQiLHMpLG4uYkNvbGxhcHNlfHxIKGMpLmNzcygiaGVpZ2h0IixzKSx0Lm5TY3JvbGxIZWFkPVAsdC5uU2Nyb2xsQm9keT1jLHQublNjcm9sbEZvb3Q9bCx0LmFvRHJhd0NhbGxiYWNrLnB1c2goZnMpLHlbMF19ZnVuY3Rpb24gZnModCl7dmFyIGU9dC5vU2Nyb2xsLG49ZS5pQmFyV2lkdGgscj1IKHQublNjcm9sbEhlYWQpLHM9ci5jaGlsZHJlbigiZGl2IiksaT1zLmNoaWxkcmVuKCJ0YWJsZSIpLG89dC5uU2Nyb2xsQm9keSx1PUgobykscD1IKHQublNjcm9sbEZvb3QpLGI9cC5jaGlsZHJlbigiZGl2IiksZz1iLmNoaWxkcmVuKCJ0YWJsZSIpLG09SCh0Lm5USGVhZCksQz1IKHQublRhYmxlKSx5PXQublRGb290JiZIKCJ0aCwgdGQiLHQublRGb290KS5sZW5ndGg/SCh0Lm5URm9vdCk6bnVsbCxUPXQub0Jyb3dzZXIsUCxjLGw9by5zY3JvbGxIZWlnaHQ+by5jbGllbnRIZWlnaHQ7aWYodC5zY3JvbGxCYXJWaXMhPT1sJiZ0LnNjcm9sbEJhclZpcyE9PXZvaWQgMCl7dC5zY3JvbGxCYXJWaXM9bCxPcih0KTtyZXR1cm59ZWxzZSB0LnNjcm9sbEJhclZpcz1sO2lmKEMuY2hpbGRyZW4oInRoZWFkLCB0Zm9vdCIpLnJlbW92ZSgpLFA9bS5jbG9uZSgpLnByZXBlbmRUbyhDKSxQLmZpbmQoInRoLCB0ZCIpLnJlbW92ZUF0dHIoInRhYmluZGV4IiksUC5maW5kKCJbaWRdIikucmVtb3ZlQXR0cigiaWQiKSx5JiYoYz15LmNsb25lKCkucHJlcGVuZFRvKEMpLGMuZmluZCgiW2lkXSIpLnJlbW92ZUF0dHIoImlkIikpLHQuYWlEaXNwbGF5Lmxlbmd0aCl7dmFyIGg9bnVsbDtmb3IoZj0wO2Y8dC5haURpc3BsYXkubGVuZ3RoO2YrKyl7dmFyIF89dC5haURpc3BsYXlbZl0sRj10LmFvRGF0YVtfXS5uVHI7aWYoRil7aD1GO2JyZWFrfX1pZihoKWZvcih2YXIgTz1IKGgpLmNoaWxkcmVuKCJ0aCwgdGQiKS5tYXAoZnVuY3Rpb24odyl7cmV0dXJue2lkeDpJaSh0LHcpLHdpZHRoOkgodGhpcykub3V0ZXJXaWR0aCgpfX0pLGY9MDtmPE8ubGVuZ3RoO2YrKyl7dmFyIFU9dC5hb0NvbHVtbnNbT1tmXS5pZHhdLmNvbEVsWzBdLFg9VS5zdHlsZS53aWR0aC5yZXBsYWNlKCJweCIsIiIpO1ghPT1PW2ZdLndpZHRoJiYoVS5zdHlsZS53aWR0aD1PW2ZdLndpZHRoKyJweCIpfX1pLmZpbmQoImNvbGdyb3VwIikucmVtb3ZlKCksaS5hcHBlbmQodC5jb2xncm91cC5jbG9uZSgpKSx5JiYoZy5maW5kKCJjb2xncm91cCIpLnJlbW92ZSgpLGcuYXBwZW5kKHQuY29sZ3JvdXAuY2xvbmUoKSkpLEgoInRoLCB0ZCIsUCkuZWFjaChmdW5jdGlvbigpe0godGhpcy5jaGlsZE5vZGVzKS53cmFwQWxsKCc8ZGl2IGNsYXNzPSJkdC1zY3JvbGwtc2l6aW5nIj4nKX0pLHkmJkgoInRoLCB0ZCIsYykuZWFjaChmdW5jdGlvbigpe0godGhpcy5jaGlsZE5vZGVzKS53cmFwQWxsKCc8ZGl2IGNsYXNzPSJkdC1zY3JvbGwtc2l6aW5nIj4nKX0pO3ZhciBRPU1hdGguZmxvb3IoQy5oZWlnaHQoKSk+by5jbGllbnRIZWlnaHR8fHUuY3NzKCJvdmVyZmxvdy15Iik9PSJzY3JvbGwiLEU9InBhZGRpbmciKyhULmJTY3JvbGxiYXJMZWZ0PyJMZWZ0IjoiUmlnaHQiKSwkPUMub3V0ZXJXaWR0aCgpO2kuY3NzKCJ3aWR0aCIsb24oJCkpLHMuY3NzKCJ3aWR0aCIsb24oJCkpLmNzcyhFLFE/bisicHgiOiIwcHgiKSx5JiYoZy5jc3MoIndpZHRoIixvbigkKSksYi5jc3MoIndpZHRoIixvbigkKSkuY3NzKEUsUT9uKyJweCI6IjBweCIpKSxDLmNoaWxkcmVuKCJjb2xncm91cCIpLnByZXBlbmRUbyhDKSx1LnRyaWdnZXIoInNjcm9sbCIpLCh0LmJTb3J0ZWR8fHQuYkZpbHRlcmVkKSYmIXQuX2RyYXdIb2xkJiYoby5zY3JvbGxUb3A9MCl9ZnVuY3Rpb24geGwodCl7aWYodC5vRmVhdHVyZXMuYkF1dG9XaWR0aCl7dmFyIGU9dC5uVGFibGUsbj10LmFvQ29sdW1ucyxyPXQub1Njcm9sbCxzPXIuc1ksaT1yLnNYLG89ci5zWElubmVyLHU9UGkodCwiYlZpc2libGUiKSxwPWUuZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGI9ZS5wYXJlbnROb2RlLGcsbSxDLHk9ZS5zdHlsZS53aWR0aDsheSYmIXAmJihlLnN0eWxlLndpZHRoPSIxMDAlIix5PSIxMDAlIikseSYmeS5pbmRleE9mKCIlIikhPT0tMSYmKHA9eSksWnQodCxudWxsLCJjb2x1bW4tY2FsYyIse3Zpc2libGU6dX0sITEpO3ZhciBUPUgoZS5jbG9uZU5vZGUoKSkuY3NzKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIikucmVtb3ZlQXR0cigiaWQiKTtULmFwcGVuZCgiPHRib2R5PiIpO3ZhciBQPUgoIjx0ci8+IikuYXBwZW5kVG8oVC5maW5kKCJ0Ym9keSIpKTtmb3IoVC5hcHBlbmQoSCh0Lm5USGVhZCkuY2xvbmUoKSkuYXBwZW5kKEgodC5uVEZvb3QpLmNsb25lKCkpLFQuZmluZCgidGZvb3QgdGgsIHRmb290IHRkIikuY3NzKCJ3aWR0aCIsIiIpLFQuZmluZCgidGhlYWQgdGgsIHRoZWFkIHRkIikuZWFjaChmdW5jdGlvbigpe3ZhciBRPXJzKHQsdGhpcywhMCwhMSk7UT8odGhpcy5zdHlsZS53aWR0aD1RLHRoaXMuc3R5bGUubWluV2lkdGg9USxpJiZIKHRoaXMpLmFwcGVuZChIKCI8ZGl2Lz4iKS5jc3Moe3dpZHRoOlEsbWFyZ2luOjAscGFkZGluZzowLGJvcmRlcjowLGhlaWdodDoxfSkpKTp0aGlzLnN0eWxlLndpZHRoPSIifSksZz0wO2c8dS5sZW5ndGg7ZysrKXtDPXVbZ10sbT1uW0NdO3ZhciBjPV9sKHQsQyksbD1sZS50eXBlLmNsYXNzTmFtZVttLnNUeXBlXSxoPWMrbS5zQ29udGVudFBhZGRpbmcsXz1jLmluZGV4T2YoIjwiKT09PS0xP2RvY3VtZW50LmNyZWF0ZVRleHROb2RlKGgpOmg7SCgiPHRkLz4iKS5hZGRDbGFzcyhsKS5hZGRDbGFzcyhtLnNDbGFzcykuYXBwZW5kKF8pLmFwcGVuZFRvKFApfUgoIltuYW1lXSIsVCkucmVtb3ZlQXR0cigibmFtZSIpO3ZhciBGPUgoIjxkaXYvPiIpLmNzcyhpfHxzP3twb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDowLGxlZnQ6MCxoZWlnaHQ6MSxyaWdodDowLG92ZXJmbG93OiJoaWRkZW4ifTp7fSkuYXBwZW5kKFQpLmFwcGVuZFRvKGIpO2kmJm8/VC53aWR0aChvKTppPyhULmNzcygid2lkdGgiLCJhdXRvIiksVC5yZW1vdmVBdHRyKCJ3aWR0aCIpLFQud2lkdGgoKTxiLmNsaWVudFdpZHRoJiZwJiZULndpZHRoKGIuY2xpZW50V2lkdGgpKTpzP1Qud2lkdGgoYi5jbGllbnRXaWR0aCk6cCYmVC53aWR0aChwKTt2YXIgTz0wLGY9VC5maW5kKCJ0Ym9keSB0ciIpLmVxKDApLmNoaWxkcmVuKCk7Zm9yKGc9MDtnPHUubGVuZ3RoO2crKyl7dmFyIFU9ZltnXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtPKz1VLG5bdVtnXV0uc1dpZHRoPW9uKFUpfWlmKGUuc3R5bGUud2lkdGg9b24oTyksRi5yZW1vdmUoKSxwJiYoZS5zdHlsZS53aWR0aD1vbihwKSksKHB8fGkpJiYhdC5fcmVzekV2dCl7dmFyIFg9ZnVuY3Rpb24oKXtIKHdpbmRvdykub24oInJlc2l6ZS5EVC0iK3Quc0luc3RhbmNlLGJ0LnV0aWwudGhyb3R0bGUoZnVuY3Rpb24oKXt0LmJEZXN0cm95aW5nfHxPcih0KX0pKX07WCgpLHQuX3Jlc3pFdnQ9ITB9fX1mdW5jdGlvbiBfbCh0LGUpe3ZhciBuPXQuYW9Db2x1bW5zW2VdO2lmKCFuLm1heExlblN0cmluZyl7Zm9yKHZhciByLHM9IiIsaT0tMSxvPTAsdT10LmFpRGlzcGxheU1hc3Rlci5sZW5ndGg7bzx1O28rKyl7dmFyIHA9dC5haURpc3BsYXlNYXN0ZXJbb10sYj1FaSh0LHApW2VdLGc9YiYmdHlwZW9mIGI9PSJvYmplY3QiJiZiLm5vZGVUeXBlP2IuaW5uZXJIVE1MOmIrIiI7Zz1nLnJlcGxhY2UoL2lkPSIuKj8iL2csIiIpLnJlcGxhY2UoL25hbWU9Ii4qPyIvZywiIikscj1nbihnKS5yZXBsYWNlKC8mbmJzcDsvZywiICIpLHIubGVuZ3RoPmkmJihzPWcsaT1yLmxlbmd0aCl9bi5tYXhMZW5TdHJpbmc9c31yZXR1cm4gbi5tYXhMZW5TdHJpbmd9ZnVuY3Rpb24gb24odCl7cmV0dXJuIHQ9PT1udWxsPyIwcHgiOnR5cGVvZiB0PT0ibnVtYmVyIj90PDA/IjBweCI6dCsicHgiOnQubWF0Y2goL1xkJC8pP3QrInB4Ijp0fWZ1bmN0aW9uIGhzKHQpe3ZhciBlPXQuYW9Db2x1bW5zO2Zvcih0LmNvbGdyb3VwLmVtcHR5KCksTmU9MDtOZTxlLmxlbmd0aDtOZSsrKWVbTmVdLmJWaXNpYmxlJiZ0LmNvbGdyb3VwLmFwcGVuZChlW05lXS5jb2xFbCl9ZnVuY3Rpb24gQ2wodCl7dmFyIGU9dC5uVEhlYWQsbj1lLnF1ZXJ5U2VsZWN0b3JBbGwoInRyIikscj10LmJTb3J0Q2VsbHNUb3Ascz0nOm5vdChbZGF0YS1kdC1vcmRlcj0iZGlzYWJsZSJdKTpub3QoW2RhdGEtZHQtb3JkZXI9Imljb24tb25seSJdKSc7cj09PSEwP2U9blswXTpyPT09ITEmJihlPW5bbi5sZW5ndGgtMV0pLHBzKHQsZSxlPT09dC5uVEhlYWQ/InRyIitzKyIgdGgiK3MrIiwgdHIiK3MrIiB0ZCIrczoidGgiK3MrIiwgdGQiK3MpO3ZhciBpPVtdO0puKHQsaSx0LmFhU29ydGluZyksdC5hYVNvcnRpbmc9aX1mdW5jdGlvbiBwcyh0LGUsbixyLHMpe21zKGUsbixmdW5jdGlvbihpKXt2YXIgbz0hMSx1PXI9PT12b2lkIDA/QmkoaS50YXJnZXQpOltyXTtpZih1Lmxlbmd0aCl7Zm9yKHZhciBwPTAsYj11Lmxlbmd0aDtwPGI7cCsrKXt2YXIgZz1UbCh0LHVbcF0scCxpLnNoaWZ0S2V5KTtpZihnIT09ITEmJihvPSEwKSx0LmFhU29ydGluZy5sZW5ndGg9PT0xJiZ0LmFhU29ydGluZ1swXVsxXT09PSIiKWJyZWFrfW8mJnVzKHQsITAsZnVuY3Rpb24oKXt6aSh0KSxicyh0LHQuYWlEaXNwbGF5KSxSbih0LCExLCExKSxzJiZzKCl9KX19KX1mdW5jdGlvbiBicyh0LGUpe2lmKCEoZS5sZW5ndGg8Mikpe3ZhciBuPXQuYWlEaXNwbGF5TWFzdGVyLHI9e30scz17fSxpO2ZvcihpPTA7aTxuLmxlbmd0aDtpKyspcltuW2ldXT1pO2ZvcihpPTA7aTxlLmxlbmd0aDtpKyspc1tlW2ldXT1yW2VbaV1dO2Uuc29ydChmdW5jdGlvbihvLHUpe3JldHVybiBzW29dLXNbdV19KX19ZnVuY3Rpb24gSm4odCxlLG4pe3ZhciByPWZ1bmN0aW9uKGkpe2lmKEguaXNQbGFpbk9iamVjdChpKSl7aWYoaS5pZHghPT12b2lkIDApZS5wdXNoKFtpLmlkeCxpLmRpcl0pO2Vsc2UgaWYoaS5uYW1lKXt2YXIgbz1DZSh0LmFvQ29sdW1ucywic05hbWUiKSx1PW8uaW5kZXhPZihpLm5hbWUpO3UhPT0tMSYmZS5wdXNoKFt1LGkuZGlyXSl9fWVsc2UgZS5wdXNoKGkpfTtpZihILmlzUGxhaW5PYmplY3QobikpcihuKTtlbHNlIGlmKG4ubGVuZ3RoJiZ0eXBlb2YgblswXT09Im51bWJlciIpcihuKTtlbHNlIGlmKG4ubGVuZ3RoKWZvcih2YXIgcz0wO3M8bi5sZW5ndGg7cysrKXIobltzXSl9ZnVuY3Rpb24genIodCl7dmFyIGUsbixyLHM9W10saT1idC5leHQudHlwZS5vcmRlcixvPXQuYW9Db2x1bW5zLHUscCxiLGcsbT10LmFhU29ydGluZ0ZpeGVkLEM9SC5pc1BsYWluT2JqZWN0KG0pLHk9W107aWYoIXQub0ZlYXR1cmVzLmJTb3J0KXJldHVybiBzO2ZvcihBcnJheS5pc0FycmF5KG0pJiZKbih0LHksbSksQyYmbS5wcmUmJkpuKHQseSxtLnByZSksSm4odCx5LHQuYWFTb3J0aW5nKSxDJiZtLnBvc3QmJkpuKHQseSxtLnBvc3QpLGU9MDtlPHkubGVuZ3RoO2UrKylpZihnPXlbZV1bMF0sb1tnXSlmb3IodT1vW2ddLmFEYXRhU29ydCxuPTAscj11Lmxlbmd0aDtuPHI7bisrKXA9dVtuXSxiPW9bcF0uc1R5cGV8fCJzdHJpbmciLHlbZV0uX2lkeD09PXZvaWQgMCYmKHlbZV0uX2lkeD1vW3BdLmFzU29ydGluZy5pbmRleE9mKHlbZV1bMV0pKSx5W2VdWzFdJiZzLnB1c2goe3NyYzpnLGNvbDpwLGRpcjp5W2VdWzFdLGluZGV4OnlbZV0uX2lkeCx0eXBlOmIsZm9ybWF0dGVyOmlbYisiLXByZSJdLHNvcnRlcjppW2IrIi0iK3lbZV1bMV1dfSk7cmV0dXJuIHN9ZnVuY3Rpb24gemkodCxlLG4pe3ZhciByLHMsaSxvPVtdLHU9YnQuZXh0LnR5cGUub3JkZXIscD10LmFvRGF0YSxiLGc9dC5haURpc3BsYXlNYXN0ZXIsbTtpZihlIT09dm9pZCAwKXt2YXIgQz10LmFvQ29sdW1uc1tlXTttPVt7c3JjOmUsY29sOmUsZGlyOm4saW5kZXg6MCx0eXBlOkMuc1R5cGUsZm9ybWF0dGVyOnVbQy5zVHlwZSsiLXByZSJdLHNvcnRlcjp1W0Muc1R5cGUrIi0iK25dfV0sZz1nLnNsaWNlKCl9ZWxzZSBtPXpyKHQpO2ZvcihyPTAscz1tLmxlbmd0aDtyPHM7cisrKWI9bVtyXSxrbCh0LGIuY29sKTtpZihFZSh0KSE9InNzcCImJm0ubGVuZ3RoIT09MCl7Zm9yKHI9MCxpPWcubGVuZ3RoO3I8aTtyKyspb1tyXT1yO20ubGVuZ3RoJiZtWzBdLmRpcj09PSJkZXNjIiYmdC5vcmRlckRlc2NSZXZlcnNlJiZvLnJldmVyc2UoKSxnLnNvcnQoZnVuY3Rpb24oeSxUKXt2YXIgUCxjLGwsaCxfLEY9bS5sZW5ndGgsTz1wW3ldLl9hU29ydERhdGEsZj1wW1RdLl9hU29ydERhdGE7Zm9yKGw9MDtsPEY7bCsrKWlmKF89bVtsXSxQPU9bXy5jb2xdLGM9ZltfLmNvbF0sXy5zb3J0ZXIpe2lmKGg9Xy5zb3J0ZXIoUCxjKSxoIT09MClyZXR1cm4gaH1lbHNlIGlmKGg9UDxjPy0xOlA+Yz8xOjAsaCE9PTApcmV0dXJuIF8uZGlyPT09ImFzYyI/aDotaDtyZXR1cm4gUD1vW3ldLGM9b1tUXSxQPGM/LTE6UD5jPzE6MH0pfWVsc2UgbS5sZW5ndGg9PT0wJiZnLnNvcnQoZnVuY3Rpb24oeSxUKXtyZXR1cm4geTxUPy0xOnk+VD8xOjB9KTtyZXR1cm4gZT09PXZvaWQgMCYmKHQuYlNvcnRlZD0hMCx0LnNvcnREZXRhaWxzPW0sWnQodCxudWxsLCJvcmRlciIsW3QsbV0pKSxnfWZ1bmN0aW9uIFRsKHQsZSxuLHIpe3ZhciBzPXQuYW9Db2x1bW5zW2VdLGk9dC5hYVNvcnRpbmcsbz1zLmFzU29ydGluZyx1LHA9ZnVuY3Rpb24oZyxtKXt2YXIgQz1nLl9pZHg7cmV0dXJuIEM9PT12b2lkIDAmJihDPW8uaW5kZXhPZihnWzFdKSksQysxPG8ubGVuZ3RoP0MrMTptP251bGw6MH07aWYoIXMuYlNvcnRhYmxlKXJldHVybiExO2lmKHR5cGVvZiBpWzBdPT0ibnVtYmVyIiYmKGk9dC5hYVNvcnRpbmc9W2ldKSwocnx8bikmJnQub0ZlYXR1cmVzLmJTb3J0TXVsdGkpe3ZhciBiPUNlKGksIjAiKS5pbmRleE9mKGUpO2IhPT0tMT8odT1wKGlbYl0sITApLHU9PT1udWxsJiZpLmxlbmd0aD09PTEmJih1PTApLHU9PT1udWxsP2kuc3BsaWNlKGIsMSk6KGlbYl1bMV09b1t1XSxpW2JdLl9pZHg9dSkpOnI/KGkucHVzaChbZSxvWzBdLDBdKSxpW2kubGVuZ3RoLTFdLl9pZHg9MCk6KGkucHVzaChbZSxpWzBdWzFdLDBdKSxpW2kubGVuZ3RoLTFdLl9pZHg9MCl9ZWxzZSBpLmxlbmd0aCYmaVswXVswXT09ZT8odT1wKGlbMF0pLGkubGVuZ3RoPTEsaVswXVsxXT1vW3VdLGlbMF0uX2lkeD11KTooaS5sZW5ndGg9MCxpLnB1c2goW2Usb1swXV0pLGlbMF0uX2lkeD0wKX1mdW5jdGlvbiBUaSh0KXt2YXIgZT10LmFMYXN0U29ydCxuPXQub0NsYXNzZXMub3JkZXIucG9zaXRpb24scj16cih0KSxzPXQub0ZlYXR1cmVzLGksbyx1O2lmKHMuYlNvcnQmJnMuYlNvcnRDbGFzc2VzKXtmb3IoaT0wLG89ZS5sZW5ndGg7aTxvO2krKyl1PWVbaV0uc3JjLEgoQ2UodC5hb0RhdGEsImFuQ2VsbHMiLHUpKS5yZW1vdmVDbGFzcyhuKyhpPDI/aSsxOjMpKTtmb3IoaT0wLG89ci5sZW5ndGg7aTxvO2krKyl1PXJbaV0uc3JjLEgoQ2UodC5hb0RhdGEsImFuQ2VsbHMiLHUpKS5hZGRDbGFzcyhuKyhpPDI/aSsxOjMpKX10LmFMYXN0U29ydD1yfWZ1bmN0aW9uIGtsKHQsZSl7dmFyIG49dC5hb0NvbHVtbnNbZV0scj1idC5leHQub3JkZXJbbi5zU29ydERhdGFUeXBlXSxzO3ImJihzPXIuY2FsbCh0Lm9JbnN0YW5jZSx0LGUsbnIodCxlKSkpO2Zvcih2YXIgaSxvLHU9YnQuZXh0LnR5cGUub3JkZXJbbi5zVHlwZSsiLXByZSJdLHA9dC5hb0RhdGEsYj0wO2I8cC5sZW5ndGg7YisrKXBbYl0mJihpPXBbYl0saS5fYVNvcnREYXRhfHwoaS5fYVNvcnREYXRhPVtdKSwoIWkuX2FTb3J0RGF0YVtlXXx8cikmJihvPXI/c1tiXTpSZSh0LGIsZSwic29ydCIpLGkuX2FTb3J0RGF0YVtlXT11P3Uobyx0KTpvKSl9ZnVuY3Rpb24ganIodCl7aWYoIXQuX2JMb2FkaW5nU3RhdGUpe3ZhciBlPXt0aW1lOituZXcgRGF0ZSxzdGFydDp0Ll9pRGlzcGxheVN0YXJ0LGxlbmd0aDp0Ll9pRGlzcGxheUxlbmd0aCxvcmRlcjpILmV4dGVuZCghMCxbXSx0LmFhU29ydGluZyksc2VhcmNoOkguZXh0ZW5kKHt9LHQub1ByZXZpb3VzU2VhcmNoKSxjb2x1bW5zOnQuYW9Db2x1bW5zLm1hcChmdW5jdGlvbihuLHIpe3JldHVybnt2aXNpYmxlOm4uYlZpc2libGUsc2VhcmNoOkguZXh0ZW5kKHt9LHQuYW9QcmVTZWFyY2hDb2xzW3JdKX19KX07dC5vU2F2ZWRTdGF0ZT1lLFp0KHQsImFvU3RhdGVTYXZlUGFyYW1zIiwic3RhdGVTYXZlUGFyYW1zIixbdCxlXSksdC5vRmVhdHVyZXMuYlN0YXRlU2F2ZSYmIXQuYkRlc3Ryb3lpbmcmJnQuZm5TdGF0ZVNhdmVDYWxsYmFjay5jYWxsKHQub0luc3RhbmNlLHQsZSl9fWZ1bmN0aW9uIFNsKHQsZSxuKXtpZighdC5vRmVhdHVyZXMuYlN0YXRlU2F2ZSl7bigpO3JldHVybn12YXIgcj1mdW5jdGlvbihpKXtraSh0LGksbil9LHM9dC5mblN0YXRlTG9hZENhbGxiYWNrLmNhbGwodC5vSW5zdGFuY2UsdCxyKTtyZXR1cm4gcyE9PXZvaWQgMCYma2kodCxzLG4pLCEwfWZ1bmN0aW9uIGtpKHQsZSxuKXt2YXIgcixzLGk9dC5hb0NvbHVtbnM7dC5fYkxvYWRpbmdTdGF0ZT0hMDt2YXIgbz10Ll9iSW5pdENvbXBsZXRlP25ldyBidC5BcGkodCk6bnVsbDtpZighZXx8IWUudGltZSl7dC5fYkxvYWRpbmdTdGF0ZT0hMSxuKCk7cmV0dXJufXZhciB1PXQuaVN0YXRlRHVyYXRpb247aWYodT4wJiZlLnRpbWU8K25ldyBEYXRlLXUqMWUzKXt0Ll9iTG9hZGluZ1N0YXRlPSExLG4oKTtyZXR1cm59dmFyIHA9WnQodCwiYW9TdGF0ZUxvYWRQYXJhbXMiLCJzdGF0ZUxvYWRQYXJhbXMiLFt0LGVdKTtpZihwLmluZGV4T2YoITEpIT09LTEpe3QuX2JMb2FkaW5nU3RhdGU9ITEsbigpO3JldHVybn1pZihlLmNvbHVtbnMmJmkubGVuZ3RoIT09ZS5jb2x1bW5zLmxlbmd0aCl7dC5fYkxvYWRpbmdTdGF0ZT0hMSxuKCk7cmV0dXJufWlmKHQub0xvYWRlZFN0YXRlPUguZXh0ZW5kKCEwLHt9LGUpLFp0KHQsbnVsbCwic3RhdGVMb2FkSW5pdCIsW3QsZV0sITApLGUubGVuZ3RoIT09dm9pZCAwJiYobz9vLnBhZ2UubGVuKGUubGVuZ3RoKTp0Ll9pRGlzcGxheUxlbmd0aD1lLmxlbmd0aCksZS5zdGFydCE9PXZvaWQgMCYmKG89PT1udWxsPyh0Ll9pRGlzcGxheVN0YXJ0PWUuc3RhcnQsdC5pSW5pdERpc3BsYXlTdGFydD1lLnN0YXJ0KTpMaSh0LGUuc3RhcnQvdC5faURpc3BsYXlMZW5ndGgpKSxlLm9yZGVyIT09dm9pZCAwJiYodC5hYVNvcnRpbmc9W10sSC5lYWNoKGUub3JkZXIsZnVuY3Rpb24oZyxtKXt0LmFhU29ydGluZy5wdXNoKG1bMF0+PWkubGVuZ3RoP1swLG1bMV1dOm0pfSkpLGUuc2VhcmNoIT09dm9pZCAwJiZILmV4dGVuZCh0Lm9QcmV2aW91c1NlYXJjaCxlLnNlYXJjaCksZS5jb2x1bW5zKXtmb3Iocj0wLHM9ZS5jb2x1bW5zLmxlbmd0aDtyPHM7cisrKXt2YXIgYj1lLmNvbHVtbnNbcl07Yi52aXNpYmxlIT09dm9pZCAwJiYobz9vLmNvbHVtbihyKS52aXNpYmxlKGIudmlzaWJsZSwhMSk6aVtyXS5iVmlzaWJsZT1iLnZpc2libGUpLGIuc2VhcmNoIT09dm9pZCAwJiZILmV4dGVuZCh0LmFvUHJlU2VhcmNoQ29sc1tyXSxiLnNlYXJjaCl9byYmby5jb2x1bW5zLmFkanVzdCgpfXQuX2JMb2FkaW5nU3RhdGU9ITEsWnQodCwiYW9TdGF0ZUxvYWRlZCIsInN0YXRlTG9hZGVkIixbdCxlXSksbigpfWZ1bmN0aW9uIE9lKHQsZSxuLHIpe2lmKG49IkRhdGFUYWJsZXMgd2FybmluZzogIisodD8idGFibGUgaWQ9Iit0LnNUYWJsZUlkKyIgLSAiOiIiKStuLHImJihuKz0iLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGVycm9yLCBwbGVhc2Ugc2VlIGh0dHBzOi8vZGF0YXRhYmxlcy5uZXQvdG4vIityKSxlKXdpbmRvdy5jb25zb2xlJiZjb25zb2xlLmxvZyYmY29uc29sZS5sb2cobik7ZWxzZXt2YXIgcz1idC5leHQsaT1zLnNFcnJNb2RlfHxzLmVyck1vZGU7aWYodCYmWnQodCxudWxsLCJkdC1lcnJvciIsW3QscixuXSwhMCksaT09ImFsZXJ0IilhbGVydChuKTtlbHNle2lmKGk9PSJ0aHJvdyIpdGhyb3cgbmV3IEVycm9yKG4pO3R5cGVvZiBpPT0iZnVuY3Rpb24iJiZpKHQscixuKX19fWZ1bmN0aW9uIGxuKHQsZSxuLHIpe2lmKEFycmF5LmlzQXJyYXkobikpe0guZWFjaChuLGZ1bmN0aW9uKHMsaSl7QXJyYXkuaXNBcnJheShpKT9sbih0LGUsaVswXSxpWzFdKTpsbih0LGUsaSl9KTtyZXR1cm59cj09PXZvaWQgMCYmKHI9biksZVtuXSE9PXZvaWQgMCYmKHRbcl09ZVtuXSl9ZnVuY3Rpb24gcWEodCxlLG4pe3ZhciByO2Zvcih2YXIgcyBpbiBlKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHMpJiYocj1lW3NdLEguaXNQbGFpbk9iamVjdChyKT8oSC5pc1BsYWluT2JqZWN0KHRbc10pfHwodFtzXT17fSksSC5leHRlbmQoITAsdFtzXSxyKSk6biYmcyE9PSJkYXRhIiYmcyE9PSJhYURhdGEiJiZBcnJheS5pc0FycmF5KHIpP3Rbc109ci5zbGljZSgpOnRbc109cik7cmV0dXJuIHR9ZnVuY3Rpb24gbXModCxlLG4pe0godCkub24oImNsaWNrLkRUIixlLGZ1bmN0aW9uKHIpe24ocil9KS5vbigia2V5cHJlc3MuRFQiLGUsZnVuY3Rpb24ocil7ci53aGljaD09PTEzJiYoci5wcmV2ZW50RGVmYXVsdCgpLG4ocikpfSkub24oInNlbGVjdHN0YXJ0LkRUIixlLGZ1bmN0aW9uKCl7cmV0dXJuITF9KX1mdW5jdGlvbiBCZSh0LGUsbil7biYmdFtlXS5wdXNoKG4pfWZ1bmN0aW9uIFp0KHQsZSxuLHIscyl7dmFyIGk9W107aWYoZSYmKGk9dFtlXS5zbGljZSgpLnJldmVyc2UoKS5tYXAoZnVuY3Rpb24ocCl7cmV0dXJuIHAuYXBwbHkodC5vSW5zdGFuY2Uscil9KSksbiE9PW51bGwpe3ZhciBvPUguRXZlbnQobisiLmR0IiksdT1IKHQublRhYmxlKTtvLmR0PXQuYXBpLHVbcz8idHJpZ2dlciI6InRyaWdnZXJIYW5kbGVyIl0obyxyKSxzJiZ1LnBhcmVudHMoImJvZHkiKS5sZW5ndGg9PT0wJiZIKCJib2R5IikudHJpZ2dlcihvLHIpLGkucHVzaChvLnJlc3VsdCl9cmV0dXJuIGl9ZnVuY3Rpb24gdnModCl7dmFyIGU9dC5faURpc3BsYXlTdGFydCxuPXQuZm5EaXNwbGF5RW5kKCkscj10Ll9pRGlzcGxheUxlbmd0aDtlPj1uJiYoZT1uLXIpLGUtPWUlciwocj09PS0xfHxlPDApJiYoZT0wKSx0Ll9pRGlzcGxheVN0YXJ0PWV9ZnVuY3Rpb24gRnIodCxlKXt2YXIgbj10LnJlbmRlcmVyLHI9YnQuZXh0LnJlbmRlcmVyW2VdO3JldHVybiBILmlzUGxhaW5PYmplY3QobikmJm5bZV0/cltuW2VdXXx8ci5fOnR5cGVvZiBuPT0ic3RyaW5nIiYmcltuXXx8ci5ffWZ1bmN0aW9uIEVlKHQpe3JldHVybiB0Lm9GZWF0dXJlcy5iU2VydmVyU2lkZT8ic3NwIjp0LmFqYXg/ImFqYXgiOiJkb20ifWZ1bmN0aW9uIGppKHQsZSxuKXt2YXIgcj10LmZuRm9ybWF0TnVtYmVyLHM9dC5faURpc3BsYXlTdGFydCsxLGk9dC5faURpc3BsYXlMZW5ndGgsbz10LmZuUmVjb3Jkc0Rpc3BsYXkoKSx1PXQuZm5SZWNvcmRzVG90YWwoKSxwPWk9PT0tMTtyZXR1cm4gZS5yZXBsYWNlKC9fU1RBUlRfL2csci5jYWxsKHQscykpLnJlcGxhY2UoL19FTkRfL2csci5jYWxsKHQsdC5mbkRpc3BsYXlFbmQoKSkpLnJlcGxhY2UoL19NQVhfL2csci5jYWxsKHQsdSkpLnJlcGxhY2UoL19UT1RBTF8vZyxyLmNhbGwodCxvKSkucmVwbGFjZSgvX1BBR0VfL2csci5jYWxsKHQscD8xOk1hdGguY2VpbChzL2kpKSkucmVwbGFjZSgvX1BBR0VTXy9nLHIuY2FsbCh0LHA/MTpNYXRoLmNlaWwoby9pKSkpLnJlcGxhY2UoL19FTlRSSUVTXy9nLHQuYXBpLmkxOG4oImVudHJpZXMiLCIiLG4pKS5yZXBsYWNlKC9fRU5UUklFUy1NQVhfL2csdC5hcGkuaTE4bigiZW50cmllcyIsIiIsdSkpLnJlcGxhY2UoL19FTlRSSUVTLVRPVEFMXy9nLHQuYXBpLmkxOG4oImVudHJpZXMiLCIiLG8pKX12YXIgTWk9W10sYmU9QXJyYXkucHJvdG90eXBlLERsPWZ1bmN0aW9uKHQpe3ZhciBlLG4scj1idC5zZXR0aW5ncyxzPUNlKHIsIm5UYWJsZSIpO2lmKHQpe2lmKHQublRhYmxlJiZ0Lm9GZWF0dXJlcylyZXR1cm5bdF07aWYodC5ub2RlTmFtZSYmdC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09InRhYmxlIilyZXR1cm4gZT1zLmluZGV4T2YodCksZSE9PS0xP1tyW2VdXTpudWxsO2lmKHQmJnR5cGVvZiB0LnNldHRpbmdzPT0iZnVuY3Rpb24iKXJldHVybiB0LnNldHRpbmdzKCkudG9BcnJheSgpO3R5cGVvZiB0PT0ic3RyaW5nIj9uPUgodCkuZ2V0KCk6dCBpbnN0YW5jZW9mIEgmJihuPXQuZ2V0KCkpfWVsc2UgcmV0dXJuW107aWYobilyZXR1cm4gci5maWx0ZXIoZnVuY3Rpb24oaSxvKXtyZXR1cm4gbi5pbmNsdWRlcyhzW29dKX0pfTtXdD1mdW5jdGlvbih0LGUpe2lmKCEodGhpcyBpbnN0YW5jZW9mIFd0KSlyZXR1cm4gbmV3IFd0KHQsZSk7dmFyIG4scj1bXSxzPWZ1bmN0aW9uKGkpe3ZhciBvPURsKGkpO28mJnIucHVzaC5hcHBseShyLG8pfTtpZihBcnJheS5pc0FycmF5KHQpKWZvcihuPTA7bjx0Lmxlbmd0aDtuKyspcyh0W25dKTtlbHNlIHModCk7aWYodGhpcy5jb250ZXh0PXIubGVuZ3RoPjE/eG4ocik6cixlKWlmKGUubGVuZ3RoPDFlNCl0aGlzLnB1c2guYXBwbHkodGhpcyxlKTtlbHNlIGZvcihuPTA7bjxlLmxlbmd0aDtuKyspdGhpcy5wdXNoKGVbbl0pO3RoaXMuc2VsZWN0b3I9e3Jvd3M6bnVsbCxjb2xzOm51bGwsb3B0czpudWxsfSxXdC5leHRlbmQodGhpcyx0aGlzLE1pKX07YnQuQXBpPVd0O0guZXh0ZW5kKFd0LnByb3RvdHlwZSx7YW55OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY291bnQoKSE9PTB9LGNvbnRleHQ6W10sY291bnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5mbGF0dGVuKCkubGVuZ3RofSxlYWNoOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wLG49dGhpcy5sZW5ndGg7ZTxuO2UrKyl0LmNhbGwodGhpcyx0aGlzW2VdLGUsdGhpcyk7cmV0dXJuIHRoaXN9LGVxOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuY29udGV4dDtyZXR1cm4gZS5sZW5ndGg+dD9uZXcgV3QoZVt0XSx0aGlzW3RdKTpudWxsfSxmaWx0ZXI6ZnVuY3Rpb24odCl7dmFyIGU9YmUuZmlsdGVyLmNhbGwodGhpcyx0LHRoaXMpO3JldHVybiBuZXcgV3QodGhpcy5jb250ZXh0LGUpfSxmbGF0dGVuOmZ1bmN0aW9uKCl7dmFyIHQ9W107cmV0dXJuIG5ldyBXdCh0aGlzLmNvbnRleHQsdC5jb25jYXQuYXBwbHkodCx0aGlzLnRvQXJyYXkoKSkpfSxnZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXNbdF19LGpvaW46YmUuam9pbixpbmNsdWRlczpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5pbmRleE9mKHQpIT09LTF9LGluZGV4T2Y6YmUuaW5kZXhPZixpdGVyYXRvcjpmdW5jdGlvbih0LGUsbixyKXt2YXIgcz1bXSxpLG8sdSxwLGIsZz10aGlzLmNvbnRleHQsbSxDLHksVD10aGlzLnNlbGVjdG9yO2Zvcih0eXBlb2YgdD09InN0cmluZyImJihyPW4sbj1lLGU9dCx0PSExKSxvPTAsdT1nLmxlbmd0aDtvPHU7bysrKXt2YXIgUD1uZXcgV3QoZ1tvXSk7aWYoZT09PSJ0YWJsZSIpaT1uLmNhbGwoUCxnW29dLG8pLGkhPT12b2lkIDAmJnMucHVzaChpKTtlbHNlIGlmKGU9PT0iY29sdW1ucyJ8fGU9PT0icm93cyIpaT1uLmNhbGwoUCxnW29dLHRoaXNbb10sbyksaSE9PXZvaWQgMCYmcy5wdXNoKGkpO2Vsc2UgaWYoZT09PSJldmVyeSJ8fGU9PT0iY29sdW1uInx8ZT09PSJjb2x1bW4tcm93cyJ8fGU9PT0icm93Inx8ZT09PSJjZWxsIilmb3IoQz10aGlzW29dLGU9PT0iY29sdW1uLXJvd3MiJiYobT1NcihnW29dLFQub3B0cykpLHA9MCxiPUMubGVuZ3RoO3A8YjtwKyspeT1DW3BdLGU9PT0iY2VsbCI/aT1uLmNhbGwoUCxnW29dLHkucm93LHkuY29sdW1uLG8scCk6aT1uLmNhbGwoUCxnW29dLHksbyxwLG0pLGkhPT12b2lkIDAmJnMucHVzaChpKX1pZihzLmxlbmd0aHx8cil7dmFyIGM9bmV3IFd0KGcsdD9zLmNvbmNhdC5hcHBseShbXSxzKTpzKSxsPWMuc2VsZWN0b3I7cmV0dXJuIGwucm93cz1ULnJvd3MsbC5jb2xzPVQuY29scyxsLm9wdHM9VC5vcHRzLGN9cmV0dXJuIHRoaXN9LGxhc3RJbmRleE9mOmJlLmxhc3RJbmRleE9mLGxlbmd0aDowLG1hcDpmdW5jdGlvbih0KXt2YXIgZT1iZS5tYXAuY2FsbCh0aGlzLHQsdGhpcyk7cmV0dXJuIG5ldyBXdCh0aGlzLmNvbnRleHQsZSl9LHBsdWNrOmZ1bmN0aW9uKHQpe3ZhciBlPWJ0LnV0aWwuZ2V0KHQpO3JldHVybiB0aGlzLm1hcChmdW5jdGlvbihuKXtyZXR1cm4gZShuKX0pfSxwb3A6YmUucG9wLHB1c2g6YmUucHVzaCxyZWR1Y2U6YmUucmVkdWNlLHJlZHVjZVJpZ2h0OmJlLnJlZHVjZVJpZ2h0LHJldmVyc2U6YmUucmV2ZXJzZSxzZWxlY3RvcjpudWxsLHNoaWZ0OmJlLnNoaWZ0LHNsaWNlOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBXdCh0aGlzLmNvbnRleHQsdGhpcyl9LHNvcnQ6YmUuc29ydCxzcGxpY2U6YmUuc3BsaWNlLHRvQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gYmUuc2xpY2UuY2FsbCh0aGlzKX0sdG8kOmZ1bmN0aW9uKCl7cmV0dXJuIEgodGhpcyl9LHRvSlF1ZXJ5OmZ1bmN0aW9uKCl7cmV0dXJuIEgodGhpcyl9LHVuaXF1ZTpmdW5jdGlvbigpe3JldHVybiBuZXcgV3QodGhpcy5jb250ZXh0LHhuKHRoaXMudG9BcnJheSgpKSl9LHVuc2hpZnQ6YmUudW5zaGlmdH0pO2Z1bmN0aW9uIEFsKHQsZSxuKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcj1lLmFwcGx5KHR8fHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gV3QuZXh0ZW5kKHIscixuLm1ldGhvZEV4dCkscn19ZnVuY3Rpb24gSWwodCxlKXtmb3IodmFyIG49MCxyPXQubGVuZ3RoO248cjtuKyspaWYodFtuXS5uYW1lPT09ZSlyZXR1cm4gdFtuXTtyZXR1cm4gbnVsbH13aW5kb3cuX19hcGlTdHJ1Y3Q9TWk7V3QuZXh0ZW5kPWZ1bmN0aW9uKHQsZSxuKXtpZighKCFuLmxlbmd0aHx8IWV8fCEoZSBpbnN0YW5jZW9mIFd0KSYmIWUuX19kdF93cmFwcGVyKSl7dmFyIHIscyxpO2ZvcihyPTAscz1uLmxlbmd0aDtyPHM7cisrKWk9bltyXSxpLm5hbWUhPT0iX19wcm90b19fIiYmKGVbaS5uYW1lXT1pLnR5cGU9PT0iZnVuY3Rpb24iP0FsKHQsaS52YWwsaSk6aS50eXBlPT09Im9iamVjdCI/e306aS52YWwsZVtpLm5hbWVdLl9fZHRfd3JhcHBlcj0hMCxXdC5leHRlbmQodCxlW2kubmFtZV0saS5wcm9wRXh0KSl9fTtXdC5yZWdpc3Rlcj1JdD1mdW5jdGlvbih0LGUpe2lmKEFycmF5LmlzQXJyYXkodCkpe2Zvcih2YXIgbj0wLHI9dC5sZW5ndGg7bjxyO24rKylXdC5yZWdpc3Rlcih0W25dLGUpO3JldHVybn12YXIgcyxpLG89dC5zcGxpdCgiLiIpLHU9TWkscCxiO2ZvcihzPTAsaT1vLmxlbmd0aDtzPGk7cysrKXtiPW9bc10uaW5kZXhPZigiKCkiKSE9PS0xLHA9Yj9vW3NdLnJlcGxhY2UoIigpIiwiIik6b1tzXTt2YXIgZz1JbCh1LHApO2d8fChnPXtuYW1lOnAsdmFsOnt9LG1ldGhvZEV4dDpbXSxwcm9wRXh0OltdLHR5cGU6Im9iamVjdCJ9LHUucHVzaChnKSkscz09PWktMT8oZy52YWw9ZSxnLnR5cGU9dHlwZW9mIGU9PSJmdW5jdGlvbiI/ImZ1bmN0aW9uIjpILmlzUGxhaW5PYmplY3QoZSk/Im9iamVjdCI6Im90aGVyIik6dT1iP2cubWV0aG9kRXh0OmcucHJvcEV4dH19O1d0LnJlZ2lzdGVyUGx1cmFsPVF0PWZ1bmN0aW9uKHQsZSxuKXtXdC5yZWdpc3Rlcih0LG4pLFd0LnJlZ2lzdGVyKGUsZnVuY3Rpb24oKXt2YXIgcj1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gcj09PXRoaXM/dGhpczpyIGluc3RhbmNlb2YgV3Q/ci5sZW5ndGg/QXJyYXkuaXNBcnJheShyWzBdKT9uZXcgV3Qoci5jb250ZXh0LHJbMF0pOnJbMF06dm9pZCAwOnJ9KX07dmFyIGdzPWZ1bmN0aW9uKHQsZSl7aWYoQXJyYXkuaXNBcnJheSh0KSl7dmFyIG49W107cmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbihzKXt2YXIgaT1ncyhzLGUpO24ucHVzaC5hcHBseShuLGkpfSksbi5maWx0ZXIoZnVuY3Rpb24ocyl7cmV0dXJuIHN9KX1pZih0eXBlb2YgdD09Im51bWJlciIpcmV0dXJuW2VbdF1dO3ZhciByPWUubWFwKGZ1bmN0aW9uKHMpe3JldHVybiBzLm5UYWJsZX0pO3JldHVybiBIKHIpLmZpbHRlcih0KS5tYXAoZnVuY3Rpb24oKXt2YXIgcz1yLmluZGV4T2YodGhpcyk7cmV0dXJuIGVbc119KS50b0FycmF5KCl9O0l0KCJ0YWJsZXMoKSIsZnVuY3Rpb24odCl7cmV0dXJuIHQhPW51bGw/bmV3IFd0KGdzKHQsdGhpcy5jb250ZXh0KSk6dGhpc30pO0l0KCJ0YWJsZSgpIixmdW5jdGlvbih0KXt2YXIgZT10aGlzLnRhYmxlcyh0KSxuPWUuY29udGV4dDtyZXR1cm4gbi5sZW5ndGg/bmV3IFd0KG5bMF0pOmV9KTtbWyJub2RlcyIsIm5vZGUiLCJuVGFibGUiXSxbImJvZHkiLCJib2R5IiwiblRCb2R5Il0sWyJoZWFkZXIiLCJoZWFkZXIiLCJuVEhlYWQiXSxbImZvb3RlciIsImZvb3RlciIsIm5URm9vdCJdXS5mb3JFYWNoKGZ1bmN0aW9uKHQpe1F0KCJ0YWJsZXMoKS4iK3RbMF0rIigpIiwidGFibGUoKS4iK3RbMV0rIigpIixmdW5jdGlvbigpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24oZSl7cmV0dXJuIGVbdFsyXV19LDEpfSl9KTtbWyJoZWFkZXIiLCJhb0hlYWRlciJdLFsiZm9vdGVyIiwiYW9Gb290ZXIiXV0uZm9yRWFjaChmdW5jdGlvbih0KXtJdCgidGFibGUoKS4iK3RbMF0rIi5zdHJ1Y3R1cmUoKSIsZnVuY3Rpb24oZSl7dmFyIG49dGhpcy5jb2x1bW5zKGUpLmluZGV4ZXMoKS5mbGF0dGVuKCkscj10aGlzLmNvbnRleHRbMF07cmV0dXJuIG9zKHIsclt0WzFdXSxuKX0pfSk7UXQoInRhYmxlcygpLmNvbnRhaW5lcnMoKSIsInRhYmxlKCkuY29udGFpbmVyKCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbih0KXtyZXR1cm4gdC5uVGFibGVXcmFwcGVyfSwxKX0pO0l0KCJ0YWJsZXMoKS5ldmVyeSgpIixmdW5jdGlvbih0KXt2YXIgZT10aGlzO3JldHVybiB0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24obixyKXt0LmNhbGwoZS50YWJsZShyKSxyKX0pfSk7SXQoImNhcHRpb24oKSIsZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmNvbnRleHQ7aWYodD09PXZvaWQgMCl7dmFyIHI9blswXS5jYXB0aW9uTm9kZTtyZXR1cm4gciYmbi5sZW5ndGg/ci5pbm5lckhUTUw6bnVsbH1yZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKHMpe3ZhciBpPUgocy5uVGFibGUpLG89SChzLmNhcHRpb25Ob2RlKSx1PUgocy5uVGFibGVXcmFwcGVyKTtpZihvLmxlbmd0aHx8KG89SCgiPGNhcHRpb24vPiIpLmh0bWwodCkscy5jYXB0aW9uTm9kZT1vWzBdLGV8fChpLnByZXBlbmQobyksZT1vLmNzcygiY2FwdGlvbi1zaWRlIikpKSxvLmh0bWwodCksZSYmKG8uY3NzKCJjYXB0aW9uLXNpZGUiLGUpLG9bMF0uX2NhcHRpb25TaWRlPWUpLHUuZmluZCgiZGl2LmRhdGFUYWJsZXNfc2Nyb2xsIikubGVuZ3RoKXt2YXIgcD1lPT09InRvcCI/IkhlYWQiOiJGb290Ijt1LmZpbmQoImRpdi5kYXRhVGFibGVzX3Njcm9sbCIrcCsiIHRhYmxlIikucHJlcGVuZChvKX1lbHNlIGkucHJlcGVuZChvKX0sMSl9KTtJdCgiY2FwdGlvbi5ub2RlKCkiLGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jb250ZXh0O3JldHVybiB0Lmxlbmd0aD90WzBdLmNhcHRpb25Ob2RlOm51bGx9KTtJdCgiZHJhdygpIixmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKGUpe3Q9PT0icGFnZSI/TG4oZSk6KHR5cGVvZiB0PT0ic3RyaW5nIiYmKHQ9dCE9PSJmdWxsLWhvbGQiKSxSbihlLHQ9PT0hMSkpfSl9KTtJdCgicGFnZSgpIixmdW5jdGlvbih0KXtyZXR1cm4gdD09PXZvaWQgMD90aGlzLnBhZ2UuaW5mbygpLnBhZ2U6dGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKGUpe0xpKGUsdCl9KX0pO0l0KCJwYWdlLmluZm8oKSIsZnVuY3Rpb24oKXtpZih0aGlzLmNvbnRleHQubGVuZ3RoIT09MCl7dmFyIHQ9dGhpcy5jb250ZXh0WzBdLGU9dC5faURpc3BsYXlTdGFydCxuPXQub0ZlYXR1cmVzLmJQYWdpbmF0ZT90Ll9pRGlzcGxheUxlbmd0aDotMSxyPXQuZm5SZWNvcmRzRGlzcGxheSgpLHM9bj09PS0xO3JldHVybntwYWdlOnM/MDpNYXRoLmZsb29yKGUvbikscGFnZXM6cz8xOk1hdGguY2VpbChyL24pLHN0YXJ0OmUsZW5kOnQuZm5EaXNwbGF5RW5kKCksbGVuZ3RoOm4scmVjb3Jkc1RvdGFsOnQuZm5SZWNvcmRzVG90YWwoKSxyZWNvcmRzRGlzcGxheTpyLHNlcnZlclNpZGU6RWUodCk9PT0ic3NwIn19fSk7SXQoInBhZ2UubGVuKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0PT09dm9pZCAwP3RoaXMuY29udGV4dC5sZW5ndGghPT0wP3RoaXMuY29udGV4dFswXS5faURpc3BsYXlMZW5ndGg6dm9pZCAwOnRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihlKXtkcyhlLHQpfSl9KTt2YXIgeXM9ZnVuY3Rpb24odCxlLG4pe2lmKG4pe3ZhciByPW5ldyBXdCh0KTtyLm9uZSgiZHJhdyIsZnVuY3Rpb24oKXtuKHIuYWpheC5qc29uKCkpfSl9aWYoRWUodCk9PSJzc3AiKVJuKHQsZSk7ZWxzZXtrZSh0LCEwKTt2YXIgcz10LmpxWEhSO3MmJnMucmVhZHlTdGF0ZSE9PTQmJnMuYWJvcnQoKSxSaSh0LHt9LGZ1bmN0aW9uKGkpe09pKHQpO2Zvcih2YXIgbz1Mcih0LGkpLHU9MCxwPW8ubGVuZ3RoO3U8cDt1KyspeW4odCxvW3VdKTtSbih0LGUpLFByKHQpLGtlKHQsITEpfSl9fTtJdCgiYWpheC5qc29uKCkiLGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jb250ZXh0O2lmKHQubGVuZ3RoPjApcmV0dXJuIHRbMF0uanNvbn0pO0l0KCJhamF4LnBhcmFtcygpIixmdW5jdGlvbigpe3ZhciB0PXRoaXMuY29udGV4dDtpZih0Lmxlbmd0aD4wKXJldHVybiB0WzBdLm9BamF4RGF0YX0pO0l0KCJhamF4LnJlbG9hZCgpIixmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24obil7eXMobixlPT09ITEsdCl9KX0pO0l0KCJhamF4LnVybCgpIixmdW5jdGlvbih0KXt2YXIgZT10aGlzLmNvbnRleHQ7cmV0dXJuIHQ9PT12b2lkIDA/ZS5sZW5ndGg9PT0wP3ZvaWQgMDooZT1lWzBdLEguaXNQbGFpbk9iamVjdChlLmFqYXgpP2UuYWpheC51cmw6ZS5hamF4KTp0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24obil7SC5pc1BsYWluT2JqZWN0KG4uYWpheCk/bi5hamF4LnVybD10Om4uYWpheD10fSl9KTtJdCgiYWpheC51cmwoKS5sb2FkKCkiLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihuKXt5cyhuLGU9PT0hMSx0KX0pfSk7dmFyIFZpPWZ1bmN0aW9uKHQsZSxuLHIscyl7dmFyIGk9W10sbyx1LHAsYixnLG0sQz10eXBlb2YgZTtmb3IoKCFlfHxDPT09InN0cmluZyJ8fEM9PT0iZnVuY3Rpb24ifHxlLmxlbmd0aD09PXZvaWQgMCkmJihlPVtlXSkscD0wLGI9ZS5sZW5ndGg7cDxiO3ArKylmb3IodT1lW3BdJiZlW3BdLnNwbGl0JiYhZVtwXS5tYXRjaCgvW1soOl0vKT9lW3BdLnNwbGl0KCIsIik6W2VbcF1dLGc9MCxtPXUubGVuZ3RoO2c8bTtnKyspbz1uKHR5cGVvZiB1W2ddPT0ic3RyaW5nIj91W2ddLnRyaW0oKTp1W2ddKSxvPW8uZmlsdGVyKGZ1bmN0aW9uKFQpe3JldHVybiBUIT1udWxsfSksbyYmby5sZW5ndGgmJihpPWkuY29uY2F0KG8pKTt2YXIgeT1sZS5zZWxlY3Rvclt0XTtpZih5Lmxlbmd0aClmb3IocD0wLGI9eS5sZW5ndGg7cDxiO3ArKylpPXlbcF0ocixzLGkpO3JldHVybiB4bihpKX0sSGk9ZnVuY3Rpb24odCl7cmV0dXJuIHR8fCh0PXt9KSx0LmZpbHRlciYmdC5zZWFyY2g9PT12b2lkIDAmJih0LnNlYXJjaD10LmZpbHRlciksSC5leHRlbmQoe3NlYXJjaDoibm9uZSIsb3JkZXI6ImN1cnJlbnQiLHBhZ2U6ImFsbCJ9LHQpfSxVaT1mdW5jdGlvbih0KXtsZXQgZT1uZXcgV3QodC5jb250ZXh0WzBdKTtyZXR1cm4gdC5sZW5ndGgmJmUucHVzaCh0WzBdKSxlLnNlbGVjdG9yPXQuc2VsZWN0b3IsZS5sZW5ndGgmJmVbMF0ubGVuZ3RoPjEmJmVbMF0uc3BsaWNlKDEpLGV9LE1yPWZ1bmN0aW9uKHQsZSl7dmFyIG4scixzLGk9W10sbz10LmFpRGlzcGxheSx1PXQuYWlEaXNwbGF5TWFzdGVyLHA9ZS5zZWFyY2gsYj1lLm9yZGVyLGc9ZS5wYWdlO2lmKEVlKHQpPT0ic3NwIilyZXR1cm4gcD09PSJyZW1vdmVkIj9bXTphbigwLHUubGVuZ3RoKTtpZihnPT0iY3VycmVudCIpZm9yKG49dC5faURpc3BsYXlTdGFydCxyPXQuZm5EaXNwbGF5RW5kKCk7bjxyO24rKylpLnB1c2gob1tuXSk7ZWxzZSBpZihiPT0iY3VycmVudCJ8fGI9PSJhcHBsaWVkIil7aWYocD09Im5vbmUiKWk9dS5zbGljZSgpO2Vsc2UgaWYocD09ImFwcGxpZWQiKWk9by5zbGljZSgpO2Vsc2UgaWYocD09InJlbW92ZWQiKXt2YXIgbT17fTtmb3Iobj0wLHI9by5sZW5ndGg7bjxyO24rKyltW29bbl1dPW51bGw7dS5mb3JFYWNoKGZ1bmN0aW9uKHkpe09iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtLHkpfHxpLnB1c2goeSl9KX19ZWxzZSBpZihiPT0iaW5kZXgifHxiPT0ib3JpZ2luYWwiKWZvcihuPTAscj10LmFvRGF0YS5sZW5ndGg7bjxyO24rKyl0LmFvRGF0YVtuXSYmKHA9PSJub25lIj9pLnB1c2gobik6KHM9by5pbmRleE9mKG4pLChzPT09LTEmJnA9PSJyZW1vdmVkInx8cz49MCYmcD09ImFwcGxpZWQiKSYmaS5wdXNoKG4pKSk7ZWxzZSBpZih0eXBlb2YgYj09Im51bWJlciIpe3ZhciBDPXppKHQsYiwiYXNjIik7aWYocD09PSJub25lIilpPUM7ZWxzZSBmb3Iobj0wO248Qy5sZW5ndGg7bisrKXM9by5pbmRleE9mKENbbl0pLChzPT09LTEmJnA9PSJyZW1vdmVkInx8cz49MCYmcD09ImFwcGxpZWQiKSYmaS5wdXNoKENbbl0pfXJldHVybiBpfSxQbD1mdW5jdGlvbih0LGUsbil7dmFyIHIscz1mdW5jdGlvbihvKXt2YXIgdT1KYShvKSxwPXQuYW9EYXRhO2lmKHUhPT1udWxsJiYhbilyZXR1cm5bdV07aWYocnx8KHI9TXIodCxuKSksdSE9PW51bGwmJnIuaW5kZXhPZih1KSE9PS0xKXJldHVyblt1XTtpZihvPT1udWxsfHxvPT09IiIpcmV0dXJuIHI7aWYodHlwZW9mIG89PSJmdW5jdGlvbiIpcmV0dXJuIHIubWFwKGZ1bmN0aW9uKFQpe3ZhciBQPXBbVF07cmV0dXJuIG8oVCxQLl9hRGF0YSxQLm5Ucik/VDpudWxsfSk7aWYoby5ub2RlTmFtZSl7dmFyIGI9by5fRFRfUm93SW5kZXgsZz1vLl9EVF9DZWxsSW5kZXg7aWYoYiE9PXZvaWQgMClyZXR1cm4gcFtiXSYmcFtiXS5uVHI9PT1vP1tiXTpbXTtpZihnKXJldHVybiBwW2cucm93XSYmcFtnLnJvd10ublRyPT09by5wYXJlbnROb2RlP1tnLnJvd106W107dmFyIG09SChvKS5jbG9zZXN0KCIqW2RhdGEtZHQtcm93XSIpO3JldHVybiBtLmxlbmd0aD9bbS5kYXRhKCJkdC1yb3ciKV06W119aWYodHlwZW9mIG89PSJzdHJpbmciJiZvLmNoYXJBdCgwKT09PSIjIil7dmFyIEM9dC5hSWRzW28ucmVwbGFjZSgvXiMvLCIiKV07aWYoQyE9PXZvaWQgMClyZXR1cm5bQy5pZHhdfXZhciB5PXRzKGVyKHQuYW9EYXRhLHIsIm5UciIpKTtyZXR1cm4gSCh5KS5maWx0ZXIobykubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX0RUX1Jvd0luZGV4fSkudG9BcnJheSgpfSxpPVZpKCJyb3ciLGUscyx0LG4pO3JldHVybihuLm9yZGVyPT09ImN1cnJlbnQifHxuLm9yZGVyPT09ImFwcGxpZWQiKSYmYnModCxpKSxpfTtJdCgicm93cygpIixmdW5jdGlvbih0LGUpe3Q9PT12b2lkIDA/dD0iIjpILmlzUGxhaW5PYmplY3QodCkmJihlPXQsdD0iIiksZT1IaShlKTt2YXIgbj10aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24ocil7cmV0dXJuIFBsKHIsdCxlKX0sMSk7cmV0dXJuIG4uc2VsZWN0b3Iucm93cz10LG4uc2VsZWN0b3Iub3B0cz1lLG59KTtJdCgicm93cygpLm5vZGVzKCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoInJvdyIsZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5hb0RhdGFbZV0ublRyfHx2b2lkIDB9LDEpfSk7SXQoInJvd3MoKS5kYXRhKCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoITAsInJvd3MiLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGVyKHQuYW9EYXRhLGUsIl9hRGF0YSIpfSwxKX0pO1F0KCJyb3dzKCkuY2FjaGUoKSIsInJvdygpLmNhY2hlKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJyb3ciLGZ1bmN0aW9uKGUsbil7dmFyIHI9ZS5hb0RhdGFbbl07cmV0dXJuIHQ9PT0ic2VhcmNoIj9yLl9hRmlsdGVyRGF0YTpyLl9hU29ydERhdGF9LDEpfSk7UXQoInJvd3MoKS5pbnZhbGlkYXRlKCkiLCJyb3coKS5pbnZhbGlkYXRlKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJyb3ciLGZ1bmN0aW9uKGUsbil7UnIoZSxuLHQpfSl9KTtRdCgicm93cygpLmluZGV4ZXMoKSIsInJvdygpLmluZGV4KCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoInJvdyIsZnVuY3Rpb24odCxlKXtyZXR1cm4gZX0sMSl9KTtRdCgicm93cygpLmlkcygpIiwicm93KCkuaWQoKSIsZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49dGhpcy5jb250ZXh0LHI9MCxzPW4ubGVuZ3RoO3I8cztyKyspZm9yKHZhciBpPTAsbz10aGlzW3JdLmxlbmd0aDtpPG87aSsrKXt2YXIgdT1uW3JdLnJvd0lkRm4obltyXS5hb0RhdGFbdGhpc1tyXVtpXV0uX2FEYXRhKTtlLnB1c2goKHQ9PT0hMD8iIyI6IiIpK3UpfXJldHVybiBuZXcgV3QobixlKX0pO1F0KCJyb3dzKCkucmVtb3ZlKCkiLCJyb3coKS5yZW1vdmUoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigicm93IixmdW5jdGlvbih0LGUpe3ZhciBuPXQuYW9EYXRhLHI9bltlXSxzPXQuYWlEaXNwbGF5TWFzdGVyLmluZGV4T2YoZSk7cyE9PS0xJiZ0LmFpRGlzcGxheU1hc3Rlci5zcGxpY2UocywxKSx0Ll9pUmVjb3Jkc0Rpc3BsYXk+MCYmdC5faVJlY29yZHNEaXNwbGF5LS0sdnModCk7dmFyIGk9dC5yb3dJZEZuKHIuX2FEYXRhKTtpIT09dm9pZCAwJiZkZWxldGUgdC5hSWRzW2ldLG5bZV09bnVsbH0pLHRoaXN9KTtJdCgicm93cy5hZGQoKSIsZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKHIpe3ZhciBzLGksbyx1PVtdO2ZvcihpPTAsbz10Lmxlbmd0aDtpPG87aSsrKXM9dFtpXSxzLm5vZGVOYW1lJiZzLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk9PT0iVFIiP3UucHVzaChOaShyLHMpWzBdKTp1LnB1c2goeW4ocixzKSk7cmV0dXJuIHV9LDEpLG49dGhpcy5yb3dzKC0xKTtyZXR1cm4gbi5wb3AoKSxuLnB1c2guYXBwbHkobixlKSxufSk7SXQoInJvdygpIixmdW5jdGlvbih0LGUpe3JldHVybiBVaSh0aGlzLnJvd3ModCxlKSl9KTtJdCgicm93KCkuZGF0YSgpIixmdW5jdGlvbih0KXt2YXIgZT10aGlzLmNvbnRleHQ7aWYodD09PXZvaWQgMClyZXR1cm4gZS5sZW5ndGgmJnRoaXMubGVuZ3RoJiZ0aGlzWzBdLmxlbmd0aD9lWzBdLmFvRGF0YVt0aGlzWzBdXS5fYURhdGE6dm9pZCAwO3ZhciBuPWVbMF0uYW9EYXRhW3RoaXNbMF1dO3JldHVybiBuLl9hRGF0YT10LEFycmF5LmlzQXJyYXkodCkmJm4ublRyJiZuLm5Uci5pZCYmdm4oZVswXS5yb3dJZCkodCxuLm5Uci5pZCksUnIoZVswXSx0aGlzWzBdLCJkYXRhIiksdGhpc30pO0l0KCJyb3coKS5ub2RlKCkiLGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jb250ZXh0O2lmKHQubGVuZ3RoJiZ0aGlzLmxlbmd0aCYmdGhpc1swXS5sZW5ndGgpe3ZhciBlPXRbMF0uYW9EYXRhW3RoaXNbMF1dO2lmKGUmJmUublRyKXJldHVybiBlLm5Ucn1yZXR1cm4gbnVsbH0pO0l0KCJyb3cuYWRkKCkiLGZ1bmN0aW9uKHQpe3QgaW5zdGFuY2VvZiBIJiZ0Lmxlbmd0aCYmKHQ9dFswXSk7dmFyIGU9dGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKG4pe3JldHVybiB0Lm5vZGVOYW1lJiZ0Lm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk9PT0iVFIiP05pKG4sdClbMF06eW4obix0KX0pO3JldHVybiB0aGlzLnJvdyhlWzBdKX0pO0goZG9jdW1lbnQpLm9uKCJwbHVnaW4taW5pdC5kdCIsZnVuY3Rpb24odCxlKXt2YXIgbj1uZXcgV3QoZSk7bi5vbigic3RhdGVTYXZlUGFyYW1zLkRUIixmdW5jdGlvbihyLHMsaSl7Zm9yKHZhciBvPXMucm93SWRGbix1PXMuYWlEaXNwbGF5TWFzdGVyLHA9W10sYj0wO2I8dS5sZW5ndGg7YisrKXt2YXIgZz11W2JdLG09cy5hb0RhdGFbZ107bS5fZGV0YWlsc1Nob3cmJnAucHVzaCgiIyIrbyhtLl9hRGF0YSkpfWkuY2hpbGRSb3dzPXB9KSxuLm9uKCJzdGF0ZUxvYWRlZC5EVCIsZnVuY3Rpb24ocixzLGkpe1hhKG4saSl9KSxYYShuLG4uc3RhdGUubG9hZGVkKCkpfSk7dmFyIFhhPWZ1bmN0aW9uKHQsZSl7ZSYmZS5jaGlsZFJvd3MmJnQucm93cyhlLmNoaWxkUm93cy5tYXAoZnVuY3Rpb24obil7cmV0dXJuIG4ucmVwbGFjZSgvKFteOlxcXSooPzpcXC5bXjpcXF0qKSopOi9nLCIkMVxcOiIpfSkpLmV2ZXJ5KGZ1bmN0aW9uKCl7WnQodC5zZXR0aW5ncygpWzBdLG51bGwsInJlcXVlc3RDaGlsZCIsW3RoaXNdKX0pfSxGbD1mdW5jdGlvbih0LGUsbixyKXt2YXIgcz1bXSxpPWZ1bmN0aW9uKG8sdSl7aWYoQXJyYXkuaXNBcnJheShvKXx8byBpbnN0YW5jZW9mIEgpe2Zvcih2YXIgcD0wLGI9by5sZW5ndGg7cDxiO3ArKylpKG9bcF0sdSk7cmV0dXJufWlmKG8ubm9kZU5hbWUmJm8ubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJ0ciIpby5zZXRBdHRyaWJ1dGUoImRhdGEtZHQtcm93IixlLmlkeCkscy5wdXNoKG8pO2Vsc2V7dmFyIGc9SCgiPHRyPjx0ZD48L3RkPjwvdHI+IikuYXR0cigiZGF0YS1kdC1yb3ciLGUuaWR4KS5hZGRDbGFzcyh1KTtIKCJ0ZCIsZykuYWRkQ2xhc3ModSkuaHRtbChvKVswXS5jb2xTcGFuPUVyKHQpLHMucHVzaChnWzBdKX19O2kobixyKSxlLl9kZXRhaWxzJiZlLl9kZXRhaWxzLmRldGFjaCgpLGUuX2RldGFpbHM9SChzKSxlLl9kZXRhaWxzU2hvdyYmZS5fZGV0YWlscy5pbnNlcnRBZnRlcihlLm5Ucil9LHdzPWJ0LnV0aWwudGhyb3R0bGUoZnVuY3Rpb24odCl7anIodFswXSl9LDUwMCksV2k9ZnVuY3Rpb24odCxlKXt2YXIgbj10LmNvbnRleHQ7aWYobi5sZW5ndGgpe3ZhciByPW5bMF0uYW9EYXRhW2UhPT12b2lkIDA/ZTp0WzBdXTtyJiZyLl9kZXRhaWxzJiYoci5fZGV0YWlscy5yZW1vdmUoKSxyLl9kZXRhaWxzU2hvdz12b2lkIDAsci5fZGV0YWlscz12b2lkIDAsSChyLm5UcikucmVtb3ZlQ2xhc3MoImR0LWhhc0NoaWxkIiksd3MobikpfX0seHM9ZnVuY3Rpb24odCxlKXt2YXIgbj10LmNvbnRleHQ7aWYobi5sZW5ndGgmJnQubGVuZ3RoKXt2YXIgcj1uWzBdLmFvRGF0YVt0WzBdXTtyLl9kZXRhaWxzJiYoci5fZGV0YWlsc1Nob3c9ZSxlPyhyLl9kZXRhaWxzLmluc2VydEFmdGVyKHIublRyKSxIKHIublRyKS5hZGRDbGFzcygiZHQtaGFzQ2hpbGQiKSk6KHIuX2RldGFpbHMuZGV0YWNoKCksSChyLm5UcikucmVtb3ZlQ2xhc3MoImR0LWhhc0NoaWxkIikpLFp0KG5bMF0sbnVsbCwiY2hpbGRSb3ciLFtlLHQucm93KHRbMF0pXSksQmwoblswXSksd3MobikpfX0sQmw9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IFd0KHQpLG49Ii5kdC5EVF9kZXRhaWxzIixyPSJkcmF3IituLHM9ImNvbHVtbi1zaXppbmciK24saT0iZGVzdHJveSIrbixvPXQuYW9EYXRhO2Uub2ZmKHIrIiAiK3MrIiAiK2kpLENlKG8sIl9kZXRhaWxzIikubGVuZ3RoPjAmJihlLm9uKHIsZnVuY3Rpb24odSxwKXt0PT09cCYmZS5yb3dzKHtwYWdlOiJjdXJyZW50In0pLmVxKDApLmVhY2goZnVuY3Rpb24oYil7dmFyIGc9b1tiXTtnLl9kZXRhaWxzU2hvdyYmZy5fZGV0YWlscy5pbnNlcnRBZnRlcihnLm5Ucil9KX0pLGUub24ocyxmdW5jdGlvbih1LHApe2lmKHQ9PT1wKWZvcih2YXIgYixnPUVyKHApLG09MCxDPW8ubGVuZ3RoO208QzttKyspYj1vW21dLGImJmIuX2RldGFpbHMmJmIuX2RldGFpbHMuZWFjaChmdW5jdGlvbigpe3ZhciB5PUgodGhpcykuY2hpbGRyZW4oInRkIik7eS5sZW5ndGg9PTEmJnkuYXR0cigiY29sc3BhbiIsZyl9KX0pLGUub24oaSxmdW5jdGlvbih1LHApe2lmKHQ9PT1wKWZvcih2YXIgYj0wLGc9by5sZW5ndGg7YjxnO2IrKylvW2JdJiZvW2JdLl9kZXRhaWxzJiZXaShlLGIpfSkpfSxObD0iIixycj1ObCsicm93KCkuY2hpbGQiLFZyPXJyKyIoKSI7SXQoVnIsZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmNvbnRleHQ7cmV0dXJuIHQ9PT12b2lkIDA/bi5sZW5ndGgmJnRoaXMubGVuZ3RoJiZuWzBdLmFvRGF0YVt0aGlzWzBdXT9uWzBdLmFvRGF0YVt0aGlzWzBdXS5fZGV0YWlsczp2b2lkIDA6KHQ9PT0hMD90aGlzLmNoaWxkLnNob3coKTp0PT09ITE/V2kodGhpcyk6bi5sZW5ndGgmJnRoaXMubGVuZ3RoJiZGbChuWzBdLG5bMF0uYW9EYXRhW3RoaXNbMF1dLHQsZSksdGhpcyl9KTtJdChbcnIrIi5zaG93KCkiLFZyKyIuc2hvdygpIl0sZnVuY3Rpb24oKXtyZXR1cm4geHModGhpcywhMCksdGhpc30pO0l0KFtycisiLmhpZGUoKSIsVnIrIi5oaWRlKCkiXSxmdW5jdGlvbigpe3JldHVybiB4cyh0aGlzLCExKSx0aGlzfSk7SXQoW3JyKyIucmVtb3ZlKCkiLFZyKyIucmVtb3ZlKCkiXSxmdW5jdGlvbigpe3JldHVybiBXaSh0aGlzKSx0aGlzfSk7SXQocnIrIi5pc1Nob3duKCkiLGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jb250ZXh0O3JldHVybiB0Lmxlbmd0aCYmdGhpcy5sZW5ndGgmJnRbMF0uYW9EYXRhW3RoaXNbMF1dJiZ0WzBdLmFvRGF0YVt0aGlzWzBdXS5fZGV0YWlsc1Nob3d8fCExfSk7dmFyIE9sPS9eKFteOl0rKT86KG5hbWV8dGl0bGV8dmlzSWR4fHZpc2libGUpJC8sR2k9ZnVuY3Rpb24odCxlLG4scixzLGkpe2Zvcih2YXIgbz1bXSx1PTAscD1zLmxlbmd0aDt1PHA7dSsrKW8ucHVzaChSZSh0LHNbdV0sZSxpKSk7cmV0dXJuIG99LF9zPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10LmFvSGVhZGVyLHM9biE9PXZvaWQgMD9uOnQuYlNvcnRDZWxsc1RvcD8wOnIubGVuZ3RoLTE7cmV0dXJuIHJbc11bZV0uY2VsbH0sRWw9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXQuYW9Db2x1bW5zLHM9Q2Uociwic05hbWUiKSxpPUNlKHIsInNUaXRsZSIpLG89YnQudXRpbC5nZXQoIltdLltdLmNlbGwiKSh0LmFvSGVhZGVyKSx1PXhuKEFpKFtdLG8pKSxwPWZ1bmN0aW9uKGIpe3ZhciBnPUphKGIpO2lmKGI9PT0iIilyZXR1cm4gYW4oci5sZW5ndGgpO2lmKGchPT1udWxsKXJldHVybltnPj0wP2c6ci5sZW5ndGgrZ107aWYodHlwZW9mIGI9PSJmdW5jdGlvbiIpe3ZhciBtPU1yKHQsbik7cmV0dXJuIHIubWFwKGZ1bmN0aW9uKGwsaCl7cmV0dXJuIGIoaCxHaSh0LGgsMCwwLG0pLF9zKHQsaCkpP2g6bnVsbH0pfXZhciBDPXR5cGVvZiBiPT0ic3RyaW5nIj9iLm1hdGNoKE9sKToiIjtpZihDKXN3aXRjaChDWzJdKXtjYXNlInZpc0lkeCI6Y2FzZSJ2aXNpYmxlIjppZihDWzFdJiZDWzFdLm1hdGNoKC9eXGQrJC8pKXt2YXIgeT1wYXJzZUludChDWzFdLDEwKTtpZih5PDApe3ZhciBUPXIubWFwKGZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuYlZpc2libGU/aDpudWxsfSk7cmV0dXJuW1RbVC5sZW5ndGgreV1dfXJldHVybltJaSh0LHkpXX1yZXR1cm4gci5tYXAoZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5iVmlzaWJsZT9DWzFdP0godVtoXSkuZmlsdGVyKENbMV0pLmxlbmd0aD4wP2g6bnVsbDpoOm51bGx9KTtjYXNlIm5hbWUiOnJldHVybiBzLm1hcChmdW5jdGlvbihsLGgpe3JldHVybiBsPT09Q1sxXT9oOm51bGx9KTtjYXNlInRpdGxlIjpyZXR1cm4gaS5tYXAoZnVuY3Rpb24obCxoKXtyZXR1cm4gbD09PUNbMV0/aDpudWxsfSk7ZGVmYXVsdDpyZXR1cm5bXX1pZihiLm5vZGVOYW1lJiZiLl9EVF9DZWxsSW5kZXgpcmV0dXJuW2IuX0RUX0NlbGxJbmRleC5jb2x1bW5dO3ZhciBQPUgodSkuZmlsdGVyKGIpLm1hcChmdW5jdGlvbigpe3JldHVybiBCaSh0aGlzKX0pLnRvQXJyYXkoKTtpZihQLmxlbmd0aHx8IWIubm9kZU5hbWUpcmV0dXJuIFA7dmFyIGM9SChiKS5jbG9zZXN0KCIqW2RhdGEtZHQtY29sdW1uXSIpO3JldHVybiBjLmxlbmd0aD9bYy5kYXRhKCJkdC1jb2x1bW4iKV06W119O3JldHVybiBWaSgiY29sdW1uIixlLHAsdCxuKX0sUmw9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXQuYW9Db2x1bW5zLHM9cltlXSxpPXQuYW9EYXRhLG8sdSxwLGI7aWYobj09PXZvaWQgMClyZXR1cm4gcy5iVmlzaWJsZTtpZihzLmJWaXNpYmxlPT09bilyZXR1cm4hMTtpZihuKXt2YXIgZz1DZShyLCJiVmlzaWJsZSIpLmluZGV4T2YoITAsZSsxKTtmb3IodT0wLHA9aS5sZW5ndGg7dTxwO3UrKylpW3VdJiYoYj1pW3VdLm5UcixvPWlbdV0uYW5DZWxscyxiJiZiLmluc2VydEJlZm9yZShvW2VdLG9bZ118fG51bGwpKX1lbHNlIEgoQ2UodC5hb0RhdGEsImFuQ2VsbHMiLGUpKS5kZXRhY2goKTtyZXR1cm4gcy5iVmlzaWJsZT1uLGhzKHQpLCEwfTtJdCgiY29sdW1ucygpIixmdW5jdGlvbih0LGUpe3Q9PT12b2lkIDA/dD0iIjpILmlzUGxhaW5PYmplY3QodCkmJihlPXQsdD0iIiksZT1IaShlKTt2YXIgbj10aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24ocil7cmV0dXJuIEVsKHIsdCxlKX0sMSk7cmV0dXJuIG4uc2VsZWN0b3IuY29scz10LG4uc2VsZWN0b3Iub3B0cz1lLG59KTtRdCgiY29sdW1ucygpLmhlYWRlcigpIiwiY29sdW1uKCkuaGVhZGVyKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJjb2x1bW4iLGZ1bmN0aW9uKGUsbil7cmV0dXJuIF9zKGUsbix0KX0sMSl9KTtRdCgiY29sdW1ucygpLmZvb3RlcigpIiwiY29sdW1uKCkuZm9vdGVyKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJjb2x1bW4iLGZ1bmN0aW9uKGUsbil7dmFyIHI9ZS5hb0Zvb3RlcjtyZXR1cm4gci5sZW5ndGg/ZS5hb0Zvb3Rlclt0IT09dm9pZCAwP3Q6MF1bbl0uY2VsbDpudWxsfSwxKX0pO1F0KCJjb2x1bW5zKCkuZGF0YSgpIiwiY29sdW1uKCkuZGF0YSgpIixmdW5jdGlvbigpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJjb2x1bW4tcm93cyIsR2ksMSl9KTtRdCgiY29sdW1ucygpLnJlbmRlcigpIiwiY29sdW1uKCkucmVuZGVyKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJjb2x1bW4tcm93cyIsZnVuY3Rpb24oZSxuLHIscyxpKXtyZXR1cm4gR2koZSxuLHIscyxpLHQpfSwxKX0pO1F0KCJjb2x1bW5zKCkuZGF0YVNyYygpIiwiY29sdW1uKCkuZGF0YVNyYygpIixmdW5jdGlvbigpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJjb2x1bW4iLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuYW9Db2x1bW5zW2VdLm1EYXRhfSwxKX0pO1F0KCJjb2x1bW5zKCkuY2FjaGUoKSIsImNvbHVtbigpLmNhY2hlKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJjb2x1bW4tcm93cyIsZnVuY3Rpb24oZSxuLHIscyxpKXtyZXR1cm4gZXIoZS5hb0RhdGEsaSx0PT09InNlYXJjaCI/Il9hRmlsdGVyRGF0YSI6Il9hU29ydERhdGEiLG4pfSwxKX0pO1F0KCJjb2x1bW5zKCkuaW5pdCgpIiwiY29sdW1uKCkuaW5pdCgpIixmdW5jdGlvbigpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJjb2x1bW4iLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuYW9Db2x1bW5zW2VdfSwxKX0pO1F0KCJjb2x1bW5zKCkubm9kZXMoKSIsImNvbHVtbigpLm5vZGVzKCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoImNvbHVtbi1yb3dzIixmdW5jdGlvbih0LGUsbixyLHMpe3JldHVybiBlcih0LmFvRGF0YSxzLCJhbkNlbGxzIixlKX0sMSl9KTtRdCgiY29sdW1ucygpLnRpdGxlcygpIiwiY29sdW1uKCkudGl0bGUoKSIsZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigiY29sdW1uIixmdW5jdGlvbihuLHIpe3R5cGVvZiB0PT0ibnVtYmVyIiYmKGU9dCx0PXZvaWQgMCk7dmFyIHM9SCgic3Bhbi5kdC1jb2x1bW4tdGl0bGUiLHRoaXMuY29sdW1uKHIpLmhlYWRlcihlKSk7cmV0dXJuIHQhPT12b2lkIDA/KHMuaHRtbCh0KSx0aGlzKTpzLmh0bWwoKX0sMSl9KTtRdCgiY29sdW1ucygpLnR5cGVzKCkiLCJjb2x1bW4oKS50eXBlKCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoImNvbHVtbiIsZnVuY3Rpb24odCxlKXt2YXIgbj10LmFvQ29sdW1uc1tlXS5zVHlwZTtyZXR1cm4gbnx8RmkodCksbn0sMSl9KTtRdCgiY29sdW1ucygpLnZpc2libGUoKSIsImNvbHVtbigpLnZpc2libGUoKSIsZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9W10scz10aGlzLml0ZXJhdG9yKCJjb2x1bW4iLGZ1bmN0aW9uKGksbyl7aWYodD09PXZvaWQgMClyZXR1cm4gaS5hb0NvbHVtbnNbb10uYlZpc2libGU7UmwoaSxvLHQpJiZyLnB1c2gobyl9KTtyZXR1cm4gdCE9PXZvaWQgMCYmdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKGkpe0lyKGksaS5hb0hlYWRlciksSXIoaSxpLmFvRm9vdGVyKSxpLmFpRGlzcGxheS5sZW5ndGh8fEgoaS5uVEJvZHkpLmZpbmQoInRkW2NvbHNwYW5dIikuYXR0cigiY29sc3BhbiIsRXIoaSkpLGpyKGkpLG4uaXRlcmF0b3IoImNvbHVtbiIsZnVuY3Rpb24obyx1KXtyLmluY2x1ZGVzKHUpJiZadChvLG51bGwsImNvbHVtbi12aXNpYmlsaXR5Iixbbyx1LHQsZV0pfSksci5sZW5ndGgmJihlPT09dm9pZCAwfHxlKSYmbi5jb2x1bW5zLmFkanVzdCgpfSksc30pO1F0KCJjb2x1bW5zKCkud2lkdGhzKCkiLCJjb2x1bW4oKS53aWR0aCgpIixmdW5jdGlvbigpe3ZhciB0PXRoaXMuY29sdW1ucygiOnZpc2libGUiKS5jb3VudCgpLGU9SCgiPHRyPiIpLmh0bWwoIjx0ZD4iK0FycmF5KHQpLmpvaW4oIjwvdGQ+PHRkPiIpKyI8L3RkPiIpO0godGhpcy50YWJsZSgpLmJvZHkoKSkuYXBwZW5kKGUpO3ZhciBuPWUuY2hpbGRyZW4oKS5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gSCh0aGlzKS5vdXRlcldpZHRoKCl9KTtyZXR1cm4gZS5yZW1vdmUoKSx0aGlzLml0ZXJhdG9yKCJjb2x1bW4iLGZ1bmN0aW9uKHIscyl7dmFyIGk9bnIocixzKTtyZXR1cm4gaSE9PW51bGw/bltpXTowfSwxKX0pO1F0KCJjb2x1bW5zKCkuaW5kZXhlcygpIiwiY29sdW1uKCkuaW5kZXgoKSIsZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoImNvbHVtbiIsZnVuY3Rpb24oZSxuKXtyZXR1cm4gdD09PSJ2aXNpYmxlIj9ucihlLG4pOm59LDEpfSk7SXQoImNvbHVtbnMuYWRqdXN0KCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbih0KXtPcih0KX0sMSl9KTtJdCgiY29sdW1uLmluZGV4KCkiLGZ1bmN0aW9uKHQsZSl7aWYodGhpcy5jb250ZXh0Lmxlbmd0aCE9PTApe3ZhciBuPXRoaXMuY29udGV4dFswXTtpZih0PT09ImZyb21WaXNpYmxlInx8dD09PSJ0b0RhdGEiKXJldHVybiBJaShuLGUpO2lmKHQ9PT0iZnJvbURhdGEifHx0PT09InRvVmlzaWJsZSIpcmV0dXJuIG5yKG4sZSl9fSk7SXQoImNvbHVtbigpIixmdW5jdGlvbih0LGUpe3JldHVybiBVaSh0aGlzLmNvbHVtbnModCxlKSl9KTt2YXIgTGw9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXQuYW9EYXRhLHM9TXIodCxuKSxpPXRzKGVyKHIscywiYW5DZWxscyIpKSxvPUgoQWkoW10saSkpLHUscD10LmFvQ29sdW1ucy5sZW5ndGgsYixnLG0sQyx5LFQsUD1mdW5jdGlvbihjKXt2YXIgbD10eXBlb2YgYz09ImZ1bmN0aW9uIjtpZihjPT1udWxsfHxsKXtmb3IoYj1bXSxnPTAsbT1zLmxlbmd0aDtnPG07ZysrKWZvcih1PXNbZ10sQz0wO0M8cDtDKyspeT17cm93OnUsY29sdW1uOkN9LGw/KFQ9clt1XSxjKHksUmUodCx1LEMpLFQuYW5DZWxscz9ULmFuQ2VsbHNbQ106bnVsbCkmJmIucHVzaCh5KSk6Yi5wdXNoKHkpO3JldHVybiBifWlmKEguaXNQbGFpbk9iamVjdChjKSlyZXR1cm4gYy5jb2x1bW4hPT12b2lkIDAmJmMucm93IT09dm9pZCAwJiZzLmluZGV4T2YoYy5yb3cpIT09LTE/W2NdOltdO3ZhciBoPW8uZmlsdGVyKGMpLm1hcChmdW5jdGlvbihfLEYpe3JldHVybntyb3c6Ri5fRFRfQ2VsbEluZGV4LnJvdyxjb2x1bW46Ri5fRFRfQ2VsbEluZGV4LmNvbHVtbn19KS50b0FycmF5KCk7cmV0dXJuIGgubGVuZ3RofHwhYy5ub2RlTmFtZT9oOihUPUgoYykuY2xvc2VzdCgiKltkYXRhLWR0LXJvd10iKSxULmxlbmd0aD9be3JvdzpULmRhdGEoImR0LXJvdyIpLGNvbHVtbjpULmRhdGEoImR0LWNvbHVtbiIpfV06W10pfTtyZXR1cm4gVmkoImNlbGwiLGUsUCx0LG4pfTtJdCgiY2VsbHMoKSIsZnVuY3Rpb24odCxlLG4pe2lmKEguaXNQbGFpbk9iamVjdCh0KSYmKHQucm93PT09dm9pZCAwPyhuPXQsdD1udWxsKToobj1lLGU9bnVsbCkpLEguaXNQbGFpbk9iamVjdChlKSYmKG49ZSxlPW51bGwpLGU9PW51bGwpcmV0dXJuIHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihDKXtyZXR1cm4gTGwoQyx0LEhpKG4pKX0pO3ZhciByPW4/e3BhZ2U6bi5wYWdlLG9yZGVyOm4ub3JkZXIsc2VhcmNoOm4uc2VhcmNofTp7fSxzPXRoaXMuY29sdW1ucyhlLHIpLGk9dGhpcy5yb3dzKHQsciksbyx1LHAsYixnPXRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihDLHkpe3ZhciBUPVtdO2ZvcihvPTAsdT1pW3ldLmxlbmd0aDtvPHU7bysrKWZvcihwPTAsYj1zW3ldLmxlbmd0aDtwPGI7cCsrKVQucHVzaCh7cm93OmlbeV1bb10sY29sdW1uOnNbeV1bcF19KTtyZXR1cm4gVH0sMSksbT1uJiZuLnNlbGVjdGVkP3RoaXMuY2VsbHMoZyxuKTpnO3JldHVybiBILmV4dGVuZChtLnNlbGVjdG9yLHtjb2xzOmUscm93czp0LG9wdHM6bn0pLG19KTtRdCgiY2VsbHMoKS5ub2RlcygpIiwiY2VsbCgpLm5vZGUoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigiY2VsbCIsZnVuY3Rpb24odCxlLG4pe3ZhciByPXQuYW9EYXRhW2VdO3JldHVybiByJiZyLmFuQ2VsbHM/ci5hbkNlbGxzW25dOnZvaWQgMH0sMSl9KTtJdCgiY2VsbHMoKS5kYXRhKCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoImNlbGwiLGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gUmUodCxlLG4pfSwxKX0pO1F0KCJjZWxscygpLmNhY2hlKCkiLCJjZWxsKCkuY2FjaGUoKSIsZnVuY3Rpb24odCl7cmV0dXJuIHQ9dD09PSJzZWFyY2giPyJfYUZpbHRlckRhdGEiOiJfYVNvcnREYXRhIix0aGlzLml0ZXJhdG9yKCJjZWxsIixmdW5jdGlvbihlLG4scil7cmV0dXJuIGUuYW9EYXRhW25dW3RdW3JdfSwxKX0pO1F0KCJjZWxscygpLnJlbmRlcigpIiwiY2VsbCgpLnJlbmRlcigpIixmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5pdGVyYXRvcigiY2VsbCIsZnVuY3Rpb24oZSxuLHIpe3JldHVybiBSZShlLG4scix0KX0sMSl9KTtRdCgiY2VsbHMoKS5pbmRleGVzKCkiLCJjZWxsKCkuaW5kZXgoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigiY2VsbCIsZnVuY3Rpb24odCxlLG4pe3JldHVybntyb3c6ZSxjb2x1bW46bixjb2x1bW5WaXNpYmxlOm5yKHQsbil9fSwxKX0pO1F0KCJjZWxscygpLmludmFsaWRhdGUoKSIsImNlbGwoKS5pbnZhbGlkYXRlKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJjZWxsIixmdW5jdGlvbihlLG4scil7UnIoZSxuLHQscil9KX0pO0l0KCJjZWxsKCkiLGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gVWkodGhpcy5jZWxscyh0LGUsbikpfSk7SXQoImNlbGwoKS5kYXRhKCkiLGZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuY29udGV4dCxuPXRoaXNbMF07cmV0dXJuIHQ9PT12b2lkIDA/ZS5sZW5ndGgmJm4ubGVuZ3RoP1JlKGVbMF0sblswXS5yb3csblswXS5jb2x1bW4pOnZvaWQgMDoob2woZVswXSxuWzBdLnJvdyxuWzBdLmNvbHVtbix0KSxScihlWzBdLG5bMF0ucm93LCJkYXRhIixuWzBdLmNvbHVtbiksdGhpcyl9KTtJdCgib3JkZXIoKSIsZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmNvbnRleHQscj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3JldHVybiB0PT09dm9pZCAwP24ubGVuZ3RoIT09MD9uWzBdLmFhU29ydGluZzp2b2lkIDA6KHR5cGVvZiB0PT0ibnVtYmVyIj90PVtbdCxlXV06ci5sZW5ndGg+MSYmKHQ9ciksdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKHMpe3MuYWFTb3J0aW5nPUFycmF5LmlzQXJyYXkodCk/dC5zbGljZSgpOnR9KSl9KTtJdCgib3JkZXIubGlzdGVuZXIoKSIsZnVuY3Rpb24odCxlLG4pe3JldHVybiB0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24ocil7cHMocix0LHt9LGUsbil9KX0pO0l0KCJvcmRlci5maXhlZCgpIixmdW5jdGlvbih0KXtpZighdCl7dmFyIGU9dGhpcy5jb250ZXh0LG49ZS5sZW5ndGg/ZVswXS5hYVNvcnRpbmdGaXhlZDp2b2lkIDA7cmV0dXJuIEFycmF5LmlzQXJyYXkobik/e3ByZTpufTpufXJldHVybiB0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24ocil7ci5hYVNvcnRpbmdGaXhlZD1ILmV4dGVuZCghMCx7fSx0KX0pfSk7SXQoWyJjb2x1bW5zKCkub3JkZXIoKSIsImNvbHVtbigpLm9yZGVyKCkiXSxmdW5jdGlvbih0KXt2YXIgZT10aGlzO3JldHVybiB0P3RoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihuLHIpe24uYWFTb3J0aW5nPWVbcl0ubWFwKGZ1bmN0aW9uKHMpe3JldHVybltzLHRdfSl9KTp0aGlzLml0ZXJhdG9yKCJjb2x1bW4iLGZ1bmN0aW9uKG4scil7Zm9yKHZhciBzPXpyKG4pLGk9MCxvPXMubGVuZ3RoO2k8bztpKyspaWYoc1tpXS5jb2w9PT1yKXJldHVybiBzW2ldLmRpcjtyZXR1cm4gbnVsbH0sMSl9KTtRdCgiY29sdW1ucygpLm9yZGVyYWJsZSgpIiwiY29sdW1uKCkub3JkZXJhYmxlKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJjb2x1bW4iLGZ1bmN0aW9uKGUsbil7dmFyIHI9ZS5hb0NvbHVtbnNbbl07cmV0dXJuIHQ/ci5hc1NvcnRpbmc6ci5iU29ydGFibGV9LDEpfSk7SXQoInByb2Nlc3NpbmcoKSIsZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihlKXtrZShlLHQpfSl9KTtJdCgic2VhcmNoKCkiLGZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBzPXRoaXMuY29udGV4dDtyZXR1cm4gdD09PXZvaWQgMD9zLmxlbmd0aCE9PTA/c1swXS5vUHJldmlvdXNTZWFyY2guc2VhcmNoOnZvaWQgMDp0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24oaSl7aS5vRmVhdHVyZXMuYkZpbHRlciYmKHR5cGVvZiBlPT0ib2JqZWN0Ij90cihpLEguZXh0ZW5kKGkub1ByZXZpb3VzU2VhcmNoLGUse3NlYXJjaDp0fSkpOnRyKGksSC5leHRlbmQoaS5vUHJldmlvdXNTZWFyY2gse3NlYXJjaDp0LHJlZ2V4OmU9PT1udWxsPyExOmUsc21hcnQ6bj09PW51bGw/ITA6bixjYXNlSW5zZW5zaXRpdmU6cj09PW51bGw/ITA6cn0pKSl9KX0pO0l0KCJzZWFyY2guZml4ZWQoKSIsZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLml0ZXJhdG9yKCEwLCJ0YWJsZSIsZnVuY3Rpb24ocil7dmFyIHM9ci5zZWFyY2hGaXhlZDtpZih0KXtpZihlPT09dm9pZCAwKXJldHVybiBzW3RdO2U9PT1udWxsP2RlbGV0ZSBzW3RdOnNbdF09ZX1lbHNlIHJldHVybiBPYmplY3Qua2V5cyhzKTtyZXR1cm4gdGhpc30pO3JldHVybiB0IT09dm9pZCAwJiZlPT09dm9pZCAwP25bMF06bn0pO1F0KCJjb2x1bW5zKCkuc2VhcmNoKCkiLCJjb2x1bW4oKS5zZWFyY2goKSIsZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIHRoaXMuaXRlcmF0b3IoImNvbHVtbiIsZnVuY3Rpb24ocyxpKXt2YXIgbz1zLmFvUHJlU2VhcmNoQ29scztpZih0PT09dm9pZCAwKXJldHVybiBvW2ldLnNlYXJjaDtzLm9GZWF0dXJlcy5iRmlsdGVyJiYodHlwZW9mIGU9PSJvYmplY3QiP0guZXh0ZW5kKG9baV0sZSx7c2VhcmNoOnR9KTpILmV4dGVuZChvW2ldLHtzZWFyY2g6dCxyZWdleDplPT09bnVsbD8hMTplLHNtYXJ0Om49PT1udWxsPyEwOm4sY2FzZUluc2Vuc2l0aXZlOnI9PT1udWxsPyEwOnJ9KSx0cihzLHMub1ByZXZpb3VzU2VhcmNoKSl9KX0pO0l0KFsiY29sdW1ucygpLnNlYXJjaC5maXhlZCgpIiwiY29sdW1uKCkuc2VhcmNoLmZpeGVkKCkiXSxmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuaXRlcmF0b3IoITAsImNvbHVtbiIsZnVuY3Rpb24ocixzKXt2YXIgaT1yLmFvQ29sdW1uc1tzXS5zZWFyY2hGaXhlZDtpZih0KXtpZihlPT09dm9pZCAwKXJldHVybiBpW3RdO2U9PT1udWxsP2RlbGV0ZSBpW3RdOmlbdF09ZX1lbHNlIHJldHVybiBPYmplY3Qua2V5cyhpKTtyZXR1cm4gdGhpc30pO3JldHVybiB0IT09dm9pZCAwJiZlPT09dm9pZCAwP25bMF06bn0pO0l0KCJzdGF0ZSgpIixmdW5jdGlvbih0LGUpe2lmKCF0KXJldHVybiB0aGlzLmNvbnRleHQubGVuZ3RoP3RoaXMuY29udGV4dFswXS5vU2F2ZWRTdGF0ZTpudWxsO3ZhciBuPUguZXh0ZW5kKCEwLHt9LHQpO3JldHVybiB0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24ocil7ZSE9PSExJiYobi50aW1lPStuZXcgRGF0ZSsxMDApLGtpKHIsbixmdW5jdGlvbigpe30pfSl9KTtJdCgic3RhdGUuY2xlYXIoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKHQpe3QuZm5TdGF0ZVNhdmVDYWxsYmFjay5jYWxsKHQub0luc3RhbmNlLHQse30pfSl9KTtJdCgic3RhdGUubG9hZGVkKCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udGV4dC5sZW5ndGg/dGhpcy5jb250ZXh0WzBdLm9Mb2FkZWRTdGF0ZTpudWxsfSk7SXQoInN0YXRlLnNhdmUoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKHQpe2pyKHQpfSl9KTtidC51c2U9ZnVuY3Rpb24odCxlKXt2YXIgbj10eXBlb2YgdD09InN0cmluZyI/ZTp0LHI9dHlwZW9mIGU9PSJzdHJpbmciP2U6dDtpZihuPT09dm9pZCAwJiZ0eXBlb2Ygcj09InN0cmluZyIpc3dpdGNoKHIpe2Nhc2UibGliIjpjYXNlImpxIjpyZXR1cm4gSDtjYXNlIndpbiI6cmV0dXJuIHdpbmRvdztjYXNlImRhdGV0aW1lIjpyZXR1cm4gYnQuRGF0ZVRpbWU7Y2FzZSJsdXhvbiI6cmV0dXJuIGRuO2Nhc2UibW9tZW50IjpyZXR1cm4gd247ZGVmYXVsdDpyZXR1cm4gbnVsbH1yPT09ImxpYiJ8fHI9PT0ianEifHxuJiZuLmZuJiZuLmZuLmpxdWVyeT9IPW46cj09IndpbiJ8fG4mJm4uZG9jdW1lbnQ/KHdpbmRvdz1uLGRvY3VtZW50PW4uZG9jdW1lbnQpOnI9PT0iZGF0ZXRpbWUifHxuJiZuLnR5cGU9PT0iRGF0ZVRpbWUiP2J0LkRhdGVUaW1lPW46cj09PSJsdXhvbiJ8fG4mJm4uRml4ZWRPZmZzZXRab25lP2RuPW46KHI9PT0ibW9tZW50Inx8biYmbi5pc01vbWVudCkmJih3bj1uKX07YnQuZmFjdG9yeT1mdW5jdGlvbih0LGUpe3ZhciBuPSExO3JldHVybiB0JiZ0LmRvY3VtZW50JiYod2luZG93PXQsZG9jdW1lbnQ9dC5kb2N1bWVudCksZSYmZS5mbiYmZS5mbi5qcXVlcnkmJihIPWUsbj0hMCksbn07YnQudmVyc2lvbkNoZWNrPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPWU/ZS5zcGxpdCgiLiIpOmJ0LnZlcnNpb24uc3BsaXQoIi4iKSxyPXQuc3BsaXQoIi4iKSxzLGksbz0wLHU9ci5sZW5ndGg7bzx1O28rKylpZihzPXBhcnNlSW50KG5bb10sMTApfHwwLGk9cGFyc2VJbnQocltvXSwxMCl8fDAscyE9PWkpcmV0dXJuIHM+aTtyZXR1cm4hMH07YnQuaXNEYXRhVGFibGU9ZnVuY3Rpb24odCl7dmFyIGU9SCh0KS5nZXQoMCksbj0hMTtyZXR1cm4gdCBpbnN0YW5jZW9mIGJ0LkFwaT8hMDooSC5lYWNoKGJ0LnNldHRpbmdzLGZ1bmN0aW9uKHIscyl7dmFyIGk9cy5uU2Nyb2xsSGVhZD9IKCJ0YWJsZSIscy5uU2Nyb2xsSGVhZClbMF06bnVsbCxvPXMublNjcm9sbEZvb3Q/SCgidGFibGUiLHMublNjcm9sbEZvb3QpWzBdOm51bGw7KHMublRhYmxlPT09ZXx8aT09PWV8fG89PT1lKSYmKG49ITApfSksbil9O2J0LnRhYmxlcz1mdW5jdGlvbih0KXt2YXIgZT0hMTtILmlzUGxhaW5PYmplY3QodCkmJihlPXQuYXBpLHQ9dC52aXNpYmxlKTt2YXIgbj1idC5zZXR0aW5ncy5maWx0ZXIoZnVuY3Rpb24ocil7cmV0dXJuISEoIXR8fHQmJkgoci5uVGFibGUpLmlzKCI6dmlzaWJsZSIpKX0pLm1hcChmdW5jdGlvbihyKXtyZXR1cm4gci5uVGFibGV9KTtyZXR1cm4gZT9uZXcgV3Qobik6bn07YnQuY2FtZWxUb0h1bmdhcmlhbj1zbjtJdCgiJCgpIixmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMucm93cyhlKS5ub2RlcygpLHI9SChuKTtyZXR1cm4gSChbXS5jb25jYXQoci5maWx0ZXIodCkudG9BcnJheSgpLHIuZmluZCh0KS50b0FycmF5KCkpKX0pO0guZWFjaChbIm9uIiwib25lIiwib2ZmIl0sZnVuY3Rpb24odCxlKXtJdChlKyIoKSIsZnVuY3Rpb24oKXt2YXIgbj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO25bMF09blswXS5zcGxpdCgvXHMvKS5tYXAoZnVuY3Rpb24ocyl7cmV0dXJuIHMubWF0Y2goL1wuZHRcYi8pP3M6cysiLmR0In0pLmpvaW4oIiAiKTt2YXIgcj1IKHRoaXMudGFibGVzKCkubm9kZXMoKSk7cmV0dXJuIHJbZV0uYXBwbHkocixuKSx0aGlzfSl9KTtJdCgiY2xlYXIoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKHQpe09pKHQpfSl9KTtJdCgiZXJyb3IoKSIsZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihlKXtPZShlLDAsdCl9KX0pO0l0KCJzZXR0aW5ncygpIixmdW5jdGlvbigpe3JldHVybiBuZXcgV3QodGhpcy5jb250ZXh0LHRoaXMuY29udGV4dCl9KTtJdCgiaW5pdCgpIixmdW5jdGlvbigpe3ZhciB0PXRoaXMuY29udGV4dDtyZXR1cm4gdC5sZW5ndGg/dFswXS5vSW5pdDpudWxsfSk7SXQoImRhdGEoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKHQpe3JldHVybiBDZSh0LmFvRGF0YSwiX2FEYXRhIil9KS5mbGF0dGVuKCl9KTtJdCgidHJpZ2dlcigpIixmdW5jdGlvbih0LGUsbil7cmV0dXJuIHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihyKXtyZXR1cm4gWnQocixudWxsLHQsZSxuKX0pLmZsYXR0ZW4oKX0pO0l0KCJyZWFkeSgpIixmdW5jdGlvbih0KXt2YXIgZT10aGlzLmNvbnRleHQ7cmV0dXJuIHQ/dGhpcy50YWJsZXMoKS5ldmVyeShmdW5jdGlvbigpe3RoaXMuY29udGV4dFswXS5fYkluaXRDb21wbGV0ZT90LmNhbGwodGhpcyk6dGhpcy5vbigiaW5pdCIsZnVuY3Rpb24oKXt0LmNhbGwodGhpcyl9KX0pOmUubGVuZ3RoP2VbMF0uX2JJbml0Q29tcGxldGV8fCExOm51bGx9KTtJdCgiZGVzdHJveSgpIixmdW5jdGlvbih0KXtyZXR1cm4gdD10fHwhMSx0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24oZSl7dmFyIG49ZS5vQ2xhc3NlcyxyPWUublRhYmxlLHM9ZS5uVEJvZHksaT1lLm5USGVhZCxvPWUublRGb290LHU9SChyKSxwPUgocyksYj1IKGUublRhYmxlV3JhcHBlciksZz1lLmFvRGF0YS5tYXAoZnVuY3Rpb24oYyl7cmV0dXJuIGM/Yy5uVHI6bnVsbH0pLG09bi5vcmRlcjtlLmJEZXN0cm95aW5nPSEwLFp0KGUsImFvRGVzdHJveUNhbGxiYWNrIiwiZGVzdHJveSIsW2VdLCEwKSx0fHxuZXcgV3QoZSkuY29sdW1ucygpLnZpc2libGUoITApLGIub2ZmKCIuRFQiKS5maW5kKCI6bm90KHRib2R5ICopIikub2ZmKCIuRFQiKSxIKHdpbmRvdykub2ZmKCIuRFQtIitlLnNJbnN0YW5jZSksciE9aS5wYXJlbnROb2RlJiYodS5jaGlsZHJlbigidGhlYWQiKS5kZXRhY2goKSx1LmFwcGVuZChpKSksbyYmciE9by5wYXJlbnROb2RlJiYodS5jaGlsZHJlbigidGZvb3QiKS5kZXRhY2goKSx1LmFwcGVuZChvKSksZS5jb2xncm91cC5yZW1vdmUoKSxlLmFhU29ydGluZz1bXSxlLmFhU29ydGluZ0ZpeGVkPVtdLFRpKGUpLEgoInRoLCB0ZCIsaSkucmVtb3ZlQ2xhc3MobS5jYW5Bc2MrIiAiK20uY2FuRGVzYysiICIrbS5pc0FzYysiICIrbS5pc0Rlc2MpLmNzcygid2lkdGgiLCIiKSxwLmNoaWxkcmVuKCkuZGV0YWNoKCkscC5hcHBlbmQoZyk7dmFyIEM9ZS5uVGFibGVXcmFwcGVyLnBhcmVudE5vZGUseT1lLm5UYWJsZVdyYXBwZXIubmV4dFNpYmxpbmcsVD10PyJyZW1vdmUiOiJkZXRhY2giO3VbVF0oKSxiW1RdKCksIXQmJkMmJihDLmluc2VydEJlZm9yZShyLHkpLHUuY3NzKCJ3aWR0aCIsZS5zRGVzdHJveVdpZHRoKS5yZW1vdmVDbGFzcyhuLnRhYmxlKSk7dmFyIFA9YnQuc2V0dGluZ3MuaW5kZXhPZihlKTtQIT09LTEmJmJ0LnNldHRpbmdzLnNwbGljZShQLDEpfSl9KTtILmVhY2goWyJjb2x1bW4iLCJyb3ciLCJjZWxsIl0sZnVuY3Rpb24odCxlKXtJdChlKyJzKCkuZXZlcnkoKSIsZnVuY3Rpb24obil7dmFyIHI9dGhpcy5zZWxlY3Rvci5vcHRzLHM9dGhpcyxpLG89MDtyZXR1cm4gdGhpcy5pdGVyYXRvcigiZXZlcnkiLGZ1bmN0aW9uKHUscCxiKXtpPXNbZV0ocCxyKSxlPT09ImNlbGwiP24uY2FsbChpLGlbMF1bMF0ucm93LGlbMF1bMF0uY29sdW1uLGIsbyk6bi5jYWxsKGkscCxiLG8pLG8rK30pfSl9KTtJdCgiaTE4bigpIixmdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpcy5jb250ZXh0WzBdLHM9RW4odCkoci5vTGFuZ3VhZ2UpO3JldHVybiBzPT09dm9pZCAwJiYocz1lKSxILmlzUGxhaW5PYmplY3QocykmJihzPW4hPT12b2lkIDAmJnNbbl0hPT12b2lkIDA/c1tuXTpzLl8pLHR5cGVvZiBzPT0ic3RyaW5nIj9zLnJlcGxhY2UoIiVkIixuKTpzfSk7YnQudmVyc2lvbj0iMi4xLjYiO2J0LnNldHRpbmdzPVtdO2J0Lm1vZGVscz17fTtidC5tb2RlbHMub1NlYXJjaD17Y2FzZUluc2Vuc2l0aXZlOiEwLHNlYXJjaDoiIixyZWdleDohMSxzbWFydDohMCxyZXR1cm46ITF9O2J0Lm1vZGVscy5vUm93PXtuVHI6bnVsbCxhbkNlbGxzOm51bGwsX2FEYXRhOltdLF9hU29ydERhdGE6bnVsbCxfYUZpbHRlckRhdGE6bnVsbCxfc0ZpbHRlclJvdzpudWxsLHNyYzpudWxsLGlkeDotMSxkaXNwbGF5RGF0YTpudWxsfTtidC5tb2RlbHMub0NvbHVtbj17aWR4Om51bGwsYURhdGFTb3J0Om51bGwsYXNTb3J0aW5nOm51bGwsYlNlYXJjaGFibGU6bnVsbCxiU29ydGFibGU6bnVsbCxiVmlzaWJsZTpudWxsLF9zTWFudWFsVHlwZTpudWxsLF9iQXR0clNyYzohMSxmbkNyZWF0ZWRDZWxsOm51bGwsZm5HZXREYXRhOm51bGwsZm5TZXREYXRhOm51bGwsbURhdGE6bnVsbCxtUmVuZGVyOm51bGwsc0NsYXNzOm51bGwsc0NvbnRlbnRQYWRkaW5nOm51bGwsc0RlZmF1bHRDb250ZW50Om51bGwsc05hbWU6bnVsbCxzU29ydERhdGFUeXBlOiJzdGQiLHNTb3J0aW5nQ2xhc3M6bnVsbCxzVGl0bGU6bnVsbCxzVHlwZTpudWxsLHNXaWR0aDpudWxsLHNXaWR0aE9yaWc6bnVsbCxtYXhMZW5TdHJpbmc6bnVsbCxzZWFyY2hGaXhlZDpudWxsfTtidC5kZWZhdWx0cz17YWFEYXRhOm51bGwsYWFTb3J0aW5nOltbMCwiYXNjIl1dLGFhU29ydGluZ0ZpeGVkOltdLGFqYXg6bnVsbCxhTGVuZ3RoTWVudTpbMTAsMjUsNTAsMTAwXSxhb0NvbHVtbnM6bnVsbCxhb0NvbHVtbkRlZnM6bnVsbCxhb1NlYXJjaENvbHM6W10sYkF1dG9XaWR0aDohMCxiRGVmZXJSZW5kZXI6ITAsYkRlc3Ryb3k6ITEsYkZpbHRlcjohMCxiSW5mbzohMCxiTGVuZ3RoQ2hhbmdlOiEwLGJQYWdpbmF0ZTohMCxiUHJvY2Vzc2luZzohMSxiUmV0cmlldmU6ITEsYlNjcm9sbENvbGxhcHNlOiExLGJTZXJ2ZXJTaWRlOiExLGJTb3J0OiEwLGJTb3J0TXVsdGk6ITAsYlNvcnRDZWxsc1RvcDpudWxsLGJTb3J0Q2xhc3NlczohMCxiU3RhdGVTYXZlOiExLGZuQ3JlYXRlZFJvdzpudWxsLGZuRHJhd0NhbGxiYWNrOm51bGwsZm5Gb290ZXJDYWxsYmFjazpudWxsLGZuRm9ybWF0TnVtYmVyOmZ1bmN0aW9uKHQpe3JldHVybiB0LnRvU3RyaW5nKCkucmVwbGFjZSgvXEIoPz0oXGR7M30pKyg/IVxkKSkvZyx0aGlzLm9MYW5ndWFnZS5zVGhvdXNhbmRzKX0sZm5IZWFkZXJDYWxsYmFjazpudWxsLGZuSW5mb0NhbGxiYWNrOm51bGwsZm5Jbml0Q29tcGxldGU6bnVsbCxmblByZURyYXdDYWxsYmFjazpudWxsLGZuUm93Q2FsbGJhY2s6bnVsbCxmblN0YXRlTG9hZENhbGxiYWNrOmZ1bmN0aW9uKHQpe3RyeXtyZXR1cm4gSlNPTi5wYXJzZSgodC5pU3RhdGVEdXJhdGlvbj09PS0xP3Nlc3Npb25TdG9yYWdlOmxvY2FsU3RvcmFnZSkuZ2V0SXRlbSgiRGF0YVRhYmxlc18iK3Quc0luc3RhbmNlKyJfIitsb2NhdGlvbi5wYXRobmFtZSkpfWNhdGNoe3JldHVybnt9fX0sZm5TdGF0ZUxvYWRQYXJhbXM6bnVsbCxmblN0YXRlTG9hZGVkOm51bGwsZm5TdGF0ZVNhdmVDYWxsYmFjazpmdW5jdGlvbih0LGUpe3RyeXsodC5pU3RhdGVEdXJhdGlvbj09PS0xP3Nlc3Npb25TdG9yYWdlOmxvY2FsU3RvcmFnZSkuc2V0SXRlbSgiRGF0YVRhYmxlc18iK3Quc0luc3RhbmNlKyJfIitsb2NhdGlvbi5wYXRobmFtZSxKU09OLnN0cmluZ2lmeShlKSl9Y2F0Y2h7fX0sZm5TdGF0ZVNhdmVQYXJhbXM6bnVsbCxpU3RhdGVEdXJhdGlvbjo3MjAwLGlEaXNwbGF5TGVuZ3RoOjEwLGlEaXNwbGF5U3RhcnQ6MCxpVGFiSW5kZXg6MCxvQ2xhc3Nlczp7fSxvTGFuZ3VhZ2U6e29BcmlhOntvcmRlcmFibGU6IjogQWN0aXZhdGUgdG8gc29ydCIsb3JkZXJhYmxlUmV2ZXJzZToiOiBBY3RpdmF0ZSB0byBpbnZlcnQgc29ydGluZyIsb3JkZXJhYmxlUmVtb3ZlOiI6IEFjdGl2YXRlIHRvIHJlbW92ZSBzb3J0aW5nIixwYWdpbmF0ZTp7Zmlyc3Q6IkZpcnN0IixsYXN0OiJMYXN0IixuZXh0OiJOZXh0IixwcmV2aW91czoiUHJldmlvdXMiLG51bWJlcjoiIn19LG9QYWdpbmF0ZTp7c0ZpcnN0OiJceEFCIixzTGFzdDoiXHhCQiIsc05leHQ6Ilx1MjAzQSIsc1ByZXZpb3VzOiJcdTIwMzkifSxlbnRyaWVzOntfOiJlbnRyaWVzIiwxOiJlbnRyeSJ9LHNFbXB0eVRhYmxlOiJObyBkYXRhIGF2YWlsYWJsZSBpbiB0YWJsZSIsc0luZm86IlNob3dpbmcgX1NUQVJUXyB0byBfRU5EXyBvZiBfVE9UQUxfIF9FTlRSSUVTLVRPVEFMXyIsc0luZm9FbXB0eToiU2hvd2luZyAwIHRvIDAgb2YgMCBfRU5UUklFUy1UT1RBTF8iLHNJbmZvRmlsdGVyZWQ6IihmaWx0ZXJlZCBmcm9tIF9NQVhfIHRvdGFsIF9FTlRSSUVTLU1BWF8pIixzSW5mb1Bvc3RGaXg6IiIsc0RlY2ltYWw6IiIsc1Rob3VzYW5kczoiLCIsc0xlbmd0aE1lbnU6Il9NRU5VXyBfRU5UUklFU18gcGVyIHBhZ2UiLHNMb2FkaW5nUmVjb3JkczoiTG9hZGluZy4uLiIsc1Byb2Nlc3Npbmc6IiIsc1NlYXJjaDoiU2VhcmNoOiIsc1NlYXJjaFBsYWNlaG9sZGVyOiIiLHNVcmw6IiIsc1plcm9SZWNvcmRzOiJObyBtYXRjaGluZyByZWNvcmRzIGZvdW5kIn0sb3JkZXJEZXNjUmV2ZXJzZTohMCxvU2VhcmNoOkguZXh0ZW5kKHt9LGJ0Lm1vZGVscy5vU2VhcmNoKSxsYXlvdXQ6e3RvcFN0YXJ0OiJwYWdlTGVuZ3RoIix0b3BFbmQ6InNlYXJjaCIsYm90dG9tU3RhcnQ6ImluZm8iLGJvdHRvbUVuZDoicGFnaW5nIn0sc0RvbTpudWxsLHNlYXJjaERlbGF5Om51bGwsc1BhZ2luYXRpb25UeXBlOiIiLHNTY3JvbGxYOiIiLHNTY3JvbGxYSW5uZXI6IiIsc1Njcm9sbFk6IiIsc1NlcnZlck1ldGhvZDoiR0VUIixyZW5kZXJlcjpudWxsLHJvd0lkOiJEVF9Sb3dJZCIsY2FwdGlvbjpudWxsLGlEZWZlckxvYWRpbmc6bnVsbH07TnIoYnQuZGVmYXVsdHMpO2J0LmRlZmF1bHRzLmNvbHVtbj17YURhdGFTb3J0Om51bGwsaURhdGFTb3J0Oi0xLGFyaWFUaXRsZToiIixhc1NvcnRpbmc6WyJhc2MiLCJkZXNjIiwiIl0sYlNlYXJjaGFibGU6ITAsYlNvcnRhYmxlOiEwLGJWaXNpYmxlOiEwLGZuQ3JlYXRlZENlbGw6bnVsbCxtRGF0YTpudWxsLG1SZW5kZXI6bnVsbCxzQ2VsbFR5cGU6InRkIixzQ2xhc3M6IiIsc0NvbnRlbnRQYWRkaW5nOiIiLHNEZWZhdWx0Q29udGVudDpudWxsLHNOYW1lOiIiLHNTb3J0RGF0YVR5cGU6InN0ZCIsc1RpdGxlOm51bGwsc1R5cGU6bnVsbCxzV2lkdGg6bnVsbH07TnIoYnQuZGVmYXVsdHMuY29sdW1uKTtidC5tb2RlbHMub1NldHRpbmdzPXtvRmVhdHVyZXM6e2JBdXRvV2lkdGg6bnVsbCxiRGVmZXJSZW5kZXI6bnVsbCxiRmlsdGVyOm51bGwsYkluZm86ITAsYkxlbmd0aENoYW5nZTohMCxiUGFnaW5hdGU6bnVsbCxiUHJvY2Vzc2luZzpudWxsLGJTZXJ2ZXJTaWRlOm51bGwsYlNvcnQ6bnVsbCxiU29ydE11bHRpOm51bGwsYlNvcnRDbGFzc2VzOm51bGwsYlN0YXRlU2F2ZTpudWxsfSxvU2Nyb2xsOntiQ29sbGFwc2U6bnVsbCxpQmFyV2lkdGg6MCxzWDpudWxsLHNYSW5uZXI6bnVsbCxzWTpudWxsfSxvTGFuZ3VhZ2U6e2ZuSW5mb0NhbGxiYWNrOm51bGx9LG9Ccm93c2VyOntiU2Nyb2xsYmFyTGVmdDohMSxiYXJXaWR0aDowfSxhamF4Om51bGwsYWFuRmVhdHVyZXM6W10sYW9EYXRhOltdLGFpRGlzcGxheTpbXSxhaURpc3BsYXlNYXN0ZXI6W10sYUlkczp7fSxhb0NvbHVtbnM6W10sYW9IZWFkZXI6W10sYW9Gb290ZXI6W10sb1ByZXZpb3VzU2VhcmNoOnt9LHNlYXJjaEZpeGVkOnt9LGFvUHJlU2VhcmNoQ29sczpbXSxhYVNvcnRpbmc6bnVsbCxhYVNvcnRpbmdGaXhlZDpbXSxzRGVzdHJveVdpZHRoOjAsYW9Sb3dDYWxsYmFjazpbXSxhb0hlYWRlckNhbGxiYWNrOltdLGFvRm9vdGVyQ2FsbGJhY2s6W10sYW9EcmF3Q2FsbGJhY2s6W10sYW9Sb3dDcmVhdGVkQ2FsbGJhY2s6W10sYW9QcmVEcmF3Q2FsbGJhY2s6W10sYW9Jbml0Q29tcGxldGU6W10sYW9TdGF0ZVNhdmVQYXJhbXM6W10sYW9TdGF0ZUxvYWRQYXJhbXM6W10sYW9TdGF0ZUxvYWRlZDpbXSxzVGFibGVJZDoiIixuVGFibGU6bnVsbCxuVEhlYWQ6bnVsbCxuVEZvb3Q6bnVsbCxuVEJvZHk6bnVsbCxuVGFibGVXcmFwcGVyOm51bGwsYkluaXRpYWxpc2VkOiExLGFvT3BlblJvd3M6W10sc0RvbTpudWxsLHNlYXJjaERlbGF5Om51bGwsc1BhZ2luYXRpb25UeXBlOiJ0d29fYnV0dG9uIixwYWdpbmdDb250cm9sczowLGlTdGF0ZUR1cmF0aW9uOjAsYW9TdGF0ZVNhdmU6W10sYW9TdGF0ZUxvYWQ6W10sb1NhdmVkU3RhdGU6bnVsbCxvTG9hZGVkU3RhdGU6bnVsbCxiQWpheERhdGFHZXQ6ITAsanFYSFI6bnVsbCxqc29uOnZvaWQgMCxvQWpheERhdGE6dm9pZCAwLHNTZXJ2ZXJNZXRob2Q6bnVsbCxmbkZvcm1hdE51bWJlcjpudWxsLGFMZW5ndGhNZW51Om51bGwsaURyYXc6MCxiRHJhd2luZzohMSxpRHJhd0Vycm9yOi0xLF9pRGlzcGxheUxlbmd0aDoxMCxfaURpc3BsYXlTdGFydDowLF9pUmVjb3Jkc1RvdGFsOjAsX2lSZWNvcmRzRGlzcGxheTowLG9DbGFzc2VzOnt9LGJGaWx0ZXJlZDohMSxiU29ydGVkOiExLGJTb3J0Q2VsbHNUb3A6bnVsbCxvSW5pdDpudWxsLGFvRGVzdHJveUNhbGxiYWNrOltdLGZuUmVjb3Jkc1RvdGFsOmZ1bmN0aW9uKCl7cmV0dXJuIEVlKHRoaXMpPT0ic3NwIj90aGlzLl9pUmVjb3Jkc1RvdGFsKjE6dGhpcy5haURpc3BsYXlNYXN0ZXIubGVuZ3RofSxmblJlY29yZHNEaXNwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIEVlKHRoaXMpPT0ic3NwIj90aGlzLl9pUmVjb3Jkc0Rpc3BsYXkqMTp0aGlzLmFpRGlzcGxheS5sZW5ndGh9LGZuRGlzcGxheUVuZDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX2lEaXNwbGF5TGVuZ3RoLGU9dGhpcy5faURpc3BsYXlTdGFydCxuPWUrdCxyPXRoaXMuYWlEaXNwbGF5Lmxlbmd0aCxzPXRoaXMub0ZlYXR1cmVzLGk9cy5iUGFnaW5hdGU7cmV0dXJuIHMuYlNlcnZlclNpZGU/aT09PSExfHx0PT09LTE/ZStyOk1hdGgubWluKGUrdCx0aGlzLl9pUmVjb3Jkc0Rpc3BsYXkpOiFpfHxuPnJ8fHQ9PT0tMT9yOm59LG9JbnN0YW5jZTpudWxsLHNJbnN0YW5jZTpudWxsLGlUYWJJbmRleDowLG5TY3JvbGxIZWFkOm51bGwsblNjcm9sbEZvb3Q6bnVsbCxhTGFzdFNvcnQ6W10sb1BsdWdpbnM6e30scm93SWRGbjpudWxsLHJvd0lkOm51bGwsY2FwdGlvbjoiIixjYXB0aW9uTm9kZTpudWxsLGNvbGdyb3VwOm51bGwsZGVmZXJMb2FkaW5nOm51bGwsdHlwZURldGVjdDohMH07dmFyIHpsPWJ0LmV4dC5wYWdlcjtILmV4dGVuZCh6bCx7c2ltcGxlOmZ1bmN0aW9uKCl7cmV0dXJuWyJwcmV2aW91cyIsIm5leHQiXX0sZnVsbDpmdW5jdGlvbigpe3JldHVyblsiZmlyc3QiLCJwcmV2aW91cyIsIm5leHQiLCJsYXN0Il19LG51bWJlcnM6ZnVuY3Rpb24oKXtyZXR1cm5bIm51bWJlcnMiXX0sc2ltcGxlX251bWJlcnM6ZnVuY3Rpb24oKXtyZXR1cm5bInByZXZpb3VzIiwibnVtYmVycyIsIm5leHQiXX0sZnVsbF9udW1iZXJzOmZ1bmN0aW9uKCl7cmV0dXJuWyJmaXJzdCIsInByZXZpb3VzIiwibnVtYmVycyIsIm5leHQiLCJsYXN0Il19LGZpcnN0X2xhc3Q6ZnVuY3Rpb24oKXtyZXR1cm5bImZpcnN0IiwibGFzdCJdfSxmaXJzdF9sYXN0X251bWJlcnM6ZnVuY3Rpb24oKXtyZXR1cm5bImZpcnN0IiwibnVtYmVycyIsImxhc3QiXX0sX251bWJlcnM6U3MsbnVtYmVyc19sZW5ndGg6N30pO0guZXh0ZW5kKCEwLGJ0LmV4dC5yZW5kZXJlcix7cGFnaW5nQnV0dG9uOntfOmZ1bmN0aW9uKHQsZSxuLHIscyl7dmFyIGk9dC5vQ2xhc3Nlcy5wYWdpbmcsbz1baS5idXR0b25dLHU7cmV0dXJuIHImJm8ucHVzaChpLmFjdGl2ZSkscyYmby5wdXNoKGkuZGlzYWJsZWQpLGU9PT0iZWxsaXBzaXMiP3U9SCgnPHNwYW4gY2xhc3M9ImVsbGlwc2lzIj48L3NwYW4+JykuaHRtbChuKVswXTp1PUgoIjxidXR0b24+Iix7Y2xhc3M6by5qb2luKCIgIikscm9sZToibGluayIsdHlwZToiYnV0dG9uIn0pLmh0bWwobikse2Rpc3BsYXk6dSxjbGlja2VyOnV9fX0scGFnaW5nQ29udGFpbmVyOntfOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV9fX0pO3ZhciBpcj1mdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gVmUobil8fHR5cGVvZiBuIT0ic3RyaW5nInx8KG49bi5yZXBsYWNlKEpvLCIgIiksdCYmKG49Z24obikpLGUmJihuPURyKG4sITEpKSksbn19O2Z1bmN0aW9uIFlhKHQsZSxuLHIscyl7cmV0dXJuIHduP3RbZV0ocyk6ZG4/dFtuXShzKTpyP3Rbcl0ocyk6dH12YXIgJGE9ITEsZG4sd247ZnVuY3Rpb24gamwoKXt3aW5kb3cubHV4b24mJiFkbiYmKGRuPXdpbmRvdy5sdXhvbiksd2luZG93Lm1vbWVudCYmIXduJiYod249d2luZG93Lm1vbWVudCl9ZnVuY3Rpb24gQnIodCxlLG4pe3ZhciByO2lmKGpsKCksd24pe2lmKHI9d24udXRjKHQsZSxuLCEwKSwhci5pc1ZhbGlkKCkpcmV0dXJuIG51bGx9ZWxzZSBpZihkbil7aWYocj1lJiZ0eXBlb2YgdD09InN0cmluZyI/ZG4uRGF0ZVRpbWUuZnJvbUZvcm1hdCh0LGUpOmRuLkRhdGVUaW1lLmZyb21JU08odCksIXIuaXNWYWxpZClyZXR1cm4gbnVsbDtyLnNldExvY2FsZShuKX1lbHNlIGU/KCRhfHxhbGVydCgiRGF0YVRhYmxlcyB3YXJuaW5nOiBGb3JtYXR0ZWQgZGF0ZSB3aXRob3V0IE1vbWVudC5qcyBvciBMdXhvbiAtIGh0dHBzOi8vZGF0YXRhYmxlcy5uZXQvdG4vMTciKSwkYT0hMCk6cj1uZXcgRGF0ZSh0KTtyZXR1cm4gcn1mdW5jdGlvbiBnaSh0KXtyZXR1cm4gZnVuY3Rpb24oZSxuLHIscyl7YXJndW1lbnRzLmxlbmd0aD09PTA/KHI9ImVuIixuPW51bGwsZT1udWxsKTphcmd1bWVudHMubGVuZ3RoPT09MT8ocj0iZW4iLG49ZSxlPW51bGwpOmFyZ3VtZW50cy5sZW5ndGg9PT0yJiYocj1uLG49ZSxlPW51bGwpO3ZhciBpPSJkYXRldGltZSIrKG4/Ii0iK246IiIpO3JldHVybiBidC5leHQudHlwZS5vcmRlcltpXXx8YnQudHlwZShpLHtkZXRlY3Q6ZnVuY3Rpb24obyl7cmV0dXJuIG89PT1pP2k6ITF9LG9yZGVyOntwcmU6ZnVuY3Rpb24obyl7cmV0dXJuIG8udmFsdWVPZigpfX0sY2xhc3NOYW1lOiJkdC1yaWdodCJ9KSxmdW5jdGlvbihvLHUpe2lmKG89PW51bGwpaWYocz09PSItLW5vdyIpe3ZhciBwPW5ldyBEYXRlO289bmV3IERhdGUoRGF0ZS5VVEMocC5nZXRGdWxsWWVhcigpLHAuZ2V0TW9udGgoKSxwLmdldERhdGUoKSxwLmdldEhvdXJzKCkscC5nZXRNaW51dGVzKCkscC5nZXRTZWNvbmRzKCkpKX1lbHNlIG89IiI7aWYodT09PSJ0eXBlIilyZXR1cm4gaTtpZihvPT09IiIpcmV0dXJuIHUhPT0ic29ydCI/IiI6QnIoIjAwMDAtMDEtMDEgMDA6MDA6MDAiLG51bGwscik7aWYobiE9PW51bGwmJmU9PT1uJiZ1IT09InNvcnQiJiZ1IT09InR5cGUiJiYhKG8gaW5zdGFuY2VvZiBEYXRlKSlyZXR1cm4gbzt2YXIgYj1CcihvLGUscik7aWYoYj09PW51bGwpcmV0dXJuIG87aWYodT09PSJzb3J0IilyZXR1cm4gYjt2YXIgZz1uPT09bnVsbD9ZYShiLCJ0b0RhdGUiLCJ0b0pTRGF0ZSIsIiIpW3RdKCk6WWEoYiwiZm9ybWF0IiwidG9Gb3JtYXQiLCJ0b0lTT1N0cmluZyIsbik7cmV0dXJuIHU9PT0iZGlzcGxheSI/Tm4oZyk6Z319fXZhciBDcz0iLCIsVHM9Ii4iO2lmKHdpbmRvdy5JbnRsIT09dm9pZCAwKXRyeXtmb3IoQm49bmV3IEludGwuTnVtYmVyRm9ybWF0KCkuZm9ybWF0VG9QYXJ0cygxMDAwMDAuMSksTmU9MDtOZTxCbi5sZW5ndGg7TmUrKylCbltOZV0udHlwZT09PSJncm91cCI/Q3M9Qm5bTmVdLnZhbHVlOkJuW05lXS50eXBlPT09ImRlY2ltYWwiJiYoVHM9Qm5bTmVdLnZhbHVlKX1jYXRjaHt9dmFyIEJuLE5lO2J0LmRhdGV0aW1lPWZ1bmN0aW9uKHQsZSl7dmFyIG49ImRhdGV0aW1lLSIrdDtlfHwoZT0iZW4iKSxidC5leHQudHlwZS5vcmRlcltuXXx8YnQudHlwZShuLHtkZXRlY3Q6ZnVuY3Rpb24ocil7dmFyIHM9QnIocix0LGUpO3JldHVybiByPT09IiJ8fHM/bjohMX0sb3JkZXI6e3ByZTpmdW5jdGlvbihyKXtyZXR1cm4gQnIocix0LGUpfHwwfX0sY2xhc3NOYW1lOiJkdC1yaWdodCJ9KX07YnQucmVuZGVyPXtkYXRlOmdpKCJ0b0xvY2FsZURhdGVTdHJpbmciKSxkYXRldGltZTpnaSgidG9Mb2NhbGVTdHJpbmciKSx0aW1lOmdpKCJ0b0xvY2FsZVRpbWVTdHJpbmciKSxudW1iZXI6ZnVuY3Rpb24odCxlLG4scixzKXtyZXR1cm4gdD09bnVsbCYmKHQ9Q3MpLGU9PW51bGwmJihlPVRzKSx7ZGlzcGxheTpmdW5jdGlvbihpKXtpZih0eXBlb2YgaSE9Im51bWJlciImJnR5cGVvZiBpIT0ic3RyaW5nInx8aT09PSIifHxpPT09bnVsbClyZXR1cm4gaTt2YXIgbz1pPDA/Ii0iOiIiLHU9cGFyc2VGbG9hdChpKSxwPU1hdGguYWJzKHUpO2lmKHA+PTFlMTF8fHA8MWUtNCYmcCE9PTApe3ZhciBiPXUudG9FeHBvbmVudGlhbChuKS5zcGxpdCgvZVwrPy8pO3JldHVybiBiWzBdKyIgeCAxMDxzdXA+IitiWzFdKyI8L3N1cD4ifWlmKGlzTmFOKHUpKXJldHVybiBObihpKTt1PXUudG9GaXhlZChuKSxpPU1hdGguYWJzKHUpO3ZhciBnPXBhcnNlSW50KGksMTApLG09bj9lKyhpLWcpLnRvRml4ZWQobikuc3Vic3RyaW5nKDIpOiIiO3JldHVybiBnPT09MCYmcGFyc2VGbG9hdChtKT09PTAmJihvPSIiKSxvKyhyfHwiIikrZy50b1N0cmluZygpLnJlcGxhY2UoL1xCKD89KFxkezN9KSsoPyFcZCkpL2csdCkrbSsoc3x8IiIpfX19LHRleHQ6ZnVuY3Rpb24oKXtyZXR1cm57ZGlzcGxheTpObixmaWx0ZXI6Tm59fX07dmFyIG1lPWJ0LmV4dC50eXBlO2J0LnR5cGU9ZnVuY3Rpb24odCxlLG4pe2lmKCFlKXJldHVybntjbGFzc05hbWU6bWUuY2xhc3NOYW1lW3RdLGRldGVjdDptZS5kZXRlY3QuZmluZChmdW5jdGlvbihvKXtyZXR1cm4gby5uYW1lPT09dH0pLG9yZGVyOntwcmU6bWUub3JkZXJbdCsiLXByZSJdLGFzYzptZS5vcmRlclt0KyItYXNjIl0sZGVzYzptZS5vcmRlclt0KyItZGVzYyJdfSxyZW5kZXI6bWUucmVuZGVyW3RdLHNlYXJjaDptZS5zZWFyY2hbdF19O3ZhciByPWZ1bmN0aW9uKG8sdSl7bWVbb11bdF09dX0scz1mdW5jdGlvbihvKXtPYmplY3QuZGVmaW5lUHJvcGVydHkobywibmFtZSIse3ZhbHVlOnR9KTt2YXIgdT1tZS5kZXRlY3QuZmluZEluZGV4KGZ1bmN0aW9uKHApe3JldHVybiBwLm5hbWU9PT10fSk7dT09PS0xP21lLmRldGVjdC51bnNoaWZ0KG8pOm1lLmRldGVjdC5zcGxpY2UodSwxLG8pfSxpPWZ1bmN0aW9uKG8pe21lLm9yZGVyW3QrIi1wcmUiXT1vLnByZSxtZS5vcmRlclt0KyItYXNjIl09by5hc2MsbWUub3JkZXJbdCsiLWRlc2MiXT1vLmRlc2N9O249PT12b2lkIDAmJihuPWUsZT1udWxsKSxlPT09ImNsYXNzTmFtZSI/cigiY2xhc3NOYW1lIixuKTplPT09ImRldGVjdCI/cyhuKTplPT09Im9yZGVyIj9pKG4pOmU9PT0icmVuZGVyIj9yKCJyZW5kZXIiLG4pOmU9PT0ic2VhcmNoIj9yKCJzZWFyY2giLG4pOmV8fChuLmNsYXNzTmFtZSYmcigiY2xhc3NOYW1lIixuLmNsYXNzTmFtZSksbi5kZXRlY3QhPT12b2lkIDAmJnMobi5kZXRlY3QpLG4ub3JkZXImJmkobi5vcmRlciksbi5yZW5kZXIhPT12b2lkIDAmJnIoInJlbmRlciIsbi5yZW5kZXIpLG4uc2VhcmNoIT09dm9pZCAwJiZyKCJzZWFyY2giLG4uc2VhcmNoKSl9O2J0LnR5cGVzPWZ1bmN0aW9uKCl7cmV0dXJuIG1lLmRldGVjdC5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQubmFtZX0pfTt2YXIgWmE9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD10LnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSxlPWUudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLHQubG9jYWxlQ29tcGFyZShlLG5hdmlnYXRvci5sYW5ndWFnZXNbMF18fG5hdmlnYXRvci5sYW5ndWFnZSx7bnVtZXJpYzohMCxpZ25vcmVQdW5jdHVhdGlvbjohMH0pfTtidC50eXBlKCJzdHJpbmciLHtkZXRlY3Q6ZnVuY3Rpb24oKXtyZXR1cm4ic3RyaW5nIn0sb3JkZXI6e3ByZTpmdW5jdGlvbih0KXtyZXR1cm4gVmUodCkmJnR5cGVvZiB0IT0iYm9vbGVhbiI/IiI6dHlwZW9mIHQ9PSJzdHJpbmciP3QudG9Mb3dlckNhc2UoKTp0LnRvU3RyaW5nP3QudG9TdHJpbmcoKToiIn19LHNlYXJjaDppcighMSwhMCl9KTtidC50eXBlKCJzdHJpbmctdXRmOCIse2RldGVjdDp7YWxsT2Y6ZnVuY3Rpb24odCl7cmV0dXJuITB9LG9uZU9mOmZ1bmN0aW9uKHQpe3JldHVybiFWZSh0KSYmbmF2aWdhdG9yLmxhbmd1YWdlcyYmdHlwZW9mIHQ9PSJzdHJpbmciJiZ0Lm1hdGNoKC9bXlx4MDAtXHg3Rl0vKX19LG9yZGVyOnthc2M6WmEsZGVzYzpmdW5jdGlvbih0LGUpe3JldHVybiBaYSh0LGUpKi0xfX0sc2VhcmNoOmlyKCExLCEwKX0pO2J0LnR5cGUoImh0bWwiLHtkZXRlY3Q6e2FsbE9mOmZ1bmN0aW9uKHQpe3JldHVybiBWZSh0KXx8dHlwZW9mIHQ9PSJzdHJpbmciJiZ0LmluZGV4T2YoIjwiKSE9PS0xfSxvbmVPZjpmdW5jdGlvbih0KXtyZXR1cm4hVmUodCkmJnR5cGVvZiB0PT0ic3RyaW5nIiYmdC5pbmRleE9mKCI8IikhPT0tMX19LG9yZGVyOntwcmU6ZnVuY3Rpb24odCl7cmV0dXJuIFZlKHQpPyIiOnQucmVwbGFjZT9nbih0KS50cmltKCkudG9Mb3dlckNhc2UoKTp0KyIifX0sc2VhcmNoOmlyKCEwLCEwKX0pO2J0LnR5cGUoImRhdGUiLHtjbGFzc05hbWU6ImR0LXR5cGUtZGF0ZSIsZGV0ZWN0OnthbGxPZjpmdW5jdGlvbih0KXtpZih0JiYhKHQgaW5zdGFuY2VvZiBEYXRlKSYmIXphLnRlc3QodCkpcmV0dXJuIG51bGw7dmFyIGU9RGF0ZS5wYXJzZSh0KTtyZXR1cm4gZSE9PW51bGwmJiFpc05hTihlKXx8VmUodCl9LG9uZU9mOmZ1bmN0aW9uKHQpe3JldHVybiB0IGluc3RhbmNlb2YgRGF0ZXx8dHlwZW9mIHQ9PSJzdHJpbmciJiZ6YS50ZXN0KHQpfX0sb3JkZXI6e3ByZTpmdW5jdGlvbih0KXt2YXIgZT1EYXRlLnBhcnNlKHQpO3JldHVybiBpc05hTihlKT8tMS8wOmV9fX0pO2J0LnR5cGUoImh0bWwtbnVtLWZtdCIse2NsYXNzTmFtZToiZHQtdHlwZS1udW1lcmljIixkZXRlY3Q6e2FsbE9mOmZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5vTGFuZ3VhZ2Uuc0RlY2ltYWw7cmV0dXJuIFNyKHQsbiwhMCwhMSl9LG9uZU9mOmZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5vTGFuZ3VhZ2Uuc0RlY2ltYWw7cmV0dXJuIFNyKHQsbiwhMCwhMSl9fSxvcmRlcjp7cHJlOmZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5vTGFuZ3VhZ2Uuc0RlY2ltYWw7cmV0dXJuIEhyKHQsbixTaSxEaSl9fSxzZWFyY2g6aXIoITAsITApfSk7YnQudHlwZSgiaHRtbC1udW0iLHtjbGFzc05hbWU6ImR0LXR5cGUtbnVtZXJpYyIsZGV0ZWN0OnthbGxPZjpmdW5jdGlvbih0LGUpe3ZhciBuPWUub0xhbmd1YWdlLnNEZWNpbWFsO3JldHVybiBTcih0LG4sITEsITApfSxvbmVPZjpmdW5jdGlvbih0LGUpe3ZhciBuPWUub0xhbmd1YWdlLnNEZWNpbWFsO3JldHVybiBTcih0LG4sITEsITEpfX0sb3JkZXI6e3ByZTpmdW5jdGlvbih0LGUpe3ZhciBuPWUub0xhbmd1YWdlLnNEZWNpbWFsO3JldHVybiBIcih0LG4sU2kpfX0sc2VhcmNoOmlyKCEwLCEwKX0pO2J0LnR5cGUoIm51bS1mbXQiLHtjbGFzc05hbWU6ImR0LXR5cGUtbnVtZXJpYyIsZGV0ZWN0OnthbGxPZjpmdW5jdGlvbih0LGUpe3ZhciBuPWUub0xhbmd1YWdlLnNEZWNpbWFsO3JldHVybiBRbih0LG4sITAsITApfSxvbmVPZjpmdW5jdGlvbih0LGUpe3ZhciBuPWUub0xhbmd1YWdlLnNEZWNpbWFsO3JldHVybiBRbih0LG4sITAsITEpfX0sb3JkZXI6e3ByZTpmdW5jdGlvbih0LGUpe3ZhciBuPWUub0xhbmd1YWdlLnNEZWNpbWFsO3JldHVybiBIcih0LG4sRGkpfX19KTtidC50eXBlKCJudW0iLHtjbGFzc05hbWU6ImR0LXR5cGUtbnVtZXJpYyIsZGV0ZWN0OnthbGxPZjpmdW5jdGlvbih0LGUpe3ZhciBuPWUub0xhbmd1YWdlLnNEZWNpbWFsO3JldHVybiBRbih0LG4sITEsITApfSxvbmVPZjpmdW5jdGlvbih0LGUpe3ZhciBuPWUub0xhbmd1YWdlLnNEZWNpbWFsO3JldHVybiBRbih0LG4sITEsITEpfX0sb3JkZXI6e3ByZTpmdW5jdGlvbih0LGUpe3ZhciBuPWUub0xhbmd1YWdlLnNEZWNpbWFsO3JldHVybiBIcih0LG4pfX19KTt2YXIgSHI9ZnVuY3Rpb24odCxlLG4scil7aWYodCE9PTAmJighdHx8dD09PSItIikpcmV0dXJuLTEvMDt2YXIgcz10eXBlb2YgdDtyZXR1cm4gcz09PSJudW1iZXIifHxzPT09ImJpZ2ludCI/dDooZSYmKHQ9UWEodCxlKSksdC5yZXBsYWNlJiYobiYmKHQ9dC5yZXBsYWNlKG4sIiIpKSxyJiYodD10LnJlcGxhY2UociwiIikpKSx0KjEpfTtILmV4dGVuZCghMCxidC5leHQucmVuZGVyZXIse2Zvb3Rlcjp7XzpmdW5jdGlvbih0LGUsbil7ZS5hZGRDbGFzcyhuLnRmb290LmNlbGwpfX0saGVhZGVyOntfOmZ1bmN0aW9uKHQsZSxuKXtlLmFkZENsYXNzKG4udGhlYWQuY2VsbCksdC5vRmVhdHVyZXMuYlNvcnR8fGUuYWRkQ2xhc3Mobi5vcmRlci5ub25lKTt2YXIgcj10LmJTb3J0Q2VsbHNUb3Ascz1lLmNsb3Nlc3QoInRoZWFkIikuZmluZCgidHIiKSxpPWUucGFyZW50KCkuaW5kZXgoKTtlLmF0dHIoImRhdGEtZHQtb3JkZXIiKT09PSJkaXNhYmxlInx8ZS5wYXJlbnQoKS5hdHRyKCJkYXRhLWR0LW9yZGVyIik9PT0iZGlzYWJsZSJ8fHI9PT0hMCYmaSE9PTB8fHI9PT0hMSYmaSE9PXMubGVuZ3RoLTF8fEgodC5uVGFibGUpLm9uKCJvcmRlci5kdC5EVCBjb2x1bW4tdmlzaWJpbGl0eS5kdC5EVCIsZnVuY3Rpb24obyx1KXtpZih0PT09dSl7dmFyIHA9dS5zb3J0RGV0YWlscztpZihwKXt2YXIgYixnPW4ub3JkZXIsbT11LmFwaS5jb2x1bW5zKGUpLEM9dC5hb0NvbHVtbnNbbS5mbGF0dGVuKClbMF1dLHk9bS5vcmRlcmFibGUoKS5pbmNsdWRlcyghMCksVD0iIixQPW0uaW5kZXhlcygpLGM9bS5vcmRlcmFibGUoITApLmZsYXR0ZW4oKSxsPUNlKHAsImNvbCIpO2UucmVtb3ZlQ2xhc3MoZy5pc0FzYysiICIrZy5pc0Rlc2MpLnRvZ2dsZUNsYXNzKGcubm9uZSwheSkudG9nZ2xlQ2xhc3MoZy5jYW5Bc2MseSYmYy5pbmNsdWRlcygiYXNjIikpLnRvZ2dsZUNsYXNzKGcuY2FuRGVzYyx5JiZjLmluY2x1ZGVzKCJkZXNjIikpO3ZhciBoPSEwO2ZvcihiPTA7YjxQLmxlbmd0aDtiKyspbC5pbmNsdWRlcyhQW2JdKXx8KGg9ITEpO2lmKGgpe3ZhciBfPW0ub3JkZXIoKTtlLmFkZENsYXNzKF8uaW5jbHVkZXMoImFzYyIpP2cuaXNBc2M6IiIrXy5pbmNsdWRlcygiZGVzYyIpP2cuaXNEZXNjOiIiKX12YXIgRj0tMTtmb3IoYj0wO2I8bC5sZW5ndGg7YisrKWlmKHQuYW9Db2x1bW5zW2xbYl1dLmJWaXNpYmxlKXtGPWxbYl07YnJlYWt9aWYoUFswXT09Ril7dmFyIE89cFswXSxmPUMuYXNTb3J0aW5nO2UuYXR0cigiYXJpYS1zb3J0IixPLmRpcj09PSJhc2MiPyJhc2NlbmRpbmciOiJkZXNjZW5kaW5nIiksVD1mW08uaW5kZXgrMV0/IlJldmVyc2UiOiJSZW1vdmUifWVsc2UgZS5yZW1vdmVBdHRyKCJhcmlhLXNvcnQiKTtlLmF0dHIoImFyaWEtbGFiZWwiLHk/Qy5hcmlhVGl0bGUrdS5hcGkuaTE4bigib0FyaWEub3JkZXJhYmxlIitUKTpDLmFyaWFUaXRsZSkseSYmKGUuZmluZCgiLmR0LWNvbHVtbi10aXRsZSIpLmF0dHIoInJvbGUiLCJidXR0b24iKSxlLmF0dHIoInRhYmluZGV4IiwwKSl9fX0pfX0sbGF5b3V0OntfOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10Lm9DbGFzc2VzLmxheW91dCxzPUgoIjxkaXYvPiIpLmF0dHIoImlkIixuLmlkfHxudWxsKS5hZGRDbGFzcyhuLmNsYXNzTmFtZXx8ci5yb3cpLmFwcGVuZFRvKGUpO0guZWFjaChuLGZ1bmN0aW9uKGksbyl7aWYoIShpPT09ImlkInx8aT09PSJjbGFzc05hbWUiKSl7dmFyIHU9IiI7by50YWJsZSYmKHMuYWRkQ2xhc3Moci50YWJsZVJvdyksdSs9ci50YWJsZUNlbGwrIiAiKSxpPT09InN0YXJ0Ij91Kz1yLnN0YXJ0Omk9PT0iZW5kIj91Kz1yLmVuZDp1Kz1yLmZ1bGwsSCgiPGRpdi8+IikuYXR0cih7aWQ6by5pZHx8bnVsbCxjbGFzczpvLmNsYXNzTmFtZT9vLmNsYXNzTmFtZTpyLmNlbGwrIiAiK3V9KS5hcHBlbmQoby5jb250ZW50cykuYXBwZW5kVG8ocyl9fSl9fX0pO2J0LmZlYXR1cmU9e307YnQuZmVhdHVyZS5yZWdpc3Rlcj1mdW5jdGlvbih0LGUsbil7YnQuZXh0LmZlYXR1cmVzW3RdPWUsbiYmbGUuZmVhdHVyZS5wdXNoKHtjRmVhdHVyZTpuLGZuSW5pdDplfSl9O2Z1bmN0aW9uIENyKHQsZSxuKXtuJiYodFtlXT1uKX1idC5mZWF0dXJlLnJlZ2lzdGVyKCJkaXYiLGZ1bmN0aW9uKHQsZSl7dmFyIG49SCgiPGRpdj4iKVswXTtyZXR1cm4gZSYmKENyKG4sImNsYXNzTmFtZSIsZS5jbGFzc05hbWUpLENyKG4sImlkIixlLmlkKSxDcihuLCJpbm5lckhUTUwiLGUuaHRtbCksQ3IobiwidGV4dENvbnRlbnQiLGUudGV4dCkpLG59KTtidC5mZWF0dXJlLnJlZ2lzdGVyKCJpbmZvIixmdW5jdGlvbih0LGUpe2lmKCF0Lm9GZWF0dXJlcy5iSW5mbylyZXR1cm4gbnVsbDt2YXIgbj10Lm9MYW5ndWFnZSxyPXQuc1RhYmxlSWQscz1IKCI8ZGl2Lz4iLHtjbGFzczp0Lm9DbGFzc2VzLmluZm8uY29udGFpbmVyfSk7cmV0dXJuIGU9SC5leHRlbmQoe2NhbGxiYWNrOm4uZm5JbmZvQ2FsbGJhY2ssZW1wdHk6bi5zSW5mb0VtcHR5LHBvc3RmaXg6bi5zSW5mb1Bvc3RGaXgsc2VhcmNoOm4uc0luZm9GaWx0ZXJlZCx0ZXh0Om4uc0luZm99LGUpLHQuYW9EcmF3Q2FsbGJhY2sucHVzaChmdW5jdGlvbihpKXtNbChpLGUscyl9KSx0Ll9pbmZvRWx8fChzLmF0dHIoeyJhcmlhLWxpdmUiOiJwb2xpdGUiLGlkOnIrIl9pbmZvIixyb2xlOiJzdGF0dXMifSksSCh0Lm5UYWJsZSkuYXR0cigiYXJpYS1kZXNjcmliZWRieSIscisiX2luZm8iKSx0Ll9pbmZvRWw9cyksc30sImkiKTtmdW5jdGlvbiBNbCh0LGUsbil7dmFyIHI9dC5faURpc3BsYXlTdGFydCsxLHM9dC5mbkRpc3BsYXlFbmQoKSxpPXQuZm5SZWNvcmRzVG90YWwoKSxvPXQuZm5SZWNvcmRzRGlzcGxheSgpLHU9bz9lLnRleHQ6ZS5lbXB0eTtvIT09aSYmKHUrPSIgIitlLnNlYXJjaCksdSs9ZS5wb3N0Zml4LHU9amkodCx1KSxlLmNhbGxiYWNrJiYodT1lLmNhbGxiYWNrLmNhbGwodC5vSW5zdGFuY2UsdCxyLHMsaSxvLHUpKSxuLmh0bWwodSksWnQodCxudWxsLCJpbmZvIixbdCxuWzBdLHVdKX12YXIgeWk9MDtidC5mZWF0dXJlLnJlZ2lzdGVyKCJzZWFyY2giLGZ1bmN0aW9uKHQsZSl7aWYoIXQub0ZlYXR1cmVzLmJGaWx0ZXIpcmV0dXJuIG51bGw7dmFyIG49dC5vQ2xhc3Nlcy5zZWFyY2gscj10LnNUYWJsZUlkLHM9dC5vTGFuZ3VhZ2UsaT10Lm9QcmV2aW91c1NlYXJjaCxvPSc8aW5wdXQgdHlwZT0ic2VhcmNoIiBjbGFzcz0iJytuLmlucHV0KyciLz4nO2U9SC5leHRlbmQoe3BsYWNlaG9sZGVyOnMuc1NlYXJjaFBsYWNlaG9sZGVyLHByb2Nlc3Npbmc6ITEsdGV4dDpzLnNTZWFyY2h9LGUpLGUudGV4dC5pbmRleE9mKCJfSU5QVVRfIik9PT0tMSYmKGUudGV4dCs9Il9JTlBVVF8iKSxlLnRleHQ9amkodCxlLnRleHQpO3ZhciB1PWUudGV4dC5tYXRjaCgvX0lOUFVUXyQvKSxwPWUudGV4dC5tYXRjaCgvXl9JTlBVVF8vKSxiPWUudGV4dC5yZXBsYWNlKC9fSU5QVVRfLywiIiksZz0iPGxhYmVsPiIrZS50ZXh0KyI8L2xhYmVsPiI7cD9nPSJfSU5QVVRfPGxhYmVsPiIrYisiPC9sYWJlbD4iOnUmJihnPSI8bGFiZWw+IitiKyI8L2xhYmVsPl9JTlBVVF8iKTt2YXIgbT1IKCI8ZGl2PiIpLmFkZENsYXNzKG4uY29udGFpbmVyKS5hcHBlbmQoZy5yZXBsYWNlKC9fSU5QVVRfLyxvKSk7bS5maW5kKCJsYWJlbCIpLmF0dHIoImZvciIsImR0LXNlYXJjaC0iK3lpKSxtLmZpbmQoImlucHV0IikuYXR0cigiaWQiLCJkdC1zZWFyY2gtIit5aSkseWkrKzt2YXIgQz1mdW5jdGlvbihQKXt2YXIgYz10aGlzLnZhbHVlO2kucmV0dXJuJiZQLmtleSE9PSJFbnRlciJ8fGMhPWkuc2VhcmNoJiZ1cyh0LGUucHJvY2Vzc2luZyxmdW5jdGlvbigpe2kuc2VhcmNoPWMsdHIodCxpKSx0Ll9pRGlzcGxheVN0YXJ0PTAsTG4odCl9KX0seT10LnNlYXJjaERlbGF5IT09bnVsbD90LnNlYXJjaERlbGF5OjAsVD1IKCJpbnB1dCIsbSkudmFsKGkuc2VhcmNoKS5hdHRyKCJwbGFjZWhvbGRlciIsZS5wbGFjZWhvbGRlcikub24oImtleXVwLkRUIHNlYXJjaC5EVCBpbnB1dC5EVCBwYXN0ZS5EVCBjdXQuRFQiLHk/YnQudXRpbC5kZWJvdW5jZShDLHkpOkMpLm9uKCJtb3VzZXVwLkRUIixmdW5jdGlvbihQKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Qy5jYWxsKFRbMF0sUCl9LDEwKX0pLm9uKCJrZXlwcmVzcy5EVCIsZnVuY3Rpb24oUCl7aWYoUC5rZXlDb2RlPT0xMylyZXR1cm4hMX0pLmF0dHIoImFyaWEtY29udHJvbHMiLHIpO3JldHVybiBIKHQublRhYmxlKS5vbigic2VhcmNoLmR0LkRUIixmdW5jdGlvbihQLGMpe3Q9PT1jJiZUWzBdIT09ZG9jdW1lbnQuYWN0aXZlRWxlbWVudCYmVC52YWwodHlwZW9mIGkuc2VhcmNoIT0iZnVuY3Rpb24iP2kuc2VhcmNoOiIiKX0pLG19LCJmIik7YnQuZmVhdHVyZS5yZWdpc3RlcigicGFnaW5nIixmdW5jdGlvbih0LGUpe2lmKCF0Lm9GZWF0dXJlcy5iUGFnaW5hdGUpcmV0dXJuIG51bGw7ZT1ILmV4dGVuZCh7YnV0dG9uczpidC5leHQucGFnZXIubnVtYmVyc19sZW5ndGgsdHlwZTp0LnNQYWdpbmF0aW9uVHlwZSxib3VuZGFyeU51bWJlcnM6ITAsZmlyc3RMYXN0OiEwLHByZXZpb3VzTmV4dDohMCxudW1iZXJzOiEwfSxlKTt2YXIgbj1IKCI8ZGl2Lz4iKS5hZGRDbGFzcyh0Lm9DbGFzc2VzLnBhZ2luZy5jb250YWluZXIrKGUudHlwZT8iIHBhZ2luZ18iK2UudHlwZToiIikpLmFwcGVuZChIKCI8bmF2PiIpLmF0dHIoImFyaWEtbGFiZWwiLCJwYWdpbmF0aW9uIikuYWRkQ2xhc3ModC5vQ2xhc3Nlcy5wYWdpbmcubmF2KSkscj1mdW5jdGlvbigpe2tzKHQsbi5jaGlsZHJlbigpLGUpfTtyZXR1cm4gdC5hb0RyYXdDYWxsYmFjay5wdXNoKHIpLEgodC5uVGFibGUpLm9uKCJjb2x1bW4tc2l6aW5nLmR0LkRUIixyKSxufSwicCIpO2Z1bmN0aW9uIFZsKHQpe3ZhciBlPVtdO3JldHVybiB0Lm51bWJlcnMmJmUucHVzaCgibnVtYmVycyIpLHQucHJldmlvdXNOZXh0JiYoZS51bnNoaWZ0KCJwcmV2aW91cyIpLGUucHVzaCgibmV4dCIpKSx0LmZpcnN0TGFzdCYmKGUudW5zaGlmdCgiZmlyc3QiKSxlLnB1c2goImxhc3QiKSksZX1mdW5jdGlvbiBrcyh0LGUsbil7aWYodC5fYkluaXRDb21wbGV0ZSl7Zm9yKHZhciByPW4udHlwZT9idC5leHQucGFnZXJbbi50eXBlXTpWbCxzPXQub0xhbmd1YWdlLm9BcmlhLnBhZ2luYXRlfHx7fSxpPXQuX2lEaXNwbGF5U3RhcnQsbz10Ll9pRGlzcGxheUxlbmd0aCx1PXQuZm5SZWNvcmRzRGlzcGxheSgpLHA9bz09PS0xLGI9cD8wOk1hdGguY2VpbChpL28pLGc9cD8xOk1hdGguY2VpbCh1L28pLG09cihuKS5tYXAoZnVuY3Rpb24oRil7cmV0dXJuIEY9PT0ibnVtYmVycyI/U3MoYixnLG4uYnV0dG9ucyxuLmJvdW5kYXJ5TnVtYmVycyk6Rn0pLmZsYXQoKSxDPVtdLHk9MDt5PG0ubGVuZ3RoO3krKyl7dmFyIFQ9bVt5XSxQPUhsKHQsVCxiLGcpLGM9RnIodCwicGFnaW5nQnV0dG9uIikodCxULFAuZGlzcGxheSxQLmFjdGl2ZSxQLmRpc2FibGVkKSxsPXR5cGVvZiBUPT0ic3RyaW5nIj9zW1RdOnMubnVtYmVyP3MubnVtYmVyKyhUKzEpOm51bGw7SChjLmNsaWNrZXIpLmF0dHIoeyJhcmlhLWNvbnRyb2xzIjp0LnNUYWJsZUlkLCJhcmlhLWRpc2FibGVkIjpQLmRpc2FibGVkPyJ0cnVlIjpudWxsLCJhcmlhLWN1cnJlbnQiOlAuYWN0aXZlPyJwYWdlIjpudWxsLCJhcmlhLWxhYmVsIjpsLCJkYXRhLWR0LWlkeCI6VCx0YWJJbmRleDpQLmRpc2FibGVkPy0xOnQuaVRhYkluZGV4P3QuaVRhYkluZGV4Om51bGx9KSx0eXBlb2YgVCE9Im51bWJlciImJkgoYy5jbGlja2VyKS5hZGRDbGFzcyhUKSxtcyhjLmNsaWNrZXIse2FjdGlvbjpUfSxmdW5jdGlvbihGKXtGLnByZXZlbnREZWZhdWx0KCksTGkodCxGLmRhdGEuYWN0aW9uLCEwKX0pLEMucHVzaChjLmRpc3BsYXkpfXZhciBoPUZyKHQsInBhZ2luZ0NvbnRhaW5lciIpKHQsQyksXz1lLmZpbmQoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkuZGF0YSgiZHQtaWR4Iik7ZS5lbXB0eSgpLmFwcGVuZChoKSxfIT09dm9pZCAwJiZlLmZpbmQoIltkYXRhLWR0LWlkeD0iK18rIl0iKS50cmlnZ2VyKCJmb2N1cyIpLEMubGVuZ3RoJiZuLmJ1dHRvbnM+MSYmSChlKS5oZWlnaHQoKT49SChDWzBdKS5vdXRlckhlaWdodCgpKjItMTAmJmtzKHQsZSxILmV4dGVuZCh7fSxuLHtidXR0b25zOm4uYnV0dG9ucy0yfSkpfX1mdW5jdGlvbiBIbCh0LGUsbixyKXt2YXIgcz10Lm9MYW5ndWFnZS5vUGFnaW5hdGUsaT17ZGlzcGxheToiIixhY3RpdmU6ITEsZGlzYWJsZWQ6ITF9O3N3aXRjaChlKXtjYXNlImVsbGlwc2lzIjppLmRpc3BsYXk9IiYjeDIwMjY7IixpLmRpc2FibGVkPSEwO2JyZWFrO2Nhc2UiZmlyc3QiOmkuZGlzcGxheT1zLnNGaXJzdCxuPT09MCYmKGkuZGlzYWJsZWQ9ITApO2JyZWFrO2Nhc2UicHJldmlvdXMiOmkuZGlzcGxheT1zLnNQcmV2aW91cyxuPT09MCYmKGkuZGlzYWJsZWQ9ITApO2JyZWFrO2Nhc2UibmV4dCI6aS5kaXNwbGF5PXMuc05leHQsKHI9PT0wfHxuPT09ci0xKSYmKGkuZGlzYWJsZWQ9ITApO2JyZWFrO2Nhc2UibGFzdCI6aS5kaXNwbGF5PXMuc0xhc3QsKHI9PT0wfHxuPT09ci0xKSYmKGkuZGlzYWJsZWQ9ITApO2JyZWFrO2RlZmF1bHQ6dHlwZW9mIGU9PSJudW1iZXIiJiYoaS5kaXNwbGF5PXQuZm5Gb3JtYXROdW1iZXIoZSsxKSxuPT09ZSYmKGkuYWN0aXZlPSEwKSk7YnJlYWt9cmV0dXJuIGl9ZnVuY3Rpb24gU3ModCxlLG4scil7dmFyIHM9W10saT1NYXRoLmZsb29yKG4vMiksbz1yPzI6MSx1PXI/MTowO3JldHVybiBlPD1uP3M9YW4oMCxlKTpuPT09MT9zPVt0XTpuPT09Mz90PD0xP3M9WzAsMSwiZWxsaXBzaXMiXTp0Pj1lLTI/KHM9YW4oZS0yLGUpLHMudW5zaGlmdCgiZWxsaXBzaXMiKSk6cz1bImVsbGlwc2lzIix0LCJlbGxpcHNpcyJdOnQ8PWk/KHM9YW4oMCxuLW8pLHMucHVzaCgiZWxsaXBzaXMiKSxyJiZzLnB1c2goZS0xKSk6dD49ZS0xLWk/KHM9YW4oZS0obi1vKSxlKSxzLnVuc2hpZnQoImVsbGlwc2lzIiksciYmcy51bnNoaWZ0KDApKToocz1hbih0LWkrbyx0K2ktdSkscy5wdXNoKCJlbGxpcHNpcyIpLHMudW5zaGlmdCgiZWxsaXBzaXMiKSxyJiYocy5wdXNoKGUtMSkscy51bnNoaWZ0KDApKSksc312YXIgd2k9MDtidC5mZWF0dXJlLnJlZ2lzdGVyKCJwYWdlTGVuZ3RoIixmdW5jdGlvbih0LGUpe3ZhciBuPXQub0ZlYXR1cmVzO2lmKCFuLmJQYWdpbmF0ZXx8IW4uYkxlbmd0aENoYW5nZSlyZXR1cm4gbnVsbDtlPUguZXh0ZW5kKHttZW51OnQuYUxlbmd0aE1lbnUsdGV4dDp0Lm9MYW5ndWFnZS5zTGVuZ3RoTWVudX0sZSk7dmFyIHI9dC5vQ2xhc3Nlcy5sZW5ndGgscz10LnNUYWJsZUlkLGk9ZS5tZW51LG89W10sdT1bXSxwO2lmKEFycmF5LmlzQXJyYXkoaVswXSkpbz1pWzBdLHU9aVsxXTtlbHNlIGZvcihwPTA7cDxpLmxlbmd0aDtwKyspSC5pc1BsYWluT2JqZWN0KGlbcF0pPyhvLnB1c2goaVtwXS52YWx1ZSksdS5wdXNoKGlbcF0ubGFiZWwpKTooby5wdXNoKGlbcF0pLHUucHVzaChpW3BdKSk7dmFyIGI9ZS50ZXh0Lm1hdGNoKC9fTUVOVV8kLyksZz1lLnRleHQubWF0Y2goL15fTUVOVV8vKSxtPWUudGV4dC5yZXBsYWNlKC9fTUVOVV8vLCIiKSxDPSI8bGFiZWw+IitlLnRleHQrIjwvbGFiZWw+IjtnP0M9Il9NRU5VXzxsYWJlbD4iK20rIjwvbGFiZWw+IjpiJiYoQz0iPGxhYmVsPiIrbSsiPC9sYWJlbD5fTUVOVV8iKTt2YXIgeT0idG1wLSIrICtuZXcgRGF0ZSxUPUgoIjxkaXYvPiIpLmFkZENsYXNzKHIuY29udGFpbmVyKS5hcHBlbmQoQy5yZXBsYWNlKCJfTUVOVV8iLCc8c3BhbiBpZD0iJyt5KyciPjwvc3Bhbj4nKSksUD1bXTtULmZpbmQoImxhYmVsIilbMF0uY2hpbGROb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKGgpe2gubm9kZVR5cGU9PT1Ob2RlLlRFWFRfTk9ERSYmUC5wdXNoKHtlbDpoLHRleHQ6aC50ZXh0Q29udGVudH0pfSk7dmFyIGM9ZnVuY3Rpb24oaCl7UC5mb3JFYWNoKGZ1bmN0aW9uKF8pe18uZWwudGV4dENvbnRlbnQ9amkodCxfLnRleHQsaCl9KX0sbD1IKCI8c2VsZWN0Lz4iLHtuYW1lOnMrIl9sZW5ndGgiLCJhcmlhLWNvbnRyb2xzIjpzLGNsYXNzOnIuc2VsZWN0fSk7Zm9yKHA9MDtwPG8ubGVuZ3RoO3ArKylsWzBdW3BdPW5ldyBPcHRpb24odHlwZW9mIHVbcF09PSJudW1iZXIiP3QuZm5Gb3JtYXROdW1iZXIodVtwXSk6dVtwXSxvW3BdKTtyZXR1cm4gVC5maW5kKCJsYWJlbCIpLmF0dHIoImZvciIsImR0LWxlbmd0aC0iK3dpKSxsLmF0dHIoImlkIiwiZHQtbGVuZ3RoLSIrd2kpLHdpKyssVC5maW5kKCIjIit5KS5yZXBsYWNlV2l0aChsKSxIKCJzZWxlY3QiLFQpLnZhbCh0Ll9pRGlzcGxheUxlbmd0aCkub24oImNoYW5nZS5EVCIsZnVuY3Rpb24oKXtkcyh0LEgodGhpcykudmFsKCkpLExuKHQpfSksSCh0Lm5UYWJsZSkub24oImxlbmd0aC5kdC5EVCIsZnVuY3Rpb24oaCxfLEYpe3Q9PT1fJiYoSCgic2VsZWN0IixUKS52YWwoRiksYyhGKSl9KSxjKHQuX2lEaXNwbGF5TGVuZ3RoKSxUfSwibCIpO0guZm4uZGF0YVRhYmxlPWJ0O2J0LiQ9SDtILmZuLmRhdGFUYWJsZVNldHRpbmdzPWJ0LnNldHRpbmdzO0guZm4uZGF0YVRhYmxlRXh0PWJ0LmV4dDtILmZuLkRhdGFUYWJsZT1mdW5jdGlvbih0KXtyZXR1cm4gSCh0aGlzKS5kYXRhVGFibGUodCkuYXBpKCl9O0guZWFjaChidCxmdW5jdGlvbih0LGUpe0guZm4uRGF0YVRhYmxlW3RdPWV9KTt2YXIgYXQ9YnQ7dmFyICRlPWF0O3ZhciAkbD1pZShhZSgpLDEpO3ZhciBQcz1pZShhZSgpLDEpO3ZhciBodD1Qcy5kZWZhdWx0LFdsPTAsR2w9MCxTZT1hdC5leHQuYnV0dG9ucyxxaT1udWxsO2Z1bmN0aW9uIFhpKHQsZSxuKXtodC5mbi5hbmltYXRlP3Quc3RvcCgpLmZhZGVJbihlLG4pOih0LmNzcygiZGlzcGxheSIsImJsb2NrIiksbiYmbi5jYWxsKHQpKX1mdW5jdGlvbiBZaSh0LGUsbil7aHQuZm4uYW5pbWF0ZT90LnN0b3AoKS5mYWRlT3V0KGUsbik6KHQuY3NzKCJkaXNwbGF5Iiwibm9uZSIpLG4mJm4uY2FsbCh0KSl9dmFyIHRlPWZ1bmN0aW9uKHQsZSl7aWYoIWF0LnZlcnNpb25DaGVjaygiMiIpKXRocm93Ildhcm5pbmc6IEJ1dHRvbnMgcmVxdWlyZXMgRGF0YVRhYmxlcyAyIG9yIG5ld2VyIjtpZighKHRoaXMgaW5zdGFuY2VvZiB0ZSkpcmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBuZXcgdGUobix0KS5jb250YWluZXIoKX07dHlwZW9mIGU+InUiJiYoZT17fSksZT09PSEwJiYoZT17fSksQXJyYXkuaXNBcnJheShlKSYmKGU9e2J1dHRvbnM6ZX0pLHRoaXMuYz1odC5leHRlbmQoITAse30sdGUuZGVmYXVsdHMsZSksZS5idXR0b25zJiYodGhpcy5jLmJ1dHRvbnM9ZS5idXR0b25zKSx0aGlzLnM9e2R0Om5ldyBhdC5BcGkodCksYnV0dG9uczpbXSxsaXN0ZW5LZXlzOiIiLG5hbWVzcGFjZToiZHRiIitXbCsrfSx0aGlzLmRvbT17Y29udGFpbmVyOmh0KCI8Iit0aGlzLmMuZG9tLmNvbnRhaW5lci50YWcrIi8+IikuYWRkQ2xhc3ModGhpcy5jLmRvbS5jb250YWluZXIuY2xhc3NOYW1lKX0sdGhpcy5fY29uc3RydWN0b3IoKX07aHQuZXh0ZW5kKHRlLnByb3RvdHlwZSx7YWN0aW9uOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fbm9kZVRvQnV0dG9uKHQpO3JldHVybiBlPT09dm9pZCAwP24uY29uZi5hY3Rpb246KG4uY29uZi5hY3Rpb249ZSx0aGlzKX0sYWN0aXZlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fbm9kZVRvQnV0dG9uKHQpLHI9dGhpcy5jLmRvbS5idXR0b24uYWN0aXZlLHM9aHQobi5ub2RlKTtyZXR1cm4gbi5pbkNvbGxlY3Rpb24mJnRoaXMuYy5kb20uY29sbGVjdGlvbi5idXR0b24mJnRoaXMuYy5kb20uY29sbGVjdGlvbi5idXR0b24uYWN0aXZlIT09dm9pZCAwJiYocj10aGlzLmMuZG9tLmNvbGxlY3Rpb24uYnV0dG9uLmFjdGl2ZSksZT09PXZvaWQgMD9zLmhhc0NsYXNzKHIpOihzLnRvZ2dsZUNsYXNzKHIsZT09PXZvaWQgMD8hMDplKSx0aGlzKX0sYWRkOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzLnMuYnV0dG9ucztpZih0eXBlb2YgZT09InN0cmluZyIpe2Zvcih2YXIgcz1lLnNwbGl0KCItIiksaT10aGlzLnMsbz0wLHU9cy5sZW5ndGgtMTtvPHU7bysrKWk9aS5idXR0b25zW3Nbb10qMV07cj1pLmJ1dHRvbnMsZT1zW3MubGVuZ3RoLTFdKjF9cmV0dXJuIHRoaXMuX2V4cGFuZEJ1dHRvbihyLHQsdCE9PXZvaWQgMD90LnNwbGl0OnZvaWQgMCwodD09PXZvaWQgMHx8dC5zcGxpdD09PXZvaWQgMHx8dC5zcGxpdC5sZW5ndGg9PT0wKSYmaSE9PXZvaWQgMCwhMSxlKSwobj09PXZvaWQgMHx8bj09PSEwKSYmdGhpcy5fZHJhdygpLHRoaXN9LGNvbGxlY3Rpb25SZWJ1aWxkOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fbm9kZVRvQnV0dG9uKHQpO2lmKGUhPT12b2lkIDApe3ZhciByO2ZvcihyPW4uYnV0dG9ucy5sZW5ndGgtMTtyPj0wO3ItLSl0aGlzLnJlbW92ZShuLmJ1dHRvbnNbcl0ubm9kZSk7Zm9yKG4uY29uZi5wcmVmaXhCdXR0b25zJiZlLnVuc2hpZnQuYXBwbHkoZSxuLmNvbmYucHJlZml4QnV0dG9ucyksbi5jb25mLnBvc3RmaXhCdXR0b25zJiZlLnB1c2guYXBwbHkoZSxuLmNvbmYucG9zdGZpeEJ1dHRvbnMpLHI9MDtyPGUubGVuZ3RoO3IrKyl7dmFyIHM9ZVtyXTt0aGlzLl9leHBhbmRCdXR0b24obi5idXR0b25zLHMscyE9PXZvaWQgMCYmcy5jb25maWchPT12b2lkIDAmJnMuY29uZmlnLnNwbGl0IT09dm9pZCAwLCEwLHMucGFyZW50Q29uZiE9PXZvaWQgMCYmcy5wYXJlbnRDb25mLnNwbGl0IT09dm9pZCAwLG51bGwscy5wYXJlbnRDb25mKX19dGhpcy5fZHJhdyhuLmNvbGxlY3Rpb24sbi5idXR0b25zKX0sY29udGFpbmVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tLmNvbnRhaW5lcn0sZGlzYWJsZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9ub2RlVG9CdXR0b24odCk7cmV0dXJuIGh0KGUubm9kZSkuYWRkQ2xhc3ModGhpcy5jLmRvbS5idXR0b24uZGlzYWJsZWQpLnByb3AoImRpc2FibGVkIiwhMCksdGhpc30sZGVzdHJveTpmdW5jdGlvbigpe2h0KCJib2R5Iikub2ZmKCJrZXl1cC4iK3RoaXMucy5uYW1lc3BhY2UpO3ZhciB0PXRoaXMucy5idXR0b25zLnNsaWNlKCksZSxuO2ZvcihlPTAsbj10Lmxlbmd0aDtlPG47ZSsrKXRoaXMucmVtb3ZlKHRbZV0ubm9kZSk7dGhpcy5kb20uY29udGFpbmVyLnJlbW92ZSgpO3ZhciByPXRoaXMucy5kdC5zZXR0aW5ncygpWzBdO2ZvcihlPTAsbj1yLmxlbmd0aDtlPG47ZSsrKWlmKHIuaW5zdD09PXRoaXMpe3Iuc3BsaWNlKGUsMSk7YnJlYWt9cmV0dXJuIHRoaXN9LGVuYWJsZTpmdW5jdGlvbih0LGUpe2lmKGU9PT0hMSlyZXR1cm4gdGhpcy5kaXNhYmxlKHQpO3ZhciBuPXRoaXMuX25vZGVUb0J1dHRvbih0KTtyZXR1cm4gaHQobi5ub2RlKS5yZW1vdmVDbGFzcyh0aGlzLmMuZG9tLmJ1dHRvbi5kaXNhYmxlZCkucHJvcCgiZGlzYWJsZWQiLCExKSx0aGlzfSxpbmRleDpmdW5jdGlvbih0LGUsbil7ZXx8KGU9IiIsbj10aGlzLnMuYnV0dG9ucyk7Zm9yKHZhciByPTAscz1uLmxlbmd0aDtyPHM7cisrKXt2YXIgaT1uW3JdLmJ1dHRvbnM7aWYobltyXS5ub2RlPT09dClyZXR1cm4gZStyO2lmKGkmJmkubGVuZ3RoKXt2YXIgbz10aGlzLmluZGV4KHQscisiLSIsaSk7aWYobyE9PW51bGwpcmV0dXJuIG99fXJldHVybiBudWxsfSxuYW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYy5uYW1lfSxub2RlOmZ1bmN0aW9uKHQpe2lmKCF0KXJldHVybiB0aGlzLmRvbS5jb250YWluZXI7dmFyIGU9dGhpcy5fbm9kZVRvQnV0dG9uKHQpO3JldHVybiBodChlLm5vZGUpfSxwcm9jZXNzaW5nOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5zLmR0LHI9dGhpcy5fbm9kZVRvQnV0dG9uKHQpO3JldHVybiBlPT09dm9pZCAwP2h0KHIubm9kZSkuaGFzQ2xhc3MoInByb2Nlc3NpbmciKTooaHQoci5ub2RlKS50b2dnbGVDbGFzcygicHJvY2Vzc2luZyIsZSksaHQobi50YWJsZSgpLm5vZGUoKSkudHJpZ2dlckhhbmRsZXIoImJ1dHRvbnMtcHJvY2Vzc2luZy5kdCIsW2Usbi5idXR0b24odCksbixodCh0KSxyLmNvbmZdKSx0aGlzKX0scmVtb3ZlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX25vZGVUb0J1dHRvbih0KSxuPXRoaXMuX25vZGVUb0hvc3QodCkscj10aGlzLnMuZHQ7aWYoZS5idXR0b25zLmxlbmd0aClmb3IodmFyIHM9ZS5idXR0b25zLmxlbmd0aC0xO3M+PTA7cy0tKXRoaXMucmVtb3ZlKGUuYnV0dG9uc1tzXS5ub2RlKTtlLmNvbmYuZGVzdHJveWluZz0hMCxlLmNvbmYuZGVzdHJveSYmZS5jb25mLmRlc3Ryb3kuY2FsbChyLmJ1dHRvbih0KSxyLGh0KHQpLGUuY29uZiksdGhpcy5fcmVtb3ZlS2V5KGUuY29uZiksaHQoZS5ub2RlKS5yZW1vdmUoKTt2YXIgaT1odC5pbkFycmF5KGUsbik7cmV0dXJuIG4uc3BsaWNlKGksMSksdGhpc30sdGV4dDpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX25vZGVUb0J1dHRvbih0KSxyPW4udGV4dE5vZGUscz10aGlzLnMuZHQsaT1odChuLm5vZGUpLG89ZnVuY3Rpb24odSl7cmV0dXJuIHR5cGVvZiB1PT0iZnVuY3Rpb24iP3UocyxpLG4uY29uZik6dX07cmV0dXJuIGU9PT12b2lkIDA/byhuLmNvbmYudGV4dCk6KG4uY29uZi50ZXh0PWUsci5odG1sKG8oZSkpLHRoaXMpfSxfY29uc3RydWN0b3I6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy5zLmR0LG49ZS5zZXR0aW5ncygpWzBdLHI9dGhpcy5jLmJ1dHRvbnM7bi5fYnV0dG9uc3x8KG4uX2J1dHRvbnM9W10pLG4uX2J1dHRvbnMucHVzaCh7aW5zdDp0aGlzLG5hbWU6dGhpcy5jLm5hbWV9KTtmb3IodmFyIHM9MCxpPXIubGVuZ3RoO3M8aTtzKyspdGhpcy5hZGQocltzXSk7ZS5vbigiZGVzdHJveSIsZnVuY3Rpb24obyx1KXt1PT09biYmdC5kZXN0cm95KCl9KSxodCgiYm9keSIpLm9uKCJrZXl1cC4iK3RoaXMucy5uYW1lc3BhY2UsZnVuY3Rpb24obyl7aWYoIWRvY3VtZW50LmFjdGl2ZUVsZW1lbnR8fGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ9PT1kb2N1bWVudC5ib2R5KXt2YXIgdT1TdHJpbmcuZnJvbUNoYXJDb2RlKG8ua2V5Q29kZSkudG9Mb3dlckNhc2UoKTt0LnMubGlzdGVuS2V5cy50b0xvd2VyQ2FzZSgpLmluZGV4T2YodSkhPT0tMSYmdC5fa2V5cHJlc3ModSxvKX19KX0sX2FkZEtleTpmdW5jdGlvbih0KXt0LmtleSYmKHRoaXMucy5saXN0ZW5LZXlzKz1odC5pc1BsYWluT2JqZWN0KHQua2V5KT90LmtleS5rZXk6dC5rZXkpfSxfZHJhdzpmdW5jdGlvbih0LGUpe3R8fCh0PXRoaXMuZG9tLmNvbnRhaW5lcixlPXRoaXMucy5idXR0b25zKSx0LmNoaWxkcmVuKCkuZGV0YWNoKCk7Zm9yKHZhciBuPTAscj1lLmxlbmd0aDtuPHI7bisrKXQuYXBwZW5kKGVbbl0uaW5zZXJ0ZXIpLHQuYXBwZW5kKCIgIiksZVtuXS5idXR0b25zJiZlW25dLmJ1dHRvbnMubGVuZ3RoJiZ0aGlzLl9kcmF3KGVbbl0uY29sbGVjdGlvbixlW25dLmJ1dHRvbnMpfSxfZXhwYW5kQnV0dG9uOmZ1bmN0aW9uKHQsZSxuLHIscyxpLG8pe3ZhciB1PXRoaXMucy5kdCxwPSExLGI9dGhpcy5jLmRvbS5jb2xsZWN0aW9uLGc9QXJyYXkuaXNBcnJheShlKT9lOltlXTtlPT09dm9pZCAwJiYoZz1BcnJheS5pc0FycmF5KG4pP246W25dKTtmb3IodmFyIG09MCxDPWcubGVuZ3RoO208QzttKyspe3ZhciB5PXRoaXMuX3Jlc29sdmVFeHRlbmRzKGdbbV0pO2lmKHkpe2lmKHA9ISEoeS5jb25maWcmJnkuY29uZmlnLnNwbGl0KSxBcnJheS5pc0FycmF5KHkpKXt0aGlzLl9leHBhbmRCdXR0b24odCx5LFQhPT12b2lkIDAmJlQuY29uZiE9PXZvaWQgMD9ULmNvbmYuc3BsaXQ6dm9pZCAwLHIsbyE9PXZvaWQgMCYmby5zcGxpdCE9PXZvaWQgMCxpLG8pO2NvbnRpbnVlfXZhciBUPXRoaXMuX2J1aWxkQnV0dG9uKHkscix5LnNwbGl0IT09dm9pZCAwfHx5LmNvbmZpZyE9PXZvaWQgMCYmeS5jb25maWcuc3BsaXQhPT12b2lkIDAscyk7aWYoVCl7aWYoaSE9bnVsbD8odC5zcGxpY2UoaSwwLFQpLGkrKyk6dC5wdXNoKFQpLFQuY29uZi5idXR0b25zJiYoVC5jb2xsZWN0aW9uPWh0KCI8IitiLmNvbnRhaW5lci5jb250ZW50LnRhZysiLz4iKSxULmNvbmYuX2NvbGxlY3Rpb249VC5jb2xsZWN0aW9uLGh0KFQubm9kZSkuYXBwZW5kKGIuYWN0aW9uLmRyb3BIdG1sKSx0aGlzLl9leHBhbmRCdXR0b24oVC5idXR0b25zLFQuY29uZi5idXR0b25zLFQuY29uZi5zcGxpdCwhcCxwLGksVC5jb25mKSksVC5jb25mLnNwbGl0KXtULmNvbGxlY3Rpb249aHQoIjwiK2IuY29udGFpbmVyLnRhZysiLz4iKSxULmNvbmYuX2NvbGxlY3Rpb249VC5jb2xsZWN0aW9uO2Zvcih2YXIgUD0wO1A8VC5jb25mLnNwbGl0Lmxlbmd0aDtQKyspe3ZhciBjPVQuY29uZi5zcGxpdFtQXTt0eXBlb2YgYz09Im9iamVjdCImJihjLnBhcmVudD1vLGMuY29sbGVjdGlvbkxheW91dD09PXZvaWQgMCYmKGMuY29sbGVjdGlvbkxheW91dD1ULmNvbmYuY29sbGVjdGlvbkxheW91dCksYy5kcm9wdXA9PT12b2lkIDAmJihjLmRyb3B1cD1ULmNvbmYuZHJvcHVwKSxjLmZhZGU9PT12b2lkIDAmJihjLmZhZGU9VC5jb25mLmZhZGUpKX10aGlzLl9leHBhbmRCdXR0b24oVC5idXR0b25zLFQuY29uZi5idXR0b25zLFQuY29uZi5zcGxpdCwhcCxwLGksVC5jb25mKX1ULmNvbmYucGFyZW50PW8seS5pbml0JiZ5LmluaXQuY2FsbCh1LmJ1dHRvbihULm5vZGUpLHUsaHQoVC5ub2RlKSx5KX19fX0sX2J1aWxkQnV0dG9uOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBzPXRoaXMsaT10aGlzLmMuZG9tLG8sdT10aGlzLnMuZHQscD1mdW5jdGlvbihRKXtyZXR1cm4gdHlwZW9mIFE9PSJmdW5jdGlvbiI/USh1LG0sdCk6UX0sYj1odC5leHRlbmQoITAse30saS5idXR0b24pO2lmKGUmJm4mJmkuY29sbGVjdGlvbi5zcGxpdD9odC5leHRlbmQoITAsYixpLmNvbGxlY3Rpb24uc3BsaXQuYWN0aW9uKTpyfHxlP2h0LmV4dGVuZCghMCxiLGkuY29sbGVjdGlvbi5idXR0b24pOm4mJmh0LmV4dGVuZCghMCxiLGkuc3BsaXQuYnV0dG9uKSx0LnNwYWNlcil7dmFyIGc9aHQoIjwiK2Iuc3BhY2VyLnRhZysiLz4iKS5hZGRDbGFzcygiZHQtYnV0dG9uLXNwYWNlciAiK3Quc3R5bGUrIiAiK2Iuc3BhY2VyLmNsYXNzTmFtZSkuaHRtbChwKHQudGV4dCkpO3JldHVybntjb25mOnQsbm9kZTpnLGluc2VydGVyOmcsYnV0dG9uczpbXSxpbkNvbGxlY3Rpb246ZSxpc1NwbGl0Om4sY29sbGVjdGlvbjpudWxsLHRleHROb2RlOmd9fWlmKHQuYXZhaWxhYmxlJiYhdC5hdmFpbGFibGUodSx0KSYmIXQuaHRtbClyZXR1cm4hMTt2YXIgbTtpZih0Lmh0bWwpbT1odCh0Lmh0bWwpO2Vsc2V7dmFyIEM9ZnVuY3Rpb24oUSxFLCQsdyxrKXt3LmFjdGlvbi5jYWxsKEUuYnV0dG9uKCQpLFEsRSwkLHcsayksaHQoRS50YWJsZSgpLm5vZGUoKSkudHJpZ2dlckhhbmRsZXIoImJ1dHRvbnMtYWN0aW9uLmR0IixbRS5idXR0b24oJCksRSwkLHddKX0seT1mdW5jdGlvbihRLEUsJCx3KXt3LmFzeW5jPyhzLnByb2Nlc3NpbmcoJFswXSwhMCksc2V0VGltZW91dChmdW5jdGlvbigpe0MoUSxFLCQsdyxmdW5jdGlvbigpe3MucHJvY2Vzc2luZygkWzBdLCExKX0pfSx3LmFzeW5jKSk6QyhRLEUsJCx3LGZ1bmN0aW9uKCl7fSl9LFQ9dC50YWd8fGIudGFnLFA9dC5jbGlja0JsdXJzPT09dm9pZCAwPyEwOnQuY2xpY2tCbHVycztpZihtPWh0KCI8IitUKyIvPiIpLmFkZENsYXNzKGIuY2xhc3NOYW1lKS5hdHRyKCJ0YWJpbmRleCIsdGhpcy5zLmR0LnNldHRpbmdzKClbMF0uaVRhYkluZGV4KS5hdHRyKCJhcmlhLWNvbnRyb2xzIix0aGlzLnMuZHQudGFibGUoKS5ub2RlKCkuaWQpLm9uKCJjbGljay5kdGIiLGZ1bmN0aW9uKFEpe1EucHJldmVudERlZmF1bHQoKSwhbS5oYXNDbGFzcyhiLmRpc2FibGVkKSYmdC5hY3Rpb24mJnkoUSx1LG0sdCksUCYmbS50cmlnZ2VyKCJibHVyIil9KS5vbigia2V5cHJlc3MuZHRiIixmdW5jdGlvbihRKXtRLmtleUNvZGU9PT0xMyYmKFEucHJldmVudERlZmF1bHQoKSwhbS5oYXNDbGFzcyhiLmRpc2FibGVkKSYmdC5hY3Rpb24mJnkoUSx1LG0sdCkpfSksVC50b0xvd2VyQ2FzZSgpPT09ImEiJiZtLmF0dHIoImhyZWYiLCIjIiksVC50b0xvd2VyQ2FzZSgpPT09ImJ1dHRvbiImJm0uYXR0cigidHlwZSIsImJ1dHRvbiIpLGIubGluZXIudGFnKXt2YXIgYz1odCgiPCIrYi5saW5lci50YWcrIi8+IikuaHRtbChwKHQudGV4dCkpLmFkZENsYXNzKGIubGluZXIuY2xhc3NOYW1lKTtiLmxpbmVyLnRhZy50b0xvd2VyQ2FzZSgpPT09ImEiJiZjLmF0dHIoImhyZWYiLCIjIiksbS5hcHBlbmQoYyksbz1jfWVsc2UgbS5odG1sKHAodC50ZXh0KSksbz1tO3QuZW5hYmxlZD09PSExJiZtLmFkZENsYXNzKGIuZGlzYWJsZWQpLHQuY2xhc3NOYW1lJiZtLmFkZENsYXNzKHQuY2xhc3NOYW1lKSx0LnRpdGxlQXR0ciYmbS5hdHRyKCJ0aXRsZSIscCh0LnRpdGxlQXR0cikpLHQuYXR0ciYmbS5hdHRyKHQuYXR0ciksdC5uYW1lc3BhY2V8fCh0Lm5hbWVzcGFjZT0iLmR0LWJ1dHRvbi0iK0dsKyspLHQuY29uZmlnIT09dm9pZCAwJiZ0LmNvbmZpZy5zcGxpdCYmKHQuc3BsaXQ9dC5jb25maWcuc3BsaXQpfXZhciBsPXRoaXMuYy5kb20uYnV0dG9uQ29udGFpbmVyLGg7bCYmbC50YWc/aD1odCgiPCIrbC50YWcrIi8+IikuYWRkQ2xhc3MobC5jbGFzc05hbWUpLmFwcGVuZChtKTpoPW0sdGhpcy5fYWRkS2V5KHQpLHRoaXMuYy5idXR0b25DcmVhdGVkJiYoaD10aGlzLmMuYnV0dG9uQ3JlYXRlZCh0LGgpKTt2YXIgXztpZihuKXt2YXIgRj1lP2h0LmV4dGVuZCghMCx0aGlzLmMuZG9tLnNwbGl0LHRoaXMuYy5kb20uY29sbGVjdGlvbi5zcGxpdCk6dGhpcy5jLmRvbS5zcGxpdCxPPUYud3JhcHBlcjtfPWh0KCI8IitPLnRhZysiLz4iKS5hZGRDbGFzcyhPLmNsYXNzTmFtZSkuYXBwZW5kKG0pO3ZhciBmPWh0LmV4dGVuZCh0LHthbGlnbjpGLmRyb3Bkb3duLmFsaWduLGF0dHI6eyJhcmlhLWhhc3BvcHVwIjoiZGlhbG9nIiwiYXJpYS1leHBhbmRlZCI6ITF9LGNsYXNzTmFtZTpGLmRyb3Bkb3duLmNsYXNzTmFtZSxjbG9zZUJ1dHRvbjohMSxzcGxpdEFsaWduQ2xhc3M6Ri5kcm9wZG93bi5zcGxpdEFsaWduQ2xhc3MsdGV4dDpGLmRyb3Bkb3duLnRleHR9KTt0aGlzLl9hZGRLZXkoZik7dmFyIFU9ZnVuY3Rpb24oUSxFLCQsdyl7U2Uuc3BsaXQuYWN0aW9uLmNhbGwoRS5idXR0b24oXyksUSxFLCQsdyksaHQoRS50YWJsZSgpLm5vZGUoKSkudHJpZ2dlckhhbmRsZXIoImJ1dHRvbnMtYWN0aW9uLmR0IixbRS5idXR0b24oJCksRSwkLHddKSwkLmF0dHIoImFyaWEtZXhwYW5kZWQiLCEwKX0sWD1odCgnPGJ1dHRvbiBjbGFzcz0iJytGLmRyb3Bkb3duLmNsYXNzTmFtZSsnIGR0LWJ1dHRvbiI+PC9idXR0b24+JykuaHRtbChGLmRyb3Bkb3duLmRyb3BIdG1sKS5vbigiY2xpY2suZHRiIixmdW5jdGlvbihRKXtRLnByZXZlbnREZWZhdWx0KCksUS5zdG9wUHJvcGFnYXRpb24oKSxYLmhhc0NsYXNzKGIuZGlzYWJsZWQpfHxVKFEsdSxYLGYpLFAmJlgudHJpZ2dlcigiYmx1ciIpfSkub24oImtleXByZXNzLmR0YiIsZnVuY3Rpb24oUSl7US5rZXlDb2RlPT09MTMmJihRLnByZXZlbnREZWZhdWx0KCksWC5oYXNDbGFzcyhiLmRpc2FibGVkKXx8VShRLHUsWCxmKSl9KTt0LnNwbGl0Lmxlbmd0aD09PTAmJlguYWRkQ2xhc3MoImR0Yi1oaWRlLWRyb3AiKSxfLmFwcGVuZChYKS5hdHRyKGYuYXR0cil9cmV0dXJue2NvbmY6dCxub2RlOm4/Xy5nZXQoMCk6bS5nZXQoMCksaW5zZXJ0ZXI6bj9fOmgsYnV0dG9uczpbXSxpbkNvbGxlY3Rpb246ZSxpc1NwbGl0Om4saW5TcGxpdDpyLGNvbGxlY3Rpb246bnVsbCx0ZXh0Tm9kZTpvfX0sX25vZGVUb0J1dHRvbjpmdW5jdGlvbih0LGUpe2V8fChlPXRoaXMucy5idXR0b25zKTtmb3IodmFyIG49MCxyPWUubGVuZ3RoO248cjtuKyspe2lmKGVbbl0ubm9kZT09PXQpcmV0dXJuIGVbbl07aWYoZVtuXS5idXR0b25zLmxlbmd0aCl7dmFyIHM9dGhpcy5fbm9kZVRvQnV0dG9uKHQsZVtuXS5idXR0b25zKTtpZihzKXJldHVybiBzfX19LF9ub2RlVG9Ib3N0OmZ1bmN0aW9uKHQsZSl7ZXx8KGU9dGhpcy5zLmJ1dHRvbnMpO2Zvcih2YXIgbj0wLHI9ZS5sZW5ndGg7bjxyO24rKyl7aWYoZVtuXS5ub2RlPT09dClyZXR1cm4gZTtpZihlW25dLmJ1dHRvbnMubGVuZ3RoKXt2YXIgcz10aGlzLl9ub2RlVG9Ib3N0KHQsZVtuXS5idXR0b25zKTtpZihzKXJldHVybiBzfX19LF9rZXlwcmVzczpmdW5jdGlvbih0LGUpe2lmKCFlLl9idXR0b25zSGFuZGxlZCl7dmFyIG49ZnVuY3Rpb24ocyxpKXtpZihzLmtleSl7aWYocy5rZXk9PT10KWUuX2J1dHRvbnNIYW5kbGVkPSEwLGh0KGkpLmNsaWNrKCk7ZWxzZSBpZihodC5pc1BsYWluT2JqZWN0KHMua2V5KSl7aWYocy5rZXkua2V5IT09dHx8cy5rZXkuc2hpZnRLZXkmJiFlLnNoaWZ0S2V5fHxzLmtleS5hbHRLZXkmJiFlLmFsdEtleXx8cy5rZXkuY3RybEtleSYmIWUuY3RybEtleXx8cy5rZXkubWV0YUtleSYmIWUubWV0YUtleSlyZXR1cm47ZS5fYnV0dG9uc0hhbmRsZWQ9ITAsaHQoaSkuY2xpY2soKX19fSxyPWZ1bmN0aW9uKHMpe2Zvcih2YXIgaT0wLG89cy5sZW5ndGg7aTxvO2krKyluKHNbaV0uY29uZixzW2ldLm5vZGUpLHNbaV0uYnV0dG9ucy5sZW5ndGgmJnIoc1tpXS5idXR0b25zKX07cih0aGlzLnMuYnV0dG9ucyl9fSxfcmVtb3ZlS2V5OmZ1bmN0aW9uKHQpe2lmKHQua2V5KXt2YXIgZT1odC5pc1BsYWluT2JqZWN0KHQua2V5KT90LmtleS5rZXk6dC5rZXksbj10aGlzLnMubGlzdGVuS2V5cy5zcGxpdCgiIikscj1odC5pbkFycmF5KGUsbik7bi5zcGxpY2UociwxKSx0aGlzLnMubGlzdGVuS2V5cz1uLmpvaW4oIiIpfX0sX3Jlc29sdmVFeHRlbmRzOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj10aGlzLnMuZHQscixzLGk9ZnVuY3Rpb24oZyl7Zm9yKHZhciBtPTA7IWh0LmlzUGxhaW5PYmplY3QoZykmJiFBcnJheS5pc0FycmF5KGcpOyl7aWYoZz09PXZvaWQgMClyZXR1cm47aWYodHlwZW9mIGc9PSJmdW5jdGlvbiIpe2lmKGc9Zy5jYWxsKGUsbix0KSwhZylyZXR1cm4hMX1lbHNlIGlmKHR5cGVvZiBnPT0ic3RyaW5nIil7aWYoIVNlW2ddKXJldHVybntodG1sOmd9O2c9U2VbZ119aWYobSsrLG0+MzApdGhyb3ciQnV0dG9uczogVG9vIG1hbnkgaXRlcmF0aW9ucyJ9cmV0dXJuIEFycmF5LmlzQXJyYXkoZyk/ZzpodC5leHRlbmQoe30sZyl9O2Zvcih0PWkodCk7dCYmdC5leHRlbmQ7KXtpZighU2VbdC5leHRlbmRdKXRocm93IkNhbm5vdCBleHRlbmQgdW5rbm93biBidXR0b24gdHlwZTogIit0LmV4dGVuZDt2YXIgbz1pKFNlW3QuZXh0ZW5kXSk7aWYoQXJyYXkuaXNBcnJheShvKSlyZXR1cm4gbztpZighbylyZXR1cm4hMTt2YXIgdT1vLmNsYXNzTmFtZTt0LmNvbmZpZyE9PXZvaWQgMCYmby5jb25maWchPT12b2lkIDAmJih0LmNvbmZpZz1odC5leHRlbmQoe30sby5jb25maWcsdC5jb25maWcpKSx0PWh0LmV4dGVuZCh7fSxvLHQpLHUmJnQuY2xhc3NOYW1lIT09dSYmKHQuY2xhc3NOYW1lPXUrIiAiK3QuY2xhc3NOYW1lKSx0LmV4dGVuZD1vLmV4dGVuZH12YXIgcD10LnBvc3RmaXhCdXR0b25zO2lmKHApZm9yKHQuYnV0dG9uc3x8KHQuYnV0dG9ucz1bXSkscj0wLHM9cC5sZW5ndGg7cjxzO3IrKyl0LmJ1dHRvbnMucHVzaChwW3JdKTt2YXIgYj10LnByZWZpeEJ1dHRvbnM7aWYoYilmb3IodC5idXR0b25zfHwodC5idXR0b25zPVtdKSxyPTAscz1iLmxlbmd0aDtyPHM7cisrKXQuYnV0dG9ucy5zcGxpY2UociwwLGJbcl0pO3JldHVybiB0fSxfcG9wb3ZlcjpmdW5jdGlvbih0LGUsbil7dmFyIHI9ZSxzPXRoaXMuYyxpPSExLG89aHQuZXh0ZW5kKHthbGlnbjoiYnV0dG9uLWxlZnQiLGF1dG9DbG9zZTohMSxiYWNrZ3JvdW5kOiEwLGJhY2tncm91bmRDbGFzc05hbWU6ImR0LWJ1dHRvbi1iYWNrZ3JvdW5kIixjbG9zZUJ1dHRvbjohMCxjb250YWluZXJDbGFzc05hbWU6cy5kb20uY29sbGVjdGlvbi5jb250YWluZXIuY2xhc3NOYW1lLGNvbnRlbnRDbGFzc05hbWU6cy5kb20uY29sbGVjdGlvbi5jb250YWluZXIuY29udGVudC5jbGFzc05hbWUsY29sbGVjdGlvbkxheW91dDoiIixjb2xsZWN0aW9uVGl0bGU6IiIsZHJvcHVwOiExLGZhZGU6NDAwLHBvcG92ZXJUaXRsZToiIixyaWdodEFsaWduQ2xhc3NOYW1lOiJkdC1idXR0b24tcmlnaHQiLHRhZzpzLmRvbS5jb2xsZWN0aW9uLmNvbnRhaW5lci50YWd9LG4pLHU9by50YWcrIi4iK28uY29udGFpbmVyQ2xhc3NOYW1lLnJlcGxhY2UoLyAvZywiLiIpLHA9ZS5ub2RlKCksYj1mdW5jdGlvbigpe2k9ITAsWWkoaHQodSksby5mYWRlLGZ1bmN0aW9uKCl7aHQodGhpcykuZGV0YWNoKCl9KSxodChyLmJ1dHRvbnMoJ1thcmlhLWhhc3BvcHVwPSJkaWFsb2ciXVthcmlhLWV4cGFuZGVkPSJ0cnVlIl0nKS5ub2RlcygpKS5hdHRyKCJhcmlhLWV4cGFuZGVkIiwiZmFsc2UiKSxodCgiZGl2LmR0LWJ1dHRvbi1iYWNrZ3JvdW5kIikub2ZmKCJjbGljay5kdGItY29sbGVjdGlvbiIpLHRlLmJhY2tncm91bmQoITEsby5iYWNrZ3JvdW5kQ2xhc3NOYW1lLG8uZmFkZSxwKSxodCh3aW5kb3cpLm9mZigicmVzaXplLnJlc2l6ZS5kdGItY29sbGVjdGlvbiIpLGh0KCJib2R5Iikub2ZmKCIuZHRiLWNvbGxlY3Rpb24iKSxyLm9mZigiYnV0dG9ucy1hY3Rpb24uYi1pbnRlcm5hbCIpLHIub2ZmKCJkZXN0cm95Iil9O2lmKHQ9PT0hMSl7YigpO3JldHVybn12YXIgZz1odChyLmJ1dHRvbnMoJ1thcmlhLWhhc3BvcHVwPSJkaWFsb2ciXVthcmlhLWV4cGFuZGVkPSJ0cnVlIl0nKS5ub2RlcygpKTtnLmxlbmd0aCYmKHAuY2xvc2VzdCh1KS5sZW5ndGgmJihwPWcuZXEoMCkpLGIoKSk7dmFyIG09aHQoIi5kdC1idXR0b24iLHQpLmxlbmd0aCxDPSIiO209PT0zP0M9ImR0Yi1iMyI6bT09PTI/Qz0iZHRiLWIyIjptPT09MSYmKEM9ImR0Yi1iMSIpO3ZhciB5PWh0KCI8IitvLnRhZysiLz4iKS5hZGRDbGFzcyhvLmNvbnRhaW5lckNsYXNzTmFtZSkuYWRkQ2xhc3Moby5jb2xsZWN0aW9uTGF5b3V0KS5hZGRDbGFzcyhvLnNwbGl0QWxpZ25DbGFzcykuYWRkQ2xhc3MoQykuY3NzKCJkaXNwbGF5Iiwibm9uZSIpLmF0dHIoeyJhcmlhLW1vZGFsIjohMCxyb2xlOiJkaWFsb2cifSk7dD1odCh0KS5hZGRDbGFzcyhvLmNvbnRlbnRDbGFzc05hbWUpLmF0dHIoInJvbGUiLCJtZW51IikuYXBwZW5kVG8oeSkscC5hdHRyKCJhcmlhLWV4cGFuZGVkIiwidHJ1ZSIpLHAucGFyZW50cygiYm9keSIpWzBdIT09ZG9jdW1lbnQuYm9keSYmKHA9ZG9jdW1lbnQuYm9keS5sYXN0Q2hpbGQpLG8ucG9wb3ZlclRpdGxlP3kucHJlcGVuZCgnPGRpdiBjbGFzcz0iZHQtYnV0dG9uLWNvbGxlY3Rpb24tdGl0bGUiPicrby5wb3BvdmVyVGl0bGUrIjwvZGl2PiIpOm8uY29sbGVjdGlvblRpdGxlJiZ5LnByZXBlbmQoJzxkaXYgY2xhc3M9ImR0LWJ1dHRvbi1jb2xsZWN0aW9uLXRpdGxlIj4nK28uY29sbGVjdGlvblRpdGxlKyI8L2Rpdj4iKSxvLmNsb3NlQnV0dG9uJiZ5LnByZXBlbmQoJzxkaXYgY2xhc3M9ImR0Yi1wb3BvdmVyLWNsb3NlIj4mdGltZXM7PC9kaXY+JykuYWRkQ2xhc3MoImR0Yi1jb2xsZWN0aW9uLWNsb3NlYWJsZSIpLFhpKHkuaW5zZXJ0QWZ0ZXIocCksby5mYWRlKTt2YXIgVD1odChlLnRhYmxlKCkuY29udGFpbmVyKCkpLFA9eS5jc3MoInBvc2l0aW9uIik7aWYoKG8uc3Bhbj09PSJjb250YWluZXIifHxvLmFsaWduPT09ImR0LWNvbnRhaW5lciIpJiYocD1wLnBhcmVudCgpLHkuY3NzKCJ3aWR0aCIsVC53aWR0aCgpKSksUD09PSJhYnNvbHV0ZSIpe3ZhciBjPWh0KHBbMF0ub2Zmc2V0UGFyZW50KSxsPXAucG9zaXRpb24oKSxoPXAub2Zmc2V0KCksXz1jLm9mZnNldCgpLEY9Yy5wb3NpdGlvbigpLE89d2luZG93LmdldENvbXB1dGVkU3R5bGUoY1swXSk7Xy5oZWlnaHQ9Yy5vdXRlckhlaWdodCgpLF8ud2lkdGg9Yy53aWR0aCgpK3BhcnNlRmxvYXQoTy5wYWRkaW5nTGVmdCksXy5yaWdodD1fLmxlZnQrXy53aWR0aCxfLmJvdHRvbT1fLnRvcCtfLmhlaWdodDt2YXIgZj1sLnRvcCtwLm91dGVySGVpZ2h0KCksVT1sLmxlZnQ7eS5jc3Moe3RvcDpmLGxlZnQ6VX0pLE89d2luZG93LmdldENvbXB1dGVkU3R5bGUoeVswXSk7dmFyIFg9eS5vZmZzZXQoKTtYLmhlaWdodD15Lm91dGVySGVpZ2h0KCksWC53aWR0aD15Lm91dGVyV2lkdGgoKSxYLnJpZ2h0PVgubGVmdCtYLndpZHRoLFguYm90dG9tPVgudG9wK1guaGVpZ2h0LFgubWFyZ2luVG9wPXBhcnNlRmxvYXQoTy5tYXJnaW5Ub3ApLFgubWFyZ2luQm90dG9tPXBhcnNlRmxvYXQoTy5tYXJnaW5Cb3R0b20pLG8uZHJvcHVwJiYoZj1sLnRvcC1YLmhlaWdodC1YLm1hcmdpblRvcC1YLm1hcmdpbkJvdHRvbSksKG8uYWxpZ249PT0iYnV0dG9uLXJpZ2h0Inx8eS5oYXNDbGFzcyhvLnJpZ2h0QWxpZ25DbGFzc05hbWUpKSYmKFU9bC5sZWZ0LVgud2lkdGgrcC5vdXRlcldpZHRoKCkpLChvLmFsaWduPT09ImR0LWNvbnRhaW5lciJ8fG8uYWxpZ249PT0iY29udGFpbmVyIikmJlU8bC5sZWZ0JiYoVT0tbC5sZWZ0KSxGLmxlZnQrVStYLndpZHRoPmh0KHdpbmRvdykud2lkdGgoKSYmKFU9aHQod2luZG93KS53aWR0aCgpLVgud2lkdGgtRi5sZWZ0KSxoLmxlZnQrVTwwJiYoVT0taC5sZWZ0KSxGLnRvcCtmK1guaGVpZ2h0Pmh0KHdpbmRvdykuaGVpZ2h0KCkraHQod2luZG93KS5zY3JvbGxUb3AoKSYmKGY9bC50b3AtWC5oZWlnaHQtWC5tYXJnaW5Ub3AtWC5tYXJnaW5Cb3R0b20pLEYudG9wK2Y8aHQod2luZG93KS5zY3JvbGxUb3AoKSYmKGY9bC50b3ArcC5vdXRlckhlaWdodCgpKSx5LmNzcyh7dG9wOmYsbGVmdDpVfSl9ZWxzZXt2YXIgUT1mdW5jdGlvbigpe3ZhciBFPWh0KHdpbmRvdykuaGVpZ2h0KCkvMiwkPXkuaGVpZ2h0KCkvMjskPkUmJigkPUUpLHkuY3NzKCJtYXJnaW5Ub3AiLCQqLTEpfTtRKCksaHQod2luZG93KS5vbigicmVzaXplLmR0Yi1jb2xsZWN0aW9uIixmdW5jdGlvbigpe1EoKX0pfW8uYmFja2dyb3VuZCYmdGUuYmFja2dyb3VuZCghMCxvLmJhY2tncm91bmRDbGFzc05hbWUsby5mYWRlLG8uYmFja2dyb3VuZEhvc3R8fHApLGh0KCJkaXYuZHQtYnV0dG9uLWJhY2tncm91bmQiKS5vbigiY2xpY2suZHRiLWNvbGxlY3Rpb24iLGZ1bmN0aW9uKCl7fSksby5hdXRvQ2xvc2UmJnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyLm9uKCJidXR0b25zLWFjdGlvbi5iLWludGVybmFsIixmdW5jdGlvbihFLCQsdyxrKXtrWzBdIT09cFswXSYmYigpfSl9LDApLGh0KHkpLnRyaWdnZXIoImJ1dHRvbnMtcG9wb3Zlci5kdCIpLHIub24oImRlc3Ryb3kiLGIpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtpPSExLGh0KCJib2R5Iikub24oImNsaWNrLmR0Yi1jb2xsZWN0aW9uIixmdW5jdGlvbihFKXtpZighaSl7dmFyICQ9aHQuZm4uYWRkQmFjaz8iYWRkQmFjayI6ImFuZFNlbGYiLHc9aHQoRS50YXJnZXQpLnBhcmVudCgpWzBdOyghaHQoRS50YXJnZXQpLnBhcmVudHMoKVskXSgpLmZpbHRlcih0KS5sZW5ndGgmJiFodCh3KS5oYXNDbGFzcygiZHQtYnV0dG9ucyIpfHxodChFLnRhcmdldCkuaGFzQ2xhc3MoImR0LWJ1dHRvbi1iYWNrZ3JvdW5kIikpJiZiKCl9fSkub24oImtleXVwLmR0Yi1jb2xsZWN0aW9uIixmdW5jdGlvbihFKXtFLmtleUNvZGU9PT0yNyYmYigpfSkub24oImtleWRvd24uZHRiLWNvbGxlY3Rpb24iLGZ1bmN0aW9uKEUpe3ZhciAkPWh0KCJhLCBidXR0b24iLHQpLHc9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtFLmtleUNvZGU9PT05JiYoJC5pbmRleCh3KT09PS0xPygkLmZpcnN0KCkuZm9jdXMoKSxFLnByZXZlbnREZWZhdWx0KCkpOkUuc2hpZnRLZXk/dz09PSRbMF0mJigkLmxhc3QoKS5mb2N1cygpLEUucHJldmVudERlZmF1bHQoKSk6dz09PSQubGFzdCgpWzBdJiYoJC5maXJzdCgpLmZvY3VzKCksRS5wcmV2ZW50RGVmYXVsdCgpKSl9KX0sMCl9fSk7dGUuYmFja2dyb3VuZD1mdW5jdGlvbih0LGUsbixyKXtuPT09dm9pZCAwJiYobj00MDApLHJ8fChyPWRvY3VtZW50LmJvZHkpLHQ/WGkoaHQoIjxkaXYvPiIpLmFkZENsYXNzKGUpLmNzcygiZGlzcGxheSIsIm5vbmUiKS5pbnNlcnRBZnRlcihyKSxuKTpZaShodCgiZGl2LiIrZSksbixmdW5jdGlvbigpe2h0KHRoaXMpLnJlbW92ZUNsYXNzKGUpLnJlbW92ZSgpfSl9O3RlLmluc3RhbmNlU2VsZWN0b3I9ZnVuY3Rpb24odCxlKXtpZih0PT1udWxsKXJldHVybiBodC5tYXAoZSxmdW5jdGlvbihpKXtyZXR1cm4gaS5pbnN0fSk7dmFyIG49W10scj1odC5tYXAoZSxmdW5jdGlvbihpKXtyZXR1cm4gaS5uYW1lfSkscz1mdW5jdGlvbihpKXtpZihBcnJheS5pc0FycmF5KGkpKXtmb3IodmFyIG89MCx1PWkubGVuZ3RoO288dTtvKyspcyhpW29dKTtyZXR1cm59aWYodHlwZW9mIGk9PSJzdHJpbmciKWlmKGkuaW5kZXhPZigiLCIpIT09LTEpcyhpLnNwbGl0KCIsIikpO2Vsc2V7dmFyIHA9aHQuaW5BcnJheShpLnRyaW0oKSxyKTtwIT09LTEmJm4ucHVzaChlW3BdLmluc3QpfWVsc2UgaWYodHlwZW9mIGk9PSJudW1iZXIiKW4ucHVzaChlW2ldLmluc3QpO2Vsc2UgaWYodHlwZW9mIGk9PSJvYmplY3QiJiZpLm5vZGVOYW1lKWZvcih2YXIgYj0wO2I8ZS5sZW5ndGg7YisrKWVbYl0uaW5zdC5kb20uY29udGFpbmVyWzBdPT09aSYmbi5wdXNoKGVbYl0uaW5zdCk7ZWxzZSB0eXBlb2YgaT09Im9iamVjdCImJm4ucHVzaChpKX07cmV0dXJuIHModCksbn07dGUuYnV0dG9uU2VsZWN0b3I9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49W10scj1mdW5jdGlvbihwLGIsZyl7Zm9yKHZhciBtLEMseT0wLFQ9Yi5sZW5ndGg7eTxUO3krKyltPWJbeV0sbSYmKEM9ZyE9PXZvaWQgMD9nK3k6eSsiIixwLnB1c2goe25vZGU6bS5ub2RlLG5hbWU6bS5jb25mLm5hbWUsaWR4OkN9KSxtLmJ1dHRvbnMmJnIocCxtLmJ1dHRvbnMsQysiLSIpKX0scz1mdW5jdGlvbihwLGIpe3ZhciBnLG0sQz1bXTtyKEMsYi5zLmJ1dHRvbnMpO3ZhciB5PWh0Lm1hcChDLGZ1bmN0aW9uKGgpe3JldHVybiBoLm5vZGV9KTtpZihBcnJheS5pc0FycmF5KHApfHxwIGluc3RhbmNlb2YgaHQpe2ZvcihnPTAsbT1wLmxlbmd0aDtnPG07ZysrKXMocFtnXSxiKTtyZXR1cm59aWYocD09bnVsbHx8cD09PSIqIilmb3IoZz0wLG09Qy5sZW5ndGg7ZzxtO2crKyluLnB1c2goe2luc3Q6Yixub2RlOkNbZ10ubm9kZX0pO2Vsc2UgaWYodHlwZW9mIHA9PSJudW1iZXIiKWIucy5idXR0b25zW3BdJiZuLnB1c2goe2luc3Q6Yixub2RlOmIucy5idXR0b25zW3BdLm5vZGV9KTtlbHNlIGlmKHR5cGVvZiBwPT0ic3RyaW5nIilpZihwLmluZGV4T2YoIiwiKSE9PS0xKXt2YXIgVD1wLnNwbGl0KCIsIik7Zm9yKGc9MCxtPVQubGVuZ3RoO2c8bTtnKyspcyhUW2ddLnRyaW0oKSxiKX1lbHNlIGlmKHAubWF0Y2goL15cZCsoXC1cZCspKiQvKSl7dmFyIFA9aHQubWFwKEMsZnVuY3Rpb24oaCl7cmV0dXJuIGguaWR4fSk7bi5wdXNoKHtpbnN0OmIsbm9kZTpDW2h0LmluQXJyYXkocCxQKV0ubm9kZX0pfWVsc2UgaWYocC5pbmRleE9mKCI6bmFtZSIpIT09LTEpe3ZhciBjPXAucmVwbGFjZSgiOm5hbWUiLCIiKTtmb3IoZz0wLG09Qy5sZW5ndGg7ZzxtO2crKylDW2ddLm5hbWU9PT1jJiZuLnB1c2goe2luc3Q6Yixub2RlOkNbZ10ubm9kZX0pfWVsc2UgaHQoeSkuZmlsdGVyKHApLmVhY2goZnVuY3Rpb24oKXtuLnB1c2goe2luc3Q6Yixub2RlOnRoaXN9KX0pO2Vsc2UgaWYodHlwZW9mIHA9PSJvYmplY3QiJiZwLm5vZGVOYW1lKXt2YXIgbD1odC5pbkFycmF5KHAseSk7bCE9PS0xJiZuLnB1c2goe2luc3Q6Yixub2RlOnlbbF19KX19LGk9MCxvPXQubGVuZ3RoO2k8bztpKyspe3ZhciB1PXRbaV07cyhlLHUpfXJldHVybiBufTt0ZS5zdHJpcERhdGE9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdHlwZW9mIHQhPSJzdHJpbmcifHwodD10ZS5zdHJpcEh0bWxTY3JpcHQodCksdD10ZS5zdHJpcEh0bWxDb21tZW50cyh0KSwoIWV8fGUuc3RyaXBIdG1sKSYmKHQ9YXQudXRpbC5zdHJpcEh0bWwodCkpLCghZXx8ZS50cmltKSYmKHQ9dC50cmltKCkpLCghZXx8ZS5zdHJpcE5ld2xpbmVzKSYmKHQ9dC5yZXBsYWNlKC9cbi9nLCIgIikpLCghZXx8ZS5kZWNvZGVFbnRpdGllcykmJihxaT90PXFpKHQpOihBcy5pbm5lckhUTUw9dCx0PUFzLnZhbHVlKSkpLHR9O3RlLmVudGl0eURlY29kZXI9ZnVuY3Rpb24odCl7cWk9dH07dGUuc3RyaXBIdG1sQ29tbWVudHM9ZnVuY3Rpb24odCl7dmFyIGU7ZG8gZT10LHQ9dC5yZXBsYWNlKC8oPCEtLS4qPy0tIT8+KXwoPCEtLVtcU1xzXSs/LS0hPz4pfCg8IS0tW1xTXHNdKj8kKS9nLCIiKTt3aGlsZSh0IT09ZSk7cmV0dXJuIHR9O3RlLnN0cmlwSHRtbFNjcmlwdD1mdW5jdGlvbih0KXt2YXIgZTtkbyBlPXQsdD10LnJlcGxhY2UoLzxzY3JpcHRcYltePF0qKD86KD8hPFwvc2NyaXB0W14+XSo+KTxbXjxdKikqPFwvc2NyaXB0W14+XSo+L2dpLCIiKTt3aGlsZSh0IT09ZSk7cmV0dXJuIHR9O3RlLmRlZmF1bHRzPXtidXR0b25zOlsiY29weSIsImV4Y2VsIiwiY3N2IiwicGRmIiwicHJpbnQiXSxuYW1lOiJtYWluIix0YWJJbmRleDowLGRvbTp7Y29udGFpbmVyOnt0YWc6ImRpdiIsY2xhc3NOYW1lOiJkdC1idXR0b25zIn0sY29sbGVjdGlvbjp7YWN0aW9uOntkcm9wSHRtbDonPHNwYW4gY2xhc3M9ImR0LWJ1dHRvbi1kb3duLWFycm93Ij4mI3gyNUJDOzwvc3Bhbj4nfSxjb250YWluZXI6e2NsYXNzTmFtZToiZHQtYnV0dG9uLWNvbGxlY3Rpb24iLGNvbnRlbnQ6e2NsYXNzTmFtZToiIix0YWc6ImRpdiJ9LHRhZzoiZGl2In19LGJ1dHRvbjp7dGFnOiJidXR0b24iLGNsYXNzTmFtZToiZHQtYnV0dG9uIixhY3RpdmU6ImR0LWJ1dHRvbi1hY3RpdmUiLGRpc2FibGVkOiJkaXNhYmxlZCIsc3BhY2VyOntjbGFzc05hbWU6ImR0LWJ1dHRvbi1zcGFjZXIiLHRhZzoic3BhbiJ9LGxpbmVyOnt0YWc6InNwYW4iLGNsYXNzTmFtZToiIn19LHNwbGl0OnthY3Rpb246e2NsYXNzTmFtZToiZHQtYnV0dG9uLXNwbGl0LWRyb3AtYnV0dG9uIGR0LWJ1dHRvbiIsdGFnOiJidXR0b24ifSxkcm9wZG93bjp7YWxpZ246InNwbGl0LXJpZ2h0IixjbGFzc05hbWU6ImR0LWJ1dHRvbi1zcGxpdC1kcm9wIixkcm9wSHRtbDonPHNwYW4gY2xhc3M9ImR0LWJ1dHRvbi1kb3duLWFycm93Ij4mI3gyNUJDOzwvc3Bhbj4nLHNwbGl0QWxpZ25DbGFzczoiZHQtYnV0dG9uLXNwbGl0LWxlZnQiLHRhZzoiYnV0dG9uIn0sd3JhcHBlcjp7Y2xhc3NOYW1lOiJkdC1idXR0b24tc3BsaXQiLHRhZzoiZGl2In19fX07dGUudmVyc2lvbj0iMy4xLjIiO2h0LmV4dGVuZChTZSx7Y29sbGVjdGlvbjp7dGV4dDpmdW5jdGlvbih0KXtyZXR1cm4gdC5pMThuKCJidXR0b25zLmNvbGxlY3Rpb24iLCJDb2xsZWN0aW9uIil9LGNsYXNzTmFtZToiYnV0dG9ucy1jb2xsZWN0aW9uIixjbG9zZUJ1dHRvbjohMSxpbml0OmZ1bmN0aW9uKHQsZSl7ZS5hdHRyKCJhcmlhLWV4cGFuZGVkIiwhMSl9LGFjdGlvbjpmdW5jdGlvbih0LGUsbixyKXtyLl9jb2xsZWN0aW9uLnBhcmVudHMoImJvZHkiKS5sZW5ndGg/dGhpcy5wb3BvdmVyKCExLHIpOnRoaXMucG9wb3ZlcihyLl9jb2xsZWN0aW9uLHIpLHQudHlwZT09PSJrZXlwcmVzcyImJmh0KCJhLCBidXR0b24iLHIuX2NvbGxlY3Rpb24pLmVxKDApLmZvY3VzKCl9LGF0dHI6eyJhcmlhLWhhc3BvcHVwIjoiZGlhbG9nIn19LHNwbGl0Ont0ZXh0OmZ1bmN0aW9uKHQpe3JldHVybiB0LmkxOG4oImJ1dHRvbnMuc3BsaXQiLCJTcGxpdCIpfSxjbGFzc05hbWU6ImJ1dHRvbnMtc3BsaXQiLGNsb3NlQnV0dG9uOiExLGluaXQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5hdHRyKCJhcmlhLWV4cGFuZGVkIiwhMSl9LGFjdGlvbjpmdW5jdGlvbih0LGUsbixyKXt0aGlzLnBvcG92ZXIoci5fY29sbGVjdGlvbixyKX0sYXR0cjp7ImFyaWEtaGFzcG9wdXAiOiJkaWFsb2cifX0sY29weTpmdW5jdGlvbigpe2lmKFNlLmNvcHlIdG1sNSlyZXR1cm4iY29weUh0bWw1In0sY3N2OmZ1bmN0aW9uKHQsZSl7aWYoU2UuY3N2SHRtbDUmJlNlLmNzdkh0bWw1LmF2YWlsYWJsZSh0LGUpKXJldHVybiJjc3ZIdG1sNSJ9LGV4Y2VsOmZ1bmN0aW9uKHQsZSl7aWYoU2UuZXhjZWxIdG1sNSYmU2UuZXhjZWxIdG1sNS5hdmFpbGFibGUodCxlKSlyZXR1cm4iZXhjZWxIdG1sNSJ9LHBkZjpmdW5jdGlvbih0LGUpe2lmKFNlLnBkZkh0bWw1JiZTZS5wZGZIdG1sNS5hdmFpbGFibGUodCxlKSlyZXR1cm4icGRmSHRtbDUifSxwYWdlTGVuZ3RoOmZ1bmN0aW9uKHQpe3ZhciBlPXQuc2V0dGluZ3MoKVswXS5hTGVuZ3RoTWVudSxuPVtdLHI9W10scz1mdW5jdGlvbih1KXtyZXR1cm4gdS5pMThuKCJidXR0b25zLnBhZ2VMZW5ndGgiLHsiLTEiOiJTaG93IGFsbCByb3dzIixfOiJTaG93ICVkIHJvd3MifSx1LnBhZ2UubGVuKCkpfTtpZihBcnJheS5pc0FycmF5KGVbMF0pKW49ZVswXSxyPWVbMV07ZWxzZSBmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIG89ZVtpXTtodC5pc1BsYWluT2JqZWN0KG8pPyhuLnB1c2goby52YWx1ZSksci5wdXNoKG8ubGFiZWwpKToobi5wdXNoKG8pLHIucHVzaChvKSl9cmV0dXJue2V4dGVuZDoiY29sbGVjdGlvbiIsdGV4dDpzLGNsYXNzTmFtZToiYnV0dG9ucy1wYWdlLWxlbmd0aCIsYXV0b0Nsb3NlOiEwLGJ1dHRvbnM6aHQubWFwKG4sZnVuY3Rpb24odSxwKXtyZXR1cm57dGV4dDpyW3BdLGNsYXNzTmFtZToiYnV0dG9uLXBhZ2UtbGVuZ3RoIixhY3Rpb246ZnVuY3Rpb24oYixnKXtnLnBhZ2UubGVuKHUpLmRyYXcoKX0saW5pdDpmdW5jdGlvbihiLGcsbSl7dmFyIEM9dGhpcyx5PWZ1bmN0aW9uKCl7Qy5hY3RpdmUoYi5wYWdlLmxlbigpPT09dSl9O2Iub24oImxlbmd0aC5kdCIrbS5uYW1lc3BhY2UseSkseSgpfSxkZXN0cm95OmZ1bmN0aW9uKGIsZyxtKXtiLm9mZigibGVuZ3RoLmR0IittLm5hbWVzcGFjZSl9fX0pLGluaXQ6ZnVuY3Rpb24odSxwLGIpe3ZhciBnPXRoaXM7dS5vbigibGVuZ3RoLmR0IitiLm5hbWVzcGFjZSxmdW5jdGlvbigpe2cudGV4dChiLnRleHQpfSl9LGRlc3Ryb3k6ZnVuY3Rpb24odSxwLGIpe3Uub2ZmKCJsZW5ndGguZHQiK2IubmFtZXNwYWNlKX19fSxzcGFjZXI6e3N0eWxlOiJlbXB0eSIsc3BhY2VyOiEwLHRleHQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQuaTE4bigiYnV0dG9ucy5zcGFjZXIiLCIiKX19fSk7YXQuQXBpLnJlZ2lzdGVyKCJidXR0b25zKCkiLGZ1bmN0aW9uKHQsZSl7ZT09PXZvaWQgMCYmKGU9dCx0PXZvaWQgMCksdGhpcy5zZWxlY3Rvci5idXR0b25Hcm91cD10O3ZhciBuPXRoaXMuaXRlcmF0b3IoITAsInRhYmxlIixmdW5jdGlvbihyKXtpZihyLl9idXR0b25zKXJldHVybiB0ZS5idXR0b25TZWxlY3Rvcih0ZS5pbnN0YW5jZVNlbGVjdG9yKHQsci5fYnV0dG9ucyksZSl9LCEwKTtyZXR1cm4gbi5fZ3JvdXBTZWxlY3Rvcj10LG59KTthdC5BcGkucmVnaXN0ZXIoImJ1dHRvbigpIixmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuYnV0dG9ucyh0LGUpO3JldHVybiBuLmxlbmd0aD4xJiZuLnNwbGljZSgxLG4ubGVuZ3RoKSxufSk7YXQuQXBpLnJlZ2lzdGVyUGx1cmFsKCJidXR0b25zKCkuYWN0aXZlKCkiLCJidXR0b24oKS5hY3RpdmUoKSIsZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT12b2lkIDA/dGhpcy5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaW5zdC5hY3RpdmUoZS5ub2RlKX0pOnRoaXMuZWFjaChmdW5jdGlvbihlKXtlLmluc3QuYWN0aXZlKGUubm9kZSx0KX0pfSk7YXQuQXBpLnJlZ2lzdGVyUGx1cmFsKCJidXR0b25zKCkuYWN0aW9uKCkiLCJidXR0b24oKS5hY3Rpb24oKSIsZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT12b2lkIDA/dGhpcy5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaW5zdC5hY3Rpb24oZS5ub2RlKX0pOnRoaXMuZWFjaChmdW5jdGlvbihlKXtlLmluc3QuYWN0aW9uKGUubm9kZSx0KX0pfSk7YXQuQXBpLnJlZ2lzdGVyUGx1cmFsKCJidXR0b25zKCkuY29sbGVjdGlvblJlYnVpbGQoKSIsImJ1dHRvbigpLmNvbGxlY3Rpb25SZWJ1aWxkKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oZSl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspdHlwZW9mIHRbbl09PSJvYmplY3QiJiYodFtuXS5wYXJlbnRDb25mPWUpO2UuaW5zdC5jb2xsZWN0aW9uUmVidWlsZChlLm5vZGUsdCl9KX0pO2F0LkFwaS5yZWdpc3RlcihbImJ1dHRvbnMoKS5lbmFibGUoKSIsImJ1dHRvbigpLmVuYWJsZSgpIl0sZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihlKXtlLmluc3QuZW5hYmxlKGUubm9kZSx0KX0pfSk7YXQuQXBpLnJlZ2lzdGVyKFsiYnV0dG9ucygpLmRpc2FibGUoKSIsImJ1dHRvbigpLmRpc2FibGUoKSJdLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbih0KXt0Lmluc3QuZGlzYWJsZSh0Lm5vZGUpfSl9KTthdC5BcGkucmVnaXN0ZXIoImJ1dHRvbigpLmluZGV4KCkiLGZ1bmN0aW9uKCl7dmFyIHQ9bnVsbDtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGUpe3ZhciBuPWUuaW5zdC5pbmRleChlLm5vZGUpO24hPT1udWxsJiYodD1uKX0pLHR9KTthdC5BcGkucmVnaXN0ZXJQbHVyYWwoImJ1dHRvbnMoKS5ub2RlcygpIiwiYnV0dG9uKCkubm9kZSgpIixmdW5jdGlvbigpe3ZhciB0PWh0KCk7cmV0dXJuIGh0KHRoaXMuZWFjaChmdW5jdGlvbihlKXt0PXQuYWRkKGUuaW5zdC5ub2RlKGUubm9kZSkpfSkpLHR9KTthdC5BcGkucmVnaXN0ZXJQbHVyYWwoImJ1dHRvbnMoKS5wcm9jZXNzaW5nKCkiLCJidXR0b24oKS5wcm9jZXNzaW5nKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0PT09dm9pZCAwP3RoaXMubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLmluc3QucHJvY2Vzc2luZyhlLm5vZGUpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKGUpe2UuaW5zdC5wcm9jZXNzaW5nKGUubm9kZSx0KX0pfSk7YXQuQXBpLnJlZ2lzdGVyUGx1cmFsKCJidXR0b25zKCkudGV4dCgpIiwiYnV0dG9uKCkudGV4dCgpIixmdW5jdGlvbih0KXtyZXR1cm4gdD09PXZvaWQgMD90aGlzLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS5pbnN0LnRleHQoZS5ub2RlKX0pOnRoaXMuZWFjaChmdW5jdGlvbihlKXtlLmluc3QudGV4dChlLm5vZGUsdCl9KX0pO2F0LkFwaS5yZWdpc3RlclBsdXJhbCgiYnV0dG9ucygpLnRyaWdnZXIoKSIsImJ1dHRvbigpLnRyaWdnZXIoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKHQpe3QuaW5zdC5ub2RlKHQubm9kZSkudHJpZ2dlcigiY2xpY2siKX0pfSk7YXQuQXBpLnJlZ2lzdGVyKCJidXR0b24oKS5wb3BvdmVyKCkiLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBuLmluc3QuX3BvcG92ZXIodCx0aGlzLmJ1dHRvbih0aGlzWzBdLm5vZGUpLGUpfSl9KTthdC5BcGkucmVnaXN0ZXIoImJ1dHRvbnMoKS5jb250YWluZXJzKCkiLGZ1bmN0aW9uKCl7dmFyIHQ9aHQoKSxlPXRoaXMuX2dyb3VwU2VsZWN0b3I7cmV0dXJuIHRoaXMuaXRlcmF0b3IoITAsInRhYmxlIixmdW5jdGlvbihuKXtpZihuLl9idXR0b25zKWZvcih2YXIgcj10ZS5pbnN0YW5jZVNlbGVjdG9yKGUsbi5fYnV0dG9ucykscz0wLGk9ci5sZW5ndGg7czxpO3MrKyl0PXQuYWRkKHJbc10uY29udGFpbmVyKCkpfSksdH0pO2F0LkFwaS5yZWdpc3RlcigiYnV0dG9ucygpLmNvbnRhaW5lcigpIixmdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnRhaW5lcnMoKS5lcSgwKX0pO2F0LkFwaS5yZWdpc3RlcigiYnV0dG9uKCkuYWRkKCkiLGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzLmNvbnRleHQ7aWYoci5sZW5ndGgpe3ZhciBzPXRlLmluc3RhbmNlU2VsZWN0b3IodGhpcy5fZ3JvdXBTZWxlY3RvcixyWzBdLl9idXR0b25zKTtzLmxlbmd0aCYmc1swXS5hZGQoZSx0LG4pfXJldHVybiB0aGlzLmJ1dHRvbih0aGlzLl9ncm91cFNlbGVjdG9yLHQpfSk7YXQuQXBpLnJlZ2lzdGVyKCJidXR0b25zKCkuZGVzdHJveSgpIixmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsdWNrKCJpbnN0IikudW5pcXVlKCkuZWFjaChmdW5jdGlvbih0KXt0LmRlc3Ryb3koKX0pLHRoaXN9KTthdC5BcGkucmVnaXN0ZXJQbHVyYWwoImJ1dHRvbnMoKS5yZW1vdmUoKSIsImJ1dHRvbnMoKS5yZW1vdmUoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKHQpe3QuaW5zdC5yZW1vdmUodC5ub2RlKX0pLHRoaXN9KTt2YXIgYXI7YXQuQXBpLnJlZ2lzdGVyKCJidXR0b25zLmluZm8oKSIsZnVuY3Rpb24odCxlLG4pe3ZhciByPXRoaXM7cmV0dXJuIHQ9PT0hMT8odGhpcy5vZmYoImRlc3Ryb3kuYnRuLWluZm8iKSxZaShodCgiI2RhdGF0YWJsZXNfYnV0dG9uc19pbmZvIiksNDAwLGZ1bmN0aW9uKCl7aHQodGhpcykucmVtb3ZlKCl9KSxjbGVhclRpbWVvdXQoYXIpLGFyPW51bGwsdGhpcyk6KGFyJiZjbGVhclRpbWVvdXQoYXIpLGh0KCIjZGF0YXRhYmxlc19idXR0b25zX2luZm8iKS5sZW5ndGgmJmh0KCIjZGF0YXRhYmxlc19idXR0b25zX2luZm8iKS5yZW1vdmUoKSx0PXQ/IjxoMj4iK3QrIjwvaDI+IjoiIixYaShodCgnPGRpdiBpZD0iZGF0YXRhYmxlc19idXR0b25zX2luZm8iIGNsYXNzPSJkdC1idXR0b24taW5mbyIvPicpLmh0bWwodCkuYXBwZW5kKGh0KCI8ZGl2Lz4iKVt0eXBlb2YgZT09InN0cmluZyI/Imh0bWwiOiJhcHBlbmQiXShlKSkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpLmFwcGVuZFRvKCJib2R5IikpLG4hPT12b2lkIDAmJm4hPT0wJiYoYXI9c2V0VGltZW91dChmdW5jdGlvbigpe3IuYnV0dG9ucy5pbmZvKCExKX0sbikpLHRoaXMub24oImRlc3Ryb3kuYnRuLWluZm8iLGZ1bmN0aW9uKCl7ci5idXR0b25zLmluZm8oITEpfSksdGhpcyl9KTthdC5BcGkucmVnaXN0ZXIoImJ1dHRvbnMuZXhwb3J0RGF0YSgpIixmdW5jdGlvbih0KXtpZih0aGlzLmNvbnRleHQubGVuZ3RoKXJldHVybiBZbChuZXcgYXQuQXBpKHRoaXMuY29udGV4dFswXSksdCl9KTthdC5BcGkucmVnaXN0ZXIoImJ1dHRvbnMuZXhwb3J0SW5mbygpIixmdW5jdGlvbih0KXtyZXR1cm4gdHx8KHQ9e30pLHtmaWxlbmFtZTpxbCh0LHRoaXMpLHRpdGxlOlhsKHQsdGhpcyksbWVzc2FnZVRvcDpEcyh0aGlzLHQsdC5tZXNzYWdlfHx0Lm1lc3NhZ2VUb3AsInRvcCIpLG1lc3NhZ2VCb3R0b206RHModGhpcyx0LHQubWVzc2FnZUJvdHRvbSwiYm90dG9tIil9fSk7dmFyIHFsPWZ1bmN0aW9uKHQsZSl7dmFyIG49dC5maWxlbmFtZT09PSIqIiYmdC50aXRsZSE9PSIqIiYmdC50aXRsZSE9PXZvaWQgMCYmdC50aXRsZSE9PW51bGwmJnQudGl0bGUhPT0iIj90LnRpdGxlOnQuZmlsZW5hbWU7aWYodHlwZW9mIG49PSJmdW5jdGlvbiImJihuPW4odCxlKSksbj09bnVsbClyZXR1cm4gbnVsbDtuLmluZGV4T2YoIioiKSE9PS0xJiYobj1uLnJlcGxhY2UoL1wqL2csaHQoImhlYWQgPiB0aXRsZSIpLnRleHQoKSkudHJpbSgpKSxuPW4ucmVwbGFjZSgvW15hLXpBLVowLTlfXHUwMEExLVx1RkZGRlwuLFwtXyAhXChcKV0vZywiIik7dmFyIHI9JGkodC5leHRlbnNpb24sdCxlKTtyZXR1cm4gcnx8KHI9IiIpLG4rcn0sJGk9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PT1udWxsP251bGw6dHlwZW9mIHQ9PSJmdW5jdGlvbiI/dChlLG4pOnR9LFhsPWZ1bmN0aW9uKHQsZSl7dmFyIG49JGkodC50aXRsZSx0LGUpO3JldHVybiBuPT09bnVsbD9udWxsOm4uaW5kZXhPZigiKiIpIT09LTE/bi5yZXBsYWNlKC9cKi9nLGh0KCJoZWFkID4gdGl0bGUiKS50ZXh0KCl8fCJFeHBvcnRlZCBkYXRhIik6bn0sRHM9ZnVuY3Rpb24odCxlLG4scil7dmFyIHM9JGkobixlLHQpO2lmKHM9PT1udWxsKXJldHVybiBudWxsO3ZhciBpPWh0KCJjYXB0aW9uIix0LnRhYmxlKCkuY29udGFpbmVyKCkpLmVxKDApO2lmKHM9PT0iKiIpe3ZhciBvPWkuY3NzKCJjYXB0aW9uLXNpZGUiKTtyZXR1cm4gbyE9PXI/bnVsbDppLmxlbmd0aD9pLnRleHQoKToiIn1yZXR1cm4gc30sQXM9aHQoIjx0ZXh0YXJlYS8+IilbMF0sWWw9ZnVuY3Rpb24odCxlKXt2YXIgbj1odC5leHRlbmQoITAse30se3Jvd3M6bnVsbCxjb2x1bW5zOiIiLG1vZGlmaWVyOntzZWFyY2g6ImFwcGxpZWQiLG9yZGVyOiJhcHBsaWVkIn0sb3J0aG9nb25hbDoiZGlzcGxheSIsc3RyaXBIdG1sOiEwLHN0cmlwTmV3bGluZXM6ITAsZGVjb2RlRW50aXRpZXM6ITAsdHJpbTohMCxmb3JtYXQ6e2hlYWRlcjpmdW5jdGlvbihGKXtyZXR1cm4gdGUuc3RyaXBEYXRhKEYsbil9LGZvb3RlcjpmdW5jdGlvbihGKXtyZXR1cm4gdGUuc3RyaXBEYXRhKEYsbil9LGJvZHk6ZnVuY3Rpb24oRil7cmV0dXJuIHRlLnN0cmlwRGF0YShGLG4pfX0sY3VzdG9taXplRGF0YTpudWxsLGN1c3RvbWl6ZVppcDpudWxsfSxlKSxyPXQuY29sdW1ucyhuLmNvbHVtbnMpLmluZGV4ZXMoKS5tYXAoZnVuY3Rpb24oRil7dmFyIE89dC5jb2x1bW4oRik7cmV0dXJuIG4uZm9ybWF0LmhlYWRlcihPLnRpdGxlKCksRixPLmhlYWRlcigpKX0pLnRvQXJyYXkoKSxzPXQudGFibGUoKS5mb290ZXIoKT90LmNvbHVtbnMobi5jb2x1bW5zKS5pbmRleGVzKCkubWFwKGZ1bmN0aW9uKEYpe3ZhciBPPXQuY29sdW1uKEYpLmZvb3RlcigpLGY9IiI7aWYoTyl7dmFyIFU9aHQoIi5kdC1jb2x1bW4tdGl0bGUiLE8pO2Y9VS5sZW5ndGg/VS5odG1sKCk6aHQoTykuaHRtbCgpfXJldHVybiBuLmZvcm1hdC5mb290ZXIoZixGLE8pfSkudG9BcnJheSgpOm51bGwsaT1odC5leHRlbmQoe30sbi5tb2RpZmllcik7dC5zZWxlY3QmJnR5cGVvZiB0LnNlbGVjdC5pbmZvPT0iZnVuY3Rpb24iJiZpLnNlbGVjdGVkPT09dm9pZCAwJiZ0LnJvd3Mobi5yb3dzLGh0LmV4dGVuZCh7c2VsZWN0ZWQ6ITB9LGkpKS5hbnkoKSYmaHQuZXh0ZW5kKGkse3NlbGVjdGVkOiEwfSk7Zm9yKHZhciBvPXQucm93cyhuLnJvd3MsaSkuaW5kZXhlcygpLnRvQXJyYXkoKSx1PXQuY2VsbHMobyxuLmNvbHVtbnMse29yZGVyOmkub3JkZXJ9KSxwPXUucmVuZGVyKG4ub3J0aG9nb25hbCkudG9BcnJheSgpLGI9dS5ub2RlcygpLnRvQXJyYXkoKSxnPXUuaW5kZXhlcygpLnRvQXJyYXkoKSxtPXQuY29sdW1ucyhuLmNvbHVtbnMpLmNvdW50KCksQz1tPjA/cC5sZW5ndGgvbTowLHk9W10sVD0wLFA9MCxjPUM7UDxjO1ArKyl7Zm9yKHZhciBsPVttXSxoPTA7aDxtO2grKylsW2hdPW4uZm9ybWF0LmJvZHkocFtUXSxnW1RdLnJvdyxnW1RdLmNvbHVtbixiW1RdKSxUKys7eVtQXT1sfXZhciBfPXtoZWFkZXI6cixoZWFkZXJTdHJ1Y3R1cmU6SXMobi5mb3JtYXQuaGVhZGVyLHQudGFibGUoKS5oZWFkZXIuc3RydWN0dXJlKG4uY29sdW1ucykpLGZvb3RlcjpzLGZvb3RlclN0cnVjdHVyZTpJcyhuLmZvcm1hdC5mb290ZXIsdC50YWJsZSgpLmZvb3Rlci5zdHJ1Y3R1cmUobi5jb2x1bW5zKSksYm9keTp5fTtyZXR1cm4gbi5jdXN0b21pemVEYXRhJiZuLmN1c3RvbWl6ZURhdGEoXyksX307ZnVuY3Rpb24gSXModCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKylmb3IodmFyIHI9MDtyPGVbbl0ubGVuZ3RoO3IrKyl7dmFyIHM9ZVtuXVtyXTtzJiYocy50aXRsZT10KHMudGl0bGUscixzLmNlbGwpKX1yZXR1cm4gZX1odC5mbi5kYXRhVGFibGUuQnV0dG9ucz10ZTtodC5mbi5EYXRhVGFibGUuQnV0dG9ucz10ZTtodChkb2N1bWVudCkub24oImluaXQuZHQgcGx1Z2luLWluaXQuZHQiLGZ1bmN0aW9uKHQsZSl7aWYodC5uYW1lc3BhY2U9PT0iZHQiKXt2YXIgbj1lLm9Jbml0LmJ1dHRvbnN8fGF0LmRlZmF1bHRzLmJ1dHRvbnM7biYmIWUuX2J1dHRvbnMmJm5ldyB0ZShlLG4pLmNvbnRhaW5lcigpfX0pO2Z1bmN0aW9uIEZzKHQsZSl7dmFyIG49bmV3IGF0LkFwaSh0KSxyPWV8fG4uaW5pdCgpLmJ1dHRvbnN8fGF0LmRlZmF1bHRzLmJ1dHRvbnM7cmV0dXJuIG5ldyB0ZShuLHIpLmNvbnRhaW5lcigpfWF0LmV4dC5mZWF0dXJlLnB1c2goe2ZuSW5pdDpGcyxjRmVhdHVyZToiQiJ9KTthdC5mZWF0dXJlJiZhdC5mZWF0dXJlLnJlZ2lzdGVyKCJidXR0b25zIixGcyk7dmFyIFJzPWllKGFlKCksMSk7dmFyIHNlPVJzLmRlZmF1bHQsTHMsenM7ZnVuY3Rpb24gWmkoKXtyZXR1cm4gTHN8fHdpbmRvdy5KU1ppcH1mdW5jdGlvbiBLaSgpe3JldHVybiB6c3x8d2luZG93LnBkZk1ha2V9YXQuQnV0dG9ucy5wZGZNYWtlPWZ1bmN0aW9uKHQpe2lmKCF0KXJldHVybiBLaSgpO3pzPXR9LGF0LkJ1dHRvbnMuanN6aXA9ZnVuY3Rpb24odCl7aWYoIXQpcmV0dXJuIFppKCk7THM9dH07dmFyIFdyPWZ1bmN0aW9uKHQpeyJ1c2Ugc3RyaWN0Ijt2YXIgZSxuLHIscyxpLG8sdSxwLGIsZyxtO2lmKCEodD09PXZvaWQgMHx8dHlwZW9mIG5hdmlnYXRvcjwidSImJi9NU0lFIFsxLTldXC4vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpKXJldHVybiBtPXQuZG9jdW1lbnQsZT1mdW5jdGlvbigpe3JldHVybiB0LlVSTHx8dC53ZWJraXRVUkx8fHR9LG49bS5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLCJhIikscj0iZG93bmxvYWQiaW4gbixzPS9jb25zdHJ1Y3Rvci9pLnRlc3QodC5IVE1MRWxlbWVudCl8fHQuc2FmYXJpLGk9L0NyaU9TXC9bXGRdKy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSxvPWZ1bmN0aW9uKEMpeyh0LnNldEltbWVkaWF0ZXx8dC5zZXRUaW1lb3V0KShmdW5jdGlvbigpe3Rocm93IEN9LDApfSx1PTRlNCxwPWZ1bmN0aW9uKEMpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0eXBlb2YgQz09InN0cmluZyI/ZSgpLnJldm9rZU9iamVjdFVSTChDKTpDLnJlbW92ZSgpfSx1KX0sYj1mdW5jdGlvbihDKXtyZXR1cm4vXlxzKig/OnRleHRcL1xTKnxhcHBsaWNhdGlvblwveG1sfFxTKlwvXFMqXCt4bWwpXHMqOy4qY2hhcnNldFxzKj1ccyp1dGYtOC9pLnRlc3QoQy50eXBlKT9uZXcgQmxvYihbIlx1RkVGRiIsQ10se3R5cGU6Qy50eXBlfSk6Q30sbT0oZz1mdW5jdGlvbihDLHksaCl7aHx8KEM9YihDKSk7dmFyIFAsYyxsPXRoaXMsaD1DLnR5cGU9PT0iYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIixfPWZ1bmN0aW9uKCl7Zm9yKHZhciBGPWwsTz0id3JpdGVzdGFydCBwcm9ncmVzcyB3cml0ZSB3cml0ZWVuZCIuc3BsaXQoIiAiKSxmPXZvaWQgMCxVPShPPVtdLmNvbmNhdChPKSkubGVuZ3RoO1UtLTspe3ZhciBYPUZbIm9uIitPW1VdXTtpZih0eXBlb2YgWD09ImZ1bmN0aW9uIil0cnl7WC5jYWxsKEYsZnx8Ril9Y2F0Y2goUSl7byhRKX19fTtsLnJlYWR5U3RhdGU9bC5JTklULHI/KFA9ZSgpLmNyZWF0ZU9iamVjdFVSTChDKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIEYsTztuLmhyZWY9UCxuLmRvd25sb2FkPXksRj1uLE89bmV3IE1vdXNlRXZlbnQoImNsaWNrIiksRi5kaXNwYXRjaEV2ZW50KE8pLF8oKSxwKFApLGwucmVhZHlTdGF0ZT1sLkRPTkV9KSk6KGl8fGgmJnMpJiZ0LkZpbGVSZWFkZXI/KChjPW5ldyBGaWxlUmVhZGVyKS5vbmxvYWRlbmQ9ZnVuY3Rpb24oKXt2YXIgRj1pP2MucmVzdWx0OmMucmVzdWx0LnJlcGxhY2UoL15kYXRhOlteO10qOy8sImRhdGE6YXR0YWNobWVudC9maWxlOyIpO3Qub3BlbihGLCJfYmxhbmsiKXx8KHQubG9jYXRpb24uaHJlZj1GKSxsLnJlYWR5U3RhdGU9bC5ET05FLF8oKX0sYy5yZWFkQXNEYXRhVVJMKEMpLGwucmVhZHlTdGF0ZT1sLklOSVQpOihQPVB8fGUoKS5jcmVhdGVPYmplY3RVUkwoQyksIWgmJnQub3BlbihQLCJfYmxhbmsiKXx8KHQubG9jYXRpb24uaHJlZj1QKSxsLnJlYWR5U3RhdGU9bC5ET05FLF8oKSxwKFApKX0pLnByb3RvdHlwZSx0eXBlb2YgbmF2aWdhdG9yPCJ1IiYmbmF2aWdhdG9yLm1zU2F2ZU9yT3BlbkJsb2I/ZnVuY3Rpb24oQyx5LFQpe3JldHVybiB5PXl8fEMubmFtZXx8ImRvd25sb2FkIixUfHwoQz1iKEMpKSxuYXZpZ2F0b3IubXNTYXZlT3JPcGVuQmxvYihDLHkpfToobS5hYm9ydD1mdW5jdGlvbigpe30sbS5yZWFkeVN0YXRlPW0uSU5JVD0wLG0uV1JJVElORz0xLG0uRE9ORT0yLG0uZXJyb3I9bS5vbndyaXRlc3RhcnQ9bS5vbnByb2dyZXNzPW0ub253cml0ZT1tLm9uYWJvcnQ9bS5vbmVycm9yPW0ub253cml0ZWVuZD1udWxsLGZ1bmN0aW9uKEMseSxUKXtyZXR1cm4gbmV3IGcoQyx5fHxDLm5hbWV8fCJkb3dubG9hZCIsVCl9KX0odHlwZW9mIHNlbGY8InUiJiZzZWxmfHx0eXBlb2Ygd2luZG93PCJ1IiYmd2luZG93fHwodm9pZCAwKS5jb250ZW50KSxCcz0oYXQuZmlsZVNhdmU9V3IsZnVuY3Rpb24odCl7dmFyIGU9IlNoZWV0MSI7cmV0dXJuIGU9dC5zaGVldE5hbWU/dC5zaGVldE5hbWUucmVwbGFjZSgvW1xbXF1cKlwvXFxcP1w6XS9nLCIiKTplfSksanM9ZnVuY3Rpb24odCl7cmV0dXJuIHQubmV3bGluZXx8KG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1dpbmRvd3MvKT9gXHIKYDpgCmApfSxOcz1mdW5jdGlvbihiLGUpe2Z1bmN0aW9uIG4oVCl7Zm9yKHZhciBQPSIiLGM9MCxsPVQubGVuZ3RoO2M8bDtjKyspMDxjJiYoUCs9byksUCs9aT9pKygiIitUW2NdKS5yZXBsYWNlKHUscCtpKStpOlRbY107cmV0dXJuIFB9dmFyIHI9anMoZSkscz1iLmJ1dHRvbnMuZXhwb3J0RGF0YShlLmV4cG9ydE9wdGlvbnMpLGk9ZS5maWVsZEJvdW5kYXJ5LG89ZS5maWVsZFNlcGFyYXRvcix1PW5ldyBSZWdFeHAoaSwiZyIpLHA9ZS5lc2NhcGVDaGFyIT09dm9pZCAwP2UuZXNjYXBlQ2hhcjoiXFwiLGI9IiIsZz0iIixtPVtdO2UuaGVhZGVyJiYoYj1zLmhlYWRlclN0cnVjdHVyZS5tYXAoZnVuY3Rpb24oVCl7cmV0dXJuIG4oVC5tYXAoZnVuY3Rpb24oUCl7cmV0dXJuIFA/UC50aXRsZToiIn0pKX0pLmpvaW4ocikrciksZS5mb290ZXImJnMuZm9vdGVyJiYoZz1zLmZvb3RlclN0cnVjdHVyZS5tYXAoZnVuY3Rpb24oVCl7cmV0dXJuIG4oVC5tYXAoZnVuY3Rpb24oUCl7cmV0dXJuIFA/UC50aXRsZToiIn0pKX0pLmpvaW4ocikrcik7Zm9yKHZhciBDPTAseT1zLmJvZHkubGVuZ3RoO0M8eTtDKyspbS5wdXNoKG4ocy5ib2R5W0NdKSk7cmV0dXJue3N0cjpiK20uam9pbihyKStyK2cscm93czptLmxlbmd0aH19LE9zPWZ1bmN0aW9uKCl7dmFyIHQ7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIikhPT0tMSYmbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKT09PS0xJiZuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIik9PT0tMSYmISEoKHQ9bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQXBwbGVXZWJLaXRcLyhcZCtcLlxkKykvKSkmJjE8dC5sZW5ndGgmJit0WzFdPDYwMy4xKX07ZnVuY3Rpb24gb3IodCl7Zm9yKHZhciBlPTY1LG49OTAtZSsxLHI9IiI7MDw9dDspcj1TdHJpbmcuZnJvbUNoYXJDb2RlKHQlbitlKStyLHQ9TWF0aC5mbG9vcih0L24pLTE7cmV0dXJuIHJ9dHJ5e0dyPW5ldyBYTUxTZXJpYWxpemVyfWNhdGNoe312YXIgc3IsR3I7ZnVuY3Rpb24gTXModCxlKXtzcj09PXZvaWQgMCYmKHNyPUdyLnNlcmlhbGl6ZVRvU3RyaW5nKG5ldyB3aW5kb3cuRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKFZzWyJ4bC93b3Jrc2hlZXRzL3NoZWV0MS54bWwiXSwidGV4dC94bWwiKSkuaW5kZXhPZigieG1sbnM6ciIpPT09LTEpLHNlLmVhY2goZSxmdW5jdGlvbihuLHIpe2lmKHNlLmlzUGxhaW5PYmplY3QocikpTXModC5mb2xkZXIobikscik7ZWxzZXtpZihzcil7Zm9yKHZhciBzLGk9ci5jaGlsZE5vZGVzWzBdLG89W10sdT1pLmF0dHJpYnV0ZXMubGVuZ3RoLTE7MDw9dTt1LS0pe3ZhciBwPWkuYXR0cmlidXRlc1t1XS5ub2RlTmFtZSxiPWkuYXR0cmlidXRlc1t1XS5ub2RlVmFsdWU7cC5pbmRleE9mKCI6IikhPT0tMSYmKG8ucHVzaCh7bmFtZTpwLHZhbHVlOmJ9KSxpLnJlbW92ZUF0dHJpYnV0ZShwKSl9Zm9yKHU9MCxzPW8ubGVuZ3RoO3U8czt1Kyspe3ZhciBnPXIuY3JlYXRlQXR0cmlidXRlKG9bdV0ubmFtZS5yZXBsYWNlKCI6IiwiX2R0X2JfbmFtZXNwYWNlX3Rva2VuXyIpKTtnLnZhbHVlPW9bdV0udmFsdWUsaS5zZXRBdHRyaWJ1dGVOb2RlKGcpfX12YXIgbT1Hci5zZXJpYWxpemVUb1N0cmluZyhyKSxtPShtPXNyPyhtPShtPW0uaW5kZXhPZigiPD94bWwiKT09PS0xPyc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+JyttOm0pLnJlcGxhY2UoL19kdF9iX25hbWVzcGFjZV90b2tlbl8vZywiOiIpKS5yZXBsYWNlKC94bWxuczpOU1tcZF0rPSIiIE5TW1xkXSs6L2csIiIpOm0pLnJlcGxhY2UoLzwoW148Pl0qPykgeG1sbnM9IiIoW148Pl0qPyk+L2csIjwkMSAkMj4iKTt0LmZpbGUobixtKX19KX1mdW5jdGlvbiBEZSh0LGUsbil7dmFyIHI9dC5jcmVhdGVFbGVtZW50KGUpO3JldHVybiBuJiYobi5hdHRyJiZzZShyKS5hdHRyKG4uYXR0ciksbi5jaGlsZHJlbiYmc2UuZWFjaChuLmNoaWxkcmVuLGZ1bmN0aW9uKHMsaSl7ci5hcHBlbmRDaGlsZChpKX0pLG4udGV4dCE9PW51bGwpJiZuLnRleHQhPT12b2lkIDAmJnIuYXBwZW5kQ2hpbGQodC5jcmVhdGVUZXh0Tm9kZShuLnRleHQpKSxyfWZ1bmN0aW9uIFpsKHQsZSl7dmFyIG49dC5oZWFkZXJbZV0ubGVuZ3RoO3QuZm9vdGVyJiZ0LmZvb3RlcltlXSYmdC5mb290ZXJbZV0ubGVuZ3RoPm4mJihuPXQuZm9vdGVyW2VdLmxlbmd0aCk7Zm9yKHZhciByPTAscz10LmJvZHkubGVuZ3RoO3I8cztyKyspe3ZhciBpLG89dC5ib2R5W3JdW2VdO2lmKDQwPChuPW48KGk9KChvPW8hPW51bGw/by50b1N0cmluZygpOiIiKS5pbmRleE9mKGAKYCkhPT0tMT8oKGk9by5zcGxpdChgCmApKS5zb3J0KGZ1bmN0aW9uKHUscCl7cmV0dXJuIHAubGVuZ3RoLXUubGVuZ3RofSksaVswXSk6bykubGVuZ3RoKT9pOm4pKXJldHVybiA1NH1yZXR1cm4gNjwobio9MS4zNSk/bjo2fXZhciBWcz17Il9yZWxzLy5yZWxzIjonPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/PjxSZWxhdGlvbnNoaXBzIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvcGFja2FnZS8yMDA2L3JlbGF0aW9uc2hpcHMiPjxSZWxhdGlvbnNoaXAgSWQ9InJJZDEiIFR5cGU9Imh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMvb2ZmaWNlRG9jdW1lbnQiIFRhcmdldD0ieGwvd29ya2Jvb2sueG1sIi8+PC9SZWxhdGlvbnNoaXBzPicsInhsL19yZWxzL3dvcmtib29rLnhtbC5yZWxzIjonPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/PjxSZWxhdGlvbnNoaXBzIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvcGFja2FnZS8yMDA2L3JlbGF0aW9uc2hpcHMiPjxSZWxhdGlvbnNoaXAgSWQ9InJJZDEiIFR5cGU9Imh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMvd29ya3NoZWV0IiBUYXJnZXQ9IndvcmtzaGVldHMvc2hlZXQxLnhtbCIvPjxSZWxhdGlvbnNoaXAgSWQ9InJJZDIiIFR5cGU9Imh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMvc3R5bGVzIiBUYXJnZXQ9InN0eWxlcy54bWwiLz48L1JlbGF0aW9uc2hpcHM+JywiW0NvbnRlbnRfVHlwZXNdLnhtbCI6Jzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz48VHlwZXMgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9wYWNrYWdlLzIwMDYvY29udGVudC10eXBlcyI+PERlZmF1bHQgRXh0ZW5zaW9uPSJ4bWwiIENvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi94bWwiIC8+PERlZmF1bHQgRXh0ZW5zaW9uPSJyZWxzIiBDb250ZW50VHlwZT0iYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLXBhY2thZ2UucmVsYXRpb25zaGlwcyt4bWwiIC8+PERlZmF1bHQgRXh0ZW5zaW9uPSJqcGVnIiBDb250ZW50VHlwZT0iaW1hZ2UvanBlZyIgLz48T3ZlcnJpZGUgUGFydE5hbWU9Ii94bC93b3JrYm9vay54bWwiIENvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldC5tYWluK3htbCIgLz48T3ZlcnJpZGUgUGFydE5hbWU9Ii94bC93b3Jrc2hlZXRzL3NoZWV0MS54bWwiIENvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC53b3Jrc2hlZXQreG1sIiAvPjxPdmVycmlkZSBQYXJ0TmFtZT0iL3hsL3N0eWxlcy54bWwiIENvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zdHlsZXMreG1sIiAvPjwvVHlwZXM+JywieGwvd29ya2Jvb2sueG1sIjonPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/Pjx3b3JrYm9vayB4bWxucz0iaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3NwcmVhZHNoZWV0bWwvMjAwNi9tYWluIiB4bWxuczpyPSJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzIj48ZmlsZVZlcnNpb24gYXBwTmFtZT0ieGwiIGxhc3RFZGl0ZWQ9IjUiIGxvd2VzdEVkaXRlZD0iNSIgcnVwQnVpbGQ9IjI0ODE2Ii8+PHdvcmtib29rUHIgc2hvd0lua0Fubm90YXRpb249IjAiIGF1dG9Db21wcmVzc1BpY3R1cmVzPSIwIi8+PGJvb2tWaWV3cz48d29ya2Jvb2tWaWV3IHhXaW5kb3c9IjAiIHlXaW5kb3c9IjAiIHdpbmRvd1dpZHRoPSIyNTYwMCIgd2luZG93SGVpZ2h0PSIxOTAyMCIgdGFiUmF0aW89IjUwMCIvPjwvYm9va1ZpZXdzPjxzaGVldHM+PHNoZWV0IG5hbWU9IlNoZWV0MSIgc2hlZXRJZD0iMSIgcjppZD0icklkMSIvPjwvc2hlZXRzPjxkZWZpbmVkTmFtZXMvPjwvd29ya2Jvb2s+JywieGwvd29ya3NoZWV0cy9zaGVldDEueG1sIjonPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/Pjx3b3Jrc2hlZXQgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9zcHJlYWRzaGVldG1sLzIwMDYvbWFpbiIgeG1sbnM6cj0iaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcyIgeG1sbnM6bWM9Imh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9tYXJrdXAtY29tcGF0aWJpbGl0eS8yMDA2IiBtYzpJZ25vcmFibGU9IngxNGFjIiB4bWxuczp4MTRhYz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9vZmZpY2Uvc3ByZWFkc2hlZXRtbC8yMDA5LzkvYWMiPjxzaGVldERhdGEvPjxtZXJnZUNlbGxzIGNvdW50PSIwIi8+PC93b3Jrc2hlZXQ+JywieGwvc3R5bGVzLnhtbCI6Jzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PHN0eWxlU2hlZXQgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9zcHJlYWRzaGVldG1sLzIwMDYvbWFpbiIgeG1sbnM6bWM9Imh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9tYXJrdXAtY29tcGF0aWJpbGl0eS8yMDA2IiBtYzpJZ25vcmFibGU9IngxNGFjIiB4bWxuczp4MTRhYz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9vZmZpY2Uvc3ByZWFkc2hlZXRtbC8yMDA5LzkvYWMiPjxudW1GbXRzIGNvdW50PSI2Ij48bnVtRm10IG51bUZtdElkPSIxNjQiIGZvcm1hdENvZGU9IlskJC00MDldIywjIzAuMDA7LVskJC00MDldIywjIzAuMDAiLz48bnVtRm10IG51bUZtdElkPSIxNjUiIGZvcm1hdENvZGU9IiZxdW90O1x4QTMmcXVvdDsjLCMjMC4wMCIvPjxudW1GbXQgbnVtRm10SWQ9IjE2NiIgZm9ybWF0Q29kZT0iWyRcdTIwQUMtMl0gIywjIzAuMDAiLz48bnVtRm10IG51bUZtdElkPSIxNjciIGZvcm1hdENvZGU9IjAuMCUiLz48bnVtRm10IG51bUZtdElkPSIxNjgiIGZvcm1hdENvZGU9IiMsIyMwOygjLCMjMCkiLz48bnVtRm10IG51bUZtdElkPSIxNjkiIGZvcm1hdENvZGU9IiMsIyMwLjAwOygjLCMjMC4wMCkiLz48L251bUZtdHM+PGZvbnRzIGNvdW50PSI1IiB4MTRhYzprbm93bkZvbnRzPSIxIj48Zm9udD48c3ogdmFsPSIxMSIgLz48bmFtZSB2YWw9IkNhbGlicmkiIC8+PC9mb250Pjxmb250PjxzeiB2YWw9IjExIiAvPjxuYW1lIHZhbD0iQ2FsaWJyaSIgLz48Y29sb3IgcmdiPSJGRkZGRkZGRiIgLz48L2ZvbnQ+PGZvbnQ+PHN6IHZhbD0iMTEiIC8+PG5hbWUgdmFsPSJDYWxpYnJpIiAvPjxiIC8+PC9mb250Pjxmb250PjxzeiB2YWw9IjExIiAvPjxuYW1lIHZhbD0iQ2FsaWJyaSIgLz48aSAvPjwvZm9udD48Zm9udD48c3ogdmFsPSIxMSIgLz48bmFtZSB2YWw9IkNhbGlicmkiIC8+PHUgLz48L2ZvbnQ+PC9mb250cz48ZmlsbHMgY291bnQ9IjYiPjxmaWxsPjxwYXR0ZXJuRmlsbCBwYXR0ZXJuVHlwZT0ibm9uZSIgLz48L2ZpbGw+PGZpbGw+PHBhdHRlcm5GaWxsIHBhdHRlcm5UeXBlPSJub25lIiAvPjwvZmlsbD48ZmlsbD48cGF0dGVybkZpbGwgcGF0dGVyblR5cGU9InNvbGlkIj48ZmdDb2xvciByZ2I9IkZGRDlEOUQ5IiAvPjxiZ0NvbG9yIGluZGV4ZWQ9IjY0IiAvPjwvcGF0dGVybkZpbGw+PC9maWxsPjxmaWxsPjxwYXR0ZXJuRmlsbCBwYXR0ZXJuVHlwZT0ic29saWQiPjxmZ0NvbG9yIHJnYj0iRkZEOTk3OTUiIC8+PGJnQ29sb3IgaW5kZXhlZD0iNjQiIC8+PC9wYXR0ZXJuRmlsbD48L2ZpbGw+PGZpbGw+PHBhdHRlcm5GaWxsIHBhdHRlcm5UeXBlPSJzb2xpZCI+PGZnQ29sb3IgcmdiPSJmZmM2ZWZjZSIgLz48YmdDb2xvciBpbmRleGVkPSI2NCIgLz48L3BhdHRlcm5GaWxsPjwvZmlsbD48ZmlsbD48cGF0dGVybkZpbGwgcGF0dGVyblR5cGU9InNvbGlkIj48ZmdDb2xvciByZ2I9ImZmYzZjZmVmIiAvPjxiZ0NvbG9yIGluZGV4ZWQ9IjY0IiAvPjwvcGF0dGVybkZpbGw+PC9maWxsPjwvZmlsbHM+PGJvcmRlcnMgY291bnQ9IjIiPjxib3JkZXI+PGxlZnQgLz48cmlnaHQgLz48dG9wIC8+PGJvdHRvbSAvPjxkaWFnb25hbCAvPjwvYm9yZGVyPjxib3JkZXIgZGlhZ29uYWxVcD0iZmFsc2UiIGRpYWdvbmFsRG93bj0iZmFsc2UiPjxsZWZ0IHN0eWxlPSJ0aGluIj48Y29sb3IgYXV0bz0iMSIgLz48L2xlZnQ+PHJpZ2h0IHN0eWxlPSJ0aGluIj48Y29sb3IgYXV0bz0iMSIgLz48L3JpZ2h0Pjx0b3Agc3R5bGU9InRoaW4iPjxjb2xvciBhdXRvPSIxIiAvPjwvdG9wPjxib3R0b20gc3R5bGU9InRoaW4iPjxjb2xvciBhdXRvPSIxIiAvPjwvYm90dG9tPjxkaWFnb25hbCAvPjwvYm9yZGVyPjwvYm9yZGVycz48Y2VsbFN0eWxlWGZzIGNvdW50PSIxIj48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMCIgZmlsbElkPSIwIiBib3JkZXJJZD0iMCIgLz48L2NlbGxTdHlsZVhmcz48Y2VsbFhmcyBjb3VudD0iNjgiPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIwIiBmaWxsSWQ9IjAiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMSIgZmlsbElkPSIwIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjIiIGZpbGxJZD0iMCIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIzIiBmaWxsSWQ9IjAiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iNCIgZmlsbElkPSIwIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjAiIGZpbGxJZD0iMiIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIxIiBmaWxsSWQ9IjIiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMiIgZmlsbElkPSIyIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjMiIGZpbGxJZD0iMiIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSI0IiBmaWxsSWQ9IjIiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMCIgZmlsbElkPSIzIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjEiIGZpbGxJZD0iMyIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIyIiBmaWxsSWQ9IjMiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMyIgZmlsbElkPSIzIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjQiIGZpbGxJZD0iMyIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIwIiBmaWxsSWQ9IjQiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMSIgZmlsbElkPSI0IiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjIiIGZpbGxJZD0iNCIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIzIiBmaWxsSWQ9IjQiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iNCIgZmlsbElkPSI0IiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjAiIGZpbGxJZD0iNSIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIxIiBmaWxsSWQ9IjUiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMiIgZmlsbElkPSI1IiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjMiIGZpbGxJZD0iNSIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSI0IiBmaWxsSWQ9IjUiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMCIgZmlsbElkPSIwIiBib3JkZXJJZD0iMSIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjEiIGZpbGxJZD0iMCIgYm9yZGVySWQ9IjEiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIyIiBmaWxsSWQ9IjAiIGJvcmRlcklkPSIxIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMyIgZmlsbElkPSIwIiBib3JkZXJJZD0iMSIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjQiIGZpbGxJZD0iMCIgYm9yZGVySWQ9IjEiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIwIiBmaWxsSWQ9IjIiIGJvcmRlcklkPSIxIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMSIgZmlsbElkPSIyIiBib3JkZXJJZD0iMSIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjIiIGZpbGxJZD0iMiIgYm9yZGVySWQ9IjEiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIzIiBmaWxsSWQ9IjIiIGJvcmRlcklkPSIxIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iNCIgZmlsbElkPSIyIiBib3JkZXJJZD0iMSIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjAiIGZpbGxJZD0iMyIgYm9yZGVySWQ9IjEiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIxIiBmaWxsSWQ9IjMiIGJvcmRlcklkPSIxIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMiIgZmlsbElkPSIzIiBib3JkZXJJZD0iMSIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjMiIGZpbGxJZD0iMyIgYm9yZGVySWQ9IjEiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSI0IiBmaWxsSWQ9IjMiIGJvcmRlcklkPSIxIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMCIgZmlsbElkPSI0IiBib3JkZXJJZD0iMSIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjEiIGZpbGxJZD0iNCIgYm9yZGVySWQ9IjEiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIyIiBmaWxsSWQ9IjQiIGJvcmRlcklkPSIxIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMyIgZmlsbElkPSI0IiBib3JkZXJJZD0iMSIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjQiIGZpbGxJZD0iNCIgYm9yZGVySWQ9IjEiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIwIiBmaWxsSWQ9IjUiIGJvcmRlcklkPSIxIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMSIgZmlsbElkPSI1IiBib3JkZXJJZD0iMSIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjIiIGZpbGxJZD0iNSIgYm9yZGVySWQ9IjEiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIzIiBmaWxsSWQ9IjUiIGJvcmRlcklkPSIxIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iNCIgZmlsbElkPSI1IiBib3JkZXJJZD0iMSIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjAiIGZpbGxJZD0iMCIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIgeGZJZD0iMCIgYXBwbHlBbGlnbm1lbnQ9IjEiPjxhbGlnbm1lbnQgaG9yaXpvbnRhbD0ibGVmdCIvPjwveGY+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjAiIGZpbGxJZD0iMCIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIgeGZJZD0iMCIgYXBwbHlBbGlnbm1lbnQ9IjEiPjxhbGlnbm1lbnQgaG9yaXpvbnRhbD0iY2VudGVyIi8+PC94Zj48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMCIgZmlsbElkPSIwIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIiB4ZklkPSIwIiBhcHBseUFsaWdubWVudD0iMSI+PGFsaWdubWVudCBob3Jpem9udGFsPSJyaWdodCIvPjwveGY+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjAiIGZpbGxJZD0iMCIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIgeGZJZD0iMCIgYXBwbHlBbGlnbm1lbnQ9IjEiPjxhbGlnbm1lbnQgaG9yaXpvbnRhbD0iZmlsbCIvPjwveGY+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjAiIGZpbGxJZD0iMCIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIgeGZJZD0iMCIgYXBwbHlBbGlnbm1lbnQ9IjEiPjxhbGlnbm1lbnQgdGV4dFJvdGF0aW9uPSI5MCIvPjwveGY+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjAiIGZpbGxJZD0iMCIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIgeGZJZD0iMCIgYXBwbHlBbGlnbm1lbnQ9IjEiPjxhbGlnbm1lbnQgd3JhcFRleHQ9IjEiLz48L3hmPjx4ZiBudW1GbXRJZD0iOSIgICBmb250SWQ9IjAiIGZpbGxJZD0iMCIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIgeGZJZD0iMCIgYXBwbHlOdW1iZXJGb3JtYXQ9IjEiLz48eGYgbnVtRm10SWQ9IjE2NCIgZm9udElkPSIwIiBmaWxsSWQ9IjAiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiIHhmSWQ9IjAiIGFwcGx5TnVtYmVyRm9ybWF0PSIxIi8+PHhmIG51bUZtdElkPSIxNjUiIGZvbnRJZD0iMCIgZmlsbElkPSIwIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIiB4ZklkPSIwIiBhcHBseU51bWJlckZvcm1hdD0iMSIvPjx4ZiBudW1GbXRJZD0iMTY2IiBmb250SWQ9IjAiIGZpbGxJZD0iMCIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIgeGZJZD0iMCIgYXBwbHlOdW1iZXJGb3JtYXQ9IjEiLz48eGYgbnVtRm10SWQ9IjE2NyIgZm9udElkPSIwIiBmaWxsSWQ9IjAiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiIHhmSWQ9IjAiIGFwcGx5TnVtYmVyRm9ybWF0PSIxIi8+PHhmIG51bUZtdElkPSIxNjgiIGZvbnRJZD0iMCIgZmlsbElkPSIwIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIiB4ZklkPSIwIiBhcHBseU51bWJlckZvcm1hdD0iMSIvPjx4ZiBudW1GbXRJZD0iMTY5IiBmb250SWQ9IjAiIGZpbGxJZD0iMCIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIgeGZJZD0iMCIgYXBwbHlOdW1iZXJGb3JtYXQ9IjEiLz48eGYgbnVtRm10SWQ9IjMiIGZvbnRJZD0iMCIgZmlsbElkPSIwIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIiB4ZklkPSIwIiBhcHBseU51bWJlckZvcm1hdD0iMSIvPjx4ZiBudW1GbXRJZD0iNCIgZm9udElkPSIwIiBmaWxsSWQ9IjAiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiIHhmSWQ9IjAiIGFwcGx5TnVtYmVyRm9ybWF0PSIxIi8+PHhmIG51bUZtdElkPSIxIiBmb250SWQ9IjAiIGZpbGxJZD0iMCIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIgeGZJZD0iMCIgYXBwbHlOdW1iZXJGb3JtYXQ9IjEiLz48eGYgbnVtRm10SWQ9IjIiIGZvbnRJZD0iMCIgZmlsbElkPSIwIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIiB4ZklkPSIwIiBhcHBseU51bWJlckZvcm1hdD0iMSIvPjx4ZiBudW1GbXRJZD0iMTQiIGZvbnRJZD0iMCIgZmlsbElkPSIwIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIiB4ZklkPSIwIiBhcHBseU51bWJlckZvcm1hdD0iMSIvPjwvY2VsbFhmcz48Y2VsbFN0eWxlcyBjb3VudD0iMSI+PGNlbGxTdHlsZSBuYW1lPSJOb3JtYWwiIHhmSWQ9IjAiIGJ1aWx0aW5JZD0iMCIgLz48L2NlbGxTdHlsZXM+PGR4ZnMgY291bnQ9IjAiIC8+PHRhYmxlU3R5bGVzIGNvdW50PSIwIiBkZWZhdWx0VGFibGVTdHlsZT0iVGFibGVTdHlsZU1lZGl1bTkiIGRlZmF1bHRQaXZvdFN0eWxlPSJQaXZvdFN0eWxlTWVkaXVtNCIgLz48L3N0eWxlU2hlZXQ+J30sRXM9W3ttYXRjaDovXlwtP1xkK1wuXGQlJC8sc3R5bGU6NjAsZm10OmZ1bmN0aW9uKHQpe3JldHVybiB0LzEwMH19LHttYXRjaDovXlwtP1xkK1wuP1xkKiUkLyxzdHlsZTo1NixmbXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQvMTAwfX0se21hdGNoOi9eXC0/XCRbXGQsXSsuP1xkKiQvLHN0eWxlOjU3fSx7bWF0Y2g6L15cLT/Co1tcZCxdKy4/XGQqJC8sc3R5bGU6NTh9LHttYXRjaDovXlwtP+KCrFtcZCxdKy4/XGQqJC8sc3R5bGU6NTl9LHttYXRjaDovXlwtP1xkKyQvLHN0eWxlOjY1fSx7bWF0Y2g6L15cLT9cZCtcLlxkezJ9JC8sc3R5bGU6NjZ9LHttYXRjaDovXlwoW1xkLF0rXCkkLyxzdHlsZTo2MSxmbXQ6ZnVuY3Rpb24odCl7cmV0dXJuLTEqdC5yZXBsYWNlKC9bXChcKV0vZywiIil9fSx7bWF0Y2g6L15cKFtcZCxdK1wuXGR7Mn1cKSQvLHN0eWxlOjYyLGZtdDpmdW5jdGlvbih0KXtyZXR1cm4tMSp0LnJlcGxhY2UoL1tcKFwpXS9nLCIiKX19LHttYXRjaDovXlwtP1tcZCxdKyQvLHN0eWxlOjYzfSx7bWF0Y2g6L15cLT9bXGQsXStcLlxkezJ9JC8sc3R5bGU6NjR9LHttYXRjaDovXigxOVxkXGR8WzItOV1cZFxkXGQpXC0oMFxkfDFbMDEyXSlcLVswMTIzXVtcZF0kLyxzdHlsZTo2NyxmbXQ6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQoMjU1NjkrRGF0ZS5wYXJzZSh0KS84NjRlNSl9fV0sVXI9ZnVuY3Rpb24odCxlLG4scixzKXt2YXIgaT1zZSgibWVyZ2VDZWxscyIsdCk7aVswXS5hcHBlbmRDaGlsZChEZSh0LCJtZXJnZUNlbGwiLHthdHRyOntyZWY6b3IobikrZSsiOiIrb3IobitzLTEpKyhlK3ItMSl9fSkpLGkuYXR0cigiY291bnQiLHBhcnNlRmxvYXQoaS5hdHRyKCJjb3VudCIpKSsxKX07YXQuZXh0LmJ1dHRvbnMuY29weUh0bWw1PXtjbGFzc05hbWU6ImJ1dHRvbnMtY29weSBidXR0b25zLWh0bWw1Iix0ZXh0OmZ1bmN0aW9uKHQpe3JldHVybiB0LmkxOG4oImJ1dHRvbnMuY29weSIsIkNvcHkiKX0sYWN0aW9uOmZ1bmN0aW9uKHQsZSxuLHIscyl7dmFyIGk9TnMoZSxyKSxtPWUuYnV0dG9ucy5leHBvcnRJbmZvKHIpLHA9anMociksbz1pLnN0cix1PXNlKCI8ZGl2Lz4iKS5jc3Moe2hlaWdodDoxLHdpZHRoOjEsb3ZlcmZsb3c6ImhpZGRlbiIscG9zaXRpb246ImZpeGVkIix0b3A6MCxsZWZ0OjB9KSxwPShtLnRpdGxlJiYobz1tLnRpdGxlK3ArcCtvKSxtLm1lc3NhZ2VUb3AmJihvPW0ubWVzc2FnZVRvcCtwK3ArbyksbS5tZXNzYWdlQm90dG9tJiYobz1vK3ArcCttLm1lc3NhZ2VCb3R0b20pLHIuY3VzdG9taXplJiYobz1yLmN1c3RvbWl6ZShvLHIsZSkpLHNlKCI8dGV4dGFyZWEgcmVhZG9ubHkvPiIpLnZhbChvKS5hcHBlbmRUbyh1KSk7aWYoZG9jdW1lbnQucXVlcnlDb21tYW5kU3VwcG9ydGVkKCJjb3B5Iikpe3UuYXBwZW5kVG8oZS50YWJsZSgpLmNvbnRhaW5lcigpKSxwWzBdLmZvY3VzKCkscFswXS5zZWxlY3QoKTt0cnl7dmFyIGI9ZG9jdW1lbnQuZXhlY0NvbW1hbmQoImNvcHkiKTtpZih1LnJlbW92ZSgpLGIpcmV0dXJuIHIuY29weVN1Y2Nlc3MmJmUuYnV0dG9ucy5pbmZvKGUuaTE4bigiYnV0dG9ucy5jb3B5VGl0bGUiLCJDb3B5IHRvIGNsaXBib2FyZCIpLGUuaTE4bigiYnV0dG9ucy5jb3B5U3VjY2VzcyIsezE6IkNvcGllZCBvbmUgcm93IHRvIGNsaXBib2FyZCIsXzoiQ29waWVkICVkIHJvd3MgdG8gY2xpcGJvYXJkIn0saS5yb3dzKSwyZTMpLHZvaWQgcygpfWNhdGNoe319ZnVuY3Rpb24gZygpe0Mub2ZmKCJjbGljay5idXR0b25zLWNvcHkiKSxzZShkb2N1bWVudCkub2ZmKCIuYnV0dG9ucy1jb3B5IiksZS5idXR0b25zLmluZm8oITEpfXZhciBtPXNlKCI8c3Bhbj4iK2UuaTE4bigiYnV0dG9ucy5jb3B5S2V5cyIsIlByZXNzIDxpPmN0cmw8L2k+IG9yIDxpPlx1MjMxODwvaT4gKyA8aT5DPC9pPiB0byBjb3B5IHRoZSB0YWJsZSBkYXRhPGJyPnRvIHlvdXIgc3lzdGVtIGNsaXBib2FyZC48YnI+PGJyPlRvIGNhbmNlbCwgY2xpY2sgdGhpcyBtZXNzYWdlIG9yIHByZXNzIGVzY2FwZS4iKSsiPC9zcGFuPiIpLmFwcGVuZCh1KSxDPShlLmJ1dHRvbnMuaW5mbyhlLmkxOG4oImJ1dHRvbnMuY29weVRpdGxlIiwiQ29weSB0byBjbGlwYm9hcmQiKSxtLDApLHBbMF0uZm9jdXMoKSxwWzBdLnNlbGVjdCgpLHNlKG0pLmNsb3Nlc3QoIi5kdC1idXR0b24taW5mbyIpKTtDLm9uKCJjbGljay5idXR0b25zLWNvcHkiLGZ1bmN0aW9uKCl7ZygpLHMoKX0pLHNlKGRvY3VtZW50KS5vbigia2V5ZG93bi5idXR0b25zLWNvcHkiLGZ1bmN0aW9uKHkpe3kua2V5Q29kZT09PTI3JiYoZygpLHMoKSl9KS5vbigiY29weS5idXR0b25zLWNvcHkgY3V0LmJ1dHRvbnMtY29weSIsZnVuY3Rpb24oKXtnKCkscygpfSl9LGFzeW5jOjEwMCxjb3B5U3VjY2VzczohMCxleHBvcnRPcHRpb25zOnt9LGZpZWxkU2VwYXJhdG9yOiIJIixmaWVsZEJvdW5kYXJ5OiIiLGhlYWRlcjohMCxmb290ZXI6ITAsdGl0bGU6IioiLG1lc3NhZ2VUb3A6IioiLG1lc3NhZ2VCb3R0b206IioifSxhdC5leHQuYnV0dG9ucy5jc3ZIdG1sNT17Ym9tOiExLGNsYXNzTmFtZToiYnV0dG9ucy1jc3YgYnV0dG9ucy1odG1sNSIsYXZhaWxhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5GaWxlUmVhZGVyIT09dm9pZCAwJiZ3aW5kb3cuQmxvYn0sdGV4dDpmdW5jdGlvbih0KXtyZXR1cm4gdC5pMThuKCJidXR0b25zLmNzdiIsIkNTViIpfSxhY3Rpb246ZnVuY3Rpb24odCxlLG4scixzKXt2YXIgaT1OcyhlLHIpLnN0cixvPWUuYnV0dG9ucy5leHBvcnRJbmZvKHIpLHU9ci5jaGFyc2V0O3IuY3VzdG9taXplJiYoaT1yLmN1c3RvbWl6ZShpLHIsZSkpLHU9dSE9PSExPyh1PXV8fGRvY3VtZW50LmNoYXJhY3RlclNldHx8ZG9jdW1lbnQuY2hhcnNldCkmJiI7Y2hhcnNldD0iK3U6IiIsci5ib20mJihpPSJcdUZFRkYiK2kpLFdyKG5ldyBCbG9iKFtpXSx7dHlwZToidGV4dC9jc3YiK3V9KSxvLmZpbGVuYW1lLCEwKSxzKCl9LGFzeW5jOjEwMCxmaWxlbmFtZToiKiIsZXh0ZW5zaW9uOiIuY3N2IixleHBvcnRPcHRpb25zOnt9LGZpZWxkU2VwYXJhdG9yOiIsIixmaWVsZEJvdW5kYXJ5OiciJyxlc2NhcGVDaGFyOiciJyxjaGFyc2V0Om51bGwsaGVhZGVyOiEwLGZvb3RlcjohMH0sYXQuZXh0LmJ1dHRvbnMuZXhjZWxIdG1sNT17Y2xhc3NOYW1lOiJidXR0b25zLWV4Y2VsIGJ1dHRvbnMtaHRtbDUiLGF2YWlsYWJsZTpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuRmlsZVJlYWRlciE9PXZvaWQgMCYmWmkoKSE9PXZvaWQgMCYmIU9zKCkmJkdyfSx0ZXh0OmZ1bmN0aW9uKHQpe3JldHVybiB0LmkxOG4oImJ1dHRvbnMuZXhjZWwiLCJFeGNlbCIpfSxhY3Rpb246ZnVuY3Rpb24odCxlLG4scixzKXtmdW5jdGlvbiBpKFEpe3JldHVybiBRPVZzW1FdLHNlLnBhcnNlWE1MKFEpfWZ1bmN0aW9uIG8oUSl7Zz1EZShDLCJyb3ciLHthdHRyOntyOmI9bSsxfX0pO2Zvcih2YXIgRT0wLCQ9US5sZW5ndGg7RTwkO0UrKyl7dmFyIHc9b3IoRSkrIiIrYixrPW51bGw7aWYoUVtFXT09PW51bGx8fFFbRV09PT12b2lkIDB8fFFbRV09PT0iIil7aWYoci5jcmVhdGVFbXB0eUNlbGxzIT09ITApY29udGludWU7UVtFXT0iIn12YXIgUz1RW0VdO1FbRV09dHlwZW9mIFFbRV0udHJpbT09ImZ1bmN0aW9uIj9RW0VdLnRyaW0oKTpRW0VdO2Zvcih2YXIgQj0wLEw9RXMubGVuZ3RoO0I8TDtCKyspe3ZhciBSPUVzW0JdO2lmKFFbRV0ubWF0Y2gmJiFRW0VdLm1hdGNoKC9eMFxkKy8pJiZRW0VdLm1hdGNoKFIubWF0Y2gpKXt2YXIgcT1RW0VdLnJlcGxhY2UoL1teXGRcLlwtXS9nLCIiKTtSLmZtdCYmKHE9Ui5mbXQocSkpLGs9RGUoQywiYyIse2F0dHI6e3I6dyxzOlIuc3R5bGV9LGNoaWxkcmVuOltEZShDLCJ2Iix7dGV4dDpxfSldfSk7YnJlYWt9fWs9a3x8KHR5cGVvZiBRW0VdPT0ibnVtYmVyInx8UVtFXS5tYXRjaCYmUVtFXS5tYXRjaCgvXi0/XGQrKFwuXGQrKT8oW2VFXVwtP1xkKyk/JC8pJiYhUVtFXS5tYXRjaCgvXjBcZCsvKT9EZShDLCJjIix7YXR0cjp7dDoibiIscjp3fSxjaGlsZHJlbjpbRGUoQywidiIse3RleHQ6UVtFXX0pXX0pOihTPVMucmVwbGFjZT9TLnJlcGxhY2UoL1tceDAwLVx4MDlceDBCXHgwQ1x4MEUtXHgxRlx4N0YtXHg5Rl0vZywiIik6UyxEZShDLCJjIix7YXR0cjp7dDoiaW5saW5lU3RyIixyOnd9LGNoaWxkcmVuOntyb3c6RGUoQywiaXMiLHtjaGlsZHJlbjp7cm93OkRlKEMsInQiLHt0ZXh0OlMsYXR0cjp7InhtbDpzcGFjZSI6InByZXNlcnZlIn19KX19KX19KSkpLGcuYXBwZW5kQ2hpbGQoayl9eS5hcHBlbmRDaGlsZChnKSxtKyt9ZnVuY3Rpb24gdShRKXtRLmZvckVhY2goZnVuY3Rpb24oRSl7byhFLm1hcChmdW5jdGlvbigkKXtyZXR1cm4gJD8kLnRpdGxlOiIifSkpLHNlKCJyb3c6bGFzdCBjIixDKS5hdHRyKCJzIiwiMiIpLEUuZm9yRWFjaChmdW5jdGlvbigkLHcpeyQmJigxPCQuY29sU3Bhbnx8MTwkLnJvd1NwYW4pJiZVcihDLG0sdywkLnJvd1NwYW4sJC5jb2xTcGFuKX0pfSl9dmFyIHAsYixnLG09MCxDPWkoInhsL3dvcmtzaGVldHMvc2hlZXQxLnhtbCIpLHk9Qy5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2hlZXREYXRhIilbMF0sVD17X3JlbHM6eyIucmVscyI6aSgiX3JlbHMvLnJlbHMiKX0seGw6e19yZWxzOnsid29ya2Jvb2sueG1sLnJlbHMiOmkoInhsL19yZWxzL3dvcmtib29rLnhtbC5yZWxzIil9LCJ3b3JrYm9vay54bWwiOmkoInhsL3dvcmtib29rLnhtbCIpLCJzdHlsZXMueG1sIjppKCJ4bC9zdHlsZXMueG1sIiksd29ya3NoZWV0czp7InNoZWV0MS54bWwiOkN9fSwiW0NvbnRlbnRfVHlwZXNdLnhtbCI6aSgiW0NvbnRlbnRfVHlwZXNdLnhtbCIpfSxQPWUuYnV0dG9ucy5leHBvcnREYXRhKHIuZXhwb3J0T3B0aW9ucyksYz1lLmJ1dHRvbnMuZXhwb3J0SW5mbyhyKTtjLnRpdGxlJiYobyhbYy50aXRsZV0pLFVyKEMsbSwwLDEsUC5oZWFkZXIubGVuZ3RoKSxzZSgicm93Omxhc3QgYyIsQykuYXR0cigicyIsIjUxIikpLGMubWVzc2FnZVRvcCYmKG8oW2MubWVzc2FnZVRvcF0pLFVyKEMsbSwwLDEsUC5oZWFkZXIubGVuZ3RoKSksci5oZWFkZXImJnUoUC5oZWFkZXJTdHJ1Y3R1cmUpO2Zvcih2YXIgVT1tLGw9MCxoPVAuYm9keS5sZW5ndGg7bDxoO2wrKylvKFAuYm9keVtsXSk7cD1tLHIuZm9vdGVyJiZQLmZvb3RlciYmdShQLmZvb3RlclN0cnVjdHVyZSksYy5tZXNzYWdlQm90dG9tJiYobyhbYy5tZXNzYWdlQm90dG9tXSksVXIoQyxtLDAsMSxQLmhlYWRlci5sZW5ndGgpKTt2YXIgXz1EZShDLCJjb2xzIik7c2UoIndvcmtzaGVldCIsQykucHJlcGVuZChfKTtmb3IodmFyIEY9MCxPPVAuaGVhZGVyLmxlbmd0aDtGPE87RisrKV8uYXBwZW5kQ2hpbGQoRGUoQywiY29sIix7YXR0cjp7bWluOkYrMSxtYXg6RisxLHdpZHRoOlpsKFAsRiksY3VzdG9tV2lkdGg6MX19KSk7dmFyIGY9VC54bFsid29ya2Jvb2sueG1sIl07c2UoInNoZWV0cyBzaGVldCIsZikuYXR0cigibmFtZSIsQnMocikpLHIuYXV0b0ZpbHRlciYmKHNlKCJtZXJnZUNlbGxzIixDKS5iZWZvcmUoRGUoQywiYXV0b0ZpbHRlciIse2F0dHI6e3JlZjoiQSIrVSsiOiIrb3IoUC5oZWFkZXIubGVuZ3RoLTEpK3B9fSkpLHNlKCJkZWZpbmVkTmFtZXMiLGYpLmFwcGVuZChEZShmLCJkZWZpbmVkTmFtZSIse2F0dHI6e25hbWU6Il94bG5tLl9GaWx0ZXJEYXRhYmFzZSIsbG9jYWxTaGVldElkOiIwIixoaWRkZW46MX0sdGV4dDoiJyIrQnMocikucmVwbGFjZSgvJy9nLCInJyIpKyInISRBJCIrVSsiOiIrb3IoUC5oZWFkZXIubGVuZ3RoLTEpK3B9KSkpLHIuY3VzdG9taXplJiZyLmN1c3RvbWl6ZShULHIsZSksc2UoIm1lcmdlQ2VsbHMiLEMpLmNoaWxkcmVuKCkubGVuZ3RoPT09MCYmc2UoIm1lcmdlQ2VsbHMiLEMpLnJlbW92ZSgpO3ZhciBmPW5ldyhaaSgpKSxVPXtjb21wcmVzc2lvbjoiREVGTEFURSIsdHlwZToiYmxvYiIsbWltZVR5cGU6ImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0In0sWD0oTXMoZixUKSxjLmZpbGVuYW1lKTsxNzU8WCYmKFg9WC5zdWJzdHIoMCwxNzUpKSxyLmN1c3RvbWl6ZVppcCYmci5jdXN0b21pemVaaXAoZixQLFgpLGYuZ2VuZXJhdGVBc3luYz9mLmdlbmVyYXRlQXN5bmMoVSkudGhlbihmdW5jdGlvbihRKXtXcihRLFgpLHMoKX0pOihXcihmLmdlbmVyYXRlKFUpLFgpLHMoKSl9LGFzeW5jOjEwMCxmaWxlbmFtZToiKiIsZXh0ZW5zaW9uOiIueGxzeCIsZXhwb3J0T3B0aW9uczp7fSxoZWFkZXI6ITAsZm9vdGVyOiEwLHRpdGxlOiIqIixtZXNzYWdlVG9wOiIqIixtZXNzYWdlQm90dG9tOiIqIixjcmVhdGVFbXB0eUNlbGxzOiExLGF1dG9GaWx0ZXI6ITEsc2hlZXROYW1lOiIifSxhdC5leHQuYnV0dG9ucy5wZGZIdG1sNT17Y2xhc3NOYW1lOiJidXR0b25zLXBkZiBidXR0b25zLWh0bWw1IixhdmFpbGFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LkZpbGVSZWFkZXIhPT12b2lkIDAmJktpKCl9LHRleHQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQuaTE4bigiYnV0dG9ucy5wZGYiLCJQREYiKX0sYWN0aW9uOmZ1bmN0aW9uKHQsbSxuLHIscyl7dmFyIGk9bS5idXR0b25zLmV4cG9ydERhdGEoci5leHBvcnRPcHRpb25zKSxvPW0uYnV0dG9ucy5leHBvcnRJbmZvKHIpLHU9W107ci5oZWFkZXImJmkuaGVhZGVyU3RydWN0dXJlLmZvckVhY2goZnVuY3Rpb24oQyl7dS5wdXNoKEMubWFwKGZ1bmN0aW9uKHkpe3JldHVybiB5P3t0ZXh0OnkudGl0bGUsY29sU3Bhbjp5LmNvbHNwYW4scm93U3Bhbjp5LnJvd3NwYW4sc3R5bGU6InRhYmxlSGVhZGVyIn06e319KSl9KTtmb3IodmFyIHA9MCxiPWkuYm9keS5sZW5ndGg7cDxiO3ArKyl1LnB1c2goaS5ib2R5W3BdLm1hcChmdW5jdGlvbihDKXtyZXR1cm57dGV4dDpDPT1udWxsPyIiOnR5cGVvZiBDPT0ic3RyaW5nIj9DOkMudG9TdHJpbmcoKX19KSk7ci5mb290ZXImJmkuZm9vdGVyU3RydWN0dXJlLmZvckVhY2goZnVuY3Rpb24oQyl7dS5wdXNoKEMubWFwKGZ1bmN0aW9uKHkpe3JldHVybiB5P3t0ZXh0OnkudGl0bGUsY29sU3Bhbjp5LmNvbHNwYW4scm93U3Bhbjp5LnJvd3NwYW4sc3R5bGU6InRhYmxlSGVhZGVyIn06e319KSl9KTt2YXIgZz17cGFnZVNpemU6ci5wYWdlU2l6ZSxwYWdlT3JpZW50YXRpb246ci5vcmllbnRhdGlvbixjb250ZW50Olt7c3R5bGU6InRhYmxlIix0YWJsZTp7aGVhZGVyUm93czppLmhlYWRlclN0cnVjdHVyZS5sZW5ndGgsZm9vdGVyUm93czppLmZvb3RlclN0cnVjdHVyZS5sZW5ndGgsYm9keTp1fSxsYXlvdXQ6e2hMaW5lV2lkdGg6ZnVuY3Rpb24oQyx5KXtyZXR1cm4gQz09PTB8fEM9PT15LnRhYmxlLmJvZHkubGVuZ3RoPzA6LjV9LHZMaW5lV2lkdGg6ZnVuY3Rpb24oKXtyZXR1cm4gMH0saExpbmVDb2xvcjpmdW5jdGlvbihDLHkpe3JldHVybiBDPT09eS50YWJsZS5oZWFkZXJSb3dzfHxDPT09eS50YWJsZS5ib2R5Lmxlbmd0aC15LnRhYmxlLmZvb3RlclJvd3M/IiMzMzMiOiIjZGRkIn0sZmlsbENvbG9yOmZ1bmN0aW9uKEMpe3JldHVybiBDPGkuaGVhZGVyU3RydWN0dXJlLmxlbmd0aD8iI2ZmZiI6QyUyPT0wPyIjZjNmM2YzIjpudWxsfSxwYWRkaW5nVG9wOmZ1bmN0aW9uKCl7cmV0dXJuIDV9LHBhZGRpbmdCb3R0b206ZnVuY3Rpb24oKXtyZXR1cm4gNX19fV0sc3R5bGVzOnt0YWJsZUhlYWRlcjp7Ym9sZDohMCxmb250U2l6ZToxMSxhbGlnbm1lbnQ6ImNlbnRlciJ9LHRhYmxlRm9vdGVyOntib2xkOiEwLGZvbnRTaXplOjExfSx0YWJsZTp7bWFyZ2luOlswLDUsMCw1XX0sdGl0bGU6e2FsaWdubWVudDoiY2VudGVyIixmb250U2l6ZToxM30sbWVzc2FnZTp7fX0sZGVmYXVsdFN0eWxlOntmb250U2l6ZToxMH19LG09KG8ubWVzc2FnZVRvcCYmZy5jb250ZW50LnVuc2hpZnQoe3RleHQ6by5tZXNzYWdlVG9wLHN0eWxlOiJtZXNzYWdlIixtYXJnaW46WzAsMCwwLDEyXX0pLG8ubWVzc2FnZUJvdHRvbSYmZy5jb250ZW50LnB1c2goe3RleHQ6by5tZXNzYWdlQm90dG9tLHN0eWxlOiJtZXNzYWdlIixtYXJnaW46WzAsMCwwLDEyXX0pLG8udGl0bGUmJmcuY29udGVudC51bnNoaWZ0KHt0ZXh0Om8udGl0bGUsc3R5bGU6InRpdGxlIixtYXJnaW46WzAsMCwwLDEyXX0pLHIuY3VzdG9taXplJiZyLmN1c3RvbWl6ZShnLHIsbSksS2koKS5jcmVhdGVQZGYoZykpO3IuZG93bmxvYWQhPT0ib3BlbiJ8fE9zKCk/bS5kb3dubG9hZChvLmZpbGVuYW1lKTptLm9wZW4oKSxzKCl9LGFzeW5jOjEwMCx0aXRsZToiKiIsZmlsZW5hbWU6IioiLGV4dGVuc2lvbjoiLnBkZiIsZXhwb3J0T3B0aW9uczp7fSxvcmllbnRhdGlvbjoicG9ydHJhaXQiLHBhZ2VTaXplOm5hdmlnYXRvci5sYW5ndWFnZT09PSJlbi1VUyJ8fG5hdmlnYXRvci5sYW5ndWFnZT09PSJlbi1DQSI/IkxFVFRFUiI6IkE0IixoZWFkZXI6ITAsZm9vdGVyOiEwLG1lc3NhZ2VUb3A6IioiLG1lc3NhZ2VCb3R0b206IioiLGN1c3RvbWl6ZTpudWxsLGRvd25sb2FkOiJkb3dubG9hZCJ9O3ZhciBIcz1pZShhZSgpLDEpO3ZhciBqbj1Icy5kZWZhdWx0LHpuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKSxLbD1mdW5jdGlvbih0KXtyZXR1cm4gdD1qbih0KS5jbG9uZSgpWzBdLHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJsaW5rIiYmKHQuaHJlZj1Vcyh0LmhyZWYpKSx0Lm91dGVySFRNTH0sVXM9ZnVuY3Rpb24odCl7cmV0dXJuIHpuLmhyZWY9dCx0PXpuLmhvc3QsdC5pbmRleE9mKCIvIik9PT0tMSYmem4ucGF0aG5hbWUuaW5kZXhPZigiLyIpIT09MCYmKHQrPSIvIiksem4ucHJvdG9jb2wrIi8vIit0K3puLnBhdGhuYW1lK3puLnNlYXJjaH07YXQuZXh0LmJ1dHRvbnMucHJpbnQ9e2NsYXNzTmFtZToiYnV0dG9ucy1wcmludCIsdGV4dDpmdW5jdGlvbih0KXtyZXR1cm4gdC5pMThuKCJidXR0b25zLnByaW50IiwiUHJpbnQiKX0sYWN0aW9uOmZ1bmN0aW9uKHQsZSxuLHIscyl7dmFyIGk9ZS5idXR0b25zLmV4cG9ydERhdGEoam4uZXh0ZW5kKHtkZWNvZGVFbnRpdGllczohMX0sci5leHBvcnRPcHRpb25zKSksbz1lLmJ1dHRvbnMuZXhwb3J0SW5mbyhyKSx1PWUuY29sdW1ucyhyLmV4cG9ydE9wdGlvbnMuY29sdW1ucykubm9kZXMoKS5tYXAoZnVuY3Rpb24oeSl7cmV0dXJuIHkuY2xhc3NOYW1lfSkudG9BcnJheSgpLHA9Jzx0YWJsZSBjbGFzcz0iJytlLnRhYmxlKCkubm9kZSgpLmNsYXNzTmFtZSsnIj4nO3IuaGVhZGVyJiYocCs9Ijx0aGVhZD4iK2kuaGVhZGVyU3RydWN0dXJlLm1hcChmdW5jdGlvbih5KXtyZXR1cm4iPHRyPiIreS5tYXAoZnVuY3Rpb24oVCl7cmV0dXJuIFQ/Jzx0aCBjb2xzcGFuPSInK1QuY29sc3BhbisnIiByb3dzcGFuPSInK1Qucm93c3BhbisnIj4nK1QudGl0bGUrIjwvdGg+IjoiIn0pLmpvaW4oIiIpKyI8L3RyPiJ9KS5qb2luKCIiKSsiPC90aGVhZD4iKSxwKz0iPHRib2R5PiI7Zm9yKHZhciBiPTAsZz1pLmJvZHkubGVuZ3RoO2I8ZztiKyspcCs9ZnVuY3Rpb24oeSxUKXtmb3IodmFyIFA9Ijx0cj4iLGM9MCxsPXkubGVuZ3RoO2M8bDtjKyspe3ZhciBoPXlbY109PT1udWxsfHx5W2NdPT09dm9pZCAwPyIiOnlbY107UCs9IjwiK1QrIiAiKyh1W2NdPydjbGFzcz0iJyt1W2NdKyciJzoiIikrIj4iK2grIjwvIitUKyI+In1yZXR1cm4gUCsiPC90cj4ifShpLmJvZHlbYl0sInRkIik7cCs9IjwvdGJvZHk+IixyLmZvb3RlciYmaS5mb290ZXImJihwKz0iPHRmb290PiIraS5mb290ZXJTdHJ1Y3R1cmUubWFwKGZ1bmN0aW9uKHkpe3JldHVybiI8dHI+Iit5Lm1hcChmdW5jdGlvbihUKXtyZXR1cm4gVD8nPHRoIGNvbHNwYW49IicrVC5jb2xzcGFuKyciIHJvd3NwYW49IicrVC5yb3dzcGFuKyciPicrVC50aXRsZSsiPC90aD4iOiIifSkuam9pbigiIikrIjwvdHI+In0pLmpvaW4oIiIpKyI8L3Rmb290PiIpLHArPSI8L3RhYmxlPiI7dmFyIG09d2luZG93Lm9wZW4oIiIsIiIpO2lmKG0pe20uZG9jdW1lbnQuY2xvc2UoKTt2YXIgQz0iPHRpdGxlPiIrby50aXRsZSsiPC90aXRsZT4iO2puKCJzdHlsZSwgbGluayIpLmVhY2goZnVuY3Rpb24oKXtDKz1LbCh0aGlzKX0pO3RyeXttLmRvY3VtZW50LmhlYWQuaW5uZXJIVE1MPUN9Y2F0Y2h7am4obS5kb2N1bWVudC5oZWFkKS5odG1sKEMpfXIuY3VzdG9tU2NyaXB0cyYmci5jdXN0b21TY3JpcHRzLmZvckVhY2goZnVuY3Rpb24oeSl7dmFyIFQ9bS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtULnNyYz15LG0uZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXS5hcHBlbmRDaGlsZChUKX0pLG0uZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxoMT4iK28udGl0bGUrIjwvaDE+PGRpdj4iKyhvLm1lc3NhZ2VUb3B8fCIiKSsiPC9kaXY+IitwKyI8ZGl2PiIrKG8ubWVzc2FnZUJvdHRvbXx8IiIpKyI8L2Rpdj4iLGpuKG0uZG9jdW1lbnQuYm9keSkuYWRkQ2xhc3MoImR0LXByaW50LXZpZXciKSxqbigiaW1nIixtLmRvY3VtZW50LmJvZHkpLmVhY2goZnVuY3Rpb24oeSxUKXtULnNldEF0dHJpYnV0ZSgic3JjIixVcyhULmdldEF0dHJpYnV0ZSgic3JjIikpKX0pLHIuY3VzdG9taXplJiZyLmN1c3RvbWl6ZShtLHIsZSksbS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ci5hdXRvUHJpbnQmJihtLnByaW50KCksbS5jbG9zZSgpKX0sMWUzKSxzKCl9ZWxzZSBlLmJ1dHRvbnMuaW5mbyhlLmkxOG4oImJ1dHRvbnMucHJpbnRFcnJvclRpdGxlIiwiVW5hYmxlIHRvIG9wZW4gcHJpbnQgdmlldyIpLGUuaTE4bigiYnV0dG9ucy5wcmludEVycm9yTXNnIiwiUGxlYXNlIGFsbG93IHBvcHVwcyBpbiB5b3VyIGJyb3dzZXIgZm9yIHRoaXMgc2l0ZSB0byBiZSBhYmxlIHRvIHZpZXcgdGhlIHByaW50IHZpZXcuIiksNWUzKX0sYXN5bmM6MTAwLHRpdGxlOiIqIixtZXNzYWdlVG9wOiIqIixtZXNzYWdlQm90dG9tOiIqIixleHBvcnRPcHRpb25zOnt9LGhlYWRlcjohMCxmb290ZXI6ITAsYXV0b1ByaW50OiEwLGN1c3RvbWl6ZTpudWxsfTt2YXIgV3M9aWUoYWUoKSwxKTt2YXIgSmw9V3MuZGVmYXVsdDtKbC5leHRlbmQoYXQuZXh0LmJ1dHRvbnMse2NvbHZpczpmdW5jdGlvbih0LGUpe3ZhciBuPW51bGwscj17ZXh0ZW5kOiJjb2xsZWN0aW9uIixpbml0OmZ1bmN0aW9uKHMsaSl7bj1pfSx0ZXh0OmZ1bmN0aW9uKHMpe3JldHVybiBzLmkxOG4oImJ1dHRvbnMuY29sdmlzIiwiQ29sdW1uIHZpc2liaWxpdHkiKX0sY2xhc3NOYW1lOiJidXR0b25zLWNvbHZpcyIsY2xvc2VCdXR0b246ITEsYnV0dG9uczpbe2V4dGVuZDoiY29sdW1uc1RvZ2dsZSIsY29sdW1uczplLmNvbHVtbnMsY29sdW1uVGV4dDplLmNvbHVtblRleHR9XX07cmV0dXJuIHQub24oImNvbHVtbi1yZW9yZGVyLmR0IitlLm5hbWVzcGFjZSxmdW5jdGlvbigpe3QuYnV0dG9uKG51bGwsdC5idXR0b24obnVsbCxuKS5ub2RlKCkpLmNvbGxlY3Rpb25SZWJ1aWxkKFt7ZXh0ZW5kOiJjb2x1bW5zVG9nZ2xlIixjb2x1bW5zOmUuY29sdW1ucyxjb2x1bW5UZXh0OmUuY29sdW1uVGV4dH1dKX0pLHJ9LGNvbHVtbnNUb2dnbGU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5jb2x1bW5zKGUuY29sdW1ucykuaW5kZXhlcygpLm1hcChmdW5jdGlvbihuKXtyZXR1cm57ZXh0ZW5kOiJjb2x1bW5Ub2dnbGUiLGNvbHVtbnM6bixjb2x1bW5UZXh0OmUuY29sdW1uVGV4dH19KS50b0FycmF5KCl9LGNvbHVtblRvZ2dsZTpmdW5jdGlvbih0LGUpe3JldHVybntleHRlbmQ6ImNvbHVtblZpc2liaWxpdHkiLGNvbHVtbnM6ZS5jb2x1bW5zLGNvbHVtblRleHQ6ZS5jb2x1bW5UZXh0fX0sY29sdW1uc1Zpc2liaWxpdHk6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5jb2x1bW5zKGUuY29sdW1ucykuaW5kZXhlcygpLm1hcChmdW5jdGlvbihuKXtyZXR1cm57ZXh0ZW5kOiJjb2x1bW5WaXNpYmlsaXR5Iixjb2x1bW5zOm4sdmlzaWJpbGl0eTplLnZpc2liaWxpdHksY29sdW1uVGV4dDplLmNvbHVtblRleHR9fSkudG9BcnJheSgpfSxjb2x1bW5WaXNpYmlsaXR5Ontjb2x1bW5zOnZvaWQgMCx0ZXh0OmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbi5fY29sdW1uVGV4dCh0LG4pfSxjbGFzc05hbWU6ImJ1dHRvbnMtY29sdW1uVmlzaWJpbGl0eSIsYWN0aW9uOmZ1bmN0aW9uKHQscyxuLHIpe3ZhciBzPXMuY29sdW1ucyhyLmNvbHVtbnMpLGk9cy52aXNpYmxlKCk7cy52aXNpYmxlKHIudmlzaWJpbGl0eSE9PXZvaWQgMD9yLnZpc2liaWxpdHk6IShpLmxlbmd0aCYmaVswXSkpfSxpbml0OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzO2UuYXR0cigiZGF0YS1jdi1pZHgiLG4uY29sdW1ucyksdC5vbigiY29sdW1uLXZpc2liaWxpdHkuZHQiK24ubmFtZXNwYWNlLGZ1bmN0aW9uKHMsaSl7aS5iRGVzdHJveWluZ3x8aS5uVGFibGUhPXQuc2V0dGluZ3MoKVswXS5uVGFibGV8fHIuYWN0aXZlKHQuY29sdW1uKG4uY29sdW1ucykudmlzaWJsZSgpKX0pLm9uKCJjb2x1bW4tcmVvcmRlci5kdCIrbi5uYW1lc3BhY2UsZnVuY3Rpb24oKXtuLmRlc3Ryb3lpbmd8fHQuY29sdW1ucyhuLmNvbHVtbnMpLmNvdW50KCk9PT0xJiYoci50ZXh0KG4uX2NvbHVtblRleHQodCxuKSksci5hY3RpdmUodC5jb2x1bW4obi5jb2x1bW5zKS52aXNpYmxlKCkpKX0pLHRoaXMuYWN0aXZlKHQuY29sdW1uKG4uY29sdW1ucykudmlzaWJsZSgpKX0sZGVzdHJveTpmdW5jdGlvbih0LGUsbil7dC5vZmYoImNvbHVtbi12aXNpYmlsaXR5LmR0IituLm5hbWVzcGFjZSkub2ZmKCJjb2x1bW4tcmVvcmRlci5kdCIrbi5uYW1lc3BhY2UpfSxfY29sdW1uVGV4dDpmdW5jdGlvbih0LGUpe3ZhciBuLHI7cmV0dXJuIHR5cGVvZiBlLnRleHQ9PSJzdHJpbmciP2UudGV4dDoocj10LmNvbHVtbihlLmNvbHVtbnMpLnRpdGxlKCksbj10LmNvbHVtbihlLmNvbHVtbnMpLmluZGV4KCkscj1yLnJlcGxhY2UoL1xuL2csIiAiKS5yZXBsYWNlKC88YnJccypcLz8+L2dpLCIgIikucmVwbGFjZSgvPHNlbGVjdCguKj8pPFwvc2VsZWN0XHMqPi9naSwiIikscj1hdC5CdXR0b25zLnN0cmlwSHRtbENvbW1lbnRzKHIpLHI9YXQudXRpbC5zdHJpcEh0bWwocikudHJpbSgpLGUuY29sdW1uVGV4dD9lLmNvbHVtblRleHQodCxuLHIpOnIpfX0sY29sdmlzUmVzdG9yZTp7Y2xhc3NOYW1lOiJidXR0b25zLWNvbHZpc1Jlc3RvcmUiLHRleHQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQuaTE4bigiYnV0dG9ucy5jb2x2aXNSZXN0b3JlIiwiUmVzdG9yZSB2aXNpYmlsaXR5Iil9LGluaXQ6ZnVuY3Rpb24odCxlLG4pe3QuY29sdW1ucygpLmV2ZXJ5KGZ1bmN0aW9uKCl7dmFyIHI9dGhpcy5pbml0KCk7ci5fX3Zpc09yaWdpbmFsPT09dm9pZCAwJiYoci5fX3Zpc09yaWdpbmFsPXRoaXMudmlzaWJsZSgpKX0pfSxhY3Rpb246ZnVuY3Rpb24odCxlLG4scil7ZS5jb2x1bW5zKCkuZXZlcnkoZnVuY3Rpb24ocyl7dmFyIGk9dGhpcy5pbml0KCk7dGhpcy52aXNpYmxlKGkuX192aXNPcmlnaW5hbCl9KX19LGNvbHZpc0dyb3VwOntjbGFzc05hbWU6ImJ1dHRvbnMtY29sdmlzR3JvdXAiLGFjdGlvbjpmdW5jdGlvbih0LGUsbixyKXtlLmNvbHVtbnMoci5zaG93KS52aXNpYmxlKCEwLCExKSxlLmNvbHVtbnMoci5oaWRlKS52aXNpYmxlKCExLCExKSxlLmNvbHVtbnMuYWRqdXN0KCl9LHNob3c6W10saGlkZTpbXX19KTt2YXIgUWw9aWUoYWUoKSwxKTt2YXIgR3M9aWUoYWUoKSwxKTt2YXIgdW49R3MuZGVmYXVsdDsoZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7dmFyIHQsZTtmdW5jdGlvbiBuKG8pe3Q9byxlPXQuZm4uZGF0YVRhYmxlfXZhciByPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbyh1LHApe3ZhciBiPXRoaXM7aWYoIWV8fCFlLnZlcnNpb25DaGVja3x8IWUudmVyc2lvbkNoZWNrKCIyIikpdGhyb3cgbmV3IEVycm9yKCJGaXhlZENvbHVtbnMgcmVxdWlyZXMgRGF0YVRhYmxlcyAyIG9yIG5ld2VyIik7dmFyIGc9bmV3IGUuQXBpKHUpO3RoaXMuY2xhc3Nlcz10LmV4dGVuZCghMCx7fSxvLmNsYXNzZXMpLHRoaXMuYz10LmV4dGVuZCghMCx7fSxvLmRlZmF1bHRzLHApLHRoaXMucz17ZHQ6ZyxydGw6dChnLnRhYmxlKCkubm9kZSgpKS5jc3MoImRpcmVjdGlvbiIpPT09InJ0bCJ9LHAmJnAubGVmdENvbHVtbnMhPT12b2lkIDAmJihwLmxlZnQ9cC5sZWZ0Q29sdW1ucykscCYmcC5sZWZ0IT09dm9pZCAwJiYodGhpcy5jW3RoaXMucy5ydGw/ImVuZCI6InN0YXJ0Il09cC5sZWZ0KSxwJiZwLnJpZ2h0Q29sdW1ucyE9PXZvaWQgMCYmKHAucmlnaHQ9cC5yaWdodENvbHVtbnMpLHAmJnAucmlnaHQhPT12b2lkIDAmJih0aGlzLmNbdGhpcy5zLnJ0bD8ic3RhcnQiOiJlbmQiXT1wLnJpZ2h0KSx0aGlzLmRvbT17Ym90dG9tQmxvY2tlcjp0KCI8ZGl2PiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5ib3R0b21CbG9ja2VyKSx0b3BCbG9ja2VyOnQoIjxkaXY+IikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnRvcEJsb2NrZXIpLHNjcm9sbGVyOnQoImRpdi5kdC1zY3JvbGwtYm9keSIsdGhpcy5zLmR0LnRhYmxlKCkuY29udGFpbmVyKCkpfSx0aGlzLnMuZHQuc2V0dGluZ3MoKVswXS5fYkluaXRDb21wbGV0ZT8odGhpcy5fYWRkU3R5bGVzKCksdGhpcy5fc2V0S2V5VGFibGVMaXN0ZW5lcigpKTpnLm9uZSgiaW5pdC5kdC5kdGZjIixmdW5jdGlvbigpe2IuX2FkZFN0eWxlcygpLGIuX3NldEtleVRhYmxlTGlzdGVuZXIoKX0pLGcub24oImNvbHVtbi1zaXppbmcuZHQuZHRmYyBjb2x1bW4tcmVvcmRlci5kdC5kdGZjIGRyYXcuZHQuZHRmYyIsZnVuY3Rpb24oKXtyZXR1cm4gYi5fYWRkU3R5bGVzKCl9KTt2YXIgbT1lLnV0aWwuZGVib3VuY2UoZnVuY3Rpb24oKXtiLl9hZGRTdHlsZXMoKX0sNTApO3JldHVybiBnLm9uKCJjb2x1bW4tdmlzaWJpbGl0eS5kdC5kdGZjIixmdW5jdGlvbigpe20oKX0pLHRoaXMuZG9tLnNjcm9sbGVyLm9uKCJzY3JvbGwuZHRmYyIsZnVuY3Rpb24oKXtyZXR1cm4gYi5fc2Nyb2xsKCl9KSx0aGlzLl9zY3JvbGwoKSxnLnNldHRpbmdzKClbMF0uX2ZpeGVkQ29sdW1ucz10aGlzLGcub24oImRlc3Ryb3kiLGZ1bmN0aW9uKCl7cmV0dXJuIGIuX2Rlc3Ryb3koKX0pLHRoaXN9cmV0dXJuIG8ucHJvdG90eXBlLmVuZD1mdW5jdGlvbih1KXtyZXR1cm4gdSE9PXZvaWQgMD8odT49MCYmdTw9dGhpcy5zLmR0LmNvbHVtbnMoKS5jb3VudCgpJiYodGhpcy5jLmVuZD11LHRoaXMuX2FkZFN0eWxlcygpKSx0aGlzKTp0aGlzLmMuZW5kfSxvLnByb3RvdHlwZS5sZWZ0PWZ1bmN0aW9uKHUpe3JldHVybiB0aGlzLnMucnRsP3RoaXMuZW5kKHUpOnRoaXMuc3RhcnQodSl9LG8ucHJvdG90eXBlLnJpZ2h0PWZ1bmN0aW9uKHUpe3JldHVybiB0aGlzLnMucnRsP3RoaXMuc3RhcnQodSk6dGhpcy5lbmQodSl9LG8ucHJvdG90eXBlLnN0YXJ0PWZ1bmN0aW9uKHUpe3JldHVybiB1IT09dm9pZCAwPyh1Pj0wJiZ1PD10aGlzLnMuZHQuY29sdW1ucygpLmNvdW50KCkmJih0aGlzLmMuc3RhcnQ9dSx0aGlzLl9hZGRTdHlsZXMoKSksdGhpcyk6dGhpcy5jLnN0YXJ0fSxvLnByb3RvdHlwZS5fYWRkU3R5bGVzPWZ1bmN0aW9uKCl7dmFyIHU9dGhpcy5zLmR0LHA9dGhpcyxiPXRoaXMucy5kdC5jb2x1bW5zKCI6dmlzaWJsZSIpLmNvdW50KCksZz11LnRhYmxlKCkuaGVhZGVyLnN0cnVjdHVyZSgiOnZpc2libGUiKSxtPXUudGFibGUoKS5mb290ZXIuc3RydWN0dXJlKCI6dmlzaWJsZSIpLEM9dS5jb2x1bW5zKCI6dmlzaWJsZSIpLndpZHRocygpLnRvQXJyYXkoKSx5PXQodS50YWJsZSgpLm5vZGUoKSkuY2xvc2VzdCgiZGl2LmR0LXNjcm9sbCIpLFQ9dCh1LnRhYmxlKCkubm9kZSgpKS5jbG9zZXN0KCJkaXYuZHQtc2Nyb2xsLWJvZHkiKVswXSxQPXRoaXMucy5ydGwsYz10aGlzLmMuc3RhcnQsbD10aGlzLmMuZW5kLGg9UD9sOmMsXz1QP2M6bCxGPXUuc2V0dGluZ3MoKVswXS5vQnJvd3Nlci5iYXJXaWR0aDtpZih5Lmxlbmd0aD09PTApcmV0dXJuIHRoaXM7VC5vZmZzZXRXaWR0aD09PVQuY2xpZW50V2lkdGgmJihGPTApLHUuY29sdW1ucygiOnZpc2libGUiKS5ldmVyeShmdW5jdGlvbihRKXt2YXIgRT11LmNvbHVtbi5pbmRleCgidG9WaXNpYmxlIixRKSwkO0U8Yz8oJD1wLl9zdW0oQyxFKSxwLl9maXhDb2x1bW4oRSwkLCJzdGFydCIsZyxtLEYpKTpFPj1iLWw/KCQ9cC5fc3VtKEMsYi1FLTEsITApLHAuX2ZpeENvbHVtbihFLCQsImVuZCIsZyxtLEYpKTpwLl9maXhDb2x1bW4oRSwwLCJub25lIixnLG0sRil9KSx0KHUudGFibGUoKS5ub2RlKCkpLnRvZ2dsZUNsYXNzKHAuY2xhc3Nlcy50YWJsZUZpeGVkU3RhcnQsYz4wKS50b2dnbGVDbGFzcyhwLmNsYXNzZXMudGFibGVGaXhlZEVuZCxsPjApLnRvZ2dsZUNsYXNzKHAuY2xhc3Nlcy50YWJsZUZpeGVkTGVmdCxoPjApLnRvZ2dsZUNsYXNzKHAuY2xhc3Nlcy50YWJsZUZpeGVkUmlnaHQsXz4wKTt2YXIgTz11LnRhYmxlKCkuaGVhZGVyKCksZj11LnRhYmxlKCkuZm9vdGVyKCksVT10KE8pLm91dGVySGVpZ2h0KCksWD10KGYpLm91dGVySGVpZ2h0KCk7dGhpcy5kb20udG9wQmxvY2tlci5hcHBlbmRUbyh5KS5jc3MoInRvcCIsMCkuY3NzKHRoaXMucy5ydGw/ImxlZnQiOiJyaWdodCIsMCkuY3NzKCJoZWlnaHQiLFUpLmNzcygid2lkdGgiLEYrMSkuY3NzKCJkaXNwbGF5IixGPyJibG9jayI6Im5vbmUiKSxmJiZ0aGlzLmRvbS5ib3R0b21CbG9ja2VyLmFwcGVuZFRvKHkpLmNzcygiYm90dG9tIiwwKS5jc3ModGhpcy5zLnJ0bD8ibGVmdCI6InJpZ2h0IiwwKS5jc3MoImhlaWdodCIsWCkuY3NzKCJ3aWR0aCIsRisxKS5jc3MoImRpc3BsYXkiLEY/ImJsb2NrIjoibm9uZSIpfSxvLnByb3RvdHlwZS5fZGVzdHJveT1mdW5jdGlvbigpe3RoaXMucy5kdC5vZmYoIi5kdGZjIiksdGhpcy5kb20uc2Nyb2xsZXIub2ZmKCIuZHRmYyIpLHQodGhpcy5zLmR0LnRhYmxlKCkubm9kZSgpKS5yZW1vdmVDbGFzcyh0aGlzLmNsYXNzZXMudGFibGVTY3JvbGxpbmdFbmQrIiAiK3RoaXMuY2xhc3Nlcy50YWJsZVNjcm9sbGluZ0xlZnQrIiAiK3RoaXMuY2xhc3Nlcy50YWJsZVNjcm9sbGluZ1N0YXJ0KyIgIit0aGlzLmNsYXNzZXMudGFibGVTY3JvbGxpbmdSaWdodCksdGhpcy5kb20uYm90dG9tQmxvY2tlci5yZW1vdmUoKSx0aGlzLmRvbS50b3BCbG9ja2VyLnJlbW92ZSgpfSxvLnByb3RvdHlwZS5fZml4Q29sdW1uPWZ1bmN0aW9uKHUscCxiLGcsbSxDKXt2YXIgeT10aGlzLFQ9dGhpcy5zLmR0LFA9ZnVuY3Rpb24oYyxsKXtpZihiPT09Im5vbmUiKWMuY3NzKCJwb3NpdGlvbiIsIiIpLmNzcygibGVmdCIsIiIpLmNzcygicmlnaHQiLCIiKS5yZW1vdmVDbGFzcyh5LmNsYXNzZXMuZml4ZWRFbmQrIiAiK3kuY2xhc3Nlcy5maXhlZExlZnQrIiAiK3kuY2xhc3Nlcy5maXhlZFJpZ2h0KyIgIit5LmNsYXNzZXMuZml4ZWRTdGFydCk7ZWxzZXt2YXIgaD1iPT09InN0YXJ0Ij8ibGVmdCI6InJpZ2h0Ijt5LnMucnRsJiYoaD1iPT09InN0YXJ0Ij8icmlnaHQiOiJsZWZ0Iik7dmFyIF89cDtiPT09ImVuZCImJihsPT09ImhlYWRlciJ8fGw9PT0iZm9vdGVyIikmJihfKz1DKSxjLmNzcygicG9zaXRpb24iLCJzdGlja3kiKS5jc3MoaCxfKS5hZGRDbGFzcyhiPT09InN0YXJ0Ij95LmNsYXNzZXMuZml4ZWRTdGFydDp5LmNsYXNzZXMuZml4ZWRFbmQpLmFkZENsYXNzKGg9PT0ibGVmdCI/eS5jbGFzc2VzLmZpeGVkTGVmdDp5LmNsYXNzZXMuZml4ZWRSaWdodCl9fTtnLmZvckVhY2goZnVuY3Rpb24oYyl7Y1t1XSYmUCh0KGNbdV0uY2VsbCksImhlYWRlciIpfSksUChULmNvbHVtbih1KyI6dmlzaWJsZSIse3BhZ2U6ImN1cnJlbnQifSkubm9kZXMoKS50byQoKSwiYm9keSIpLG0mJm0uZm9yRWFjaChmdW5jdGlvbihjKXtjW3VdJiZQKHQoY1t1XS5jZWxsKSwiZm9vdGVyIil9KX0sby5wcm90b3R5cGUuX3Njcm9sbD1mdW5jdGlvbigpe3ZhciB1PXRoaXMuZG9tLnNjcm9sbGVyWzBdO2lmKHUpe3ZhciBwPXQodGhpcy5zLmR0LnRhYmxlKCkubm9kZSgpKS5hZGQodGhpcy5zLmR0LnRhYmxlKCkuaGVhZGVyKCkucGFyZW50Tm9kZSkuYWRkKHRoaXMucy5kdC50YWJsZSgpLmZvb3RlcigpLnBhcmVudE5vZGUpLmFkZCgiZGl2LmR0LXNjcm9sbC1oZWFkSW5uZXIgdGFibGUiLHRoaXMucy5kdC50YWJsZSgpLmNvbnRhaW5lcigpKS5hZGQoImRpdi5kdC1zY3JvbGwtZm9vdElubmVyIHRhYmxlIix0aGlzLnMuZHQudGFibGUoKS5jb250YWluZXIoKSksYj11LnNjcm9sbExlZnQsZz0hdGhpcy5zLnJ0bCxtPWIhPT0wLEM9dS5zY3JvbGxXaWR0aD51LmNsaWVudFdpZHRoK01hdGguYWJzKGIpKzE7cC50b2dnbGVDbGFzcyh0aGlzLmNsYXNzZXMudGFibGVTY3JvbGxpbmdTdGFydCxtKSxwLnRvZ2dsZUNsYXNzKHRoaXMuY2xhc3Nlcy50YWJsZVNjcm9sbGluZ0VuZCxDKSxwLnRvZ2dsZUNsYXNzKHRoaXMuY2xhc3Nlcy50YWJsZVNjcm9sbGluZ0xlZnQsbSYmZ3x8QyYmIWcpLHAudG9nZ2xlQ2xhc3ModGhpcy5jbGFzc2VzLnRhYmxlU2Nyb2xsaW5nUmlnaHQsQyYmZ3x8bSYmIWcpfX0sby5wcm90b3R5cGUuX3NldEtleVRhYmxlTGlzdGVuZXI9ZnVuY3Rpb24oKXt2YXIgdT10aGlzO3RoaXMucy5kdC5vbigia2V5LWZvY3VzLmR0LmR0ZmMiLGZ1bmN0aW9uKHAsYixnKXt2YXIgbSxDPXQoZy5ub2RlKCkpLm9mZnNldCgpLHk9dS5kb20uc2Nyb2xsZXJbMF0sVD10KHQodS5zLmR0LnRhYmxlKCkubm9kZSgpKS5jbG9zZXN0KCJkaXYuZHQtc2Nyb2xsLWJvZHkiKSk7aWYodS5jLnN0YXJ0PjApe3ZhciBQPXQodS5zLmR0LmNvbHVtbih1LmMuc3RhcnQtMSkuaGVhZGVyKCkpLGM9UC5vZmZzZXQoKSxsPVAub3V0ZXJXaWR0aCgpO3QoZy5ub2RlKCkpLmhhc0NsYXNzKHUuY2xhc3Nlcy5maXhlZExlZnQpP1Quc2Nyb2xsTGVmdCgwKTpDLmxlZnQ8Yy5sZWZ0K2wmJihtPVQuc2Nyb2xsTGVmdCgpLFQuc2Nyb2xsTGVmdChtLShjLmxlZnQrbC1DLmxlZnQpKSl9aWYodS5jLmVuZD4wKXt2YXIgaD11LnMuZHQuY29sdW1ucygpLmRhdGEoKS50b0FycmF5KCkubGVuZ3RoLF89dChnLm5vZGUoKSkub3V0ZXJXaWR0aCgpLEY9dCh1LnMuZHQuY29sdW1uKGgtdS5jLmVuZCkuaGVhZGVyKCkpLE89Ri5vZmZzZXQoKTt0KGcubm9kZSgpKS5oYXNDbGFzcyh1LmNsYXNzZXMuZml4ZWRSaWdodCk/VC5zY3JvbGxMZWZ0KHkuc2Nyb2xsV2lkdGgteS5jbGllbnRXaWR0aCk6Qy5sZWZ0K18+Ty5sZWZ0JiYobT1ULnNjcm9sbExlZnQoKSxULnNjcm9sbExlZnQobS0oTy5sZWZ0LShDLmxlZnQrXykpKSl9fSl9LG8ucHJvdG90eXBlLl9zdW09ZnVuY3Rpb24odSxwLGIpe3JldHVybiBiPT09dm9pZCAwJiYoYj0hMSksYiYmKHU9dS5zbGljZSgpLnJldmVyc2UoKSksdS5zbGljZSgwLHApLnJlZHVjZShmdW5jdGlvbihnLG0pe3JldHVybiBnK219LDApfSxvLnZlcnNpb249IjUuMC4wIixvLmNsYXNzZXM9e2JvdHRvbUJsb2NrZXI6ImR0ZmMtYm90dG9tLWJsb2NrZXIiLGZpeGVkRW5kOiJkdGZjLWZpeGVkLWVuZCIsZml4ZWRMZWZ0OiJkdGZjLWZpeGVkLWxlZnQiLGZpeGVkUmlnaHQ6ImR0ZmMtZml4ZWQtcmlnaHQiLGZpeGVkU3RhcnQ6ImR0ZmMtZml4ZWQtc3RhcnQiLHRhYmxlRml4ZWRFbmQ6ImR0ZmMtaGFzLWVuZCIsdGFibGVGaXhlZExlZnQ6ImR0ZmMtaGFzLWxlZnQiLHRhYmxlRml4ZWRSaWdodDoiZHRmYy1oYXMtcmlnaHQiLHRhYmxlRml4ZWRTdGFydDoiZHRmYy1oYXMtc3RhcnQiLHRhYmxlU2Nyb2xsaW5nRW5kOiJkdGZjLXNjcm9sbGluZy1lbmQiLHRhYmxlU2Nyb2xsaW5nTGVmdDoiZHRmYy1zY3JvbGxpbmctbGVmdCIsdGFibGVTY3JvbGxpbmdSaWdodDoiZHRmYy1zY3JvbGxpbmctcmlnaHQiLHRhYmxlU2Nyb2xsaW5nU3RhcnQ6ImR0ZmMtc2Nyb2xsaW5nLXN0YXJ0Iix0b3BCbG9ja2VyOiJkdGZjLXRvcC1ibG9ja2VyIn0sby5kZWZhdWx0cz17aTE4bjp7YnV0dG9uOiJGaXhlZENvbHVtbnMifSxzdGFydDoxLGVuZDowfSxvfSgpO24odW4pLHVuLmZuLmRhdGFUYWJsZS5GaXhlZENvbHVtbnM9cix1bi5mbi5EYXRhVGFibGUuRml4ZWRDb2x1bW5zPXI7dmFyIHM9YXQuQXBpLnJlZ2lzdGVyO3MoImZpeGVkQ29sdW1ucygpIixmdW5jdGlvbigpe3JldHVybiB0aGlzfSkscygiZml4ZWRDb2x1bW5zKCkuc3RhcnQoKSIsZnVuY3Rpb24obyl7dmFyIHU9dGhpcy5jb250ZXh0WzBdO3JldHVybiBvIT09dm9pZCAwPyh1Ll9maXhlZENvbHVtbnMuc3RhcnQobyksdGhpcyk6dS5fZml4ZWRDb2x1bW5zLnN0YXJ0KCl9KSxzKCJmaXhlZENvbHVtbnMoKS5lbmQoKSIsZnVuY3Rpb24obyl7dmFyIHU9dGhpcy5jb250ZXh0WzBdO3JldHVybiBvIT09dm9pZCAwPyh1Ll9maXhlZENvbHVtbnMuZW5kKG8pLHRoaXMpOnUuX2ZpeGVkQ29sdW1ucy5lbmQoKX0pLHMoImZpeGVkQ29sdW1ucygpLmxlZnQoKSIsZnVuY3Rpb24obyl7dmFyIHU9dGhpcy5jb250ZXh0WzBdO3JldHVybiBvIT09dm9pZCAwPyh1Ll9maXhlZENvbHVtbnMubGVmdChvKSx0aGlzKTp1Ll9maXhlZENvbHVtbnMubGVmdCgpfSkscygiZml4ZWRDb2x1bW5zKCkucmlnaHQoKSIsZnVuY3Rpb24obyl7dmFyIHU9dGhpcy5jb250ZXh0WzBdO3JldHVybiBvIT09dm9pZCAwPyh1Ll9maXhlZENvbHVtbnMucmlnaHQobyksdGhpcyk6dS5fZml4ZWRDb2x1bW5zLnJpZ2h0KCl9KSxhdC5leHQuYnV0dG9ucy5maXhlZENvbHVtbnM9e2FjdGlvbjpmdW5jdGlvbihvLHUscCxiKXt1bihwKS5hdHRyKCJhY3RpdmUiKT8odW4ocCkucmVtb3ZlQXR0cigiYWN0aXZlIikucmVtb3ZlQ2xhc3MoImFjdGl2ZSIpLHUuZml4ZWRDb2x1bW5zKCkuc3RhcnQoMCksdS5maXhlZENvbHVtbnMoKS5lbmQoMCkpOih1bihwKS5hdHRyKCJhY3RpdmUiLCJ0cnVlIikuYWRkQ2xhc3MoImFjdGl2ZSIpLHUuZml4ZWRDb2x1bW5zKCkuc3RhcnQoYi5jb25maWcuc3RhcnQpLHUuZml4ZWRDb2x1bW5zKCkuZW5kKGIuY29uZmlnLmVuZCkpfSxjb25maWc6e3N0YXJ0OjEsZW5kOjB9LGluaXQ6ZnVuY3Rpb24obyx1LHApe28uc2V0dGluZ3MoKVswXS5fZml4ZWRDb2x1bW5zPT09dm9pZCAwJiZpKG8uc2V0dGluZ3MoKSxwKSx1bih1KS5hdHRyKCJhY3RpdmUiLCJ0cnVlIikuYWRkQ2xhc3MoImFjdGl2ZSIpLG8uYnV0dG9uKHUpLnRleHQocC50ZXh0fHxvLmkxOG4oImJ1dHRvbnMuZml4ZWRDb2x1bW5zIixvLnNldHRpbmdzKClbMF0uX2ZpeGVkQ29sdW1ucy5jLmkxOG4uYnV0dG9uKSl9LHRleHQ6bnVsbH07ZnVuY3Rpb24gaShvLHUpe3U9PT12b2lkIDAmJih1PW51bGwpO3ZhciBwPW5ldyBhdC5BcGkobyksYj11fHxwLmluaXQoKS5maXhlZENvbHVtbnN8fGF0LmRlZmF1bHRzLmZpeGVkQ29sdW1ucyxnPW5ldyByKHAsYik7cmV0dXJuIGd9dW4oZG9jdW1lbnQpLm9uKCJwbHVnaW4taW5pdC5kdCIsZnVuY3Rpb24obyx1KXtvLm5hbWVzcGFjZT09PSJkdCImJih1Lm9Jbml0LmZpeGVkQ29sdW1uc3x8YXQuZGVmYXVsdHMuZml4ZWRDb2x1bW5zKSYmKHUuX2ZpeGVkQ29sdW1uc3x8aSh1LG51bGwpKX0pfSkoKTt2YXIgbmQ9aWUoYWUoKSwxKTt2YXIgcXM9aWUoYWUoKSwxKTt2YXIganQ9cXMuZGVmYXVsdCx0ZD0wLGVkPTAsX249ZnVuY3Rpb24odCxlKXtpZighYXQudmVyc2lvbkNoZWNrfHwhYXQudmVyc2lvbkNoZWNrKCIxLjEwLjgiKSl0aHJvdyJLZXlUYWJsZSByZXF1aXJlcyBEYXRhVGFibGVzIDEuMTAuOCBvciBuZXdlciI7dGhpcy5jPWp0LmV4dGVuZCghMCx7fSxhdC5kZWZhdWx0cy5rZXlUYWJsZSxfbi5kZWZhdWx0cyxlKSx0aGlzLnM9e2R0Om5ldyBhdC5BcGkodCksZHREcmF3aW5nOiExLGVuYWJsZTohMCxmb2N1c0RyYXc6ITEsd2FpdGluZ0ZvckRyYXc6ITEsbGFzdEZvY3VzOm51bGwsbmFtZXNwYWNlOiIua2V5VGFibGUtIit0ZCsrLHRhYklucHV0Om51bGx9LHRoaXMuZG9tPXt9O3ZhciBuPXRoaXMucy5kdC5zZXR0aW5ncygpWzBdLHI9bi5rZXl0YWJsZTtpZihyKXJldHVybiByO24ua2V5dGFibGU9dGhpcyx0aGlzLl9jb25zdHJ1Y3RvcigpfTtqdC5leHRlbmQoX24ucHJvdG90eXBlLHtibHVyOmZ1bmN0aW9uKCl7dGhpcy5fYmx1cigpfSxlbmFibGU6ZnVuY3Rpb24odCl7dGhpcy5zLmVuYWJsZT10fSxlbmFibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucy5lbmFibGV9LGZvY3VzOmZ1bmN0aW9uKHQsZSl7dGhpcy5fZm9jdXModGhpcy5zLmR0LmNlbGwodCxlKSl9LGZvY3VzZWQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5zLmxhc3RGb2N1cztpZighZSlyZXR1cm4hMTt2YXIgbj10aGlzLnMubGFzdEZvY3VzLmNlbGwuaW5kZXgoKTtyZXR1cm4gdC5yb3c9PT1uLnJvdyYmdC5jb2x1bW49PT1uLmNvbHVtbn0sX2NvbnN0cnVjdG9yOmZ1bmN0aW9uKCl7dGhpcy5fdGFiSW5wdXQoKTt2YXIgdD10aGlzLGU9dGhpcy5zLmR0LG49anQoZS50YWJsZSgpLm5vZGUoKSkscj10aGlzLnMubmFtZXNwYWNlLHM9ITE7aWYobi5jc3MoInBvc2l0aW9uIik9PT0ic3RhdGljIiYmbi5jc3MoInBvc2l0aW9uIiwicmVsYXRpdmUiKSxqdChlLnRhYmxlKCkuYm9keSgpKS5vbigiY2xpY2siK3IsInRoLCB0ZCIsZnVuY3Rpb24odSl7aWYodC5zLmVuYWJsZSE9PSExKXt2YXIgcD1lLmNlbGwodGhpcyk7cC5hbnkoKSYmdC5fZm9jdXMocCxudWxsLCExLHUpfX0pLGp0KGRvY3VtZW50KS5vbigia2V5ZG93biIrcixmdW5jdGlvbih1KXshcyYmIXQucy5kdERyYXdpbmc/dC5fa2V5KHUpOnUucHJldmVudERlZmF1bHQoKX0pLHRoaXMuYy5ibHVyYWJsZSYmanQoZG9jdW1lbnQpLm9uKCJtb3VzZWRvd24iK3IsZnVuY3Rpb24odSl7anQodS50YXJnZXQpLnBhcmVudHMoIi5kYXRhVGFibGVzX2ZpbHRlciwgLmR0LXNlYXJjaCIpLmxlbmd0aCYmdC5fYmx1cigpLCFqdCh1LnRhcmdldCkucGFyZW50cygpLmZpbHRlcihlLnRhYmxlKCkuY29udGFpbmVyKCkpLmxlbmd0aCYmKGp0KHUudGFyZ2V0KS5wYXJlbnRzKCJkaXYuRFRFIikubGVuZ3RofHxqdCh1LnRhcmdldCkucGFyZW50cygiZGl2LmVkaXRvci1kYXRldGltZSIpLmxlbmd0aHx8anQodS50YXJnZXQpLnBhcmVudHMoImRpdi5kdC1kYXRldGltZSIpLmxlbmd0aHx8anQodS50YXJnZXQpLnBhcmVudHMoKS5maWx0ZXIoIi5EVEZDX0Nsb25lZCIpLmxlbmd0aHx8dC5fYmx1cigpKX0pLHRoaXMuYy5lZGl0b3Ipe3ZhciBpPXRoaXMuYy5lZGl0b3I7aS5vbigib3Blbi5rZXlUYWJsZU1haW4iLGZ1bmN0aW9uKHUscCxiKXtwIT09ImlubGluZSImJnQucy5lbmFibGUmJih0LmVuYWJsZSghMSksaS5vbmUoImNsb3NlIityLGZ1bmN0aW9uKCl7dC5lbmFibGUoITApfSkpfSksdGhpcy5jLmVkaXRPbkZvY3VzJiZlLm9uKCJrZXktZm9jdXMiK3IrIiBrZXktcmVmb2N1cyIrcixmdW5jdGlvbih1LHAsYixnKXt0Ll9lZGl0b3IobnVsbCxnLCEwKX0pLGUub24oImtleSIrcixmdW5jdGlvbih1LHAsYixnLG0pe3QuX2VkaXRvcihiLG0sITEpfSksanQoZS50YWJsZSgpLmJvZHkoKSkub24oImRibGNsaWNrIityLCJ0aCwgdGQiLGZ1bmN0aW9uKHUpe2lmKHQucy5lbmFibGUhPT0hMSl7dmFyIHA9ZS5jZWxsKHRoaXMpO3AuYW55KCkmJih0LnMubGFzdEZvY3VzJiZ0aGlzIT09dC5zLmxhc3RGb2N1cy5jZWxsLm5vZGUoKXx8dC5fZWRpdG9yKG51bGwsdSwhMCkpfX0pLGkub24oInByZVN1Ym1pdCIsZnVuY3Rpb24oKXtzPSEwfSkub24oInByZVN1Ym1pdENhbmNlbGxlZCIsZnVuY3Rpb24oKXtzPSExfSkub24oInN1Ym1pdENvbXBsZXRlIixmdW5jdGlvbigpe3M9ITF9KX1lLm9uKCJzdGF0ZVNhdmVQYXJhbXMiK3IsZnVuY3Rpb24odSxwLGIpe2Iua2V5VGFibGU9dC5zLmxhc3RGb2N1cz90LnMubGFzdEZvY3VzLmNlbGwuaW5kZXgoKTpudWxsfSksZS5vbigiY29sdW1uLXZpc2liaWxpdHkiK3IsZnVuY3Rpb24odSl7dC5fdGFiSW5wdXQoKX0pLGUub24oImNvbHVtbi1yZW9yZGVyIityLGZ1bmN0aW9uKHUscCxiKXt2YXIgZz10LnMubGFzdEZvY3VzO2lmKGcmJmcuY2VsbCl7dmFyIG09Zy5yZWxhdGl2ZS5jb2x1bW47Zy5jZWxsWzBdWzBdLmNvbHVtbj1iLm1hcHBpbmcuaW5kZXhPZihtKSxnLnJlbGF0aXZlLmNvbHVtbj1iLm1hcHBpbmcuaW5kZXhPZihtKX19KSxlLm9uKCJwcmVEcmF3IityKyIgc2Nyb2xsZXItd2lsbC1kcmF3IityLGZ1bmN0aW9uKHUpe3Qucy5kdERyYXdpbmc9ITB9KSxlLm9uKCJkcmF3IityLGZ1bmN0aW9uKHUpe2lmKHQucy5kdERyYXdpbmc9ITEsdC5fdGFiSW5wdXQoKSwhdC5zLmZvY3VzRHJhdyl7dmFyIHA9dC5zLmxhc3RGb2N1cztpZihwKXt2YXIgYj10LnMubGFzdEZvY3VzLnJlbGF0aXZlLGc9ZS5wYWdlLmluZm8oKSxtPWIucm93O2lmKGcucmVjb3Jkc0Rpc3BsYXk9PT0wfHxtPGcuc3RhcnR8fG0+Zy5zdGFydCtnLmxlbmd0aClyZXR1cm47bT49Zy5yZWNvcmRzRGlzcGxheSYmKG09Zy5yZWNvcmRzRGlzcGxheS0xKSx0Ll9mb2N1cyhtLGIuY29sdW1uLCEwLHUpfX19KSx0aGlzLmMuY2xpcGJvYXJkJiZ0aGlzLl9jbGlwYm9hcmQoKSxlLm9uKCJkZXN0cm95IityLGZ1bmN0aW9uKCl7dC5fYmx1cighMCksZS5vZmYociksanQoZS50YWJsZSgpLmJvZHkoKSkub2ZmKCJjbGljayIrciwidGgsIHRkIikub2ZmKCJkYmxjbGljayIrciwidGgsIHRkIiksanQoZG9jdW1lbnQpLm9mZigibW91c2Vkb3duIityKS5vZmYoImtleWRvd24iK3IpLm9mZigiY29weSIrcikub2ZmKCJwYXN0ZSIrcil9KTt2YXIgbz1lLnN0YXRlLmxvYWRlZCgpO28mJm8ua2V5VGFibGU/ZS5vbmUoImluaXQiLGZ1bmN0aW9uKCl7dmFyIHU9ZS5jZWxsKG8ua2V5VGFibGUpO3UuYW55KCkmJnUuZm9jdXMoKX0pOnRoaXMuYy5mb2N1cyYmZS5jZWxsKHRoaXMuYy5mb2N1cykuZm9jdXMoKX0sX2JsdXI6ZnVuY3Rpb24odCl7aWYoISghdGhpcy5zLmVuYWJsZXx8IXRoaXMucy5sYXN0Rm9jdXMpKXt2YXIgZT10aGlzLnMubGFzdEZvY3VzLmNlbGw7anQoZS5ub2RlKCkpLnJlbW92ZUNsYXNzKHRoaXMuYy5jbGFzc05hbWUpLHRoaXMucy5sYXN0Rm9jdXM9bnVsbCx0fHwodGhpcy5fdXBkYXRlRml4ZWRDb2x1bW5zKGUuaW5kZXgoKS5jb2x1bW4pLHRoaXMuX2VtaXRFdmVudCgia2V5LWJsdXIiLFt0aGlzLnMuZHQsZV0pKX19LF9jbGlwYm9hcmQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnMuZHQsZT10aGlzLG49dGhpcy5zLm5hbWVzcGFjZSxyPXRoaXMuYy5jbGlwYm9hcmQ7d2luZG93LmdldFNlbGVjdGlvbiYmKChyPT09ITB8fHIuY29weSkmJmp0KGRvY3VtZW50KS5vbigiY29weSIrbixmdW5jdGlvbihzKXt2YXIgaT1zLm9yaWdpbmFsRXZlbnQsbz13aW5kb3cuZ2V0U2VsZWN0aW9uKCkudG9TdHJpbmcoKSx1PWUucy5sYXN0Rm9jdXM7IW8mJnUmJihpLmNsaXBib2FyZERhdGEuc2V0RGF0YSgidGV4dC9wbGFpbiIsdS5jZWxsLnJlbmRlcihlLmMuY2xpcGJvYXJkT3J0aG9nb25hbCkpLGkucHJldmVudERlZmF1bHQoKSl9KSwocj09PSEwfHxyLnBhc3RlKSYmanQoZG9jdW1lbnQpLm9uKCJwYXN0ZSIrbixmdW5jdGlvbihzKXt2YXIgaT1zLm9yaWdpbmFsRXZlbnQsbz1lLnMubGFzdEZvY3VzLHU9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudCxwPWUuYy5lZGl0b3IsYjtpZihvJiYoIXV8fHUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJib2R5IikpaWYoaS5wcmV2ZW50RGVmYXVsdCgpLHdpbmRvdy5jbGlwYm9hcmREYXRhJiZ3aW5kb3cuY2xpcGJvYXJkRGF0YS5nZXREYXRhP2I9d2luZG93LmNsaXBib2FyZERhdGEuZ2V0RGF0YSgiVGV4dCIpOmkuY2xpcGJvYXJkRGF0YSYmaS5jbGlwYm9hcmREYXRhLmdldERhdGEmJihiPWkuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCJ0ZXh0L3BsYWluIikpLHApe3ZhciBnPWUuX2lubGluZU9wdGlvbnMoby5jZWxsLmluZGV4KCkpO3AuaW5saW5lKGcuY2VsbCxnLmZpZWxkLGcub3B0aW9ucykuc2V0KHAuZGlzcGxheWVkKClbMF0sYikuc3VibWl0KCl9ZWxzZSBvLmNlbGwuZGF0YShiKSx0LmRyYXcoITEpfSkpfSxfY29sdW1uczpmdW5jdGlvbigpe3ZhciB0PXRoaXMucy5kdCxlPXQuY29sdW1ucyh0aGlzLmMuY29sdW1ucykuaW5kZXhlcygpLG49W107cmV0dXJuIHQuY29sdW1ucygiOnZpc2libGUiKS5ldmVyeShmdW5jdGlvbihyKXtlLmluZGV4T2YocikhPT0tMSYmbi5wdXNoKHIpfSksbn0sX2VkaXRvcjpmdW5jdGlvbih0LGUsbil7aWYodGhpcy5zLmxhc3RGb2N1cyYmIShlJiZlLnR5cGU9PT0iZHJhdyIpKXt2YXIgcj10aGlzLHM9dGhpcy5zLmR0LGk9dGhpcy5jLmVkaXRvcixvPXRoaXMucy5sYXN0Rm9jdXMuY2VsbCx1PXRoaXMucy5uYW1lc3BhY2UrImUiK2VkKys7aWYoIWp0KCJkaXYuRFRFIixvLm5vZGUoKSkubGVuZ3RoJiYhKHQhPT1udWxsJiYodD49MCYmdDw9OXx8dD09PTExfHx0PT09MTJ8fHQ+PTE0JiZ0PD0zMXx8dD49MTEyJiZ0PD0xMjN8fHQ+PTEyNyYmdDw9MTU5KSkpe2UmJihlLnN0b3BQcm9wYWdhdGlvbigpLHQ9PT0xMyYmZS5wcmV2ZW50RGVmYXVsdCgpKTt2YXIgcD1mdW5jdGlvbigpe3ZhciBiPXIuX2lubGluZU9wdGlvbnMoby5pbmRleCgpKTtpLm9uZSgib3BlbiIrdSxmdW5jdGlvbigpe2kub2ZmKCJjYW5jZWxPcGVuIit1KSxufHxqdCgiZGl2LkRURV9GaWVsZF9JbnB1dENvbnRyb2wgaW5wdXQsIGRpdi5EVEVfRmllbGRfSW5wdXRDb250cm9sIHRleHRhcmVhIikuc2VsZWN0KCkscy5rZXlzLmVuYWJsZShuPyJ0YWItb25seSI6Im5hdmlnYXRpb24tb25seSIpLHMub24oImtleS1ibHVyLmVkaXRvciIsZnVuY3Rpb24oZyxtLEMpe2kucy5lZGl0T3B0cy5vbkJsdXIhPT0ic3VibWl0IiYmaS5kaXNwbGF5ZWQoKSYmQy5ub2RlKCk9PT1vLm5vZGUoKSYmaS5zdWJtaXQoKX0pLG4mJmp0KHMudGFibGUoKS5jb250YWluZXIoKSkuYWRkQ2xhc3MoImR0ay1mb2N1cy1hbHQiKSxpLm9uKCJwcmVTdWJtaXRDYW5jZWxsZWQiK3UsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ci5fZm9jdXMobyxudWxsLCExKX0sNTApfSksaS5vbigic3VibWl0VW5zdWNjZXNzZnVsIit1LGZ1bmN0aW9uKCl7ci5fZm9jdXMobyxudWxsLCExKX0pLGkub25lKCJjbG9zZSIrdSxmdW5jdGlvbigpe3Mua2V5cy5lbmFibGUoITApLHMub2ZmKCJrZXktYmx1ci5lZGl0b3IiKSxpLm9mZih1KSxqdChzLnRhYmxlKCkuY29udGFpbmVyKCkpLnJlbW92ZUNsYXNzKCJkdGstZm9jdXMtYWx0Iiksci5zLnJldHVyblN1Ym1pdCYmKHIucy5yZXR1cm5TdWJtaXQ9ITEsci5fZW1pdEV2ZW50KCJrZXktcmV0dXJuLXN1Ym1pdCIsW3Msb10pKX0pfSkub25lKCJjYW5jZWxPcGVuIit1LGZ1bmN0aW9uKCl7aS5vZmYodSl9KS5pbmxpbmUoYi5jZWxsLGIuZmllbGQsYi5vcHRpb25zKX07dD09PTEzPyhuPSEwLGp0KGRvY3VtZW50KS5vbmUoImtleXVwIixmdW5jdGlvbigpe3AoKX0pKTpwKCl9fX0sX2lubGluZU9wdGlvbnM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuYy5lZGl0b3JPcHRpb25zP3RoaXMuYy5lZGl0b3JPcHRpb25zKHQpOntjZWxsOnQsZmllbGQ6dm9pZCAwLG9wdGlvbnM6dm9pZCAwfX0sX2VtaXRFdmVudDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnMuZHQuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihuLHIpe3JldHVybiBqdChuLm5UYWJsZSkudHJpZ2dlckhhbmRsZXIodCxlKX0pfSxfZm9jdXM6ZnVuY3Rpb24odCxlLG4scil7dmFyIHM9dGhpcyxpPXRoaXMucy5kdCxvPWkucGFnZS5pbmZvKCksdT10aGlzLnMubGFzdEZvY3VzO2lmKHJ8fChyPW51bGwpLCEhdGhpcy5zLmVuYWJsZSl7aWYodHlwZW9mIHQhPSJudW1iZXIiKXtpZighdC5hbnkoKSlyZXR1cm47dmFyIHA9dC5pbmRleCgpO2lmKGU9cC5jb2x1bW4sdD1pLnJvd3Moe2ZpbHRlcjoiYXBwbGllZCIsb3JkZXI6ImFwcGxpZWQifSkuaW5kZXhlcygpLmluZGV4T2YocC5yb3cpLHQ8MClyZXR1cm47by5zZXJ2ZXJTaWRlJiYodCs9by5zdGFydCl9aWYoby5sZW5ndGghPT0tMSYmKHQ8by5zdGFydHx8dD49by5zdGFydCtvLmxlbmd0aCkpe3RoaXMucy5mb2N1c0RyYXc9ITAsdGhpcy5zLndhaXRpbmdGb3JEcmF3PSEwLGkub25lKCJkcmF3IixmdW5jdGlvbigpe3Mucy5mb2N1c0RyYXc9ITEscy5zLndhaXRpbmdGb3JEcmF3PSExLHMuX2ZvY3VzKHQsZSx2b2lkIDAscil9KS5wYWdlKE1hdGguZmxvb3IodC9vLmxlbmd0aCkpLmRyYXcoITEpO3JldHVybn1pZihqdC5pbkFycmF5KGUsdGhpcy5fY29sdW1ucygpKSE9PS0xKXtvLnNlcnZlclNpZGUmJih0LT1vLnN0YXJ0KTt2YXIgYj1pLmNlbGxzKG51bGwsZSx7c2VhcmNoOiJhcHBsaWVkIixvcmRlcjoiYXBwbGllZCJ9KS5mbGF0dGVuKCksZz1pLmNlbGwoYlt0XSksbT10aGlzLl9lbWl0RXZlbnQoImtleS1wcmVmb2N1cyIsW3RoaXMucy5kdCxnLHJ8fG51bGxdKTtpZihtLmluZGV4T2YoITEpPT09LTEpe2lmKHUpe2lmKHUubm9kZT09PWcubm9kZSgpKXt0aGlzLl9lbWl0RXZlbnQoImtleS1yZWZvY3VzIixbdGhpcy5zLmR0LGcscnx8bnVsbF0pO3JldHVybn10aGlzLl9ibHVyKCl9dGhpcy5fcmVtb3ZlT3RoZXJGb2N1cygpO3ZhciBDPWp0KGcubm9kZSgpKTtpZihDLmFkZENsYXNzKHRoaXMuYy5jbGFzc05hbWUpLHRoaXMuX3VwZGF0ZUZpeGVkQ29sdW1ucyhlKSxuPT09dm9pZCAwfHxuPT09ITApe3RoaXMuX3Njcm9sbChqdCh3aW5kb3cpLGp0KGRvY3VtZW50LmJvZHkpLEMsIm9mZnNldCIpO3ZhciB5PWkudGFibGUoKS5ib2R5KCkucGFyZW50Tm9kZTtpZih5IT09aS50YWJsZSgpLmhlYWRlcigpLnBhcmVudE5vZGUpe3ZhciBUPWp0KHkucGFyZW50Tm9kZSk7dGhpcy5fc2Nyb2xsKFQsVCxDLCJwb3NpdGlvbiIpfX12YXIgUD1pLnBhZ2UuaW5mbygpO3RoaXMucy5sYXN0Rm9jdXM9e2NlbGw6Zyxub2RlOmcubm9kZSgpLHJlbGF0aXZlOntyb3c6UC5zdGFydCtpLnJvd3Moe3BhZ2U6ImN1cnJlbnQifSkuaW5kZXhlcygpLmluZGV4T2YoZy5pbmRleCgpLnJvdyksY29sdW1uOmcuaW5kZXgoKS5jb2x1bW59fSx0aGlzLl9lbWl0RXZlbnQoImtleS1mb2N1cyIsW3RoaXMucy5kdCxnLHJ8fG51bGxdKSxpLnN0YXRlLnNhdmUoKX19fX0sX2tleTpmdW5jdGlvbih0KXtpZih0aGlzLnMud2FpdGluZ0ZvckRyYXcpe3QucHJldmVudERlZmF1bHQoKTtyZXR1cm59aWYoIWp0KHQudGFyZ2V0KS5jbG9zZXN0KCIuZHRlLWlubGluZUFkZCIpLmxlbmd0aCl7dmFyIGU9dGhpcy5zLmVuYWJsZTt0aGlzLnMucmV0dXJuU3VibWl0PShlPT09Im5hdmlnYXRpb24tb25seSJ8fGU9PT0idGFiLW9ubHkiKSYmdC5rZXlDb2RlPT09MTM7dmFyIG49ZT09PSEwfHxlPT09Im5hdmlnYXRpb24tb25seSI7aWYoZSYmISgodC5rZXlDb2RlPT09MHx8dC5jdHJsS2V5fHx0Lm1ldGFLZXl8fHQuYWx0S2V5KSYmISh0LmN0cmxLZXkmJnQuYWx0S2V5KSkpe3ZhciByPXRoaXMucy5sYXN0Rm9jdXM7aWYocil7aWYoIXRoaXMucy5kdC5jZWxsKHIubm9kZSkuYW55KCkpe3RoaXMucy5sYXN0Rm9jdXM9bnVsbDtyZXR1cm59dmFyIHM9dGhpcyxpPXRoaXMucy5kdCxvPSEhdGhpcy5zLmR0LnNldHRpbmdzKClbMF0ub1Njcm9sbC5zWTtpZighKHRoaXMuYy5rZXlzJiZqdC5pbkFycmF5KHQua2V5Q29kZSx0aGlzLmMua2V5cyk9PT0tMSkpc3dpdGNoKHQua2V5Q29kZSl7Y2FzZSA5OnQucHJldmVudERlZmF1bHQoKSx0aGlzLl9rZXlBY3Rpb24oZnVuY3Rpb24oKXtzLl9zaGlmdCh0LHQuc2hpZnRLZXk/ImxlZnQiOiJyaWdodCIsITApfSk7YnJlYWs7Y2FzZSAyNzppZihqdChyLm5vZGUpLmZpbmQoImRpdi5EVEUiKS5sZW5ndGgpcmV0dXJuO3RoaXMuYy5ibHVyYWJsZSYmZT09PSEwJiZ0aGlzLl9ibHVyKCk7YnJlYWs7Y2FzZSAzMzpjYXNlIDM0Om4mJiFvJiYodC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuX2tleUFjdGlvbihmdW5jdGlvbigpe2kucGFnZSh0LmtleUNvZGU9PT0zMz8icHJldmlvdXMiOiJuZXh0IikuZHJhdyghMSl9KSk7YnJlYWs7Y2FzZSAzNTpjYXNlIDM2Om4mJih0LnByZXZlbnREZWZhdWx0KCksdGhpcy5fa2V5QWN0aW9uKGZ1bmN0aW9uKCl7dmFyIHU9aS5jZWxscyh7cGFnZToiY3VycmVudCJ9KS5pbmRleGVzKCkscD1zLl9jb2x1bW5zKCk7cy5fZm9jdXMoaS5jZWxsKHVbdC5rZXlDb2RlPT09MzU/dS5sZW5ndGgtMTpwWzBdXSksbnVsbCwhMCx0KX0pKTticmVhaztjYXNlIDM3Om4mJnRoaXMuX2tleUFjdGlvbihmdW5jdGlvbigpe3MuX3NoaWZ0KHQsImxlZnQiKX0pO2JyZWFrO2Nhc2UgMzg6biYmdGhpcy5fa2V5QWN0aW9uKGZ1bmN0aW9uKCl7cy5fc2hpZnQodCwidXAiKX0pO2JyZWFrO2Nhc2UgMzk6biYmdGhpcy5fa2V5QWN0aW9uKGZ1bmN0aW9uKCl7cy5fc2hpZnQodCwicmlnaHQiKX0pO2JyZWFrO2Nhc2UgNDA6biYmdGhpcy5fa2V5QWN0aW9uKGZ1bmN0aW9uKCl7cy5fc2hpZnQodCwiZG93biIpfSk7YnJlYWs7Y2FzZSAxMTM6aWYodGhpcy5jLmVkaXRvcil7dGhpcy5fZWRpdG9yKG51bGwsdCwhMCk7YnJlYWt9ZGVmYXVsdDplPT09ITAmJnRoaXMuX2VtaXRFdmVudCgia2V5IixbaSx0LmtleUNvZGUsdGhpcy5zLmxhc3RGb2N1cy5jZWxsLHRdKTticmVha319fX19LF9rZXlBY3Rpb246ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jLmVkaXRvcjtlJiZlLm1vZGUoKSYmZS5kaXNwbGF5KCk/ZS5zdWJtaXQodCk6dCgpfSxfcmVtb3ZlT3RoZXJGb2N1czpmdW5jdGlvbigpe3ZhciB0PXRoaXMucy5kdC50YWJsZSgpLm5vZGUoKTtqdC5mbi5kYXRhVGFibGUudGFibGVzKHthcGk6ITB9KS5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKGUpe3RoaXMudGFibGUoKS5ub2RlKCkhPT10JiZ0aGlzLmNlbGwuYmx1cigpfSl9LF9zY3JvbGw6ZnVuY3Rpb24odCxlLG4scil7dmFyIHM9bltyXSgpLGk9bi5vdXRlckhlaWdodCgpLG89bi5vdXRlcldpZHRoKCksdT1lLnNjcm9sbFRvcCgpLHA9ZS5zY3JvbGxMZWZ0KCksYj10LmhlaWdodCgpLGc9dC53aWR0aCgpO3I9PT0icG9zaXRpb24iJiYocy50b3ArPXBhcnNlSW50KG4uY2xvc2VzdCgidGFibGUiKS5jc3MoInRvcCIpLDEwKSkscy50b3A8dSYmcy50b3AraT51LTUmJmUuc2Nyb2xsVG9wKHMudG9wKSxzLmxlZnQ8cCYmZS5zY3JvbGxMZWZ0KHMubGVmdCkscy50b3AraT51K2ImJnMudG9wPHUrYis1JiZpPGImJmUuc2Nyb2xsVG9wKHMudG9wK2ktYikscy5sZWZ0K28+cCtnJiZvPGcmJmUuc2Nyb2xsTGVmdChzLmxlZnQrby1nKX0sX3NoaWZ0OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzLnMuZHQscz1yLnBhZ2UuaW5mbygpLGk9cy5yZWNvcmRzRGlzcGxheSxvPXRoaXMuX2NvbHVtbnMoKSx1PXRoaXMucy5sYXN0Rm9jdXM7aWYodSl7dmFyIHA9dS5jZWxsO2lmKHApe3ZhciBiPXIucm93cyh7ZmlsdGVyOiJhcHBsaWVkIixvcmRlcjoiYXBwbGllZCJ9KS5pbmRleGVzKCkuaW5kZXhPZihwLmluZGV4KCkucm93KTtzLnNlcnZlclNpZGUmJihiKz1zLnN0YXJ0KTt2YXIgZz1yLmNvbHVtbnMobykuaW5kZXhlcygpLmluZGV4T2YocC5pbmRleCgpLmNvbHVtbiksbT1iLEM9b1tnXTtqdChyLnRhYmxlKCkubm9kZSgpKS5jc3MoImRpcmVjdGlvbiIpPT09InJ0bCImJihlPT09InJpZ2h0Ij9lPSJsZWZ0IjplPT09ImxlZnQiJiYoZT0icmlnaHQiKSksZT09PSJyaWdodCI/Zz49by5sZW5ndGgtMT8obSsrLEM9b1swXSk6Qz1vW2crMV06ZT09PSJsZWZ0Ij9nPT09MD8obS0tLEM9b1tvLmxlbmd0aC0xXSk6Qz1vW2ctMV06ZT09PSJ1cCI/bS0tOmU9PT0iZG93biImJm0rKyxtPj0wJiZtPGkmJmp0LmluQXJyYXkoQyxvKSE9PS0xPyh0JiZ0LnByZXZlbnREZWZhdWx0KCksdGhpcy5fZm9jdXMobSxDLCEwLHQpKTohbnx8IXRoaXMuYy5ibHVyYWJsZT90JiZ0LnByZXZlbnREZWZhdWx0KCk6dGhpcy5fYmx1cigpfX19LF90YWJJbnB1dDpmdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10aGlzLnMuZHQsbj10aGlzLmMudGFiSW5kZXghPT1udWxsP3RoaXMuYy50YWJJbmRleDplLnNldHRpbmdzKClbMF0uaVRhYkluZGV4O2lmKG4hPS0xKXtpZighdGhpcy5zLnRhYklucHV0KXt2YXIgcj1qdCgnPGRpdj48aW5wdXQgdHlwZT0idGV4dCIgdGFiaW5kZXg9IicrbisnIi8+PC9kaXY+JykuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUiLGhlaWdodDoxLHdpZHRoOjAsb3ZlcmZsb3c6ImhpZGRlbiJ9KTtyLmNoaWxkcmVuKCkub24oImZvY3VzIixmdW5jdGlvbihpKXt2YXIgbz1lLmNlbGwoIjplcSgwKSIsdC5fY29sdW1ucygpLHtwYWdlOiJjdXJyZW50In0pO28uYW55KCkmJnQuX2ZvY3VzKG8sbnVsbCwhMCxpKX0pLHRoaXMucy50YWJJbnB1dD1yfXZhciBzPXRoaXMucy5kdC5jZWxsKCI6ZXEoMCkiLCIwOnZpc2libGUiLHtwYWdlOiJjdXJyZW50IixvcmRlcjoiY3VycmVudCJ9KS5ub2RlKCk7cyYmanQocykucHJlcGVuZCh0aGlzLnMudGFiSW5wdXQpfX0sX3VwZGF0ZUZpeGVkQ29sdW1uczpmdW5jdGlvbih0KXt2YXIgZT10aGlzLnMuZHQsbj1lLnNldHRpbmdzKClbMF07aWYobi5fb0ZpeGVkQ29sdW1ucyl7dmFyIHI9bi5fb0ZpeGVkQ29sdW1ucy5zLmlMZWZ0Q29sdW1ucyxzPW4uYW9Db2x1bW5zLmxlbmd0aC1uLl9vRml4ZWRDb2x1bW5zLnMuaVJpZ2h0Q29sdW1uczsodDxyfHx0Pj1zKSYmZS5maXhlZENvbHVtbnMoKS51cGRhdGUoKX19fSk7X24uZGVmYXVsdHM9e2JsdXJhYmxlOiEwLGNsYXNzTmFtZToiZm9jdXMiLGNsaXBib2FyZDohMCxjbGlwYm9hcmRPcnRob2dvbmFsOiJkaXNwbGF5Iixjb2x1bW5zOiIiLGVkaXRvcjpudWxsLGVkaXRPbkZvY3VzOiExLGVkaXRvck9wdGlvbnM6bnVsbCxmb2N1czpudWxsLGtleXM6bnVsbCx0YWJJbmRleDpudWxsfTtfbi52ZXJzaW9uPSIyLjEyLjEiO2p0LmZuLmRhdGFUYWJsZS5LZXlUYWJsZT1fbjtqdC5mbi5EYXRhVGFibGUuS2V5VGFibGU9X247YXQuQXBpLnJlZ2lzdGVyKCJjZWxsLmJsdXIoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKHQpe3Qua2V5dGFibGUmJnQua2V5dGFibGUuYmx1cigpfSl9KTthdC5BcGkucmVnaXN0ZXIoImNlbGwoKS5mb2N1cygpIixmdW5jdGlvbigpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJjZWxsIixmdW5jdGlvbih0LGUsbil7dC5rZXl0YWJsZSYmdC5rZXl0YWJsZS5mb2N1cyhlLG4pfSl9KTthdC5BcGkucmVnaXN0ZXIoImtleXMuZGlzYWJsZSgpIixmdW5jdGlvbigpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24odCl7dC5rZXl0YWJsZSYmdC5rZXl0YWJsZS5lbmFibGUoITEpfSl9KTthdC5BcGkucmVnaXN0ZXIoImtleXMuZW5hYmxlKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24oZSl7ZS5rZXl0YWJsZSYmZS5rZXl0YWJsZS5lbmFibGUodD09PXZvaWQgMD8hMDp0KX0pfSk7YXQuQXBpLnJlZ2lzdGVyKCJrZXlzLmVuYWJsZWQoKSIsZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jb250ZXh0O3JldHVybiBlLmxlbmd0aCYmZVswXS5rZXl0YWJsZT9lWzBdLmtleXRhYmxlLmVuYWJsZWQoKTohMX0pO2F0LkFwaS5yZWdpc3Rlcigia2V5cy5tb3ZlKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24oZSl7ZS5rZXl0YWJsZSYmZS5rZXl0YWJsZS5fc2hpZnQobnVsbCx0LCExKX0pfSk7YXQuZXh0LnNlbGVjdG9yLmNlbGwucHVzaChmdW5jdGlvbih0LGUsbil7dmFyIHI9ZS5mb2N1c2VkLHM9dC5rZXl0YWJsZSxpPVtdO2lmKCFzfHxyPT09dm9pZCAwKXJldHVybiBuO2Zvcih2YXIgbz0wLHU9bi5sZW5ndGg7bzx1O28rKykocj09PSEwJiZzLmZvY3VzZWQobltvXSl8fHI9PT0hMSYmIXMuZm9jdXNlZChuW29dKSkmJmkucHVzaChuW29dKTtyZXR1cm4gaX0pO2p0KGRvY3VtZW50KS5vbigicHJlSW5pdC5kdC5kdGsiLGZ1bmN0aW9uKHQsZSxuKXtpZih0Lm5hbWVzcGFjZT09PSJkdCIpe3ZhciByPWUub0luaXQua2V5cyxzPWF0LmRlZmF1bHRzLmtleXM7aWYocnx8cyl7dmFyIGk9anQuZXh0ZW5kKHt9LHMscik7ciE9PSExJiZuZXcgX24oZSxpKX19fSk7dmFyIHJkPWllKGFlKCksMSk7dmFyIFhzPWllKGFlKCksMSk7dmFyIExlPVhzLmRlZmF1bHQsQ249ZnVuY3Rpb24odCxlKXtpZighYXQudmVyc2lvbkNoZWNrfHwhYXQudmVyc2lvbkNoZWNrKCIxLjExIikpdGhyb3ciUm93R3JvdXAgcmVxdWlyZXMgRGF0YVRhYmxlcyAxLjExIG9yIG5ld2VyIjt0aGlzLmM9TGUuZXh0ZW5kKCEwLHt9LGF0LmRlZmF1bHRzLnJvd0dyb3VwLENuLmRlZmF1bHRzLGUpLHRoaXMucz17ZHQ6bmV3IGF0LkFwaSh0KX0sdGhpcy5kb209e307dmFyIG49dGhpcy5zLmR0LnNldHRpbmdzKClbMF0scj1uLnJvd0dyb3VwO2lmKHIpcmV0dXJuIHI7bi5yb3dHcm91cD10aGlzLHRoaXMuX2NvbnN0cnVjdG9yKCl9O0xlLmV4dGVuZChDbi5wcm90b3R5cGUse2RhdGFTcmM6ZnVuY3Rpb24odCl7aWYodD09PXZvaWQgMClyZXR1cm4gdGhpcy5jLmRhdGFTcmM7dmFyIGU9dGhpcy5zLmR0O3JldHVybiB0aGlzLmMuZGF0YVNyYz10LExlKGUudGFibGUoKS5ub2RlKCkpLnRyaWdnZXJIYW5kbGVyKCJyb3dncm91cC1kYXRhc3JjLmR0IixbZSx0XSksdGhpc30sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmMuZW5hYmxlPSExLHRoaXN9LGVuYWJsZTpmdW5jdGlvbih0KXtyZXR1cm4gdD09PSExP3RoaXMuZGlzYWJsZSgpOih0aGlzLmMuZW5hYmxlPSEwLHRoaXMpfSxlbmFibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYy5lbmFibGV9LF9jb25zdHJ1Y3RvcjpmdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10aGlzLnMuZHQsbj1lLnNldHRpbmdzKClbMF07ZS5vbigiZHJhdy5kdHJnIixmdW5jdGlvbihyLHMpe3QuYy5lbmFibGUmJm49PT1zJiZ0Ll9kcmF3KCl9KSxlLm9uKCJjb2x1bW4tdmlzaWJpbGl0eS5kdC5kdHJnIHJlc3BvbnNpdmUtcmVzaXplLmR0LmR0cmciLGZ1bmN0aW9uKCl7dC5fYWRqdXN0Q29sc3BhbigpfSksZS5vbigiZGVzdHJveSIsZnVuY3Rpb24oKXtlLm9mZigiLmR0cmciKX0pfSxfYWRqdXN0Q29sc3BhbjpmdW5jdGlvbigpe0xlKCJ0ci4iK3RoaXMuYy5jbGFzc05hbWUsdGhpcy5zLmR0LnRhYmxlKCkuYm9keSgpKS5maW5kKCJ0aDp2aXNpYmxlLCB0ZDp2aXNpYmxlIikuYXR0cigiY29sc3BhbiIsdGhpcy5fY29sc3BhbigpKX0sX2NvbHNwYW46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zLmR0LmNvbHVtbnMoKS52aXNpYmxlKCkucmVkdWNlKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQrZX0sMCl9LF9kcmF3OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5zLmR0LGU9dGhpcy5fZ3JvdXAoMCx0LnJvd3Moe3BhZ2U6ImN1cnJlbnQifSkuaW5kZXhlcygpKTt0aGlzLl9ncm91cERpc3BsYXkoMCxlKX0sX2dyb3VwOmZ1bmN0aW9uKHQsZSl7dmFyIG49QXJyYXkuaXNBcnJheSh0aGlzLmMuZGF0YVNyYyk/dGhpcy5jLmRhdGFTcmM6W3RoaXMuYy5kYXRhU3JjXSxyPWF0LnV0aWwuZ2V0KG5bdF0pLHM9dGhpcy5zLmR0LGksbyx1LHAsYj1bXSxnPXRoaXM7Zm9yKHU9MCxwPWUubGVuZ3RoO3U8cDt1Kyspe3ZhciBtPWVbdV0sQz1zLnJvdyhtKS5kYXRhKCk7aT1yKEMsdCksaT09bnVsbCYmKGk9Zy5jLmVtcHR5RGF0YUdyb3VwKSwobz09PXZvaWQgMHx8aSE9PW8pJiYoYi5wdXNoKHtkYXRhUG9pbnQ6aSxyb3dzOltdfSksbz1pKSxiW2IubGVuZ3RoLTFdLnJvd3MucHVzaChtKX1pZihuW3QrMV0hPT12b2lkIDApZm9yKHU9MCxwPWIubGVuZ3RoO3U8cDt1KyspYlt1XS5jaGlsZHJlbj10aGlzLl9ncm91cCh0KzEsYlt1XS5yb3dzKTtyZXR1cm4gYn0sX2dyb3VwRGlzcGxheTpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10aGlzLnMuZHQscixzPTAsaT1lLmxlbmd0aDtzPGk7cysrKXt2YXIgbz1lW3NdLHU9by5kYXRhUG9pbnQscCxiPW8ucm93czt0aGlzLmMuc3RhcnRSZW5kZXImJihyPXRoaXMuYy5zdGFydFJlbmRlci5jYWxsKHRoaXMsbi5yb3dzKGIpLHUsdCkscD10aGlzLl9yb3dXcmFwKHIsdGhpcy5jLnN0YXJ0Q2xhc3NOYW1lLHQpLHAmJnAuaW5zZXJ0QmVmb3JlKG4ucm93KGJbMF0pLm5vZGUoKSkpLHRoaXMuYy5lbmRSZW5kZXImJihyPXRoaXMuYy5lbmRSZW5kZXIuY2FsbCh0aGlzLG4ucm93cyhiKSx1LHQpLHA9dGhpcy5fcm93V3JhcChyLHRoaXMuYy5lbmRDbGFzc05hbWUsdCkscCYmcC5pbnNlcnRBZnRlcihuLnJvdyhiW2IubGVuZ3RoLTFdKS5ub2RlKCkpKSxvLmNoaWxkcmVuJiZ0aGlzLl9ncm91cERpc3BsYXkodCsxLG8uY2hpbGRyZW4pfX0sX3Jvd1dyYXA6ZnVuY3Rpb24odCxlLG4pe3ZhciByO3JldHVybih0PT09bnVsbHx8dD09PSIiKSYmKHQ9dGhpcy5jLmVtcHR5RGF0YUdyb3VwKSx0PT1udWxsP251bGw6KHR5cGVvZiB0PT0ib2JqZWN0IiYmdC5ub2RlTmFtZSYmdC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09InRyIj9yPUxlKHQpOnQgaW5zdGFuY2VvZiBMZSYmdC5sZW5ndGgmJnRbMF0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJ0ciI/cj10OnI9TGUoIjx0ci8+IikuYXBwZW5kKExlKCI8dGgvPiIpLmF0dHIoImNvbHNwYW4iLHRoaXMuX2NvbHNwYW4oKSkuYXR0cigic2NvcGUiLCJyb3ciKS5hcHBlbmQodCkpLHIuYWRkQ2xhc3ModGhpcy5jLmNsYXNzTmFtZSkuYWRkQ2xhc3MoZSkuYWRkQ2xhc3MoImR0cmctbGV2ZWwtIituKSl9fSk7Q24uZGVmYXVsdHM9e2NsYXNzTmFtZToiZHRyZy1ncm91cCIsZGF0YVNyYzowLGVtcHR5RGF0YUdyb3VwOiJObyBncm91cCIsZW5hYmxlOiEwLGVuZENsYXNzTmFtZToiZHRyZy1lbmQiLGVuZFJlbmRlcjpudWxsLHN0YXJ0Q2xhc3NOYW1lOiJkdHJnLXN0YXJ0IixzdGFydFJlbmRlcjpmdW5jdGlvbih0LGUpe3JldHVybiBlfX07Q24udmVyc2lvbj0iMS41LjAiO0xlLmZuLmRhdGFUYWJsZS5Sb3dHcm91cD1DbjtMZS5mbi5EYXRhVGFibGUuUm93R3JvdXA9Q247YXQuQXBpLnJlZ2lzdGVyKCJyb3dHcm91cCgpIixmdW5jdGlvbigpe3JldHVybiB0aGlzfSk7YXQuQXBpLnJlZ2lzdGVyKCJyb3dHcm91cCgpLmRpc2FibGUoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKHQpe3Qucm93R3JvdXAmJnQucm93R3JvdXAuZW5hYmxlKCExKX0pfSk7YXQuQXBpLnJlZ2lzdGVyKCJyb3dHcm91cCgpLmVuYWJsZSgpIixmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKGUpe2Uucm93R3JvdXAmJmUucm93R3JvdXAuZW5hYmxlKHQ9PT12b2lkIDA/ITA6dCl9KX0pO2F0LkFwaS5yZWdpc3Rlcigicm93R3JvdXAoKS5lbmFibGVkKCkiLGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jb250ZXh0O3JldHVybiB0Lmxlbmd0aCYmdFswXS5yb3dHcm91cD90WzBdLnJvd0dyb3VwLmVuYWJsZWQoKTohMX0pO2F0LkFwaS5yZWdpc3Rlcigicm93R3JvdXAoKS5kYXRhU3JjKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0PT09dm9pZCAwP3RoaXMuY29udGV4dFswXS5yb3dHcm91cC5kYXRhU3JjKCk6dGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKGUpe2Uucm93R3JvdXAmJmUucm93R3JvdXAuZGF0YVNyYyh0KX0pfSk7TGUoZG9jdW1lbnQpLm9uKCJwcmVJbml0LmR0LmR0cmciLGZ1bmN0aW9uKHQsZSxuKXtpZih0Lm5hbWVzcGFjZT09PSJkdCIpe3ZhciByPWUub0luaXQucm93R3JvdXAscz1hdC5kZWZhdWx0cy5yb3dHcm91cDtpZihyfHxzKXt2YXIgaT1MZS5leHRlbmQoe30scyxyKTtyIT09ITEmJm5ldyBDbihlLGkpfX19KTt2YXIgWXM9aWUoYWUoKSwxKTt2YXIgTXQ9WXMuZGVmYXVsdCxjZSxkZT1mdW5jdGlvbih0LGUpe2lmKGRlLmZhY3RvcnkodCxlKSlyZXR1cm4gZGU7dHlwZW9mIGNlPiJ1IiYmKGNlPXdpbmRvdy5tb21lbnQ/d2luZG93Lm1vbWVudDp3aW5kb3cuZGF5anM/d2luZG93LmRheWpzOndpbmRvdy5sdXhvbj93aW5kb3cubHV4b246bnVsbCksdGhpcy5jPU10LmV4dGVuZCghMCx7fSxkZS5kZWZhdWx0cyxlKTt2YXIgbj10aGlzLmMuY2xhc3NQcmVmaXg7aWYoIWNlJiZ0aGlzLmMuZm9ybWF0IT09IllZWVktTU0tREQiKXRocm93IkRhdGVUaW1lOiBXaXRob3V0IG1vbWVudGpzLCBkYXlqcyBvciBsdXhvbiBvbmx5IHRoZSBmb3JtYXQgJ1lZWVktTU0tREQnIGNhbiBiZSB1c2VkIjt0eXBlb2YgdGhpcy5jLm1pbkRhdGU9PSJzdHJpbmciJiYodGhpcy5jLm1pbkRhdGU9bmV3IERhdGUodGhpcy5jLm1pbkRhdGUpKSx0eXBlb2YgdGhpcy5jLm1heERhdGU9PSJzdHJpbmciJiYodGhpcy5jLm1heERhdGU9bmV3IERhdGUodGhpcy5jLm1heERhdGUpKTt2YXIgcj1NdCgnPGRpdiBjbGFzcz0iJytuKyciPjxkaXYgY2xhc3M9IicrbisnLWRhdGUiPjxkaXYgY2xhc3M9IicrbisnLXRpdGxlIj48ZGl2IGNsYXNzPSInK24rJy1pY29uTGVmdCI+PGJ1dHRvbiB0eXBlPSJidXR0b24iPjwvYnV0dG9uPjwvZGl2PjxkaXYgY2xhc3M9IicrbisnLWljb25SaWdodCI+PGJ1dHRvbiB0eXBlPSJidXR0b24iPjwvYnV0dG9uPjwvZGl2PjxkaXYgY2xhc3M9IicrbisnLWxhYmVsIj48c3Bhbj48L3NwYW4+PHNlbGVjdCBjbGFzcz0iJytuKyctbW9udGgiPjwvc2VsZWN0PjwvZGl2PjxkaXYgY2xhc3M9IicrbisnLWxhYmVsIj48c3Bhbj48L3NwYW4+PHNlbGVjdCBjbGFzcz0iJytuKycteWVhciI+PC9zZWxlY3Q+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0iJytuKyctYnV0dG9ucyI+PGEgY2xhc3M9IicrbisnLWNsZWFyIj48L2E+PGEgY2xhc3M9IicrbisnLXRvZGF5Ij48L2E+PC9kaXY+PGRpdiBjbGFzcz0iJytuKyctY2FsZW5kYXIiPjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9IicrbisnLXRpbWUiPjxkaXYgY2xhc3M9IicrbisnLWhvdXJzIj48L2Rpdj48ZGl2IGNsYXNzPSInK24rJy1taW51dGVzIj48L2Rpdj48ZGl2IGNsYXNzPSInK24rJy1zZWNvbmRzIj48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSInK24rJy1lcnJvciI+PC9kaXY+PC9kaXY+Jyk7dGhpcy5kb209e2NvbnRhaW5lcjpyLGRhdGU6ci5maW5kKCIuIituKyItZGF0ZSIpLHRpdGxlOnIuZmluZCgiLiIrbisiLXRpdGxlIiksY2FsZW5kYXI6ci5maW5kKCIuIituKyItY2FsZW5kYXIiKSx0aW1lOnIuZmluZCgiLiIrbisiLXRpbWUiKSxlcnJvcjpyLmZpbmQoIi4iK24rIi1lcnJvciIpLGJ1dHRvbnM6ci5maW5kKCIuIituKyItYnV0dG9ucyIpLGNsZWFyOnIuZmluZCgiLiIrbisiLWNsZWFyIiksdG9kYXk6ci5maW5kKCIuIituKyItdG9kYXkiKSxwcmV2aW91czpyLmZpbmQoIi4iK24rIi1pY29uTGVmdCIpLG5leHQ6ci5maW5kKCIuIituKyItaWNvblJpZ2h0IiksaW5wdXQ6TXQodCl9LHRoaXMucz17ZDpudWxsLGRpc3BsYXk6bnVsbCxtaW51dGVzUmFuZ2U6bnVsbCxzZWNvbmRzUmFuZ2U6bnVsbCxuYW1lc3BhY2U6ImRhdGVpbWUtIitkZS5faW5zdGFuY2UrKyxwYXJ0czp7ZGF0ZTp0aGlzLmMuZm9ybWF0Lm1hdGNoKC9bWU1EXXxMKD8hVCl8bC8pIT09bnVsbCx0aW1lOnRoaXMuYy5mb3JtYXQubWF0Y2goL1tIaG1dfExUfExUUy8pIT09bnVsbCxzZWNvbmRzOnRoaXMuYy5mb3JtYXQuaW5kZXhPZigicyIpIT09LTEsaG91cnMxMjp0aGlzLmMuZm9ybWF0Lm1hdGNoKC9baGFBXS8pIT09bnVsbH19LHRoaXMuZG9tLmNvbnRhaW5lci5hcHBlbmQodGhpcy5kb20uZGF0ZSkuYXBwZW5kKHRoaXMuZG9tLnRpbWUpLmFwcGVuZCh0aGlzLmRvbS5lcnJvciksdGhpcy5kb20uZGF0ZS5hcHBlbmQodGhpcy5kb20udGl0bGUpLmFwcGVuZCh0aGlzLmRvbS5idXR0b25zKS5hcHBlbmQodGhpcy5kb20uY2FsZW5kYXIpLHRoaXMuZG9tLmlucHV0LmFkZENsYXNzKCJkdC1kYXRldGltZSIpLHRoaXMuX2NvbnN0cnVjdG9yKCl9O010LmV4dGVuZChkZS5wcm90b3R5cGUse2Rlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLl9oaWRlKCEwKSx0aGlzLmRvbS5jb250YWluZXIub2ZmKCkuZW1wdHkoKSx0aGlzLmRvbS5pbnB1dC5yZW1vdmVDbGFzcygiZHQtZGF0ZXRpbWUiKS5yZW1vdmVBdHRyKCJhdXRvY29tcGxldGUiKS5vZmYoIi5kYXRldGltZSIpfSxkaXNwbGF5OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQhPT12b2lkIDAmJnRoaXMucy5kaXNwbGF5LnNldFVUQ0Z1bGxZZWFyKHQpLGUhPT12b2lkIDAmJnRoaXMucy5kaXNwbGF5LnNldFVUQ01vbnRoKGUtMSksdCE9PXZvaWQgMHx8ZSE9PXZvaWQgMD8odGhpcy5fc2V0VGl0bGUoKSx0aGlzLl9zZXRDYWxhbmRlcigpLHRoaXMpOnttb250aDp0aGlzLnMuZGlzcGxheS5nZXRVVENNb250aCgpKzEseWVhcjp0aGlzLnMuZGlzcGxheS5nZXRVVENGdWxsWWVhcigpfX0sZXJyb3JNc2c6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5kb20uZXJyb3I7cmV0dXJuIHQ/ZS5odG1sKHQpOmUuZW1wdHkoKSx0aGlzfSxoaWRlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2hpZGUoKSx0aGlzfSxtYXg6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuYy5tYXhEYXRlPXR5cGVvZiB0PT0ic3RyaW5nIj9uZXcgRGF0ZSh0KTp0LHRoaXMuX29wdGlvbnNUaXRsZSgpLHRoaXMuX3NldENhbGFuZGVyKCksdGhpc30sbWluOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmMubWluRGF0ZT10eXBlb2YgdD09InN0cmluZyI/bmV3IERhdGUodCk6dCx0aGlzLl9vcHRpb25zVGl0bGUoKSx0aGlzLl9zZXRDYWxhbmRlcigpLHRoaXN9LG93bnM6ZnVuY3Rpb24odCl7cmV0dXJuIE10KHQpLnBhcmVudHMoKS5maWx0ZXIodGhpcy5kb20uY29udGFpbmVyKS5sZW5ndGg+MH0sdmFsOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT12b2lkIDA/dGhpcy5zLmQ6KHQgaW5zdGFuY2VvZiBEYXRlP3RoaXMucy5kPXRoaXMuX2RhdGVUb1V0Yyh0KTp0PT09bnVsbHx8dD09PSIiP3RoaXMucy5kPW51bGw6dD09PSItLW5vdyI/dGhpcy5zLmQ9dGhpcy5fZGF0ZVRvVXRjKG5ldyBEYXRlKTp0eXBlb2YgdD09InN0cmluZyImJih0aGlzLnMuZD10aGlzLl9kYXRlVG9VdGModGhpcy5fY29udmVydCh0LHRoaXMuYy5mb3JtYXQsbnVsbCkpKSwoZXx8ZT09PXZvaWQgMCkmJih0aGlzLnMuZD90aGlzLl93cml0ZU91dHB1dCgpOnRoaXMuZG9tLmlucHV0LnZhbCh0KSksdGhpcy5zLmRpc3BsYXk9dGhpcy5zLmQ/bmV3IERhdGUodGhpcy5zLmQudG9TdHJpbmcoKSk6bmV3IERhdGUsdGhpcy5zLmRpc3BsYXkuc2V0VVRDRGF0ZSgxKSx0aGlzLl9zZXRUaXRsZSgpLHRoaXMuX3NldENhbGFuZGVyKCksdGhpcy5fc2V0VGltZSgpLHRoaXMpfSx2YWxGb3JtYXQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZT8odGhpcy52YWwodGhpcy5fY29udmVydChlLHQsbnVsbCkpLHRoaXMpOnRoaXMuX2NvbnZlcnQodGhpcy52YWwoKSxudWxsLHQpfSxfY29uc3RydWN0b3I6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy5jLmNsYXNzUHJlZml4LG49dGhpcy5kb20uaW5wdXQudmFsKCkscj1mdW5jdGlvbigpe3ZhciBzPXQuZG9tLmlucHV0LnZhbCgpO3MhPT1uJiYodC5jLm9uQ2hhbmdlLmNhbGwodCxzLHQucy5kLHQuZG9tLmlucHV0KSxuPXMpfTt0aGlzLnMucGFydHMuZGF0ZXx8dGhpcy5kb20uZGF0ZS5jc3MoImRpc3BsYXkiLCJub25lIiksdGhpcy5zLnBhcnRzLnRpbWV8fHRoaXMuZG9tLnRpbWUuY3NzKCJkaXNwbGF5Iiwibm9uZSIpLHRoaXMucy5wYXJ0cy5zZWNvbmRzfHwodGhpcy5kb20udGltZS5jaGlsZHJlbigiZGl2LiIrZSsiLXNlY29uZHMiKS5yZW1vdmUoKSx0aGlzLmRvbS50aW1lLmNoaWxkcmVuKCJzcGFuIikuZXEoMSkucmVtb3ZlKCkpLHRoaXMuYy5idXR0b25zLmNsZWFyfHx0aGlzLmRvbS5jbGVhci5jc3MoImRpc3BsYXkiLCJub25lIiksdGhpcy5jLmJ1dHRvbnMudG9kYXl8fHRoaXMuZG9tLnRvZGF5LmNzcygiZGlzcGxheSIsIm5vbmUiKSx0aGlzLl9vcHRpb25zVGl0bGUoKSxNdChkb2N1bWVudCkub24oImkxOG4uZHQiLGZ1bmN0aW9uKHMsaSl7aS5vTGFuZ3VhZ2UuZGF0ZXRpbWUmJihNdC5leHRlbmQoITAsdC5jLmkxOG4saS5vTGFuZ3VhZ2UuZGF0ZXRpbWUpLHQuX29wdGlvbnNUaXRsZSgpKX0pLHRoaXMuZG9tLmlucHV0LmF0dHIoInR5cGUiKT09PSJoaWRkZW4iJiYodGhpcy5kb20uY29udGFpbmVyLmFkZENsYXNzKCJpbmxpbmUiKSx0aGlzLmMuYXR0YWNoVG89ImlucHV0Iix0aGlzLnZhbCh0aGlzLmRvbS5pbnB1dC52YWwoKSwhMSksdGhpcy5fc2hvdygpKSxuJiZ0aGlzLnZhbChuLCExKSx0aGlzLmRvbS5pbnB1dC5hdHRyKCJhdXRvY29tcGxldGUiLCJvZmYiKS5vbigiZm9jdXMuZGF0ZXRpbWUgY2xpY2suZGF0ZXRpbWUiLGZ1bmN0aW9uKCl7dC5kb20uY29udGFpbmVyLmlzKCI6dmlzaWJsZSIpfHx0LmRvbS5pbnB1dC5pcygiOmRpc2FibGVkIil8fCh0LnZhbCh0LmRvbS5pbnB1dC52YWwoKSwhMSksdC5fc2hvdygpKX0pLm9uKCJrZXl1cC5kYXRldGltZSIsZnVuY3Rpb24oKXt0LmRvbS5jb250YWluZXIuaXMoIjp2aXNpYmxlIikmJnQudmFsKHQuZG9tLmlucHV0LnZhbCgpLCExKX0pLHRoaXMuZG9tLmNvbnRhaW5lclswXS5hZGRFdmVudExpc3RlbmVyKCJmb2N1c2luIixmdW5jdGlvbihzKXtzLnN0b3BQcm9wYWdhdGlvbigpfSksdGhpcy5kb20uY29udGFpbmVyLm9uKCJjaGFuZ2UiLCJzZWxlY3QiLGZ1bmN0aW9uKCl7dmFyIHM9TXQodGhpcyksaT1zLnZhbCgpO2lmKHMuaGFzQ2xhc3MoZSsiLW1vbnRoIikpdC5fY29ycmVjdE1vbnRoKHQucy5kaXNwbGF5LGkpLHQuX3NldFRpdGxlKCksdC5fc2V0Q2FsYW5kZXIoKTtlbHNlIGlmKHMuaGFzQ2xhc3MoZSsiLXllYXIiKSl0LnMuZGlzcGxheS5zZXRVVENGdWxsWWVhcihpKSx0Ll9zZXRUaXRsZSgpLHQuX3NldENhbGFuZGVyKCk7ZWxzZSBpZihzLmhhc0NsYXNzKGUrIi1ob3VycyIpfHxzLmhhc0NsYXNzKGUrIi1hbXBtIikpe2lmKHQucy5wYXJ0cy5ob3VyczEyKXt2YXIgbz1NdCh0LmRvbS5jb250YWluZXIpLmZpbmQoIi4iK2UrIi1ob3VycyIpLnZhbCgpKjEsdT1NdCh0LmRvbS5jb250YWluZXIpLmZpbmQoIi4iK2UrIi1hbXBtIikudmFsKCk9PT0icG0iO3Qucy5kLnNldFVUQ0hvdXJzKG89PT0xMiYmIXU/MDp1JiZvIT09MTI/bysxMjpvKX1lbHNlIHQucy5kLnNldFVUQ0hvdXJzKGkpO3QuX3NldFRpbWUoKSx0Ll93cml0ZU91dHB1dCghMCkscigpfWVsc2Ugcy5oYXNDbGFzcyhlKyItbWludXRlcyIpPyh0LnMuZC5zZXRVVENNaW51dGVzKGkpLHQuX3NldFRpbWUoKSx0Ll93cml0ZU91dHB1dCghMCkscigpKTpzLmhhc0NsYXNzKGUrIi1zZWNvbmRzIikmJih0LnMuZC5zZXRTZWNvbmRzKGkpLHQuX3NldFRpbWUoKSx0Ll93cml0ZU91dHB1dCghMCkscigpKTt0LmRvbS5pbnB1dC5mb2N1cygpLHQuX3Bvc2l0aW9uKCl9KS5vbigiY2xpY2siLGZ1bmN0aW9uKHMpe3ZhciBpPXQucy5kLG89cy50YXJnZXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSx1PW89PT0ic3BhbiI/cy50YXJnZXQucGFyZW50Tm9kZTpzLnRhcmdldDtpZihvPXUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxvIT09InNlbGVjdCIpaWYocy5zdG9wUHJvcGFnYXRpb24oKSxvPT09ImEiJiYocy5wcmV2ZW50RGVmYXVsdCgpLE10KHUpLmhhc0NsYXNzKGUrIi1jbGVhciIpPyh0LnMuZD1udWxsLHQuZG9tLmlucHV0LnZhbCgiIiksdC5fd3JpdGVPdXRwdXQoKSx0Ll9zZXRDYWxhbmRlcigpLHQuX3NldFRpbWUoKSxyKCkpOk10KHUpLmhhc0NsYXNzKGUrIi10b2RheSIpJiYodC5zLmRpc3BsYXk9bmV3IERhdGUsdC5fc2V0VGl0bGUoKSx0Ll9zZXRDYWxhbmRlcigpKSksbz09PSJidXR0b24iKXt2YXIgcD1NdCh1KSxiPXAucGFyZW50KCk7aWYoYi5oYXNDbGFzcygiZGlzYWJsZWQiKSYmIWIuaGFzQ2xhc3MoInJhbmdlIikpe3AuYmx1cigpO3JldHVybn1pZihiLmhhc0NsYXNzKGUrIi1pY29uTGVmdCIpKXQucy5kaXNwbGF5LnNldFVUQ01vbnRoKHQucy5kaXNwbGF5LmdldFVUQ01vbnRoKCktMSksdC5fc2V0VGl0bGUoKSx0Ll9zZXRDYWxhbmRlcigpLHQuZG9tLmlucHV0LmZvY3VzKCk7ZWxzZSBpZihiLmhhc0NsYXNzKGUrIi1pY29uUmlnaHQiKSl0Ll9jb3JyZWN0TW9udGgodC5zLmRpc3BsYXksdC5zLmRpc3BsYXkuZ2V0VVRDTW9udGgoKSsxKSx0Ll9zZXRUaXRsZSgpLHQuX3NldENhbGFuZGVyKCksdC5kb20uaW5wdXQuZm9jdXMoKTtlbHNlIGlmKHAucGFyZW50cygiLiIrZSsiLXRpbWUiKS5sZW5ndGgpe3ZhciBnPXAuZGF0YSgidmFsdWUiKSxtPXAuZGF0YSgidW5pdCIpO2lmKGk9dC5fbmVlZFZhbHVlKCksbT09PSJtaW51dGVzIilpZihiLmhhc0NsYXNzKCJkaXNhYmxlZCIpJiZiLmhhc0NsYXNzKCJyYW5nZSIpKXt0LnMubWludXRlc1JhbmdlPWcsdC5fc2V0VGltZSgpO3JldHVybn1lbHNlIHQucy5taW51dGVzUmFuZ2U9bnVsbDtpZihtPT09InNlY29uZHMiKWlmKGIuaGFzQ2xhc3MoImRpc2FibGVkIikmJmIuaGFzQ2xhc3MoInJhbmdlIikpe3Qucy5zZWNvbmRzUmFuZ2U9Zyx0Ll9zZXRUaW1lKCk7cmV0dXJufWVsc2UgdC5zLnNlY29uZHNSYW5nZT1udWxsO2lmKGc9PT0iYW0iKWlmKGkuZ2V0VVRDSG91cnMoKT49MTIpZz1pLmdldFVUQ0hvdXJzKCktMTI7ZWxzZSByZXR1cm47ZWxzZSBpZihnPT09InBtIilpZihpLmdldFVUQ0hvdXJzKCk8MTIpZz1pLmdldFVUQ0hvdXJzKCkrMTI7ZWxzZSByZXR1cm47dmFyIEM9bT09PSJob3VycyI/InNldFVUQ0hvdXJzIjptPT09Im1pbnV0ZXMiPyJzZXRVVENNaW51dGVzIjoic2V0U2Vjb25kcyI7aVtDXShnKSx0Ll9zZXRDYWxhbmRlcigpLHQuX3NldFRpbWUoKSx0Ll93cml0ZU91dHB1dCghMCkscigpfWVsc2UgaT10Ll9uZWVkVmFsdWUoKSxpLnNldFVUQ0RhdGUoMSksaS5zZXRVVENGdWxsWWVhcihwLmRhdGEoInllYXIiKSksaS5zZXRVVENNb250aChwLmRhdGEoIm1vbnRoIikpLGkuc2V0VVRDRGF0ZShwLmRhdGEoImRheSIpKSx0Ll93cml0ZU91dHB1dCghMCksdC5zLnBhcnRzLnRpbWU/KHQuX3NldENhbGFuZGVyKCksdC5fc2V0VGltZSgpKTpzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5faGlkZSgpfSwxMCkscigpfWVsc2UgdC5kb20uaW5wdXQuZm9jdXMoKX0pfSxfY29tcGFyZURhdGVzOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2lzTHV4b24oKT9jZS5EYXRlVGltZS5mcm9tSlNEYXRlKHQpLnRvVVRDKCkudG9JU09EYXRlKCk9PT1jZS5EYXRlVGltZS5mcm9tSlNEYXRlKGUpLnRvVVRDKCkudG9JU09EYXRlKCk6dGhpcy5fZGF0ZVRvVXRjU3RyaW5nKHQpPT09dGhpcy5fZGF0ZVRvVXRjU3RyaW5nKGUpfSxfY29udmVydDpmdW5jdGlvbih0LGUsbil7aWYoIXQpcmV0dXJuIHQ7aWYoY2UpaWYodGhpcy5faXNMdXhvbigpKXt2YXIgcz10IGluc3RhbmNlb2YgRGF0ZT9jZS5EYXRlVGltZS5mcm9tSlNEYXRlKHQpLnRvVVRDKCk6Y2UuRGF0ZVRpbWUuZnJvbUZvcm1hdCh0LGUpO3JldHVybiBzLmlzVmFsaWQ/bj9zLnRvRm9ybWF0KG4pOnMudG9KU0RhdGUoKTpudWxsfWVsc2V7dmFyIGk9dCBpbnN0YW5jZW9mIERhdGU/Y2UudXRjKHQsdm9pZCAwLHRoaXMuYy5sb2NhbGUsdGhpcy5jLnN0cmljdCk6Y2UodCxlLHRoaXMuYy5sb2NhbGUsdGhpcy5jLnN0cmljdCk7cmV0dXJuIGkuaXNWYWxpZCgpP24/aS5mb3JtYXQobik6aS50b0RhdGUoKTpudWxsfWVsc2V7aWYoIWUmJiFufHxlJiZuKXJldHVybiB0O2lmKGUpe3ZhciByPXQubWF0Y2goLyhcZHs0fSlcLShcZHsyfSlcLShcZHsyfSkvKTtyZXR1cm4gcj9uZXcgRGF0ZShyWzFdLHJbMl0tMSxyWzNdKTpudWxsfWVsc2UgcmV0dXJuIHQuZ2V0VVRDRnVsbFllYXIoKSsiLSIrdGhpcy5fcGFkKHQuZ2V0VVRDTW9udGgoKSsxKSsiLSIrdGhpcy5fcGFkKHQuZ2V0VVRDRGF0ZSgpKX19LF9jb3JyZWN0TW9udGg6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9kYXlzSW5Nb250aCh0LmdldFVUQ0Z1bGxZZWFyKCksZSkscj10LmdldFVUQ0RhdGUoKT5uO3Quc2V0VVRDTW9udGgoZSksciYmKHQuc2V0VVRDRGF0ZShuKSx0LnNldFVUQ01vbnRoKGUpKX0sX2RheXNJbk1vbnRoOmZ1bmN0aW9uKHQsZSl7dmFyIG49dCU0PT09MCYmKHQlMTAwIT09MHx8dCU0MDA9PT0wKSxyPVszMSxuPzI5OjI4LDMxLDMwLDMxLDMwLDMxLDMxLDMwLDMxLDMwLDMxXTtyZXR1cm4gcltlXX0sX2RhdGVUb1V0YzpmdW5jdGlvbih0KXtyZXR1cm4gdCYmbmV3IERhdGUoRGF0ZS5VVEModC5nZXRGdWxsWWVhcigpLHQuZ2V0TW9udGgoKSx0LmdldERhdGUoKSx0LmdldEhvdXJzKCksdC5nZXRNaW51dGVzKCksdC5nZXRTZWNvbmRzKCkpKX0sX2RhdGVUb1V0Y1N0cmluZzpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5faXNMdXhvbigpP2NlLkRhdGVUaW1lLmZyb21KU0RhdGUodCkudG9VVEMoKS50b0lTT0RhdGUoKTp0LmdldFVUQ0Z1bGxZZWFyKCkrIi0iK3RoaXMuX3BhZCh0LmdldFVUQ01vbnRoKCkrMSkrIi0iK3RoaXMuX3BhZCh0LmdldFVUQ0RhdGUoKSl9LF9oaWRlOmZ1bmN0aW9uKHQpe2lmKCEoIXQmJnRoaXMuZG9tLmlucHV0LmF0dHIoInR5cGUiKT09PSJoaWRkZW4iKSl7dmFyIGU9dGhpcy5zLm5hbWVzcGFjZTt0aGlzLmRvbS5jb250YWluZXIuZGV0YWNoKCksTXQod2luZG93KS5vZmYoIi4iK2UpLE10KGRvY3VtZW50KS5vZmYoImtleWRvd24uIitlKSxNdCgiZGl2LmRhdGFUYWJsZXNfc2Nyb2xsQm9keSIpLm9mZigic2Nyb2xsLiIrZSksTXQoImRpdi5EVEVfQm9keV9Db250ZW50Iikub2ZmKCJzY3JvbGwuIitlKSxNdCgiYm9keSIpLm9mZigiY2xpY2suIitlKSxNdCh0aGlzLmRvbS5pbnB1dFswXS5vZmZzZXRQYXJlbnQpLm9mZigiLiIrZSl9fSxfaG91cnMyNFRvMTI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT0wPzEyOnQ+MTI/dC0xMjp0fSxfaHRtbERheTpmdW5jdGlvbih0KXtpZih0LmVtcHR5KXJldHVybic8dGQgY2xhc3M9ImVtcHR5Ij48L3RkPic7dmFyIGU9WyJzZWxlY3RhYmxlIl0sbj10aGlzLmMuY2xhc3NQcmVmaXg7cmV0dXJuIHQuZGlzYWJsZWQmJmUucHVzaCgiZGlzYWJsZWQiKSx0LnRvZGF5JiZlLnB1c2goIm5vdyIpLHQuc2VsZWN0ZWQmJmUucHVzaCgic2VsZWN0ZWQiKSwnPHRkIGRhdGEtZGF5PSInK3QuZGF5KyciIGNsYXNzPSInK2Uuam9pbigiICIpKyciPjxidXR0b24gY2xhc3M9IicrbisiLWJ1dHRvbiAiK24rJy1kYXkiIHR5cGU9ImJ1dHRvbiIgZGF0YS15ZWFyPSInK3QueWVhcisnIiBkYXRhLW1vbnRoPSInK3QubW9udGgrJyIgZGF0YS1kYXk9IicrdC5kYXkrJyI+PHNwYW4+Jyt0LmRheSsiPC9zcGFuPjwvYnV0dG9uPjwvdGQ+In0sX2h0bWxNb250aDpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX2RhdGVUb1V0YyhuZXcgRGF0ZSkscj10aGlzLl9kYXlzSW5Nb250aCh0LGUpLHM9bmV3IERhdGUoRGF0ZS5VVEModCxlLDEpKS5nZXRVVENEYXkoKSxpPVtdLG89W107dGhpcy5jLmZpcnN0RGF5PjAmJihzLT10aGlzLmMuZmlyc3REYXksczwwJiYocys9NykpO2Zvcih2YXIgdT1yK3MscD11O3A+NzspcC09Nzt1Kz03LXA7dmFyIGI9dGhpcy5jLm1pbkRhdGUsZz10aGlzLmMubWF4RGF0ZTtiJiYoYi5zZXRVVENIb3VycygwKSxiLnNldFVUQ01pbnV0ZXMoMCksYi5zZXRTZWNvbmRzKDApKSxnJiYoZy5zZXRVVENIb3VycygyMyksZy5zZXRVVENNaW51dGVzKDU5KSxnLnNldFNlY29uZHMoNTkpKTtmb3IodmFyIG09MCxDPTA7bTx1O20rKyl7dmFyIHk9bmV3IERhdGUoRGF0ZS5VVEModCxlLDErKG0tcykpKSxUPXRoaXMucy5kP3RoaXMuX2NvbXBhcmVEYXRlcyh5LHRoaXMucy5kKTohMSxQPXRoaXMuX2NvbXBhcmVEYXRlcyh5LG4pLGM9bTxzfHxtPj1yK3MsbD1iJiZ5PGJ8fGcmJnk+ZyxoPXRoaXMuYy5kaXNhYmxlRGF5czsoQXJyYXkuaXNBcnJheShoKSYmTXQuaW5BcnJheSh5LmdldFVUQ0RheSgpLGgpIT09LTF8fHR5cGVvZiBoPT0iZnVuY3Rpb24iJiZoKHkpPT09ITApJiYobD0hMCk7dmFyIF89e2RheToxKyhtLXMpLG1vbnRoOmUseWVhcjp0LHNlbGVjdGVkOlQsdG9kYXk6UCxkaXNhYmxlZDpsLGVtcHR5OmN9O28ucHVzaCh0aGlzLl9odG1sRGF5KF8pKSwrK0M9PT03JiYodGhpcy5jLnNob3dXZWVrTnVtYmVyJiZvLnVuc2hpZnQodGhpcy5faHRtbFdlZWtPZlllYXIobS1zLGUsdCkpLGkucHVzaCgiPHRyPiIrby5qb2luKCIiKSsiPC90cj4iKSxvPVtdLEM9MCl9dmFyIEY9dGhpcy5jLmNsYXNzUHJlZml4LE89RisiLXRhYmxlIjtpZih0aGlzLmMuc2hvd1dlZWtOdW1iZXImJihPKz0iIHdlZWtOdW1iZXIiKSxiKXt2YXIgZj1iPj1uZXcgRGF0ZShEYXRlLlVUQyh0LGUsMSwwLDAsMCkpO3RoaXMuZG9tLnRpdGxlLmZpbmQoImRpdi4iK0YrIi1pY29uTGVmdCIpLmNzcygiZGlzcGxheSIsZj8ibm9uZSI6ImJsb2NrIil9aWYoZyl7dmFyIFU9ZzxuZXcgRGF0ZShEYXRlLlVUQyh0LGUrMSwxLDAsMCwwKSk7dGhpcy5kb20udGl0bGUuZmluZCgiZGl2LiIrRisiLWljb25SaWdodCIpLmNzcygiZGlzcGxheSIsVT8ibm9uZSI6ImJsb2NrIil9cmV0dXJuJzx0YWJsZSBjbGFzcz0iJytPKyciPjx0aGVhZD4nK3RoaXMuX2h0bWxNb250aEhlYWQoKSsiPC90aGVhZD48dGJvZHk+IitpLmpvaW4oIiIpKyI8L3Rib2R5PjwvdGFibGU+In0sX2h0bWxNb250aEhlYWQ6ZnVuY3Rpb24oKXt2YXIgdD1bXSxlPXRoaXMuYy5maXJzdERheSxuPXRoaXMuYy5pMThuLHI9ZnVuY3Rpb24oaSl7Zm9yKGkrPWU7aT49NzspaS09NztyZXR1cm4gbi53ZWVrZGF5c1tpXX07dGhpcy5jLnNob3dXZWVrTnVtYmVyJiZ0LnB1c2goIjx0aD48L3RoPiIpO2Zvcih2YXIgcz0wO3M8NztzKyspdC5wdXNoKCI8dGg+IityKHMpKyI8L3RoPiIpO3JldHVybiB0LmpvaW4oIiIpfSxfaHRtbFdlZWtPZlllYXI6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW5ldyBEYXRlKG4sZSx0LDAsMCwwLDApO3Iuc2V0RGF0ZShyLmdldERhdGUoKSs0LShyLmdldERheSgpfHw3KSk7dmFyIHM9bmV3IERhdGUobiwwLDEpLGk9TWF0aC5jZWlsKCgoci1zKS84NjRlNSsxKS83KTtyZXR1cm4nPHRkIGNsYXNzPSInK3RoaXMuYy5jbGFzc1ByZWZpeCsnLXdlZWsiPicraSsiPC90ZD4ifSxfaXNMdXhvbjpmdW5jdGlvbigpe3JldHVybiEhKGNlJiZjZS5EYXRlVGltZSYmY2UuRHVyYXRpb24mJmNlLlNldHRpbmdzKX0sX25lZWRWYWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnMuZHx8KHRoaXMucy5kPXRoaXMuX2RhdGVUb1V0YyhuZXcgRGF0ZSksdGhpcy5zLnBhcnRzLnRpbWV8fCh0aGlzLnMuZC5zZXRVVENIb3VycygwKSx0aGlzLnMuZC5zZXRVVENNaW51dGVzKDApLHRoaXMucy5kLnNldFNlY29uZHMoMCksdGhpcy5zLmQuc2V0TWlsbGlzZWNvbmRzKDApKSksdGhpcy5zLmR9LF9vcHRpb25zOmZ1bmN0aW9uKHQsZSxuKXtufHwobj1lKTt2YXIgcj10aGlzLmRvbS5jb250YWluZXIuZmluZCgic2VsZWN0LiIrdGhpcy5jLmNsYXNzUHJlZml4KyItIit0KTtyLmVtcHR5KCk7Zm9yKHZhciBzPTAsaT1lLmxlbmd0aDtzPGk7cysrKXIuYXBwZW5kKCc8b3B0aW9uIHZhbHVlPSInK2Vbc10rJyI+JytuW3NdKyI8L29wdGlvbj4iKX0sX29wdGlvblNldDpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZG9tLmNvbnRhaW5lci5maW5kKCJzZWxlY3QuIit0aGlzLmMuY2xhc3NQcmVmaXgrIi0iK3QpLHI9bi5wYXJlbnQoKS5jaGlsZHJlbigic3BhbiIpO24udmFsKGUpO3ZhciBzPW4uZmluZCgib3B0aW9uOnNlbGVjdGVkIik7ci5odG1sKHMubGVuZ3RoIT09MD9zLnRleHQoKTp0aGlzLmMuaTE4bi51bmtub3duKX0sX29wdGlvbnNUaW1lOmZ1bmN0aW9uKHQsZSxuLHIscyl7dmFyIGk9dGhpcy5jLmNsYXNzUHJlZml4LG89dGhpcy5kb20uY29udGFpbmVyLmZpbmQoImRpdi4iK2krIi0iK3QpLHUscCxiPWU9PT0xMj9mdW5jdGlvbihsKXtyZXR1cm4gbH06dGhpcy5fcGFkLGc9aSsiLXRhYmxlIixtPXRoaXMuYy5pMThuO2lmKG8ubGVuZ3RoKXt2YXIgQz0iIix5PTEwLFQ9ZnVuY3Rpb24obCxoLF8pe2U9PT0xMiYmdHlwZW9mIGw9PSJudW1iZXIiJiYobj49MTImJihsKz0xMiksbD09MTI/bD0wOmw9PTI0JiYobD0xMikpO3ZhciBGPW49PT1sfHxsPT09ImFtIiYmbjwxMnx8bD09PSJwbSImJm4+PTEyPyJzZWxlY3RlZCI6IiI7cmV0dXJuIHR5cGVvZiBsPT0ibnVtYmVyIiYmciYmTXQuaW5BcnJheShsLHIpPT09LTEmJihGKz0iIGRpc2FibGVkIiksXyYmKEYrPSIgIitfKSwnPHRkIGNsYXNzPSJzZWxlY3RhYmxlICcrRisnIj48YnV0dG9uIGNsYXNzPSInK2krIi1idXR0b24gIitpKyctZGF5IiB0eXBlPSJidXR0b24iIGRhdGEtdW5pdD0iJyt0KyciIGRhdGEtdmFsdWU9IicrbCsnIj48c3Bhbj4nK2grIjwvc3Bhbj48L2J1dHRvbj48L3RkPiJ9O2lmKGU9PT0xMil7Zm9yKEMrPSI8dHI+Iix1PTE7dTw9Njt1KyspQys9VCh1LGIodSkpO2ZvcihDKz1UKCJhbSIsbS5hbVBtWzBdKSxDKz0iPC90cj4iLEMrPSI8dHI+Iix1PTc7dTw9MTI7dSsrKUMrPVQodSxiKHUpKTtDKz1UKCJwbSIsbS5hbVBtWzFdKSxDKz0iPC90cj4iLHk9N31lbHNlIGlmKGU9PT0yNCl7dmFyIFA9MDtmb3IocD0wO3A8NDtwKyspe2ZvcihDKz0iPHRyPiIsdT0wO3U8Njt1KyspQys9VChQLGIoUCkpLFArKztDKz0iPC90cj4ifXk9Nn1lbHNle2ZvcihDKz0iPHRyPiIscD0wO3A8NjA7cCs9MTApQys9VChwLGIocCksInJhbmdlIik7Qys9IjwvdHI+IixDKz0nPC90Ym9keT48L3RoZWFkPjx0YWJsZSBjbGFzcz0iJytnKyIgIitnKyctbm9zcGFjZSI+PHRib2R5Pic7dmFyIGM9cyE9PW51bGw/czpuPT09LTE/MDpNYXRoLmZsb29yKG4vMTApKjEwO2ZvcihDKz0iPHRyPiIscD1jKzE7cDxjKzEwO3ArKylDKz1UKHAsYihwKSk7Qys9IjwvdHI+Iix5PTZ9by5lbXB0eSgpLmFwcGVuZCgnPHRhYmxlIGNsYXNzPSInK2crJyI+PHRoZWFkPjx0cj48dGggY29sc3Bhbj0iJyt5KyciPicrbVt0XSsiPC90aD48L3RyPjwvdGhlYWQ+PHRib2R5PiIrQysiPC90Ym9keT48L3RhYmxlPiIpfX0sX29wdGlvbnNUaXRsZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuYy5pMThuLGU9dGhpcy5jLm1pbkRhdGUsbj10aGlzLmMubWF4RGF0ZSxyPWU/ZS5nZXRGdWxsWWVhcigpOm51bGwscz1uP24uZ2V0RnVsbFllYXIoKTpudWxsLGk9ciE9PW51bGw/cjpuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCktdGhpcy5jLnllYXJSYW5nZSxvPXMhPT1udWxsP3M6bmV3IERhdGUoKS5nZXRGdWxsWWVhcigpK3RoaXMuYy55ZWFyUmFuZ2U7dGhpcy5fb3B0aW9ucygibW9udGgiLHRoaXMuX3JhbmdlKDAsMTEpLHQubW9udGhzKSx0aGlzLl9vcHRpb25zKCJ5ZWFyIix0aGlzLl9yYW5nZShpLG8pKSx0aGlzLmRvbS50b2RheS50ZXh0KHQudG9kYXkpLnRleHQodC50b2RheSksdGhpcy5kb20uY2xlYXIudGV4dCh0LmNsZWFyKS50ZXh0KHQuY2xlYXIpLHRoaXMuZG9tLnByZXZpb3VzLmF0dHIoInRpdGxlIix0LnByZXZpb3VzKS5jaGlsZHJlbigiYnV0dG9uIikudGV4dCh0LnByZXZpb3VzKSx0aGlzLmRvbS5uZXh0LmF0dHIoInRpdGxlIix0Lm5leHQpLmNoaWxkcmVuKCJidXR0b24iKS50ZXh0KHQubmV4dCl9LF9wYWQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQ8MTA/IjAiK3Q6dH0sX3Bvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jLmF0dGFjaFRvPT09ImlucHV0Ij90aGlzLmRvbS5pbnB1dC5wb3NpdGlvbigpOnRoaXMuZG9tLmlucHV0Lm9mZnNldCgpLGU9dGhpcy5kb20uY29udGFpbmVyLG49dGhpcy5kb20uaW5wdXQub3V0ZXJIZWlnaHQoKTtpZihlLmhhc0NsYXNzKCJpbmxpbmUiKSl7ZS5pbnNlcnRBZnRlcih0aGlzLmRvbS5pbnB1dCk7cmV0dXJufXRoaXMucy5wYXJ0cy5kYXRlJiZ0aGlzLnMucGFydHMudGltZSYmTXQod2luZG93KS53aWR0aCgpPjU1MD9lLmFkZENsYXNzKCJob3Jpem9udGFsIik6ZS5yZW1vdmVDbGFzcygiaG9yaXpvbnRhbCIpLHRoaXMuYy5hdHRhY2hUbz09PSJpbnB1dCI/ZS5jc3Moe3RvcDp0LnRvcCtuLGxlZnQ6dC5sZWZ0fSkuaW5zZXJ0QWZ0ZXIodGhpcy5kb20uaW5wdXQpOmUuY3NzKHt0b3A6dC50b3ArbixsZWZ0OnQubGVmdH0pLmFwcGVuZFRvKCJib2R5Iik7dmFyIHI9ZS5vdXRlckhlaWdodCgpLHM9ZS5vdXRlcldpZHRoKCksaT1NdCh3aW5kb3cpLnNjcm9sbFRvcCgpO2lmKHQudG9wK24rci1pPk10KHdpbmRvdykuaGVpZ2h0KCkpe3ZhciBvPXQudG9wLXI7ZS5jc3MoInRvcCIsbzwwPzA6byl9aWYocyt0LmxlZnQ+TXQod2luZG93KS53aWR0aCgpKXt2YXIgdT1NdCh3aW5kb3cpLndpZHRoKCktczt0aGlzLmMuYXR0YWNoVG89PT0iaW5wdXQiJiYodS09TXQoZSkub2Zmc2V0UGFyZW50KCkub2Zmc2V0KCkubGVmdCksZS5jc3MoImxlZnQiLHU8MD8wOnUpfX0sX3JhbmdlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1bXTtufHwobj0xKTtmb3IodmFyIHM9dDtzPD1lO3MrPW4pci5wdXNoKHMpO3JldHVybiByfSxfc2V0Q2FsYW5kZXI6ZnVuY3Rpb24oKXt0aGlzLnMuZGlzcGxheSYmdGhpcy5kb20uY2FsZW5kYXIuZW1wdHkoKS5hcHBlbmQodGhpcy5faHRtbE1vbnRoKHRoaXMucy5kaXNwbGF5LmdldFVUQ0Z1bGxZZWFyKCksdGhpcy5zLmRpc3BsYXkuZ2V0VVRDTW9udGgoKSkpfSxfc2V0VGl0bGU6ZnVuY3Rpb24oKXt0aGlzLl9vcHRpb25TZXQoIm1vbnRoIix0aGlzLnMuZGlzcGxheS5nZXRVVENNb250aCgpKSx0aGlzLl9vcHRpb25TZXQoInllYXIiLHRoaXMucy5kaXNwbGF5LmdldFVUQ0Z1bGxZZWFyKCkpfSxfc2V0VGltZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10aGlzLnMuZCxuPW51bGw7dGhpcy5faXNMdXhvbigpJiYobj1jZS5EYXRlVGltZS5mcm9tSlNEYXRlKGUpLnRvVVRDKCkpO3ZhciByPW4hPW51bGw/bi5ob3VyOmU/ZS5nZXRVVENIb3VycygpOi0xLHM9ZnVuY3Rpb24oaSl7cmV0dXJuIHQuY1tpKyJBdmFpbGFibGUiXT90LmNbaSsiQXZhaWxhYmxlIl06dC5fcmFuZ2UoMCw1OSx0LmNbaSsiSW5jcmVtZW50Il0pfTt0aGlzLl9vcHRpb25zVGltZSgiaG91cnMiLHRoaXMucy5wYXJ0cy5ob3VyczEyPzEyOjI0LHIsdGhpcy5jLmhvdXJzQXZhaWxhYmxlKSx0aGlzLl9vcHRpb25zVGltZSgibWludXRlcyIsNjAsbiE9bnVsbD9uLm1pbnV0ZTplP2UuZ2V0VVRDTWludXRlcygpOi0xLHMoIm1pbnV0ZXMiKSx0aGlzLnMubWludXRlc1JhbmdlKSx0aGlzLl9vcHRpb25zVGltZSgic2Vjb25kcyIsNjAsbiE9bnVsbD9uLnNlY29uZDplP2UuZ2V0U2Vjb25kcygpOi0xLHMoInNlY29uZHMiKSx0aGlzLnMuc2Vjb25kc1JhbmdlKX0sX3Nob3c6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy5zLm5hbWVzcGFjZTt0aGlzLl9wb3NpdGlvbigpLE10KHdpbmRvdykub24oInNjcm9sbC4iK2UrIiByZXNpemUuIitlLGZ1bmN0aW9uKCl7dC5fcG9zaXRpb24oKX0pLE10KCJkaXYuRFRFX0JvZHlfQ29udGVudCIpLm9uKCJzY3JvbGwuIitlLGZ1bmN0aW9uKCl7dC5fcG9zaXRpb24oKX0pLE10KCJkaXYuZGF0YVRhYmxlc19zY3JvbGxCb2R5Iikub24oInNjcm9sbC4iK2UsZnVuY3Rpb24oKXt0Ll9wb3NpdGlvbigpfSk7dmFyIG49dGhpcy5kb20uaW5wdXRbMF0ub2Zmc2V0UGFyZW50O24hPT1kb2N1bWVudC5ib2R5JiZNdChuKS5vbigic2Nyb2xsLiIrZSxmdW5jdGlvbigpe3QuX3Bvc2l0aW9uKCl9KSxNdChkb2N1bWVudCkub24oImtleWRvd24uIitlLGZ1bmN0aW9uKHIpeyhyLmtleUNvZGU9PT05fHxyLmtleUNvZGU9PT0yN3x8ci5rZXlDb2RlPT09MTMpJiZ0Ll9oaWRlKCl9KSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7TXQoImJvZHkiKS5vbigiY2xpY2suIitlLGZ1bmN0aW9uKHIpe3ZhciBzPU10KHIudGFyZ2V0KS5wYXJlbnRzKCk7IXMuZmlsdGVyKHQuZG9tLmNvbnRhaW5lcikubGVuZ3RoJiZyLnRhcmdldCE9PXQuZG9tLmlucHV0WzBdJiZ0Ll9oaWRlKCl9KX0sMTApfSxfd3JpdGVPdXRwdXQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5zLmQsbj0iIixyPXRoaXMuZG9tLmlucHV0O2UmJihuPXRoaXMuX2NvbnZlcnQoZSxudWxsLHRoaXMuYy5mb3JtYXQpKSxyLnZhbChuKTt2YXIgcz1uZXcgRXZlbnQoImNoYW5nZSIse2J1YmJsZXM6ITB9KTtyWzBdLmRpc3BhdGNoRXZlbnQocyksci5hdHRyKCJ0eXBlIik9PT0iaGlkZGVuIiYmdGhpcy52YWwobiwhMSksdCYmci5mb2N1cygpfX0pO2RlLnVzZT1mdW5jdGlvbih0KXtjZT10fTtkZS5faW5zdGFuY2U9MDtkZS50eXBlPSJEYXRlVGltZSI7ZGUuZGVmYXVsdHM9e2F0dGFjaFRvOiJib2R5IixidXR0b25zOntjbGVhcjohMSx0b2RheTohMX0sY2xhc3NQcmVmaXg6ImR0LWRhdGV0aW1lIixkaXNhYmxlRGF5czpudWxsLGZpcnN0RGF5OjEsZm9ybWF0OiJZWVlZLU1NLUREIixob3Vyc0F2YWlsYWJsZTpudWxsLGkxOG46e2NsZWFyOiJDbGVhciIscHJldmlvdXM6IlByZXZpb3VzIixuZXh0OiJOZXh0Iixtb250aHM6WyJKYW51YXJ5IiwiRmVicnVhcnkiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWd1c3QiLCJTZXB0ZW1iZXIiLCJPY3RvYmVyIiwiTm92ZW1iZXIiLCJEZWNlbWJlciJdLHdlZWtkYXlzOlsiU3VuIiwiTW9uIiwiVHVlIiwiV2VkIiwiVGh1IiwiRnJpIiwiU2F0Il0sYW1QbTpbImFtIiwicG0iXSxob3VyczoiSG91ciIsbWludXRlczoiTWludXRlIixzZWNvbmRzOiJTZWNvbmQiLHVua25vd246Ii0iLHRvZGF5OiJUb2RheSJ9LG1heERhdGU6bnVsbCxtaW5EYXRlOm51bGwsbWludXRlc0F2YWlsYWJsZTpudWxsLG1pbnV0ZXNJbmNyZW1lbnQ6MSxzdHJpY3Q6ITAsbG9jYWxlOiJlbiIsb25DaGFuZ2U6ZnVuY3Rpb24oKXt9LHNlY29uZHNBdmFpbGFibGU6bnVsbCxzZWNvbmRzSW5jcmVtZW50OjEsc2hvd1dlZWtOdW1iZXI6ITEseWVhclJhbmdlOjI1fTtkZS52ZXJzaW9uPSIxLjUuMyI7ZGUuZmFjdG9yeT1mdW5jdGlvbih0LGUpe3ZhciBuPSExO3JldHVybiB0JiZ0LmRvY3VtZW50JiYod2luZG93PXQsZG9jdW1lbnQ9dC5kb2N1bWVudCksZSYmZS5mbiYmZS5mbi5qcXVlcnkmJihNdD1lLG49ITApLG59O3dpbmRvdy5EYXRlVGltZXx8KHdpbmRvdy5EYXRlVGltZT1kZSk7d2luZG93LkRhdGFUYWJsZSYmKHdpbmRvdy5EYXRhVGFibGUuRGF0ZVRpbWU9ZGUpO010LmZuLmR0RGF0ZVRpbWU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe25ldyBkZSh0aGlzLHQpfSl9O010LmZuLmRhdGFUYWJsZSYmKE10LmZuLmRhdGFUYWJsZS5EYXRlVGltZT1kZSxNdC5mbi5EYXRhVGFibGUuRGF0ZVRpbWU9ZGUsTXQuZm4uZGF0YVRhYmxlLkVkaXRvciYmKE10LmZuLmRhdGFUYWJsZS5FZGl0b3IuRGF0ZVRpbWU9ZGUpKTt2YXIgaWQ9ZGU7dmFyIGFkPWllKGFlKCksMSk7dmFyICRzPWllKGFlKCksMSk7dmFyIGNuPSRzLmRlZmF1bHQ7KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciB0LGU7ZnVuY3Rpb24gbigpe3ZhciBjPWF0LnVzZSgibW9tZW50Iik7cmV0dXJuIGN8fHdpbmRvdy5tb21lbnR9ZnVuY3Rpb24gcigpe3ZhciBjPWF0LnVzZSgibHV4b24iKTtyZXR1cm4gY3x8d2luZG93Lmx1eG9ufWZ1bmN0aW9uIHMoYyl7dD1jLGU9Yy5mbi5kYXRhVGFibGV9dmFyIGk9ZnVuY3Rpb24oKXtmdW5jdGlvbiBjKGwsaCxfLEYsTyxmLFUpe0Y9PT12b2lkIDAmJihGPTApLE89PT12b2lkIDAmJihPPTEpLGY9PT12b2lkIDAmJihmPXZvaWQgMCksVT09PXZvaWQgMCYmKFU9ITEpO3ZhciBYPXRoaXM7dGhpcy5jbGFzc2VzPXQuZXh0ZW5kKCEwLHt9LGMuY2xhc3NlcyksdGhpcy5jPXQuZXh0ZW5kKCEwLHt9LGMuZGVmYXVsdHMsdC5mbi5kYXRhVGFibGUuZXh0LnNlYXJjaEJ1aWxkZXIsaCk7dmFyIFE9dGhpcy5jLmkxOG47aWYodGhpcy5zPXtjb25kaXRpb246dm9pZCAwLGNvbmRpdGlvbnM6e30sZGF0YTp2b2lkIDAsZGF0YUlkeDotMSxkYXRhUG9pbnRzOltdLGRhdGVGb3JtYXQ6ITEsZGVwdGg6TyxkdDpsLGZpbGxlZDohMSxpbmRleDpGLGxpdmVTZWFyY2g6VSxvcmlnRGF0YTp2b2lkIDAscHJldmVudFJlZHJhdzohMSxzZXJ2ZXJEYXRhOmYsdG9wR3JvdXA6Xyx0eXBlOiIiLHZhbHVlOltdfSx0aGlzLmRvbT17YnV0dG9uczp0KCI8ZGl2Lz4iKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuYnV0dG9uQ29udGFpbmVyKSxjb25kaXRpb246dCgiPHNlbGVjdCBkaXNhYmxlZC8+IikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmNvbmRpdGlvbikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmRyb3BEb3duKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuaXRhbGljKS5hdHRyKCJhdXRvY29tcGxldGUiLCJoYWNraW5nIiksY29uZGl0aW9uVGl0bGU6dCgnPG9wdGlvbiB2YWx1ZT0iIiBkaXNhYmxlZCBzZWxlY3RlZCBoaWRkZW4vPicpLmh0bWwodGhpcy5zLmR0LmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9uIixRLmNvbmRpdGlvbikpLGNvbnRhaW5lcjp0KCI8ZGl2Lz4iKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuY29udGFpbmVyKSxkYXRhOnQoIjxzZWxlY3QvPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5kYXRhKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuZHJvcERvd24pLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5pdGFsaWMpLGRhdGFUaXRsZTp0KCc8b3B0aW9uIHZhbHVlPSIiIGRpc2FibGVkIHNlbGVjdGVkIGhpZGRlbi8+JykuaHRtbCh0aGlzLnMuZHQuaTE4bigic2VhcmNoQnVpbGRlci5kYXRhIixRLmRhdGEpKSxkZWZhdWx0VmFsdWU6dCgiPHNlbGVjdCBkaXNhYmxlZC8+IikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnZhbHVlKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuZHJvcERvd24pLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5zZWxlY3QpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5pdGFsaWMpLGRlbGV0ZTp0KCI8YnV0dG9uLz4iKS5odG1sKHRoaXMucy5kdC5pMThuKCJzZWFyY2hCdWlsZGVyLmRlbGV0ZSIsUS5kZWxldGUpKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuZGVsZXRlKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuYnV0dG9uKS5hdHRyKCJ0aXRsZSIsdGhpcy5zLmR0LmkxOG4oInNlYXJjaEJ1aWxkZXIuZGVsZXRlVGl0bGUiLFEuZGVsZXRlVGl0bGUpKS5hdHRyKCJ0eXBlIiwiYnV0dG9uIiksaW5wdXRDb250OnQoIjxkaXYvPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5pbnB1dENvbnQpLGxlZnQ6dCgiPGJ1dHRvbi8+IikuaHRtbCh0aGlzLnMuZHQuaTE4bigic2VhcmNoQnVpbGRlci5sZWZ0IixRLmxlZnQpKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMubGVmdCkuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmJ1dHRvbikuYXR0cigidGl0bGUiLHRoaXMucy5kdC5pMThuKCJzZWFyY2hCdWlsZGVyLmxlZnRUaXRsZSIsUS5sZWZ0VGl0bGUpKS5hdHRyKCJ0eXBlIiwiYnV0dG9uIikscmlnaHQ6dCgiPGJ1dHRvbi8+IikuaHRtbCh0aGlzLnMuZHQuaTE4bigic2VhcmNoQnVpbGRlci5yaWdodCIsUS5yaWdodCkpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5yaWdodCkuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmJ1dHRvbikuYXR0cigidGl0bGUiLHRoaXMucy5kdC5pMThuKCJzZWFyY2hCdWlsZGVyLnJpZ2h0VGl0bGUiLFEucmlnaHRUaXRsZSkpLmF0dHIoInR5cGUiLCJidXR0b24iKSx2YWx1ZTpbdCgiPHNlbGVjdCBkaXNhYmxlZC8+IikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnZhbHVlKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuZHJvcERvd24pLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5pdGFsaWMpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5zZWxlY3QpXSx2YWx1ZVRpdGxlOnQoJzxvcHRpb24gdmFsdWU9Ii0tdmFsdWVUaXRsZS0tIiBkaXNhYmxlZCBzZWxlY3RlZCBoaWRkZW4vPicpLmh0bWwodGhpcy5zLmR0LmkxOG4oInNlYXJjaEJ1aWxkZXIudmFsdWUiLFEudmFsdWUpKX0sdGhpcy5jLmdyZXlzY2FsZSl7dGhpcy5kb20uZGF0YS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuZ3JleXNjYWxlKSx0aGlzLmRvbS5jb25kaXRpb24uYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmdyZXlzY2FsZSksdGhpcy5kb20uZGVmYXVsdFZhbHVlLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5ncmV5c2NhbGUpO2Zvcih2YXIgRT0wLCQ9dGhpcy5kb20udmFsdWU7RTwkLmxlbmd0aDtFKyspe3ZhciB3PSRbRV07dy5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuZ3JleXNjYWxlKX19cmV0dXJuIHQod2luZG93KS5vbigicmVzaXplLmR0c2IiLGUudXRpbC50aHJvdHRsZShmdW5jdGlvbigpe1gucy50b3BHcm91cC50cmlnZ2VyKCJkdHNiLXJlZHJhd0xvZ2ljIil9KSksdGhpcy5fYnVpbGRDcml0ZXJpYSgpLHRoaXN9cmV0dXJuIGMuX2VzY2FwZUhUTUw9ZnVuY3Rpb24obCl7cmV0dXJuIGwudG9TdHJpbmcoKS5yZXBsYWNlKC8mbHQ7L2csIjwiKS5yZXBsYWNlKC8mZ3Q7L2csIj4iKS5yZXBsYWNlKC8mcXVvdDsvZywnIicpLnJlcGxhY2UoLyZhbXA7L2csIiYiKX0sYy5wcm90b3R5cGUuZG9TZWFyY2g9ZnVuY3Rpb24oKXt0aGlzLmMubGl2ZVNlYXJjaCYmdGhpcy5zLmR0LmRyYXcoKX0sYy5wYXJzZU51bUZtdD1mdW5jdGlvbihsKXtyZXR1cm4rbC5yZXBsYWNlKC8oPyFeLSlbXjAtOS5dL2csIiIpfSxjLnByb3RvdHlwZS51cGRhdGVBcnJvd3M9ZnVuY3Rpb24obCl7bD09PXZvaWQgMCYmKGw9ITEpLHRoaXMuZG9tLmNvbnRhaW5lci5jaGlsZHJlbigpLmRldGFjaCgpLHRoaXMuZG9tLmNvbnRhaW5lci5hcHBlbmQodGhpcy5kb20uZGF0YSkuYXBwZW5kKHRoaXMuZG9tLmNvbmRpdGlvbikuYXBwZW5kKHRoaXMuZG9tLmlucHV0Q29udCksdGhpcy5zZXRMaXN0ZW5lcnMoKSx0aGlzLmRvbS52YWx1ZVswXSE9PXZvaWQgMCYmdCh0aGlzLmRvbS52YWx1ZVswXSkudHJpZ2dlcigiZHRzYi1pbnNlcnRlZCIpO2Zvcih2YXIgaD0xO2g8dGhpcy5kb20udmFsdWUubGVuZ3RoO2grKyl0aGlzLmRvbS5pbnB1dENvbnQuYXBwZW5kKHRoaXMuZG9tLnZhbHVlW2hdKSx0KHRoaXMuZG9tLnZhbHVlW2hdKS50cmlnZ2VyKCJkdHNiLWluc2VydGVkIik7dGhpcy5zLmRlcHRoPjEmJnRoaXMuZG9tLmJ1dHRvbnMuYXBwZW5kKHRoaXMuZG9tLmxlZnQpLCh0aGlzLmMuZGVwdGhMaW1pdD09PSExfHx0aGlzLnMuZGVwdGg8dGhpcy5jLmRlcHRoTGltaXQpJiZsP3RoaXMuZG9tLmJ1dHRvbnMuYXBwZW5kKHRoaXMuZG9tLnJpZ2h0KTp0aGlzLmRvbS5yaWdodC5yZW1vdmUoKSx0aGlzLmRvbS5idXR0b25zLmFwcGVuZCh0aGlzLmRvbS5kZWxldGUpLHRoaXMuZG9tLmNvbnRhaW5lci5hcHBlbmQodGhpcy5kb20uYnV0dG9ucyl9LGMucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLmRvbS5kYXRhLm9mZigiLmR0c2IiKSx0aGlzLmRvbS5jb25kaXRpb24ub2ZmKCIuZHRzYiIpLHRoaXMuZG9tLmRlbGV0ZS5vZmYoIi5kdHNiIik7Zm9yKHZhciBsPTAsaD10aGlzLmRvbS52YWx1ZTtsPGgubGVuZ3RoO2wrKyl7dmFyIF89aFtsXTtfLm9mZigiLmR0c2IiKX10aGlzLmRvbS5jb250YWluZXIucmVtb3ZlKCl9LGMucHJvdG90eXBlLnNlYXJjaD1mdW5jdGlvbihsLGgpe3ZhciBfPXRoaXMucy5kdC5zZXR0aW5ncygpWzBdLEY9dGhpcy5zLmNvbmRpdGlvbnNbdGhpcy5zLmNvbmRpdGlvbl07aWYodGhpcy5zLmNvbmRpdGlvbiE9PXZvaWQgMCYmRiE9PXZvaWQgMCl7dmFyIE89bFt0aGlzLnMuZGF0YUlkeF07aWYodGhpcy5zLnR5cGUmJnRoaXMucy50eXBlLmluY2x1ZGVzKCJudW0iKSYmKF8ub0xhbmd1YWdlLnNEZWNpbWFsIT09IiJ8fF8ub0xhbmd1YWdlLnNUaG91c2FuZHMhPT0iIikpe3ZhciBmPVtsW3RoaXMucy5kYXRhSWR4XV07aWYoXy5vTGFuZ3VhZ2Uuc0RlY2ltYWwhPT0iIiYmKGY9bFt0aGlzLnMuZGF0YUlkeF0uc3BsaXQoXy5vTGFuZ3VhZ2Uuc0RlY2ltYWwpKSxfLm9MYW5ndWFnZS5zVGhvdXNhbmRzIT09IiIpZm9yKHZhciBVPTA7VTxmLmxlbmd0aDtVKyspZltVXT1mW1VdLnJlcGxhY2UoXy5vTGFuZ3VhZ2Uuc1Rob3VzYW5kcywiLCIpO089Zi5qb2luKCIuIil9aWYodGhpcy5jLm9ydGhvZ29uYWwuc2VhcmNoIT09ImZpbHRlciImJihPPV8uZmFzdERhdGEoaCx0aGlzLnMuZGF0YUlkeCx0eXBlb2YgdGhpcy5jLm9ydGhvZ29uYWw9PSJzdHJpbmciP3RoaXMuYy5vcnRob2dvbmFsOnRoaXMuYy5vcnRob2dvbmFsLnNlYXJjaCkpLHRoaXMucy50eXBlPT09ImFycmF5Iil7QXJyYXkuaXNBcnJheShPKXx8KE89W09dKSxPLnNvcnQoKTtmb3IodmFyIFg9MCxRPU87WDxRLmxlbmd0aDtYKyspe3ZhciBFPVFbWF07RSYmdHlwZW9mIEU9PSJzdHJpbmciJiYoRT1FLnJlcGxhY2UoL1tcclxuXHUyMDI4XS9nLCIgIikpfX1lbHNlIE8hPT1udWxsJiZ0eXBlb2YgTz09InN0cmluZyImJihPPU8ucmVwbGFjZSgvW1xyXG5cdTIwMjhdL2csIiAiKSk7cmV0dXJuIHRoaXMucy50eXBlLmluY2x1ZGVzKCJodG1sIikmJnR5cGVvZiBPPT0ic3RyaW5nIiYmKE89Ty5yZXBsYWNlKC8oPChbXj5dKyk+KS9pZywiIikpLE89PT1udWxsJiYoTz0iIiksRi5zZWFyY2goTyx0aGlzLnMudmFsdWUsdGhpcyl9fSxjLnByb3RvdHlwZS5nZXREZXRhaWxzPWZ1bmN0aW9uKGwpe2w9PT12b2lkIDAmJihsPSExKTt2YXIgaCxfPXRoaXMucy5kdC5zZXR0aW5ncygpWzBdO2lmKHRoaXMucy50eXBlIT09bnVsbCYmdGhpcy5zLnR5cGUuaW5jbHVkZXMoIm51bSIpJiYoXy5vTGFuZ3VhZ2Uuc0RlY2ltYWwhPT0iInx8Xy5vTGFuZ3VhZ2Uuc1Rob3VzYW5kcyE9PSIiKSlmb3IoaD0wO2g8dGhpcy5zLnZhbHVlLmxlbmd0aDtoKyspe3ZhciBGPVt0aGlzLnMudmFsdWVbaF0udG9TdHJpbmcoKV07aWYoXy5vTGFuZ3VhZ2Uuc0RlY2ltYWwhPT0iIiYmKEY9dGhpcy5zLnZhbHVlW2hdLnNwbGl0KF8ub0xhbmd1YWdlLnNEZWNpbWFsKSksXy5vTGFuZ3VhZ2Uuc1Rob3VzYW5kcyE9PSIiKWZvcih2YXIgTz0wO088Ri5sZW5ndGg7TysrKUZbT109RltPXS5yZXBsYWNlKF8ub0xhbmd1YWdlLnNUaG91c2FuZHMsIiwiKTt0aGlzLnMudmFsdWVbaF09Ri5qb2luKCIuIil9ZWxzZSBpZih0aGlzLnMudHlwZSE9PW51bGwmJmwpe2lmKHRoaXMucy50eXBlLmluY2x1ZGVzKCJkYXRlIil8fHRoaXMucy50eXBlLmluY2x1ZGVzKCJ0aW1lIikpZm9yKGg9MDtoPHRoaXMucy52YWx1ZS5sZW5ndGg7aCsrKXRoaXMucy52YWx1ZVtoXS5tYXRjaCgvXlxkezR9LShbMF1cZHwxWzAtMl0pLShbMC0yXVxkfDNbMDFdKSQvZyk9PT1udWxsJiYodGhpcy5zLnZhbHVlW2hdPSIiKTtlbHNlIGlmKHRoaXMucy50eXBlLmluY2x1ZGVzKCJtb21lbnQiKSlmb3IoaD0wO2g8dGhpcy5zLnZhbHVlLmxlbmd0aDtoKyspdGhpcy5zLnZhbHVlW2hdJiZ0aGlzLnMudmFsdWVbaF0ubGVuZ3RoPjAmJm4oKSh0aGlzLnMudmFsdWVbaF0sdGhpcy5zLmRhdGVGb3JtYXQsITApLmlzVmFsaWQoKSYmKHRoaXMucy52YWx1ZVtoXT1uKCkodGhpcy5zLnZhbHVlW2hdLHRoaXMucy5kYXRlRm9ybWF0KS5mb3JtYXQoIllZWVktTU0tREQgSEg6bW06c3MiKSk7ZWxzZSBpZih0aGlzLnMudHlwZS5pbmNsdWRlcygibHV4b24iKSlmb3IoaD0wO2g8dGhpcy5zLnZhbHVlLmxlbmd0aDtoKyspdGhpcy5zLnZhbHVlW2hdJiZ0aGlzLnMudmFsdWVbaF0ubGVuZ3RoPjAmJnIoKS5EYXRlVGltZS5mcm9tRm9ybWF0KHRoaXMucy52YWx1ZVtoXSx0aGlzLnMuZGF0ZUZvcm1hdCkuaW52YWxpZD09PW51bGwmJih0aGlzLnMudmFsdWVbaF09cigpLkRhdGVUaW1lLmZyb21Gb3JtYXQodGhpcy5zLnZhbHVlW2hdLHRoaXMucy5kYXRlRm9ybWF0KS50b0Zvcm1hdCgieXl5eS1NTS1kZCBISDptbTpzcyIpKX1pZih0aGlzLnMudHlwZSYmdGhpcy5zLnR5cGUuaW5jbHVkZXMoIm51bSIpJiZ0aGlzLnMuZHQucGFnZS5pbmZvKCkuc2VydmVyU2lkZSlmb3IoaD0wO2g8dGhpcy5zLnZhbHVlLmxlbmd0aDtoKyspdGhpcy5zLnZhbHVlW2hdPXRoaXMucy52YWx1ZVtoXS5yZXBsYWNlKC9bXjAtOS5cLV0vZywiIik7cmV0dXJue2NvbmRpdGlvbjp0aGlzLnMuY29uZGl0aW9uLGRhdGE6dGhpcy5zLmRhdGEsb3JpZ0RhdGE6dGhpcy5zLm9yaWdEYXRhLHR5cGU6dGhpcy5zLnR5cGUsdmFsdWU6dGhpcy5zLnZhbHVlLm1hcChmdW5jdGlvbihmKXtyZXR1cm4gZiE9bnVsbD9mLnRvU3RyaW5nKCk6Zn0pfX0sYy5wcm90b3R5cGUuZ2V0Tm9kZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbS5jb250YWluZXJ9LGMucHJvdG90eXBlLnBhcnNlTnVtYmVyPWZ1bmN0aW9uKGwpe3ZhciBoPXRoaXMucy5kdC5pMThuKCJkZWNpbWFsIik7cmV0dXJuIGgmJmghPT0iLiImJihsPWwucmVwbGFjZSgvXC4vZywiIikucmVwbGFjZShoLCIuIikpLCtsLnJlcGxhY2UoLyg/IV4tKVteMC05Ll0vZywiIil9LGMucHJvdG90eXBlLnBvcHVsYXRlPWZ1bmN0aW9uKCl7dGhpcy5fcG9wdWxhdGVEYXRhKCksdGhpcy5zLmRhdGFJZHghPT0tMSYmKHRoaXMuX3BvcHVsYXRlQ29uZGl0aW9uKCksdGhpcy5zLmNvbmRpdGlvbiE9PXZvaWQgMCYmdGhpcy5fcG9wdWxhdGVWYWx1ZSgpKX0sYy5wcm90b3R5cGUucmVidWlsZD1mdW5jdGlvbihsKXt2YXIgaD0hMSxfLEY7aWYodGhpcy5fcG9wdWxhdGVEYXRhKCksbC5kYXRhIT09dm9pZCAwKXt2YXIgTz10aGlzLmNsYXNzZXMuaXRhbGljLGY9dGhpcy5kb20uZGF0YTt0aGlzLmRvbS5kYXRhLmNoaWxkcmVuKCJvcHRpb24iKS5lYWNoKGZ1bmN0aW9uKCl7IWgmJih0KHRoaXMpLnRleHQoKT09PWwuZGF0YXx8bC5vcmlnRGF0YSYmdCh0aGlzKS5wcm9wKCJvcmlnRGF0YSIpPT09bC5vcmlnRGF0YSk/KHQodGhpcykucHJvcCgic2VsZWN0ZWQiLCEwKSxmLnJlbW92ZUNsYXNzKE8pLGg9ITAsXz1wYXJzZUludCh0KHRoaXMpLnZhbCgpLDEwKSk6dCh0aGlzKS5yZW1vdmVQcm9wKCJzZWxlY3RlZCIpfSl9aWYoaCl7dGhpcy5zLmRhdGE9bC5kYXRhLHRoaXMucy5vcmlnRGF0YT1sLm9yaWdEYXRhLHRoaXMucy5kYXRhSWR4PV8sdGhpcy5jLm9ydGhvZ29uYWw9dGhpcy5fZ2V0T3B0aW9ucygpLm9ydGhvZ29uYWwsdGhpcy5kb20uZGF0YVRpdGxlLnJlbW92ZSgpLHRoaXMuX3BvcHVsYXRlQ29uZGl0aW9uKCksdGhpcy5kb20uY29uZGl0aW9uVGl0bGUucmVtb3ZlKCk7dmFyIFU9dm9pZCAwLFg9dGhpcy5kb20uY29uZGl0aW9uLmNoaWxkcmVuKCJvcHRpb24iKTtmb3IoRj0wO0Y8WC5sZW5ndGg7RisrKXt2YXIgUT10KFhbRl0pO2wuY29uZGl0aW9uIT09dm9pZCAwJiZRLnZhbCgpPT09bC5jb25kaXRpb24mJnR5cGVvZiBsLmNvbmRpdGlvbj09InN0cmluZyI/KFEucHJvcCgic2VsZWN0ZWQiLCEwKSxVPVEudmFsKCkpOlEucmVtb3ZlUHJvcCgic2VsZWN0ZWQiKX1pZih0aGlzLnMuY29uZGl0aW9uPVUsdGhpcy5zLmNvbmRpdGlvbiE9PXZvaWQgMCl7Zm9yKHRoaXMuZG9tLmNvbmRpdGlvblRpdGxlLnJlbW92ZVByb3AoInNlbGVjdGVkIiksdGhpcy5kb20uY29uZGl0aW9uVGl0bGUucmVtb3ZlKCksdGhpcy5kb20uY29uZGl0aW9uLnJlbW92ZUNsYXNzKHRoaXMuY2xhc3Nlcy5pdGFsaWMpLEY9MDtGPFgubGVuZ3RoO0YrKyl7dmFyIEU9dChYW0ZdKTtFLnZhbCgpIT09dGhpcy5zLmNvbmRpdGlvbiYmRS5yZW1vdmVQcm9wKCJzZWxlY3RlZCIpfXRoaXMuX3BvcHVsYXRlVmFsdWUobCl9ZWxzZSB0aGlzLmRvbS5jb25kaXRpb25UaXRsZS5wcmVwZW5kVG8odGhpcy5kb20uY29uZGl0aW9uKS5wcm9wKCJzZWxlY3RlZCIsITApfX0sYy5wcm90b3R5cGUuc2V0TGlzdGVuZXJzPWZ1bmN0aW9uKCl7dmFyIGw9dGhpczt0aGlzLmRvbS5kYXRhLnVuYmluZCgiY2hhbmdlIikub24oImNoYW5nZS5kdHNiIixmdW5jdGlvbigpe2wuZG9tLmRhdGFUaXRsZS5yZW1vdmVQcm9wKCJzZWxlY3RlZCIpO2Zvcih2YXIgaD1sLmRvbS5kYXRhLmNoaWxkcmVuKCJvcHRpb24uIitsLmNsYXNzZXMub3B0aW9uKSxfPTA7XzxoLmxlbmd0aDtfKyspe3ZhciBGPXQoaFtfXSk7Ri52YWwoKT09PWwuZG9tLmRhdGEudmFsKCk/KGwuZG9tLmRhdGEucmVtb3ZlQ2xhc3MobC5jbGFzc2VzLml0YWxpYyksRi5wcm9wKCJzZWxlY3RlZCIsITApLGwucy5kYXRhSWR4PStGLnZhbCgpLGwucy5kYXRhPUYudGV4dCgpLGwucy5vcmlnRGF0YT1GLnByb3AoIm9yaWdEYXRhIiksbC5jLm9ydGhvZ29uYWw9bC5fZ2V0T3B0aW9ucygpLm9ydGhvZ29uYWwsbC5fY2xlYXJDb25kaXRpb24oKSxsLl9jbGVhclZhbHVlKCksbC5fcG9wdWxhdGVDb25kaXRpb24oKSxsLnMuZmlsbGVkJiYobC5zLmZpbGxlZD0hMSxsLmRvU2VhcmNoKCksbC5zZXRMaXN0ZW5lcnMoKSksbC5zLmR0LnN0YXRlLnNhdmUoKSk6Ri5yZW1vdmVQcm9wKCJzZWxlY3RlZCIpfX0pLHRoaXMuZG9tLmNvbmRpdGlvbi51bmJpbmQoImNoYW5nZSIpLm9uKCJjaGFuZ2UuZHRzYiIsZnVuY3Rpb24oKXtsLmRvbS5jb25kaXRpb25UaXRsZS5yZW1vdmVQcm9wKCJzZWxlY3RlZCIpO2Zvcih2YXIgaD1sLmRvbS5jb25kaXRpb24uY2hpbGRyZW4oIm9wdGlvbi4iK2wuY2xhc3Nlcy5vcHRpb24pLF89MDtfPGgubGVuZ3RoO18rKyl7dmFyIEY9dChoW19dKTtpZihGLnZhbCgpPT09bC5kb20uY29uZGl0aW9uLnZhbCgpKXtsLmRvbS5jb25kaXRpb24ucmVtb3ZlQ2xhc3MobC5jbGFzc2VzLml0YWxpYyksRi5wcm9wKCJzZWxlY3RlZCIsITApO2Zvcih2YXIgTz1GLnZhbCgpLGY9MCxVPU9iamVjdC5rZXlzKGwucy5jb25kaXRpb25zKTtmPFUubGVuZ3RoO2YrKyl7dmFyIFg9VVtmXTtpZihYPT09Tyl7bC5zLmNvbmRpdGlvbj1PO2JyZWFrfX1sLl9jbGVhclZhbHVlKCksbC5fcG9wdWxhdGVWYWx1ZSgpO2Zvcih2YXIgUT0wLEU9bC5kb20udmFsdWU7UTxFLmxlbmd0aDtRKyspe3ZhciAkPUVbUV07bC5zLmZpbGxlZCYmJCE9PXZvaWQgMCYmbC5kb20uaW5wdXRDb250LmhhcygkWzBdKS5sZW5ndGghPT0wJiYobC5zLmZpbGxlZD0hMSxsLmRvU2VhcmNoKCksbC5zZXRMaXN0ZW5lcnMoKSl9KGwuZG9tLnZhbHVlLmxlbmd0aD09PTB8fGwuZG9tLnZhbHVlLmxlbmd0aD09PTEmJmwuZG9tLnZhbHVlWzBdPT09dm9pZCAwKSYmbC5kb1NlYXJjaCgpfWVsc2UgRi5yZW1vdmVQcm9wKCJzZWxlY3RlZCIpfX0pfSxjLnByb3RvdHlwZS5zZXR1cEJ1dHRvbnM9ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5uZXJXaWR0aD41NTApe3RoaXMuZG9tLmNvbnRhaW5lci5yZW1vdmVDbGFzcyh0aGlzLmNsYXNzZXMudmVydGljYWwpLHRoaXMuZG9tLmJ1dHRvbnMuY3NzKCJsZWZ0IixudWxsKSx0aGlzLmRvbS5idXR0b25zLmNzcygidG9wIixudWxsKTtyZXR1cm59dGhpcy5kb20uY29udGFpbmVyLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy52ZXJ0aWNhbCksdGhpcy5kb20uYnV0dG9ucy5jc3MoImxlZnQiLHRoaXMuZG9tLmRhdGEuaW5uZXJXaWR0aCgpKSx0aGlzLmRvbS5idXR0b25zLmNzcygidG9wIix0aGlzLmRvbS5kYXRhLnBvc2l0aW9uKCkudG9wKX0sYy5wcm90b3R5cGUuX2J1aWxkQ3JpdGVyaWE9ZnVuY3Rpb24oKXt0aGlzLmRvbS5kYXRhLmFwcGVuZCh0aGlzLmRvbS5kYXRhVGl0bGUpLHRoaXMuZG9tLmNvbmRpdGlvbi5hcHBlbmQodGhpcy5kb20uY29uZGl0aW9uVGl0bGUpLHRoaXMuZG9tLmNvbnRhaW5lci5hcHBlbmQodGhpcy5kb20uZGF0YSkuYXBwZW5kKHRoaXMuZG9tLmNvbmRpdGlvbiksdGhpcy5kb20uaW5wdXRDb250LmVtcHR5KCk7Zm9yKHZhciBsPTAsaD10aGlzLmRvbS52YWx1ZTtsPGgubGVuZ3RoO2wrKyl7dmFyIF89aFtsXTtfLmFwcGVuZCh0aGlzLmRvbS52YWx1ZVRpdGxlKSx0aGlzLmRvbS5pbnB1dENvbnQuYXBwZW5kKF8pfXRoaXMuZG9tLmJ1dHRvbnMuYXBwZW5kKHRoaXMuZG9tLmRlbGV0ZSkuYXBwZW5kKHRoaXMuZG9tLnJpZ2h0KSx0aGlzLmRvbS5jb250YWluZXIuYXBwZW5kKHRoaXMuZG9tLmlucHV0Q29udCkuYXBwZW5kKHRoaXMuZG9tLmJ1dHRvbnMpLHRoaXMuc2V0TGlzdGVuZXJzKCl9LGMucHJvdG90eXBlLl9jbGVhckNvbmRpdGlvbj1mdW5jdGlvbigpe3RoaXMuZG9tLmNvbmRpdGlvbi5lbXB0eSgpLHRoaXMuZG9tLmNvbmRpdGlvblRpdGxlLnByb3AoInNlbGVjdGVkIiwhMCkuYXR0cigiZGlzYWJsZWQiLCJ0cnVlIiksdGhpcy5kb20uY29uZGl0aW9uLnByZXBlbmQodGhpcy5kb20uY29uZGl0aW9uVGl0bGUpLnByb3AoInNlbGVjdGVkSW5kZXgiLDApLHRoaXMucy5jb25kaXRpb25zPXt9LHRoaXMucy5jb25kaXRpb249dm9pZCAwfSxjLnByb3RvdHlwZS5fY2xlYXJWYWx1ZT1mdW5jdGlvbigpe3ZhciBsO2lmKHRoaXMucy5jb25kaXRpb24hPT12b2lkIDApe2lmKHRoaXMuZG9tLnZhbHVlLmxlbmd0aD4wJiZ0aGlzLmRvbS52YWx1ZVswXSE9PXZvaWQgMClmb3IodmFyIGg9MCxfPXRoaXMuZG9tLnZhbHVlO2g8Xy5sZW5ndGg7aCsrKWw9X1toXSxsIT09dm9pZCAwJiZzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bC5yZW1vdmUoKX0sNTApO2lmKHRoaXMuZG9tLnZhbHVlPVtdLmNvbmNhdCh0aGlzLnMuY29uZGl0aW9uc1t0aGlzLnMuY29uZGl0aW9uXS5pbml0KHRoaXMsYy51cGRhdGVMaXN0ZW5lcikpLHRoaXMuZG9tLnZhbHVlLmxlbmd0aD4wJiZ0aGlzLmRvbS52YWx1ZVswXSE9PXZvaWQgMCl7dGhpcy5kb20uaW5wdXRDb250LmVtcHR5KCkuYXBwZW5kKHRoaXMuZG9tLnZhbHVlWzBdKS5pbnNlcnRBZnRlcih0aGlzLmRvbS5jb25kaXRpb24pLHQodGhpcy5kb20udmFsdWVbMF0pLnRyaWdnZXIoImR0c2ItaW5zZXJ0ZWQiKTtmb3IodmFyIEY9MTtGPHRoaXMuZG9tLnZhbHVlLmxlbmd0aDtGKyspdGhpcy5kb20uaW5wdXRDb250LmFwcGVuZCh0aGlzLmRvbS52YWx1ZVtGXSksdCh0aGlzLmRvbS52YWx1ZVtGXSkudHJpZ2dlcigiZHRzYi1pbnNlcnRlZCIpfX1lbHNle2Zvcih2YXIgTz0wLGY9dGhpcy5kb20udmFsdWU7TzxmLmxlbmd0aDtPKyspbD1mW09dLGwhPT12b2lkIDAmJnNldFRpbWVvdXQoZnVuY3Rpb24oKXtsLnJlbW92ZSgpfSw1MCk7dGhpcy5kb20udmFsdWVUaXRsZS5wcm9wKCJzZWxlY3RlZCIsITApLHRoaXMuZG9tLmRlZmF1bHRWYWx1ZS5hcHBlbmQodGhpcy5kb20udmFsdWVUaXRsZSkuaW5zZXJ0QWZ0ZXIodGhpcy5kb20uY29uZGl0aW9uKX10aGlzLnMudmFsdWU9W10sdGhpcy5kb20udmFsdWU9W3QoIjxzZWxlY3QgZGlzYWJsZWQvPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy52YWx1ZSkuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmRyb3BEb3duKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuaXRhbGljKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuc2VsZWN0KS5hcHBlbmQodGhpcy5kb20udmFsdWVUaXRsZS5jbG9uZSgpKV19LGMucHJvdG90eXBlLl9nZXRPcHRpb25zPWZ1bmN0aW9uKCl7dmFyIGw9dGhpcy5zLmR0O3JldHVybiB0LmV4dGVuZCghMCx7fSxjLmRlZmF1bHRzLGwuc2V0dGluZ3MoKVswXS5hb0NvbHVtbnNbdGhpcy5zLmRhdGFJZHhdLnNlYXJjaEJ1aWxkZXIpfSxjLnByb3RvdHlwZS5fcG9wdWxhdGVDb25kaXRpb249ZnVuY3Rpb24oKXt2YXIgbD1bXSxoPU9iamVjdC5rZXlzKHRoaXMucy5jb25kaXRpb25zKS5sZW5ndGgsXz10aGlzLnMuZHQsRj1fLnNldHRpbmdzKClbMF0uYW9Db2x1bW5zLE89K3RoaXMuZG9tLmRhdGEuY2hpbGRyZW4oIm9wdGlvbjpzZWxlY3RlZCIpLnZhbCgpLGYsVTtpZihoPT09MCl7aWYodGhpcy5zLnR5cGU9Xy5jb2x1bW4oTykudHlwZSgpLEYhPT12b2lkIDApe3ZhciBYPUZbT107WC5zZWFyY2hCdWlsZGVyVHlwZSE9PXZvaWQgMCYmWC5zZWFyY2hCdWlsZGVyVHlwZSE9PW51bGw/dGhpcy5zLnR5cGU9WC5zZWFyY2hCdWlsZGVyVHlwZToodGhpcy5zLnR5cGU9PT12b2lkIDB8fHRoaXMucy50eXBlPT09bnVsbCkmJih0aGlzLnMudHlwZT1YLnNUeXBlKX0odGhpcy5zLnR5cGU9PT1udWxsfHx0aGlzLnMudHlwZT09PXZvaWQgMCkmJih0LmZuLmRhdGFUYWJsZS5leHQub0FwaSYmdC5mbi5kYXRhVGFibGUuZXh0Lm9BcGkuX2ZuQ29sdW1uVHlwZXMoXy5zZXR0aW5ncygpWzBdKSx0aGlzLnMudHlwZT1fLmNvbHVtbihPKS50eXBlKCkpLHRoaXMuZG9tLmNvbmRpdGlvbi5yZW1vdmVBdHRyKCJkaXNhYmxlZCIpLmVtcHR5KCkuYXBwZW5kKHRoaXMuZG9tLmNvbmRpdGlvblRpdGxlKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuaXRhbGljKSx0aGlzLmRvbS5jb25kaXRpb25UaXRsZS5wcm9wKCJzZWxlY3RlZCIsITApO3ZhciBRPV8uc2V0dGluZ3MoKVswXS5vTGFuZ3VhZ2Uuc0RlY2ltYWw7USE9PSIiJiZ0aGlzLnMudHlwZSYmdGhpcy5zLnR5cGUuaW5kZXhPZihRKT09PXRoaXMucy50eXBlLmxlbmd0aC1RLmxlbmd0aCYmKHRoaXMucy50eXBlLmluY2x1ZGVzKCJudW0tZm10Iik/dGhpcy5zLnR5cGU9dGhpcy5zLnR5cGUucmVwbGFjZShRLCIiKTp0aGlzLnMudHlwZS5pbmNsdWRlcygibnVtIikmJih0aGlzLnMudHlwZT10aGlzLnMudHlwZS5yZXBsYWNlKFEsIiIpKSk7dmFyIEU9dm9pZCAwO3RoaXMuYy5jb25kaXRpb25zW3RoaXMucy50eXBlXSE9PXZvaWQgMD9FPXRoaXMuYy5jb25kaXRpb25zW3RoaXMucy50eXBlXTp0aGlzLnMudHlwZSYmdGhpcy5zLnR5cGUuaW5jbHVkZXMoImRhdGV0aW1lLSIpPyhFPWF0LnVzZSgibW9tZW50Iik/dGhpcy5jLmNvbmRpdGlvbnMubW9tZW50OnRoaXMuYy5jb25kaXRpb25zLmx1eG9uLHRoaXMucy5kYXRlRm9ybWF0PXRoaXMucy50eXBlLnJlcGxhY2UoL2RhdGV0aW1lLS9nLCIiKSk6dGhpcy5zLnR5cGUmJnRoaXMucy50eXBlLmluY2x1ZGVzKCJtb21lbnQiKT8oRT10aGlzLmMuY29uZGl0aW9ucy5tb21lbnQsdGhpcy5zLmRhdGVGb3JtYXQ9dGhpcy5zLnR5cGUucmVwbGFjZSgvbW9tZW50LS9nLCIiKSk6dGhpcy5zLnR5cGUmJnRoaXMucy50eXBlLmluY2x1ZGVzKCJsdXhvbiIpPyhFPXRoaXMuYy5jb25kaXRpb25zLmx1eG9uLHRoaXMucy5kYXRlRm9ybWF0PXRoaXMucy50eXBlLnJlcGxhY2UoL2x1eG9uLS9nLCIiKSk6RT10aGlzLmMuY29uZGl0aW9ucy5zdHJpbmc7Zm9yKHZhciAkPTAsdz1PYmplY3Qua2V5cyhFKTskPHcubGVuZ3RoOyQrKylpZihmPXdbJF0sRVtmXSE9PW51bGwpe2lmKF8ucGFnZS5pbmZvKCkuc2VydmVyU2lkZSYmRVtmXS5pbml0PT09Yy5pbml0U2VsZWN0KXt2YXIgaz1GW09dO3RoaXMucy5zZXJ2ZXJEYXRhJiZ0aGlzLnMuc2VydmVyRGF0YVtrLmRhdGFdPyhFW2ZdLmluaXQ9Yy5pbml0U2VsZWN0U1NQLEVbZl0uaW5wdXRWYWx1ZT1jLmlucHV0VmFsdWVTZWxlY3QsRVtmXS5pc0lucHV0VmFsaWQ9Yy5pc0lucHV0VmFsaWRTZWxlY3QpOihFW2ZdLmluaXQ9Yy5pbml0SW5wdXQsRVtmXS5pbnB1dFZhbHVlPWMuaW5wdXRWYWx1ZUlucHV0LEVbZl0uaXNJbnB1dFZhbGlkPWMuaXNJbnB1dFZhbGlkSW5wdXQpfXRoaXMucy5jb25kaXRpb25zW2ZdPUVbZl0sVT1FW2ZdLmNvbmRpdGlvbk5hbWUsdHlwZW9mIFU9PSJmdW5jdGlvbiImJihVPVUoXyx0aGlzLmMuaTE4bikpLGwucHVzaCh0KCI8b3B0aW9uPiIse3RleHQ6VSx2YWx1ZTpmfSkuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLm9wdGlvbikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLm5vdEl0YWxpYykpfX1lbHNlIGlmKGg+MCl7dGhpcy5kb20uY29uZGl0aW9uLmVtcHR5KCkucmVtb3ZlQXR0cigiZGlzYWJsZWQiKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuaXRhbGljKTtmb3IodmFyIFM9MCxCPU9iamVjdC5rZXlzKHRoaXMucy5jb25kaXRpb25zKTtTPEIubGVuZ3RoO1MrKyl7Zj1CW1NdO3ZhciBMPXRoaXMucy5jb25kaXRpb25zW2ZdLmNvbmRpdGlvbk5hbWU7dHlwZW9mIEw9PSJmdW5jdGlvbiImJihMPUwoXyx0aGlzLmMuaTE4bikpO3ZhciBSPXQoIjxvcHRpb24+Iix7dGV4dDpMLHZhbHVlOmZ9KS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMub3B0aW9uKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMubm90SXRhbGljKTt0aGlzLnMuY29uZGl0aW9uIT09dm9pZCAwJiZ0aGlzLnMuY29uZGl0aW9uPT09TCYmKFIucHJvcCgic2VsZWN0ZWQiLCEwKSx0aGlzLmRvbS5jb25kaXRpb24ucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLml0YWxpYykpLGwucHVzaChSKX19ZWxzZXt0aGlzLmRvbS5jb25kaXRpb24uYXR0cigiZGlzYWJsZWQiLCJ0cnVlIikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLml0YWxpYyk7cmV0dXJufWZvcih2YXIgcT0wLHo9bDtxPHoubGVuZ3RoO3ErKyl7dmFyIEc9eltxXTt0aGlzLmRvbS5jb25kaXRpb24uYXBwZW5kKEcpfWlmKEZbT10uc2VhcmNoQnVpbGRlciYmRltPXS5zZWFyY2hCdWlsZGVyLmRlZmF1bHRDb25kaXRpb24pe3ZhciBudD1GW09dLnNlYXJjaEJ1aWxkZXIuZGVmYXVsdENvbmRpdGlvbjtpZih0eXBlb2YgbnQ9PSJudW1iZXIiKXRoaXMuZG9tLmNvbmRpdGlvbi5wcm9wKCJzZWxlY3RlZEluZGV4IixudCksdGhpcy5kb20uY29uZGl0aW9uLnRyaWdnZXIoImNoYW5nZSIpO2Vsc2UgaWYodHlwZW9mIG50PT0ic3RyaW5nIilmb3IodmFyIHR0PTA7dHQ8bC5sZW5ndGg7dHQrKylmb3IodmFyIGV0PTAsd3Q9T2JqZWN0LmtleXModGhpcy5zLmNvbmRpdGlvbnMpO2V0PHd0Lmxlbmd0aDtldCsrKXt2YXIgU3Q9d3RbZXRdO2lmKFU9dGhpcy5zLmNvbmRpdGlvbnNbU3RdLmNvbmRpdGlvbk5hbWUsKHR5cGVvZiBVPT0ic3RyaW5nIj9VOlUoXyx0aGlzLmMuaTE4bikpPT09bFt0dF0udGV4dCgpJiZTdD09PW50KXt0aGlzLmRvbS5jb25kaXRpb24ucHJvcCgic2VsZWN0ZWRJbmRleCIsdGhpcy5kb20uY29uZGl0aW9uLmNoaWxkcmVuKCkudG9BcnJheSgpLmluZGV4T2YobFt0dF1bMF0pKS5yZW1vdmVDbGFzcyh0aGlzLmNsYXNzZXMuaXRhbGljKSx0aGlzLmRvbS5jb25kaXRpb24udHJpZ2dlcigiY2hhbmdlIiksdHQ9bC5sZW5ndGg7YnJlYWt9fX1lbHNlIHRoaXMuZG9tLmNvbmRpdGlvbi5wcm9wKCJzZWxlY3RlZEluZGV4IiwwKX0sYy5wcm90b3R5cGUuX3BvcHVsYXRlRGF0YT1mdW5jdGlvbigpe3ZhciBsPXRoaXMucy5kdC5zZXR0aW5ncygpWzBdLmFvQ29sdW1ucyxoPXRoaXMucy5kdC5jb2x1bW5zKHRoaXMuYy5jb2x1bW5zKS5pbmRleGVzKCkudG9BcnJheSgpO3RoaXMuZG9tLmRhdGEuZW1wdHkoKS5hcHBlbmQodGhpcy5kb20uZGF0YVRpdGxlKTtmb3IodmFyIF89MDtfPGwubGVuZ3RoO18rKylpZih0aGlzLmMuY29sdW1ucz09PSEwfHxoLmluY2x1ZGVzKF8pKXt2YXIgRj1sW19dLE89e2luZGV4Ol8sb3JpZ0RhdGE6Ri5kYXRhLHRleHQ6KEYuc2VhcmNoQnVpbGRlclRpdGxlfHxGLnNUaXRsZSkucmVwbGFjZSgvKDwoW14+XSspPikvaWcsIiIpfTt0aGlzLmRvbS5kYXRhLmFwcGVuZCh0KCI8b3B0aW9uPiIse3RleHQ6Ty50ZXh0LHZhbHVlOk8uaW5kZXh9KS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMub3B0aW9uKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMubm90SXRhbGljKS5wcm9wKCJvcmlnRGF0YSIsRi5kYXRhKS5wcm9wKCJzZWxlY3RlZCIsdGhpcy5zLmRhdGFJZHg9PT1PLmluZGV4KSksdGhpcy5zLmRhdGFJZHg9PT1PLmluZGV4JiZ0aGlzLmRvbS5kYXRhVGl0bGUucmVtb3ZlUHJvcCgic2VsZWN0ZWQiKX19LGMucHJvdG90eXBlLl9wb3B1bGF0ZVZhbHVlPWZ1bmN0aW9uKGwpe3ZhciBoPXRoaXMsXz10aGlzLnMuZmlsbGVkLEY7dGhpcy5zLmZpbGxlZD0hMSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aC5kb20uZGVmYXVsdFZhbHVlLnJlbW92ZSgpfSw1MCk7Zm9yKHZhciBPPWZ1bmN0aW9uKEUpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtFIT09dm9pZCAwJiZFLnJlbW92ZSgpfSw1MCl9LGY9MCxVPXRoaXMuZG9tLnZhbHVlO2Y8VS5sZW5ndGg7ZisrKXt2YXIgWD1VW2ZdO08oWCl9dmFyIFE9dGhpcy5kb20uaW5wdXRDb250LmNoaWxkcmVuKCk7aWYoUS5sZW5ndGg+MSlmb3IoRj0wO0Y8US5sZW5ndGg7RisrKXQoUVtGXSkucmVtb3ZlKCk7Zm9yKGwhPT12b2lkIDAmJnRoaXMucy5kdC5jb2x1bW5zKCkuZXZlcnkoZnVuY3Rpb24oRSl7aC5zLmR0LnNldHRpbmdzKClbMF0uYW9Db2x1bW5zW0VdLnNUaXRsZT09PWwuZGF0YSYmKGgucy5kYXRhSWR4PUUpfSksdGhpcy5kb20udmFsdWU9W10uY29uY2F0KHRoaXMucy5jb25kaXRpb25zW3RoaXMucy5jb25kaXRpb25dLmluaXQodGhpcyxjLnVwZGF0ZUxpc3RlbmVyLGwhPT12b2lkIDA/bC52YWx1ZTp2b2lkIDApKSxsIT09dm9pZCAwJiZsLnZhbHVlIT09dm9pZCAwJiYodGhpcy5zLnZhbHVlPWwudmFsdWUpLHRoaXMuZG9tLmlucHV0Q29udC5lbXB0eSgpLHRoaXMuZG9tLnZhbHVlWzBdIT09dm9pZCAwJiZ0KHRoaXMuZG9tLnZhbHVlWzBdKS5hcHBlbmRUbyh0aGlzLmRvbS5pbnB1dENvbnQpLnRyaWdnZXIoImR0c2ItaW5zZXJ0ZWQiKSxGPTE7Rjx0aGlzLmRvbS52YWx1ZS5sZW5ndGg7RisrKXQodGhpcy5kb20udmFsdWVbRl0pLmluc2VydEFmdGVyKHRoaXMuZG9tLnZhbHVlW0YtMV0pLnRyaWdnZXIoImR0c2ItaW5zZXJ0ZWQiKTt0aGlzLnMuZmlsbGVkPXRoaXMucy5jb25kaXRpb25zW3RoaXMucy5jb25kaXRpb25dLmlzSW5wdXRWYWxpZCh0aGlzLmRvbS52YWx1ZSx0aGlzKSx0aGlzLnNldExpc3RlbmVycygpLCF0aGlzLnMucHJldmVudFJlZHJhdyYmXyE9PXRoaXMucy5maWxsZWQmJih0aGlzLnMuZHQucGFnZS5pbmZvKCkuc2VydmVyU2lkZXx8dGhpcy5kb1NlYXJjaCgpLHRoaXMuc2V0TGlzdGVuZXJzKCkpfSxjLnByb3RvdHlwZS5fdGhyb3R0bGU9ZnVuY3Rpb24obCxoKXtoPT09dm9pZCAwJiYoaD0yMDApO3ZhciBfPW51bGwsRj1udWxsLE89dGhpcztyZXR1cm4gaD09PW51bGwmJihoPTIwMCksZnVuY3Rpb24oKXtmb3IodmFyIGY9W10sVT0wO1U8YXJndW1lbnRzLmxlbmd0aDtVKyspZltVXT1hcmd1bWVudHNbVV07dmFyIFg9K25ldyBEYXRlO18hPT1udWxsJiZYPF8raD9jbGVhclRpbWVvdXQoRik6Xz1YLEY9c2V0VGltZW91dChmdW5jdGlvbigpe189bnVsbCxsLmFwcGx5KE8sZil9LGgpfX0sYy52ZXJzaW9uPSIxLjEuMCIsYy5jbGFzc2VzPXtidXR0b246ImR0c2ItYnV0dG9uIixidXR0b25Db250YWluZXI6ImR0c2ItYnV0dG9uQ29udGFpbmVyIixjb25kaXRpb246ImR0c2ItY29uZGl0aW9uIixjb250YWluZXI6ImR0c2ItY3JpdGVyaWEiLGRhdGE6ImR0c2ItZGF0YSIsZGVsZXRlOiJkdHNiLWRlbGV0ZSIsZHJvcERvd246ImR0c2ItZHJvcERvd24iLGdyZXlzY2FsZToiZHRzYi1ncmV5c2NhbGUiLGlucHV0OiJkdHNiLWlucHV0IixpbnB1dENvbnQ6ImR0c2ItaW5wdXRDb250IixpdGFsaWM6ImR0c2ItaXRhbGljIixqb2luZXI6ImR0c2Itam9pbmVyIixsZWZ0OiJkdHNiLWxlZnQiLG5vdEl0YWxpYzoiZHRzYi1ub3RJdGFsaWMiLG9wdGlvbjoiZHRzYi1vcHRpb24iLHJpZ2h0OiJkdHNiLXJpZ2h0IixzZWxlY3Q6ImR0c2Itc2VsZWN0Iix2YWx1ZToiZHRzYi12YWx1ZSIsdmVydGljYWw6ImR0c2ItdmVydGljYWwifSxjLmluaXRTZWxlY3Q9ZnVuY3Rpb24obCxoLF8sRil7Xz09PXZvaWQgMCYmKF89bnVsbCksRj09PXZvaWQgMCYmKEY9ITEpO3ZhciBPPWwuZG9tLmRhdGEuY2hpbGRyZW4oIm9wdGlvbjpzZWxlY3RlZCIpLnZhbCgpLGY9bC5zLmR0LnJvd3MoKS5pbmRleGVzKCkudG9BcnJheSgpLFU9bC5zLmR0LnNldHRpbmdzKClbMF0uZmFzdERhdGE7bC5kb20udmFsdWVUaXRsZS5wcm9wKCJzZWxlY3RlZCIsITApO3ZhciBYPXQoIjxzZWxlY3QvPiIpLmFkZENsYXNzKGMuY2xhc3Nlcy52YWx1ZSkuYWRkQ2xhc3MoYy5jbGFzc2VzLmRyb3BEb3duKS5hZGRDbGFzcyhjLmNsYXNzZXMuaXRhbGljKS5hZGRDbGFzcyhjLmNsYXNzZXMuc2VsZWN0KS5hcHBlbmQobC5kb20udmFsdWVUaXRsZSkub24oImNoYW5nZS5kdHNiIixmdW5jdGlvbigpe3QodGhpcykucmVtb3ZlQ2xhc3MoYy5jbGFzc2VzLml0YWxpYyksaChsLHRoaXMpfSk7bC5jLmdyZXlzY2FsZSYmWC5hZGRDbGFzcyhjLmNsYXNzZXMuZ3JleXNjYWxlKTtmb3IodmFyIFE9W10sRT1bXSwkPTAsdz1mOyQ8dy5sZW5ndGg7JCsrKXt2YXIgaz13WyRdLFM9VShrLE8sdHlwZW9mIGwuYy5vcnRob2dvbmFsPT0ic3RyaW5nIj9sLmMub3J0aG9nb25hbDpsLmMub3J0aG9nb25hbC5zZWFyY2gpLEI9e2ZpbHRlcjp0eXBlb2YgUz09InN0cmluZyI/Uy5yZXBsYWNlKC9bXHJcblx1MjAyOF0vZywiICIpOlMsaW5kZXg6ayx0ZXh0OlUoayxPLHR5cGVvZiBsLmMub3J0aG9nb25hbD09InN0cmluZyI/bC5jLm9ydGhvZ29uYWw6bC5jLm9ydGhvZ29uYWwuZGlzcGxheSl9O2wucy50eXBlPT09ImFycmF5IiYmKEIuZmlsdGVyPUFycmF5LmlzQXJyYXkoQi5maWx0ZXIpP0IuZmlsdGVyOltCLmZpbHRlcl0sQi50ZXh0PUFycmF5LmlzQXJyYXkoQi50ZXh0KT9CLnRleHQ6W0IudGV4dF0pO3ZhciBMPWZ1bmN0aW9uKG50LHR0KXtsLnMudHlwZS5pbmNsdWRlcygiaHRtbCIpJiZudCE9PW51bGwmJnR5cGVvZiBudD09InN0cmluZyImJm50LnJlcGxhY2UoLyg8KFtePl0rKT4pL2lnLCIiKTt2YXIgZXQ9dCgiPG9wdGlvbj4iLHt0eXBlOkFycmF5LmlzQXJyYXkobnQpPyJBcnJheSI6IlN0cmluZyIsdmFsdWU6bnR9KS5kYXRhKCJzYnYiLG50KS5hZGRDbGFzcyhsLmNsYXNzZXMub3B0aW9uKS5hZGRDbGFzcyhsLmNsYXNzZXMubm90SXRhbGljKS5odG1sKHR5cGVvZiB0dD09InN0cmluZyI/dHQucmVwbGFjZSgvKDwoW14+XSspPikvaWcsIiIpOnR0KSx3dD1ldC52YWwoKTtRLmluZGV4T2Yod3QpPT09LTEmJihRLnB1c2god3QpLEUucHVzaChldCksXyE9PW51bGwmJkFycmF5LmlzQXJyYXkoX1swXSkmJihfWzBdPV9bMF0uc29ydCgpLmpvaW4oIiwiKSksXyE9PW51bGwmJmV0LnZhbCgpPT09X1swXSYmKGV0LnByb3AoInNlbGVjdGVkIiwhMCksWC5yZW1vdmVDbGFzcyhjLmNsYXNzZXMuaXRhbGljKSxsLmRvbS52YWx1ZVRpdGxlLnJlbW92ZVByb3AoInNlbGVjdGVkIikpKX07aWYoRilmb3IodmFyIFI9MDtSPEIuZmlsdGVyLmxlbmd0aDtSKyspTChCLmZpbHRlcltSXSxCLnRleHRbUl0pO2Vsc2UgTChCLmZpbHRlcixBcnJheS5pc0FycmF5KEIudGV4dCk/Qi50ZXh0LmpvaW4oIiwgIik6Qi50ZXh0KX1FLnNvcnQoZnVuY3Rpb24obnQsdHQpe2lmKGwucy50eXBlPT09ImFycmF5Inx8bC5zLnR5cGU9PT0ic3RyaW5nInx8bC5zLnR5cGU9PT0iaHRtbCIpcmV0dXJuIG50LnZhbCgpPHR0LnZhbCgpPy0xOm50LnZhbCgpPnR0LnZhbCgpPzE6MDtpZihsLnMudHlwZT09PSJudW0ifHxsLnMudHlwZT09PSJodG1sLW51bSIpcmV0dXJuK250LnZhbCgpLnJlcGxhY2UoLyg8KFtePl0rKT4pL2lnLCIiKTwrdHQudmFsKCkucmVwbGFjZSgvKDwoW14+XSspPikvaWcsIiIpPy0xOitudC52YWwoKS5yZXBsYWNlKC8oPChbXj5dKyk+KS9pZywiIik+K3R0LnZhbCgpLnJlcGxhY2UoLyg8KFtePl0rKT4pL2lnLCIiKT8xOjA7aWYobC5zLnR5cGU9PT0ibnVtLWZtdCJ8fGwucy50eXBlPT09Imh0bWwtbnVtLWZtdCIpcmV0dXJuK250LnZhbCgpLnJlcGxhY2UoL1teMC05Ll0vZywiIik8K3R0LnZhbCgpLnJlcGxhY2UoL1teMC05Ll0vZywiIik/LTE6K250LnZhbCgpLnJlcGxhY2UoL1teMC05Ll0vZywiIik+K3R0LnZhbCgpLnJlcGxhY2UoL1teMC05Ll0vZywiIik/MTowfSk7Zm9yKHZhciBxPTAsej1FO3E8ei5sZW5ndGg7cSsrKXt2YXIgRz16W3FdO1guYXBwZW5kKEcpfXJldHVybiBYfSxjLmluaXRTZWxlY3RTU1A9ZnVuY3Rpb24obCxoLF8pe189PT12b2lkIDAmJihfPW51bGwpLGwuZG9tLnZhbHVlVGl0bGUucHJvcCgic2VsZWN0ZWQiLCEwKTt2YXIgRj10KCI8c2VsZWN0Lz4iKS5hZGRDbGFzcyhjLmNsYXNzZXMudmFsdWUpLmFkZENsYXNzKGMuY2xhc3Nlcy5kcm9wRG93bikuYWRkQ2xhc3MoYy5jbGFzc2VzLml0YWxpYykuYWRkQ2xhc3MoYy5jbGFzc2VzLnNlbGVjdCkuYXBwZW5kKGwuZG9tLnZhbHVlVGl0bGUpLm9uKCJjaGFuZ2UuZHRzYiIsZnVuY3Rpb24oKXt0KHRoaXMpLnJlbW92ZUNsYXNzKGMuY2xhc3Nlcy5pdGFsaWMpLGgobCx0aGlzKX0pO2wuYy5ncmV5c2NhbGUmJkYuYWRkQ2xhc3MoYy5jbGFzc2VzLmdyZXlzY2FsZSk7Zm9yKHZhciBPPVtdLGY9MCxVPWwucy5zZXJ2ZXJEYXRhW2wucy5vcmlnRGF0YV07ZjxVLmxlbmd0aDtmKyspe3ZhciBYPVVbZl0sUT1YLnZhbHVlLEU9WC5sYWJlbCwkPWZ1bmN0aW9uKEIsTCl7bC5zLnR5cGUuaW5jbHVkZXMoImh0bWwiKSYmQiE9PW51bGwmJnR5cGVvZiBCPT0ic3RyaW5nIiYmQi5yZXBsYWNlKC8oPChbXj5dKyk+KS9pZywiIik7dmFyIFI9dCgiPG9wdGlvbj4iLHt0eXBlOkFycmF5LmlzQXJyYXkoQik/IkFycmF5IjoiU3RyaW5nIix2YWx1ZTpCfSkuZGF0YSgic2J2IixCKS5hZGRDbGFzcyhsLmNsYXNzZXMub3B0aW9uKS5hZGRDbGFzcyhsLmNsYXNzZXMubm90SXRhbGljKS5odG1sKHR5cGVvZiBMPT0ic3RyaW5nIj9MLnJlcGxhY2UoLyg8KFtePl0rKT4pL2lnLCIiKTpMKTtPLnB1c2goUiksXyE9PW51bGwmJlIudmFsKCk9PT1fWzBdJiYoUi5wcm9wKCJzZWxlY3RlZCIsITApLEYucmVtb3ZlQ2xhc3MoYy5jbGFzc2VzLml0YWxpYyksbC5kb20udmFsdWVUaXRsZS5yZW1vdmVQcm9wKCJzZWxlY3RlZCIpKX07JChRLEUpfWZvcih2YXIgdz0wLGs9Tzt3PGsubGVuZ3RoO3crKyl7dmFyIFM9a1t3XTtGLmFwcGVuZChTKX1yZXR1cm4gRn0sYy5pbml0U2VsZWN0QXJyYXk9ZnVuY3Rpb24obCxoLF8pe3JldHVybiBfPT09dm9pZCAwJiYoXz1udWxsKSxjLmluaXRTZWxlY3QobCxoLF8sITApfSxjLmluaXRJbnB1dD1mdW5jdGlvbihsLGgsXyl7Xz09PXZvaWQgMCYmKF89bnVsbCk7dmFyIEY9bC5zLmR0LnNldHRpbmdzKClbMF0uc2VhcmNoRGVsYXksTz10KCI8aW5wdXQvPiIpLmFkZENsYXNzKGMuY2xhc3Nlcy52YWx1ZSkuYWRkQ2xhc3MoYy5jbGFzc2VzLmlucHV0KS5vbigiaW5wdXQuZHRzYiBrZXlwcmVzcy5kdHNiIixsLl90aHJvdHRsZShmdW5jdGlvbihmKXt2YXIgVT1mLmtleUNvZGV8fGYud2hpY2g7cmV0dXJuIGgobCx0aGlzLFUpfSxGPT09bnVsbD8xMDA6RikpO3JldHVybiBsLmMuZ3JleXNjYWxlJiZPLmFkZENsYXNzKGMuY2xhc3Nlcy5ncmV5c2NhbGUpLF8hPT1udWxsJiZPLnZhbChfWzBdKSxsLnMuZHQub25lKCJkcmF3LmR0c2IiLGZ1bmN0aW9uKCl7bC5zLnRvcEdyb3VwLnRyaWdnZXIoImR0c2ItcmVkcmF3TG9naWMiKX0pLE99LGMuaW5pdDJJbnB1dD1mdW5jdGlvbihsLGgsXyl7Xz09PXZvaWQgMCYmKF89bnVsbCk7dmFyIEY9bC5zLmR0LnNldHRpbmdzKClbMF0uc2VhcmNoRGVsYXksTz1bdCgiPGlucHV0Lz4iKS5hZGRDbGFzcyhjLmNsYXNzZXMudmFsdWUpLmFkZENsYXNzKGMuY2xhc3Nlcy5pbnB1dCkub24oImlucHV0LmR0c2Iga2V5cHJlc3MuZHRzYiIsbC5fdGhyb3R0bGUoZnVuY3Rpb24oZil7dmFyIFU9Zi5rZXlDb2RlfHxmLndoaWNoO3JldHVybiBoKGwsdGhpcyxVKX0sRj09PW51bGw/MTAwOkYpKSx0KCI8c3Bhbj4iKS5hZGRDbGFzcyhsLmNsYXNzZXMuam9pbmVyKS5odG1sKGwucy5kdC5pMThuKCJzZWFyY2hCdWlsZGVyLnZhbHVlSm9pbmVyIixsLmMuaTE4bi52YWx1ZUpvaW5lcikpLHQoIjxpbnB1dC8+IikuYWRkQ2xhc3MoYy5jbGFzc2VzLnZhbHVlKS5hZGRDbGFzcyhjLmNsYXNzZXMuaW5wdXQpLm9uKCJpbnB1dC5kdHNiIGtleXByZXNzLmR0c2IiLGwuX3Rocm90dGxlKGZ1bmN0aW9uKGYpe3ZhciBVPWYua2V5Q29kZXx8Zi53aGljaDtyZXR1cm4gaChsLHRoaXMsVSl9LEY9PT1udWxsPzEwMDpGKSldO3JldHVybiBsLmMuZ3JleXNjYWxlJiYoT1swXS5hZGRDbGFzcyhjLmNsYXNzZXMuZ3JleXNjYWxlKSxPWzJdLmFkZENsYXNzKGMuY2xhc3Nlcy5ncmV5c2NhbGUpKSxfIT09bnVsbCYmKE9bMF0udmFsKF9bMF0pLE9bMl0udmFsKF9bMV0pKSxsLnMuZHQub25lKCJkcmF3LmR0c2IiLGZ1bmN0aW9uKCl7bC5zLnRvcEdyb3VwLnRyaWdnZXIoImR0c2ItcmVkcmF3TG9naWMiKX0pLE99LGMuaW5pdERhdGU9ZnVuY3Rpb24obCxoLF8pe189PT12b2lkIDAmJihfPW51bGwpO3ZhciBGPWwucy5kdC5zZXR0aW5ncygpWzBdLnNlYXJjaERlbGF5LE89bC5zLmR0LmkxOG4oImRhdGV0aW1lIix7fSksZj10KCI8aW5wdXQvPiIpLmFkZENsYXNzKGMuY2xhc3Nlcy52YWx1ZSkuYWRkQ2xhc3MoYy5jbGFzc2VzLmlucHV0KS5kdERhdGVUaW1lKHthdHRhY2hUbzoiaW5wdXQiLGZvcm1hdDpsLnMuZGF0ZUZvcm1hdD9sLnMuZGF0ZUZvcm1hdDp2b2lkIDAsaTE4bjpPfSkub24oImNoYW5nZS5kdHNiIixsLl90aHJvdHRsZShmdW5jdGlvbigpe3JldHVybiBoKGwsdGhpcyl9LEY9PT1udWxsPzEwMDpGKSkub24oImlucHV0LmR0c2Iga2V5cHJlc3MuZHRzYiIsZnVuY3Rpb24oVSl7bC5fdGhyb3R0bGUoZnVuY3Rpb24oKXt2YXIgWD1VLmtleUNvZGV8fFUud2hpY2g7cmV0dXJuIGgobCx0aGlzLFgpfSxGPT09bnVsbD8xMDA6Ril9KTtyZXR1cm4gbC5jLmdyZXlzY2FsZSYmZi5hZGRDbGFzcyhjLmNsYXNzZXMuZ3JleXNjYWxlKSxfIT09bnVsbCYmZi52YWwoX1swXSksbC5zLmR0Lm9uZSgiZHJhdy5kdHNiIixmdW5jdGlvbigpe2wucy50b3BHcm91cC50cmlnZ2VyKCJkdHNiLXJlZHJhd0xvZ2ljIil9KSxmfSxjLmluaXROb1ZhbHVlPWZ1bmN0aW9uKGwpe3JldHVybiBsLnMuZHQub25lKCJkcmF3LmR0c2IiLGZ1bmN0aW9uKCl7bC5zLnRvcEdyb3VwLnRyaWdnZXIoImR0c2ItcmVkcmF3TG9naWMiKX0pLFtdfSxjLmluaXQyRGF0ZT1mdW5jdGlvbihsLGgsXyl7dmFyIEY9dGhpcztfPT09dm9pZCAwJiYoXz1udWxsKTt2YXIgTz1sLnMuZHQuc2V0dGluZ3MoKVswXS5zZWFyY2hEZWxheSxmPWwucy5kdC5pMThuKCJkYXRldGltZSIse30pLFU9W3QoIjxpbnB1dC8+IikuYWRkQ2xhc3MoYy5jbGFzc2VzLnZhbHVlKS5hZGRDbGFzcyhjLmNsYXNzZXMuaW5wdXQpLmR0RGF0ZVRpbWUoe2F0dGFjaFRvOiJpbnB1dCIsZm9ybWF0Omwucy5kYXRlRm9ybWF0P2wucy5kYXRlRm9ybWF0OnZvaWQgMCxpMThuOmZ9KS5vbigiY2hhbmdlLmR0c2IiLE8hPT1udWxsP2F0LnV0aWwudGhyb3R0bGUoZnVuY3Rpb24oKXtyZXR1cm4gaChsLHRoaXMpfSxPKTpmdW5jdGlvbigpe2gobCxGKX0pLm9uKCJpbnB1dC5kdHNiIGtleXByZXNzLmR0c2IiLGZ1bmN0aW9uKFgpe2F0LnV0aWwudGhyb3R0bGUoZnVuY3Rpb24oKXt2YXIgUT1YLmtleUNvZGV8fFgud2hpY2g7cmV0dXJuIGgobCx0aGlzLFEpfSxPPT09bnVsbD8wOk8pfSksdCgiPHNwYW4+IikuYWRkQ2xhc3MobC5jbGFzc2VzLmpvaW5lcikuaHRtbChsLnMuZHQuaTE4bigic2VhcmNoQnVpbGRlci52YWx1ZUpvaW5lciIsbC5jLmkxOG4udmFsdWVKb2luZXIpKSx0KCI8aW5wdXQvPiIpLmFkZENsYXNzKGMuY2xhc3Nlcy52YWx1ZSkuYWRkQ2xhc3MoYy5jbGFzc2VzLmlucHV0KS5kdERhdGVUaW1lKHthdHRhY2hUbzoiaW5wdXQiLGZvcm1hdDpsLnMuZGF0ZUZvcm1hdD9sLnMuZGF0ZUZvcm1hdDp2b2lkIDAsaTE4bjpmfSkub24oImNoYW5nZS5kdHNiIixPIT09bnVsbD9hdC51dGlsLnRocm90dGxlKGZ1bmN0aW9uKCl7cmV0dXJuIGgobCx0aGlzKX0sTyk6ZnVuY3Rpb24oKXtoKGwsRil9KS5vbigiaW5wdXQuZHRzYiBrZXlwcmVzcy5kdHNiIiwhbC5jLmVudGVyU2VhcmNoJiYhKGwucy5kdC5zZXR0aW5ncygpWzBdLm9Jbml0LnNlYXJjaCE9PXZvaWQgMCYmbC5zLmR0LnNldHRpbmdzKClbMF0ub0luaXQuc2VhcmNoLnJldHVybikmJk8hPT1udWxsP2F0LnV0aWwudGhyb3R0bGUoZnVuY3Rpb24oKXtyZXR1cm4gaChsLHRoaXMpfSxPKTpmdW5jdGlvbihYKXt2YXIgUT1YLmtleUNvZGV8fFgud2hpY2g7aChsLEYsUSl9KV07cmV0dXJuIGwuYy5ncmV5c2NhbGUmJihVWzBdLmFkZENsYXNzKGMuY2xhc3Nlcy5ncmV5c2NhbGUpLFVbMl0uYWRkQ2xhc3MoYy5jbGFzc2VzLmdyZXlzY2FsZSkpLF8hPT1udWxsJiZfLmxlbmd0aD4wJiYoVVswXS52YWwoX1swXSksVVsyXS52YWwoX1sxXSkpLGwucy5kdC5vbmUoImRyYXcuZHRzYiIsZnVuY3Rpb24oKXtsLnMudG9wR3JvdXAudHJpZ2dlcigiZHRzYi1yZWRyYXdMb2dpYyIpfSksVX0sYy5pc0lucHV0VmFsaWRTZWxlY3Q9ZnVuY3Rpb24obCl7Zm9yKHZhciBoPSEwLF89MCxGPWw7XzxGLmxlbmd0aDtfKyspe3ZhciBPPUZbX107Ty5jaGlsZHJlbigib3B0aW9uOnNlbGVjdGVkIikubGVuZ3RoPT09Ty5jaGlsZHJlbigib3B0aW9uIikubGVuZ3RoLU8uY2hpbGRyZW4oIm9wdGlvbi4iK2MuY2xhc3Nlcy5ub3RJdGFsaWMpLmxlbmd0aCYmTy5jaGlsZHJlbigib3B0aW9uOnNlbGVjdGVkIikubGVuZ3RoPT09MSYmTy5jaGlsZHJlbigib3B0aW9uOnNlbGVjdGVkIilbMF09PT1PLmNoaWxkcmVuKCJvcHRpb24iKVswXSYmKGg9ITEpfXJldHVybiBofSxjLmlzSW5wdXRWYWxpZElucHV0PWZ1bmN0aW9uKGwpe2Zvcih2YXIgaD0hMCxfPTAsRj1sO188Ri5sZW5ndGg7XysrKXt2YXIgTz1GW19dO08uaXMoImlucHV0IikmJk8udmFsKCkubGVuZ3RoPT09MCYmKGg9ITEpfXJldHVybiBofSxjLmlucHV0VmFsdWVTZWxlY3Q9ZnVuY3Rpb24obCl7Zm9yKHZhciBoPVtdLF89MCxGPWw7XzxGLmxlbmd0aDtfKyspe3ZhciBPPUZbX107Ty5pcygic2VsZWN0IikmJmgucHVzaChjLl9lc2NhcGVIVE1MKE8uY2hpbGRyZW4oIm9wdGlvbjpzZWxlY3RlZCIpLmRhdGEoInNidiIpKSl9cmV0dXJuIGh9LGMuaW5wdXRWYWx1ZUlucHV0PWZ1bmN0aW9uKGwpe2Zvcih2YXIgaD1bXSxfPTAsRj1sO188Ri5sZW5ndGg7XysrKXt2YXIgTz1GW19dO08uaXMoImlucHV0IikmJmgucHVzaChjLl9lc2NhcGVIVE1MKE8udmFsKCkpKX1yZXR1cm4gaH0sYy51cGRhdGVMaXN0ZW5lcj1mdW5jdGlvbihsLGgsXyl7dmFyIEY9bC5zLmNvbmRpdGlvbnNbbC5zLmNvbmRpdGlvbl0sTztpZihsLnMuZmlsbGVkPUYuaXNJbnB1dFZhbGlkKGwuZG9tLnZhbHVlLGwpLGwucy52YWx1ZT1GLmlucHV0VmFsdWUobC5kb20udmFsdWUsbCksIWwucy5maWxsZWQpeyghbC5jLmVudGVyU2VhcmNoJiYhKGwucy5kdC5zZXR0aW5ncygpWzBdLm9Jbml0LnNlYXJjaCE9PXZvaWQgMCYmbC5zLmR0LnNldHRpbmdzKClbMF0ub0luaXQuc2VhcmNoLnJldHVybil8fF89PT0xMykmJmwuZG9TZWFyY2goKTtyZXR1cm59Zm9yKEFycmF5LmlzQXJyYXkobC5zLnZhbHVlKXx8KGwucy52YWx1ZT1bbC5zLnZhbHVlXSksTz0wO088bC5zLnZhbHVlLmxlbmd0aDtPKyspQXJyYXkuaXNBcnJheShsLnMudmFsdWVbT10pJiZsLnMudmFsdWVbT10uc29ydCgpO3ZhciBmPW51bGwsVT1udWxsO2ZvcihPPTA7TzxsLmRvbS52YWx1ZS5sZW5ndGg7TysrKWg9PT1sLmRvbS52YWx1ZVtPXVswXSYmKGY9TyxoLnNlbGVjdGlvblN0YXJ0IT09dm9pZCAwJiYoVT1oLnNlbGVjdGlvblN0YXJ0KSk7KCFsLmMuZW50ZXJTZWFyY2gmJiEobC5zLmR0LnNldHRpbmdzKClbMF0ub0luaXQuc2VhcmNoIT09dm9pZCAwJiZsLnMuZHQuc2V0dGluZ3MoKVswXS5vSW5pdC5zZWFyY2gucmV0dXJuKXx8Xz09PTEzKSYmbC5kb1NlYXJjaCgpLGYhPT1udWxsJiYobC5kb20udmFsdWVbZl0ucmVtb3ZlQ2xhc3MobC5jbGFzc2VzLml0YWxpYyksbC5kb20udmFsdWVbZl0uZm9jdXMoKSxVIT09bnVsbCYmbC5kb20udmFsdWVbZl1bMF0uc2V0U2VsZWN0aW9uUmFuZ2UoVSxVKSl9LGMuZGF0ZUNvbmRpdGlvbnM9eyI9Ijp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihsLGgpe3JldHVybiBsLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5kYXRlLmVxdWFscyIsaC5jb25kaXRpb25zLmRhdGUuZXF1YWxzKX0saW5pdDpjLmluaXREYXRlLGlucHV0VmFsdWU6Yy5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmMuaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGw9bC5yZXBsYWNlKC8oXC98LXwsKS9nLCItIiksbD09PWhbMF19fSwiIT0iOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmRhdGUubm90IixoLmNvbmRpdGlvbnMuZGF0ZS5ub3QpfSxpbml0OmMuaW5pdERhdGUsaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6Yy5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbD1sLnJlcGxhY2UoLyhcL3wtfCwpL2csIi0iKSxsIT09aFswXX19LCI8Ijp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihsLGgpe3JldHVybiBsLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5kYXRlLmJlZm9yZSIsaC5jb25kaXRpb25zLmRhdGUuYmVmb3JlKX0saW5pdDpjLmluaXREYXRlLGlucHV0VmFsdWU6Yy5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmMuaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGw9bC5yZXBsYWNlKC8oXC98LXwsKS9nLCItIiksbDxoWzBdfX0sIj4iOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmRhdGUuYWZ0ZXIiLGguY29uZGl0aW9ucy5kYXRlLmFmdGVyKX0saW5pdDpjLmluaXREYXRlLGlucHV0VmFsdWU6Yy5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmMuaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGw9bC5yZXBsYWNlKC8oXC98LXwsKS9nLCItIiksbD5oWzBdfX0sYmV0d2Vlbjp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihsLGgpe3JldHVybiBsLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5kYXRlLmJldHdlZW4iLGguY29uZGl0aW9ucy5kYXRlLmJldHdlZW4pfSxpbml0OmMuaW5pdDJEYXRlLGlucHV0VmFsdWU6Yy5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmMuaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGw9bC5yZXBsYWNlKC8oXC98LXwsKS9nLCItIiksaFswXTxoWzFdP2hbMF08PWwmJmw8PWhbMV06aFsxXTw9bCYmbDw9aFswXX19LCIhYmV0d2VlbiI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMuZGF0ZS5ub3RCZXR3ZWVuIixoLmNvbmRpdGlvbnMuZGF0ZS5ub3RCZXR3ZWVuKX0saW5pdDpjLmluaXQyRGF0ZSxpbnB1dFZhbHVlOmMuaW5wdXRWYWx1ZUlucHV0LGlzSW5wdXRWYWxpZDpjLmlzSW5wdXRWYWxpZElucHV0LHNlYXJjaDpmdW5jdGlvbihsLGgpe3JldHVybiBsPWwucmVwbGFjZSgvKFwvfC18LCkvZywiLSIpLGhbMF08aFsxXT8hKGhbMF08PWwmJmw8PWhbMV0pOiEoaFsxXTw9bCYmbDw9aFswXSl9fSxudWxsOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmRhdGUuZW1wdHkiLGguY29uZGl0aW9ucy5kYXRlLmVtcHR5KX0saW5pdDpjLmluaXROb1ZhbHVlLGlucHV0VmFsdWU6ZnVuY3Rpb24oKXt9LGlzSW5wdXRWYWxpZDpmdW5jdGlvbigpe3JldHVybiEwfSxzZWFyY2g6ZnVuY3Rpb24obCl7cmV0dXJuIGw9PW51bGx8fGwubGVuZ3RoPT09MH19LCIhbnVsbCI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMuZGF0ZS5ub3RFbXB0eSIsaC5jb25kaXRpb25zLmRhdGUubm90RW1wdHkpfSxpbml0OmMuaW5pdE5vVmFsdWUsaW5wdXRWYWx1ZTpmdW5jdGlvbigpe30saXNJbnB1dFZhbGlkOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHNlYXJjaDpmdW5jdGlvbihsKXtyZXR1cm4hKGw9PW51bGx8fGwubGVuZ3RoPT09MCl9fX0sYy5tb21lbnREYXRlQ29uZGl0aW9ucz17Ij0iOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmRhdGUuZXF1YWxzIixoLmNvbmRpdGlvbnMuZGF0ZS5lcXVhbHMpfSxpbml0OmMuaW5pdERhdGUsaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6Yy5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obCxoLF8pe3JldHVybiBuKCkobCxfLnMuZGF0ZUZvcm1hdCkudmFsdWVPZigpPT09bigpKGhbMF0sXy5zLmRhdGVGb3JtYXQpLnZhbHVlT2YoKX19LCIhPSI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMuZGF0ZS5ub3QiLGguY29uZGl0aW9ucy5kYXRlLm5vdCl9LGluaXQ6Yy5pbml0RGF0ZSxpbnB1dFZhbHVlOmMuaW5wdXRWYWx1ZUlucHV0LGlzSW5wdXRWYWxpZDpjLmlzSW5wdXRWYWxpZElucHV0LHNlYXJjaDpmdW5jdGlvbihsLGgsXyl7cmV0dXJuIG4oKShsLF8ucy5kYXRlRm9ybWF0KS52YWx1ZU9mKCkhPT1uKCkoaFswXSxfLnMuZGF0ZUZvcm1hdCkudmFsdWVPZigpfX0sIjwiOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmRhdGUuYmVmb3JlIixoLmNvbmRpdGlvbnMuZGF0ZS5iZWZvcmUpfSxpbml0OmMuaW5pdERhdGUsaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6Yy5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obCxoLF8pe3JldHVybiBuKCkobCxfLnMuZGF0ZUZvcm1hdCkudmFsdWVPZigpPG4oKShoWzBdLF8ucy5kYXRlRm9ybWF0KS52YWx1ZU9mKCl9fSwiPiI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMuZGF0ZS5hZnRlciIsaC5jb25kaXRpb25zLmRhdGUuYWZ0ZXIpfSxpbml0OmMuaW5pdERhdGUsaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6Yy5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obCxoLF8pe3JldHVybiBuKCkobCxfLnMuZGF0ZUZvcm1hdCkudmFsdWVPZigpPm4oKShoWzBdLF8ucy5kYXRlRm9ybWF0KS52YWx1ZU9mKCl9fSxiZXR3ZWVuOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmRhdGUuYmV0d2VlbiIsaC5jb25kaXRpb25zLmRhdGUuYmV0d2Vlbil9LGluaXQ6Yy5pbml0MkRhdGUsaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6Yy5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obCxoLF8pe3ZhciBGPW4oKShsLF8ucy5kYXRlRm9ybWF0KS52YWx1ZU9mKCksTz1uKCkoaFswXSxfLnMuZGF0ZUZvcm1hdCkudmFsdWVPZigpLGY9bigpKGhbMV0sXy5zLmRhdGVGb3JtYXQpLnZhbHVlT2YoKTtyZXR1cm4gTzxmP088PUYmJkY8PWY6Zjw9RiYmRjw9T319LCIhYmV0d2VlbiI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMuZGF0ZS5ub3RCZXR3ZWVuIixoLmNvbmRpdGlvbnMuZGF0ZS5ub3RCZXR3ZWVuKX0saW5pdDpjLmluaXQyRGF0ZSxpbnB1dFZhbHVlOmMuaW5wdXRWYWx1ZUlucHV0LGlzSW5wdXRWYWxpZDpjLmlzSW5wdXRWYWxpZElucHV0LHNlYXJjaDpmdW5jdGlvbihsLGgsXyl7dmFyIEY9bigpKGwsXy5zLmRhdGVGb3JtYXQpLnZhbHVlT2YoKSxPPW4oKShoWzBdLF8ucy5kYXRlRm9ybWF0KS52YWx1ZU9mKCksZj1uKCkoaFsxXSxfLnMuZGF0ZUZvcm1hdCkudmFsdWVPZigpO3JldHVybiBPPGY/ISgrTzw9K0YmJitGPD0rZik6ISgrZjw9K0YmJitGPD0rTyl9fSxudWxsOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmRhdGUuZW1wdHkiLGguY29uZGl0aW9ucy5kYXRlLmVtcHR5KX0saW5pdDpjLmluaXROb1ZhbHVlLGlucHV0VmFsdWU6ZnVuY3Rpb24oKXt9LGlzSW5wdXRWYWxpZDpmdW5jdGlvbigpe3JldHVybiEwfSxzZWFyY2g6ZnVuY3Rpb24obCl7cmV0dXJuIGw9PW51bGx8fGwubGVuZ3RoPT09MH19LCIhbnVsbCI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMuZGF0ZS5ub3RFbXB0eSIsaC5jb25kaXRpb25zLmRhdGUubm90RW1wdHkpfSxpbml0OmMuaW5pdE5vVmFsdWUsaW5wdXRWYWx1ZTpmdW5jdGlvbigpe30saXNJbnB1dFZhbGlkOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHNlYXJjaDpmdW5jdGlvbihsKXtyZXR1cm4hKGw9PW51bGx8fGwubGVuZ3RoPT09MCl9fX0sYy5sdXhvbkRhdGVDb25kaXRpb25zPXsiPSI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMuZGF0ZS5lcXVhbHMiLGguY29uZGl0aW9ucy5kYXRlLmVxdWFscyl9LGluaXQ6Yy5pbml0RGF0ZSxpbnB1dFZhbHVlOmMuaW5wdXRWYWx1ZUlucHV0LGlzSW5wdXRWYWxpZDpjLmlzSW5wdXRWYWxpZElucHV0LHNlYXJjaDpmdW5jdGlvbihsLGgsXyl7cmV0dXJuIHIoKS5EYXRlVGltZS5mcm9tRm9ybWF0KGwsXy5zLmRhdGVGb3JtYXQpLnRzPT09cigpLkRhdGVUaW1lLmZyb21Gb3JtYXQoaFswXSxfLnMuZGF0ZUZvcm1hdCkudHN9fSwiIT0iOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmRhdGUubm90IixoLmNvbmRpdGlvbnMuZGF0ZS5ub3QpfSxpbml0OmMuaW5pdERhdGUsaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6Yy5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obCxoLF8pe3JldHVybiByKCkuRGF0ZVRpbWUuZnJvbUZvcm1hdChsLF8ucy5kYXRlRm9ybWF0KS50cyE9PXIoKS5EYXRlVGltZS5mcm9tRm9ybWF0KGhbMF0sXy5zLmRhdGVGb3JtYXQpLnRzfX0sIjwiOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmRhdGUuYmVmb3JlIixoLmNvbmRpdGlvbnMuZGF0ZS5iZWZvcmUpfSxpbml0OmMuaW5pdERhdGUsaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6Yy5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obCxoLF8pe3JldHVybiByKCkuRGF0ZVRpbWUuZnJvbUZvcm1hdChsLF8ucy5kYXRlRm9ybWF0KS50czxyKCkuRGF0ZVRpbWUuZnJvbUZvcm1hdChoWzBdLF8ucy5kYXRlRm9ybWF0KS50c319LCI+Ijp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihsLGgpe3JldHVybiBsLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5kYXRlLmFmdGVyIixoLmNvbmRpdGlvbnMuZGF0ZS5hZnRlcil9LGluaXQ6Yy5pbml0RGF0ZSxpbnB1dFZhbHVlOmMuaW5wdXRWYWx1ZUlucHV0LGlzSW5wdXRWYWxpZDpjLmlzSW5wdXRWYWxpZElucHV0LHNlYXJjaDpmdW5jdGlvbihsLGgsXyl7cmV0dXJuIHIoKS5EYXRlVGltZS5mcm9tRm9ybWF0KGwsXy5zLmRhdGVGb3JtYXQpLnRzPnIoKS5EYXRlVGltZS5mcm9tRm9ybWF0KGhbMF0sXy5zLmRhdGVGb3JtYXQpLnRzfX0sYmV0d2Vlbjp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihsLGgpe3JldHVybiBsLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5kYXRlLmJldHdlZW4iLGguY29uZGl0aW9ucy5kYXRlLmJldHdlZW4pfSxpbml0OmMuaW5pdDJEYXRlLGlucHV0VmFsdWU6Yy5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmMuaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKGwsaCxfKXt2YXIgRj1yKCkuRGF0ZVRpbWUuZnJvbUZvcm1hdChsLF8ucy5kYXRlRm9ybWF0KS50cyxPPXIoKS5EYXRlVGltZS5mcm9tRm9ybWF0KGhbMF0sXy5zLmRhdGVGb3JtYXQpLnRzLGY9cigpLkRhdGVUaW1lLmZyb21Gb3JtYXQoaFsxXSxfLnMuZGF0ZUZvcm1hdCkudHM7cmV0dXJuIE88Zj9PPD1GJiZGPD1mOmY8PUYmJkY8PU99fSwiIWJldHdlZW4iOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmRhdGUubm90QmV0d2VlbiIsaC5jb25kaXRpb25zLmRhdGUubm90QmV0d2Vlbil9LGluaXQ6Yy5pbml0MkRhdGUsaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6Yy5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obCxoLF8pe3ZhciBGPXIoKS5EYXRlVGltZS5mcm9tRm9ybWF0KGwsXy5zLmRhdGVGb3JtYXQpLnRzLE89cigpLkRhdGVUaW1lLmZyb21Gb3JtYXQoaFswXSxfLnMuZGF0ZUZvcm1hdCkudHMsZj1yKCkuRGF0ZVRpbWUuZnJvbUZvcm1hdChoWzFdLF8ucy5kYXRlRm9ybWF0KS50cztyZXR1cm4gTzxmPyEoK088PStGJiYrRjw9K2YpOiEoK2Y8PStGJiYrRjw9K08pfX0sbnVsbDp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihsLGgpe3JldHVybiBsLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5kYXRlLmVtcHR5IixoLmNvbmRpdGlvbnMuZGF0ZS5lbXB0eSl9LGluaXQ6Yy5pbml0Tm9WYWx1ZSxpbnB1dFZhbHVlOmZ1bmN0aW9uKCl7fSxpc0lucHV0VmFsaWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sc2VhcmNoOmZ1bmN0aW9uKGwpe3JldHVybiBsPT1udWxsfHxsLmxlbmd0aD09PTB9fSwiIW51bGwiOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmRhdGUubm90RW1wdHkiLGguY29uZGl0aW9ucy5kYXRlLm5vdEVtcHR5KX0saW5pdDpjLmluaXROb1ZhbHVlLGlucHV0VmFsdWU6ZnVuY3Rpb24oKXt9LGlzSW5wdXRWYWxpZDpmdW5jdGlvbigpe3JldHVybiEwfSxzZWFyY2g6ZnVuY3Rpb24obCl7cmV0dXJuIShsPT1udWxsfHxsLmxlbmd0aD09PTApfX19LGMubnVtQ29uZGl0aW9ucz17Ij0iOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLm51bWJlci5lcXVhbHMiLGguY29uZGl0aW9ucy5udW1iZXIuZXF1YWxzKX0saW5pdDpjLmluaXRTZWxlY3QsaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVTZWxlY3QsaXNJbnB1dFZhbGlkOmMuaXNJbnB1dFZhbGlkU2VsZWN0LHNlYXJjaDpmdW5jdGlvbihsLGgpe3JldHVybitsPT0raFswXX19LCIhPSI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMubnVtYmVyLm5vdCIsaC5jb25kaXRpb25zLm51bWJlci5ub3QpfSxpbml0OmMuaW5pdFNlbGVjdCxpbnB1dFZhbHVlOmMuaW5wdXRWYWx1ZVNlbGVjdCxpc0lucHV0VmFsaWQ6Yy5pc0lucHV0VmFsaWRTZWxlY3Qsc2VhcmNoOmZ1bmN0aW9uKGwsaCl7cmV0dXJuK2whPStoWzBdfX0sIjwiOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLm51bWJlci5sdCIsaC5jb25kaXRpb25zLm51bWJlci5sdCl9LGluaXQ6Yy5pbml0SW5wdXQsaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6Yy5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obCxoKXtyZXR1cm4rbDwraFswXX19LCI8PSI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMubnVtYmVyLmx0ZSIsaC5jb25kaXRpb25zLm51bWJlci5sdGUpfSxpbml0OmMuaW5pdElucHV0LGlucHV0VmFsdWU6Yy5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmMuaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKGwsaCl7cmV0dXJuK2w8PStoWzBdfX0sIj49Ijp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihsLGgpe3JldHVybiBsLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5udW1iZXIuZ3RlIixoLmNvbmRpdGlvbnMubnVtYmVyLmd0ZSl9LGluaXQ6Yy5pbml0SW5wdXQsaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6Yy5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obCxoKXtyZXR1cm4rbD49K2hbMF19fSwiPiI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMubnVtYmVyLmd0IixoLmNvbmRpdGlvbnMubnVtYmVyLmd0KX0saW5pdDpjLmluaXRJbnB1dCxpbnB1dFZhbHVlOmMuaW5wdXRWYWx1ZUlucHV0LGlzSW5wdXRWYWxpZDpjLmlzSW5wdXRWYWxpZElucHV0LHNlYXJjaDpmdW5jdGlvbihsLGgpe3JldHVybitsPitoWzBdfX0sYmV0d2Vlbjp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihsLGgpe3JldHVybiBsLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5udW1iZXIuYmV0d2VlbiIsaC5jb25kaXRpb25zLm51bWJlci5iZXR3ZWVuKX0saW5pdDpjLmluaXQySW5wdXQsaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6Yy5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obCxoKXtyZXR1cm4raFswXTwraFsxXT8raFswXTw9K2wmJitsPD0raFsxXToraFsxXTw9K2wmJitsPD0raFswXX19LCIhYmV0d2VlbiI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMubnVtYmVyLm5vdEJldHdlZW4iLGguY29uZGl0aW9ucy5udW1iZXIubm90QmV0d2Vlbil9LGluaXQ6Yy5pbml0MklucHV0LGlucHV0VmFsdWU6Yy5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmMuaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKGwsaCl7cmV0dXJuK2hbMF08K2hbMV0/ISgraFswXTw9K2wmJitsPD0raFsxXSk6ISgraFsxXTw9K2wmJitsPD0raFswXSl9fSxudWxsOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLm51bWJlci5lbXB0eSIsaC5jb25kaXRpb25zLm51bWJlci5lbXB0eSl9LGluaXQ6Yy5pbml0Tm9WYWx1ZSxpbnB1dFZhbHVlOmZ1bmN0aW9uKCl7fSxpc0lucHV0VmFsaWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sc2VhcmNoOmZ1bmN0aW9uKGwpe3JldHVybiBsPT1udWxsfHxsLmxlbmd0aD09PTB9fSwiIW51bGwiOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLm51bWJlci5ub3RFbXB0eSIsaC5jb25kaXRpb25zLm51bWJlci5ub3RFbXB0eSl9LGluaXQ6Yy5pbml0Tm9WYWx1ZSxpbnB1dFZhbHVlOmZ1bmN0aW9uKCl7fSxpc0lucHV0VmFsaWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sc2VhcmNoOmZ1bmN0aW9uKGwpe3JldHVybiEobD09bnVsbHx8bC5sZW5ndGg9PT0wKX19fSxjLm51bUZtdENvbmRpdGlvbnM9eyI9Ijp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihsLGgpe3JldHVybiBsLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5udW1iZXIuZXF1YWxzIixoLmNvbmRpdGlvbnMubnVtYmVyLmVxdWFscyl9LGluaXQ6Yy5pbml0U2VsZWN0LGlucHV0VmFsdWU6Yy5pbnB1dFZhbHVlU2VsZWN0LGlzSW5wdXRWYWxpZDpjLmlzSW5wdXRWYWxpZFNlbGVjdCxzZWFyY2g6ZnVuY3Rpb24obCxoLF8pe3JldHVybiBfLnBhcnNlTnVtYmVyKGwpPT09Xy5wYXJzZU51bWJlcihoWzBdKX19LCIhPSI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMubnVtYmVyLm5vdCIsaC5jb25kaXRpb25zLm51bWJlci5ub3QpfSxpbml0OmMuaW5pdFNlbGVjdCxpbnB1dFZhbHVlOmMuaW5wdXRWYWx1ZVNlbGVjdCxpc0lucHV0VmFsaWQ6Yy5pc0lucHV0VmFsaWRTZWxlY3Qsc2VhcmNoOmZ1bmN0aW9uKGwsaCxfKXtyZXR1cm4gXy5wYXJzZU51bWJlcihsKSE9PV8ucGFyc2VOdW1iZXIoaFswXSl9fSwiPCI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMubnVtYmVyLmx0IixoLmNvbmRpdGlvbnMubnVtYmVyLmx0KX0saW5pdDpjLmluaXRJbnB1dCxpbnB1dFZhbHVlOmMuaW5wdXRWYWx1ZUlucHV0LGlzSW5wdXRWYWxpZDpjLmlzSW5wdXRWYWxpZElucHV0LHNlYXJjaDpmdW5jdGlvbihsLGgsXyl7cmV0dXJuIF8ucGFyc2VOdW1iZXIobCk8Xy5wYXJzZU51bWJlcihoWzBdKX19LCI8PSI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMubnVtYmVyLmx0ZSIsaC5jb25kaXRpb25zLm51bWJlci5sdGUpfSxpbml0OmMuaW5pdElucHV0LGlucHV0VmFsdWU6Yy5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmMuaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKGwsaCxfKXtyZXR1cm4gXy5wYXJzZU51bWJlcihsKTw9Xy5wYXJzZU51bWJlcihoWzBdKX19LCI+PSI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMubnVtYmVyLmd0ZSIsaC5jb25kaXRpb25zLm51bWJlci5ndGUpfSxpbml0OmMuaW5pdElucHV0LGlucHV0VmFsdWU6Yy5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmMuaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKGwsaCxfKXtyZXR1cm4gXy5wYXJzZU51bWJlcihsKT49Xy5wYXJzZU51bWJlcihoWzBdKX19LCI+Ijp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihsLGgpe3JldHVybiBsLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5udW1iZXIuZ3QiLGguY29uZGl0aW9ucy5udW1iZXIuZ3QpfSxpbml0OmMuaW5pdElucHV0LGlucHV0VmFsdWU6Yy5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmMuaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKGwsaCxfKXtyZXR1cm4gXy5wYXJzZU51bWJlcihsKT5fLnBhcnNlTnVtYmVyKGhbMF0pfX0sYmV0d2Vlbjp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihsLGgpe3JldHVybiBsLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5udW1iZXIuYmV0d2VlbiIsaC5jb25kaXRpb25zLm51bWJlci5iZXR3ZWVuKX0saW5pdDpjLmluaXQySW5wdXQsaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6Yy5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obCxoLF8pe3ZhciBGPV8ucGFyc2VOdW1iZXIobCksTz1fLnBhcnNlTnVtYmVyKGhbMF0pLGY9Xy5wYXJzZU51bWJlcihoWzFdKTtyZXR1cm4rTzwrZj8rTzw9K0YmJitGPD0rZjorZjw9K0YmJitGPD0rT319LCIhYmV0d2VlbiI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMubnVtYmVyLm5vdEJldHdlZW4iLGguY29uZGl0aW9ucy5udW1iZXIubm90QmV0d2Vlbil9LGluaXQ6Yy5pbml0MklucHV0LGlucHV0VmFsdWU6Yy5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmMuaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKGwsaCxfKXt2YXIgRj1fLnBhcnNlTnVtYmVyKGwpLE89Xy5wYXJzZU51bWJlcihoWzBdKSxmPV8ucGFyc2VOdW1iZXIoaFsxXSk7cmV0dXJuK088K2Y/ISgrTzw9K0YmJitGPD0rZik6ISgrZjw9K0YmJitGPD0rTyl9fSxudWxsOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLm51bWJlci5lbXB0eSIsaC5jb25kaXRpb25zLm51bWJlci5lbXB0eSl9LGluaXQ6Yy5pbml0Tm9WYWx1ZSxpbnB1dFZhbHVlOmZ1bmN0aW9uKCl7fSxpc0lucHV0VmFsaWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sc2VhcmNoOmZ1bmN0aW9uKGwpe3JldHVybiBsPT1udWxsfHxsLmxlbmd0aD09PTB9fSwiIW51bGwiOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLm51bWJlci5ub3RFbXB0eSIsaC5jb25kaXRpb25zLm51bWJlci5ub3RFbXB0eSl9LGluaXQ6Yy5pbml0Tm9WYWx1ZSxpbnB1dFZhbHVlOmZ1bmN0aW9uKCl7fSxpc0lucHV0VmFsaWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sc2VhcmNoOmZ1bmN0aW9uKGwpe3JldHVybiEobD09bnVsbHx8bC5sZW5ndGg9PT0wKX19fSxjLnN0cmluZ0NvbmRpdGlvbnM9eyI9Ijp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihsLGgpe3JldHVybiBsLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5zdHJpbmcuZXF1YWxzIixoLmNvbmRpdGlvbnMuc3RyaW5nLmVxdWFscyl9LGluaXQ6Yy5pbml0U2VsZWN0LGlucHV0VmFsdWU6Yy5pbnB1dFZhbHVlU2VsZWN0LGlzSW5wdXRWYWxpZDpjLmlzSW5wdXRWYWxpZFNlbGVjdCxzZWFyY2g6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbD09PWhbMF19fSwiIT0iOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLnN0cmluZy5ub3QiLGguY29uZGl0aW9ucy5zdHJpbmcubm90KX0saW5pdDpjLmluaXRTZWxlY3QsaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVTZWxlY3QsaXNJbnB1dFZhbGlkOmMuaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwhPT1oWzBdfX0sc3RhcnRzOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLnN0cmluZy5zdGFydHNXaXRoIixoLmNvbmRpdGlvbnMuc3RyaW5nLnN0YXJ0c1dpdGgpfSxpbml0OmMuaW5pdElucHV0LGlucHV0VmFsdWU6Yy5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmMuaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwudG9Mb3dlckNhc2UoKS5pbmRleE9mKGhbMF0udG9Mb3dlckNhc2UoKSk9PT0wfX0sIiFzdGFydHMiOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLnN0cmluZy5ub3RTdGFydHNXaXRoIixoLmNvbmRpdGlvbnMuc3RyaW5nLm5vdFN0YXJ0c1dpdGgpfSxpbml0OmMuaW5pdElucHV0LGlucHV0VmFsdWU6Yy5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmMuaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwudG9Mb3dlckNhc2UoKS5pbmRleE9mKGhbMF0udG9Mb3dlckNhc2UoKSkhPT0wfX0sY29udGFpbnM6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMuc3RyaW5nLmNvbnRhaW5zIixoLmNvbmRpdGlvbnMuc3RyaW5nLmNvbnRhaW5zKX0saW5pdDpjLmluaXRJbnB1dCxpbnB1dFZhbHVlOmMuaW5wdXRWYWx1ZUlucHV0LGlzSW5wdXRWYWxpZDpjLmlzSW5wdXRWYWxpZElucHV0LHNlYXJjaDpmdW5jdGlvbihsLGgpe3JldHVybiBsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoaFswXS50b0xvd2VyQ2FzZSgpKX19LCIhY29udGFpbnMiOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLnN0cmluZy5ub3RDb250YWlucyIsaC5jb25kaXRpb25zLnN0cmluZy5ub3RDb250YWlucyl9LGluaXQ6Yy5pbml0SW5wdXQsaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6Yy5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obCxoKXtyZXR1cm4hbC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGhbMF0udG9Mb3dlckNhc2UoKSl9fSxlbmRzOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLnN0cmluZy5lbmRzV2l0aCIsaC5jb25kaXRpb25zLnN0cmluZy5lbmRzV2l0aCl9LGluaXQ6Yy5pbml0SW5wdXQsaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6Yy5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKGhbMF0udG9Mb3dlckNhc2UoKSl9fSwiIWVuZHMiOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLnN0cmluZy5ub3RFbmRzV2l0aCIsaC5jb25kaXRpb25zLnN0cmluZy5ub3RFbmRzV2l0aCl9LGluaXQ6Yy5pbml0SW5wdXQsaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6Yy5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obCxoKXtyZXR1cm4hbC50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKGhbMF0udG9Mb3dlckNhc2UoKSl9fSxudWxsOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLnN0cmluZy5lbXB0eSIsaC5jb25kaXRpb25zLnN0cmluZy5lbXB0eSl9LGluaXQ6Yy5pbml0Tm9WYWx1ZSxpbnB1dFZhbHVlOmZ1bmN0aW9uKCl7fSxpc0lucHV0VmFsaWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sc2VhcmNoOmZ1bmN0aW9uKGwpe3JldHVybiBsPT1udWxsfHxsLmxlbmd0aD09PTB9fSwiIW51bGwiOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLnN0cmluZy5ub3RFbXB0eSIsaC5jb25kaXRpb25zLnN0cmluZy5ub3RFbXB0eSl9LGluaXQ6Yy5pbml0Tm9WYWx1ZSxpbnB1dFZhbHVlOmZ1bmN0aW9uKCl7fSxpc0lucHV0VmFsaWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sc2VhcmNoOmZ1bmN0aW9uKGwpe3JldHVybiEobD09bnVsbHx8bC5sZW5ndGg9PT0wKX19fSxjLmFycmF5Q29uZGl0aW9ucz17Y29udGFpbnM6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMuYXJyYXkuY29udGFpbnMiLGguY29uZGl0aW9ucy5hcnJheS5jb250YWlucyl9LGluaXQ6Yy5pbml0U2VsZWN0QXJyYXksaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVTZWxlY3QsaXNJbnB1dFZhbGlkOmMuaXNJbnB1dFZhbGlkU2VsZWN0LHNlYXJjaDpmdW5jdGlvbihsLGgpe3JldHVybiBsLmluY2x1ZGVzKGhbMF0pfX0sd2l0aG91dDp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihsLGgpe3JldHVybiBsLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5hcnJheS53aXRob3V0IixoLmNvbmRpdGlvbnMuYXJyYXkud2l0aG91dCl9LGluaXQ6Yy5pbml0U2VsZWN0QXJyYXksaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVTZWxlY3QsaXNJbnB1dFZhbGlkOmMuaXNJbnB1dFZhbGlkU2VsZWN0LHNlYXJjaDpmdW5jdGlvbihsLGgpe3JldHVybiBsLmluZGV4T2YoaFswXSk9PT0tMX19LCI9Ijp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihsLGgpe3JldHVybiBsLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5hcnJheS5lcXVhbHMiLGguY29uZGl0aW9ucy5hcnJheS5lcXVhbHMpfSxpbml0OmMuaW5pdFNlbGVjdCxpbnB1dFZhbHVlOmMuaW5wdXRWYWx1ZVNlbGVjdCxpc0lucHV0VmFsaWQ6Yy5pc0lucHV0VmFsaWRTZWxlY3Qsc2VhcmNoOmZ1bmN0aW9uKGwsaCl7aWYobC5sZW5ndGg9PT1oWzBdLmxlbmd0aCl7Zm9yKHZhciBfPTA7XzxsLmxlbmd0aDtfKyspaWYobFtfXSE9PWhbMF1bX10pcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuITF9fSwiIT0iOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmFycmF5Lm5vdCIsaC5jb25kaXRpb25zLmFycmF5Lm5vdCl9LGluaXQ6Yy5pbml0U2VsZWN0LGlucHV0VmFsdWU6Yy5pbnB1dFZhbHVlU2VsZWN0LGlzSW5wdXRWYWxpZDpjLmlzSW5wdXRWYWxpZFNlbGVjdCxzZWFyY2g6ZnVuY3Rpb24obCxoKXtpZihsLmxlbmd0aD09PWhbMF0ubGVuZ3RoKXtmb3IodmFyIF89MDtfPGwubGVuZ3RoO18rKylpZihsW19dIT09aFswXVtfXSlyZXR1cm4hMDtyZXR1cm4hMX1yZXR1cm4hMH19LG51bGw6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMuYXJyYXkuZW1wdHkiLGguY29uZGl0aW9ucy5hcnJheS5lbXB0eSl9LGluaXQ6Yy5pbml0Tm9WYWx1ZSxpbnB1dFZhbHVlOmZ1bmN0aW9uKCl7fSxpc0lucHV0VmFsaWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sc2VhcmNoOmZ1bmN0aW9uKGwpe3JldHVybiBsPT1udWxsfHxsLmxlbmd0aD09PTB9fSwiIW51bGwiOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmFycmF5Lm5vdEVtcHR5IixoLmNvbmRpdGlvbnMuYXJyYXkubm90RW1wdHkpfSxpbml0OmMuaW5pdE5vVmFsdWUsaW5wdXRWYWx1ZTpmdW5jdGlvbigpe30saXNJbnB1dFZhbGlkOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHNlYXJjaDpmdW5jdGlvbihsKXtyZXR1cm4gbCE9bnVsbCYmbC5sZW5ndGghPT0wfX19LGMuZGVmYXVsdHM9e2NvbHVtbnM6ITAsY29uZGl0aW9uczp7YXJyYXk6Yy5hcnJheUNvbmRpdGlvbnMsZGF0ZTpjLmRhdGVDb25kaXRpb25zLGh0bWw6Yy5zdHJpbmdDb25kaXRpb25zLCJodG1sLW51bSI6Yy5udW1Db25kaXRpb25zLCJodG1sLW51bS1mbXQiOmMubnVtRm10Q29uZGl0aW9ucyxsdXhvbjpjLmx1eG9uRGF0ZUNvbmRpdGlvbnMsbW9tZW50OmMubW9tZW50RGF0ZUNvbmRpdGlvbnMsbnVtOmMubnVtQ29uZGl0aW9ucywibnVtLWZtdCI6Yy5udW1GbXRDb25kaXRpb25zLHN0cmluZzpjLnN0cmluZ0NvbmRpdGlvbnN9LGRlcHRoTGltaXQ6ITEsZW50ZXJTZWFyY2g6ITEsZmlsdGVyQ2hhbmdlZDp2b2lkIDAsZ3JleXNjYWxlOiExLGkxOG46e2FkZDoiQWRkIENvbmRpdGlvbiIsYnV0dG9uOnswOiJTZWFyY2ggQnVpbGRlciIsXzoiU2VhcmNoIEJ1aWxkZXIgKCVkKSJ9LGNsZWFyQWxsOiJDbGVhciBBbGwiLGNvbmRpdGlvbjoiQ29uZGl0aW9uIixkYXRhOiJEYXRhIixkZWxldGU6IiZ0aW1lcyIsZGVsZXRlVGl0bGU6IkRlbGV0ZSBmaWx0ZXJpbmcgcnVsZSIsbGVmdDoiPCIsbGVmdFRpdGxlOiJPdXRkZW50IGNyaXRlcmlhIixsb2dpY0FuZDoiQW5kIixsb2dpY09yOiJPciIscmlnaHQ6Ij4iLHJpZ2h0VGl0bGU6IkluZGVudCBjcml0ZXJpYSIsc2VhcmNoOiJTZWFyY2giLHRpdGxlOnswOiJDdXN0b20gU2VhcmNoIEJ1aWxkZXIiLF86IkN1c3RvbSBTZWFyY2ggQnVpbGRlciAoJWQpIn0sdmFsdWU6IlZhbHVlIix2YWx1ZUpvaW5lcjoiYW5kIn0sbGl2ZVNlYXJjaDohMCxsb2dpYzoiQU5EIixvcnRob2dvbmFsOntkaXNwbGF5OiJkaXNwbGF5IixzZWFyY2g6ImZpbHRlciJ9LHByZURlZmluZWQ6ITF9LGN9KCksbztmdW5jdGlvbiB1KGMpe289YyxjLmZuLmRhdGFUYWJsZX12YXIgcD1mdW5jdGlvbigpe2Z1bmN0aW9uIGMobCxoLF8sRixPLGYsVSl7cmV0dXJuIEY9PT12b2lkIDAmJihGPTApLE89PT12b2lkIDAmJihPPSExKSxmPT09dm9pZCAwJiYoZj0xKSxVPT09dm9pZCAwJiYoVT12b2lkIDApLHRoaXMuY2xhc3Nlcz1vLmV4dGVuZCghMCx7fSxjLmNsYXNzZXMpLHRoaXMuYz1vLmV4dGVuZCghMCx7fSxjLmRlZmF1bHRzLGgpLHRoaXMucz17Y3JpdGVyaWE6W10sZGVwdGg6ZixkdDpsLGluZGV4OkYsaXNDaGlsZDpPLGxvZ2ljOnZvaWQgMCxvcHRzOmgscHJldmVudFJlZHJhdzohMSxzZXJ2ZXJEYXRhOlUsdG9Ecm9wOnZvaWQgMCx0b3BHcm91cDpffSx0aGlzLmRvbT17YWRkOm8oIjxidXR0b24vPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5hZGQpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5idXR0b24pLmF0dHIoInR5cGUiLCJidXR0b24iKSxjbGVhcjpvKCI8YnV0dG9uPiZ0aW1lczwvYnV0dG9uPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5idXR0b24pLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5jbGVhckdyb3VwKS5hdHRyKCJ0eXBlIiwiYnV0dG9uIiksY29udGFpbmVyOm8oIjxkaXYvPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5ncm91cCksbG9naWM6bygiPGJ1dHRvbj48ZGl2Lz48L2J1dHRvbj4iKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMubG9naWMpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5idXR0b24pLmF0dHIoInR5cGUiLCJidXR0b24iKSxsb2dpY0NvbnRhaW5lcjpvKCI8ZGl2Lz4iKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMubG9naWNDb250YWluZXIpLHNlYXJjaDpvKCI8YnV0dG9uLz4iKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuc2VhcmNoKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuYnV0dG9uKS5hdHRyKCJ0eXBlIiwiYnV0dG9uIikuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSx0aGlzLnMudG9wR3JvdXA9PT12b2lkIDAmJih0aGlzLnMudG9wR3JvdXA9dGhpcy5kb20uY29udGFpbmVyKSx0aGlzLl9zZXR1cCgpLHRoaXN9cmV0dXJuIGMucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLmRvbS5hZGQub2ZmKCIuZHRzYiIpLHRoaXMuZG9tLmxvZ2ljLm9mZigiLmR0c2IiKSx0aGlzLmRvbS5zZWFyY2gub2ZmKCIuZHRzYiIpLHRoaXMuZG9tLmNvbnRhaW5lci50cmlnZ2VyKCJkdHNiLWRlc3Ryb3kiKS5yZW1vdmUoKSx0aGlzLnMuY3JpdGVyaWE9W119LGMucHJvdG90eXBlLmdldERldGFpbHM9ZnVuY3Rpb24obCl7aWYobD09PXZvaWQgMCYmKGw9ITEpLHRoaXMucy5jcml0ZXJpYS5sZW5ndGg9PT0wKXJldHVybnt9O2Zvcih2YXIgaD17Y3JpdGVyaWE6W10sbG9naWM6dGhpcy5zLmxvZ2ljfSxfPTAsRj10aGlzLnMuY3JpdGVyaWE7XzxGLmxlbmd0aDtfKyspe3ZhciBPPUZbX107aC5jcml0ZXJpYS5wdXNoKE8uY3JpdGVyaWEuZ2V0RGV0YWlscyhsKSl9cmV0dXJuIGh9LGMucHJvdG90eXBlLmdldE5vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb20uY29udGFpbmVyfSxjLnByb3RvdHlwZS5yZWJ1aWxkPWZ1bmN0aW9uKGwpe3ZhciBoO2lmKCEobC5jcml0ZXJpYT09PXZvaWQgMHx8bC5jcml0ZXJpYT09PW51bGx8fEFycmF5LmlzQXJyYXkobC5jcml0ZXJpYSkmJmwuY3JpdGVyaWEubGVuZ3RoPT09MCkpe2lmKHRoaXMucy5sb2dpYz1sLmxvZ2ljLHRoaXMuZG9tLmxvZ2ljLmNoaWxkcmVuKCkuZmlyc3QoKS5odG1sKHRoaXMucy5sb2dpYz09PSJPUiI/dGhpcy5zLmR0LmkxOG4oInNlYXJjaEJ1aWxkZXIubG9naWNPciIsdGhpcy5jLmkxOG4ubG9naWNPcik6dGhpcy5zLmR0LmkxOG4oInNlYXJjaEJ1aWxkZXIubG9naWNBbmQiLHRoaXMuYy5pMThuLmxvZ2ljQW5kKSksQXJyYXkuaXNBcnJheShsLmNyaXRlcmlhKSlmb3IodmFyIF89MCxGPWwuY3JpdGVyaWE7XzxGLmxlbmd0aDtfKyspaD1GW19dLGgubG9naWMhPT12b2lkIDA/dGhpcy5fYWRkUHJldkdyb3VwKGgpOmgubG9naWM9PT12b2lkIDAmJnRoaXMuX2FkZFByZXZDcml0ZXJpYShoKTtmb3IodmFyIE89MCxmPXRoaXMucy5jcml0ZXJpYTtPPGYubGVuZ3RoO08rKyloPWZbT10saC5jcml0ZXJpYSBpbnN0YW5jZW9mIGkmJihoLmNyaXRlcmlhLnVwZGF0ZUFycm93cyh0aGlzLnMuY3JpdGVyaWEubGVuZ3RoPjEpLHRoaXMuX3NldENyaXRlcmlhTGlzdGVuZXJzKGguY3JpdGVyaWEpKX19LGMucHJvdG90eXBlLnJlZHJhd0NvbnRlbnRzPWZ1bmN0aW9uKCl7aWYoIXRoaXMucy5wcmV2ZW50UmVkcmF3KXt0aGlzLmRvbS5jb250YWluZXIuY2hpbGRyZW4oKS5kZXRhY2goKSx0aGlzLmRvbS5jb250YWluZXIuYXBwZW5kKHRoaXMuZG9tLmxvZ2ljQ29udGFpbmVyKS5hcHBlbmQodGhpcy5kb20uYWRkKSx0aGlzLmMubGl2ZVNlYXJjaHx8dGhpcy5kb20uY29udGFpbmVyLmFwcGVuZCh0aGlzLmRvbS5zZWFyY2gpLHRoaXMucy5jcml0ZXJpYS5zb3J0KGZ1bmN0aW9uKF8sRil7cmV0dXJuIF8uY3JpdGVyaWEucy5pbmRleDxGLmNyaXRlcmlhLnMuaW5kZXg/LTE6Xy5jcml0ZXJpYS5zLmluZGV4PkYuY3JpdGVyaWEucy5pbmRleD8xOjB9KSx0aGlzLnNldExpc3RlbmVycygpO2Zvcih2YXIgbD0wO2w8dGhpcy5zLmNyaXRlcmlhLmxlbmd0aDtsKyspe3ZhciBoPXRoaXMucy5jcml0ZXJpYVtsXS5jcml0ZXJpYTtoIGluc3RhbmNlb2YgaT8odGhpcy5zLmNyaXRlcmlhW2xdLmluZGV4PWwsdGhpcy5zLmNyaXRlcmlhW2xdLmNyaXRlcmlhLnMuaW5kZXg9bCx0aGlzLnMuY3JpdGVyaWFbbF0uY3JpdGVyaWEuZG9tLmNvbnRhaW5lci5pbnNlcnRCZWZvcmUodGhpcy5kb20uYWRkKSx0aGlzLl9zZXRDcml0ZXJpYUxpc3RlbmVycyhoKSx0aGlzLnMuY3JpdGVyaWFbbF0uY3JpdGVyaWEucy5wcmV2ZW50UmVkcmF3PXRoaXMucy5wcmV2ZW50UmVkcmF3LHRoaXMucy5jcml0ZXJpYVtsXS5jcml0ZXJpYS5yZWJ1aWxkKHRoaXMucy5jcml0ZXJpYVtsXS5jcml0ZXJpYS5nZXREZXRhaWxzKCkpLHRoaXMucy5jcml0ZXJpYVtsXS5jcml0ZXJpYS5zLnByZXZlbnRSZWRyYXc9ITEpOmggaW5zdGFuY2VvZiBjJiZoLnMuY3JpdGVyaWEubGVuZ3RoPjA/KHRoaXMucy5jcml0ZXJpYVtsXS5pbmRleD1sLHRoaXMucy5jcml0ZXJpYVtsXS5jcml0ZXJpYS5zLmluZGV4PWwsdGhpcy5zLmNyaXRlcmlhW2xdLmNyaXRlcmlhLmRvbS5jb250YWluZXIuaW5zZXJ0QmVmb3JlKHRoaXMuZG9tLmFkZCksaC5zLnByZXZlbnRSZWRyYXc9dGhpcy5zLnByZXZlbnRSZWRyYXcsaC5yZWRyYXdDb250ZW50cygpLGgucy5wcmV2ZW50UmVkcmF3PSExLHRoaXMuX3NldEdyb3VwTGlzdGVuZXJzKGgpKToodGhpcy5zLmNyaXRlcmlhLnNwbGljZShsLDEpLGwtLSl9dGhpcy5zZXR1cExvZ2ljKCl9fSxjLnByb3RvdHlwZS5yZWRyYXdMb2dpYz1mdW5jdGlvbigpe2Zvcih2YXIgbD0wLGg9dGhpcy5zLmNyaXRlcmlhO2w8aC5sZW5ndGg7bCsrKXt2YXIgXz1oW2xdO18uY3JpdGVyaWEgaW5zdGFuY2VvZiBjJiZfLmNyaXRlcmlhLnJlZHJhd0xvZ2ljKCl9dGhpcy5zZXR1cExvZ2ljKCl9LGMucHJvdG90eXBlLnNlYXJjaD1mdW5jdGlvbihsLGgpe3JldHVybiB0aGlzLnMubG9naWM9PT0iQU5EIj90aGlzLl9hbmRTZWFyY2gobCxoKTp0aGlzLnMubG9naWM9PT0iT1IiP3RoaXMuX29yU2VhcmNoKGwsaCk6ITB9LGMucHJvdG90eXBlLnNldHVwTG9naWM9ZnVuY3Rpb24oKXtpZih0aGlzLmRvbS5sb2dpY0NvbnRhaW5lci5yZW1vdmUoKSx0aGlzLmRvbS5jbGVhci5yZW1vdmUoKSx0aGlzLnMuY3JpdGVyaWEubGVuZ3RoPDEpe3RoaXMucy5pc0NoaWxkfHwodGhpcy5kb20uY29udGFpbmVyLnRyaWdnZXIoImR0c2ItZGVzdHJveSIpLHRoaXMuZG9tLmNvbnRhaW5lci5jc3MoIm1hcmdpbi1sZWZ0IiwwKSksdGhpcy5kb20uc2VhcmNoLmNzcygiZGlzcGxheSIsIm5vbmUiKTtyZXR1cm59dGhpcy5kb20uY2xlYXIuaGVpZ2h0KCIwcHgiKSx0aGlzLmRvbS5sb2dpY0NvbnRhaW5lci5hcHBlbmQodGhpcy5kb20uY2xlYXIpLHRoaXMucy5pc0NoaWxkfHx0aGlzLmRvbS5zZWFyY2guY3NzKCJkaXNwbGF5IiwiaW5saW5lLWJsb2NrIiksdGhpcy5kb20uY29udGFpbmVyLnByZXBlbmQodGhpcy5kb20ubG9naWNDb250YWluZXIpO2Zvcih2YXIgbD0wLGg9dGhpcy5zLmNyaXRlcmlhO2w8aC5sZW5ndGg7bCsrKXt2YXIgXz1oW2xdO18uY3JpdGVyaWEgaW5zdGFuY2VvZiBpJiZfLmNyaXRlcmlhLnNldHVwQnV0dG9ucygpfXZhciBGPXRoaXMuZG9tLmNvbnRhaW5lci5vdXRlckhlaWdodCgpLTE7dGhpcy5kb20ubG9naWNDb250YWluZXIud2lkdGgoRiksdGhpcy5fc2V0TG9naWNMaXN0ZW5lcigpLHRoaXMuZG9tLmNvbnRhaW5lci5jc3MoIm1hcmdpbi1sZWZ0Iix0aGlzLmRvbS5sb2dpY0NvbnRhaW5lci5vdXRlckhlaWdodCghMCkpO3ZhciBPPXRoaXMuZG9tLmxvZ2ljQ29udGFpbmVyLm9mZnNldCgpLGY9Ty5sZWZ0LFU9dGhpcy5kb20uY29udGFpbmVyLm9mZnNldCgpLmxlZnQsWD1mLVUsUT1mLVgtdGhpcy5kb20ubG9naWNDb250YWluZXIub3V0ZXJIZWlnaHQoITApO3RoaXMuZG9tLmxvZ2ljQ29udGFpbmVyLm9mZnNldCh7bGVmdDpRfSk7dmFyIEU9dGhpcy5kb20ubG9naWNDb250YWluZXIubmV4dCgpLCQ9Ty50b3Asdz1vKEUpLm9mZnNldCgpLnRvcCxrPSQtdyxTPSQtazt0aGlzLmRvbS5sb2dpY0NvbnRhaW5lci5vZmZzZXQoe3RvcDpTfSksdGhpcy5kb20uY2xlYXIub3V0ZXJIZWlnaHQodGhpcy5kb20ubG9naWNDb250YWluZXIuaGVpZ2h0KCkpLHRoaXMuX3NldENsZWFyTGlzdGVuZXIoKX0sYy5wcm90b3R5cGUuc2V0TGlzdGVuZXJzPWZ1bmN0aW9uKCl7dmFyIGw9dGhpczt0aGlzLmRvbS5hZGQudW5iaW5kKCJjbGljayIpLHRoaXMuZG9tLmFkZC5vbigiY2xpY2suZHRzYiIsZnVuY3Rpb24oKXtyZXR1cm4gbC5zLmlzQ2hpbGR8fGwuZG9tLmNvbnRhaW5lci5wcmVwZW5kKGwuZG9tLmxvZ2ljQ29udGFpbmVyKSxsLmFkZENyaXRlcmlhKCksbC5kb20uY29udGFpbmVyLnRyaWdnZXIoImR0c2ItYWRkIiksbC5zLmR0LnN0YXRlLnNhdmUoKSwhMX0pLHRoaXMuZG9tLnNlYXJjaC5vZmYoImNsaWNrLmR0c2IiKS5vbigiY2xpY2suZHRzYiIsZnVuY3Rpb24oKXtsLnMuZHQuZHJhdygpfSk7Zm9yKHZhciBoPTAsXz10aGlzLnMuY3JpdGVyaWE7aDxfLmxlbmd0aDtoKyspe3ZhciBGPV9baF07Ri5jcml0ZXJpYS5zZXRMaXN0ZW5lcnMoKX10aGlzLl9zZXRDbGVhckxpc3RlbmVyKCksdGhpcy5fc2V0TG9naWNMaXN0ZW5lcigpfSxjLnByb3RvdHlwZS5hZGRDcml0ZXJpYT1mdW5jdGlvbihsKXtsPT09dm9pZCAwJiYobD1udWxsKTt2YXIgaD1sPT09bnVsbD90aGlzLnMuY3JpdGVyaWEubGVuZ3RoOmwucy5pbmRleCxfPW5ldyBpKHRoaXMucy5kdCx0aGlzLnMub3B0cyx0aGlzLnMudG9wR3JvdXAsaCx0aGlzLnMuZGVwdGgsdGhpcy5zLnNlcnZlckRhdGEsdGhpcy5jLmxpdmVTZWFyY2gpO2whPT1udWxsJiYoXy5jPWwuYyxfLnM9bC5zLF8ucy5kZXB0aD10aGlzLnMuZGVwdGgsXy5jbGFzc2VzPWwuY2xhc3NlcyksXy5wb3B1bGF0ZSgpO2Zvcih2YXIgRj0hMSxPPTA7Tzx0aGlzLnMuY3JpdGVyaWEubGVuZ3RoO08rKylPPT09MCYmdGhpcy5zLmNyaXRlcmlhW09dLmNyaXRlcmlhLnMuaW5kZXg+Xy5zLmluZGV4PyhfLmdldE5vZGUoKS5pbnNlcnRCZWZvcmUodGhpcy5zLmNyaXRlcmlhW09dLmNyaXRlcmlhLmRvbS5jb250YWluZXIpLEY9ITApOk88dGhpcy5zLmNyaXRlcmlhLmxlbmd0aC0xJiZ0aGlzLnMuY3JpdGVyaWFbT10uY3JpdGVyaWEucy5pbmRleDxfLnMuaW5kZXgmJnRoaXMucy5jcml0ZXJpYVtPKzFdLmNyaXRlcmlhLnMuaW5kZXg+Xy5zLmluZGV4JiYoXy5nZXROb2RlKCkuaW5zZXJ0QWZ0ZXIodGhpcy5zLmNyaXRlcmlhW09dLmNyaXRlcmlhLmRvbS5jb250YWluZXIpLEY9ITApO0Z8fF8uZ2V0Tm9kZSgpLmluc2VydEJlZm9yZSh0aGlzLmRvbS5hZGQpLHRoaXMucy5jcml0ZXJpYS5wdXNoKHtjcml0ZXJpYTpfLGluZGV4Omh9KSx0aGlzLnMuY3JpdGVyaWE9dGhpcy5zLmNyaXRlcmlhLnNvcnQoZnVuY3Rpb24oUSxFKXtyZXR1cm4gUS5jcml0ZXJpYS5zLmluZGV4LUUuY3JpdGVyaWEucy5pbmRleH0pO2Zvcih2YXIgZj0wLFU9dGhpcy5zLmNyaXRlcmlhO2Y8VS5sZW5ndGg7ZisrKXt2YXIgWD1VW2ZdO1guY3JpdGVyaWEgaW5zdGFuY2VvZiBpJiZYLmNyaXRlcmlhLnVwZGF0ZUFycm93cyh0aGlzLnMuY3JpdGVyaWEubGVuZ3RoPjEpfXRoaXMuX3NldENyaXRlcmlhTGlzdGVuZXJzKF8pLF8uc2V0TGlzdGVuZXJzKCksdGhpcy5zZXR1cExvZ2ljKCl9LGMucHJvdG90eXBlLmNoZWNrRmlsbGVkPWZ1bmN0aW9uKCl7Zm9yKHZhciBsPTAsaD10aGlzLnMuY3JpdGVyaWE7bDxoLmxlbmd0aDtsKyspe3ZhciBfPWhbbF07aWYoXy5jcml0ZXJpYSBpbnN0YW5jZW9mIGkmJl8uY3JpdGVyaWEucy5maWxsZWR8fF8uY3JpdGVyaWEgaW5zdGFuY2VvZiBjJiZfLmNyaXRlcmlhLmNoZWNrRmlsbGVkKCkpcmV0dXJuITB9cmV0dXJuITF9LGMucHJvdG90eXBlLmNvdW50PWZ1bmN0aW9uKCl7Zm9yKHZhciBsPTAsaD0wLF89dGhpcy5zLmNyaXRlcmlhO2g8Xy5sZW5ndGg7aCsrKXt2YXIgRj1fW2hdO0YuY3JpdGVyaWEgaW5zdGFuY2VvZiBjP2wrPUYuY3JpdGVyaWEuY291bnQoKTpsKyt9cmV0dXJuIGx9LGMucHJvdG90eXBlLl9hZGRQcmV2R3JvdXA9ZnVuY3Rpb24obCl7dmFyIGg9dGhpcy5zLmNyaXRlcmlhLmxlbmd0aCxfPW5ldyBjKHRoaXMucy5kdCx0aGlzLmMsdGhpcy5zLnRvcEdyb3VwLGgsITAsdGhpcy5zLmRlcHRoKzEsdGhpcy5zLnNlcnZlckRhdGEpO3RoaXMucy5jcml0ZXJpYS5wdXNoKHtjcml0ZXJpYTpfLGluZGV4OmgsbG9naWM6Xy5zLmxvZ2ljfSksXy5yZWJ1aWxkKGwpLHRoaXMucy5jcml0ZXJpYVtoXS5jcml0ZXJpYT1fLHRoaXMucy50b3BHcm91cC50cmlnZ2VyKCJkdHNiLXJlZHJhd0NvbnRlbnRzIiksdGhpcy5fc2V0R3JvdXBMaXN0ZW5lcnMoXyl9LGMucHJvdG90eXBlLl9hZGRQcmV2Q3JpdGVyaWE9ZnVuY3Rpb24obCl7dmFyIGg9dGhpcy5zLmNyaXRlcmlhLmxlbmd0aCxfPW5ldyBpKHRoaXMucy5kdCx0aGlzLnMub3B0cyx0aGlzLnMudG9wR3JvdXAsaCx0aGlzLnMuZGVwdGgsdGhpcy5zLnNlcnZlckRhdGEpO18ucG9wdWxhdGUoKSx0aGlzLnMuY3JpdGVyaWEucHVzaCh7Y3JpdGVyaWE6XyxpbmRleDpofSksXy5zLnByZXZlbnRSZWRyYXc9dGhpcy5zLnByZXZlbnRSZWRyYXcsXy5yZWJ1aWxkKGwpLF8ucy5wcmV2ZW50UmVkcmF3PSExLHRoaXMucy5jcml0ZXJpYVtoXS5jcml0ZXJpYT1fLHRoaXMucy5wcmV2ZW50UmVkcmF3fHx0aGlzLnMudG9wR3JvdXAudHJpZ2dlcigiZHRzYi1yZWRyYXdDb250ZW50cyIpfSxjLnByb3RvdHlwZS5fYW5kU2VhcmNoPWZ1bmN0aW9uKGwsaCl7aWYodGhpcy5zLmNyaXRlcmlhLmxlbmd0aD09PTApcmV0dXJuITA7Zm9yKHZhciBfPTAsRj10aGlzLnMuY3JpdGVyaWE7XzxGLmxlbmd0aDtfKyspe3ZhciBPPUZbX107aWYoIShPLmNyaXRlcmlhIGluc3RhbmNlb2YgaSYmIU8uY3JpdGVyaWEucy5maWxsZWQpJiYhTy5jcml0ZXJpYS5zZWFyY2gobCxoKSlyZXR1cm4hMX1yZXR1cm4hMH0sYy5wcm90b3R5cGUuX29yU2VhcmNoPWZ1bmN0aW9uKGwsaCl7aWYodGhpcy5zLmNyaXRlcmlhLmxlbmd0aD09PTApcmV0dXJuITA7Zm9yKHZhciBfPSExLEY9MCxPPXRoaXMucy5jcml0ZXJpYTtGPE8ubGVuZ3RoO0YrKyl7dmFyIGY9T1tGXTtpZihmLmNyaXRlcmlhIGluc3RhbmNlb2YgaSYmZi5jcml0ZXJpYS5zLmZpbGxlZCl7aWYoXz0hMCxmLmNyaXRlcmlhLnNlYXJjaChsLGgpKXJldHVybiEwfWVsc2UgaWYoZi5jcml0ZXJpYSBpbnN0YW5jZW9mIGMmJmYuY3JpdGVyaWEuY2hlY2tGaWxsZWQoKSYmKF89ITAsZi5jcml0ZXJpYS5zZWFyY2gobCxoKSkpcmV0dXJuITB9cmV0dXJuIV99LGMucHJvdG90eXBlLl9yZW1vdmVDcml0ZXJpYT1mdW5jdGlvbihsLGgpe2g9PT12b2lkIDAmJihoPSExKTt2YXIgXztpZih0aGlzLnMuY3JpdGVyaWEubGVuZ3RoPD0xJiZ0aGlzLnMuaXNDaGlsZCl0aGlzLmRlc3Ryb3koKTtlbHNle3ZhciBGPXZvaWQgMDtmb3IoXz0wO188dGhpcy5zLmNyaXRlcmlhLmxlbmd0aDtfKyspdGhpcy5zLmNyaXRlcmlhW19dLmluZGV4PT09bC5zLmluZGV4JiYoIWh8fHRoaXMucy5jcml0ZXJpYVtfXS5jcml0ZXJpYSBpbnN0YW5jZW9mIGMpJiYoRj1fKTtmb3IoRiE9PXZvaWQgMCYmdGhpcy5zLmNyaXRlcmlhLnNwbGljZShGLDEpLF89MDtfPHRoaXMucy5jcml0ZXJpYS5sZW5ndGg7XysrKXRoaXMucy5jcml0ZXJpYVtfXS5pbmRleD1fLHRoaXMucy5jcml0ZXJpYVtfXS5jcml0ZXJpYS5zLmluZGV4PV99fSxjLnByb3RvdHlwZS5fc2V0Q3JpdGVyaWFMaXN0ZW5lcnM9ZnVuY3Rpb24obCl7dmFyIGg9dGhpcztsLmRvbS5kZWxldGUudW5iaW5kKCJjbGljayIpLm9uKCJjbGljay5kdHNiIixmdW5jdGlvbigpe2guX3JlbW92ZUNyaXRlcmlhKGwpLGwuZG9tLmNvbnRhaW5lci5yZW1vdmUoKTtmb3IodmFyIF89MCxGPWgucy5jcml0ZXJpYTtfPEYubGVuZ3RoO18rKyl7dmFyIE89RltfXTtPLmNyaXRlcmlhIGluc3RhbmNlb2YgaSYmTy5jcml0ZXJpYS51cGRhdGVBcnJvd3MoaC5zLmNyaXRlcmlhLmxlbmd0aD4xKX1yZXR1cm4gbC5kZXN0cm95KCksaC5zLmR0LmRyYXcoKSxoLnMudG9wR3JvdXAudHJpZ2dlcigiZHRzYi1yZWRyYXdDb250ZW50cyIpLCExfSksbC5kb20ucmlnaHQudW5iaW5kKCJjbGljayIpLm9uKCJjbGljay5kdHNiIixmdW5jdGlvbigpe3ZhciBfPWwucy5pbmRleCxGPW5ldyBjKGgucy5kdCxoLnMub3B0cyxoLnMudG9wR3JvdXAsbC5zLmluZGV4LCEwLGgucy5kZXB0aCsxLGgucy5zZXJ2ZXJEYXRhKTtyZXR1cm4gRi5hZGRDcml0ZXJpYShsKSxoLnMuY3JpdGVyaWFbX10uY3JpdGVyaWE9RixoLnMuY3JpdGVyaWFbX10ubG9naWM9IkFORCIsaC5zLnRvcEdyb3VwLnRyaWdnZXIoImR0c2ItcmVkcmF3Q29udGVudHMiKSxoLl9zZXRHcm91cExpc3RlbmVycyhGKSwhMX0pLGwuZG9tLmxlZnQudW5iaW5kKCJjbGljayIpLm9uKCJjbGljay5kdHNiIixmdW5jdGlvbigpe2gucy50b0Ryb3A9bmV3IGkoaC5zLmR0LGgucy5vcHRzLGgucy50b3BHcm91cCxsLnMuaW5kZXgsdm9pZCAwLGgucy5zZXJ2ZXJEYXRhKSxoLnMudG9Ecm9wLnM9bC5zLGgucy50b0Ryb3AuYz1sLmMsaC5zLnRvRHJvcC5jbGFzc2VzPWwuY2xhc3NlcyxoLnMudG9Ecm9wLnBvcHVsYXRlKCk7dmFyIF89aC5zLnRvRHJvcC5zLmluZGV4O3JldHVybiBoLmRvbS5jb250YWluZXIudHJpZ2dlcigiZHRzYi1kcm9wQ3JpdGVyaWEiKSxsLnMuaW5kZXg9XyxoLl9yZW1vdmVDcml0ZXJpYShsKSxoLnMudG9wR3JvdXAudHJpZ2dlcigiZHRzYi1yZWRyYXdDb250ZW50cyIpLGgucy5kdC5kcmF3KCksITF9KX0sYy5wcm90b3R5cGUuX3NldENsZWFyTGlzdGVuZXI9ZnVuY3Rpb24oKXt2YXIgbD10aGlzO3RoaXMuZG9tLmNsZWFyLnVuYmluZCgiY2xpY2siKS5vbigiY2xpY2suZHRzYiIsZnVuY3Rpb24oKXtyZXR1cm4gbC5zLmlzQ2hpbGQ/KGwuZGVzdHJveSgpLGwucy50b3BHcm91cC50cmlnZ2VyKCJkdHNiLXJlZHJhd0NvbnRlbnRzIiksITEpOihsLmRvbS5jb250YWluZXIudHJpZ2dlcigiZHRzYi1jbGVhckNvbnRlbnRzIiksITEpfSl9LGMucHJvdG90eXBlLl9zZXRHcm91cExpc3RlbmVycz1mdW5jdGlvbihsKXt2YXIgaD10aGlzO2wuZG9tLmFkZC51bmJpbmQoImNsaWNrIikub24oImNsaWNrLmR0c2IiLGZ1bmN0aW9uKCl7cmV0dXJuIGguc2V0dXBMb2dpYygpLGguZG9tLmNvbnRhaW5lci50cmlnZ2VyKCJkdHNiLWFkZCIpLCExfSksbC5kb20uY29udGFpbmVyLnVuYmluZCgiZHRzYi1hZGQiKS5vbigiZHRzYi1hZGQuZHRzYiIsZnVuY3Rpb24oKXtyZXR1cm4gaC5zZXR1cExvZ2ljKCksaC5kb20uY29udGFpbmVyLnRyaWdnZXIoImR0c2ItYWRkIiksITF9KSxsLmRvbS5jb250YWluZXIudW5iaW5kKCJkdHNiLWRlc3Ryb3kiKS5vbigiZHRzYi1kZXN0cm95LmR0c2IiLGZ1bmN0aW9uKCl7cmV0dXJuIGguX3JlbW92ZUNyaXRlcmlhKGwsITApLGwuZG9tLmNvbnRhaW5lci5yZW1vdmUoKSxoLnNldHVwTG9naWMoKSwhMX0pLGwuZG9tLmNvbnRhaW5lci51bmJpbmQoImR0c2ItZHJvcENyaXRlcmlhIikub24oImR0c2ItZHJvcENyaXRlcmlhLmR0c2IiLGZ1bmN0aW9uKCl7dmFyIF89bC5zLnRvRHJvcDtyZXR1cm4gXy5zLmluZGV4PWwucy5pbmRleCxfLnVwZGF0ZUFycm93cyhoLnMuY3JpdGVyaWEubGVuZ3RoPjEpLGguYWRkQ3JpdGVyaWEoXyksITF9KSxsLnNldExpc3RlbmVycygpfSxjLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXt0aGlzLnNldExpc3RlbmVycygpLHRoaXMuZG9tLmFkZC5odG1sKHRoaXMucy5kdC5pMThuKCJzZWFyY2hCdWlsZGVyLmFkZCIsdGhpcy5jLmkxOG4uYWRkKSksdGhpcy5kb20uc2VhcmNoLmh0bWwodGhpcy5zLmR0LmkxOG4oInNlYXJjaEJ1aWxkZXIuc2VhcmNoIix0aGlzLmMuaTE4bi5zZWFyY2gpKSx0aGlzLmRvbS5sb2dpYy5jaGlsZHJlbigpLmZpcnN0KCkuaHRtbCh0aGlzLmMubG9naWM9PT0iT1IiP3RoaXMucy5kdC5pMThuKCJzZWFyY2hCdWlsZGVyLmxvZ2ljT3IiLHRoaXMuYy5pMThuLmxvZ2ljT3IpOnRoaXMucy5kdC5pMThuKCJzZWFyY2hCdWlsZGVyLmxvZ2ljQW5kIix0aGlzLmMuaTE4bi5sb2dpY0FuZCkpLHRoaXMucy5sb2dpYz10aGlzLmMubG9naWM9PT0iT1IiPyJPUiI6IkFORCIsdGhpcy5jLmdyZXlzY2FsZSYmdGhpcy5kb20ubG9naWMuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmdyZXlzY2FsZSksdGhpcy5kb20ubG9naWNDb250YWluZXIuYXBwZW5kKHRoaXMuZG9tLmxvZ2ljKS5hcHBlbmQodGhpcy5kb20uY2xlYXIpLHRoaXMucy5pc0NoaWxkJiZ0aGlzLmRvbS5jb250YWluZXIuYXBwZW5kKHRoaXMuZG9tLmxvZ2ljQ29udGFpbmVyKSx0aGlzLmRvbS5jb250YWluZXIuYXBwZW5kKHRoaXMuZG9tLmFkZCksdGhpcy5jLmxpdmVTZWFyY2h8fHRoaXMuZG9tLmNvbnRhaW5lci5hcHBlbmQodGhpcy5kb20uc2VhcmNoKX0sYy5wcm90b3R5cGUuX3NldExvZ2ljTGlzdGVuZXI9ZnVuY3Rpb24oKXt2YXIgbD10aGlzO3RoaXMuZG9tLmxvZ2ljLnVuYmluZCgiY2xpY2siKS5vbigiY2xpY2suZHRzYiIsZnVuY3Rpb24oKXtsLl90b2dnbGVMb2dpYygpLGwucy5kdC5kcmF3KCk7Zm9yKHZhciBoPTAsXz1sLnMuY3JpdGVyaWE7aDxfLmxlbmd0aDtoKyspe3ZhciBGPV9baF07Ri5jcml0ZXJpYS5zZXRMaXN0ZW5lcnMoKX19KX0sYy5wcm90b3R5cGUuX3RvZ2dsZUxvZ2ljPWZ1bmN0aW9uKCl7dGhpcy5zLmxvZ2ljPT09Ik9SIj8odGhpcy5zLmxvZ2ljPSJBTkQiLHRoaXMuZG9tLmxvZ2ljLmNoaWxkcmVuKCkuZmlyc3QoKS5odG1sKHRoaXMucy5kdC5pMThuKCJzZWFyY2hCdWlsZGVyLmxvZ2ljQW5kIix0aGlzLmMuaTE4bi5sb2dpY0FuZCkpKTp0aGlzLnMubG9naWM9PT0iQU5EIiYmKHRoaXMucy5sb2dpYz0iT1IiLHRoaXMuZG9tLmxvZ2ljLmNoaWxkcmVuKCkuZmlyc3QoKS5odG1sKHRoaXMucy5kdC5pMThuKCJzZWFyY2hCdWlsZGVyLmxvZ2ljT3IiLHRoaXMuYy5pMThuLmxvZ2ljT3IpKSl9LGMudmVyc2lvbj0iMS4xLjAiLGMuY2xhc3Nlcz17YWRkOiJkdHNiLWFkZCIsYnV0dG9uOiJkdHNiLWJ1dHRvbiIsY2xlYXJHcm91cDoiZHRzYi1jbGVhckdyb3VwIixncmV5c2NhbGU6ImR0c2ItZ3JleXNjYWxlIixncm91cDoiZHRzYi1ncm91cCIsaW5wdXRCdXR0b246ImR0c2ItaXB0YnRuIixsb2dpYzoiZHRzYi1sb2dpYyIsbG9naWNDb250YWluZXI6ImR0c2ItbG9naWNDb250YWluZXIiLHNlYXJjaDoiZHRzYi1zZWFyY2gifSxjLmRlZmF1bHRzPXtjb2x1bW5zOiEwLGNvbmRpdGlvbnM6e2RhdGU6aS5kYXRlQ29uZGl0aW9ucyxodG1sOmkuc3RyaW5nQ29uZGl0aW9ucywiaHRtbC1udW0iOmkubnVtQ29uZGl0aW9ucywiaHRtbC1udW0tZm10IjppLm51bUZtdENvbmRpdGlvbnMsbHV4b246aS5sdXhvbkRhdGVDb25kaXRpb25zLG1vbWVudDppLm1vbWVudERhdGVDb25kaXRpb25zLG51bTppLm51bUNvbmRpdGlvbnMsIm51bS1mbXQiOmkubnVtRm10Q29uZGl0aW9ucyxzdHJpbmc6aS5zdHJpbmdDb25kaXRpb25zfSxkZXB0aExpbWl0OiExLGVudGVyU2VhcmNoOiExLGZpbHRlckNoYW5nZWQ6dm9pZCAwLGdyZXlzY2FsZTohMSxsaXZlU2VhcmNoOiEwLGkxOG46e2FkZDoiQWRkIENvbmRpdGlvbiIsYnV0dG9uOnswOiJTZWFyY2ggQnVpbGRlciIsXzoiU2VhcmNoIEJ1aWxkZXIgKCVkKSJ9LGNsZWFyQWxsOiJDbGVhciBBbGwiLGNvbmRpdGlvbjoiQ29uZGl0aW9uIixkYXRhOiJEYXRhIixkZWxldGU6IiZ0aW1lcyIsZGVsZXRlVGl0bGU6IkRlbGV0ZSBmaWx0ZXJpbmcgcnVsZSIsbGVmdDoiPCIsbGVmdFRpdGxlOiJPdXRkZW50IGNyaXRlcmlhIixsb2dpY0FuZDoiQW5kIixsb2dpY09yOiJPciIscmlnaHQ6Ij4iLHJpZ2h0VGl0bGU6IkluZGVudCBjcml0ZXJpYSIsc2VhcmNoOiJTZWFyY2giLHRpdGxlOnswOiJDdXN0b20gU2VhcmNoIEJ1aWxkZXIiLF86IkN1c3RvbSBTZWFyY2ggQnVpbGRlciAoJWQpIn0sdmFsdWU6IlZhbHVlIix2YWx1ZUpvaW5lcjoiYW5kIn0sbG9naWM6IkFORCIsb3J0aG9nb25hbDp7ZGlzcGxheToiZGlzcGxheSIsc2VhcmNoOiJmaWx0ZXIifSxwcmVEZWZpbmVkOiExfSxjfSgpLGIsZztmdW5jdGlvbiBtKGMpe2I9YyxnPWMuZm4uRGF0YVRhYmxlfXZhciBDPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYyhsLGgpe3ZhciBfPXRoaXM7aWYoIWd8fCFnLnZlcnNpb25DaGVja3x8IWcudmVyc2lvbkNoZWNrKCIyIikpdGhyb3cgbmV3IEVycm9yKCJTZWFyY2hCdWlsZGVyIHJlcXVpcmVzIERhdGFUYWJsZXMgMiBvciBuZXdlciIpO3ZhciBGPW5ldyBnLkFwaShsKTtpZih0aGlzLmNsYXNzZXM9Yi5leHRlbmQoITAse30sYy5jbGFzc2VzKSx0aGlzLmM9Yi5leHRlbmQoITAse30sYy5kZWZhdWx0cyxoKSx0aGlzLmRvbT17Y2xlYXJBbGw6YignPGJ1dHRvbiB0eXBlPSJidXR0b24iPicrRi5pMThuKCJzZWFyY2hCdWlsZGVyLmNsZWFyQWxsIix0aGlzLmMuaTE4bi5jbGVhckFsbCkrIjwvYnV0dG9uPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5jbGVhckFsbCkuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmJ1dHRvbikuYXR0cigidHlwZSIsImJ1dHRvbiIpLGNvbnRhaW5lcjpiKCI8ZGl2Lz4iKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuY29udGFpbmVyKSx0aXRsZTpiKCI8ZGl2Lz4iKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMudGl0bGUpLHRpdGxlUm93OmIoIjxkaXYvPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy50aXRsZVJvdyksdG9wR3JvdXA6dm9pZCAwfSx0aGlzLnM9e2R0OkYsb3B0czpoLHNlYXJjaDp2b2lkIDAsc2VydmVyRGF0YTp2b2lkIDAsdG9wR3JvdXA6dm9pZCAwfSxGLnNldHRpbmdzKClbMF0uX3NlYXJjaEJ1aWxkZXI9PT12b2lkIDApcmV0dXJuIEYuc2V0dGluZ3MoKVswXS5fc2VhcmNoQnVpbGRlcj10aGlzLHRoaXMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlJiYodGhpcy5zLmR0Lm9uKCJwcmVYaHIuZHRzYiIsZnVuY3Rpb24oTyxmLFUpe3ZhciBYPV8ucy5kdC5zdGF0ZS5sb2FkZWQoKTtYJiZYLnNlYXJjaEJ1aWxkZXImJihVLnNlYXJjaEJ1aWxkZXI9Xy5fY29sbGFwc2VBcnJheShYLnNlYXJjaEJ1aWxkZXIpKX0pLHRoaXMucy5kdC5vbigieGhyLmR0c2IiLGZ1bmN0aW9uKE8sZixVKXtVJiZVLnNlYXJjaEJ1aWxkZXImJlUuc2VhcmNoQnVpbGRlci5vcHRpb25zJiYoXy5zLnNlcnZlckRhdGE9VS5zZWFyY2hCdWlsZGVyLm9wdGlvbnMpfSkpLHRoaXMucy5kdC5zZXR0aW5ncygpWzBdLl9iSW5pdENvbXBsZXRlP3RoaXMuX3NldFVwKCk6Ri5vbmUoImluaXQuZHQiLGZ1bmN0aW9uKCl7Xy5fc2V0VXAoKX0pLHRoaXN9cmV0dXJuIGMucHJvdG90eXBlLmdldERldGFpbHM9ZnVuY3Rpb24obCl7cmV0dXJuIGw9PT12b2lkIDAmJihsPSExKSx0aGlzLnMudG9wR3JvdXAuZ2V0RGV0YWlscyhsKX0sYy5wcm90b3R5cGUuZ2V0Tm9kZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbS5jb250YWluZXJ9LGMucHJvdG90eXBlLnJlYnVpbGQ9ZnVuY3Rpb24obCl7cmV0dXJuIHRoaXMuZG9tLmNsZWFyQWxsLmNsaWNrKCksbD09bnVsbD90aGlzOih0aGlzLnMudG9wR3JvdXAucy5wcmV2ZW50UmVkcmF3PSEwLHRoaXMucy50b3BHcm91cC5yZWJ1aWxkKGwpLHRoaXMucy50b3BHcm91cC5zLnByZXZlbnRSZWRyYXc9ITEsdGhpcy5fY2hlY2tDbGVhcigpLHRoaXMuX3VwZGF0ZVRpdGxlKHRoaXMucy50b3BHcm91cC5jb3VudCgpKSx0aGlzLnMudG9wR3JvdXAucmVkcmF3Q29udGVudHMoKSx0aGlzLnMuZHQuZHJhdyghMSksdGhpcy5zLnRvcEdyb3VwLnNldExpc3RlbmVycygpLHRoaXMpfSxjLnByb3RvdHlwZS5fYXBwbHlQcmVEZWZEZWZhdWx0cz1mdW5jdGlvbihsKXt2YXIgaD10aGlzO2wuY3JpdGVyaWEhPT12b2lkIDAmJmwubG9naWM9PT12b2lkIDAmJihsLmxvZ2ljPSJBTkQiKTtmb3IodmFyIF89ZnVuY3Rpb24oWCl7WC5jcml0ZXJpYSE9PXZvaWQgMD9YPUYuX2FwcGx5UHJlRGVmRGVmYXVsdHMoWCk6Ri5zLmR0LmNvbHVtbnMoKS5ldmVyeShmdW5jdGlvbihRKXtoLnMuZHQuc2V0dGluZ3MoKVswXS5hb0NvbHVtbnNbUV0uc1RpdGxlPT09WC5kYXRhJiYoWC5kYXRhSWR4PVEpfSl9LEY9dGhpcyxPPTAsZj1sLmNyaXRlcmlhO088Zi5sZW5ndGg7TysrKXt2YXIgVT1mW09dO18oVSl9cmV0dXJuIGx9LGMucHJvdG90eXBlLl9zZXRVcD1mdW5jdGlvbihsKXt2YXIgaD10aGlzO2lmKGw9PT12b2lkIDAmJihsPSEwKSx0eXBlb2YgdGhpcy5zLmR0LmNvbHVtbigpLnR5cGUhPSJmdW5jdGlvbiImJmF0LkFwaS5yZWdpc3RlclBsdXJhbCgiY29sdW1ucygpLnR5cGVzKCkiLCJjb2x1bW4oKS50eXBlKCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoImNvbHVtbiIsZnVuY3Rpb24odyxrKXtyZXR1cm4gdy5hb0NvbHVtbnNba10uc1R5cGV9LDEpfSksIWcuRGF0ZVRpbWUpe3ZhciBfPXRoaXMucy5kdC5jb2x1bW5zKCkudHlwZXMoKS50b0FycmF5KCk7aWYoXz09PXZvaWQgMHx8Xy5pbmNsdWRlcyh2b2lkIDApfHxfLmluY2x1ZGVzKG51bGwpKXtfPVtdO2Zvcih2YXIgRj0wLE89dGhpcy5zLmR0LnNldHRpbmdzKClbMF0uYW9Db2x1bW5zO0Y8Ty5sZW5ndGg7RisrKXt2YXIgZj1PW0ZdO18ucHVzaChmLnNlYXJjaEJ1aWxkZXJUeXBlIT09dm9pZCAwP2Yuc2VhcmNoQnVpbGRlclR5cGU6Zi5zVHlwZSl9fXZhciBVPXRoaXMucy5kdC5jb2x1bW5zKCkudG9BcnJheSgpOyhfPT09dm9pZCAwfHxfLmluY2x1ZGVzKHZvaWQgMCl8fF8uaW5jbHVkZXMobnVsbCkpJiYoYi5mbi5kYXRhVGFibGUuZXh0Lm9BcGkmJmIuZm4uZGF0YVRhYmxlLmV4dC5vQXBpLl9mbkNvbHVtblR5cGVzKHRoaXMucy5kdC5zZXR0aW5ncygpWzBdKSxfPXRoaXMucy5kdC5jb2x1bW5zKCkudHlwZXMoKS50b0FycmF5KCkpO2Zvcih2YXIgWD0wO1g8VVswXS5sZW5ndGg7WCsrKXt2YXIgUT1VWzBdW1hdLEU9X1tRXTtpZigodGhpcy5jLmNvbHVtbnM9PT0hMHx8QXJyYXkuaXNBcnJheSh0aGlzLmMuY29sdW1ucykmJnRoaXMuYy5jb2x1bW5zLmluY2x1ZGVzKFgpKSYmKEUuaW5jbHVkZXMoImRhdGUiKXx8RS5pbmNsdWRlcygibW9tZW50Iil8fEUuaW5jbHVkZXMoImx1eG9uIikpKXRocm93IGFsZXJ0KCJTZWFyY2hCdWlsZGVyIFJlcXVpcmVzIERhdGVUaW1lIHdoZW4gdXNlZCB3aXRoIGRhdGVzLiIpLG5ldyBFcnJvcigiU2VhcmNoQnVpbGRlciByZXF1aXJlcyBEYXRlVGltZSIpfX1pZih0aGlzLnMudG9wR3JvdXA9bmV3IHAodGhpcy5zLmR0LHRoaXMuYyx2b2lkIDAsdm9pZCAwLHZvaWQgMCx2b2lkIDAsdGhpcy5zLnNlcnZlckRhdGEpLHRoaXMuX3NldENsZWFyTGlzdGVuZXIoKSx0aGlzLnMuZHQub24oInN0YXRlU2F2ZVBhcmFtcy5kdHNiIixmdW5jdGlvbih3LGssUyl7Uy5zZWFyY2hCdWlsZGVyPWguZ2V0RGV0YWlscygpLFMuc2Nyb2xsZXI/Uy5zdGFydD1oLnMuZHQuc3RhdGUoKS5zdGFydDpTLnBhZ2U9aC5zLmR0LnBhZ2UoKX0pLHRoaXMucy5kdC5vbigic3RhdGVMb2FkUGFyYW1zLmR0c2IiLGZ1bmN0aW9uKHcsayxTKXtoLnJlYnVpbGQoUy5zZWFyY2hCdWlsZGVyKX0pLHRoaXMuX2J1aWxkKCksdGhpcy5zLmR0Lm9uKCJwcmVYaHIuZHRzYiIsZnVuY3Rpb24odyxrLFMpe2gucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlJiYoUy5zZWFyY2hCdWlsZGVyPWguX2NvbGxhcHNlQXJyYXkoaC5nZXREZXRhaWxzKCEwKSkpfSksdGhpcy5zLmR0Lm9uKCJjb2x1bW5zLXJlb3JkZXJlZCIsZnVuY3Rpb24oKXtoLnJlYnVpbGQoaC5nZXREZXRhaWxzKCkpfSksbCl7dmFyICQ9dGhpcy5zLmR0LnN0YXRlLmxvYWRlZCgpOyQhPT1udWxsJiYkLnNlYXJjaEJ1aWxkZXIhPT12b2lkIDA/KHRoaXMucy50b3BHcm91cC5yZWJ1aWxkKCQuc2VhcmNoQnVpbGRlciksdGhpcy5zLnRvcEdyb3VwLmRvbS5jb250YWluZXIudHJpZ2dlcigiZHRzYi1yZWRyYXdDb250ZW50cyIpLHRoaXMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlfHwoJC5wYWdlP3RoaXMucy5kdC5wYWdlKCQucGFnZSkuZHJhdygicGFnZSIpOnRoaXMucy5kdC5zY3JvbGxlciYmJC5zY3JvbGxlciYmdGhpcy5zLmR0LnNjcm9sbGVyKCkuc2Nyb2xsVG9Sb3coJC5zY3JvbGxlci50b3BSb3cpKSx0aGlzLnMudG9wR3JvdXAuc2V0TGlzdGVuZXJzKCkpOnRoaXMuYy5wcmVEZWZpbmVkIT09ITEmJih0aGlzLmMucHJlRGVmaW5lZD10aGlzLl9hcHBseVByZURlZkRlZmF1bHRzKHRoaXMuYy5wcmVEZWZpbmVkKSx0aGlzLnJlYnVpbGQodGhpcy5jLnByZURlZmluZWQpKX10aGlzLl9zZXRFbXB0eUxpc3RlbmVyKCksdGhpcy5zLmR0LnN0YXRlLnNhdmUoKX0sYy5wcm90b3R5cGUuX2NvbGxhcHNlQXJyYXk9ZnVuY3Rpb24obCl7aWYobC5sb2dpYz09PXZvaWQgMClsLnZhbHVlIT09dm9pZCAwJiYobC52YWx1ZS5zb3J0KGZ1bmN0aW9uKF8sRil7cmV0dXJuIGlzTmFOKCtfKXx8KF89K18sRj0rRiksXzxGPy0xOkY8Xz8xOjB9KSxsLnZhbHVlMT1sLnZhbHVlWzBdLGwudmFsdWUyPWwudmFsdWVbMV0pO2Vsc2UgZm9yKHZhciBoPTA7aDxsLmNyaXRlcmlhLmxlbmd0aDtoKyspbC5jcml0ZXJpYVtoXT10aGlzLl9jb2xsYXBzZUFycmF5KGwuY3JpdGVyaWFbaF0pO3JldHVybiBsfSxjLnByb3RvdHlwZS5fdXBkYXRlVGl0bGU9ZnVuY3Rpb24obCl7dGhpcy5kb20udGl0bGUuaHRtbCh0aGlzLnMuZHQuaTE4bigic2VhcmNoQnVpbGRlci50aXRsZSIsdGhpcy5jLmkxOG4udGl0bGUsbCkpfSxjLnByb3RvdHlwZS5fYnVpbGQ9ZnVuY3Rpb24oKXt2YXIgbD10aGlzO3RoaXMuZG9tLmNsZWFyQWxsLnJlbW92ZSgpLHRoaXMuZG9tLmNvbnRhaW5lci5lbXB0eSgpO3ZhciBoPXRoaXMucy50b3BHcm91cC5jb3VudCgpO3RoaXMuX3VwZGF0ZVRpdGxlKGgpLHRoaXMuZG9tLnRpdGxlUm93LmFwcGVuZCh0aGlzLmRvbS50aXRsZSksdGhpcy5kb20uY29udGFpbmVyLmFwcGVuZCh0aGlzLmRvbS50aXRsZVJvdyksdGhpcy5kb20udG9wR3JvdXA9dGhpcy5zLnRvcEdyb3VwLmdldE5vZGUoKSx0aGlzLmRvbS5jb250YWluZXIuYXBwZW5kKHRoaXMuZG9tLnRvcEdyb3VwKSx0aGlzLl9zZXRSZWRyYXdMaXN0ZW5lcigpO3ZhciBfPXRoaXMucy5kdC50YWJsZSgwKS5ub2RlKCk7Yi5mbi5kYXRhVGFibGUuZXh0LnNlYXJjaC5pbmNsdWRlcyh0aGlzLnMuc2VhcmNoKXx8KHRoaXMucy5zZWFyY2g9ZnVuY3Rpb24oRixPLGYpe3JldHVybiBGLm5UYWJsZSE9PV8/ITA6bC5zLnRvcEdyb3VwLnNlYXJjaChPLGYpfSxiLmZuLmRhdGFUYWJsZS5leHQuc2VhcmNoLnB1c2godGhpcy5zLnNlYXJjaCkpLHRoaXMucy5kdC5vbigiZGVzdHJveS5kdHNiIixmdW5jdGlvbigpe2wuZG9tLmNvbnRhaW5lci5yZW1vdmUoKSxsLmRvbS5jbGVhckFsbC5yZW1vdmUoKTtmb3IodmFyIEY9Yi5mbi5kYXRhVGFibGUuZXh0LnNlYXJjaC5pbmRleE9mKGwucy5zZWFyY2gpO0YhPT0tMTspYi5mbi5kYXRhVGFibGUuZXh0LnNlYXJjaC5zcGxpY2UoRiwxKSxGPWIuZm4uZGF0YVRhYmxlLmV4dC5zZWFyY2guaW5kZXhPZihsLnMuc2VhcmNoKTtsLnMuZHQub2ZmKCIuZHRzYiIpLGIobC5zLmR0LnRhYmxlKCkubm9kZSgpKS5vZmYoIi5kdHNiIil9KX0sYy5wcm90b3R5cGUuX2NoZWNrQ2xlYXI9ZnVuY3Rpb24oKXt0aGlzLnMudG9wR3JvdXAucy5jcml0ZXJpYS5sZW5ndGg+MD8odGhpcy5kb20uY2xlYXJBbGwuaW5zZXJ0QWZ0ZXIodGhpcy5kb20udGl0bGUpLHRoaXMuX3NldENsZWFyTGlzdGVuZXIoKSk6dGhpcy5kb20uY2xlYXJBbGwucmVtb3ZlKCl9LGMucHJvdG90eXBlLl9maWx0ZXJDaGFuZ2VkPWZ1bmN0aW9uKGwpe3ZhciBoPXRoaXMuYy5maWx0ZXJDaGFuZ2VkO3R5cGVvZiBoPT0iZnVuY3Rpb24iJiZoKGwsdGhpcy5zLmR0LmkxOG4oInNlYXJjaEJ1aWxkZXIuYnV0dG9uIix0aGlzLmMuaTE4bi5idXR0b24sbCkpfSxjLnByb3RvdHlwZS5fc2V0Q2xlYXJMaXN0ZW5lcj1mdW5jdGlvbigpe3ZhciBsPXRoaXM7dGhpcy5kb20uY2xlYXJBbGwudW5iaW5kKCJjbGljayIpLHRoaXMuZG9tLmNsZWFyQWxsLm9uKCJjbGljay5kdHNiIixmdW5jdGlvbigpe3JldHVybiBsLnMudG9wR3JvdXA9bmV3IHAobC5zLmR0LGwuYyx2b2lkIDAsdm9pZCAwLHZvaWQgMCx2b2lkIDAsbC5zLnNlcnZlckRhdGEpLGwuX2J1aWxkKCksbC5zLmR0LmRyYXcoKSxsLnMudG9wR3JvdXAuc2V0TGlzdGVuZXJzKCksbC5kb20uY2xlYXJBbGwucmVtb3ZlKCksbC5fc2V0RW1wdHlMaXN0ZW5lcigpLGwuX2ZpbHRlckNoYW5nZWQoMCksITF9KX0sYy5wcm90b3R5cGUuX3NldFJlZHJhd0xpc3RlbmVyPWZ1bmN0aW9uKCl7dmFyIGw9dGhpczt0aGlzLnMudG9wR3JvdXAuZG9tLmNvbnRhaW5lci51bmJpbmQoImR0c2ItcmVkcmF3Q29udGVudHMiKSx0aGlzLnMudG9wR3JvdXAuZG9tLmNvbnRhaW5lci5vbigiZHRzYi1yZWRyYXdDb250ZW50cy5kdHNiIixmdW5jdGlvbigpe2wuX2NoZWNrQ2xlYXIoKSxsLnMudG9wR3JvdXAucmVkcmF3Q29udGVudHMoKSxsLnMudG9wR3JvdXAuc2V0dXBMb2dpYygpLGwuX3NldEVtcHR5TGlzdGVuZXIoKTt2YXIgaD1sLnMudG9wR3JvdXAuY291bnQoKTtsLl91cGRhdGVUaXRsZShoKSxsLl9maWx0ZXJDaGFuZ2VkKGgpLGwucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlfHxsLnMuZHQuZHJhdygpLGwucy5kdC5zdGF0ZS5zYXZlKCl9KSx0aGlzLnMudG9wR3JvdXAuZG9tLmNvbnRhaW5lci51bmJpbmQoImR0c2ItcmVkcmF3Q29udGVudHMtbm9EcmF3IiksdGhpcy5zLnRvcEdyb3VwLmRvbS5jb250YWluZXIub24oImR0c2ItcmVkcmF3Q29udGVudHMtbm9EcmF3LmR0c2IiLGZ1bmN0aW9uKCl7bC5fY2hlY2tDbGVhcigpLGwucy50b3BHcm91cC5zLnByZXZlbnRSZWRyYXc9ITAsbC5zLnRvcEdyb3VwLnJlZHJhd0NvbnRlbnRzKCksbC5zLnRvcEdyb3VwLnMucHJldmVudFJlZHJhdz0hMSxsLnMudG9wR3JvdXAuc2V0dXBMb2dpYygpLGwuX3NldEVtcHR5TGlzdGVuZXIoKTt2YXIgaD1sLnMudG9wR3JvdXAuY291bnQoKTtsLl91cGRhdGVUaXRsZShoKSxsLl9maWx0ZXJDaGFuZ2VkKGgpfSksdGhpcy5zLnRvcEdyb3VwLmRvbS5jb250YWluZXIudW5iaW5kKCJkdHNiLXJlZHJhd0xvZ2ljIiksdGhpcy5zLnRvcEdyb3VwLmRvbS5jb250YWluZXIub24oImR0c2ItcmVkcmF3TG9naWMuZHRzYiIsZnVuY3Rpb24oKXtsLnMudG9wR3JvdXAucmVkcmF3TG9naWMoKTt2YXIgaD1sLnMudG9wR3JvdXAuY291bnQoKTtsLl91cGRhdGVUaXRsZShoKSxsLl9maWx0ZXJDaGFuZ2VkKGgpfSksdGhpcy5zLnRvcEdyb3VwLmRvbS5jb250YWluZXIudW5iaW5kKCJkdHNiLWFkZCIpLHRoaXMucy50b3BHcm91cC5kb20uY29udGFpbmVyLm9uKCJkdHNiLWFkZC5kdHNiIixmdW5jdGlvbigpe3ZhciBoPWwucy50b3BHcm91cC5jb3VudCgpO2wuX3VwZGF0ZVRpdGxlKGgpLGwuX2ZpbHRlckNoYW5nZWQoaCksbC5fY2hlY2tDbGVhcigpfSksdGhpcy5zLmR0Lm9uKCJwb3N0RWRpdC5kdHNiIHBvc3RDcmVhdGUuZHRzYiBwb3N0UmVtb3ZlLmR0c2IiLGZ1bmN0aW9uKCl7bC5zLnRvcEdyb3VwLnJlZHJhd0NvbnRlbnRzKCl9KSx0aGlzLnMudG9wR3JvdXAuZG9tLmNvbnRhaW5lci51bmJpbmQoImR0c2ItY2xlYXJDb250ZW50cyIpLHRoaXMucy50b3BHcm91cC5kb20uY29udGFpbmVyLm9uKCJkdHNiLWNsZWFyQ29udGVudHMuZHRzYiIsZnVuY3Rpb24oKXtsLl9zZXRVcCghMSksbC5fZmlsdGVyQ2hhbmdlZCgwKSxsLnMuZHQuZHJhdygpfSl9LGMucHJvdG90eXBlLl9zZXRFbXB0eUxpc3RlbmVyPWZ1bmN0aW9uKCl7dmFyIGw9dGhpczt0aGlzLnMudG9wR3JvdXAuZG9tLmFkZC5vbigiY2xpY2suZHRzYiIsZnVuY3Rpb24oKXtsLl9jaGVja0NsZWFyKCl9KSx0aGlzLnMudG9wR3JvdXAuZG9tLmNvbnRhaW5lci5vbigiZHRzYi1kZXN0cm95LmR0c2IiLGZ1bmN0aW9uKCl7bC5kb20uY2xlYXJBbGwucmVtb3ZlKCl9KX0sYy52ZXJzaW9uPSIxLjguMCIsYy5jbGFzc2VzPXtidXR0b246ImR0c2ItYnV0dG9uIixjbGVhckFsbDoiZHRzYi1jbGVhckFsbCIsY29udGFpbmVyOiJkdHNiLXNlYXJjaEJ1aWxkZXIiLGlucHV0QnV0dG9uOiJkdHNiLWlwdGJ0biIsdGl0bGU6ImR0c2ItdGl0bGUiLHRpdGxlUm93OiJkdHNiLXRpdGxlUm93In0sYy5kZWZhdWx0cz17Y29sdW1uczohMCxjb25kaXRpb25zOntkYXRlOmkuZGF0ZUNvbmRpdGlvbnMsaHRtbDppLnN0cmluZ0NvbmRpdGlvbnMsImh0bWwtbnVtIjppLm51bUNvbmRpdGlvbnMsImh0bWwtbnVtLWZtdCI6aS5udW1GbXRDb25kaXRpb25zLGx1eG9uOmkubHV4b25EYXRlQ29uZGl0aW9ucyxtb21lbnQ6aS5tb21lbnREYXRlQ29uZGl0aW9ucyxudW06aS5udW1Db25kaXRpb25zLCJudW0tZm10IjppLm51bUZtdENvbmRpdGlvbnMsc3RyaW5nOmkuc3RyaW5nQ29uZGl0aW9uc30sZGVwdGhMaW1pdDohMSxlbnRlclNlYXJjaDohMSxmaWx0ZXJDaGFuZ2VkOnZvaWQgMCxncmV5c2NhbGU6ITEsbGl2ZVNlYXJjaDohMCxpMThuOnthZGQ6IkFkZCBDb25kaXRpb24iLGJ1dHRvbjp7MDoiU2VhcmNoIEJ1aWxkZXIiLF86IlNlYXJjaCBCdWlsZGVyICglZCkifSxjbGVhckFsbDoiQ2xlYXIgQWxsIixjb25kaXRpb246IkNvbmRpdGlvbiIsY29uZGl0aW9uczp7YXJyYXk6e2NvbnRhaW5zOiJDb250YWlucyIsZW1wdHk6IkVtcHR5IixlcXVhbHM6IkVxdWFscyIsbm90OiJOb3QiLG5vdEVtcHR5OiJOb3QgRW1wdHkiLHdpdGhvdXQ6IldpdGhvdXQifSxkYXRlOnthZnRlcjoiQWZ0ZXIiLGJlZm9yZToiQmVmb3JlIixiZXR3ZWVuOiJCZXR3ZWVuIixlbXB0eToiRW1wdHkiLGVxdWFsczoiRXF1YWxzIixub3Q6Ik5vdCIsbm90QmV0d2VlbjoiTm90IEJldHdlZW4iLG5vdEVtcHR5OiJOb3QgRW1wdHkifSxudW1iZXI6e2JldHdlZW46IkJldHdlZW4iLGVtcHR5OiJFbXB0eSIsZXF1YWxzOiJFcXVhbHMiLGd0OiJHcmVhdGVyIFRoYW4iLGd0ZToiR3JlYXRlciBUaGFuIEVxdWFsIFRvIixsdDoiTGVzcyBUaGFuIixsdGU6Ikxlc3MgVGhhbiBFcXVhbCBUbyIsbm90OiJOb3QiLG5vdEJldHdlZW46Ik5vdCBCZXR3ZWVuIixub3RFbXB0eToiTm90IEVtcHR5In0sc3RyaW5nOntjb250YWluczoiQ29udGFpbnMiLGVtcHR5OiJFbXB0eSIsZW5kc1dpdGg6IkVuZHMgV2l0aCIsZXF1YWxzOiJFcXVhbHMiLG5vdDoiTm90Iixub3RDb250YWluczoiRG9lcyBOb3QgQ29udGFpbiIsbm90RW1wdHk6Ik5vdCBFbXB0eSIsbm90RW5kc1dpdGg6IkRvZXMgTm90IEVuZCBXaXRoIixub3RTdGFydHNXaXRoOiJEb2VzIE5vdCBTdGFydCBXaXRoIixzdGFydHNXaXRoOiJTdGFydHMgV2l0aCJ9fSxkYXRhOiJEYXRhIixkZWxldGU6IiZ0aW1lcyIsZGVsZXRlVGl0bGU6IkRlbGV0ZSBmaWx0ZXJpbmcgcnVsZSIsbGVmdDoiPCIsbGVmdFRpdGxlOiJPdXRkZW50IGNyaXRlcmlhIixsb2dpY0FuZDoiQW5kIixsb2dpY09yOiJPciIscmlnaHQ6Ij4iLHJpZ2h0VGl0bGU6IkluZGVudCBjcml0ZXJpYSIsc2VhcmNoOiJTZWFyY2giLHRpdGxlOnswOiJDdXN0b20gU2VhcmNoIEJ1aWxkZXIiLF86IkN1c3RvbSBTZWFyY2ggQnVpbGRlciAoJWQpIn0sdmFsdWU6IlZhbHVlIix2YWx1ZUpvaW5lcjoiYW5kIn0sbG9naWM6IkFORCIsb3J0aG9nb25hbDp7ZGlzcGxheToiZGlzcGxheSIsc2VhcmNoOiJmaWx0ZXIifSxwcmVEZWZpbmVkOiExfSxjfSgpO20oY24pLHUoY24pLHMoY24pO3ZhciB5PWNuLmZuLmRhdGFUYWJsZTthdC5TZWFyY2hCdWlsZGVyPUMseS5TZWFyY2hCdWlsZGVyPUMsYXQuR3JvdXA9cCx5Lkdyb3VwPXAsYXQuQ3JpdGVyaWE9aSx5LkNyaXRlcmlhPWk7dmFyIFQ9YXQuQXBpLnJlZ2lzdGVyO2F0LmV4dC5zZWFyY2hCdWlsZGVyPXtjb25kaXRpb25zOnt9fSxhdC5leHQuYnV0dG9ucy5zZWFyY2hCdWlsZGVyPXthY3Rpb246ZnVuY3Rpb24oYyxsLGgsXyl7dGhpcy5wb3BvdmVyKF8uX3NlYXJjaEJ1aWxkZXIuZ2V0Tm9kZSgpLHthbGlnbjoiY29udGFpbmVyIixzcGFuOiJjb250YWluZXIifSk7dmFyIEY9Xy5fc2VhcmNoQnVpbGRlci5zLnRvcEdyb3VwO0YhPT12b2lkIDAmJkYuZG9tLmNvbnRhaW5lci50cmlnZ2VyKCJkdHNiLXJlZHJhd0NvbnRlbnRzLW5vRHJhdyIpLEYucy5jcml0ZXJpYS5sZW5ndGg9PT0wJiZjbigiLiIrY24uZm4uZGF0YVRhYmxlLkdyb3VwLmNsYXNzZXMuYWRkLnJlcGxhY2UoLyAvZywiLiIpKS5jbGljaygpfSxjb25maWc6e30saW5pdDpmdW5jdGlvbihjLGwsaCl7dmFyIF89bmV3IGF0LlNlYXJjaEJ1aWxkZXIoYyxjbi5leHRlbmQoe2ZpbHRlckNoYW5nZWQ6ZnVuY3Rpb24oRixPKXtjLmJ1dHRvbihsKS50ZXh0KE8pfX0saC5jb25maWcpKTtjLmJ1dHRvbihsKS50ZXh0KGgudGV4dHx8Yy5pMThuKCJzZWFyY2hCdWlsZGVyLmJ1dHRvbiIsXy5jLmkxOG4uYnV0dG9uLDApKSxoLl9zZWFyY2hCdWlsZGVyPV99LHRleHQ6bnVsbH0sVCgic2VhcmNoQnVpbGRlci5nZXREZXRhaWxzKCkiLGZ1bmN0aW9uKGMpe2M9PT12b2lkIDAmJihjPSExKTt2YXIgbD10aGlzLmNvbnRleHRbMF07cmV0dXJuIGwuX3NlYXJjaEJ1aWxkZXI/bC5fc2VhcmNoQnVpbGRlci5nZXREZXRhaWxzKGMpOm51bGx9KSxUKCJzZWFyY2hCdWlsZGVyLnJlYnVpbGQoKSIsZnVuY3Rpb24oYyl7dmFyIGw9dGhpcy5jb250ZXh0WzBdO3JldHVybiBsLl9zZWFyY2hCdWlsZGVyPT09dm9pZCAwP251bGw6KGwuX3NlYXJjaEJ1aWxkZXIucmVidWlsZChjKSx0aGlzKX0pLFQoInNlYXJjaEJ1aWxkZXIuY29udGFpbmVyKCkiLGZ1bmN0aW9uKCl7dmFyIGM9dGhpcy5jb250ZXh0WzBdO3JldHVybiBjLl9zZWFyY2hCdWlsZGVyP2MuX3NlYXJjaEJ1aWxkZXIuZ2V0Tm9kZSgpOm51bGx9KTtmdW5jdGlvbiBQKGMsbCl7dmFyIGg9bmV3IGF0LkFwaShjKSxfPWx8fGguaW5pdCgpLnNlYXJjaEJ1aWxkZXJ8fGF0LmRlZmF1bHRzLnNlYXJjaEJ1aWxkZXIsRj1uZXcgQyhoLF8pLE89Ri5nZXROb2RlKCk7cmV0dXJuIE99Y24oZG9jdW1lbnQpLm9uKCJwcmVJbml0LmR0LmR0c3AiLGZ1bmN0aW9uKGMsbCl7Yy5uYW1lc3BhY2U9PT0iZHQiJiYobC5vSW5pdC5zZWFyY2hCdWlsZGVyfHxhdC5kZWZhdWx0cy5zZWFyY2hCdWlsZGVyKSYmKGwuX3NlYXJjaEJ1aWxkZXJ8fFAobCkpfSksYXQuZXh0LmZlYXR1cmUucHVzaCh7Y0ZlYXR1cmU6IlEiLGZuSW5pdDpQfSksYXQuZmVhdHVyZSYmYXQuZmVhdHVyZS5yZWdpc3Rlcigic2VhcmNoQnVpbGRlciIsUCl9KSgpO3ZhciBzZD1pZShhZSgpLDEpO3ZhciBacz1pZShhZSgpLDEpO3ZhciBaZT1acy5kZWZhdWx0OyhmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0Ijt2YXIgdCxlO2Z1bmN0aW9uIG4odyl7dD13LGU9dy5mbi5kYXRhVGFibGV9dmFyIHI9ZnVuY3Rpb24oKXtmdW5jdGlvbiB3KGssUyxCLEwsUil7dmFyIHE9dGhpcztpZihSPT09dm9pZCAwJiYoUj1udWxsKSwhZXx8IWUudmVyc2lvbkNoZWNrfHwhZS52ZXJzaW9uQ2hlY2soIjEuMTAuMCIpKXRocm93IG5ldyBFcnJvcigiU2VhcmNoUGFuZSByZXF1aXJlcyBEYXRhVGFibGVzIDEuMTAgb3IgbmV3ZXIiKTtpZighZS5zZWxlY3QpdGhyb3cgbmV3IEVycm9yKCJTZWFyY2hQYW5lIHJlcXVpcmVzIFNlbGVjdCIpO3ZhciB6PW5ldyBlLkFwaShrKTt0aGlzLmNsYXNzZXM9dC5leHRlbmQoITAse30sdy5jbGFzc2VzKSx0aGlzLmM9dC5leHRlbmQoITAse30sdy5kZWZhdWx0cyxTLFIpLFMmJlMuaGlkZUNvdW50JiZTLnZpZXdDb3VudD09PXZvaWQgMCYmKHRoaXMuYy52aWV3Q291bnQ9IXRoaXMuYy5oaWRlQ291bnQpO3ZhciBHPXouY29sdW1ucygpLmVxKDApLnRvQXJyYXkoKS5sZW5ndGg7dGhpcy5zPXtjb2xFeGlzdHM6QjxHLGNvbE9wdHM6dm9pZCAwLGN1c3RvbVBhbmVTZXR0aW5nczpSLGRpc3BsYXllZDohMSxkdDp6LGR0UGFuZTp2b2lkIDAsZmlyc3RTZXQ6ITAsaW5kZXg6QixpbmRleGVzOltdLGxpc3RTZXQ6ITEsbmFtZTp2b2lkIDAscm93RGF0YTp7YXJyYXlGaWx0ZXI6W10sYXJyYXlPcmlnaW5hbDpbXSxiaW5zOnt9LGJpbnNPcmlnaW5hbDp7fSxmaWx0ZXJNYXA6bmV3IE1hcCx0b3RhbE9wdGlvbnM6MH0sc2Nyb2xsVG9wOjAsc2VhcmNoRnVuY3Rpb246dm9pZCAwLHNlbGVjdGlvbnM6W10sc2VydmVyU2VsZWN0OltdLHNlcnZlclNlbGVjdGluZzohMSx0YWJsZUxlbmd0aDpudWxsLHVwZGF0aW5nOiExfSx0aGlzLnMuY29sT3B0cz10aGlzLnMuY29sRXhpc3RzP3RoaXMuX2dldE9wdGlvbnMoKTp0aGlzLl9nZXRCb251c09wdGlvbnMoKSx0aGlzLmRvbT17YnV0dG9uR3JvdXA6dCgiPGRpdi8+IikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmJ1dHRvbkdyb3VwKSxjbGVhcjp0KCc8YnV0dG9uIHR5cGU9ImJ1dHRvbiI+JiMyMTU7PC9idXR0b24+JykuYXR0cigiZGlzYWJsZWQiLCJ0cnVlIikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmRpc2FibGVkQnV0dG9uKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMucGFuZUJ1dHRvbikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmNsZWFyQnV0dG9uKS5odG1sKHRoaXMucy5kdC5pMThuKCJzZWFyY2hQYW5lcy5jbGVhclBhbmUiLHRoaXMuYy5pMThuLmNsZWFyUGFuZSkpLGNvbGxhcHNlQnV0dG9uOnQoJzxidXR0b24gdHlwZT0iYnV0dG9uIj48c3BhbiBjbGFzcz0iJyt0aGlzLmNsYXNzZXMuY2FyZXQrJyI+JiN4NWU7PC9zcGFuPjwvYnV0dG9uPicpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5wYW5lQnV0dG9uKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuY29sbGFwc2VCdXR0b24pLGNvbnRhaW5lcjp0KCI8ZGl2Lz4iKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuY29udGFpbmVyKS5hZGRDbGFzcyh0aGlzLnMuY29sT3B0cy5jbGFzc05hbWUpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5sYXlvdXQrKHBhcnNlSW50KHRoaXMuYy5sYXlvdXQuc3BsaXQoIi0iKVsxXSwxMCk8MTA/dGhpcy5jLmxheW91dDp0aGlzLmMubGF5b3V0LnNwbGl0KCItIilbMF0rIi05IikpLmFkZENsYXNzKHRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3MmJnRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3MuY2xhc3NOYW1lP3RoaXMucy5jdXN0b21QYW5lU2V0dGluZ3MuY2xhc3NOYW1lOiIiKSxjb3VudEJ1dHRvbjp0KCc8YnV0dG9uIHR5cGU9ImJ1dHRvbiI+PHNwYW4+PC9zcGFuPjwvYnV0dG9uPicpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5wYW5lQnV0dG9uKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuY291bnRCdXR0b24pLGR0UDp0KCc8dGFibGUgd2lkdGg9IjEwMCUiPjx0aGVhZD48dHI+PHRoPjwvdGg+PHRoPjwvdGg+PC90cj48L3RoZWFkPjwvdGFibGU+JyksbG93ZXI6dCgiPGRpdi8+IikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnN1YlJvdzIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5uYXJyb3dCdXR0b24pLG5hbWVCdXR0b246dCgnPGJ1dHRvbiB0eXBlPSJidXR0b24iPjxzcGFuPjwvc3Bhbj48L2J1dHRvbj4nKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMucGFuZUJ1dHRvbikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLm5hbWVCdXR0b24pLHBhbmVzQ29udGFpbmVyOnQoTCksc2VhcmNoQm94OnQoIjxpbnB1dC8+IikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnBhbmVJbnB1dEJ1dHRvbikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnNlYXJjaCksc2VhcmNoQnV0dG9uOnQoJzxidXR0b24gdHlwZT0iYnV0dG9uIj48c3Bhbj48L3NwYW4+PC9idXR0b24+JykuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnNlYXJjaEljb24pLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5wYW5lQnV0dG9uKSxzZWFyY2hDb250OnQoIjxkaXYvPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5zZWFyY2hDb250KSxzZWFyY2hMYWJlbENvbnQ6dCgiPGRpdi8+IikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnNlYXJjaExhYmVsQ29udCksdG9wUm93OnQoIjxkaXYvPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy50b3BSb3cpLHVwcGVyOnQoIjxkaXYvPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5zdWJSb3cxKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMubmFycm93U2VhcmNoKX07dmFyIG50PSIiO3RoaXMucy5jb2xFeGlzdHM/KG50PXQodGhpcy5zLmR0LmNvbHVtbih0aGlzLnMuaW5kZXgpLmhlYWRlcigpKS50ZXh0KCksdGhpcy5kb20uZHRQLmZpbmQoInRoIikuZXEoMCkudGV4dChudCkpOihudD10aGlzLnMuY3VzdG9tUGFuZVNldHRpbmdzLmhlYWRlcnx8IkN1c3RvbSBQYW5lIix0aGlzLmRvbS5kdFAuZmluZCgidGgiKS5lcSgwKS5odG1sKG50KSksdGhpcy5zLmNvbE9wdHMubmFtZT90aGlzLnMubmFtZT10aGlzLnMuY29sT3B0cy5uYW1lOnRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3MmJnRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3MubmFtZT90aGlzLnMubmFtZT10aGlzLnMuY3VzdG9tUGFuZVNldHRpbmdzLm5hbWU6dGhpcy5zLm5hbWU9bnQ7dmFyIHR0PXRoaXMucy5kdC50YWJsZSgwKS5ub2RlKCk7cmV0dXJuIHRoaXMucy5zZWFyY2hGdW5jdGlvbj1mdW5jdGlvbihldCx3dCxTdCl7aWYocS5zLnNlbGVjdGlvbnMubGVuZ3RoPT09MHx8ZXQublRhYmxlIT09dHQpcmV0dXJuITA7dmFyIFR0PW51bGw7cmV0dXJuIHEucy5jb2xFeGlzdHMmJihUdD13dFtxLnMuaW5kZXhdLHEucy5jb2xPcHRzLm9ydGhvZ29uYWwuZmlsdGVyIT09ImZpbHRlciImJihUdD1xLnMucm93RGF0YS5maWx0ZXJNYXAuZ2V0KFN0KSxUdCBpbnN0YW5jZW9mIHQuZm4uZGF0YVRhYmxlLkFwaSYmKFR0PVR0LnRvQXJyYXkoKSkpKSxxLl9zZWFyY2goVHQsU3QpfSx0LmZuLmRhdGFUYWJsZS5leHQuc2VhcmNoLnB1c2godGhpcy5zLnNlYXJjaEZ1bmN0aW9uKSx0aGlzLmMuY2xlYXImJnRoaXMuZG9tLmNsZWFyLm9uKCJjbGljay5kdHNwIixmdW5jdGlvbigpe3ZhciBldD1xLmRvbS5jb250YWluZXIuZmluZCgiLiIrcS5jbGFzc2VzLnNlYXJjaC5yZXBsYWNlKC9ccysvZywiLiIpKTtldC5lYWNoKGZ1bmN0aW9uKCl7dCh0aGlzKS52YWwoIiIpLnRyaWdnZXIoImlucHV0Iil9KSxxLmNsZWFyUGFuZSgpfSksdGhpcy5zLmR0Lm9uKCJkcmF3LmR0c3AiLGZ1bmN0aW9uKCl7cmV0dXJuIHEuYWRqdXN0VG9wUm93KCl9KSx0aGlzLnMuZHQub24oImJ1dHRvbnMtYWN0aW9uLmR0c3AiLGZ1bmN0aW9uKCl7cmV0dXJuIHEuYWRqdXN0VG9wUm93KCl9KSx0aGlzLnMuZHQub24oImNvbHVtbi1yZW9yZGVyLmR0c3AiLGZ1bmN0aW9uKGV0LHd0LFN0KXtxLnMuaW5kZXg9U3QubWFwcGluZ1txLnMuaW5kZXhdfSksdGhpc31yZXR1cm4gdy5wcm90b3R5cGUuYWRkUm93PWZ1bmN0aW9uKGssUyxCLEwsUixxLHope3F8fChxPXRoaXMucy5yb3dEYXRhLmJpbnNbU10/dGhpcy5zLnJvd0RhdGEuYmluc1tTXTowKSx6fHwoej10aGlzLl9nZXRTaG93bihTKSk7Zm9yKHZhciBHLG50PTAsdHQ9dGhpcy5zLmluZGV4ZXM7bnQ8dHQubGVuZ3RoO250Kyspe3ZhciBldD10dFtudF07ZXQuZmlsdGVyPT09UyYmKEc9ZXQuaW5kZXgpfXJldHVybiBHPT09dm9pZCAwJiYoRz10aGlzLnMuaW5kZXhlcy5sZW5ndGgsdGhpcy5zLmluZGV4ZXMucHVzaCh7ZmlsdGVyOlMsaW5kZXg6R30pKSx0aGlzLnMuZHRQYW5lLnJvdy5hZGQoe2NsYXNzTmFtZTpSLGRpc3BsYXk6ayE9PSIiP2s6dGhpcy5lbXB0eU1lc3NhZ2UoKSxmaWx0ZXI6UyxpbmRleDpHLHNob3duOnosc29ydDpCLHRvdGFsOnEsdHlwZTpMfSl9LHcucHJvdG90eXBlLmFkanVzdFRvcFJvdz1mdW5jdGlvbigpe3ZhciBrPXRoaXMuZG9tLmNvbnRhaW5lci5maW5kKCIuIit0aGlzLmNsYXNzZXMuc3ViUm93c0NvbnRhaW5lci5yZXBsYWNlKC9ccysvZywiLiIpKSxTPXRoaXMuZG9tLmNvbnRhaW5lci5maW5kKCIuIit0aGlzLmNsYXNzZXMuc3ViUm93MS5yZXBsYWNlKC9ccysvZywiLiIpKSxCPXRoaXMuZG9tLmNvbnRhaW5lci5maW5kKCIuIit0aGlzLmNsYXNzZXMuc3ViUm93Mi5yZXBsYWNlKC9ccysvZywiLiIpKSxMPXRoaXMuZG9tLmNvbnRhaW5lci5maW5kKCIuIit0aGlzLmNsYXNzZXMudG9wUm93LnJlcGxhY2UoL1xzKy9nLCIuIikpOyh0KGtbMF0pLndpZHRoKCk8MjUyfHx0KExbMF0pLndpZHRoKCk8MjUyKSYmdChrWzBdKS53aWR0aCgpIT09MD8odChrWzBdKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMubmFycm93KSx0KFNbMF0pLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5uYXJyb3dTdWIpLnJlbW92ZUNsYXNzKHRoaXMuY2xhc3Nlcy5uYXJyb3dTZWFyY2gpLHQoQlswXSkuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLm5hcnJvd1N1YikucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLm5hcnJvd0J1dHRvbikpOih0KGtbMF0pLnJlbW92ZUNsYXNzKHRoaXMuY2xhc3Nlcy5uYXJyb3cpLHQoU1swXSkucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLm5hcnJvd1N1YikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLm5hcnJvd1NlYXJjaCksdChCWzBdKS5yZW1vdmVDbGFzcyh0aGlzLmNsYXNzZXMubmFycm93U3ViKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMubmFycm93QnV0dG9uKSl9LHcucHJvdG90eXBlLmNsZWFyRGF0YT1mdW5jdGlvbigpe3RoaXMucy5yb3dEYXRhPXthcnJheUZpbHRlcjpbXSxhcnJheU9yaWdpbmFsOltdLGJpbnM6e30sYmluc09yaWdpbmFsOnt9LGZpbHRlck1hcDpuZXcgTWFwLHRvdGFsT3B0aW9uczowfX0sdy5wcm90b3R5cGUuY2xlYXJQYW5lPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucy5kdFBhbmUucm93cyh7c2VsZWN0ZWQ6ITB9KS5kZXNlbGVjdCgpLHRoaXMudXBkYXRlVGFibGUoKSx0aGlzfSx3LnByb3RvdHlwZS5jb2xsYXBzZT1mdW5jdGlvbigpe3ZhciBrPXRoaXM7IXRoaXMucy5kaXNwbGF5ZWR8fCF0aGlzLmMuY29sbGFwc2UmJnRoaXMucy5jb2xPcHRzLmNvbGxhcHNlIT09ITB8fHRoaXMucy5jb2xPcHRzLmNvbGxhcHNlPT09ITF8fCh0KHRoaXMucy5kdFBhbmUudGFibGUoKS5jb250YWluZXIoKSkuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmhpZGRlbiksdGhpcy5kb20udG9wUm93LmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5ib3JkZXJlZCksdGhpcy5kb20ubmFtZUJ1dHRvbi5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuZGlzYWJsZWRCdXR0b24pLHRoaXMuZG9tLmNvdW50QnV0dG9uLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5kaXNhYmxlZEJ1dHRvbiksdGhpcy5kb20uc2VhcmNoQnV0dG9uLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5kaXNhYmxlZEJ1dHRvbiksdGhpcy5kb20uY29sbGFwc2VCdXR0b24uYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnJvdGF0ZWQpLHRoaXMuZG9tLnRvcFJvdy5vbmUoImNsaWNrLmR0c3AiLGZ1bmN0aW9uKCl7cmV0dXJuIGsuc2hvdygpfSksdGhpcy5kb20udG9wUm93LnRyaWdnZXIoImNvbGxhcHNlLmR0c3BzIikpfSx3LnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5zLmR0UGFuZSYmdGhpcy5zLmR0UGFuZS5vZmYoIi5kdHNwIiksdGhpcy5zLmR0Lm9mZigiLmR0c3AiKSx0aGlzLmRvbS5jbGVhci5vZmYoIi5kdHNwIiksdGhpcy5kb20ubmFtZUJ1dHRvbi5vZmYoIi5kdHNwIiksdGhpcy5kb20uY291bnRCdXR0b24ub2ZmKCIuZHRzcCIpLHRoaXMuZG9tLnNlYXJjaEJ1dHRvbi5vZmYoIi5kdHNwIiksdGhpcy5kb20uY29sbGFwc2VCdXR0b24ub2ZmKCIuZHRzcCIpLHQodGhpcy5zLmR0LnRhYmxlKCkubm9kZSgpKS5vZmYoIi5kdHNwIiksdGhpcy5kb20uY29udGFpbmVyLmRldGFjaCgpO2Zvcih2YXIgaz10LmZuLmRhdGFUYWJsZS5leHQuc2VhcmNoLmluZGV4T2YodGhpcy5zLnNlYXJjaEZ1bmN0aW9uKTtrIT09LTE7KXQuZm4uZGF0YVRhYmxlLmV4dC5zZWFyY2guc3BsaWNlKGssMSksaz10LmZuLmRhdGFUYWJsZS5leHQuc2VhcmNoLmluZGV4T2YodGhpcy5zLnNlYXJjaEZ1bmN0aW9uKTt0aGlzLnMuZHRQYW5lJiZ0aGlzLnMuZHRQYW5lLmRlc3Ryb3koKSx0aGlzLnMubGlzdFNldD0hMX0sdy5wcm90b3R5cGUuZW1wdHlNZXNzYWdlPWZ1bmN0aW9uKCl7dmFyIGs9dGhpcy5jLmkxOG4uZW1wdHlNZXNzYWdlO3JldHVybiB0aGlzLmMuZW1wdHlNZXNzYWdlJiYoaz10aGlzLmMuZW1wdHlNZXNzYWdlKSx0aGlzLnMuY29sT3B0cy5lbXB0eU1lc3NhZ2UhPT0hMSYmdGhpcy5zLmNvbE9wdHMuZW1wdHlNZXNzYWdlIT09bnVsbCYmKGs9dGhpcy5zLmNvbE9wdHMuZW1wdHlNZXNzYWdlKSx0aGlzLnMuZHQuaTE4bigic2VhcmNoUGFuZXMuZW1wdHlNZXNzYWdlIixrKX0sdy5wcm90b3R5cGUuZ2V0UGFuZUNvdW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucy5kdFBhbmU/dGhpcy5zLmR0UGFuZS5yb3dzKHtzZWxlY3RlZDohMH0pLmRhdGEoKS50b0FycmF5KCkubGVuZ3RoOjB9LHcucHJvdG90eXBlLnJlYnVpbGRQYW5lPWZ1bmN0aW9uKGssUyl7az09PXZvaWQgMCYmKGs9bnVsbCksUz09PXZvaWQgMCYmKFM9ITEpLHRoaXMuY2xlYXJEYXRhKCk7dmFyIEI9W107dGhpcy5zLnNlcnZlclNlbGVjdD1bXTt2YXIgTD1udWxsO3JldHVybiB0aGlzLnMuZHRQYW5lJiYoUyYmKHRoaXMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlP3RoaXMucy5zZXJ2ZXJTZWxlY3Q9dGhpcy5zLmR0UGFuZS5yb3dzKHtzZWxlY3RlZDohMH0pLmRhdGEoKS50b0FycmF5KCk6Qj10aGlzLnMuZHRQYW5lLnJvd3Moe3NlbGVjdGVkOiEwfSkuZGF0YSgpLnRvQXJyYXkoKSksdGhpcy5zLmR0UGFuZS5jbGVhcigpLmRlc3Ryb3koKSxMPXRoaXMuZG9tLmNvbnRhaW5lci5wcmV2KCksdGhpcy5kZXN0cm95KCksdGhpcy5zLmR0UGFuZT12b2lkIDAsdC5mbi5kYXRhVGFibGUuZXh0LnNlYXJjaC5wdXNoKHRoaXMucy5zZWFyY2hGdW5jdGlvbikpLHRoaXMuZG9tLmNvbnRhaW5lci5yZW1vdmVDbGFzcyh0aGlzLmNsYXNzZXMuaGlkZGVuKSx0aGlzLnMuZGlzcGxheWVkPSExLHRoaXMuX2J1aWxkUGFuZSh0aGlzLnMuZHQucGFnZS5pbmZvKCkuc2VydmVyU2lkZT90aGlzLnMuc2VydmVyU2VsZWN0OkIsayxMKSx0aGlzfSx3LnByb3RvdHlwZS5yZXNpemU9ZnVuY3Rpb24oayl7dGhpcy5jLmxheW91dD1rLHRoaXMuZG9tLmNvbnRhaW5lci5yZW1vdmVDbGFzcygpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5zaG93KS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuY29udGFpbmVyKS5hZGRDbGFzcyh0aGlzLnMuY29sT3B0cy5jbGFzc05hbWUpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5sYXlvdXQrKHBhcnNlSW50KGsuc3BsaXQoIi0iKVsxXSwxMCk8MTA/azprLnNwbGl0KCItIilbMF0rIi05IikpLmFkZENsYXNzKHRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3MhPT1udWxsJiZ0aGlzLnMuY3VzdG9tUGFuZVNldHRpbmdzLmNsYXNzTmFtZT90aGlzLnMuY3VzdG9tUGFuZVNldHRpbmdzLmNsYXNzTmFtZToiIiksdGhpcy5hZGp1c3RUb3BSb3coKX0sdy5wcm90b3R5cGUuc2V0TGlzdGVuZXJzPWZ1bmN0aW9uKCl7dmFyIGs9dGhpczt0aGlzLnMuZHRQYW5lJiYodGhpcy5zLmR0UGFuZS5vZmYoInNlbGVjdC5kdHNwIikub24oInNlbGVjdC5kdHNwIixmdW5jdGlvbigpe2NsZWFyVGltZW91dChrLnMuZGVzZWxlY3RUaW1lb3V0KSxrLl91cGRhdGVTZWxlY3Rpb24oIWsucy51cGRhdGluZyksay5kb20uY2xlYXIucmVtb3ZlQ2xhc3Moay5jbGFzc2VzLmRpc2FibGVkQnV0dG9uKS5yZW1vdmVBdHRyKCJkaXNhYmxlZCIpfSksdGhpcy5zLmR0UGFuZS5vZmYoImRlc2VsZWN0LmR0c3AiKS5vbigiZGVzZWxlY3QuZHRzcCIsZnVuY3Rpb24oKXtrLnMuZGVzZWxlY3RUaW1lb3V0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXtrLl91cGRhdGVTZWxlY3Rpb24oITApLGsucy5kdFBhbmUucm93cyh7c2VsZWN0ZWQ6ITB9KS5kYXRhKCkudG9BcnJheSgpLmxlbmd0aD09PTAmJmsuZG9tLmNsZWFyLmFkZENsYXNzKGsuY2xhc3Nlcy5kaXNhYmxlZEJ1dHRvbikuYXR0cigiZGlzYWJsZWQiLCJ0cnVlIil9LDUwKX0pLHRoaXMucy5maXJzdFNldCYmKHRoaXMucy5maXJzdFNldD0hMSx0aGlzLnMuZHQub24oInN0YXRlU2F2ZVBhcmFtcy5kdHNwIixmdW5jdGlvbihTLEIsTCl7aWYodC5pc0VtcHR5T2JqZWN0KEwpKXtrLnMuZHRQYW5lLnN0YXRlLmNsZWFyKCk7cmV0dXJufXZhciBSLHEsej1bXSxHLG50LHR0O2sucy5kdFBhbmUmJih6PWsucy5kdFBhbmUucm93cyh7c2VsZWN0ZWQ6ITB9KS5kYXRhKCkubWFwKGZ1bmN0aW9uKHd0KXtyZXR1cm4gd3QuZmlsdGVyIT09bnVsbD93dC5maWx0ZXIudG9TdHJpbmcoKTpudWxsfSkudG9BcnJheSgpLG50PWsuZG9tLnNlYXJjaEJveC52YWwoKSxxPWsucy5kdFBhbmUub3JkZXIoKSxSPWsucy5yb3dEYXRhLmJpbnNPcmlnaW5hbCx0dD1rLnMucm93RGF0YS5hcnJheU9yaWdpbmFsLEc9ay5kb20uY29sbGFwc2VCdXR0b24uaGFzQ2xhc3Moay5jbGFzc2VzLnJvdGF0ZWQpKSxMLnNlYXJjaFBhbmVzPT09dm9pZCAwJiYoTC5zZWFyY2hQYW5lcz17fSksTC5zZWFyY2hQYW5lcy5wYW5lcz09PXZvaWQgMCYmKEwuc2VhcmNoUGFuZXMucGFuZXM9W10pO2Zvcih2YXIgZXQ9MDtldDxMLnNlYXJjaFBhbmVzLnBhbmVzLmxlbmd0aDtldCsrKUwuc2VhcmNoUGFuZXMucGFuZXNbZXRdLmlkPT09ay5zLmluZGV4JiYoTC5zZWFyY2hQYW5lcy5wYW5lcy5zcGxpY2UoZXQsMSksZXQtLSk7TC5zZWFyY2hQYW5lcy5wYW5lcy5wdXNoKHthcnJheUZpbHRlcjp0dCxiaW5zOlIsY29sbGFwc2VkOkcsaWQ6ay5zLmluZGV4LG9yZGVyOnEsc2VhcmNoVGVybTpudCxzZWxlY3RlZDp6fSl9KSksdGhpcy5zLmR0UGFuZS5vZmYoInVzZXItc2VsZWN0LmR0c3AiKS5vbigidXNlci1zZWxlY3QuZHRzcCIsZnVuY3Rpb24oUyxCLEwsUixxKXtxLnN0b3BQcm9wYWdhdGlvbigpfSksdGhpcy5zLmR0UGFuZS5vZmYoImRyYXcuZHRzcCIpLm9uKCJkcmF3LmR0c3AiLGZ1bmN0aW9uKCl7cmV0dXJuIGsuYWRqdXN0VG9wUm93KCl9KSx0aGlzLmRvbS5uYW1lQnV0dG9uLm9mZigiY2xpY2suZHRzcCIpLm9uKCJjbGljay5kdHNwIixmdW5jdGlvbigpe3ZhciBTPWsucy5kdFBhbmUub3JkZXIoKVswXVsxXTtrLnMuZHRQYW5lLm9yZGVyKFtbMCxTPT09ImFzYyI/ImRlc2MiOiJhc2MiXV0pLmRyYXcoKSxrLnMuZHQuc3RhdGUuc2F2ZSgpfSksdGhpcy5kb20uY291bnRCdXR0b24ub2ZmKCJjbGljay5kdHNwIikub24oImNsaWNrLmR0c3AiLGZ1bmN0aW9uKCl7dmFyIFM9ay5zLmR0UGFuZS5vcmRlcigpWzBdWzFdO2sucy5kdFBhbmUub3JkZXIoW1sxLFM9PT0iYXNjIj8iZGVzYyI6ImFzYyJdXSkuZHJhdygpLGsucy5kdC5zdGF0ZS5zYXZlKCl9KSx0aGlzLmRvbS5jb2xsYXBzZUJ1dHRvbi5vZmYoImNsaWNrLmR0c3AiKS5vbigiY2xpY2suZHRzcCIsZnVuY3Rpb24oUyl7Uy5zdG9wUHJvcGFnYXRpb24oKTt2YXIgQj10KGsucy5kdFBhbmUudGFibGUoKS5jb250YWluZXIoKSk7Qi50b2dnbGVDbGFzcyhrLmNsYXNzZXMuaGlkZGVuKSxrLmRvbS50b3BSb3cudG9nZ2xlQ2xhc3Moay5jbGFzc2VzLmJvcmRlcmVkKSxrLmRvbS5uYW1lQnV0dG9uLnRvZ2dsZUNsYXNzKGsuY2xhc3Nlcy5kaXNhYmxlZEJ1dHRvbiksay5kb20uY291bnRCdXR0b24udG9nZ2xlQ2xhc3Moay5jbGFzc2VzLmRpc2FibGVkQnV0dG9uKSxrLmRvbS5zZWFyY2hCdXR0b24udG9nZ2xlQ2xhc3Moay5jbGFzc2VzLmRpc2FibGVkQnV0dG9uKSxrLmRvbS5jb2xsYXBzZUJ1dHRvbi50b2dnbGVDbGFzcyhrLmNsYXNzZXMucm90YXRlZCksQi5oYXNDbGFzcyhrLmNsYXNzZXMuaGlkZGVuKT9rLmRvbS50b3BSb3cub24oImNsaWNrLmR0c3AiLGZ1bmN0aW9uKCl7cmV0dXJuIGsuZG9tLmNvbGxhcHNlQnV0dG9uLmNsaWNrKCl9KTprLmRvbS50b3BSb3cub2ZmKCJjbGljay5kdHNwIiksay5zLmR0LnN0YXRlLnNhdmUoKSxrLmRvbS50b3BSb3cudHJpZ2dlcigiY29sbGFwc2UuZHRzcHMiKX0pLHRoaXMuZG9tLmNsZWFyLm9mZigiY2xpY2suZHRzcCIpLm9uKCJjbGljay5kdHNwIixmdW5jdGlvbigpe3ZhciBTPWsuZG9tLmNvbnRhaW5lci5maW5kKCIuIitrLmNsYXNzZXMuc2VhcmNoLnJlcGxhY2UoLyAvZywiLiIpKTtTLmVhY2goZnVuY3Rpb24oKXt0KHRoaXMpLnZhbCgiIikudHJpZ2dlcigiaW5wdXQiKX0pLGsuY2xlYXJQYW5lKCl9KSx0aGlzLmRvbS5zZWFyY2hCdXR0b24ub2ZmKCJjbGljay5kdHNwIikub24oImNsaWNrLmR0c3AiLGZ1bmN0aW9uKCl7cmV0dXJuIGsuZG9tLnNlYXJjaEJveC5mb2N1cygpfSksdGhpcy5kb20uc2VhcmNoQm94Lm9mZigiY2xpY2suZHRzcCIpLm9uKCJpbnB1dC5kdHNwIixmdW5jdGlvbigpe3ZhciBTPWsuZG9tLnNlYXJjaEJveC52YWwoKTtrLnMuZHRQYW5lLnNlYXJjaChTKS5kcmF3KCksdHlwZW9mIFM9PSJzdHJpbmciJiYoUy5sZW5ndGg+MHx8Uy5sZW5ndGg9PT0wJiZrLnMuZHRQYW5lLnJvd3Moe3NlbGVjdGVkOiEwfSkuZGF0YSgpLnRvQXJyYXkoKS5sZW5ndGg+MCk/ay5kb20uY2xlYXIucmVtb3ZlQ2xhc3Moay5jbGFzc2VzLmRpc2FibGVkQnV0dG9uKS5yZW1vdmVBdHRyKCJkaXNhYmxlZCIpOmsuZG9tLmNsZWFyLmFkZENsYXNzKGsuY2xhc3Nlcy5kaXNhYmxlZEJ1dHRvbikuYXR0cigiZGlzYWJsZWQiLCJ0cnVlIiksay5zLmR0LnN0YXRlLnNhdmUoKX0pLHRoaXMucy5kdFBhbmUuc2VsZWN0LnN0eWxlKHRoaXMucy5jb2xPcHRzLmR0T3B0cyYmdGhpcy5zLmNvbE9wdHMuZHRPcHRzLnNlbGVjdCYmdGhpcy5zLmNvbE9wdHMuZHRPcHRzLnNlbGVjdC5zdHlsZT90aGlzLnMuY29sT3B0cy5kdE9wdHMuc2VsZWN0LnN0eWxlOnRoaXMuYy5kdE9wdHMmJnRoaXMuYy5kdE9wdHMuc2VsZWN0JiZ0aGlzLmMuZHRPcHRzLnNlbGVjdC5zdHlsZT90aGlzLmMuZHRPcHRzLnNlbGVjdC5zdHlsZToib3MiKSl9LHcucHJvdG90eXBlLl9zZXJ2ZXJQb3B1bGF0ZT1mdW5jdGlvbihrKXtrLnRhYmxlTGVuZ3RoPyh0aGlzLnMudGFibGVMZW5ndGg9ay50YWJsZUxlbmd0aCx0aGlzLnMucm93RGF0YS50b3RhbE9wdGlvbnM9dGhpcy5zLnRhYmxlTGVuZ3RoKToodGhpcy5zLnRhYmxlTGVuZ3RoPT09bnVsbHx8dGhpcy5zLmR0LnJvd3MoKVswXS5sZW5ndGg+dGhpcy5zLnRhYmxlTGVuZ3RoKSYmKHRoaXMucy50YWJsZUxlbmd0aD10aGlzLnMuZHQucm93cygpWzBdLmxlbmd0aCx0aGlzLnMucm93RGF0YS50b3RhbE9wdGlvbnM9dGhpcy5zLnRhYmxlTGVuZ3RoKTt2YXIgUz10aGlzLnMuZHQuY29sdW1uKHRoaXMucy5pbmRleCkuZGF0YVNyYygpO2lmKGsuc2VhcmNoUGFuZXMub3B0aW9uc1tTXSlmb3IodmFyIEI9MCxMPWsuc2VhcmNoUGFuZXMub3B0aW9uc1tTXTtCPEwubGVuZ3RoO0IrKyl7dmFyIFI9TFtCXTt0aGlzLnMucm93RGF0YS5hcnJheUZpbHRlci5wdXNoKHtkaXNwbGF5OlIubGFiZWwsZmlsdGVyOlIudmFsdWUsc29ydDpSLmxhYmVsLHR5cGU6Ui5sYWJlbH0pLHRoaXMucy5yb3dEYXRhLmJpbnNbUi52YWx1ZV09Ui50b3RhbH12YXIgcT1PYmplY3Qua2V5cyh0aGlzLnMucm93RGF0YS5iaW5zKS5sZW5ndGgsej10aGlzLl91bmlxdWVSYXRpbyhxLHRoaXMucy50YWJsZUxlbmd0aCk7aWYodGhpcy5zLmRpc3BsYXllZD09PSExJiYoKHRoaXMucy5jb2xPcHRzLnNob3c9PT12b2lkIDAmJnRoaXMucy5jb2xPcHRzLnRocmVzaG9sZD09PW51bGw/ej50aGlzLmMudGhyZXNob2xkOno+dGhpcy5zLmNvbE9wdHMudGhyZXNob2xkKXx8dGhpcy5zLmNvbE9wdHMuc2hvdyE9PSEwJiZxPD0xKSl7dGhpcy5kb20uY29udGFpbmVyLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5oaWRkZW4pLHRoaXMucy5kaXNwbGF5ZWQ9ITE7cmV0dXJufXRoaXMucy5yb3dEYXRhLmFycmF5T3JpZ2luYWw9dGhpcy5zLnJvd0RhdGEuYXJyYXlGaWx0ZXIsdGhpcy5zLnJvd0RhdGEuYmluc09yaWdpbmFsPXRoaXMucy5yb3dEYXRhLmJpbnMsdGhpcy5zLmRpc3BsYXllZD0hMH0sdy5wcm90b3R5cGUuc2hvdz1mdW5jdGlvbigpe3RoaXMucy5kaXNwbGF5ZWQmJih0aGlzLmRvbS50b3BSb3cucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLmJvcmRlcmVkKSx0aGlzLmRvbS5uYW1lQnV0dG9uLnJlbW92ZUNsYXNzKHRoaXMuY2xhc3Nlcy5kaXNhYmxlZEJ1dHRvbiksdGhpcy5kb20uY291bnRCdXR0b24ucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLmRpc2FibGVkQnV0dG9uKSx0aGlzLmRvbS5zZWFyY2hCdXR0b24ucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLmRpc2FibGVkQnV0dG9uKSx0aGlzLmRvbS5jb2xsYXBzZUJ1dHRvbi5yZW1vdmVDbGFzcyh0aGlzLmNsYXNzZXMucm90YXRlZCksdCh0aGlzLnMuZHRQYW5lLnRhYmxlKCkuY29udGFpbmVyKCkpLnJlbW92ZUNsYXNzKHRoaXMuY2xhc3Nlcy5oaWRkZW4pLHRoaXMuZG9tLnRvcFJvdy50cmlnZ2VyKCJjb2xsYXBzZS5kdHNwcyIpKX0sdy5wcm90b3R5cGUuX3VuaXF1ZVJhdGlvPWZ1bmN0aW9uKGssUyl7cmV0dXJuIFM+MCYmKHRoaXMucy5yb3dEYXRhLnRvdGFsT3B0aW9ucz4wJiYhdGhpcy5zLmR0LnBhZ2UuaW5mbygpLnNlcnZlclNpZGV8fHRoaXMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlJiZ0aGlzLnMudGFibGVMZW5ndGg+MCk/ay90aGlzLnMucm93RGF0YS50b3RhbE9wdGlvbnM6MX0sdy5wcm90b3R5cGUudXBkYXRlVGFibGU9ZnVuY3Rpb24oKXt2YXIgaz10aGlzLnMuZHRQYW5lLnJvd3Moe3NlbGVjdGVkOiEwfSkuZGF0YSgpLnRvQXJyYXkoKS5tYXAoZnVuY3Rpb24oUyl7cmV0dXJuIFMuZmlsdGVyfSk7dGhpcy5zLnNlbGVjdGlvbnM9ayx0aGlzLl9zZWFyY2hFeHRyYXMoKX0sdy5wcm90b3R5cGUuX2dldENvbXBhcmlzb25Sb3dzPWZ1bmN0aW9uKCl7dmFyIGs9dGhpcy5zLmNvbE9wdHMub3B0aW9ucz90aGlzLnMuY29sT3B0cy5vcHRpb25zOnRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3MmJnRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3Mub3B0aW9ucz90aGlzLnMuY3VzdG9tUGFuZVNldHRpbmdzLm9wdGlvbnM6dm9pZCAwO2lmKGshPT12b2lkIDApe3ZhciBTPXRoaXMucy5kdC5yb3dzKCksQj1TLmRhdGEoKS50b0FycmF5KCksTD1bXTt0aGlzLnMuZHRQYW5lLmNsZWFyKCksdGhpcy5zLmluZGV4ZXM9W107Zm9yKHZhciBSPTAscT1rO1I8cS5sZW5ndGg7UisrKXt2YXIgej1xW1JdLEc9ei5sYWJlbCE9PSIiP3oubGFiZWw6dGhpcy5lbXB0eU1lc3NhZ2UoKSxudD17Y2xhc3NOYW1lOnouY2xhc3NOYW1lLGRpc3BsYXk6RyxmaWx0ZXI6dHlwZW9mIHoudmFsdWU9PSJmdW5jdGlvbiI/ei52YWx1ZTpbXSxzb3J0Onoub3JkZXIhPT12b2lkIDA/ei5vcmRlcjpHLHRvdGFsOjAsdHlwZTpHfTtpZih0eXBlb2Ygei52YWx1ZT09ImZ1bmN0aW9uIil7Zm9yKHZhciB0dD0wO3R0PEIubGVuZ3RoO3R0Kyspei52YWx1ZS5jYWxsKHRoaXMucy5kdCxCW3R0XSxTWzBdW3R0XSkmJm50LnRvdGFsKys7dHlwZW9mIG50LmZpbHRlciE9ImZ1bmN0aW9uIiYmbnQuZmlsdGVyLnB1c2goei5maWx0ZXIpfUwucHVzaCh0aGlzLmFkZFJvdyhudC5kaXNwbGF5LG50LmZpbHRlcixudC5zb3J0LG50LnR5cGUsbnQuY2xhc3NOYW1lLG50LnRvdGFsKSl9cmV0dXJuIEx9fSx3LnByb3RvdHlwZS5fZ2V0TWVzc2FnZT1mdW5jdGlvbihrKXtyZXR1cm4gdGhpcy5zLmR0LmkxOG4oInNlYXJjaFBhbmVzLmNvdW50Iix0aGlzLmMuaTE4bi5jb3VudCkucmVwbGFjZSgve3RvdGFsfS9nLGsudG90YWwpfSx3LnByb3RvdHlwZS5fZ2V0U2hvd249ZnVuY3Rpb24oayl7fSx3LnByb3RvdHlwZS5fZ2V0UGFuZUNvbmZpZz1mdW5jdGlvbigpe3ZhciBrPXRoaXMsUz1lLlNjcm9sbGVyLEI9dGhpcy5zLmR0LnNldHRpbmdzKClbMF0ub0xhbmd1YWdlO3JldHVybiBCLnVybD12b2lkIDAsQi5zVXJsPXZvaWQgMCx7Y29sdW1uRGVmczpbe2NsYXNzTmFtZToiZHRzcC1uYW1lQ29sdW1uIixkYXRhOiJkaXNwbGF5IixyZW5kZXI6ZnVuY3Rpb24oTCxSLHEpe2lmKFI9PT0ic29ydCIpcmV0dXJuIHEuc29ydDtpZihSPT09InR5cGUiKXJldHVybiBxLnR5cGU7dmFyIHo9ay5fZ2V0TWVzc2FnZShxKSxHPSc8c3BhbiBjbGFzcz0iJytrLmNsYXNzZXMucGlsbCsnIj4nK3orIjwvc3Bhbj4iO3JldHVybighay5jLnZpZXdDb3VudHx8IWsucy5jb2xPcHRzLnZpZXdDb3VudCkmJihHPSIiKSxSPT09ImZpbHRlciI/dHlwZW9mIEw9PSJzdHJpbmciJiZMLm1hdGNoKC88W14+XSo+LykhPT1udWxsP0wucmVwbGFjZSgvPFtePl0qPi9nLCIiKTpMOic8ZGl2IGNsYXNzPSInK2suY2xhc3Nlcy5uYW1lQ29udCsnIj48c3BhbiB0aXRsZT0iJysodHlwZW9mIEw9PSJzdHJpbmciJiZMLm1hdGNoKC88W14+XSo+LykhPT1udWxsP0wucmVwbGFjZSgvPFtePl0qPi9nLCIiKTpMKSsnIiBjbGFzcz0iJytrLmNsYXNzZXMubmFtZSsnIj4nK0wrIjwvc3Bhbj4iK0crIjwvZGl2PiJ9LHRhcmdldHM6MCx0eXBlOnRoaXMucy5kdC5zZXR0aW5ncygpWzBdLmFvQ29sdW1uc1t0aGlzLnMuaW5kZXhdP3RoaXMucy5kdC5zZXR0aW5ncygpWzBdLmFvQ29sdW1uc1t0aGlzLnMuaW5kZXhdLl9zTWFudWFsVHlwZTpudWxsfSx7Y2xhc3NOYW1lOiJkdHNwLWNvdW50Q29sdW1uICIrdGhpcy5jbGFzc2VzLmJhZGdlUGlsbCxkYXRhOiJ0b3RhbCIsc2VhcmNoYWJsZTohMSx0YXJnZXRzOjEsdmlzaWJsZTohMX1dLGRlZmVyUmVuZGVyOiEwLGluZm86ITEsbGFuZ3VhZ2U6QixwYWdpbmc6ISFTLHNjcm9sbFg6ITEsc2Nyb2xsWToiMjAwcHgiLHNjcm9sbGVyOiEhUyxzZWxlY3Q6ITAsc3RhdGVTYXZlOiEhdGhpcy5zLmR0LnNldHRpbmdzKClbMF0ub0ZlYXR1cmVzLmJTdGF0ZVNhdmV9fSx3LnByb3RvdHlwZS5fbWFrZVNlbGVjdGlvbj1mdW5jdGlvbigpe3RoaXMudXBkYXRlVGFibGUoKSx0aGlzLnMudXBkYXRpbmc9ITAsdGhpcy5zLmR0LmRyYXcoKSx0aGlzLnMudXBkYXRpbmc9ITF9LHcucHJvdG90eXBlLl9wb3B1bGF0ZVBhbmVBcnJheT1mdW5jdGlvbihrLFMsQixMKXtMPT09dm9pZCAwJiYoTD10aGlzLnMucm93RGF0YS5iaW5zKTt2YXIgUj1CLmZhc3REYXRhP0IuZmFzdERhdGE6ZnVuY3Rpb24oRyxudCx0dCl7cmV0dXJuIEIub0FwaS5fZm5HZXRDZWxsRGF0YShCLEcsbnQsdHQpfTtpZih0eXBlb2YgdGhpcy5zLmNvbE9wdHMub3J0aG9nb25hbD09InN0cmluZyIpe3ZhciBxPVIoayx0aGlzLnMuaW5kZXgsdGhpcy5zLmNvbE9wdHMub3J0aG9nb25hbCk7dGhpcy5zLnJvd0RhdGEuZmlsdGVyTWFwLnNldChrLHEpLHRoaXMuX2FkZE9wdGlvbihxLHEscSxxLFMsTCksdGhpcy5zLnJvd0RhdGEudG90YWxPcHRpb25zKyt9ZWxzZXt2YXIgej1SKGssdGhpcy5zLmluZGV4LHRoaXMucy5jb2xPcHRzLm9ydGhvZ29uYWwuc2VhcmNoKTt6PT09bnVsbCYmKHo9IiIpLHR5cGVvZiB6PT0ic3RyaW5nIiYmKHo9ei5yZXBsYWNlKC88W14+XSo+L2csIiIpKSx0aGlzLnMucm93RGF0YS5maWx0ZXJNYXAuc2V0KGsseiksTFt6XT8oTFt6XSsrLHRoaXMucy5yb3dEYXRhLnRvdGFsT3B0aW9ucysrKTooTFt6XT0xLHRoaXMuX2FkZE9wdGlvbih6LFIoayx0aGlzLnMuaW5kZXgsdGhpcy5zLmNvbE9wdHMub3J0aG9nb25hbC5kaXNwbGF5KSxSKGssdGhpcy5zLmluZGV4LHRoaXMucy5jb2xPcHRzLm9ydGhvZ29uYWwuc29ydCksUihrLHRoaXMucy5pbmRleCx0aGlzLnMuY29sT3B0cy5vcnRob2dvbmFsLnR5cGUpLFMsTCksdGhpcy5zLnJvd0RhdGEudG90YWxPcHRpb25zKyspfX0sdy5wcm90b3R5cGUuX3JlbG9hZFNlbGVjdD1mdW5jdGlvbihrKXtpZihrIT09dm9pZCAwKXtmb3IodmFyIFMsQj0wO0I8ay5zZWFyY2hQYW5lcy5wYW5lcy5sZW5ndGg7QisrKWlmKGsuc2VhcmNoUGFuZXMucGFuZXNbQl0uaWQ9PT10aGlzLnMuaW5kZXgpe1M9QjticmVha31pZihTKWZvcih2YXIgTD10aGlzLnMuZHRQYW5lLFI9TC5yb3dzKHtvcmRlcjoiaW5kZXgifSkuZGF0YSgpLm1hcChmdW5jdGlvbih0dCl7cmV0dXJuIHR0LmZpbHRlciE9PW51bGw/dHQuZmlsdGVyLnRvU3RyaW5nKCk6bnVsbH0pLnRvQXJyYXkoKSxxPTAsej1rLnNlYXJjaFBhbmVzLnBhbmVzW1NdLnNlbGVjdGVkO3E8ei5sZW5ndGg7cSsrKXt2YXIgRz16W3FdLG50PS0xO0chPT1udWxsJiYobnQ9Ui5pbmRleE9mKEcudG9TdHJpbmcoKSkpLG50Pi0xJiYodGhpcy5zLnNlcnZlclNlbGVjdGluZz0hMCxMLnJvdyhudCkuc2VsZWN0KCksdGhpcy5zLnNlcnZlclNlbGVjdGluZz0hMSl9fX0sdy5wcm90b3R5cGUuX3VwZGF0ZVNlbGVjdGlvbj1mdW5jdGlvbihrKXt2YXIgUz10aGlzLEI9ZnVuY3Rpb24oUil7aWYoYXQudmVyc2lvbkNoZWNrKCIyIikpUy5zLmR0LnByb2Nlc3NpbmcoUik7ZWxzZXt2YXIgcT1TLnMuZHQuc2V0dGluZ3MoKVswXSx6PXEub0FwaTt6Ll9mblByb2Nlc3NpbmdEaXNwbGF5KHEsITEpfX0sTD1mdW5jdGlvbigpe1Mucy5zY3JvbGxUb3A9dChTLnMuZHRQYW5lLnRhYmxlKCkubm9kZSgpKS5wYXJlbnQoKVswXS5zY3JvbGxUb3AsUy5zLmR0LnBhZ2UuaW5mbygpLnNlcnZlclNpZGUmJiFTLnMudXBkYXRpbmc/Uy5zLnNlcnZlclNlbGVjdGluZ3x8KFMucy5zZXJ2ZXJTZWxlY3Q9Uy5zLmR0UGFuZS5yb3dzKHtzZWxlY3RlZDohMH0pLmRhdGEoKS50b0FycmF5KCksUy5zLmR0LmRyYXcoITEpKTprJiZTLl9tYWtlU2VsZWN0aW9uKCksQighMSl9O0IoITApLHNldFRpbWVvdXQoTCwxKX0sdy5wcm90b3R5cGUuX2FkZE9wdGlvbj1mdW5jdGlvbihrLFMsQixMLFIscSl7aWYoQXJyYXkuaXNBcnJheShrKXx8ayBpbnN0YW5jZW9mIGUuQXBpKXtpZihrIGluc3RhbmNlb2YgZS5BcGkmJihrPWsudG9BcnJheSgpLFM9Uy50b0FycmF5KCkpLGsubGVuZ3RoPT09Uy5sZW5ndGgpe2Zvcih2YXIgej0wO3o8ay5sZW5ndGg7eisrKXFba1t6XV0/cVtrW3pdXSsrOihxW2tbel1dPTEsUi5wdXNoKHtkaXNwbGF5OlNbel0sZmlsdGVyOmtbel0sc29ydDpCW3pdLHR5cGU6TFt6XX0pKSx0aGlzLnMucm93RGF0YS50b3RhbE9wdGlvbnMrKztyZXR1cm59dGhyb3cgbmV3IEVycm9yKCJkaXNwbGF5IGFuZCBmaWx0ZXIgbm90IHRoZSBzYW1lIGxlbmd0aCIpfWVsc2UgdHlwZW9mIHRoaXMucy5jb2xPcHRzLm9ydGhvZ29uYWw9PSJzdHJpbmciP3Fba10/KHFba10rKyx0aGlzLnMucm93RGF0YS50b3RhbE9wdGlvbnMrKyk6KHFba109MSxSLnB1c2goe2Rpc3BsYXk6UyxmaWx0ZXI6ayxzb3J0OkIsdHlwZTpMfSksdGhpcy5zLnJvd0RhdGEudG90YWxPcHRpb25zKyspOlIucHVzaCh7ZGlzcGxheTpTLGZpbHRlcjprLHNvcnQ6Qix0eXBlOkx9KX0sdy5wcm90b3R5cGUuX2J1aWxkUGFuZT1mdW5jdGlvbihrLFMsQil7dmFyIEw9dGhpcztrPT09dm9pZCAwJiYoaz1bXSksUz09PXZvaWQgMCYmKFM9bnVsbCksQj09PXZvaWQgMCYmKEI9bnVsbCksdGhpcy5zLnNlbGVjdGlvbnM9W107dmFyIFI9dGhpcy5zLmR0LnN0YXRlLmxvYWRlZCgpLHE7aWYodGhpcy5zLmxpc3RTZXQmJihSPXRoaXMucy5kdC5zdGF0ZSgpKSx0aGlzLnMuY29sRXhpc3RzKXt2YXIgej0tMTtpZihSJiZSLnNlYXJjaFBhbmVzJiZSLnNlYXJjaFBhbmVzLnBhbmVzKXtmb3IodmFyIEc9MDtHPFIuc2VhcmNoUGFuZXMucGFuZXMubGVuZ3RoO0crKylpZihSLnNlYXJjaFBhbmVzLnBhbmVzW0ddLmlkPT09dGhpcy5zLmluZGV4KXt6PUc7YnJlYWt9fWlmKCh0aGlzLnMuY29sT3B0cy5zaG93PT09ITF8fHRoaXMucy5jb2xPcHRzLnNob3chPT12b2lkIDAmJnRoaXMucy5jb2xPcHRzLnNob3chPT0hMCkmJno9PT0tMSlyZXR1cm4gdGhpcy5kb20uY29udGFpbmVyLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5oaWRkZW4pLHRoaXMucy5kaXNwbGF5ZWQ9ITEsITE7aWYoKHRoaXMucy5jb2xPcHRzLnNob3c9PT0hMHx8eiE9PS0xKSYmKHRoaXMucy5kaXNwbGF5ZWQ9ITApLCF0aGlzLnMuZHQucGFnZS5pbmZvKCkuc2VydmVyU2lkZSYmKCFTfHwhUy5zZWFyY2hQYW5lc3x8IVMuc2VhcmNoUGFuZXMub3B0aW9ucykpe3RoaXMucy5yb3dEYXRhLmFycmF5RmlsdGVyLmxlbmd0aD09PTAmJih0aGlzLnMucm93RGF0YS50b3RhbE9wdGlvbnM9MCx0aGlzLl9wb3B1bGF0ZVBhbmUoKSx0aGlzLnMucm93RGF0YS5hcnJheU9yaWdpbmFsPXRoaXMucy5yb3dEYXRhLmFycmF5RmlsdGVyLHRoaXMucy5yb3dEYXRhLmJpbnNPcmlnaW5hbD10aGlzLnMucm93RGF0YS5iaW5zKTt2YXIgbnQ9T2JqZWN0LmtleXModGhpcy5zLnJvd0RhdGEuYmluc09yaWdpbmFsKS5sZW5ndGgsdHQ9dGhpcy5fdW5pcXVlUmF0aW8obnQsdGhpcy5zLmR0LnJvd3MoKVswXS5sZW5ndGgpO2lmKHRoaXMucy5kaXNwbGF5ZWQ9PT0hMSYmKCh0aGlzLnMuY29sT3B0cy5zaG93PT09dm9pZCAwJiZ0aGlzLnMuY29sT3B0cy50aHJlc2hvbGQ9PT1udWxsP3R0PnRoaXMuYy50aHJlc2hvbGQ6dHQ+dGhpcy5zLmNvbE9wdHMudGhyZXNob2xkKXx8dGhpcy5zLmNvbE9wdHMuc2hvdyE9PSEwJiZudDw9MSkpe3RoaXMuZG9tLmNvbnRhaW5lci5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuaGlkZGVuKSx0aGlzLnMuZGlzcGxheWVkPSExO3JldHVybn10aGlzLmRvbS5jb250YWluZXIuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnNob3cpLHRoaXMucy5kaXNwbGF5ZWQ9ITB9ZWxzZSBTJiZTLnNlYXJjaFBhbmVzJiZTLnNlYXJjaFBhbmVzLm9wdGlvbnMmJnRoaXMuX3NlcnZlclBvcHVsYXRlKFMpfWVsc2UgdGhpcy5zLmRpc3BsYXllZD0hMDt0aGlzLl9kaXNwbGF5UGFuZSgpLHRoaXMucy5saXN0U2V0fHx0aGlzLmRvbS5kdFAub24oInN0YXRlTG9hZFBhcmFtcy5kdHNwIixmdW5jdGlvbihwdCx2dCxydCl7dC5pc0VtcHR5T2JqZWN0KEwucy5kdC5zdGF0ZS5sb2FkZWQoKSkmJnQuZWFjaChydCxmdW5jdGlvbihndCl7ZGVsZXRlIHJ0W2d0XX0pfSksQiE9PW51bGwmJnRoaXMuZG9tLnBhbmVzQ29udGFpbmVyLmhhcyhCKS5sZW5ndGg+MD90aGlzLmRvbS5jb250YWluZXIuaW5zZXJ0QWZ0ZXIoQik6dGhpcy5kb20ucGFuZXNDb250YWluZXIucHJlcGVuZCh0aGlzLmRvbS5jb250YWluZXIpO3ZhciBldD10LmZuLmRhdGFUYWJsZS5leHQuZXJyTW9kZTt0LmZuLmRhdGFUYWJsZS5leHQuZXJyTW9kZT0ibm9uZSIsdGhpcy5kb20uZHRQLm9uKCJpbml0LmR0IixmdW5jdGlvbihwdCx2dCl7dmFyIHJ0PUwuZG9tLmR0UC5EYXRhVGFibGUoKSxndD1ydC5zZWxlY3Quc3R5bGUoKTtydC5zZWxlY3Quc3R5bGUoZ3QpfSksdGhpcy5zLmR0UGFuZT10aGlzLmRvbS5kdFAuRGF0YVRhYmxlKHQuZXh0ZW5kKCEwLHRoaXMuX2dldFBhbmVDb25maWcoKSx0aGlzLmMuZHRPcHRzLHRoaXMucy5jb2xPcHRzP3RoaXMucy5jb2xPcHRzLmR0T3B0czp7fSx0aGlzLnMuY29sT3B0cy5vcHRpb25zfHwhdGhpcy5zLmNvbEV4aXN0cz97Y3JlYXRlZFJvdzpmdW5jdGlvbihwdCx2dCl7dChwdCkuYWRkQ2xhc3ModnQuY2xhc3NOYW1lKX19OnZvaWQgMCx0aGlzLnMuY3VzdG9tUGFuZVNldHRpbmdzIT09bnVsbCYmdGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncy5kdE9wdHM/dGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncy5kdE9wdHM6e30sdC5mbi5kYXRhVGFibGUudmVyc2lvbkNoZWNrKCIyIik/e2xheW91dDp7Ym90dG9tU3RhcnQ6bnVsbCxib3R0b21FbmQ6bnVsbCx0b3BTdGFydDpudWxsLHRvcEVuZDpudWxsfX06e2RvbToidCJ9KSksdGhpcy5kb20uZHRQLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy50YWJsZSk7dmFyIHd0PSJDdXN0b20gUGFuZSI7aWYodGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncyYmdGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncy5oZWFkZXI/d3Q9dGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncy5oZWFkZXI6dGhpcy5zLmNvbE9wdHMuaGVhZGVyP3d0PXRoaXMucy5jb2xPcHRzLmhlYWRlcjp0aGlzLnMuY29sRXhpc3RzJiYod3Q9dC5mbi5kYXRhVGFibGUudmVyc2lvbkNoZWNrKCIyIik/dGhpcy5zLmR0LmNvbHVtbih0aGlzLnMuaW5kZXgpLnRpdGxlKCk6dGhpcy5zLmR0LnNldHRpbmdzKClbMF0uYW9Db2x1bW5zW3RoaXMucy5pbmRleF0uc1RpdGxlKSx3dD10aGlzLl9lc2NhcGVIVE1MKHd0KSx0aGlzLmRvbS5zZWFyY2hCb3guYXR0cigicGxhY2Vob2xkZXIiLHd0KSx0LmZuLmRhdGFUYWJsZS5leHQuZXJyTW9kZT1ldCx0aGlzLnMuY29sRXhpc3RzKWZvcih2YXIgU3Q9MCxUdD10aGlzLnMucm93RGF0YS5hcnJheUZpbHRlci5sZW5ndGg7U3Q8VHQ7U3QrKylpZih0aGlzLnMuZHQucGFnZS5pbmZvKCkuc2VydmVyU2lkZSl7cT10aGlzLmFkZFJvdyh0aGlzLnMucm93RGF0YS5hcnJheUZpbHRlcltTdF0uZGlzcGxheSx0aGlzLnMucm93RGF0YS5hcnJheUZpbHRlcltTdF0uZmlsdGVyLHRoaXMucy5yb3dEYXRhLmFycmF5RmlsdGVyW1N0XS5zb3J0LHRoaXMucy5yb3dEYXRhLmFycmF5RmlsdGVyW1N0XS50eXBlKTtmb3IodmFyIGt0PTAsTHQ9dGhpcy5zLnNlcnZlclNlbGVjdDtrdDxMdC5sZW5ndGg7a3QrKyl7dmFyIEJ0PUx0W2t0XTtCdC5maWx0ZXI9PT10aGlzLnMucm93RGF0YS5hcnJheUZpbHRlcltTdF0uZmlsdGVyJiYodGhpcy5zLnNlcnZlclNlbGVjdGluZz0hMCxxLnNlbGVjdCgpLHRoaXMucy5zZXJ2ZXJTZWxlY3Rpbmc9ITEpfX1lbHNlIXRoaXMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlJiZ0aGlzLnMucm93RGF0YS5hcnJheUZpbHRlcltTdF0/dGhpcy5hZGRSb3codGhpcy5zLnJvd0RhdGEuYXJyYXlGaWx0ZXJbU3RdLmRpc3BsYXksdGhpcy5zLnJvd0RhdGEuYXJyYXlGaWx0ZXJbU3RdLmZpbHRlcix0aGlzLnMucm93RGF0YS5hcnJheUZpbHRlcltTdF0uc29ydCx0aGlzLnMucm93RGF0YS5hcnJheUZpbHRlcltTdF0udHlwZSk6dGhpcy5zLmR0LnBhZ2UuaW5mbygpLnNlcnZlclNpZGV8fHRoaXMuYWRkUm93KCIiLCIiLCIiLCIiKTsodGhpcy5zLmNvbE9wdHMub3B0aW9uc3x8dGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncyYmdGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncy5vcHRpb25zKSYmdGhpcy5fZ2V0Q29tcGFyaXNvblJvd3MoKSx0aGlzLnMuZHRQYW5lLmRyYXcoKSx0aGlzLnMuZHRQYW5lLnRhYmxlKCkubm9kZSgpLnBhcmVudE5vZGUuc2Nyb2xsVG9wPXRoaXMucy5zY3JvbGxUb3AsdGhpcy5hZGp1c3RUb3BSb3coKSx0aGlzLnNldExpc3RlbmVycygpLHRoaXMucy5saXN0U2V0PSEwO2Zvcih2YXIgJHQ9MCxLdD1rOyR0PEt0Lmxlbmd0aDskdCsrKXt2YXIgRD1LdFskdF07aWYoRClmb3IodmFyIHV0PTAsb3Q9dGhpcy5zLmR0UGFuZS5yb3dzKCkuaW5kZXhlcygpLnRvQXJyYXkoKTt1dDxvdC5sZW5ndGg7dXQrKylxPW90W3V0XSx0aGlzLnMuZHRQYW5lLnJvdyhxKS5kYXRhKCkmJkQuZmlsdGVyPT09dGhpcy5zLmR0UGFuZS5yb3cocSkuZGF0YSgpLmZpbHRlciYmKHRoaXMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlPyh0aGlzLnMuc2VydmVyU2VsZWN0aW5nPSEwLHRoaXMucy5kdFBhbmUucm93KHEpLnNlbGVjdCgpLHRoaXMucy5zZXJ2ZXJTZWxlY3Rpbmc9ITEpOnRoaXMucy5kdFBhbmUucm93KHEpLnNlbGVjdCgpKX1pZih0aGlzLnMuZHQucGFnZS5pbmZvKCkuc2VydmVyU2lkZSYmdGhpcy5zLmR0UGFuZS5zZWFyY2godGhpcy5kb20uc2VhcmNoQm94LnZhbCgpKS5kcmF3KCksKHRoaXMuYy5pbml0Q29sbGFwc2VkJiZ0aGlzLnMuY29sT3B0cy5pbml0Q29sbGFwc2VkIT09ITF8fHRoaXMucy5jb2xPcHRzLmluaXRDb2xsYXBzZWQpJiYodGhpcy5jLmNvbGxhcHNlJiZ0aGlzLnMuY29sT3B0cy5jb2xsYXBzZSE9PSExfHx0aGlzLnMuY29sT3B0cy5jb2xsYXBzZSkmJih0aGlzLnMuZHRQYW5lLnNldHRpbmdzKClbMF0uX2JJbml0Q29tcGxldGU/dGhpcy5jb2xsYXBzZSgpOnRoaXMucy5kdFBhbmUub25lKCJpbml0IixmdW5jdGlvbigpe3JldHVybiBMLmNvbGxhcHNlKCl9KSksUiYmUi5zZWFyY2hQYW5lcyYmUi5zZWFyY2hQYW5lcy5wYW5lcyYmKCFTfHxTLmRyYXc9PT0xKSl7dGhpcy5fcmVsb2FkU2VsZWN0KFIpO2Zvcih2YXIgVj0wLGo9Ui5zZWFyY2hQYW5lcy5wYW5lcztWPGoubGVuZ3RoO1YrKyl7dmFyIEs9altWXTtLLmlkPT09dGhpcy5zLmluZGV4JiYoSy5zZWFyY2hUZXJtJiZLLnNlYXJjaFRlcm0ubGVuZ3RoPjAmJnRoaXMuZG9tLnNlYXJjaEJveC52YWwoSy5zZWFyY2hUZXJtKS50cmlnZ2VyKCJpbnB1dCIpLEsub3JkZXImJnRoaXMucy5kdFBhbmUub3JkZXIoSy5vcmRlcikuZHJhdygpLEsuY29sbGFwc2VkP3RoaXMuY29sbGFwc2UoKTp0aGlzLnNob3coKSl9fXJldHVybiEwfSx3LnByb3RvdHlwZS5fZGlzcGxheVBhbmU9ZnVuY3Rpb24oKXt0aGlzLmRvbS5kdFAuZW1wdHkoKSx0aGlzLmRvbS50b3BSb3cuZW1wdHkoKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMudG9wUm93KSxwYXJzZUludCh0aGlzLmMubGF5b3V0LnNwbGl0KCItIilbMV0sMTApPjMmJnRoaXMuZG9tLmNvbnRhaW5lci5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuc21hbGxHYXApLHRoaXMuZG9tLnRvcFJvdy5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuc3ViUm93c0NvbnRhaW5lcikuYXBwZW5kKHRoaXMuZG9tLnVwcGVyLmFwcGVuZCh0aGlzLmRvbS5zZWFyY2hDb250KSkuYXBwZW5kKHRoaXMuZG9tLmxvd2VyLmFwcGVuZCh0aGlzLmRvbS5idXR0b25Hcm91cCkpLCh0aGlzLmMuZHRPcHRzLnNlYXJjaGluZz09PSExfHx0aGlzLnMuY29sT3B0cy5kdE9wdHMmJnRoaXMucy5jb2xPcHRzLmR0T3B0cy5zZWFyY2hpbmc9PT0hMXx8IXRoaXMuYy5jb250cm9sc3x8IXRoaXMucy5jb2xPcHRzLmNvbnRyb2xzfHx0aGlzLnMuY3VzdG9tUGFuZVNldHRpbmdzJiZ0aGlzLnMuY3VzdG9tUGFuZVNldHRpbmdzLmR0T3B0cyYmdGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncy5kdE9wdHMuc2VhcmNoaW5nIT09dm9pZCAwJiYhdGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncy5kdE9wdHMuc2VhcmNoaW5nKSYmdGhpcy5kb20uc2VhcmNoQm94LnJlbW92ZUNsYXNzKHRoaXMuY2xhc3Nlcy5wYW5lSW5wdXRCdXR0b24pLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5kaXNhYmxlZEJ1dHRvbikuYXR0cigiZGlzYWJsZWQiLCJ0cnVlIiksdGhpcy5kb20uc2VhcmNoQm94LmFwcGVuZFRvKHRoaXMuZG9tLnNlYXJjaENvbnQpLHRoaXMuX3NlYXJjaENvbnRTZXR1cCgpLHRoaXMuYy5jbGVhciYmdGhpcy5jLmNvbnRyb2xzJiZ0aGlzLnMuY29sT3B0cy5jb250cm9scyYmdGhpcy5kb20uY2xlYXIuYXBwZW5kVG8odGhpcy5kb20uYnV0dG9uR3JvdXApLHRoaXMuYy5vcmRlcmFibGUmJnRoaXMucy5jb2xPcHRzLm9yZGVyYWJsZSYmdGhpcy5jLmNvbnRyb2xzJiZ0aGlzLnMuY29sT3B0cy5jb250cm9scyYmdGhpcy5kb20ubmFtZUJ1dHRvbi5hcHBlbmRUbyh0aGlzLmRvbS5idXR0b25Hcm91cCksdGhpcy5jLnZpZXdDb3VudCYmdGhpcy5zLmNvbE9wdHMudmlld0NvdW50JiZ0aGlzLmMub3JkZXJhYmxlJiZ0aGlzLnMuY29sT3B0cy5vcmRlcmFibGUmJnRoaXMuYy5jb250cm9scyYmdGhpcy5zLmNvbE9wdHMuY29udHJvbHMmJnRoaXMuZG9tLmNvdW50QnV0dG9uLmFwcGVuZFRvKHRoaXMuZG9tLmJ1dHRvbkdyb3VwKSwodGhpcy5jLmNvbGxhcHNlJiZ0aGlzLnMuY29sT3B0cy5jb2xsYXBzZSE9PSExfHx0aGlzLnMuY29sT3B0cy5jb2xsYXBzZSkmJnRoaXMuYy5jb250cm9scyYmdGhpcy5zLmNvbE9wdHMuY29udHJvbHMmJnRoaXMuZG9tLmNvbGxhcHNlQnV0dG9uLmFwcGVuZFRvKHRoaXMuZG9tLmJ1dHRvbkdyb3VwKSx0aGlzLmRvbS5jb250YWluZXIucHJlcGVuZCh0aGlzLmRvbS50b3BSb3cpLmFwcGVuZCh0aGlzLmRvbS5kdFApLnNob3coKX0sdy5wcm90b3R5cGUuX2VzY2FwZUhUTUw9ZnVuY3Rpb24oayl7cmV0dXJuIGsudG9TdHJpbmcoKS5yZXBsYWNlKC8mbHQ7L2csIjwiKS5yZXBsYWNlKC8mZ3Q7L2csIj4iKS5yZXBsYWNlKC8mcXVvdDsvZywnIicpLnJlcGxhY2UoLyZhbXA7L2csIiYiKX0sdy5wcm90b3R5cGUuX2dldEJvbnVzT3B0aW9ucz1mdW5jdGlvbigpe3ZhciBrPXt0aHJlc2hvbGQ6bnVsbH07cmV0dXJuIHQuZXh0ZW5kKCEwLHt9LHcuZGVmYXVsdHMsayx0aGlzLmM/dGhpcy5jOnt9KX0sdy5wcm90b3R5cGUuX2dldE9wdGlvbnM9ZnVuY3Rpb24oKXt2YXIgaz10aGlzLnMuZHQsUz17Y29sbGFwc2U6bnVsbCxlbXB0eU1lc3NhZ2U6ITEsaW5pdENvbGxhcHNlZDpudWxsLHRocmVzaG9sZDpudWxsfSxCPWsuc2V0dGluZ3MoKVswXS5hb0NvbHVtbnNbdGhpcy5zLmluZGV4XS5zZWFyY2hQYW5lcyxMPXQuZXh0ZW5kKCEwLHt9LHcuZGVmYXVsdHMsUyxCKTtyZXR1cm4gQiYmQi5oaWRlQ291bnQmJkIudmlld0NvdW50PT09dm9pZCAwJiYoTC52aWV3Q291bnQ9IUIuaGlkZUNvdW50KSxMfSx3LnByb3RvdHlwZS5fcG9wdWxhdGVQYW5lPWZ1bmN0aW9uKCl7dGhpcy5zLnJvd0RhdGEuYXJyYXlGaWx0ZXI9W10sdGhpcy5zLnJvd0RhdGEuYmlucz17fTt2YXIgaz10aGlzLnMuZHQuY29udGV4dFswXTtpZighdGhpcy5zLmR0LnBhZ2UuaW5mbygpLnNlcnZlclNpZGUpZm9yKHZhciBTPTAsQj10aGlzLnMuZHQucm93cygpLmluZGV4ZXMoKS50b0FycmF5KCk7UzxCLmxlbmd0aDtTKyspe3ZhciBMPUJbU107dGhpcy5fcG9wdWxhdGVQYW5lQXJyYXkoTCx0aGlzLnMucm93RGF0YS5hcnJheUZpbHRlcixrKX19LHcucHJvdG90eXBlLl9zZWFyY2g9ZnVuY3Rpb24oayxTKXtmb3IodmFyIEI9dGhpcy5zLmNvbE9wdHMsTD10aGlzLnMuZHQsUj0wLHE9dGhpcy5zLnNlbGVjdGlvbnM7UjxxLmxlbmd0aDtSKyspe3ZhciB6PXFbUl07aWYodHlwZW9mIHo9PSJzdHJpbmciJiZ0eXBlb2Ygaz09InN0cmluZyImJih6PXRoaXMuX2VzY2FwZUhUTUwoeikpLEFycmF5LmlzQXJyYXkoaykpe2lmKEIuY29tYmluZXI9PT0iYW5kIil7aWYoIWsuaW5jbHVkZXMoeikpcmV0dXJuITF9ZWxzZSBpZihrLmluY2x1ZGVzKHopKXJldHVybiEwfWVsc2UgaWYodHlwZW9mIHo9PSJmdW5jdGlvbiIpe2lmKHouY2FsbChMLEwucm93KFMpLmRhdGEoKSxTKSl7aWYoQi5jb21iaW5lcj09PSJvciIpcmV0dXJuITB9ZWxzZSBpZihCLmNvbWJpbmVyPT09ImFuZCIpcmV0dXJuITF9ZWxzZSBpZihrPT09enx8ISh0eXBlb2Ygaz09InN0cmluZyImJmsubGVuZ3RoPT09MCkmJms9PXp8fHo9PT1udWxsJiZ0eXBlb2Ygaz09InN0cmluZyImJms9PT0iIilyZXR1cm4hMH1yZXR1cm4gQi5jb21iaW5lcj09PSJhbmQifSx3LnByb3RvdHlwZS5fc2VhcmNoQ29udFNldHVwPWZ1bmN0aW9uKCl7dGhpcy5jLmNvbnRyb2xzJiZ0aGlzLnMuY29sT3B0cy5jb250cm9scyYmdGhpcy5kb20uc2VhcmNoQnV0dG9uLmFwcGVuZFRvKHRoaXMuZG9tLnNlYXJjaExhYmVsQ29udCksdGhpcy5jLmR0T3B0cy5zZWFyY2hpbmc9PT0hMXx8dGhpcy5zLmNvbE9wdHMuZHRPcHRzLnNlYXJjaGluZz09PSExfHx0aGlzLnMuY3VzdG9tUGFuZVNldHRpbmdzJiZ0aGlzLnMuY3VzdG9tUGFuZVNldHRpbmdzLmR0T3B0cyYmdGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncy5kdE9wdHMuc2VhcmNoaW5nIT09dm9pZCAwJiYhdGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncy5kdE9wdHMuc2VhcmNoaW5nfHx0aGlzLmRvbS5zZWFyY2hMYWJlbENvbnQuYXBwZW5kVG8odGhpcy5kb20uc2VhcmNoQ29udCl9LHcucHJvdG90eXBlLl9zZWFyY2hFeHRyYXM9ZnVuY3Rpb24oKXt2YXIgaz10aGlzLnMudXBkYXRpbmc7dGhpcy5zLnVwZGF0aW5nPSEwO3ZhciBTPXRoaXMucy5kdFBhbmUucm93cyh7c2VsZWN0ZWQ6ITB9KS5kYXRhKCkucGx1Y2soImZpbHRlciIpLnRvQXJyYXkoKSxCPVMuaW5kZXhPZih0aGlzLmVtcHR5TWVzc2FnZSgpKSxMPXQodGhpcy5zLmR0UGFuZS50YWJsZSgpLmNvbnRhaW5lcigpKTtCPi0xJiYoU1tCXT0iIiksUy5sZW5ndGg+MD9MLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5zZWxlY3RlZCk6Uy5sZW5ndGg9PT0wJiZMLnJlbW92ZUNsYXNzKHRoaXMuY2xhc3Nlcy5zZWxlY3RlZCksdGhpcy5zLnVwZGF0aW5nPWt9LHcudmVyc2lvbj0iMi4xLjIiLHcuY2xhc3Nlcz17Ym9yZGVyZWQ6ImR0c3AtYm9yZGVyZWQiLGJ1dHRvbkdyb3VwOiJkdHNwLWJ1dHRvbkdyb3VwIixidXR0b25TdWI6ImR0c3AtYnV0dG9uU3ViIixjYXJldDoiZHRzcC1jYXJldCIsY2xlYXI6ImR0c3AtY2xlYXIiLGNsZWFyQWxsOiJkdHNwLWNsZWFyQWxsIixjbGVhckJ1dHRvbjoiY2xlYXJCdXR0b24iLGNvbGxhcHNlQWxsOiJkdHNwLWNvbGxhcHNlQWxsIixjb2xsYXBzZUJ1dHRvbjoiZHRzcC1jb2xsYXBzZUJ1dHRvbiIsY29udGFpbmVyOiJkdHNwLXNlYXJjaFBhbmUiLGNvdW50QnV0dG9uOiJkdHNwLWNvdW50QnV0dG9uIixkaXNhYmxlZEJ1dHRvbjoiZHRzcC1kaXNhYmxlZEJ1dHRvbiIsaGlkZGVuOiJkdHNwLWhpZGRlbiIsaGlkZToiZHRzcC1oaWRlIixsYXlvdXQ6ImR0c3AtIixuYW1lOiJkdHNwLW5hbWUiLG5hbWVCdXR0b246ImR0c3AtbmFtZUJ1dHRvbiIsbmFtZUNvbnQ6ImR0c3AtbmFtZUNvbnQiLG5hcnJvdzoiZHRzcC1uYXJyb3ciLHBhbmVCdXR0b246ImR0c3AtcGFuZUJ1dHRvbiIscGFuZUlucHV0QnV0dG9uOiJkdHNwLXBhbmVJbnB1dEJ1dHRvbiIscGlsbDoiZHRzcC1waWxsIixyb3RhdGVkOiJkdHNwLXJvdGF0ZWQiLHNlYXJjaDoiZHRzcC1zZWFyY2giLHNlYXJjaENvbnQ6ImR0c3Atc2VhcmNoQ29udCIsc2VhcmNoSWNvbjoiZHRzcC1zZWFyY2hJY29uIixzZWFyY2hMYWJlbENvbnQ6ImR0c3Atc2VhcmNoQnV0dG9uQ29udCIsc2VsZWN0ZWQ6ImR0c3Atc2VsZWN0ZWQiLHNtYWxsR2FwOiJkdHNwLXNtYWxsR2FwIixzdWJSb3cxOiJkdHNwLXN1YlJvdzEiLHN1YlJvdzI6ImR0c3Atc3ViUm93MiIsc3ViUm93c0NvbnRhaW5lcjoiZHRzcC1zdWJSb3dzQ29udGFpbmVyIix0aXRsZToiZHRzcC10aXRsZSIsdG9wUm93OiJkdHNwLXRvcFJvdyJ9LHcuZGVmYXVsdHM9e2NsZWFyOiEwLGNvbGxhcHNlOiEwLGNvbWJpbmVyOiJvciIsY29udGFpbmVyOmZ1bmN0aW9uKGspe3JldHVybiBrLnRhYmxlKCkuY29udGFpbmVyKCl9LGNvbnRyb2xzOiEwLGR0T3B0czp7fSxlbXB0eU1lc3NhZ2U6bnVsbCxoaWRlQ291bnQ6ITEsaTE4bjp7Y2xlYXJQYW5lOiImdGltZXM7Iixjb3VudDoie3RvdGFsfSIsZW1wdHlNZXNzYWdlOiI8ZW0+Tm8gZGF0YTwvZW0+In0saW5pdENvbGxhcHNlZDohMSxsYXlvdXQ6ImF1dG8iLG5hbWU6dm9pZCAwLG9yZGVyYWJsZTohMCxvcnRob2dvbmFsOntkaXNwbGF5OiJkaXNwbGF5IixmaWx0ZXI6ImZpbHRlciIsaGlkZUNvdW50OiExLHNlYXJjaDoiZmlsdGVyIixzaG93OnZvaWQgMCxzb3J0OiJzb3J0Iix0aHJlc2hvbGQ6LjYsdHlwZToidHlwZSIsdmlld0NvdW50OiEwfSxwcmVTZWxlY3Q6W10sdGhyZXNob2xkOi42LHZpZXdDb3VudDohMH0sd30oKSxzPXdpbmRvdyYmd2luZG93Ll9fZXh0ZW5kc3x8ZnVuY3Rpb24oKXt2YXIgdz1mdW5jdGlvbihrLFMpe3JldHVybiB3PU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbihCLEwpe0IuX19wcm90b19fPUx9fHxmdW5jdGlvbihCLEwpe2Zvcih2YXIgUiBpbiBMKUwuaGFzT3duUHJvcGVydHkoUikmJihCW1JdPUxbUl0pfSx3KGssUyl9O3JldHVybiBmdW5jdGlvbihrLFMpe3coayxTKTtmdW5jdGlvbiBCKCl7dGhpcy5jb25zdHJ1Y3Rvcj1rfWsucHJvdG90eXBlPVM9PT1udWxsP09iamVjdC5jcmVhdGUoUyk6KEIucHJvdG90eXBlPVMucHJvdG90eXBlLG5ldyBCKX19KCksaT1mdW5jdGlvbih3KXtzKGssdyk7ZnVuY3Rpb24gayhTLEIsTCxSLHEpe3JldHVybiB3LmNhbGwodGhpcyxTLEIsTCxSLHEpfHx0aGlzfXJldHVybiBrLnByb3RvdHlwZS5fZW1wdHlQYW5lPWZ1bmN0aW9uKCl7dmFyIFM9dGhpcy5zLmR0UGFuZTtpZihhdC52ZXJzaW9uQ2hlY2soIjIiKSl7dmFyIEI9Uy5zZWxlY3QubGFzdCgpLEw7cmV0dXJuIEImJlMucm93KEIucm93KS5hbnkoKSYmKEw9Uy5yb3coQi5yb3cpLmRhdGEoKS5pbmRleCksUy5yb3dzKCkucmVtb3ZlKCksZnVuY3Rpb24oKXtpZihMIT09dm9pZCAwKXt2YXIgUj1TLnJvdyhmdW5jdGlvbihxLHope3JldHVybiB6LmluZGV4PT09TH0pLmluZGV4KCk7Uy5zZWxlY3QubGFzdCh7cm93OlIsY29sdW1uOjB9KX19fXJldHVybiBTLnJvd3MoKS5yZW1vdmUoKSxmdW5jdGlvbigpe319LGsucHJvdG90eXBlLl9zZXJ2ZXJQb3B1bGF0ZT1mdW5jdGlvbihTKXt2YXIgQixMLFI7dGhpcy5zLnJvd0RhdGEuYmluc1Nob3duPXt9LHRoaXMucy5yb3dEYXRhLmFycmF5RmlsdGVyPVtdLFMudGFibGVMZW5ndGghPT12b2lkIDA/KHRoaXMucy50YWJsZUxlbmd0aD1TLnRhYmxlTGVuZ3RoLHRoaXMucy5yb3dEYXRhLnRvdGFsT3B0aW9ucz10aGlzLnMudGFibGVMZW5ndGgpOih0aGlzLnMudGFibGVMZW5ndGg9PT1udWxsfHx0aGlzLnMuZHQucm93cygpWzBdLmxlbmd0aD50aGlzLnMudGFibGVMZW5ndGgpJiYodGhpcy5zLnRhYmxlTGVuZ3RoPXRoaXMucy5kdC5yb3dzKClbMF0ubGVuZ3RoLHRoaXMucy5yb3dEYXRhLnRvdGFsT3B0aW9ucz10aGlzLnMudGFibGVMZW5ndGgpO3ZhciBxPXRoaXMucy5kdC5jb2x1bW4odGhpcy5zLmluZGV4KS5kYXRhU3JjKCk7aWYoUy5zZWFyY2hQYW5lcy5vcHRpb25zW3FdIT09dm9pZCAwKWZvcih2YXIgej0wLEc9Uy5zZWFyY2hQYW5lcy5vcHRpb25zW3FdO3o8Ry5sZW5ndGg7eisrKXt2YXIgbnQ9R1t6XTt0aGlzLnMucm93RGF0YS5hcnJheUZpbHRlci5wdXNoKHtkaXNwbGF5Om50LmxhYmVsLGZpbHRlcjpudC52YWx1ZSxzaG93bjorbnQuY291bnQsc29ydDpudC5sYWJlbCx0b3RhbDorbnQudG90YWwsdHlwZTpudC5sYWJlbH0pLHRoaXMucy5yb3dEYXRhLmJpbnNTaG93bltudC52YWx1ZV09K250LmNvdW50LHRoaXMucy5yb3dEYXRhLmJpbnNbbnQudmFsdWVdPStudC50b3RhbH12YXIgdHQ9T2JqZWN0LmtleXModGhpcy5zLnJvd0RhdGEuYmlucykubGVuZ3RoLGV0PXRoaXMuX3VuaXF1ZVJhdGlvKHR0LHRoaXMucy50YWJsZUxlbmd0aCk7aWYoIXRoaXMucy5jb2xPcHRzLnNob3cmJnRoaXMucy5kaXNwbGF5ZWQ9PT0hMSYmKCh0aGlzLnMuY29sT3B0cy5zaG93PT09dm9pZCAwJiZ0aGlzLnMuY29sT3B0cy50aHJlc2hvbGQ9PT1udWxsP2V0PnRoaXMuYy50aHJlc2hvbGQ6ZXQ+dGhpcy5zLmNvbE9wdHMudGhyZXNob2xkKXx8dGhpcy5zLmNvbE9wdHMuc2hvdyE9PSEwJiZ0dDw9MSkpe3RoaXMuZG9tLmNvbnRhaW5lci5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuaGlkZGVuKSx0aGlzLnMuZGlzcGxheWVkPSExO3JldHVybn1pZih0aGlzLnMucm93RGF0YS5hcnJheU9yaWdpbmFsPXRoaXMucy5yb3dEYXRhLmFycmF5RmlsdGVyLHRoaXMucy5yb3dEYXRhLmJpbnNPcmlnaW5hbD10aGlzLnMucm93RGF0YS5iaW5zLHRoaXMucy5kaXNwbGF5ZWQ9ITAsdGhpcy5zLmR0UGFuZSl7Zm9yKHZhciB3dD10aGlzLnMuc2VydmVyU2VsZWN0LFN0PXRoaXMuX2VtcHR5UGFuZSgpLFR0PTAsa3Q9dGhpcy5zLnJvd0RhdGEuYXJyYXlGaWx0ZXI7VHQ8a3QubGVuZ3RoO1R0KyspaWYoUj1rdFtUdF0sdGhpcy5fc2hvdWxkQWRkUm93KFIpKXtMPXRoaXMuYWRkUm93KFIuZGlzcGxheSxSLmZpbHRlcixSLnNvcnQsUi50eXBlKTtmb3IodmFyIEx0PTA7THQ8d3QubGVuZ3RoO0x0KyspaWYoQj13dFtMdF0sQi5maWx0ZXI9PT1SLmZpbHRlcil7dGhpcy5zLnNlcnZlclNlbGVjdGluZz0hMCxMLnNlbGVjdCgpLHRoaXMucy5zZXJ2ZXJTZWxlY3Rpbmc9ITEsd3Quc3BsaWNlKEx0LDEpLHRoaXMucy5zZWxlY3Rpb25zLnB1c2goUi5maWx0ZXIpO2JyZWFrfX1mb3IodmFyIEJ0PTAsJHQ9d3Q7QnQ8JHQubGVuZ3RoO0J0Kyspe0I9JHRbQnRdO2Zvcih2YXIgS3Q9MCxEPXRoaXMucy5yb3dEYXRhLmFycmF5T3JpZ2luYWw7S3Q8RC5sZW5ndGg7S3QrKylSPURbS3RdLFIuZmlsdGVyPT09Qi5maWx0ZXImJihMPXRoaXMuYWRkUm93KFIuZGlzcGxheSxSLmZpbHRlcixSLnNvcnQsUi50eXBlKSx0aGlzLnMuc2VydmVyU2VsZWN0aW5nPSEwLEwuc2VsZWN0KCksdGhpcy5zLnNlcnZlclNlbGVjdGluZz0hMSx0aGlzLnMuc2VsZWN0aW9ucy5wdXNoKFIuZmlsdGVyKSl9dGhpcy5zLnNlcnZlclNlbGVjdD10aGlzLnMuZHRQYW5lLnJvd3Moe3NlbGVjdGVkOiEwfSkuZGF0YSgpLnRvQXJyYXkoKSx0aGlzLnMuZHRQYW5lLmRyYXcoKSxTdCgpfX0say5wcm90b3R5cGUudXBkYXRlUm93cz1mdW5jdGlvbigpe2lmKCF0aGlzLnMuZHQucGFnZS5pbmZvKCkuc2VydmVyU2lkZSl7dGhpcy5zLnJvd0RhdGEuYmluc1Nob3duPXt9O2Zvcih2YXIgUz0wLEI9dGhpcy5zLmR0LnJvd3Moe3NlYXJjaDoiYXBwbGllZCJ9KS5pbmRleGVzKCkudG9BcnJheSgpO1M8Qi5sZW5ndGg7UysrKXt2YXIgTD1CW1NdO3RoaXMuX3VwZGF0ZVNob3duKEwsdGhpcy5zLmR0LnNldHRpbmdzKClbMF0sdGhpcy5zLnJvd0RhdGEuYmluc1Nob3duKX19Zm9yKHZhciBSPWZ1bmN0aW9uKHR0KXt0dC5zaG93bj10eXBlb2YgcS5zLnJvd0RhdGEuYmluc1Nob3duW3R0LmZpbHRlcl09PSJudW1iZXIiP3Eucy5yb3dEYXRhLmJpbnNTaG93blt0dC5maWx0ZXJdOjAscS5zLmR0UGFuZS5yb3coZnVuY3Rpb24oZXQsd3Qpe3JldHVybiB3dCYmd3QuaW5kZXg9PT10dC5pbmRleH0pLmRhdGEodHQpfSxxPXRoaXMsej0wLEc9dGhpcy5zLmR0UGFuZS5yb3dzKCkuZGF0YSgpLnRvQXJyYXkoKTt6PEcubGVuZ3RoO3orKyl7dmFyIG50PUdbel07UihudCl9dGhpcy5zLmR0UGFuZS5kcmF3KCksdGhpcy5zLmR0UGFuZS50YWJsZSgpLm5vZGUoKS5wYXJlbnROb2RlLnNjcm9sbFRvcD10aGlzLnMuc2Nyb2xsVG9wfSxrLnByb3RvdHlwZS5fbWFrZVNlbGVjdGlvbj1mdW5jdGlvbigpe30say5wcm90b3R5cGUuX3JlbG9hZFNlbGVjdD1mdW5jdGlvbigpe30say5wcm90b3R5cGUuX3Nob3VsZEFkZFJvdz1mdW5jdGlvbihTKXtyZXR1cm4hMH0say5wcm90b3R5cGUuX3VwZGF0ZVNlbGVjdGlvbj1mdW5jdGlvbigpe3RoaXMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlJiYhdGhpcy5zLnVwZGF0aW5nJiYhdGhpcy5zLnNlcnZlclNlbGVjdGluZyYmKHRoaXMucy5zZXJ2ZXJTZWxlY3Q9dGhpcy5zLmR0UGFuZS5yb3dzKHtzZWxlY3RlZDohMH0pLmRhdGEoKS50b0FycmF5KCkpfSxrLnByb3RvdHlwZS5fdXBkYXRlU2hvd249ZnVuY3Rpb24oUyxCLEwpe0w9PT12b2lkIDAmJihMPXRoaXMucy5yb3dEYXRhLmJpbnNTaG93bik7dmFyIFI9dHlwZW9mIHRoaXMucy5jb2xPcHRzLm9ydGhvZ29uYWw9PSJzdHJpbmciP3RoaXMucy5jb2xPcHRzLm9ydGhvZ29uYWw6dGhpcy5zLmNvbE9wdHMub3J0aG9nb25hbC5zZWFyY2gscT1CLmZhc3REYXRhP0IuZmFzdERhdGE6ZnVuY3Rpb24od3QsU3QsVHQpe3JldHVybiBCLm9BcGkuX2ZuR2V0Q2VsbERhdGEoQix3dCxTdCxUdCl9LHo9cShTLHRoaXMucy5pbmRleCxSKSxHPWZ1bmN0aW9uKHd0KXtMW3d0XT9MW3d0XSsrOkxbd3RdPTF9O2lmKEFycmF5LmlzQXJyYXkoeikpZm9yKHZhciBudD0wLHR0PXo7bnQ8dHQubGVuZ3RoO250Kyspe3ZhciBldD10dFtudF07RyhldCl9ZWxzZSBHKHopfSxrfShyKSxvPXdpbmRvdyYmd2luZG93Ll9fZXh0ZW5kc3x8ZnVuY3Rpb24oKXt2YXIgdz1mdW5jdGlvbihrLFMpe3JldHVybiB3PU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbihCLEwpe0IuX19wcm90b19fPUx9fHxmdW5jdGlvbihCLEwpe2Zvcih2YXIgUiBpbiBMKUwuaGFzT3duUHJvcGVydHkoUikmJihCW1JdPUxbUl0pfSx3KGssUyl9O3JldHVybiBmdW5jdGlvbihrLFMpe3coayxTKTtmdW5jdGlvbiBCKCl7dGhpcy5jb25zdHJ1Y3Rvcj1rfWsucHJvdG90eXBlPVM9PT1udWxsP09iamVjdC5jcmVhdGUoUyk6KEIucHJvdG90eXBlPVMucHJvdG90eXBlLG5ldyBCKX19KCksdTtmdW5jdGlvbiBwKHcpe3U9d312YXIgYj1mdW5jdGlvbih3KXtvKGssdyk7ZnVuY3Rpb24gayhTLEIsTCxSLHEpe3ZhciB6PXRoaXMsRz17aTE4bjp7Y291bnRGaWx0ZXJlZDoie3Nob3dufSAoe3RvdGFsfSkifX07cmV0dXJuIHo9dy5jYWxsKHRoaXMsUyx1LmV4dGVuZChHLEIpLEwsUixxKXx8dGhpcyx6fXJldHVybiBrLnByb3RvdHlwZS5fZ2V0TWVzc2FnZT1mdW5jdGlvbihTKXt2YXIgQj10aGlzLnMuZHQuaTE4bigic2VhcmNoUGFuZXMuY291bnQiLHRoaXMuYy5pMThuLmNvdW50KSxMPXRoaXMucy5kdC5pMThuKCJzZWFyY2hQYW5lcy5jb3VudEZpbHRlcmVkIix0aGlzLmMuaTE4bi5jb3VudEZpbHRlcmVkKTtyZXR1cm4odGhpcy5zLmZpbHRlcmluZ0FjdGl2ZT9MOkIpLnJlcGxhY2UoL3t0b3RhbH0vZyxTLnRvdGFsKS5yZXBsYWNlKC97c2hvd259L2csUy5zaG93bil9LGsucHJvdG90eXBlLl9nZXRTaG93bj1mdW5jdGlvbihTKXtyZXR1cm4gdGhpcy5zLnJvd0RhdGEuYmluc1Nob3duJiZ0aGlzLnMucm93RGF0YS5iaW5zU2hvd25bU10/dGhpcy5zLnJvd0RhdGEuYmluc1Nob3duW1NdOjB9LGt9KGkpLGc9d2luZG93JiZ3aW5kb3cuX19leHRlbmRzfHxmdW5jdGlvbigpe3ZhciB3PWZ1bmN0aW9uKGssUyl7cmV0dXJuIHc9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKEIsTCl7Qi5fX3Byb3RvX189TH18fGZ1bmN0aW9uKEIsTCl7Zm9yKHZhciBSIGluIEwpTC5oYXNPd25Qcm9wZXJ0eShSKSYmKEJbUl09TFtSXSl9LHcoayxTKX07cmV0dXJuIGZ1bmN0aW9uKGssUyl7dyhrLFMpO2Z1bmN0aW9uIEIoKXt0aGlzLmNvbnN0cnVjdG9yPWt9ay5wcm90b3R5cGU9Uz09PW51bGw/T2JqZWN0LmNyZWF0ZShTKTooQi5wcm90b3R5cGU9Uy5wcm90b3R5cGUsbmV3IEIpfX0oKSxtO2Z1bmN0aW9uIEModyl7bT13fXZhciB5PWZ1bmN0aW9uKHcpe2coayx3KTtmdW5jdGlvbiBrKFMsQixMLFIscSl7dmFyIHo9dGhpcyxHPXtpMThuOntjb3VudDoie3Nob3dufSJ9fTtyZXR1cm4gej13LmNhbGwodGhpcyxTLG0uZXh0ZW5kKEcsQiksTCxSLHEpfHx0aGlzLHp9cmV0dXJuIGsucHJvdG90eXBlLnVwZGF0ZVJvd3M9ZnVuY3Rpb24oKXt2YXIgUz10aGlzLnMuZHRQYW5lLnJvd3Moe3NlbGVjdGVkOiEwfSkuZGF0YSgpLnRvQXJyYXkoKSxCO2lmKHRoaXMucy5jb2xPcHRzLm9wdGlvbnN8fHRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3MmJnRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3Mub3B0aW9ucyl7dGhpcy5fZ2V0Q29tcGFyaXNvblJvd3MoKTtmb3IodmFyIEw9dGhpcy5zLmR0UGFuZS5yb3dzKCkudG9BcnJheSgpWzBdLFI9MDtSPEwubGVuZ3RoO1IrKyl7dmFyIHE9dGhpcy5zLmR0UGFuZS5yb3coTFtSXSksej1xLmRhdGEoKTtpZih6IT09dm9pZCAwKXtpZih6LnNob3duPT09MCl7cS5yZW1vdmUoKSxMPXRoaXMucy5kdFBhbmUucm93cygpLnRvQXJyYXkoKVswXSxSLS07Y29udGludWV9Zm9yKHZhciBHPTAsbnQ9UztHPG50Lmxlbmd0aDtHKyspaWYoQj1udFtHXSx6LmZpbHRlcj09PUIuZmlsdGVyKXtxLnNlbGVjdCgpLFMuc3BsaWNlKFIsMSksdGhpcy5zLnNlbGVjdGlvbnMucHVzaCh6LmZpbHRlcik7YnJlYWt9fX19ZWxzZXtpZighdGhpcy5zLmR0LnBhZ2UuaW5mbygpLnNlcnZlclNpZGUpe3RoaXMuX2FjdGl2ZVBvcHVsYXRlUGFuZSgpLHRoaXMucy5yb3dEYXRhLmJpbnNTaG93bj17fTtmb3IodmFyIHR0PTAsZXQ9dGhpcy5zLmR0LnJvd3Moe3NlYXJjaDoiYXBwbGllZCJ9KS5pbmRleGVzKCkudG9BcnJheSgpO3R0PGV0Lmxlbmd0aDt0dCsrKXt2YXIgd3Q9ZXRbdHRdO3RoaXMuX3VwZGF0ZVNob3duKHd0LHRoaXMucy5kdC5zZXR0aW5ncygpWzBdLHRoaXMucy5yb3dEYXRhLmJpbnNTaG93bil9fXRoaXMucy5kdFBhbmUucm93cygpLnJlbW92ZSgpO2Zvcih2YXIgU3Q9MCxUdD10aGlzLnMucm93RGF0YS5hcnJheUZpbHRlcjtTdDxUdC5sZW5ndGg7U3QrKyl7dmFyIGt0PVR0W1N0XTtpZihrdC5zaG93biE9PTApZm9yKHZhciBMdD10aGlzLmFkZFJvdyhrdC5kaXNwbGF5LGt0LmZpbHRlcixrdC5zb3J0LGt0LnR5cGUsdm9pZCAwKSxCdD0wO0J0PFMubGVuZ3RoO0J0Kyspe3ZhciAkdD1TW0J0XTtpZigkdC5maWx0ZXI9PT1rdC5maWx0ZXIpe0x0LnNlbGVjdCgpLFMuc3BsaWNlKEJ0LDEpLHRoaXMucy5zZWxlY3Rpb25zLnB1c2goa3QuZmlsdGVyKTticmVha319fWZvcih2YXIgS3Q9MCxEPVM7S3Q8RC5sZW5ndGg7S3QrKyl7Qj1EW0t0XTtmb3IodmFyIHV0PTAsb3Q9dGhpcy5zLnJvd0RhdGEuYXJyYXlPcmlnaW5hbDt1dDxvdC5sZW5ndGg7dXQrKyl7dmFyIFY9b3RbdXRdO2lmKFYuZmlsdGVyPT09Qi5maWx0ZXIpe3ZhciBqPXRoaXMuYWRkUm93KFYuZGlzcGxheSxWLmZpbHRlcixWLnNvcnQsVi50eXBlLHZvaWQgMCk7ai5zZWxlY3QoKSx0aGlzLnMuc2VsZWN0aW9ucy5wdXNoKFYuZmlsdGVyKX19fX10aGlzLnMuZHRQYW5lLmRyYXcoKSx0aGlzLnMuZHRQYW5lLnRhYmxlKCkubm9kZSgpLnBhcmVudE5vZGUuc2Nyb2xsVG9wPXRoaXMucy5zY3JvbGxUb3AsdGhpcy5zLmR0LnBhZ2UuaW5mbygpLnNlcnZlclNpZGV8fHRoaXMucy5kdC5kcmF3KCExKX0say5wcm90b3R5cGUuX2FjdGl2ZVBvcHVsYXRlUGFuZT1mdW5jdGlvbigpe3RoaXMucy5yb3dEYXRhLmFycmF5RmlsdGVyPVtdLHRoaXMucy5yb3dEYXRhLmJpbnM9e307dmFyIFM9dGhpcy5zLmR0LnNldHRpbmdzKClbMF07aWYoIXRoaXMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlKWZvcih2YXIgQj0wLEw9dGhpcy5zLmR0LnJvd3Moe3NlYXJjaDoiYXBwbGllZCJ9KS5pbmRleGVzKCkudG9BcnJheSgpO0I8TC5sZW5ndGg7QisrKXt2YXIgUj1MW0JdO3RoaXMuX3BvcHVsYXRlUGFuZUFycmF5KFIsdGhpcy5zLnJvd0RhdGEuYXJyYXlGaWx0ZXIsUyl9fSxrLnByb3RvdHlwZS5fZ2V0Q29tcGFyaXNvblJvd3M9ZnVuY3Rpb24oKXt2YXIgUz10aGlzLnMuY29sT3B0cy5vcHRpb25zP3RoaXMucy5jb2xPcHRzLm9wdGlvbnM6dGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncyYmdGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncy5vcHRpb25zP3RoaXMucy5jdXN0b21QYW5lU2V0dGluZ3Mub3B0aW9uczp2b2lkIDA7aWYoUyE9PXZvaWQgMCl7dmFyIEI9dGhpcy5zLmR0LnJvd3MoKSxMPXRoaXMucy5kdC5yb3dzKHtzZWFyY2g6ImFwcGxpZWQifSksUj1CLmRhdGEoKS50b0FycmF5KCkscT1MLmRhdGEoKS50b0FycmF5KCksej1bXTt0aGlzLnMuZHRQYW5lLmNsZWFyKCksdGhpcy5zLmluZGV4ZXM9W107Zm9yKHZhciBHPTAsbnQ9UztHPG50Lmxlbmd0aDtHKyspe3ZhciB0dD1udFtHXSxldD10dC5sYWJlbCE9PSIiP3R0LmxhYmVsOnRoaXMuZW1wdHlNZXNzYWdlKCksd3Q9e2NsYXNzTmFtZTp0dC5jbGFzc05hbWUsZGlzcGxheTpldCxmaWx0ZXI6dHlwZW9mIHR0LnZhbHVlPT0iZnVuY3Rpb24iP3R0LnZhbHVlOltdLHNob3duOjAsc29ydDpldCx0b3RhbDowLHR5cGU6ZXR9O2lmKHR5cGVvZiB0dC52YWx1ZT09ImZ1bmN0aW9uIil7Zm9yKHZhciBTdD0wO1N0PFIubGVuZ3RoO1N0KyspdHQudmFsdWUuY2FsbCh0aGlzLnMuZHQsUltTdF0sQlswXVtTdF0pJiZ3dC50b3RhbCsrO2Zvcih2YXIgVHQ9MDtUdDxxLmxlbmd0aDtUdCsrKXR0LnZhbHVlLmNhbGwodGhpcy5zLmR0LHFbVHRdLExbMF1bVHRdKSYmd3Quc2hvd24rKzt0eXBlb2Ygd3QuZmlsdGVyIT0iZnVuY3Rpb24iJiZ3dC5maWx0ZXIucHVzaCh0dC5maWx0ZXIpfXoucHVzaCh0aGlzLmFkZFJvdyh3dC5kaXNwbGF5LHd0LmZpbHRlcix3dC5zb3J0LHd0LnR5cGUsd3QuY2xhc3NOYW1lLHd0LnRvdGFsLHd0LnNob3duKSl9cmV0dXJuIHp9fSxrLnByb3RvdHlwZS5fZ2V0TWVzc2FnZT1mdW5jdGlvbihTKXtyZXR1cm4gdGhpcy5zLmR0LmkxOG4oInNlYXJjaFBhbmVzLmNvdW50Iix0aGlzLmMuaTE4bi5jb3VudCkucmVwbGFjZSgve3RvdGFsfS9nLFMudG90YWwpLnJlcGxhY2UoL3tzaG93bn0vZyxTLnNob3duKX0say5wcm90b3R5cGUuX2dldFNob3duPWZ1bmN0aW9uKFMpe3JldHVybiB0aGlzLnMucm93RGF0YS5iaW5zU2hvd24mJnRoaXMucy5yb3dEYXRhLmJpbnNTaG93bltTXT90aGlzLnMucm93RGF0YS5iaW5zU2hvd25bU106MH0say5wcm90b3R5cGUuX3Nob3VsZEFkZFJvdz1mdW5jdGlvbihTKXtyZXR1cm4gUy5zaG93bj4wfSxrfShpKSxUPXdpbmRvdyYmd2luZG93Ll9fZXh0ZW5kc3x8ZnVuY3Rpb24oKXt2YXIgdz1mdW5jdGlvbihrLFMpe3JldHVybiB3PU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbihCLEwpe0IuX19wcm90b19fPUx9fHxmdW5jdGlvbihCLEwpe2Zvcih2YXIgUiBpbiBMKUwuaGFzT3duUHJvcGVydHkoUikmJihCW1JdPUxbUl0pfSx3KGssUyl9O3JldHVybiBmdW5jdGlvbihrLFMpe3coayxTKTtmdW5jdGlvbiBCKCl7dGhpcy5jb25zdHJ1Y3Rvcj1rfWsucHJvdG90eXBlPVM9PT1udWxsP09iamVjdC5jcmVhdGUoUyk6KEIucHJvdG90eXBlPVMucHJvdG90eXBlLG5ldyBCKX19KCksUDtmdW5jdGlvbiBjKHcpe1A9d312YXIgbD1mdW5jdGlvbih3KXtUKGssdyk7ZnVuY3Rpb24gayhTLEIsTCxSLHEpe3ZhciB6PXRoaXMsRz17aTE4bjp7Y291bnQ6Int0b3RhbH0iLGNvdW50RmlsdGVyZWQ6IntzaG93bn0gKHt0b3RhbH0pIn19O3JldHVybiB6PXcuY2FsbCh0aGlzLFMsUC5leHRlbmQoRyxCKSxMLFIscSl8fHRoaXMsen1yZXR1cm4gay5wcm90b3R5cGUuX2FjdGl2ZVBvcHVsYXRlUGFuZT1mdW5jdGlvbigpe3RoaXMucy5yb3dEYXRhLmFycmF5RmlsdGVyPVtdLHRoaXMucy5yb3dEYXRhLmJpbnNTaG93bj17fTt2YXIgUz10aGlzLnMuZHQuc2V0dGluZ3MoKVswXTtpZighdGhpcy5zLmR0LnBhZ2UuaW5mbygpLnNlcnZlclNpZGUpZm9yKHZhciBCPTAsTD10aGlzLnMuZHQucm93cyh7c2VhcmNoOiJhcHBsaWVkIn0pLmluZGV4ZXMoKS50b0FycmF5KCk7QjxMLmxlbmd0aDtCKyspe3ZhciBSPUxbQl07dGhpcy5fcG9wdWxhdGVQYW5lQXJyYXkoUix0aGlzLnMucm93RGF0YS5hcnJheUZpbHRlcixTLHRoaXMucy5yb3dEYXRhLmJpbnNTaG93bil9fSxrLnByb3RvdHlwZS5fZ2V0TWVzc2FnZT1mdW5jdGlvbihTKXt2YXIgQj10aGlzLnMuZHQuaTE4bigic2VhcmNoUGFuZXMuY291bnQiLHRoaXMuYy5pMThuLmNvdW50KSxMPXRoaXMucy5kdC5pMThuKCJzZWFyY2hQYW5lcy5jb3VudEZpbHRlcmVkIix0aGlzLmMuaTE4bi5jb3VudEZpbHRlcmVkKTtyZXR1cm4odGhpcy5zLmZpbHRlcmluZ0FjdGl2ZT9MOkIpLnJlcGxhY2UoL3t0b3RhbH0vZyxTLnRvdGFsKS5yZXBsYWNlKC97c2hvd259L2csUy5zaG93bil9LGt9KHkpLGgsXztmdW5jdGlvbiBGKHcpe2g9dyxfPXcuZm4uZGF0YVRhYmxlfXZhciBPPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdyhrLFMsQixMKXt2YXIgUj10aGlzO2lmKEI9PT12b2lkIDAmJihCPSExKSxMPT09dm9pZCAwJiYoTD1yKSwhX3x8IV8udmVyc2lvbkNoZWNrfHwhXy52ZXJzaW9uQ2hlY2soIjEuMTAuMCIpKXRocm93IG5ldyBFcnJvcigiU2VhcmNoUGFuZSByZXF1aXJlcyBEYXRhVGFibGVzIDEuMTAgb3IgbmV3ZXIiKTtpZighXy5zZWxlY3QpdGhyb3cgbmV3IEVycm9yKCJTZWFyY2hQYW5lIHJlcXVpcmVzIFNlbGVjdCIpO3ZhciBxPW5ldyBfLkFwaShrKTtpZih0aGlzLmNsYXNzZXM9aC5leHRlbmQoITAse30sdy5jbGFzc2VzKSx0aGlzLmM9aC5leHRlbmQoITAse30sdy5kZWZhdWx0cyxTKSx0aGlzLmRvbT17Y2xlYXJBbGw6aCgnPGJ1dHRvbiB0eXBlPSJidXR0b24iLz4nKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuY2xlYXJBbGwpLmh0bWwocS5pMThuKCJzZWFyY2hQYW5lcy5jbGVhck1lc3NhZ2UiLHRoaXMuYy5pMThuLmNsZWFyTWVzc2FnZSkpLGNvbGxhcHNlQWxsOmgoJzxidXR0b24gdHlwZT0iYnV0dG9uIi8+JykuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmNvbGxhcHNlQWxsKS5odG1sKHEuaTE4bigic2VhcmNoUGFuZXMuY29sbGFwc2VNZXNzYWdlIix0aGlzLmMuaTE4bi5jb2xsYXBzZU1lc3NhZ2UpKSxjb250YWluZXI6aCgiPGRpdi8+IikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnBhbmVzKS5odG1sKHEuaTE4bigic2VhcmNoUGFuZXMubG9hZE1lc3NhZ2UiLHRoaXMuYy5pMThuLmxvYWRNZXNzYWdlKSksZW1wdHlNZXNzYWdlOmgoIjxkaXYvPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5lbXB0eU1lc3NhZ2UpLHBhbmVzOmgoIjxkaXYvPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5jb250YWluZXIpLHNob3dBbGw6aCgnPGJ1dHRvbiB0eXBlPSJidXR0b24iLz4nKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuc2hvd0FsbCkuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmRpc2FibGVkQnV0dG9uKS5hdHRyKCJkaXNhYmxlZCIsInRydWUiKS5odG1sKHEuaTE4bigic2VhcmNoUGFuZXMuc2hvd01lc3NhZ2UiLHRoaXMuYy5pMThuLnNob3dNZXNzYWdlKSksdGl0bGU6aCgiPGRpdi8+IikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnRpdGxlKSx0aXRsZVJvdzpoKCI8ZGl2Lz4iKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMudGl0bGVSb3cpfSx0aGlzLnM9e2NvbE9wdHM6W10sZHQ6cSxmaWx0ZXJDb3VudDowLG1pblBhbmVXaWR0aDoyNjAscGFnZTowLHBhZ2luZzohMSxwYWdpbmdTVDohMSxwYW5lQ2xhc3M6TCxwYW5lczpbXSxzZWxlY3Rpb25MaXN0OltdLHNlcnZlckRhdGE6e30sc3RhdGVSZWFkOiExLHVwZGF0aW5nOiExfSwhcS5zZXR0aW5ncygpWzBdLl9zZWFyY2hQYW5lcyl7aWYoaChkb2N1bWVudCkub24oImRyYXcuZHQiLGZ1bmN0aW9uKEcpe1IuZG9tLmNvbnRhaW5lci5maW5kKEcudGFyZ2V0KS5sZW5ndGgmJlIuX3VwZGF0ZUZpbHRlckNvdW50KCl9KSx0aGlzLl9nZXRTdGF0ZSgpLHRoaXMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlKXt2YXIgej10aGlzLnMuZHQuc2V0dGluZ3MoKVswXTt0aGlzLnMuZHQub24oInByZVhoci5kdHNwcyIsZnVuY3Rpb24oRyxudCx0dCl7aWYoej09PW50KXt0dC5zZWFyY2hQYW5lcz09PXZvaWQgMCYmKHR0LnNlYXJjaFBhbmVzPXt9KSx0dC5zZWFyY2hQYW5lc19udWxsPT09dm9pZCAwJiYodHQuc2VhcmNoUGFuZXNfbnVsbD17fSk7Zm9yKHZhciBldCx3dD0wLFN0PVIucy5zZWxlY3Rpb25MaXN0O3d0PFN0Lmxlbmd0aDt3dCsrKXt2YXIgVHQ9U3Rbd3RdO2V0PVIucy5kdC5jb2x1bW4oVHQuY29sdW1uKS5kYXRhU3JjKCksdHQuc2VhcmNoUGFuZXNbZXRdPT09dm9pZCAwJiYodHQuc2VhcmNoUGFuZXNbZXRdPXt9KSx0dC5zZWFyY2hQYW5lc19udWxsW2V0XT09PXZvaWQgMCYmKHR0LnNlYXJjaFBhbmVzX251bGxbZXRdPXt9KTtmb3IodmFyIGt0PTA7a3Q8VHQucm93cy5sZW5ndGg7a3QrKyl0dC5zZWFyY2hQYW5lc1tldF1ba3RdPVR0LnJvd3Nba3RdLHR0LnNlYXJjaFBhbmVzW2V0XVtrdF09PT1udWxsP3R0LnNlYXJjaFBhbmVzX251bGxbZXRdW2t0XT0hMDp0dC5zZWFyY2hQYW5lc19udWxsW2V0XVtrdF09ITF9Ui5zLnNlbGVjdGlvbkxpc3QubGVuZ3RoPjAmJih0dC5zZWFyY2hQYW5lc0xhc3Q9ZXQpLHR0LnNlYXJjaFBhbmVzX29wdGlvbnM9e2Nhc2NhZGU6Ui5jLmNhc2NhZGVQYW5lcyx2aWV3Q291bnQ6Ui5jLnZpZXdDb3VudCx2aWV3VG90YWw6Ui5jLnZpZXdUb3RhbH19fSl9cmV0dXJuIHRoaXMuX3NldFhIUigpLHEuc2V0dGluZ3MoKVswXS5fc2VhcmNoUGFuZXM9dGhpcyx0aGlzLnMuZHQuc2V0dGluZ3MoKVswXS5fYkluaXRDb21wbGV0ZXx8Qj90aGlzLl9wYW5lRGVjbGFyZShxLGssUyk6cS5vbmUoInByZUluaXQuZHRzcHMiLGZ1bmN0aW9uKCl7Ui5fcGFuZURlY2xhcmUocSxrLFMpfSksdGhpc319cmV0dXJuIHcucHJvdG90eXBlLmNsZWFyU2VsZWN0aW9ucz1mdW5jdGlvbigpe2Zvcih2YXIgayxTPTAsQj10aGlzLnMucGFuZXM7UzxCLmxlbmd0aDtTKyspaz1CW1NdLGsucy5kdFBhbmUmJihrLnMuc2Nyb2xsVG9wPWsucy5kdFBhbmUudGFibGUoKS5ub2RlKCkucGFyZW50Tm9kZS5zY3JvbGxUb3ApO3ZhciBMPXRoaXMuZG9tLmNvbnRhaW5lci5maW5kKCIuIit0aGlzLmNsYXNzZXMuc2VhcmNoLnJlcGxhY2UoL1xzKy9nLCIuIikpO0wuZWFjaChmdW5jdGlvbigpe2godGhpcykudmFsKCIiKS50cmlnZ2VyKCJpbnB1dCIpfSksdGhpcy5zLnNlbGVjdGlvbkxpc3Q9W107Zm9yKHZhciBSPVtdLHE9MCx6PXRoaXMucy5wYW5lcztxPHoubGVuZ3RoO3ErKylrPXpbcV0say5zLmR0UGFuZSYmUi5wdXNoKGsuY2xlYXJQYW5lKCkpO3JldHVybiBSfSx3LnByb3RvdHlwZS5nZXROb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tLmNvbnRhaW5lcn0sdy5wcm90b3R5cGUucmVidWlsZD1mdW5jdGlvbihrLFMpe2s9PT12b2lkIDAmJihrPSExKSxTPT09dm9pZCAwJiYoUz0hMSksdGhpcy5kb20uZW1wdHlNZXNzYWdlLmRldGFjaCgpLGs9PT0hMSYmdGhpcy5kb20ucGFuZXMuZW1wdHkoKTtmb3IodmFyIEI9W10sTD0wLFI9dGhpcy5zLnBhbmVzO0w8Ui5sZW5ndGg7TCsrKXt2YXIgcT1SW0xdOyhrPT09ITF8fHEucy5pbmRleD09PWspJiYocS5jbGVhckRhdGEoKSxxLnJlYnVpbGRQYW5lKHRoaXMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlP3RoaXMucy5zZXJ2ZXJEYXRhOnZvaWQgMCxTKSx0aGlzLmRvbS5wYW5lcy5hcHBlbmQocS5kb20uY29udGFpbmVyKSxCLnB1c2gocSkpfXJldHVybiB0aGlzLl91cGRhdGVTZWxlY3Rpb24oKSx0aGlzLl91cGRhdGVGaWx0ZXJDb3VudCgpLHRoaXMuX2F0dGFjaFBhbmVDb250YWluZXIoKSx0aGlzLl9pbml0U2VsZWN0aW9uTGlzdGVuZXJzKCExKSx0aGlzLnMuZHQuZHJhdyghUyksdGhpcy5yZXNpemVQYW5lcygpLEIubGVuZ3RoPT09MT9CWzBdOkJ9LHcucHJvdG90eXBlLnJlc2l6ZVBhbmVzPWZ1bmN0aW9uKCl7dmFyIGs7aWYodGhpcy5jLmxheW91dD09PSJhdXRvIil7Zm9yKHZhciBTPWgodGhpcy5zLmR0LnNlYXJjaFBhbmVzLmNvbnRhaW5lcigpKS53aWR0aCgpLEI9TWF0aC5mbG9vcihTL3RoaXMucy5taW5QYW5lV2lkdGgpLEw9MSxSPTAscT1bXSx6PTAsRz10aGlzLnMucGFuZXM7ejxHLmxlbmd0aDt6Kyspaz1HW3pdLGsucy5kaXNwbGF5ZWQmJnEucHVzaChrLnMuaW5kZXgpO3ZhciBudD1xLmxlbmd0aDtpZihCPT09bnQpTD1CO2Vsc2UgZm9yKHZhciB0dD1CO3R0PjE7dHQtLSl7dmFyIGV0PW50JXR0O2lmKGV0PT09MCl7TD10dCxSPTA7YnJlYWt9ZWxzZSBldD5SJiYoTD10dCxSPWV0KX12YXIgd3Q9UiE9PTA/cS5zbGljZShxLmxlbmd0aC1SLHEubGVuZ3RoKTpbXTt0aGlzLnMucGFuZXMuZm9yRWFjaChmdW5jdGlvbihrdCl7a3Qucy5kaXNwbGF5ZWQmJmt0LnJlc2l6ZSgiY29sdW1ucy0iKyh3dC5pbmNsdWRlcyhrdC5zLmluZGV4KT9SOkwpKX0pfWVsc2UgZm9yKHZhciBTdD0wLFR0PXRoaXMucy5wYW5lcztTdDxUdC5sZW5ndGg7U3QrKylrPVR0W1N0XSxrLmFkanVzdFRvcFJvdygpO3JldHVybiB0aGlzfSx3LnByb3RvdHlwZS5faW5pdFNlbGVjdGlvbkxpc3RlbmVycz1mdW5jdGlvbihrKXt9LHcucHJvdG90eXBlLl9zZXJ2ZXJUb3RhbHM9ZnVuY3Rpb24oKXt9LHcucHJvdG90eXBlLl9zZXRYSFI9ZnVuY3Rpb24oKXt2YXIgaz10aGlzLFM9dGhpcy5zLmR0LnNldHRpbmdzKClbMF0sQj1mdW5jdGlvbihMKXtMJiZMLnNlYXJjaFBhbmVzJiZMLnNlYXJjaFBhbmVzLm9wdGlvbnMmJihrLnMuc2VydmVyRGF0YT1MLGsucy5zZXJ2ZXJEYXRhLnRhYmxlTGVuZ3RoPUwucmVjb3Jkc1RvdGFsLGsuX3NlcnZlclRvdGFscygpKX07dGhpcy5zLmR0Lm9uKCJ4aHIuZHRzcHMiLGZ1bmN0aW9uKEwsUixxKXtTPT09UiYmQihxKX0pLEIodGhpcy5zLmR0LmFqYXguanNvbigpKX0sdy5wcm90b3R5cGUuX3N0YXRlTG9hZExpc3RlbmVyPWZ1bmN0aW9uKCl7dmFyIGs9dGhpcyxTPXRoaXMucy5kdC5zZXR0aW5ncygpWzBdO3RoaXMucy5kdC5vbigic3RhdGVMb2FkUGFyYW1zLmR0c3BzIixmdW5jdGlvbihCLEwsUil7aWYoIShSLnNlYXJjaFBhbmVzPT09dm9pZCAwfHxMIT09Uykpe2lmKGsuY2xlYXJTZWxlY3Rpb25zKCksay5zLnNlbGVjdGlvbkxpc3Q9Ui5zZWFyY2hQYW5lcy5zZWxlY3Rpb25MaXN0P1Iuc2VhcmNoUGFuZXMuc2VsZWN0aW9uTGlzdDpbXSxSLnNlYXJjaFBhbmVzLnBhbmVzKWZvcih2YXIgcT0wLHo9Ui5zZWFyY2hQYW5lcy5wYW5lcztxPHoubGVuZ3RoO3ErKylmb3IodmFyIEc9eltxXSxudD0wLHR0PWsucy5wYW5lcztudDx0dC5sZW5ndGg7bnQrKyl7dmFyIGV0PXR0W250XTtHLmlkPT09ZXQucy5pbmRleCYmZXQucy5kdFBhbmUmJihldC5kb20uc2VhcmNoQm94LnZhbChHLnNlYXJjaFRlcm0pLGV0LnMuZHRQYW5lLm9yZGVyKEcub3JkZXIpKX1rLl9tYWtlU2VsZWN0aW9ucyhrLnMuc2VsZWN0aW9uTGlzdCl9fSl9LHcucHJvdG90eXBlLl91cGRhdGVTZWxlY3Rpb249ZnVuY3Rpb24oKXt0aGlzLnMuc2VsZWN0aW9uTGlzdD1bXTtmb3IodmFyIGs9MCxTPXRoaXMucy5wYW5lcztrPFMubGVuZ3RoO2srKyl7dmFyIEI9U1trXTtpZihCLnMuZHRQYW5lKXt2YXIgTD1CLnMuZHRQYW5lLnJvd3Moe3NlbGVjdGVkOiEwfSkuZGF0YSgpLnRvQXJyYXkoKS5tYXAoZnVuY3Rpb24oUil7cmV0dXJuIFIuZmlsdGVyfSk7TC5sZW5ndGgmJnRoaXMucy5zZWxlY3Rpb25MaXN0LnB1c2goe2NvbHVtbjpCLnMuaW5kZXgscm93czpMfSl9fX0sdy5wcm90b3R5cGUuX2F0dGFjaD1mdW5jdGlvbigpe3ZhciBrPXRoaXM7dGhpcy5kb20udGl0bGVSb3cucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLmhpZGUpLmRldGFjaCgpLmFwcGVuZCh0aGlzLmRvbS50aXRsZSksdGhpcy5jLmNsZWFyJiZ0aGlzLmRvbS5jbGVhckFsbC5hcHBlbmRUbyh0aGlzLmRvbS50aXRsZVJvdykub2ZmKCJjbGljay5kdHNwcyIpLm9uKCJjbGljay5kdHNwcyIsZnVuY3Rpb24oKXtyZXR1cm4gay5jbGVhclNlbGVjdGlvbnMoKX0pLHRoaXMuYy5jb2xsYXBzZSYmKHRoaXMuZG9tLnNob3dBbGwuYXBwZW5kVG8odGhpcy5kb20udGl0bGVSb3cpLHRoaXMuZG9tLmNvbGxhcHNlQWxsLmFwcGVuZFRvKHRoaXMuZG9tLnRpdGxlUm93KSx0aGlzLl9zZXRDb2xsYXBzZUxpc3RlbmVyKCkpO2Zvcih2YXIgUz0wLEI9dGhpcy5zLnBhbmVzO1M8Qi5sZW5ndGg7UysrKXt2YXIgTD1CW1NdO3RoaXMuZG9tLnBhbmVzLmFwcGVuZChMLmRvbS5jb250YWluZXIpfXRoaXMuZG9tLmNvbnRhaW5lci50ZXh0KCIiKS5yZW1vdmVDbGFzcyh0aGlzLmNsYXNzZXMuaGlkZSkuYXBwZW5kKHRoaXMuZG9tLnRpdGxlUm93KS5hcHBlbmQodGhpcy5kb20ucGFuZXMpLHRoaXMucy5wYW5lcy5mb3JFYWNoKGZ1bmN0aW9uKFIpe3JldHVybiBSLnNldExpc3RlbmVycygpfSksaCgiZGl2LiIrdGhpcy5jbGFzc2VzLmNvbnRhaW5lcikubGVuZ3RoPT09MCYmdGhpcy5kb20uY29udGFpbmVyLnByZXBlbmRUbyh0aGlzLnMuZHQpfSx3LnByb3RvdHlwZS5fYXR0YWNoTWVzc2FnZT1mdW5jdGlvbigpe3ZhciBrO3RyeXtrPXRoaXMucy5kdC5pMThuKCJzZWFyY2hQYW5lcy5lbXB0eVBhbmVzIix0aGlzLmMuaTE4bi5lbXB0eVBhbmVzKX1jYXRjaHtrPW51bGx9aWYoaz09PW51bGwpe3RoaXMuZG9tLmNvbnRhaW5lci5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuaGlkZSksdGhpcy5kb20udGl0bGVSb3cucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLmhpZGUpO3JldHVybn10aGlzLmRvbS5jb250YWluZXIucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLmhpZGUpLHRoaXMuZG9tLnRpdGxlUm93LmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5oaWRlKSx0aGlzLmRvbS5lbXB0eU1lc3NhZ2UuaHRtbChrKS5hcHBlbmRUbyh0aGlzLmRvbS5jb250YWluZXIpfSx3LnByb3RvdHlwZS5fYXR0YWNoUGFuZUNvbnRhaW5lcj1mdW5jdGlvbigpe2Zvcih2YXIgaz0wLFM9dGhpcy5zLnBhbmVzO2s8Uy5sZW5ndGg7aysrKXt2YXIgQj1TW2tdO2lmKEIucy5kaXNwbGF5ZWQ9PT0hMCl7dGhpcy5fYXR0YWNoKCk7cmV0dXJufX10aGlzLl9hdHRhY2hNZXNzYWdlKCl9LHcucHJvdG90eXBlLl9jaGVja0NvbGxhcHNlPWZ1bmN0aW9uKCl7Zm9yKHZhciBrPSEwLFM9ITAsQj0wLEw9dGhpcy5zLnBhbmVzO0I8TC5sZW5ndGg7QisrKXt2YXIgUj1MW0JdO1Iucy5kaXNwbGF5ZWQmJihSLmRvbS5jb2xsYXBzZUJ1dHRvbi5oYXNDbGFzcyhSLmNsYXNzZXMucm90YXRlZCk/KHRoaXMuZG9tLnNob3dBbGwucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLmRpc2FibGVkQnV0dG9uKS5yZW1vdmVBdHRyKCJkaXNhYmxlZCIpLFM9ITEpOih0aGlzLmRvbS5jb2xsYXBzZUFsbC5yZW1vdmVDbGFzcyh0aGlzLmNsYXNzZXMuZGlzYWJsZWRCdXR0b24pLnJlbW92ZUF0dHIoImRpc2FibGVkIiksaz0hMSkpfWsmJnRoaXMuZG9tLmNvbGxhcHNlQWxsLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5kaXNhYmxlZEJ1dHRvbikuYXR0cigiZGlzYWJsZWQiLCJ0cnVlIiksUyYmdGhpcy5kb20uc2hvd0FsbC5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuZGlzYWJsZWRCdXR0b24pLmF0dHIoImRpc2FibGVkIiwidHJ1ZSIpfSx3LnByb3RvdHlwZS5fY2hlY2tNZXNzYWdlPWZ1bmN0aW9uKCl7Zm9yKHZhciBrPTAsUz10aGlzLnMucGFuZXM7azxTLmxlbmd0aDtrKyspe3ZhciBCPVNba107aWYoQi5zLmRpc3BsYXllZD09PSEwKXt0aGlzLmRvbS5lbXB0eU1lc3NhZ2UuZGV0YWNoKCksdGhpcy5kb20udGl0bGVSb3cucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLmhpZGUpO3JldHVybn19dGhpcy5fYXR0YWNoTWVzc2FnZSgpfSx3LnByb3RvdHlwZS5fY29sbGFwc2VBbGw9ZnVuY3Rpb24oKXtmb3IodmFyIGs9MCxTPXRoaXMucy5wYW5lcztrPFMubGVuZ3RoO2srKyl7dmFyIEI9U1trXTtCLmNvbGxhcHNlKCl9fSx3LnByb3RvdHlwZS5fZmluZFBhbmU9ZnVuY3Rpb24oayl7Zm9yKHZhciBTPTAsQj10aGlzLnMucGFuZXM7UzxCLmxlbmd0aDtTKyspe3ZhciBMPUJbU107aWYoaz09PUwucy5uYW1lKXJldHVybiBMfX0sdy5wcm90b3R5cGUuX2dldFN0YXRlPWZ1bmN0aW9uKCl7dmFyIGs9dGhpcy5zLmR0LnN0YXRlLmxvYWRlZCgpO2smJmsuc2VhcmNoUGFuZXMmJmsuc2VhcmNoUGFuZXMuc2VsZWN0aW9uTGlzdCYmKHRoaXMucy5zZWxlY3Rpb25MaXN0PWsuc2VhcmNoUGFuZXMuc2VsZWN0aW9uTGlzdCl9LHcucHJvdG90eXBlLl9tYWtlU2VsZWN0aW9ucz1mdW5jdGlvbihrKXtmb3IodmFyIFM9MCxCPWs7UzxCLmxlbmd0aDtTKyspe2Zvcih2YXIgTD1CW1NdLFI9dm9pZCAwLHE9MCx6PXRoaXMucy5wYW5lcztxPHoubGVuZ3RoO3ErKyl7dmFyIEc9eltxXTtpZihHLnMuaW5kZXg9PT1MLmNvbHVtbil7Uj1HO2JyZWFrfX1pZihSJiZSLnMuZHRQYW5lKXtmb3IodmFyIG50PTA7bnQ8Ui5zLmR0UGFuZS5yb3dzKCkuZGF0YSgpLnRvQXJyYXkoKS5sZW5ndGg7bnQrKylMLnJvd3MuaW5jbHVkZXModHlwZW9mIFIucy5kdFBhbmUucm93KG50KS5kYXRhKCkuZmlsdGVyPT0iZnVuY3Rpb24iP1Iucy5kdFBhbmUuY2VsbChudCwwKS5kYXRhKCk6Ui5zLmR0UGFuZS5yb3cobnQpLmRhdGEoKS5maWx0ZXIpJiZSLnMuZHRQYW5lLnJvdyhudCkuc2VsZWN0KCk7Ui51cGRhdGVUYWJsZSgpfX19LHcucHJvdG90eXBlLl9wYW5lRGVjbGFyZT1mdW5jdGlvbihrLFMsQil7dmFyIEw9dGhpcztrLmNvbHVtbnModGhpcy5jLmNvbHVtbnMubGVuZ3RoPjA/dGhpcy5jLmNvbHVtbnM6dm9pZCAwKS5lcSgwKS5lYWNoKGZ1bmN0aW9uKEcpe0wucy5wYW5lcy5wdXNoKG5ldyBMLnMucGFuZUNsYXNzKFMsQixHLEwuZG9tLnBhbmVzKSl9KTtmb3IodmFyIFI9ay5jb2x1bW5zKCkuZXEoMCkudG9BcnJheSgpLmxlbmd0aCxxPTA7cTx0aGlzLmMucGFuZXMubGVuZ3RoO3ErKyl7dmFyIHo9UitxO3RoaXMucy5wYW5lcy5wdXNoKG5ldyB0aGlzLnMucGFuZUNsYXNzKFMsQix6LHRoaXMuZG9tLnBhbmVzLHRoaXMuYy5wYW5lc1txXSkpfXRoaXMuYy5vcmRlci5sZW5ndGg+MCYmKHRoaXMucy5wYW5lcz10aGlzLmMub3JkZXIubWFwKGZ1bmN0aW9uKEcpe3JldHVybiBMLl9maW5kUGFuZShHKX0pKSx0aGlzLnMuZHQuc2V0dGluZ3MoKVswXS5fYkluaXRDb21wbGV0ZT90aGlzLl9zdGFydHVwKGspOl8udmVyc2lvbkNoZWNrKCIyIik/dGhpcy5zLmR0LnNldHRpbmdzKClbMF0uYW9Jbml0Q29tcGxldGUucHVzaChmdW5jdGlvbigpe3JldHVybiBMLl9zdGFydHVwKGspfSk6dGhpcy5zLmR0LnNldHRpbmdzKClbMF0uYW9Jbml0Q29tcGxldGUucHVzaCh7Zm46ZnVuY3Rpb24oKXtyZXR1cm4gTC5fc3RhcnR1cChrKX19KX0sdy5wcm90b3R5cGUuX3NldENvbGxhcHNlTGlzdGVuZXI9ZnVuY3Rpb24oKXt2YXIgaz10aGlzO3RoaXMuZG9tLmNvbGxhcHNlQWxsLm9mZigiY2xpY2suZHRzcHMiKS5vbigiY2xpY2suZHRzcHMiLGZ1bmN0aW9uKCl7ay5fY29sbGFwc2VBbGwoKSxrLmRvbS5jb2xsYXBzZUFsbC5hZGRDbGFzcyhrLmNsYXNzZXMuZGlzYWJsZWRCdXR0b24pLmF0dHIoImRpc2FibGVkIiwidHJ1ZSIpLGsuZG9tLnNob3dBbGwucmVtb3ZlQ2xhc3Moay5jbGFzc2VzLmRpc2FibGVkQnV0dG9uKS5yZW1vdmVBdHRyKCJkaXNhYmxlZCIpLGsucy5kdC5zdGF0ZS5zYXZlKCl9KSx0aGlzLmRvbS5zaG93QWxsLm9mZigiY2xpY2suZHRzcHMiKS5vbigiY2xpY2suZHRzcHMiLGZ1bmN0aW9uKCl7ay5fc2hvd0FsbCgpLGsuZG9tLnNob3dBbGwuYWRkQ2xhc3Moay5jbGFzc2VzLmRpc2FibGVkQnV0dG9uKS5hdHRyKCJkaXNhYmxlZCIsInRydWUiKSxrLmRvbS5jb2xsYXBzZUFsbC5yZW1vdmVDbGFzcyhrLmNsYXNzZXMuZGlzYWJsZWRCdXR0b24pLnJlbW92ZUF0dHIoImRpc2FibGVkIiksay5zLmR0LnN0YXRlLnNhdmUoKX0pO2Zvcih2YXIgUz0wLEI9dGhpcy5zLnBhbmVzO1M8Qi5sZW5ndGg7UysrKXt2YXIgTD1CW1NdO0wuZG9tLnRvcFJvdy5vZmYoImNvbGxhcHNlLmR0c3BzIikub24oImNvbGxhcHNlLmR0c3BzIixmdW5jdGlvbigpe3JldHVybiBrLl9jaGVja0NvbGxhcHNlKCl9KX10aGlzLl9jaGVja0NvbGxhcHNlKCl9LHcucHJvdG90eXBlLl9zaG93QWxsPWZ1bmN0aW9uKCl7Zm9yKHZhciBrPTAsUz10aGlzLnMucGFuZXM7azxTLmxlbmd0aDtrKyspe3ZhciBCPVNba107Qi5zaG93KCl9fSx3LnByb3RvdHlwZS5fc3RhcnR1cD1mdW5jdGlvbihrKXt2YXIgUz10aGlzO3RoaXMuX2F0dGFjaCgpLHRoaXMuZG9tLnBhbmVzLmVtcHR5KCk7Zm9yKHZhciBCPXRoaXMucy5kdC5zZXR0aW5ncygpWzBdLEw9MCxSPXRoaXMucy5wYW5lcztMPFIubGVuZ3RoO0wrKyl7dmFyIHE9UltMXTtxLnJlYnVpbGRQYW5lKE9iamVjdC5rZXlzKHRoaXMucy5zZXJ2ZXJEYXRhKS5sZW5ndGg+MD90aGlzLnMuc2VydmVyRGF0YTp2b2lkIDApLHRoaXMuZG9tLnBhbmVzLmFwcGVuZChxLmRvbS5jb250YWluZXIpfXRoaXMuYy5sYXlvdXQ9PT0iYXV0byImJnRoaXMucmVzaXplUGFuZXMoKTt2YXIgej10aGlzLnMuZHQuc3RhdGUubG9hZGVkKCk7IXRoaXMucy5zdGF0ZVJlYWQmJnomJnRoaXMucy5kdC5wYWdlKHouc3RhcnQvdGhpcy5zLmR0LnBhZ2UubGVuKCkpLmRyYXcoInBhZ2UiKSx0aGlzLnMuc3RhdGVSZWFkPSEwLHRoaXMuX2NoZWNrTWVzc2FnZSgpLGsub24oInByZURyYXcuZHRzcHMiLGZ1bmN0aW9uKCl7IVMucy51cGRhdGluZyYmIVMucy5wYWdpbmcmJihTLl91cGRhdGVGaWx0ZXJDb3VudCgpLFMuX3VwZGF0ZVNlbGVjdGlvbigpKSxTLnMucGFnaW5nPSExfSksaCh3aW5kb3cpLm9uKCJyZXNpemUuZHRzcHMiLF8udXRpbC50aHJvdHRsZShmdW5jdGlvbigpe3JldHVybiBTLnJlc2l6ZVBhbmVzKCl9KSksdGhpcy5zLmR0Lm9uKCJzdGF0ZVNhdmVQYXJhbXMuZHRzcHMiLGZ1bmN0aW9uKG50LHR0LGV0KXt0dD09PUImJihldC5zZWFyY2hQYW5lcz09PXZvaWQgMCYmKGV0LnNlYXJjaFBhbmVzPXt9KSxldC5zZWFyY2hQYW5lcy5zZWxlY3Rpb25MaXN0PVMucy5zZWxlY3Rpb25MaXN0KX0pLHRoaXMuX3N0YXRlTG9hZExpc3RlbmVyKCksay5vZmYoInBhZ2UuZHRzcHMgcGFnZS1uYy5kdHNwcyIpLm9uKCJwYWdlLmR0c3BzIHBhZ2UtbmMuZHRzcHMiLGZ1bmN0aW9uKG50LHR0KXtTLnMucGFnaW5nPSEwLFMucy5wYWdpbmdTVD0hMCxTLnMucGFnZT1TLnMuZHQucGFnZSgpfSksdGhpcy5zLmR0LnBhZ2UuaW5mbygpLnNlcnZlclNpZGU/ay5vZmYoInByZVhoci5kdHNwcyIpLm9uKCJwcmVYaHIuZHRzcHMiLGZ1bmN0aW9uKG50LHR0LGV0KXtpZih0dD09PUIpe2V0LnNlYXJjaFBhbmVzfHwoZXQuc2VhcmNoUGFuZXM9e30pLGV0LnNlYXJjaFBhbmVzX251bGx8fChldC5zZWFyY2hQYW5lc19udWxsPXt9KTtmb3IodmFyIHd0PTAsU3Q9MCxUdD1TLnMucGFuZXM7U3Q8VHQubGVuZ3RoO1N0Kyspe3ZhciBrdD1UdFtTdF0sTHQ9Uy5zLmR0LmNvbHVtbihrdC5zLmluZGV4KS5kYXRhU3JjKCk7aWYoZXQuc2VhcmNoUGFuZXNbTHRdfHwoZXQuc2VhcmNoUGFuZXNbTHRdPXt9KSxldC5zZWFyY2hQYW5lc19udWxsW0x0XXx8KGV0LnNlYXJjaFBhbmVzX251bGxbTHRdPXt9KSxrdC5zLmR0UGFuZSlmb3IodmFyIEJ0PWt0LnMuZHRQYW5lLnJvd3Moe3NlbGVjdGVkOiEwfSkuZGF0YSgpLnRvQXJyYXkoKSwkdD0wOyR0PEJ0Lmxlbmd0aDskdCsrKWV0LnNlYXJjaFBhbmVzW0x0XVskdF09QnRbJHRdLmZpbHRlcixldC5zZWFyY2hQYW5lc1tMdF1bJHRdP2V0LnNlYXJjaFBhbmVzX251bGxbTHRdWyR0XT0hMTpldC5zZWFyY2hQYW5lc19udWxsW0x0XVskdF09ITAsd3QrK313dD4wJiYod3QhPT1TLnMuZmlsdGVyQ291bnQ/KGV0LnN0YXJ0PTAsUy5zLnBhZ2U9MCk6ZXQuc3RhcnQ9Uy5zLnBhZ2UqUy5zLmR0LnBhZ2UubGVuKCksUy5zLmR0LnBhZ2UoUy5zLnBhZ2UpLFMucy5maWx0ZXJDb3VudD13dCksUy5zLnNlbGVjdGlvbkxpc3QubGVuZ3RoPjAmJihldC5zZWFyY2hQYW5lc0xhc3Q9Uy5zLmR0LmNvbHVtbihTLnMuc2VsZWN0aW9uTGlzdFtTLnMuc2VsZWN0aW9uTGlzdC5sZW5ndGgtMV0uY29sdW1uKS5kYXRhU3JjKCkpLGV0LnNlYXJjaFBhbmVzX29wdGlvbnM9e2Nhc2NhZGU6Uy5jLmNhc2NhZGVQYW5lcyx2aWV3Q291bnQ6Uy5jLnZpZXdDb3VudCx2aWV3VG90YWw6Uy5jLnZpZXdUb3RhbH19fSk6ay5vbigicHJlWGhyLmR0c3BzIixmdW5jdGlvbigpe3JldHVybiBTLnMucGFuZXMuZm9yRWFjaChmdW5jdGlvbihudCl7cmV0dXJuIG50LmNsZWFyRGF0YSgpfSl9KSx0aGlzLnMuZHQub24oInhoci5kdHNwcyIsZnVuY3Rpb24obnQsdHQpe2lmKHR0Lm5UYWJsZT09PVMucy5kdC50YWJsZSgpLm5vZGUoKSYmIVMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlKXt2YXIgZXQ9ITE7Uy5zLmR0Lm9uZSgicHJlRHJhdy5kdHNwcyIsZnVuY3Rpb24oKXtpZighZXQpe3ZhciB3dD1TLnMuZHQucGFnZSgpO2V0PSEwLFMucy51cGRhdGluZz0hMCxTLmRvbS5wYW5lcy5lbXB0eSgpO2Zvcih2YXIgU3Q9MCxUdD1TLnMucGFuZXM7U3Q8VHQubGVuZ3RoO1N0Kyspe3ZhciBrdD1UdFtTdF07a3QuY2xlYXJEYXRhKCksa3QucmVidWlsZFBhbmUodm9pZCAwLCEwKSxTLmRvbS5wYW5lcy5hcHBlbmQoa3QuZG9tLmNvbnRhaW5lcil9Uy5zLmR0LnBhZ2UuaW5mbygpLnNlcnZlclNpZGV8fFMucy5kdC5kcmF3KCksUy5zLnVwZGF0aW5nPSExLFMuX3VwZGF0ZVNlbGVjdGlvbigpLFMuX2NoZWNrTWVzc2FnZSgpLFMucy5kdC5vbmUoImRyYXcuZHRzcHMiLGZ1bmN0aW9uKCl7Uy5zLnVwZGF0aW5nPSEwLFMucy5kdC5wYWdlKHd0KS5kcmF3KCExKSxTLnMudXBkYXRpbmc9ITF9KX19KX19KTt2YXIgRz10aGlzLmMucHJlU2VsZWN0O3omJnouc2VhcmNoUGFuZXMmJnouc2VhcmNoUGFuZXMuc2VsZWN0aW9uTGlzdCYmKEc9ei5zZWFyY2hQYW5lcy5zZWxlY3Rpb25MaXN0KSx0aGlzLl9tYWtlU2VsZWN0aW9ucyhHKSx0aGlzLl91cGRhdGVGaWx0ZXJDb3VudCgpLGsub24oImRlc3Ryb3kuZHRzcHMiLGZ1bmN0aW9uKG50LHR0KXtpZih0dD09PUIpe2Zvcih2YXIgZXQ9MCx3dD1TLnMucGFuZXM7ZXQ8d3QubGVuZ3RoO2V0Kyspe3ZhciBTdD13dFtldF07U3QuZGVzdHJveSgpfWsub2ZmKCIuZHRzcHMiKSxTLmRvbS5zaG93QWxsLm9mZigiLmR0c3BzIiksUy5kb20uY2xlYXJBbGwub2ZmKCIuZHRzcHMiKSxTLmRvbS5jb2xsYXBzZUFsbC5vZmYoIi5kdHNwcyIpLGgoay50YWJsZSgpLm5vZGUoKSkub2ZmKCIuZHRzcHMiKSxTLmRvbS5jb250YWluZXIuZGV0YWNoKCksUy5jbGVhclNlbGVjdGlvbnMoKX19KSx0aGlzLmMuY29sbGFwc2UmJnRoaXMuX3NldENvbGxhcHNlTGlzdGVuZXIoKSx0aGlzLmMuY2xlYXImJnRoaXMuZG9tLmNsZWFyQWxsLm9mZigiY2xpY2suZHRzcHMiKS5vbigiY2xpY2suZHRzcHMiLGZ1bmN0aW9uKCl7cmV0dXJuIFMuY2xlYXJTZWxlY3Rpb25zKCl9KSxCLl9zZWFyY2hQYW5lcz10aGlzLHRoaXMucy5kdC5zdGF0ZS5zYXZlKCl9LHcucHJvdG90eXBlLl91cGRhdGVGaWx0ZXJDb3VudD1mdW5jdGlvbigpe2Zvcih2YXIgaz0wLFM9MCxCPTAsTD10aGlzLnMucGFuZXM7QjxMLmxlbmd0aDtCKyspe3ZhciBSPUxbQl07Ui5zLmR0UGFuZSYmKGsrPVIuZ2V0UGFuZUNvdW50KCksUi5zLmR0UGFuZS5zZWFyY2goKSYmUysrKX10aGlzLmRvbS50aXRsZS5odG1sKHRoaXMucy5kdC5pMThuKCJzZWFyY2hQYW5lcy50aXRsZSIsdGhpcy5jLmkxOG4udGl0bGUsaykpLHRoaXMuYy5maWx0ZXJDaGFuZ2VkJiZ0eXBlb2YgdGhpcy5jLmZpbHRlckNoYW5nZWQ9PSJmdW5jdGlvbiImJnRoaXMuYy5maWx0ZXJDaGFuZ2VkLmNhbGwodGhpcy5zLmR0LGspLGs9PT0wJiZTPT09MD90aGlzLmRvbS5jbGVhckFsbC5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuZGlzYWJsZWRCdXR0b24pLmF0dHIoImRpc2FibGVkIiwidHJ1ZSIpOnRoaXMuZG9tLmNsZWFyQWxsLnJlbW92ZUNsYXNzKHRoaXMuY2xhc3Nlcy5kaXNhYmxlZEJ1dHRvbikucmVtb3ZlQXR0cigiZGlzYWJsZWQiKX0sdy52ZXJzaW9uPSIyLjMuMiIsdy5jbGFzc2VzPXtjbGVhcjoiZHRzcC1jbGVhciIsY2xlYXJBbGw6ImR0c3AtY2xlYXJBbGwiLGNvbGxhcHNlQWxsOiJkdHNwLWNvbGxhcHNlQWxsIixjb250YWluZXI6ImR0c3Atc2VhcmNoUGFuZXMiLGRpc2FibGVkQnV0dG9uOiJkdHNwLWRpc2FibGVkQnV0dG9uIixlbXB0eU1lc3NhZ2U6ImR0c3AtZW1wdHlNZXNzYWdlIixoaWRlOiJkdHNwLWhpZGRlbiIscGFuZXM6ImR0c3AtcGFuZXNDb250YWluZXIiLHNlYXJjaDoiZHRzcC1zZWFyY2giLHNob3dBbGw6ImR0c3Atc2hvd0FsbCIsdGl0bGU6ImR0c3AtdGl0bGUiLHRpdGxlUm93OiJkdHNwLXRpdGxlUm93In0sdy5kZWZhdWx0cz17Y2FzY2FkZVBhbmVzOiExLGNsZWFyOiEwLGNvbGxhcHNlOiEwLGNvbHVtbnM6W10sY29udGFpbmVyOmZ1bmN0aW9uKGspe3JldHVybiBrLnRhYmxlKCkuY29udGFpbmVyKCl9LGZpbHRlckNoYW5nZWQ6dm9pZCAwLGkxOG46e2NsZWFyTWVzc2FnZToiQ2xlYXIgQWxsIixjbGVhclBhbmU6IiZ0aW1lczsiLGNvbGxhcHNlOnswOiJTZWFyY2hQYW5lcyIsXzoiU2VhcmNoUGFuZXMgKCVkKSJ9LGNvbGxhcHNlTWVzc2FnZToiQ29sbGFwc2UgQWxsIixjb3VudDoie3RvdGFsfSIsZW1wdHlNZXNzYWdlOiI8ZW0+Tm8gZGF0YTwvZW0+IixlbXB0eVBhbmVzOiJObyBTZWFyY2hQYW5lcyIsbG9hZE1lc3NhZ2U6IkxvYWRpbmcgU2VhcmNoIFBhbmVzLi4uIixzaG93TWVzc2FnZToiU2hvdyBBbGwiLHRpdGxlOiJGaWx0ZXJzIEFjdGl2ZSAtICVkIn0sbGF5b3V0OiJhdXRvIixvcmRlcjpbXSxwYW5lczpbXSxwcmVTZWxlY3Q6W10sdmlld0NvdW50OiEwLHZpZXdUb3RhbDohMX0sd30oKSxmPXdpbmRvdyYmd2luZG93Ll9fZXh0ZW5kc3x8ZnVuY3Rpb24oKXt2YXIgdz1mdW5jdGlvbihrLFMpe3JldHVybiB3PU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbihCLEwpe0IuX19wcm90b19fPUx9fHxmdW5jdGlvbihCLEwpe2Zvcih2YXIgUiBpbiBMKUwuaGFzT3duUHJvcGVydHkoUikmJihCW1JdPUxbUl0pfSx3KGssUyl9O3JldHVybiBmdW5jdGlvbihrLFMpe3coayxTKTtmdW5jdGlvbiBCKCl7dGhpcy5jb25zdHJ1Y3Rvcj1rfWsucHJvdG90eXBlPVM9PT1udWxsP09iamVjdC5jcmVhdGUoUyk6KEIucHJvdG90eXBlPVMucHJvdG90eXBlLG5ldyBCKX19KCksVT1mdW5jdGlvbih3KXtmKGssdyk7ZnVuY3Rpb24gayhTLEIsTCl7TD09PXZvaWQgMCYmKEw9ITEpO3ZhciBSPXRoaXMscTtCLmNhc2NhZGVQYW5lcyYmQi52aWV3VG90YWw/cT1sOkIuY2FzY2FkZVBhbmVzP3E9eTpCLnZpZXdUb3RhbCYmKHE9YiksUj13LmNhbGwodGhpcyxTLEIsTCxxKXx8dGhpczt2YXIgej1SLnMuZHQsRz16LnN0YXRlLmxvYWRlZCgpLG50PWZ1bmN0aW9uKCl7cmV0dXJuIFIuX2luaXRTZWxlY3Rpb25MaXN0ZW5lcnMoITAsRyYmRy5zZWFyY2hQYW5lcyYmRy5zZWFyY2hQYW5lcy5zZWxlY3Rpb25MaXN0P0cuc2VhcmNoUGFuZXMuc2VsZWN0aW9uTGlzdDpSLmMucHJlU2VsZWN0KX07cmV0dXJuIHouc2V0dGluZ3MoKVswXS5fYkluaXRDb21wbGV0ZT9udCgpOnoub2ZmKCJpbml0LmR0c3BzIikub24oImluaXQuZHRzcHMiLG50KSxSfXJldHVybiBrLnByb3RvdHlwZS5faW5pdFNlbGVjdGlvbkxpc3RlbmVycz1mdW5jdGlvbihTLEIpe1M9PT12b2lkIDAmJihTPSEwKSxCPT09dm9pZCAwJiYoQj1bXSksUyYmKHRoaXMucy5zZWxlY3Rpb25MaXN0PUIpO2Zvcih2YXIgTD0wLFI9dGhpcy5zLnBhbmVzO0w8Ui5sZW5ndGg7TCsrKXt2YXIgcT1SW0xdO3Eucy5kaXNwbGF5ZWQmJnEucy5kdFBhbmUub2ZmKCJzZWxlY3QuZHRzcCIpLm9uKCJzZWxlY3QuZHRzcCIsdGhpcy5fdXBkYXRlKHEpKS5vZmYoImRlc2VsZWN0LmR0c3AiKS5vbigiZGVzZWxlY3QuZHRzcCIsdGhpcy5fdXBkYXRlVGltZW91dChxKSl9dGhpcy5zLmR0Lm9mZigiZHJhdy5kdHNwcyIpLm9uKCJkcmF3LmR0c3BzIix0aGlzLl91cGRhdGUoKSksdGhpcy5fdXBkYXRlU2VsZWN0aW9uTGlzdCgpfSxrLnByb3RvdHlwZS5fc2VydmVyVG90YWxzPWZ1bmN0aW9uKCl7Zm9yKHZhciBTPTAsQj10aGlzLnMucGFuZXM7UzxCLmxlbmd0aDtTKyspe3ZhciBMPUJbU107aWYoTC5zLmNvbE9wdHMuc2hvdyl7dmFyIFI9dGhpcy5zLmR0LmNvbHVtbihMLnMuaW5kZXgpLmRhdGFTcmMoKSxxPSEwO2lmKHRoaXMucy5zZXJ2ZXJEYXRhLnNlYXJjaFBhbmVzLm9wdGlvbnNbUl0pZm9yKHZhciB6PTAsRz10aGlzLnMuc2VydmVyRGF0YS5zZWFyY2hQYW5lcy5vcHRpb25zW1JdO3o8Ry5sZW5ndGg7eisrKXt2YXIgbnQ9R1t6XTtpZihudC50b3RhbCE9PW50LmNvdW50KXtxPSExO2JyZWFrfX1MLnMuZmlsdGVyaW5nQWN0aXZlPSFxLEwuX3NlcnZlclBvcHVsYXRlKHRoaXMucy5zZXJ2ZXJEYXRhKX19fSxrLnByb3RvdHlwZS5fc3RhdGVMb2FkTGlzdGVuZXI9ZnVuY3Rpb24oKXt2YXIgUz10aGlzLEI9ZnVuY3Rpb24oTCxSLHEpe2lmKHEuc2VhcmNoUGFuZXMhPT12b2lkIDApe2lmKFMucy5zZWxlY3Rpb25MaXN0PXEuc2VhcmNoUGFuZXMuc2VsZWN0aW9uTGlzdD9xLnNlYXJjaFBhbmVzLnNlbGVjdGlvbkxpc3Q6W10scS5zZWFyY2hQYW5lcy5wYW5lcylmb3IodmFyIHo9MCxHPXEuc2VhcmNoUGFuZXMucGFuZXM7ejxHLmxlbmd0aDt6KyspZm9yKHZhciBudD1HW3pdLHR0PTAsZXQ9Uy5zLnBhbmVzO3R0PGV0Lmxlbmd0aDt0dCsrKXt2YXIgd3Q9ZXRbdHRdO250LmlkPT09d3Qucy5pbmRleCYmd3Qucy5kdFBhbmUmJih3dC5kb20uc2VhcmNoQm94LnZhbChudC5zZWFyY2hUZXJtKSx3dC5zLmR0UGFuZS5vcmRlcihudC5vcmRlcikpfVMuX3VwZGF0ZVNlbGVjdGlvbkxpc3QoKX19O3RoaXMucy5kdC5vZmYoInN0YXRlTG9hZFBhcmFtcy5kdHNwcyIsQikub24oInN0YXRlTG9hZFBhcmFtcy5kdHNwcyIsQil9LGsucHJvdG90eXBlLl91cGRhdGVTZWxlY3Rpb249ZnVuY3Rpb24oKXt9LGsucHJvdG90eXBlLl91cGRhdGU9ZnVuY3Rpb24oUyl7dmFyIEI9dGhpcztyZXR1cm4gUz09PXZvaWQgMCYmKFM9dm9pZCAwKSxmdW5jdGlvbigpe1MmJmNsZWFyVGltZW91dChTLnMuZGVzZWxlY3RUaW1lb3V0KSxCLl91cGRhdGVTZWxlY3Rpb25MaXN0KFMpfX0say5wcm90b3R5cGUuX3VwZGF0ZVRpbWVvdXQ9ZnVuY3Rpb24oUyl7dmFyIEI9dGhpcztyZXR1cm4gUz09PXZvaWQgMCYmKFM9dm9pZCAwKSxmdW5jdGlvbigpe3JldHVybiBTP1Mucy5kZXNlbGVjdFRpbWVvdXQ9c2V0VGltZW91dChmdW5jdGlvbigpe3JldHVybiBCLl91cGRhdGVTZWxlY3Rpb25MaXN0KFMpfSw1MCk6Qi5fdXBkYXRlU2VsZWN0aW9uTGlzdCgpfX0say5wcm90b3R5cGUuX3VwZGF0ZVNlbGVjdGlvbkxpc3Q9ZnVuY3Rpb24oUyl7aWYoUz09PXZvaWQgMCYmKFM9dm9pZCAwKSx0aGlzLnMucGFnaW5nU1Qpe3RoaXMucy5wYWdpbmdTVD0hMTtyZXR1cm59ZWxzZSBpZih0aGlzLnMudXBkYXRpbmd8fFMmJlMucy5zZXJ2ZXJTZWxlY3RpbmcpcmV0dXJuO2lmKFMhPT12b2lkIDApe3RoaXMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlJiZTLl91cGRhdGVTZWxlY3Rpb24oKTt2YXIgQj1TLnMuZHRQYW5lLnJvd3Moe3NlbGVjdGVkOiEwfSkuZGF0YSgpLnRvQXJyYXkoKS5tYXAoZnVuY3Rpb24oTCl7cmV0dXJuIEwuZmlsdGVyfSk7dGhpcy5zLnNlbGVjdGlvbkxpc3Q9dGhpcy5zLnNlbGVjdGlvbkxpc3QuZmlsdGVyKGZ1bmN0aW9uKEwpe3JldHVybiBMLmNvbHVtbiE9PVMucy5pbmRleH0pLEIubGVuZ3RoPjA/KHRoaXMucy5zZWxlY3Rpb25MaXN0LnB1c2goe2NvbHVtbjpTLnMuaW5kZXgscm93czpCfSksUy5kb20uY2xlYXIucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLmRpc2FibGVkQnV0dG9uKS5yZW1vdmVBdHRyKCJkaXNhYmxlZCIpKTpTLmRvbS5jbGVhci5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuZGlzYWJsZWRCdXR0b24pLmF0dHIoImRpc2FibGVkIiwidHJ1ZSIpLHRoaXMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlJiZ0aGlzLnMuZHQuZHJhdyghMSl9dGhpcy5fcmVtYWtlU2VsZWN0aW9ucygpLHRoaXMuX3VwZGF0ZUZpbHRlckNvdW50KCl9LGsucHJvdG90eXBlLl9yZW1ha2VTZWxlY3Rpb25zPWZ1bmN0aW9uKCl7dmFyIFMsQjtpZih0aGlzLnMudXBkYXRpbmc9ITAsdGhpcy5zLmR0LnBhZ2UuaW5mbygpLnNlcnZlclNpZGUpe3RoaXMucy5zZWxlY3Rpb25MaXN0Lmxlbmd0aD4wJiYoQj10aGlzLnMucGFuZXNbdGhpcy5zLnNlbGVjdGlvbkxpc3RbdGhpcy5zLnNlbGVjdGlvbkxpc3QubGVuZ3RoLTFdLmNvbHVtbl0pO2Zvcih2YXIgQ3Q9MCx4dD10aGlzLnMucGFuZXM7Q3Q8eHQubGVuZ3RoO0N0KyspUz14dFtDdF0sUy5zLmRpc3BsYXllZCYmKCFCfHxTLnMuaW5kZXghPT1CLnMuaW5kZXgpJiZTLnVwZGF0ZVJvd3MoKX1lbHNle3ZhciBMPXRoaXMucy5zZWxlY3Rpb25MaXN0LFI9ITE7dGhpcy5jbGVhclNlbGVjdGlvbnMoKSx0aGlzLnMuZHQuZHJhdyghMSksdGhpcy5zLmR0LnJvd3MoKS50b0FycmF5KClbMF0ubGVuZ3RoPnRoaXMucy5kdC5yb3dzKHtzZWFyY2g6ImFwcGxpZWQifSkudG9BcnJheSgpWzBdLmxlbmd0aCYmKFI9ITApLHRoaXMucy5zZWxlY3Rpb25MaXN0PUw7Zm9yKHZhciBxPTAsej10aGlzLnMucGFuZXM7cTx6Lmxlbmd0aDtxKyspQj16W3FdLEIucy5kaXNwbGF5ZWQmJihCLnMuZmlsdGVyaW5nQWN0aXZlPVIsQi51cGRhdGVSb3dzKCkpO2Zvcih2YXIgRz0wLG50PXRoaXMucy5zZWxlY3Rpb25MaXN0O0c8bnQubGVuZ3RoO0crKyl7dmFyIHR0PW50W0ddO0I9bnVsbDtmb3IodmFyIGV0PTAsd3Q9dGhpcy5zLnBhbmVzO2V0PHd0Lmxlbmd0aDtldCsrKXt2YXIgU3Q9d3RbZXRdO2lmKFN0LnMuaW5kZXg9PT10dC5jb2x1bW4pe0I9U3Q7YnJlYWt9fWlmKEIucy5kdFBhbmUpe2Zvcih2YXIgVHQ9Qi5zLmR0UGFuZS5yb3dzKCkuaW5kZXhlcygpLnRvQXJyYXkoKSxrdD0wO2t0PHR0LnJvd3MubGVuZ3RoO2t0Kyspe2Zvcih2YXIgTHQ9ITEsQnQ9MCwkdD1UdDtCdDwkdC5sZW5ndGg7QnQrKyl7dmFyIEt0PSR0W0J0XSxEPUIucy5kdFBhbmUucm93KEt0KSx1dD1ELmRhdGEoKTt0dC5yb3dzW2t0XT09PXV0LmZpbHRlciYmKEQuc2VsZWN0KCksTHQ9ITApfUx0fHwodHQucm93cy5zcGxpY2Uoa3QsMSksa3QtLSl9aWYoQi5zLnNlbGVjdGlvbnM9dHQucm93cyx0dC5yb3dzLmxlbmd0aCE9PTApe3RoaXMucy5kdC5kcmF3KCk7Zm9yKHZhciBvdD0hMSxWPTAsaj0wLEs9MCxwdD0wLHZ0PXRoaXMucy5wYW5lcztwdDx2dC5sZW5ndGg7cHQrKylTPXZ0W3B0XSxTLnMuZHRQYW5lJiYoVis9Uy5nZXRQYW5lQ291bnQoKSxWPmomJihLKyssaj1WKSk7b3Q9Vj4wO2Zvcih2YXIgcnQ9MCxndD10aGlzLnMucGFuZXM7cnQ8Z3QubGVuZ3RoO3J0KyspUz1ndFtydF0sUy5zLmRpc3BsYXllZCYmKFJ8fEIucy5pbmRleCE9PVMucy5pbmRleHx8IW90P1Mucy5maWx0ZXJpbmdBY3RpdmU9b3R8fFI6Sz09PTEmJihTLnMuZmlsdGVyaW5nQWN0aXZlPSExKSxTLnMuaW5kZXghPT1CLnMuaW5kZXgmJlMudXBkYXRlUm93cygpKX19fXRoaXMucy5kdC5kcmF3KCExKX10aGlzLnMudXBkYXRpbmc9ITF9LGt9KE8pO24oWmUpLEYoWmUpLHAoWmUpLEMoWmUpLGMoWmUpO3ZhciBYPVplLmZuLmRhdGFUYWJsZTtYLlNlYXJjaFBhbmVzPU8sYXQuU2VhcmNoUGFuZXM9TyxYLlNlYXJjaFBhbmVzU1Q9VSxhdC5TZWFyY2hQYW5lc1NUPVUsWC5TZWFyY2hQYW5lPXIsYXQuU2VhcmNoUGFuZT1yLFguU2VhcmNoUGFuZVZpZXdUb3RhbD1iLGF0LlNlYXJjaFBhbmVWaWV3VG90YWw9YixYLlNlYXJjaFBhbmVDYXNjYWRlPXksYXQuU2VhcmNoUGFuZUNhc2NhZGU9eSxYLlNlYXJjaFBhbmVDYXNjYWRlVmlld1RvdGFsPWwsYXQuU2VhcmNoUGFuZUNhc2NhZGVWaWV3VG90YWw9bDt2YXIgUT1aZS5mbi5kYXRhVGFibGUuQXBpLnJlZ2lzdGVyO1EoInNlYXJjaFBhbmVzKCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSxRKCJzZWFyY2hQYW5lcy5jbGVhclNlbGVjdGlvbnMoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKHcpe3cuX3NlYXJjaFBhbmVzJiZ3Ll9zZWFyY2hQYW5lcy5jbGVhclNlbGVjdGlvbnMoKX0pfSksUSgic2VhcmNoUGFuZXMucmVidWlsZFBhbmUoKSIsZnVuY3Rpb24odyxrKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKFMpe1MuX3NlYXJjaFBhbmVzJiZTLl9zZWFyY2hQYW5lcy5yZWJ1aWxkKHcsayl9KX0pLFEoInNlYXJjaFBhbmVzLnJlc2l6ZVBhbmVzKCkiLGZ1bmN0aW9uKCl7dmFyIHc9dGhpcy5jb250ZXh0WzBdO3JldHVybiB3Ll9zZWFyY2hQYW5lcz93Ll9zZWFyY2hQYW5lcy5yZXNpemVQYW5lcygpOm51bGx9KSxRKCJzZWFyY2hQYW5lcy5jb250YWluZXIoKSIsZnVuY3Rpb24oKXt2YXIgdz10aGlzLmNvbnRleHRbMF07cmV0dXJuIHcuX3NlYXJjaFBhbmVzP3cuX3NlYXJjaFBhbmVzLmdldE5vZGUoKTpudWxsfSksYXQuZXh0LmJ1dHRvbnMuc2VhcmNoUGFuZXNDbGVhcj17YWN0aW9uOmZ1bmN0aW9uKHcsayl7ay5zZWFyY2hQYW5lcy5jbGVhclNlbGVjdGlvbnMoKX0sdGV4dDoiQ2xlYXIgUGFuZXMifSxhdC5leHQuYnV0dG9ucy5zZWFyY2hQYW5lcz17YWN0aW9uOmZ1bmN0aW9uKHcsayxTLEIpe3ZhciBMPXRoaXMsUj10aGlzO0IuX3BhbmVzPyh0aGlzLnBvcG92ZXIoQi5fcGFuZXMuZ2V0Tm9kZSgpLHthbGlnbjoiY29udGFpbmVyIixzcGFuOiJjb250YWluZXIifSksQi5fcGFuZXMucmVidWlsZCh2b2lkIDAsITApKToodGhpcy5wcm9jZXNzaW5nKCEwKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7RShrLFMsQiksTC5wb3BvdmVyKEIuX3BhbmVzLmdldE5vZGUoKSx7YWxpZ246ImNvbnRhaW5lciIsc3BhbjoiY29udGFpbmVyIn0pLEIuX3BhbmVzLnJlYnVpbGQodm9pZCAwLCEwKSxaZSgidGFibGUuZGF0YVRhYmxlIixCLl9wYW5lcy5nZXROb2RlKCkpLkRhdGFUYWJsZSgpLmNvbHVtbnMuYWRqdXN0KCksUi5wcm9jZXNzaW5nKCExKX0sMTApKX0saW5pdDpmdW5jdGlvbih3LGssUyl7dy5idXR0b24oaykudGV4dChTLnRleHR8fHcuaTE4bigic2VhcmNoUGFuZXMuY29sbGFwc2UiLCJTZWFyY2hQYW5lcyIsMCkpLCh3LmluaXQoKS5zdGF0ZVNhdmV8fFMuZGVsYXlJbml0PT09ITEpJiZFKHcsayxTKX0sY29uZmlnOnt9LHRleHQ6IiIsZGVsYXlJbml0OiEwfTtmdW5jdGlvbiBFKHcsayxTKXt2YXIgQj1aZS5leHRlbmQoe2ZpbHRlckNoYW5nZWQ6ZnVuY3Rpb24oUil7dy5idXR0b24oaykudGV4dCh3LmkxOG4oInNlYXJjaFBhbmVzLmNvbGxhcHNlIix3LmNvbnRleHRbMF0ub0xhbmd1YWdlLnNlYXJjaFBhbmVzIT09dm9pZCAwP3cuY29udGV4dFswXS5vTGFuZ3VhZ2Uuc2VhcmNoUGFuZXMuY29sbGFwc2U6dy5jb250ZXh0WzBdLl9zZWFyY2hQYW5lcy5jLmkxOG4uY29sbGFwc2UsUikpfX0sUy5jb25maWcpLEw9QiYmKEIuY2FzY2FkZVBhbmVzfHxCLnZpZXdUb3RhbCk/bmV3IGF0LlNlYXJjaFBhbmVzU1QodyxCKTpuZXcgYXQuU2VhcmNoUGFuZXModyxCKTt3LmJ1dHRvbihrKS50ZXh0KFMudGV4dHx8dy5pMThuKCJzZWFyY2hQYW5lcy5jb2xsYXBzZSIsTC5jLmkxOG4uY29sbGFwc2UsMCkpLFMuX3BhbmVzPUx9ZnVuY3Rpb24gJCh3LGssUyl7az09PXZvaWQgMCYmKGs9bnVsbCksUz09PXZvaWQgMCYmKFM9ITEpO3ZhciBCPW5ldyBYLkFwaSh3KSxMPWt8fEIuaW5pdCgpLnNlYXJjaFBhbmVzfHxYLmRlZmF1bHRzLnNlYXJjaFBhbmVzLFI9TCYmKEwuY2FzY2FkZVBhbmVzfHxMLnZpZXdUb3RhbCk/bmV3IFUoQixMLFMpOm5ldyBPKEIsTCxTKSxxPVIuZ2V0Tm9kZSgpO3JldHVybiBxfVplKGRvY3VtZW50KS5vbigicHJlSW5pdC5kdC5kdHNwIixmdW5jdGlvbih3LGspe3cubmFtZXNwYWNlPT09ImR0IiYmKGsub0luaXQuc2VhcmNoUGFuZXN8fGF0LmRlZmF1bHRzLnNlYXJjaFBhbmVzKSYmKGsuX3NlYXJjaFBhbmVzfHwkKGssbnVsbCwhMCkpfSksYXQuZXh0LmZlYXR1cmUucHVzaCh7Y0ZlYXR1cmU6IlAiLGZuSW5pdDokfSksYXQuZmVhdHVyZSYmYXQuZmVhdHVyZS5yZWdpc3Rlcigic2VhcmNoUGFuZXMiLCQpfSkoKTt2YXIgZGQ9aWUoYWUoKSwxKTt2YXIgZW89aWUoYWUoKSwxKTt2YXIgRXQ9ZW8uZGVmYXVsdDthdC5zZWxlY3Q9e307YXQuc2VsZWN0LmNsYXNzZXM9e2NoZWNrYm94OiJkdC1zZWxlY3QtY2hlY2tib3gifTthdC5zZWxlY3QudmVyc2lvbj0iMi4wLjUiO2F0LnNlbGVjdC5pbml0PWZ1bmN0aW9uKHQpe3ZhciBlPXQuc2V0dGluZ3MoKVswXTtpZighYXQudmVyc2lvbkNoZWNrKCIyIikpdGhyb3ciV2FybmluZzogU2VsZWN0IHJlcXVpcmVzIERhdGFUYWJsZXMgMiBvciBuZXdlciI7aWYoIWUuX3NlbGVjdCl7dmFyIG49dC5zdGF0ZS5sb2FkZWQoKSxyPWZ1bmN0aW9uKGMsbCxoKXtpZighKGg9PT1udWxsfHxoLnNlbGVjdD09PXZvaWQgMCkpe2lmKHQucm93cyh7c2VsZWN0ZWQ6ITB9KS5hbnkoKSYmdC5yb3dzKCkuZGVzZWxlY3QoKSxoLnNlbGVjdC5yb3dzIT09dm9pZCAwJiZ0LnJvd3MoaC5zZWxlY3Qucm93cykuc2VsZWN0KCksdC5jb2x1bW5zKHtzZWxlY3RlZDohMH0pLmFueSgpJiZ0LmNvbHVtbnMoKS5kZXNlbGVjdCgpLGguc2VsZWN0LmNvbHVtbnMhPT12b2lkIDAmJnQuY29sdW1ucyhoLnNlbGVjdC5jb2x1bW5zKS5zZWxlY3QoKSx0LmNlbGxzKHtzZWxlY3RlZDohMH0pLmFueSgpJiZ0LmNlbGxzKCkuZGVzZWxlY3QoKSxoLnNlbGVjdC5jZWxscyE9PXZvaWQgMClmb3IodmFyIF89MDtfPGguc2VsZWN0LmNlbGxzLmxlbmd0aDtfKyspdC5jZWxsKGguc2VsZWN0LmNlbGxzW19dLnJvdyxoLnNlbGVjdC5jZWxsc1tfXS5jb2x1bW4pLnNlbGVjdCgpO3Quc3RhdGUuc2F2ZSgpfX07dC5vbigic3RhdGVTYXZlUGFyYW1zIixmdW5jdGlvbihjLGwsaCl7aC5zZWxlY3Q9e30saC5zZWxlY3Qucm93cz10LnJvd3Moe3NlbGVjdGVkOiEwfSkuaWRzKCEwKS50b0FycmF5KCksaC5zZWxlY3QuY29sdW1ucz10LmNvbHVtbnMoe3NlbGVjdGVkOiEwfSlbMF0saC5zZWxlY3QuY2VsbHM9dC5jZWxscyh7c2VsZWN0ZWQ6ITB9KVswXS5tYXAoZnVuY3Rpb24oXyl7cmV0dXJue3Jvdzp0LnJvdyhfLnJvdykuaWQoITApLGNvbHVtbjpfLmNvbHVtbn19KX0pLm9uKCJzdGF0ZUxvYWRQYXJhbXMiLHIpLm9uZSgiaW5pdCIsZnVuY3Rpb24oKXtyKHZvaWQgMCx2b2lkIDAsbil9KTt2YXIgcz1lLm9Jbml0LnNlbGVjdCxpPWF0LmRlZmF1bHRzLnNlbGVjdCxvPXM9PT12b2lkIDA/aTpzLHU9InJvdyIscD0iYXBpIixiPSExLGc9ITAsbT0hMCxDPSJ0ZCwgdGgiLHk9InNlbGVjdGVkIixUPSEwLFA9ITE7ZS5fc2VsZWN0PXtpbmZvRWxzOltdfSxvPT09ITA/KHA9Im9zIixQPSEwKTp0eXBlb2Ygbz09InN0cmluZyI/KHA9byxQPSEwKTpFdC5pc1BsYWluT2JqZWN0KG8pJiYoby5ibHVyYWJsZSE9PXZvaWQgMCYmKGI9by5ibHVyYWJsZSksby50b2dnbGVhYmxlIT09dm9pZCAwJiYoZz1vLnRvZ2dsZWFibGUpLG8uaW5mbyE9PXZvaWQgMCYmKG09by5pbmZvKSxvLml0ZW1zIT09dm9pZCAwJiYodT1vLml0ZW1zKSxvLnN0eWxlIT09dm9pZCAwPyhwPW8uc3R5bGUsUD0hMCk6KHA9Im9zIixQPSEwKSxvLnNlbGVjdG9yIT09dm9pZCAwJiYoQz1vLnNlbGVjdG9yKSxvLmNsYXNzTmFtZSE9PXZvaWQgMCYmKHk9by5jbGFzc05hbWUpLG8uaGVhZGVyQ2hlY2tib3ghPT12b2lkIDAmJihUPW8uaGVhZGVyQ2hlY2tib3gpKSx0LnNlbGVjdC5zZWxlY3RvcihDKSx0LnNlbGVjdC5pdGVtcyh1KSx0LnNlbGVjdC5zdHlsZShwKSx0LnNlbGVjdC5ibHVyYWJsZShiKSx0LnNlbGVjdC50b2dnbGVhYmxlKGcpLHQuc2VsZWN0LmluZm8obSksZS5fc2VsZWN0LmNsYXNzTmFtZT15LCFQJiZFdCh0LnRhYmxlKCkubm9kZSgpKS5oYXNDbGFzcygic2VsZWN0YWJsZSIpJiZ0LnNlbGVjdC5zdHlsZSgib3MiKSwoVHx8VD09PSJzZWxlY3QtcGFnZSJ8fFQ9PT0ic2VsZWN0LWFsbCIpJiYoUXModCxUKSx0Lm9uKCJpbml0IixmdW5jdGlvbigpe1FzKHQsVCl9KSl9fTtmdW5jdGlvbiBLcyh0LGUsbil7dmFyIHIscyxpLG89ZnVuY3Rpb24ocCxiKXtpZihwPmIpe3ZhciBnPWI7Yj1wLHA9Z312YXIgbT0hMTtyZXR1cm4gdC5jb2x1bW5zKCI6dmlzaWJsZSIpLmluZGV4ZXMoKS5maWx0ZXIoZnVuY3Rpb24oQyl7cmV0dXJuIEM9PT1wJiYobT0hMCksQz09PWI/KG09ITEsITApOm19KX0sdT1mdW5jdGlvbihwLGIpe3ZhciBnPXQucm93cyh7c2VhcmNoOiJhcHBsaWVkIn0pLmluZGV4ZXMoKTtpZihnLmluZGV4T2YocCk+Zy5pbmRleE9mKGIpKXt2YXIgbT1iO2I9cCxwPW19dmFyIEM9ITE7cmV0dXJuIGcuZmlsdGVyKGZ1bmN0aW9uKHkpe3JldHVybiB5PT09cCYmKEM9ITApLHk9PT1iPyhDPSExLCEwKTpDfSl9OyF0LmNlbGxzKHtzZWxlY3RlZDohMH0pLmFueSgpJiYhbj8ocz1vKDAsZS5jb2x1bW4pLGk9dSgwLGUucm93KSk6KHM9byhuLmNvbHVtbixlLmNvbHVtbiksaT11KG4ucm93LGUucm93KSkscj10LmNlbGxzKGkscykuZmxhdHRlbigpLHQuY2VsbHMoZSx7c2VsZWN0ZWQ6ITB9KS5hbnkoKT90LmNlbGxzKHIpLmRlc2VsZWN0KCk6dC5jZWxscyhyKS5zZWxlY3QoKX1mdW5jdGlvbiBWbih0KXt2YXIgZT1hdC5zZWxlY3QuY2xhc3Nlcy5jaGVja2JveDtyZXR1cm4gdD9lLnJlcGxhY2UoLyAvZywiLiIpOmV9ZnVuY3Rpb24gZWEodCl7dmFyIGU9dC5zZXR0aW5ncygpWzBdLG49ZS5fc2VsZWN0LnNlbGVjdG9yO0V0KHQudGFibGUoKS5jb250YWluZXIoKSkub2ZmKCJtb3VzZWRvd24uZHRTZWxlY3QiLG4pLm9mZigibW91c2V1cC5kdFNlbGVjdCIsbikub2ZmKCJjbGljay5kdFNlbGVjdCIsbiksRXQoImJvZHkiKS5vZmYoImNsaWNrLmR0U2VsZWN0IituYSh0LnRhYmxlKCkubm9kZSgpKSl9ZnVuY3Rpb24gbm8odCl7dmFyIGU9RXQodC50YWJsZSgpLmNvbnRhaW5lcigpKSxuPXQuc2V0dGluZ3MoKVswXSxyPW4uX3NlbGVjdC5zZWxlY3RvcixzO2Uub24oIm1vdXNlZG93bi5kdFNlbGVjdCIscixmdW5jdGlvbihpKXsoaS5zaGlmdEtleXx8aS5tZXRhS2V5fHxpLmN0cmxLZXkpJiZlLmNzcygiLW1vei11c2VyLXNlbGVjdCIsIm5vbmUiKS5vbmUoInNlbGVjdHN0YXJ0LmR0U2VsZWN0IixyLGZ1bmN0aW9uKCl7cmV0dXJuITF9KSx3aW5kb3cuZ2V0U2VsZWN0aW9uJiYocz13aW5kb3cuZ2V0U2VsZWN0aW9uKCkpfSkub24oIm1vdXNldXAuZHRTZWxlY3QiLHIsZnVuY3Rpb24oKXtlLmNzcygiLW1vei11c2VyLXNlbGVjdCIsIiIpfSkub24oImNsaWNrLmR0U2VsZWN0IixyLGZ1bmN0aW9uKGkpe3ZhciBvPXQuc2VsZWN0Lml0ZW1zKCksdTtpZihzKXt2YXIgcD13aW5kb3cuZ2V0U2VsZWN0aW9uKCk7aWYoKCFwLmFuY2hvck5vZGV8fEV0KHAuYW5jaG9yTm9kZSkuY2xvc2VzdCgidGFibGUiKVswXT09PXQudGFibGUoKS5ub2RlKCkpJiZwIT09cylyZXR1cm59dmFyIGI9dC5zZXR0aW5ncygpWzBdLGc9dC50YWJsZSgpLmNvbnRhaW5lcigpO2lmKEV0KGkudGFyZ2V0KS5jbG9zZXN0KCJkaXYuZHQtY29udGFpbmVyIilbMF09PWcpe3ZhciBtPXQuY2VsbChFdChpLnRhcmdldCkuY2xvc2VzdCgidGQsIHRoIikpO2lmKG0uYW55KCkpe3ZhciBDPUV0LkV2ZW50KCJ1c2VyLXNlbGVjdC5kdCIpO2lmKEtlKHQsQyxbbyxtLGldKSwhQy5pc0RlZmF1bHRQcmV2ZW50ZWQoKSl7dmFyIHk9bS5pbmRleCgpO289PT0icm93Ij8odT15LnJvdyxKaShpLHQsYiwicm93Iix1KSk6bz09PSJjb2x1bW4iPyh1PW0uaW5kZXgoKS5jb2x1bW4sSmkoaSx0LGIsImNvbHVtbiIsdSkpOm89PT0iY2VsbCImJih1PW0uaW5kZXgoKSxKaShpLHQsYiwiY2VsbCIsdSkpLGIuX3NlbGVjdF9sYXN0Q2VsbD15fX19fSksRXQoImJvZHkiKS5vbigiY2xpY2suZHRTZWxlY3QiK25hKHQudGFibGUoKS5ub2RlKCkpLGZ1bmN0aW9uKGkpe2lmKG4uX3NlbGVjdC5ibHVyYWJsZSl7aWYoRXQoaS50YXJnZXQpLnBhcmVudHMoKS5maWx0ZXIodC50YWJsZSgpLmNvbnRhaW5lcigpKS5sZW5ndGh8fEV0KGkudGFyZ2V0KS5wYXJlbnRzKCJodG1sIikubGVuZ3RoPT09MHx8RXQoaS50YXJnZXQpLnBhcmVudHMoImRpdi5EVEUiKS5sZW5ndGgpcmV0dXJuO3ZhciBvPUV0LkV2ZW50KCJzZWxlY3QtYmx1ci5kdCIpO2lmKEtlKHQsbyxbaS50YXJnZXQsaV0pLG8uaXNEZWZhdWx0UHJldmVudGVkKCkpcmV0dXJuO2xyKG4sITApfX0pfWZ1bmN0aW9uIEtlKHQsZSxuLHIpe3ImJiF0LmZsYXR0ZW4oKS5sZW5ndGh8fCh0eXBlb2YgZT09InN0cmluZyImJihlPWUrIi5kdCIpLG4udW5zaGlmdCh0KSxFdCh0LnRhYmxlKCkubm9kZSgpKS50cmlnZ2VyKGUsbikpfWZ1bmN0aW9uIHFyKHQpe3JldHVybiB0Lm1SZW5kZXImJnQubVJlbmRlci5fbmFtZT09PSJzZWxlY3RDaGVja2JveCJ9ZnVuY3Rpb24gSnModCxlKXtpZighKHQuc2VsZWN0LnN0eWxlKCk9PT0iYXBpInx8dC5zZWxlY3QuaW5mbygpPT09ITEpKXt2YXIgbj10LnJvd3Moe3NlbGVjdGVkOiEwfSkuZmxhdHRlbigpLmxlbmd0aCxyPXQuY29sdW1ucyh7c2VsZWN0ZWQ6ITB9KS5mbGF0dGVuKCkubGVuZ3RoLHM9dC5jZWxscyh7c2VsZWN0ZWQ6ITB9KS5mbGF0dGVuKCkubGVuZ3RoLGk9ZnVuY3Rpb24oYixnLG0pe2IuYXBwZW5kKEV0KCc8c3BhbiBjbGFzcz0ic2VsZWN0LWl0ZW0iLz4nKS5hcHBlbmQodC5pMThuKCJzZWxlY3QuIitnKyJzIix7XzoiJWQgIitnKyJzIHNlbGVjdGVkIiwwOiIiLDE6IjEgIitnKyIgc2VsZWN0ZWQifSxtKSkpfSxvPUV0KGUpLHU9RXQoJzxzcGFuIGNsYXNzPSJzZWxlY3QtaW5mbyIvPicpO2kodSwicm93IixuKSxpKHUsImNvbHVtbiIsciksaSh1LCJjZWxsIixzKTt2YXIgcD1vLmNoaWxkcmVuKCJzcGFuLnNlbGVjdC1pbmZvIik7cC5sZW5ndGgmJnAucmVtb3ZlKCksdS50ZXh0KCkhPT0iIiYmby5hcHBlbmQodSl9fWZ1bmN0aW9uIFFzKHQsZSl7dmFyIG49dC5zZXR0aW5ncygpWzBdLmFvQ29sdW1uczt0LmNvbHVtbnMoKS5pdGVyYXRvcigiY29sdW1uIixmdW5jdGlvbihyLHMpe3ZhciBpPW5bc107aWYocXIoaSkpe3ZhciBvPXQuY29sdW1uKHMpLmhlYWRlcigpO2lmKCFFdCgiaW5wdXQiLG8pLmxlbmd0aCl7dmFyIHU9RXQoIjxpbnB1dD4iKS5hdHRyKHtjbGFzczpWbighMCksdHlwZToiY2hlY2tib3giLCJhcmlhLWxhYmVsIjp0LmkxOG4oInNlbGVjdC5hcmlhLmhlYWRlckNoZWNrYm94Iil8fCJTZWxlY3QgYWxsIHJvd3MifSkuYXBwZW5kVG8obykub24oImNoYW5nZSIsZnVuY3Rpb24oKXt0aGlzLmNoZWNrZWQ/ZT09InNlbGVjdC1wYWdlIj90LnJvd3Moe3BhZ2U6ImN1cnJlbnQifSkuc2VsZWN0KCk6dC5yb3dzKHtzZWFyY2g6ImFwcGxpZWQifSkuc2VsZWN0KCk6dC5yb3dzKHtzZWxlY3RlZDohMH0pLmRlc2VsZWN0KCl9KS5vbigiY2xpY2siLGZ1bmN0aW9uKHApe3Auc3RvcFByb3BhZ2F0aW9uKCl9KTt0Lm9uKCJkcmF3IHNlbGVjdCBkZXNlbGVjdCIsZnVuY3Rpb24ocCxiLGcpe2lmKGc9PT0icm93Inx8IWcpe3ZhciBtPXQucm93cyh7c2VsZWN0ZWQ6ITB9KS5jb3VudCgpLEM9dC5yb3dzKHtzZWFyY2g6ImFwcGxpZWQiLHNlbGVjdGVkOiEwfSkuY291bnQoKSx5PWU9PSJzZWxlY3QtcGFnZSI/dC5yb3dzKHtwYWdlOiJjdXJyZW50In0pLmNvdW50KCk6dC5yb3dzKHtzZWFyY2g6ImFwcGxpZWQifSkuY291bnQoKTtDJiZDPD1tJiZDPT09eT91LnByb3AoImNoZWNrZWQiLCEwKS5wcm9wKCJpbmRldGVybWluYXRlIiwhMSk6Qz09PTAmJm09PT0wP3UucHJvcCgiY2hlY2tlZCIsITEpLnByb3AoImluZGV0ZXJtaW5hdGUiLCExKTp1LnByb3AoImNoZWNrZWQiLCExKS5wcm9wKCJpbmRldGVybWluYXRlIiwhMCl9fSl9fX0pfWZ1bmN0aW9uIG9kKHQpe3ZhciBlPW5ldyBhdC5BcGkodCk7dC5fc2VsZWN0X2luaXQ9ITAsdC5hb1Jvd0NyZWF0ZWRDYWxsYmFjay5wdXNoKGZ1bmN0aW9uKG4scixzKXt2YXIgaSxvLHU9dC5hb0RhdGFbc107Zm9yKHUuX3NlbGVjdF9zZWxlY3RlZCYmRXQobikuYWRkQ2xhc3ModC5fc2VsZWN0LmNsYXNzTmFtZSkuZmluZCgiaW5wdXQuIitWbighMCkpLnByb3AoImNoZWNrZWQiLCEwKSxpPTAsbz10LmFvQ29sdW1ucy5sZW5ndGg7aTxvO2krKykodC5hb0NvbHVtbnNbaV0uX3NlbGVjdF9zZWxlY3RlZHx8dS5fc2VsZWN0ZWRfY2VsbHMmJnUuX3NlbGVjdGVkX2NlbGxzW2ldKSYmRXQodS5hbkNlbGxzW2ldKS5hZGRDbGFzcyh0Ll9zZWxlY3QuY2xhc3NOYW1lKX0pLGUub24oInByZVhoci5kdC5kdFNlbGVjdCIsZnVuY3Rpb24obixyKXtpZihyPT09ZS5zZXR0aW5ncygpWzBdKXt2YXIgcz1lLnJvd3Moe3NlbGVjdGVkOiEwfSkuaWRzKCEwKS5maWx0ZXIoZnVuY3Rpb24obyl7cmV0dXJuIG8hPT12b2lkIDB9KSxpPWUuY2VsbHMoe3NlbGVjdGVkOiEwfSkuZXEoMCkubWFwKGZ1bmN0aW9uKG8pe3ZhciB1PWUucm93KG8ucm93KS5pZCghMCk7cmV0dXJuIHU/e3Jvdzp1LGNvbHVtbjpvLmNvbHVtbn06dm9pZCAwfSkuZmlsdGVyKGZ1bmN0aW9uKG8pe3JldHVybiBvIT09dm9pZCAwfSk7ZS5vbmUoImRyYXcuZHQuZHRTZWxlY3QiLGZ1bmN0aW9uKCl7ZS5yb3dzKHMpLnNlbGVjdCgpLGkuYW55KCkmJmkuZWFjaChmdW5jdGlvbihvKXtlLmNlbGxzKG8ucm93LG8uY29sdW1uKS5zZWxlY3QoKX0pfSl9fSksZS5vbigiaW5mby5kdCIsZnVuY3Rpb24obixyLHMpe3IuX3NlbGVjdC5pbmZvRWxzLmluY2x1ZGVzKHMpfHxyLl9zZWxlY3QuaW5mb0Vscy5wdXNoKHMpLEpzKGUscyl9KSxlLm9uKCJzZWxlY3QuZHRTZWxlY3QuZHQgZGVzZWxlY3QuZHRTZWxlY3QuZHQiLGZ1bmN0aW9uKCl7dC5fc2VsZWN0LmluZm9FbHMuZm9yRWFjaChmdW5jdGlvbihuKXtKcyhlLG4pfSksZS5zdGF0ZS5zYXZlKCl9KSxlLm9uKCJkZXN0cm95LmR0U2VsZWN0IixmdW5jdGlvbigpe0V0KGUucm93cyh7c2VsZWN0ZWQ6ITB9KS5ub2RlcygpKS5yZW1vdmVDbGFzcyhlLnNldHRpbmdzKClbMF0uX3NlbGVjdC5jbGFzc05hbWUpLEV0KCJpbnB1dC4iK1ZuKCEwKSxlLnRhYmxlKCkuaGVhZGVyKCkpLnJlbW92ZSgpLGVhKGUpLGUub2ZmKCIuZHRTZWxlY3QiKSxFdCgiYm9keSIpLm9mZigiLmR0U2VsZWN0IituYShlLnRhYmxlKCkubm9kZSgpKSl9KX1mdW5jdGlvbiB0byh0LGUsbixyKXt2YXIgcz10W2UrInMiXSh7c2VhcmNoOiJhcHBsaWVkIn0pLmluZGV4ZXMoKSxpPXMuaW5kZXhPZihyKSxvPXMuaW5kZXhPZihuKTtpZighdFtlKyJzIl0oe3NlbGVjdGVkOiEwfSkuYW55KCkmJmk9PT0tMSlzLnNwbGljZShzLmluZGV4T2YobikrMSxzLmxlbmd0aCk7ZWxzZXtpZihpPm8pe3ZhciB1PW87bz1pLGk9dX1zLnNwbGljZShvKzEscy5sZW5ndGgpLHMuc3BsaWNlKDAsaSl9dFtlXShuLHtzZWxlY3RlZDohMH0pLmFueSgpPyhzLnNwbGljZShzLmluZGV4T2YobiksMSksdFtlKyJzIl0ocykuZGVzZWxlY3QoKSk6dFtlKyJzIl0ocykuc2VsZWN0KCl9ZnVuY3Rpb24gbHIodCxlKXtpZihlfHx0Ll9zZWxlY3Quc3R5bGU9PT0ic2luZ2xlIil7dmFyIG49bmV3IGF0LkFwaSh0KTtuLnJvd3Moe3NlbGVjdGVkOiEwfSkuZGVzZWxlY3QoKSxuLmNvbHVtbnMoe3NlbGVjdGVkOiEwfSkuZGVzZWxlY3QoKSxuLmNlbGxzKHtzZWxlY3RlZDohMH0pLmRlc2VsZWN0KCl9fWZ1bmN0aW9uIEppKHQsZSxuLHIscyl7dmFyIGk9ZS5zZWxlY3Quc3R5bGUoKSxvPWUuc2VsZWN0LnRvZ2dsZWFibGUoKSx1PWVbcl0ocyx7c2VsZWN0ZWQ6ITB9KS5hbnkoKTtpZighKHUmJiFvKSlpZihpPT09Im9zIilpZih0LmN0cmxLZXl8fHQubWV0YUtleSllW3JdKHMpLnNlbGVjdCghdSk7ZWxzZSBpZih0LnNoaWZ0S2V5KXI9PT0iY2VsbCI/S3MoZSxzLG4uX3NlbGVjdF9sYXN0Q2VsbHx8bnVsbCk6dG8oZSxyLHMsbi5fc2VsZWN0X2xhc3RDZWxsP24uX3NlbGVjdF9sYXN0Q2VsbFtyXTpudWxsKTtlbHNle3ZhciBwPWVbcisicyJdKHtzZWxlY3RlZDohMH0pO3UmJnAuZmxhdHRlbigpLmxlbmd0aD09PTE/ZVtyXShzKS5kZXNlbGVjdCgpOihwLmRlc2VsZWN0KCksZVtyXShzKS5zZWxlY3QoKSl9ZWxzZSBpPT0ibXVsdGkrc2hpZnQiJiZ0LnNoaWZ0S2V5P3I9PT0iY2VsbCI/S3MoZSxzLG4uX3NlbGVjdF9sYXN0Q2VsbHx8bnVsbCk6dG8oZSxyLHMsbi5fc2VsZWN0X2xhc3RDZWxsP24uX3NlbGVjdF9sYXN0Q2VsbFtyXTpudWxsKTplW3JdKHMpLnNlbGVjdCghdSl9ZnVuY3Rpb24gbmEodCl7cmV0dXJuIHQuaWQucmVwbGFjZSgvW15hLXpBLVowLTlcLVxfXS9nLCItIil9RXQuZWFjaChbe3R5cGU6InJvdyIscHJvcDoiYW9EYXRhIn0se3R5cGU6ImNvbHVtbiIscHJvcDoiYW9Db2x1bW5zIn1dLGZ1bmN0aW9uKHQsZSl7YXQuZXh0LnNlbGVjdG9yW2UudHlwZV0ucHVzaChmdW5jdGlvbihuLHIscyl7dmFyIGk9ci5zZWxlY3RlZCxvLHU9W107aWYoaSE9PSEwJiZpIT09ITEpcmV0dXJuIHM7Zm9yKHZhciBwPTAsYj1zLmxlbmd0aDtwPGI7cCsrKW89bltlLnByb3BdW3NbcF1dLG8mJihpPT09ITAmJm8uX3NlbGVjdF9zZWxlY3RlZD09PSEwfHxpPT09ITEmJiFvLl9zZWxlY3Rfc2VsZWN0ZWQpJiZ1LnB1c2goc1twXSk7cmV0dXJuIHV9KX0pO2F0LmV4dC5zZWxlY3Rvci5jZWxsLnB1c2goZnVuY3Rpb24odCxlLG4pe3ZhciByPWUuc2VsZWN0ZWQscyxpPVtdO2lmKHI9PT12b2lkIDApcmV0dXJuIG47Zm9yKHZhciBvPTAsdT1uLmxlbmd0aDtvPHU7bysrKXM9dC5hb0RhdGFbbltvXS5yb3ddLHMmJihyPT09ITAmJnMuX3NlbGVjdGVkX2NlbGxzJiZzLl9zZWxlY3RlZF9jZWxsc1tuW29dLmNvbHVtbl09PT0hMHx8cj09PSExJiYoIXMuX3NlbGVjdGVkX2NlbGxzfHwhcy5fc2VsZWN0ZWRfY2VsbHNbbltvXS5jb2x1bW5dKSkmJmkucHVzaChuW29dKTtyZXR1cm4gaX0pO3ZhciBIZT1hdC5BcGkucmVnaXN0ZXIsSG49YXQuQXBpLnJlZ2lzdGVyUGx1cmFsO0hlKCJzZWxlY3QoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKHQpe2F0LnNlbGVjdC5pbml0KG5ldyBhdC5BcGkodCkpfSl9KTtIZSgic2VsZWN0LmJsdXJhYmxlKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0PT09dm9pZCAwP3RoaXMuY29udGV4dFswXS5fc2VsZWN0LmJsdXJhYmxlOnRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihlKXtlLl9zZWxlY3QuYmx1cmFibGU9dH0pfSk7SGUoInNlbGVjdC50b2dnbGVhYmxlKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0PT09dm9pZCAwP3RoaXMuY29udGV4dFswXS5fc2VsZWN0LnRvZ2dsZWFibGU6dGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKGUpe2UuX3NlbGVjdC50b2dnbGVhYmxlPXR9KX0pO0hlKCJzZWxlY3QuaW5mbygpIixmdW5jdGlvbih0KXtyZXR1cm4gdD09PXZvaWQgMD90aGlzLmNvbnRleHRbMF0uX3NlbGVjdC5pbmZvOnRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihlKXtlLl9zZWxlY3QuaW5mbz10fSl9KTtIZSgic2VsZWN0Lml0ZW1zKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0PT09dm9pZCAwP3RoaXMuY29udGV4dFswXS5fc2VsZWN0Lml0ZW1zOnRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihlKXtlLl9zZWxlY3QuaXRlbXM9dCxLZShuZXcgYXQuQXBpKGUpLCJzZWxlY3RJdGVtcyIsW3RdKX0pfSk7SGUoInNlbGVjdC5zdHlsZSgpIixmdW5jdGlvbih0KXtyZXR1cm4gdD09PXZvaWQgMD90aGlzLmNvbnRleHRbMF0uX3NlbGVjdC5zdHlsZTp0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24oZSl7ZS5fc2VsZWN0fHxhdC5zZWxlY3QuaW5pdChuZXcgYXQuQXBpKGUpKSxlLl9zZWxlY3RfaW5pdHx8b2QoZSksZS5fc2VsZWN0LnN0eWxlPXQ7dmFyIG49bmV3IGF0LkFwaShlKTtlYShuKSx0IT09ImFwaSImJm5vKG4pLEtlKG5ldyBhdC5BcGkoZSksInNlbGVjdFN0eWxlIixbdF0pfSl9KTtIZSgic2VsZWN0LnNlbGVjdG9yKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0PT09dm9pZCAwP3RoaXMuY29udGV4dFswXS5fc2VsZWN0LnNlbGVjdG9yOnRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihlKXtlYShuZXcgYXQuQXBpKGUpKSxlLl9zZWxlY3Quc2VsZWN0b3I9dCxlLl9zZWxlY3Quc3R5bGUhPT0iYXBpIiYmbm8obmV3IGF0LkFwaShlKSl9KX0pO0hlKCJzZWxlY3QubGFzdCgpIixmdW5jdGlvbih0KXtsZXQgZT10aGlzLmNvbnRleHRbMF07cmV0dXJuIHQ/KGUuX3NlbGVjdF9sYXN0Q2VsbD10LHRoaXMpOmUuX3NlbGVjdF9sYXN0Q2VsbH0pO0huKCJyb3dzKCkuc2VsZWN0KCkiLCJyb3coKS5zZWxlY3QoKSIsZnVuY3Rpb24odCl7dmFyIGU9dGhpcztyZXR1cm4gdD09PSExP3RoaXMuZGVzZWxlY3QoKToodGhpcy5pdGVyYXRvcigicm93IixmdW5jdGlvbihuLHIpe2xyKG4pO3ZhciBzPW4uYW9EYXRhW3JdLGk9bi5hb0NvbHVtbnM7RXQocy5uVHIpLmFkZENsYXNzKG4uX3NlbGVjdC5jbGFzc05hbWUpLHMuX3NlbGVjdF9zZWxlY3RlZD0hMDtmb3IodmFyIG89MDtvPGkubGVuZ3RoO28rKyl7dmFyIHU9aVtvXTtpZih1LnNUeXBlPT09bnVsbCYmZS5jb2x1bW5zKCkudHlwZXMoKSxxcih1KSl7dmFyIHA9cy5hbkNlbGxzO3AmJnBbb10mJkV0KCJpbnB1dC4iK1ZuKCEwKSxwW29dKS5wcm9wKCJjaGVja2VkIiwhMCkscy5fYVNvcnREYXRhIT09bnVsbCYmKHMuX2FTb3J0RGF0YVtvXT1udWxsKX19fSksdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKG4scil7S2UoZSwic2VsZWN0IixbInJvdyIsZVtyXV0sITApfSksdGhpcyl9KTtIZSgicm93KCkuc2VsZWN0ZWQoKSIsZnVuY3Rpb24oKXt2YXIgdD10aGlzLmNvbnRleHRbMF07cmV0dXJuISEodCYmdGhpcy5sZW5ndGgmJnQuYW9EYXRhW3RoaXNbMF1dJiZ0LmFvRGF0YVt0aGlzWzBdXS5fc2VsZWN0X3NlbGVjdGVkKX0pO0huKCJjb2x1bW5zKCkuc2VsZWN0KCkiLCJjb2x1bW4oKS5zZWxlY3QoKSIsZnVuY3Rpb24odCl7dmFyIGU9dGhpcztyZXR1cm4gdD09PSExP3RoaXMuZGVzZWxlY3QoKToodGhpcy5pdGVyYXRvcigiY29sdW1uIixmdW5jdGlvbihuLHIpe2xyKG4pLG4uYW9Db2x1bW5zW3JdLl9zZWxlY3Rfc2VsZWN0ZWQ9ITA7dmFyIHM9bmV3IGF0LkFwaShuKS5jb2x1bW4ocik7RXQocy5oZWFkZXIoKSkuYWRkQ2xhc3Mobi5fc2VsZWN0LmNsYXNzTmFtZSksRXQocy5mb290ZXIoKSkuYWRkQ2xhc3Mobi5fc2VsZWN0LmNsYXNzTmFtZSkscy5ub2RlcygpLnRvJCgpLmFkZENsYXNzKG4uX3NlbGVjdC5jbGFzc05hbWUpfSksdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKG4scil7S2UoZSwic2VsZWN0IixbImNvbHVtbiIsZVtyXV0sITApfSksdGhpcyl9KTtIZSgiY29sdW1uKCkuc2VsZWN0ZWQoKSIsZnVuY3Rpb24oKXt2YXIgdD10aGlzLmNvbnRleHRbMF07cmV0dXJuISEodCYmdGhpcy5sZW5ndGgmJnQuYW9Db2x1bW5zW3RoaXNbMF1dJiZ0LmFvQ29sdW1uc1t0aGlzWzBdXS5fc2VsZWN0X3NlbGVjdGVkKX0pO0huKCJjZWxscygpLnNlbGVjdCgpIiwiY2VsbCgpLnNlbGVjdCgpIixmdW5jdGlvbih0KXt2YXIgZT10aGlzO3JldHVybiB0PT09ITE/dGhpcy5kZXNlbGVjdCgpOih0aGlzLml0ZXJhdG9yKCJjZWxsIixmdW5jdGlvbihuLHIscyl7bHIobik7dmFyIGk9bi5hb0RhdGFbcl07aS5fc2VsZWN0ZWRfY2VsbHM9PT12b2lkIDAmJihpLl9zZWxlY3RlZF9jZWxscz1bXSksaS5fc2VsZWN0ZWRfY2VsbHNbc109ITAsaS5hbkNlbGxzJiZFdChpLmFuQ2VsbHNbc10pLmFkZENsYXNzKG4uX3NlbGVjdC5jbGFzc05hbWUpfSksdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKG4scil7S2UoZSwic2VsZWN0IixbImNlbGwiLGUuY2VsbHMoZVtyXSkuaW5kZXhlcygpLnRvQXJyYXkoKV0sITApfSksdGhpcyl9KTtIZSgiY2VsbCgpLnNlbGVjdGVkKCkiLGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jb250ZXh0WzBdO2lmKHQmJnRoaXMubGVuZ3RoKXt2YXIgZT10LmFvRGF0YVt0aGlzWzBdWzBdLnJvd107aWYoZSYmZS5fc2VsZWN0ZWRfY2VsbHMmJmUuX3NlbGVjdGVkX2NlbGxzW3RoaXNbMF1bMF0uY29sdW1uXSlyZXR1cm4hMH1yZXR1cm4hMX0pO0huKCJyb3dzKCkuZGVzZWxlY3QoKSIsInJvdygpLmRlc2VsZWN0KCkiLGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztyZXR1cm4gdGhpcy5pdGVyYXRvcigicm93IixmdW5jdGlvbihlLG4pe3ZhciByPWUuYW9EYXRhW25dLHM9ZS5hb0NvbHVtbnM7RXQoci5uVHIpLnJlbW92ZUNsYXNzKGUuX3NlbGVjdC5jbGFzc05hbWUpLHIuX3NlbGVjdF9zZWxlY3RlZD0hMSxlLl9zZWxlY3RfbGFzdENlbGw9bnVsbDtmb3IodmFyIGk9MDtpPHMubGVuZ3RoO2krKyl7dmFyIG89c1tpXTtpZihvLnNUeXBlPT09bnVsbCYmdC5jb2x1bW5zKCkudHlwZXMoKSxxcihvKSl7dmFyIHU9ci5hbkNlbGxzO3UmJnVbaV0mJkV0KCJpbnB1dC4iK1ZuKCEwKSxyLmFuQ2VsbHNbaV0pLnByb3AoImNoZWNrZWQiLCExKSxyLl9hU29ydERhdGEhPT1udWxsJiYoci5fYVNvcnREYXRhW2ldPW51bGwpfX19KSx0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24oZSxuKXtLZSh0LCJkZXNlbGVjdCIsWyJyb3ciLHRbbl1dLCEwKX0pLHRoaXN9KTtIbigiY29sdW1ucygpLmRlc2VsZWN0KCkiLCJjb2x1bW4oKS5kZXNlbGVjdCgpIixmdW5jdGlvbigpe3ZhciB0PXRoaXM7cmV0dXJuIHRoaXMuaXRlcmF0b3IoImNvbHVtbiIsZnVuY3Rpb24oZSxuKXtlLmFvQ29sdW1uc1tuXS5fc2VsZWN0X3NlbGVjdGVkPSExO3ZhciByPW5ldyBhdC5BcGkoZSkscz1yLmNvbHVtbihuKTtFdChzLmhlYWRlcigpKS5yZW1vdmVDbGFzcyhlLl9zZWxlY3QuY2xhc3NOYW1lKSxFdChzLmZvb3RlcigpKS5yZW1vdmVDbGFzcyhlLl9zZWxlY3QuY2xhc3NOYW1lKSxyLmNlbGxzKG51bGwsbikuaW5kZXhlcygpLmVhY2goZnVuY3Rpb24oaSl7dmFyIG89ZS5hb0RhdGFbaS5yb3ddLHU9by5fc2VsZWN0ZWRfY2VsbHM7by5hbkNlbGxzJiYoIXV8fCF1W2kuY29sdW1uXSkmJkV0KG8uYW5DZWxsc1tpLmNvbHVtbl0pLnJlbW92ZUNsYXNzKGUuX3NlbGVjdC5jbGFzc05hbWUpfSl9KSx0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24oZSxuKXtLZSh0LCJkZXNlbGVjdCIsWyJjb2x1bW4iLHRbbl1dLCEwKX0pLHRoaXN9KTtIbigiY2VsbHMoKS5kZXNlbGVjdCgpIiwiY2VsbCgpLmRlc2VsZWN0KCkiLGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztyZXR1cm4gdGhpcy5pdGVyYXRvcigiY2VsbCIsZnVuY3Rpb24oZSxuLHIpe3ZhciBzPWUuYW9EYXRhW25dO3MuX3NlbGVjdGVkX2NlbGxzIT09dm9pZCAwJiYocy5fc2VsZWN0ZWRfY2VsbHNbcl09ITEpLHMuYW5DZWxscyYmIWUuYW9Db2x1bW5zW3JdLl9zZWxlY3Rfc2VsZWN0ZWQmJkV0KHMuYW5DZWxsc1tyXSkucmVtb3ZlQ2xhc3MoZS5fc2VsZWN0LmNsYXNzTmFtZSl9KSx0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24oZSxuKXtLZSh0LCJkZXNlbGVjdCIsWyJjZWxsIix0W25dXSwhMCl9KSx0aGlzfSk7ZnVuY3Rpb24gTW4odCxlKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIG4uaTE4bigiYnV0dG9ucy4iK3QsZSl9fWZ1bmN0aW9uIFFpKHQpe3ZhciBlPXQuX2V2ZW50TmFtZXNwYWNlO3JldHVybiJkcmF3LmR0LkRUIitlKyIgc2VsZWN0LmR0LkRUIitlKyIgZGVzZWxlY3QuZHQuRFQiK2V9ZnVuY3Rpb24gbGQodCxlKXtyZXR1cm4hIShlLmxpbWl0VG8uaW5kZXhPZigicm93cyIpIT09LTEmJnQucm93cyh7c2VsZWN0ZWQ6ITB9KS5hbnkoKXx8ZS5saW1pdFRvLmluZGV4T2YoImNvbHVtbnMiKSE9PS0xJiZ0LmNvbHVtbnMoe3NlbGVjdGVkOiEwfSkuYW55KCl8fGUubGltaXRUby5pbmRleE9mKCJjZWxscyIpIT09LTEmJnQuY2VsbHMoe3NlbGVjdGVkOiEwfSkuYW55KCkpfXZhciB0YT0wO0V0LmV4dGVuZChhdC5leHQuYnV0dG9ucyx7c2VsZWN0ZWQ6e3RleHQ6TW4oInNlbGVjdGVkIiwiU2VsZWN0ZWQiKSxjbGFzc05hbWU6ImJ1dHRvbnMtc2VsZWN0ZWQiLGxpbWl0VG86WyJyb3dzIiwiY29sdW1ucyIsImNlbGxzIl0saW5pdDpmdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpcztuLl9ldmVudE5hbWVzcGFjZT0iLnNlbGVjdCIrdGErKyx0Lm9uKFFpKG4pLGZ1bmN0aW9uKCl7ci5lbmFibGUobGQodCxuKSl9KSx0aGlzLmRpc2FibGUoKX0sZGVzdHJveTpmdW5jdGlvbih0LGUsbil7dC5vZmYobi5fZXZlbnROYW1lc3BhY2UpfX0sc2VsZWN0ZWRTaW5nbGU6e3RleHQ6TW4oInNlbGVjdGVkU2luZ2xlIiwiU2VsZWN0ZWQgc2luZ2xlIiksY2xhc3NOYW1lOiJidXR0b25zLXNlbGVjdGVkLXNpbmdsZSIsaW5pdDpmdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpcztuLl9ldmVudE5hbWVzcGFjZT0iLnNlbGVjdCIrdGErKyx0Lm9uKFFpKG4pLGZ1bmN0aW9uKCl7dmFyIHM9dC5yb3dzKHtzZWxlY3RlZDohMH0pLmZsYXR0ZW4oKS5sZW5ndGgrdC5jb2x1bW5zKHtzZWxlY3RlZDohMH0pLmZsYXR0ZW4oKS5sZW5ndGgrdC5jZWxscyh7c2VsZWN0ZWQ6ITB9KS5mbGF0dGVuKCkubGVuZ3RoO3IuZW5hYmxlKHM9PT0xKX0pLHRoaXMuZGlzYWJsZSgpfSxkZXN0cm95OmZ1bmN0aW9uKHQsZSxuKXt0Lm9mZihuLl9ldmVudE5hbWVzcGFjZSl9fSxzZWxlY3RBbGw6e3RleHQ6TW4oInNlbGVjdEFsbCIsIlNlbGVjdCBhbGwiKSxjbGFzc05hbWU6ImJ1dHRvbnMtc2VsZWN0LWFsbCIsYWN0aW9uOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBzPXRoaXMuc2VsZWN0Lml0ZW1zKCksaT1yLnNlbGVjdG9yTW9kaWZpZXI7aT8odHlwZW9mIGk9PSJmdW5jdGlvbiImJihpPWkuY2FsbChlLHQsZSxuLHIpKSx0aGlzW3MrInMiXShpKS5zZWxlY3QoKSk6dGhpc1tzKyJzIl0oKS5zZWxlY3QoKX19LHNlbGVjdE5vbmU6e3RleHQ6TW4oInNlbGVjdE5vbmUiLCJEZXNlbGVjdCBhbGwiKSxjbGFzc05hbWU6ImJ1dHRvbnMtc2VsZWN0LW5vbmUiLGFjdGlvbjpmdW5jdGlvbigpe2xyKHRoaXMuc2V0dGluZ3MoKVswXSwhMCl9LGluaXQ6ZnVuY3Rpb24odCxlLG4pe3ZhciByPXRoaXM7bi5fZXZlbnROYW1lc3BhY2U9Ii5zZWxlY3QiK3RhKyssdC5vbihRaShuKSxmdW5jdGlvbigpe3ZhciBzPXQucm93cyh7c2VsZWN0ZWQ6ITB9KS5mbGF0dGVuKCkubGVuZ3RoK3QuY29sdW1ucyh7c2VsZWN0ZWQ6ITB9KS5mbGF0dGVuKCkubGVuZ3RoK3QuY2VsbHMoe3NlbGVjdGVkOiEwfSkuZmxhdHRlbigpLmxlbmd0aDtyLmVuYWJsZShzPjApfSksdGhpcy5kaXNhYmxlKCl9LGRlc3Ryb3k6ZnVuY3Rpb24odCxlLG4pe3Qub2ZmKG4uX2V2ZW50TmFtZXNwYWNlKX19LHNob3dTZWxlY3RlZDp7dGV4dDpNbigic2hvd1NlbGVjdGVkIiwiU2hvdyBvbmx5IHNlbGVjdGVkIiksY2xhc3NOYW1lOiJidXR0b25zLXNob3ctc2VsZWN0ZWQiLGFjdGlvbjpmdW5jdGlvbih0LGUpe2lmKGUuc2VhcmNoLmZpeGVkKCJkdC1zZWxlY3QiKSllLnNlYXJjaC5maXhlZCgiZHQtc2VsZWN0IixudWxsKSx0aGlzLmFjdGl2ZSghMSk7ZWxzZXt2YXIgbj1lLnNldHRpbmdzKClbMF0uYW9EYXRhO2Uuc2VhcmNoLmZpeGVkKCJkdC1zZWxlY3QiLGZ1bmN0aW9uKHIscyxpKXtyZXR1cm4gbltpXS5fc2VsZWN0X3NlbGVjdGVkfSksdGhpcy5hY3RpdmUoITApfWUuZHJhdygpfX19KTtFdC5lYWNoKFsiUm93IiwiQ29sdW1uIiwiQ2VsbCJdLGZ1bmN0aW9uKHQsZSl7dmFyIG49ZS50b0xvd2VyQ2FzZSgpO2F0LmV4dC5idXR0b25zWyJzZWxlY3QiK2UrInMiXT17dGV4dDpNbigic2VsZWN0IitlKyJzIiwiU2VsZWN0ICIrbisicyIpLGNsYXNzTmFtZToiYnV0dG9ucy1zZWxlY3QtIituKyJzIixhY3Rpb246ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdC5pdGVtcyhuKX0saW5pdDpmdW5jdGlvbihyKXt2YXIgcz10aGlzO3Iub24oInNlbGVjdEl0ZW1zLmR0LkRUIixmdW5jdGlvbihpLG8sdSl7cy5hY3RpdmUodT09PW4pfSl9fX0pO2F0LnR5cGUoInNlbGVjdC1jaGVja2JveCIse2NsYXNzTmFtZToiZHQtc2VsZWN0IixkZXRlY3Q6YXQudmVyc2lvbkNoZWNrKCIyLjEiKT97b25lT2Y6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sYWxsT2Y6ZnVuY3Rpb24oKXtyZXR1cm4hMX0saW5pdDpmdW5jdGlvbih0LGUsbil7cmV0dXJuIHFyKGUpfX06ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT0ic2VsZWN0LWNoZWNrYm94Ij90OiExfSxvcmRlcjp7cHJlOmZ1bmN0aW9uKHQpe3JldHVybiB0PT09IlgiPy0xOjB9fX0pO0V0LmV4dGVuZCghMCxhdC5kZWZhdWx0cy5vTGFuZ3VhZ2Use3NlbGVjdDp7YXJpYTp7cm93Q2hlY2tib3g6IlNlbGVjdCByb3cifX19KTthdC5yZW5kZXIuc2VsZWN0PWZ1bmN0aW9uKHQsZSl7dmFyIG49dD9hdC51dGlsLmdldCh0KTpudWxsLHI9ZT9hdC51dGlsLmdldChlKTpudWxsLHM9ZnVuY3Rpb24oaSxvLHUscCl7dmFyIGI9cC5zZXR0aW5ncy5hb0RhdGFbcC5yb3ddLGc9Yi5fc2VsZWN0X3NlbGVjdGVkLG09cC5zZXR0aW5ncy5vTGFuZ3VhZ2Uuc2VsZWN0LmFyaWEucm93Q2hlY2tib3g7cmV0dXJuIG89PT0iZGlzcGxheSI/RXQoIjxpbnB1dD4iKS5hdHRyKHsiYXJpYS1sYWJlbCI6bSxjbGFzczpWbigpLG5hbWU6cj9yKHUpOm51bGwsdHlwZToiY2hlY2tib3giLHZhbHVlOm4/bih1KTpudWxsLGNoZWNrZWQ6Z30pLm9uKCJpbnB1dCIsZnVuY3Rpb24oQyl7Qy5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuY2hlY2tlZD1FdCh0aGlzKS5jbG9zZXN0KCJ0ciIpLmhhc0NsYXNzKCJzZWxlY3RlZCIpfSlbMF06bz09PSJ0eXBlIj8ic2VsZWN0LWNoZWNrYm94IjpvPT09ImZpbHRlciI/IiI6Zz8iWCI6IiJ9O3JldHVybiBzLl9uYW1lPSJzZWxlY3RDaGVja2JveCIsc307YXQuZXh0Lm9yZGVyWyJzZWxlY3QtY2hlY2tib3giXT1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmFwaSgpLmNvbHVtbihlLHtvcmRlcjoiaW5kZXgifSkubm9kZXMoKS5tYXAoZnVuY3Rpb24obil7cmV0dXJuIHQuX3NlbGVjdC5pdGVtcz09PSJyb3ciP0V0KG4pLnBhcmVudCgpLmhhc0NsYXNzKHQuX3NlbGVjdC5jbGFzc05hbWUpLnRvU3RyaW5nKCk6dC5fc2VsZWN0Lml0ZW1zPT09ImNlbGwiP0V0KG4pLmhhc0NsYXNzKHQuX3NlbGVjdC5jbGFzc05hbWUpLnRvU3RyaW5nKCk6ITF9KX07RXQuZm4uRGF0YVRhYmxlLnNlbGVjdD1hdC5zZWxlY3Q7RXQoZG9jdW1lbnQpLm9uKCJwcmVJbml0LmR0LmR0U2VsZWN0IixmdW5jdGlvbih0LGUpe3QubmFtZXNwYWNlPT09ImR0IiYmYXQuc2VsZWN0LmluaXQobmV3IGF0LkFwaShlKSl9KTskZS5CdXR0b25zLmpzemlwKHJvLmRlZmF1bHQpO3ZhciBhYz0kZTt2YXIgZXhwb3J0X2pRdWVyeT11ZC5kZWZhdWx0O2V4cG9ydHskZSBhcyBEYXRhVGFibGUsaWQgYXMgRGF0ZVRpbWUsYWMgYXMgZGVmYXVsdCxleHBvcnRfalF1ZXJ5IGFzIGpRdWVyeX07Ci8qISBCdW5kbGVkIGxpY2Vuc2UgaW5mb3JtYXRpb246Cgpqc3ppcC9kaXN0L2pzemlwLm1pbi5qczoKICAoKiEKICAKICBKU1ppcCB2My4xMC4xIC0gQSBKYXZhU2NyaXB0IGNsYXNzIGZvciBnZW5lcmF0aW5nIGFuZCByZWFkaW5nIHppcCBmaWxlcwogIDxodHRwOi8vc3R1YXJ0ay5jb20vanN6aXA+CiAgCiAgKGMpIDIwMDktMjAxNiBTdHVhcnQgS25pZ2h0bGV5IDxzdHVhcnQgW2F0XSBzdHVhcnRrLmNvbT4KICBEdWFsIGxpY2VuY2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBvciBHUEx2My4gU2VlIGh0dHBzOi8vcmF3LmdpdGh1Yi5jb20vU3R1ay9qc3ppcC9tYWluL0xJQ0VOU0UubWFya2Rvd24uCiAgCiAgSlNaaXAgdXNlcyB0aGUgbGlicmFyeSBwYWtvIHJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSA6CiAgaHR0cHM6Ly9naXRodWIuY29tL25vZGVjYS9wYWtvL2Jsb2IvbWFpbi9MSUNFTlNFCiAgKikKCmpxdWVyeS9kaXN0L2pxdWVyeS5qczoKICAoKiEKICAgKiBqUXVlcnkgSmF2YVNjcmlwdCBMaWJyYXJ5IHYzLjcuMQogICAqIGh0dHBzOi8vanF1ZXJ5LmNvbS8KICAgKgogICAqIENvcHlyaWdodCBPcGVuSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCiAgICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlCiAgICogaHR0cHM6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICAgKgogICAqIERhdGU6IDIwMjMtMDgtMjhUMTM6MzdaCiAgICopCgpkYXRhdGFibGVzLm5ldC9qcy9kYXRhVGFibGVzLm1qczoKICAoKiEgRGF0YVRhYmxlcyAyLjEuNgogICAqIMKpIFNwcnlNZWRpYSBMdGQgLSBkYXRhdGFibGVzLm5ldC9saWNlbnNlCiAgICopCgpkYXRhdGFibGVzLm5ldC1kdC9qcy9kYXRhVGFibGVzLmRhdGFUYWJsZXMubWpzOgogICgqISBEYXRhVGFibGVzIHN0eWxpbmcgaW50ZWdyYXRpb24KICAgKiDCqSBTcHJ5TWVkaWEgTHRkIC0gZGF0YXRhYmxlcy5uZXQvbGljZW5zZQogICAqKQoKZGF0YXRhYmxlcy5uZXQtYnV0dG9ucy9qcy9kYXRhVGFibGVzLmJ1dHRvbnMubWpzOgogICgqISBCdXR0b25zIGZvciBEYXRhVGFibGVzIDMuMS4yCiAgICogwqkgU3ByeU1lZGlhIEx0ZCAtIGRhdGF0YWJsZXMubmV0L2xpY2Vuc2UKICAgKikKCmRhdGF0YWJsZXMubmV0LWJ1dHRvbnMtZHQvanMvYnV0dG9ucy5kYXRhVGFibGVzLm1qczoKICAoKiEgRGF0YVRhYmxlcyBzdHlsaW5nIHdyYXBwZXIgZm9yIEJ1dHRvbnMKICAgKiDCqSBTcHJ5TWVkaWEgTHRkIC0gZGF0YXRhYmxlcy5uZXQvbGljZW5zZQogICAqKQoKZGF0YXRhYmxlcy5uZXQtYnV0dG9ucy9qcy9idXR0b25zLmh0bWw1Lm1pbi5tanM6CiAgKCohCiAgICogSFRNTDUgZXhwb3J0IGJ1dHRvbnMgZm9yIEJ1dHRvbnMgYW5kIERhdGFUYWJsZXMuCiAgICogwqkgU3ByeU1lZGlhIEx0ZCAtIGRhdGF0YWJsZXMubmV0L2xpY2Vuc2UKICAgKgogICAqIEZpbGVTYXZlci5qcyAoMS4zLjMpIC0gTUlUIGxpY2Vuc2UKICAgKiBDb3B5cmlnaHQgwqkgMjAxNiBFbGkgR3JleSAtIGh0dHA6Ly9lbGlncmV5LmNvbQogICAqKQoKZGF0YXRhYmxlcy5uZXQtYnV0dG9ucy9qcy9idXR0b25zLnByaW50Lm1pbi5tanM6CiAgKCohCiAgICogUHJpbnQgYnV0dG9uIGZvciBCdXR0b25zIGFuZCBEYXRhVGFibGVzLgogICAqIMKpIFNwcnlNZWRpYSBMdGQgLSBkYXRhdGFibGVzLm5ldC9saWNlbnNlCiAgICopCgpkYXRhdGFibGVzLm5ldC1idXR0b25zL2pzL2J1dHRvbnMuY29sVmlzLm1pbi5tanM6CiAgKCohCiAgICogQ29sdW1uIHZpc2liaWxpdHkgYnV0dG9ucyBmb3IgQnV0dG9ucyBhbmQgRGF0YVRhYmxlcy4KICAgKiDCqSBTcHJ5TWVkaWEgTHRkIC0gZGF0YXRhYmxlcy5uZXQvbGljZW5zZQogICAqKQoKZGF0YXRhYmxlcy5uZXQtZml4ZWRjb2x1bW5zL2pzL2RhdGFUYWJsZXMuZml4ZWRDb2x1bW5zLm1qczoKICAoKiEgRml4ZWRDb2x1bW5zIDUuMC4wCiAgICogwqkgU3ByeU1lZGlhIEx0ZCAtIGRhdGF0YWJsZXMubmV0L2xpY2Vuc2UKICAgKikKCmRhdGF0YWJsZXMubmV0LWZpeGVkY29sdW1ucy1kdC9qcy9maXhlZENvbHVtbnMuZGF0YVRhYmxlcy5tanM6CiAgKCohIERhdGFUYWJsZXMgaW50ZWdyYXRpb24gZm9yIERhdGFUYWJsZXMnIEZpeGVkQ29sdW1ucwogICAqIMKpIFNwcnlNZWRpYSBMdGQgLSBkYXRhdGFibGVzLm5ldC9saWNlbnNlCiAgICopCgpkYXRhdGFibGVzLm5ldC1rZXl0YWJsZS9qcy9kYXRhVGFibGVzLmtleVRhYmxlLm1qczoKICAoKiEgS2V5VGFibGUgMi4xMi4xCiAgICogwqkgU3ByeU1lZGlhIEx0ZCAtIGRhdGF0YWJsZXMubmV0L2xpY2Vuc2UKICAgKikKCmRhdGF0YWJsZXMubmV0LWtleXRhYmxlLWR0L2pzL2tleVRhYmxlLmRhdGFUYWJsZXMubWpzOgogICgqISBEYXRhVGFibGVzIHN0eWxpbmcgd3JhcHBlciBmb3IgS2V5VGFibGUKICAgKiDCqSBTcHJ5TWVkaWEgTHRkIC0gZGF0YXRhYmxlcy5uZXQvbGljZW5zZQogICAqKQoKZGF0YXRhYmxlcy5uZXQtcm93Z3JvdXAvanMvZGF0YVRhYmxlcy5yb3dHcm91cC5tanM6CiAgKCohIFJvd0dyb3VwIDEuNS4wCiAgICogwqkgU3ByeU1lZGlhIEx0ZCAtIGRhdGF0YWJsZXMubmV0L2xpY2Vuc2UKICAgKikKCmRhdGF0YWJsZXMubmV0LXJvd2dyb3VwLWR0L2pzL3Jvd0dyb3VwLmRhdGFUYWJsZXMubWpzOgogICgqISBEYXRhVGFibGVzIHN0eWxpbmcgd3JhcHBlciBmb3IgUm93R3JvdXAKICAgKiDCqSBTcHJ5TWVkaWEgTHRkIC0gZGF0YXRhYmxlcy5uZXQvbGljZW5zZQogICAqKQoKZGF0YXRhYmxlcy5uZXQtZGF0ZXRpbWUvZGlzdC9kYXRhVGFibGVzLmRhdGVUaW1lLm1qczoKICAoKiEgRGF0ZVRpbWUgcGlja2VyIGZvciBEYXRhVGFibGVzLm5ldCB2MS41LjMKICAgKgogICAqIMKpIFNwcnlNZWRpYSBMdGQsIGFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICogTGljZW5zZTogTUlUIGRhdGF0YWJsZXMubmV0L2xpY2Vuc2UvbWl0CiAgICopCgpkYXRhdGFibGVzLm5ldC1zZWFyY2hidWlsZGVyL2pzL2RhdGFUYWJsZXMuc2VhcmNoQnVpbGRlci5tanM6CiAgKCohIFNlYXJjaEJ1aWxkZXIgMS44LjAKICAgKiDCqVNwcnlNZWRpYSBMdGQgLSBkYXRhdGFibGVzLm5ldC9saWNlbnNlL21pdAogICAqKQoKZGF0YXRhYmxlcy5uZXQtc2VhcmNoYnVpbGRlci1kdC9qcy9zZWFyY2hCdWlsZGVyLmRhdGFUYWJsZXMubWpzOgogICgqISBEYXRhVGFibGVzIGludGVncmF0aW9uIGZvciBEYXRhVGFibGVzJyBTZWFyY2hCdWlsZGVyCiAgICogwqkgU3ByeU1lZGlhIEx0ZCAtIGRhdGF0YWJsZXMubmV0L2xpY2Vuc2UKICAgKikKCmRhdGF0YWJsZXMubmV0LXNlYXJjaHBhbmVzL2pzL2RhdGFUYWJsZXMuc2VhcmNoUGFuZXMubWpzOgogICgqISBTZWFyY2hQYW5lcyAyLjMuMgogICAqIMKpIFNwcnlNZWRpYSBMdGQgLSBkYXRhdGFibGVzLm5ldC9saWNlbnNlCiAgICopCgpkYXRhdGFibGVzLm5ldC1zZWFyY2hwYW5lcy1kdC9qcy9zZWFyY2hQYW5lcy5kYXRhVGFibGVzLm1qczoKICAoKiEgQm9vdHN0cmFwIGludGVncmF0aW9uIGZvciBEYXRhVGFibGVzJyBTZWFyY2hQYW5lcwogICAqIMKpIFNwcnlNZWRpYSBMdGQgLSBkYXRhdGFibGVzLm5ldC9saWNlbnNlCiAgICopCgpkYXRhdGFibGVzLm5ldC1zZWxlY3QvanMvZGF0YVRhYmxlcy5zZWxlY3QubWpzOgogICgqISBTZWxlY3QgZm9yIERhdGFUYWJsZXMgMi4wLjUKICAgKiDCqSBTcHJ5TWVkaWEgTHRkIC0gZGF0YXRhYmxlcy5uZXQvbGljZW5zZS9taXQKICAgKikKCmRhdGF0YWJsZXMubmV0LXNlbGVjdC1kdC9qcy9zZWxlY3QuZGF0YVRhYmxlcy5tanM6CiAgKCohIERhdGFUYWJsZXMgc3R5bGluZyB3cmFwcGVyIGZvciBTZWxlY3QKICAgKiDCqSBTcHJ5TWVkaWEgTHRkIC0gZGF0YXRhYmxlcy5uZXQvbGljZW5zZQogICAqKQoqLwo=";
document.querySelectorAll("#itables_init_notebook_mode_394070e8_4660_44d6_a393_3fa82ccbdee7").forEach(e => e.remove());
</script>
</div>
<div class="cell-output cell-output-display" data-execution_count="11">
<table id="itables_ca06e3ed_9e30_4dfc_b5d2_627470e973d6" class="display nowrap" data-quarto-disable-processing="true" style="table-layout:auto;width:auto;margin:auto;caption-side:bottom">
<thead>
<tr style="text-align: right;">
<th>Name</th>
<th>Sweetness</th>
<th>Fruityness</th>
<th>Fizz</th>
<th>Synthetic</th>
<th>Rating</th>
</tr>
</thead><tbody><tr>
<td style="vertical-align:middle; text-align:left">
<div style="float:left; margin-right: 10px;">
<a href="https://mwouts.github.io/itables/"><svg class="main-svg" xmlns="http://www.w3.org/2000/svg" xlink="http://www.w3.org/1999/xlink" width="64" viewbox="0 0 500 400" style="font-family: 'Droid Sans', sans-serif;">
<g style="fill:#d9d7fc">
<path d="M100,400H500V357H100Z"></path>
<path d="M100,300H400V257H100Z"></path>
<path d="M0,200H400V157H0Z"></path>
<path d="M100,100H500V57H100Z"></path>
<path d="M100,350H500V307H100Z"></path>
<path d="M100,250H400V207H100Z"></path>
<path d="M0,150H400V107H0Z"></path>
<path d="M100,50H500V7H100Z"></path>
</g>
<g style="fill:#1a1366;stroke:#1a1366;">
<rect x="100" y="7" width="400" height="43">
<animate attributename="width" values="0;400;0" dur="5s" repeatcount="indefinite"></animate>
<animate attributename="x" values="100;100;500" dur="5s" repeatcount="indefinite"></animate>
</rect>
<rect x="0" y="107" width="400" height="43">
<animate attributename="width" values="0;400;0" dur="3.5s" repeatcount="indefinite"></animate>
<animate attributename="x" values="0;0;400" dur="3.5s" repeatcount="indefinite"></animate>
</rect>
<rect x="100" y="207" width="300" height="43">
<animate attributename="width" values="0;300;0" dur="3s" repeatcount="indefinite"></animate>
<animate attributename="x" values="100;100;400" dur="3s" repeatcount="indefinite"></animate>
</rect>
<rect x="100" y="307" width="400" height="43">
<animate attributename="width" values="0;400;0" dur="4s" repeatcount="indefinite"></animate>
<animate attributename="x" values="100;100;500" dur="4s" repeatcount="indefinite"></animate>
</rect>
<g style="fill:transparent;stroke-width:8; stroke-linejoin:round" rx="5">
<g transform="translate(45 50) rotate(-45)">
<circle r="33" cx="0" cy="0"></circle>
<rect x="-8" y="32" width="16" height="30"></rect>
</g>
<g transform="translate(450 152)">
<polyline points="-15,-20 -35,-20 -35,40 25,40 25,20"></polyline>
<rect x="-15" y="-40" width="60" height="60"></rect>
</g>
<g transform="translate(50 352)">
<polygon points="-35,-5 0,-40 35,-5"></polygon>
<polygon points="-35,10 0,45 35,10"></polygon>
</g>
<g transform="translate(75 250)">
<polyline points="-30,30 -60,0 -30,-30"></polyline>
<polyline points="0,30 -30,0 0,-30"></polyline>
</g>
<g transform="translate(425 250) rotate(180)">
<polyline points="-30,30 -60,0 -30,-30"></polyline>
<polyline points="0,30 -30,0 0,-30"></polyline>
</g>
</g>
</g>
</svg>
</a>
</div>
<div>
Loading ITables v2.1.5 from the <code>init_notebook_mode</code> cell...
(need <a href="https://mwouts.github.io/itables/troubleshooting.html">help</a>?)</div></td>
</tr></tbody>
</table>
<script type="module">
const { DataTable, jQuery: $ } = await import(window._datatables_src_for_itables_2_1_5);
document.querySelectorAll("#itables_ca06e3ed_9e30_4dfc_b5d2_627470e973d6:not(.dataTable)").forEach(table => {
// Define the table data
const data = [["Adelholzener Cola Mix", 2, 4, 4, 1, 4], ["afri cola", 4, 3, 2, 3, 2], ["afri cola ohne zucker", 3, 4, 4, 5, 3], ["afri-cola 25", 4, 3, 2, 4, 4], ["Almdudler Spezi", 3, 2, 2, 4, 2], ["alwa Limo Cola-Mix", 3, 2, 5, 3, 3], ["Auer Br\u00e4u Cola Mix", 3, 3, 3, 3, 2], ["Bad Brambacher Cola", 2, 3, 2, 1, 4], ["Bad Brambacher Cola Mix", 2, 4, 4, 3, 3], ["Bazi Cola-Mix", 4, 2, 4, 4, 2], ["Brunnthaler Brunnen Cola-Mix", 2, 3, 2, 4, 2], ["Club Cola", 3, 5, 3, 2, 4], ["Club-Mate Cola", 4, 2, 4, 2, 2], ["Coca Cola Zero", 3, 1, 3, 4, 2], ["Coca Cola Zero koffeinfrei", 3, 1, 3, 4, 2], ["Coca-Cola", 3, 2, 4, 2, 4], ["Community Cola", 2, 4, 3, 1, 5], ["Community Cola Zuckerfrei", 3, 1, 3, 3, 4], ["Cubanita Cola Mix", 3, 4, 4, 3, 2], ["deit zuckerfrei Cola Mix", 2, 2, 4, 5, 1], ["dm Guarana Cola", 3, 3, 1, 2, 3], ["Dr. Pepper", 5, 1, 5, 3, 3], ["Dr. Pepper Zero", 4, 1, 3, 5, 1], ["D\u00f6nercola", 5, 4, 4, 5, 1], ["Eichbaum Braumeisters Cola-Mix", 2, 4, 4, 1, 4], ["Eizbach Calypzo Orange & Cola", 2, 2, 4, 1, 5], ["Eizbach Cryztal Cola", 4, 2, 4, 3, 3], ["Ensinger Cola-Mix Limonade", 2, 4, 4, 2, 3], ["Feldschl\u00f6\u00dfchen Mix", 3, 1, 5, 2, 2], ["Fentimans Curiosity Cola", 3, 3, 1, 1, 2], ["flumi Cola-Mix", 3, 2, 4, 2, 3], ["Fl\u00f6tzinger Cola Mix", 3, 3, 4, 3, 5], ["Franken Brunnen Mexi Cola Mix", 3, 4, 4, 1, 3], ["Freeway Cola", 4, 1, 3, 3, 3], ["Freeway Cola Zero", 5, 1, 3, 3, 3], ["Freeway Mixx Max", 3, 2, 2, 4, 3], ["Frische Mische", 1, 4, 3, 2, 4], ["fritz kola", 3, 3, 5, 2, 4], ["fritz kola null zucker", 4, 2, 3, 4, 2], ["fritz kola ohne zucker", 4, 2, 4, 3, 3], ["fritz kola super zero", 3, 2, 4, 2, 4], ["Frucade Cola-Mix", 4, 5, 4, 2, 4], ["Giesinger Kracherl Cola Mix", 3, 4, 4, 1, 4], ["Glorietta Cola", 3, 4, 5, 4, 2], ["Glorietta Cola Mix", 2, 4, 5, 5, 1], ["Gluggerla Cola-Mix", 3, 4, 2, 2, 3], ["Gut und g\u00fcnstig Cola", 3, 1, 1, 4, 1], ["Gut und g\u00fcnstig Cola light", 4, 1, 1, 3, 3], ["Gut und g\u00fcnstig Cola Mix", 2, 2, 1, 4, 2], ["Gut und g\u00fcnstig Cola Zero", 4, 1, 1, 2, 3], ["G\u00fcnni\u2019s Cola-Mix", 3, 3, 4, 2, 3], ["Hatakosen Ramune Blue Cola", 4, 1, 5, 3, 2], ["Hoellen Sprudel Cubana", 3, 2, 3, 4, 2], ["Hubauer Cola-Mix", 4, 4, 2, 4, 3], ["ja! Cola", 3, 2, 1, 4, 2], ["ja! Cola-Mix", 3, 3, 3, 2, 3], ["Jarritos Mexican Cola", 4, 5, 3, 3, 4], ["K-Classic Cola", 4, 1, 3, 2, 3], ["K-Classic Cola + Orange", 2, 3, 2, 4, 2], ["Krombacher Spezi", 3, 3, 4, 3, 3], ["Kuchlbauer Cola~Mix", 3, 4, 3, 3, 3], ["Labertaler Spezial", 2, 2, 3, 1, 3], ["Land L!mo", 3, 3, 3, 3, 2], ["Landbrauerei Cola-Mix", 2, 2, 4, 1, 4], ["Leikeim Cola-Mix", 3, 2, 5, 3, 3], ["Libella Cola Mix", 2, 4, 4, 3, 3], ["Maisacher Cola-Mix", 4, 4, 4, 4, 3], ["Mezzo Mix", 2, 1, 5, 4, 2], ["Mezzo Mix Zero", 3, 2, 3, 5, 2], ["Mio Mio Cola", 2, 2, 3, 3, 3], ["Mio Mio Cola Zero", 5, 1, 3, 3, 3], ["mischmasch ", 2, 4, 5, 2, 3], ["Nawinta Cola-Mix", 3, 2, 5, 3, 2], ["now black cola", 2, 1, 2, 2, 1], ["Now Orange Cola", 1, 4, 5, 2, 3], ["ORGANICS Simply Cola by Red Bull", 4, 3, 2, 4, 2], ["Pali Cola Mix", 3, 4, 2, 2, 4], ["Paul Anderl\u2019s Cola-Mix", 3, 5, 4, 1, 4], ["Paul Anderl\u2019s Schwupp Cola-Mix", 3, 5, 3, 1, 4], ["Paulaner Spezi", 2, 2, 5, 4, 4], ["Paulaner Spezi Zero", 4, 2, 3, 4, 3], ["Penny Cola", 4, 1, 4, 5, 1], ["Penny Cola Mix", 2, 3, 4, 3, 3], ["Penny Cola Mix Zero", 1, 3, 4, 5, 1], ["Pepsi", 2, 2, 4, 2, 5], ["Pepsi Light", 3, 3, 4, 4, 3], ["Pepsi Max", 2, 4, 4, 3, 3], ["Petrusquelle Cola-Mix", 3, 2, 2, 4, 2], ["P\u00f6llinger Cola Mix", 2, 2, 5, 3, 3], ["Schwip Schwap", 3, 2, 4, 4, 3], ["Sinalco Cola", 3, 2, 2, 4, 3], ["Sinalco Cola Mix", 3, 5, 2, 3, 4], ["Spezi", 3, 4, 4, 2, 5], ["Springe Cola ", 3, 5, 2, 3, 4], ["sunfit Cola Mix", 2, 1, 4, 4, 2], ["Teinacher Genuss Cola-Mix", 4, 3, 4, 4, 2], ["The Real Cola by Booster", 2, 1, 5, 5, 2], ["Tirola Kola", 4, 1, 3, 1, 4], ["Tirola Kola leicht", 4, 3, 3, 2, 1], ["VC Cola-Mix", 2, 1, 4, 2, 2], ["Vita Cola Original", 2, 2, 2, 3, 3], ["Vita Cola Original zuckerfrei", 4, 5, 5, 3, 3], ["XXL Limonade Cola Mix", 3, 4, 2, 2, 3]];
// Define the dt_args
let dt_args = {"layout": {"topStart": "pageLength", "topEnd": "search", "bottomStart": "info", "bottomEnd": "paging"}, "order": []};
dt_args["data"] = data;
new DataTable(table, dt_args);
});
</script>
</div>
</div>
</section>
<section id="values" class="level2">
<h2 class="anchored" data-anchor-id="values">Values</h2>
<p><em>Sweetness</em> describes the taste and how sweet it tastes, how much sugar is noticeable, and how sticky the drink is without directly referring to the amount of sugar in the drink - <strong>2.5 out of 5</strong> is my personal fav here.</p>
<p><em>Fruitiness</em> describes how much fruit you can taste. <strong>3 to 4 out of 5</strong> would be perfect for me in a Spezi.</p>
<p>A <em>Synthetic</em> taste sometimes occurs in different types and is often a bit bitter. <strong>Less is better.</strong></p>
<p>Depending on the type and also how it’s delivered, <em>Fizz</em>, which means how carbonated (carbon dioxide) the drink is, does vary a lot. For me, <strong>about 3 to 4</strong> would be best.</p>
<p>Last but not least, <em>Sugar</em> refers directly to the amount of sugar per 100 ml and is recalculated on a scale of 1 to 5, whith 1 being the drink with the least sugar and 5 being the drink with the most sugar in it.</p>
<section id="rating" class="level3">
<h3 class="anchored" data-anchor-id="rating">Rating</h3>
<p>The <em>Rating</em> of each drink is on a scale from <strong>1 to 5</strong>, 5 being the best. It directly indicates how well the drink tasted to me and might not relate to the other attributes. Having a good score in all other categories does not imply a good rating.</p>
</section>
</section>
<section id="top-spezi" class="level2">
<h2 class="anchored" data-anchor-id="top-spezi">Top Spezi</h2>
<p>This is a generated list of all Spezi that scored a 4 or 5 in the final <em>Rating</em>.</p>
<div id="5257b246" class="cell" data-execution_count="4">
<div class="cell-output cell-output-display">
<div> <div id="af748071-5b7a-47b6-9c4c-1d2543ee6ae2" class="plotly-graph-div" style="height:525px; width:100%;"></div> <script type="text/javascript"> require(["plotly"], function(Plotly) { window.PLOTLYENV=window.PLOTLYENV || {}; if (document.getElementById("af748071-5b7a-47b6-9c4c-1d2543ee6ae2")) { Plotly.newPlot( "af748071-5b7a-47b6-9c4c-1d2543ee6ae2", [{"alignmentgroup":"True","bingroup":"y","histfunc":"sum","hovertemplate":"sum of Rating=%{x}\u003cbr\u003eName=%{y}\u003cextra\u003e\u003c\u002fextra\u003e","legendgroup":"","marker":{"color":"orange","pattern":{"shape":""}},"name":"","offsetgroup":"","orientation":"h","showlegend":false,"x":[4,4,4,4,4,4,4,4,4,4,4,5,5,5],"xaxis":"x","y":["Sinalco Cola Mix","Paulaner Spezi","Paul Anderl\u2019s Schwupp Cola-Mix","Paul Anderl\u2019s Cola-Mix","Pali Cola Mix","Landbrauerei Cola-Mix","Giesinger Kracherl Cola Mix","Frucade Cola-Mix","Frische Mische","Eichbaum Braumeisters Cola-Mix","Adelholzener Cola Mix","Spezi","Fl\u00f6tzinger Cola Mix","Eizbach Calypzo Orange & Cola"],"yaxis":"y","type":"histogram"}], {"template":{"data":{"histogram2dcontour":[{"type":"histogram2dcontour","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"choropleth":[{"type":"choropleth","colorbar":{"outlinewidth":0,"ticks":""}}],"histogram2d":[{"type":"histogram2d","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"heatmap":[{"type":"heatmap","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"heatmapgl":[{"type":"heatmapgl","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"contourcarpet":[{"type":"contourcarpet","colorbar":{"outlinewidth":0,"ticks":""}}],"contour":[{"type":"contour","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"surface":[{"type":"surface","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"mesh3d":[{"type":"mesh3d","colorbar":{"outlinewidth":0,"ticks":""}}],"scatter":[{"fillpattern":{"fillmode":"overlay","size":10,"solidity":0.2},"type":"scatter"}],"parcoords":[{"type":"parcoords","line":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatterpolargl":[{"type":"scatterpolargl","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"bar":[{"error_x":{"color":"#2a3f5f"},"error_y":{"color":"#2a3f5f"},"marker":{"line":{"color":"#E5ECF6","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"bar"}],"scattergeo":[{"type":"scattergeo","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatterpolar":[{"type":"scatterpolar","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"histogram":[{"marker":{"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"histogram"}],"scattergl":[{"type":"scattergl","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatter3d":[{"type":"scatter3d","line":{"colorbar":{"outlinewidth":0,"ticks":""}},"marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scattermapbox":[{"type":"scattermapbox","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatterternary":[{"type":"scatterternary","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scattercarpet":[{"type":"scattercarpet","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"carpet":[{"aaxis":{"endlinecolor":"#2a3f5f","gridcolor":"white","linecolor":"white","minorgridcolor":"white","startlinecolor":"#2a3f5f"},"baxis":{"endlinecolor":"#2a3f5f","gridcolor":"white","linecolor":"white","minorgridcolor":"white","startlinecolor":"#2a3f5f"},"type":"carpet"}],"table":[{"cells":{"fill":{"color":"#EBF0F8"},"line":{"color":"white"}},"header":{"fill":{"color":"#C8D4E3"},"line":{"color":"white"}},"type":"table"}],"barpolar":[{"marker":{"line":{"color":"#E5ECF6","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"barpolar"}],"pie":[{"automargin":true,"type":"pie"}]},"layout":{"autotypenumbers":"strict","colorway":["#636efa","#EF553B","#00cc96","#ab63fa","#FFA15A","#19d3f3","#FF6692","#B6E880","#FF97FF","#FECB52"],"font":{"color":"#2a3f5f"},"hovermode":"closest","hoverlabel":{"align":"left"},"paper_bgcolor":"white","plot_bgcolor":"#E5ECF6","polar":{"bgcolor":"#E5ECF6","angularaxis":{"gridcolor":"white","linecolor":"white","ticks":""},"radialaxis":{"gridcolor":"white","linecolor":"white","ticks":""}},"ternary":{"bgcolor":"#E5ECF6","aaxis":{"gridcolor":"white","linecolor":"white","ticks":""},"baxis":{"gridcolor":"white","linecolor":"white","ticks":""},"caxis":{"gridcolor":"white","linecolor":"white","ticks":""}},"coloraxis":{"colorbar":{"outlinewidth":0,"ticks":""}},"colorscale":{"sequential":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"sequentialminus":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"diverging":[[0,"#8e0152"],[0.1,"#c51b7d"],[0.2,"#de77ae"],[0.3,"#f1b6da"],[0.4,"#fde0ef"],[0.5,"#f7f7f7"],[0.6,"#e6f5d0"],[0.7,"#b8e186"],[0.8,"#7fbc41"],[0.9,"#4d9221"],[1,"#276419"]]},"xaxis":{"gridcolor":"white","linecolor":"white","ticks":"","title":{"standoff":15},"zerolinecolor":"white","automargin":true,"zerolinewidth":2},"yaxis":{"gridcolor":"white","linecolor":"white","ticks":"","title":{"standoff":15},"zerolinecolor":"white","automargin":true,"zerolinewidth":2},"scene":{"xaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white","gridwidth":2},"yaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white","gridwidth":2},"zaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white","gridwidth":2}},"shapedefaults":{"line":{"color":"#2a3f5f"}},"annotationdefaults":{"arrowcolor":"#2a3f5f","arrowhead":0,"arrowwidth":1},"geo":{"bgcolor":"white","landcolor":"#E5ECF6","subunitcolor":"white","showland":true,"showlakes":true,"lakecolor":"white"},"title":{"x":0.05},"mapbox":{"style":"light"},"margin":{"b":0,"l":0,"r":0,"t":30}}},"xaxis":{"anchor":"y","domain":[0.0,1.0],"title":{}},"yaxis":{"anchor":"x","domain":[0.0,1.0],"title":{}},"legend":{"tracegroupgap":0},"barmode":"relative"}, {"responsive": true} ).then(function(){
var gd = document.getElementById('af748071-5b7a-47b6-9c4c-1d2543ee6ae2');
var x = new MutationObserver(function (mutations, observer) {{
var display = window.getComputedStyle(gd).display;
if (!display || display === 'none') {{
console.log([gd, 'removed!']);
Plotly.purge(gd);
observer.disconnect();
}}
}});
// Listen for the removal of the full notebook cells
var notebookContainer = gd.closest('#notebook-container');
if (notebookContainer) {{
x.observe(notebookContainer, {childList: true});
}}
// Listen for the clearing of the current output cell
var outputEl = gd.closest('.output');
if (outputEl) {{
x.observe(outputEl, {childList: true});
}}
}) }; }); </script> </div>
</div>
</div>
</section>
<section id="correlations" class="level2">
<h2 class="anchored" data-anchor-id="correlations">Correlations</h2>
<p>It might be interesting to correlate some attributes to see if there are any patterns.</p>
<div id="a6beebff" class="cell" data-execution_count="5">
<div class="cell-output cell-output-display">
<div> <div id="090a1a5b-eb83-4231-9741-3b446f4b94f0" class="plotly-graph-div" style="height:525px; width:100%;"></div> <script type="text/javascript"> require(["plotly"], function(Plotly) { window.PLOTLYENV=window.PLOTLYENV || {}; if (document.getElementById("090a1a5b-eb83-4231-9741-3b446f4b94f0")) { Plotly.newPlot( "090a1a5b-eb83-4231-9741-3b446f4b94f0", [{"coloraxis":"coloraxis","hovertemplate":"Fizz=5\u003cbr\u003eSynthetic=2\u003cbr\u003eSweetness=%{x}\u003cbr\u003eFruityness=%{y}\u003cbr\u003ecount=%{z}\u003cextra\u003e\u003c\u002fextra\u003e","name":"","x":[3,2,1],"xaxis":"x22","xbingroup":"x","y":[1,4,4],"yaxis":"y22","ybingroup":"y","type":"histogram2d"},{"coloraxis":"coloraxis","hovertemplate":"Fizz=5\u003cbr\u003eSynthetic=3\u003cbr\u003eSweetness=%{x}\u003cbr\u003eFruityness=%{y}\u003cbr\u003ecount=%{z}\u003cextra\u003e\u003c\u002fextra\u003e","name":"","x":[3,3,3,2],"xaxis":"x23","xbingroup":"x","y":[2,2,2,2],"yaxis":"y23","ybingroup":"y","type":"histogram2d"},{"coloraxis":"coloraxis","hovertemplate":"Fizz=5\u003cbr\u003eSynthetic=4\u003cbr\u003eSweetness=%{x}\u003cbr\u003eFruityness=%{y}\u003cbr\u003ecount=%{z}\u003cextra\u003e\u003c\u002fextra\u003e","name":"","x":[2,2],"xaxis":"x24","xbingroup":"x","y":[1,2],"yaxis":"y24","ybingroup":"y","type":"histogram2d"},{"coloraxis":"coloraxis","hovertemplate":"Fizz=5\u003cbr\u003eSynthetic=5\u003cbr\u003eSweetness=%{x}\u003cbr\u003eFruityness=%{y}\u003cbr\u003ecount=%{z}\u003cextra\u003e\u003c\u002fextra\u003e","name":"","x":[2],"xaxis":"x25","xbingroup":"x","y":[4],"yaxis":"y25","ybingroup":"y","type":"histogram2d"},{"coloraxis":"coloraxis","hovertemplate":"Fizz=4\u003cbr\u003eSynthetic=1\u003cbr\u003eSweetness=%{x}\u003cbr\u003eFruityness=%{y}\u003cbr\u003ecount=%{z}\u003cextra\u003e\u003c\u002fextra\u003e","name":"","x":[2,2,2,3,3,2,3],"xaxis":"x16","xbingroup":"x","y":[4,4,2,4,4,2,5],"yaxis":"y16","ybingroup":"y","type":"histogram2d"},{"coloraxis":"coloraxis","hovertemplate":"Fizz=4\u003cbr\u003eSynthetic=2\u003cbr\u003eSweetness=%{x}\u003cbr\u003eFruityness=%{y}\u003cbr\u003ecount=%{z}\u003cextra\u003e\u003c\u002fextra\u003e","name":"","x":[2,3,4,3,3,2],"xaxis":"x17","xbingroup":"x","y":[4,2,5,3,4,1],"yaxis":"y17","ybingroup":"y","type":"histogram2d"},{"coloraxis":"coloraxis","hovertemplate":"Fizz=4\u003cbr\u003eSynthetic=3\u003cbr\u003eSweetness=%{x}\u003cbr\u003eFruityness=%{y}\u003cbr\u003ecount=%{z}\u003cextra\u003e\u003c\u002fextra\u003e","name":"","x":[2,3,3,3,2,2],"xaxis":"x18","xbingroup":"x","y":[4,4,3,3,4,3],"yaxis":"y18","ybingroup":"y","type":"histogram2d"},{"coloraxis":"coloraxis","hovertemplate":"Fizz=4\u003cbr\u003eSynthetic=4\u003cbr\u003eSweetness=%{x}\u003cbr\u003eFruityness=%{y}\u003cbr\u003ecount=%{z}\u003cextra\u003e\u003c\u002fextra\u003e","name":"","x":[4,4,3,2,4],"xaxis":"x19","xbingroup":"x","y":[2,4,2,1,3],"yaxis":"y19","ybingroup":"y","type":"histogram2d"},{"coloraxis":"coloraxis","hovertemplate":"Fizz=3\u003cbr\u003eSynthetic=1\u003cbr\u003eSweetness=%{x}\u003cbr\u003eFruityness=%{y}\u003cbr\u003ecount=%{z}\u003cextra\u003e\u003c\u002fextra\u003e","name":"","x":[2,3],"xaxis":"x11","xbingroup":"x","y":[2,5],"yaxis":"y11","ybingroup":"y","type":"histogram2d"},{"coloraxis":"coloraxis","hovertemplate":"Fizz=3\u003cbr\u003eSynthetic=2\u003cbr\u003eSweetness=%{x}\u003cbr\u003eFruityness=%{y}\u003cbr\u003ecount=%{z}\u003cextra\u003e\u003c\u002fextra\u003e","name":"","x":[1,3],"xaxis":"x12","xbingroup":"x","y":[4,3],"yaxis":"y12","ybingroup":"y","type":"histogram2d"},{"coloraxis":"coloraxis","hovertemplate":"Fizz=3\u003cbr\u003eSynthetic=3\u003cbr\u003eSweetness=%{x}\u003cbr\u003eFruityness=%{y}\u003cbr\u003ecount=%{z}\u003cextra\u003e\u003c\u002fextra\u003e","name":"","x":[3,3,3],"xaxis":"x13","xbingroup":"x","y":[3,4,3],"yaxis":"y13","ybingroup":"y","type":"histogram2d"},{"coloraxis":"coloraxis","hovertemplate":"Fizz=3\u003cbr\u003eSynthetic=4\u003cbr\u003eSweetness=%{x}\u003cbr\u003eFruityness=%{y}\u003cbr\u003ecount=%{z}\u003cextra\u003e\u003c\u002fextra\u003e","name":"","x":[3],"xaxis":"x14","xbingroup":"x","y":[2],"yaxis":"y14","ybingroup":"y","type":"histogram2d"},{"coloraxis":"coloraxis","hovertemplate":"Fizz=2\u003cbr\u003eSynthetic=2\u003cbr\u003eSweetness=%{x}\u003cbr\u003eFruityness=%{y}\u003cbr\u003ecount=%{z}\u003cextra\u003e\u003c\u002fextra\u003e","name":"","x":[3,3,3],"xaxis":"x7","xbingroup":"x","y":[4,4,4],"yaxis":"y7","ybingroup":"y","type":"histogram2d"},{"coloraxis":"coloraxis","hovertemplate":"Fizz=2\u003cbr\u003eSynthetic=3\u003cbr\u003eSweetness=%{x}\u003cbr\u003eFruityness=%{y}\u003cbr\u003ecount=%{z}\u003cextra\u003e\u003c\u002fextra\u003e","name":"","x":[3],"xaxis":"x8","xbingroup":"x","y":[5],"yaxis":"y8","ybingroup":"y","type":"histogram2d"},{"coloraxis":"coloraxis","hovertemplate":"Fizz=2\u003cbr\u003eSynthetic=4\u003cbr\u003eSweetness=%{x}\u003cbr\u003eFruityness=%{y}\u003cbr\u003ecount=%{z}\u003cextra\u003e\u003c\u002fextra\u003e","name":"","x":[3,2,3,4,2,3],"xaxis":"x9","xbingroup":"x","y":[2,3,2,4,3,2],"yaxis":"y9","ybingroup":"y","type":"histogram2d"},{"coloraxis":"coloraxis","hovertemplate":"Fizz=1\u003cbr\u003eSynthetic=4\u003cbr\u003eSweetness=%{x}\u003cbr\u003eFruityness=%{y}\u003cbr\u003ecount=%{z}\u003cextra\u003e\u003c\u002fextra\u003e","name":"","x":[2],"xaxis":"x4","xbingroup":"x","y":[2],"yaxis":"y4","ybingroup":"y","type":"histogram2d"}], {"template":{"data":{"histogram2dcontour":[{"type":"histogram2dcontour","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"choropleth":[{"type":"choropleth","colorbar":{"outlinewidth":0,"ticks":""}}],"histogram2d":[{"type":"histogram2d","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"heatmap":[{"type":"heatmap","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"heatmapgl":[{"type":"heatmapgl","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"contourcarpet":[{"type":"contourcarpet","colorbar":{"outlinewidth":0,"ticks":""}}],"contour":[{"type":"contour","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"surface":[{"type":"surface","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"mesh3d":[{"type":"mesh3d","colorbar":{"outlinewidth":0,"ticks":""}}],"scatter":[{"fillpattern":{"fillmode":"overlay","size":10,"solidity":0.2},"type":"scatter"}],"parcoords":[{"type":"parcoords","line":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatterpolargl":[{"type":"scatterpolargl","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"bar":[{"error_x":{"color":"#2a3f5f"},"error_y":{"color":"#2a3f5f"},"marker":{"line":{"color":"#E5ECF6","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"bar"}],"scattergeo":[{"type":"scattergeo","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatterpolar":[{"type":"scatterpolar","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"histogram":[{"marker":{"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"histogram"}],"scattergl":[{"type":"scattergl","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatter3d":[{"type":"scatter3d","line":{"colorbar":{"outlinewidth":0,"ticks":""}},"marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scattermapbox":[{"type":"scattermapbox","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatterternary":[{"type":"scatterternary","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scattercarpet":[{"type":"scattercarpet","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"carpet":[{"aaxis":{"endlinecolor":"#2a3f5f","gridcolor":"white","linecolor":"white","minorgridcolor":"white","startlinecolor":"#2a3f5f"},"baxis":{"endlinecolor":"#2a3f5f","gridcolor":"white","linecolor":"white","minorgridcolor":"white","startlinecolor":"#2a3f5f"},"type":"carpet"}],"table":[{"cells":{"fill":{"color":"#EBF0F8"},"line":{"color":"white"}},"header":{"fill":{"color":"#C8D4E3"},"line":{"color":"white"}},"type":"table"}],"barpolar":[{"marker":{"line":{"color":"#E5ECF6","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"barpolar"}],"pie":[{"automargin":true,"type":"pie"}]},"layout":{"autotypenumbers":"strict","colorway":["#636efa","#EF553B","#00cc96","#ab63fa","#FFA15A","#19d3f3","#FF6692","#B6E880","#FF97FF","#FECB52"],"font":{"color":"#2a3f5f"},"hovermode":"closest","hoverlabel":{"align":"left"},"paper_bgcolor":"white","plot_bgcolor":"#E5ECF6","polar":{"bgcolor":"#E5ECF6","angularaxis":{"gridcolor":"white","linecolor":"white","ticks":""},"radialaxis":{"gridcolor":"white","linecolor":"white","ticks":""}},"ternary":{"bgcolor":"#E5ECF6","aaxis":{"gridcolor":"white","linecolor":"white","ticks":""},"baxis":{"gridcolor":"white","linecolor":"white","ticks":""},"caxis":{"gridcolor":"white","linecolor":"white","ticks":""}},"coloraxis":{"colorbar":{"outlinewidth":0,"ticks":""}},"colorscale":{"sequential":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"sequentialminus":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"diverging":[[0,"#8e0152"],[0.1,"#c51b7d"],[0.2,"#de77ae"],[0.3,"#f1b6da"],[0.4,"#fde0ef"],[0.5,"#f7f7f7"],[0.6,"#e6f5d0"],[0.7,"#b8e186"],[0.8,"#7fbc41"],[0.9,"#4d9221"],[1,"#276419"]]},"xaxis":{"gridcolor":"white","linecolor":"white","ticks":"","title":{"standoff":15},"zerolinecolor":"white","automargin":true,"zerolinewidth":2},"yaxis":{"gridcolor":"white","linecolor":"white","ticks":"","title":{"standoff":15},"zerolinecolor":"white","automargin":true,"zerolinewidth":2},"scene":{"xaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white","gridwidth":2},"yaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white","gridwidth":2},"zaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white","gridwidth":2}},"shapedefaults":{"line":{"color":"#2a3f5f"}},"annotationdefaults":{"arrowcolor":"#2a3f5f","arrowhead":0,"arrowwidth":1},"geo":{"bgcolor":"white","landcolor":"#E5ECF6","subunitcolor":"white","showland":true,"showlakes":true,"lakecolor":"white"},"title":{"x":0.05},"mapbox":{"style":"light"},"margin":{"b":0,"l":0,"r":0,"t":30}}},"xaxis":{"anchor":"y","domain":[0.0,0.18000000000000002],"title":{"text":"Sweetness"}},"yaxis":{"anchor":"x","domain":[0.0,0.17600000000000002],"title":{"text":"Fruityness"}},"xaxis2":{"anchor":"y2","domain":[0.2,0.38],"matches":"x","title":{"text":"Sweetness"}},"yaxis2":{"anchor":"x2","domain":[0.0,0.17600000000000002],"matches":"y","showticklabels":false},"xaxis3":{"anchor":"y3","domain":[0.4,0.5800000000000001],"matches":"x","title":{"text":"Sweetness"}},"yaxis3":{"anchor":"x3","domain":[0.0,0.17600000000000002],"matches":"y","showticklabels":false},"xaxis4":{"anchor":"y4","domain":[0.6000000000000001,0.7800000000000001],"matches":"x","title":{"text":"Sweetness"}},"yaxis4":{"anchor":"x4","domain":[0.0,0.17600000000000002],"matches":"y","showticklabels":false},"xaxis5":{"anchor":"y5","domain":[0.8,0.9800000000000001],"matches":"x","title":{"text":"Sweetness"}},"yaxis5":{"anchor":"x5","domain":[0.0,0.17600000000000002],"matches":"y","showticklabels":false},"xaxis6":{"anchor":"y6","domain":[0.0,0.18000000000000002],"matches":"x","showticklabels":false},"yaxis6":{"anchor":"x6","domain":[0.20600000000000002,0.382],"matches":"y","title":{"text":"Fruityness"}},"xaxis7":{"anchor":"y7","domain":[0.2,0.38],"matches":"x","showticklabels":false},"yaxis7":{"anchor":"x7","domain":[0.20600000000000002,0.382],"matches":"y","showticklabels":false},"xaxis8":{"anchor":"y8","domain":[0.4,0.5800000000000001],"matches":"x","showticklabels":false},"yaxis8":{"anchor":"x8","domain":[0.20600000000000002,0.382],"matches":"y","showticklabels":false},"xaxis9":{"anchor":"y9","domain":[0.6000000000000001,0.7800000000000001],"matches":"x","showticklabels":false},"yaxis9":{"anchor":"x9","domain":[0.20600000000000002,0.382],"matches":"y","showticklabels":false},"xaxis10":{"anchor":"y10","domain":[0.8,0.9800000000000001],"matches":"x","showticklabels":false},"yaxis10":{"anchor":"x10","domain":[0.20600000000000002,0.382],"matches":"y","showticklabels":false},"xaxis11":{"anchor":"y11","domain":[0.0,0.18000000000000002],"matches":"x","showticklabels":false},"yaxis11":{"anchor":"x11","domain":[0.41200000000000003,0.5880000000000001],"matches":"y","title":{"text":"Fruityness"}},"xaxis12":{"anchor":"y12","domain":[0.2,0.38],"matches":"x","showticklabels":false},"yaxis12":{"anchor":"x12","domain":[0.41200000000000003,0.5880000000000001],"matches":"y","showticklabels":false},"xaxis13":{"anchor":"y13","domain":[0.4,0.5800000000000001],"matches":"x","showticklabels":false},"yaxis13":{"anchor":"x13","domain":[0.41200000000000003,0.5880000000000001],"matches":"y","showticklabels":false},"xaxis14":{"anchor":"y14","domain":[0.6000000000000001,0.7800000000000001],"matches":"x","showticklabels":false},"yaxis14":{"anchor":"x14","domain":[0.41200000000000003,0.5880000000000001],"matches":"y","showticklabels":false},"xaxis15":{"anchor":"y15","domain":[0.8,0.9800000000000001],"matches":"x","showticklabels":false},"yaxis15":{"anchor":"x15","domain":[0.41200000000000003,0.5880000000000001],"matches":"y","showticklabels":false},"xaxis16":{"anchor":"y16","domain":[0.0,0.18000000000000002],"matches":"x","showticklabels":false},"yaxis16":{"anchor":"x16","domain":[0.618,0.794],"matches":"y","title":{"text":"Fruityness"}},"xaxis17":{"anchor":"y17","domain":[0.2,0.38],"matches":"x","showticklabels":false},"yaxis17":{"anchor":"x17","domain":[0.618,0.794],"matches":"y","showticklabels":false},"xaxis18":{"anchor":"y18","domain":[0.4,0.5800000000000001],"matches":"x","showticklabels":false},"yaxis18":{"anchor":"x18","domain":[0.618,0.794],"matches":"y","showticklabels":false},"xaxis19":{"anchor":"y19","domain":[0.6000000000000001,0.7800000000000001],"matches":"x","showticklabels":false},"yaxis19":{"anchor":"x19","domain":[0.618,0.794],"matches":"y","showticklabels":false},"xaxis20":{"anchor":"y20","domain":[0.8,0.9800000000000001],"matches":"x","showticklabels":false},"yaxis20":{"anchor":"x20","domain":[0.618,0.794],"matches":"y","showticklabels":false},"xaxis21":{"anchor":"y21","domain":[0.0,0.18000000000000002],"matches":"x","showticklabels":false},"yaxis21":{"anchor":"x21","domain":[0.8240000000000001,1.0],"matches":"y","title":{"text":"Fruityness"}},"xaxis22":{"anchor":"y22","domain":[0.2,0.38],"matches":"x","showticklabels":false},"yaxis22":{"anchor":"x22","domain":[0.8240000000000001,1.0],"matches":"y","showticklabels":false},"xaxis23":{"anchor":"y23","domain":[0.4,0.5800000000000001],"matches":"x","showticklabels":false},"yaxis23":{"anchor":"x23","domain":[0.8240000000000001,1.0],"matches":"y","showticklabels":false},"xaxis24":{"anchor":"y24","domain":[0.6000000000000001,0.7800000000000001],"matches":"x","showticklabels":false},"yaxis24":{"anchor":"x24","domain":[0.8240000000000001,1.0],"matches":"y","showticklabels":false},"xaxis25":{"anchor":"y25","domain":[0.8,0.9800000000000001],"matches":"x","showticklabels":false},"yaxis25":{"anchor":"x25","domain":[0.8240000000000001,1.0],"matches":"y","showticklabels":false},"annotations":[{"font":{},"showarrow":false,"text":"Synthetic=1","x":0.09000000000000001,"xanchor":"center","xref":"paper","y":1.0,"yanchor":"bottom","yref":"paper"},{"font":{},"showarrow":false,"text":"Synthetic=2","x":0.29000000000000004,"xanchor":"center","xref":"paper","y":1.0,"yanchor":"bottom","yref":"paper"},{"font":{},"showarrow":false,"text":"Synthetic=3","x":0.49000000000000005,"xanchor":"center","xref":"paper","y":1.0,"yanchor":"bottom","yref":"paper"},{"font":{},"showarrow":false,"text":"Synthetic=4","x":0.6900000000000002,"xanchor":"center","xref":"paper","y":1.0,"yanchor":"bottom","yref":"paper"},{"font":{},"showarrow":false,"text":"Synthetic=5","x":0.8900000000000001,"xanchor":"center","xref":"paper","y":1.0,"yanchor":"bottom","yref":"paper"},{"font":{},"showarrow":false,"text":"Fizz=1","textangle":90,"x":0.9800000000000001,"xanchor":"left","xref":"paper","y":0.08800000000000001,"yanchor":"middle","yref":"paper"},{"font":{},"showarrow":false,"text":"Fizz=2","textangle":90,"x":0.9800000000000001,"xanchor":"left","xref":"paper","y":0.29400000000000004,"yanchor":"middle","yref":"paper"},{"font":{},"showarrow":false,"text":"Fizz=3","textangle":90,"x":0.9800000000000001,"xanchor":"left","xref":"paper","y":0.5,"yanchor":"middle","yref":"paper"},{"font":{},"showarrow":false,"text":"Fizz=4","textangle":90,"x":0.9800000000000001,"xanchor":"left","xref":"paper","y":0.706,"yanchor":"middle","yref":"paper"},{"font":{},"showarrow":false,"text":"Fizz=5","textangle":90,"x":0.9800000000000001,"xanchor":"left","xref":"paper","y":0.912,"yanchor":"middle","yref":"paper"}],"coloraxis":{"colorbar":{"title":{"text":"count"}},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"showscale":false},"legend":{"tracegroupgap":0}}, {"staticPlot": true, "responsive": true} ).then(function(){
var gd = document.getElementById('090a1a5b-eb83-4231-9741-3b446f4b94f0');
var x = new MutationObserver(function (mutations, observer) {{
var display = window.getComputedStyle(gd).display;
if (!display || display === 'none') {{
console.log([gd, 'removed!']);
Plotly.purge(gd);
observer.disconnect();
}}
}});
// Listen for the removal of the full notebook cells
var notebookContainer = gd.closest('#notebook-container');
if (notebookContainer) {{
x.observe(notebookContainer, {childList: true});
}}
// Listen for the clearing of the current output cell
var outputEl = gd.closest('.output');
if (outputEl) {{
x.observe(outputEl, {childList: true});
}}
}) }; }); </script> </div>
</div>
</div>
<p>Correlating them all at once is pretty overwhelming so let’s reduce it two pairs of two for now.</p>
<section id="sweetness-sugar-correlation" class="level3">
<h3 class="anchored" data-anchor-id="sweetness-sugar-correlation">Sweetness / Sugar Correlation</h3>
<div id="d0a15141" class="cell" data-execution_count="6">
<div class="cell-output cell-output-display">
<div> <div id="b3e105ef-ee02-4878-a86d-e87dc2383dfa" class="plotly-graph-div" style="height:525px; width:100%;"></div> <script type="text/javascript"> require(["plotly"], function(Plotly) { window.PLOTLYENV=window.PLOTLYENV || {}; if (document.getElementById("b3e105ef-ee02-4878-a86d-e87dc2383dfa")) { Plotly.newPlot( "b3e105ef-ee02-4878-a86d-e87dc2383dfa", [{"coloraxis":"coloraxis","hovertemplate":"Sugar=%{x}\u003cbr\u003eFruityness=%{y}\u003cbr\u003ecount=%{z}\u003cextra\u003e\u003c\u002fextra\u003e","name":"","x":[4.0,10.4,9.3,10.2,10.0,10.1,9.9,8.3,9.2,10.3,11.0,9.4,9.1,11.0,10.0,9.2,9.8,10.0,9.1,8.4,10.0,9.6,9.3,10.0,9.9,8.4,9.2,9.0,10.0,9.0,3.9,9.2,10.0,9.5,12.0,7.9,8.9,10.0,9.0,9.5,9.5,10.1,9.2,8.4,2.3,9.2,9.7,8.8,9.2,5.1,9.7,9.3,9.6],"xaxis":"x","xbingroup":"x","y":[4,2,2,3,4,2,3,4,4,2,4,1,2,3,4,2,4,5,4,4,4,2,3,2,4,3,3,3,4,2,3,2,2,4,4,1,4,2,4,4,5,5,2,3,2,2,2,5,4,1,3,1,4],"yaxis":"y","ybingroup":"y","type":"histogram2d"}], {"template":{"data":{"histogram2dcontour":[{"type":"histogram2dcontour","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"choropleth":[{"type":"choropleth","colorbar":{"outlinewidth":0,"ticks":""}}],"histogram2d":[{"type":"histogram2d","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"heatmap":[{"type":"heatmap","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"heatmapgl":[{"type":"heatmapgl","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"contourcarpet":[{"type":"contourcarpet","colorbar":{"outlinewidth":0,"ticks":""}}],"contour":[{"type":"contour","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"surface":[{"type":"surface","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"mesh3d":[{"type":"mesh3d","colorbar":{"outlinewidth":0,"ticks":""}}],"scatter":[{"fillpattern":{"fillmode":"overlay","size":10,"solidity":0.2},"type":"scatter"}],"parcoords":[{"type":"parcoords","line":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatterpolargl":[{"type":"scatterpolargl","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"bar":[{"error_x":{"color":"#2a3f5f"},"error_y":{"color":"#2a3f5f"},"marker":{"line":{"color":"#E5ECF6","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"bar"}],"scattergeo":[{"type":"scattergeo","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatterpolar":[{"type":"scatterpolar","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"histogram":[{"marker":{"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"histogram"}],"scattergl":[{"type":"scattergl","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatter3d":[{"type":"scatter3d","line":{"colorbar":{"outlinewidth":0,"ticks":""}},"marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scattermapbox":[{"type":"scattermapbox","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatterternary":[{"type":"scatterternary","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scattercarpet":[{"type":"scattercarpet","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"carpet":[{"aaxis":{"endlinecolor":"#2a3f5f","gridcolor":"white","linecolor":"white","minorgridcolor":"white","startlinecolor":"#2a3f5f"},"baxis":{"endlinecolor":"#2a3f5f","gridcolor":"white","linecolor":"white","minorgridcolor":"white","startlinecolor":"#2a3f5f"},"type":"carpet"}],"table":[{"cells":{"fill":{"color":"#EBF0F8"},"line":{"color":"white"}},"header":{"fill":{"color":"#C8D4E3"},"line":{"color":"white"}},"type":"table"}],"barpolar":[{"marker":{"line":{"color":"#E5ECF6","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"barpolar"}],"pie":[{"automargin":true,"type":"pie"}]},"layout":{"autotypenumbers":"strict","colorway":["#636efa","#EF553B","#00cc96","#ab63fa","#FFA15A","#19d3f3","#FF6692","#B6E880","#FF97FF","#FECB52"],"font":{"color":"#2a3f5f"},"hovermode":"closest","hoverlabel":{"align":"left"},"paper_bgcolor":"white","plot_bgcolor":"#E5ECF6","polar":{"bgcolor":"#E5ECF6","angularaxis":{"gridcolor":"white","linecolor":"white","ticks":""},"radialaxis":{"gridcolor":"white","linecolor":"white","ticks":""}},"ternary":{"bgcolor":"#E5ECF6","aaxis":{"gridcolor":"white","linecolor":"white","ticks":""},"baxis":{"gridcolor":"white","linecolor":"white","ticks":""},"caxis":{"gridcolor":"white","linecolor":"white","ticks":""}},"coloraxis":{"colorbar":{"outlinewidth":0,"ticks":""}},"colorscale":{"sequential":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"sequentialminus":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"diverging":[[0,"#8e0152"],[0.1,"#c51b7d"],[0.2,"#de77ae"],[0.3,"#f1b6da"],[0.4,"#fde0ef"],[0.5,"#f7f7f7"],[0.6,"#e6f5d0"],[0.7,"#b8e186"],[0.8,"#7fbc41"],[0.9,"#4d9221"],[1,"#276419"]]},"xaxis":{"gridcolor":"white","linecolor":"white","ticks":"","title":{"standoff":15},"zerolinecolor":"white","automargin":true,"zerolinewidth":2},"yaxis":{"gridcolor":"white","linecolor":"white","ticks":"","title":{"standoff":15},"zerolinecolor":"white","automargin":true,"zerolinewidth":2},"scene":{"xaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white","gridwidth":2},"yaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white","gridwidth":2},"zaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white","gridwidth":2}},"shapedefaults":{"line":{"color":"#2a3f5f"}},"annotationdefaults":{"arrowcolor":"#2a3f5f","arrowhead":0,"arrowwidth":1},"geo":{"bgcolor":"white","landcolor":"#E5ECF6","subunitcolor":"white","showland":true,"showlakes":true,"lakecolor":"white"},"title":{"x":0.05},"mapbox":{"style":"light"},"margin":{"b":0,"l":0,"r":0,"t":30}}},"xaxis":{"anchor":"y","domain":[0.0,1.0],"title":{"text":"Sugar"},"dtick":1},"yaxis":{"anchor":"x","domain":[0.0,1.0],"title":{"text":"Fruityness"},"dtick":1},"coloraxis":{"colorbar":{"title":{"text":"count"}},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]},"legend":{"tracegroupgap":0}}, {"staticPlot": true, "responsive": true} ).then(function(){
var gd = document.getElementById('b3e105ef-ee02-4878-a86d-e87dc2383dfa');
var x = new MutationObserver(function (mutations, observer) {{
var display = window.getComputedStyle(gd).display;
if (!display || display === 'none') {{
console.log([gd, 'removed!']);
Plotly.purge(gd);
observer.disconnect();
}}
}});
// Listen for the removal of the full notebook cells
var notebookContainer = gd.closest('#notebook-container');
if (notebookContainer) {{
x.observe(notebookContainer, {childList: true});
}}
// Listen for the clearing of the current output cell
var outputEl = gd.closest('.output');
if (outputEl) {{
x.observe(outputEl, {childList: true});
}}
}) }; }); </script> </div>
</div>
</div>
<p>TODO</p>
</section>
<section id="sweetness-fruitiness-correlation" class="level3">
<h3 class="anchored" data-anchor-id="sweetness-fruitiness-correlation">Sweetness / Fruitiness Correlation</h3>
<div id="372313e0" class="cell" data-execution_count="7">
<div class="cell-output cell-output-display">
<div> <div id="ec9ab4f1-303b-458f-9dc1-b575f6541dfe" class="plotly-graph-div" style="height:525px; width:100%;"></div> <script type="text/javascript"> require(["plotly"], function(Plotly) { window.PLOTLYENV=window.PLOTLYENV || {}; if (document.getElementById("ec9ab4f1-303b-458f-9dc1-b575f6541dfe")) { Plotly.newPlot( "ec9ab4f1-303b-458f-9dc1-b575f6541dfe", [{"coloraxis":"coloraxis","hovertemplate":"Sweetness=%{x}\u003cbr\u003eFruityness=%{y}\u003cbr\u003ecount=%{z}\u003cextra\u003e\u003c\u002fextra\u003e","name":"","x":[2,3,3,3,2,4,2,3,2,2,2,3,3,3,3,3,1,4,3,2,3,2,3,3,4,3,2,3,3,2,3,2,3,2,4,2,2,3,1,3,3,3,2,2,3,2,3,3,3,2,4,2,3],"xaxis":"x","xbingroup":"x","y":[4,2,2,3,4,2,3,4,4,2,4,1,2,3,4,2,4,5,4,4,4,2,3,2,4,3,3,3,4,2,3,2,2,4,4,1,4,2,4,4,5,5,2,3,2,2,2,5,4,1,3,1,4],"yaxis":"y","ybingroup":"y","type":"histogram2d"}], {"template":{"data":{"histogram2dcontour":[{"type":"histogram2dcontour","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"choropleth":[{"type":"choropleth","colorbar":{"outlinewidth":0,"ticks":""}}],"histogram2d":[{"type":"histogram2d","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"heatmap":[{"type":"heatmap","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"heatmapgl":[{"type":"heatmapgl","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"contourcarpet":[{"type":"contourcarpet","colorbar":{"outlinewidth":0,"ticks":""}}],"contour":[{"type":"contour","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"surface":[{"type":"surface","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"mesh3d":[{"type":"mesh3d","colorbar":{"outlinewidth":0,"ticks":""}}],"scatter":[{"fillpattern":{"fillmode":"overlay","size":10,"solidity":0.2},"type":"scatter"}],"parcoords":[{"type":"parcoords","line":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatterpolargl":[{"type":"scatterpolargl","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"bar":[{"error_x":{"color":"#2a3f5f"},"error_y":{"color":"#2a3f5f"},"marker":{"line":{"color":"#E5ECF6","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"bar"}],"scattergeo":[{"type":"scattergeo","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatterpolar":[{"type":"scatterpolar","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"histogram":[{"marker":{"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"histogram"}],"scattergl":[{"type":"scattergl","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatter3d":[{"type":"scatter3d","line":{"colorbar":{"outlinewidth":0,"ticks":""}},"marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scattermapbox":[{"type":"scattermapbox","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatterternary":[{"type":"scatterternary","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scattercarpet":[{"type":"scattercarpet","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"carpet":[{"aaxis":{"endlinecolor":"#2a3f5f","gridcolor":"white","linecolor":"white","minorgridcolor":"white","startlinecolor":"#2a3f5f"},"baxis":{"endlinecolor":"#2a3f5f","gridcolor":"white","linecolor":"white","minorgridcolor":"white","startlinecolor":"#2a3f5f"},"type":"carpet"}],"table":[{"cells":{"fill":{"color":"#EBF0F8"},"line":{"color":"white"}},"header":{"fill":{"color":"#C8D4E3"},"line":{"color":"white"}},"type":"table"}],"barpolar":[{"marker":{"line":{"color":"#E5ECF6","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"barpolar"}],"pie":[{"automargin":true,"type":"pie"}]},"layout":{"autotypenumbers":"strict","colorway":["#636efa","#EF553B","#00cc96","#ab63fa","#FFA15A","#19d3f3","#FF6692","#B6E880","#FF97FF","#FECB52"],"font":{"color":"#2a3f5f"},"hovermode":"closest","hoverlabel":{"align":"left"},"paper_bgcolor":"white","plot_bgcolor":"#E5ECF6","polar":{"bgcolor":"#E5ECF6","angularaxis":{"gridcolor":"white","linecolor":"white","ticks":""},"radialaxis":{"gridcolor":"white","linecolor":"white","ticks":""}},"ternary":{"bgcolor":"#E5ECF6","aaxis":{"gridcolor":"white","linecolor":"white","ticks":""},"baxis":{"gridcolor":"white","linecolor":"white","ticks":""},"caxis":{"gridcolor":"white","linecolor":"white","ticks":""}},"coloraxis":{"colorbar":{"outlinewidth":0,"ticks":""}},"colorscale":{"sequential":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"sequentialminus":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"diverging":[[0,"#8e0152"],[0.1,"#c51b7d"],[0.2,"#de77ae"],[0.3,"#f1b6da"],[0.4,"#fde0ef"],[0.5,"#f7f7f7"],[0.6,"#e6f5d0"],[0.7,"#b8e186"],[0.8,"#7fbc41"],[0.9,"#4d9221"],[1,"#276419"]]},"xaxis":{"gridcolor":"white","linecolor":"white","ticks":"","title":{"standoff":15},"zerolinecolor":"white","automargin":true,"zerolinewidth":2},"yaxis":{"gridcolor":"white","linecolor":"white","ticks":"","title":{"standoff":15},"zerolinecolor":"white","automargin":true,"zerolinewidth":2},"scene":{"xaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white","gridwidth":2},"yaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white","gridwidth":2},"zaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white","gridwidth":2}},"shapedefaults":{"line":{"color":"#2a3f5f"}},"annotationdefaults":{"arrowcolor":"#2a3f5f","arrowhead":0,"arrowwidth":1},"geo":{"bgcolor":"white","landcolor":"#E5ECF6","subunitcolor":"white","showland":true,"showlakes":true,"lakecolor":"white"},"title":{"x":0.05},"mapbox":{"style":"light"},"margin":{"b":0,"l":0,"r":0,"t":30}}},"xaxis":{"anchor":"y","domain":[0.0,1.0],"title":{"text":"Sweetness"},"dtick":1},"yaxis":{"anchor":"x","domain":[0.0,1.0],"title":{"text":"Fruityness"},"dtick":1},"coloraxis":{"colorbar":{"title":{"text":"count"}},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"showscale":false},"legend":{"tracegroupgap":0}}, {"staticPlot": true, "responsive": true} ).then(function(){
var gd = document.getElementById('ec9ab4f1-303b-458f-9dc1-b575f6541dfe');
var x = new MutationObserver(function (mutations, observer) {{
var display = window.getComputedStyle(gd).display;
if (!display || display === 'none') {{
console.log([gd, 'removed!']);
Plotly.purge(gd);
observer.disconnect();
}}
}});
// Listen for the removal of the full notebook cells
var notebookContainer = gd.closest('#notebook-container');
if (notebookContainer) {{
x.observe(notebookContainer, {childList: true});
}}
// Listen for the clearing of the current output cell
var outputEl = gd.closest('.output');
if (outputEl) {{
x.observe(outputEl, {childList: true});
}}
}) }; }); </script> </div>
</div>
</div>
<p>TODO</p>
</section>
<section id="individual-ratings" class="level3">
<h3 class="anchored" data-anchor-id="individual-ratings">Individual Ratings</h3>
<div id="d0fb54a8" class="cell" data-execution_count="8">
<div class="cell-output cell-output-display">
<div> <div id="b3341d78-ec94-481b-a2d5-da4403704b13" class="plotly-graph-div" style="height:5000px; width:100%;"></div> <script type="text/javascript"> require(["plotly"], function(Plotly) { window.PLOTLYENV=window.PLOTLYENV || {}; if (document.getElementById("b3341d78-ec94-481b-a2d5-da4403704b13")) { Plotly.newPlot( "b3341d78-ec94-481b-a2d5-da4403704b13", [{"fill":"toself","fillcolor":"rgba(255, 161, 90, 0.7)","line":{"color":"rgba(255, 161, 90, 0.7)"},"r":[2,4,4,4,1],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar"},{"fill":"toself","fillcolor":"rgba(255, 161, 90, 0.7)","line":{"color":"rgba(255, 161, 90, 0.7)"},"r":[3,2,2,2,4],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar2"},{"fill":"toself","fillcolor":"rgba(255, 161, 90, 0.7)","line":{"color":"rgba(255, 161, 90, 0.7)"},"r":[3,3,2,5,3],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar3"},{"fill":"toself","fillcolor":"rgba(255, 161, 90, 0.7)","line":{"color":"rgba(255, 161, 90, 0.7)"},"r":[3,2,3,3,3],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar4"},{"fill":"toself","fillcolor":"rgba(255, 161, 90, 0.7)","line":{"color":"rgba(255, 161, 90, 0.7)"},"r":[2,3,4,4,3],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar5"},{"fill":"toself","fillcolor":"rgba(255, 161, 90, 0.7)","line":{"color":"rgba(255, 161, 90, 0.7)"},"r":[4,2,2,4,4],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar6"},{"fill":"toself","fillcolor":"rgba(255, 161, 90, 0.7)","line":{"color":"rgba(255, 161, 90, 0.7)"},"r":[2,2,3,2,4],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar7"},{"fill":"toself","fillcolor":"rgba(255, 161, 90, 0.7)","line":{"color":"rgba(255, 161, 90, 0.7)"},"r":[3,2,4,4,3],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar8"},{"fill":"toself","fillcolor":"rgba(99, 110, 250, 0.7)","line":{"color":"rgba(99, 110, 250, 0.7)"},"r":[2,1,2,4,5],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar9"},{"fill":"toself","fillcolor":"rgba(255, 161, 90, 0.7)","line":{"color":"rgba(255, 161, 90, 0.7)"},"r":[2,4,4,4,1],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar10"},{"fill":"toself","fillcolor":"rgba(255, 161, 90, 0.7)","line":{"color":"rgba(255, 161, 90, 0.7)"},"r":[2,5,2,4,1],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar11"},{"fill":"toself","fillcolor":"rgba(255, 161, 90, 0.7)","line":{"color":"rgba(255, 161, 90, 0.7)"},"r":[2,3,4,4,2],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar12"},{"fill":"toself","fillcolor":"rgba(255, 161, 90, 0.7)","line":{"color":"rgba(255, 161, 90, 0.7)"},"r":[3,2,1,5,2],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar13"},{"fill":"toself","fillcolor":"rgba(255, 161, 90, 0.7)","line":{"color":"rgba(255, 161, 90, 0.7)"},"r":[3,3,2,4,2],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar14"},{"fill":"toself","fillcolor":"rgba(255, 161, 90, 0.7)","line":{"color":"rgba(255, 161, 90, 0.7)"},"r":[3,5,3,4,3],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar15"},{"fill":"toself","fillcolor":"rgba(255, 161, 90, 0.7)","line":{"color":"rgba(255, 161, 90, 0.7)"},"r":[3,3,4,4,1],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar16"},{"fill":"toself","fillcolor":"rgba(255, 161, 90, 0.7)","line":{"color":"rgba(255, 161, 90, 0.7)"},"r":[3,3,2,2,4],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar17"},{"fill":"toself","fillcolor":"rgba(255, 161, 90, 0.7)","line":{"color":"rgba(255, 161, 90, 0.7)"},"r":[1,4,4,3,2],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar18"},{"fill":"toself","fillcolor":"rgba(255, 161, 90, 0.7)","line":{"color":"rgba(255, 161, 90, 0.7)"},"r":[4,4,5,4,2],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar19"},{"fill":"toself","fillcolor":"rgba(255, 161, 90, 0.7)","line":{"color":"rgba(255, 161, 90, 0.7)"},"r":[3,4,4,4,1],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar20"},{"fill":"toself","fillcolor":"rgba(255, 161, 90, 0.7)","line":{"color":"rgba(255, 161, 90, 0.7)"},"r":[2,1,4,5,5],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar21"},{"fill":"toself","fillcolor":"rgba(255, 161, 90, 0.7)","line":{"color":"rgba(255, 161, 90, 0.7)"},"r":[3,3,4,2,2],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar22"},{"fill":"toself","fillcolor":"rgba(255, 161, 90, 0.7)","line":{"color":"rgba(255, 161, 90, 0.7)"},"r":[2,2,2,1,4],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar23"},{"fill":"toself","fillcolor":"rgba(255, 161, 90, 0.7)","line":{"color":"rgba(255, 161, 90, 0.7)"},"r":[3,3,3,4,2],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar24"},{"fill":"toself","fillcolor":"rgba(255, 161, 90, 0.7)","line":{"color":"rgba(255, 161, 90, 0.7)"},"r":[3,2,2,3,4],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar25"},{"fill":"toself","fillcolor":"rgba(255, 161, 90, 0.7)","line":{"color":"rgba(255, 161, 90, 0.7)"},"r":[4,3,4,2,4],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar26"},{"fill":"toself","fillcolor":"rgba(255, 161, 90, 0.7)","line":{"color":"rgba(255, 161, 90, 0.7)"},"r":[3,3,3,3,2],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar27"},{"fill":"toself","fillcolor":"rgba(255, 161, 90, 0.7)","line":{"color":"rgba(255, 161, 90, 0.7)"},"r":[2,2,3,2,4],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar28"},{"fill":"toself","fillcolor":"rgba(255, 161, 90, 0.7)","line":{"color":"rgba(255, 161, 90, 0.7)"},"r":[3,3,3,4,3],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar29"},{"fill":"toself","fillcolor":"rgba(255, 161, 90, 0.7)","line":{"color":"rgba(255, 161, 90, 0.7)"},"r":[3,3,4,3,3],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar30"},{"fill":"toself","fillcolor":"rgba(255, 161, 90, 0.7)","line":{"color":"rgba(255, 161, 90, 0.7)"},"r":[2,3,2,3,1],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar31"},{"fill":"toself","fillcolor":"rgba(255, 161, 90, 0.7)","line":{"color":"rgba(255, 161, 90, 0.7)"},"r":[3,2,3,3,3],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar32"},{"fill":"toself","fillcolor":"rgba(255, 161, 90, 0.7)","line":{"color":"rgba(255, 161, 90, 0.7)"},"r":[2,4,2,4,1],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar33"},{"fill":"toself","fillcolor":"rgba(255, 161, 90, 0.7)","line":{"color":"rgba(255, 161, 90, 0.7)"},"r":[3,3,2,5,3],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar34"},{"fill":"toself","fillcolor":"rgba(255, 161, 90, 0.7)","line":{"color":"rgba(255, 161, 90, 0.7)"},"r":[2,3,4,4,3],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar35"},{"fill":"toself","fillcolor":"rgba(255, 161, 90, 0.7)","line":{"color":"rgba(255, 161, 90, 0.7)"},"r":[4,3,4,4,4],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar36"},{"fill":"toself","fillcolor":"rgba(255, 161, 90, 0.7)","line":{"color":"rgba(255, 161, 90, 0.7)"},"r":[2,2,1,5,4],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar37"},{"fill":"toself","fillcolor":"rgba(99, 110, 250, 0.7)","line":{"color":"rgba(99, 110, 250, 0.7)"},"r":[3,2,2,3,5],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar38"},{"fill":"toself","fillcolor":"rgba(255, 161, 90, 0.7)","line":{"color":"rgba(255, 161, 90, 0.7)"},"r":[2,3,4,5,2],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar39"},{"fill":"toself","fillcolor":"rgba(255, 161, 90, 0.7)","line":{"color":"rgba(255, 161, 90, 0.7)"},"r":[3,2,2,5,3],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar40"},{"fill":"toself","fillcolor":"rgba(255, 161, 90, 0.7)","line":{"color":"rgba(255, 161, 90, 0.7)"},"r":[1,3,4,5,2],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar41"},{"fill":"toself","fillcolor":"rgba(255, 161, 90, 0.7)","line":{"color":"rgba(255, 161, 90, 0.7)"},"r":[3,4,4,2,2],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar42"},{"fill":"toself","fillcolor":"rgba(255, 161, 90, 0.7)","line":{"color":"rgba(255, 161, 90, 0.7)"},"r":[3,4,5,4,1],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar43"},{"fill":"toself","fillcolor":"rgba(255, 161, 90, 0.7)","line":{"color":"rgba(255, 161, 90, 0.7)"},"r":[3,4,5,3,1],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar44"},{"fill":"toself","fillcolor":"rgba(255, 161, 90, 0.7)","line":{"color":"rgba(255, 161, 90, 0.7)"},"r":[2,4,2,5,4],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar45"},{"fill":"toself","fillcolor":"rgba(99, 110, 250, 0.7)","line":{"color":"rgba(99, 110, 250, 0.7)"},"r":[4,3,2,3,4],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar46"},{"fill":"toself","fillcolor":"rgba(255, 161, 90, 0.7)","line":{"color":"rgba(255, 161, 90, 0.7)"},"r":[2,3,3,4,3],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar47"},{"fill":"toself","fillcolor":"rgba(99, 110, 250, 0.7)","line":{"color":"rgba(99, 110, 250, 0.7)"},"r":[1,1,3,4,5],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar48"},{"fill":"toself","fillcolor":"rgba(255, 161, 90, 0.7)","line":{"color":"rgba(255, 161, 90, 0.7)"},"r":[3,2,2,2,4],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar49"},{"fill":"toself","fillcolor":"rgba(255, 161, 90, 0.7)","line":{"color":"rgba(255, 161, 90, 0.7)"},"r":[2,3,2,5,3],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar50"},{"fill":"toself","fillcolor":"rgba(255, 161, 90, 0.7)","line":{"color":"rgba(255, 161, 90, 0.7)"},"r":[3,3,2,4,4],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar51"},{"fill":"toself","fillcolor":"rgba(255, 161, 90, 0.7)","line":{"color":"rgba(255, 161, 90, 0.7)"},"r":[3,4,5,2,3],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar52"},{"fill":"toself","fillcolor":"rgba(255, 161, 90, 0.7)","line":{"color":"rgba(255, 161, 90, 0.7)"},"r":[3,5,4,4,2],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar53"},{"fill":"toself","fillcolor":"rgba(255, 161, 90, 0.7)","line":{"color":"rgba(255, 161, 90, 0.7)"},"r":[2,2,1,4,4],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar54"},{"fill":"toself","fillcolor":"rgba(255, 161, 90, 0.7)","line":{"color":"rgba(255, 161, 90, 0.7)"},"r":[4,2,3,4,4],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar55"},{"fill":"toself","fillcolor":"rgba(255, 161, 90, 0.7)","line":{"color":"rgba(255, 161, 90, 0.7)"},"r":[2,2,1,4,2],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar56"},{"fill":"toself","fillcolor":"rgba(255, 161, 90, 0.7)","line":{"color":"rgba(255, 161, 90, 0.7)"},"r":[3,3,4,2,2],"theta":["Sweetness","Rating","Fruityness","Fizz","Synthetic"],"type":"scatterpolar","subplot":"polar57"}], {"template":{"data":{"histogram2dcontour":[{"type":"histogram2dcontour","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"choropleth":[{"type":"choropleth","colorbar":{"outlinewidth":0,"ticks":""}}],"histogram2d":[{"type":"histogram2d","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"heatmap":[{"type":"heatmap","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"heatmapgl":[{"type":"heatmapgl","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"contourcarpet":[{"type":"contourcarpet","colorbar":{"outlinewidth":0,"ticks":""}}],"contour":[{"type":"contour","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"surface":[{"type":"surface","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"mesh3d":[{"type":"mesh3d","colorbar":{"outlinewidth":0,"ticks":""}}],"scatter":[{"fillpattern":{"fillmode":"overlay","size":10,"solidity":0.2},"type":"scatter"}],"parcoords":[{"type":"parcoords","line":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatterpolargl":[{"type":"scatterpolargl","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"bar":[{"error_x":{"color":"#2a3f5f"},"error_y":{"color":"#2a3f5f"},"marker":{"line":{"color":"#E5ECF6","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"bar"}],"scattergeo":[{"type":"scattergeo","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatterpolar":[{"type":"scatterpolar","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"histogram":[{"marker":{"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"histogram"}],"scattergl":[{"type":"scattergl","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatter3d":[{"type":"scatter3d","line":{"colorbar":{"outlinewidth":0,"ticks":""}},"marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scattermapbox":[{"type":"scattermapbox","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatterternary":[{"type":"scatterternary","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scattercarpet":[{"type":"scattercarpet","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"carpet":[{"aaxis":{"endlinecolor":"#2a3f5f","gridcolor":"white","linecolor":"white","minorgridcolor":"white","startlinecolor":"#2a3f5f"},"baxis":{"endlinecolor":"#2a3f5f","gridcolor":"white","linecolor":"white","minorgridcolor":"white","startlinecolor":"#2a3f5f"},"type":"carpet"}],"table":[{"cells":{"fill":{"color":"#EBF0F8"},"line":{"color":"white"}},"header":{"fill":{"color":"#C8D4E3"},"line":{"color":"white"}},"type":"table"}],"barpolar":[{"marker":{"line":{"color":"#E5ECF6","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"barpolar"}],"pie":[{"automargin":true,"type":"pie"}]},"layout":{"autotypenumbers":"strict","colorway":["#636efa","#EF553B","#00cc96","#ab63fa","#FFA15A","#19d3f3","#FF6692","#B6E880","#FF97FF","#FECB52"],"font":{"color":"#2a3f5f"},"hovermode":"closest","hoverlabel":{"align":"left"},"paper_bgcolor":"white","plot_bgcolor":"#E5ECF6","polar":{"bgcolor":"#E5ECF6","angularaxis":{"gridcolor":"white","linecolor":"white","ticks":""},"radialaxis":{"gridcolor":"white","linecolor":"white","ticks":""}},"ternary":{"bgcolor":"#E5ECF6","aaxis":{"gridcolor":"white","linecolor":"white","ticks":""},"baxis":{"gridcolor":"white","linecolor":"white","ticks":""},"caxis":{"gridcolor":"white","linecolor":"white","ticks":""}},"coloraxis":{"colorbar":{"outlinewidth":0,"ticks":""}},"colorscale":{"sequential":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"sequentialminus":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"diverging":[[0,"#8e0152"],[0.1,"#c51b7d"],[0.2,"#de77ae"],[0.3,"#f1b6da"],[0.4,"#fde0ef"],[0.5,"#f7f7f7"],[0.6,"#e6f5d0"],[0.7,"#b8e186"],[0.8,"#7fbc41"],[0.9,"#4d9221"],[1,"#276419"]]},"xaxis":{"gridcolor":"white","linecolor":"white","ticks":"","title":{"standoff":15},"zerolinecolor":"white","automargin":true,"zerolinewidth":2},"yaxis":{"gridcolor":"white","linecolor":"white","ticks":"","title":{"standoff":15},"zerolinecolor":"white","automargin":true,"zerolinewidth":2},"scene":{"xaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white","gridwidth":2},"yaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white","gridwidth":2},"zaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white","gridwidth":2}},"shapedefaults":{"line":{"color":"#2a3f5f"}},"annotationdefaults":{"arrowcolor":"#2a3f5f","arrowhead":0,"arrowwidth":1},"geo":{"bgcolor":"white","landcolor":"#E5ECF6","subunitcolor":"white","showland":true,"showlakes":true,"lakecolor":"white"},"title":{"x":0.05},"mapbox":{"style":"light"},"margin":{"b":0,"l":0,"r":0,"t":30}}},"polar":{"domain":{"x":[0.0,0.2888888888888889],"y":[0.9663157894736839,0.9999999999999997]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"polar2":{"domain":{"x":[0.35555555555555557,0.6444444444444445],"y":[0.9663157894736839,0.9999999999999997]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"polar3":{"domain":{"x":[0.7111111111111111,1.0],"y":[0.9663157894736839,0.9999999999999997]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"polar4":{"domain":{"x":[0.0,0.2888888888888889],"y":[0.9126315789473682,0.946315789473684]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"polar5":{"domain":{"x":[0.35555555555555557,0.6444444444444445],"y":[0.9126315789473682,0.946315789473684]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"polar6":{"domain":{"x":[0.7111111111111111,1.0],"y":[0.9126315789473682,0.946315789473684]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"polar7":{"domain":{"x":[0.0,0.2888888888888889],"y":[0.8589473684210525,0.8926315789473682]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"polar8":{"domain":{"x":[0.35555555555555557,0.6444444444444445],"y":[0.8589473684210525,0.8926315789473682]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"polar9":{"domain":{"x":[0.7111111111111111,1.0],"y":[0.8589473684210525,0.8926315789473682]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"polar10":{"domain":{"x":[0.0,0.2888888888888889],"y":[0.8052631578947367,0.8389473684210524]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"polar11":{"domain":{"x":[0.35555555555555557,0.6444444444444445],"y":[0.8052631578947367,0.8389473684210524]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"polar12":{"domain":{"x":[0.7111111111111111,1.0],"y":[0.8052631578947367,0.8389473684210524]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"polar13":{"domain":{"x":[0.0,0.2888888888888889],"y":[0.7515789473684209,0.7852631578947367]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"polar14":{"domain":{"x":[0.35555555555555557,0.6444444444444445],"y":[0.7515789473684209,0.7852631578947367]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"polar15":{"domain":{"x":[0.7111111111111111,1.0],"y":[0.7515789473684209,0.7852631578947367]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"polar16":{"domain":{"x":[0.0,0.2888888888888889],"y":[0.6978947368421051,0.7315789473684209]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"polar17":{"domain":{"x":[0.35555555555555557,0.6444444444444445],"y":[0.6978947368421051,0.7315789473684209]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"polar18":{"domain":{"x":[0.7111111111111111,1.0],"y":[0.6978947368421051,0.7315789473684209]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"polar19":{"domain":{"x":[0.0,0.2888888888888889],"y":[0.6442105263157893,0.6778947368421051]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"polar20":{"domain":{"x":[0.35555555555555557,0.6444444444444445],"y":[0.6442105263157893,0.6778947368421051]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"polar21":{"domain":{"x":[0.7111111111111111,1.0],"y":[0.6442105263157893,0.6778947368421051]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"polar22":{"domain":{"x":[0.0,0.2888888888888889],"y":[0.5905263157894736,0.6242105263157893]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"polar23":{"domain":{"x":[0.35555555555555557,0.6444444444444445],"y":[0.5905263157894736,0.6242105263157893]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"polar24":{"domain":{"x":[0.7111111111111111,1.0],"y":[0.5905263157894736,0.6242105263157893]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"polar25":{"domain":{"x":[0.0,0.2888888888888889],"y":[0.5368421052631578,0.5705263157894735]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"polar26":{"domain":{"x":[0.35555555555555557,0.6444444444444445],"y":[0.5368421052631578,0.5705263157894735]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"polar27":{"domain":{"x":[0.7111111111111111,1.0],"y":[0.5368421052631578,0.5705263157894735]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"polar28":{"domain":{"x":[0.0,0.2888888888888889],"y":[0.48315789473684206,0.5168421052631579]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"polar29":{"domain":{"x":[0.35555555555555557,0.6444444444444445],"y":[0.48315789473684206,0.5168421052631579]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"polar30":{"domain":{"x":[0.7111111111111111,1.0],"y":[0.48315789473684206,0.5168421052631579]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"polar31":{"domain":{"x":[0.0,0.2888888888888889],"y":[0.42947368421052634,0.4631578947368421]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"polar32":{"domain":{"x":[0.35555555555555557,0.6444444444444445],"y":[0.42947368421052634,0.4631578947368421]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"polar33":{"domain":{"x":[0.7111111111111111,1.0],"y":[0.42947368421052634,0.4631578947368421]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"polar34":{"domain":{"x":[0.0,0.2888888888888889],"y":[0.37578947368421056,0.4094736842105263]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"polar35":{"domain":{"x":[0.35555555555555557,0.6444444444444445],"y":[0.37578947368421056,0.4094736842105263]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"polar36":{"domain":{"x":[0.7111111111111111,1.0],"y":[0.37578947368421056,0.4094736842105263]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"polar37":{"domain":{"x":[0.0,0.2888888888888889],"y":[0.32210526315789473,0.35578947368421054]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"polar38":{"domain":{"x":[0.35555555555555557,0.6444444444444445],"y":[0.32210526315789473,0.35578947368421054]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"polar39":{"domain":{"x":[0.7111111111111111,1.0],"y":[0.32210526315789473,0.35578947368421054]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"polar40":{"domain":{"x":[0.0,0.2888888888888889],"y":[0.26842105263157895,0.30210526315789477]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"polar41":{"domain":{"x":[0.35555555555555557,0.6444444444444445],"y":[0.26842105263157895,0.30210526315789477]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"polar42":{"domain":{"x":[0.7111111111111111,1.0],"y":[0.26842105263157895,0.30210526315789477]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"polar43":{"domain":{"x":[0.0,0.2888888888888889],"y":[0.21473684210526317,0.24842105263157896]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"polar44":{"domain":{"x":[0.35555555555555557,0.6444444444444445],"y":[0.21473684210526317,0.24842105263157896]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"polar45":{"domain":{"x":[0.7111111111111111,1.0],"y":[0.21473684210526317,0.24842105263157896]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"polar46":{"domain":{"x":[0.0,0.2888888888888889],"y":[0.16105263157894736,0.19473684210526315]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"polar47":{"domain":{"x":[0.35555555555555557,0.6444444444444445],"y":[0.16105263157894736,0.19473684210526315]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"polar48":{"domain":{"x":[0.7111111111111111,1.0],"y":[0.16105263157894736,0.19473684210526315]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"polar49":{"domain":{"x":[0.0,0.2888888888888889],"y":[0.10736842105263159,0.14105263157894737]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"polar50":{"domain":{"x":[0.35555555555555557,0.6444444444444445],"y":[0.10736842105263159,0.14105263157894737]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"polar51":{"domain":{"x":[0.7111111111111111,1.0],"y":[0.10736842105263159,0.14105263157894737]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"polar52":{"domain":{"x":[0.0,0.2888888888888889],"y":[0.05368421052631579,0.08736842105263158]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"polar53":{"domain":{"x":[0.35555555555555557,0.6444444444444445],"y":[0.05368421052631579,0.08736842105263158]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"polar54":{"domain":{"x":[0.7111111111111111,1.0],"y":[0.05368421052631579,0.08736842105263158]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"polar55":{"domain":{"x":[0.0,0.2888888888888889],"y":[0.0,0.03368421052631579]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"polar56":{"domain":{"x":[0.35555555555555557,0.6444444444444445],"y":[0.0,0.03368421052631579]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"polar57":{"domain":{"x":[0.7111111111111111,1.0],"y":[0.0,0.03368421052631579]},"radialaxis":{"tickfont":{"size":10},"range":[0,5]}},"annotations":[{"font":{"size":16},"showarrow":false,"text":"Adelholzener Cola Mix","x":0.14444444444444446,"xanchor":"center","xref":"paper","y":0.9999999999999997,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"Almdudler Spezi","x":0.5,"xanchor":"center","xref":"paper","y":0.9999999999999997,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"alwa Limo Cola-Mix","x":0.8555555555555556,"xanchor":"center","xref":"paper","y":0.9999999999999997,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"Auer Br\u00e4u Cola Mix","x":0.14444444444444446,"xanchor":"center","xref":"paper","y":0.946315789473684,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"Bad Brambacher Cola Mix","x":0.5,"xanchor":"center","xref":"paper","y":0.946315789473684,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"Bazi Cola-Mix","x":0.8555555555555556,"xanchor":"center","xref":"paper","y":0.946315789473684,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"Brunnthaler Brunnen Cola-Mix","x":0.14444444444444446,"xanchor":"center","xref":"paper","y":0.8926315789473682,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"Cubanita Cola Mix","x":0.5,"xanchor":"center","xref":"paper","y":0.8926315789473682,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"deit zuckerfrei Cola Mix","x":0.8555555555555556,"xanchor":"center","xref":"paper","y":0.8926315789473682,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"Eichbaum Braumeisters Cola-Mix","x":0.14444444444444446,"xanchor":"center","xref":"paper","y":0.8389473684210524,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"Eizbach Calypzo Orange & Cola","x":0.5,"xanchor":"center","xref":"paper","y":0.8389473684210524,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"Ensinger Cola-Mix Limonade","x":0.8555555555555556,"xanchor":"center","xref":"paper","y":0.8389473684210524,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"Feldschl\u00f6\u00dfchen Mix","x":0.14444444444444446,"xanchor":"center","xref":"paper","y":0.7852631578947367,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"flumi Cola-Mix","x":0.5,"xanchor":"center","xref":"paper","y":0.7852631578947367,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"Fl\u00f6tzinger Cola Mix","x":0.8555555555555556,"xanchor":"center","xref":"paper","y":0.7852631578947367,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"Franken Brunnen Mexi Cola Mix","x":0.14444444444444446,"xanchor":"center","xref":"paper","y":0.7315789473684209,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"Freeway Mixx Max","x":0.5,"xanchor":"center","xref":"paper","y":0.7315789473684209,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"Frische Mische","x":0.8555555555555556,"xanchor":"center","xref":"paper","y":0.7315789473684209,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"Frucade Cola-Mix","x":0.14444444444444446,"xanchor":"center","xref":"paper","y":0.6778947368421051,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"Giesinger Kracherl Cola Mix","x":0.5,"xanchor":"center","xref":"paper","y":0.6778947368421051,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"Glorietta Cola Mix","x":0.8555555555555556,"xanchor":"center","xref":"paper","y":0.6778947368421051,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"Gluggerla Cola-Mix","x":0.14444444444444446,"xanchor":"center","xref":"paper","y":0.6242105263157893,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"Gut und g\u00fcnstig Cola Mix","x":0.5,"xanchor":"center","xref":"paper","y":0.6242105263157893,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"G\u00fcnni\u2019s Cola-Mix","x":0.8555555555555556,"xanchor":"center","xref":"paper","y":0.6242105263157893,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"Hoellen Sprudel Cubana","x":0.14444444444444446,"xanchor":"center","xref":"paper","y":0.5705263157894735,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"Hubauer Cola-Mix","x":0.5,"xanchor":"center","xref":"paper","y":0.5705263157894735,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"ja! Cola-Mix","x":0.8555555555555556,"xanchor":"center","xref":"paper","y":0.5705263157894735,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"K-Classic Cola + Orange","x":0.14444444444444446,"xanchor":"center","xref":"paper","y":0.5168421052631579,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"Krombacher Spezi","x":0.5,"xanchor":"center","xref":"paper","y":0.5168421052631579,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"Kuchlbauer Cola~Mix","x":0.8555555555555556,"xanchor":"center","xref":"paper","y":0.5168421052631579,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"Labertaler Spezial","x":0.14444444444444446,"xanchor":"center","xref":"paper","y":0.4631578947368421,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"Land L!mo","x":0.5,"xanchor":"center","xref":"paper","y":0.4631578947368421,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"Landbrauerei Cola-Mix","x":0.8555555555555556,"xanchor":"center","xref":"paper","y":0.4631578947368421,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"Leikeim Cola-Mix","x":0.14444444444444446,"xanchor":"center","xref":"paper","y":0.4094736842105263,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"Libella Cola Mix","x":0.5,"xanchor":"center","xref":"paper","y":0.4094736842105263,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"Maisacher Cola-Mix","x":0.8555555555555556,"xanchor":"center","xref":"paper","y":0.4094736842105263,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"Mezzo Mix","x":0.14444444444444446,"xanchor":"center","xref":"paper","y":0.35578947368421054,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"Mezzo Mix Zero","x":0.5,"xanchor":"center","xref":"paper","y":0.35578947368421054,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"mischmasch ","x":0.8555555555555556,"xanchor":"center","xref":"paper","y":0.35578947368421054,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"Nawinta Cola-Mix","x":0.14444444444444446,"xanchor":"center","xref":"paper","y":0.30210526315789477,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"Now Orange Cola","x":0.5,"xanchor":"center","xref":"paper","y":0.30210526315789477,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"Pali Cola Mix","x":0.8555555555555556,"xanchor":"center","xref":"paper","y":0.30210526315789477,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"Paul Anderl\u2019s Cola-Mix","x":0.14444444444444446,"xanchor":"center","xref":"paper","y":0.24842105263157896,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"Paul Anderl\u2019s Schwupp Cola-Mix","x":0.5,"xanchor":"center","xref":"paper","y":0.24842105263157896,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"Paulaner Spezi","x":0.8555555555555556,"xanchor":"center","xref":"paper","y":0.24842105263157896,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"Paulaner Spezi Zero","x":0.14444444444444446,"xanchor":"center","xref":"paper","y":0.19473684210526315,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"Penny Cola Mix","x":0.5,"xanchor":"center","xref":"paper","y":0.19473684210526315,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"Penny Cola Mix Zero","x":0.8555555555555556,"xanchor":"center","xref":"paper","y":0.19473684210526315,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"Petrusquelle Cola-Mix","x":0.14444444444444446,"xanchor":"center","xref":"paper","y":0.14105263157894737,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"P\u00f6llinger Cola Mix","x":0.5,"xanchor":"center","xref":"paper","y":0.14105263157894737,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"Schwip Schwap","x":0.8555555555555556,"xanchor":"center","xref":"paper","y":0.14105263157894737,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"Sinalco Cola Mix","x":0.14444444444444446,"xanchor":"center","xref":"paper","y":0.08736842105263158,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"Spezi","x":0.5,"xanchor":"center","xref":"paper","y":0.08736842105263158,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"sunfit Cola Mix","x":0.8555555555555556,"xanchor":"center","xref":"paper","y":0.08736842105263158,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"Teinacher Genuss Cola-Mix","x":0.14444444444444446,"xanchor":"center","xref":"paper","y":0.03368421052631579,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"VC Cola-Mix","x":0.5,"xanchor":"center","xref":"paper","y":0.03368421052631579,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"XXL Limonade Cola Mix","x":0.8555555555555556,"xanchor":"center","xref":"paper","y":0.03368421052631579,"yanchor":"bottom","yref":"paper"}],"height":5000,"showlegend":false}, {"staticPlot": true, "responsive": true} ).then(function(){
var gd = document.getElementById('b3341d78-ec94-481b-a2d5-da4403704b13');
var x = new MutationObserver(function (mutations, observer) {{
var display = window.getComputedStyle(gd).display;
if (!display || display === 'none') {{
console.log([gd, 'removed!']);
Plotly.purge(gd);
observer.disconnect();
}}
}});
// Listen for the removal of the full notebook cells
var notebookContainer = gd.closest('#notebook-container');
if (notebookContainer) {{
x.observe(notebookContainer, {childList: true});
}}
// Listen for the clearing of the current output cell
var outputEl = gd.closest('.output');
if (outputEl) {{
x.observe(outputEl, {childList: true});
}}
}) }; }); </script> </div>
</div>
</div>
</section>
</section>
</section>
<section id="confirmed-missing" class="level1">
<h1>Confirmed Missing</h1>
<p>List of Cola and Spezi that is already known to be missing. Some of them might be not available to me (yet), others are still in the pipeline.</p>
<p>If you have access to one of the unavailable ones or know some that are missing from the list let me know!</p>
<section id="spezi" class="level2">
<h2 class="anchored" data-anchor-id="spezi">Spezi</h2>
<table class="caption-top table">
<thead>
<tr class="header">
<th>Name</th>
<th>Source</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>Big Cola Mix</td>
<td>Edeka</td>
</tr>
<tr class="even">
<td>Rapp Spezi</td>
<td>Rapp</td>
</tr>
<tr class="odd">
<td>Vita Cola Mix</td>
<td></td>
</tr>
</tbody>
</table>
</section>
<section id="cola" class="level2">
<h2 class="anchored" data-anchor-id="cola">Cola</h2>
<table class="caption-top table">
<thead>
<tr class="header">
<th>Name</th>
<th>Source</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>Big Cola</td>
<td>Edeka</td>
</tr>
<tr class="even">
<td>Coca-Cola Life</td>
<td></td>
</tr>
<tr class="odd">
<td>Coca-Cola Light</td>
<td></td>
</tr>
<tr class="even">
<td>Freeway Cola Light</td>
<td>Lidl</td>
</tr>
<tr class="odd">
<td>Green Cola</td>
<td></td>
</tr>
<tr class="even">
<td>Isis Bio Fresh Cola</td>
<td></td>
</tr>
<tr class="odd">
<td>K-Classic Cola</td>
<td></td>
</tr>
<tr class="even">
<td>Penny Cola</td>
<td>Penny</td>
</tr>
<tr class="odd">
<td>Penny Cola Stevia</td>
<td>Penny</td>
</tr>
<tr class="even">
<td>Premium Cola</td>
<td>Liebick Getränke Germering ?</td>
</tr>
<tr class="odd">
<td>River Cola</td>
<td>Aldi Nord</td>
</tr>
<tr class="even">
<td>River Cola 0% Zucker</td>
<td>Aldi Nord</td>
</tr>
<tr class="odd">
<td>Royal Crown Cola</td>
<td></td>
</tr>
<tr class="even">
<td>Star Drink Cola</td>
<td>Netto Marken-Discount</td>
</tr>
<tr class="odd">
<td>Star Drink Cola Light</td>
<td>Netto Marken-Discount</td>
</tr>
<tr class="even">
<td>Topstar Cola</td>
<td>Aldi Sued</td>
</tr>
<tr class="odd">
<td>Topstar Cola Light</td>
<td>Aldi Sued</td>
</tr>
<tr class="even">
<td>Ubuntu Cola</td>
<td></td>
</tr>
<tr class="odd">
<td>Vita Cola Pur</td>
<td></td>
</tr>
</tbody>
</table>
</section>
</section>
<section id="changelog" class="level1">
<h1>Changelog</h1>
<ul>
<li>05.11.22
<ul>
<li>added Eizbach Cryztal Cola</li>
<li>added Penny Cola</li>
<li>added afri cola ohne zucker</li>
<li>added Gut und günstig Cola Zero</li>
<li>added Gut und günstig Cola light</li>
<li>added fritz kola super zero</li>
<li>added Vita Cola Original zuckerfrei</li>
<li>added sunfit Cola Mix</li>
<li>added Pöllinger Cola Mix</li>
<li>added Kuchlbauer Cola~Mix</li>
<li>added Landbrauerei Cola-Mix</li>
<li>added Bad Brambacher Cola Mix</li>
<li>added Hoellen Sprudel Cubana</li>
<li>added Almdudler Spezi</li>
<li>added deit zuckerfrei Cola Mix</li>
<li>added XXL Limonade Cola Mix</li>
</ul></li>
<li>10.06.22
<ul>
<li>added Land L!mo - Thanks Marvin!</li>
<li>added Frische Mische - Thanks Marvin!</li>
<li>added Kuchlbauer Cola~Mix - Thanks Juliane!</li>
<li>added Pöllinger Cola Mix - Thanks Juliane!</li>
<li>added Landbrauerei Cola-Mix - Thanks Juliane!</li>
</ul></li>
<li>23.04.22
<ul>
<li>added Gluggerla Cola-Mix</li>
<li>added Nawinta Cola-Mix</li>
<li>added Günni’s Cola-Mix</li>
<li>added afri cola ohne zucker - Thanks Jochen!</li>
<li>added now black cola</li>
<li>added Jarritos Mexican Cola</li>
<li>added Fentimans Curiosity Cola</li>
</ul></li>
<li>09.04.22
<ul>
<li>added Adelholzener Cola Mix</li>
<li>added Maisacher Cola-Mix</li>
<li>added Paul Anderl’s Schwupp Cola-Mix</li>
<li>added Petrusquelle Cola-Mix</li>
<li>added Gut und günstig Cola Mix</li>
<li>added ja! Cola-Mix</li>
<li>updated sugar normalization from min 6.8 / max 11 to min 2.3 / max 12</li>
</ul></li>
<li>03.04.22
<ul>
<li>added Paulaner Spezi Zero</li>
</ul></li>
<li>20.03.22
<ul>
<li>added Eichbaum Braumeisters Cola-Mix - Thanks Jochen!</li>
<li>added alwa Limo Cola-Mix - Thanks Jochen!</li>
<li>added Teinacher Genuss Cola-Mix - Thanks Jochen!</li>
<li>added Ensinger Cola-Mix Limonade - Thanks Jochen!</li>
</ul></li>
<li>19.03.22
<ul>
<li>added Mezzo Mix zero</li>
<li>added Freeway Mixx Max</li>
<li>added Freeway Cola Zero</li>
<li>changed Community Cola Zuckerfrei rating from 3 to 4</li>
</ul></li>
<li>18.03.22
<ul>
<li>added Auer Cola Mix - Thanks Joshi!</li>
<li>added Paul Anderl Cola-Mix</li>
</ul></li>
<li>13.03.22
<ul>
<li>added ja! Cola</li>
<li>added Freeway Cola</li>
<li>added Springe Cola - Thanks Patrick!</li>
<li>added Club Cola - Thanks Patrick!</li>
<li>added Vita Cola - Thanks Patrick!</li>
</ul></li>
<li>06.03.22
<ul>
<li>added Mio Mio Cola Zero</li>
<li>added Coca Cola Zero</li>
<li>added Coca Cola Zero koffeinfrei</li>
<li>added Pepsi Max</li>
<li>added Pepsi Light</li>
<li>added Dr. Pepper Zero</li>
</ul></li>
<li>25.02.22
<ul>
<li>added Gut & Günstig Cola</li>
<li>added Döner Cola</li>
<li>added The Real Cola by Booster</li>
<li>added adfri cola</li>
</ul></li>
</ul>
</section>
</main>
<!-- /main column -->
<script id="quarto-html-after-body" type="application/javascript">
window.document.addEventListener("DOMContentLoaded", function (event) {
const toggleBodyColorMode = (bsSheetEl) => {
const mode = bsSheetEl.getAttribute("data-mode");
const bodyEl = window.document.querySelector("body");
if (mode === "dark") {
bodyEl.classList.add("quarto-dark");
bodyEl.classList.remove("quarto-light");
} else {
bodyEl.classList.add("quarto-light");
bodyEl.classList.remove("quarto-dark");
}
}
const toggleBodyColorPrimary = () => {
const bsSheetEl = window.document.querySelector("link#quarto-bootstrap");
if (bsSheetEl) {
toggleBodyColorMode(bsSheetEl);
}
}
toggleBodyColorPrimary();
const icon = "";
const anchorJS = new window.AnchorJS();
anchorJS.options = {
placement: 'right',
icon: icon
};
anchorJS.add('.anchored');
const isCodeAnnotation = (el) => {
for (const clz of el.classList) {
if (clz.startsWith('code-annotation-')) {
return true;
}
}
return false;
}
const onCopySuccess = function(e) {
// button target
const button = e.trigger;
// don't keep focus
button.blur();
// flash "checked"
button.classList.add('code-copy-button-checked');
var currentTitle = button.getAttribute("title");
button.setAttribute("title", "Copied!");
let tooltip;
if (window.bootstrap) {
button.setAttribute("data-bs-toggle", "tooltip");
button.setAttribute("data-bs-placement", "left");
button.setAttribute("data-bs-title", "Copied!");
tooltip = new bootstrap.Tooltip(button,
{ trigger: "manual",
customClass: "code-copy-button-tooltip",
offset: [0, -8]});
tooltip.show();
}
setTimeout(function() {
if (tooltip) {
tooltip.hide();
button.removeAttribute("data-bs-title");
button.removeAttribute("data-bs-toggle");
button.removeAttribute("data-bs-placement");
}
button.setAttribute("title", currentTitle);
button.classList.remove('code-copy-button-checked');
}, 1000);
// clear code selection
e.clearSelection();
}
const getTextToCopy = function(trigger) {
const codeEl = trigger.previousElementSibling.cloneNode(true);
for (const childEl of codeEl.children) {
if (isCodeAnnotation(childEl)) {
childEl.remove();
}
}
return codeEl.innerText;
}
const clipboard = new window.ClipboardJS('.code-copy-button:not([data-in-quarto-modal])', {
text: getTextToCopy
});
clipboard.on('success', onCopySuccess);
if (window.document.getElementById('quarto-embedded-source-code-modal')) {
// For code content inside modals, clipBoardJS needs to be initialized with a container option
// TODO: Check when it could be a function (https://github.com/zenorocha/clipboard.js/issues/860)
const clipboardModal = new window.ClipboardJS('.code-copy-button[data-in-quarto-modal]', {
text: getTextToCopy,
container: window.document.getElementById('quarto-embedded-source-code-modal')
});
clipboardModal.on('success', onCopySuccess);
}
var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//);
var mailtoRegex = new RegExp(/^mailto:/);
var filterRegex = new RegExp('/' + window.location.host + '/');
var isInternal = (href) => {
return filterRegex.test(href) || localhostRegex.test(href) || mailtoRegex.test(href);
}
// Inspect non-navigation links and adorn them if external
var links = window.document.querySelectorAll('a[href]:not(.nav-link):not(.navbar-brand):not(.toc-action):not(.sidebar-link):not(.sidebar-item-toggle):not(.pagination-link):not(.no-external):not([aria-hidden]):not(.dropdown-item):not(.quarto-navigation-tool):not(.about-link)');
for (var i=0; i<links.length; i++) {
const link = links[i];
if (!isInternal(link.href)) {
// undo the damage that might have been done by quarto-nav.js in the case of
// links that we want to consider external
if (link.dataset.originalHref !== undefined) {
link.href = link.dataset.originalHref;
}
}
}
function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) {
const config = {
allowHTML: true,
maxWidth: 500,
delay: 100,
arrow: false,
appendTo: function(el) {
return el.parentElement;
},
interactive: true,
interactiveBorder: 10,
theme: 'quarto',
placement: 'bottom-start',
};
if (contentFn) {
config.content = contentFn;
}
if (onTriggerFn) {
config.onTrigger = onTriggerFn;
}
if (onUntriggerFn) {
config.onUntrigger = onUntriggerFn;
}
window.tippy(el, config);
}
const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
for (var i=0; i<noterefs.length; i++) {
const ref = noterefs[i];
tippyHover(ref, function() {
// use id or data attribute instead here
let href = ref.getAttribute('data-footnote-href') || ref.getAttribute('href');
try { href = new URL(href).hash; } catch {}
const id = href.replace(/^#\/?/, "");
const note = window.document.getElementById(id);
if (note) {
return note.innerHTML;
} else {
return "";
}
});
}
const xrefs = window.document.querySelectorAll('a.quarto-xref');
const processXRef = (id, note) => {
// Strip column container classes
const stripColumnClz = (el) => {
el.classList.remove("page-full", "page-columns");
if (el.children) {
for (const child of el.children) {
stripColumnClz(child);
}
}
}
stripColumnClz(note)
if (id === null || id.startsWith('sec-')) {
// Special case sections, only their first couple elements
const container = document.createElement("div");
if (note.children && note.children.length > 2) {
container.appendChild(note.children[0].cloneNode(true));
for (let i = 1; i < note.children.length; i++) {
const child = note.children[i];
if (child.tagName === "P" && child.innerText === "") {
continue;
} else {
container.appendChild(child.cloneNode(true));
break;
}
}
if (window.Quarto?.typesetMath) {
window.Quarto.typesetMath(container);
}
return container.innerHTML
} else {
if (window.Quarto?.typesetMath) {
window.Quarto.typesetMath(note);
}
return note.innerHTML;
}
} else {
// Remove any anchor links if they are present
const anchorLink = note.querySelector('a.anchorjs-link');
if (anchorLink) {
anchorLink.remove();
}
if (window.Quarto?.typesetMath) {
window.Quarto.typesetMath(note);
}
// TODO in 1.5, we should make sure this works without a callout special case
if (note.classList.contains("callout")) {
return note.outerHTML;
} else {
return note.innerHTML;
}
}
}
for (var i=0; i<xrefs.length; i++) {
const xref = xrefs[i];
tippyHover(xref, undefined, function(instance) {
instance.disable();
let url = xref.getAttribute('href');
let hash = undefined;
if (url.startsWith('#')) {
hash = url;
} else {
try { hash = new URL(url).hash; } catch {}
}
if (hash) {
const id = hash.replace(/^#\/?/, "");
const note = window.document.getElementById(id);
if (note !== null) {
try {
const html = processXRef(id, note.cloneNode(true));
instance.setContent(html);
} finally {
instance.enable();
instance.show();
}
} else {
// See if we can fetch this
fetch(url.split('#')[0])
.then(res => res.text())
.then(html => {
const parser = new DOMParser();
const htmlDoc = parser.parseFromString(html, "text/html");
const note = htmlDoc.getElementById(id);
if (note !== null) {
const html = processXRef(id, note);
instance.setContent(html);
}
}).finally(() => {
instance.enable();
instance.show();
});
}
} else {
// See if we can fetch a full url (with no hash to target)
// This is a special case and we should probably do some content thinning / targeting
fetch(url)
.then(res => res.text())
.then(html => {
const parser = new DOMParser();
const htmlDoc = parser.parseFromString(html, "text/html");
const note = htmlDoc.querySelector('main.content');
if (note !== null) {
// This should only happen for chapter cross references
// (since there is no id in the URL)
// remove the first header
if (note.children.length > 0 && note.children[0].tagName === "HEADER") {
note.children[0].remove();
}
const html = processXRef(null, note);
instance.setContent(html);
}
}).finally(() => {
instance.enable();
instance.show();
});
}
}, function(instance) {
});